Merge "[38/n] Move allowRestrictedResizability to AppCompatResizeOverrides" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 69892f9b..b1c091b 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -107,6 +107,7 @@
         "com.android.server.flags.services-aconfig-java",
         "com.android.text.flags-aconfig-java",
         "com.android.window.flags.window-aconfig-java",
+        "configinfra_framework_flags_java_lib",
         "conscrypt_exported_aconfig_flags_lib",
         "device_policy_aconfig_flags_lib",
         "display_flags_lib",
@@ -1584,6 +1585,13 @@
 }
 
 java_aconfig_library {
+    name: "android.app.appfunctions.flags-aconfig-java-host",
+    aconfig_declarations: "android.app.appfunctions.flags-aconfig",
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+    host_supported: true,
+}
+
+java_aconfig_library {
     name: "android.app.appfunctions.exported-flags-aconfig-java",
     aconfig_declarations: "android.app.appfunctions.flags-aconfig",
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
diff --git a/Android.bp b/Android.bp
index a1f6e30..9d8c8a6 100644
--- a/Android.bp
+++ b/Android.bp
@@ -408,7 +408,6 @@
         "bouncycastle-repackaged-unbundled",
         "com.android.sysprop.foldlockbehavior",
         "com.android.sysprop.view",
-        "configinfra_framework_flags_java_lib",
         "framework-internal-utils",
         "dynamic_instrumentation_manager_aidl-java",
         // If MimeMap ever becomes its own APEX, then this dependency would need to be removed
@@ -537,45 +536,6 @@
     }),
 }
 
-// This is identical to "framework-minus-apex" but with "jarjar_shards" hardcodd.
-// (also "stem" is commented out to avoid a conflict with the "framework-minus-apex")
-// TODO(b/383559945) This module is just for local testing / verification. It's not used
-// by anything. Remove it once we roll out RELEASE_USE_SHARDED_JARJAR_ON_FRAMEWORK_MINUS_APEX.
-java_library {
-    name: "framework-minus-apex_jarjar-sharded",
-    defaults: [
-        "framework-minus-apex-with-libs-defaults",
-        "framework-non-updatable-lint-defaults",
-    ],
-    installable: true,
-    // For backwards compatibility.
-    // stem: "framework",
-    apex_available: ["//apex_available:platform"],
-    visibility: [
-        "//frameworks/base",
-        "//frameworks/base/location",
-        // TODO(b/147128803) remove the below lines
-        "//frameworks/base/apex/blobstore/framework",
-        "//frameworks/base/apex/jobscheduler/framework",
-        "//frameworks/base/packages/Tethering/tests/unit",
-        "//packages/modules/Connectivity/Tethering/tests/unit",
-    ],
-    errorprone: {
-        javacflags: [
-            "-Xep:AndroidFrameworkCompatChange:ERROR",
-            "-Xep:AndroidFrameworkUid:ERROR",
-        ],
-    },
-    lint: {
-        baseline_filename: "lint-baseline.xml",
-        warning_checks: [
-            "FlaggedApi",
-        ],
-    },
-    jarjar_prefix: "com.android.internal.hidden_from_bootclasspath",
-    jarjar_shards: "10",
-}
-
 java_library {
     name: "framework-minus-apex-intdefs",
     defaults: ["framework-minus-apex-with-libs-defaults"],
diff --git a/core/api/current.txt b/core/api/current.txt
index 59eb31a..c410939 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -8947,18 +8947,19 @@
     method public android.content.ClipData getClipData();
     method public android.os.Bundle getExtras();
     method public android.content.Intent getIntent();
+    method @FlaggedApi("com.android.window.flags.enable_desktop_windowing_app_to_web_education") @Nullable public android.net.Uri getSessionTransferUri();
     method public String getStructuredData();
     method public android.net.Uri getWebUri();
     method public boolean isAppProvidedIntent();
     method public boolean isAppProvidedWebUri();
     method public void setClipData(android.content.ClipData);
     method public void setIntent(android.content.Intent);
+    method @FlaggedApi("com.android.window.flags.enable_desktop_windowing_app_to_web_education") public void setSessionTransferUri(@Nullable android.net.Uri);
     method public void setStructuredData(String);
     method public void setWebUri(android.net.Uri);
     method public void writeToParcel(android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.app.assist.AssistContent> CREATOR;
     field @FlaggedApi("android.app.appfunctions.flags.enable_app_function_manager") public static final String EXTRA_APP_FUNCTION_DATA = "android.app.assist.extra.APP_FUNCTION_DATA";
-    field @FlaggedApi("com.android.window.flags.enable_desktop_windowing_app_to_web_education") public static final String EXTRA_SESSION_TRANSFER_WEB_URI = "android.app.assist.extra.SESSION_TRANSFER_WEB_URI";
   }
 
   public class AssistStructure implements android.os.Parcelable {
@@ -9190,8 +9191,9 @@
 package android.app.jank {
 
   @FlaggedApi("android.app.jank.detailed_app_jank_metrics_api") public final class AppJankStats {
-    ctor public AppJankStats(int, @NonNull String, @Nullable String, @Nullable String, long, long, @NonNull android.app.jank.RelativeFrameTimeHistogram);
+    ctor public AppJankStats(int, @NonNull String, @Nullable String, @Nullable String, @Nullable String, long, long, @NonNull android.app.jank.RelativeFrameTimeHistogram);
     method public long getJankyFrameCount();
+    method @Nullable public String getNavigationComponent();
     method @NonNull public android.app.jank.RelativeFrameTimeHistogram getRelativeFrameTimeHistogram();
     method public long getTotalFrameCount();
     method public int getUid();
@@ -33657,16 +33659,23 @@
   }
 
   @FlaggedApi("android.os.cpu_gpu_headrooms") public final class CpuHeadroomParams {
-    ctor public CpuHeadroomParams();
     method public int getCalculationType();
-    method @IntRange(from=0x32, to=0x2710) public long getCalculationWindowMillis();
-    method public void setCalculationType(int);
-    method public void setCalculationWindowMillis(@IntRange(from=0x32, to=0x2710) int);
-    method public void setTids(@NonNull int...);
+    method public long getCalculationWindowMillis();
+    method @NonNull public int[] getTids();
+    method @NonNull public android.os.CpuHeadroomParams.Builder toBuilder();
     field public static final int CPU_HEADROOM_CALCULATION_TYPE_AVERAGE = 1; // 0x1
     field public static final int CPU_HEADROOM_CALCULATION_TYPE_MIN = 0; // 0x0
   }
 
+  public static final class CpuHeadroomParams.Builder {
+    ctor public CpuHeadroomParams.Builder();
+    ctor public CpuHeadroomParams.Builder(@NonNull android.os.CpuHeadroomParams);
+    method @NonNull public android.os.CpuHeadroomParams build();
+    method @NonNull public android.os.CpuHeadroomParams.Builder setCalculationType(int);
+    method @NonNull public android.os.CpuHeadroomParams.Builder setCalculationWindowMillis(@IntRange(from=1) int);
+    method @NonNull public android.os.CpuHeadroomParams.Builder setTids(@NonNull int...);
+  }
+
   public final class CpuUsageInfo implements android.os.Parcelable {
     method public int describeContents();
     method public long getActive();
@@ -33915,13 +33924,20 @@
   }
 
   @FlaggedApi("android.os.cpu_gpu_headrooms") public final class GpuHeadroomParams {
-    ctor public GpuHeadroomParams();
     method public int getCalculationType();
-    method @IntRange(from=0x32, to=0x2710) public int getCalculationWindowMillis();
-    method public void setCalculationType(int);
-    method public void setCalculationWindowMillis(@IntRange(from=0x32, to=0x2710) int);
+    method public int getCalculationWindowMillis();
     field public static final int GPU_HEADROOM_CALCULATION_TYPE_AVERAGE = 1; // 0x1
     field public static final int GPU_HEADROOM_CALCULATION_TYPE_MIN = 0; // 0x0
+    field public static final int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX = 10000; // 0x2710
+    field public static final int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN = 50; // 0x32
+  }
+
+  public static final class GpuHeadroomParams.Builder {
+    ctor public GpuHeadroomParams.Builder();
+    ctor public GpuHeadroomParams.Builder(@NonNull android.os.GpuHeadroomParams);
+    method @NonNull public android.os.GpuHeadroomParams build();
+    method @NonNull public android.os.GpuHeadroomParams.Builder setCalculationType(int);
+    method @NonNull public android.os.GpuHeadroomParams.Builder setCalculationWindowMillis(@IntRange(from=1) int);
   }
 
   public class Handler {
@@ -35187,9 +35203,12 @@
 
   public class SystemHealthManager {
     method @FlaggedApi("android.os.cpu_gpu_headrooms") @FloatRange(from=0.0f, to=100.0f) public float getCpuHeadroom(@Nullable android.os.CpuHeadroomParams);
+    method @FlaggedApi("android.os.cpu_gpu_headrooms") @NonNull public android.util.Pair<java.lang.Integer,java.lang.Integer> getCpuHeadroomCalculationWindowRange();
     method @FlaggedApi("android.os.cpu_gpu_headrooms") public long getCpuHeadroomMinIntervalMillis();
     method @FlaggedApi("android.os.cpu_gpu_headrooms") @FloatRange(from=0.0f, to=100.0f) public float getGpuHeadroom(@Nullable android.os.GpuHeadroomParams);
+    method @FlaggedApi("android.os.cpu_gpu_headrooms") @NonNull public android.util.Pair<java.lang.Integer,java.lang.Integer> getGpuHeadroomCalculationWindowRange();
     method @FlaggedApi("android.os.cpu_gpu_headrooms") public long getGpuHeadroomMinIntervalMillis();
+    method @FlaggedApi("android.os.cpu_gpu_headrooms") @IntRange(from=1) public int getMaxCpuHeadroomTidsSize();
     method @FlaggedApi("com.android.server.power.optimization.power_monitor_api") public void getPowerMonitorReadings(@NonNull java.util.List<android.os.PowerMonitor>, @Nullable java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.os.PowerMonitorReadings,java.lang.RuntimeException>);
     method @FlaggedApi("com.android.server.power.optimization.power_monitor_api") public void getSupportedPowerMonitors(@Nullable java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.os.PowerMonitor>>);
     method public android.os.health.HealthStats takeMyUidSnapshot();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index ed8042d..cd2cc07 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2,7 +2,7 @@
 package android {
 
   public static final class Manifest.permission {
-    field @FlaggedApi("com.android.server.accessibility.motion_event_observing") public static final String ACCESSIBILITY_MOTION_EVENT_OBSERVING = "android.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING";
+    field public static final String ACCESSIBILITY_MOTION_EVENT_OBSERVING = "android.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING";
     field public static final String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
     field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
     field public static final String ADJUST_RUNTIME_PERMISSIONS_POLICY = "android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY";
@@ -2113,6 +2113,11 @@
     method public boolean isAidlHal();
   }
 
+  public static final class MediaMuxer.OutputFormat {
+    field public static final int MUXER_OUTPUT_FIRST = 0; // 0x0
+    field public static final int MUXER_OUTPUT_LAST = 4; // 0x4
+  }
+
   public final class MediaRoute2Info implements android.os.Parcelable {
     method @NonNull public String getOriginalId();
   }
diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt
index 349b4ed..fe23517 100644
--- a/core/api/test-lint-baseline.txt
+++ b/core/api/test-lint-baseline.txt
@@ -1977,6 +1977,8 @@
     Documentation mentions 'TODO'
 
 
+UnflaggedApi: android.Manifest.permission#ACCESSIBILITY_MOTION_EVENT_OBSERVING:
+    New API must be flagged with @FlaggedApi: field android.Manifest.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING
 UnflaggedApi: android.Manifest.permission#MANAGE_REMOTE_AUTH:
     New API must be flagged with @FlaggedApi: field android.Manifest.permission.MANAGE_REMOTE_AUTH
 UnflaggedApi: android.Manifest.permission#RESERVED_FOR_TESTING_SIGNATURE:
@@ -2057,6 +2059,10 @@
     New API must be flagged with @FlaggedApi: method android.media.AudioManager.getFocusFadeOutDurationForTest()
 UnflaggedApi: android.media.AudioManager#getFocusUnmuteDelayAfterFadeOutForTest():
     New API must be flagged with @FlaggedApi: method android.media.AudioManager.getFocusUnmuteDelayAfterFadeOutForTest()
+UnflaggedApi: android.media.MediaMuxer.OutputFormat#MUXER_OUTPUT_FIRST:
+    New API must be flagged with @FlaggedApi: field android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_FIRST
+UnflaggedApi: android.media.MediaMuxer.OutputFormat#MUXER_OUTPUT_LAST:
+    New API must be flagged with @FlaggedApi: field android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_LAST
 UnflaggedApi: android.media.RingtoneSelection:
     New API must be flagged with @FlaggedApi: class android.media.RingtoneSelection
 UnflaggedApi: android.media.RingtoneSelection#DEFAULT_SELECTION_URI_STRING:
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 8614bde..b198811 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1273,8 +1273,8 @@
      * Requests to show the “Open in browser” education. “Open in browser” is a feature
      * within the app header that allows users to switch from an app to the web. The feature
      * is made available when an application is opened by a user clicking a link or when a
-     * link is provided by an application. Links can be provided by utilizing
-     * {@link AssistContent#EXTRA_AUTHENTICATING_USER_WEB_URI} or
+     * link is provided by an application. Links can be provided by calling
+     * {@link AssistContent#setSessionTransferUri} or
      * {@link AssistContent#setWebUri}.
      *
      * <p>This method should be utilized when an activity wants to nudge the user to switch
@@ -1287,7 +1287,7 @@
      * disruptive to the user to show the education and when it is optimal to switch the user to a
      * browser session. Before requesting to show the education, developers should assert that they
      * have set a link that can be used by the "Open in browser" feature through either
-     * {@link AssistContent#EXTRA_AUTHENTICATING_USER_WEB_URI} or
+     * {@link AssistContent#setSessionTransferUri} or
      * {@link AssistContent#setWebUri} so that users are navigated to a relevant page if they choose
      * to switch to the browser. If a URI is not set using either method, "Open in browser" will
      * utilize a generic link if available which will direct users to the homepage of the site
@@ -1296,7 +1296,7 @@
      * the user will not be provided with the option to switch to the browser and the education will
      * not be shown if requested.
      *
-     * @see android.app.assist.AssistContent#EXTRA_SESSION_TRANSFER_WEB_URI
+     * @see android.app.assist.AssistContent#setSessionTransferUri
      */
     @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB_EDUCATION)
     public final void requestOpenInBrowserEducation() {
diff --git a/core/java/android/app/IUserSwitchObserver.aidl b/core/java/android/app/IUserSwitchObserver.aidl
index 1ff7a17..d71ee7c 100644
--- a/core/java/android/app/IUserSwitchObserver.aidl
+++ b/core/java/android/app/IUserSwitchObserver.aidl
@@ -19,10 +19,10 @@
 import android.os.IRemoteCallback;
 
 /** {@hide} */
-interface IUserSwitchObserver {
-    void onBeforeUserSwitching(int newUserId);
-    oneway void onUserSwitching(int newUserId, IRemoteCallback reply);
-    oneway void onUserSwitchComplete(int newUserId);
-    oneway void onForegroundProfileSwitch(int newProfileId);
-    oneway void onLockedBootComplete(int newUserId);
+oneway interface IUserSwitchObserver {
+    void onBeforeUserSwitching(int newUserId, IRemoteCallback reply);
+    void onUserSwitching(int newUserId, IRemoteCallback reply);
+    void onUserSwitchComplete(int newUserId);
+    void onForegroundProfileSwitch(int newProfileId);
+    void onLockedBootComplete(int newUserId);
 }
diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java
index 5567c08..e7e9b00 100644
--- a/core/java/android/app/PropertyInvalidatedCache.java
+++ b/core/java/android/app/PropertyInvalidatedCache.java
@@ -36,6 +36,7 @@
 import android.util.Log;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
+import android.util.SystemPropertySetter;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -157,21 +158,6 @@
     public static final String MODULE_TELEPHONY = "telephony";
 
     /**
-     * Constants that affect retries when the process is unable to write the property.
-     * The first constant is the number of times the process will attempt to set the
-     * property.  The second constant is the delay between attempts.
-     */
-
-    /**
-     * Wait 200ms between retry attempts and the retry limit is 5.  That gives a total possible
-     * delay of 1s, which should be less than ANR timeouts.  The goal is to have the system crash
-     * because the property could not be set (which is a condition that is easily recognized) and
-     * not crash because of an ANR (which can be confusing to debug).
-     */
-    private static final int PROPERTY_FAILURE_RETRY_DELAY_MILLIS = 200;
-    private static final int PROPERTY_FAILURE_RETRY_LIMIT = 5;
-
-    /**
      * Construct a system property that matches the rules described above.  The module is
      * one of the permitted values above.  The API is a string that is a legal Java simple
      * identifier.  The api is modified to conform to the system property style guide by
@@ -958,37 +944,8 @@
          */
         @Override
         void setNonceInternal(long value) {
-            // Failing to set the nonce is a fatal error.  Failures setting a system property have
-            // been reported; given that the failure is probably transient, this function includes
-            // a retry.
             final String str = Long.toString(value);
-            RuntimeException failure = null;
-            for (int attempt = 0; attempt < PROPERTY_FAILURE_RETRY_LIMIT; attempt++) {
-                try {
-                    SystemProperties.set(mName, str);
-                    if (attempt > 0) {
-                        // This log is not guarded.  Based on known bug reports, it should
-                        // occur once a week or less.  The purpose of the log message is to
-                        // identify the retries as a source of delay that might be otherwise
-                        // be attributed to the cache itself.
-                        Log.w(TAG, "Nonce set after " + attempt + " tries");
-                    }
-                    return;
-                } catch (RuntimeException e) {
-                    if (failure == null) {
-                        failure = e;
-                    }
-                    try {
-                        Thread.sleep(PROPERTY_FAILURE_RETRY_DELAY_MILLIS);
-                    } catch (InterruptedException x) {
-                        // Ignore this exception.  The desired delay is only approximate and
-                        // there is no issue if the sleep sometimes terminates early.
-                    }
-                }
-            }
-            // This point is reached only if SystemProperties.set() fails at least once.
-            // Rethrow the first exception that was received.
-            throw failure;
+            SystemPropertySetter.setWithRetry(mName, str);
         }
     }
 
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index 2e6f3e1..5754984 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -753,7 +753,7 @@
      * <p>
      * The mode can be one of:
      * <ul>
-     *   <li><em>{@link #MODE_NIGHT_NO}<em> sets the device into
+     *   <li><em>{@link #MODE_NIGHT_NO}</em> sets the device into
      *       {@code notnight} mode</li>
      *   <li><em>{@link #MODE_NIGHT_YES}</em> sets the device into
      *       {@code night} mode</li>
@@ -889,7 +889,7 @@
      * <p>
      * The mode can be one of:
      * <ul>
-     *   <li><em>{@link #MODE_NIGHT_NO}<em> sets the device into
+     *   <li><em>{@link #MODE_NIGHT_NO}</em> sets the device into
      *       {@code notnight} mode</li>
      *   <li><em>{@link #MODE_NIGHT_YES}</em> sets the device into
      *       {@code night} mode</li>
diff --git a/core/java/android/app/UserSwitchObserver.java b/core/java/android/app/UserSwitchObserver.java
index 727799a1..1664cfb 100644
--- a/core/java/android/app/UserSwitchObserver.java
+++ b/core/java/android/app/UserSwitchObserver.java
@@ -30,7 +30,11 @@
     }
 
     @Override
-    public void onBeforeUserSwitching(int newUserId) throws RemoteException {}
+    public void onBeforeUserSwitching(int newUserId, IRemoteCallback reply) throws RemoteException {
+        if (reply != null) {
+            reply.sendResult(null);
+        }
+    }
 
     @Override
     public void onUserSwitching(int newUserId, IRemoteCallback reply) throws RemoteException {
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig
index af035cb..75589fa 100644
--- a/core/java/android/app/admin/flags/flags.aconfig
+++ b/core/java/android/app/admin/flags/flags.aconfig
@@ -160,16 +160,6 @@
 }
 
 flag {
-  name: "fix_race_condition_in_tie_profile_lock"
-  namespace: "enterprise"
-  description: "Fix race condition in tieProfileLockIfNecessary()"
-  bug: "355905501"
-  metadata {
-    purpose: PURPOSE_BUGFIX
-  }
-}
-
-flag {
   name: "quiet_mode_credential_bug_fix"
   namespace: "enterprise"
   description: "Guards a bugfix that ends the credential input flow if the managed user has not stopped."
diff --git a/core/java/android/app/assist/AssistContent.java b/core/java/android/app/assist/AssistContent.java
index 3e3ca24..adf8c94 100644
--- a/core/java/android/app/assist/AssistContent.java
+++ b/core/java/android/app/assist/AssistContent.java
@@ -1,6 +1,7 @@
 package android.app.assist;
 
 import android.annotation.FlaggedApi;
+import android.annotation.Nullable;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ClipData;
 import android.content.Intent;
@@ -30,31 +31,6 @@
     public static final String EXTRA_APP_FUNCTION_DATA =
             "android.app.assist.extra.APP_FUNCTION_DATA";
 
-    /**
-     * This extra can be optionally supplied in the {@link #getExtras} bundle to provide a
-     * {@link Uri} which will be utilized when transitioning a user's session to another surface.
-     *
-     * <p>If provided, instead of using the URI provided in {@link #setWebUri}, the
-     * "Open in browser" feature will use this URI to transition the current session from one
-     * surface to the other. Apps may choose to encode session or user information into this
-     * URI in order to provide a better session transfer experience.
-     *
-     * <p>Unlike {@link #setWebUri}, this URI will not be used for features where the user might
-     * accidentally share it with another user. However, developers should not encode
-     * authentication credentials into this URI, because it will be surfaced in the browser URL
-     * bar and may be copied and shared from there.
-     *
-     * <p>When providing this extra, developers should still continue to provide
-     * {@link #setWebUri} for backwards compatibility with features such as
-     * <a href="https://developer.android.com/guide/components/activities/recents#url-sharing">
-     * recents URL sharing</a> which do not benefit from a session-transfer web URI.
-     *
-     * @see android.app.Activity#requestOpenInBrowserEducation()
-     */
-    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB_EDUCATION)
-    public static final String EXTRA_SESSION_TRANSFER_WEB_URI =
-            "android.app.assist.extra.SESSION_TRANSFER_WEB_URI";
-
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     private boolean mIsAppProvidedIntent = false;
     private boolean mIsAppProvidedWebUri = false;
@@ -66,6 +42,7 @@
     private ClipData mClipData;
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     private Uri mUri;
+    private Uri mSessionTransferUri;
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     private final Bundle mExtras;
 
@@ -200,6 +177,41 @@
     }
 
     /**
+     * This method can be used to provide a {@link Uri} which will be utilized when transitioning a
+     * user's session to another surface.
+     *
+     * <p>If provided, instead of using the URI provided in {@link #setWebUri}, the
+     * "Open in browser" feature will use this URI to transition the current session from one
+     * surface to the other. Apps may choose to encode session or user information into this
+     * URI in order to provide a better session transfer experience. However, while this URI will
+     * only be available to the system and not other applications, developers should not encode
+     * authentication credentials into this URI, because it will be surfaced in the browser URL bar
+     * and may be copied and shared from there.
+     *
+     * <p>When providing this URI, developers should still continue to provide
+     * {@link #setWebUri} for backwards compatibility with features such as
+     * <a href="https://developer.android.com/guide/components/activities/recents#url-sharing">
+     * recents URL sharing</a> which facilitate link sharing with other users and would not benefit
+     * from a session-transfer URI.
+     *
+     * @see android.app.Activity#requestOpenInBrowserEducation()
+     */
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB_EDUCATION)
+    public void setSessionTransferUri(@Nullable Uri uri) {
+        mSessionTransferUri = uri;
+    }
+
+    /**
+     * Return the content's session transfer web URI as per
+     * {@link #setSessionTransferUri(android.net.Uri)}, or null if there is none.
+     */
+    @FlaggedApi(com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB_EDUCATION)
+    @Nullable
+    public Uri getSessionTransferUri() {
+        return mSessionTransferUri;
+    }
+
+    /**
      * Return Bundle for extra vendor-specific data that can be modified and examined.
      */
     public Bundle getExtras() {
@@ -218,6 +230,9 @@
             mUri = Uri.CREATOR.createFromParcel(in);
         }
         if (in.readInt() != 0) {
+            mSessionTransferUri = Uri.CREATOR.createFromParcel(in);
+        }
+        if (in.readInt() != 0) {
             mStructuredData = in.readString();
         }
         mIsAppProvidedIntent = in.readInt() == 1;
@@ -245,6 +260,12 @@
         } else {
             dest.writeInt(0);
         }
+        if (mSessionTransferUri != null) {
+            dest.writeInt(1);
+            mSessionTransferUri.writeToParcel(dest, flags);
+        } else {
+            dest.writeInt(0);
+        }
         if (mStructuredData != null) {
             dest.writeInt(1);
             dest.writeString(mStructuredData);
diff --git a/core/java/android/app/jank/AppJankStats.java b/core/java/android/app/jank/AppJankStats.java
index 6ef6a44..a8ebc383 100644
--- a/core/java/android/app/jank/AppJankStats.java
+++ b/core/java/android/app/jank/AppJankStats.java
@@ -57,6 +57,8 @@
     // Histogram of relative frame times encoded in predetermined buckets.
     private RelativeFrameTimeHistogram mRelativeFrameTimeHistogram;
 
+    // Navigation component associated to this stat.
+    private String mNavigationComponent;
 
     /** Used to indicate no widget category has been set. */
     public static final String WIDGET_CATEGORY_UNSPECIFIED = "unspecified";
@@ -158,6 +160,8 @@
      *
      * @param appUid the Uid of the App that is collecting jank stats.
      * @param widgetId the widget id that frames will be associated to.
+     * @param navigationComponent the intended navigation target within the activity, this could be
+     *                            a navigation destination, screen and/or pane.
      * @param widgetCategory a category used to organize widgets in a structured way that indicates
      *                       they serve a similar purpose or perform related functions. Must be
      *                       prefixed with WIDGET_CATEGORY_ and have a suffix of one of the
@@ -172,14 +176,14 @@
      * @param jankyFrames the total number of janky frames that were counted for this stat.
      * @param relativeFrameTimeHistogram the histogram with predefined buckets. See
      * {@link #getRelativeFrameTimeHistogram()} for details.
-     *
      */
-    public AppJankStats(int appUid, @NonNull String widgetId,
+    public AppJankStats(int appUid, @NonNull String widgetId, @Nullable String navigationComponent,
             @Nullable @WidgetCategory String widgetCategory,
             @Nullable @WidgetState String widgetState, long totalFrames, long jankyFrames,
             @NonNull RelativeFrameTimeHistogram relativeFrameTimeHistogram) {
         mUid = appUid;
         mWidgetId = widgetId;
+        mNavigationComponent = navigationComponent;
         mWidgetCategory = widgetCategory != null ? widgetCategory : WIDGET_CATEGORY_UNSPECIFIED;
         mWidgetState = widgetState != null ? widgetState : WIDGET_STATE_UNSPECIFIED;
         mTotalFrames = totalFrames;
@@ -254,4 +258,13 @@
     public @NonNull RelativeFrameTimeHistogram getRelativeFrameTimeHistogram() {
         return mRelativeFrameTimeHistogram;
     }
+
+    /**
+     * Returns the navigation component if it exists that this stat applies to.
+     *
+     * @return the navigation component if it exists that this stat applies to.
+     */
+    public @Nullable String getNavigationComponent() {
+        return mNavigationComponent;
+    }
 }
diff --git a/core/java/android/companion/virtual/flags.aconfig b/core/java/android/companion/virtual/flags.aconfig
index 46da4a3..f31e7d4 100644
--- a/core/java/android/companion/virtual/flags.aconfig
+++ b/core/java/android/companion/virtual/flags.aconfig
@@ -11,14 +11,6 @@
 container: "system"
 
 flag {
-  name: "enable_native_vdm"
-  namespace: "virtual_devices"
-  description: "Enable native VDM service"
-  bug: "303535376"
-  is_fixed_read_only: true
-}
-
-flag {
   name: "dynamic_policy"
   is_exported: true
   namespace: "virtual_devices"
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index 0333942..9d11710 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -17,6 +17,7 @@
 package android.content.pm;
 
 import android.Manifest;
+import android.annotation.NonNull;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -30,6 +31,7 @@
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.util.ArrayMap;
 import android.util.AtomicFile;
 import android.util.AttributeSet;
 import android.util.IntArray;
@@ -45,11 +47,11 @@
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
 
-import libcore.io.IoUtils;
-
 import com.google.android.collect.Lists;
 import com.google.android.collect.Maps;
 
+import libcore.io.IoUtils;
+
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -94,6 +96,9 @@
     @GuardedBy("mServicesLock")
     private final SparseArray<UserServices<V>> mUserServices = new SparseArray<UserServices<V>>(2);
 
+    @GuardedBy("mServicesLock")
+    private final ArrayMap<String, ServiceInfo<V>> mServiceInfoCaches = new ArrayMap<>();
+
     private static class UserServices<V> {
         @GuardedBy("mServicesLock")
         final Map<V, Integer> persistentServices = Maps.newHashMap();
@@ -323,13 +328,16 @@
         public final ComponentName componentName;
         @UnsupportedAppUsage
         public final int uid;
+        public final long lastUpdateTime;
 
         /** @hide */
-        public ServiceInfo(V type, ComponentInfo componentInfo, ComponentName componentName) {
+        public ServiceInfo(V type, ComponentInfo componentInfo, ComponentName componentName,
+                long lastUpdateTime) {
             this.type = type;
             this.componentInfo = componentInfo;
             this.componentName = componentName;
             this.uid = (componentInfo != null) ? componentInfo.applicationInfo.uid : -1;
+            this.lastUpdateTime = lastUpdateTime;
         }
 
         @Override
@@ -490,7 +498,7 @@
         final List<ResolveInfo> resolveInfos = queryIntentServices(userId);
         for (ResolveInfo resolveInfo : resolveInfos) {
             try {
-                ServiceInfo<V> info = parseServiceInfo(resolveInfo);
+                ServiceInfo<V> info = parseServiceInfo(resolveInfo, userId);
                 if (info == null) {
                     Log.w(TAG, "Unable to load service info " + resolveInfo.toString());
                     continue;
@@ -638,13 +646,31 @@
     }
 
     @VisibleForTesting
-    protected ServiceInfo<V> parseServiceInfo(ResolveInfo service)
+    protected ServiceInfo<V> parseServiceInfo(ResolveInfo service, int userId)
             throws XmlPullParserException, IOException {
         android.content.pm.ServiceInfo si = service.serviceInfo;
         ComponentName componentName = new ComponentName(si.packageName, si.name);
 
         PackageManager pm = mContext.getPackageManager();
 
+        // Check if the service has been in the service cache.
+        long lastUpdateTime = -1;
+        if (Flags.optimizeParsingInRegisteredServicesCache()) {
+            try {
+                PackageInfo packageInfo = pm.getPackageInfoAsUser(si.packageName,
+                        PackageManager.MATCH_DIRECT_BOOT_AWARE
+                                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
+                lastUpdateTime = packageInfo.lastUpdateTime;
+
+                ServiceInfo<V> serviceInfo = getServiceInfoFromServiceCache(si, lastUpdateTime);
+                if (serviceInfo != null) {
+                    return serviceInfo;
+                }
+            } catch (NameNotFoundException | SecurityException e) {
+                Slog.d(TAG, "Fail to get the PackageInfo in parseServiceInfo: " + e);
+            }
+        }
+
         XmlResourceParser parser = null;
         try {
             parser = si.loadXmlMetaData(pm, mMetaDataName);
@@ -670,8 +696,13 @@
             if (v == null) {
                 return null;
             }
-            final android.content.pm.ServiceInfo serviceInfo = service.serviceInfo;
-            return new ServiceInfo<V>(v, serviceInfo, componentName);
+            ServiceInfo<V> serviceInfo = new ServiceInfo<V>(v, si, componentName, lastUpdateTime);
+            if (Flags.optimizeParsingInRegisteredServicesCache()) {
+                synchronized (mServicesLock) {
+                    mServiceInfoCaches.put(getServiceCacheKey(si), serviceInfo);
+                }
+            }
+            return serviceInfo;
         } catch (NameNotFoundException e) {
             throw new XmlPullParserException(
                     "Unable to load resources for pacakge " + si.packageName);
@@ -841,4 +872,28 @@
         mContext.unregisterReceiver(mExternalReceiver);
         mContext.unregisterReceiver(mUserRemovedReceiver);
     }
+
+    private static String getServiceCacheKey(@NonNull android.content.pm.ServiceInfo serviceInfo) {
+        StringBuilder sb = new StringBuilder(serviceInfo.packageName);
+        sb.append('-');
+        sb.append(serviceInfo.name);
+        return sb.toString();
+    }
+
+    private ServiceInfo<V> getServiceInfoFromServiceCache(
+            @NonNull android.content.pm.ServiceInfo serviceInfo, long lastUpdateTime) {
+        String serviceCacheKey = getServiceCacheKey(serviceInfo);
+        synchronized (mServicesLock) {
+            ServiceInfo<V> serviceCache = mServiceInfoCaches.get(serviceCacheKey);
+            if (serviceCache == null) {
+                return null;
+            }
+            if (serviceCache.lastUpdateTime == lastUpdateTime) {
+                return serviceCache;
+            }
+            // The service is not latest, remove it from the cache.
+            mServiceInfoCaches.remove(serviceCacheKey);
+            return null;
+        }
+    }
 }
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index 7bba06c..e4b8c90 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -383,3 +383,11 @@
     bug: "334024639"
     description: "Feature flag to check whether a given UID can access a content provider"
 }
+
+flag {
+    name: "optimize_parsing_in_registered_services_cache"
+    namespace: "package_manager_service"
+    description: "Feature flag to optimize RegisteredServicesCache ServiceInfo parsing by using caches."
+    bug: "319137634"
+    is_fixed_read_only: true
+}
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 2d3d252..868429c 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -16,8 +16,6 @@
 
 package android.hardware;
 
-import static android.companion.virtual.VirtualDeviceManager.ACTION_VIRTUAL_DEVICE_REMOVED;
-import static android.companion.virtual.VirtualDeviceManager.EXTRA_VIRTUAL_DEVICE_ID;
 import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS;
 import static android.content.Context.DEVICE_ID_DEFAULT;
@@ -164,11 +162,7 @@
         // initialize the sensor list
         for (int index = 0;; ++index) {
             Sensor sensor = new Sensor();
-            if (android.companion.virtual.flags.Flags.enableNativeVdm()) {
-                if (!nativeGetDefaultDeviceSensorAtIndex(mNativeInstance, sensor, index)) break;
-            } else {
-                if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break;
-            }
+            if (!nativeGetDefaultDeviceSensorAtIndex(mNativeInstance, sensor, index)) break;
             mFullSensorsList.add(sensor);
             mHandleToSensor.put(sensor.getHandle(), sensor);
         }
@@ -555,11 +549,7 @@
     }
 
     private List<Sensor> createRuntimeSensorListLocked(int deviceId) {
-        if (android.companion.virtual.flags.Flags.vdmPublicApis()) {
-            setupVirtualDeviceListener();
-        } else {
-            setupRuntimeSensorBroadcastReceiver();
-        }
+        setupVirtualDeviceListener();
         List<Sensor> list = new ArrayList<>();
         nativeGetRuntimeSensors(mNativeInstance, deviceId, list);
         mFullRuntimeSensorListByDevice.put(deviceId, list);
@@ -570,35 +560,6 @@
         return list;
     }
 
-    private void setupRuntimeSensorBroadcastReceiver() {
-        if (mRuntimeSensorBroadcastReceiver == null) {
-            mRuntimeSensorBroadcastReceiver = new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    if (intent.getAction().equals(ACTION_VIRTUAL_DEVICE_REMOVED)) {
-                        synchronized (mFullRuntimeSensorListByDevice) {
-                            final int deviceId = intent.getIntExtra(
-                                    EXTRA_VIRTUAL_DEVICE_ID, DEVICE_ID_DEFAULT);
-                            List<Sensor> removedSensors =
-                                    mFullRuntimeSensorListByDevice.removeReturnOld(deviceId);
-                            if (removedSensors != null) {
-                                for (Sensor s : removedSensors) {
-                                    cleanupSensorConnection(s);
-                                }
-                            }
-                            mRuntimeSensorListByDeviceByType.remove(deviceId);
-                        }
-                    }
-                }
-            };
-
-            IntentFilter filter = new IntentFilter("virtual_device_removed");
-            filter.addAction(ACTION_VIRTUAL_DEVICE_REMOVED);
-            mContext.registerReceiver(mRuntimeSensorBroadcastReceiver, filter,
-                    Context.RECEIVER_NOT_EXPORTED);
-        }
-    }
-
     private void setupVirtualDeviceListener() {
         if (mVirtualDeviceListener != null) {
             return;
diff --git a/core/java/android/hardware/display/DisplayTopology.java b/core/java/android/hardware/display/DisplayTopology.java
index 0e2c05f..1d2f133 100644
--- a/core/java/android/hardware/display/DisplayTopology.java
+++ b/core/java/android/hardware/display/DisplayTopology.java
@@ -679,8 +679,7 @@
     }
 
     /**
-     * Tests whether two brightness float values are within a small enough tolerance
-     * of each other.
+     * Tests whether two float values are within a small enough tolerance of each other.
      * @param a first float to compare
      * @param b second float to compare
      * @return whether the two values are within a small enough tolerance value
diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java
index 0cd3209..9181bd0 100644
--- a/core/java/android/hardware/location/ContextHubManager.java
+++ b/core/java/android/hardware/location/ContextHubManager.java
@@ -697,6 +697,7 @@
      *
      * @param endpointId Statically generated ID for an endpoint.
      * @return A list of {@link HubDiscoveryInfo} objects that represents the result of discovery.
+     * @throws UnsupportedOperationException If the operation is not supported.
      */
     @FlaggedApi(Flags.FLAG_OFFLOAD_API)
     @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
@@ -733,6 +734,7 @@
      *     cannot be null or empty.
      * @return A list of {@link HubDiscoveryInfo} objects that represents the result of discovery.
      * @throws IllegalArgumentException if the serviceDescriptor is empty/null.
+     * @throws UnsupportedOperationException If the operation is not supported.
      */
     @FlaggedApi(Flags.FLAG_OFFLOAD_API)
     @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
diff --git a/core/java/android/os/CpuHeadroomParams.java b/core/java/android/os/CpuHeadroomParams.java
index 072c012..e511976 100644
--- a/core/java/android/os/CpuHeadroomParams.java
+++ b/core/java/android/os/CpuHeadroomParams.java
@@ -28,15 +28,11 @@
 
 /**
  * Headroom request params used by {@link SystemHealthManager#getCpuHeadroom(CpuHeadroomParams)}.
+ *
+ * <p>This class is immutable and one should use the {@link Builder} to build a new instance.
  */
 @FlaggedApi(Flags.FLAG_CPU_GPU_HEADROOMS)
 public final class CpuHeadroomParams {
-    final CpuHeadroomParamsInternal mInternal;
-
-    public CpuHeadroomParams() {
-        mInternal = new CpuHeadroomParamsInternal();
-    }
-
     /** @hide */
     @IntDef(flag = false, prefix = {"CPU_HEADROOM_CALCULATION_TYPE_"}, value = {
             CPU_HEADROOM_CALCULATION_TYPE_MIN, // 0
@@ -47,107 +43,188 @@
     }
 
     /**
-     * Calculates the headroom based on minimum value over a device-defined window.
+     * The headroom calculation type bases on minimum value over a specified window.
      */
     public static final int CPU_HEADROOM_CALCULATION_TYPE_MIN = 0;
 
     /**
-     * Calculates the headroom based on average value over a device-defined window.
+     * The headroom calculation type bases on average value over a specified window.
      */
     public static final int CPU_HEADROOM_CALCULATION_TYPE_AVERAGE = 1;
 
-    private static final int CALCULATION_WINDOW_MILLIS_MIN = 50;
-    private static final int CALCULATION_WINDOW_MILLIS_MAX = 10000;
-    private static final int MAX_TID_COUNT = 5;
+    /** @hide */
+    public final CpuHeadroomParamsInternal mInternal;
+
+    private CpuHeadroomParams() {
+        mInternal = new CpuHeadroomParamsInternal();
+    }
+
+    public static final class Builder {
+        private int mCalculationType = -1;
+        private int mCalculationWindowMillis = -1;
+        private int[] mTids = null;
+
+        public Builder() {
+        }
+
+        /**
+         * Returns a new builder copy with the same values as the params.
+         */
+        public Builder(@NonNull CpuHeadroomParams params) {
+            if (params.mInternal.calculationType >= 0) {
+                mCalculationType = params.mInternal.calculationType;
+            }
+            if (params.mInternal.calculationWindowMillis >= 0) {
+                mCalculationWindowMillis = params.mInternal.calculationWindowMillis;
+            }
+            if (params.mInternal.tids != null) {
+                mTids = Arrays.copyOf(params.mInternal.tids, params.mInternal.tids.length);
+            }
+        }
+
+        /**
+         * Sets the headroom calculation type.
+         * <p>
+         *
+         * @throws IllegalArgumentException if the type is invalid.
+         */
+        @NonNull
+        public Builder setCalculationType(
+                @CpuHeadroomCalculationType int calculationType) {
+            switch (calculationType) {
+                case CPU_HEADROOM_CALCULATION_TYPE_MIN:
+                case CPU_HEADROOM_CALCULATION_TYPE_AVERAGE: {
+                    mCalculationType = calculationType;
+                    return this;
+                }
+            }
+            throw new IllegalArgumentException("Invalid calculation type: " + calculationType);
+        }
+
+        /**
+         * Sets the headroom calculation window size in milliseconds.
+         * <p>
+         *
+         * @param windowMillis the window size in milliseconds ranges from
+         *                     {@link SystemHealthManager#getCpuHeadroomCalculationWindowRange()}.
+         *                     The smaller the window size, the larger fluctuation in the headroom
+         *                     value should be expected. The default value can be retrieved from
+         *                     the {@link CpuHeadroomParams#getCalculationWindowMillis}. The device
+         *                     will try to use the closest feasible window size to this param.
+         * @throws IllegalArgumentException if the window is invalid.
+         */
+        @NonNull
+        public Builder setCalculationWindowMillis(@IntRange(from = 1) int windowMillis) {
+            if (windowMillis <= 0) {
+                throw new IllegalArgumentException("Invalid calculation window: " + windowMillis);
+            }
+            mCalculationWindowMillis = windowMillis;
+            return this;
+        }
+
+        /**
+         * Sets the thread TIDs to track.
+         * <p>
+         * The TIDs should belong to the same of the process that will make the headroom call. And
+         * they should not have different core affinity.
+         * <p>
+         * If not set or set to empty, the headroom will be based on the PID of the process making
+         * the call.
+         *
+         * @param tids non-null list of TIDs, where maximum size can be read from
+         *             {@link SystemHealthManager#getMaxCpuHeadroomTidsSize()}.
+         * @throws IllegalArgumentException if the TID is not positive.
+         */
+        @NonNull
+        public Builder setTids(@NonNull int... tids) {
+            for (int tid : tids) {
+                if (tid <= 0) {
+                    throw new IllegalArgumentException("Invalid TID: " + tid);
+                }
+            }
+            mTids = tids;
+            return this;
+        }
+
+        /**
+         * Builds the {@link CpuHeadroomParams} object.
+         */
+        @NonNull
+        public CpuHeadroomParams build() {
+            CpuHeadroomParams params = new CpuHeadroomParams();
+            if (mCalculationType >= 0) {
+                params.mInternal.calculationType = (byte) mCalculationType;
+            }
+            if (mCalculationWindowMillis >= 0) {
+                params.mInternal.calculationWindowMillis = mCalculationWindowMillis;
+            }
+            if (mTids != null) {
+                params.mInternal.tids = mTids;
+            }
+            return params;
+        }
+    }
 
     /**
-     * Sets the headroom calculation type.
-     * <p>
-     *
-     * @throws IllegalArgumentException if the type is invalid.
+     * Returns a new builder with the same values as this object.
      */
-    public void setCalculationType(@CpuHeadroomCalculationType int calculationType) {
-        switch (calculationType) {
-            case CPU_HEADROOM_CALCULATION_TYPE_MIN:
-            case CPU_HEADROOM_CALCULATION_TYPE_AVERAGE:
-                mInternal.calculationType = (byte) calculationType;
-                return;
-        }
-        throw new IllegalArgumentException("Invalid calculation type: " + calculationType);
+    @NonNull
+    public Builder toBuilder() {
+        return new Builder(this);
     }
 
     /**
      * Gets the headroom calculation type.
-     * Default to {@link #CPU_HEADROOM_CALCULATION_TYPE_MIN} if not set.
+     * <p>
+     * This will return the default value chosen by the device if not set.
      */
     public @CpuHeadroomCalculationType int getCalculationType() {
         @CpuHeadroomCalculationType int validatedType = switch ((int) mInternal.calculationType) {
-            case CPU_HEADROOM_CALCULATION_TYPE_MIN, CPU_HEADROOM_CALCULATION_TYPE_AVERAGE ->
-                    mInternal.calculationType;
+            case CPU_HEADROOM_CALCULATION_TYPE_MIN,
+                 CPU_HEADROOM_CALCULATION_TYPE_AVERAGE -> mInternal.calculationType;
             default -> CPU_HEADROOM_CALCULATION_TYPE_MIN;
         };
         return validatedType;
     }
 
     /**
-     * Sets the headroom calculation window size in milliseconds.
-     * <p>
-     *
-     * @param windowMillis the window size in milliseconds ranges from [50, 10000]. The smaller the
-     *                     window size, the larger fluctuation in the headroom value should be
-     *                     expected. The default value can be retrieved from the
-     *                     {@link #getCalculationWindowMillis}. The device will try to use the
-     *                     closest feasible window size to this param.
-     * @throws IllegalArgumentException if the window size is not in allowed range.
-     */
-    public void setCalculationWindowMillis(
-            @IntRange(from = CALCULATION_WINDOW_MILLIS_MIN, to =
-                    CALCULATION_WINDOW_MILLIS_MAX) int windowMillis) {
-        if (windowMillis < CALCULATION_WINDOW_MILLIS_MIN
-                || windowMillis > CALCULATION_WINDOW_MILLIS_MAX) {
-            throw new IllegalArgumentException("Invalid calculation window: " + windowMillis);
-        }
-        mInternal.calculationWindowMillis = windowMillis;
-    }
-
-    /**
      * Gets the headroom calculation window size in milliseconds.
      * <p>
-     * This will return the default value chosen by the device if the params is not set.
+     * This will return the default value chosen by the device if not set.
      */
-    public @IntRange(from = CALCULATION_WINDOW_MILLIS_MIN, to =
-            CALCULATION_WINDOW_MILLIS_MAX) long getCalculationWindowMillis() {
+    public long getCalculationWindowMillis() {
         return mInternal.calculationWindowMillis;
     }
 
     /**
-     * Sets the thread TIDs to track.
+     * Gets the TIDs to track.
      * <p>
-     * The TIDs should belong to the same of the process that will the headroom call. And they
-     * should not have different core affinity.
-     * <p>
-     * If not set, the headroom will be based on the PID of the process making the call.
-     *
-     * @param tids non-empty list of TIDs, maximum 5.
-     * @throws IllegalArgumentException if the list size is not in allowed range or TID is not
-     *                                  positive.
+     * This will return a copy of the TIDs in the params, or null if the params is not set.
      */
-    public void setTids(@NonNull int... tids) {
-        if (tids.length == 0 || tids.length > MAX_TID_COUNT) {
-            throw new IllegalArgumentException("Invalid number of TIDs: " + tids.length);
-        }
-        for (int tid : tids) {
-            if (tid <= 0) {
-                throw new IllegalArgumentException("Invalid TID: " + tid);
-            }
-        }
-        mInternal.tids = Arrays.copyOf(tids, tids.length);
+    @NonNull
+    public int[] getTids() {
+        return mInternal.tids == null ? null : Arrays.copyOf(mInternal.tids, mInternal.tids.length);
     }
 
-    /**
-     * @hide
-     */
-    public CpuHeadroomParamsInternal getInternal() {
-        return mInternal;
+    @Override
+    public String toString() {
+        return "CpuHeadroomParams{"
+                + "calculationType=" + mInternal.calculationType
+                + ", calculationWindowMillis=" + mInternal.calculationWindowMillis
+                + ", tids=" + Arrays.toString(mInternal.tids)
+                + '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CpuHeadroomParams that = (CpuHeadroomParams) o;
+        return mInternal.equals(that.mInternal);
+    }
+
+    @Override
+    public int hashCode() {
+        return mInternal.hashCode();
     }
 }
diff --git a/core/java/android/os/GpuHeadroomParams.java b/core/java/android/os/GpuHeadroomParams.java
index 126ee8c..5c5e7bb 100644
--- a/core/java/android/os/GpuHeadroomParams.java
+++ b/core/java/android/os/GpuHeadroomParams.java
@@ -19,6 +19,7 @@
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
+import android.annotation.NonNull;
 import android.os.health.SystemHealthManager;
 
 import java.lang.annotation.Retention;
@@ -26,15 +27,11 @@
 
 /**
  * Headroom request params used by {@link SystemHealthManager#getGpuHeadroom(GpuHeadroomParams)}.
+ *
+ * <p>This class is immutable and one should use the {@link Builder} to build a new instance.
  */
 @FlaggedApi(Flags.FLAG_CPU_GPU_HEADROOMS)
 public final class GpuHeadroomParams {
-    final GpuHeadroomParamsInternal mInternal;
-
-    public GpuHeadroomParams() {
-        mInternal = new GpuHeadroomParamsInternal();
-    }
-
     /** @hide */
     @IntDef(flag = false, prefix = {"GPU_HEADROOM_CALCULATION_TYPE_"}, value = {
             GPU_HEADROOM_CALCULATION_TYPE_MIN, // 0
@@ -45,82 +42,153 @@
     }
 
     /**
-     * Calculates the headroom based on minimum value over a device-defined window.
+     * The headroom calculation type bases on minimum value over a specified window.
      */
     public static final int GPU_HEADROOM_CALCULATION_TYPE_MIN = 0;
 
     /**
-     * Calculates the headroom based on average value over a device-defined window.
+     * The headroom calculation type bases on average value over a specified window.
      */
     public static final int GPU_HEADROOM_CALCULATION_TYPE_AVERAGE = 1;
 
-    private static final int CALCULATION_WINDOW_MILLIS_MIN = 50;
-    private static final int CALCULATION_WINDOW_MILLIS_MAX = 10000;
+    /**
+     * The minimum size of the window to compute the headroom over.
+     */
+    public static final int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN = 50;
 
     /**
-     * Sets the headroom calculation type.
-     * <p>
-     *
-     * @throws IllegalArgumentException if the type is invalid.
+     * The maximum size of the window to compute the headroom over.
      */
-    public void setCalculationType(@GpuHeadroomCalculationType int calculationType) {
-        switch (calculationType) {
-            case GPU_HEADROOM_CALCULATION_TYPE_MIN:
-            case GPU_HEADROOM_CALCULATION_TYPE_AVERAGE:
-                mInternal.calculationType = (byte) calculationType;
-                return;
+    public static final int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX = 10000;
+
+    /**
+     * @hide
+     */
+    public final GpuHeadroomParamsInternal mInternal;
+
+    /**
+     * @hide
+     */
+    private GpuHeadroomParams() {
+        mInternal = new GpuHeadroomParamsInternal();
+    }
+
+    public static final class Builder {
+        private int mCalculationType = -1;
+        private int mCalculationWindowMillis = -1;
+
+        public Builder() {
         }
-        throw new IllegalArgumentException("Invalid calculation type: " + calculationType);
+
+        /**
+         * Returns a new builder with the same values as this object.
+         */
+        public Builder(@NonNull GpuHeadroomParams params) {
+            if (params.mInternal.calculationType >= 0) {
+                mCalculationType = params.mInternal.calculationType;
+            }
+            if (params.mInternal.calculationWindowMillis >= 0) {
+                mCalculationWindowMillis = params.mInternal.calculationWindowMillis;
+            }
+        }
+
+        /**
+         * Sets the headroom calculation type.
+         * <p>
+         *
+         * @throws IllegalArgumentException if the type is invalid.
+         */
+        @NonNull
+        public Builder setCalculationType(
+                @GpuHeadroomCalculationType int calculationType) {
+            switch (calculationType) {
+                case GPU_HEADROOM_CALCULATION_TYPE_MIN:
+                case GPU_HEADROOM_CALCULATION_TYPE_AVERAGE: {
+                    mCalculationType = calculationType;
+                    return this;
+                }
+            }
+            throw new IllegalArgumentException("Invalid calculation type: " + calculationType);
+        }
+
+        /**
+         * Sets the headroom calculation window size in milliseconds.
+         * <p>
+         *
+         * @param windowMillis the window size in milliseconds ranges from
+         *                     {@link SystemHealthManager#getGpuHeadroomCalculationWindowRange()}.
+         *                     The smaller the window size, the larger fluctuation in the headroom
+         *                     value should be expected. The default value can be retrieved from
+         *                     the {@link GpuHeadroomParams#getCalculationWindowMillis}. The device
+         *                     will try to use the closest feasible window size to this param.
+         * @throws IllegalArgumentException if the window is invalid.
+         */
+        @NonNull
+        public Builder setCalculationWindowMillis(@IntRange(from = 1) int windowMillis) {
+            if (windowMillis <= 0) {
+                throw new IllegalArgumentException("Invalid calculation window: " + windowMillis);
+            }
+            mCalculationWindowMillis = windowMillis;
+            return this;
+        }
+
+        /**
+         * Builds the {@link GpuHeadroomParams} object.
+         */
+        @NonNull
+        public GpuHeadroomParams build() {
+            GpuHeadroomParams params = new GpuHeadroomParams();
+            if (mCalculationType >= 0) {
+                params.mInternal.calculationType = (byte) mCalculationType;
+            }
+            if (mCalculationWindowMillis >= 0) {
+                params.mInternal.calculationWindowMillis = mCalculationWindowMillis;
+            }
+            return params;
+        }
     }
 
     /**
      * Gets the headroom calculation type.
-     * Default to {@link #GPU_HEADROOM_CALCULATION_TYPE_MIN} if the params is not set.
+     * <p>
+     * This will return the default value chosen by the device if not set.
      */
     public @GpuHeadroomCalculationType int getCalculationType() {
         @GpuHeadroomCalculationType int validatedType = switch ((int) mInternal.calculationType) {
-            case GPU_HEADROOM_CALCULATION_TYPE_MIN, GPU_HEADROOM_CALCULATION_TYPE_AVERAGE ->
-                    mInternal.calculationType;
+            case GPU_HEADROOM_CALCULATION_TYPE_MIN,
+                 GPU_HEADROOM_CALCULATION_TYPE_AVERAGE -> mInternal.calculationType;
             default -> GPU_HEADROOM_CALCULATION_TYPE_MIN;
         };
         return validatedType;
     }
 
     /**
-     * Sets the headroom calculation window size in milliseconds.
-     * <p>
-     *
-     * @param windowMillis the window size in milliseconds ranges from [50, 10000]. The smaller the
-     *                     window size, the larger fluctuation in the headroom value should be
-     *                     expected. The default value can be retrieved from the
-     *                     {@link #getCalculationWindowMillis}. The device will try to use the
-     *                     closest feasible window size to this param.
-     * @throws IllegalArgumentException if the window is invalid.
-     */
-    public void setCalculationWindowMillis(
-            @IntRange(from = CALCULATION_WINDOW_MILLIS_MIN, to =
-                    CALCULATION_WINDOW_MILLIS_MAX) int windowMillis) {
-        if (windowMillis < CALCULATION_WINDOW_MILLIS_MIN
-                || windowMillis > CALCULATION_WINDOW_MILLIS_MAX) {
-            throw new IllegalArgumentException("Invalid calculation window: " + windowMillis);
-        }
-        mInternal.calculationWindowMillis = windowMillis;
-    }
-
-    /**
      * Gets the headroom calculation window size in milliseconds.
      * <p>
      * This will return the default value chosen by the device if not set.
      */
-    public @IntRange(from = CALCULATION_WINDOW_MILLIS_MIN, to =
-            CALCULATION_WINDOW_MILLIS_MAX) int getCalculationWindowMillis() {
+    public int getCalculationWindowMillis() {
         return mInternal.calculationWindowMillis;
     }
 
-    /**
-     * @hide
-     */
-    public GpuHeadroomParamsInternal getInternal() {
-        return mInternal;
+    @Override
+    public String toString() {
+        return "GpuHeadroomParams{"
+                + "calculationType=" + mInternal.calculationType
+                + ", calculationWindowMillis=" + mInternal.calculationWindowMillis
+                + '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        GpuHeadroomParams that = (GpuHeadroomParams) o;
+        return mInternal.equals(that.mInternal);
+    }
+
+    @Override
+    public int hashCode() {
+        return mInternal.hashCode();
     }
 }
diff --git a/core/java/android/os/IHintManager.aidl b/core/java/android/os/IHintManager.aidl
index 5128e91..2432545 100644
--- a/core/java/android/os/IHintManager.aidl
+++ b/core/java/android/os/IHintManager.aidl
@@ -72,6 +72,7 @@
     parcelable HintManagerClientData {
         int powerHalVersion;
         int maxGraphicsPipelineThreads;
+        int maxCpuHeadroomThreads;
         long preferredRateNanos;
         SupportInfo supportInfo;
     }
@@ -88,4 +89,6 @@
      * passing back a bundle of support and configuration information.
      */
     HintManagerClientData registerClient(in IHintManagerClient client);
+
+    HintManagerClientData getClientData();
 }
diff --git a/core/java/android/os/health/SystemHealthManager.java b/core/java/android/os/health/SystemHealthManager.java
index cd79e41..a1e9cf2 100644
--- a/core/java/android/os/health/SystemHealthManager.java
+++ b/core/java/android/os/health/SystemHealthManager.java
@@ -18,6 +18,7 @@
 
 import android.annotation.FlaggedApi;
 import android.annotation.FloatRange;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemService;
@@ -42,6 +43,8 @@
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.SynchronousResultReceiver;
+import android.util.Pair;
+import android.util.Slog;
 
 import com.android.internal.app.IBatteryStats;
 import com.android.server.power.optimization.Flags;
@@ -69,15 +72,41 @@
  * plugged in (e.g. using {@link android.app.job.JobScheduler JobScheduler}), and
  * while that can affect charging rates, it is still preferable to actually draining
  * the battery.
+ * <p>
+ * <b>CPU/GPU Usage</b><br>
+ * CPU/GPU headroom APIs are designed to be best used by applications with consistent and intense
+ * workload such as games to query the remaining capacity headroom over a short period and perform
+ * optimization accordingly. Due to the nature of the fast job scheduling and frequency scaling of
+ * CPU and GPU, the headroom by nature will have "TOCTOU" problem which makes it less suitable for
+ * apps with inconsistent or low workload to take any useful action but simply monitoring. And to
+ * avoid oscillation it's not recommended to adjust workload too frequent (on each polling request)
+ * or too aggressively. As the headroom calculation is more based on reflecting past history usage
+ * than predicting future capacity. Take game as an example, if the API returns CPU headroom of 0 in
+ * one scenario (especially if it's constant across multiple calls), or some value significantly
+ * smaller than other scenarios, then it can reason that the recent performance result is more CPU
+ * bottlenecked. Then reducing the CPU workload intensity can help reserve some headroom to handle
+ * the load variance better, which can result in less frame drops or smooth FPS value. On the other
+ * hand, if the API returns large CPU headroom constantly, the app can be more confident to increase
+ * the workload and expect higher possibility of device meeting its performance expectation.
+ * App can also use thermal APIs to read the current thermal status and headroom first, then poll
+ * the CPU and GPU headroom if the device is (about to) getting thermal throttled. If the CPU/GPU
+ * headrooms provide enough significance such as one valued at 0 while the other at 100, then it can
+ * be used to infer that reducing CPU workload could be more efficient to cool down the device.
+ * There is a caveat that the power controller may scale down the frequency of the CPU and GPU due
+ * to thermal and other reasons, which can result in a higher than usual percentage usage of the
+ * capacity.
  */
 @SystemService(Context.SYSTEM_HEALTH_SERVICE)
 public class SystemHealthManager {
+    private static final String TAG = "SystemHealthManager";
     @NonNull
     private final IBatteryStats mBatteryStats;
     @Nullable
     private final IPowerStatsService mPowerStats;
     @Nullable
     private final IHintManager mHintManager;
+    @Nullable
+    private final IHintManager.HintManagerClientData mHintManagerClientData;
     private List<PowerMonitor> mPowerMonitorsInfo;
     private final Object mPowerMonitorsLock = new Object();
     private static final long TAKE_UID_SNAPSHOT_TIMEOUT_MILLIS = 10_000;
@@ -109,29 +138,72 @@
         mBatteryStats = batteryStats;
         mPowerStats = powerStats;
         mHintManager = hintManager;
+        IHintManager.HintManagerClientData data = null;
+        if (mHintManager != null) {
+            try {
+                data = mHintManager.getClientData();
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to get hint manager client data", e);
+            }
+        }
+        mHintManagerClientData = data;
     }
 
     /**
-     * Provides an estimate of global available CPU headroom.
+     * Provides an estimate of available CPU capacity headroom of the device.
      * <p>
+     * The value can be used by the calling application to determine if the workload was CPU bound
+     * and then take action accordingly to ensure that the workload can be completed smoothly. It
+     * can also be used with the thermal status and headroom to determine if reducing the CPU bound
+     * workload can help reduce the device temperature to avoid thermal throttling.
+     * <p>
+     * If the params are valid, each call will perform at least one synchronous binder transaction
+     * that can take more than 1ms. So it's not recommended to call or wait for this on critical
+     * threads. Some devices may implement this as an on-demand API with lazy initialization, so the
+     * caller should expect higher latency when making the first call (especially with non-default
+     * params) since app starts or after changing params, as the device may need to change its data
+     * collection.
      *
-     * @param  params params to customize the CPU headroom calculation, null to use default params.
-     * @return a single value headroom or a {@code Float.NaN} if it's temporarily unavailable.
-     *         A valid value is ranged from [0, 100], where 0 indicates no more CPU resources can be
-     *         granted.
+     * @param  params params to customize the CPU headroom calculation, or null to use default.
+     * @return a single value headroom or a {@code Float.NaN} if it's temporarily unavailable due to
+     *         server error or not enough user CPU workload.
+     *         Each valid value ranges from [0, 100], where 0 indicates no more cpu resources can be
+     *         granted
      * @throws UnsupportedOperationException if the API is unsupported.
+     * @throws IllegalArgumentException if the params are invalid.
      * @throws SecurityException if the TIDs of the params don't belong to the same process.
      * @throws IllegalStateException if the TIDs of the params don't have the same affinity setting.
      */
     @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
     public @FloatRange(from = 0f, to = 100f) float getCpuHeadroom(
             @Nullable CpuHeadroomParams params) {
-        if (mHintManager == null) {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isCpuSupported) {
             throw new UnsupportedOperationException();
         }
+        if (params != null) {
+            if (params.mInternal.tids != null && (params.mInternal.tids.length == 0
+                    || params.mInternal.tids.length
+                    > mHintManagerClientData.maxCpuHeadroomThreads)) {
+                throw new IllegalArgumentException(
+                        "Invalid number of TIDs: " + params.mInternal.tids.length);
+            }
+            if (params.mInternal.calculationWindowMillis
+                    < mHintManagerClientData.supportInfo.headroom.cpuMinCalculationWindowMillis
+                    || params.mInternal.calculationWindowMillis
+                    > mHintManagerClientData.supportInfo.headroom.cpuMaxCalculationWindowMillis) {
+                throw new IllegalArgumentException(
+                        "Invalid calculation window: "
+                        + params.mInternal.calculationWindowMillis + ", expect range: ["
+                        + mHintManagerClientData.supportInfo.headroom.cpuMinCalculationWindowMillis
+                        + ", "
+                        + mHintManagerClientData.supportInfo.headroom.cpuMaxCalculationWindowMillis
+                        + "]");
+            }
+        }
         try {
             final CpuHeadroomResult ret = mHintManager.getCpuHeadroom(
-                    params != null ? params.getInternal() : new CpuHeadroomParamsInternal());
+                    params != null ? params.mInternal : new CpuHeadroomParamsInternal());
             if (ret == null || ret.getTag() != CpuHeadroomResult.globalHeadroom) {
                 return Float.NaN;
             }
@@ -141,27 +213,69 @@
         }
     }
 
-
+    /**
+     * Gets the maximum number of TIDs this device supports for getting CPU headroom.
+     * <p>
+     * See {@link CpuHeadroomParams#setTids(int...)}.
+     *
+     * @return the maximum size of TIDs supported
+     * @throws UnsupportedOperationException if the CPU headroom API is unsupported.
+     */
+    @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
+    public @IntRange(from = 1) int getMaxCpuHeadroomTidsSize() {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isCpuSupported) {
+            throw new UnsupportedOperationException();
+        }
+        return mHintManagerClientData.maxCpuHeadroomThreads;
+    }
 
     /**
-     * Provides an estimate of global available GPU headroom of the device.
+     * Provides an estimate of available GPU capacity headroom of the device.
      * <p>
+     * The value can be used by the calling application to determine if the workload was GPU bound
+     * and then take action accordingly to ensure that the workload can be completed smoothly. It
+     * can also be used with the thermal status and headroom to determine if reducing the GPU bound
+     * workload can help reduce the device temperature to avoid thermal throttling.
+     * <p>
+     * If the params are valid, each call will perform at least one synchronous binder transaction
+     * that can take more than 1ms. So it's not recommended to call or wait for this on critical
+     * threads. Some devices may implement this as an on-demand API with lazy initialization, so the
+     * caller should expect higher latency when making the first call (especially with non-default
+     * params) since app starts or after changing params, as the device may need to change its data
+     * collection.
      *
-     * @param  params params to customize the GPU headroom calculation, null to use default params.
+     * @param  params params to customize the GPU headroom calculation, or null to use default.
      * @return a single value headroom or a {@code Float.NaN} if it's temporarily unavailable.
-     *         A valid value is ranged from [0, 100], where 0 indicates no more GPU resources can be
+     *         Each valid value ranges from [0, 100], where 0 indicates no more cpu resources can be
      *         granted.
      * @throws UnsupportedOperationException if the API is unsupported.
+     * @throws IllegalArgumentException if the params are invalid.
      */
     @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
     public @FloatRange(from = 0f, to = 100f) float getGpuHeadroom(
             @Nullable GpuHeadroomParams params) {
-        if (mHintManager == null) {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isGpuSupported) {
             throw new UnsupportedOperationException();
         }
+        if (params != null) {
+            if (params.mInternal.calculationWindowMillis
+                    < mHintManagerClientData.supportInfo.headroom.gpuMinCalculationWindowMillis
+                    || params.mInternal.calculationWindowMillis
+                    > mHintManagerClientData.supportInfo.headroom.gpuMaxCalculationWindowMillis) {
+                throw new IllegalArgumentException(
+                        "Invalid calculation window: "
+                        + params.mInternal.calculationWindowMillis + ", expect range: ["
+                        + mHintManagerClientData.supportInfo.headroom.gpuMinCalculationWindowMillis
+                        + ", "
+                        + mHintManagerClientData.supportInfo.headroom.gpuMaxCalculationWindowMillis
+                        + "]");
+            }
+        }
         try {
             final GpuHeadroomResult ret = mHintManager.getGpuHeadroom(
-                    params != null ? params.getInternal() : new GpuHeadroomParamsInternal());
+                    params != null ? params.mInternal : new GpuHeadroomParamsInternal());
             if (ret == null || ret.getTag() != GpuHeadroomResult.globalHeadroom) {
                 return Float.NaN;
             }
@@ -172,7 +286,51 @@
     }
 
     /**
-     * Minimum polling interval for calling {@link #getCpuHeadroom(CpuHeadroomParams)} in
+     * Gets the range of the calculation window size for CPU headroom.
+     * <p>
+     * In API version 36, the range will be a superset of [50, 10000].
+     * <p>
+     * See {@link CpuHeadroomParams#setCalculationWindowMillis(int)}.
+     *
+     * @return the range of the calculation window size supported in milliseconds.
+     * @throws UnsupportedOperationException if the CPU headroom API is unsupported.
+     */
+    @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
+    @NonNull
+    public Pair<Integer, Integer> getCpuHeadroomCalculationWindowRange() {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isCpuSupported) {
+            throw new UnsupportedOperationException();
+        }
+        return new Pair<>(
+                mHintManagerClientData.supportInfo.headroom.cpuMinCalculationWindowMillis,
+                mHintManagerClientData.supportInfo.headroom.cpuMaxCalculationWindowMillis);
+    }
+
+    /**
+     * Gets the range of the calculation window size for GPU headroom.
+     * <p>
+     * In API version 36, the range will be a superset of [50, 10000].
+     * <p>
+     * See {@link GpuHeadroomParams#setCalculationWindowMillis(int)}.
+     *
+     * @return the range of the calculation window size supported in milliseconds.
+     * @throws UnsupportedOperationException if the GPU headroom API is unsupported.
+     */
+    @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
+    @NonNull
+    public Pair<Integer, Integer> getGpuHeadroomCalculationWindowRange() {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isGpuSupported) {
+            throw new UnsupportedOperationException();
+        }
+        return new Pair<>(
+                mHintManagerClientData.supportInfo.headroom.gpuMinCalculationWindowMillis,
+                mHintManagerClientData.supportInfo.headroom.gpuMaxCalculationWindowMillis);
+    }
+
+    /**
+     * Gets minimum polling interval for calling {@link #getCpuHeadroom(CpuHeadroomParams)} in
      * milliseconds.
      * <p>
      * The {@link #getCpuHeadroom(CpuHeadroomParams)} API may return cached result if called more
@@ -182,7 +340,8 @@
      */
     @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
     public long getCpuHeadroomMinIntervalMillis() {
-        if (mHintManager == null) {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isCpuSupported) {
             throw new UnsupportedOperationException();
         }
         try {
@@ -193,7 +352,7 @@
     }
 
     /**
-     * Minimum polling interval for calling {@link #getGpuHeadroom(GpuHeadroomParams)} in
+     * Gets minimum polling interval for calling {@link #getGpuHeadroom(GpuHeadroomParams)} in
      * milliseconds.
      * <p>
      * The {@link #getGpuHeadroom(GpuHeadroomParams)} API may return cached result if called more
@@ -203,7 +362,8 @@
      */
     @FlaggedApi(android.os.Flags.FLAG_CPU_GPU_HEADROOMS)
     public long getGpuHeadroomMinIntervalMillis() {
-        if (mHintManager == null) {
+        if (mHintManager == null || mHintManagerClientData == null
+                || !mHintManagerClientData.supportInfo.headroom.isGpuSupported) {
             throw new UnsupportedOperationException();
         }
         try {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index df12a68..c94526b 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -12223,49 +12223,6 @@
                 "back_gesture_inset_scale_right";
 
         /**
-         * Indicates whether the trackpad back gesture is enabled.
-         * <p>Type: int (0 for false, 1 for true)
-         *
-         * @hide
-         */
-        public static final String TRACKPAD_GESTURE_BACK_ENABLED = "trackpad_gesture_back_enabled";
-
-        /**
-         * Indicates whether the trackpad home gesture is enabled.
-         * <p>Type: int (0 for false, 1 for true)
-         *
-         * @hide
-         */
-        public static final String TRACKPAD_GESTURE_HOME_ENABLED = "trackpad_gesture_home_enabled";
-
-        /**
-         * Indicates whether the trackpad overview gesture is enabled.
-         * <p>Type: int (0 for false, 1 for true)
-         *
-         * @hide
-         */
-        public static final String TRACKPAD_GESTURE_OVERVIEW_ENABLED =
-                "trackpad_gesture_overview_enabled";
-
-        /**
-         * Indicates whether the trackpad notification gesture is enabled.
-         * <p>Type: int (0 for false, 1 for true)
-         *
-         * @hide
-         */
-        public static final String TRACKPAD_GESTURE_NOTIFICATION_ENABLED =
-                "trackpad_gesture_notification_enabled";
-
-        /**
-         * Indicates whether the trackpad quick switch gesture is enabled.
-         * <p>Type: int (0 for false, 1 for true)
-         *
-         * @hide
-         */
-        public static final String TRACKPAD_GESTURE_QUICK_SWITCH_ENABLED =
-                "trackpad_gesture_quick_switch_enabled";
-
-        /**
          * Current provider of proximity-based sharing services.
          * Default value in @string/config_defaultNearbySharingComponent.
          * No VALIDATOR as this setting will not be backed up.
diff --git a/core/java/android/util/AtomicFileBufferedOutputStream.java b/core/java/android/util/AtomicFileBufferedOutputStream.java
new file mode 100644
index 0000000..659ac07
--- /dev/null
+++ b/core/java/android/util/AtomicFileBufferedOutputStream.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+
+/**
+ * {@link BufferedOutputStream} for {@link AtomicFile}.
+ * Allows user-code to write into file output stream backed by {@link AtomicFile}.
+ * In order to "commit" the new content to the file, call {@link #markSuccess()} then
+ * {@link #close()}. Calling{@link #markSuccess()} alone won't update the file.
+ * This class does not confer any file locking semantics. Do not use this class when the file may be
+ * accessed or modified concurrently by multiple threads or processes. The caller is responsible for
+ * ensuring appropriate mutual exclusion invariants whenever it accesses the file.
+ * @hide
+ */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
+public class AtomicFileBufferedOutputStream extends BufferedOutputStream implements AutoCloseable {
+    private static final String TAG = "AtomicFileBufferedOutputStream";
+    private final AtomicFileOutputStream mAtomicFileOutputStream;
+
+    /**
+     * See {@link AtomicFileOutputStream#AtomicFileOutputStream(AtomicFile)}.
+     */
+    public AtomicFileBufferedOutputStream(AtomicFile file) throws IOException {
+        this(new AtomicFileOutputStream(file));
+    }
+
+    private AtomicFileBufferedOutputStream(AtomicFileOutputStream atomicFileOutputStream) {
+        super(atomicFileOutputStream);
+        mAtomicFileOutputStream = atomicFileOutputStream;
+    }
+
+    /**
+     * See {@link AtomicFile#startWrite()} with specific buffer size.
+     */
+    public AtomicFileBufferedOutputStream(AtomicFile file, int bufferSize) throws IOException {
+        this(new AtomicFileOutputStream(file), bufferSize);
+    }
+
+    private AtomicFileBufferedOutputStream(AtomicFileOutputStream atomicFileOutputStream,
+            int bufferSize) {
+        super(atomicFileOutputStream, bufferSize);
+        mAtomicFileOutputStream = atomicFileOutputStream;
+    }
+
+    /**
+     * Flushes output stream and marks the writing as finished.
+     */
+    public void markSuccess() throws IOException {
+        flush();
+        mAtomicFileOutputStream.markSuccess();
+    }
+
+    /**
+     * Creates string representation of the object.
+     */
+    @Override
+    public String toString() {
+        return TAG + "[" + mAtomicFileOutputStream + "]";
+    }
+}
diff --git a/core/java/android/util/AtomicFileBufferedPrintWriter.java b/core/java/android/util/AtomicFileBufferedPrintWriter.java
new file mode 100644
index 0000000..c28b599
--- /dev/null
+++ b/core/java/android/util/AtomicFileBufferedPrintWriter.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+
+
+/**
+ * Buffered {@link PrintWriter} for {@link AtomicFile}.
+ * In order to "commit" the new content to the file, call {@link #markSuccess()} then
+ * {@link #close()}. Calling{@link #markSuccess()} alone won't update the file.
+ * This class does not confer any file locking semantics. Do not use this class when the file may be
+ * accessed or modified concurrently by multiple threads or processes. The caller is responsible for
+ * ensuring appropriate mutual exclusion invariants whenever it accesses the file.
+ * @hide
+ */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
+public class AtomicFileBufferedPrintWriter extends PrintWriter {
+    private final AtomicFileOutputStream mAtomicFileOutStream;
+
+    /**
+     * Construct from {@link AtomicFile} with {@link BufferedWriter} default buffer size.
+     */
+    public AtomicFileBufferedPrintWriter(AtomicFile atomicFile, Charset charset)
+            throws IOException {
+        this(new AtomicFileOutputStream(atomicFile), charset);
+    }
+
+    /**
+     * Create from {@link AtomicFileOutputStream} with {@link BufferedWriter} default buffer size.
+     */
+    public AtomicFileBufferedPrintWriter(AtomicFileOutputStream outStream, Charset charset) {
+        super(new BufferedWriter(new OutputStreamWriter(outStream, charset)));
+        mAtomicFileOutStream = outStream;
+    }
+
+    /**
+     * Construct from {@link AtomicFile} with the specific buffer size.
+     */
+    public AtomicFileBufferedPrintWriter(AtomicFile atomicFile, Charset charset, int bufferSize)
+            throws IOException {
+        this(new AtomicFileOutputStream(atomicFile), charset, bufferSize);
+    }
+
+    /**
+     * Construct from {@link AtomicFileOutputStream} with the specific buffer size.
+     */
+    public AtomicFileBufferedPrintWriter(AtomicFileOutputStream outStream, Charset charset,
+            int bufferSize) {
+        super(new BufferedWriter(new OutputStreamWriter(outStream, charset), bufferSize));
+        mAtomicFileOutStream = outStream;
+    }
+
+    /**
+     * When write is successful this needs to be called to flush the buffer and mark the writing as
+     * successful.
+     */
+    public void markSuccess() throws IOException {
+        flush();
+        mAtomicFileOutStream.markSuccess();
+    }
+
+    /**
+     * Creates string representation of the object.
+     */
+    @Override
+    public String toString() {
+        return "AtomicFileBufferedPrintWriter[" + mAtomicFileOutStream + "]";
+    }
+}
diff --git a/core/java/android/util/AtomicFileOutputStream.java b/core/java/android/util/AtomicFileOutputStream.java
new file mode 100644
index 0000000..dbc3ad2
--- /dev/null
+++ b/core/java/android/util/AtomicFileOutputStream.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * {@link FileOutputStream} for {@link AtomicFile}.
+ * Allows user-code to write into file output stream backed by {@link AtomicFile}.
+ * In order to "commit" the new content to the file, call {@link #markSuccess()} then
+ * {@link #close()}. Calling{@link #markSuccess()} alone won't update the file.
+ * This class does not confer any file locking semantics. Do not use this class when the file may be
+ * accessed or modified concurrently by multiple threads or processes. The caller is responsible for
+ * ensuring appropriate mutual exclusion invariants whenever it accesses the file.
+ * @hide
+ */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
+public class AtomicFileOutputStream extends FileOutputStream implements AutoCloseable {
+    private static final String TAG = "AtomicFileOutputStream";
+    private final AtomicFile mFile;
+    private final FileOutputStream mOutStream;
+    private boolean mWritingSuccessful;
+    private boolean mClosed;
+
+    /**
+     * See {@link AtomicFile#startWrite()}.
+     */
+    public AtomicFileOutputStream(AtomicFile file) throws IOException {
+        this(file, file.startWrite());
+    }
+
+    private AtomicFileOutputStream(AtomicFile file, FileOutputStream oStream) throws IOException {
+        super(oStream.getFD());
+        mFile = file;
+        mOutStream = oStream;
+    }
+
+    /**
+     * Marks the writing as successful.
+     */
+    public void markSuccess() {
+        if (mWritingSuccessful) {
+            throw new IllegalStateException(TAG + " success is already marked");
+        }
+        mWritingSuccessful = true;
+    }
+
+    /**
+     * Finishes writing to {@link #mFile}, see {@link AtomicFile#finishWrite(FileOutputStream)}
+     * and {@link AtomicFile#failWrite(FileOutputStream)}. Closes {@link #mOutStream} which
+     * is the owner of the file descriptor.
+     */
+    @Override
+    public void close() throws IOException {
+        super.close();
+        synchronized (mOutStream) {
+            if (mClosed) {
+                // FileOutputStream#finalize() may call this #close() method.
+                // We don't want to throw exceptions in this case.
+                // CloseGuard#warnIfOpen() also called there, so no need to log warnings in
+                // AtomicFileOutputStream#finalize().
+                return;
+            }
+            mClosed = true;
+        }
+
+        if (mWritingSuccessful) {
+            mFile.finishWrite(mOutStream);
+        } else {
+            mFile.failWrite(mOutStream);
+        }
+    }
+
+    /**
+     * Creates string representation of the object.
+     */
+    @Override
+    public String toString() {
+        return TAG + "["
+                + "mFile=" + mFile
+                + ", mWritingSuccessful=" + mWritingSuccessful
+                + ", mClosed=" + mClosed
+                + "]";
+    }
+}
diff --git a/core/java/android/util/AtomicFilePrintWriter.java b/core/java/android/util/AtomicFilePrintWriter.java
new file mode 100644
index 0000000..f8fde18
--- /dev/null
+++ b/core/java/android/util/AtomicFilePrintWriter.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+
+
+/**
+ * {@link PrintWriter} for {@link AtomicFile}
+ * In order to "commit" the new content to the file, call {@link #markSuccess()} then
+ * {@link #close()}. Calling{@link #markSuccess()} alone won't update the file.
+ * This class does not confer any file locking semantics. Do not use this class when the file may be
+ * accessed or modified concurrently by multiple threads or processes. The caller is responsible for
+ * ensuring appropriate mutual exclusion invariants whenever it accesses the file.
+ * @hide
+ */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
+public class AtomicFilePrintWriter extends PrintWriter {
+    private final AtomicFileOutputStream mAtomicFileOutStream;
+
+    /**
+     * Construct from {@link AtomicFile} with {@link BufferedWriter} default buffer size.
+     */
+    public AtomicFilePrintWriter(AtomicFile atomicFile, Charset charset)
+            throws IOException {
+        this(new AtomicFileOutputStream(atomicFile), charset);
+    }
+
+    /**
+     * Create from {@link AtomicFileOutputStream}.
+     */
+    public AtomicFilePrintWriter(AtomicFileOutputStream outStream, Charset charset) {
+        super(new OutputStreamWriter(outStream, charset));
+        mAtomicFileOutStream = outStream;
+    }
+
+    /**
+     * When write is successful this needs to be called to flush the buffer and mark the writing as
+     * successful.
+     */
+    public void markSuccess() throws IOException {
+        flush();
+        mAtomicFileOutStream.markSuccess();
+    }
+
+    /**
+     * Creates string representation of the object.
+     */
+    @Override
+    public String toString() {
+        return "AtomicFilePrintWriter[" + mAtomicFileOutStream + "]";
+    }
+}
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index d8a88b8..d313fc9 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -100,13 +100,6 @@
     public static final String SETTINGS_NEW_KEYBOARD_TRACKPAD = "settings_new_keyboard_trackpad";
 
     /**
-     * Enable trackpad gesture settings UI
-     * @hide
-     */
-    public static final String SETTINGS_NEW_KEYBOARD_TRACKPAD_GESTURE =
-            "settings_new_keyboard_trackpad_gesture";
-
-    /**
      * Enable the new pages which is implemented with SPA.
      * @hide
      */
@@ -211,7 +204,6 @@
         DEFAULT_FLAGS.put(SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, "true");
         DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY, "true");
         DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_TRACKPAD, "true");
-        DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_TRACKPAD_GESTURE, "false");
         DEFAULT_FLAGS.put(SETTINGS_ENABLE_SPA, "true");
         DEFAULT_FLAGS.put(SETTINGS_ENABLE_SPA_PHASE2, "false");
         DEFAULT_FLAGS.put(SETTINGS_ENABLE_SPA_METRICS, "true");
@@ -237,7 +229,6 @@
         PERSISTENT_FLAGS.add(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME);
         PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY);
         PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_TRACKPAD);
-        PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_TRACKPAD_GESTURE);
         PERSISTENT_FLAGS.add(SETTINGS_ENABLE_SPA);
         PERSISTENT_FLAGS.add(SETTINGS_ENABLE_SPA_PHASE2);
         PERSISTENT_FLAGS.add(SETTINGS_PREFER_ACCESSIBILITY_MENU_IN_SYSTEM);
diff --git a/core/java/android/util/SystemPropertySetter.java b/core/java/android/util/SystemPropertySetter.java
new file mode 100644
index 0000000..bf18f75
--- /dev/null
+++ b/core/java/android/util/SystemPropertySetter.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2025 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 android.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.SystemProperties;
+
+/**
+ * This class provides a single, static function to set a system property.  The function retries on
+ * error.  System properties should be reliable but there have been reports of failures in the set()
+ * command on lower-end devices.  Clients may want to use this method instead of calling
+ * {@link SystemProperties.set} directly.
+ * @hide
+ */
+public class SystemPropertySetter {
+
+    /**
+     * The default retryDelayMs for {@link #setWithRetry}.  This value has been found to give
+     * reasonable behavior in the field.
+     */
+    public static final int PROPERTY_FAILURE_RETRY_DELAY_MILLIS = 200;
+
+    /**
+     * The default retryLimit for {@link #setWithRetry}.  This value has been found to give
+     * reasonable behavior in the field.
+     */
+    public static final int PROPERTY_FAILURE_RETRY_LIMIT = 5;
+
+    /**
+     * Set the value for the given {@code key} to {@code val}.  This method retries using the
+     * standard parameters, above, if the native method throws a RuntimeException.
+     *
+     * @param key The name of the property to be set.
+     * @param val The new string value of the property.
+     * @throws IllegalArgumentException for non read-only properties if the {@code val} exceeds
+     * 91 characters.
+     * @throws RuntimeException if the property cannot be set, for example, if it was blocked by
+     * SELinux. libc will log the underlying reason.
+     */
+    public static void setWithRetry(@NonNull String key, @Nullable String val) {
+        setWithRetry(key, val,PROPERTY_FAILURE_RETRY_DELAY_MILLIS, PROPERTY_FAILURE_RETRY_LIMIT);
+    }
+
+    /**
+     * Set the value for the given {@code key} to {@code val}.  This method retries if the native
+     * method throws a RuntimeException.  If the {@code maxRetry} count is exceeded, the method
+     * throws the first RuntimeException that was seen.
+     *
+     * @param key The name of the property to be set.
+     * @param val The new string value of the property.
+     * @param maxRetry The maximum number of times; must be non-negative.
+     * @param retryDelayMs The number of milliseconds to wait between retries; must be positive.
+     * @throws IllegalArgumentException for non read-only properties if the {@code val} exceeds
+     * 91 characters, or if the retry parameters are invalid.
+     * @throws RuntimeException if the property cannot be set, for example, if it was blocked by
+     * SELinux. libc will log the underlying reason.
+     */
+    public static void setWithRetry(@NonNull String key, @Nullable String val, int maxRetry,
+            long retryDelayMs) {
+        if (maxRetry < 0) {
+            throw new IllegalArgumentException("invalid retry count: " + maxRetry);
+        }
+        if (retryDelayMs <= 0) {
+            throw new IllegalArgumentException("invalid retry delay: " + retryDelayMs);
+        }
+
+        RuntimeException failure = null;
+        for (int attempt = 0; attempt < maxRetry; attempt++) {
+            try {
+                SystemProperties.set(key, val);
+                return;
+            } catch (RuntimeException e) {
+                if (failure == null) {
+                    failure = e;
+                }
+                try {
+                    Thread.sleep(retryDelayMs);
+                } catch (InterruptedException x) {
+                    // Ignore this exception.  The desired delay is only approximate and
+                    // there is no issue if the sleep sometimes terminates early.
+                }
+            }
+        }
+        // This point is reached only if SystemProperties.set() fails at least once.
+        // Rethrow the first exception that was received.
+        throw failure;
+    }
+}
diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java
index 19c98a2..cdfa7c81 100644
--- a/core/java/android/view/WindowInsetsController.java
+++ b/core/java/android/view/WindowInsetsController.java
@@ -34,6 +34,9 @@
 
 /**
  * Interface to control windows that generate insets.
+ *
+ * For guidance, see <a href="https://developer.android.com/develop/ui/views/layout/immersive">
+ * Hide system bars for immersive mode</a>.
  */
 public interface WindowInsetsController {
 
diff --git a/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig b/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
index b3bd92b..c871d56 100644
--- a/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
+++ b/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
@@ -45,3 +45,10 @@
     description: "If true, the APIs to manage content protection device policy will be enabled."
     bug: "319477846"
 }
+
+flag {
+    name: "exported_settings_activity_enabled"
+    namespace: "content_protection"
+    description: "If true, the content protection Settings Activity will be exported for launching externally."
+    bug: "385310141"
+}
diff --git a/core/java/android/widget/flags/flags.aconfig b/core/java/android/widget/flags/flags.aconfig
index 88eb043..83a4c86 100644
--- a/core/java/android/widget/flags/flags.aconfig
+++ b/core/java/android/widget/flags/flags.aconfig
@@ -2,7 +2,7 @@
 container: "system"
 flag {
   name: "enable_fading_view_group"
-  namespace: "system_performance"
+  namespace: "wear_systems"
   description: "FRP screen during OOBE must have fading and scaling animation in Wear Watches"
   bug: "348515581"
   metadata {
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index 091f86e..a864132 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -423,7 +423,7 @@
 
 flag {
     name: "port_window_size_animation"
-    namespace: "systemui"
+    namespace: "windowing_frontend"
     description: "Port window-resize animation from legacy to shell"
     bug: "384976265"
 }
diff --git a/core/java/com/android/internal/jank/Cuj.java b/core/java/com/android/internal/jank/Cuj.java
index fc41537..d1adfc9 100644
--- a/core/java/com/android/internal/jank/Cuj.java
+++ b/core/java/com/android/internal/jank/Cuj.java
@@ -246,8 +246,19 @@
      */
     public static final int CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW = 119;
 
+    /**
+     * Track moving overview task to desktop interaction from overview menu.
+     *
+     * <p> Tracking starts when the overview task is moved to desktop via the overview menu.
+     * Tracking finishes when successfully made a call to `IDesktopMode.moveToDesktop`,
+     * without waiting for transition completion.
+     * </p>
+     * TODO(b/387471509): Update the CUJ to wait for transition completion.
+     */
+    public static final int CUJ_DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU = 120;
+
     // When adding a CUJ, update this and make sure to also update CUJ_TO_STATSD_INTERACTION_TYPE.
-    @VisibleForTesting static final int LAST_CUJ = CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW;
+    @VisibleForTesting static final int LAST_CUJ = CUJ_DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU;
 
     /** @hide */
     @IntDef({
@@ -358,7 +369,8 @@
             CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE,
             CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE,
             CUJ_DESKTOP_MODE_SNAP_RESIZE,
-            CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW
+            CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW,
+            CUJ_DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CujType {}
@@ -480,6 +492,7 @@
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE;
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_SNAP_RESIZE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_SNAP_RESIZE;
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_UNMAXIMIZE_WINDOW;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU;
     }
 
     private Cuj() {
@@ -714,6 +727,8 @@
                 return "DESKTOP_MODE_SNAP_RESIZE";
             case CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW:
                 return "DESKTOP_MODE_UNMAXIMIZE_WINDOW";
+            case CUJ_DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU:
+                return "DESKTOP_MODE_ENTER_FROM_OVERVIEW_MENU";
         }
         return "UNKNOWN";
     }
diff --git a/core/java/com/android/internal/ravenwood/RavenwoodEnvironment.java b/core/java/com/android/internal/ravenwood/RavenwoodEnvironment.java
index 8df3f2a..e522b50 100644
--- a/core/java/com/android/internal/ravenwood/RavenwoodEnvironment.java
+++ b/core/java/com/android/internal/ravenwood/RavenwoodEnvironment.java
@@ -94,14 +94,21 @@
 
         /** Used for testing */
         @Disabled
-        @ChangeId public static final long TEST_COMPAT_ID_2 = 368131701L;
+        @ChangeId
+        public static final long TEST_COMPAT_ID_2 = 368131701L;
 
         /** Used for testing */
         @EnabledAfter(targetSdkVersion = S)
-        @ChangeId public static final long TEST_COMPAT_ID_3 = 368131659L;
+        @ChangeId
+        public static final long TEST_COMPAT_ID_3 = 368131659L;
 
         /** Used for testing */
         @EnabledAfter(targetSdkVersion = UPSIDE_DOWN_CAKE)
-        @ChangeId public static final long TEST_COMPAT_ID_4 = 368132057L;
+        @ChangeId
+        public static final long TEST_COMPAT_ID_4 = 368132057L;
+
+        /** Used for testing */
+        @ChangeId
+        public static final long TEST_COMPAT_ID_5 = 387558811L;
     }
 }
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 57bfc70..b2649a4 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -198,7 +198,7 @@
   auto assetmanager = LockAndStartAssetManager(ptr);
   const ScopedUtfChars package_name_utf8(env, package_name);
   CHECK(package_name_utf8.c_str() != nullptr);
-  const std::string std_package_name(package_name_utf8.c_str());
+  const std::string_view std_package_name(package_name_utf8.c_str());
   const std::unordered_map<std::string, std::string>* map = nullptr;
 
   assetmanager->ForEachPackage([&](const std::string& this_package_name, uint8_t package_id) {
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index cf81ba1..96d34a0 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -645,14 +645,8 @@
     optional SettingProto theme_customization_overlay_packages = 75 [ (android.privacy).dest = DEST_AUTOMATIC ];
     optional SettingProto trust_agents_initialized = 57 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
-    message TrackpadGesture {
-        optional SettingProto trackpad_gesture_back_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto trackpad_gesture_home_enabled = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto trackpad_gesture_overview_enabled = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto trackpad_gesture_notification_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto trackpad_gesture_quick_switch_enabled = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
-    }
-    optional TrackpadGesture trackpad_gesture = 94;
+    reserved 94;  // formerly trackpad_gesture
+    reserved "trackpad_gesture";
 
     message Tts {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index dc95471..ed021b6 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -5405,10 +5405,9 @@
     <permission android:name="android.permission.CHANGE_ACCESSIBILITY_VOLUME"
                 android:protectionLevel="signature" />
 
-    <!-- @FlaggedApi("com.android.server.accessibility.motion_event_observing")
-    @hide
-    @TestApi
-    Allows an accessibility service to observe motion events without consuming them. -->
+    <!-- @TestApi Allows an accessibility service to observe motion events
+         without consuming them.
+         @hide -->
     <permission android:name="android.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING"
                 android:protectionLevel="signature" />
 
diff --git a/core/res/res/layout/notification_2025_expand_button.xml b/core/res/res/layout/notification_2025_expand_button.xml
index c8263c2..1c36754 100644
--- a/core/res/res/layout/notification_2025_expand_button.xml
+++ b/core/res/res/layout/notification_2025_expand_button.xml
@@ -22,6 +22,7 @@
     android:layout_height="wrap_content"
     android:layout_gravity="top|end"
     android:contentDescription="@string/expand_button_content_description_collapsed"
+    android:padding="@dimen/notification_2025_margin"
     >
 
     <LinearLayout
diff --git a/core/res/res/layout/notification_2025_template_collapsed_base.xml b/core/res/res/layout/notification_2025_template_collapsed_base.xml
index c827dcb..f108ce5 100644
--- a/core/res/res/layout/notification_2025_template_collapsed_base.xml
+++ b/core/res/res/layout/notification_2025_template_collapsed_base.xml
@@ -168,7 +168,6 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="top|end"
-                android:layout_margin="@dimen/notification_2025_margin"
                 />
 
         </FrameLayout>
diff --git a/core/res/res/layout/notification_2025_template_collapsed_call.xml b/core/res/res/layout/notification_2025_template_collapsed_call.xml
index ce38c164..6f3c15a 100644
--- a/core/res/res/layout/notification_2025_template_collapsed_call.xml
+++ b/core/res/res/layout/notification_2025_template_collapsed_call.xml
@@ -70,7 +70,6 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="top|end"
-                android:layout_margin="@dimen/notification_2025_margin"
                 />
 
         </FrameLayout>
diff --git a/core/res/res/layout/notification_2025_template_collapsed_media.xml b/core/res/res/layout/notification_2025_template_collapsed_media.xml
index 0021b83..bd17a3a 100644
--- a/core/res/res/layout/notification_2025_template_collapsed_media.xml
+++ b/core/res/res/layout/notification_2025_template_collapsed_media.xml
@@ -189,7 +189,6 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="top|end"
-                android:layout_margin="@dimen/notification_2025_margin"
                 />
 
         </FrameLayout>
diff --git a/core/res/res/layout/notification_2025_template_collapsed_messaging.xml b/core/res/res/layout/notification_2025_template_collapsed_messaging.xml
index f3e4ce1..edbebb1 100644
--- a/core/res/res/layout/notification_2025_template_collapsed_messaging.xml
+++ b/core/res/res/layout/notification_2025_template_collapsed_messaging.xml
@@ -193,7 +193,6 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_gravity="top|end"
-                        android:layout_margin="@dimen/notification_2025_margin"
                         />
 
                 </FrameLayout>
diff --git a/core/res/res/layout/notification_2025_template_conversation.xml b/core/res/res/layout/notification_2025_template_conversation.xml
index 6be5a1c..24b6ad0 100644
--- a/core/res/res/layout/notification_2025_template_conversation.xml
+++ b/core/res/res/layout/notification_2025_template_conversation.xml
@@ -152,7 +152,6 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="top|end"
-                    android:layout_margin="@dimen/notification_2025_margin"
                     />
             </LinearLayout>
         </LinearLayout>
diff --git a/core/res/res/layout/notification_2025_template_header.xml b/core/res/res/layout/notification_2025_template_header.xml
index 3f34eb3..0c07053 100644
--- a/core/res/res/layout/notification_2025_template_header.xml
+++ b/core/res/res/layout/notification_2025_template_header.xml
@@ -85,7 +85,6 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="top|end"
-        android:layout_margin="@dimen/notification_2025_margin"
         android:layout_alignParentEnd="true" />
 
     <include layout="@layout/notification_close_button"
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index bb5380e..06cd44e 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -34,7 +34,7 @@
          http://smscoin.net/software/engine/WordPress/Paid+SMS-registration/ -->
 
     <!-- Arab Emirates -->
-    <shortcode country="ae" pattern="\\d{1,5}" free="1017|1355|3214|6253|6568" />
+    <shortcode country="ae" pattern="\\d{1,5}" free="1017|1355|3214|6253|6568|999" />
 
     <!-- Albania: 5 digits, known short codes listed -->
     <shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" />
@@ -63,8 +63,8 @@
     <!-- Burkina Faso: 1-4 digits (standard system default, not country specific) -->
     <shortcode country="bf" pattern="\\d{1,4}" free="3558" />
 
-    <!-- Bulgaria: 4-5 digits, plus EU -->
-    <shortcode country="bg" pattern="\\d{4,5}" premium="18(?:16|423)|19(?:1[56]|35)" free="116\\d{3}|1988|1490" />
+    <!-- Bulgaria: 4-6 digits, plus EU -->
+    <shortcode country="bg" pattern="\\d{4,6}" premium="18(?:16|423)|19(?:1[56]|35)" free="116\\d{3}|1988|1490|162055" />
 
     <!-- Bahrain: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="bh" pattern="\\d{1,5}" free="81181|85999" />
@@ -81,18 +81,21 @@
     <!-- Canada: 5-6 digits -->
     <shortcode country="ca" pattern="\\d{5,6}" premium="60999|88188|43030" standard="244444" free="455677|24470" />
 
+    <!-- DR Congo: 1-6 digits, known premium codes listed -->
+    <shortcode country="cd" pattern="\\d{1,6}" free="444123" />
+
     <!-- Switzerland: 3-5 digits: http://www.swisscom.ch/fxres/kmu/thirdpartybusiness_code_of_conduct_en.pdf -->
     <shortcode country="ch" pattern="[2-9]\\d{2,4}" premium="543|83111|30118" free="98765|30075|30047" />
 
     <!-- Chile: 4-5 digits (not confirmed), known premium codes listed -->
-    <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240|1038" />
+    <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240|1038|4848" />
 
     <!-- China: premium shortcodes start with "1066", free shortcodes start with "1065":
          http://clients.txtnation.com/entries/197192-china-premium-sms-short-code-requirements -->
     <shortcode country="cn" premium="1066.*" free="1065.*" />
 
     <!-- Colombia: 1-6 digits (not confirmed) -->
-    <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960|899948|87739|85517|491289" />
+    <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960|899948|87739|85517|491289|890119" />
 
     <!-- Costa Rica  -->
     <shortcode country="cr" pattern="\\d{1,6}" free="466453" />
@@ -116,6 +119,9 @@
     <!-- Dominican Republic: 1-6 digits (standard system default, not country specific) -->
     <shortcode country="do" pattern="\\d{1,6}" free="912892|912" />
 
+    <!-- Algeria: 1-5 digits, known premium codes listed -->
+    <shortcode country="dz" pattern="\\d{1,5}" free="63071" />
+
     <!-- Ecuador: 1-6 digits (standard system default, not country specific) -->
     <shortcode country="ec" pattern="\\d{1,6}" free="466453|18512" />
 
@@ -123,20 +129,23 @@
          http://www.tja.ee/public/documents/Elektrooniline_side/Oigusaktid/ENG/Estonian_Numbering_Plan_annex_06_09_2010.mht -->
     <shortcode country="ee" pattern="1\\d{2,4}" premium="90\\d{5}|15330|1701[0-3]" free="116\\d{3}|95034" />
 
-    <!-- Egypt: 4-5 digits, known codes listed -->
-    <shortcode country="eg" pattern="\\d{4,5}" free="1499|10020" />
+    <!-- Egypt: 4-6 digits, known codes listed -->
+    <shortcode country="eg" pattern="\\d{4,6}" free="1499|10020|100158" />
 
     <!-- Spain: 5-6 digits: 25xxx, 27xxx, 280xx, 35xxx, 37xxx, 795xxx, 797xxx, 995xxx, 997xxx, plus EU.
          http://www.legallink.es/?q=en/content/which-current-regulatory-status-premium-rate-services-spain -->
     <shortcode country="es" premium="[23][57]\\d{3}|280\\d{2}|[79]9[57]\\d{3}" free="116\\d{3}|22791|222145|22189" />
 
+    <!-- Ethiopia: 1-4 digits, known codes listed -->
+    <shortcode country="et" pattern="\\d{1,4}" free="8527" />
+
     <!-- Finland: 5-6 digits, premium 0600, 0700: http://en.wikipedia.org/wiki/Telephone_numbers_in_Finland -->
     <shortcode country="fi" pattern="\\d{5,6}" premium="0600.*|0700.*|171(?:59|63)" free="116\\d{3}|14789|17110" />
 
     <!-- France: 5 digits, free: 3xxxx, premium [4-8]xxxx, plus EU:
          http://clients.txtnation.com/entries/161972-france-premium-sms-short-code-requirements,
          visual voicemail code for Orange: 21101 -->
-    <shortcode country="fr" premium="[4-8]\\d{4}" free="3\\d{4}|116\\d{3}|21101|20366|555|2051|33033" />
+    <shortcode country="fr" premium="[4-8]\\d{4}" free="3\\d{4}|116\\d{3}|21101|20366|555|2051|33033|21727" />
 
     <!-- United Kingdom (Great Britain): 4-6 digits, common codes [5-8]xxxx, plus EU:
          http://www.short-codes.com/media/Co-regulatoryCodeofPracticeforcommonshortcodes170206.pdf,
@@ -179,17 +188,17 @@
     <shortcode country="il" pattern="\\d{1,5}" premium="4422|4545" free="37477|6681" />
 
     <!-- Iran: 4-8 digits, known premium codes listed -->
-    <shortcode country="ir" pattern="\\d{4,8}" free="700791|700792|100016|30008360" />
+    <shortcode country="ir" pattern="\\d{4,8}" free="700792|100016|30008360" />
 
     <!-- Italy: 5 digits (premium=41xxx,42xxx), plus EU:
          https://www.itu.int/dms_pub/itu-t/oth/02/02/T020200006B0001PDFE.pdf -->
     <shortcode country="it" pattern="\\d{5}" premium="44[0-4]\\d{2}|47[0-4]\\d{2}|48[0-4]\\d{2}|44[5-9]\\d{4}|47[5-9]\\d{4}|48[5-9]\\d{4}|455\\d{2}|499\\d{2}" free="116\\d{3}|4112503|40\\d{0,12}" standard="430\\d{2}|431\\d{2}|434\\d{4}|435\\d{4}|439\\d{7}" />
 
     <!-- Jordan: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="jo" pattern="\\d{1,5}" free="99066" />
+    <shortcode country="jo" pattern="\\d{1,5}" free="99066|99390" />
 
     <!-- Japan: 8083 used by SOFTBANK_DCB_2 -->
-    <shortcode country="jp" pattern="\\d{1,5}" free="8083" />
+    <shortcode country="jp" pattern="\\d{1,9}" free="8083|00050320" />
 
     <!-- Kenya: 5 digits, known premium codes listed -->
     <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520|23342|40023|24088|23054" />
@@ -206,6 +215,9 @@
     <!-- Kuwait: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="kw" pattern="\\d{1,5}" free="1378|50420|94006|55991|50976|7112" />
 
+    <!-- Lesotho: 4-5 digits, known codes listed -->
+    <shortcode country="ls" pattern="\\d{4,5}" free="32012" />
+
     <!-- Lithuania: 3-5 digits, known premium codes listed, plus EU -->
     <shortcode country="lt" pattern="\\d{3,5}" premium="13[89]1|1394|16[34]5" free="116\\d{3}|1399|1324" />
 
@@ -222,11 +234,14 @@
     <!-- Macedonia: 1-6 digits (not confirmed), known premium codes listed -->
     <shortcode country="mk" pattern="\\d{1,6}" free="129005|122" />
 
+    <!-- Mali: 1-5 digits, known codes listed -->
+    <shortcode country="ml" pattern="\\d{1,5}" free="36098" />
+
     <!-- Mongolia : 1-6 digits (standard system default, not country specific) -->
     <shortcode country="mn" pattern="\\d{1,6}" free="44444|45678|445566" />
 
     <!-- Malawi: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="mw" pattern="\\d{1,5}" free="4276|4305" />
+    <shortcode country="mw" pattern="\\d{1,5}" free="4276|4305|4326" />
 
     <!-- Mozambique: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="mz" pattern="\\d{1,5}" free="1714" />
@@ -323,11 +338,14 @@
     <!-- Tajikistan: 4 digits, known premium codes listed -->
     <shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" />
 
-    <!-- Tanzania: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="tz" pattern="\\d{1,5}" free="15046|15234|15324|15610" />
+    <!-- Timor-Leste 1-5 digits, known codes listed  -->
+    <shortcode country="tl" pattern="\\d{1,5}" free="46645" />
 
-    <!-- Tunisia: 5 digits, known premium codes listed -->
-    <shortcode country="tn" pattern="\\d{5}" free="85799" />
+    <!-- Tanzania: 1-5 digits (standard system default, not country specific) -->
+    <shortcode country="tz" pattern="\\d{1,5}" free="15046|15324|15610" />
+
+    <!-- Tunisia: 1-6 digits, known premium codes listed -->
+    <shortcode country="tn" pattern="\\d{1,6}" free="85799|772024" />
 
     <!-- Turkey -->
     <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493|3193" />
@@ -336,7 +354,7 @@
     <shortcode country="ua" pattern="\\d{4}" premium="444[3-9]|70[579]4|7540" />
 
     <!-- Uganda(UG): 4 digits (standard system default, not country specific) -->
-    <shortcode country="ug" pattern="\\d{4}" free="8000|8009" />
+    <shortcode country="ug" pattern="\\d{4}" free="8009" />
 
     <!-- USA: 5-6 digits (premium codes from https://www.premiumsmsrefunds.com/ShortCodes.htm),
          visual voicemail code for T-Mobile: 122 -->
@@ -349,7 +367,7 @@
     <shortcode country="ve" pattern="\\d{1,6}" free="538352" />
 
     <!-- Vietnam: 1-6 digits (standard system default, not country specific) -->
-    <shortcode country="vn" pattern="\\d{1,6}" free="5001|9055|8079|90002|118989" />
+    <shortcode country="vn" pattern="\\d{1,6}" free="5001|9055|90002|118989|46645" />
 
     <!-- Mayotte (French Territory): 1-5 digits (not confirmed) -->
     <shortcode country="yt" pattern="\\d{1,5}" free="38600,36300,36303,959" />
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 3bbb951..1b6746c 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -313,6 +313,7 @@
         "res/xml/power_profile_test_modem.xml",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
 
 test_module_config {
diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
index 37ef6cb..939bf2e 100644
--- a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
@@ -207,7 +207,8 @@
         final ComponentInfo info = new ComponentInfo();
         info.applicationInfo = new ApplicationInfo();
         info.applicationInfo.uid = uid;
-        return new RegisteredServicesCache.ServiceInfo<>(type, info, null);
+        return new RegisteredServicesCache.ServiceInfo<>(type, info, null /* componentName */,
+                0 /* lastUpdateTime */);
     }
 
     private void assertNotEmptyFileCreated(TestServicesCache cache, int userId) {
@@ -301,7 +302,7 @@
 
         @Override
         protected ServiceInfo<TestServiceType> parseServiceInfo(
-                ResolveInfo resolveInfo) throws XmlPullParserException, IOException {
+                ResolveInfo resolveInfo, int userId) throws XmlPullParserException, IOException {
             int size = mServices.size();
             for (int i = 0; i < size; i++) {
                 Map<ResolveInfo, ServiceInfo<TestServiceType>> map = mServices.valueAt(i);
diff --git a/core/tests/coretests/src/android/security/advancedprotection/OWNERS b/core/tests/coretests/src/android/security/advancedprotection/OWNERS
new file mode 100644
index 0000000..9bf5e58
--- /dev/null
+++ b/core/tests/coretests/src/android/security/advancedprotection/OWNERS
@@ -0,0 +1 @@
+file:platform/frameworks/base:main:/core/java/android/security/advancedprotection/OWNERS
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
index 5613caf..d26bb35 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
@@ -120,7 +120,9 @@
         List<Part> parts = NotificationProgressBar.processAndConvertToDrawableParts(
                 segments, points, progress, progressMax, isStyledByProgress);
 
-        int fadedRed = 0x7FFF0000;
+        // Colors with 40% opacity
+        int fadedRed = 0x66FF0000;
+
         List<Part> expected = new ArrayList<>(List.of(new Segment(1f, fadedRed, true)));
 
         assertThat(parts).isEqualTo(expected);
@@ -199,8 +201,8 @@
         List<Part> parts = NotificationProgressBar.processAndConvertToDrawableParts(
                 segments, points, progress, progressMax, isStyledByProgress);
 
-        // Colors with 50% opacity
-        int fadedGreen = 0x7F00FF00;
+        // Colors with 40% opacity
+        int fadedGreen = 0x6600FF00;
 
         List<Part> expected = new ArrayList<>(List.of(
                 new Segment(0.50f, Color.RED),
@@ -223,9 +225,9 @@
         int progressMax = 100;
         boolean isStyledByProgress = true;
 
-        // Colors with 50% opacity
-        int fadedBlue = 0x7F0000FF;
-        int fadedYellow = 0x7FFFFF00;
+        // Colors with 40% opacity
+        int fadedBlue = 0x660000FF;
+        int fadedYellow = 0x66FFFF00;
 
         List<Part> expected = new ArrayList<>(List.of(
                 new Segment(0.15f, Color.BLUE),
@@ -261,9 +263,9 @@
         List<Part> parts = NotificationProgressBar.processAndConvertToDrawableParts(
                 segments, points, progress, progressMax, isStyledByProgress);
 
-        // Colors with 50% opacity
-        int fadedGreen = 0x7F00FF00;
-        int fadedYellow = 0x7FFFFF00;
+        // Colors with 40% opacity
+        int fadedGreen = 0x6600FF00;
+        int fadedYellow = 0x66FFFF00;
 
         List<Part> expected = new ArrayList<>(List.of(
                 new Segment(0.15f, Color.RED),
diff --git a/core/tests/systemproperties/Android.bp b/core/tests/systemproperties/Android.bp
index ed99a1f..9197dec 100644
--- a/core/tests/systemproperties/Android.bp
+++ b/core/tests/systemproperties/Android.bp
@@ -44,4 +44,5 @@
         "src/**/*.java",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp
index 7cf49ab..5011f7a 100644
--- a/core/tests/utiltests/Android.bp
+++ b/core/tests/utiltests/Android.bp
@@ -69,4 +69,5 @@
         "src/com/android/internal/util/**/*.java",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
diff --git a/core/tests/utiltests/src/android/util/AtomicFileBufferedOutputStreamTest.java b/core/tests/utiltests/src/android/util/AtomicFileBufferedOutputStreamTest.java
new file mode 100644
index 0000000..81eac6d
--- /dev/null
+++ b/core/tests/utiltests/src/android/util/AtomicFileBufferedOutputStreamTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+
+@RunWith(AndroidJUnit4.class)
+public class AtomicFileBufferedOutputStreamTest {
+    private static final String BASE_NAME = "base";
+    private File mBaseFile;
+
+    @Before
+    public void setUp() throws Exception {
+        File mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+        mBaseFile = new File(mDirectory, BASE_NAME);
+    }
+
+    @After
+    public void deleteFiles() {
+        mBaseFile.delete();
+    }
+
+    @Test
+    public void testAtomicFileBufferedWrite() {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var oStream = new AtomicFileBufferedOutputStream(atomicFile)) {
+            oStream.write(0);
+            oStream.write(new byte[]{1, 2});
+            oStream.write(new byte[]{1, 2, 3}, /*off=*/ 2, /*len=*/ 1);
+            oStream.markSuccess();
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            assertThat(atomicFile.readFully()).isEqualTo(new byte[]{0, 1, 2, 3});
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Test(expected = FileNotFoundException.class)
+    public void testAtomicFileBufferedNotFinishedWriting() throws FileNotFoundException {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var oStream = new AtomicFileBufferedOutputStream(atomicFile)) {
+            oStream.write(0);
+            oStream.write(new byte[]{1, 2});
+            oStream.write(new byte[]{1, 2, 3}, /*off=*/ 2, /*len=*/ 1);
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            // openRead should throw FileNotFoundException.
+            // close should never be called, but added here just in case openRead never throws.
+            atomicFile.openRead().close();
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/core/tests/utiltests/src/android/util/AtomicFileBufferedPrintWriterTest.java b/core/tests/utiltests/src/android/util/AtomicFileBufferedPrintWriterTest.java
new file mode 100644
index 0000000..73d1443
--- /dev/null
+++ b/core/tests/utiltests/src/android/util/AtomicFileBufferedPrintWriterTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+@RunWith(AndroidJUnit4.class)
+public class AtomicFileBufferedPrintWriterTest {
+    private static final String BASE_NAME = "base";
+    private static final String HELLO_WORLD_STRING = "你好世界! ";
+    private File mBaseFile;
+
+    @Before
+    public void setUp() throws Exception {
+        File mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+        mBaseFile = new File(mDirectory, BASE_NAME);
+    }
+
+    @After
+    public void deleteFiles() {
+        mBaseFile.delete();
+    }
+
+    @Test
+    public void testAtomicFileBufferedWrite() {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var pw = new AtomicFileBufferedPrintWriter(atomicFile, StandardCharsets.UTF_8)) {
+            pw.write(HELLO_WORLD_STRING);
+            pw.write(HELLO_WORLD_STRING, /*off=*/ 0, /*len=*/ HELLO_WORLD_STRING.length() - 1);
+            pw.markSuccess();
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            assertThat(new String(atomicFile.readFully(), StandardCharsets.UTF_8))
+                    .isEqualTo("你好世界! 你好世界!");
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test(expected = FileNotFoundException.class)
+    public void testAtomicFileBufferedWriteNotFinished() throws FileNotFoundException {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var pw = new AtomicFileBufferedPrintWriter(atomicFile, StandardCharsets.UTF_8)) {
+            pw.write(HELLO_WORLD_STRING);
+            pw.write(HELLO_WORLD_STRING, /*off=*/ 0, /*len=*/ HELLO_WORLD_STRING.length() - 1);
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            // openRead should throw FileNotFoundException.
+            // close should never be called, but added here just in case openRead never throws.
+            atomicFile.openRead().close();
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/core/tests/utiltests/src/android/util/AtomicFileOutputStreamTest.java b/core/tests/utiltests/src/android/util/AtomicFileOutputStreamTest.java
new file mode 100644
index 0000000..5823168
--- /dev/null
+++ b/core/tests/utiltests/src/android/util/AtomicFileOutputStreamTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+
+@RunWith(AndroidJUnit4.class)
+public class AtomicFileOutputStreamTest {
+    private static final String BASE_NAME = "base";
+    private File mBaseFile;
+
+    @Before
+    public void setUp() throws Exception {
+        File mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+        mBaseFile = new File(mDirectory, BASE_NAME);
+    }
+
+    @After
+    public void deleteFiles() {
+        mBaseFile.delete();
+    }
+
+    @Test
+    public void testAtomicFileWritten() {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var oStream = new AtomicFileOutputStream(atomicFile)) {
+            oStream.write(0);
+            oStream.write(new byte[]{1, 2});
+            oStream.write(new byte[]{1, 2, 3}, /*off=*/ 2, /*len=*/ 1);
+            oStream.markSuccess();
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            assertThat(atomicFile.readFully()).isEqualTo(new byte[]{0, 1, 2, 3});
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    @Test(expected = FileNotFoundException.class)
+    public void testAtomicFileNotFinishedWriting() throws FileNotFoundException {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var oStream = new AtomicFileOutputStream(atomicFile)) {
+            oStream.write(0);
+            oStream.write(new byte[]{1, 2});
+            oStream.write(new byte[]{1, 2, 3}, /*off=*/ 2, /*len=*/ 1);
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            // openRead should throw FileNotFoundException.
+            // close should never be called, but added here just in case openRead never throws.
+            atomicFile.openRead().close();
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/core/tests/utiltests/src/android/util/AtomicFilePrintWriterTest.java b/core/tests/utiltests/src/android/util/AtomicFilePrintWriterTest.java
new file mode 100644
index 0000000..467046e
--- /dev/null
+++ b/core/tests/utiltests/src/android/util/AtomicFilePrintWriterTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2024 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 android.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+@RunWith(AndroidJUnit4.class)
+public class AtomicFilePrintWriterTest {
+    private static final String BASE_NAME = "base";
+    private static final String HELLO_WORLD_STRING = "你好世界! ";
+    private File mBaseFile;
+
+    @Before
+    public void setUp() throws Exception {
+        File mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+        mBaseFile = new File(mDirectory, BASE_NAME);
+    }
+
+    @After
+    public void deleteFiles() {
+        mBaseFile.delete();
+    }
+
+    @Test
+    public void testAtomicFileWrite() {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var pw = new AtomicFilePrintWriter(atomicFile, StandardCharsets.UTF_8)) {
+            pw.write(HELLO_WORLD_STRING);
+            pw.write(HELLO_WORLD_STRING, /*off=*/ 0, /*len=*/ HELLO_WORLD_STRING.length() - 1);
+            pw.markSuccess();
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            assertThat(new String(atomicFile.readFully(), StandardCharsets.UTF_8))
+                    .isEqualTo("你好世界! 你好世界!");
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test(expected = FileNotFoundException.class)
+    public void testAtomicFileWriteNotFinished() throws FileNotFoundException {
+        AtomicFile atomicFile = new AtomicFile(mBaseFile);
+        try (var pw = new AtomicFilePrintWriter(atomicFile, StandardCharsets.UTF_8)) {
+            pw.write(HELLO_WORLD_STRING);
+            pw.write(HELLO_WORLD_STRING, /*off=*/ 0, /*len=*/ HELLO_WORLD_STRING.length() - 1);
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+
+        try {
+            // openRead should throw FileNotFoundException.
+            // close should never be called, but added here just in case openRead never throws.
+            atomicFile.openRead().close();
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/multivalentTests/Android.bp b/libs/WindowManager/Shell/multivalentTests/Android.bp
index eecf199..03076c0 100644
--- a/libs/WindowManager/Shell/multivalentTests/Android.bp
+++ b/libs/WindowManager/Shell/multivalentTests/Android.bp
@@ -35,7 +35,6 @@
 android_robolectric_test {
     name: "WMShellRobolectricTests",
     instrumentation_for: "WindowManagerShellRobolectric",
-    upstream: true,
     java_resource_dirs: [
         "robolectric/config",
     ],
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
index 4300e84..2ca011b 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
@@ -16,10 +16,12 @@
 
 package com.android.wm.shell.shared;
 
+import static android.app.WindowConfiguration.windowingModeToString;
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+
 import android.annotation.IntDef;
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.TaskInfo;
-import android.app.WindowConfiguration;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -28,11 +30,14 @@
 
 import com.android.wm.shell.shared.split.SplitBounds;
 
+import kotlin.collections.CollectionsKt;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Simple container for recent tasks which should be presented as a single task within the
@@ -43,11 +48,13 @@
     public static final int TYPE_FULLSCREEN = 1;
     public static final int TYPE_SPLIT = 2;
     public static final int TYPE_FREEFORM = 3;
+    public static final int TYPE_MIXED = 4;
 
     @IntDef(prefix = {"TYPE_"}, value = {
             TYPE_FULLSCREEN,
             TYPE_SPLIT,
-            TYPE_FREEFORM
+            TYPE_FREEFORM,
+            TYPE_MIXED
     })
     public @interface GroupType {}
 
@@ -64,7 +71,7 @@
      * TYPE_SPLIT: Contains the two split roots of each side
      * TYPE_FREEFORM: Contains the set of tasks currently in freeform mode
      */
-    @NonNull
+    @Nullable
     protected final List<TaskInfo> mTasks;
 
     /**
@@ -85,6 +92,14 @@
     protected final int[] mMinimizedTaskIds;
 
     /**
+     * Only set for TYPE_MIXED.
+     *
+     * The mixed set of task infos in this group.
+     */
+    @Nullable
+    protected final List<GroupedTaskInfo> mGroupedTasks;
+
+    /**
      * Create new for a stack of fullscreen tasks
      */
     public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) {
@@ -111,18 +126,41 @@
                 minimizedFreeformTasks.stream().mapToInt(i -> i).toArray());
     }
 
+    /**
+     * Create new for a group of grouped task infos, those grouped task infos may not be mixed
+     * themselves (ie. multiple depths of mixed grouped task infos are not allowed).
+     */
+    public static GroupedTaskInfo forMixed(@NonNull List<GroupedTaskInfo> groupedTasks) {
+        if (groupedTasks.isEmpty()) {
+            throw new IllegalArgumentException("Expected non-empty grouped task list");
+        }
+        if (groupedTasks.stream().anyMatch(task -> task.mType == TYPE_MIXED)) {
+            throw new IllegalArgumentException("Unexpected grouped task list");
+        }
+        return new GroupedTaskInfo(groupedTasks);
+    }
+
     private GroupedTaskInfo(
             @NonNull List<TaskInfo> tasks,
             @Nullable SplitBounds splitBounds,
             @GroupType int type,
             @Nullable int[] minimizedFreeformTaskIds) {
         mTasks = tasks;
+        mGroupedTasks = null;
         mSplitBounds = splitBounds;
         mType = type;
         mMinimizedTaskIds = minimizedFreeformTaskIds;
         ensureAllMinimizedIdsPresent(tasks, minimizedFreeformTaskIds);
     }
 
+    private GroupedTaskInfo(@NonNull List<GroupedTaskInfo> groupedTasks) {
+        mTasks = null;
+        mGroupedTasks = groupedTasks;
+        mSplitBounds = null;
+        mType = TYPE_MIXED;
+        mMinimizedTaskIds = null;
+    }
+
     private void ensureAllMinimizedIdsPresent(
             @NonNull List<TaskInfo> tasks,
             @Nullable int[] minimizedFreeformTaskIds) {
@@ -141,26 +179,47 @@
         for (int i = 0; i < numTasks; i++) {
             mTasks.add(new TaskInfo(parcel));
         }
+        mGroupedTasks = parcel.createTypedArrayList(GroupedTaskInfo.CREATOR);
         mSplitBounds = parcel.readTypedObject(SplitBounds.CREATOR);
         mType = parcel.readInt();
         mMinimizedTaskIds = parcel.createIntArray();
     }
 
     /**
-     * Get primary {@link RecentTaskInfo}
+     * If TYPE_MIXED, returns the root of the grouped tasks
+     * For all other types, returns this task itself
+     */
+    @NonNull
+    public GroupedTaskInfo getBaseGroupedTask() {
+        if (mType == TYPE_MIXED) {
+            return mGroupedTasks.getFirst();
+        }
+        return this;
+    }
+
+    /**
+     * Get primary {@link TaskInfo}.
+     *
+     * @throws IllegalStateException if the group is TYPE_MIXED.
      */
     @NonNull
     public TaskInfo getTaskInfo1() {
+        if (mType == TYPE_MIXED) {
+            throw new IllegalStateException("No indexed tasks for a mixed task");
+        }
         return mTasks.getFirst();
     }
 
     /**
-     * Get secondary {@link RecentTaskInfo}.
+     * Get secondary {@link TaskInfo}, used primarily for TYPE_SPLIT.
      *
-     * Used in split screen.
+     * @throws IllegalStateException if the group is TYPE_MIXED.
      */
     @Nullable
     public TaskInfo getTaskInfo2() {
+        if (mType == TYPE_MIXED) {
+            throw new IllegalStateException("No indexed tasks for a mixed task");
+        }
         if (mTasks.size() > 1) {
             return mTasks.get(1);
         }
@@ -172,9 +231,7 @@
      */
     @Nullable
     public TaskInfo getTaskById(int taskId) {
-        return mTasks.stream()
-                .filter(task -> task.taskId == taskId)
-                .findFirst().orElse(null);
+        return CollectionsKt.firstOrNull(getTaskInfoList(), taskInfo -> taskInfo.taskId == taskId);
     }
 
     /**
@@ -182,35 +239,59 @@
      */
     @NonNull
     public List<TaskInfo> getTaskInfoList() {
-        return mTasks;
+        if (mType == TYPE_MIXED) {
+            return CollectionsKt.flatMap(mGroupedTasks, groupedTaskInfo -> groupedTaskInfo.mTasks);
+        } else {
+            return mTasks;
+        }
     }
 
     /**
      * @return Whether this grouped task contains a task with the given {@code taskId}.
      */
     public boolean containsTask(int taskId) {
-        return mTasks.stream()
-                .anyMatch((task -> task.taskId == taskId));
+        return getTaskById(taskId) != null;
     }
 
     /**
-     * Return {@link SplitBounds} if this is a split screen entry or {@code null}
+     * Returns whether the group is of the given type, if this is a TYPE_MIXED group, then returns
+     * whether the root task info is of the given type.
+     */
+    public boolean isBaseType(@GroupType int type) {
+        return getBaseGroupedTask().mType == type;
+    }
+
+    /**
+     * Return {@link SplitBounds} if this is a split screen entry or {@code null}. Only valid for
+     * TYPE_SPLIT.
      */
     @Nullable
     public SplitBounds getSplitBounds() {
+        if (mType == TYPE_MIXED) {
+            throw new IllegalStateException("No split bounds for a mixed task");
+        }
         return mSplitBounds;
     }
 
     /**
-     * Get type of this recents entry. One of {@link GroupType}
+     * Get type of this recents entry. One of {@link GroupType}.
+     * Note: This is deprecated, callers should use `isBaseType()` and not make assumptions about
+     *       specific group types
      */
+    @Deprecated
     @GroupType
     public int getType() {
         return mType;
     }
 
+    /**
+     * Returns the set of minimized task ids, only valid for TYPE_FREEFORM.
+     */
     @Nullable
     public int[] getMinimizedTaskIds() {
+        if (mType == TYPE_MIXED) {
+            throw new IllegalStateException("No minimized task ids for a mixed task");
+        }
         return mMinimizedTaskIds;
     }
 
@@ -222,67 +303,64 @@
         GroupedTaskInfo other = (GroupedTaskInfo) obj;
         return mType == other.mType
                 && Objects.equals(mTasks, other.mTasks)
+                && Objects.equals(mGroupedTasks, other.mGroupedTasks)
                 && Objects.equals(mSplitBounds, other.mSplitBounds)
                 && Arrays.equals(mMinimizedTaskIds, other.mMinimizedTaskIds);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mType, mTasks, mSplitBounds, Arrays.hashCode(mMinimizedTaskIds));
+        return Objects.hash(mType, mTasks, mGroupedTasks, mSplitBounds,
+                Arrays.hashCode(mMinimizedTaskIds));
     }
 
     @Override
     public String toString() {
         StringBuilder taskString = new StringBuilder();
-        for (int i = 0; i < mTasks.size(); i++) {
-            if (i == 0) {
-                taskString.append("Task");
-            } else {
-                taskString.append(", Task");
+        if (mType == TYPE_MIXED) {
+            taskString.append("GroupedTasks=" + mGroupedTasks.stream()
+                    .map(GroupedTaskInfo::toString)
+                    .collect(Collectors.joining(",\n\t", "[\n\t", "\n]")));
+        } else {
+            taskString.append("Tasks=" + mTasks.stream()
+                    .map(taskInfo -> getTaskInfoDumpString(taskInfo))
+                    .collect(Collectors.joining(", ", "[", "]")));
+            if (mSplitBounds != null) {
+                taskString.append(", SplitBounds=").append(mSplitBounds);
             }
-            taskString.append(i + 1).append(": ").append(getTaskInfo(mTasks.get(i)));
+            taskString.append(", Type=" + typeToString(mType));
+            taskString.append(", Minimized Task IDs=" + Arrays.toString(mMinimizedTaskIds));
         }
-        if (mSplitBounds != null) {
-            taskString.append(", SplitBounds: ").append(mSplitBounds);
-        }
-        taskString.append(", Type=");
-        switch (mType) {
-            case TYPE_FULLSCREEN:
-                taskString.append("TYPE_FULLSCREEN");
-                break;
-            case TYPE_SPLIT:
-                taskString.append("TYPE_SPLIT");
-                break;
-            case TYPE_FREEFORM:
-                taskString.append("TYPE_FREEFORM");
-                break;
-        }
-        taskString.append(", Minimized Task IDs: ");
-        taskString.append(Arrays.toString(mMinimizedTaskIds));
         return taskString.toString();
     }
 
-    private String getTaskInfo(TaskInfo taskInfo) {
+    private String getTaskInfoDumpString(TaskInfo taskInfo) {
         if (taskInfo == null) {
             return null;
         }
+        final boolean isExcluded = (taskInfo.baseIntent.getFlags()
+                & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0;
         return "id=" + taskInfo.taskId
-                + " baseIntent=" +
-                        (taskInfo.baseIntent != null && taskInfo.baseIntent.getComponent() != null
-                                ? taskInfo.baseIntent.getComponent().flattenToString()
-                                : "null")
-                + " winMode=" + WindowConfiguration.windowingModeToString(
-                        taskInfo.getWindowingMode());
+                + " winMode=" + windowingModeToString(taskInfo.getWindowingMode())
+                + " visReq=" + taskInfo.isVisibleRequested
+                + " vis=" + taskInfo.isVisible
+                + " excluded=" + isExcluded
+                + " baseIntent="
+                + (taskInfo.baseIntent != null && taskInfo.baseIntent.getComponent() != null
+                        ? taskInfo.baseIntent.getComponent().flattenToShortString()
+                        : "null");
     }
 
     @Override
     public void writeToParcel(Parcel parcel, int flags) {
         // We don't use the parcel list methods because we want to only write the TaskInfo state
         // and not the subclasses (Recents/RunningTaskInfo) whose fields are all deprecated
-        parcel.writeInt(mTasks.size());
-        for (int i = 0; i < mTasks.size(); i++) {
+        final int tasksSize = mTasks != null ? mTasks.size() : 0;
+        parcel.writeInt(tasksSize);
+        for (int i = 0; i < tasksSize; i++) {
             mTasks.get(i).writeTaskToParcel(parcel, flags);
         }
+        parcel.writeTypedList(mGroupedTasks);
         parcel.writeTypedObject(mSplitBounds, flags);
         parcel.writeInt(mType);
         parcel.writeIntArray(mMinimizedTaskIds);
@@ -293,6 +371,16 @@
         return 0;
     }
 
+    private String typeToString(@GroupType int type) {
+        return switch (type) {
+            case TYPE_FULLSCREEN -> "FULLSCREEN";
+            case TYPE_SPLIT -> "SPLIT";
+            case TYPE_FREEFORM -> "FREEFORM";
+            case TYPE_MIXED -> "MIXED";
+            default -> "UNKNOWN";
+        };
+    }
+
     public static final Creator<GroupedTaskInfo> CREATOR = new Creator() {
         @Override
         public GroupedTaskInfo createFromParcel(Parcel in) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
index 06a55d3..08079d9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt
@@ -19,7 +19,6 @@
 package com.android.wm.shell.apptoweb
 
 import android.app.assist.AssistContent
-import android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI
 import android.content.Context
 import android.content.Intent
 import android.content.Intent.ACTION_VIEW
@@ -113,5 +112,5 @@
  * Returns the web uri from the given [AssistContent].
  */
 fun AssistContent.getSessionWebUri(): Uri? {
-    return extras.getParcelable(EXTRA_SESSION_TRANSFER_WEB_URI) ?: webUri
+    return sessionTransferUri ?: webUri
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
index 536dc2a..a4620d5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt
@@ -339,7 +339,7 @@
                         .setWindowCrop(leash, endBounds.width(), endBounds.height())
                         .apply()
                     onTaskResizeAnimationListener?.onAnimationEnd(taskId)
-                    finishCallback.onTransitionFinished(null /* wct */)
+                    finishCallback.onTransitionFinished(/* wct= */ null)
                 }
             )
             addUpdateListener { animation ->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
index ceef699..e8f9a78 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt
@@ -306,7 +306,7 @@
     fun logTaskInfoStateInit() {
         logTaskUpdate(
             FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INIT_STATSD,
-            /* session_id */ 0,
+            sessionId = 0,
             TaskUpdate(
                 visibleTaskCount = 0,
                 instanceId = 0,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
index cd37113..32ee319 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
@@ -274,7 +274,7 @@
         lp.inputFeatures |= INPUT_FEATURE_NO_INPUT_CHANNEL;
         final WindowlessWindowManager windowManager = new WindowlessWindowManager(
                 mTaskInfo.configuration, mLeash,
-                null /* hostInputToken */);
+                /* hostInputToken= */ null);
         mViewHost = new SurfaceControlViewHost(mContext,
                 mDisplayController.getDisplay(mTaskInfo.displayId), windowManager,
                 "DesktopModeVisualIndicator");
@@ -338,7 +338,7 @@
         if (mCurrentType == NO_INDICATOR) {
             fadeInIndicator(newType);
         } else if (newType == NO_INDICATOR) {
-            fadeOutIndicator(null /* finishCallback */);
+            fadeOutIndicator(/* finishCallback= */ null);
         } else {
             final VisualIndicatorAnimator animator = VisualIndicatorAnimator.animateIndicatorType(
                     mView, mDisplayController.getDisplayLayout(mTaskInfo.displayId), mCurrentType,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index d180ea7..ee817b3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -762,7 +762,7 @@
             return
         }
         val wct = WindowContainerTransaction()
-        wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */)
+        wct.reorder(taskInfo.token, /* onTop= */ true, /* includingParents= */ true)
         startLaunchTransition(
             transitionType = TRANSIT_TO_FRONT,
             wct = wct,
@@ -884,7 +884,7 @@
         } else if (Flags.enableMoveToNextDisplayShortcut()) {
             applyFreeformDisplayChange(wct, task, displayId)
         }
-        wct.reparent(task.token, displayAreaInfo.token, true /* onTop */)
+        wct.reparent(task.token, displayAreaInfo.token, /* onTop= */ true)
         if (Flags.enableDisplayFocusInShellTransitions()) {
             // Bring the destination display to top with includingParents=true, so that the
             // destination display gains the display focus, which makes the top task in the display
@@ -896,7 +896,7 @@
             performDesktopExitCleanupIfNeeded(task.taskId, task.displayId, wct)
         }
 
-        transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */)
+        transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ null)
     }
 
     /**
@@ -1672,7 +1672,7 @@
                 requestedTaskId,
                 splitPosition,
                 options.toBundle(),
-                null, /* hideTaskToken */
+                /* hideTaskToken= */ null,
             )
         }
     }
@@ -1709,8 +1709,8 @@
                     fillIn,
                     splitPosition,
                     options.toBundle(),
-                    null /* hideTaskToken */,
-                    true /* forceLaunchNewTask */,
+                    /* hideTaskToken= */ null,
+                    /* forceLaunchNewTask= */ true,
                     splitIndex,
                 )
             }
@@ -1961,7 +1961,7 @@
             wct.setBounds(taskInfo.token, initialBounds)
         }
         wct.setWindowingMode(taskInfo.token, targetWindowingMode)
-        wct.reorder(taskInfo.token, true /* onTop */)
+        wct.reorder(taskInfo.token, /* onTop= */ true)
         if (useDesktopOverrideDensity()) {
             wct.setDensityDpi(taskInfo.token, DESKTOP_DENSITY_OVERRIDE)
         }
@@ -2796,7 +2796,7 @@
                 controller,
                 "visibleTaskCount",
                 { controller -> result[0] = controller.visibleTaskCount(displayId) },
-                true, /* blocking */
+                /* blocking= */ true,
             )
             return result[0]
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
index 0330a5f..c2dd4d28 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
@@ -234,7 +234,7 @@
         // If it's a running task, reorder it to back.
         taskIdToMinimize
             ?.let { shellTaskOrganizer.getRunningTaskInfo(it) }
-            ?.let { wct.reorder(it.token, false /* onTop */) }
+            ?.let { wct.reorder(it.token, /* onTop= */ false) }
         return taskIdToMinimize
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
index 72c0642..1380a9c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
@@ -131,7 +131,7 @@
         val pendingIntent =
             PendingIntent.getActivityAsUser(
                 context.createContextAsUser(taskUser, /* flags= */ 0),
-                0 /* requestCode */,
+                /* requestCode= */ 0,
                 launchHomeIntent,
                 FLAG_MUTABLE or FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT or FILL_IN_COMPONENT,
                 options.toBundle(),
@@ -234,7 +234,7 @@
             val wct = WindowContainerTransaction()
             restoreWindowOrder(wct, state)
             state.startTransitionFinishTransaction?.apply()
-            state.startTransitionFinishCb?.onTransitionFinished(null /* wct */)
+            state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
             requestSplitFromScaledTask(splitPosition, wct)
             clearState()
         } else {
@@ -440,7 +440,7 @@
             val wct = WindowContainerTransaction()
             restoreWindowOrder(wct)
             state.startTransitionFinishTransaction?.apply()
-            state.startTransitionFinishCb?.onTransitionFinished(null /* wct */)
+            state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
             requestSplitSelect(wct, taskInfo, splitPosition)
         }
         return true
@@ -492,7 +492,7 @@
                 finishTransaction = startTransactionFinishT,
             )
             // Call finishCallback to merge animation before startTransitionFinishCb is called
-            finishCallback.onTransitionFinished(null /* wct */)
+            finishCallback.onTransitionFinished(/* wct= */ null)
             animateEndDragToDesktop(startTransaction = t, startTransitionFinishCb)
         } else if (isCancelTransition) {
             info.changes.forEach { change ->
@@ -500,8 +500,8 @@
                 startTransactionFinishT.show(change.leash)
             }
             t.apply()
-            finishCallback.onTransitionFinished(null /* wct */)
-            startTransitionFinishCb.onTransitionFinished(null /* wct */)
+            finishCallback.onTransitionFinished(/* wct= */ null)
+            startTransitionFinishCb.onTransitionFinished(/* wct= */ null)
             clearState()
         }
     }
@@ -653,7 +653,7 @@
             interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD)
         } else if (state.cancelTransitionToken == transition) {
             state.draggedTaskChange?.leash?.let { state.startTransitionFinishTransaction?.show(it) }
-            state.startTransitionFinishCb?.onTransitionFinished(null /* wct */)
+            state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
             clearState()
         } else {
             // This transition being aborted is neither the start, nor the cancel transition, so
@@ -741,19 +741,19 @@
                         // TODO(b/322852244): investigate why even though these "other" tasks are
                         //  reordered in front of home and behind the translucent dragged task, its
                         //  surface is not visible on screen.
-                        wct.reorder(wc, true /* toTop */)
+                        wct.reorder(wc, /* onTop= */ true)
                     }
                 val wc =
                     state.draggedTaskChange?.container
                         ?: error("Dragged task should be non-null before cancelling")
                 // Then the dragged task a the very top.
-                wct.reorder(wc, true /* toTop */)
+                wct.reorder(wc, /* onTop= */ true)
             }
             is TransitionState.FromSplit -> {
                 val wc =
                     state.splitRootChange?.container
                         ?: error("Split root should be non-null before cancelling")
-                wct.reorder(wc, true /* toTop */)
+                wct.reorder(wc, /* onTop= */ true)
             }
         }
         val homeWc =
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl
index 964e5fd..af1679f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationController.aidl
@@ -36,12 +36,6 @@
 interface IRecentsAnimationController {
 
     /**
-     * Takes a screenshot of the task associated with the given {@param taskId}. Only valid for the
-     * current set of task ids provided to the handler.
-     */
-    TaskSnapshot screenshotTask(int taskId);
-
-    /**
      * Sets the final surface transaction on a Task. This is used by Launcher to notify the system
      * that animating Activity to PiP has completed and the associated task surface should be
      * updated accordingly. This should be called before `finish`
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
index 032dac9..76496b0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
@@ -1227,19 +1227,6 @@
         }
 
         @Override
-        public TaskSnapshot screenshotTask(int taskId) {
-            try {
-                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
-                        "[%d] RecentsController.screenshotTask: taskId=%d", mInstanceId, taskId);
-                return ActivityTaskManager.getService().takeTaskSnapshot(taskId,
-                        true /* updateCache */);
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to screenshot task", e);
-            }
-            return null;
-        }
-
-        @Override
         public void setInputConsumerEnabled(boolean enabled) {
             mExecutor.execute(() -> {
                 if (mFinishCB == null || !enabled) {
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
index c760cf1..b8ec1d7 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
@@ -122,6 +122,8 @@
         "com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaExpandButtonTest",
         "com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaIntentTest",
         "com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfSetRequestedOrientationWhilePinned",
+        "com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest",
+        "com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest",
     ],
     test_suites: ["device-tests"],
 }
@@ -324,5 +326,19 @@
     test_suites: ["device-tests"],
 }
 
+test_module_config {
+    name: "WMShellFlickerTestsPip-BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest",
+    base: "WMShellFlickerTestsPip",
+    include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest"],
+    test_suites: ["device-tests"],
+}
+
+test_module_config {
+    name: "WMShellFlickerTestsPip-BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest",
+    base: "WMShellFlickerTestsPip",
+    include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest"],
+    test_suites: ["device-tests"],
+}
+
 // End breakdowns for WMShellFlickerTestsPip module
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
index 84d53d5..597674e 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipOnGoToHomeTest.kt
@@ -114,7 +114,7 @@
     /** Checks that [pipApp] window is animated towards default position in right bottom corner */
     @FlakyTest(bugId = 255578530)
     @Test
-    fun pipLayerMovesTowardsRightBottomCorner() {
+    open fun pipLayerMovesTowardsRightBottomCorner() {
         // in gestural nav the swipe makes PiP first go upwards
         Assume.assumeFalse(flicker.scenario.isGesturalNavigation)
         flicker.assertLayers {
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
index 1c40d89..f9c60ad 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenAutoEnterPipOnGoToHomeTest.kt
@@ -65,11 +65,11 @@
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 @RequiresFlagsDisabled(Flags.FLAG_ENABLE_PIP2)
-class FromSplitScreenAutoEnterPipOnGoToHomeTest(flicker: LegacyFlickerTest) :
+open class FromSplitScreenAutoEnterPipOnGoToHomeTest(flicker: LegacyFlickerTest) :
     AutoEnterPipOnGoToHomeTest(flicker) {
     private val portraitDisplayBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
     /** Second app used to enter split screen mode */
-    private val secondAppForSplitScreen =
+    internal val secondAppForSplitScreen =
         SimpleAppHelper(
             instrumentation,
             ActivityOptions.SplitScreen.Primary.LABEL,
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
index 79e2e4e..805f4c2 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/FromSplitScreenEnterPipOnUserLeaveHintTest.kt
@@ -67,12 +67,13 @@
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 @RequiresFlagsDisabled(Flags.FLAG_ENABLE_PIP2)
-class FromSplitScreenEnterPipOnUserLeaveHintTest(flicker: LegacyFlickerTest) :
+@FlakyTest(bugId = 386333280)
+open class FromSplitScreenEnterPipOnUserLeaveHintTest(flicker: LegacyFlickerTest) :
     EnterPipTransition(flicker) {
     override val pipApp: PipAppHelper = PipAppHelper(instrumentation)
     private val portraitDisplayBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
     /** Second app used to enter split screen mode */
-    private val secondAppForSplitScreen =
+    internal val secondAppForSplitScreen =
         SimpleAppHelper(
             instrumentation,
             ActivityOptions.SplitScreen.Primary.LABEL,
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest.kt
new file mode 100644
index 0000000..1311917
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2024 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 com.android.wm.shell.flicker.pip.nonmatchparent
+
+import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.RequiresDevice
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.tools.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.flicker.legacy.FlickerBuilder
+import android.tools.flicker.legacy.LegacyFlickerTest
+import android.tools.traces.parsers.toFlickerComponent
+import com.android.server.wm.flicker.helpers.BottomHalfPipAppHelper
+import com.android.server.wm.flicker.testapp.ActivityOptions
+import com.android.window.flags.Flags
+import com.android.wm.shell.flicker.pip.FromSplitScreenAutoEnterPipOnGoToHomeTest
+import com.android.wm.shell.flicker.utils.SplitScreenUtils
+import org.junit.Assume
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test entering pip from a bottom half layout app via auto-enter property when navigating to home
+ * from split screen.
+ *
+ * To run this test:
+ *     `atest WMShellFlickerTestsPip:BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest`
+ *
+ * Actions:
+ * ```
+ *     Launch an app in full screen
+ *     Open all apps and drag another app icon to enter split screen
+ *     Select "Auto-enter PiP" radio button
+ *     Layout the [pipApp] to the bottom half
+ *     Press Home button or swipe up to go Home and put [pipApp] in pip mode
+ * ```
+ *
+ * Notes:
+ * ```
+ *     1. All assertions are inherited from [EnterPipTest]
+ *     2. Part of the test setup occurs automatically via
+ *        [android.tools.flicker.legacy.runner.TransitionRunner],
+ *        including configuring navigation mode, initial orientation and ensuring no
+ *        apps are running before setup
+ * ```
+ */
+// TODO(b/380796448): re-enable tests after the support of non-match parent PIP animation for PIP2.
+@RequiresFlagsDisabled(com.android.wm.shell.Flags.FLAG_ENABLE_PIP2)
+@RequiresFlagsEnabled(Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY)
+@RequiresDevice
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class BottomHalfFromSplitScreenAutoEnterPipOnGoToHomeTest(flicker: LegacyFlickerTest) :
+    FromSplitScreenAutoEnterPipOnGoToHomeTest(flicker)
+{
+    override val pipApp = BottomHalfPipAppHelper(
+        instrumentation,
+        useLaunchingActivity = true,
+        // Set the activity to fill task to enable auto enter pip via the radio option.
+        fillTaskOnCreate = true
+    )
+
+    /** Defines the transition used to run the test */
+    override val transition: FlickerBuilder.() -> Unit
+        get() = {
+            setup {
+                secondAppForSplitScreen.launchViaIntent(wmHelper)
+                pipApp.launchViaIntent(wmHelper)
+                tapl.goHome()
+                SplitScreenUtils.enterSplit(
+                    wmHelper,
+                    tapl,
+                    device,
+                    pipApp,
+                    secondAppForSplitScreen,
+                    flicker.scenario.startRotation
+                )
+                pipApp.enableAutoEnterForPipActivity()
+                // Set BottomHalfPipActivity to bottom half layout to continue the test.
+                pipApp.toggleBottomHalfLayout()
+                wmHelper.StateSyncBuilder()
+                    .withLayerVisible(
+                        ActivityOptions.BottomHalfPip.LAUNCHING_APP_COMPONENT.toFlickerComponent()
+                    ).waitForAndVerify()
+            }
+            teardown {
+                pipApp.exit(wmHelper)
+                secondAppForSplitScreen.exit(wmHelper)
+            }
+            transitions { tapl.goHome() }
+        }
+
+    @Presubmit
+    @Test
+    override fun pipLayerMovesTowardsRightBottomCorner() {
+        // For bottom half layout in split secondary, the start position may be lower than the final
+        // pip task position.
+    }
+
+    /**
+     * Verifies the left edge of the pip layer moves to the right continuously.
+     */
+    @Presubmit
+    @Test
+    fun pipLayerMovesTowardsRight() {
+        // in gestural nav the swipe makes PiP first go upwards
+        Assume.assumeFalse(flicker.scenario.isGesturalNavigation)
+        flicker.assertLayers {
+            val pipLayerList = this.layers { pipApp.layerMatchesAnyOf(it) && it.isVisible }
+            pipLayerList.zipWithNext { previous, current ->
+                current.visibleRegion.isLeftEdgeToTheRight(previous.visibleRegion.region)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest.kt
new file mode 100644
index 0000000..2e34b6a
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2024 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 com.android.wm.shell.flicker.pip.nonmatchparent
+
+import android.platform.test.annotations.RequiresDevice
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.tools.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.flicker.legacy.FlickerBuilder
+import android.tools.flicker.legacy.LegacyFlickerTest
+import android.tools.traces.parsers.toFlickerComponent
+import com.android.server.wm.flicker.helpers.BottomHalfPipAppHelper
+import com.android.server.wm.flicker.testapp.ActivityOptions
+import com.android.window.flags.Flags
+import com.android.wm.shell.flicker.pip.FromSplitScreenEnterPipOnUserLeaveHintTest
+import com.android.wm.shell.flicker.utils.SplitScreenUtils
+import org.junit.FixMethodOrder
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test entering pip from a bottom half layout app via enter-pip-on-user-leave property when
+ * navigating to home from split screen.
+ *
+ * To run this test:
+ *     `atest WMShellFlickerTestsPip:BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest`
+ *
+ * Actions:
+ * ```
+ *     Launch an app in full screen
+ *     Open all apps and drag another app icon to enter split screen
+ *     Select "Enter PiP on user leave" radio button
+ *     Layout the [pipApp] to the bottom half
+ *     Press Home button or swipe up to go Home and put [pipApp] in pip mode
+ * ```
+ *
+ * Notes:
+ * ```
+ *     1. All assertions are inherited from [EnterPipTest]
+ *     2. Part of the test setup occurs automatically via
+ *        [android.tools.flicker.legacy.runner.TransitionRunner],
+ *        including configuring navigation mode, initial orientation and ensuring no
+ *        apps are running before setup
+ * ```
+ */
+// TODO(b/380796448): re-enable tests after the support of non-match parent PIP animation for PIP2.
+@RequiresFlagsDisabled(com.android.wm.shell.Flags.FLAG_ENABLE_PIP2)
+@RequiresFlagsEnabled(Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY)
+@RequiresDevice
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class BottomHalfFromSplitScreenEnterPipOnUserLeaveHintTest(flicker: LegacyFlickerTest) :
+    FromSplitScreenEnterPipOnUserLeaveHintTest(flicker)
+{
+    override val pipApp = BottomHalfPipAppHelper(
+        instrumentation,
+        useLaunchingActivity = true,
+        // Set the activity to fill task to enable user leave hint via the radio option.
+        fillTaskOnCreate = true
+    )
+
+    /** Defines the transition used to run the test */
+    override val transition: FlickerBuilder.() -> Unit
+    get() = {
+        setup {
+            secondAppForSplitScreen.launchViaIntent(wmHelper)
+            pipApp.launchViaIntent(wmHelper)
+            tapl.goHome()
+            SplitScreenUtils.enterSplit(
+                wmHelper,
+                tapl,
+                device,
+                pipApp,
+                secondAppForSplitScreen,
+                flicker.scenario.startRotation
+            )
+            pipApp.enableEnterPipOnUserLeaveHint()
+            // Set BottomHalfPipActivity to bottom half layout to continue the test.
+            pipApp.toggleBottomHalfLayout()
+            wmHelper.StateSyncBuilder()
+                .withLayerVisible(
+                    ActivityOptions.BottomHalfPip.LAUNCHING_APP_COMPONENT.toFlickerComponent()
+                ).waitForAndVerify()
+        }
+        teardown {
+            pipApp.exit(wmHelper)
+            secondAppForSplitScreen.exit(wmHelper)
+        }
+        transitions { tapl.goHome() }
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt
index db00f41..04f9ada 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandlerTest.kt
@@ -142,7 +142,7 @@
         changeMode: Int = WindowManager.TRANSIT_CLOSE,
         task: RunningTaskInfo,
     ): TransitionInfo =
-        TransitionInfo(type, 0 /* flags */).apply {
+        TransitionInfo(type, /* flags= */ 0).apply {
             addChange(
                 TransitionInfo.Change(mock(), closingTaskLeash).apply {
                     mode = changeMode
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt
index d14c640..c705f5a 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt
@@ -153,7 +153,7 @@
         changeMode: Int = WindowManager.TRANSIT_TO_BACK,
         task: RunningTaskInfo,
     ): TransitionInfo =
-        TransitionInfo(type, 0 /* flags */).apply {
+        TransitionInfo(type, /* flags= */ 0).apply {
             addChange(
                 TransitionInfo.Change(mock(), closingTaskLeash).apply {
                     mode = changeMode
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
index 3cf84d9..372e47c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
@@ -777,7 +777,7 @@
         task: RunningTaskInfo,
         withWallpaper: Boolean = false,
     ): TransitionInfo =
-        TransitionInfo(WindowManager.TRANSIT_CLOSE, 0 /* flags */).apply {
+        TransitionInfo(WindowManager.TRANSIT_CLOSE, /* flags= */ 0).apply {
             addChange(
                 TransitionInfo.Change(mock(), closingTaskLeash).apply {
                     mode = changeMode
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index e032616..da27c08 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -1267,7 +1267,7 @@
         // Set task as systemUI package
         val systemUIPackageName =
             context.resources.getString(com.android.internal.R.string.config_systemUi)
-        val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
         val task =
             setUpFullscreenTask().apply {
                 baseActivity = baseComponent
@@ -1284,7 +1284,7 @@
         // Set task as systemUI package
         val systemUIPackageName =
             context.resources.getString(com.android.internal.R.string.config_systemUi)
-        val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
         val task =
             setUpFullscreenTask().apply {
                 baseActivity = baseComponent
@@ -1757,12 +1757,12 @@
 
         controller.moveToNextDisplay(task.taskId)
 
-        with(getLatestWct(type = TRANSIT_CHANGE)) {
-            val wallpaperChange =
-                hierarchyOps.find { op -> op.container == wallpaperToken.asBinder() }
-            assertThat(wallpaperChange).isNotNull()
-            assertThat(wallpaperChange!!.type).isEqualTo(HIERARCHY_OP_TYPE_REMOVE_TASK)
-        }
+        val wallpaperChange =
+            getLatestWct(type = TRANSIT_CHANGE).hierarchyOps.find { op ->
+                op.container == wallpaperToken.asBinder()
+            }
+        assertNotNull(wallpaperChange)
+        assertThat(wallpaperChange.type).isEqualTo(HIERARCHY_OP_TYPE_REMOVE_TASK)
     }
 
     @Test
@@ -1792,15 +1792,13 @@
 
         controller.moveToNextDisplay(task.taskId)
 
-        with(getLatestWct(type = TRANSIT_CHANGE)) {
-            val taskChange = changes[task.token.asBinder()]
-            assertThat(taskChange).isNotNull()
-            // To preserve DP size, pixel size is changed to 320x240. The ratio of the left margin
-            // to the right margin and the ratio of the top margin to bottom margin are also
-            // preserved.
-            assertThat(taskChange!!.configuration.windowConfiguration.bounds)
-                .isEqualTo(Rect(240, 160, 560, 400))
-        }
+        val taskChange = getLatestWct(type = TRANSIT_CHANGE).changes[task.token.asBinder()]
+        assertNotNull(taskChange)
+        // To preserve DP size, pixel size is changed to 320x240. The ratio of the left margin
+        // to the right margin and the ratio of the top margin to bottom margin are also
+        // preserved.
+        assertThat(taskChange.configuration.windowConfiguration.bounds)
+            .isEqualTo(Rect(240, 160, 560, 400))
     }
 
     @Test
@@ -1831,12 +1829,10 @@
 
         controller.moveToNextDisplay(task.taskId)
 
-        with(getLatestWct(type = TRANSIT_CHANGE)) {
-            val taskChange = changes[task.token.asBinder()]
-            assertThat(taskChange).isNotNull()
-            assertThat(taskChange!!.configuration.windowConfiguration.bounds)
-                .isEqualTo(Rect(960, 480, 1280, 720))
-        }
+        val taskChange = getLatestWct(type = TRANSIT_CHANGE).changes[task.token.asBinder()]
+        assertNotNull(taskChange)
+        assertThat(taskChange.configuration.windowConfiguration.bounds)
+            .isEqualTo(Rect(960, 480, 1280, 720))
     }
 
     @Test
@@ -1864,13 +1860,11 @@
 
         controller.moveToNextDisplay(task.taskId)
 
-        with(getLatestWct(type = TRANSIT_CHANGE)) {
-            val taskChange = changes[task.token.asBinder()]
-            assertThat(taskChange).isNotNull()
-            // DP size is preserved. The window is centered in the destination display.
-            assertThat(taskChange!!.configuration.windowConfiguration.bounds)
-                .isEqualTo(Rect(320, 120, 960, 600))
-        }
+        val taskChange = getLatestWct(type = TRANSIT_CHANGE).changes[task.token.asBinder()]
+        assertNotNull(taskChange)
+        // DP size is preserved. The window is centered in the destination display.
+        assertThat(taskChange.configuration.windowConfiguration.bounds)
+            .isEqualTo(Rect(320, 120, 960, 600))
     }
 
     @Test
@@ -1903,14 +1897,12 @@
 
         controller.moveToNextDisplay(task.taskId)
 
-        with(getLatestWct(type = TRANSIT_CHANGE)) {
-            val taskChange = changes[task.token.asBinder()]
-            assertThat(taskChange).isNotNull()
-            assertThat(taskChange!!.configuration.windowConfiguration.bounds.left).isAtLeast(0)
-            assertThat(taskChange.configuration.windowConfiguration.bounds.top).isAtLeast(0)
-            assertThat(taskChange.configuration.windowConfiguration.bounds.right).isAtMost(640)
-            assertThat(taskChange.configuration.windowConfiguration.bounds.bottom).isAtMost(480)
-        }
+        val taskChange = getLatestWct(type = TRANSIT_CHANGE).changes[task.token.asBinder()]
+        assertNotNull(taskChange)
+        assertThat(taskChange.configuration.windowConfiguration.bounds.left).isAtLeast(0)
+        assertThat(taskChange.configuration.windowConfiguration.bounds.top).isAtLeast(0)
+        assertThat(taskChange.configuration.windowConfiguration.bounds.right).isAtMost(640)
+        assertThat(taskChange.configuration.windowConfiguration.bounds.bottom).isAtMost(480)
     }
 
     @Test
@@ -2722,7 +2714,7 @@
         // Set task as systemUI package
         val systemUIPackageName =
             context.resources.getString(com.android.internal.R.string.config_systemUi)
-        val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
         val task =
             setUpFreeformTask().apply {
                 baseActivity = baseComponent
@@ -2743,7 +2735,7 @@
         // Set task as systemUI package
         val systemUIPackageName =
             context.resources.getString(com.android.internal.R.string.config_systemUi)
-        val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
+        val baseComponent = ComponentName(systemUIPackageName, /* cls= */ "")
         val task =
             setUpFullscreenTask().apply {
                 baseActivity = baseComponent
@@ -3376,11 +3368,11 @@
         spyController.onDragPositioningEnd(
             task,
             mockSurface,
-            Point(100, -100), /* position */
-            PointF(200f, -200f), /* inputCoordinate */
-            Rect(100, -100, 500, 1000), /* currentDragBounds */
-            Rect(0, 50, 2000, 2000), /* validDragArea */
-            Rect() /* dragStartBounds */,
+            position = Point(100, -100),
+            inputCoordinate = PointF(200f, -200f),
+            currentDragBounds = Rect(100, -100, 500, 1000),
+            validDragArea = Rect(0, 50, 2000, 2000),
+            dragStartBounds = Rect(),
             motionEvent,
             desktopWindowDecoration,
         )
@@ -3415,11 +3407,11 @@
         spyController.onDragPositioningEnd(
             task,
             mockSurface,
-            Point(100, 200), /* position */
-            PointF(200f, 300f), /* inputCoordinate */
-            currentDragBounds, /* currentDragBounds */
-            Rect(0, 50, 2000, 2000) /* validDragArea */,
-            Rect() /* dragStartBounds */,
+            position = Point(100, 200),
+            inputCoordinate = PointF(200f, 300f),
+            currentDragBounds = currentDragBounds,
+            validDragArea = Rect(0, 50, 2000, 2000),
+            dragStartBounds = Rect(),
             motionEvent,
             desktopWindowDecoration,
         )
@@ -3459,11 +3451,11 @@
         spyController.onDragPositioningEnd(
             task,
             mockSurface,
-            Point(100, 50), /* position */
-            PointF(200f, 300f), /* inputCoordinate */
-            Rect(100, 50, 500, 1000), /* currentDragBounds */
-            Rect(0, 50, 2000, 2000) /* validDragArea */,
-            Rect() /* dragStartBounds */,
+            position = Point(100, 50),
+            inputCoordinate = PointF(200f, 300f),
+            currentDragBounds = Rect(100, 50, 500, 1000),
+            validDragArea = Rect(0, 50, 2000, 2000),
+            dragStartBounds = Rect(),
             motionEvent,
             desktopWindowDecoration,
         )
@@ -3498,11 +3490,11 @@
         spyController.onDragPositioningEnd(
             task,
             mockSurface,
-            Point(100, 50), /* position */
-            PointF(200f, 300f), /* inputCoordinate */
+            position = Point(100, 50),
+            inputCoordinate = PointF(200f, 300f),
             currentDragBounds,
-            Rect(0, 50, 2000, 2000) /* validDragArea */,
-            Rect() /* dragStartBounds */,
+            validDragArea = Rect(0, 50, 2000, 2000),
+            dragStartBounds = Rect(),
             motionEvent,
             desktopWindowDecoration,
         )
@@ -3555,11 +3547,11 @@
         spyController.onDragPositioningEnd(
             task,
             mockSurface,
-            Point(100, 50), /* position */
-            PointF(200f, 300f), /* inputCoordinate */
-            currentDragBounds, /* currentDragBounds */
-            Rect(0, 50, 2000, 2000) /* validDragArea */,
-            Rect() /* dragStartBounds */,
+            position = Point(100, 50),
+            inputCoordinate = PointF(200f, 300f),
+            currentDragBounds = currentDragBounds,
+            validDragArea = Rect(0, 50, 2000, 2000),
+            dragStartBounds = Rect(),
             motionEvent,
             desktopWindowDecoration,
         )
@@ -5053,7 +5045,7 @@
         task: RunningTaskInfo?,
         @WindowManager.TransitionType type: Int = TRANSIT_OPEN,
     ): TransitionRequestInfo {
-        return TransitionRequestInfo(type, task, null /* remoteTransition */)
+        return TransitionRequestInfo(type, task, /* remoteTransition= */ null)
     }
 
     private companion object {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
index 52602f2..c8214b3 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
@@ -193,10 +193,10 @@
         desktopTasksLimiter
             .getTransitionObserver()
             .onTransitionReady(
-                Binder() /* transition */,
+                /* transition= */ Binder(),
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isFalse()
@@ -217,10 +217,10 @@
         desktopTasksLimiter
             .getTransitionObserver()
             .onTransitionReady(
-                taskTransition /* transition */,
+                /* transition= */ taskTransition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isFalse()
@@ -242,8 +242,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfoBuilder(TRANSIT_OPEN).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isFalse()
@@ -265,8 +265,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfoBuilder(TRANSIT_OPEN).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isTrue()
@@ -287,8 +287,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isTrue()
@@ -316,8 +316,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfo(TRANSIT_OPEN, TransitionInfo.FLAG_NONE).apply { addChange(change) },
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isTrue()
@@ -344,8 +344,8 @@
             .onTransitionReady(
                 newTransition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         assertThat(desktopTaskRepo.isMinimizedTask(taskId = task.taskId)).isTrue()
@@ -552,8 +552,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         desktopTasksLimiter.getTransitionObserver().onTransitionStarting(transition)
@@ -584,8 +584,8 @@
             .onTransitionReady(
                 transition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         desktopTasksLimiter.getTransitionObserver().onTransitionStarting(transition)
@@ -617,8 +617,8 @@
             .onTransitionReady(
                 mergedTransition,
                 TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
-                StubTransaction() /* startTransaction */,
-                StubTransaction(), /* finishTransaction */
+                /* startTransaction= */ StubTransaction(),
+                /* finishTransaction= */ StubTransaction(),
             )
 
         desktopTasksLimiter.getTransitionObserver().onTransitionStarting(mergedTransition)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt
index d491d44..3cc30cb 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt
@@ -305,7 +305,7 @@
         type: Int = TRANSIT_TO_BACK,
         withWallpaper: Boolean = false,
     ): TransitionInfo {
-        return TransitionInfo(type, 0 /* flags */).apply {
+        return TransitionInfo(type, /* flags= */ 0).apply {
             addChange(
                 Change(mock(), mock()).apply {
                     mode = type
@@ -331,7 +331,7 @@
         task: RunningTaskInfo?,
         type: Int = TRANSIT_OPEN,
     ): TransitionInfo {
-        return TransitionInfo(TRANSIT_OPEN, 0 /* flags */).apply {
+        return TransitionInfo(TRANSIT_OPEN, /* flags= */ 0).apply {
             addChange(
                 Change(mock(), mock()).apply {
                     mode = TRANSIT_OPEN
@@ -344,7 +344,7 @@
     }
 
     private fun createCloseTransition(task: RunningTaskInfo?): TransitionInfo {
-        return TransitionInfo(TRANSIT_CLOSE, 0 /* flags */).apply {
+        return TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0).apply {
             addChange(
                 Change(mock(), mock()).apply {
                     mode = TRANSIT_CLOSE
@@ -357,7 +357,7 @@
     }
 
     private fun createToBackTransition(task: RunningTaskInfo?): TransitionInfo {
-        return TransitionInfo(TRANSIT_TO_BACK, 0 /* flags */).apply {
+        return TransitionInfo(TRANSIT_TO_BACK, /* flags= */ 0).apply {
             addChange(
                 Change(mock(), mock()).apply {
                     mode = TRANSIT_TO_BACK
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
index 2216d54..341df02 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
@@ -677,7 +677,7 @@
     }
 
     private fun createTransitionInfo(type: Int, draggedTask: RunningTaskInfo): TransitionInfo {
-        return TransitionInfo(type, 0 /* flags */).apply {
+        return TransitionInfo(type, /* flags= */ 0).apply {
             addChange( // Home.
                 TransitionInfo.Change(mock(), homeTaskLeash).apply {
                     parent = null
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
index fd3adab..3209664 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
@@ -40,6 +40,7 @@
 
 /**
  * Tests for [GroupedTaskInfo]
+ * Build & Run: atest WMShellUnitTests:GroupedTaskInfoTest
  */
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -47,7 +48,7 @@
 
     @Test
     fun testSingleTask_hasCorrectType() {
-        assertThat(singleTaskGroupInfo().type).isEqualTo(TYPE_FULLSCREEN)
+        assertThat(singleTaskGroupInfo().isBaseType(TYPE_FULLSCREEN)).isTrue()
     }
 
     @Test
@@ -66,7 +67,7 @@
 
     @Test
     fun testSplitTasks_hasCorrectType() {
-        assertThat(splitTasksGroupInfo().type).isEqualTo(TYPE_SPLIT)
+        assertThat(splitTasksGroupInfo().isBaseType(TYPE_SPLIT)).isTrue()
     }
 
     @Test
@@ -87,8 +88,8 @@
 
     @Test
     fun testFreeformTasks_hasCorrectType() {
-        assertThat(freeformTasksGroupInfo(freeformTaskIds = arrayOf(1)).type)
-            .isEqualTo(TYPE_FREEFORM)
+        assertThat(freeformTasksGroupInfo(freeformTaskIds = arrayOf(1)).isBaseType(TYPE_FREEFORM))
+            .isTrue()
     }
 
     @Test
@@ -111,83 +112,155 @@
     }
 
     @Test
+    fun testMixedWithFullscreenBase_hasCorrectType() {
+        assertThat(mixedTaskGroupInfoWithFullscreenBase().isBaseType(TYPE_FULLSCREEN)).isTrue()
+    }
+
+    @Test
+    fun testMixedWithSplitBase_hasCorrectType() {
+        assertThat(mixedTaskGroupInfoWithSplitBase().isBaseType(TYPE_SPLIT)).isTrue()
+    }
+
+    @Test
+    fun testMixedWithFreeformBase_hasCorrectType() {
+        assertThat(mixedTaskGroupInfoWithFreeformBase().isBaseType(TYPE_FREEFORM)).isTrue()
+    }
+
+    @Test
+    fun testMixed_disallowEmptyMixed() {
+        assertThrows(IllegalArgumentException::class.java) {
+            GroupedTaskInfo.forMixed(listOf())
+        }
+    }
+
+    @Test
+    fun testMixed_disallowNestedMixed() {
+        assertThrows(IllegalArgumentException::class.java) {
+            GroupedTaskInfo.forMixed(listOf(
+                GroupedTaskInfo.forMixed(listOf(singleTaskGroupInfo()))))
+        }
+    }
+
+    @Test
+    fun testMixed_disallowNonMixedAccessors() {
+        val mixed = mixedTaskGroupInfoWithFullscreenBase()
+        assertThrows(IllegalStateException::class.java) {
+            mixed.taskInfo1
+        }
+        assertThrows(IllegalStateException::class.java) {
+            mixed.taskInfo2
+        }
+        assertThrows(IllegalStateException::class.java) {
+            mixed.splitBounds
+        }
+        assertThrows(IllegalStateException::class.java) {
+            mixed.minimizedTaskIds
+        }
+    }
+
+    @Test
     fun testParcelling_singleTask() {
-        val recentTaskInfo = singleTaskGroupInfo()
+        val taskInfo = singleTaskGroupInfo()
         val parcel = Parcel.obtain()
-        recentTaskInfo.writeToParcel(parcel, 0)
+        taskInfo.writeToParcel(parcel, 0)
         parcel.setDataPosition(0)
         // Read the object back from the parcel
-        val recentTaskInfoParcel: GroupedTaskInfo =
+        val taskInfoFromParcel: GroupedTaskInfo =
             GroupedTaskInfo.CREATOR.createFromParcel(parcel)
-        assertThat(recentTaskInfoParcel.type).isEqualTo(TYPE_FULLSCREEN)
-        assertThat(recentTaskInfoParcel.taskInfo1.taskId).isEqualTo(1)
-        assertThat(recentTaskInfoParcel.taskInfo2).isNull()
+        assertThat(taskInfoFromParcel.isBaseType(TYPE_FULLSCREEN)).isTrue()
+        assertThat(taskInfoFromParcel.taskInfo1.taskId).isEqualTo(1)
+        assertThat(taskInfoFromParcel.taskInfo2).isNull()
     }
 
     @Test
     fun testParcelling_splitTasks() {
-        val recentTaskInfo = splitTasksGroupInfo()
+        val taskInfo = splitTasksGroupInfo()
         val parcel = Parcel.obtain()
-        recentTaskInfo.writeToParcel(parcel, 0)
+        taskInfo.writeToParcel(parcel, 0)
         parcel.setDataPosition(0)
         // Read the object back from the parcel
-        val recentTaskInfoParcel: GroupedTaskInfo =
+        val taskInfoFromParcel: GroupedTaskInfo =
             GroupedTaskInfo.CREATOR.createFromParcel(parcel)
-        assertThat(recentTaskInfoParcel.type).isEqualTo(TYPE_SPLIT)
-        assertThat(recentTaskInfoParcel.taskInfo1.taskId).isEqualTo(1)
-        assertThat(recentTaskInfoParcel.taskInfo2).isNotNull()
-        assertThat(recentTaskInfoParcel.taskInfo2!!.taskId).isEqualTo(2)
-        assertThat(recentTaskInfoParcel.splitBounds).isNotNull()
-        assertThat(recentTaskInfoParcel.splitBounds!!.snapPosition).isEqualTo(SNAP_TO_2_50_50)
+        assertThat(taskInfoFromParcel.isBaseType(TYPE_SPLIT)).isTrue()
+        assertThat(taskInfoFromParcel.taskInfo1.taskId).isEqualTo(1)
+        assertThat(taskInfoFromParcel.taskInfo2).isNotNull()
+        assertThat(taskInfoFromParcel.taskInfo2!!.taskId).isEqualTo(2)
+        assertThat(taskInfoFromParcel.splitBounds).isNotNull()
+        assertThat(taskInfoFromParcel.splitBounds!!.snapPosition).isEqualTo(SNAP_TO_2_50_50)
     }
 
     @Test
     fun testParcelling_freeformTasks() {
-        val recentTaskInfo = freeformTasksGroupInfo(freeformTaskIds = arrayOf(1, 2, 3))
+        val taskInfo = freeformTasksGroupInfo(freeformTaskIds = arrayOf(1, 2, 3))
         val parcel = Parcel.obtain()
-        recentTaskInfo.writeToParcel(parcel, 0)
+        taskInfo.writeToParcel(parcel, 0)
         parcel.setDataPosition(0)
         // Read the object back from the parcel
-        val recentTaskInfoParcel: GroupedTaskInfo =
+        val taskInfoFromParcel: GroupedTaskInfo =
             GroupedTaskInfo.CREATOR.createFromParcel(parcel)
-        assertThat(recentTaskInfoParcel.type).isEqualTo(TYPE_FREEFORM)
-        assertThat(recentTaskInfoParcel.taskInfoList).hasSize(3)
+        assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+        assertThat(taskInfoFromParcel.taskInfoList).hasSize(3)
         // Only compare task ids
         val taskIdComparator = Correspondence.transforming<TaskInfo, Int>(
             { it?.taskId }, "has taskId of"
         )
-        assertThat(recentTaskInfoParcel.taskInfoList).comparingElementsUsing(taskIdComparator)
-            .containsExactly(1, 2, 3)
+        assertThat(taskInfoFromParcel.taskInfoList).comparingElementsUsing(taskIdComparator)
+            .containsExactly(1, 2, 3).inOrder()
     }
 
     @Test
     fun testParcelling_freeformTasks_minimizedTasks() {
-        val recentTaskInfo = freeformTasksGroupInfo(
+        val taskInfo = freeformTasksGroupInfo(
             freeformTaskIds = arrayOf(1, 2, 3), minimizedTaskIds = arrayOf(2))
 
         val parcel = Parcel.obtain()
-        recentTaskInfo.writeToParcel(parcel, 0)
+        taskInfo.writeToParcel(parcel, 0)
         parcel.setDataPosition(0)
 
         // Read the object back from the parcel
-        val recentTaskInfoParcel: GroupedTaskInfo =
+        val taskInfoFromParcel: GroupedTaskInfo =
             GroupedTaskInfo.CREATOR.createFromParcel(parcel)
-        assertThat(recentTaskInfoParcel.type).isEqualTo(TYPE_FREEFORM)
-        assertThat(recentTaskInfoParcel.minimizedTaskIds).isEqualTo(arrayOf(2).toIntArray())
+        assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+        assertThat(taskInfoFromParcel.minimizedTaskIds).isEqualTo(arrayOf(2).toIntArray())
     }
 
     @Test
-    fun testGetTaskById_singleTasks() {
+    fun testParcelling_mixedTasks() {
+        val taskInfo = GroupedTaskInfo.forMixed(listOf(
+                freeformTasksGroupInfo(freeformTaskIds = arrayOf(4, 5, 6),
+                    minimizedTaskIds = arrayOf(5)),
+                splitTasksGroupInfo(firstId = 2, secondId = 3),
+                singleTaskGroupInfo(id = 1)))
+
+        val parcel = Parcel.obtain()
+        taskInfo.writeToParcel(parcel, 0)
+        parcel.setDataPosition(0)
+
+        // Read the object back from the parcel
+        val taskInfoFromParcel: GroupedTaskInfo =
+            GroupedTaskInfo.CREATOR.createFromParcel(parcel)
+        assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+        assertThat(taskInfoFromParcel.baseGroupedTask.minimizedTaskIds).isEqualTo(
+            arrayOf(5).toIntArray())
+        for (i in 1..6) {
+            assertThat(taskInfoFromParcel.containsTask(i)).isTrue()
+        }
+        assertThat(taskInfoFromParcel.taskInfoList).hasSize(taskInfo.taskInfoList.size)
+    }
+
+    @Test
+    fun testTaskProperties_singleTasks() {
         val task1 = createTaskInfo(id = 1234)
 
         val taskInfo = GroupedTaskInfo.forFullscreenTasks(task1)
 
         assertThat(taskInfo.getTaskById(1234)).isEqualTo(task1)
         assertThat(taskInfo.containsTask(1234)).isTrue()
+        assertThat(taskInfo.taskInfoList).isEqualTo(listOf(task1))
     }
 
     @Test
-    fun testGetTaskById_multipleTasks() {
+    fun testTaskProperties_splitTasks() {
         val task1 = createTaskInfo(id = 1)
         val task2 = createTaskInfo(id = 2)
         val splitBounds = SplitBounds(Rect(), Rect(), 1, 2, SNAP_TO_2_50_50)
@@ -198,6 +271,41 @@
         assertThat(taskInfo.getTaskById(2)).isEqualTo(task2)
         assertThat(taskInfo.containsTask(1)).isTrue()
         assertThat(taskInfo.containsTask(2)).isTrue()
+        assertThat(taskInfo.taskInfoList).isEqualTo(listOf(task1, task2))
+    }
+
+    @Test
+    fun testTaskProperties_freeformTasks() {
+        val task1 = createTaskInfo(id = 1)
+        val task2 = createTaskInfo(id = 2)
+
+        val taskInfo = GroupedTaskInfo.forFreeformTasks(listOf(task1, task2), setOf())
+
+        assertThat(taskInfo.getTaskById(1)).isEqualTo(task1)
+        assertThat(taskInfo.getTaskById(2)).isEqualTo(task2)
+        assertThat(taskInfo.containsTask(1)).isTrue()
+        assertThat(taskInfo.containsTask(2)).isTrue()
+        assertThat(taskInfo.taskInfoList).isEqualTo(listOf(task1, task2))
+    }
+
+    @Test
+    fun testTaskProperties_mixedTasks() {
+        val task1 = createTaskInfo(id = 1)
+        val task2 = createTaskInfo(id = 2)
+        val task3 = createTaskInfo(id = 3)
+        val splitBounds = SplitBounds(Rect(), Rect(), 1, 2, SNAP_TO_2_50_50)
+
+        val splitTasks = GroupedTaskInfo.forSplitTasks(task1, task2, splitBounds)
+        val fullscreenTasks = GroupedTaskInfo.forFullscreenTasks(task3)
+        val mixedTasks = GroupedTaskInfo.forMixed(listOf(splitTasks, fullscreenTasks))
+
+        assertThat(mixedTasks.getTaskById(1)).isEqualTo(task1)
+        assertThat(mixedTasks.getTaskById(2)).isEqualTo(task2)
+        assertThat(mixedTasks.getTaskById(3)).isEqualTo(task3)
+        assertThat(mixedTasks.containsTask(1)).isTrue()
+        assertThat(mixedTasks.containsTask(2)).isTrue()
+        assertThat(mixedTasks.containsTask(3)).isTrue()
+        assertThat(mixedTasks.taskInfoList).isEqualTo(listOf(task1, task2, task3))
     }
 
     private fun createTaskInfo(id: Int) = ActivityManager.RecentTaskInfo().apply {
@@ -205,14 +313,14 @@
         token = WindowContainerToken(mock(IWindowContainerToken::class.java))
     }
 
-    private fun singleTaskGroupInfo(): GroupedTaskInfo {
-        val task = createTaskInfo(id = 1)
+    private fun singleTaskGroupInfo(id: Int = 1): GroupedTaskInfo {
+        val task = createTaskInfo(id)
         return GroupedTaskInfo.forFullscreenTasks(task)
     }
 
-    private fun splitTasksGroupInfo(): GroupedTaskInfo {
-        val task1 = createTaskInfo(id = 1)
-        val task2 = createTaskInfo(id = 2)
+    private fun splitTasksGroupInfo(firstId: Int = 1, secondId: Int = 2): GroupedTaskInfo {
+        val task1 = createTaskInfo(firstId)
+        val task2 = createTaskInfo(secondId)
         val splitBounds = SplitBounds(Rect(), Rect(), 1, 2, SNAP_TO_2_50_50)
         return GroupedTaskInfo.forSplitTasks(task1, task2, splitBounds)
     }
@@ -225,4 +333,22 @@
             freeformTaskIds.map { createTaskInfo(it) }.toList(),
             minimizedTaskIds.toSet())
     }
+
+    private fun mixedTaskGroupInfoWithFullscreenBase(): GroupedTaskInfo {
+        return GroupedTaskInfo.forMixed(listOf(
+            singleTaskGroupInfo(id = 1),
+            singleTaskGroupInfo(id = 2)))
+    }
+
+    private fun mixedTaskGroupInfoWithSplitBase(): GroupedTaskInfo {
+        return GroupedTaskInfo.forMixed(listOf(
+            splitTasksGroupInfo(firstId = 2, secondId = 3),
+            singleTaskGroupInfo(id = 1)))
+    }
+
+    private fun mixedTaskGroupInfoWithFreeformBase(): GroupedTaskInfo {
+        return GroupedTaskInfo.forMixed(listOf(
+            freeformTasksGroupInfo(freeformTaskIds = arrayOf(2, 3, 4)),
+            singleTaskGroupInfo(id = 1)))
+    }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
index 22b45e8..7e5d6ce 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
@@ -24,6 +24,9 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
 import static com.android.launcher3.Flags.FLAG_ENABLE_USE_TOP_VISIBLE_ACTIVITY_FOR_EXCLUDE_FROM_RECENT_TASK;
 import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE;
+import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FREEFORM;
+import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FULLSCREEN;
+import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT;
 import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
 
 import static org.junit.Assert.assertEquals;
@@ -346,9 +349,9 @@
         GroupedTaskInfo singleGroup2 = recentTasks.get(2);
 
         // Check that groups have expected types
-        assertEquals(GroupedTaskInfo.TYPE_FREEFORM, freeformGroup.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, singleGroup1.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, singleGroup2.getType());
+        assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+        assertTrue(singleGroup1.isBaseType(TYPE_FULLSCREEN));
+        assertTrue(singleGroup2.isBaseType(TYPE_FULLSCREEN));
 
         // Check freeform group entries
         assertEquals(t1, freeformGroup.getTaskInfoList().get(0));
@@ -385,9 +388,9 @@
         GroupedTaskInfo singleGroup = recentTasks.get(2);
 
         // Check that groups have expected types
-        assertEquals(GroupedTaskInfo.TYPE_SPLIT, splitGroup.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FREEFORM, freeformGroup.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, singleGroup.getType());
+        assertTrue(splitGroup.isBaseType(TYPE_SPLIT));
+        assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+        assertTrue(singleGroup.isBaseType(TYPE_FULLSCREEN));
 
         // Check freeform group entries
         assertEquals(t3, freeformGroup.getTaskInfoList().get(0));
@@ -420,10 +423,10 @@
 
         // Expect no grouping of tasks
         assertEquals(4, recentTasks.size());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, recentTasks.get(0).getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, recentTasks.get(1).getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, recentTasks.get(2).getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, recentTasks.get(3).getType());
+        assertTrue(recentTasks.get(0).isBaseType(TYPE_FULLSCREEN));
+        assertTrue(recentTasks.get(1).isBaseType(TYPE_FULLSCREEN));
+        assertTrue(recentTasks.get(2).isBaseType(TYPE_FULLSCREEN));
+        assertTrue(recentTasks.get(3).isBaseType(TYPE_FULLSCREEN));
 
         assertEquals(t1, recentTasks.get(0).getTaskInfo1());
         assertEquals(t2, recentTasks.get(1).getTaskInfo1());
@@ -457,9 +460,9 @@
         GroupedTaskInfo singleGroup2 = recentTasks.get(2);
 
         // Check that groups have expected types
-        assertEquals(GroupedTaskInfo.TYPE_FREEFORM, freeformGroup.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, singleGroup1.getType());
-        assertEquals(GroupedTaskInfo.TYPE_FULLSCREEN, singleGroup2.getType());
+        assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+        assertTrue(singleGroup1.isBaseType(TYPE_FULLSCREEN));
+        assertTrue(singleGroup2.isBaseType(TYPE_FULLSCREEN));
 
         // Check freeform group entries
         assertEquals(3, freeformGroup.getTaskInfoList().size());
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
index 7dac085..6b02aef 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
@@ -20,7 +20,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.app.assist.AssistContent.EXTRA_SESSION_TRANSFER_WEB_URI;
 import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
@@ -1176,7 +1175,7 @@
 
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
-    public void webUriLink_webUriLinkUsedWhenWhenAvailable() {
+    public void sessionTransferUri_sessionTransferUriUsedWhenWhenAvailable() {
         final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
         final DesktopModeWindowDecoration decor = createWindowDecoration(
                 taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
@@ -1188,7 +1187,7 @@
 
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
-    public void webUriLink_webUriLinkUsedWhenSessionTransferUriUnavailable() {
+    public void webUri_webUriUsedWhenSessionTransferUriUnavailable() {
         final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
         final DesktopModeWindowDecoration decor = createWindowDecoration(
                 taskInfo, TEST_URI1 /* captured link */, TEST_URI2 /* web uri */,
@@ -1200,7 +1199,7 @@
 
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
-    public void genericLink_genericLinkUsedWhenCapturedLinkAndWebUriUnavailable() {
+    public void genericLink_genericLinkUsedWhenCapturedLinkAndAssistContentUriUnavailable() {
         final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
         final DesktopModeWindowDecoration decor = createWindowDecoration(
                 taskInfo, null /* captured link */, null /* web uri */,
@@ -1490,7 +1489,7 @@
         taskInfo.capturedLink = capturedLink;
         taskInfo.capturedLinkTimestamp = System.currentTimeMillis();
         mAssistContent.setWebUri(webUri);
-        mAssistContent.getExtras().putObject(EXTRA_SESSION_TRANSFER_WEB_URI, sessionTransferUri);
+        mAssistContent.setSessionTransferUri(sessionTransferUri);
         final String genericLinkString = genericLink == null ? null : genericLink.toString();
         doReturn(genericLinkString).when(mMockGenericLinksParser).getGenericLink(any());
         // Relayout to set captured link
diff --git a/libs/androidfw/LocaleDataLookup.cpp b/libs/androidfw/LocaleDataLookup.cpp
index 5441e22..6e751a7 100644
--- a/libs/androidfw/LocaleDataLookup.cpp
+++ b/libs/androidfw/LocaleDataLookup.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024 The Android Open Source Project
+ * Copyright (C) 2025 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.
@@ -14,51 +14,14934 @@
  * limitations under the License.
  */
 
-#include <unordered_map>
-#include <unordered_set>
+
+// Auto-generated by ./tools/localedata/extract_icu_data.py
 
 #include <androidfw/LocaleDataLookup.h>
 
 namespace android {
 
-#include "LocaleDataTables.cpp"
+constexpr const char SCRIPT_CODES[][4] = {
+    /* 0  */ {'A', 'g', 'h', 'b'},
+    /* 1  */ {'A', 'h', 'o', 'm'},
+    /* 2  */ {'A', 'r', 'a', 'b'},
+    /* 3  */ {'A', 'r', 'm', 'i'},
+    /* 4  */ {'A', 'r', 'm', 'n'},
+    /* 5  */ {'A', 'v', 's', 't'},
+    /* 6  */ {'B', 'a', 'm', 'u'},
+    /* 7  */ {'B', 'a', 's', 's'},
+    /* 8  */ {'B', 'a', 't', 'k'},
+    /* 9  */ {'B', 'e', 'n', 'g'},
+    /* 10 */ {'B', 'o', 'p', 'o'},
+    /* 11 */ {'B', 'r', 'a', 'h'},
+    /* 12 */ {'C', 'a', 'k', 'm'},
+    /* 13 */ {'C', 'a', 'n', 's'},
+    /* 14 */ {'C', 'a', 'r', 'i'},
+    /* 15 */ {'C', 'h', 'a', 'm'},
+    /* 16 */ {'C', 'h', 'e', 'r'},
+    /* 17 */ {'C', 'h', 'r', 's'},
+    /* 18 */ {'C', 'o', 'p', 't'},
+    /* 19 */ {'C', 'p', 'r', 't'},
+    /* 20 */ {'C', 'y', 'r', 'l'},
+    /* 21 */ {'D', 'e', 'v', 'a'},
+    /* 22 */ {'E', 'g', 'y', 'p'},
+    /* 23 */ {'E', 'l', 'y', 'm'},
+    /* 24 */ {'E', 't', 'h', 'i'},
+    /* 25 */ {'G', 'e', 'o', 'r'},
+    /* 26 */ {'G', 'o', 'n', 'g'},
+    /* 27 */ {'G', 'o', 'n', 'm'},
+    /* 28 */ {'G', 'o', 't', 'h'},
+    /* 29 */ {'G', 'r', 'a', 'n'},
+    /* 30 */ {'G', 'r', 'e', 'k'},
+    /* 31 */ {'G', 'u', 'j', 'r'},
+    /* 32 */ {'G', 'u', 'r', 'u'},
+    /* 33 */ {'H', 'a', 'n', 'g'},
+    /* 34 */ {'H', 'a', 'n', 'i'},
+    /* 35 */ {'H', 'a', 'n', 's'},
+    /* 36 */ {'H', 'a', 'n', 't'},
+    /* 37 */ {'H', 'e', 'b', 'r'},
+    /* 38 */ {'H', 'l', 'u', 'w'},
+    /* 39 */ {'H', 'm', 'n', 'p'},
+    /* 40 */ {'I', 't', 'a', 'l'},
+    /* 41 */ {'J', 'a', 'v', 'a'},
+    /* 42 */ {'J', 'p', 'a', 'n'},
+    /* 43 */ {'K', 'a', 'l', 'i'},
+    /* 44 */ {'K', 'a', 'n', 'a'},
+    /* 45 */ {'K', 'a', 'w', 'i'},
+    /* 46 */ {'K', 'h', 'a', 'r'},
+    /* 47 */ {'K', 'h', 'm', 'r'},
+    /* 48 */ {'K', 'i', 't', 's'},
+    /* 49 */ {'K', 'n', 'd', 'a'},
+    /* 50 */ {'K', 'o', 'r', 'e'},
+    /* 51 */ {'L', 'a', 'n', 'a'},
+    /* 52 */ {'L', 'a', 'o', 'o'},
+    /* 53 */ {'L', 'a', 't', 'f'},
+    /* 54 */ {'L', 'a', 't', 'g'},
+    /* 55 */ {'L', 'a', 't', 'n'},
+    /* 56 */ {'L', 'e', 'p', 'c'},
+    /* 57 */ {'L', 'i', 'n', 'a'},
+    /* 58 */ {'L', 'i', 'n', 'b'},
+    /* 59 */ {'L', 'i', 's', 'u'},
+    /* 60 */ {'L', 'y', 'c', 'i'},
+    /* 61 */ {'L', 'y', 'd', 'i'},
+    /* 62 */ {'M', 'a', 'n', 'd'},
+    /* 63 */ {'M', 'a', 'n', 'i'},
+    /* 64 */ {'M', 'a', 'r', 'c'},
+    /* 65 */ {'M', 'e', 'd', 'f'},
+    /* 66 */ {'M', 'e', 'r', 'c'},
+    /* 67 */ {'M', 'l', 'y', 'm'},
+    /* 68 */ {'M', 'o', 'd', 'i'},
+    /* 69 */ {'M', 'o', 'n', 'g'},
+    /* 70 */ {'M', 'r', 'o', 'o'},
+    /* 71 */ {'M', 't', 'e', 'i'},
+    /* 72 */ {'M', 'y', 'm', 'r'},
+    /* 73 */ {'N', 'a', 'r', 'b'},
+    /* 74 */ {'N', 'e', 'w', 'a'},
+    /* 75 */ {'N', 'k', 'o', 'o'},
+    /* 76 */ {'N', 's', 'h', 'u'},
+    /* 77 */ {'O', 'g', 'a', 'm'},
+    /* 78 */ {'O', 'l', 'c', 'k'},
+    /* 79 */ {'O', 'r', 'k', 'h'},
+    /* 80 */ {'O', 'r', 'y', 'a'},
+    /* 81 */ {'O', 's', 'g', 'e'},
+    /* 82 */ {'O', 'u', 'g', 'r'},
+    /* 83 */ {'P', 'a', 'u', 'c'},
+    /* 84 */ {'P', 'h', 'l', 'i'},
+    /* 85 */ {'P', 'h', 'n', 'x'},
+    /* 86 */ {'P', 'l', 'r', 'd'},
+    /* 87 */ {'P', 'r', 't', 'i'},
+    /* 88 */ {'R', 'j', 'n', 'g'},
+    /* 89 */ {'R', 'o', 'h', 'g'},
+    /* 90 */ {'R', 'u', 'n', 'r'},
+    /* 91 */ {'S', 'a', 'm', 'r'},
+    /* 92 */ {'S', 'a', 'r', 'b'},
+    /* 93 */ {'S', 'a', 'u', 'r'},
+    /* 94 */ {'S', 'g', 'n', 'w'},
+    /* 95 */ {'S', 'i', 'n', 'h'},
+    /* 96 */ {'S', 'o', 'g', 'd'},
+    /* 97 */ {'S', 'o', 'r', 'a'},
+    /* 98 */ {'S', 'o', 'y', 'o'},
+    /* 99 */ {'S', 'u', 'n', 'u'},
+    /* 100 */ {'S', 'y', 'r', 'c'},
+    /* 101 */ {'T', 'a', 'g', 'b'},
+    /* 102 */ {'T', 'a', 'k', 'r'},
+    /* 103 */ {'T', 'a', 'l', 'e'},
+    /* 104 */ {'T', 'a', 'l', 'u'},
+    /* 105 */ {'T', 'a', 'm', 'l'},
+    /* 106 */ {'T', 'a', 'n', 'g'},
+    /* 107 */ {'T', 'a', 'v', 't'},
+    /* 108 */ {'T', 'e', 'l', 'u'},
+    /* 109 */ {'T', 'f', 'n', 'g'},
+    /* 110 */ {'T', 'h', 'a', 'a'},
+    /* 111 */ {'T', 'h', 'a', 'i'},
+    /* 112 */ {'T', 'i', 'b', 't'},
+    /* 113 */ {'T', 'n', 's', 'a'},
+    /* 114 */ {'T', 'o', 't', 'o'},
+    /* 115 */ {'U', 'g', 'a', 'r'},
+    /* 116 */ {'V', 'a', 'i', 'i'},
+    /* 117 */ {'W', 'c', 'h', 'o'},
+    /* 118 */ {'X', 'p', 'e', 'o'},
+    /* 119 */ {'X', 's', 'u', 'x'},
+    /* 120 */ {'Y', 'i', 'i', 'i'},
+    /* 121 */ {'~', '~', '~', 'A'},
+    /* 122 */ {'~', '~', '~', 'B'},
+};
 
-const size_t SCRIPT_PARENTS_COUNT = sizeof(SCRIPT_PARENTS)/sizeof(SCRIPT_PARENTS[0]);
 
 const char* lookupLikelyScript(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x98170000u: // xag -> Aghb
+            return SCRIPT_CODES[ 0u];
+        case 0xB8E00000u: // aho -> Ahom
+            return SCRIPT_CODES[ 1u];
+        case 0xB8000000u: // aao -> Arab
+        case 0x9C200000u: // abh -> Arab
+        case 0xD4200000u: // abv -> Arab
+        case 0xB0400000u: // acm -> Arab
+        case 0xC0400000u: // acq -> Arab
+        case 0xD8400000u: // acw -> Arab
+        case 0xDC400000u: // acx -> Arab
+        case 0x94600000u: // adf -> Arab
+        case 0x84800000u: // aeb -> Arab
+        case 0x88800000u: // aec -> Arab
+        case 0x90800000u: // aee -> Arab
+        case 0xC0800000u: // aeq -> Arab
+        case 0x84A00000u: // afb -> Arab
+        case 0x85000000u: // aib -> Arab
+        case 0xC1000000u: // aiq -> Arab
+        case 0x89E00000u: // apc -> Arab
+        case 0x8DE00000u: // apd -> Arab
+        case 0x61720000u: // ar -> Arab
+        case 0xC2200000u: // arq -> Arab
+        case 0xCA200000u: // ars -> Arab
+        case 0xE2200000u: // ary -> Arab
+        case 0xE6200000u: // arz -> Arab
+        case 0xAA400000u: // ask -> Arab
+        case 0xB6600000u: // atn -> Arab
+        case 0xA6800000u: // auj -> Arab
+        case 0xE6800000u: // auz -> Arab
+        case 0x8EA00000u: // avd -> Arab
+        case 0xAEA00000u: // avl -> Arab
+        case 0x9F000000u: // ayh -> Arab
+        case 0xAF000000u: // ayl -> Arab
+        case 0xB7000000u: // ayn -> Arab
+        case 0xBF000000u: // ayp -> Arab
+        case 0x617A4951u: // az-IQ -> Arab
+        case 0x617A4952u: // az-IR -> Arab
+        case 0x87200000u: // azb -> Arab
+        case 0xAC010000u: // bal -> Arab
+        case 0xE4610000u: // bdz -> Arab
+        case 0xA4810000u: // bej -> Arab
+        case 0xCCA10000u: // bft -> Arab
+        case 0xB4C10000u: // bgn -> Arab
+        case 0xBCC10000u: // bgp -> Arab
+        case 0x90E10000u: // bhe -> Arab
+        case 0xB0E10000u: // bhm -> Arab
+        case 0xB1210000u: // bjm -> Arab
+        case 0xA2010000u: // bqi -> Arab
+        case 0x9E210000u: // brh -> Arab
+        case 0xAA210000u: // brk -> Arab
+        case 0x9E410000u: // bsh -> Arab
+        case 0xAA410000u: // bsk -> Arab
+        case 0x98E20000u: // chg -> Arab
+        case 0x81220000u: // cja -> Arab
+        case 0x85420000u: // ckb -> Arab
+        case 0x9D620000u: // clh -> Arab
+        case 0x88430000u: // dcc -> Arab
+        case 0x94830000u: // def -> Arab
+        case 0x9C830000u: // deh -> Arab
+        case 0xACC30000u: // dgl -> Arab
+        case 0xA9830000u: // dmk -> Arab
+        case 0xAD830000u: // dml -> Arab
+        case 0x9E440000u: // esh -> Arab
+        case 0x66610000u: // fa -> Arab
+        case 0xE0050000u: // fay -> Arab
+        case 0xE4050000u: // faz -> Arab
+        case 0x81050000u: // fia -> Arab
+        case 0x86850000u: // fub -> Arab
+        case 0xE4260000u: // gbz -> Arab
+        case 0x98C60000u: // ggg -> Arab
+        case 0x80E60000u: // gha -> Arab
+        case 0xC4E60000u: // ghr -> Arab
+        case 0x99060000u: // gig -> Arab
+        case 0xA9260000u: // gjk -> Arab
+        case 0xD1260000u: // gju -> Arab
+        case 0x9D660000u: // glh -> Arab
+        case 0xA9660000u: // glk -> Arab
+        case 0x8AC60000u: // gwc -> Arab
+        case 0x96C60000u: // gwf -> Arab
+        case 0xCEC60000u: // gwt -> Arab
+        case 0xA3260000u: // gzi -> Arab
+        case 0x6861434Du: // ha-CM -> Arab
+        case 0x68615344u: // ha-SD -> Arab
+        case 0x88070000u: // hac -> Arab
+        case 0xE4070000u: // haz -> Arab
+        case 0x9D470000u: // hkh -> Arab
+        case 0x8DA70000u: // hnd -> Arab
+        case 0xB9A70000u: // hno -> Arab
+        case 0x9DC70000u: // hoh -> Arab
+        case 0xE6270000u: // hrz -> Arab
+        case 0xCA470000u: // hss -> Arab
+        case 0xAA480000u: // isk -> Arab
+        case 0x8C090000u: // jad -> Arab
+        case 0xCC090000u: // jat -> Arab
+        case 0xB4290000u: // jbn -> Arab
+        case 0x98690000u: // jdg -> Arab
+        case 0x8DA90000u: // jnd -> Arab
+        case 0x99C90000u: // jog -> Arab
+        case 0xD02A0000u: // kbu -> Arab
+        case 0xE02A0000u: // kby -> Arab
+        case 0xE04A0000u: // kcy -> Arab
+        case 0xB0AA0000u: // kfm -> Arab
+        case 0xD8EA0000u: // khw -> Arab
+        case 0x6B6B4146u: // kk-AF -> Arab
+        case 0x6B6B434Eu: // kk-CN -> Arab
+        case 0x6B6B4952u: // kk-IR -> Arab
+        case 0x6B6B4D4Eu: // kk-MN -> Arab
+        case 0xA56A0000u: // klj -> Arab
+        case 0xE58A0000u: // kmz -> Arab
+        case 0x6B730000u: // ks -> Arab
+        case 0xAE6A0000u: // ktl -> Arab
+        case 0x6B754C42u: // ku-LB -> Arab
+        case 0xDEAA0000u: // kvx -> Arab
+        case 0xBEEA0000u: // kxp -> Arab
+        case 0x6B79434Eu: // ky-CN -> Arab
+        case 0x9C0B0000u: // lah -> Arab
+        case 0xA14B0000u: // lki -> Arab
+        case 0x8A2B0000u: // lrc -> Arab
+        case 0xAA2B0000u: // lrk -> Arab
+        case 0xAE2B0000u: // lrl -> Arab
+        case 0x824B0000u: // lsa -> Arab
+        case 0xCA4B0000u: // lss -> Arab
+        case 0xD68B0000u: // luv -> Arab
+        case 0xE68B0000u: // luz -> Arab
+        case 0xE02C0000u: // mby -> Arab
+        case 0x906C0000u: // mde -> Arab
+        case 0x80AC0000u: // mfa -> Arab
+        case 0xA0AC0000u: // mfi -> Arab
+        case 0xA4EC0000u: // mhj -> Arab
+        case 0xA14C0000u: // mki -> Arab
+        case 0xA5AC0000u: // mnj -> Arab
+        case 0x6D734343u: // ms-CC -> Arab
+        case 0x92AC0000u: // mve -> Arab
+        case 0xE2AC0000u: // mvy -> Arab
+        case 0xB72C0000u: // mzn -> Arab
+        case 0xA16D0000u: // nli -> Arab
+        case 0xB16D0000u: // nlm -> Arab
+        case 0xE66D0000u: // ntz -> Arab
+        case 0xC30D0000u: // nyq -> Arab
+        case 0xA86E0000u: // odk -> Arab
+        case 0xD22E0000u: // oru -> Arab
+        case 0x826E0000u: // ota -> Arab
+        case 0x7061504Bu: // pa-PK -> Arab
+        case 0xCC2F0000u: // pbt -> Arab
+        case 0xACEF0000u: // phl -> Arab
+        case 0xC4EF0000u: // phr -> Arab
+        case 0xD4EF0000u: // phv -> Arab
+        case 0xA96F0000u: // plk -> Arab
+        case 0x8A2F0000u: // prc -> Arab
+        case 0x8E2F0000u: // prd -> Arab
+        case 0xDE2F0000u: // prx -> Arab
+        case 0x70730000u: // ps -> Arab
+        case 0x9E4F0000u: // psh -> Arab
+        case 0xA24F0000u: // psi -> Arab
+        case 0xCE4F0000u: // pst -> Arab
+        case 0xC2F00000u: // qxq -> Arab
+        case 0x84710000u: // rdb -> Arab
+        case 0xCD910000u: // rmt -> Arab
+        case 0xB4320000u: // sbn -> Arab
+        case 0xAC520000u: // scl -> Arab
+        case 0x73640000u: // sd -> Arab
+        case 0x84720000u: // sdb -> Arab
+        case 0x94720000u: // sdf -> Arab
+        case 0x98720000u: // sdg -> Arab
+        case 0x9C720000u: // sdh -> Arab
+        case 0xC8720000u: // sds -> Arab
+        case 0xC4D20000u: // sgr -> Arab
+        case 0xE0D20000u: // sgy -> Arab
+        case 0x8CF20000u: // shd -> Arab
+        case 0xB0F20000u: // shm -> Arab
+        case 0xD0F20000u: // shu -> Arab
+        case 0xD4F20000u: // shv -> Arab
+        case 0xE1120000u: // siy -> Arab
+        case 0xE5120000u: // siz -> Arab
+        case 0xC5520000u: // skr -> Arab
+        case 0xE1920000u: // smy -> Arab
+        case 0xBA120000u: // sqo -> Arab
+        case 0xCE120000u: // sqt -> Arab
+        case 0x9E320000u: // srh -> Arab
+        case 0xE6320000u: // srz -> Arab
+        case 0x9E520000u: // ssh -> Arab
+        case 0xCA720000u: // sts -> Arab
+        case 0x86D20000u: // swb -> Arab
+        case 0x7467504Bu: // tg-PK -> Arab
+        case 0xB9330000u: // tjo -> Arab
+        case 0xC9530000u: // tks -> Arab
+        case 0xD5D30000u: // tov -> Arab
+        case 0x82330000u: // tra -> Arab
+        case 0xB2330000u: // trm -> Arab
+        case 0xDA330000u: // trw -> Arab
+        case 0x75670000u: // ug -> Arab
+        case 0x75720000u: // ur -> Arab
+        case 0x9E540000u: // ush -> Arab
+        case 0x757A4146u: // uz-AF -> Arab
+        case 0xCB340000u: // uzs -> Arab
+        case 0x94150000u: // vaf -> Arab
+        case 0xC4D50000u: // vgr -> Arab
+        case 0x9D950000u: // vmh -> Arab
+        case 0xA8360000u: // wbk -> Arab
+        case 0xB9760000u: // wlo -> Arab
+        case 0x91B60000u: // wne -> Arab
+        case 0xA1B60000u: // wni -> Arab
+        case 0xD6560000u: // wsv -> Arab
+        case 0x90F70000u: // xhe -> Arab
+        case 0x81570000u: // xka -> Arab
+        case 0x89570000u: // xkc -> Arab
+        case 0xA5570000u: // xkj -> Arab
+        case 0xBD570000u: // xkp -> Arab
+        case 0xA2B70000u: // xvi -> Arab
+        case 0x98780000u: // ydg -> Arab
+        case 0x80390000u: // zba -> Arab
+        case 0xA4790000u: // zdj -> Arab
+        case 0xB2990000u: // zum -> Arab
+            return SCRIPT_CODES[ 2u];
+        case 0x8A200000u: // arc -> Armi
+            return SCRIPT_CODES[ 3u];
+        case 0xB2E00000u: // axm -> Armn
+        case 0x68790000u: // hy -> Armn
+        case 0xDB070000u: // hyw -> Armn
+        case 0xA1910000u: // rmi -> Armn
+            return SCRIPT_CODES[ 4u];
+        case 0x61650000u: // ae -> Avst
+            return SCRIPT_CODES[ 5u];
+        case 0xDC010000u: // bax -> Bamu
+            return SCRIPT_CODES[ 6u];
+        case 0xC2410000u: // bsq -> Bass
+            return SCRIPT_CODES[ 7u];
+        case 0x8E610000u: // btd -> Batk
+        case 0xB2610000u: // btm -> Batk
+            return SCRIPT_CODES[ 8u];
+        case 0xCDC00000u: // aot -> Beng
+        case 0x61730000u: // as -> Beng
+        case 0x626E0000u: // bn -> Beng
+        case 0xE1E10000u: // bpy -> Beng
+        case 0xE4620000u: // cdz -> Beng
+        case 0x9A620000u: // ctg -> Beng
+        case 0xC4830000u: // der -> Beng
+        case 0xCE260000u: // grt -> Beng
+        case 0xC06A0000u: // kdq -> Beng
+        case 0xA1AC0000u: // mni -> Beng
+        case 0x9C110000u: // rah -> Beng
+        case 0xCD510000u: // rkt -> Beng
+        case 0xC4720000u: // sdr -> Beng
+        case 0xAF120000u: // syl -> Beng
+        case 0xC5B40000u: // unr -> Beng
+        case 0xDDB40000u: // unx -> Beng
+            return SCRIPT_CODES[ 9u];
+        case 0xA5870000u: // hmj -> Bopo
+        case 0xC1870000u: // hmq -> Bopo
+            return SCRIPT_CODES[10u];
+        case 0xB8EA0000u: // kho -> Brah
+        case 0x814F0000u: // pka -> Brah
+        case 0x9D8F0000u: // pmh -> Brah
+        case 0xD24F0000u: // psu -> Brah
+        case 0xC2770000u: // xtq -> Brah
+            return SCRIPT_CODES[11u];
+        case 0xBC420000u: // ccp -> Cakm
+        case 0xD5B30000u: // tnv -> Cakm
+            return SCRIPT_CODES[12u];
+        case 0x63720000u: // cr -> Cans
+        case 0xA6220000u: // crj -> Cans
+        case 0xAA220000u: // crk -> Cans
+        case 0xAE220000u: // crl -> Cans
+        case 0xB2220000u: // crm -> Cans
+        case 0xDA420000u: // csw -> Cans
+        case 0x69750000u: // iu -> Cans
+        case 0xAA4D0000u: // nsk -> Cans
+        case 0x6F6A0000u: // oj -> Cans
+        case 0xC92E0000u: // ojs -> Cans
+            return SCRIPT_CODES[13u];
+        case 0xC4570000u: // xcr -> Cari
+            return SCRIPT_CODES[14u];
+        case 0xB1220000u: // cjm -> Cham
+            return SCRIPT_CODES[15u];
+        case 0xC4E20000u: // chr -> Cher
+            return SCRIPT_CODES[16u];
+        case 0xB8570000u: // xco -> Chrs
+            return SCRIPT_CODES[17u];
+        case 0xBDC20000u: // cop -> Copt
+            return SCRIPT_CODES[18u];
+        case 0xE0440000u: // ecy -> Cprt
+        case 0x8A260000u: // grc -> Cprt
+            return SCRIPT_CODES[19u];
+        case 0x61620000u: // ab -> Cyrl
+        case 0xE0600000u: // ady -> Cyrl
+        case 0xDCC00000u: // agx -> Cyrl
+        case 0xD5400000u: // akv -> Cyrl
+        case 0xC5600000u: // alr -> Cyrl
+        case 0xCD600000u: // alt -> Cyrl
+        case 0xA1A00000u: // ani -> Cyrl
+        case 0x8A000000u: // aqc -> Cyrl
+        case 0xD6600000u: // atv -> Cyrl
+        case 0x61760000u: // av -> Cyrl
+        case 0x617A5255u: // az-RU -> Cyrl
+        case 0x62610000u: // ba -> Cyrl
+        case 0x62650000u: // be -> Cyrl
+        case 0x62670000u: // bg -> Cyrl
+        case 0x9CE10000u: // bhh -> Cyrl
+        case 0x9DE10000u: // bph -> Cyrl
+        case 0x82810000u: // bua -> Cyrl
+        case 0xB2E10000u: // bxm -> Cyrl
+        case 0x63650000u: // ce -> Cyrl
+        case 0xB0E20000u: // chm -> Cyrl
+        case 0xA1220000u: // cji -> Cyrl
+        case 0xCD420000u: // ckt -> Cyrl
+        case 0xD9620000u: // clw -> Cyrl
+        case 0x9E220000u: // crh -> Cyrl
+        case 0x63750000u: // cu -> Cyrl
+        case 0x63760000u: // cv -> Cyrl
+        case 0xC4030000u: // dar -> Cyrl
+        case 0xB8630000u: // ddo -> Cyrl
+        case 0x99630000u: // dlg -> Cyrl
+        case 0x99A30000u: // dng -> Cyrl
+        case 0x95A40000u: // enf -> Cyrl
+        case 0x9DA40000u: // enh -> Cyrl
+        case 0x92A40000u: // eve -> Cyrl
+        case 0xB6A40000u: // evn -> Cyrl
+        case 0xB8660000u: // gdo -> Cyrl
+        case 0xB5060000u: // gin -> Cyrl
+        case 0x8D660000u: // gld -> Cyrl
+        case 0xE6870000u: // huz -> Cyrl
+        case 0x9DA80000u: // inh -> Cyrl
+        case 0xAE680000u: // itl -> Cyrl
+        case 0xCC490000u: // jct -> Cyrl
+        case 0xCC690000u: // jdt -> Cyrl
+        case 0x800A0000u: // kaa -> Cyrl
+        case 0xBC0A0000u: // kap -> Cyrl
+        case 0x8C2A0000u: // kbd -> Cyrl
+        case 0x804A0000u: // kca -> Cyrl
+        case 0xCC8A0000u: // ket -> Cyrl
+        case 0xD4EA0000u: // khv -> Cyrl
+        case 0xB10A0000u: // kim -> Cyrl
+        case 0x9D2A0000u: // kjh -> Cyrl
+        case 0x6B6B0000u: // kk -> Cyrl
+        case 0xA1CA0000u: // koi -> Cyrl
+        case 0xCDEA0000u: // kpt -> Cyrl
+        case 0xE1EA0000u: // kpy -> Cyrl
+        case 0x8A2A0000u: // krc -> Cyrl
+        case 0xAA2A0000u: // krk -> Cyrl
+        case 0xB28A0000u: // kum -> Cyrl
+        case 0x6B760000u: // kv -> Cyrl
+        case 0x82AA0000u: // kva -> Cyrl
+        case 0x6B790000u: // ky -> Cyrl
+        case 0x902B0000u: // lbe -> Cyrl
+        case 0xE48B0000u: // lez -> Cyrl
+        case 0x946C0000u: // mdf -> Cyrl
+        case 0x6D6B0000u: // mk -> Cyrl
+        case 0x6D6E0000u: // mn -> Cyrl
+        case 0xC9AC0000u: // mns -> Cyrl
+        case 0xA62C0000u: // mrj -> Cyrl
+        case 0xB26C0000u: // mtm -> Cyrl
+        case 0x8E8C0000u: // mud -> Cyrl
+        case 0xD70C0000u: // myv -> Cyrl
+        case 0x946D0000u: // ndf -> Cyrl
+        case 0x988D0000u: // neg -> Cyrl
+        case 0xB90D0000u: // nio -> Cyrl
+        case 0xD50D0000u: // niv -> Cyrl
+        case 0x99CD0000u: // nog -> Cyrl
+        case 0x800E0000u: // oaa -> Cyrl
+        case 0x880E0000u: // oac -> Cyrl
+        case 0xA98E0000u: // omk -> Cyrl
+        case 0xD62E0000u: // orv -> Cyrl
+        case 0x6F730000u: // os -> Cyrl
+        case 0xC00F0000u: // paq -> Cyrl
+        case 0xAA510000u: // rsk -> Cyrl
+        case 0x72750000u: // ru -> Cyrl
+        case 0x92910000u: // rue -> Cyrl
+        case 0xCE910000u: // rut -> Cyrl
+        case 0x9C120000u: // sah -> Cyrl
+        case 0xAC920000u: // sel -> Cyrl
+        case 0x9CD20000u: // sgh -> Cyrl
+        case 0x81120000u: // sia -> Cyrl
+        case 0x8D320000u: // sjd -> Cyrl
+        case 0xCD320000u: // sjt -> Cyrl
+        case 0x73720000u: // sr -> Cyrl
+        case 0xE2720000u: // sty -> Cyrl
+        case 0x84130000u: // tab -> Cyrl
+        case 0x74670000u: // tg -> Cyrl
+        case 0xB5130000u: // tin -> Cyrl
+        case 0x74740000u: // tt -> Cyrl
+        case 0xD7130000u: // tyv -> Cyrl
+        case 0x90740000u: // ude -> Cyrl
+        case 0xA0740000u: // udi -> Cyrl
+        case 0xB0740000u: // udm -> Cyrl
+        case 0x75674B5Au: // ug-KZ -> Cyrl
+        case 0x75674D4Eu: // ug-MN -> Cyrl
+        case 0x9CD40000u: // ugh -> Cyrl
+        case 0x756B0000u: // uk -> Cyrl
+        case 0x89740000u: // ulc -> Cyrl
+        case 0x757A434Eu: // uz-CN -> Cyrl
+        case 0xAC170000u: // xal -> Cyrl
+        case 0xC8170000u: // xas -> Cyrl
+        case 0xC0770000u: // xdq -> Cyrl
+        case 0xB1F70000u: // xpm -> Cyrl
+        case 0xB2370000u: // xrm -> Cyrl
+        case 0xB6370000u: // xrn -> Cyrl
+        case 0xBAD70000u: // xwo -> Cyrl
+        case 0xA0180000u: // yai -> Cyrl
+        case 0x99580000u: // ykg -> Cyrl
+        case 0x9D580000u: // ykh -> Cyrl
+        case 0xA9B80000u: // ynk -> Cyrl
+        case 0xAA380000u: // yrk -> Cyrl
+        case 0xC6580000u: // ysr -> Cyrl
+        case 0x9A980000u: // yug -> Cyrl
+        case 0xDE980000u: // yux -> Cyrl
+        case 0xB9590000u: // zko -> Cyrl
+        case 0xE5590000u: // zkz -> Cyrl
+            return SCRIPT_CODES[20u];
+        case 0xA0C00000u: // agi -> Deva
+        case 0xC4E00000u: // ahr -> Deva
+        case 0xBDA00000u: // anp -> Deva
+        case 0xC1A00000u: // anq -> Deva
+        case 0xC5A00000u: // anr -> Deva
+        case 0x9DE00000u: // aph -> Deva
+        case 0xC6400000u: // asr -> Deva
+        case 0x82C00000u: // awa -> Deva
+        case 0xBC010000u: // bap -> Deva
+        case 0x90810000u: // bee -> Deva
+        case 0x84A10000u: // bfb -> Deva
+        case 0xE0A10000u: // bfy -> Deva
+        case 0xE4A10000u: // bfz -> Deva
+        case 0x88C10000u: // bgc -> Deva
+        case 0x8CC10000u: // bgd -> Deva
+        case 0xC0C10000u: // bgq -> Deva
+        case 0xD8C10000u: // bgw -> Deva
+        case 0x80E10000u: // bha -> Deva
+        case 0x84E10000u: // bhb -> Deva
+        case 0x8CE10000u: // bhd -> Deva
+        case 0xA0E10000u: // bhi -> Deva
+        case 0xA4E10000u: // bhj -> Deva
+        case 0xB8E10000u: // bho -> Deva
+        case 0xCCE10000u: // bht -> Deva
+        case 0xD0E10000u: // bhu -> Deva
+        case 0xE1010000u: // biy -> Deva
+        case 0xA5210000u: // bjj -> Deva
+        case 0xA5810000u: // bmj -> Deva
+        case 0xC9A10000u: // bns -> Deva
+        case 0xDDE10000u: // bpx -> Deva
+        case 0x82210000u: // bra -> Deva
+        case 0x8E210000u: // brd -> Deva
+        case 0xDE210000u: // brx -> Deva
+        case 0xD6610000u: // btv -> Deva
+        case 0x9F010000u: // byh -> Deva
+        case 0xDB010000u: // byw -> Deva
+        case 0x9C620000u: // cdh -> Deva
+        case 0xA4620000u: // cdj -> Deva
+        case 0xB0620000u: // cdm -> Deva
+        case 0xDCE20000u: // chx -> Deva
+        case 0x9D020000u: // cih -> Deva
+        case 0xB6620000u: // ctn -> Deva
+        case 0xC0030000u: // daq -> Deva
+        case 0xA0E30000u: // dhi -> Deva
+        case 0xB8E30000u: // dho -> Deva
+        case 0xD8E30000u: // dhw -> Deva
+        case 0xA1C30000u: // doi -> Deva
+        case 0xC2230000u: // drq -> Deva
+        case 0xE2230000u: // dry -> Deva
+        case 0xE2630000u: // dty -> Deva
+        case 0x9E830000u: // duh -> Deva
+        case 0xCA830000u: // dus -> Deva
+        case 0xE6C30000u: // dwz -> Deva
+        case 0x99840000u: // emg -> Deva
+        case 0xD1840000u: // emu -> Deva
+        case 0xD1850000u: // fmu -> Deva
+        case 0xA8260000u: // gbk -> Deva
+        case 0xB0260000u: // gbm -> Deva
+        case 0xDC660000u: // gdx -> Deva
+        case 0x90E60000u: // ghe -> Deva
+        case 0xA5C60000u: // goj -> Deva
+        case 0xA9C60000u: // gok -> Deva
+        case 0xB5C60000u: // gon -> Deva
+        case 0x82260000u: // gra -> Deva
+        case 0xC6A60000u: // gvr -> Deva
+        case 0xBB060000u: // gyo -> Deva
+        case 0x68690000u: // hi -> Deva
+        case 0x95070000u: // hif -> Deva
+        case 0x85670000u: // hlb -> Deva
+        case 0x91A70000u: // hne -> Deva
+        case 0x89C70000u: // hoc -> Deva
+        case 0xA5C70000u: // hoj -> Deva
+        case 0xE1C70000u: // hoy -> Deva
+        case 0xCE870000u: // hut -> Deva
+        case 0x90890000u: // jee -> Deva
+        case 0xAD890000u: // jml -> Deva
+        case 0xADA90000u: // jnl -> Deva
+        case 0xC9A90000u: // jns -> Deva
+        case 0xAE890000u: // jul -> Deva
+        case 0xDC8A0000u: // kex -> Deva
+        case 0x84AA0000u: // kfb -> Deva
+        case 0xA8AA0000u: // kfk -> Deva
+        case 0xBCAA0000u: // kfp -> Deva
+        case 0xC0AA0000u: // kfq -> Deva
+        case 0xC4AA0000u: // kfr -> Deva
+        case 0xC8AA0000u: // kfs -> Deva
+        case 0xD0AA0000u: // kfu -> Deva
+        case 0xDCAA0000u: // kfx -> Deva
+        case 0xE0AA0000u: // kfy -> Deva
+        case 0xA4CA0000u: // kgj -> Deva
+        case 0xE0CA0000u: // kgy -> Deva
+        case 0xB4EA0000u: // khn -> Deva
+        case 0x950A0000u: // kif -> Deva
+        case 0xBD0A0000u: // kip -> Deva
+        case 0xAD2A0000u: // kjl -> Deva
+        case 0xB92A0000u: // kjo -> Deva
+        case 0xCD4A0000u: // kkt -> Deva
+        case 0x916A0000u: // kle -> Deva
+        case 0xC56A0000u: // klr -> Deva
+        case 0xA58A0000u: // kmj -> Deva
+        case 0xB5AA0000u: // knn -> Deva
+        case 0xA9CA0000u: // kok -> Deva
+        case 0x822A0000u: // kra -> Deva
+        case 0xD22A0000u: // kru -> Deva
+        case 0xE64A0000u: // ksz -> Deva
+        case 0x926A0000u: // kte -> Deva
+        case 0xD70A0000u: // kyv -> Deva
+        case 0xDB0A0000u: // kyw -> Deva
+        case 0x900B0000u: // lae -> Deva
+        case 0x942B0000u: // lbf -> Deva
+        case 0xB02B0000u: // lbm -> Deva
+        case 0xC42B0000u: // lbr -> Deva
+        case 0xB0EB0000u: // lhm -> Deva
+        case 0x950B0000u: // lif -> Deva
+        case 0x9D8B0000u: // lmh -> Deva
+        case 0xE1CB0000u: // loy -> Deva
+        case 0xD28B0000u: // luu -> Deva
+        case 0x980C0000u: // mag -> Deva
+        case 0xA00C0000u: // mai -> Deva
+        case 0xBCCC0000u: // mgp -> Deva
+        case 0xAD2C0000u: // mjl -> Deva
+        case 0xCD2C0000u: // mjt -> Deva
+        case 0xE52C0000u: // mjz -> Deva
+        case 0x854C0000u: // mkb -> Deva
+        case 0x914C0000u: // mke -> Deva
+        case 0x6D720000u: // mr -> Deva
+        case 0x8E2C0000u: // mrd -> Deva
+        case 0xC62C0000u: // mrr -> Deva
+        case 0xC66C0000u: // mtr -> Deva
+        case 0xCE8C0000u: // mut -> Deva
+        case 0xC6CC0000u: // mwr -> Deva
+        case 0xB80D0000u: // nao -> Deva
+        case 0x8C4D0000u: // ncd -> Deva
+        case 0x6E650000u: // ne -> Deva
+        case 0xD88D0000u: // new -> Deva
+        case 0xDD6D0000u: // nlx -> Deva
+        case 0xB18D0000u: // nmm -> Deva
+        case 0x91CD0000u: // noe -> Deva
+        case 0xA1CD0000u: // noi -> Deva
+        case 0xDECD0000u: // nwx -> Deva
+        case 0x816E0000u: // ola -> Deva
+        case 0xB5CE0000u: // oon -> Deva
+        case 0x9C4F0000u: // pch -> Deva
+        case 0xA04F0000u: // pci -> Deva
+        case 0x98CF0000u: // pgg -> Deva
+        case 0x8CEF0000u: // phd -> Deva
+        case 0xD8EF0000u: // phw -> Deva
+        case 0xB28F0000u: // pum -> Deva
+        case 0xC6CF0000u: // pwr -> Deva
+        case 0x80110000u: // raa -> Deva
+        case 0x84110000u: // rab -> Deva
+        case 0x94110000u: // raf -> Deva
+        case 0xA4110000u: // raj -> Deva
+        case 0xD4110000u: // rav -> Deva
+        case 0xA1310000u: // rji -> Deva
+        case 0xC9310000u: // rjs -> Deva
+        case 0xDA710000u: // rtw -> Deva
+        case 0xC6D10000u: // rwr -> Deva
+        case 0x73610000u: // sa -> Deva
+        case 0xA8520000u: // sck -> Deva
+        case 0xBC520000u: // scp -> Deva
+        case 0x7364494Eu: // sd-IN -> Deva
+        case 0xA4D20000u: // sgj -> Deva
+        case 0xBD320000u: // sjp -> Deva
+        case 0xA5520000u: // skj -> Deva
+        case 0xA1D20000u: // soi -> Deva
+        case 0xDE320000u: // srx -> Deva
+        case 0xD6D20000u: // swv -> Deva
+        case 0xDB120000u: // syw -> Deva
+        case 0xA4130000u: // taj -> Deva
+        case 0x84730000u: // tdb -> Deva
+        case 0x98730000u: // tdg -> Deva
+        case 0x9C730000u: // tdh -> Deva
+        case 0x90D30000u: // tge -> Deva
+        case 0x90F30000u: // the -> Deva
+        case 0x94F30000u: // thf -> Deva
+        case 0xACF30000u: // thl -> Deva
+        case 0xC0F30000u: // thq -> Deva
+        case 0xC4F30000u: // thr -> Deva
+        case 0xC8F30000u: // ths -> Deva
+        case 0xA5130000u: // tij -> Deva
+        case 0x85530000u: // tkb -> Deva
+        case 0xCD530000u: // tkt -> Deva
+        case 0xE6730000u: // ttz -> Deva
+        case 0xB2D30000u: // twm -> Deva
+        case 0xC5B44E50u: // unr-NP -> Deva
+        case 0x9C150000u: // vah -> Deva
+        case 0xC8150000u: // vas -> Deva
+        case 0xD4150000u: // vav -> Deva
+        case 0xE0150000u: // vay -> Deva
+        case 0xA9350000u: // vjk -> Deva
+        case 0xC4360000u: // wbr -> Deva
+        case 0x91960000u: // wme -> Deva
+        case 0xB2760000u: // wtm -> Deva
+        case 0xC5B70000u: // xnr -> Deva
+        case 0xC6570000u: // xsr -> Deva
+        case 0x9C380000u: // ybh -> Deva
+        case 0xA0380000u: // ybi -> Deva
+            return SCRIPT_CODES[21u];
+        case 0xE0C40000u: // egy -> Egyp
+            return SCRIPT_CODES[22u];
+        case 0xE1770000u: // xly -> Elym
+            return SCRIPT_CODES[23u];
+        case 0xA4C00000u: // agj -> Ethi
+        case 0x98E00000u: // ahg -> Ethi
+        case 0xD9600000u: // alw -> Ethi
+        case 0x616D0000u: // am -> Ethi
+        case 0xD1A00000u: // anu -> Ethi
+        case 0xB6C00000u: // awn -> Ethi
+        case 0xC0410000u: // bcq -> Ethi
+        case 0xCE410000u: // bst -> Ethi
+        case 0xB7010000u: // byn -> Ethi
+        case 0xDDC30000u: // dox -> Ethi
+        case 0xCA230000u: // drs -> Ethi
+        case 0xE4860000u: // gez -> Ethi
+        case 0xD5860000u: // gmv -> Ethi
+        case 0x95C60000u: // gof -> Ethi
+        case 0xD2260000u: // gru -> Ethi
+        case 0xC4070000u: // har -> Ethi
+        case 0xE0670000u: // hdy -> Ethi
+        case 0xC5C80000u: // ior -> Ethi
+        case 0xE20A0000u: // kqy -> Ethi
+        case 0x866A0000u: // ktb -> Ethi
+        case 0xDC6C0000u: // mdx -> Ethi
+        case 0xE06C0000u: // mdy -> Ethi
+        case 0xE68C0000u: // muz -> Ethi
+        case 0xE6AC0000u: // mvz -> Ethi
+        case 0xB30C0000u: // mym -> Ethi
+        case 0xD8D20000u: // sgw -> Ethi
+        case 0xD6720000u: // stv -> Ethi
+        case 0x74690000u: // ti -> Ethi
+        case 0x99130000u: // tig -> Ethi
+        case 0xAC160000u: // wal -> Ethi
+        case 0x91760000u: // wle -> Ethi
+        case 0xB4170000u: // xan -> Ethi
+        case 0x82D90000u: // zwa -> Ethi
+            return SCRIPT_CODES[24u];
+        case 0xAC210000u: // bbl -> Geor
+        case 0x90C90000u: // jge -> Geor
+        case 0x6B610000u: // ka -> Geor
+        case 0xD40E0000u: // oav -> Geor
+        case 0x82B20000u: // sva -> Geor
+        case 0x95970000u: // xmf -> Geor
+            return SCRIPT_CODES[25u];
+        case 0x9A560000u: // wsg -> Gong
+            return SCRIPT_CODES[26u];
+        case 0x9A440000u: // esg -> Gonm
+            return SCRIPT_CODES[27u];
+        case 0xCDC60000u: // got -> Goth
+            return SCRIPT_CODES[28u];
+        case 0xE26E0000u: // oty -> Gran
+            return SCRIPT_CODES[29u];
+        case 0xCC000000u: // aat -> Grek
+        case 0xDCC10000u: // bgx -> Grek
+        case 0x99E20000u: // cpg -> Grek
+        case 0xC4440000u: // ecr -> Grek
+        case 0x656C0000u: // el -> Grek
+        case 0xCDAF0000u: // pnt -> Grek
+        case 0xDC520000u: // scx -> Grek
+        case 0x8E530000u: // tsd -> Grek
+        case 0xB2940000u: // uum -> Grek
+        case 0x99F70000u: // xpg -> Grek
+        case 0xA4980000u: // yej -> Grek
+            return SCRIPT_CODES[30u];
+        case 0xA0620000u: // cdi -> Gujr
+        case 0xB4E30000u: // dhn -> Gujr
+        case 0x86830000u: // dub -> Gujr
+        case 0xC8060000u: // gas -> Gujr
+        case 0xAC260000u: // gbl -> Gujr
+        case 0x67750000u: // gu -> Gujr
+            return SCRIPT_CODES[31u];
+        case 0x70610000u: // pa -> Guru
+            return SCRIPT_CODES[32u];
+        case 0x91290000u: // jje -> Hang
+        case 0xB14E0000u: // okm -> Hang
+            return SCRIPT_CODES[33u];
+        case 0xD9C70000u: // how -> Hani
+        case 0xB94E0000u: // oko -> Hani
+        case 0xA2D20000u: // swi -> Hani
+        case 0x9C590000u: // zch -> Hani
+        case 0x9C990000u: // zeh -> Hani
+        case 0x84D90000u: // zgb -> Hani
+        case 0xB0D90000u: // zgm -> Hani
+        case 0xB4D90000u: // zgn -> Hani
+        case 0x8CF90000u: // zhd -> Hani
+        case 0xA5790000u: // zlj -> Hani
+        case 0xB5790000u: // zln -> Hani
+        case 0xC1790000u: // zlq -> Hani
+        case 0x92190000u: // zqe -> Hani
+        case 0x9B190000u: // zyg -> Hani
+        case 0xB7190000u: // zyn -> Hani
+        case 0xA7390000u: // zzj -> Hani
+            return SCRIPT_CODES[34u];
+        case 0xB8620000u: // cdo -> Hans
+        case 0xE1220000u: // cjy -> Hans
+        case 0xBDA20000u: // cnp -> Hans
+        case 0xBE420000u: // csp -> Hans
+        case 0x9F220000u: // czh -> Hans
+        case 0xB4060000u: // gan -> Hans
+        case 0xA8070000u: // hak -> Hans
+        case 0xB6470000u: // hsn -> Hans
+        case 0x9F2B0000u: // lzh -> Hans
+        case 0xB40D0000u: // nan -> Hans
+        case 0xD2960000u: // wuu -> Hans
+        case 0x9298434Eu: // yue-CN -> Hans
+        case 0x7A680000u: // zh -> Hans
+            return SCRIPT_CODES[35u];
+        case 0x8A6B0000u: // ltc -> Hant
+        case 0x92980000u: // yue -> Hant
+        case 0x7A684155u: // zh-AU -> Hant
+        case 0x7A68424Eu: // zh-BN -> Hant
+        case 0x7A684742u: // zh-GB -> Hant
+        case 0x7A684746u: // zh-GF -> Hant
+        case 0x7A68484Bu: // zh-HK -> Hant
+        case 0x7A684944u: // zh-ID -> Hant
+        case 0x7A684D4Fu: // zh-MO -> Hant
+        case 0x7A685041u: // zh-PA -> Hant
+        case 0x7A685046u: // zh-PF -> Hant
+        case 0x7A685048u: // zh-PH -> Hant
+        case 0x7A685352u: // zh-SR -> Hant
+        case 0x7A685448u: // zh-TH -> Hant
+        case 0x7A685457u: // zh-TW -> Hant
+        case 0x7A685553u: // zh-US -> Hant
+        case 0x7A68564Eu: // zh-VN -> Hant
+            return SCRIPT_CODES[36u];
+        case 0xA5000000u: // aij -> Hebr
+        case 0xAB220000u: // czk -> Hebr
+        case 0xB8270000u: // hbo -> Hebr
+        case 0x68650000u: // he -> Hebr
+        case 0xE2870000u: // huy -> Hebr
+        case 0xAA680000u: // itk -> Hebr
+        case 0x69770000u: // iw -> Hebr
+        case 0x90290000u: // jbe -> Hebr
+        case 0x6A690000u: // ji -> Hebr
+        case 0x81E90000u: // jpa -> Hebr
+        case 0xC5E90000u: // jpr -> Hebr
+        case 0x86290000u: // jrb -> Hebr
+        case 0x93090000u: // jye -> Hebr
+        case 0x8C0B0000u: // lad -> Hebr
+        case 0x8E4B0000u: // lsd -> Hebr
+        case 0x9A330000u: // trg -> Hebr
+        case 0x8CF80000u: // yhd -> Hebr
+        case 0x79690000u: // yi -> Hebr
+        case 0x9D180000u: // yih -> Hebr
+        case 0x8E980000u: // yud -> Hebr
+        case 0xBE390000u: // zrp -> Hebr
+            return SCRIPT_CODES[37u];
+        case 0xD1670000u: // hlu -> Hluw
+            return SCRIPT_CODES[38u];
+        case 0xA5A70000u: // hnj -> Hmnp
+        case 0xDACC0000u: // mww -> Hmnp
+            return SCRIPT_CODES[39u];
+        case 0xCE640000u: // ett -> Ital
+        case 0x8A4E0000u: // osc -> Ital
+        case 0xB4CF0000u: // pgn -> Ital
+        case 0x92B70000u: // xve -> Ital
+            return SCRIPT_CODES[40u];
+        case 0xA24E0000u: // osi -> Java
+        case 0xC8930000u: // tes -> Java
+            return SCRIPT_CODES[41u];
+        case 0xC9800000u: // ams -> Jpan
+        case 0x6A610000u: // ja -> Jpan
+        case 0xA1D80000u: // yoi -> Jpan
+            return SCRIPT_CODES[42u];
+        case 0xE1440000u: // eky -> Kali
+        case 0xE2AA0000u: // kvy -> Kali
+        case 0xD30A0000u: // kyu -> Kali
+            return SCRIPT_CODES[43u];
+        case 0xB5000000u: // ain -> Kana
+        case 0xD3110000u: // ryu -> Kana
+            return SCRIPT_CODES[44u];
+        case 0xD80A0000u: // kaw -> Kawi
+            return SCRIPT_CODES[45u];
+        case 0x8CCF0000u: // pgd -> Khar
+        case 0x822F0000u: // pra -> Khar
+            return SCRIPT_CODES[46u];
+        case 0x86210000u: // brb -> Khmr
+        case 0x6B6D0000u: // km -> Khmr
+        case 0xC62A0000u: // krr -> Khmr
+        case 0xD62A0000u: // krv -> Khmr
+        case 0xE54E0000u: // okz -> Khmr
+        case 0x844F0000u: // pcb -> Khmr
+        case 0x81510000u: // rka -> Khmr
+        case 0xD1920000u: // smu -> Khmr
+        case 0xD1F30000u: // tpu -> Khmr
+        case 0xB0F70000u: // xhm -> Khmr
+            return SCRIPT_CODES[47u];
+        case 0xCD590000u: // zkt -> Kits
+            return SCRIPT_CODES[48u];
+        case 0xDA210000u: // brw -> Knda
+        case 0x80AA0000u: // kfa -> Knda
+        case 0x8CAA0000u: // kfd -> Knda
+        case 0x98AA0000u: // kfg -> Knda
+        case 0x6B6E0000u: // kn -> Knda
+        case 0xE0530000u: // tcy -> Knda
+        case 0x8D950000u: // vmd -> Knda
+            return SCRIPT_CODES[49u];
+        case 0x6B6F0000u: // ko -> Kore
+            return SCRIPT_CODES[50u];
+        case 0xD2820000u: // cuu -> Lana
+        case 0x9D4A0000u: // kkh -> Lana
+        case 0x8DCD0000u: // nod -> Lana
+            return SCRIPT_CODES[51u];
+        case 0xA9600000u: // alk -> Laoo
+        case 0xD6210000u: // brv -> Laoo
+        case 0x992A0000u: // kjg -> Laoo
+        case 0x968A0000u: // kuf -> Laoo
+        case 0xB82B0000u: // lbo -> Laoo
+        case 0x6C6F0000u: // lo -> Laoo
+        case 0xC04D0000u: // ncq -> Laoo
+        case 0xCCCD0000u: // ngt -> Laoo
+        case 0xB8EF0000u: // pho -> Laoo
+        case 0xCC520000u: // sct -> Laoo
+        case 0xC2120000u: // sqq -> Laoo
+        case 0xCA520000u: // sss -> Laoo
+        case 0x9E730000u: // tth -> Laoo
+        case 0xBA730000u: // tto -> Laoo
+            return SCRIPT_CODES[52u];
+        case 0xAD860000u: // gml -> Latf
+            return SCRIPT_CODES[53u];
+        case 0x80CC0000u: // mga -> Latg
+            return SCRIPT_CODES[54u];
+        case 0x61610000u: // aa -> Latn
+        case 0x80000000u: // aaa -> Latn
+        case 0x84000000u: // aab -> Latn
+        case 0x88000000u: // aac -> Latn
+        case 0x8C000000u: // aad -> Latn
+        case 0x90000000u: // aae -> Latn
+        case 0x98000000u: // aag -> Latn
+        case 0x9C000000u: // aah -> Latn
+        case 0xA0000000u: // aai -> Latn
+        case 0xA8000000u: // aak -> Latn
+        case 0xAC000000u: // aal -> Latn
+        case 0xB4000000u: // aan -> Latn
+        case 0xBC000000u: // aap -> Latn
+        case 0xC0000000u: // aaq -> Latn
+        case 0xC8000000u: // aas -> Latn
+        case 0xD0000000u: // aau -> Latn
+        case 0xD8000000u: // aaw -> Latn
+        case 0xDC000000u: // aax -> Latn
+        case 0xE4000000u: // aaz -> Latn
+        case 0x80200000u: // aba -> Latn
+        case 0x84200000u: // abb -> Latn
+        case 0x88200000u: // abc -> Latn
+        case 0x8C200000u: // abd -> Latn
+        case 0x90200000u: // abe -> Latn
+        case 0x94200000u: // abf -> Latn
+        case 0x98200000u: // abg -> Latn
+        case 0xA0200000u: // abi -> Latn
+        case 0xB0200000u: // abm -> Latn
+        case 0xB4200000u: // abn -> Latn
+        case 0xB8200000u: // abo -> Latn
+        case 0xBC200000u: // abp -> Latn
+        case 0xC4200000u: // abr -> Latn
+        case 0xC8200000u: // abs -> Latn
+        case 0xCC200000u: // abt -> Latn
+        case 0xD0200000u: // abu -> Latn
+        case 0xD8200000u: // abw -> Latn
+        case 0xDC200000u: // abx -> Latn
+        case 0xE0200000u: // aby -> Latn
+        case 0xE4200000u: // abz -> Latn
+        case 0x80400000u: // aca -> Latn
+        case 0x84400000u: // acb -> Latn
+        case 0x8C400000u: // acd -> Latn
+        case 0x90400000u: // ace -> Latn
+        case 0x94400000u: // acf -> Latn
+        case 0x9C400000u: // ach -> Latn
+        case 0xB4400000u: // acn -> Latn
+        case 0xBC400000u: // acp -> Latn
+        case 0xC4400000u: // acr -> Latn
+        case 0xC8400000u: // acs -> Latn
+        case 0xCC400000u: // act -> Latn
+        case 0xD0400000u: // acu -> Latn
+        case 0xD4400000u: // acv -> Latn
+        case 0xE0400000u: // acy -> Latn
+        case 0xE4400000u: // acz -> Latn
+        case 0x80600000u: // ada -> Latn
+        case 0x84600000u: // adb -> Latn
+        case 0x8C600000u: // add -> Latn
+        case 0x90600000u: // ade -> Latn
+        case 0x98600000u: // adg -> Latn
+        case 0x9C600000u: // adh -> Latn
+        case 0xA0600000u: // adi -> Latn
+        case 0xA4600000u: // adj -> Latn
+        case 0xAC600000u: // adl -> Latn
+        case 0xB4600000u: // adn -> Latn
+        case 0xB8600000u: // ado -> Latn
+        case 0xC0600000u: // adq -> Latn
+        case 0xC4600000u: // adr -> Latn
+        case 0xCC600000u: // adt -> Latn
+        case 0xD0600000u: // adu -> Latn
+        case 0xD8600000u: // adw -> Latn
+        case 0xE4600000u: // adz -> Latn
+        case 0x80800000u: // aea -> Latn
+        case 0xA8800000u: // aek -> Latn
+        case 0xAC800000u: // ael -> Latn
+        case 0xB0800000u: // aem -> Latn
+        case 0xC4800000u: // aer -> Latn
+        case 0xD0800000u: // aeu -> Latn
+        case 0xD8800000u: // aew -> Latn
+        case 0xE0800000u: // aey -> Latn
+        case 0xE4800000u: // aez -> Latn
+        case 0x61660000u: // af -> Latn
+        case 0x8CA00000u: // afd -> Latn
+        case 0x90A00000u: // afe -> Latn
+        case 0x9CA00000u: // afh -> Latn
+        case 0xA0A00000u: // afi -> Latn
+        case 0xA8A00000u: // afk -> Latn
+        case 0xB4A00000u: // afn -> Latn
+        case 0xB8A00000u: // afo -> Latn
+        case 0xBCA00000u: // afp -> Latn
+        case 0xC8A00000u: // afs -> Latn
+        case 0xD0A00000u: // afu -> Latn
+        case 0xE4A00000u: // afz -> Latn
+        case 0x80C00000u: // aga -> Latn
+        case 0x84C00000u: // agb -> Latn
+        case 0x88C00000u: // agc -> Latn
+        case 0x8CC00000u: // agd -> Latn
+        case 0x90C00000u: // age -> Latn
+        case 0x94C00000u: // agf -> Latn
+        case 0x98C00000u: // agg -> Latn
+        case 0x9CC00000u: // agh -> Latn
+        case 0xA8C00000u: // agk -> Latn
+        case 0xACC00000u: // agl -> Latn
+        case 0xB0C00000u: // agm -> Latn
+        case 0xB4C00000u: // agn -> Latn
+        case 0xB8C00000u: // ago -> Latn
+        case 0xC0C00000u: // agq -> Latn
+        case 0xC4C00000u: // agr -> Latn
+        case 0xC8C00000u: // ags -> Latn
+        case 0xCCC00000u: // agt -> Latn
+        case 0xD0C00000u: // agu -> Latn
+        case 0xD4C00000u: // agv -> Latn
+        case 0xD8C00000u: // agw -> Latn
+        case 0xE0C00000u: // agy -> Latn
+        case 0xE4C00000u: // agz -> Latn
+        case 0x80E00000u: // aha -> Latn
+        case 0x84E00000u: // ahb -> Latn
+        case 0x9CE00000u: // ahh -> Latn
+        case 0xA0E00000u: // ahi -> Latn
+        case 0xA8E00000u: // ahk -> Latn
+        case 0xACE00000u: // ahl -> Latn
+        case 0xB0E00000u: // ahm -> Latn
+        case 0xB4E00000u: // ahn -> Latn
+        case 0xBCE00000u: // ahp -> Latn
+        case 0xC8E00000u: // ahs -> Latn
+        case 0xCCE00000u: // aht -> Latn
+        case 0x81000000u: // aia -> Latn
+        case 0x89000000u: // aic -> Latn
+        case 0x8D000000u: // aid -> Latn
+        case 0x91000000u: // aie -> Latn
+        case 0x95000000u: // aif -> Latn
+        case 0x99000000u: // aig -> Latn
+        case 0xA9000000u: // aik -> Latn
+        case 0xAD000000u: // ail -> Latn
+        case 0xB1000000u: // aim -> Latn
+        case 0xBD000000u: // aip -> Latn
+        case 0xC5000000u: // air -> Latn
+        case 0xCD000000u: // ait -> Latn
+        case 0xD9000000u: // aiw -> Latn
+        case 0xDD000000u: // aix -> Latn
+        case 0xE1000000u: // aiy -> Latn
+        case 0x81200000u: // aja -> Latn
+        case 0x99200000u: // ajg -> Latn
+        case 0xA1200000u: // aji -> Latn
+        case 0xB5200000u: // ajn -> Latn
+        case 0xD9200000u: // ajw -> Latn
+        case 0xE5200000u: // ajz -> Latn
+        case 0x616B0000u: // ak -> Latn
+        case 0x85400000u: // akb -> Latn
+        case 0x89400000u: // akc -> Latn
+        case 0x8D400000u: // akd -> Latn
+        case 0x91400000u: // ake -> Latn
+        case 0x95400000u: // akf -> Latn
+        case 0x99400000u: // akg -> Latn
+        case 0x9D400000u: // akh -> Latn
+        case 0xA1400000u: // aki -> Latn
+        case 0xAD400000u: // akl -> Latn
+        case 0xB9400000u: // ako -> Latn
+        case 0xBD400000u: // akp -> Latn
+        case 0xC1400000u: // akq -> Latn
+        case 0xC5400000u: // akr -> Latn
+        case 0xC9400000u: // aks -> Latn
+        case 0xCD400000u: // akt -> Latn
+        case 0xD1400000u: // aku -> Latn
+        case 0xD9400000u: // akw -> Latn
+        case 0xE5400000u: // akz -> Latn
+        case 0x81600000u: // ala -> Latn
+        case 0x89600000u: // alc -> Latn
+        case 0x8D600000u: // ald -> Latn
+        case 0x91600000u: // ale -> Latn
+        case 0x95600000u: // alf -> Latn
+        case 0x9D600000u: // alh -> Latn
+        case 0xA1600000u: // ali -> Latn
+        case 0xA5600000u: // alj -> Latn
+        case 0xB1600000u: // alm -> Latn
+        case 0xB5600000u: // aln -> Latn
+        case 0xB9600000u: // alo -> Latn
+        case 0xBD600000u: // alp -> Latn
+        case 0xC1600000u: // alq -> Latn
+        case 0xD1600000u: // alu -> Latn
+        case 0xDD600000u: // alx -> Latn
+        case 0xE1600000u: // aly -> Latn
+        case 0xE5600000u: // alz -> Latn
+        case 0x81800000u: // ama -> Latn
+        case 0x85800000u: // amb -> Latn
+        case 0x89800000u: // amc -> Latn
+        case 0x91800000u: // ame -> Latn
+        case 0x95800000u: // amf -> Latn
+        case 0x99800000u: // amg -> Latn
+        case 0xA1800000u: // ami -> Latn
+        case 0xA5800000u: // amj -> Latn
+        case 0xA9800000u: // amk -> Latn
+        case 0xB1800000u: // amm -> Latn
+        case 0xB5800000u: // amn -> Latn
+        case 0xB9800000u: // amo -> Latn
+        case 0xBD800000u: // amp -> Latn
+        case 0xC1800000u: // amq -> Latn
+        case 0xC5800000u: // amr -> Latn
+        case 0xCD800000u: // amt -> Latn
+        case 0xD1800000u: // amu -> Latn
+        case 0xD5800000u: // amv -> Latn
+        case 0xDD800000u: // amx -> Latn
+        case 0xE1800000u: // amy -> Latn
+        case 0xE5800000u: // amz -> Latn
+        case 0x616E0000u: // an -> Latn
+        case 0x81A00000u: // ana -> Latn
+        case 0x85A00000u: // anb -> Latn
+        case 0x89A00000u: // anc -> Latn
+        case 0x8DA00000u: // and -> Latn
+        case 0x91A00000u: // ane -> Latn
+        case 0x95A00000u: // anf -> Latn
+        case 0x99A00000u: // ang -> Latn
+        case 0x9DA00000u: // anh -> Latn
+        case 0xA5A00000u: // anj -> Latn
+        case 0xA9A00000u: // ank -> Latn
+        case 0xADA00000u: // anl -> Latn
+        case 0xB1A00000u: // anm -> Latn
+        case 0xB5A00000u: // ann -> Latn
+        case 0xB9A00000u: // ano -> Latn
+        case 0xC9A00000u: // ans -> Latn
+        case 0xCDA00000u: // ant -> Latn
+        case 0xD5A00000u: // anv -> Latn
+        case 0xD9A00000u: // anw -> Latn
+        case 0xDDA00000u: // anx -> Latn
+        case 0xE1A00000u: // any -> Latn
+        case 0xE5A00000u: // anz -> Latn
+        case 0x81C00000u: // aoa -> Latn
+        case 0x85C00000u: // aob -> Latn
+        case 0x89C00000u: // aoc -> Latn
+        case 0x8DC00000u: // aod -> Latn
+        case 0x91C00000u: // aoe -> Latn
+        case 0x95C00000u: // aof -> Latn
+        case 0x99C00000u: // aog -> Latn
+        case 0xA1C00000u: // aoi -> Latn
+        case 0xA5C00000u: // aoj -> Latn
+        case 0xA9C00000u: // aok -> Latn
+        case 0xADC00000u: // aol -> Latn
+        case 0xB1C00000u: // aom -> Latn
+        case 0xB5C00000u: // aon -> Latn
+        case 0xC5C00000u: // aor -> Latn
+        case 0xC9C00000u: // aos -> Latn
+        case 0xDDC00000u: // aox -> Latn
+        case 0xE5C00000u: // aoz -> Latn
+        case 0x85E00000u: // apb -> Latn
+        case 0x91E00000u: // ape -> Latn
+        case 0x95E00000u: // apf -> Latn
+        case 0x99E00000u: // apg -> Latn
+        case 0xA1E00000u: // api -> Latn
+        case 0xA5E00000u: // apj -> Latn
+        case 0xA9E00000u: // apk -> Latn
+        case 0xADE00000u: // apl -> Latn
+        case 0xB1E00000u: // apm -> Latn
+        case 0xB5E00000u: // apn -> Latn
+        case 0xB9E00000u: // apo -> Latn
+        case 0xBDE00000u: // app -> Latn
+        case 0xC5E00000u: // apr -> Latn
+        case 0xC9E00000u: // aps -> Latn
+        case 0xCDE00000u: // apt -> Latn
+        case 0xD1E00000u: // apu -> Latn
+        case 0xD5E00000u: // apv -> Latn
+        case 0xD9E00000u: // apw -> Latn
+        case 0xDDE00000u: // apx -> Latn
+        case 0xE1E00000u: // apy -> Latn
+        case 0xE5E00000u: // apz -> Latn
+        case 0x8E000000u: // aqd -> Latn
+        case 0x9A000000u: // aqg -> Latn
+        case 0xAA000000u: // aqk -> Latn
+        case 0xB2000000u: // aqm -> Latn
+        case 0xB6000000u: // aqn -> Latn
+        case 0xC6000000u: // aqr -> Latn
+        case 0xCE000000u: // aqt -> Latn
+        case 0xE6000000u: // aqz -> Latn
+        case 0x8E200000u: // ard -> Latn
+        case 0x92200000u: // are -> Latn
+        case 0x9E200000u: // arh -> Latn
+        case 0xA2200000u: // ari -> Latn
+        case 0xA6200000u: // arj -> Latn
+        case 0xAA200000u: // ark -> Latn
+        case 0xAE200000u: // arl -> Latn
+        case 0xB6200000u: // arn -> Latn
+        case 0xBA200000u: // aro -> Latn
+        case 0xBE200000u: // arp -> Latn
+        case 0xC6200000u: // arr -> Latn
+        case 0xD2200000u: // aru -> Latn
+        case 0xDA200000u: // arw -> Latn
+        case 0xDE200000u: // arx -> Latn
+        case 0x82400000u: // asa -> Latn
+        case 0x86400000u: // asb -> Latn
+        case 0x8A400000u: // asc -> Latn
+        case 0x9A400000u: // asg -> Latn
+        case 0x9E400000u: // ash -> Latn
+        case 0xA2400000u: // asi -> Latn
+        case 0xA6400000u: // asj -> Latn
+        case 0xAE400000u: // asl -> Latn
+        case 0xB6400000u: // asn -> Latn
+        case 0xBA400000u: // aso -> Latn
+        case 0xCA400000u: // ass -> Latn
+        case 0xCE400000u: // ast -> Latn
+        case 0xD2400000u: // asu -> Latn
+        case 0xD6400000u: // asv -> Latn
+        case 0xDE400000u: // asx -> Latn
+        case 0xE2400000u: // asy -> Latn
+        case 0xE6400000u: // asz -> Latn
+        case 0x82600000u: // ata -> Latn
+        case 0x86600000u: // atb -> Latn
+        case 0x8A600000u: // atc -> Latn
+        case 0x8E600000u: // atd -> Latn
+        case 0x92600000u: // ate -> Latn
+        case 0x9A600000u: // atg -> Latn
+        case 0xA2600000u: // ati -> Latn
+        case 0xA6600000u: // atj -> Latn
+        case 0xAA600000u: // atk -> Latn
+        case 0xAE600000u: // atl -> Latn
+        case 0xB2600000u: // atm -> Latn
+        case 0xBA600000u: // ato -> Latn
+        case 0xBE600000u: // atp -> Latn
+        case 0xC2600000u: // atq -> Latn
+        case 0xC6600000u: // atr -> Latn
+        case 0xCA600000u: // ats -> Latn
+        case 0xCE600000u: // att -> Latn
+        case 0xD2600000u: // atu -> Latn
+        case 0xDA600000u: // atw -> Latn
+        case 0xDE600000u: // atx -> Latn
+        case 0xE2600000u: // aty -> Latn
+        case 0xE6600000u: // atz -> Latn
+        case 0x82800000u: // aua -> Latn
+        case 0x8A800000u: // auc -> Latn
+        case 0x8E800000u: // aud -> Latn
+        case 0x9A800000u: // aug -> Latn
+        case 0x9E800000u: // auh -> Latn
+        case 0xA2800000u: // aui -> Latn
+        case 0xAA800000u: // auk -> Latn
+        case 0xAE800000u: // aul -> Latn
+        case 0xB2800000u: // aum -> Latn
+        case 0xB6800000u: // aun -> Latn
+        case 0xBA800000u: // auo -> Latn
+        case 0xBE800000u: // aup -> Latn
+        case 0xC2800000u: // auq -> Latn
+        case 0xC6800000u: // aur -> Latn
+        case 0xCE800000u: // aut -> Latn
+        case 0xD2800000u: // auu -> Latn
+        case 0xDA800000u: // auw -> Latn
+        case 0xE2800000u: // auy -> Latn
+        case 0x86A00000u: // avb -> Latn
+        case 0xA2A00000u: // avi -> Latn
+        case 0xAAA00000u: // avk -> Latn
+        case 0xB2A00000u: // avm -> Latn
+        case 0xB6A00000u: // avn -> Latn
+        case 0xBAA00000u: // avo -> Latn
+        case 0xCAA00000u: // avs -> Latn
+        case 0xCEA00000u: // avt -> Latn
+        case 0xD2A00000u: // avu -> Latn
+        case 0xD6A00000u: // avv -> Latn
+        case 0x86C00000u: // awb -> Latn
+        case 0x8AC00000u: // awc -> Latn
+        case 0x92C00000u: // awe -> Latn
+        case 0x9AC00000u: // awg -> Latn
+        case 0x9EC00000u: // awh -> Latn
+        case 0xA2C00000u: // awi -> Latn
+        case 0xAAC00000u: // awk -> Latn
+        case 0xB2C00000u: // awm -> Latn
+        case 0xBAC00000u: // awo -> Latn
+        case 0xC6C00000u: // awr -> Latn
+        case 0xCAC00000u: // aws -> Latn
+        case 0xCEC00000u: // awt -> Latn
+        case 0xD2C00000u: // awu -> Latn
+        case 0xD6C00000u: // awv -> Latn
+        case 0xDAC00000u: // aww -> Latn
+        case 0xDEC00000u: // awx -> Latn
+        case 0xE2C00000u: // awy -> Latn
+        case 0x86E00000u: // axb -> Latn
+        case 0x92E00000u: // axe -> Latn
+        case 0x9AE00000u: // axg -> Latn
+        case 0xAAE00000u: // axk -> Latn
+        case 0xAEE00000u: // axl -> Latn
+        case 0xDEE00000u: // axx -> Latn
+        case 0x61790000u: // ay -> Latn
+        case 0x83000000u: // aya -> Latn
+        case 0x87000000u: // ayb -> Latn
+        case 0x8B000000u: // ayc -> Latn
+        case 0x8F000000u: // ayd -> Latn
+        case 0x93000000u: // aye -> Latn
+        case 0x9B000000u: // ayg -> Latn
+        case 0xA3000000u: // ayi -> Latn
+        case 0xAB000000u: // ayk -> Latn
+        case 0xBB000000u: // ayo -> Latn
+        case 0xC3000000u: // ayq -> Latn
+        case 0xCB000000u: // ays -> Latn
+        case 0xCF000000u: // ayt -> Latn
+        case 0xD3000000u: // ayu -> Latn
+        case 0xE7000000u: // ayz -> Latn
+        case 0x617A0000u: // az -> Latn
+        case 0x8F200000u: // azd -> Latn
+        case 0x9B200000u: // azg -> Latn
+        case 0xB3200000u: // azm -> Latn
+        case 0xB7200000u: // azn -> Latn
+        case 0xBB200000u: // azo -> Latn
+        case 0xCF200000u: // azt -> Latn
+        case 0xE7200000u: // azz -> Latn
+        case 0x80010000u: // baa -> Latn
+        case 0x84010000u: // bab -> Latn
+        case 0x88010000u: // bac -> Latn
+        case 0x90010000u: // bae -> Latn
+        case 0x94010000u: // baf -> Latn
+        case 0x98010000u: // bag -> Latn
+        case 0x9C010000u: // bah -> Latn
+        case 0xA4010000u: // baj -> Latn
+        case 0xB4010000u: // ban -> Latn
+        case 0xB8010000u: // bao -> Latn
+        case 0xC4010000u: // bar -> Latn
+        case 0xC8010000u: // bas -> Latn
+        case 0xD0010000u: // bau -> Latn
+        case 0xD4010000u: // bav -> Latn
+        case 0xD8010000u: // baw -> Latn
+        case 0xE0010000u: // bay -> Latn
+        case 0x80210000u: // bba -> Latn
+        case 0x84210000u: // bbb -> Latn
+        case 0x88210000u: // bbc -> Latn
+        case 0x8C210000u: // bbd -> Latn
+        case 0x90210000u: // bbe -> Latn
+        case 0x94210000u: // bbf -> Latn
+        case 0x98210000u: // bbg -> Latn
+        case 0xA0210000u: // bbi -> Latn
+        case 0xA4210000u: // bbj -> Latn
+        case 0xA8210000u: // bbk -> Latn
+        case 0xB0210000u: // bbm -> Latn
+        case 0xB4210000u: // bbn -> Latn
+        case 0xB8210000u: // bbo -> Latn
+        case 0xBC210000u: // bbp -> Latn
+        case 0xC0210000u: // bbq -> Latn
+        case 0xC4210000u: // bbr -> Latn
+        case 0xC8210000u: // bbs -> Latn
+        case 0xCC210000u: // bbt -> Latn
+        case 0xD0210000u: // bbu -> Latn
+        case 0xD4210000u: // bbv -> Latn
+        case 0xD8210000u: // bbw -> Latn
+        case 0xDC210000u: // bbx -> Latn
+        case 0xE0210000u: // bby -> Latn
+        case 0x80410000u: // bca -> Latn
+        case 0x84410000u: // bcb -> Latn
+        case 0x8C410000u: // bcd -> Latn
+        case 0x90410000u: // bce -> Latn
+        case 0x94410000u: // bcf -> Latn
+        case 0x98410000u: // bcg -> Latn
+        case 0x9C410000u: // bch -> Latn
+        case 0xA0410000u: // bci -> Latn
+        case 0xA4410000u: // bcj -> Latn
+        case 0xA8410000u: // bck -> Latn
+        case 0xB0410000u: // bcm -> Latn
+        case 0xB4410000u: // bcn -> Latn
+        case 0xB8410000u: // bco -> Latn
+        case 0xBC410000u: // bcp -> Latn
+        case 0xC4410000u: // bcr -> Latn
+        case 0xC8410000u: // bcs -> Latn
+        case 0xCC410000u: // bct -> Latn
+        case 0xD0410000u: // bcu -> Latn
+        case 0xD4410000u: // bcv -> Latn
+        case 0xD8410000u: // bcw -> Latn
+        case 0xE0410000u: // bcy -> Latn
+        case 0xE4410000u: // bcz -> Latn
+        case 0x80610000u: // bda -> Latn
+        case 0x84610000u: // bdb -> Latn
+        case 0x88610000u: // bdc -> Latn
+        case 0x8C610000u: // bdd -> Latn
+        case 0x90610000u: // bde -> Latn
+        case 0x94610000u: // bdf -> Latn
+        case 0x98610000u: // bdg -> Latn
+        case 0x9C610000u: // bdh -> Latn
+        case 0xA0610000u: // bdi -> Latn
+        case 0xA4610000u: // bdj -> Latn
+        case 0xA8610000u: // bdk -> Latn
+        case 0xAC610000u: // bdl -> Latn
+        case 0xB0610000u: // bdm -> Latn
+        case 0xB4610000u: // bdn -> Latn
+        case 0xB8610000u: // bdo -> Latn
+        case 0xBC610000u: // bdp -> Latn
+        case 0xC0610000u: // bdq -> Latn
+        case 0xC4610000u: // bdr -> Latn
+        case 0xC8610000u: // bds -> Latn
+        case 0xCC610000u: // bdt -> Latn
+        case 0xD0610000u: // bdu -> Latn
+        case 0xD8610000u: // bdw -> Latn
+        case 0xDC610000u: // bdx -> Latn
+        case 0xE0610000u: // bdy -> Latn
+        case 0x80810000u: // bea -> Latn
+        case 0x84810000u: // beb -> Latn
+        case 0x88810000u: // bec -> Latn
+        case 0x8C810000u: // bed -> Latn
+        case 0x94810000u: // bef -> Latn
+        case 0x9C810000u: // beh -> Latn
+        case 0xA0810000u: // bei -> Latn
+        case 0xA8810000u: // bek -> Latn
+        case 0xB0810000u: // bem -> Latn
+        case 0xB8810000u: // beo -> Latn
+        case 0xBC810000u: // bep -> Latn
+        case 0xC0810000u: // beq -> Latn
+        case 0xC8810000u: // bes -> Latn
+        case 0xCC810000u: // bet -> Latn
+        case 0xD0810000u: // beu -> Latn
+        case 0xD4810000u: // bev -> Latn
+        case 0xD8810000u: // bew -> Latn
+        case 0xDC810000u: // bex -> Latn
+        case 0xE0810000u: // bey -> Latn
+        case 0xE4810000u: // bez -> Latn
+        case 0x80A10000u: // bfa -> Latn
+        case 0x88A10000u: // bfc -> Latn
+        case 0x8CA10000u: // bfd -> Latn
+        case 0x90A10000u: // bfe -> Latn
+        case 0x94A10000u: // bff -> Latn
+        case 0x98A10000u: // bfg -> Latn
+        case 0x9CA10000u: // bfh -> Latn
+        case 0xA4A10000u: // bfj -> Latn
+        case 0xACA10000u: // bfl -> Latn
+        case 0xB0A10000u: // bfm -> Latn
+        case 0xB4A10000u: // bfn -> Latn
+        case 0xB8A10000u: // bfo -> Latn
+        case 0xBCA10000u: // bfp -> Latn
+        case 0xC8A10000u: // bfs -> Latn
+        case 0xDCA10000u: // bfx -> Latn
+        case 0x80C10000u: // bga -> Latn
+        case 0x84C10000u: // bgb -> Latn
+        case 0x94C10000u: // bgf -> Latn
+        case 0x98C10000u: // bgg -> Latn
+        case 0xA0C10000u: // bgi -> Latn
+        case 0xA4C10000u: // bgj -> Latn
+        case 0xB8C10000u: // bgo -> Latn
+        case 0xC4C10000u: // bgr -> Latn
+        case 0xC8C10000u: // bgs -> Latn
+        case 0xCCC10000u: // bgt -> Latn
+        case 0xD0C10000u: // bgu -> Latn
+        case 0xD4C10000u: // bgv -> Latn
+        case 0xE0C10000u: // bgy -> Latn
+        case 0xE4C10000u: // bgz -> Latn
+        case 0x88E10000u: // bhc -> Latn
+        case 0x94E10000u: // bhf -> Latn
+        case 0x98E10000u: // bhg -> Latn
+        case 0xACE10000u: // bhl -> Latn
+        case 0xBCE10000u: // bhp -> Latn
+        case 0xC0E10000u: // bhq -> Latn
+        case 0xC4E10000u: // bhr -> Latn
+        case 0xC8E10000u: // bhs -> Latn
+        case 0xD4E10000u: // bhv -> Latn
+        case 0xD8E10000u: // bhw -> Latn
+        case 0xE0E10000u: // bhy -> Latn
+        case 0xE4E10000u: // bhz -> Latn
+        case 0x62690000u: // bi -> Latn
+        case 0x81010000u: // bia -> Latn
+        case 0x85010000u: // bib -> Latn
+        case 0x8D010000u: // bid -> Latn
+        case 0x91010000u: // bie -> Latn
+        case 0x95010000u: // bif -> Latn
+        case 0x99010000u: // big -> Latn
+        case 0xA9010000u: // bik -> Latn
+        case 0xAD010000u: // bil -> Latn
+        case 0xB1010000u: // bim -> Latn
+        case 0xB5010000u: // bin -> Latn
+        case 0xB9010000u: // bio -> Latn
+        case 0xBD010000u: // bip -> Latn
+        case 0xC1010000u: // biq -> Latn
+        case 0xC5010000u: // bir -> Latn
+        case 0xCD010000u: // bit -> Latn
+        case 0xD1010000u: // biu -> Latn
+        case 0xD5010000u: // biv -> Latn
+        case 0xD9010000u: // biw -> Latn
+        case 0xE5010000u: // biz -> Latn
+        case 0x81210000u: // bja -> Latn
+        case 0x85210000u: // bjb -> Latn
+        case 0x89210000u: // bjc -> Latn
+        case 0x99210000u: // bjg -> Latn
+        case 0x9D210000u: // bjh -> Latn
+        case 0xA1210000u: // bji -> Latn
+        case 0xA9210000u: // bjk -> Latn
+        case 0xAD210000u: // bjl -> Latn
+        case 0xB5210000u: // bjn -> Latn
+        case 0xB9210000u: // bjo -> Latn
+        case 0xBD210000u: // bjp -> Latn
+        case 0xC5210000u: // bjr -> Latn
+        case 0xC9210000u: // bjs -> Latn
+        case 0xCD210000u: // bjt -> Latn
+        case 0xD1210000u: // bju -> Latn
+        case 0xD5210000u: // bjv -> Latn
+        case 0xD9210000u: // bjw -> Latn
+        case 0xDD210000u: // bjx -> Latn
+        case 0xE1210000u: // bjy -> Latn
+        case 0xE5210000u: // bjz -> Latn
+        case 0x81410000u: // bka -> Latn
+        case 0x89410000u: // bkc -> Latn
+        case 0x8D410000u: // bkd -> Latn
+        case 0x95410000u: // bkf -> Latn
+        case 0x99410000u: // bkg -> Latn
+        case 0x9D410000u: // bkh -> Latn
+        case 0xA1410000u: // bki -> Latn
+        case 0xA5410000u: // bkj -> Latn
+        case 0xAD410000u: // bkl -> Latn
+        case 0xB1410000u: // bkm -> Latn
+        case 0xB5410000u: // bkn -> Latn
+        case 0xB9410000u: // bko -> Latn
+        case 0xBD410000u: // bkp -> Latn
+        case 0xC1410000u: // bkq -> Latn
+        case 0xC5410000u: // bkr -> Latn
+        case 0xC9410000u: // bks -> Latn
+        case 0xCD410000u: // bkt -> Latn
+        case 0xD1410000u: // bku -> Latn
+        case 0xD5410000u: // bkv -> Latn
+        case 0xD9410000u: // bkw -> Latn
+        case 0xDD410000u: // bkx -> Latn
+        case 0xE1410000u: // bky -> Latn
+        case 0xE5410000u: // bkz -> Latn
+        case 0x81610000u: // bla -> Latn
+        case 0x85610000u: // blb -> Latn
+        case 0x89610000u: // blc -> Latn
+        case 0x8D610000u: // bld -> Latn
+        case 0x91610000u: // ble -> Latn
+        case 0x95610000u: // blf -> Latn
+        case 0x9D610000u: // blh -> Latn
+        case 0xA1610000u: // bli -> Latn
+        case 0xA5610000u: // blj -> Latn
+        case 0xB1610000u: // blm -> Latn
+        case 0xB5610000u: // bln -> Latn
+        case 0xB9610000u: // blo -> Latn
+        case 0xBD610000u: // blp -> Latn
+        case 0xC1610000u: // blq -> Latn
+        case 0xC5610000u: // blr -> Latn
+        case 0xC9610000u: // bls -> Latn
+        case 0xD5610000u: // blv -> Latn
+        case 0xD9610000u: // blw -> Latn
+        case 0xDD610000u: // blx -> Latn
+        case 0xE1610000u: // bly -> Latn
+        case 0xE5610000u: // blz -> Latn
+        case 0x626D0000u: // bm -> Latn
+        case 0x81810000u: // bma -> Latn
+        case 0x85810000u: // bmb -> Latn
+        case 0x89810000u: // bmc -> Latn
+        case 0x8D810000u: // bmd -> Latn
+        case 0x91810000u: // bme -> Latn
+        case 0x95810000u: // bmf -> Latn
+        case 0x99810000u: // bmg -> Latn
+        case 0x9D810000u: // bmh -> Latn
+        case 0xA1810000u: // bmi -> Latn
+        case 0xA9810000u: // bmk -> Latn
+        case 0xAD810000u: // bml -> Latn
+        case 0xB1810000u: // bmm -> Latn
+        case 0xB5810000u: // bmn -> Latn
+        case 0xB9810000u: // bmo -> Latn
+        case 0xBD810000u: // bmp -> Latn
+        case 0xC1810000u: // bmq -> Latn
+        case 0xC5810000u: // bmr -> Latn
+        case 0xC9810000u: // bms -> Latn
+        case 0xD1810000u: // bmu -> Latn
+        case 0xD5810000u: // bmv -> Latn
+        case 0xD9810000u: // bmw -> Latn
+        case 0xDD810000u: // bmx -> Latn
+        case 0xE5810000u: // bmz -> Latn
+        case 0x81A10000u: // bna -> Latn
+        case 0x85A10000u: // bnb -> Latn
+        case 0x89A10000u: // bnc -> Latn
+        case 0x8DA10000u: // bnd -> Latn
+        case 0x91A10000u: // bne -> Latn
+        case 0x95A10000u: // bnf -> Latn
+        case 0x99A10000u: // bng -> Latn
+        case 0xA1A10000u: // bni -> Latn
+        case 0xA5A10000u: // bnj -> Latn
+        case 0xA9A10000u: // bnk -> Latn
+        case 0xB1A10000u: // bnm -> Latn
+        case 0xB5A10000u: // bnn -> Latn
+        case 0xB9A10000u: // bno -> Latn
+        case 0xBDA10000u: // bnp -> Latn
+        case 0xC1A10000u: // bnq -> Latn
+        case 0xC5A10000u: // bnr -> Latn
+        case 0xD1A10000u: // bnu -> Latn
+        case 0xD5A10000u: // bnv -> Latn
+        case 0xD9A10000u: // bnw -> Latn
+        case 0xDDA10000u: // bnx -> Latn
+        case 0xE1A10000u: // bny -> Latn
+        case 0xE5A10000u: // bnz -> Latn
+        case 0x81C10000u: // boa -> Latn
+        case 0x85C10000u: // bob -> Latn
+        case 0x91C10000u: // boe -> Latn
+        case 0x95C10000u: // bof -> Latn
+        case 0x9DC10000u: // boh -> Latn
+        case 0xA5C10000u: // boj -> Latn
+        case 0xA9C10000u: // bok -> Latn
+        case 0xADC10000u: // bol -> Latn
+        case 0xB1C10000u: // bom -> Latn
+        case 0xB5C10000u: // bon -> Latn
+        case 0xB9C10000u: // boo -> Latn
+        case 0xBDC10000u: // bop -> Latn
+        case 0xC1C10000u: // boq -> Latn
+        case 0xC5C10000u: // bor -> Latn
+        case 0xCDC10000u: // bot -> Latn
+        case 0xD1C10000u: // bou -> Latn
+        case 0xD5C10000u: // bov -> Latn
+        case 0xD9C10000u: // bow -> Latn
+        case 0xDDC10000u: // box -> Latn
+        case 0xE1C10000u: // boy -> Latn
+        case 0xE5C10000u: // boz -> Latn
+        case 0x81E10000u: // bpa -> Latn
+        case 0x89E10000u: // bpc -> Latn
+        case 0x8DE10000u: // bpd -> Latn
+        case 0x91E10000u: // bpe -> Latn
+        case 0x99E10000u: // bpg -> Latn
+        case 0xA1E10000u: // bpi -> Latn
+        case 0xA5E10000u: // bpj -> Latn
+        case 0xA9E10000u: // bpk -> Latn
+        case 0xADE10000u: // bpl -> Latn
+        case 0xB1E10000u: // bpm -> Latn
+        case 0xB9E10000u: // bpo -> Latn
+        case 0xBDE10000u: // bpp -> Latn
+        case 0xC1E10000u: // bpq -> Latn
+        case 0xC5E10000u: // bpr -> Latn
+        case 0xC9E10000u: // bps -> Latn
+        case 0xCDE10000u: // bpt -> Latn
+        case 0xD1E10000u: // bpu -> Latn
+        case 0xD5E10000u: // bpv -> Latn
+        case 0xD9E10000u: // bpw -> Latn
+        case 0xE5E10000u: // bpz -> Latn
+        case 0x82010000u: // bqa -> Latn
+        case 0x86010000u: // bqb -> Latn
+        case 0x8A010000u: // bqc -> Latn
+        case 0x8E010000u: // bqd -> Latn
+        case 0x96010000u: // bqf -> Latn
+        case 0x9A010000u: // bqg -> Latn
+        case 0xA6010000u: // bqj -> Latn
+        case 0xAA010000u: // bqk -> Latn
+        case 0xAE010000u: // bql -> Latn
+        case 0xB2010000u: // bqm -> Latn
+        case 0xBA010000u: // bqo -> Latn
+        case 0xBE010000u: // bqp -> Latn
+        case 0xC2010000u: // bqq -> Latn
+        case 0xC6010000u: // bqr -> Latn
+        case 0xCA010000u: // bqs -> Latn
+        case 0xCE010000u: // bqt -> Latn
+        case 0xD2010000u: // bqu -> Latn
+        case 0xD6010000u: // bqv -> Latn
+        case 0xDA010000u: // bqw -> Latn
+        case 0xDE010000u: // bqx -> Latn
+        case 0xE6010000u: // bqz -> Latn
+        case 0x62720000u: // br -> Latn
+        case 0x8A210000u: // brc -> Latn
+        case 0x96210000u: // brf -> Latn
+        case 0x9A210000u: // brg -> Latn
+        case 0xA2210000u: // bri -> Latn
+        case 0xA6210000u: // brj -> Latn
+        case 0xAE210000u: // brl -> Latn
+        case 0xB2210000u: // brm -> Latn
+        case 0xB6210000u: // brn -> Latn
+        case 0xBE210000u: // brp -> Latn
+        case 0xC2210000u: // brq -> Latn
+        case 0xC6210000u: // brr -> Latn
+        case 0xCA210000u: // brs -> Latn
+        case 0xCE210000u: // brt -> Latn
+        case 0xD2210000u: // bru -> Latn
+        case 0xE2210000u: // bry -> Latn
+        case 0xE6210000u: // brz -> Latn
+        case 0x62730000u: // bs -> Latn
+        case 0x82410000u: // bsa -> Latn
+        case 0x86410000u: // bsb -> Latn
+        case 0x8A410000u: // bsc -> Latn
+        case 0x92410000u: // bse -> Latn
+        case 0x96410000u: // bsf -> Latn
+        case 0xA2410000u: // bsi -> Latn
+        case 0xA6410000u: // bsj -> Latn
+        case 0xAE410000u: // bsl -> Latn
+        case 0xB2410000u: // bsm -> Latn
+        case 0xB6410000u: // bsn -> Latn
+        case 0xBA410000u: // bso -> Latn
+        case 0xBE410000u: // bsp -> Latn
+        case 0xC6410000u: // bsr -> Latn
+        case 0xCA410000u: // bss -> Latn
+        case 0xD2410000u: // bsu -> Latn
+        case 0xD6410000u: // bsv -> Latn
+        case 0xDA410000u: // bsw -> Latn
+        case 0xDE410000u: // bsx -> Latn
+        case 0xE2410000u: // bsy -> Latn
+        case 0x82610000u: // bta -> Latn
+        case 0x8A610000u: // btc -> Latn
+        case 0x92610000u: // bte -> Latn
+        case 0x96610000u: // btf -> Latn
+        case 0x9A610000u: // btg -> Latn
+        case 0x9E610000u: // bth -> Latn
+        case 0xA2610000u: // bti -> Latn
+        case 0xA6610000u: // btj -> Latn
+        case 0xB6610000u: // btn -> Latn
+        case 0xBA610000u: // bto -> Latn
+        case 0xBE610000u: // btp -> Latn
+        case 0xC2610000u: // btq -> Latn
+        case 0xC6610000u: // btr -> Latn
+        case 0xCA610000u: // bts -> Latn
+        case 0xCE610000u: // btt -> Latn
+        case 0xD2610000u: // btu -> Latn
+        case 0xDA610000u: // btw -> Latn
+        case 0xDE610000u: // btx -> Latn
+        case 0xE2610000u: // bty -> Latn
+        case 0xE6610000u: // btz -> Latn
+        case 0x86810000u: // bub -> Latn
+        case 0x8A810000u: // buc -> Latn
+        case 0x8E810000u: // bud -> Latn
+        case 0x92810000u: // bue -> Latn
+        case 0x96810000u: // buf -> Latn
+        case 0x9A810000u: // bug -> Latn
+        case 0x9E810000u: // buh -> Latn
+        case 0xA2810000u: // bui -> Latn
+        case 0xA6810000u: // buj -> Latn
+        case 0xAA810000u: // buk -> Latn
+        case 0xB2810000u: // bum -> Latn
+        case 0xB6810000u: // bun -> Latn
+        case 0xBA810000u: // buo -> Latn
+        case 0xBE810000u: // bup -> Latn
+        case 0xC2810000u: // buq -> Latn
+        case 0xCA810000u: // bus -> Latn
+        case 0xCE810000u: // but -> Latn
+        case 0xD2810000u: // buu -> Latn
+        case 0xD6810000u: // buv -> Latn
+        case 0xDA810000u: // buw -> Latn
+        case 0xDE810000u: // bux -> Latn
+        case 0xE2810000u: // buy -> Latn
+        case 0xE6810000u: // buz -> Latn
+        case 0x82A10000u: // bva -> Latn
+        case 0x86A10000u: // bvb -> Latn
+        case 0x8AA10000u: // bvc -> Latn
+        case 0x8EA10000u: // bvd -> Latn
+        case 0x92A10000u: // bve -> Latn
+        case 0x96A10000u: // bvf -> Latn
+        case 0x9AA10000u: // bvg -> Latn
+        case 0x9EA10000u: // bvh -> Latn
+        case 0xA2A10000u: // bvi -> Latn
+        case 0xA6A10000u: // bvj -> Latn
+        case 0xAAA10000u: // bvk -> Latn
+        case 0xB2A10000u: // bvm -> Latn
+        case 0xB6A10000u: // bvn -> Latn
+        case 0xBAA10000u: // bvo -> Latn
+        case 0xC2A10000u: // bvq -> Latn
+        case 0xC6A10000u: // bvr -> Latn
+        case 0xCEA10000u: // bvt -> Latn
+        case 0xD2A10000u: // bvu -> Latn
+        case 0xD6A10000u: // bvv -> Latn
+        case 0xDAA10000u: // bvw -> Latn
+        case 0xDEA10000u: // bvx -> Latn
+        case 0xE2A10000u: // bvy -> Latn
+        case 0xE6A10000u: // bvz -> Latn
+        case 0x82C10000u: // bwa -> Latn
+        case 0x86C10000u: // bwb -> Latn
+        case 0x8AC10000u: // bwc -> Latn
+        case 0x8EC10000u: // bwd -> Latn
+        case 0x96C10000u: // bwf -> Latn
+        case 0x9AC10000u: // bwg -> Latn
+        case 0x9EC10000u: // bwh -> Latn
+        case 0xA2C10000u: // bwi -> Latn
+        case 0xA6C10000u: // bwj -> Latn
+        case 0xAAC10000u: // bwk -> Latn
+        case 0xAEC10000u: // bwl -> Latn
+        case 0xB2C10000u: // bwm -> Latn
+        case 0xBAC10000u: // bwo -> Latn
+        case 0xBEC10000u: // bwp -> Latn
+        case 0xC2C10000u: // bwq -> Latn
+        case 0xC6C10000u: // bwr -> Latn
+        case 0xCAC10000u: // bws -> Latn
+        case 0xCEC10000u: // bwt -> Latn
+        case 0xD2C10000u: // bwu -> Latn
+        case 0xDAC10000u: // bww -> Latn
+        case 0xDEC10000u: // bwx -> Latn
+        case 0xE2C10000u: // bwy -> Latn
+        case 0xE6C10000u: // bwz -> Latn
+        case 0x82E10000u: // bxa -> Latn
+        case 0x86E10000u: // bxb -> Latn
+        case 0x8AE10000u: // bxc -> Latn
+        case 0x96E10000u: // bxf -> Latn
+        case 0x9AE10000u: // bxg -> Latn
+        case 0x9EE10000u: // bxh -> Latn
+        case 0xA2E10000u: // bxi -> Latn
+        case 0xA6E10000u: // bxj -> Latn
+        case 0xAEE10000u: // bxl -> Latn
+        case 0xB6E10000u: // bxn -> Latn
+        case 0xBAE10000u: // bxo -> Latn
+        case 0xBEE10000u: // bxp -> Latn
+        case 0xC2E10000u: // bxq -> Latn
+        case 0xCAE10000u: // bxs -> Latn
+        case 0xD6E10000u: // bxv -> Latn
+        case 0xDAE10000u: // bxw -> Latn
+        case 0xE6E10000u: // bxz -> Latn
+        case 0x83010000u: // bya -> Latn
+        case 0x87010000u: // byb -> Latn
+        case 0x8B010000u: // byc -> Latn
+        case 0x8F010000u: // byd -> Latn
+        case 0x93010000u: // bye -> Latn
+        case 0x97010000u: // byf -> Latn
+        case 0xA3010000u: // byi -> Latn
+        case 0xA7010000u: // byj -> Latn
+        case 0xAB010000u: // byk -> Latn
+        case 0xAF010000u: // byl -> Latn
+        case 0xB3010000u: // bym -> Latn
+        case 0xBF010000u: // byp -> Latn
+        case 0xC7010000u: // byr -> Latn
+        case 0xCB010000u: // bys -> Latn
+        case 0xD7010000u: // byv -> Latn
+        case 0xDF010000u: // byx -> Latn
+        case 0xE7010000u: // byz -> Latn
+        case 0x83210000u: // bza -> Latn
+        case 0x87210000u: // bzb -> Latn
+        case 0x8B210000u: // bzc -> Latn
+        case 0x8F210000u: // bzd -> Latn
+        case 0x93210000u: // bze -> Latn
+        case 0x97210000u: // bzf -> Latn
+        case 0x9F210000u: // bzh -> Latn
+        case 0xA7210000u: // bzj -> Latn
+        case 0xAB210000u: // bzk -> Latn
+        case 0xAF210000u: // bzl -> Latn
+        case 0xB3210000u: // bzm -> Latn
+        case 0xB7210000u: // bzn -> Latn
+        case 0xBB210000u: // bzo -> Latn
+        case 0xBF210000u: // bzp -> Latn
+        case 0xC3210000u: // bzq -> Latn
+        case 0xC7210000u: // bzr -> Latn
+        case 0xCF210000u: // bzt -> Latn
+        case 0xD3210000u: // bzu -> Latn
+        case 0xD7210000u: // bzv -> Latn
+        case 0xDB210000u: // bzw -> Latn
+        case 0xDF210000u: // bzx -> Latn
+        case 0xE3210000u: // bzy -> Latn
+        case 0xE7210000u: // bzz -> Latn
+        case 0x63610000u: // ca -> Latn
+        case 0x80020000u: // caa -> Latn
+        case 0x84020000u: // cab -> Latn
+        case 0x88020000u: // cac -> Latn
+        case 0x8C020000u: // cad -> Latn
+        case 0x90020000u: // cae -> Latn
+        case 0x94020000u: // caf -> Latn
+        case 0x98020000u: // cag -> Latn
+        case 0x9C020000u: // cah -> Latn
+        case 0xA4020000u: // caj -> Latn
+        case 0xA8020000u: // cak -> Latn
+        case 0xAC020000u: // cal -> Latn
+        case 0xB0020000u: // cam -> Latn
+        case 0xB4020000u: // can -> Latn
+        case 0xB8020000u: // cao -> Latn
+        case 0xBC020000u: // cap -> Latn
+        case 0xC0020000u: // caq -> Latn
+        case 0xC4020000u: // car -> Latn
+        case 0xC8020000u: // cas -> Latn
+        case 0xD4020000u: // cav -> Latn
+        case 0xD8020000u: // caw -> Latn
+        case 0xDC020000u: // cax -> Latn
+        case 0xE0020000u: // cay -> Latn
+        case 0xE4020000u: // caz -> Latn
+        case 0x84220000u: // cbb -> Latn
+        case 0x88220000u: // cbc -> Latn
+        case 0x8C220000u: // cbd -> Latn
+        case 0x98220000u: // cbg -> Latn
+        case 0xA0220000u: // cbi -> Latn
+        case 0xA4220000u: // cbj -> Latn
+        case 0xA8220000u: // cbk -> Latn
+        case 0xAC220000u: // cbl -> Latn
+        case 0xB8220000u: // cbo -> Latn
+        case 0xC0220000u: // cbq -> Latn
+        case 0xC4220000u: // cbr -> Latn
+        case 0xC8220000u: // cbs -> Latn
+        case 0xCC220000u: // cbt -> Latn
+        case 0xD0220000u: // cbu -> Latn
+        case 0xD4220000u: // cbv -> Latn
+        case 0xD8220000u: // cbw -> Latn
+        case 0xE0220000u: // cby -> Latn
+        case 0x88420000u: // ccc -> Latn
+        case 0x8C420000u: // ccd -> Latn
+        case 0x90420000u: // cce -> Latn
+        case 0x98420000u: // ccg -> Latn
+        case 0x9C420000u: // cch -> Latn
+        case 0xA4420000u: // ccj -> Latn
+        case 0xAC420000u: // ccl -> Latn
+        case 0xB0420000u: // ccm -> Latn
+        case 0xB8420000u: // cco -> Latn
+        case 0xC4420000u: // ccr -> Latn
+        case 0x94620000u: // cdf -> Latn
+        case 0xC4620000u: // cdr -> Latn
+        case 0x80820000u: // cea -> Latn
+        case 0x84820000u: // ceb -> Latn
+        case 0x98820000u: // ceg -> Latn
+        case 0xA8820000u: // cek -> Latn
+        case 0xB4820000u: // cen -> Latn
+        case 0xCC820000u: // cet -> Latn
+        case 0xE0820000u: // cey -> Latn
+        case 0x80A20000u: // cfa -> Latn
+        case 0x8CA20000u: // cfd -> Latn
+        case 0x98A20000u: // cfg -> Latn
+        case 0xB0A20000u: // cfm -> Latn
+        case 0x80C20000u: // cga -> Latn
+        case 0x88C20000u: // cgc -> Latn
+        case 0x98C20000u: // cgg -> Latn
+        case 0x63680000u: // ch -> Latn
+        case 0x84E20000u: // chb -> Latn
+        case 0x8CE20000u: // chd -> Latn
+        case 0x94E20000u: // chf -> Latn
+        case 0x9CE20000u: // chh -> Latn
+        case 0xA4E20000u: // chj -> Latn
+        case 0xA8E20000u: // chk -> Latn
+        case 0xACE20000u: // chl -> Latn
+        case 0xB4E20000u: // chn -> Latn
+        case 0xB8E20000u: // cho -> Latn
+        case 0xBCE20000u: // chp -> Latn
+        case 0xC0E20000u: // chq -> Latn
+        case 0xCCE20000u: // cht -> Latn
+        case 0xD8E20000u: // chw -> Latn
+        case 0xE0E20000u: // chy -> Latn
+        case 0xE4E20000u: // chz -> Latn
+        case 0x81020000u: // cia -> Latn
+        case 0x85020000u: // cib -> Latn
+        case 0x89020000u: // cic -> Latn
+        case 0x91020000u: // cie -> Latn
+        case 0xB1020000u: // cim -> Latn
+        case 0xB5020000u: // cin -> Latn
+        case 0xBD020000u: // cip -> Latn
+        case 0xC5020000u: // cir -> Latn
+        case 0xD9020000u: // ciw -> Latn
+        case 0xE1020000u: // ciy -> Latn
+        case 0x91220000u: // cje -> Latn
+        case 0x9D220000u: // cjh -> Latn
+        case 0xA9220000u: // cjk -> Latn
+        case 0xB5220000u: // cjn -> Latn
+        case 0xB9220000u: // cjo -> Latn
+        case 0xBD220000u: // cjp -> Latn
+        case 0xC9220000u: // cjs -> Latn
+        case 0xD5220000u: // cjv -> Latn
+        case 0xAD420000u: // ckl -> Latn
+        case 0xB1420000u: // ckm -> Latn
+        case 0xB5420000u: // ckn -> Latn
+        case 0xB9420000u: // cko -> Latn
+        case 0xC1420000u: // ckq -> Latn
+        case 0xC5420000u: // ckr -> Latn
+        case 0xC9420000u: // cks -> Latn
+        case 0xD1420000u: // cku -> Latn
+        case 0xD5420000u: // ckv -> Latn
+        case 0xDD420000u: // ckx -> Latn
+        case 0xE1420000u: // cky -> Latn
+        case 0xE5420000u: // ckz -> Latn
+        case 0x81620000u: // cla -> Latn
+        case 0x89620000u: // clc -> Latn
+        case 0x91620000u: // cle -> Latn
+        case 0xA1620000u: // cli -> Latn
+        case 0xA5620000u: // clj -> Latn
+        case 0xA9620000u: // clk -> Latn
+        case 0xAD620000u: // cll -> Latn
+        case 0xB1620000u: // clm -> Latn
+        case 0xB9620000u: // clo -> Latn
+        case 0xCD620000u: // clt -> Latn
+        case 0xD1620000u: // clu -> Latn
+        case 0xE1620000u: // cly -> Latn
+        case 0x81820000u: // cma -> Latn
+        case 0x91820000u: // cme -> Latn
+        case 0xA1820000u: // cmi -> Latn
+        case 0xAD820000u: // cml -> Latn
+        case 0xB9820000u: // cmo -> Latn
+        case 0xC5820000u: // cmr -> Latn
+        case 0xC9820000u: // cms -> Latn
+        case 0xCD820000u: // cmt -> Latn
+        case 0x85A20000u: // cnb -> Latn
+        case 0x89A20000u: // cnc -> Latn
+        case 0x99A20000u: // cng -> Latn
+        case 0x9DA20000u: // cnh -> Latn
+        case 0xA1A20000u: // cni -> Latn
+        case 0xA9A20000u: // cnk -> Latn
+        case 0xADA20000u: // cnl -> Latn
+        case 0xC1A20000u: // cnq -> Latn
+        case 0xC9A20000u: // cns -> Latn
+        case 0xCDA20000u: // cnt -> Latn
+        case 0xD9A20000u: // cnw -> Latn
+        case 0xDDA20000u: // cnx -> Latn
+        case 0x636F0000u: // co -> Latn
+        case 0x81C20000u: // coa -> Latn
+        case 0x85C20000u: // cob -> Latn
+        case 0x89C20000u: // coc -> Latn
+        case 0x8DC20000u: // cod -> Latn
+        case 0x91C20000u: // coe -> Latn
+        case 0x95C20000u: // cof -> Latn
+        case 0x9DC20000u: // coh -> Latn
+        case 0xA5C20000u: // coj -> Latn
+        case 0xA9C20000u: // cok -> Latn
+        case 0xADC20000u: // col -> Latn
+        case 0xB1C20000u: // com -> Latn
+        case 0xB9C20000u: // coo -> Latn
+        case 0xC1C20000u: // coq -> Latn
+        case 0xCDC20000u: // cot -> Latn
+        case 0xD1C20000u: // cou -> Latn
+        case 0xDDC20000u: // cox -> Latn
+        case 0xE5C20000u: // coz -> Latn
+        case 0x81E20000u: // cpa -> Latn
+        case 0x85E20000u: // cpb -> Latn
+        case 0x89E20000u: // cpc -> Latn
+        case 0xA1E20000u: // cpi -> Latn
+        case 0xB5E20000u: // cpn -> Latn
+        case 0xB9E20000u: // cpo -> Latn
+        case 0xC9E20000u: // cps -> Latn
+        case 0xD1E20000u: // cpu -> Latn
+        case 0xDDE20000u: // cpx -> Latn
+        case 0xE1E20000u: // cpy -> Latn
+        case 0x8E020000u: // cqd -> Latn
+        case 0x82220000u: // cra -> Latn
+        case 0x86220000u: // crb -> Latn
+        case 0x8A220000u: // crc -> Latn
+        case 0x8E220000u: // crd -> Latn
+        case 0x96220000u: // crf -> Latn
+        case 0x9A220000u: // crg -> Latn
+        case 0xA2220000u: // cri -> Latn
+        case 0xB6220000u: // crn -> Latn
+        case 0xBA220000u: // cro -> Latn
+        case 0xC2220000u: // crq -> Latn
+        case 0xCA220000u: // crs -> Latn
+        case 0xCE220000u: // crt -> Latn
+        case 0xD6220000u: // crv -> Latn
+        case 0xDA220000u: // crw -> Latn
+        case 0xDE220000u: // crx -> Latn
+        case 0xE2220000u: // cry -> Latn
+        case 0xE6220000u: // crz -> Latn
+        case 0x63730000u: // cs -> Latn
+        case 0x82420000u: // csa -> Latn
+        case 0x86420000u: // csb -> Latn
+        case 0xA6420000u: // csj -> Latn
+        case 0xAA420000u: // csk -> Latn
+        case 0xB2420000u: // csm -> Latn
+        case 0xBA420000u: // cso -> Latn
+        case 0xCA420000u: // css -> Latn
+        case 0xCE420000u: // cst -> Latn
+        case 0xD6420000u: // csv -> Latn
+        case 0xE2420000u: // csy -> Latn
+        case 0xE6420000u: // csz -> Latn
+        case 0x82620000u: // cta -> Latn
+        case 0x8A620000u: // ctc -> Latn
+        case 0x92620000u: // cte -> Latn
+        case 0x9E620000u: // cth -> Latn
+        case 0xAE620000u: // ctl -> Latn
+        case 0xB2620000u: // ctm -> Latn
+        case 0xBA620000u: // cto -> Latn
+        case 0xBE620000u: // ctp -> Latn
+        case 0xCA620000u: // cts -> Latn
+        case 0xD2620000u: // ctu -> Latn
+        case 0xE6620000u: // ctz -> Latn
+        case 0x82820000u: // cua -> Latn
+        case 0x86820000u: // cub -> Latn
+        case 0x8A820000u: // cuc -> Latn
+        case 0x9E820000u: // cuh -> Latn
+        case 0xA2820000u: // cui -> Latn
+        case 0xA6820000u: // cuj -> Latn
+        case 0xAA820000u: // cuk -> Latn
+        case 0xAE820000u: // cul -> Latn
+        case 0xBA820000u: // cuo -> Latn
+        case 0xBE820000u: // cup -> Latn
+        case 0xCE820000u: // cut -> Latn
+        case 0xD6820000u: // cuv -> Latn
+        case 0xDE820000u: // cux -> Latn
+        case 0xE2820000u: // cuy -> Latn
+        case 0x9AA20000u: // cvg -> Latn
+        case 0xB6A20000u: // cvn -> Latn
+        case 0x82C20000u: // cwa -> Latn
+        case 0x86C20000u: // cwb -> Latn
+        case 0x92C20000u: // cwe -> Latn
+        case 0x9AC20000u: // cwg -> Latn
+        case 0xCEC20000u: // cwt -> Latn
+        case 0x9EE20000u: // cxh -> Latn
+        case 0x63790000u: // cy -> Latn
+        case 0x83020000u: // cya -> Latn
+        case 0x87020000u: // cyb -> Latn
+        case 0xBB020000u: // cyo -> Latn
+        case 0xB7220000u: // czn -> Latn
+        case 0xCF220000u: // czt -> Latn
+        case 0x64610000u: // da -> Latn
+        case 0x80030000u: // daa -> Latn
+        case 0x88030000u: // dac -> Latn
+        case 0x8C030000u: // dad -> Latn
+        case 0x90030000u: // dae -> Latn
+        case 0x98030000u: // dag -> Latn
+        case 0x9C030000u: // dah -> Latn
+        case 0xA0030000u: // dai -> Latn
+        case 0xA4030000u: // daj -> Latn
+        case 0xA8030000u: // dak -> Latn
+        case 0xAC030000u: // dal -> Latn
+        case 0xB0030000u: // dam -> Latn
+        case 0xB8030000u: // dao -> Latn
+        case 0xC8030000u: // das -> Latn
+        case 0xD0030000u: // dau -> Latn
+        case 0xD4030000u: // dav -> Latn
+        case 0xD8030000u: // daw -> Latn
+        case 0xDC030000u: // dax -> Latn
+        case 0xE4030000u: // daz -> Latn
+        case 0x80230000u: // dba -> Latn
+        case 0x84230000u: // dbb -> Latn
+        case 0x8C230000u: // dbd -> Latn
+        case 0x90230000u: // dbe -> Latn
+        case 0x94230000u: // dbf -> Latn
+        case 0x98230000u: // dbg -> Latn
+        case 0xA0230000u: // dbi -> Latn
+        case 0xA4230000u: // dbj -> Latn
+        case 0xAC230000u: // dbl -> Latn
+        case 0xB0230000u: // dbm -> Latn
+        case 0xB4230000u: // dbn -> Latn
+        case 0xB8230000u: // dbo -> Latn
+        case 0xBC230000u: // dbp -> Latn
+        case 0xC0230000u: // dbq -> Latn
+        case 0xCC230000u: // dbt -> Latn
+        case 0xD0230000u: // dbu -> Latn
+        case 0xD4230000u: // dbv -> Latn
+        case 0xD8230000u: // dbw -> Latn
+        case 0xE0230000u: // dby -> Latn
+        case 0xC4430000u: // dcr -> Latn
+        case 0x80630000u: // dda -> Latn
+        case 0x8C630000u: // ddd -> Latn
+        case 0x90630000u: // dde -> Latn
+        case 0x98630000u: // ddg -> Latn
+        case 0xA0630000u: // ddi -> Latn
+        case 0xA4630000u: // ddj -> Latn
+        case 0xB4630000u: // ddn -> Latn
+        case 0xC4630000u: // ddr -> Latn
+        case 0xC8630000u: // dds -> Latn
+        case 0xD8630000u: // ddw -> Latn
+        case 0x64650000u: // de -> Latn
+        case 0x88830000u: // dec -> Latn
+        case 0x8C830000u: // ded -> Latn
+        case 0x90830000u: // dee -> Latn
+        case 0x98830000u: // deg -> Latn
+        case 0xA0830000u: // dei -> Latn
+        case 0xA8830000u: // dek -> Latn
+        case 0xAC830000u: // del -> Latn
+        case 0xB0830000u: // dem -> Latn
+        case 0xB4830000u: // den -> Latn
+        case 0xC0830000u: // deq -> Latn
+        case 0xC8830000u: // des -> Latn
+        case 0xD4830000u: // dev -> Latn
+        case 0xE4830000u: // dez -> Latn
+        case 0x80C30000u: // dga -> Latn
+        case 0x84C30000u: // dgb -> Latn
+        case 0x88C30000u: // dgc -> Latn
+        case 0x8CC30000u: // dgd -> Latn
+        case 0x90C30000u: // dge -> Latn
+        case 0x98C30000u: // dgg -> Latn
+        case 0x9CC30000u: // dgh -> Latn
+        case 0xA0C30000u: // dgi -> Latn
+        case 0xA8C30000u: // dgk -> Latn
+        case 0xB4C30000u: // dgn -> Latn
+        case 0xC4C30000u: // dgr -> Latn
+        case 0xC8C30000u: // dgs -> Latn
+        case 0xCCC30000u: // dgt -> Latn
+        case 0xD8C30000u: // dgw -> Latn
+        case 0xDCC30000u: // dgx -> Latn
+        case 0xE4C30000u: // dgz -> Latn
+        case 0x98E30000u: // dhg -> Latn
+        case 0xACE30000u: // dhl -> Latn
+        case 0xB0E30000u: // dhm -> Latn
+        case 0xC4E30000u: // dhr -> Latn
+        case 0xC8E30000u: // dhs -> Latn
+        case 0xD0E30000u: // dhu -> Latn
+        case 0xD4E30000u: // dhv -> Latn
+        case 0xDCE30000u: // dhx -> Latn
+        case 0x81030000u: // dia -> Latn
+        case 0x85030000u: // dib -> Latn
+        case 0x89030000u: // dic -> Latn
+        case 0x8D030000u: // did -> Latn
+        case 0x95030000u: // dif -> Latn
+        case 0x99030000u: // dig -> Latn
+        case 0x9D030000u: // dih -> Latn
+        case 0xA1030000u: // dii -> Latn
+        case 0xA5030000u: // dij -> Latn
+        case 0xAD030000u: // dil -> Latn
+        case 0xB5030000u: // din -> Latn
+        case 0xB9030000u: // dio -> Latn
+        case 0xBD030000u: // dip -> Latn
+        case 0xC5030000u: // dir -> Latn
+        case 0xC9030000u: // dis -> Latn
+        case 0xD1030000u: // diu -> Latn
+        case 0xD9030000u: // diw -> Latn
+        case 0xDD030000u: // dix -> Latn
+        case 0xE1030000u: // diy -> Latn
+        case 0xE5030000u: // diz -> Latn
+        case 0x81230000u: // dja -> Latn
+        case 0x85230000u: // djb -> Latn
+        case 0x89230000u: // djc -> Latn
+        case 0x8D230000u: // djd -> Latn
+        case 0x91230000u: // dje -> Latn
+        case 0x95230000u: // djf -> Latn
+        case 0xA1230000u: // dji -> Latn
+        case 0xA5230000u: // djj -> Latn
+        case 0xA9230000u: // djk -> Latn
+        case 0xB1230000u: // djm -> Latn
+        case 0xB5230000u: // djn -> Latn
+        case 0xB9230000u: // djo -> Latn
+        case 0xC5230000u: // djr -> Latn
+        case 0xD1230000u: // dju -> Latn
+        case 0xD9230000u: // djw -> Latn
+        case 0x99430000u: // dkg -> Latn
+        case 0xA9430000u: // dkk -> Latn
+        case 0xC5430000u: // dkr -> Latn
+        case 0xC9430000u: // dks -> Latn
+        case 0xDD430000u: // dkx -> Latn
+        case 0xB1630000u: // dlm -> Latn
+        case 0xB5630000u: // dln -> Latn
+        case 0x81830000u: // dma -> Latn
+        case 0x85830000u: // dmb -> Latn
+        case 0x89830000u: // dmc -> Latn
+        case 0x8D830000u: // dmd -> Latn
+        case 0x91830000u: // dme -> Latn
+        case 0x99830000u: // dmg -> Latn
+        case 0xB1830000u: // dmm -> Latn
+        case 0xB9830000u: // dmo -> Latn
+        case 0xC5830000u: // dmr -> Latn
+        case 0xC9830000u: // dms -> Latn
+        case 0xD1830000u: // dmu -> Latn
+        case 0xD5830000u: // dmv -> Latn
+        case 0xD9830000u: // dmw -> Latn
+        case 0xDD830000u: // dmx -> Latn
+        case 0xE1830000u: // dmy -> Latn
+        case 0x81A30000u: // dna -> Latn
+        case 0x8DA30000u: // dnd -> Latn
+        case 0x91A30000u: // dne -> Latn
+        case 0xA1A30000u: // dni -> Latn
+        case 0xA5A30000u: // dnj -> Latn
+        case 0xA9A30000u: // dnk -> Latn
+        case 0xB5A30000u: // dnn -> Latn
+        case 0xB9A30000u: // dno -> Latn
+        case 0xC5A30000u: // dnr -> Latn
+        case 0xCDA30000u: // dnt -> Latn
+        case 0xD9A30000u: // dnw -> Latn
+        case 0xE1A30000u: // dny -> Latn
+        case 0x81C30000u: // doa -> Latn
+        case 0x85C30000u: // dob -> Latn
+        case 0x89C30000u: // doc -> Latn
+        case 0x91C30000u: // doe -> Latn
+        case 0x95C30000u: // dof -> Latn
+        case 0x9DC30000u: // doh -> Latn
+        case 0xA9C30000u: // dok -> Latn
+        case 0xADC30000u: // dol -> Latn
+        case 0xB5C30000u: // don -> Latn
+        case 0xB9C30000u: // doo -> Latn
+        case 0xBDC30000u: // dop -> Latn
+        case 0xC5C30000u: // dor -> Latn
+        case 0xC9C30000u: // dos -> Latn
+        case 0xCDC30000u: // dot -> Latn
+        case 0xD5C30000u: // dov -> Latn
+        case 0xD9C30000u: // dow -> Latn
+        case 0xE1C30000u: // doy -> Latn
+        case 0xBDE30000u: // dpp -> Latn
+        case 0x8A230000u: // drc -> Latn
+        case 0x9A230000u: // drg -> Latn
+        case 0xA2230000u: // dri -> Latn
+        case 0xAE230000u: // drl -> Latn
+        case 0xB6230000u: // drn -> Latn
+        case 0xBA230000u: // dro -> Latn
+        case 0xCE230000u: // drt -> Latn
+        case 0xD2230000u: // dru -> Latn
+        case 0x86430000u: // dsb -> Latn
+        case 0x9E430000u: // dsh -> Latn
+        case 0xA2430000u: // dsi -> Latn
+        case 0xAA430000u: // dsk -> Latn
+        case 0xB6430000u: // dsn -> Latn
+        case 0xC2430000u: // dsq -> Latn
+        case 0x82630000u: // dta -> Latn
+        case 0x86630000u: // dtb -> Latn
+        case 0x8E630000u: // dtd -> Latn
+        case 0x9E630000u: // dth -> Latn
+        case 0xA2630000u: // dti -> Latn
+        case 0xAA630000u: // dtk -> Latn
+        case 0xB2630000u: // dtm -> Latn
+        case 0xBA630000u: // dto -> Latn
+        case 0xBE630000u: // dtp -> Latn
+        case 0xC6630000u: // dtr -> Latn
+        case 0xCA630000u: // dts -> Latn
+        case 0xCE630000u: // dtt -> Latn
+        case 0xD2630000u: // dtu -> Latn
+        case 0x82830000u: // dua -> Latn
+        case 0x8A830000u: // duc -> Latn
+        case 0x92830000u: // due -> Latn
+        case 0x96830000u: // duf -> Latn
+        case 0x9A830000u: // dug -> Latn
+        case 0xA2830000u: // dui -> Latn
+        case 0xAA830000u: // duk -> Latn
+        case 0xAE830000u: // dul -> Latn
+        case 0xB2830000u: // dum -> Latn
+        case 0xB6830000u: // dun -> Latn
+        case 0xBA830000u: // duo -> Latn
+        case 0xBE830000u: // dup -> Latn
+        case 0xC2830000u: // duq -> Latn
+        case 0xC6830000u: // dur -> Latn
+        case 0xD2830000u: // duu -> Latn
+        case 0xD6830000u: // duv -> Latn
+        case 0xDA830000u: // duw -> Latn
+        case 0xDE830000u: // dux -> Latn
+        case 0xE2830000u: // duy -> Latn
+        case 0xE6830000u: // duz -> Latn
+        case 0x82A30000u: // dva -> Latn
+        case 0x82C30000u: // dwa -> Latn
+        case 0xC6C30000u: // dwr -> Latn
+        case 0xCAC30000u: // dws -> Latn
+        case 0xD2C30000u: // dwu -> Latn
+        case 0xDAC30000u: // dww -> Latn
+        case 0xE2C30000u: // dwy -> Latn
+        case 0x83030000u: // dya -> Latn
+        case 0x87030000u: // dyb -> Latn
+        case 0x8F030000u: // dyd -> Latn
+        case 0x9B030000u: // dyg -> Latn
+        case 0xA3030000u: // dyi -> Latn
+        case 0xB3030000u: // dym -> Latn
+        case 0xB7030000u: // dyn -> Latn
+        case 0xBB030000u: // dyo -> Latn
+        case 0xC7030000u: // dyr -> Latn
+        case 0xD3030000u: // dyu -> Latn
+        case 0xE3030000u: // dyy -> Latn
+        case 0x83230000u: // dza -> Latn
+        case 0x8F230000u: // dzd -> Latn
+        case 0x93230000u: // dze -> Latn
+        case 0x9B230000u: // dzg -> Latn
+        case 0xB7230000u: // dzn -> Latn
+        case 0x80040000u: // eaa -> Latn
+        case 0x88240000u: // ebc -> Latn
+        case 0x98240000u: // ebg -> Latn
+        case 0xA8240000u: // ebk -> Latn
+        case 0xB8240000u: // ebo -> Latn
+        case 0xC4240000u: // ebr -> Latn
+        case 0xD0240000u: // ebu -> Latn
+        case 0x65650000u: // ee -> Latn
+        case 0x80A40000u: // efa -> Latn
+        case 0x90A40000u: // efe -> Latn
+        case 0xA0A40000u: // efi -> Latn
+        case 0x80C40000u: // ega -> Latn
+        case 0xACC40000u: // egl -> Latn
+        case 0xB0C40000u: // egm -> Latn
+        case 0xB8C40000u: // ego -> Latn
+        case 0xD0E40000u: // ehu -> Latn
+        case 0xBD040000u: // eip -> Latn
+        case 0xCD040000u: // eit -> Latn
+        case 0xD5040000u: // eiv -> Latn
+        case 0x81240000u: // eja -> Latn
+        case 0x81440000u: // eka -> Latn
+        case 0x91440000u: // eke -> Latn
+        case 0x99440000u: // ekg -> Latn
+        case 0xA1440000u: // eki -> Latn
+        case 0xAD440000u: // ekl -> Latn
+        case 0xB1440000u: // ekm -> Latn
+        case 0xB9440000u: // eko -> Latn
+        case 0xBD440000u: // ekp -> Latn
+        case 0xC5440000u: // ekr -> Latn
+        case 0x91640000u: // ele -> Latn
+        case 0xA9640000u: // elk -> Latn
+        case 0xB1640000u: // elm -> Latn
+        case 0xB9640000u: // elo -> Latn
+        case 0xD1640000u: // elu -> Latn
+        case 0x81840000u: // ema -> Latn
+        case 0x85840000u: // emb -> Latn
+        case 0x91840000u: // eme -> Latn
+        case 0xA1840000u: // emi -> Latn
+        case 0xB1840000u: // emm -> Latn
+        case 0xB5840000u: // emn -> Latn
+        case 0xBD840000u: // emp -> Latn
+        case 0xC9840000u: // ems -> Latn
+        case 0xD9840000u: // emw -> Latn
+        case 0xDD840000u: // emx -> Latn
+        case 0xE5840000u: // emz -> Latn
+        case 0x656E0000u: // en -> Latn
+        case 0x81A40000u: // ena -> Latn
+        case 0x85A40000u: // enb -> Latn
+        case 0x89A40000u: // enc -> Latn
+        case 0x8DA40000u: // end -> Latn
+        case 0xADA40000u: // enl -> Latn
+        case 0xB1A40000u: // enm -> Latn
+        case 0xB5A40000u: // enn -> Latn
+        case 0xB9A40000u: // eno -> Latn
+        case 0xC1A40000u: // enq -> Latn
+        case 0xC5A40000u: // enr -> Latn
+        case 0xD5A40000u: // env -> Latn
+        case 0xD9A40000u: // enw -> Latn
+        case 0xDDA40000u: // enx -> Latn
+        case 0x656F0000u: // eo -> Latn
+        case 0xCDC40000u: // eot -> Latn
+        case 0xA1E40000u: // epi -> Latn
+        case 0x9A240000u: // erg -> Latn
+        case 0x9E240000u: // erh -> Latn
+        case 0xA2240000u: // eri -> Latn
+        case 0xAA240000u: // erk -> Latn
+        case 0xC6240000u: // err -> Latn
+        case 0xCA240000u: // ers -> Latn
+        case 0xCE240000u: // ert -> Latn
+        case 0xDA240000u: // erw -> Latn
+        case 0x65730000u: // es -> Latn
+        case 0x92440000u: // ese -> Latn
+        case 0xA2440000u: // esi -> Latn
+        case 0xB2440000u: // esm -> Latn
+        case 0xCA440000u: // ess -> Latn
+        case 0xD2440000u: // esu -> Latn
+        case 0xE2440000u: // esy -> Latn
+        case 0x65740000u: // et -> Latn
+        case 0x86640000u: // etb -> Latn
+        case 0xB6640000u: // etn -> Latn
+        case 0xBA640000u: // eto -> Latn
+        case 0xC6640000u: // etr -> Latn
+        case 0xCA640000u: // ets -> Latn
+        case 0xD2640000u: // etu -> Latn
+        case 0xDE640000u: // etx -> Latn
+        case 0xE6640000u: // etz -> Latn
+        case 0x65750000u: // eu -> Latn
+        case 0x8E840000u: // eud -> Latn
+        case 0x9EA40000u: // evh -> Latn
+        case 0xBAC40000u: // ewo -> Latn
+        case 0xCEE40000u: // ext -> Latn
+        case 0x83040000u: // eya -> Latn
+        case 0xBB040000u: // eyo -> Latn
+        case 0x83240000u: // eza -> Latn
+        case 0x93240000u: // eze -> Latn
+        case 0x80050000u: // faa -> Latn
+        case 0x84050000u: // fab -> Latn
+        case 0x8C050000u: // fad -> Latn
+        case 0x94050000u: // faf -> Latn
+        case 0x98050000u: // fag -> Latn
+        case 0x9C050000u: // fah -> Latn
+        case 0xA0050000u: // fai -> Latn
+        case 0xA4050000u: // faj -> Latn
+        case 0xA8050000u: // fak -> Latn
+        case 0xAC050000u: // fal -> Latn
+        case 0xB0050000u: // fam -> Latn
+        case 0xB4050000u: // fan -> Latn
+        case 0xBC050000u: // fap -> Latn
+        case 0xC4050000u: // far -> Latn
+        case 0xD0050000u: // fau -> Latn
+        case 0xDC050000u: // fax -> Latn
+        case 0xAC250000u: // fbl -> Latn
+        case 0xC4850000u: // fer -> Latn
+        case 0x66660000u: // ff -> Latn
+        case 0xA0A50000u: // ffi -> Latn
+        case 0xB0A50000u: // ffm -> Latn
+        case 0xC4C50000u: // fgr -> Latn
+        case 0x66690000u: // fi -> Latn
+        case 0x91050000u: // fie -> Latn
+        case 0x95050000u: // fif -> Latn
+        case 0xAD050000u: // fil -> Latn
+        case 0xBD050000u: // fip -> Latn
+        case 0xC5050000u: // fir -> Latn
+        case 0xCD050000u: // fit -> Latn
+        case 0xD9050000u: // fiw -> Latn
+        case 0x666A0000u: // fj -> Latn
+        case 0xA9450000u: // fkk -> Latn
+        case 0xD5450000u: // fkv -> Latn
+        case 0x81650000u: // fla -> Latn
+        case 0x9D650000u: // flh -> Latn
+        case 0xA1650000u: // fli -> Latn
+        case 0xAD650000u: // fll -> Latn
+        case 0xB5650000u: // fln -> Latn
+        case 0xC5650000u: // flr -> Latn
+        case 0xE1650000u: // fly -> Latn
+        case 0xBD850000u: // fmp -> Latn
+        case 0x85A50000u: // fnb -> Latn
+        case 0x99A50000u: // fng -> Latn
+        case 0xA1A50000u: // fni -> Latn
+        case 0x666F0000u: // fo -> Latn
+        case 0x8DC50000u: // fod -> Latn
+        case 0xA1C50000u: // foi -> Latn
+        case 0xB1C50000u: // fom -> Latn
+        case 0xB5C50000u: // fon -> Latn
+        case 0xC5C50000u: // for -> Latn
+        case 0xC9C50000u: // fos -> Latn
+        case 0x91E50000u: // fpe -> Latn
+        case 0xCA050000u: // fqs -> Latn
+        case 0x66720000u: // fr -> Latn
+        case 0x8A250000u: // frc -> Latn
+        case 0x8E250000u: // frd -> Latn
+        case 0xAA250000u: // frk -> Latn
+        case 0xB2250000u: // frm -> Latn
+        case 0xBA250000u: // fro -> Latn
+        case 0xBE250000u: // frp -> Latn
+        case 0xC2250000u: // frq -> Latn
+        case 0xC6250000u: // frr -> Latn
+        case 0xCA250000u: // frs -> Latn
+        case 0xCE250000u: // frt -> Latn
+        case 0x8E850000u: // fud -> Latn
+        case 0x92850000u: // fue -> Latn
+        case 0x96850000u: // fuf -> Latn
+        case 0x9E850000u: // fuh -> Latn
+        case 0xA2850000u: // fui -> Latn
+        case 0xB2850000u: // fum -> Latn
+        case 0xB6850000u: // fun -> Latn
+        case 0xC2850000u: // fuq -> Latn
+        case 0xC6850000u: // fur -> Latn
+        case 0xCE850000u: // fut -> Latn
+        case 0xD2850000u: // fuu -> Latn
+        case 0xD6850000u: // fuv -> Latn
+        case 0xE2850000u: // fuy -> Latn
+        case 0xC6A50000u: // fvr -> Latn
+        case 0x82C50000u: // fwa -> Latn
+        case 0x92C50000u: // fwe -> Latn
+        case 0x66790000u: // fy -> Latn
+        case 0x67610000u: // ga -> Latn
+        case 0x80060000u: // gaa -> Latn
+        case 0x84060000u: // gab -> Latn
+        case 0x88060000u: // gac -> Latn
+        case 0x8C060000u: // gad -> Latn
+        case 0x90060000u: // gae -> Latn
+        case 0x94060000u: // gaf -> Latn
+        case 0x98060000u: // gag -> Latn
+        case 0x9C060000u: // gah -> Latn
+        case 0xA0060000u: // gai -> Latn
+        case 0xA4060000u: // gaj -> Latn
+        case 0xA8060000u: // gak -> Latn
+        case 0xAC060000u: // gal -> Latn
+        case 0xB0060000u: // gam -> Latn
+        case 0xB8060000u: // gao -> Latn
+        case 0xBC060000u: // gap -> Latn
+        case 0xC4060000u: // gar -> Latn
+        case 0xCC060000u: // gat -> Latn
+        case 0xD8060000u: // gaw -> Latn
+        case 0xDC060000u: // gax -> Latn
+        case 0xE0060000u: // gay -> Latn
+        case 0x80260000u: // gba -> Latn
+        case 0x84260000u: // gbb -> Latn
+        case 0x8C260000u: // gbd -> Latn
+        case 0x90260000u: // gbe -> Latn
+        case 0x94260000u: // gbf -> Latn
+        case 0x98260000u: // gbg -> Latn
+        case 0x9C260000u: // gbh -> Latn
+        case 0xA0260000u: // gbi -> Latn
+        case 0xB4260000u: // gbn -> Latn
+        case 0xBC260000u: // gbp -> Latn
+        case 0xC0260000u: // gbq -> Latn
+        case 0xC4260000u: // gbr -> Latn
+        case 0xC8260000u: // gbs -> Latn
+        case 0xD0260000u: // gbu -> Latn
+        case 0xD4260000u: // gbv -> Latn
+        case 0xD8260000u: // gbw -> Latn
+        case 0xDC260000u: // gbx -> Latn
+        case 0xE0260000u: // gby -> Latn
+        case 0x88460000u: // gcc -> Latn
+        case 0x8C460000u: // gcd -> Latn
+        case 0x94460000u: // gcf -> Latn
+        case 0xAC460000u: // gcl -> Latn
+        case 0xB4460000u: // gcn -> Latn
+        case 0xC4460000u: // gcr -> Latn
+        case 0xCC460000u: // gct -> Latn
+        case 0x67640000u: // gd -> Latn
+        case 0x88660000u: // gdc -> Latn
+        case 0x8C660000u: // gdd -> Latn
+        case 0x90660000u: // gde -> Latn
+        case 0x94660000u: // gdf -> Latn
+        case 0x98660000u: // gdg -> Latn
+        case 0x9C660000u: // gdh -> Latn
+        case 0xA0660000u: // gdi -> Latn
+        case 0xA4660000u: // gdj -> Latn
+        case 0xA8660000u: // gdk -> Latn
+        case 0xAC660000u: // gdl -> Latn
+        case 0xB0660000u: // gdm -> Latn
+        case 0xB4660000u: // gdn -> Latn
+        case 0xC0660000u: // gdq -> Latn
+        case 0xC4660000u: // gdr -> Latn
+        case 0xCC660000u: // gdt -> Latn
+        case 0xD0660000u: // gdu -> Latn
+        case 0x80860000u: // gea -> Latn
+        case 0x84860000u: // geb -> Latn
+        case 0x88860000u: // gec -> Latn
+        case 0x8C860000u: // ged -> Latn
+        case 0x94860000u: // gef -> Latn
+        case 0x98860000u: // geg -> Latn
+        case 0x9C860000u: // geh -> Latn
+        case 0xA0860000u: // gei -> Latn
+        case 0xA4860000u: // gej -> Latn
+        case 0xA8860000u: // gek -> Latn
+        case 0xAC860000u: // gel -> Latn
+        case 0xC0860000u: // geq -> Latn
+        case 0xC8860000u: // ges -> Latn
+        case 0xD4860000u: // gev -> Latn
+        case 0xD8860000u: // gew -> Latn
+        case 0xDC860000u: // gex -> Latn
+        case 0xE0860000u: // gey -> Latn
+        case 0xA8A60000u: // gfk -> Latn
+        case 0x80C60000u: // gga -> Latn
+        case 0x84C60000u: // ggb -> Latn
+        case 0x8CC60000u: // ggd -> Latn
+        case 0x90C60000u: // gge -> Latn
+        case 0xA8C60000u: // ggk -> Latn
+        case 0xACC60000u: // ggl -> Latn
+        case 0xCCC60000u: // ggt -> Latn
+        case 0xD0C60000u: // ggu -> Latn
+        case 0xD8C60000u: // ggw -> Latn
+        case 0x88E60000u: // ghc -> Latn
+        case 0xA8E60000u: // ghk -> Latn
+        case 0xB4E60000u: // ghn -> Latn
+        case 0xC8E60000u: // ghs -> Latn
+        case 0x81060000u: // gia -> Latn
+        case 0x85060000u: // gib -> Latn
+        case 0x89060000u: // gic -> Latn
+        case 0x8D060000u: // gid -> Latn
+        case 0x91060000u: // gie -> Latn
+        case 0x9D060000u: // gih -> Latn
+        case 0xAD060000u: // gil -> Latn
+        case 0xB1060000u: // gim -> Latn
+        case 0xBD060000u: // gip -> Latn
+        case 0xC1060000u: // giq -> Latn
+        case 0xC5060000u: // gir -> Latn
+        case 0xC9060000u: // gis -> Latn
+        case 0xCD060000u: // git -> Latn
+        case 0xDD060000u: // gix -> Latn
+        case 0xE1060000u: // giy -> Latn
+        case 0xE5060000u: // giz -> Latn
+        case 0xB1260000u: // gjm -> Latn
+        case 0xB5260000u: // gjn -> Latn
+        case 0xC5260000u: // gjr -> Latn
+        case 0x81460000u: // gka -> Latn
+        case 0x8D460000u: // gkd -> Latn
+        case 0x91460000u: // gke -> Latn
+        case 0xB5460000u: // gkn -> Latn
+        case 0xB9460000u: // gko -> Latn
+        case 0xBD460000u: // gkp -> Latn
+        case 0xD1460000u: // gku -> Latn
+        case 0x676C0000u: // gl -> Latn
+        case 0x85660000u: // glb -> Latn
+        case 0x89660000u: // glc -> Latn
+        case 0xA5660000u: // glj -> Latn
+        case 0xAD660000u: // gll -> Latn
+        case 0xB9660000u: // glo -> Latn
+        case 0xC5660000u: // glr -> Latn
+        case 0xD1660000u: // glu -> Latn
+        case 0xD9660000u: // glw -> Latn
+        case 0x81860000u: // gma -> Latn
+        case 0x85860000u: // gmb -> Latn
+        case 0x8D860000u: // gmd -> Latn
+        case 0x99860000u: // gmg -> Latn
+        case 0x9D860000u: // gmh -> Latn
+        case 0xB1860000u: // gmm -> Latn
+        case 0xB5860000u: // gmn -> Latn
+        case 0xC5860000u: // gmr -> Latn
+        case 0xD1860000u: // gmu -> Latn
+        case 0xDD860000u: // gmx -> Latn
+        case 0xE5860000u: // gmz -> Latn
+        case 0x676E0000u: // gn -> Latn
+        case 0x81A60000u: // gna -> Latn
+        case 0x85A60000u: // gnb -> Latn
+        case 0x89A60000u: // gnc -> Latn
+        case 0x8DA60000u: // gnd -> Latn
+        case 0x91A60000u: // gne -> Latn
+        case 0x99A60000u: // gng -> Latn
+        case 0x9DA60000u: // gnh -> Latn
+        case 0xA1A60000u: // gni -> Latn
+        case 0xA5A60000u: // gnj -> Latn
+        case 0xA9A60000u: // gnk -> Latn
+        case 0xADA60000u: // gnl -> Latn
+        case 0xB1A60000u: // gnm -> Latn
+        case 0xB5A60000u: // gnn -> Latn
+        case 0xC1A60000u: // gnq -> Latn
+        case 0xC5A60000u: // gnr -> Latn
+        case 0xCDA60000u: // gnt -> Latn
+        case 0xD1A60000u: // gnu -> Latn
+        case 0xD9A60000u: // gnw -> Latn
+        case 0xE5A60000u: // gnz -> Latn
+        case 0x81C60000u: // goa -> Latn
+        case 0x85C60000u: // gob -> Latn
+        case 0x89C60000u: // goc -> Latn
+        case 0x8DC60000u: // god -> Latn
+        case 0x99C60000u: // gog -> Latn
+        case 0x9DC60000u: // goh -> Latn
+        case 0xA1C60000u: // goi -> Latn
+        case 0xADC60000u: // gol -> Latn
+        case 0xB9C60000u: // goo -> Latn
+        case 0xBDC60000u: // gop -> Latn
+        case 0xC1C60000u: // goq -> Latn
+        case 0xC5C60000u: // gor -> Latn
+        case 0xC9C60000u: // gos -> Latn
+        case 0xD1C60000u: // gou -> Latn
+        case 0xD5C60000u: // gov -> Latn
+        case 0xD9C60000u: // gow -> Latn
+        case 0xDDC60000u: // gox -> Latn
+        case 0xE1C60000u: // goy -> Latn
+        case 0x81E60000u: // gpa -> Latn
+        case 0x91E60000u: // gpe -> Latn
+        case 0xB5E60000u: // gpn -> Latn
+        case 0x82060000u: // gqa -> Latn
+        case 0xB6060000u: // gqn -> Latn
+        case 0xC6060000u: // gqr -> Latn
+        case 0x86260000u: // grb -> Latn
+        case 0x8E260000u: // grd -> Latn
+        case 0x9A260000u: // grg -> Latn
+        case 0x9E260000u: // grh -> Latn
+        case 0xA2260000u: // gri -> Latn
+        case 0xA6260000u: // grj -> Latn
+        case 0xB2260000u: // grm -> Latn
+        case 0xC2260000u: // grq -> Latn
+        case 0xCA260000u: // grs -> Latn
+        case 0xD6260000u: // grv -> Latn
+        case 0xDA260000u: // grw -> Latn
+        case 0xDE260000u: // grx -> Latn
+        case 0xE2260000u: // gry -> Latn
+        case 0xE6260000u: // grz -> Latn
+        case 0xAE460000u: // gsl -> Latn
+        case 0xB6460000u: // gsn -> Latn
+        case 0xBA460000u: // gso -> Latn
+        case 0xBE460000u: // gsp -> Latn
+        case 0xDA460000u: // gsw -> Latn
+        case 0x82660000u: // gta -> Latn
+        case 0xD2660000u: // gtu -> Latn
+        case 0x82860000u: // gua -> Latn
+        case 0x86860000u: // gub -> Latn
+        case 0x8A860000u: // guc -> Latn
+        case 0x8E860000u: // gud -> Latn
+        case 0x92860000u: // gue -> Latn
+        case 0x96860000u: // guf -> Latn
+        case 0x9E860000u: // guh -> Latn
+        case 0xA2860000u: // gui -> Latn
+        case 0xAA860000u: // guk -> Latn
+        case 0xAE860000u: // gul -> Latn
+        case 0xB2860000u: // gum -> Latn
+        case 0xB6860000u: // gun -> Latn
+        case 0xBA860000u: // guo -> Latn
+        case 0xBE860000u: // gup -> Latn
+        case 0xC2860000u: // guq -> Latn
+        case 0xC6860000u: // gur -> Latn
+        case 0xCE860000u: // gut -> Latn
+        case 0xD2860000u: // guu -> Latn
+        case 0xDA860000u: // guw -> Latn
+        case 0xDE860000u: // gux -> Latn
+        case 0xE6860000u: // guz -> Latn
+        case 0x67760000u: // gv -> Latn
+        case 0x82A60000u: // gva -> Latn
+        case 0x8AA60000u: // gvc -> Latn
+        case 0x92A60000u: // gve -> Latn
+        case 0x96A60000u: // gvf -> Latn
+        case 0xA6A60000u: // gvj -> Latn
+        case 0xAEA60000u: // gvl -> Latn
+        case 0xB2A60000u: // gvm -> Latn
+        case 0xB6A60000u: // gvn -> Latn
+        case 0xBAA60000u: // gvo -> Latn
+        case 0xBEA60000u: // gvp -> Latn
+        case 0xCAA60000u: // gvs -> Latn
+        case 0xE2A60000u: // gvy -> Latn
+        case 0x82C60000u: // gwa -> Latn
+        case 0x86C60000u: // gwb -> Latn
+        case 0x8EC60000u: // gwd -> Latn
+        case 0x92C60000u: // gwe -> Latn
+        case 0x9AC60000u: // gwg -> Latn
+        case 0xA2C60000u: // gwi -> Latn
+        case 0xA6C60000u: // gwj -> Latn
+        case 0xB2C60000u: // gwm -> Latn
+        case 0xB6C60000u: // gwn -> Latn
+        case 0xC6C60000u: // gwr -> Latn
+        case 0xD2C60000u: // gwu -> Latn
+        case 0xDAC60000u: // gww -> Latn
+        case 0xDEC60000u: // gwx -> Latn
+        case 0xDEE60000u: // gxx -> Latn
+        case 0x87060000u: // gyb -> Latn
+        case 0x8F060000u: // gyd -> Latn
+        case 0x93060000u: // gye -> Latn
+        case 0x97060000u: // gyf -> Latn
+        case 0x9B060000u: // gyg -> Latn
+        case 0xA3060000u: // gyi -> Latn
+        case 0xAF060000u: // gyl -> Latn
+        case 0xB3060000u: // gym -> Latn
+        case 0xB7060000u: // gyn -> Latn
+        case 0xC7060000u: // gyr -> Latn
+        case 0xE3060000u: // gyy -> Latn
+        case 0xE7060000u: // gyz -> Latn
+        case 0x83260000u: // gza -> Latn
+        case 0xB7260000u: // gzn -> Latn
+        case 0x68610000u: // ha -> Latn
+        case 0x80070000u: // haa -> Latn
+        case 0x8C070000u: // had -> Latn
+        case 0x90070000u: // hae -> Latn
+        case 0x98070000u: // hag -> Latn
+        case 0x9C070000u: // hah -> Latn
+        case 0xA0070000u: // hai -> Latn
+        case 0xA4070000u: // haj -> Latn
+        case 0xAC070000u: // hal -> Latn
+        case 0xB0070000u: // ham -> Latn
+        case 0xB4070000u: // han -> Latn
+        case 0xB8070000u: // hao -> Latn
+        case 0xBC070000u: // hap -> Latn
+        case 0xC0070000u: // haq -> Latn
+        case 0xC8070000u: // has -> Latn
+        case 0xD4070000u: // hav -> Latn
+        case 0xD8070000u: // haw -> Latn
+        case 0xDC070000u: // hax -> Latn
+        case 0xE0070000u: // hay -> Latn
+        case 0x80270000u: // hba -> Latn
+        case 0x84270000u: // hbb -> Latn
+        case 0xB4270000u: // hbn -> Latn
+        case 0xD0270000u: // hbu -> Latn
+        case 0x9C470000u: // hch -> Latn
+        case 0x8C870000u: // hed -> Latn
+        case 0x98870000u: // heg -> Latn
+        case 0x9C870000u: // heh -> Latn
+        case 0xA0870000u: // hei -> Latn
+        case 0xB0870000u: // hem -> Latn
+        case 0xB0C70000u: // hgm -> Latn
+        case 0xD8C70000u: // hgw -> Latn
+        case 0xA0E70000u: // hhi -> Latn
+        case 0xC4E70000u: // hhr -> Latn
+        case 0xE0E70000u: // hhy -> Latn
+        case 0x81070000u: // hia -> Latn
+        case 0x85070000u: // hib -> Latn
+        case 0x8D070000u: // hid -> Latn
+        case 0x99070000u: // hig -> Latn
+        case 0x9D070000u: // hih -> Latn
+        case 0xA5070000u: // hij -> Latn
+        case 0xA9070000u: // hik -> Latn
+        case 0xAD070000u: // hil -> Latn
+        case 0xB9070000u: // hio -> Latn
+        case 0xC5070000u: // hir -> Latn
+        case 0xD9070000u: // hiw -> Latn
+        case 0xDD070000u: // hix -> Latn
+        case 0xA1270000u: // hji -> Latn
+        case 0x81470000u: // hka -> Latn
+        case 0x91470000u: // hke -> Latn
+        case 0xA9470000u: // hkk -> Latn
+        case 0x81670000u: // hla -> Latn
+        case 0x8D670000u: // hld -> Latn
+        case 0xCD670000u: // hlt -> Latn
+        case 0x81870000u: // hma -> Latn
+        case 0x85870000u: // hmb -> Latn
+        case 0x95870000u: // hmf -> Latn
+        case 0xB1870000u: // hmm -> Latn
+        case 0xB5870000u: // hmn -> Latn
+        case 0xBD870000u: // hmp -> Latn
+        case 0xC5870000u: // hmr -> Latn
+        case 0xC9870000u: // hms -> Latn
+        case 0xCD870000u: // hmt -> Latn
+        case 0xD1870000u: // hmu -> Latn
+        case 0xD5870000u: // hmv -> Latn
+        case 0xD9870000u: // hmw -> Latn
+        case 0xE1870000u: // hmy -> Latn
+        case 0xE5870000u: // hmz -> Latn
+        case 0x81A70000u: // hna -> Latn
+        case 0x99A70000u: // hng -> Latn
+        case 0x9DA70000u: // hnh -> Latn
+        case 0xA1A70000u: // hni -> Latn
+        case 0xB5A70000u: // hnn -> Latn
+        case 0xC9A70000u: // hns -> Latn
+        case 0x686F0000u: // ho -> Latn
+        case 0x81C70000u: // hoa -> Latn
+        case 0x85C70000u: // hob -> Latn
+        case 0x8DC70000u: // hod -> Latn
+        case 0x91C70000u: // hoe -> Latn
+        case 0xA1C70000u: // hoi -> Latn
+        case 0xADC70000u: // hol -> Latn
+        case 0xB1C70000u: // hom -> Latn
+        case 0xB9C70000u: // hoo -> Latn
+        case 0xBDC70000u: // hop -> Latn
+        case 0xC5C70000u: // hor -> Latn
+        case 0xCDC70000u: // hot -> Latn
+        case 0xD5C70000u: // hov -> Latn
+        case 0x68720000u: // hr -> Latn
+        case 0x82270000u: // hra -> Latn
+        case 0x8A270000u: // hrc -> Latn
+        case 0x92270000u: // hre -> Latn
+        case 0xAA270000u: // hrk -> Latn
+        case 0xB2270000u: // hrm -> Latn
+        case 0xBA270000u: // hro -> Latn
+        case 0xBE270000u: // hrp -> Latn
+        case 0xD2270000u: // hru -> Latn
+        case 0xDA270000u: // hrw -> Latn
+        case 0xDE270000u: // hrx -> Latn
+        case 0x86470000u: // hsb -> Latn
+        case 0x68740000u: // ht -> Latn
+        case 0xA2670000u: // hti -> Latn
+        case 0xBA670000u: // hto -> Latn
+        case 0xCA670000u: // hts -> Latn
+        case 0xD2670000u: // htu -> Latn
+        case 0x68750000u: // hu -> Latn
+        case 0x86870000u: // hub -> Latn
+        case 0x8A870000u: // huc -> Latn
+        case 0x8E870000u: // hud -> Latn
+        case 0x92870000u: // hue -> Latn
+        case 0x96870000u: // huf -> Latn
+        case 0x9A870000u: // hug -> Latn
+        case 0x9E870000u: // huh -> Latn
+        case 0xA2870000u: // hui -> Latn
+        case 0xAA870000u: // huk -> Latn
+        case 0xAE870000u: // hul -> Latn
+        case 0xB2870000u: // hum -> Latn
+        case 0xBE870000u: // hup -> Latn
+        case 0xC6870000u: // hur -> Latn
+        case 0xCA870000u: // hus -> Latn
+        case 0xD2870000u: // huu -> Latn
+        case 0xD6870000u: // huv -> Latn
+        case 0xDA870000u: // huw -> Latn
+        case 0xDE870000u: // hux -> Latn
+        case 0x8AA70000u: // hvc -> Latn
+        case 0x92A70000u: // hve -> Latn
+        case 0xAAA70000u: // hvk -> Latn
+        case 0xB6A70000u: // hvn -> Latn
+        case 0xD6A70000u: // hvv -> Latn
+        case 0x82C70000u: // hwa -> Latn
+        case 0x8AC70000u: // hwc -> Latn
+        case 0xBAC70000u: // hwo -> Latn
+        case 0x83070000u: // hya -> Latn
+        case 0x687A0000u: // hz -> Latn
+        case 0x69610000u: // ia -> Latn
+        case 0xA0080000u: // iai -> Latn
+        case 0xB4080000u: // ian -> Latn
+        case 0xC4080000u: // iar -> Latn
+        case 0x80280000u: // iba -> Latn
+        case 0x84280000u: // ibb -> Latn
+        case 0x8C280000u: // ibd -> Latn
+        case 0x90280000u: // ibe -> Latn
+        case 0x98280000u: // ibg -> Latn
+        case 0x9C280000u: // ibh -> Latn
+        case 0xAC280000u: // ibl -> Latn
+        case 0xB0280000u: // ibm -> Latn
+        case 0xB4280000u: // ibn -> Latn
+        case 0xC4280000u: // ibr -> Latn
+        case 0xD0280000u: // ibu -> Latn
+        case 0xE0280000u: // iby -> Latn
+        case 0x80480000u: // ica -> Latn
+        case 0x9C480000u: // ich -> Latn
+        case 0xC4480000u: // icr -> Latn
+        case 0x69640000u: // id -> Latn
+        case 0x80680000u: // ida -> Latn
+        case 0x84680000u: // idb -> Latn
+        case 0x88680000u: // idc -> Latn
+        case 0x8C680000u: // idd -> Latn
+        case 0x90680000u: // ide -> Latn
+        case 0xA0680000u: // idi -> Latn
+        case 0xC4680000u: // idr -> Latn
+        case 0xC8680000u: // ids -> Latn
+        case 0xCC680000u: // idt -> Latn
+        case 0xD0680000u: // idu -> Latn
+        case 0x69650000u: // ie -> Latn
+        case 0x80A80000u: // ifa -> Latn
+        case 0x84A80000u: // ifb -> Latn
+        case 0x90A80000u: // ife -> Latn
+        case 0x94A80000u: // iff -> Latn
+        case 0xA8A80000u: // ifk -> Latn
+        case 0xB0A80000u: // ifm -> Latn
+        case 0xD0A80000u: // ifu -> Latn
+        case 0xE0A80000u: // ify -> Latn
+        case 0x69670000u: // ig -> Latn
+        case 0x84C80000u: // igb -> Latn
+        case 0x90C80000u: // ige -> Latn
+        case 0x98C80000u: // igg -> Latn
+        case 0xACC80000u: // igl -> Latn
+        case 0xB0C80000u: // igm -> Latn
+        case 0xB4C80000u: // ign -> Latn
+        case 0xB8C80000u: // igo -> Latn
+        case 0xC8C80000u: // igs -> Latn
+        case 0xD8C80000u: // igw -> Latn
+        case 0x84E80000u: // ihb -> Latn
+        case 0xA0E80000u: // ihi -> Latn
+        case 0xBCE80000u: // ihp -> Latn
+        case 0xD8E80000u: // ihw -> Latn
+        case 0xB5080000u: // iin -> Latn
+        case 0x89280000u: // ijc -> Latn
+        case 0x91280000u: // ije -> Latn
+        case 0xA5280000u: // ijj -> Latn
+        case 0xB5280000u: // ijn -> Latn
+        case 0xC9280000u: // ijs -> Latn
+        case 0x696B0000u: // ik -> Latn
+        case 0x9D480000u: // ikh -> Latn
+        case 0xA1480000u: // iki -> Latn
+        case 0xA9480000u: // ikk -> Latn
+        case 0xAD480000u: // ikl -> Latn
+        case 0xB9480000u: // iko -> Latn
+        case 0xBD480000u: // ikp -> Latn
+        case 0xC5480000u: // ikr -> Latn
+        case 0xCD480000u: // ikt -> Latn
+        case 0xD5480000u: // ikv -> Latn
+        case 0xD9480000u: // ikw -> Latn
+        case 0xDD480000u: // ikx -> Latn
+        case 0xE5480000u: // ikz -> Latn
+        case 0x81680000u: // ila -> Latn
+        case 0x85680000u: // ilb -> Latn
+        case 0x99680000u: // ilg -> Latn
+        case 0xA1680000u: // ili -> Latn
+        case 0xA9680000u: // ilk -> Latn
+        case 0xB1680000u: // ilm -> Latn
+        case 0xB9680000u: // ilo -> Latn
+        case 0xBD680000u: // ilp -> Latn
+        case 0xD1680000u: // ilu -> Latn
+        case 0xD5680000u: // ilv -> Latn
+        case 0xA1880000u: // imi -> Latn
+        case 0xAD880000u: // iml -> Latn
+        case 0xB5880000u: // imn -> Latn
+        case 0xB9880000u: // imo -> Latn
+        case 0xC5880000u: // imr -> Latn
+        case 0xC9880000u: // ims -> Latn
+        case 0xCD880000u: // imt -> Latn
+        case 0x696E0000u: // in -> Latn
+        case 0x85A80000u: // inb -> Latn
+        case 0x99A80000u: // ing -> Latn
+        case 0xA5A80000u: // inj -> Latn
+        case 0xB5A80000u: // inn -> Latn
+        case 0xB9A80000u: // ino -> Latn
+        case 0xBDA80000u: // inp -> Latn
+        case 0x696F0000u: // io -> Latn
+        case 0xD1C80000u: // iou -> Latn
+        case 0xD9C80000u: // iow -> Latn
+        case 0xA1E80000u: // ipi -> Latn
+        case 0xB9E80000u: // ipo -> Latn
+        case 0xD2080000u: // iqu -> Latn
+        case 0xDA080000u: // iqw -> Latn
+        case 0x92280000u: // ire -> Latn
+        case 0x9E280000u: // irh -> Latn
+        case 0xA2280000u: // iri -> Latn
+        case 0xAA280000u: // irk -> Latn
+        case 0xB6280000u: // irn -> Latn
+        case 0xDE280000u: // irx -> Latn
+        case 0xE2280000u: // iry -> Latn
+        case 0x69730000u: // is -> Latn
+        case 0x82480000u: // isa -> Latn
+        case 0x8A480000u: // isc -> Latn
+        case 0x8E480000u: // isd -> Latn
+        case 0x9E480000u: // ish -> Latn
+        case 0xA2480000u: // isi -> Latn
+        case 0xB2480000u: // ism -> Latn
+        case 0xB6480000u: // isn -> Latn
+        case 0xBA480000u: // iso -> Latn
+        case 0xCE480000u: // ist -> Latn
+        case 0xD2480000u: // isu -> Latn
+        case 0x69740000u: // it -> Latn
+        case 0x86680000u: // itb -> Latn
+        case 0x8E680000u: // itd -> Latn
+        case 0x92680000u: // ite -> Latn
+        case 0xA2680000u: // iti -> Latn
+        case 0xB2680000u: // itm -> Latn
+        case 0xBA680000u: // ito -> Latn
+        case 0xC6680000u: // itr -> Latn
+        case 0xCA680000u: // its -> Latn
+        case 0xCE680000u: // itt -> Latn
+        case 0xD6680000u: // itv -> Latn
+        case 0xDA680000u: // itw -> Latn
+        case 0xDE680000u: // itx -> Latn
+        case 0xE2680000u: // ity -> Latn
+        case 0xE6680000u: // itz -> Latn
+        case 0xB2880000u: // ium -> Latn
+        case 0x86A80000u: // ivb -> Latn
+        case 0xD6A80000u: // ivv -> Latn
+        case 0xAAC80000u: // iwk -> Latn
+        case 0xB2C80000u: // iwm -> Latn
+        case 0xBAC80000u: // iwo -> Latn
+        case 0xCAC80000u: // iws -> Latn
+        case 0x8AE80000u: // ixc -> Latn
+        case 0xAEE80000u: // ixl -> Latn
+        case 0x83080000u: // iya -> Latn
+        case 0xBB080000u: // iyo -> Latn
+        case 0xDF080000u: // iyx -> Latn
+        case 0x9F280000u: // izh -> Latn
+        case 0xB3280000u: // izm -> Latn
+        case 0xC7280000u: // izr -> Latn
+        case 0xE7280000u: // izz -> Latn
+        case 0x80090000u: // jaa -> Latn
+        case 0x84090000u: // jab -> Latn
+        case 0x88090000u: // jac -> Latn
+        case 0x90090000u: // jae -> Latn
+        case 0x94090000u: // jaf -> Latn
+        case 0x9C090000u: // jah -> Latn
+        case 0xA4090000u: // jaj -> Latn
+        case 0xA8090000u: // jak -> Latn
+        case 0xAC090000u: // jal -> Latn
+        case 0xB0090000u: // jam -> Latn
+        case 0xB4090000u: // jan -> Latn
+        case 0xB8090000u: // jao -> Latn
+        case 0xC0090000u: // jaq -> Latn
+        case 0xC8090000u: // jas -> Latn
+        case 0xD0090000u: // jau -> Latn
+        case 0xDC090000u: // jax -> Latn
+        case 0xE0090000u: // jay -> Latn
+        case 0xE4090000u: // jaz -> Latn
+        case 0xA0290000u: // jbi -> Latn
+        case 0xA4290000u: // jbj -> Latn
+        case 0xA8290000u: // jbk -> Latn
+        case 0xB0290000u: // jbm -> Latn
+        case 0xB8290000u: // jbo -> Latn
+        case 0xC4290000u: // jbr -> Latn
+        case 0xCC290000u: // jbt -> Latn
+        case 0xD0290000u: // jbu -> Latn
+        case 0xD8290000u: // jbw -> Latn
+        case 0x84890000u: // jeb -> Latn
+        case 0x9C890000u: // jeh -> Latn
+        case 0xA0890000u: // jei -> Latn
+        case 0xA8890000u: // jek -> Latn
+        case 0xAC890000u: // jel -> Latn
+        case 0xB4890000u: // jen -> Latn
+        case 0xC4890000u: // jer -> Latn
+        case 0xCC890000u: // jet -> Latn
+        case 0xD0890000u: // jeu -> Latn
+        case 0x84C90000u: // jgb -> Latn
+        case 0xA8C90000u: // jgk -> Latn
+        case 0xB8C90000u: // jgo -> Latn
+        case 0xA0E90000u: // jhi -> Latn
+        case 0x81090000u: // jia -> Latn
+        case 0x85090000u: // jib -> Latn
+        case 0x89090000u: // jic -> Latn
+        case 0x8D090000u: // jid -> Latn
+        case 0x91090000u: // jie -> Latn
+        case 0x99090000u: // jig -> Latn
+        case 0xAD090000u: // jil -> Latn
+        case 0xB1090000u: // jim -> Latn
+        case 0xCD090000u: // jit -> Latn
+        case 0xD1090000u: // jiu -> Latn
+        case 0xD5090000u: // jiv -> Latn
+        case 0xE1090000u: // jiy -> Latn
+        case 0xC5290000u: // jjr -> Latn
+        case 0x81490000u: // jka -> Latn
+        case 0xB9490000u: // jko -> Latn
+        case 0xD1490000u: // jku -> Latn
+        case 0x91690000u: // jle -> Latn
+        case 0x81890000u: // jma -> Latn
+        case 0x85890000u: // jmb -> Latn
+        case 0x89890000u: // jmc -> Latn
+        case 0x8D890000u: // jmd -> Latn
+        case 0xA1890000u: // jmi -> Latn
+        case 0xB5890000u: // jmn -> Latn
+        case 0xC5890000u: // jmr -> Latn
+        case 0xC9890000u: // jms -> Latn
+        case 0xD9890000u: // jmw -> Latn
+        case 0xDD890000u: // jmx -> Latn
+        case 0x99A90000u: // jng -> Latn
+        case 0xA1A90000u: // jni -> Latn
+        case 0xA5A90000u: // jnj -> Latn
+        case 0x85C90000u: // job -> Latn
+        case 0x8DC90000u: // jod -> Latn
+        case 0xC5C90000u: // jor -> Latn
+        case 0xD9C90000u: // jow -> Latn
+        case 0xC6090000u: // jqr -> Latn
+        case 0x82290000u: // jra -> Latn
+        case 0xC6290000u: // jrr -> Latn
+        case 0xCE290000u: // jrt -> Latn
+        case 0xD2290000u: // jru -> Latn
+        case 0x82890000u: // jua -> Latn
+        case 0x86890000u: // jub -> Latn
+        case 0x8E890000u: // jud -> Latn
+        case 0x9E890000u: // juh -> Latn
+        case 0xA2890000u: // jui -> Latn
+        case 0xAA890000u: // juk -> Latn
+        case 0xB2890000u: // jum -> Latn
+        case 0xBA890000u: // juo -> Latn
+        case 0xBE890000u: // jup -> Latn
+        case 0xC6890000u: // jur -> Latn
+        case 0xCE890000u: // jut -> Latn
+        case 0xD2890000u: // juu -> Latn
+        case 0xDA890000u: // juw -> Latn
+        case 0x6A760000u: // jv -> Latn
+        case 0x8EA90000u: // jvd -> Latn
+        case 0xB6A90000u: // jvn -> Latn
+        case 0x6A770000u: // jw -> Latn
+        case 0xA2C90000u: // jwi -> Latn
+        case 0xE3090000u: // jyy -> Latn
+        case 0x840A0000u: // kab -> Latn
+        case 0x880A0000u: // kac -> Latn
+        case 0x8C0A0000u: // kad -> Latn
+        case 0x980A0000u: // kag -> Latn
+        case 0x9C0A0000u: // kah -> Latn
+        case 0xA00A0000u: // kai -> Latn
+        case 0xA40A0000u: // kaj -> Latn
+        case 0xA80A0000u: // kak -> Latn
+        case 0xB00A0000u: // kam -> Latn
+        case 0xB80A0000u: // kao -> Latn
+        case 0xC00A0000u: // kaq -> Latn
+        case 0xD40A0000u: // kav -> Latn
+        case 0xDC0A0000u: // kax -> Latn
+        case 0xE00A0000u: // kay -> Latn
+        case 0x802A0000u: // kba -> Latn
+        case 0x842A0000u: // kbb -> Latn
+        case 0x882A0000u: // kbc -> Latn
+        case 0x902A0000u: // kbe -> Latn
+        case 0x9C2A0000u: // kbh -> Latn
+        case 0xA02A0000u: // kbi -> Latn
+        case 0xA42A0000u: // kbj -> Latn
+        case 0xA82A0000u: // kbk -> Latn
+        case 0xAC2A0000u: // kbl -> Latn
+        case 0xB02A0000u: // kbm -> Latn
+        case 0xB42A0000u: // kbn -> Latn
+        case 0xB82A0000u: // kbo -> Latn
+        case 0xBC2A0000u: // kbp -> Latn
+        case 0xC02A0000u: // kbq -> Latn
+        case 0xC42A0000u: // kbr -> Latn
+        case 0xC82A0000u: // kbs -> Latn
+        case 0xCC2A0000u: // kbt -> Latn
+        case 0xD42A0000u: // kbv -> Latn
+        case 0xD82A0000u: // kbw -> Latn
+        case 0xDC2A0000u: // kbx -> Latn
+        case 0xE42A0000u: // kbz -> Latn
+        case 0x844A0000u: // kcb -> Latn
+        case 0x884A0000u: // kcc -> Latn
+        case 0x8C4A0000u: // kcd -> Latn
+        case 0x904A0000u: // kce -> Latn
+        case 0x944A0000u: // kcf -> Latn
+        case 0x984A0000u: // kcg -> Latn
+        case 0x9C4A0000u: // kch -> Latn
+        case 0xA04A0000u: // kci -> Latn
+        case 0xA44A0000u: // kcj -> Latn
+        case 0xA84A0000u: // kck -> Latn
+        case 0xAC4A0000u: // kcl -> Latn
+        case 0xB04A0000u: // kcm -> Latn
+        case 0xB44A0000u: // kcn -> Latn
+        case 0xB84A0000u: // kco -> Latn
+        case 0xBC4A0000u: // kcp -> Latn
+        case 0xC04A0000u: // kcq -> Latn
+        case 0xC84A0000u: // kcs -> Latn
+        case 0xCC4A0000u: // kct -> Latn
+        case 0xD04A0000u: // kcu -> Latn
+        case 0xD44A0000u: // kcv -> Latn
+        case 0xD84A0000u: // kcw -> Latn
+        case 0xE44A0000u: // kcz -> Latn
+        case 0x806A0000u: // kda -> Latn
+        case 0x886A0000u: // kdc -> Latn
+        case 0x8C6A0000u: // kdd -> Latn
+        case 0x906A0000u: // kde -> Latn
+        case 0x946A0000u: // kdf -> Latn
+        case 0x986A0000u: // kdg -> Latn
+        case 0x9C6A0000u: // kdh -> Latn
+        case 0xA06A0000u: // kdi -> Latn
+        case 0xA46A0000u: // kdj -> Latn
+        case 0xA86A0000u: // kdk -> Latn
+        case 0xAC6A0000u: // kdl -> Latn
+        case 0xB06A0000u: // kdm -> Latn
+        case 0xB46A0000u: // kdn -> Latn
+        case 0xBC6A0000u: // kdp -> Latn
+        case 0xC46A0000u: // kdr -> Latn
+        case 0xD86A0000u: // kdw -> Latn
+        case 0xDC6A0000u: // kdx -> Latn
+        case 0xE06A0000u: // kdy -> Latn
+        case 0xE46A0000u: // kdz -> Latn
+        case 0x808A0000u: // kea -> Latn
+        case 0x848A0000u: // keb -> Latn
+        case 0x888A0000u: // kec -> Latn
+        case 0x8C8A0000u: // ked -> Latn
+        case 0x908A0000u: // kee -> Latn
+        case 0x948A0000u: // kef -> Latn
+        case 0x988A0000u: // keg -> Latn
+        case 0x9C8A0000u: // keh -> Latn
+        case 0xA08A0000u: // kei -> Latn
+        case 0xA88A0000u: // kek -> Latn
+        case 0xAC8A0000u: // kel -> Latn
+        case 0xB08A0000u: // kem -> Latn
+        case 0xB48A0000u: // ken -> Latn
+        case 0xB88A0000u: // keo -> Latn
+        case 0xC48A0000u: // ker -> Latn
+        case 0xC88A0000u: // kes -> Latn
+        case 0xD08A0000u: // keu -> Latn
+        case 0xD88A0000u: // kew -> Latn
+        case 0xE48A0000u: // kez -> Latn
+        case 0x94AA0000u: // kff -> Latn
+        case 0xACAA0000u: // kfl -> Latn
+        case 0xB4AA0000u: // kfn -> Latn
+        case 0xB8AA0000u: // kfo -> Latn
+        case 0xD4AA0000u: // kfv -> Latn
+        case 0xD8AA0000u: // kfw -> Latn
+        case 0xE4AA0000u: // kfz -> Latn
+        case 0x6B670000u: // kg -> Latn
+        case 0x80CA0000u: // kga -> Latn
+        case 0x84CA0000u: // kgb -> Latn
+        case 0x90CA0000u: // kge -> Latn
+        case 0x94CA0000u: // kgf -> Latn
+        case 0xA8CA0000u: // kgk -> Latn
+        case 0xACCA0000u: // kgl -> Latn
+        case 0xB8CA0000u: // kgo -> Latn
+        case 0xBCCA0000u: // kgp -> Latn
+        case 0xC0CA0000u: // kgq -> Latn
+        case 0xC4CA0000u: // kgr -> Latn
+        case 0xC8CA0000u: // kgs -> Latn
+        case 0xCCCA0000u: // kgt -> Latn
+        case 0xD0CA0000u: // kgu -> Latn
+        case 0xD4CA0000u: // kgv -> Latn
+        case 0xD8CA0000u: // kgw -> Latn
+        case 0xDCCA0000u: // kgx -> Latn
+        case 0x80EA0000u: // kha -> Latn
+        case 0x88EA0000u: // khc -> Latn
+        case 0x8CEA0000u: // khd -> Latn
+        case 0x90EA0000u: // khe -> Latn
+        case 0x9CEA0000u: // khh -> Latn
+        case 0xA4EA0000u: // khj -> Latn
+        case 0xACEA0000u: // khl -> Latn
+        case 0xBCEA0000u: // khp -> Latn
+        case 0xC0EA0000u: // khq -> Latn
+        case 0xC4EA0000u: // khr -> Latn
+        case 0xC8EA0000u: // khs -> Latn
+        case 0xD0EA0000u: // khu -> Latn
+        case 0xDCEA0000u: // khx -> Latn
+        case 0xE0EA0000u: // khy -> Latn
+        case 0xE4EA0000u: // khz -> Latn
+        case 0x6B690000u: // ki -> Latn
+        case 0x810A0000u: // kia -> Latn
+        case 0x850A0000u: // kib -> Latn
+        case 0x890A0000u: // kic -> Latn
+        case 0x8D0A0000u: // kid -> Latn
+        case 0x910A0000u: // kie -> Latn
+        case 0x990A0000u: // kig -> Latn
+        case 0x9D0A0000u: // kih -> Latn
+        case 0xA50A0000u: // kij -> Latn
+        case 0xAD0A0000u: // kil -> Latn
+        case 0xB90A0000u: // kio -> Latn
+        case 0xC10A0000u: // kiq -> Latn
+        case 0xC90A0000u: // kis -> Latn
+        case 0xCD0A0000u: // kit -> Latn
+        case 0xD10A0000u: // kiu -> Latn
+        case 0xD50A0000u: // kiv -> Latn
+        case 0xD90A0000u: // kiw -> Latn
+        case 0xDD0A0000u: // kix -> Latn
+        case 0xE10A0000u: // kiy -> Latn
+        case 0xE50A0000u: // kiz -> Latn
+        case 0x6B6A0000u: // kj -> Latn
+        case 0x812A0000u: // kja -> Latn
+        case 0x852A0000u: // kjb -> Latn
+        case 0x892A0000u: // kjc -> Latn
+        case 0x8D2A0000u: // kjd -> Latn
+        case 0x912A0000u: // kje -> Latn
+        case 0xA12A0000u: // kji -> Latn
+        case 0xA52A0000u: // kjj -> Latn
+        case 0xA92A0000u: // kjk -> Latn
+        case 0xB12A0000u: // kjm -> Latn
+        case 0xB52A0000u: // kjn -> Latn
+        case 0xC12A0000u: // kjq -> Latn
+        case 0xC52A0000u: // kjr -> Latn
+        case 0xC92A0000u: // kjs -> Latn
+        case 0xD12A0000u: // kju -> Latn
+        case 0xDD2A0000u: // kjx -> Latn
+        case 0xE12A0000u: // kjy -> Latn
+        case 0x814A0000u: // kka -> Latn
+        case 0x854A0000u: // kkb -> Latn
+        case 0x894A0000u: // kkc -> Latn
+        case 0x8D4A0000u: // kkd -> Latn
+        case 0x914A0000u: // kke -> Latn
+        case 0x994A0000u: // kkg -> Latn
+        case 0xA14A0000u: // kki -> Latn
+        case 0xA54A0000u: // kkj -> Latn
+        case 0xA94A0000u: // kkk -> Latn
+        case 0xAD4A0000u: // kkl -> Latn
+        case 0xB14A0000u: // kkm -> Latn
+        case 0xB94A0000u: // kko -> Latn
+        case 0xBD4A0000u: // kkp -> Latn
+        case 0xC14A0000u: // kkq -> Latn
+        case 0xC54A0000u: // kkr -> Latn
+        case 0xC94A0000u: // kks -> Latn
+        case 0xD14A0000u: // kku -> Latn
+        case 0xD54A0000u: // kkv -> Latn
+        case 0xD94A0000u: // kkw -> Latn
+        case 0xDD4A0000u: // kkx -> Latn
+        case 0xE14A0000u: // kky -> Latn
+        case 0xE54A0000u: // kkz -> Latn
+        case 0x6B6C0000u: // kl -> Latn
+        case 0x816A0000u: // kla -> Latn
+        case 0x856A0000u: // klb -> Latn
+        case 0x896A0000u: // klc -> Latn
+        case 0x8D6A0000u: // kld -> Latn
+        case 0x956A0000u: // klf -> Latn
+        case 0x996A0000u: // klg -> Latn
+        case 0x9D6A0000u: // klh -> Latn
+        case 0xA16A0000u: // kli -> Latn
+        case 0xA96A0000u: // klk -> Latn
+        case 0xAD6A0000u: // kll -> Latn
+        case 0xB16A0000u: // klm -> Latn
+        case 0xB56A0000u: // kln -> Latn
+        case 0xB96A0000u: // klo -> Latn
+        case 0xBD6A0000u: // klp -> Latn
+        case 0xC16A0000u: // klq -> Latn
+        case 0xC96A0000u: // kls -> Latn
+        case 0xCD6A0000u: // klt -> Latn
+        case 0xD16A0000u: // klu -> Latn
+        case 0xD56A0000u: // klv -> Latn
+        case 0xD96A0000u: // klw -> Latn
+        case 0xDD6A0000u: // klx -> Latn
+        case 0xE16A0000u: // kly -> Latn
+        case 0xE56A0000u: // klz -> Latn
+        case 0x818A0000u: // kma -> Latn
+        case 0x858A0000u: // kmb -> Latn
+        case 0x898A0000u: // kmc -> Latn
+        case 0x8D8A0000u: // kmd -> Latn
+        case 0x918A0000u: // kme -> Latn
+        case 0x958A0000u: // kmf -> Latn
+        case 0x998A0000u: // kmg -> Latn
+        case 0x9D8A0000u: // kmh -> Latn
+        case 0xA18A0000u: // kmi -> Latn
+        case 0xA98A0000u: // kmk -> Latn
+        case 0xAD8A0000u: // kml -> Latn
+        case 0xB18A0000u: // kmm -> Latn
+        case 0xB58A0000u: // kmn -> Latn
+        case 0xB98A0000u: // kmo -> Latn
+        case 0xBD8A0000u: // kmp -> Latn
+        case 0xC18A0000u: // kmq -> Latn
+        case 0xC98A0000u: // kms -> Latn
+        case 0xCD8A0000u: // kmt -> Latn
+        case 0xD18A0000u: // kmu -> Latn
+        case 0xD58A0000u: // kmv -> Latn
+        case 0xD98A0000u: // kmw -> Latn
+        case 0xDD8A0000u: // kmx -> Latn
+        case 0xE18A0000u: // kmy -> Latn
+        case 0x81AA0000u: // kna -> Latn
+        case 0x85AA0000u: // knb -> Latn
+        case 0x8DAA0000u: // knd -> Latn
+        case 0x91AA0000u: // kne -> Latn
+        case 0x95AA0000u: // knf -> Latn
+        case 0xA1AA0000u: // kni -> Latn
+        case 0xA5AA0000u: // knj -> Latn
+        case 0xA9AA0000u: // knk -> Latn
+        case 0xADAA0000u: // knl -> Latn
+        case 0xB1AA0000u: // knm -> Latn
+        case 0xB9AA0000u: // kno -> Latn
+        case 0xBDAA0000u: // knp -> Latn
+        case 0xC1AA0000u: // knq -> Latn
+        case 0xC5AA0000u: // knr -> Latn
+        case 0xC9AA0000u: // kns -> Latn
+        case 0xCDAA0000u: // knt -> Latn
+        case 0xD1AA0000u: // knu -> Latn
+        case 0xD5AA0000u: // knv -> Latn
+        case 0xD9AA0000u: // knw -> Latn
+        case 0xDDAA0000u: // knx -> Latn
+        case 0xE1AA0000u: // kny -> Latn
+        case 0xE5AA0000u: // knz -> Latn
+        case 0x81CA0000u: // koa -> Latn
+        case 0x89CA0000u: // koc -> Latn
+        case 0x8DCA0000u: // kod -> Latn
+        case 0x91CA0000u: // koe -> Latn
+        case 0x95CA0000u: // kof -> Latn
+        case 0x99CA0000u: // kog -> Latn
+        case 0x9DCA0000u: // koh -> Latn
+        case 0xADCA0000u: // kol -> Latn
+        case 0xB9CA0000u: // koo -> Latn
+        case 0xBDCA0000u: // kop -> Latn
+        case 0xC1CA0000u: // koq -> Latn
+        case 0xC9CA0000u: // kos -> Latn
+        case 0xCDCA0000u: // kot -> Latn
+        case 0xD1CA0000u: // kou -> Latn
+        case 0xD5CA0000u: // kov -> Latn
+        case 0xD9CA0000u: // kow -> Latn
+        case 0xE1CA0000u: // koy -> Latn
+        case 0xE5CA0000u: // koz -> Latn
+        case 0x81EA0000u: // kpa -> Latn
+        case 0x89EA0000u: // kpc -> Latn
+        case 0x8DEA0000u: // kpd -> Latn
+        case 0x91EA0000u: // kpe -> Latn
+        case 0x95EA0000u: // kpf -> Latn
+        case 0x99EA0000u: // kpg -> Latn
+        case 0x9DEA0000u: // kph -> Latn
+        case 0xA1EA0000u: // kpi -> Latn
+        case 0xA5EA0000u: // kpj -> Latn
+        case 0xA9EA0000u: // kpk -> Latn
+        case 0xADEA0000u: // kpl -> Latn
+        case 0xB1EA0000u: // kpm -> Latn
+        case 0xB5EA0000u: // kpn -> Latn
+        case 0xB9EA0000u: // kpo -> Latn
+        case 0xC1EA0000u: // kpq -> Latn
+        case 0xC5EA0000u: // kpr -> Latn
+        case 0xC9EA0000u: // kps -> Latn
+        case 0xD1EA0000u: // kpu -> Latn
+        case 0xD9EA0000u: // kpw -> Latn
+        case 0xDDEA0000u: // kpx -> Latn
+        case 0xE5EA0000u: // kpz -> Latn
+        case 0x820A0000u: // kqa -> Latn
+        case 0x860A0000u: // kqb -> Latn
+        case 0x8A0A0000u: // kqc -> Latn
+        case 0x920A0000u: // kqe -> Latn
+        case 0x960A0000u: // kqf -> Latn
+        case 0x9A0A0000u: // kqg -> Latn
+        case 0x9E0A0000u: // kqh -> Latn
+        case 0xA20A0000u: // kqi -> Latn
+        case 0xA60A0000u: // kqj -> Latn
+        case 0xAA0A0000u: // kqk -> Latn
+        case 0xAE0A0000u: // kql -> Latn
+        case 0xB20A0000u: // kqm -> Latn
+        case 0xB60A0000u: // kqn -> Latn
+        case 0xBA0A0000u: // kqo -> Latn
+        case 0xBE0A0000u: // kqp -> Latn
+        case 0xC20A0000u: // kqq -> Latn
+        case 0xC60A0000u: // kqr -> Latn
+        case 0xCA0A0000u: // kqs -> Latn
+        case 0xCE0A0000u: // kqt -> Latn
+        case 0xD20A0000u: // kqu -> Latn
+        case 0xD60A0000u: // kqv -> Latn
+        case 0xDA0A0000u: // kqw -> Latn
+        case 0xDE0A0000u: // kqx -> Latn
+        case 0xE60A0000u: // kqz -> Latn
+        case 0x6B720000u: // kr -> Latn
+        case 0x862A0000u: // krb -> Latn
+        case 0x8E2A0000u: // krd -> Latn
+        case 0x922A0000u: // kre -> Latn
+        case 0x962A0000u: // krf -> Latn
+        case 0x9E2A0000u: // krh -> Latn
+        case 0xA22A0000u: // kri -> Latn
+        case 0xA62A0000u: // krj -> Latn
+        case 0xAE2A0000u: // krl -> Latn
+        case 0xB62A0000u: // krn -> Latn
+        case 0xBE2A0000u: // krp -> Latn
+        case 0xCA2A0000u: // krs -> Latn
+        case 0xCE2A0000u: // krt -> Latn
+        case 0xDA2A0000u: // krw -> Latn
+        case 0xDE2A0000u: // krx -> Latn
+        case 0xE22A0000u: // kry -> Latn
+        case 0xE62A0000u: // krz -> Latn
+        case 0x864A0000u: // ksb -> Latn
+        case 0x8A4A0000u: // ksc -> Latn
+        case 0x8E4A0000u: // ksd -> Latn
+        case 0x924A0000u: // kse -> Latn
+        case 0x964A0000u: // ksf -> Latn
+        case 0x9A4A0000u: // ksg -> Latn
+        case 0x9E4A0000u: // ksh -> Latn
+        case 0xA24A0000u: // ksi -> Latn
+        case 0xA64A0000u: // ksj -> Latn
+        case 0xAA4A0000u: // ksk -> Latn
+        case 0xAE4A0000u: // ksl -> Latn
+        case 0xB24A0000u: // ksm -> Latn
+        case 0xB64A0000u: // ksn -> Latn
+        case 0xBA4A0000u: // kso -> Latn
+        case 0xBE4A0000u: // ksp -> Latn
+        case 0xC24A0000u: // ksq -> Latn
+        case 0xC64A0000u: // ksr -> Latn
+        case 0xCA4A0000u: // kss -> Latn
+        case 0xCE4A0000u: // kst -> Latn
+        case 0xD64A0000u: // ksv -> Latn
+        case 0xDE4A0000u: // ksx -> Latn
+        case 0x826A0000u: // kta -> Latn
+        case 0x8A6A0000u: // ktc -> Latn
+        case 0x8E6A0000u: // ktd -> Latn
+        case 0x966A0000u: // ktf -> Latn
+        case 0x9A6A0000u: // ktg -> Latn
+        case 0x9E6A0000u: // kth -> Latn
+        case 0xA26A0000u: // kti -> Latn
+        case 0xA66A0000u: // ktj -> Latn
+        case 0xAA6A0000u: // ktk -> Latn
+        case 0xB26A0000u: // ktm -> Latn
+        case 0xB66A0000u: // ktn -> Latn
+        case 0xBA6A0000u: // kto -> Latn
+        case 0xC26A0000u: // ktq -> Latn
+        case 0xCA6A0000u: // kts -> Latn
+        case 0xCE6A0000u: // ktt -> Latn
+        case 0xD26A0000u: // ktu -> Latn
+        case 0xD66A0000u: // ktv -> Latn
+        case 0xDA6A0000u: // ktw -> Latn
+        case 0xDE6A0000u: // ktx -> Latn
+        case 0xE26A0000u: // kty -> Latn
+        case 0xE66A0000u: // ktz -> Latn
+        case 0x6B750000u: // ku -> Latn
+        case 0x868A0000u: // kub -> Latn
+        case 0x8A8A0000u: // kuc -> Latn
+        case 0x8E8A0000u: // kud -> Latn
+        case 0x928A0000u: // kue -> Latn
+        case 0x9A8A0000u: // kug -> Latn
+        case 0x9E8A0000u: // kuh -> Latn
+        case 0xA28A0000u: // kui -> Latn
+        case 0xA68A0000u: // kuj -> Latn
+        case 0xAA8A0000u: // kuk -> Latn
+        case 0xAE8A0000u: // kul -> Latn
+        case 0xB68A0000u: // kun -> Latn
+        case 0xBA8A0000u: // kuo -> Latn
+        case 0xBE8A0000u: // kup -> Latn
+        case 0xC28A0000u: // kuq -> Latn
+        case 0xCA8A0000u: // kus -> Latn
+        case 0xCE8A0000u: // kut -> Latn
+        case 0xD28A0000u: // kuu -> Latn
+        case 0xD68A0000u: // kuv -> Latn
+        case 0xDA8A0000u: // kuw -> Latn
+        case 0xDE8A0000u: // kux -> Latn
+        case 0xE28A0000u: // kuy -> Latn
+        case 0xE68A0000u: // kuz -> Latn
+        case 0x86AA0000u: // kvb -> Latn
+        case 0x8AAA0000u: // kvc -> Latn
+        case 0x8EAA0000u: // kvd -> Latn
+        case 0x92AA0000u: // kve -> Latn
+        case 0x96AA0000u: // kvf -> Latn
+        case 0x9AAA0000u: // kvg -> Latn
+        case 0x9EAA0000u: // kvh -> Latn
+        case 0xA2AA0000u: // kvi -> Latn
+        case 0xA6AA0000u: // kvj -> Latn
+        case 0xAEAA0000u: // kvl -> Latn
+        case 0xB2AA0000u: // kvm -> Latn
+        case 0xB6AA0000u: // kvn -> Latn
+        case 0xBAAA0000u: // kvo -> Latn
+        case 0xBEAA0000u: // kvp -> Latn
+        case 0xC6AA0000u: // kvr -> Latn
+        case 0xD6AA0000u: // kvv -> Latn
+        case 0xDAAA0000u: // kvw -> Latn
+        case 0xE6AA0000u: // kvz -> Latn
+        case 0x6B770000u: // kw -> Latn
+        case 0x82CA0000u: // kwa -> Latn
+        case 0x86CA0000u: // kwb -> Latn
+        case 0x8ACA0000u: // kwc -> Latn
+        case 0x8ECA0000u: // kwd -> Latn
+        case 0x92CA0000u: // kwe -> Latn
+        case 0x96CA0000u: // kwf -> Latn
+        case 0x9ACA0000u: // kwg -> Latn
+        case 0x9ECA0000u: // kwh -> Latn
+        case 0xA2CA0000u: // kwi -> Latn
+        case 0xA6CA0000u: // kwj -> Latn
+        case 0xAACA0000u: // kwk -> Latn
+        case 0xAECA0000u: // kwl -> Latn
+        case 0xB2CA0000u: // kwm -> Latn
+        case 0xB6CA0000u: // kwn -> Latn
+        case 0xBACA0000u: // kwo -> Latn
+        case 0xBECA0000u: // kwp -> Latn
+        case 0xC6CA0000u: // kwr -> Latn
+        case 0xCACA0000u: // kws -> Latn
+        case 0xCECA0000u: // kwt -> Latn
+        case 0xD2CA0000u: // kwu -> Latn
+        case 0xD6CA0000u: // kwv -> Latn
+        case 0xDACA0000u: // kww -> Latn
+        case 0xE2CA0000u: // kwy -> Latn
+        case 0xE6CA0000u: // kwz -> Latn
+        case 0x82EA0000u: // kxa -> Latn
+        case 0x86EA0000u: // kxb -> Latn
+        case 0x8AEA0000u: // kxc -> Latn
+        case 0x8EEA0000u: // kxd -> Latn
+        case 0xA2EA0000u: // kxi -> Latn
+        case 0xA6EA0000u: // kxj -> Latn
+        case 0xB6EA0000u: // kxn -> Latn
+        case 0xBAEA0000u: // kxo -> Latn
+        case 0xC2EA0000u: // kxq -> Latn
+        case 0xC6EA0000u: // kxr -> Latn
+        case 0xCEEA0000u: // kxt -> Latn
+        case 0xD6EA0000u: // kxv -> Latn
+        case 0xDAEA0000u: // kxw -> Latn
+        case 0xDEEA0000u: // kxx -> Latn
+        case 0xE2EA0000u: // kxy -> Latn
+        case 0xE6EA0000u: // kxz -> Latn
+        case 0x6B795452u: // ky-TR -> Latn
+        case 0x830A0000u: // kya -> Latn
+        case 0x870A0000u: // kyb -> Latn
+        case 0x8B0A0000u: // kyc -> Latn
+        case 0x8F0A0000u: // kyd -> Latn
+        case 0x930A0000u: // kye -> Latn
+        case 0x970A0000u: // kyf -> Latn
+        case 0x9B0A0000u: // kyg -> Latn
+        case 0x9F0A0000u: // kyh -> Latn
+        case 0xA30A0000u: // kyi -> Latn
+        case 0xA70A0000u: // kyj -> Latn
+        case 0xAB0A0000u: // kyk -> Latn
+        case 0xAF0A0000u: // kyl -> Latn
+        case 0xB30A0000u: // kym -> Latn
+        case 0xB70A0000u: // kyn -> Latn
+        case 0xBB0A0000u: // kyo -> Latn
+        case 0xC30A0000u: // kyq -> Latn
+        case 0xC70A0000u: // kyr -> Latn
+        case 0xCB0A0000u: // kys -> Latn
+        case 0xCF0A0000u: // kyt -> Latn
+        case 0xDF0A0000u: // kyx -> Latn
+        case 0xE30A0000u: // kyy -> Latn
+        case 0xE70A0000u: // kyz -> Latn
+        case 0x832A0000u: // kza -> Latn
+        case 0x872A0000u: // kzb -> Latn
+        case 0x8B2A0000u: // kzc -> Latn
+        case 0x8F2A0000u: // kzd -> Latn
+        case 0x932A0000u: // kze -> Latn
+        case 0x972A0000u: // kzf -> Latn
+        case 0xA32A0000u: // kzi -> Latn
+        case 0xAB2A0000u: // kzk -> Latn
+        case 0xAF2A0000u: // kzl -> Latn
+        case 0xB32A0000u: // kzm -> Latn
+        case 0xB72A0000u: // kzn -> Latn
+        case 0xBB2A0000u: // kzo -> Latn
+        case 0xBF2A0000u: // kzp -> Latn
+        case 0xC72A0000u: // kzr -> Latn
+        case 0xCB2A0000u: // kzs -> Latn
+        case 0xD32A0000u: // kzu -> Latn
+        case 0xD72A0000u: // kzv -> Latn
+        case 0xDB2A0000u: // kzw -> Latn
+        case 0xDF2A0000u: // kzx -> Latn
+        case 0xE32A0000u: // kzy -> Latn
+        case 0xE72A0000u: // kzz -> Latn
+        case 0x6C610000u: // la -> Latn
+        case 0x800B0000u: // laa -> Latn
+        case 0x880B0000u: // lac -> Latn
+        case 0x980B0000u: // lag -> Latn
+        case 0xA00B0000u: // lai -> Latn
+        case 0xA40B0000u: // laj -> Latn
+        case 0xAC0B0000u: // lal -> Latn
+        case 0xB00B0000u: // lam -> Latn
+        case 0xB40B0000u: // lan -> Latn
+        case 0xBC0B0000u: // lap -> Latn
+        case 0xC00B0000u: // laq -> Latn
+        case 0xC40B0000u: // lar -> Latn
+        case 0xC80B0000u: // las -> Latn
+        case 0xD00B0000u: // lau -> Latn
+        case 0xD80B0000u: // law -> Latn
+        case 0xDC0B0000u: // lax -> Latn
+        case 0xE40B0000u: // laz -> Latn
+        case 0x6C620000u: // lb -> Latn
+        case 0x842B0000u: // lbb -> Latn
+        case 0xA02B0000u: // lbi -> Latn
+        case 0xAC2B0000u: // lbl -> Latn
+        case 0xB42B0000u: // lbn -> Latn
+        case 0xC02B0000u: // lbq -> Latn
+        case 0xCC2B0000u: // lbt -> Latn
+        case 0xD02B0000u: // lbu -> Latn
+        case 0xD42B0000u: // lbv -> Latn
+        case 0xD82B0000u: // lbw -> Latn
+        case 0xDC2B0000u: // lbx -> Latn
+        case 0xE02B0000u: // lby -> Latn
+        case 0xE42B0000u: // lbz -> Latn
+        case 0x884B0000u: // lcc -> Latn
+        case 0x8C4B0000u: // lcd -> Latn
+        case 0x904B0000u: // lce -> Latn
+        case 0x944B0000u: // lcf -> Latn
+        case 0x9C4B0000u: // lch -> Latn
+        case 0xAC4B0000u: // lcl -> Latn
+        case 0xB04B0000u: // lcm -> Latn
+        case 0xC04B0000u: // lcq -> Latn
+        case 0xC84B0000u: // lcs -> Latn
+        case 0x806B0000u: // lda -> Latn
+        case 0x846B0000u: // ldb -> Latn
+        case 0x8C6B0000u: // ldd -> Latn
+        case 0x986B0000u: // ldg -> Latn
+        case 0x9C6B0000u: // ldh -> Latn
+        case 0xA06B0000u: // ldi -> Latn
+        case 0xA46B0000u: // ldj -> Latn
+        case 0xA86B0000u: // ldk -> Latn
+        case 0xAC6B0000u: // ldl -> Latn
+        case 0xB06B0000u: // ldm -> Latn
+        case 0xB46B0000u: // ldn -> Latn
+        case 0xB86B0000u: // ldo -> Latn
+        case 0xBC6B0000u: // ldp -> Latn
+        case 0xC06B0000u: // ldq -> Latn
+        case 0x808B0000u: // lea -> Latn
+        case 0x848B0000u: // leb -> Latn
+        case 0x888B0000u: // lec -> Latn
+        case 0x8C8B0000u: // led -> Latn
+        case 0x908B0000u: // lee -> Latn
+        case 0x948B0000u: // lef -> Latn
+        case 0x9C8B0000u: // leh -> Latn
+        case 0xA08B0000u: // lei -> Latn
+        case 0xA48B0000u: // lej -> Latn
+        case 0xA88B0000u: // lek -> Latn
+        case 0xAC8B0000u: // lel -> Latn
+        case 0xB08B0000u: // lem -> Latn
+        case 0xB48B0000u: // len -> Latn
+        case 0xB88B0000u: // leo -> Latn
+        case 0xC08B0000u: // leq -> Latn
+        case 0xC48B0000u: // ler -> Latn
+        case 0xC88B0000u: // les -> Latn
+        case 0xCC8B0000u: // let -> Latn
+        case 0xD08B0000u: // leu -> Latn
+        case 0xD48B0000u: // lev -> Latn
+        case 0xD88B0000u: // lew -> Latn
+        case 0xDC8B0000u: // lex -> Latn
+        case 0xE08B0000u: // ley -> Latn
+        case 0x80AB0000u: // lfa -> Latn
+        case 0xB4AB0000u: // lfn -> Latn
+        case 0x6C670000u: // lg -> Latn
+        case 0x80CB0000u: // lga -> Latn
+        case 0x84CB0000u: // lgb -> Latn
+        case 0x98CB0000u: // lgg -> Latn
+        case 0x9CCB0000u: // lgh -> Latn
+        case 0xA0CB0000u: // lgi -> Latn
+        case 0xA8CB0000u: // lgk -> Latn
+        case 0xACCB0000u: // lgl -> Latn
+        case 0xB0CB0000u: // lgm -> Latn
+        case 0xB4CB0000u: // lgn -> Latn
+        case 0xB8CB0000u: // lgo -> Latn
+        case 0xC0CB0000u: // lgq -> Latn
+        case 0xC4CB0000u: // lgr -> Latn
+        case 0xCCCB0000u: // lgt -> Latn
+        case 0xD0CB0000u: // lgu -> Latn
+        case 0xE4CB0000u: // lgz -> Latn
+        case 0x80EB0000u: // lha -> Latn
+        case 0x9CEB0000u: // lhh -> Latn
+        case 0xA0EB0000u: // lhi -> Latn
+        case 0xB4EB0000u: // lhn -> Latn
+        case 0xCCEB0000u: // lht -> Latn
+        case 0xD0EB0000u: // lhu -> Latn
+        case 0x6C690000u: // li -> Latn
+        case 0x810B0000u: // lia -> Latn
+        case 0x850B0000u: // lib -> Latn
+        case 0x890B0000u: // lic -> Latn
+        case 0x8D0B0000u: // lid -> Latn
+        case 0x910B0000u: // lie -> Latn
+        case 0x990B0000u: // lig -> Latn
+        case 0x9D0B0000u: // lih -> Latn
+        case 0xA50B0000u: // lij -> Latn
+        case 0xA90B0000u: // lik -> Latn
+        case 0xAD0B0000u: // lil -> Latn
+        case 0xB90B0000u: // lio -> Latn
+        case 0xBD0B0000u: // lip -> Latn
+        case 0xC10B0000u: // liq -> Latn
+        case 0xC50B0000u: // lir -> Latn
+        case 0xD10B0000u: // liu -> Latn
+        case 0xD50B0000u: // liv -> Latn
+        case 0xD90B0000u: // liw -> Latn
+        case 0xDD0B0000u: // lix -> Latn
+        case 0xE10B0000u: // liy -> Latn
+        case 0xE50B0000u: // liz -> Latn
+        case 0x812B0000u: // lja -> Latn
+        case 0x912B0000u: // lje -> Latn
+        case 0xA12B0000u: // lji -> Latn
+        case 0xAD2B0000u: // ljl -> Latn
+        case 0xBD2B0000u: // ljp -> Latn
+        case 0xD92B0000u: // ljw -> Latn
+        case 0xDD2B0000u: // ljx -> Latn
+        case 0x814B0000u: // lka -> Latn
+        case 0x854B0000u: // lkb -> Latn
+        case 0x894B0000u: // lkc -> Latn
+        case 0x8D4B0000u: // lkd -> Latn
+        case 0x914B0000u: // lke -> Latn
+        case 0xA54B0000u: // lkj -> Latn
+        case 0xAD4B0000u: // lkl -> Latn
+        case 0xB14B0000u: // lkm -> Latn
+        case 0xB54B0000u: // lkn -> Latn
+        case 0xB94B0000u: // lko -> Latn
+        case 0xC54B0000u: // lkr -> Latn
+        case 0xC94B0000u: // lks -> Latn
+        case 0xCD4B0000u: // lkt -> Latn
+        case 0xD14B0000u: // lku -> Latn
+        case 0xE14B0000u: // lky -> Latn
+        case 0x816B0000u: // lla -> Latn
+        case 0x856B0000u: // llb -> Latn
+        case 0x896B0000u: // llc -> Latn
+        case 0x8D6B0000u: // lld -> Latn
+        case 0x916B0000u: // lle -> Latn
+        case 0x956B0000u: // llf -> Latn
+        case 0x996B0000u: // llg -> Latn
+        case 0xA16B0000u: // lli -> Latn
+        case 0xA56B0000u: // llj -> Latn
+        case 0xA96B0000u: // llk -> Latn
+        case 0xAD6B0000u: // lll -> Latn
+        case 0xB16B0000u: // llm -> Latn
+        case 0xB56B0000u: // lln -> Latn
+        case 0xBD6B0000u: // llp -> Latn
+        case 0xC16B0000u: // llq -> Latn
+        case 0xD16B0000u: // llu -> Latn
+        case 0xDD6B0000u: // llx -> Latn
+        case 0x818B0000u: // lma -> Latn
+        case 0x858B0000u: // lmb -> Latn
+        case 0x898B0000u: // lmc -> Latn
+        case 0x8D8B0000u: // lmd -> Latn
+        case 0x918B0000u: // lme -> Latn
+        case 0x958B0000u: // lmf -> Latn
+        case 0x998B0000u: // lmg -> Latn
+        case 0xA18B0000u: // lmi -> Latn
+        case 0xA58B0000u: // lmj -> Latn
+        case 0xA98B0000u: // lmk -> Latn
+        case 0xAD8B0000u: // lml -> Latn
+        case 0xB98B0000u: // lmo -> Latn
+        case 0xBD8B0000u: // lmp -> Latn
+        case 0xC18B0000u: // lmq -> Latn
+        case 0xC58B0000u: // lmr -> Latn
+        case 0xD18B0000u: // lmu -> Latn
+        case 0xD58B0000u: // lmv -> Latn
+        case 0xD98B0000u: // lmw -> Latn
+        case 0xDD8B0000u: // lmx -> Latn
+        case 0xE18B0000u: // lmy -> Latn
+        case 0x6C6E0000u: // ln -> Latn
+        case 0x81AB0000u: // lna -> Latn
+        case 0x85AB0000u: // lnb -> Latn
+        case 0x8DAB0000u: // lnd -> Latn
+        case 0x99AB0000u: // lng -> Latn
+        case 0x9DAB0000u: // lnh -> Latn
+        case 0xA1AB0000u: // lni -> Latn
+        case 0xA5AB0000u: // lnj -> Latn
+        case 0xADAB0000u: // lnl -> Latn
+        case 0xB1AB0000u: // lnm -> Latn
+        case 0xB5AB0000u: // lnn -> Latn
+        case 0xC9AB0000u: // lns -> Latn
+        case 0xD1AB0000u: // lnu -> Latn
+        case 0xD9AB0000u: // lnw -> Latn
+        case 0xE5AB0000u: // lnz -> Latn
+        case 0x81CB0000u: // loa -> Latn
+        case 0x85CB0000u: // lob -> Latn
+        case 0x89CB0000u: // loc -> Latn
+        case 0x91CB0000u: // loe -> Latn
+        case 0x99CB0000u: // log -> Latn
+        case 0x9DCB0000u: // loh -> Latn
+        case 0xA1CB0000u: // loi -> Latn
+        case 0xA5CB0000u: // loj -> Latn
+        case 0xA9CB0000u: // lok -> Latn
+        case 0xADCB0000u: // lol -> Latn
+        case 0xB1CB0000u: // lom -> Latn
+        case 0xB5CB0000u: // lon -> Latn
+        case 0xB9CB0000u: // loo -> Latn
+        case 0xBDCB0000u: // lop -> Latn
+        case 0xC1CB0000u: // loq -> Latn
+        case 0xC5CB0000u: // lor -> Latn
+        case 0xC9CB0000u: // los -> Latn
+        case 0xCDCB0000u: // lot -> Latn
+        case 0xD1CB0000u: // lou -> Latn
+        case 0xD9CB0000u: // low -> Latn
+        case 0xDDCB0000u: // lox -> Latn
+        case 0xE5CB0000u: // loz -> Latn
+        case 0x81EB0000u: // lpa -> Latn
+        case 0x91EB0000u: // lpe -> Latn
+        case 0xB5EB0000u: // lpn -> Latn
+        case 0xDDEB0000u: // lpx -> Latn
+        case 0xC60B0000u: // lqr -> Latn
+        case 0x822B0000u: // lra -> Latn
+        case 0x9A2B0000u: // lrg -> Latn
+        case 0xA22B0000u: // lri -> Latn
+        case 0xB22B0000u: // lrm -> Latn
+        case 0xB62B0000u: // lrn -> Latn
+        case 0xBA2B0000u: // lro -> Latn
+        case 0xCE2B0000u: // lrt -> Latn
+        case 0xD62B0000u: // lrv -> Latn
+        case 0xE62B0000u: // lrz -> Latn
+        case 0x924B0000u: // lse -> Latn
+        case 0xA24B0000u: // lsi -> Latn
+        case 0xB24B0000u: // lsm -> Latn
+        case 0xC64B0000u: // lsr -> Latn
+        case 0x6C740000u: // lt -> Latn
+        case 0x9A6B0000u: // ltg -> Latn
+        case 0x9E6B0000u: // lth -> Latn
+        case 0xA26B0000u: // lti -> Latn
+        case 0xB66B0000u: // ltn -> Latn
+        case 0xBA6B0000u: // lto -> Latn
+        case 0xCA6B0000u: // lts -> Latn
+        case 0xD26B0000u: // ltu -> Latn
+        case 0x6C750000u: // lu -> Latn
+        case 0x828B0000u: // lua -> Latn
+        case 0x8A8B0000u: // luc -> Latn
+        case 0x8E8B0000u: // lud -> Latn
+        case 0x928B0000u: // lue -> Latn
+        case 0x968B0000u: // luf -> Latn
+        case 0xA28B0000u: // lui -> Latn
+        case 0xA68B0000u: // luj -> Latn
+        case 0xAE8B0000u: // lul -> Latn
+        case 0xB28B0000u: // lum -> Latn
+        case 0xB68B0000u: // lun -> Latn
+        case 0xBA8B0000u: // luo -> Latn
+        case 0xBE8B0000u: // lup -> Latn
+        case 0xC28B0000u: // luq -> Latn
+        case 0xC68B0000u: // lur -> Latn
+        case 0xCA8B0000u: // lus -> Latn
+        case 0xCE8B0000u: // lut -> Latn
+        case 0xDA8B0000u: // luw -> Latn
+        case 0xE28B0000u: // luy -> Latn
+        case 0x6C760000u: // lv -> Latn
+        case 0x82AB0000u: // lva -> Latn
+        case 0xA2AB0000u: // lvi -> Latn
+        case 0xAAAB0000u: // lvk -> Latn
+        case 0xAEAB0000u: // lvl -> Latn
+        case 0xD2AB0000u: // lvu -> Latn
+        case 0x82CB0000u: // lwa -> Latn
+        case 0x92CB0000u: // lwe -> Latn
+        case 0x9ACB0000u: // lwg -> Latn
+        case 0x9ECB0000u: // lwh -> Latn
+        case 0xBACB0000u: // lwo -> Latn
+        case 0xCECB0000u: // lwt -> Latn
+        case 0xDACB0000u: // lww -> Latn
+        case 0xB2EB0000u: // lxm -> Latn
+        case 0xB70B0000u: // lyn -> Latn
+        case 0xAF2B0000u: // lzl -> Latn
+        case 0xB72B0000u: // lzn -> Latn
+        case 0xE72B0000u: // lzz -> Latn
+        case 0x800C0000u: // maa -> Latn
+        case 0x840C0000u: // mab -> Latn
+        case 0x8C0C0000u: // mad -> Latn
+        case 0x900C0000u: // mae -> Latn
+        case 0x940C0000u: // maf -> Latn
+        case 0xA40C0000u: // maj -> Latn
+        case 0xA80C0000u: // mak -> Latn
+        case 0xB00C0000u: // mam -> Latn
+        case 0xB40C0000u: // man -> Latn
+        case 0xC00C0000u: // maq -> Latn
+        case 0xC80C0000u: // mas -> Latn
+        case 0xCC0C0000u: // mat -> Latn
+        case 0xD00C0000u: // mau -> Latn
+        case 0xD40C0000u: // mav -> Latn
+        case 0xD80C0000u: // maw -> Latn
+        case 0xDC0C0000u: // max -> Latn
+        case 0xE40C0000u: // maz -> Latn
+        case 0x802C0000u: // mba -> Latn
+        case 0x842C0000u: // mbb -> Latn
+        case 0x882C0000u: // mbc -> Latn
+        case 0x8C2C0000u: // mbd -> Latn
+        case 0x942C0000u: // mbf -> Latn
+        case 0x9C2C0000u: // mbh -> Latn
+        case 0xA02C0000u: // mbi -> Latn
+        case 0xA42C0000u: // mbj -> Latn
+        case 0xA82C0000u: // mbk -> Latn
+        case 0xAC2C0000u: // mbl -> Latn
+        case 0xB02C0000u: // mbm -> Latn
+        case 0xB42C0000u: // mbn -> Latn
+        case 0xB82C0000u: // mbo -> Latn
+        case 0xBC2C0000u: // mbp -> Latn
+        case 0xC02C0000u: // mbq -> Latn
+        case 0xC42C0000u: // mbr -> Latn
+        case 0xC82C0000u: // mbs -> Latn
+        case 0xCC2C0000u: // mbt -> Latn
+        case 0xD02C0000u: // mbu -> Latn
+        case 0xD42C0000u: // mbv -> Latn
+        case 0xD82C0000u: // mbw -> Latn
+        case 0xDC2C0000u: // mbx -> Latn
+        case 0xE42C0000u: // mbz -> Latn
+        case 0x804C0000u: // mca -> Latn
+        case 0x844C0000u: // mcb -> Latn
+        case 0x884C0000u: // mcc -> Latn
+        case 0x8C4C0000u: // mcd -> Latn
+        case 0x904C0000u: // mce -> Latn
+        case 0x944C0000u: // mcf -> Latn
+        case 0x984C0000u: // mcg -> Latn
+        case 0x9C4C0000u: // mch -> Latn
+        case 0xA04C0000u: // mci -> Latn
+        case 0xA44C0000u: // mcj -> Latn
+        case 0xA84C0000u: // mck -> Latn
+        case 0xAC4C0000u: // mcl -> Latn
+        case 0xB04C0000u: // mcm -> Latn
+        case 0xB44C0000u: // mcn -> Latn
+        case 0xB84C0000u: // mco -> Latn
+        case 0xBC4C0000u: // mcp -> Latn
+        case 0xC04C0000u: // mcq -> Latn
+        case 0xC44C0000u: // mcr -> Latn
+        case 0xC84C0000u: // mcs -> Latn
+        case 0xCC4C0000u: // mct -> Latn
+        case 0xD04C0000u: // mcu -> Latn
+        case 0xD44C0000u: // mcv -> Latn
+        case 0xD84C0000u: // mcw -> Latn
+        case 0xDC4C0000u: // mcx -> Latn
+        case 0xE04C0000u: // mcy -> Latn
+        case 0xE44C0000u: // mcz -> Latn
+        case 0x806C0000u: // mda -> Latn
+        case 0x846C0000u: // mdb -> Latn
+        case 0x886C0000u: // mdc -> Latn
+        case 0x8C6C0000u: // mdd -> Latn
+        case 0x986C0000u: // mdg -> Latn
+        case 0x9C6C0000u: // mdh -> Latn
+        case 0xA06C0000u: // mdi -> Latn
+        case 0xA46C0000u: // mdj -> Latn
+        case 0xA86C0000u: // mdk -> Latn
+        case 0xB06C0000u: // mdm -> Latn
+        case 0xB46C0000u: // mdn -> Latn
+        case 0xBC6C0000u: // mdp -> Latn
+        case 0xC06C0000u: // mdq -> Latn
+        case 0xC46C0000u: // mdr -> Latn
+        case 0xC86C0000u: // mds -> Latn
+        case 0xCC6C0000u: // mdt -> Latn
+        case 0xD06C0000u: // mdu -> Latn
+        case 0xD46C0000u: // mdv -> Latn
+        case 0xD86C0000u: // mdw -> Latn
+        case 0xE46C0000u: // mdz -> Latn
+        case 0x808C0000u: // mea -> Latn
+        case 0x848C0000u: // meb -> Latn
+        case 0x888C0000u: // mec -> Latn
+        case 0x8C8C0000u: // med -> Latn
+        case 0x908C0000u: // mee -> Latn
+        case 0x9C8C0000u: // meh -> Latn
+        case 0xA48C0000u: // mej -> Latn
+        case 0xA88C0000u: // mek -> Latn
+        case 0xAC8C0000u: // mel -> Latn
+        case 0xB08C0000u: // mem -> Latn
+        case 0xB48C0000u: // men -> Latn
+        case 0xB88C0000u: // meo -> Latn
+        case 0xBC8C0000u: // mep -> Latn
+        case 0xC08C0000u: // meq -> Latn
+        case 0xC48C0000u: // mer -> Latn
+        case 0xC88C0000u: // mes -> Latn
+        case 0xCC8C0000u: // met -> Latn
+        case 0xD08C0000u: // meu -> Latn
+        case 0xD48C0000u: // mev -> Latn
+        case 0xD88C0000u: // mew -> Latn
+        case 0xE08C0000u: // mey -> Latn
+        case 0xE48C0000u: // mez -> Latn
+        case 0x84AC0000u: // mfb -> Latn
+        case 0x88AC0000u: // mfc -> Latn
+        case 0x8CAC0000u: // mfd -> Latn
+        case 0x90AC0000u: // mfe -> Latn
+        case 0x94AC0000u: // mff -> Latn
+        case 0x98AC0000u: // mfg -> Latn
+        case 0x9CAC0000u: // mfh -> Latn
+        case 0xA4AC0000u: // mfj -> Latn
+        case 0xA8AC0000u: // mfk -> Latn
+        case 0xACAC0000u: // mfl -> Latn
+        case 0xB0AC0000u: // mfm -> Latn
+        case 0xB4AC0000u: // mfn -> Latn
+        case 0xB8AC0000u: // mfo -> Latn
+        case 0xBCAC0000u: // mfp -> Latn
+        case 0xC0AC0000u: // mfq -> Latn
+        case 0xC4AC0000u: // mfr -> Latn
+        case 0xCCAC0000u: // mft -> Latn
+        case 0xD0AC0000u: // mfu -> Latn
+        case 0xD4AC0000u: // mfv -> Latn
+        case 0xD8AC0000u: // mfw -> Latn
+        case 0xDCAC0000u: // mfx -> Latn
+        case 0xE0AC0000u: // mfy -> Latn
+        case 0xE4AC0000u: // mfz -> Latn
+        case 0x6D670000u: // mg -> Latn
+        case 0x84CC0000u: // mgb -> Latn
+        case 0x88CC0000u: // mgc -> Latn
+        case 0x8CCC0000u: // mgd -> Latn
+        case 0x90CC0000u: // mge -> Latn
+        case 0x94CC0000u: // mgf -> Latn
+        case 0x98CC0000u: // mgg -> Latn
+        case 0x9CCC0000u: // mgh -> Latn
+        case 0xA0CC0000u: // mgi -> Latn
+        case 0xA4CC0000u: // mgj -> Latn
+        case 0xA8CC0000u: // mgk -> Latn
+        case 0xACCC0000u: // mgl -> Latn
+        case 0xB0CC0000u: // mgm -> Latn
+        case 0xB4CC0000u: // mgn -> Latn
+        case 0xB8CC0000u: // mgo -> Latn
+        case 0xC0CC0000u: // mgq -> Latn
+        case 0xC4CC0000u: // mgr -> Latn
+        case 0xC8CC0000u: // mgs -> Latn
+        case 0xCCCC0000u: // mgt -> Latn
+        case 0xD0CC0000u: // mgu -> Latn
+        case 0xD4CC0000u: // mgv -> Latn
+        case 0xD8CC0000u: // mgw -> Latn
+        case 0xE0CC0000u: // mgy -> Latn
+        case 0xE4CC0000u: // mgz -> Latn
+        case 0x6D680000u: // mh -> Latn
+        case 0x84EC0000u: // mhb -> Latn
+        case 0x88EC0000u: // mhc -> Latn
+        case 0x8CEC0000u: // mhd -> Latn
+        case 0x90EC0000u: // mhe -> Latn
+        case 0x94EC0000u: // mhf -> Latn
+        case 0x98EC0000u: // mhg -> Latn
+        case 0xA0EC0000u: // mhi -> Latn
+        case 0xA8EC0000u: // mhk -> Latn
+        case 0xACEC0000u: // mhl -> Latn
+        case 0xB0EC0000u: // mhm -> Latn
+        case 0xB4EC0000u: // mhn -> Latn
+        case 0xB8EC0000u: // mho -> Latn
+        case 0xBCEC0000u: // mhp -> Latn
+        case 0xC0EC0000u: // mhq -> Latn
+        case 0xC8EC0000u: // mhs -> Latn
+        case 0xCCEC0000u: // mht -> Latn
+        case 0xD0EC0000u: // mhu -> Latn
+        case 0xD8EC0000u: // mhw -> Latn
+        case 0xDCEC0000u: // mhx -> Latn
+        case 0xE0EC0000u: // mhy -> Latn
+        case 0xE4EC0000u: // mhz -> Latn
+        case 0x6D690000u: // mi -> Latn
+        case 0x810C0000u: // mia -> Latn
+        case 0x850C0000u: // mib -> Latn
+        case 0x890C0000u: // mic -> Latn
+        case 0x910C0000u: // mie -> Latn
+        case 0x950C0000u: // mif -> Latn
+        case 0x990C0000u: // mig -> Latn
+        case 0x9D0C0000u: // mih -> Latn
+        case 0xA10C0000u: // mii -> Latn
+        case 0xA50C0000u: // mij -> Latn
+        case 0xA90C0000u: // mik -> Latn
+        case 0xAD0C0000u: // mil -> Latn
+        case 0xB10C0000u: // mim -> Latn
+        case 0xB50C0000u: // min -> Latn
+        case 0xB90C0000u: // mio -> Latn
+        case 0xBD0C0000u: // mip -> Latn
+        case 0xC10C0000u: // miq -> Latn
+        case 0xC50C0000u: // mir -> Latn
+        case 0xCD0C0000u: // mit -> Latn
+        case 0xD10C0000u: // miu -> Latn
+        case 0xD90C0000u: // miw -> Latn
+        case 0xDD0C0000u: // mix -> Latn
+        case 0xE10C0000u: // miy -> Latn
+        case 0xE50C0000u: // miz -> Latn
+        case 0x852C0000u: // mjb -> Latn
+        case 0x892C0000u: // mjc -> Latn
+        case 0x8D2C0000u: // mjd -> Latn
+        case 0x912C0000u: // mje -> Latn
+        case 0x992C0000u: // mjg -> Latn
+        case 0x9D2C0000u: // mjh -> Latn
+        case 0xA12C0000u: // mji -> Latn
+        case 0xA52C0000u: // mjj -> Latn
+        case 0xA92C0000u: // mjk -> Latn
+        case 0xB12C0000u: // mjm -> Latn
+        case 0xB52C0000u: // mjn -> Latn
+        case 0xC92C0000u: // mjs -> Latn
+        case 0xD92C0000u: // mjw -> Latn
+        case 0xDD2C0000u: // mjx -> Latn
+        case 0xE12C0000u: // mjy -> Latn
+        case 0x814C0000u: // mka -> Latn
+        case 0x894C0000u: // mkc -> Latn
+        case 0x954C0000u: // mkf -> Latn
+        case 0xA54C0000u: // mkj -> Latn
+        case 0xA94C0000u: // mkk -> Latn
+        case 0xAD4C0000u: // mkl -> Latn
+        case 0xB54C0000u: // mkn -> Latn
+        case 0xB94C0000u: // mko -> Latn
+        case 0xBD4C0000u: // mkp -> Latn
+        case 0xC54C0000u: // mkr -> Latn
+        case 0xC94C0000u: // mks -> Latn
+        case 0xCD4C0000u: // mkt -> Latn
+        case 0xD14C0000u: // mku -> Latn
+        case 0xD54C0000u: // mkv -> Latn
+        case 0xD94C0000u: // mkw -> Latn
+        case 0xDD4C0000u: // mkx -> Latn
+        case 0xE14C0000u: // mky -> Latn
+        case 0xE54C0000u: // mkz -> Latn
+        case 0x816C0000u: // mla -> Latn
+        case 0x856C0000u: // mlb -> Latn
+        case 0x896C0000u: // mlc -> Latn
+        case 0x916C0000u: // mle -> Latn
+        case 0x9D6C0000u: // mlh -> Latn
+        case 0xA16C0000u: // mli -> Latn
+        case 0xA56C0000u: // mlj -> Latn
+        case 0xA96C0000u: // mlk -> Latn
+        case 0xAD6C0000u: // mll -> Latn
+        case 0xB56C0000u: // mln -> Latn
+        case 0xB96C0000u: // mlo -> Latn
+        case 0xBD6C0000u: // mlp -> Latn
+        case 0xC16C0000u: // mlq -> Latn
+        case 0xC56C0000u: // mlr -> Latn
+        case 0xC96C0000u: // mls -> Latn
+        case 0xD16C0000u: // mlu -> Latn
+        case 0xD56C0000u: // mlv -> Latn
+        case 0xD96C0000u: // mlw -> Latn
+        case 0xDD6C0000u: // mlx -> Latn
+        case 0xE56C0000u: // mlz -> Latn
+        case 0x818C0000u: // mma -> Latn
+        case 0x858C0000u: // mmb -> Latn
+        case 0x898C0000u: // mmc -> Latn
+        case 0x8D8C0000u: // mmd -> Latn
+        case 0x918C0000u: // mme -> Latn
+        case 0x958C0000u: // mmf -> Latn
+        case 0x998C0000u: // mmg -> Latn
+        case 0x9D8C0000u: // mmh -> Latn
+        case 0xA18C0000u: // mmi -> Latn
+        case 0xB18C0000u: // mmm -> Latn
+        case 0xB58C0000u: // mmn -> Latn
+        case 0xB98C0000u: // mmo -> Latn
+        case 0xBD8C0000u: // mmp -> Latn
+        case 0xC18C0000u: // mmq -> Latn
+        case 0xC58C0000u: // mmr -> Latn
+        case 0xCD8C0000u: // mmt -> Latn
+        case 0xD18C0000u: // mmu -> Latn
+        case 0xD58C0000u: // mmv -> Latn
+        case 0xD98C0000u: // mmw -> Latn
+        case 0xDD8C0000u: // mmx -> Latn
+        case 0xE18C0000u: // mmy -> Latn
+        case 0xE58C0000u: // mmz -> Latn
+        case 0x81AC0000u: // mna -> Latn
+        case 0x85AC0000u: // mnb -> Latn
+        case 0x8DAC0000u: // mnd -> Latn
+        case 0x91AC0000u: // mne -> Latn
+        case 0x95AC0000u: // mnf -> Latn
+        case 0x99AC0000u: // mng -> Latn
+        case 0x9DAC0000u: // mnh -> Latn
+        case 0xADAC0000u: // mnl -> Latn
+        case 0xB1AC0000u: // mnm -> Latn
+        case 0xB5AC0000u: // mnn -> Latn
+        case 0xBDAC0000u: // mnp -> Latn
+        case 0xC1AC0000u: // mnq -> Latn
+        case 0xC5AC0000u: // mnr -> Latn
+        case 0xD1AC0000u: // mnu -> Latn
+        case 0xD5AC0000u: // mnv -> Latn
+        case 0xDDAC0000u: // mnx -> Latn
+        case 0xE1AC0000u: // mny -> Latn
+        case 0xE5AC0000u: // mnz -> Latn
+        case 0x6D6F0000u: // mo -> Latn
+        case 0x81CC0000u: // moa -> Latn
+        case 0x89CC0000u: // moc -> Latn
+        case 0x8DCC0000u: // mod -> Latn
+        case 0x91CC0000u: // moe -> Latn
+        case 0x99CC0000u: // mog -> Latn
+        case 0x9DCC0000u: // moh -> Latn
+        case 0xA1CC0000u: // moi -> Latn
+        case 0xA5CC0000u: // moj -> Latn
+        case 0xA9CC0000u: // mok -> Latn
+        case 0xB1CC0000u: // mom -> Latn
+        case 0xB9CC0000u: // moo -> Latn
+        case 0xBDCC0000u: // mop -> Latn
+        case 0xC1CC0000u: // moq -> Latn
+        case 0xC5CC0000u: // mor -> Latn
+        case 0xC9CC0000u: // mos -> Latn
+        case 0xCDCC0000u: // mot -> Latn
+        case 0xD1CC0000u: // mou -> Latn
+        case 0xD5CC0000u: // mov -> Latn
+        case 0xD9CC0000u: // mow -> Latn
+        case 0xDDCC0000u: // mox -> Latn
+        case 0xE1CC0000u: // moy -> Latn
+        case 0xE5CC0000u: // moz -> Latn
+        case 0x81EC0000u: // mpa -> Latn
+        case 0x85EC0000u: // mpb -> Latn
+        case 0x89EC0000u: // mpc -> Latn
+        case 0x8DEC0000u: // mpd -> Latn
+        case 0x91EC0000u: // mpe -> Latn
+        case 0x99EC0000u: // mpg -> Latn
+        case 0x9DEC0000u: // mph -> Latn
+        case 0xA1EC0000u: // mpi -> Latn
+        case 0xA5EC0000u: // mpj -> Latn
+        case 0xA9EC0000u: // mpk -> Latn
+        case 0xADEC0000u: // mpl -> Latn
+        case 0xB1EC0000u: // mpm -> Latn
+        case 0xB5EC0000u: // mpn -> Latn
+        case 0xB9EC0000u: // mpo -> Latn
+        case 0xBDEC0000u: // mpp -> Latn
+        case 0xC1EC0000u: // mpq -> Latn
+        case 0xC5EC0000u: // mpr -> Latn
+        case 0xC9EC0000u: // mps -> Latn
+        case 0xCDEC0000u: // mpt -> Latn
+        case 0xD1EC0000u: // mpu -> Latn
+        case 0xD5EC0000u: // mpv -> Latn
+        case 0xD9EC0000u: // mpw -> Latn
+        case 0xDDEC0000u: // mpx -> Latn
+        case 0xE1EC0000u: // mpy -> Latn
+        case 0x820C0000u: // mqa -> Latn
+        case 0x860C0000u: // mqb -> Latn
+        case 0x8A0C0000u: // mqc -> Latn
+        case 0x920C0000u: // mqe -> Latn
+        case 0x960C0000u: // mqf -> Latn
+        case 0x9A0C0000u: // mqg -> Latn
+        case 0x9E0C0000u: // mqh -> Latn
+        case 0xA20C0000u: // mqi -> Latn
+        case 0xA60C0000u: // mqj -> Latn
+        case 0xAA0C0000u: // mqk -> Latn
+        case 0xAE0C0000u: // mql -> Latn
+        case 0xB20C0000u: // mqm -> Latn
+        case 0xB60C0000u: // mqn -> Latn
+        case 0xBA0C0000u: // mqo -> Latn
+        case 0xBE0C0000u: // mqp -> Latn
+        case 0xC20C0000u: // mqq -> Latn
+        case 0xC60C0000u: // mqr -> Latn
+        case 0xCA0C0000u: // mqs -> Latn
+        case 0xD20C0000u: // mqu -> Latn
+        case 0xD60C0000u: // mqv -> Latn
+        case 0xDA0C0000u: // mqw -> Latn
+        case 0xDE0C0000u: // mqx -> Latn
+        case 0xE20C0000u: // mqy -> Latn
+        case 0xE60C0000u: // mqz -> Latn
+        case 0x862C0000u: // mrb -> Latn
+        case 0x8A2C0000u: // mrc -> Latn
+        case 0x962C0000u: // mrf -> Latn
+        case 0x9A2C0000u: // mrg -> Latn
+        case 0x9E2C0000u: // mrh -> Latn
+        case 0xAA2C0000u: // mrk -> Latn
+        case 0xAE2C0000u: // mrl -> Latn
+        case 0xB22C0000u: // mrm -> Latn
+        case 0xB62C0000u: // mrn -> Latn
+        case 0xBE2C0000u: // mrp -> Latn
+        case 0xC22C0000u: // mrq -> Latn
+        case 0xCA2C0000u: // mrs -> Latn
+        case 0xCE2C0000u: // mrt -> Latn
+        case 0xD22C0000u: // mru -> Latn
+        case 0xD62C0000u: // mrv -> Latn
+        case 0xDA2C0000u: // mrw -> Latn
+        case 0xDE2C0000u: // mrx -> Latn
+        case 0xE22C0000u: // mry -> Latn
+        case 0xE62C0000u: // mrz -> Latn
+        case 0x6D730000u: // ms -> Latn
+        case 0x864C0000u: // msb -> Latn
+        case 0x8A4C0000u: // msc -> Latn
+        case 0x924C0000u: // mse -> Latn
+        case 0x964C0000u: // msf -> Latn
+        case 0x9A4C0000u: // msg -> Latn
+        case 0x9E4C0000u: // msh -> Latn
+        case 0xA24C0000u: // msi -> Latn
+        case 0xA64C0000u: // msj -> Latn
+        case 0xAA4C0000u: // msk -> Latn
+        case 0xAE4C0000u: // msl -> Latn
+        case 0xB24C0000u: // msm -> Latn
+        case 0xB64C0000u: // msn -> Latn
+        case 0xBA4C0000u: // mso -> Latn
+        case 0xBE4C0000u: // msp -> Latn
+        case 0xC24C0000u: // msq -> Latn
+        case 0xCA4C0000u: // mss -> Latn
+        case 0xD24C0000u: // msu -> Latn
+        case 0xD64C0000u: // msv -> Latn
+        case 0xDA4C0000u: // msw -> Latn
+        case 0xDE4C0000u: // msx -> Latn
+        case 0xE24C0000u: // msy -> Latn
+        case 0xE64C0000u: // msz -> Latn
+        case 0x6D740000u: // mt -> Latn
+        case 0x826C0000u: // mta -> Latn
+        case 0x866C0000u: // mtb -> Latn
+        case 0x8A6C0000u: // mtc -> Latn
+        case 0x8E6C0000u: // mtd -> Latn
+        case 0x926C0000u: // mte -> Latn
+        case 0x966C0000u: // mtf -> Latn
+        case 0x9A6C0000u: // mtg -> Latn
+        case 0x9E6C0000u: // mth -> Latn
+        case 0xA26C0000u: // mti -> Latn
+        case 0xA66C0000u: // mtj -> Latn
+        case 0xAA6C0000u: // mtk -> Latn
+        case 0xAE6C0000u: // mtl -> Latn
+        case 0xB66C0000u: // mtn -> Latn
+        case 0xBA6C0000u: // mto -> Latn
+        case 0xBE6C0000u: // mtp -> Latn
+        case 0xC26C0000u: // mtq -> Latn
+        case 0xCA6C0000u: // mts -> Latn
+        case 0xCE6C0000u: // mtt -> Latn
+        case 0xD26C0000u: // mtu -> Latn
+        case 0xD66C0000u: // mtv -> Latn
+        case 0xDA6C0000u: // mtw -> Latn
+        case 0xDE6C0000u: // mtx -> Latn
+        case 0xE26C0000u: // mty -> Latn
+        case 0x828C0000u: // mua -> Latn
+        case 0x868C0000u: // mub -> Latn
+        case 0x8A8C0000u: // muc -> Latn
+        case 0x928C0000u: // mue -> Latn
+        case 0x9A8C0000u: // mug -> Latn
+        case 0x9E8C0000u: // muh -> Latn
+        case 0xA28C0000u: // mui -> Latn
+        case 0xA68C0000u: // muj -> Latn
+        case 0xB28C0000u: // mum -> Latn
+        case 0xBA8C0000u: // muo -> Latn
+        case 0xC28C0000u: // muq -> Latn
+        case 0xC68C0000u: // mur -> Latn
+        case 0xCA8C0000u: // mus -> Latn
+        case 0xD28C0000u: // muu -> Latn
+        case 0xDE8C0000u: // mux -> Latn
+        case 0xE28C0000u: // muy -> Latn
+        case 0x82AC0000u: // mva -> Latn
+        case 0x8EAC0000u: // mvd -> Latn
+        case 0x9AAC0000u: // mvg -> Latn
+        case 0x9EAC0000u: // mvh -> Latn
+        case 0xAAAC0000u: // mvk -> Latn
+        case 0xAEAC0000u: // mvl -> Latn
+        case 0xB6AC0000u: // mvn -> Latn
+        case 0xBAAC0000u: // mvo -> Latn
+        case 0xBEAC0000u: // mvp -> Latn
+        case 0xC2AC0000u: // mvq -> Latn
+        case 0xC6AC0000u: // mvr -> Latn
+        case 0xCAAC0000u: // mvs -> Latn
+        case 0xCEAC0000u: // mvt -> Latn
+        case 0xD2AC0000u: // mvu -> Latn
+        case 0xD6AC0000u: // mvv -> Latn
+        case 0xDAAC0000u: // mvw -> Latn
+        case 0xDEAC0000u: // mvx -> Latn
+        case 0x82CC0000u: // mwa -> Latn
+        case 0x86CC0000u: // mwb -> Latn
+        case 0x8ACC0000u: // mwc -> Latn
+        case 0x92CC0000u: // mwe -> Latn
+        case 0x96CC0000u: // mwf -> Latn
+        case 0x9ACC0000u: // mwg -> Latn
+        case 0x9ECC0000u: // mwh -> Latn
+        case 0xA2CC0000u: // mwi -> Latn
+        case 0xAACC0000u: // mwk -> Latn
+        case 0xAECC0000u: // mwl -> Latn
+        case 0xB2CC0000u: // mwm -> Latn
+        case 0xB6CC0000u: // mwn -> Latn
+        case 0xBACC0000u: // mwo -> Latn
+        case 0xBECC0000u: // mwp -> Latn
+        case 0xC2CC0000u: // mwq -> Latn
+        case 0xCACC0000u: // mws -> Latn
+        case 0xD2CC0000u: // mwu -> Latn
+        case 0xD6CC0000u: // mwv -> Latn
+        case 0xE6CC0000u: // mwz -> Latn
+        case 0x82EC0000u: // mxa -> Latn
+        case 0x86EC0000u: // mxb -> Latn
+        case 0x8AEC0000u: // mxc -> Latn
+        case 0x8EEC0000u: // mxd -> Latn
+        case 0x92EC0000u: // mxe -> Latn
+        case 0x96EC0000u: // mxf -> Latn
+        case 0x9AEC0000u: // mxg -> Latn
+        case 0x9EEC0000u: // mxh -> Latn
+        case 0xA2EC0000u: // mxi -> Latn
+        case 0xA6EC0000u: // mxj -> Latn
+        case 0xAAEC0000u: // mxk -> Latn
+        case 0xAEEC0000u: // mxl -> Latn
+        case 0xB2EC0000u: // mxm -> Latn
+        case 0xB6EC0000u: // mxn -> Latn
+        case 0xBAEC0000u: // mxo -> Latn
+        case 0xBEEC0000u: // mxp -> Latn
+        case 0xC2EC0000u: // mxq -> Latn
+        case 0xC6EC0000u: // mxr -> Latn
+        case 0xCAEC0000u: // mxs -> Latn
+        case 0xCEEC0000u: // mxt -> Latn
+        case 0xD2EC0000u: // mxu -> Latn
+        case 0xD6EC0000u: // mxv -> Latn
+        case 0xDAEC0000u: // mxw -> Latn
+        case 0xDEEC0000u: // mxx -> Latn
+        case 0xE2EC0000u: // mxy -> Latn
+        case 0xE6EC0000u: // mxz -> Latn
+        case 0x870C0000u: // myb -> Latn
+        case 0x8B0C0000u: // myc -> Latn
+        case 0x930C0000u: // mye -> Latn
+        case 0x970C0000u: // myf -> Latn
+        case 0x9B0C0000u: // myg -> Latn
+        case 0x9F0C0000u: // myh -> Latn
+        case 0xA70C0000u: // myj -> Latn
+        case 0xAB0C0000u: // myk -> Latn
+        case 0xAF0C0000u: // myl -> Latn
+        case 0xBF0C0000u: // myp -> Latn
+        case 0xC70C0000u: // myr -> Latn
+        case 0xD30C0000u: // myu -> Latn
+        case 0xDB0C0000u: // myw -> Latn
+        case 0xDF0C0000u: // myx -> Latn
+        case 0xE30C0000u: // myy -> Latn
+        case 0x832C0000u: // mza -> Latn
+        case 0x8F2C0000u: // mzd -> Latn
+        case 0x932C0000u: // mze -> Latn
+        case 0x9F2C0000u: // mzh -> Latn
+        case 0xA32C0000u: // mzi -> Latn
+        case 0xA72C0000u: // mzj -> Latn
+        case 0xAB2C0000u: // mzk -> Latn
+        case 0xAF2C0000u: // mzl -> Latn
+        case 0xB32C0000u: // mzm -> Latn
+        case 0xBB2C0000u: // mzo -> Latn
+        case 0xBF2C0000u: // mzp -> Latn
+        case 0xC32C0000u: // mzq -> Latn
+        case 0xC72C0000u: // mzr -> Latn
+        case 0xCF2C0000u: // mzt -> Latn
+        case 0xD32C0000u: // mzu -> Latn
+        case 0xD72C0000u: // mzv -> Latn
+        case 0xDB2C0000u: // mzw -> Latn
+        case 0xDF2C0000u: // mzx -> Latn
+        case 0xE72C0000u: // mzz -> Latn
+        case 0x6E610000u: // na -> Latn
+        case 0x800D0000u: // naa -> Latn
+        case 0x840D0000u: // nab -> Latn
+        case 0x880D0000u: // nac -> Latn
+        case 0x900D0000u: // nae -> Latn
+        case 0x940D0000u: // naf -> Latn
+        case 0x980D0000u: // nag -> Latn
+        case 0xA40D0000u: // naj -> Latn
+        case 0xA80D0000u: // nak -> Latn
+        case 0xAC0D0000u: // nal -> Latn
+        case 0xB00D0000u: // nam -> Latn
+        case 0xBC0D0000u: // nap -> Latn
+        case 0xC00D0000u: // naq -> Latn
+        case 0xC40D0000u: // nar -> Latn
+        case 0xC80D0000u: // nas -> Latn
+        case 0xCC0D0000u: // nat -> Latn
+        case 0xD80D0000u: // naw -> Latn
+        case 0xDC0D0000u: // nax -> Latn
+        case 0xE00D0000u: // nay -> Latn
+        case 0xE40D0000u: // naz -> Latn
+        case 0x6E620000u: // nb -> Latn
+        case 0x802D0000u: // nba -> Latn
+        case 0x842D0000u: // nbb -> Latn
+        case 0x882D0000u: // nbc -> Latn
+        case 0x8C2D0000u: // nbd -> Latn
+        case 0x902D0000u: // nbe -> Latn
+        case 0x9C2D0000u: // nbh -> Latn
+        case 0xA02D0000u: // nbi -> Latn
+        case 0xA42D0000u: // nbj -> Latn
+        case 0xA82D0000u: // nbk -> Latn
+        case 0xB02D0000u: // nbm -> Latn
+        case 0xB42D0000u: // nbn -> Latn
+        case 0xB82D0000u: // nbo -> Latn
+        case 0xBC2D0000u: // nbp -> Latn
+        case 0xC02D0000u: // nbq -> Latn
+        case 0xC42D0000u: // nbr -> Latn
+        case 0xCC2D0000u: // nbt -> Latn
+        case 0xD02D0000u: // nbu -> Latn
+        case 0xD42D0000u: // nbv -> Latn
+        case 0xD82D0000u: // nbw -> Latn
+        case 0xE02D0000u: // nby -> Latn
+        case 0x804D0000u: // nca -> Latn
+        case 0x844D0000u: // ncb -> Latn
+        case 0x884D0000u: // ncc -> Latn
+        case 0x904D0000u: // nce -> Latn
+        case 0x944D0000u: // ncf -> Latn
+        case 0x984D0000u: // ncg -> Latn
+        case 0x9C4D0000u: // nch -> Latn
+        case 0xA04D0000u: // nci -> Latn
+        case 0xA44D0000u: // ncj -> Latn
+        case 0xA84D0000u: // nck -> Latn
+        case 0xAC4D0000u: // ncl -> Latn
+        case 0xB04D0000u: // ncm -> Latn
+        case 0xB44D0000u: // ncn -> Latn
+        case 0xB84D0000u: // nco -> Latn
+        case 0xC44D0000u: // ncr -> Latn
+        case 0xCC4D0000u: // nct -> Latn
+        case 0xD04D0000u: // ncu -> Latn
+        case 0xDC4D0000u: // ncx -> Latn
+        case 0xE44D0000u: // ncz -> Latn
+        case 0x6E640000u: // nd -> Latn
+        case 0x806D0000u: // nda -> Latn
+        case 0x846D0000u: // ndb -> Latn
+        case 0x886D0000u: // ndc -> Latn
+        case 0x8C6D0000u: // ndd -> Latn
+        case 0x986D0000u: // ndg -> Latn
+        case 0x9C6D0000u: // ndh -> Latn
+        case 0xA06D0000u: // ndi -> Latn
+        case 0xA46D0000u: // ndj -> Latn
+        case 0xA86D0000u: // ndk -> Latn
+        case 0xAC6D0000u: // ndl -> Latn
+        case 0xB06D0000u: // ndm -> Latn
+        case 0xB46D0000u: // ndn -> Latn
+        case 0xBC6D0000u: // ndp -> Latn
+        case 0xC06D0000u: // ndq -> Latn
+        case 0xC46D0000u: // ndr -> Latn
+        case 0xC86D0000u: // nds -> Latn
+        case 0xCC6D0000u: // ndt -> Latn
+        case 0xD06D0000u: // ndu -> Latn
+        case 0xD46D0000u: // ndv -> Latn
+        case 0xD86D0000u: // ndw -> Latn
+        case 0xDC6D0000u: // ndx -> Latn
+        case 0xE06D0000u: // ndy -> Latn
+        case 0xE46D0000u: // ndz -> Latn
+        case 0x808D0000u: // nea -> Latn
+        case 0x848D0000u: // neb -> Latn
+        case 0x888D0000u: // nec -> Latn
+        case 0x8C8D0000u: // ned -> Latn
+        case 0x908D0000u: // nee -> Latn
+        case 0xA48D0000u: // nej -> Latn
+        case 0xA88D0000u: // nek -> Latn
+        case 0xB08D0000u: // nem -> Latn
+        case 0xB48D0000u: // nen -> Latn
+        case 0xB88D0000u: // neo -> Latn
+        case 0xC08D0000u: // neq -> Latn
+        case 0xC48D0000u: // ner -> Latn
+        case 0xCC8D0000u: // net -> Latn
+        case 0xD08D0000u: // neu -> Latn
+        case 0xDC8D0000u: // nex -> Latn
+        case 0xE08D0000u: // ney -> Latn
+        case 0xE48D0000u: // nez -> Latn
+        case 0x80AD0000u: // nfa -> Latn
+        case 0x8CAD0000u: // nfd -> Latn
+        case 0xACAD0000u: // nfl -> Latn
+        case 0xC4AD0000u: // nfr -> Latn
+        case 0xD0AD0000u: // nfu -> Latn
+        case 0x6E670000u: // ng -> Latn
+        case 0x80CD0000u: // nga -> Latn
+        case 0x84CD0000u: // ngb -> Latn
+        case 0x88CD0000u: // ngc -> Latn
+        case 0x8CCD0000u: // ngd -> Latn
+        case 0x90CD0000u: // nge -> Latn
+        case 0x98CD0000u: // ngg -> Latn
+        case 0x9CCD0000u: // ngh -> Latn
+        case 0xA0CD0000u: // ngi -> Latn
+        case 0xA4CD0000u: // ngj -> Latn
+        case 0xA8CD0000u: // ngk -> Latn
+        case 0xACCD0000u: // ngl -> Latn
+        case 0xB0CD0000u: // ngm -> Latn
+        case 0xB4CD0000u: // ngn -> Latn
+        case 0xBCCD0000u: // ngp -> Latn
+        case 0xC0CD0000u: // ngq -> Latn
+        case 0xC4CD0000u: // ngr -> Latn
+        case 0xC8CD0000u: // ngs -> Latn
+        case 0xD0CD0000u: // ngu -> Latn
+        case 0xD4CD0000u: // ngv -> Latn
+        case 0xD8CD0000u: // ngw -> Latn
+        case 0xDCCD0000u: // ngx -> Latn
+        case 0xE0CD0000u: // ngy -> Latn
+        case 0xE4CD0000u: // ngz -> Latn
+        case 0x80ED0000u: // nha -> Latn
+        case 0x84ED0000u: // nhb -> Latn
+        case 0x88ED0000u: // nhc -> Latn
+        case 0x8CED0000u: // nhd -> Latn
+        case 0x90ED0000u: // nhe -> Latn
+        case 0x94ED0000u: // nhf -> Latn
+        case 0x98ED0000u: // nhg -> Latn
+        case 0xA0ED0000u: // nhi -> Latn
+        case 0xA8ED0000u: // nhk -> Latn
+        case 0xB0ED0000u: // nhm -> Latn
+        case 0xB4ED0000u: // nhn -> Latn
+        case 0xB8ED0000u: // nho -> Latn
+        case 0xBCED0000u: // nhp -> Latn
+        case 0xC0ED0000u: // nhq -> Latn
+        case 0xC4ED0000u: // nhr -> Latn
+        case 0xCCED0000u: // nht -> Latn
+        case 0xD0ED0000u: // nhu -> Latn
+        case 0xD4ED0000u: // nhv -> Latn
+        case 0xD8ED0000u: // nhw -> Latn
+        case 0xDCED0000u: // nhx -> Latn
+        case 0xE0ED0000u: // nhy -> Latn
+        case 0xE4ED0000u: // nhz -> Latn
+        case 0x810D0000u: // nia -> Latn
+        case 0x850D0000u: // nib -> Latn
+        case 0x8D0D0000u: // nid -> Latn
+        case 0x910D0000u: // nie -> Latn
+        case 0x950D0000u: // nif -> Latn
+        case 0x990D0000u: // nig -> Latn
+        case 0x9D0D0000u: // nih -> Latn
+        case 0xA10D0000u: // nii -> Latn
+        case 0xA50D0000u: // nij -> Latn
+        case 0xAD0D0000u: // nil -> Latn
+        case 0xB10D0000u: // nim -> Latn
+        case 0xB50D0000u: // nin -> Latn
+        case 0xC10D0000u: // niq -> Latn
+        case 0xC50D0000u: // nir -> Latn
+        case 0xC90D0000u: // nis -> Latn
+        case 0xD10D0000u: // niu -> Latn
+        case 0xD90D0000u: // niw -> Latn
+        case 0xDD0D0000u: // nix -> Latn
+        case 0xE10D0000u: // niy -> Latn
+        case 0xE50D0000u: // niz -> Latn
+        case 0x812D0000u: // nja -> Latn
+        case 0x852D0000u: // njb -> Latn
+        case 0x8D2D0000u: // njd -> Latn
+        case 0x9D2D0000u: // njh -> Latn
+        case 0xA12D0000u: // nji -> Latn
+        case 0xA52D0000u: // njj -> Latn
+        case 0xAD2D0000u: // njl -> Latn
+        case 0xB12D0000u: // njm -> Latn
+        case 0xB52D0000u: // njn -> Latn
+        case 0xB92D0000u: // njo -> Latn
+        case 0xC52D0000u: // njr -> Latn
+        case 0xC92D0000u: // njs -> Latn
+        case 0xCD2D0000u: // njt -> Latn
+        case 0xD12D0000u: // nju -> Latn
+        case 0xDD2D0000u: // njx -> Latn
+        case 0xE12D0000u: // njy -> Latn
+        case 0xE52D0000u: // njz -> Latn
+        case 0x814D0000u: // nka -> Latn
+        case 0x854D0000u: // nkb -> Latn
+        case 0x894D0000u: // nkc -> Latn
+        case 0x8D4D0000u: // nkd -> Latn
+        case 0x914D0000u: // nke -> Latn
+        case 0x954D0000u: // nkf -> Latn
+        case 0x994D0000u: // nkg -> Latn
+        case 0x9D4D0000u: // nkh -> Latn
+        case 0xA14D0000u: // nki -> Latn
+        case 0xA54D0000u: // nkj -> Latn
+        case 0xA94D0000u: // nkk -> Latn
+        case 0xB14D0000u: // nkm -> Latn
+        case 0xB54D0000u: // nkn -> Latn
+        case 0xB94D0000u: // nko -> Latn
+        case 0xC14D0000u: // nkq -> Latn
+        case 0xC54D0000u: // nkr -> Latn
+        case 0xC94D0000u: // nks -> Latn
+        case 0xCD4D0000u: // nkt -> Latn
+        case 0xD14D0000u: // nku -> Latn
+        case 0xD54D0000u: // nkv -> Latn
+        case 0xD94D0000u: // nkw -> Latn
+        case 0xDD4D0000u: // nkx -> Latn
+        case 0xE54D0000u: // nkz -> Latn
+        case 0x6E6C0000u: // nl -> Latn
+        case 0x816D0000u: // nla -> Latn
+        case 0x896D0000u: // nlc -> Latn
+        case 0x916D0000u: // nle -> Latn
+        case 0x996D0000u: // nlg -> Latn
+        case 0xA56D0000u: // nlj -> Latn
+        case 0xA96D0000u: // nlk -> Latn
+        case 0xB96D0000u: // nlo -> Latn
+        case 0xC16D0000u: // nlq -> Latn
+        case 0xD16D0000u: // nlu -> Latn
+        case 0xD56D0000u: // nlv -> Latn
+        case 0xD96D0000u: // nlw -> Latn
+        case 0xE16D0000u: // nly -> Latn
+        case 0xE56D0000u: // nlz -> Latn
+        case 0x818D0000u: // nma -> Latn
+        case 0x858D0000u: // nmb -> Latn
+        case 0x898D0000u: // nmc -> Latn
+        case 0x8D8D0000u: // nmd -> Latn
+        case 0x918D0000u: // nme -> Latn
+        case 0x958D0000u: // nmf -> Latn
+        case 0x998D0000u: // nmg -> Latn
+        case 0x9D8D0000u: // nmh -> Latn
+        case 0xA18D0000u: // nmi -> Latn
+        case 0xA58D0000u: // nmj -> Latn
+        case 0xA98D0000u: // nmk -> Latn
+        case 0xAD8D0000u: // nml -> Latn
+        case 0xB58D0000u: // nmn -> Latn
+        case 0xB98D0000u: // nmo -> Latn
+        case 0xBD8D0000u: // nmp -> Latn
+        case 0xC18D0000u: // nmq -> Latn
+        case 0xC58D0000u: // nmr -> Latn
+        case 0xC98D0000u: // nms -> Latn
+        case 0xCD8D0000u: // nmt -> Latn
+        case 0xD18D0000u: // nmu -> Latn
+        case 0xD58D0000u: // nmv -> Latn
+        case 0xD98D0000u: // nmw -> Latn
+        case 0xDD8D0000u: // nmx -> Latn
+        case 0xE58D0000u: // nmz -> Latn
+        case 0x6E6E0000u: // nn -> Latn
+        case 0x81AD0000u: // nna -> Latn
+        case 0x85AD0000u: // nnb -> Latn
+        case 0x89AD0000u: // nnc -> Latn
+        case 0x8DAD0000u: // nnd -> Latn
+        case 0x91AD0000u: // nne -> Latn
+        case 0x95AD0000u: // nnf -> Latn
+        case 0x99AD0000u: // nng -> Latn
+        case 0x9DAD0000u: // nnh -> Latn
+        case 0xA1AD0000u: // nni -> Latn
+        case 0xA5AD0000u: // nnj -> Latn
+        case 0xA9AD0000u: // nnk -> Latn
+        case 0xADAD0000u: // nnl -> Latn
+        case 0xB1AD0000u: // nnm -> Latn
+        case 0xB5AD0000u: // nnn -> Latn
+        case 0xC1AD0000u: // nnq -> Latn
+        case 0xC5AD0000u: // nnr -> Latn
+        case 0xCDAD0000u: // nnt -> Latn
+        case 0xD1AD0000u: // nnu -> Latn
+        case 0xD5AD0000u: // nnv -> Latn
+        case 0xD9AD0000u: // nnw -> Latn
+        case 0xE1AD0000u: // nny -> Latn
+        case 0xE5AD0000u: // nnz -> Latn
+        case 0x6E6F0000u: // no -> Latn
+        case 0x81CD0000u: // noa -> Latn
+        case 0x89CD0000u: // noc -> Latn
+        case 0x95CD0000u: // nof -> Latn
+        case 0x9DCD0000u: // noh -> Latn
+        case 0xA5CD0000u: // noj -> Latn
+        case 0xA9CD0000u: // nok -> Latn
+        case 0xBDCD0000u: // nop -> Latn
+        case 0xC1CD0000u: // noq -> Latn
+        case 0xCDCD0000u: // not -> Latn
+        case 0xD1CD0000u: // nou -> Latn
+        case 0xD5CD0000u: // nov -> Latn
+        case 0xD9CD0000u: // now -> Latn
+        case 0xE1CD0000u: // noy -> Latn
+        case 0x99ED0000u: // npg -> Latn
+        case 0x9DED0000u: // nph -> Latn
+        case 0xADED0000u: // npl -> Latn
+        case 0xB5ED0000u: // npn -> Latn
+        case 0xB9ED0000u: // npo -> Latn
+        case 0xC9ED0000u: // nps -> Latn
+        case 0xD1ED0000u: // npu -> Latn
+        case 0xDDED0000u: // npx -> Latn
+        case 0xE1ED0000u: // npy -> Latn
+        case 0x9A0D0000u: // nqg -> Latn
+        case 0xAA0D0000u: // nqk -> Latn
+        case 0xAE0D0000u: // nql -> Latn
+        case 0xB20D0000u: // nqm -> Latn
+        case 0xB60D0000u: // nqn -> Latn
+        case 0xC20D0000u: // nqq -> Latn
+        case 0xCE0D0000u: // nqt -> Latn
+        case 0xE20D0000u: // nqy -> Latn
+        case 0x6E720000u: // nr -> Latn
+        case 0x822D0000u: // nra -> Latn
+        case 0x862D0000u: // nrb -> Latn
+        case 0x922D0000u: // nre -> Latn
+        case 0x962D0000u: // nrf -> Latn
+        case 0x9A2D0000u: // nrg -> Latn
+        case 0xA22D0000u: // nri -> Latn
+        case 0xAA2D0000u: // nrk -> Latn
+        case 0xAE2D0000u: // nrl -> Latn
+        case 0xB22D0000u: // nrm -> Latn
+        case 0xBE2D0000u: // nrp -> Latn
+        case 0xD22D0000u: // nru -> Latn
+        case 0xDE2D0000u: // nrx -> Latn
+        case 0xE62D0000u: // nrz -> Latn
+        case 0x824D0000u: // nsa -> Latn
+        case 0x864D0000u: // nsb -> Latn
+        case 0x8A4D0000u: // nsc -> Latn
+        case 0x924D0000u: // nse -> Latn
+        case 0x9A4D0000u: // nsg -> Latn
+        case 0x9E4D0000u: // nsh -> Latn
+        case 0xB24D0000u: // nsm -> Latn
+        case 0xB64D0000u: // nsn -> Latn
+        case 0xBA4D0000u: // nso -> Latn
+        case 0xC24D0000u: // nsq -> Latn
+        case 0xCA4D0000u: // nss -> Latn
+        case 0xD24D0000u: // nsu -> Latn
+        case 0xDA4D0000u: // nsw -> Latn
+        case 0xDE4D0000u: // nsx -> Latn
+        case 0xE24D0000u: // nsy -> Latn
+        case 0xE64D0000u: // nsz -> Latn
+        case 0x8E6D0000u: // ntd -> Latn
+        case 0x926D0000u: // nte -> Latn
+        case 0x9A6D0000u: // ntg -> Latn
+        case 0xA26D0000u: // nti -> Latn
+        case 0xA66D0000u: // ntj -> Latn
+        case 0xAA6D0000u: // ntk -> Latn
+        case 0xB26D0000u: // ntm -> Latn
+        case 0xBA6D0000u: // nto -> Latn
+        case 0xBE6D0000u: // ntp -> Latn
+        case 0xC66D0000u: // ntr -> Latn
+        case 0xD26D0000u: // ntu -> Latn
+        case 0xDE6D0000u: // ntx -> Latn
+        case 0x828D0000u: // nua -> Latn
+        case 0x8A8D0000u: // nuc -> Latn
+        case 0x8E8D0000u: // nud -> Latn
+        case 0x928D0000u: // nue -> Latn
+        case 0x968D0000u: // nuf -> Latn
+        case 0x9A8D0000u: // nug -> Latn
+        case 0x9E8D0000u: // nuh -> Latn
+        case 0xA28D0000u: // nui -> Latn
+        case 0xA68D0000u: // nuj -> Latn
+        case 0xAA8D0000u: // nuk -> Latn
+        case 0xB28D0000u: // num -> Latn
+        case 0xB68D0000u: // nun -> Latn
+        case 0xBA8D0000u: // nuo -> Latn
+        case 0xBE8D0000u: // nup -> Latn
+        case 0xC28D0000u: // nuq -> Latn
+        case 0xC68D0000u: // nur -> Latn
+        case 0xCA8D0000u: // nus -> Latn
+        case 0xCE8D0000u: // nut -> Latn
+        case 0xD28D0000u: // nuu -> Latn
+        case 0xD68D0000u: // nuv -> Latn
+        case 0xDA8D0000u: // nuw -> Latn
+        case 0xDE8D0000u: // nux -> Latn
+        case 0xE28D0000u: // nuy -> Latn
+        case 0xE68D0000u: // nuz -> Latn
+        case 0x6E760000u: // nv -> Latn
+        case 0x9EAD0000u: // nvh -> Latn
+        case 0xB2AD0000u: // nvm -> Latn
+        case 0xBAAD0000u: // nvo -> Latn
+        case 0x86CD0000u: // nwb -> Latn
+        case 0x92CD0000u: // nwe -> Latn
+        case 0x9ACD0000u: // nwg -> Latn
+        case 0xA2CD0000u: // nwi -> Latn
+        case 0xB2CD0000u: // nwm -> Latn
+        case 0xBACD0000u: // nwo -> Latn
+        case 0xC6CD0000u: // nwr -> Latn
+        case 0xDACD0000u: // nww -> Latn
+        case 0x82ED0000u: // nxa -> Latn
+        case 0x8EED0000u: // nxd -> Latn
+        case 0x92ED0000u: // nxe -> Latn
+        case 0x9AED0000u: // nxg -> Latn
+        case 0xA2ED0000u: // nxi -> Latn
+        case 0xAEED0000u: // nxl -> Latn
+        case 0xB6ED0000u: // nxn -> Latn
+        case 0xBAED0000u: // nxo -> Latn
+        case 0xC2ED0000u: // nxq -> Latn
+        case 0xC6ED0000u: // nxr -> Latn
+        case 0xDEED0000u: // nxx -> Latn
+        case 0x6E790000u: // ny -> Latn
+        case 0x870D0000u: // nyb -> Latn
+        case 0x8B0D0000u: // nyc -> Latn
+        case 0x8F0D0000u: // nyd -> Latn
+        case 0x930D0000u: // nye -> Latn
+        case 0x970D0000u: // nyf -> Latn
+        case 0x9B0D0000u: // nyg -> Latn
+        case 0x9F0D0000u: // nyh -> Latn
+        case 0xA30D0000u: // nyi -> Latn
+        case 0xA70D0000u: // nyj -> Latn
+        case 0xAB0D0000u: // nyk -> Latn
+        case 0xB30D0000u: // nym -> Latn
+        case 0xB70D0000u: // nyn -> Latn
+        case 0xBB0D0000u: // nyo -> Latn
+        case 0xBF0D0000u: // nyp -> Latn
+        case 0xC70D0000u: // nyr -> Latn
+        case 0xCB0D0000u: // nys -> Latn
+        case 0xCF0D0000u: // nyt -> Latn
+        case 0xD30D0000u: // nyu -> Latn
+        case 0xD70D0000u: // nyv -> Latn
+        case 0xDF0D0000u: // nyx -> Latn
+        case 0xE30D0000u: // nyy -> Latn
+        case 0x832D0000u: // nza -> Latn
+        case 0x872D0000u: // nzb -> Latn
+        case 0x8F2D0000u: // nzd -> Latn
+        case 0xA32D0000u: // nzi -> Latn
+        case 0xAB2D0000u: // nzk -> Latn
+        case 0xB32D0000u: // nzm -> Latn
+        case 0xC72D0000u: // nzr -> Latn
+        case 0xD32D0000u: // nzu -> Latn
+        case 0xE32D0000u: // nzy -> Latn
+        case 0xE72D0000u: // nzz -> Latn
+        case 0xA02E0000u: // obi -> Latn
+        case 0xA82E0000u: // obk -> Latn
+        case 0xAC2E0000u: // obl -> Latn
+        case 0xB82E0000u: // obo -> Latn
+        case 0xCC2E0000u: // obt -> Latn
+        case 0xD02E0000u: // obu -> Latn
+        case 0x6F630000u: // oc -> Latn
+        case 0x804E0000u: // oca -> Latn
+        case 0xB84E0000u: // oco -> Latn
+        case 0xD04E0000u: // ocu -> Latn
+        case 0x806E0000u: // oda -> Latn
+        case 0xCC6E0000u: // odt -> Latn
+        case 0xD06E0000u: // odu -> Latn
+        case 0xC8AE0000u: // ofs -> Latn
+        case 0xD0AE0000u: // ofu -> Latn
+        case 0x84CE0000u: // ogb -> Latn
+        case 0x88CE0000u: // ogc -> Latn
+        case 0x98CE0000u: // ogg -> Latn
+        case 0xB8CE0000u: // ogo -> Latn
+        case 0xD0CE0000u: // ogu -> Latn
+        case 0xD0EE0000u: // ohu -> Latn
+        case 0x810E0000u: // oia -> Latn
+        case 0x910E0000u: // oie -> Latn
+        case 0xB50E0000u: // oin -> Latn
+        case 0x852E0000u: // ojb -> Latn
+        case 0x892E0000u: // ojc -> Latn
+        case 0xD52E0000u: // ojv -> Latn
+        case 0xD92E0000u: // ojw -> Latn
+        case 0x814E0000u: // oka -> Latn
+        case 0x854E0000u: // okb -> Latn
+        case 0x894E0000u: // okc -> Latn
+        case 0x8D4E0000u: // okd -> Latn
+        case 0x914E0000u: // oke -> Latn
+        case 0x994E0000u: // okg -> Latn
+        case 0xA14E0000u: // oki -> Latn
+        case 0xA94E0000u: // okk -> Latn
+        case 0xC54E0000u: // okr -> Latn
+        case 0xC94E0000u: // oks -> Latn
+        case 0xD14E0000u: // oku -> Latn
+        case 0xD54E0000u: // okv -> Latn
+        case 0xDD4E0000u: // okx -> Latn
+        case 0x8D6E0000u: // old -> Latn
+        case 0xA96E0000u: // olk -> Latn
+        case 0xB16E0000u: // olm -> Latn
+        case 0xB96E0000u: // olo -> Latn
+        case 0xC56E0000u: // olr -> Latn
+        case 0xCD6E0000u: // olt -> Latn
+        case 0xD16E0000u: // olu -> Latn
+        case 0x6F6D0000u: // om -> Latn
+        case 0x818E0000u: // oma -> Latn
+        case 0x858E0000u: // omb -> Latn
+        case 0x898E0000u: // omc -> Latn
+        case 0x998E0000u: // omg -> Latn
+        case 0xA18E0000u: // omi -> Latn
+        case 0xAD8E0000u: // oml -> Latn
+        case 0xB98E0000u: // omo -> Latn
+        case 0xCD8E0000u: // omt -> Latn
+        case 0xD18E0000u: // omu -> Latn
+        case 0xD98E0000u: // omw -> Latn
+        case 0x81AE0000u: // ona -> Latn
+        case 0x91AE0000u: // one -> Latn
+        case 0x99AE0000u: // ong -> Latn
+        case 0xA1AE0000u: // oni -> Latn
+        case 0xA5AE0000u: // onj -> Latn
+        case 0xA9AE0000u: // onk -> Latn
+        case 0xB5AE0000u: // onn -> Latn
+        case 0xB9AE0000u: // ono -> Latn
+        case 0xBDAE0000u: // onp -> Latn
+        case 0xC5AE0000u: // onr -> Latn
+        case 0xC9AE0000u: // ons -> Latn
+        case 0xCDAE0000u: // ont -> Latn
+        case 0xD1AE0000u: // onu -> Latn
+        case 0xDDAE0000u: // onx -> Latn
+        case 0x8DCE0000u: // ood -> Latn
+        case 0xC5CE0000u: // oor -> Latn
+        case 0x81EE0000u: // opa -> Latn
+        case 0xA9EE0000u: // opk -> Latn
+        case 0xB1EE0000u: // opm -> Latn
+        case 0xB9EE0000u: // opo -> Latn
+        case 0xCDEE0000u: // opt -> Latn
+        case 0xE1EE0000u: // opy -> Latn
+        case 0x822E0000u: // ora -> Latn
+        case 0x8A2E0000u: // orc -> Latn
+        case 0x922E0000u: // ore -> Latn
+        case 0x9A2E0000u: // org -> Latn
+        case 0xB62E0000u: // orn -> Latn
+        case 0xBA2E0000u: // oro -> Latn
+        case 0xC62E0000u: // orr -> Latn
+        case 0xCA2E0000u: // ors -> Latn
+        case 0xDA2E0000u: // orw -> Latn
+        case 0xDE2E0000u: // orx -> Latn
+        case 0xE62E0000u: // orz -> Latn
+        case 0xBA4E0000u: // oso -> Latn
+        case 0xBE4E0000u: // osp -> Latn
+        case 0xCE4E0000u: // ost -> Latn
+        case 0xD24E0000u: // osu -> Latn
+        case 0xDE4E0000u: // osx -> Latn
+        case 0x8E6E0000u: // otd -> Latn
+        case 0x926E0000u: // ote -> Latn
+        case 0xA26E0000u: // oti -> Latn
+        case 0xAE6E0000u: // otl -> Latn
+        case 0xB26E0000u: // otm -> Latn
+        case 0xB66E0000u: // otn -> Latn
+        case 0xC26E0000u: // otq -> Latn
+        case 0xC66E0000u: // otr -> Latn
+        case 0xCA6E0000u: // ots -> Latn
+        case 0xCE6E0000u: // ott -> Latn
+        case 0xD26E0000u: // otu -> Latn
+        case 0xDA6E0000u: // otw -> Latn
+        case 0xDE6E0000u: // otx -> Latn
+        case 0xE66E0000u: // otz -> Latn
+        case 0x868E0000u: // oub -> Latn
+        case 0x928E0000u: // oue -> Latn
+        case 0xB28E0000u: // oum -> Latn
+        case 0x8EAE0000u: // ovd -> Latn
+        case 0xA2CE0000u: // owi -> Latn
+        case 0xAECE0000u: // owl -> Latn
+        case 0x8F0E0000u: // oyd -> Latn
+        case 0xB30E0000u: // oym -> Latn
+        case 0xE30E0000u: // oyy -> Latn
+        case 0xB32E0000u: // ozm -> Latn
+        case 0x840F0000u: // pab -> Latn
+        case 0x880F0000u: // pac -> Latn
+        case 0x8C0F0000u: // pad -> Latn
+        case 0x900F0000u: // pae -> Latn
+        case 0x940F0000u: // paf -> Latn
+        case 0x980F0000u: // pag -> Latn
+        case 0x9C0F0000u: // pah -> Latn
+        case 0xA00F0000u: // pai -> Latn
+        case 0xA80F0000u: // pak -> Latn
+        case 0xB00F0000u: // pam -> Latn
+        case 0xB80F0000u: // pao -> Latn
+        case 0xBC0F0000u: // pap -> Latn
+        case 0xC40F0000u: // par -> Latn
+        case 0xC80F0000u: // pas -> Latn
+        case 0xD00F0000u: // pau -> Latn
+        case 0xD40F0000u: // pav -> Latn
+        case 0xD80F0000u: // paw -> Latn
+        case 0xDC0F0000u: // pax -> Latn
+        case 0xE00F0000u: // pay -> Latn
+        case 0xE40F0000u: // paz -> Latn
+        case 0x842F0000u: // pbb -> Latn
+        case 0x882F0000u: // pbc -> Latn
+        case 0x902F0000u: // pbe -> Latn
+        case 0x942F0000u: // pbf -> Latn
+        case 0x982F0000u: // pbg -> Latn
+        case 0x9C2F0000u: // pbh -> Latn
+        case 0xA02F0000u: // pbi -> Latn
+        case 0xAC2F0000u: // pbl -> Latn
+        case 0xB02F0000u: // pbm -> Latn
+        case 0xB42F0000u: // pbn -> Latn
+        case 0xB82F0000u: // pbo -> Latn
+        case 0xBC2F0000u: // pbp -> Latn
+        case 0xC42F0000u: // pbr -> Latn
+        case 0xC82F0000u: // pbs -> Latn
+        case 0xD42F0000u: // pbv -> Latn
+        case 0xE02F0000u: // pby -> Latn
+        case 0x804F0000u: // pca -> Latn
+        case 0x884F0000u: // pcc -> Latn
+        case 0x8C4F0000u: // pcd -> Latn
+        case 0xA84F0000u: // pck -> Latn
+        case 0xB04F0000u: // pcm -> Latn
+        case 0xB44F0000u: // pcn -> Latn
+        case 0xBC4F0000u: // pcp -> Latn
+        case 0xD84F0000u: // pcw -> Latn
+        case 0x806F0000u: // pda -> Latn
+        case 0x886F0000u: // pdc -> Latn
+        case 0xB46F0000u: // pdn -> Latn
+        case 0xB86F0000u: // pdo -> Latn
+        case 0xCC6F0000u: // pdt -> Latn
+        case 0xD06F0000u: // pdu -> Latn
+        case 0x808F0000u: // pea -> Latn
+        case 0x848F0000u: // peb -> Latn
+        case 0x8C8F0000u: // ped -> Latn
+        case 0x908F0000u: // pee -> Latn
+        case 0xA08F0000u: // pei -> Latn
+        case 0xA88F0000u: // pek -> Latn
+        case 0xAC8F0000u: // pel -> Latn
+        case 0xB08F0000u: // pem -> Latn
+        case 0xBC8F0000u: // pep -> Latn
+        case 0xC08F0000u: // peq -> Latn
+        case 0xD48F0000u: // pev -> Latn
+        case 0xDC8F0000u: // pex -> Latn
+        case 0xE08F0000u: // pey -> Latn
+        case 0xE48F0000u: // pez -> Latn
+        case 0x80AF0000u: // pfa -> Latn
+        case 0x90AF0000u: // pfe -> Latn
+        case 0xACAF0000u: // pfl -> Latn
+        case 0x80CF0000u: // pga -> Latn
+        case 0xA0CF0000u: // pgi -> Latn
+        case 0xA8CF0000u: // pgk -> Latn
+        case 0xC8CF0000u: // pgs -> Latn
+        case 0xD0CF0000u: // pgu -> Latn
+        case 0x98EF0000u: // phg -> Latn
+        case 0x9CEF0000u: // phh -> Latn
+        case 0xB0EF0000u: // phm -> Latn
+        case 0x810F0000u: // pia -> Latn
+        case 0x850F0000u: // pib -> Latn
+        case 0x890F0000u: // pic -> Latn
+        case 0x8D0F0000u: // pid -> Latn
+        case 0x950F0000u: // pif -> Latn
+        case 0x990F0000u: // pig -> Latn
+        case 0x9D0F0000u: // pih -> Latn
+        case 0xA50F0000u: // pij -> Latn
+        case 0xAD0F0000u: // pil -> Latn
+        case 0xB10F0000u: // pim -> Latn
+        case 0xB50F0000u: // pin -> Latn
+        case 0xB90F0000u: // pio -> Latn
+        case 0xBD0F0000u: // pip -> Latn
+        case 0xC50F0000u: // pir -> Latn
+        case 0xC90F0000u: // pis -> Latn
+        case 0xCD0F0000u: // pit -> Latn
+        case 0xD10F0000u: // piu -> Latn
+        case 0xD50F0000u: // piv -> Latn
+        case 0xD90F0000u: // piw -> Latn
+        case 0xDD0F0000u: // pix -> Latn
+        case 0xE10F0000u: // piy -> Latn
+        case 0xE50F0000u: // piz -> Latn
+        case 0xCD2F0000u: // pjt -> Latn
+        case 0x854F0000u: // pkb -> Latn
+        case 0x994F0000u: // pkg -> Latn
+        case 0x9D4F0000u: // pkh -> Latn
+        case 0xB54F0000u: // pkn -> Latn
+        case 0xB94F0000u: // pko -> Latn
+        case 0xBD4F0000u: // pkp -> Latn
+        case 0xD14F0000u: // pku -> Latn
+        case 0x706C0000u: // pl -> Latn
+        case 0x816F0000u: // pla -> Latn
+        case 0x856F0000u: // plb -> Latn
+        case 0x896F0000u: // plc -> Latn
+        case 0x8D6F0000u: // pld -> Latn
+        case 0x916F0000u: // ple -> Latn
+        case 0x996F0000u: // plg -> Latn
+        case 0x9D6F0000u: // plh -> Latn
+        case 0xB56F0000u: // pln -> Latn
+        case 0xB96F0000u: // plo -> Latn
+        case 0xC56F0000u: // plr -> Latn
+        case 0xC96F0000u: // pls -> Latn
+        case 0xD16F0000u: // plu -> Latn
+        case 0xD56F0000u: // plv -> Latn
+        case 0xD96F0000u: // plw -> Latn
+        case 0xE56F0000u: // plz -> Latn
+        case 0x818F0000u: // pma -> Latn
+        case 0x858F0000u: // pmb -> Latn
+        case 0x8D8F0000u: // pmd -> Latn
+        case 0x918F0000u: // pme -> Latn
+        case 0x958F0000u: // pmf -> Latn
+        case 0xA18F0000u: // pmi -> Latn
+        case 0xA58F0000u: // pmj -> Latn
+        case 0xAD8F0000u: // pml -> Latn
+        case 0xB18F0000u: // pmm -> Latn
+        case 0xB58F0000u: // pmn -> Latn
+        case 0xB98F0000u: // pmo -> Latn
+        case 0xC18F0000u: // pmq -> Latn
+        case 0xC58F0000u: // pmr -> Latn
+        case 0xC98F0000u: // pms -> Latn
+        case 0xCD8F0000u: // pmt -> Latn
+        case 0xD98F0000u: // pmw -> Latn
+        case 0xDD8F0000u: // pmx -> Latn
+        case 0xE18F0000u: // pmy -> Latn
+        case 0xE58F0000u: // pmz -> Latn
+        case 0x81AF0000u: // pna -> Latn
+        case 0x89AF0000u: // pnc -> Latn
+        case 0x8DAF0000u: // pnd -> Latn
+        case 0x91AF0000u: // pne -> Latn
+        case 0x99AF0000u: // png -> Latn
+        case 0x9DAF0000u: // pnh -> Latn
+        case 0xA1AF0000u: // pni -> Latn
+        case 0xA5AF0000u: // pnj -> Latn
+        case 0xA9AF0000u: // pnk -> Latn
+        case 0xADAF0000u: // pnl -> Latn
+        case 0xB1AF0000u: // pnm -> Latn
+        case 0xB5AF0000u: // pnn -> Latn
+        case 0xB9AF0000u: // pno -> Latn
+        case 0xBDAF0000u: // pnp -> Latn
+        case 0xC1AF0000u: // pnq -> Latn
+        case 0xC5AF0000u: // pnr -> Latn
+        case 0xC9AF0000u: // pns -> Latn
+        case 0xD5AF0000u: // pnv -> Latn
+        case 0xD9AF0000u: // pnw -> Latn
+        case 0xE1AF0000u: // pny -> Latn
+        case 0xE5AF0000u: // pnz -> Latn
+        case 0x89CF0000u: // poc -> Latn
+        case 0x91CF0000u: // poe -> Latn
+        case 0x95CF0000u: // pof -> Latn
+        case 0x99CF0000u: // pog -> Latn
+        case 0x9DCF0000u: // poh -> Latn
+        case 0xA1CF0000u: // poi -> Latn
+        case 0xA9CF0000u: // pok -> Latn
+        case 0xB1CF0000u: // pom -> Latn
+        case 0xB5CF0000u: // pon -> Latn
+        case 0xB9CF0000u: // poo -> Latn
+        case 0xBDCF0000u: // pop -> Latn
+        case 0xC1CF0000u: // poq -> Latn
+        case 0xC9CF0000u: // pos -> Latn
+        case 0xCDCF0000u: // pot -> Latn
+        case 0xD5CF0000u: // pov -> Latn
+        case 0xD9CF0000u: // pow -> Latn
+        case 0xE1CF0000u: // poy -> Latn
+        case 0x91EF0000u: // ppe -> Latn
+        case 0xA1EF0000u: // ppi -> Latn
+        case 0xA9EF0000u: // ppk -> Latn
+        case 0xADEF0000u: // ppl -> Latn
+        case 0xB1EF0000u: // ppm -> Latn
+        case 0xB5EF0000u: // ppn -> Latn
+        case 0xB9EF0000u: // ppo -> Latn
+        case 0xBDEF0000u: // ppp -> Latn
+        case 0xC1EF0000u: // ppq -> Latn
+        case 0xC9EF0000u: // pps -> Latn
+        case 0xCDEF0000u: // ppt -> Latn
+        case 0x820F0000u: // pqa -> Latn
+        case 0xB20F0000u: // pqm -> Latn
+        case 0x922F0000u: // pre -> Latn
+        case 0x962F0000u: // prf -> Latn
+        case 0x9A2F0000u: // prg -> Latn
+        case 0x9E2F0000u: // prh -> Latn
+        case 0xA22F0000u: // pri -> Latn
+        case 0xAA2F0000u: // prk -> Latn
+        case 0xB22F0000u: // prm -> Latn
+        case 0xBA2F0000u: // pro -> Latn
+        case 0xC22F0000u: // prq -> Latn
+        case 0xC62F0000u: // prr -> Latn
+        case 0xD22F0000u: // pru -> Latn
+        case 0xDA2F0000u: // prw -> Latn
+        case 0x824F0000u: // psa -> Latn
+        case 0x924F0000u: // pse -> Latn
+        case 0xB24F0000u: // psm -> Latn
+        case 0xB64F0000u: // psn -> Latn
+        case 0xC24F0000u: // psq -> Latn
+        case 0xCA4F0000u: // pss -> Latn
+        case 0xDA4F0000u: // psw -> Latn
+        case 0x70740000u: // pt -> Latn
+        case 0x826F0000u: // pta -> Latn
+        case 0x9E6F0000u: // pth -> Latn
+        case 0xA26F0000u: // pti -> Latn
+        case 0xB66F0000u: // ptn -> Latn
+        case 0xBA6F0000u: // pto -> Latn
+        case 0xBE6F0000u: // ptp -> Latn
+        case 0xC66F0000u: // ptr -> Latn
+        case 0xCE6F0000u: // ptt -> Latn
+        case 0xD26F0000u: // ptu -> Latn
+        case 0xD66F0000u: // ptv -> Latn
+        case 0x828F0000u: // pua -> Latn
+        case 0x868F0000u: // pub -> Latn
+        case 0x8A8F0000u: // puc -> Latn
+        case 0x8E8F0000u: // pud -> Latn
+        case 0x928F0000u: // pue -> Latn
+        case 0x968F0000u: // puf -> Latn
+        case 0x9A8F0000u: // pug -> Latn
+        case 0xA28F0000u: // pui -> Latn
+        case 0xA68F0000u: // puj -> Latn
+        case 0xBA8F0000u: // puo -> Latn
+        case 0xBE8F0000u: // pup -> Latn
+        case 0xC28F0000u: // puq -> Latn
+        case 0xC68F0000u: // pur -> Latn
+        case 0xCE8F0000u: // put -> Latn
+        case 0xD28F0000u: // puu -> Latn
+        case 0xDA8F0000u: // puw -> Latn
+        case 0xDE8F0000u: // pux -> Latn
+        case 0xE28F0000u: // puy -> Latn
+        case 0x82CF0000u: // pwa -> Latn
+        case 0x86CF0000u: // pwb -> Latn
+        case 0x9ACF0000u: // pwg -> Latn
+        case 0xB2CF0000u: // pwm -> Latn
+        case 0xB6CF0000u: // pwn -> Latn
+        case 0xB2EF0000u: // pxm -> Latn
+        case 0x930F0000u: // pye -> Latn
+        case 0xB30F0000u: // pym -> Latn
+        case 0xB70F0000u: // pyn -> Latn
+        case 0xD30F0000u: // pyu -> Latn
+        case 0xE30F0000u: // pyy -> Latn
+        case 0x932F0000u: // pze -> Latn
+        case 0x9F2F0000u: // pzh -> Latn
+        case 0xB72F0000u: // pzn -> Latn
+        case 0x71750000u: // qu -> Latn
+        case 0x82900000u: // qua -> Latn
+        case 0x86900000u: // qub -> Latn
+        case 0x8A900000u: // quc -> Latn
+        case 0x8E900000u: // qud -> Latn
+        case 0x96900000u: // quf -> Latn
+        case 0x9A900000u: // qug -> Latn
+        case 0xA2900000u: // qui -> Latn
+        case 0xAA900000u: // quk -> Latn
+        case 0xAE900000u: // qul -> Latn
+        case 0xB2900000u: // qum -> Latn
+        case 0xB6900000u: // qun -> Latn
+        case 0xBE900000u: // qup -> Latn
+        case 0xC2900000u: // quq -> Latn
+        case 0xC6900000u: // qur -> Latn
+        case 0xCA900000u: // qus -> Latn
+        case 0xD6900000u: // quv -> Latn
+        case 0xDA900000u: // quw -> Latn
+        case 0xDE900000u: // qux -> Latn
+        case 0xE2900000u: // quy -> Latn
+        case 0x82B00000u: // qva -> Latn
+        case 0x8AB00000u: // qvc -> Latn
+        case 0x92B00000u: // qve -> Latn
+        case 0x9EB00000u: // qvh -> Latn
+        case 0xA2B00000u: // qvi -> Latn
+        case 0xA6B00000u: // qvj -> Latn
+        case 0xAEB00000u: // qvl -> Latn
+        case 0xB2B00000u: // qvm -> Latn
+        case 0xB6B00000u: // qvn -> Latn
+        case 0xBAB00000u: // qvo -> Latn
+        case 0xBEB00000u: // qvp -> Latn
+        case 0xCAB00000u: // qvs -> Latn
+        case 0xDAB00000u: // qvw -> Latn
+        case 0xE6B00000u: // qvz -> Latn
+        case 0x82D00000u: // qwa -> Latn
+        case 0x8AD00000u: // qwc -> Latn
+        case 0x9ED00000u: // qwh -> Latn
+        case 0xB2D00000u: // qwm -> Latn
+        case 0xCAD00000u: // qws -> Latn
+        case 0xCED00000u: // qwt -> Latn
+        case 0x82F00000u: // qxa -> Latn
+        case 0x8AF00000u: // qxc -> Latn
+        case 0x9EF00000u: // qxh -> Latn
+        case 0xAEF00000u: // qxl -> Latn
+        case 0xB6F00000u: // qxn -> Latn
+        case 0xBAF00000u: // qxo -> Latn
+        case 0xBEF00000u: // qxp -> Latn
+        case 0xC6F00000u: // qxr -> Latn
+        case 0xCEF00000u: // qxt -> Latn
+        case 0xD2F00000u: // qxu -> Latn
+        case 0xDAF00000u: // qxw -> Latn
+        case 0x83100000u: // qya -> Latn
+        case 0xBF100000u: // qyp -> Latn
+        case 0x88110000u: // rac -> Latn
+        case 0x8C110000u: // rad -> Latn
+        case 0x98110000u: // rag -> Latn
+        case 0xA0110000u: // rai -> Latn
+        case 0xA8110000u: // rak -> Latn
+        case 0xB0110000u: // ram -> Latn
+        case 0xB4110000u: // ran -> Latn
+        case 0xB8110000u: // rao -> Latn
+        case 0xBC110000u: // rap -> Latn
+        case 0xC4110000u: // rar -> Latn
+        case 0xD8110000u: // raw -> Latn
+        case 0xDC110000u: // rax -> Latn
+        case 0xE0110000u: // ray -> Latn
+        case 0xE4110000u: // raz -> Latn
+        case 0xA8310000u: // rbk -> Latn
+        case 0xAC310000u: // rbl -> Latn
+        case 0xBC310000u: // rbp -> Latn
+        case 0x94510000u: // rcf -> Latn
+        case 0x80910000u: // rea -> Latn
+        case 0x84910000u: // reb -> Latn
+        case 0x90910000u: // ree -> Latn
+        case 0x98910000u: // reg -> Latn
+        case 0xA4910000u: // rej -> Latn
+        case 0xAC910000u: // rel -> Latn
+        case 0xB0910000u: // rem -> Latn
+        case 0xB4910000u: // ren -> Latn
+        case 0xC8910000u: // res -> Latn
+        case 0xCC910000u: // ret -> Latn
+        case 0xE0910000u: // rey -> Latn
+        case 0x80D10000u: // rga -> Latn
+        case 0xB4D10000u: // rgn -> Latn
+        case 0xC4D10000u: // rgr -> Latn
+        case 0xC8D10000u: // rgs -> Latn
+        case 0xD0D10000u: // rgu -> Latn
+        case 0xBCF10000u: // rhp -> Latn
+        case 0x81110000u: // ria -> Latn
+        case 0x95110000u: // rif -> Latn
+        case 0xAD110000u: // ril -> Latn
+        case 0xB1110000u: // rim -> Latn
+        case 0xB5110000u: // rin -> Latn
+        case 0xC5110000u: // rir -> Latn
+        case 0xCD110000u: // rit -> Latn
+        case 0xD1110000u: // riu -> Latn
+        case 0x99310000u: // rjg -> Latn
+        case 0x85510000u: // rkb -> Latn
+        case 0x9D510000u: // rkh -> Latn
+        case 0xB1510000u: // rkm -> Latn
+        case 0xD9510000u: // rkw -> Latn
+        case 0x726D0000u: // rm -> Latn
+        case 0x81910000u: // rma -> Latn
+        case 0x85910000u: // rmb -> Latn
+        case 0x89910000u: // rmc -> Latn
+        case 0x8D910000u: // rmd -> Latn
+        case 0x91910000u: // rme -> Latn
+        case 0x95910000u: // rmf -> Latn
+        case 0x99910000u: // rmg -> Latn
+        case 0x9D910000u: // rmh -> Latn
+        case 0xA9910000u: // rmk -> Latn
+        case 0xAD910000u: // rml -> Latn
+        case 0xB1910000u: // rmm -> Latn
+        case 0xB5910000u: // rmn -> Latn
+        case 0xB9910000u: // rmo -> Latn
+        case 0xBD910000u: // rmp -> Latn
+        case 0xC1910000u: // rmq -> Latn
+        case 0xD1910000u: // rmu -> Latn
+        case 0xD9910000u: // rmw -> Latn
+        case 0xDD910000u: // rmx -> Latn
+        case 0x726E0000u: // rn -> Latn
+        case 0x8DB10000u: // rnd -> Latn
+        case 0x99B10000u: // rng -> Latn
+        case 0xADB10000u: // rnl -> Latn
+        case 0xB5B10000u: // rnn -> Latn
+        case 0xC5B10000u: // rnr -> Latn
+        case 0xD9B10000u: // rnw -> Latn
+        case 0x726F0000u: // ro -> Latn
+        case 0x85D10000u: // rob -> Latn
+        case 0x89D10000u: // roc -> Latn
+        case 0x8DD10000u: // rod -> Latn
+        case 0x91D10000u: // roe -> Latn
+        case 0x95D10000u: // rof -> Latn
+        case 0x99D10000u: // rog -> Latn
+        case 0xADD10000u: // rol -> Latn
+        case 0xB1D10000u: // rom -> Latn
+        case 0xB9D10000u: // roo -> Latn
+        case 0xBDD10000u: // rop -> Latn
+        case 0xC5D10000u: // ror -> Latn
+        case 0xD1D10000u: // rou -> Latn
+        case 0xD9D10000u: // row -> Latn
+        case 0xB5F10000u: // rpn -> Latn
+        case 0xCDF10000u: // rpt -> Latn
+        case 0xA2310000u: // rri -> Latn
+        case 0xB2310000u: // rrm -> Latn
+        case 0xBA310000u: // rro -> Latn
+        case 0xCE310000u: // rrt -> Latn
+        case 0xDA510000u: // rsw -> Latn
+        case 0x8A710000u: // rtc -> Latn
+        case 0x9E710000u: // rth -> Latn
+        case 0xB2710000u: // rtm -> Latn
+        case 0x86910000u: // rub -> Latn
+        case 0x8A910000u: // ruc -> Latn
+        case 0x96910000u: // ruf -> Latn
+        case 0x9A910000u: // rug -> Latn
+        case 0xA2910000u: // rui -> Latn
+        case 0xAA910000u: // ruk -> Latn
+        case 0xBA910000u: // ruo -> Latn
+        case 0xBE910000u: // rup -> Latn
+        case 0xC2910000u: // ruq -> Latn
+        case 0xD2910000u: // ruu -> Latn
+        case 0xE2910000u: // ruy -> Latn
+        case 0xE6910000u: // ruz -> Latn
+        case 0x72770000u: // rw -> Latn
+        case 0x82D10000u: // rwa -> Latn
+        case 0xAAD10000u: // rwk -> Latn
+        case 0xAED10000u: // rwl -> Latn
+        case 0xB2D10000u: // rwm -> Latn
+        case 0xBAD10000u: // rwo -> Latn
+        case 0x8EF10000u: // rxd -> Latn
+        case 0xDAF10000u: // rxw -> Latn
+        case 0x80120000u: // saa -> Latn
+        case 0x84120000u: // sab -> Latn
+        case 0x88120000u: // sac -> Latn
+        case 0x8C120000u: // sad -> Latn
+        case 0x90120000u: // sae -> Latn
+        case 0x94120000u: // saf -> Latn
+        case 0xA4120000u: // saj -> Latn
+        case 0xA8120000u: // sak -> Latn
+        case 0xB8120000u: // sao -> Latn
+        case 0xC0120000u: // saq -> Latn
+        case 0xC4120000u: // sar -> Latn
+        case 0xC8120000u: // sas -> Latn
+        case 0xD0120000u: // sau -> Latn
+        case 0xD4120000u: // sav -> Latn
+        case 0xD8120000u: // saw -> Latn
+        case 0xDC120000u: // sax -> Latn
+        case 0xE0120000u: // say -> Latn
+        case 0x80320000u: // sba -> Latn
+        case 0x84320000u: // sbb -> Latn
+        case 0x88320000u: // sbc -> Latn
+        case 0x8C320000u: // sbd -> Latn
+        case 0x90320000u: // sbe -> Latn
+        case 0x98320000u: // sbg -> Latn
+        case 0x9C320000u: // sbh -> Latn
+        case 0xA0320000u: // sbi -> Latn
+        case 0xA4320000u: // sbj -> Latn
+        case 0xA8320000u: // sbk -> Latn
+        case 0xAC320000u: // sbl -> Latn
+        case 0xB0320000u: // sbm -> Latn
+        case 0xB8320000u: // sbo -> Latn
+        case 0xBC320000u: // sbp -> Latn
+        case 0xC0320000u: // sbq -> Latn
+        case 0xC4320000u: // sbr -> Latn
+        case 0xC8320000u: // sbs -> Latn
+        case 0xCC320000u: // sbt -> Latn
+        case 0xD4320000u: // sbv -> Latn
+        case 0xD8320000u: // sbw -> Latn
+        case 0xDC320000u: // sbx -> Latn
+        case 0xE0320000u: // sby -> Latn
+        case 0xE4320000u: // sbz -> Latn
+        case 0x73630000u: // sc -> Latn
+        case 0x84520000u: // scb -> Latn
+        case 0x90520000u: // sce -> Latn
+        case 0x94520000u: // scf -> Latn
+        case 0x98520000u: // scg -> Latn
+        case 0x9C520000u: // sch -> Latn
+        case 0xA0520000u: // sci -> Latn
+        case 0xB4520000u: // scn -> Latn
+        case 0xB8520000u: // sco -> Latn
+        case 0xC8520000u: // scs -> Latn
+        case 0xD4520000u: // scv -> Latn
+        case 0xD8520000u: // scw -> Latn
+        case 0x80720000u: // sda -> Latn
+        case 0x88720000u: // sdc -> Latn
+        case 0x90720000u: // sde -> Latn
+        case 0xA4720000u: // sdj -> Latn
+        case 0xA8720000u: // sdk -> Latn
+        case 0xB4720000u: // sdn -> Latn
+        case 0xB8720000u: // sdo -> Latn
+        case 0xC0720000u: // sdq -> Latn
+        case 0xD0720000u: // sdu -> Latn
+        case 0xDC720000u: // sdx -> Latn
+        case 0x73650000u: // se -> Latn
+        case 0x80920000u: // sea -> Latn
+        case 0x84920000u: // seb -> Latn
+        case 0x88920000u: // sec -> Latn
+        case 0x8C920000u: // sed -> Latn
+        case 0x90920000u: // see -> Latn
+        case 0x94920000u: // sef -> Latn
+        case 0x98920000u: // seg -> Latn
+        case 0x9C920000u: // seh -> Latn
+        case 0xA0920000u: // sei -> Latn
+        case 0xA4920000u: // sej -> Latn
+        case 0xA8920000u: // sek -> Latn
+        case 0xB4920000u: // sen -> Latn
+        case 0xB8920000u: // seo -> Latn
+        case 0xBC920000u: // sep -> Latn
+        case 0xC0920000u: // seq -> Latn
+        case 0xC4920000u: // ser -> Latn
+        case 0xC8920000u: // ses -> Latn
+        case 0xCC920000u: // set -> Latn
+        case 0xD0920000u: // seu -> Latn
+        case 0xD4920000u: // sev -> Latn
+        case 0xD8920000u: // sew -> Latn
+        case 0xE0920000u: // sey -> Latn
+        case 0xE4920000u: // sez -> Latn
+        case 0x90B20000u: // sfe -> Latn
+        case 0xD8B20000u: // sfw -> Latn
+        case 0x73670000u: // sg -> Latn
+        case 0x84D20000u: // sgb -> Latn
+        case 0x88D20000u: // sgc -> Latn
+        case 0x8CD20000u: // sgd -> Latn
+        case 0x90D20000u: // sge -> Latn
+        case 0xA0D20000u: // sgi -> Latn
+        case 0xB0D20000u: // sgm -> Latn
+        case 0xBCD20000u: // sgp -> Latn
+        case 0xC8D20000u: // sgs -> Latn
+        case 0xD0D20000u: // sgu -> Latn
+        case 0xE4D20000u: // sgz -> Latn
+        case 0x80F20000u: // sha -> Latn
+        case 0x84F20000u: // shb -> Latn
+        case 0x88F20000u: // shc -> Latn
+        case 0x90F20000u: // she -> Latn
+        case 0x98F20000u: // shg -> Latn
+        case 0x9CF20000u: // shh -> Latn
+        case 0xA4F20000u: // shj -> Latn
+        case 0xA8F20000u: // shk -> Latn
+        case 0xB8F20000u: // sho -> Latn
+        case 0xBCF20000u: // shp -> Latn
+        case 0xC0F20000u: // shq -> Latn
+        case 0xC4F20000u: // shr -> Latn
+        case 0xC8F20000u: // shs -> Latn
+        case 0xCCF20000u: // sht -> Latn
+        case 0xD8F20000u: // shw -> Latn
+        case 0xE0F20000u: // shy -> Latn
+        case 0xE4F20000u: // shz -> Latn
+        case 0x85120000u: // sib -> Latn
+        case 0x8D120000u: // sid -> Latn
+        case 0x91120000u: // sie -> Latn
+        case 0x95120000u: // sif -> Latn
+        case 0x99120000u: // sig -> Latn
+        case 0x9D120000u: // sih -> Latn
+        case 0xA1120000u: // sii -> Latn
+        case 0xA5120000u: // sij -> Latn
+        case 0xA9120000u: // sik -> Latn
+        case 0xAD120000u: // sil -> Latn
+        case 0xB1120000u: // sim -> Latn
+        case 0xC1120000u: // siq -> Latn
+        case 0xC5120000u: // sir -> Latn
+        case 0xC9120000u: // sis -> Latn
+        case 0xD1120000u: // siu -> Latn
+        case 0xD5120000u: // siv -> Latn
+        case 0xD9120000u: // siw -> Latn
+        case 0xDD120000u: // six -> Latn
+        case 0x81320000u: // sja -> Latn
+        case 0x85320000u: // sjb -> Latn
+        case 0x91320000u: // sje -> Latn
+        case 0x99320000u: // sjg -> Latn
+        case 0xAD320000u: // sjl -> Latn
+        case 0xB1320000u: // sjm -> Latn
+        case 0xC5320000u: // sjr -> Latn
+        case 0xD1320000u: // sju -> Latn
+        case 0xD9320000u: // sjw -> Latn
+        case 0x736B0000u: // sk -> Latn
+        case 0x81520000u: // ska -> Latn
+        case 0x89520000u: // skc -> Latn
+        case 0x8D520000u: // skd -> Latn
+        case 0x91520000u: // ske -> Latn
+        case 0x95520000u: // skf -> Latn
+        case 0x99520000u: // skg -> Latn
+        case 0x9D520000u: // skh -> Latn
+        case 0xA1520000u: // ski -> Latn
+        case 0xB1520000u: // skm -> Latn
+        case 0xB5520000u: // skn -> Latn
+        case 0xB9520000u: // sko -> Latn
+        case 0xBD520000u: // skp -> Latn
+        case 0xC1520000u: // skq -> Latn
+        case 0xC9520000u: // sks -> Latn
+        case 0xCD520000u: // skt -> Latn
+        case 0xD1520000u: // sku -> Latn
+        case 0xD5520000u: // skv -> Latn
+        case 0xD9520000u: // skw -> Latn
+        case 0xDD520000u: // skx -> Latn
+        case 0xE1520000u: // sky -> Latn
+        case 0xE5520000u: // skz -> Latn
+        case 0x736C0000u: // sl -> Latn
+        case 0x89720000u: // slc -> Latn
+        case 0x8D720000u: // sld -> Latn
+        case 0x99720000u: // slg -> Latn
+        case 0x9D720000u: // slh -> Latn
+        case 0xA1720000u: // sli -> Latn
+        case 0xA5720000u: // slj -> Latn
+        case 0xAD720000u: // sll -> Latn
+        case 0xB1720000u: // slm -> Latn
+        case 0xB5720000u: // sln -> Latn
+        case 0xBD720000u: // slp -> Latn
+        case 0xC5720000u: // slr -> Latn
+        case 0xD1720000u: // slu -> Latn
+        case 0xD9720000u: // slw -> Latn
+        case 0xDD720000u: // slx -> Latn
+        case 0xE1720000u: // sly -> Latn
+        case 0xE5720000u: // slz -> Latn
+        case 0x736D0000u: // sm -> Latn
+        case 0x81920000u: // sma -> Latn
+        case 0x85920000u: // smb -> Latn
+        case 0x89920000u: // smc -> Latn
+        case 0x95920000u: // smf -> Latn
+        case 0x99920000u: // smg -> Latn
+        case 0xA5920000u: // smj -> Latn
+        case 0xA9920000u: // smk -> Latn
+        case 0xAD920000u: // sml -> Latn
+        case 0xB5920000u: // smn -> Latn
+        case 0xC1920000u: // smq -> Latn
+        case 0xC5920000u: // smr -> Latn
+        case 0xC9920000u: // sms -> Latn
+        case 0xCD920000u: // smt -> Latn
+        case 0xD9920000u: // smw -> Latn
+        case 0xDD920000u: // smx -> Latn
+        case 0xE5920000u: // smz -> Latn
+        case 0x736E0000u: // sn -> Latn
+        case 0x89B20000u: // snc -> Latn
+        case 0x91B20000u: // sne -> Latn
+        case 0x95B20000u: // snf -> Latn
+        case 0x99B20000u: // sng -> Latn
+        case 0xA1B20000u: // sni -> Latn
+        case 0xA5B20000u: // snj -> Latn
+        case 0xA9B20000u: // snk -> Latn
+        case 0xADB20000u: // snl -> Latn
+        case 0xB1B20000u: // snm -> Latn
+        case 0xB5B20000u: // snn -> Latn
+        case 0xB9B20000u: // sno -> Latn
+        case 0xBDB20000u: // snp -> Latn
+        case 0xC1B20000u: // snq -> Latn
+        case 0xC5B20000u: // snr -> Latn
+        case 0xC9B20000u: // sns -> Latn
+        case 0xD1B20000u: // snu -> Latn
+        case 0xD5B20000u: // snv -> Latn
+        case 0xD9B20000u: // snw -> Latn
+        case 0xDDB20000u: // snx -> Latn
+        case 0xE1B20000u: // sny -> Latn
+        case 0xE5B20000u: // snz -> Latn
+        case 0x736F0000u: // so -> Latn
+        case 0x85D20000u: // sob -> Latn
+        case 0x89D20000u: // soc -> Latn
+        case 0x8DD20000u: // sod -> Latn
+        case 0x91D20000u: // soe -> Latn
+        case 0xA9D20000u: // sok -> Latn
+        case 0xADD20000u: // sol -> Latn
+        case 0xB9D20000u: // soo -> Latn
+        case 0xBDD20000u: // sop -> Latn
+        case 0xC1D20000u: // soq -> Latn
+        case 0xC5D20000u: // sor -> Latn
+        case 0xC9D20000u: // sos -> Latn
+        case 0xD5D20000u: // sov -> Latn
+        case 0xD9D20000u: // sow -> Latn
+        case 0xDDD20000u: // sox -> Latn
+        case 0xE1D20000u: // soy -> Latn
+        case 0xE5D20000u: // soz -> Latn
+        case 0x85F20000u: // spb -> Latn
+        case 0x89F20000u: // spc -> Latn
+        case 0x8DF20000u: // spd -> Latn
+        case 0x91F20000u: // spe -> Latn
+        case 0x99F20000u: // spg -> Latn
+        case 0xA1F20000u: // spi -> Latn
+        case 0xA9F20000u: // spk -> Latn
+        case 0xADF20000u: // spl -> Latn
+        case 0xB1F20000u: // spm -> Latn
+        case 0xB5F20000u: // spn -> Latn
+        case 0xB9F20000u: // spo -> Latn
+        case 0xBDF20000u: // spp -> Latn
+        case 0xC1F20000u: // spq -> Latn
+        case 0xC5F20000u: // spr -> Latn
+        case 0xC9F20000u: // sps -> Latn
+        case 0x73710000u: // sq -> Latn
+        case 0x82120000u: // sqa -> Latn
+        case 0x9E120000u: // sqh -> Latn
+        case 0xB2120000u: // sqm -> Latn
+        case 0xD2120000u: // squ -> Latn
+        case 0x73724D45u: // sr-ME -> Latn
+        case 0x7372524Fu: // sr-RO -> Latn
+        case 0x73725255u: // sr-RU -> Latn
+        case 0x73725452u: // sr-TR -> Latn
+        case 0x82320000u: // sra -> Latn
+        case 0x92320000u: // sre -> Latn
+        case 0x96320000u: // srf -> Latn
+        case 0x9A320000u: // srg -> Latn
+        case 0xA2320000u: // sri -> Latn
+        case 0xAA320000u: // srk -> Latn
+        case 0xAE320000u: // srl -> Latn
+        case 0xB2320000u: // srm -> Latn
+        case 0xB6320000u: // srn -> Latn
+        case 0xBA320000u: // sro -> Latn
+        case 0xC2320000u: // srq -> Latn
+        case 0xC6320000u: // srr -> Latn
+        case 0xCA320000u: // srs -> Latn
+        case 0xCE320000u: // srt -> Latn
+        case 0xD2320000u: // sru -> Latn
+        case 0xD6320000u: // srv -> Latn
+        case 0xDA320000u: // srw -> Latn
+        case 0xE2320000u: // sry -> Latn
+        case 0x73730000u: // ss -> Latn
+        case 0x86520000u: // ssb -> Latn
+        case 0x8A520000u: // ssc -> Latn
+        case 0x8E520000u: // ssd -> Latn
+        case 0x92520000u: // sse -> Latn
+        case 0x96520000u: // ssf -> Latn
+        case 0x9A520000u: // ssg -> Latn
+        case 0xA6520000u: // ssj -> Latn
+        case 0xAE520000u: // ssl -> Latn
+        case 0xB2520000u: // ssm -> Latn
+        case 0xB6520000u: // ssn -> Latn
+        case 0xBA520000u: // sso -> Latn
+        case 0xC2520000u: // ssq -> Latn
+        case 0xCE520000u: // sst -> Latn
+        case 0xD2520000u: // ssu -> Latn
+        case 0xD6520000u: // ssv -> Latn
+        case 0xDE520000u: // ssx -> Latn
+        case 0xE2520000u: // ssy -> Latn
+        case 0xE6520000u: // ssz -> Latn
+        case 0x73740000u: // st -> Latn
+        case 0x82720000u: // sta -> Latn
+        case 0x86720000u: // stb -> Latn
+        case 0x92720000u: // ste -> Latn
+        case 0x96720000u: // stf -> Latn
+        case 0x9A720000u: // stg -> Latn
+        case 0x9E720000u: // sth -> Latn
+        case 0xA2720000u: // sti -> Latn
+        case 0xA6720000u: // stj -> Latn
+        case 0xAA720000u: // stk -> Latn
+        case 0xAE720000u: // stl -> Latn
+        case 0xB2720000u: // stm -> Latn
+        case 0xB6720000u: // stn -> Latn
+        case 0xBA720000u: // sto -> Latn
+        case 0xBE720000u: // stp -> Latn
+        case 0xC2720000u: // stq -> Latn
+        case 0xC6720000u: // str -> Latn
+        case 0xCE720000u: // stt -> Latn
+        case 0xDA720000u: // stw -> Latn
+        case 0x73750000u: // su -> Latn
+        case 0x82920000u: // sua -> Latn
+        case 0x86920000u: // sub -> Latn
+        case 0x8A920000u: // suc -> Latn
+        case 0x92920000u: // sue -> Latn
+        case 0x9A920000u: // sug -> Latn
+        case 0xA2920000u: // sui -> Latn
+        case 0xA6920000u: // suj -> Latn
+        case 0xAA920000u: // suk -> Latn
+        case 0xBA920000u: // suo -> Latn
+        case 0xC2920000u: // suq -> Latn
+        case 0xC6920000u: // sur -> Latn
+        case 0xCA920000u: // sus -> Latn
+        case 0xCE920000u: // sut -> Latn
+        case 0xD6920000u: // suv -> Latn
+        case 0xDA920000u: // suw -> Latn
+        case 0xE2920000u: // suy -> Latn
+        case 0x73760000u: // sv -> Latn
+        case 0x86B20000u: // svb -> Latn
+        case 0x8AB20000u: // svc -> Latn
+        case 0x92B20000u: // sve -> Latn
+        case 0xB2B20000u: // svm -> Latn
+        case 0xCAB20000u: // svs -> Latn
+        case 0x73770000u: // sw -> Latn
+        case 0x96D20000u: // swf -> Latn
+        case 0x9AD20000u: // swg -> Latn
+        case 0xA6D20000u: // swj -> Latn
+        case 0xAAD20000u: // swk -> Latn
+        case 0xB2D20000u: // swm -> Latn
+        case 0xBAD20000u: // swo -> Latn
+        case 0xBED20000u: // swp -> Latn
+        case 0xC2D20000u: // swq -> Latn
+        case 0xC6D20000u: // swr -> Latn
+        case 0xCAD20000u: // sws -> Latn
+        case 0xCED20000u: // swt -> Latn
+        case 0xD2D20000u: // swu -> Latn
+        case 0xDAD20000u: // sww -> Latn
+        case 0xDED20000u: // swx -> Latn
+        case 0xE2D20000u: // swy -> Latn
+        case 0x86F20000u: // sxb -> Latn
+        case 0x92F20000u: // sxe -> Latn
+        case 0xB6F20000u: // sxn -> Latn
+        case 0xC6F20000u: // sxr -> Latn
+        case 0xCAF20000u: // sxs -> Latn
+        case 0xDAF20000u: // sxw -> Latn
+        case 0x83120000u: // sya -> Latn
+        case 0x87120000u: // syb -> Latn
+        case 0xA3120000u: // syi -> Latn
+        case 0xAB120000u: // syk -> Latn
+        case 0xB3120000u: // sym -> Latn
+        case 0xBB120000u: // syo -> Latn
+        case 0xCB120000u: // sys -> Latn
+        case 0xDF120000u: // syx -> Latn
+        case 0x83320000u: // sza -> Latn
+        case 0x87320000u: // szb -> Latn
+        case 0x8B320000u: // szc -> Latn
+        case 0x9B320000u: // szg -> Latn
+        case 0xAF320000u: // szl -> Latn
+        case 0xB7320000u: // szn -> Latn
+        case 0xBF320000u: // szp -> Latn
+        case 0xD7320000u: // szv -> Latn
+        case 0xDB320000u: // szw -> Latn
+        case 0xE3320000u: // szy -> Latn
+        case 0x80130000u: // taa -> Latn
+        case 0x88130000u: // tac -> Latn
+        case 0x8C130000u: // tad -> Latn
+        case 0x90130000u: // tae -> Latn
+        case 0x94130000u: // taf -> Latn
+        case 0x98130000u: // tag -> Latn
+        case 0xA8130000u: // tak -> Latn
+        case 0xAC130000u: // tal -> Latn
+        case 0xB4130000u: // tan -> Latn
+        case 0xB8130000u: // tao -> Latn
+        case 0xBC130000u: // tap -> Latn
+        case 0xC0130000u: // taq -> Latn
+        case 0xC4130000u: // tar -> Latn
+        case 0xC8130000u: // tas -> Latn
+        case 0xD0130000u: // tau -> Latn
+        case 0xD4130000u: // tav -> Latn
+        case 0xD8130000u: // taw -> Latn
+        case 0xDC130000u: // tax -> Latn
+        case 0xE0130000u: // tay -> Latn
+        case 0xE4130000u: // taz -> Latn
+        case 0x80330000u: // tba -> Latn
+        case 0x88330000u: // tbc -> Latn
+        case 0x8C330000u: // tbd -> Latn
+        case 0x90330000u: // tbe -> Latn
+        case 0x94330000u: // tbf -> Latn
+        case 0x98330000u: // tbg -> Latn
+        case 0x9C330000u: // tbh -> Latn
+        case 0xA0330000u: // tbi -> Latn
+        case 0xA4330000u: // tbj -> Latn
+        case 0xAC330000u: // tbl -> Latn
+        case 0xB0330000u: // tbm -> Latn
+        case 0xB4330000u: // tbn -> Latn
+        case 0xB8330000u: // tbo -> Latn
+        case 0xBC330000u: // tbp -> Latn
+        case 0xC8330000u: // tbs -> Latn
+        case 0xCC330000u: // tbt -> Latn
+        case 0xD0330000u: // tbu -> Latn
+        case 0xD4330000u: // tbv -> Latn
+        case 0xD8330000u: // tbw -> Latn
+        case 0xDC330000u: // tbx -> Latn
+        case 0xE0330000u: // tby -> Latn
+        case 0xE4330000u: // tbz -> Latn
+        case 0x80530000u: // tca -> Latn
+        case 0x84530000u: // tcb -> Latn
+        case 0x88530000u: // tcc -> Latn
+        case 0x8C530000u: // tcd -> Latn
+        case 0x90530000u: // tce -> Latn
+        case 0x94530000u: // tcf -> Latn
+        case 0x98530000u: // tcg -> Latn
+        case 0x9C530000u: // tch -> Latn
+        case 0xA0530000u: // tci -> Latn
+        case 0xA8530000u: // tck -> Latn
+        case 0xB0530000u: // tcm -> Latn
+        case 0xBC530000u: // tcp -> Latn
+        case 0xC0530000u: // tcq -> Latn
+        case 0xC8530000u: // tcs -> Latn
+        case 0xD0530000u: // tcu -> Latn
+        case 0xD8530000u: // tcw -> Latn
+        case 0xE4530000u: // tcz -> Latn
+        case 0x88730000u: // tdc -> Latn
+        case 0x90730000u: // tde -> Latn
+        case 0xA0730000u: // tdi -> Latn
+        case 0xA4730000u: // tdj -> Latn
+        case 0xA8730000u: // tdk -> Latn
+        case 0xAC730000u: // tdl -> Latn
+        case 0xB0730000u: // tdm -> Latn
+        case 0xB4730000u: // tdn -> Latn
+        case 0xB8730000u: // tdo -> Latn
+        case 0xC0730000u: // tdq -> Latn
+        case 0xC4730000u: // tdr -> Latn
+        case 0xC8730000u: // tds -> Latn
+        case 0xCC730000u: // tdt -> Latn
+        case 0xD4730000u: // tdv -> Latn
+        case 0xDC730000u: // tdx -> Latn
+        case 0xE0730000u: // tdy -> Latn
+        case 0x80930000u: // tea -> Latn
+        case 0x84930000u: // teb -> Latn
+        case 0x88930000u: // tec -> Latn
+        case 0x8C930000u: // ted -> Latn
+        case 0x90930000u: // tee -> Latn
+        case 0x98930000u: // teg -> Latn
+        case 0x9C930000u: // teh -> Latn
+        case 0xA0930000u: // tei -> Latn
+        case 0xA8930000u: // tek -> Latn
+        case 0xB0930000u: // tem -> Latn
+        case 0xB4930000u: // ten -> Latn
+        case 0xB8930000u: // teo -> Latn
+        case 0xBC930000u: // tep -> Latn
+        case 0xC0930000u: // teq -> Latn
+        case 0xC4930000u: // ter -> Latn
+        case 0xCC930000u: // tet -> Latn
+        case 0xD0930000u: // teu -> Latn
+        case 0xD4930000u: // tev -> Latn
+        case 0xD8930000u: // tew -> Latn
+        case 0xDC930000u: // tex -> Latn
+        case 0xE0930000u: // tey -> Latn
+        case 0xE4930000u: // tez -> Latn
+        case 0xA0B30000u: // tfi -> Latn
+        case 0xB4B30000u: // tfn -> Latn
+        case 0xB8B30000u: // tfo -> Latn
+        case 0xC4B30000u: // tfr -> Latn
+        case 0xCCB30000u: // tft -> Latn
+        case 0x80D30000u: // tga -> Latn
+        case 0x84D30000u: // tgb -> Latn
+        case 0x88D30000u: // tgc -> Latn
+        case 0x8CD30000u: // tgd -> Latn
+        case 0x9CD30000u: // tgh -> Latn
+        case 0xA0D30000u: // tgi -> Latn
+        case 0xA4D30000u: // tgj -> Latn
+        case 0xB4D30000u: // tgn -> Latn
+        case 0xB8D30000u: // tgo -> Latn
+        case 0xBCD30000u: // tgp -> Latn
+        case 0xC0D30000u: // tgq -> Latn
+        case 0xC8D30000u: // tgs -> Latn
+        case 0xCCD30000u: // tgt -> Latn
+        case 0xD0D30000u: // tgu -> Latn
+        case 0xD4D30000u: // tgv -> Latn
+        case 0xD8D30000u: // tgw -> Latn
+        case 0xDCD30000u: // tgx -> Latn
+        case 0xE0D30000u: // tgy -> Latn
+        case 0xE4D30000u: // tgz -> Latn
+        case 0x8CF30000u: // thd -> Latn
+        case 0x9CF30000u: // thh -> Latn
+        case 0xA8F30000u: // thk -> Latn
+        case 0xBCF30000u: // thp -> Latn
+        case 0xCCF30000u: // tht -> Latn
+        case 0xD0F30000u: // thu -> Latn
+        case 0xD4F30000u: // thv -> Latn
+        case 0xE0F30000u: // thy -> Latn
+        case 0xE4F30000u: // thz -> Latn
+        case 0x89130000u: // tic -> Latn
+        case 0x95130000u: // tif -> Latn
+        case 0x9D130000u: // tih -> Latn
+        case 0xA1130000u: // tii -> Latn
+        case 0xA9130000u: // tik -> Latn
+        case 0xAD130000u: // til -> Latn
+        case 0xB1130000u: // tim -> Latn
+        case 0xB9130000u: // tio -> Latn
+        case 0xBD130000u: // tip -> Latn
+        case 0xC1130000u: // tiq -> Latn
+        case 0xC9130000u: // tis -> Latn
+        case 0xCD130000u: // tit -> Latn
+        case 0xD1130000u: // tiu -> Latn
+        case 0xD5130000u: // tiv -> Latn
+        case 0xD9130000u: // tiw -> Latn
+        case 0xDD130000u: // tix -> Latn
+        case 0xE1130000u: // tiy -> Latn
+        case 0x81330000u: // tja -> Latn
+        case 0x99330000u: // tjg -> Latn
+        case 0xA1330000u: // tji -> Latn
+        case 0xA5330000u: // tjj -> Latn
+        case 0xB5330000u: // tjn -> Latn
+        case 0xBD330000u: // tjp -> Latn
+        case 0xC9330000u: // tjs -> Latn
+        case 0xD1330000u: // tju -> Latn
+        case 0xD9330000u: // tjw -> Latn
+        case 0x746B0000u: // tk -> Latn
+        case 0x81530000u: // tka -> Latn
+        case 0x8D530000u: // tkd -> Latn
+        case 0x91530000u: // tke -> Latn
+        case 0x95530000u: // tkf -> Latn
+        case 0x99530000u: // tkg -> Latn
+        case 0xAD530000u: // tkl -> Latn
+        case 0xBD530000u: // tkp -> Latn
+        case 0xC1530000u: // tkq -> Latn
+        case 0xC5530000u: // tkr -> Latn
+        case 0xD1530000u: // tku -> Latn
+        case 0xD5530000u: // tkv -> Latn
+        case 0xD9530000u: // tkw -> Latn
+        case 0xDD530000u: // tkx -> Latn
+        case 0xE5530000u: // tkz -> Latn
+        case 0x746C0000u: // tl -> Latn
+        case 0x81730000u: // tla -> Latn
+        case 0x85730000u: // tlb -> Latn
+        case 0x89730000u: // tlc -> Latn
+        case 0x8D730000u: // tld -> Latn
+        case 0x95730000u: // tlf -> Latn
+        case 0x99730000u: // tlg -> Latn
+        case 0xA1730000u: // tli -> Latn
+        case 0xA5730000u: // tlj -> Latn
+        case 0xA9730000u: // tlk -> Latn
+        case 0xAD730000u: // tll -> Latn
+        case 0xB1730000u: // tlm -> Latn
+        case 0xB5730000u: // tln -> Latn
+        case 0xBD730000u: // tlp -> Latn
+        case 0xC1730000u: // tlq -> Latn
+        case 0xC5730000u: // tlr -> Latn
+        case 0xC9730000u: // tls -> Latn
+        case 0xCD730000u: // tlt -> Latn
+        case 0xD1730000u: // tlu -> Latn
+        case 0xD5730000u: // tlv -> Latn
+        case 0xDD730000u: // tlx -> Latn
+        case 0xE1730000u: // tly -> Latn
+        case 0x81930000u: // tma -> Latn
+        case 0x85930000u: // tmb -> Latn
+        case 0x89930000u: // tmc -> Latn
+        case 0x8D930000u: // tmd -> Latn
+        case 0x91930000u: // tme -> Latn
+        case 0x95930000u: // tmf -> Latn
+        case 0x99930000u: // tmg -> Latn
+        case 0x9D930000u: // tmh -> Latn
+        case 0xA1930000u: // tmi -> Latn
+        case 0xA5930000u: // tmj -> Latn
+        case 0xAD930000u: // tml -> Latn
+        case 0xB1930000u: // tmm -> Latn
+        case 0xB5930000u: // tmn -> Latn
+        case 0xB9930000u: // tmo -> Latn
+        case 0xC1930000u: // tmq -> Latn
+        case 0xCD930000u: // tmt -> Latn
+        case 0xD1930000u: // tmu -> Latn
+        case 0xD5930000u: // tmv -> Latn
+        case 0xD9930000u: // tmw -> Latn
+        case 0xE1930000u: // tmy -> Latn
+        case 0xE5930000u: // tmz -> Latn
+        case 0x746E0000u: // tn -> Latn
+        case 0x81B30000u: // tna -> Latn
+        case 0x85B30000u: // tnb -> Latn
+        case 0x89B30000u: // tnc -> Latn
+        case 0x8DB30000u: // tnd -> Latn
+        case 0x99B30000u: // tng -> Latn
+        case 0x9DB30000u: // tnh -> Latn
+        case 0xA1B30000u: // tni -> Latn
+        case 0xA9B30000u: // tnk -> Latn
+        case 0xADB30000u: // tnl -> Latn
+        case 0xB1B30000u: // tnm -> Latn
+        case 0xB5B30000u: // tnn -> Latn
+        case 0xB9B30000u: // tno -> Latn
+        case 0xBDB30000u: // tnp -> Latn
+        case 0xC1B30000u: // tnq -> Latn
+        case 0xC5B30000u: // tnr -> Latn
+        case 0xC9B30000u: // tns -> Latn
+        case 0xCDB30000u: // tnt -> Latn
+        case 0xD9B30000u: // tnw -> Latn
+        case 0xDDB30000u: // tnx -> Latn
+        case 0xE1B30000u: // tny -> Latn
+        case 0x746F0000u: // to -> Latn
+        case 0x85D30000u: // tob -> Latn
+        case 0x89D30000u: // toc -> Latn
+        case 0x8DD30000u: // tod -> Latn
+        case 0x95D30000u: // tof -> Latn
+        case 0x99D30000u: // tog -> Latn
+        case 0x9DD30000u: // toh -> Latn
+        case 0xA1D30000u: // toi -> Latn
+        case 0xA5D30000u: // toj -> Latn
+        case 0xA9D30000u: // tok -> Latn
+        case 0xADD30000u: // tol -> Latn
+        case 0xB1D30000u: // tom -> Latn
+        case 0xB9D30000u: // too -> Latn
+        case 0xBDD30000u: // top -> Latn
+        case 0xC1D30000u: // toq -> Latn
+        case 0xC5D30000u: // tor -> Latn
+        case 0xC9D30000u: // tos -> Latn
+        case 0xD1D30000u: // tou -> Latn
+        case 0xD9D30000u: // tow -> Latn
+        case 0xDDD30000u: // tox -> Latn
+        case 0xE1D30000u: // toy -> Latn
+        case 0xE5D30000u: // toz -> Latn
+        case 0x81F30000u: // tpa -> Latn
+        case 0x89F30000u: // tpc -> Latn
+        case 0x91F30000u: // tpe -> Latn
+        case 0x95F30000u: // tpf -> Latn
+        case 0x99F30000u: // tpg -> Latn
+        case 0xA1F30000u: // tpi -> Latn
+        case 0xA5F30000u: // tpj -> Latn
+        case 0xA9F30000u: // tpk -> Latn
+        case 0xADF30000u: // tpl -> Latn
+        case 0xB1F30000u: // tpm -> Latn
+        case 0xB5F30000u: // tpn -> Latn
+        case 0xBDF30000u: // tpp -> Latn
+        case 0xC5F30000u: // tpr -> Latn
+        case 0xCDF30000u: // tpt -> Latn
+        case 0xD5F30000u: // tpv -> Latn
+        case 0xDDF30000u: // tpx -> Latn
+        case 0xE1F30000u: // tpy -> Latn
+        case 0xE5F30000u: // tpz -> Latn
+        case 0x86130000u: // tqb -> Latn
+        case 0xAE130000u: // tql -> Latn
+        case 0xB2130000u: // tqm -> Latn
+        case 0xB6130000u: // tqn -> Latn
+        case 0xBA130000u: // tqo -> Latn
+        case 0xBE130000u: // tqp -> Latn
+        case 0xCE130000u: // tqt -> Latn
+        case 0xD2130000u: // tqu -> Latn
+        case 0xDA130000u: // tqw -> Latn
+        case 0x74720000u: // tr -> Latn
+        case 0x86330000u: // trb -> Latn
+        case 0x8A330000u: // trc -> Latn
+        case 0x92330000u: // tre -> Latn
+        case 0x96330000u: // trf -> Latn
+        case 0x9E330000u: // trh -> Latn
+        case 0xA2330000u: // tri -> Latn
+        case 0xA6330000u: // trj -> Latn
+        case 0xAE330000u: // trl -> Latn
+        case 0xB6330000u: // trn -> Latn
+        case 0xBA330000u: // tro -> Latn
+        case 0xBE330000u: // trp -> Latn
+        case 0xC2330000u: // trq -> Latn
+        case 0xC6330000u: // trr -> Latn
+        case 0xCA330000u: // trs -> Latn
+        case 0xCE330000u: // trt -> Latn
+        case 0xD2330000u: // tru -> Latn
+        case 0xD6330000u: // trv -> Latn
+        case 0xDE330000u: // trx -> Latn
+        case 0xE2330000u: // try -> Latn
+        case 0xE6330000u: // trz -> Latn
+        case 0x74730000u: // ts -> Latn
+        case 0x82530000u: // tsa -> Latn
+        case 0x86530000u: // tsb -> Latn
+        case 0x8A530000u: // tsc -> Latn
+        case 0x9A530000u: // tsg -> Latn
+        case 0x9E530000u: // tsh -> Latn
+        case 0xA2530000u: // tsi -> Latn
+        case 0xAE530000u: // tsl -> Latn
+        case 0xBE530000u: // tsp -> Latn
+        case 0xC6530000u: // tsr -> Latn
+        case 0xCE530000u: // tst -> Latn
+        case 0xD2530000u: // tsu -> Latn
+        case 0xD6530000u: // tsv -> Latn
+        case 0xDA530000u: // tsw -> Latn
+        case 0xDE530000u: // tsx -> Latn
+        case 0xE6530000u: // tsz -> Latn
+        case 0x86730000u: // ttb -> Latn
+        case 0x8A730000u: // ttc -> Latn
+        case 0x8E730000u: // ttd -> Latn
+        case 0x92730000u: // tte -> Latn
+        case 0x96730000u: // ttf -> Latn
+        case 0xA2730000u: // tti -> Latn
+        case 0xA6730000u: // ttj -> Latn
+        case 0xAA730000u: // ttk -> Latn
+        case 0xAE730000u: // ttl -> Latn
+        case 0xB2730000u: // ttm -> Latn
+        case 0xB6730000u: // ttn -> Latn
+        case 0xBE730000u: // ttp -> Latn
+        case 0xC6730000u: // ttr -> Latn
+        case 0xCE730000u: // ttt -> Latn
+        case 0xD2730000u: // ttu -> Latn
+        case 0xD6730000u: // ttv -> Latn
+        case 0xDA730000u: // ttw -> Latn
+        case 0xE2730000u: // tty -> Latn
+        case 0x82930000u: // tua -> Latn
+        case 0x86930000u: // tub -> Latn
+        case 0x8A930000u: // tuc -> Latn
+        case 0x8E930000u: // tud -> Latn
+        case 0x92930000u: // tue -> Latn
+        case 0x96930000u: // tuf -> Latn
+        case 0x9A930000u: // tug -> Latn
+        case 0x9E930000u: // tuh -> Latn
+        case 0xA2930000u: // tui -> Latn
+        case 0xA6930000u: // tuj -> Latn
+        case 0xAE930000u: // tul -> Latn
+        case 0xB2930000u: // tum -> Latn
+        case 0xB6930000u: // tun -> Latn
+        case 0xBA930000u: // tuo -> Latn
+        case 0xC2930000u: // tuq -> Latn
+        case 0xCA930000u: // tus -> Latn
+        case 0xD2930000u: // tuu -> Latn
+        case 0xD6930000u: // tuv -> Latn
+        case 0xDE930000u: // tux -> Latn
+        case 0xE2930000u: // tuy -> Latn
+        case 0xE6930000u: // tuz -> Latn
+        case 0x82B30000u: // tva -> Latn
+        case 0x8EB30000u: // tvd -> Latn
+        case 0x92B30000u: // tve -> Latn
+        case 0xA2B30000u: // tvi -> Latn
+        case 0xAAB30000u: // tvk -> Latn
+        case 0xAEB30000u: // tvl -> Latn
+        case 0xB2B30000u: // tvm -> Latn
+        case 0xBAB30000u: // tvo -> Latn
+        case 0xCAB30000u: // tvs -> Latn
+        case 0xCEB30000u: // tvt -> Latn
+        case 0xD2B30000u: // tvu -> Latn
+        case 0xDAB30000u: // tvw -> Latn
+        case 0xDEB30000u: // tvx -> Latn
+        case 0x82D30000u: // twa -> Latn
+        case 0x86D30000u: // twb -> Latn
+        case 0x8ED30000u: // twd -> Latn
+        case 0x92D30000u: // twe -> Latn
+        case 0x96D30000u: // twf -> Latn
+        case 0x9AD30000u: // twg -> Latn
+        case 0x9ED30000u: // twh -> Latn
+        case 0xAED30000u: // twl -> Latn
+        case 0xB6D30000u: // twn -> Latn
+        case 0xBAD30000u: // two -> Latn
+        case 0xBED30000u: // twp -> Latn
+        case 0xC2D30000u: // twq -> Latn
+        case 0xC6D30000u: // twr -> Latn
+        case 0xCED30000u: // twt -> Latn
+        case 0xD2D30000u: // twu -> Latn
+        case 0xDAD30000u: // tww -> Latn
+        case 0xDED30000u: // twx -> Latn
+        case 0xE2D30000u: // twy -> Latn
+        case 0x82F30000u: // txa -> Latn
+        case 0x92F30000u: // txe -> Latn
+        case 0xA2F30000u: // txi -> Latn
+        case 0xA6F30000u: // txj -> Latn
+        case 0xB2F30000u: // txm -> Latn
+        case 0xB6F30000u: // txn -> Latn
+        case 0xC2F30000u: // txq -> Latn
+        case 0xCAF30000u: // txs -> Latn
+        case 0xCEF30000u: // txt -> Latn
+        case 0xD2F30000u: // txu -> Latn
+        case 0xDEF30000u: // txx -> Latn
+        case 0xE2F30000u: // txy -> Latn
+        case 0x74790000u: // ty -> Latn
+        case 0x83130000u: // tya -> Latn
+        case 0x93130000u: // tye -> Latn
+        case 0x9F130000u: // tyh -> Latn
+        case 0xA3130000u: // tyi -> Latn
+        case 0xA7130000u: // tyj -> Latn
+        case 0xAF130000u: // tyl -> Latn
+        case 0xB7130000u: // tyn -> Latn
+        case 0xBF130000u: // typ -> Latn
+        case 0xCB130000u: // tys -> Latn
+        case 0xCF130000u: // tyt -> Latn
+        case 0xD3130000u: // tyu -> Latn
+        case 0xDF130000u: // tyx -> Latn
+        case 0xE3130000u: // tyy -> Latn
+        case 0xE7130000u: // tyz -> Latn
+        case 0x9F330000u: // tzh -> Latn
+        case 0xA7330000u: // tzj -> Latn
+        case 0xAF330000u: // tzl -> Latn
+        case 0xB3330000u: // tzm -> Latn
+        case 0xB7330000u: // tzn -> Latn
+        case 0xBB330000u: // tzo -> Latn
+        case 0xDF330000u: // tzx -> Latn
+        case 0xB0140000u: // uam -> Latn
+        case 0xC4140000u: // uar -> Latn
+        case 0x80340000u: // uba -> Latn
+        case 0xA0340000u: // ubi -> Latn
+        case 0xAC340000u: // ubl -> Latn
+        case 0xC4340000u: // ubr -> Latn
+        case 0xD0340000u: // ubu -> Latn
+        case 0xE0340000u: // uby -> Latn
+        case 0x80740000u: // uda -> Latn
+        case 0xA4740000u: // udj -> Latn
+        case 0xAC740000u: // udl -> Latn
+        case 0xD0740000u: // udu -> Latn
+        case 0xC8940000u: // ues -> Latn
+        case 0xA0B40000u: // ufi -> Latn
+        case 0x84D40000u: // ugb -> Latn
+        case 0x90D40000u: // uge -> Latn
+        case 0x80F40000u: // uha -> Latn
+        case 0xB4F40000u: // uhn -> Latn
+        case 0xC9140000u: // uis -> Latn
+        case 0xD5140000u: // uiv -> Latn
+        case 0xA1340000u: // uji -> Latn
+        case 0x81540000u: // uka -> Latn
+        case 0x99540000u: // ukg -> Latn
+        case 0x9D540000u: // ukh -> Latn
+        case 0xA9540000u: // ukk -> Latn
+        case 0xBD540000u: // ukp -> Latn
+        case 0xC1540000u: // ukq -> Latn
+        case 0xD1540000u: // uku -> Latn
+        case 0xD5540000u: // ukv -> Latn
+        case 0xD9540000u: // ukw -> Latn
+        case 0xE1540000u: // uky -> Latn
+        case 0x81740000u: // ula -> Latn
+        case 0x85740000u: // ulb -> Latn
+        case 0x91740000u: // ule -> Latn
+        case 0x95740000u: // ulf -> Latn
+        case 0xA1740000u: // uli -> Latn
+        case 0xA9740000u: // ulk -> Latn
+        case 0xB1740000u: // ulm -> Latn
+        case 0xB5740000u: // uln -> Latn
+        case 0xD1740000u: // ulu -> Latn
+        case 0xD9740000u: // ulw -> Latn
+        case 0xE1740000u: // uly -> Latn
+        case 0x81940000u: // uma -> Latn
+        case 0x85940000u: // umb -> Latn
+        case 0x8D940000u: // umd -> Latn
+        case 0x99940000u: // umg -> Latn
+        case 0xA1940000u: // umi -> Latn
+        case 0xB1940000u: // umm -> Latn
+        case 0xB5940000u: // umn -> Latn
+        case 0xB9940000u: // umo -> Latn
+        case 0xBD940000u: // ump -> Latn
+        case 0xC5940000u: // umr -> Latn
+        case 0xC9940000u: // ums -> Latn
+        case 0x81B40000u: // una -> Latn
+        case 0x91B40000u: // une -> Latn
+        case 0x99B40000u: // ung -> Latn
+        case 0xA1B40000u: // uni -> Latn
+        case 0xA9B40000u: // unk -> Latn
+        case 0xB1B40000u: // unm -> Latn
+        case 0xB5B40000u: // unn -> Latn
+        case 0xD1B40000u: // unu -> Latn
+        case 0xE5B40000u: // unz -> Latn
+        case 0xB5D40000u: // uon -> Latn
+        case 0xA1F40000u: // upi -> Latn
+        case 0xD5F40000u: // upv -> Latn
+        case 0x82340000u: // ura -> Latn
+        case 0x86340000u: // urb -> Latn
+        case 0x8A340000u: // urc -> Latn
+        case 0x92340000u: // ure -> Latn
+        case 0x96340000u: // urf -> Latn
+        case 0x9A340000u: // urg -> Latn
+        case 0x9E340000u: // urh -> Latn
+        case 0xA2340000u: // uri -> Latn
+        case 0xB2340000u: // urm -> Latn
+        case 0xB6340000u: // urn -> Latn
+        case 0xBA340000u: // uro -> Latn
+        case 0xBE340000u: // urp -> Latn
+        case 0xC6340000u: // urr -> Latn
+        case 0xCE340000u: // urt -> Latn
+        case 0xD2340000u: // uru -> Latn
+        case 0xD6340000u: // urv -> Latn
+        case 0xDA340000u: // urw -> Latn
+        case 0xDE340000u: // urx -> Latn
+        case 0xE2340000u: // ury -> Latn
+        case 0xE6340000u: // urz -> Latn
+        case 0x82540000u: // usa -> Latn
+        case 0xA2540000u: // usi -> Latn
+        case 0xAA540000u: // usk -> Latn
+        case 0xBE540000u: // usp -> Latn
+        case 0xCA540000u: // uss -> Latn
+        case 0xD2540000u: // usu -> Latn
+        case 0x82740000u: // uta -> Latn
+        case 0x92740000u: // ute -> Latn
+        case 0x9E740000u: // uth -> Latn
+        case 0xBE740000u: // utp -> Latn
+        case 0xC6740000u: // utr -> Latn
+        case 0xD2740000u: // utu -> Latn
+        case 0xC6940000u: // uur -> Latn
+        case 0x92B40000u: // uve -> Latn
+        case 0x9EB40000u: // uvh -> Latn
+        case 0xAEB40000u: // uvl -> Latn
+        case 0x82D40000u: // uwa -> Latn
+        case 0x83140000u: // uya -> Latn
+        case 0x757A0000u: // uz -> Latn
+        case 0x90150000u: // vae -> Latn
+        case 0x98150000u: // vag -> Latn
+        case 0xA4150000u: // vaj -> Latn
+        case 0xAC150000u: // val -> Latn
+        case 0xB0150000u: // vam -> Latn
+        case 0xB4150000u: // van -> Latn
+        case 0xB8150000u: // vao -> Latn
+        case 0xBC150000u: // vap -> Latn
+        case 0xC4150000u: // var -> Latn
+        case 0xD0150000u: // vau -> Latn
+        case 0x84350000u: // vbb -> Latn
+        case 0xA8350000u: // vbk -> Latn
+        case 0x76650000u: // ve -> Latn
+        case 0x88950000u: // vec -> Latn
+        case 0xB0950000u: // vem -> Latn
+        case 0xB8950000u: // veo -> Latn
+        case 0xBC950000u: // vep -> Latn
+        case 0xC4950000u: // ver -> Latn
+        case 0x76690000u: // vi -> Latn
+        case 0x89150000u: // vic -> Latn
+        case 0x8D150000u: // vid -> Latn
+        case 0x95150000u: // vif -> Latn
+        case 0x99150000u: // vig -> Latn
+        case 0xAD150000u: // vil -> Latn
+        case 0xB5150000u: // vin -> Latn
+        case 0xCD150000u: // vit -> Latn
+        case 0xD5150000u: // viv -> Latn
+        case 0x81550000u: // vka -> Latn
+        case 0xA5550000u: // vkj -> Latn
+        case 0xA9550000u: // vkk -> Latn
+        case 0xAD550000u: // vkl -> Latn
+        case 0xB1550000u: // vkm -> Latn
+        case 0xB5550000u: // vkn -> Latn
+        case 0xB9550000u: // vko -> Latn
+        case 0xBD550000u: // vkp -> Latn
+        case 0xCD550000u: // vkt -> Latn
+        case 0xD1550000u: // vku -> Latn
+        case 0xE5550000u: // vkz -> Latn
+        case 0xBD750000u: // vlp -> Latn
+        case 0xC9750000u: // vls -> Latn
+        case 0x81950000u: // vma -> Latn
+        case 0x85950000u: // vmb -> Latn
+        case 0x89950000u: // vmc -> Latn
+        case 0x91950000u: // vme -> Latn
+        case 0x95950000u: // vmf -> Latn
+        case 0x99950000u: // vmg -> Latn
+        case 0xA1950000u: // vmi -> Latn
+        case 0xA5950000u: // vmj -> Latn
+        case 0xA9950000u: // vmk -> Latn
+        case 0xAD950000u: // vml -> Latn
+        case 0xB1950000u: // vmm -> Latn
+        case 0xBD950000u: // vmp -> Latn
+        case 0xC1950000u: // vmq -> Latn
+        case 0xC5950000u: // vmr -> Latn
+        case 0xC9950000u: // vms -> Latn
+        case 0xD1950000u: // vmu -> Latn
+        case 0xD9950000u: // vmw -> Latn
+        case 0xDD950000u: // vmx -> Latn
+        case 0xE1950000u: // vmy -> Latn
+        case 0xE5950000u: // vmz -> Latn
+        case 0xA9B50000u: // vnk -> Latn
+        case 0xB1B50000u: // vnm -> Latn
+        case 0xBDB50000u: // vnp -> Latn
+        case 0x766F0000u: // vo -> Latn
+        case 0xC5D50000u: // vor -> Latn
+        case 0xCDD50000u: // vot -> Latn
+        case 0x82350000u: // vra -> Latn
+        case 0xBA350000u: // vro -> Latn
+        case 0xCA350000u: // vrs -> Latn
+        case 0xCE350000u: // vrt -> Latn
+        case 0xBA750000u: // vto -> Latn
+        case 0xB2950000u: // vum -> Latn
+        case 0xB6950000u: // vun -> Latn
+        case 0xCE950000u: // vut -> Latn
+        case 0x82D50000u: // vwa -> Latn
+        case 0x77610000u: // wa -> Latn
+        case 0x80160000u: // waa -> Latn
+        case 0x84160000u: // wab -> Latn
+        case 0x88160000u: // wac -> Latn
+        case 0x8C160000u: // wad -> Latn
+        case 0x90160000u: // wae -> Latn
+        case 0x94160000u: // waf -> Latn
+        case 0x98160000u: // wag -> Latn
+        case 0x9C160000u: // wah -> Latn
+        case 0xA0160000u: // wai -> Latn
+        case 0xA4160000u: // waj -> Latn
+        case 0xB0160000u: // wam -> Latn
+        case 0xB4160000u: // wan -> Latn
+        case 0xBC160000u: // wap -> Latn
+        case 0xC0160000u: // waq -> Latn
+        case 0xC4160000u: // war -> Latn
+        case 0xC8160000u: // was -> Latn
+        case 0xCC160000u: // wat -> Latn
+        case 0xD0160000u: // wau -> Latn
+        case 0xD4160000u: // wav -> Latn
+        case 0xD8160000u: // waw -> Latn
+        case 0xDC160000u: // wax -> Latn
+        case 0xE0160000u: // way -> Latn
+        case 0xE4160000u: // waz -> Latn
+        case 0x80360000u: // wba -> Latn
+        case 0x84360000u: // wbb -> Latn
+        case 0x90360000u: // wbe -> Latn
+        case 0x94360000u: // wbf -> Latn
+        case 0x9C360000u: // wbh -> Latn
+        case 0xA0360000u: // wbi -> Latn
+        case 0xA4360000u: // wbj -> Latn
+        case 0xAC360000u: // wbl -> Latn
+        case 0xB0360000u: // wbm -> Latn
+        case 0xBC360000u: // wbp -> Latn
+        case 0xCC360000u: // wbt -> Latn
+        case 0xD4360000u: // wbv -> Latn
+        case 0xD8360000u: // wbw -> Latn
+        case 0x80560000u: // wca -> Latn
+        case 0xA0560000u: // wci -> Latn
+        case 0x8C760000u: // wdd -> Latn
+        case 0x98760000u: // wdg -> Latn
+        case 0xA4760000u: // wdj -> Latn
+        case 0xA8760000u: // wdk -> Latn
+        case 0xCC760000u: // wdt -> Latn
+        case 0xD0760000u: // wdu -> Latn
+        case 0xE0760000u: // wdy -> Latn
+        case 0x88960000u: // wec -> Latn
+        case 0x8C960000u: // wed -> Latn
+        case 0x98960000u: // weg -> Latn
+        case 0x9C960000u: // weh -> Latn
+        case 0xA0960000u: // wei -> Latn
+        case 0xB0960000u: // wem -> Latn
+        case 0xB8960000u: // weo -> Latn
+        case 0xBC960000u: // wep -> Latn
+        case 0xC4960000u: // wer -> Latn
+        case 0xC8960000u: // wes -> Latn
+        case 0xCC960000u: // wet -> Latn
+        case 0xD0960000u: // weu -> Latn
+        case 0xD8960000u: // wew -> Latn
+        case 0x98B60000u: // wfg -> Latn
+        case 0x80D60000u: // wga -> Latn
+        case 0x84D60000u: // wgb -> Latn
+        case 0x98D60000u: // wgg -> Latn
+        case 0xA0D60000u: // wgi -> Latn
+        case 0xB8D60000u: // wgo -> Latn
+        case 0xD0D60000u: // wgu -> Latn
+        case 0xE0D60000u: // wgy -> Latn
+        case 0x80F60000u: // wha -> Latn
+        case 0x98F60000u: // whg -> Latn
+        case 0xA8F60000u: // whk -> Latn
+        case 0xD0F60000u: // whu -> Latn
+        case 0x85160000u: // wib -> Latn
+        case 0x89160000u: // wic -> Latn
+        case 0x91160000u: // wie -> Latn
+        case 0x95160000u: // wif -> Latn
+        case 0x99160000u: // wig -> Latn
+        case 0x9D160000u: // wih -> Latn
+        case 0xA1160000u: // wii -> Latn
+        case 0xA5160000u: // wij -> Latn
+        case 0xA9160000u: // wik -> Latn
+        case 0xAD160000u: // wil -> Latn
+        case 0xB1160000u: // wim -> Latn
+        case 0xB5160000u: // win -> Latn
+        case 0xC5160000u: // wir -> Latn
+        case 0xD1160000u: // wiu -> Latn
+        case 0xD5160000u: // wiv -> Latn
+        case 0xE1160000u: // wiy -> Latn
+        case 0x81360000u: // wja -> Latn
+        case 0xA1360000u: // wji -> Latn
+        case 0x81560000u: // wka -> Latn
+        case 0x8D560000u: // wkd -> Latn
+        case 0xC5560000u: // wkr -> Latn
+        case 0xD9560000u: // wkw -> Latn
+        case 0xE1560000u: // wky -> Latn
+        case 0x81760000u: // wla -> Latn
+        case 0x99760000u: // wlg -> Latn
+        case 0x9D760000u: // wlh -> Latn
+        case 0xA1760000u: // wli -> Latn
+        case 0xB1760000u: // wlm -> Latn
+        case 0xC5760000u: // wlr -> Latn
+        case 0xC9760000u: // wls -> Latn
+        case 0xD1760000u: // wlu -> Latn
+        case 0xD5760000u: // wlv -> Latn
+        case 0xD9760000u: // wlw -> Latn
+        case 0xDD760000u: // wlx -> Latn
+        case 0x81960000u: // wma -> Latn
+        case 0x85960000u: // wmb -> Latn
+        case 0x89960000u: // wmc -> Latn
+        case 0x8D960000u: // wmd -> Latn
+        case 0x9D960000u: // wmh -> Latn
+        case 0xA1960000u: // wmi -> Latn
+        case 0xB1960000u: // wmm -> Latn
+        case 0xB5960000u: // wmn -> Latn
+        case 0xB9960000u: // wmo -> Latn
+        case 0xC9960000u: // wms -> Latn
+        case 0xCD960000u: // wmt -> Latn
+        case 0xD9960000u: // wmw -> Latn
+        case 0xDD960000u: // wmx -> Latn
+        case 0x85B60000u: // wnb -> Latn
+        case 0x89B60000u: // wnc -> Latn
+        case 0x8DB60000u: // wnd -> Latn
+        case 0x99B60000u: // wng -> Latn
+        case 0xA9B60000u: // wnk -> Latn
+        case 0xB1B60000u: // wnm -> Latn
+        case 0xB5B60000u: // wnn -> Latn
+        case 0xB9B60000u: // wno -> Latn
+        case 0xBDB60000u: // wnp -> Latn
+        case 0xD1B60000u: // wnu -> Latn
+        case 0xD9B60000u: // wnw -> Latn
+        case 0xE1B60000u: // wny -> Latn
+        case 0x776F0000u: // wo -> Latn
+        case 0x81D60000u: // woa -> Latn
+        case 0x85D60000u: // wob -> Latn
+        case 0x89D60000u: // woc -> Latn
+        case 0x8DD60000u: // wod -> Latn
+        case 0x91D60000u: // woe -> Latn
+        case 0x95D60000u: // wof -> Latn
+        case 0x99D60000u: // wog -> Latn
+        case 0xA1D60000u: // woi -> Latn
+        case 0xA9D60000u: // wok -> Latn
+        case 0xB1D60000u: // wom -> Latn
+        case 0xB5D60000u: // won -> Latn
+        case 0xB9D60000u: // woo -> Latn
+        case 0xC5D60000u: // wor -> Latn
+        case 0xC9D60000u: // wos -> Latn
+        case 0xD9D60000u: // wow -> Latn
+        case 0x89F60000u: // wpc -> Latn
+        case 0x86360000u: // wrb -> Latn
+        case 0x9A360000u: // wrg -> Latn
+        case 0x9E360000u: // wrh -> Latn
+        case 0xA2360000u: // wri -> Latn
+        case 0xAA360000u: // wrk -> Latn
+        case 0xAE360000u: // wrl -> Latn
+        case 0xB2360000u: // wrm -> Latn
+        case 0xBA360000u: // wro -> Latn
+        case 0xBE360000u: // wrp -> Latn
+        case 0xC6360000u: // wrr -> Latn
+        case 0xCA360000u: // wrs -> Latn
+        case 0xD2360000u: // wru -> Latn
+        case 0xD6360000u: // wrv -> Latn
+        case 0xDA360000u: // wrw -> Latn
+        case 0xDE360000u: // wrx -> Latn
+        case 0xE6360000u: // wrz -> Latn
+        case 0x82560000u: // wsa -> Latn
+        case 0xA2560000u: // wsi -> Latn
+        case 0xAA560000u: // wsk -> Latn
+        case 0xC6560000u: // wsr -> Latn
+        case 0xCA560000u: // wss -> Latn
+        case 0xD2560000u: // wsu -> Latn
+        case 0x86760000u: // wtb -> Latn
+        case 0x96760000u: // wtf -> Latn
+        case 0x9E760000u: // wth -> Latn
+        case 0xA2760000u: // wti -> Latn
+        case 0xAA760000u: // wtk -> Latn
+        case 0xDA760000u: // wtw -> Latn
+        case 0x82960000u: // wua -> Latn
+        case 0x86960000u: // wub -> Latn
+        case 0x8E960000u: // wud -> Latn
+        case 0xAE960000u: // wul -> Latn
+        case 0xB2960000u: // wum -> Latn
+        case 0xB6960000u: // wun -> Latn
+        case 0xC6960000u: // wur -> Latn
+        case 0xCE960000u: // wut -> Latn
+        case 0xD6960000u: // wuv -> Latn
+        case 0xDE960000u: // wux -> Latn
+        case 0xE2960000u: // wuy -> Latn
+        case 0x82D60000u: // wwa -> Latn
+        case 0x86D60000u: // wwb -> Latn
+        case 0xBAD60000u: // wwo -> Latn
+        case 0xC6D60000u: // wwr -> Latn
+        case 0xDAD60000u: // www -> Latn
+        case 0xDAF60000u: // wxw -> Latn
+        case 0x87160000u: // wyb -> Latn
+        case 0xA3160000u: // wyi -> Latn
+        case 0xB3160000u: // wym -> Latn
+        case 0xB7160000u: // wyn -> Latn
+        case 0xC7160000u: // wyr -> Latn
+        case 0xE3160000u: // wyy -> Latn
+        case 0x80170000u: // xaa -> Latn
+        case 0x84170000u: // xab -> Latn
+        case 0xA0170000u: // xai -> Latn
+        case 0xA4170000u: // xaj -> Latn
+        case 0xA8170000u: // xak -> Latn
+        case 0xB0170000u: // xam -> Latn
+        case 0xB8170000u: // xao -> Latn
+        case 0xC4170000u: // xar -> Latn
+        case 0xCC170000u: // xat -> Latn
+        case 0xD0170000u: // xau -> Latn
+        case 0xD4170000u: // xav -> Latn
+        case 0xD8170000u: // xaw -> Latn
+        case 0xE0170000u: // xay -> Latn
+        case 0x84370000u: // xbb -> Latn
+        case 0x8C370000u: // xbd -> Latn
+        case 0x90370000u: // xbe -> Latn
+        case 0x98370000u: // xbg -> Latn
+        case 0xA0370000u: // xbi -> Latn
+        case 0xA4370000u: // xbj -> Latn
+        case 0xB0370000u: // xbm -> Latn
+        case 0xB4370000u: // xbn -> Latn
+        case 0xBC370000u: // xbp -> Latn
+        case 0xC4370000u: // xbr -> Latn
+        case 0xD8370000u: // xbw -> Latn
+        case 0xE0370000u: // xby -> Latn
+        case 0x9C570000u: // xch -> Latn
+        case 0x80770000u: // xda -> Latn
+        case 0xA8770000u: // xdk -> Latn
+        case 0xB8770000u: // xdo -> Latn
+        case 0xE0770000u: // xdy -> Latn
+        case 0x8C970000u: // xed -> Latn
+        case 0x98970000u: // xeg -> Latn
+        case 0xB0970000u: // xem -> Latn
+        case 0xC4970000u: // xer -> Latn
+        case 0xC8970000u: // xes -> Latn
+        case 0xCC970000u: // xet -> Latn
+        case 0xD0970000u: // xeu -> Latn
+        case 0x84D70000u: // xgb -> Latn
+        case 0x8CD70000u: // xgd -> Latn
+        case 0x98D70000u: // xgg -> Latn
+        case 0xA0D70000u: // xgi -> Latn
+        case 0xB0D70000u: // xgm -> Latn
+        case 0xD0D70000u: // xgu -> Latn
+        case 0xD8D70000u: // xgw -> Latn
+        case 0x78680000u: // xh -> Latn
+        case 0xD4F70000u: // xhv -> Latn
+        case 0xA1170000u: // xii -> Latn
+        case 0xB5170000u: // xin -> Latn
+        case 0xC5170000u: // xir -> Latn
+        case 0xE1170000u: // xiy -> Latn
+        case 0x85370000u: // xjb -> Latn
+        case 0xCD370000u: // xjt -> Latn
+        case 0x85570000u: // xkb -> Latn
+        case 0x8D570000u: // xkd -> Latn
+        case 0x91570000u: // xke -> Latn
+        case 0x99570000u: // xkg -> Latn
+        case 0xAD570000u: // xkl -> Latn
+        case 0xB5570000u: // xkn -> Latn
+        case 0xC1570000u: // xkq -> Latn
+        case 0xC5570000u: // xkr -> Latn
+        case 0xC9570000u: // xks -> Latn
+        case 0xCD570000u: // xkt -> Latn
+        case 0xD1570000u: // xku -> Latn
+        case 0xD5570000u: // xkv -> Latn
+        case 0xD9570000u: // xkw -> Latn
+        case 0xDD570000u: // xkx -> Latn
+        case 0xE1570000u: // xky -> Latn
+        case 0xE5570000u: // xkz -> Latn
+        case 0x81770000u: // xla -> Latn
+        case 0x81970000u: // xma -> Latn
+        case 0x85970000u: // xmb -> Latn
+        case 0x89970000u: // xmc -> Latn
+        case 0x8D970000u: // xmd -> Latn
+        case 0x99970000u: // xmg -> Latn
+        case 0x9D970000u: // xmh -> Latn
+        case 0xA5970000u: // xmj -> Latn
+        case 0xB1970000u: // xmm -> Latn
+        case 0xB9970000u: // xmo -> Latn
+        case 0xBD970000u: // xmp -> Latn
+        case 0xC1970000u: // xmq -> Latn
+        case 0xCD970000u: // xmt -> Latn
+        case 0xD1970000u: // xmu -> Latn
+        case 0xD5970000u: // xmv -> Latn
+        case 0xD9970000u: // xmw -> Latn
+        case 0xDD970000u: // xmx -> Latn
+        case 0xE1970000u: // xmy -> Latn
+        case 0xE5970000u: // xmz -> Latn
+        case 0x85B70000u: // xnb -> Latn
+        case 0xA1B70000u: // xni -> Latn
+        case 0xA5B70000u: // xnj -> Latn
+        case 0xA9B70000u: // xnk -> Latn
+        case 0xB1B70000u: // xnm -> Latn
+        case 0xB5B70000u: // xnn -> Latn
+        case 0xC1B70000u: // xnq -> Latn
+        case 0xCDB70000u: // xnt -> Latn
+        case 0xD1B70000u: // xnu -> Latn
+        case 0xE1B70000u: // xny -> Latn
+        case 0xE5B70000u: // xnz -> Latn
+        case 0x89D70000u: // xoc -> Latn
+        case 0x8DD70000u: // xod -> Latn
+        case 0x99D70000u: // xog -> Latn
+        case 0xA1D70000u: // xoi -> Latn
+        case 0xA9D70000u: // xok -> Latn
+        case 0xB1D70000u: // xom -> Latn
+        case 0xB5D70000u: // xon -> Latn
+        case 0xB9D70000u: // xoo -> Latn
+        case 0xBDD70000u: // xop -> Latn
+        case 0xC5D70000u: // xor -> Latn
+        case 0xD9D70000u: // xow -> Latn
+        case 0x81F70000u: // xpa -> Latn
+        case 0x85F70000u: // xpb -> Latn
+        case 0x8DF70000u: // xpd -> Latn
+        case 0x95F70000u: // xpf -> Latn
+        case 0x9DF70000u: // xph -> Latn
+        case 0xA5F70000u: // xpj -> Latn
+        case 0xA9F70000u: // xpk -> Latn
+        case 0xADF70000u: // xpl -> Latn
+        case 0xB5F70000u: // xpn -> Latn
+        case 0xB9F70000u: // xpo -> Latn
+        case 0xC1F70000u: // xpq -> Latn
+        case 0xCDF70000u: // xpt -> Latn
+        case 0xD5F70000u: // xpv -> Latn
+        case 0xD9F70000u: // xpw -> Latn
+        case 0xDDF70000u: // xpx -> Latn
+        case 0xE5F70000u: // xpz -> Latn
+        case 0x82370000u: // xra -> Latn
+        case 0x86370000u: // xrb -> Latn
+        case 0x8E370000u: // xrd -> Latn
+        case 0x92370000u: // xre -> Latn
+        case 0x9A370000u: // xrg -> Latn
+        case 0xA2370000u: // xri -> Latn
+        case 0xC6370000u: // xrr -> Latn
+        case 0xD2370000u: // xru -> Latn
+        case 0xDA370000u: // xrw -> Latn
+        case 0x86570000u: // xsb -> Latn
+        case 0x92570000u: // xse -> Latn
+        case 0x9E570000u: // xsh -> Latn
+        case 0xA2570000u: // xsi -> Latn
+        case 0xB2570000u: // xsm -> Latn
+        case 0xB6570000u: // xsn -> Latn
+        case 0xBE570000u: // xsp -> Latn
+        case 0xC2570000u: // xsq -> Latn
+        case 0xD2570000u: // xsu -> Latn
+        case 0xE2570000u: // xsy -> Latn
+        case 0x82770000u: // xta -> Latn
+        case 0x86770000u: // xtb -> Latn
+        case 0x8A770000u: // xtc -> Latn
+        case 0x8E770000u: // xtd -> Latn
+        case 0x92770000u: // xte -> Latn
+        case 0x9E770000u: // xth -> Latn
+        case 0xA2770000u: // xti -> Latn
+        case 0xA6770000u: // xtj -> Latn
+        case 0xAE770000u: // xtl -> Latn
+        case 0xB2770000u: // xtm -> Latn
+        case 0xB6770000u: // xtn -> Latn
+        case 0xBE770000u: // xtp -> Latn
+        case 0xCA770000u: // xts -> Latn
+        case 0xCE770000u: // xtt -> Latn
+        case 0xD2770000u: // xtu -> Latn
+        case 0xD6770000u: // xtv -> Latn
+        case 0xDA770000u: // xtw -> Latn
+        case 0xE2770000u: // xty -> Latn
+        case 0x8E970000u: // xud -> Latn
+        case 0xAE970000u: // xul -> Latn
+        case 0xB2970000u: // xum -> Latn
+        case 0xB6970000u: // xun -> Latn
+        case 0xBA970000u: // xuo -> Latn
+        case 0xCE970000u: // xut -> Latn
+        case 0xD2970000u: // xuu -> Latn
+        case 0xB6B70000u: // xvn -> Latn
+        case 0xBAB70000u: // xvo -> Latn
+        case 0xCAB70000u: // xvs -> Latn
+        case 0x82D70000u: // xwa -> Latn
+        case 0x8ED70000u: // xwd -> Latn
+        case 0x92D70000u: // xwe -> Latn
+        case 0xA6D70000u: // xwj -> Latn
+        case 0xAAD70000u: // xwk -> Latn
+        case 0xAED70000u: // xwl -> Latn
+        case 0xC6D70000u: // xwr -> Latn
+        case 0xCED70000u: // xwt -> Latn
+        case 0xDAD70000u: // xww -> Latn
+        case 0x86F70000u: // xxb -> Latn
+        case 0xAAF70000u: // xxk -> Latn
+        case 0xB2F70000u: // xxm -> Latn
+        case 0xC6F70000u: // xxr -> Latn
+        case 0xCEF70000u: // xxt -> Latn
+        case 0x83170000u: // xya -> Latn
+        case 0x87170000u: // xyb -> Latn
+        case 0xA7170000u: // xyj -> Latn
+        case 0xAB170000u: // xyk -> Latn
+        case 0xAF170000u: // xyl -> Latn
+        case 0xCF170000u: // xyt -> Latn
+        case 0xE3170000u: // xyy -> Latn
+        case 0xBF370000u: // xzp -> Latn
+        case 0x80180000u: // yaa -> Latn
+        case 0x84180000u: // yab -> Latn
+        case 0x88180000u: // yac -> Latn
+        case 0x8C180000u: // yad -> Latn
+        case 0x90180000u: // yae -> Latn
+        case 0x94180000u: // yaf -> Latn
+        case 0x98180000u: // yag -> Latn
+        case 0x9C180000u: // yah -> Latn
+        case 0xA4180000u: // yaj -> Latn
+        case 0xA8180000u: // yak -> Latn
+        case 0xAC180000u: // yal -> Latn
+        case 0xB0180000u: // yam -> Latn
+        case 0xB4180000u: // yan -> Latn
+        case 0xB8180000u: // yao -> Latn
+        case 0xBC180000u: // yap -> Latn
+        case 0xC0180000u: // yaq -> Latn
+        case 0xC4180000u: // yar -> Latn
+        case 0xC8180000u: // yas -> Latn
+        case 0xCC180000u: // yat -> Latn
+        case 0xD0180000u: // yau -> Latn
+        case 0xD4180000u: // yav -> Latn
+        case 0xD8180000u: // yaw -> Latn
+        case 0xDC180000u: // yax -> Latn
+        case 0xE0180000u: // yay -> Latn
+        case 0xE4180000u: // yaz -> Latn
+        case 0x80380000u: // yba -> Latn
+        case 0x84380000u: // ybb -> Latn
+        case 0x90380000u: // ybe -> Latn
+        case 0xA4380000u: // ybj -> Latn
+        case 0xAC380000u: // ybl -> Latn
+        case 0xB0380000u: // ybm -> Latn
+        case 0xB4380000u: // ybn -> Latn
+        case 0xB8380000u: // ybo -> Latn
+        case 0xDC380000u: // ybx -> Latn
+        case 0xE0380000u: // yby -> Latn
+        case 0xAC580000u: // ycl -> Latn
+        case 0xB4580000u: // ycn -> Latn
+        case 0xC4580000u: // ycr -> Latn
+        case 0x80780000u: // yda -> Latn
+        case 0x90780000u: // yde -> Latn
+        case 0xA8780000u: // ydk -> Latn
+        case 0x88980000u: // yec -> Latn
+        case 0x90980000u: // yee -> Latn
+        case 0xA0980000u: // yei -> Latn
+        case 0xAC980000u: // yel -> Latn
+        case 0xC4980000u: // yer -> Latn
+        case 0xC8980000u: // yes -> Latn
+        case 0xCC980000u: // yet -> Latn
+        case 0xD4980000u: // yev -> Latn
+        case 0xE0980000u: // yey -> Latn
+        case 0x80D80000u: // yga -> Latn
+        case 0xA0D80000u: // ygi -> Latn
+        case 0xACD80000u: // ygl -> Latn
+        case 0xB0D80000u: // ygm -> Latn
+        case 0xC4D80000u: // ygr -> Latn
+        case 0xD0D80000u: // ygu -> Latn
+        case 0xD8D80000u: // ygw -> Latn
+        case 0x81180000u: // yia -> Latn
+        case 0xA1180000u: // yii -> Latn
+        case 0xA5180000u: // yij -> Latn
+        case 0xAD180000u: // yil -> Latn
+        case 0xB1180000u: // yim -> Latn
+        case 0xC5180000u: // yir -> Latn
+        case 0xC9180000u: // yis -> Latn
+        case 0x81580000u: // yka -> Latn
+        case 0xA1580000u: // yki -> Latn
+        case 0xA9580000u: // ykk -> Latn
+        case 0xB1580000u: // ykm -> Latn
+        case 0xB9580000u: // yko -> Latn
+        case 0xC5580000u: // ykr -> Latn
+        case 0xE1580000u: // yky -> Latn
+        case 0x81780000u: // yla -> Latn
+        case 0x85780000u: // ylb -> Latn
+        case 0x91780000u: // yle -> Latn
+        case 0x99780000u: // ylg -> Latn
+        case 0xA1780000u: // yli -> Latn
+        case 0xAD780000u: // yll -> Latn
+        case 0xC5780000u: // ylr -> Latn
+        case 0xD1780000u: // ylu -> Latn
+        case 0xE1780000u: // yly -> Latn
+        case 0x85980000u: // ymb -> Latn
+        case 0x91980000u: // yme -> Latn
+        case 0x99980000u: // ymg -> Latn
+        case 0xA9980000u: // ymk -> Latn
+        case 0xAD980000u: // yml -> Latn
+        case 0xB1980000u: // ymm -> Latn
+        case 0xB5980000u: // ymn -> Latn
+        case 0xB9980000u: // ymo -> Latn
+        case 0xBD980000u: // ymp -> Latn
+        case 0x8DB80000u: // ynd -> Latn
+        case 0x99B80000u: // yng -> Latn
+        case 0xADB80000u: // ynl -> Latn
+        case 0xC1B80000u: // ynq -> Latn
+        case 0xC9B80000u: // yns -> Latn
+        case 0xD1B80000u: // ynu -> Latn
+        case 0x796F0000u: // yo -> Latn
+        case 0x85D80000u: // yob -> Latn
+        case 0x99D80000u: // yog -> Latn
+        case 0xA9D80000u: // yok -> Latn
+        case 0xADD80000u: // yol -> Latn
+        case 0xB1D80000u: // yom -> Latn
+        case 0xB5D80000u: // yon -> Latn
+        case 0xCDD80000u: // yot -> Latn
+        case 0x82380000u: // yra -> Latn
+        case 0x86380000u: // yrb -> Latn
+        case 0x92380000u: // yre -> Latn
+        case 0xAE380000u: // yrl -> Latn
+        case 0xB2380000u: // yrm -> Latn
+        case 0xBA380000u: // yro -> Latn
+        case 0xCA380000u: // yrs -> Latn
+        case 0xDA380000u: // yrw -> Latn
+        case 0xE2380000u: // yry -> Latn
+        case 0xCA580000u: // yss -> Latn
+        case 0xDA780000u: // ytw -> Latn
+        case 0xE2780000u: // yty -> Latn
+        case 0x82980000u: // yua -> Latn
+        case 0x86980000u: // yub -> Latn
+        case 0x8A980000u: // yuc -> Latn
+        case 0x96980000u: // yuf -> Latn
+        case 0xA2980000u: // yui -> Latn
+        case 0xA6980000u: // yuj -> Latn
+        case 0xAE980000u: // yul -> Latn
+        case 0xB2980000u: // yum -> Latn
+        case 0xB6980000u: // yun -> Latn
+        case 0xBE980000u: // yup -> Latn
+        case 0xC2980000u: // yuq -> Latn
+        case 0xC6980000u: // yur -> Latn
+        case 0xCE980000u: // yut -> Latn
+        case 0xDA980000u: // yuw -> Latn
+        case 0xE6980000u: // yuz -> Latn
+        case 0x82B80000u: // yva -> Latn
+        case 0xCEB80000u: // yvt -> Latn
+        case 0x82D80000u: // ywa -> Latn
+        case 0x9AD80000u: // ywg -> Latn
+        case 0xB6D80000u: // ywn -> Latn
+        case 0xC6D80000u: // ywr -> Latn
+        case 0xDAD80000u: // yww -> Latn
+        case 0x82F80000u: // yxa -> Latn
+        case 0x9AF80000u: // yxg -> Latn
+        case 0xAEF80000u: // yxl -> Latn
+        case 0xB2F80000u: // yxm -> Latn
+        case 0xD2F80000u: // yxu -> Latn
+        case 0xE2F80000u: // yxy -> Latn
+        case 0xC7180000u: // yyr -> Latn
+        case 0xD3180000u: // yyu -> Latn
+        case 0x7A610000u: // za -> Latn
+        case 0x80190000u: // zaa -> Latn
+        case 0x84190000u: // zab -> Latn
+        case 0x88190000u: // zac -> Latn
+        case 0x8C190000u: // zad -> Latn
+        case 0x90190000u: // zae -> Latn
+        case 0x94190000u: // zaf -> Latn
+        case 0x98190000u: // zag -> Latn
+        case 0x9C190000u: // zah -> Latn
+        case 0xA4190000u: // zaj -> Latn
+        case 0xA8190000u: // zak -> Latn
+        case 0xB0190000u: // zam -> Latn
+        case 0xB8190000u: // zao -> Latn
+        case 0xBC190000u: // zap -> Latn
+        case 0xC0190000u: // zaq -> Latn
+        case 0xC4190000u: // zar -> Latn
+        case 0xC8190000u: // zas -> Latn
+        case 0xCC190000u: // zat -> Latn
+        case 0xD4190000u: // zav -> Latn
+        case 0xD8190000u: // zaw -> Latn
+        case 0xDC190000u: // zax -> Latn
+        case 0xE0190000u: // zay -> Latn
+        case 0xE4190000u: // zaz -> Latn
+        case 0x88390000u: // zbc -> Latn
+        case 0x90390000u: // zbe -> Latn
+        case 0xCC390000u: // zbt -> Latn
+        case 0xD0390000u: // zbu -> Latn
+        case 0xD8390000u: // zbw -> Latn
+        case 0x80590000u: // zca -> Latn
+        case 0x80990000u: // zea -> Latn
+        case 0x98990000u: // zeg -> Latn
+        case 0xB0990000u: // zem -> Latn
+        case 0x80D90000u: // zga -> Latn
+        case 0xC4D90000u: // zgr -> Latn
+        case 0xA0F90000u: // zhi -> Latn
+        case 0xB4F90000u: // zhn -> Latn
+        case 0xD8F90000u: // zhw -> Latn
+        case 0x81190000u: // zia -> Latn
+        case 0xA9190000u: // zik -> Latn
+        case 0xAD190000u: // zil -> Latn
+        case 0xB1190000u: // zim -> Latn
+        case 0xB5190000u: // zin -> Latn
+        case 0xD9190000u: // ziw -> Latn
+        case 0xE5190000u: // ziz -> Latn
+        case 0x81590000u: // zka -> Latn
+        case 0x8D590000u: // zkd -> Latn
+        case 0xBD590000u: // zkp -> Latn
+        case 0xD1590000u: // zku -> Latn
+        case 0x81790000u: // zla -> Latn
+        case 0xB1790000u: // zlm -> Latn
+        case 0xD1790000u: // zlu -> Latn
+        case 0x81990000u: // zma -> Latn
+        case 0x85990000u: // zmb -> Latn
+        case 0x89990000u: // zmc -> Latn
+        case 0x8D990000u: // zmd -> Latn
+        case 0x91990000u: // zme -> Latn
+        case 0x95990000u: // zmf -> Latn
+        case 0x99990000u: // zmg -> Latn
+        case 0x9D990000u: // zmh -> Latn
+        case 0xA1990000u: // zmi -> Latn
+        case 0xA5990000u: // zmj -> Latn
+        case 0xA9990000u: // zmk -> Latn
+        case 0xAD990000u: // zml -> Latn
+        case 0xB1990000u: // zmm -> Latn
+        case 0xB5990000u: // zmn -> Latn
+        case 0xB9990000u: // zmo -> Latn
+        case 0xBD990000u: // zmp -> Latn
+        case 0xC1990000u: // zmq -> Latn
+        case 0xC5990000u: // zmr -> Latn
+        case 0xC9990000u: // zms -> Latn
+        case 0xCD990000u: // zmt -> Latn
+        case 0xD1990000u: // zmu -> Latn
+        case 0xD5990000u: // zmv -> Latn
+        case 0xD9990000u: // zmw -> Latn
+        case 0xDD990000u: // zmx -> Latn
+        case 0xE1990000u: // zmy -> Latn
+        case 0xE5990000u: // zmz -> Latn
+        case 0x81B90000u: // zna -> Latn
+        case 0x91B90000u: // zne -> Latn
+        case 0x99B90000u: // zng -> Latn
+        case 0xA9B90000u: // znk -> Latn
+        case 0xC9B90000u: // zns -> Latn
+        case 0x89D90000u: // zoc -> Latn
+        case 0x9DD90000u: // zoh -> Latn
+        case 0xB1D90000u: // zom -> Latn
+        case 0xB9D90000u: // zoo -> Latn
+        case 0xC1D90000u: // zoq -> Latn
+        case 0xC5D90000u: // zor -> Latn
+        case 0xC9D90000u: // zos -> Latn
+        case 0x81F90000u: // zpa -> Latn
+        case 0x85F90000u: // zpb -> Latn
+        case 0x89F90000u: // zpc -> Latn
+        case 0x8DF90000u: // zpd -> Latn
+        case 0x91F90000u: // zpe -> Latn
+        case 0x95F90000u: // zpf -> Latn
+        case 0x99F90000u: // zpg -> Latn
+        case 0x9DF90000u: // zph -> Latn
+        case 0xA1F90000u: // zpi -> Latn
+        case 0xA5F90000u: // zpj -> Latn
+        case 0xA9F90000u: // zpk -> Latn
+        case 0xADF90000u: // zpl -> Latn
+        case 0xB1F90000u: // zpm -> Latn
+        case 0xB5F90000u: // zpn -> Latn
+        case 0xB9F90000u: // zpo -> Latn
+        case 0xBDF90000u: // zpp -> Latn
+        case 0xC1F90000u: // zpq -> Latn
+        case 0xC5F90000u: // zpr -> Latn
+        case 0xC9F90000u: // zps -> Latn
+        case 0xCDF90000u: // zpt -> Latn
+        case 0xD1F90000u: // zpu -> Latn
+        case 0xD5F90000u: // zpv -> Latn
+        case 0xD9F90000u: // zpw -> Latn
+        case 0xDDF90000u: // zpx -> Latn
+        case 0xE1F90000u: // zpy -> Latn
+        case 0xE5F90000u: // zpz -> Latn
+        case 0xB6390000u: // zrn -> Latn
+        case 0xBA390000u: // zro -> Latn
+        case 0xCA390000u: // zrs -> Latn
+        case 0x82590000u: // zsa -> Latn
+        case 0xC6590000u: // zsr -> Latn
+        case 0xD2590000u: // zsu -> Latn
+        case 0x92790000u: // zte -> Latn
+        case 0x9A790000u: // ztg -> Latn
+        case 0xAE790000u: // ztl -> Latn
+        case 0xB2790000u: // ztm -> Latn
+        case 0xB6790000u: // ztn -> Latn
+        case 0xBE790000u: // ztp -> Latn
+        case 0xC2790000u: // ztq -> Latn
+        case 0xCA790000u: // zts -> Latn
+        case 0xCE790000u: // ztt -> Latn
+        case 0xD2790000u: // ztu -> Latn
+        case 0xDE790000u: // ztx -> Latn
+        case 0xE2790000u: // zty -> Latn
+        case 0x7A750000u: // zu -> Latn
+        case 0x9E990000u: // zuh -> Latn
+        case 0xB6990000u: // zun -> Latn
+        case 0xE2990000u: // zuy -> Latn
+        case 0xA7190000u: // zyj -> Latn
+        case 0xBF190000u: // zyp -> Latn
+        case 0x83390000u: // zza -> Latn
+            return SCRIPT_CODES[55u];
+        case 0xBC8B0000u: // lep -> Lepc
+            return SCRIPT_CODES[56u];
+        case 0x840B0000u: // lab -> Lina
+            return SCRIPT_CODES[57u];
+        case 0xE1860000u: // gmy -> Linb
+            return SCRIPT_CODES[58u];
+        case 0xC90B0000u: // lis -> Lisu
+            return SCRIPT_CODES[59u];
+        case 0xE1880000u: // imy -> Lyci
+        case 0x89770000u: // xlc -> Lyci
+            return SCRIPT_CODES[60u];
+        case 0x8D770000u: // xld -> Lydi
+            return SCRIPT_CODES[61u];
+        case 0x8D0C0000u: // mid -> Mand
+        case 0xE70C0000u: // myz -> Mand
+            return SCRIPT_CODES[62u];
+        case 0xB5970000u: // xmn -> Mani
+            return SCRIPT_CODES[63u];
+        case 0x9F370000u: // xzh -> Marc
+            return SCRIPT_CODES[64u];
+        case 0x95830000u: // dmf -> Medf
+            return SCRIPT_CODES[65u];
+        case 0xC5970000u: // xmr -> Merc
+            return SCRIPT_CODES[66u];
+        case 0x94000000u: // aaf -> Mlym
+        case 0xAD600000u: // all -> Mlym
+        case 0xD48A0000u: // kev -> Mlym
+        case 0x9CAA0000u: // kfh -> Mlym
+        case 0xC12C0000u: // mjq -> Mlym
+        case 0xC52C0000u: // mjr -> Mlym
+        case 0xD52C0000u: // mjv -> Mlym
+        case 0x6D6C0000u: // ml -> Mlym
+        case 0x944F0000u: // pcf -> Mlym
+        case 0x984F0000u: // pcg -> Mlym
+        case 0xC54F0000u: // pkr -> Mlym
+        case 0x98740000u: // udg -> Mlym
+        case 0x80980000u: // yea -> Mlym
+            return SCRIPT_CODES[67u];
+        case 0xC58E0000u: // omr -> Modi
+            return SCRIPT_CODES[68u];
+        case 0xD2E10000u: // bxu -> Mong
+        case 0x6D6E434Eu: // mn-CN -> Mong
+        case 0x89AC0000u: // mnc -> Mong
+        case 0x96AC0000u: // mvf -> Mong
+            return SCRIPT_CODES[69u];
+        case 0xBA2C0000u: // mro -> Mroo
+            return SCRIPT_CODES[70u];
+        case 0xBD8E0000u: // omp -> Mtei
+            return SCRIPT_CODES[71u];
+        case 0xB9000000u: // aio -> Mymr
+        case 0xA9610000u: // blk -> Mymr
+        case 0x92C10000u: // bwe -> Mymr
+        case 0x9E420000u: // csh -> Mymr
+        case 0xD1A30000u: // dnu -> Mymr
+        case 0xD5A30000u: // dnv -> Mymr
+        case 0xB9E70000u: // hpo -> Mymr
+        case 0xCDA80000u: // int -> Mymr
+        case 0xB1490000u: // jkm -> Mymr
+        case 0xCCEA0000u: // kht -> Mymr
+        case 0xBD2A0000u: // kjp -> Mymr
+        case 0xD24A0000u: // ksu -> Mymr
+        case 0xDA4A0000u: // ksw -> Mymr
+        case 0xC2AA0000u: // kvq -> Mymr
+        case 0xCEAA0000u: // kvt -> Mymr
+        case 0x96EA0000u: // kxf -> Mymr
+        case 0xAAEA0000u: // kxk -> Mymr
+        case 0xD9AC0000u: // mnw -> Mymr
+        case 0xCECC0000u: // mwt -> Mymr
+        case 0x6D790000u: // my -> Mymr
+        case 0xC42E0000u: // obr -> Mymr
+        case 0xDD8E0000u: // omx -> Mymr
+        case 0x904F0000u: // pce -> Mymr
+        case 0xA8EF0000u: // phk -> Mymr
+        case 0xAD6F0000u: // pll -> Mymr
+        case 0xBACF0000u: // pwo -> Mymr
+        case 0xDF0F0000u: // pyx -> Mymr
+        case 0x84310000u: // rbb -> Mymr
+        case 0xA1510000u: // rki -> Mymr
+        case 0xE5910000u: // rmz -> Mymr
+        case 0xB4F20000u: // shn -> Mymr
+        case 0xB8530000u: // tco -> Mymr
+        case 0xAD330000u: // tjl -> Mymr
+        case 0xB6B30000u: // tvn -> Mymr
+            return SCRIPT_CODES[72u];
+        case 0x81B70000u: // xna -> Narb
+            return SCRIPT_CODES[73u];
+        case 0x8ACD0000u: // nwc -> Newa
+            return SCRIPT_CODES[74u];
+        case 0xB40C474Eu: // man-GN -> Nkoo
+        case 0xBA0D0000u: // nqo -> Nkoo
+            return SCRIPT_CODES[75u];
+        case 0xDCF90000u: // zhx -> Nshu
+            return SCRIPT_CODES[76u];
+        case 0xACCF0000u: // pgl -> Ogam
+        case 0x80D20000u: // sga -> Ogam
+        case 0xA1F70000u: // xpi -> Ogam
+            return SCRIPT_CODES[77u];
+        case 0xCC120000u: // sat -> Olck
+            return SCRIPT_CODES[78u];
+        case 0xAA6E0000u: // otk -> Orkh
+            return SCRIPT_CODES[79u];
+        case 0xD4610000u: // bdv -> Orya
+        case 0xD8A10000u: // bfw -> Orya
+        case 0xBA430000u: // dso -> Orya
+        case 0xAAC30000u: // dwk -> Orya
+        case 0xC0060000u: // gaq -> Orya
+        case 0xA4260000u: // gbj -> Orya
+        case 0x84660000u: // gdb -> Orya
+        case 0xB6890000u: // jun -> Orya
+        case 0xE2890000u: // juy -> Orya
+        case 0x6F720000u: // or -> Orya
+        case 0x988F0000u: // peg -> Orya
+        case 0xA0910000u: // rei -> Orya
+        case 0xD5F20000u: // spv -> Orya
+        case 0xA1540000u: // uki -> Orya
+        case 0xC9170000u: // xis -> Orya
+        case 0x9A390000u: // zrg -> Orya
+            return SCRIPT_CODES[80u];
+        case 0x824E0000u: // osa -> Osge
+            return SCRIPT_CODES[81u];
+        case 0xA28E0000u: // oui -> Ougr
+            return SCRIPT_CODES[82u];
+        case 0x8E620000u: // ctd -> Pauc
+            return SCRIPT_CODES[83u];
+        case 0xAC0F0000u: // pal -> Phli
+            return SCRIPT_CODES[84u];
+        case 0xB02E0000u: // obm -> Phnx
+        case 0xB4EF0000u: // phn -> Phnx
+            return SCRIPT_CODES[85u];
+        case 0x8D870000u: // hmd -> Plrd
+        case 0xBE6A0000u: // ktp -> Plrd
+        case 0xB9EB0000u: // lpo -> Plrd
+        case 0xB0B20000u: // sfm -> Plrd
+        case 0xBCD80000u: // ygp -> Plrd
+        case 0x81B80000u: // yna -> Plrd
+        case 0xE2580000u: // ysy -> Plrd
+        case 0xC2D80000u: // ywq -> Plrd
+        case 0xD2D80000u: // ywu -> Plrd
+            return SCRIPT_CODES[86u];
+        case 0xC5F70000u: // xpr -> Prti
+            return SCRIPT_CODES[87u];
+        case 0xAC200000u: // abl -> Rjng
+            return SCRIPT_CODES[88u];
+        case 0x98F10000u: // rhg -> Rohg
+            return SCRIPT_CODES[89u];
+        case 0xB5CD0000u: // non -> Runr
+        case 0xB62D0000u: // nrn -> Runr
+        case 0xD2F20000u: // sxu -> Runr
+            return SCRIPT_CODES[90u];
+        case 0xB0120000u: // sam -> Samr
+        case 0xBD920000u: // smp -> Samr
+            return SCRIPT_CODES[91u];
+        case 0x82570000u: // xsa -> Sarb
+            return SCRIPT_CODES[92u];
+        case 0xE4120000u: // saz -> Saur
+            return SCRIPT_CODES[93u];
+        case 0x92400000u: // ase -> Sgnw
+            return SCRIPT_CODES[94u];
+        case 0x70690000u: // pi -> Sinh
+        case 0x73690000u: // si -> Sinh
+            return SCRIPT_CODES[95u];
+        case 0x99D20000u: // sog -> Sogd
+            return SCRIPT_CODES[96u];
+        case 0x86320000u: // srb -> Sora
+            return SCRIPT_CODES[97u];
+        case 0x99820000u: // cmg -> Soyo
+            return SCRIPT_CODES[98u];
+        case 0xE6920000u: // suz -> Sunu
+            return SCRIPT_CODES[99u];
+        case 0xA1000000u: // aii -> Syrc
+        case 0xD9800000u: // amw -> Syrc
+        case 0xB4E10000u: // bhn -> Syrc
+        case 0x95210000u: // bjf -> Syrc
+        case 0xCE270000u: // hrt -> Syrc
+        case 0x8E0A0000u: // kqd -> Syrc
+        case 0xC8EB0000u: // lhs -> Syrc
+        case 0xC40E0000u: // oar -> Syrc
+        case 0x8B120000u: // syc -> Syrc
+        case 0xB7120000u: // syn -> Syrc
+        case 0xC7120000u: // syr -> Syrc
+        case 0xC5930000u: // tmr -> Syrc
+            return SCRIPT_CODES[100u];
+        case 0xA8330000u: // tbk -> Tagb
+            return SCRIPT_CODES[101u];
+        case 0xA1070000u: // hii -> Takr
+        case 0x81A90000u: // jna -> Takr
+        case 0xD0520000u: // scu -> Takr
+            return SCRIPT_CODES[102u];
+        case 0x8C730000u: // tdd -> Tale
+        case 0xA0F30000u: // thi -> Tale
+            return SCRIPT_CODES[103u];
+        case 0x84EA0000u: // khb -> Talu
+            return SCRIPT_CODES[104u];
+        case 0xC0A10000u: // bfq -> Taml
+        case 0xCE620000u: // ctt -> Taml
+        case 0xE2620000u: // cty -> Taml
+        case 0x82240000u: // era -> Taml
+        case 0xD2280000u: // iru -> Taml
+        case 0x90AA0000u: // kfe -> Taml
+        case 0xA0AA0000u: // kfi -> Taml
+        case 0xD68C0000u: // muv -> Taml
+        case 0x74610000u: // ta -> Taml
+        case 0xDC530000u: // tcx -> Taml
+        case 0x80150000u: // vaa -> Taml
+        case 0x86970000u: // xub -> Taml
+        case 0xA6970000u: // xuj -> Taml
+            return SCRIPT_CODES[105u];
+        case 0x9AF30000u: // txg -> Tang
+            return SCRIPT_CODES[106u];
+        case 0xCD610000u: // blt -> Tavt
+        case 0x81D20000u: // soa -> Tavt
+        case 0xC7130000u: // tyr -> Tavt
+            return SCRIPT_CODES[107u];
+        case 0x90620000u: // cde -> Telu
+        case 0xD0060000u: // gau -> Telu
+        case 0xE08A0000u: // key -> Telu
+        case 0x88AA0000u: // kfc -> Telu
+        case 0xB58B0000u: // lmn -> Telu
+        case 0xD12C0000u: // mju -> Telu
+        case 0xCD0D0000u: // nit -> Telu
+        case 0xCE2E0000u: // ort -> Telu
+        case 0xA44F0000u: // pcj -> Telu
+        case 0x74650000u: // te -> Telu
+        case 0xC0360000u: // wbq -> Telu
+        case 0xD0980000u: // yeu -> Telu
+            return SCRIPT_CODES[108u];
+        case 0xB8E60000u: // gho -> Tfng
+        case 0xA0F20000u: // shi -> Tfng
+        case 0x80730000u: // tda -> Tfng
+        case 0xB4990000u: // zen -> Tfng
+        case 0x9CD90000u: // zgh -> Tfng
+            return SCRIPT_CODES[109u];
+        case 0x64760000u: // dv -> Thaa
+            return SCRIPT_CODES[110u];
+        case 0xA3210000u: // bzi -> Thai
+        case 0xB4220000u: // cbn -> Thai
+        case 0x99C20000u: // cog -> Thai
+        case 0xCC6A0000u: // kdt -> Thai
+        case 0x94EA0000u: // khf -> Thai
+        case 0xCD2A0000u: // kjt -> Thai
+        case 0xB2EA0000u: // kxm -> Thai
+        case 0xBC4B0000u: // lcp -> Thai
+        case 0xAECB0000u: // lwl -> Thai
+        case 0xB2CB0000u: // lwm -> Thai
+        case 0xB14C0000u: // mkm -> Thai
+        case 0x956C0000u: // mlf -> Thai
+        case 0xE5EC0000u: // mpz -> Thai
+        case 0x822C0000u: // mra -> Thai
+        case 0xAF0D0000u: // nyl -> Thai
+        case 0xDB0D0000u: // nyw -> Thai
+        case 0xCCEF0000u: // pht -> Thai
+        case 0xD0EF0000u: // phu -> Thai
+        case 0xCE2F0000u: // prt -> Thai
+        case 0xDACF0000u: // pww -> Thai
+        case 0x85520000u: // skb -> Thai
+        case 0xD1D20000u: // sou -> Thai
+        case 0x74680000u: // th -> Thai
+        case 0xB0F30000u: // thm -> Thai
+        case 0xCA730000u: // tts -> Thai
+        case 0xB8D40000u: // ugo -> Thai
+        case 0xAA340000u: // urk -> Thai
+        case 0xE1D80000u: // yoy -> Thai
+            return SCRIPT_CODES[111u];
+        case 0xDC600000u: // adx -> Tibt
+        case 0xD0A10000u: // bfu -> Tibt
+        case 0xA9410000u: // bkk -> Tibt
+        case 0x626F0000u: // bo -> Tibt
+        case 0xBA210000u: // bro -> Tibt
+        case 0xA8C20000u: // cgk -> Tibt
+        case 0x81A20000u: // cna -> Tibt
+        case 0x81430000u: // dka -> Tibt
+        case 0x92230000u: // dre -> Tibt
+        case 0x647A0000u: // dz -> Tibt
+        case 0xAF230000u: // dzl -> Tibt
+        case 0xCCE60000u: // ght -> Tibt
+        case 0x91C60000u: // goe -> Tibt
+        case 0x80690000u: // jda -> Tibt
+        case 0x83090000u: // jya -> Tibt
+        case 0x982A0000u: // kbg -> Tibt
+        case 0x98EA0000u: // khg -> Tibt
+        case 0xE52A0000u: // kjz -> Tibt
+        case 0x954A0000u: // kkf -> Tibt
+        case 0xA42B0000u: // lbj -> Tibt
+        case 0x9D4B0000u: // lkh -> Tibt
+        case 0xAA8B0000u: // luk -> Tibt
+        case 0x830B0000u: // lya -> Tibt
+        case 0xAA8C0000u: // muk -> Tibt
+        case 0x9C8D0000u: // neh -> Tibt
+        case 0x85ED0000u: // npb -> Tibt
+        case 0x916E0000u: // ole -> Tibt
+        case 0x866E0000u: // otb -> Tibt
+        case 0xD0320000u: // sbu -> Tibt
+        case 0xCCD20000u: // sgt -> Tibt
+        case 0xBD120000u: // sip -> Tibt
+        case 0xCDF20000u: // spt -> Tibt
+        case 0xB4530000u: // tcn -> Tibt
+        case 0x94D30000u: // tgf -> Tibt
+        case 0xA6530000u: // tsj -> Tibt
+        case 0x95570000u: // xkf -> Tibt
+        case 0xD0190000u: // zau -> Tibt
+            return SCRIPT_CODES[112u];
+        case 0xCE4D0000u: // nst -> Tnsa
+            return SCRIPT_CODES[113u];
+        case 0xBAF30000u: // txo -> Toto
+            return SCRIPT_CODES[114u];
+        case 0x80D40000u: // uga -> Ugar
+            return SCRIPT_CODES[115u];
+        case 0xA0150000u: // vai -> Vaii
+            return SCRIPT_CODES[116u];
+        case 0xBDAD0000u: // nnp -> Wcho
+            return SCRIPT_CODES[117u];
+        case 0xB88F0000u: // peo -> Xpeo
+            return SCRIPT_CODES[118u];
+        case 0xA9400000u: // akk -> Xsux
+        case 0xCD070000u: // hit -> Xsux
+        case 0xDE670000u: // htx -> Xsux
+        case 0xA08D0000u: // nei -> Xsux
+        case 0xCCEE0000u: // oht -> Xsux
+            return SCRIPT_CODES[119u];
+        case 0x69690000u: // ii -> Yiii
+        case 0xC9CD0000u: // nos -> Yiii
+        case 0x8E4D0000u: // nsd -> Yiii
+        case 0x964D0000u: // nsf -> Yiii
+        case 0xD64D0000u: // nsv -> Yiii
+        case 0xE26D0000u: // nty -> Yiii
+        case 0x9D920000u: // smh -> Yiii
+        case 0x99180000u: // yig -> Yiii
+        case 0xD5180000u: // yiv -> Yiii
+        case 0x8E580000u: // ysd -> Yiii
+        case 0xB6580000u: // ysn -> Yiii
+        case 0xBE580000u: // ysp -> Yiii
+            return SCRIPT_CODES[120u];
+        case 0x656E5841u: // en-XA -> ~~~A
+            return SCRIPT_CODES[121u];
+        case 0x61725842u: // ar-XB -> ~~~B
+            return SCRIPT_CODES[122u];
+        default:
+            return nullptr;
+     }
+}
 
-    auto lookup_result = LIKELY_SCRIPTS.find(packed_lang_region);
-    if (lookup_result == LIKELY_SCRIPTS.end()) {
-        return nullptr;
-    } else {
-        return SCRIPT_CODES[lookup_result->second];
+bool isLocaleRepresentative(uint32_t language_and_region, const char* script) {
+    const uint64_t packed_locale =
+            ((static_cast<uint64_t>(language_and_region)) << 32u) |
+            (static_cast<uint64_t>(packScript(script)));
+    switch(packed_locale) {
+        case 0x616145544C61746ELLU: // aa_Latn_ET
+        case 0x80004E474C61746ELLU: // aaa_Latn_NG
+        case 0x84004E474C61746ELLU: // aab_Latn_NG
+        case 0x880050474C61746ELLU: // aac_Latn_PG
+        case 0x8C0050474C61746ELLU: // aad_Latn_PG
+        case 0x900049544C61746ELLU: // aae_Latn_IT
+        case 0x9400494E4D6C796DLLU: // aaf_Mlym_IN
+        case 0x980050474C61746ELLU: // aag_Latn_PG
+        case 0x9C0050474C61746ELLU: // aah_Latn_PG
+        case 0xA00050474C61746ELLU: // aai_Latn_PG
+        case 0xA80050474C61746ELLU: // aak_Latn_PG
+        case 0xAC00434D4C61746ELLU: // aal_Latn_CM
+        case 0xB40042524C61746ELLU: // aan_Latn_BR
+        case 0xB800445A41726162LLU: // aao_Arab_DZ
+        case 0xBC0042524C61746ELLU: // aap_Latn_BR
+        case 0xC00055534C61746ELLU: // aaq_Latn_US
+        case 0xC800545A4C61746ELLU: // aas_Latn_TZ
+        case 0xCC0047524772656BLLU: // aat_Grek_GR
+        case 0xD00050474C61746ELLU: // aau_Latn_PG
+        case 0xD80050474C61746ELLU: // aaw_Latn_PG
+        case 0xDC0049444C61746ELLU: // aax_Latn_ID
+        case 0xE40049444C61746ELLU: // aaz_Latn_ID
+        case 0x616247454379726CLLU: // ab_Cyrl_GE
+        case 0x802043494C61746ELLU: // aba_Latn_CI
+        case 0x8420434D4C61746ELLU: // abb_Latn_CM
+        case 0x882050484C61746ELLU: // abc_Latn_PH
+        case 0x8C2050484C61746ELLU: // abd_Latn_PH
+        case 0x902043414C61746ELLU: // abe_Latn_CA
+        case 0x94204D594C61746ELLU: // abf_Latn_MY
+        case 0x982050474C61746ELLU: // abg_Latn_PG
+        case 0x9C20544A41726162LLU: // abh_Arab_TJ
+        case 0xA02043494C61746ELLU: // abi_Latn_CI
+        case 0xAC204944526A6E67LLU: // abl_Rjng_ID
+        case 0xB0204E474C61746ELLU: // abm_Latn_NG
+        case 0xB4204E474C61746ELLU: // abn_Latn_NG
+        case 0xB8204E474C61746ELLU: // abo_Latn_NG
+        case 0xBC2050484C61746ELLU: // abp_Latn_PH
+        case 0xC42047484C61746ELLU: // abr_Latn_GH
+        case 0xC82049444C61746ELLU: // abs_Latn_ID
+        case 0xCC2050474C61746ELLU: // abt_Latn_PG
+        case 0xD02043494C61746ELLU: // abu_Latn_CI
+        case 0xD420424841726162LLU: // abv_Arab_BH
+        case 0xD82050474C61746ELLU: // abw_Latn_PG
+        case 0xDC2050484C61746ELLU: // abx_Latn_PH
+        case 0xE02050474C61746ELLU: // aby_Latn_PG
+        case 0xE42049444C61746ELLU: // abz_Latn_ID
+        case 0x8040434F4C61746ELLU: // aca_Latn_CO
+        case 0x84404E474C61746ELLU: // acb_Latn_NG
+        case 0x8C4047484C61746ELLU: // acd_Latn_GH
+        case 0x904049444C61746ELLU: // ace_Latn_ID
+        case 0x94404C434C61746ELLU: // acf_Latn_LC
+        case 0x9C4055474C61746ELLU: // ach_Latn_UG
+        case 0xB040495141726162LLU: // acm_Arab_IQ
+        case 0xB440434E4C61746ELLU: // acn_Latn_CN
+        case 0xBC404E474C61746ELLU: // acp_Latn_NG
+        case 0xC040594541726162LLU: // acq_Arab_YE
+        case 0xC44047544C61746ELLU: // acr_Latn_GT
+        case 0xC84042524C61746ELLU: // acs_Latn_BR
+        case 0xCC404E4C4C61746ELLU: // act_Latn_NL
+        case 0xD04045434C61746ELLU: // acu_Latn_EC
+        case 0xD44055534C61746ELLU: // acv_Latn_US
+        case 0xD840534141726162LLU: // acw_Arab_SA
+        case 0xDC404F4D41726162LLU: // acx_Arab_OM
+        case 0xE04043594C61746ELLU: // acy_Latn_CY
+        case 0xE44053444C61746ELLU: // acz_Latn_SD
+        case 0x806047484C61746ELLU: // ada_Latn_GH
+        case 0x8460544C4C61746ELLU: // adb_Latn_TL
+        case 0x8C60434D4C61746ELLU: // add_Latn_CM
+        case 0x906054474C61746ELLU: // ade_Latn_TG
+        case 0x94604F4D41726162LLU: // adf_Arab_OM
+        case 0x986041554C61746ELLU: // adg_Latn_AU
+        case 0x9C6055474C61746ELLU: // adh_Latn_UG
+        case 0xA060494E4C61746ELLU: // adi_Latn_IN
+        case 0xA46043494C61746ELLU: // adj_Latn_CI
+        case 0xAC60494E4C61746ELLU: // adl_Latn_IN
+        case 0xB46049444C61746ELLU: // adn_Latn_ID
+        case 0xB86050474C61746ELLU: // ado_Latn_PG
+        case 0xC06047484C61746ELLU: // adq_Latn_GH
+        case 0xC46049444C61746ELLU: // adr_Latn_ID
+        case 0xCC6041554C61746ELLU: // adt_Latn_AU
+        case 0xD0604E474C61746ELLU: // adu_Latn_NG
+        case 0xD86042524C61746ELLU: // adw_Latn_BR
+        case 0xDC60434E54696274LLU: // adx_Tibt_CN
+        case 0xE06052554379726CLLU: // ady_Cyrl_RU
+        case 0xE46050474C61746ELLU: // adz_Latn_PG
+        case 0x6165495241767374LLU: // ae_Avst_IR
+        case 0x808041554C61746ELLU: // aea_Latn_AU
+        case 0x8480544E41726162LLU: // aeb_Arab_TN
+        case 0x8880454741726162LLU: // aec_Arab_EG
+        case 0x9080414641726162LLU: // aee_Arab_AF
+        case 0xA8804E434C61746ELLU: // aek_Latn_NC
+        case 0xAC80434D4C61746ELLU: // ael_Latn_CM
+        case 0xB080564E4C61746ELLU: // aem_Latn_VN
+        case 0xC080504B41726162LLU: // aeq_Arab_PK
+        case 0xC48041554C61746ELLU: // aer_Latn_AU
+        case 0xD080434E4C61746ELLU: // aeu_Latn_CN
+        case 0xD88050474C61746ELLU: // aew_Latn_PG
+        case 0xE08050474C61746ELLU: // aey_Latn_PG
+        case 0xE48050474C61746ELLU: // aez_Latn_PG
+        case 0x61665A414C61746ELLU: // af_Latn_ZA
+        case 0x84A04B5741726162LLU: // afb_Arab_KW
+        case 0x8CA050474C61746ELLU: // afd_Latn_PG
+        case 0x90A04E474C61746ELLU: // afe_Latn_NG
+        case 0x9CA047484C61746ELLU: // afh_Latn_GH
+        case 0xA0A050474C61746ELLU: // afi_Latn_PG
+        case 0xA8A050474C61746ELLU: // afk_Latn_PG
+        case 0xB4A04E474C61746ELLU: // afn_Latn_NG
+        case 0xB8A04E474C61746ELLU: // afo_Latn_NG
+        case 0xBCA050474C61746ELLU: // afp_Latn_PG
+        case 0xC8A04D584C61746ELLU: // afs_Latn_MX
+        case 0xD0A047484C61746ELLU: // afu_Latn_GH
+        case 0xE4A049444C61746ELLU: // afz_Latn_ID
+        case 0x80C050454C61746ELLU: // aga_Latn_PE
+        case 0x84C04E474C61746ELLU: // agb_Latn_NG
+        case 0x88C04E474C61746ELLU: // agc_Latn_NG
+        case 0x8CC050474C61746ELLU: // agd_Latn_PG
+        case 0x90C050474C61746ELLU: // age_Latn_PG
+        case 0x94C049444C61746ELLU: // agf_Latn_ID
+        case 0x98C050474C61746ELLU: // agg_Latn_PG
+        case 0x9CC043444C61746ELLU: // agh_Latn_CD
+        case 0xA0C0494E44657661LLU: // agi_Deva_IN
+        case 0xA4C0455445746869LLU: // agj_Ethi_ET
+        case 0xA8C050484C61746ELLU: // agk_Latn_PH
+        case 0xACC050474C61746ELLU: // agl_Latn_PG
+        case 0xB0C050474C61746ELLU: // agm_Latn_PG
+        case 0xB4C050484C61746ELLU: // agn_Latn_PH
+        case 0xB8C050474C61746ELLU: // ago_Latn_PG
+        case 0xC0C0434D4C61746ELLU: // agq_Latn_CM
+        case 0xC4C050454C61746ELLU: // agr_Latn_PE
+        case 0xC8C0434D4C61746ELLU: // ags_Latn_CM
+        case 0xCCC050484C61746ELLU: // agt_Latn_PH
+        case 0xD0C047544C61746ELLU: // agu_Latn_GT
+        case 0xD4C050484C61746ELLU: // agv_Latn_PH
+        case 0xD8C053424C61746ELLU: // agw_Latn_SB
+        case 0xDCC052554379726CLLU: // agx_Cyrl_RU
+        case 0xE0C050484C61746ELLU: // agy_Latn_PH
+        case 0xE4C050484C61746ELLU: // agz_Latn_PH
+        case 0x80E047484C61746ELLU: // aha_Latn_GH
+        case 0x84E056554C61746ELLU: // ahb_Latn_VU
+        case 0x98E0455445746869LLU: // ahg_Ethi_ET
+        case 0x9CE049444C61746ELLU: // ahh_Latn_ID
+        case 0xA0E043494C61746ELLU: // ahi_Latn_CI
+        case 0xA8E04D4D4C61746ELLU: // ahk_Latn_MM
+        case 0xACE054474C61746ELLU: // ahl_Latn_TG
+        case 0xB0E043494C61746ELLU: // ahm_Latn_CI
+        case 0xB4E04E474C61746ELLU: // ahn_Latn_NG
+        case 0xB8E0494E41686F6DLLU: // aho_Ahom_IN
+        case 0xBCE043494C61746ELLU: // ahp_Latn_CI
+        case 0xC4E0494E44657661LLU: // ahr_Deva_IN
+        case 0xC8E04E474C61746ELLU: // ahs_Latn_NG
+        case 0xCCE055534C61746ELLU: // aht_Latn_US
+        case 0x810053424C61746ELLU: // aia_Latn_SB
+        case 0x8500434E41726162LLU: // aib_Arab_CN
+        case 0x890050474C61746ELLU: // aic_Latn_PG
+        case 0x8D0041554C61746ELLU: // aid_Latn_AU
+        case 0x910050474C61746ELLU: // aie_Latn_PG
+        case 0x950050474C61746ELLU: // aif_Latn_PG
+        case 0x990041474C61746ELLU: // aig_Latn_AG
+        case 0xA100495153797263LLU: // aii_Syrc_IQ
+        case 0xA500494C48656272LLU: // aij_Hebr_IL
+        case 0xA9004E474C61746ELLU: // aik_Latn_NG
+        case 0xAD0050474C61746ELLU: // ail_Latn_PG
+        case 0xB100494E4C61746ELLU: // aim_Latn_IN
+        case 0xB5004A504B616E61LLU: // ain_Kana_JP
+        case 0xB900494E4D796D72LLU: // aio_Mymr_IN
+        case 0xBD0049444C61746ELLU: // aip_Latn_ID
+        case 0xC100414641726162LLU: // aiq_Arab_AF
+        case 0xC50049444C61746ELLU: // air_Latn_ID
+        case 0xCD0042524C61746ELLU: // ait_Latn_BR
+        case 0xD90045544C61746ELLU: // aiw_Latn_ET
+        case 0xDD0050474C61746ELLU: // aix_Latn_PG
+        case 0xE10043464C61746ELLU: // aiy_Latn_CF
+        case 0x812053534C61746ELLU: // aja_Latn_SS
+        case 0x9920424A4C61746ELLU: // ajg_Latn_BJ
+        case 0xA1204E434C61746ELLU: // aji_Latn_NC
+        case 0xB52041554C61746ELLU: // ajn_Latn_AU
+        case 0xD9204E474C61746ELLU: // ajw_Latn_NG
+        case 0xE520494E4C61746ELLU: // ajz_Latn_IN
+        case 0x616B47484C61746ELLU: // ak_Latn_GH
+        case 0x854049444C61746ELLU: // akb_Latn_ID
+        case 0x894049444C61746ELLU: // akc_Latn_ID
+        case 0x8D404E474C61746ELLU: // akd_Latn_NG
+        case 0x914047594C61746ELLU: // ake_Latn_GY
+        case 0x95404E474C61746ELLU: // akf_Latn_NG
+        case 0x994049444C61746ELLU: // akg_Latn_ID
+        case 0x9D4050474C61746ELLU: // akh_Latn_PG
+        case 0xA14050474C61746ELLU: // aki_Latn_PG
+        case 0xA940495158737578LLU: // akk_Xsux_IQ
+        case 0xAD4050484C61746ELLU: // akl_Latn_PH
+        case 0xB94053524C61746ELLU: // ako_Latn_SR
+        case 0xBD4047484C61746ELLU: // akp_Latn_GH
+        case 0xC14050474C61746ELLU: // akq_Latn_PG
+        case 0xC54056554C61746ELLU: // akr_Latn_VU
+        case 0xC94054474C61746ELLU: // aks_Latn_TG
+        case 0xCD4050474C61746ELLU: // akt_Latn_PG
+        case 0xD140434D4C61746ELLU: // aku_Latn_CM
+        case 0xD54052554379726CLLU: // akv_Cyrl_RU
+        case 0xD94043474C61746ELLU: // akw_Latn_CG
+        case 0xE54055534C61746ELLU: // akz_Latn_US
+        case 0x81604E474C61746ELLU: // ala_Latn_NG
+        case 0x8960434C4C61746ELLU: // alc_Latn_CL
+        case 0x8D6043494C61746ELLU: // ald_Latn_CI
+        case 0x916055534C61746ELLU: // ale_Latn_US
+        case 0x95604E474C61746ELLU: // alf_Latn_NG
+        case 0x9D6041554C61746ELLU: // alh_Latn_AU
+        case 0xA16050474C61746ELLU: // ali_Latn_PG
+        case 0xA56050484C61746ELLU: // alj_Latn_PH
+        case 0xA9604C414C616F6FLLU: // alk_Laoo_LA
+        case 0xAD60494E4D6C796DLLU: // all_Mlym_IN
+        case 0xB16056554C61746ELLU: // alm_Latn_VU
+        case 0xB560584B4C61746ELLU: // aln_Latn_XK
+        case 0xB96049444C61746ELLU: // alo_Latn_ID
+        case 0xBD6049444C61746ELLU: // alp_Latn_ID
+        case 0xC16043414C61746ELLU: // alq_Latn_CA
+        case 0xC56052554379726CLLU: // alr_Cyrl_RU
+        case 0xCD6052554379726CLLU: // alt_Cyrl_RU
+        case 0xD16053424C61746ELLU: // alu_Latn_SB
+        case 0xD960455445746869LLU: // alw_Ethi_ET
+        case 0xDD6050474C61746ELLU: // alx_Latn_PG
+        case 0xE16041554C61746ELLU: // aly_Latn_AU
+        case 0xE56043444C61746ELLU: // alz_Latn_CD
+        case 0x616D455445746869LLU: // am_Ethi_ET
+        case 0x818042524C61746ELLU: // ama_Latn_BR
+        case 0x85804E474C61746ELLU: // amb_Latn_NG
+        case 0x898050454C61746ELLU: // amc_Latn_PE
+        case 0x918050454C61746ELLU: // ame_Latn_PE
+        case 0x958045544C61746ELLU: // amf_Latn_ET
+        case 0x998041554C61746ELLU: // amg_Latn_AU
+        case 0xA18054574C61746ELLU: // ami_Latn_TW
+        case 0xA58054444C61746ELLU: // amj_Latn_TD
+        case 0xA98049444C61746ELLU: // amk_Latn_ID
+        case 0xB18050474C61746ELLU: // amm_Latn_PG
+        case 0xB58050474C61746ELLU: // amn_Latn_PG
+        case 0xB9804E474C61746ELLU: // amo_Latn_NG
+        case 0xBD8050474C61746ELLU: // amp_Latn_PG
+        case 0xC18049444C61746ELLU: // amq_Latn_ID
+        case 0xC58050454C61746ELLU: // amr_Latn_PE
+        case 0xC9804A504A70616ELLU: // ams_Jpan_JP
+        case 0xCD8050474C61746ELLU: // amt_Latn_PG
+        case 0xD1804D584C61746ELLU: // amu_Latn_MX
+        case 0xD58049444C61746ELLU: // amv_Latn_ID
+        case 0xD980535953797263LLU: // amw_Syrc_SY
+        case 0xDD8041554C61746ELLU: // amx_Latn_AU
+        case 0xE18041554C61746ELLU: // amy_Latn_AU
+        case 0xE58041554C61746ELLU: // amz_Latn_AU
+        case 0x616E45534C61746ELLU: // an_Latn_ES
+        case 0x81A0434F4C61746ELLU: // ana_Latn_CO
+        case 0x85A050454C61746ELLU: // anb_Latn_PE
+        case 0x89A04E474C61746ELLU: // anc_Latn_NG
+        case 0x8DA049444C61746ELLU: // and_Latn_ID
+        case 0x91A04E434C61746ELLU: // ane_Latn_NC
+        case 0x95A047484C61746ELLU: // anf_Latn_GH
+        case 0x99A047424C61746ELLU: // ang_Latn_GB
+        case 0x9DA050474C61746ELLU: // anh_Latn_PG
+        case 0xA1A052554379726CLLU: // ani_Cyrl_RU
+        case 0xA5A050474C61746ELLU: // anj_Latn_PG
+        case 0xA9A04E474C61746ELLU: // ank_Latn_NG
+        case 0xADA04D4D4C61746ELLU: // anl_Latn_MM
+        case 0xB1A0494E4C61746ELLU: // anm_Latn_IN
+        case 0xB5A04E474C61746ELLU: // ann_Latn_NG
+        case 0xB9A0434F4C61746ELLU: // ano_Latn_CO
+        case 0xBDA0494E44657661LLU: // anp_Deva_IN
+        case 0xC1A0494E44657661LLU: // anq_Deva_IN
+        case 0xC5A0494E44657661LLU: // anr_Deva_IN
+        case 0xC9A0434F4C61746ELLU: // ans_Latn_CO
+        case 0xCDA041554C61746ELLU: // ant_Latn_AU
+        case 0xD1A0455445746869LLU: // anu_Ethi_ET
+        case 0xD5A0434D4C61746ELLU: // anv_Latn_CM
+        case 0xD9A04E474C61746ELLU: // anw_Latn_NG
+        case 0xDDA050474C61746ELLU: // anx_Latn_PG
+        case 0xE1A043494C61746ELLU: // any_Latn_CI
+        case 0xE5A050474C61746ELLU: // anz_Latn_PG
+        case 0x81C053544C61746ELLU: // aoa_Latn_ST
+        case 0x85C050474C61746ELLU: // aob_Latn_PG
+        case 0x89C056454C61746ELLU: // aoc_Latn_VE
+        case 0x8DC050474C61746ELLU: // aod_Latn_PG
+        case 0x91C050474C61746ELLU: // aoe_Latn_PG
+        case 0x95C050474C61746ELLU: // aof_Latn_PG
+        case 0x99C050474C61746ELLU: // aog_Latn_PG
+        case 0xA1C041554C61746ELLU: // aoi_Latn_AU
+        case 0xA5C050474C61746ELLU: // aoj_Latn_PG
+        case 0xA9C04E434C61746ELLU: // aok_Latn_NC
+        case 0xADC049444C61746ELLU: // aol_Latn_ID
+        case 0xB1C050474C61746ELLU: // aom_Latn_PG
+        case 0xB5C050474C61746ELLU: // aon_Latn_PG
+        case 0xC5C056554C61746ELLU: // aor_Latn_VU
+        case 0xC9C049444C61746ELLU: // aos_Latn_ID
+        case 0xCDC0424442656E67LLU: // aot_Beng_BD
+        case 0xDDC047594C61746ELLU: // aox_Latn_GY
+        case 0xE5C049444C61746ELLU: // aoz_Latn_ID
+        case 0x85E053424C61746ELLU: // apb_Latn_SB
+        case 0x89E0535941726162LLU: // apc_Arab_SY
+        case 0x8DE0544741726162LLU: // apd_Arab_TG
+        case 0x91E050474C61746ELLU: // ape_Latn_PG
+        case 0x95E050484C61746ELLU: // apf_Latn_PH
+        case 0x99E049444C61746ELLU: // apg_Latn_ID
+        case 0x9DE04E5044657661LLU: // aph_Deva_NP
+        case 0xA1E042524C61746ELLU: // api_Latn_BR
+        case 0xA5E055534C61746ELLU: // apj_Latn_US
+        case 0xA9E055534C61746ELLU: // apk_Latn_US
+        case 0xADE055534C61746ELLU: // apl_Latn_US
+        case 0xB1E055534C61746ELLU: // apm_Latn_US
+        case 0xB5E042524C61746ELLU: // apn_Latn_BR
+        case 0xB9E050474C61746ELLU: // apo_Latn_PG
+        case 0xBDE056554C61746ELLU: // app_Latn_VU
+        case 0xC5E050474C61746ELLU: // apr_Latn_PG
+        case 0xC9E050474C61746ELLU: // aps_Latn_PG
+        case 0xCDE0494E4C61746ELLU: // apt_Latn_IN
+        case 0xD1E042524C61746ELLU: // apu_Latn_BR
+        case 0xD5E042524C61746ELLU: // apv_Latn_BR
+        case 0xD9E055534C61746ELLU: // apw_Latn_US
+        case 0xDDE049444C61746ELLU: // apx_Latn_ID
+        case 0xE1E042524C61746ELLU: // apy_Latn_BR
+        case 0xE5E050474C61746ELLU: // apz_Latn_PG
+        case 0x8A0052554379726CLLU: // aqc_Cyrl_RU
+        case 0x8E004D4C4C61746ELLU: // aqd_Latn_ML
+        case 0x9A004E474C61746ELLU: // aqg_Latn_NG
+        case 0xAA004E474C61746ELLU: // aqk_Latn_NG
+        case 0xB20049444C61746ELLU: // aqm_Latn_ID
+        case 0xB60050484C61746ELLU: // aqn_Latn_PH
+        case 0xC6004E434C61746ELLU: // aqr_Latn_NC
+        case 0xCE0050594C61746ELLU: // aqt_Latn_PY
+        case 0xE60042524C61746ELLU: // aqz_Latn_BR
+        case 0x6172454741726162LLU: // ar_Arab_EG
+        case 0x8A20495241726D69LLU: // arc_Armi_IR
+        case 0x8A20495148617472LLU: // arc_Hatr_IQ
+        case 0x8A204A4F4E626174LLU: // arc_Nbat_JO
+        case 0x8A20535950616C6DLLU: // arc_Palm_SY
+        case 0x8E2041554C61746ELLU: // ard_Latn_AU
+        case 0x922041554C61746ELLU: // are_Latn_AU
+        case 0x9E20434F4C61746ELLU: // arh_Latn_CO
+        case 0xA22055534C61746ELLU: // ari_Latn_US
+        case 0xA62042524C61746ELLU: // arj_Latn_BR
+        case 0xAA2042524C61746ELLU: // ark_Latn_BR
+        case 0xAE2050454C61746ELLU: // arl_Latn_PE
+        case 0xB620434C4C61746ELLU: // arn_Latn_CL
+        case 0xBA20424F4C61746ELLU: // aro_Latn_BO
+        case 0xBE2055534C61746ELLU: // arp_Latn_US
+        case 0xC220445A41726162LLU: // arq_Arab_DZ
+        case 0xC62042524C61746ELLU: // arr_Latn_BR
+        case 0xCA20534141726162LLU: // ars_Arab_SA
+        case 0xD22042524C61746ELLU: // aru_Latn_BR
+        case 0xDA2053524C61746ELLU: // arw_Latn_SR
+        case 0xDE2042524C61746ELLU: // arx_Latn_BR
+        case 0xE2204D4141726162LLU: // ary_Arab_MA
+        case 0xE620454741726162LLU: // arz_Arab_EG
+        case 0x6173494E42656E67LLU: // as_Beng_IN
+        case 0x8240545A4C61746ELLU: // asa_Latn_TZ
+        case 0x864043414C61746ELLU: // asb_Latn_CA
+        case 0x8A4049444C61746ELLU: // asc_Latn_ID
+        case 0x9240555353676E77LLU: // ase_Sgnw_US
+        case 0x9A404E474C61746ELLU: // asg_Latn_NG
+        case 0x9E4050454C61746ELLU: // ash_Latn_PE
+        case 0xA24049444C61746ELLU: // asi_Latn_ID
+        case 0xA640434D4C61746ELLU: // asj_Latn_CM
+        case 0xAA40414641726162LLU: // ask_Arab_AF
+        case 0xAE4049444C61746ELLU: // asl_Latn_ID
+        case 0xB64042524C61746ELLU: // asn_Latn_BR
+        case 0xBA4050474C61746ELLU: // aso_Latn_PG
+        case 0xC640494E44657661LLU: // asr_Deva_IN
+        case 0xCA40434D4C61746ELLU: // ass_Latn_CM
+        case 0xCE4045534C61746ELLU: // ast_Latn_ES
+        case 0xD24042524C61746ELLU: // asu_Latn_BR
+        case 0xD64043444C61746ELLU: // asv_Latn_CD
+        case 0xDE4050474C61746ELLU: // asx_Latn_PG
+        case 0xE24049444C61746ELLU: // asy_Latn_ID
+        case 0xE64049444C61746ELLU: // asz_Latn_ID
+        case 0x826050474C61746ELLU: // ata_Latn_PG
+        case 0x8660434E4C61746ELLU: // atb_Latn_CN
+        case 0x8A6050454C61746ELLU: // atc_Latn_PE
+        case 0x8E6050484C61746ELLU: // atd_Latn_PH
+        case 0x926050474C61746ELLU: // ate_Latn_PG
+        case 0x9A604E474C61746ELLU: // atg_Latn_NG
+        case 0xA26043494C61746ELLU: // ati_Latn_CI
+        case 0xA66043414C61746ELLU: // atj_Latn_CA
+        case 0xAA6050484C61746ELLU: // atk_Latn_PH
+        case 0xAE6050484C61746ELLU: // atl_Latn_PH
+        case 0xB26050484C61746ELLU: // atm_Latn_PH
+        case 0xB660495241726162LLU: // atn_Arab_IR
+        case 0xBA60434D4C61746ELLU: // ato_Latn_CM
+        case 0xBE6050484C61746ELLU: // atp_Latn_PH
+        case 0xC26049444C61746ELLU: // atq_Latn_ID
+        case 0xC66042524C61746ELLU: // atr_Latn_BR
+        case 0xCA6055534C61746ELLU: // ats_Latn_US
+        case 0xCE6050484C61746ELLU: // att_Latn_PH
+        case 0xD26053534C61746ELLU: // atu_Latn_SS
+        case 0xD66052554379726CLLU: // atv_Cyrl_RU
+        case 0xDA6055534C61746ELLU: // atw_Latn_US
+        case 0xDE6042524C61746ELLU: // atx_Latn_BR
+        case 0xE26056554C61746ELLU: // aty_Latn_VU
+        case 0xE66050484C61746ELLU: // atz_Latn_PH
+        case 0x828053424C61746ELLU: // aua_Latn_SB
+        case 0x8A8045434C61746ELLU: // auc_Latn_EC
+        case 0x8E8053424C61746ELLU: // aud_Latn_SB
+        case 0x9A80424A4C61746ELLU: // aug_Latn_BJ
+        case 0x9E805A4D4C61746ELLU: // auh_Latn_ZM
+        case 0xA28050474C61746ELLU: // aui_Latn_PG
+        case 0xA6804C5941726162LLU: // auj_Arab_LY
+        case 0xAA8050474C61746ELLU: // auk_Latn_PG
+        case 0xAE8056554C61746ELLU: // aul_Latn_VU
+        case 0xB2804E474C61746ELLU: // aum_Latn_NG
+        case 0xB68050474C61746ELLU: // aun_Latn_PG
+        case 0xBA804E474C61746ELLU: // auo_Latn_NG
+        case 0xBE8050474C61746ELLU: // aup_Latn_PG
+        case 0xC28049444C61746ELLU: // auq_Latn_ID
+        case 0xC68050474C61746ELLU: // aur_Latn_PG
+        case 0xCE8050464C61746ELLU: // aut_Latn_PF
+        case 0xD28049444C61746ELLU: // auu_Latn_ID
+        case 0xDA8049444C61746ELLU: // auw_Latn_ID
+        case 0xE28050474C61746ELLU: // auy_Latn_PG
+        case 0xE680555A41726162LLU: // auz_Arab_UZ
+        case 0x617652554379726CLLU: // av_Cyrl_RU
+        case 0x86A050474C61746ELLU: // avb_Latn_PG
+        case 0x8EA0495241726162LLU: // avd_Arab_IR
+        case 0xA2A043494C61746ELLU: // avi_Latn_CI
+        case 0xAEA0454741726162LLU: // avl_Arab_EG
+        case 0xB2A041554C61746ELLU: // avm_Latn_AU
+        case 0xB6A047484C61746ELLU: // avn_Latn_GH
+        case 0xBAA042524C61746ELLU: // avo_Latn_BR
+        case 0xCAA050454C61746ELLU: // avs_Latn_PE
+        case 0xCEA050474C61746ELLU: // avt_Latn_PG
+        case 0xD2A053534C61746ELLU: // avu_Latn_SS
+        case 0xD6A042524C61746ELLU: // avv_Latn_BR
+        case 0x82C0494E44657661LLU: // awa_Deva_IN
+        case 0x86C050474C61746ELLU: // awb_Latn_PG
+        case 0x8AC04E474C61746ELLU: // awc_Latn_NG
+        case 0x92C042524C61746ELLU: // awe_Latn_BR
+        case 0x9AC041554C61746ELLU: // awg_Latn_AU
+        case 0x9EC049444C61746ELLU: // awh_Latn_ID
+        case 0xA2C050474C61746ELLU: // awi_Latn_PG
+        case 0xAAC041554C61746ELLU: // awk_Latn_AU
+        case 0xB2C050474C61746ELLU: // awm_Latn_PG
+        case 0xB6C0455445746869LLU: // awn_Ethi_ET
+        case 0xBAC04E474C61746ELLU: // awo_Latn_NG
+        case 0xC6C049444C61746ELLU: // awr_Latn_ID
+        case 0xCAC049444C61746ELLU: // aws_Latn_ID
+        case 0xCEC042524C61746ELLU: // awt_Latn_BR
+        case 0xD2C049444C61746ELLU: // awu_Latn_ID
+        case 0xD6C049444C61746ELLU: // awv_Latn_ID
+        case 0xDAC050474C61746ELLU: // aww_Latn_PG
+        case 0xDEC050474C61746ELLU: // awx_Latn_PG
+        case 0xE2C049444C61746ELLU: // awy_Latn_ID
+        case 0x86E041524C61746ELLU: // axb_Latn_AR
+        case 0x92E041554C61746ELLU: // axe_Latn_AU
+        case 0x9AE042524C61746ELLU: // axg_Latn_BR
+        case 0xAAE043464C61746ELLU: // axk_Latn_CF
+        case 0xAEE041554C61746ELLU: // axl_Latn_AU
+        case 0xB2E0414D41726D6ELLU: // axm_Armn_AM
+        case 0xDEE04E434C61746ELLU: // axx_Latn_NC
+        case 0x6179424F4C61746ELLU: // ay_Latn_BO
+        case 0x830050474C61746ELLU: // aya_Latn_PG
+        case 0x8700424A4C61746ELLU: // ayb_Latn_BJ
+        case 0x8B0050454C61746ELLU: // ayc_Latn_PE
+        case 0x8F0041554C61746ELLU: // ayd_Latn_AU
+        case 0x93004E474C61746ELLU: // aye_Latn_NG
+        case 0x9B0054474C61746ELLU: // ayg_Latn_TG
+        case 0x9F00594541726162LLU: // ayh_Arab_YE
+        case 0xA3004E474C61746ELLU: // ayi_Latn_NG
+        case 0xAB004E474C61746ELLU: // ayk_Latn_NG
+        case 0xAF004C5941726162LLU: // ayl_Arab_LY
+        case 0xB700594541726162LLU: // ayn_Arab_YE
+        case 0xBB0050594C61746ELLU: // ayo_Latn_PY
+        case 0xBF00495141726162LLU: // ayp_Arab_IQ
+        case 0xC30050474C61746ELLU: // ayq_Latn_PG
+        case 0xCB0050484C61746ELLU: // ays_Latn_PH
+        case 0xCF0050484C61746ELLU: // ayt_Latn_PH
+        case 0xD3004E474C61746ELLU: // ayu_Latn_NG
+        case 0xE70049444C61746ELLU: // ayz_Latn_ID
+        case 0x617A495241726162LLU: // az_Arab_IR
+        case 0x617A415A4C61746ELLU: // az_Latn_AZ
+        case 0x8720495241726162LLU: // azb_Arab_IR
+        case 0x8F204D584C61746ELLU: // azd_Latn_MX
+        case 0x9B204D584C61746ELLU: // azg_Latn_MX
+        case 0xB3204D584C61746ELLU: // azm_Latn_MX
+        case 0xB7204D584C61746ELLU: // azn_Latn_MX
+        case 0xBB20434D4C61746ELLU: // azo_Latn_CM
+        case 0xCF2050484C61746ELLU: // azt_Latn_PH
+        case 0xE7204D584C61746ELLU: // azz_Latn_MX
+        case 0x626152554379726CLLU: // ba_Cyrl_RU
+        case 0x800153424C61746ELLU: // baa_Latn_SB
+        case 0x840147574C61746ELLU: // bab_Latn_GW
+        case 0x880149444C61746ELLU: // bac_Latn_ID
+        case 0x900156454C61746ELLU: // bae_Latn_VE
+        case 0x9401434D4C61746ELLU: // baf_Latn_CM
+        case 0x9801434D4C61746ELLU: // bag_Latn_CM
+        case 0x9C0142534C61746ELLU: // bah_Latn_BS
+        case 0xA40149444C61746ELLU: // baj_Latn_ID
+        case 0xAC01504B41726162LLU: // bal_Arab_PK
+        case 0xB40149444C61746ELLU: // ban_Latn_ID
+        case 0xB801434F4C61746ELLU: // bao_Latn_CO
+        case 0xBC014E5044657661LLU: // bap_Deva_NP
+        case 0xBC01494E4B726169LLU: // bap_Krai_IN
+        case 0xC40141544C61746ELLU: // bar_Latn_AT
+        case 0xC801434D4C61746ELLU: // bas_Latn_CM
+        case 0xD0014E474C61746ELLU: // bau_Latn_NG
+        case 0xD401434D4C61746ELLU: // bav_Latn_CM
+        case 0xD801434D4C61746ELLU: // baw_Latn_CM
+        case 0xDC01434D42616D75LLU: // bax_Bamu_CM
+        case 0xE00149444C61746ELLU: // bay_Latn_ID
+        case 0x8021424A4C61746ELLU: // bba_Latn_BJ
+        case 0x842150474C61746ELLU: // bbb_Latn_PG
+        case 0x882149444C61746ELLU: // bbc_Latn_ID
+        case 0x8C2150474C61746ELLU: // bbd_Latn_PG
+        case 0x902143444C61746ELLU: // bbe_Latn_CD
+        case 0x942150474C61746ELLU: // bbf_Latn_PG
+        case 0x982147414C61746ELLU: // bbg_Latn_GA
+        case 0xA021434D4C61746ELLU: // bbi_Latn_CM
+        case 0xA421434D4C61746ELLU: // bbj_Latn_CM
+        case 0xA821434D4C61746ELLU: // bbk_Latn_CM
+        case 0xAC21474547656F72LLU: // bbl_Geor_GE
+        case 0xB02143444C61746ELLU: // bbm_Latn_CD
+        case 0xB42150474C61746ELLU: // bbn_Latn_PG
+        case 0xB82142464C61746ELLU: // bbo_Latn_BF
+        case 0xBC2143464C61746ELLU: // bbp_Latn_CF
+        case 0xC021434D4C61746ELLU: // bbq_Latn_CM
+        case 0xC42150474C61746ELLU: // bbr_Latn_PG
+        case 0xC8214E474C61746ELLU: // bbs_Latn_NG
+        case 0xCC214E474C61746ELLU: // bbt_Latn_NG
+        case 0xD0214E474C61746ELLU: // bbu_Latn_NG
+        case 0xD42150474C61746ELLU: // bbv_Latn_PG
+        case 0xD821434D4C61746ELLU: // bbw_Latn_CM
+        case 0xDC21434D4C61746ELLU: // bbx_Latn_CM
+        case 0xE021434D4C61746ELLU: // bby_Latn_CM
+        case 0x8041434E4C61746ELLU: // bca_Latn_CN
+        case 0x8441534E4C61746ELLU: // bcb_Latn_SN
+        case 0x8C4149444C61746ELLU: // bcd_Latn_ID
+        case 0x9041434D4C61746ELLU: // bce_Latn_CM
+        case 0x944150474C61746ELLU: // bcf_Latn_PG
+        case 0x9841474E4C61746ELLU: // bcg_Latn_GN
+        case 0x9C4150474C61746ELLU: // bch_Latn_PG
+        case 0xA04143494C61746ELLU: // bci_Latn_CI
+        case 0xA44141554C61746ELLU: // bcj_Latn_AU
+        case 0xA84141554C61746ELLU: // bck_Latn_AU
+        case 0xB04150474C61746ELLU: // bcm_Latn_PG
+        case 0xB4414E474C61746ELLU: // bcn_Latn_NG
+        case 0xB84150474C61746ELLU: // bco_Latn_PG
+        case 0xBC4143444C61746ELLU: // bcp_Latn_CD
+        case 0xC041455445746869LLU: // bcq_Ethi_ET
+        case 0xC44143414C61746ELLU: // bcr_Latn_CA
+        case 0xC8414E474C61746ELLU: // bcs_Latn_NG
+        case 0xCC4143444C61746ELLU: // bct_Latn_CD
+        case 0xD04150474C61746ELLU: // bcu_Latn_PG
+        case 0xD4414E474C61746ELLU: // bcv_Latn_NG
+        case 0xD841434D4C61746ELLU: // bcw_Latn_CM
+        case 0xE0414E474C61746ELLU: // bcy_Latn_NG
+        case 0xE441534E4C61746ELLU: // bcz_Latn_SN
+        case 0x8061534E4C61746ELLU: // bda_Latn_SN
+        case 0x846149444C61746ELLU: // bdb_Latn_ID
+        case 0x8861434F4C61746ELLU: // bdc_Latn_CO
+        case 0x8C6150474C61746ELLU: // bdd_Latn_PG
+        case 0x90614E474C61746ELLU: // bde_Latn_NG
+        case 0x946150474C61746ELLU: // bdf_Latn_PG
+        case 0x98614D594C61746ELLU: // bdg_Latn_MY
+        case 0x9C6153534C61746ELLU: // bdh_Latn_SS
+        case 0xA06153444C61746ELLU: // bdi_Latn_SD
+        case 0xA46153534C61746ELLU: // bdj_Latn_SS
+        case 0xA861415A4C61746ELLU: // bdk_Latn_AZ
+        case 0xAC6149444C61746ELLU: // bdl_Latn_ID
+        case 0xB06154444C61746ELLU: // bdm_Latn_TD
+        case 0xB461434D4C61746ELLU: // bdn_Latn_CM
+        case 0xB86154444C61746ELLU: // bdo_Latn_TD
+        case 0xBC61545A4C61746ELLU: // bdp_Latn_TZ
+        case 0xC061564E4C61746ELLU: // bdq_Latn_VN
+        case 0xC4614D594C61746ELLU: // bdr_Latn_MY
+        case 0xC861545A4C61746ELLU: // bds_Latn_TZ
+        case 0xCC6143464C61746ELLU: // bdt_Latn_CF
+        case 0xD061434D4C61746ELLU: // bdu_Latn_CM
+        case 0xD461494E4F727961LLU: // bdv_Orya_IN
+        case 0xD86149444C61746ELLU: // bdw_Latn_ID
+        case 0xDC6149444C61746ELLU: // bdx_Latn_ID
+        case 0xE06141554C61746ELLU: // bdy_Latn_AU
+        case 0xE461504B41726162LLU: // bdz_Arab_PK
+        case 0x626542594379726CLLU: // be_Cyrl_BY
+        case 0x808143414C61746ELLU: // bea_Latn_CA
+        case 0x8481434D4C61746ELLU: // beb_Latn_CM
+        case 0x8881434D4C61746ELLU: // bec_Latn_CM
+        case 0x8C8149444C61746ELLU: // bed_Latn_ID
+        case 0x9081494E44657661LLU: // bee_Deva_IN
+        case 0x948150474C61746ELLU: // bef_Latn_PG
+        case 0x9C81424A4C61746ELLU: // beh_Latn_BJ
+        case 0xA08149444C61746ELLU: // bei_Latn_ID
+        case 0xA481534441726162LLU: // bej_Arab_SD
+        case 0xA88150474C61746ELLU: // bek_Latn_PG
+        case 0xB0815A4D4C61746ELLU: // bem_Latn_ZM
+        case 0xB88150474C61746ELLU: // beo_Latn_PG
+        case 0xBC8149444C61746ELLU: // bep_Latn_ID
+        case 0xC08143474C61746ELLU: // beq_Latn_CG
+        case 0xC88154444C61746ELLU: // bes_Latn_TD
+        case 0xCC8143494C61746ELLU: // bet_Latn_CI
+        case 0xD08149444C61746ELLU: // beu_Latn_ID
+        case 0xD48143494C61746ELLU: // bev_Latn_CI
+        case 0xD88149444C61746ELLU: // bew_Latn_ID
+        case 0xDC8153534C61746ELLU: // bex_Latn_SS
+        case 0xE08150474C61746ELLU: // bey_Latn_PG
+        case 0xE481545A4C61746ELLU: // bez_Latn_TZ
+        case 0x80A153534C61746ELLU: // bfa_Latn_SS
+        case 0x84A1494E44657661LLU: // bfb_Deva_IN
+        case 0x88A1434E4C61746ELLU: // bfc_Latn_CN
+        case 0x8CA1434D4C61746ELLU: // bfd_Latn_CM
+        case 0x90A149444C61746ELLU: // bfe_Latn_ID
+        case 0x94A143464C61746ELLU: // bff_Latn_CF
+        case 0x98A149444C61746ELLU: // bfg_Latn_ID
+        case 0x9CA150474C61746ELLU: // bfh_Latn_PG
+        case 0xA4A1434D4C61746ELLU: // bfj_Latn_CM
+        case 0xACA143464C61746ELLU: // bfl_Latn_CF
+        case 0xB0A1434D4C61746ELLU: // bfm_Latn_CM
+        case 0xB4A1544C4C61746ELLU: // bfn_Latn_TL
+        case 0xB8A142464C61746ELLU: // bfo_Latn_BF
+        case 0xBCA1434D4C61746ELLU: // bfp_Latn_CM
+        case 0xC0A1494E54616D6CLLU: // bfq_Taml_IN
+        case 0xC8A1434E4C61746ELLU: // bfs_Latn_CN
+        case 0xCCA1504B41726162LLU: // bft_Arab_PK
+        case 0xD0A1494E54696274LLU: // bfu_Tibt_IN
+        case 0xD8A1494E4F727961LLU: // bfw_Orya_IN
+        case 0xDCA150484C61746ELLU: // bfx_Latn_PH
+        case 0xE0A1494E44657661LLU: // bfy_Deva_IN
+        case 0xE4A1494E44657661LLU: // bfz_Deva_IN
+        case 0x626742474379726CLLU: // bg_Cyrl_BG
+        case 0x80C14E474C61746ELLU: // bga_Latn_NG
+        case 0x84C149444C61746ELLU: // bgb_Latn_ID
+        case 0x88C1494E44657661LLU: // bgc_Deva_IN
+        case 0x8CC1494E44657661LLU: // bgd_Deva_IN
+        case 0x94C1434D4C61746ELLU: // bgf_Latn_CM
+        case 0x98C1494E4C61746ELLU: // bgg_Latn_IN
+        case 0xA0C150484C61746ELLU: // bgi_Latn_PH
+        case 0xA4C1434D4C61746ELLU: // bgj_Latn_CM
+        case 0xB4C1504B41726162LLU: // bgn_Arab_PK
+        case 0xB8C1474E4C61746ELLU: // bgo_Latn_GN
+        case 0xBCC1504B41726162LLU: // bgp_Arab_PK
+        case 0xC0C1494E44657661LLU: // bgq_Deva_IN
+        case 0xC4C1494E4C61746ELLU: // bgr_Latn_IN
+        case 0xC8C150484C61746ELLU: // bgs_Latn_PH
+        case 0xCCC153424C61746ELLU: // bgt_Latn_SB
+        case 0xD0C14E474C61746ELLU: // bgu_Latn_NG
+        case 0xD4C149444C61746ELLU: // bgv_Latn_ID
+        case 0xD8C1494E44657661LLU: // bgw_Deva_IN
+        case 0xDCC154524772656BLLU: // bgx_Grek_TR
+        case 0xE0C149444C61746ELLU: // bgy_Latn_ID
+        case 0xE4C149444C61746ELLU: // bgz_Latn_ID
+        case 0x80E1494E44657661LLU: // bha_Deva_IN
+        case 0x84E1494E44657661LLU: // bhb_Deva_IN
+        case 0x88E149444C61746ELLU: // bhc_Latn_ID
+        case 0x8CE1494E44657661LLU: // bhd_Deva_IN
+        case 0x90E1504B41726162LLU: // bhe_Arab_PK
+        case 0x94E150474C61746ELLU: // bhf_Latn_PG
+        case 0x98E150474C61746ELLU: // bhg_Latn_PG
+        case 0x9CE1494C4379726CLLU: // bhh_Cyrl_IL
+        case 0xA0E1494E44657661LLU: // bhi_Deva_IN
+        case 0xA4E14E5044657661LLU: // bhj_Deva_NP
+        case 0xACE150474C61746ELLU: // bhl_Latn_PG
+        case 0xB0E14F4D41726162LLU: // bhm_Arab_OM
+        case 0xB4E1474553797263LLU: // bhn_Syrc_GE
+        case 0xB8E1494E44657661LLU: // bho_Deva_IN
+        case 0xBCE149444C61746ELLU: // bhp_Latn_ID
+        case 0xC0E149444C61746ELLU: // bhq_Latn_ID
+        case 0xC4E14D474C61746ELLU: // bhr_Latn_MG
+        case 0xC8E1434D4C61746ELLU: // bhs_Latn_CM
+        case 0xCCE1494E44657661LLU: // bht_Deva_IN
+        case 0xD0E1494E44657661LLU: // bhu_Deva_IN
+        case 0xD4E149444C61746ELLU: // bhv_Latn_ID
+        case 0xD8E149444C61746ELLU: // bhw_Latn_ID
+        case 0xE0E143444C61746ELLU: // bhy_Latn_CD
+        case 0xE4E149444C61746ELLU: // bhz_Latn_ID
+        case 0x626956554C61746ELLU: // bi_Latn_VU
+        case 0x810141554C61746ELLU: // bia_Latn_AU
+        case 0x850142464C61746ELLU: // bib_Latn_BF
+        case 0x8D0154444C61746ELLU: // bid_Latn_TD
+        case 0x910150474C61746ELLU: // bie_Latn_PG
+        case 0x950147574C61746ELLU: // bif_Latn_GW
+        case 0x990150474C61746ELLU: // big_Latn_PG
+        case 0xA90150484C61746ELLU: // bik_Latn_PH
+        case 0xAD014E474C61746ELLU: // bil_Latn_NG
+        case 0xB10147484C61746ELLU: // bim_Latn_GH
+        case 0xB5014E474C61746ELLU: // bin_Latn_NG
+        case 0xB90150474C61746ELLU: // bio_Latn_PG
+        case 0xBD0143444C61746ELLU: // bip_Latn_CD
+        case 0xC10150474C61746ELLU: // biq_Latn_PG
+        case 0xC50150474C61746ELLU: // bir_Latn_PG
+        case 0xCD0150474C61746ELLU: // bit_Latn_PG
+        case 0xD101494E4C61746ELLU: // biu_Latn_IN
+        case 0xD50147484C61746ELLU: // biv_Latn_GH
+        case 0xD901434D4C61746ELLU: // biw_Latn_CM
+        case 0xE101494E44657661LLU: // biy_Deva_IN
+        case 0xE50143444C61746ELLU: // biz_Latn_CD
+        case 0x812143444C61746ELLU: // bja_Latn_CD
+        case 0x852141554C61746ELLU: // bjb_Latn_AU
+        case 0x892150474C61746ELLU: // bjc_Latn_PG
+        case 0x9521494C53797263LLU: // bjf_Syrc_IL
+        case 0x992147574C61746ELLU: // bjg_Latn_GW
+        case 0x9D2150474C61746ELLU: // bjh_Latn_PG
+        case 0xA12145544C61746ELLU: // bji_Latn_ET
+        case 0xA521494E44657661LLU: // bjj_Deva_IN
+        case 0xA92150474C61746ELLU: // bjk_Latn_PG
+        case 0xAD2150474C61746ELLU: // bjl_Latn_PG
+        case 0xB121495141726162LLU: // bjm_Arab_IQ
+        case 0xB52149444C61746ELLU: // bjn_Latn_ID
+        case 0xB92143464C61746ELLU: // bjo_Latn_CF
+        case 0xBD2150474C61746ELLU: // bjp_Latn_PG
+        case 0xC52150474C61746ELLU: // bjr_Latn_PG
+        case 0xC92142424C61746ELLU: // bjs_Latn_BB
+        case 0xCD21534E4C61746ELLU: // bjt_Latn_SN
+        case 0xD121434D4C61746ELLU: // bju_Latn_CM
+        case 0xD52154444C61746ELLU: // bjv_Latn_TD
+        case 0xD92143494C61746ELLU: // bjw_Latn_CI
+        case 0xDD2150484C61746ELLU: // bjx_Latn_PH
+        case 0xE12141554C61746ELLU: // bjy_Latn_AU
+        case 0xE52150474C61746ELLU: // bjz_Latn_PG
+        case 0x81414E474C61746ELLU: // bka_Latn_NG
+        case 0x8941434D4C61746ELLU: // bkc_Latn_CM
+        case 0x8D4150484C61746ELLU: // bkd_Latn_PH
+        case 0x954143444C61746ELLU: // bkf_Latn_CD
+        case 0x994143464C61746ELLU: // bkg_Latn_CF
+        case 0x9D41434D4C61746ELLU: // bkh_Latn_CM
+        case 0xA14156554C61746ELLU: // bki_Latn_VU
+        case 0xA54143464C61746ELLU: // bkj_Latn_CF
+        case 0xA941494E54696274LLU: // bkk_Tibt_IN
+        case 0xAD4149444C61746ELLU: // bkl_Latn_ID
+        case 0xB141434D4C61746ELLU: // bkm_Latn_CM
+        case 0xB54149444C61746ELLU: // bkn_Latn_ID
+        case 0xB941434D4C61746ELLU: // bko_Latn_CM
+        case 0xBD4143444C61746ELLU: // bkp_Latn_CD
+        case 0xC14142524C61746ELLU: // bkq_Latn_BR
+        case 0xC54149444C61746ELLU: // bkr_Latn_ID
+        case 0xC94150484C61746ELLU: // bks_Latn_PH
+        case 0xCD4143444C61746ELLU: // bkt_Latn_CD
+        case 0xD14150484C61746ELLU: // bku_Latn_PH
+        case 0xD5414E474C61746ELLU: // bkv_Latn_NG
+        case 0xD94143474C61746ELLU: // bkw_Latn_CG
+        case 0xDD41544C4C61746ELLU: // bkx_Latn_TL
+        case 0xE1414E474C61746ELLU: // bky_Latn_NG
+        case 0xE54149444C61746ELLU: // bkz_Latn_ID
+        case 0x816143414C61746ELLU: // bla_Latn_CA
+        case 0x856153424C61746ELLU: // blb_Latn_SB
+        case 0x896143414C61746ELLU: // blc_Latn_CA
+        case 0x8D6149444C61746ELLU: // bld_Latn_ID
+        case 0x916147574C61746ELLU: // ble_Latn_GW
+        case 0x956149444C61746ELLU: // blf_Latn_ID
+        case 0x9D614C524C61746ELLU: // blh_Latn_LR
+        case 0xA16143444C61746ELLU: // bli_Latn_CD
+        case 0xA56149444C61746ELLU: // blj_Latn_ID
+        case 0xA9614D4D4D796D72LLU: // blk_Mymr_MM
+        case 0xB16153534C61746ELLU: // blm_Latn_SS
+        case 0xB56150484C61746ELLU: // bln_Latn_PH
+        case 0xB961424A4C61746ELLU: // blo_Latn_BJ
+        case 0xBD6153424C61746ELLU: // blp_Latn_SB
+        case 0xC16150474C61746ELLU: // blq_Latn_PG
+        case 0xC561434E4C61746ELLU: // blr_Latn_CN
+        case 0xC96149444C61746ELLU: // bls_Latn_ID
+        case 0xCD61564E54617674LLU: // blt_Tavt_VN
+        case 0xD561414F4C61746ELLU: // blv_Latn_AO
+        case 0xD96150484C61746ELLU: // blw_Latn_PH
+        case 0xDD6150484C61746ELLU: // blx_Latn_PH
+        case 0xE161424A4C61746ELLU: // bly_Latn_BJ
+        case 0xE56149444C61746ELLU: // blz_Latn_ID
+        case 0x626D4D4C4C61746ELLU: // bm_Latn_ML
+        case 0x81814E474C61746ELLU: // bma_Latn_NG
+        case 0x858143444C61746ELLU: // bmb_Latn_CD
+        case 0x898150474C61746ELLU: // bmc_Latn_PG
+        case 0x8D81474E4C61746ELLU: // bmd_Latn_GN
+        case 0x918143464C61746ELLU: // bme_Latn_CF
+        case 0x9581534C4C61746ELLU: // bmf_Latn_SL
+        case 0x998143444C61746ELLU: // bmg_Latn_CD
+        case 0x9D8150474C61746ELLU: // bmh_Latn_PG
+        case 0xA18154444C61746ELLU: // bmi_Latn_TD
+        case 0xA5814E5044657661LLU: // bmj_Deva_NP
+        case 0xA98150474C61746ELLU: // bmk_Latn_PG
+        case 0xAD8143444C61746ELLU: // bml_Latn_CD
+        case 0xB1814D474C61746ELLU: // bmm_Latn_MG
+        case 0xB58150474C61746ELLU: // bmn_Latn_PG
+        case 0xB981434D4C61746ELLU: // bmo_Latn_CM
+        case 0xBD8150474C61746ELLU: // bmp_Latn_PG
+        case 0xC1814D4C4C61746ELLU: // bmq_Latn_ML
+        case 0xC581434F4C61746ELLU: // bmr_Latn_CO
+        case 0xC9814E454C61746ELLU: // bms_Latn_NE
+        case 0xD18150474C61746ELLU: // bmu_Latn_PG
+        case 0xD581434D4C61746ELLU: // bmv_Latn_CM
+        case 0xD98143474C61746ELLU: // bmw_Latn_CG
+        case 0xDD8150474C61746ELLU: // bmx_Latn_PG
+        case 0xE58150474C61746ELLU: // bmz_Latn_PG
+        case 0x626E424442656E67LLU: // bn_Beng_BD
+        case 0x81A149444C61746ELLU: // bna_Latn_ID
+        case 0x85A14D594C61746ELLU: // bnb_Latn_MY
+        case 0x89A150484C61746ELLU: // bnc_Latn_PH
+        case 0x8DA149444C61746ELLU: // bnd_Latn_ID
+        case 0x91A149444C61746ELLU: // bne_Latn_ID
+        case 0x95A149444C61746ELLU: // bnf_Latn_ID
+        case 0x99A147514C61746ELLU: // bng_Latn_GQ
+        case 0xA1A143444C61746ELLU: // bni_Latn_CD
+        case 0xA5A150484C61746ELLU: // bnj_Latn_PH
+        case 0xA9A156554C61746ELLU: // bnk_Latn_VU
+        case 0xB1A147514C61746ELLU: // bnm_Latn_GQ
+        case 0xB5A154574C61746ELLU: // bnn_Latn_TW
+        case 0xB9A150484C61746ELLU: // bno_Latn_PH
+        case 0xBDA150474C61746ELLU: // bnp_Latn_PG
+        case 0xC1A149444C61746ELLU: // bnq_Latn_ID
+        case 0xC5A156554C61746ELLU: // bnr_Latn_VU
+        case 0xC9A1494E44657661LLU: // bns_Deva_IN
+        case 0xD1A149444C61746ELLU: // bnu_Latn_ID
+        case 0xD5A149444C61746ELLU: // bnv_Latn_ID
+        case 0xD9A150474C61746ELLU: // bnw_Latn_PG
+        case 0xDDA143444C61746ELLU: // bnx_Latn_CD
+        case 0xE1A14D594C61746ELLU: // bny_Latn_MY
+        case 0xE5A1434D4C61746ELLU: // bnz_Latn_CM
+        case 0x626F434E54696274LLU: // bo_Tibt_CN
+        case 0x81C150454C61746ELLU: // boa_Latn_PE
+        case 0x85C14B454C61746ELLU: // bob_Latn_KE
+        case 0x91C1434D4C61746ELLU: // boe_Latn_CM
+        case 0x95C142464C61746ELLU: // bof_Latn_BF
+        case 0x9DC143444C61746ELLU: // boh_Latn_CD
+        case 0xA5C150474C61746ELLU: // boj_Latn_PG
+        case 0xA9C143474C61746ELLU: // bok_Latn_CG
+        case 0xADC14E474C61746ELLU: // bol_Latn_NG
+        case 0xB1C14E474C61746ELLU: // bom_Latn_NG
+        case 0xB5C150474C61746ELLU: // bon_Latn_PG
+        case 0xB9C14D4C4C61746ELLU: // boo_Latn_ML
+        case 0xBDC150474C61746ELLU: // bop_Latn_PG
+        case 0xC1C150474C61746ELLU: // boq_Latn_PG
+        case 0xC5C142524C61746ELLU: // bor_Latn_BR
+        case 0xCDC153534C61746ELLU: // bot_Latn_SS
+        case 0xD1C1545A4C61746ELLU: // bou_Latn_TZ
+        case 0xD5C147484C61746ELLU: // bov_Latn_GH
+        case 0xD9C150474C61746ELLU: // bow_Latn_PG
+        case 0xDDC142464C61746ELLU: // box_Latn_BF
+        case 0xE1C143464C61746ELLU: // boy_Latn_CF
+        case 0xE5C14D4C4C61746ELLU: // boz_Latn_ML
+        case 0x81E156554C61746ELLU: // bpa_Latn_VU
+        case 0x89E1434D4C61746ELLU: // bpc_Latn_CM
+        case 0x8DE143464C61746ELLU: // bpd_Latn_CF
+        case 0x91E150474C61746ELLU: // bpe_Latn_PG
+        case 0x99E149444C61746ELLU: // bpg_Latn_ID
+        case 0x9DE152554379726CLLU: // bph_Cyrl_RU
+        case 0xA1E150474C61746ELLU: // bpi_Latn_PG
+        case 0xA5E143444C61746ELLU: // bpj_Latn_CD
+        case 0xA9E14E434C61746ELLU: // bpk_Latn_NC
+        case 0xADE141554C61746ELLU: // bpl_Latn_AU
+        case 0xB1E150474C61746ELLU: // bpm_Latn_PG
+        case 0xB9E149444C61746ELLU: // bpo_Latn_ID
+        case 0xBDE149444C61746ELLU: // bpp_Latn_ID
+        case 0xC1E149444C61746ELLU: // bpq_Latn_ID
+        case 0xC5E150484C61746ELLU: // bpr_Latn_PH
+        case 0xC9E150484C61746ELLU: // bps_Latn_PH
+        case 0xCDE141554C61746ELLU: // bpt_Latn_AU
+        case 0xD1E150474C61746ELLU: // bpu_Latn_PG
+        case 0xD5E149444C61746ELLU: // bpv_Latn_ID
+        case 0xD9E150474C61746ELLU: // bpw_Latn_PG
+        case 0xDDE1494E44657661LLU: // bpx_Deva_IN
+        case 0xE1E1494E42656E67LLU: // bpy_Beng_IN
+        case 0xE5E149444C61746ELLU: // bpz_Latn_ID
+        case 0x8201424A4C61746ELLU: // bqa_Latn_BJ
+        case 0x860149444C61746ELLU: // bqb_Latn_ID
+        case 0x8A01424A4C61746ELLU: // bqc_Latn_BJ
+        case 0x8E01434D4C61746ELLU: // bqd_Latn_CM
+        case 0x9601474E4C61746ELLU: // bqf_Latn_GN
+        case 0x9A0154474C61746ELLU: // bqg_Latn_TG
+        case 0xA201495241726162LLU: // bqi_Arab_IR
+        case 0xA601534E4C61746ELLU: // bqj_Latn_SN
+        case 0xAA0143464C61746ELLU: // bqk_Latn_CF
+        case 0xAE0150474C61746ELLU: // bql_Latn_PG
+        case 0xB201434D4C61746ELLU: // bqm_Latn_CM
+        case 0xBA01434D4C61746ELLU: // bqo_Latn_CM
+        case 0xBE014E474C61746ELLU: // bqp_Latn_NG
+        case 0xC20149444C61746ELLU: // bqq_Latn_ID
+        case 0xC60149444C61746ELLU: // bqr_Latn_ID
+        case 0xCA0150474C61746ELLU: // bqs_Latn_PG
+        case 0xCE01434D4C61746ELLU: // bqt_Latn_CM
+        case 0xD20143444C61746ELLU: // bqu_Latn_CD
+        case 0xD60143494C61746ELLU: // bqv_Latn_CI
+        case 0xDA014E474C61746ELLU: // bqw_Latn_NG
+        case 0xDE014E474C61746ELLU: // bqx_Latn_NG
+        case 0xE601434D4C61746ELLU: // bqz_Latn_CM
+        case 0x627246524C61746ELLU: // br_Latn_FR
+        case 0x8221494E44657661LLU: // bra_Deva_IN
+        case 0x86214B484B686D72LLU: // brb_Khmr_KH
+        case 0x8A2147594C61746ELLU: // brc_Latn_GY
+        case 0x8E214E5044657661LLU: // brd_Deva_NP
+        case 0x962143444C61746ELLU: // brf_Latn_CD
+        case 0x9A21424F4C61746ELLU: // brg_Latn_BO
+        case 0x9E21504B41726162LLU: // brh_Arab_PK
+        case 0xA221434D4C61746ELLU: // bri_Latn_CM
+        case 0xA62156554C61746ELLU: // brj_Latn_VU
+        case 0xAA21534441726162LLU: // brk_Arab_SD
+        case 0xAE2142574C61746ELLU: // brl_Latn_BW
+        case 0xB22143444C61746ELLU: // brm_Latn_CD
+        case 0xB62143524C61746ELLU: // brn_Latn_CR
+        case 0xBA21425454696274LLU: // bro_Tibt_BT
+        case 0xBE2149444C61746ELLU: // brp_Latn_ID
+        case 0xC22150474C61746ELLU: // brq_Latn_PG
+        case 0xC62153424C61746ELLU: // brr_Latn_SB
+        case 0xCA2149444C61746ELLU: // brs_Latn_ID
+        case 0xCE214E474C61746ELLU: // brt_Latn_NG
+        case 0xD221564E4C61746ELLU: // bru_Latn_VN
+        case 0xD6214C414C616F6FLLU: // brv_Laoo_LA
+        case 0xDA21494E4B6E6461LLU: // brw_Knda_IN
+        case 0xDE21494E44657661LLU: // brx_Deva_IN
+        case 0xE22150474C61746ELLU: // bry_Latn_PG
+        case 0xE62150474C61746ELLU: // brz_Latn_PG
+        case 0x627342414C61746ELLU: // bs_Latn_BA
+        case 0x824149444C61746ELLU: // bsa_Latn_ID
+        case 0x8641424E4C61746ELLU: // bsb_Latn_BN
+        case 0x8A41534E4C61746ELLU: // bsc_Latn_SN
+        case 0x9241434D4C61746ELLU: // bse_Latn_CM
+        case 0x96414E474C61746ELLU: // bsf_Latn_NG
+        case 0x9E41414641726162LLU: // bsh_Arab_AF
+        case 0xA241434D4C61746ELLU: // bsi_Latn_CM
+        case 0xA6414E474C61746ELLU: // bsj_Latn_NG
+        case 0xAA41504B41726162LLU: // bsk_Arab_PK
+        case 0xAE414E474C61746ELLU: // bsl_Latn_NG
+        case 0xB24149444C61746ELLU: // bsm_Latn_ID
+        case 0xB641434F4C61746ELLU: // bsn_Latn_CO
+        case 0xBA4154444C61746ELLU: // bso_Latn_TD
+        case 0xBE41474E4C61746ELLU: // bsp_Latn_GN
+        case 0xC2414C5242617373LLU: // bsq_Bass_LR
+        case 0xC6414E474C61746ELLU: // bsr_Latn_NG
+        case 0xCA41434D4C61746ELLU: // bss_Latn_CM
+        case 0xCE41455445746869LLU: // bst_Ethi_ET
+        case 0xD24149444C61746ELLU: // bsu_Latn_ID
+        case 0xD641474E4C61746ELLU: // bsv_Latn_GN
+        case 0xDA4145544C61746ELLU: // bsw_Latn_ET
+        case 0xDE414E474C61746ELLU: // bsx_Latn_NG
+        case 0xE2414D594C61746ELLU: // bsy_Latn_MY
+        case 0x82614E474C61746ELLU: // bta_Latn_NG
+        case 0x8A61434D4C61746ELLU: // btc_Latn_CM
+        case 0x8E6149444261746BLLU: // btd_Batk_ID
+        case 0x92614E474C61746ELLU: // bte_Latn_NG
+        case 0x966154444C61746ELLU: // btf_Latn_TD
+        case 0x9A6143494C61746ELLU: // btg_Latn_CI
+        case 0x9E614D594C61746ELLU: // bth_Latn_MY
+        case 0xA26149444C61746ELLU: // bti_Latn_ID
+        case 0xA66149444C61746ELLU: // btj_Latn_ID
+        case 0xB26149444261746BLLU: // btm_Batk_ID
+        case 0xB66150484C61746ELLU: // btn_Latn_PH
+        case 0xBA6150484C61746ELLU: // bto_Latn_PH
+        case 0xBE6150474C61746ELLU: // btp_Latn_PG
+        case 0xC2614D594C61746ELLU: // btq_Latn_MY
+        case 0xC66156554C61746ELLU: // btr_Latn_VU
+        case 0xCA6149444C61746ELLU: // bts_Latn_ID
+        case 0xCE614E474C61746ELLU: // btt_Latn_NG
+        case 0xD2614E474C61746ELLU: // btu_Latn_NG
+        case 0xD661504B44657661LLU: // btv_Deva_PK
+        case 0xDA6150484C61746ELLU: // btw_Latn_PH
+        case 0xDE6149444C61746ELLU: // btx_Latn_ID
+        case 0xE26149444C61746ELLU: // bty_Latn_ID
+        case 0xE66149444C61746ELLU: // btz_Latn_ID
+        case 0x828152554379726CLLU: // bua_Cyrl_RU
+        case 0x868154444C61746ELLU: // bub_Latn_TD
+        case 0x8A8159544C61746ELLU: // buc_Latn_YT
+        case 0x8E8154474C61746ELLU: // bud_Latn_TG
+        case 0x928143414C61746ELLU: // bue_Latn_CA
+        case 0x968143444C61746ELLU: // buf_Latn_CD
+        case 0x9A8149444C61746ELLU: // bug_Latn_ID
+        case 0x9E81434E4C61746ELLU: // buh_Latn_CN
+        case 0xA28143474C61746ELLU: // bui_Latn_CG
+        case 0xA6814E474C61746ELLU: // buj_Latn_NG
+        case 0xAA8150474C61746ELLU: // buk_Latn_PG
+        case 0xB281434D4C61746ELLU: // bum_Latn_CM
+        case 0xB681534C4C61746ELLU: // bun_Latn_SL
+        case 0xBA8150474C61746ELLU: // buo_Latn_PG
+        case 0xBE8149444C61746ELLU: // bup_Latn_ID
+        case 0xC28150474C61746ELLU: // buq_Latn_PG
+        case 0xCA814E474C61746ELLU: // bus_Latn_NG
+        case 0xCE8150474C61746ELLU: // but_Latn_PG
+        case 0xD28143444C61746ELLU: // buu_Latn_CD
+        case 0xD68150474C61746ELLU: // buv_Latn_PG
+        case 0xDA8147414C61746ELLU: // buw_Latn_GA
+        case 0xDE814E474C61746ELLU: // bux_Latn_NG
+        case 0xE281534C4C61746ELLU: // buy_Latn_SL
+        case 0xE6814E474C61746ELLU: // buz_Latn_NG
+        case 0x82A154444C61746ELLU: // bva_Latn_TD
+        case 0x86A147514C61746ELLU: // bvb_Latn_GQ
+        case 0x8AA153424C61746ELLU: // bvc_Latn_SB
+        case 0x8EA153424C61746ELLU: // bvd_Latn_SB
+        case 0x92A149444C61746ELLU: // bve_Latn_ID
+        case 0x96A154444C61746ELLU: // bvf_Latn_TD
+        case 0x9AA1434D4C61746ELLU: // bvg_Latn_CM
+        case 0x9EA14E474C61746ELLU: // bvh_Latn_NG
+        case 0xA2A153534C61746ELLU: // bvi_Latn_SS
+        case 0xA6A14E474C61746ELLU: // bvj_Latn_NG
+        case 0xAAA149444C61746ELLU: // bvk_Latn_ID
+        case 0xB2A1434D4C61746ELLU: // bvm_Latn_CM
+        case 0xB6A150474C61746ELLU: // bvn_Latn_PG
+        case 0xBAA154444C61746ELLU: // bvo_Latn_TD
+        case 0xC2A143464C61746ELLU: // bvq_Latn_CF
+        case 0xC6A141554C61746ELLU: // bvr_Latn_AU
+        case 0xCEA149444C61746ELLU: // bvt_Latn_ID
+        case 0xD2A149444C61746ELLU: // bvu_Latn_ID
+        case 0xD6A156454C61746ELLU: // bvv_Latn_VE
+        case 0xDAA14E474C61746ELLU: // bvw_Latn_NG
+        case 0xDEA143474C61746ELLU: // bvx_Latn_CG
+        case 0xE2A150484C61746ELLU: // bvy_Latn_PH
+        case 0xE6A149444C61746ELLU: // bvz_Latn_ID
+        case 0x82C14E434C61746ELLU: // bwa_Latn_NC
+        case 0x86C1464A4C61746ELLU: // bwb_Latn_FJ
+        case 0x8AC15A4D4C61746ELLU: // bwc_Latn_ZM
+        case 0x8EC150474C61746ELLU: // bwd_Latn_PG
+        case 0x92C14D4D4D796D72LLU: // bwe_Mymr_MM
+        case 0x96C150474C61746ELLU: // bwf_Latn_PG
+        case 0x9AC14D5A4C61746ELLU: // bwg_Latn_MZ
+        case 0x9EC1434D4C61746ELLU: // bwh_Latn_CM
+        case 0xA2C156454C61746ELLU: // bwi_Latn_VE
+        case 0xA6C142464C61746ELLU: // bwj_Latn_BF
+        case 0xAAC150474C61746ELLU: // bwk_Latn_PG
+        case 0xAEC143444C61746ELLU: // bwl_Latn_CD
+        case 0xB2C150474C61746ELLU: // bwm_Latn_PG
+        case 0xBAC145544C61746ELLU: // bwo_Latn_ET
+        case 0xBEC149444C61746ELLU: // bwp_Latn_ID
+        case 0xC2C142464C61746ELLU: // bwq_Latn_BF
+        case 0xC6C14E474C61746ELLU: // bwr_Latn_NG
+        case 0xCAC143444C61746ELLU: // bws_Latn_CD
+        case 0xCEC1434D4C61746ELLU: // bwt_Latn_CM
+        case 0xD2C147484C61746ELLU: // bwu_Latn_GH
+        case 0xDAC143444C61746ELLU: // bww_Latn_CD
+        case 0xDEC1434E4C61746ELLU: // bwx_Latn_CN
+        case 0xE2C142464C61746ELLU: // bwy_Latn_BF
+        case 0xE6C143474C61746ELLU: // bwz_Latn_CG
+        case 0x82E153424C61746ELLU: // bxa_Latn_SB
+        case 0x86E153534C61746ELLU: // bxb_Latn_SS
+        case 0x8AE147514C61746ELLU: // bxc_Latn_GQ
+        case 0x96E150474C61746ELLU: // bxf_Latn_PG
+        case 0x9AE143444C61746ELLU: // bxg_Latn_CD
+        case 0x9EE150474C61746ELLU: // bxh_Latn_PG
+        case 0xA2E141554C61746ELLU: // bxi_Latn_AU
+        case 0xA6E141554C61746ELLU: // bxj_Latn_AU
+        case 0xAEE142464C61746ELLU: // bxl_Latn_BF
+        case 0xB2E14D4E4379726CLLU: // bxm_Cyrl_MN
+        case 0xB6E141554C61746ELLU: // bxn_Latn_AU
+        case 0xBAE14E474C61746ELLU: // bxo_Latn_NG
+        case 0xBEE1434D4C61746ELLU: // bxp_Latn_CM
+        case 0xC2E14E474C61746ELLU: // bxq_Latn_NG
+        case 0xCAE1434D4C61746ELLU: // bxs_Latn_CM
+        case 0xD2E1434E4D6F6E67LLU: // bxu_Mong_CN
+        case 0xD6E154444C61746ELLU: // bxv_Latn_TD
+        case 0xDAE14D4C4C61746ELLU: // bxw_Latn_ML
+        case 0xE6E150474C61746ELLU: // bxz_Latn_PG
+        case 0x830150484C61746ELLU: // bya_Latn_PH
+        case 0x8701434D4C61746ELLU: // byb_Latn_CM
+        case 0x8B014E474C61746ELLU: // byc_Latn_NG
+        case 0x8F0149444C61746ELLU: // byd_Latn_ID
+        case 0x930150474C61746ELLU: // bye_Latn_PG
+        case 0x97014E474C61746ELLU: // byf_Latn_NG
+        case 0x9F014E5044657661LLU: // byh_Deva_NP
+        case 0xA30143444C61746ELLU: // byi_Latn_CD
+        case 0xA7014E474C61746ELLU: // byj_Latn_NG
+        case 0xAB01434E4C61746ELLU: // byk_Latn_CN
+        case 0xAF0149444C61746ELLU: // byl_Latn_ID
+        case 0xB30141554C61746ELLU: // bym_Latn_AU
+        case 0xB701455245746869LLU: // byn_Ethi_ER
+        case 0xBF014E474C61746ELLU: // byp_Latn_NG
+        case 0xC70150474C61746ELLU: // byr_Latn_PG
+        case 0xCB014E474C61746ELLU: // bys_Latn_NG
+        case 0xD701434D4C61746ELLU: // byv_Latn_CM
+        case 0xDB014E5044657661LLU: // byw_Deva_NP
+        case 0xDF0150474C61746ELLU: // byx_Latn_PG
+        case 0xE70150474C61746ELLU: // byz_Latn_PG
+        case 0x83214C524C61746ELLU: // bza_Latn_LR
+        case 0x872149444C61746ELLU: // bzb_Latn_ID
+        case 0x8B214D474C61746ELLU: // bzc_Latn_MG
+        case 0x8F2143524C61746ELLU: // bzd_Latn_CR
+        case 0x93214D4C4C61746ELLU: // bze_Latn_ML
+        case 0x972150474C61746ELLU: // bzf_Latn_PG
+        case 0x9F2150474C61746ELLU: // bzh_Latn_PG
+        case 0xA321544854686169LLU: // bzi_Thai_TH
+        case 0xA721425A4C61746ELLU: // bzj_Latn_BZ
+        case 0xAB214E494C61746ELLU: // bzk_Latn_NI
+        case 0xAF2149444C61746ELLU: // bzl_Latn_ID
+        case 0xB32143444C61746ELLU: // bzm_Latn_CD
+        case 0xB72149444C61746ELLU: // bzn_Latn_ID
+        case 0xBB2143444C61746ELLU: // bzo_Latn_CD
+        case 0xBF2149444C61746ELLU: // bzp_Latn_ID
+        case 0xC32149444C61746ELLU: // bzq_Latn_ID
+        case 0xC72141554C61746ELLU: // bzr_Latn_AU
+        case 0xD32149444C61746ELLU: // bzu_Latn_ID
+        case 0xD721434D4C61746ELLU: // bzv_Latn_CM
+        case 0xDB214E474C61746ELLU: // bzw_Latn_NG
+        case 0xDF214D4C4C61746ELLU: // bzx_Latn_ML
+        case 0xE3214E474C61746ELLU: // bzy_Latn_NG
+        case 0xE7214E474C61746ELLU: // bzz_Latn_NG
+        case 0x636145534C61746ELLU: // ca_Latn_ES
+        case 0x800247544C61746ELLU: // caa_Latn_GT
+        case 0x8402484E4C61746ELLU: // cab_Latn_HN
+        case 0x880247544C61746ELLU: // cac_Latn_GT
+        case 0x8C0255534C61746ELLU: // cad_Latn_US
+        case 0x9002534E4C61746ELLU: // cae_Latn_SN
+        case 0x940243414C61746ELLU: // caf_Latn_CA
+        case 0x980250594C61746ELLU: // cag_Latn_PY
+        case 0x9C0250454C61746ELLU: // cah_Latn_PE
+        case 0xA402424F4C61746ELLU: // caj_Latn_BO
+        case 0xA80247544C61746ELLU: // cak_Latn_GT
+        case 0xAC024D504C61746ELLU: // cal_Latn_MP
+        case 0xB0024E434C61746ELLU: // cam_Latn_NC
+        case 0xB40250474C61746ELLU: // can_Latn_PG
+        case 0xB802424F4C61746ELLU: // cao_Latn_BO
+        case 0xBC02424F4C61746ELLU: // cap_Latn_BO
+        case 0xC002494E4C61746ELLU: // caq_Latn_IN
+        case 0xC40256454C61746ELLU: // car_Latn_VE
+        case 0xC802424F4C61746ELLU: // cas_Latn_BO
+        case 0xD402424F4C61746ELLU: // cav_Latn_BO
+        case 0xD802424F4C61746ELLU: // caw_Latn_BO
+        case 0xDC02424F4C61746ELLU: // cax_Latn_BO
+        case 0xE00243414C61746ELLU: // cay_Latn_CA
+        case 0xE402424F4C61746ELLU: // caz_Latn_BO
+        case 0x8422434F4C61746ELLU: // cbb_Latn_CO
+        case 0x8822434F4C61746ELLU: // cbc_Latn_CO
+        case 0x8C22434F4C61746ELLU: // cbd_Latn_CO
+        case 0x9822434F4C61746ELLU: // cbg_Latn_CO
+        case 0xA02245434C61746ELLU: // cbi_Latn_EC
+        case 0xA422424A4C61746ELLU: // cbj_Latn_BJ
+        case 0xA82250484C61746ELLU: // cbk_Latn_PH
+        case 0xAC224D4D4C61746ELLU: // cbl_Latn_MM
+        case 0xB422544854686169LLU: // cbn_Thai_TH
+        case 0xB8224E474C61746ELLU: // cbo_Latn_NG
+        case 0xC0224E474C61746ELLU: // cbq_Latn_NG
+        case 0xC42250454C61746ELLU: // cbr_Latn_PE
+        case 0xC82250454C61746ELLU: // cbs_Latn_PE
+        case 0xCC2250454C61746ELLU: // cbt_Latn_PE
+        case 0xD02250454C61746ELLU: // cbu_Latn_PE
+        case 0xD422434F4C61746ELLU: // cbv_Latn_CO
+        case 0xD82250484C61746ELLU: // cbw_Latn_PH
+        case 0xE022434F4C61746ELLU: // cby_Latn_CO
+        case 0x884250454C61746ELLU: // ccc_Latn_PE
+        case 0x8C4242524C61746ELLU: // ccd_Latn_BR
+        case 0x90424D5A4C61746ELLU: // cce_Latn_MZ
+        case 0x98424E474C61746ELLU: // ccg_Latn_NG
+        case 0x9C424E474C61746ELLU: // cch_Latn_NG
+        case 0xA44247574C61746ELLU: // ccj_Latn_GW
+        case 0xAC42545A4C61746ELLU: // ccl_Latn_TZ
+        case 0xB0424D594C61746ELLU: // ccm_Latn_MY
+        case 0xB8424D584C61746ELLU: // cco_Latn_MX
+        case 0xBC42424443616B6DLLU: // ccp_Cakm_BD
+        case 0xC44253564C61746ELLU: // ccr_Latn_SV
+        case 0x9062494E54656C75LLU: // cde_Telu_IN
+        case 0x9462494E4C61746ELLU: // cdf_Latn_IN
+        case 0x9C62494E44657661LLU: // cdh_Deva_IN
+        case 0xA062494E47756A72LLU: // cdi_Gujr_IN
+        case 0xA462494E44657661LLU: // cdj_Deva_IN
+        case 0xB0624E5044657661LLU: // cdm_Deva_NP
+        case 0xB862434E48616E73LLU: // cdo_Hans_CN
+        case 0xC4624E474C61746ELLU: // cdr_Latn_NG
+        case 0xE462494E42656E67LLU: // cdz_Beng_IN
+        case 0x636552554379726CLLU: // ce_Cyrl_RU
+        case 0x808255534C61746ELLU: // cea_Latn_US
+        case 0x848250484C61746ELLU: // ceb_Latn_PH
+        case 0x988250594C61746ELLU: // ceg_Latn_PY
+        case 0xA8824D4D4C61746ELLU: // cek_Latn_MM
+        case 0xB4824E474C61746ELLU: // cen_Latn_NG
+        case 0xCC824E474C61746ELLU: // cet_Latn_NG
+        case 0xE0824D4D4C61746ELLU: // cey_Latn_MM
+        case 0x80A24E474C61746ELLU: // cfa_Latn_NG
+        case 0x8CA24E474C61746ELLU: // cfd_Latn_NG
+        case 0x98A24E474C61746ELLU: // cfg_Latn_NG
+        case 0xB0A24D4D4C61746ELLU: // cfm_Latn_MM
+        case 0x80C250474C61746ELLU: // cga_Latn_PG
+        case 0x88C250484C61746ELLU: // cgc_Latn_PH
+        case 0x98C255474C61746ELLU: // cgg_Latn_UG
+        case 0xA8C2425454696274LLU: // cgk_Tibt_BT
+        case 0x636847554C61746ELLU: // ch_Latn_GU
+        case 0x84E2434F4C61746ELLU: // chb_Latn_CO
+        case 0x8CE24D584C61746ELLU: // chd_Latn_MX
+        case 0x94E24D584C61746ELLU: // chf_Latn_MX
+        case 0x98E2544D41726162LLU: // chg_Arab_TM
+        case 0x9CE255534C61746ELLU: // chh_Latn_US
+        case 0xA4E24D584C61746ELLU: // chj_Latn_MX
+        case 0xA8E2464D4C61746ELLU: // chk_Latn_FM
+        case 0xACE255534C61746ELLU: // chl_Latn_US
+        case 0xB0E252554379726CLLU: // chm_Cyrl_RU
+        case 0xB4E255534C61746ELLU: // chn_Latn_US
+        case 0xB8E255534C61746ELLU: // cho_Latn_US
+        case 0xBCE243414C61746ELLU: // chp_Latn_CA
+        case 0xC0E24D584C61746ELLU: // chq_Latn_MX
+        case 0xC4E2555343686572LLU: // chr_Cher_US
+        case 0xCCE250454C61746ELLU: // cht_Latn_PE
+        case 0xD8E24D5A4C61746ELLU: // chw_Latn_MZ
+        case 0xDCE24E5044657661LLU: // chx_Deva_NP
+        case 0xE0E255534C61746ELLU: // chy_Latn_US
+        case 0xE4E24D584C61746ELLU: // chz_Latn_MX
+        case 0x810249444C61746ELLU: // cia_Latn_ID
+        case 0x8502424A4C61746ELLU: // cib_Latn_BJ
+        case 0x890255534C61746ELLU: // cic_Latn_US
+        case 0x91024E474C61746ELLU: // cie_Latn_NG
+        case 0x9D02494E44657661LLU: // cih_Deva_IN
+        case 0xB10249544C61746ELLU: // cim_Latn_IT
+        case 0xB50242524C61746ELLU: // cin_Latn_BR
+        case 0xBD024D584C61746ELLU: // cip_Latn_MX
+        case 0xC5024E434C61746ELLU: // cir_Latn_NC
+        case 0xD90255534C61746ELLU: // ciw_Latn_US
+        case 0xE10256454C61746ELLU: // ciy_Latn_VE
+        case 0x81224B4841726162LLU: // cja_Arab_KH
+        case 0x9122564E4C61746ELLU: // cje_Latn_VN
+        case 0x9D2255534C61746ELLU: // cjh_Latn_US
+        case 0xA12252554379726CLLU: // cji_Cyrl_RU
+        case 0xA922414F4C61746ELLU: // cjk_Latn_AO
+        case 0xB122564E4368616DLLU: // cjm_Cham_VN
+        case 0xB52250474C61746ELLU: // cjn_Latn_PG
+        case 0xB92250454C61746ELLU: // cjo_Latn_PE
+        case 0xBD2243524C61746ELLU: // cjp_Latn_CR
+        case 0xC92252554C61746ELLU: // cjs_Latn_RU
+        case 0xD52250474C61746ELLU: // cjv_Latn_PG
+        case 0xE122434E48616E73LLU: // cjy_Hans_CN
+        case 0x8542495141726162LLU: // ckb_Arab_IQ
+        case 0xAD424E474C61746ELLU: // ckl_Latn_NG
+        case 0xB14248524C61746ELLU: // ckm_Latn_HR
+        case 0xB5424D4D4C61746ELLU: // ckn_Latn_MM
+        case 0xB94247484C61746ELLU: // cko_Latn_GH
+        case 0xC14254444C61746ELLU: // ckq_Latn_TD
+        case 0xC54250474C61746ELLU: // ckr_Latn_PG
+        case 0xC9424E434C61746ELLU: // cks_Latn_NC
+        case 0xCD4252554379726CLLU: // ckt_Cyrl_RU
+        case 0xD14255534C61746ELLU: // cku_Latn_US
+        case 0xD54254574C61746ELLU: // ckv_Latn_TW
+        case 0xDD42434D4C61746ELLU: // ckx_Latn_CM
+        case 0xE1424E474C61746ELLU: // cky_Latn_NG
+        case 0xE54247544C61746ELLU: // ckz_Latn_GT
+        case 0x81624E474C61746ELLU: // cla_Latn_NG
+        case 0x896243414C61746ELLU: // clc_Latn_CA
+        case 0x91624D584C61746ELLU: // cle_Latn_MX
+        case 0x9D62504B41726162LLU: // clh_Arab_PK
+        case 0xA16247484C61746ELLU: // cli_Latn_GH
+        case 0xA5624D4D4C61746ELLU: // clj_Latn_MM
+        case 0xA962494E4C61746ELLU: // clk_Latn_IN
+        case 0xAD6247484C61746ELLU: // cll_Latn_GH
+        case 0xB16255534C61746ELLU: // clm_Latn_US
+        case 0xB9624D584C61746ELLU: // clo_Latn_MX
+        case 0xCD624D4D4C61746ELLU: // clt_Latn_MM
+        case 0xD16250484C61746ELLU: // clu_Latn_PH
+        case 0xD96252554379726CLLU: // clw_Cyrl_RU
+        case 0xE1624D584C61746ELLU: // cly_Latn_MX
+        case 0x8182564E4C61746ELLU: // cma_Latn_VN
+        case 0x918242464C61746ELLU: // cme_Latn_BF
+        case 0x99824D4E536F796FLLU: // cmg_Soyo_MN
+        case 0xA182434F4C61746ELLU: // cmi_Latn_CO
+        case 0xAD8249444C61746ELLU: // cml_Latn_ID
+        case 0xB982564E4C61746ELLU: // cmo_Latn_VN
+        case 0xC5824D4D4C61746ELLU: // cmr_Latn_MM
+        case 0xC98249544C61746ELLU: // cms_Latn_IT
+        case 0xCD825A414C61746ELLU: // cmt_Latn_ZA
+        case 0x81A2494E54696274LLU: // cna_Tibt_IN
+        case 0x85A24D4D4C61746ELLU: // cnb_Latn_MM
+        case 0x89A2564E4C61746ELLU: // cnc_Latn_VN
+        case 0x99A2434E4C61746ELLU: // cng_Latn_CN
+        case 0x9DA24D4D4C61746ELLU: // cnh_Latn_MM
+        case 0xA1A250454C61746ELLU: // cni_Latn_PE
+        case 0xA9A24D4D4C61746ELLU: // cnk_Latn_MM
+        case 0xADA24D584C61746ELLU: // cnl_Latn_MX
+        case 0xBDA2434E48616E73LLU: // cnp_Hans_CN
+        case 0xC1A2434D4C61746ELLU: // cnq_Latn_CM
+        case 0xC9A249444C61746ELLU: // cns_Latn_ID
+        case 0xCDA24D584C61746ELLU: // cnt_Latn_MX
+        case 0xD9A24D4D4C61746ELLU: // cnw_Latn_MM
+        case 0xDDA247424C61746ELLU: // cnx_Latn_GB
+        case 0x636F46524C61746ELLU: // co_Latn_FR
+        case 0x81C241554C61746ELLU: // coa_Latn_AU
+        case 0x85C24D584C61746ELLU: // cob_Latn_MX
+        case 0x89C24D584C61746ELLU: // coc_Latn_MX
+        case 0x8DC250454C61746ELLU: // cod_Latn_PE
+        case 0x91C2434F4C61746ELLU: // coe_Latn_CO
+        case 0x95C245434C61746ELLU: // cof_Latn_EC
+        case 0x99C2544854686169LLU: // cog_Thai_TH
+        case 0x9DC24B454C61746ELLU: // coh_Latn_KE
+        case 0xA5C24D584C61746ELLU: // coj_Latn_MX
+        case 0xA9C24D584C61746ELLU: // cok_Latn_MX
+        case 0xADC255534C61746ELLU: // col_Latn_US
+        case 0xB1C255534C61746ELLU: // com_Latn_US
+        case 0xB9C243414C61746ELLU: // coo_Latn_CA
+        case 0xBDC24547436F7074LLU: // cop_Copt_EG
+        case 0xC1C255534C61746ELLU: // coq_Latn_US
+        case 0xCDC250454C61746ELLU: // cot_Latn_PE
+        case 0xD1C2534E4C61746ELLU: // cou_Latn_SN
+        case 0xDDC250454C61746ELLU: // cox_Latn_PE
+        case 0xE5C24D584C61746ELLU: // coz_Latn_MX
+        case 0x81E24D584C61746ELLU: // cpa_Latn_MX
+        case 0x85E250454C61746ELLU: // cpb_Latn_PE
+        case 0x89E250454C61746ELLU: // cpc_Latn_PE
+        case 0x99E247524772656BLLU: // cpg_Grek_GR
+        case 0xA1E24E524C61746ELLU: // cpi_Latn_NR
+        case 0xB5E247484C61746ELLU: // cpn_Latn_GH
+        case 0xB9E242464C61746ELLU: // cpo_Latn_BF
+        case 0xC9E250484C61746ELLU: // cps_Latn_PH
+        case 0xD1E250454C61746ELLU: // cpu_Latn_PE
+        case 0xDDE2434E4C61746ELLU: // cpx_Latn_CN
+        case 0xE1E250454C61746ELLU: // cpy_Latn_PE
+        case 0x8E02434E4C61746ELLU: // cqd_Latn_CN
+        case 0x6372434143616E73LLU: // cr_Cans_CA
+        case 0x822245544C61746ELLU: // cra_Latn_ET
+        case 0x862256434C61746ELLU: // crb_Latn_VC
+        case 0x8A2256554C61746ELLU: // crc_Latn_VU
+        case 0x8E2255534C61746ELLU: // crd_Latn_US
+        case 0x9622434F4C61746ELLU: // crf_Latn_CO
+        case 0x9A2243414C61746ELLU: // crg_Latn_CA
+        case 0x9E2255414379726CLLU: // crh_Cyrl_UA
+        case 0xA22253544C61746ELLU: // cri_Latn_ST
+        case 0xA622434143616E73LLU: // crj_Cans_CA
+        case 0xAA22434143616E73LLU: // crk_Cans_CA
+        case 0xAE22434143616E73LLU: // crl_Cans_CA
+        case 0xB222434143616E73LLU: // crm_Cans_CA
+        case 0xB6224D584C61746ELLU: // crn_Latn_MX
+        case 0xBA2255534C61746ELLU: // cro_Latn_US
+        case 0xC22241524C61746ELLU: // crq_Latn_AR
+        case 0xCA2253434C61746ELLU: // crs_Latn_SC
+        case 0xCE2241524C61746ELLU: // crt_Latn_AR
+        case 0xD622494E4C61746ELLU: // crv_Latn_IN
+        case 0xDA22564E4C61746ELLU: // crw_Latn_VN
+        case 0xDE2243414C61746ELLU: // crx_Latn_CA
+        case 0xE2224E474C61746ELLU: // cry_Latn_NG
+        case 0xE62255534C61746ELLU: // crz_Latn_US
+        case 0x6373435A4C61746ELLU: // cs_Latn_CZ
+        case 0x82424D584C61746ELLU: // csa_Latn_MX
+        case 0x8642504C4C61746ELLU: // csb_Latn_PL
+        case 0x9E424D4D4D796D72LLU: // csh_Mymr_MM
+        case 0xA6424D4D4C61746ELLU: // csj_Latn_MM
+        case 0xAA42534E4C61746ELLU: // csk_Latn_SN
+        case 0xB24255534C61746ELLU: // csm_Latn_US
+        case 0xBA424D584C61746ELLU: // cso_Latn_MX
+        case 0xBE42434E48616E73LLU: // csp_Hans_CN
+        case 0xCA4255534C61746ELLU: // css_Latn_US
+        case 0xCE4255534C61746ELLU: // cst_Latn_US
+        case 0xD6424D4D4C61746ELLU: // csv_Latn_MM
+        case 0xDA42434143616E73LLU: // csw_Cans_CA
+        case 0xE2424D4D4C61746ELLU: // csy_Latn_MM
+        case 0xE64255534C61746ELLU: // csz_Latn_US
+        case 0x82624D584C61746ELLU: // cta_Latn_MX
+        case 0x8A6255534C61746ELLU: // ctc_Latn_US
+        case 0x8E624D4D50617563LLU: // ctd_Pauc_MM
+        case 0x92624D584C61746ELLU: // cte_Latn_MX
+        case 0x9A62424442656E67LLU: // ctg_Beng_BD
+        case 0x9E624D4D4C61746ELLU: // cth_Latn_MM
+        case 0xAE624D584C61746ELLU: // ctl_Latn_MX
+        case 0xB26255534C61746ELLU: // ctm_Latn_US
+        case 0xB6624E5044657661LLU: // ctn_Deva_NP
+        case 0xBA62434F4C61746ELLU: // cto_Latn_CO
+        case 0xBE624D584C61746ELLU: // ctp_Latn_MX
+        case 0xCA6250484C61746ELLU: // cts_Latn_PH
+        case 0xCE62494E54616D6CLLU: // ctt_Taml_IN
+        case 0xD2624D584C61746ELLU: // ctu_Latn_MX
+        case 0xE262494E54616D6CLLU: // cty_Taml_IN
+        case 0xE6624D584C61746ELLU: // ctz_Latn_MX
+        case 0x637552554379726CLLU: // cu_Cyrl_RU
+        case 0x63754247476C6167LLU: // cu_Glag_BG
+        case 0x8282564E4C61746ELLU: // cua_Latn_VN
+        case 0x8682434F4C61746ELLU: // cub_Latn_CO
+        case 0x8A824D584C61746ELLU: // cuc_Latn_MX
+        case 0x9E824B454C61746ELLU: // cuh_Latn_KE
+        case 0xA282434F4C61746ELLU: // cui_Latn_CO
+        case 0xA68250454C61746ELLU: // cuj_Latn_PE
+        case 0xAA8250414C61746ELLU: // cuk_Latn_PA
+        case 0xAE8242524C61746ELLU: // cul_Latn_BR
+        case 0xBA8256454C61746ELLU: // cuo_Latn_VE
+        case 0xBE8255534C61746ELLU: // cup_Latn_US
+        case 0xCE824D584C61746ELLU: // cut_Latn_MX
+        case 0xD282434E4C616E61LLU: // cuu_Lana_CN
+        case 0xD682434D4C61746ELLU: // cuv_Latn_CM
+        case 0xDE824D584C61746ELLU: // cux_Latn_MX
+        case 0xE2824D584C61746ELLU: // cuy_Latn_MX
+        case 0x637652554379726CLLU: // cv_Cyrl_RU
+        case 0x9AA2494E4C61746ELLU: // cvg_Latn_IN
+        case 0xB6A24D584C61746ELLU: // cvn_Latn_MX
+        case 0x82C2545A4C61746ELLU: // cwa_Latn_TZ
+        case 0x86C24D5A4C61746ELLU: // cwb_Latn_MZ
+        case 0x92C2545A4C61746ELLU: // cwe_Latn_TZ
+        case 0x9AC24D594C61746ELLU: // cwg_Latn_MY
+        case 0xCEC2534E4C61746ELLU: // cwt_Latn_SN
+        case 0x9EE24E474C61746ELLU: // cxh_Latn_NG
+        case 0x637947424C61746ELLU: // cy_Latn_GB
+        case 0x83024D584C61746ELLU: // cya_Latn_MX
+        case 0x8702424F4C61746ELLU: // cyb_Latn_BO
+        case 0xBB0250484C61746ELLU: // cyo_Latn_PH
+        case 0x9F22434E48616E73LLU: // czh_Hans_CN
+        case 0xAB22435A48656272LLU: // czk_Hebr_CZ
+        case 0xB7224D584C61746ELLU: // czn_Latn_MX
+        case 0xCF224D4D4C61746ELLU: // czt_Latn_MM
+        case 0x6461444B4C61746ELLU: // da_Latn_DK
+        case 0x800354444C61746ELLU: // daa_Latn_TD
+        case 0x880350474C61746ELLU: // dac_Latn_PG
+        case 0x8C0350474C61746ELLU: // dad_Latn_PG
+        case 0x9003434D4C61746ELLU: // dae_Latn_CM
+        case 0x980347484C61746ELLU: // dag_Latn_GH
+        case 0x9C0350474C61746ELLU: // dah_Latn_PG
+        case 0xA00354444C61746ELLU: // dai_Latn_TD
+        case 0xA40353444C61746ELLU: // daj_Latn_SD
+        case 0xA80355534C61746ELLU: // dak_Latn_US
+        case 0xAC034B454C61746ELLU: // dal_Latn_KE
+        case 0xB0034E474C61746ELLU: // dam_Latn_NG
+        case 0xB8034D4D4C61746ELLU: // dao_Latn_MM
+        case 0xC003494E44657661LLU: // daq_Deva_IN
+        case 0xC40352554379726CLLU: // dar_Cyrl_RU
+        case 0xC80343494C61746ELLU: // das_Latn_CI
+        case 0xD00354444C61746ELLU: // dau_Latn_TD
+        case 0xD4034B454C61746ELLU: // dav_Latn_KE
+        case 0xD80350484C61746ELLU: // daw_Latn_PH
+        case 0xDC0341554C61746ELLU: // dax_Latn_AU
+        case 0xE40349444C61746ELLU: // daz_Latn_ID
+        case 0x80234D4C4C61746ELLU: // dba_Latn_ML
+        case 0x84234E474C61746ELLU: // dbb_Latn_NG
+        case 0x8C234E474C61746ELLU: // dbd_Latn_NG
+        case 0x902349444C61746ELLU: // dbe_Latn_ID
+        case 0x942349444C61746ELLU: // dbf_Latn_ID
+        case 0x98234D4C4C61746ELLU: // dbg_Latn_ML
+        case 0xA0234E474C61746ELLU: // dbi_Latn_NG
+        case 0xA4234D594C61746ELLU: // dbj_Latn_MY
+        case 0xAC2341554C61746ELLU: // dbl_Latn_AU
+        case 0xB0234E474C61746ELLU: // dbm_Latn_NG
+        case 0xB42349444C61746ELLU: // dbn_Latn_ID
+        case 0xB8234E474C61746ELLU: // dbo_Latn_NG
+        case 0xBC234E474C61746ELLU: // dbp_Latn_NG
+        case 0xC023434D4C61746ELLU: // dbq_Latn_CM
+        case 0xCC234D4C4C61746ELLU: // dbt_Latn_ML
+        case 0xD0234D4C4C61746ELLU: // dbu_Latn_ML
+        case 0xD4234E474C61746ELLU: // dbv_Latn_NG
+        case 0xD8234D4C4C61746ELLU: // dbw_Latn_ML
+        case 0xE02350474C61746ELLU: // dby_Latn_PG
+        case 0x8843494E41726162LLU: // dcc_Arab_IN
+        case 0xC44356494C61746ELLU: // dcr_Latn_VI
+        case 0x806341554C61746ELLU: // dda_Latn_AU
+        case 0x8C6353534C61746ELLU: // ddd_Latn_SS
+        case 0x906343474C61746ELLU: // dde_Latn_CG
+        case 0x9863544C4C61746ELLU: // ddg_Latn_TL
+        case 0xA06350474C61746ELLU: // ddi_Latn_PG
+        case 0xA46341554C61746ELLU: // ddj_Latn_AU
+        case 0xB463424A4C61746ELLU: // ddn_Latn_BJ
+        case 0xB86352554379726CLLU: // ddo_Cyrl_RU
+        case 0xC46341554C61746ELLU: // ddr_Latn_AU
+        case 0xC8634D4C4C61746ELLU: // dds_Latn_ML
+        case 0xD86349444C61746ELLU: // ddw_Latn_ID
+        case 0x646544454C61746ELLU: // de_Latn_DE
+        case 0x888353444C61746ELLU: // dec_Latn_SD
+        case 0x8C8350474C61746ELLU: // ded_Latn_PG
+        case 0x90834C524C61746ELLU: // dee_Latn_LR
+        case 0x9483495241726162LLU: // def_Arab_IR
+        case 0x98834E474C61746ELLU: // deg_Latn_NG
+        case 0x9C83504B41726162LLU: // deh_Arab_PK
+        case 0xA08349444C61746ELLU: // dei_Latn_ID
+        case 0xA883434D4C61746ELLU: // dek_Latn_CM
+        case 0xAC8355534C61746ELLU: // del_Latn_US
+        case 0xB08349444C61746ELLU: // dem_Latn_ID
+        case 0xB48343414C61746ELLU: // den_Latn_CA
+        case 0xC08343464C61746ELLU: // deq_Latn_CF
+        case 0xC483494E42656E67LLU: // der_Beng_IN
+        case 0xC88342524C61746ELLU: // des_Latn_BR
+        case 0xD48350474C61746ELLU: // dev_Latn_PG
+        case 0xE48343444C61746ELLU: // dez_Latn_CD
+        case 0x80C347484C61746ELLU: // dga_Latn_GH
+        case 0x84C34D4C4C61746ELLU: // dgb_Latn_ML
+        case 0x88C350484C61746ELLU: // dgc_Latn_PH
+        case 0x8CC342464C61746ELLU: // dgd_Latn_BF
+        case 0x90C350474C61746ELLU: // dge_Latn_PG
+        case 0x98C350474C61746ELLU: // dgg_Latn_PG
+        case 0x9CC34E474C61746ELLU: // dgh_Latn_NG
+        case 0xA0C342464C61746ELLU: // dgi_Latn_BF
+        case 0xA8C343464C61746ELLU: // dgk_Latn_CF
+        case 0xACC3534441726162LLU: // dgl_Arab_SD
+        case 0xB4C341554C61746ELLU: // dgn_Latn_AU
+        case 0xC4C343414C61746ELLU: // dgr_Latn_CA
+        case 0xC8C342464C61746ELLU: // dgs_Latn_BF
+        case 0xCCC341554C61746ELLU: // dgt_Latn_AU
+        case 0xD8C341554C61746ELLU: // dgw_Latn_AU
+        case 0xDCC350474C61746ELLU: // dgx_Latn_PG
+        case 0xE4C350474C61746ELLU: // dgz_Latn_PG
+        case 0x98E341554C61746ELLU: // dhg_Latn_AU
+        case 0xA0E34E5044657661LLU: // dhi_Deva_NP
+        case 0xACE341554C61746ELLU: // dhl_Latn_AU
+        case 0xB0E3414F4C61746ELLU: // dhm_Latn_AO
+        case 0xB4E3494E47756A72LLU: // dhn_Gujr_IN
+        case 0xB8E3494E44657661LLU: // dho_Deva_IN
+        case 0xC4E341554C61746ELLU: // dhr_Latn_AU
+        case 0xC8E3545A4C61746ELLU: // dhs_Latn_TZ
+        case 0xD0E341554C61746ELLU: // dhu_Latn_AU
+        case 0xD4E34E434C61746ELLU: // dhv_Latn_NC
+        case 0xD8E34E5044657661LLU: // dhw_Deva_NP
+        case 0xDCE341554C61746ELLU: // dhx_Latn_AU
+        case 0x810350474C61746ELLU: // dia_Latn_PG
+        case 0x850353534C61746ELLU: // dib_Latn_SS
+        case 0x890343494C61746ELLU: // dic_Latn_CI
+        case 0x8D0353534C61746ELLU: // did_Latn_SS
+        case 0x950341554C61746ELLU: // dif_Latn_AU
+        case 0x99034B454C61746ELLU: // dig_Latn_KE
+        case 0x9D034D584C61746ELLU: // dih_Latn_MX
+        case 0xA103434D4C61746ELLU: // dii_Latn_CM
+        case 0xA50349444C61746ELLU: // dij_Latn_ID
+        case 0xAD0353444C61746ELLU: // dil_Latn_SD
+        case 0xB50353534C61746ELLU: // din_Latn_SS
+        case 0xB9034E474C61746ELLU: // dio_Latn_NG
+        case 0xBD0353534C61746ELLU: // dip_Latn_SS
+        case 0xC5034E474C61746ELLU: // dir_Latn_NG
+        case 0xC903494E4C61746ELLU: // dis_Latn_IN
+        case 0xD1034E414C61746ELLU: // diu_Latn_NA
+        case 0xD90353534C61746ELLU: // diw_Latn_SS
+        case 0xDD0356554C61746ELLU: // dix_Latn_VU
+        case 0xE10349444C61746ELLU: // diy_Latn_ID
+        case 0xE50343444C61746ELLU: // diz_Latn_CD
+        case 0x812341554C61746ELLU: // dja_Latn_AU
+        case 0x852341554C61746ELLU: // djb_Latn_AU
+        case 0x892354444C61746ELLU: // djc_Latn_TD
+        case 0x8D2341554C61746ELLU: // djd_Latn_AU
+        case 0x91234E454C61746ELLU: // dje_Latn_NE
+        case 0x952341554C61746ELLU: // djf_Latn_AU
+        case 0xA12341554C61746ELLU: // dji_Latn_AU
+        case 0xA52341554C61746ELLU: // djj_Latn_AU
+        case 0xA92353524C61746ELLU: // djk_Latn_SR
+        case 0xB1234D4C4C61746ELLU: // djm_Latn_ML
+        case 0xB52341554C61746ELLU: // djn_Latn_AU
+        case 0xB92349444C61746ELLU: // djo_Latn_ID
+        case 0xC52341554C61746ELLU: // djr_Latn_AU
+        case 0xD12350474C61746ELLU: // dju_Latn_PG
+        case 0xD92341554C61746ELLU: // djw_Latn_AU
+        case 0x8143425454696274LLU: // dka_Tibt_BT
+        case 0x99434E474C61746ELLU: // dkg_Latn_NG
+        case 0xA94349444C61746ELLU: // dkk_Latn_ID
+        case 0xC5434D594C61746ELLU: // dkr_Latn_MY
+        case 0xC94353534C61746ELLU: // dks_Latn_SS
+        case 0xDD43434D4C61746ELLU: // dkx_Latn_CM
+        case 0x996352554379726CLLU: // dlg_Cyrl_RU
+        case 0xB16348524C61746ELLU: // dlm_Latn_HR
+        case 0xB563494E4C61746ELLU: // dln_Latn_IN
+        case 0x818347414C61746ELLU: // dma_Latn_GA
+        case 0x85834D4C4C61746ELLU: // dmb_Latn_ML
+        case 0x898350474C61746ELLU: // dmc_Latn_PG
+        case 0x8D8341554C61746ELLU: // dmd_Latn_AU
+        case 0x9183434D4C61746ELLU: // dme_Latn_CM
+        case 0x95834E474D656466LLU: // dmf_Medf_NG
+        case 0x99834D594C61746ELLU: // dmg_Latn_MY
+        case 0xA983504B41726162LLU: // dmk_Arab_PK
+        case 0xAD83504B41726162LLU: // dml_Arab_PK
+        case 0xB183434D4C61746ELLU: // dmm_Latn_CM
+        case 0xB983434D4C61746ELLU: // dmo_Latn_CM
+        case 0xC58349444C61746ELLU: // dmr_Latn_ID
+        case 0xC98349444C61746ELLU: // dms_Latn_ID
+        case 0xD18349444C61746ELLU: // dmu_Latn_ID
+        case 0xD5834D594C61746ELLU: // dmv_Latn_MY
+        case 0xD98341554C61746ELLU: // dmw_Latn_AU
+        case 0xDD834D5A4C61746ELLU: // dmx_Latn_MZ
+        case 0xE18349444C61746ELLU: // dmy_Latn_ID
+        case 0x81A349444C61746ELLU: // dna_Latn_ID
+        case 0x8DA350474C61746ELLU: // dnd_Latn_PG
+        case 0x91A3545A4C61746ELLU: // dne_Latn_TZ
+        case 0x99A34B474379726CLLU: // dng_Cyrl_KG
+        case 0xA1A349444C61746ELLU: // dni_Latn_ID
+        case 0xA5A343494C61746ELLU: // dnj_Latn_CI
+        case 0xA9A349444C61746ELLU: // dnk_Latn_ID
+        case 0xB5A342464C61746ELLU: // dnn_Latn_BF
+        case 0xB9A343444C61746ELLU: // dno_Latn_CD
+        case 0xC5A350474C61746ELLU: // dnr_Latn_PG
+        case 0xCDA349444C61746ELLU: // dnt_Latn_ID
+        case 0xD1A34D4D4D796D72LLU: // dnu_Mymr_MM
+        case 0xD5A34D4D4D796D72LLU: // dnv_Mymr_MM
+        case 0xD9A349444C61746ELLU: // dnw_Latn_ID
+        case 0xE1A342524C61746ELLU: // dny_Latn_BR
+        case 0x81C350474C61746ELLU: // doa_Latn_PG
+        case 0x85C350474C61746ELLU: // dob_Latn_PG
+        case 0x89C3434E4C61746ELLU: // doc_Latn_CN
+        case 0x91C3545A4C61746ELLU: // doe_Latn_TZ
+        case 0x95C350474C61746ELLU: // dof_Latn_PG
+        case 0x9DC34E474C61746ELLU: // doh_Latn_NG
+        case 0xA1C3494E44657661LLU: // doi_Deva_IN
+        case 0xA9C349444C61746ELLU: // dok_Latn_ID
+        case 0xADC350474C61746ELLU: // dol_Latn_PG
+        case 0xB5C350474C61746ELLU: // don_Latn_PG
+        case 0xB9C343444C61746ELLU: // doo_Latn_CD
+        case 0xBDC3424A4C61746ELLU: // dop_Latn_BJ
+        case 0xC5C353424C61746ELLU: // dor_Latn_SB
+        case 0xC9C342464C61746ELLU: // dos_Latn_BF
+        case 0xCDC34E474C61746ELLU: // dot_Latn_NG
+        case 0xD5C35A574C61746ELLU: // dov_Latn_ZW
+        case 0xD9C3434D4C61746ELLU: // dow_Latn_CM
+        case 0xDDC3455445746869LLU: // dox_Ethi_ET
+        case 0xE1C347484C61746ELLU: // doy_Latn_GH
+        case 0xBDE34D594C61746ELLU: // dpp_Latn_MY
+        case 0x8A2350544C61746ELLU: // drc_Latn_PT
+        case 0x92234E5054696274LLU: // dre_Tibt_NP
+        case 0x9A234D594C61746ELLU: // drg_Latn_MY
+        case 0xA2234E474C61746ELLU: // dri_Latn_NG
+        case 0xAE2341554C61746ELLU: // drl_Latn_AU
+        case 0xB62349444C61746ELLU: // drn_Latn_ID
+        case 0xBA234D594C61746ELLU: // dro_Latn_MY
+        case 0xC2234E5044657661LLU: // drq_Deva_NP
+        case 0xCA23455445746869LLU: // drs_Ethi_ET
+        case 0xCE234E4C4C61746ELLU: // drt_Latn_NL
+        case 0xD22354574C61746ELLU: // dru_Latn_TW
+        case 0xE2234E5044657661LLU: // dry_Deva_NP
+        case 0x864344454C61746ELLU: // dsb_Latn_DE
+        case 0x9E434B454C61746ELLU: // dsh_Latn_KE
+        case 0xA24354444C61746ELLU: // dsi_Latn_TD
+        case 0xAA434E474C61746ELLU: // dsk_Latn_NG
+        case 0xB64349444C61746ELLU: // dsn_Latn_ID
+        case 0xBA43494E4F727961LLU: // dso_Orya_IN
+        case 0xC2434D4C4C61746ELLU: // dsq_Latn_ML
+        case 0x8263434E4C61746ELLU: // dta_Latn_CN
+        case 0x86634D594C61746ELLU: // dtb_Latn_MY
+        case 0x8E6343414C61746ELLU: // dtd_Latn_CA
+        case 0x9E6341554C61746ELLU: // dth_Latn_AU
+        case 0xA2634D4C4C61746ELLU: // dti_Latn_ML
+        case 0xAA634D4C4C61746ELLU: // dtk_Latn_ML
+        case 0xB2634D4C4C61746ELLU: // dtm_Latn_ML
+        case 0xBA634D4C4C61746ELLU: // dto_Latn_ML
+        case 0xBE634D594C61746ELLU: // dtp_Latn_MY
+        case 0xC6634D594C61746ELLU: // dtr_Latn_MY
+        case 0xCA634D4C4C61746ELLU: // dts_Latn_ML
+        case 0xCE634D4C4C61746ELLU: // dtt_Latn_ML
+        case 0xD2634D4C4C61746ELLU: // dtu_Latn_ML
+        case 0xE2634E5044657661LLU: // dty_Deva_NP
+        case 0x8283434D4C61746ELLU: // dua_Latn_CM
+        case 0x8683494E47756A72LLU: // dub_Gujr_IN
+        case 0x8A8350474C61746ELLU: // duc_Latn_PG
+        case 0x928350484C61746ELLU: // due_Latn_PH
+        case 0x96834E434C61746ELLU: // duf_Latn_NC
+        case 0x9A834B454C61746ELLU: // dug_Latn_KE
+        case 0x9E83494E44657661LLU: // duh_Deva_IN
+        case 0xA28350474C61746ELLU: // dui_Latn_PG
+        case 0xAA8350474C61746ELLU: // duk_Latn_PG
+        case 0xAE8350484C61746ELLU: // dul_Latn_PH
+        case 0xB2834E4C4C61746ELLU: // dum_Latn_NL
+        case 0xB68349444C61746ELLU: // dun_Latn_ID
+        case 0xBA8350484C61746ELLU: // duo_Latn_PH
+        case 0xBE8349444C61746ELLU: // dup_Latn_ID
+        case 0xC28349444C61746ELLU: // duq_Latn_ID
+        case 0xC683434D4C61746ELLU: // dur_Latn_CM
+        case 0xCA834E5044657661LLU: // dus_Deva_NP
+        case 0xD283434E4C61746ELLU: // duu_Latn_CN
+        case 0xD68349444C61746ELLU: // duv_Latn_ID
+        case 0xDA8349444C61746ELLU: // duw_Latn_ID
+        case 0xDE834D4C4C61746ELLU: // dux_Latn_ML
+        case 0xE28350484C61746ELLU: // duy_Latn_PH
+        case 0xE683434D4C61746ELLU: // duz_Latn_CM
+        case 0x64764D5654686161LLU: // dv_Thaa_MV
+        case 0x82A350474C61746ELLU: // dva_Latn_PG
+        case 0x82C34E474C61746ELLU: // dwa_Latn_NG
+        case 0xAAC3494E4F727961LLU: // dwk_Orya_IN
+        case 0xC6C345544C61746ELLU: // dwr_Latn_ET
+        case 0xD2C341554C61746ELLU: // dwu_Latn_AU
+        case 0xDAC350474C61746ELLU: // dww_Latn_PG
+        case 0xE2C341554C61746ELLU: // dwy_Latn_AU
+        case 0xE6C34E5044657661LLU: // dwz_Deva_NP
+        case 0x830342464C61746ELLU: // dya_Latn_BF
+        case 0x870341554C61746ELLU: // dyb_Latn_AU
+        case 0x8F0341554C61746ELLU: // dyd_Latn_AU
+        case 0x9B0350484C61746ELLU: // dyg_Latn_PH
+        case 0xA30343494C61746ELLU: // dyi_Latn_CI
+        case 0xB3034D4C4C61746ELLU: // dym_Latn_ML
+        case 0xB70341554C61746ELLU: // dyn_Latn_AU
+        case 0xBB03534E4C61746ELLU: // dyo_Latn_SN
+        case 0xC7034E474C61746ELLU: // dyr_Latn_NG
+        case 0xD30342464C61746ELLU: // dyu_Latn_BF
+        case 0xE30341554C61746ELLU: // dyy_Latn_AU
+        case 0x647A425454696274LLU: // dz_Tibt_BT
+        case 0x83234E474C61746ELLU: // dza_Latn_NG
+        case 0x8F234E474C61746ELLU: // dzd_Latn_NG
+        case 0x932341554C61746ELLU: // dze_Latn_AU
+        case 0x9B2354444C61746ELLU: // dzg_Latn_TD
+        case 0xAF23425454696274LLU: // dzl_Tibt_BT
+        case 0xB72343444C61746ELLU: // dzn_Latn_CD
+        case 0x800441554C61746ELLU: // eaa_Latn_AU
+        case 0x882449444C61746ELLU: // ebc_Latn_ID
+        case 0x98244E474C61746ELLU: // ebg_Latn_NG
+        case 0xA82450484C61746ELLU: // ebk_Latn_PH
+        case 0xB82443474C61746ELLU: // ebo_Latn_CG
+        case 0xC42443494C61746ELLU: // ebr_Latn_CI
+        case 0xD0244B454C61746ELLU: // ebu_Latn_KE
+        case 0xC44447524772656BLLU: // ecr_Grek_GR
+        case 0xE044435943707274LLU: // ecy_Cprt_CY
+        case 0x656547484C61746ELLU: // ee_Latn_GH
+        case 0x80A44E474C61746ELLU: // efa_Latn_NG
+        case 0x90A443444C61746ELLU: // efe_Latn_CD
+        case 0xA0A44E474C61746ELLU: // efi_Latn_NG
+        case 0x80C443494C61746ELLU: // ega_Latn_CI
+        case 0xACC449544C61746ELLU: // egl_Latn_IT
+        case 0xB0C4545A4C61746ELLU: // egm_Latn_TZ
+        case 0xB8C44E474C61746ELLU: // ego_Latn_NG
+        case 0xE0C4454745677970LLU: // egy_Egyp_EG
+        case 0xD0E44E474C61746ELLU: // ehu_Latn_NG
+        case 0xBD0449444C61746ELLU: // eip_Latn_ID
+        case 0xCD0450474C61746ELLU: // eit_Latn_PG
+        case 0xD50450474C61746ELLU: // eiv_Latn_PG
+        case 0x812447574C61746ELLU: // eja_Latn_GW
+        case 0x81444E474C61746ELLU: // eka_Latn_NG
+        case 0x91444E474C61746ELLU: // eke_Latn_NG
+        case 0x994449444C61746ELLU: // ekg_Latn_ID
+        case 0xA1444E474C61746ELLU: // eki_Latn_NG
+        case 0xAD4442444C61746ELLU: // ekl_Latn_BD
+        case 0xB144434D4C61746ELLU: // ekm_Latn_CM
+        case 0xB9444D5A4C61746ELLU: // eko_Latn_MZ
+        case 0xBD444E474C61746ELLU: // ekp_Latn_NG
+        case 0xC5444E474C61746ELLU: // ekr_Latn_NG
+        case 0xE1444D4D4B616C69LLU: // eky_Kali_MM
+        case 0x656C47524772656BLLU: // el_Grek_GR
+        case 0x916450474C61746ELLU: // ele_Latn_PG
+        case 0xA96450474C61746ELLU: // elk_Latn_PG
+        case 0xB1644E474C61746ELLU: // elm_Latn_NG
+        case 0xB9644B454C61746ELLU: // elo_Latn_KE
+        case 0xD16450474C61746ELLU: // elu_Latn_PG
+        case 0x81844E474C61746ELLU: // ema_Latn_NG
+        case 0x858449444C61746ELLU: // emb_Latn_ID
+        case 0x918447464C61746ELLU: // eme_Latn_GF
+        case 0x99844E5044657661LLU: // emg_Deva_NP
+        case 0xA18450474C61746ELLU: // emi_Latn_PG
+        case 0xB1844D584C61746ELLU: // emm_Latn_MX
+        case 0xB584434D4C61746ELLU: // emn_Latn_CM
+        case 0xBD8450414C61746ELLU: // emp_Latn_PA
+        case 0xC98455534C61746ELLU: // ems_Latn_US
+        case 0xD184494E44657661LLU: // emu_Deva_IN
+        case 0xD98449444C61746ELLU: // emw_Latn_ID
+        case 0xDD8446524C61746ELLU: // emx_Latn_FR
+        case 0xE584434D4C61746ELLU: // emz_Latn_CM
+        case 0x656E47424C61746ELLU: // en_Latn_GB
+        case 0x656E55534C61746ELLU: // en_Latn_US
+        case 0x656E474253686177LLU: // en_Shaw_GB
+        case 0x81A450474C61746ELLU: // ena_Latn_PG
+        case 0x85A44B454C61746ELLU: // enb_Latn_KE
+        case 0x89A4564E4C61746ELLU: // enc_Latn_VN
+        case 0x8DA449444C61746ELLU: // end_Latn_ID
+        case 0x95A452554379726CLLU: // enf_Cyrl_RU
+        case 0x9DA452554379726CLLU: // enh_Cyrl_RU
+        case 0xADA450594C61746ELLU: // enl_Latn_PY
+        case 0xB1A447424C61746ELLU: // enm_Latn_GB
+        case 0xB5A44E474C61746ELLU: // enn_Latn_NG
+        case 0xB9A449444C61746ELLU: // eno_Latn_ID
+        case 0xC1A450474C61746ELLU: // enq_Latn_PG
+        case 0xC5A449444C61746ELLU: // enr_Latn_ID
+        case 0xD5A44E474C61746ELLU: // env_Latn_NG
+        case 0xD9A44E474C61746ELLU: // enw_Latn_NG
+        case 0xDDA450594C61746ELLU: // enx_Latn_PY
+        case 0xCDC443494C61746ELLU: // eot_Latn_CI
+        case 0xA1E44E474C61746ELLU: // epi_Latn_NG
+        case 0x8224494E54616D6CLLU: // era_Taml_IN
+        case 0x9A2456554C61746ELLU: // erg_Latn_VU
+        case 0x9E244E474C61746ELLU: // erh_Latn_NG
+        case 0xA22450474C61746ELLU: // eri_Latn_PG
+        case 0xAA2456554C61746ELLU: // erk_Latn_VU
+        case 0xC62441554C61746ELLU: // err_Latn_AU
+        case 0xCA24434E4C61746ELLU: // ers_Latn_CN
+        case 0xCE2449444C61746ELLU: // ert_Latn_ID
+        case 0xDA2449444C61746ELLU: // erw_Latn_ID
+        case 0x657345534C61746ELLU: // es_Latn_ES
+        case 0x65734D584C61746ELLU: // es_Latn_MX
+        case 0x657355534C61746ELLU: // es_Latn_US
+        case 0x9244424F4C61746ELLU: // ese_Latn_BO
+        case 0x9A44494E476F6E6DLLU: // esg_Gonm_IN
+        case 0x9E44495241726162LLU: // esh_Arab_IR
+        case 0xA24455534C61746ELLU: // esi_Latn_US
+        case 0xB24443494C61746ELLU: // esm_Latn_CI
+        case 0xCA4455534C61746ELLU: // ess_Latn_US
+        case 0xD24455534C61746ELLU: // esu_Latn_US
+        case 0xE24450484C61746ELLU: // esy_Latn_PH
+        case 0x657445454C61746ELLU: // et_Latn_EE
+        case 0x86644E474C61746ELLU: // etb_Latn_NG
+        case 0xB66456554C61746ELLU: // etn_Latn_VU
+        case 0xBA64434D4C61746ELLU: // eto_Latn_CM
+        case 0xC66450474C61746ELLU: // etr_Latn_PG
+        case 0xCA644E474C61746ELLU: // ets_Latn_NG
+        case 0xCE6449544974616CLLU: // ett_Ital_IT
+        case 0xD2644E474C61746ELLU: // etu_Latn_NG
+        case 0xDE644E474C61746ELLU: // etx_Latn_NG
+        case 0xE66449444C61746ELLU: // etz_Latn_ID
+        case 0x657545534C61746ELLU: // eu_Latn_ES
+        case 0x8E844D584C61746ELLU: // eud_Latn_MX
+        case 0x92A452554379726CLLU: // eve_Cyrl_RU
+        case 0x9EA44E474C61746ELLU: // evh_Latn_NG
+        case 0xB6A452554379726CLLU: // evn_Cyrl_RU
+        case 0xBAC4434D4C61746ELLU: // ewo_Latn_CM
+        case 0xCEE445534C61746ELLU: // ext_Latn_ES
+        case 0x830455534C61746ELLU: // eya_Latn_US
+        case 0xBB044B454C61746ELLU: // eyo_Latn_KE
+        case 0x83244E474C61746ELLU: // eza_Latn_NG
+        case 0x93244E474C61746ELLU: // eze_Latn_NG
+        case 0x6661495241726162LLU: // fa_Arab_IR
+        case 0x800550474C61746ELLU: // faa_Latn_PG
+        case 0x840547514C61746ELLU: // fab_Latn_GQ
+        case 0x8C0550474C61746ELLU: // fad_Latn_PG
+        case 0x940553424C61746ELLU: // faf_Latn_SB
+        case 0x980550474C61746ELLU: // fag_Latn_PG
+        case 0x9C054E474C61746ELLU: // fah_Latn_NG
+        case 0xA00550474C61746ELLU: // fai_Latn_PG
+        case 0xA40550474C61746ELLU: // faj_Latn_PG
+        case 0xA805434D4C61746ELLU: // fak_Latn_CM
+        case 0xAC05434D4C61746ELLU: // fal_Latn_CM
+        case 0xB0054E474C61746ELLU: // fam_Latn_NG
+        case 0xB40547514C61746ELLU: // fan_Latn_GQ
+        case 0xBC05534E4C61746ELLU: // fap_Latn_SN
+        case 0xC40553424C61746ELLU: // far_Latn_SB
+        case 0xD00549444C61746ELLU: // fau_Latn_ID
+        case 0xDC0545534C61746ELLU: // fax_Latn_ES
+        case 0xE005495241726162LLU: // fay_Arab_IR
+        case 0xE405495241726162LLU: // faz_Arab_IR
+        case 0xAC2550484C61746ELLU: // fbl_Latn_PH
+        case 0xC48553534C61746ELLU: // fer_Latn_SS
+        case 0x6666474E41646C6DLLU: // ff_Adlm_GN
+        case 0x6666534E4C61746ELLU: // ff_Latn_SN
+        case 0xA0A550474C61746ELLU: // ffi_Latn_PG
+        case 0xB0A54D4C4C61746ELLU: // ffm_Latn_ML
+        case 0xC4C554444C61746ELLU: // fgr_Latn_TD
+        case 0x666946494C61746ELLU: // fi_Latn_FI
+        case 0x8105534441726162LLU: // fia_Arab_SD
+        case 0x91054E474C61746ELLU: // fie_Latn_NG
+        case 0x950553414C61746ELLU: // fif_Latn_SA
+        case 0xAD0550484C61746ELLU: // fil_Latn_PH
+        case 0xBD05545A4C61746ELLU: // fip_Latn_TZ
+        case 0xC5054E474C61746ELLU: // fir_Latn_NG
+        case 0xCD0553454C61746ELLU: // fit_Latn_SE
+        case 0xD90550474C61746ELLU: // fiw_Latn_PG
+        case 0x666A464A4C61746ELLU: // fj_Latn_FJ
+        case 0xA9454E474C61746ELLU: // fkk_Latn_NG
+        case 0xD5454E4F4C61746ELLU: // fkv_Latn_NO
+        case 0x816555534C61746ELLU: // fla_Latn_US
+        case 0x9D6549444C61746ELLU: // flh_Latn_ID
+        case 0xA1654E474C61746ELLU: // fli_Latn_NG
+        case 0xAD65434D4C61746ELLU: // fll_Latn_CM
+        case 0xB56541554C61746ELLU: // fln_Latn_AU
+        case 0xC56543444C61746ELLU: // flr_Latn_CD
+        case 0xE1655A414C61746ELLU: // fly_Latn_ZA
+        case 0xBD85434D4C61746ELLU: // fmp_Latn_CM
+        case 0xD185494E44657661LLU: // fmu_Deva_IN
+        case 0x85A556554C61746ELLU: // fnb_Latn_VU
+        case 0x99A55A414C61746ELLU: // fng_Latn_ZA
+        case 0xA1A554444C61746ELLU: // fni_Latn_TD
+        case 0x666F464F4C61746ELLU: // fo_Latn_FO
+        case 0x8DC5424A4C61746ELLU: // fod_Latn_BJ
+        case 0xA1C550474C61746ELLU: // foi_Latn_PG
+        case 0xB1C543444C61746ELLU: // fom_Latn_CD
+        case 0xB5C5424A4C61746ELLU: // fon_Latn_BJ
+        case 0xC5C550474C61746ELLU: // for_Latn_PG
+        case 0xC9C554574C61746ELLU: // fos_Latn_TW
+        case 0x91E547514C61746ELLU: // fpe_Latn_GQ
+        case 0xCA0550474C61746ELLU: // fqs_Latn_PG
+        case 0x667246524C61746ELLU: // fr_Latn_FR
+        case 0x8A2555534C61746ELLU: // frc_Latn_US
+        case 0x8E2549444C61746ELLU: // frd_Latn_ID
+        case 0xAA2544454C61746ELLU: // frk_Latn_DE
+        case 0xB22546524C61746ELLU: // frm_Latn_FR
+        case 0xBA2546524C61746ELLU: // fro_Latn_FR
+        case 0xBE2546524C61746ELLU: // frp_Latn_FR
+        case 0xC22550474C61746ELLU: // frq_Latn_PG
+        case 0xC62544454C61746ELLU: // frr_Latn_DE
+        case 0xCA2544454C61746ELLU: // frs_Latn_DE
+        case 0xCE2556554C61746ELLU: // frt_Latn_VU
+        case 0x8685434D41726162LLU: // fub_Arab_CM
+        case 0x8E8557464C61746ELLU: // fud_Latn_WF
+        case 0x9285424A4C61746ELLU: // fue_Latn_BJ
+        case 0x9685474E4C61746ELLU: // fuf_Latn_GN
+        case 0x9E854E454C61746ELLU: // fuh_Latn_NE
+        case 0xA28554444C61746ELLU: // fui_Latn_TD
+        case 0xB2854E474C61746ELLU: // fum_Latn_NG
+        case 0xB68542524C61746ELLU: // fun_Latn_BR
+        case 0xC2854E454C61746ELLU: // fuq_Latn_NE
+        case 0xC68549544C61746ELLU: // fur_Latn_IT
+        case 0xCE8556554C61746ELLU: // fut_Latn_VU
+        case 0xD28543444C61746ELLU: // fuu_Latn_CD
+        case 0xD6854E474C61746ELLU: // fuv_Latn_NG
+        case 0xE28550474C61746ELLU: // fuy_Latn_PG
+        case 0xC6A553444C61746ELLU: // fvr_Latn_SD
+        case 0x82C54E434C61746ELLU: // fwa_Latn_NC
+        case 0x92C54E414C61746ELLU: // fwe_Latn_NA
+        case 0x66794E4C4C61746ELLU: // fy_Latn_NL
+        case 0x676149454C61746ELLU: // ga_Latn_IE
+        case 0x800647484C61746ELLU: // gaa_Latn_GH
+        case 0x840654444C61746ELLU: // gab_Latn_TD
+        case 0x8806494E4C61746ELLU: // gac_Latn_IN
+        case 0x8C0650484C61746ELLU: // gad_Latn_PH
+        case 0x900656454C61746ELLU: // gae_Latn_VE
+        case 0x940650474C61746ELLU: // gaf_Latn_PG
+        case 0x98064D444C61746ELLU: // gag_Latn_MD
+        case 0x9C0650474C61746ELLU: // gah_Latn_PG
+        case 0xA00650474C61746ELLU: // gai_Latn_PG
+        case 0xA40650474C61746ELLU: // gaj_Latn_PG
+        case 0xA80649444C61746ELLU: // gak_Latn_ID
+        case 0xAC06544C4C61746ELLU: // gal_Latn_TL
+        case 0xB00650474C61746ELLU: // gam_Latn_PG
+        case 0xB406434E48616E73LLU: // gan_Hans_CN
+        case 0xB80650474C61746ELLU: // gao_Latn_PG
+        case 0xBC0650474C61746ELLU: // gap_Latn_PG
+        case 0xC006494E4F727961LLU: // gaq_Orya_IN
+        case 0xC40650474C61746ELLU: // gar_Latn_PG
+        case 0xC806494E47756A72LLU: // gas_Gujr_IN
+        case 0xCC0650474C61746ELLU: // gat_Latn_PG
+        case 0xD006494E54656C75LLU: // gau_Telu_IN
+        case 0xD80650474C61746ELLU: // gaw_Latn_PG
+        case 0xDC0645544C61746ELLU: // gax_Latn_ET
+        case 0xE00649444C61746ELLU: // gay_Latn_ID
+        case 0x802643464C61746ELLU: // gba_Latn_CF
+        case 0x842641554C61746ELLU: // gbb_Latn_AU
+        case 0x8C2641554C61746ELLU: // gbd_Latn_AU
+        case 0x902650474C61746ELLU: // gbe_Latn_PG
+        case 0x942650474C61746ELLU: // gbf_Latn_PG
+        case 0x982643464C61746ELLU: // gbg_Latn_CF
+        case 0x9C26424A4C61746ELLU: // gbh_Latn_BJ
+        case 0xA02649444C61746ELLU: // gbi_Latn_ID
+        case 0xA426494E4F727961LLU: // gbj_Orya_IN
+        case 0xA826494E44657661LLU: // gbk_Deva_IN
+        case 0xAC26494E47756A72LLU: // gbl_Gujr_IN
+        case 0xB026494E44657661LLU: // gbm_Deva_IN
+        case 0xB42653534C61746ELLU: // gbn_Latn_SS
+        case 0xBC2643464C61746ELLU: // gbp_Latn_CF
+        case 0xC02643464C61746ELLU: // gbq_Latn_CF
+        case 0xC4264E474C61746ELLU: // gbr_Latn_NG
+        case 0xC826424A4C61746ELLU: // gbs_Latn_BJ
+        case 0xD02641554C61746ELLU: // gbu_Latn_AU
+        case 0xD42643464C61746ELLU: // gbv_Latn_CF
+        case 0xD82641554C61746ELLU: // gbw_Latn_AU
+        case 0xDC26424A4C61746ELLU: // gbx_Latn_BJ
+        case 0xE0264E474C61746ELLU: // gby_Latn_NG
+        case 0xE426495241726162LLU: // gbz_Arab_IR
+        case 0x884650474C61746ELLU: // gcc_Latn_PG
+        case 0x8C4641554C61746ELLU: // gcd_Latn_AU
+        case 0x944647504C61746ELLU: // gcf_Latn_GP
+        case 0xAC4647444C61746ELLU: // gcl_Latn_GD
+        case 0xB44650474C61746ELLU: // gcn_Latn_PG
+        case 0xC44647464C61746ELLU: // gcr_Latn_GF
+        case 0xCC4656454C61746ELLU: // gct_Latn_VE
+        case 0x676447424C61746ELLU: // gd_Latn_GB
+        case 0x8466494E4F727961LLU: // gdb_Orya_IN
+        case 0x886641554C61746ELLU: // gdc_Latn_AU
+        case 0x8C6650474C61746ELLU: // gdd_Latn_PG
+        case 0x90664E474C61746ELLU: // gde_Latn_NG
+        case 0x94664E474C61746ELLU: // gdf_Latn_NG
+        case 0x986650484C61746ELLU: // gdg_Latn_PH
+        case 0x9C6641554C61746ELLU: // gdh_Latn_AU
+        case 0xA06643464C61746ELLU: // gdi_Latn_CF
+        case 0xA46641554C61746ELLU: // gdj_Latn_AU
+        case 0xA86654444C61746ELLU: // gdk_Latn_TD
+        case 0xAC6645544C61746ELLU: // gdl_Latn_ET
+        case 0xB06654444C61746ELLU: // gdm_Latn_TD
+        case 0xB46650474C61746ELLU: // gdn_Latn_PG
+        case 0xB86652554379726CLLU: // gdo_Cyrl_RU
+        case 0xC06659454C61746ELLU: // gdq_Latn_YE
+        case 0xC46650474C61746ELLU: // gdr_Latn_PG
+        case 0xCC6641554C61746ELLU: // gdt_Latn_AU
+        case 0xD0664E474C61746ELLU: // gdu_Latn_NG
+        case 0xDC66494E44657661LLU: // gdx_Deva_IN
+        case 0x80864E474C61746ELLU: // gea_Latn_NG
+        case 0x848650474C61746ELLU: // geb_Latn_PG
+        case 0x88864C524C61746ELLU: // gec_Latn_LR
+        case 0x8C864E474C61746ELLU: // ged_Latn_NG
+        case 0x948649444C61746ELLU: // gef_Latn_ID
+        case 0x98864E474C61746ELLU: // geg_Latn_NG
+        case 0x9C8643414C61746ELLU: // geh_Latn_CA
+        case 0xA08649444C61746ELLU: // gei_Latn_ID
+        case 0xA48654474C61746ELLU: // gej_Latn_TG
+        case 0xA8864E474C61746ELLU: // gek_Latn_NG
+        case 0xAC864E474C61746ELLU: // gel_Latn_NG
+        case 0xC08643464C61746ELLU: // geq_Latn_CF
+        case 0xC88649444C61746ELLU: // ges_Latn_ID
+        case 0xD48647414C61746ELLU: // gev_Latn_GA
+        case 0xD8864E474C61746ELLU: // gew_Latn_NG
+        case 0xDC86534F4C61746ELLU: // gex_Latn_SO
+        case 0xE08643444C61746ELLU: // gey_Latn_CD
+        case 0xE486455445746869LLU: // gez_Ethi_ET
+        case 0xA8A650474C61746ELLU: // gfk_Latn_PG
+        case 0x80C653424C61746ELLU: // gga_Latn_SB
+        case 0x84C64C524C61746ELLU: // ggb_Latn_LR
+        case 0x8CC641554C61746ELLU: // ggd_Latn_AU
+        case 0x90C641554C61746ELLU: // gge_Latn_AU
+        case 0x98C6504B41726162LLU: // ggg_Arab_PK
+        case 0xA8C641554C61746ELLU: // ggk_Latn_AU
+        case 0xACC650474C61746ELLU: // ggl_Latn_PG
+        case 0xCCC650474C61746ELLU: // ggt_Latn_PG
+        case 0xD0C643494C61746ELLU: // ggu_Latn_CI
+        case 0xD8C650474C61746ELLU: // ggw_Latn_PG
+        case 0x80E64C5941726162LLU: // gha_Arab_LY
+        case 0x88E647424C61746ELLU: // ghc_Latn_GB
+        case 0x90E64E5044657661LLU: // ghe_Deva_NP
+        case 0xA8E64D4D4C61746ELLU: // ghk_Latn_MM
+        case 0xB4E653424C61746ELLU: // ghn_Latn_SB
+        case 0xB8E64D4154666E67LLU: // gho_Tfng_MA
+        case 0xC4E6504B41726162LLU: // ghr_Arab_PK
+        case 0xC8E650474C61746ELLU: // ghs_Latn_PG
+        case 0xCCE64E5054696274LLU: // ght_Tibt_NP
+        case 0x810641554C61746ELLU: // gia_Latn_AU
+        case 0x85064E474C61746ELLU: // gib_Latn_NG
+        case 0x89065A414C61746ELLU: // gic_Latn_ZA
+        case 0x8D06434D4C61746ELLU: // gid_Latn_CM
+        case 0x910643494C61746ELLU: // gie_Latn_CI
+        case 0x9906504B41726162LLU: // gig_Arab_PK
+        case 0x9D0641554C61746ELLU: // gih_Latn_AU
+        case 0xAD064B494C61746ELLU: // gil_Latn_KI
+        case 0xB10650474C61746ELLU: // gim_Latn_PG
+        case 0xB50652554379726CLLU: // gin_Cyrl_RU
+        case 0xBD0650474C61746ELLU: // gip_Latn_PG
+        case 0xC106564E4C61746ELLU: // giq_Latn_VN
+        case 0xC506564E4C61746ELLU: // gir_Latn_VN
+        case 0xC906434D4C61746ELLU: // gis_Latn_CM
+        case 0xCD0643414C61746ELLU: // git_Latn_CA
+        case 0xDD0643444C61746ELLU: // gix_Latn_CD
+        case 0xE10641554C61746ELLU: // giy_Latn_AU
+        case 0xE506434D4C61746ELLU: // giz_Latn_CM
+        case 0xA926504B41726162LLU: // gjk_Arab_PK
+        case 0xB12641554C61746ELLU: // gjm_Latn_AU
+        case 0xB52647484C61746ELLU: // gjn_Latn_GH
+        case 0xC52641554C61746ELLU: // gjr_Latn_AU
+        case 0xD126504B41726162LLU: // gju_Arab_PK
+        case 0x814650474C61746ELLU: // gka_Latn_PG
+        case 0x8D4650474C61746ELLU: // gkd_Latn_PG
+        case 0x9146434D4C61746ELLU: // gke_Latn_CM
+        case 0xB5464E474C61746ELLU: // gkn_Latn_NG
+        case 0xB94641554C61746ELLU: // gko_Latn_AU
+        case 0xBD46474E4C61746ELLU: // gkp_Latn_GN
+        case 0xD1465A414C61746ELLU: // gku_Latn_ZA
+        case 0x676C45534C61746ELLU: // gl_Latn_ES
+        case 0x85664E474C61746ELLU: // glb_Latn_NG
+        case 0x896654444C61746ELLU: // glc_Latn_TD
+        case 0x8D6652554379726CLLU: // gld_Cyrl_RU
+        case 0x9D66414641726162LLU: // glh_Arab_AF
+        case 0xA56654444C61746ELLU: // glj_Latn_TD
+        case 0xA966495241726162LLU: // glk_Arab_IR
+        case 0xAD6641554C61746ELLU: // gll_Latn_AU
+        case 0xB9664E474C61746ELLU: // glo_Latn_NG
+        case 0xC5664C524C61746ELLU: // glr_Latn_LR
+        case 0xD16654444C61746ELLU: // glu_Latn_TD
+        case 0xD9664E474C61746ELLU: // glw_Latn_NG
+        case 0x818641554C61746ELLU: // gma_Latn_AU
+        case 0x858653424C61746ELLU: // gmb_Latn_SB
+        case 0x8D864E474C61746ELLU: // gmd_Latn_NG
+        case 0x998650474C61746ELLU: // gmg_Latn_PG
+        case 0x9D8644454C61746ELLU: // gmh_Latn_DE
+        case 0xAD8644454C617466LLU: // gml_Latf_DE
+        case 0xB186434D4C61746ELLU: // gmm_Latn_CM
+        case 0xB586434D4C61746ELLU: // gmn_Latn_CM
+        case 0xC58641554C61746ELLU: // gmr_Latn_AU
+        case 0xD18650474C61746ELLU: // gmu_Latn_PG
+        case 0xD586455445746869LLU: // gmv_Ethi_ET
+        case 0xDD86545A4C61746ELLU: // gmx_Latn_TZ
+        case 0xE18647524C696E62LLU: // gmy_Linb_GR
+        case 0xE5864E474C61746ELLU: // gmz_Latn_NG
+        case 0x676E50594C61746ELLU: // gn_Latn_PY
+        case 0x81A642464C61746ELLU: // gna_Latn_BF
+        case 0x85A6494E4C61746ELLU: // gnb_Latn_IN
+        case 0x89A645534C61746ELLU: // gnc_Latn_ES
+        case 0x8DA6434D4C61746ELLU: // gnd_Latn_CM
+        case 0x91A64E474C61746ELLU: // gne_Latn_NG
+        case 0x99A654474C61746ELLU: // gng_Latn_TG
+        case 0x9DA64E474C61746ELLU: // gnh_Latn_NG
+        case 0xA1A641554C61746ELLU: // gni_Latn_AU
+        case 0xA5A643494C61746ELLU: // gnj_Latn_CI
+        case 0xA9A642574C61746ELLU: // gnk_Latn_BW
+        case 0xADA641554C61746ELLU: // gnl_Latn_AU
+        case 0xB1A650474C61746ELLU: // gnm_Latn_PG
+        case 0xB5A641554C61746ELLU: // gnn_Latn_AU
+        case 0xC1A64D594C61746ELLU: // gnq_Latn_MY
+        case 0xC5A641554C61746ELLU: // gnr_Latn_AU
+        case 0xCDA650474C61746ELLU: // gnt_Latn_PG
+        case 0xD1A650474C61746ELLU: // gnu_Latn_PG
+        case 0xD9A6424F4C61746ELLU: // gnw_Latn_BO
+        case 0xE5A643464C61746ELLU: // gnz_Latn_CF
+        case 0x81C643494C61746ELLU: // goa_Latn_CI
+        case 0x85C6434F4C61746ELLU: // gob_Latn_CO
+        case 0x89C650474C61746ELLU: // goc_Latn_PG
+        case 0x8DC643494C61746ELLU: // god_Latn_CI
+        case 0x91C6425454696274LLU: // goe_Tibt_BT
+        case 0x95C6455445746869LLU: // gof_Ethi_ET
+        case 0x99C6545A4C61746ELLU: // gog_Latn_TZ
+        case 0x9DC644454C61746ELLU: // goh_Latn_DE
+        case 0xA1C650474C61746ELLU: // goi_Latn_PG
+        case 0xA5C6494E44657661LLU: // goj_Deva_IN
+        case 0xA9C6494E44657661LLU: // gok_Deva_IN
+        case 0xADC64C524C61746ELLU: // gol_Latn_LR
+        case 0xB5C6494E44657661LLU: // gon_Deva_IN
+        case 0xB9C6464A4C61746ELLU: // goo_Latn_FJ
+        case 0xBDC649444C61746ELLU: // gop_Latn_ID
+        case 0xC1C649444C61746ELLU: // goq_Latn_ID
+        case 0xC5C649444C61746ELLU: // gor_Latn_ID
+        case 0xC9C64E4C4C61746ELLU: // gos_Latn_NL
+        case 0xCDC65541476F7468LLU: // got_Goth_UA
+        case 0xD1C6434D4C61746ELLU: // gou_Latn_CM
+        case 0xD5C643494C61746ELLU: // gov_Latn_CI
+        case 0xD9C6545A4C61746ELLU: // gow_Latn_TZ
+        case 0xDDC643444C61746ELLU: // gox_Latn_CD
+        case 0xE1C654444C61746ELLU: // goy_Latn_TD
+        case 0x81E64E474C61746ELLU: // gpa_Latn_NG
+        case 0x91E647484C61746ELLU: // gpe_Latn_GH
+        case 0xB5E650474C61746ELLU: // gpn_Latn_PG
+        case 0x82064E474C61746ELLU: // gqa_Latn_NG
+        case 0xB60642524C61746ELLU: // gqn_Latn_BR
+        case 0xC60654444C61746ELLU: // gqr_Latn_TD
+        case 0x8226494E44657661LLU: // gra_Deva_IN
+        case 0x86264C524C61746ELLU: // grb_Latn_LR
+        case 0x8A26435943707274LLU: // grc_Cprt_CY
+        case 0x8A2647524C696E62LLU: // grc_Linb_GR
+        case 0x8E264E474C61746ELLU: // grd_Latn_NG
+        case 0x9A2650474C61746ELLU: // grg_Latn_PG
+        case 0x9E264E474C61746ELLU: // grh_Latn_NG
+        case 0xA22653424C61746ELLU: // gri_Latn_SB
+        case 0xA6264C524C61746ELLU: // grj_Latn_LR
+        case 0xB2264D594C61746ELLU: // grm_Latn_MY
+        case 0xC22650474C61746ELLU: // grq_Latn_PG
+        case 0xCA2649444C61746ELLU: // grs_Latn_ID
+        case 0xCE26494E42656E67LLU: // grt_Beng_IN
+        case 0xD226455445746869LLU: // gru_Ethi_ET
+        case 0xD6264C524C61746ELLU: // grv_Latn_LR
+        case 0xDA2650474C61746ELLU: // grw_Latn_PG
+        case 0xDE2650474C61746ELLU: // grx_Latn_PG
+        case 0xE2264C524C61746ELLU: // gry_Latn_LR
+        case 0xE62650474C61746ELLU: // grz_Latn_PG
+        case 0xAE46534E4C61746ELLU: // gsl_Latn_SN
+        case 0xB64650474C61746ELLU: // gsn_Latn_PG
+        case 0xBA4643464C61746ELLU: // gso_Latn_CF
+        case 0xBE4650474C61746ELLU: // gsp_Latn_PG
+        case 0xDA4643484C61746ELLU: // gsw_Latn_CH
+        case 0x826642524C61746ELLU: // gta_Latn_BR
+        case 0xD26641554C61746ELLU: // gtu_Latn_AU
+        case 0x6775494E47756A72LLU: // gu_Gujr_IN
+        case 0x82864E474C61746ELLU: // gua_Latn_NG
+        case 0x868642524C61746ELLU: // gub_Latn_BR
+        case 0x8A86434F4C61746ELLU: // guc_Latn_CO
+        case 0x8E8643494C61746ELLU: // gud_Latn_CI
+        case 0x928641554C61746ELLU: // gue_Latn_AU
+        case 0x968641554C61746ELLU: // guf_Latn_AU
+        case 0x9E86434F4C61746ELLU: // guh_Latn_CO
+        case 0xA286424F4C61746ELLU: // gui_Latn_BO
+        case 0xAA8645544C61746ELLU: // guk_Latn_ET
+        case 0xAE8655534C61746ELLU: // gul_Latn_US
+        case 0xB286434F4C61746ELLU: // gum_Latn_CO
+        case 0xB68642524C61746ELLU: // gun_Latn_BR
+        case 0xBA86434F4C61746ELLU: // guo_Latn_CO
+        case 0xBE8641554C61746ELLU: // gup_Latn_AU
+        case 0xC28650594C61746ELLU: // guq_Latn_PY
+        case 0xC68647484C61746ELLU: // gur_Latn_GH
+        case 0xCE8643524C61746ELLU: // gut_Latn_CR
+        case 0xD28656454C61746ELLU: // guu_Latn_VE
+        case 0xDA86424A4C61746ELLU: // guw_Latn_BJ
+        case 0xDE8642464C61746ELLU: // gux_Latn_BF
+        case 0xE6864B454C61746ELLU: // guz_Latn_KE
+        case 0x6776494D4C61746ELLU: // gv_Latn_IM
+        case 0x82A650594C61746ELLU: // gva_Latn_PY
+        case 0x8AA642524C61746ELLU: // gvc_Latn_BR
+        case 0x92A650474C61746ELLU: // gve_Latn_PG
+        case 0x96A650474C61746ELLU: // gvf_Latn_PG
+        case 0xA6A642524C61746ELLU: // gvj_Latn_BR
+        case 0xAEA654444C61746ELLU: // gvl_Latn_TD
+        case 0xB2A64E474C61746ELLU: // gvm_Latn_NG
+        case 0xB6A641554C61746ELLU: // gvn_Latn_AU
+        case 0xBAA642524C61746ELLU: // gvo_Latn_BR
+        case 0xBEA642524C61746ELLU: // gvp_Latn_BR
+        case 0xC6A64E5044657661LLU: // gvr_Deva_NP
+        case 0xCAA650474C61746ELLU: // gvs_Latn_PG
+        case 0xE2A641554C61746ELLU: // gvy_Latn_AU
+        case 0x82C643494C61746ELLU: // gwa_Latn_CI
+        case 0x86C64E474C61746ELLU: // gwb_Latn_NG
+        case 0x8AC6504B41726162LLU: // gwc_Arab_PK
+        case 0x8EC645544C61746ELLU: // gwd_Latn_ET
+        case 0x92C6545A4C61746ELLU: // gwe_Latn_TZ
+        case 0x96C6504B41726162LLU: // gwf_Arab_PK
+        case 0x9AC64E474C61746ELLU: // gwg_Latn_NG
+        case 0xA2C643414C61746ELLU: // gwi_Latn_CA
+        case 0xA6C642574C61746ELLU: // gwj_Latn_BW
+        case 0xB2C641554C61746ELLU: // gwm_Latn_AU
+        case 0xB6C64E474C61746ELLU: // gwn_Latn_NG
+        case 0xC6C655474C61746ELLU: // gwr_Latn_UG
+        case 0xCEC6414641726162LLU: // gwt_Arab_AF
+        case 0xD2C641554C61746ELLU: // gwu_Latn_AU
+        case 0xDAC641554C61746ELLU: // gww_Latn_AU
+        case 0xDEC647484C61746ELLU: // gwx_Latn_GH
+        case 0xDEE643494C61746ELLU: // gxx_Latn_CI
+        case 0x870650474C61746ELLU: // gyb_Latn_PG
+        case 0x8F0641554C61746ELLU: // gyd_Latn_AU
+        case 0x93064E474C61746ELLU: // gye_Latn_NG
+        case 0x970641554C61746ELLU: // gyf_Latn_AU
+        case 0x9B0643464C61746ELLU: // gyg_Latn_CF
+        case 0xA306434D4C61746ELLU: // gyi_Latn_CM
+        case 0xAF0645544C61746ELLU: // gyl_Latn_ET
+        case 0xB30650414C61746ELLU: // gym_Latn_PA
+        case 0xB70647594C61746ELLU: // gyn_Latn_GY
+        case 0xBB064E5044657661LLU: // gyo_Deva_NP
+        case 0xC706424F4C61746ELLU: // gyr_Latn_BO
+        case 0xE30641554C61746ELLU: // gyy_Latn_AU
+        case 0xE7064E474C61746ELLU: // gyz_Latn_NG
+        case 0x832653444C61746ELLU: // gza_Latn_SD
+        case 0xA326495241726162LLU: // gzi_Arab_IR
+        case 0xB72649444C61746ELLU: // gzn_Latn_ID
+        case 0x68614E474C61746ELLU: // ha_Latn_NG
+        case 0x800755534C61746ELLU: // haa_Latn_US
+        case 0x8807495241726162LLU: // hac_Arab_IR
+        case 0x8C0749444C61746ELLU: // had_Latn_ID
+        case 0x900745544C61746ELLU: // hae_Latn_ET
+        case 0x980747484C61746ELLU: // hag_Latn_GH
+        case 0x9C0750474C61746ELLU: // hah_Latn_PG
+        case 0xA00743414C61746ELLU: // hai_Latn_CA
+        case 0xA407494E4C61746ELLU: // haj_Latn_IN
+        case 0xA807434E48616E73LLU: // hak_Hans_CN
+        case 0xAC07564E4C61746ELLU: // hal_Latn_VN
+        case 0xB00750474C61746ELLU: // ham_Latn_PG
+        case 0xB407545A4C61746ELLU: // han_Latn_TZ
+        case 0xB80750474C61746ELLU: // hao_Latn_PG
+        case 0xBC0749444C61746ELLU: // hap_Latn_ID
+        case 0xC007545A4C61746ELLU: // haq_Latn_TZ
+        case 0xC407455445746869LLU: // har_Ethi_ET
+        case 0xC80743414C61746ELLU: // has_Latn_CA
+        case 0xD40743444C61746ELLU: // hav_Latn_CD
+        case 0xD80755534C61746ELLU: // haw_Latn_US
+        case 0xDC0743414C61746ELLU: // hax_Latn_CA
+        case 0xE007545A4C61746ELLU: // hay_Latn_TZ
+        case 0xE407414641726162LLU: // haz_Arab_AF
+        case 0x802743444C61746ELLU: // hba_Latn_CD
+        case 0x84274E474C61746ELLU: // hbb_Latn_NG
+        case 0xB42753444C61746ELLU: // hbn_Latn_SD
+        case 0xB827494C48656272LLU: // hbo_Hebr_IL
+        case 0xD027544C4C61746ELLU: // hbu_Latn_TL
+        case 0x9C474D584C61746ELLU: // hch_Latn_MX
+        case 0xE067455445746869LLU: // hdy_Ethi_ET
+        case 0x6865494C48656272LLU: // he_Hebr_IL
+        case 0x8C8754444C61746ELLU: // hed_Latn_TD
+        case 0x988749444C61746ELLU: // heg_Latn_ID
+        case 0x9C87545A4C61746ELLU: // heh_Latn_TZ
+        case 0xA08743414C61746ELLU: // hei_Latn_CA
+        case 0xB08743444C61746ELLU: // hem_Latn_CD
+        case 0xB0C74E414C61746ELLU: // hgm_Latn_NA
+        case 0xD8C750474C61746ELLU: // hgw_Latn_PG
+        case 0xA0E750474C61746ELLU: // hhi_Latn_PG
+        case 0xC4E7534E4C61746ELLU: // hhr_Latn_SN
+        case 0xE0E750474C61746ELLU: // hhy_Latn_PG
+        case 0x6869494E44657661LLU: // hi_Deva_IN
+        case 0x81074E474C61746ELLU: // hia_Latn_NG
+        case 0x850750454C61746ELLU: // hib_Latn_PE
+        case 0x8D0755534C61746ELLU: // hid_Latn_US
+        case 0x9507464A44657661LLU: // hif_Deva_FJ
+        case 0x99074E474C61746ELLU: // hig_Latn_NG
+        case 0x9D0750474C61746ELLU: // hih_Latn_PG
+        case 0xA107494E54616B72LLU: // hii_Takr_IN
+        case 0xA507434D4C61746ELLU: // hij_Latn_CM
+        case 0xA90749444C61746ELLU: // hik_Latn_ID
+        case 0xAD0750484C61746ELLU: // hil_Latn_PH
+        case 0xB90742574C61746ELLU: // hio_Latn_BW
+        case 0xC50742524C61746ELLU: // hir_Latn_BR
+        case 0xCD07545258737578LLU: // hit_Xsux_TR
+        case 0xD90756554C61746ELLU: // hiw_Latn_VU
+        case 0xDD0742524C61746ELLU: // hix_Latn_BR
+        case 0xA12749444C61746ELLU: // hji_Latn_ID
+        case 0x8147545A4C61746ELLU: // hka_Latn_TZ
+        case 0x914743444C61746ELLU: // hke_Latn_CD
+        case 0x9D47494E41726162LLU: // hkh_Arab_IN
+        case 0xA94750474C61746ELLU: // hkk_Latn_PG
+        case 0x816750474C61746ELLU: // hla_Latn_PG
+        case 0x8567494E44657661LLU: // hlb_Deva_IN
+        case 0x8D67564E4C61746ELLU: // hld_Latn_VN
+        case 0xCD674D4D4C61746ELLU: // hlt_Latn_MM
+        case 0xD1675452486C7577LLU: // hlu_Hluw_TR
+        case 0x8187434E4C61746ELLU: // hma_Latn_CN
+        case 0x85874D4C4C61746ELLU: // hmb_Latn_ML
+        case 0x8D87434E506C7264LLU: // hmd_Plrd_CN
+        case 0x9587564E4C61746ELLU: // hmf_Latn_VN
+        case 0xA587434E426F706FLLU: // hmj_Bopo_CN
+        case 0xB187434E4C61746ELLU: // hmm_Latn_CN
+        case 0xB587434E4C61746ELLU: // hmn_Latn_CN
+        case 0xBD87434E4C61746ELLU: // hmp_Latn_CN
+        case 0xC187434E426F706FLLU: // hmq_Bopo_CN
+        case 0xC587494E4C61746ELLU: // hmr_Latn_IN
+        case 0xC987434E4C61746ELLU: // hms_Latn_CN
+        case 0xCD8750474C61746ELLU: // hmt_Latn_PG
+        case 0xD18749444C61746ELLU: // hmu_Latn_ID
+        case 0xD587564E4C61746ELLU: // hmv_Latn_VN
+        case 0xD987434E4C61746ELLU: // hmw_Latn_CN
+        case 0xE187434E4C61746ELLU: // hmy_Latn_CN
+        case 0xE587434E4C61746ELLU: // hmz_Latn_CN
+        case 0x81A7434D4C61746ELLU: // hna_Latn_CM
+        case 0x8DA7504B41726162LLU: // hnd_Arab_PK
+        case 0x91A7494E44657661LLU: // hne_Deva_IN
+        case 0x99A7414F4C61746ELLU: // hng_Latn_AO
+        case 0x9DA742574C61746ELLU: // hnh_Latn_BW
+        case 0xA1A7434E4C61746ELLU: // hni_Latn_CN
+        case 0xA5A74C41486D6E67LLU: // hnj_Hmng_LA
+        case 0xA5A75553486D6E70LLU: // hnj_Hmnp_US
+        case 0xB5A750484C61746ELLU: // hnn_Latn_PH
+        case 0xB9A7504B41726162LLU: // hno_Arab_PK
+        case 0xC9A753524C61746ELLU: // hns_Latn_SR
+        case 0x686F50474C61746ELLU: // ho_Latn_PG
+        case 0x81C753424C61746ELLU: // hoa_Latn_SB
+        case 0x85C750474C61746ELLU: // hob_Latn_PG
+        case 0x89C7494E44657661LLU: // hoc_Deva_IN
+        case 0x8DC74E474C61746ELLU: // hod_Latn_NG
+        case 0x91C74E474C61746ELLU: // hoe_Latn_NG
+        case 0x9DC74F4D41726162LLU: // hoh_Arab_OM
+        case 0xA1C755534C61746ELLU: // hoi_Latn_US
+        case 0xA5C7494E44657661LLU: // hoj_Deva_IN
+        case 0xADC7414F4C61746ELLU: // hol_Latn_AO
+        case 0xB1C753534C61746ELLU: // hom_Latn_SS
+        case 0xB9C743444C61746ELLU: // hoo_Latn_CD
+        case 0xBDC755534C61746ELLU: // hop_Latn_US
+        case 0xC5C754444C61746ELLU: // hor_Latn_TD
+        case 0xCDC750474C61746ELLU: // hot_Latn_PG
+        case 0xD5C749444C61746ELLU: // hov_Latn_ID
+        case 0xD9C7434E48616E69LLU: // how_Hani_CN
+        case 0xE1C7494E44657661LLU: // hoy_Deva_IN
+        case 0xB9E74D4D4D796D72LLU: // hpo_Mymr_MM
+        case 0x687248524C61746ELLU: // hr_Latn_HR
+        case 0x8227494E4C61746ELLU: // hra_Latn_IN
+        case 0x8A2750474C61746ELLU: // hrc_Latn_PG
+        case 0x9227564E4C61746ELLU: // hre_Latn_VN
+        case 0xAA2749444C61746ELLU: // hrk_Latn_ID
+        case 0xB227434E4C61746ELLU: // hrm_Latn_CN
+        case 0xBA27564E4C61746ELLU: // hro_Latn_VN
+        case 0xBE2741554C61746ELLU: // hrp_Latn_AU
+        case 0xCE27545253797263LLU: // hrt_Syrc_TR
+        case 0xD227494E4C61746ELLU: // hru_Latn_IN
+        case 0xDA2750474C61746ELLU: // hrw_Latn_PG
+        case 0xDE2742524C61746ELLU: // hrx_Latn_BR
+        case 0xE627495241726162LLU: // hrz_Arab_IR
+        case 0x864744454C61746ELLU: // hsb_Latn_DE
+        case 0xB647434E48616E73LLU: // hsn_Hans_CN
+        case 0xCA474F4D41726162LLU: // hss_Arab_OM
+        case 0x687448544C61746ELLU: // ht_Latn_HT
+        case 0xA26749444C61746ELLU: // hti_Latn_ID
+        case 0xBA67434F4C61746ELLU: // hto_Latn_CO
+        case 0xCA67545A4C61746ELLU: // hts_Latn_TZ
+        case 0xD26749444C61746ELLU: // htu_Latn_ID
+        case 0xDE67545258737578LLU: // htx_Xsux_TR
+        case 0x687548554C61746ELLU: // hu_Latn_HU
+        case 0x868750454C61746ELLU: // hub_Latn_PE
+        case 0x8A8742574C61746ELLU: // huc_Latn_BW
+        case 0x8E8749444C61746ELLU: // hud_Latn_ID
+        case 0x92874D584C61746ELLU: // hue_Latn_MX
+        case 0x968750474C61746ELLU: // huf_Latn_PG
+        case 0x9A8750454C61746ELLU: // hug_Latn_PE
+        case 0x9E87434C4C61746ELLU: // huh_Latn_CL
+        case 0xA28750474C61746ELLU: // hui_Latn_PG
+        case 0xAA8749444C61746ELLU: // huk_Latn_ID
+        case 0xAE8750474C61746ELLU: // hul_Latn_PG
+        case 0xB28743444C61746ELLU: // hum_Latn_CD
+        case 0xBE8755534C61746ELLU: // hup_Latn_US
+        case 0xC68743414C61746ELLU: // hur_Latn_CA
+        case 0xCA874D584C61746ELLU: // hus_Latn_MX
+        case 0xCE874E5044657661LLU: // hut_Deva_NP
+        case 0xD28750454C61746ELLU: // huu_Latn_PE
+        case 0xD6874D584C61746ELLU: // huv_Latn_MX
+        case 0xDA8749444C61746ELLU: // huw_Latn_ID
+        case 0xDE8750454C61746ELLU: // hux_Latn_PE
+        case 0xE287494C48656272LLU: // huy_Hebr_IL
+        case 0xE68752554379726CLLU: // huz_Cyrl_RU
+        case 0x8AA748544C61746ELLU: // hvc_Latn_HT
+        case 0x92A74D584C61746ELLU: // hve_Latn_MX
+        case 0xAAA74E434C61746ELLU: // hvk_Latn_NC
+        case 0xB6A749444C61746ELLU: // hvn_Latn_ID
+        case 0xD6A74D584C61746ELLU: // hvv_Latn_MX
+        case 0x82C743494C61746ELLU: // hwa_Latn_CI
+        case 0x8AC755534C61746ELLU: // hwc_Latn_US
+        case 0xBAC74E474C61746ELLU: // hwo_Latn_NG
+        case 0x6879414D41726D6ELLU: // hy_Armn_AM
+        case 0x8307434D4C61746ELLU: // hya_Latn_CM
+        case 0xDB07414D41726D6ELLU: // hyw_Armn_AM
+        case 0x687A4E414C61746ELLU: // hz_Latn_NA
+        case 0xA0084E434C61746ELLU: // iai_Latn_NC
+        case 0xB40850474C61746ELLU: // ian_Latn_PG
+        case 0xC40850474C61746ELLU: // iar_Latn_PG
+        case 0x80284D594C61746ELLU: // iba_Latn_MY
+        case 0x84284E474C61746ELLU: // ibb_Latn_NG
+        case 0x8C2841554C61746ELLU: // ibd_Latn_AU
+        case 0x90284E474C61746ELLU: // ibe_Latn_NG
+        case 0x982850484C61746ELLU: // ibg_Latn_PH
+        case 0x9C28564E4C61746ELLU: // ibh_Latn_VN
+        case 0xAC2850484C61746ELLU: // ibl_Latn_PH
+        case 0xB0284E474C61746ELLU: // ibm_Latn_NG
+        case 0xB4284E474C61746ELLU: // ibn_Latn_NG
+        case 0xC4284E474C61746ELLU: // ibr_Latn_NG
+        case 0xD02849444C61746ELLU: // ibu_Latn_ID
+        case 0xE0284E474C61746ELLU: // iby_Latn_NG
+        case 0x8048424A4C61746ELLU: // ica_Latn_BJ
+        case 0x9C484E474C61746ELLU: // ich_Latn_NG
+        case 0xC448434F4C61746ELLU: // icr_Latn_CO
+        case 0x696449444C61746ELLU: // id_Latn_ID
+        case 0x80684B454C61746ELLU: // ida_Latn_KE
+        case 0x8468494E4C61746ELLU: // idb_Latn_IN
+        case 0x88684E474C61746ELLU: // idc_Latn_NG
+        case 0x8C68424A4C61746ELLU: // idd_Latn_BJ
+        case 0x90684E474C61746ELLU: // ide_Latn_NG
+        case 0xA06850474C61746ELLU: // idi_Latn_PG
+        case 0xC46853534C61746ELLU: // idr_Latn_SS
+        case 0xC8684E474C61746ELLU: // ids_Latn_NG
+        case 0xCC68544C4C61746ELLU: // idt_Latn_TL
+        case 0xD0684E474C61746ELLU: // idu_Latn_NG
+        case 0x696545454C61746ELLU: // ie_Latn_EE
+        case 0x80A850484C61746ELLU: // ifa_Latn_PH
+        case 0x84A850484C61746ELLU: // ifb_Latn_PH
+        case 0x90A854474C61746ELLU: // ife_Latn_TG
+        case 0x94A856554C61746ELLU: // iff_Latn_VU
+        case 0xA8A850484C61746ELLU: // ifk_Latn_PH
+        case 0xB0A843474C61746ELLU: // ifm_Latn_CG
+        case 0xD0A850484C61746ELLU: // ifu_Latn_PH
+        case 0xE0A850484C61746ELLU: // ify_Latn_PH
+        case 0x69674E474C61746ELLU: // ig_Latn_NG
+        case 0x84C84E474C61746ELLU: // igb_Latn_NG
+        case 0x90C84E474C61746ELLU: // ige_Latn_NG
+        case 0x98C850474C61746ELLU: // igg_Latn_PG
+        case 0xACC84E474C61746ELLU: // igl_Latn_NG
+        case 0xB0C850474C61746ELLU: // igm_Latn_PG
+        case 0xB4C8424F4C61746ELLU: // ign_Latn_BO
+        case 0xB8C850474C61746ELLU: // igo_Latn_PG
+        case 0xD8C84E474C61746ELLU: // igw_Latn_NG
+        case 0x84E849444C61746ELLU: // ihb_Latn_ID
+        case 0xA0E84E474C61746ELLU: // ihi_Latn_NG
+        case 0xBCE849444C61746ELLU: // ihp_Latn_ID
+        case 0xD8E841554C61746ELLU: // ihw_Latn_AU
+        case 0x6969434E59696969LLU: // ii_Yiii_CN
+        case 0xB50841554C61746ELLU: // iin_Latn_AU
+        case 0x89284E474C61746ELLU: // ijc_Latn_NG
+        case 0x91284E474C61746ELLU: // ije_Latn_NG
+        case 0xA528424A4C61746ELLU: // ijj_Latn_BJ
+        case 0xB5284E474C61746ELLU: // ijn_Latn_NG
+        case 0xC9284E474C61746ELLU: // ijs_Latn_NG
+        case 0x696B55534C61746ELLU: // ik_Latn_US
+        case 0x9D484E474C61746ELLU: // ikh_Latn_NG
+        case 0xA1484E474C61746ELLU: // iki_Latn_NG
+        case 0xA9484E474C61746ELLU: // ikk_Latn_NG
+        case 0xAD484E474C61746ELLU: // ikl_Latn_NG
+        case 0xB9484E474C61746ELLU: // iko_Latn_NG
+        case 0xBD484E474C61746ELLU: // ikp_Latn_NG
+        case 0xC54841554C61746ELLU: // ikr_Latn_AU
+        case 0xCD4843414C61746ELLU: // ikt_Latn_CA
+        case 0xD5484E474C61746ELLU: // ikv_Latn_NG
+        case 0xD9484E474C61746ELLU: // ikw_Latn_NG
+        case 0xDD4855474C61746ELLU: // ikx_Latn_UG
+        case 0xE548545A4C61746ELLU: // ikz_Latn_TZ
+        case 0x816849444C61746ELLU: // ila_Latn_ID
+        case 0x85685A4D4C61746ELLU: // ilb_Latn_ZM
+        case 0x996841554C61746ELLU: // ilg_Latn_AU
+        case 0xA168434E4C61746ELLU: // ili_Latn_CN
+        case 0xA96850484C61746ELLU: // ilk_Latn_PH
+        case 0xB1684D594C61746ELLU: // ilm_Latn_MY
+        case 0xB96850484C61746ELLU: // ilo_Latn_PH
+        case 0xBD6850484C61746ELLU: // ilp_Latn_PH
+        case 0xD16849444C61746ELLU: // ilu_Latn_ID
+        case 0xD5684E474C61746ELLU: // ilv_Latn_NG
+        case 0xA18850474C61746ELLU: // imi_Latn_PG
+        case 0xAD8855534C61746ELLU: // iml_Latn_US
+        case 0xB58850474C61746ELLU: // imn_Latn_PG
+        case 0xB98850474C61746ELLU: // imo_Latn_PG
+        case 0xC58849444C61746ELLU: // imr_Latn_ID
+        case 0xC98849544C61746ELLU: // ims_Latn_IT
+        case 0xCD8853534C61746ELLU: // imt_Latn_SS
+        case 0xE18854524C796369LLU: // imy_Lyci_TR
+        case 0x696E49444C61746ELLU: // in_Latn_ID
+        case 0x85A8434F4C61746ELLU: // inb_Latn_CO
+        case 0x99A855534C61746ELLU: // ing_Latn_US
+        case 0x9DA852554379726CLLU: // inh_Cyrl_RU
+        case 0xA5A8434F4C61746ELLU: // inj_Latn_CO
+        case 0xB5A850484C61746ELLU: // inn_Latn_PH
+        case 0xB9A850474C61746ELLU: // ino_Latn_PG
+        case 0xBDA850454C61746ELLU: // inp_Latn_PE
+        case 0xCDA84D4D4D796D72LLU: // int_Mymr_MM
+        case 0xC5C8455445746869LLU: // ior_Ethi_ET
+        case 0xD1C850474C61746ELLU: // iou_Latn_PG
+        case 0xD9C855534C61746ELLU: // iow_Latn_US
+        case 0xA1E850474C61746ELLU: // ipi_Latn_PG
+        case 0xB9E850474C61746ELLU: // ipo_Latn_PG
+        case 0xD20850454C61746ELLU: // iqu_Latn_PE
+        case 0xDA084E474C61746ELLU: // iqw_Latn_NG
+        case 0x922849444C61746ELLU: // ire_Latn_ID
+        case 0x9E2849444C61746ELLU: // irh_Latn_ID
+        case 0xA2284E474C61746ELLU: // iri_Latn_NG
+        case 0xAA28545A4C61746ELLU: // irk_Latn_TZ
+        case 0xB62842524C61746ELLU: // irn_Latn_BR
+        case 0xD228494E54616D6CLLU: // iru_Taml_IN
+        case 0xDE2849444C61746ELLU: // irx_Latn_ID
+        case 0xE22850484C61746ELLU: // iry_Latn_PH
+        case 0x697349534C61746ELLU: // is_Latn_IS
+        case 0x824850474C61746ELLU: // isa_Latn_PG
+        case 0x8A4850454C61746ELLU: // isc_Latn_PE
+        case 0x8E4850484C61746ELLU: // isd_Latn_PH
+        case 0x9E484E474C61746ELLU: // ish_Latn_NG
+        case 0xA2484E474C61746ELLU: // isi_Latn_NG
+        case 0xAA48414641726162LLU: // isk_Arab_AF
+        case 0xB24849444C61746ELLU: // ism_Latn_ID
+        case 0xB648545A4C61746ELLU: // isn_Latn_TZ
+        case 0xBA484E474C61746ELLU: // iso_Latn_NG
+        case 0xCE4848524C61746ELLU: // ist_Latn_HR
+        case 0xD248434D4C61746ELLU: // isu_Latn_CM
+        case 0x697449544C61746ELLU: // it_Latn_IT
+        case 0x866850484C61746ELLU: // itb_Latn_PH
+        case 0x8E6849444C61746ELLU: // itd_Latn_ID
+        case 0x9268424F4C61746ELLU: // ite_Latn_BO
+        case 0xA26850484C61746ELLU: // iti_Latn_PH
+        case 0xAA68495448656272LLU: // itk_Hebr_IT
+        case 0xAE6852554379726CLLU: // itl_Cyrl_RU
+        case 0xB2684E474C61746ELLU: // itm_Latn_NG
+        case 0xBA68424F4C61746ELLU: // ito_Latn_BO
+        case 0xC66850474C61746ELLU: // itr_Latn_PG
+        case 0xCA684E474C61746ELLU: // its_Latn_NG
+        case 0xCE6850484C61746ELLU: // itt_Latn_PH
+        case 0xD66850484C61746ELLU: // itv_Latn_PH
+        case 0xDA684E474C61746ELLU: // itw_Latn_NG
+        case 0xDE6849444C61746ELLU: // itx_Latn_ID
+        case 0xE26850484C61746ELLU: // ity_Latn_PH
+        case 0xE66847544C61746ELLU: // itz_Latn_GT
+        case 0x6975434143616E73LLU: // iu_Cans_CA
+        case 0xB288434E4C61746ELLU: // ium_Latn_CN
+        case 0x86A850484C61746ELLU: // ivb_Latn_PH
+        case 0xD6A850484C61746ELLU: // ivv_Latn_PH
+        case 0x6977494C48656272LLU: // iw_Hebr_IL
+        case 0xAAC850484C61746ELLU: // iwk_Latn_PH
+        case 0xB2C850474C61746ELLU: // iwm_Latn_PG
+        case 0xBAC849444C61746ELLU: // iwo_Latn_ID
+        case 0xCAC850474C61746ELLU: // iws_Latn_PG
+        case 0x8AE84D584C61746ELLU: // ixc_Latn_MX
+        case 0xAEE847544C61746ELLU: // ixl_Latn_GT
+        case 0x83084E474C61746ELLU: // iya_Latn_NG
+        case 0xBB08434D4C61746ELLU: // iyo_Latn_CM
+        case 0xDF0843474C61746ELLU: // iyx_Latn_CG
+        case 0x9F2852554C61746ELLU: // izh_Latn_RU
+        case 0xB3284E474C61746ELLU: // izm_Latn_NG
+        case 0xC7284E474C61746ELLU: // izr_Latn_NG
+        case 0xE7284E474C61746ELLU: // izz_Latn_NG
+        case 0x6A614A504A70616ELLU: // ja_Jpan_JP
+        case 0x800942524C61746ELLU: // jaa_Latn_BR
+        case 0x84094E474C61746ELLU: // jab_Latn_NG
+        case 0x880947544C61746ELLU: // jac_Latn_GT
+        case 0x8C09474E41726162LLU: // jad_Arab_GN
+        case 0x900950474C61746ELLU: // jae_Latn_PG
+        case 0x94094E474C61746ELLU: // jaf_Latn_NG
+        case 0x9C094D594C61746ELLU: // jah_Latn_MY
+        case 0xA40953424C61746ELLU: // jaj_Latn_SB
+        case 0xA8094D594C61746ELLU: // jak_Latn_MY
+        case 0xAC0949444C61746ELLU: // jal_Latn_ID
+        case 0xB0094A4D4C61746ELLU: // jam_Latn_JM
+        case 0xB40941554C61746ELLU: // jan_Latn_AU
+        case 0xB80941554C61746ELLU: // jao_Latn_AU
+        case 0xC00949444C61746ELLU: // jaq_Latn_ID
+        case 0xC8094E434C61746ELLU: // jas_Latn_NC
+        case 0xCC09414641726162LLU: // jat_Arab_AF
+        case 0xD00949444C61746ELLU: // jau_Latn_ID
+        case 0xDC0949444C61746ELLU: // jax_Latn_ID
+        case 0xE00941554C61746ELLU: // jay_Latn_AU
+        case 0xE4094E434C61746ELLU: // jaz_Latn_NC
+        case 0x9029494C48656272LLU: // jbe_Hebr_IL
+        case 0xA02941554C61746ELLU: // jbi_Latn_AU
+        case 0xA42949444C61746ELLU: // jbj_Latn_ID
+        case 0xA82950474C61746ELLU: // jbk_Latn_PG
+        case 0xB0294E474C61746ELLU: // jbm_Latn_NG
+        case 0xB4294C5941726162LLU: // jbn_Arab_LY
+        case 0xC42949444C61746ELLU: // jbr_Latn_ID
+        case 0xCC2942524C61746ELLU: // jbt_Latn_BR
+        case 0xD029434D4C61746ELLU: // jbu_Latn_CM
+        case 0xD82941554C61746ELLU: // jbw_Latn_AU
+        case 0xCC4955414379726CLLU: // jct_Cyrl_UA
+        case 0x8069494E54696274LLU: // jda_Tibt_IN
+        case 0x9869504B41726162LLU: // jdg_Arab_PK
+        case 0xCC6952554379726CLLU: // jdt_Cyrl_RU
+        case 0x848950454C61746ELLU: // jeb_Latn_PE
+        case 0x90894E5044657661LLU: // jee_Deva_NP
+        case 0x9C89564E4C61746ELLU: // jeh_Latn_VN
+        case 0xA08949444C61746ELLU: // jei_Latn_ID
+        case 0xA88943494C61746ELLU: // jek_Latn_CI
+        case 0xAC8949444C61746ELLU: // jel_Latn_ID
+        case 0xB4894E474C61746ELLU: // jen_Latn_NG
+        case 0xC4894E474C61746ELLU: // jer_Latn_NG
+        case 0xCC8950474C61746ELLU: // jet_Latn_PG
+        case 0xD08954444C61746ELLU: // jeu_Latn_TD
+        case 0x84C943444C61746ELLU: // jgb_Latn_CD
+        case 0x90C9474547656F72LLU: // jge_Geor_GE
+        case 0xA8C94E474C61746ELLU: // jgk_Latn_NG
+        case 0xB8C9434D4C61746ELLU: // jgo_Latn_CM
+        case 0xA0E94D594C61746ELLU: // jhi_Latn_MY
+        case 0x6A69554148656272LLU: // ji_Hebr_UA
+        case 0x8109434D4C61746ELLU: // jia_Latn_CM
+        case 0x85094E474C61746ELLU: // jib_Latn_NG
+        case 0x8909484E4C61746ELLU: // jic_Latn_HN
+        case 0x8D094E474C61746ELLU: // jid_Latn_NG
+        case 0x91094E474C61746ELLU: // jie_Latn_NG
+        case 0x990941554C61746ELLU: // jig_Latn_AU
+        case 0xAD0950474C61746ELLU: // jil_Latn_PG
+        case 0xB109434D4C61746ELLU: // jim_Latn_CM
+        case 0xCD09545A4C61746ELLU: // jit_Latn_TZ
+        case 0xD109434E4C61746ELLU: // jiu_Latn_CN
+        case 0xD50945434C61746ELLU: // jiv_Latn_EC
+        case 0xE109434E4C61746ELLU: // jiy_Latn_CN
+        case 0x91294B5248616E67LLU: // jje_Hang_KR
+        case 0xC5294E474C61746ELLU: // jjr_Latn_NG
+        case 0x814949444C61746ELLU: // jka_Latn_ID
+        case 0xB1494D4D4D796D72LLU: // jkm_Mymr_MM
+        case 0xB94950474C61746ELLU: // jko_Latn_PG
+        case 0xD1494E474C61746ELLU: // jku_Latn_NG
+        case 0x916953444C61746ELLU: // jle_Latn_SD
+        case 0x818950474C61746ELLU: // jma_Latn_PG
+        case 0x85894E474C61746ELLU: // jmb_Latn_NG
+        case 0x8989545A4C61746ELLU: // jmc_Latn_TZ
+        case 0x8D8949444C61746ELLU: // jmd_Latn_ID
+        case 0xA1894E474C61746ELLU: // jmi_Latn_NG
+        case 0xAD894E5044657661LLU: // jml_Deva_NP
+        case 0xB5894D4D4C61746ELLU: // jmn_Latn_MM
+        case 0xC58947484C61746ELLU: // jmr_Latn_GH
+        case 0xC9894E474C61746ELLU: // jms_Latn_NG
+        case 0xD98950474C61746ELLU: // jmw_Latn_PG
+        case 0xDD894D584C61746ELLU: // jmx_Latn_MX
+        case 0x81A9494E54616B72LLU: // jna_Takr_IN
+        case 0x8DA9504B41726162LLU: // jnd_Arab_PK
+        case 0x99A941554C61746ELLU: // jng_Latn_AU
+        case 0xA1A94E474C61746ELLU: // jni_Latn_NG
+        case 0xA5A945544C61746ELLU: // jnj_Latn_ET
+        case 0xADA9494E44657661LLU: // jnl_Deva_IN
+        case 0xC9A9494E44657661LLU: // jns_Deva_IN
+        case 0x85C943444C61746ELLU: // job_Latn_CD
+        case 0x8DC943494C61746ELLU: // jod_Latn_CI
+        case 0x99C9504B41726162LLU: // jog_Arab_PK
+        case 0xC5C9424F4C61746ELLU: // jor_Latn_BO
+        case 0xD9C94D4C4C61746ELLU: // jow_Latn_ML
+        case 0x81E9505348656272LLU: // jpa_Hebr_PS
+        case 0xC5E9494C48656272LLU: // jpr_Hebr_IL
+        case 0xC60950454C61746ELLU: // jqr_Latn_PE
+        case 0x8229564E4C61746ELLU: // jra_Latn_VN
+        case 0x8629494C48656272LLU: // jrb_Hebr_IL
+        case 0xC6294E474C61746ELLU: // jrr_Latn_NG
+        case 0xCE294E474C61746ELLU: // jrt_Latn_NG
+        case 0xD22956454C61746ELLU: // jru_Latn_VE
+        case 0x828942524C61746ELLU: // jua_Latn_BR
+        case 0x86894E474C61746ELLU: // jub_Latn_NG
+        case 0x8E8943494C61746ELLU: // jud_Latn_CI
+        case 0x9E894E474C61746ELLU: // juh_Latn_NG
+        case 0xA28941554C61746ELLU: // jui_Latn_AU
+        case 0xAA894E474C61746ELLU: // juk_Latn_NG
+        case 0xAE894E5044657661LLU: // jul_Deva_NP
+        case 0xB28953444C61746ELLU: // jum_Latn_SD
+        case 0xB689494E4F727961LLU: // jun_Orya_IN
+        case 0xBA894E474C61746ELLU: // juo_Latn_NG
+        case 0xBE8942524C61746ELLU: // jup_Latn_BR
+        case 0xC68942524C61746ELLU: // jur_Latn_BR
+        case 0xCE89444B4C61746ELLU: // jut_Latn_DK
+        case 0xD2894E474C61746ELLU: // juu_Latn_NG
+        case 0xDA894E474C61746ELLU: // juw_Latn_NG
+        case 0xE289494E4F727961LLU: // juy_Orya_IN
+        case 0x6A7649444C61746ELLU: // jv_Latn_ID
+        case 0x8EA949444C61746ELLU: // jvd_Latn_ID
+        case 0xB6A953524C61746ELLU: // jvn_Latn_SR
+        case 0x6A7749444C61746ELLU: // jw_Latn_ID
+        case 0xA2C947484C61746ELLU: // jwi_Latn_GH
+        case 0x8309434E54696274LLU: // jya_Tibt_CN
+        case 0x9309494C48656272LLU: // jye_Hebr_IL
+        case 0xE30954444C61746ELLU: // jyy_Latn_TD
+        case 0x6B61474547656F72LLU: // ka_Geor_GE
+        case 0x800A555A4379726CLLU: // kaa_Cyrl_UZ
+        case 0x840A445A4C61746ELLU: // kab_Latn_DZ
+        case 0x880A4D4D4C61746ELLU: // kac_Latn_MM
+        case 0x8C0A4E474C61746ELLU: // kad_Latn_NG
+        case 0x980A4D594C61746ELLU: // kag_Latn_MY
+        case 0x9C0A43464C61746ELLU: // kah_Latn_CF
+        case 0xA00A4E474C61746ELLU: // kai_Latn_NG
+        case 0xA40A4E474C61746ELLU: // kaj_Latn_NG
+        case 0xA80A50484C61746ELLU: // kak_Latn_PH
+        case 0xB00A4B454C61746ELLU: // kam_Latn_KE
+        case 0xB80A4D4C4C61746ELLU: // kao_Latn_ML
+        case 0xBC0A52554379726CLLU: // kap_Cyrl_RU
+        case 0xC00A50454C61746ELLU: // kaq_Latn_PE
+        case 0xD40A42524C61746ELLU: // kav_Latn_BR
+        case 0xD80A49444B617769LLU: // kaw_Kawi_ID
+        case 0xDC0A49444C61746ELLU: // kax_Latn_ID
+        case 0xE00A42524C61746ELLU: // kay_Latn_BR
+        case 0x802A41554C61746ELLU: // kba_Latn_AU
+        case 0x842A42524C61746ELLU: // kbb_Latn_BR
+        case 0x882A42524C61746ELLU: // kbc_Latn_BR
+        case 0x8C2A52554379726CLLU: // kbd_Cyrl_RU
+        case 0x902A41554C61746ELLU: // kbe_Latn_AU
+        case 0x982A494E54696274LLU: // kbg_Tibt_IN
+        case 0x9C2A434F4C61746ELLU: // kbh_Latn_CO
+        case 0xA02A49444C61746ELLU: // kbi_Latn_ID
+        case 0xA42A43444C61746ELLU: // kbj_Latn_CD
+        case 0xA82A50474C61746ELLU: // kbk_Latn_PG
+        case 0xAC2A54444C61746ELLU: // kbl_Latn_TD
+        case 0xB02A50474C61746ELLU: // kbm_Latn_PG
+        case 0xB42A43464C61746ELLU: // kbn_Latn_CF
+        case 0xB82A53534C61746ELLU: // kbo_Latn_SS
+        case 0xBC2A54474C61746ELLU: // kbp_Latn_TG
+        case 0xC02A50474C61746ELLU: // kbq_Latn_PG
+        case 0xC42A45544C61746ELLU: // kbr_Latn_ET
+        case 0xC82A47414C61746ELLU: // kbs_Latn_GA
+        case 0xCC2A50474C61746ELLU: // kbt_Latn_PG
+        case 0xD02A504B41726162LLU: // kbu_Arab_PK
+        case 0xD42A49444C61746ELLU: // kbv_Latn_ID
+        case 0xD82A50474C61746ELLU: // kbw_Latn_PG
+        case 0xDC2A50474C61746ELLU: // kbx_Latn_PG
+        case 0xE02A4E4541726162LLU: // kby_Arab_NE
+        case 0xE42A4E474C61746ELLU: // kbz_Latn_NG
+        case 0x804A52554379726CLLU: // kca_Cyrl_RU
+        case 0x844A50474C61746ELLU: // kcb_Latn_PG
+        case 0x884A4E474C61746ELLU: // kcc_Latn_NG
+        case 0x8C4A49444C61746ELLU: // kcd_Latn_ID
+        case 0x904A4E474C61746ELLU: // kce_Latn_NG
+        case 0x944A4E474C61746ELLU: // kcf_Latn_NG
+        case 0x984A4E474C61746ELLU: // kcg_Latn_NG
+        case 0x9C4A4E474C61746ELLU: // kch_Latn_NG
+        case 0xA04A4E474C61746ELLU: // kci_Latn_NG
+        case 0xA44A47574C61746ELLU: // kcj_Latn_GW
+        case 0xA84A5A574C61746ELLU: // kck_Latn_ZW
+        case 0xAC4A50474C61746ELLU: // kcl_Latn_PG
+        case 0xB04A43464C61746ELLU: // kcm_Latn_CF
+        case 0xB44A55474C61746ELLU: // kcn_Latn_UG
+        case 0xB84A50474C61746ELLU: // kco_Latn_PG
+        case 0xBC4A53444C61746ELLU: // kcp_Latn_SD
+        case 0xC04A4E474C61746ELLU: // kcq_Latn_NG
+        case 0xC84A4E474C61746ELLU: // kcs_Latn_NG
+        case 0xCC4A50474C61746ELLU: // kct_Latn_PG
+        case 0xD04A545A4C61746ELLU: // kcu_Latn_TZ
+        case 0xD44A43444C61746ELLU: // kcv_Latn_CD
+        case 0xD84A43444C61746ELLU: // kcw_Latn_CD
+        case 0xE04A445A41726162LLU: // kcy_Arab_DZ
+        case 0xE44A545A4C61746ELLU: // kcz_Latn_TZ
+        case 0x806A41554C61746ELLU: // kda_Latn_AU
+        case 0x886A545A4C61746ELLU: // kdc_Latn_TZ
+        case 0x8C6A41554C61746ELLU: // kdd_Latn_AU
+        case 0x906A545A4C61746ELLU: // kde_Latn_TZ
+        case 0x946A50474C61746ELLU: // kdf_Latn_PG
+        case 0x986A43444C61746ELLU: // kdg_Latn_CD
+        case 0x9C6A54474C61746ELLU: // kdh_Latn_TG
+        case 0xA06A55474C61746ELLU: // kdi_Latn_UG
+        case 0xA46A55474C61746ELLU: // kdj_Latn_UG
+        case 0xA86A4E434C61746ELLU: // kdk_Latn_NC
+        case 0xAC6A4E474C61746ELLU: // kdl_Latn_NG
+        case 0xB06A4E474C61746ELLU: // kdm_Latn_NG
+        case 0xB46A5A574C61746ELLU: // kdn_Latn_ZW
+        case 0xBC6A4E474C61746ELLU: // kdp_Latn_NG
+        case 0xC06A494E42656E67LLU: // kdq_Beng_IN
+        case 0xC46A4C544C61746ELLU: // kdr_Latn_LT
+        case 0xCC6A544854686169LLU: // kdt_Thai_TH
+        case 0xD86A49444C61746ELLU: // kdw_Latn_ID
+        case 0xDC6A4E474C61746ELLU: // kdx_Latn_NG
+        case 0xE06A49444C61746ELLU: // kdy_Latn_ID
+        case 0xE46A434D4C61746ELLU: // kdz_Latn_CM
+        case 0x808A43564C61746ELLU: // kea_Latn_CV
+        case 0x848A47414C61746ELLU: // keb_Latn_GA
+        case 0x888A53444C61746ELLU: // kec_Latn_SD
+        case 0x8C8A545A4C61746ELLU: // ked_Latn_TZ
+        case 0x908A55534C61746ELLU: // kee_Latn_US
+        case 0x948A54474C61746ELLU: // kef_Latn_TG
+        case 0x988A53444C61746ELLU: // keg_Latn_SD
+        case 0x9C8A50474C61746ELLU: // keh_Latn_PG
+        case 0xA08A49444C61746ELLU: // kei_Latn_ID
+        case 0xA88A47544C61746ELLU: // kek_Latn_GT
+        case 0xAC8A43444C61746ELLU: // kel_Latn_CD
+        case 0xB08A544C4C61746ELLU: // kem_Latn_TL
+        case 0xB48A434D4C61746ELLU: // ken_Latn_CM
+        case 0xB88A55474C61746ELLU: // keo_Latn_UG
+        case 0xC48A54444C61746ELLU: // ker_Latn_TD
+        case 0xC88A4E474C61746ELLU: // kes_Latn_NG
+        case 0xCC8A52554379726CLLU: // ket_Cyrl_RU
+        case 0xD08A54474C61746ELLU: // keu_Latn_TG
+        case 0xD48A494E4D6C796DLLU: // kev_Mlym_IN
+        case 0xD88A50474C61746ELLU: // kew_Latn_PG
+        case 0xDC8A494E44657661LLU: // kex_Deva_IN
+        case 0xE08A494E54656C75LLU: // key_Telu_IN
+        case 0xE48A4E474C61746ELLU: // kez_Latn_NG
+        case 0x80AA494E4B6E6461LLU: // kfa_Knda_IN
+        case 0x84AA494E44657661LLU: // kfb_Deva_IN
+        case 0x88AA494E54656C75LLU: // kfc_Telu_IN
+        case 0x8CAA494E4B6E6461LLU: // kfd_Knda_IN
+        case 0x90AA494E54616D6CLLU: // kfe_Taml_IN
+        case 0x94AA494E4C61746ELLU: // kff_Latn_IN
+        case 0x98AA494E4B6E6461LLU: // kfg_Knda_IN
+        case 0x9CAA494E4D6C796DLLU: // kfh_Mlym_IN
+        case 0xA0AA494E54616D6CLLU: // kfi_Taml_IN
+        case 0xA8AA494E44657661LLU: // kfk_Deva_IN
+        case 0xACAA434D4C61746ELLU: // kfl_Latn_CM
+        case 0xB0AA495241726162LLU: // kfm_Arab_IR
+        case 0xB4AA434D4C61746ELLU: // kfn_Latn_CM
+        case 0xB8AA43494C61746ELLU: // kfo_Latn_CI
+        case 0xBCAA494E44657661LLU: // kfp_Deva_IN
+        case 0xC0AA494E44657661LLU: // kfq_Deva_IN
+        case 0xC4AA494E44657661LLU: // kfr_Deva_IN
+        case 0xC8AA494E44657661LLU: // kfs_Deva_IN
+        case 0xD0AA494E44657661LLU: // kfu_Deva_IN
+        case 0xD4AA494E4C61746ELLU: // kfv_Latn_IN
+        case 0xD8AA494E4C61746ELLU: // kfw_Latn_IN
+        case 0xDCAA494E44657661LLU: // kfx_Deva_IN
+        case 0xE0AA494E44657661LLU: // kfy_Deva_IN
+        case 0xE4AA42464C61746ELLU: // kfz_Latn_BF
+        case 0x6B6743444C61746ELLU: // kg_Latn_CD
+        case 0x80CA43494C61746ELLU: // kga_Latn_CI
+        case 0x84CA49444C61746ELLU: // kgb_Latn_ID
+        case 0x90CA49444C61746ELLU: // kge_Latn_ID
+        case 0x94CA50474C61746ELLU: // kgf_Latn_PG
+        case 0xA4CA4E5044657661LLU: // kgj_Deva_NP
+        case 0xA8CA42524C61746ELLU: // kgk_Latn_BR
+        case 0xACCA41554C61746ELLU: // kgl_Latn_AU
+        case 0xB8CA53444C61746ELLU: // kgo_Latn_SD
+        case 0xBCCA42524C61746ELLU: // kgp_Latn_BR
+        case 0xC0CA49444C61746ELLU: // kgq_Latn_ID
+        case 0xC4CA49444C61746ELLU: // kgr_Latn_ID
+        case 0xC8CA41554C61746ELLU: // kgs_Latn_AU
+        case 0xCCCA4E474C61746ELLU: // kgt_Latn_NG
+        case 0xD0CA50474C61746ELLU: // kgu_Latn_PG
+        case 0xD4CA49444C61746ELLU: // kgv_Latn_ID
+        case 0xD8CA49444C61746ELLU: // kgw_Latn_ID
+        case 0xDCCA49444C61746ELLU: // kgx_Latn_ID
+        case 0xE0CA4E5044657661LLU: // kgy_Deva_NP
+        case 0x80EA494E4C61746ELLU: // kha_Latn_IN
+        case 0x84EA434E54616C75LLU: // khb_Talu_CN
+        case 0x88EA49444C61746ELLU: // khc_Latn_ID
+        case 0x8CEA49444C61746ELLU: // khd_Latn_ID
+        case 0x90EA49444C61746ELLU: // khe_Latn_ID
+        case 0x94EA4C4154686169LLU: // khf_Thai_LA
+        case 0x98EA434E54696274LLU: // khg_Tibt_CN
+        case 0x9CEA49444C61746ELLU: // khh_Latn_ID
+        case 0xA4EA4E474C61746ELLU: // khj_Latn_NG
+        case 0xACEA50474C61746ELLU: // khl_Latn_PG
+        case 0xB4EA494E44657661LLU: // khn_Deva_IN
+        case 0xB8EA495242726168LLU: // kho_Brah_IR
+        case 0xBCEA49444C61746ELLU: // khp_Latn_ID
+        case 0xC0EA4D4C4C61746ELLU: // khq_Latn_ML
+        case 0xC4EA494E4C61746ELLU: // khr_Latn_IN
+        case 0xC8EA50474C61746ELLU: // khs_Latn_PG
+        case 0xCCEA494E4D796D72LLU: // kht_Mymr_IN
+        case 0xD0EA414F4C61746ELLU: // khu_Latn_AO
+        case 0xD4EA52554379726CLLU: // khv_Cyrl_RU
+        case 0xD8EA504B41726162LLU: // khw_Arab_PK
+        case 0xDCEA43444C61746ELLU: // khx_Latn_CD
+        case 0xE0EA43444C61746ELLU: // khy_Latn_CD
+        case 0xE4EA50474C61746ELLU: // khz_Latn_PG
+        case 0x6B694B454C61746ELLU: // ki_Latn_KE
+        case 0x810A54444C61746ELLU: // kia_Latn_TD
+        case 0x850A53444C61746ELLU: // kib_Latn_SD
+        case 0x890A55534C61746ELLU: // kic_Latn_US
+        case 0x8D0A434D4C61746ELLU: // kid_Latn_CM
+        case 0x910A54444C61746ELLU: // kie_Latn_TD
+        case 0x950A4E5044657661LLU: // kif_Deva_NP
+        case 0x990A49444C61746ELLU: // kig_Latn_ID
+        case 0x9D0A50474C61746ELLU: // kih_Latn_PG
+        case 0xA50A50474C61746ELLU: // kij_Latn_PG
+        case 0xAD0A4E474C61746ELLU: // kil_Latn_NG
+        case 0xB10A52554379726CLLU: // kim_Cyrl_RU
+        case 0xB90A55534C61746ELLU: // kio_Latn_US
+        case 0xBD0A4E5044657661LLU: // kip_Deva_NP
+        case 0xC10A49444C61746ELLU: // kiq_Latn_ID
+        case 0xC90A50474C61746ELLU: // kis_Latn_PG
+        case 0xCD0A50474C61746ELLU: // kit_Latn_PG
+        case 0xD10A54524C61746ELLU: // kiu_Latn_TR
+        case 0xD50A545A4C61746ELLU: // kiv_Latn_TZ
+        case 0xD90A50474C61746ELLU: // kiw_Latn_PG
+        case 0xDD0A494E4C61746ELLU: // kix_Latn_IN
+        case 0xE10A49444C61746ELLU: // kiy_Latn_ID
+        case 0xE50A545A4C61746ELLU: // kiz_Latn_TZ
+        case 0x6B6A4E414C61746ELLU: // kj_Latn_NA
+        case 0x812A49444C61746ELLU: // kja_Latn_ID
+        case 0x852A47544C61746ELLU: // kjb_Latn_GT
+        case 0x892A49444C61746ELLU: // kjc_Latn_ID
+        case 0x8D2A50474C61746ELLU: // kjd_Latn_PG
+        case 0x912A49444C61746ELLU: // kje_Latn_ID
+        case 0x992A4C414C616F6FLLU: // kjg_Laoo_LA
+        case 0x9D2A52554379726CLLU: // kjh_Cyrl_RU
+        case 0xA12A53424C61746ELLU: // kji_Latn_SB
+        case 0xA52A415A4C61746ELLU: // kjj_Latn_AZ
+        case 0xA92A49444C61746ELLU: // kjk_Latn_ID
+        case 0xAD2A4E5044657661LLU: // kjl_Deva_NP
+        case 0xB12A564E4C61746ELLU: // kjm_Latn_VN
+        case 0xB52A41554C61746ELLU: // kjn_Latn_AU
+        case 0xB92A494E44657661LLU: // kjo_Deva_IN
+        case 0xBD2A4D4D4D796D72LLU: // kjp_Mymr_MM
+        case 0xC12A55534C61746ELLU: // kjq_Latn_US
+        case 0xC52A49444C61746ELLU: // kjr_Latn_ID
+        case 0xC92A50474C61746ELLU: // kjs_Latn_PG
+        case 0xCD2A544854686169LLU: // kjt_Thai_TH
+        case 0xD12A55534C61746ELLU: // kju_Latn_US
+        case 0xDD2A50474C61746ELLU: // kjx_Latn_PG
+        case 0xE12A50474C61746ELLU: // kjy_Latn_PG
+        case 0xE52A425454696274LLU: // kjz_Tibt_BT
+        case 0x6B6B434E41726162LLU: // kk_Arab_CN
+        case 0x6B6B4B5A4379726CLLU: // kk_Cyrl_KZ
+        case 0x814A4E474C61746ELLU: // kka_Latn_NG
+        case 0x854A49444C61746ELLU: // kkb_Latn_ID
+        case 0x894A50474C61746ELLU: // kkc_Latn_PG
+        case 0x8D4A4E474C61746ELLU: // kkd_Latn_NG
+        case 0x914A474E4C61746ELLU: // kke_Latn_GN
+        case 0x954A494E54696274LLU: // kkf_Tibt_IN
+        case 0x994A50484C61746ELLU: // kkg_Latn_PH
+        case 0x9D4A4D4D4C616E61LLU: // kkh_Lana_MM
+        case 0xA14A545A4C61746ELLU: // kki_Latn_TZ
+        case 0xA54A434D4C61746ELLU: // kkj_Latn_CM
+        case 0xA94A53424C61746ELLU: // kkk_Latn_SB
+        case 0xAD4A49444C61746ELLU: // kkl_Latn_ID
+        case 0xB14A4E474C61746ELLU: // kkm_Latn_NG
+        case 0xB94A53444C61746ELLU: // kko_Latn_SD
+        case 0xBD4A41554C61746ELLU: // kkp_Latn_AU
+        case 0xC14A43444C61746ELLU: // kkq_Latn_CD
+        case 0xC54A4E474C61746ELLU: // kkr_Latn_NG
+        case 0xC94A4E474C61746ELLU: // kks_Latn_NG
+        case 0xCD4A4E5044657661LLU: // kkt_Deva_NP
+        case 0xD14A4E474C61746ELLU: // kku_Latn_NG
+        case 0xD54A49444C61746ELLU: // kkv_Latn_ID
+        case 0xD94A43474C61746ELLU: // kkw_Latn_CG
+        case 0xDD4A49444C61746ELLU: // kkx_Latn_ID
+        case 0xE14A41554C61746ELLU: // kky_Latn_AU
+        case 0xE54A43414C61746ELLU: // kkz_Latn_CA
+        case 0x6B6C474C4C61746ELLU: // kl_Latn_GL
+        case 0x816A55534C61746ELLU: // kla_Latn_US
+        case 0x856A4D584C61746ELLU: // klb_Latn_MX
+        case 0x896A434D4C61746ELLU: // klc_Latn_CM
+        case 0x8D6A41554C61746ELLU: // kld_Latn_AU
+        case 0x916A4E5044657661LLU: // kle_Deva_NP
+        case 0x956A54444C61746ELLU: // klf_Latn_TD
+        case 0x996A50484C61746ELLU: // klg_Latn_PH
+        case 0x9D6A50474C61746ELLU: // klh_Latn_PG
+        case 0xA16A49444C61746ELLU: // kli_Latn_ID
+        case 0xA56A495241726162LLU: // klj_Arab_IR
+        case 0xA96A4E474C61746ELLU: // klk_Latn_NG
+        case 0xAD6A50484C61746ELLU: // kll_Latn_PH
+        case 0xB16A50474C61746ELLU: // klm_Latn_PG
+        case 0xB56A4B454C61746ELLU: // kln_Latn_KE
+        case 0xB96A4E474C61746ELLU: // klo_Latn_NG
+        case 0xBD6A50474C61746ELLU: // klp_Latn_PG
+        case 0xC16A50474C61746ELLU: // klq_Latn_PG
+        case 0xC56A4E5044657661LLU: // klr_Deva_NP
+        case 0xC96A504B4C61746ELLU: // kls_Latn_PK
+        case 0xCD6A50474C61746ELLU: // klt_Latn_PG
+        case 0xD16A4C524C61746ELLU: // klu_Latn_LR
+        case 0xD56A56554C61746ELLU: // klv_Latn_VU
+        case 0xD96A49444C61746ELLU: // klw_Latn_ID
+        case 0xDD6A50474C61746ELLU: // klx_Latn_PG
+        case 0xE16A49444C61746ELLU: // kly_Latn_ID
+        case 0xE56A49444C61746ELLU: // klz_Latn_ID
+        case 0x6B6D4B484B686D72LLU: // km_Khmr_KH
+        case 0x818A47484C61746ELLU: // kma_Latn_GH
+        case 0x858A414F4C61746ELLU: // kmb_Latn_AO
+        case 0x898A434E4C61746ELLU: // kmc_Latn_CN
+        case 0x8D8A50484C61746ELLU: // kmd_Latn_PH
+        case 0x918A434D4C61746ELLU: // kme_Latn_CM
+        case 0x958A50474C61746ELLU: // kmf_Latn_PG
+        case 0x998A50474C61746ELLU: // kmg_Latn_PG
+        case 0x9D8A50474C61746ELLU: // kmh_Latn_PG
+        case 0xA18A4E474C61746ELLU: // kmi_Latn_NG
+        case 0xA58A494E44657661LLU: // kmj_Deva_IN
+        case 0xA98A50484C61746ELLU: // kmk_Latn_PH
+        case 0xAD8A50484C61746ELLU: // kml_Latn_PH
+        case 0xB18A494E4C61746ELLU: // kmm_Latn_IN
+        case 0xB58A50474C61746ELLU: // kmn_Latn_PG
+        case 0xB98A50474C61746ELLU: // kmo_Latn_PG
+        case 0xBD8A434D4C61746ELLU: // kmp_Latn_CM
+        case 0xC18A45544C61746ELLU: // kmq_Latn_ET
+        case 0xC98A50474C61746ELLU: // kms_Latn_PG
+        case 0xCD8A49444C61746ELLU: // kmt_Latn_ID
+        case 0xD18A50474C61746ELLU: // kmu_Latn_PG
+        case 0xD58A42524C61746ELLU: // kmv_Latn_BR
+        case 0xD98A43444C61746ELLU: // kmw_Latn_CD
+        case 0xDD8A50474C61746ELLU: // kmx_Latn_PG
+        case 0xE18A4E474C61746ELLU: // kmy_Latn_NG
+        case 0xE58A495241726162LLU: // kmz_Arab_IR
+        case 0x6B6E494E4B6E6461LLU: // kn_Knda_IN
+        case 0x81AA4E474C61746ELLU: // kna_Latn_NG
+        case 0x85AA50484C61746ELLU: // knb_Latn_PH
+        case 0x8DAA49444C61746ELLU: // knd_Latn_ID
+        case 0x91AA50484C61746ELLU: // kne_Latn_PH
+        case 0x95AA47574C61746ELLU: // knf_Latn_GW
+        case 0xA1AA4E474C61746ELLU: // kni_Latn_NG
+        case 0xA5AA47544C61746ELLU: // knj_Latn_GT
+        case 0xA9AA534C4C61746ELLU: // knk_Latn_SL
+        case 0xADAA49444C61746ELLU: // knl_Latn_ID
+        case 0xB1AA42524C61746ELLU: // knm_Latn_BR
+        case 0xB5AA494E44657661LLU: // knn_Deva_IN
+        case 0xB9AA534C4C61746ELLU: // kno_Latn_SL
+        case 0xBDAA434D4C61746ELLU: // knp_Latn_CM
+        case 0xC1AA4D594C61746ELLU: // knq_Latn_MY
+        case 0xC5AA50474C61746ELLU: // knr_Latn_PG
+        case 0xC9AA4D594C61746ELLU: // kns_Latn_MY
+        case 0xCDAA42524C61746ELLU: // knt_Latn_BR
+        case 0xD1AA474E4C61746ELLU: // knu_Latn_GN
+        case 0xD5AA50474C61746ELLU: // knv_Latn_PG
+        case 0xD9AA4E414C61746ELLU: // knw_Latn_NA
+        case 0xDDAA49444C61746ELLU: // knx_Latn_ID
+        case 0xE1AA43444C61746ELLU: // kny_Latn_CD
+        case 0xE5AA42464C61746ELLU: // knz_Latn_BF
+        case 0x6B6F4B524B6F7265LLU: // ko_Kore_KR
+        case 0x81CA50474C61746ELLU: // koa_Latn_PG
+        case 0x89CA4E474C61746ELLU: // koc_Latn_NG
+        case 0x8DCA49444C61746ELLU: // kod_Latn_ID
+        case 0x91CA53534C61746ELLU: // koe_Latn_SS
+        case 0x95CA4E474C61746ELLU: // kof_Latn_NG
+        case 0x99CA434F4C61746ELLU: // kog_Latn_CO
+        case 0x9DCA43474C61746ELLU: // koh_Latn_CG
+        case 0xA1CA52554379726CLLU: // koi_Cyrl_RU
+        case 0xA9CA494E44657661LLU: // kok_Deva_IN
+        case 0xADCA50474C61746ELLU: // kol_Latn_PG
+        case 0xB9CA55474C61746ELLU: // koo_Latn_UG
+        case 0xBDCA50474C61746ELLU: // kop_Latn_PG
+        case 0xC1CA47414C61746ELLU: // koq_Latn_GA
+        case 0xC9CA464D4C61746ELLU: // kos_Latn_FM
+        case 0xCDCA434D4C61746ELLU: // kot_Latn_CM
+        case 0xD1CA54444C61746ELLU: // kou_Latn_TD
+        case 0xD5CA4E474C61746ELLU: // kov_Latn_NG
+        case 0xD9CA4E474C61746ELLU: // kow_Latn_NG
+        case 0xE1CA55534C61746ELLU: // koy_Latn_US
+        case 0xE5CA50474C61746ELLU: // koz_Latn_PG
+        case 0x81EA4E474C61746ELLU: // kpa_Latn_NG
+        case 0x89EA434F4C61746ELLU: // kpc_Latn_CO
+        case 0x8DEA49444C61746ELLU: // kpd_Latn_ID
+        case 0x91EA4C524C61746ELLU: // kpe_Latn_LR
+        case 0x95EA50474C61746ELLU: // kpf_Latn_PG
+        case 0x99EA464D4C61746ELLU: // kpg_Latn_FM
+        case 0x9DEA47484C61746ELLU: // kph_Latn_GH
+        case 0xA1EA49444C61746ELLU: // kpi_Latn_ID
+        case 0xA5EA42524C61746ELLU: // kpj_Latn_BR
+        case 0xA9EA4E474C61746ELLU: // kpk_Latn_NG
+        case 0xADEA43444C61746ELLU: // kpl_Latn_CD
+        case 0xB1EA564E4C61746ELLU: // kpm_Latn_VN
+        case 0xB5EA42524C61746ELLU: // kpn_Latn_BR
+        case 0xB9EA54474C61746ELLU: // kpo_Latn_TG
+        case 0xC1EA49444C61746ELLU: // kpq_Latn_ID
+        case 0xC5EA50474C61746ELLU: // kpr_Latn_PG
+        case 0xC9EA49444C61746ELLU: // kps_Latn_ID
+        case 0xCDEA52554379726CLLU: // kpt_Cyrl_RU
+        case 0xD1EA49444C61746ELLU: // kpu_Latn_ID
+        case 0xD9EA50474C61746ELLU: // kpw_Latn_PG
+        case 0xDDEA50474C61746ELLU: // kpx_Latn_PG
+        case 0xE1EA52554379726CLLU: // kpy_Cyrl_RU
+        case 0xE5EA55474C61746ELLU: // kpz_Latn_UG
+        case 0x820A50474C61746ELLU: // kqa_Latn_PG
+        case 0x860A50474C61746ELLU: // kqb_Latn_PG
+        case 0x8A0A50474C61746ELLU: // kqc_Latn_PG
+        case 0x8E0A495153797263LLU: // kqd_Syrc_IQ
+        case 0x920A50484C61746ELLU: // kqe_Latn_PH
+        case 0x960A50474C61746ELLU: // kqf_Latn_PG
+        case 0x9A0A42464C61746ELLU: // kqg_Latn_BF
+        case 0x9E0A545A4C61746ELLU: // kqh_Latn_TZ
+        case 0xA20A50474C61746ELLU: // kqi_Latn_PG
+        case 0xA60A50474C61746ELLU: // kqj_Latn_PG
+        case 0xAA0A424A4C61746ELLU: // kqk_Latn_BJ
+        case 0xAE0A50474C61746ELLU: // kql_Latn_PG
+        case 0xB20A43494C61746ELLU: // kqm_Latn_CI
+        case 0xB60A5A4D4C61746ELLU: // kqn_Latn_ZM
+        case 0xBA0A4C524C61746ELLU: // kqo_Latn_LR
+        case 0xBE0A54444C61746ELLU: // kqp_Latn_TD
+        case 0xC20A42524C61746ELLU: // kqq_Latn_BR
+        case 0xC60A4D594C61746ELLU: // kqr_Latn_MY
+        case 0xCA0A474E4C61746ELLU: // kqs_Latn_GN
+        case 0xCE0A4D594C61746ELLU: // kqt_Latn_MY
+        case 0xD20A5A414C61746ELLU: // kqu_Latn_ZA
+        case 0xD60A49444C61746ELLU: // kqv_Latn_ID
+        case 0xDA0A50474C61746ELLU: // kqw_Latn_PG
+        case 0xDE0A434D4C61746ELLU: // kqx_Latn_CM
+        case 0xE20A455445746869LLU: // kqy_Ethi_ET
+        case 0xE60A5A414C61746ELLU: // kqz_Latn_ZA
+        case 0x6B724E474C61746ELLU: // kr_Latn_NG
+        case 0x822A4E5044657661LLU: // kra_Deva_NP
+        case 0x862A55534C61746ELLU: // krb_Latn_US
+        case 0x8A2A52554379726CLLU: // krc_Cyrl_RU
+        case 0x8E2A544C4C61746ELLU: // krd_Latn_TL
+        case 0x922A42524C61746ELLU: // kre_Latn_BR
+        case 0x962A56554C61746ELLU: // krf_Latn_VU
+        case 0x9E2A4E474C61746ELLU: // krh_Latn_NG
+        case 0xA22A534C4C61746ELLU: // kri_Latn_SL
+        case 0xA62A50484C61746ELLU: // krj_Latn_PH
+        case 0xAA2A52554379726CLLU: // krk_Cyrl_RU
+        case 0xAE2A52554C61746ELLU: // krl_Latn_RU
+        case 0xB62A4C524C61746ELLU: // krn_Latn_LR
+        case 0xBE2A4E474C61746ELLU: // krp_Latn_NG
+        case 0xC62A4B484B686D72LLU: // krr_Khmr_KH
+        case 0xCA2A53534C61746ELLU: // krs_Latn_SS
+        case 0xCE2A4E454C61746ELLU: // krt_Latn_NE
+        case 0xD22A494E44657661LLU: // kru_Deva_IN
+        case 0xD62A4B484B686D72LLU: // krv_Khmr_KH
+        case 0xDA2A4C524C61746ELLU: // krw_Latn_LR
+        case 0xDE2A534E4C61746ELLU: // krx_Latn_SN
+        case 0xE22A415A4C61746ELLU: // kry_Latn_AZ
+        case 0xE62A49444C61746ELLU: // krz_Latn_ID
+        case 0x6B73494E41726162LLU: // ks_Arab_IN
+        case 0x864A545A4C61746ELLU: // ksb_Latn_TZ
+        case 0x8A4A50484C61746ELLU: // ksc_Latn_PH
+        case 0x8E4A50474C61746ELLU: // ksd_Latn_PG
+        case 0x924A50474C61746ELLU: // kse_Latn_PG
+        case 0x964A434D4C61746ELLU: // ksf_Latn_CM
+        case 0x9A4A53424C61746ELLU: // ksg_Latn_SB
+        case 0x9E4A44454C61746ELLU: // ksh_Latn_DE
+        case 0xA24A50474C61746ELLU: // ksi_Latn_PG
+        case 0xA64A50474C61746ELLU: // ksj_Latn_PG
+        case 0xAA4A55534C61746ELLU: // ksk_Latn_US
+        case 0xAE4A50474C61746ELLU: // ksl_Latn_PG
+        case 0xB24A4E474C61746ELLU: // ksm_Latn_NG
+        case 0xB64A50484C61746ELLU: // ksn_Latn_PH
+        case 0xBA4A4E474C61746ELLU: // kso_Latn_NG
+        case 0xBE4A43464C61746ELLU: // ksp_Latn_CF
+        case 0xC24A4E474C61746ELLU: // ksq_Latn_NG
+        case 0xC64A50474C61746ELLU: // ksr_Latn_PG
+        case 0xCA4A4C524C61746ELLU: // kss_Latn_LR
+        case 0xCE4A42464C61746ELLU: // kst_Latn_BF
+        case 0xD24A494E4D796D72LLU: // ksu_Mymr_IN
+        case 0xD64A43444C61746ELLU: // ksv_Latn_CD
+        case 0xDA4A4D4D4D796D72LLU: // ksw_Mymr_MM
+        case 0xDE4A49444C61746ELLU: // ksx_Latn_ID
+        case 0xE64A494E44657661LLU: // ksz_Deva_IN
+        case 0x826A564E4C61746ELLU: // kta_Latn_VN
+        case 0x866A455445746869LLU: // ktb_Ethi_ET
+        case 0x8A6A4E474C61746ELLU: // ktc_Latn_NG
+        case 0x8E6A41554C61746ELLU: // ktd_Latn_AU
+        case 0x926A4E5044657661LLU: // kte_Deva_NP
+        case 0x966A43444C61746ELLU: // ktf_Latn_CD
+        case 0x9A6A41554C61746ELLU: // ktg_Latn_AU
+        case 0x9E6A54444C61746ELLU: // kth_Latn_TD
+        case 0xA26A49444C61746ELLU: // kti_Latn_ID
+        case 0xA66A43494C61746ELLU: // ktj_Latn_CI
+        case 0xAA6A50474C61746ELLU: // ktk_Latn_PG
+        case 0xAE6A495241726162LLU: // ktl_Arab_IR
+        case 0xB26A50474C61746ELLU: // ktm_Latn_PG
+        case 0xB66A42524C61746ELLU: // ktn_Latn_BR
+        case 0xBA6A50474C61746ELLU: // kto_Latn_PG
+        case 0xBE6A434E506C7264LLU: // ktp_Plrd_CN
+        case 0xC26A50484C61746ELLU: // ktq_Latn_PH
+        case 0xCA6A49444C61746ELLU: // kts_Latn_ID
+        case 0xCE6A49444C61746ELLU: // ktt_Latn_ID
+        case 0xD26A43444C61746ELLU: // ktu_Latn_CD
+        case 0xD66A564E4C61746ELLU: // ktv_Latn_VN
+        case 0xDA6A55534C61746ELLU: // ktw_Latn_US
+        case 0xDE6A42524C61746ELLU: // ktx_Latn_BR
+        case 0xE26A43444C61746ELLU: // kty_Latn_CD
+        case 0xE66A4E414C61746ELLU: // ktz_Latn_NA
+        case 0x6B75495141726162LLU: // ku_Arab_IQ
+        case 0x6B7554524C61746ELLU: // ku_Latn_TR
+        case 0x6B75474559657A69LLU: // ku_Yezi_GE
+        case 0x868A4E474C61746ELLU: // kub_Latn_NG
+        case 0x8A8A49444C61746ELLU: // kuc_Latn_ID
+        case 0x8E8A50474C61746ELLU: // kud_Latn_PG
+        case 0x928A50474C61746ELLU: // kue_Latn_PG
+        case 0x968A4C414C616F6FLLU: // kuf_Laoo_LA
+        case 0x9A8A4E474C61746ELLU: // kug_Latn_NG
+        case 0x9E8A4E474C61746ELLU: // kuh_Latn_NG
+        case 0xA28A42524C61746ELLU: // kui_Latn_BR
+        case 0xA68A545A4C61746ELLU: // kuj_Latn_TZ
+        case 0xAA8A49444C61746ELLU: // kuk_Latn_ID
+        case 0xAE8A4E474C61746ELLU: // kul_Latn_NG
+        case 0xB28A52554379726CLLU: // kum_Cyrl_RU
+        case 0xB68A45524C61746ELLU: // kun_Latn_ER
+        case 0xBA8A50474C61746ELLU: // kuo_Latn_PG
+        case 0xBE8A50474C61746ELLU: // kup_Latn_PG
+        case 0xC28A42524C61746ELLU: // kuq_Latn_BR
+        case 0xCA8A47484C61746ELLU: // kus_Latn_GH
+        case 0xCE8A43414C61746ELLU: // kut_Latn_CA
+        case 0xD28A55534C61746ELLU: // kuu_Latn_US
+        case 0xD68A49444C61746ELLU: // kuv_Latn_ID
+        case 0xDA8A43464C61746ELLU: // kuw_Latn_CF
+        case 0xDE8A41554C61746ELLU: // kux_Latn_AU
+        case 0xE28A41554C61746ELLU: // kuy_Latn_AU
+        case 0xE68A434C4C61746ELLU: // kuz_Latn_CL
+        case 0x6B7652554379726CLLU: // kv_Cyrl_RU
+        case 0x82AA52554379726CLLU: // kva_Cyrl_RU
+        case 0x86AA49444C61746ELLU: // kvb_Latn_ID
+        case 0x8AAA50474C61746ELLU: // kvc_Latn_PG
+        case 0x8EAA49444C61746ELLU: // kvd_Latn_ID
+        case 0x92AA4D594C61746ELLU: // kve_Latn_MY
+        case 0x96AA54444C61746ELLU: // kvf_Latn_TD
+        case 0x9AAA50474C61746ELLU: // kvg_Latn_PG
+        case 0x9EAA49444C61746ELLU: // kvh_Latn_ID
+        case 0xA2AA54444C61746ELLU: // kvi_Latn_TD
+        case 0xA6AA434D4C61746ELLU: // kvj_Latn_CM
+        case 0xAEAA4D4D4C61746ELLU: // kvl_Latn_MM
+        case 0xB2AA434D4C61746ELLU: // kvm_Latn_CM
+        case 0xB6AA434F4C61746ELLU: // kvn_Latn_CO
+        case 0xBAAA49444C61746ELLU: // kvo_Latn_ID
+        case 0xBEAA49444C61746ELLU: // kvp_Latn_ID
+        case 0xC2AA4D4D4D796D72LLU: // kvq_Mymr_MM
+        case 0xC6AA49444C61746ELLU: // kvr_Latn_ID
+        case 0xCEAA4D4D4D796D72LLU: // kvt_Mymr_MM
+        case 0xD6AA49444C61746ELLU: // kvv_Latn_ID
+        case 0xDAAA49444C61746ELLU: // kvw_Latn_ID
+        case 0xDEAA504B41726162LLU: // kvx_Arab_PK
+        case 0xE2AA4D4D4B616C69LLU: // kvy_Kali_MM
+        case 0xE6AA49444C61746ELLU: // kvz_Latn_ID
+        case 0x6B7747424C61746ELLU: // kw_Latn_GB
+        case 0x82CA42524C61746ELLU: // kwa_Latn_BR
+        case 0x86CA4E474C61746ELLU: // kwb_Latn_NG
+        case 0x8ACA43474C61746ELLU: // kwc_Latn_CG
+        case 0x8ECA53424C61746ELLU: // kwd_Latn_SB
+        case 0x92CA49444C61746ELLU: // kwe_Latn_ID
+        case 0x96CA53424C61746ELLU: // kwf_Latn_SB
+        case 0x9ACA54444C61746ELLU: // kwg_Latn_TD
+        case 0x9ECA49444C61746ELLU: // kwh_Latn_ID
+        case 0xA2CA434F4C61746ELLU: // kwi_Latn_CO
+        case 0xA6CA50474C61746ELLU: // kwj_Latn_PG
+        case 0xAACA43414C61746ELLU: // kwk_Latn_CA
+        case 0xAECA4E474C61746ELLU: // kwl_Latn_NG
+        case 0xB2CA4E414C61746ELLU: // kwm_Latn_NA
+        case 0xB6CA4E414C61746ELLU: // kwn_Latn_NA
+        case 0xBACA50474C61746ELLU: // kwo_Latn_PG
+        case 0xBECA43494C61746ELLU: // kwp_Latn_CI
+        case 0xC6CA49444C61746ELLU: // kwr_Latn_ID
+        case 0xCACA43444C61746ELLU: // kws_Latn_CD
+        case 0xCECA49444C61746ELLU: // kwt_Latn_ID
+        case 0xD2CA434D4C61746ELLU: // kwu_Latn_CM
+        case 0xD6CA54444C61746ELLU: // kwv_Latn_TD
+        case 0xDACA53524C61746ELLU: // kww_Latn_SR
+        case 0xE2CA414F4C61746ELLU: // kwy_Latn_AO
+        case 0xE6CA414F4C61746ELLU: // kwz_Latn_AO
+        case 0x82EA50474C61746ELLU: // kxa_Latn_PG
+        case 0x86EA43494C61746ELLU: // kxb_Latn_CI
+        case 0x8AEA45544C61746ELLU: // kxc_Latn_ET
+        case 0x8EEA424E4C61746ELLU: // kxd_Latn_BN
+        case 0x96EA4D4D4D796D72LLU: // kxf_Mymr_MM
+        case 0xA2EA4D594C61746ELLU: // kxi_Latn_MY
+        case 0xA6EA54444C61746ELLU: // kxj_Latn_TD
+        case 0xAAEA4D4D4D796D72LLU: // kxk_Mymr_MM
+        case 0xB2EA544854686169LLU: // kxm_Thai_TH
+        case 0xB6EA4D594C61746ELLU: // kxn_Latn_MY
+        case 0xBAEA42524C61746ELLU: // kxo_Latn_BR
+        case 0xBEEA504B41726162LLU: // kxp_Arab_PK
+        case 0xC2EA49444C61746ELLU: // kxq_Latn_ID
+        case 0xC6EA50474C61746ELLU: // kxr_Latn_PG
+        case 0xCEEA50474C61746ELLU: // kxt_Latn_PG
+        case 0xD6EA494E4C61746ELLU: // kxv_Latn_IN
+        case 0xDAEA50474C61746ELLU: // kxw_Latn_PG
+        case 0xDEEA43474C61746ELLU: // kxx_Latn_CG
+        case 0xE2EA564E4C61746ELLU: // kxy_Latn_VN
+        case 0xE6EA50474C61746ELLU: // kxz_Latn_PG
+        case 0x6B79434E41726162LLU: // ky_Arab_CN
+        case 0x6B794B474379726CLLU: // ky_Cyrl_KG
+        case 0x6B7954524C61746ELLU: // ky_Latn_TR
+        case 0x830A545A4C61746ELLU: // kya_Latn_TZ
+        case 0x870A50484C61746ELLU: // kyb_Latn_PH
+        case 0x8B0A50474C61746ELLU: // kyc_Latn_PG
+        case 0x8F0A49444C61746ELLU: // kyd_Latn_ID
+        case 0x930A47484C61746ELLU: // kye_Latn_GH
+        case 0x970A43494C61746ELLU: // kyf_Latn_CI
+        case 0x9B0A50474C61746ELLU: // kyg_Latn_PG
+        case 0x9F0A55534C61746ELLU: // kyh_Latn_US
+        case 0xA30A4D594C61746ELLU: // kyi_Latn_MY
+        case 0xA70A50484C61746ELLU: // kyj_Latn_PH
+        case 0xAB0A50484C61746ELLU: // kyk_Latn_PH
+        case 0xAF0A55534C61746ELLU: // kyl_Latn_US
+        case 0xB30A43464C61746ELLU: // kym_Latn_CF
+        case 0xB70A50484C61746ELLU: // kyn_Latn_PH
+        case 0xBB0A49444C61746ELLU: // kyo_Latn_ID
+        case 0xC30A54444C61746ELLU: // kyq_Latn_TD
+        case 0xC70A42524C61746ELLU: // kyr_Latn_BR
+        case 0xCB0A4D594C61746ELLU: // kys_Latn_MY
+        case 0xCF0A49444C61746ELLU: // kyt_Latn_ID
+        case 0xD30A4D4D4B616C69LLU: // kyu_Kali_MM
+        case 0xD70A4E5044657661LLU: // kyv_Deva_NP
+        case 0xDB0A494E44657661LLU: // kyw_Deva_IN
+        case 0xDF0A50474C61746ELLU: // kyx_Latn_PG
+        case 0xE30A50474C61746ELLU: // kyy_Latn_PG
+        case 0xE70A42524C61746ELLU: // kyz_Latn_BR
+        case 0x832A42464C61746ELLU: // kza_Latn_BF
+        case 0x872A49444C61746ELLU: // kzb_Latn_ID
+        case 0x8B2A43494C61746ELLU: // kzc_Latn_CI
+        case 0x8F2A49444C61746ELLU: // kzd_Latn_ID
+        case 0x932A50474C61746ELLU: // kze_Latn_PG
+        case 0x972A49444C61746ELLU: // kzf_Latn_ID
+        case 0xA32A4D594C61746ELLU: // kzi_Latn_MY
+        case 0xAB2A53424C61746ELLU: // kzk_Latn_SB
+        case 0xAF2A49444C61746ELLU: // kzl_Latn_ID
+        case 0xB32A49444C61746ELLU: // kzm_Latn_ID
+        case 0xB72A4D574C61746ELLU: // kzn_Latn_MW
+        case 0xBB2A47414C61746ELLU: // kzo_Latn_GA
+        case 0xBF2A49444C61746ELLU: // kzp_Latn_ID
+        case 0xC72A434D4C61746ELLU: // kzr_Latn_CM
+        case 0xCB2A4D594C61746ELLU: // kzs_Latn_MY
+        case 0xD32A49444C61746ELLU: // kzu_Latn_ID
+        case 0xD72A49444C61746ELLU: // kzv_Latn_ID
+        case 0xDB2A42524C61746ELLU: // kzw_Latn_BR
+        case 0xDF2A49444C61746ELLU: // kzx_Latn_ID
+        case 0xE32A43444C61746ELLU: // kzy_Latn_CD
+        case 0xE72A49444C61746ELLU: // kzz_Latn_ID
+        case 0x6C6156414C61746ELLU: // la_Latn_VA
+        case 0x800B50484C61746ELLU: // laa_Latn_PH
+        case 0x840B47524C696E61LLU: // lab_Lina_GR
+        case 0x880B4D584C61746ELLU: // lac_Latn_MX
+        case 0x8C0B494C48656272LLU: // lad_Hebr_IL
+        case 0x900B494E44657661LLU: // lae_Deva_IN
+        case 0x980B545A4C61746ELLU: // lag_Latn_TZ
+        case 0x9C0B504B41726162LLU: // lah_Arab_PK
+        case 0xA00B4D574C61746ELLU: // lai_Latn_MW
+        case 0xA40B55474C61746ELLU: // laj_Latn_UG
+        case 0xAC0B43444C61746ELLU: // lal_Latn_CD
+        case 0xB00B5A4D4C61746ELLU: // lam_Latn_ZM
+        case 0xB40B4E474C61746ELLU: // lan_Latn_NG
+        case 0xBC0B54444C61746ELLU: // lap_Latn_TD
+        case 0xC00B564E4C61746ELLU: // laq_Latn_VN
+        case 0xC40B47484C61746ELLU: // lar_Latn_GH
+        case 0xC80B54474C61746ELLU: // las_Latn_TG
+        case 0xD00B49444C61746ELLU: // lau_Latn_ID
+        case 0xD80B49444C61746ELLU: // law_Latn_ID
+        case 0xDC0B494E4C61746ELLU: // lax_Latn_IN
+        case 0xE40B50474C61746ELLU: // laz_Latn_PG
+        case 0x6C624C554C61746ELLU: // lb_Latn_LU
+        case 0x842B50474C61746ELLU: // lbb_Latn_PG
+        case 0x902B52554379726CLLU: // lbe_Cyrl_RU
+        case 0x942B494E44657661LLU: // lbf_Deva_IN
+        case 0xA02B434D4C61746ELLU: // lbi_Latn_CM
+        case 0xA42B494E54696274LLU: // lbj_Tibt_IN
+        case 0xAC2B50484C61746ELLU: // lbl_Latn_PH
+        case 0xB02B494E44657661LLU: // lbm_Deva_IN
+        case 0xB42B4C414C61746ELLU: // lbn_Latn_LA
+        case 0xB82B4C414C616F6FLLU: // lbo_Laoo_LA
+        case 0xC02B50474C61746ELLU: // lbq_Latn_PG
+        case 0xC42B4E5044657661LLU: // lbr_Deva_NP
+        case 0xCC2B564E4C61746ELLU: // lbt_Latn_VN
+        case 0xD02B50474C61746ELLU: // lbu_Latn_PG
+        case 0xD42B50474C61746ELLU: // lbv_Latn_PG
+        case 0xD82B49444C61746ELLU: // lbw_Latn_ID
+        case 0xDC2B49444C61746ELLU: // lbx_Latn_ID
+        case 0xE02B41554C61746ELLU: // lby_Latn_AU
+        case 0xE42B41554C61746ELLU: // lbz_Latn_AU
+        case 0x884B49444C61746ELLU: // lcc_Latn_ID
+        case 0x8C4B49444C61746ELLU: // lcd_Latn_ID
+        case 0x904B49444C61746ELLU: // lce_Latn_ID
+        case 0x944B49444C61746ELLU: // lcf_Latn_ID
+        case 0x9C4B414F4C61746ELLU: // lch_Latn_AO
+        case 0xAC4B49444C61746ELLU: // lcl_Latn_ID
+        case 0xB04B50474C61746ELLU: // lcm_Latn_PG
+        case 0xBC4B434E54686169LLU: // lcp_Thai_CN
+        case 0xC04B49444C61746ELLU: // lcq_Latn_ID
+        case 0xC84B49444C61746ELLU: // lcs_Latn_ID
+        case 0x806B43494C61746ELLU: // lda_Latn_CI
+        case 0x846B4E474C61746ELLU: // ldb_Latn_NG
+        case 0x8C6B4E474C61746ELLU: // ldd_Latn_NG
+        case 0x986B4E474C61746ELLU: // ldg_Latn_NG
+        case 0x9C6B4E474C61746ELLU: // ldh_Latn_NG
+        case 0xA06B43474C61746ELLU: // ldi_Latn_CG
+        case 0xA46B4E474C61746ELLU: // ldj_Latn_NG
+        case 0xA86B4E474C61746ELLU: // ldk_Latn_NG
+        case 0xAC6B4E474C61746ELLU: // ldl_Latn_NG
+        case 0xB06B474E4C61746ELLU: // ldm_Latn_GN
+        case 0xB86B4E474C61746ELLU: // ldo_Latn_NG
+        case 0xBC6B4E474C61746ELLU: // ldp_Latn_NG
+        case 0xC06B4E474C61746ELLU: // ldq_Latn_NG
+        case 0x808B43444C61746ELLU: // lea_Latn_CD
+        case 0x848B5A4D4C61746ELLU: // leb_Latn_ZM
+        case 0x888B424F4C61746ELLU: // lec_Latn_BO
+        case 0x8C8B43444C61746ELLU: // led_Latn_CD
+        case 0x908B42464C61746ELLU: // lee_Latn_BF
+        case 0x948B47484C61746ELLU: // lef_Latn_GH
+        case 0x9C8B5A4D4C61746ELLU: // leh_Latn_ZM
+        case 0xA08B50474C61746ELLU: // lei_Latn_PG
+        case 0xA48B43444C61746ELLU: // lej_Latn_CD
+        case 0xA88B50474C61746ELLU: // lek_Latn_PG
+        case 0xAC8B43444C61746ELLU: // lel_Latn_CD
+        case 0xB08B434D4C61746ELLU: // lem_Latn_CM
+        case 0xB48B484E4C61746ELLU: // len_Latn_HN
+        case 0xB88B434D4C61746ELLU: // leo_Latn_CM
+        case 0xBC8B494E4C657063LLU: // lep_Lepc_IN
+        case 0xC08B50474C61746ELLU: // leq_Latn_PG
+        case 0xC48B50474C61746ELLU: // ler_Latn_PG
+        case 0xC88B43444C61746ELLU: // les_Latn_CD
+        case 0xCC8B50474C61746ELLU: // let_Latn_PG
+        case 0xD08B50474C61746ELLU: // leu_Latn_PG
+        case 0xD48B49444C61746ELLU: // lev_Latn_ID
+        case 0xD88B49444C61746ELLU: // lew_Latn_ID
+        case 0xDC8B49444C61746ELLU: // lex_Latn_ID
+        case 0xE08B49444C61746ELLU: // ley_Latn_ID
+        case 0xE48B52554379726CLLU: // lez_Cyrl_RU
+        case 0x80AB434D4C61746ELLU: // lfa_Latn_CM
+        case 0x6C6755474C61746ELLU: // lg_Latn_UG
+        case 0x80CB53424C61746ELLU: // lga_Latn_SB
+        case 0x84CB53424C61746ELLU: // lgb_Latn_SB
+        case 0x98CB55474C61746ELLU: // lgg_Latn_UG
+        case 0x9CCB564E4C61746ELLU: // lgh_Latn_VN
+        case 0xA0CB49444C61746ELLU: // lgi_Latn_ID
+        case 0xA8CB56554C61746ELLU: // lgk_Latn_VU
+        case 0xACCB53424C61746ELLU: // lgl_Latn_SB
+        case 0xB0CB43444C61746ELLU: // lgm_Latn_CD
+        case 0xB4CB45544C61746ELLU: // lgn_Latn_ET
+        case 0xB8CB53534C61746ELLU: // lgo_Latn_SS
+        case 0xC0CB47484C61746ELLU: // lgq_Latn_GH
+        case 0xC4CB53424C61746ELLU: // lgr_Latn_SB
+        case 0xCCCB50474C61746ELLU: // lgt_Latn_PG
+        case 0xD0CB53424C61746ELLU: // lgu_Latn_SB
+        case 0xE4CB43444C61746ELLU: // lgz_Latn_CD
+        case 0x80EB564E4C61746ELLU: // lha_Latn_VN
+        case 0x9CEB49444C61746ELLU: // lhh_Latn_ID
+        case 0xA0EB434E4C61746ELLU: // lhi_Latn_CN
+        case 0xB0EB4E5044657661LLU: // lhm_Deva_NP
+        case 0xB4EB4D594C61746ELLU: // lhn_Latn_MY
+        case 0xC8EB535953797263LLU: // lhs_Syrc_SY
+        case 0xCCEB56554C61746ELLU: // lht_Latn_VU
+        case 0xD0EB434E4C61746ELLU: // lhu_Latn_CN
+        case 0x6C694E4C4C61746ELLU: // li_Latn_NL
+        case 0x810B534C4C61746ELLU: // lia_Latn_SL
+        case 0x850B50474C61746ELLU: // lib_Latn_PG
+        case 0x890B434E4C61746ELLU: // lic_Latn_CN
+        case 0x8D0B50474C61746ELLU: // lid_Latn_PG
+        case 0x910B43444C61746ELLU: // lie_Latn_CD
+        case 0x950B4E5044657661LLU: // lif_Deva_NP
+        case 0x950B494E4C696D62LLU: // lif_Limb_IN
+        case 0x990B47484C61746ELLU: // lig_Latn_GH
+        case 0x9D0B50474C61746ELLU: // lih_Latn_PG
+        case 0xA50B49544C61746ELLU: // lij_Latn_IT
+        case 0xA90B43444C61746ELLU: // lik_Latn_CD
+        case 0xAD0B43414C61746ELLU: // lil_Latn_CA
+        case 0xB90B49444C61746ELLU: // lio_Latn_ID
+        case 0xBD0B47484C61746ELLU: // lip_Latn_GH
+        case 0xC10B45544C61746ELLU: // liq_Latn_ET
+        case 0xC50B4C524C61746ELLU: // lir_Latn_LR
+        case 0xC90B434E4C697375LLU: // lis_Lisu_CN
+        case 0xD10B53444C61746ELLU: // liu_Latn_SD
+        case 0xD50B4C564C61746ELLU: // liv_Latn_LV
+        case 0xD90B49444C61746ELLU: // liw_Latn_ID
+        case 0xDD0B49444C61746ELLU: // lix_Latn_ID
+        case 0xE10B43464C61746ELLU: // liy_Latn_CF
+        case 0xE50B43444C61746ELLU: // liz_Latn_CD
+        case 0x812B41554C61746ELLU: // lja_Latn_AU
+        case 0x912B49444C61746ELLU: // lje_Latn_ID
+        case 0xA12B49444C61746ELLU: // lji_Latn_ID
+        case 0xAD2B49444C61746ELLU: // ljl_Latn_ID
+        case 0xBD2B49444C61746ELLU: // ljp_Latn_ID
+        case 0xD92B41554C61746ELLU: // ljw_Latn_AU
+        case 0xDD2B41554C61746ELLU: // ljx_Latn_AU
+        case 0x814B544C4C61746ELLU: // lka_Latn_TL
+        case 0x854B4B454C61746ELLU: // lkb_Latn_KE
+        case 0x894B564E4C61746ELLU: // lkc_Latn_VN
+        case 0x8D4B42524C61746ELLU: // lkd_Latn_BR
+        case 0x914B55474C61746ELLU: // lke_Latn_UG
+        case 0x9D4B425454696274LLU: // lkh_Tibt_BT
+        case 0xA14B495241726162LLU: // lki_Arab_IR
+        case 0xA54B4D594C61746ELLU: // lkj_Latn_MY
+        case 0xAD4B50474C61746ELLU: // lkl_Latn_PG
+        case 0xB14B41554C61746ELLU: // lkm_Latn_AU
+        case 0xB54B56554C61746ELLU: // lkn_Latn_VU
+        case 0xB94B4B454C61746ELLU: // lko_Latn_KE
+        case 0xC54B53534C61746ELLU: // lkr_Latn_SS
+        case 0xC94B4B454C61746ELLU: // lks_Latn_KE
+        case 0xCD4B55534C61746ELLU: // lkt_Latn_US
+        case 0xD14B41554C61746ELLU: // lku_Latn_AU
+        case 0xE14B53534C61746ELLU: // lky_Latn_SS
+        case 0x816B4E474C61746ELLU: // lla_Latn_NG
+        case 0x856B4D5A4C61746ELLU: // llb_Latn_MZ
+        case 0x896B474E4C61746ELLU: // llc_Latn_GN
+        case 0x8D6B49544C61746ELLU: // lld_Latn_IT
+        case 0x916B50474C61746ELLU: // lle_Latn_PG
+        case 0x956B50474C61746ELLU: // llf_Latn_PG
+        case 0x996B49444C61746ELLU: // llg_Latn_ID
+        case 0xA16B43474C61746ELLU: // lli_Latn_CG
+        case 0xA56B41554C61746ELLU: // llj_Latn_AU
+        case 0xA96B4D594C61746ELLU: // llk_Latn_MY
+        case 0xAD6B50474C61746ELLU: // lll_Latn_PG
+        case 0xB16B49444C61746ELLU: // llm_Latn_ID
+        case 0xB56B54444C61746ELLU: // lln_Latn_TD
+        case 0xBD6B56554C61746ELLU: // llp_Latn_VU
+        case 0xC16B49444C61746ELLU: // llq_Latn_ID
+        case 0xD16B53424C61746ELLU: // llu_Latn_SB
+        case 0xDD6B464A4C61746ELLU: // llx_Latn_FJ
+        case 0x818B474E4C61746ELLU: // lma_Latn_GN
+        case 0x858B56554C61746ELLU: // lmb_Latn_VU
+        case 0x898B41554C61746ELLU: // lmc_Latn_AU
+        case 0x8D8B53444C61746ELLU: // lmd_Latn_SD
+        case 0x918B54444C61746ELLU: // lme_Latn_TD
+        case 0x958B49444C61746ELLU: // lmf_Latn_ID
+        case 0x998B50474C61746ELLU: // lmg_Latn_PG
+        case 0x9D8B4E5044657661LLU: // lmh_Deva_NP
+        case 0xA18B43444C61746ELLU: // lmi_Latn_CD
+        case 0xA58B49444C61746ELLU: // lmj_Latn_ID
+        case 0xA98B494E4C61746ELLU: // lmk_Latn_IN
+        case 0xAD8B56554C61746ELLU: // lml_Latn_VU
+        case 0xB58B494E54656C75LLU: // lmn_Telu_IN
+        case 0xB98B49544C61746ELLU: // lmo_Latn_IT
+        case 0xBD8B434D4C61746ELLU: // lmp_Latn_CM
+        case 0xC18B49444C61746ELLU: // lmq_Latn_ID
+        case 0xC58B49444C61746ELLU: // lmr_Latn_ID
+        case 0xD18B56554C61746ELLU: // lmu_Latn_VU
+        case 0xD58B464A4C61746ELLU: // lmv_Latn_FJ
+        case 0xD98B55534C61746ELLU: // lmw_Latn_US
+        case 0xDD8B434D4C61746ELLU: // lmx_Latn_CM
+        case 0xE18B49444C61746ELLU: // lmy_Latn_ID
+        case 0x6C6E43444C61746ELLU: // ln_Latn_CD
+        case 0x81AB43464C61746ELLU: // lna_Latn_CF
+        case 0x85AB4E414C61746ELLU: // lnb_Latn_NA
+        case 0x8DAB49444C61746ELLU: // lnd_Latn_ID
+        case 0x99AB48554C61746ELLU: // lng_Latn_HU
+        case 0x9DAB4D594C61746ELLU: // lnh_Latn_MY
+        case 0xA1AB50474C61746ELLU: // lni_Latn_PG
+        case 0xA5AB41554C61746ELLU: // lnj_Latn_AU
+        case 0xADAB43464C61746ELLU: // lnl_Latn_CF
+        case 0xB1AB50474C61746ELLU: // lnm_Latn_PG
+        case 0xB5AB56554C61746ELLU: // lnn_Latn_VU
+        case 0xC9AB434D4C61746ELLU: // lns_Latn_CM
+        case 0xD1AB4E474C61746ELLU: // lnu_Latn_NG
+        case 0xD9AB41554C61746ELLU: // lnw_Latn_AU
+        case 0xE5AB43444C61746ELLU: // lnz_Latn_CD
+        case 0x6C6F4C414C616F6FLLU: // lo_Laoo_LA
+        case 0x81CB49444C61746ELLU: // loa_Latn_ID
+        case 0x85CB42464C61746ELLU: // lob_Latn_BF
+        case 0x89CB50484C61746ELLU: // loc_Latn_PH
+        case 0x91CB49444C61746ELLU: // loe_Latn_ID
+        case 0x99CB43444C61746ELLU: // log_Latn_CD
+        case 0x9DCB53534C61746ELLU: // loh_Latn_SS
+        case 0xA1CB43494C61746ELLU: // loi_Latn_CI
+        case 0xA5CB50474C61746ELLU: // loj_Latn_PG
+        case 0xA9CB534C4C61746ELLU: // lok_Latn_SL
+        case 0xADCB43444C61746ELLU: // lol_Latn_CD
+        case 0xB1CB4C524C61746ELLU: // lom_Latn_LR
+        case 0xB5CB4D574C61746ELLU: // lon_Latn_MW
+        case 0xB9CB43444C61746ELLU: // loo_Latn_CD
+        case 0xBDCB4E474C61746ELLU: // lop_Latn_NG
+        case 0xC1CB43444C61746ELLU: // loq_Latn_CD
+        case 0xC5CB43494C61746ELLU: // lor_Latn_CI
+        case 0xC9CB50474C61746ELLU: // los_Latn_PG
+        case 0xCDCB53534C61746ELLU: // lot_Latn_SS
+        case 0xD1CB55534C61746ELLU: // lou_Latn_US
+        case 0xD9CB4D594C61746ELLU: // low_Latn_MY
+        case 0xDDCB49444C61746ELLU: // lox_Latn_ID
+        case 0xE1CB4E5044657661LLU: // loy_Deva_NP
+        case 0xE5CB5A4D4C61746ELLU: // loz_Latn_ZM
+        case 0x81EB56554C61746ELLU: // lpa_Latn_VU
+        case 0x91EB49444C61746ELLU: // lpe_Latn_ID
+        case 0xB5EB4D4D4C61746ELLU: // lpn_Latn_MM
+        case 0xB9EB434E506C7264LLU: // lpo_Plrd_CN
+        case 0xDDEB53534C61746ELLU: // lpx_Latn_SS
+        case 0xC60B53534C61746ELLU: // lqr_Latn_SS
+        case 0x822B4D594C61746ELLU: // lra_Latn_MY
+        case 0x8A2B495241726162LLU: // lrc_Arab_IR
+        case 0x9A2B41554C61746ELLU: // lrg_Latn_AU
+        case 0xA22B4B454C61746ELLU: // lri_Latn_KE
+        case 0xAA2B504B41726162LLU: // lrk_Arab_PK
+        case 0xAE2B495241726162LLU: // lrl_Arab_IR
+        case 0xB22B4B454C61746ELLU: // lrm_Latn_KE
+        case 0xB62B49444C61746ELLU: // lrn_Latn_ID
+        case 0xBA2B53444C61746ELLU: // lro_Latn_SD
+        case 0xCE2B49444C61746ELLU: // lrt_Latn_ID
+        case 0xD62B56554C61746ELLU: // lrv_Latn_VU
+        case 0xE62B56554C61746ELLU: // lrz_Latn_VU
+        case 0x824B495241726162LLU: // lsa_Arab_IR
+        case 0x8E4B494C48656272LLU: // lsd_Hebr_IL
+        case 0x924B43444C61746ELLU: // lse_Latn_CD
+        case 0xA24B4D4D4C61746ELLU: // lsi_Latn_MM
+        case 0xB24B55474C61746ELLU: // lsm_Latn_UG
+        case 0xC64B50474C61746ELLU: // lsr_Latn_PG
+        case 0xCA4B504B41726162LLU: // lss_Arab_PK
+        case 0x6C744C544C61746ELLU: // lt_Latn_LT
+        case 0x8A6B434E48616E74LLU: // ltc_Hant_CN
+        case 0x9A6B4C564C61746ELLU: // ltg_Latn_LV
+        case 0x9E6B55474C61746ELLU: // lth_Latn_UG
+        case 0xA26B49444C61746ELLU: // lti_Latn_ID
+        case 0xB66B42524C61746ELLU: // ltn_Latn_BR
+        case 0xBA6B4B454C61746ELLU: // lto_Latn_KE
+        case 0xCA6B4B454C61746ELLU: // lts_Latn_KE
+        case 0xD26B49444C61746ELLU: // ltu_Latn_ID
+        case 0x6C7543444C61746ELLU: // lu_Latn_CD
+        case 0x828B43444C61746ELLU: // lua_Latn_CD
+        case 0x8A8B55474C61746ELLU: // luc_Latn_UG
+        case 0x8E8B52554C61746ELLU: // lud_Latn_RU
+        case 0x928B5A4D4C61746ELLU: // lue_Latn_ZM
+        case 0x968B50474C61746ELLU: // luf_Latn_PG
+        case 0xA28B55534C61746ELLU: // lui_Latn_US
+        case 0xA68B43444C61746ELLU: // luj_Latn_CD
+        case 0xAA8B425454696274LLU: // luk_Tibt_BT
+        case 0xAE8B53534C61746ELLU: // lul_Latn_SS
+        case 0xB28B414F4C61746ELLU: // lum_Latn_AO
+        case 0xB68B5A4D4C61746ELLU: // lun_Latn_ZM
+        case 0xBA8B4B454C61746ELLU: // luo_Latn_KE
+        case 0xBE8B47414C61746ELLU: // lup_Latn_GA
+        case 0xC28B43554C61746ELLU: // luq_Latn_CU
+        case 0xC68B49444C61746ELLU: // lur_Latn_ID
+        case 0xCA8B494E4C61746ELLU: // lus_Latn_IN
+        case 0xCE8B55534C61746ELLU: // lut_Latn_US
+        case 0xD28B4E5044657661LLU: // luu_Deva_NP
+        case 0xD68B4F4D41726162LLU: // luv_Arab_OM
+        case 0xDA8B434D4C61746ELLU: // luw_Latn_CM
+        case 0xE28B4B454C61746ELLU: // luy_Latn_KE
+        case 0xE68B495241726162LLU: // luz_Arab_IR
+        case 0x6C764C564C61746ELLU: // lv_Latn_LV
+        case 0x82AB544C4C61746ELLU: // lva_Latn_TL
+        case 0xA2AB4C414C61746ELLU: // lvi_Latn_LA
+        case 0xAAAB53424C61746ELLU: // lvk_Latn_SB
+        case 0xAEAB43444C61746ELLU: // lvl_Latn_CD
+        case 0xD2AB49444C61746ELLU: // lvu_Latn_ID
+        case 0x82CB43444C61746ELLU: // lwa_Latn_CD
+        case 0x92CB49444C61746ELLU: // lwe_Latn_ID
+        case 0x9ACB4B454C61746ELLU: // lwg_Latn_KE
+        case 0x9ECB564E4C61746ELLU: // lwh_Latn_VN
+        case 0xAECB544854686169LLU: // lwl_Thai_TH
+        case 0xB2CB434E54686169LLU: // lwm_Thai_CN
+        case 0xBACB53534C61746ELLU: // lwo_Latn_SS
+        case 0xCECB49444C61746ELLU: // lwt_Latn_ID
+        case 0xDACB56554C61746ELLU: // lww_Latn_VU
+        case 0xB2EB50474C61746ELLU: // lxm_Latn_PG
+        case 0x830B425454696274LLU: // lya_Tibt_BT
+        case 0xB70B5A4D4C61746ELLU: // lyn_Latn_ZM
+        case 0x9F2B434E48616E73LLU: // lzh_Hans_CN
+        case 0xAF2B56554C61746ELLU: // lzl_Latn_VU
+        case 0xB72B4D4D4C61746ELLU: // lzn_Latn_MM
+        case 0xE72B54524C61746ELLU: // lzz_Latn_TR
+        case 0x800C4D584C61746ELLU: // maa_Latn_MX
+        case 0x840C4D584C61746ELLU: // mab_Latn_MX
+        case 0x8C0C49444C61746ELLU: // mad_Latn_ID
+        case 0x900C4E474C61746ELLU: // mae_Latn_NG
+        case 0x940C434D4C61746ELLU: // maf_Latn_CM
+        case 0x980C494E44657661LLU: // mag_Deva_IN
+        case 0xA00C494E44657661LLU: // mai_Deva_IN
+        case 0xA40C4D584C61746ELLU: // maj_Latn_MX
+        case 0xA80C49444C61746ELLU: // mak_Latn_ID
+        case 0xB00C47544C61746ELLU: // mam_Latn_GT
+        case 0xB40C474D4C61746ELLU: // man_Latn_GM
+        case 0xB40C474E4E6B6F6FLLU: // man_Nkoo_GN
+        case 0xC00C4D584C61746ELLU: // maq_Latn_MX
+        case 0xC80C4B454C61746ELLU: // mas_Latn_KE
+        case 0xCC0C4D584C61746ELLU: // mat_Latn_MX
+        case 0xD00C4D584C61746ELLU: // mau_Latn_MX
+        case 0xD40C42524C61746ELLU: // mav_Latn_BR
+        case 0xD80C47484C61746ELLU: // maw_Latn_GH
+        case 0xDC0C49444C61746ELLU: // max_Latn_ID
+        case 0xE40C4D584C61746ELLU: // maz_Latn_MX
+        case 0x802C50484C61746ELLU: // mba_Latn_PH
+        case 0x842C50484C61746ELLU: // mbb_Latn_PH
+        case 0x882C42524C61746ELLU: // mbc_Latn_BR
+        case 0x8C2C50484C61746ELLU: // mbd_Latn_PH
+        case 0x942C53474C61746ELLU: // mbf_Latn_SG
+        case 0x9C2C50474C61746ELLU: // mbh_Latn_PG
+        case 0xA02C50484C61746ELLU: // mbi_Latn_PH
+        case 0xA42C42524C61746ELLU: // mbj_Latn_BR
+        case 0xA82C50474C61746ELLU: // mbk_Latn_PG
+        case 0xAC2C42524C61746ELLU: // mbl_Latn_BR
+        case 0xB02C43474C61746ELLU: // mbm_Latn_CG
+        case 0xB42C434F4C61746ELLU: // mbn_Latn_CO
+        case 0xB82C434D4C61746ELLU: // mbo_Latn_CM
+        case 0xBC2C434F4C61746ELLU: // mbp_Latn_CO
+        case 0xC02C50474C61746ELLU: // mbq_Latn_PG
+        case 0xC42C434F4C61746ELLU: // mbr_Latn_CO
+        case 0xC82C50484C61746ELLU: // mbs_Latn_PH
+        case 0xCC2C50484C61746ELLU: // mbt_Latn_PH
+        case 0xD02C4E474C61746ELLU: // mbu_Latn_NG
+        case 0xD42C474E4C61746ELLU: // mbv_Latn_GN
+        case 0xD82C50474C61746ELLU: // mbw_Latn_PG
+        case 0xDC2C50474C61746ELLU: // mbx_Latn_PG
+        case 0xE02C504B41726162LLU: // mby_Arab_PK
+        case 0xE42C4D584C61746ELLU: // mbz_Latn_MX
+        case 0x804C50594C61746ELLU: // mca_Latn_PY
+        case 0x844C50454C61746ELLU: // mcb_Latn_PE
+        case 0x884C50474C61746ELLU: // mcc_Latn_PG
+        case 0x8C4C50454C61746ELLU: // mcd_Latn_PE
+        case 0x904C4D584C61746ELLU: // mce_Latn_MX
+        case 0x944C50454C61746ELLU: // mcf_Latn_PE
+        case 0x984C56454C61746ELLU: // mcg_Latn_VE
+        case 0x9C4C56454C61746ELLU: // mch_Latn_VE
+        case 0xA04C50474C61746ELLU: // mci_Latn_PG
+        case 0xA44C4E474C61746ELLU: // mcj_Latn_NG
+        case 0xA84C414F4C61746ELLU: // mck_Latn_AO
+        case 0xAC4C434F4C61746ELLU: // mcl_Latn_CO
+        case 0xB04C4D594C61746ELLU: // mcm_Latn_MY
+        case 0xB44C54444C61746ELLU: // mcn_Latn_TD
+        case 0xB84C4D584C61746ELLU: // mco_Latn_MX
+        case 0xBC4C434D4C61746ELLU: // mcp_Latn_CM
+        case 0xC04C50474C61746ELLU: // mcq_Latn_PG
+        case 0xC44C50474C61746ELLU: // mcr_Latn_PG
+        case 0xC84C434D4C61746ELLU: // mcs_Latn_CM
+        case 0xCC4C434D4C61746ELLU: // mct_Latn_CM
+        case 0xD04C434D4C61746ELLU: // mcu_Latn_CM
+        case 0xD44C50474C61746ELLU: // mcv_Latn_PG
+        case 0xD84C54444C61746ELLU: // mcw_Latn_TD
+        case 0xDC4C43464C61746ELLU: // mcx_Latn_CF
+        case 0xE04C50474C61746ELLU: // mcy_Latn_PG
+        case 0xE44C50474C61746ELLU: // mcz_Latn_PG
+        case 0x806C4E474C61746ELLU: // mda_Latn_NG
+        case 0x846C50474C61746ELLU: // mdb_Latn_PG
+        case 0x886C50474C61746ELLU: // mdc_Latn_PG
+        case 0x8C6C434D4C61746ELLU: // mdd_Latn_CM
+        case 0x906C544441726162LLU: // mde_Arab_TD
+        case 0x946C52554379726CLLU: // mdf_Cyrl_RU
+        case 0x986C54444C61746ELLU: // mdg_Latn_TD
+        case 0x9C6C50484C61746ELLU: // mdh_Latn_PH
+        case 0xA06C43444C61746ELLU: // mdi_Latn_CD
+        case 0xA46C43444C61746ELLU: // mdj_Latn_CD
+        case 0xA86C43444C61746ELLU: // mdk_Latn_CD
+        case 0xB06C43444C61746ELLU: // mdm_Latn_CD
+        case 0xB46C43464C61746ELLU: // mdn_Latn_CF
+        case 0xBC6C43444C61746ELLU: // mdp_Latn_CD
+        case 0xC06C43444C61746ELLU: // mdq_Latn_CD
+        case 0xC46C49444C61746ELLU: // mdr_Latn_ID
+        case 0xC86C50474C61746ELLU: // mds_Latn_PG
+        case 0xCC6C43474C61746ELLU: // mdt_Latn_CG
+        case 0xD06C43474C61746ELLU: // mdu_Latn_CG
+        case 0xD46C4D584C61746ELLU: // mdv_Latn_MX
+        case 0xD86C43474C61746ELLU: // mdw_Latn_CG
+        case 0xDC6C455445746869LLU: // mdx_Ethi_ET
+        case 0xE06C455445746869LLU: // mdy_Ethi_ET
+        case 0xE46C42524C61746ELLU: // mdz_Latn_BR
+        case 0x808C434D4C61746ELLU: // mea_Latn_CM
+        case 0x848C50474C61746ELLU: // meb_Latn_PG
+        case 0x888C41554C61746ELLU: // mec_Latn_AU
+        case 0x8C8C50474C61746ELLU: // med_Latn_PG
+        case 0x908C50474C61746ELLU: // mee_Latn_PG
+        case 0x9C8C4D584C61746ELLU: // meh_Latn_MX
+        case 0xA48C49444C61746ELLU: // mej_Latn_ID
+        case 0xA88C50474C61746ELLU: // mek_Latn_PG
+        case 0xAC8C4D594C61746ELLU: // mel_Latn_MY
+        case 0xB08C41554C61746ELLU: // mem_Latn_AU
+        case 0xB48C534C4C61746ELLU: // men_Latn_SL
+        case 0xB88C4D594C61746ELLU: // meo_Latn_MY
+        case 0xBC8C41554C61746ELLU: // mep_Latn_AU
+        case 0xC08C434D4C61746ELLU: // meq_Latn_CM
+        case 0xC48C4B454C61746ELLU: // mer_Latn_KE
+        case 0xC88C54444C61746ELLU: // mes_Latn_TD
+        case 0xCC8C50474C61746ELLU: // met_Latn_PG
+        case 0xD08C50474C61746ELLU: // meu_Latn_PG
+        case 0xD48C4C524C61746ELLU: // mev_Latn_LR
+        case 0xD88C4E474C61746ELLU: // mew_Latn_NG
+        case 0xE08C534E4C61746ELLU: // mey_Latn_SN
+        case 0xE48C55534C61746ELLU: // mez_Latn_US
+        case 0x80AC544841726162LLU: // mfa_Arab_TH
+        case 0x84AC49444C61746ELLU: // mfb_Latn_ID
+        case 0x88AC43444C61746ELLU: // mfc_Latn_CD
+        case 0x8CAC434D4C61746ELLU: // mfd_Latn_CM
+        case 0x90AC4D554C61746ELLU: // mfe_Latn_MU
+        case 0x94AC434D4C61746ELLU: // mff_Latn_CM
+        case 0x98AC474E4C61746ELLU: // mfg_Latn_GN
+        case 0x9CAC434D4C61746ELLU: // mfh_Latn_CM
+        case 0xA0AC434D41726162LLU: // mfi_Arab_CM
+        case 0xA4AC434D4C61746ELLU: // mfj_Latn_CM
+        case 0xA8AC434D4C61746ELLU: // mfk_Latn_CM
+        case 0xACAC4E474C61746ELLU: // mfl_Latn_NG
+        case 0xB0AC4E474C61746ELLU: // mfm_Latn_NG
+        case 0xB4AC4E474C61746ELLU: // mfn_Latn_NG
+        case 0xB8AC4E474C61746ELLU: // mfo_Latn_NG
+        case 0xBCAC49444C61746ELLU: // mfp_Latn_ID
+        case 0xC0AC54474C61746ELLU: // mfq_Latn_TG
+        case 0xC4AC41554C61746ELLU: // mfr_Latn_AU
+        case 0xCCAC50474C61746ELLU: // mft_Latn_PG
+        case 0xD0AC414F4C61746ELLU: // mfu_Latn_AO
+        case 0xD4AC534E4C61746ELLU: // mfv_Latn_SN
+        case 0xD8AC50474C61746ELLU: // mfw_Latn_PG
+        case 0xDCAC45544C61746ELLU: // mfx_Latn_ET
+        case 0xE0AC4D584C61746ELLU: // mfy_Latn_MX
+        case 0xE4AC53534C61746ELLU: // mfz_Latn_SS
+        case 0x6D674D474C61746ELLU: // mg_Latn_MG
+        case 0x80CC49454C617467LLU: // mga_Latg_IE
+        case 0x84CC54444C61746ELLU: // mgb_Latn_TD
+        case 0x88CC53534C61746ELLU: // mgc_Latn_SS
+        case 0x8CCC53534C61746ELLU: // mgd_Latn_SS
+        case 0x90CC54444C61746ELLU: // mge_Latn_TD
+        case 0x94CC49444C61746ELLU: // mgf_Latn_ID
+        case 0x98CC434D4C61746ELLU: // mgg_Latn_CM
+        case 0x9CCC4D5A4C61746ELLU: // mgh_Latn_MZ
+        case 0xA0CC4E474C61746ELLU: // mgi_Latn_NG
+        case 0xA4CC4E474C61746ELLU: // mgj_Latn_NG
+        case 0xA8CC49444C61746ELLU: // mgk_Latn_ID
+        case 0xACCC50474C61746ELLU: // mgl_Latn_PG
+        case 0xB0CC544C4C61746ELLU: // mgm_Latn_TL
+        case 0xB4CC43464C61746ELLU: // mgn_Latn_CF
+        case 0xB8CC434D4C61746ELLU: // mgo_Latn_CM
+        case 0xBCCC4E5044657661LLU: // mgp_Deva_NP
+        case 0xC0CC545A4C61746ELLU: // mgq_Latn_TZ
+        case 0xC4CC5A4D4C61746ELLU: // mgr_Latn_ZM
+        case 0xC8CC545A4C61746ELLU: // mgs_Latn_TZ
+        case 0xCCCC50474C61746ELLU: // mgt_Latn_PG
+        case 0xD0CC50474C61746ELLU: // mgu_Latn_PG
+        case 0xD4CC545A4C61746ELLU: // mgv_Latn_TZ
+        case 0xD8CC545A4C61746ELLU: // mgw_Latn_TZ
+        case 0xE0CC545A4C61746ELLU: // mgy_Latn_TZ
+        case 0xE4CC545A4C61746ELLU: // mgz_Latn_TZ
+        case 0x6D684D484C61746ELLU: // mh_Latn_MH
+        case 0x84EC47414C61746ELLU: // mhb_Latn_GA
+        case 0x88EC4D584C61746ELLU: // mhc_Latn_MX
+        case 0x8CEC545A4C61746ELLU: // mhd_Latn_TZ
+        case 0x90EC4D594C61746ELLU: // mhe_Latn_MY
+        case 0x94EC50474C61746ELLU: // mhf_Latn_PG
+        case 0x98EC41554C61746ELLU: // mhg_Latn_AU
+        case 0xA0EC55474C61746ELLU: // mhi_Latn_UG
+        case 0xA4EC414641726162LLU: // mhj_Arab_AF
+        case 0xA8EC434D4C61746ELLU: // mhk_Latn_CM
+        case 0xACEC50474C61746ELLU: // mhl_Latn_PG
+        case 0xB0EC4D5A4C61746ELLU: // mhm_Latn_MZ
+        case 0xB4EC49544C61746ELLU: // mhn_Latn_IT
+        case 0xB8EC5A4D4C61746ELLU: // mho_Latn_ZM
+        case 0xBCEC49444C61746ELLU: // mhp_Latn_ID
+        case 0xC0EC55534C61746ELLU: // mhq_Latn_US
+        case 0xC8EC49444C61746ELLU: // mhs_Latn_ID
+        case 0xCCEC56454C61746ELLU: // mht_Latn_VE
+        case 0xD0EC494E4C61746ELLU: // mhu_Latn_IN
+        case 0xD8EC42574C61746ELLU: // mhw_Latn_BW
+        case 0xDCEC4D4D4C61746ELLU: // mhx_Latn_MM
+        case 0xE0EC49444C61746ELLU: // mhy_Latn_ID
+        case 0xE4EC49444C61746ELLU: // mhz_Latn_ID
+        case 0x6D694E5A4C61746ELLU: // mi_Latn_NZ
+        case 0x810C55534C61746ELLU: // mia_Latn_US
+        case 0x850C4D584C61746ELLU: // mib_Latn_MX
+        case 0x890C43414C61746ELLU: // mic_Latn_CA
+        case 0x8D0C49514D616E64LLU: // mid_Mand_IQ
+        case 0x910C4D584C61746ELLU: // mie_Latn_MX
+        case 0x950C434D4C61746ELLU: // mif_Latn_CM
+        case 0x990C4D584C61746ELLU: // mig_Latn_MX
+        case 0x9D0C4D584C61746ELLU: // mih_Latn_MX
+        case 0xA10C4D584C61746ELLU: // mii_Latn_MX
+        case 0xA50C434D4C61746ELLU: // mij_Latn_CM
+        case 0xA90C55534C61746ELLU: // mik_Latn_US
+        case 0xAD0C4D584C61746ELLU: // mil_Latn_MX
+        case 0xB10C4D584C61746ELLU: // mim_Latn_MX
+        case 0xB50C49444C61746ELLU: // min_Latn_ID
+        case 0xB90C4D584C61746ELLU: // mio_Latn_MX
+        case 0xBD0C4D584C61746ELLU: // mip_Latn_MX
+        case 0xC10C4E494C61746ELLU: // miq_Latn_NI
+        case 0xC50C4D584C61746ELLU: // mir_Latn_MX
+        case 0xCD0C4D584C61746ELLU: // mit_Latn_MX
+        case 0xD10C4D584C61746ELLU: // miu_Latn_MX
+        case 0xD90C50474C61746ELLU: // miw_Latn_PG
+        case 0xDD0C4D584C61746ELLU: // mix_Latn_MX
+        case 0xE10C4D584C61746ELLU: // miy_Latn_MX
+        case 0xE50C4D584C61746ELLU: // miz_Latn_MX
+        case 0x852C544C4C61746ELLU: // mjb_Latn_TL
+        case 0x892C4D584C61746ELLU: // mjc_Latn_MX
+        case 0x8D2C55534C61746ELLU: // mjd_Latn_US
+        case 0x912C54444C61746ELLU: // mje_Latn_TD
+        case 0x992C434E4C61746ELLU: // mjg_Latn_CN
+        case 0x9D2C545A4C61746ELLU: // mjh_Latn_TZ
+        case 0xA12C434E4C61746ELLU: // mji_Latn_CN
+        case 0xA52C50474C61746ELLU: // mjj_Latn_PG
+        case 0xA92C50474C61746ELLU: // mjk_Latn_PG
+        case 0xAD2C494E44657661LLU: // mjl_Deva_IN
+        case 0xB12C50474C61746ELLU: // mjm_Latn_PG
+        case 0xB52C50474C61746ELLU: // mjn_Latn_PG
+        case 0xC12C494E4D6C796DLLU: // mjq_Mlym_IN
+        case 0xC52C494E4D6C796DLLU: // mjr_Mlym_IN
+        case 0xC92C4E474C61746ELLU: // mjs_Latn_NG
+        case 0xCD2C494E44657661LLU: // mjt_Deva_IN
+        case 0xD12C494E54656C75LLU: // mju_Telu_IN
+        case 0xD52C494E4D6C796DLLU: // mjv_Mlym_IN
+        case 0xD92C494E4C61746ELLU: // mjw_Latn_IN
+        case 0xDD2C42444C61746ELLU: // mjx_Latn_BD
+        case 0xE12C55534C61746ELLU: // mjy_Latn_US
+        case 0xE52C4E5044657661LLU: // mjz_Deva_NP
+        case 0x6D6B4D4B4379726CLLU: // mk_Cyrl_MK
+        case 0x814C43494C61746ELLU: // mka_Latn_CI
+        case 0x854C494E44657661LLU: // mkb_Deva_IN
+        case 0x894C50474C61746ELLU: // mkc_Latn_PG
+        case 0x914C494E44657661LLU: // mke_Deva_IN
+        case 0x954C4E474C61746ELLU: // mkf_Latn_NG
+        case 0xA14C504B41726162LLU: // mki_Arab_PK
+        case 0xA54C464D4C61746ELLU: // mkj_Latn_FM
+        case 0xA94C434D4C61746ELLU: // mkk_Latn_CM
+        case 0xAD4C424A4C61746ELLU: // mkl_Latn_BJ
+        case 0xB14C544854686169LLU: // mkm_Thai_TH
+        case 0xB54C49444C61746ELLU: // mkn_Latn_ID
+        case 0xB94C4E474C61746ELLU: // mko_Latn_NG
+        case 0xBD4C50474C61746ELLU: // mkp_Latn_PG
+        case 0xC54C50474C61746ELLU: // mkr_Latn_PG
+        case 0xC94C4D584C61746ELLU: // mks_Latn_MX
+        case 0xCD4C4E434C61746ELLU: // mkt_Latn_NC
+        case 0xD14C474E4C61746ELLU: // mku_Latn_GN
+        case 0xD54C56554C61746ELLU: // mkv_Latn_VU
+        case 0xD94C43474C61746ELLU: // mkw_Latn_CG
+        case 0xDD4C50484C61746ELLU: // mkx_Latn_PH
+        case 0xE14C49444C61746ELLU: // mky_Latn_ID
+        case 0xE54C544C4C61746ELLU: // mkz_Latn_TL
+        case 0x6D6C494E4D6C796DLLU: // ml_Mlym_IN
+        case 0x816C56554C61746ELLU: // mla_Latn_VU
+        case 0x856C434D4C61746ELLU: // mlb_Latn_CM
+        case 0x896C564E4C61746ELLU: // mlc_Latn_VN
+        case 0x916C50474C61746ELLU: // mle_Latn_PG
+        case 0x956C4C4154686169LLU: // mlf_Thai_LA
+        case 0x9D6C50474C61746ELLU: // mlh_Latn_PG
+        case 0xA16C49444C61746ELLU: // mli_Latn_ID
+        case 0xA56C54444C61746ELLU: // mlj_Latn_TD
+        case 0xA96C4B454C61746ELLU: // mlk_Latn_KE
+        case 0xAD6C56554C61746ELLU: // mll_Latn_VU
+        case 0xB56C53424C61746ELLU: // mln_Latn_SB
+        case 0xB96C534E4C61746ELLU: // mlo_Latn_SN
+        case 0xBD6C50474C61746ELLU: // mlp_Latn_PG
+        case 0xC16C534E4C61746ELLU: // mlq_Latn_SN
+        case 0xC56C434D4C61746ELLU: // mlr_Latn_CM
+        case 0xC96C53444C61746ELLU: // mls_Latn_SD
+        case 0xD16C53424C61746ELLU: // mlu_Latn_SB
+        case 0xD56C56554C61746ELLU: // mlv_Latn_VU
+        case 0xD96C434D4C61746ELLU: // mlw_Latn_CM
+        case 0xDD6C56554C61746ELLU: // mlx_Latn_VU
+        case 0xE56C50484C61746ELLU: // mlz_Latn_PH
+        case 0x818C4E474C61746ELLU: // mma_Latn_NG
+        case 0x858C49444C61746ELLU: // mmb_Latn_ID
+        case 0x898C4D584C61746ELLU: // mmc_Latn_MX
+        case 0x8D8C434E4C61746ELLU: // mmd_Latn_CN
+        case 0x918C56554C61746ELLU: // mme_Latn_VU
+        case 0x958C4E474C61746ELLU: // mmf_Latn_NG
+        case 0x998C56554C61746ELLU: // mmg_Latn_VU
+        case 0x9D8C42524C61746ELLU: // mmh_Latn_BR
+        case 0xA18C50474C61746ELLU: // mmi_Latn_PG
+        case 0xB18C56554C61746ELLU: // mmm_Latn_VU
+        case 0xB58C50484C61746ELLU: // mmn_Latn_PH
+        case 0xB98C50474C61746ELLU: // mmo_Latn_PG
+        case 0xBD8C50474C61746ELLU: // mmp_Latn_PG
+        case 0xC18C50474C61746ELLU: // mmq_Latn_PG
+        case 0xC58C434E4C61746ELLU: // mmr_Latn_CN
+        case 0xCD8C50474C61746ELLU: // mmt_Latn_PG
+        case 0xD18C434D4C61746ELLU: // mmu_Latn_CM
+        case 0xD58C42524C61746ELLU: // mmv_Latn_BR
+        case 0xD98C56554C61746ELLU: // mmw_Latn_VU
+        case 0xDD8C50474C61746ELLU: // mmx_Latn_PG
+        case 0xE18C54444C61746ELLU: // mmy_Latn_TD
+        case 0xE58C43444C61746ELLU: // mmz_Latn_CD
+        case 0x6D6E4D4E4379726CLLU: // mn_Cyrl_MN
+        case 0x6D6E434E4D6F6E67LLU: // mn_Mong_CN
+        case 0x81AC50474C61746ELLU: // mna_Latn_PG
+        case 0x85AC49444C61746ELLU: // mnb_Latn_ID
+        case 0x89AC434E4D6F6E67LLU: // mnc_Mong_CN
+        case 0x8DAC42524C61746ELLU: // mnd_Latn_BR
+        case 0x91AC54444C61746ELLU: // mne_Latn_TD
+        case 0x95AC434D4C61746ELLU: // mnf_Latn_CM
+        case 0x99AC564E4C61746ELLU: // mng_Latn_VN
+        case 0x9DAC43444C61746ELLU: // mnh_Latn_CD
+        case 0xA1AC494E42656E67LLU: // mni_Beng_IN
+        case 0xA5AC414641726162LLU: // mnj_Arab_AF
+        case 0xADAC56554C61746ELLU: // mnl_Latn_VU
+        case 0xB1AC50474C61746ELLU: // mnm_Latn_PG
+        case 0xB5AC564E4C61746ELLU: // mnn_Latn_VN
+        case 0xBDAC434E4C61746ELLU: // mnp_Latn_CN
+        case 0xC1AC4D594C61746ELLU: // mnq_Latn_MY
+        case 0xC5AC55534C61746ELLU: // mnr_Latn_US
+        case 0xC9AC52554379726CLLU: // mns_Cyrl_RU
+        case 0xD1AC49444C61746ELLU: // mnu_Latn_ID
+        case 0xD5AC53424C61746ELLU: // mnv_Latn_SB
+        case 0xD9AC4D4D4D796D72LLU: // mnw_Mymr_MM
+        case 0xDDAC49444C61746ELLU: // mnx_Latn_ID
+        case 0xE1AC4D5A4C61746ELLU: // mny_Latn_MZ
+        case 0xE5AC49444C61746ELLU: // mnz_Latn_ID
+        case 0x6D6F524F4C61746ELLU: // mo_Latn_RO
+        case 0x81CC43494C61746ELLU: // moa_Latn_CI
+        case 0x89CC41524C61746ELLU: // moc_Latn_AR
+        case 0x8DCC55534C61746ELLU: // mod_Latn_US
+        case 0x91CC43414C61746ELLU: // moe_Latn_CA
+        case 0x99CC49444C61746ELLU: // mog_Latn_ID
+        case 0x9DCC43414C61746ELLU: // moh_Latn_CA
+        case 0xA1CC4E474C61746ELLU: // moi_Latn_NG
+        case 0xA5CC43474C61746ELLU: // moj_Latn_CG
+        case 0xA9CC49444C61746ELLU: // mok_Latn_ID
+        case 0xB1CC4E494C61746ELLU: // mom_Latn_NI
+        case 0xB9CC564E4C61746ELLU: // moo_Latn_VN
+        case 0xBDCC425A4C61746ELLU: // mop_Latn_BZ
+        case 0xC1CC49444C61746ELLU: // moq_Latn_ID
+        case 0xC5CC53444C61746ELLU: // mor_Latn_SD
+        case 0xC9CC42464C61746ELLU: // mos_Latn_BF
+        case 0xCDCC434F4C61746ELLU: // mot_Latn_CO
+        case 0xD1CC54444C61746ELLU: // mou_Latn_TD
+        case 0xD5CC55534C61746ELLU: // mov_Latn_US
+        case 0xD9CC43474C61746ELLU: // mow_Latn_CG
+        case 0xDDCC50474C61746ELLU: // mox_Latn_PG
+        case 0xE1CC45544C61746ELLU: // moy_Latn_ET
+        case 0xE5CC54444C61746ELLU: // moz_Latn_TD
+        case 0x81EC545A4C61746ELLU: // mpa_Latn_TZ
+        case 0x85EC41554C61746ELLU: // mpb_Latn_AU
+        case 0x89EC41554C61746ELLU: // mpc_Latn_AU
+        case 0x8DEC42524C61746ELLU: // mpd_Latn_BR
+        case 0x91EC45544C61746ELLU: // mpe_Latn_ET
+        case 0x99EC54444C61746ELLU: // mpg_Latn_TD
+        case 0x9DEC41554C61746ELLU: // mph_Latn_AU
+        case 0xA1EC434D4C61746ELLU: // mpi_Latn_CM
+        case 0xA5EC41554C61746ELLU: // mpj_Latn_AU
+        case 0xA9EC54444C61746ELLU: // mpk_Latn_TD
+        case 0xADEC50474C61746ELLU: // mpl_Latn_PG
+        case 0xB1EC4D584C61746ELLU: // mpm_Latn_MX
+        case 0xB5EC50474C61746ELLU: // mpn_Latn_PG
+        case 0xB9EC50474C61746ELLU: // mpo_Latn_PG
+        case 0xBDEC50474C61746ELLU: // mpp_Latn_PG
+        case 0xC1EC42524C61746ELLU: // mpq_Latn_BR
+        case 0xC5EC53424C61746ELLU: // mpr_Latn_SB
+        case 0xC9EC50474C61746ELLU: // mps_Latn_PG
+        case 0xCDEC50474C61746ELLU: // mpt_Latn_PG
+        case 0xD1EC42524C61746ELLU: // mpu_Latn_BR
+        case 0xD5EC50474C61746ELLU: // mpv_Latn_PG
+        case 0xD9EC42524C61746ELLU: // mpw_Latn_BR
+        case 0xDDEC50474C61746ELLU: // mpx_Latn_PG
+        case 0xE1EC49444C61746ELLU: // mpy_Latn_ID
+        case 0xE5EC544854686169LLU: // mpz_Thai_TH
+        case 0x820C49444C61746ELLU: // mqa_Latn_ID
+        case 0x860C434D4C61746ELLU: // mqb_Latn_CM
+        case 0x8A0C49444C61746ELLU: // mqc_Latn_ID
+        case 0x920C50474C61746ELLU: // mqe_Latn_PG
+        case 0x960C49444C61746ELLU: // mqf_Latn_ID
+        case 0x9A0C49444C61746ELLU: // mqg_Latn_ID
+        case 0x9E0C4D584C61746ELLU: // mqh_Latn_MX
+        case 0xA20C49444C61746ELLU: // mqi_Latn_ID
+        case 0xA60C49444C61746ELLU: // mqj_Latn_ID
+        case 0xAA0C50484C61746ELLU: // mqk_Latn_PH
+        case 0xAE0C424A4C61746ELLU: // mql_Latn_BJ
+        case 0xB20C50464C61746ELLU: // mqm_Latn_PF
+        case 0xB60C49444C61746ELLU: // mqn_Latn_ID
+        case 0xBA0C49444C61746ELLU: // mqo_Latn_ID
+        case 0xBE0C49444C61746ELLU: // mqp_Latn_ID
+        case 0xC20C4D594C61746ELLU: // mqq_Latn_MY
+        case 0xC60C49444C61746ELLU: // mqr_Latn_ID
+        case 0xCA0C49444C61746ELLU: // mqs_Latn_ID
+        case 0xD20C53534C61746ELLU: // mqu_Latn_SS
+        case 0xD60C50474C61746ELLU: // mqv_Latn_PG
+        case 0xDA0C50474C61746ELLU: // mqw_Latn_PG
+        case 0xDE0C49444C61746ELLU: // mqx_Latn_ID
+        case 0xE20C49444C61746ELLU: // mqy_Latn_ID
+        case 0xE60C50474C61746ELLU: // mqz_Latn_PG
+        case 0x6D72494E44657661LLU: // mr_Deva_IN
+        case 0x822C544854686169LLU: // mra_Thai_TH
+        case 0x862C56554C61746ELLU: // mrb_Latn_VU
+        case 0x8A2C55534C61746ELLU: // mrc_Latn_US
+        case 0x8E2C4E5044657661LLU: // mrd_Deva_NP
+        case 0x962C49444C61746ELLU: // mrf_Latn_ID
+        case 0x9A2C494E4C61746ELLU: // mrg_Latn_IN
+        case 0x9E2C494E4C61746ELLU: // mrh_Latn_IN
+        case 0xA62C52554379726CLLU: // mrj_Cyrl_RU
+        case 0xAA2C4E434C61746ELLU: // mrk_Latn_NC
+        case 0xAE2C464D4C61746ELLU: // mrl_Latn_FM
+        case 0xB22C56554C61746ELLU: // mrm_Latn_VU
+        case 0xB62C53424C61746ELLU: // mrn_Latn_SB
+        case 0xBA2C42444D726F6FLLU: // mro_Mroo_BD
+        case 0xBE2C56554C61746ELLU: // mrp_Latn_VU
+        case 0xC22C50464C61746ELLU: // mrq_Latn_PF
+        case 0xC62C494E44657661LLU: // mrr_Deva_IN
+        case 0xCA2C56554C61746ELLU: // mrs_Latn_VU
+        case 0xCE2C4E474C61746ELLU: // mrt_Latn_NG
+        case 0xD22C434D4C61746ELLU: // mru_Latn_CM
+        case 0xD62C50464C61746ELLU: // mrv_Latn_PF
+        case 0xDA2C50484C61746ELLU: // mrw_Latn_PH
+        case 0xDE2C49444C61746ELLU: // mrx_Latn_ID
+        case 0xE22C50484C61746ELLU: // mry_Latn_PH
+        case 0xE62C49444C61746ELLU: // mrz_Latn_ID
+        case 0x6D734D594C61746ELLU: // ms_Latn_MY
+        case 0x864C50484C61746ELLU: // msb_Latn_PH
+        case 0x8A4C474E4C61746ELLU: // msc_Latn_GN
+        case 0x924C54444C61746ELLU: // mse_Latn_TD
+        case 0x964C49444C61746ELLU: // msf_Latn_ID
+        case 0x9A4C49444C61746ELLU: // msg_Latn_ID
+        case 0x9E4C4D474C61746ELLU: // msh_Latn_MG
+        case 0xA24C4D594C61746ELLU: // msi_Latn_MY
+        case 0xA64C43444C61746ELLU: // msj_Latn_CD
+        case 0xAA4C50484C61746ELLU: // msk_Latn_PH
+        case 0xAE4C49444C61746ELLU: // msl_Latn_ID
+        case 0xB24C50484C61746ELLU: // msm_Latn_PH
+        case 0xB64C56554C61746ELLU: // msn_Latn_VU
+        case 0xBA4C49444C61746ELLU: // mso_Latn_ID
+        case 0xBE4C42524C61746ELLU: // msp_Latn_BR
+        case 0xC24C4E434C61746ELLU: // msq_Latn_NC
+        case 0xCA4C49444C61746ELLU: // mss_Latn_ID
+        case 0xD24C50474C61746ELLU: // msu_Latn_PG
+        case 0xD64C434D4C61746ELLU: // msv_Latn_CM
+        case 0xDA4C47574C61746ELLU: // msw_Latn_GW
+        case 0xDE4C50474C61746ELLU: // msx_Latn_PG
+        case 0xE24C50474C61746ELLU: // msy_Latn_PG
+        case 0xE64C50474C61746ELLU: // msz_Latn_PG
+        case 0x6D744D544C61746ELLU: // mt_Latn_MT
+        case 0x826C50484C61746ELLU: // mta_Latn_PH
+        case 0x866C43494C61746ELLU: // mtb_Latn_CI
+        case 0x8A6C50474C61746ELLU: // mtc_Latn_PG
+        case 0x8E6C49444C61746ELLU: // mtd_Latn_ID
+        case 0x926C53424C61746ELLU: // mte_Latn_SB
+        case 0x966C50474C61746ELLU: // mtf_Latn_PG
+        case 0x9A6C49444C61746ELLU: // mtg_Latn_ID
+        case 0x9E6C49444C61746ELLU: // mth_Latn_ID
+        case 0xA26C50474C61746ELLU: // mti_Latn_PG
+        case 0xA66C49444C61746ELLU: // mtj_Latn_ID
+        case 0xAA6C434D4C61746ELLU: // mtk_Latn_CM
+        case 0xAE6C4E474C61746ELLU: // mtl_Latn_NG
+        case 0xB26C52554379726CLLU: // mtm_Cyrl_RU
+        case 0xB66C4E494C61746ELLU: // mtn_Latn_NI
+        case 0xBA6C4D584C61746ELLU: // mto_Latn_MX
+        case 0xBE6C424F4C61746ELLU: // mtp_Latn_BO
+        case 0xC26C564E4C61746ELLU: // mtq_Latn_VN
+        case 0xC66C494E44657661LLU: // mtr_Deva_IN
+        case 0xCA6C50454C61746ELLU: // mts_Latn_PE
+        case 0xCE6C56554C61746ELLU: // mtt_Latn_VU
+        case 0xD26C4D584C61746ELLU: // mtu_Latn_MX
+        case 0xD66C50474C61746ELLU: // mtv_Latn_PG
+        case 0xDA6C50484C61746ELLU: // mtw_Latn_PH
+        case 0xDE6C4D584C61746ELLU: // mtx_Latn_MX
+        case 0xE26C50474C61746ELLU: // mty_Latn_PG
+        case 0x828C434D4C61746ELLU: // mua_Latn_CM
+        case 0x868C54444C61746ELLU: // mub_Latn_TD
+        case 0x8A8C434D4C61746ELLU: // muc_Latn_CM
+        case 0x8E8C52554379726CLLU: // mud_Cyrl_RU
+        case 0x928C45434C61746ELLU: // mue_Latn_EC
+        case 0x9A8C434D4C61746ELLU: // mug_Latn_CM
+        case 0x9E8C53534C61746ELLU: // muh_Latn_SS
+        case 0xA28C49444C61746ELLU: // mui_Latn_ID
+        case 0xA68C54444C61746ELLU: // muj_Latn_TD
+        case 0xAA8C4E5054696274LLU: // muk_Tibt_NP
+        case 0xB28C50474C61746ELLU: // mum_Latn_PG
+        case 0xBA8C434D4C61746ELLU: // muo_Latn_CM
+        case 0xC28C434E4C61746ELLU: // muq_Latn_CN
+        case 0xC68C53534C61746ELLU: // mur_Latn_SS
+        case 0xCA8C55534C61746ELLU: // mus_Latn_US
+        case 0xCE8C494E44657661LLU: // mut_Deva_IN
+        case 0xD28C4B454C61746ELLU: // muu_Latn_KE
+        case 0xD68C494E54616D6CLLU: // muv_Taml_IN
+        case 0xDE8C50474C61746ELLU: // mux_Latn_PG
+        case 0xE28C434D4C61746ELLU: // muy_Latn_CM
+        case 0xE68C455445746869LLU: // muz_Ethi_ET
+        case 0x82AC50474C61746ELLU: // mva_Latn_PG
+        case 0x8EAC49444C61746ELLU: // mvd_Latn_ID
+        case 0x92AC504B41726162LLU: // mve_Arab_PK
+        case 0x96AC434E4D6F6E67LLU: // mvf_Mong_CN
+        case 0x9AAC4D584C61746ELLU: // mvg_Latn_MX
+        case 0x9EAC54444C61746ELLU: // mvh_Latn_TD
+        case 0xAAAC50474C61746ELLU: // mvk_Latn_PG
+        case 0xAEAC41554C61746ELLU: // mvl_Latn_AU
+        case 0xB6AC50474C61746ELLU: // mvn_Latn_PG
+        case 0xBAAC53424C61746ELLU: // mvo_Latn_SB
+        case 0xBEAC49444C61746ELLU: // mvp_Latn_ID
+        case 0xC2AC50474C61746ELLU: // mvq_Latn_PG
+        case 0xC6AC49444C61746ELLU: // mvr_Latn_ID
+        case 0xCAAC49444C61746ELLU: // mvs_Latn_ID
+        case 0xCEAC56554C61746ELLU: // mvt_Latn_VU
+        case 0xD2AC54444C61746ELLU: // mvu_Latn_TD
+        case 0xD6AC4D594C61746ELLU: // mvv_Latn_MY
+        case 0xDAAC545A4C61746ELLU: // mvw_Latn_TZ
+        case 0xDEAC49444C61746ELLU: // mvx_Latn_ID
+        case 0xE2AC504B41726162LLU: // mvy_Arab_PK
+        case 0xE6AC455445746869LLU: // mvz_Ethi_ET
+        case 0x82CC50474C61746ELLU: // mwa_Latn_PG
+        case 0x86CC50474C61746ELLU: // mwb_Latn_PG
+        case 0x8ACC50474C61746ELLU: // mwc_Latn_PG
+        case 0x92CC545A4C61746ELLU: // mwe_Latn_TZ
+        case 0x96CC41554C61746ELLU: // mwf_Latn_AU
+        case 0x9ACC50474C61746ELLU: // mwg_Latn_PG
+        case 0x9ECC50474C61746ELLU: // mwh_Latn_PG
+        case 0xA2CC56554C61746ELLU: // mwi_Latn_VU
+        case 0xAACC4D4C4C61746ELLU: // mwk_Latn_ML
+        case 0xAECC50544C61746ELLU: // mwl_Latn_PT
+        case 0xB2CC54444C61746ELLU: // mwm_Latn_TD
+        case 0xB6CC5A4D4C61746ELLU: // mwn_Latn_ZM
+        case 0xBACC56554C61746ELLU: // mwo_Latn_VU
+        case 0xBECC41554C61746ELLU: // mwp_Latn_AU
+        case 0xC2CC4D4D4C61746ELLU: // mwq_Latn_MM
+        case 0xC6CC494E44657661LLU: // mwr_Deva_IN
+        case 0xCACC4B454C61746ELLU: // mws_Latn_KE
+        case 0xCECC4D4D4D796D72LLU: // mwt_Mymr_MM
+        case 0xD2CC53534C61746ELLU: // mwu_Latn_SS
+        case 0xD6CC49444C61746ELLU: // mwv_Latn_ID
+        case 0xDACC5553486D6E70LLU: // mww_Hmnp_US
+        case 0xE6CC43444C61746ELLU: // mwz_Latn_CD
+        case 0x82EC4D584C61746ELLU: // mxa_Latn_MX
+        case 0x86EC4D584C61746ELLU: // mxb_Latn_MX
+        case 0x8AEC5A574C61746ELLU: // mxc_Latn_ZW
+        case 0x8EEC49444C61746ELLU: // mxd_Latn_ID
+        case 0x92EC56554C61746ELLU: // mxe_Latn_VU
+        case 0x96EC434D4C61746ELLU: // mxf_Latn_CM
+        case 0x9AEC414F4C61746ELLU: // mxg_Latn_AO
+        case 0x9EEC43444C61746ELLU: // mxh_Latn_CD
+        case 0xA2EC45534C61746ELLU: // mxi_Latn_ES
+        case 0xA6EC494E4C61746ELLU: // mxj_Latn_IN
+        case 0xAAEC50474C61746ELLU: // mxk_Latn_PG
+        case 0xAEEC424A4C61746ELLU: // mxl_Latn_BJ
+        case 0xB2EC50474C61746ELLU: // mxm_Latn_PG
+        case 0xB6EC49444C61746ELLU: // mxn_Latn_ID
+        case 0xBAEC5A4D4C61746ELLU: // mxo_Latn_ZM
+        case 0xBEEC4D584C61746ELLU: // mxp_Latn_MX
+        case 0xC2EC4D584C61746ELLU: // mxq_Latn_MX
+        case 0xC6EC4D594C61746ELLU: // mxr_Latn_MY
+        case 0xCAEC4D584C61746ELLU: // mxs_Latn_MX
+        case 0xCEEC4D584C61746ELLU: // mxt_Latn_MX
+        case 0xD2EC434D4C61746ELLU: // mxu_Latn_CM
+        case 0xD6EC4D584C61746ELLU: // mxv_Latn_MX
+        case 0xDAEC50474C61746ELLU: // mxw_Latn_PG
+        case 0xDEEC43494C61746ELLU: // mxx_Latn_CI
+        case 0xE2EC4D584C61746ELLU: // mxy_Latn_MX
+        case 0xE6EC49444C61746ELLU: // mxz_Latn_ID
+        case 0x6D794D4D4D796D72LLU: // my_Mymr_MM
+        case 0x870C54444C61746ELLU: // myb_Latn_TD
+        case 0x8B0C43444C61746ELLU: // myc_Latn_CD
+        case 0x930C47414C61746ELLU: // mye_Latn_GA
+        case 0x970C45544C61746ELLU: // myf_Latn_ET
+        case 0x9B0C434D4C61746ELLU: // myg_Latn_CM
+        case 0x9F0C55534C61746ELLU: // myh_Latn_US
+        case 0xA70C53534C61746ELLU: // myj_Latn_SS
+        case 0xAB0C4D4C4C61746ELLU: // myk_Latn_ML
+        case 0xAF0C49444C61746ELLU: // myl_Latn_ID
+        case 0xB30C455445746869LLU: // mym_Ethi_ET
+        case 0xBF0C42524C61746ELLU: // myp_Latn_BR
+        case 0xC70C50454C61746ELLU: // myr_Latn_PE
+        case 0xD30C42524C61746ELLU: // myu_Latn_BR
+        case 0xD70C52554379726CLLU: // myv_Cyrl_RU
+        case 0xDB0C50474C61746ELLU: // myw_Latn_PG
+        case 0xDF0C55474C61746ELLU: // myx_Latn_UG
+        case 0xE30C434F4C61746ELLU: // myy_Latn_CO
+        case 0xE70C49524D616E64LLU: // myz_Mand_IR
+        case 0x832C4D584C61746ELLU: // mza_Latn_MX
+        case 0x8F2C434D4C61746ELLU: // mzd_Latn_CM
+        case 0x932C50474C61746ELLU: // mze_Latn_PG
+        case 0x9F2C41524C61746ELLU: // mzh_Latn_AR
+        case 0xA32C4D584C61746ELLU: // mzi_Latn_MX
+        case 0xA72C4C524C61746ELLU: // mzj_Latn_LR
+        case 0xAB2C4E474C61746ELLU: // mzk_Latn_NG
+        case 0xAF2C4D584C61746ELLU: // mzl_Latn_MX
+        case 0xB32C4E474C61746ELLU: // mzm_Latn_NG
+        case 0xB72C495241726162LLU: // mzn_Arab_IR
+        case 0xBB2C42524C61746ELLU: // mzo_Latn_BR
+        case 0xBF2C424F4C61746ELLU: // mzp_Latn_BO
+        case 0xC32C49444C61746ELLU: // mzq_Latn_ID
+        case 0xC72C42524C61746ELLU: // mzr_Latn_BR
+        case 0xCF2C4D594C61746ELLU: // mzt_Latn_MY
+        case 0xD32C50474C61746ELLU: // mzu_Latn_PG
+        case 0xD72C43464C61746ELLU: // mzv_Latn_CF
+        case 0xDB2C47484C61746ELLU: // mzw_Latn_GH
+        case 0xDF2C47594C61746ELLU: // mzx_Latn_GY
+        case 0xE72C50474C61746ELLU: // mzz_Latn_PG
+        case 0x6E614E524C61746ELLU: // na_Latn_NR
+        case 0x800D49444C61746ELLU: // naa_Latn_ID
+        case 0x840D42524C61746ELLU: // nab_Latn_BR
+        case 0x880D50474C61746ELLU: // nac_Latn_PG
+        case 0x900D49444C61746ELLU: // nae_Latn_ID
+        case 0x940D50474C61746ELLU: // naf_Latn_PG
+        case 0x980D494E4C61746ELLU: // nag_Latn_IN
+        case 0xA40D474E4C61746ELLU: // naj_Latn_GN
+        case 0xA80D50474C61746ELLU: // nak_Latn_PG
+        case 0xAC0D50474C61746ELLU: // nal_Latn_PG
+        case 0xB00D41554C61746ELLU: // nam_Latn_AU
+        case 0xB40D434E48616E73LLU: // nan_Hans_CN
+        case 0xB80D4E5044657661LLU: // nao_Deva_NP
+        case 0xBC0D49544C61746ELLU: // nap_Latn_IT
+        case 0xC00D4E414C61746ELLU: // naq_Latn_NA
+        case 0xC40D4E474C61746ELLU: // nar_Latn_NG
+        case 0xC80D50474C61746ELLU: // nas_Latn_PG
+        case 0xCC0D4E474C61746ELLU: // nat_Latn_NG
+        case 0xD80D47484C61746ELLU: // naw_Latn_GH
+        case 0xDC0D50474C61746ELLU: // nax_Latn_PG
+        case 0xE00D41554C61746ELLU: // nay_Latn_AU
+        case 0xE40D4D584C61746ELLU: // naz_Latn_MX
+        case 0x6E624E4F4C61746ELLU: // nb_Latn_NO
+        case 0x802D414F4C61746ELLU: // nba_Latn_AO
+        case 0x842D4E474C61746ELLU: // nbb_Latn_NG
+        case 0x882D494E4C61746ELLU: // nbc_Latn_IN
+        case 0x8C2D43444C61746ELLU: // nbd_Latn_CD
+        case 0x902D494E4C61746ELLU: // nbe_Latn_IN
+        case 0x9C2D4E474C61746ELLU: // nbh_Latn_NG
+        case 0xA02D494E4C61746ELLU: // nbi_Latn_IN
+        case 0xA42D41554C61746ELLU: // nbj_Latn_AU
+        case 0xA82D50474C61746ELLU: // nbk_Latn_PG
+        case 0xB02D43464C61746ELLU: // nbm_Latn_CF
+        case 0xB42D49444C61746ELLU: // nbn_Latn_ID
+        case 0xB82D4E474C61746ELLU: // nbo_Latn_NG
+        case 0xBC2D4E474C61746ELLU: // nbp_Latn_NG
+        case 0xC02D49444C61746ELLU: // nbq_Latn_ID
+        case 0xC42D4E474C61746ELLU: // nbr_Latn_NG
+        case 0xCC2D494E4C61746ELLU: // nbt_Latn_IN
+        case 0xD02D494E4C61746ELLU: // nbu_Latn_IN
+        case 0xD42D434D4C61746ELLU: // nbv_Latn_CM
+        case 0xD82D43444C61746ELLU: // nbw_Latn_CD
+        case 0xE02D50474C61746ELLU: // nby_Latn_PG
+        case 0x804D50474C61746ELLU: // nca_Latn_PG
+        case 0x844D494E4C61746ELLU: // ncb_Latn_IN
+        case 0x884D50474C61746ELLU: // ncc_Latn_PG
+        case 0x8C4D4E5044657661LLU: // ncd_Deva_NP
+        case 0x904D50474C61746ELLU: // nce_Latn_PG
+        case 0x944D50474C61746ELLU: // ncf_Latn_PG
+        case 0x984D43414C61746ELLU: // ncg_Latn_CA
+        case 0x9C4D4D584C61746ELLU: // nch_Latn_MX
+        case 0xA04D4D584C61746ELLU: // nci_Latn_MX
+        case 0xA44D4D584C61746ELLU: // ncj_Latn_MX
+        case 0xA84D41554C61746ELLU: // nck_Latn_AU
+        case 0xAC4D4D584C61746ELLU: // ncl_Latn_MX
+        case 0xB04D50474C61746ELLU: // ncm_Latn_PG
+        case 0xB44D50474C61746ELLU: // ncn_Latn_PG
+        case 0xB84D50474C61746ELLU: // nco_Latn_PG
+        case 0xC04D4C414C616F6FLLU: // ncq_Laoo_LA
+        case 0xC44D434D4C61746ELLU: // ncr_Latn_CM
+        case 0xCC4D494E4C61746ELLU: // nct_Latn_IN
+        case 0xD04D47484C61746ELLU: // ncu_Latn_GH
+        case 0xDC4D4D584C61746ELLU: // ncx_Latn_MX
+        case 0xE44D55534C61746ELLU: // ncz_Latn_US
+        case 0x6E645A574C61746ELLU: // nd_Latn_ZW
+        case 0x806D43474C61746ELLU: // nda_Latn_CG
+        case 0x846D434D4C61746ELLU: // ndb_Latn_CM
+        case 0x886D4D5A4C61746ELLU: // ndc_Latn_MZ
+        case 0x8C6D4E474C61746ELLU: // ndd_Latn_NG
+        case 0x946D52554379726CLLU: // ndf_Cyrl_RU
+        case 0x986D545A4C61746ELLU: // ndg_Latn_TZ
+        case 0x9C6D545A4C61746ELLU: // ndh_Latn_TZ
+        case 0xA06D4E474C61746ELLU: // ndi_Latn_NG
+        case 0xA46D545A4C61746ELLU: // ndj_Latn_TZ
+        case 0xA86D43444C61746ELLU: // ndk_Latn_CD
+        case 0xAC6D43444C61746ELLU: // ndl_Latn_CD
+        case 0xB06D54444C61746ELLU: // ndm_Latn_TD
+        case 0xB46D43474C61746ELLU: // ndn_Latn_CG
+        case 0xBC6D55474C61746ELLU: // ndp_Latn_UG
+        case 0xC06D414F4C61746ELLU: // ndq_Latn_AO
+        case 0xC46D4E474C61746ELLU: // ndr_Latn_NG
+        case 0xC86D44454C61746ELLU: // nds_Latn_DE
+        case 0xCC6D43444C61746ELLU: // ndt_Latn_CD
+        case 0xD06D434D4C61746ELLU: // ndu_Latn_CM
+        case 0xD46D534E4C61746ELLU: // ndv_Latn_SN
+        case 0xD86D43444C61746ELLU: // ndw_Latn_CD
+        case 0xDC6D49444C61746ELLU: // ndx_Latn_ID
+        case 0xE06D43464C61746ELLU: // ndy_Latn_CF
+        case 0xE46D53534C61746ELLU: // ndz_Latn_SS
+        case 0x6E654E5044657661LLU: // ne_Deva_NP
+        case 0x808D49444C61746ELLU: // nea_Latn_ID
+        case 0x848D43494C61746ELLU: // neb_Latn_CI
+        case 0x888D49444C61746ELLU: // nec_Latn_ID
+        case 0x8C8D4E474C61746ELLU: // ned_Latn_NG
+        case 0x908D4E434C61746ELLU: // nee_Latn_NC
+        case 0x988D52554379726CLLU: // neg_Cyrl_RU
+        case 0x9C8D425454696274LLU: // neh_Tibt_BT
+        case 0xA08D545258737578LLU: // nei_Xsux_TR
+        case 0xA48D50474C61746ELLU: // nej_Latn_PG
+        case 0xA88D4E434C61746ELLU: // nek_Latn_NC
+        case 0xB08D4E434C61746ELLU: // nem_Latn_NC
+        case 0xB48D4E434C61746ELLU: // nen_Latn_NC
+        case 0xB88D564E4C61746ELLU: // neo_Latn_VN
+        case 0xC08D4D584C61746ELLU: // neq_Latn_MX
+        case 0xC48D49444C61746ELLU: // ner_Latn_ID
+        case 0xCC8D50474C61746ELLU: // net_Latn_PG
+        case 0xD88D4E5044657661LLU: // new_Deva_NP
+        case 0xDC8D50474C61746ELLU: // nex_Latn_PG
+        case 0xE08D43494C61746ELLU: // ney_Latn_CI
+        case 0xE48D55534C61746ELLU: // nez_Latn_US
+        case 0x80AD49444C61746ELLU: // nfa_Latn_ID
+        case 0x8CAD4E474C61746ELLU: // nfd_Latn_NG
+        case 0xACAD53424C61746ELLU: // nfl_Latn_SB
+        case 0xC4AD47484C61746ELLU: // nfr_Latn_GH
+        case 0xD0AD434D4C61746ELLU: // nfu_Latn_CM
+        case 0x6E674E414C61746ELLU: // ng_Latn_NA
+        case 0x80CD43444C61746ELLU: // nga_Latn_CD
+        case 0x84CD43444C61746ELLU: // ngb_Latn_CD
+        case 0x88CD43444C61746ELLU: // ngc_Latn_CD
+        case 0x8CCD43464C61746ELLU: // ngd_Latn_CF
+        case 0x90CD434D4C61746ELLU: // nge_Latn_CM
+        case 0x98CD43464C61746ELLU: // ngg_Latn_CF
+        case 0x9CCD5A414C61746ELLU: // ngh_Latn_ZA
+        case 0xA0CD4E474C61746ELLU: // ngi_Latn_NG
+        case 0xA4CD434D4C61746ELLU: // ngj_Latn_CM
+        case 0xA8CD41554C61746ELLU: // ngk_Latn_AU
+        case 0xACCD4D5A4C61746ELLU: // ngl_Latn_MZ
+        case 0xB0CD464D4C61746ELLU: // ngm_Latn_FM
+        case 0xB4CD434D4C61746ELLU: // ngn_Latn_CM
+        case 0xBCCD545A4C61746ELLU: // ngp_Latn_TZ
+        case 0xC0CD545A4C61746ELLU: // ngq_Latn_TZ
+        case 0xC4CD53424C61746ELLU: // ngr_Latn_SB
+        case 0xC8CD4E474C61746ELLU: // ngs_Latn_NG
+        case 0xCCCD4C414C616F6FLLU: // ngt_Laoo_LA
+        case 0xD0CD4D584C61746ELLU: // ngu_Latn_MX
+        case 0xD4CD434D4C61746ELLU: // ngv_Latn_CM
+        case 0xD8CD4E474C61746ELLU: // ngw_Latn_NG
+        case 0xDCCD4E474C61746ELLU: // ngx_Latn_NG
+        case 0xE0CD434D4C61746ELLU: // ngy_Latn_CM
+        case 0xE4CD43474C61746ELLU: // ngz_Latn_CG
+        case 0x80ED41554C61746ELLU: // nha_Latn_AU
+        case 0x84ED43494C61746ELLU: // nhb_Latn_CI
+        case 0x88ED4D584C61746ELLU: // nhc_Latn_MX
+        case 0x8CED50594C61746ELLU: // nhd_Latn_PY
+        case 0x90ED4D584C61746ELLU: // nhe_Latn_MX
+        case 0x94ED41554C61746ELLU: // nhf_Latn_AU
+        case 0x98ED4D584C61746ELLU: // nhg_Latn_MX
+        case 0xA0ED4D584C61746ELLU: // nhi_Latn_MX
+        case 0xA8ED4D584C61746ELLU: // nhk_Latn_MX
+        case 0xB0ED4D584C61746ELLU: // nhm_Latn_MX
+        case 0xB4ED4D584C61746ELLU: // nhn_Latn_MX
+        case 0xB8ED50474C61746ELLU: // nho_Latn_PG
+        case 0xBCED4D584C61746ELLU: // nhp_Latn_MX
+        case 0xC0ED4D584C61746ELLU: // nhq_Latn_MX
+        case 0xC4ED42574C61746ELLU: // nhr_Latn_BW
+        case 0xCCED4D584C61746ELLU: // nht_Latn_MX
+        case 0xD0ED434D4C61746ELLU: // nhu_Latn_CM
+        case 0xD4ED4D584C61746ELLU: // nhv_Latn_MX
+        case 0xD8ED4D584C61746ELLU: // nhw_Latn_MX
+        case 0xDCED4D584C61746ELLU: // nhx_Latn_MX
+        case 0xE0ED4D584C61746ELLU: // nhy_Latn_MX
+        case 0xE4ED4D584C61746ELLU: // nhz_Latn_MX
+        case 0x810D49444C61746ELLU: // nia_Latn_ID
+        case 0x850D50474C61746ELLU: // nib_Latn_PG
+        case 0x8D0D41554C61746ELLU: // nid_Latn_AU
+        case 0x910D54444C61746ELLU: // nie_Latn_TD
+        case 0x950D50474C61746ELLU: // nif_Latn_PG
+        case 0x990D41554C61746ELLU: // nig_Latn_AU
+        case 0x9D0D545A4C61746ELLU: // nih_Latn_TZ
+        case 0xA10D50474C61746ELLU: // nii_Latn_PG
+        case 0xA50D49444C61746ELLU: // nij_Latn_ID
+        case 0xAD0D49444C61746ELLU: // nil_Latn_ID
+        case 0xB10D545A4C61746ELLU: // nim_Latn_TZ
+        case 0xB50D4E474C61746ELLU: // nin_Latn_NG
+        case 0xB90D52554379726CLLU: // nio_Cyrl_RU
+        case 0xC10D4B454C61746ELLU: // niq_Latn_KE
+        case 0xC50D49444C61746ELLU: // nir_Latn_ID
+        case 0xC90D50474C61746ELLU: // nis_Latn_PG
+        case 0xCD0D494E54656C75LLU: // nit_Telu_IN
+        case 0xD10D4E554C61746ELLU: // niu_Latn_NU
+        case 0xD50D52554379726CLLU: // niv_Cyrl_RU
+        case 0xD90D50474C61746ELLU: // niw_Latn_PG
+        case 0xDD0D43444C61746ELLU: // nix_Latn_CD
+        case 0xE10D43444C61746ELLU: // niy_Latn_CD
+        case 0xE50D50474C61746ELLU: // niz_Latn_PG
+        case 0x812D4E474C61746ELLU: // nja_Latn_NG
+        case 0x852D494E4C61746ELLU: // njb_Latn_IN
+        case 0x8D2D545A4C61746ELLU: // njd_Latn_TZ
+        case 0x9D2D494E4C61746ELLU: // njh_Latn_IN
+        case 0xA12D41554C61746ELLU: // nji_Latn_AU
+        case 0xA52D434D4C61746ELLU: // njj_Latn_CM
+        case 0xAD2D53534C61746ELLU: // njl_Latn_SS
+        case 0xB12D494E4C61746ELLU: // njm_Latn_IN
+        case 0xB52D494E4C61746ELLU: // njn_Latn_IN
+        case 0xB92D494E4C61746ELLU: // njo_Latn_IN
+        case 0xC52D4E474C61746ELLU: // njr_Latn_NG
+        case 0xC92D49444C61746ELLU: // njs_Latn_ID
+        case 0xCD2D53524C61746ELLU: // njt_Latn_SR
+        case 0xD12D41554C61746ELLU: // nju_Latn_AU
+        case 0xDD2D43474C61746ELLU: // njx_Latn_CG
+        case 0xE12D434D4C61746ELLU: // njy_Latn_CM
+        case 0xE52D494E4C61746ELLU: // njz_Latn_IN
+        case 0x814D5A4D4C61746ELLU: // nka_Latn_ZM
+        case 0x854D494E4C61746ELLU: // nkb_Latn_IN
+        case 0x894D434D4C61746ELLU: // nkc_Latn_CM
+        case 0x8D4D494E4C61746ELLU: // nkd_Latn_IN
+        case 0x914D53424C61746ELLU: // nke_Latn_SB
+        case 0x954D494E4C61746ELLU: // nkf_Latn_IN
+        case 0x994D50474C61746ELLU: // nkg_Latn_PG
+        case 0x9D4D494E4C61746ELLU: // nkh_Latn_IN
+        case 0xA14D494E4C61746ELLU: // nki_Latn_IN
+        case 0xA54D49444C61746ELLU: // nkj_Latn_ID
+        case 0xA94D56554C61746ELLU: // nkk_Latn_VU
+        case 0xB14D50474C61746ELLU: // nkm_Latn_PG
+        case 0xB54D414F4C61746ELLU: // nkn_Latn_AO
+        case 0xB94D47484C61746ELLU: // nko_Latn_GH
+        case 0xC14D47484C61746ELLU: // nkq_Latn_GH
+        case 0xC54D464D4C61746ELLU: // nkr_Latn_FM
+        case 0xC94D49444C61746ELLU: // nks_Latn_ID
+        case 0xCD4D545A4C61746ELLU: // nkt_Latn_TZ
+        case 0xD14D43494C61746ELLU: // nku_Latn_CI
+        case 0xD54D4D574C61746ELLU: // nkv_Latn_MW
+        case 0xD94D43444C61746ELLU: // nkw_Latn_CD
+        case 0xDD4D4E474C61746ELLU: // nkx_Latn_NG
+        case 0xE54D4E474C61746ELLU: // nkz_Latn_NG
+        case 0x6E6C4E4C4C61746ELLU: // nl_Latn_NL
+        case 0x816D434D4C61746ELLU: // nla_Latn_CM
+        case 0x896D49444C61746ELLU: // nlc_Latn_ID
+        case 0x916D4B454C61746ELLU: // nle_Latn_KE
+        case 0x996D53424C61746ELLU: // nlg_Latn_SB
+        case 0xA16D414641726162LLU: // nli_Arab_AF
+        case 0xA56D43444C61746ELLU: // nlj_Latn_CD
+        case 0xA96D49444C61746ELLU: // nlk_Latn_ID
+        case 0xB16D504B41726162LLU: // nlm_Arab_PK
+        case 0xB96D43444C61746ELLU: // nlo_Latn_CD
+        case 0xC16D4D4D4C61746ELLU: // nlq_Latn_MM
+        case 0xD16D47484C61746ELLU: // nlu_Latn_GH
+        case 0xD56D4D584C61746ELLU: // nlv_Latn_MX
+        case 0xD96D41554C61746ELLU: // nlw_Latn_AU
+        case 0xDD6D494E44657661LLU: // nlx_Deva_IN
+        case 0xE16D41554C61746ELLU: // nly_Latn_AU
+        case 0xE56D53424C61746ELLU: // nlz_Latn_SB
+        case 0x818D494E4C61746ELLU: // nma_Latn_IN
+        case 0x858D56554C61746ELLU: // nmb_Latn_VU
+        case 0x898D54444C61746ELLU: // nmc_Latn_TD
+        case 0x8D8D47414C61746ELLU: // nmd_Latn_GA
+        case 0x918D494E4C61746ELLU: // nme_Latn_IN
+        case 0x958D494E4C61746ELLU: // nmf_Latn_IN
+        case 0x998D434D4C61746ELLU: // nmg_Latn_CM
+        case 0x9D8D494E4C61746ELLU: // nmh_Latn_IN
+        case 0xA18D4E474C61746ELLU: // nmi_Latn_NG
+        case 0xA58D43464C61746ELLU: // nmj_Latn_CF
+        case 0xA98D56554C61746ELLU: // nmk_Latn_VU
+        case 0xAD8D434D4C61746ELLU: // nml_Latn_CM
+        case 0xB18D4E5044657661LLU: // nmm_Deva_NP
+        case 0xB58D42574C61746ELLU: // nmn_Latn_BW
+        case 0xB98D494E4C61746ELLU: // nmo_Latn_IN
+        case 0xBD8D41554C61746ELLU: // nmp_Latn_AU
+        case 0xC18D5A574C61746ELLU: // nmq_Latn_ZW
+        case 0xC58D434D4C61746ELLU: // nmr_Latn_CM
+        case 0xC98D56554C61746ELLU: // nms_Latn_VU
+        case 0xCD8D464D4C61746ELLU: // nmt_Latn_FM
+        case 0xD18D55534C61746ELLU: // nmu_Latn_US
+        case 0xD58D41554C61746ELLU: // nmv_Latn_AU
+        case 0xD98D50474C61746ELLU: // nmw_Latn_PG
+        case 0xDD8D50474C61746ELLU: // nmx_Latn_PG
+        case 0xE58D54474C61746ELLU: // nmz_Latn_TG
+        case 0x6E6E4E4F4C61746ELLU: // nn_Latn_NO
+        case 0x81AD41554C61746ELLU: // nna_Latn_AU
+        case 0x85AD43444C61746ELLU: // nnb_Latn_CD
+        case 0x89AD54444C61746ELLU: // nnc_Latn_TD
+        case 0x8DAD56554C61746ELLU: // nnd_Latn_VU
+        case 0x91AD414F4C61746ELLU: // nne_Latn_AO
+        case 0x95AD50474C61746ELLU: // nnf_Latn_PG
+        case 0x99AD494E4C61746ELLU: // nng_Latn_IN
+        case 0x9DAD434D4C61746ELLU: // nnh_Latn_CM
+        case 0xA1AD49444C61746ELLU: // nni_Latn_ID
+        case 0xA5AD45544C61746ELLU: // nnj_Latn_ET
+        case 0xA9AD50474C61746ELLU: // nnk_Latn_PG
+        case 0xADAD494E4C61746ELLU: // nnl_Latn_IN
+        case 0xB1AD50474C61746ELLU: // nnm_Latn_PG
+        case 0xB5AD54444C61746ELLU: // nnn_Latn_TD
+        case 0xBDAD494E5763686FLLU: // nnp_Wcho_IN
+        case 0xC1AD545A4C61746ELLU: // nnq_Latn_TZ
+        case 0xC5AD41554C61746ELLU: // nnr_Latn_AU
+        case 0xCDAD55534C61746ELLU: // nnt_Latn_US
+        case 0xD1AD47484C61746ELLU: // nnu_Latn_GH
+        case 0xD5AD41554C61746ELLU: // nnv_Latn_AU
+        case 0xD9AD42464C61746ELLU: // nnw_Latn_BF
+        case 0xE1AD41554C61746ELLU: // nny_Latn_AU
+        case 0xE5AD434D4C61746ELLU: // nnz_Latn_CM
+        case 0x6E6F4E4F4C61746ELLU: // no_Latn_NO
+        case 0x81CD434F4C61746ELLU: // noa_Latn_CO
+        case 0x89CD50474C61746ELLU: // noc_Latn_PG
+        case 0x8DCD54484C616E61LLU: // nod_Lana_TH
+        case 0x91CD494E44657661LLU: // noe_Deva_IN
+        case 0x95CD50474C61746ELLU: // nof_Latn_PG
+        case 0x99CD52554379726CLLU: // nog_Cyrl_RU
+        case 0x9DCD50474C61746ELLU: // noh_Latn_PG
+        case 0xA1CD494E44657661LLU: // noi_Deva_IN
+        case 0xA5CD434F4C61746ELLU: // noj_Latn_CO
+        case 0xA9CD55534C61746ELLU: // nok_Latn_US
+        case 0xB5CD534552756E72LLU: // non_Runr_SE
+        case 0xBDCD50474C61746ELLU: // nop_Latn_PG
+        case 0xC1CD43444C61746ELLU: // noq_Latn_CD
+        case 0xC9CD434E59696969LLU: // nos_Yiii_CN
+        case 0xCDCD50454C61746ELLU: // not_Latn_PE
+        case 0xD1CD50474C61746ELLU: // nou_Latn_PG
+        case 0xD9CD545A4C61746ELLU: // now_Latn_TZ
+        case 0xE1CD54444C61746ELLU: // noy_Latn_TD
+        case 0x85ED425454696274LLU: // npb_Tibt_BT
+        case 0x99ED4D4D4C61746ELLU: // npg_Latn_MM
+        case 0x9DED494E4C61746ELLU: // nph_Latn_IN
+        case 0xADED4D584C61746ELLU: // npl_Latn_MX
+        case 0xB5ED50474C61746ELLU: // npn_Latn_PG
+        case 0xB9ED494E4C61746ELLU: // npo_Latn_IN
+        case 0xC9ED49444C61746ELLU: // nps_Latn_ID
+        case 0xD1ED494E4C61746ELLU: // npu_Latn_IN
+        case 0xDDED53424C61746ELLU: // npx_Latn_SB
+        case 0xE1ED49444C61746ELLU: // npy_Latn_ID
+        case 0x9A0D424A4C61746ELLU: // nqg_Latn_BJ
+        case 0xAA0D424A4C61746ELLU: // nqk_Latn_BJ
+        case 0xAE0D414F4C61746ELLU: // nql_Latn_AO
+        case 0xB20D49444C61746ELLU: // nqm_Latn_ID
+        case 0xB60D50474C61746ELLU: // nqn_Latn_PG
+        case 0xBA0D474E4E6B6F6FLLU: // nqo_Nkoo_GN
+        case 0xC20D4D4D4C61746ELLU: // nqq_Latn_MM
+        case 0xCE0D4E474C61746ELLU: // nqt_Latn_NG
+        case 0xE20D4D4D4C61746ELLU: // nqy_Latn_MM
+        case 0x6E725A414C61746ELLU: // nr_Latn_ZA
+        case 0x822D47414C61746ELLU: // nra_Latn_GA
+        case 0x862D45524C61746ELLU: // nrb_Latn_ER
+        case 0x922D494E4C61746ELLU: // nre_Latn_IN
+        case 0x962D4A454C61746ELLU: // nrf_Latn_JE
+        case 0x9A2D56554C61746ELLU: // nrg_Latn_VU
+        case 0xA22D494E4C61746ELLU: // nri_Latn_IN
+        case 0xAA2D41554C61746ELLU: // nrk_Latn_AU
+        case 0xAE2D41554C61746ELLU: // nrl_Latn_AU
+        case 0xB22D4D594C61746ELLU: // nrm_Latn_MY
+        case 0xB62D474252756E72LLU: // nrn_Runr_GB
+        case 0xBE2D49544C61746ELLU: // nrp_Latn_IT
+        case 0xD22D434E4C61746ELLU: // nru_Latn_CN
+        case 0xDE2D41554C61746ELLU: // nrx_Latn_AU
+        case 0xE62D50474C61746ELLU: // nrz_Latn_PG
+        case 0x824D494E4C61746ELLU: // nsa_Latn_IN
+        case 0x864D5A414C61746ELLU: // nsb_Latn_ZA
+        case 0x8A4D4E474C61746ELLU: // nsc_Latn_NG
+        case 0x8E4D434E59696969LLU: // nsd_Yiii_CN
+        case 0x924D5A4D4C61746ELLU: // nse_Latn_ZM
+        case 0x964D434E59696969LLU: // nsf_Yiii_CN
+        case 0x9A4D545A4C61746ELLU: // nsg_Latn_TZ
+        case 0x9E4D434D4C61746ELLU: // nsh_Latn_CM
+        case 0xAA4D434143616E73LLU: // nsk_Cans_CA
+        case 0xB24D494E4C61746ELLU: // nsm_Latn_IN
+        case 0xB64D50474C61746ELLU: // nsn_Latn_PG
+        case 0xBA4D5A414C61746ELLU: // nso_Latn_ZA
+        case 0xC24D55534C61746ELLU: // nsq_Latn_US
+        case 0xCA4D50474C61746ELLU: // nss_Latn_PG
+        case 0xCE4D494E546E7361LLU: // nst_Tnsa_IN
+        case 0xD24D4D584C61746ELLU: // nsu_Latn_MX
+        case 0xD64D434E59696969LLU: // nsv_Yiii_CN
+        case 0xDA4D56554C61746ELLU: // nsw_Latn_VU
+        case 0xDE4D414F4C61746ELLU: // nsx_Latn_AO
+        case 0xE24D49444C61746ELLU: // nsy_Latn_ID
+        case 0xE64D55534C61746ELLU: // nsz_Latn_US
+        case 0x8E6D4D594C61746ELLU: // ntd_Latn_MY
+        case 0x926D4D5A4C61746ELLU: // nte_Latn_MZ
+        case 0x9A6D41554C61746ELLU: // ntg_Latn_AU
+        case 0xA26D42464C61746ELLU: // nti_Latn_BF
+        case 0xA66D41554C61746ELLU: // ntj_Latn_AU
+        case 0xAA6D545A4C61746ELLU: // ntk_Latn_TZ
+        case 0xB26D424A4C61746ELLU: // ntm_Latn_BJ
+        case 0xBA6D43444C61746ELLU: // nto_Latn_CD
+        case 0xBE6D4D584C61746ELLU: // ntp_Latn_MX
+        case 0xC66D47484C61746ELLU: // ntr_Latn_GH
+        case 0xD26D53424C61746ELLU: // ntu_Latn_SB
+        case 0xDE6D4D4D4C61746ELLU: // ntx_Latn_MM
+        case 0xE26D564E59696969LLU: // nty_Yiii_VN
+        case 0xE66D495241726162LLU: // ntz_Arab_IR
+        case 0x828D4E434C61746ELLU: // nua_Latn_NC
+        case 0x8A8D42524C61746ELLU: // nuc_Latn_BR
+        case 0x8E8D50474C61746ELLU: // nud_Latn_PG
+        case 0x928D43444C61746ELLU: // nue_Latn_CD
+        case 0x968D434E4C61746ELLU: // nuf_Latn_CN
+        case 0x9A8D41554C61746ELLU: // nug_Latn_AU
+        case 0x9E8D4E474C61746ELLU: // nuh_Latn_NG
+        case 0xA28D47514C61746ELLU: // nui_Latn_GQ
+        case 0xA68D55474C61746ELLU: // nuj_Latn_UG
+        case 0xAA8D43414C61746ELLU: // nuk_Latn_CA
+        case 0xB28D544F4C61746ELLU: // num_Latn_TO
+        case 0xB68D4D4D4C61746ELLU: // nun_Latn_MM
+        case 0xBA8D564E4C61746ELLU: // nuo_Latn_VN
+        case 0xBE8D4E474C61746ELLU: // nup_Latn_NG
+        case 0xC28D50474C61746ELLU: // nuq_Latn_PG
+        case 0xC68D50474C61746ELLU: // nur_Latn_PG
+        case 0xCA8D53534C61746ELLU: // nus_Latn_SS
+        case 0xCE8D564E4C61746ELLU: // nut_Latn_VN
+        case 0xD28D43444C61746ELLU: // nuu_Latn_CD
+        case 0xD68D42464C61746ELLU: // nuv_Latn_BF
+        case 0xDA8D464D4C61746ELLU: // nuw_Latn_FM
+        case 0xDE8D50474C61746ELLU: // nux_Latn_PG
+        case 0xE28D41554C61746ELLU: // nuy_Latn_AU
+        case 0xE68D4D584C61746ELLU: // nuz_Latn_MX
+        case 0x6E7655534C61746ELLU: // nv_Latn_US
+        case 0x9EAD56554C61746ELLU: // nvh_Latn_VU
+        case 0xB2AD50474C61746ELLU: // nvm_Latn_PG
+        case 0xBAAD434D4C61746ELLU: // nvo_Latn_CM
+        case 0x86CD43494C61746ELLU: // nwb_Latn_CI
+        case 0x8ACD4E504E657761LLU: // nwc_Newa_NP
+        case 0x92CD434D4C61746ELLU: // nwe_Latn_CM
+        case 0x9ACD41554C61746ELLU: // nwg_Latn_AU
+        case 0xA2CD56554C61746ELLU: // nwi_Latn_VU
+        case 0xB2CD53534C61746ELLU: // nwm_Latn_SS
+        case 0xBACD41554C61746ELLU: // nwo_Latn_AU
+        case 0xC6CD50474C61746ELLU: // nwr_Latn_PG
+        case 0xDACD545A4C61746ELLU: // nww_Latn_TZ
+        case 0xDECD4E5044657661LLU: // nwx_Deva_NP
+        case 0x82ED544C4C61746ELLU: // nxa_Latn_TL
+        case 0x8EED43444C61746ELLU: // nxd_Latn_CD
+        case 0x92ED49444C61746ELLU: // nxe_Latn_ID
+        case 0x9AED49444C61746ELLU: // nxg_Latn_ID
+        case 0xA2ED545A4C61746ELLU: // nxi_Latn_TZ
+        case 0xAEED49444C61746ELLU: // nxl_Latn_ID
+        case 0xB6ED41554C61746ELLU: // nxn_Latn_AU
+        case 0xBAED47414C61746ELLU: // nxo_Latn_GA
+        case 0xC2ED434E4C61746ELLU: // nxq_Latn_CN
+        case 0xC6ED50474C61746ELLU: // nxr_Latn_PG
+        case 0xDEED49444C61746ELLU: // nxx_Latn_ID
+        case 0x6E794D574C61746ELLU: // ny_Latn_MW
+        case 0x870D47484C61746ELLU: // nyb_Latn_GH
+        case 0x8B0D43444C61746ELLU: // nyc_Latn_CD
+        case 0x8F0D4B454C61746ELLU: // nyd_Latn_KE
+        case 0x930D414F4C61746ELLU: // nye_Latn_AO
+        case 0x970D4B454C61746ELLU: // nyf_Latn_KE
+        case 0x9B0D43444C61746ELLU: // nyg_Latn_CD
+        case 0x9F0D41554C61746ELLU: // nyh_Latn_AU
+        case 0xA30D53444C61746ELLU: // nyi_Latn_SD
+        case 0xA70D43444C61746ELLU: // nyj_Latn_CD
+        case 0xAB0D414F4C61746ELLU: // nyk_Latn_AO
+        case 0xAF0D544854686169LLU: // nyl_Thai_TH
+        case 0xB30D545A4C61746ELLU: // nym_Latn_TZ
+        case 0xB70D55474C61746ELLU: // nyn_Latn_UG
+        case 0xBB0D55474C61746ELLU: // nyo_Latn_UG
+        case 0xBF0D55474C61746ELLU: // nyp_Latn_UG
+        case 0xC30D495241726162LLU: // nyq_Arab_IR
+        case 0xC70D4D574C61746ELLU: // nyr_Latn_MW
+        case 0xCB0D41554C61746ELLU: // nys_Latn_AU
+        case 0xCF0D41554C61746ELLU: // nyt_Latn_AU
+        case 0xD30D4D5A4C61746ELLU: // nyu_Latn_MZ
+        case 0xD70D41554C61746ELLU: // nyv_Latn_AU
+        case 0xDB0D544854686169LLU: // nyw_Thai_TH
+        case 0xDF0D41554C61746ELLU: // nyx_Latn_AU
+        case 0xE30D545A4C61746ELLU: // nyy_Latn_TZ
+        case 0x832D434D4C61746ELLU: // nza_Latn_CM
+        case 0x872D47414C61746ELLU: // nzb_Latn_GA
+        case 0x8F2D43444C61746ELLU: // nzd_Latn_CD
+        case 0xA32D47484C61746ELLU: // nzi_Latn_GH
+        case 0xAB2D43464C61746ELLU: // nzk_Latn_CF
+        case 0xB32D494E4C61746ELLU: // nzm_Latn_IN
+        case 0xC72D4E474C61746ELLU: // nzr_Latn_NG
+        case 0xD32D43474C61746ELLU: // nzu_Latn_CG
+        case 0xE32D54444C61746ELLU: // nzy_Latn_TD
+        case 0xE72D4D4C4C61746ELLU: // nzz_Latn_ML
+        case 0x800E52554379726CLLU: // oaa_Cyrl_RU
+        case 0x880E52554379726CLLU: // oac_Cyrl_RU
+        case 0xC40E535953797263LLU: // oar_Syrc_SY
+        case 0xD40E474547656F72LLU: // oav_Geor_GE
+        case 0xA02E55534C61746ELLU: // obi_Latn_US
+        case 0xA82E50484C61746ELLU: // obk_Latn_PH
+        case 0xAC2E434D4C61746ELLU: // obl_Latn_CM
+        case 0xB02E4A4F50686E78LLU: // obm_Phnx_JO
+        case 0xB82E50484C61746ELLU: // obo_Latn_PH
+        case 0xC42E4D4D4D796D72LLU: // obr_Mymr_MM
+        case 0xCC2E46524C61746ELLU: // obt_Latn_FR
+        case 0xD02E4E474C61746ELLU: // obu_Latn_NG
+        case 0x6F6346524C61746ELLU: // oc_Latn_FR
+        case 0x804E50454C61746ELLU: // oca_Latn_PE
+        case 0xB84E47424C61746ELLU: // oco_Latn_GB
+        case 0xD04E4D584C61746ELLU: // ocu_Latn_MX
+        case 0x806E4E474C61746ELLU: // oda_Latn_NG
+        case 0xA86E504B41726162LLU: // odk_Arab_PK
+        case 0xCC6E4E4C4C61746ELLU: // odt_Latn_NL
+        case 0xD06E4E474C61746ELLU: // odu_Latn_NG
+        case 0xC8AE4E4C4C61746ELLU: // ofs_Latn_NL
+        case 0xD0AE4E474C61746ELLU: // ofu_Latn_NG
+        case 0x84CE4E474C61746ELLU: // ogb_Latn_NG
+        case 0x88CE4E474C61746ELLU: // ogc_Latn_NG
+        case 0x98CE4E474C61746ELLU: // ogg_Latn_NG
+        case 0xB8CE4E474C61746ELLU: // ogo_Latn_NG
+        case 0xD0CE4E474C61746ELLU: // ogu_Latn_NG
+        case 0xCCEE545258737578LLU: // oht_Xsux_TR
+        case 0xD0EE48554C61746ELLU: // ohu_Latn_HU
+        case 0x810E49444C61746ELLU: // oia_Latn_ID
+        case 0x910E53534C61746ELLU: // oie_Latn_SS
+        case 0xB50E50474C61746ELLU: // oin_Latn_PG
+        case 0x6F6A434143616E73LLU: // oj_Cans_CA
+        case 0x852E43414C61746ELLU: // ojb_Latn_CA
+        case 0x892E43414C61746ELLU: // ojc_Latn_CA
+        case 0xC92E434143616E73LLU: // ojs_Cans_CA
+        case 0xD52E53424C61746ELLU: // ojv_Latn_SB
+        case 0xD92E43414C61746ELLU: // ojw_Latn_CA
+        case 0x814E43414C61746ELLU: // oka_Latn_CA
+        case 0x854E4E474C61746ELLU: // okb_Latn_NG
+        case 0x894E43444C61746ELLU: // okc_Latn_CD
+        case 0x8D4E4E474C61746ELLU: // okd_Latn_NG
+        case 0x914E4E474C61746ELLU: // oke_Latn_NG
+        case 0x994E41554C61746ELLU: // okg_Latn_AU
+        case 0xA14E4B454C61746ELLU: // oki_Latn_KE
+        case 0xA94E50474C61746ELLU: // okk_Latn_PG
+        case 0xB14E4B5248616E67LLU: // okm_Hang_KR
+        case 0xB94E4B5248616E69LLU: // oko_Hani_KR
+        case 0xC54E4E474C61746ELLU: // okr_Latn_NG
+        case 0xC94E4E474C61746ELLU: // oks_Latn_NG
+        case 0xD14E434D4C61746ELLU: // oku_Latn_CM
+        case 0xD54E50474C61746ELLU: // okv_Latn_PG
+        case 0xDD4E4E474C61746ELLU: // okx_Latn_NG
+        case 0xE54E4B484B686D72LLU: // okz_Khmr_KH
+        case 0x816E4E5044657661LLU: // ola_Deva_NP
+        case 0x8D6E545A4C61746ELLU: // old_Latn_TZ
+        case 0x916E425454696274LLU: // ole_Tibt_BT
+        case 0xA96E41554C61746ELLU: // olk_Latn_AU
+        case 0xB16E4E474C61746ELLU: // olm_Latn_NG
+        case 0xB96E52554C61746ELLU: // olo_Latn_RU
+        case 0xC56E56554C61746ELLU: // olr_Latn_VU
+        case 0xCD6E4C544C61746ELLU: // olt_Latn_LT
+        case 0xD16E414F4C61746ELLU: // olu_Latn_AO
+        case 0x6F6D45544C61746ELLU: // om_Latn_ET
+        case 0x818E55534C61746ELLU: // oma_Latn_US
+        case 0x858E56554C61746ELLU: // omb_Latn_VU
+        case 0x898E50454C61746ELLU: // omc_Latn_PE
+        case 0x998E50454C61746ELLU: // omg_Latn_PE
+        case 0xA18E43444C61746ELLU: // omi_Latn_CD
+        case 0xA98E52554379726CLLU: // omk_Cyrl_RU
+        case 0xAD8E43444C61746ELLU: // oml_Latn_CD
+        case 0xB98E50474C61746ELLU: // omo_Latn_PG
+        case 0xBD8E494E4D746569LLU: // omp_Mtei_IN
+        case 0xC58E494E4D6F6469LLU: // omr_Modi_IN
+        case 0xCD8E4B454C61746ELLU: // omt_Latn_KE
+        case 0xD18E50454C61746ELLU: // omu_Latn_PE
+        case 0xD98E50474C61746ELLU: // omw_Latn_PG
+        case 0xDD8E4D4D4D796D72LLU: // omx_Mymr_MM
+        case 0x81AE41524C61746ELLU: // ona_Latn_AR
+        case 0x91AE43414C61746ELLU: // one_Latn_CA
+        case 0x99AE50474C61746ELLU: // ong_Latn_PG
+        case 0xA1AE49444C61746ELLU: // oni_Latn_ID
+        case 0xA5AE50474C61746ELLU: // onj_Latn_PG
+        case 0xA9AE50474C61746ELLU: // onk_Latn_PG
+        case 0xB5AE50474C61746ELLU: // onn_Latn_PG
+        case 0xB9AE43414C61746ELLU: // ono_Latn_CA
+        case 0xBDAE494E4C61746ELLU: // onp_Latn_IN
+        case 0xC5AE50474C61746ELLU: // onr_Latn_PG
+        case 0xC9AE50474C61746ELLU: // ons_Latn_PG
+        case 0xCDAE50474C61746ELLU: // ont_Latn_PG
+        case 0xD1AE56554C61746ELLU: // onu_Latn_VU
+        case 0xDDAE49444C61746ELLU: // onx_Latn_ID
+        case 0x8DCE55534C61746ELLU: // ood_Latn_US
+        case 0xB5CE494E44657661LLU: // oon_Deva_IN
+        case 0xC5CE5A414C61746ELLU: // oor_Latn_ZA
+        case 0x81EE4E474C61746ELLU: // opa_Latn_NG
+        case 0xA9EE49444C61746ELLU: // opk_Latn_ID
+        case 0xB1EE50474C61746ELLU: // opm_Latn_PG
+        case 0xB9EE50474C61746ELLU: // opo_Latn_PG
+        case 0xCDEE4D584C61746ELLU: // opt_Latn_MX
+        case 0xE1EE42524C61746ELLU: // opy_Latn_BR
+        case 0x6F72494E4F727961LLU: // or_Orya_IN
+        case 0x822E53424C61746ELLU: // ora_Latn_SB
+        case 0x8A2E4B454C61746ELLU: // orc_Latn_KE
+        case 0x922E50454C61746ELLU: // ore_Latn_PE
+        case 0x9A2E4E474C61746ELLU: // org_Latn_NG
+        case 0xB62E4D594C61746ELLU: // orn_Latn_MY
+        case 0xBA2E50474C61746ELLU: // oro_Latn_PG
+        case 0xC62E4E474C61746ELLU: // orr_Latn_NG
+        case 0xCA2E4D594C61746ELLU: // ors_Latn_MY
+        case 0xCE2E494E54656C75LLU: // ort_Telu_IN
+        case 0xD22E504B41726162LLU: // oru_Arab_PK
+        case 0xD62E52554379726CLLU: // orv_Cyrl_RU
+        case 0xDA2E42524C61746ELLU: // orw_Latn_BR
+        case 0xDE2E4E474C61746ELLU: // orx_Latn_NG
+        case 0xE62E49444C61746ELLU: // orz_Latn_ID
+        case 0x6F7347454379726CLLU: // os_Cyrl_GE
+        case 0x824E55534F736765LLU: // osa_Osge_US
+        case 0x8A4E49544974616CLLU: // osc_Ital_IT
+        case 0xA24E49444A617661LLU: // osi_Java_ID
+        case 0xBA4E4E474C61746ELLU: // oso_Latn_NG
+        case 0xBE4E45534C61746ELLU: // osp_Latn_ES
+        case 0xCE4E434D4C61746ELLU: // ost_Latn_CM
+        case 0xD24E50474C61746ELLU: // osu_Latn_PG
+        case 0xDE4E44454C61746ELLU: // osx_Latn_DE
+        case 0x826E545241726162LLU: // ota_Arab_TR
+        case 0x866E434E54696274LLU: // otb_Tibt_CN
+        case 0x8E6E49444C61746ELLU: // otd_Latn_ID
+        case 0x926E4D584C61746ELLU: // ote_Latn_MX
+        case 0xA26E42524C61746ELLU: // oti_Latn_BR
+        case 0xAA6E4D4E4F726B68LLU: // otk_Orkh_MN
+        case 0xAE6E4D584C61746ELLU: // otl_Latn_MX
+        case 0xB26E4D584C61746ELLU: // otm_Latn_MX
+        case 0xB66E4D584C61746ELLU: // otn_Latn_MX
+        case 0xC26E4D584C61746ELLU: // otq_Latn_MX
+        case 0xC66E53444C61746ELLU: // otr_Latn_SD
+        case 0xCA6E4D584C61746ELLU: // ots_Latn_MX
+        case 0xCE6E4D584C61746ELLU: // ott_Latn_MX
+        case 0xD26E42524C61746ELLU: // otu_Latn_BR
+        case 0xDA6E43414C61746ELLU: // otw_Latn_CA
+        case 0xDE6E4D584C61746ELLU: // otx_Latn_MX
+        case 0xE26E494E4772616ELLU: // oty_Gran_IN
+        case 0xE66E4D584C61746ELLU: // otz_Latn_MX
+        case 0x868E4C524C61746ELLU: // oub_Latn_LR
+        case 0x928E50474C61746ELLU: // oue_Latn_PG
+        case 0xA28E434E4F756772LLU: // oui_Ougr_CN
+        case 0xB28E50474C61746ELLU: // oum_Latn_PG
+        case 0x8EAE53454C61746ELLU: // ovd_Latn_SE
+        case 0xA2CE50474C61746ELLU: // owi_Latn_PG
+        case 0xAECE47424C61746ELLU: // owl_Latn_GB
+        case 0x8F0E45544C61746ELLU: // oyd_Latn_ET
+        case 0xB30E42524C61746ELLU: // oym_Latn_BR
+        case 0xE30E50474C61746ELLU: // oyy_Latn_PG
+        case 0xB32E434D4C61746ELLU: // ozm_Latn_CM
+        case 0x7061504B41726162LLU: // pa_Arab_PK
+        case 0x7061494E47757275LLU: // pa_Guru_IN
+        case 0x840F42524C61746ELLU: // pab_Latn_BR
+        case 0x880F564E4C61746ELLU: // pac_Latn_VN
+        case 0x8C0F42524C61746ELLU: // pad_Latn_BR
+        case 0x900F43444C61746ELLU: // pae_Latn_CD
+        case 0x940F42524C61746ELLU: // paf_Latn_BR
+        case 0x980F50484C61746ELLU: // pag_Latn_PH
+        case 0x9C0F42524C61746ELLU: // pah_Latn_BR
+        case 0xA00F4E474C61746ELLU: // pai_Latn_NG
+        case 0xA80F42524C61746ELLU: // pak_Latn_BR
+        case 0xAC0F495250686C69LLU: // pal_Phli_IR
+        case 0xAC0F434E50686C70LLU: // pal_Phlp_CN
+        case 0xB00F50484C61746ELLU: // pam_Latn_PH
+        case 0xB80F55534C61746ELLU: // pao_Latn_US
+        case 0xBC0F43574C61746ELLU: // pap_Latn_CW
+        case 0xC00F544A4379726CLLU: // paq_Cyrl_TJ
+        case 0xC40F55534C61746ELLU: // par_Latn_US
+        case 0xC80F49444C61746ELLU: // pas_Latn_ID
+        case 0xD00F50574C61746ELLU: // pau_Latn_PW
+        case 0xD40F42524C61746ELLU: // pav_Latn_BR
+        case 0xD80F55534C61746ELLU: // paw_Latn_US
+        case 0xDC0F42524C61746ELLU: // pax_Latn_BR
+        case 0xE00F484E4C61746ELLU: // pay_Latn_HN
+        case 0xE40F42524C61746ELLU: // paz_Latn_BR
+        case 0x842F434F4C61746ELLU: // pbb_Latn_CO
+        case 0x882F47594C61746ELLU: // pbc_Latn_GY
+        case 0x902F4D584C61746ELLU: // pbe_Latn_MX
+        case 0x942F4D584C61746ELLU: // pbf_Latn_MX
+        case 0x982F56454C61746ELLU: // pbg_Latn_VE
+        case 0x9C2F56454C61746ELLU: // pbh_Latn_VE
+        case 0xA02F434D4C61746ELLU: // pbi_Latn_CM
+        case 0xAC2F4E474C61746ELLU: // pbl_Latn_NG
+        case 0xB02F4D584C61746ELLU: // pbm_Latn_MX
+        case 0xB42F4E474C61746ELLU: // pbn_Latn_NG
+        case 0xB82F47574C61746ELLU: // pbo_Latn_GW
+        case 0xBC2F474E4C61746ELLU: // pbp_Latn_GN
+        case 0xC42F545A4C61746ELLU: // pbr_Latn_TZ
+        case 0xC82F4D584C61746ELLU: // pbs_Latn_MX
+        case 0xCC2F414641726162LLU: // pbt_Arab_AF
+        case 0xD42F494E4C61746ELLU: // pbv_Latn_IN
+        case 0xE02F50474C61746ELLU: // pby_Latn_PG
+        case 0x804F4D584C61746ELLU: // pca_Latn_MX
+        case 0x844F4B484B686D72LLU: // pcb_Khmr_KH
+        case 0x884F434E4C61746ELLU: // pcc_Latn_CN
+        case 0x8C4F46524C61746ELLU: // pcd_Latn_FR
+        case 0x904F4D4D4D796D72LLU: // pce_Mymr_MM
+        case 0x944F494E4D6C796DLLU: // pcf_Mlym_IN
+        case 0x984F494E4D6C796DLLU: // pcg_Mlym_IN
+        case 0x9C4F494E44657661LLU: // pch_Deva_IN
+        case 0xA04F494E44657661LLU: // pci_Deva_IN
+        case 0xA44F494E54656C75LLU: // pcj_Telu_IN
+        case 0xA84F494E4C61746ELLU: // pck_Latn_IN
+        case 0xB04F4E474C61746ELLU: // pcm_Latn_NG
+        case 0xB44F4E474C61746ELLU: // pcn_Latn_NG
+        case 0xBC4F424F4C61746ELLU: // pcp_Latn_BO
+        case 0xD84F4E474C61746ELLU: // pcw_Latn_NG
+        case 0x806F50474C61746ELLU: // pda_Latn_PG
+        case 0x886F55534C61746ELLU: // pdc_Latn_US
+        case 0xB46F49444C61746ELLU: // pdn_Latn_ID
+        case 0xB86F49444C61746ELLU: // pdo_Latn_ID
+        case 0xCC6F43414C61746ELLU: // pdt_Latn_CA
+        case 0xD06F4D4D4C61746ELLU: // pdu_Latn_MM
+        case 0x808F49444C61746ELLU: // pea_Latn_ID
+        case 0x848F55534C61746ELLU: // peb_Latn_US
+        case 0x8C8F50474C61746ELLU: // ped_Latn_PG
+        case 0x908F49444C61746ELLU: // pee_Latn_ID
+        case 0x988F494E4F727961LLU: // peg_Orya_IN
+        case 0xA08F4D584C61746ELLU: // pei_Latn_MX
+        case 0xA88F50474C61746ELLU: // pek_Latn_PG
+        case 0xAC8F49444C61746ELLU: // pel_Latn_ID
+        case 0xB08F43444C61746ELLU: // pem_Latn_CD
+        case 0xB88F49525870656FLLU: // peo_Xpeo_IR
+        case 0xBC8F50474C61746ELLU: // pep_Latn_PG
+        case 0xC08F55534C61746ELLU: // peq_Latn_US
+        case 0xD48F56454C61746ELLU: // pev_Latn_VE
+        case 0xDC8F50474C61746ELLU: // pex_Latn_PG
+        case 0xE08F49444C61746ELLU: // pey_Latn_ID
+        case 0xE48F4D594C61746ELLU: // pez_Latn_MY
+        case 0x80AF464D4C61746ELLU: // pfa_Latn_FM
+        case 0x90AF434D4C61746ELLU: // pfe_Latn_CM
+        case 0xACAF44454C61746ELLU: // pfl_Latn_DE
+        case 0x80CF53534C61746ELLU: // pga_Latn_SS
+        case 0x8CCF504B4B686172LLU: // pgd_Khar_PK
+        case 0x98CF494E44657661LLU: // pgg_Deva_IN
+        case 0xA0CF50474C61746ELLU: // pgi_Latn_PG
+        case 0xA8CF56554C61746ELLU: // pgk_Latn_VU
+        case 0xACCF49454F67616DLLU: // pgl_Ogam_IE
+        case 0xB4CF49544974616CLLU: // pgn_Ital_IT
+        case 0xC8CF4E474C61746ELLU: // pgs_Latn_NG
+        case 0xD0CF49444C61746ELLU: // pgu_Latn_ID
+        case 0x8CEF494E44657661LLU: // phd_Deva_IN
+        case 0x98EF564E4C61746ELLU: // phg_Latn_VN
+        case 0x9CEF564E4C61746ELLU: // phh_Latn_VN
+        case 0xA8EF494E4D796D72LLU: // phk_Mymr_IN
+        case 0xACEF504B41726162LLU: // phl_Arab_PK
+        case 0xB0EF4D5A4C61746ELLU: // phm_Latn_MZ
+        case 0xB4EF4C4250686E78LLU: // phn_Phnx_LB
+        case 0xB8EF4C414C616F6FLLU: // pho_Laoo_LA
+        case 0xC4EF504B41726162LLU: // phr_Arab_PK
+        case 0xCCEF544854686169LLU: // pht_Thai_TH
+        case 0xD0EF544854686169LLU: // phu_Thai_TH
+        case 0xD4EF414641726162LLU: // phv_Arab_AF
+        case 0xD8EF4E5044657661LLU: // phw_Deva_NP
+        case 0x7069494E53696E68LLU: // pi_Sinh_IN
+        case 0x810F4D584C61746ELLU: // pia_Latn_MX
+        case 0x850F50454C61746ELLU: // pib_Latn_PE
+        case 0x890F47414C61746ELLU: // pic_Latn_GA
+        case 0x8D0F56454C61746ELLU: // pid_Latn_VE
+        case 0x950F464D4C61746ELLU: // pif_Latn_FM
+        case 0x990F50454C61746ELLU: // pig_Latn_PE
+        case 0x9D0F4E464C61746ELLU: // pih_Latn_NF
+        case 0xA50F434F4C61746ELLU: // pij_Latn_CO
+        case 0xAD0F424A4C61746ELLU: // pil_Latn_BJ
+        case 0xB10F55534C61746ELLU: // pim_Latn_US
+        case 0xB50F50474C61746ELLU: // pin_Latn_PG
+        case 0xB90F434F4C61746ELLU: // pio_Latn_CO
+        case 0xBD0F4E474C61746ELLU: // pip_Latn_NG
+        case 0xC50F42524C61746ELLU: // pir_Latn_BR
+        case 0xC90F53424C61746ELLU: // pis_Latn_SB
+        case 0xCD0F41554C61746ELLU: // pit_Latn_AU
+        case 0xD10F41554C61746ELLU: // piu_Latn_AU
+        case 0xD50F53424C61746ELLU: // piv_Latn_SB
+        case 0xD90F545A4C61746ELLU: // piw_Latn_TZ
+        case 0xDD0F50474C61746ELLU: // pix_Latn_PG
+        case 0xE10F4E474C61746ELLU: // piy_Latn_NG
+        case 0xE50F4E434C61746ELLU: // piz_Latn_NC
+        case 0xCD2F41554C61746ELLU: // pjt_Latn_AU
+        case 0x814F494E42726168LLU: // pka_Brah_IN
+        case 0x854F4B454C61746ELLU: // pkb_Latn_KE
+        case 0x994F50474C61746ELLU: // pkg_Latn_PG
+        case 0x9D4F42444C61746ELLU: // pkh_Latn_BD
+        case 0xB54F41554C61746ELLU: // pkn_Latn_AU
+        case 0xB94F4B454C61746ELLU: // pko_Latn_KE
+        case 0xBD4F434B4C61746ELLU: // pkp_Latn_CK
+        case 0xC54F494E4D6C796DLLU: // pkr_Mlym_IN
+        case 0xD14F49444C61746ELLU: // pku_Latn_ID
+        case 0x706C504C4C61746ELLU: // pl_Latn_PL
+        case 0x816F50474C61746ELLU: // pla_Latn_PG
+        case 0x856F56554C61746ELLU: // plb_Latn_VU
+        case 0x896F50484C61746ELLU: // plc_Latn_PH
+        case 0x8D6F47424C61746ELLU: // pld_Latn_GB
+        case 0x916F49444C61746ELLU: // ple_Latn_ID
+        case 0x996F41524C61746ELLU: // plg_Latn_AR
+        case 0x9D6F49444C61746ELLU: // plh_Latn_ID
+        case 0xA96F504B41726162LLU: // plk_Arab_PK
+        case 0xAD6F4D4D4D796D72LLU: // pll_Mymr_MM
+        case 0xB56F434F4C61746ELLU: // pln_Latn_CO
+        case 0xB96F4D584C61746ELLU: // plo_Latn_MX
+        case 0xC56F43494C61746ELLU: // plr_Latn_CI
+        case 0xC96F4D584C61746ELLU: // pls_Latn_MX
+        case 0xD16F42524C61746ELLU: // plu_Latn_BR
+        case 0xD56F50484C61746ELLU: // plv_Latn_PH
+        case 0xD96F50484C61746ELLU: // plw_Latn_PH
+        case 0xE56F4D594C61746ELLU: // plz_Latn_MY
+        case 0x818F56554C61746ELLU: // pma_Latn_VU
+        case 0x858F43444C61746ELLU: // pmb_Latn_CD
+        case 0x8D8F41554C61746ELLU: // pmd_Latn_AU
+        case 0x918F4E434C61746ELLU: // pme_Latn_NC
+        case 0x958F49444C61746ELLU: // pmf_Latn_ID
+        case 0x9D8F494E42726168LLU: // pmh_Brah_IN
+        case 0xA18F434E4C61746ELLU: // pmi_Latn_CN
+        case 0xA58F434E4C61746ELLU: // pmj_Latn_CN
+        case 0xAD8F544E4C61746ELLU: // pml_Latn_TN
+        case 0xB18F434D4C61746ELLU: // pmm_Latn_CM
+        case 0xB58F434D4C61746ELLU: // pmn_Latn_CM
+        case 0xB98F49444C61746ELLU: // pmo_Latn_ID
+        case 0xC18F4D584C61746ELLU: // pmq_Latn_MX
+        case 0xC58F50474C61746ELLU: // pmr_Latn_PG
+        case 0xC98F49544C61746ELLU: // pms_Latn_IT
+        case 0xCD8F50464C61746ELLU: // pmt_Latn_PF
+        case 0xD98F55534C61746ELLU: // pmw_Latn_US
+        case 0xDD8F494E4C61746ELLU: // pmx_Latn_IN
+        case 0xE18F49444C61746ELLU: // pmy_Latn_ID
+        case 0xE58F4D584C61746ELLU: // pmz_Latn_MX
+        case 0x81AF4D594C61746ELLU: // pna_Latn_MY
+        case 0x89AF49444C61746ELLU: // pnc_Latn_ID
+        case 0x8DAF414F4C61746ELLU: // pnd_Latn_AO
+        case 0x91AF4D594C61746ELLU: // pne_Latn_MY
+        case 0x99AF4E474C61746ELLU: // png_Latn_NG
+        case 0x9DAF434B4C61746ELLU: // pnh_Latn_CK
+        case 0xA1AF49444C61746ELLU: // pni_Latn_ID
+        case 0xA5AF41554C61746ELLU: // pnj_Latn_AU
+        case 0xA9AF424F4C61746ELLU: // pnk_Latn_BO
+        case 0xADAF42464C61746ELLU: // pnl_Latn_BF
+        case 0xB1AF4D594C61746ELLU: // pnm_Latn_MY
+        case 0xB5AF50474C61746ELLU: // pnn_Latn_PG
+        case 0xB9AF50454C61746ELLU: // pno_Latn_PE
+        case 0xBDAF49444C61746ELLU: // pnp_Latn_ID
+        case 0xC1AF42464C61746ELLU: // pnq_Latn_BF
+        case 0xC5AF50474C61746ELLU: // pnr_Latn_PG
+        case 0xC9AF49444C61746ELLU: // pns_Latn_ID
+        case 0xCDAF47524772656BLLU: // pnt_Grek_GR
+        case 0xD5AF41554C61746ELLU: // pnv_Latn_AU
+        case 0xD9AF41554C61746ELLU: // pnw_Latn_AU
+        case 0xE1AF434D4C61746ELLU: // pny_Latn_CM
+        case 0xE5AF43464C61746ELLU: // pnz_Latn_CF
+        case 0x89CF47544C61746ELLU: // poc_Latn_GT
+        case 0x91CF4D584C61746ELLU: // poe_Latn_MX
+        case 0x95CF43444C61746ELLU: // pof_Latn_CD
+        case 0x99CF42524C61746ELLU: // pog_Latn_BR
+        case 0x9DCF47544C61746ELLU: // poh_Latn_GT
+        case 0xA1CF4D584C61746ELLU: // poi_Latn_MX
+        case 0xA9CF42524C61746ELLU: // pok_Latn_BR
+        case 0xB1CF55534C61746ELLU: // pom_Latn_US
+        case 0xB5CF464D4C61746ELLU: // pon_Latn_FM
+        case 0xB9CF55534C61746ELLU: // poo_Latn_US
+        case 0xBDCF4E434C61746ELLU: // pop_Latn_NC
+        case 0xC1CF4D584C61746ELLU: // poq_Latn_MX
+        case 0xC9CF4D584C61746ELLU: // pos_Latn_MX
+        case 0xCDCF55534C61746ELLU: // pot_Latn_US
+        case 0xD5CF47574C61746ELLU: // pov_Latn_GW
+        case 0xD9CF4D584C61746ELLU: // pow_Latn_MX
+        case 0xE1CF545A4C61746ELLU: // poy_Latn_TZ
+        case 0x91EF50474C61746ELLU: // ppe_Latn_PG
+        case 0xA1EF4D584C61746ELLU: // ppi_Latn_MX
+        case 0xA9EF49444C61746ELLU: // ppk_Latn_ID
+        case 0xADEF53564C61746ELLU: // ppl_Latn_SV
+        case 0xB1EF49444C61746ELLU: // ppm_Latn_ID
+        case 0xB5EF50474C61746ELLU: // ppn_Latn_PG
+        case 0xB9EF50474C61746ELLU: // ppo_Latn_PG
+        case 0xBDEF43444C61746ELLU: // ppp_Latn_CD
+        case 0xC1EF50474C61746ELLU: // ppq_Latn_PG
+        case 0xC9EF4D584C61746ELLU: // pps_Latn_MX
+        case 0xCDEF50474C61746ELLU: // ppt_Latn_PG
+        case 0x820F4E474C61746ELLU: // pqa_Latn_NG
+        case 0xB20F43414C61746ELLU: // pqm_Latn_CA
+        case 0x822F504B4B686172LLU: // pra_Khar_PK
+        case 0x8A2F414641726162LLU: // prc_Arab_AF
+        case 0x8E2F495241726162LLU: // prd_Arab_IR
+        case 0x922F53544C61746ELLU: // pre_Latn_ST
+        case 0x962F50484C61746ELLU: // prf_Latn_PH
+        case 0x9A2F504C4C61746ELLU: // prg_Latn_PL
+        case 0x9E2F50484C61746ELLU: // prh_Latn_PH
+        case 0xA22F4E434C61746ELLU: // pri_Latn_NC
+        case 0xAA2F4D4D4C61746ELLU: // prk_Latn_MM
+        case 0xB22F50474C61746ELLU: // prm_Latn_PG
+        case 0xBA2F46524C61746ELLU: // pro_Latn_FR
+        case 0xC22F50454C61746ELLU: // prq_Latn_PE
+        case 0xC62F42524C61746ELLU: // prr_Latn_BR
+        case 0xCE2F544854686169LLU: // prt_Thai_TH
+        case 0xD22F49444C61746ELLU: // pru_Latn_ID
+        case 0xDA2F50474C61746ELLU: // prw_Latn_PG
+        case 0xDE2F494E41726162LLU: // prx_Arab_IN
+        case 0x7073414641726162LLU: // ps_Arab_AF
+        case 0x824F49444C61746ELLU: // psa_Latn_ID
+        case 0x924F49444C61746ELLU: // pse_Latn_ID
+        case 0x9E4F414641726162LLU: // psh_Arab_AF
+        case 0xA24F414641726162LLU: // psi_Arab_AF
+        case 0xB24F424F4C61746ELLU: // psm_Latn_BO
+        case 0xB64F49444C61746ELLU: // psn_Latn_ID
+        case 0xC24F50474C61746ELLU: // psq_Latn_PG
+        case 0xCA4F50474C61746ELLU: // pss_Latn_PG
+        case 0xCE4F504B41726162LLU: // pst_Arab_PK
+        case 0xD24F494E42726168LLU: // psu_Brah_IN
+        case 0xDA4F56554C61746ELLU: // psw_Latn_VU
+        case 0x707442524C61746ELLU: // pt_Latn_BR
+        case 0x826F50594C61746ELLU: // pta_Latn_PY
+        case 0x9E6F42524C61746ELLU: // pth_Latn_BR
+        case 0xA26F41554C61746ELLU: // pti_Latn_AU
+        case 0xB66F49444C61746ELLU: // ptn_Latn_ID
+        case 0xBA6F42524C61746ELLU: // pto_Latn_BR
+        case 0xBE6F50474C61746ELLU: // ptp_Latn_PG
+        case 0xC66F56554C61746ELLU: // ptr_Latn_VU
+        case 0xCE6F49444C61746ELLU: // ptt_Latn_ID
+        case 0xD26F49444C61746ELLU: // ptu_Latn_ID
+        case 0xD66F56554C61746ELLU: // ptv_Latn_VU
+        case 0x828F4D584C61746ELLU: // pua_Latn_MX
+        case 0x868F494E4C61746ELLU: // pub_Latn_IN
+        case 0x8A8F49444C61746ELLU: // puc_Latn_ID
+        case 0x8E8F49444C61746ELLU: // pud_Latn_ID
+        case 0x928F41524C61746ELLU: // pue_Latn_AR
+        case 0x968F49444C61746ELLU: // puf_Latn_ID
+        case 0x9A8F42464C61746ELLU: // pug_Latn_BF
+        case 0xA28F434F4C61746ELLU: // pui_Latn_CO
+        case 0xA68F49444C61746ELLU: // puj_Latn_ID
+        case 0xB28F4E5044657661LLU: // pum_Deva_NP
+        case 0xBA8F564E4C61746ELLU: // puo_Latn_VN
+        case 0xBE8F50474C61746ELLU: // pup_Latn_PG
+        case 0xC28F424F4C61746ELLU: // puq_Latn_BO
+        case 0xC68F42524C61746ELLU: // pur_Latn_BR
+        case 0xCE8F49444C61746ELLU: // put_Latn_ID
+        case 0xD28F47414C61746ELLU: // puu_Latn_GA
+        case 0xDA8F464D4C61746ELLU: // puw_Latn_FM
+        case 0xDE8F50474C61746ELLU: // pux_Latn_PG
+        case 0xE28F55534C61746ELLU: // puy_Latn_US
+        case 0x82CF50474C61746ELLU: // pwa_Latn_PG
+        case 0x86CF4E474C61746ELLU: // pwb_Latn_NG
+        case 0x9ACF50474C61746ELLU: // pwg_Latn_PG
+        case 0xB2CF50484C61746ELLU: // pwm_Latn_PH
+        case 0xB6CF54574C61746ELLU: // pwn_Latn_TW
+        case 0xBACF4D4D4D796D72LLU: // pwo_Mymr_MM
+        case 0xC6CF494E44657661LLU: // pwr_Deva_IN
+        case 0xDACF544854686169LLU: // pww_Thai_TH
+        case 0xB2EF4D584C61746ELLU: // pxm_Latn_MX
+        case 0x930F43494C61746ELLU: // pye_Latn_CI
+        case 0xB30F4E474C61746ELLU: // pym_Latn_NG
+        case 0xB70F42524C61746ELLU: // pyn_Latn_BR
+        case 0xD30F54574C61746ELLU: // pyu_Latn_TW
+        case 0xDF0F4D4D4D796D72LLU: // pyx_Mymr_MM
+        case 0xE30F4D4D4C61746ELLU: // pyy_Latn_MM
+        case 0x932F4E474C61746ELLU: // pze_Latn_NG
+        case 0x9F2F54574C61746ELLU: // pzh_Latn_TW
+        case 0xB72F4D4D4C61746ELLU: // pzn_Latn_MM
+        case 0x717550454C61746ELLU: // qu_Latn_PE
+        case 0x829055534C61746ELLU: // qua_Latn_US
+        case 0x869050454C61746ELLU: // qub_Latn_PE
+        case 0x8A9047544C61746ELLU: // quc_Latn_GT
+        case 0x8E9045434C61746ELLU: // qud_Latn_EC
+        case 0x969050454C61746ELLU: // quf_Latn_PE
+        case 0x9A9045434C61746ELLU: // qug_Latn_EC
+        case 0xA29055534C61746ELLU: // qui_Latn_US
+        case 0xAA9050454C61746ELLU: // quk_Latn_PE
+        case 0xAE90424F4C61746ELLU: // qul_Latn_BO
+        case 0xB29047544C61746ELLU: // qum_Latn_GT
+        case 0xB69055534C61746ELLU: // qun_Latn_US
+        case 0xBE9050454C61746ELLU: // qup_Latn_PE
+        case 0xC29045534C61746ELLU: // quq_Latn_ES
+        case 0xC69050454C61746ELLU: // qur_Latn_PE
+        case 0xCA9041524C61746ELLU: // qus_Latn_AR
+        case 0xD69047544C61746ELLU: // quv_Latn_GT
+        case 0xDA9045434C61746ELLU: // quw_Latn_EC
+        case 0xDE9050454C61746ELLU: // qux_Latn_PE
+        case 0xE29050454C61746ELLU: // quy_Latn_PE
+        case 0x82B050454C61746ELLU: // qva_Latn_PE
+        case 0x8AB050454C61746ELLU: // qvc_Latn_PE
+        case 0x92B050454C61746ELLU: // qve_Latn_PE
+        case 0x9EB050454C61746ELLU: // qvh_Latn_PE
+        case 0xA2B045434C61746ELLU: // qvi_Latn_EC
+        case 0xA6B045434C61746ELLU: // qvj_Latn_EC
+        case 0xAEB050454C61746ELLU: // qvl_Latn_PE
+        case 0xB2B050454C61746ELLU: // qvm_Latn_PE
+        case 0xB6B050454C61746ELLU: // qvn_Latn_PE
+        case 0xBAB050454C61746ELLU: // qvo_Latn_PE
+        case 0xBEB050454C61746ELLU: // qvp_Latn_PE
+        case 0xCAB050454C61746ELLU: // qvs_Latn_PE
+        case 0xDAB050454C61746ELLU: // qvw_Latn_PE
+        case 0xE6B045434C61746ELLU: // qvz_Latn_EC
+        case 0x82D050454C61746ELLU: // qwa_Latn_PE
+        case 0x8AD050454C61746ELLU: // qwc_Latn_PE
+        case 0x9ED050454C61746ELLU: // qwh_Latn_PE
+        case 0xB2D048554C61746ELLU: // qwm_Latn_HU
+        case 0xCAD050454C61746ELLU: // qws_Latn_PE
+        case 0xCED055534C61746ELLU: // qwt_Latn_US
+        case 0x82F050454C61746ELLU: // qxa_Latn_PE
+        case 0x8AF050454C61746ELLU: // qxc_Latn_PE
+        case 0x9EF050454C61746ELLU: // qxh_Latn_PE
+        case 0xAEF045434C61746ELLU: // qxl_Latn_EC
+        case 0xB6F050454C61746ELLU: // qxn_Latn_PE
+        case 0xBAF050454C61746ELLU: // qxo_Latn_PE
+        case 0xBEF050454C61746ELLU: // qxp_Latn_PE
+        case 0xC2F0495241726162LLU: // qxq_Arab_IR
+        case 0xC6F045434C61746ELLU: // qxr_Latn_EC
+        case 0xCEF050454C61746ELLU: // qxt_Latn_PE
+        case 0xD2F050454C61746ELLU: // qxu_Latn_PE
+        case 0xDAF050454C61746ELLU: // qxw_Latn_PE
+        case 0xBF1055534C61746ELLU: // qyp_Latn_US
+        case 0x80114E5044657661LLU: // raa_Deva_NP
+        case 0x84114E5044657661LLU: // rab_Deva_NP
+        case 0x881149444C61746ELLU: // rac_Latn_ID
+        case 0x8C11564E4C61746ELLU: // rad_Latn_VN
+        case 0x94114E5044657661LLU: // raf_Deva_NP
+        case 0x98114B454C61746ELLU: // rag_Latn_KE
+        case 0x9C11494E42656E67LLU: // rah_Beng_IN
+        case 0xA01150474C61746ELLU: // rai_Latn_PG
+        case 0xA411494E44657661LLU: // raj_Deva_IN
+        case 0xA81150474C61746ELLU: // rak_Latn_PG
+        case 0xB01142524C61746ELLU: // ram_Latn_BR
+        case 0xB41149444C61746ELLU: // ran_Latn_ID
+        case 0xB81150474C61746ELLU: // rao_Latn_PG
+        case 0xBC11434C4C61746ELLU: // rap_Latn_CL
+        case 0xC411434B4C61746ELLU: // rar_Latn_CK
+        case 0xD4114E5044657661LLU: // rav_Deva_NP
+        case 0xD8114D4D4C61746ELLU: // raw_Latn_MM
+        case 0xDC114E474C61746ELLU: // rax_Latn_NG
+        case 0xE01150464C61746ELLU: // ray_Latn_PF
+        case 0xE41149444C61746ELLU: // raz_Latn_ID
+        case 0x84314D4D4D796D72LLU: // rbb_Mymr_MM
+        case 0xA83150484C61746ELLU: // rbk_Latn_PH
+        case 0xAC3150484C61746ELLU: // rbl_Latn_PH
+        case 0xBC3141554C61746ELLU: // rbp_Latn_AU
+        case 0x945152454C61746ELLU: // rcf_Latn_RE
+        case 0x8471495241726162LLU: // rdb_Arab_IR
+        case 0x809150474C61746ELLU: // rea_Latn_PG
+        case 0x849149444C61746ELLU: // reb_Latn_ID
+        case 0x90914D594C61746ELLU: // ree_Latn_MY
+        case 0x9891545A4C61746ELLU: // reg_Latn_TZ
+        case 0xA091494E4F727961LLU: // rei_Orya_IN
+        case 0xA49149444C61746ELLU: // rej_Latn_ID
+        case 0xAC914B454C61746ELLU: // rel_Latn_KE
+        case 0xB09150454C61746ELLU: // rem_Latn_PE
+        case 0xB491564E4C61746ELLU: // ren_Latn_VN
+        case 0xC8914E474C61746ELLU: // res_Latn_NG
+        case 0xCC9149444C61746ELLU: // ret_Latn_ID
+        case 0xE091424F4C61746ELLU: // rey_Latn_BO
+        case 0x80D156554C61746ELLU: // rga_Latn_VU
+        case 0xB4D149544C61746ELLU: // rgn_Latn_IT
+        case 0xC4D150454C61746ELLU: // rgr_Latn_PE
+        case 0xC8D1564E4C61746ELLU: // rgs_Latn_VN
+        case 0xD0D149444C61746ELLU: // rgu_Latn_ID
+        case 0x98F14D4D526F6867LLU: // rhg_Rohg_MM
+        case 0xBCF150474C61746ELLU: // rhp_Latn_PG
+        case 0x8111494E4C61746ELLU: // ria_Latn_IN
+        case 0x95114D414C61746ELLU: // rif_Latn_MA
+        case 0xAD114D4D4C61746ELLU: // ril_Latn_MM
+        case 0xB111545A4C61746ELLU: // rim_Latn_TZ
+        case 0xB5114E474C61746ELLU: // rin_Latn_NG
+        case 0xC51149444C61746ELLU: // rir_Latn_ID
+        case 0xCD1141554C61746ELLU: // rit_Latn_AU
+        case 0xD11149444C61746ELLU: // riu_Latn_ID
+        case 0x993149444C61746ELLU: // rjg_Latn_ID
+        case 0xA1314E5044657661LLU: // rji_Deva_NP
+        case 0xC9314E5044657661LLU: // rjs_Deva_NP
+        case 0x81514B484B686D72LLU: // rka_Khmr_KH
+        case 0x855142524C61746ELLU: // rkb_Latn_BR
+        case 0x9D51434B4C61746ELLU: // rkh_Latn_CK
+        case 0xA1514D4D4D796D72LLU: // rki_Mymr_MM
+        case 0xB15142464C61746ELLU: // rkm_Latn_BF
+        case 0xCD51424442656E67LLU: // rkt_Beng_BD
+        case 0xD95141554C61746ELLU: // rkw_Latn_AU
+        case 0x726D43484C61746ELLU: // rm_Latn_CH
+        case 0x81914E494C61746ELLU: // rma_Latn_NI
+        case 0x859141554C61746ELLU: // rmb_Latn_AU
+        case 0x8991534B4C61746ELLU: // rmc_Latn_SK
+        case 0x8D91444B4C61746ELLU: // rmd_Latn_DK
+        case 0x919147424C61746ELLU: // rme_Latn_GB
+        case 0x959146494C61746ELLU: // rmf_Latn_FI
+        case 0x99914E4F4C61746ELLU: // rmg_Latn_NO
+        case 0x9D9149444C61746ELLU: // rmh_Latn_ID
+        case 0xA191414D41726D6ELLU: // rmi_Armn_AM
+        case 0xA99150474C61746ELLU: // rmk_Latn_PG
+        case 0xAD91504C4C61746ELLU: // rml_Latn_PL
+        case 0xB19149444C61746ELLU: // rmm_Latn_ID
+        case 0xB59152534C61746ELLU: // rmn_Latn_RS
+        case 0xB99143484C61746ELLU: // rmo_Latn_CH
+        case 0xBD9150474C61746ELLU: // rmp_Latn_PG
+        case 0xC19145534C61746ELLU: // rmq_Latn_ES
+        case 0xCD91495241726162LLU: // rmt_Arab_IR
+        case 0xD19153454C61746ELLU: // rmu_Latn_SE
+        case 0xD99147424C61746ELLU: // rmw_Latn_GB
+        case 0xDD91564E4C61746ELLU: // rmx_Latn_VN
+        case 0xE591494E4D796D72LLU: // rmz_Mymr_IN
+        case 0x726E42494C61746ELLU: // rn_Latn_BI
+        case 0x8DB143444C61746ELLU: // rnd_Latn_CD
+        case 0x99B14D5A4C61746ELLU: // rng_Latn_MZ
+        case 0xADB1494E4C61746ELLU: // rnl_Latn_IN
+        case 0xB5B149444C61746ELLU: // rnn_Latn_ID
+        case 0xC5B141554C61746ELLU: // rnr_Latn_AU
+        case 0xD9B1545A4C61746ELLU: // rnw_Latn_TZ
+        case 0x726F524F4C61746ELLU: // ro_Latn_RO
+        case 0x85D149444C61746ELLU: // rob_Latn_ID
+        case 0x89D1564E4C61746ELLU: // roc_Latn_VN
+        case 0x8DD14E474C61746ELLU: // rod_Latn_NG
+        case 0x91D150474C61746ELLU: // roe_Latn_PG
+        case 0x95D1545A4C61746ELLU: // rof_Latn_TZ
+        case 0x99D1564E4C61746ELLU: // rog_Latn_VN
+        case 0xADD150484C61746ELLU: // rol_Latn_PH
+        case 0xB1D1524F4C61746ELLU: // rom_Latn_RO
+        case 0xB9D150474C61746ELLU: // roo_Latn_PG
+        case 0xBDD141554C61746ELLU: // rop_Latn_AU
+        case 0xC5D149444C61746ELLU: // ror_Latn_ID
+        case 0xD1D154444C61746ELLU: // rou_Latn_TD
+        case 0xD9D149444C61746ELLU: // row_Latn_ID
+        case 0xB5F156554C61746ELLU: // rpn_Latn_VU
+        case 0xCDF150474C61746ELLU: // rpt_Latn_PG
+        case 0xA23153424C61746ELLU: // rri_Latn_SB
+        case 0xB2314E5A4C61746ELLU: // rrm_Latn_NZ
+        case 0xBA3150474C61746ELLU: // rro_Latn_PG
+        case 0xCE3141554C61746ELLU: // rrt_Latn_AU
+        case 0xAA5152534379726CLLU: // rsk_Cyrl_RS
+        case 0xDA514E474C61746ELLU: // rsw_Latn_NG
+        case 0x8A714D4D4C61746ELLU: // rtc_Latn_MM
+        case 0x9E7149444C61746ELLU: // rth_Latn_ID
+        case 0xB271464A4C61746ELLU: // rtm_Latn_FJ
+        case 0xDA71494E44657661LLU: // rtw_Deva_IN
+        case 0x727552554379726CLLU: // ru_Cyrl_RU
+        case 0x869155474C61746ELLU: // rub_Latn_UG
+        case 0x8A9155474C61746ELLU: // ruc_Latn_UG
+        case 0x929155414379726CLLU: // rue_Cyrl_UA
+        case 0x9691545A4C61746ELLU: // ruf_Latn_TZ
+        case 0x9A9153424C61746ELLU: // rug_Latn_SB
+        case 0xA291545A4C61746ELLU: // rui_Latn_TZ
+        case 0xAA914E474C61746ELLU: // ruk_Latn_NG
+        case 0xBA9148524C61746ELLU: // ruo_Latn_HR
+        case 0xBE91524F4C61746ELLU: // rup_Latn_RO
+        case 0xC29147524C61746ELLU: // ruq_Latn_GR
+        case 0xCE9152554379726CLLU: // rut_Cyrl_RU
+        case 0xD2914D594C61746ELLU: // ruu_Latn_MY
+        case 0xE2914E474C61746ELLU: // ruy_Latn_NG
+        case 0xE6914E474C61746ELLU: // ruz_Latn_NG
+        case 0x727752574C61746ELLU: // rw_Latn_RW
+        case 0x82D150474C61746ELLU: // rwa_Latn_PG
+        case 0xAAD1545A4C61746ELLU: // rwk_Latn_TZ
+        case 0xAED1545A4C61746ELLU: // rwl_Latn_TZ
+        case 0xB2D155474C61746ELLU: // rwm_Latn_UG
+        case 0xBAD150474C61746ELLU: // rwo_Latn_PG
+        case 0xC6D1494E44657661LLU: // rwr_Deva_IN
+        case 0x8EF141554C61746ELLU: // rxd_Latn_AU
+        case 0xDAF141554C61746ELLU: // rxw_Latn_AU
+        case 0xD3114A504B616E61LLU: // ryu_Kana_JP
+        case 0x7361494E44657661LLU: // sa_Deva_IN
+        case 0x801254444C61746ELLU: // saa_Latn_TD
+        case 0x841250414C61746ELLU: // sab_Latn_PA
+        case 0x881255534C61746ELLU: // sac_Latn_US
+        case 0x8C12545A4C61746ELLU: // sad_Latn_TZ
+        case 0x901242524C61746ELLU: // sae_Latn_BR
+        case 0x941247484C61746ELLU: // saf_Latn_GH
+        case 0x9C1252554379726CLLU: // sah_Cyrl_RU
+        case 0xA41249444C61746ELLU: // saj_Latn_ID
+        case 0xA81247414C61746ELLU: // sak_Latn_GA
+        case 0xB012505353616D72LLU: // sam_Samr_PS
+        case 0xB81249444C61746ELLU: // sao_Latn_ID
+        case 0xC0124B454C61746ELLU: // saq_Latn_KE
+        case 0xC412424F4C61746ELLU: // sar_Latn_BO
+        case 0xC81249444C61746ELLU: // sas_Latn_ID
+        case 0xCC12494E4F6C636BLLU: // sat_Olck_IN
+        case 0xD01249444C61746ELLU: // sau_Latn_ID
+        case 0xD412534E4C61746ELLU: // sav_Latn_SN
+        case 0xD81249444C61746ELLU: // saw_Latn_ID
+        case 0xDC1256554C61746ELLU: // sax_Latn_VU
+        case 0xE0124E474C61746ELLU: // say_Latn_NG
+        case 0xE412494E53617572LLU: // saz_Saur_IN
+        case 0x803254444C61746ELLU: // sba_Latn_TD
+        case 0x843253424C61746ELLU: // sbb_Latn_SB
+        case 0x883250474C61746ELLU: // sbc_Latn_PG
+        case 0x8C3242464C61746ELLU: // sbd_Latn_BF
+        case 0x903250474C61746ELLU: // sbe_Latn_PG
+        case 0x983249444C61746ELLU: // sbg_Latn_ID
+        case 0x9C3250474C61746ELLU: // sbh_Latn_PG
+        case 0xA03250474C61746ELLU: // sbi_Latn_PG
+        case 0xA43254444C61746ELLU: // sbj_Latn_TD
+        case 0xA832545A4C61746ELLU: // sbk_Latn_TZ
+        case 0xAC3250484C61746ELLU: // sbl_Latn_PH
+        case 0xB032545A4C61746ELLU: // sbm_Latn_TZ
+        case 0xB432504B41726162LLU: // sbn_Arab_PK
+        case 0xB8324D594C61746ELLU: // sbo_Latn_MY
+        case 0xBC32545A4C61746ELLU: // sbp_Latn_TZ
+        case 0xC03250474C61746ELLU: // sbq_Latn_PG
+        case 0xC43249444C61746ELLU: // sbr_Latn_ID
+        case 0xC8324E414C61746ELLU: // sbs_Latn_NA
+        case 0xCC3249444C61746ELLU: // sbt_Latn_ID
+        case 0xD032494E54696274LLU: // sbu_Tibt_IN
+        case 0xD43249544C61746ELLU: // sbv_Latn_IT
+        case 0xD83247414C61746ELLU: // sbw_Latn_GA
+        case 0xDC3249444C61746ELLU: // sbx_Latn_ID
+        case 0xE0325A4D4C61746ELLU: // sby_Latn_ZM
+        case 0xE43243464C61746ELLU: // sbz_Latn_CF
+        case 0x736349544C61746ELLU: // sc_Latn_IT
+        case 0x8452564E4C61746ELLU: // scb_Latn_VN
+        case 0x9052434E4C61746ELLU: // sce_Latn_CN
+        case 0x945250414C61746ELLU: // scf_Latn_PA
+        case 0x985249444C61746ELLU: // scg_Latn_ID
+        case 0x9C52494E4C61746ELLU: // sch_Latn_IN
+        case 0xA0524C4B4C61746ELLU: // sci_Latn_LK
+        case 0xA852494E44657661LLU: // sck_Deva_IN
+        case 0xAC52504B41726162LLU: // scl_Arab_PK
+        case 0xB45249544C61746ELLU: // scn_Latn_IT
+        case 0xB85247424C61746ELLU: // sco_Latn_GB
+        case 0xBC524E5044657661LLU: // scp_Deva_NP
+        case 0xC85243414C61746ELLU: // scs_Latn_CA
+        case 0xCC524C414C616F6FLLU: // sct_Laoo_LA
+        case 0xD052494E54616B72LLU: // scu_Takr_IN
+        case 0xD4524E474C61746ELLU: // scv_Latn_NG
+        case 0xD8524E474C61746ELLU: // scw_Latn_NG
+        case 0xDC5249544772656BLLU: // scx_Grek_IT
+        case 0x7364504B41726162LLU: // sd_Arab_PK
+        case 0x7364494E44657661LLU: // sd_Deva_IN
+        case 0x7364494E4B686F6ALLU: // sd_Khoj_IN
+        case 0x7364494E53696E64LLU: // sd_Sind_IN
+        case 0x807249444C61746ELLU: // sda_Latn_ID
+        case 0x8472495141726162LLU: // sdb_Arab_IQ
+        case 0x887249544C61746ELLU: // sdc_Latn_IT
+        case 0x90724E474C61746ELLU: // sde_Latn_NG
+        case 0x9472495141726162LLU: // sdf_Arab_IQ
+        case 0x9872414641726162LLU: // sdg_Arab_AF
+        case 0x9C72495241726162LLU: // sdh_Arab_IR
+        case 0xA47243474C61746ELLU: // sdj_Latn_CG
+        case 0xA87250474C61746ELLU: // sdk_Latn_PG
+        case 0xB47249544C61746ELLU: // sdn_Latn_IT
+        case 0xB8724D594C61746ELLU: // sdo_Latn_MY
+        case 0xC07249444C61746ELLU: // sdq_Latn_ID
+        case 0xC472424442656E67LLU: // sdr_Beng_BD
+        case 0xC872544E41726162LLU: // sds_Arab_TN
+        case 0xD07249444C61746ELLU: // sdu_Latn_ID
+        case 0xDC724D594C61746ELLU: // sdx_Latn_MY
+        case 0x73654E4F4C61746ELLU: // se_Latn_NO
+        case 0x80924D594C61746ELLU: // sea_Latn_MY
+        case 0x849243494C61746ELLU: // seb_Latn_CI
+        case 0x889243414C61746ELLU: // sec_Latn_CA
+        case 0x8C92564E4C61746ELLU: // sed_Latn_VN
+        case 0x909255534C61746ELLU: // see_Latn_US
+        case 0x949243494C61746ELLU: // sef_Latn_CI
+        case 0x9892545A4C61746ELLU: // seg_Latn_TZ
+        case 0x9C924D5A4C61746ELLU: // seh_Latn_MZ
+        case 0xA0924D584C61746ELLU: // sei_Latn_MX
+        case 0xA49250474C61746ELLU: // sej_Latn_PG
+        case 0xA89243414C61746ELLU: // sek_Latn_CA
+        case 0xAC9252554379726CLLU: // sel_Cyrl_RU
+        case 0xB49242464C61746ELLU: // sen_Latn_BF
+        case 0xB89250474C61746ELLU: // seo_Latn_PG
+        case 0xBC9242464C61746ELLU: // sep_Latn_BF
+        case 0xC09242464C61746ELLU: // seq_Latn_BF
+        case 0xC49255534C61746ELLU: // ser_Latn_US
+        case 0xC8924D4C4C61746ELLU: // ses_Latn_ML
+        case 0xCC9249444C61746ELLU: // set_Latn_ID
+        case 0xD09249444C61746ELLU: // seu_Latn_ID
+        case 0xD49243494C61746ELLU: // sev_Latn_CI
+        case 0xD89250474C61746ELLU: // sew_Latn_PG
+        case 0xE09245434C61746ELLU: // sey_Latn_EC
+        case 0xE4924D4D4C61746ELLU: // sez_Latn_MM
+        case 0x90B250484C61746ELLU: // sfe_Latn_PH
+        case 0xB0B2434E506C7264LLU: // sfm_Plrd_CN
+        case 0xD8B247484C61746ELLU: // sfw_Latn_GH
+        case 0x736743464C61746ELLU: // sg_Latn_CF
+        case 0x80D249454F67616DLLU: // sga_Ogam_IE
+        case 0x84D250484C61746ELLU: // sgb_Latn_PH
+        case 0x88D24B454C61746ELLU: // sgc_Latn_KE
+        case 0x8CD250484C61746ELLU: // sgd_Latn_PH
+        case 0x90D249444C61746ELLU: // sge_Latn_ID
+        case 0x9CD2544A4379726CLLU: // sgh_Cyrl_TJ
+        case 0xA0D2434D4C61746ELLU: // sgi_Latn_CM
+        case 0xA4D2494E44657661LLU: // sgj_Deva_IN
+        case 0xB0D24B454C61746ELLU: // sgm_Latn_KE
+        case 0xBCD2494E4C61746ELLU: // sgp_Latn_IN
+        case 0xC4D2495241726162LLU: // sgr_Arab_IR
+        case 0xC8D24C544C61746ELLU: // sgs_Latn_LT
+        case 0xCCD2425454696274LLU: // sgt_Tibt_BT
+        case 0xD0D249444C61746ELLU: // sgu_Latn_ID
+        case 0xD8D2455445746869LLU: // sgw_Ethi_ET
+        case 0xE0D2414641726162LLU: // sgy_Arab_AF
+        case 0xE4D250474C61746ELLU: // sgz_Latn_PG
+        case 0x80F24E474C61746ELLU: // sha_Latn_NG
+        case 0x84F242524C61746ELLU: // shb_Latn_BR
+        case 0x88F243444C61746ELLU: // shc_Latn_CD
+        case 0x8CF2504B41726162LLU: // shd_Arab_PK
+        case 0x90F245544C61746ELLU: // she_Latn_ET
+        case 0x98F242574C61746ELLU: // shg_Latn_BW
+        case 0x9CF255534C61746ELLU: // shh_Latn_US
+        case 0xA0F24D4154666E67LLU: // shi_Tfng_MA
+        case 0xA4F253444C61746ELLU: // shj_Latn_SD
+        case 0xA8F253534C61746ELLU: // shk_Latn_SS
+        case 0xB0F2495241726162LLU: // shm_Arab_IR
+        case 0xB4F24D4D4D796D72LLU: // shn_Mymr_MM
+        case 0xB8F24E474C61746ELLU: // sho_Latn_NG
+        case 0xBCF250454C61746ELLU: // shp_Latn_PE
+        case 0xC0F25A4D4C61746ELLU: // shq_Latn_ZM
+        case 0xC4F243444C61746ELLU: // shr_Latn_CD
+        case 0xC8F243414C61746ELLU: // shs_Latn_CA
+        case 0xCCF255534C61746ELLU: // sht_Latn_US
+        case 0xD0F2544441726162LLU: // shu_Arab_TD
+        case 0xD4F24F4D41726162LLU: // shv_Arab_OM
+        case 0xD8F253444C61746ELLU: // shw_Latn_SD
+        case 0xE0F2445A4C61746ELLU: // shy_Latn_DZ
+        case 0xE4F24D4C4C61746ELLU: // shz_Latn_ML
+        case 0x73694C4B53696E68LLU: // si_Sinh_LK
+        case 0x811252554379726CLLU: // sia_Cyrl_RU
+        case 0x85124D594C61746ELLU: // sib_Latn_MY
+        case 0x8D1245544C61746ELLU: // sid_Latn_ET
+        case 0x91125A4D4C61746ELLU: // sie_Latn_ZM
+        case 0x951242464C61746ELLU: // sif_Latn_BF
+        case 0x991247484C61746ELLU: // sig_Latn_GH
+        case 0x9D124E434C61746ELLU: // sih_Latn_NC
+        case 0xA112494E4C61746ELLU: // sii_Latn_IN
+        case 0xA51250474C61746ELLU: // sij_Latn_PG
+        case 0xA91242524C61746ELLU: // sik_Latn_BR
+        case 0xAD1247484C61746ELLU: // sil_Latn_GH
+        case 0xB11250474C61746ELLU: // sim_Latn_PG
+        case 0xBD12494E54696274LLU: // sip_Tibt_IN
+        case 0xC11250474C61746ELLU: // siq_Latn_PG
+        case 0xC5124E474C61746ELLU: // sir_Latn_NG
+        case 0xC91255534C61746ELLU: // sis_Latn_US
+        case 0xD11250474C61746ELLU: // siu_Latn_PG
+        case 0xD51250474C61746ELLU: // siv_Latn_PG
+        case 0xD91250474C61746ELLU: // siw_Latn_PG
+        case 0xDD1250474C61746ELLU: // six_Latn_PG
+        case 0xE112495241726162LLU: // siy_Arab_IR
+        case 0xE512454741726162LLU: // siz_Arab_EG
+        case 0x8132434F4C61746ELLU: // sja_Latn_CO
+        case 0x853249444C61746ELLU: // sjb_Latn_ID
+        case 0x8D3252554379726CLLU: // sjd_Cyrl_RU
+        case 0x913253454C61746ELLU: // sje_Latn_SE
+        case 0x993254444C61746ELLU: // sjg_Latn_TD
+        case 0xAD32494E4C61746ELLU: // sjl_Latn_IN
+        case 0xB13250484C61746ELLU: // sjm_Latn_PH
+        case 0xBD32494E44657661LLU: // sjp_Deva_IN
+        case 0xC53250474C61746ELLU: // sjr_Latn_PG
+        case 0xCD3252554379726CLLU: // sjt_Cyrl_RU
+        case 0xD13253454C61746ELLU: // sju_Latn_SE
+        case 0xD93255534C61746ELLU: // sjw_Latn_US
+        case 0x736B534B4C61746ELLU: // sk_Latn_SK
+        case 0x815255534C61746ELLU: // ska_Latn_US
+        case 0x8552544854686169LLU: // skb_Thai_TH
+        case 0x895250474C61746ELLU: // skc_Latn_PG
+        case 0x8D5255534C61746ELLU: // skd_Latn_US
+        case 0x915256554C61746ELLU: // ske_Latn_VU
+        case 0x955242524C61746ELLU: // skf_Latn_BR
+        case 0x99524D474C61746ELLU: // skg_Latn_MG
+        case 0x9D5249444C61746ELLU: // skh_Latn_ID
+        case 0xA15249444C61746ELLU: // ski_Latn_ID
+        case 0xA5524E5044657661LLU: // skj_Deva_NP
+        case 0xB15250474C61746ELLU: // skm_Latn_PG
+        case 0xB55250484C61746ELLU: // skn_Latn_PH
+        case 0xB95249444C61746ELLU: // sko_Latn_ID
+        case 0xBD524D594C61746ELLU: // skp_Latn_MY
+        case 0xC15242464C61746ELLU: // skq_Latn_BF
+        case 0xC552504B41726162LLU: // skr_Arab_PK
+        case 0xC95250474C61746ELLU: // sks_Latn_PG
+        case 0xCD5243444C61746ELLU: // skt_Latn_CD
+        case 0xD15256554C61746ELLU: // sku_Latn_VU
+        case 0xD55249444C61746ELLU: // skv_Latn_ID
+        case 0xD95247594C61746ELLU: // skw_Latn_GY
+        case 0xDD5249444C61746ELLU: // skx_Latn_ID
+        case 0xE15253424C61746ELLU: // sky_Latn_SB
+        case 0xE55249444C61746ELLU: // skz_Latn_ID
+        case 0x736C53494C61746ELLU: // sl_Latn_SI
+        case 0x8972434F4C61746ELLU: // slc_Latn_CO
+        case 0x8D7242464C61746ELLU: // sld_Latn_BF
+        case 0x997249444C61746ELLU: // slg_Latn_ID
+        case 0x9D7255534C61746ELLU: // slh_Latn_US
+        case 0xA172504C4C61746ELLU: // sli_Latn_PL
+        case 0xA57242524C61746ELLU: // slj_Latn_BR
+        case 0xAD7250474C61746ELLU: // sll_Latn_PG
+        case 0xB17250484C61746ELLU: // slm_Latn_PH
+        case 0xB57255534C61746ELLU: // sln_Latn_US
+        case 0xBD7249444C61746ELLU: // slp_Latn_ID
+        case 0xC572434E4C61746ELLU: // slr_Latn_CN
+        case 0xD17249444C61746ELLU: // slu_Latn_ID
+        case 0xD97250474C61746ELLU: // slw_Latn_PG
+        case 0xDD7243444C61746ELLU: // slx_Latn_CD
+        case 0xE17249444C61746ELLU: // sly_Latn_ID
+        case 0xE57249444C61746ELLU: // slz_Latn_ID
+        case 0x736D57534C61746ELLU: // sm_Latn_WS
+        case 0x819253454C61746ELLU: // sma_Latn_SE
+        case 0x859250474C61746ELLU: // smb_Latn_PG
+        case 0x899250474C61746ELLU: // smc_Latn_PG
+        case 0x959250474C61746ELLU: // smf_Latn_PG
+        case 0x999250474C61746ELLU: // smg_Latn_PG
+        case 0x9D92434E59696969LLU: // smh_Yiii_CN
+        case 0xA59253454C61746ELLU: // smj_Latn_SE
+        case 0xA99250484C61746ELLU: // smk_Latn_PH
+        case 0xAD9250484C61746ELLU: // sml_Latn_PH
+        case 0xB59246494C61746ELLU: // smn_Latn_FI
+        case 0xBD92494C53616D72LLU: // smp_Samr_IL
+        case 0xC19250474C61746ELLU: // smq_Latn_PG
+        case 0xC59249444C61746ELLU: // smr_Latn_ID
+        case 0xC99246494C61746ELLU: // sms_Latn_FI
+        case 0xCD92494E4C61746ELLU: // smt_Latn_IN
+        case 0xD1924B484B686D72LLU: // smu_Khmr_KH
+        case 0xD99249444C61746ELLU: // smw_Latn_ID
+        case 0xDD9243444C61746ELLU: // smx_Latn_CD
+        case 0xE192495241726162LLU: // smy_Arab_IR
+        case 0xE59250474C61746ELLU: // smz_Latn_PG
+        case 0x736E5A574C61746ELLU: // sn_Latn_ZW
+        case 0x89B250474C61746ELLU: // snc_Latn_PG
+        case 0x91B24D594C61746ELLU: // sne_Latn_MY
+        case 0x95B2534E4C61746ELLU: // snf_Latn_SN
+        case 0x99B243444C61746ELLU: // sng_Latn_CD
+        case 0xA1B250454C61746ELLU: // sni_Latn_PE
+        case 0xA5B243464C61746ELLU: // snj_Latn_CF
+        case 0xA9B24D4C4C61746ELLU: // snk_Latn_ML
+        case 0xADB250484C61746ELLU: // snl_Latn_PH
+        case 0xB1B255474C61746ELLU: // snm_Latn_UG
+        case 0xB5B2434F4C61746ELLU: // snn_Latn_CO
+        case 0xB9B255534C61746ELLU: // sno_Latn_US
+        case 0xBDB250474C61746ELLU: // snp_Latn_PG
+        case 0xC1B247414C61746ELLU: // snq_Latn_GA
+        case 0xC5B250474C61746ELLU: // snr_Latn_PG
+        case 0xC9B256554C61746ELLU: // sns_Latn_VU
+        case 0xD1B249444C61746ELLU: // snu_Latn_ID
+        case 0xD5B24D594C61746ELLU: // snv_Latn_MY
+        case 0xD9B247484C61746ELLU: // snw_Latn_GH
+        case 0xDDB250474C61746ELLU: // snx_Latn_PG
+        case 0xE1B250474C61746ELLU: // sny_Latn_PG
+        case 0xE5B250474C61746ELLU: // snz_Latn_PG
+        case 0x736F534F4C61746ELLU: // so_Latn_SO
+        case 0x81D2544854617674LLU: // soa_Tavt_TH
+        case 0x85D249444C61746ELLU: // sob_Latn_ID
+        case 0x89D243444C61746ELLU: // soc_Latn_CD
+        case 0x8DD243444C61746ELLU: // sod_Latn_CD
+        case 0x91D243444C61746ELLU: // soe_Latn_CD
+        case 0x99D2555A536F6764LLU: // sog_Sogd_UZ
+        case 0xA1D24E5044657661LLU: // soi_Deva_NP
+        case 0xA9D254444C61746ELLU: // sok_Latn_TD
+        case 0xADD250474C61746ELLU: // sol_Latn_PG
+        case 0xB9D243444C61746ELLU: // soo_Latn_CD
+        case 0xBDD243444C61746ELLU: // sop_Latn_CD
+        case 0xC1D250474C61746ELLU: // soq_Latn_PG
+        case 0xC5D254444C61746ELLU: // sor_Latn_TD
+        case 0xC9D242464C61746ELLU: // sos_Latn_BF
+        case 0xD1D2544854686169LLU: // sou_Thai_TH
+        case 0xD5D250574C61746ELLU: // sov_Latn_PW
+        case 0xD9D250474C61746ELLU: // sow_Latn_PG
+        case 0xDDD2434D4C61746ELLU: // sox_Latn_CM
+        case 0xE1D2424A4C61746ELLU: // soy_Latn_BJ
+        case 0xE5D2545A4C61746ELLU: // soz_Latn_TZ
+        case 0x85F249444C61746ELLU: // spb_Latn_ID
+        case 0x89F256454C61746ELLU: // spc_Latn_VE
+        case 0x8DF250474C61746ELLU: // spd_Latn_PG
+        case 0x91F250474C61746ELLU: // spe_Latn_PG
+        case 0x99F24D594C61746ELLU: // spg_Latn_MY
+        case 0xA1F249444C61746ELLU: // spi_Latn_ID
+        case 0xA9F250474C61746ELLU: // spk_Latn_PG
+        case 0xADF250474C61746ELLU: // spl_Latn_PG
+        case 0xB1F250474C61746ELLU: // spm_Latn_PG
+        case 0xB5F250594C61746ELLU: // spn_Latn_PY
+        case 0xB9F255534C61746ELLU: // spo_Latn_US
+        case 0xBDF24D4C4C61746ELLU: // spp_Latn_ML
+        case 0xC1F250454C61746ELLU: // spq_Latn_PE
+        case 0xC5F249444C61746ELLU: // spr_Latn_ID
+        case 0xC9F250474C61746ELLU: // sps_Latn_PG
+        case 0xCDF2494E54696274LLU: // spt_Tibt_IN
+        case 0xD5F2494E4F727961LLU: // spv_Orya_IN
+        case 0x7371414C4C61746ELLU: // sq_Latn_AL
+        case 0x82124E474C61746ELLU: // sqa_Latn_NG
+        case 0x9E124E474C61746ELLU: // sqh_Latn_NG
+        case 0xB21243464C61746ELLU: // sqm_Latn_CF
+        case 0xBA12495241726162LLU: // sqo_Arab_IR
+        case 0xC2124C414C616F6FLLU: // sqq_Laoo_LA
+        case 0xCE12594541726162LLU: // sqt_Arab_YE
+        case 0xD21243414C61746ELLU: // squ_Latn_CA
+        case 0x737252534379726CLLU: // sr_Cyrl_RS
+        case 0x823250474C61746ELLU: // sra_Latn_PG
+        case 0x8632494E536F7261LLU: // srb_Sora_IN
+        case 0x923249444C61746ELLU: // sre_Latn_ID
+        case 0x963250474C61746ELLU: // srf_Latn_PG
+        case 0x9A3250484C61746ELLU: // srg_Latn_PH
+        case 0x9E32434E41726162LLU: // srh_Arab_CN
+        case 0xA232434F4C61746ELLU: // sri_Latn_CO
+        case 0xAA324D594C61746ELLU: // srk_Latn_MY
+        case 0xAE3249444C61746ELLU: // srl_Latn_ID
+        case 0xB23253524C61746ELLU: // srm_Latn_SR
+        case 0xB63253524C61746ELLU: // srn_Latn_SR
+        case 0xBA3249544C61746ELLU: // sro_Latn_IT
+        case 0xC232424F4C61746ELLU: // srq_Latn_BO
+        case 0xC632534E4C61746ELLU: // srr_Latn_SN
+        case 0xCA3243414C61746ELLU: // srs_Latn_CA
+        case 0xCE3249444C61746ELLU: // srt_Latn_ID
+        case 0xD23242524C61746ELLU: // sru_Latn_BR
+        case 0xD63250484C61746ELLU: // srv_Latn_PH
+        case 0xDA3249444C61746ELLU: // srw_Latn_ID
+        case 0xDE32494E44657661LLU: // srx_Deva_IN
+        case 0xE23250474C61746ELLU: // sry_Latn_PG
+        case 0xE632495241726162LLU: // srz_Arab_IR
+        case 0x73735A414C61746ELLU: // ss_Latn_ZA
+        case 0x865250484C61746ELLU: // ssb_Latn_PH
+        case 0x8A52545A4C61746ELLU: // ssc_Latn_TZ
+        case 0x8E5250474C61746ELLU: // ssd_Latn_PG
+        case 0x925250484C61746ELLU: // sse_Latn_PH
+        case 0x965254574C61746ELLU: // ssf_Latn_TW
+        case 0x9A5250474C61746ELLU: // ssg_Latn_PG
+        case 0x9E52414541726162LLU: // ssh_Arab_AE
+        case 0xA65250474C61746ELLU: // ssj_Latn_PG
+        case 0xAE5247484C61746ELLU: // ssl_Latn_GH
+        case 0xB2524D594C61746ELLU: // ssm_Latn_MY
+        case 0xB6524B454C61746ELLU: // ssn_Latn_KE
+        case 0xBA5250474C61746ELLU: // sso_Latn_PG
+        case 0xC25249444C61746ELLU: // ssq_Latn_ID
+        case 0xCA524C414C616F6FLLU: // sss_Laoo_LA
+        case 0xCE5250474C61746ELLU: // sst_Latn_PG
+        case 0xD25250474C61746ELLU: // ssu_Latn_PG
+        case 0xD65256554C61746ELLU: // ssv_Latn_VU
+        case 0xDE5250474C61746ELLU: // ssx_Latn_PG
+        case 0xE25245524C61746ELLU: // ssy_Latn_ER
+        case 0xE65250474C61746ELLU: // ssz_Latn_PG
+        case 0x73745A414C61746ELLU: // st_Latn_ZA
+        case 0x82725A4D4C61746ELLU: // sta_Latn_ZM
+        case 0x867250484C61746ELLU: // stb_Latn_PH
+        case 0x927249444C61746ELLU: // ste_Latn_ID
+        case 0x967250474C61746ELLU: // stf_Latn_PG
+        case 0x9A72564E4C61746ELLU: // stg_Latn_VN
+        case 0x9E7249454C61746ELLU: // sth_Latn_IE
+        case 0xA272564E4C61746ELLU: // sti_Latn_VN
+        case 0xA67242464C61746ELLU: // stj_Latn_BF
+        case 0xAA7250474C61746ELLU: // stk_Latn_PG
+        case 0xAE724E4C4C61746ELLU: // stl_Latn_NL
+        case 0xB27250474C61746ELLU: // stm_Latn_PG
+        case 0xB67253424C61746ELLU: // stn_Latn_SB
+        case 0xBA7243414C61746ELLU: // sto_Latn_CA
+        case 0xBE724D584C61746ELLU: // stp_Latn_MX
+        case 0xC27244454C61746ELLU: // stq_Latn_DE
+        case 0xC67243414C61746ELLU: // str_Latn_CA
+        case 0xCA72414641726162LLU: // sts_Arab_AF
+        case 0xCE72564E4C61746ELLU: // stt_Latn_VN
+        case 0xD672455445746869LLU: // stv_Ethi_ET
+        case 0xDA72464D4C61746ELLU: // stw_Latn_FM
+        case 0xE27252554379726CLLU: // sty_Cyrl_RU
+        case 0x737549444C61746ELLU: // su_Latn_ID
+        case 0x829250474C61746ELLU: // sua_Latn_PG
+        case 0x869243444C61746ELLU: // sub_Latn_CD
+        case 0x8A9250484C61746ELLU: // suc_Latn_PH
+        case 0x929250474C61746ELLU: // sue_Latn_PG
+        case 0x9A9250474C61746ELLU: // sug_Latn_PG
+        case 0xA29250474C61746ELLU: // sui_Latn_PG
+        case 0xA692545A4C61746ELLU: // suj_Latn_TZ
+        case 0xAA92545A4C61746ELLU: // suk_Latn_TZ
+        case 0xBA9250474C61746ELLU: // suo_Latn_PG
+        case 0xC29245544C61746ELLU: // suq_Latn_ET
+        case 0xC6924E474C61746ELLU: // sur_Latn_NG
+        case 0xCA92474E4C61746ELLU: // sus_Latn_GN
+        case 0xCE924E494C61746ELLU: // sut_Latn_NI
+        case 0xD692494E4C61746ELLU: // suv_Latn_IN
+        case 0xDA92545A4C61746ELLU: // suw_Latn_TZ
+        case 0xE29242524C61746ELLU: // suy_Latn_BR
+        case 0xE6924E5053756E75LLU: // suz_Sunu_NP
+        case 0x737653454C61746ELLU: // sv_Latn_SE
+        case 0x82B2474547656F72LLU: // sva_Geor_GE
+        case 0x86B250474C61746ELLU: // svb_Latn_PG
+        case 0x8AB256434C61746ELLU: // svc_Latn_VC
+        case 0x92B249444C61746ELLU: // sve_Latn_ID
+        case 0xB2B249544C61746ELLU: // svm_Latn_IT
+        case 0xCAB253424C61746ELLU: // svs_Latn_SB
+        case 0x7377545A4C61746ELLU: // sw_Latn_TZ
+        case 0x86D2595441726162LLU: // swb_Arab_YT
+        case 0x96D243444C61746ELLU: // swf_Latn_CD
+        case 0x9AD244454C61746ELLU: // swg_Latn_DE
+        case 0xA2D2434E48616E69LLU: // swi_Hani_CN
+        case 0xA6D247414C61746ELLU: // swj_Latn_GA
+        case 0xAAD24D574C61746ELLU: // swk_Latn_MW
+        case 0xB2D250474C61746ELLU: // swm_Latn_PG
+        case 0xBAD242524C61746ELLU: // swo_Latn_BR
+        case 0xBED250474C61746ELLU: // swp_Latn_PG
+        case 0xC2D2434D4C61746ELLU: // swq_Latn_CM
+        case 0xC6D249444C61746ELLU: // swr_Latn_ID
+        case 0xCAD249444C61746ELLU: // sws_Latn_ID
+        case 0xCED249444C61746ELLU: // swt_Latn_ID
+        case 0xD2D249444C61746ELLU: // swu_Latn_ID
+        case 0xD6D2494E44657661LLU: // swv_Deva_IN
+        case 0xDAD256554C61746ELLU: // sww_Latn_VU
+        case 0xDED242524C61746ELLU: // swx_Latn_BR
+        case 0xE2D254444C61746ELLU: // swy_Latn_TD
+        case 0x86F24B454C61746ELLU: // sxb_Latn_KE
+        case 0x92F247414C61746ELLU: // sxe_Latn_GA
+        case 0xB6F249444C61746ELLU: // sxn_Latn_ID
+        case 0xC6F254574C61746ELLU: // sxr_Latn_TW
+        case 0xCAF24E474C61746ELLU: // sxs_Latn_NG
+        case 0xD2F2444552756E72LLU: // sxu_Runr_DE
+        case 0xDAF2424A4C61746ELLU: // sxw_Latn_BJ
+        case 0x831249444C61746ELLU: // sya_Latn_ID
+        case 0x871250484C61746ELLU: // syb_Latn_PH
+        case 0x8B12545253797263LLU: // syc_Syrc_TR
+        case 0xA31247414C61746ELLU: // syi_Latn_GA
+        case 0xAB124E474C61746ELLU: // syk_Latn_NG
+        case 0xAF12424442656E67LLU: // syl_Beng_BD
+        case 0xB31242464C61746ELLU: // sym_Latn_BF
+        case 0xB712495253797263LLU: // syn_Syrc_IR
+        case 0xBB124B484C61746ELLU: // syo_Latn_KH
+        case 0xC712495153797263LLU: // syr_Syrc_IQ
+        case 0xCB1254444C61746ELLU: // sys_Latn_TD
+        case 0xDB124E5044657661LLU: // syw_Deva_NP
+        case 0xDF1247414C61746ELLU: // syx_Latn_GA
+        case 0x83324D594C61746ELLU: // sza_Latn_MY
+        case 0x873249444C61746ELLU: // szb_Latn_ID
+        case 0x8B324D594C61746ELLU: // szc_Latn_MY
+        case 0x9B3243444C61746ELLU: // szg_Latn_CD
+        case 0xAF32504C4C61746ELLU: // szl_Latn_PL
+        case 0xB73249444C61746ELLU: // szn_Latn_ID
+        case 0xBF3249444C61746ELLU: // szp_Latn_ID
+        case 0xD732434D4C61746ELLU: // szv_Latn_CM
+        case 0xDB3249444C61746ELLU: // szw_Latn_ID
+        case 0xE33254574C61746ELLU: // szy_Latn_TW
+        case 0x7461494E54616D6CLLU: // ta_Taml_IN
+        case 0x801355534C61746ELLU: // taa_Latn_US
+        case 0x841352554379726CLLU: // tab_Cyrl_RU
+        case 0x88134D584C61746ELLU: // tac_Latn_MX
+        case 0x8C1349444C61746ELLU: // tad_Latn_ID
+        case 0x901342524C61746ELLU: // tae_Latn_BR
+        case 0x941342524C61746ELLU: // taf_Latn_BR
+        case 0x981353444C61746ELLU: // tag_Latn_SD
+        case 0xA4134E5044657661LLU: // taj_Deva_NP
+        case 0xA8134E474C61746ELLU: // tak_Latn_NG
+        case 0xAC134E474C61746ELLU: // tal_Latn_NG
+        case 0xB4134E474C61746ELLU: // tan_Latn_NG
+        case 0xB81354574C61746ELLU: // tao_Latn_TW
+        case 0xBC1343444C61746ELLU: // tap_Latn_CD
+        case 0xC0134D4C4C61746ELLU: // taq_Latn_ML
+        case 0xC4134D584C61746ELLU: // tar_Latn_MX
+        case 0xC813564E4C61746ELLU: // tas_Latn_VN
+        case 0xD01355534C61746ELLU: // tau_Latn_US
+        case 0xD413434F4C61746ELLU: // tav_Latn_CO
+        case 0xD81350474C61746ELLU: // taw_Latn_PG
+        case 0xDC1354444C61746ELLU: // tax_Latn_TD
+        case 0xE01354574C61746ELLU: // tay_Latn_TW
+        case 0xE41353444C61746ELLU: // taz_Latn_SD
+        case 0x803342524C61746ELLU: // tba_Latn_BR
+        case 0x883350474C61746ELLU: // tbc_Latn_PG
+        case 0x8C3350474C61746ELLU: // tbd_Latn_PG
+        case 0x903353424C61746ELLU: // tbe_Latn_SB
+        case 0x943350474C61746ELLU: // tbf_Latn_PG
+        case 0x983350474C61746ELLU: // tbg_Latn_PG
+        case 0x9C3341554C61746ELLU: // tbh_Latn_AU
+        case 0xA03353444C61746ELLU: // tbi_Latn_SD
+        case 0xA43350474C61746ELLU: // tbj_Latn_PG
+        case 0xA833504854616762LLU: // tbk_Tagb_PH
+        case 0xAC3350484C61746ELLU: // tbl_Latn_PH
+        case 0xB03343444C61746ELLU: // tbm_Latn_CD
+        case 0xB433434F4C61746ELLU: // tbn_Latn_CO
+        case 0xB83350474C61746ELLU: // tbo_Latn_PG
+        case 0xBC3349444C61746ELLU: // tbp_Latn_ID
+        case 0xC83350474C61746ELLU: // tbs_Latn_PG
+        case 0xCC3343444C61746ELLU: // tbt_Latn_CD
+        case 0xD0334D584C61746ELLU: // tbu_Latn_MX
+        case 0xD43350474C61746ELLU: // tbv_Latn_PG
+        case 0xD83350484C61746ELLU: // tbw_Latn_PH
+        case 0xDC3350474C61746ELLU: // tbx_Latn_PG
+        case 0xE03349444C61746ELLU: // tby_Latn_ID
+        case 0xE433424A4C61746ELLU: // tbz_Latn_BJ
+        case 0x805342524C61746ELLU: // tca_Latn_BR
+        case 0x845355534C61746ELLU: // tcb_Latn_US
+        case 0x8853545A4C61746ELLU: // tcc_Latn_TZ
+        case 0x8C5347484C61746ELLU: // tcd_Latn_GH
+        case 0x905343414C61746ELLU: // tce_Latn_CA
+        case 0x94534D584C61746ELLU: // tcf_Latn_MX
+        case 0x985349444C61746ELLU: // tcg_Latn_ID
+        case 0x9C5354434C61746ELLU: // tch_Latn_TC
+        case 0xA05350474C61746ELLU: // tci_Latn_PG
+        case 0xA85347414C61746ELLU: // tck_Latn_GA
+        case 0xB05349444C61746ELLU: // tcm_Latn_ID
+        case 0xB4534E5054696274LLU: // tcn_Tibt_NP
+        case 0xB8534D4D4D796D72LLU: // tco_Mymr_MM
+        case 0xBC534D4D4C61746ELLU: // tcp_Latn_MM
+        case 0xC05349444C61746ELLU: // tcq_Latn_ID
+        case 0xC85341554C61746ELLU: // tcs_Latn_AU
+        case 0xD0534D584C61746ELLU: // tcu_Latn_MX
+        case 0xD8534D584C61746ELLU: // tcw_Latn_MX
+        case 0xDC53494E54616D6CLLU: // tcx_Taml_IN
+        case 0xE053494E4B6E6461LLU: // tcy_Knda_IN
+        case 0xE453494E4C61746ELLU: // tcz_Latn_IN
+        case 0x80734E4554666E67LLU: // tda_Tfng_NE
+        case 0x8473494E44657661LLU: // tdb_Deva_IN
+        case 0x8873434F4C61746ELLU: // tdc_Latn_CO
+        case 0x8C73434E54616C65LLU: // tdd_Tale_CN
+        case 0x90734D4C4C61746ELLU: // tde_Latn_ML
+        case 0x98734E5044657661LLU: // tdg_Deva_NP
+        case 0x9C734E5044657661LLU: // tdh_Deva_NP
+        case 0xA07349444C61746ELLU: // tdi_Latn_ID
+        case 0xA47349444C61746ELLU: // tdj_Latn_ID
+        case 0xA8734E474C61746ELLU: // tdk_Latn_NG
+        case 0xAC734E474C61746ELLU: // tdl_Latn_NG
+        case 0xB07347594C61746ELLU: // tdm_Latn_GY
+        case 0xB47349444C61746ELLU: // tdn_Latn_ID
+        case 0xB8734E474C61746ELLU: // tdo_Latn_NG
+        case 0xC0734E474C61746ELLU: // tdq_Latn_NG
+        case 0xC473564E4C61746ELLU: // tdr_Latn_VN
+        case 0xC87349444C61746ELLU: // tds_Latn_ID
+        case 0xCC73544C4C61746ELLU: // tdt_Latn_TL
+        case 0xD4734E474C61746ELLU: // tdv_Latn_NG
+        case 0xDC734D474C61746ELLU: // tdx_Latn_MG
+        case 0xE07350484C61746ELLU: // tdy_Latn_PH
+        case 0x7465494E54656C75LLU: // te_Telu_IN
+        case 0x80934D594C61746ELLU: // tea_Latn_MY
+        case 0x849345434C61746ELLU: // teb_Latn_EC
+        case 0x88934B454C61746ELLU: // tec_Latn_KE
+        case 0x8C9343494C61746ELLU: // ted_Latn_CI
+        case 0x90934D584C61746ELLU: // tee_Latn_MX
+        case 0x989347414C61746ELLU: // teg_Latn_GA
+        case 0x9C9341524C61746ELLU: // teh_Latn_AR
+        case 0xA09350474C61746ELLU: // tei_Latn_PG
+        case 0xA89343444C61746ELLU: // tek_Latn_CD
+        case 0xB093534C4C61746ELLU: // tem_Latn_SL
+        case 0xB493434F4C61746ELLU: // ten_Latn_CO
+        case 0xB89355474C61746ELLU: // teo_Latn_UG
+        case 0xBC934D584C61746ELLU: // tep_Latn_MX
+        case 0xC09353444C61746ELLU: // teq_Latn_SD
+        case 0xC49342524C61746ELLU: // ter_Latn_BR
+        case 0xC89349444A617661LLU: // tes_Java_ID
+        case 0xCC93544C4C61746ELLU: // tet_Latn_TL
+        case 0xD09355474C61746ELLU: // teu_Latn_UG
+        case 0xD49349444C61746ELLU: // tev_Latn_ID
+        case 0xD89355534C61746ELLU: // tew_Latn_US
+        case 0xDC9353534C61746ELLU: // tex_Latn_SS
+        case 0xE09353444C61746ELLU: // tey_Latn_SD
+        case 0xE4934E454C61746ELLU: // tez_Latn_NE
+        case 0xA0B3424A4C61746ELLU: // tfi_Latn_BJ
+        case 0xB4B355534C61746ELLU: // tfn_Latn_US
+        case 0xB8B349444C61746ELLU: // tfo_Latn_ID
+        case 0xC4B350414C61746ELLU: // tfr_Latn_PA
+        case 0xCCB349444C61746ELLU: // tft_Latn_ID
+        case 0x7467504B41726162LLU: // tg_Arab_PK
+        case 0x7467544A4379726CLLU: // tg_Cyrl_TJ
+        case 0x80D34B454C61746ELLU: // tga_Latn_KE
+        case 0x84D34D594C61746ELLU: // tgb_Latn_MY
+        case 0x88D350474C61746ELLU: // tgc_Latn_PG
+        case 0x8CD34E474C61746ELLU: // tgd_Latn_NG
+        case 0x90D34E5044657661LLU: // tge_Deva_NP
+        case 0x94D3425454696274LLU: // tgf_Tibt_BT
+        case 0x9CD354544C61746ELLU: // tgh_Latn_TT
+        case 0xA0D350474C61746ELLU: // tgi_Latn_PG
+        case 0xA4D3494E4C61746ELLU: // tgj_Latn_IN
+        case 0xB4D350484C61746ELLU: // tgn_Latn_PH
+        case 0xB8D350474C61746ELLU: // tgo_Latn_PG
+        case 0xBCD356554C61746ELLU: // tgp_Latn_VU
+        case 0xC0D34D594C61746ELLU: // tgq_Latn_MY
+        case 0xC8D356554C61746ELLU: // tgs_Latn_VU
+        case 0xCCD350484C61746ELLU: // tgt_Latn_PH
+        case 0xD0D350474C61746ELLU: // tgu_Latn_PG
+        case 0xD4D342524C61746ELLU: // tgv_Latn_BR
+        case 0xD8D343494C61746ELLU: // tgw_Latn_CI
+        case 0xDCD343414C61746ELLU: // tgx_Latn_CA
+        case 0xE0D353534C61746ELLU: // tgy_Latn_SS
+        case 0xE4D341554C61746ELLU: // tgz_Latn_AU
+        case 0x7468544854686169LLU: // th_Thai_TH
+        case 0x8CF341554C61746ELLU: // thd_Latn_AU
+        case 0x90F34E5044657661LLU: // the_Deva_NP
+        case 0x94F34E5044657661LLU: // thf_Deva_NP
+        case 0x9CF34D584C61746ELLU: // thh_Latn_MX
+        case 0xA0F34C4154616C65LLU: // thi_Tale_LA
+        case 0xA8F34B454C61746ELLU: // thk_Latn_KE
+        case 0xACF34E5044657661LLU: // thl_Deva_NP
+        case 0xB0F3544854686169LLU: // thm_Thai_TH
+        case 0xBCF343414C61746ELLU: // thp_Latn_CA
+        case 0xC0F34E5044657661LLU: // thq_Deva_NP
+        case 0xC4F34E5044657661LLU: // thr_Deva_NP
+        case 0xC8F34E5044657661LLU: // ths_Deva_NP
+        case 0xCCF343414C61746ELLU: // tht_Latn_CA
+        case 0xD0F353534C61746ELLU: // thu_Latn_SS
+        case 0xD4F3445A4C61746ELLU: // thv_Latn_DZ
+        case 0xE0F34E474C61746ELLU: // thy_Latn_NG
+        case 0xE4F34E454C61746ELLU: // thz_Latn_NE
+        case 0x7469455445746869LLU: // ti_Ethi_ET
+        case 0x891353444C61746ELLU: // tic_Latn_SD
+        case 0x951350474C61746ELLU: // tif_Latn_PG
+        case 0x9913455245746869LLU: // tig_Ethi_ER
+        case 0x9D134D594C61746ELLU: // tih_Latn_MY
+        case 0xA11343444C61746ELLU: // tii_Latn_CD
+        case 0xA5134E5044657661LLU: // tij_Deva_NP
+        case 0xA913434D4C61746ELLU: // tik_Latn_CM
+        case 0xAD1355534C61746ELLU: // til_Latn_US
+        case 0xB11350474C61746ELLU: // tim_Latn_PG
+        case 0xB51352554379726CLLU: // tin_Cyrl_RU
+        case 0xB91350474C61746ELLU: // tio_Latn_PG
+        case 0xBD1349444C61746ELLU: // tip_Latn_ID
+        case 0xC11342464C61746ELLU: // tiq_Latn_BF
+        case 0xC91350484C61746ELLU: // tis_Latn_PH
+        case 0xCD13434F4C61746ELLU: // tit_Latn_CO
+        case 0xD11350484C61746ELLU: // tiu_Latn_PH
+        case 0xD5134E474C61746ELLU: // tiv_Latn_NG
+        case 0xD91341554C61746ELLU: // tiw_Latn_AU
+        case 0xDD1355534C61746ELLU: // tix_Latn_US
+        case 0xE11350484C61746ELLU: // tiy_Latn_PH
+        case 0x81334C524C61746ELLU: // tja_Latn_LR
+        case 0x993349444C61746ELLU: // tjg_Latn_ID
+        case 0xA133434E4C61746ELLU: // tji_Latn_CN
+        case 0xA53341554C61746ELLU: // tjj_Latn_AU
+        case 0xAD334D4D4D796D72LLU: // tjl_Mymr_MM
+        case 0xB53343494C61746ELLU: // tjn_Latn_CI
+        case 0xB933445A41726162LLU: // tjo_Arab_DZ
+        case 0xBD3341554C61746ELLU: // tjp_Latn_AU
+        case 0xC933434E4C61746ELLU: // tjs_Latn_CN
+        case 0xD13341554C61746ELLU: // tju_Latn_AU
+        case 0xD93341554C61746ELLU: // tjw_Latn_AU
+        case 0x746B544D4C61746ELLU: // tk_Latn_TM
+        case 0x815342524C61746ELLU: // tka_Latn_BR
+        case 0x8553494E44657661LLU: // tkb_Deva_IN
+        case 0x8D53544C4C61746ELLU: // tkd_Latn_TL
+        case 0x91534D5A4C61746ELLU: // tke_Latn_MZ
+        case 0x955342524C61746ELLU: // tkf_Latn_BR
+        case 0x99534D474C61746ELLU: // tkg_Latn_MG
+        case 0xAD53544B4C61746ELLU: // tkl_Latn_TK
+        case 0xBD5353424C61746ELLU: // tkp_Latn_SB
+        case 0xC1534E474C61746ELLU: // tkq_Latn_NG
+        case 0xC553415A4C61746ELLU: // tkr_Latn_AZ
+        case 0xC953495241726162LLU: // tks_Arab_IR
+        case 0xCD534E5044657661LLU: // tkt_Deva_NP
+        case 0xD1534D584C61746ELLU: // tku_Latn_MX
+        case 0xD55350474C61746ELLU: // tkv_Latn_PG
+        case 0xD95353424C61746ELLU: // tkw_Latn_SB
+        case 0xDD5349444C61746ELLU: // tkx_Latn_ID
+        case 0xE553564E4C61746ELLU: // tkz_Latn_VN
+        case 0x746C50484C61746ELLU: // tl_Latn_PH
+        case 0x81734D584C61746ELLU: // tla_Latn_MX
+        case 0x857349444C61746ELLU: // tlb_Latn_ID
+        case 0x89734D584C61746ELLU: // tlc_Latn_MX
+        case 0x8D7349444C61746ELLU: // tld_Latn_ID
+        case 0x957350474C61746ELLU: // tlf_Latn_PG
+        case 0x997349444C61746ELLU: // tlg_Latn_ID
+        case 0xA17355534C61746ELLU: // tli_Latn_US
+        case 0xA57355474C61746ELLU: // tlj_Latn_UG
+        case 0xA97349444C61746ELLU: // tlk_Latn_ID
+        case 0xAD7343444C61746ELLU: // tll_Latn_CD
+        case 0xB17356554C61746ELLU: // tlm_Latn_VU
+        case 0xB57349444C61746ELLU: // tln_Latn_ID
+        case 0xBD734D584C61746ELLU: // tlp_Latn_MX
+        case 0xC1734D4D4C61746ELLU: // tlq_Latn_MM
+        case 0xC57353424C61746ELLU: // tlr_Latn_SB
+        case 0xC97356554C61746ELLU: // tls_Latn_VU
+        case 0xCD7349444C61746ELLU: // tlt_Latn_ID
+        case 0xD17349444C61746ELLU: // tlu_Latn_ID
+        case 0xD57349444C61746ELLU: // tlv_Latn_ID
+        case 0xDD7350474C61746ELLU: // tlx_Latn_PG
+        case 0xE173415A4C61746ELLU: // tly_Latn_AZ
+        case 0x819354444C61746ELLU: // tma_Latn_TD
+        case 0x859356554C61746ELLU: // tmb_Latn_VU
+        case 0x899354444C61746ELLU: // tmc_Latn_TD
+        case 0x8D9350474C61746ELLU: // tmd_Latn_PG
+        case 0x919342524C61746ELLU: // tme_Latn_BR
+        case 0x959350594C61746ELLU: // tmf_Latn_PY
+        case 0x999349444C61746ELLU: // tmg_Latn_ID
+        case 0x9D934E454C61746ELLU: // tmh_Latn_NE
+        case 0xA19356554C61746ELLU: // tmi_Latn_VU
+        case 0xA59349444C61746ELLU: // tmj_Latn_ID
+        case 0xAD9349444C61746ELLU: // tml_Latn_ID
+        case 0xB193564E4C61746ELLU: // tmm_Latn_VN
+        case 0xB59349444C61746ELLU: // tmn_Latn_ID
+        case 0xB9934D594C61746ELLU: // tmo_Latn_MY
+        case 0xC19350474C61746ELLU: // tmq_Latn_PG
+        case 0xC593494C53797263LLU: // tmr_Syrc_IL
+        case 0xCD9356554C61746ELLU: // tmt_Latn_VU
+        case 0xD19349444C61746ELLU: // tmu_Latn_ID
+        case 0xD59343444C61746ELLU: // tmv_Latn_CD
+        case 0xD9934D594C61746ELLU: // tmw_Latn_MY
+        case 0xE19350474C61746ELLU: // tmy_Latn_PG
+        case 0xE59356454C61746ELLU: // tmz_Latn_VE
+        case 0x746E5A414C61746ELLU: // tn_Latn_ZA
+        case 0x81B3424F4C61746ELLU: // tna_Latn_BO
+        case 0x85B3434F4C61746ELLU: // tnb_Latn_CO
+        case 0x89B3434F4C61746ELLU: // tnc_Latn_CO
+        case 0x8DB3434F4C61746ELLU: // tnd_Latn_CO
+        case 0x99B354444C61746ELLU: // tng_Latn_TD
+        case 0x9DB350474C61746ELLU: // tnh_Latn_PG
+        case 0xA1B349444C61746ELLU: // tni_Latn_ID
+        case 0xA9B356554C61746ELLU: // tnk_Latn_VU
+        case 0xADB356554C61746ELLU: // tnl_Latn_VU
+        case 0xB1B349444C61746ELLU: // tnm_Latn_ID
+        case 0xB5B356554C61746ELLU: // tnn_Latn_VU
+        case 0xB9B3424F4C61746ELLU: // tno_Latn_BO
+        case 0xBDB356554C61746ELLU: // tnp_Latn_VU
+        case 0xC1B350524C61746ELLU: // tnq_Latn_PR
+        case 0xC5B3534E4C61746ELLU: // tnr_Latn_SN
+        case 0xC9B350474C61746ELLU: // tns_Latn_PG
+        case 0xCDB349444C61746ELLU: // tnt_Latn_ID
+        case 0xD5B3424443616B6DLLU: // tnv_Cakm_BD
+        case 0xD9B349444C61746ELLU: // tnw_Latn_ID
+        case 0xDDB353424C61746ELLU: // tnx_Latn_SB
+        case 0xE1B3545A4C61746ELLU: // tny_Latn_TZ
+        case 0x746F544F4C61746ELLU: // to_Latn_TO
+        case 0x85D341524C61746ELLU: // tob_Latn_AR
+        case 0x89D34D584C61746ELLU: // toc_Latn_MX
+        case 0x8DD3474E4C61746ELLU: // tod_Latn_GN
+        case 0x95D350474C61746ELLU: // tof_Latn_PG
+        case 0x99D34D574C61746ELLU: // tog_Latn_MW
+        case 0x9DD34D5A4C61746ELLU: // toh_Latn_MZ
+        case 0xA1D35A4D4C61746ELLU: // toi_Latn_ZM
+        case 0xA5D34D584C61746ELLU: // toj_Latn_MX
+        case 0xADD355534C61746ELLU: // tol_Latn_US
+        case 0xB1D349444C61746ELLU: // tom_Latn_ID
+        case 0xB9D34D584C61746ELLU: // too_Latn_MX
+        case 0xBDD34D584C61746ELLU: // top_Latn_MX
+        case 0xC1D353534C61746ELLU: // toq_Latn_SS
+        case 0xC5D343444C61746ELLU: // tor_Latn_CD
+        case 0xC9D34D584C61746ELLU: // tos_Latn_MX
+        case 0xD1D3564E4C61746ELLU: // tou_Latn_VN
+        case 0xD5D3495241726162LLU: // tov_Arab_IR
+        case 0xD9D355534C61746ELLU: // tow_Latn_US
+        case 0xDDD350574C61746ELLU: // tox_Latn_PW
+        case 0xE1D349444C61746ELLU: // toy_Latn_ID
+        case 0xE5D3434D4C61746ELLU: // toz_Latn_CM
+        case 0x81F350474C61746ELLU: // tpa_Latn_PG
+        case 0x89F34D584C61746ELLU: // tpc_Latn_MX
+        case 0x91F342444C61746ELLU: // tpe_Latn_BD
+        case 0x95F349444C61746ELLU: // tpf_Latn_ID
+        case 0x99F349444C61746ELLU: // tpg_Latn_ID
+        case 0xA1F350474C61746ELLU: // tpi_Latn_PG
+        case 0xA5F350594C61746ELLU: // tpj_Latn_PY
+        case 0xA9F342524C61746ELLU: // tpk_Latn_BR
+        case 0xADF34D584C61746ELLU: // tpl_Latn_MX
+        case 0xB1F347484C61746ELLU: // tpm_Latn_GH
+        case 0xB5F342524C61746ELLU: // tpn_Latn_BR
+        case 0xBDF34D584C61746ELLU: // tpp_Latn_MX
+        case 0xC5F342524C61746ELLU: // tpr_Latn_BR
+        case 0xCDF34D584C61746ELLU: // tpt_Latn_MX
+        case 0xD1F34B484B686D72LLU: // tpu_Khmr_KH
+        case 0xD5F34D504C61746ELLU: // tpv_Latn_MP
+        case 0xDDF34D584C61746ELLU: // tpx_Latn_MX
+        case 0xE1F342524C61746ELLU: // tpy_Latn_BR
+        case 0xE5F350474C61746ELLU: // tpz_Latn_PG
+        case 0x861342524C61746ELLU: // tqb_Latn_BR
+        case 0xAE1356554C61746ELLU: // tql_Latn_VU
+        case 0xB21350474C61746ELLU: // tqm_Latn_PG
+        case 0xB61355534C61746ELLU: // tqn_Latn_US
+        case 0xBA1350474C61746ELLU: // tqo_Latn_PG
+        case 0xBE1350474C61746ELLU: // tqp_Latn_PG
+        case 0xCE134D584C61746ELLU: // tqt_Latn_MX
+        case 0xD21353424C61746ELLU: // tqu_Latn_SB
+        case 0xDA1355534C61746ELLU: // tqw_Latn_US
+        case 0x747254524C61746ELLU: // tr_Latn_TR
+        case 0x8233414641726162LLU: // tra_Arab_AF
+        case 0x863350474C61746ELLU: // trb_Latn_PG
+        case 0x8A334D584C61746ELLU: // trc_Latn_MX
+        case 0x923349444C61746ELLU: // tre_Latn_ID
+        case 0x963354544C61746ELLU: // trf_Latn_TT
+        case 0x9A33494C48656272LLU: // trg_Hebr_IL
+        case 0x9E3350474C61746ELLU: // trh_Latn_PG
+        case 0xA23353524C61746ELLU: // tri_Latn_SR
+        case 0xA63354444C61746ELLU: // trj_Latn_TD
+        case 0xAE3347424C61746ELLU: // trl_Latn_GB
+        case 0xB233414641726162LLU: // trm_Arab_AF
+        case 0xB633424F4C61746ELLU: // trn_Latn_BO
+        case 0xBA33494E4C61746ELLU: // tro_Latn_IN
+        case 0xBE33494E4C61746ELLU: // trp_Latn_IN
+        case 0xC2334D584C61746ELLU: // trq_Latn_MX
+        case 0xC63350454C61746ELLU: // trr_Latn_PE
+        case 0xCA334D584C61746ELLU: // trs_Latn_MX
+        case 0xCE3349444C61746ELLU: // trt_Latn_ID
+        case 0xD23354524C61746ELLU: // tru_Latn_TR
+        case 0xD63354574C61746ELLU: // trv_Latn_TW
+        case 0xDA33504B41726162LLU: // trw_Arab_PK
+        case 0xDE334D594C61746ELLU: // trx_Latn_MY
+        case 0xE233494E4C61746ELLU: // try_Latn_IN
+        case 0xE63342524C61746ELLU: // trz_Latn_BR
+        case 0x74735A414C61746ELLU: // ts_Latn_ZA
+        case 0x825343474C61746ELLU: // tsa_Latn_CG
+        case 0x865345544C61746ELLU: // tsb_Latn_ET
+        case 0x8A534D5A4C61746ELLU: // tsc_Latn_MZ
+        case 0x8E5347524772656BLLU: // tsd_Grek_GR
+        case 0x9A5350484C61746ELLU: // tsg_Latn_PH
+        case 0x9E53434D4C61746ELLU: // tsh_Latn_CM
+        case 0xA25343414C61746ELLU: // tsi_Latn_CA
+        case 0xA653425454696274LLU: // tsj_Tibt_BT
+        case 0xAE53564E4C61746ELLU: // tsl_Latn_VN
+        case 0xBE5342464C61746ELLU: // tsp_Latn_BF
+        case 0xC65356554C61746ELLU: // tsr_Latn_VU
+        case 0xCE534D4C4C61746ELLU: // tst_Latn_ML
+        case 0xD25354574C61746ELLU: // tsu_Latn_TW
+        case 0xD65347414C61746ELLU: // tsv_Latn_GA
+        case 0xDA534E474C61746ELLU: // tsw_Latn_NG
+        case 0xDE5350474C61746ELLU: // tsx_Latn_PG
+        case 0xE6534D584C61746ELLU: // tsz_Latn_MX
+        case 0x747452554379726CLLU: // tt_Cyrl_RU
+        case 0x86734E474C61746ELLU: // ttb_Latn_NG
+        case 0x8A7347544C61746ELLU: // ttc_Latn_GT
+        case 0x8E7350474C61746ELLU: // ttd_Latn_PG
+        case 0x927350474C61746ELLU: // tte_Latn_PG
+        case 0x9673434D4C61746ELLU: // ttf_Latn_CM
+        case 0x9E734C414C616F6FLLU: // tth_Laoo_LA
+        case 0xA27349444C61746ELLU: // tti_Latn_ID
+        case 0xA67355474C61746ELLU: // ttj_Latn_UG
+        case 0xAA73434F4C61746ELLU: // ttk_Latn_CO
+        case 0xAE735A4D4C61746ELLU: // ttl_Latn_ZM
+        case 0xB27343414C61746ELLU: // ttm_Latn_CA
+        case 0xB67349444C61746ELLU: // ttn_Latn_ID
+        case 0xBA734C414C616F6FLLU: // tto_Laoo_LA
+        case 0xBE7349444C61746ELLU: // ttp_Latn_ID
+        case 0xC6734E474C61746ELLU: // ttr_Latn_NG
+        case 0xCA73544854686169LLU: // tts_Thai_TH
+        case 0xCE73415A4C61746ELLU: // ttt_Latn_AZ
+        case 0xD27350474C61746ELLU: // ttu_Latn_PG
+        case 0xD67350474C61746ELLU: // ttv_Latn_PG
+        case 0xDA734D594C61746ELLU: // ttw_Latn_MY
+        case 0xE27349444C61746ELLU: // tty_Latn_ID
+        case 0xE6734E5044657661LLU: // ttz_Deva_NP
+        case 0x829350474C61746ELLU: // tua_Latn_PG
+        case 0x869355534C61746ELLU: // tub_Latn_US
+        case 0x8A9350474C61746ELLU: // tuc_Latn_PG
+        case 0x8E9342524C61746ELLU: // tud_Latn_BR
+        case 0x9293434F4C61746ELLU: // tue_Latn_CO
+        case 0x9693434F4C61746ELLU: // tuf_Latn_CO
+        case 0x9A9354444C61746ELLU: // tug_Latn_TD
+        case 0x9E9350474C61746ELLU: // tuh_Latn_PG
+        case 0xA293434D4C61746ELLU: // tui_Latn_CM
+        case 0xA69349444C61746ELLU: // tuj_Latn_ID
+        case 0xAE934E474C61746ELLU: // tul_Latn_NG
+        case 0xB2934D574C61746ELLU: // tum_Latn_MW
+        case 0xB69355534C61746ELLU: // tun_Latn_US
+        case 0xBA9342524C61746ELLU: // tuo_Latn_BR
+        case 0xC29354444C61746ELLU: // tuq_Latn_TD
+        case 0xCA9343414C61746ELLU: // tus_Latn_CA
+        case 0xD29355534C61746ELLU: // tuu_Latn_US
+        case 0xD6934B454C61746ELLU: // tuv_Latn_KE
+        case 0xDE9342524C61746ELLU: // tux_Latn_BR
+        case 0xE2934B454C61746ELLU: // tuy_Latn_KE
+        case 0xE69342464C61746ELLU: // tuz_Latn_BF
+        case 0x82B353424C61746ELLU: // tva_Latn_SB
+        case 0x8EB34E474C61746ELLU: // tvd_Latn_NG
+        case 0x92B349444C61746ELLU: // tve_Latn_ID
+        case 0xA2B34E474C61746ELLU: // tvi_Latn_NG
+        case 0xAAB356554C61746ELLU: // tvk_Latn_VU
+        case 0xAEB354564C61746ELLU: // tvl_Latn_TV
+        case 0xB2B349444C61746ELLU: // tvm_Latn_ID
+        case 0xB6B34D4D4D796D72LLU: // tvn_Mymr_MM
+        case 0xBAB349444C61746ELLU: // tvo_Latn_ID
+        case 0xCAB34B454C61746ELLU: // tvs_Latn_KE
+        case 0xCEB3494E4C61746ELLU: // tvt_Latn_IN
+        case 0xD2B3434D4C61746ELLU: // tvu_Latn_CM
+        case 0xDAB349444C61746ELLU: // tvw_Latn_ID
+        case 0xDEB354574C61746ELLU: // tvx_Latn_TW
+        case 0x82D355534C61746ELLU: // twa_Latn_US
+        case 0x86D350484C61746ELLU: // twb_Latn_PH
+        case 0x8ED34E4C4C61746ELLU: // twd_Latn_NL
+        case 0x92D349444C61746ELLU: // twe_Latn_ID
+        case 0x96D355534C61746ELLU: // twf_Latn_US
+        case 0x9AD349444C61746ELLU: // twg_Latn_ID
+        case 0x9ED3564E4C61746ELLU: // twh_Latn_VN
+        case 0xAED34D5A4C61746ELLU: // twl_Latn_MZ
+        case 0xB2D3494E44657661LLU: // twm_Deva_IN
+        case 0xB6D3434D4C61746ELLU: // twn_Latn_CM
+        case 0xBAD342574C61746ELLU: // two_Latn_BW
+        case 0xBED350474C61746ELLU: // twp_Latn_PG
+        case 0xC2D34E454C61746ELLU: // twq_Latn_NE
+        case 0xC6D34D584C61746ELLU: // twr_Latn_MX
+        case 0xCED342524C61746ELLU: // twt_Latn_BR
+        case 0xD2D349444C61746ELLU: // twu_Latn_ID
+        case 0xDAD350474C61746ELLU: // tww_Latn_PG
+        case 0xDED34D5A4C61746ELLU: // twx_Latn_MZ
+        case 0xE2D349444C61746ELLU: // twy_Latn_ID
+        case 0x82F34D594C61746ELLU: // txa_Latn_MY
+        case 0x92F349444C61746ELLU: // txe_Latn_ID
+        case 0x9AF3434E54616E67LLU: // txg_Tang_CN
+        case 0xA2F342524C61746ELLU: // txi_Latn_BR
+        case 0xA6F34E474C61746ELLU: // txj_Latn_NG
+        case 0xB2F349444C61746ELLU: // txm_Latn_ID
+        case 0xB6F349444C61746ELLU: // txn_Latn_ID
+        case 0xBAF3494E546F746FLLU: // txo_Toto_IN
+        case 0xC2F349444C61746ELLU: // txq_Latn_ID
+        case 0xCAF349444C61746ELLU: // txs_Latn_ID
+        case 0xCEF349444C61746ELLU: // txt_Latn_ID
+        case 0xD2F342524C61746ELLU: // txu_Latn_BR
+        case 0xDEF34D594C61746ELLU: // txx_Latn_MY
+        case 0xE2F34D474C61746ELLU: // txy_Latn_MG
+        case 0x747950464C61746ELLU: // ty_Latn_PF
+        case 0x831350474C61746ELLU: // tya_Latn_PG
+        case 0x93134E474C61746ELLU: // tye_Latn_NG
+        case 0x9F13564E4C61746ELLU: // tyh_Latn_VN
+        case 0xA31343474C61746ELLU: // tyi_Latn_CG
+        case 0xA713564E4C61746ELLU: // tyj_Latn_VN
+        case 0xAF13564E4C61746ELLU: // tyl_Latn_VN
+        case 0xB71349444C61746ELLU: // tyn_Latn_ID
+        case 0xBF1341554C61746ELLU: // typ_Latn_AU
+        case 0xC713564E54617674LLU: // tyr_Tavt_VN
+        case 0xCB13564E4C61746ELLU: // tys_Latn_VN
+        case 0xCF13564E4C61746ELLU: // tyt_Latn_VN
+        case 0xD31342574C61746ELLU: // tyu_Latn_BW
+        case 0xD71352554379726CLLU: // tyv_Cyrl_RU
+        case 0xDF1343474C61746ELLU: // tyx_Latn_CG
+        case 0xE3134E474C61746ELLU: // tyy_Latn_NG
+        case 0xE713564E4C61746ELLU: // tyz_Latn_VN
+        case 0x9F334D584C61746ELLU: // tzh_Latn_MX
+        case 0xA73347544C61746ELLU: // tzj_Latn_GT
+        case 0xB3334D414C61746ELLU: // tzm_Latn_MA
+        case 0xB73349444C61746ELLU: // tzn_Latn_ID
+        case 0xBB334D584C61746ELLU: // tzo_Latn_MX
+        case 0xDF3350474C61746ELLU: // tzx_Latn_PG
+        case 0xB01442524C61746ELLU: // uam_Latn_BR
+        case 0xC41450474C61746ELLU: // uar_Latn_PG
+        case 0x80344E474C61746ELLU: // uba_Latn_NG
+        case 0xA03454444C61746ELLU: // ubi_Latn_TD
+        case 0xAC3450484C61746ELLU: // ubl_Latn_PH
+        case 0xC43450474C61746ELLU: // ubr_Latn_PG
+        case 0xD03450474C61746ELLU: // ubu_Latn_PG
+        case 0xE03454524C61746ELLU: // uby_Latn_TR
+        case 0x80744E474C61746ELLU: // uda_Latn_NG
+        case 0x907452554379726CLLU: // ude_Cyrl_RU
+        case 0x9874494E4D6C796DLLU: // udg_Mlym_IN
+        case 0xA07452554379726CLLU: // udi_Cyrl_RU
+        case 0xA47449444C61746ELLU: // udj_Latn_ID
+        case 0xAC74434D4C61746ELLU: // udl_Latn_CM
+        case 0xB07452554379726CLLU: // udm_Cyrl_RU
+        case 0xD07453444C61746ELLU: // udu_Latn_SD
+        case 0xC89449444C61746ELLU: // ues_Latn_ID
+        case 0xA0B450474C61746ELLU: // ufi_Latn_PG
+        case 0x7567434E41726162LLU: // ug_Arab_CN
+        case 0x75674B5A4379726CLLU: // ug_Cyrl_KZ
+        case 0x80D4535955676172LLU: // uga_Ugar_SY
+        case 0x84D441554C61746ELLU: // ugb_Latn_AU
+        case 0x90D453424C61746ELLU: // uge_Latn_SB
+        case 0x9CD452554379726CLLU: // ugh_Cyrl_RU
+        case 0xB8D4544854686169LLU: // ugo_Thai_TH
+        case 0x80F44E474C61746ELLU: // uha_Latn_NG
+        case 0xB4F449444C61746ELLU: // uhn_Latn_ID
+        case 0xC91450474C61746ELLU: // uis_Latn_PG
+        case 0xD514434D4C61746ELLU: // uiv_Latn_CM
+        case 0xA1344E474C61746ELLU: // uji_Latn_NG
+        case 0x756B55414379726CLLU: // uk_Cyrl_UA
+        case 0x815449444C61746ELLU: // uka_Latn_ID
+        case 0x995450474C61746ELLU: // ukg_Latn_PG
+        case 0x9D5443464C61746ELLU: // ukh_Latn_CF
+        case 0xA154494E4F727961LLU: // uki_Orya_IN
+        case 0xA9544D4D4C61746ELLU: // ukk_Latn_MM
+        case 0xBD544E474C61746ELLU: // ukp_Latn_NG
+        case 0xC1544E474C61746ELLU: // ukq_Latn_NG
+        case 0xD1544E474C61746ELLU: // uku_Latn_NG
+        case 0xD55453534C61746ELLU: // ukv_Latn_SS
+        case 0xD9544E474C61746ELLU: // ukw_Latn_NG
+        case 0xE15441554C61746ELLU: // uky_Latn_AU
+        case 0x81744E474C61746ELLU: // ula_Latn_NG
+        case 0x85744E474C61746ELLU: // ulb_Latn_NG
+        case 0x897452554379726CLLU: // ulc_Cyrl_RU
+        case 0x917441524C61746ELLU: // ule_Latn_AR
+        case 0x957449444C61746ELLU: // ulf_Latn_ID
+        case 0xA174464D4C61746ELLU: // uli_Latn_FM
+        case 0xA97441554C61746ELLU: // ulk_Latn_AU
+        case 0xB17449444C61746ELLU: // ulm_Latn_ID
+        case 0xB57450474C61746ELLU: // uln_Latn_PG
+        case 0xD17449444C61746ELLU: // ulu_Latn_ID
+        case 0xD9744E494C61746ELLU: // ulw_Latn_NI
+        case 0xE1744E474C61746ELLU: // uly_Latn_NG
+        case 0x819455534C61746ELLU: // uma_Latn_US
+        case 0x8594414F4C61746ELLU: // umb_Latn_AO
+        case 0x8D9441554C61746ELLU: // umd_Latn_AU
+        case 0x999441554C61746ELLU: // umg_Latn_AU
+        case 0xA1944D594C61746ELLU: // umi_Latn_MY
+        case 0xB1944E474C61746ELLU: // umm_Latn_NG
+        case 0xB5944D4D4C61746ELLU: // umn_Latn_MM
+        case 0xB99442524C61746ELLU: // umo_Latn_BR
+        case 0xBD9441554C61746ELLU: // ump_Latn_AU
+        case 0xC59441554C61746ELLU: // umr_Latn_AU
+        case 0xC99449444C61746ELLU: // ums_Latn_ID
+        case 0x81B450474C61746ELLU: // una_Latn_PG
+        case 0x91B44E474C61746ELLU: // une_Latn_NG
+        case 0x99B441554C61746ELLU: // ung_Latn_AU
+        case 0xA1B450474C61746ELLU: // uni_Latn_PG
+        case 0xA9B442524C61746ELLU: // unk_Latn_BR
+        case 0xB1B455534C61746ELLU: // unm_Latn_US
+        case 0xB5B441554C61746ELLU: // unn_Latn_AU
+        case 0xC5B4494E42656E67LLU: // unr_Beng_IN
+        case 0xC5B44E5044657661LLU: // unr_Deva_NP
+        case 0xD1B450474C61746ELLU: // unu_Latn_PG
+        case 0xDDB4494E42656E67LLU: // unx_Beng_IN
+        case 0xE5B449444C61746ELLU: // unz_Latn_ID
+        case 0xB5D454574C61746ELLU: // uon_Latn_TW
+        case 0xA1F450474C61746ELLU: // upi_Latn_PG
+        case 0xD5F456554C61746ELLU: // upv_Latn_VU
+        case 0x7572504B41726162LLU: // ur_Arab_PK
+        case 0x823450454C61746ELLU: // ura_Latn_PE
+        case 0x863442524C61746ELLU: // urb_Latn_BR
+        case 0x8A3441554C61746ELLU: // urc_Latn_AU
+        case 0x9234424F4C61746ELLU: // ure_Latn_BO
+        case 0x963441554C61746ELLU: // urf_Latn_AU
+        case 0x9A3450474C61746ELLU: // urg_Latn_PG
+        case 0x9E344E474C61746ELLU: // urh_Latn_NG
+        case 0xA23450474C61746ELLU: // uri_Latn_PG
+        case 0xAA34544854686169LLU: // urk_Thai_TH
+        case 0xB23450474C61746ELLU: // urm_Latn_PG
+        case 0xB63449444C61746ELLU: // urn_Latn_ID
+        case 0xBA3450474C61746ELLU: // uro_Latn_PG
+        case 0xBE3442524C61746ELLU: // urp_Latn_BR
+        case 0xC63456554C61746ELLU: // urr_Latn_VU
+        case 0xCE3450474C61746ELLU: // urt_Latn_PG
+        case 0xD23442524C61746ELLU: // uru_Latn_BR
+        case 0xD63450474C61746ELLU: // urv_Latn_PG
+        case 0xDA3450474C61746ELLU: // urw_Latn_PG
+        case 0xDE3450474C61746ELLU: // urx_Latn_PG
+        case 0xE23449444C61746ELLU: // ury_Latn_ID
+        case 0xE63442524C61746ELLU: // urz_Latn_BR
+        case 0x825450474C61746ELLU: // usa_Latn_PG
+        case 0x9E54504B41726162LLU: // ush_Arab_PK
+        case 0xA25442444C61746ELLU: // usi_Latn_BD
+        case 0xAA54434D4C61746ELLU: // usk_Latn_CM
+        case 0xBE5447544C61746ELLU: // usp_Latn_GT
+        case 0xCA544E474C61746ELLU: // uss_Latn_NG
+        case 0xD25450474C61746ELLU: // usu_Latn_PG
+        case 0x82744E474C61746ELLU: // uta_Latn_NG
+        case 0x927455534C61746ELLU: // ute_Latn_US
+        case 0x9E744E474C61746ELLU: // uth_Latn_NG
+        case 0xBE7453424C61746ELLU: // utp_Latn_SB
+        case 0xC6744E474C61746ELLU: // utr_Latn_NG
+        case 0xD27450474C61746ELLU: // utu_Latn_PG
+        case 0xB29447454772656BLLU: // uum_Grek_GE
+        case 0xC69456554C61746ELLU: // uur_Latn_VU
+        case 0x92B44E434C61746ELLU: // uve_Latn_NC
+        case 0x9EB450474C61746ELLU: // uvh_Latn_PG
+        case 0xAEB450474C61746ELLU: // uvl_Latn_PG
+        case 0x82D441554C61746ELLU: // uwa_Latn_AU
+        case 0x83144E474C61746ELLU: // uya_Latn_NG
+        case 0x757A414641726162LLU: // uz_Arab_AF
+        case 0x757A555A4C61746ELLU: // uz_Latn_UZ
+        case 0xCB34414641726162LLU: // uzs_Arab_AF
+        case 0x8015494E54616D6CLLU: // vaa_Taml_IN
+        case 0x901543464C61746ELLU: // vae_Latn_CF
+        case 0x9415495241726162LLU: // vaf_Arab_IR
+        case 0x981547484C61746ELLU: // vag_Latn_GH
+        case 0x9C15494E44657661LLU: // vah_Deva_IN
+        case 0xA0154C5256616969LLU: // vai_Vaii_LR
+        case 0xA4154E414C61746ELLU: // vaj_Latn_NA
+        case 0xAC1550474C61746ELLU: // val_Latn_PG
+        case 0xB01550474C61746ELLU: // vam_Latn_PG
+        case 0xB41550474C61746ELLU: // van_Latn_PG
+        case 0xB81556554C61746ELLU: // vao_Latn_VU
+        case 0xBC15494E4C61746ELLU: // vap_Latn_IN
+        case 0xC4154D584C61746ELLU: // var_Latn_MX
+        case 0xC815494E44657661LLU: // vas_Deva_IN
+        case 0xD01543444C61746ELLU: // vau_Latn_CD
+        case 0xD415494E44657661LLU: // vav_Deva_IN
+        case 0xE0154E5044657661LLU: // vay_Deva_NP
+        case 0x843549444C61746ELLU: // vbb_Latn_ID
+        case 0xA83550484C61746ELLU: // vbk_Latn_PH
+        case 0x76655A414C61746ELLU: // ve_Latn_ZA
+        case 0x889549544C61746ELLU: // vec_Latn_IT
+        case 0xB0954E474C61746ELLU: // vem_Latn_NG
+        case 0xB89555534C61746ELLU: // veo_Latn_US
+        case 0xBC9552554C61746ELLU: // vep_Latn_RU
+        case 0xC4954E474C61746ELLU: // ver_Latn_NG
+        case 0xC4D5504B41726162LLU: // vgr_Arab_PK
+        case 0x7669564E4C61746ELLU: // vi_Latn_VN
+        case 0x891553584C61746ELLU: // vic_Latn_SX
+        case 0x8D15545A4C61746ELLU: // vid_Latn_TZ
+        case 0x951543474C61746ELLU: // vif_Latn_CG
+        case 0x991542464C61746ELLU: // vig_Latn_BF
+        case 0xAD1541524C61746ELLU: // vil_Latn_AR
+        case 0xB515545A4C61746ELLU: // vin_Latn_TZ
+        case 0xCD154E474C61746ELLU: // vit_Latn_NG
+        case 0xD51550474C61746ELLU: // viv_Latn_PG
+        case 0xA935494E44657661LLU: // vjk_Deva_IN
+        case 0x815541554C61746ELLU: // vka_Latn_AU
+        case 0xA55554444C61746ELLU: // vkj_Latn_TD
+        case 0xA95549444C61746ELLU: // vkk_Latn_ID
+        case 0xAD5549444C61746ELLU: // vkl_Latn_ID
+        case 0xB15542524C61746ELLU: // vkm_Latn_BR
+        case 0xB5554E474C61746ELLU: // vkn_Latn_NG
+        case 0xB95549444C61746ELLU: // vko_Latn_ID
+        case 0xBD55494E4C61746ELLU: // vkp_Latn_IN
+        case 0xCD5549444C61746ELLU: // vkt_Latn_ID
+        case 0xD15541554C61746ELLU: // vku_Latn_AU
+        case 0xE5554E474C61746ELLU: // vkz_Latn_NG
+        case 0xBD7556554C61746ELLU: // vlp_Latn_VU
+        case 0xC97542454C61746ELLU: // vls_Latn_BE
+        case 0x819541554C61746ELLU: // vma_Latn_AU
+        case 0x859541554C61746ELLU: // vmb_Latn_AU
+        case 0x89954D584C61746ELLU: // vmc_Latn_MX
+        case 0x8D95494E4B6E6461LLU: // vmd_Knda_IN
+        case 0x919549444C61746ELLU: // vme_Latn_ID
+        case 0x959544454C61746ELLU: // vmf_Latn_DE
+        case 0x999550474C61746ELLU: // vmg_Latn_PG
+        case 0x9D95495241726162LLU: // vmh_Arab_IR
+        case 0xA19541554C61746ELLU: // vmi_Latn_AU
+        case 0xA5954D584C61746ELLU: // vmj_Latn_MX
+        case 0xA9954D5A4C61746ELLU: // vmk_Latn_MZ
+        case 0xAD9541554C61746ELLU: // vml_Latn_AU
+        case 0xB1954D584C61746ELLU: // vmm_Latn_MX
+        case 0xBD954D584C61746ELLU: // vmp_Latn_MX
+        case 0xC1954D584C61746ELLU: // vmq_Latn_MX
+        case 0xC5954D5A4C61746ELLU: // vmr_Latn_MZ
+        case 0xC99549444C61746ELLU: // vms_Latn_ID
+        case 0xD19541554C61746ELLU: // vmu_Latn_AU
+        case 0xD9954D5A4C61746ELLU: // vmw_Latn_MZ
+        case 0xDD954D584C61746ELLU: // vmx_Latn_MX
+        case 0xE1954D584C61746ELLU: // vmy_Latn_MX
+        case 0xE5954D584C61746ELLU: // vmz_Latn_MX
+        case 0xA9B553424C61746ELLU: // vnk_Latn_SB
+        case 0xB1B556554C61746ELLU: // vnm_Latn_VU
+        case 0xBDB556554C61746ELLU: // vnp_Latn_VU
+        case 0xC5D54E474C61746ELLU: // vor_Latn_NG
+        case 0xCDD552554C61746ELLU: // vot_Latn_RU
+        case 0x823556554C61746ELLU: // vra_Latn_VU
+        case 0xBA3545454C61746ELLU: // vro_Latn_EE
+        case 0xCA3553424C61746ELLU: // vrs_Latn_SB
+        case 0xCE3556554C61746ELLU: // vrt_Latn_VU
+        case 0xBA7549444C61746ELLU: // vto_Latn_ID
+        case 0xB29547414C61746ELLU: // vum_Latn_GA
+        case 0xB695545A4C61746ELLU: // vun_Latn_TZ
+        case 0xCE95434D4C61746ELLU: // vut_Latn_CM
+        case 0x82D5434E4C61746ELLU: // vwa_Latn_CN
+        case 0x776142454C61746ELLU: // wa_Latn_BE
+        case 0x801655534C61746ELLU: // waa_Latn_US
+        case 0x841650474C61746ELLU: // wab_Latn_PG
+        case 0x881655534C61746ELLU: // wac_Latn_US
+        case 0x8C1649444C61746ELLU: // wad_Latn_ID
+        case 0x901643484C61746ELLU: // wae_Latn_CH
+        case 0x941642524C61746ELLU: // waf_Latn_BR
+        case 0x981650474C61746ELLU: // wag_Latn_PG
+        case 0x9C1649444C61746ELLU: // wah_Latn_ID
+        case 0xA01649444C61746ELLU: // wai_Latn_ID
+        case 0xA41650474C61746ELLU: // waj_Latn_PG
+        case 0xAC16455445746869LLU: // wal_Ethi_ET
+        case 0xB01655534C61746ELLU: // wam_Latn_US
+        case 0xB41643494C61746ELLU: // wan_Latn_CI
+        case 0xBC1647594C61746ELLU: // wap_Latn_GY
+        case 0xC01641554C61746ELLU: // waq_Latn_AU
+        case 0xC41650484C61746ELLU: // war_Latn_PH
+        case 0xC81655534C61746ELLU: // was_Latn_US
+        case 0xCC1650474C61746ELLU: // wat_Latn_PG
+        case 0xD01642524C61746ELLU: // wau_Latn_BR
+        case 0xD4164E474C61746ELLU: // wav_Latn_NG
+        case 0xD81642524C61746ELLU: // waw_Latn_BR
+        case 0xDC1650474C61746ELLU: // wax_Latn_PG
+        case 0xE01653524C61746ELLU: // way_Latn_SR
+        case 0xE41650474C61746ELLU: // waz_Latn_PG
+        case 0x803656454C61746ELLU: // wba_Latn_VE
+        case 0x843649444C61746ELLU: // wbb_Latn_ID
+        case 0x903649444C61746ELLU: // wbe_Latn_ID
+        case 0x943642464C61746ELLU: // wbf_Latn_BF
+        case 0x9C36545A4C61746ELLU: // wbh_Latn_TZ
+        case 0xA036545A4C61746ELLU: // wbi_Latn_TZ
+        case 0xA436545A4C61746ELLU: // wbj_Latn_TZ
+        case 0xA836414641726162LLU: // wbk_Arab_AF
+        case 0xAC36504B4C61746ELLU: // wbl_Latn_PK
+        case 0xB036434E4C61746ELLU: // wbm_Latn_CN
+        case 0xBC3641554C61746ELLU: // wbp_Latn_AU
+        case 0xC036494E54656C75LLU: // wbq_Telu_IN
+        case 0xC436494E44657661LLU: // wbr_Deva_IN
+        case 0xCC3641554C61746ELLU: // wbt_Latn_AU
+        case 0xD43641554C61746ELLU: // wbv_Latn_AU
+        case 0xD83649444C61746ELLU: // wbw_Latn_ID
+        case 0x805642524C61746ELLU: // wca_Latn_BR
+        case 0xA05654474C61746ELLU: // wci_Latn_TG
+        case 0x8C7647414C61746ELLU: // wdd_Latn_GA
+        case 0x987650474C61746ELLU: // wdg_Latn_PG
+        case 0xA47641554C61746ELLU: // wdj_Latn_AU
+        case 0xA87641554C61746ELLU: // wdk_Latn_AU
+        case 0xCC7643414C61746ELLU: // wdt_Latn_CA
+        case 0xD07641554C61746ELLU: // wdu_Latn_AU
+        case 0xE07641554C61746ELLU: // wdy_Latn_AU
+        case 0x889643494C61746ELLU: // wec_Latn_CI
+        case 0x8C9650474C61746ELLU: // wed_Latn_PG
+        case 0x989641554C61746ELLU: // weg_Latn_AU
+        case 0x9C96434D4C61746ELLU: // weh_Latn_CM
+        case 0xA09650474C61746ELLU: // wei_Latn_PG
+        case 0xB096424A4C61746ELLU: // wem_Latn_BJ
+        case 0xB89649444C61746ELLU: // weo_Latn_ID
+        case 0xBC9644454C61746ELLU: // wep_Latn_DE
+        case 0xC49650474C61746ELLU: // wer_Latn_PG
+        case 0xC896434D4C61746ELLU: // wes_Latn_CM
+        case 0xCC9649444C61746ELLU: // wet_Latn_ID
+        case 0xD0964D4D4C61746ELLU: // weu_Latn_MM
+        case 0xD89649444C61746ELLU: // wew_Latn_ID
+        case 0x98B649444C61746ELLU: // wfg_Latn_ID
+        case 0x80D641554C61746ELLU: // wga_Latn_AU
+        case 0x84D650474C61746ELLU: // wgb_Latn_PG
+        case 0x98D641554C61746ELLU: // wgg_Latn_AU
+        case 0xA0D650474C61746ELLU: // wgi_Latn_PG
+        case 0xB8D649444C61746ELLU: // wgo_Latn_ID
+        case 0xD0D641554C61746ELLU: // wgu_Latn_AU
+        case 0xE0D641554C61746ELLU: // wgy_Latn_AU
+        case 0x80F649444C61746ELLU: // wha_Latn_ID
+        case 0x98F650474C61746ELLU: // whg_Latn_PG
+        case 0xA8F649444C61746ELLU: // whk_Latn_ID
+        case 0xD0F649444C61746ELLU: // whu_Latn_ID
+        case 0x851642464C61746ELLU: // wib_Latn_BF
+        case 0x891655534C61746ELLU: // wic_Latn_US
+        case 0x911641554C61746ELLU: // wie_Latn_AU
+        case 0x951641554C61746ELLU: // wif_Latn_AU
+        case 0x991641554C61746ELLU: // wig_Latn_AU
+        case 0x9D1641554C61746ELLU: // wih_Latn_AU
+        case 0xA11650474C61746ELLU: // wii_Latn_PG
+        case 0xA51641554C61746ELLU: // wij_Latn_AU
+        case 0xA91641554C61746ELLU: // wik_Latn_AU
+        case 0xAD1641554C61746ELLU: // wil_Latn_AU
+        case 0xB11641554C61746ELLU: // wim_Latn_AU
+        case 0xB51655534C61746ELLU: // win_Latn_US
+        case 0xC51642524C61746ELLU: // wir_Latn_BR
+        case 0xD11650474C61746ELLU: // wiu_Latn_PG
+        case 0xD51650474C61746ELLU: // wiv_Latn_PG
+        case 0xE11655534C61746ELLU: // wiy_Latn_US
+        case 0x81364E474C61746ELLU: // wja_Latn_NG
+        case 0xA1364E474C61746ELLU: // wji_Latn_NG
+        case 0x8156545A4C61746ELLU: // wka_Latn_TZ
+        case 0x8D5649444C61746ELLU: // wkd_Latn_ID
+        case 0xC55641554C61746ELLU: // wkr_Latn_AU
+        case 0xD95641554C61746ELLU: // wkw_Latn_AU
+        case 0xE15641554C61746ELLU: // wky_Latn_AU
+        case 0x817650474C61746ELLU: // wla_Latn_PG
+        case 0x9176455445746869LLU: // wle_Ethi_ET
+        case 0x997641554C61746ELLU: // wlg_Latn_AU
+        case 0x9D76544C4C61746ELLU: // wlh_Latn_TL
+        case 0xA17649444C61746ELLU: // wli_Latn_ID
+        case 0xB17647424C61746ELLU: // wlm_Latn_GB
+        case 0xB976494441726162LLU: // wlo_Arab_ID
+        case 0xC57656554C61746ELLU: // wlr_Latn_VU
+        case 0xC97657464C61746ELLU: // wls_Latn_WF
+        case 0xD17641554C61746ELLU: // wlu_Latn_AU
+        case 0xD57641524C61746ELLU: // wlv_Latn_AR
+        case 0xD97649444C61746ELLU: // wlw_Latn_ID
+        case 0xDD7647484C61746ELLU: // wlx_Latn_GH
+        case 0x81964E474C61746ELLU: // wma_Latn_NG
+        case 0x859641554C61746ELLU: // wmb_Latn_AU
+        case 0x899650474C61746ELLU: // wmc_Latn_PG
+        case 0x8D9642524C61746ELLU: // wmd_Latn_BR
+        case 0x91964E5044657661LLU: // wme_Deva_NP
+        case 0x9D96544C4C61746ELLU: // wmh_Latn_TL
+        case 0xA19641554C61746ELLU: // wmi_Latn_AU
+        case 0xB19649444C61746ELLU: // wmm_Latn_ID
+        case 0xB5964E434C61746ELLU: // wmn_Latn_NC
+        case 0xB99650474C61746ELLU: // wmo_Latn_PG
+        case 0xC99649444C61746ELLU: // wms_Latn_ID
+        case 0xCD9641554C61746ELLU: // wmt_Latn_AU
+        case 0xD9964D5A4C61746ELLU: // wmw_Latn_MZ
+        case 0xDD9650474C61746ELLU: // wmx_Latn_PG
+        case 0x85B650474C61746ELLU: // wnb_Latn_PG
+        case 0x89B650474C61746ELLU: // wnc_Latn_PG
+        case 0x8DB641554C61746ELLU: // wnd_Latn_AU
+        case 0x91B6504B41726162LLU: // wne_Arab_PK
+        case 0x99B649444C61746ELLU: // wng_Latn_ID
+        case 0xA1B64B4D41726162LLU: // wni_Arab_KM
+        case 0xA9B649444C61746ELLU: // wnk_Latn_ID
+        case 0xB1B641554C61746ELLU: // wnm_Latn_AU
+        case 0xB5B641554C61746ELLU: // wnn_Latn_AU
+        case 0xB9B649444C61746ELLU: // wno_Latn_ID
+        case 0xBDB650474C61746ELLU: // wnp_Latn_PG
+        case 0xD1B650474C61746ELLU: // wnu_Latn_PG
+        case 0xD9B655534C61746ELLU: // wnw_Latn_US
+        case 0xE1B641554C61746ELLU: // wny_Latn_AU
+        case 0x776F534E4C61746ELLU: // wo_Latn_SN
+        case 0x81D641554C61746ELLU: // woa_Latn_AU
+        case 0x85D643494C61746ELLU: // wob_Latn_CI
+        case 0x89D650474C61746ELLU: // woc_Latn_PG
+        case 0x8DD649444C61746ELLU: // wod_Latn_ID
+        case 0x91D6464D4C61746ELLU: // woe_Latn_FM
+        case 0x95D6474D4C61746ELLU: // wof_Latn_GM
+        case 0x99D650474C61746ELLU: // wog_Latn_PG
+        case 0xA1D649444C61746ELLU: // woi_Latn_ID
+        case 0xA9D6434D4C61746ELLU: // wok_Latn_CM
+        case 0xB1D64E474C61746ELLU: // wom_Latn_NG
+        case 0xB5D643444C61746ELLU: // won_Latn_CD
+        case 0xB9D649444C61746ELLU: // woo_Latn_ID
+        case 0xC5D649444C61746ELLU: // wor_Latn_ID
+        case 0xC9D650474C61746ELLU: // wos_Latn_PG
+        case 0xD9D649444C61746ELLU: // wow_Latn_ID
+        case 0x89F656454C61746ELLU: // wpc_Latn_VE
+        case 0x863641554C61746ELLU: // wrb_Latn_AU
+        case 0x9A3641554C61746ELLU: // wrg_Latn_AU
+        case 0x9E3641554C61746ELLU: // wrh_Latn_AU
+        case 0xA23641554C61746ELLU: // wri_Latn_AU
+        case 0xAA3641554C61746ELLU: // wrk_Latn_AU
+        case 0xAE3641554C61746ELLU: // wrl_Latn_AU
+        case 0xB23641554C61746ELLU: // wrm_Latn_AU
+        case 0xBA3641554C61746ELLU: // wro_Latn_AU
+        case 0xBE3649444C61746ELLU: // wrp_Latn_ID
+        case 0xC63641554C61746ELLU: // wrr_Latn_AU
+        case 0xCA3650474C61746ELLU: // wrs_Latn_PG
+        case 0xD23649444C61746ELLU: // wru_Latn_ID
+        case 0xD63650474C61746ELLU: // wrv_Latn_PG
+        case 0xDA3641554C61746ELLU: // wrw_Latn_AU
+        case 0xDE3649444C61746ELLU: // wrx_Latn_ID
+        case 0xE63641554C61746ELLU: // wrz_Latn_AU
+        case 0x825649444C61746ELLU: // wsa_Latn_ID
+        case 0x9A56494E476F6E67LLU: // wsg_Gong_IN
+        case 0xA25656554C61746ELLU: // wsi_Latn_VU
+        case 0xAA5650474C61746ELLU: // wsk_Latn_PG
+        case 0xC65650474C61746ELLU: // wsr_Latn_PG
+        case 0xCA5647484C61746ELLU: // wss_Latn_GH
+        case 0xD25642524C61746ELLU: // wsu_Latn_BR
+        case 0xD656414641726162LLU: // wsv_Arab_AF
+        case 0x8676545A4C61746ELLU: // wtb_Latn_TZ
+        case 0x967650474C61746ELLU: // wtf_Latn_PG
+        case 0x9E7641554C61746ELLU: // wth_Latn_AU
+        case 0xA27645544C61746ELLU: // wti_Latn_ET
+        case 0xAA7650474C61746ELLU: // wtk_Latn_PG
+        case 0xB276494E44657661LLU: // wtm_Deva_IN
+        case 0xDA7649444C61746ELLU: // wtw_Latn_ID
+        case 0x829641554C61746ELLU: // wua_Latn_AU
+        case 0x869641554C61746ELLU: // wub_Latn_AU
+        case 0x8E9654474C61746ELLU: // wud_Latn_TG
+        case 0xAE9649444C61746ELLU: // wul_Latn_ID
+        case 0xB29647414C61746ELLU: // wum_Latn_GA
+        case 0xB696545A4C61746ELLU: // wun_Latn_TZ
+        case 0xC69641554C61746ELLU: // wur_Latn_AU
+        case 0xCE9650474C61746ELLU: // wut_Latn_PG
+        case 0xD296434E48616E73LLU: // wuu_Hans_CN
+        case 0xD69650474C61746ELLU: // wuv_Latn_PG
+        case 0xDE9641554C61746ELLU: // wux_Latn_AU
+        case 0xE29649444C61746ELLU: // wuy_Latn_ID
+        case 0x82D6424A4C61746ELLU: // wwa_Latn_BJ
+        case 0x86D641554C61746ELLU: // wwb_Latn_AU
+        case 0xBAD656554C61746ELLU: // wwo_Latn_VU
+        case 0xC6D641554C61746ELLU: // wwr_Latn_AU
+        case 0xDAD6434D4C61746ELLU: // www_Latn_CM
+        case 0xDAF641554C61746ELLU: // wxw_Latn_AU
+        case 0x871641554C61746ELLU: // wyb_Latn_AU
+        case 0xA31641554C61746ELLU: // wyi_Latn_AU
+        case 0xB316504C4C61746ELLU: // wym_Latn_PL
+        case 0xB71655534C61746ELLU: // wyn_Latn_US
+        case 0xC71642524C61746ELLU: // wyr_Latn_BR
+        case 0xE316464A4C61746ELLU: // wyy_Latn_FJ
+        case 0x801745534C61746ELLU: // xaa_Latn_ES
+        case 0x84174E474C61746ELLU: // xab_Latn_NG
+        case 0x9817415A41676862LLU: // xag_Aghb_AZ
+        case 0xA01742524C61746ELLU: // xai_Latn_BR
+        case 0xA41742524C61746ELLU: // xaj_Latn_BR
+        case 0xA81756454C61746ELLU: // xak_Latn_VE
+        case 0xAC1752554379726CLLU: // xal_Cyrl_RU
+        case 0xB0175A414C61746ELLU: // xam_Latn_ZA
+        case 0xB417455445746869LLU: // xan_Ethi_ET
+        case 0xB817564E4C61746ELLU: // xao_Latn_VN
+        case 0xC41750474C61746ELLU: // xar_Latn_PG
+        case 0xC81752554379726CLLU: // xas_Cyrl_RU
+        case 0xCC1742524C61746ELLU: // xat_Latn_BR
+        case 0xD01749444C61746ELLU: // xau_Latn_ID
+        case 0xD41742524C61746ELLU: // xav_Latn_BR
+        case 0xD81755534C61746ELLU: // xaw_Latn_US
+        case 0xE01749444C61746ELLU: // xay_Latn_ID
+        case 0x843741554C61746ELLU: // xbb_Latn_AU
+        case 0x8C3741554C61746ELLU: // xbd_Latn_AU
+        case 0x903741554C61746ELLU: // xbe_Latn_AU
+        case 0x983741554C61746ELLU: // xbg_Latn_AU
+        case 0xA03750474C61746ELLU: // xbi_Latn_PG
+        case 0xA43741554C61746ELLU: // xbj_Latn_AU
+        case 0xB03746524C61746ELLU: // xbm_Latn_FR
+        case 0xB4374D594C61746ELLU: // xbn_Latn_MY
+        case 0xBC3741554C61746ELLU: // xbp_Latn_AU
+        case 0xC43749444C61746ELLU: // xbr_Latn_ID
+        case 0xD83742524C61746ELLU: // xbw_Latn_BR
+        case 0xE03741554C61746ELLU: // xby_Latn_AU
+        case 0x9C5755534C61746ELLU: // xch_Latn_US
+        case 0xB857555A43687273LLU: // xco_Chrs_UZ
+        case 0xC457545243617269LLU: // xcr_Cari_TR
+        case 0x807741554C61746ELLU: // xda_Latn_AU
+        case 0xA87741554C61746ELLU: // xdk_Latn_AU
+        case 0xB877414F4C61746ELLU: // xdo_Latn_AO
+        case 0xC07752554379726CLLU: // xdq_Cyrl_RU
+        case 0xE07749444C61746ELLU: // xdy_Latn_ID
+        case 0x8C97434D4C61746ELLU: // xed_Latn_CM
+        case 0x98975A414C61746ELLU: // xeg_Latn_ZA
+        case 0xB09749444C61746ELLU: // xem_Latn_ID
+        case 0xC49742524C61746ELLU: // xer_Latn_BR
+        case 0xC89750474C61746ELLU: // xes_Latn_PG
+        case 0xCC9742524C61746ELLU: // xet_Latn_BR
+        case 0xD09750474C61746ELLU: // xeu_Latn_PG
+        case 0x84D743494C61746ELLU: // xgb_Latn_CI
+        case 0x8CD741554C61746ELLU: // xgd_Latn_AU
+        case 0x98D741554C61746ELLU: // xgg_Latn_AU
+        case 0xA0D741554C61746ELLU: // xgi_Latn_AU
+        case 0xB0D741554C61746ELLU: // xgm_Latn_AU
+        case 0xD0D741554C61746ELLU: // xgu_Latn_AU
+        case 0xD8D741554C61746ELLU: // xgw_Latn_AU
+        case 0x78685A414C61746ELLU: // xh_Latn_ZA
+        case 0x90F7504B41726162LLU: // xhe_Arab_PK
+        case 0xB0F74B484B686D72LLU: // xhm_Khmr_KH
+        case 0xD4F7564E4C61746ELLU: // xhv_Latn_VN
+        case 0xA1175A414C61746ELLU: // xii_Latn_ZA
+        case 0xB51747544C61746ELLU: // xin_Latn_GT
+        case 0xC51742524C61746ELLU: // xir_Latn_BR
+        case 0xC917494E4F727961LLU: // xis_Orya_IN
+        case 0xE11742524C61746ELLU: // xiy_Latn_BR
+        case 0x853741554C61746ELLU: // xjb_Latn_AU
+        case 0xCD3741554C61746ELLU: // xjt_Latn_AU
+        case 0x8157504B41726162LLU: // xka_Arab_PK
+        case 0x8557424A4C61746ELLU: // xkb_Latn_BJ
+        case 0x8957495241726162LLU: // xkc_Arab_IR
+        case 0x8D5749444C61746ELLU: // xkd_Latn_ID
+        case 0x915749444C61746ELLU: // xke_Latn_ID
+        case 0x9557425454696274LLU: // xkf_Tibt_BT
+        case 0x99574D4C4C61746ELLU: // xkg_Latn_ML
+        case 0xA557495241726162LLU: // xkj_Arab_IR
+        case 0xAD5749444C61746ELLU: // xkl_Latn_ID
+        case 0xB55749444C61746ELLU: // xkn_Latn_ID
+        case 0xBD57495241726162LLU: // xkp_Arab_IR
+        case 0xC15749444C61746ELLU: // xkq_Latn_ID
+        case 0xC55742524C61746ELLU: // xkr_Latn_BR
+        case 0xC95749444C61746ELLU: // xks_Latn_ID
+        case 0xCD5747484C61746ELLU: // xkt_Latn_GH
+        case 0xD15743474C61746ELLU: // xku_Latn_CG
+        case 0xD55742574C61746ELLU: // xkv_Latn_BW
+        case 0xD95749444C61746ELLU: // xkw_Latn_ID
+        case 0xDD5750474C61746ELLU: // xkx_Latn_PG
+        case 0xE1574D594C61746ELLU: // xky_Latn_MY
+        case 0xE55742544C61746ELLU: // xkz_Latn_BT
+        case 0x817750474C61746ELLU: // xla_Latn_PG
+        case 0x897754524C796369LLU: // xlc_Lyci_TR
+        case 0x8D7754524C796469LLU: // xld_Lydi_TR
+        case 0xE1774952456C796DLLU: // xly_Elym_IR
+        case 0x8197534F4C61746ELLU: // xma_Latn_SO
+        case 0x8597434D4C61746ELLU: // xmb_Latn_CM
+        case 0x89974D5A4C61746ELLU: // xmc_Latn_MZ
+        case 0x8D97434D4C61746ELLU: // xmd_Latn_CM
+        case 0x9597474547656F72LLU: // xmf_Geor_GE
+        case 0x9997434D4C61746ELLU: // xmg_Latn_CM
+        case 0x9D9741554C61746ELLU: // xmh_Latn_AU
+        case 0xA597434D4C61746ELLU: // xmj_Latn_CM
+        case 0xB19749444C61746ELLU: // xmm_Latn_ID
+        case 0xB597434E4D616E69LLU: // xmn_Mani_CN
+        case 0xB99742524C61746ELLU: // xmo_Latn_BR
+        case 0xBD9741554C61746ELLU: // xmp_Latn_AU
+        case 0xC19741554C61746ELLU: // xmq_Latn_AU
+        case 0xC59753444D657263LLU: // xmr_Merc_SD
+        case 0xCD9749444C61746ELLU: // xmt_Latn_ID
+        case 0xD19741554C61746ELLU: // xmu_Latn_AU
+        case 0xD5974D474C61746ELLU: // xmv_Latn_MG
+        case 0xD9974D474C61746ELLU: // xmw_Latn_MG
+        case 0xDD9749444C61746ELLU: // xmx_Latn_ID
+        case 0xE19741554C61746ELLU: // xmy_Latn_AU
+        case 0xE59749444C61746ELLU: // xmz_Latn_ID
+        case 0x81B753414E617262LLU: // xna_Narb_SA
+        case 0x85B754574C61746ELLU: // xnb_Latn_TW
+        case 0xA1B741554C61746ELLU: // xni_Latn_AU
+        case 0xA5B7545A4C61746ELLU: // xnj_Latn_TZ
+        case 0xA9B741554C61746ELLU: // xnk_Latn_AU
+        case 0xB1B741554C61746ELLU: // xnm_Latn_AU
+        case 0xB5B750484C61746ELLU: // xnn_Latn_PH
+        case 0xC1B74D5A4C61746ELLU: // xnq_Latn_MZ
+        case 0xC5B7494E44657661LLU: // xnr_Deva_IN
+        case 0xCDB755534C61746ELLU: // xnt_Latn_US
+        case 0xD1B741554C61746ELLU: // xnu_Latn_AU
+        case 0xE1B741554C61746ELLU: // xny_Latn_AU
+        case 0xE5B745474C61746ELLU: // xnz_Latn_EG
+        case 0x89D74E474C61746ELLU: // xoc_Latn_NG
+        case 0x8DD749444C61746ELLU: // xod_Latn_ID
+        case 0x99D755474C61746ELLU: // xog_Latn_UG
+        case 0xA1D750474C61746ELLU: // xoi_Latn_PG
+        case 0xA9D742524C61746ELLU: // xok_Latn_BR
+        case 0xB1D753444C61746ELLU: // xom_Latn_SD
+        case 0xB5D747484C61746ELLU: // xon_Latn_GH
+        case 0xB9D742524C61746ELLU: // xoo_Latn_BR
+        case 0xBDD750474C61746ELLU: // xop_Latn_PG
+        case 0xC5D742524C61746ELLU: // xor_Latn_BR
+        case 0xD9D750474C61746ELLU: // xow_Latn_PG
+        case 0x81F741554C61746ELLU: // xpa_Latn_AU
+        case 0x85F741554C61746ELLU: // xpb_Latn_AU
+        case 0x8DF741554C61746ELLU: // xpd_Latn_AU
+        case 0x95F741554C61746ELLU: // xpf_Latn_AU
+        case 0x99F754524772656BLLU: // xpg_Grek_TR
+        case 0x9DF741554C61746ELLU: // xph_Latn_AU
+        case 0xA1F747424F67616DLLU: // xpi_Ogam_GB
+        case 0xA5F741554C61746ELLU: // xpj_Latn_AU
+        case 0xA9F742524C61746ELLU: // xpk_Latn_BR
+        case 0xADF741554C61746ELLU: // xpl_Latn_AU
+        case 0xB1F752554379726CLLU: // xpm_Cyrl_RU
+        case 0xB5F742524C61746ELLU: // xpn_Latn_BR
+        case 0xB9F74D584C61746ELLU: // xpo_Latn_MX
+        case 0xC1F755534C61746ELLU: // xpq_Latn_US
+        case 0xC5F7495250727469LLU: // xpr_Prti_IR
+        case 0xCDF741554C61746ELLU: // xpt_Latn_AU
+        case 0xD5F741554C61746ELLU: // xpv_Latn_AU
+        case 0xD9F741554C61746ELLU: // xpw_Latn_AU
+        case 0xDDF741554C61746ELLU: // xpx_Latn_AU
+        case 0xE5F741554C61746ELLU: // xpz_Latn_AU
+        case 0x823742524C61746ELLU: // xra_Latn_BR
+        case 0x863742464C61746ELLU: // xrb_Latn_BF
+        case 0x8E3741554C61746ELLU: // xrd_Latn_AU
+        case 0x923742524C61746ELLU: // xre_Latn_BR
+        case 0x9A3741554C61746ELLU: // xrg_Latn_AU
+        case 0xA23742524C61746ELLU: // xri_Latn_BR
+        case 0xB23752554379726CLLU: // xrm_Cyrl_RU
+        case 0xB63752554379726CLLU: // xrn_Cyrl_RU
+        case 0xC63749544C61746ELLU: // xrr_Latn_IT
+        case 0xD23741554C61746ELLU: // xru_Latn_AU
+        case 0xDA3750474C61746ELLU: // xrw_Latn_PG
+        case 0x8257594553617262LLU: // xsa_Sarb_YE
+        case 0x865750484C61746ELLU: // xsb_Latn_PH
+        case 0x925749444C61746ELLU: // xse_Latn_ID
+        case 0x9E574E474C61746ELLU: // xsh_Latn_NG
+        case 0xA25750474C61746ELLU: // xsi_Latn_PG
+        case 0xB25747484C61746ELLU: // xsm_Latn_GH
+        case 0xB6574E474C61746ELLU: // xsn_Latn_NG
+        case 0xBE5750474C61746ELLU: // xsp_Latn_PG
+        case 0xC2574D5A4C61746ELLU: // xsq_Latn_MZ
+        case 0xC6574E5044657661LLU: // xsr_Deva_NP
+        case 0xD25756454C61746ELLU: // xsu_Latn_VE
+        case 0xE25754574C61746ELLU: // xsy_Latn_TW
+        case 0x82774D584C61746ELLU: // xta_Latn_MX
+        case 0x86774D584C61746ELLU: // xtb_Latn_MX
+        case 0x8A7753444C61746ELLU: // xtc_Latn_SD
+        case 0x8E774D584C61746ELLU: // xtd_Latn_MX
+        case 0x927749444C61746ELLU: // xte_Latn_ID
+        case 0x9E7741554C61746ELLU: // xth_Latn_AU
+        case 0xA2774D584C61746ELLU: // xti_Latn_MX
+        case 0xA6774D584C61746ELLU: // xtj_Latn_MX
+        case 0xAE774D584C61746ELLU: // xtl_Latn_MX
+        case 0xB2774D584C61746ELLU: // xtm_Latn_MX
+        case 0xB6774D584C61746ELLU: // xtn_Latn_MX
+        case 0xBE774D584C61746ELLU: // xtp_Latn_MX
+        case 0xC277495242726168LLU: // xtq_Brah_IR
+        case 0xCA774D584C61746ELLU: // xts_Latn_MX
+        case 0xCE774D584C61746ELLU: // xtt_Latn_MX
+        case 0xD2774D584C61746ELLU: // xtu_Latn_MX
+        case 0xD67741554C61746ELLU: // xtv_Latn_AU
+        case 0xDA7742524C61746ELLU: // xtw_Latn_BR
+        case 0xE2774D584C61746ELLU: // xty_Latn_MX
+        case 0x8697494E54616D6CLLU: // xub_Taml_IN
+        case 0x8E9741554C61746ELLU: // xud_Latn_AU
+        case 0xA697494E54616D6CLLU: // xuj_Taml_IN
+        case 0xAE9741554C61746ELLU: // xul_Latn_AU
+        case 0xB29749544C61746ELLU: // xum_Latn_IT
+        case 0xB69741554C61746ELLU: // xun_Latn_AU
+        case 0xBA9754444C61746ELLU: // xuo_Latn_TD
+        case 0xCE9741554C61746ELLU: // xut_Latn_AU
+        case 0xD2974E414C61746ELLU: // xuu_Latn_NA
+        case 0x92B749544974616CLLU: // xve_Ital_IT
+        case 0xA2B7414641726162LLU: // xvi_Arab_AF
+        case 0xB6B745534C61746ELLU: // xvn_Latn_ES
+        case 0xBAB749544C61746ELLU: // xvo_Latn_IT
+        case 0xCAB749544C61746ELLU: // xvs_Latn_IT
+        case 0x82D742524C61746ELLU: // xwa_Latn_BR
+        case 0x8ED741554C61746ELLU: // xwd_Latn_AU
+        case 0x92D7424A4C61746ELLU: // xwe_Latn_BJ
+        case 0xA6D741554C61746ELLU: // xwj_Latn_AU
+        case 0xAAD741554C61746ELLU: // xwk_Latn_AU
+        case 0xAED7424A4C61746ELLU: // xwl_Latn_BJ
+        case 0xBAD752554379726CLLU: // xwo_Cyrl_RU
+        case 0xC6D749444C61746ELLU: // xwr_Latn_ID
+        case 0xCED741554C61746ELLU: // xwt_Latn_AU
+        case 0xDAD741554C61746ELLU: // xww_Latn_AU
+        case 0x86F747484C61746ELLU: // xxb_Latn_GH
+        case 0xAAF749444C61746ELLU: // xxk_Latn_ID
+        case 0xB2F741554C61746ELLU: // xxm_Latn_AU
+        case 0xC6F742524C61746ELLU: // xxr_Latn_BR
+        case 0xCEF749444C61746ELLU: // xxt_Latn_ID
+        case 0x831741554C61746ELLU: // xya_Latn_AU
+        case 0x871741554C61746ELLU: // xyb_Latn_AU
+        case 0xA71741554C61746ELLU: // xyj_Latn_AU
+        case 0xAB1741554C61746ELLU: // xyk_Latn_AU
+        case 0xAF1742524C61746ELLU: // xyl_Latn_BR
+        case 0xCF1741554C61746ELLU: // xyt_Latn_AU
+        case 0xE31741554C61746ELLU: // xyy_Latn_AU
+        case 0x9F37434E4D617263LLU: // xzh_Marc_CN
+        case 0xBF374D584C61746ELLU: // xzp_Latn_MX
+        case 0x801850454C61746ELLU: // yaa_Latn_PE
+        case 0x841842524C61746ELLU: // yab_Latn_BR
+        case 0x881849444C61746ELLU: // yac_Latn_ID
+        case 0x8C1850454C61746ELLU: // yad_Latn_PE
+        case 0x901856454C61746ELLU: // yae_Latn_VE
+        case 0x941843444C61746ELLU: // yaf_Latn_CD
+        case 0x9818434C4C61746ELLU: // yag_Latn_CL
+        case 0x9C18544A4C61746ELLU: // yah_Latn_TJ
+        case 0xA018544A4379726CLLU: // yai_Cyrl_TJ
+        case 0xA41843464C61746ELLU: // yaj_Latn_CF
+        case 0xA81855534C61746ELLU: // yak_Latn_US
+        case 0xAC18474E4C61746ELLU: // yal_Latn_GN
+        case 0xB018434D4C61746ELLU: // yam_Latn_CM
+        case 0xB4184E494C61746ELLU: // yan_Latn_NI
+        case 0xB8184D5A4C61746ELLU: // yao_Latn_MZ
+        case 0xBC18464D4C61746ELLU: // yap_Latn_FM
+        case 0xC0184D584C61746ELLU: // yaq_Latn_MX
+        case 0xC41856454C61746ELLU: // yar_Latn_VE
+        case 0xC818434D4C61746ELLU: // yas_Latn_CM
+        case 0xCC18434D4C61746ELLU: // yat_Latn_CM
+        case 0xD01856454C61746ELLU: // yau_Latn_VE
+        case 0xD418434D4C61746ELLU: // yav_Latn_CM
+        case 0xD81842524C61746ELLU: // yaw_Latn_BR
+        case 0xDC18414F4C61746ELLU: // yax_Latn_AO
+        case 0xE0184E474C61746ELLU: // yay_Latn_NG
+        case 0xE4184E474C61746ELLU: // yaz_Latn_NG
+        case 0x80384E474C61746ELLU: // yba_Latn_NG
+        case 0x8438434D4C61746ELLU: // ybb_Latn_CM
+        case 0x9038434E4C61746ELLU: // ybe_Latn_CN
+        case 0x9C384E5044657661LLU: // ybh_Deva_NP
+        case 0xA0384E5044657661LLU: // ybi_Deva_NP
+        case 0xA4384E474C61746ELLU: // ybj_Latn_NG
+        case 0xAC384E474C61746ELLU: // ybl_Latn_NG
+        case 0xB03850474C61746ELLU: // ybm_Latn_PG
+        case 0xB43842524C61746ELLU: // ybn_Latn_BR
+        case 0xB83850474C61746ELLU: // ybo_Latn_PG
+        case 0xDC3850474C61746ELLU: // ybx_Latn_PG
+        case 0xE03850474C61746ELLU: // yby_Latn_PG
+        case 0xAC58434E4C61746ELLU: // ycl_Latn_CN
+        case 0xB458434F4C61746ELLU: // ycn_Latn_CO
+        case 0xC45854574C61746ELLU: // ycr_Latn_TW
+        case 0x807841554C61746ELLU: // yda_Latn_AU
+        case 0x907850474C61746ELLU: // yde_Latn_PG
+        case 0x9878504B41726162LLU: // ydg_Arab_PK
+        case 0xA87850474C61746ELLU: // ydk_Latn_PG
+        case 0x8098494E4D6C796DLLU: // yea_Mlym_IN
+        case 0x889844454C61746ELLU: // yec_Latn_DE
+        case 0x909850474C61746ELLU: // yee_Latn_PG
+        case 0xA098434D4C61746ELLU: // yei_Latn_CM
+        case 0xA49847524772656BLLU: // yej_Grek_GR
+        case 0xAC9843444C61746ELLU: // yel_Latn_CD
+        case 0xC4984E474C61746ELLU: // yer_Latn_NG
+        case 0xC8984E474C61746ELLU: // yes_Latn_NG
+        case 0xCC9849444C61746ELLU: // yet_Latn_ID
+        case 0xD098494E54656C75LLU: // yeu_Telu_IN
+        case 0xD49850474C61746ELLU: // yev_Latn_PG
+        case 0xE09842574C61746ELLU: // yey_Latn_BW
+        case 0x80D841554C61746ELLU: // yga_Latn_AU
+        case 0xA0D841554C61746ELLU: // ygi_Latn_AU
+        case 0xACD850474C61746ELLU: // ygl_Latn_PG
+        case 0xB0D850474C61746ELLU: // ygm_Latn_PG
+        case 0xBCD8434E506C7264LLU: // ygp_Plrd_CN
+        case 0xC4D850474C61746ELLU: // ygr_Latn_PG
+        case 0xD0D841554C61746ELLU: // ygu_Latn_AU
+        case 0xD8D850474C61746ELLU: // ygw_Latn_PG
+        case 0x8CF8494C48656272LLU: // yhd_Hebr_IL
+        case 0x7969554148656272LLU: // yi_Hebr_UA
+        case 0x811841554C61746ELLU: // yia_Latn_AU
+        case 0x9918434E59696969LLU: // yig_Yiii_CN
+        case 0x9D18444548656272LLU: // yih_Hebr_DE
+        case 0xA11841554C61746ELLU: // yii_Latn_AU
+        case 0xA51841554C61746ELLU: // yij_Latn_AU
+        case 0xAD1841554C61746ELLU: // yil_Latn_AU
+        case 0xB118494E4C61746ELLU: // yim_Latn_IN
+        case 0xC51849444C61746ELLU: // yir_Latn_ID
+        case 0xC91850474C61746ELLU: // yis_Latn_PG
+        case 0xD518434E59696969LLU: // yiv_Yiii_CN
+        case 0x815850484C61746ELLU: // yka_Latn_PH
+        case 0x995852554379726CLLU: // ykg_Cyrl_RU
+        case 0x9D584D4E4379726CLLU: // ykh_Cyrl_MN
+        case 0xA15849444C61746ELLU: // yki_Latn_ID
+        case 0xA95850474C61746ELLU: // ykk_Latn_PG
+        case 0xB15850474C61746ELLU: // ykm_Latn_PG
+        case 0xB958434D4C61746ELLU: // yko_Latn_CM
+        case 0xC55850474C61746ELLU: // ykr_Latn_PG
+        case 0xE15843464C61746ELLU: // yky_Latn_CF
+        case 0x817850474C61746ELLU: // yla_Latn_PG
+        case 0x857850474C61746ELLU: // ylb_Latn_PG
+        case 0x917850474C61746ELLU: // yle_Latn_PG
+        case 0x997850474C61746ELLU: // ylg_Latn_PG
+        case 0xA17849444C61746ELLU: // yli_Latn_ID
+        case 0xAD7850474C61746ELLU: // yll_Latn_PG
+        case 0xC57841554C61746ELLU: // ylr_Latn_AU
+        case 0xD17850474C61746ELLU: // ylu_Latn_PG
+        case 0xE1784E434C61746ELLU: // yly_Latn_NC
+        case 0x859850474C61746ELLU: // ymb_Latn_PG
+        case 0x919850454C61746ELLU: // yme_Latn_PE
+        case 0x999843444C61746ELLU: // ymg_Latn_CD
+        case 0xA9984D5A4C61746ELLU: // ymk_Latn_MZ
+        case 0xAD9850474C61746ELLU: // yml_Latn_PG
+        case 0xB198534F4C61746ELLU: // ymm_Latn_SO
+        case 0xB59849444C61746ELLU: // ymn_Latn_ID
+        case 0xB99850474C61746ELLU: // ymo_Latn_PG
+        case 0xBD9850474C61746ELLU: // ymp_Latn_PG
+        case 0x81B8434E506C7264LLU: // yna_Plrd_CN
+        case 0x8DB841554C61746ELLU: // ynd_Latn_AU
+        case 0x99B843444C61746ELLU: // yng_Latn_CD
+        case 0xA9B852554379726CLLU: // ynk_Cyrl_RU
+        case 0xADB850474C61746ELLU: // ynl_Latn_PG
+        case 0xC1B84E474C61746ELLU: // ynq_Latn_NG
+        case 0xC9B843444C61746ELLU: // yns_Latn_CD
+        case 0xD1B8434F4C61746ELLU: // ynu_Latn_CO
+        case 0x796F4E474C61746ELLU: // yo_Latn_NG
+        case 0x85D850474C61746ELLU: // yob_Latn_PG
+        case 0x99D850484C61746ELLU: // yog_Latn_PH
+        case 0xA1D84A504A70616ELLU: // yoi_Jpan_JP
+        case 0xA9D855534C61746ELLU: // yok_Latn_US
+        case 0xADD849454C61746ELLU: // yol_Latn_IE
+        case 0xB1D843444C61746ELLU: // yom_Latn_CD
+        case 0xB5D850474C61746ELLU: // yon_Latn_PG
+        case 0xCDD84E474C61746ELLU: // yot_Latn_NG
+        case 0xE1D8544854686169LLU: // yoy_Thai_TH
+        case 0x823850474C61746ELLU: // yra_Latn_PG
+        case 0x863850474C61746ELLU: // yrb_Latn_PG
+        case 0x923843494C61746ELLU: // yre_Latn_CI
+        case 0xAA3852554379726CLLU: // yrk_Cyrl_RU
+        case 0xAE3842524C61746ELLU: // yrl_Latn_BR
+        case 0xB23841554C61746ELLU: // yrm_Latn_AU
+        case 0xBA3842524C61746ELLU: // yro_Latn_BR
+        case 0xCA3849444C61746ELLU: // yrs_Latn_ID
+        case 0xDA3850474C61746ELLU: // yrw_Latn_PG
+        case 0xE23841554C61746ELLU: // yry_Latn_AU
+        case 0x8E58434E59696969LLU: // ysd_Yiii_CN
+        case 0xB658434E59696969LLU: // ysn_Yiii_CN
+        case 0xBE58434E59696969LLU: // ysp_Yiii_CN
+        case 0xC65852554379726CLLU: // ysr_Cyrl_RU
+        case 0xCA5850474C61746ELLU: // yss_Latn_PG
+        case 0xE258434E506C7264LLU: // ysy_Plrd_CN
+        case 0xDA7850474C61746ELLU: // ytw_Latn_PG
+        case 0xE27841554C61746ELLU: // yty_Latn_AU
+        case 0x82984D584C61746ELLU: // yua_Latn_MX
+        case 0x869841554C61746ELLU: // yub_Latn_AU
+        case 0x8A9855534C61746ELLU: // yuc_Latn_US
+        case 0x8E98494C48656272LLU: // yud_Hebr_IL
+        case 0x9298434E48616E73LLU: // yue_Hans_CN
+        case 0x9298484B48616E74LLU: // yue_Hant_HK
+        case 0x969855534C61746ELLU: // yuf_Latn_US
+        case 0x9A9852554379726CLLU: // yug_Cyrl_RU
+        case 0xA298434F4C61746ELLU: // yui_Latn_CO
+        case 0xA69850474C61746ELLU: // yuj_Latn_PG
+        case 0xAE9843464C61746ELLU: // yul_Latn_CF
+        case 0xB29855534C61746ELLU: // yum_Latn_US
+        case 0xB6984E474C61746ELLU: // yun_Latn_NG
+        case 0xBE98434F4C61746ELLU: // yup_Latn_CO
+        case 0xC298424F4C61746ELLU: // yuq_Latn_BO
+        case 0xC69855534C61746ELLU: // yur_Latn_US
+        case 0xCE9850474C61746ELLU: // yut_Latn_PG
+        case 0xDA9850474C61746ELLU: // yuw_Latn_PG
+        case 0xDE9852554379726CLLU: // yux_Cyrl_RU
+        case 0xE698424F4C61746ELLU: // yuz_Latn_BO
+        case 0x82B849444C61746ELLU: // yva_Latn_ID
+        case 0xCEB856454C61746ELLU: // yvt_Latn_VE
+        case 0x82D850474C61746ELLU: // ywa_Latn_PG
+        case 0x9AD841554C61746ELLU: // ywg_Latn_AU
+        case 0xB6D842524C61746ELLU: // ywn_Latn_BR
+        case 0xC2D8434E506C7264LLU: // ywq_Plrd_CN
+        case 0xC6D841554C61746ELLU: // ywr_Latn_AU
+        case 0xD2D8434E506C7264LLU: // ywu_Plrd_CN
+        case 0xDAD841554C61746ELLU: // yww_Latn_AU
+        case 0x82F841554C61746ELLU: // yxa_Latn_AU
+        case 0x9AF841554C61746ELLU: // yxg_Latn_AU
+        case 0xAEF841554C61746ELLU: // yxl_Latn_AU
+        case 0xB2F841554C61746ELLU: // yxm_Latn_AU
+        case 0xD2F841554C61746ELLU: // yxu_Latn_AU
+        case 0xE2F841554C61746ELLU: // yxy_Latn_AU
+        case 0xC71841554C61746ELLU: // yyr_Latn_AU
+        case 0xD31850474C61746ELLU: // yyu_Latn_PG
+        case 0x7A61434E4C61746ELLU: // za_Latn_CN
+        case 0x80194D584C61746ELLU: // zaa_Latn_MX
+        case 0x84194D584C61746ELLU: // zab_Latn_MX
+        case 0x88194D584C61746ELLU: // zac_Latn_MX
+        case 0x8C194D584C61746ELLU: // zad_Latn_MX
+        case 0x90194D584C61746ELLU: // zae_Latn_MX
+        case 0x94194D584C61746ELLU: // zaf_Latn_MX
+        case 0x981953444C61746ELLU: // zag_Latn_SD
+        case 0x9C194E474C61746ELLU: // zah_Latn_NG
+        case 0xA419545A4C61746ELLU: // zaj_Latn_TZ
+        case 0xA819545A4C61746ELLU: // zak_Latn_TZ
+        case 0xB0194D584C61746ELLU: // zam_Latn_MX
+        case 0xB8194D584C61746ELLU: // zao_Latn_MX
+        case 0xBC194D584C61746ELLU: // zap_Latn_MX
+        case 0xC0194D584C61746ELLU: // zaq_Latn_MX
+        case 0xC4194D584C61746ELLU: // zar_Latn_MX
+        case 0xC8194D584C61746ELLU: // zas_Latn_MX
+        case 0xCC194D584C61746ELLU: // zat_Latn_MX
+        case 0xD019494E54696274LLU: // zau_Tibt_IN
+        case 0xD4194D584C61746ELLU: // zav_Latn_MX
+        case 0xD8194D584C61746ELLU: // zaw_Latn_MX
+        case 0xDC194D584C61746ELLU: // zax_Latn_MX
+        case 0xE01945544C61746ELLU: // zay_Latn_ET
+        case 0xE4194E474C61746ELLU: // zaz_Latn_NG
+        case 0x88394D594C61746ELLU: // zbc_Latn_MY
+        case 0x90394D594C61746ELLU: // zbe_Latn_MY
+        case 0xCC3949444C61746ELLU: // zbt_Latn_ID
+        case 0xD0394E474C61746ELLU: // zbu_Latn_NG
+        case 0xD8394D594C61746ELLU: // zbw_Latn_MY
+        case 0x80594D584C61746ELLU: // zca_Latn_MX
+        case 0x9C59434E48616E69LLU: // zch_Hani_CN
+        case 0xA4794B4D41726162LLU: // zdj_Arab_KM
+        case 0x80994E4C4C61746ELLU: // zea_Latn_NL
+        case 0x989950474C61746ELLU: // zeg_Latn_PG
+        case 0x9C99434E48616E69LLU: // zeh_Hani_CN
+        case 0xB0994E474C61746ELLU: // zem_Latn_NG
+        case 0xB4994D5254666E67LLU: // zen_Tfng_MR
+        case 0x80D9545A4C61746ELLU: // zga_Latn_TZ
+        case 0x84D9434E48616E69LLU: // zgb_Hani_CN
+        case 0x9CD94D4154666E67LLU: // zgh_Tfng_MA
+        case 0xB0D9434E48616E69LLU: // zgm_Hani_CN
+        case 0xB4D9434E48616E69LLU: // zgn_Hani_CN
+        case 0xC4D950474C61746ELLU: // zgr_Latn_PG
+        case 0x7A685457426F706FLLU: // zh_Bopo_TW
+        case 0x7A68545748616E62LLU: // zh_Hanb_TW
+        case 0x7A68434E48616E73LLU: // zh_Hans_CN
+        case 0x7A68545748616E74LLU: // zh_Hant_TW
+        case 0x8CF9434E48616E69LLU: // zhd_Hani_CN
+        case 0xA0F94E474C61746ELLU: // zhi_Latn_NG
+        case 0xB4F9434E4C61746ELLU: // zhn_Latn_CN
+        case 0xD8F9434D4C61746ELLU: // zhw_Latn_CM
+        case 0xDCF9434E4E736875LLU: // zhx_Nshu_CN
+        case 0x811950474C61746ELLU: // zia_Latn_PG
+        case 0xA91950474C61746ELLU: // zik_Latn_PG
+        case 0xAD19474E4C61746ELLU: // zil_Latn_GN
+        case 0xB11954444C61746ELLU: // zim_Latn_TD
+        case 0xB519545A4C61746ELLU: // zin_Latn_TZ
+        case 0xD919545A4C61746ELLU: // ziw_Latn_TZ
+        case 0xE5194E474C61746ELLU: // ziz_Latn_NG
+        case 0x815949444C61746ELLU: // zka_Latn_ID
+        case 0x8D594D4D4C61746ELLU: // zkd_Latn_MM
+        case 0xB95952554379726CLLU: // zko_Cyrl_RU
+        case 0xBD5942524C61746ELLU: // zkp_Latn_BR
+        case 0xCD59434E4B697473LLU: // zkt_Kits_CN
+        case 0xD15941554C61746ELLU: // zku_Latn_AU
+        case 0xE55952554379726CLLU: // zkz_Cyrl_RU
+        case 0x817943444C61746ELLU: // zla_Latn_CD
+        case 0xA579434E48616E69LLU: // zlj_Hani_CN
+        case 0xB17954474C61746ELLU: // zlm_Latn_TG
+        case 0xB579434E48616E69LLU: // zln_Hani_CN
+        case 0xC179434E48616E69LLU: // zlq_Hani_CN
+        case 0xD1794E474C61746ELLU: // zlu_Latn_NG
+        case 0x819941554C61746ELLU: // zma_Latn_AU
+        case 0x859943444C61746ELLU: // zmb_Latn_CD
+        case 0x899941554C61746ELLU: // zmc_Latn_AU
+        case 0x8D9941554C61746ELLU: // zmd_Latn_AU
+        case 0x919941554C61746ELLU: // zme_Latn_AU
+        case 0x959943444C61746ELLU: // zmf_Latn_CD
+        case 0x999941554C61746ELLU: // zmg_Latn_AU
+        case 0x9D9950474C61746ELLU: // zmh_Latn_PG
+        case 0xA1994D594C61746ELLU: // zmi_Latn_MY
+        case 0xA59941554C61746ELLU: // zmj_Latn_AU
+        case 0xA99941554C61746ELLU: // zmk_Latn_AU
+        case 0xAD9941554C61746ELLU: // zml_Latn_AU
+        case 0xB19941554C61746ELLU: // zmm_Latn_AU
+        case 0xB59947414C61746ELLU: // zmn_Latn_GA
+        case 0xB99953444C61746ELLU: // zmo_Latn_SD
+        case 0xBD9943444C61746ELLU: // zmp_Latn_CD
+        case 0xC19943444C61746ELLU: // zmq_Latn_CD
+        case 0xC59941554C61746ELLU: // zmr_Latn_AU
+        case 0xC99943444C61746ELLU: // zms_Latn_CD
+        case 0xCD9941554C61746ELLU: // zmt_Latn_AU
+        case 0xD19941554C61746ELLU: // zmu_Latn_AU
+        case 0xD59941554C61746ELLU: // zmv_Latn_AU
+        case 0xD99943444C61746ELLU: // zmw_Latn_CD
+        case 0xDD9943474C61746ELLU: // zmx_Latn_CG
+        case 0xE19941554C61746ELLU: // zmy_Latn_AU
+        case 0xE59943444C61746ELLU: // zmz_Latn_CD
+        case 0x81B954444C61746ELLU: // zna_Latn_TD
+        case 0x91B943444C61746ELLU: // zne_Latn_CD
+        case 0x99B9564E4C61746ELLU: // zng_Latn_VN
+        case 0xA9B941554C61746ELLU: // znk_Latn_AU
+        case 0xC9B94E474C61746ELLU: // zns_Latn_NG
+        case 0x89D94D584C61746ELLU: // zoc_Latn_MX
+        case 0x9DD94D584C61746ELLU: // zoh_Latn_MX
+        case 0xB1D9494E4C61746ELLU: // zom_Latn_IN
+        case 0xB9D94D584C61746ELLU: // zoo_Latn_MX
+        case 0xC1D94D584C61746ELLU: // zoq_Latn_MX
+        case 0xC5D94D584C61746ELLU: // zor_Latn_MX
+        case 0xC9D94D584C61746ELLU: // zos_Latn_MX
+        case 0x81F94D584C61746ELLU: // zpa_Latn_MX
+        case 0x85F94D584C61746ELLU: // zpb_Latn_MX
+        case 0x89F94D584C61746ELLU: // zpc_Latn_MX
+        case 0x8DF94D584C61746ELLU: // zpd_Latn_MX
+        case 0x91F94D584C61746ELLU: // zpe_Latn_MX
+        case 0x95F94D584C61746ELLU: // zpf_Latn_MX
+        case 0x99F94D584C61746ELLU: // zpg_Latn_MX
+        case 0x9DF94D584C61746ELLU: // zph_Latn_MX
+        case 0xA1F94D584C61746ELLU: // zpi_Latn_MX
+        case 0xA5F94D584C61746ELLU: // zpj_Latn_MX
+        case 0xA9F94D584C61746ELLU: // zpk_Latn_MX
+        case 0xADF94D584C61746ELLU: // zpl_Latn_MX
+        case 0xB1F94D584C61746ELLU: // zpm_Latn_MX
+        case 0xB5F94D584C61746ELLU: // zpn_Latn_MX
+        case 0xB9F94D584C61746ELLU: // zpo_Latn_MX
+        case 0xBDF94D584C61746ELLU: // zpp_Latn_MX
+        case 0xC1F94D584C61746ELLU: // zpq_Latn_MX
+        case 0xC5F94D584C61746ELLU: // zpr_Latn_MX
+        case 0xC9F94D584C61746ELLU: // zps_Latn_MX
+        case 0xCDF94D584C61746ELLU: // zpt_Latn_MX
+        case 0xD1F94D584C61746ELLU: // zpu_Latn_MX
+        case 0xD5F94D584C61746ELLU: // zpv_Latn_MX
+        case 0xD9F94D584C61746ELLU: // zpw_Latn_MX
+        case 0xDDF94D584C61746ELLU: // zpx_Latn_MX
+        case 0xE1F94D584C61746ELLU: // zpy_Latn_MX
+        case 0xE5F94D584C61746ELLU: // zpz_Latn_MX
+        case 0x9219434E48616E69LLU: // zqe_Hani_CN
+        case 0x9A39494E4F727961LLU: // zrg_Orya_IN
+        case 0xB63954444C61746ELLU: // zrn_Latn_TD
+        case 0xBA3945434C61746ELLU: // zro_Latn_EC
+        case 0xBE39465248656272LLU: // zrp_Hebr_FR
+        case 0xCA3949444C61746ELLU: // zrs_Latn_ID
+        case 0x825950474C61746ELLU: // zsa_Latn_PG
+        case 0xC6594D584C61746ELLU: // zsr_Latn_MX
+        case 0xD25950474C61746ELLU: // zsu_Latn_PG
+        case 0x92794D584C61746ELLU: // zte_Latn_MX
+        case 0x9A794D584C61746ELLU: // ztg_Latn_MX
+        case 0xAE794D584C61746ELLU: // ztl_Latn_MX
+        case 0xB2794D584C61746ELLU: // ztm_Latn_MX
+        case 0xB6794D584C61746ELLU: // ztn_Latn_MX
+        case 0xBE794D584C61746ELLU: // ztp_Latn_MX
+        case 0xC2794D584C61746ELLU: // ztq_Latn_MX
+        case 0xCA794D584C61746ELLU: // zts_Latn_MX
+        case 0xCE794D584C61746ELLU: // ztt_Latn_MX
+        case 0xD2794D584C61746ELLU: // ztu_Latn_MX
+        case 0xDE794D584C61746ELLU: // ztx_Latn_MX
+        case 0xE2794D584C61746ELLU: // zty_Latn_MX
+        case 0x7A755A414C61746ELLU: // zu_Latn_ZA
+        case 0x9E9950474C61746ELLU: // zuh_Latn_PG
+        case 0xB2994F4D41726162LLU: // zum_Arab_OM
+        case 0xB69955534C61746ELLU: // zun_Latn_US
+        case 0xE299434D4C61746ELLU: // zuy_Latn_CM
+        case 0x82D9455445746869LLU: // zwa_Ethi_ET
+        case 0x9B19434E48616E69LLU: // zyg_Hani_CN
+        case 0xA719434E4C61746ELLU: // zyj_Latn_CN
+        case 0xB719434E48616E69LLU: // zyn_Hani_CN
+        case 0xBF194D4D4C61746ELLU: // zyp_Latn_MM
+        case 0x833954524C61746ELLU: // zza_Latn_TR
+        case 0xA739434E48616E69LLU: // zzj_Hani_CN
+            return true;
+        default:
+            return false;
+    }
+}
+
+static uint32_t findArabParent(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x61724145u: // ar-AE -> ar-015
+        case 0x6172445Au: // ar-DZ -> ar-015
+        case 0x61724548u: // ar-EH -> ar-015
+        case 0x61724C59u: // ar-LY -> ar-015
+        case 0x61724D41u: // ar-MA -> ar-015
+        case 0x6172544Eu: // ar-TN -> ar-015
+            return 0x61729420u;
+        default:
+            return 0;
+    }
+}
+
+static uint32_t findDevaParent(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x68690000u: // hi-Latn -> en-IN
+            return 0x656E494Eu;
+        default:
+            return 0;
+    }
+}
+
+static uint32_t findHantParent(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x7A684D4Fu: // zh-Hant-MO -> zh-Hant-HK
+            return 0x7A68484Bu;
+        default:
+            return 0;
+    }
+}
+
+static uint32_t findLatnParent(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x656E80A1u: // en-150 -> en-001
+        case 0x656E4147u: // en-AG -> en-001
+        case 0x656E4149u: // en-AI -> en-001
+        case 0x656E4155u: // en-AU -> en-001
+        case 0x656E4242u: // en-BB -> en-001
+        case 0x656E424Du: // en-BM -> en-001
+        case 0x656E4253u: // en-BS -> en-001
+        case 0x656E4257u: // en-BW -> en-001
+        case 0x656E425Au: // en-BZ -> en-001
+        case 0x656E4343u: // en-CC -> en-001
+        case 0x656E434Bu: // en-CK -> en-001
+        case 0x656E434Du: // en-CM -> en-001
+        case 0x656E4358u: // en-CX -> en-001
+        case 0x656E4359u: // en-CY -> en-001
+        case 0x656E4447u: // en-DG -> en-001
+        case 0x656E444Du: // en-DM -> en-001
+        case 0x656E4552u: // en-ER -> en-001
+        case 0x656E464Au: // en-FJ -> en-001
+        case 0x656E464Bu: // en-FK -> en-001
+        case 0x656E464Du: // en-FM -> en-001
+        case 0x656E4742u: // en-GB -> en-001
+        case 0x656E4744u: // en-GD -> en-001
+        case 0x656E4747u: // en-GG -> en-001
+        case 0x656E4748u: // en-GH -> en-001
+        case 0x656E4749u: // en-GI -> en-001
+        case 0x656E474Du: // en-GM -> en-001
+        case 0x656E4759u: // en-GY -> en-001
+        case 0x656E484Bu: // en-HK -> en-001
+        case 0x656E4944u: // en-ID -> en-001
+        case 0x656E4945u: // en-IE -> en-001
+        case 0x656E494Cu: // en-IL -> en-001
+        case 0x656E494Du: // en-IM -> en-001
+        case 0x656E494Eu: // en-IN -> en-001
+        case 0x656E494Fu: // en-IO -> en-001
+        case 0x656E4A45u: // en-JE -> en-001
+        case 0x656E4A4Du: // en-JM -> en-001
+        case 0x656E4B45u: // en-KE -> en-001
+        case 0x656E4B49u: // en-KI -> en-001
+        case 0x656E4B4Eu: // en-KN -> en-001
+        case 0x656E4B59u: // en-KY -> en-001
+        case 0x656E4C43u: // en-LC -> en-001
+        case 0x656E4C52u: // en-LR -> en-001
+        case 0x656E4C53u: // en-LS -> en-001
+        case 0x656E4D47u: // en-MG -> en-001
+        case 0x656E4D4Fu: // en-MO -> en-001
+        case 0x656E4D53u: // en-MS -> en-001
+        case 0x656E4D54u: // en-MT -> en-001
+        case 0x656E4D55u: // en-MU -> en-001
+        case 0x656E4D56u: // en-MV -> en-001
+        case 0x656E4D57u: // en-MW -> en-001
+        case 0x656E4D59u: // en-MY -> en-001
+        case 0x656E4E41u: // en-NA -> en-001
+        case 0x656E4E46u: // en-NF -> en-001
+        case 0x656E4E47u: // en-NG -> en-001
+        case 0x656E4E52u: // en-NR -> en-001
+        case 0x656E4E55u: // en-NU -> en-001
+        case 0x656E4E5Au: // en-NZ -> en-001
+        case 0x656E5047u: // en-PG -> en-001
+        case 0x656E504Bu: // en-PK -> en-001
+        case 0x656E504Eu: // en-PN -> en-001
+        case 0x656E5057u: // en-PW -> en-001
+        case 0x656E5257u: // en-RW -> en-001
+        case 0x656E5342u: // en-SB -> en-001
+        case 0x656E5343u: // en-SC -> en-001
+        case 0x656E5344u: // en-SD -> en-001
+        case 0x656E5347u: // en-SG -> en-001
+        case 0x656E5348u: // en-SH -> en-001
+        case 0x656E534Cu: // en-SL -> en-001
+        case 0x656E5353u: // en-SS -> en-001
+        case 0x656E5358u: // en-SX -> en-001
+        case 0x656E535Au: // en-SZ -> en-001
+        case 0x656E5443u: // en-TC -> en-001
+        case 0x656E544Bu: // en-TK -> en-001
+        case 0x656E544Fu: // en-TO -> en-001
+        case 0x656E5454u: // en-TT -> en-001
+        case 0x656E5456u: // en-TV -> en-001
+        case 0x656E545Au: // en-TZ -> en-001
+        case 0x656E5547u: // en-UG -> en-001
+        case 0x656E5643u: // en-VC -> en-001
+        case 0x656E5647u: // en-VG -> en-001
+        case 0x656E5655u: // en-VU -> en-001
+        case 0x656E5753u: // en-WS -> en-001
+        case 0x656E5A41u: // en-ZA -> en-001
+        case 0x656E5A4Du: // en-ZM -> en-001
+        case 0x656E5A57u: // en-ZW -> en-001
+            return 0x656E8400u;
+        case 0x656E4154u: // en-AT -> en-150
+        case 0x656E4245u: // en-BE -> en-150
+        case 0x656E4348u: // en-CH -> en-150
+        case 0x656E4445u: // en-DE -> en-150
+        case 0x656E444Bu: // en-DK -> en-150
+        case 0x656E4649u: // en-FI -> en-150
+        case 0x656E4E4Cu: // en-NL -> en-150
+        case 0x656E5345u: // en-SE -> en-150
+        case 0x656E5349u: // en-SI -> en-150
+            return 0x656E80A1u;
+        case 0x65734152u: // es-AR -> es-419
+        case 0x6573424Fu: // es-BO -> es-419
+        case 0x65734252u: // es-BR -> es-419
+        case 0x6573425Au: // es-BZ -> es-419
+        case 0x6573434Cu: // es-CL -> es-419
+        case 0x6573434Fu: // es-CO -> es-419
+        case 0x65734352u: // es-CR -> es-419
+        case 0x65734355u: // es-CU -> es-419
+        case 0x6573444Fu: // es-DO -> es-419
+        case 0x65734543u: // es-EC -> es-419
+        case 0x65734754u: // es-GT -> es-419
+        case 0x6573484Eu: // es-HN -> es-419
+        case 0x65734D58u: // es-MX -> es-419
+        case 0x65734E49u: // es-NI -> es-419
+        case 0x65735041u: // es-PA -> es-419
+        case 0x65735045u: // es-PE -> es-419
+        case 0x65735052u: // es-PR -> es-419
+        case 0x65735059u: // es-PY -> es-419
+        case 0x65735356u: // es-SV -> es-419
+        case 0x65735553u: // es-US -> es-419
+        case 0x65735559u: // es-UY -> es-419
+        case 0x65735645u: // es-VE -> es-419
+            return 0x6573A424u;
+        case 0x6E620000u: // nb -> no
+        case 0x6E6E0000u: // nn -> no
+            return 0x6E6F0000u;
+        case 0x7074414Fu: // pt-AO -> pt-PT
+        case 0x70744348u: // pt-CH -> pt-PT
+        case 0x70744356u: // pt-CV -> pt-PT
+        case 0x70744751u: // pt-GQ -> pt-PT
+        case 0x70744757u: // pt-GW -> pt-PT
+        case 0x70744C55u: // pt-LU -> pt-PT
+        case 0x70744D4Fu: // pt-MO -> pt-PT
+        case 0x70744D5Au: // pt-MZ -> pt-PT
+        case 0x70745354u: // pt-ST -> pt-PT
+        case 0x7074544Cu: // pt-TL -> pt-PT
+            return 0x70745054u;
+        default:
+            return 0;
+    }
+}
+
+static uint32_t find000BParent(uint32_t packed_lang_region) {
+    switch(packed_lang_region) {
+        case 0x61725842u: // ar-XB -> ar-015
+            return 0x61729420u;
+        default:
+            return 0;
     }
 }
 
 uint32_t findParentLocalePackedKey(const char* script, uint32_t packed_lang_region) {
-    for (size_t i = 0; i < SCRIPT_PARENTS_COUNT; i++) {
-        if (memcmp(script, SCRIPT_PARENTS[i].script, SCRIPT_LENGTH) == 0) {
-            auto map = SCRIPT_PARENTS[i].map;
-            auto lookup_result = map->find(packed_lang_region);
-            if (lookup_result != map->end()) {
-                return lookup_result->second;
-            }
-            break;
-        }
+    uint32_t packedScript = packScript(script);
+    switch (packedScript) {
+        case 0x41726162u: // Arab
+            return findArabParent(packed_lang_region);
+        case 0x44657661u: // Deva
+            return findDevaParent(packed_lang_region);
+        case 0x48616E74u: // Hant
+            return findHantParent(packed_lang_region);
+        case 0x4C61746Eu: // Latn
+            return findLatnParent(packed_lang_region);
+        case 0x7E7E7E42u: // ~~~B
+            return find000BParent(packed_lang_region);
+        default:
+            return 0;
     }
-    return 0;
 }
 
 uint32_t getMaxAncestorTreeDepth() {
-    return MAX_PARENT_DEPTH;
+    return 3;
 }
 
-namespace hidden {
-
-bool isRepresentative(uint64_t packed_locale) {
-    return (REPRESENTATIVE_LOCALES.count(packed_locale) != 0);
-}
-
-} // namespace hidden
-
 } // namespace android
diff --git a/libs/androidfw/LocaleDataTables.cpp b/libs/androidfw/LocaleDataTables.cpp
deleted file mode 100644
index f56315f..0000000
--- a/libs/androidfw/LocaleDataTables.cpp
+++ /dev/null
@@ -1,14751 +0,0 @@
-// Auto-generated by ./tools/localedata/extract_icu_data.py
-
-const char SCRIPT_CODES[][4] = {
-    /* 0  */ {'A', 'g', 'h', 'b'},
-    /* 1  */ {'A', 'h', 'o', 'm'},
-    /* 2  */ {'A', 'r', 'a', 'b'},
-    /* 3  */ {'A', 'r', 'm', 'i'},
-    /* 4  */ {'A', 'r', 'm', 'n'},
-    /* 5  */ {'A', 'v', 's', 't'},
-    /* 6  */ {'B', 'a', 'm', 'u'},
-    /* 7  */ {'B', 'a', 's', 's'},
-    /* 8  */ {'B', 'a', 't', 'k'},
-    /* 9  */ {'B', 'e', 'n', 'g'},
-    /* 10 */ {'B', 'o', 'p', 'o'},
-    /* 11 */ {'B', 'r', 'a', 'h'},
-    /* 12 */ {'C', 'a', 'k', 'm'},
-    /* 13 */ {'C', 'a', 'n', 's'},
-    /* 14 */ {'C', 'a', 'r', 'i'},
-    /* 15 */ {'C', 'h', 'a', 'm'},
-    /* 16 */ {'C', 'h', 'e', 'r'},
-    /* 17 */ {'C', 'h', 'r', 's'},
-    /* 18 */ {'C', 'o', 'p', 't'},
-    /* 19 */ {'C', 'p', 'r', 't'},
-    /* 20 */ {'C', 'y', 'r', 'l'},
-    /* 21 */ {'D', 'e', 'v', 'a'},
-    /* 22 */ {'E', 'g', 'y', 'p'},
-    /* 23 */ {'E', 'l', 'y', 'm'},
-    /* 24 */ {'E', 't', 'h', 'i'},
-    /* 25 */ {'G', 'e', 'o', 'r'},
-    /* 26 */ {'G', 'o', 'n', 'g'},
-    /* 27 */ {'G', 'o', 'n', 'm'},
-    /* 28 */ {'G', 'o', 't', 'h'},
-    /* 29 */ {'G', 'r', 'a', 'n'},
-    /* 30 */ {'G', 'r', 'e', 'k'},
-    /* 31 */ {'G', 'u', 'j', 'r'},
-    /* 32 */ {'G', 'u', 'r', 'u'},
-    /* 33 */ {'H', 'a', 'n', 'g'},
-    /* 34 */ {'H', 'a', 'n', 'i'},
-    /* 35 */ {'H', 'a', 'n', 's'},
-    /* 36 */ {'H', 'a', 'n', 't'},
-    /* 37 */ {'H', 'e', 'b', 'r'},
-    /* 38 */ {'H', 'l', 'u', 'w'},
-    /* 39 */ {'H', 'm', 'n', 'p'},
-    /* 40 */ {'I', 't', 'a', 'l'},
-    /* 41 */ {'J', 'a', 'v', 'a'},
-    /* 42 */ {'J', 'p', 'a', 'n'},
-    /* 43 */ {'K', 'a', 'l', 'i'},
-    /* 44 */ {'K', 'a', 'n', 'a'},
-    /* 45 */ {'K', 'a', 'w', 'i'},
-    /* 46 */ {'K', 'h', 'a', 'r'},
-    /* 47 */ {'K', 'h', 'm', 'r'},
-    /* 48 */ {'K', 'i', 't', 's'},
-    /* 49 */ {'K', 'n', 'd', 'a'},
-    /* 50 */ {'K', 'o', 'r', 'e'},
-    /* 51 */ {'L', 'a', 'n', 'a'},
-    /* 52 */ {'L', 'a', 'o', 'o'},
-    /* 53 */ {'L', 'a', 't', 'f'},
-    /* 54 */ {'L', 'a', 't', 'g'},
-    /* 55 */ {'L', 'a', 't', 'n'},
-    /* 56 */ {'L', 'e', 'p', 'c'},
-    /* 57 */ {'L', 'i', 'n', 'a'},
-    /* 58 */ {'L', 'i', 'n', 'b'},
-    /* 59 */ {'L', 'i', 's', 'u'},
-    /* 60 */ {'L', 'y', 'c', 'i'},
-    /* 61 */ {'L', 'y', 'd', 'i'},
-    /* 62 */ {'M', 'a', 'n', 'd'},
-    /* 63 */ {'M', 'a', 'n', 'i'},
-    /* 64 */ {'M', 'a', 'r', 'c'},
-    /* 65 */ {'M', 'e', 'd', 'f'},
-    /* 66 */ {'M', 'e', 'r', 'c'},
-    /* 67 */ {'M', 'l', 'y', 'm'},
-    /* 68 */ {'M', 'o', 'd', 'i'},
-    /* 69 */ {'M', 'o', 'n', 'g'},
-    /* 70 */ {'M', 'r', 'o', 'o'},
-    /* 71 */ {'M', 't', 'e', 'i'},
-    /* 72 */ {'M', 'y', 'm', 'r'},
-    /* 73 */ {'N', 'a', 'r', 'b'},
-    /* 74 */ {'N', 'e', 'w', 'a'},
-    /* 75 */ {'N', 'k', 'o', 'o'},
-    /* 76 */ {'N', 's', 'h', 'u'},
-    /* 77 */ {'O', 'g', 'a', 'm'},
-    /* 78 */ {'O', 'l', 'c', 'k'},
-    /* 79 */ {'O', 'r', 'k', 'h'},
-    /* 80 */ {'O', 'r', 'y', 'a'},
-    /* 81 */ {'O', 's', 'g', 'e'},
-    /* 82 */ {'O', 'u', 'g', 'r'},
-    /* 83 */ {'P', 'a', 'u', 'c'},
-    /* 84 */ {'P', 'h', 'l', 'i'},
-    /* 85 */ {'P', 'h', 'n', 'x'},
-    /* 86 */ {'P', 'l', 'r', 'd'},
-    /* 87 */ {'P', 'r', 't', 'i'},
-    /* 88 */ {'R', 'j', 'n', 'g'},
-    /* 89 */ {'R', 'o', 'h', 'g'},
-    /* 90 */ {'R', 'u', 'n', 'r'},
-    /* 91 */ {'S', 'a', 'm', 'r'},
-    /* 92 */ {'S', 'a', 'r', 'b'},
-    /* 93 */ {'S', 'a', 'u', 'r'},
-    /* 94 */ {'S', 'g', 'n', 'w'},
-    /* 95 */ {'S', 'i', 'n', 'h'},
-    /* 96 */ {'S', 'o', 'g', 'd'},
-    /* 97 */ {'S', 'o', 'r', 'a'},
-    /* 98 */ {'S', 'o', 'y', 'o'},
-    /* 99 */ {'S', 'u', 'n', 'u'},
-    /* 100 */ {'S', 'y', 'r', 'c'},
-    /* 101 */ {'T', 'a', 'g', 'b'},
-    /* 102 */ {'T', 'a', 'k', 'r'},
-    /* 103 */ {'T', 'a', 'l', 'e'},
-    /* 104 */ {'T', 'a', 'l', 'u'},
-    /* 105 */ {'T', 'a', 'm', 'l'},
-    /* 106 */ {'T', 'a', 'n', 'g'},
-    /* 107 */ {'T', 'a', 'v', 't'},
-    /* 108 */ {'T', 'e', 'l', 'u'},
-    /* 109 */ {'T', 'f', 'n', 'g'},
-    /* 110 */ {'T', 'h', 'a', 'a'},
-    /* 111 */ {'T', 'h', 'a', 'i'},
-    /* 112 */ {'T', 'i', 'b', 't'},
-    /* 113 */ {'T', 'n', 's', 'a'},
-    /* 114 */ {'T', 'o', 't', 'o'},
-    /* 115 */ {'U', 'g', 'a', 'r'},
-    /* 116 */ {'V', 'a', 'i', 'i'},
-    /* 117 */ {'W', 'c', 'h', 'o'},
-    /* 118 */ {'X', 'p', 'e', 'o'},
-    /* 119 */ {'X', 's', 'u', 'x'},
-    /* 120 */ {'Y', 'i', 'i', 'i'},
-    /* 121 */ {'~', '~', '~', 'A'},
-    /* 122 */ {'~', '~', '~', 'B'},
-};
-
-
-const std::unordered_map<uint32_t, uint8_t> LIKELY_SCRIPTS({
-    {0x61610000u, 55u}, // aa -> Latn
-    {0x80000000u, 55u}, // aaa -> Latn
-    {0x84000000u, 55u}, // aab -> Latn
-    {0x88000000u, 55u}, // aac -> Latn
-    {0x8C000000u, 55u}, // aad -> Latn
-    {0x90000000u, 55u}, // aae -> Latn
-    {0x94000000u, 67u}, // aaf -> Mlym
-    {0x98000000u, 55u}, // aag -> Latn
-    {0x9C000000u, 55u}, // aah -> Latn
-    {0xA0000000u, 55u}, // aai -> Latn
-    {0xA8000000u, 55u}, // aak -> Latn
-    {0xAC000000u, 55u}, // aal -> Latn
-    {0xB4000000u, 55u}, // aan -> Latn
-    {0xB8000000u,  2u}, // aao -> Arab
-    {0xBC000000u, 55u}, // aap -> Latn
-    {0xC0000000u, 55u}, // aaq -> Latn
-    {0xC8000000u, 55u}, // aas -> Latn
-    {0xCC000000u, 30u}, // aat -> Grek
-    {0xD0000000u, 55u}, // aau -> Latn
-    {0xD8000000u, 55u}, // aaw -> Latn
-    {0xDC000000u, 55u}, // aax -> Latn
-    {0xE4000000u, 55u}, // aaz -> Latn
-    {0x61620000u, 20u}, // ab -> Cyrl
-    {0x80200000u, 55u}, // aba -> Latn
-    {0x84200000u, 55u}, // abb -> Latn
-    {0x88200000u, 55u}, // abc -> Latn
-    {0x8C200000u, 55u}, // abd -> Latn
-    {0x90200000u, 55u}, // abe -> Latn
-    {0x94200000u, 55u}, // abf -> Latn
-    {0x98200000u, 55u}, // abg -> Latn
-    {0x9C200000u,  2u}, // abh -> Arab
-    {0xA0200000u, 55u}, // abi -> Latn
-    {0xAC200000u, 88u}, // abl -> Rjng
-    {0xB0200000u, 55u}, // abm -> Latn
-    {0xB4200000u, 55u}, // abn -> Latn
-    {0xB8200000u, 55u}, // abo -> Latn
-    {0xBC200000u, 55u}, // abp -> Latn
-    {0xC4200000u, 55u}, // abr -> Latn
-    {0xC8200000u, 55u}, // abs -> Latn
-    {0xCC200000u, 55u}, // abt -> Latn
-    {0xD0200000u, 55u}, // abu -> Latn
-    {0xD4200000u,  2u}, // abv -> Arab
-    {0xD8200000u, 55u}, // abw -> Latn
-    {0xDC200000u, 55u}, // abx -> Latn
-    {0xE0200000u, 55u}, // aby -> Latn
-    {0xE4200000u, 55u}, // abz -> Latn
-    {0x80400000u, 55u}, // aca -> Latn
-    {0x84400000u, 55u}, // acb -> Latn
-    {0x8C400000u, 55u}, // acd -> Latn
-    {0x90400000u, 55u}, // ace -> Latn
-    {0x94400000u, 55u}, // acf -> Latn
-    {0x9C400000u, 55u}, // ach -> Latn
-    {0xB0400000u,  2u}, // acm -> Arab
-    {0xB4400000u, 55u}, // acn -> Latn
-    {0xBC400000u, 55u}, // acp -> Latn
-    {0xC0400000u,  2u}, // acq -> Arab
-    {0xC4400000u, 55u}, // acr -> Latn
-    {0xC8400000u, 55u}, // acs -> Latn
-    {0xCC400000u, 55u}, // act -> Latn
-    {0xD0400000u, 55u}, // acu -> Latn
-    {0xD4400000u, 55u}, // acv -> Latn
-    {0xD8400000u,  2u}, // acw -> Arab
-    {0xDC400000u,  2u}, // acx -> Arab
-    {0xE0400000u, 55u}, // acy -> Latn
-    {0xE4400000u, 55u}, // acz -> Latn
-    {0x80600000u, 55u}, // ada -> Latn
-    {0x84600000u, 55u}, // adb -> Latn
-    {0x8C600000u, 55u}, // add -> Latn
-    {0x90600000u, 55u}, // ade -> Latn
-    {0x94600000u,  2u}, // adf -> Arab
-    {0x98600000u, 55u}, // adg -> Latn
-    {0x9C600000u, 55u}, // adh -> Latn
-    {0xA0600000u, 55u}, // adi -> Latn
-    {0xA4600000u, 55u}, // adj -> Latn
-    {0xAC600000u, 55u}, // adl -> Latn
-    {0xB4600000u, 55u}, // adn -> Latn
-    {0xB8600000u, 55u}, // ado -> Latn
-    {0xC0600000u, 55u}, // adq -> Latn
-    {0xC4600000u, 55u}, // adr -> Latn
-    {0xCC600000u, 55u}, // adt -> Latn
-    {0xD0600000u, 55u}, // adu -> Latn
-    {0xD8600000u, 55u}, // adw -> Latn
-    {0xDC600000u, 112u}, // adx -> Tibt
-    {0xE0600000u, 20u}, // ady -> Cyrl
-    {0xE4600000u, 55u}, // adz -> Latn
-    {0x61650000u,  5u}, // ae -> Avst
-    {0x80800000u, 55u}, // aea -> Latn
-    {0x84800000u,  2u}, // aeb -> Arab
-    {0x88800000u,  2u}, // aec -> Arab
-    {0x90800000u,  2u}, // aee -> Arab
-    {0xA8800000u, 55u}, // aek -> Latn
-    {0xAC800000u, 55u}, // ael -> Latn
-    {0xB0800000u, 55u}, // aem -> Latn
-    {0xC0800000u,  2u}, // aeq -> Arab
-    {0xC4800000u, 55u}, // aer -> Latn
-    {0xD0800000u, 55u}, // aeu -> Latn
-    {0xD8800000u, 55u}, // aew -> Latn
-    {0xE0800000u, 55u}, // aey -> Latn
-    {0xE4800000u, 55u}, // aez -> Latn
-    {0x61660000u, 55u}, // af -> Latn
-    {0x84A00000u,  2u}, // afb -> Arab
-    {0x8CA00000u, 55u}, // afd -> Latn
-    {0x90A00000u, 55u}, // afe -> Latn
-    {0x9CA00000u, 55u}, // afh -> Latn
-    {0xA0A00000u, 55u}, // afi -> Latn
-    {0xA8A00000u, 55u}, // afk -> Latn
-    {0xB4A00000u, 55u}, // afn -> Latn
-    {0xB8A00000u, 55u}, // afo -> Latn
-    {0xBCA00000u, 55u}, // afp -> Latn
-    {0xC8A00000u, 55u}, // afs -> Latn
-    {0xD0A00000u, 55u}, // afu -> Latn
-    {0xE4A00000u, 55u}, // afz -> Latn
-    {0x80C00000u, 55u}, // aga -> Latn
-    {0x84C00000u, 55u}, // agb -> Latn
-    {0x88C00000u, 55u}, // agc -> Latn
-    {0x8CC00000u, 55u}, // agd -> Latn
-    {0x90C00000u, 55u}, // age -> Latn
-    {0x94C00000u, 55u}, // agf -> Latn
-    {0x98C00000u, 55u}, // agg -> Latn
-    {0x9CC00000u, 55u}, // agh -> Latn
-    {0xA0C00000u, 21u}, // agi -> Deva
-    {0xA4C00000u, 24u}, // agj -> Ethi
-    {0xA8C00000u, 55u}, // agk -> Latn
-    {0xACC00000u, 55u}, // agl -> Latn
-    {0xB0C00000u, 55u}, // agm -> Latn
-    {0xB4C00000u, 55u}, // agn -> Latn
-    {0xB8C00000u, 55u}, // ago -> Latn
-    {0xC0C00000u, 55u}, // agq -> Latn
-    {0xC4C00000u, 55u}, // agr -> Latn
-    {0xC8C00000u, 55u}, // ags -> Latn
-    {0xCCC00000u, 55u}, // agt -> Latn
-    {0xD0C00000u, 55u}, // agu -> Latn
-    {0xD4C00000u, 55u}, // agv -> Latn
-    {0xD8C00000u, 55u}, // agw -> Latn
-    {0xDCC00000u, 20u}, // agx -> Cyrl
-    {0xE0C00000u, 55u}, // agy -> Latn
-    {0xE4C00000u, 55u}, // agz -> Latn
-    {0x80E00000u, 55u}, // aha -> Latn
-    {0x84E00000u, 55u}, // ahb -> Latn
-    {0x98E00000u, 24u}, // ahg -> Ethi
-    {0x9CE00000u, 55u}, // ahh -> Latn
-    {0xA0E00000u, 55u}, // ahi -> Latn
-    {0xA8E00000u, 55u}, // ahk -> Latn
-    {0xACE00000u, 55u}, // ahl -> Latn
-    {0xB0E00000u, 55u}, // ahm -> Latn
-    {0xB4E00000u, 55u}, // ahn -> Latn
-    {0xB8E00000u,  1u}, // aho -> Ahom
-    {0xBCE00000u, 55u}, // ahp -> Latn
-    {0xC4E00000u, 21u}, // ahr -> Deva
-    {0xC8E00000u, 55u}, // ahs -> Latn
-    {0xCCE00000u, 55u}, // aht -> Latn
-    {0x81000000u, 55u}, // aia -> Latn
-    {0x85000000u,  2u}, // aib -> Arab
-    {0x89000000u, 55u}, // aic -> Latn
-    {0x8D000000u, 55u}, // aid -> Latn
-    {0x91000000u, 55u}, // aie -> Latn
-    {0x95000000u, 55u}, // aif -> Latn
-    {0x99000000u, 55u}, // aig -> Latn
-    {0xA1000000u, 100u}, // aii -> Syrc
-    {0xA5000000u, 37u}, // aij -> Hebr
-    {0xA9000000u, 55u}, // aik -> Latn
-    {0xAD000000u, 55u}, // ail -> Latn
-    {0xB1000000u, 55u}, // aim -> Latn
-    {0xB5000000u, 44u}, // ain -> Kana
-    {0xB9000000u, 72u}, // aio -> Mymr
-    {0xBD000000u, 55u}, // aip -> Latn
-    {0xC1000000u,  2u}, // aiq -> Arab
-    {0xC5000000u, 55u}, // air -> Latn
-    {0xCD000000u, 55u}, // ait -> Latn
-    {0xD9000000u, 55u}, // aiw -> Latn
-    {0xDD000000u, 55u}, // aix -> Latn
-    {0xE1000000u, 55u}, // aiy -> Latn
-    {0x81200000u, 55u}, // aja -> Latn
-    {0x99200000u, 55u}, // ajg -> Latn
-    {0xA1200000u, 55u}, // aji -> Latn
-    {0xB5200000u, 55u}, // ajn -> Latn
-    {0xD9200000u, 55u}, // ajw -> Latn
-    {0xE5200000u, 55u}, // ajz -> Latn
-    {0x616B0000u, 55u}, // ak -> Latn
-    {0x85400000u, 55u}, // akb -> Latn
-    {0x89400000u, 55u}, // akc -> Latn
-    {0x8D400000u, 55u}, // akd -> Latn
-    {0x91400000u, 55u}, // ake -> Latn
-    {0x95400000u, 55u}, // akf -> Latn
-    {0x99400000u, 55u}, // akg -> Latn
-    {0x9D400000u, 55u}, // akh -> Latn
-    {0xA1400000u, 55u}, // aki -> Latn
-    {0xA9400000u, 119u}, // akk -> Xsux
-    {0xAD400000u, 55u}, // akl -> Latn
-    {0xB9400000u, 55u}, // ako -> Latn
-    {0xBD400000u, 55u}, // akp -> Latn
-    {0xC1400000u, 55u}, // akq -> Latn
-    {0xC5400000u, 55u}, // akr -> Latn
-    {0xC9400000u, 55u}, // aks -> Latn
-    {0xCD400000u, 55u}, // akt -> Latn
-    {0xD1400000u, 55u}, // aku -> Latn
-    {0xD5400000u, 20u}, // akv -> Cyrl
-    {0xD9400000u, 55u}, // akw -> Latn
-    {0xE5400000u, 55u}, // akz -> Latn
-    {0x81600000u, 55u}, // ala -> Latn
-    {0x89600000u, 55u}, // alc -> Latn
-    {0x8D600000u, 55u}, // ald -> Latn
-    {0x91600000u, 55u}, // ale -> Latn
-    {0x95600000u, 55u}, // alf -> Latn
-    {0x9D600000u, 55u}, // alh -> Latn
-    {0xA1600000u, 55u}, // ali -> Latn
-    {0xA5600000u, 55u}, // alj -> Latn
-    {0xA9600000u, 52u}, // alk -> Laoo
-    {0xAD600000u, 67u}, // all -> Mlym
-    {0xB1600000u, 55u}, // alm -> Latn
-    {0xB5600000u, 55u}, // aln -> Latn
-    {0xB9600000u, 55u}, // alo -> Latn
-    {0xBD600000u, 55u}, // alp -> Latn
-    {0xC1600000u, 55u}, // alq -> Latn
-    {0xC5600000u, 20u}, // alr -> Cyrl
-    {0xCD600000u, 20u}, // alt -> Cyrl
-    {0xD1600000u, 55u}, // alu -> Latn
-    {0xD9600000u, 24u}, // alw -> Ethi
-    {0xDD600000u, 55u}, // alx -> Latn
-    {0xE1600000u, 55u}, // aly -> Latn
-    {0xE5600000u, 55u}, // alz -> Latn
-    {0x616D0000u, 24u}, // am -> Ethi
-    {0x81800000u, 55u}, // ama -> Latn
-    {0x85800000u, 55u}, // amb -> Latn
-    {0x89800000u, 55u}, // amc -> Latn
-    {0x91800000u, 55u}, // ame -> Latn
-    {0x95800000u, 55u}, // amf -> Latn
-    {0x99800000u, 55u}, // amg -> Latn
-    {0xA1800000u, 55u}, // ami -> Latn
-    {0xA5800000u, 55u}, // amj -> Latn
-    {0xA9800000u, 55u}, // amk -> Latn
-    {0xB1800000u, 55u}, // amm -> Latn
-    {0xB5800000u, 55u}, // amn -> Latn
-    {0xB9800000u, 55u}, // amo -> Latn
-    {0xBD800000u, 55u}, // amp -> Latn
-    {0xC1800000u, 55u}, // amq -> Latn
-    {0xC5800000u, 55u}, // amr -> Latn
-    {0xC9800000u, 42u}, // ams -> Jpan
-    {0xCD800000u, 55u}, // amt -> Latn
-    {0xD1800000u, 55u}, // amu -> Latn
-    {0xD5800000u, 55u}, // amv -> Latn
-    {0xD9800000u, 100u}, // amw -> Syrc
-    {0xDD800000u, 55u}, // amx -> Latn
-    {0xE1800000u, 55u}, // amy -> Latn
-    {0xE5800000u, 55u}, // amz -> Latn
-    {0x616E0000u, 55u}, // an -> Latn
-    {0x81A00000u, 55u}, // ana -> Latn
-    {0x85A00000u, 55u}, // anb -> Latn
-    {0x89A00000u, 55u}, // anc -> Latn
-    {0x8DA00000u, 55u}, // and -> Latn
-    {0x91A00000u, 55u}, // ane -> Latn
-    {0x95A00000u, 55u}, // anf -> Latn
-    {0x99A00000u, 55u}, // ang -> Latn
-    {0x9DA00000u, 55u}, // anh -> Latn
-    {0xA1A00000u, 20u}, // ani -> Cyrl
-    {0xA5A00000u, 55u}, // anj -> Latn
-    {0xA9A00000u, 55u}, // ank -> Latn
-    {0xADA00000u, 55u}, // anl -> Latn
-    {0xB1A00000u, 55u}, // anm -> Latn
-    {0xB5A00000u, 55u}, // ann -> Latn
-    {0xB9A00000u, 55u}, // ano -> Latn
-    {0xBDA00000u, 21u}, // anp -> Deva
-    {0xC1A00000u, 21u}, // anq -> Deva
-    {0xC5A00000u, 21u}, // anr -> Deva
-    {0xC9A00000u, 55u}, // ans -> Latn
-    {0xCDA00000u, 55u}, // ant -> Latn
-    {0xD1A00000u, 24u}, // anu -> Ethi
-    {0xD5A00000u, 55u}, // anv -> Latn
-    {0xD9A00000u, 55u}, // anw -> Latn
-    {0xDDA00000u, 55u}, // anx -> Latn
-    {0xE1A00000u, 55u}, // any -> Latn
-    {0xE5A00000u, 55u}, // anz -> Latn
-    {0x81C00000u, 55u}, // aoa -> Latn
-    {0x85C00000u, 55u}, // aob -> Latn
-    {0x89C00000u, 55u}, // aoc -> Latn
-    {0x8DC00000u, 55u}, // aod -> Latn
-    {0x91C00000u, 55u}, // aoe -> Latn
-    {0x95C00000u, 55u}, // aof -> Latn
-    {0x99C00000u, 55u}, // aog -> Latn
-    {0xA1C00000u, 55u}, // aoi -> Latn
-    {0xA5C00000u, 55u}, // aoj -> Latn
-    {0xA9C00000u, 55u}, // aok -> Latn
-    {0xADC00000u, 55u}, // aol -> Latn
-    {0xB1C00000u, 55u}, // aom -> Latn
-    {0xB5C00000u, 55u}, // aon -> Latn
-    {0xC5C00000u, 55u}, // aor -> Latn
-    {0xC9C00000u, 55u}, // aos -> Latn
-    {0xCDC00000u,  9u}, // aot -> Beng
-    {0xDDC00000u, 55u}, // aox -> Latn
-    {0xE5C00000u, 55u}, // aoz -> Latn
-    {0x85E00000u, 55u}, // apb -> Latn
-    {0x89E00000u,  2u}, // apc -> Arab
-    {0x8DE00000u,  2u}, // apd -> Arab
-    {0x91E00000u, 55u}, // ape -> Latn
-    {0x95E00000u, 55u}, // apf -> Latn
-    {0x99E00000u, 55u}, // apg -> Latn
-    {0x9DE00000u, 21u}, // aph -> Deva
-    {0xA1E00000u, 55u}, // api -> Latn
-    {0xA5E00000u, 55u}, // apj -> Latn
-    {0xA9E00000u, 55u}, // apk -> Latn
-    {0xADE00000u, 55u}, // apl -> Latn
-    {0xB1E00000u, 55u}, // apm -> Latn
-    {0xB5E00000u, 55u}, // apn -> Latn
-    {0xB9E00000u, 55u}, // apo -> Latn
-    {0xBDE00000u, 55u}, // app -> Latn
-    {0xC5E00000u, 55u}, // apr -> Latn
-    {0xC9E00000u, 55u}, // aps -> Latn
-    {0xCDE00000u, 55u}, // apt -> Latn
-    {0xD1E00000u, 55u}, // apu -> Latn
-    {0xD5E00000u, 55u}, // apv -> Latn
-    {0xD9E00000u, 55u}, // apw -> Latn
-    {0xDDE00000u, 55u}, // apx -> Latn
-    {0xE1E00000u, 55u}, // apy -> Latn
-    {0xE5E00000u, 55u}, // apz -> Latn
-    {0x8A000000u, 20u}, // aqc -> Cyrl
-    {0x8E000000u, 55u}, // aqd -> Latn
-    {0x9A000000u, 55u}, // aqg -> Latn
-    {0xAA000000u, 55u}, // aqk -> Latn
-    {0xB2000000u, 55u}, // aqm -> Latn
-    {0xB6000000u, 55u}, // aqn -> Latn
-    {0xC6000000u, 55u}, // aqr -> Latn
-    {0xCE000000u, 55u}, // aqt -> Latn
-    {0xE6000000u, 55u}, // aqz -> Latn
-    {0x61720000u,  2u}, // ar -> Arab
-    {0x61725842u, 122u}, // ar-XB -> ~~~B
-    {0x8A200000u,  3u}, // arc -> Armi
-    {0x8E200000u, 55u}, // ard -> Latn
-    {0x92200000u, 55u}, // are -> Latn
-    {0x9E200000u, 55u}, // arh -> Latn
-    {0xA2200000u, 55u}, // ari -> Latn
-    {0xA6200000u, 55u}, // arj -> Latn
-    {0xAA200000u, 55u}, // ark -> Latn
-    {0xAE200000u, 55u}, // arl -> Latn
-    {0xB6200000u, 55u}, // arn -> Latn
-    {0xBA200000u, 55u}, // aro -> Latn
-    {0xBE200000u, 55u}, // arp -> Latn
-    {0xC2200000u,  2u}, // arq -> Arab
-    {0xC6200000u, 55u}, // arr -> Latn
-    {0xCA200000u,  2u}, // ars -> Arab
-    {0xD2200000u, 55u}, // aru -> Latn
-    {0xDA200000u, 55u}, // arw -> Latn
-    {0xDE200000u, 55u}, // arx -> Latn
-    {0xE2200000u,  2u}, // ary -> Arab
-    {0xE6200000u,  2u}, // arz -> Arab
-    {0x61730000u,  9u}, // as -> Beng
-    {0x82400000u, 55u}, // asa -> Latn
-    {0x86400000u, 55u}, // asb -> Latn
-    {0x8A400000u, 55u}, // asc -> Latn
-    {0x92400000u, 94u}, // ase -> Sgnw
-    {0x9A400000u, 55u}, // asg -> Latn
-    {0x9E400000u, 55u}, // ash -> Latn
-    {0xA2400000u, 55u}, // asi -> Latn
-    {0xA6400000u, 55u}, // asj -> Latn
-    {0xAA400000u,  2u}, // ask -> Arab
-    {0xAE400000u, 55u}, // asl -> Latn
-    {0xB6400000u, 55u}, // asn -> Latn
-    {0xBA400000u, 55u}, // aso -> Latn
-    {0xC6400000u, 21u}, // asr -> Deva
-    {0xCA400000u, 55u}, // ass -> Latn
-    {0xCE400000u, 55u}, // ast -> Latn
-    {0xD2400000u, 55u}, // asu -> Latn
-    {0xD6400000u, 55u}, // asv -> Latn
-    {0xDE400000u, 55u}, // asx -> Latn
-    {0xE2400000u, 55u}, // asy -> Latn
-    {0xE6400000u, 55u}, // asz -> Latn
-    {0x82600000u, 55u}, // ata -> Latn
-    {0x86600000u, 55u}, // atb -> Latn
-    {0x8A600000u, 55u}, // atc -> Latn
-    {0x8E600000u, 55u}, // atd -> Latn
-    {0x92600000u, 55u}, // ate -> Latn
-    {0x9A600000u, 55u}, // atg -> Latn
-    {0xA2600000u, 55u}, // ati -> Latn
-    {0xA6600000u, 55u}, // atj -> Latn
-    {0xAA600000u, 55u}, // atk -> Latn
-    {0xAE600000u, 55u}, // atl -> Latn
-    {0xB2600000u, 55u}, // atm -> Latn
-    {0xB6600000u,  2u}, // atn -> Arab
-    {0xBA600000u, 55u}, // ato -> Latn
-    {0xBE600000u, 55u}, // atp -> Latn
-    {0xC2600000u, 55u}, // atq -> Latn
-    {0xC6600000u, 55u}, // atr -> Latn
-    {0xCA600000u, 55u}, // ats -> Latn
-    {0xCE600000u, 55u}, // att -> Latn
-    {0xD2600000u, 55u}, // atu -> Latn
-    {0xD6600000u, 20u}, // atv -> Cyrl
-    {0xDA600000u, 55u}, // atw -> Latn
-    {0xDE600000u, 55u}, // atx -> Latn
-    {0xE2600000u, 55u}, // aty -> Latn
-    {0xE6600000u, 55u}, // atz -> Latn
-    {0x82800000u, 55u}, // aua -> Latn
-    {0x8A800000u, 55u}, // auc -> Latn
-    {0x8E800000u, 55u}, // aud -> Latn
-    {0x9A800000u, 55u}, // aug -> Latn
-    {0x9E800000u, 55u}, // auh -> Latn
-    {0xA2800000u, 55u}, // aui -> Latn
-    {0xA6800000u,  2u}, // auj -> Arab
-    {0xAA800000u, 55u}, // auk -> Latn
-    {0xAE800000u, 55u}, // aul -> Latn
-    {0xB2800000u, 55u}, // aum -> Latn
-    {0xB6800000u, 55u}, // aun -> Latn
-    {0xBA800000u, 55u}, // auo -> Latn
-    {0xBE800000u, 55u}, // aup -> Latn
-    {0xC2800000u, 55u}, // auq -> Latn
-    {0xC6800000u, 55u}, // aur -> Latn
-    {0xCE800000u, 55u}, // aut -> Latn
-    {0xD2800000u, 55u}, // auu -> Latn
-    {0xDA800000u, 55u}, // auw -> Latn
-    {0xE2800000u, 55u}, // auy -> Latn
-    {0xE6800000u,  2u}, // auz -> Arab
-    {0x61760000u, 20u}, // av -> Cyrl
-    {0x86A00000u, 55u}, // avb -> Latn
-    {0x8EA00000u,  2u}, // avd -> Arab
-    {0xA2A00000u, 55u}, // avi -> Latn
-    {0xAAA00000u, 55u}, // avk -> Latn
-    {0xAEA00000u,  2u}, // avl -> Arab
-    {0xB2A00000u, 55u}, // avm -> Latn
-    {0xB6A00000u, 55u}, // avn -> Latn
-    {0xBAA00000u, 55u}, // avo -> Latn
-    {0xCAA00000u, 55u}, // avs -> Latn
-    {0xCEA00000u, 55u}, // avt -> Latn
-    {0xD2A00000u, 55u}, // avu -> Latn
-    {0xD6A00000u, 55u}, // avv -> Latn
-    {0x82C00000u, 21u}, // awa -> Deva
-    {0x86C00000u, 55u}, // awb -> Latn
-    {0x8AC00000u, 55u}, // awc -> Latn
-    {0x92C00000u, 55u}, // awe -> Latn
-    {0x9AC00000u, 55u}, // awg -> Latn
-    {0x9EC00000u, 55u}, // awh -> Latn
-    {0xA2C00000u, 55u}, // awi -> Latn
-    {0xAAC00000u, 55u}, // awk -> Latn
-    {0xB2C00000u, 55u}, // awm -> Latn
-    {0xB6C00000u, 24u}, // awn -> Ethi
-    {0xBAC00000u, 55u}, // awo -> Latn
-    {0xC6C00000u, 55u}, // awr -> Latn
-    {0xCAC00000u, 55u}, // aws -> Latn
-    {0xCEC00000u, 55u}, // awt -> Latn
-    {0xD2C00000u, 55u}, // awu -> Latn
-    {0xD6C00000u, 55u}, // awv -> Latn
-    {0xDAC00000u, 55u}, // aww -> Latn
-    {0xDEC00000u, 55u}, // awx -> Latn
-    {0xE2C00000u, 55u}, // awy -> Latn
-    {0x86E00000u, 55u}, // axb -> Latn
-    {0x92E00000u, 55u}, // axe -> Latn
-    {0x9AE00000u, 55u}, // axg -> Latn
-    {0xAAE00000u, 55u}, // axk -> Latn
-    {0xAEE00000u, 55u}, // axl -> Latn
-    {0xB2E00000u,  4u}, // axm -> Armn
-    {0xDEE00000u, 55u}, // axx -> Latn
-    {0x61790000u, 55u}, // ay -> Latn
-    {0x83000000u, 55u}, // aya -> Latn
-    {0x87000000u, 55u}, // ayb -> Latn
-    {0x8B000000u, 55u}, // ayc -> Latn
-    {0x8F000000u, 55u}, // ayd -> Latn
-    {0x93000000u, 55u}, // aye -> Latn
-    {0x9B000000u, 55u}, // ayg -> Latn
-    {0x9F000000u,  2u}, // ayh -> Arab
-    {0xA3000000u, 55u}, // ayi -> Latn
-    {0xAB000000u, 55u}, // ayk -> Latn
-    {0xAF000000u,  2u}, // ayl -> Arab
-    {0xB7000000u,  2u}, // ayn -> Arab
-    {0xBB000000u, 55u}, // ayo -> Latn
-    {0xBF000000u,  2u}, // ayp -> Arab
-    {0xC3000000u, 55u}, // ayq -> Latn
-    {0xCB000000u, 55u}, // ays -> Latn
-    {0xCF000000u, 55u}, // ayt -> Latn
-    {0xD3000000u, 55u}, // ayu -> Latn
-    {0xE7000000u, 55u}, // ayz -> Latn
-    {0x617A0000u, 55u}, // az -> Latn
-    {0x617A4951u,  2u}, // az-IQ -> Arab
-    {0x617A4952u,  2u}, // az-IR -> Arab
-    {0x617A5255u, 20u}, // az-RU -> Cyrl
-    {0x87200000u,  2u}, // azb -> Arab
-    {0x8F200000u, 55u}, // azd -> Latn
-    {0x9B200000u, 55u}, // azg -> Latn
-    {0xB3200000u, 55u}, // azm -> Latn
-    {0xB7200000u, 55u}, // azn -> Latn
-    {0xBB200000u, 55u}, // azo -> Latn
-    {0xCF200000u, 55u}, // azt -> Latn
-    {0xE7200000u, 55u}, // azz -> Latn
-    {0x62610000u, 20u}, // ba -> Cyrl
-    {0x80010000u, 55u}, // baa -> Latn
-    {0x84010000u, 55u}, // bab -> Latn
-    {0x88010000u, 55u}, // bac -> Latn
-    {0x90010000u, 55u}, // bae -> Latn
-    {0x94010000u, 55u}, // baf -> Latn
-    {0x98010000u, 55u}, // bag -> Latn
-    {0x9C010000u, 55u}, // bah -> Latn
-    {0xA4010000u, 55u}, // baj -> Latn
-    {0xAC010000u,  2u}, // bal -> Arab
-    {0xB4010000u, 55u}, // ban -> Latn
-    {0xB8010000u, 55u}, // bao -> Latn
-    {0xBC010000u, 21u}, // bap -> Deva
-    {0xC4010000u, 55u}, // bar -> Latn
-    {0xC8010000u, 55u}, // bas -> Latn
-    {0xD0010000u, 55u}, // bau -> Latn
-    {0xD4010000u, 55u}, // bav -> Latn
-    {0xD8010000u, 55u}, // baw -> Latn
-    {0xDC010000u,  6u}, // bax -> Bamu
-    {0xE0010000u, 55u}, // bay -> Latn
-    {0x80210000u, 55u}, // bba -> Latn
-    {0x84210000u, 55u}, // bbb -> Latn
-    {0x88210000u, 55u}, // bbc -> Latn
-    {0x8C210000u, 55u}, // bbd -> Latn
-    {0x90210000u, 55u}, // bbe -> Latn
-    {0x94210000u, 55u}, // bbf -> Latn
-    {0x98210000u, 55u}, // bbg -> Latn
-    {0xA0210000u, 55u}, // bbi -> Latn
-    {0xA4210000u, 55u}, // bbj -> Latn
-    {0xA8210000u, 55u}, // bbk -> Latn
-    {0xAC210000u, 25u}, // bbl -> Geor
-    {0xB0210000u, 55u}, // bbm -> Latn
-    {0xB4210000u, 55u}, // bbn -> Latn
-    {0xB8210000u, 55u}, // bbo -> Latn
-    {0xBC210000u, 55u}, // bbp -> Latn
-    {0xC0210000u, 55u}, // bbq -> Latn
-    {0xC4210000u, 55u}, // bbr -> Latn
-    {0xC8210000u, 55u}, // bbs -> Latn
-    {0xCC210000u, 55u}, // bbt -> Latn
-    {0xD0210000u, 55u}, // bbu -> Latn
-    {0xD4210000u, 55u}, // bbv -> Latn
-    {0xD8210000u, 55u}, // bbw -> Latn
-    {0xDC210000u, 55u}, // bbx -> Latn
-    {0xE0210000u, 55u}, // bby -> Latn
-    {0x80410000u, 55u}, // bca -> Latn
-    {0x84410000u, 55u}, // bcb -> Latn
-    {0x8C410000u, 55u}, // bcd -> Latn
-    {0x90410000u, 55u}, // bce -> Latn
-    {0x94410000u, 55u}, // bcf -> Latn
-    {0x98410000u, 55u}, // bcg -> Latn
-    {0x9C410000u, 55u}, // bch -> Latn
-    {0xA0410000u, 55u}, // bci -> Latn
-    {0xA4410000u, 55u}, // bcj -> Latn
-    {0xA8410000u, 55u}, // bck -> Latn
-    {0xB0410000u, 55u}, // bcm -> Latn
-    {0xB4410000u, 55u}, // bcn -> Latn
-    {0xB8410000u, 55u}, // bco -> Latn
-    {0xBC410000u, 55u}, // bcp -> Latn
-    {0xC0410000u, 24u}, // bcq -> Ethi
-    {0xC4410000u, 55u}, // bcr -> Latn
-    {0xC8410000u, 55u}, // bcs -> Latn
-    {0xCC410000u, 55u}, // bct -> Latn
-    {0xD0410000u, 55u}, // bcu -> Latn
-    {0xD4410000u, 55u}, // bcv -> Latn
-    {0xD8410000u, 55u}, // bcw -> Latn
-    {0xE0410000u, 55u}, // bcy -> Latn
-    {0xE4410000u, 55u}, // bcz -> Latn
-    {0x80610000u, 55u}, // bda -> Latn
-    {0x84610000u, 55u}, // bdb -> Latn
-    {0x88610000u, 55u}, // bdc -> Latn
-    {0x8C610000u, 55u}, // bdd -> Latn
-    {0x90610000u, 55u}, // bde -> Latn
-    {0x94610000u, 55u}, // bdf -> Latn
-    {0x98610000u, 55u}, // bdg -> Latn
-    {0x9C610000u, 55u}, // bdh -> Latn
-    {0xA0610000u, 55u}, // bdi -> Latn
-    {0xA4610000u, 55u}, // bdj -> Latn
-    {0xA8610000u, 55u}, // bdk -> Latn
-    {0xAC610000u, 55u}, // bdl -> Latn
-    {0xB0610000u, 55u}, // bdm -> Latn
-    {0xB4610000u, 55u}, // bdn -> Latn
-    {0xB8610000u, 55u}, // bdo -> Latn
-    {0xBC610000u, 55u}, // bdp -> Latn
-    {0xC0610000u, 55u}, // bdq -> Latn
-    {0xC4610000u, 55u}, // bdr -> Latn
-    {0xC8610000u, 55u}, // bds -> Latn
-    {0xCC610000u, 55u}, // bdt -> Latn
-    {0xD0610000u, 55u}, // bdu -> Latn
-    {0xD4610000u, 80u}, // bdv -> Orya
-    {0xD8610000u, 55u}, // bdw -> Latn
-    {0xDC610000u, 55u}, // bdx -> Latn
-    {0xE0610000u, 55u}, // bdy -> Latn
-    {0xE4610000u,  2u}, // bdz -> Arab
-    {0x62650000u, 20u}, // be -> Cyrl
-    {0x80810000u, 55u}, // bea -> Latn
-    {0x84810000u, 55u}, // beb -> Latn
-    {0x88810000u, 55u}, // bec -> Latn
-    {0x8C810000u, 55u}, // bed -> Latn
-    {0x90810000u, 21u}, // bee -> Deva
-    {0x94810000u, 55u}, // bef -> Latn
-    {0x9C810000u, 55u}, // beh -> Latn
-    {0xA0810000u, 55u}, // bei -> Latn
-    {0xA4810000u,  2u}, // bej -> Arab
-    {0xA8810000u, 55u}, // bek -> Latn
-    {0xB0810000u, 55u}, // bem -> Latn
-    {0xB8810000u, 55u}, // beo -> Latn
-    {0xBC810000u, 55u}, // bep -> Latn
-    {0xC0810000u, 55u}, // beq -> Latn
-    {0xC8810000u, 55u}, // bes -> Latn
-    {0xCC810000u, 55u}, // bet -> Latn
-    {0xD0810000u, 55u}, // beu -> Latn
-    {0xD4810000u, 55u}, // bev -> Latn
-    {0xD8810000u, 55u}, // bew -> Latn
-    {0xDC810000u, 55u}, // bex -> Latn
-    {0xE0810000u, 55u}, // bey -> Latn
-    {0xE4810000u, 55u}, // bez -> Latn
-    {0x80A10000u, 55u}, // bfa -> Latn
-    {0x84A10000u, 21u}, // bfb -> Deva
-    {0x88A10000u, 55u}, // bfc -> Latn
-    {0x8CA10000u, 55u}, // bfd -> Latn
-    {0x90A10000u, 55u}, // bfe -> Latn
-    {0x94A10000u, 55u}, // bff -> Latn
-    {0x98A10000u, 55u}, // bfg -> Latn
-    {0x9CA10000u, 55u}, // bfh -> Latn
-    {0xA4A10000u, 55u}, // bfj -> Latn
-    {0xACA10000u, 55u}, // bfl -> Latn
-    {0xB0A10000u, 55u}, // bfm -> Latn
-    {0xB4A10000u, 55u}, // bfn -> Latn
-    {0xB8A10000u, 55u}, // bfo -> Latn
-    {0xBCA10000u, 55u}, // bfp -> Latn
-    {0xC0A10000u, 105u}, // bfq -> Taml
-    {0xC8A10000u, 55u}, // bfs -> Latn
-    {0xCCA10000u,  2u}, // bft -> Arab
-    {0xD0A10000u, 112u}, // bfu -> Tibt
-    {0xD8A10000u, 80u}, // bfw -> Orya
-    {0xDCA10000u, 55u}, // bfx -> Latn
-    {0xE0A10000u, 21u}, // bfy -> Deva
-    {0xE4A10000u, 21u}, // bfz -> Deva
-    {0x62670000u, 20u}, // bg -> Cyrl
-    {0x80C10000u, 55u}, // bga -> Latn
-    {0x84C10000u, 55u}, // bgb -> Latn
-    {0x88C10000u, 21u}, // bgc -> Deva
-    {0x8CC10000u, 21u}, // bgd -> Deva
-    {0x94C10000u, 55u}, // bgf -> Latn
-    {0x98C10000u, 55u}, // bgg -> Latn
-    {0xA0C10000u, 55u}, // bgi -> Latn
-    {0xA4C10000u, 55u}, // bgj -> Latn
-    {0xB4C10000u,  2u}, // bgn -> Arab
-    {0xB8C10000u, 55u}, // bgo -> Latn
-    {0xBCC10000u,  2u}, // bgp -> Arab
-    {0xC0C10000u, 21u}, // bgq -> Deva
-    {0xC4C10000u, 55u}, // bgr -> Latn
-    {0xC8C10000u, 55u}, // bgs -> Latn
-    {0xCCC10000u, 55u}, // bgt -> Latn
-    {0xD0C10000u, 55u}, // bgu -> Latn
-    {0xD4C10000u, 55u}, // bgv -> Latn
-    {0xD8C10000u, 21u}, // bgw -> Deva
-    {0xDCC10000u, 30u}, // bgx -> Grek
-    {0xE0C10000u, 55u}, // bgy -> Latn
-    {0xE4C10000u, 55u}, // bgz -> Latn
-    {0x80E10000u, 21u}, // bha -> Deva
-    {0x84E10000u, 21u}, // bhb -> Deva
-    {0x88E10000u, 55u}, // bhc -> Latn
-    {0x8CE10000u, 21u}, // bhd -> Deva
-    {0x90E10000u,  2u}, // bhe -> Arab
-    {0x94E10000u, 55u}, // bhf -> Latn
-    {0x98E10000u, 55u}, // bhg -> Latn
-    {0x9CE10000u, 20u}, // bhh -> Cyrl
-    {0xA0E10000u, 21u}, // bhi -> Deva
-    {0xA4E10000u, 21u}, // bhj -> Deva
-    {0xACE10000u, 55u}, // bhl -> Latn
-    {0xB0E10000u,  2u}, // bhm -> Arab
-    {0xB4E10000u, 100u}, // bhn -> Syrc
-    {0xB8E10000u, 21u}, // bho -> Deva
-    {0xBCE10000u, 55u}, // bhp -> Latn
-    {0xC0E10000u, 55u}, // bhq -> Latn
-    {0xC4E10000u, 55u}, // bhr -> Latn
-    {0xC8E10000u, 55u}, // bhs -> Latn
-    {0xCCE10000u, 21u}, // bht -> Deva
-    {0xD0E10000u, 21u}, // bhu -> Deva
-    {0xD4E10000u, 55u}, // bhv -> Latn
-    {0xD8E10000u, 55u}, // bhw -> Latn
-    {0xE0E10000u, 55u}, // bhy -> Latn
-    {0xE4E10000u, 55u}, // bhz -> Latn
-    {0x62690000u, 55u}, // bi -> Latn
-    {0x81010000u, 55u}, // bia -> Latn
-    {0x85010000u, 55u}, // bib -> Latn
-    {0x8D010000u, 55u}, // bid -> Latn
-    {0x91010000u, 55u}, // bie -> Latn
-    {0x95010000u, 55u}, // bif -> Latn
-    {0x99010000u, 55u}, // big -> Latn
-    {0xA9010000u, 55u}, // bik -> Latn
-    {0xAD010000u, 55u}, // bil -> Latn
-    {0xB1010000u, 55u}, // bim -> Latn
-    {0xB5010000u, 55u}, // bin -> Latn
-    {0xB9010000u, 55u}, // bio -> Latn
-    {0xBD010000u, 55u}, // bip -> Latn
-    {0xC1010000u, 55u}, // biq -> Latn
-    {0xC5010000u, 55u}, // bir -> Latn
-    {0xCD010000u, 55u}, // bit -> Latn
-    {0xD1010000u, 55u}, // biu -> Latn
-    {0xD5010000u, 55u}, // biv -> Latn
-    {0xD9010000u, 55u}, // biw -> Latn
-    {0xE1010000u, 21u}, // biy -> Deva
-    {0xE5010000u, 55u}, // biz -> Latn
-    {0x81210000u, 55u}, // bja -> Latn
-    {0x85210000u, 55u}, // bjb -> Latn
-    {0x89210000u, 55u}, // bjc -> Latn
-    {0x95210000u, 100u}, // bjf -> Syrc
-    {0x99210000u, 55u}, // bjg -> Latn
-    {0x9D210000u, 55u}, // bjh -> Latn
-    {0xA1210000u, 55u}, // bji -> Latn
-    {0xA5210000u, 21u}, // bjj -> Deva
-    {0xA9210000u, 55u}, // bjk -> Latn
-    {0xAD210000u, 55u}, // bjl -> Latn
-    {0xB1210000u,  2u}, // bjm -> Arab
-    {0xB5210000u, 55u}, // bjn -> Latn
-    {0xB9210000u, 55u}, // bjo -> Latn
-    {0xBD210000u, 55u}, // bjp -> Latn
-    {0xC5210000u, 55u}, // bjr -> Latn
-    {0xC9210000u, 55u}, // bjs -> Latn
-    {0xCD210000u, 55u}, // bjt -> Latn
-    {0xD1210000u, 55u}, // bju -> Latn
-    {0xD5210000u, 55u}, // bjv -> Latn
-    {0xD9210000u, 55u}, // bjw -> Latn
-    {0xDD210000u, 55u}, // bjx -> Latn
-    {0xE1210000u, 55u}, // bjy -> Latn
-    {0xE5210000u, 55u}, // bjz -> Latn
-    {0x81410000u, 55u}, // bka -> Latn
-    {0x89410000u, 55u}, // bkc -> Latn
-    {0x8D410000u, 55u}, // bkd -> Latn
-    {0x95410000u, 55u}, // bkf -> Latn
-    {0x99410000u, 55u}, // bkg -> Latn
-    {0x9D410000u, 55u}, // bkh -> Latn
-    {0xA1410000u, 55u}, // bki -> Latn
-    {0xA5410000u, 55u}, // bkj -> Latn
-    {0xA9410000u, 112u}, // bkk -> Tibt
-    {0xAD410000u, 55u}, // bkl -> Latn
-    {0xB1410000u, 55u}, // bkm -> Latn
-    {0xB5410000u, 55u}, // bkn -> Latn
-    {0xB9410000u, 55u}, // bko -> Latn
-    {0xBD410000u, 55u}, // bkp -> Latn
-    {0xC1410000u, 55u}, // bkq -> Latn
-    {0xC5410000u, 55u}, // bkr -> Latn
-    {0xC9410000u, 55u}, // bks -> Latn
-    {0xCD410000u, 55u}, // bkt -> Latn
-    {0xD1410000u, 55u}, // bku -> Latn
-    {0xD5410000u, 55u}, // bkv -> Latn
-    {0xD9410000u, 55u}, // bkw -> Latn
-    {0xDD410000u, 55u}, // bkx -> Latn
-    {0xE1410000u, 55u}, // bky -> Latn
-    {0xE5410000u, 55u}, // bkz -> Latn
-    {0x81610000u, 55u}, // bla -> Latn
-    {0x85610000u, 55u}, // blb -> Latn
-    {0x89610000u, 55u}, // blc -> Latn
-    {0x8D610000u, 55u}, // bld -> Latn
-    {0x91610000u, 55u}, // ble -> Latn
-    {0x95610000u, 55u}, // blf -> Latn
-    {0x9D610000u, 55u}, // blh -> Latn
-    {0xA1610000u, 55u}, // bli -> Latn
-    {0xA5610000u, 55u}, // blj -> Latn
-    {0xA9610000u, 72u}, // blk -> Mymr
-    {0xB1610000u, 55u}, // blm -> Latn
-    {0xB5610000u, 55u}, // bln -> Latn
-    {0xB9610000u, 55u}, // blo -> Latn
-    {0xBD610000u, 55u}, // blp -> Latn
-    {0xC1610000u, 55u}, // blq -> Latn
-    {0xC5610000u, 55u}, // blr -> Latn
-    {0xC9610000u, 55u}, // bls -> Latn
-    {0xCD610000u, 107u}, // blt -> Tavt
-    {0xD5610000u, 55u}, // blv -> Latn
-    {0xD9610000u, 55u}, // blw -> Latn
-    {0xDD610000u, 55u}, // blx -> Latn
-    {0xE1610000u, 55u}, // bly -> Latn
-    {0xE5610000u, 55u}, // blz -> Latn
-    {0x626D0000u, 55u}, // bm -> Latn
-    {0x81810000u, 55u}, // bma -> Latn
-    {0x85810000u, 55u}, // bmb -> Latn
-    {0x89810000u, 55u}, // bmc -> Latn
-    {0x8D810000u, 55u}, // bmd -> Latn
-    {0x91810000u, 55u}, // bme -> Latn
-    {0x95810000u, 55u}, // bmf -> Latn
-    {0x99810000u, 55u}, // bmg -> Latn
-    {0x9D810000u, 55u}, // bmh -> Latn
-    {0xA1810000u, 55u}, // bmi -> Latn
-    {0xA5810000u, 21u}, // bmj -> Deva
-    {0xA9810000u, 55u}, // bmk -> Latn
-    {0xAD810000u, 55u}, // bml -> Latn
-    {0xB1810000u, 55u}, // bmm -> Latn
-    {0xB5810000u, 55u}, // bmn -> Latn
-    {0xB9810000u, 55u}, // bmo -> Latn
-    {0xBD810000u, 55u}, // bmp -> Latn
-    {0xC1810000u, 55u}, // bmq -> Latn
-    {0xC5810000u, 55u}, // bmr -> Latn
-    {0xC9810000u, 55u}, // bms -> Latn
-    {0xD1810000u, 55u}, // bmu -> Latn
-    {0xD5810000u, 55u}, // bmv -> Latn
-    {0xD9810000u, 55u}, // bmw -> Latn
-    {0xDD810000u, 55u}, // bmx -> Latn
-    {0xE5810000u, 55u}, // bmz -> Latn
-    {0x626E0000u,  9u}, // bn -> Beng
-    {0x81A10000u, 55u}, // bna -> Latn
-    {0x85A10000u, 55u}, // bnb -> Latn
-    {0x89A10000u, 55u}, // bnc -> Latn
-    {0x8DA10000u, 55u}, // bnd -> Latn
-    {0x91A10000u, 55u}, // bne -> Latn
-    {0x95A10000u, 55u}, // bnf -> Latn
-    {0x99A10000u, 55u}, // bng -> Latn
-    {0xA1A10000u, 55u}, // bni -> Latn
-    {0xA5A10000u, 55u}, // bnj -> Latn
-    {0xA9A10000u, 55u}, // bnk -> Latn
-    {0xB1A10000u, 55u}, // bnm -> Latn
-    {0xB5A10000u, 55u}, // bnn -> Latn
-    {0xB9A10000u, 55u}, // bno -> Latn
-    {0xBDA10000u, 55u}, // bnp -> Latn
-    {0xC1A10000u, 55u}, // bnq -> Latn
-    {0xC5A10000u, 55u}, // bnr -> Latn
-    {0xC9A10000u, 21u}, // bns -> Deva
-    {0xD1A10000u, 55u}, // bnu -> Latn
-    {0xD5A10000u, 55u}, // bnv -> Latn
-    {0xD9A10000u, 55u}, // bnw -> Latn
-    {0xDDA10000u, 55u}, // bnx -> Latn
-    {0xE1A10000u, 55u}, // bny -> Latn
-    {0xE5A10000u, 55u}, // bnz -> Latn
-    {0x626F0000u, 112u}, // bo -> Tibt
-    {0x81C10000u, 55u}, // boa -> Latn
-    {0x85C10000u, 55u}, // bob -> Latn
-    {0x91C10000u, 55u}, // boe -> Latn
-    {0x95C10000u, 55u}, // bof -> Latn
-    {0x9DC10000u, 55u}, // boh -> Latn
-    {0xA5C10000u, 55u}, // boj -> Latn
-    {0xA9C10000u, 55u}, // bok -> Latn
-    {0xADC10000u, 55u}, // bol -> Latn
-    {0xB1C10000u, 55u}, // bom -> Latn
-    {0xB5C10000u, 55u}, // bon -> Latn
-    {0xB9C10000u, 55u}, // boo -> Latn
-    {0xBDC10000u, 55u}, // bop -> Latn
-    {0xC1C10000u, 55u}, // boq -> Latn
-    {0xC5C10000u, 55u}, // bor -> Latn
-    {0xCDC10000u, 55u}, // bot -> Latn
-    {0xD1C10000u, 55u}, // bou -> Latn
-    {0xD5C10000u, 55u}, // bov -> Latn
-    {0xD9C10000u, 55u}, // bow -> Latn
-    {0xDDC10000u, 55u}, // box -> Latn
-    {0xE1C10000u, 55u}, // boy -> Latn
-    {0xE5C10000u, 55u}, // boz -> Latn
-    {0x81E10000u, 55u}, // bpa -> Latn
-    {0x89E10000u, 55u}, // bpc -> Latn
-    {0x8DE10000u, 55u}, // bpd -> Latn
-    {0x91E10000u, 55u}, // bpe -> Latn
-    {0x99E10000u, 55u}, // bpg -> Latn
-    {0x9DE10000u, 20u}, // bph -> Cyrl
-    {0xA1E10000u, 55u}, // bpi -> Latn
-    {0xA5E10000u, 55u}, // bpj -> Latn
-    {0xA9E10000u, 55u}, // bpk -> Latn
-    {0xADE10000u, 55u}, // bpl -> Latn
-    {0xB1E10000u, 55u}, // bpm -> Latn
-    {0xB9E10000u, 55u}, // bpo -> Latn
-    {0xBDE10000u, 55u}, // bpp -> Latn
-    {0xC1E10000u, 55u}, // bpq -> Latn
-    {0xC5E10000u, 55u}, // bpr -> Latn
-    {0xC9E10000u, 55u}, // bps -> Latn
-    {0xCDE10000u, 55u}, // bpt -> Latn
-    {0xD1E10000u, 55u}, // bpu -> Latn
-    {0xD5E10000u, 55u}, // bpv -> Latn
-    {0xD9E10000u, 55u}, // bpw -> Latn
-    {0xDDE10000u, 21u}, // bpx -> Deva
-    {0xE1E10000u,  9u}, // bpy -> Beng
-    {0xE5E10000u, 55u}, // bpz -> Latn
-    {0x82010000u, 55u}, // bqa -> Latn
-    {0x86010000u, 55u}, // bqb -> Latn
-    {0x8A010000u, 55u}, // bqc -> Latn
-    {0x8E010000u, 55u}, // bqd -> Latn
-    {0x96010000u, 55u}, // bqf -> Latn
-    {0x9A010000u, 55u}, // bqg -> Latn
-    {0xA2010000u,  2u}, // bqi -> Arab
-    {0xA6010000u, 55u}, // bqj -> Latn
-    {0xAA010000u, 55u}, // bqk -> Latn
-    {0xAE010000u, 55u}, // bql -> Latn
-    {0xB2010000u, 55u}, // bqm -> Latn
-    {0xBA010000u, 55u}, // bqo -> Latn
-    {0xBE010000u, 55u}, // bqp -> Latn
-    {0xC2010000u, 55u}, // bqq -> Latn
-    {0xC6010000u, 55u}, // bqr -> Latn
-    {0xCA010000u, 55u}, // bqs -> Latn
-    {0xCE010000u, 55u}, // bqt -> Latn
-    {0xD2010000u, 55u}, // bqu -> Latn
-    {0xD6010000u, 55u}, // bqv -> Latn
-    {0xDA010000u, 55u}, // bqw -> Latn
-    {0xDE010000u, 55u}, // bqx -> Latn
-    {0xE6010000u, 55u}, // bqz -> Latn
-    {0x62720000u, 55u}, // br -> Latn
-    {0x82210000u, 21u}, // bra -> Deva
-    {0x86210000u, 47u}, // brb -> Khmr
-    {0x8A210000u, 55u}, // brc -> Latn
-    {0x8E210000u, 21u}, // brd -> Deva
-    {0x96210000u, 55u}, // brf -> Latn
-    {0x9A210000u, 55u}, // brg -> Latn
-    {0x9E210000u,  2u}, // brh -> Arab
-    {0xA2210000u, 55u}, // bri -> Latn
-    {0xA6210000u, 55u}, // brj -> Latn
-    {0xAA210000u,  2u}, // brk -> Arab
-    {0xAE210000u, 55u}, // brl -> Latn
-    {0xB2210000u, 55u}, // brm -> Latn
-    {0xB6210000u, 55u}, // brn -> Latn
-    {0xBA210000u, 112u}, // bro -> Tibt
-    {0xBE210000u, 55u}, // brp -> Latn
-    {0xC2210000u, 55u}, // brq -> Latn
-    {0xC6210000u, 55u}, // brr -> Latn
-    {0xCA210000u, 55u}, // brs -> Latn
-    {0xCE210000u, 55u}, // brt -> Latn
-    {0xD2210000u, 55u}, // bru -> Latn
-    {0xD6210000u, 52u}, // brv -> Laoo
-    {0xDA210000u, 49u}, // brw -> Knda
-    {0xDE210000u, 21u}, // brx -> Deva
-    {0xE2210000u, 55u}, // bry -> Latn
-    {0xE6210000u, 55u}, // brz -> Latn
-    {0x62730000u, 55u}, // bs -> Latn
-    {0x82410000u, 55u}, // bsa -> Latn
-    {0x86410000u, 55u}, // bsb -> Latn
-    {0x8A410000u, 55u}, // bsc -> Latn
-    {0x92410000u, 55u}, // bse -> Latn
-    {0x96410000u, 55u}, // bsf -> Latn
-    {0x9E410000u,  2u}, // bsh -> Arab
-    {0xA2410000u, 55u}, // bsi -> Latn
-    {0xA6410000u, 55u}, // bsj -> Latn
-    {0xAA410000u,  2u}, // bsk -> Arab
-    {0xAE410000u, 55u}, // bsl -> Latn
-    {0xB2410000u, 55u}, // bsm -> Latn
-    {0xB6410000u, 55u}, // bsn -> Latn
-    {0xBA410000u, 55u}, // bso -> Latn
-    {0xBE410000u, 55u}, // bsp -> Latn
-    {0xC2410000u,  7u}, // bsq -> Bass
-    {0xC6410000u, 55u}, // bsr -> Latn
-    {0xCA410000u, 55u}, // bss -> Latn
-    {0xCE410000u, 24u}, // bst -> Ethi
-    {0xD2410000u, 55u}, // bsu -> Latn
-    {0xD6410000u, 55u}, // bsv -> Latn
-    {0xDA410000u, 55u}, // bsw -> Latn
-    {0xDE410000u, 55u}, // bsx -> Latn
-    {0xE2410000u, 55u}, // bsy -> Latn
-    {0x82610000u, 55u}, // bta -> Latn
-    {0x8A610000u, 55u}, // btc -> Latn
-    {0x8E610000u,  8u}, // btd -> Batk
-    {0x92610000u, 55u}, // bte -> Latn
-    {0x96610000u, 55u}, // btf -> Latn
-    {0x9A610000u, 55u}, // btg -> Latn
-    {0x9E610000u, 55u}, // bth -> Latn
-    {0xA2610000u, 55u}, // bti -> Latn
-    {0xA6610000u, 55u}, // btj -> Latn
-    {0xB2610000u,  8u}, // btm -> Batk
-    {0xB6610000u, 55u}, // btn -> Latn
-    {0xBA610000u, 55u}, // bto -> Latn
-    {0xBE610000u, 55u}, // btp -> Latn
-    {0xC2610000u, 55u}, // btq -> Latn
-    {0xC6610000u, 55u}, // btr -> Latn
-    {0xCA610000u, 55u}, // bts -> Latn
-    {0xCE610000u, 55u}, // btt -> Latn
-    {0xD2610000u, 55u}, // btu -> Latn
-    {0xD6610000u, 21u}, // btv -> Deva
-    {0xDA610000u, 55u}, // btw -> Latn
-    {0xDE610000u, 55u}, // btx -> Latn
-    {0xE2610000u, 55u}, // bty -> Latn
-    {0xE6610000u, 55u}, // btz -> Latn
-    {0x82810000u, 20u}, // bua -> Cyrl
-    {0x86810000u, 55u}, // bub -> Latn
-    {0x8A810000u, 55u}, // buc -> Latn
-    {0x8E810000u, 55u}, // bud -> Latn
-    {0x92810000u, 55u}, // bue -> Latn
-    {0x96810000u, 55u}, // buf -> Latn
-    {0x9A810000u, 55u}, // bug -> Latn
-    {0x9E810000u, 55u}, // buh -> Latn
-    {0xA2810000u, 55u}, // bui -> Latn
-    {0xA6810000u, 55u}, // buj -> Latn
-    {0xAA810000u, 55u}, // buk -> Latn
-    {0xB2810000u, 55u}, // bum -> Latn
-    {0xB6810000u, 55u}, // bun -> Latn
-    {0xBA810000u, 55u}, // buo -> Latn
-    {0xBE810000u, 55u}, // bup -> Latn
-    {0xC2810000u, 55u}, // buq -> Latn
-    {0xCA810000u, 55u}, // bus -> Latn
-    {0xCE810000u, 55u}, // but -> Latn
-    {0xD2810000u, 55u}, // buu -> Latn
-    {0xD6810000u, 55u}, // buv -> Latn
-    {0xDA810000u, 55u}, // buw -> Latn
-    {0xDE810000u, 55u}, // bux -> Latn
-    {0xE2810000u, 55u}, // buy -> Latn
-    {0xE6810000u, 55u}, // buz -> Latn
-    {0x82A10000u, 55u}, // bva -> Latn
-    {0x86A10000u, 55u}, // bvb -> Latn
-    {0x8AA10000u, 55u}, // bvc -> Latn
-    {0x8EA10000u, 55u}, // bvd -> Latn
-    {0x92A10000u, 55u}, // bve -> Latn
-    {0x96A10000u, 55u}, // bvf -> Latn
-    {0x9AA10000u, 55u}, // bvg -> Latn
-    {0x9EA10000u, 55u}, // bvh -> Latn
-    {0xA2A10000u, 55u}, // bvi -> Latn
-    {0xA6A10000u, 55u}, // bvj -> Latn
-    {0xAAA10000u, 55u}, // bvk -> Latn
-    {0xB2A10000u, 55u}, // bvm -> Latn
-    {0xB6A10000u, 55u}, // bvn -> Latn
-    {0xBAA10000u, 55u}, // bvo -> Latn
-    {0xC2A10000u, 55u}, // bvq -> Latn
-    {0xC6A10000u, 55u}, // bvr -> Latn
-    {0xCEA10000u, 55u}, // bvt -> Latn
-    {0xD2A10000u, 55u}, // bvu -> Latn
-    {0xD6A10000u, 55u}, // bvv -> Latn
-    {0xDAA10000u, 55u}, // bvw -> Latn
-    {0xDEA10000u, 55u}, // bvx -> Latn
-    {0xE2A10000u, 55u}, // bvy -> Latn
-    {0xE6A10000u, 55u}, // bvz -> Latn
-    {0x82C10000u, 55u}, // bwa -> Latn
-    {0x86C10000u, 55u}, // bwb -> Latn
-    {0x8AC10000u, 55u}, // bwc -> Latn
-    {0x8EC10000u, 55u}, // bwd -> Latn
-    {0x92C10000u, 72u}, // bwe -> Mymr
-    {0x96C10000u, 55u}, // bwf -> Latn
-    {0x9AC10000u, 55u}, // bwg -> Latn
-    {0x9EC10000u, 55u}, // bwh -> Latn
-    {0xA2C10000u, 55u}, // bwi -> Latn
-    {0xA6C10000u, 55u}, // bwj -> Latn
-    {0xAAC10000u, 55u}, // bwk -> Latn
-    {0xAEC10000u, 55u}, // bwl -> Latn
-    {0xB2C10000u, 55u}, // bwm -> Latn
-    {0xBAC10000u, 55u}, // bwo -> Latn
-    {0xBEC10000u, 55u}, // bwp -> Latn
-    {0xC2C10000u, 55u}, // bwq -> Latn
-    {0xC6C10000u, 55u}, // bwr -> Latn
-    {0xCAC10000u, 55u}, // bws -> Latn
-    {0xCEC10000u, 55u}, // bwt -> Latn
-    {0xD2C10000u, 55u}, // bwu -> Latn
-    {0xDAC10000u, 55u}, // bww -> Latn
-    {0xDEC10000u, 55u}, // bwx -> Latn
-    {0xE2C10000u, 55u}, // bwy -> Latn
-    {0xE6C10000u, 55u}, // bwz -> Latn
-    {0x82E10000u, 55u}, // bxa -> Latn
-    {0x86E10000u, 55u}, // bxb -> Latn
-    {0x8AE10000u, 55u}, // bxc -> Latn
-    {0x96E10000u, 55u}, // bxf -> Latn
-    {0x9AE10000u, 55u}, // bxg -> Latn
-    {0x9EE10000u, 55u}, // bxh -> Latn
-    {0xA2E10000u, 55u}, // bxi -> Latn
-    {0xA6E10000u, 55u}, // bxj -> Latn
-    {0xAEE10000u, 55u}, // bxl -> Latn
-    {0xB2E10000u, 20u}, // bxm -> Cyrl
-    {0xB6E10000u, 55u}, // bxn -> Latn
-    {0xBAE10000u, 55u}, // bxo -> Latn
-    {0xBEE10000u, 55u}, // bxp -> Latn
-    {0xC2E10000u, 55u}, // bxq -> Latn
-    {0xCAE10000u, 55u}, // bxs -> Latn
-    {0xD2E10000u, 69u}, // bxu -> Mong
-    {0xD6E10000u, 55u}, // bxv -> Latn
-    {0xDAE10000u, 55u}, // bxw -> Latn
-    {0xE6E10000u, 55u}, // bxz -> Latn
-    {0x83010000u, 55u}, // bya -> Latn
-    {0x87010000u, 55u}, // byb -> Latn
-    {0x8B010000u, 55u}, // byc -> Latn
-    {0x8F010000u, 55u}, // byd -> Latn
-    {0x93010000u, 55u}, // bye -> Latn
-    {0x97010000u, 55u}, // byf -> Latn
-    {0x9F010000u, 21u}, // byh -> Deva
-    {0xA3010000u, 55u}, // byi -> Latn
-    {0xA7010000u, 55u}, // byj -> Latn
-    {0xAB010000u, 55u}, // byk -> Latn
-    {0xAF010000u, 55u}, // byl -> Latn
-    {0xB3010000u, 55u}, // bym -> Latn
-    {0xB7010000u, 24u}, // byn -> Ethi
-    {0xBF010000u, 55u}, // byp -> Latn
-    {0xC7010000u, 55u}, // byr -> Latn
-    {0xCB010000u, 55u}, // bys -> Latn
-    {0xD7010000u, 55u}, // byv -> Latn
-    {0xDB010000u, 21u}, // byw -> Deva
-    {0xDF010000u, 55u}, // byx -> Latn
-    {0xE7010000u, 55u}, // byz -> Latn
-    {0x83210000u, 55u}, // bza -> Latn
-    {0x87210000u, 55u}, // bzb -> Latn
-    {0x8B210000u, 55u}, // bzc -> Latn
-    {0x8F210000u, 55u}, // bzd -> Latn
-    {0x93210000u, 55u}, // bze -> Latn
-    {0x97210000u, 55u}, // bzf -> Latn
-    {0x9F210000u, 55u}, // bzh -> Latn
-    {0xA3210000u, 111u}, // bzi -> Thai
-    {0xA7210000u, 55u}, // bzj -> Latn
-    {0xAB210000u, 55u}, // bzk -> Latn
-    {0xAF210000u, 55u}, // bzl -> Latn
-    {0xB3210000u, 55u}, // bzm -> Latn
-    {0xB7210000u, 55u}, // bzn -> Latn
-    {0xBB210000u, 55u}, // bzo -> Latn
-    {0xBF210000u, 55u}, // bzp -> Latn
-    {0xC3210000u, 55u}, // bzq -> Latn
-    {0xC7210000u, 55u}, // bzr -> Latn
-    {0xCF210000u, 55u}, // bzt -> Latn
-    {0xD3210000u, 55u}, // bzu -> Latn
-    {0xD7210000u, 55u}, // bzv -> Latn
-    {0xDB210000u, 55u}, // bzw -> Latn
-    {0xDF210000u, 55u}, // bzx -> Latn
-    {0xE3210000u, 55u}, // bzy -> Latn
-    {0xE7210000u, 55u}, // bzz -> Latn
-    {0x63610000u, 55u}, // ca -> Latn
-    {0x80020000u, 55u}, // caa -> Latn
-    {0x84020000u, 55u}, // cab -> Latn
-    {0x88020000u, 55u}, // cac -> Latn
-    {0x8C020000u, 55u}, // cad -> Latn
-    {0x90020000u, 55u}, // cae -> Latn
-    {0x94020000u, 55u}, // caf -> Latn
-    {0x98020000u, 55u}, // cag -> Latn
-    {0x9C020000u, 55u}, // cah -> Latn
-    {0xA4020000u, 55u}, // caj -> Latn
-    {0xA8020000u, 55u}, // cak -> Latn
-    {0xAC020000u, 55u}, // cal -> Latn
-    {0xB0020000u, 55u}, // cam -> Latn
-    {0xB4020000u, 55u}, // can -> Latn
-    {0xB8020000u, 55u}, // cao -> Latn
-    {0xBC020000u, 55u}, // cap -> Latn
-    {0xC0020000u, 55u}, // caq -> Latn
-    {0xC4020000u, 55u}, // car -> Latn
-    {0xC8020000u, 55u}, // cas -> Latn
-    {0xD4020000u, 55u}, // cav -> Latn
-    {0xD8020000u, 55u}, // caw -> Latn
-    {0xDC020000u, 55u}, // cax -> Latn
-    {0xE0020000u, 55u}, // cay -> Latn
-    {0xE4020000u, 55u}, // caz -> Latn
-    {0x84220000u, 55u}, // cbb -> Latn
-    {0x88220000u, 55u}, // cbc -> Latn
-    {0x8C220000u, 55u}, // cbd -> Latn
-    {0x98220000u, 55u}, // cbg -> Latn
-    {0xA0220000u, 55u}, // cbi -> Latn
-    {0xA4220000u, 55u}, // cbj -> Latn
-    {0xA8220000u, 55u}, // cbk -> Latn
-    {0xAC220000u, 55u}, // cbl -> Latn
-    {0xB4220000u, 111u}, // cbn -> Thai
-    {0xB8220000u, 55u}, // cbo -> Latn
-    {0xC0220000u, 55u}, // cbq -> Latn
-    {0xC4220000u, 55u}, // cbr -> Latn
-    {0xC8220000u, 55u}, // cbs -> Latn
-    {0xCC220000u, 55u}, // cbt -> Latn
-    {0xD0220000u, 55u}, // cbu -> Latn
-    {0xD4220000u, 55u}, // cbv -> Latn
-    {0xD8220000u, 55u}, // cbw -> Latn
-    {0xE0220000u, 55u}, // cby -> Latn
-    {0x88420000u, 55u}, // ccc -> Latn
-    {0x8C420000u, 55u}, // ccd -> Latn
-    {0x90420000u, 55u}, // cce -> Latn
-    {0x98420000u, 55u}, // ccg -> Latn
-    {0x9C420000u, 55u}, // cch -> Latn
-    {0xA4420000u, 55u}, // ccj -> Latn
-    {0xAC420000u, 55u}, // ccl -> Latn
-    {0xB0420000u, 55u}, // ccm -> Latn
-    {0xB8420000u, 55u}, // cco -> Latn
-    {0xBC420000u, 12u}, // ccp -> Cakm
-    {0xC4420000u, 55u}, // ccr -> Latn
-    {0x90620000u, 108u}, // cde -> Telu
-    {0x94620000u, 55u}, // cdf -> Latn
-    {0x9C620000u, 21u}, // cdh -> Deva
-    {0xA0620000u, 31u}, // cdi -> Gujr
-    {0xA4620000u, 21u}, // cdj -> Deva
-    {0xB0620000u, 21u}, // cdm -> Deva
-    {0xB8620000u, 35u}, // cdo -> Hans
-    {0xC4620000u, 55u}, // cdr -> Latn
-    {0xE4620000u,  9u}, // cdz -> Beng
-    {0x63650000u, 20u}, // ce -> Cyrl
-    {0x80820000u, 55u}, // cea -> Latn
-    {0x84820000u, 55u}, // ceb -> Latn
-    {0x98820000u, 55u}, // ceg -> Latn
-    {0xA8820000u, 55u}, // cek -> Latn
-    {0xB4820000u, 55u}, // cen -> Latn
-    {0xCC820000u, 55u}, // cet -> Latn
-    {0xE0820000u, 55u}, // cey -> Latn
-    {0x80A20000u, 55u}, // cfa -> Latn
-    {0x8CA20000u, 55u}, // cfd -> Latn
-    {0x98A20000u, 55u}, // cfg -> Latn
-    {0xB0A20000u, 55u}, // cfm -> Latn
-    {0x80C20000u, 55u}, // cga -> Latn
-    {0x88C20000u, 55u}, // cgc -> Latn
-    {0x98C20000u, 55u}, // cgg -> Latn
-    {0xA8C20000u, 112u}, // cgk -> Tibt
-    {0x63680000u, 55u}, // ch -> Latn
-    {0x84E20000u, 55u}, // chb -> Latn
-    {0x8CE20000u, 55u}, // chd -> Latn
-    {0x94E20000u, 55u}, // chf -> Latn
-    {0x98E20000u,  2u}, // chg -> Arab
-    {0x9CE20000u, 55u}, // chh -> Latn
-    {0xA4E20000u, 55u}, // chj -> Latn
-    {0xA8E20000u, 55u}, // chk -> Latn
-    {0xACE20000u, 55u}, // chl -> Latn
-    {0xB0E20000u, 20u}, // chm -> Cyrl
-    {0xB4E20000u, 55u}, // chn -> Latn
-    {0xB8E20000u, 55u}, // cho -> Latn
-    {0xBCE20000u, 55u}, // chp -> Latn
-    {0xC0E20000u, 55u}, // chq -> Latn
-    {0xC4E20000u, 16u}, // chr -> Cher
-    {0xCCE20000u, 55u}, // cht -> Latn
-    {0xD8E20000u, 55u}, // chw -> Latn
-    {0xDCE20000u, 21u}, // chx -> Deva
-    {0xE0E20000u, 55u}, // chy -> Latn
-    {0xE4E20000u, 55u}, // chz -> Latn
-    {0x81020000u, 55u}, // cia -> Latn
-    {0x85020000u, 55u}, // cib -> Latn
-    {0x89020000u, 55u}, // cic -> Latn
-    {0x91020000u, 55u}, // cie -> Latn
-    {0x9D020000u, 21u}, // cih -> Deva
-    {0xB1020000u, 55u}, // cim -> Latn
-    {0xB5020000u, 55u}, // cin -> Latn
-    {0xBD020000u, 55u}, // cip -> Latn
-    {0xC5020000u, 55u}, // cir -> Latn
-    {0xD9020000u, 55u}, // ciw -> Latn
-    {0xE1020000u, 55u}, // ciy -> Latn
-    {0x81220000u,  2u}, // cja -> Arab
-    {0x91220000u, 55u}, // cje -> Latn
-    {0x9D220000u, 55u}, // cjh -> Latn
-    {0xA1220000u, 20u}, // cji -> Cyrl
-    {0xA9220000u, 55u}, // cjk -> Latn
-    {0xB1220000u, 15u}, // cjm -> Cham
-    {0xB5220000u, 55u}, // cjn -> Latn
-    {0xB9220000u, 55u}, // cjo -> Latn
-    {0xBD220000u, 55u}, // cjp -> Latn
-    {0xC9220000u, 55u}, // cjs -> Latn
-    {0xD5220000u, 55u}, // cjv -> Latn
-    {0xE1220000u, 35u}, // cjy -> Hans
-    {0x85420000u,  2u}, // ckb -> Arab
-    {0xAD420000u, 55u}, // ckl -> Latn
-    {0xB1420000u, 55u}, // ckm -> Latn
-    {0xB5420000u, 55u}, // ckn -> Latn
-    {0xB9420000u, 55u}, // cko -> Latn
-    {0xC1420000u, 55u}, // ckq -> Latn
-    {0xC5420000u, 55u}, // ckr -> Latn
-    {0xC9420000u, 55u}, // cks -> Latn
-    {0xCD420000u, 20u}, // ckt -> Cyrl
-    {0xD1420000u, 55u}, // cku -> Latn
-    {0xD5420000u, 55u}, // ckv -> Latn
-    {0xDD420000u, 55u}, // ckx -> Latn
-    {0xE1420000u, 55u}, // cky -> Latn
-    {0xE5420000u, 55u}, // ckz -> Latn
-    {0x81620000u, 55u}, // cla -> Latn
-    {0x89620000u, 55u}, // clc -> Latn
-    {0x91620000u, 55u}, // cle -> Latn
-    {0x9D620000u,  2u}, // clh -> Arab
-    {0xA1620000u, 55u}, // cli -> Latn
-    {0xA5620000u, 55u}, // clj -> Latn
-    {0xA9620000u, 55u}, // clk -> Latn
-    {0xAD620000u, 55u}, // cll -> Latn
-    {0xB1620000u, 55u}, // clm -> Latn
-    {0xB9620000u, 55u}, // clo -> Latn
-    {0xCD620000u, 55u}, // clt -> Latn
-    {0xD1620000u, 55u}, // clu -> Latn
-    {0xD9620000u, 20u}, // clw -> Cyrl
-    {0xE1620000u, 55u}, // cly -> Latn
-    {0x81820000u, 55u}, // cma -> Latn
-    {0x91820000u, 55u}, // cme -> Latn
-    {0x99820000u, 98u}, // cmg -> Soyo
-    {0xA1820000u, 55u}, // cmi -> Latn
-    {0xAD820000u, 55u}, // cml -> Latn
-    {0xB9820000u, 55u}, // cmo -> Latn
-    {0xC5820000u, 55u}, // cmr -> Latn
-    {0xC9820000u, 55u}, // cms -> Latn
-    {0xCD820000u, 55u}, // cmt -> Latn
-    {0x81A20000u, 112u}, // cna -> Tibt
-    {0x85A20000u, 55u}, // cnb -> Latn
-    {0x89A20000u, 55u}, // cnc -> Latn
-    {0x99A20000u, 55u}, // cng -> Latn
-    {0x9DA20000u, 55u}, // cnh -> Latn
-    {0xA1A20000u, 55u}, // cni -> Latn
-    {0xA9A20000u, 55u}, // cnk -> Latn
-    {0xADA20000u, 55u}, // cnl -> Latn
-    {0xBDA20000u, 35u}, // cnp -> Hans
-    {0xC1A20000u, 55u}, // cnq -> Latn
-    {0xC9A20000u, 55u}, // cns -> Latn
-    {0xCDA20000u, 55u}, // cnt -> Latn
-    {0xD9A20000u, 55u}, // cnw -> Latn
-    {0xDDA20000u, 55u}, // cnx -> Latn
-    {0x636F0000u, 55u}, // co -> Latn
-    {0x81C20000u, 55u}, // coa -> Latn
-    {0x85C20000u, 55u}, // cob -> Latn
-    {0x89C20000u, 55u}, // coc -> Latn
-    {0x8DC20000u, 55u}, // cod -> Latn
-    {0x91C20000u, 55u}, // coe -> Latn
-    {0x95C20000u, 55u}, // cof -> Latn
-    {0x99C20000u, 111u}, // cog -> Thai
-    {0x9DC20000u, 55u}, // coh -> Latn
-    {0xA5C20000u, 55u}, // coj -> Latn
-    {0xA9C20000u, 55u}, // cok -> Latn
-    {0xADC20000u, 55u}, // col -> Latn
-    {0xB1C20000u, 55u}, // com -> Latn
-    {0xB9C20000u, 55u}, // coo -> Latn
-    {0xBDC20000u, 18u}, // cop -> Copt
-    {0xC1C20000u, 55u}, // coq -> Latn
-    {0xCDC20000u, 55u}, // cot -> Latn
-    {0xD1C20000u, 55u}, // cou -> Latn
-    {0xDDC20000u, 55u}, // cox -> Latn
-    {0xE5C20000u, 55u}, // coz -> Latn
-    {0x81E20000u, 55u}, // cpa -> Latn
-    {0x85E20000u, 55u}, // cpb -> Latn
-    {0x89E20000u, 55u}, // cpc -> Latn
-    {0x99E20000u, 30u}, // cpg -> Grek
-    {0xA1E20000u, 55u}, // cpi -> Latn
-    {0xB5E20000u, 55u}, // cpn -> Latn
-    {0xB9E20000u, 55u}, // cpo -> Latn
-    {0xC9E20000u, 55u}, // cps -> Latn
-    {0xD1E20000u, 55u}, // cpu -> Latn
-    {0xDDE20000u, 55u}, // cpx -> Latn
-    {0xE1E20000u, 55u}, // cpy -> Latn
-    {0x8E020000u, 55u}, // cqd -> Latn
-    {0x63720000u, 13u}, // cr -> Cans
-    {0x82220000u, 55u}, // cra -> Latn
-    {0x86220000u, 55u}, // crb -> Latn
-    {0x8A220000u, 55u}, // crc -> Latn
-    {0x8E220000u, 55u}, // crd -> Latn
-    {0x96220000u, 55u}, // crf -> Latn
-    {0x9A220000u, 55u}, // crg -> Latn
-    {0x9E220000u, 20u}, // crh -> Cyrl
-    {0xA2220000u, 55u}, // cri -> Latn
-    {0xA6220000u, 13u}, // crj -> Cans
-    {0xAA220000u, 13u}, // crk -> Cans
-    {0xAE220000u, 13u}, // crl -> Cans
-    {0xB2220000u, 13u}, // crm -> Cans
-    {0xB6220000u, 55u}, // crn -> Latn
-    {0xBA220000u, 55u}, // cro -> Latn
-    {0xC2220000u, 55u}, // crq -> Latn
-    {0xCA220000u, 55u}, // crs -> Latn
-    {0xCE220000u, 55u}, // crt -> Latn
-    {0xD6220000u, 55u}, // crv -> Latn
-    {0xDA220000u, 55u}, // crw -> Latn
-    {0xDE220000u, 55u}, // crx -> Latn
-    {0xE2220000u, 55u}, // cry -> Latn
-    {0xE6220000u, 55u}, // crz -> Latn
-    {0x63730000u, 55u}, // cs -> Latn
-    {0x82420000u, 55u}, // csa -> Latn
-    {0x86420000u, 55u}, // csb -> Latn
-    {0x9E420000u, 72u}, // csh -> Mymr
-    {0xA6420000u, 55u}, // csj -> Latn
-    {0xAA420000u, 55u}, // csk -> Latn
-    {0xB2420000u, 55u}, // csm -> Latn
-    {0xBA420000u, 55u}, // cso -> Latn
-    {0xBE420000u, 35u}, // csp -> Hans
-    {0xCA420000u, 55u}, // css -> Latn
-    {0xCE420000u, 55u}, // cst -> Latn
-    {0xD6420000u, 55u}, // csv -> Latn
-    {0xDA420000u, 13u}, // csw -> Cans
-    {0xE2420000u, 55u}, // csy -> Latn
-    {0xE6420000u, 55u}, // csz -> Latn
-    {0x82620000u, 55u}, // cta -> Latn
-    {0x8A620000u, 55u}, // ctc -> Latn
-    {0x8E620000u, 83u}, // ctd -> Pauc
-    {0x92620000u, 55u}, // cte -> Latn
-    {0x9A620000u,  9u}, // ctg -> Beng
-    {0x9E620000u, 55u}, // cth -> Latn
-    {0xAE620000u, 55u}, // ctl -> Latn
-    {0xB2620000u, 55u}, // ctm -> Latn
-    {0xB6620000u, 21u}, // ctn -> Deva
-    {0xBA620000u, 55u}, // cto -> Latn
-    {0xBE620000u, 55u}, // ctp -> Latn
-    {0xCA620000u, 55u}, // cts -> Latn
-    {0xCE620000u, 105u}, // ctt -> Taml
-    {0xD2620000u, 55u}, // ctu -> Latn
-    {0xE2620000u, 105u}, // cty -> Taml
-    {0xE6620000u, 55u}, // ctz -> Latn
-    {0x63750000u, 20u}, // cu -> Cyrl
-    {0x82820000u, 55u}, // cua -> Latn
-    {0x86820000u, 55u}, // cub -> Latn
-    {0x8A820000u, 55u}, // cuc -> Latn
-    {0x9E820000u, 55u}, // cuh -> Latn
-    {0xA2820000u, 55u}, // cui -> Latn
-    {0xA6820000u, 55u}, // cuj -> Latn
-    {0xAA820000u, 55u}, // cuk -> Latn
-    {0xAE820000u, 55u}, // cul -> Latn
-    {0xBA820000u, 55u}, // cuo -> Latn
-    {0xBE820000u, 55u}, // cup -> Latn
-    {0xCE820000u, 55u}, // cut -> Latn
-    {0xD2820000u, 51u}, // cuu -> Lana
-    {0xD6820000u, 55u}, // cuv -> Latn
-    {0xDE820000u, 55u}, // cux -> Latn
-    {0xE2820000u, 55u}, // cuy -> Latn
-    {0x63760000u, 20u}, // cv -> Cyrl
-    {0x9AA20000u, 55u}, // cvg -> Latn
-    {0xB6A20000u, 55u}, // cvn -> Latn
-    {0x82C20000u, 55u}, // cwa -> Latn
-    {0x86C20000u, 55u}, // cwb -> Latn
-    {0x92C20000u, 55u}, // cwe -> Latn
-    {0x9AC20000u, 55u}, // cwg -> Latn
-    {0xCEC20000u, 55u}, // cwt -> Latn
-    {0x9EE20000u, 55u}, // cxh -> Latn
-    {0x63790000u, 55u}, // cy -> Latn
-    {0x83020000u, 55u}, // cya -> Latn
-    {0x87020000u, 55u}, // cyb -> Latn
-    {0xBB020000u, 55u}, // cyo -> Latn
-    {0x9F220000u, 35u}, // czh -> Hans
-    {0xAB220000u, 37u}, // czk -> Hebr
-    {0xB7220000u, 55u}, // czn -> Latn
-    {0xCF220000u, 55u}, // czt -> Latn
-    {0x64610000u, 55u}, // da -> Latn
-    {0x80030000u, 55u}, // daa -> Latn
-    {0x88030000u, 55u}, // dac -> Latn
-    {0x8C030000u, 55u}, // dad -> Latn
-    {0x90030000u, 55u}, // dae -> Latn
-    {0x98030000u, 55u}, // dag -> Latn
-    {0x9C030000u, 55u}, // dah -> Latn
-    {0xA0030000u, 55u}, // dai -> Latn
-    {0xA4030000u, 55u}, // daj -> Latn
-    {0xA8030000u, 55u}, // dak -> Latn
-    {0xAC030000u, 55u}, // dal -> Latn
-    {0xB0030000u, 55u}, // dam -> Latn
-    {0xB8030000u, 55u}, // dao -> Latn
-    {0xC0030000u, 21u}, // daq -> Deva
-    {0xC4030000u, 20u}, // dar -> Cyrl
-    {0xC8030000u, 55u}, // das -> Latn
-    {0xD0030000u, 55u}, // dau -> Latn
-    {0xD4030000u, 55u}, // dav -> Latn
-    {0xD8030000u, 55u}, // daw -> Latn
-    {0xDC030000u, 55u}, // dax -> Latn
-    {0xE4030000u, 55u}, // daz -> Latn
-    {0x80230000u, 55u}, // dba -> Latn
-    {0x84230000u, 55u}, // dbb -> Latn
-    {0x8C230000u, 55u}, // dbd -> Latn
-    {0x90230000u, 55u}, // dbe -> Latn
-    {0x94230000u, 55u}, // dbf -> Latn
-    {0x98230000u, 55u}, // dbg -> Latn
-    {0xA0230000u, 55u}, // dbi -> Latn
-    {0xA4230000u, 55u}, // dbj -> Latn
-    {0xAC230000u, 55u}, // dbl -> Latn
-    {0xB0230000u, 55u}, // dbm -> Latn
-    {0xB4230000u, 55u}, // dbn -> Latn
-    {0xB8230000u, 55u}, // dbo -> Latn
-    {0xBC230000u, 55u}, // dbp -> Latn
-    {0xC0230000u, 55u}, // dbq -> Latn
-    {0xCC230000u, 55u}, // dbt -> Latn
-    {0xD0230000u, 55u}, // dbu -> Latn
-    {0xD4230000u, 55u}, // dbv -> Latn
-    {0xD8230000u, 55u}, // dbw -> Latn
-    {0xE0230000u, 55u}, // dby -> Latn
-    {0x88430000u,  2u}, // dcc -> Arab
-    {0xC4430000u, 55u}, // dcr -> Latn
-    {0x80630000u, 55u}, // dda -> Latn
-    {0x8C630000u, 55u}, // ddd -> Latn
-    {0x90630000u, 55u}, // dde -> Latn
-    {0x98630000u, 55u}, // ddg -> Latn
-    {0xA0630000u, 55u}, // ddi -> Latn
-    {0xA4630000u, 55u}, // ddj -> Latn
-    {0xB4630000u, 55u}, // ddn -> Latn
-    {0xB8630000u, 20u}, // ddo -> Cyrl
-    {0xC4630000u, 55u}, // ddr -> Latn
-    {0xC8630000u, 55u}, // dds -> Latn
-    {0xD8630000u, 55u}, // ddw -> Latn
-    {0x64650000u, 55u}, // de -> Latn
-    {0x88830000u, 55u}, // dec -> Latn
-    {0x8C830000u, 55u}, // ded -> Latn
-    {0x90830000u, 55u}, // dee -> Latn
-    {0x94830000u,  2u}, // def -> Arab
-    {0x98830000u, 55u}, // deg -> Latn
-    {0x9C830000u,  2u}, // deh -> Arab
-    {0xA0830000u, 55u}, // dei -> Latn
-    {0xA8830000u, 55u}, // dek -> Latn
-    {0xAC830000u, 55u}, // del -> Latn
-    {0xB0830000u, 55u}, // dem -> Latn
-    {0xB4830000u, 55u}, // den -> Latn
-    {0xC0830000u, 55u}, // deq -> Latn
-    {0xC4830000u,  9u}, // der -> Beng
-    {0xC8830000u, 55u}, // des -> Latn
-    {0xD4830000u, 55u}, // dev -> Latn
-    {0xE4830000u, 55u}, // dez -> Latn
-    {0x80C30000u, 55u}, // dga -> Latn
-    {0x84C30000u, 55u}, // dgb -> Latn
-    {0x88C30000u, 55u}, // dgc -> Latn
-    {0x8CC30000u, 55u}, // dgd -> Latn
-    {0x90C30000u, 55u}, // dge -> Latn
-    {0x98C30000u, 55u}, // dgg -> Latn
-    {0x9CC30000u, 55u}, // dgh -> Latn
-    {0xA0C30000u, 55u}, // dgi -> Latn
-    {0xA8C30000u, 55u}, // dgk -> Latn
-    {0xACC30000u,  2u}, // dgl -> Arab
-    {0xB4C30000u, 55u}, // dgn -> Latn
-    {0xC4C30000u, 55u}, // dgr -> Latn
-    {0xC8C30000u, 55u}, // dgs -> Latn
-    {0xCCC30000u, 55u}, // dgt -> Latn
-    {0xD8C30000u, 55u}, // dgw -> Latn
-    {0xDCC30000u, 55u}, // dgx -> Latn
-    {0xE4C30000u, 55u}, // dgz -> Latn
-    {0x98E30000u, 55u}, // dhg -> Latn
-    {0xA0E30000u, 21u}, // dhi -> Deva
-    {0xACE30000u, 55u}, // dhl -> Latn
-    {0xB0E30000u, 55u}, // dhm -> Latn
-    {0xB4E30000u, 31u}, // dhn -> Gujr
-    {0xB8E30000u, 21u}, // dho -> Deva
-    {0xC4E30000u, 55u}, // dhr -> Latn
-    {0xC8E30000u, 55u}, // dhs -> Latn
-    {0xD0E30000u, 55u}, // dhu -> Latn
-    {0xD4E30000u, 55u}, // dhv -> Latn
-    {0xD8E30000u, 21u}, // dhw -> Deva
-    {0xDCE30000u, 55u}, // dhx -> Latn
-    {0x81030000u, 55u}, // dia -> Latn
-    {0x85030000u, 55u}, // dib -> Latn
-    {0x89030000u, 55u}, // dic -> Latn
-    {0x8D030000u, 55u}, // did -> Latn
-    {0x95030000u, 55u}, // dif -> Latn
-    {0x99030000u, 55u}, // dig -> Latn
-    {0x9D030000u, 55u}, // dih -> Latn
-    {0xA1030000u, 55u}, // dii -> Latn
-    {0xA5030000u, 55u}, // dij -> Latn
-    {0xAD030000u, 55u}, // dil -> Latn
-    {0xB5030000u, 55u}, // din -> Latn
-    {0xB9030000u, 55u}, // dio -> Latn
-    {0xBD030000u, 55u}, // dip -> Latn
-    {0xC5030000u, 55u}, // dir -> Latn
-    {0xC9030000u, 55u}, // dis -> Latn
-    {0xD1030000u, 55u}, // diu -> Latn
-    {0xD9030000u, 55u}, // diw -> Latn
-    {0xDD030000u, 55u}, // dix -> Latn
-    {0xE1030000u, 55u}, // diy -> Latn
-    {0xE5030000u, 55u}, // diz -> Latn
-    {0x81230000u, 55u}, // dja -> Latn
-    {0x85230000u, 55u}, // djb -> Latn
-    {0x89230000u, 55u}, // djc -> Latn
-    {0x8D230000u, 55u}, // djd -> Latn
-    {0x91230000u, 55u}, // dje -> Latn
-    {0x95230000u, 55u}, // djf -> Latn
-    {0xA1230000u, 55u}, // dji -> Latn
-    {0xA5230000u, 55u}, // djj -> Latn
-    {0xA9230000u, 55u}, // djk -> Latn
-    {0xB1230000u, 55u}, // djm -> Latn
-    {0xB5230000u, 55u}, // djn -> Latn
-    {0xB9230000u, 55u}, // djo -> Latn
-    {0xC5230000u, 55u}, // djr -> Latn
-    {0xD1230000u, 55u}, // dju -> Latn
-    {0xD9230000u, 55u}, // djw -> Latn
-    {0x81430000u, 112u}, // dka -> Tibt
-    {0x99430000u, 55u}, // dkg -> Latn
-    {0xA9430000u, 55u}, // dkk -> Latn
-    {0xC5430000u, 55u}, // dkr -> Latn
-    {0xC9430000u, 55u}, // dks -> Latn
-    {0xDD430000u, 55u}, // dkx -> Latn
-    {0x99630000u, 20u}, // dlg -> Cyrl
-    {0xB1630000u, 55u}, // dlm -> Latn
-    {0xB5630000u, 55u}, // dln -> Latn
-    {0x81830000u, 55u}, // dma -> Latn
-    {0x85830000u, 55u}, // dmb -> Latn
-    {0x89830000u, 55u}, // dmc -> Latn
-    {0x8D830000u, 55u}, // dmd -> Latn
-    {0x91830000u, 55u}, // dme -> Latn
-    {0x95830000u, 65u}, // dmf -> Medf
-    {0x99830000u, 55u}, // dmg -> Latn
-    {0xA9830000u,  2u}, // dmk -> Arab
-    {0xAD830000u,  2u}, // dml -> Arab
-    {0xB1830000u, 55u}, // dmm -> Latn
-    {0xB9830000u, 55u}, // dmo -> Latn
-    {0xC5830000u, 55u}, // dmr -> Latn
-    {0xC9830000u, 55u}, // dms -> Latn
-    {0xD1830000u, 55u}, // dmu -> Latn
-    {0xD5830000u, 55u}, // dmv -> Latn
-    {0xD9830000u, 55u}, // dmw -> Latn
-    {0xDD830000u, 55u}, // dmx -> Latn
-    {0xE1830000u, 55u}, // dmy -> Latn
-    {0x81A30000u, 55u}, // dna -> Latn
-    {0x8DA30000u, 55u}, // dnd -> Latn
-    {0x91A30000u, 55u}, // dne -> Latn
-    {0x99A30000u, 20u}, // dng -> Cyrl
-    {0xA1A30000u, 55u}, // dni -> Latn
-    {0xA5A30000u, 55u}, // dnj -> Latn
-    {0xA9A30000u, 55u}, // dnk -> Latn
-    {0xB5A30000u, 55u}, // dnn -> Latn
-    {0xB9A30000u, 55u}, // dno -> Latn
-    {0xC5A30000u, 55u}, // dnr -> Latn
-    {0xCDA30000u, 55u}, // dnt -> Latn
-    {0xD1A30000u, 72u}, // dnu -> Mymr
-    {0xD5A30000u, 72u}, // dnv -> Mymr
-    {0xD9A30000u, 55u}, // dnw -> Latn
-    {0xE1A30000u, 55u}, // dny -> Latn
-    {0x81C30000u, 55u}, // doa -> Latn
-    {0x85C30000u, 55u}, // dob -> Latn
-    {0x89C30000u, 55u}, // doc -> Latn
-    {0x91C30000u, 55u}, // doe -> Latn
-    {0x95C30000u, 55u}, // dof -> Latn
-    {0x9DC30000u, 55u}, // doh -> Latn
-    {0xA1C30000u, 21u}, // doi -> Deva
-    {0xA9C30000u, 55u}, // dok -> Latn
-    {0xADC30000u, 55u}, // dol -> Latn
-    {0xB5C30000u, 55u}, // don -> Latn
-    {0xB9C30000u, 55u}, // doo -> Latn
-    {0xBDC30000u, 55u}, // dop -> Latn
-    {0xC5C30000u, 55u}, // dor -> Latn
-    {0xC9C30000u, 55u}, // dos -> Latn
-    {0xCDC30000u, 55u}, // dot -> Latn
-    {0xD5C30000u, 55u}, // dov -> Latn
-    {0xD9C30000u, 55u}, // dow -> Latn
-    {0xDDC30000u, 24u}, // dox -> Ethi
-    {0xE1C30000u, 55u}, // doy -> Latn
-    {0xBDE30000u, 55u}, // dpp -> Latn
-    {0x8A230000u, 55u}, // drc -> Latn
-    {0x92230000u, 112u}, // dre -> Tibt
-    {0x9A230000u, 55u}, // drg -> Latn
-    {0xA2230000u, 55u}, // dri -> Latn
-    {0xAE230000u, 55u}, // drl -> Latn
-    {0xB6230000u, 55u}, // drn -> Latn
-    {0xBA230000u, 55u}, // dro -> Latn
-    {0xC2230000u, 21u}, // drq -> Deva
-    {0xCA230000u, 24u}, // drs -> Ethi
-    {0xCE230000u, 55u}, // drt -> Latn
-    {0xD2230000u, 55u}, // dru -> Latn
-    {0xE2230000u, 21u}, // dry -> Deva
-    {0x86430000u, 55u}, // dsb -> Latn
-    {0x9E430000u, 55u}, // dsh -> Latn
-    {0xA2430000u, 55u}, // dsi -> Latn
-    {0xAA430000u, 55u}, // dsk -> Latn
-    {0xB6430000u, 55u}, // dsn -> Latn
-    {0xBA430000u, 80u}, // dso -> Orya
-    {0xC2430000u, 55u}, // dsq -> Latn
-    {0x82630000u, 55u}, // dta -> Latn
-    {0x86630000u, 55u}, // dtb -> Latn
-    {0x8E630000u, 55u}, // dtd -> Latn
-    {0x9E630000u, 55u}, // dth -> Latn
-    {0xA2630000u, 55u}, // dti -> Latn
-    {0xAA630000u, 55u}, // dtk -> Latn
-    {0xB2630000u, 55u}, // dtm -> Latn
-    {0xBA630000u, 55u}, // dto -> Latn
-    {0xBE630000u, 55u}, // dtp -> Latn
-    {0xC6630000u, 55u}, // dtr -> Latn
-    {0xCA630000u, 55u}, // dts -> Latn
-    {0xCE630000u, 55u}, // dtt -> Latn
-    {0xD2630000u, 55u}, // dtu -> Latn
-    {0xE2630000u, 21u}, // dty -> Deva
-    {0x82830000u, 55u}, // dua -> Latn
-    {0x86830000u, 31u}, // dub -> Gujr
-    {0x8A830000u, 55u}, // duc -> Latn
-    {0x92830000u, 55u}, // due -> Latn
-    {0x96830000u, 55u}, // duf -> Latn
-    {0x9A830000u, 55u}, // dug -> Latn
-    {0x9E830000u, 21u}, // duh -> Deva
-    {0xA2830000u, 55u}, // dui -> Latn
-    {0xAA830000u, 55u}, // duk -> Latn
-    {0xAE830000u, 55u}, // dul -> Latn
-    {0xB2830000u, 55u}, // dum -> Latn
-    {0xB6830000u, 55u}, // dun -> Latn
-    {0xBA830000u, 55u}, // duo -> Latn
-    {0xBE830000u, 55u}, // dup -> Latn
-    {0xC2830000u, 55u}, // duq -> Latn
-    {0xC6830000u, 55u}, // dur -> Latn
-    {0xCA830000u, 21u}, // dus -> Deva
-    {0xD2830000u, 55u}, // duu -> Latn
-    {0xD6830000u, 55u}, // duv -> Latn
-    {0xDA830000u, 55u}, // duw -> Latn
-    {0xDE830000u, 55u}, // dux -> Latn
-    {0xE2830000u, 55u}, // duy -> Latn
-    {0xE6830000u, 55u}, // duz -> Latn
-    {0x64760000u, 110u}, // dv -> Thaa
-    {0x82A30000u, 55u}, // dva -> Latn
-    {0x82C30000u, 55u}, // dwa -> Latn
-    {0xAAC30000u, 80u}, // dwk -> Orya
-    {0xC6C30000u, 55u}, // dwr -> Latn
-    {0xCAC30000u, 55u}, // dws -> Latn
-    {0xD2C30000u, 55u}, // dwu -> Latn
-    {0xDAC30000u, 55u}, // dww -> Latn
-    {0xE2C30000u, 55u}, // dwy -> Latn
-    {0xE6C30000u, 21u}, // dwz -> Deva
-    {0x83030000u, 55u}, // dya -> Latn
-    {0x87030000u, 55u}, // dyb -> Latn
-    {0x8F030000u, 55u}, // dyd -> Latn
-    {0x9B030000u, 55u}, // dyg -> Latn
-    {0xA3030000u, 55u}, // dyi -> Latn
-    {0xB3030000u, 55u}, // dym -> Latn
-    {0xB7030000u, 55u}, // dyn -> Latn
-    {0xBB030000u, 55u}, // dyo -> Latn
-    {0xC7030000u, 55u}, // dyr -> Latn
-    {0xD3030000u, 55u}, // dyu -> Latn
-    {0xE3030000u, 55u}, // dyy -> Latn
-    {0x647A0000u, 112u}, // dz -> Tibt
-    {0x83230000u, 55u}, // dza -> Latn
-    {0x8F230000u, 55u}, // dzd -> Latn
-    {0x93230000u, 55u}, // dze -> Latn
-    {0x9B230000u, 55u}, // dzg -> Latn
-    {0xAF230000u, 112u}, // dzl -> Tibt
-    {0xB7230000u, 55u}, // dzn -> Latn
-    {0x80040000u, 55u}, // eaa -> Latn
-    {0x88240000u, 55u}, // ebc -> Latn
-    {0x98240000u, 55u}, // ebg -> Latn
-    {0xA8240000u, 55u}, // ebk -> Latn
-    {0xB8240000u, 55u}, // ebo -> Latn
-    {0xC4240000u, 55u}, // ebr -> Latn
-    {0xD0240000u, 55u}, // ebu -> Latn
-    {0xC4440000u, 30u}, // ecr -> Grek
-    {0xE0440000u, 19u}, // ecy -> Cprt
-    {0x65650000u, 55u}, // ee -> Latn
-    {0x80A40000u, 55u}, // efa -> Latn
-    {0x90A40000u, 55u}, // efe -> Latn
-    {0xA0A40000u, 55u}, // efi -> Latn
-    {0x80C40000u, 55u}, // ega -> Latn
-    {0xACC40000u, 55u}, // egl -> Latn
-    {0xB0C40000u, 55u}, // egm -> Latn
-    {0xB8C40000u, 55u}, // ego -> Latn
-    {0xE0C40000u, 22u}, // egy -> Egyp
-    {0xD0E40000u, 55u}, // ehu -> Latn
-    {0xBD040000u, 55u}, // eip -> Latn
-    {0xCD040000u, 55u}, // eit -> Latn
-    {0xD5040000u, 55u}, // eiv -> Latn
-    {0x81240000u, 55u}, // eja -> Latn
-    {0x81440000u, 55u}, // eka -> Latn
-    {0x91440000u, 55u}, // eke -> Latn
-    {0x99440000u, 55u}, // ekg -> Latn
-    {0xA1440000u, 55u}, // eki -> Latn
-    {0xAD440000u, 55u}, // ekl -> Latn
-    {0xB1440000u, 55u}, // ekm -> Latn
-    {0xB9440000u, 55u}, // eko -> Latn
-    {0xBD440000u, 55u}, // ekp -> Latn
-    {0xC5440000u, 55u}, // ekr -> Latn
-    {0xE1440000u, 43u}, // eky -> Kali
-    {0x656C0000u, 30u}, // el -> Grek
-    {0x91640000u, 55u}, // ele -> Latn
-    {0xA9640000u, 55u}, // elk -> Latn
-    {0xB1640000u, 55u}, // elm -> Latn
-    {0xB9640000u, 55u}, // elo -> Latn
-    {0xD1640000u, 55u}, // elu -> Latn
-    {0x81840000u, 55u}, // ema -> Latn
-    {0x85840000u, 55u}, // emb -> Latn
-    {0x91840000u, 55u}, // eme -> Latn
-    {0x99840000u, 21u}, // emg -> Deva
-    {0xA1840000u, 55u}, // emi -> Latn
-    {0xB1840000u, 55u}, // emm -> Latn
-    {0xB5840000u, 55u}, // emn -> Latn
-    {0xBD840000u, 55u}, // emp -> Latn
-    {0xC9840000u, 55u}, // ems -> Latn
-    {0xD1840000u, 21u}, // emu -> Deva
-    {0xD9840000u, 55u}, // emw -> Latn
-    {0xDD840000u, 55u}, // emx -> Latn
-    {0xE5840000u, 55u}, // emz -> Latn
-    {0x656E0000u, 55u}, // en -> Latn
-    {0x656E5841u, 121u}, // en-XA -> ~~~A
-    {0x81A40000u, 55u}, // ena -> Latn
-    {0x85A40000u, 55u}, // enb -> Latn
-    {0x89A40000u, 55u}, // enc -> Latn
-    {0x8DA40000u, 55u}, // end -> Latn
-    {0x95A40000u, 20u}, // enf -> Cyrl
-    {0x9DA40000u, 20u}, // enh -> Cyrl
-    {0xADA40000u, 55u}, // enl -> Latn
-    {0xB1A40000u, 55u}, // enm -> Latn
-    {0xB5A40000u, 55u}, // enn -> Latn
-    {0xB9A40000u, 55u}, // eno -> Latn
-    {0xC1A40000u, 55u}, // enq -> Latn
-    {0xC5A40000u, 55u}, // enr -> Latn
-    {0xD5A40000u, 55u}, // env -> Latn
-    {0xD9A40000u, 55u}, // enw -> Latn
-    {0xDDA40000u, 55u}, // enx -> Latn
-    {0x656F0000u, 55u}, // eo -> Latn
-    {0xCDC40000u, 55u}, // eot -> Latn
-    {0xA1E40000u, 55u}, // epi -> Latn
-    {0x82240000u, 105u}, // era -> Taml
-    {0x9A240000u, 55u}, // erg -> Latn
-    {0x9E240000u, 55u}, // erh -> Latn
-    {0xA2240000u, 55u}, // eri -> Latn
-    {0xAA240000u, 55u}, // erk -> Latn
-    {0xC6240000u, 55u}, // err -> Latn
-    {0xCA240000u, 55u}, // ers -> Latn
-    {0xCE240000u, 55u}, // ert -> Latn
-    {0xDA240000u, 55u}, // erw -> Latn
-    {0x65730000u, 55u}, // es -> Latn
-    {0x92440000u, 55u}, // ese -> Latn
-    {0x9A440000u, 27u}, // esg -> Gonm
-    {0x9E440000u,  2u}, // esh -> Arab
-    {0xA2440000u, 55u}, // esi -> Latn
-    {0xB2440000u, 55u}, // esm -> Latn
-    {0xCA440000u, 55u}, // ess -> Latn
-    {0xD2440000u, 55u}, // esu -> Latn
-    {0xE2440000u, 55u}, // esy -> Latn
-    {0x65740000u, 55u}, // et -> Latn
-    {0x86640000u, 55u}, // etb -> Latn
-    {0xB6640000u, 55u}, // etn -> Latn
-    {0xBA640000u, 55u}, // eto -> Latn
-    {0xC6640000u, 55u}, // etr -> Latn
-    {0xCA640000u, 55u}, // ets -> Latn
-    {0xCE640000u, 40u}, // ett -> Ital
-    {0xD2640000u, 55u}, // etu -> Latn
-    {0xDE640000u, 55u}, // etx -> Latn
-    {0xE6640000u, 55u}, // etz -> Latn
-    {0x65750000u, 55u}, // eu -> Latn
-    {0x8E840000u, 55u}, // eud -> Latn
-    {0x92A40000u, 20u}, // eve -> Cyrl
-    {0x9EA40000u, 55u}, // evh -> Latn
-    {0xB6A40000u, 20u}, // evn -> Cyrl
-    {0xBAC40000u, 55u}, // ewo -> Latn
-    {0xCEE40000u, 55u}, // ext -> Latn
-    {0x83040000u, 55u}, // eya -> Latn
-    {0xBB040000u, 55u}, // eyo -> Latn
-    {0x83240000u, 55u}, // eza -> Latn
-    {0x93240000u, 55u}, // eze -> Latn
-    {0x66610000u,  2u}, // fa -> Arab
-    {0x80050000u, 55u}, // faa -> Latn
-    {0x84050000u, 55u}, // fab -> Latn
-    {0x8C050000u, 55u}, // fad -> Latn
-    {0x94050000u, 55u}, // faf -> Latn
-    {0x98050000u, 55u}, // fag -> Latn
-    {0x9C050000u, 55u}, // fah -> Latn
-    {0xA0050000u, 55u}, // fai -> Latn
-    {0xA4050000u, 55u}, // faj -> Latn
-    {0xA8050000u, 55u}, // fak -> Latn
-    {0xAC050000u, 55u}, // fal -> Latn
-    {0xB0050000u, 55u}, // fam -> Latn
-    {0xB4050000u, 55u}, // fan -> Latn
-    {0xBC050000u, 55u}, // fap -> Latn
-    {0xC4050000u, 55u}, // far -> Latn
-    {0xD0050000u, 55u}, // fau -> Latn
-    {0xDC050000u, 55u}, // fax -> Latn
-    {0xE0050000u,  2u}, // fay -> Arab
-    {0xE4050000u,  2u}, // faz -> Arab
-    {0xAC250000u, 55u}, // fbl -> Latn
-    {0xC4850000u, 55u}, // fer -> Latn
-    {0x66660000u, 55u}, // ff -> Latn
-    {0xA0A50000u, 55u}, // ffi -> Latn
-    {0xB0A50000u, 55u}, // ffm -> Latn
-    {0xC4C50000u, 55u}, // fgr -> Latn
-    {0x66690000u, 55u}, // fi -> Latn
-    {0x81050000u,  2u}, // fia -> Arab
-    {0x91050000u, 55u}, // fie -> Latn
-    {0x95050000u, 55u}, // fif -> Latn
-    {0xAD050000u, 55u}, // fil -> Latn
-    {0xBD050000u, 55u}, // fip -> Latn
-    {0xC5050000u, 55u}, // fir -> Latn
-    {0xCD050000u, 55u}, // fit -> Latn
-    {0xD9050000u, 55u}, // fiw -> Latn
-    {0x666A0000u, 55u}, // fj -> Latn
-    {0xA9450000u, 55u}, // fkk -> Latn
-    {0xD5450000u, 55u}, // fkv -> Latn
-    {0x81650000u, 55u}, // fla -> Latn
-    {0x9D650000u, 55u}, // flh -> Latn
-    {0xA1650000u, 55u}, // fli -> Latn
-    {0xAD650000u, 55u}, // fll -> Latn
-    {0xB5650000u, 55u}, // fln -> Latn
-    {0xC5650000u, 55u}, // flr -> Latn
-    {0xE1650000u, 55u}, // fly -> Latn
-    {0xBD850000u, 55u}, // fmp -> Latn
-    {0xD1850000u, 21u}, // fmu -> Deva
-    {0x85A50000u, 55u}, // fnb -> Latn
-    {0x99A50000u, 55u}, // fng -> Latn
-    {0xA1A50000u, 55u}, // fni -> Latn
-    {0x666F0000u, 55u}, // fo -> Latn
-    {0x8DC50000u, 55u}, // fod -> Latn
-    {0xA1C50000u, 55u}, // foi -> Latn
-    {0xB1C50000u, 55u}, // fom -> Latn
-    {0xB5C50000u, 55u}, // fon -> Latn
-    {0xC5C50000u, 55u}, // for -> Latn
-    {0xC9C50000u, 55u}, // fos -> Latn
-    {0x91E50000u, 55u}, // fpe -> Latn
-    {0xCA050000u, 55u}, // fqs -> Latn
-    {0x66720000u, 55u}, // fr -> Latn
-    {0x8A250000u, 55u}, // frc -> Latn
-    {0x8E250000u, 55u}, // frd -> Latn
-    {0xAA250000u, 55u}, // frk -> Latn
-    {0xB2250000u, 55u}, // frm -> Latn
-    {0xBA250000u, 55u}, // fro -> Latn
-    {0xBE250000u, 55u}, // frp -> Latn
-    {0xC2250000u, 55u}, // frq -> Latn
-    {0xC6250000u, 55u}, // frr -> Latn
-    {0xCA250000u, 55u}, // frs -> Latn
-    {0xCE250000u, 55u}, // frt -> Latn
-    {0x86850000u,  2u}, // fub -> Arab
-    {0x8E850000u, 55u}, // fud -> Latn
-    {0x92850000u, 55u}, // fue -> Latn
-    {0x96850000u, 55u}, // fuf -> Latn
-    {0x9E850000u, 55u}, // fuh -> Latn
-    {0xA2850000u, 55u}, // fui -> Latn
-    {0xB2850000u, 55u}, // fum -> Latn
-    {0xB6850000u, 55u}, // fun -> Latn
-    {0xC2850000u, 55u}, // fuq -> Latn
-    {0xC6850000u, 55u}, // fur -> Latn
-    {0xCE850000u, 55u}, // fut -> Latn
-    {0xD2850000u, 55u}, // fuu -> Latn
-    {0xD6850000u, 55u}, // fuv -> Latn
-    {0xE2850000u, 55u}, // fuy -> Latn
-    {0xC6A50000u, 55u}, // fvr -> Latn
-    {0x82C50000u, 55u}, // fwa -> Latn
-    {0x92C50000u, 55u}, // fwe -> Latn
-    {0x66790000u, 55u}, // fy -> Latn
-    {0x67610000u, 55u}, // ga -> Latn
-    {0x80060000u, 55u}, // gaa -> Latn
-    {0x84060000u, 55u}, // gab -> Latn
-    {0x88060000u, 55u}, // gac -> Latn
-    {0x8C060000u, 55u}, // gad -> Latn
-    {0x90060000u, 55u}, // gae -> Latn
-    {0x94060000u, 55u}, // gaf -> Latn
-    {0x98060000u, 55u}, // gag -> Latn
-    {0x9C060000u, 55u}, // gah -> Latn
-    {0xA0060000u, 55u}, // gai -> Latn
-    {0xA4060000u, 55u}, // gaj -> Latn
-    {0xA8060000u, 55u}, // gak -> Latn
-    {0xAC060000u, 55u}, // gal -> Latn
-    {0xB0060000u, 55u}, // gam -> Latn
-    {0xB4060000u, 35u}, // gan -> Hans
-    {0xB8060000u, 55u}, // gao -> Latn
-    {0xBC060000u, 55u}, // gap -> Latn
-    {0xC0060000u, 80u}, // gaq -> Orya
-    {0xC4060000u, 55u}, // gar -> Latn
-    {0xC8060000u, 31u}, // gas -> Gujr
-    {0xCC060000u, 55u}, // gat -> Latn
-    {0xD0060000u, 108u}, // gau -> Telu
-    {0xD8060000u, 55u}, // gaw -> Latn
-    {0xDC060000u, 55u}, // gax -> Latn
-    {0xE0060000u, 55u}, // gay -> Latn
-    {0x80260000u, 55u}, // gba -> Latn
-    {0x84260000u, 55u}, // gbb -> Latn
-    {0x8C260000u, 55u}, // gbd -> Latn
-    {0x90260000u, 55u}, // gbe -> Latn
-    {0x94260000u, 55u}, // gbf -> Latn
-    {0x98260000u, 55u}, // gbg -> Latn
-    {0x9C260000u, 55u}, // gbh -> Latn
-    {0xA0260000u, 55u}, // gbi -> Latn
-    {0xA4260000u, 80u}, // gbj -> Orya
-    {0xA8260000u, 21u}, // gbk -> Deva
-    {0xAC260000u, 31u}, // gbl -> Gujr
-    {0xB0260000u, 21u}, // gbm -> Deva
-    {0xB4260000u, 55u}, // gbn -> Latn
-    {0xBC260000u, 55u}, // gbp -> Latn
-    {0xC0260000u, 55u}, // gbq -> Latn
-    {0xC4260000u, 55u}, // gbr -> Latn
-    {0xC8260000u, 55u}, // gbs -> Latn
-    {0xD0260000u, 55u}, // gbu -> Latn
-    {0xD4260000u, 55u}, // gbv -> Latn
-    {0xD8260000u, 55u}, // gbw -> Latn
-    {0xDC260000u, 55u}, // gbx -> Latn
-    {0xE0260000u, 55u}, // gby -> Latn
-    {0xE4260000u,  2u}, // gbz -> Arab
-    {0x88460000u, 55u}, // gcc -> Latn
-    {0x8C460000u, 55u}, // gcd -> Latn
-    {0x94460000u, 55u}, // gcf -> Latn
-    {0xAC460000u, 55u}, // gcl -> Latn
-    {0xB4460000u, 55u}, // gcn -> Latn
-    {0xC4460000u, 55u}, // gcr -> Latn
-    {0xCC460000u, 55u}, // gct -> Latn
-    {0x67640000u, 55u}, // gd -> Latn
-    {0x84660000u, 80u}, // gdb -> Orya
-    {0x88660000u, 55u}, // gdc -> Latn
-    {0x8C660000u, 55u}, // gdd -> Latn
-    {0x90660000u, 55u}, // gde -> Latn
-    {0x94660000u, 55u}, // gdf -> Latn
-    {0x98660000u, 55u}, // gdg -> Latn
-    {0x9C660000u, 55u}, // gdh -> Latn
-    {0xA0660000u, 55u}, // gdi -> Latn
-    {0xA4660000u, 55u}, // gdj -> Latn
-    {0xA8660000u, 55u}, // gdk -> Latn
-    {0xAC660000u, 55u}, // gdl -> Latn
-    {0xB0660000u, 55u}, // gdm -> Latn
-    {0xB4660000u, 55u}, // gdn -> Latn
-    {0xB8660000u, 20u}, // gdo -> Cyrl
-    {0xC0660000u, 55u}, // gdq -> Latn
-    {0xC4660000u, 55u}, // gdr -> Latn
-    {0xCC660000u, 55u}, // gdt -> Latn
-    {0xD0660000u, 55u}, // gdu -> Latn
-    {0xDC660000u, 21u}, // gdx -> Deva
-    {0x80860000u, 55u}, // gea -> Latn
-    {0x84860000u, 55u}, // geb -> Latn
-    {0x88860000u, 55u}, // gec -> Latn
-    {0x8C860000u, 55u}, // ged -> Latn
-    {0x94860000u, 55u}, // gef -> Latn
-    {0x98860000u, 55u}, // geg -> Latn
-    {0x9C860000u, 55u}, // geh -> Latn
-    {0xA0860000u, 55u}, // gei -> Latn
-    {0xA4860000u, 55u}, // gej -> Latn
-    {0xA8860000u, 55u}, // gek -> Latn
-    {0xAC860000u, 55u}, // gel -> Latn
-    {0xC0860000u, 55u}, // geq -> Latn
-    {0xC8860000u, 55u}, // ges -> Latn
-    {0xD4860000u, 55u}, // gev -> Latn
-    {0xD8860000u, 55u}, // gew -> Latn
-    {0xDC860000u, 55u}, // gex -> Latn
-    {0xE0860000u, 55u}, // gey -> Latn
-    {0xE4860000u, 24u}, // gez -> Ethi
-    {0xA8A60000u, 55u}, // gfk -> Latn
-    {0x80C60000u, 55u}, // gga -> Latn
-    {0x84C60000u, 55u}, // ggb -> Latn
-    {0x8CC60000u, 55u}, // ggd -> Latn
-    {0x90C60000u, 55u}, // gge -> Latn
-    {0x98C60000u,  2u}, // ggg -> Arab
-    {0xA8C60000u, 55u}, // ggk -> Latn
-    {0xACC60000u, 55u}, // ggl -> Latn
-    {0xCCC60000u, 55u}, // ggt -> Latn
-    {0xD0C60000u, 55u}, // ggu -> Latn
-    {0xD8C60000u, 55u}, // ggw -> Latn
-    {0x80E60000u,  2u}, // gha -> Arab
-    {0x88E60000u, 55u}, // ghc -> Latn
-    {0x90E60000u, 21u}, // ghe -> Deva
-    {0xA8E60000u, 55u}, // ghk -> Latn
-    {0xB4E60000u, 55u}, // ghn -> Latn
-    {0xB8E60000u, 109u}, // gho -> Tfng
-    {0xC4E60000u,  2u}, // ghr -> Arab
-    {0xC8E60000u, 55u}, // ghs -> Latn
-    {0xCCE60000u, 112u}, // ght -> Tibt
-    {0x81060000u, 55u}, // gia -> Latn
-    {0x85060000u, 55u}, // gib -> Latn
-    {0x89060000u, 55u}, // gic -> Latn
-    {0x8D060000u, 55u}, // gid -> Latn
-    {0x91060000u, 55u}, // gie -> Latn
-    {0x99060000u,  2u}, // gig -> Arab
-    {0x9D060000u, 55u}, // gih -> Latn
-    {0xAD060000u, 55u}, // gil -> Latn
-    {0xB1060000u, 55u}, // gim -> Latn
-    {0xB5060000u, 20u}, // gin -> Cyrl
-    {0xBD060000u, 55u}, // gip -> Latn
-    {0xC1060000u, 55u}, // giq -> Latn
-    {0xC5060000u, 55u}, // gir -> Latn
-    {0xC9060000u, 55u}, // gis -> Latn
-    {0xCD060000u, 55u}, // git -> Latn
-    {0xDD060000u, 55u}, // gix -> Latn
-    {0xE1060000u, 55u}, // giy -> Latn
-    {0xE5060000u, 55u}, // giz -> Latn
-    {0xA9260000u,  2u}, // gjk -> Arab
-    {0xB1260000u, 55u}, // gjm -> Latn
-    {0xB5260000u, 55u}, // gjn -> Latn
-    {0xC5260000u, 55u}, // gjr -> Latn
-    {0xD1260000u,  2u}, // gju -> Arab
-    {0x81460000u, 55u}, // gka -> Latn
-    {0x8D460000u, 55u}, // gkd -> Latn
-    {0x91460000u, 55u}, // gke -> Latn
-    {0xB5460000u, 55u}, // gkn -> Latn
-    {0xB9460000u, 55u}, // gko -> Latn
-    {0xBD460000u, 55u}, // gkp -> Latn
-    {0xD1460000u, 55u}, // gku -> Latn
-    {0x676C0000u, 55u}, // gl -> Latn
-    {0x85660000u, 55u}, // glb -> Latn
-    {0x89660000u, 55u}, // glc -> Latn
-    {0x8D660000u, 20u}, // gld -> Cyrl
-    {0x9D660000u,  2u}, // glh -> Arab
-    {0xA5660000u, 55u}, // glj -> Latn
-    {0xA9660000u,  2u}, // glk -> Arab
-    {0xAD660000u, 55u}, // gll -> Latn
-    {0xB9660000u, 55u}, // glo -> Latn
-    {0xC5660000u, 55u}, // glr -> Latn
-    {0xD1660000u, 55u}, // glu -> Latn
-    {0xD9660000u, 55u}, // glw -> Latn
-    {0x81860000u, 55u}, // gma -> Latn
-    {0x85860000u, 55u}, // gmb -> Latn
-    {0x8D860000u, 55u}, // gmd -> Latn
-    {0x99860000u, 55u}, // gmg -> Latn
-    {0x9D860000u, 55u}, // gmh -> Latn
-    {0xAD860000u, 53u}, // gml -> Latf
-    {0xB1860000u, 55u}, // gmm -> Latn
-    {0xB5860000u, 55u}, // gmn -> Latn
-    {0xC5860000u, 55u}, // gmr -> Latn
-    {0xD1860000u, 55u}, // gmu -> Latn
-    {0xD5860000u, 24u}, // gmv -> Ethi
-    {0xDD860000u, 55u}, // gmx -> Latn
-    {0xE1860000u, 58u}, // gmy -> Linb
-    {0xE5860000u, 55u}, // gmz -> Latn
-    {0x676E0000u, 55u}, // gn -> Latn
-    {0x81A60000u, 55u}, // gna -> Latn
-    {0x85A60000u, 55u}, // gnb -> Latn
-    {0x89A60000u, 55u}, // gnc -> Latn
-    {0x8DA60000u, 55u}, // gnd -> Latn
-    {0x91A60000u, 55u}, // gne -> Latn
-    {0x99A60000u, 55u}, // gng -> Latn
-    {0x9DA60000u, 55u}, // gnh -> Latn
-    {0xA1A60000u, 55u}, // gni -> Latn
-    {0xA5A60000u, 55u}, // gnj -> Latn
-    {0xA9A60000u, 55u}, // gnk -> Latn
-    {0xADA60000u, 55u}, // gnl -> Latn
-    {0xB1A60000u, 55u}, // gnm -> Latn
-    {0xB5A60000u, 55u}, // gnn -> Latn
-    {0xC1A60000u, 55u}, // gnq -> Latn
-    {0xC5A60000u, 55u}, // gnr -> Latn
-    {0xCDA60000u, 55u}, // gnt -> Latn
-    {0xD1A60000u, 55u}, // gnu -> Latn
-    {0xD9A60000u, 55u}, // gnw -> Latn
-    {0xE5A60000u, 55u}, // gnz -> Latn
-    {0x81C60000u, 55u}, // goa -> Latn
-    {0x85C60000u, 55u}, // gob -> Latn
-    {0x89C60000u, 55u}, // goc -> Latn
-    {0x8DC60000u, 55u}, // god -> Latn
-    {0x91C60000u, 112u}, // goe -> Tibt
-    {0x95C60000u, 24u}, // gof -> Ethi
-    {0x99C60000u, 55u}, // gog -> Latn
-    {0x9DC60000u, 55u}, // goh -> Latn
-    {0xA1C60000u, 55u}, // goi -> Latn
-    {0xA5C60000u, 21u}, // goj -> Deva
-    {0xA9C60000u, 21u}, // gok -> Deva
-    {0xADC60000u, 55u}, // gol -> Latn
-    {0xB5C60000u, 21u}, // gon -> Deva
-    {0xB9C60000u, 55u}, // goo -> Latn
-    {0xBDC60000u, 55u}, // gop -> Latn
-    {0xC1C60000u, 55u}, // goq -> Latn
-    {0xC5C60000u, 55u}, // gor -> Latn
-    {0xC9C60000u, 55u}, // gos -> Latn
-    {0xCDC60000u, 28u}, // got -> Goth
-    {0xD1C60000u, 55u}, // gou -> Latn
-    {0xD5C60000u, 55u}, // gov -> Latn
-    {0xD9C60000u, 55u}, // gow -> Latn
-    {0xDDC60000u, 55u}, // gox -> Latn
-    {0xE1C60000u, 55u}, // goy -> Latn
-    {0x81E60000u, 55u}, // gpa -> Latn
-    {0x91E60000u, 55u}, // gpe -> Latn
-    {0xB5E60000u, 55u}, // gpn -> Latn
-    {0x82060000u, 55u}, // gqa -> Latn
-    {0xB6060000u, 55u}, // gqn -> Latn
-    {0xC6060000u, 55u}, // gqr -> Latn
-    {0x82260000u, 21u}, // gra -> Deva
-    {0x86260000u, 55u}, // grb -> Latn
-    {0x8A260000u, 19u}, // grc -> Cprt
-    {0x8E260000u, 55u}, // grd -> Latn
-    {0x9A260000u, 55u}, // grg -> Latn
-    {0x9E260000u, 55u}, // grh -> Latn
-    {0xA2260000u, 55u}, // gri -> Latn
-    {0xA6260000u, 55u}, // grj -> Latn
-    {0xB2260000u, 55u}, // grm -> Latn
-    {0xC2260000u, 55u}, // grq -> Latn
-    {0xCA260000u, 55u}, // grs -> Latn
-    {0xCE260000u,  9u}, // grt -> Beng
-    {0xD2260000u, 24u}, // gru -> Ethi
-    {0xD6260000u, 55u}, // grv -> Latn
-    {0xDA260000u, 55u}, // grw -> Latn
-    {0xDE260000u, 55u}, // grx -> Latn
-    {0xE2260000u, 55u}, // gry -> Latn
-    {0xE6260000u, 55u}, // grz -> Latn
-    {0xAE460000u, 55u}, // gsl -> Latn
-    {0xB6460000u, 55u}, // gsn -> Latn
-    {0xBA460000u, 55u}, // gso -> Latn
-    {0xBE460000u, 55u}, // gsp -> Latn
-    {0xDA460000u, 55u}, // gsw -> Latn
-    {0x82660000u, 55u}, // gta -> Latn
-    {0xD2660000u, 55u}, // gtu -> Latn
-    {0x67750000u, 31u}, // gu -> Gujr
-    {0x82860000u, 55u}, // gua -> Latn
-    {0x86860000u, 55u}, // gub -> Latn
-    {0x8A860000u, 55u}, // guc -> Latn
-    {0x8E860000u, 55u}, // gud -> Latn
-    {0x92860000u, 55u}, // gue -> Latn
-    {0x96860000u, 55u}, // guf -> Latn
-    {0x9E860000u, 55u}, // guh -> Latn
-    {0xA2860000u, 55u}, // gui -> Latn
-    {0xAA860000u, 55u}, // guk -> Latn
-    {0xAE860000u, 55u}, // gul -> Latn
-    {0xB2860000u, 55u}, // gum -> Latn
-    {0xB6860000u, 55u}, // gun -> Latn
-    {0xBA860000u, 55u}, // guo -> Latn
-    {0xBE860000u, 55u}, // gup -> Latn
-    {0xC2860000u, 55u}, // guq -> Latn
-    {0xC6860000u, 55u}, // gur -> Latn
-    {0xCE860000u, 55u}, // gut -> Latn
-    {0xD2860000u, 55u}, // guu -> Latn
-    {0xDA860000u, 55u}, // guw -> Latn
-    {0xDE860000u, 55u}, // gux -> Latn
-    {0xE6860000u, 55u}, // guz -> Latn
-    {0x67760000u, 55u}, // gv -> Latn
-    {0x82A60000u, 55u}, // gva -> Latn
-    {0x8AA60000u, 55u}, // gvc -> Latn
-    {0x92A60000u, 55u}, // gve -> Latn
-    {0x96A60000u, 55u}, // gvf -> Latn
-    {0xA6A60000u, 55u}, // gvj -> Latn
-    {0xAEA60000u, 55u}, // gvl -> Latn
-    {0xB2A60000u, 55u}, // gvm -> Latn
-    {0xB6A60000u, 55u}, // gvn -> Latn
-    {0xBAA60000u, 55u}, // gvo -> Latn
-    {0xBEA60000u, 55u}, // gvp -> Latn
-    {0xC6A60000u, 21u}, // gvr -> Deva
-    {0xCAA60000u, 55u}, // gvs -> Latn
-    {0xE2A60000u, 55u}, // gvy -> Latn
-    {0x82C60000u, 55u}, // gwa -> Latn
-    {0x86C60000u, 55u}, // gwb -> Latn
-    {0x8AC60000u,  2u}, // gwc -> Arab
-    {0x8EC60000u, 55u}, // gwd -> Latn
-    {0x92C60000u, 55u}, // gwe -> Latn
-    {0x96C60000u,  2u}, // gwf -> Arab
-    {0x9AC60000u, 55u}, // gwg -> Latn
-    {0xA2C60000u, 55u}, // gwi -> Latn
-    {0xA6C60000u, 55u}, // gwj -> Latn
-    {0xB2C60000u, 55u}, // gwm -> Latn
-    {0xB6C60000u, 55u}, // gwn -> Latn
-    {0xC6C60000u, 55u}, // gwr -> Latn
-    {0xCEC60000u,  2u}, // gwt -> Arab
-    {0xD2C60000u, 55u}, // gwu -> Latn
-    {0xDAC60000u, 55u}, // gww -> Latn
-    {0xDEC60000u, 55u}, // gwx -> Latn
-    {0xDEE60000u, 55u}, // gxx -> Latn
-    {0x87060000u, 55u}, // gyb -> Latn
-    {0x8F060000u, 55u}, // gyd -> Latn
-    {0x93060000u, 55u}, // gye -> Latn
-    {0x97060000u, 55u}, // gyf -> Latn
-    {0x9B060000u, 55u}, // gyg -> Latn
-    {0xA3060000u, 55u}, // gyi -> Latn
-    {0xAF060000u, 55u}, // gyl -> Latn
-    {0xB3060000u, 55u}, // gym -> Latn
-    {0xB7060000u, 55u}, // gyn -> Latn
-    {0xBB060000u, 21u}, // gyo -> Deva
-    {0xC7060000u, 55u}, // gyr -> Latn
-    {0xE3060000u, 55u}, // gyy -> Latn
-    {0xE7060000u, 55u}, // gyz -> Latn
-    {0x83260000u, 55u}, // gza -> Latn
-    {0xA3260000u,  2u}, // gzi -> Arab
-    {0xB7260000u, 55u}, // gzn -> Latn
-    {0x68610000u, 55u}, // ha -> Latn
-    {0x6861434Du,  2u}, // ha-CM -> Arab
-    {0x68615344u,  2u}, // ha-SD -> Arab
-    {0x80070000u, 55u}, // haa -> Latn
-    {0x88070000u,  2u}, // hac -> Arab
-    {0x8C070000u, 55u}, // had -> Latn
-    {0x90070000u, 55u}, // hae -> Latn
-    {0x98070000u, 55u}, // hag -> Latn
-    {0x9C070000u, 55u}, // hah -> Latn
-    {0xA0070000u, 55u}, // hai -> Latn
-    {0xA4070000u, 55u}, // haj -> Latn
-    {0xA8070000u, 35u}, // hak -> Hans
-    {0xAC070000u, 55u}, // hal -> Latn
-    {0xB0070000u, 55u}, // ham -> Latn
-    {0xB4070000u, 55u}, // han -> Latn
-    {0xB8070000u, 55u}, // hao -> Latn
-    {0xBC070000u, 55u}, // hap -> Latn
-    {0xC0070000u, 55u}, // haq -> Latn
-    {0xC4070000u, 24u}, // har -> Ethi
-    {0xC8070000u, 55u}, // has -> Latn
-    {0xD4070000u, 55u}, // hav -> Latn
-    {0xD8070000u, 55u}, // haw -> Latn
-    {0xDC070000u, 55u}, // hax -> Latn
-    {0xE0070000u, 55u}, // hay -> Latn
-    {0xE4070000u,  2u}, // haz -> Arab
-    {0x80270000u, 55u}, // hba -> Latn
-    {0x84270000u, 55u}, // hbb -> Latn
-    {0xB4270000u, 55u}, // hbn -> Latn
-    {0xB8270000u, 37u}, // hbo -> Hebr
-    {0xD0270000u, 55u}, // hbu -> Latn
-    {0x9C470000u, 55u}, // hch -> Latn
-    {0xE0670000u, 24u}, // hdy -> Ethi
-    {0x68650000u, 37u}, // he -> Hebr
-    {0x8C870000u, 55u}, // hed -> Latn
-    {0x98870000u, 55u}, // heg -> Latn
-    {0x9C870000u, 55u}, // heh -> Latn
-    {0xA0870000u, 55u}, // hei -> Latn
-    {0xB0870000u, 55u}, // hem -> Latn
-    {0xB0C70000u, 55u}, // hgm -> Latn
-    {0xD8C70000u, 55u}, // hgw -> Latn
-    {0xA0E70000u, 55u}, // hhi -> Latn
-    {0xC4E70000u, 55u}, // hhr -> Latn
-    {0xE0E70000u, 55u}, // hhy -> Latn
-    {0x68690000u, 21u}, // hi -> Deva
-    {0x81070000u, 55u}, // hia -> Latn
-    {0x85070000u, 55u}, // hib -> Latn
-    {0x8D070000u, 55u}, // hid -> Latn
-    {0x95070000u, 21u}, // hif -> Deva
-    {0x99070000u, 55u}, // hig -> Latn
-    {0x9D070000u, 55u}, // hih -> Latn
-    {0xA1070000u, 102u}, // hii -> Takr
-    {0xA5070000u, 55u}, // hij -> Latn
-    {0xA9070000u, 55u}, // hik -> Latn
-    {0xAD070000u, 55u}, // hil -> Latn
-    {0xB9070000u, 55u}, // hio -> Latn
-    {0xC5070000u, 55u}, // hir -> Latn
-    {0xCD070000u, 119u}, // hit -> Xsux
-    {0xD9070000u, 55u}, // hiw -> Latn
-    {0xDD070000u, 55u}, // hix -> Latn
-    {0xA1270000u, 55u}, // hji -> Latn
-    {0x81470000u, 55u}, // hka -> Latn
-    {0x91470000u, 55u}, // hke -> Latn
-    {0x9D470000u,  2u}, // hkh -> Arab
-    {0xA9470000u, 55u}, // hkk -> Latn
-    {0x81670000u, 55u}, // hla -> Latn
-    {0x85670000u, 21u}, // hlb -> Deva
-    {0x8D670000u, 55u}, // hld -> Latn
-    {0xCD670000u, 55u}, // hlt -> Latn
-    {0xD1670000u, 38u}, // hlu -> Hluw
-    {0x81870000u, 55u}, // hma -> Latn
-    {0x85870000u, 55u}, // hmb -> Latn
-    {0x8D870000u, 86u}, // hmd -> Plrd
-    {0x95870000u, 55u}, // hmf -> Latn
-    {0xA5870000u, 10u}, // hmj -> Bopo
-    {0xB1870000u, 55u}, // hmm -> Latn
-    {0xB5870000u, 55u}, // hmn -> Latn
-    {0xBD870000u, 55u}, // hmp -> Latn
-    {0xC1870000u, 10u}, // hmq -> Bopo
-    {0xC5870000u, 55u}, // hmr -> Latn
-    {0xC9870000u, 55u}, // hms -> Latn
-    {0xCD870000u, 55u}, // hmt -> Latn
-    {0xD1870000u, 55u}, // hmu -> Latn
-    {0xD5870000u, 55u}, // hmv -> Latn
-    {0xD9870000u, 55u}, // hmw -> Latn
-    {0xE1870000u, 55u}, // hmy -> Latn
-    {0xE5870000u, 55u}, // hmz -> Latn
-    {0x81A70000u, 55u}, // hna -> Latn
-    {0x8DA70000u,  2u}, // hnd -> Arab
-    {0x91A70000u, 21u}, // hne -> Deva
-    {0x99A70000u, 55u}, // hng -> Latn
-    {0x9DA70000u, 55u}, // hnh -> Latn
-    {0xA1A70000u, 55u}, // hni -> Latn
-    {0xA5A70000u, 39u}, // hnj -> Hmnp
-    {0xB5A70000u, 55u}, // hnn -> Latn
-    {0xB9A70000u,  2u}, // hno -> Arab
-    {0xC9A70000u, 55u}, // hns -> Latn
-    {0x686F0000u, 55u}, // ho -> Latn
-    {0x81C70000u, 55u}, // hoa -> Latn
-    {0x85C70000u, 55u}, // hob -> Latn
-    {0x89C70000u, 21u}, // hoc -> Deva
-    {0x8DC70000u, 55u}, // hod -> Latn
-    {0x91C70000u, 55u}, // hoe -> Latn
-    {0x9DC70000u,  2u}, // hoh -> Arab
-    {0xA1C70000u, 55u}, // hoi -> Latn
-    {0xA5C70000u, 21u}, // hoj -> Deva
-    {0xADC70000u, 55u}, // hol -> Latn
-    {0xB1C70000u, 55u}, // hom -> Latn
-    {0xB9C70000u, 55u}, // hoo -> Latn
-    {0xBDC70000u, 55u}, // hop -> Latn
-    {0xC5C70000u, 55u}, // hor -> Latn
-    {0xCDC70000u, 55u}, // hot -> Latn
-    {0xD5C70000u, 55u}, // hov -> Latn
-    {0xD9C70000u, 34u}, // how -> Hani
-    {0xE1C70000u, 21u}, // hoy -> Deva
-    {0xB9E70000u, 72u}, // hpo -> Mymr
-    {0x68720000u, 55u}, // hr -> Latn
-    {0x82270000u, 55u}, // hra -> Latn
-    {0x8A270000u, 55u}, // hrc -> Latn
-    {0x92270000u, 55u}, // hre -> Latn
-    {0xAA270000u, 55u}, // hrk -> Latn
-    {0xB2270000u, 55u}, // hrm -> Latn
-    {0xBA270000u, 55u}, // hro -> Latn
-    {0xBE270000u, 55u}, // hrp -> Latn
-    {0xCE270000u, 100u}, // hrt -> Syrc
-    {0xD2270000u, 55u}, // hru -> Latn
-    {0xDA270000u, 55u}, // hrw -> Latn
-    {0xDE270000u, 55u}, // hrx -> Latn
-    {0xE6270000u,  2u}, // hrz -> Arab
-    {0x86470000u, 55u}, // hsb -> Latn
-    {0xB6470000u, 35u}, // hsn -> Hans
-    {0xCA470000u,  2u}, // hss -> Arab
-    {0x68740000u, 55u}, // ht -> Latn
-    {0xA2670000u, 55u}, // hti -> Latn
-    {0xBA670000u, 55u}, // hto -> Latn
-    {0xCA670000u, 55u}, // hts -> Latn
-    {0xD2670000u, 55u}, // htu -> Latn
-    {0xDE670000u, 119u}, // htx -> Xsux
-    {0x68750000u, 55u}, // hu -> Latn
-    {0x86870000u, 55u}, // hub -> Latn
-    {0x8A870000u, 55u}, // huc -> Latn
-    {0x8E870000u, 55u}, // hud -> Latn
-    {0x92870000u, 55u}, // hue -> Latn
-    {0x96870000u, 55u}, // huf -> Latn
-    {0x9A870000u, 55u}, // hug -> Latn
-    {0x9E870000u, 55u}, // huh -> Latn
-    {0xA2870000u, 55u}, // hui -> Latn
-    {0xAA870000u, 55u}, // huk -> Latn
-    {0xAE870000u, 55u}, // hul -> Latn
-    {0xB2870000u, 55u}, // hum -> Latn
-    {0xBE870000u, 55u}, // hup -> Latn
-    {0xC6870000u, 55u}, // hur -> Latn
-    {0xCA870000u, 55u}, // hus -> Latn
-    {0xCE870000u, 21u}, // hut -> Deva
-    {0xD2870000u, 55u}, // huu -> Latn
-    {0xD6870000u, 55u}, // huv -> Latn
-    {0xDA870000u, 55u}, // huw -> Latn
-    {0xDE870000u, 55u}, // hux -> Latn
-    {0xE2870000u, 37u}, // huy -> Hebr
-    {0xE6870000u, 20u}, // huz -> Cyrl
-    {0x8AA70000u, 55u}, // hvc -> Latn
-    {0x92A70000u, 55u}, // hve -> Latn
-    {0xAAA70000u, 55u}, // hvk -> Latn
-    {0xB6A70000u, 55u}, // hvn -> Latn
-    {0xD6A70000u, 55u}, // hvv -> Latn
-    {0x82C70000u, 55u}, // hwa -> Latn
-    {0x8AC70000u, 55u}, // hwc -> Latn
-    {0xBAC70000u, 55u}, // hwo -> Latn
-    {0x68790000u,  4u}, // hy -> Armn
-    {0x83070000u, 55u}, // hya -> Latn
-    {0xDB070000u,  4u}, // hyw -> Armn
-    {0x687A0000u, 55u}, // hz -> Latn
-    {0x69610000u, 55u}, // ia -> Latn
-    {0xA0080000u, 55u}, // iai -> Latn
-    {0xB4080000u, 55u}, // ian -> Latn
-    {0xC4080000u, 55u}, // iar -> Latn
-    {0x80280000u, 55u}, // iba -> Latn
-    {0x84280000u, 55u}, // ibb -> Latn
-    {0x8C280000u, 55u}, // ibd -> Latn
-    {0x90280000u, 55u}, // ibe -> Latn
-    {0x98280000u, 55u}, // ibg -> Latn
-    {0x9C280000u, 55u}, // ibh -> Latn
-    {0xAC280000u, 55u}, // ibl -> Latn
-    {0xB0280000u, 55u}, // ibm -> Latn
-    {0xB4280000u, 55u}, // ibn -> Latn
-    {0xC4280000u, 55u}, // ibr -> Latn
-    {0xD0280000u, 55u}, // ibu -> Latn
-    {0xE0280000u, 55u}, // iby -> Latn
-    {0x80480000u, 55u}, // ica -> Latn
-    {0x9C480000u, 55u}, // ich -> Latn
-    {0xC4480000u, 55u}, // icr -> Latn
-    {0x69640000u, 55u}, // id -> Latn
-    {0x80680000u, 55u}, // ida -> Latn
-    {0x84680000u, 55u}, // idb -> Latn
-    {0x88680000u, 55u}, // idc -> Latn
-    {0x8C680000u, 55u}, // idd -> Latn
-    {0x90680000u, 55u}, // ide -> Latn
-    {0xA0680000u, 55u}, // idi -> Latn
-    {0xC4680000u, 55u}, // idr -> Latn
-    {0xC8680000u, 55u}, // ids -> Latn
-    {0xCC680000u, 55u}, // idt -> Latn
-    {0xD0680000u, 55u}, // idu -> Latn
-    {0x69650000u, 55u}, // ie -> Latn
-    {0x80A80000u, 55u}, // ifa -> Latn
-    {0x84A80000u, 55u}, // ifb -> Latn
-    {0x90A80000u, 55u}, // ife -> Latn
-    {0x94A80000u, 55u}, // iff -> Latn
-    {0xA8A80000u, 55u}, // ifk -> Latn
-    {0xB0A80000u, 55u}, // ifm -> Latn
-    {0xD0A80000u, 55u}, // ifu -> Latn
-    {0xE0A80000u, 55u}, // ify -> Latn
-    {0x69670000u, 55u}, // ig -> Latn
-    {0x84C80000u, 55u}, // igb -> Latn
-    {0x90C80000u, 55u}, // ige -> Latn
-    {0x98C80000u, 55u}, // igg -> Latn
-    {0xACC80000u, 55u}, // igl -> Latn
-    {0xB0C80000u, 55u}, // igm -> Latn
-    {0xB4C80000u, 55u}, // ign -> Latn
-    {0xB8C80000u, 55u}, // igo -> Latn
-    {0xC8C80000u, 55u}, // igs -> Latn
-    {0xD8C80000u, 55u}, // igw -> Latn
-    {0x84E80000u, 55u}, // ihb -> Latn
-    {0xA0E80000u, 55u}, // ihi -> Latn
-    {0xBCE80000u, 55u}, // ihp -> Latn
-    {0xD8E80000u, 55u}, // ihw -> Latn
-    {0x69690000u, 120u}, // ii -> Yiii
-    {0xB5080000u, 55u}, // iin -> Latn
-    {0x89280000u, 55u}, // ijc -> Latn
-    {0x91280000u, 55u}, // ije -> Latn
-    {0xA5280000u, 55u}, // ijj -> Latn
-    {0xB5280000u, 55u}, // ijn -> Latn
-    {0xC9280000u, 55u}, // ijs -> Latn
-    {0x696B0000u, 55u}, // ik -> Latn
-    {0x9D480000u, 55u}, // ikh -> Latn
-    {0xA1480000u, 55u}, // iki -> Latn
-    {0xA9480000u, 55u}, // ikk -> Latn
-    {0xAD480000u, 55u}, // ikl -> Latn
-    {0xB9480000u, 55u}, // iko -> Latn
-    {0xBD480000u, 55u}, // ikp -> Latn
-    {0xC5480000u, 55u}, // ikr -> Latn
-    {0xCD480000u, 55u}, // ikt -> Latn
-    {0xD5480000u, 55u}, // ikv -> Latn
-    {0xD9480000u, 55u}, // ikw -> Latn
-    {0xDD480000u, 55u}, // ikx -> Latn
-    {0xE5480000u, 55u}, // ikz -> Latn
-    {0x81680000u, 55u}, // ila -> Latn
-    {0x85680000u, 55u}, // ilb -> Latn
-    {0x99680000u, 55u}, // ilg -> Latn
-    {0xA1680000u, 55u}, // ili -> Latn
-    {0xA9680000u, 55u}, // ilk -> Latn
-    {0xB1680000u, 55u}, // ilm -> Latn
-    {0xB9680000u, 55u}, // ilo -> Latn
-    {0xBD680000u, 55u}, // ilp -> Latn
-    {0xD1680000u, 55u}, // ilu -> Latn
-    {0xD5680000u, 55u}, // ilv -> Latn
-    {0xA1880000u, 55u}, // imi -> Latn
-    {0xAD880000u, 55u}, // iml -> Latn
-    {0xB5880000u, 55u}, // imn -> Latn
-    {0xB9880000u, 55u}, // imo -> Latn
-    {0xC5880000u, 55u}, // imr -> Latn
-    {0xC9880000u, 55u}, // ims -> Latn
-    {0xCD880000u, 55u}, // imt -> Latn
-    {0xE1880000u, 60u}, // imy -> Lyci
-    {0x696E0000u, 55u}, // in -> Latn
-    {0x85A80000u, 55u}, // inb -> Latn
-    {0x99A80000u, 55u}, // ing -> Latn
-    {0x9DA80000u, 20u}, // inh -> Cyrl
-    {0xA5A80000u, 55u}, // inj -> Latn
-    {0xB5A80000u, 55u}, // inn -> Latn
-    {0xB9A80000u, 55u}, // ino -> Latn
-    {0xBDA80000u, 55u}, // inp -> Latn
-    {0xCDA80000u, 72u}, // int -> Mymr
-    {0x696F0000u, 55u}, // io -> Latn
-    {0xC5C80000u, 24u}, // ior -> Ethi
-    {0xD1C80000u, 55u}, // iou -> Latn
-    {0xD9C80000u, 55u}, // iow -> Latn
-    {0xA1E80000u, 55u}, // ipi -> Latn
-    {0xB9E80000u, 55u}, // ipo -> Latn
-    {0xD2080000u, 55u}, // iqu -> Latn
-    {0xDA080000u, 55u}, // iqw -> Latn
-    {0x92280000u, 55u}, // ire -> Latn
-    {0x9E280000u, 55u}, // irh -> Latn
-    {0xA2280000u, 55u}, // iri -> Latn
-    {0xAA280000u, 55u}, // irk -> Latn
-    {0xB6280000u, 55u}, // irn -> Latn
-    {0xD2280000u, 105u}, // iru -> Taml
-    {0xDE280000u, 55u}, // irx -> Latn
-    {0xE2280000u, 55u}, // iry -> Latn
-    {0x69730000u, 55u}, // is -> Latn
-    {0x82480000u, 55u}, // isa -> Latn
-    {0x8A480000u, 55u}, // isc -> Latn
-    {0x8E480000u, 55u}, // isd -> Latn
-    {0x9E480000u, 55u}, // ish -> Latn
-    {0xA2480000u, 55u}, // isi -> Latn
-    {0xAA480000u,  2u}, // isk -> Arab
-    {0xB2480000u, 55u}, // ism -> Latn
-    {0xB6480000u, 55u}, // isn -> Latn
-    {0xBA480000u, 55u}, // iso -> Latn
-    {0xCE480000u, 55u}, // ist -> Latn
-    {0xD2480000u, 55u}, // isu -> Latn
-    {0x69740000u, 55u}, // it -> Latn
-    {0x86680000u, 55u}, // itb -> Latn
-    {0x8E680000u, 55u}, // itd -> Latn
-    {0x92680000u, 55u}, // ite -> Latn
-    {0xA2680000u, 55u}, // iti -> Latn
-    {0xAA680000u, 37u}, // itk -> Hebr
-    {0xAE680000u, 20u}, // itl -> Cyrl
-    {0xB2680000u, 55u}, // itm -> Latn
-    {0xBA680000u, 55u}, // ito -> Latn
-    {0xC6680000u, 55u}, // itr -> Latn
-    {0xCA680000u, 55u}, // its -> Latn
-    {0xCE680000u, 55u}, // itt -> Latn
-    {0xD6680000u, 55u}, // itv -> Latn
-    {0xDA680000u, 55u}, // itw -> Latn
-    {0xDE680000u, 55u}, // itx -> Latn
-    {0xE2680000u, 55u}, // ity -> Latn
-    {0xE6680000u, 55u}, // itz -> Latn
-    {0x69750000u, 13u}, // iu -> Cans
-    {0xB2880000u, 55u}, // ium -> Latn
-    {0x86A80000u, 55u}, // ivb -> Latn
-    {0xD6A80000u, 55u}, // ivv -> Latn
-    {0x69770000u, 37u}, // iw -> Hebr
-    {0xAAC80000u, 55u}, // iwk -> Latn
-    {0xB2C80000u, 55u}, // iwm -> Latn
-    {0xBAC80000u, 55u}, // iwo -> Latn
-    {0xCAC80000u, 55u}, // iws -> Latn
-    {0x8AE80000u, 55u}, // ixc -> Latn
-    {0xAEE80000u, 55u}, // ixl -> Latn
-    {0x83080000u, 55u}, // iya -> Latn
-    {0xBB080000u, 55u}, // iyo -> Latn
-    {0xDF080000u, 55u}, // iyx -> Latn
-    {0x9F280000u, 55u}, // izh -> Latn
-    {0xB3280000u, 55u}, // izm -> Latn
-    {0xC7280000u, 55u}, // izr -> Latn
-    {0xE7280000u, 55u}, // izz -> Latn
-    {0x6A610000u, 42u}, // ja -> Jpan
-    {0x80090000u, 55u}, // jaa -> Latn
-    {0x84090000u, 55u}, // jab -> Latn
-    {0x88090000u, 55u}, // jac -> Latn
-    {0x8C090000u,  2u}, // jad -> Arab
-    {0x90090000u, 55u}, // jae -> Latn
-    {0x94090000u, 55u}, // jaf -> Latn
-    {0x9C090000u, 55u}, // jah -> Latn
-    {0xA4090000u, 55u}, // jaj -> Latn
-    {0xA8090000u, 55u}, // jak -> Latn
-    {0xAC090000u, 55u}, // jal -> Latn
-    {0xB0090000u, 55u}, // jam -> Latn
-    {0xB4090000u, 55u}, // jan -> Latn
-    {0xB8090000u, 55u}, // jao -> Latn
-    {0xC0090000u, 55u}, // jaq -> Latn
-    {0xC8090000u, 55u}, // jas -> Latn
-    {0xCC090000u,  2u}, // jat -> Arab
-    {0xD0090000u, 55u}, // jau -> Latn
-    {0xDC090000u, 55u}, // jax -> Latn
-    {0xE0090000u, 55u}, // jay -> Latn
-    {0xE4090000u, 55u}, // jaz -> Latn
-    {0x90290000u, 37u}, // jbe -> Hebr
-    {0xA0290000u, 55u}, // jbi -> Latn
-    {0xA4290000u, 55u}, // jbj -> Latn
-    {0xA8290000u, 55u}, // jbk -> Latn
-    {0xB0290000u, 55u}, // jbm -> Latn
-    {0xB4290000u,  2u}, // jbn -> Arab
-    {0xB8290000u, 55u}, // jbo -> Latn
-    {0xC4290000u, 55u}, // jbr -> Latn
-    {0xCC290000u, 55u}, // jbt -> Latn
-    {0xD0290000u, 55u}, // jbu -> Latn
-    {0xD8290000u, 55u}, // jbw -> Latn
-    {0xCC490000u, 20u}, // jct -> Cyrl
-    {0x80690000u, 112u}, // jda -> Tibt
-    {0x98690000u,  2u}, // jdg -> Arab
-    {0xCC690000u, 20u}, // jdt -> Cyrl
-    {0x84890000u, 55u}, // jeb -> Latn
-    {0x90890000u, 21u}, // jee -> Deva
-    {0x9C890000u, 55u}, // jeh -> Latn
-    {0xA0890000u, 55u}, // jei -> Latn
-    {0xA8890000u, 55u}, // jek -> Latn
-    {0xAC890000u, 55u}, // jel -> Latn
-    {0xB4890000u, 55u}, // jen -> Latn
-    {0xC4890000u, 55u}, // jer -> Latn
-    {0xCC890000u, 55u}, // jet -> Latn
-    {0xD0890000u, 55u}, // jeu -> Latn
-    {0x84C90000u, 55u}, // jgb -> Latn
-    {0x90C90000u, 25u}, // jge -> Geor
-    {0xA8C90000u, 55u}, // jgk -> Latn
-    {0xB8C90000u, 55u}, // jgo -> Latn
-    {0xA0E90000u, 55u}, // jhi -> Latn
-    {0x6A690000u, 37u}, // ji -> Hebr
-    {0x81090000u, 55u}, // jia -> Latn
-    {0x85090000u, 55u}, // jib -> Latn
-    {0x89090000u, 55u}, // jic -> Latn
-    {0x8D090000u, 55u}, // jid -> Latn
-    {0x91090000u, 55u}, // jie -> Latn
-    {0x99090000u, 55u}, // jig -> Latn
-    {0xAD090000u, 55u}, // jil -> Latn
-    {0xB1090000u, 55u}, // jim -> Latn
-    {0xCD090000u, 55u}, // jit -> Latn
-    {0xD1090000u, 55u}, // jiu -> Latn
-    {0xD5090000u, 55u}, // jiv -> Latn
-    {0xE1090000u, 55u}, // jiy -> Latn
-    {0x91290000u, 33u}, // jje -> Hang
-    {0xC5290000u, 55u}, // jjr -> Latn
-    {0x81490000u, 55u}, // jka -> Latn
-    {0xB1490000u, 72u}, // jkm -> Mymr
-    {0xB9490000u, 55u}, // jko -> Latn
-    {0xD1490000u, 55u}, // jku -> Latn
-    {0x91690000u, 55u}, // jle -> Latn
-    {0x81890000u, 55u}, // jma -> Latn
-    {0x85890000u, 55u}, // jmb -> Latn
-    {0x89890000u, 55u}, // jmc -> Latn
-    {0x8D890000u, 55u}, // jmd -> Latn
-    {0xA1890000u, 55u}, // jmi -> Latn
-    {0xAD890000u, 21u}, // jml -> Deva
-    {0xB5890000u, 55u}, // jmn -> Latn
-    {0xC5890000u, 55u}, // jmr -> Latn
-    {0xC9890000u, 55u}, // jms -> Latn
-    {0xD9890000u, 55u}, // jmw -> Latn
-    {0xDD890000u, 55u}, // jmx -> Latn
-    {0x81A90000u, 102u}, // jna -> Takr
-    {0x8DA90000u,  2u}, // jnd -> Arab
-    {0x99A90000u, 55u}, // jng -> Latn
-    {0xA1A90000u, 55u}, // jni -> Latn
-    {0xA5A90000u, 55u}, // jnj -> Latn
-    {0xADA90000u, 21u}, // jnl -> Deva
-    {0xC9A90000u, 21u}, // jns -> Deva
-    {0x85C90000u, 55u}, // job -> Latn
-    {0x8DC90000u, 55u}, // jod -> Latn
-    {0x99C90000u,  2u}, // jog -> Arab
-    {0xC5C90000u, 55u}, // jor -> Latn
-    {0xD9C90000u, 55u}, // jow -> Latn
-    {0x81E90000u, 37u}, // jpa -> Hebr
-    {0xC5E90000u, 37u}, // jpr -> Hebr
-    {0xC6090000u, 55u}, // jqr -> Latn
-    {0x82290000u, 55u}, // jra -> Latn
-    {0x86290000u, 37u}, // jrb -> Hebr
-    {0xC6290000u, 55u}, // jrr -> Latn
-    {0xCE290000u, 55u}, // jrt -> Latn
-    {0xD2290000u, 55u}, // jru -> Latn
-    {0x82890000u, 55u}, // jua -> Latn
-    {0x86890000u, 55u}, // jub -> Latn
-    {0x8E890000u, 55u}, // jud -> Latn
-    {0x9E890000u, 55u}, // juh -> Latn
-    {0xA2890000u, 55u}, // jui -> Latn
-    {0xAA890000u, 55u}, // juk -> Latn
-    {0xAE890000u, 21u}, // jul -> Deva
-    {0xB2890000u, 55u}, // jum -> Latn
-    {0xB6890000u, 80u}, // jun -> Orya
-    {0xBA890000u, 55u}, // juo -> Latn
-    {0xBE890000u, 55u}, // jup -> Latn
-    {0xC6890000u, 55u}, // jur -> Latn
-    {0xCE890000u, 55u}, // jut -> Latn
-    {0xD2890000u, 55u}, // juu -> Latn
-    {0xDA890000u, 55u}, // juw -> Latn
-    {0xE2890000u, 80u}, // juy -> Orya
-    {0x6A760000u, 55u}, // jv -> Latn
-    {0x8EA90000u, 55u}, // jvd -> Latn
-    {0xB6A90000u, 55u}, // jvn -> Latn
-    {0x6A770000u, 55u}, // jw -> Latn
-    {0xA2C90000u, 55u}, // jwi -> Latn
-    {0x83090000u, 112u}, // jya -> Tibt
-    {0x93090000u, 37u}, // jye -> Hebr
-    {0xE3090000u, 55u}, // jyy -> Latn
-    {0x6B610000u, 25u}, // ka -> Geor
-    {0x800A0000u, 20u}, // kaa -> Cyrl
-    {0x840A0000u, 55u}, // kab -> Latn
-    {0x880A0000u, 55u}, // kac -> Latn
-    {0x8C0A0000u, 55u}, // kad -> Latn
-    {0x980A0000u, 55u}, // kag -> Latn
-    {0x9C0A0000u, 55u}, // kah -> Latn
-    {0xA00A0000u, 55u}, // kai -> Latn
-    {0xA40A0000u, 55u}, // kaj -> Latn
-    {0xA80A0000u, 55u}, // kak -> Latn
-    {0xB00A0000u, 55u}, // kam -> Latn
-    {0xB80A0000u, 55u}, // kao -> Latn
-    {0xBC0A0000u, 20u}, // kap -> Cyrl
-    {0xC00A0000u, 55u}, // kaq -> Latn
-    {0xD40A0000u, 55u}, // kav -> Latn
-    {0xD80A0000u, 45u}, // kaw -> Kawi
-    {0xDC0A0000u, 55u}, // kax -> Latn
-    {0xE00A0000u, 55u}, // kay -> Latn
-    {0x802A0000u, 55u}, // kba -> Latn
-    {0x842A0000u, 55u}, // kbb -> Latn
-    {0x882A0000u, 55u}, // kbc -> Latn
-    {0x8C2A0000u, 20u}, // kbd -> Cyrl
-    {0x902A0000u, 55u}, // kbe -> Latn
-    {0x982A0000u, 112u}, // kbg -> Tibt
-    {0x9C2A0000u, 55u}, // kbh -> Latn
-    {0xA02A0000u, 55u}, // kbi -> Latn
-    {0xA42A0000u, 55u}, // kbj -> Latn
-    {0xA82A0000u, 55u}, // kbk -> Latn
-    {0xAC2A0000u, 55u}, // kbl -> Latn
-    {0xB02A0000u, 55u}, // kbm -> Latn
-    {0xB42A0000u, 55u}, // kbn -> Latn
-    {0xB82A0000u, 55u}, // kbo -> Latn
-    {0xBC2A0000u, 55u}, // kbp -> Latn
-    {0xC02A0000u, 55u}, // kbq -> Latn
-    {0xC42A0000u, 55u}, // kbr -> Latn
-    {0xC82A0000u, 55u}, // kbs -> Latn
-    {0xCC2A0000u, 55u}, // kbt -> Latn
-    {0xD02A0000u,  2u}, // kbu -> Arab
-    {0xD42A0000u, 55u}, // kbv -> Latn
-    {0xD82A0000u, 55u}, // kbw -> Latn
-    {0xDC2A0000u, 55u}, // kbx -> Latn
-    {0xE02A0000u,  2u}, // kby -> Arab
-    {0xE42A0000u, 55u}, // kbz -> Latn
-    {0x804A0000u, 20u}, // kca -> Cyrl
-    {0x844A0000u, 55u}, // kcb -> Latn
-    {0x884A0000u, 55u}, // kcc -> Latn
-    {0x8C4A0000u, 55u}, // kcd -> Latn
-    {0x904A0000u, 55u}, // kce -> Latn
-    {0x944A0000u, 55u}, // kcf -> Latn
-    {0x984A0000u, 55u}, // kcg -> Latn
-    {0x9C4A0000u, 55u}, // kch -> Latn
-    {0xA04A0000u, 55u}, // kci -> Latn
-    {0xA44A0000u, 55u}, // kcj -> Latn
-    {0xA84A0000u, 55u}, // kck -> Latn
-    {0xAC4A0000u, 55u}, // kcl -> Latn
-    {0xB04A0000u, 55u}, // kcm -> Latn
-    {0xB44A0000u, 55u}, // kcn -> Latn
-    {0xB84A0000u, 55u}, // kco -> Latn
-    {0xBC4A0000u, 55u}, // kcp -> Latn
-    {0xC04A0000u, 55u}, // kcq -> Latn
-    {0xC84A0000u, 55u}, // kcs -> Latn
-    {0xCC4A0000u, 55u}, // kct -> Latn
-    {0xD04A0000u, 55u}, // kcu -> Latn
-    {0xD44A0000u, 55u}, // kcv -> Latn
-    {0xD84A0000u, 55u}, // kcw -> Latn
-    {0xE04A0000u,  2u}, // kcy -> Arab
-    {0xE44A0000u, 55u}, // kcz -> Latn
-    {0x806A0000u, 55u}, // kda -> Latn
-    {0x886A0000u, 55u}, // kdc -> Latn
-    {0x8C6A0000u, 55u}, // kdd -> Latn
-    {0x906A0000u, 55u}, // kde -> Latn
-    {0x946A0000u, 55u}, // kdf -> Latn
-    {0x986A0000u, 55u}, // kdg -> Latn
-    {0x9C6A0000u, 55u}, // kdh -> Latn
-    {0xA06A0000u, 55u}, // kdi -> Latn
-    {0xA46A0000u, 55u}, // kdj -> Latn
-    {0xA86A0000u, 55u}, // kdk -> Latn
-    {0xAC6A0000u, 55u}, // kdl -> Latn
-    {0xB06A0000u, 55u}, // kdm -> Latn
-    {0xB46A0000u, 55u}, // kdn -> Latn
-    {0xBC6A0000u, 55u}, // kdp -> Latn
-    {0xC06A0000u,  9u}, // kdq -> Beng
-    {0xC46A0000u, 55u}, // kdr -> Latn
-    {0xCC6A0000u, 111u}, // kdt -> Thai
-    {0xD86A0000u, 55u}, // kdw -> Latn
-    {0xDC6A0000u, 55u}, // kdx -> Latn
-    {0xE06A0000u, 55u}, // kdy -> Latn
-    {0xE46A0000u, 55u}, // kdz -> Latn
-    {0x808A0000u, 55u}, // kea -> Latn
-    {0x848A0000u, 55u}, // keb -> Latn
-    {0x888A0000u, 55u}, // kec -> Latn
-    {0x8C8A0000u, 55u}, // ked -> Latn
-    {0x908A0000u, 55u}, // kee -> Latn
-    {0x948A0000u, 55u}, // kef -> Latn
-    {0x988A0000u, 55u}, // keg -> Latn
-    {0x9C8A0000u, 55u}, // keh -> Latn
-    {0xA08A0000u, 55u}, // kei -> Latn
-    {0xA88A0000u, 55u}, // kek -> Latn
-    {0xAC8A0000u, 55u}, // kel -> Latn
-    {0xB08A0000u, 55u}, // kem -> Latn
-    {0xB48A0000u, 55u}, // ken -> Latn
-    {0xB88A0000u, 55u}, // keo -> Latn
-    {0xC48A0000u, 55u}, // ker -> Latn
-    {0xC88A0000u, 55u}, // kes -> Latn
-    {0xCC8A0000u, 20u}, // ket -> Cyrl
-    {0xD08A0000u, 55u}, // keu -> Latn
-    {0xD48A0000u, 67u}, // kev -> Mlym
-    {0xD88A0000u, 55u}, // kew -> Latn
-    {0xDC8A0000u, 21u}, // kex -> Deva
-    {0xE08A0000u, 108u}, // key -> Telu
-    {0xE48A0000u, 55u}, // kez -> Latn
-    {0x80AA0000u, 49u}, // kfa -> Knda
-    {0x84AA0000u, 21u}, // kfb -> Deva
-    {0x88AA0000u, 108u}, // kfc -> Telu
-    {0x8CAA0000u, 49u}, // kfd -> Knda
-    {0x90AA0000u, 105u}, // kfe -> Taml
-    {0x94AA0000u, 55u}, // kff -> Latn
-    {0x98AA0000u, 49u}, // kfg -> Knda
-    {0x9CAA0000u, 67u}, // kfh -> Mlym
-    {0xA0AA0000u, 105u}, // kfi -> Taml
-    {0xA8AA0000u, 21u}, // kfk -> Deva
-    {0xACAA0000u, 55u}, // kfl -> Latn
-    {0xB0AA0000u,  2u}, // kfm -> Arab
-    {0xB4AA0000u, 55u}, // kfn -> Latn
-    {0xB8AA0000u, 55u}, // kfo -> Latn
-    {0xBCAA0000u, 21u}, // kfp -> Deva
-    {0xC0AA0000u, 21u}, // kfq -> Deva
-    {0xC4AA0000u, 21u}, // kfr -> Deva
-    {0xC8AA0000u, 21u}, // kfs -> Deva
-    {0xD0AA0000u, 21u}, // kfu -> Deva
-    {0xD4AA0000u, 55u}, // kfv -> Latn
-    {0xD8AA0000u, 55u}, // kfw -> Latn
-    {0xDCAA0000u, 21u}, // kfx -> Deva
-    {0xE0AA0000u, 21u}, // kfy -> Deva
-    {0xE4AA0000u, 55u}, // kfz -> Latn
-    {0x6B670000u, 55u}, // kg -> Latn
-    {0x80CA0000u, 55u}, // kga -> Latn
-    {0x84CA0000u, 55u}, // kgb -> Latn
-    {0x90CA0000u, 55u}, // kge -> Latn
-    {0x94CA0000u, 55u}, // kgf -> Latn
-    {0xA4CA0000u, 21u}, // kgj -> Deva
-    {0xA8CA0000u, 55u}, // kgk -> Latn
-    {0xACCA0000u, 55u}, // kgl -> Latn
-    {0xB8CA0000u, 55u}, // kgo -> Latn
-    {0xBCCA0000u, 55u}, // kgp -> Latn
-    {0xC0CA0000u, 55u}, // kgq -> Latn
-    {0xC4CA0000u, 55u}, // kgr -> Latn
-    {0xC8CA0000u, 55u}, // kgs -> Latn
-    {0xCCCA0000u, 55u}, // kgt -> Latn
-    {0xD0CA0000u, 55u}, // kgu -> Latn
-    {0xD4CA0000u, 55u}, // kgv -> Latn
-    {0xD8CA0000u, 55u}, // kgw -> Latn
-    {0xDCCA0000u, 55u}, // kgx -> Latn
-    {0xE0CA0000u, 21u}, // kgy -> Deva
-    {0x80EA0000u, 55u}, // kha -> Latn
-    {0x84EA0000u, 104u}, // khb -> Talu
-    {0x88EA0000u, 55u}, // khc -> Latn
-    {0x8CEA0000u, 55u}, // khd -> Latn
-    {0x90EA0000u, 55u}, // khe -> Latn
-    {0x94EA0000u, 111u}, // khf -> Thai
-    {0x98EA0000u, 112u}, // khg -> Tibt
-    {0x9CEA0000u, 55u}, // khh -> Latn
-    {0xA4EA0000u, 55u}, // khj -> Latn
-    {0xACEA0000u, 55u}, // khl -> Latn
-    {0xB4EA0000u, 21u}, // khn -> Deva
-    {0xB8EA0000u, 11u}, // kho -> Brah
-    {0xBCEA0000u, 55u}, // khp -> Latn
-    {0xC0EA0000u, 55u}, // khq -> Latn
-    {0xC4EA0000u, 55u}, // khr -> Latn
-    {0xC8EA0000u, 55u}, // khs -> Latn
-    {0xCCEA0000u, 72u}, // kht -> Mymr
-    {0xD0EA0000u, 55u}, // khu -> Latn
-    {0xD4EA0000u, 20u}, // khv -> Cyrl
-    {0xD8EA0000u,  2u}, // khw -> Arab
-    {0xDCEA0000u, 55u}, // khx -> Latn
-    {0xE0EA0000u, 55u}, // khy -> Latn
-    {0xE4EA0000u, 55u}, // khz -> Latn
-    {0x6B690000u, 55u}, // ki -> Latn
-    {0x810A0000u, 55u}, // kia -> Latn
-    {0x850A0000u, 55u}, // kib -> Latn
-    {0x890A0000u, 55u}, // kic -> Latn
-    {0x8D0A0000u, 55u}, // kid -> Latn
-    {0x910A0000u, 55u}, // kie -> Latn
-    {0x950A0000u, 21u}, // kif -> Deva
-    {0x990A0000u, 55u}, // kig -> Latn
-    {0x9D0A0000u, 55u}, // kih -> Latn
-    {0xA50A0000u, 55u}, // kij -> Latn
-    {0xAD0A0000u, 55u}, // kil -> Latn
-    {0xB10A0000u, 20u}, // kim -> Cyrl
-    {0xB90A0000u, 55u}, // kio -> Latn
-    {0xBD0A0000u, 21u}, // kip -> Deva
-    {0xC10A0000u, 55u}, // kiq -> Latn
-    {0xC90A0000u, 55u}, // kis -> Latn
-    {0xCD0A0000u, 55u}, // kit -> Latn
-    {0xD10A0000u, 55u}, // kiu -> Latn
-    {0xD50A0000u, 55u}, // kiv -> Latn
-    {0xD90A0000u, 55u}, // kiw -> Latn
-    {0xDD0A0000u, 55u}, // kix -> Latn
-    {0xE10A0000u, 55u}, // kiy -> Latn
-    {0xE50A0000u, 55u}, // kiz -> Latn
-    {0x6B6A0000u, 55u}, // kj -> Latn
-    {0x812A0000u, 55u}, // kja -> Latn
-    {0x852A0000u, 55u}, // kjb -> Latn
-    {0x892A0000u, 55u}, // kjc -> Latn
-    {0x8D2A0000u, 55u}, // kjd -> Latn
-    {0x912A0000u, 55u}, // kje -> Latn
-    {0x992A0000u, 52u}, // kjg -> Laoo
-    {0x9D2A0000u, 20u}, // kjh -> Cyrl
-    {0xA12A0000u, 55u}, // kji -> Latn
-    {0xA52A0000u, 55u}, // kjj -> Latn
-    {0xA92A0000u, 55u}, // kjk -> Latn
-    {0xAD2A0000u, 21u}, // kjl -> Deva
-    {0xB12A0000u, 55u}, // kjm -> Latn
-    {0xB52A0000u, 55u}, // kjn -> Latn
-    {0xB92A0000u, 21u}, // kjo -> Deva
-    {0xBD2A0000u, 72u}, // kjp -> Mymr
-    {0xC12A0000u, 55u}, // kjq -> Latn
-    {0xC52A0000u, 55u}, // kjr -> Latn
-    {0xC92A0000u, 55u}, // kjs -> Latn
-    {0xCD2A0000u, 111u}, // kjt -> Thai
-    {0xD12A0000u, 55u}, // kju -> Latn
-    {0xDD2A0000u, 55u}, // kjx -> Latn
-    {0xE12A0000u, 55u}, // kjy -> Latn
-    {0xE52A0000u, 112u}, // kjz -> Tibt
-    {0x6B6B0000u, 20u}, // kk -> Cyrl
-    {0x6B6B4146u,  2u}, // kk-AF -> Arab
-    {0x6B6B434Eu,  2u}, // kk-CN -> Arab
-    {0x6B6B4952u,  2u}, // kk-IR -> Arab
-    {0x6B6B4D4Eu,  2u}, // kk-MN -> Arab
-    {0x814A0000u, 55u}, // kka -> Latn
-    {0x854A0000u, 55u}, // kkb -> Latn
-    {0x894A0000u, 55u}, // kkc -> Latn
-    {0x8D4A0000u, 55u}, // kkd -> Latn
-    {0x914A0000u, 55u}, // kke -> Latn
-    {0x954A0000u, 112u}, // kkf -> Tibt
-    {0x994A0000u, 55u}, // kkg -> Latn
-    {0x9D4A0000u, 51u}, // kkh -> Lana
-    {0xA14A0000u, 55u}, // kki -> Latn
-    {0xA54A0000u, 55u}, // kkj -> Latn
-    {0xA94A0000u, 55u}, // kkk -> Latn
-    {0xAD4A0000u, 55u}, // kkl -> Latn
-    {0xB14A0000u, 55u}, // kkm -> Latn
-    {0xB94A0000u, 55u}, // kko -> Latn
-    {0xBD4A0000u, 55u}, // kkp -> Latn
-    {0xC14A0000u, 55u}, // kkq -> Latn
-    {0xC54A0000u, 55u}, // kkr -> Latn
-    {0xC94A0000u, 55u}, // kks -> Latn
-    {0xCD4A0000u, 21u}, // kkt -> Deva
-    {0xD14A0000u, 55u}, // kku -> Latn
-    {0xD54A0000u, 55u}, // kkv -> Latn
-    {0xD94A0000u, 55u}, // kkw -> Latn
-    {0xDD4A0000u, 55u}, // kkx -> Latn
-    {0xE14A0000u, 55u}, // kky -> Latn
-    {0xE54A0000u, 55u}, // kkz -> Latn
-    {0x6B6C0000u, 55u}, // kl -> Latn
-    {0x816A0000u, 55u}, // kla -> Latn
-    {0x856A0000u, 55u}, // klb -> Latn
-    {0x896A0000u, 55u}, // klc -> Latn
-    {0x8D6A0000u, 55u}, // kld -> Latn
-    {0x916A0000u, 21u}, // kle -> Deva
-    {0x956A0000u, 55u}, // klf -> Latn
-    {0x996A0000u, 55u}, // klg -> Latn
-    {0x9D6A0000u, 55u}, // klh -> Latn
-    {0xA16A0000u, 55u}, // kli -> Latn
-    {0xA56A0000u,  2u}, // klj -> Arab
-    {0xA96A0000u, 55u}, // klk -> Latn
-    {0xAD6A0000u, 55u}, // kll -> Latn
-    {0xB16A0000u, 55u}, // klm -> Latn
-    {0xB56A0000u, 55u}, // kln -> Latn
-    {0xB96A0000u, 55u}, // klo -> Latn
-    {0xBD6A0000u, 55u}, // klp -> Latn
-    {0xC16A0000u, 55u}, // klq -> Latn
-    {0xC56A0000u, 21u}, // klr -> Deva
-    {0xC96A0000u, 55u}, // kls -> Latn
-    {0xCD6A0000u, 55u}, // klt -> Latn
-    {0xD16A0000u, 55u}, // klu -> Latn
-    {0xD56A0000u, 55u}, // klv -> Latn
-    {0xD96A0000u, 55u}, // klw -> Latn
-    {0xDD6A0000u, 55u}, // klx -> Latn
-    {0xE16A0000u, 55u}, // kly -> Latn
-    {0xE56A0000u, 55u}, // klz -> Latn
-    {0x6B6D0000u, 47u}, // km -> Khmr
-    {0x818A0000u, 55u}, // kma -> Latn
-    {0x858A0000u, 55u}, // kmb -> Latn
-    {0x898A0000u, 55u}, // kmc -> Latn
-    {0x8D8A0000u, 55u}, // kmd -> Latn
-    {0x918A0000u, 55u}, // kme -> Latn
-    {0x958A0000u, 55u}, // kmf -> Latn
-    {0x998A0000u, 55u}, // kmg -> Latn
-    {0x9D8A0000u, 55u}, // kmh -> Latn
-    {0xA18A0000u, 55u}, // kmi -> Latn
-    {0xA58A0000u, 21u}, // kmj -> Deva
-    {0xA98A0000u, 55u}, // kmk -> Latn
-    {0xAD8A0000u, 55u}, // kml -> Latn
-    {0xB18A0000u, 55u}, // kmm -> Latn
-    {0xB58A0000u, 55u}, // kmn -> Latn
-    {0xB98A0000u, 55u}, // kmo -> Latn
-    {0xBD8A0000u, 55u}, // kmp -> Latn
-    {0xC18A0000u, 55u}, // kmq -> Latn
-    {0xC98A0000u, 55u}, // kms -> Latn
-    {0xCD8A0000u, 55u}, // kmt -> Latn
-    {0xD18A0000u, 55u}, // kmu -> Latn
-    {0xD58A0000u, 55u}, // kmv -> Latn
-    {0xD98A0000u, 55u}, // kmw -> Latn
-    {0xDD8A0000u, 55u}, // kmx -> Latn
-    {0xE18A0000u, 55u}, // kmy -> Latn
-    {0xE58A0000u,  2u}, // kmz -> Arab
-    {0x6B6E0000u, 49u}, // kn -> Knda
-    {0x81AA0000u, 55u}, // kna -> Latn
-    {0x85AA0000u, 55u}, // knb -> Latn
-    {0x8DAA0000u, 55u}, // knd -> Latn
-    {0x91AA0000u, 55u}, // kne -> Latn
-    {0x95AA0000u, 55u}, // knf -> Latn
-    {0xA1AA0000u, 55u}, // kni -> Latn
-    {0xA5AA0000u, 55u}, // knj -> Latn
-    {0xA9AA0000u, 55u}, // knk -> Latn
-    {0xADAA0000u, 55u}, // knl -> Latn
-    {0xB1AA0000u, 55u}, // knm -> Latn
-    {0xB5AA0000u, 21u}, // knn -> Deva
-    {0xB9AA0000u, 55u}, // kno -> Latn
-    {0xBDAA0000u, 55u}, // knp -> Latn
-    {0xC1AA0000u, 55u}, // knq -> Latn
-    {0xC5AA0000u, 55u}, // knr -> Latn
-    {0xC9AA0000u, 55u}, // kns -> Latn
-    {0xCDAA0000u, 55u}, // knt -> Latn
-    {0xD1AA0000u, 55u}, // knu -> Latn
-    {0xD5AA0000u, 55u}, // knv -> Latn
-    {0xD9AA0000u, 55u}, // knw -> Latn
-    {0xDDAA0000u, 55u}, // knx -> Latn
-    {0xE1AA0000u, 55u}, // kny -> Latn
-    {0xE5AA0000u, 55u}, // knz -> Latn
-    {0x6B6F0000u, 50u}, // ko -> Kore
-    {0x81CA0000u, 55u}, // koa -> Latn
-    {0x89CA0000u, 55u}, // koc -> Latn
-    {0x8DCA0000u, 55u}, // kod -> Latn
-    {0x91CA0000u, 55u}, // koe -> Latn
-    {0x95CA0000u, 55u}, // kof -> Latn
-    {0x99CA0000u, 55u}, // kog -> Latn
-    {0x9DCA0000u, 55u}, // koh -> Latn
-    {0xA1CA0000u, 20u}, // koi -> Cyrl
-    {0xA9CA0000u, 21u}, // kok -> Deva
-    {0xADCA0000u, 55u}, // kol -> Latn
-    {0xB9CA0000u, 55u}, // koo -> Latn
-    {0xBDCA0000u, 55u}, // kop -> Latn
-    {0xC1CA0000u, 55u}, // koq -> Latn
-    {0xC9CA0000u, 55u}, // kos -> Latn
-    {0xCDCA0000u, 55u}, // kot -> Latn
-    {0xD1CA0000u, 55u}, // kou -> Latn
-    {0xD5CA0000u, 55u}, // kov -> Latn
-    {0xD9CA0000u, 55u}, // kow -> Latn
-    {0xE1CA0000u, 55u}, // koy -> Latn
-    {0xE5CA0000u, 55u}, // koz -> Latn
-    {0x81EA0000u, 55u}, // kpa -> Latn
-    {0x89EA0000u, 55u}, // kpc -> Latn
-    {0x8DEA0000u, 55u}, // kpd -> Latn
-    {0x91EA0000u, 55u}, // kpe -> Latn
-    {0x95EA0000u, 55u}, // kpf -> Latn
-    {0x99EA0000u, 55u}, // kpg -> Latn
-    {0x9DEA0000u, 55u}, // kph -> Latn
-    {0xA1EA0000u, 55u}, // kpi -> Latn
-    {0xA5EA0000u, 55u}, // kpj -> Latn
-    {0xA9EA0000u, 55u}, // kpk -> Latn
-    {0xADEA0000u, 55u}, // kpl -> Latn
-    {0xB1EA0000u, 55u}, // kpm -> Latn
-    {0xB5EA0000u, 55u}, // kpn -> Latn
-    {0xB9EA0000u, 55u}, // kpo -> Latn
-    {0xC1EA0000u, 55u}, // kpq -> Latn
-    {0xC5EA0000u, 55u}, // kpr -> Latn
-    {0xC9EA0000u, 55u}, // kps -> Latn
-    {0xCDEA0000u, 20u}, // kpt -> Cyrl
-    {0xD1EA0000u, 55u}, // kpu -> Latn
-    {0xD9EA0000u, 55u}, // kpw -> Latn
-    {0xDDEA0000u, 55u}, // kpx -> Latn
-    {0xE1EA0000u, 20u}, // kpy -> Cyrl
-    {0xE5EA0000u, 55u}, // kpz -> Latn
-    {0x820A0000u, 55u}, // kqa -> Latn
-    {0x860A0000u, 55u}, // kqb -> Latn
-    {0x8A0A0000u, 55u}, // kqc -> Latn
-    {0x8E0A0000u, 100u}, // kqd -> Syrc
-    {0x920A0000u, 55u}, // kqe -> Latn
-    {0x960A0000u, 55u}, // kqf -> Latn
-    {0x9A0A0000u, 55u}, // kqg -> Latn
-    {0x9E0A0000u, 55u}, // kqh -> Latn
-    {0xA20A0000u, 55u}, // kqi -> Latn
-    {0xA60A0000u, 55u}, // kqj -> Latn
-    {0xAA0A0000u, 55u}, // kqk -> Latn
-    {0xAE0A0000u, 55u}, // kql -> Latn
-    {0xB20A0000u, 55u}, // kqm -> Latn
-    {0xB60A0000u, 55u}, // kqn -> Latn
-    {0xBA0A0000u, 55u}, // kqo -> Latn
-    {0xBE0A0000u, 55u}, // kqp -> Latn
-    {0xC20A0000u, 55u}, // kqq -> Latn
-    {0xC60A0000u, 55u}, // kqr -> Latn
-    {0xCA0A0000u, 55u}, // kqs -> Latn
-    {0xCE0A0000u, 55u}, // kqt -> Latn
-    {0xD20A0000u, 55u}, // kqu -> Latn
-    {0xD60A0000u, 55u}, // kqv -> Latn
-    {0xDA0A0000u, 55u}, // kqw -> Latn
-    {0xDE0A0000u, 55u}, // kqx -> Latn
-    {0xE20A0000u, 24u}, // kqy -> Ethi
-    {0xE60A0000u, 55u}, // kqz -> Latn
-    {0x6B720000u, 55u}, // kr -> Latn
-    {0x822A0000u, 21u}, // kra -> Deva
-    {0x862A0000u, 55u}, // krb -> Latn
-    {0x8A2A0000u, 20u}, // krc -> Cyrl
-    {0x8E2A0000u, 55u}, // krd -> Latn
-    {0x922A0000u, 55u}, // kre -> Latn
-    {0x962A0000u, 55u}, // krf -> Latn
-    {0x9E2A0000u, 55u}, // krh -> Latn
-    {0xA22A0000u, 55u}, // kri -> Latn
-    {0xA62A0000u, 55u}, // krj -> Latn
-    {0xAA2A0000u, 20u}, // krk -> Cyrl
-    {0xAE2A0000u, 55u}, // krl -> Latn
-    {0xB62A0000u, 55u}, // krn -> Latn
-    {0xBE2A0000u, 55u}, // krp -> Latn
-    {0xC62A0000u, 47u}, // krr -> Khmr
-    {0xCA2A0000u, 55u}, // krs -> Latn
-    {0xCE2A0000u, 55u}, // krt -> Latn
-    {0xD22A0000u, 21u}, // kru -> Deva
-    {0xD62A0000u, 47u}, // krv -> Khmr
-    {0xDA2A0000u, 55u}, // krw -> Latn
-    {0xDE2A0000u, 55u}, // krx -> Latn
-    {0xE22A0000u, 55u}, // kry -> Latn
-    {0xE62A0000u, 55u}, // krz -> Latn
-    {0x6B730000u,  2u}, // ks -> Arab
-    {0x864A0000u, 55u}, // ksb -> Latn
-    {0x8A4A0000u, 55u}, // ksc -> Latn
-    {0x8E4A0000u, 55u}, // ksd -> Latn
-    {0x924A0000u, 55u}, // kse -> Latn
-    {0x964A0000u, 55u}, // ksf -> Latn
-    {0x9A4A0000u, 55u}, // ksg -> Latn
-    {0x9E4A0000u, 55u}, // ksh -> Latn
-    {0xA24A0000u, 55u}, // ksi -> Latn
-    {0xA64A0000u, 55u}, // ksj -> Latn
-    {0xAA4A0000u, 55u}, // ksk -> Latn
-    {0xAE4A0000u, 55u}, // ksl -> Latn
-    {0xB24A0000u, 55u}, // ksm -> Latn
-    {0xB64A0000u, 55u}, // ksn -> Latn
-    {0xBA4A0000u, 55u}, // kso -> Latn
-    {0xBE4A0000u, 55u}, // ksp -> Latn
-    {0xC24A0000u, 55u}, // ksq -> Latn
-    {0xC64A0000u, 55u}, // ksr -> Latn
-    {0xCA4A0000u, 55u}, // kss -> Latn
-    {0xCE4A0000u, 55u}, // kst -> Latn
-    {0xD24A0000u, 72u}, // ksu -> Mymr
-    {0xD64A0000u, 55u}, // ksv -> Latn
-    {0xDA4A0000u, 72u}, // ksw -> Mymr
-    {0xDE4A0000u, 55u}, // ksx -> Latn
-    {0xE64A0000u, 21u}, // ksz -> Deva
-    {0x826A0000u, 55u}, // kta -> Latn
-    {0x866A0000u, 24u}, // ktb -> Ethi
-    {0x8A6A0000u, 55u}, // ktc -> Latn
-    {0x8E6A0000u, 55u}, // ktd -> Latn
-    {0x926A0000u, 21u}, // kte -> Deva
-    {0x966A0000u, 55u}, // ktf -> Latn
-    {0x9A6A0000u, 55u}, // ktg -> Latn
-    {0x9E6A0000u, 55u}, // kth -> Latn
-    {0xA26A0000u, 55u}, // kti -> Latn
-    {0xA66A0000u, 55u}, // ktj -> Latn
-    {0xAA6A0000u, 55u}, // ktk -> Latn
-    {0xAE6A0000u,  2u}, // ktl -> Arab
-    {0xB26A0000u, 55u}, // ktm -> Latn
-    {0xB66A0000u, 55u}, // ktn -> Latn
-    {0xBA6A0000u, 55u}, // kto -> Latn
-    {0xBE6A0000u, 86u}, // ktp -> Plrd
-    {0xC26A0000u, 55u}, // ktq -> Latn
-    {0xCA6A0000u, 55u}, // kts -> Latn
-    {0xCE6A0000u, 55u}, // ktt -> Latn
-    {0xD26A0000u, 55u}, // ktu -> Latn
-    {0xD66A0000u, 55u}, // ktv -> Latn
-    {0xDA6A0000u, 55u}, // ktw -> Latn
-    {0xDE6A0000u, 55u}, // ktx -> Latn
-    {0xE26A0000u, 55u}, // kty -> Latn
-    {0xE66A0000u, 55u}, // ktz -> Latn
-    {0x6B750000u, 55u}, // ku -> Latn
-    {0x6B754C42u,  2u}, // ku-LB -> Arab
-    {0x868A0000u, 55u}, // kub -> Latn
-    {0x8A8A0000u, 55u}, // kuc -> Latn
-    {0x8E8A0000u, 55u}, // kud -> Latn
-    {0x928A0000u, 55u}, // kue -> Latn
-    {0x968A0000u, 52u}, // kuf -> Laoo
-    {0x9A8A0000u, 55u}, // kug -> Latn
-    {0x9E8A0000u, 55u}, // kuh -> Latn
-    {0xA28A0000u, 55u}, // kui -> Latn
-    {0xA68A0000u, 55u}, // kuj -> Latn
-    {0xAA8A0000u, 55u}, // kuk -> Latn
-    {0xAE8A0000u, 55u}, // kul -> Latn
-    {0xB28A0000u, 20u}, // kum -> Cyrl
-    {0xB68A0000u, 55u}, // kun -> Latn
-    {0xBA8A0000u, 55u}, // kuo -> Latn
-    {0xBE8A0000u, 55u}, // kup -> Latn
-    {0xC28A0000u, 55u}, // kuq -> Latn
-    {0xCA8A0000u, 55u}, // kus -> Latn
-    {0xCE8A0000u, 55u}, // kut -> Latn
-    {0xD28A0000u, 55u}, // kuu -> Latn
-    {0xD68A0000u, 55u}, // kuv -> Latn
-    {0xDA8A0000u, 55u}, // kuw -> Latn
-    {0xDE8A0000u, 55u}, // kux -> Latn
-    {0xE28A0000u, 55u}, // kuy -> Latn
-    {0xE68A0000u, 55u}, // kuz -> Latn
-    {0x6B760000u, 20u}, // kv -> Cyrl
-    {0x82AA0000u, 20u}, // kva -> Cyrl
-    {0x86AA0000u, 55u}, // kvb -> Latn
-    {0x8AAA0000u, 55u}, // kvc -> Latn
-    {0x8EAA0000u, 55u}, // kvd -> Latn
-    {0x92AA0000u, 55u}, // kve -> Latn
-    {0x96AA0000u, 55u}, // kvf -> Latn
-    {0x9AAA0000u, 55u}, // kvg -> Latn
-    {0x9EAA0000u, 55u}, // kvh -> Latn
-    {0xA2AA0000u, 55u}, // kvi -> Latn
-    {0xA6AA0000u, 55u}, // kvj -> Latn
-    {0xAEAA0000u, 55u}, // kvl -> Latn
-    {0xB2AA0000u, 55u}, // kvm -> Latn
-    {0xB6AA0000u, 55u}, // kvn -> Latn
-    {0xBAAA0000u, 55u}, // kvo -> Latn
-    {0xBEAA0000u, 55u}, // kvp -> Latn
-    {0xC2AA0000u, 72u}, // kvq -> Mymr
-    {0xC6AA0000u, 55u}, // kvr -> Latn
-    {0xCEAA0000u, 72u}, // kvt -> Mymr
-    {0xD6AA0000u, 55u}, // kvv -> Latn
-    {0xDAAA0000u, 55u}, // kvw -> Latn
-    {0xDEAA0000u,  2u}, // kvx -> Arab
-    {0xE2AA0000u, 43u}, // kvy -> Kali
-    {0xE6AA0000u, 55u}, // kvz -> Latn
-    {0x6B770000u, 55u}, // kw -> Latn
-    {0x82CA0000u, 55u}, // kwa -> Latn
-    {0x86CA0000u, 55u}, // kwb -> Latn
-    {0x8ACA0000u, 55u}, // kwc -> Latn
-    {0x8ECA0000u, 55u}, // kwd -> Latn
-    {0x92CA0000u, 55u}, // kwe -> Latn
-    {0x96CA0000u, 55u}, // kwf -> Latn
-    {0x9ACA0000u, 55u}, // kwg -> Latn
-    {0x9ECA0000u, 55u}, // kwh -> Latn
-    {0xA2CA0000u, 55u}, // kwi -> Latn
-    {0xA6CA0000u, 55u}, // kwj -> Latn
-    {0xAACA0000u, 55u}, // kwk -> Latn
-    {0xAECA0000u, 55u}, // kwl -> Latn
-    {0xB2CA0000u, 55u}, // kwm -> Latn
-    {0xB6CA0000u, 55u}, // kwn -> Latn
-    {0xBACA0000u, 55u}, // kwo -> Latn
-    {0xBECA0000u, 55u}, // kwp -> Latn
-    {0xC6CA0000u, 55u}, // kwr -> Latn
-    {0xCACA0000u, 55u}, // kws -> Latn
-    {0xCECA0000u, 55u}, // kwt -> Latn
-    {0xD2CA0000u, 55u}, // kwu -> Latn
-    {0xD6CA0000u, 55u}, // kwv -> Latn
-    {0xDACA0000u, 55u}, // kww -> Latn
-    {0xE2CA0000u, 55u}, // kwy -> Latn
-    {0xE6CA0000u, 55u}, // kwz -> Latn
-    {0x82EA0000u, 55u}, // kxa -> Latn
-    {0x86EA0000u, 55u}, // kxb -> Latn
-    {0x8AEA0000u, 55u}, // kxc -> Latn
-    {0x8EEA0000u, 55u}, // kxd -> Latn
-    {0x96EA0000u, 72u}, // kxf -> Mymr
-    {0xA2EA0000u, 55u}, // kxi -> Latn
-    {0xA6EA0000u, 55u}, // kxj -> Latn
-    {0xAAEA0000u, 72u}, // kxk -> Mymr
-    {0xB2EA0000u, 111u}, // kxm -> Thai
-    {0xB6EA0000u, 55u}, // kxn -> Latn
-    {0xBAEA0000u, 55u}, // kxo -> Latn
-    {0xBEEA0000u,  2u}, // kxp -> Arab
-    {0xC2EA0000u, 55u}, // kxq -> Latn
-    {0xC6EA0000u, 55u}, // kxr -> Latn
-    {0xCEEA0000u, 55u}, // kxt -> Latn
-    {0xD6EA0000u, 55u}, // kxv -> Latn
-    {0xDAEA0000u, 55u}, // kxw -> Latn
-    {0xDEEA0000u, 55u}, // kxx -> Latn
-    {0xE2EA0000u, 55u}, // kxy -> Latn
-    {0xE6EA0000u, 55u}, // kxz -> Latn
-    {0x6B790000u, 20u}, // ky -> Cyrl
-    {0x6B79434Eu,  2u}, // ky-CN -> Arab
-    {0x6B795452u, 55u}, // ky-TR -> Latn
-    {0x830A0000u, 55u}, // kya -> Latn
-    {0x870A0000u, 55u}, // kyb -> Latn
-    {0x8B0A0000u, 55u}, // kyc -> Latn
-    {0x8F0A0000u, 55u}, // kyd -> Latn
-    {0x930A0000u, 55u}, // kye -> Latn
-    {0x970A0000u, 55u}, // kyf -> Latn
-    {0x9B0A0000u, 55u}, // kyg -> Latn
-    {0x9F0A0000u, 55u}, // kyh -> Latn
-    {0xA30A0000u, 55u}, // kyi -> Latn
-    {0xA70A0000u, 55u}, // kyj -> Latn
-    {0xAB0A0000u, 55u}, // kyk -> Latn
-    {0xAF0A0000u, 55u}, // kyl -> Latn
-    {0xB30A0000u, 55u}, // kym -> Latn
-    {0xB70A0000u, 55u}, // kyn -> Latn
-    {0xBB0A0000u, 55u}, // kyo -> Latn
-    {0xC30A0000u, 55u}, // kyq -> Latn
-    {0xC70A0000u, 55u}, // kyr -> Latn
-    {0xCB0A0000u, 55u}, // kys -> Latn
-    {0xCF0A0000u, 55u}, // kyt -> Latn
-    {0xD30A0000u, 43u}, // kyu -> Kali
-    {0xD70A0000u, 21u}, // kyv -> Deva
-    {0xDB0A0000u, 21u}, // kyw -> Deva
-    {0xDF0A0000u, 55u}, // kyx -> Latn
-    {0xE30A0000u, 55u}, // kyy -> Latn
-    {0xE70A0000u, 55u}, // kyz -> Latn
-    {0x832A0000u, 55u}, // kza -> Latn
-    {0x872A0000u, 55u}, // kzb -> Latn
-    {0x8B2A0000u, 55u}, // kzc -> Latn
-    {0x8F2A0000u, 55u}, // kzd -> Latn
-    {0x932A0000u, 55u}, // kze -> Latn
-    {0x972A0000u, 55u}, // kzf -> Latn
-    {0xA32A0000u, 55u}, // kzi -> Latn
-    {0xAB2A0000u, 55u}, // kzk -> Latn
-    {0xAF2A0000u, 55u}, // kzl -> Latn
-    {0xB32A0000u, 55u}, // kzm -> Latn
-    {0xB72A0000u, 55u}, // kzn -> Latn
-    {0xBB2A0000u, 55u}, // kzo -> Latn
-    {0xBF2A0000u, 55u}, // kzp -> Latn
-    {0xC72A0000u, 55u}, // kzr -> Latn
-    {0xCB2A0000u, 55u}, // kzs -> Latn
-    {0xD32A0000u, 55u}, // kzu -> Latn
-    {0xD72A0000u, 55u}, // kzv -> Latn
-    {0xDB2A0000u, 55u}, // kzw -> Latn
-    {0xDF2A0000u, 55u}, // kzx -> Latn
-    {0xE32A0000u, 55u}, // kzy -> Latn
-    {0xE72A0000u, 55u}, // kzz -> Latn
-    {0x6C610000u, 55u}, // la -> Latn
-    {0x800B0000u, 55u}, // laa -> Latn
-    {0x840B0000u, 57u}, // lab -> Lina
-    {0x880B0000u, 55u}, // lac -> Latn
-    {0x8C0B0000u, 37u}, // lad -> Hebr
-    {0x900B0000u, 21u}, // lae -> Deva
-    {0x980B0000u, 55u}, // lag -> Latn
-    {0x9C0B0000u,  2u}, // lah -> Arab
-    {0xA00B0000u, 55u}, // lai -> Latn
-    {0xA40B0000u, 55u}, // laj -> Latn
-    {0xAC0B0000u, 55u}, // lal -> Latn
-    {0xB00B0000u, 55u}, // lam -> Latn
-    {0xB40B0000u, 55u}, // lan -> Latn
-    {0xBC0B0000u, 55u}, // lap -> Latn
-    {0xC00B0000u, 55u}, // laq -> Latn
-    {0xC40B0000u, 55u}, // lar -> Latn
-    {0xC80B0000u, 55u}, // las -> Latn
-    {0xD00B0000u, 55u}, // lau -> Latn
-    {0xD80B0000u, 55u}, // law -> Latn
-    {0xDC0B0000u, 55u}, // lax -> Latn
-    {0xE40B0000u, 55u}, // laz -> Latn
-    {0x6C620000u, 55u}, // lb -> Latn
-    {0x842B0000u, 55u}, // lbb -> Latn
-    {0x902B0000u, 20u}, // lbe -> Cyrl
-    {0x942B0000u, 21u}, // lbf -> Deva
-    {0xA02B0000u, 55u}, // lbi -> Latn
-    {0xA42B0000u, 112u}, // lbj -> Tibt
-    {0xAC2B0000u, 55u}, // lbl -> Latn
-    {0xB02B0000u, 21u}, // lbm -> Deva
-    {0xB42B0000u, 55u}, // lbn -> Latn
-    {0xB82B0000u, 52u}, // lbo -> Laoo
-    {0xC02B0000u, 55u}, // lbq -> Latn
-    {0xC42B0000u, 21u}, // lbr -> Deva
-    {0xCC2B0000u, 55u}, // lbt -> Latn
-    {0xD02B0000u, 55u}, // lbu -> Latn
-    {0xD42B0000u, 55u}, // lbv -> Latn
-    {0xD82B0000u, 55u}, // lbw -> Latn
-    {0xDC2B0000u, 55u}, // lbx -> Latn
-    {0xE02B0000u, 55u}, // lby -> Latn
-    {0xE42B0000u, 55u}, // lbz -> Latn
-    {0x884B0000u, 55u}, // lcc -> Latn
-    {0x8C4B0000u, 55u}, // lcd -> Latn
-    {0x904B0000u, 55u}, // lce -> Latn
-    {0x944B0000u, 55u}, // lcf -> Latn
-    {0x9C4B0000u, 55u}, // lch -> Latn
-    {0xAC4B0000u, 55u}, // lcl -> Latn
-    {0xB04B0000u, 55u}, // lcm -> Latn
-    {0xBC4B0000u, 111u}, // lcp -> Thai
-    {0xC04B0000u, 55u}, // lcq -> Latn
-    {0xC84B0000u, 55u}, // lcs -> Latn
-    {0x806B0000u, 55u}, // lda -> Latn
-    {0x846B0000u, 55u}, // ldb -> Latn
-    {0x8C6B0000u, 55u}, // ldd -> Latn
-    {0x986B0000u, 55u}, // ldg -> Latn
-    {0x9C6B0000u, 55u}, // ldh -> Latn
-    {0xA06B0000u, 55u}, // ldi -> Latn
-    {0xA46B0000u, 55u}, // ldj -> Latn
-    {0xA86B0000u, 55u}, // ldk -> Latn
-    {0xAC6B0000u, 55u}, // ldl -> Latn
-    {0xB06B0000u, 55u}, // ldm -> Latn
-    {0xB46B0000u, 55u}, // ldn -> Latn
-    {0xB86B0000u, 55u}, // ldo -> Latn
-    {0xBC6B0000u, 55u}, // ldp -> Latn
-    {0xC06B0000u, 55u}, // ldq -> Latn
-    {0x808B0000u, 55u}, // lea -> Latn
-    {0x848B0000u, 55u}, // leb -> Latn
-    {0x888B0000u, 55u}, // lec -> Latn
-    {0x8C8B0000u, 55u}, // led -> Latn
-    {0x908B0000u, 55u}, // lee -> Latn
-    {0x948B0000u, 55u}, // lef -> Latn
-    {0x9C8B0000u, 55u}, // leh -> Latn
-    {0xA08B0000u, 55u}, // lei -> Latn
-    {0xA48B0000u, 55u}, // lej -> Latn
-    {0xA88B0000u, 55u}, // lek -> Latn
-    {0xAC8B0000u, 55u}, // lel -> Latn
-    {0xB08B0000u, 55u}, // lem -> Latn
-    {0xB48B0000u, 55u}, // len -> Latn
-    {0xB88B0000u, 55u}, // leo -> Latn
-    {0xBC8B0000u, 56u}, // lep -> Lepc
-    {0xC08B0000u, 55u}, // leq -> Latn
-    {0xC48B0000u, 55u}, // ler -> Latn
-    {0xC88B0000u, 55u}, // les -> Latn
-    {0xCC8B0000u, 55u}, // let -> Latn
-    {0xD08B0000u, 55u}, // leu -> Latn
-    {0xD48B0000u, 55u}, // lev -> Latn
-    {0xD88B0000u, 55u}, // lew -> Latn
-    {0xDC8B0000u, 55u}, // lex -> Latn
-    {0xE08B0000u, 55u}, // ley -> Latn
-    {0xE48B0000u, 20u}, // lez -> Cyrl
-    {0x80AB0000u, 55u}, // lfa -> Latn
-    {0xB4AB0000u, 55u}, // lfn -> Latn
-    {0x6C670000u, 55u}, // lg -> Latn
-    {0x80CB0000u, 55u}, // lga -> Latn
-    {0x84CB0000u, 55u}, // lgb -> Latn
-    {0x98CB0000u, 55u}, // lgg -> Latn
-    {0x9CCB0000u, 55u}, // lgh -> Latn
-    {0xA0CB0000u, 55u}, // lgi -> Latn
-    {0xA8CB0000u, 55u}, // lgk -> Latn
-    {0xACCB0000u, 55u}, // lgl -> Latn
-    {0xB0CB0000u, 55u}, // lgm -> Latn
-    {0xB4CB0000u, 55u}, // lgn -> Latn
-    {0xB8CB0000u, 55u}, // lgo -> Latn
-    {0xC0CB0000u, 55u}, // lgq -> Latn
-    {0xC4CB0000u, 55u}, // lgr -> Latn
-    {0xCCCB0000u, 55u}, // lgt -> Latn
-    {0xD0CB0000u, 55u}, // lgu -> Latn
-    {0xE4CB0000u, 55u}, // lgz -> Latn
-    {0x80EB0000u, 55u}, // lha -> Latn
-    {0x9CEB0000u, 55u}, // lhh -> Latn
-    {0xA0EB0000u, 55u}, // lhi -> Latn
-    {0xB0EB0000u, 21u}, // lhm -> Deva
-    {0xB4EB0000u, 55u}, // lhn -> Latn
-    {0xC8EB0000u, 100u}, // lhs -> Syrc
-    {0xCCEB0000u, 55u}, // lht -> Latn
-    {0xD0EB0000u, 55u}, // lhu -> Latn
-    {0x6C690000u, 55u}, // li -> Latn
-    {0x810B0000u, 55u}, // lia -> Latn
-    {0x850B0000u, 55u}, // lib -> Latn
-    {0x890B0000u, 55u}, // lic -> Latn
-    {0x8D0B0000u, 55u}, // lid -> Latn
-    {0x910B0000u, 55u}, // lie -> Latn
-    {0x950B0000u, 21u}, // lif -> Deva
-    {0x990B0000u, 55u}, // lig -> Latn
-    {0x9D0B0000u, 55u}, // lih -> Latn
-    {0xA50B0000u, 55u}, // lij -> Latn
-    {0xA90B0000u, 55u}, // lik -> Latn
-    {0xAD0B0000u, 55u}, // lil -> Latn
-    {0xB90B0000u, 55u}, // lio -> Latn
-    {0xBD0B0000u, 55u}, // lip -> Latn
-    {0xC10B0000u, 55u}, // liq -> Latn
-    {0xC50B0000u, 55u}, // lir -> Latn
-    {0xC90B0000u, 59u}, // lis -> Lisu
-    {0xD10B0000u, 55u}, // liu -> Latn
-    {0xD50B0000u, 55u}, // liv -> Latn
-    {0xD90B0000u, 55u}, // liw -> Latn
-    {0xDD0B0000u, 55u}, // lix -> Latn
-    {0xE10B0000u, 55u}, // liy -> Latn
-    {0xE50B0000u, 55u}, // liz -> Latn
-    {0x812B0000u, 55u}, // lja -> Latn
-    {0x912B0000u, 55u}, // lje -> Latn
-    {0xA12B0000u, 55u}, // lji -> Latn
-    {0xAD2B0000u, 55u}, // ljl -> Latn
-    {0xBD2B0000u, 55u}, // ljp -> Latn
-    {0xD92B0000u, 55u}, // ljw -> Latn
-    {0xDD2B0000u, 55u}, // ljx -> Latn
-    {0x814B0000u, 55u}, // lka -> Latn
-    {0x854B0000u, 55u}, // lkb -> Latn
-    {0x894B0000u, 55u}, // lkc -> Latn
-    {0x8D4B0000u, 55u}, // lkd -> Latn
-    {0x914B0000u, 55u}, // lke -> Latn
-    {0x9D4B0000u, 112u}, // lkh -> Tibt
-    {0xA14B0000u,  2u}, // lki -> Arab
-    {0xA54B0000u, 55u}, // lkj -> Latn
-    {0xAD4B0000u, 55u}, // lkl -> Latn
-    {0xB14B0000u, 55u}, // lkm -> Latn
-    {0xB54B0000u, 55u}, // lkn -> Latn
-    {0xB94B0000u, 55u}, // lko -> Latn
-    {0xC54B0000u, 55u}, // lkr -> Latn
-    {0xC94B0000u, 55u}, // lks -> Latn
-    {0xCD4B0000u, 55u}, // lkt -> Latn
-    {0xD14B0000u, 55u}, // lku -> Latn
-    {0xE14B0000u, 55u}, // lky -> Latn
-    {0x816B0000u, 55u}, // lla -> Latn
-    {0x856B0000u, 55u}, // llb -> Latn
-    {0x896B0000u, 55u}, // llc -> Latn
-    {0x8D6B0000u, 55u}, // lld -> Latn
-    {0x916B0000u, 55u}, // lle -> Latn
-    {0x956B0000u, 55u}, // llf -> Latn
-    {0x996B0000u, 55u}, // llg -> Latn
-    {0xA16B0000u, 55u}, // lli -> Latn
-    {0xA56B0000u, 55u}, // llj -> Latn
-    {0xA96B0000u, 55u}, // llk -> Latn
-    {0xAD6B0000u, 55u}, // lll -> Latn
-    {0xB16B0000u, 55u}, // llm -> Latn
-    {0xB56B0000u, 55u}, // lln -> Latn
-    {0xBD6B0000u, 55u}, // llp -> Latn
-    {0xC16B0000u, 55u}, // llq -> Latn
-    {0xD16B0000u, 55u}, // llu -> Latn
-    {0xDD6B0000u, 55u}, // llx -> Latn
-    {0x818B0000u, 55u}, // lma -> Latn
-    {0x858B0000u, 55u}, // lmb -> Latn
-    {0x898B0000u, 55u}, // lmc -> Latn
-    {0x8D8B0000u, 55u}, // lmd -> Latn
-    {0x918B0000u, 55u}, // lme -> Latn
-    {0x958B0000u, 55u}, // lmf -> Latn
-    {0x998B0000u, 55u}, // lmg -> Latn
-    {0x9D8B0000u, 21u}, // lmh -> Deva
-    {0xA18B0000u, 55u}, // lmi -> Latn
-    {0xA58B0000u, 55u}, // lmj -> Latn
-    {0xA98B0000u, 55u}, // lmk -> Latn
-    {0xAD8B0000u, 55u}, // lml -> Latn
-    {0xB58B0000u, 108u}, // lmn -> Telu
-    {0xB98B0000u, 55u}, // lmo -> Latn
-    {0xBD8B0000u, 55u}, // lmp -> Latn
-    {0xC18B0000u, 55u}, // lmq -> Latn
-    {0xC58B0000u, 55u}, // lmr -> Latn
-    {0xD18B0000u, 55u}, // lmu -> Latn
-    {0xD58B0000u, 55u}, // lmv -> Latn
-    {0xD98B0000u, 55u}, // lmw -> Latn
-    {0xDD8B0000u, 55u}, // lmx -> Latn
-    {0xE18B0000u, 55u}, // lmy -> Latn
-    {0x6C6E0000u, 55u}, // ln -> Latn
-    {0x81AB0000u, 55u}, // lna -> Latn
-    {0x85AB0000u, 55u}, // lnb -> Latn
-    {0x8DAB0000u, 55u}, // lnd -> Latn
-    {0x99AB0000u, 55u}, // lng -> Latn
-    {0x9DAB0000u, 55u}, // lnh -> Latn
-    {0xA1AB0000u, 55u}, // lni -> Latn
-    {0xA5AB0000u, 55u}, // lnj -> Latn
-    {0xADAB0000u, 55u}, // lnl -> Latn
-    {0xB1AB0000u, 55u}, // lnm -> Latn
-    {0xB5AB0000u, 55u}, // lnn -> Latn
-    {0xC9AB0000u, 55u}, // lns -> Latn
-    {0xD1AB0000u, 55u}, // lnu -> Latn
-    {0xD9AB0000u, 55u}, // lnw -> Latn
-    {0xE5AB0000u, 55u}, // lnz -> Latn
-    {0x6C6F0000u, 52u}, // lo -> Laoo
-    {0x81CB0000u, 55u}, // loa -> Latn
-    {0x85CB0000u, 55u}, // lob -> Latn
-    {0x89CB0000u, 55u}, // loc -> Latn
-    {0x91CB0000u, 55u}, // loe -> Latn
-    {0x99CB0000u, 55u}, // log -> Latn
-    {0x9DCB0000u, 55u}, // loh -> Latn
-    {0xA1CB0000u, 55u}, // loi -> Latn
-    {0xA5CB0000u, 55u}, // loj -> Latn
-    {0xA9CB0000u, 55u}, // lok -> Latn
-    {0xADCB0000u, 55u}, // lol -> Latn
-    {0xB1CB0000u, 55u}, // lom -> Latn
-    {0xB5CB0000u, 55u}, // lon -> Latn
-    {0xB9CB0000u, 55u}, // loo -> Latn
-    {0xBDCB0000u, 55u}, // lop -> Latn
-    {0xC1CB0000u, 55u}, // loq -> Latn
-    {0xC5CB0000u, 55u}, // lor -> Latn
-    {0xC9CB0000u, 55u}, // los -> Latn
-    {0xCDCB0000u, 55u}, // lot -> Latn
-    {0xD1CB0000u, 55u}, // lou -> Latn
-    {0xD9CB0000u, 55u}, // low -> Latn
-    {0xDDCB0000u, 55u}, // lox -> Latn
-    {0xE1CB0000u, 21u}, // loy -> Deva
-    {0xE5CB0000u, 55u}, // loz -> Latn
-    {0x81EB0000u, 55u}, // lpa -> Latn
-    {0x91EB0000u, 55u}, // lpe -> Latn
-    {0xB5EB0000u, 55u}, // lpn -> Latn
-    {0xB9EB0000u, 86u}, // lpo -> Plrd
-    {0xDDEB0000u, 55u}, // lpx -> Latn
-    {0xC60B0000u, 55u}, // lqr -> Latn
-    {0x822B0000u, 55u}, // lra -> Latn
-    {0x8A2B0000u,  2u}, // lrc -> Arab
-    {0x9A2B0000u, 55u}, // lrg -> Latn
-    {0xA22B0000u, 55u}, // lri -> Latn
-    {0xAA2B0000u,  2u}, // lrk -> Arab
-    {0xAE2B0000u,  2u}, // lrl -> Arab
-    {0xB22B0000u, 55u}, // lrm -> Latn
-    {0xB62B0000u, 55u}, // lrn -> Latn
-    {0xBA2B0000u, 55u}, // lro -> Latn
-    {0xCE2B0000u, 55u}, // lrt -> Latn
-    {0xD62B0000u, 55u}, // lrv -> Latn
-    {0xE62B0000u, 55u}, // lrz -> Latn
-    {0x824B0000u,  2u}, // lsa -> Arab
-    {0x8E4B0000u, 37u}, // lsd -> Hebr
-    {0x924B0000u, 55u}, // lse -> Latn
-    {0xA24B0000u, 55u}, // lsi -> Latn
-    {0xB24B0000u, 55u}, // lsm -> Latn
-    {0xC64B0000u, 55u}, // lsr -> Latn
-    {0xCA4B0000u,  2u}, // lss -> Arab
-    {0x6C740000u, 55u}, // lt -> Latn
-    {0x8A6B0000u, 36u}, // ltc -> Hant
-    {0x9A6B0000u, 55u}, // ltg -> Latn
-    {0x9E6B0000u, 55u}, // lth -> Latn
-    {0xA26B0000u, 55u}, // lti -> Latn
-    {0xB66B0000u, 55u}, // ltn -> Latn
-    {0xBA6B0000u, 55u}, // lto -> Latn
-    {0xCA6B0000u, 55u}, // lts -> Latn
-    {0xD26B0000u, 55u}, // ltu -> Latn
-    {0x6C750000u, 55u}, // lu -> Latn
-    {0x828B0000u, 55u}, // lua -> Latn
-    {0x8A8B0000u, 55u}, // luc -> Latn
-    {0x8E8B0000u, 55u}, // lud -> Latn
-    {0x928B0000u, 55u}, // lue -> Latn
-    {0x968B0000u, 55u}, // luf -> Latn
-    {0xA28B0000u, 55u}, // lui -> Latn
-    {0xA68B0000u, 55u}, // luj -> Latn
-    {0xAA8B0000u, 112u}, // luk -> Tibt
-    {0xAE8B0000u, 55u}, // lul -> Latn
-    {0xB28B0000u, 55u}, // lum -> Latn
-    {0xB68B0000u, 55u}, // lun -> Latn
-    {0xBA8B0000u, 55u}, // luo -> Latn
-    {0xBE8B0000u, 55u}, // lup -> Latn
-    {0xC28B0000u, 55u}, // luq -> Latn
-    {0xC68B0000u, 55u}, // lur -> Latn
-    {0xCA8B0000u, 55u}, // lus -> Latn
-    {0xCE8B0000u, 55u}, // lut -> Latn
-    {0xD28B0000u, 21u}, // luu -> Deva
-    {0xD68B0000u,  2u}, // luv -> Arab
-    {0xDA8B0000u, 55u}, // luw -> Latn
-    {0xE28B0000u, 55u}, // luy -> Latn
-    {0xE68B0000u,  2u}, // luz -> Arab
-    {0x6C760000u, 55u}, // lv -> Latn
-    {0x82AB0000u, 55u}, // lva -> Latn
-    {0xA2AB0000u, 55u}, // lvi -> Latn
-    {0xAAAB0000u, 55u}, // lvk -> Latn
-    {0xAEAB0000u, 55u}, // lvl -> Latn
-    {0xD2AB0000u, 55u}, // lvu -> Latn
-    {0x82CB0000u, 55u}, // lwa -> Latn
-    {0x92CB0000u, 55u}, // lwe -> Latn
-    {0x9ACB0000u, 55u}, // lwg -> Latn
-    {0x9ECB0000u, 55u}, // lwh -> Latn
-    {0xAECB0000u, 111u}, // lwl -> Thai
-    {0xB2CB0000u, 111u}, // lwm -> Thai
-    {0xBACB0000u, 55u}, // lwo -> Latn
-    {0xCECB0000u, 55u}, // lwt -> Latn
-    {0xDACB0000u, 55u}, // lww -> Latn
-    {0xB2EB0000u, 55u}, // lxm -> Latn
-    {0x830B0000u, 112u}, // lya -> Tibt
-    {0xB70B0000u, 55u}, // lyn -> Latn
-    {0x9F2B0000u, 35u}, // lzh -> Hans
-    {0xAF2B0000u, 55u}, // lzl -> Latn
-    {0xB72B0000u, 55u}, // lzn -> Latn
-    {0xE72B0000u, 55u}, // lzz -> Latn
-    {0x800C0000u, 55u}, // maa -> Latn
-    {0x840C0000u, 55u}, // mab -> Latn
-    {0x8C0C0000u, 55u}, // mad -> Latn
-    {0x900C0000u, 55u}, // mae -> Latn
-    {0x940C0000u, 55u}, // maf -> Latn
-    {0x980C0000u, 21u}, // mag -> Deva
-    {0xA00C0000u, 21u}, // mai -> Deva
-    {0xA40C0000u, 55u}, // maj -> Latn
-    {0xA80C0000u, 55u}, // mak -> Latn
-    {0xB00C0000u, 55u}, // mam -> Latn
-    {0xB40C0000u, 55u}, // man -> Latn
-    {0xB40C474Eu, 75u}, // man-GN -> Nkoo
-    {0xC00C0000u, 55u}, // maq -> Latn
-    {0xC80C0000u, 55u}, // mas -> Latn
-    {0xCC0C0000u, 55u}, // mat -> Latn
-    {0xD00C0000u, 55u}, // mau -> Latn
-    {0xD40C0000u, 55u}, // mav -> Latn
-    {0xD80C0000u, 55u}, // maw -> Latn
-    {0xDC0C0000u, 55u}, // max -> Latn
-    {0xE40C0000u, 55u}, // maz -> Latn
-    {0x802C0000u, 55u}, // mba -> Latn
-    {0x842C0000u, 55u}, // mbb -> Latn
-    {0x882C0000u, 55u}, // mbc -> Latn
-    {0x8C2C0000u, 55u}, // mbd -> Latn
-    {0x942C0000u, 55u}, // mbf -> Latn
-    {0x9C2C0000u, 55u}, // mbh -> Latn
-    {0xA02C0000u, 55u}, // mbi -> Latn
-    {0xA42C0000u, 55u}, // mbj -> Latn
-    {0xA82C0000u, 55u}, // mbk -> Latn
-    {0xAC2C0000u, 55u}, // mbl -> Latn
-    {0xB02C0000u, 55u}, // mbm -> Latn
-    {0xB42C0000u, 55u}, // mbn -> Latn
-    {0xB82C0000u, 55u}, // mbo -> Latn
-    {0xBC2C0000u, 55u}, // mbp -> Latn
-    {0xC02C0000u, 55u}, // mbq -> Latn
-    {0xC42C0000u, 55u}, // mbr -> Latn
-    {0xC82C0000u, 55u}, // mbs -> Latn
-    {0xCC2C0000u, 55u}, // mbt -> Latn
-    {0xD02C0000u, 55u}, // mbu -> Latn
-    {0xD42C0000u, 55u}, // mbv -> Latn
-    {0xD82C0000u, 55u}, // mbw -> Latn
-    {0xDC2C0000u, 55u}, // mbx -> Latn
-    {0xE02C0000u,  2u}, // mby -> Arab
-    {0xE42C0000u, 55u}, // mbz -> Latn
-    {0x804C0000u, 55u}, // mca -> Latn
-    {0x844C0000u, 55u}, // mcb -> Latn
-    {0x884C0000u, 55u}, // mcc -> Latn
-    {0x8C4C0000u, 55u}, // mcd -> Latn
-    {0x904C0000u, 55u}, // mce -> Latn
-    {0x944C0000u, 55u}, // mcf -> Latn
-    {0x984C0000u, 55u}, // mcg -> Latn
-    {0x9C4C0000u, 55u}, // mch -> Latn
-    {0xA04C0000u, 55u}, // mci -> Latn
-    {0xA44C0000u, 55u}, // mcj -> Latn
-    {0xA84C0000u, 55u}, // mck -> Latn
-    {0xAC4C0000u, 55u}, // mcl -> Latn
-    {0xB04C0000u, 55u}, // mcm -> Latn
-    {0xB44C0000u, 55u}, // mcn -> Latn
-    {0xB84C0000u, 55u}, // mco -> Latn
-    {0xBC4C0000u, 55u}, // mcp -> Latn
-    {0xC04C0000u, 55u}, // mcq -> Latn
-    {0xC44C0000u, 55u}, // mcr -> Latn
-    {0xC84C0000u, 55u}, // mcs -> Latn
-    {0xCC4C0000u, 55u}, // mct -> Latn
-    {0xD04C0000u, 55u}, // mcu -> Latn
-    {0xD44C0000u, 55u}, // mcv -> Latn
-    {0xD84C0000u, 55u}, // mcw -> Latn
-    {0xDC4C0000u, 55u}, // mcx -> Latn
-    {0xE04C0000u, 55u}, // mcy -> Latn
-    {0xE44C0000u, 55u}, // mcz -> Latn
-    {0x806C0000u, 55u}, // mda -> Latn
-    {0x846C0000u, 55u}, // mdb -> Latn
-    {0x886C0000u, 55u}, // mdc -> Latn
-    {0x8C6C0000u, 55u}, // mdd -> Latn
-    {0x906C0000u,  2u}, // mde -> Arab
-    {0x946C0000u, 20u}, // mdf -> Cyrl
-    {0x986C0000u, 55u}, // mdg -> Latn
-    {0x9C6C0000u, 55u}, // mdh -> Latn
-    {0xA06C0000u, 55u}, // mdi -> Latn
-    {0xA46C0000u, 55u}, // mdj -> Latn
-    {0xA86C0000u, 55u}, // mdk -> Latn
-    {0xB06C0000u, 55u}, // mdm -> Latn
-    {0xB46C0000u, 55u}, // mdn -> Latn
-    {0xBC6C0000u, 55u}, // mdp -> Latn
-    {0xC06C0000u, 55u}, // mdq -> Latn
-    {0xC46C0000u, 55u}, // mdr -> Latn
-    {0xC86C0000u, 55u}, // mds -> Latn
-    {0xCC6C0000u, 55u}, // mdt -> Latn
-    {0xD06C0000u, 55u}, // mdu -> Latn
-    {0xD46C0000u, 55u}, // mdv -> Latn
-    {0xD86C0000u, 55u}, // mdw -> Latn
-    {0xDC6C0000u, 24u}, // mdx -> Ethi
-    {0xE06C0000u, 24u}, // mdy -> Ethi
-    {0xE46C0000u, 55u}, // mdz -> Latn
-    {0x808C0000u, 55u}, // mea -> Latn
-    {0x848C0000u, 55u}, // meb -> Latn
-    {0x888C0000u, 55u}, // mec -> Latn
-    {0x8C8C0000u, 55u}, // med -> Latn
-    {0x908C0000u, 55u}, // mee -> Latn
-    {0x9C8C0000u, 55u}, // meh -> Latn
-    {0xA48C0000u, 55u}, // mej -> Latn
-    {0xA88C0000u, 55u}, // mek -> Latn
-    {0xAC8C0000u, 55u}, // mel -> Latn
-    {0xB08C0000u, 55u}, // mem -> Latn
-    {0xB48C0000u, 55u}, // men -> Latn
-    {0xB88C0000u, 55u}, // meo -> Latn
-    {0xBC8C0000u, 55u}, // mep -> Latn
-    {0xC08C0000u, 55u}, // meq -> Latn
-    {0xC48C0000u, 55u}, // mer -> Latn
-    {0xC88C0000u, 55u}, // mes -> Latn
-    {0xCC8C0000u, 55u}, // met -> Latn
-    {0xD08C0000u, 55u}, // meu -> Latn
-    {0xD48C0000u, 55u}, // mev -> Latn
-    {0xD88C0000u, 55u}, // mew -> Latn
-    {0xE08C0000u, 55u}, // mey -> Latn
-    {0xE48C0000u, 55u}, // mez -> Latn
-    {0x80AC0000u,  2u}, // mfa -> Arab
-    {0x84AC0000u, 55u}, // mfb -> Latn
-    {0x88AC0000u, 55u}, // mfc -> Latn
-    {0x8CAC0000u, 55u}, // mfd -> Latn
-    {0x90AC0000u, 55u}, // mfe -> Latn
-    {0x94AC0000u, 55u}, // mff -> Latn
-    {0x98AC0000u, 55u}, // mfg -> Latn
-    {0x9CAC0000u, 55u}, // mfh -> Latn
-    {0xA0AC0000u,  2u}, // mfi -> Arab
-    {0xA4AC0000u, 55u}, // mfj -> Latn
-    {0xA8AC0000u, 55u}, // mfk -> Latn
-    {0xACAC0000u, 55u}, // mfl -> Latn
-    {0xB0AC0000u, 55u}, // mfm -> Latn
-    {0xB4AC0000u, 55u}, // mfn -> Latn
-    {0xB8AC0000u, 55u}, // mfo -> Latn
-    {0xBCAC0000u, 55u}, // mfp -> Latn
-    {0xC0AC0000u, 55u}, // mfq -> Latn
-    {0xC4AC0000u, 55u}, // mfr -> Latn
-    {0xCCAC0000u, 55u}, // mft -> Latn
-    {0xD0AC0000u, 55u}, // mfu -> Latn
-    {0xD4AC0000u, 55u}, // mfv -> Latn
-    {0xD8AC0000u, 55u}, // mfw -> Latn
-    {0xDCAC0000u, 55u}, // mfx -> Latn
-    {0xE0AC0000u, 55u}, // mfy -> Latn
-    {0xE4AC0000u, 55u}, // mfz -> Latn
-    {0x6D670000u, 55u}, // mg -> Latn
-    {0x80CC0000u, 54u}, // mga -> Latg
-    {0x84CC0000u, 55u}, // mgb -> Latn
-    {0x88CC0000u, 55u}, // mgc -> Latn
-    {0x8CCC0000u, 55u}, // mgd -> Latn
-    {0x90CC0000u, 55u}, // mge -> Latn
-    {0x94CC0000u, 55u}, // mgf -> Latn
-    {0x98CC0000u, 55u}, // mgg -> Latn
-    {0x9CCC0000u, 55u}, // mgh -> Latn
-    {0xA0CC0000u, 55u}, // mgi -> Latn
-    {0xA4CC0000u, 55u}, // mgj -> Latn
-    {0xA8CC0000u, 55u}, // mgk -> Latn
-    {0xACCC0000u, 55u}, // mgl -> Latn
-    {0xB0CC0000u, 55u}, // mgm -> Latn
-    {0xB4CC0000u, 55u}, // mgn -> Latn
-    {0xB8CC0000u, 55u}, // mgo -> Latn
-    {0xBCCC0000u, 21u}, // mgp -> Deva
-    {0xC0CC0000u, 55u}, // mgq -> Latn
-    {0xC4CC0000u, 55u}, // mgr -> Latn
-    {0xC8CC0000u, 55u}, // mgs -> Latn
-    {0xCCCC0000u, 55u}, // mgt -> Latn
-    {0xD0CC0000u, 55u}, // mgu -> Latn
-    {0xD4CC0000u, 55u}, // mgv -> Latn
-    {0xD8CC0000u, 55u}, // mgw -> Latn
-    {0xE0CC0000u, 55u}, // mgy -> Latn
-    {0xE4CC0000u, 55u}, // mgz -> Latn
-    {0x6D680000u, 55u}, // mh -> Latn
-    {0x84EC0000u, 55u}, // mhb -> Latn
-    {0x88EC0000u, 55u}, // mhc -> Latn
-    {0x8CEC0000u, 55u}, // mhd -> Latn
-    {0x90EC0000u, 55u}, // mhe -> Latn
-    {0x94EC0000u, 55u}, // mhf -> Latn
-    {0x98EC0000u, 55u}, // mhg -> Latn
-    {0xA0EC0000u, 55u}, // mhi -> Latn
-    {0xA4EC0000u,  2u}, // mhj -> Arab
-    {0xA8EC0000u, 55u}, // mhk -> Latn
-    {0xACEC0000u, 55u}, // mhl -> Latn
-    {0xB0EC0000u, 55u}, // mhm -> Latn
-    {0xB4EC0000u, 55u}, // mhn -> Latn
-    {0xB8EC0000u, 55u}, // mho -> Latn
-    {0xBCEC0000u, 55u}, // mhp -> Latn
-    {0xC0EC0000u, 55u}, // mhq -> Latn
-    {0xC8EC0000u, 55u}, // mhs -> Latn
-    {0xCCEC0000u, 55u}, // mht -> Latn
-    {0xD0EC0000u, 55u}, // mhu -> Latn
-    {0xD8EC0000u, 55u}, // mhw -> Latn
-    {0xDCEC0000u, 55u}, // mhx -> Latn
-    {0xE0EC0000u, 55u}, // mhy -> Latn
-    {0xE4EC0000u, 55u}, // mhz -> Latn
-    {0x6D690000u, 55u}, // mi -> Latn
-    {0x810C0000u, 55u}, // mia -> Latn
-    {0x850C0000u, 55u}, // mib -> Latn
-    {0x890C0000u, 55u}, // mic -> Latn
-    {0x8D0C0000u, 62u}, // mid -> Mand
-    {0x910C0000u, 55u}, // mie -> Latn
-    {0x950C0000u, 55u}, // mif -> Latn
-    {0x990C0000u, 55u}, // mig -> Latn
-    {0x9D0C0000u, 55u}, // mih -> Latn
-    {0xA10C0000u, 55u}, // mii -> Latn
-    {0xA50C0000u, 55u}, // mij -> Latn
-    {0xA90C0000u, 55u}, // mik -> Latn
-    {0xAD0C0000u, 55u}, // mil -> Latn
-    {0xB10C0000u, 55u}, // mim -> Latn
-    {0xB50C0000u, 55u}, // min -> Latn
-    {0xB90C0000u, 55u}, // mio -> Latn
-    {0xBD0C0000u, 55u}, // mip -> Latn
-    {0xC10C0000u, 55u}, // miq -> Latn
-    {0xC50C0000u, 55u}, // mir -> Latn
-    {0xCD0C0000u, 55u}, // mit -> Latn
-    {0xD10C0000u, 55u}, // miu -> Latn
-    {0xD90C0000u, 55u}, // miw -> Latn
-    {0xDD0C0000u, 55u}, // mix -> Latn
-    {0xE10C0000u, 55u}, // miy -> Latn
-    {0xE50C0000u, 55u}, // miz -> Latn
-    {0x852C0000u, 55u}, // mjb -> Latn
-    {0x892C0000u, 55u}, // mjc -> Latn
-    {0x8D2C0000u, 55u}, // mjd -> Latn
-    {0x912C0000u, 55u}, // mje -> Latn
-    {0x992C0000u, 55u}, // mjg -> Latn
-    {0x9D2C0000u, 55u}, // mjh -> Latn
-    {0xA12C0000u, 55u}, // mji -> Latn
-    {0xA52C0000u, 55u}, // mjj -> Latn
-    {0xA92C0000u, 55u}, // mjk -> Latn
-    {0xAD2C0000u, 21u}, // mjl -> Deva
-    {0xB12C0000u, 55u}, // mjm -> Latn
-    {0xB52C0000u, 55u}, // mjn -> Latn
-    {0xC12C0000u, 67u}, // mjq -> Mlym
-    {0xC52C0000u, 67u}, // mjr -> Mlym
-    {0xC92C0000u, 55u}, // mjs -> Latn
-    {0xCD2C0000u, 21u}, // mjt -> Deva
-    {0xD12C0000u, 108u}, // mju -> Telu
-    {0xD52C0000u, 67u}, // mjv -> Mlym
-    {0xD92C0000u, 55u}, // mjw -> Latn
-    {0xDD2C0000u, 55u}, // mjx -> Latn
-    {0xE12C0000u, 55u}, // mjy -> Latn
-    {0xE52C0000u, 21u}, // mjz -> Deva
-    {0x6D6B0000u, 20u}, // mk -> Cyrl
-    {0x814C0000u, 55u}, // mka -> Latn
-    {0x854C0000u, 21u}, // mkb -> Deva
-    {0x894C0000u, 55u}, // mkc -> Latn
-    {0x914C0000u, 21u}, // mke -> Deva
-    {0x954C0000u, 55u}, // mkf -> Latn
-    {0xA14C0000u,  2u}, // mki -> Arab
-    {0xA54C0000u, 55u}, // mkj -> Latn
-    {0xA94C0000u, 55u}, // mkk -> Latn
-    {0xAD4C0000u, 55u}, // mkl -> Latn
-    {0xB14C0000u, 111u}, // mkm -> Thai
-    {0xB54C0000u, 55u}, // mkn -> Latn
-    {0xB94C0000u, 55u}, // mko -> Latn
-    {0xBD4C0000u, 55u}, // mkp -> Latn
-    {0xC54C0000u, 55u}, // mkr -> Latn
-    {0xC94C0000u, 55u}, // mks -> Latn
-    {0xCD4C0000u, 55u}, // mkt -> Latn
-    {0xD14C0000u, 55u}, // mku -> Latn
-    {0xD54C0000u, 55u}, // mkv -> Latn
-    {0xD94C0000u, 55u}, // mkw -> Latn
-    {0xDD4C0000u, 55u}, // mkx -> Latn
-    {0xE14C0000u, 55u}, // mky -> Latn
-    {0xE54C0000u, 55u}, // mkz -> Latn
-    {0x6D6C0000u, 67u}, // ml -> Mlym
-    {0x816C0000u, 55u}, // mla -> Latn
-    {0x856C0000u, 55u}, // mlb -> Latn
-    {0x896C0000u, 55u}, // mlc -> Latn
-    {0x916C0000u, 55u}, // mle -> Latn
-    {0x956C0000u, 111u}, // mlf -> Thai
-    {0x9D6C0000u, 55u}, // mlh -> Latn
-    {0xA16C0000u, 55u}, // mli -> Latn
-    {0xA56C0000u, 55u}, // mlj -> Latn
-    {0xA96C0000u, 55u}, // mlk -> Latn
-    {0xAD6C0000u, 55u}, // mll -> Latn
-    {0xB56C0000u, 55u}, // mln -> Latn
-    {0xB96C0000u, 55u}, // mlo -> Latn
-    {0xBD6C0000u, 55u}, // mlp -> Latn
-    {0xC16C0000u, 55u}, // mlq -> Latn
-    {0xC56C0000u, 55u}, // mlr -> Latn
-    {0xC96C0000u, 55u}, // mls -> Latn
-    {0xD16C0000u, 55u}, // mlu -> Latn
-    {0xD56C0000u, 55u}, // mlv -> Latn
-    {0xD96C0000u, 55u}, // mlw -> Latn
-    {0xDD6C0000u, 55u}, // mlx -> Latn
-    {0xE56C0000u, 55u}, // mlz -> Latn
-    {0x818C0000u, 55u}, // mma -> Latn
-    {0x858C0000u, 55u}, // mmb -> Latn
-    {0x898C0000u, 55u}, // mmc -> Latn
-    {0x8D8C0000u, 55u}, // mmd -> Latn
-    {0x918C0000u, 55u}, // mme -> Latn
-    {0x958C0000u, 55u}, // mmf -> Latn
-    {0x998C0000u, 55u}, // mmg -> Latn
-    {0x9D8C0000u, 55u}, // mmh -> Latn
-    {0xA18C0000u, 55u}, // mmi -> Latn
-    {0xB18C0000u, 55u}, // mmm -> Latn
-    {0xB58C0000u, 55u}, // mmn -> Latn
-    {0xB98C0000u, 55u}, // mmo -> Latn
-    {0xBD8C0000u, 55u}, // mmp -> Latn
-    {0xC18C0000u, 55u}, // mmq -> Latn
-    {0xC58C0000u, 55u}, // mmr -> Latn
-    {0xCD8C0000u, 55u}, // mmt -> Latn
-    {0xD18C0000u, 55u}, // mmu -> Latn
-    {0xD58C0000u, 55u}, // mmv -> Latn
-    {0xD98C0000u, 55u}, // mmw -> Latn
-    {0xDD8C0000u, 55u}, // mmx -> Latn
-    {0xE18C0000u, 55u}, // mmy -> Latn
-    {0xE58C0000u, 55u}, // mmz -> Latn
-    {0x6D6E0000u, 20u}, // mn -> Cyrl
-    {0x6D6E434Eu, 69u}, // mn-CN -> Mong
-    {0x81AC0000u, 55u}, // mna -> Latn
-    {0x85AC0000u, 55u}, // mnb -> Latn
-    {0x89AC0000u, 69u}, // mnc -> Mong
-    {0x8DAC0000u, 55u}, // mnd -> Latn
-    {0x91AC0000u, 55u}, // mne -> Latn
-    {0x95AC0000u, 55u}, // mnf -> Latn
-    {0x99AC0000u, 55u}, // mng -> Latn
-    {0x9DAC0000u, 55u}, // mnh -> Latn
-    {0xA1AC0000u,  9u}, // mni -> Beng
-    {0xA5AC0000u,  2u}, // mnj -> Arab
-    {0xADAC0000u, 55u}, // mnl -> Latn
-    {0xB1AC0000u, 55u}, // mnm -> Latn
-    {0xB5AC0000u, 55u}, // mnn -> Latn
-    {0xBDAC0000u, 55u}, // mnp -> Latn
-    {0xC1AC0000u, 55u}, // mnq -> Latn
-    {0xC5AC0000u, 55u}, // mnr -> Latn
-    {0xC9AC0000u, 20u}, // mns -> Cyrl
-    {0xD1AC0000u, 55u}, // mnu -> Latn
-    {0xD5AC0000u, 55u}, // mnv -> Latn
-    {0xD9AC0000u, 72u}, // mnw -> Mymr
-    {0xDDAC0000u, 55u}, // mnx -> Latn
-    {0xE1AC0000u, 55u}, // mny -> Latn
-    {0xE5AC0000u, 55u}, // mnz -> Latn
-    {0x6D6F0000u, 55u}, // mo -> Latn
-    {0x81CC0000u, 55u}, // moa -> Latn
-    {0x89CC0000u, 55u}, // moc -> Latn
-    {0x8DCC0000u, 55u}, // mod -> Latn
-    {0x91CC0000u, 55u}, // moe -> Latn
-    {0x99CC0000u, 55u}, // mog -> Latn
-    {0x9DCC0000u, 55u}, // moh -> Latn
-    {0xA1CC0000u, 55u}, // moi -> Latn
-    {0xA5CC0000u, 55u}, // moj -> Latn
-    {0xA9CC0000u, 55u}, // mok -> Latn
-    {0xB1CC0000u, 55u}, // mom -> Latn
-    {0xB9CC0000u, 55u}, // moo -> Latn
-    {0xBDCC0000u, 55u}, // mop -> Latn
-    {0xC1CC0000u, 55u}, // moq -> Latn
-    {0xC5CC0000u, 55u}, // mor -> Latn
-    {0xC9CC0000u, 55u}, // mos -> Latn
-    {0xCDCC0000u, 55u}, // mot -> Latn
-    {0xD1CC0000u, 55u}, // mou -> Latn
-    {0xD5CC0000u, 55u}, // mov -> Latn
-    {0xD9CC0000u, 55u}, // mow -> Latn
-    {0xDDCC0000u, 55u}, // mox -> Latn
-    {0xE1CC0000u, 55u}, // moy -> Latn
-    {0xE5CC0000u, 55u}, // moz -> Latn
-    {0x81EC0000u, 55u}, // mpa -> Latn
-    {0x85EC0000u, 55u}, // mpb -> Latn
-    {0x89EC0000u, 55u}, // mpc -> Latn
-    {0x8DEC0000u, 55u}, // mpd -> Latn
-    {0x91EC0000u, 55u}, // mpe -> Latn
-    {0x99EC0000u, 55u}, // mpg -> Latn
-    {0x9DEC0000u, 55u}, // mph -> Latn
-    {0xA1EC0000u, 55u}, // mpi -> Latn
-    {0xA5EC0000u, 55u}, // mpj -> Latn
-    {0xA9EC0000u, 55u}, // mpk -> Latn
-    {0xADEC0000u, 55u}, // mpl -> Latn
-    {0xB1EC0000u, 55u}, // mpm -> Latn
-    {0xB5EC0000u, 55u}, // mpn -> Latn
-    {0xB9EC0000u, 55u}, // mpo -> Latn
-    {0xBDEC0000u, 55u}, // mpp -> Latn
-    {0xC1EC0000u, 55u}, // mpq -> Latn
-    {0xC5EC0000u, 55u}, // mpr -> Latn
-    {0xC9EC0000u, 55u}, // mps -> Latn
-    {0xCDEC0000u, 55u}, // mpt -> Latn
-    {0xD1EC0000u, 55u}, // mpu -> Latn
-    {0xD5EC0000u, 55u}, // mpv -> Latn
-    {0xD9EC0000u, 55u}, // mpw -> Latn
-    {0xDDEC0000u, 55u}, // mpx -> Latn
-    {0xE1EC0000u, 55u}, // mpy -> Latn
-    {0xE5EC0000u, 111u}, // mpz -> Thai
-    {0x820C0000u, 55u}, // mqa -> Latn
-    {0x860C0000u, 55u}, // mqb -> Latn
-    {0x8A0C0000u, 55u}, // mqc -> Latn
-    {0x920C0000u, 55u}, // mqe -> Latn
-    {0x960C0000u, 55u}, // mqf -> Latn
-    {0x9A0C0000u, 55u}, // mqg -> Latn
-    {0x9E0C0000u, 55u}, // mqh -> Latn
-    {0xA20C0000u, 55u}, // mqi -> Latn
-    {0xA60C0000u, 55u}, // mqj -> Latn
-    {0xAA0C0000u, 55u}, // mqk -> Latn
-    {0xAE0C0000u, 55u}, // mql -> Latn
-    {0xB20C0000u, 55u}, // mqm -> Latn
-    {0xB60C0000u, 55u}, // mqn -> Latn
-    {0xBA0C0000u, 55u}, // mqo -> Latn
-    {0xBE0C0000u, 55u}, // mqp -> Latn
-    {0xC20C0000u, 55u}, // mqq -> Latn
-    {0xC60C0000u, 55u}, // mqr -> Latn
-    {0xCA0C0000u, 55u}, // mqs -> Latn
-    {0xD20C0000u, 55u}, // mqu -> Latn
-    {0xD60C0000u, 55u}, // mqv -> Latn
-    {0xDA0C0000u, 55u}, // mqw -> Latn
-    {0xDE0C0000u, 55u}, // mqx -> Latn
-    {0xE20C0000u, 55u}, // mqy -> Latn
-    {0xE60C0000u, 55u}, // mqz -> Latn
-    {0x6D720000u, 21u}, // mr -> Deva
-    {0x822C0000u, 111u}, // mra -> Thai
-    {0x862C0000u, 55u}, // mrb -> Latn
-    {0x8A2C0000u, 55u}, // mrc -> Latn
-    {0x8E2C0000u, 21u}, // mrd -> Deva
-    {0x962C0000u, 55u}, // mrf -> Latn
-    {0x9A2C0000u, 55u}, // mrg -> Latn
-    {0x9E2C0000u, 55u}, // mrh -> Latn
-    {0xA62C0000u, 20u}, // mrj -> Cyrl
-    {0xAA2C0000u, 55u}, // mrk -> Latn
-    {0xAE2C0000u, 55u}, // mrl -> Latn
-    {0xB22C0000u, 55u}, // mrm -> Latn
-    {0xB62C0000u, 55u}, // mrn -> Latn
-    {0xBA2C0000u, 70u}, // mro -> Mroo
-    {0xBE2C0000u, 55u}, // mrp -> Latn
-    {0xC22C0000u, 55u}, // mrq -> Latn
-    {0xC62C0000u, 21u}, // mrr -> Deva
-    {0xCA2C0000u, 55u}, // mrs -> Latn
-    {0xCE2C0000u, 55u}, // mrt -> Latn
-    {0xD22C0000u, 55u}, // mru -> Latn
-    {0xD62C0000u, 55u}, // mrv -> Latn
-    {0xDA2C0000u, 55u}, // mrw -> Latn
-    {0xDE2C0000u, 55u}, // mrx -> Latn
-    {0xE22C0000u, 55u}, // mry -> Latn
-    {0xE62C0000u, 55u}, // mrz -> Latn
-    {0x6D730000u, 55u}, // ms -> Latn
-    {0x6D734343u,  2u}, // ms-CC -> Arab
-    {0x864C0000u, 55u}, // msb -> Latn
-    {0x8A4C0000u, 55u}, // msc -> Latn
-    {0x924C0000u, 55u}, // mse -> Latn
-    {0x964C0000u, 55u}, // msf -> Latn
-    {0x9A4C0000u, 55u}, // msg -> Latn
-    {0x9E4C0000u, 55u}, // msh -> Latn
-    {0xA24C0000u, 55u}, // msi -> Latn
-    {0xA64C0000u, 55u}, // msj -> Latn
-    {0xAA4C0000u, 55u}, // msk -> Latn
-    {0xAE4C0000u, 55u}, // msl -> Latn
-    {0xB24C0000u, 55u}, // msm -> Latn
-    {0xB64C0000u, 55u}, // msn -> Latn
-    {0xBA4C0000u, 55u}, // mso -> Latn
-    {0xBE4C0000u, 55u}, // msp -> Latn
-    {0xC24C0000u, 55u}, // msq -> Latn
-    {0xCA4C0000u, 55u}, // mss -> Latn
-    {0xD24C0000u, 55u}, // msu -> Latn
-    {0xD64C0000u, 55u}, // msv -> Latn
-    {0xDA4C0000u, 55u}, // msw -> Latn
-    {0xDE4C0000u, 55u}, // msx -> Latn
-    {0xE24C0000u, 55u}, // msy -> Latn
-    {0xE64C0000u, 55u}, // msz -> Latn
-    {0x6D740000u, 55u}, // mt -> Latn
-    {0x826C0000u, 55u}, // mta -> Latn
-    {0x866C0000u, 55u}, // mtb -> Latn
-    {0x8A6C0000u, 55u}, // mtc -> Latn
-    {0x8E6C0000u, 55u}, // mtd -> Latn
-    {0x926C0000u, 55u}, // mte -> Latn
-    {0x966C0000u, 55u}, // mtf -> Latn
-    {0x9A6C0000u, 55u}, // mtg -> Latn
-    {0x9E6C0000u, 55u}, // mth -> Latn
-    {0xA26C0000u, 55u}, // mti -> Latn
-    {0xA66C0000u, 55u}, // mtj -> Latn
-    {0xAA6C0000u, 55u}, // mtk -> Latn
-    {0xAE6C0000u, 55u}, // mtl -> Latn
-    {0xB26C0000u, 20u}, // mtm -> Cyrl
-    {0xB66C0000u, 55u}, // mtn -> Latn
-    {0xBA6C0000u, 55u}, // mto -> Latn
-    {0xBE6C0000u, 55u}, // mtp -> Latn
-    {0xC26C0000u, 55u}, // mtq -> Latn
-    {0xC66C0000u, 21u}, // mtr -> Deva
-    {0xCA6C0000u, 55u}, // mts -> Latn
-    {0xCE6C0000u, 55u}, // mtt -> Latn
-    {0xD26C0000u, 55u}, // mtu -> Latn
-    {0xD66C0000u, 55u}, // mtv -> Latn
-    {0xDA6C0000u, 55u}, // mtw -> Latn
-    {0xDE6C0000u, 55u}, // mtx -> Latn
-    {0xE26C0000u, 55u}, // mty -> Latn
-    {0x828C0000u, 55u}, // mua -> Latn
-    {0x868C0000u, 55u}, // mub -> Latn
-    {0x8A8C0000u, 55u}, // muc -> Latn
-    {0x8E8C0000u, 20u}, // mud -> Cyrl
-    {0x928C0000u, 55u}, // mue -> Latn
-    {0x9A8C0000u, 55u}, // mug -> Latn
-    {0x9E8C0000u, 55u}, // muh -> Latn
-    {0xA28C0000u, 55u}, // mui -> Latn
-    {0xA68C0000u, 55u}, // muj -> Latn
-    {0xAA8C0000u, 112u}, // muk -> Tibt
-    {0xB28C0000u, 55u}, // mum -> Latn
-    {0xBA8C0000u, 55u}, // muo -> Latn
-    {0xC28C0000u, 55u}, // muq -> Latn
-    {0xC68C0000u, 55u}, // mur -> Latn
-    {0xCA8C0000u, 55u}, // mus -> Latn
-    {0xCE8C0000u, 21u}, // mut -> Deva
-    {0xD28C0000u, 55u}, // muu -> Latn
-    {0xD68C0000u, 105u}, // muv -> Taml
-    {0xDE8C0000u, 55u}, // mux -> Latn
-    {0xE28C0000u, 55u}, // muy -> Latn
-    {0xE68C0000u, 24u}, // muz -> Ethi
-    {0x82AC0000u, 55u}, // mva -> Latn
-    {0x8EAC0000u, 55u}, // mvd -> Latn
-    {0x92AC0000u,  2u}, // mve -> Arab
-    {0x96AC0000u, 69u}, // mvf -> Mong
-    {0x9AAC0000u, 55u}, // mvg -> Latn
-    {0x9EAC0000u, 55u}, // mvh -> Latn
-    {0xAAAC0000u, 55u}, // mvk -> Latn
-    {0xAEAC0000u, 55u}, // mvl -> Latn
-    {0xB6AC0000u, 55u}, // mvn -> Latn
-    {0xBAAC0000u, 55u}, // mvo -> Latn
-    {0xBEAC0000u, 55u}, // mvp -> Latn
-    {0xC2AC0000u, 55u}, // mvq -> Latn
-    {0xC6AC0000u, 55u}, // mvr -> Latn
-    {0xCAAC0000u, 55u}, // mvs -> Latn
-    {0xCEAC0000u, 55u}, // mvt -> Latn
-    {0xD2AC0000u, 55u}, // mvu -> Latn
-    {0xD6AC0000u, 55u}, // mvv -> Latn
-    {0xDAAC0000u, 55u}, // mvw -> Latn
-    {0xDEAC0000u, 55u}, // mvx -> Latn
-    {0xE2AC0000u,  2u}, // mvy -> Arab
-    {0xE6AC0000u, 24u}, // mvz -> Ethi
-    {0x82CC0000u, 55u}, // mwa -> Latn
-    {0x86CC0000u, 55u}, // mwb -> Latn
-    {0x8ACC0000u, 55u}, // mwc -> Latn
-    {0x92CC0000u, 55u}, // mwe -> Latn
-    {0x96CC0000u, 55u}, // mwf -> Latn
-    {0x9ACC0000u, 55u}, // mwg -> Latn
-    {0x9ECC0000u, 55u}, // mwh -> Latn
-    {0xA2CC0000u, 55u}, // mwi -> Latn
-    {0xAACC0000u, 55u}, // mwk -> Latn
-    {0xAECC0000u, 55u}, // mwl -> Latn
-    {0xB2CC0000u, 55u}, // mwm -> Latn
-    {0xB6CC0000u, 55u}, // mwn -> Latn
-    {0xBACC0000u, 55u}, // mwo -> Latn
-    {0xBECC0000u, 55u}, // mwp -> Latn
-    {0xC2CC0000u, 55u}, // mwq -> Latn
-    {0xC6CC0000u, 21u}, // mwr -> Deva
-    {0xCACC0000u, 55u}, // mws -> Latn
-    {0xCECC0000u, 72u}, // mwt -> Mymr
-    {0xD2CC0000u, 55u}, // mwu -> Latn
-    {0xD6CC0000u, 55u}, // mwv -> Latn
-    {0xDACC0000u, 39u}, // mww -> Hmnp
-    {0xE6CC0000u, 55u}, // mwz -> Latn
-    {0x82EC0000u, 55u}, // mxa -> Latn
-    {0x86EC0000u, 55u}, // mxb -> Latn
-    {0x8AEC0000u, 55u}, // mxc -> Latn
-    {0x8EEC0000u, 55u}, // mxd -> Latn
-    {0x92EC0000u, 55u}, // mxe -> Latn
-    {0x96EC0000u, 55u}, // mxf -> Latn
-    {0x9AEC0000u, 55u}, // mxg -> Latn
-    {0x9EEC0000u, 55u}, // mxh -> Latn
-    {0xA2EC0000u, 55u}, // mxi -> Latn
-    {0xA6EC0000u, 55u}, // mxj -> Latn
-    {0xAAEC0000u, 55u}, // mxk -> Latn
-    {0xAEEC0000u, 55u}, // mxl -> Latn
-    {0xB2EC0000u, 55u}, // mxm -> Latn
-    {0xB6EC0000u, 55u}, // mxn -> Latn
-    {0xBAEC0000u, 55u}, // mxo -> Latn
-    {0xBEEC0000u, 55u}, // mxp -> Latn
-    {0xC2EC0000u, 55u}, // mxq -> Latn
-    {0xC6EC0000u, 55u}, // mxr -> Latn
-    {0xCAEC0000u, 55u}, // mxs -> Latn
-    {0xCEEC0000u, 55u}, // mxt -> Latn
-    {0xD2EC0000u, 55u}, // mxu -> Latn
-    {0xD6EC0000u, 55u}, // mxv -> Latn
-    {0xDAEC0000u, 55u}, // mxw -> Latn
-    {0xDEEC0000u, 55u}, // mxx -> Latn
-    {0xE2EC0000u, 55u}, // mxy -> Latn
-    {0xE6EC0000u, 55u}, // mxz -> Latn
-    {0x6D790000u, 72u}, // my -> Mymr
-    {0x870C0000u, 55u}, // myb -> Latn
-    {0x8B0C0000u, 55u}, // myc -> Latn
-    {0x930C0000u, 55u}, // mye -> Latn
-    {0x970C0000u, 55u}, // myf -> Latn
-    {0x9B0C0000u, 55u}, // myg -> Latn
-    {0x9F0C0000u, 55u}, // myh -> Latn
-    {0xA70C0000u, 55u}, // myj -> Latn
-    {0xAB0C0000u, 55u}, // myk -> Latn
-    {0xAF0C0000u, 55u}, // myl -> Latn
-    {0xB30C0000u, 24u}, // mym -> Ethi
-    {0xBF0C0000u, 55u}, // myp -> Latn
-    {0xC70C0000u, 55u}, // myr -> Latn
-    {0xD30C0000u, 55u}, // myu -> Latn
-    {0xD70C0000u, 20u}, // myv -> Cyrl
-    {0xDB0C0000u, 55u}, // myw -> Latn
-    {0xDF0C0000u, 55u}, // myx -> Latn
-    {0xE30C0000u, 55u}, // myy -> Latn
-    {0xE70C0000u, 62u}, // myz -> Mand
-    {0x832C0000u, 55u}, // mza -> Latn
-    {0x8F2C0000u, 55u}, // mzd -> Latn
-    {0x932C0000u, 55u}, // mze -> Latn
-    {0x9F2C0000u, 55u}, // mzh -> Latn
-    {0xA32C0000u, 55u}, // mzi -> Latn
-    {0xA72C0000u, 55u}, // mzj -> Latn
-    {0xAB2C0000u, 55u}, // mzk -> Latn
-    {0xAF2C0000u, 55u}, // mzl -> Latn
-    {0xB32C0000u, 55u}, // mzm -> Latn
-    {0xB72C0000u,  2u}, // mzn -> Arab
-    {0xBB2C0000u, 55u}, // mzo -> Latn
-    {0xBF2C0000u, 55u}, // mzp -> Latn
-    {0xC32C0000u, 55u}, // mzq -> Latn
-    {0xC72C0000u, 55u}, // mzr -> Latn
-    {0xCF2C0000u, 55u}, // mzt -> Latn
-    {0xD32C0000u, 55u}, // mzu -> Latn
-    {0xD72C0000u, 55u}, // mzv -> Latn
-    {0xDB2C0000u, 55u}, // mzw -> Latn
-    {0xDF2C0000u, 55u}, // mzx -> Latn
-    {0xE72C0000u, 55u}, // mzz -> Latn
-    {0x6E610000u, 55u}, // na -> Latn
-    {0x800D0000u, 55u}, // naa -> Latn
-    {0x840D0000u, 55u}, // nab -> Latn
-    {0x880D0000u, 55u}, // nac -> Latn
-    {0x900D0000u, 55u}, // nae -> Latn
-    {0x940D0000u, 55u}, // naf -> Latn
-    {0x980D0000u, 55u}, // nag -> Latn
-    {0xA40D0000u, 55u}, // naj -> Latn
-    {0xA80D0000u, 55u}, // nak -> Latn
-    {0xAC0D0000u, 55u}, // nal -> Latn
-    {0xB00D0000u, 55u}, // nam -> Latn
-    {0xB40D0000u, 35u}, // nan -> Hans
-    {0xB80D0000u, 21u}, // nao -> Deva
-    {0xBC0D0000u, 55u}, // nap -> Latn
-    {0xC00D0000u, 55u}, // naq -> Latn
-    {0xC40D0000u, 55u}, // nar -> Latn
-    {0xC80D0000u, 55u}, // nas -> Latn
-    {0xCC0D0000u, 55u}, // nat -> Latn
-    {0xD80D0000u, 55u}, // naw -> Latn
-    {0xDC0D0000u, 55u}, // nax -> Latn
-    {0xE00D0000u, 55u}, // nay -> Latn
-    {0xE40D0000u, 55u}, // naz -> Latn
-    {0x6E620000u, 55u}, // nb -> Latn
-    {0x802D0000u, 55u}, // nba -> Latn
-    {0x842D0000u, 55u}, // nbb -> Latn
-    {0x882D0000u, 55u}, // nbc -> Latn
-    {0x8C2D0000u, 55u}, // nbd -> Latn
-    {0x902D0000u, 55u}, // nbe -> Latn
-    {0x9C2D0000u, 55u}, // nbh -> Latn
-    {0xA02D0000u, 55u}, // nbi -> Latn
-    {0xA42D0000u, 55u}, // nbj -> Latn
-    {0xA82D0000u, 55u}, // nbk -> Latn
-    {0xB02D0000u, 55u}, // nbm -> Latn
-    {0xB42D0000u, 55u}, // nbn -> Latn
-    {0xB82D0000u, 55u}, // nbo -> Latn
-    {0xBC2D0000u, 55u}, // nbp -> Latn
-    {0xC02D0000u, 55u}, // nbq -> Latn
-    {0xC42D0000u, 55u}, // nbr -> Latn
-    {0xCC2D0000u, 55u}, // nbt -> Latn
-    {0xD02D0000u, 55u}, // nbu -> Latn
-    {0xD42D0000u, 55u}, // nbv -> Latn
-    {0xD82D0000u, 55u}, // nbw -> Latn
-    {0xE02D0000u, 55u}, // nby -> Latn
-    {0x804D0000u, 55u}, // nca -> Latn
-    {0x844D0000u, 55u}, // ncb -> Latn
-    {0x884D0000u, 55u}, // ncc -> Latn
-    {0x8C4D0000u, 21u}, // ncd -> Deva
-    {0x904D0000u, 55u}, // nce -> Latn
-    {0x944D0000u, 55u}, // ncf -> Latn
-    {0x984D0000u, 55u}, // ncg -> Latn
-    {0x9C4D0000u, 55u}, // nch -> Latn
-    {0xA04D0000u, 55u}, // nci -> Latn
-    {0xA44D0000u, 55u}, // ncj -> Latn
-    {0xA84D0000u, 55u}, // nck -> Latn
-    {0xAC4D0000u, 55u}, // ncl -> Latn
-    {0xB04D0000u, 55u}, // ncm -> Latn
-    {0xB44D0000u, 55u}, // ncn -> Latn
-    {0xB84D0000u, 55u}, // nco -> Latn
-    {0xC04D0000u, 52u}, // ncq -> Laoo
-    {0xC44D0000u, 55u}, // ncr -> Latn
-    {0xCC4D0000u, 55u}, // nct -> Latn
-    {0xD04D0000u, 55u}, // ncu -> Latn
-    {0xDC4D0000u, 55u}, // ncx -> Latn
-    {0xE44D0000u, 55u}, // ncz -> Latn
-    {0x6E640000u, 55u}, // nd -> Latn
-    {0x806D0000u, 55u}, // nda -> Latn
-    {0x846D0000u, 55u}, // ndb -> Latn
-    {0x886D0000u, 55u}, // ndc -> Latn
-    {0x8C6D0000u, 55u}, // ndd -> Latn
-    {0x946D0000u, 20u}, // ndf -> Cyrl
-    {0x986D0000u, 55u}, // ndg -> Latn
-    {0x9C6D0000u, 55u}, // ndh -> Latn
-    {0xA06D0000u, 55u}, // ndi -> Latn
-    {0xA46D0000u, 55u}, // ndj -> Latn
-    {0xA86D0000u, 55u}, // ndk -> Latn
-    {0xAC6D0000u, 55u}, // ndl -> Latn
-    {0xB06D0000u, 55u}, // ndm -> Latn
-    {0xB46D0000u, 55u}, // ndn -> Latn
-    {0xBC6D0000u, 55u}, // ndp -> Latn
-    {0xC06D0000u, 55u}, // ndq -> Latn
-    {0xC46D0000u, 55u}, // ndr -> Latn
-    {0xC86D0000u, 55u}, // nds -> Latn
-    {0xCC6D0000u, 55u}, // ndt -> Latn
-    {0xD06D0000u, 55u}, // ndu -> Latn
-    {0xD46D0000u, 55u}, // ndv -> Latn
-    {0xD86D0000u, 55u}, // ndw -> Latn
-    {0xDC6D0000u, 55u}, // ndx -> Latn
-    {0xE06D0000u, 55u}, // ndy -> Latn
-    {0xE46D0000u, 55u}, // ndz -> Latn
-    {0x6E650000u, 21u}, // ne -> Deva
-    {0x808D0000u, 55u}, // nea -> Latn
-    {0x848D0000u, 55u}, // neb -> Latn
-    {0x888D0000u, 55u}, // nec -> Latn
-    {0x8C8D0000u, 55u}, // ned -> Latn
-    {0x908D0000u, 55u}, // nee -> Latn
-    {0x988D0000u, 20u}, // neg -> Cyrl
-    {0x9C8D0000u, 112u}, // neh -> Tibt
-    {0xA08D0000u, 119u}, // nei -> Xsux
-    {0xA48D0000u, 55u}, // nej -> Latn
-    {0xA88D0000u, 55u}, // nek -> Latn
-    {0xB08D0000u, 55u}, // nem -> Latn
-    {0xB48D0000u, 55u}, // nen -> Latn
-    {0xB88D0000u, 55u}, // neo -> Latn
-    {0xC08D0000u, 55u}, // neq -> Latn
-    {0xC48D0000u, 55u}, // ner -> Latn
-    {0xCC8D0000u, 55u}, // net -> Latn
-    {0xD08D0000u, 55u}, // neu -> Latn
-    {0xD88D0000u, 21u}, // new -> Deva
-    {0xDC8D0000u, 55u}, // nex -> Latn
-    {0xE08D0000u, 55u}, // ney -> Latn
-    {0xE48D0000u, 55u}, // nez -> Latn
-    {0x80AD0000u, 55u}, // nfa -> Latn
-    {0x8CAD0000u, 55u}, // nfd -> Latn
-    {0xACAD0000u, 55u}, // nfl -> Latn
-    {0xC4AD0000u, 55u}, // nfr -> Latn
-    {0xD0AD0000u, 55u}, // nfu -> Latn
-    {0x6E670000u, 55u}, // ng -> Latn
-    {0x80CD0000u, 55u}, // nga -> Latn
-    {0x84CD0000u, 55u}, // ngb -> Latn
-    {0x88CD0000u, 55u}, // ngc -> Latn
-    {0x8CCD0000u, 55u}, // ngd -> Latn
-    {0x90CD0000u, 55u}, // nge -> Latn
-    {0x98CD0000u, 55u}, // ngg -> Latn
-    {0x9CCD0000u, 55u}, // ngh -> Latn
-    {0xA0CD0000u, 55u}, // ngi -> Latn
-    {0xA4CD0000u, 55u}, // ngj -> Latn
-    {0xA8CD0000u, 55u}, // ngk -> Latn
-    {0xACCD0000u, 55u}, // ngl -> Latn
-    {0xB0CD0000u, 55u}, // ngm -> Latn
-    {0xB4CD0000u, 55u}, // ngn -> Latn
-    {0xBCCD0000u, 55u}, // ngp -> Latn
-    {0xC0CD0000u, 55u}, // ngq -> Latn
-    {0xC4CD0000u, 55u}, // ngr -> Latn
-    {0xC8CD0000u, 55u}, // ngs -> Latn
-    {0xCCCD0000u, 52u}, // ngt -> Laoo
-    {0xD0CD0000u, 55u}, // ngu -> Latn
-    {0xD4CD0000u, 55u}, // ngv -> Latn
-    {0xD8CD0000u, 55u}, // ngw -> Latn
-    {0xDCCD0000u, 55u}, // ngx -> Latn
-    {0xE0CD0000u, 55u}, // ngy -> Latn
-    {0xE4CD0000u, 55u}, // ngz -> Latn
-    {0x80ED0000u, 55u}, // nha -> Latn
-    {0x84ED0000u, 55u}, // nhb -> Latn
-    {0x88ED0000u, 55u}, // nhc -> Latn
-    {0x8CED0000u, 55u}, // nhd -> Latn
-    {0x90ED0000u, 55u}, // nhe -> Latn
-    {0x94ED0000u, 55u}, // nhf -> Latn
-    {0x98ED0000u, 55u}, // nhg -> Latn
-    {0xA0ED0000u, 55u}, // nhi -> Latn
-    {0xA8ED0000u, 55u}, // nhk -> Latn
-    {0xB0ED0000u, 55u}, // nhm -> Latn
-    {0xB4ED0000u, 55u}, // nhn -> Latn
-    {0xB8ED0000u, 55u}, // nho -> Latn
-    {0xBCED0000u, 55u}, // nhp -> Latn
-    {0xC0ED0000u, 55u}, // nhq -> Latn
-    {0xC4ED0000u, 55u}, // nhr -> Latn
-    {0xCCED0000u, 55u}, // nht -> Latn
-    {0xD0ED0000u, 55u}, // nhu -> Latn
-    {0xD4ED0000u, 55u}, // nhv -> Latn
-    {0xD8ED0000u, 55u}, // nhw -> Latn
-    {0xDCED0000u, 55u}, // nhx -> Latn
-    {0xE0ED0000u, 55u}, // nhy -> Latn
-    {0xE4ED0000u, 55u}, // nhz -> Latn
-    {0x810D0000u, 55u}, // nia -> Latn
-    {0x850D0000u, 55u}, // nib -> Latn
-    {0x8D0D0000u, 55u}, // nid -> Latn
-    {0x910D0000u, 55u}, // nie -> Latn
-    {0x950D0000u, 55u}, // nif -> Latn
-    {0x990D0000u, 55u}, // nig -> Latn
-    {0x9D0D0000u, 55u}, // nih -> Latn
-    {0xA10D0000u, 55u}, // nii -> Latn
-    {0xA50D0000u, 55u}, // nij -> Latn
-    {0xAD0D0000u, 55u}, // nil -> Latn
-    {0xB10D0000u, 55u}, // nim -> Latn
-    {0xB50D0000u, 55u}, // nin -> Latn
-    {0xB90D0000u, 20u}, // nio -> Cyrl
-    {0xC10D0000u, 55u}, // niq -> Latn
-    {0xC50D0000u, 55u}, // nir -> Latn
-    {0xC90D0000u, 55u}, // nis -> Latn
-    {0xCD0D0000u, 108u}, // nit -> Telu
-    {0xD10D0000u, 55u}, // niu -> Latn
-    {0xD50D0000u, 20u}, // niv -> Cyrl
-    {0xD90D0000u, 55u}, // niw -> Latn
-    {0xDD0D0000u, 55u}, // nix -> Latn
-    {0xE10D0000u, 55u}, // niy -> Latn
-    {0xE50D0000u, 55u}, // niz -> Latn
-    {0x812D0000u, 55u}, // nja -> Latn
-    {0x852D0000u, 55u}, // njb -> Latn
-    {0x8D2D0000u, 55u}, // njd -> Latn
-    {0x9D2D0000u, 55u}, // njh -> Latn
-    {0xA12D0000u, 55u}, // nji -> Latn
-    {0xA52D0000u, 55u}, // njj -> Latn
-    {0xAD2D0000u, 55u}, // njl -> Latn
-    {0xB12D0000u, 55u}, // njm -> Latn
-    {0xB52D0000u, 55u}, // njn -> Latn
-    {0xB92D0000u, 55u}, // njo -> Latn
-    {0xC52D0000u, 55u}, // njr -> Latn
-    {0xC92D0000u, 55u}, // njs -> Latn
-    {0xCD2D0000u, 55u}, // njt -> Latn
-    {0xD12D0000u, 55u}, // nju -> Latn
-    {0xDD2D0000u, 55u}, // njx -> Latn
-    {0xE12D0000u, 55u}, // njy -> Latn
-    {0xE52D0000u, 55u}, // njz -> Latn
-    {0x814D0000u, 55u}, // nka -> Latn
-    {0x854D0000u, 55u}, // nkb -> Latn
-    {0x894D0000u, 55u}, // nkc -> Latn
-    {0x8D4D0000u, 55u}, // nkd -> Latn
-    {0x914D0000u, 55u}, // nke -> Latn
-    {0x954D0000u, 55u}, // nkf -> Latn
-    {0x994D0000u, 55u}, // nkg -> Latn
-    {0x9D4D0000u, 55u}, // nkh -> Latn
-    {0xA14D0000u, 55u}, // nki -> Latn
-    {0xA54D0000u, 55u}, // nkj -> Latn
-    {0xA94D0000u, 55u}, // nkk -> Latn
-    {0xB14D0000u, 55u}, // nkm -> Latn
-    {0xB54D0000u, 55u}, // nkn -> Latn
-    {0xB94D0000u, 55u}, // nko -> Latn
-    {0xC14D0000u, 55u}, // nkq -> Latn
-    {0xC54D0000u, 55u}, // nkr -> Latn
-    {0xC94D0000u, 55u}, // nks -> Latn
-    {0xCD4D0000u, 55u}, // nkt -> Latn
-    {0xD14D0000u, 55u}, // nku -> Latn
-    {0xD54D0000u, 55u}, // nkv -> Latn
-    {0xD94D0000u, 55u}, // nkw -> Latn
-    {0xDD4D0000u, 55u}, // nkx -> Latn
-    {0xE54D0000u, 55u}, // nkz -> Latn
-    {0x6E6C0000u, 55u}, // nl -> Latn
-    {0x816D0000u, 55u}, // nla -> Latn
-    {0x896D0000u, 55u}, // nlc -> Latn
-    {0x916D0000u, 55u}, // nle -> Latn
-    {0x996D0000u, 55u}, // nlg -> Latn
-    {0xA16D0000u,  2u}, // nli -> Arab
-    {0xA56D0000u, 55u}, // nlj -> Latn
-    {0xA96D0000u, 55u}, // nlk -> Latn
-    {0xB16D0000u,  2u}, // nlm -> Arab
-    {0xB96D0000u, 55u}, // nlo -> Latn
-    {0xC16D0000u, 55u}, // nlq -> Latn
-    {0xD16D0000u, 55u}, // nlu -> Latn
-    {0xD56D0000u, 55u}, // nlv -> Latn
-    {0xD96D0000u, 55u}, // nlw -> Latn
-    {0xDD6D0000u, 21u}, // nlx -> Deva
-    {0xE16D0000u, 55u}, // nly -> Latn
-    {0xE56D0000u, 55u}, // nlz -> Latn
-    {0x818D0000u, 55u}, // nma -> Latn
-    {0x858D0000u, 55u}, // nmb -> Latn
-    {0x898D0000u, 55u}, // nmc -> Latn
-    {0x8D8D0000u, 55u}, // nmd -> Latn
-    {0x918D0000u, 55u}, // nme -> Latn
-    {0x958D0000u, 55u}, // nmf -> Latn
-    {0x998D0000u, 55u}, // nmg -> Latn
-    {0x9D8D0000u, 55u}, // nmh -> Latn
-    {0xA18D0000u, 55u}, // nmi -> Latn
-    {0xA58D0000u, 55u}, // nmj -> Latn
-    {0xA98D0000u, 55u}, // nmk -> Latn
-    {0xAD8D0000u, 55u}, // nml -> Latn
-    {0xB18D0000u, 21u}, // nmm -> Deva
-    {0xB58D0000u, 55u}, // nmn -> Latn
-    {0xB98D0000u, 55u}, // nmo -> Latn
-    {0xBD8D0000u, 55u}, // nmp -> Latn
-    {0xC18D0000u, 55u}, // nmq -> Latn
-    {0xC58D0000u, 55u}, // nmr -> Latn
-    {0xC98D0000u, 55u}, // nms -> Latn
-    {0xCD8D0000u, 55u}, // nmt -> Latn
-    {0xD18D0000u, 55u}, // nmu -> Latn
-    {0xD58D0000u, 55u}, // nmv -> Latn
-    {0xD98D0000u, 55u}, // nmw -> Latn
-    {0xDD8D0000u, 55u}, // nmx -> Latn
-    {0xE58D0000u, 55u}, // nmz -> Latn
-    {0x6E6E0000u, 55u}, // nn -> Latn
-    {0x81AD0000u, 55u}, // nna -> Latn
-    {0x85AD0000u, 55u}, // nnb -> Latn
-    {0x89AD0000u, 55u}, // nnc -> Latn
-    {0x8DAD0000u, 55u}, // nnd -> Latn
-    {0x91AD0000u, 55u}, // nne -> Latn
-    {0x95AD0000u, 55u}, // nnf -> Latn
-    {0x99AD0000u, 55u}, // nng -> Latn
-    {0x9DAD0000u, 55u}, // nnh -> Latn
-    {0xA1AD0000u, 55u}, // nni -> Latn
-    {0xA5AD0000u, 55u}, // nnj -> Latn
-    {0xA9AD0000u, 55u}, // nnk -> Latn
-    {0xADAD0000u, 55u}, // nnl -> Latn
-    {0xB1AD0000u, 55u}, // nnm -> Latn
-    {0xB5AD0000u, 55u}, // nnn -> Latn
-    {0xBDAD0000u, 117u}, // nnp -> Wcho
-    {0xC1AD0000u, 55u}, // nnq -> Latn
-    {0xC5AD0000u, 55u}, // nnr -> Latn
-    {0xCDAD0000u, 55u}, // nnt -> Latn
-    {0xD1AD0000u, 55u}, // nnu -> Latn
-    {0xD5AD0000u, 55u}, // nnv -> Latn
-    {0xD9AD0000u, 55u}, // nnw -> Latn
-    {0xE1AD0000u, 55u}, // nny -> Latn
-    {0xE5AD0000u, 55u}, // nnz -> Latn
-    {0x6E6F0000u, 55u}, // no -> Latn
-    {0x81CD0000u, 55u}, // noa -> Latn
-    {0x89CD0000u, 55u}, // noc -> Latn
-    {0x8DCD0000u, 51u}, // nod -> Lana
-    {0x91CD0000u, 21u}, // noe -> Deva
-    {0x95CD0000u, 55u}, // nof -> Latn
-    {0x99CD0000u, 20u}, // nog -> Cyrl
-    {0x9DCD0000u, 55u}, // noh -> Latn
-    {0xA1CD0000u, 21u}, // noi -> Deva
-    {0xA5CD0000u, 55u}, // noj -> Latn
-    {0xA9CD0000u, 55u}, // nok -> Latn
-    {0xB5CD0000u, 90u}, // non -> Runr
-    {0xBDCD0000u, 55u}, // nop -> Latn
-    {0xC1CD0000u, 55u}, // noq -> Latn
-    {0xC9CD0000u, 120u}, // nos -> Yiii
-    {0xCDCD0000u, 55u}, // not -> Latn
-    {0xD1CD0000u, 55u}, // nou -> Latn
-    {0xD5CD0000u, 55u}, // nov -> Latn
-    {0xD9CD0000u, 55u}, // now -> Latn
-    {0xE1CD0000u, 55u}, // noy -> Latn
-    {0x85ED0000u, 112u}, // npb -> Tibt
-    {0x99ED0000u, 55u}, // npg -> Latn
-    {0x9DED0000u, 55u}, // nph -> Latn
-    {0xADED0000u, 55u}, // npl -> Latn
-    {0xB5ED0000u, 55u}, // npn -> Latn
-    {0xB9ED0000u, 55u}, // npo -> Latn
-    {0xC9ED0000u, 55u}, // nps -> Latn
-    {0xD1ED0000u, 55u}, // npu -> Latn
-    {0xDDED0000u, 55u}, // npx -> Latn
-    {0xE1ED0000u, 55u}, // npy -> Latn
-    {0x9A0D0000u, 55u}, // nqg -> Latn
-    {0xAA0D0000u, 55u}, // nqk -> Latn
-    {0xAE0D0000u, 55u}, // nql -> Latn
-    {0xB20D0000u, 55u}, // nqm -> Latn
-    {0xB60D0000u, 55u}, // nqn -> Latn
-    {0xBA0D0000u, 75u}, // nqo -> Nkoo
-    {0xC20D0000u, 55u}, // nqq -> Latn
-    {0xCE0D0000u, 55u}, // nqt -> Latn
-    {0xE20D0000u, 55u}, // nqy -> Latn
-    {0x6E720000u, 55u}, // nr -> Latn
-    {0x822D0000u, 55u}, // nra -> Latn
-    {0x862D0000u, 55u}, // nrb -> Latn
-    {0x922D0000u, 55u}, // nre -> Latn
-    {0x962D0000u, 55u}, // nrf -> Latn
-    {0x9A2D0000u, 55u}, // nrg -> Latn
-    {0xA22D0000u, 55u}, // nri -> Latn
-    {0xAA2D0000u, 55u}, // nrk -> Latn
-    {0xAE2D0000u, 55u}, // nrl -> Latn
-    {0xB22D0000u, 55u}, // nrm -> Latn
-    {0xB62D0000u, 90u}, // nrn -> Runr
-    {0xBE2D0000u, 55u}, // nrp -> Latn
-    {0xD22D0000u, 55u}, // nru -> Latn
-    {0xDE2D0000u, 55u}, // nrx -> Latn
-    {0xE62D0000u, 55u}, // nrz -> Latn
-    {0x824D0000u, 55u}, // nsa -> Latn
-    {0x864D0000u, 55u}, // nsb -> Latn
-    {0x8A4D0000u, 55u}, // nsc -> Latn
-    {0x8E4D0000u, 120u}, // nsd -> Yiii
-    {0x924D0000u, 55u}, // nse -> Latn
-    {0x964D0000u, 120u}, // nsf -> Yiii
-    {0x9A4D0000u, 55u}, // nsg -> Latn
-    {0x9E4D0000u, 55u}, // nsh -> Latn
-    {0xAA4D0000u, 13u}, // nsk -> Cans
-    {0xB24D0000u, 55u}, // nsm -> Latn
-    {0xB64D0000u, 55u}, // nsn -> Latn
-    {0xBA4D0000u, 55u}, // nso -> Latn
-    {0xC24D0000u, 55u}, // nsq -> Latn
-    {0xCA4D0000u, 55u}, // nss -> Latn
-    {0xCE4D0000u, 113u}, // nst -> Tnsa
-    {0xD24D0000u, 55u}, // nsu -> Latn
-    {0xD64D0000u, 120u}, // nsv -> Yiii
-    {0xDA4D0000u, 55u}, // nsw -> Latn
-    {0xDE4D0000u, 55u}, // nsx -> Latn
-    {0xE24D0000u, 55u}, // nsy -> Latn
-    {0xE64D0000u, 55u}, // nsz -> Latn
-    {0x8E6D0000u, 55u}, // ntd -> Latn
-    {0x926D0000u, 55u}, // nte -> Latn
-    {0x9A6D0000u, 55u}, // ntg -> Latn
-    {0xA26D0000u, 55u}, // nti -> Latn
-    {0xA66D0000u, 55u}, // ntj -> Latn
-    {0xAA6D0000u, 55u}, // ntk -> Latn
-    {0xB26D0000u, 55u}, // ntm -> Latn
-    {0xBA6D0000u, 55u}, // nto -> Latn
-    {0xBE6D0000u, 55u}, // ntp -> Latn
-    {0xC66D0000u, 55u}, // ntr -> Latn
-    {0xD26D0000u, 55u}, // ntu -> Latn
-    {0xDE6D0000u, 55u}, // ntx -> Latn
-    {0xE26D0000u, 120u}, // nty -> Yiii
-    {0xE66D0000u,  2u}, // ntz -> Arab
-    {0x828D0000u, 55u}, // nua -> Latn
-    {0x8A8D0000u, 55u}, // nuc -> Latn
-    {0x8E8D0000u, 55u}, // nud -> Latn
-    {0x928D0000u, 55u}, // nue -> Latn
-    {0x968D0000u, 55u}, // nuf -> Latn
-    {0x9A8D0000u, 55u}, // nug -> Latn
-    {0x9E8D0000u, 55u}, // nuh -> Latn
-    {0xA28D0000u, 55u}, // nui -> Latn
-    {0xA68D0000u, 55u}, // nuj -> Latn
-    {0xAA8D0000u, 55u}, // nuk -> Latn
-    {0xB28D0000u, 55u}, // num -> Latn
-    {0xB68D0000u, 55u}, // nun -> Latn
-    {0xBA8D0000u, 55u}, // nuo -> Latn
-    {0xBE8D0000u, 55u}, // nup -> Latn
-    {0xC28D0000u, 55u}, // nuq -> Latn
-    {0xC68D0000u, 55u}, // nur -> Latn
-    {0xCA8D0000u, 55u}, // nus -> Latn
-    {0xCE8D0000u, 55u}, // nut -> Latn
-    {0xD28D0000u, 55u}, // nuu -> Latn
-    {0xD68D0000u, 55u}, // nuv -> Latn
-    {0xDA8D0000u, 55u}, // nuw -> Latn
-    {0xDE8D0000u, 55u}, // nux -> Latn
-    {0xE28D0000u, 55u}, // nuy -> Latn
-    {0xE68D0000u, 55u}, // nuz -> Latn
-    {0x6E760000u, 55u}, // nv -> Latn
-    {0x9EAD0000u, 55u}, // nvh -> Latn
-    {0xB2AD0000u, 55u}, // nvm -> Latn
-    {0xBAAD0000u, 55u}, // nvo -> Latn
-    {0x86CD0000u, 55u}, // nwb -> Latn
-    {0x8ACD0000u, 74u}, // nwc -> Newa
-    {0x92CD0000u, 55u}, // nwe -> Latn
-    {0x9ACD0000u, 55u}, // nwg -> Latn
-    {0xA2CD0000u, 55u}, // nwi -> Latn
-    {0xB2CD0000u, 55u}, // nwm -> Latn
-    {0xBACD0000u, 55u}, // nwo -> Latn
-    {0xC6CD0000u, 55u}, // nwr -> Latn
-    {0xDACD0000u, 55u}, // nww -> Latn
-    {0xDECD0000u, 21u}, // nwx -> Deva
-    {0x82ED0000u, 55u}, // nxa -> Latn
-    {0x8EED0000u, 55u}, // nxd -> Latn
-    {0x92ED0000u, 55u}, // nxe -> Latn
-    {0x9AED0000u, 55u}, // nxg -> Latn
-    {0xA2ED0000u, 55u}, // nxi -> Latn
-    {0xAEED0000u, 55u}, // nxl -> Latn
-    {0xB6ED0000u, 55u}, // nxn -> Latn
-    {0xBAED0000u, 55u}, // nxo -> Latn
-    {0xC2ED0000u, 55u}, // nxq -> Latn
-    {0xC6ED0000u, 55u}, // nxr -> Latn
-    {0xDEED0000u, 55u}, // nxx -> Latn
-    {0x6E790000u, 55u}, // ny -> Latn
-    {0x870D0000u, 55u}, // nyb -> Latn
-    {0x8B0D0000u, 55u}, // nyc -> Latn
-    {0x8F0D0000u, 55u}, // nyd -> Latn
-    {0x930D0000u, 55u}, // nye -> Latn
-    {0x970D0000u, 55u}, // nyf -> Latn
-    {0x9B0D0000u, 55u}, // nyg -> Latn
-    {0x9F0D0000u, 55u}, // nyh -> Latn
-    {0xA30D0000u, 55u}, // nyi -> Latn
-    {0xA70D0000u, 55u}, // nyj -> Latn
-    {0xAB0D0000u, 55u}, // nyk -> Latn
-    {0xAF0D0000u, 111u}, // nyl -> Thai
-    {0xB30D0000u, 55u}, // nym -> Latn
-    {0xB70D0000u, 55u}, // nyn -> Latn
-    {0xBB0D0000u, 55u}, // nyo -> Latn
-    {0xBF0D0000u, 55u}, // nyp -> Latn
-    {0xC30D0000u,  2u}, // nyq -> Arab
-    {0xC70D0000u, 55u}, // nyr -> Latn
-    {0xCB0D0000u, 55u}, // nys -> Latn
-    {0xCF0D0000u, 55u}, // nyt -> Latn
-    {0xD30D0000u, 55u}, // nyu -> Latn
-    {0xD70D0000u, 55u}, // nyv -> Latn
-    {0xDB0D0000u, 111u}, // nyw -> Thai
-    {0xDF0D0000u, 55u}, // nyx -> Latn
-    {0xE30D0000u, 55u}, // nyy -> Latn
-    {0x832D0000u, 55u}, // nza -> Latn
-    {0x872D0000u, 55u}, // nzb -> Latn
-    {0x8F2D0000u, 55u}, // nzd -> Latn
-    {0xA32D0000u, 55u}, // nzi -> Latn
-    {0xAB2D0000u, 55u}, // nzk -> Latn
-    {0xB32D0000u, 55u}, // nzm -> Latn
-    {0xC72D0000u, 55u}, // nzr -> Latn
-    {0xD32D0000u, 55u}, // nzu -> Latn
-    {0xE32D0000u, 55u}, // nzy -> Latn
-    {0xE72D0000u, 55u}, // nzz -> Latn
-    {0x800E0000u, 20u}, // oaa -> Cyrl
-    {0x880E0000u, 20u}, // oac -> Cyrl
-    {0xC40E0000u, 100u}, // oar -> Syrc
-    {0xD40E0000u, 25u}, // oav -> Geor
-    {0xA02E0000u, 55u}, // obi -> Latn
-    {0xA82E0000u, 55u}, // obk -> Latn
-    {0xAC2E0000u, 55u}, // obl -> Latn
-    {0xB02E0000u, 85u}, // obm -> Phnx
-    {0xB82E0000u, 55u}, // obo -> Latn
-    {0xC42E0000u, 72u}, // obr -> Mymr
-    {0xCC2E0000u, 55u}, // obt -> Latn
-    {0xD02E0000u, 55u}, // obu -> Latn
-    {0x6F630000u, 55u}, // oc -> Latn
-    {0x804E0000u, 55u}, // oca -> Latn
-    {0xB84E0000u, 55u}, // oco -> Latn
-    {0xD04E0000u, 55u}, // ocu -> Latn
-    {0x806E0000u, 55u}, // oda -> Latn
-    {0xA86E0000u,  2u}, // odk -> Arab
-    {0xCC6E0000u, 55u}, // odt -> Latn
-    {0xD06E0000u, 55u}, // odu -> Latn
-    {0xC8AE0000u, 55u}, // ofs -> Latn
-    {0xD0AE0000u, 55u}, // ofu -> Latn
-    {0x84CE0000u, 55u}, // ogb -> Latn
-    {0x88CE0000u, 55u}, // ogc -> Latn
-    {0x98CE0000u, 55u}, // ogg -> Latn
-    {0xB8CE0000u, 55u}, // ogo -> Latn
-    {0xD0CE0000u, 55u}, // ogu -> Latn
-    {0xCCEE0000u, 119u}, // oht -> Xsux
-    {0xD0EE0000u, 55u}, // ohu -> Latn
-    {0x810E0000u, 55u}, // oia -> Latn
-    {0x910E0000u, 55u}, // oie -> Latn
-    {0xB50E0000u, 55u}, // oin -> Latn
-    {0x6F6A0000u, 13u}, // oj -> Cans
-    {0x852E0000u, 55u}, // ojb -> Latn
-    {0x892E0000u, 55u}, // ojc -> Latn
-    {0xC92E0000u, 13u}, // ojs -> Cans
-    {0xD52E0000u, 55u}, // ojv -> Latn
-    {0xD92E0000u, 55u}, // ojw -> Latn
-    {0x814E0000u, 55u}, // oka -> Latn
-    {0x854E0000u, 55u}, // okb -> Latn
-    {0x894E0000u, 55u}, // okc -> Latn
-    {0x8D4E0000u, 55u}, // okd -> Latn
-    {0x914E0000u, 55u}, // oke -> Latn
-    {0x994E0000u, 55u}, // okg -> Latn
-    {0xA14E0000u, 55u}, // oki -> Latn
-    {0xA94E0000u, 55u}, // okk -> Latn
-    {0xB14E0000u, 33u}, // okm -> Hang
-    {0xB94E0000u, 34u}, // oko -> Hani
-    {0xC54E0000u, 55u}, // okr -> Latn
-    {0xC94E0000u, 55u}, // oks -> Latn
-    {0xD14E0000u, 55u}, // oku -> Latn
-    {0xD54E0000u, 55u}, // okv -> Latn
-    {0xDD4E0000u, 55u}, // okx -> Latn
-    {0xE54E0000u, 47u}, // okz -> Khmr
-    {0x816E0000u, 21u}, // ola -> Deva
-    {0x8D6E0000u, 55u}, // old -> Latn
-    {0x916E0000u, 112u}, // ole -> Tibt
-    {0xA96E0000u, 55u}, // olk -> Latn
-    {0xB16E0000u, 55u}, // olm -> Latn
-    {0xB96E0000u, 55u}, // olo -> Latn
-    {0xC56E0000u, 55u}, // olr -> Latn
-    {0xCD6E0000u, 55u}, // olt -> Latn
-    {0xD16E0000u, 55u}, // olu -> Latn
-    {0x6F6D0000u, 55u}, // om -> Latn
-    {0x818E0000u, 55u}, // oma -> Latn
-    {0x858E0000u, 55u}, // omb -> Latn
-    {0x898E0000u, 55u}, // omc -> Latn
-    {0x998E0000u, 55u}, // omg -> Latn
-    {0xA18E0000u, 55u}, // omi -> Latn
-    {0xA98E0000u, 20u}, // omk -> Cyrl
-    {0xAD8E0000u, 55u}, // oml -> Latn
-    {0xB98E0000u, 55u}, // omo -> Latn
-    {0xBD8E0000u, 71u}, // omp -> Mtei
-    {0xC58E0000u, 68u}, // omr -> Modi
-    {0xCD8E0000u, 55u}, // omt -> Latn
-    {0xD18E0000u, 55u}, // omu -> Latn
-    {0xD98E0000u, 55u}, // omw -> Latn
-    {0xDD8E0000u, 72u}, // omx -> Mymr
-    {0x81AE0000u, 55u}, // ona -> Latn
-    {0x91AE0000u, 55u}, // one -> Latn
-    {0x99AE0000u, 55u}, // ong -> Latn
-    {0xA1AE0000u, 55u}, // oni -> Latn
-    {0xA5AE0000u, 55u}, // onj -> Latn
-    {0xA9AE0000u, 55u}, // onk -> Latn
-    {0xB5AE0000u, 55u}, // onn -> Latn
-    {0xB9AE0000u, 55u}, // ono -> Latn
-    {0xBDAE0000u, 55u}, // onp -> Latn
-    {0xC5AE0000u, 55u}, // onr -> Latn
-    {0xC9AE0000u, 55u}, // ons -> Latn
-    {0xCDAE0000u, 55u}, // ont -> Latn
-    {0xD1AE0000u, 55u}, // onu -> Latn
-    {0xDDAE0000u, 55u}, // onx -> Latn
-    {0x8DCE0000u, 55u}, // ood -> Latn
-    {0xB5CE0000u, 21u}, // oon -> Deva
-    {0xC5CE0000u, 55u}, // oor -> Latn
-    {0x81EE0000u, 55u}, // opa -> Latn
-    {0xA9EE0000u, 55u}, // opk -> Latn
-    {0xB1EE0000u, 55u}, // opm -> Latn
-    {0xB9EE0000u, 55u}, // opo -> Latn
-    {0xCDEE0000u, 55u}, // opt -> Latn
-    {0xE1EE0000u, 55u}, // opy -> Latn
-    {0x6F720000u, 80u}, // or -> Orya
-    {0x822E0000u, 55u}, // ora -> Latn
-    {0x8A2E0000u, 55u}, // orc -> Latn
-    {0x922E0000u, 55u}, // ore -> Latn
-    {0x9A2E0000u, 55u}, // org -> Latn
-    {0xB62E0000u, 55u}, // orn -> Latn
-    {0xBA2E0000u, 55u}, // oro -> Latn
-    {0xC62E0000u, 55u}, // orr -> Latn
-    {0xCA2E0000u, 55u}, // ors -> Latn
-    {0xCE2E0000u, 108u}, // ort -> Telu
-    {0xD22E0000u,  2u}, // oru -> Arab
-    {0xD62E0000u, 20u}, // orv -> Cyrl
-    {0xDA2E0000u, 55u}, // orw -> Latn
-    {0xDE2E0000u, 55u}, // orx -> Latn
-    {0xE62E0000u, 55u}, // orz -> Latn
-    {0x6F730000u, 20u}, // os -> Cyrl
-    {0x824E0000u, 81u}, // osa -> Osge
-    {0x8A4E0000u, 40u}, // osc -> Ital
-    {0xA24E0000u, 41u}, // osi -> Java
-    {0xBA4E0000u, 55u}, // oso -> Latn
-    {0xBE4E0000u, 55u}, // osp -> Latn
-    {0xCE4E0000u, 55u}, // ost -> Latn
-    {0xD24E0000u, 55u}, // osu -> Latn
-    {0xDE4E0000u, 55u}, // osx -> Latn
-    {0x826E0000u,  2u}, // ota -> Arab
-    {0x866E0000u, 112u}, // otb -> Tibt
-    {0x8E6E0000u, 55u}, // otd -> Latn
-    {0x926E0000u, 55u}, // ote -> Latn
-    {0xA26E0000u, 55u}, // oti -> Latn
-    {0xAA6E0000u, 79u}, // otk -> Orkh
-    {0xAE6E0000u, 55u}, // otl -> Latn
-    {0xB26E0000u, 55u}, // otm -> Latn
-    {0xB66E0000u, 55u}, // otn -> Latn
-    {0xC26E0000u, 55u}, // otq -> Latn
-    {0xC66E0000u, 55u}, // otr -> Latn
-    {0xCA6E0000u, 55u}, // ots -> Latn
-    {0xCE6E0000u, 55u}, // ott -> Latn
-    {0xD26E0000u, 55u}, // otu -> Latn
-    {0xDA6E0000u, 55u}, // otw -> Latn
-    {0xDE6E0000u, 55u}, // otx -> Latn
-    {0xE26E0000u, 29u}, // oty -> Gran
-    {0xE66E0000u, 55u}, // otz -> Latn
-    {0x868E0000u, 55u}, // oub -> Latn
-    {0x928E0000u, 55u}, // oue -> Latn
-    {0xA28E0000u, 82u}, // oui -> Ougr
-    {0xB28E0000u, 55u}, // oum -> Latn
-    {0x8EAE0000u, 55u}, // ovd -> Latn
-    {0xA2CE0000u, 55u}, // owi -> Latn
-    {0xAECE0000u, 55u}, // owl -> Latn
-    {0x8F0E0000u, 55u}, // oyd -> Latn
-    {0xB30E0000u, 55u}, // oym -> Latn
-    {0xE30E0000u, 55u}, // oyy -> Latn
-    {0xB32E0000u, 55u}, // ozm -> Latn
-    {0x70610000u, 32u}, // pa -> Guru
-    {0x7061504Bu,  2u}, // pa-PK -> Arab
-    {0x840F0000u, 55u}, // pab -> Latn
-    {0x880F0000u, 55u}, // pac -> Latn
-    {0x8C0F0000u, 55u}, // pad -> Latn
-    {0x900F0000u, 55u}, // pae -> Latn
-    {0x940F0000u, 55u}, // paf -> Latn
-    {0x980F0000u, 55u}, // pag -> Latn
-    {0x9C0F0000u, 55u}, // pah -> Latn
-    {0xA00F0000u, 55u}, // pai -> Latn
-    {0xA80F0000u, 55u}, // pak -> Latn
-    {0xAC0F0000u, 84u}, // pal -> Phli
-    {0xB00F0000u, 55u}, // pam -> Latn
-    {0xB80F0000u, 55u}, // pao -> Latn
-    {0xBC0F0000u, 55u}, // pap -> Latn
-    {0xC00F0000u, 20u}, // paq -> Cyrl
-    {0xC40F0000u, 55u}, // par -> Latn
-    {0xC80F0000u, 55u}, // pas -> Latn
-    {0xD00F0000u, 55u}, // pau -> Latn
-    {0xD40F0000u, 55u}, // pav -> Latn
-    {0xD80F0000u, 55u}, // paw -> Latn
-    {0xDC0F0000u, 55u}, // pax -> Latn
-    {0xE00F0000u, 55u}, // pay -> Latn
-    {0xE40F0000u, 55u}, // paz -> Latn
-    {0x842F0000u, 55u}, // pbb -> Latn
-    {0x882F0000u, 55u}, // pbc -> Latn
-    {0x902F0000u, 55u}, // pbe -> Latn
-    {0x942F0000u, 55u}, // pbf -> Latn
-    {0x982F0000u, 55u}, // pbg -> Latn
-    {0x9C2F0000u, 55u}, // pbh -> Latn
-    {0xA02F0000u, 55u}, // pbi -> Latn
-    {0xAC2F0000u, 55u}, // pbl -> Latn
-    {0xB02F0000u, 55u}, // pbm -> Latn
-    {0xB42F0000u, 55u}, // pbn -> Latn
-    {0xB82F0000u, 55u}, // pbo -> Latn
-    {0xBC2F0000u, 55u}, // pbp -> Latn
-    {0xC42F0000u, 55u}, // pbr -> Latn
-    {0xC82F0000u, 55u}, // pbs -> Latn
-    {0xCC2F0000u,  2u}, // pbt -> Arab
-    {0xD42F0000u, 55u}, // pbv -> Latn
-    {0xE02F0000u, 55u}, // pby -> Latn
-    {0x804F0000u, 55u}, // pca -> Latn
-    {0x844F0000u, 47u}, // pcb -> Khmr
-    {0x884F0000u, 55u}, // pcc -> Latn
-    {0x8C4F0000u, 55u}, // pcd -> Latn
-    {0x904F0000u, 72u}, // pce -> Mymr
-    {0x944F0000u, 67u}, // pcf -> Mlym
-    {0x984F0000u, 67u}, // pcg -> Mlym
-    {0x9C4F0000u, 21u}, // pch -> Deva
-    {0xA04F0000u, 21u}, // pci -> Deva
-    {0xA44F0000u, 108u}, // pcj -> Telu
-    {0xA84F0000u, 55u}, // pck -> Latn
-    {0xB04F0000u, 55u}, // pcm -> Latn
-    {0xB44F0000u, 55u}, // pcn -> Latn
-    {0xBC4F0000u, 55u}, // pcp -> Latn
-    {0xD84F0000u, 55u}, // pcw -> Latn
-    {0x806F0000u, 55u}, // pda -> Latn
-    {0x886F0000u, 55u}, // pdc -> Latn
-    {0xB46F0000u, 55u}, // pdn -> Latn
-    {0xB86F0000u, 55u}, // pdo -> Latn
-    {0xCC6F0000u, 55u}, // pdt -> Latn
-    {0xD06F0000u, 55u}, // pdu -> Latn
-    {0x808F0000u, 55u}, // pea -> Latn
-    {0x848F0000u, 55u}, // peb -> Latn
-    {0x8C8F0000u, 55u}, // ped -> Latn
-    {0x908F0000u, 55u}, // pee -> Latn
-    {0x988F0000u, 80u}, // peg -> Orya
-    {0xA08F0000u, 55u}, // pei -> Latn
-    {0xA88F0000u, 55u}, // pek -> Latn
-    {0xAC8F0000u, 55u}, // pel -> Latn
-    {0xB08F0000u, 55u}, // pem -> Latn
-    {0xB88F0000u, 118u}, // peo -> Xpeo
-    {0xBC8F0000u, 55u}, // pep -> Latn
-    {0xC08F0000u, 55u}, // peq -> Latn
-    {0xD48F0000u, 55u}, // pev -> Latn
-    {0xDC8F0000u, 55u}, // pex -> Latn
-    {0xE08F0000u, 55u}, // pey -> Latn
-    {0xE48F0000u, 55u}, // pez -> Latn
-    {0x80AF0000u, 55u}, // pfa -> Latn
-    {0x90AF0000u, 55u}, // pfe -> Latn
-    {0xACAF0000u, 55u}, // pfl -> Latn
-    {0x80CF0000u, 55u}, // pga -> Latn
-    {0x8CCF0000u, 46u}, // pgd -> Khar
-    {0x98CF0000u, 21u}, // pgg -> Deva
-    {0xA0CF0000u, 55u}, // pgi -> Latn
-    {0xA8CF0000u, 55u}, // pgk -> Latn
-    {0xACCF0000u, 77u}, // pgl -> Ogam
-    {0xB4CF0000u, 40u}, // pgn -> Ital
-    {0xC8CF0000u, 55u}, // pgs -> Latn
-    {0xD0CF0000u, 55u}, // pgu -> Latn
-    {0x8CEF0000u, 21u}, // phd -> Deva
-    {0x98EF0000u, 55u}, // phg -> Latn
-    {0x9CEF0000u, 55u}, // phh -> Latn
-    {0xA8EF0000u, 72u}, // phk -> Mymr
-    {0xACEF0000u,  2u}, // phl -> Arab
-    {0xB0EF0000u, 55u}, // phm -> Latn
-    {0xB4EF0000u, 85u}, // phn -> Phnx
-    {0xB8EF0000u, 52u}, // pho -> Laoo
-    {0xC4EF0000u,  2u}, // phr -> Arab
-    {0xCCEF0000u, 111u}, // pht -> Thai
-    {0xD0EF0000u, 111u}, // phu -> Thai
-    {0xD4EF0000u,  2u}, // phv -> Arab
-    {0xD8EF0000u, 21u}, // phw -> Deva
-    {0x70690000u, 95u}, // pi -> Sinh
-    {0x810F0000u, 55u}, // pia -> Latn
-    {0x850F0000u, 55u}, // pib -> Latn
-    {0x890F0000u, 55u}, // pic -> Latn
-    {0x8D0F0000u, 55u}, // pid -> Latn
-    {0x950F0000u, 55u}, // pif -> Latn
-    {0x990F0000u, 55u}, // pig -> Latn
-    {0x9D0F0000u, 55u}, // pih -> Latn
-    {0xA50F0000u, 55u}, // pij -> Latn
-    {0xAD0F0000u, 55u}, // pil -> Latn
-    {0xB10F0000u, 55u}, // pim -> Latn
-    {0xB50F0000u, 55u}, // pin -> Latn
-    {0xB90F0000u, 55u}, // pio -> Latn
-    {0xBD0F0000u, 55u}, // pip -> Latn
-    {0xC50F0000u, 55u}, // pir -> Latn
-    {0xC90F0000u, 55u}, // pis -> Latn
-    {0xCD0F0000u, 55u}, // pit -> Latn
-    {0xD10F0000u, 55u}, // piu -> Latn
-    {0xD50F0000u, 55u}, // piv -> Latn
-    {0xD90F0000u, 55u}, // piw -> Latn
-    {0xDD0F0000u, 55u}, // pix -> Latn
-    {0xE10F0000u, 55u}, // piy -> Latn
-    {0xE50F0000u, 55u}, // piz -> Latn
-    {0xCD2F0000u, 55u}, // pjt -> Latn
-    {0x814F0000u, 11u}, // pka -> Brah
-    {0x854F0000u, 55u}, // pkb -> Latn
-    {0x994F0000u, 55u}, // pkg -> Latn
-    {0x9D4F0000u, 55u}, // pkh -> Latn
-    {0xB54F0000u, 55u}, // pkn -> Latn
-    {0xB94F0000u, 55u}, // pko -> Latn
-    {0xBD4F0000u, 55u}, // pkp -> Latn
-    {0xC54F0000u, 67u}, // pkr -> Mlym
-    {0xD14F0000u, 55u}, // pku -> Latn
-    {0x706C0000u, 55u}, // pl -> Latn
-    {0x816F0000u, 55u}, // pla -> Latn
-    {0x856F0000u, 55u}, // plb -> Latn
-    {0x896F0000u, 55u}, // plc -> Latn
-    {0x8D6F0000u, 55u}, // pld -> Latn
-    {0x916F0000u, 55u}, // ple -> Latn
-    {0x996F0000u, 55u}, // plg -> Latn
-    {0x9D6F0000u, 55u}, // plh -> Latn
-    {0xA96F0000u,  2u}, // plk -> Arab
-    {0xAD6F0000u, 72u}, // pll -> Mymr
-    {0xB56F0000u, 55u}, // pln -> Latn
-    {0xB96F0000u, 55u}, // plo -> Latn
-    {0xC56F0000u, 55u}, // plr -> Latn
-    {0xC96F0000u, 55u}, // pls -> Latn
-    {0xD16F0000u, 55u}, // plu -> Latn
-    {0xD56F0000u, 55u}, // plv -> Latn
-    {0xD96F0000u, 55u}, // plw -> Latn
-    {0xE56F0000u, 55u}, // plz -> Latn
-    {0x818F0000u, 55u}, // pma -> Latn
-    {0x858F0000u, 55u}, // pmb -> Latn
-    {0x8D8F0000u, 55u}, // pmd -> Latn
-    {0x918F0000u, 55u}, // pme -> Latn
-    {0x958F0000u, 55u}, // pmf -> Latn
-    {0x9D8F0000u, 11u}, // pmh -> Brah
-    {0xA18F0000u, 55u}, // pmi -> Latn
-    {0xA58F0000u, 55u}, // pmj -> Latn
-    {0xAD8F0000u, 55u}, // pml -> Latn
-    {0xB18F0000u, 55u}, // pmm -> Latn
-    {0xB58F0000u, 55u}, // pmn -> Latn
-    {0xB98F0000u, 55u}, // pmo -> Latn
-    {0xC18F0000u, 55u}, // pmq -> Latn
-    {0xC58F0000u, 55u}, // pmr -> Latn
-    {0xC98F0000u, 55u}, // pms -> Latn
-    {0xCD8F0000u, 55u}, // pmt -> Latn
-    {0xD98F0000u, 55u}, // pmw -> Latn
-    {0xDD8F0000u, 55u}, // pmx -> Latn
-    {0xE18F0000u, 55u}, // pmy -> Latn
-    {0xE58F0000u, 55u}, // pmz -> Latn
-    {0x81AF0000u, 55u}, // pna -> Latn
-    {0x89AF0000u, 55u}, // pnc -> Latn
-    {0x8DAF0000u, 55u}, // pnd -> Latn
-    {0x91AF0000u, 55u}, // pne -> Latn
-    {0x99AF0000u, 55u}, // png -> Latn
-    {0x9DAF0000u, 55u}, // pnh -> Latn
-    {0xA1AF0000u, 55u}, // pni -> Latn
-    {0xA5AF0000u, 55u}, // pnj -> Latn
-    {0xA9AF0000u, 55u}, // pnk -> Latn
-    {0xADAF0000u, 55u}, // pnl -> Latn
-    {0xB1AF0000u, 55u}, // pnm -> Latn
-    {0xB5AF0000u, 55u}, // pnn -> Latn
-    {0xB9AF0000u, 55u}, // pno -> Latn
-    {0xBDAF0000u, 55u}, // pnp -> Latn
-    {0xC1AF0000u, 55u}, // pnq -> Latn
-    {0xC5AF0000u, 55u}, // pnr -> Latn
-    {0xC9AF0000u, 55u}, // pns -> Latn
-    {0xCDAF0000u, 30u}, // pnt -> Grek
-    {0xD5AF0000u, 55u}, // pnv -> Latn
-    {0xD9AF0000u, 55u}, // pnw -> Latn
-    {0xE1AF0000u, 55u}, // pny -> Latn
-    {0xE5AF0000u, 55u}, // pnz -> Latn
-    {0x89CF0000u, 55u}, // poc -> Latn
-    {0x91CF0000u, 55u}, // poe -> Latn
-    {0x95CF0000u, 55u}, // pof -> Latn
-    {0x99CF0000u, 55u}, // pog -> Latn
-    {0x9DCF0000u, 55u}, // poh -> Latn
-    {0xA1CF0000u, 55u}, // poi -> Latn
-    {0xA9CF0000u, 55u}, // pok -> Latn
-    {0xB1CF0000u, 55u}, // pom -> Latn
-    {0xB5CF0000u, 55u}, // pon -> Latn
-    {0xB9CF0000u, 55u}, // poo -> Latn
-    {0xBDCF0000u, 55u}, // pop -> Latn
-    {0xC1CF0000u, 55u}, // poq -> Latn
-    {0xC9CF0000u, 55u}, // pos -> Latn
-    {0xCDCF0000u, 55u}, // pot -> Latn
-    {0xD5CF0000u, 55u}, // pov -> Latn
-    {0xD9CF0000u, 55u}, // pow -> Latn
-    {0xE1CF0000u, 55u}, // poy -> Latn
-    {0x91EF0000u, 55u}, // ppe -> Latn
-    {0xA1EF0000u, 55u}, // ppi -> Latn
-    {0xA9EF0000u, 55u}, // ppk -> Latn
-    {0xADEF0000u, 55u}, // ppl -> Latn
-    {0xB1EF0000u, 55u}, // ppm -> Latn
-    {0xB5EF0000u, 55u}, // ppn -> Latn
-    {0xB9EF0000u, 55u}, // ppo -> Latn
-    {0xBDEF0000u, 55u}, // ppp -> Latn
-    {0xC1EF0000u, 55u}, // ppq -> Latn
-    {0xC9EF0000u, 55u}, // pps -> Latn
-    {0xCDEF0000u, 55u}, // ppt -> Latn
-    {0x820F0000u, 55u}, // pqa -> Latn
-    {0xB20F0000u, 55u}, // pqm -> Latn
-    {0x822F0000u, 46u}, // pra -> Khar
-    {0x8A2F0000u,  2u}, // prc -> Arab
-    {0x8E2F0000u,  2u}, // prd -> Arab
-    {0x922F0000u, 55u}, // pre -> Latn
-    {0x962F0000u, 55u}, // prf -> Latn
-    {0x9A2F0000u, 55u}, // prg -> Latn
-    {0x9E2F0000u, 55u}, // prh -> Latn
-    {0xA22F0000u, 55u}, // pri -> Latn
-    {0xAA2F0000u, 55u}, // prk -> Latn
-    {0xB22F0000u, 55u}, // prm -> Latn
-    {0xBA2F0000u, 55u}, // pro -> Latn
-    {0xC22F0000u, 55u}, // prq -> Latn
-    {0xC62F0000u, 55u}, // prr -> Latn
-    {0xCE2F0000u, 111u}, // prt -> Thai
-    {0xD22F0000u, 55u}, // pru -> Latn
-    {0xDA2F0000u, 55u}, // prw -> Latn
-    {0xDE2F0000u,  2u}, // prx -> Arab
-    {0x70730000u,  2u}, // ps -> Arab
-    {0x824F0000u, 55u}, // psa -> Latn
-    {0x924F0000u, 55u}, // pse -> Latn
-    {0x9E4F0000u,  2u}, // psh -> Arab
-    {0xA24F0000u,  2u}, // psi -> Arab
-    {0xB24F0000u, 55u}, // psm -> Latn
-    {0xB64F0000u, 55u}, // psn -> Latn
-    {0xC24F0000u, 55u}, // psq -> Latn
-    {0xCA4F0000u, 55u}, // pss -> Latn
-    {0xCE4F0000u,  2u}, // pst -> Arab
-    {0xD24F0000u, 11u}, // psu -> Brah
-    {0xDA4F0000u, 55u}, // psw -> Latn
-    {0x70740000u, 55u}, // pt -> Latn
-    {0x826F0000u, 55u}, // pta -> Latn
-    {0x9E6F0000u, 55u}, // pth -> Latn
-    {0xA26F0000u, 55u}, // pti -> Latn
-    {0xB66F0000u, 55u}, // ptn -> Latn
-    {0xBA6F0000u, 55u}, // pto -> Latn
-    {0xBE6F0000u, 55u}, // ptp -> Latn
-    {0xC66F0000u, 55u}, // ptr -> Latn
-    {0xCE6F0000u, 55u}, // ptt -> Latn
-    {0xD26F0000u, 55u}, // ptu -> Latn
-    {0xD66F0000u, 55u}, // ptv -> Latn
-    {0x828F0000u, 55u}, // pua -> Latn
-    {0x868F0000u, 55u}, // pub -> Latn
-    {0x8A8F0000u, 55u}, // puc -> Latn
-    {0x8E8F0000u, 55u}, // pud -> Latn
-    {0x928F0000u, 55u}, // pue -> Latn
-    {0x968F0000u, 55u}, // puf -> Latn
-    {0x9A8F0000u, 55u}, // pug -> Latn
-    {0xA28F0000u, 55u}, // pui -> Latn
-    {0xA68F0000u, 55u}, // puj -> Latn
-    {0xB28F0000u, 21u}, // pum -> Deva
-    {0xBA8F0000u, 55u}, // puo -> Latn
-    {0xBE8F0000u, 55u}, // pup -> Latn
-    {0xC28F0000u, 55u}, // puq -> Latn
-    {0xC68F0000u, 55u}, // pur -> Latn
-    {0xCE8F0000u, 55u}, // put -> Latn
-    {0xD28F0000u, 55u}, // puu -> Latn
-    {0xDA8F0000u, 55u}, // puw -> Latn
-    {0xDE8F0000u, 55u}, // pux -> Latn
-    {0xE28F0000u, 55u}, // puy -> Latn
-    {0x82CF0000u, 55u}, // pwa -> Latn
-    {0x86CF0000u, 55u}, // pwb -> Latn
-    {0x9ACF0000u, 55u}, // pwg -> Latn
-    {0xB2CF0000u, 55u}, // pwm -> Latn
-    {0xB6CF0000u, 55u}, // pwn -> Latn
-    {0xBACF0000u, 72u}, // pwo -> Mymr
-    {0xC6CF0000u, 21u}, // pwr -> Deva
-    {0xDACF0000u, 111u}, // pww -> Thai
-    {0xB2EF0000u, 55u}, // pxm -> Latn
-    {0x930F0000u, 55u}, // pye -> Latn
-    {0xB30F0000u, 55u}, // pym -> Latn
-    {0xB70F0000u, 55u}, // pyn -> Latn
-    {0xD30F0000u, 55u}, // pyu -> Latn
-    {0xDF0F0000u, 72u}, // pyx -> Mymr
-    {0xE30F0000u, 55u}, // pyy -> Latn
-    {0x932F0000u, 55u}, // pze -> Latn
-    {0x9F2F0000u, 55u}, // pzh -> Latn
-    {0xB72F0000u, 55u}, // pzn -> Latn
-    {0x71750000u, 55u}, // qu -> Latn
-    {0x82900000u, 55u}, // qua -> Latn
-    {0x86900000u, 55u}, // qub -> Latn
-    {0x8A900000u, 55u}, // quc -> Latn
-    {0x8E900000u, 55u}, // qud -> Latn
-    {0x96900000u, 55u}, // quf -> Latn
-    {0x9A900000u, 55u}, // qug -> Latn
-    {0xA2900000u, 55u}, // qui -> Latn
-    {0xAA900000u, 55u}, // quk -> Latn
-    {0xAE900000u, 55u}, // qul -> Latn
-    {0xB2900000u, 55u}, // qum -> Latn
-    {0xB6900000u, 55u}, // qun -> Latn
-    {0xBE900000u, 55u}, // qup -> Latn
-    {0xC2900000u, 55u}, // quq -> Latn
-    {0xC6900000u, 55u}, // qur -> Latn
-    {0xCA900000u, 55u}, // qus -> Latn
-    {0xD6900000u, 55u}, // quv -> Latn
-    {0xDA900000u, 55u}, // quw -> Latn
-    {0xDE900000u, 55u}, // qux -> Latn
-    {0xE2900000u, 55u}, // quy -> Latn
-    {0x82B00000u, 55u}, // qva -> Latn
-    {0x8AB00000u, 55u}, // qvc -> Latn
-    {0x92B00000u, 55u}, // qve -> Latn
-    {0x9EB00000u, 55u}, // qvh -> Latn
-    {0xA2B00000u, 55u}, // qvi -> Latn
-    {0xA6B00000u, 55u}, // qvj -> Latn
-    {0xAEB00000u, 55u}, // qvl -> Latn
-    {0xB2B00000u, 55u}, // qvm -> Latn
-    {0xB6B00000u, 55u}, // qvn -> Latn
-    {0xBAB00000u, 55u}, // qvo -> Latn
-    {0xBEB00000u, 55u}, // qvp -> Latn
-    {0xCAB00000u, 55u}, // qvs -> Latn
-    {0xDAB00000u, 55u}, // qvw -> Latn
-    {0xE6B00000u, 55u}, // qvz -> Latn
-    {0x82D00000u, 55u}, // qwa -> Latn
-    {0x8AD00000u, 55u}, // qwc -> Latn
-    {0x9ED00000u, 55u}, // qwh -> Latn
-    {0xB2D00000u, 55u}, // qwm -> Latn
-    {0xCAD00000u, 55u}, // qws -> Latn
-    {0xCED00000u, 55u}, // qwt -> Latn
-    {0x82F00000u, 55u}, // qxa -> Latn
-    {0x8AF00000u, 55u}, // qxc -> Latn
-    {0x9EF00000u, 55u}, // qxh -> Latn
-    {0xAEF00000u, 55u}, // qxl -> Latn
-    {0xB6F00000u, 55u}, // qxn -> Latn
-    {0xBAF00000u, 55u}, // qxo -> Latn
-    {0xBEF00000u, 55u}, // qxp -> Latn
-    {0xC2F00000u,  2u}, // qxq -> Arab
-    {0xC6F00000u, 55u}, // qxr -> Latn
-    {0xCEF00000u, 55u}, // qxt -> Latn
-    {0xD2F00000u, 55u}, // qxu -> Latn
-    {0xDAF00000u, 55u}, // qxw -> Latn
-    {0x83100000u, 55u}, // qya -> Latn
-    {0xBF100000u, 55u}, // qyp -> Latn
-    {0x80110000u, 21u}, // raa -> Deva
-    {0x84110000u, 21u}, // rab -> Deva
-    {0x88110000u, 55u}, // rac -> Latn
-    {0x8C110000u, 55u}, // rad -> Latn
-    {0x94110000u, 21u}, // raf -> Deva
-    {0x98110000u, 55u}, // rag -> Latn
-    {0x9C110000u,  9u}, // rah -> Beng
-    {0xA0110000u, 55u}, // rai -> Latn
-    {0xA4110000u, 21u}, // raj -> Deva
-    {0xA8110000u, 55u}, // rak -> Latn
-    {0xB0110000u, 55u}, // ram -> Latn
-    {0xB4110000u, 55u}, // ran -> Latn
-    {0xB8110000u, 55u}, // rao -> Latn
-    {0xBC110000u, 55u}, // rap -> Latn
-    {0xC4110000u, 55u}, // rar -> Latn
-    {0xD4110000u, 21u}, // rav -> Deva
-    {0xD8110000u, 55u}, // raw -> Latn
-    {0xDC110000u, 55u}, // rax -> Latn
-    {0xE0110000u, 55u}, // ray -> Latn
-    {0xE4110000u, 55u}, // raz -> Latn
-    {0x84310000u, 72u}, // rbb -> Mymr
-    {0xA8310000u, 55u}, // rbk -> Latn
-    {0xAC310000u, 55u}, // rbl -> Latn
-    {0xBC310000u, 55u}, // rbp -> Latn
-    {0x94510000u, 55u}, // rcf -> Latn
-    {0x84710000u,  2u}, // rdb -> Arab
-    {0x80910000u, 55u}, // rea -> Latn
-    {0x84910000u, 55u}, // reb -> Latn
-    {0x90910000u, 55u}, // ree -> Latn
-    {0x98910000u, 55u}, // reg -> Latn
-    {0xA0910000u, 80u}, // rei -> Orya
-    {0xA4910000u, 55u}, // rej -> Latn
-    {0xAC910000u, 55u}, // rel -> Latn
-    {0xB0910000u, 55u}, // rem -> Latn
-    {0xB4910000u, 55u}, // ren -> Latn
-    {0xC8910000u, 55u}, // res -> Latn
-    {0xCC910000u, 55u}, // ret -> Latn
-    {0xE0910000u, 55u}, // rey -> Latn
-    {0x80D10000u, 55u}, // rga -> Latn
-    {0xB4D10000u, 55u}, // rgn -> Latn
-    {0xC4D10000u, 55u}, // rgr -> Latn
-    {0xC8D10000u, 55u}, // rgs -> Latn
-    {0xD0D10000u, 55u}, // rgu -> Latn
-    {0x98F10000u, 89u}, // rhg -> Rohg
-    {0xBCF10000u, 55u}, // rhp -> Latn
-    {0x81110000u, 55u}, // ria -> Latn
-    {0x95110000u, 55u}, // rif -> Latn
-    {0xAD110000u, 55u}, // ril -> Latn
-    {0xB1110000u, 55u}, // rim -> Latn
-    {0xB5110000u, 55u}, // rin -> Latn
-    {0xC5110000u, 55u}, // rir -> Latn
-    {0xCD110000u, 55u}, // rit -> Latn
-    {0xD1110000u, 55u}, // riu -> Latn
-    {0x99310000u, 55u}, // rjg -> Latn
-    {0xA1310000u, 21u}, // rji -> Deva
-    {0xC9310000u, 21u}, // rjs -> Deva
-    {0x81510000u, 47u}, // rka -> Khmr
-    {0x85510000u, 55u}, // rkb -> Latn
-    {0x9D510000u, 55u}, // rkh -> Latn
-    {0xA1510000u, 72u}, // rki -> Mymr
-    {0xB1510000u, 55u}, // rkm -> Latn
-    {0xCD510000u,  9u}, // rkt -> Beng
-    {0xD9510000u, 55u}, // rkw -> Latn
-    {0x726D0000u, 55u}, // rm -> Latn
-    {0x81910000u, 55u}, // rma -> Latn
-    {0x85910000u, 55u}, // rmb -> Latn
-    {0x89910000u, 55u}, // rmc -> Latn
-    {0x8D910000u, 55u}, // rmd -> Latn
-    {0x91910000u, 55u}, // rme -> Latn
-    {0x95910000u, 55u}, // rmf -> Latn
-    {0x99910000u, 55u}, // rmg -> Latn
-    {0x9D910000u, 55u}, // rmh -> Latn
-    {0xA1910000u,  4u}, // rmi -> Armn
-    {0xA9910000u, 55u}, // rmk -> Latn
-    {0xAD910000u, 55u}, // rml -> Latn
-    {0xB1910000u, 55u}, // rmm -> Latn
-    {0xB5910000u, 55u}, // rmn -> Latn
-    {0xB9910000u, 55u}, // rmo -> Latn
-    {0xBD910000u, 55u}, // rmp -> Latn
-    {0xC1910000u, 55u}, // rmq -> Latn
-    {0xCD910000u,  2u}, // rmt -> Arab
-    {0xD1910000u, 55u}, // rmu -> Latn
-    {0xD9910000u, 55u}, // rmw -> Latn
-    {0xDD910000u, 55u}, // rmx -> Latn
-    {0xE5910000u, 72u}, // rmz -> Mymr
-    {0x726E0000u, 55u}, // rn -> Latn
-    {0x8DB10000u, 55u}, // rnd -> Latn
-    {0x99B10000u, 55u}, // rng -> Latn
-    {0xADB10000u, 55u}, // rnl -> Latn
-    {0xB5B10000u, 55u}, // rnn -> Latn
-    {0xC5B10000u, 55u}, // rnr -> Latn
-    {0xD9B10000u, 55u}, // rnw -> Latn
-    {0x726F0000u, 55u}, // ro -> Latn
-    {0x85D10000u, 55u}, // rob -> Latn
-    {0x89D10000u, 55u}, // roc -> Latn
-    {0x8DD10000u, 55u}, // rod -> Latn
-    {0x91D10000u, 55u}, // roe -> Latn
-    {0x95D10000u, 55u}, // rof -> Latn
-    {0x99D10000u, 55u}, // rog -> Latn
-    {0xADD10000u, 55u}, // rol -> Latn
-    {0xB1D10000u, 55u}, // rom -> Latn
-    {0xB9D10000u, 55u}, // roo -> Latn
-    {0xBDD10000u, 55u}, // rop -> Latn
-    {0xC5D10000u, 55u}, // ror -> Latn
-    {0xD1D10000u, 55u}, // rou -> Latn
-    {0xD9D10000u, 55u}, // row -> Latn
-    {0xB5F10000u, 55u}, // rpn -> Latn
-    {0xCDF10000u, 55u}, // rpt -> Latn
-    {0xA2310000u, 55u}, // rri -> Latn
-    {0xB2310000u, 55u}, // rrm -> Latn
-    {0xBA310000u, 55u}, // rro -> Latn
-    {0xCE310000u, 55u}, // rrt -> Latn
-    {0xAA510000u, 20u}, // rsk -> Cyrl
-    {0xDA510000u, 55u}, // rsw -> Latn
-    {0x8A710000u, 55u}, // rtc -> Latn
-    {0x9E710000u, 55u}, // rth -> Latn
-    {0xB2710000u, 55u}, // rtm -> Latn
-    {0xDA710000u, 21u}, // rtw -> Deva
-    {0x72750000u, 20u}, // ru -> Cyrl
-    {0x86910000u, 55u}, // rub -> Latn
-    {0x8A910000u, 55u}, // ruc -> Latn
-    {0x92910000u, 20u}, // rue -> Cyrl
-    {0x96910000u, 55u}, // ruf -> Latn
-    {0x9A910000u, 55u}, // rug -> Latn
-    {0xA2910000u, 55u}, // rui -> Latn
-    {0xAA910000u, 55u}, // ruk -> Latn
-    {0xBA910000u, 55u}, // ruo -> Latn
-    {0xBE910000u, 55u}, // rup -> Latn
-    {0xC2910000u, 55u}, // ruq -> Latn
-    {0xCE910000u, 20u}, // rut -> Cyrl
-    {0xD2910000u, 55u}, // ruu -> Latn
-    {0xE2910000u, 55u}, // ruy -> Latn
-    {0xE6910000u, 55u}, // ruz -> Latn
-    {0x72770000u, 55u}, // rw -> Latn
-    {0x82D10000u, 55u}, // rwa -> Latn
-    {0xAAD10000u, 55u}, // rwk -> Latn
-    {0xAED10000u, 55u}, // rwl -> Latn
-    {0xB2D10000u, 55u}, // rwm -> Latn
-    {0xBAD10000u, 55u}, // rwo -> Latn
-    {0xC6D10000u, 21u}, // rwr -> Deva
-    {0x8EF10000u, 55u}, // rxd -> Latn
-    {0xDAF10000u, 55u}, // rxw -> Latn
-    {0xD3110000u, 44u}, // ryu -> Kana
-    {0x73610000u, 21u}, // sa -> Deva
-    {0x80120000u, 55u}, // saa -> Latn
-    {0x84120000u, 55u}, // sab -> Latn
-    {0x88120000u, 55u}, // sac -> Latn
-    {0x8C120000u, 55u}, // sad -> Latn
-    {0x90120000u, 55u}, // sae -> Latn
-    {0x94120000u, 55u}, // saf -> Latn
-    {0x9C120000u, 20u}, // sah -> Cyrl
-    {0xA4120000u, 55u}, // saj -> Latn
-    {0xA8120000u, 55u}, // sak -> Latn
-    {0xB0120000u, 91u}, // sam -> Samr
-    {0xB8120000u, 55u}, // sao -> Latn
-    {0xC0120000u, 55u}, // saq -> Latn
-    {0xC4120000u, 55u}, // sar -> Latn
-    {0xC8120000u, 55u}, // sas -> Latn
-    {0xCC120000u, 78u}, // sat -> Olck
-    {0xD0120000u, 55u}, // sau -> Latn
-    {0xD4120000u, 55u}, // sav -> Latn
-    {0xD8120000u, 55u}, // saw -> Latn
-    {0xDC120000u, 55u}, // sax -> Latn
-    {0xE0120000u, 55u}, // say -> Latn
-    {0xE4120000u, 93u}, // saz -> Saur
-    {0x80320000u, 55u}, // sba -> Latn
-    {0x84320000u, 55u}, // sbb -> Latn
-    {0x88320000u, 55u}, // sbc -> Latn
-    {0x8C320000u, 55u}, // sbd -> Latn
-    {0x90320000u, 55u}, // sbe -> Latn
-    {0x98320000u, 55u}, // sbg -> Latn
-    {0x9C320000u, 55u}, // sbh -> Latn
-    {0xA0320000u, 55u}, // sbi -> Latn
-    {0xA4320000u, 55u}, // sbj -> Latn
-    {0xA8320000u, 55u}, // sbk -> Latn
-    {0xAC320000u, 55u}, // sbl -> Latn
-    {0xB0320000u, 55u}, // sbm -> Latn
-    {0xB4320000u,  2u}, // sbn -> Arab
-    {0xB8320000u, 55u}, // sbo -> Latn
-    {0xBC320000u, 55u}, // sbp -> Latn
-    {0xC0320000u, 55u}, // sbq -> Latn
-    {0xC4320000u, 55u}, // sbr -> Latn
-    {0xC8320000u, 55u}, // sbs -> Latn
-    {0xCC320000u, 55u}, // sbt -> Latn
-    {0xD0320000u, 112u}, // sbu -> Tibt
-    {0xD4320000u, 55u}, // sbv -> Latn
-    {0xD8320000u, 55u}, // sbw -> Latn
-    {0xDC320000u, 55u}, // sbx -> Latn
-    {0xE0320000u, 55u}, // sby -> Latn
-    {0xE4320000u, 55u}, // sbz -> Latn
-    {0x73630000u, 55u}, // sc -> Latn
-    {0x84520000u, 55u}, // scb -> Latn
-    {0x90520000u, 55u}, // sce -> Latn
-    {0x94520000u, 55u}, // scf -> Latn
-    {0x98520000u, 55u}, // scg -> Latn
-    {0x9C520000u, 55u}, // sch -> Latn
-    {0xA0520000u, 55u}, // sci -> Latn
-    {0xA8520000u, 21u}, // sck -> Deva
-    {0xAC520000u,  2u}, // scl -> Arab
-    {0xB4520000u, 55u}, // scn -> Latn
-    {0xB8520000u, 55u}, // sco -> Latn
-    {0xBC520000u, 21u}, // scp -> Deva
-    {0xC8520000u, 55u}, // scs -> Latn
-    {0xCC520000u, 52u}, // sct -> Laoo
-    {0xD0520000u, 102u}, // scu -> Takr
-    {0xD4520000u, 55u}, // scv -> Latn
-    {0xD8520000u, 55u}, // scw -> Latn
-    {0xDC520000u, 30u}, // scx -> Grek
-    {0x73640000u,  2u}, // sd -> Arab
-    {0x7364494Eu, 21u}, // sd-IN -> Deva
-    {0x80720000u, 55u}, // sda -> Latn
-    {0x84720000u,  2u}, // sdb -> Arab
-    {0x88720000u, 55u}, // sdc -> Latn
-    {0x90720000u, 55u}, // sde -> Latn
-    {0x94720000u,  2u}, // sdf -> Arab
-    {0x98720000u,  2u}, // sdg -> Arab
-    {0x9C720000u,  2u}, // sdh -> Arab
-    {0xA4720000u, 55u}, // sdj -> Latn
-    {0xA8720000u, 55u}, // sdk -> Latn
-    {0xB4720000u, 55u}, // sdn -> Latn
-    {0xB8720000u, 55u}, // sdo -> Latn
-    {0xC0720000u, 55u}, // sdq -> Latn
-    {0xC4720000u,  9u}, // sdr -> Beng
-    {0xC8720000u,  2u}, // sds -> Arab
-    {0xD0720000u, 55u}, // sdu -> Latn
-    {0xDC720000u, 55u}, // sdx -> Latn
-    {0x73650000u, 55u}, // se -> Latn
-    {0x80920000u, 55u}, // sea -> Latn
-    {0x84920000u, 55u}, // seb -> Latn
-    {0x88920000u, 55u}, // sec -> Latn
-    {0x8C920000u, 55u}, // sed -> Latn
-    {0x90920000u, 55u}, // see -> Latn
-    {0x94920000u, 55u}, // sef -> Latn
-    {0x98920000u, 55u}, // seg -> Latn
-    {0x9C920000u, 55u}, // seh -> Latn
-    {0xA0920000u, 55u}, // sei -> Latn
-    {0xA4920000u, 55u}, // sej -> Latn
-    {0xA8920000u, 55u}, // sek -> Latn
-    {0xAC920000u, 20u}, // sel -> Cyrl
-    {0xB4920000u, 55u}, // sen -> Latn
-    {0xB8920000u, 55u}, // seo -> Latn
-    {0xBC920000u, 55u}, // sep -> Latn
-    {0xC0920000u, 55u}, // seq -> Latn
-    {0xC4920000u, 55u}, // ser -> Latn
-    {0xC8920000u, 55u}, // ses -> Latn
-    {0xCC920000u, 55u}, // set -> Latn
-    {0xD0920000u, 55u}, // seu -> Latn
-    {0xD4920000u, 55u}, // sev -> Latn
-    {0xD8920000u, 55u}, // sew -> Latn
-    {0xE0920000u, 55u}, // sey -> Latn
-    {0xE4920000u, 55u}, // sez -> Latn
-    {0x90B20000u, 55u}, // sfe -> Latn
-    {0xB0B20000u, 86u}, // sfm -> Plrd
-    {0xD8B20000u, 55u}, // sfw -> Latn
-    {0x73670000u, 55u}, // sg -> Latn
-    {0x80D20000u, 77u}, // sga -> Ogam
-    {0x84D20000u, 55u}, // sgb -> Latn
-    {0x88D20000u, 55u}, // sgc -> Latn
-    {0x8CD20000u, 55u}, // sgd -> Latn
-    {0x90D20000u, 55u}, // sge -> Latn
-    {0x9CD20000u, 20u}, // sgh -> Cyrl
-    {0xA0D20000u, 55u}, // sgi -> Latn
-    {0xA4D20000u, 21u}, // sgj -> Deva
-    {0xB0D20000u, 55u}, // sgm -> Latn
-    {0xBCD20000u, 55u}, // sgp -> Latn
-    {0xC4D20000u,  2u}, // sgr -> Arab
-    {0xC8D20000u, 55u}, // sgs -> Latn
-    {0xCCD20000u, 112u}, // sgt -> Tibt
-    {0xD0D20000u, 55u}, // sgu -> Latn
-    {0xD8D20000u, 24u}, // sgw -> Ethi
-    {0xE0D20000u,  2u}, // sgy -> Arab
-    {0xE4D20000u, 55u}, // sgz -> Latn
-    {0x80F20000u, 55u}, // sha -> Latn
-    {0x84F20000u, 55u}, // shb -> Latn
-    {0x88F20000u, 55u}, // shc -> Latn
-    {0x8CF20000u,  2u}, // shd -> Arab
-    {0x90F20000u, 55u}, // she -> Latn
-    {0x98F20000u, 55u}, // shg -> Latn
-    {0x9CF20000u, 55u}, // shh -> Latn
-    {0xA0F20000u, 109u}, // shi -> Tfng
-    {0xA4F20000u, 55u}, // shj -> Latn
-    {0xA8F20000u, 55u}, // shk -> Latn
-    {0xB0F20000u,  2u}, // shm -> Arab
-    {0xB4F20000u, 72u}, // shn -> Mymr
-    {0xB8F20000u, 55u}, // sho -> Latn
-    {0xBCF20000u, 55u}, // shp -> Latn
-    {0xC0F20000u, 55u}, // shq -> Latn
-    {0xC4F20000u, 55u}, // shr -> Latn
-    {0xC8F20000u, 55u}, // shs -> Latn
-    {0xCCF20000u, 55u}, // sht -> Latn
-    {0xD0F20000u,  2u}, // shu -> Arab
-    {0xD4F20000u,  2u}, // shv -> Arab
-    {0xD8F20000u, 55u}, // shw -> Latn
-    {0xE0F20000u, 55u}, // shy -> Latn
-    {0xE4F20000u, 55u}, // shz -> Latn
-    {0x73690000u, 95u}, // si -> Sinh
-    {0x81120000u, 20u}, // sia -> Cyrl
-    {0x85120000u, 55u}, // sib -> Latn
-    {0x8D120000u, 55u}, // sid -> Latn
-    {0x91120000u, 55u}, // sie -> Latn
-    {0x95120000u, 55u}, // sif -> Latn
-    {0x99120000u, 55u}, // sig -> Latn
-    {0x9D120000u, 55u}, // sih -> Latn
-    {0xA1120000u, 55u}, // sii -> Latn
-    {0xA5120000u, 55u}, // sij -> Latn
-    {0xA9120000u, 55u}, // sik -> Latn
-    {0xAD120000u, 55u}, // sil -> Latn
-    {0xB1120000u, 55u}, // sim -> Latn
-    {0xBD120000u, 112u}, // sip -> Tibt
-    {0xC1120000u, 55u}, // siq -> Latn
-    {0xC5120000u, 55u}, // sir -> Latn
-    {0xC9120000u, 55u}, // sis -> Latn
-    {0xD1120000u, 55u}, // siu -> Latn
-    {0xD5120000u, 55u}, // siv -> Latn
-    {0xD9120000u, 55u}, // siw -> Latn
-    {0xDD120000u, 55u}, // six -> Latn
-    {0xE1120000u,  2u}, // siy -> Arab
-    {0xE5120000u,  2u}, // siz -> Arab
-    {0x81320000u, 55u}, // sja -> Latn
-    {0x85320000u, 55u}, // sjb -> Latn
-    {0x8D320000u, 20u}, // sjd -> Cyrl
-    {0x91320000u, 55u}, // sje -> Latn
-    {0x99320000u, 55u}, // sjg -> Latn
-    {0xAD320000u, 55u}, // sjl -> Latn
-    {0xB1320000u, 55u}, // sjm -> Latn
-    {0xBD320000u, 21u}, // sjp -> Deva
-    {0xC5320000u, 55u}, // sjr -> Latn
-    {0xCD320000u, 20u}, // sjt -> Cyrl
-    {0xD1320000u, 55u}, // sju -> Latn
-    {0xD9320000u, 55u}, // sjw -> Latn
-    {0x736B0000u, 55u}, // sk -> Latn
-    {0x81520000u, 55u}, // ska -> Latn
-    {0x85520000u, 111u}, // skb -> Thai
-    {0x89520000u, 55u}, // skc -> Latn
-    {0x8D520000u, 55u}, // skd -> Latn
-    {0x91520000u, 55u}, // ske -> Latn
-    {0x95520000u, 55u}, // skf -> Latn
-    {0x99520000u, 55u}, // skg -> Latn
-    {0x9D520000u, 55u}, // skh -> Latn
-    {0xA1520000u, 55u}, // ski -> Latn
-    {0xA5520000u, 21u}, // skj -> Deva
-    {0xB1520000u, 55u}, // skm -> Latn
-    {0xB5520000u, 55u}, // skn -> Latn
-    {0xB9520000u, 55u}, // sko -> Latn
-    {0xBD520000u, 55u}, // skp -> Latn
-    {0xC1520000u, 55u}, // skq -> Latn
-    {0xC5520000u,  2u}, // skr -> Arab
-    {0xC9520000u, 55u}, // sks -> Latn
-    {0xCD520000u, 55u}, // skt -> Latn
-    {0xD1520000u, 55u}, // sku -> Latn
-    {0xD5520000u, 55u}, // skv -> Latn
-    {0xD9520000u, 55u}, // skw -> Latn
-    {0xDD520000u, 55u}, // skx -> Latn
-    {0xE1520000u, 55u}, // sky -> Latn
-    {0xE5520000u, 55u}, // skz -> Latn
-    {0x736C0000u, 55u}, // sl -> Latn
-    {0x89720000u, 55u}, // slc -> Latn
-    {0x8D720000u, 55u}, // sld -> Latn
-    {0x99720000u, 55u}, // slg -> Latn
-    {0x9D720000u, 55u}, // slh -> Latn
-    {0xA1720000u, 55u}, // sli -> Latn
-    {0xA5720000u, 55u}, // slj -> Latn
-    {0xAD720000u, 55u}, // sll -> Latn
-    {0xB1720000u, 55u}, // slm -> Latn
-    {0xB5720000u, 55u}, // sln -> Latn
-    {0xBD720000u, 55u}, // slp -> Latn
-    {0xC5720000u, 55u}, // slr -> Latn
-    {0xD1720000u, 55u}, // slu -> Latn
-    {0xD9720000u, 55u}, // slw -> Latn
-    {0xDD720000u, 55u}, // slx -> Latn
-    {0xE1720000u, 55u}, // sly -> Latn
-    {0xE5720000u, 55u}, // slz -> Latn
-    {0x736D0000u, 55u}, // sm -> Latn
-    {0x81920000u, 55u}, // sma -> Latn
-    {0x85920000u, 55u}, // smb -> Latn
-    {0x89920000u, 55u}, // smc -> Latn
-    {0x95920000u, 55u}, // smf -> Latn
-    {0x99920000u, 55u}, // smg -> Latn
-    {0x9D920000u, 120u}, // smh -> Yiii
-    {0xA5920000u, 55u}, // smj -> Latn
-    {0xA9920000u, 55u}, // smk -> Latn
-    {0xAD920000u, 55u}, // sml -> Latn
-    {0xB5920000u, 55u}, // smn -> Latn
-    {0xBD920000u, 91u}, // smp -> Samr
-    {0xC1920000u, 55u}, // smq -> Latn
-    {0xC5920000u, 55u}, // smr -> Latn
-    {0xC9920000u, 55u}, // sms -> Latn
-    {0xCD920000u, 55u}, // smt -> Latn
-    {0xD1920000u, 47u}, // smu -> Khmr
-    {0xD9920000u, 55u}, // smw -> Latn
-    {0xDD920000u, 55u}, // smx -> Latn
-    {0xE1920000u,  2u}, // smy -> Arab
-    {0xE5920000u, 55u}, // smz -> Latn
-    {0x736E0000u, 55u}, // sn -> Latn
-    {0x89B20000u, 55u}, // snc -> Latn
-    {0x91B20000u, 55u}, // sne -> Latn
-    {0x95B20000u, 55u}, // snf -> Latn
-    {0x99B20000u, 55u}, // sng -> Latn
-    {0xA1B20000u, 55u}, // sni -> Latn
-    {0xA5B20000u, 55u}, // snj -> Latn
-    {0xA9B20000u, 55u}, // snk -> Latn
-    {0xADB20000u, 55u}, // snl -> Latn
-    {0xB1B20000u, 55u}, // snm -> Latn
-    {0xB5B20000u, 55u}, // snn -> Latn
-    {0xB9B20000u, 55u}, // sno -> Latn
-    {0xBDB20000u, 55u}, // snp -> Latn
-    {0xC1B20000u, 55u}, // snq -> Latn
-    {0xC5B20000u, 55u}, // snr -> Latn
-    {0xC9B20000u, 55u}, // sns -> Latn
-    {0xD1B20000u, 55u}, // snu -> Latn
-    {0xD5B20000u, 55u}, // snv -> Latn
-    {0xD9B20000u, 55u}, // snw -> Latn
-    {0xDDB20000u, 55u}, // snx -> Latn
-    {0xE1B20000u, 55u}, // sny -> Latn
-    {0xE5B20000u, 55u}, // snz -> Latn
-    {0x736F0000u, 55u}, // so -> Latn
-    {0x81D20000u, 107u}, // soa -> Tavt
-    {0x85D20000u, 55u}, // sob -> Latn
-    {0x89D20000u, 55u}, // soc -> Latn
-    {0x8DD20000u, 55u}, // sod -> Latn
-    {0x91D20000u, 55u}, // soe -> Latn
-    {0x99D20000u, 96u}, // sog -> Sogd
-    {0xA1D20000u, 21u}, // soi -> Deva
-    {0xA9D20000u, 55u}, // sok -> Latn
-    {0xADD20000u, 55u}, // sol -> Latn
-    {0xB9D20000u, 55u}, // soo -> Latn
-    {0xBDD20000u, 55u}, // sop -> Latn
-    {0xC1D20000u, 55u}, // soq -> Latn
-    {0xC5D20000u, 55u}, // sor -> Latn
-    {0xC9D20000u, 55u}, // sos -> Latn
-    {0xD1D20000u, 111u}, // sou -> Thai
-    {0xD5D20000u, 55u}, // sov -> Latn
-    {0xD9D20000u, 55u}, // sow -> Latn
-    {0xDDD20000u, 55u}, // sox -> Latn
-    {0xE1D20000u, 55u}, // soy -> Latn
-    {0xE5D20000u, 55u}, // soz -> Latn
-    {0x85F20000u, 55u}, // spb -> Latn
-    {0x89F20000u, 55u}, // spc -> Latn
-    {0x8DF20000u, 55u}, // spd -> Latn
-    {0x91F20000u, 55u}, // spe -> Latn
-    {0x99F20000u, 55u}, // spg -> Latn
-    {0xA1F20000u, 55u}, // spi -> Latn
-    {0xA9F20000u, 55u}, // spk -> Latn
-    {0xADF20000u, 55u}, // spl -> Latn
-    {0xB1F20000u, 55u}, // spm -> Latn
-    {0xB5F20000u, 55u}, // spn -> Latn
-    {0xB9F20000u, 55u}, // spo -> Latn
-    {0xBDF20000u, 55u}, // spp -> Latn
-    {0xC1F20000u, 55u}, // spq -> Latn
-    {0xC5F20000u, 55u}, // spr -> Latn
-    {0xC9F20000u, 55u}, // sps -> Latn
-    {0xCDF20000u, 112u}, // spt -> Tibt
-    {0xD5F20000u, 80u}, // spv -> Orya
-    {0x73710000u, 55u}, // sq -> Latn
-    {0x82120000u, 55u}, // sqa -> Latn
-    {0x9E120000u, 55u}, // sqh -> Latn
-    {0xB2120000u, 55u}, // sqm -> Latn
-    {0xBA120000u,  2u}, // sqo -> Arab
-    {0xC2120000u, 52u}, // sqq -> Laoo
-    {0xCE120000u,  2u}, // sqt -> Arab
-    {0xD2120000u, 55u}, // squ -> Latn
-    {0x73720000u, 20u}, // sr -> Cyrl
-    {0x73724D45u, 55u}, // sr-ME -> Latn
-    {0x7372524Fu, 55u}, // sr-RO -> Latn
-    {0x73725255u, 55u}, // sr-RU -> Latn
-    {0x73725452u, 55u}, // sr-TR -> Latn
-    {0x82320000u, 55u}, // sra -> Latn
-    {0x86320000u, 97u}, // srb -> Sora
-    {0x92320000u, 55u}, // sre -> Latn
-    {0x96320000u, 55u}, // srf -> Latn
-    {0x9A320000u, 55u}, // srg -> Latn
-    {0x9E320000u,  2u}, // srh -> Arab
-    {0xA2320000u, 55u}, // sri -> Latn
-    {0xAA320000u, 55u}, // srk -> Latn
-    {0xAE320000u, 55u}, // srl -> Latn
-    {0xB2320000u, 55u}, // srm -> Latn
-    {0xB6320000u, 55u}, // srn -> Latn
-    {0xBA320000u, 55u}, // sro -> Latn
-    {0xC2320000u, 55u}, // srq -> Latn
-    {0xC6320000u, 55u}, // srr -> Latn
-    {0xCA320000u, 55u}, // srs -> Latn
-    {0xCE320000u, 55u}, // srt -> Latn
-    {0xD2320000u, 55u}, // sru -> Latn
-    {0xD6320000u, 55u}, // srv -> Latn
-    {0xDA320000u, 55u}, // srw -> Latn
-    {0xDE320000u, 21u}, // srx -> Deva
-    {0xE2320000u, 55u}, // sry -> Latn
-    {0xE6320000u,  2u}, // srz -> Arab
-    {0x73730000u, 55u}, // ss -> Latn
-    {0x86520000u, 55u}, // ssb -> Latn
-    {0x8A520000u, 55u}, // ssc -> Latn
-    {0x8E520000u, 55u}, // ssd -> Latn
-    {0x92520000u, 55u}, // sse -> Latn
-    {0x96520000u, 55u}, // ssf -> Latn
-    {0x9A520000u, 55u}, // ssg -> Latn
-    {0x9E520000u,  2u}, // ssh -> Arab
-    {0xA6520000u, 55u}, // ssj -> Latn
-    {0xAE520000u, 55u}, // ssl -> Latn
-    {0xB2520000u, 55u}, // ssm -> Latn
-    {0xB6520000u, 55u}, // ssn -> Latn
-    {0xBA520000u, 55u}, // sso -> Latn
-    {0xC2520000u, 55u}, // ssq -> Latn
-    {0xCA520000u, 52u}, // sss -> Laoo
-    {0xCE520000u, 55u}, // sst -> Latn
-    {0xD2520000u, 55u}, // ssu -> Latn
-    {0xD6520000u, 55u}, // ssv -> Latn
-    {0xDE520000u, 55u}, // ssx -> Latn
-    {0xE2520000u, 55u}, // ssy -> Latn
-    {0xE6520000u, 55u}, // ssz -> Latn
-    {0x73740000u, 55u}, // st -> Latn
-    {0x82720000u, 55u}, // sta -> Latn
-    {0x86720000u, 55u}, // stb -> Latn
-    {0x92720000u, 55u}, // ste -> Latn
-    {0x96720000u, 55u}, // stf -> Latn
-    {0x9A720000u, 55u}, // stg -> Latn
-    {0x9E720000u, 55u}, // sth -> Latn
-    {0xA2720000u, 55u}, // sti -> Latn
-    {0xA6720000u, 55u}, // stj -> Latn
-    {0xAA720000u, 55u}, // stk -> Latn
-    {0xAE720000u, 55u}, // stl -> Latn
-    {0xB2720000u, 55u}, // stm -> Latn
-    {0xB6720000u, 55u}, // stn -> Latn
-    {0xBA720000u, 55u}, // sto -> Latn
-    {0xBE720000u, 55u}, // stp -> Latn
-    {0xC2720000u, 55u}, // stq -> Latn
-    {0xC6720000u, 55u}, // str -> Latn
-    {0xCA720000u,  2u}, // sts -> Arab
-    {0xCE720000u, 55u}, // stt -> Latn
-    {0xD6720000u, 24u}, // stv -> Ethi
-    {0xDA720000u, 55u}, // stw -> Latn
-    {0xE2720000u, 20u}, // sty -> Cyrl
-    {0x73750000u, 55u}, // su -> Latn
-    {0x82920000u, 55u}, // sua -> Latn
-    {0x86920000u, 55u}, // sub -> Latn
-    {0x8A920000u, 55u}, // suc -> Latn
-    {0x92920000u, 55u}, // sue -> Latn
-    {0x9A920000u, 55u}, // sug -> Latn
-    {0xA2920000u, 55u}, // sui -> Latn
-    {0xA6920000u, 55u}, // suj -> Latn
-    {0xAA920000u, 55u}, // suk -> Latn
-    {0xBA920000u, 55u}, // suo -> Latn
-    {0xC2920000u, 55u}, // suq -> Latn
-    {0xC6920000u, 55u}, // sur -> Latn
-    {0xCA920000u, 55u}, // sus -> Latn
-    {0xCE920000u, 55u}, // sut -> Latn
-    {0xD6920000u, 55u}, // suv -> Latn
-    {0xDA920000u, 55u}, // suw -> Latn
-    {0xE2920000u, 55u}, // suy -> Latn
-    {0xE6920000u, 99u}, // suz -> Sunu
-    {0x73760000u, 55u}, // sv -> Latn
-    {0x82B20000u, 25u}, // sva -> Geor
-    {0x86B20000u, 55u}, // svb -> Latn
-    {0x8AB20000u, 55u}, // svc -> Latn
-    {0x92B20000u, 55u}, // sve -> Latn
-    {0xB2B20000u, 55u}, // svm -> Latn
-    {0xCAB20000u, 55u}, // svs -> Latn
-    {0x73770000u, 55u}, // sw -> Latn
-    {0x86D20000u,  2u}, // swb -> Arab
-    {0x96D20000u, 55u}, // swf -> Latn
-    {0x9AD20000u, 55u}, // swg -> Latn
-    {0xA2D20000u, 34u}, // swi -> Hani
-    {0xA6D20000u, 55u}, // swj -> Latn
-    {0xAAD20000u, 55u}, // swk -> Latn
-    {0xB2D20000u, 55u}, // swm -> Latn
-    {0xBAD20000u, 55u}, // swo -> Latn
-    {0xBED20000u, 55u}, // swp -> Latn
-    {0xC2D20000u, 55u}, // swq -> Latn
-    {0xC6D20000u, 55u}, // swr -> Latn
-    {0xCAD20000u, 55u}, // sws -> Latn
-    {0xCED20000u, 55u}, // swt -> Latn
-    {0xD2D20000u, 55u}, // swu -> Latn
-    {0xD6D20000u, 21u}, // swv -> Deva
-    {0xDAD20000u, 55u}, // sww -> Latn
-    {0xDED20000u, 55u}, // swx -> Latn
-    {0xE2D20000u, 55u}, // swy -> Latn
-    {0x86F20000u, 55u}, // sxb -> Latn
-    {0x92F20000u, 55u}, // sxe -> Latn
-    {0xB6F20000u, 55u}, // sxn -> Latn
-    {0xC6F20000u, 55u}, // sxr -> Latn
-    {0xCAF20000u, 55u}, // sxs -> Latn
-    {0xD2F20000u, 90u}, // sxu -> Runr
-    {0xDAF20000u, 55u}, // sxw -> Latn
-    {0x83120000u, 55u}, // sya -> Latn
-    {0x87120000u, 55u}, // syb -> Latn
-    {0x8B120000u, 100u}, // syc -> Syrc
-    {0xA3120000u, 55u}, // syi -> Latn
-    {0xAB120000u, 55u}, // syk -> Latn
-    {0xAF120000u,  9u}, // syl -> Beng
-    {0xB3120000u, 55u}, // sym -> Latn
-    {0xB7120000u, 100u}, // syn -> Syrc
-    {0xBB120000u, 55u}, // syo -> Latn
-    {0xC7120000u, 100u}, // syr -> Syrc
-    {0xCB120000u, 55u}, // sys -> Latn
-    {0xDB120000u, 21u}, // syw -> Deva
-    {0xDF120000u, 55u}, // syx -> Latn
-    {0x83320000u, 55u}, // sza -> Latn
-    {0x87320000u, 55u}, // szb -> Latn
-    {0x8B320000u, 55u}, // szc -> Latn
-    {0x9B320000u, 55u}, // szg -> Latn
-    {0xAF320000u, 55u}, // szl -> Latn
-    {0xB7320000u, 55u}, // szn -> Latn
-    {0xBF320000u, 55u}, // szp -> Latn
-    {0xD7320000u, 55u}, // szv -> Latn
-    {0xDB320000u, 55u}, // szw -> Latn
-    {0xE3320000u, 55u}, // szy -> Latn
-    {0x74610000u, 105u}, // ta -> Taml
-    {0x80130000u, 55u}, // taa -> Latn
-    {0x84130000u, 20u}, // tab -> Cyrl
-    {0x88130000u, 55u}, // tac -> Latn
-    {0x8C130000u, 55u}, // tad -> Latn
-    {0x90130000u, 55u}, // tae -> Latn
-    {0x94130000u, 55u}, // taf -> Latn
-    {0x98130000u, 55u}, // tag -> Latn
-    {0xA4130000u, 21u}, // taj -> Deva
-    {0xA8130000u, 55u}, // tak -> Latn
-    {0xAC130000u, 55u}, // tal -> Latn
-    {0xB4130000u, 55u}, // tan -> Latn
-    {0xB8130000u, 55u}, // tao -> Latn
-    {0xBC130000u, 55u}, // tap -> Latn
-    {0xC0130000u, 55u}, // taq -> Latn
-    {0xC4130000u, 55u}, // tar -> Latn
-    {0xC8130000u, 55u}, // tas -> Latn
-    {0xD0130000u, 55u}, // tau -> Latn
-    {0xD4130000u, 55u}, // tav -> Latn
-    {0xD8130000u, 55u}, // taw -> Latn
-    {0xDC130000u, 55u}, // tax -> Latn
-    {0xE0130000u, 55u}, // tay -> Latn
-    {0xE4130000u, 55u}, // taz -> Latn
-    {0x80330000u, 55u}, // tba -> Latn
-    {0x88330000u, 55u}, // tbc -> Latn
-    {0x8C330000u, 55u}, // tbd -> Latn
-    {0x90330000u, 55u}, // tbe -> Latn
-    {0x94330000u, 55u}, // tbf -> Latn
-    {0x98330000u, 55u}, // tbg -> Latn
-    {0x9C330000u, 55u}, // tbh -> Latn
-    {0xA0330000u, 55u}, // tbi -> Latn
-    {0xA4330000u, 55u}, // tbj -> Latn
-    {0xA8330000u, 101u}, // tbk -> Tagb
-    {0xAC330000u, 55u}, // tbl -> Latn
-    {0xB0330000u, 55u}, // tbm -> Latn
-    {0xB4330000u, 55u}, // tbn -> Latn
-    {0xB8330000u, 55u}, // tbo -> Latn
-    {0xBC330000u, 55u}, // tbp -> Latn
-    {0xC8330000u, 55u}, // tbs -> Latn
-    {0xCC330000u, 55u}, // tbt -> Latn
-    {0xD0330000u, 55u}, // tbu -> Latn
-    {0xD4330000u, 55u}, // tbv -> Latn
-    {0xD8330000u, 55u}, // tbw -> Latn
-    {0xDC330000u, 55u}, // tbx -> Latn
-    {0xE0330000u, 55u}, // tby -> Latn
-    {0xE4330000u, 55u}, // tbz -> Latn
-    {0x80530000u, 55u}, // tca -> Latn
-    {0x84530000u, 55u}, // tcb -> Latn
-    {0x88530000u, 55u}, // tcc -> Latn
-    {0x8C530000u, 55u}, // tcd -> Latn
-    {0x90530000u, 55u}, // tce -> Latn
-    {0x94530000u, 55u}, // tcf -> Latn
-    {0x98530000u, 55u}, // tcg -> Latn
-    {0x9C530000u, 55u}, // tch -> Latn
-    {0xA0530000u, 55u}, // tci -> Latn
-    {0xA8530000u, 55u}, // tck -> Latn
-    {0xB0530000u, 55u}, // tcm -> Latn
-    {0xB4530000u, 112u}, // tcn -> Tibt
-    {0xB8530000u, 72u}, // tco -> Mymr
-    {0xBC530000u, 55u}, // tcp -> Latn
-    {0xC0530000u, 55u}, // tcq -> Latn
-    {0xC8530000u, 55u}, // tcs -> Latn
-    {0xD0530000u, 55u}, // tcu -> Latn
-    {0xD8530000u, 55u}, // tcw -> Latn
-    {0xDC530000u, 105u}, // tcx -> Taml
-    {0xE0530000u, 49u}, // tcy -> Knda
-    {0xE4530000u, 55u}, // tcz -> Latn
-    {0x80730000u, 109u}, // tda -> Tfng
-    {0x84730000u, 21u}, // tdb -> Deva
-    {0x88730000u, 55u}, // tdc -> Latn
-    {0x8C730000u, 103u}, // tdd -> Tale
-    {0x90730000u, 55u}, // tde -> Latn
-    {0x98730000u, 21u}, // tdg -> Deva
-    {0x9C730000u, 21u}, // tdh -> Deva
-    {0xA0730000u, 55u}, // tdi -> Latn
-    {0xA4730000u, 55u}, // tdj -> Latn
-    {0xA8730000u, 55u}, // tdk -> Latn
-    {0xAC730000u, 55u}, // tdl -> Latn
-    {0xB0730000u, 55u}, // tdm -> Latn
-    {0xB4730000u, 55u}, // tdn -> Latn
-    {0xB8730000u, 55u}, // tdo -> Latn
-    {0xC0730000u, 55u}, // tdq -> Latn
-    {0xC4730000u, 55u}, // tdr -> Latn
-    {0xC8730000u, 55u}, // tds -> Latn
-    {0xCC730000u, 55u}, // tdt -> Latn
-    {0xD4730000u, 55u}, // tdv -> Latn
-    {0xDC730000u, 55u}, // tdx -> Latn
-    {0xE0730000u, 55u}, // tdy -> Latn
-    {0x74650000u, 108u}, // te -> Telu
-    {0x80930000u, 55u}, // tea -> Latn
-    {0x84930000u, 55u}, // teb -> Latn
-    {0x88930000u, 55u}, // tec -> Latn
-    {0x8C930000u, 55u}, // ted -> Latn
-    {0x90930000u, 55u}, // tee -> Latn
-    {0x98930000u, 55u}, // teg -> Latn
-    {0x9C930000u, 55u}, // teh -> Latn
-    {0xA0930000u, 55u}, // tei -> Latn
-    {0xA8930000u, 55u}, // tek -> Latn
-    {0xB0930000u, 55u}, // tem -> Latn
-    {0xB4930000u, 55u}, // ten -> Latn
-    {0xB8930000u, 55u}, // teo -> Latn
-    {0xBC930000u, 55u}, // tep -> Latn
-    {0xC0930000u, 55u}, // teq -> Latn
-    {0xC4930000u, 55u}, // ter -> Latn
-    {0xC8930000u, 41u}, // tes -> Java
-    {0xCC930000u, 55u}, // tet -> Latn
-    {0xD0930000u, 55u}, // teu -> Latn
-    {0xD4930000u, 55u}, // tev -> Latn
-    {0xD8930000u, 55u}, // tew -> Latn
-    {0xDC930000u, 55u}, // tex -> Latn
-    {0xE0930000u, 55u}, // tey -> Latn
-    {0xE4930000u, 55u}, // tez -> Latn
-    {0xA0B30000u, 55u}, // tfi -> Latn
-    {0xB4B30000u, 55u}, // tfn -> Latn
-    {0xB8B30000u, 55u}, // tfo -> Latn
-    {0xC4B30000u, 55u}, // tfr -> Latn
-    {0xCCB30000u, 55u}, // tft -> Latn
-    {0x74670000u, 20u}, // tg -> Cyrl
-    {0x7467504Bu,  2u}, // tg-PK -> Arab
-    {0x80D30000u, 55u}, // tga -> Latn
-    {0x84D30000u, 55u}, // tgb -> Latn
-    {0x88D30000u, 55u}, // tgc -> Latn
-    {0x8CD30000u, 55u}, // tgd -> Latn
-    {0x90D30000u, 21u}, // tge -> Deva
-    {0x94D30000u, 112u}, // tgf -> Tibt
-    {0x9CD30000u, 55u}, // tgh -> Latn
-    {0xA0D30000u, 55u}, // tgi -> Latn
-    {0xA4D30000u, 55u}, // tgj -> Latn
-    {0xB4D30000u, 55u}, // tgn -> Latn
-    {0xB8D30000u, 55u}, // tgo -> Latn
-    {0xBCD30000u, 55u}, // tgp -> Latn
-    {0xC0D30000u, 55u}, // tgq -> Latn
-    {0xC8D30000u, 55u}, // tgs -> Latn
-    {0xCCD30000u, 55u}, // tgt -> Latn
-    {0xD0D30000u, 55u}, // tgu -> Latn
-    {0xD4D30000u, 55u}, // tgv -> Latn
-    {0xD8D30000u, 55u}, // tgw -> Latn
-    {0xDCD30000u, 55u}, // tgx -> Latn
-    {0xE0D30000u, 55u}, // tgy -> Latn
-    {0xE4D30000u, 55u}, // tgz -> Latn
-    {0x74680000u, 111u}, // th -> Thai
-    {0x8CF30000u, 55u}, // thd -> Latn
-    {0x90F30000u, 21u}, // the -> Deva
-    {0x94F30000u, 21u}, // thf -> Deva
-    {0x9CF30000u, 55u}, // thh -> Latn
-    {0xA0F30000u, 103u}, // thi -> Tale
-    {0xA8F30000u, 55u}, // thk -> Latn
-    {0xACF30000u, 21u}, // thl -> Deva
-    {0xB0F30000u, 111u}, // thm -> Thai
-    {0xBCF30000u, 55u}, // thp -> Latn
-    {0xC0F30000u, 21u}, // thq -> Deva
-    {0xC4F30000u, 21u}, // thr -> Deva
-    {0xC8F30000u, 21u}, // ths -> Deva
-    {0xCCF30000u, 55u}, // tht -> Latn
-    {0xD0F30000u, 55u}, // thu -> Latn
-    {0xD4F30000u, 55u}, // thv -> Latn
-    {0xE0F30000u, 55u}, // thy -> Latn
-    {0xE4F30000u, 55u}, // thz -> Latn
-    {0x74690000u, 24u}, // ti -> Ethi
-    {0x89130000u, 55u}, // tic -> Latn
-    {0x95130000u, 55u}, // tif -> Latn
-    {0x99130000u, 24u}, // tig -> Ethi
-    {0x9D130000u, 55u}, // tih -> Latn
-    {0xA1130000u, 55u}, // tii -> Latn
-    {0xA5130000u, 21u}, // tij -> Deva
-    {0xA9130000u, 55u}, // tik -> Latn
-    {0xAD130000u, 55u}, // til -> Latn
-    {0xB1130000u, 55u}, // tim -> Latn
-    {0xB5130000u, 20u}, // tin -> Cyrl
-    {0xB9130000u, 55u}, // tio -> Latn
-    {0xBD130000u, 55u}, // tip -> Latn
-    {0xC1130000u, 55u}, // tiq -> Latn
-    {0xC9130000u, 55u}, // tis -> Latn
-    {0xCD130000u, 55u}, // tit -> Latn
-    {0xD1130000u, 55u}, // tiu -> Latn
-    {0xD5130000u, 55u}, // tiv -> Latn
-    {0xD9130000u, 55u}, // tiw -> Latn
-    {0xDD130000u, 55u}, // tix -> Latn
-    {0xE1130000u, 55u}, // tiy -> Latn
-    {0x81330000u, 55u}, // tja -> Latn
-    {0x99330000u, 55u}, // tjg -> Latn
-    {0xA1330000u, 55u}, // tji -> Latn
-    {0xA5330000u, 55u}, // tjj -> Latn
-    {0xAD330000u, 72u}, // tjl -> Mymr
-    {0xB5330000u, 55u}, // tjn -> Latn
-    {0xB9330000u,  2u}, // tjo -> Arab
-    {0xBD330000u, 55u}, // tjp -> Latn
-    {0xC9330000u, 55u}, // tjs -> Latn
-    {0xD1330000u, 55u}, // tju -> Latn
-    {0xD9330000u, 55u}, // tjw -> Latn
-    {0x746B0000u, 55u}, // tk -> Latn
-    {0x81530000u, 55u}, // tka -> Latn
-    {0x85530000u, 21u}, // tkb -> Deva
-    {0x8D530000u, 55u}, // tkd -> Latn
-    {0x91530000u, 55u}, // tke -> Latn
-    {0x95530000u, 55u}, // tkf -> Latn
-    {0x99530000u, 55u}, // tkg -> Latn
-    {0xAD530000u, 55u}, // tkl -> Latn
-    {0xBD530000u, 55u}, // tkp -> Latn
-    {0xC1530000u, 55u}, // tkq -> Latn
-    {0xC5530000u, 55u}, // tkr -> Latn
-    {0xC9530000u,  2u}, // tks -> Arab
-    {0xCD530000u, 21u}, // tkt -> Deva
-    {0xD1530000u, 55u}, // tku -> Latn
-    {0xD5530000u, 55u}, // tkv -> Latn
-    {0xD9530000u, 55u}, // tkw -> Latn
-    {0xDD530000u, 55u}, // tkx -> Latn
-    {0xE5530000u, 55u}, // tkz -> Latn
-    {0x746C0000u, 55u}, // tl -> Latn
-    {0x81730000u, 55u}, // tla -> Latn
-    {0x85730000u, 55u}, // tlb -> Latn
-    {0x89730000u, 55u}, // tlc -> Latn
-    {0x8D730000u, 55u}, // tld -> Latn
-    {0x95730000u, 55u}, // tlf -> Latn
-    {0x99730000u, 55u}, // tlg -> Latn
-    {0xA1730000u, 55u}, // tli -> Latn
-    {0xA5730000u, 55u}, // tlj -> Latn
-    {0xA9730000u, 55u}, // tlk -> Latn
-    {0xAD730000u, 55u}, // tll -> Latn
-    {0xB1730000u, 55u}, // tlm -> Latn
-    {0xB5730000u, 55u}, // tln -> Latn
-    {0xBD730000u, 55u}, // tlp -> Latn
-    {0xC1730000u, 55u}, // tlq -> Latn
-    {0xC5730000u, 55u}, // tlr -> Latn
-    {0xC9730000u, 55u}, // tls -> Latn
-    {0xCD730000u, 55u}, // tlt -> Latn
-    {0xD1730000u, 55u}, // tlu -> Latn
-    {0xD5730000u, 55u}, // tlv -> Latn
-    {0xDD730000u, 55u}, // tlx -> Latn
-    {0xE1730000u, 55u}, // tly -> Latn
-    {0x81930000u, 55u}, // tma -> Latn
-    {0x85930000u, 55u}, // tmb -> Latn
-    {0x89930000u, 55u}, // tmc -> Latn
-    {0x8D930000u, 55u}, // tmd -> Latn
-    {0x91930000u, 55u}, // tme -> Latn
-    {0x95930000u, 55u}, // tmf -> Latn
-    {0x99930000u, 55u}, // tmg -> Latn
-    {0x9D930000u, 55u}, // tmh -> Latn
-    {0xA1930000u, 55u}, // tmi -> Latn
-    {0xA5930000u, 55u}, // tmj -> Latn
-    {0xAD930000u, 55u}, // tml -> Latn
-    {0xB1930000u, 55u}, // tmm -> Latn
-    {0xB5930000u, 55u}, // tmn -> Latn
-    {0xB9930000u, 55u}, // tmo -> Latn
-    {0xC1930000u, 55u}, // tmq -> Latn
-    {0xC5930000u, 100u}, // tmr -> Syrc
-    {0xCD930000u, 55u}, // tmt -> Latn
-    {0xD1930000u, 55u}, // tmu -> Latn
-    {0xD5930000u, 55u}, // tmv -> Latn
-    {0xD9930000u, 55u}, // tmw -> Latn
-    {0xE1930000u, 55u}, // tmy -> Latn
-    {0xE5930000u, 55u}, // tmz -> Latn
-    {0x746E0000u, 55u}, // tn -> Latn
-    {0x81B30000u, 55u}, // tna -> Latn
-    {0x85B30000u, 55u}, // tnb -> Latn
-    {0x89B30000u, 55u}, // tnc -> Latn
-    {0x8DB30000u, 55u}, // tnd -> Latn
-    {0x99B30000u, 55u}, // tng -> Latn
-    {0x9DB30000u, 55u}, // tnh -> Latn
-    {0xA1B30000u, 55u}, // tni -> Latn
-    {0xA9B30000u, 55u}, // tnk -> Latn
-    {0xADB30000u, 55u}, // tnl -> Latn
-    {0xB1B30000u, 55u}, // tnm -> Latn
-    {0xB5B30000u, 55u}, // tnn -> Latn
-    {0xB9B30000u, 55u}, // tno -> Latn
-    {0xBDB30000u, 55u}, // tnp -> Latn
-    {0xC1B30000u, 55u}, // tnq -> Latn
-    {0xC5B30000u, 55u}, // tnr -> Latn
-    {0xC9B30000u, 55u}, // tns -> Latn
-    {0xCDB30000u, 55u}, // tnt -> Latn
-    {0xD5B30000u, 12u}, // tnv -> Cakm
-    {0xD9B30000u, 55u}, // tnw -> Latn
-    {0xDDB30000u, 55u}, // tnx -> Latn
-    {0xE1B30000u, 55u}, // tny -> Latn
-    {0x746F0000u, 55u}, // to -> Latn
-    {0x85D30000u, 55u}, // tob -> Latn
-    {0x89D30000u, 55u}, // toc -> Latn
-    {0x8DD30000u, 55u}, // tod -> Latn
-    {0x95D30000u, 55u}, // tof -> Latn
-    {0x99D30000u, 55u}, // tog -> Latn
-    {0x9DD30000u, 55u}, // toh -> Latn
-    {0xA1D30000u, 55u}, // toi -> Latn
-    {0xA5D30000u, 55u}, // toj -> Latn
-    {0xA9D30000u, 55u}, // tok -> Latn
-    {0xADD30000u, 55u}, // tol -> Latn
-    {0xB1D30000u, 55u}, // tom -> Latn
-    {0xB9D30000u, 55u}, // too -> Latn
-    {0xBDD30000u, 55u}, // top -> Latn
-    {0xC1D30000u, 55u}, // toq -> Latn
-    {0xC5D30000u, 55u}, // tor -> Latn
-    {0xC9D30000u, 55u}, // tos -> Latn
-    {0xD1D30000u, 55u}, // tou -> Latn
-    {0xD5D30000u,  2u}, // tov -> Arab
-    {0xD9D30000u, 55u}, // tow -> Latn
-    {0xDDD30000u, 55u}, // tox -> Latn
-    {0xE1D30000u, 55u}, // toy -> Latn
-    {0xE5D30000u, 55u}, // toz -> Latn
-    {0x81F30000u, 55u}, // tpa -> Latn
-    {0x89F30000u, 55u}, // tpc -> Latn
-    {0x91F30000u, 55u}, // tpe -> Latn
-    {0x95F30000u, 55u}, // tpf -> Latn
-    {0x99F30000u, 55u}, // tpg -> Latn
-    {0xA1F30000u, 55u}, // tpi -> Latn
-    {0xA5F30000u, 55u}, // tpj -> Latn
-    {0xA9F30000u, 55u}, // tpk -> Latn
-    {0xADF30000u, 55u}, // tpl -> Latn
-    {0xB1F30000u, 55u}, // tpm -> Latn
-    {0xB5F30000u, 55u}, // tpn -> Latn
-    {0xBDF30000u, 55u}, // tpp -> Latn
-    {0xC5F30000u, 55u}, // tpr -> Latn
-    {0xCDF30000u, 55u}, // tpt -> Latn
-    {0xD1F30000u, 47u}, // tpu -> Khmr
-    {0xD5F30000u, 55u}, // tpv -> Latn
-    {0xDDF30000u, 55u}, // tpx -> Latn
-    {0xE1F30000u, 55u}, // tpy -> Latn
-    {0xE5F30000u, 55u}, // tpz -> Latn
-    {0x86130000u, 55u}, // tqb -> Latn
-    {0xAE130000u, 55u}, // tql -> Latn
-    {0xB2130000u, 55u}, // tqm -> Latn
-    {0xB6130000u, 55u}, // tqn -> Latn
-    {0xBA130000u, 55u}, // tqo -> Latn
-    {0xBE130000u, 55u}, // tqp -> Latn
-    {0xCE130000u, 55u}, // tqt -> Latn
-    {0xD2130000u, 55u}, // tqu -> Latn
-    {0xDA130000u, 55u}, // tqw -> Latn
-    {0x74720000u, 55u}, // tr -> Latn
-    {0x82330000u,  2u}, // tra -> Arab
-    {0x86330000u, 55u}, // trb -> Latn
-    {0x8A330000u, 55u}, // trc -> Latn
-    {0x92330000u, 55u}, // tre -> Latn
-    {0x96330000u, 55u}, // trf -> Latn
-    {0x9A330000u, 37u}, // trg -> Hebr
-    {0x9E330000u, 55u}, // trh -> Latn
-    {0xA2330000u, 55u}, // tri -> Latn
-    {0xA6330000u, 55u}, // trj -> Latn
-    {0xAE330000u, 55u}, // trl -> Latn
-    {0xB2330000u,  2u}, // trm -> Arab
-    {0xB6330000u, 55u}, // trn -> Latn
-    {0xBA330000u, 55u}, // tro -> Latn
-    {0xBE330000u, 55u}, // trp -> Latn
-    {0xC2330000u, 55u}, // trq -> Latn
-    {0xC6330000u, 55u}, // trr -> Latn
-    {0xCA330000u, 55u}, // trs -> Latn
-    {0xCE330000u, 55u}, // trt -> Latn
-    {0xD2330000u, 55u}, // tru -> Latn
-    {0xD6330000u, 55u}, // trv -> Latn
-    {0xDA330000u,  2u}, // trw -> Arab
-    {0xDE330000u, 55u}, // trx -> Latn
-    {0xE2330000u, 55u}, // try -> Latn
-    {0xE6330000u, 55u}, // trz -> Latn
-    {0x74730000u, 55u}, // ts -> Latn
-    {0x82530000u, 55u}, // tsa -> Latn
-    {0x86530000u, 55u}, // tsb -> Latn
-    {0x8A530000u, 55u}, // tsc -> Latn
-    {0x8E530000u, 30u}, // tsd -> Grek
-    {0x9A530000u, 55u}, // tsg -> Latn
-    {0x9E530000u, 55u}, // tsh -> Latn
-    {0xA2530000u, 55u}, // tsi -> Latn
-    {0xA6530000u, 112u}, // tsj -> Tibt
-    {0xAE530000u, 55u}, // tsl -> Latn
-    {0xBE530000u, 55u}, // tsp -> Latn
-    {0xC6530000u, 55u}, // tsr -> Latn
-    {0xCE530000u, 55u}, // tst -> Latn
-    {0xD2530000u, 55u}, // tsu -> Latn
-    {0xD6530000u, 55u}, // tsv -> Latn
-    {0xDA530000u, 55u}, // tsw -> Latn
-    {0xDE530000u, 55u}, // tsx -> Latn
-    {0xE6530000u, 55u}, // tsz -> Latn
-    {0x74740000u, 20u}, // tt -> Cyrl
-    {0x86730000u, 55u}, // ttb -> Latn
-    {0x8A730000u, 55u}, // ttc -> Latn
-    {0x8E730000u, 55u}, // ttd -> Latn
-    {0x92730000u, 55u}, // tte -> Latn
-    {0x96730000u, 55u}, // ttf -> Latn
-    {0x9E730000u, 52u}, // tth -> Laoo
-    {0xA2730000u, 55u}, // tti -> Latn
-    {0xA6730000u, 55u}, // ttj -> Latn
-    {0xAA730000u, 55u}, // ttk -> Latn
-    {0xAE730000u, 55u}, // ttl -> Latn
-    {0xB2730000u, 55u}, // ttm -> Latn
-    {0xB6730000u, 55u}, // ttn -> Latn
-    {0xBA730000u, 52u}, // tto -> Laoo
-    {0xBE730000u, 55u}, // ttp -> Latn
-    {0xC6730000u, 55u}, // ttr -> Latn
-    {0xCA730000u, 111u}, // tts -> Thai
-    {0xCE730000u, 55u}, // ttt -> Latn
-    {0xD2730000u, 55u}, // ttu -> Latn
-    {0xD6730000u, 55u}, // ttv -> Latn
-    {0xDA730000u, 55u}, // ttw -> Latn
-    {0xE2730000u, 55u}, // tty -> Latn
-    {0xE6730000u, 21u}, // ttz -> Deva
-    {0x82930000u, 55u}, // tua -> Latn
-    {0x86930000u, 55u}, // tub -> Latn
-    {0x8A930000u, 55u}, // tuc -> Latn
-    {0x8E930000u, 55u}, // tud -> Latn
-    {0x92930000u, 55u}, // tue -> Latn
-    {0x96930000u, 55u}, // tuf -> Latn
-    {0x9A930000u, 55u}, // tug -> Latn
-    {0x9E930000u, 55u}, // tuh -> Latn
-    {0xA2930000u, 55u}, // tui -> Latn
-    {0xA6930000u, 55u}, // tuj -> Latn
-    {0xAE930000u, 55u}, // tul -> Latn
-    {0xB2930000u, 55u}, // tum -> Latn
-    {0xB6930000u, 55u}, // tun -> Latn
-    {0xBA930000u, 55u}, // tuo -> Latn
-    {0xC2930000u, 55u}, // tuq -> Latn
-    {0xCA930000u, 55u}, // tus -> Latn
-    {0xD2930000u, 55u}, // tuu -> Latn
-    {0xD6930000u, 55u}, // tuv -> Latn
-    {0xDE930000u, 55u}, // tux -> Latn
-    {0xE2930000u, 55u}, // tuy -> Latn
-    {0xE6930000u, 55u}, // tuz -> Latn
-    {0x82B30000u, 55u}, // tva -> Latn
-    {0x8EB30000u, 55u}, // tvd -> Latn
-    {0x92B30000u, 55u}, // tve -> Latn
-    {0xA2B30000u, 55u}, // tvi -> Latn
-    {0xAAB30000u, 55u}, // tvk -> Latn
-    {0xAEB30000u, 55u}, // tvl -> Latn
-    {0xB2B30000u, 55u}, // tvm -> Latn
-    {0xB6B30000u, 72u}, // tvn -> Mymr
-    {0xBAB30000u, 55u}, // tvo -> Latn
-    {0xCAB30000u, 55u}, // tvs -> Latn
-    {0xCEB30000u, 55u}, // tvt -> Latn
-    {0xD2B30000u, 55u}, // tvu -> Latn
-    {0xDAB30000u, 55u}, // tvw -> Latn
-    {0xDEB30000u, 55u}, // tvx -> Latn
-    {0x82D30000u, 55u}, // twa -> Latn
-    {0x86D30000u, 55u}, // twb -> Latn
-    {0x8ED30000u, 55u}, // twd -> Latn
-    {0x92D30000u, 55u}, // twe -> Latn
-    {0x96D30000u, 55u}, // twf -> Latn
-    {0x9AD30000u, 55u}, // twg -> Latn
-    {0x9ED30000u, 55u}, // twh -> Latn
-    {0xAED30000u, 55u}, // twl -> Latn
-    {0xB2D30000u, 21u}, // twm -> Deva
-    {0xB6D30000u, 55u}, // twn -> Latn
-    {0xBAD30000u, 55u}, // two -> Latn
-    {0xBED30000u, 55u}, // twp -> Latn
-    {0xC2D30000u, 55u}, // twq -> Latn
-    {0xC6D30000u, 55u}, // twr -> Latn
-    {0xCED30000u, 55u}, // twt -> Latn
-    {0xD2D30000u, 55u}, // twu -> Latn
-    {0xDAD30000u, 55u}, // tww -> Latn
-    {0xDED30000u, 55u}, // twx -> Latn
-    {0xE2D30000u, 55u}, // twy -> Latn
-    {0x82F30000u, 55u}, // txa -> Latn
-    {0x92F30000u, 55u}, // txe -> Latn
-    {0x9AF30000u, 106u}, // txg -> Tang
-    {0xA2F30000u, 55u}, // txi -> Latn
-    {0xA6F30000u, 55u}, // txj -> Latn
-    {0xB2F30000u, 55u}, // txm -> Latn
-    {0xB6F30000u, 55u}, // txn -> Latn
-    {0xBAF30000u, 114u}, // txo -> Toto
-    {0xC2F30000u, 55u}, // txq -> Latn
-    {0xCAF30000u, 55u}, // txs -> Latn
-    {0xCEF30000u, 55u}, // txt -> Latn
-    {0xD2F30000u, 55u}, // txu -> Latn
-    {0xDEF30000u, 55u}, // txx -> Latn
-    {0xE2F30000u, 55u}, // txy -> Latn
-    {0x74790000u, 55u}, // ty -> Latn
-    {0x83130000u, 55u}, // tya -> Latn
-    {0x93130000u, 55u}, // tye -> Latn
-    {0x9F130000u, 55u}, // tyh -> Latn
-    {0xA3130000u, 55u}, // tyi -> Latn
-    {0xA7130000u, 55u}, // tyj -> Latn
-    {0xAF130000u, 55u}, // tyl -> Latn
-    {0xB7130000u, 55u}, // tyn -> Latn
-    {0xBF130000u, 55u}, // typ -> Latn
-    {0xC7130000u, 107u}, // tyr -> Tavt
-    {0xCB130000u, 55u}, // tys -> Latn
-    {0xCF130000u, 55u}, // tyt -> Latn
-    {0xD3130000u, 55u}, // tyu -> Latn
-    {0xD7130000u, 20u}, // tyv -> Cyrl
-    {0xDF130000u, 55u}, // tyx -> Latn
-    {0xE3130000u, 55u}, // tyy -> Latn
-    {0xE7130000u, 55u}, // tyz -> Latn
-    {0x9F330000u, 55u}, // tzh -> Latn
-    {0xA7330000u, 55u}, // tzj -> Latn
-    {0xAF330000u, 55u}, // tzl -> Latn
-    {0xB3330000u, 55u}, // tzm -> Latn
-    {0xB7330000u, 55u}, // tzn -> Latn
-    {0xBB330000u, 55u}, // tzo -> Latn
-    {0xDF330000u, 55u}, // tzx -> Latn
-    {0xB0140000u, 55u}, // uam -> Latn
-    {0xC4140000u, 55u}, // uar -> Latn
-    {0x80340000u, 55u}, // uba -> Latn
-    {0xA0340000u, 55u}, // ubi -> Latn
-    {0xAC340000u, 55u}, // ubl -> Latn
-    {0xC4340000u, 55u}, // ubr -> Latn
-    {0xD0340000u, 55u}, // ubu -> Latn
-    {0xE0340000u, 55u}, // uby -> Latn
-    {0x80740000u, 55u}, // uda -> Latn
-    {0x90740000u, 20u}, // ude -> Cyrl
-    {0x98740000u, 67u}, // udg -> Mlym
-    {0xA0740000u, 20u}, // udi -> Cyrl
-    {0xA4740000u, 55u}, // udj -> Latn
-    {0xAC740000u, 55u}, // udl -> Latn
-    {0xB0740000u, 20u}, // udm -> Cyrl
-    {0xD0740000u, 55u}, // udu -> Latn
-    {0xC8940000u, 55u}, // ues -> Latn
-    {0xA0B40000u, 55u}, // ufi -> Latn
-    {0x75670000u,  2u}, // ug -> Arab
-    {0x75674B5Au, 20u}, // ug-KZ -> Cyrl
-    {0x75674D4Eu, 20u}, // ug-MN -> Cyrl
-    {0x80D40000u, 115u}, // uga -> Ugar
-    {0x84D40000u, 55u}, // ugb -> Latn
-    {0x90D40000u, 55u}, // uge -> Latn
-    {0x9CD40000u, 20u}, // ugh -> Cyrl
-    {0xB8D40000u, 111u}, // ugo -> Thai
-    {0x80F40000u, 55u}, // uha -> Latn
-    {0xB4F40000u, 55u}, // uhn -> Latn
-    {0xC9140000u, 55u}, // uis -> Latn
-    {0xD5140000u, 55u}, // uiv -> Latn
-    {0xA1340000u, 55u}, // uji -> Latn
-    {0x756B0000u, 20u}, // uk -> Cyrl
-    {0x81540000u, 55u}, // uka -> Latn
-    {0x99540000u, 55u}, // ukg -> Latn
-    {0x9D540000u, 55u}, // ukh -> Latn
-    {0xA1540000u, 80u}, // uki -> Orya
-    {0xA9540000u, 55u}, // ukk -> Latn
-    {0xBD540000u, 55u}, // ukp -> Latn
-    {0xC1540000u, 55u}, // ukq -> Latn
-    {0xD1540000u, 55u}, // uku -> Latn
-    {0xD5540000u, 55u}, // ukv -> Latn
-    {0xD9540000u, 55u}, // ukw -> Latn
-    {0xE1540000u, 55u}, // uky -> Latn
-    {0x81740000u, 55u}, // ula -> Latn
-    {0x85740000u, 55u}, // ulb -> Latn
-    {0x89740000u, 20u}, // ulc -> Cyrl
-    {0x91740000u, 55u}, // ule -> Latn
-    {0x95740000u, 55u}, // ulf -> Latn
-    {0xA1740000u, 55u}, // uli -> Latn
-    {0xA9740000u, 55u}, // ulk -> Latn
-    {0xB1740000u, 55u}, // ulm -> Latn
-    {0xB5740000u, 55u}, // uln -> Latn
-    {0xD1740000u, 55u}, // ulu -> Latn
-    {0xD9740000u, 55u}, // ulw -> Latn
-    {0xE1740000u, 55u}, // uly -> Latn
-    {0x81940000u, 55u}, // uma -> Latn
-    {0x85940000u, 55u}, // umb -> Latn
-    {0x8D940000u, 55u}, // umd -> Latn
-    {0x99940000u, 55u}, // umg -> Latn
-    {0xA1940000u, 55u}, // umi -> Latn
-    {0xB1940000u, 55u}, // umm -> Latn
-    {0xB5940000u, 55u}, // umn -> Latn
-    {0xB9940000u, 55u}, // umo -> Latn
-    {0xBD940000u, 55u}, // ump -> Latn
-    {0xC5940000u, 55u}, // umr -> Latn
-    {0xC9940000u, 55u}, // ums -> Latn
-    {0x81B40000u, 55u}, // una -> Latn
-    {0x91B40000u, 55u}, // une -> Latn
-    {0x99B40000u, 55u}, // ung -> Latn
-    {0xA1B40000u, 55u}, // uni -> Latn
-    {0xA9B40000u, 55u}, // unk -> Latn
-    {0xB1B40000u, 55u}, // unm -> Latn
-    {0xB5B40000u, 55u}, // unn -> Latn
-    {0xC5B40000u,  9u}, // unr -> Beng
-    {0xC5B44E50u, 21u}, // unr-NP -> Deva
-    {0xD1B40000u, 55u}, // unu -> Latn
-    {0xDDB40000u,  9u}, // unx -> Beng
-    {0xE5B40000u, 55u}, // unz -> Latn
-    {0xB5D40000u, 55u}, // uon -> Latn
-    {0xA1F40000u, 55u}, // upi -> Latn
-    {0xD5F40000u, 55u}, // upv -> Latn
-    {0x75720000u,  2u}, // ur -> Arab
-    {0x82340000u, 55u}, // ura -> Latn
-    {0x86340000u, 55u}, // urb -> Latn
-    {0x8A340000u, 55u}, // urc -> Latn
-    {0x92340000u, 55u}, // ure -> Latn
-    {0x96340000u, 55u}, // urf -> Latn
-    {0x9A340000u, 55u}, // urg -> Latn
-    {0x9E340000u, 55u}, // urh -> Latn
-    {0xA2340000u, 55u}, // uri -> Latn
-    {0xAA340000u, 111u}, // urk -> Thai
-    {0xB2340000u, 55u}, // urm -> Latn
-    {0xB6340000u, 55u}, // urn -> Latn
-    {0xBA340000u, 55u}, // uro -> Latn
-    {0xBE340000u, 55u}, // urp -> Latn
-    {0xC6340000u, 55u}, // urr -> Latn
-    {0xCE340000u, 55u}, // urt -> Latn
-    {0xD2340000u, 55u}, // uru -> Latn
-    {0xD6340000u, 55u}, // urv -> Latn
-    {0xDA340000u, 55u}, // urw -> Latn
-    {0xDE340000u, 55u}, // urx -> Latn
-    {0xE2340000u, 55u}, // ury -> Latn
-    {0xE6340000u, 55u}, // urz -> Latn
-    {0x82540000u, 55u}, // usa -> Latn
-    {0x9E540000u,  2u}, // ush -> Arab
-    {0xA2540000u, 55u}, // usi -> Latn
-    {0xAA540000u, 55u}, // usk -> Latn
-    {0xBE540000u, 55u}, // usp -> Latn
-    {0xCA540000u, 55u}, // uss -> Latn
-    {0xD2540000u, 55u}, // usu -> Latn
-    {0x82740000u, 55u}, // uta -> Latn
-    {0x92740000u, 55u}, // ute -> Latn
-    {0x9E740000u, 55u}, // uth -> Latn
-    {0xBE740000u, 55u}, // utp -> Latn
-    {0xC6740000u, 55u}, // utr -> Latn
-    {0xD2740000u, 55u}, // utu -> Latn
-    {0xB2940000u, 30u}, // uum -> Grek
-    {0xC6940000u, 55u}, // uur -> Latn
-    {0x92B40000u, 55u}, // uve -> Latn
-    {0x9EB40000u, 55u}, // uvh -> Latn
-    {0xAEB40000u, 55u}, // uvl -> Latn
-    {0x82D40000u, 55u}, // uwa -> Latn
-    {0x83140000u, 55u}, // uya -> Latn
-    {0x757A0000u, 55u}, // uz -> Latn
-    {0x757A4146u,  2u}, // uz-AF -> Arab
-    {0x757A434Eu, 20u}, // uz-CN -> Cyrl
-    {0xCB340000u,  2u}, // uzs -> Arab
-    {0x80150000u, 105u}, // vaa -> Taml
-    {0x90150000u, 55u}, // vae -> Latn
-    {0x94150000u,  2u}, // vaf -> Arab
-    {0x98150000u, 55u}, // vag -> Latn
-    {0x9C150000u, 21u}, // vah -> Deva
-    {0xA0150000u, 116u}, // vai -> Vaii
-    {0xA4150000u, 55u}, // vaj -> Latn
-    {0xAC150000u, 55u}, // val -> Latn
-    {0xB0150000u, 55u}, // vam -> Latn
-    {0xB4150000u, 55u}, // van -> Latn
-    {0xB8150000u, 55u}, // vao -> Latn
-    {0xBC150000u, 55u}, // vap -> Latn
-    {0xC4150000u, 55u}, // var -> Latn
-    {0xC8150000u, 21u}, // vas -> Deva
-    {0xD0150000u, 55u}, // vau -> Latn
-    {0xD4150000u, 21u}, // vav -> Deva
-    {0xE0150000u, 21u}, // vay -> Deva
-    {0x84350000u, 55u}, // vbb -> Latn
-    {0xA8350000u, 55u}, // vbk -> Latn
-    {0x76650000u, 55u}, // ve -> Latn
-    {0x88950000u, 55u}, // vec -> Latn
-    {0xB0950000u, 55u}, // vem -> Latn
-    {0xB8950000u, 55u}, // veo -> Latn
-    {0xBC950000u, 55u}, // vep -> Latn
-    {0xC4950000u, 55u}, // ver -> Latn
-    {0xC4D50000u,  2u}, // vgr -> Arab
-    {0x76690000u, 55u}, // vi -> Latn
-    {0x89150000u, 55u}, // vic -> Latn
-    {0x8D150000u, 55u}, // vid -> Latn
-    {0x95150000u, 55u}, // vif -> Latn
-    {0x99150000u, 55u}, // vig -> Latn
-    {0xAD150000u, 55u}, // vil -> Latn
-    {0xB5150000u, 55u}, // vin -> Latn
-    {0xCD150000u, 55u}, // vit -> Latn
-    {0xD5150000u, 55u}, // viv -> Latn
-    {0xA9350000u, 21u}, // vjk -> Deva
-    {0x81550000u, 55u}, // vka -> Latn
-    {0xA5550000u, 55u}, // vkj -> Latn
-    {0xA9550000u, 55u}, // vkk -> Latn
-    {0xAD550000u, 55u}, // vkl -> Latn
-    {0xB1550000u, 55u}, // vkm -> Latn
-    {0xB5550000u, 55u}, // vkn -> Latn
-    {0xB9550000u, 55u}, // vko -> Latn
-    {0xBD550000u, 55u}, // vkp -> Latn
-    {0xCD550000u, 55u}, // vkt -> Latn
-    {0xD1550000u, 55u}, // vku -> Latn
-    {0xE5550000u, 55u}, // vkz -> Latn
-    {0xBD750000u, 55u}, // vlp -> Latn
-    {0xC9750000u, 55u}, // vls -> Latn
-    {0x81950000u, 55u}, // vma -> Latn
-    {0x85950000u, 55u}, // vmb -> Latn
-    {0x89950000u, 55u}, // vmc -> Latn
-    {0x8D950000u, 49u}, // vmd -> Knda
-    {0x91950000u, 55u}, // vme -> Latn
-    {0x95950000u, 55u}, // vmf -> Latn
-    {0x99950000u, 55u}, // vmg -> Latn
-    {0x9D950000u,  2u}, // vmh -> Arab
-    {0xA1950000u, 55u}, // vmi -> Latn
-    {0xA5950000u, 55u}, // vmj -> Latn
-    {0xA9950000u, 55u}, // vmk -> Latn
-    {0xAD950000u, 55u}, // vml -> Latn
-    {0xB1950000u, 55u}, // vmm -> Latn
-    {0xBD950000u, 55u}, // vmp -> Latn
-    {0xC1950000u, 55u}, // vmq -> Latn
-    {0xC5950000u, 55u}, // vmr -> Latn
-    {0xC9950000u, 55u}, // vms -> Latn
-    {0xD1950000u, 55u}, // vmu -> Latn
-    {0xD9950000u, 55u}, // vmw -> Latn
-    {0xDD950000u, 55u}, // vmx -> Latn
-    {0xE1950000u, 55u}, // vmy -> Latn
-    {0xE5950000u, 55u}, // vmz -> Latn
-    {0xA9B50000u, 55u}, // vnk -> Latn
-    {0xB1B50000u, 55u}, // vnm -> Latn
-    {0xBDB50000u, 55u}, // vnp -> Latn
-    {0x766F0000u, 55u}, // vo -> Latn
-    {0xC5D50000u, 55u}, // vor -> Latn
-    {0xCDD50000u, 55u}, // vot -> Latn
-    {0x82350000u, 55u}, // vra -> Latn
-    {0xBA350000u, 55u}, // vro -> Latn
-    {0xCA350000u, 55u}, // vrs -> Latn
-    {0xCE350000u, 55u}, // vrt -> Latn
-    {0xBA750000u, 55u}, // vto -> Latn
-    {0xB2950000u, 55u}, // vum -> Latn
-    {0xB6950000u, 55u}, // vun -> Latn
-    {0xCE950000u, 55u}, // vut -> Latn
-    {0x82D50000u, 55u}, // vwa -> Latn
-    {0x77610000u, 55u}, // wa -> Latn
-    {0x80160000u, 55u}, // waa -> Latn
-    {0x84160000u, 55u}, // wab -> Latn
-    {0x88160000u, 55u}, // wac -> Latn
-    {0x8C160000u, 55u}, // wad -> Latn
-    {0x90160000u, 55u}, // wae -> Latn
-    {0x94160000u, 55u}, // waf -> Latn
-    {0x98160000u, 55u}, // wag -> Latn
-    {0x9C160000u, 55u}, // wah -> Latn
-    {0xA0160000u, 55u}, // wai -> Latn
-    {0xA4160000u, 55u}, // waj -> Latn
-    {0xAC160000u, 24u}, // wal -> Ethi
-    {0xB0160000u, 55u}, // wam -> Latn
-    {0xB4160000u, 55u}, // wan -> Latn
-    {0xBC160000u, 55u}, // wap -> Latn
-    {0xC0160000u, 55u}, // waq -> Latn
-    {0xC4160000u, 55u}, // war -> Latn
-    {0xC8160000u, 55u}, // was -> Latn
-    {0xCC160000u, 55u}, // wat -> Latn
-    {0xD0160000u, 55u}, // wau -> Latn
-    {0xD4160000u, 55u}, // wav -> Latn
-    {0xD8160000u, 55u}, // waw -> Latn
-    {0xDC160000u, 55u}, // wax -> Latn
-    {0xE0160000u, 55u}, // way -> Latn
-    {0xE4160000u, 55u}, // waz -> Latn
-    {0x80360000u, 55u}, // wba -> Latn
-    {0x84360000u, 55u}, // wbb -> Latn
-    {0x90360000u, 55u}, // wbe -> Latn
-    {0x94360000u, 55u}, // wbf -> Latn
-    {0x9C360000u, 55u}, // wbh -> Latn
-    {0xA0360000u, 55u}, // wbi -> Latn
-    {0xA4360000u, 55u}, // wbj -> Latn
-    {0xA8360000u,  2u}, // wbk -> Arab
-    {0xAC360000u, 55u}, // wbl -> Latn
-    {0xB0360000u, 55u}, // wbm -> Latn
-    {0xBC360000u, 55u}, // wbp -> Latn
-    {0xC0360000u, 108u}, // wbq -> Telu
-    {0xC4360000u, 21u}, // wbr -> Deva
-    {0xCC360000u, 55u}, // wbt -> Latn
-    {0xD4360000u, 55u}, // wbv -> Latn
-    {0xD8360000u, 55u}, // wbw -> Latn
-    {0x80560000u, 55u}, // wca -> Latn
-    {0xA0560000u, 55u}, // wci -> Latn
-    {0x8C760000u, 55u}, // wdd -> Latn
-    {0x98760000u, 55u}, // wdg -> Latn
-    {0xA4760000u, 55u}, // wdj -> Latn
-    {0xA8760000u, 55u}, // wdk -> Latn
-    {0xCC760000u, 55u}, // wdt -> Latn
-    {0xD0760000u, 55u}, // wdu -> Latn
-    {0xE0760000u, 55u}, // wdy -> Latn
-    {0x88960000u, 55u}, // wec -> Latn
-    {0x8C960000u, 55u}, // wed -> Latn
-    {0x98960000u, 55u}, // weg -> Latn
-    {0x9C960000u, 55u}, // weh -> Latn
-    {0xA0960000u, 55u}, // wei -> Latn
-    {0xB0960000u, 55u}, // wem -> Latn
-    {0xB8960000u, 55u}, // weo -> Latn
-    {0xBC960000u, 55u}, // wep -> Latn
-    {0xC4960000u, 55u}, // wer -> Latn
-    {0xC8960000u, 55u}, // wes -> Latn
-    {0xCC960000u, 55u}, // wet -> Latn
-    {0xD0960000u, 55u}, // weu -> Latn
-    {0xD8960000u, 55u}, // wew -> Latn
-    {0x98B60000u, 55u}, // wfg -> Latn
-    {0x80D60000u, 55u}, // wga -> Latn
-    {0x84D60000u, 55u}, // wgb -> Latn
-    {0x98D60000u, 55u}, // wgg -> Latn
-    {0xA0D60000u, 55u}, // wgi -> Latn
-    {0xB8D60000u, 55u}, // wgo -> Latn
-    {0xD0D60000u, 55u}, // wgu -> Latn
-    {0xE0D60000u, 55u}, // wgy -> Latn
-    {0x80F60000u, 55u}, // wha -> Latn
-    {0x98F60000u, 55u}, // whg -> Latn
-    {0xA8F60000u, 55u}, // whk -> Latn
-    {0xD0F60000u, 55u}, // whu -> Latn
-    {0x85160000u, 55u}, // wib -> Latn
-    {0x89160000u, 55u}, // wic -> Latn
-    {0x91160000u, 55u}, // wie -> Latn
-    {0x95160000u, 55u}, // wif -> Latn
-    {0x99160000u, 55u}, // wig -> Latn
-    {0x9D160000u, 55u}, // wih -> Latn
-    {0xA1160000u, 55u}, // wii -> Latn
-    {0xA5160000u, 55u}, // wij -> Latn
-    {0xA9160000u, 55u}, // wik -> Latn
-    {0xAD160000u, 55u}, // wil -> Latn
-    {0xB1160000u, 55u}, // wim -> Latn
-    {0xB5160000u, 55u}, // win -> Latn
-    {0xC5160000u, 55u}, // wir -> Latn
-    {0xD1160000u, 55u}, // wiu -> Latn
-    {0xD5160000u, 55u}, // wiv -> Latn
-    {0xE1160000u, 55u}, // wiy -> Latn
-    {0x81360000u, 55u}, // wja -> Latn
-    {0xA1360000u, 55u}, // wji -> Latn
-    {0x81560000u, 55u}, // wka -> Latn
-    {0x8D560000u, 55u}, // wkd -> Latn
-    {0xC5560000u, 55u}, // wkr -> Latn
-    {0xD9560000u, 55u}, // wkw -> Latn
-    {0xE1560000u, 55u}, // wky -> Latn
-    {0x81760000u, 55u}, // wla -> Latn
-    {0x91760000u, 24u}, // wle -> Ethi
-    {0x99760000u, 55u}, // wlg -> Latn
-    {0x9D760000u, 55u}, // wlh -> Latn
-    {0xA1760000u, 55u}, // wli -> Latn
-    {0xB1760000u, 55u}, // wlm -> Latn
-    {0xB9760000u,  2u}, // wlo -> Arab
-    {0xC5760000u, 55u}, // wlr -> Latn
-    {0xC9760000u, 55u}, // wls -> Latn
-    {0xD1760000u, 55u}, // wlu -> Latn
-    {0xD5760000u, 55u}, // wlv -> Latn
-    {0xD9760000u, 55u}, // wlw -> Latn
-    {0xDD760000u, 55u}, // wlx -> Latn
-    {0x81960000u, 55u}, // wma -> Latn
-    {0x85960000u, 55u}, // wmb -> Latn
-    {0x89960000u, 55u}, // wmc -> Latn
-    {0x8D960000u, 55u}, // wmd -> Latn
-    {0x91960000u, 21u}, // wme -> Deva
-    {0x9D960000u, 55u}, // wmh -> Latn
-    {0xA1960000u, 55u}, // wmi -> Latn
-    {0xB1960000u, 55u}, // wmm -> Latn
-    {0xB5960000u, 55u}, // wmn -> Latn
-    {0xB9960000u, 55u}, // wmo -> Latn
-    {0xC9960000u, 55u}, // wms -> Latn
-    {0xCD960000u, 55u}, // wmt -> Latn
-    {0xD9960000u, 55u}, // wmw -> Latn
-    {0xDD960000u, 55u}, // wmx -> Latn
-    {0x85B60000u, 55u}, // wnb -> Latn
-    {0x89B60000u, 55u}, // wnc -> Latn
-    {0x8DB60000u, 55u}, // wnd -> Latn
-    {0x91B60000u,  2u}, // wne -> Arab
-    {0x99B60000u, 55u}, // wng -> Latn
-    {0xA1B60000u,  2u}, // wni -> Arab
-    {0xA9B60000u, 55u}, // wnk -> Latn
-    {0xB1B60000u, 55u}, // wnm -> Latn
-    {0xB5B60000u, 55u}, // wnn -> Latn
-    {0xB9B60000u, 55u}, // wno -> Latn
-    {0xBDB60000u, 55u}, // wnp -> Latn
-    {0xD1B60000u, 55u}, // wnu -> Latn
-    {0xD9B60000u, 55u}, // wnw -> Latn
-    {0xE1B60000u, 55u}, // wny -> Latn
-    {0x776F0000u, 55u}, // wo -> Latn
-    {0x81D60000u, 55u}, // woa -> Latn
-    {0x85D60000u, 55u}, // wob -> Latn
-    {0x89D60000u, 55u}, // woc -> Latn
-    {0x8DD60000u, 55u}, // wod -> Latn
-    {0x91D60000u, 55u}, // woe -> Latn
-    {0x95D60000u, 55u}, // wof -> Latn
-    {0x99D60000u, 55u}, // wog -> Latn
-    {0xA1D60000u, 55u}, // woi -> Latn
-    {0xA9D60000u, 55u}, // wok -> Latn
-    {0xB1D60000u, 55u}, // wom -> Latn
-    {0xB5D60000u, 55u}, // won -> Latn
-    {0xB9D60000u, 55u}, // woo -> Latn
-    {0xC5D60000u, 55u}, // wor -> Latn
-    {0xC9D60000u, 55u}, // wos -> Latn
-    {0xD9D60000u, 55u}, // wow -> Latn
-    {0x89F60000u, 55u}, // wpc -> Latn
-    {0x86360000u, 55u}, // wrb -> Latn
-    {0x9A360000u, 55u}, // wrg -> Latn
-    {0x9E360000u, 55u}, // wrh -> Latn
-    {0xA2360000u, 55u}, // wri -> Latn
-    {0xAA360000u, 55u}, // wrk -> Latn
-    {0xAE360000u, 55u}, // wrl -> Latn
-    {0xB2360000u, 55u}, // wrm -> Latn
-    {0xBA360000u, 55u}, // wro -> Latn
-    {0xBE360000u, 55u}, // wrp -> Latn
-    {0xC6360000u, 55u}, // wrr -> Latn
-    {0xCA360000u, 55u}, // wrs -> Latn
-    {0xD2360000u, 55u}, // wru -> Latn
-    {0xD6360000u, 55u}, // wrv -> Latn
-    {0xDA360000u, 55u}, // wrw -> Latn
-    {0xDE360000u, 55u}, // wrx -> Latn
-    {0xE6360000u, 55u}, // wrz -> Latn
-    {0x82560000u, 55u}, // wsa -> Latn
-    {0x9A560000u, 26u}, // wsg -> Gong
-    {0xA2560000u, 55u}, // wsi -> Latn
-    {0xAA560000u, 55u}, // wsk -> Latn
-    {0xC6560000u, 55u}, // wsr -> Latn
-    {0xCA560000u, 55u}, // wss -> Latn
-    {0xD2560000u, 55u}, // wsu -> Latn
-    {0xD6560000u,  2u}, // wsv -> Arab
-    {0x86760000u, 55u}, // wtb -> Latn
-    {0x96760000u, 55u}, // wtf -> Latn
-    {0x9E760000u, 55u}, // wth -> Latn
-    {0xA2760000u, 55u}, // wti -> Latn
-    {0xAA760000u, 55u}, // wtk -> Latn
-    {0xB2760000u, 21u}, // wtm -> Deva
-    {0xDA760000u, 55u}, // wtw -> Latn
-    {0x82960000u, 55u}, // wua -> Latn
-    {0x86960000u, 55u}, // wub -> Latn
-    {0x8E960000u, 55u}, // wud -> Latn
-    {0xAE960000u, 55u}, // wul -> Latn
-    {0xB2960000u, 55u}, // wum -> Latn
-    {0xB6960000u, 55u}, // wun -> Latn
-    {0xC6960000u, 55u}, // wur -> Latn
-    {0xCE960000u, 55u}, // wut -> Latn
-    {0xD2960000u, 35u}, // wuu -> Hans
-    {0xD6960000u, 55u}, // wuv -> Latn
-    {0xDE960000u, 55u}, // wux -> Latn
-    {0xE2960000u, 55u}, // wuy -> Latn
-    {0x82D60000u, 55u}, // wwa -> Latn
-    {0x86D60000u, 55u}, // wwb -> Latn
-    {0xBAD60000u, 55u}, // wwo -> Latn
-    {0xC6D60000u, 55u}, // wwr -> Latn
-    {0xDAD60000u, 55u}, // www -> Latn
-    {0xDAF60000u, 55u}, // wxw -> Latn
-    {0x87160000u, 55u}, // wyb -> Latn
-    {0xA3160000u, 55u}, // wyi -> Latn
-    {0xB3160000u, 55u}, // wym -> Latn
-    {0xB7160000u, 55u}, // wyn -> Latn
-    {0xC7160000u, 55u}, // wyr -> Latn
-    {0xE3160000u, 55u}, // wyy -> Latn
-    {0x80170000u, 55u}, // xaa -> Latn
-    {0x84170000u, 55u}, // xab -> Latn
-    {0x98170000u,  0u}, // xag -> Aghb
-    {0xA0170000u, 55u}, // xai -> Latn
-    {0xA4170000u, 55u}, // xaj -> Latn
-    {0xA8170000u, 55u}, // xak -> Latn
-    {0xAC170000u, 20u}, // xal -> Cyrl
-    {0xB0170000u, 55u}, // xam -> Latn
-    {0xB4170000u, 24u}, // xan -> Ethi
-    {0xB8170000u, 55u}, // xao -> Latn
-    {0xC4170000u, 55u}, // xar -> Latn
-    {0xC8170000u, 20u}, // xas -> Cyrl
-    {0xCC170000u, 55u}, // xat -> Latn
-    {0xD0170000u, 55u}, // xau -> Latn
-    {0xD4170000u, 55u}, // xav -> Latn
-    {0xD8170000u, 55u}, // xaw -> Latn
-    {0xE0170000u, 55u}, // xay -> Latn
-    {0x84370000u, 55u}, // xbb -> Latn
-    {0x8C370000u, 55u}, // xbd -> Latn
-    {0x90370000u, 55u}, // xbe -> Latn
-    {0x98370000u, 55u}, // xbg -> Latn
-    {0xA0370000u, 55u}, // xbi -> Latn
-    {0xA4370000u, 55u}, // xbj -> Latn
-    {0xB0370000u, 55u}, // xbm -> Latn
-    {0xB4370000u, 55u}, // xbn -> Latn
-    {0xBC370000u, 55u}, // xbp -> Latn
-    {0xC4370000u, 55u}, // xbr -> Latn
-    {0xD8370000u, 55u}, // xbw -> Latn
-    {0xE0370000u, 55u}, // xby -> Latn
-    {0x9C570000u, 55u}, // xch -> Latn
-    {0xB8570000u, 17u}, // xco -> Chrs
-    {0xC4570000u, 14u}, // xcr -> Cari
-    {0x80770000u, 55u}, // xda -> Latn
-    {0xA8770000u, 55u}, // xdk -> Latn
-    {0xB8770000u, 55u}, // xdo -> Latn
-    {0xC0770000u, 20u}, // xdq -> Cyrl
-    {0xE0770000u, 55u}, // xdy -> Latn
-    {0x8C970000u, 55u}, // xed -> Latn
-    {0x98970000u, 55u}, // xeg -> Latn
-    {0xB0970000u, 55u}, // xem -> Latn
-    {0xC4970000u, 55u}, // xer -> Latn
-    {0xC8970000u, 55u}, // xes -> Latn
-    {0xCC970000u, 55u}, // xet -> Latn
-    {0xD0970000u, 55u}, // xeu -> Latn
-    {0x84D70000u, 55u}, // xgb -> Latn
-    {0x8CD70000u, 55u}, // xgd -> Latn
-    {0x98D70000u, 55u}, // xgg -> Latn
-    {0xA0D70000u, 55u}, // xgi -> Latn
-    {0xB0D70000u, 55u}, // xgm -> Latn
-    {0xD0D70000u, 55u}, // xgu -> Latn
-    {0xD8D70000u, 55u}, // xgw -> Latn
-    {0x78680000u, 55u}, // xh -> Latn
-    {0x90F70000u,  2u}, // xhe -> Arab
-    {0xB0F70000u, 47u}, // xhm -> Khmr
-    {0xD4F70000u, 55u}, // xhv -> Latn
-    {0xA1170000u, 55u}, // xii -> Latn
-    {0xB5170000u, 55u}, // xin -> Latn
-    {0xC5170000u, 55u}, // xir -> Latn
-    {0xC9170000u, 80u}, // xis -> Orya
-    {0xE1170000u, 55u}, // xiy -> Latn
-    {0x85370000u, 55u}, // xjb -> Latn
-    {0xCD370000u, 55u}, // xjt -> Latn
-    {0x81570000u,  2u}, // xka -> Arab
-    {0x85570000u, 55u}, // xkb -> Latn
-    {0x89570000u,  2u}, // xkc -> Arab
-    {0x8D570000u, 55u}, // xkd -> Latn
-    {0x91570000u, 55u}, // xke -> Latn
-    {0x95570000u, 112u}, // xkf -> Tibt
-    {0x99570000u, 55u}, // xkg -> Latn
-    {0xA5570000u,  2u}, // xkj -> Arab
-    {0xAD570000u, 55u}, // xkl -> Latn
-    {0xB5570000u, 55u}, // xkn -> Latn
-    {0xBD570000u,  2u}, // xkp -> Arab
-    {0xC1570000u, 55u}, // xkq -> Latn
-    {0xC5570000u, 55u}, // xkr -> Latn
-    {0xC9570000u, 55u}, // xks -> Latn
-    {0xCD570000u, 55u}, // xkt -> Latn
-    {0xD1570000u, 55u}, // xku -> Latn
-    {0xD5570000u, 55u}, // xkv -> Latn
-    {0xD9570000u, 55u}, // xkw -> Latn
-    {0xDD570000u, 55u}, // xkx -> Latn
-    {0xE1570000u, 55u}, // xky -> Latn
-    {0xE5570000u, 55u}, // xkz -> Latn
-    {0x81770000u, 55u}, // xla -> Latn
-    {0x89770000u, 60u}, // xlc -> Lyci
-    {0x8D770000u, 61u}, // xld -> Lydi
-    {0xE1770000u, 23u}, // xly -> Elym
-    {0x81970000u, 55u}, // xma -> Latn
-    {0x85970000u, 55u}, // xmb -> Latn
-    {0x89970000u, 55u}, // xmc -> Latn
-    {0x8D970000u, 55u}, // xmd -> Latn
-    {0x95970000u, 25u}, // xmf -> Geor
-    {0x99970000u, 55u}, // xmg -> Latn
-    {0x9D970000u, 55u}, // xmh -> Latn
-    {0xA5970000u, 55u}, // xmj -> Latn
-    {0xB1970000u, 55u}, // xmm -> Latn
-    {0xB5970000u, 63u}, // xmn -> Mani
-    {0xB9970000u, 55u}, // xmo -> Latn
-    {0xBD970000u, 55u}, // xmp -> Latn
-    {0xC1970000u, 55u}, // xmq -> Latn
-    {0xC5970000u, 66u}, // xmr -> Merc
-    {0xCD970000u, 55u}, // xmt -> Latn
-    {0xD1970000u, 55u}, // xmu -> Latn
-    {0xD5970000u, 55u}, // xmv -> Latn
-    {0xD9970000u, 55u}, // xmw -> Latn
-    {0xDD970000u, 55u}, // xmx -> Latn
-    {0xE1970000u, 55u}, // xmy -> Latn
-    {0xE5970000u, 55u}, // xmz -> Latn
-    {0x81B70000u, 73u}, // xna -> Narb
-    {0x85B70000u, 55u}, // xnb -> Latn
-    {0xA1B70000u, 55u}, // xni -> Latn
-    {0xA5B70000u, 55u}, // xnj -> Latn
-    {0xA9B70000u, 55u}, // xnk -> Latn
-    {0xB1B70000u, 55u}, // xnm -> Latn
-    {0xB5B70000u, 55u}, // xnn -> Latn
-    {0xC1B70000u, 55u}, // xnq -> Latn
-    {0xC5B70000u, 21u}, // xnr -> Deva
-    {0xCDB70000u, 55u}, // xnt -> Latn
-    {0xD1B70000u, 55u}, // xnu -> Latn
-    {0xE1B70000u, 55u}, // xny -> Latn
-    {0xE5B70000u, 55u}, // xnz -> Latn
-    {0x89D70000u, 55u}, // xoc -> Latn
-    {0x8DD70000u, 55u}, // xod -> Latn
-    {0x99D70000u, 55u}, // xog -> Latn
-    {0xA1D70000u, 55u}, // xoi -> Latn
-    {0xA9D70000u, 55u}, // xok -> Latn
-    {0xB1D70000u, 55u}, // xom -> Latn
-    {0xB5D70000u, 55u}, // xon -> Latn
-    {0xB9D70000u, 55u}, // xoo -> Latn
-    {0xBDD70000u, 55u}, // xop -> Latn
-    {0xC5D70000u, 55u}, // xor -> Latn
-    {0xD9D70000u, 55u}, // xow -> Latn
-    {0x81F70000u, 55u}, // xpa -> Latn
-    {0x85F70000u, 55u}, // xpb -> Latn
-    {0x8DF70000u, 55u}, // xpd -> Latn
-    {0x95F70000u, 55u}, // xpf -> Latn
-    {0x99F70000u, 30u}, // xpg -> Grek
-    {0x9DF70000u, 55u}, // xph -> Latn
-    {0xA1F70000u, 77u}, // xpi -> Ogam
-    {0xA5F70000u, 55u}, // xpj -> Latn
-    {0xA9F70000u, 55u}, // xpk -> Latn
-    {0xADF70000u, 55u}, // xpl -> Latn
-    {0xB1F70000u, 20u}, // xpm -> Cyrl
-    {0xB5F70000u, 55u}, // xpn -> Latn
-    {0xB9F70000u, 55u}, // xpo -> Latn
-    {0xC1F70000u, 55u}, // xpq -> Latn
-    {0xC5F70000u, 87u}, // xpr -> Prti
-    {0xCDF70000u, 55u}, // xpt -> Latn
-    {0xD5F70000u, 55u}, // xpv -> Latn
-    {0xD9F70000u, 55u}, // xpw -> Latn
-    {0xDDF70000u, 55u}, // xpx -> Latn
-    {0xE5F70000u, 55u}, // xpz -> Latn
-    {0x82370000u, 55u}, // xra -> Latn
-    {0x86370000u, 55u}, // xrb -> Latn
-    {0x8E370000u, 55u}, // xrd -> Latn
-    {0x92370000u, 55u}, // xre -> Latn
-    {0x9A370000u, 55u}, // xrg -> Latn
-    {0xA2370000u, 55u}, // xri -> Latn
-    {0xB2370000u, 20u}, // xrm -> Cyrl
-    {0xB6370000u, 20u}, // xrn -> Cyrl
-    {0xC6370000u, 55u}, // xrr -> Latn
-    {0xD2370000u, 55u}, // xru -> Latn
-    {0xDA370000u, 55u}, // xrw -> Latn
-    {0x82570000u, 92u}, // xsa -> Sarb
-    {0x86570000u, 55u}, // xsb -> Latn
-    {0x92570000u, 55u}, // xse -> Latn
-    {0x9E570000u, 55u}, // xsh -> Latn
-    {0xA2570000u, 55u}, // xsi -> Latn
-    {0xB2570000u, 55u}, // xsm -> Latn
-    {0xB6570000u, 55u}, // xsn -> Latn
-    {0xBE570000u, 55u}, // xsp -> Latn
-    {0xC2570000u, 55u}, // xsq -> Latn
-    {0xC6570000u, 21u}, // xsr -> Deva
-    {0xD2570000u, 55u}, // xsu -> Latn
-    {0xE2570000u, 55u}, // xsy -> Latn
-    {0x82770000u, 55u}, // xta -> Latn
-    {0x86770000u, 55u}, // xtb -> Latn
-    {0x8A770000u, 55u}, // xtc -> Latn
-    {0x8E770000u, 55u}, // xtd -> Latn
-    {0x92770000u, 55u}, // xte -> Latn
-    {0x9E770000u, 55u}, // xth -> Latn
-    {0xA2770000u, 55u}, // xti -> Latn
-    {0xA6770000u, 55u}, // xtj -> Latn
-    {0xAE770000u, 55u}, // xtl -> Latn
-    {0xB2770000u, 55u}, // xtm -> Latn
-    {0xB6770000u, 55u}, // xtn -> Latn
-    {0xBE770000u, 55u}, // xtp -> Latn
-    {0xC2770000u, 11u}, // xtq -> Brah
-    {0xCA770000u, 55u}, // xts -> Latn
-    {0xCE770000u, 55u}, // xtt -> Latn
-    {0xD2770000u, 55u}, // xtu -> Latn
-    {0xD6770000u, 55u}, // xtv -> Latn
-    {0xDA770000u, 55u}, // xtw -> Latn
-    {0xE2770000u, 55u}, // xty -> Latn
-    {0x86970000u, 105u}, // xub -> Taml
-    {0x8E970000u, 55u}, // xud -> Latn
-    {0xA6970000u, 105u}, // xuj -> Taml
-    {0xAE970000u, 55u}, // xul -> Latn
-    {0xB2970000u, 55u}, // xum -> Latn
-    {0xB6970000u, 55u}, // xun -> Latn
-    {0xBA970000u, 55u}, // xuo -> Latn
-    {0xCE970000u, 55u}, // xut -> Latn
-    {0xD2970000u, 55u}, // xuu -> Latn
-    {0x92B70000u, 40u}, // xve -> Ital
-    {0xA2B70000u,  2u}, // xvi -> Arab
-    {0xB6B70000u, 55u}, // xvn -> Latn
-    {0xBAB70000u, 55u}, // xvo -> Latn
-    {0xCAB70000u, 55u}, // xvs -> Latn
-    {0x82D70000u, 55u}, // xwa -> Latn
-    {0x8ED70000u, 55u}, // xwd -> Latn
-    {0x92D70000u, 55u}, // xwe -> Latn
-    {0xA6D70000u, 55u}, // xwj -> Latn
-    {0xAAD70000u, 55u}, // xwk -> Latn
-    {0xAED70000u, 55u}, // xwl -> Latn
-    {0xBAD70000u, 20u}, // xwo -> Cyrl
-    {0xC6D70000u, 55u}, // xwr -> Latn
-    {0xCED70000u, 55u}, // xwt -> Latn
-    {0xDAD70000u, 55u}, // xww -> Latn
-    {0x86F70000u, 55u}, // xxb -> Latn
-    {0xAAF70000u, 55u}, // xxk -> Latn
-    {0xB2F70000u, 55u}, // xxm -> Latn
-    {0xC6F70000u, 55u}, // xxr -> Latn
-    {0xCEF70000u, 55u}, // xxt -> Latn
-    {0x83170000u, 55u}, // xya -> Latn
-    {0x87170000u, 55u}, // xyb -> Latn
-    {0xA7170000u, 55u}, // xyj -> Latn
-    {0xAB170000u, 55u}, // xyk -> Latn
-    {0xAF170000u, 55u}, // xyl -> Latn
-    {0xCF170000u, 55u}, // xyt -> Latn
-    {0xE3170000u, 55u}, // xyy -> Latn
-    {0x9F370000u, 64u}, // xzh -> Marc
-    {0xBF370000u, 55u}, // xzp -> Latn
-    {0x80180000u, 55u}, // yaa -> Latn
-    {0x84180000u, 55u}, // yab -> Latn
-    {0x88180000u, 55u}, // yac -> Latn
-    {0x8C180000u, 55u}, // yad -> Latn
-    {0x90180000u, 55u}, // yae -> Latn
-    {0x94180000u, 55u}, // yaf -> Latn
-    {0x98180000u, 55u}, // yag -> Latn
-    {0x9C180000u, 55u}, // yah -> Latn
-    {0xA0180000u, 20u}, // yai -> Cyrl
-    {0xA4180000u, 55u}, // yaj -> Latn
-    {0xA8180000u, 55u}, // yak -> Latn
-    {0xAC180000u, 55u}, // yal -> Latn
-    {0xB0180000u, 55u}, // yam -> Latn
-    {0xB4180000u, 55u}, // yan -> Latn
-    {0xB8180000u, 55u}, // yao -> Latn
-    {0xBC180000u, 55u}, // yap -> Latn
-    {0xC0180000u, 55u}, // yaq -> Latn
-    {0xC4180000u, 55u}, // yar -> Latn
-    {0xC8180000u, 55u}, // yas -> Latn
-    {0xCC180000u, 55u}, // yat -> Latn
-    {0xD0180000u, 55u}, // yau -> Latn
-    {0xD4180000u, 55u}, // yav -> Latn
-    {0xD8180000u, 55u}, // yaw -> Latn
-    {0xDC180000u, 55u}, // yax -> Latn
-    {0xE0180000u, 55u}, // yay -> Latn
-    {0xE4180000u, 55u}, // yaz -> Latn
-    {0x80380000u, 55u}, // yba -> Latn
-    {0x84380000u, 55u}, // ybb -> Latn
-    {0x90380000u, 55u}, // ybe -> Latn
-    {0x9C380000u, 21u}, // ybh -> Deva
-    {0xA0380000u, 21u}, // ybi -> Deva
-    {0xA4380000u, 55u}, // ybj -> Latn
-    {0xAC380000u, 55u}, // ybl -> Latn
-    {0xB0380000u, 55u}, // ybm -> Latn
-    {0xB4380000u, 55u}, // ybn -> Latn
-    {0xB8380000u, 55u}, // ybo -> Latn
-    {0xDC380000u, 55u}, // ybx -> Latn
-    {0xE0380000u, 55u}, // yby -> Latn
-    {0xAC580000u, 55u}, // ycl -> Latn
-    {0xB4580000u, 55u}, // ycn -> Latn
-    {0xC4580000u, 55u}, // ycr -> Latn
-    {0x80780000u, 55u}, // yda -> Latn
-    {0x90780000u, 55u}, // yde -> Latn
-    {0x98780000u,  2u}, // ydg -> Arab
-    {0xA8780000u, 55u}, // ydk -> Latn
-    {0x80980000u, 67u}, // yea -> Mlym
-    {0x88980000u, 55u}, // yec -> Latn
-    {0x90980000u, 55u}, // yee -> Latn
-    {0xA0980000u, 55u}, // yei -> Latn
-    {0xA4980000u, 30u}, // yej -> Grek
-    {0xAC980000u, 55u}, // yel -> Latn
-    {0xC4980000u, 55u}, // yer -> Latn
-    {0xC8980000u, 55u}, // yes -> Latn
-    {0xCC980000u, 55u}, // yet -> Latn
-    {0xD0980000u, 108u}, // yeu -> Telu
-    {0xD4980000u, 55u}, // yev -> Latn
-    {0xE0980000u, 55u}, // yey -> Latn
-    {0x80D80000u, 55u}, // yga -> Latn
-    {0xA0D80000u, 55u}, // ygi -> Latn
-    {0xACD80000u, 55u}, // ygl -> Latn
-    {0xB0D80000u, 55u}, // ygm -> Latn
-    {0xBCD80000u, 86u}, // ygp -> Plrd
-    {0xC4D80000u, 55u}, // ygr -> Latn
-    {0xD0D80000u, 55u}, // ygu -> Latn
-    {0xD8D80000u, 55u}, // ygw -> Latn
-    {0x8CF80000u, 37u}, // yhd -> Hebr
-    {0x79690000u, 37u}, // yi -> Hebr
-    {0x81180000u, 55u}, // yia -> Latn
-    {0x99180000u, 120u}, // yig -> Yiii
-    {0x9D180000u, 37u}, // yih -> Hebr
-    {0xA1180000u, 55u}, // yii -> Latn
-    {0xA5180000u, 55u}, // yij -> Latn
-    {0xAD180000u, 55u}, // yil -> Latn
-    {0xB1180000u, 55u}, // yim -> Latn
-    {0xC5180000u, 55u}, // yir -> Latn
-    {0xC9180000u, 55u}, // yis -> Latn
-    {0xD5180000u, 120u}, // yiv -> Yiii
-    {0x81580000u, 55u}, // yka -> Latn
-    {0x99580000u, 20u}, // ykg -> Cyrl
-    {0x9D580000u, 20u}, // ykh -> Cyrl
-    {0xA1580000u, 55u}, // yki -> Latn
-    {0xA9580000u, 55u}, // ykk -> Latn
-    {0xB1580000u, 55u}, // ykm -> Latn
-    {0xB9580000u, 55u}, // yko -> Latn
-    {0xC5580000u, 55u}, // ykr -> Latn
-    {0xE1580000u, 55u}, // yky -> Latn
-    {0x81780000u, 55u}, // yla -> Latn
-    {0x85780000u, 55u}, // ylb -> Latn
-    {0x91780000u, 55u}, // yle -> Latn
-    {0x99780000u, 55u}, // ylg -> Latn
-    {0xA1780000u, 55u}, // yli -> Latn
-    {0xAD780000u, 55u}, // yll -> Latn
-    {0xC5780000u, 55u}, // ylr -> Latn
-    {0xD1780000u, 55u}, // ylu -> Latn
-    {0xE1780000u, 55u}, // yly -> Latn
-    {0x85980000u, 55u}, // ymb -> Latn
-    {0x91980000u, 55u}, // yme -> Latn
-    {0x99980000u, 55u}, // ymg -> Latn
-    {0xA9980000u, 55u}, // ymk -> Latn
-    {0xAD980000u, 55u}, // yml -> Latn
-    {0xB1980000u, 55u}, // ymm -> Latn
-    {0xB5980000u, 55u}, // ymn -> Latn
-    {0xB9980000u, 55u}, // ymo -> Latn
-    {0xBD980000u, 55u}, // ymp -> Latn
-    {0x81B80000u, 86u}, // yna -> Plrd
-    {0x8DB80000u, 55u}, // ynd -> Latn
-    {0x99B80000u, 55u}, // yng -> Latn
-    {0xA9B80000u, 20u}, // ynk -> Cyrl
-    {0xADB80000u, 55u}, // ynl -> Latn
-    {0xC1B80000u, 55u}, // ynq -> Latn
-    {0xC9B80000u, 55u}, // yns -> Latn
-    {0xD1B80000u, 55u}, // ynu -> Latn
-    {0x796F0000u, 55u}, // yo -> Latn
-    {0x85D80000u, 55u}, // yob -> Latn
-    {0x99D80000u, 55u}, // yog -> Latn
-    {0xA1D80000u, 42u}, // yoi -> Jpan
-    {0xA9D80000u, 55u}, // yok -> Latn
-    {0xADD80000u, 55u}, // yol -> Latn
-    {0xB1D80000u, 55u}, // yom -> Latn
-    {0xB5D80000u, 55u}, // yon -> Latn
-    {0xCDD80000u, 55u}, // yot -> Latn
-    {0xE1D80000u, 111u}, // yoy -> Thai
-    {0x82380000u, 55u}, // yra -> Latn
-    {0x86380000u, 55u}, // yrb -> Latn
-    {0x92380000u, 55u}, // yre -> Latn
-    {0xAA380000u, 20u}, // yrk -> Cyrl
-    {0xAE380000u, 55u}, // yrl -> Latn
-    {0xB2380000u, 55u}, // yrm -> Latn
-    {0xBA380000u, 55u}, // yro -> Latn
-    {0xCA380000u, 55u}, // yrs -> Latn
-    {0xDA380000u, 55u}, // yrw -> Latn
-    {0xE2380000u, 55u}, // yry -> Latn
-    {0x8E580000u, 120u}, // ysd -> Yiii
-    {0xB6580000u, 120u}, // ysn -> Yiii
-    {0xBE580000u, 120u}, // ysp -> Yiii
-    {0xC6580000u, 20u}, // ysr -> Cyrl
-    {0xCA580000u, 55u}, // yss -> Latn
-    {0xE2580000u, 86u}, // ysy -> Plrd
-    {0xDA780000u, 55u}, // ytw -> Latn
-    {0xE2780000u, 55u}, // yty -> Latn
-    {0x82980000u, 55u}, // yua -> Latn
-    {0x86980000u, 55u}, // yub -> Latn
-    {0x8A980000u, 55u}, // yuc -> Latn
-    {0x8E980000u, 37u}, // yud -> Hebr
-    {0x92980000u, 36u}, // yue -> Hant
-    {0x9298434Eu, 35u}, // yue-CN -> Hans
-    {0x96980000u, 55u}, // yuf -> Latn
-    {0x9A980000u, 20u}, // yug -> Cyrl
-    {0xA2980000u, 55u}, // yui -> Latn
-    {0xA6980000u, 55u}, // yuj -> Latn
-    {0xAE980000u, 55u}, // yul -> Latn
-    {0xB2980000u, 55u}, // yum -> Latn
-    {0xB6980000u, 55u}, // yun -> Latn
-    {0xBE980000u, 55u}, // yup -> Latn
-    {0xC2980000u, 55u}, // yuq -> Latn
-    {0xC6980000u, 55u}, // yur -> Latn
-    {0xCE980000u, 55u}, // yut -> Latn
-    {0xDA980000u, 55u}, // yuw -> Latn
-    {0xDE980000u, 20u}, // yux -> Cyrl
-    {0xE6980000u, 55u}, // yuz -> Latn
-    {0x82B80000u, 55u}, // yva -> Latn
-    {0xCEB80000u, 55u}, // yvt -> Latn
-    {0x82D80000u, 55u}, // ywa -> Latn
-    {0x9AD80000u, 55u}, // ywg -> Latn
-    {0xB6D80000u, 55u}, // ywn -> Latn
-    {0xC2D80000u, 86u}, // ywq -> Plrd
-    {0xC6D80000u, 55u}, // ywr -> Latn
-    {0xD2D80000u, 86u}, // ywu -> Plrd
-    {0xDAD80000u, 55u}, // yww -> Latn
-    {0x82F80000u, 55u}, // yxa -> Latn
-    {0x9AF80000u, 55u}, // yxg -> Latn
-    {0xAEF80000u, 55u}, // yxl -> Latn
-    {0xB2F80000u, 55u}, // yxm -> Latn
-    {0xD2F80000u, 55u}, // yxu -> Latn
-    {0xE2F80000u, 55u}, // yxy -> Latn
-    {0xC7180000u, 55u}, // yyr -> Latn
-    {0xD3180000u, 55u}, // yyu -> Latn
-    {0x7A610000u, 55u}, // za -> Latn
-    {0x80190000u, 55u}, // zaa -> Latn
-    {0x84190000u, 55u}, // zab -> Latn
-    {0x88190000u, 55u}, // zac -> Latn
-    {0x8C190000u, 55u}, // zad -> Latn
-    {0x90190000u, 55u}, // zae -> Latn
-    {0x94190000u, 55u}, // zaf -> Latn
-    {0x98190000u, 55u}, // zag -> Latn
-    {0x9C190000u, 55u}, // zah -> Latn
-    {0xA4190000u, 55u}, // zaj -> Latn
-    {0xA8190000u, 55u}, // zak -> Latn
-    {0xB0190000u, 55u}, // zam -> Latn
-    {0xB8190000u, 55u}, // zao -> Latn
-    {0xBC190000u, 55u}, // zap -> Latn
-    {0xC0190000u, 55u}, // zaq -> Latn
-    {0xC4190000u, 55u}, // zar -> Latn
-    {0xC8190000u, 55u}, // zas -> Latn
-    {0xCC190000u, 55u}, // zat -> Latn
-    {0xD0190000u, 112u}, // zau -> Tibt
-    {0xD4190000u, 55u}, // zav -> Latn
-    {0xD8190000u, 55u}, // zaw -> Latn
-    {0xDC190000u, 55u}, // zax -> Latn
-    {0xE0190000u, 55u}, // zay -> Latn
-    {0xE4190000u, 55u}, // zaz -> Latn
-    {0x80390000u,  2u}, // zba -> Arab
-    {0x88390000u, 55u}, // zbc -> Latn
-    {0x90390000u, 55u}, // zbe -> Latn
-    {0xCC390000u, 55u}, // zbt -> Latn
-    {0xD0390000u, 55u}, // zbu -> Latn
-    {0xD8390000u, 55u}, // zbw -> Latn
-    {0x80590000u, 55u}, // zca -> Latn
-    {0x9C590000u, 34u}, // zch -> Hani
-    {0xA4790000u,  2u}, // zdj -> Arab
-    {0x80990000u, 55u}, // zea -> Latn
-    {0x98990000u, 55u}, // zeg -> Latn
-    {0x9C990000u, 34u}, // zeh -> Hani
-    {0xB0990000u, 55u}, // zem -> Latn
-    {0xB4990000u, 109u}, // zen -> Tfng
-    {0x80D90000u, 55u}, // zga -> Latn
-    {0x84D90000u, 34u}, // zgb -> Hani
-    {0x9CD90000u, 109u}, // zgh -> Tfng
-    {0xB0D90000u, 34u}, // zgm -> Hani
-    {0xB4D90000u, 34u}, // zgn -> Hani
-    {0xC4D90000u, 55u}, // zgr -> Latn
-    {0x7A680000u, 35u}, // zh -> Hans
-    {0x7A684155u, 36u}, // zh-AU -> Hant
-    {0x7A68424Eu, 36u}, // zh-BN -> Hant
-    {0x7A684742u, 36u}, // zh-GB -> Hant
-    {0x7A684746u, 36u}, // zh-GF -> Hant
-    {0x7A68484Bu, 36u}, // zh-HK -> Hant
-    {0x7A684944u, 36u}, // zh-ID -> Hant
-    {0x7A684D4Fu, 36u}, // zh-MO -> Hant
-    {0x7A685041u, 36u}, // zh-PA -> Hant
-    {0x7A685046u, 36u}, // zh-PF -> Hant
-    {0x7A685048u, 36u}, // zh-PH -> Hant
-    {0x7A685352u, 36u}, // zh-SR -> Hant
-    {0x7A685448u, 36u}, // zh-TH -> Hant
-    {0x7A685457u, 36u}, // zh-TW -> Hant
-    {0x7A685553u, 36u}, // zh-US -> Hant
-    {0x7A68564Eu, 36u}, // zh-VN -> Hant
-    {0x8CF90000u, 34u}, // zhd -> Hani
-    {0xA0F90000u, 55u}, // zhi -> Latn
-    {0xB4F90000u, 55u}, // zhn -> Latn
-    {0xD8F90000u, 55u}, // zhw -> Latn
-    {0xDCF90000u, 76u}, // zhx -> Nshu
-    {0x81190000u, 55u}, // zia -> Latn
-    {0xA9190000u, 55u}, // zik -> Latn
-    {0xAD190000u, 55u}, // zil -> Latn
-    {0xB1190000u, 55u}, // zim -> Latn
-    {0xB5190000u, 55u}, // zin -> Latn
-    {0xD9190000u, 55u}, // ziw -> Latn
-    {0xE5190000u, 55u}, // ziz -> Latn
-    {0x81590000u, 55u}, // zka -> Latn
-    {0x8D590000u, 55u}, // zkd -> Latn
-    {0xB9590000u, 20u}, // zko -> Cyrl
-    {0xBD590000u, 55u}, // zkp -> Latn
-    {0xCD590000u, 48u}, // zkt -> Kits
-    {0xD1590000u, 55u}, // zku -> Latn
-    {0xE5590000u, 20u}, // zkz -> Cyrl
-    {0x81790000u, 55u}, // zla -> Latn
-    {0xA5790000u, 34u}, // zlj -> Hani
-    {0xB1790000u, 55u}, // zlm -> Latn
-    {0xB5790000u, 34u}, // zln -> Hani
-    {0xC1790000u, 34u}, // zlq -> Hani
-    {0xD1790000u, 55u}, // zlu -> Latn
-    {0x81990000u, 55u}, // zma -> Latn
-    {0x85990000u, 55u}, // zmb -> Latn
-    {0x89990000u, 55u}, // zmc -> Latn
-    {0x8D990000u, 55u}, // zmd -> Latn
-    {0x91990000u, 55u}, // zme -> Latn
-    {0x95990000u, 55u}, // zmf -> Latn
-    {0x99990000u, 55u}, // zmg -> Latn
-    {0x9D990000u, 55u}, // zmh -> Latn
-    {0xA1990000u, 55u}, // zmi -> Latn
-    {0xA5990000u, 55u}, // zmj -> Latn
-    {0xA9990000u, 55u}, // zmk -> Latn
-    {0xAD990000u, 55u}, // zml -> Latn
-    {0xB1990000u, 55u}, // zmm -> Latn
-    {0xB5990000u, 55u}, // zmn -> Latn
-    {0xB9990000u, 55u}, // zmo -> Latn
-    {0xBD990000u, 55u}, // zmp -> Latn
-    {0xC1990000u, 55u}, // zmq -> Latn
-    {0xC5990000u, 55u}, // zmr -> Latn
-    {0xC9990000u, 55u}, // zms -> Latn
-    {0xCD990000u, 55u}, // zmt -> Latn
-    {0xD1990000u, 55u}, // zmu -> Latn
-    {0xD5990000u, 55u}, // zmv -> Latn
-    {0xD9990000u, 55u}, // zmw -> Latn
-    {0xDD990000u, 55u}, // zmx -> Latn
-    {0xE1990000u, 55u}, // zmy -> Latn
-    {0xE5990000u, 55u}, // zmz -> Latn
-    {0x81B90000u, 55u}, // zna -> Latn
-    {0x91B90000u, 55u}, // zne -> Latn
-    {0x99B90000u, 55u}, // zng -> Latn
-    {0xA9B90000u, 55u}, // znk -> Latn
-    {0xC9B90000u, 55u}, // zns -> Latn
-    {0x89D90000u, 55u}, // zoc -> Latn
-    {0x9DD90000u, 55u}, // zoh -> Latn
-    {0xB1D90000u, 55u}, // zom -> Latn
-    {0xB9D90000u, 55u}, // zoo -> Latn
-    {0xC1D90000u, 55u}, // zoq -> Latn
-    {0xC5D90000u, 55u}, // zor -> Latn
-    {0xC9D90000u, 55u}, // zos -> Latn
-    {0x81F90000u, 55u}, // zpa -> Latn
-    {0x85F90000u, 55u}, // zpb -> Latn
-    {0x89F90000u, 55u}, // zpc -> Latn
-    {0x8DF90000u, 55u}, // zpd -> Latn
-    {0x91F90000u, 55u}, // zpe -> Latn
-    {0x95F90000u, 55u}, // zpf -> Latn
-    {0x99F90000u, 55u}, // zpg -> Latn
-    {0x9DF90000u, 55u}, // zph -> Latn
-    {0xA1F90000u, 55u}, // zpi -> Latn
-    {0xA5F90000u, 55u}, // zpj -> Latn
-    {0xA9F90000u, 55u}, // zpk -> Latn
-    {0xADF90000u, 55u}, // zpl -> Latn
-    {0xB1F90000u, 55u}, // zpm -> Latn
-    {0xB5F90000u, 55u}, // zpn -> Latn
-    {0xB9F90000u, 55u}, // zpo -> Latn
-    {0xBDF90000u, 55u}, // zpp -> Latn
-    {0xC1F90000u, 55u}, // zpq -> Latn
-    {0xC5F90000u, 55u}, // zpr -> Latn
-    {0xC9F90000u, 55u}, // zps -> Latn
-    {0xCDF90000u, 55u}, // zpt -> Latn
-    {0xD1F90000u, 55u}, // zpu -> Latn
-    {0xD5F90000u, 55u}, // zpv -> Latn
-    {0xD9F90000u, 55u}, // zpw -> Latn
-    {0xDDF90000u, 55u}, // zpx -> Latn
-    {0xE1F90000u, 55u}, // zpy -> Latn
-    {0xE5F90000u, 55u}, // zpz -> Latn
-    {0x92190000u, 34u}, // zqe -> Hani
-    {0x9A390000u, 80u}, // zrg -> Orya
-    {0xB6390000u, 55u}, // zrn -> Latn
-    {0xBA390000u, 55u}, // zro -> Latn
-    {0xBE390000u, 37u}, // zrp -> Hebr
-    {0xCA390000u, 55u}, // zrs -> Latn
-    {0x82590000u, 55u}, // zsa -> Latn
-    {0xC6590000u, 55u}, // zsr -> Latn
-    {0xD2590000u, 55u}, // zsu -> Latn
-    {0x92790000u, 55u}, // zte -> Latn
-    {0x9A790000u, 55u}, // ztg -> Latn
-    {0xAE790000u, 55u}, // ztl -> Latn
-    {0xB2790000u, 55u}, // ztm -> Latn
-    {0xB6790000u, 55u}, // ztn -> Latn
-    {0xBE790000u, 55u}, // ztp -> Latn
-    {0xC2790000u, 55u}, // ztq -> Latn
-    {0xCA790000u, 55u}, // zts -> Latn
-    {0xCE790000u, 55u}, // ztt -> Latn
-    {0xD2790000u, 55u}, // ztu -> Latn
-    {0xDE790000u, 55u}, // ztx -> Latn
-    {0xE2790000u, 55u}, // zty -> Latn
-    {0x7A750000u, 55u}, // zu -> Latn
-    {0x9E990000u, 55u}, // zuh -> Latn
-    {0xB2990000u,  2u}, // zum -> Arab
-    {0xB6990000u, 55u}, // zun -> Latn
-    {0xE2990000u, 55u}, // zuy -> Latn
-    {0x82D90000u, 24u}, // zwa -> Ethi
-    {0x9B190000u, 34u}, // zyg -> Hani
-    {0xA7190000u, 55u}, // zyj -> Latn
-    {0xB7190000u, 34u}, // zyn -> Hani
-    {0xBF190000u, 55u}, // zyp -> Latn
-    {0x83390000u, 55u}, // zza -> Latn
-    {0xA7390000u, 34u}, // zzj -> Hani
-});
-
-std::unordered_set<uint64_t> REPRESENTATIVE_LOCALES({
-    0x616145544C61746ELLU, // aa_Latn_ET
-    0x80004E474C61746ELLU, // aaa_Latn_NG
-    0x84004E474C61746ELLU, // aab_Latn_NG
-    0x880050474C61746ELLU, // aac_Latn_PG
-    0x8C0050474C61746ELLU, // aad_Latn_PG
-    0x900049544C61746ELLU, // aae_Latn_IT
-    0x9400494E4D6C796DLLU, // aaf_Mlym_IN
-    0x980050474C61746ELLU, // aag_Latn_PG
-    0x9C0050474C61746ELLU, // aah_Latn_PG
-    0xA00050474C61746ELLU, // aai_Latn_PG
-    0xA80050474C61746ELLU, // aak_Latn_PG
-    0xAC00434D4C61746ELLU, // aal_Latn_CM
-    0xB40042524C61746ELLU, // aan_Latn_BR
-    0xB800445A41726162LLU, // aao_Arab_DZ
-    0xBC0042524C61746ELLU, // aap_Latn_BR
-    0xC00055534C61746ELLU, // aaq_Latn_US
-    0xC800545A4C61746ELLU, // aas_Latn_TZ
-    0xCC0047524772656BLLU, // aat_Grek_GR
-    0xD00050474C61746ELLU, // aau_Latn_PG
-    0xD80050474C61746ELLU, // aaw_Latn_PG
-    0xDC0049444C61746ELLU, // aax_Latn_ID
-    0xE40049444C61746ELLU, // aaz_Latn_ID
-    0x616247454379726CLLU, // ab_Cyrl_GE
-    0x802043494C61746ELLU, // aba_Latn_CI
-    0x8420434D4C61746ELLU, // abb_Latn_CM
-    0x882050484C61746ELLU, // abc_Latn_PH
-    0x8C2050484C61746ELLU, // abd_Latn_PH
-    0x902043414C61746ELLU, // abe_Latn_CA
-    0x94204D594C61746ELLU, // abf_Latn_MY
-    0x982050474C61746ELLU, // abg_Latn_PG
-    0x9C20544A41726162LLU, // abh_Arab_TJ
-    0xA02043494C61746ELLU, // abi_Latn_CI
-    0xAC204944526A6E67LLU, // abl_Rjng_ID
-    0xB0204E474C61746ELLU, // abm_Latn_NG
-    0xB4204E474C61746ELLU, // abn_Latn_NG
-    0xB8204E474C61746ELLU, // abo_Latn_NG
-    0xBC2050484C61746ELLU, // abp_Latn_PH
-    0xC42047484C61746ELLU, // abr_Latn_GH
-    0xC82049444C61746ELLU, // abs_Latn_ID
-    0xCC2050474C61746ELLU, // abt_Latn_PG
-    0xD02043494C61746ELLU, // abu_Latn_CI
-    0xD420424841726162LLU, // abv_Arab_BH
-    0xD82050474C61746ELLU, // abw_Latn_PG
-    0xDC2050484C61746ELLU, // abx_Latn_PH
-    0xE02050474C61746ELLU, // aby_Latn_PG
-    0xE42049444C61746ELLU, // abz_Latn_ID
-    0x8040434F4C61746ELLU, // aca_Latn_CO
-    0x84404E474C61746ELLU, // acb_Latn_NG
-    0x8C4047484C61746ELLU, // acd_Latn_GH
-    0x904049444C61746ELLU, // ace_Latn_ID
-    0x94404C434C61746ELLU, // acf_Latn_LC
-    0x9C4055474C61746ELLU, // ach_Latn_UG
-    0xB040495141726162LLU, // acm_Arab_IQ
-    0xB440434E4C61746ELLU, // acn_Latn_CN
-    0xBC404E474C61746ELLU, // acp_Latn_NG
-    0xC040594541726162LLU, // acq_Arab_YE
-    0xC44047544C61746ELLU, // acr_Latn_GT
-    0xC84042524C61746ELLU, // acs_Latn_BR
-    0xCC404E4C4C61746ELLU, // act_Latn_NL
-    0xD04045434C61746ELLU, // acu_Latn_EC
-    0xD44055534C61746ELLU, // acv_Latn_US
-    0xD840534141726162LLU, // acw_Arab_SA
-    0xDC404F4D41726162LLU, // acx_Arab_OM
-    0xE04043594C61746ELLU, // acy_Latn_CY
-    0xE44053444C61746ELLU, // acz_Latn_SD
-    0x806047484C61746ELLU, // ada_Latn_GH
-    0x8460544C4C61746ELLU, // adb_Latn_TL
-    0x8C60434D4C61746ELLU, // add_Latn_CM
-    0x906054474C61746ELLU, // ade_Latn_TG
-    0x94604F4D41726162LLU, // adf_Arab_OM
-    0x986041554C61746ELLU, // adg_Latn_AU
-    0x9C6055474C61746ELLU, // adh_Latn_UG
-    0xA060494E4C61746ELLU, // adi_Latn_IN
-    0xA46043494C61746ELLU, // adj_Latn_CI
-    0xAC60494E4C61746ELLU, // adl_Latn_IN
-    0xB46049444C61746ELLU, // adn_Latn_ID
-    0xB86050474C61746ELLU, // ado_Latn_PG
-    0xC06047484C61746ELLU, // adq_Latn_GH
-    0xC46049444C61746ELLU, // adr_Latn_ID
-    0xCC6041554C61746ELLU, // adt_Latn_AU
-    0xD0604E474C61746ELLU, // adu_Latn_NG
-    0xD86042524C61746ELLU, // adw_Latn_BR
-    0xDC60434E54696274LLU, // adx_Tibt_CN
-    0xE06052554379726CLLU, // ady_Cyrl_RU
-    0xE46050474C61746ELLU, // adz_Latn_PG
-    0x6165495241767374LLU, // ae_Avst_IR
-    0x808041554C61746ELLU, // aea_Latn_AU
-    0x8480544E41726162LLU, // aeb_Arab_TN
-    0x8880454741726162LLU, // aec_Arab_EG
-    0x9080414641726162LLU, // aee_Arab_AF
-    0xA8804E434C61746ELLU, // aek_Latn_NC
-    0xAC80434D4C61746ELLU, // ael_Latn_CM
-    0xB080564E4C61746ELLU, // aem_Latn_VN
-    0xC080504B41726162LLU, // aeq_Arab_PK
-    0xC48041554C61746ELLU, // aer_Latn_AU
-    0xD080434E4C61746ELLU, // aeu_Latn_CN
-    0xD88050474C61746ELLU, // aew_Latn_PG
-    0xE08050474C61746ELLU, // aey_Latn_PG
-    0xE48050474C61746ELLU, // aez_Latn_PG
-    0x61665A414C61746ELLU, // af_Latn_ZA
-    0x84A04B5741726162LLU, // afb_Arab_KW
-    0x8CA050474C61746ELLU, // afd_Latn_PG
-    0x90A04E474C61746ELLU, // afe_Latn_NG
-    0x9CA047484C61746ELLU, // afh_Latn_GH
-    0xA0A050474C61746ELLU, // afi_Latn_PG
-    0xA8A050474C61746ELLU, // afk_Latn_PG
-    0xB4A04E474C61746ELLU, // afn_Latn_NG
-    0xB8A04E474C61746ELLU, // afo_Latn_NG
-    0xBCA050474C61746ELLU, // afp_Latn_PG
-    0xC8A04D584C61746ELLU, // afs_Latn_MX
-    0xD0A047484C61746ELLU, // afu_Latn_GH
-    0xE4A049444C61746ELLU, // afz_Latn_ID
-    0x80C050454C61746ELLU, // aga_Latn_PE
-    0x84C04E474C61746ELLU, // agb_Latn_NG
-    0x88C04E474C61746ELLU, // agc_Latn_NG
-    0x8CC050474C61746ELLU, // agd_Latn_PG
-    0x90C050474C61746ELLU, // age_Latn_PG
-    0x94C049444C61746ELLU, // agf_Latn_ID
-    0x98C050474C61746ELLU, // agg_Latn_PG
-    0x9CC043444C61746ELLU, // agh_Latn_CD
-    0xA0C0494E44657661LLU, // agi_Deva_IN
-    0xA4C0455445746869LLU, // agj_Ethi_ET
-    0xA8C050484C61746ELLU, // agk_Latn_PH
-    0xACC050474C61746ELLU, // agl_Latn_PG
-    0xB0C050474C61746ELLU, // agm_Latn_PG
-    0xB4C050484C61746ELLU, // agn_Latn_PH
-    0xB8C050474C61746ELLU, // ago_Latn_PG
-    0xC0C0434D4C61746ELLU, // agq_Latn_CM
-    0xC4C050454C61746ELLU, // agr_Latn_PE
-    0xC8C0434D4C61746ELLU, // ags_Latn_CM
-    0xCCC050484C61746ELLU, // agt_Latn_PH
-    0xD0C047544C61746ELLU, // agu_Latn_GT
-    0xD4C050484C61746ELLU, // agv_Latn_PH
-    0xD8C053424C61746ELLU, // agw_Latn_SB
-    0xDCC052554379726CLLU, // agx_Cyrl_RU
-    0xE0C050484C61746ELLU, // agy_Latn_PH
-    0xE4C050484C61746ELLU, // agz_Latn_PH
-    0x80E047484C61746ELLU, // aha_Latn_GH
-    0x84E056554C61746ELLU, // ahb_Latn_VU
-    0x98E0455445746869LLU, // ahg_Ethi_ET
-    0x9CE049444C61746ELLU, // ahh_Latn_ID
-    0xA0E043494C61746ELLU, // ahi_Latn_CI
-    0xA8E04D4D4C61746ELLU, // ahk_Latn_MM
-    0xACE054474C61746ELLU, // ahl_Latn_TG
-    0xB0E043494C61746ELLU, // ahm_Latn_CI
-    0xB4E04E474C61746ELLU, // ahn_Latn_NG
-    0xB8E0494E41686F6DLLU, // aho_Ahom_IN
-    0xBCE043494C61746ELLU, // ahp_Latn_CI
-    0xC4E0494E44657661LLU, // ahr_Deva_IN
-    0xC8E04E474C61746ELLU, // ahs_Latn_NG
-    0xCCE055534C61746ELLU, // aht_Latn_US
-    0x810053424C61746ELLU, // aia_Latn_SB
-    0x8500434E41726162LLU, // aib_Arab_CN
-    0x890050474C61746ELLU, // aic_Latn_PG
-    0x8D0041554C61746ELLU, // aid_Latn_AU
-    0x910050474C61746ELLU, // aie_Latn_PG
-    0x950050474C61746ELLU, // aif_Latn_PG
-    0x990041474C61746ELLU, // aig_Latn_AG
-    0xA100495153797263LLU, // aii_Syrc_IQ
-    0xA500494C48656272LLU, // aij_Hebr_IL
-    0xA9004E474C61746ELLU, // aik_Latn_NG
-    0xAD0050474C61746ELLU, // ail_Latn_PG
-    0xB100494E4C61746ELLU, // aim_Latn_IN
-    0xB5004A504B616E61LLU, // ain_Kana_JP
-    0xB900494E4D796D72LLU, // aio_Mymr_IN
-    0xBD0049444C61746ELLU, // aip_Latn_ID
-    0xC100414641726162LLU, // aiq_Arab_AF
-    0xC50049444C61746ELLU, // air_Latn_ID
-    0xCD0042524C61746ELLU, // ait_Latn_BR
-    0xD90045544C61746ELLU, // aiw_Latn_ET
-    0xDD0050474C61746ELLU, // aix_Latn_PG
-    0xE10043464C61746ELLU, // aiy_Latn_CF
-    0x812053534C61746ELLU, // aja_Latn_SS
-    0x9920424A4C61746ELLU, // ajg_Latn_BJ
-    0xA1204E434C61746ELLU, // aji_Latn_NC
-    0xB52041554C61746ELLU, // ajn_Latn_AU
-    0xD9204E474C61746ELLU, // ajw_Latn_NG
-    0xE520494E4C61746ELLU, // ajz_Latn_IN
-    0x616B47484C61746ELLU, // ak_Latn_GH
-    0x854049444C61746ELLU, // akb_Latn_ID
-    0x894049444C61746ELLU, // akc_Latn_ID
-    0x8D404E474C61746ELLU, // akd_Latn_NG
-    0x914047594C61746ELLU, // ake_Latn_GY
-    0x95404E474C61746ELLU, // akf_Latn_NG
-    0x994049444C61746ELLU, // akg_Latn_ID
-    0x9D4050474C61746ELLU, // akh_Latn_PG
-    0xA14050474C61746ELLU, // aki_Latn_PG
-    0xA940495158737578LLU, // akk_Xsux_IQ
-    0xAD4050484C61746ELLU, // akl_Latn_PH
-    0xB94053524C61746ELLU, // ako_Latn_SR
-    0xBD4047484C61746ELLU, // akp_Latn_GH
-    0xC14050474C61746ELLU, // akq_Latn_PG
-    0xC54056554C61746ELLU, // akr_Latn_VU
-    0xC94054474C61746ELLU, // aks_Latn_TG
-    0xCD4050474C61746ELLU, // akt_Latn_PG
-    0xD140434D4C61746ELLU, // aku_Latn_CM
-    0xD54052554379726CLLU, // akv_Cyrl_RU
-    0xD94043474C61746ELLU, // akw_Latn_CG
-    0xE54055534C61746ELLU, // akz_Latn_US
-    0x81604E474C61746ELLU, // ala_Latn_NG
-    0x8960434C4C61746ELLU, // alc_Latn_CL
-    0x8D6043494C61746ELLU, // ald_Latn_CI
-    0x916055534C61746ELLU, // ale_Latn_US
-    0x95604E474C61746ELLU, // alf_Latn_NG
-    0x9D6041554C61746ELLU, // alh_Latn_AU
-    0xA16050474C61746ELLU, // ali_Latn_PG
-    0xA56050484C61746ELLU, // alj_Latn_PH
-    0xA9604C414C616F6FLLU, // alk_Laoo_LA
-    0xAD60494E4D6C796DLLU, // all_Mlym_IN
-    0xB16056554C61746ELLU, // alm_Latn_VU
-    0xB560584B4C61746ELLU, // aln_Latn_XK
-    0xB96049444C61746ELLU, // alo_Latn_ID
-    0xBD6049444C61746ELLU, // alp_Latn_ID
-    0xC16043414C61746ELLU, // alq_Latn_CA
-    0xC56052554379726CLLU, // alr_Cyrl_RU
-    0xCD6052554379726CLLU, // alt_Cyrl_RU
-    0xD16053424C61746ELLU, // alu_Latn_SB
-    0xD960455445746869LLU, // alw_Ethi_ET
-    0xDD6050474C61746ELLU, // alx_Latn_PG
-    0xE16041554C61746ELLU, // aly_Latn_AU
-    0xE56043444C61746ELLU, // alz_Latn_CD
-    0x616D455445746869LLU, // am_Ethi_ET
-    0x818042524C61746ELLU, // ama_Latn_BR
-    0x85804E474C61746ELLU, // amb_Latn_NG
-    0x898050454C61746ELLU, // amc_Latn_PE
-    0x918050454C61746ELLU, // ame_Latn_PE
-    0x958045544C61746ELLU, // amf_Latn_ET
-    0x998041554C61746ELLU, // amg_Latn_AU
-    0xA18054574C61746ELLU, // ami_Latn_TW
-    0xA58054444C61746ELLU, // amj_Latn_TD
-    0xA98049444C61746ELLU, // amk_Latn_ID
-    0xB18050474C61746ELLU, // amm_Latn_PG
-    0xB58050474C61746ELLU, // amn_Latn_PG
-    0xB9804E474C61746ELLU, // amo_Latn_NG
-    0xBD8050474C61746ELLU, // amp_Latn_PG
-    0xC18049444C61746ELLU, // amq_Latn_ID
-    0xC58050454C61746ELLU, // amr_Latn_PE
-    0xC9804A504A70616ELLU, // ams_Jpan_JP
-    0xCD8050474C61746ELLU, // amt_Latn_PG
-    0xD1804D584C61746ELLU, // amu_Latn_MX
-    0xD58049444C61746ELLU, // amv_Latn_ID
-    0xD980535953797263LLU, // amw_Syrc_SY
-    0xDD8041554C61746ELLU, // amx_Latn_AU
-    0xE18041554C61746ELLU, // amy_Latn_AU
-    0xE58041554C61746ELLU, // amz_Latn_AU
-    0x616E45534C61746ELLU, // an_Latn_ES
-    0x81A0434F4C61746ELLU, // ana_Latn_CO
-    0x85A050454C61746ELLU, // anb_Latn_PE
-    0x89A04E474C61746ELLU, // anc_Latn_NG
-    0x8DA049444C61746ELLU, // and_Latn_ID
-    0x91A04E434C61746ELLU, // ane_Latn_NC
-    0x95A047484C61746ELLU, // anf_Latn_GH
-    0x99A047424C61746ELLU, // ang_Latn_GB
-    0x9DA050474C61746ELLU, // anh_Latn_PG
-    0xA1A052554379726CLLU, // ani_Cyrl_RU
-    0xA5A050474C61746ELLU, // anj_Latn_PG
-    0xA9A04E474C61746ELLU, // ank_Latn_NG
-    0xADA04D4D4C61746ELLU, // anl_Latn_MM
-    0xB1A0494E4C61746ELLU, // anm_Latn_IN
-    0xB5A04E474C61746ELLU, // ann_Latn_NG
-    0xB9A0434F4C61746ELLU, // ano_Latn_CO
-    0xBDA0494E44657661LLU, // anp_Deva_IN
-    0xC1A0494E44657661LLU, // anq_Deva_IN
-    0xC5A0494E44657661LLU, // anr_Deva_IN
-    0xC9A0434F4C61746ELLU, // ans_Latn_CO
-    0xCDA041554C61746ELLU, // ant_Latn_AU
-    0xD1A0455445746869LLU, // anu_Ethi_ET
-    0xD5A0434D4C61746ELLU, // anv_Latn_CM
-    0xD9A04E474C61746ELLU, // anw_Latn_NG
-    0xDDA050474C61746ELLU, // anx_Latn_PG
-    0xE1A043494C61746ELLU, // any_Latn_CI
-    0xE5A050474C61746ELLU, // anz_Latn_PG
-    0x81C053544C61746ELLU, // aoa_Latn_ST
-    0x85C050474C61746ELLU, // aob_Latn_PG
-    0x89C056454C61746ELLU, // aoc_Latn_VE
-    0x8DC050474C61746ELLU, // aod_Latn_PG
-    0x91C050474C61746ELLU, // aoe_Latn_PG
-    0x95C050474C61746ELLU, // aof_Latn_PG
-    0x99C050474C61746ELLU, // aog_Latn_PG
-    0xA1C041554C61746ELLU, // aoi_Latn_AU
-    0xA5C050474C61746ELLU, // aoj_Latn_PG
-    0xA9C04E434C61746ELLU, // aok_Latn_NC
-    0xADC049444C61746ELLU, // aol_Latn_ID
-    0xB1C050474C61746ELLU, // aom_Latn_PG
-    0xB5C050474C61746ELLU, // aon_Latn_PG
-    0xC5C056554C61746ELLU, // aor_Latn_VU
-    0xC9C049444C61746ELLU, // aos_Latn_ID
-    0xCDC0424442656E67LLU, // aot_Beng_BD
-    0xDDC047594C61746ELLU, // aox_Latn_GY
-    0xE5C049444C61746ELLU, // aoz_Latn_ID
-    0x85E053424C61746ELLU, // apb_Latn_SB
-    0x89E0535941726162LLU, // apc_Arab_SY
-    0x8DE0544741726162LLU, // apd_Arab_TG
-    0x91E050474C61746ELLU, // ape_Latn_PG
-    0x95E050484C61746ELLU, // apf_Latn_PH
-    0x99E049444C61746ELLU, // apg_Latn_ID
-    0x9DE04E5044657661LLU, // aph_Deva_NP
-    0xA1E042524C61746ELLU, // api_Latn_BR
-    0xA5E055534C61746ELLU, // apj_Latn_US
-    0xA9E055534C61746ELLU, // apk_Latn_US
-    0xADE055534C61746ELLU, // apl_Latn_US
-    0xB1E055534C61746ELLU, // apm_Latn_US
-    0xB5E042524C61746ELLU, // apn_Latn_BR
-    0xB9E050474C61746ELLU, // apo_Latn_PG
-    0xBDE056554C61746ELLU, // app_Latn_VU
-    0xC5E050474C61746ELLU, // apr_Latn_PG
-    0xC9E050474C61746ELLU, // aps_Latn_PG
-    0xCDE0494E4C61746ELLU, // apt_Latn_IN
-    0xD1E042524C61746ELLU, // apu_Latn_BR
-    0xD5E042524C61746ELLU, // apv_Latn_BR
-    0xD9E055534C61746ELLU, // apw_Latn_US
-    0xDDE049444C61746ELLU, // apx_Latn_ID
-    0xE1E042524C61746ELLU, // apy_Latn_BR
-    0xE5E050474C61746ELLU, // apz_Latn_PG
-    0x8A0052554379726CLLU, // aqc_Cyrl_RU
-    0x8E004D4C4C61746ELLU, // aqd_Latn_ML
-    0x9A004E474C61746ELLU, // aqg_Latn_NG
-    0xAA004E474C61746ELLU, // aqk_Latn_NG
-    0xB20049444C61746ELLU, // aqm_Latn_ID
-    0xB60050484C61746ELLU, // aqn_Latn_PH
-    0xC6004E434C61746ELLU, // aqr_Latn_NC
-    0xCE0050594C61746ELLU, // aqt_Latn_PY
-    0xE60042524C61746ELLU, // aqz_Latn_BR
-    0x6172454741726162LLU, // ar_Arab_EG
-    0x8A20495241726D69LLU, // arc_Armi_IR
-    0x8A20495148617472LLU, // arc_Hatr_IQ
-    0x8A204A4F4E626174LLU, // arc_Nbat_JO
-    0x8A20535950616C6DLLU, // arc_Palm_SY
-    0x8E2041554C61746ELLU, // ard_Latn_AU
-    0x922041554C61746ELLU, // are_Latn_AU
-    0x9E20434F4C61746ELLU, // arh_Latn_CO
-    0xA22055534C61746ELLU, // ari_Latn_US
-    0xA62042524C61746ELLU, // arj_Latn_BR
-    0xAA2042524C61746ELLU, // ark_Latn_BR
-    0xAE2050454C61746ELLU, // arl_Latn_PE
-    0xB620434C4C61746ELLU, // arn_Latn_CL
-    0xBA20424F4C61746ELLU, // aro_Latn_BO
-    0xBE2055534C61746ELLU, // arp_Latn_US
-    0xC220445A41726162LLU, // arq_Arab_DZ
-    0xC62042524C61746ELLU, // arr_Latn_BR
-    0xCA20534141726162LLU, // ars_Arab_SA
-    0xD22042524C61746ELLU, // aru_Latn_BR
-    0xDA2053524C61746ELLU, // arw_Latn_SR
-    0xDE2042524C61746ELLU, // arx_Latn_BR
-    0xE2204D4141726162LLU, // ary_Arab_MA
-    0xE620454741726162LLU, // arz_Arab_EG
-    0x6173494E42656E67LLU, // as_Beng_IN
-    0x8240545A4C61746ELLU, // asa_Latn_TZ
-    0x864043414C61746ELLU, // asb_Latn_CA
-    0x8A4049444C61746ELLU, // asc_Latn_ID
-    0x9240555353676E77LLU, // ase_Sgnw_US
-    0x9A404E474C61746ELLU, // asg_Latn_NG
-    0x9E4050454C61746ELLU, // ash_Latn_PE
-    0xA24049444C61746ELLU, // asi_Latn_ID
-    0xA640434D4C61746ELLU, // asj_Latn_CM
-    0xAA40414641726162LLU, // ask_Arab_AF
-    0xAE4049444C61746ELLU, // asl_Latn_ID
-    0xB64042524C61746ELLU, // asn_Latn_BR
-    0xBA4050474C61746ELLU, // aso_Latn_PG
-    0xC640494E44657661LLU, // asr_Deva_IN
-    0xCA40434D4C61746ELLU, // ass_Latn_CM
-    0xCE4045534C61746ELLU, // ast_Latn_ES
-    0xD24042524C61746ELLU, // asu_Latn_BR
-    0xD64043444C61746ELLU, // asv_Latn_CD
-    0xDE4050474C61746ELLU, // asx_Latn_PG
-    0xE24049444C61746ELLU, // asy_Latn_ID
-    0xE64049444C61746ELLU, // asz_Latn_ID
-    0x826050474C61746ELLU, // ata_Latn_PG
-    0x8660434E4C61746ELLU, // atb_Latn_CN
-    0x8A6050454C61746ELLU, // atc_Latn_PE
-    0x8E6050484C61746ELLU, // atd_Latn_PH
-    0x926050474C61746ELLU, // ate_Latn_PG
-    0x9A604E474C61746ELLU, // atg_Latn_NG
-    0xA26043494C61746ELLU, // ati_Latn_CI
-    0xA66043414C61746ELLU, // atj_Latn_CA
-    0xAA6050484C61746ELLU, // atk_Latn_PH
-    0xAE6050484C61746ELLU, // atl_Latn_PH
-    0xB26050484C61746ELLU, // atm_Latn_PH
-    0xB660495241726162LLU, // atn_Arab_IR
-    0xBA60434D4C61746ELLU, // ato_Latn_CM
-    0xBE6050484C61746ELLU, // atp_Latn_PH
-    0xC26049444C61746ELLU, // atq_Latn_ID
-    0xC66042524C61746ELLU, // atr_Latn_BR
-    0xCA6055534C61746ELLU, // ats_Latn_US
-    0xCE6050484C61746ELLU, // att_Latn_PH
-    0xD26053534C61746ELLU, // atu_Latn_SS
-    0xD66052554379726CLLU, // atv_Cyrl_RU
-    0xDA6055534C61746ELLU, // atw_Latn_US
-    0xDE6042524C61746ELLU, // atx_Latn_BR
-    0xE26056554C61746ELLU, // aty_Latn_VU
-    0xE66050484C61746ELLU, // atz_Latn_PH
-    0x828053424C61746ELLU, // aua_Latn_SB
-    0x8A8045434C61746ELLU, // auc_Latn_EC
-    0x8E8053424C61746ELLU, // aud_Latn_SB
-    0x9A80424A4C61746ELLU, // aug_Latn_BJ
-    0x9E805A4D4C61746ELLU, // auh_Latn_ZM
-    0xA28050474C61746ELLU, // aui_Latn_PG
-    0xA6804C5941726162LLU, // auj_Arab_LY
-    0xAA8050474C61746ELLU, // auk_Latn_PG
-    0xAE8056554C61746ELLU, // aul_Latn_VU
-    0xB2804E474C61746ELLU, // aum_Latn_NG
-    0xB68050474C61746ELLU, // aun_Latn_PG
-    0xBA804E474C61746ELLU, // auo_Latn_NG
-    0xBE8050474C61746ELLU, // aup_Latn_PG
-    0xC28049444C61746ELLU, // auq_Latn_ID
-    0xC68050474C61746ELLU, // aur_Latn_PG
-    0xCE8050464C61746ELLU, // aut_Latn_PF
-    0xD28049444C61746ELLU, // auu_Latn_ID
-    0xDA8049444C61746ELLU, // auw_Latn_ID
-    0xE28050474C61746ELLU, // auy_Latn_PG
-    0xE680555A41726162LLU, // auz_Arab_UZ
-    0x617652554379726CLLU, // av_Cyrl_RU
-    0x86A050474C61746ELLU, // avb_Latn_PG
-    0x8EA0495241726162LLU, // avd_Arab_IR
-    0xA2A043494C61746ELLU, // avi_Latn_CI
-    0xAEA0454741726162LLU, // avl_Arab_EG
-    0xB2A041554C61746ELLU, // avm_Latn_AU
-    0xB6A047484C61746ELLU, // avn_Latn_GH
-    0xBAA042524C61746ELLU, // avo_Latn_BR
-    0xCAA050454C61746ELLU, // avs_Latn_PE
-    0xCEA050474C61746ELLU, // avt_Latn_PG
-    0xD2A053534C61746ELLU, // avu_Latn_SS
-    0xD6A042524C61746ELLU, // avv_Latn_BR
-    0x82C0494E44657661LLU, // awa_Deva_IN
-    0x86C050474C61746ELLU, // awb_Latn_PG
-    0x8AC04E474C61746ELLU, // awc_Latn_NG
-    0x92C042524C61746ELLU, // awe_Latn_BR
-    0x9AC041554C61746ELLU, // awg_Latn_AU
-    0x9EC049444C61746ELLU, // awh_Latn_ID
-    0xA2C050474C61746ELLU, // awi_Latn_PG
-    0xAAC041554C61746ELLU, // awk_Latn_AU
-    0xB2C050474C61746ELLU, // awm_Latn_PG
-    0xB6C0455445746869LLU, // awn_Ethi_ET
-    0xBAC04E474C61746ELLU, // awo_Latn_NG
-    0xC6C049444C61746ELLU, // awr_Latn_ID
-    0xCAC049444C61746ELLU, // aws_Latn_ID
-    0xCEC042524C61746ELLU, // awt_Latn_BR
-    0xD2C049444C61746ELLU, // awu_Latn_ID
-    0xD6C049444C61746ELLU, // awv_Latn_ID
-    0xDAC050474C61746ELLU, // aww_Latn_PG
-    0xDEC050474C61746ELLU, // awx_Latn_PG
-    0xE2C049444C61746ELLU, // awy_Latn_ID
-    0x86E041524C61746ELLU, // axb_Latn_AR
-    0x92E041554C61746ELLU, // axe_Latn_AU
-    0x9AE042524C61746ELLU, // axg_Latn_BR
-    0xAAE043464C61746ELLU, // axk_Latn_CF
-    0xAEE041554C61746ELLU, // axl_Latn_AU
-    0xB2E0414D41726D6ELLU, // axm_Armn_AM
-    0xDEE04E434C61746ELLU, // axx_Latn_NC
-    0x6179424F4C61746ELLU, // ay_Latn_BO
-    0x830050474C61746ELLU, // aya_Latn_PG
-    0x8700424A4C61746ELLU, // ayb_Latn_BJ
-    0x8B0050454C61746ELLU, // ayc_Latn_PE
-    0x8F0041554C61746ELLU, // ayd_Latn_AU
-    0x93004E474C61746ELLU, // aye_Latn_NG
-    0x9B0054474C61746ELLU, // ayg_Latn_TG
-    0x9F00594541726162LLU, // ayh_Arab_YE
-    0xA3004E474C61746ELLU, // ayi_Latn_NG
-    0xAB004E474C61746ELLU, // ayk_Latn_NG
-    0xAF004C5941726162LLU, // ayl_Arab_LY
-    0xB700594541726162LLU, // ayn_Arab_YE
-    0xBB0050594C61746ELLU, // ayo_Latn_PY
-    0xBF00495141726162LLU, // ayp_Arab_IQ
-    0xC30050474C61746ELLU, // ayq_Latn_PG
-    0xCB0050484C61746ELLU, // ays_Latn_PH
-    0xCF0050484C61746ELLU, // ayt_Latn_PH
-    0xD3004E474C61746ELLU, // ayu_Latn_NG
-    0xE70049444C61746ELLU, // ayz_Latn_ID
-    0x617A495241726162LLU, // az_Arab_IR
-    0x617A415A4C61746ELLU, // az_Latn_AZ
-    0x8720495241726162LLU, // azb_Arab_IR
-    0x8F204D584C61746ELLU, // azd_Latn_MX
-    0x9B204D584C61746ELLU, // azg_Latn_MX
-    0xB3204D584C61746ELLU, // azm_Latn_MX
-    0xB7204D584C61746ELLU, // azn_Latn_MX
-    0xBB20434D4C61746ELLU, // azo_Latn_CM
-    0xCF2050484C61746ELLU, // azt_Latn_PH
-    0xE7204D584C61746ELLU, // azz_Latn_MX
-    0x626152554379726CLLU, // ba_Cyrl_RU
-    0x800153424C61746ELLU, // baa_Latn_SB
-    0x840147574C61746ELLU, // bab_Latn_GW
-    0x880149444C61746ELLU, // bac_Latn_ID
-    0x900156454C61746ELLU, // bae_Latn_VE
-    0x9401434D4C61746ELLU, // baf_Latn_CM
-    0x9801434D4C61746ELLU, // bag_Latn_CM
-    0x9C0142534C61746ELLU, // bah_Latn_BS
-    0xA40149444C61746ELLU, // baj_Latn_ID
-    0xAC01504B41726162LLU, // bal_Arab_PK
-    0xB40149444C61746ELLU, // ban_Latn_ID
-    0xB801434F4C61746ELLU, // bao_Latn_CO
-    0xBC014E5044657661LLU, // bap_Deva_NP
-    0xBC01494E4B726169LLU, // bap_Krai_IN
-    0xC40141544C61746ELLU, // bar_Latn_AT
-    0xC801434D4C61746ELLU, // bas_Latn_CM
-    0xD0014E474C61746ELLU, // bau_Latn_NG
-    0xD401434D4C61746ELLU, // bav_Latn_CM
-    0xD801434D4C61746ELLU, // baw_Latn_CM
-    0xDC01434D42616D75LLU, // bax_Bamu_CM
-    0xE00149444C61746ELLU, // bay_Latn_ID
-    0x8021424A4C61746ELLU, // bba_Latn_BJ
-    0x842150474C61746ELLU, // bbb_Latn_PG
-    0x882149444C61746ELLU, // bbc_Latn_ID
-    0x8C2150474C61746ELLU, // bbd_Latn_PG
-    0x902143444C61746ELLU, // bbe_Latn_CD
-    0x942150474C61746ELLU, // bbf_Latn_PG
-    0x982147414C61746ELLU, // bbg_Latn_GA
-    0xA021434D4C61746ELLU, // bbi_Latn_CM
-    0xA421434D4C61746ELLU, // bbj_Latn_CM
-    0xA821434D4C61746ELLU, // bbk_Latn_CM
-    0xAC21474547656F72LLU, // bbl_Geor_GE
-    0xB02143444C61746ELLU, // bbm_Latn_CD
-    0xB42150474C61746ELLU, // bbn_Latn_PG
-    0xB82142464C61746ELLU, // bbo_Latn_BF
-    0xBC2143464C61746ELLU, // bbp_Latn_CF
-    0xC021434D4C61746ELLU, // bbq_Latn_CM
-    0xC42150474C61746ELLU, // bbr_Latn_PG
-    0xC8214E474C61746ELLU, // bbs_Latn_NG
-    0xCC214E474C61746ELLU, // bbt_Latn_NG
-    0xD0214E474C61746ELLU, // bbu_Latn_NG
-    0xD42150474C61746ELLU, // bbv_Latn_PG
-    0xD821434D4C61746ELLU, // bbw_Latn_CM
-    0xDC21434D4C61746ELLU, // bbx_Latn_CM
-    0xE021434D4C61746ELLU, // bby_Latn_CM
-    0x8041434E4C61746ELLU, // bca_Latn_CN
-    0x8441534E4C61746ELLU, // bcb_Latn_SN
-    0x8C4149444C61746ELLU, // bcd_Latn_ID
-    0x9041434D4C61746ELLU, // bce_Latn_CM
-    0x944150474C61746ELLU, // bcf_Latn_PG
-    0x9841474E4C61746ELLU, // bcg_Latn_GN
-    0x9C4150474C61746ELLU, // bch_Latn_PG
-    0xA04143494C61746ELLU, // bci_Latn_CI
-    0xA44141554C61746ELLU, // bcj_Latn_AU
-    0xA84141554C61746ELLU, // bck_Latn_AU
-    0xB04150474C61746ELLU, // bcm_Latn_PG
-    0xB4414E474C61746ELLU, // bcn_Latn_NG
-    0xB84150474C61746ELLU, // bco_Latn_PG
-    0xBC4143444C61746ELLU, // bcp_Latn_CD
-    0xC041455445746869LLU, // bcq_Ethi_ET
-    0xC44143414C61746ELLU, // bcr_Latn_CA
-    0xC8414E474C61746ELLU, // bcs_Latn_NG
-    0xCC4143444C61746ELLU, // bct_Latn_CD
-    0xD04150474C61746ELLU, // bcu_Latn_PG
-    0xD4414E474C61746ELLU, // bcv_Latn_NG
-    0xD841434D4C61746ELLU, // bcw_Latn_CM
-    0xE0414E474C61746ELLU, // bcy_Latn_NG
-    0xE441534E4C61746ELLU, // bcz_Latn_SN
-    0x8061534E4C61746ELLU, // bda_Latn_SN
-    0x846149444C61746ELLU, // bdb_Latn_ID
-    0x8861434F4C61746ELLU, // bdc_Latn_CO
-    0x8C6150474C61746ELLU, // bdd_Latn_PG
-    0x90614E474C61746ELLU, // bde_Latn_NG
-    0x946150474C61746ELLU, // bdf_Latn_PG
-    0x98614D594C61746ELLU, // bdg_Latn_MY
-    0x9C6153534C61746ELLU, // bdh_Latn_SS
-    0xA06153444C61746ELLU, // bdi_Latn_SD
-    0xA46153534C61746ELLU, // bdj_Latn_SS
-    0xA861415A4C61746ELLU, // bdk_Latn_AZ
-    0xAC6149444C61746ELLU, // bdl_Latn_ID
-    0xB06154444C61746ELLU, // bdm_Latn_TD
-    0xB461434D4C61746ELLU, // bdn_Latn_CM
-    0xB86154444C61746ELLU, // bdo_Latn_TD
-    0xBC61545A4C61746ELLU, // bdp_Latn_TZ
-    0xC061564E4C61746ELLU, // bdq_Latn_VN
-    0xC4614D594C61746ELLU, // bdr_Latn_MY
-    0xC861545A4C61746ELLU, // bds_Latn_TZ
-    0xCC6143464C61746ELLU, // bdt_Latn_CF
-    0xD061434D4C61746ELLU, // bdu_Latn_CM
-    0xD461494E4F727961LLU, // bdv_Orya_IN
-    0xD86149444C61746ELLU, // bdw_Latn_ID
-    0xDC6149444C61746ELLU, // bdx_Latn_ID
-    0xE06141554C61746ELLU, // bdy_Latn_AU
-    0xE461504B41726162LLU, // bdz_Arab_PK
-    0x626542594379726CLLU, // be_Cyrl_BY
-    0x808143414C61746ELLU, // bea_Latn_CA
-    0x8481434D4C61746ELLU, // beb_Latn_CM
-    0x8881434D4C61746ELLU, // bec_Latn_CM
-    0x8C8149444C61746ELLU, // bed_Latn_ID
-    0x9081494E44657661LLU, // bee_Deva_IN
-    0x948150474C61746ELLU, // bef_Latn_PG
-    0x9C81424A4C61746ELLU, // beh_Latn_BJ
-    0xA08149444C61746ELLU, // bei_Latn_ID
-    0xA481534441726162LLU, // bej_Arab_SD
-    0xA88150474C61746ELLU, // bek_Latn_PG
-    0xB0815A4D4C61746ELLU, // bem_Latn_ZM
-    0xB88150474C61746ELLU, // beo_Latn_PG
-    0xBC8149444C61746ELLU, // bep_Latn_ID
-    0xC08143474C61746ELLU, // beq_Latn_CG
-    0xC88154444C61746ELLU, // bes_Latn_TD
-    0xCC8143494C61746ELLU, // bet_Latn_CI
-    0xD08149444C61746ELLU, // beu_Latn_ID
-    0xD48143494C61746ELLU, // bev_Latn_CI
-    0xD88149444C61746ELLU, // bew_Latn_ID
-    0xDC8153534C61746ELLU, // bex_Latn_SS
-    0xE08150474C61746ELLU, // bey_Latn_PG
-    0xE481545A4C61746ELLU, // bez_Latn_TZ
-    0x80A153534C61746ELLU, // bfa_Latn_SS
-    0x84A1494E44657661LLU, // bfb_Deva_IN
-    0x88A1434E4C61746ELLU, // bfc_Latn_CN
-    0x8CA1434D4C61746ELLU, // bfd_Latn_CM
-    0x90A149444C61746ELLU, // bfe_Latn_ID
-    0x94A143464C61746ELLU, // bff_Latn_CF
-    0x98A149444C61746ELLU, // bfg_Latn_ID
-    0x9CA150474C61746ELLU, // bfh_Latn_PG
-    0xA4A1434D4C61746ELLU, // bfj_Latn_CM
-    0xACA143464C61746ELLU, // bfl_Latn_CF
-    0xB0A1434D4C61746ELLU, // bfm_Latn_CM
-    0xB4A1544C4C61746ELLU, // bfn_Latn_TL
-    0xB8A142464C61746ELLU, // bfo_Latn_BF
-    0xBCA1434D4C61746ELLU, // bfp_Latn_CM
-    0xC0A1494E54616D6CLLU, // bfq_Taml_IN
-    0xC8A1434E4C61746ELLU, // bfs_Latn_CN
-    0xCCA1504B41726162LLU, // bft_Arab_PK
-    0xD0A1494E54696274LLU, // bfu_Tibt_IN
-    0xD8A1494E4F727961LLU, // bfw_Orya_IN
-    0xDCA150484C61746ELLU, // bfx_Latn_PH
-    0xE0A1494E44657661LLU, // bfy_Deva_IN
-    0xE4A1494E44657661LLU, // bfz_Deva_IN
-    0x626742474379726CLLU, // bg_Cyrl_BG
-    0x80C14E474C61746ELLU, // bga_Latn_NG
-    0x84C149444C61746ELLU, // bgb_Latn_ID
-    0x88C1494E44657661LLU, // bgc_Deva_IN
-    0x8CC1494E44657661LLU, // bgd_Deva_IN
-    0x94C1434D4C61746ELLU, // bgf_Latn_CM
-    0x98C1494E4C61746ELLU, // bgg_Latn_IN
-    0xA0C150484C61746ELLU, // bgi_Latn_PH
-    0xA4C1434D4C61746ELLU, // bgj_Latn_CM
-    0xB4C1504B41726162LLU, // bgn_Arab_PK
-    0xB8C1474E4C61746ELLU, // bgo_Latn_GN
-    0xBCC1504B41726162LLU, // bgp_Arab_PK
-    0xC0C1494E44657661LLU, // bgq_Deva_IN
-    0xC4C1494E4C61746ELLU, // bgr_Latn_IN
-    0xC8C150484C61746ELLU, // bgs_Latn_PH
-    0xCCC153424C61746ELLU, // bgt_Latn_SB
-    0xD0C14E474C61746ELLU, // bgu_Latn_NG
-    0xD4C149444C61746ELLU, // bgv_Latn_ID
-    0xD8C1494E44657661LLU, // bgw_Deva_IN
-    0xDCC154524772656BLLU, // bgx_Grek_TR
-    0xE0C149444C61746ELLU, // bgy_Latn_ID
-    0xE4C149444C61746ELLU, // bgz_Latn_ID
-    0x80E1494E44657661LLU, // bha_Deva_IN
-    0x84E1494E44657661LLU, // bhb_Deva_IN
-    0x88E149444C61746ELLU, // bhc_Latn_ID
-    0x8CE1494E44657661LLU, // bhd_Deva_IN
-    0x90E1504B41726162LLU, // bhe_Arab_PK
-    0x94E150474C61746ELLU, // bhf_Latn_PG
-    0x98E150474C61746ELLU, // bhg_Latn_PG
-    0x9CE1494C4379726CLLU, // bhh_Cyrl_IL
-    0xA0E1494E44657661LLU, // bhi_Deva_IN
-    0xA4E14E5044657661LLU, // bhj_Deva_NP
-    0xACE150474C61746ELLU, // bhl_Latn_PG
-    0xB0E14F4D41726162LLU, // bhm_Arab_OM
-    0xB4E1474553797263LLU, // bhn_Syrc_GE
-    0xB8E1494E44657661LLU, // bho_Deva_IN
-    0xBCE149444C61746ELLU, // bhp_Latn_ID
-    0xC0E149444C61746ELLU, // bhq_Latn_ID
-    0xC4E14D474C61746ELLU, // bhr_Latn_MG
-    0xC8E1434D4C61746ELLU, // bhs_Latn_CM
-    0xCCE1494E44657661LLU, // bht_Deva_IN
-    0xD0E1494E44657661LLU, // bhu_Deva_IN
-    0xD4E149444C61746ELLU, // bhv_Latn_ID
-    0xD8E149444C61746ELLU, // bhw_Latn_ID
-    0xE0E143444C61746ELLU, // bhy_Latn_CD
-    0xE4E149444C61746ELLU, // bhz_Latn_ID
-    0x626956554C61746ELLU, // bi_Latn_VU
-    0x810141554C61746ELLU, // bia_Latn_AU
-    0x850142464C61746ELLU, // bib_Latn_BF
-    0x8D0154444C61746ELLU, // bid_Latn_TD
-    0x910150474C61746ELLU, // bie_Latn_PG
-    0x950147574C61746ELLU, // bif_Latn_GW
-    0x990150474C61746ELLU, // big_Latn_PG
-    0xA90150484C61746ELLU, // bik_Latn_PH
-    0xAD014E474C61746ELLU, // bil_Latn_NG
-    0xB10147484C61746ELLU, // bim_Latn_GH
-    0xB5014E474C61746ELLU, // bin_Latn_NG
-    0xB90150474C61746ELLU, // bio_Latn_PG
-    0xBD0143444C61746ELLU, // bip_Latn_CD
-    0xC10150474C61746ELLU, // biq_Latn_PG
-    0xC50150474C61746ELLU, // bir_Latn_PG
-    0xCD0150474C61746ELLU, // bit_Latn_PG
-    0xD101494E4C61746ELLU, // biu_Latn_IN
-    0xD50147484C61746ELLU, // biv_Latn_GH
-    0xD901434D4C61746ELLU, // biw_Latn_CM
-    0xE101494E44657661LLU, // biy_Deva_IN
-    0xE50143444C61746ELLU, // biz_Latn_CD
-    0x812143444C61746ELLU, // bja_Latn_CD
-    0x852141554C61746ELLU, // bjb_Latn_AU
-    0x892150474C61746ELLU, // bjc_Latn_PG
-    0x9521494C53797263LLU, // bjf_Syrc_IL
-    0x992147574C61746ELLU, // bjg_Latn_GW
-    0x9D2150474C61746ELLU, // bjh_Latn_PG
-    0xA12145544C61746ELLU, // bji_Latn_ET
-    0xA521494E44657661LLU, // bjj_Deva_IN
-    0xA92150474C61746ELLU, // bjk_Latn_PG
-    0xAD2150474C61746ELLU, // bjl_Latn_PG
-    0xB121495141726162LLU, // bjm_Arab_IQ
-    0xB52149444C61746ELLU, // bjn_Latn_ID
-    0xB92143464C61746ELLU, // bjo_Latn_CF
-    0xBD2150474C61746ELLU, // bjp_Latn_PG
-    0xC52150474C61746ELLU, // bjr_Latn_PG
-    0xC92142424C61746ELLU, // bjs_Latn_BB
-    0xCD21534E4C61746ELLU, // bjt_Latn_SN
-    0xD121434D4C61746ELLU, // bju_Latn_CM
-    0xD52154444C61746ELLU, // bjv_Latn_TD
-    0xD92143494C61746ELLU, // bjw_Latn_CI
-    0xDD2150484C61746ELLU, // bjx_Latn_PH
-    0xE12141554C61746ELLU, // bjy_Latn_AU
-    0xE52150474C61746ELLU, // bjz_Latn_PG
-    0x81414E474C61746ELLU, // bka_Latn_NG
-    0x8941434D4C61746ELLU, // bkc_Latn_CM
-    0x8D4150484C61746ELLU, // bkd_Latn_PH
-    0x954143444C61746ELLU, // bkf_Latn_CD
-    0x994143464C61746ELLU, // bkg_Latn_CF
-    0x9D41434D4C61746ELLU, // bkh_Latn_CM
-    0xA14156554C61746ELLU, // bki_Latn_VU
-    0xA54143464C61746ELLU, // bkj_Latn_CF
-    0xA941494E54696274LLU, // bkk_Tibt_IN
-    0xAD4149444C61746ELLU, // bkl_Latn_ID
-    0xB141434D4C61746ELLU, // bkm_Latn_CM
-    0xB54149444C61746ELLU, // bkn_Latn_ID
-    0xB941434D4C61746ELLU, // bko_Latn_CM
-    0xBD4143444C61746ELLU, // bkp_Latn_CD
-    0xC14142524C61746ELLU, // bkq_Latn_BR
-    0xC54149444C61746ELLU, // bkr_Latn_ID
-    0xC94150484C61746ELLU, // bks_Latn_PH
-    0xCD4143444C61746ELLU, // bkt_Latn_CD
-    0xD14150484C61746ELLU, // bku_Latn_PH
-    0xD5414E474C61746ELLU, // bkv_Latn_NG
-    0xD94143474C61746ELLU, // bkw_Latn_CG
-    0xDD41544C4C61746ELLU, // bkx_Latn_TL
-    0xE1414E474C61746ELLU, // bky_Latn_NG
-    0xE54149444C61746ELLU, // bkz_Latn_ID
-    0x816143414C61746ELLU, // bla_Latn_CA
-    0x856153424C61746ELLU, // blb_Latn_SB
-    0x896143414C61746ELLU, // blc_Latn_CA
-    0x8D6149444C61746ELLU, // bld_Latn_ID
-    0x916147574C61746ELLU, // ble_Latn_GW
-    0x956149444C61746ELLU, // blf_Latn_ID
-    0x9D614C524C61746ELLU, // blh_Latn_LR
-    0xA16143444C61746ELLU, // bli_Latn_CD
-    0xA56149444C61746ELLU, // blj_Latn_ID
-    0xA9614D4D4D796D72LLU, // blk_Mymr_MM
-    0xB16153534C61746ELLU, // blm_Latn_SS
-    0xB56150484C61746ELLU, // bln_Latn_PH
-    0xB961424A4C61746ELLU, // blo_Latn_BJ
-    0xBD6153424C61746ELLU, // blp_Latn_SB
-    0xC16150474C61746ELLU, // blq_Latn_PG
-    0xC561434E4C61746ELLU, // blr_Latn_CN
-    0xC96149444C61746ELLU, // bls_Latn_ID
-    0xCD61564E54617674LLU, // blt_Tavt_VN
-    0xD561414F4C61746ELLU, // blv_Latn_AO
-    0xD96150484C61746ELLU, // blw_Latn_PH
-    0xDD6150484C61746ELLU, // blx_Latn_PH
-    0xE161424A4C61746ELLU, // bly_Latn_BJ
-    0xE56149444C61746ELLU, // blz_Latn_ID
-    0x626D4D4C4C61746ELLU, // bm_Latn_ML
-    0x81814E474C61746ELLU, // bma_Latn_NG
-    0x858143444C61746ELLU, // bmb_Latn_CD
-    0x898150474C61746ELLU, // bmc_Latn_PG
-    0x8D81474E4C61746ELLU, // bmd_Latn_GN
-    0x918143464C61746ELLU, // bme_Latn_CF
-    0x9581534C4C61746ELLU, // bmf_Latn_SL
-    0x998143444C61746ELLU, // bmg_Latn_CD
-    0x9D8150474C61746ELLU, // bmh_Latn_PG
-    0xA18154444C61746ELLU, // bmi_Latn_TD
-    0xA5814E5044657661LLU, // bmj_Deva_NP
-    0xA98150474C61746ELLU, // bmk_Latn_PG
-    0xAD8143444C61746ELLU, // bml_Latn_CD
-    0xB1814D474C61746ELLU, // bmm_Latn_MG
-    0xB58150474C61746ELLU, // bmn_Latn_PG
-    0xB981434D4C61746ELLU, // bmo_Latn_CM
-    0xBD8150474C61746ELLU, // bmp_Latn_PG
-    0xC1814D4C4C61746ELLU, // bmq_Latn_ML
-    0xC581434F4C61746ELLU, // bmr_Latn_CO
-    0xC9814E454C61746ELLU, // bms_Latn_NE
-    0xD18150474C61746ELLU, // bmu_Latn_PG
-    0xD581434D4C61746ELLU, // bmv_Latn_CM
-    0xD98143474C61746ELLU, // bmw_Latn_CG
-    0xDD8150474C61746ELLU, // bmx_Latn_PG
-    0xE58150474C61746ELLU, // bmz_Latn_PG
-    0x626E424442656E67LLU, // bn_Beng_BD
-    0x81A149444C61746ELLU, // bna_Latn_ID
-    0x85A14D594C61746ELLU, // bnb_Latn_MY
-    0x89A150484C61746ELLU, // bnc_Latn_PH
-    0x8DA149444C61746ELLU, // bnd_Latn_ID
-    0x91A149444C61746ELLU, // bne_Latn_ID
-    0x95A149444C61746ELLU, // bnf_Latn_ID
-    0x99A147514C61746ELLU, // bng_Latn_GQ
-    0xA1A143444C61746ELLU, // bni_Latn_CD
-    0xA5A150484C61746ELLU, // bnj_Latn_PH
-    0xA9A156554C61746ELLU, // bnk_Latn_VU
-    0xB1A147514C61746ELLU, // bnm_Latn_GQ
-    0xB5A154574C61746ELLU, // bnn_Latn_TW
-    0xB9A150484C61746ELLU, // bno_Latn_PH
-    0xBDA150474C61746ELLU, // bnp_Latn_PG
-    0xC1A149444C61746ELLU, // bnq_Latn_ID
-    0xC5A156554C61746ELLU, // bnr_Latn_VU
-    0xC9A1494E44657661LLU, // bns_Deva_IN
-    0xD1A149444C61746ELLU, // bnu_Latn_ID
-    0xD5A149444C61746ELLU, // bnv_Latn_ID
-    0xD9A150474C61746ELLU, // bnw_Latn_PG
-    0xDDA143444C61746ELLU, // bnx_Latn_CD
-    0xE1A14D594C61746ELLU, // bny_Latn_MY
-    0xE5A1434D4C61746ELLU, // bnz_Latn_CM
-    0x626F434E54696274LLU, // bo_Tibt_CN
-    0x81C150454C61746ELLU, // boa_Latn_PE
-    0x85C14B454C61746ELLU, // bob_Latn_KE
-    0x91C1434D4C61746ELLU, // boe_Latn_CM
-    0x95C142464C61746ELLU, // bof_Latn_BF
-    0x9DC143444C61746ELLU, // boh_Latn_CD
-    0xA5C150474C61746ELLU, // boj_Latn_PG
-    0xA9C143474C61746ELLU, // bok_Latn_CG
-    0xADC14E474C61746ELLU, // bol_Latn_NG
-    0xB1C14E474C61746ELLU, // bom_Latn_NG
-    0xB5C150474C61746ELLU, // bon_Latn_PG
-    0xB9C14D4C4C61746ELLU, // boo_Latn_ML
-    0xBDC150474C61746ELLU, // bop_Latn_PG
-    0xC1C150474C61746ELLU, // boq_Latn_PG
-    0xC5C142524C61746ELLU, // bor_Latn_BR
-    0xCDC153534C61746ELLU, // bot_Latn_SS
-    0xD1C1545A4C61746ELLU, // bou_Latn_TZ
-    0xD5C147484C61746ELLU, // bov_Latn_GH
-    0xD9C150474C61746ELLU, // bow_Latn_PG
-    0xDDC142464C61746ELLU, // box_Latn_BF
-    0xE1C143464C61746ELLU, // boy_Latn_CF
-    0xE5C14D4C4C61746ELLU, // boz_Latn_ML
-    0x81E156554C61746ELLU, // bpa_Latn_VU
-    0x89E1434D4C61746ELLU, // bpc_Latn_CM
-    0x8DE143464C61746ELLU, // bpd_Latn_CF
-    0x91E150474C61746ELLU, // bpe_Latn_PG
-    0x99E149444C61746ELLU, // bpg_Latn_ID
-    0x9DE152554379726CLLU, // bph_Cyrl_RU
-    0xA1E150474C61746ELLU, // bpi_Latn_PG
-    0xA5E143444C61746ELLU, // bpj_Latn_CD
-    0xA9E14E434C61746ELLU, // bpk_Latn_NC
-    0xADE141554C61746ELLU, // bpl_Latn_AU
-    0xB1E150474C61746ELLU, // bpm_Latn_PG
-    0xB9E149444C61746ELLU, // bpo_Latn_ID
-    0xBDE149444C61746ELLU, // bpp_Latn_ID
-    0xC1E149444C61746ELLU, // bpq_Latn_ID
-    0xC5E150484C61746ELLU, // bpr_Latn_PH
-    0xC9E150484C61746ELLU, // bps_Latn_PH
-    0xCDE141554C61746ELLU, // bpt_Latn_AU
-    0xD1E150474C61746ELLU, // bpu_Latn_PG
-    0xD5E149444C61746ELLU, // bpv_Latn_ID
-    0xD9E150474C61746ELLU, // bpw_Latn_PG
-    0xDDE1494E44657661LLU, // bpx_Deva_IN
-    0xE1E1494E42656E67LLU, // bpy_Beng_IN
-    0xE5E149444C61746ELLU, // bpz_Latn_ID
-    0x8201424A4C61746ELLU, // bqa_Latn_BJ
-    0x860149444C61746ELLU, // bqb_Latn_ID
-    0x8A01424A4C61746ELLU, // bqc_Latn_BJ
-    0x8E01434D4C61746ELLU, // bqd_Latn_CM
-    0x9601474E4C61746ELLU, // bqf_Latn_GN
-    0x9A0154474C61746ELLU, // bqg_Latn_TG
-    0xA201495241726162LLU, // bqi_Arab_IR
-    0xA601534E4C61746ELLU, // bqj_Latn_SN
-    0xAA0143464C61746ELLU, // bqk_Latn_CF
-    0xAE0150474C61746ELLU, // bql_Latn_PG
-    0xB201434D4C61746ELLU, // bqm_Latn_CM
-    0xBA01434D4C61746ELLU, // bqo_Latn_CM
-    0xBE014E474C61746ELLU, // bqp_Latn_NG
-    0xC20149444C61746ELLU, // bqq_Latn_ID
-    0xC60149444C61746ELLU, // bqr_Latn_ID
-    0xCA0150474C61746ELLU, // bqs_Latn_PG
-    0xCE01434D4C61746ELLU, // bqt_Latn_CM
-    0xD20143444C61746ELLU, // bqu_Latn_CD
-    0xD60143494C61746ELLU, // bqv_Latn_CI
-    0xDA014E474C61746ELLU, // bqw_Latn_NG
-    0xDE014E474C61746ELLU, // bqx_Latn_NG
-    0xE601434D4C61746ELLU, // bqz_Latn_CM
-    0x627246524C61746ELLU, // br_Latn_FR
-    0x8221494E44657661LLU, // bra_Deva_IN
-    0x86214B484B686D72LLU, // brb_Khmr_KH
-    0x8A2147594C61746ELLU, // brc_Latn_GY
-    0x8E214E5044657661LLU, // brd_Deva_NP
-    0x962143444C61746ELLU, // brf_Latn_CD
-    0x9A21424F4C61746ELLU, // brg_Latn_BO
-    0x9E21504B41726162LLU, // brh_Arab_PK
-    0xA221434D4C61746ELLU, // bri_Latn_CM
-    0xA62156554C61746ELLU, // brj_Latn_VU
-    0xAA21534441726162LLU, // brk_Arab_SD
-    0xAE2142574C61746ELLU, // brl_Latn_BW
-    0xB22143444C61746ELLU, // brm_Latn_CD
-    0xB62143524C61746ELLU, // brn_Latn_CR
-    0xBA21425454696274LLU, // bro_Tibt_BT
-    0xBE2149444C61746ELLU, // brp_Latn_ID
-    0xC22150474C61746ELLU, // brq_Latn_PG
-    0xC62153424C61746ELLU, // brr_Latn_SB
-    0xCA2149444C61746ELLU, // brs_Latn_ID
-    0xCE214E474C61746ELLU, // brt_Latn_NG
-    0xD221564E4C61746ELLU, // bru_Latn_VN
-    0xD6214C414C616F6FLLU, // brv_Laoo_LA
-    0xDA21494E4B6E6461LLU, // brw_Knda_IN
-    0xDE21494E44657661LLU, // brx_Deva_IN
-    0xE22150474C61746ELLU, // bry_Latn_PG
-    0xE62150474C61746ELLU, // brz_Latn_PG
-    0x627342414C61746ELLU, // bs_Latn_BA
-    0x824149444C61746ELLU, // bsa_Latn_ID
-    0x8641424E4C61746ELLU, // bsb_Latn_BN
-    0x8A41534E4C61746ELLU, // bsc_Latn_SN
-    0x9241434D4C61746ELLU, // bse_Latn_CM
-    0x96414E474C61746ELLU, // bsf_Latn_NG
-    0x9E41414641726162LLU, // bsh_Arab_AF
-    0xA241434D4C61746ELLU, // bsi_Latn_CM
-    0xA6414E474C61746ELLU, // bsj_Latn_NG
-    0xAA41504B41726162LLU, // bsk_Arab_PK
-    0xAE414E474C61746ELLU, // bsl_Latn_NG
-    0xB24149444C61746ELLU, // bsm_Latn_ID
-    0xB641434F4C61746ELLU, // bsn_Latn_CO
-    0xBA4154444C61746ELLU, // bso_Latn_TD
-    0xBE41474E4C61746ELLU, // bsp_Latn_GN
-    0xC2414C5242617373LLU, // bsq_Bass_LR
-    0xC6414E474C61746ELLU, // bsr_Latn_NG
-    0xCA41434D4C61746ELLU, // bss_Latn_CM
-    0xCE41455445746869LLU, // bst_Ethi_ET
-    0xD24149444C61746ELLU, // bsu_Latn_ID
-    0xD641474E4C61746ELLU, // bsv_Latn_GN
-    0xDA4145544C61746ELLU, // bsw_Latn_ET
-    0xDE414E474C61746ELLU, // bsx_Latn_NG
-    0xE2414D594C61746ELLU, // bsy_Latn_MY
-    0x82614E474C61746ELLU, // bta_Latn_NG
-    0x8A61434D4C61746ELLU, // btc_Latn_CM
-    0x8E6149444261746BLLU, // btd_Batk_ID
-    0x92614E474C61746ELLU, // bte_Latn_NG
-    0x966154444C61746ELLU, // btf_Latn_TD
-    0x9A6143494C61746ELLU, // btg_Latn_CI
-    0x9E614D594C61746ELLU, // bth_Latn_MY
-    0xA26149444C61746ELLU, // bti_Latn_ID
-    0xA66149444C61746ELLU, // btj_Latn_ID
-    0xB26149444261746BLLU, // btm_Batk_ID
-    0xB66150484C61746ELLU, // btn_Latn_PH
-    0xBA6150484C61746ELLU, // bto_Latn_PH
-    0xBE6150474C61746ELLU, // btp_Latn_PG
-    0xC2614D594C61746ELLU, // btq_Latn_MY
-    0xC66156554C61746ELLU, // btr_Latn_VU
-    0xCA6149444C61746ELLU, // bts_Latn_ID
-    0xCE614E474C61746ELLU, // btt_Latn_NG
-    0xD2614E474C61746ELLU, // btu_Latn_NG
-    0xD661504B44657661LLU, // btv_Deva_PK
-    0xDA6150484C61746ELLU, // btw_Latn_PH
-    0xDE6149444C61746ELLU, // btx_Latn_ID
-    0xE26149444C61746ELLU, // bty_Latn_ID
-    0xE66149444C61746ELLU, // btz_Latn_ID
-    0x828152554379726CLLU, // bua_Cyrl_RU
-    0x868154444C61746ELLU, // bub_Latn_TD
-    0x8A8159544C61746ELLU, // buc_Latn_YT
-    0x8E8154474C61746ELLU, // bud_Latn_TG
-    0x928143414C61746ELLU, // bue_Latn_CA
-    0x968143444C61746ELLU, // buf_Latn_CD
-    0x9A8149444C61746ELLU, // bug_Latn_ID
-    0x9E81434E4C61746ELLU, // buh_Latn_CN
-    0xA28143474C61746ELLU, // bui_Latn_CG
-    0xA6814E474C61746ELLU, // buj_Latn_NG
-    0xAA8150474C61746ELLU, // buk_Latn_PG
-    0xB281434D4C61746ELLU, // bum_Latn_CM
-    0xB681534C4C61746ELLU, // bun_Latn_SL
-    0xBA8150474C61746ELLU, // buo_Latn_PG
-    0xBE8149444C61746ELLU, // bup_Latn_ID
-    0xC28150474C61746ELLU, // buq_Latn_PG
-    0xCA814E474C61746ELLU, // bus_Latn_NG
-    0xCE8150474C61746ELLU, // but_Latn_PG
-    0xD28143444C61746ELLU, // buu_Latn_CD
-    0xD68150474C61746ELLU, // buv_Latn_PG
-    0xDA8147414C61746ELLU, // buw_Latn_GA
-    0xDE814E474C61746ELLU, // bux_Latn_NG
-    0xE281534C4C61746ELLU, // buy_Latn_SL
-    0xE6814E474C61746ELLU, // buz_Latn_NG
-    0x82A154444C61746ELLU, // bva_Latn_TD
-    0x86A147514C61746ELLU, // bvb_Latn_GQ
-    0x8AA153424C61746ELLU, // bvc_Latn_SB
-    0x8EA153424C61746ELLU, // bvd_Latn_SB
-    0x92A149444C61746ELLU, // bve_Latn_ID
-    0x96A154444C61746ELLU, // bvf_Latn_TD
-    0x9AA1434D4C61746ELLU, // bvg_Latn_CM
-    0x9EA14E474C61746ELLU, // bvh_Latn_NG
-    0xA2A153534C61746ELLU, // bvi_Latn_SS
-    0xA6A14E474C61746ELLU, // bvj_Latn_NG
-    0xAAA149444C61746ELLU, // bvk_Latn_ID
-    0xB2A1434D4C61746ELLU, // bvm_Latn_CM
-    0xB6A150474C61746ELLU, // bvn_Latn_PG
-    0xBAA154444C61746ELLU, // bvo_Latn_TD
-    0xC2A143464C61746ELLU, // bvq_Latn_CF
-    0xC6A141554C61746ELLU, // bvr_Latn_AU
-    0xCEA149444C61746ELLU, // bvt_Latn_ID
-    0xD2A149444C61746ELLU, // bvu_Latn_ID
-    0xD6A156454C61746ELLU, // bvv_Latn_VE
-    0xDAA14E474C61746ELLU, // bvw_Latn_NG
-    0xDEA143474C61746ELLU, // bvx_Latn_CG
-    0xE2A150484C61746ELLU, // bvy_Latn_PH
-    0xE6A149444C61746ELLU, // bvz_Latn_ID
-    0x82C14E434C61746ELLU, // bwa_Latn_NC
-    0x86C1464A4C61746ELLU, // bwb_Latn_FJ
-    0x8AC15A4D4C61746ELLU, // bwc_Latn_ZM
-    0x8EC150474C61746ELLU, // bwd_Latn_PG
-    0x92C14D4D4D796D72LLU, // bwe_Mymr_MM
-    0x96C150474C61746ELLU, // bwf_Latn_PG
-    0x9AC14D5A4C61746ELLU, // bwg_Latn_MZ
-    0x9EC1434D4C61746ELLU, // bwh_Latn_CM
-    0xA2C156454C61746ELLU, // bwi_Latn_VE
-    0xA6C142464C61746ELLU, // bwj_Latn_BF
-    0xAAC150474C61746ELLU, // bwk_Latn_PG
-    0xAEC143444C61746ELLU, // bwl_Latn_CD
-    0xB2C150474C61746ELLU, // bwm_Latn_PG
-    0xBAC145544C61746ELLU, // bwo_Latn_ET
-    0xBEC149444C61746ELLU, // bwp_Latn_ID
-    0xC2C142464C61746ELLU, // bwq_Latn_BF
-    0xC6C14E474C61746ELLU, // bwr_Latn_NG
-    0xCAC143444C61746ELLU, // bws_Latn_CD
-    0xCEC1434D4C61746ELLU, // bwt_Latn_CM
-    0xD2C147484C61746ELLU, // bwu_Latn_GH
-    0xDAC143444C61746ELLU, // bww_Latn_CD
-    0xDEC1434E4C61746ELLU, // bwx_Latn_CN
-    0xE2C142464C61746ELLU, // bwy_Latn_BF
-    0xE6C143474C61746ELLU, // bwz_Latn_CG
-    0x82E153424C61746ELLU, // bxa_Latn_SB
-    0x86E153534C61746ELLU, // bxb_Latn_SS
-    0x8AE147514C61746ELLU, // bxc_Latn_GQ
-    0x96E150474C61746ELLU, // bxf_Latn_PG
-    0x9AE143444C61746ELLU, // bxg_Latn_CD
-    0x9EE150474C61746ELLU, // bxh_Latn_PG
-    0xA2E141554C61746ELLU, // bxi_Latn_AU
-    0xA6E141554C61746ELLU, // bxj_Latn_AU
-    0xAEE142464C61746ELLU, // bxl_Latn_BF
-    0xB2E14D4E4379726CLLU, // bxm_Cyrl_MN
-    0xB6E141554C61746ELLU, // bxn_Latn_AU
-    0xBAE14E474C61746ELLU, // bxo_Latn_NG
-    0xBEE1434D4C61746ELLU, // bxp_Latn_CM
-    0xC2E14E474C61746ELLU, // bxq_Latn_NG
-    0xCAE1434D4C61746ELLU, // bxs_Latn_CM
-    0xD2E1434E4D6F6E67LLU, // bxu_Mong_CN
-    0xD6E154444C61746ELLU, // bxv_Latn_TD
-    0xDAE14D4C4C61746ELLU, // bxw_Latn_ML
-    0xE6E150474C61746ELLU, // bxz_Latn_PG
-    0x830150484C61746ELLU, // bya_Latn_PH
-    0x8701434D4C61746ELLU, // byb_Latn_CM
-    0x8B014E474C61746ELLU, // byc_Latn_NG
-    0x8F0149444C61746ELLU, // byd_Latn_ID
-    0x930150474C61746ELLU, // bye_Latn_PG
-    0x97014E474C61746ELLU, // byf_Latn_NG
-    0x9F014E5044657661LLU, // byh_Deva_NP
-    0xA30143444C61746ELLU, // byi_Latn_CD
-    0xA7014E474C61746ELLU, // byj_Latn_NG
-    0xAB01434E4C61746ELLU, // byk_Latn_CN
-    0xAF0149444C61746ELLU, // byl_Latn_ID
-    0xB30141554C61746ELLU, // bym_Latn_AU
-    0xB701455245746869LLU, // byn_Ethi_ER
-    0xBF014E474C61746ELLU, // byp_Latn_NG
-    0xC70150474C61746ELLU, // byr_Latn_PG
-    0xCB014E474C61746ELLU, // bys_Latn_NG
-    0xD701434D4C61746ELLU, // byv_Latn_CM
-    0xDB014E5044657661LLU, // byw_Deva_NP
-    0xDF0150474C61746ELLU, // byx_Latn_PG
-    0xE70150474C61746ELLU, // byz_Latn_PG
-    0x83214C524C61746ELLU, // bza_Latn_LR
-    0x872149444C61746ELLU, // bzb_Latn_ID
-    0x8B214D474C61746ELLU, // bzc_Latn_MG
-    0x8F2143524C61746ELLU, // bzd_Latn_CR
-    0x93214D4C4C61746ELLU, // bze_Latn_ML
-    0x972150474C61746ELLU, // bzf_Latn_PG
-    0x9F2150474C61746ELLU, // bzh_Latn_PG
-    0xA321544854686169LLU, // bzi_Thai_TH
-    0xA721425A4C61746ELLU, // bzj_Latn_BZ
-    0xAB214E494C61746ELLU, // bzk_Latn_NI
-    0xAF2149444C61746ELLU, // bzl_Latn_ID
-    0xB32143444C61746ELLU, // bzm_Latn_CD
-    0xB72149444C61746ELLU, // bzn_Latn_ID
-    0xBB2143444C61746ELLU, // bzo_Latn_CD
-    0xBF2149444C61746ELLU, // bzp_Latn_ID
-    0xC32149444C61746ELLU, // bzq_Latn_ID
-    0xC72141554C61746ELLU, // bzr_Latn_AU
-    0xD32149444C61746ELLU, // bzu_Latn_ID
-    0xD721434D4C61746ELLU, // bzv_Latn_CM
-    0xDB214E474C61746ELLU, // bzw_Latn_NG
-    0xDF214D4C4C61746ELLU, // bzx_Latn_ML
-    0xE3214E474C61746ELLU, // bzy_Latn_NG
-    0xE7214E474C61746ELLU, // bzz_Latn_NG
-    0x636145534C61746ELLU, // ca_Latn_ES
-    0x800247544C61746ELLU, // caa_Latn_GT
-    0x8402484E4C61746ELLU, // cab_Latn_HN
-    0x880247544C61746ELLU, // cac_Latn_GT
-    0x8C0255534C61746ELLU, // cad_Latn_US
-    0x9002534E4C61746ELLU, // cae_Latn_SN
-    0x940243414C61746ELLU, // caf_Latn_CA
-    0x980250594C61746ELLU, // cag_Latn_PY
-    0x9C0250454C61746ELLU, // cah_Latn_PE
-    0xA402424F4C61746ELLU, // caj_Latn_BO
-    0xA80247544C61746ELLU, // cak_Latn_GT
-    0xAC024D504C61746ELLU, // cal_Latn_MP
-    0xB0024E434C61746ELLU, // cam_Latn_NC
-    0xB40250474C61746ELLU, // can_Latn_PG
-    0xB802424F4C61746ELLU, // cao_Latn_BO
-    0xBC02424F4C61746ELLU, // cap_Latn_BO
-    0xC002494E4C61746ELLU, // caq_Latn_IN
-    0xC40256454C61746ELLU, // car_Latn_VE
-    0xC802424F4C61746ELLU, // cas_Latn_BO
-    0xD402424F4C61746ELLU, // cav_Latn_BO
-    0xD802424F4C61746ELLU, // caw_Latn_BO
-    0xDC02424F4C61746ELLU, // cax_Latn_BO
-    0xE00243414C61746ELLU, // cay_Latn_CA
-    0xE402424F4C61746ELLU, // caz_Latn_BO
-    0x8422434F4C61746ELLU, // cbb_Latn_CO
-    0x8822434F4C61746ELLU, // cbc_Latn_CO
-    0x8C22434F4C61746ELLU, // cbd_Latn_CO
-    0x9822434F4C61746ELLU, // cbg_Latn_CO
-    0xA02245434C61746ELLU, // cbi_Latn_EC
-    0xA422424A4C61746ELLU, // cbj_Latn_BJ
-    0xA82250484C61746ELLU, // cbk_Latn_PH
-    0xAC224D4D4C61746ELLU, // cbl_Latn_MM
-    0xB422544854686169LLU, // cbn_Thai_TH
-    0xB8224E474C61746ELLU, // cbo_Latn_NG
-    0xC0224E474C61746ELLU, // cbq_Latn_NG
-    0xC42250454C61746ELLU, // cbr_Latn_PE
-    0xC82250454C61746ELLU, // cbs_Latn_PE
-    0xCC2250454C61746ELLU, // cbt_Latn_PE
-    0xD02250454C61746ELLU, // cbu_Latn_PE
-    0xD422434F4C61746ELLU, // cbv_Latn_CO
-    0xD82250484C61746ELLU, // cbw_Latn_PH
-    0xE022434F4C61746ELLU, // cby_Latn_CO
-    0x884250454C61746ELLU, // ccc_Latn_PE
-    0x8C4242524C61746ELLU, // ccd_Latn_BR
-    0x90424D5A4C61746ELLU, // cce_Latn_MZ
-    0x98424E474C61746ELLU, // ccg_Latn_NG
-    0x9C424E474C61746ELLU, // cch_Latn_NG
-    0xA44247574C61746ELLU, // ccj_Latn_GW
-    0xAC42545A4C61746ELLU, // ccl_Latn_TZ
-    0xB0424D594C61746ELLU, // ccm_Latn_MY
-    0xB8424D584C61746ELLU, // cco_Latn_MX
-    0xBC42424443616B6DLLU, // ccp_Cakm_BD
-    0xC44253564C61746ELLU, // ccr_Latn_SV
-    0x9062494E54656C75LLU, // cde_Telu_IN
-    0x9462494E4C61746ELLU, // cdf_Latn_IN
-    0x9C62494E44657661LLU, // cdh_Deva_IN
-    0xA062494E47756A72LLU, // cdi_Gujr_IN
-    0xA462494E44657661LLU, // cdj_Deva_IN
-    0xB0624E5044657661LLU, // cdm_Deva_NP
-    0xB862434E48616E73LLU, // cdo_Hans_CN
-    0xC4624E474C61746ELLU, // cdr_Latn_NG
-    0xE462494E42656E67LLU, // cdz_Beng_IN
-    0x636552554379726CLLU, // ce_Cyrl_RU
-    0x808255534C61746ELLU, // cea_Latn_US
-    0x848250484C61746ELLU, // ceb_Latn_PH
-    0x988250594C61746ELLU, // ceg_Latn_PY
-    0xA8824D4D4C61746ELLU, // cek_Latn_MM
-    0xB4824E474C61746ELLU, // cen_Latn_NG
-    0xCC824E474C61746ELLU, // cet_Latn_NG
-    0xE0824D4D4C61746ELLU, // cey_Latn_MM
-    0x80A24E474C61746ELLU, // cfa_Latn_NG
-    0x8CA24E474C61746ELLU, // cfd_Latn_NG
-    0x98A24E474C61746ELLU, // cfg_Latn_NG
-    0xB0A24D4D4C61746ELLU, // cfm_Latn_MM
-    0x80C250474C61746ELLU, // cga_Latn_PG
-    0x88C250484C61746ELLU, // cgc_Latn_PH
-    0x98C255474C61746ELLU, // cgg_Latn_UG
-    0xA8C2425454696274LLU, // cgk_Tibt_BT
-    0x636847554C61746ELLU, // ch_Latn_GU
-    0x84E2434F4C61746ELLU, // chb_Latn_CO
-    0x8CE24D584C61746ELLU, // chd_Latn_MX
-    0x94E24D584C61746ELLU, // chf_Latn_MX
-    0x98E2544D41726162LLU, // chg_Arab_TM
-    0x9CE255534C61746ELLU, // chh_Latn_US
-    0xA4E24D584C61746ELLU, // chj_Latn_MX
-    0xA8E2464D4C61746ELLU, // chk_Latn_FM
-    0xACE255534C61746ELLU, // chl_Latn_US
-    0xB0E252554379726CLLU, // chm_Cyrl_RU
-    0xB4E255534C61746ELLU, // chn_Latn_US
-    0xB8E255534C61746ELLU, // cho_Latn_US
-    0xBCE243414C61746ELLU, // chp_Latn_CA
-    0xC0E24D584C61746ELLU, // chq_Latn_MX
-    0xC4E2555343686572LLU, // chr_Cher_US
-    0xCCE250454C61746ELLU, // cht_Latn_PE
-    0xD8E24D5A4C61746ELLU, // chw_Latn_MZ
-    0xDCE24E5044657661LLU, // chx_Deva_NP
-    0xE0E255534C61746ELLU, // chy_Latn_US
-    0xE4E24D584C61746ELLU, // chz_Latn_MX
-    0x810249444C61746ELLU, // cia_Latn_ID
-    0x8502424A4C61746ELLU, // cib_Latn_BJ
-    0x890255534C61746ELLU, // cic_Latn_US
-    0x91024E474C61746ELLU, // cie_Latn_NG
-    0x9D02494E44657661LLU, // cih_Deva_IN
-    0xB10249544C61746ELLU, // cim_Latn_IT
-    0xB50242524C61746ELLU, // cin_Latn_BR
-    0xBD024D584C61746ELLU, // cip_Latn_MX
-    0xC5024E434C61746ELLU, // cir_Latn_NC
-    0xD90255534C61746ELLU, // ciw_Latn_US
-    0xE10256454C61746ELLU, // ciy_Latn_VE
-    0x81224B4841726162LLU, // cja_Arab_KH
-    0x9122564E4C61746ELLU, // cje_Latn_VN
-    0x9D2255534C61746ELLU, // cjh_Latn_US
-    0xA12252554379726CLLU, // cji_Cyrl_RU
-    0xA922414F4C61746ELLU, // cjk_Latn_AO
-    0xB122564E4368616DLLU, // cjm_Cham_VN
-    0xB52250474C61746ELLU, // cjn_Latn_PG
-    0xB92250454C61746ELLU, // cjo_Latn_PE
-    0xBD2243524C61746ELLU, // cjp_Latn_CR
-    0xC92252554C61746ELLU, // cjs_Latn_RU
-    0xD52250474C61746ELLU, // cjv_Latn_PG
-    0xE122434E48616E73LLU, // cjy_Hans_CN
-    0x8542495141726162LLU, // ckb_Arab_IQ
-    0xAD424E474C61746ELLU, // ckl_Latn_NG
-    0xB14248524C61746ELLU, // ckm_Latn_HR
-    0xB5424D4D4C61746ELLU, // ckn_Latn_MM
-    0xB94247484C61746ELLU, // cko_Latn_GH
-    0xC14254444C61746ELLU, // ckq_Latn_TD
-    0xC54250474C61746ELLU, // ckr_Latn_PG
-    0xC9424E434C61746ELLU, // cks_Latn_NC
-    0xCD4252554379726CLLU, // ckt_Cyrl_RU
-    0xD14255534C61746ELLU, // cku_Latn_US
-    0xD54254574C61746ELLU, // ckv_Latn_TW
-    0xDD42434D4C61746ELLU, // ckx_Latn_CM
-    0xE1424E474C61746ELLU, // cky_Latn_NG
-    0xE54247544C61746ELLU, // ckz_Latn_GT
-    0x81624E474C61746ELLU, // cla_Latn_NG
-    0x896243414C61746ELLU, // clc_Latn_CA
-    0x91624D584C61746ELLU, // cle_Latn_MX
-    0x9D62504B41726162LLU, // clh_Arab_PK
-    0xA16247484C61746ELLU, // cli_Latn_GH
-    0xA5624D4D4C61746ELLU, // clj_Latn_MM
-    0xA962494E4C61746ELLU, // clk_Latn_IN
-    0xAD6247484C61746ELLU, // cll_Latn_GH
-    0xB16255534C61746ELLU, // clm_Latn_US
-    0xB9624D584C61746ELLU, // clo_Latn_MX
-    0xCD624D4D4C61746ELLU, // clt_Latn_MM
-    0xD16250484C61746ELLU, // clu_Latn_PH
-    0xD96252554379726CLLU, // clw_Cyrl_RU
-    0xE1624D584C61746ELLU, // cly_Latn_MX
-    0x8182564E4C61746ELLU, // cma_Latn_VN
-    0x918242464C61746ELLU, // cme_Latn_BF
-    0x99824D4E536F796FLLU, // cmg_Soyo_MN
-    0xA182434F4C61746ELLU, // cmi_Latn_CO
-    0xAD8249444C61746ELLU, // cml_Latn_ID
-    0xB982564E4C61746ELLU, // cmo_Latn_VN
-    0xC5824D4D4C61746ELLU, // cmr_Latn_MM
-    0xC98249544C61746ELLU, // cms_Latn_IT
-    0xCD825A414C61746ELLU, // cmt_Latn_ZA
-    0x81A2494E54696274LLU, // cna_Tibt_IN
-    0x85A24D4D4C61746ELLU, // cnb_Latn_MM
-    0x89A2564E4C61746ELLU, // cnc_Latn_VN
-    0x99A2434E4C61746ELLU, // cng_Latn_CN
-    0x9DA24D4D4C61746ELLU, // cnh_Latn_MM
-    0xA1A250454C61746ELLU, // cni_Latn_PE
-    0xA9A24D4D4C61746ELLU, // cnk_Latn_MM
-    0xADA24D584C61746ELLU, // cnl_Latn_MX
-    0xBDA2434E48616E73LLU, // cnp_Hans_CN
-    0xC1A2434D4C61746ELLU, // cnq_Latn_CM
-    0xC9A249444C61746ELLU, // cns_Latn_ID
-    0xCDA24D584C61746ELLU, // cnt_Latn_MX
-    0xD9A24D4D4C61746ELLU, // cnw_Latn_MM
-    0xDDA247424C61746ELLU, // cnx_Latn_GB
-    0x636F46524C61746ELLU, // co_Latn_FR
-    0x81C241554C61746ELLU, // coa_Latn_AU
-    0x85C24D584C61746ELLU, // cob_Latn_MX
-    0x89C24D584C61746ELLU, // coc_Latn_MX
-    0x8DC250454C61746ELLU, // cod_Latn_PE
-    0x91C2434F4C61746ELLU, // coe_Latn_CO
-    0x95C245434C61746ELLU, // cof_Latn_EC
-    0x99C2544854686169LLU, // cog_Thai_TH
-    0x9DC24B454C61746ELLU, // coh_Latn_KE
-    0xA5C24D584C61746ELLU, // coj_Latn_MX
-    0xA9C24D584C61746ELLU, // cok_Latn_MX
-    0xADC255534C61746ELLU, // col_Latn_US
-    0xB1C255534C61746ELLU, // com_Latn_US
-    0xB9C243414C61746ELLU, // coo_Latn_CA
-    0xBDC24547436F7074LLU, // cop_Copt_EG
-    0xC1C255534C61746ELLU, // coq_Latn_US
-    0xCDC250454C61746ELLU, // cot_Latn_PE
-    0xD1C2534E4C61746ELLU, // cou_Latn_SN
-    0xDDC250454C61746ELLU, // cox_Latn_PE
-    0xE5C24D584C61746ELLU, // coz_Latn_MX
-    0x81E24D584C61746ELLU, // cpa_Latn_MX
-    0x85E250454C61746ELLU, // cpb_Latn_PE
-    0x89E250454C61746ELLU, // cpc_Latn_PE
-    0x99E247524772656BLLU, // cpg_Grek_GR
-    0xA1E24E524C61746ELLU, // cpi_Latn_NR
-    0xB5E247484C61746ELLU, // cpn_Latn_GH
-    0xB9E242464C61746ELLU, // cpo_Latn_BF
-    0xC9E250484C61746ELLU, // cps_Latn_PH
-    0xD1E250454C61746ELLU, // cpu_Latn_PE
-    0xDDE2434E4C61746ELLU, // cpx_Latn_CN
-    0xE1E250454C61746ELLU, // cpy_Latn_PE
-    0x8E02434E4C61746ELLU, // cqd_Latn_CN
-    0x6372434143616E73LLU, // cr_Cans_CA
-    0x822245544C61746ELLU, // cra_Latn_ET
-    0x862256434C61746ELLU, // crb_Latn_VC
-    0x8A2256554C61746ELLU, // crc_Latn_VU
-    0x8E2255534C61746ELLU, // crd_Latn_US
-    0x9622434F4C61746ELLU, // crf_Latn_CO
-    0x9A2243414C61746ELLU, // crg_Latn_CA
-    0x9E2255414379726CLLU, // crh_Cyrl_UA
-    0xA22253544C61746ELLU, // cri_Latn_ST
-    0xA622434143616E73LLU, // crj_Cans_CA
-    0xAA22434143616E73LLU, // crk_Cans_CA
-    0xAE22434143616E73LLU, // crl_Cans_CA
-    0xB222434143616E73LLU, // crm_Cans_CA
-    0xB6224D584C61746ELLU, // crn_Latn_MX
-    0xBA2255534C61746ELLU, // cro_Latn_US
-    0xC22241524C61746ELLU, // crq_Latn_AR
-    0xCA2253434C61746ELLU, // crs_Latn_SC
-    0xCE2241524C61746ELLU, // crt_Latn_AR
-    0xD622494E4C61746ELLU, // crv_Latn_IN
-    0xDA22564E4C61746ELLU, // crw_Latn_VN
-    0xDE2243414C61746ELLU, // crx_Latn_CA
-    0xE2224E474C61746ELLU, // cry_Latn_NG
-    0xE62255534C61746ELLU, // crz_Latn_US
-    0x6373435A4C61746ELLU, // cs_Latn_CZ
-    0x82424D584C61746ELLU, // csa_Latn_MX
-    0x8642504C4C61746ELLU, // csb_Latn_PL
-    0x9E424D4D4D796D72LLU, // csh_Mymr_MM
-    0xA6424D4D4C61746ELLU, // csj_Latn_MM
-    0xAA42534E4C61746ELLU, // csk_Latn_SN
-    0xB24255534C61746ELLU, // csm_Latn_US
-    0xBA424D584C61746ELLU, // cso_Latn_MX
-    0xBE42434E48616E73LLU, // csp_Hans_CN
-    0xCA4255534C61746ELLU, // css_Latn_US
-    0xCE4255534C61746ELLU, // cst_Latn_US
-    0xD6424D4D4C61746ELLU, // csv_Latn_MM
-    0xDA42434143616E73LLU, // csw_Cans_CA
-    0xE2424D4D4C61746ELLU, // csy_Latn_MM
-    0xE64255534C61746ELLU, // csz_Latn_US
-    0x82624D584C61746ELLU, // cta_Latn_MX
-    0x8A6255534C61746ELLU, // ctc_Latn_US
-    0x8E624D4D50617563LLU, // ctd_Pauc_MM
-    0x92624D584C61746ELLU, // cte_Latn_MX
-    0x9A62424442656E67LLU, // ctg_Beng_BD
-    0x9E624D4D4C61746ELLU, // cth_Latn_MM
-    0xAE624D584C61746ELLU, // ctl_Latn_MX
-    0xB26255534C61746ELLU, // ctm_Latn_US
-    0xB6624E5044657661LLU, // ctn_Deva_NP
-    0xBA62434F4C61746ELLU, // cto_Latn_CO
-    0xBE624D584C61746ELLU, // ctp_Latn_MX
-    0xCA6250484C61746ELLU, // cts_Latn_PH
-    0xCE62494E54616D6CLLU, // ctt_Taml_IN
-    0xD2624D584C61746ELLU, // ctu_Latn_MX
-    0xE262494E54616D6CLLU, // cty_Taml_IN
-    0xE6624D584C61746ELLU, // ctz_Latn_MX
-    0x637552554379726CLLU, // cu_Cyrl_RU
-    0x63754247476C6167LLU, // cu_Glag_BG
-    0x8282564E4C61746ELLU, // cua_Latn_VN
-    0x8682434F4C61746ELLU, // cub_Latn_CO
-    0x8A824D584C61746ELLU, // cuc_Latn_MX
-    0x9E824B454C61746ELLU, // cuh_Latn_KE
-    0xA282434F4C61746ELLU, // cui_Latn_CO
-    0xA68250454C61746ELLU, // cuj_Latn_PE
-    0xAA8250414C61746ELLU, // cuk_Latn_PA
-    0xAE8242524C61746ELLU, // cul_Latn_BR
-    0xBA8256454C61746ELLU, // cuo_Latn_VE
-    0xBE8255534C61746ELLU, // cup_Latn_US
-    0xCE824D584C61746ELLU, // cut_Latn_MX
-    0xD282434E4C616E61LLU, // cuu_Lana_CN
-    0xD682434D4C61746ELLU, // cuv_Latn_CM
-    0xDE824D584C61746ELLU, // cux_Latn_MX
-    0xE2824D584C61746ELLU, // cuy_Latn_MX
-    0x637652554379726CLLU, // cv_Cyrl_RU
-    0x9AA2494E4C61746ELLU, // cvg_Latn_IN
-    0xB6A24D584C61746ELLU, // cvn_Latn_MX
-    0x82C2545A4C61746ELLU, // cwa_Latn_TZ
-    0x86C24D5A4C61746ELLU, // cwb_Latn_MZ
-    0x92C2545A4C61746ELLU, // cwe_Latn_TZ
-    0x9AC24D594C61746ELLU, // cwg_Latn_MY
-    0xCEC2534E4C61746ELLU, // cwt_Latn_SN
-    0x9EE24E474C61746ELLU, // cxh_Latn_NG
-    0x637947424C61746ELLU, // cy_Latn_GB
-    0x83024D584C61746ELLU, // cya_Latn_MX
-    0x8702424F4C61746ELLU, // cyb_Latn_BO
-    0xBB0250484C61746ELLU, // cyo_Latn_PH
-    0x9F22434E48616E73LLU, // czh_Hans_CN
-    0xAB22435A48656272LLU, // czk_Hebr_CZ
-    0xB7224D584C61746ELLU, // czn_Latn_MX
-    0xCF224D4D4C61746ELLU, // czt_Latn_MM
-    0x6461444B4C61746ELLU, // da_Latn_DK
-    0x800354444C61746ELLU, // daa_Latn_TD
-    0x880350474C61746ELLU, // dac_Latn_PG
-    0x8C0350474C61746ELLU, // dad_Latn_PG
-    0x9003434D4C61746ELLU, // dae_Latn_CM
-    0x980347484C61746ELLU, // dag_Latn_GH
-    0x9C0350474C61746ELLU, // dah_Latn_PG
-    0xA00354444C61746ELLU, // dai_Latn_TD
-    0xA40353444C61746ELLU, // daj_Latn_SD
-    0xA80355534C61746ELLU, // dak_Latn_US
-    0xAC034B454C61746ELLU, // dal_Latn_KE
-    0xB0034E474C61746ELLU, // dam_Latn_NG
-    0xB8034D4D4C61746ELLU, // dao_Latn_MM
-    0xC003494E44657661LLU, // daq_Deva_IN
-    0xC40352554379726CLLU, // dar_Cyrl_RU
-    0xC80343494C61746ELLU, // das_Latn_CI
-    0xD00354444C61746ELLU, // dau_Latn_TD
-    0xD4034B454C61746ELLU, // dav_Latn_KE
-    0xD80350484C61746ELLU, // daw_Latn_PH
-    0xDC0341554C61746ELLU, // dax_Latn_AU
-    0xE40349444C61746ELLU, // daz_Latn_ID
-    0x80234D4C4C61746ELLU, // dba_Latn_ML
-    0x84234E474C61746ELLU, // dbb_Latn_NG
-    0x8C234E474C61746ELLU, // dbd_Latn_NG
-    0x902349444C61746ELLU, // dbe_Latn_ID
-    0x942349444C61746ELLU, // dbf_Latn_ID
-    0x98234D4C4C61746ELLU, // dbg_Latn_ML
-    0xA0234E474C61746ELLU, // dbi_Latn_NG
-    0xA4234D594C61746ELLU, // dbj_Latn_MY
-    0xAC2341554C61746ELLU, // dbl_Latn_AU
-    0xB0234E474C61746ELLU, // dbm_Latn_NG
-    0xB42349444C61746ELLU, // dbn_Latn_ID
-    0xB8234E474C61746ELLU, // dbo_Latn_NG
-    0xBC234E474C61746ELLU, // dbp_Latn_NG
-    0xC023434D4C61746ELLU, // dbq_Latn_CM
-    0xCC234D4C4C61746ELLU, // dbt_Latn_ML
-    0xD0234D4C4C61746ELLU, // dbu_Latn_ML
-    0xD4234E474C61746ELLU, // dbv_Latn_NG
-    0xD8234D4C4C61746ELLU, // dbw_Latn_ML
-    0xE02350474C61746ELLU, // dby_Latn_PG
-    0x8843494E41726162LLU, // dcc_Arab_IN
-    0xC44356494C61746ELLU, // dcr_Latn_VI
-    0x806341554C61746ELLU, // dda_Latn_AU
-    0x8C6353534C61746ELLU, // ddd_Latn_SS
-    0x906343474C61746ELLU, // dde_Latn_CG
-    0x9863544C4C61746ELLU, // ddg_Latn_TL
-    0xA06350474C61746ELLU, // ddi_Latn_PG
-    0xA46341554C61746ELLU, // ddj_Latn_AU
-    0xB463424A4C61746ELLU, // ddn_Latn_BJ
-    0xB86352554379726CLLU, // ddo_Cyrl_RU
-    0xC46341554C61746ELLU, // ddr_Latn_AU
-    0xC8634D4C4C61746ELLU, // dds_Latn_ML
-    0xD86349444C61746ELLU, // ddw_Latn_ID
-    0x646544454C61746ELLU, // de_Latn_DE
-    0x888353444C61746ELLU, // dec_Latn_SD
-    0x8C8350474C61746ELLU, // ded_Latn_PG
-    0x90834C524C61746ELLU, // dee_Latn_LR
-    0x9483495241726162LLU, // def_Arab_IR
-    0x98834E474C61746ELLU, // deg_Latn_NG
-    0x9C83504B41726162LLU, // deh_Arab_PK
-    0xA08349444C61746ELLU, // dei_Latn_ID
-    0xA883434D4C61746ELLU, // dek_Latn_CM
-    0xAC8355534C61746ELLU, // del_Latn_US
-    0xB08349444C61746ELLU, // dem_Latn_ID
-    0xB48343414C61746ELLU, // den_Latn_CA
-    0xC08343464C61746ELLU, // deq_Latn_CF
-    0xC483494E42656E67LLU, // der_Beng_IN
-    0xC88342524C61746ELLU, // des_Latn_BR
-    0xD48350474C61746ELLU, // dev_Latn_PG
-    0xE48343444C61746ELLU, // dez_Latn_CD
-    0x80C347484C61746ELLU, // dga_Latn_GH
-    0x84C34D4C4C61746ELLU, // dgb_Latn_ML
-    0x88C350484C61746ELLU, // dgc_Latn_PH
-    0x8CC342464C61746ELLU, // dgd_Latn_BF
-    0x90C350474C61746ELLU, // dge_Latn_PG
-    0x98C350474C61746ELLU, // dgg_Latn_PG
-    0x9CC34E474C61746ELLU, // dgh_Latn_NG
-    0xA0C342464C61746ELLU, // dgi_Latn_BF
-    0xA8C343464C61746ELLU, // dgk_Latn_CF
-    0xACC3534441726162LLU, // dgl_Arab_SD
-    0xB4C341554C61746ELLU, // dgn_Latn_AU
-    0xC4C343414C61746ELLU, // dgr_Latn_CA
-    0xC8C342464C61746ELLU, // dgs_Latn_BF
-    0xCCC341554C61746ELLU, // dgt_Latn_AU
-    0xD8C341554C61746ELLU, // dgw_Latn_AU
-    0xDCC350474C61746ELLU, // dgx_Latn_PG
-    0xE4C350474C61746ELLU, // dgz_Latn_PG
-    0x98E341554C61746ELLU, // dhg_Latn_AU
-    0xA0E34E5044657661LLU, // dhi_Deva_NP
-    0xACE341554C61746ELLU, // dhl_Latn_AU
-    0xB0E3414F4C61746ELLU, // dhm_Latn_AO
-    0xB4E3494E47756A72LLU, // dhn_Gujr_IN
-    0xB8E3494E44657661LLU, // dho_Deva_IN
-    0xC4E341554C61746ELLU, // dhr_Latn_AU
-    0xC8E3545A4C61746ELLU, // dhs_Latn_TZ
-    0xD0E341554C61746ELLU, // dhu_Latn_AU
-    0xD4E34E434C61746ELLU, // dhv_Latn_NC
-    0xD8E34E5044657661LLU, // dhw_Deva_NP
-    0xDCE341554C61746ELLU, // dhx_Latn_AU
-    0x810350474C61746ELLU, // dia_Latn_PG
-    0x850353534C61746ELLU, // dib_Latn_SS
-    0x890343494C61746ELLU, // dic_Latn_CI
-    0x8D0353534C61746ELLU, // did_Latn_SS
-    0x950341554C61746ELLU, // dif_Latn_AU
-    0x99034B454C61746ELLU, // dig_Latn_KE
-    0x9D034D584C61746ELLU, // dih_Latn_MX
-    0xA103434D4C61746ELLU, // dii_Latn_CM
-    0xA50349444C61746ELLU, // dij_Latn_ID
-    0xAD0353444C61746ELLU, // dil_Latn_SD
-    0xB50353534C61746ELLU, // din_Latn_SS
-    0xB9034E474C61746ELLU, // dio_Latn_NG
-    0xBD0353534C61746ELLU, // dip_Latn_SS
-    0xC5034E474C61746ELLU, // dir_Latn_NG
-    0xC903494E4C61746ELLU, // dis_Latn_IN
-    0xD1034E414C61746ELLU, // diu_Latn_NA
-    0xD90353534C61746ELLU, // diw_Latn_SS
-    0xDD0356554C61746ELLU, // dix_Latn_VU
-    0xE10349444C61746ELLU, // diy_Latn_ID
-    0xE50343444C61746ELLU, // diz_Latn_CD
-    0x812341554C61746ELLU, // dja_Latn_AU
-    0x852341554C61746ELLU, // djb_Latn_AU
-    0x892354444C61746ELLU, // djc_Latn_TD
-    0x8D2341554C61746ELLU, // djd_Latn_AU
-    0x91234E454C61746ELLU, // dje_Latn_NE
-    0x952341554C61746ELLU, // djf_Latn_AU
-    0xA12341554C61746ELLU, // dji_Latn_AU
-    0xA52341554C61746ELLU, // djj_Latn_AU
-    0xA92353524C61746ELLU, // djk_Latn_SR
-    0xB1234D4C4C61746ELLU, // djm_Latn_ML
-    0xB52341554C61746ELLU, // djn_Latn_AU
-    0xB92349444C61746ELLU, // djo_Latn_ID
-    0xC52341554C61746ELLU, // djr_Latn_AU
-    0xD12350474C61746ELLU, // dju_Latn_PG
-    0xD92341554C61746ELLU, // djw_Latn_AU
-    0x8143425454696274LLU, // dka_Tibt_BT
-    0x99434E474C61746ELLU, // dkg_Latn_NG
-    0xA94349444C61746ELLU, // dkk_Latn_ID
-    0xC5434D594C61746ELLU, // dkr_Latn_MY
-    0xC94353534C61746ELLU, // dks_Latn_SS
-    0xDD43434D4C61746ELLU, // dkx_Latn_CM
-    0x996352554379726CLLU, // dlg_Cyrl_RU
-    0xB16348524C61746ELLU, // dlm_Latn_HR
-    0xB563494E4C61746ELLU, // dln_Latn_IN
-    0x818347414C61746ELLU, // dma_Latn_GA
-    0x85834D4C4C61746ELLU, // dmb_Latn_ML
-    0x898350474C61746ELLU, // dmc_Latn_PG
-    0x8D8341554C61746ELLU, // dmd_Latn_AU
-    0x9183434D4C61746ELLU, // dme_Latn_CM
-    0x95834E474D656466LLU, // dmf_Medf_NG
-    0x99834D594C61746ELLU, // dmg_Latn_MY
-    0xA983504B41726162LLU, // dmk_Arab_PK
-    0xAD83504B41726162LLU, // dml_Arab_PK
-    0xB183434D4C61746ELLU, // dmm_Latn_CM
-    0xB983434D4C61746ELLU, // dmo_Latn_CM
-    0xC58349444C61746ELLU, // dmr_Latn_ID
-    0xC98349444C61746ELLU, // dms_Latn_ID
-    0xD18349444C61746ELLU, // dmu_Latn_ID
-    0xD5834D594C61746ELLU, // dmv_Latn_MY
-    0xD98341554C61746ELLU, // dmw_Latn_AU
-    0xDD834D5A4C61746ELLU, // dmx_Latn_MZ
-    0xE18349444C61746ELLU, // dmy_Latn_ID
-    0x81A349444C61746ELLU, // dna_Latn_ID
-    0x8DA350474C61746ELLU, // dnd_Latn_PG
-    0x91A3545A4C61746ELLU, // dne_Latn_TZ
-    0x99A34B474379726CLLU, // dng_Cyrl_KG
-    0xA1A349444C61746ELLU, // dni_Latn_ID
-    0xA5A343494C61746ELLU, // dnj_Latn_CI
-    0xA9A349444C61746ELLU, // dnk_Latn_ID
-    0xB5A342464C61746ELLU, // dnn_Latn_BF
-    0xB9A343444C61746ELLU, // dno_Latn_CD
-    0xC5A350474C61746ELLU, // dnr_Latn_PG
-    0xCDA349444C61746ELLU, // dnt_Latn_ID
-    0xD1A34D4D4D796D72LLU, // dnu_Mymr_MM
-    0xD5A34D4D4D796D72LLU, // dnv_Mymr_MM
-    0xD9A349444C61746ELLU, // dnw_Latn_ID
-    0xE1A342524C61746ELLU, // dny_Latn_BR
-    0x81C350474C61746ELLU, // doa_Latn_PG
-    0x85C350474C61746ELLU, // dob_Latn_PG
-    0x89C3434E4C61746ELLU, // doc_Latn_CN
-    0x91C3545A4C61746ELLU, // doe_Latn_TZ
-    0x95C350474C61746ELLU, // dof_Latn_PG
-    0x9DC34E474C61746ELLU, // doh_Latn_NG
-    0xA1C3494E44657661LLU, // doi_Deva_IN
-    0xA9C349444C61746ELLU, // dok_Latn_ID
-    0xADC350474C61746ELLU, // dol_Latn_PG
-    0xB5C350474C61746ELLU, // don_Latn_PG
-    0xB9C343444C61746ELLU, // doo_Latn_CD
-    0xBDC3424A4C61746ELLU, // dop_Latn_BJ
-    0xC5C353424C61746ELLU, // dor_Latn_SB
-    0xC9C342464C61746ELLU, // dos_Latn_BF
-    0xCDC34E474C61746ELLU, // dot_Latn_NG
-    0xD5C35A574C61746ELLU, // dov_Latn_ZW
-    0xD9C3434D4C61746ELLU, // dow_Latn_CM
-    0xDDC3455445746869LLU, // dox_Ethi_ET
-    0xE1C347484C61746ELLU, // doy_Latn_GH
-    0xBDE34D594C61746ELLU, // dpp_Latn_MY
-    0x8A2350544C61746ELLU, // drc_Latn_PT
-    0x92234E5054696274LLU, // dre_Tibt_NP
-    0x9A234D594C61746ELLU, // drg_Latn_MY
-    0xA2234E474C61746ELLU, // dri_Latn_NG
-    0xAE2341554C61746ELLU, // drl_Latn_AU
-    0xB62349444C61746ELLU, // drn_Latn_ID
-    0xBA234D594C61746ELLU, // dro_Latn_MY
-    0xC2234E5044657661LLU, // drq_Deva_NP
-    0xCA23455445746869LLU, // drs_Ethi_ET
-    0xCE234E4C4C61746ELLU, // drt_Latn_NL
-    0xD22354574C61746ELLU, // dru_Latn_TW
-    0xE2234E5044657661LLU, // dry_Deva_NP
-    0x864344454C61746ELLU, // dsb_Latn_DE
-    0x9E434B454C61746ELLU, // dsh_Latn_KE
-    0xA24354444C61746ELLU, // dsi_Latn_TD
-    0xAA434E474C61746ELLU, // dsk_Latn_NG
-    0xB64349444C61746ELLU, // dsn_Latn_ID
-    0xBA43494E4F727961LLU, // dso_Orya_IN
-    0xC2434D4C4C61746ELLU, // dsq_Latn_ML
-    0x8263434E4C61746ELLU, // dta_Latn_CN
-    0x86634D594C61746ELLU, // dtb_Latn_MY
-    0x8E6343414C61746ELLU, // dtd_Latn_CA
-    0x9E6341554C61746ELLU, // dth_Latn_AU
-    0xA2634D4C4C61746ELLU, // dti_Latn_ML
-    0xAA634D4C4C61746ELLU, // dtk_Latn_ML
-    0xB2634D4C4C61746ELLU, // dtm_Latn_ML
-    0xBA634D4C4C61746ELLU, // dto_Latn_ML
-    0xBE634D594C61746ELLU, // dtp_Latn_MY
-    0xC6634D594C61746ELLU, // dtr_Latn_MY
-    0xCA634D4C4C61746ELLU, // dts_Latn_ML
-    0xCE634D4C4C61746ELLU, // dtt_Latn_ML
-    0xD2634D4C4C61746ELLU, // dtu_Latn_ML
-    0xE2634E5044657661LLU, // dty_Deva_NP
-    0x8283434D4C61746ELLU, // dua_Latn_CM
-    0x8683494E47756A72LLU, // dub_Gujr_IN
-    0x8A8350474C61746ELLU, // duc_Latn_PG
-    0x928350484C61746ELLU, // due_Latn_PH
-    0x96834E434C61746ELLU, // duf_Latn_NC
-    0x9A834B454C61746ELLU, // dug_Latn_KE
-    0x9E83494E44657661LLU, // duh_Deva_IN
-    0xA28350474C61746ELLU, // dui_Latn_PG
-    0xAA8350474C61746ELLU, // duk_Latn_PG
-    0xAE8350484C61746ELLU, // dul_Latn_PH
-    0xB2834E4C4C61746ELLU, // dum_Latn_NL
-    0xB68349444C61746ELLU, // dun_Latn_ID
-    0xBA8350484C61746ELLU, // duo_Latn_PH
-    0xBE8349444C61746ELLU, // dup_Latn_ID
-    0xC28349444C61746ELLU, // duq_Latn_ID
-    0xC683434D4C61746ELLU, // dur_Latn_CM
-    0xCA834E5044657661LLU, // dus_Deva_NP
-    0xD283434E4C61746ELLU, // duu_Latn_CN
-    0xD68349444C61746ELLU, // duv_Latn_ID
-    0xDA8349444C61746ELLU, // duw_Latn_ID
-    0xDE834D4C4C61746ELLU, // dux_Latn_ML
-    0xE28350484C61746ELLU, // duy_Latn_PH
-    0xE683434D4C61746ELLU, // duz_Latn_CM
-    0x64764D5654686161LLU, // dv_Thaa_MV
-    0x82A350474C61746ELLU, // dva_Latn_PG
-    0x82C34E474C61746ELLU, // dwa_Latn_NG
-    0xAAC3494E4F727961LLU, // dwk_Orya_IN
-    0xC6C345544C61746ELLU, // dwr_Latn_ET
-    0xD2C341554C61746ELLU, // dwu_Latn_AU
-    0xDAC350474C61746ELLU, // dww_Latn_PG
-    0xE2C341554C61746ELLU, // dwy_Latn_AU
-    0xE6C34E5044657661LLU, // dwz_Deva_NP
-    0x830342464C61746ELLU, // dya_Latn_BF
-    0x870341554C61746ELLU, // dyb_Latn_AU
-    0x8F0341554C61746ELLU, // dyd_Latn_AU
-    0x9B0350484C61746ELLU, // dyg_Latn_PH
-    0xA30343494C61746ELLU, // dyi_Latn_CI
-    0xB3034D4C4C61746ELLU, // dym_Latn_ML
-    0xB70341554C61746ELLU, // dyn_Latn_AU
-    0xBB03534E4C61746ELLU, // dyo_Latn_SN
-    0xC7034E474C61746ELLU, // dyr_Latn_NG
-    0xD30342464C61746ELLU, // dyu_Latn_BF
-    0xE30341554C61746ELLU, // dyy_Latn_AU
-    0x647A425454696274LLU, // dz_Tibt_BT
-    0x83234E474C61746ELLU, // dza_Latn_NG
-    0x8F234E474C61746ELLU, // dzd_Latn_NG
-    0x932341554C61746ELLU, // dze_Latn_AU
-    0x9B2354444C61746ELLU, // dzg_Latn_TD
-    0xAF23425454696274LLU, // dzl_Tibt_BT
-    0xB72343444C61746ELLU, // dzn_Latn_CD
-    0x800441554C61746ELLU, // eaa_Latn_AU
-    0x882449444C61746ELLU, // ebc_Latn_ID
-    0x98244E474C61746ELLU, // ebg_Latn_NG
-    0xA82450484C61746ELLU, // ebk_Latn_PH
-    0xB82443474C61746ELLU, // ebo_Latn_CG
-    0xC42443494C61746ELLU, // ebr_Latn_CI
-    0xD0244B454C61746ELLU, // ebu_Latn_KE
-    0xC44447524772656BLLU, // ecr_Grek_GR
-    0xE044435943707274LLU, // ecy_Cprt_CY
-    0x656547484C61746ELLU, // ee_Latn_GH
-    0x80A44E474C61746ELLU, // efa_Latn_NG
-    0x90A443444C61746ELLU, // efe_Latn_CD
-    0xA0A44E474C61746ELLU, // efi_Latn_NG
-    0x80C443494C61746ELLU, // ega_Latn_CI
-    0xACC449544C61746ELLU, // egl_Latn_IT
-    0xB0C4545A4C61746ELLU, // egm_Latn_TZ
-    0xB8C44E474C61746ELLU, // ego_Latn_NG
-    0xE0C4454745677970LLU, // egy_Egyp_EG
-    0xD0E44E474C61746ELLU, // ehu_Latn_NG
-    0xBD0449444C61746ELLU, // eip_Latn_ID
-    0xCD0450474C61746ELLU, // eit_Latn_PG
-    0xD50450474C61746ELLU, // eiv_Latn_PG
-    0x812447574C61746ELLU, // eja_Latn_GW
-    0x81444E474C61746ELLU, // eka_Latn_NG
-    0x91444E474C61746ELLU, // eke_Latn_NG
-    0x994449444C61746ELLU, // ekg_Latn_ID
-    0xA1444E474C61746ELLU, // eki_Latn_NG
-    0xAD4442444C61746ELLU, // ekl_Latn_BD
-    0xB144434D4C61746ELLU, // ekm_Latn_CM
-    0xB9444D5A4C61746ELLU, // eko_Latn_MZ
-    0xBD444E474C61746ELLU, // ekp_Latn_NG
-    0xC5444E474C61746ELLU, // ekr_Latn_NG
-    0xE1444D4D4B616C69LLU, // eky_Kali_MM
-    0x656C47524772656BLLU, // el_Grek_GR
-    0x916450474C61746ELLU, // ele_Latn_PG
-    0xA96450474C61746ELLU, // elk_Latn_PG
-    0xB1644E474C61746ELLU, // elm_Latn_NG
-    0xB9644B454C61746ELLU, // elo_Latn_KE
-    0xD16450474C61746ELLU, // elu_Latn_PG
-    0x81844E474C61746ELLU, // ema_Latn_NG
-    0x858449444C61746ELLU, // emb_Latn_ID
-    0x918447464C61746ELLU, // eme_Latn_GF
-    0x99844E5044657661LLU, // emg_Deva_NP
-    0xA18450474C61746ELLU, // emi_Latn_PG
-    0xB1844D584C61746ELLU, // emm_Latn_MX
-    0xB584434D4C61746ELLU, // emn_Latn_CM
-    0xBD8450414C61746ELLU, // emp_Latn_PA
-    0xC98455534C61746ELLU, // ems_Latn_US
-    0xD184494E44657661LLU, // emu_Deva_IN
-    0xD98449444C61746ELLU, // emw_Latn_ID
-    0xDD8446524C61746ELLU, // emx_Latn_FR
-    0xE584434D4C61746ELLU, // emz_Latn_CM
-    0x656E47424C61746ELLU, // en_Latn_GB
-    0x656E55534C61746ELLU, // en_Latn_US
-    0x656E474253686177LLU, // en_Shaw_GB
-    0x81A450474C61746ELLU, // ena_Latn_PG
-    0x85A44B454C61746ELLU, // enb_Latn_KE
-    0x89A4564E4C61746ELLU, // enc_Latn_VN
-    0x8DA449444C61746ELLU, // end_Latn_ID
-    0x95A452554379726CLLU, // enf_Cyrl_RU
-    0x9DA452554379726CLLU, // enh_Cyrl_RU
-    0xADA450594C61746ELLU, // enl_Latn_PY
-    0xB1A447424C61746ELLU, // enm_Latn_GB
-    0xB5A44E474C61746ELLU, // enn_Latn_NG
-    0xB9A449444C61746ELLU, // eno_Latn_ID
-    0xC1A450474C61746ELLU, // enq_Latn_PG
-    0xC5A449444C61746ELLU, // enr_Latn_ID
-    0xD5A44E474C61746ELLU, // env_Latn_NG
-    0xD9A44E474C61746ELLU, // enw_Latn_NG
-    0xDDA450594C61746ELLU, // enx_Latn_PY
-    0xCDC443494C61746ELLU, // eot_Latn_CI
-    0xA1E44E474C61746ELLU, // epi_Latn_NG
-    0x8224494E54616D6CLLU, // era_Taml_IN
-    0x9A2456554C61746ELLU, // erg_Latn_VU
-    0x9E244E474C61746ELLU, // erh_Latn_NG
-    0xA22450474C61746ELLU, // eri_Latn_PG
-    0xAA2456554C61746ELLU, // erk_Latn_VU
-    0xC62441554C61746ELLU, // err_Latn_AU
-    0xCA24434E4C61746ELLU, // ers_Latn_CN
-    0xCE2449444C61746ELLU, // ert_Latn_ID
-    0xDA2449444C61746ELLU, // erw_Latn_ID
-    0x657345534C61746ELLU, // es_Latn_ES
-    0x65734D584C61746ELLU, // es_Latn_MX
-    0x657355534C61746ELLU, // es_Latn_US
-    0x9244424F4C61746ELLU, // ese_Latn_BO
-    0x9A44494E476F6E6DLLU, // esg_Gonm_IN
-    0x9E44495241726162LLU, // esh_Arab_IR
-    0xA24455534C61746ELLU, // esi_Latn_US
-    0xB24443494C61746ELLU, // esm_Latn_CI
-    0xCA4455534C61746ELLU, // ess_Latn_US
-    0xD24455534C61746ELLU, // esu_Latn_US
-    0xE24450484C61746ELLU, // esy_Latn_PH
-    0x657445454C61746ELLU, // et_Latn_EE
-    0x86644E474C61746ELLU, // etb_Latn_NG
-    0xB66456554C61746ELLU, // etn_Latn_VU
-    0xBA64434D4C61746ELLU, // eto_Latn_CM
-    0xC66450474C61746ELLU, // etr_Latn_PG
-    0xCA644E474C61746ELLU, // ets_Latn_NG
-    0xCE6449544974616CLLU, // ett_Ital_IT
-    0xD2644E474C61746ELLU, // etu_Latn_NG
-    0xDE644E474C61746ELLU, // etx_Latn_NG
-    0xE66449444C61746ELLU, // etz_Latn_ID
-    0x657545534C61746ELLU, // eu_Latn_ES
-    0x8E844D584C61746ELLU, // eud_Latn_MX
-    0x92A452554379726CLLU, // eve_Cyrl_RU
-    0x9EA44E474C61746ELLU, // evh_Latn_NG
-    0xB6A452554379726CLLU, // evn_Cyrl_RU
-    0xBAC4434D4C61746ELLU, // ewo_Latn_CM
-    0xCEE445534C61746ELLU, // ext_Latn_ES
-    0x830455534C61746ELLU, // eya_Latn_US
-    0xBB044B454C61746ELLU, // eyo_Latn_KE
-    0x83244E474C61746ELLU, // eza_Latn_NG
-    0x93244E474C61746ELLU, // eze_Latn_NG
-    0x6661495241726162LLU, // fa_Arab_IR
-    0x800550474C61746ELLU, // faa_Latn_PG
-    0x840547514C61746ELLU, // fab_Latn_GQ
-    0x8C0550474C61746ELLU, // fad_Latn_PG
-    0x940553424C61746ELLU, // faf_Latn_SB
-    0x980550474C61746ELLU, // fag_Latn_PG
-    0x9C054E474C61746ELLU, // fah_Latn_NG
-    0xA00550474C61746ELLU, // fai_Latn_PG
-    0xA40550474C61746ELLU, // faj_Latn_PG
-    0xA805434D4C61746ELLU, // fak_Latn_CM
-    0xAC05434D4C61746ELLU, // fal_Latn_CM
-    0xB0054E474C61746ELLU, // fam_Latn_NG
-    0xB40547514C61746ELLU, // fan_Latn_GQ
-    0xBC05534E4C61746ELLU, // fap_Latn_SN
-    0xC40553424C61746ELLU, // far_Latn_SB
-    0xD00549444C61746ELLU, // fau_Latn_ID
-    0xDC0545534C61746ELLU, // fax_Latn_ES
-    0xE005495241726162LLU, // fay_Arab_IR
-    0xE405495241726162LLU, // faz_Arab_IR
-    0xAC2550484C61746ELLU, // fbl_Latn_PH
-    0xC48553534C61746ELLU, // fer_Latn_SS
-    0x6666474E41646C6DLLU, // ff_Adlm_GN
-    0x6666534E4C61746ELLU, // ff_Latn_SN
-    0xA0A550474C61746ELLU, // ffi_Latn_PG
-    0xB0A54D4C4C61746ELLU, // ffm_Latn_ML
-    0xC4C554444C61746ELLU, // fgr_Latn_TD
-    0x666946494C61746ELLU, // fi_Latn_FI
-    0x8105534441726162LLU, // fia_Arab_SD
-    0x91054E474C61746ELLU, // fie_Latn_NG
-    0x950553414C61746ELLU, // fif_Latn_SA
-    0xAD0550484C61746ELLU, // fil_Latn_PH
-    0xBD05545A4C61746ELLU, // fip_Latn_TZ
-    0xC5054E474C61746ELLU, // fir_Latn_NG
-    0xCD0553454C61746ELLU, // fit_Latn_SE
-    0xD90550474C61746ELLU, // fiw_Latn_PG
-    0x666A464A4C61746ELLU, // fj_Latn_FJ
-    0xA9454E474C61746ELLU, // fkk_Latn_NG
-    0xD5454E4F4C61746ELLU, // fkv_Latn_NO
-    0x816555534C61746ELLU, // fla_Latn_US
-    0x9D6549444C61746ELLU, // flh_Latn_ID
-    0xA1654E474C61746ELLU, // fli_Latn_NG
-    0xAD65434D4C61746ELLU, // fll_Latn_CM
-    0xB56541554C61746ELLU, // fln_Latn_AU
-    0xC56543444C61746ELLU, // flr_Latn_CD
-    0xE1655A414C61746ELLU, // fly_Latn_ZA
-    0xBD85434D4C61746ELLU, // fmp_Latn_CM
-    0xD185494E44657661LLU, // fmu_Deva_IN
-    0x85A556554C61746ELLU, // fnb_Latn_VU
-    0x99A55A414C61746ELLU, // fng_Latn_ZA
-    0xA1A554444C61746ELLU, // fni_Latn_TD
-    0x666F464F4C61746ELLU, // fo_Latn_FO
-    0x8DC5424A4C61746ELLU, // fod_Latn_BJ
-    0xA1C550474C61746ELLU, // foi_Latn_PG
-    0xB1C543444C61746ELLU, // fom_Latn_CD
-    0xB5C5424A4C61746ELLU, // fon_Latn_BJ
-    0xC5C550474C61746ELLU, // for_Latn_PG
-    0xC9C554574C61746ELLU, // fos_Latn_TW
-    0x91E547514C61746ELLU, // fpe_Latn_GQ
-    0xCA0550474C61746ELLU, // fqs_Latn_PG
-    0x667246524C61746ELLU, // fr_Latn_FR
-    0x8A2555534C61746ELLU, // frc_Latn_US
-    0x8E2549444C61746ELLU, // frd_Latn_ID
-    0xAA2544454C61746ELLU, // frk_Latn_DE
-    0xB22546524C61746ELLU, // frm_Latn_FR
-    0xBA2546524C61746ELLU, // fro_Latn_FR
-    0xBE2546524C61746ELLU, // frp_Latn_FR
-    0xC22550474C61746ELLU, // frq_Latn_PG
-    0xC62544454C61746ELLU, // frr_Latn_DE
-    0xCA2544454C61746ELLU, // frs_Latn_DE
-    0xCE2556554C61746ELLU, // frt_Latn_VU
-    0x8685434D41726162LLU, // fub_Arab_CM
-    0x8E8557464C61746ELLU, // fud_Latn_WF
-    0x9285424A4C61746ELLU, // fue_Latn_BJ
-    0x9685474E4C61746ELLU, // fuf_Latn_GN
-    0x9E854E454C61746ELLU, // fuh_Latn_NE
-    0xA28554444C61746ELLU, // fui_Latn_TD
-    0xB2854E474C61746ELLU, // fum_Latn_NG
-    0xB68542524C61746ELLU, // fun_Latn_BR
-    0xC2854E454C61746ELLU, // fuq_Latn_NE
-    0xC68549544C61746ELLU, // fur_Latn_IT
-    0xCE8556554C61746ELLU, // fut_Latn_VU
-    0xD28543444C61746ELLU, // fuu_Latn_CD
-    0xD6854E474C61746ELLU, // fuv_Latn_NG
-    0xE28550474C61746ELLU, // fuy_Latn_PG
-    0xC6A553444C61746ELLU, // fvr_Latn_SD
-    0x82C54E434C61746ELLU, // fwa_Latn_NC
-    0x92C54E414C61746ELLU, // fwe_Latn_NA
-    0x66794E4C4C61746ELLU, // fy_Latn_NL
-    0x676149454C61746ELLU, // ga_Latn_IE
-    0x800647484C61746ELLU, // gaa_Latn_GH
-    0x840654444C61746ELLU, // gab_Latn_TD
-    0x8806494E4C61746ELLU, // gac_Latn_IN
-    0x8C0650484C61746ELLU, // gad_Latn_PH
-    0x900656454C61746ELLU, // gae_Latn_VE
-    0x940650474C61746ELLU, // gaf_Latn_PG
-    0x98064D444C61746ELLU, // gag_Latn_MD
-    0x9C0650474C61746ELLU, // gah_Latn_PG
-    0xA00650474C61746ELLU, // gai_Latn_PG
-    0xA40650474C61746ELLU, // gaj_Latn_PG
-    0xA80649444C61746ELLU, // gak_Latn_ID
-    0xAC06544C4C61746ELLU, // gal_Latn_TL
-    0xB00650474C61746ELLU, // gam_Latn_PG
-    0xB406434E48616E73LLU, // gan_Hans_CN
-    0xB80650474C61746ELLU, // gao_Latn_PG
-    0xBC0650474C61746ELLU, // gap_Latn_PG
-    0xC006494E4F727961LLU, // gaq_Orya_IN
-    0xC40650474C61746ELLU, // gar_Latn_PG
-    0xC806494E47756A72LLU, // gas_Gujr_IN
-    0xCC0650474C61746ELLU, // gat_Latn_PG
-    0xD006494E54656C75LLU, // gau_Telu_IN
-    0xD80650474C61746ELLU, // gaw_Latn_PG
-    0xDC0645544C61746ELLU, // gax_Latn_ET
-    0xE00649444C61746ELLU, // gay_Latn_ID
-    0x802643464C61746ELLU, // gba_Latn_CF
-    0x842641554C61746ELLU, // gbb_Latn_AU
-    0x8C2641554C61746ELLU, // gbd_Latn_AU
-    0x902650474C61746ELLU, // gbe_Latn_PG
-    0x942650474C61746ELLU, // gbf_Latn_PG
-    0x982643464C61746ELLU, // gbg_Latn_CF
-    0x9C26424A4C61746ELLU, // gbh_Latn_BJ
-    0xA02649444C61746ELLU, // gbi_Latn_ID
-    0xA426494E4F727961LLU, // gbj_Orya_IN
-    0xA826494E44657661LLU, // gbk_Deva_IN
-    0xAC26494E47756A72LLU, // gbl_Gujr_IN
-    0xB026494E44657661LLU, // gbm_Deva_IN
-    0xB42653534C61746ELLU, // gbn_Latn_SS
-    0xBC2643464C61746ELLU, // gbp_Latn_CF
-    0xC02643464C61746ELLU, // gbq_Latn_CF
-    0xC4264E474C61746ELLU, // gbr_Latn_NG
-    0xC826424A4C61746ELLU, // gbs_Latn_BJ
-    0xD02641554C61746ELLU, // gbu_Latn_AU
-    0xD42643464C61746ELLU, // gbv_Latn_CF
-    0xD82641554C61746ELLU, // gbw_Latn_AU
-    0xDC26424A4C61746ELLU, // gbx_Latn_BJ
-    0xE0264E474C61746ELLU, // gby_Latn_NG
-    0xE426495241726162LLU, // gbz_Arab_IR
-    0x884650474C61746ELLU, // gcc_Latn_PG
-    0x8C4641554C61746ELLU, // gcd_Latn_AU
-    0x944647504C61746ELLU, // gcf_Latn_GP
-    0xAC4647444C61746ELLU, // gcl_Latn_GD
-    0xB44650474C61746ELLU, // gcn_Latn_PG
-    0xC44647464C61746ELLU, // gcr_Latn_GF
-    0xCC4656454C61746ELLU, // gct_Latn_VE
-    0x676447424C61746ELLU, // gd_Latn_GB
-    0x8466494E4F727961LLU, // gdb_Orya_IN
-    0x886641554C61746ELLU, // gdc_Latn_AU
-    0x8C6650474C61746ELLU, // gdd_Latn_PG
-    0x90664E474C61746ELLU, // gde_Latn_NG
-    0x94664E474C61746ELLU, // gdf_Latn_NG
-    0x986650484C61746ELLU, // gdg_Latn_PH
-    0x9C6641554C61746ELLU, // gdh_Latn_AU
-    0xA06643464C61746ELLU, // gdi_Latn_CF
-    0xA46641554C61746ELLU, // gdj_Latn_AU
-    0xA86654444C61746ELLU, // gdk_Latn_TD
-    0xAC6645544C61746ELLU, // gdl_Latn_ET
-    0xB06654444C61746ELLU, // gdm_Latn_TD
-    0xB46650474C61746ELLU, // gdn_Latn_PG
-    0xB86652554379726CLLU, // gdo_Cyrl_RU
-    0xC06659454C61746ELLU, // gdq_Latn_YE
-    0xC46650474C61746ELLU, // gdr_Latn_PG
-    0xCC6641554C61746ELLU, // gdt_Latn_AU
-    0xD0664E474C61746ELLU, // gdu_Latn_NG
-    0xDC66494E44657661LLU, // gdx_Deva_IN
-    0x80864E474C61746ELLU, // gea_Latn_NG
-    0x848650474C61746ELLU, // geb_Latn_PG
-    0x88864C524C61746ELLU, // gec_Latn_LR
-    0x8C864E474C61746ELLU, // ged_Latn_NG
-    0x948649444C61746ELLU, // gef_Latn_ID
-    0x98864E474C61746ELLU, // geg_Latn_NG
-    0x9C8643414C61746ELLU, // geh_Latn_CA
-    0xA08649444C61746ELLU, // gei_Latn_ID
-    0xA48654474C61746ELLU, // gej_Latn_TG
-    0xA8864E474C61746ELLU, // gek_Latn_NG
-    0xAC864E474C61746ELLU, // gel_Latn_NG
-    0xC08643464C61746ELLU, // geq_Latn_CF
-    0xC88649444C61746ELLU, // ges_Latn_ID
-    0xD48647414C61746ELLU, // gev_Latn_GA
-    0xD8864E474C61746ELLU, // gew_Latn_NG
-    0xDC86534F4C61746ELLU, // gex_Latn_SO
-    0xE08643444C61746ELLU, // gey_Latn_CD
-    0xE486455445746869LLU, // gez_Ethi_ET
-    0xA8A650474C61746ELLU, // gfk_Latn_PG
-    0x80C653424C61746ELLU, // gga_Latn_SB
-    0x84C64C524C61746ELLU, // ggb_Latn_LR
-    0x8CC641554C61746ELLU, // ggd_Latn_AU
-    0x90C641554C61746ELLU, // gge_Latn_AU
-    0x98C6504B41726162LLU, // ggg_Arab_PK
-    0xA8C641554C61746ELLU, // ggk_Latn_AU
-    0xACC650474C61746ELLU, // ggl_Latn_PG
-    0xCCC650474C61746ELLU, // ggt_Latn_PG
-    0xD0C643494C61746ELLU, // ggu_Latn_CI
-    0xD8C650474C61746ELLU, // ggw_Latn_PG
-    0x80E64C5941726162LLU, // gha_Arab_LY
-    0x88E647424C61746ELLU, // ghc_Latn_GB
-    0x90E64E5044657661LLU, // ghe_Deva_NP
-    0xA8E64D4D4C61746ELLU, // ghk_Latn_MM
-    0xB4E653424C61746ELLU, // ghn_Latn_SB
-    0xB8E64D4154666E67LLU, // gho_Tfng_MA
-    0xC4E6504B41726162LLU, // ghr_Arab_PK
-    0xC8E650474C61746ELLU, // ghs_Latn_PG
-    0xCCE64E5054696274LLU, // ght_Tibt_NP
-    0x810641554C61746ELLU, // gia_Latn_AU
-    0x85064E474C61746ELLU, // gib_Latn_NG
-    0x89065A414C61746ELLU, // gic_Latn_ZA
-    0x8D06434D4C61746ELLU, // gid_Latn_CM
-    0x910643494C61746ELLU, // gie_Latn_CI
-    0x9906504B41726162LLU, // gig_Arab_PK
-    0x9D0641554C61746ELLU, // gih_Latn_AU
-    0xAD064B494C61746ELLU, // gil_Latn_KI
-    0xB10650474C61746ELLU, // gim_Latn_PG
-    0xB50652554379726CLLU, // gin_Cyrl_RU
-    0xBD0650474C61746ELLU, // gip_Latn_PG
-    0xC106564E4C61746ELLU, // giq_Latn_VN
-    0xC506564E4C61746ELLU, // gir_Latn_VN
-    0xC906434D4C61746ELLU, // gis_Latn_CM
-    0xCD0643414C61746ELLU, // git_Latn_CA
-    0xDD0643444C61746ELLU, // gix_Latn_CD
-    0xE10641554C61746ELLU, // giy_Latn_AU
-    0xE506434D4C61746ELLU, // giz_Latn_CM
-    0xA926504B41726162LLU, // gjk_Arab_PK
-    0xB12641554C61746ELLU, // gjm_Latn_AU
-    0xB52647484C61746ELLU, // gjn_Latn_GH
-    0xC52641554C61746ELLU, // gjr_Latn_AU
-    0xD126504B41726162LLU, // gju_Arab_PK
-    0x814650474C61746ELLU, // gka_Latn_PG
-    0x8D4650474C61746ELLU, // gkd_Latn_PG
-    0x9146434D4C61746ELLU, // gke_Latn_CM
-    0xB5464E474C61746ELLU, // gkn_Latn_NG
-    0xB94641554C61746ELLU, // gko_Latn_AU
-    0xBD46474E4C61746ELLU, // gkp_Latn_GN
-    0xD1465A414C61746ELLU, // gku_Latn_ZA
-    0x676C45534C61746ELLU, // gl_Latn_ES
-    0x85664E474C61746ELLU, // glb_Latn_NG
-    0x896654444C61746ELLU, // glc_Latn_TD
-    0x8D6652554379726CLLU, // gld_Cyrl_RU
-    0x9D66414641726162LLU, // glh_Arab_AF
-    0xA56654444C61746ELLU, // glj_Latn_TD
-    0xA966495241726162LLU, // glk_Arab_IR
-    0xAD6641554C61746ELLU, // gll_Latn_AU
-    0xB9664E474C61746ELLU, // glo_Latn_NG
-    0xC5664C524C61746ELLU, // glr_Latn_LR
-    0xD16654444C61746ELLU, // glu_Latn_TD
-    0xD9664E474C61746ELLU, // glw_Latn_NG
-    0x818641554C61746ELLU, // gma_Latn_AU
-    0x858653424C61746ELLU, // gmb_Latn_SB
-    0x8D864E474C61746ELLU, // gmd_Latn_NG
-    0x998650474C61746ELLU, // gmg_Latn_PG
-    0x9D8644454C61746ELLU, // gmh_Latn_DE
-    0xAD8644454C617466LLU, // gml_Latf_DE
-    0xB186434D4C61746ELLU, // gmm_Latn_CM
-    0xB586434D4C61746ELLU, // gmn_Latn_CM
-    0xC58641554C61746ELLU, // gmr_Latn_AU
-    0xD18650474C61746ELLU, // gmu_Latn_PG
-    0xD586455445746869LLU, // gmv_Ethi_ET
-    0xDD86545A4C61746ELLU, // gmx_Latn_TZ
-    0xE18647524C696E62LLU, // gmy_Linb_GR
-    0xE5864E474C61746ELLU, // gmz_Latn_NG
-    0x676E50594C61746ELLU, // gn_Latn_PY
-    0x81A642464C61746ELLU, // gna_Latn_BF
-    0x85A6494E4C61746ELLU, // gnb_Latn_IN
-    0x89A645534C61746ELLU, // gnc_Latn_ES
-    0x8DA6434D4C61746ELLU, // gnd_Latn_CM
-    0x91A64E474C61746ELLU, // gne_Latn_NG
-    0x99A654474C61746ELLU, // gng_Latn_TG
-    0x9DA64E474C61746ELLU, // gnh_Latn_NG
-    0xA1A641554C61746ELLU, // gni_Latn_AU
-    0xA5A643494C61746ELLU, // gnj_Latn_CI
-    0xA9A642574C61746ELLU, // gnk_Latn_BW
-    0xADA641554C61746ELLU, // gnl_Latn_AU
-    0xB1A650474C61746ELLU, // gnm_Latn_PG
-    0xB5A641554C61746ELLU, // gnn_Latn_AU
-    0xC1A64D594C61746ELLU, // gnq_Latn_MY
-    0xC5A641554C61746ELLU, // gnr_Latn_AU
-    0xCDA650474C61746ELLU, // gnt_Latn_PG
-    0xD1A650474C61746ELLU, // gnu_Latn_PG
-    0xD9A6424F4C61746ELLU, // gnw_Latn_BO
-    0xE5A643464C61746ELLU, // gnz_Latn_CF
-    0x81C643494C61746ELLU, // goa_Latn_CI
-    0x85C6434F4C61746ELLU, // gob_Latn_CO
-    0x89C650474C61746ELLU, // goc_Latn_PG
-    0x8DC643494C61746ELLU, // god_Latn_CI
-    0x91C6425454696274LLU, // goe_Tibt_BT
-    0x95C6455445746869LLU, // gof_Ethi_ET
-    0x99C6545A4C61746ELLU, // gog_Latn_TZ
-    0x9DC644454C61746ELLU, // goh_Latn_DE
-    0xA1C650474C61746ELLU, // goi_Latn_PG
-    0xA5C6494E44657661LLU, // goj_Deva_IN
-    0xA9C6494E44657661LLU, // gok_Deva_IN
-    0xADC64C524C61746ELLU, // gol_Latn_LR
-    0xB5C6494E44657661LLU, // gon_Deva_IN
-    0xB9C6464A4C61746ELLU, // goo_Latn_FJ
-    0xBDC649444C61746ELLU, // gop_Latn_ID
-    0xC1C649444C61746ELLU, // goq_Latn_ID
-    0xC5C649444C61746ELLU, // gor_Latn_ID
-    0xC9C64E4C4C61746ELLU, // gos_Latn_NL
-    0xCDC65541476F7468LLU, // got_Goth_UA
-    0xD1C6434D4C61746ELLU, // gou_Latn_CM
-    0xD5C643494C61746ELLU, // gov_Latn_CI
-    0xD9C6545A4C61746ELLU, // gow_Latn_TZ
-    0xDDC643444C61746ELLU, // gox_Latn_CD
-    0xE1C654444C61746ELLU, // goy_Latn_TD
-    0x81E64E474C61746ELLU, // gpa_Latn_NG
-    0x91E647484C61746ELLU, // gpe_Latn_GH
-    0xB5E650474C61746ELLU, // gpn_Latn_PG
-    0x82064E474C61746ELLU, // gqa_Latn_NG
-    0xB60642524C61746ELLU, // gqn_Latn_BR
-    0xC60654444C61746ELLU, // gqr_Latn_TD
-    0x8226494E44657661LLU, // gra_Deva_IN
-    0x86264C524C61746ELLU, // grb_Latn_LR
-    0x8A26435943707274LLU, // grc_Cprt_CY
-    0x8A2647524C696E62LLU, // grc_Linb_GR
-    0x8E264E474C61746ELLU, // grd_Latn_NG
-    0x9A2650474C61746ELLU, // grg_Latn_PG
-    0x9E264E474C61746ELLU, // grh_Latn_NG
-    0xA22653424C61746ELLU, // gri_Latn_SB
-    0xA6264C524C61746ELLU, // grj_Latn_LR
-    0xB2264D594C61746ELLU, // grm_Latn_MY
-    0xC22650474C61746ELLU, // grq_Latn_PG
-    0xCA2649444C61746ELLU, // grs_Latn_ID
-    0xCE26494E42656E67LLU, // grt_Beng_IN
-    0xD226455445746869LLU, // gru_Ethi_ET
-    0xD6264C524C61746ELLU, // grv_Latn_LR
-    0xDA2650474C61746ELLU, // grw_Latn_PG
-    0xDE2650474C61746ELLU, // grx_Latn_PG
-    0xE2264C524C61746ELLU, // gry_Latn_LR
-    0xE62650474C61746ELLU, // grz_Latn_PG
-    0xAE46534E4C61746ELLU, // gsl_Latn_SN
-    0xB64650474C61746ELLU, // gsn_Latn_PG
-    0xBA4643464C61746ELLU, // gso_Latn_CF
-    0xBE4650474C61746ELLU, // gsp_Latn_PG
-    0xDA4643484C61746ELLU, // gsw_Latn_CH
-    0x826642524C61746ELLU, // gta_Latn_BR
-    0xD26641554C61746ELLU, // gtu_Latn_AU
-    0x6775494E47756A72LLU, // gu_Gujr_IN
-    0x82864E474C61746ELLU, // gua_Latn_NG
-    0x868642524C61746ELLU, // gub_Latn_BR
-    0x8A86434F4C61746ELLU, // guc_Latn_CO
-    0x8E8643494C61746ELLU, // gud_Latn_CI
-    0x928641554C61746ELLU, // gue_Latn_AU
-    0x968641554C61746ELLU, // guf_Latn_AU
-    0x9E86434F4C61746ELLU, // guh_Latn_CO
-    0xA286424F4C61746ELLU, // gui_Latn_BO
-    0xAA8645544C61746ELLU, // guk_Latn_ET
-    0xAE8655534C61746ELLU, // gul_Latn_US
-    0xB286434F4C61746ELLU, // gum_Latn_CO
-    0xB68642524C61746ELLU, // gun_Latn_BR
-    0xBA86434F4C61746ELLU, // guo_Latn_CO
-    0xBE8641554C61746ELLU, // gup_Latn_AU
-    0xC28650594C61746ELLU, // guq_Latn_PY
-    0xC68647484C61746ELLU, // gur_Latn_GH
-    0xCE8643524C61746ELLU, // gut_Latn_CR
-    0xD28656454C61746ELLU, // guu_Latn_VE
-    0xDA86424A4C61746ELLU, // guw_Latn_BJ
-    0xDE8642464C61746ELLU, // gux_Latn_BF
-    0xE6864B454C61746ELLU, // guz_Latn_KE
-    0x6776494D4C61746ELLU, // gv_Latn_IM
-    0x82A650594C61746ELLU, // gva_Latn_PY
-    0x8AA642524C61746ELLU, // gvc_Latn_BR
-    0x92A650474C61746ELLU, // gve_Latn_PG
-    0x96A650474C61746ELLU, // gvf_Latn_PG
-    0xA6A642524C61746ELLU, // gvj_Latn_BR
-    0xAEA654444C61746ELLU, // gvl_Latn_TD
-    0xB2A64E474C61746ELLU, // gvm_Latn_NG
-    0xB6A641554C61746ELLU, // gvn_Latn_AU
-    0xBAA642524C61746ELLU, // gvo_Latn_BR
-    0xBEA642524C61746ELLU, // gvp_Latn_BR
-    0xC6A64E5044657661LLU, // gvr_Deva_NP
-    0xCAA650474C61746ELLU, // gvs_Latn_PG
-    0xE2A641554C61746ELLU, // gvy_Latn_AU
-    0x82C643494C61746ELLU, // gwa_Latn_CI
-    0x86C64E474C61746ELLU, // gwb_Latn_NG
-    0x8AC6504B41726162LLU, // gwc_Arab_PK
-    0x8EC645544C61746ELLU, // gwd_Latn_ET
-    0x92C6545A4C61746ELLU, // gwe_Latn_TZ
-    0x96C6504B41726162LLU, // gwf_Arab_PK
-    0x9AC64E474C61746ELLU, // gwg_Latn_NG
-    0xA2C643414C61746ELLU, // gwi_Latn_CA
-    0xA6C642574C61746ELLU, // gwj_Latn_BW
-    0xB2C641554C61746ELLU, // gwm_Latn_AU
-    0xB6C64E474C61746ELLU, // gwn_Latn_NG
-    0xC6C655474C61746ELLU, // gwr_Latn_UG
-    0xCEC6414641726162LLU, // gwt_Arab_AF
-    0xD2C641554C61746ELLU, // gwu_Latn_AU
-    0xDAC641554C61746ELLU, // gww_Latn_AU
-    0xDEC647484C61746ELLU, // gwx_Latn_GH
-    0xDEE643494C61746ELLU, // gxx_Latn_CI
-    0x870650474C61746ELLU, // gyb_Latn_PG
-    0x8F0641554C61746ELLU, // gyd_Latn_AU
-    0x93064E474C61746ELLU, // gye_Latn_NG
-    0x970641554C61746ELLU, // gyf_Latn_AU
-    0x9B0643464C61746ELLU, // gyg_Latn_CF
-    0xA306434D4C61746ELLU, // gyi_Latn_CM
-    0xAF0645544C61746ELLU, // gyl_Latn_ET
-    0xB30650414C61746ELLU, // gym_Latn_PA
-    0xB70647594C61746ELLU, // gyn_Latn_GY
-    0xBB064E5044657661LLU, // gyo_Deva_NP
-    0xC706424F4C61746ELLU, // gyr_Latn_BO
-    0xE30641554C61746ELLU, // gyy_Latn_AU
-    0xE7064E474C61746ELLU, // gyz_Latn_NG
-    0x832653444C61746ELLU, // gza_Latn_SD
-    0xA326495241726162LLU, // gzi_Arab_IR
-    0xB72649444C61746ELLU, // gzn_Latn_ID
-    0x68614E474C61746ELLU, // ha_Latn_NG
-    0x800755534C61746ELLU, // haa_Latn_US
-    0x8807495241726162LLU, // hac_Arab_IR
-    0x8C0749444C61746ELLU, // had_Latn_ID
-    0x900745544C61746ELLU, // hae_Latn_ET
-    0x980747484C61746ELLU, // hag_Latn_GH
-    0x9C0750474C61746ELLU, // hah_Latn_PG
-    0xA00743414C61746ELLU, // hai_Latn_CA
-    0xA407494E4C61746ELLU, // haj_Latn_IN
-    0xA807434E48616E73LLU, // hak_Hans_CN
-    0xAC07564E4C61746ELLU, // hal_Latn_VN
-    0xB00750474C61746ELLU, // ham_Latn_PG
-    0xB407545A4C61746ELLU, // han_Latn_TZ
-    0xB80750474C61746ELLU, // hao_Latn_PG
-    0xBC0749444C61746ELLU, // hap_Latn_ID
-    0xC007545A4C61746ELLU, // haq_Latn_TZ
-    0xC407455445746869LLU, // har_Ethi_ET
-    0xC80743414C61746ELLU, // has_Latn_CA
-    0xD40743444C61746ELLU, // hav_Latn_CD
-    0xD80755534C61746ELLU, // haw_Latn_US
-    0xDC0743414C61746ELLU, // hax_Latn_CA
-    0xE007545A4C61746ELLU, // hay_Latn_TZ
-    0xE407414641726162LLU, // haz_Arab_AF
-    0x802743444C61746ELLU, // hba_Latn_CD
-    0x84274E474C61746ELLU, // hbb_Latn_NG
-    0xB42753444C61746ELLU, // hbn_Latn_SD
-    0xB827494C48656272LLU, // hbo_Hebr_IL
-    0xD027544C4C61746ELLU, // hbu_Latn_TL
-    0x9C474D584C61746ELLU, // hch_Latn_MX
-    0xE067455445746869LLU, // hdy_Ethi_ET
-    0x6865494C48656272LLU, // he_Hebr_IL
-    0x8C8754444C61746ELLU, // hed_Latn_TD
-    0x988749444C61746ELLU, // heg_Latn_ID
-    0x9C87545A4C61746ELLU, // heh_Latn_TZ
-    0xA08743414C61746ELLU, // hei_Latn_CA
-    0xB08743444C61746ELLU, // hem_Latn_CD
-    0xB0C74E414C61746ELLU, // hgm_Latn_NA
-    0xD8C750474C61746ELLU, // hgw_Latn_PG
-    0xA0E750474C61746ELLU, // hhi_Latn_PG
-    0xC4E7534E4C61746ELLU, // hhr_Latn_SN
-    0xE0E750474C61746ELLU, // hhy_Latn_PG
-    0x6869494E44657661LLU, // hi_Deva_IN
-    0x81074E474C61746ELLU, // hia_Latn_NG
-    0x850750454C61746ELLU, // hib_Latn_PE
-    0x8D0755534C61746ELLU, // hid_Latn_US
-    0x9507464A44657661LLU, // hif_Deva_FJ
-    0x99074E474C61746ELLU, // hig_Latn_NG
-    0x9D0750474C61746ELLU, // hih_Latn_PG
-    0xA107494E54616B72LLU, // hii_Takr_IN
-    0xA507434D4C61746ELLU, // hij_Latn_CM
-    0xA90749444C61746ELLU, // hik_Latn_ID
-    0xAD0750484C61746ELLU, // hil_Latn_PH
-    0xB90742574C61746ELLU, // hio_Latn_BW
-    0xC50742524C61746ELLU, // hir_Latn_BR
-    0xCD07545258737578LLU, // hit_Xsux_TR
-    0xD90756554C61746ELLU, // hiw_Latn_VU
-    0xDD0742524C61746ELLU, // hix_Latn_BR
-    0xA12749444C61746ELLU, // hji_Latn_ID
-    0x8147545A4C61746ELLU, // hka_Latn_TZ
-    0x914743444C61746ELLU, // hke_Latn_CD
-    0x9D47494E41726162LLU, // hkh_Arab_IN
-    0xA94750474C61746ELLU, // hkk_Latn_PG
-    0x816750474C61746ELLU, // hla_Latn_PG
-    0x8567494E44657661LLU, // hlb_Deva_IN
-    0x8D67564E4C61746ELLU, // hld_Latn_VN
-    0xCD674D4D4C61746ELLU, // hlt_Latn_MM
-    0xD1675452486C7577LLU, // hlu_Hluw_TR
-    0x8187434E4C61746ELLU, // hma_Latn_CN
-    0x85874D4C4C61746ELLU, // hmb_Latn_ML
-    0x8D87434E506C7264LLU, // hmd_Plrd_CN
-    0x9587564E4C61746ELLU, // hmf_Latn_VN
-    0xA587434E426F706FLLU, // hmj_Bopo_CN
-    0xB187434E4C61746ELLU, // hmm_Latn_CN
-    0xB587434E4C61746ELLU, // hmn_Latn_CN
-    0xBD87434E4C61746ELLU, // hmp_Latn_CN
-    0xC187434E426F706FLLU, // hmq_Bopo_CN
-    0xC587494E4C61746ELLU, // hmr_Latn_IN
-    0xC987434E4C61746ELLU, // hms_Latn_CN
-    0xCD8750474C61746ELLU, // hmt_Latn_PG
-    0xD18749444C61746ELLU, // hmu_Latn_ID
-    0xD587564E4C61746ELLU, // hmv_Latn_VN
-    0xD987434E4C61746ELLU, // hmw_Latn_CN
-    0xE187434E4C61746ELLU, // hmy_Latn_CN
-    0xE587434E4C61746ELLU, // hmz_Latn_CN
-    0x81A7434D4C61746ELLU, // hna_Latn_CM
-    0x8DA7504B41726162LLU, // hnd_Arab_PK
-    0x91A7494E44657661LLU, // hne_Deva_IN
-    0x99A7414F4C61746ELLU, // hng_Latn_AO
-    0x9DA742574C61746ELLU, // hnh_Latn_BW
-    0xA1A7434E4C61746ELLU, // hni_Latn_CN
-    0xA5A74C41486D6E67LLU, // hnj_Hmng_LA
-    0xA5A75553486D6E70LLU, // hnj_Hmnp_US
-    0xB5A750484C61746ELLU, // hnn_Latn_PH
-    0xB9A7504B41726162LLU, // hno_Arab_PK
-    0xC9A753524C61746ELLU, // hns_Latn_SR
-    0x686F50474C61746ELLU, // ho_Latn_PG
-    0x81C753424C61746ELLU, // hoa_Latn_SB
-    0x85C750474C61746ELLU, // hob_Latn_PG
-    0x89C7494E44657661LLU, // hoc_Deva_IN
-    0x8DC74E474C61746ELLU, // hod_Latn_NG
-    0x91C74E474C61746ELLU, // hoe_Latn_NG
-    0x9DC74F4D41726162LLU, // hoh_Arab_OM
-    0xA1C755534C61746ELLU, // hoi_Latn_US
-    0xA5C7494E44657661LLU, // hoj_Deva_IN
-    0xADC7414F4C61746ELLU, // hol_Latn_AO
-    0xB1C753534C61746ELLU, // hom_Latn_SS
-    0xB9C743444C61746ELLU, // hoo_Latn_CD
-    0xBDC755534C61746ELLU, // hop_Latn_US
-    0xC5C754444C61746ELLU, // hor_Latn_TD
-    0xCDC750474C61746ELLU, // hot_Latn_PG
-    0xD5C749444C61746ELLU, // hov_Latn_ID
-    0xD9C7434E48616E69LLU, // how_Hani_CN
-    0xE1C7494E44657661LLU, // hoy_Deva_IN
-    0xB9E74D4D4D796D72LLU, // hpo_Mymr_MM
-    0x687248524C61746ELLU, // hr_Latn_HR
-    0x8227494E4C61746ELLU, // hra_Latn_IN
-    0x8A2750474C61746ELLU, // hrc_Latn_PG
-    0x9227564E4C61746ELLU, // hre_Latn_VN
-    0xAA2749444C61746ELLU, // hrk_Latn_ID
-    0xB227434E4C61746ELLU, // hrm_Latn_CN
-    0xBA27564E4C61746ELLU, // hro_Latn_VN
-    0xBE2741554C61746ELLU, // hrp_Latn_AU
-    0xCE27545253797263LLU, // hrt_Syrc_TR
-    0xD227494E4C61746ELLU, // hru_Latn_IN
-    0xDA2750474C61746ELLU, // hrw_Latn_PG
-    0xDE2742524C61746ELLU, // hrx_Latn_BR
-    0xE627495241726162LLU, // hrz_Arab_IR
-    0x864744454C61746ELLU, // hsb_Latn_DE
-    0xB647434E48616E73LLU, // hsn_Hans_CN
-    0xCA474F4D41726162LLU, // hss_Arab_OM
-    0x687448544C61746ELLU, // ht_Latn_HT
-    0xA26749444C61746ELLU, // hti_Latn_ID
-    0xBA67434F4C61746ELLU, // hto_Latn_CO
-    0xCA67545A4C61746ELLU, // hts_Latn_TZ
-    0xD26749444C61746ELLU, // htu_Latn_ID
-    0xDE67545258737578LLU, // htx_Xsux_TR
-    0x687548554C61746ELLU, // hu_Latn_HU
-    0x868750454C61746ELLU, // hub_Latn_PE
-    0x8A8742574C61746ELLU, // huc_Latn_BW
-    0x8E8749444C61746ELLU, // hud_Latn_ID
-    0x92874D584C61746ELLU, // hue_Latn_MX
-    0x968750474C61746ELLU, // huf_Latn_PG
-    0x9A8750454C61746ELLU, // hug_Latn_PE
-    0x9E87434C4C61746ELLU, // huh_Latn_CL
-    0xA28750474C61746ELLU, // hui_Latn_PG
-    0xAA8749444C61746ELLU, // huk_Latn_ID
-    0xAE8750474C61746ELLU, // hul_Latn_PG
-    0xB28743444C61746ELLU, // hum_Latn_CD
-    0xBE8755534C61746ELLU, // hup_Latn_US
-    0xC68743414C61746ELLU, // hur_Latn_CA
-    0xCA874D584C61746ELLU, // hus_Latn_MX
-    0xCE874E5044657661LLU, // hut_Deva_NP
-    0xD28750454C61746ELLU, // huu_Latn_PE
-    0xD6874D584C61746ELLU, // huv_Latn_MX
-    0xDA8749444C61746ELLU, // huw_Latn_ID
-    0xDE8750454C61746ELLU, // hux_Latn_PE
-    0xE287494C48656272LLU, // huy_Hebr_IL
-    0xE68752554379726CLLU, // huz_Cyrl_RU
-    0x8AA748544C61746ELLU, // hvc_Latn_HT
-    0x92A74D584C61746ELLU, // hve_Latn_MX
-    0xAAA74E434C61746ELLU, // hvk_Latn_NC
-    0xB6A749444C61746ELLU, // hvn_Latn_ID
-    0xD6A74D584C61746ELLU, // hvv_Latn_MX
-    0x82C743494C61746ELLU, // hwa_Latn_CI
-    0x8AC755534C61746ELLU, // hwc_Latn_US
-    0xBAC74E474C61746ELLU, // hwo_Latn_NG
-    0x6879414D41726D6ELLU, // hy_Armn_AM
-    0x8307434D4C61746ELLU, // hya_Latn_CM
-    0xDB07414D41726D6ELLU, // hyw_Armn_AM
-    0x687A4E414C61746ELLU, // hz_Latn_NA
-    0xA0084E434C61746ELLU, // iai_Latn_NC
-    0xB40850474C61746ELLU, // ian_Latn_PG
-    0xC40850474C61746ELLU, // iar_Latn_PG
-    0x80284D594C61746ELLU, // iba_Latn_MY
-    0x84284E474C61746ELLU, // ibb_Latn_NG
-    0x8C2841554C61746ELLU, // ibd_Latn_AU
-    0x90284E474C61746ELLU, // ibe_Latn_NG
-    0x982850484C61746ELLU, // ibg_Latn_PH
-    0x9C28564E4C61746ELLU, // ibh_Latn_VN
-    0xAC2850484C61746ELLU, // ibl_Latn_PH
-    0xB0284E474C61746ELLU, // ibm_Latn_NG
-    0xB4284E474C61746ELLU, // ibn_Latn_NG
-    0xC4284E474C61746ELLU, // ibr_Latn_NG
-    0xD02849444C61746ELLU, // ibu_Latn_ID
-    0xE0284E474C61746ELLU, // iby_Latn_NG
-    0x8048424A4C61746ELLU, // ica_Latn_BJ
-    0x9C484E474C61746ELLU, // ich_Latn_NG
-    0xC448434F4C61746ELLU, // icr_Latn_CO
-    0x696449444C61746ELLU, // id_Latn_ID
-    0x80684B454C61746ELLU, // ida_Latn_KE
-    0x8468494E4C61746ELLU, // idb_Latn_IN
-    0x88684E474C61746ELLU, // idc_Latn_NG
-    0x8C68424A4C61746ELLU, // idd_Latn_BJ
-    0x90684E474C61746ELLU, // ide_Latn_NG
-    0xA06850474C61746ELLU, // idi_Latn_PG
-    0xC46853534C61746ELLU, // idr_Latn_SS
-    0xC8684E474C61746ELLU, // ids_Latn_NG
-    0xCC68544C4C61746ELLU, // idt_Latn_TL
-    0xD0684E474C61746ELLU, // idu_Latn_NG
-    0x696545454C61746ELLU, // ie_Latn_EE
-    0x80A850484C61746ELLU, // ifa_Latn_PH
-    0x84A850484C61746ELLU, // ifb_Latn_PH
-    0x90A854474C61746ELLU, // ife_Latn_TG
-    0x94A856554C61746ELLU, // iff_Latn_VU
-    0xA8A850484C61746ELLU, // ifk_Latn_PH
-    0xB0A843474C61746ELLU, // ifm_Latn_CG
-    0xD0A850484C61746ELLU, // ifu_Latn_PH
-    0xE0A850484C61746ELLU, // ify_Latn_PH
-    0x69674E474C61746ELLU, // ig_Latn_NG
-    0x84C84E474C61746ELLU, // igb_Latn_NG
-    0x90C84E474C61746ELLU, // ige_Latn_NG
-    0x98C850474C61746ELLU, // igg_Latn_PG
-    0xACC84E474C61746ELLU, // igl_Latn_NG
-    0xB0C850474C61746ELLU, // igm_Latn_PG
-    0xB4C8424F4C61746ELLU, // ign_Latn_BO
-    0xB8C850474C61746ELLU, // igo_Latn_PG
-    0xD8C84E474C61746ELLU, // igw_Latn_NG
-    0x84E849444C61746ELLU, // ihb_Latn_ID
-    0xA0E84E474C61746ELLU, // ihi_Latn_NG
-    0xBCE849444C61746ELLU, // ihp_Latn_ID
-    0xD8E841554C61746ELLU, // ihw_Latn_AU
-    0x6969434E59696969LLU, // ii_Yiii_CN
-    0xB50841554C61746ELLU, // iin_Latn_AU
-    0x89284E474C61746ELLU, // ijc_Latn_NG
-    0x91284E474C61746ELLU, // ije_Latn_NG
-    0xA528424A4C61746ELLU, // ijj_Latn_BJ
-    0xB5284E474C61746ELLU, // ijn_Latn_NG
-    0xC9284E474C61746ELLU, // ijs_Latn_NG
-    0x696B55534C61746ELLU, // ik_Latn_US
-    0x9D484E474C61746ELLU, // ikh_Latn_NG
-    0xA1484E474C61746ELLU, // iki_Latn_NG
-    0xA9484E474C61746ELLU, // ikk_Latn_NG
-    0xAD484E474C61746ELLU, // ikl_Latn_NG
-    0xB9484E474C61746ELLU, // iko_Latn_NG
-    0xBD484E474C61746ELLU, // ikp_Latn_NG
-    0xC54841554C61746ELLU, // ikr_Latn_AU
-    0xCD4843414C61746ELLU, // ikt_Latn_CA
-    0xD5484E474C61746ELLU, // ikv_Latn_NG
-    0xD9484E474C61746ELLU, // ikw_Latn_NG
-    0xDD4855474C61746ELLU, // ikx_Latn_UG
-    0xE548545A4C61746ELLU, // ikz_Latn_TZ
-    0x816849444C61746ELLU, // ila_Latn_ID
-    0x85685A4D4C61746ELLU, // ilb_Latn_ZM
-    0x996841554C61746ELLU, // ilg_Latn_AU
-    0xA168434E4C61746ELLU, // ili_Latn_CN
-    0xA96850484C61746ELLU, // ilk_Latn_PH
-    0xB1684D594C61746ELLU, // ilm_Latn_MY
-    0xB96850484C61746ELLU, // ilo_Latn_PH
-    0xBD6850484C61746ELLU, // ilp_Latn_PH
-    0xD16849444C61746ELLU, // ilu_Latn_ID
-    0xD5684E474C61746ELLU, // ilv_Latn_NG
-    0xA18850474C61746ELLU, // imi_Latn_PG
-    0xAD8855534C61746ELLU, // iml_Latn_US
-    0xB58850474C61746ELLU, // imn_Latn_PG
-    0xB98850474C61746ELLU, // imo_Latn_PG
-    0xC58849444C61746ELLU, // imr_Latn_ID
-    0xC98849544C61746ELLU, // ims_Latn_IT
-    0xCD8853534C61746ELLU, // imt_Latn_SS
-    0xE18854524C796369LLU, // imy_Lyci_TR
-    0x696E49444C61746ELLU, // in_Latn_ID
-    0x85A8434F4C61746ELLU, // inb_Latn_CO
-    0x99A855534C61746ELLU, // ing_Latn_US
-    0x9DA852554379726CLLU, // inh_Cyrl_RU
-    0xA5A8434F4C61746ELLU, // inj_Latn_CO
-    0xB5A850484C61746ELLU, // inn_Latn_PH
-    0xB9A850474C61746ELLU, // ino_Latn_PG
-    0xBDA850454C61746ELLU, // inp_Latn_PE
-    0xCDA84D4D4D796D72LLU, // int_Mymr_MM
-    0xC5C8455445746869LLU, // ior_Ethi_ET
-    0xD1C850474C61746ELLU, // iou_Latn_PG
-    0xD9C855534C61746ELLU, // iow_Latn_US
-    0xA1E850474C61746ELLU, // ipi_Latn_PG
-    0xB9E850474C61746ELLU, // ipo_Latn_PG
-    0xD20850454C61746ELLU, // iqu_Latn_PE
-    0xDA084E474C61746ELLU, // iqw_Latn_NG
-    0x922849444C61746ELLU, // ire_Latn_ID
-    0x9E2849444C61746ELLU, // irh_Latn_ID
-    0xA2284E474C61746ELLU, // iri_Latn_NG
-    0xAA28545A4C61746ELLU, // irk_Latn_TZ
-    0xB62842524C61746ELLU, // irn_Latn_BR
-    0xD228494E54616D6CLLU, // iru_Taml_IN
-    0xDE2849444C61746ELLU, // irx_Latn_ID
-    0xE22850484C61746ELLU, // iry_Latn_PH
-    0x697349534C61746ELLU, // is_Latn_IS
-    0x824850474C61746ELLU, // isa_Latn_PG
-    0x8A4850454C61746ELLU, // isc_Latn_PE
-    0x8E4850484C61746ELLU, // isd_Latn_PH
-    0x9E484E474C61746ELLU, // ish_Latn_NG
-    0xA2484E474C61746ELLU, // isi_Latn_NG
-    0xAA48414641726162LLU, // isk_Arab_AF
-    0xB24849444C61746ELLU, // ism_Latn_ID
-    0xB648545A4C61746ELLU, // isn_Latn_TZ
-    0xBA484E474C61746ELLU, // iso_Latn_NG
-    0xCE4848524C61746ELLU, // ist_Latn_HR
-    0xD248434D4C61746ELLU, // isu_Latn_CM
-    0x697449544C61746ELLU, // it_Latn_IT
-    0x866850484C61746ELLU, // itb_Latn_PH
-    0x8E6849444C61746ELLU, // itd_Latn_ID
-    0x9268424F4C61746ELLU, // ite_Latn_BO
-    0xA26850484C61746ELLU, // iti_Latn_PH
-    0xAA68495448656272LLU, // itk_Hebr_IT
-    0xAE6852554379726CLLU, // itl_Cyrl_RU
-    0xB2684E474C61746ELLU, // itm_Latn_NG
-    0xBA68424F4C61746ELLU, // ito_Latn_BO
-    0xC66850474C61746ELLU, // itr_Latn_PG
-    0xCA684E474C61746ELLU, // its_Latn_NG
-    0xCE6850484C61746ELLU, // itt_Latn_PH
-    0xD66850484C61746ELLU, // itv_Latn_PH
-    0xDA684E474C61746ELLU, // itw_Latn_NG
-    0xDE6849444C61746ELLU, // itx_Latn_ID
-    0xE26850484C61746ELLU, // ity_Latn_PH
-    0xE66847544C61746ELLU, // itz_Latn_GT
-    0x6975434143616E73LLU, // iu_Cans_CA
-    0xB288434E4C61746ELLU, // ium_Latn_CN
-    0x86A850484C61746ELLU, // ivb_Latn_PH
-    0xD6A850484C61746ELLU, // ivv_Latn_PH
-    0x6977494C48656272LLU, // iw_Hebr_IL
-    0xAAC850484C61746ELLU, // iwk_Latn_PH
-    0xB2C850474C61746ELLU, // iwm_Latn_PG
-    0xBAC849444C61746ELLU, // iwo_Latn_ID
-    0xCAC850474C61746ELLU, // iws_Latn_PG
-    0x8AE84D584C61746ELLU, // ixc_Latn_MX
-    0xAEE847544C61746ELLU, // ixl_Latn_GT
-    0x83084E474C61746ELLU, // iya_Latn_NG
-    0xBB08434D4C61746ELLU, // iyo_Latn_CM
-    0xDF0843474C61746ELLU, // iyx_Latn_CG
-    0x9F2852554C61746ELLU, // izh_Latn_RU
-    0xB3284E474C61746ELLU, // izm_Latn_NG
-    0xC7284E474C61746ELLU, // izr_Latn_NG
-    0xE7284E474C61746ELLU, // izz_Latn_NG
-    0x6A614A504A70616ELLU, // ja_Jpan_JP
-    0x800942524C61746ELLU, // jaa_Latn_BR
-    0x84094E474C61746ELLU, // jab_Latn_NG
-    0x880947544C61746ELLU, // jac_Latn_GT
-    0x8C09474E41726162LLU, // jad_Arab_GN
-    0x900950474C61746ELLU, // jae_Latn_PG
-    0x94094E474C61746ELLU, // jaf_Latn_NG
-    0x9C094D594C61746ELLU, // jah_Latn_MY
-    0xA40953424C61746ELLU, // jaj_Latn_SB
-    0xA8094D594C61746ELLU, // jak_Latn_MY
-    0xAC0949444C61746ELLU, // jal_Latn_ID
-    0xB0094A4D4C61746ELLU, // jam_Latn_JM
-    0xB40941554C61746ELLU, // jan_Latn_AU
-    0xB80941554C61746ELLU, // jao_Latn_AU
-    0xC00949444C61746ELLU, // jaq_Latn_ID
-    0xC8094E434C61746ELLU, // jas_Latn_NC
-    0xCC09414641726162LLU, // jat_Arab_AF
-    0xD00949444C61746ELLU, // jau_Latn_ID
-    0xDC0949444C61746ELLU, // jax_Latn_ID
-    0xE00941554C61746ELLU, // jay_Latn_AU
-    0xE4094E434C61746ELLU, // jaz_Latn_NC
-    0x9029494C48656272LLU, // jbe_Hebr_IL
-    0xA02941554C61746ELLU, // jbi_Latn_AU
-    0xA42949444C61746ELLU, // jbj_Latn_ID
-    0xA82950474C61746ELLU, // jbk_Latn_PG
-    0xB0294E474C61746ELLU, // jbm_Latn_NG
-    0xB4294C5941726162LLU, // jbn_Arab_LY
-    0xC42949444C61746ELLU, // jbr_Latn_ID
-    0xCC2942524C61746ELLU, // jbt_Latn_BR
-    0xD029434D4C61746ELLU, // jbu_Latn_CM
-    0xD82941554C61746ELLU, // jbw_Latn_AU
-    0xCC4955414379726CLLU, // jct_Cyrl_UA
-    0x8069494E54696274LLU, // jda_Tibt_IN
-    0x9869504B41726162LLU, // jdg_Arab_PK
-    0xCC6952554379726CLLU, // jdt_Cyrl_RU
-    0x848950454C61746ELLU, // jeb_Latn_PE
-    0x90894E5044657661LLU, // jee_Deva_NP
-    0x9C89564E4C61746ELLU, // jeh_Latn_VN
-    0xA08949444C61746ELLU, // jei_Latn_ID
-    0xA88943494C61746ELLU, // jek_Latn_CI
-    0xAC8949444C61746ELLU, // jel_Latn_ID
-    0xB4894E474C61746ELLU, // jen_Latn_NG
-    0xC4894E474C61746ELLU, // jer_Latn_NG
-    0xCC8950474C61746ELLU, // jet_Latn_PG
-    0xD08954444C61746ELLU, // jeu_Latn_TD
-    0x84C943444C61746ELLU, // jgb_Latn_CD
-    0x90C9474547656F72LLU, // jge_Geor_GE
-    0xA8C94E474C61746ELLU, // jgk_Latn_NG
-    0xB8C9434D4C61746ELLU, // jgo_Latn_CM
-    0xA0E94D594C61746ELLU, // jhi_Latn_MY
-    0x6A69554148656272LLU, // ji_Hebr_UA
-    0x8109434D4C61746ELLU, // jia_Latn_CM
-    0x85094E474C61746ELLU, // jib_Latn_NG
-    0x8909484E4C61746ELLU, // jic_Latn_HN
-    0x8D094E474C61746ELLU, // jid_Latn_NG
-    0x91094E474C61746ELLU, // jie_Latn_NG
-    0x990941554C61746ELLU, // jig_Latn_AU
-    0xAD0950474C61746ELLU, // jil_Latn_PG
-    0xB109434D4C61746ELLU, // jim_Latn_CM
-    0xCD09545A4C61746ELLU, // jit_Latn_TZ
-    0xD109434E4C61746ELLU, // jiu_Latn_CN
-    0xD50945434C61746ELLU, // jiv_Latn_EC
-    0xE109434E4C61746ELLU, // jiy_Latn_CN
-    0x91294B5248616E67LLU, // jje_Hang_KR
-    0xC5294E474C61746ELLU, // jjr_Latn_NG
-    0x814949444C61746ELLU, // jka_Latn_ID
-    0xB1494D4D4D796D72LLU, // jkm_Mymr_MM
-    0xB94950474C61746ELLU, // jko_Latn_PG
-    0xD1494E474C61746ELLU, // jku_Latn_NG
-    0x916953444C61746ELLU, // jle_Latn_SD
-    0x818950474C61746ELLU, // jma_Latn_PG
-    0x85894E474C61746ELLU, // jmb_Latn_NG
-    0x8989545A4C61746ELLU, // jmc_Latn_TZ
-    0x8D8949444C61746ELLU, // jmd_Latn_ID
-    0xA1894E474C61746ELLU, // jmi_Latn_NG
-    0xAD894E5044657661LLU, // jml_Deva_NP
-    0xB5894D4D4C61746ELLU, // jmn_Latn_MM
-    0xC58947484C61746ELLU, // jmr_Latn_GH
-    0xC9894E474C61746ELLU, // jms_Latn_NG
-    0xD98950474C61746ELLU, // jmw_Latn_PG
-    0xDD894D584C61746ELLU, // jmx_Latn_MX
-    0x81A9494E54616B72LLU, // jna_Takr_IN
-    0x8DA9504B41726162LLU, // jnd_Arab_PK
-    0x99A941554C61746ELLU, // jng_Latn_AU
-    0xA1A94E474C61746ELLU, // jni_Latn_NG
-    0xA5A945544C61746ELLU, // jnj_Latn_ET
-    0xADA9494E44657661LLU, // jnl_Deva_IN
-    0xC9A9494E44657661LLU, // jns_Deva_IN
-    0x85C943444C61746ELLU, // job_Latn_CD
-    0x8DC943494C61746ELLU, // jod_Latn_CI
-    0x99C9504B41726162LLU, // jog_Arab_PK
-    0xC5C9424F4C61746ELLU, // jor_Latn_BO
-    0xD9C94D4C4C61746ELLU, // jow_Latn_ML
-    0x81E9505348656272LLU, // jpa_Hebr_PS
-    0xC5E9494C48656272LLU, // jpr_Hebr_IL
-    0xC60950454C61746ELLU, // jqr_Latn_PE
-    0x8229564E4C61746ELLU, // jra_Latn_VN
-    0x8629494C48656272LLU, // jrb_Hebr_IL
-    0xC6294E474C61746ELLU, // jrr_Latn_NG
-    0xCE294E474C61746ELLU, // jrt_Latn_NG
-    0xD22956454C61746ELLU, // jru_Latn_VE
-    0x828942524C61746ELLU, // jua_Latn_BR
-    0x86894E474C61746ELLU, // jub_Latn_NG
-    0x8E8943494C61746ELLU, // jud_Latn_CI
-    0x9E894E474C61746ELLU, // juh_Latn_NG
-    0xA28941554C61746ELLU, // jui_Latn_AU
-    0xAA894E474C61746ELLU, // juk_Latn_NG
-    0xAE894E5044657661LLU, // jul_Deva_NP
-    0xB28953444C61746ELLU, // jum_Latn_SD
-    0xB689494E4F727961LLU, // jun_Orya_IN
-    0xBA894E474C61746ELLU, // juo_Latn_NG
-    0xBE8942524C61746ELLU, // jup_Latn_BR
-    0xC68942524C61746ELLU, // jur_Latn_BR
-    0xCE89444B4C61746ELLU, // jut_Latn_DK
-    0xD2894E474C61746ELLU, // juu_Latn_NG
-    0xDA894E474C61746ELLU, // juw_Latn_NG
-    0xE289494E4F727961LLU, // juy_Orya_IN
-    0x6A7649444C61746ELLU, // jv_Latn_ID
-    0x8EA949444C61746ELLU, // jvd_Latn_ID
-    0xB6A953524C61746ELLU, // jvn_Latn_SR
-    0x6A7749444C61746ELLU, // jw_Latn_ID
-    0xA2C947484C61746ELLU, // jwi_Latn_GH
-    0x8309434E54696274LLU, // jya_Tibt_CN
-    0x9309494C48656272LLU, // jye_Hebr_IL
-    0xE30954444C61746ELLU, // jyy_Latn_TD
-    0x6B61474547656F72LLU, // ka_Geor_GE
-    0x800A555A4379726CLLU, // kaa_Cyrl_UZ
-    0x840A445A4C61746ELLU, // kab_Latn_DZ
-    0x880A4D4D4C61746ELLU, // kac_Latn_MM
-    0x8C0A4E474C61746ELLU, // kad_Latn_NG
-    0x980A4D594C61746ELLU, // kag_Latn_MY
-    0x9C0A43464C61746ELLU, // kah_Latn_CF
-    0xA00A4E474C61746ELLU, // kai_Latn_NG
-    0xA40A4E474C61746ELLU, // kaj_Latn_NG
-    0xA80A50484C61746ELLU, // kak_Latn_PH
-    0xB00A4B454C61746ELLU, // kam_Latn_KE
-    0xB80A4D4C4C61746ELLU, // kao_Latn_ML
-    0xBC0A52554379726CLLU, // kap_Cyrl_RU
-    0xC00A50454C61746ELLU, // kaq_Latn_PE
-    0xD40A42524C61746ELLU, // kav_Latn_BR
-    0xD80A49444B617769LLU, // kaw_Kawi_ID
-    0xDC0A49444C61746ELLU, // kax_Latn_ID
-    0xE00A42524C61746ELLU, // kay_Latn_BR
-    0x802A41554C61746ELLU, // kba_Latn_AU
-    0x842A42524C61746ELLU, // kbb_Latn_BR
-    0x882A42524C61746ELLU, // kbc_Latn_BR
-    0x8C2A52554379726CLLU, // kbd_Cyrl_RU
-    0x902A41554C61746ELLU, // kbe_Latn_AU
-    0x982A494E54696274LLU, // kbg_Tibt_IN
-    0x9C2A434F4C61746ELLU, // kbh_Latn_CO
-    0xA02A49444C61746ELLU, // kbi_Latn_ID
-    0xA42A43444C61746ELLU, // kbj_Latn_CD
-    0xA82A50474C61746ELLU, // kbk_Latn_PG
-    0xAC2A54444C61746ELLU, // kbl_Latn_TD
-    0xB02A50474C61746ELLU, // kbm_Latn_PG
-    0xB42A43464C61746ELLU, // kbn_Latn_CF
-    0xB82A53534C61746ELLU, // kbo_Latn_SS
-    0xBC2A54474C61746ELLU, // kbp_Latn_TG
-    0xC02A50474C61746ELLU, // kbq_Latn_PG
-    0xC42A45544C61746ELLU, // kbr_Latn_ET
-    0xC82A47414C61746ELLU, // kbs_Latn_GA
-    0xCC2A50474C61746ELLU, // kbt_Latn_PG
-    0xD02A504B41726162LLU, // kbu_Arab_PK
-    0xD42A49444C61746ELLU, // kbv_Latn_ID
-    0xD82A50474C61746ELLU, // kbw_Latn_PG
-    0xDC2A50474C61746ELLU, // kbx_Latn_PG
-    0xE02A4E4541726162LLU, // kby_Arab_NE
-    0xE42A4E474C61746ELLU, // kbz_Latn_NG
-    0x804A52554379726CLLU, // kca_Cyrl_RU
-    0x844A50474C61746ELLU, // kcb_Latn_PG
-    0x884A4E474C61746ELLU, // kcc_Latn_NG
-    0x8C4A49444C61746ELLU, // kcd_Latn_ID
-    0x904A4E474C61746ELLU, // kce_Latn_NG
-    0x944A4E474C61746ELLU, // kcf_Latn_NG
-    0x984A4E474C61746ELLU, // kcg_Latn_NG
-    0x9C4A4E474C61746ELLU, // kch_Latn_NG
-    0xA04A4E474C61746ELLU, // kci_Latn_NG
-    0xA44A47574C61746ELLU, // kcj_Latn_GW
-    0xA84A5A574C61746ELLU, // kck_Latn_ZW
-    0xAC4A50474C61746ELLU, // kcl_Latn_PG
-    0xB04A43464C61746ELLU, // kcm_Latn_CF
-    0xB44A55474C61746ELLU, // kcn_Latn_UG
-    0xB84A50474C61746ELLU, // kco_Latn_PG
-    0xBC4A53444C61746ELLU, // kcp_Latn_SD
-    0xC04A4E474C61746ELLU, // kcq_Latn_NG
-    0xC84A4E474C61746ELLU, // kcs_Latn_NG
-    0xCC4A50474C61746ELLU, // kct_Latn_PG
-    0xD04A545A4C61746ELLU, // kcu_Latn_TZ
-    0xD44A43444C61746ELLU, // kcv_Latn_CD
-    0xD84A43444C61746ELLU, // kcw_Latn_CD
-    0xE04A445A41726162LLU, // kcy_Arab_DZ
-    0xE44A545A4C61746ELLU, // kcz_Latn_TZ
-    0x806A41554C61746ELLU, // kda_Latn_AU
-    0x886A545A4C61746ELLU, // kdc_Latn_TZ
-    0x8C6A41554C61746ELLU, // kdd_Latn_AU
-    0x906A545A4C61746ELLU, // kde_Latn_TZ
-    0x946A50474C61746ELLU, // kdf_Latn_PG
-    0x986A43444C61746ELLU, // kdg_Latn_CD
-    0x9C6A54474C61746ELLU, // kdh_Latn_TG
-    0xA06A55474C61746ELLU, // kdi_Latn_UG
-    0xA46A55474C61746ELLU, // kdj_Latn_UG
-    0xA86A4E434C61746ELLU, // kdk_Latn_NC
-    0xAC6A4E474C61746ELLU, // kdl_Latn_NG
-    0xB06A4E474C61746ELLU, // kdm_Latn_NG
-    0xB46A5A574C61746ELLU, // kdn_Latn_ZW
-    0xBC6A4E474C61746ELLU, // kdp_Latn_NG
-    0xC06A494E42656E67LLU, // kdq_Beng_IN
-    0xC46A4C544C61746ELLU, // kdr_Latn_LT
-    0xCC6A544854686169LLU, // kdt_Thai_TH
-    0xD86A49444C61746ELLU, // kdw_Latn_ID
-    0xDC6A4E474C61746ELLU, // kdx_Latn_NG
-    0xE06A49444C61746ELLU, // kdy_Latn_ID
-    0xE46A434D4C61746ELLU, // kdz_Latn_CM
-    0x808A43564C61746ELLU, // kea_Latn_CV
-    0x848A47414C61746ELLU, // keb_Latn_GA
-    0x888A53444C61746ELLU, // kec_Latn_SD
-    0x8C8A545A4C61746ELLU, // ked_Latn_TZ
-    0x908A55534C61746ELLU, // kee_Latn_US
-    0x948A54474C61746ELLU, // kef_Latn_TG
-    0x988A53444C61746ELLU, // keg_Latn_SD
-    0x9C8A50474C61746ELLU, // keh_Latn_PG
-    0xA08A49444C61746ELLU, // kei_Latn_ID
-    0xA88A47544C61746ELLU, // kek_Latn_GT
-    0xAC8A43444C61746ELLU, // kel_Latn_CD
-    0xB08A544C4C61746ELLU, // kem_Latn_TL
-    0xB48A434D4C61746ELLU, // ken_Latn_CM
-    0xB88A55474C61746ELLU, // keo_Latn_UG
-    0xC48A54444C61746ELLU, // ker_Latn_TD
-    0xC88A4E474C61746ELLU, // kes_Latn_NG
-    0xCC8A52554379726CLLU, // ket_Cyrl_RU
-    0xD08A54474C61746ELLU, // keu_Latn_TG
-    0xD48A494E4D6C796DLLU, // kev_Mlym_IN
-    0xD88A50474C61746ELLU, // kew_Latn_PG
-    0xDC8A494E44657661LLU, // kex_Deva_IN
-    0xE08A494E54656C75LLU, // key_Telu_IN
-    0xE48A4E474C61746ELLU, // kez_Latn_NG
-    0x80AA494E4B6E6461LLU, // kfa_Knda_IN
-    0x84AA494E44657661LLU, // kfb_Deva_IN
-    0x88AA494E54656C75LLU, // kfc_Telu_IN
-    0x8CAA494E4B6E6461LLU, // kfd_Knda_IN
-    0x90AA494E54616D6CLLU, // kfe_Taml_IN
-    0x94AA494E4C61746ELLU, // kff_Latn_IN
-    0x98AA494E4B6E6461LLU, // kfg_Knda_IN
-    0x9CAA494E4D6C796DLLU, // kfh_Mlym_IN
-    0xA0AA494E54616D6CLLU, // kfi_Taml_IN
-    0xA8AA494E44657661LLU, // kfk_Deva_IN
-    0xACAA434D4C61746ELLU, // kfl_Latn_CM
-    0xB0AA495241726162LLU, // kfm_Arab_IR
-    0xB4AA434D4C61746ELLU, // kfn_Latn_CM
-    0xB8AA43494C61746ELLU, // kfo_Latn_CI
-    0xBCAA494E44657661LLU, // kfp_Deva_IN
-    0xC0AA494E44657661LLU, // kfq_Deva_IN
-    0xC4AA494E44657661LLU, // kfr_Deva_IN
-    0xC8AA494E44657661LLU, // kfs_Deva_IN
-    0xD0AA494E44657661LLU, // kfu_Deva_IN
-    0xD4AA494E4C61746ELLU, // kfv_Latn_IN
-    0xD8AA494E4C61746ELLU, // kfw_Latn_IN
-    0xDCAA494E44657661LLU, // kfx_Deva_IN
-    0xE0AA494E44657661LLU, // kfy_Deva_IN
-    0xE4AA42464C61746ELLU, // kfz_Latn_BF
-    0x6B6743444C61746ELLU, // kg_Latn_CD
-    0x80CA43494C61746ELLU, // kga_Latn_CI
-    0x84CA49444C61746ELLU, // kgb_Latn_ID
-    0x90CA49444C61746ELLU, // kge_Latn_ID
-    0x94CA50474C61746ELLU, // kgf_Latn_PG
-    0xA4CA4E5044657661LLU, // kgj_Deva_NP
-    0xA8CA42524C61746ELLU, // kgk_Latn_BR
-    0xACCA41554C61746ELLU, // kgl_Latn_AU
-    0xB8CA53444C61746ELLU, // kgo_Latn_SD
-    0xBCCA42524C61746ELLU, // kgp_Latn_BR
-    0xC0CA49444C61746ELLU, // kgq_Latn_ID
-    0xC4CA49444C61746ELLU, // kgr_Latn_ID
-    0xC8CA41554C61746ELLU, // kgs_Latn_AU
-    0xCCCA4E474C61746ELLU, // kgt_Latn_NG
-    0xD0CA50474C61746ELLU, // kgu_Latn_PG
-    0xD4CA49444C61746ELLU, // kgv_Latn_ID
-    0xD8CA49444C61746ELLU, // kgw_Latn_ID
-    0xDCCA49444C61746ELLU, // kgx_Latn_ID
-    0xE0CA4E5044657661LLU, // kgy_Deva_NP
-    0x80EA494E4C61746ELLU, // kha_Latn_IN
-    0x84EA434E54616C75LLU, // khb_Talu_CN
-    0x88EA49444C61746ELLU, // khc_Latn_ID
-    0x8CEA49444C61746ELLU, // khd_Latn_ID
-    0x90EA49444C61746ELLU, // khe_Latn_ID
-    0x94EA4C4154686169LLU, // khf_Thai_LA
-    0x98EA434E54696274LLU, // khg_Tibt_CN
-    0x9CEA49444C61746ELLU, // khh_Latn_ID
-    0xA4EA4E474C61746ELLU, // khj_Latn_NG
-    0xACEA50474C61746ELLU, // khl_Latn_PG
-    0xB4EA494E44657661LLU, // khn_Deva_IN
-    0xB8EA495242726168LLU, // kho_Brah_IR
-    0xBCEA49444C61746ELLU, // khp_Latn_ID
-    0xC0EA4D4C4C61746ELLU, // khq_Latn_ML
-    0xC4EA494E4C61746ELLU, // khr_Latn_IN
-    0xC8EA50474C61746ELLU, // khs_Latn_PG
-    0xCCEA494E4D796D72LLU, // kht_Mymr_IN
-    0xD0EA414F4C61746ELLU, // khu_Latn_AO
-    0xD4EA52554379726CLLU, // khv_Cyrl_RU
-    0xD8EA504B41726162LLU, // khw_Arab_PK
-    0xDCEA43444C61746ELLU, // khx_Latn_CD
-    0xE0EA43444C61746ELLU, // khy_Latn_CD
-    0xE4EA50474C61746ELLU, // khz_Latn_PG
-    0x6B694B454C61746ELLU, // ki_Latn_KE
-    0x810A54444C61746ELLU, // kia_Latn_TD
-    0x850A53444C61746ELLU, // kib_Latn_SD
-    0x890A55534C61746ELLU, // kic_Latn_US
-    0x8D0A434D4C61746ELLU, // kid_Latn_CM
-    0x910A54444C61746ELLU, // kie_Latn_TD
-    0x950A4E5044657661LLU, // kif_Deva_NP
-    0x990A49444C61746ELLU, // kig_Latn_ID
-    0x9D0A50474C61746ELLU, // kih_Latn_PG
-    0xA50A50474C61746ELLU, // kij_Latn_PG
-    0xAD0A4E474C61746ELLU, // kil_Latn_NG
-    0xB10A52554379726CLLU, // kim_Cyrl_RU
-    0xB90A55534C61746ELLU, // kio_Latn_US
-    0xBD0A4E5044657661LLU, // kip_Deva_NP
-    0xC10A49444C61746ELLU, // kiq_Latn_ID
-    0xC90A50474C61746ELLU, // kis_Latn_PG
-    0xCD0A50474C61746ELLU, // kit_Latn_PG
-    0xD10A54524C61746ELLU, // kiu_Latn_TR
-    0xD50A545A4C61746ELLU, // kiv_Latn_TZ
-    0xD90A50474C61746ELLU, // kiw_Latn_PG
-    0xDD0A494E4C61746ELLU, // kix_Latn_IN
-    0xE10A49444C61746ELLU, // kiy_Latn_ID
-    0xE50A545A4C61746ELLU, // kiz_Latn_TZ
-    0x6B6A4E414C61746ELLU, // kj_Latn_NA
-    0x812A49444C61746ELLU, // kja_Latn_ID
-    0x852A47544C61746ELLU, // kjb_Latn_GT
-    0x892A49444C61746ELLU, // kjc_Latn_ID
-    0x8D2A50474C61746ELLU, // kjd_Latn_PG
-    0x912A49444C61746ELLU, // kje_Latn_ID
-    0x992A4C414C616F6FLLU, // kjg_Laoo_LA
-    0x9D2A52554379726CLLU, // kjh_Cyrl_RU
-    0xA12A53424C61746ELLU, // kji_Latn_SB
-    0xA52A415A4C61746ELLU, // kjj_Latn_AZ
-    0xA92A49444C61746ELLU, // kjk_Latn_ID
-    0xAD2A4E5044657661LLU, // kjl_Deva_NP
-    0xB12A564E4C61746ELLU, // kjm_Latn_VN
-    0xB52A41554C61746ELLU, // kjn_Latn_AU
-    0xB92A494E44657661LLU, // kjo_Deva_IN
-    0xBD2A4D4D4D796D72LLU, // kjp_Mymr_MM
-    0xC12A55534C61746ELLU, // kjq_Latn_US
-    0xC52A49444C61746ELLU, // kjr_Latn_ID
-    0xC92A50474C61746ELLU, // kjs_Latn_PG
-    0xCD2A544854686169LLU, // kjt_Thai_TH
-    0xD12A55534C61746ELLU, // kju_Latn_US
-    0xDD2A50474C61746ELLU, // kjx_Latn_PG
-    0xE12A50474C61746ELLU, // kjy_Latn_PG
-    0xE52A425454696274LLU, // kjz_Tibt_BT
-    0x6B6B434E41726162LLU, // kk_Arab_CN
-    0x6B6B4B5A4379726CLLU, // kk_Cyrl_KZ
-    0x814A4E474C61746ELLU, // kka_Latn_NG
-    0x854A49444C61746ELLU, // kkb_Latn_ID
-    0x894A50474C61746ELLU, // kkc_Latn_PG
-    0x8D4A4E474C61746ELLU, // kkd_Latn_NG
-    0x914A474E4C61746ELLU, // kke_Latn_GN
-    0x954A494E54696274LLU, // kkf_Tibt_IN
-    0x994A50484C61746ELLU, // kkg_Latn_PH
-    0x9D4A4D4D4C616E61LLU, // kkh_Lana_MM
-    0xA14A545A4C61746ELLU, // kki_Latn_TZ
-    0xA54A434D4C61746ELLU, // kkj_Latn_CM
-    0xA94A53424C61746ELLU, // kkk_Latn_SB
-    0xAD4A49444C61746ELLU, // kkl_Latn_ID
-    0xB14A4E474C61746ELLU, // kkm_Latn_NG
-    0xB94A53444C61746ELLU, // kko_Latn_SD
-    0xBD4A41554C61746ELLU, // kkp_Latn_AU
-    0xC14A43444C61746ELLU, // kkq_Latn_CD
-    0xC54A4E474C61746ELLU, // kkr_Latn_NG
-    0xC94A4E474C61746ELLU, // kks_Latn_NG
-    0xCD4A4E5044657661LLU, // kkt_Deva_NP
-    0xD14A4E474C61746ELLU, // kku_Latn_NG
-    0xD54A49444C61746ELLU, // kkv_Latn_ID
-    0xD94A43474C61746ELLU, // kkw_Latn_CG
-    0xDD4A49444C61746ELLU, // kkx_Latn_ID
-    0xE14A41554C61746ELLU, // kky_Latn_AU
-    0xE54A43414C61746ELLU, // kkz_Latn_CA
-    0x6B6C474C4C61746ELLU, // kl_Latn_GL
-    0x816A55534C61746ELLU, // kla_Latn_US
-    0x856A4D584C61746ELLU, // klb_Latn_MX
-    0x896A434D4C61746ELLU, // klc_Latn_CM
-    0x8D6A41554C61746ELLU, // kld_Latn_AU
-    0x916A4E5044657661LLU, // kle_Deva_NP
-    0x956A54444C61746ELLU, // klf_Latn_TD
-    0x996A50484C61746ELLU, // klg_Latn_PH
-    0x9D6A50474C61746ELLU, // klh_Latn_PG
-    0xA16A49444C61746ELLU, // kli_Latn_ID
-    0xA56A495241726162LLU, // klj_Arab_IR
-    0xA96A4E474C61746ELLU, // klk_Latn_NG
-    0xAD6A50484C61746ELLU, // kll_Latn_PH
-    0xB16A50474C61746ELLU, // klm_Latn_PG
-    0xB56A4B454C61746ELLU, // kln_Latn_KE
-    0xB96A4E474C61746ELLU, // klo_Latn_NG
-    0xBD6A50474C61746ELLU, // klp_Latn_PG
-    0xC16A50474C61746ELLU, // klq_Latn_PG
-    0xC56A4E5044657661LLU, // klr_Deva_NP
-    0xC96A504B4C61746ELLU, // kls_Latn_PK
-    0xCD6A50474C61746ELLU, // klt_Latn_PG
-    0xD16A4C524C61746ELLU, // klu_Latn_LR
-    0xD56A56554C61746ELLU, // klv_Latn_VU
-    0xD96A49444C61746ELLU, // klw_Latn_ID
-    0xDD6A50474C61746ELLU, // klx_Latn_PG
-    0xE16A49444C61746ELLU, // kly_Latn_ID
-    0xE56A49444C61746ELLU, // klz_Latn_ID
-    0x6B6D4B484B686D72LLU, // km_Khmr_KH
-    0x818A47484C61746ELLU, // kma_Latn_GH
-    0x858A414F4C61746ELLU, // kmb_Latn_AO
-    0x898A434E4C61746ELLU, // kmc_Latn_CN
-    0x8D8A50484C61746ELLU, // kmd_Latn_PH
-    0x918A434D4C61746ELLU, // kme_Latn_CM
-    0x958A50474C61746ELLU, // kmf_Latn_PG
-    0x998A50474C61746ELLU, // kmg_Latn_PG
-    0x9D8A50474C61746ELLU, // kmh_Latn_PG
-    0xA18A4E474C61746ELLU, // kmi_Latn_NG
-    0xA58A494E44657661LLU, // kmj_Deva_IN
-    0xA98A50484C61746ELLU, // kmk_Latn_PH
-    0xAD8A50484C61746ELLU, // kml_Latn_PH
-    0xB18A494E4C61746ELLU, // kmm_Latn_IN
-    0xB58A50474C61746ELLU, // kmn_Latn_PG
-    0xB98A50474C61746ELLU, // kmo_Latn_PG
-    0xBD8A434D4C61746ELLU, // kmp_Latn_CM
-    0xC18A45544C61746ELLU, // kmq_Latn_ET
-    0xC98A50474C61746ELLU, // kms_Latn_PG
-    0xCD8A49444C61746ELLU, // kmt_Latn_ID
-    0xD18A50474C61746ELLU, // kmu_Latn_PG
-    0xD58A42524C61746ELLU, // kmv_Latn_BR
-    0xD98A43444C61746ELLU, // kmw_Latn_CD
-    0xDD8A50474C61746ELLU, // kmx_Latn_PG
-    0xE18A4E474C61746ELLU, // kmy_Latn_NG
-    0xE58A495241726162LLU, // kmz_Arab_IR
-    0x6B6E494E4B6E6461LLU, // kn_Knda_IN
-    0x81AA4E474C61746ELLU, // kna_Latn_NG
-    0x85AA50484C61746ELLU, // knb_Latn_PH
-    0x8DAA49444C61746ELLU, // knd_Latn_ID
-    0x91AA50484C61746ELLU, // kne_Latn_PH
-    0x95AA47574C61746ELLU, // knf_Latn_GW
-    0xA1AA4E474C61746ELLU, // kni_Latn_NG
-    0xA5AA47544C61746ELLU, // knj_Latn_GT
-    0xA9AA534C4C61746ELLU, // knk_Latn_SL
-    0xADAA49444C61746ELLU, // knl_Latn_ID
-    0xB1AA42524C61746ELLU, // knm_Latn_BR
-    0xB5AA494E44657661LLU, // knn_Deva_IN
-    0xB9AA534C4C61746ELLU, // kno_Latn_SL
-    0xBDAA434D4C61746ELLU, // knp_Latn_CM
-    0xC1AA4D594C61746ELLU, // knq_Latn_MY
-    0xC5AA50474C61746ELLU, // knr_Latn_PG
-    0xC9AA4D594C61746ELLU, // kns_Latn_MY
-    0xCDAA42524C61746ELLU, // knt_Latn_BR
-    0xD1AA474E4C61746ELLU, // knu_Latn_GN
-    0xD5AA50474C61746ELLU, // knv_Latn_PG
-    0xD9AA4E414C61746ELLU, // knw_Latn_NA
-    0xDDAA49444C61746ELLU, // knx_Latn_ID
-    0xE1AA43444C61746ELLU, // kny_Latn_CD
-    0xE5AA42464C61746ELLU, // knz_Latn_BF
-    0x6B6F4B524B6F7265LLU, // ko_Kore_KR
-    0x81CA50474C61746ELLU, // koa_Latn_PG
-    0x89CA4E474C61746ELLU, // koc_Latn_NG
-    0x8DCA49444C61746ELLU, // kod_Latn_ID
-    0x91CA53534C61746ELLU, // koe_Latn_SS
-    0x95CA4E474C61746ELLU, // kof_Latn_NG
-    0x99CA434F4C61746ELLU, // kog_Latn_CO
-    0x9DCA43474C61746ELLU, // koh_Latn_CG
-    0xA1CA52554379726CLLU, // koi_Cyrl_RU
-    0xA9CA494E44657661LLU, // kok_Deva_IN
-    0xADCA50474C61746ELLU, // kol_Latn_PG
-    0xB9CA55474C61746ELLU, // koo_Latn_UG
-    0xBDCA50474C61746ELLU, // kop_Latn_PG
-    0xC1CA47414C61746ELLU, // koq_Latn_GA
-    0xC9CA464D4C61746ELLU, // kos_Latn_FM
-    0xCDCA434D4C61746ELLU, // kot_Latn_CM
-    0xD1CA54444C61746ELLU, // kou_Latn_TD
-    0xD5CA4E474C61746ELLU, // kov_Latn_NG
-    0xD9CA4E474C61746ELLU, // kow_Latn_NG
-    0xE1CA55534C61746ELLU, // koy_Latn_US
-    0xE5CA50474C61746ELLU, // koz_Latn_PG
-    0x81EA4E474C61746ELLU, // kpa_Latn_NG
-    0x89EA434F4C61746ELLU, // kpc_Latn_CO
-    0x8DEA49444C61746ELLU, // kpd_Latn_ID
-    0x91EA4C524C61746ELLU, // kpe_Latn_LR
-    0x95EA50474C61746ELLU, // kpf_Latn_PG
-    0x99EA464D4C61746ELLU, // kpg_Latn_FM
-    0x9DEA47484C61746ELLU, // kph_Latn_GH
-    0xA1EA49444C61746ELLU, // kpi_Latn_ID
-    0xA5EA42524C61746ELLU, // kpj_Latn_BR
-    0xA9EA4E474C61746ELLU, // kpk_Latn_NG
-    0xADEA43444C61746ELLU, // kpl_Latn_CD
-    0xB1EA564E4C61746ELLU, // kpm_Latn_VN
-    0xB5EA42524C61746ELLU, // kpn_Latn_BR
-    0xB9EA54474C61746ELLU, // kpo_Latn_TG
-    0xC1EA49444C61746ELLU, // kpq_Latn_ID
-    0xC5EA50474C61746ELLU, // kpr_Latn_PG
-    0xC9EA49444C61746ELLU, // kps_Latn_ID
-    0xCDEA52554379726CLLU, // kpt_Cyrl_RU
-    0xD1EA49444C61746ELLU, // kpu_Latn_ID
-    0xD9EA50474C61746ELLU, // kpw_Latn_PG
-    0xDDEA50474C61746ELLU, // kpx_Latn_PG
-    0xE1EA52554379726CLLU, // kpy_Cyrl_RU
-    0xE5EA55474C61746ELLU, // kpz_Latn_UG
-    0x820A50474C61746ELLU, // kqa_Latn_PG
-    0x860A50474C61746ELLU, // kqb_Latn_PG
-    0x8A0A50474C61746ELLU, // kqc_Latn_PG
-    0x8E0A495153797263LLU, // kqd_Syrc_IQ
-    0x920A50484C61746ELLU, // kqe_Latn_PH
-    0x960A50474C61746ELLU, // kqf_Latn_PG
-    0x9A0A42464C61746ELLU, // kqg_Latn_BF
-    0x9E0A545A4C61746ELLU, // kqh_Latn_TZ
-    0xA20A50474C61746ELLU, // kqi_Latn_PG
-    0xA60A50474C61746ELLU, // kqj_Latn_PG
-    0xAA0A424A4C61746ELLU, // kqk_Latn_BJ
-    0xAE0A50474C61746ELLU, // kql_Latn_PG
-    0xB20A43494C61746ELLU, // kqm_Latn_CI
-    0xB60A5A4D4C61746ELLU, // kqn_Latn_ZM
-    0xBA0A4C524C61746ELLU, // kqo_Latn_LR
-    0xBE0A54444C61746ELLU, // kqp_Latn_TD
-    0xC20A42524C61746ELLU, // kqq_Latn_BR
-    0xC60A4D594C61746ELLU, // kqr_Latn_MY
-    0xCA0A474E4C61746ELLU, // kqs_Latn_GN
-    0xCE0A4D594C61746ELLU, // kqt_Latn_MY
-    0xD20A5A414C61746ELLU, // kqu_Latn_ZA
-    0xD60A49444C61746ELLU, // kqv_Latn_ID
-    0xDA0A50474C61746ELLU, // kqw_Latn_PG
-    0xDE0A434D4C61746ELLU, // kqx_Latn_CM
-    0xE20A455445746869LLU, // kqy_Ethi_ET
-    0xE60A5A414C61746ELLU, // kqz_Latn_ZA
-    0x6B724E474C61746ELLU, // kr_Latn_NG
-    0x822A4E5044657661LLU, // kra_Deva_NP
-    0x862A55534C61746ELLU, // krb_Latn_US
-    0x8A2A52554379726CLLU, // krc_Cyrl_RU
-    0x8E2A544C4C61746ELLU, // krd_Latn_TL
-    0x922A42524C61746ELLU, // kre_Latn_BR
-    0x962A56554C61746ELLU, // krf_Latn_VU
-    0x9E2A4E474C61746ELLU, // krh_Latn_NG
-    0xA22A534C4C61746ELLU, // kri_Latn_SL
-    0xA62A50484C61746ELLU, // krj_Latn_PH
-    0xAA2A52554379726CLLU, // krk_Cyrl_RU
-    0xAE2A52554C61746ELLU, // krl_Latn_RU
-    0xB62A4C524C61746ELLU, // krn_Latn_LR
-    0xBE2A4E474C61746ELLU, // krp_Latn_NG
-    0xC62A4B484B686D72LLU, // krr_Khmr_KH
-    0xCA2A53534C61746ELLU, // krs_Latn_SS
-    0xCE2A4E454C61746ELLU, // krt_Latn_NE
-    0xD22A494E44657661LLU, // kru_Deva_IN
-    0xD62A4B484B686D72LLU, // krv_Khmr_KH
-    0xDA2A4C524C61746ELLU, // krw_Latn_LR
-    0xDE2A534E4C61746ELLU, // krx_Latn_SN
-    0xE22A415A4C61746ELLU, // kry_Latn_AZ
-    0xE62A49444C61746ELLU, // krz_Latn_ID
-    0x6B73494E41726162LLU, // ks_Arab_IN
-    0x864A545A4C61746ELLU, // ksb_Latn_TZ
-    0x8A4A50484C61746ELLU, // ksc_Latn_PH
-    0x8E4A50474C61746ELLU, // ksd_Latn_PG
-    0x924A50474C61746ELLU, // kse_Latn_PG
-    0x964A434D4C61746ELLU, // ksf_Latn_CM
-    0x9A4A53424C61746ELLU, // ksg_Latn_SB
-    0x9E4A44454C61746ELLU, // ksh_Latn_DE
-    0xA24A50474C61746ELLU, // ksi_Latn_PG
-    0xA64A50474C61746ELLU, // ksj_Latn_PG
-    0xAA4A55534C61746ELLU, // ksk_Latn_US
-    0xAE4A50474C61746ELLU, // ksl_Latn_PG
-    0xB24A4E474C61746ELLU, // ksm_Latn_NG
-    0xB64A50484C61746ELLU, // ksn_Latn_PH
-    0xBA4A4E474C61746ELLU, // kso_Latn_NG
-    0xBE4A43464C61746ELLU, // ksp_Latn_CF
-    0xC24A4E474C61746ELLU, // ksq_Latn_NG
-    0xC64A50474C61746ELLU, // ksr_Latn_PG
-    0xCA4A4C524C61746ELLU, // kss_Latn_LR
-    0xCE4A42464C61746ELLU, // kst_Latn_BF
-    0xD24A494E4D796D72LLU, // ksu_Mymr_IN
-    0xD64A43444C61746ELLU, // ksv_Latn_CD
-    0xDA4A4D4D4D796D72LLU, // ksw_Mymr_MM
-    0xDE4A49444C61746ELLU, // ksx_Latn_ID
-    0xE64A494E44657661LLU, // ksz_Deva_IN
-    0x826A564E4C61746ELLU, // kta_Latn_VN
-    0x866A455445746869LLU, // ktb_Ethi_ET
-    0x8A6A4E474C61746ELLU, // ktc_Latn_NG
-    0x8E6A41554C61746ELLU, // ktd_Latn_AU
-    0x926A4E5044657661LLU, // kte_Deva_NP
-    0x966A43444C61746ELLU, // ktf_Latn_CD
-    0x9A6A41554C61746ELLU, // ktg_Latn_AU
-    0x9E6A54444C61746ELLU, // kth_Latn_TD
-    0xA26A49444C61746ELLU, // kti_Latn_ID
-    0xA66A43494C61746ELLU, // ktj_Latn_CI
-    0xAA6A50474C61746ELLU, // ktk_Latn_PG
-    0xAE6A495241726162LLU, // ktl_Arab_IR
-    0xB26A50474C61746ELLU, // ktm_Latn_PG
-    0xB66A42524C61746ELLU, // ktn_Latn_BR
-    0xBA6A50474C61746ELLU, // kto_Latn_PG
-    0xBE6A434E506C7264LLU, // ktp_Plrd_CN
-    0xC26A50484C61746ELLU, // ktq_Latn_PH
-    0xCA6A49444C61746ELLU, // kts_Latn_ID
-    0xCE6A49444C61746ELLU, // ktt_Latn_ID
-    0xD26A43444C61746ELLU, // ktu_Latn_CD
-    0xD66A564E4C61746ELLU, // ktv_Latn_VN
-    0xDA6A55534C61746ELLU, // ktw_Latn_US
-    0xDE6A42524C61746ELLU, // ktx_Latn_BR
-    0xE26A43444C61746ELLU, // kty_Latn_CD
-    0xE66A4E414C61746ELLU, // ktz_Latn_NA
-    0x6B75495141726162LLU, // ku_Arab_IQ
-    0x6B7554524C61746ELLU, // ku_Latn_TR
-    0x6B75474559657A69LLU, // ku_Yezi_GE
-    0x868A4E474C61746ELLU, // kub_Latn_NG
-    0x8A8A49444C61746ELLU, // kuc_Latn_ID
-    0x8E8A50474C61746ELLU, // kud_Latn_PG
-    0x928A50474C61746ELLU, // kue_Latn_PG
-    0x968A4C414C616F6FLLU, // kuf_Laoo_LA
-    0x9A8A4E474C61746ELLU, // kug_Latn_NG
-    0x9E8A4E474C61746ELLU, // kuh_Latn_NG
-    0xA28A42524C61746ELLU, // kui_Latn_BR
-    0xA68A545A4C61746ELLU, // kuj_Latn_TZ
-    0xAA8A49444C61746ELLU, // kuk_Latn_ID
-    0xAE8A4E474C61746ELLU, // kul_Latn_NG
-    0xB28A52554379726CLLU, // kum_Cyrl_RU
-    0xB68A45524C61746ELLU, // kun_Latn_ER
-    0xBA8A50474C61746ELLU, // kuo_Latn_PG
-    0xBE8A50474C61746ELLU, // kup_Latn_PG
-    0xC28A42524C61746ELLU, // kuq_Latn_BR
-    0xCA8A47484C61746ELLU, // kus_Latn_GH
-    0xCE8A43414C61746ELLU, // kut_Latn_CA
-    0xD28A55534C61746ELLU, // kuu_Latn_US
-    0xD68A49444C61746ELLU, // kuv_Latn_ID
-    0xDA8A43464C61746ELLU, // kuw_Latn_CF
-    0xDE8A41554C61746ELLU, // kux_Latn_AU
-    0xE28A41554C61746ELLU, // kuy_Latn_AU
-    0xE68A434C4C61746ELLU, // kuz_Latn_CL
-    0x6B7652554379726CLLU, // kv_Cyrl_RU
-    0x82AA52554379726CLLU, // kva_Cyrl_RU
-    0x86AA49444C61746ELLU, // kvb_Latn_ID
-    0x8AAA50474C61746ELLU, // kvc_Latn_PG
-    0x8EAA49444C61746ELLU, // kvd_Latn_ID
-    0x92AA4D594C61746ELLU, // kve_Latn_MY
-    0x96AA54444C61746ELLU, // kvf_Latn_TD
-    0x9AAA50474C61746ELLU, // kvg_Latn_PG
-    0x9EAA49444C61746ELLU, // kvh_Latn_ID
-    0xA2AA54444C61746ELLU, // kvi_Latn_TD
-    0xA6AA434D4C61746ELLU, // kvj_Latn_CM
-    0xAEAA4D4D4C61746ELLU, // kvl_Latn_MM
-    0xB2AA434D4C61746ELLU, // kvm_Latn_CM
-    0xB6AA434F4C61746ELLU, // kvn_Latn_CO
-    0xBAAA49444C61746ELLU, // kvo_Latn_ID
-    0xBEAA49444C61746ELLU, // kvp_Latn_ID
-    0xC2AA4D4D4D796D72LLU, // kvq_Mymr_MM
-    0xC6AA49444C61746ELLU, // kvr_Latn_ID
-    0xCEAA4D4D4D796D72LLU, // kvt_Mymr_MM
-    0xD6AA49444C61746ELLU, // kvv_Latn_ID
-    0xDAAA49444C61746ELLU, // kvw_Latn_ID
-    0xDEAA504B41726162LLU, // kvx_Arab_PK
-    0xE2AA4D4D4B616C69LLU, // kvy_Kali_MM
-    0xE6AA49444C61746ELLU, // kvz_Latn_ID
-    0x6B7747424C61746ELLU, // kw_Latn_GB
-    0x82CA42524C61746ELLU, // kwa_Latn_BR
-    0x86CA4E474C61746ELLU, // kwb_Latn_NG
-    0x8ACA43474C61746ELLU, // kwc_Latn_CG
-    0x8ECA53424C61746ELLU, // kwd_Latn_SB
-    0x92CA49444C61746ELLU, // kwe_Latn_ID
-    0x96CA53424C61746ELLU, // kwf_Latn_SB
-    0x9ACA54444C61746ELLU, // kwg_Latn_TD
-    0x9ECA49444C61746ELLU, // kwh_Latn_ID
-    0xA2CA434F4C61746ELLU, // kwi_Latn_CO
-    0xA6CA50474C61746ELLU, // kwj_Latn_PG
-    0xAACA43414C61746ELLU, // kwk_Latn_CA
-    0xAECA4E474C61746ELLU, // kwl_Latn_NG
-    0xB2CA4E414C61746ELLU, // kwm_Latn_NA
-    0xB6CA4E414C61746ELLU, // kwn_Latn_NA
-    0xBACA50474C61746ELLU, // kwo_Latn_PG
-    0xBECA43494C61746ELLU, // kwp_Latn_CI
-    0xC6CA49444C61746ELLU, // kwr_Latn_ID
-    0xCACA43444C61746ELLU, // kws_Latn_CD
-    0xCECA49444C61746ELLU, // kwt_Latn_ID
-    0xD2CA434D4C61746ELLU, // kwu_Latn_CM
-    0xD6CA54444C61746ELLU, // kwv_Latn_TD
-    0xDACA53524C61746ELLU, // kww_Latn_SR
-    0xE2CA414F4C61746ELLU, // kwy_Latn_AO
-    0xE6CA414F4C61746ELLU, // kwz_Latn_AO
-    0x82EA50474C61746ELLU, // kxa_Latn_PG
-    0x86EA43494C61746ELLU, // kxb_Latn_CI
-    0x8AEA45544C61746ELLU, // kxc_Latn_ET
-    0x8EEA424E4C61746ELLU, // kxd_Latn_BN
-    0x96EA4D4D4D796D72LLU, // kxf_Mymr_MM
-    0xA2EA4D594C61746ELLU, // kxi_Latn_MY
-    0xA6EA54444C61746ELLU, // kxj_Latn_TD
-    0xAAEA4D4D4D796D72LLU, // kxk_Mymr_MM
-    0xB2EA544854686169LLU, // kxm_Thai_TH
-    0xB6EA4D594C61746ELLU, // kxn_Latn_MY
-    0xBAEA42524C61746ELLU, // kxo_Latn_BR
-    0xBEEA504B41726162LLU, // kxp_Arab_PK
-    0xC2EA49444C61746ELLU, // kxq_Latn_ID
-    0xC6EA50474C61746ELLU, // kxr_Latn_PG
-    0xCEEA50474C61746ELLU, // kxt_Latn_PG
-    0xD6EA494E4C61746ELLU, // kxv_Latn_IN
-    0xDAEA50474C61746ELLU, // kxw_Latn_PG
-    0xDEEA43474C61746ELLU, // kxx_Latn_CG
-    0xE2EA564E4C61746ELLU, // kxy_Latn_VN
-    0xE6EA50474C61746ELLU, // kxz_Latn_PG
-    0x6B79434E41726162LLU, // ky_Arab_CN
-    0x6B794B474379726CLLU, // ky_Cyrl_KG
-    0x6B7954524C61746ELLU, // ky_Latn_TR
-    0x830A545A4C61746ELLU, // kya_Latn_TZ
-    0x870A50484C61746ELLU, // kyb_Latn_PH
-    0x8B0A50474C61746ELLU, // kyc_Latn_PG
-    0x8F0A49444C61746ELLU, // kyd_Latn_ID
-    0x930A47484C61746ELLU, // kye_Latn_GH
-    0x970A43494C61746ELLU, // kyf_Latn_CI
-    0x9B0A50474C61746ELLU, // kyg_Latn_PG
-    0x9F0A55534C61746ELLU, // kyh_Latn_US
-    0xA30A4D594C61746ELLU, // kyi_Latn_MY
-    0xA70A50484C61746ELLU, // kyj_Latn_PH
-    0xAB0A50484C61746ELLU, // kyk_Latn_PH
-    0xAF0A55534C61746ELLU, // kyl_Latn_US
-    0xB30A43464C61746ELLU, // kym_Latn_CF
-    0xB70A50484C61746ELLU, // kyn_Latn_PH
-    0xBB0A49444C61746ELLU, // kyo_Latn_ID
-    0xC30A54444C61746ELLU, // kyq_Latn_TD
-    0xC70A42524C61746ELLU, // kyr_Latn_BR
-    0xCB0A4D594C61746ELLU, // kys_Latn_MY
-    0xCF0A49444C61746ELLU, // kyt_Latn_ID
-    0xD30A4D4D4B616C69LLU, // kyu_Kali_MM
-    0xD70A4E5044657661LLU, // kyv_Deva_NP
-    0xDB0A494E44657661LLU, // kyw_Deva_IN
-    0xDF0A50474C61746ELLU, // kyx_Latn_PG
-    0xE30A50474C61746ELLU, // kyy_Latn_PG
-    0xE70A42524C61746ELLU, // kyz_Latn_BR
-    0x832A42464C61746ELLU, // kza_Latn_BF
-    0x872A49444C61746ELLU, // kzb_Latn_ID
-    0x8B2A43494C61746ELLU, // kzc_Latn_CI
-    0x8F2A49444C61746ELLU, // kzd_Latn_ID
-    0x932A50474C61746ELLU, // kze_Latn_PG
-    0x972A49444C61746ELLU, // kzf_Latn_ID
-    0xA32A4D594C61746ELLU, // kzi_Latn_MY
-    0xAB2A53424C61746ELLU, // kzk_Latn_SB
-    0xAF2A49444C61746ELLU, // kzl_Latn_ID
-    0xB32A49444C61746ELLU, // kzm_Latn_ID
-    0xB72A4D574C61746ELLU, // kzn_Latn_MW
-    0xBB2A47414C61746ELLU, // kzo_Latn_GA
-    0xBF2A49444C61746ELLU, // kzp_Latn_ID
-    0xC72A434D4C61746ELLU, // kzr_Latn_CM
-    0xCB2A4D594C61746ELLU, // kzs_Latn_MY
-    0xD32A49444C61746ELLU, // kzu_Latn_ID
-    0xD72A49444C61746ELLU, // kzv_Latn_ID
-    0xDB2A42524C61746ELLU, // kzw_Latn_BR
-    0xDF2A49444C61746ELLU, // kzx_Latn_ID
-    0xE32A43444C61746ELLU, // kzy_Latn_CD
-    0xE72A49444C61746ELLU, // kzz_Latn_ID
-    0x6C6156414C61746ELLU, // la_Latn_VA
-    0x800B50484C61746ELLU, // laa_Latn_PH
-    0x840B47524C696E61LLU, // lab_Lina_GR
-    0x880B4D584C61746ELLU, // lac_Latn_MX
-    0x8C0B494C48656272LLU, // lad_Hebr_IL
-    0x900B494E44657661LLU, // lae_Deva_IN
-    0x980B545A4C61746ELLU, // lag_Latn_TZ
-    0x9C0B504B41726162LLU, // lah_Arab_PK
-    0xA00B4D574C61746ELLU, // lai_Latn_MW
-    0xA40B55474C61746ELLU, // laj_Latn_UG
-    0xAC0B43444C61746ELLU, // lal_Latn_CD
-    0xB00B5A4D4C61746ELLU, // lam_Latn_ZM
-    0xB40B4E474C61746ELLU, // lan_Latn_NG
-    0xBC0B54444C61746ELLU, // lap_Latn_TD
-    0xC00B564E4C61746ELLU, // laq_Latn_VN
-    0xC40B47484C61746ELLU, // lar_Latn_GH
-    0xC80B54474C61746ELLU, // las_Latn_TG
-    0xD00B49444C61746ELLU, // lau_Latn_ID
-    0xD80B49444C61746ELLU, // law_Latn_ID
-    0xDC0B494E4C61746ELLU, // lax_Latn_IN
-    0xE40B50474C61746ELLU, // laz_Latn_PG
-    0x6C624C554C61746ELLU, // lb_Latn_LU
-    0x842B50474C61746ELLU, // lbb_Latn_PG
-    0x902B52554379726CLLU, // lbe_Cyrl_RU
-    0x942B494E44657661LLU, // lbf_Deva_IN
-    0xA02B434D4C61746ELLU, // lbi_Latn_CM
-    0xA42B494E54696274LLU, // lbj_Tibt_IN
-    0xAC2B50484C61746ELLU, // lbl_Latn_PH
-    0xB02B494E44657661LLU, // lbm_Deva_IN
-    0xB42B4C414C61746ELLU, // lbn_Latn_LA
-    0xB82B4C414C616F6FLLU, // lbo_Laoo_LA
-    0xC02B50474C61746ELLU, // lbq_Latn_PG
-    0xC42B4E5044657661LLU, // lbr_Deva_NP
-    0xCC2B564E4C61746ELLU, // lbt_Latn_VN
-    0xD02B50474C61746ELLU, // lbu_Latn_PG
-    0xD42B50474C61746ELLU, // lbv_Latn_PG
-    0xD82B49444C61746ELLU, // lbw_Latn_ID
-    0xDC2B49444C61746ELLU, // lbx_Latn_ID
-    0xE02B41554C61746ELLU, // lby_Latn_AU
-    0xE42B41554C61746ELLU, // lbz_Latn_AU
-    0x884B49444C61746ELLU, // lcc_Latn_ID
-    0x8C4B49444C61746ELLU, // lcd_Latn_ID
-    0x904B49444C61746ELLU, // lce_Latn_ID
-    0x944B49444C61746ELLU, // lcf_Latn_ID
-    0x9C4B414F4C61746ELLU, // lch_Latn_AO
-    0xAC4B49444C61746ELLU, // lcl_Latn_ID
-    0xB04B50474C61746ELLU, // lcm_Latn_PG
-    0xBC4B434E54686169LLU, // lcp_Thai_CN
-    0xC04B49444C61746ELLU, // lcq_Latn_ID
-    0xC84B49444C61746ELLU, // lcs_Latn_ID
-    0x806B43494C61746ELLU, // lda_Latn_CI
-    0x846B4E474C61746ELLU, // ldb_Latn_NG
-    0x8C6B4E474C61746ELLU, // ldd_Latn_NG
-    0x986B4E474C61746ELLU, // ldg_Latn_NG
-    0x9C6B4E474C61746ELLU, // ldh_Latn_NG
-    0xA06B43474C61746ELLU, // ldi_Latn_CG
-    0xA46B4E474C61746ELLU, // ldj_Latn_NG
-    0xA86B4E474C61746ELLU, // ldk_Latn_NG
-    0xAC6B4E474C61746ELLU, // ldl_Latn_NG
-    0xB06B474E4C61746ELLU, // ldm_Latn_GN
-    0xB86B4E474C61746ELLU, // ldo_Latn_NG
-    0xBC6B4E474C61746ELLU, // ldp_Latn_NG
-    0xC06B4E474C61746ELLU, // ldq_Latn_NG
-    0x808B43444C61746ELLU, // lea_Latn_CD
-    0x848B5A4D4C61746ELLU, // leb_Latn_ZM
-    0x888B424F4C61746ELLU, // lec_Latn_BO
-    0x8C8B43444C61746ELLU, // led_Latn_CD
-    0x908B42464C61746ELLU, // lee_Latn_BF
-    0x948B47484C61746ELLU, // lef_Latn_GH
-    0x9C8B5A4D4C61746ELLU, // leh_Latn_ZM
-    0xA08B50474C61746ELLU, // lei_Latn_PG
-    0xA48B43444C61746ELLU, // lej_Latn_CD
-    0xA88B50474C61746ELLU, // lek_Latn_PG
-    0xAC8B43444C61746ELLU, // lel_Latn_CD
-    0xB08B434D4C61746ELLU, // lem_Latn_CM
-    0xB48B484E4C61746ELLU, // len_Latn_HN
-    0xB88B434D4C61746ELLU, // leo_Latn_CM
-    0xBC8B494E4C657063LLU, // lep_Lepc_IN
-    0xC08B50474C61746ELLU, // leq_Latn_PG
-    0xC48B50474C61746ELLU, // ler_Latn_PG
-    0xC88B43444C61746ELLU, // les_Latn_CD
-    0xCC8B50474C61746ELLU, // let_Latn_PG
-    0xD08B50474C61746ELLU, // leu_Latn_PG
-    0xD48B49444C61746ELLU, // lev_Latn_ID
-    0xD88B49444C61746ELLU, // lew_Latn_ID
-    0xDC8B49444C61746ELLU, // lex_Latn_ID
-    0xE08B49444C61746ELLU, // ley_Latn_ID
-    0xE48B52554379726CLLU, // lez_Cyrl_RU
-    0x80AB434D4C61746ELLU, // lfa_Latn_CM
-    0x6C6755474C61746ELLU, // lg_Latn_UG
-    0x80CB53424C61746ELLU, // lga_Latn_SB
-    0x84CB53424C61746ELLU, // lgb_Latn_SB
-    0x98CB55474C61746ELLU, // lgg_Latn_UG
-    0x9CCB564E4C61746ELLU, // lgh_Latn_VN
-    0xA0CB49444C61746ELLU, // lgi_Latn_ID
-    0xA8CB56554C61746ELLU, // lgk_Latn_VU
-    0xACCB53424C61746ELLU, // lgl_Latn_SB
-    0xB0CB43444C61746ELLU, // lgm_Latn_CD
-    0xB4CB45544C61746ELLU, // lgn_Latn_ET
-    0xB8CB53534C61746ELLU, // lgo_Latn_SS
-    0xC0CB47484C61746ELLU, // lgq_Latn_GH
-    0xC4CB53424C61746ELLU, // lgr_Latn_SB
-    0xCCCB50474C61746ELLU, // lgt_Latn_PG
-    0xD0CB53424C61746ELLU, // lgu_Latn_SB
-    0xE4CB43444C61746ELLU, // lgz_Latn_CD
-    0x80EB564E4C61746ELLU, // lha_Latn_VN
-    0x9CEB49444C61746ELLU, // lhh_Latn_ID
-    0xA0EB434E4C61746ELLU, // lhi_Latn_CN
-    0xB0EB4E5044657661LLU, // lhm_Deva_NP
-    0xB4EB4D594C61746ELLU, // lhn_Latn_MY
-    0xC8EB535953797263LLU, // lhs_Syrc_SY
-    0xCCEB56554C61746ELLU, // lht_Latn_VU
-    0xD0EB434E4C61746ELLU, // lhu_Latn_CN
-    0x6C694E4C4C61746ELLU, // li_Latn_NL
-    0x810B534C4C61746ELLU, // lia_Latn_SL
-    0x850B50474C61746ELLU, // lib_Latn_PG
-    0x890B434E4C61746ELLU, // lic_Latn_CN
-    0x8D0B50474C61746ELLU, // lid_Latn_PG
-    0x910B43444C61746ELLU, // lie_Latn_CD
-    0x950B4E5044657661LLU, // lif_Deva_NP
-    0x950B494E4C696D62LLU, // lif_Limb_IN
-    0x990B47484C61746ELLU, // lig_Latn_GH
-    0x9D0B50474C61746ELLU, // lih_Latn_PG
-    0xA50B49544C61746ELLU, // lij_Latn_IT
-    0xA90B43444C61746ELLU, // lik_Latn_CD
-    0xAD0B43414C61746ELLU, // lil_Latn_CA
-    0xB90B49444C61746ELLU, // lio_Latn_ID
-    0xBD0B47484C61746ELLU, // lip_Latn_GH
-    0xC10B45544C61746ELLU, // liq_Latn_ET
-    0xC50B4C524C61746ELLU, // lir_Latn_LR
-    0xC90B434E4C697375LLU, // lis_Lisu_CN
-    0xD10B53444C61746ELLU, // liu_Latn_SD
-    0xD50B4C564C61746ELLU, // liv_Latn_LV
-    0xD90B49444C61746ELLU, // liw_Latn_ID
-    0xDD0B49444C61746ELLU, // lix_Latn_ID
-    0xE10B43464C61746ELLU, // liy_Latn_CF
-    0xE50B43444C61746ELLU, // liz_Latn_CD
-    0x812B41554C61746ELLU, // lja_Latn_AU
-    0x912B49444C61746ELLU, // lje_Latn_ID
-    0xA12B49444C61746ELLU, // lji_Latn_ID
-    0xAD2B49444C61746ELLU, // ljl_Latn_ID
-    0xBD2B49444C61746ELLU, // ljp_Latn_ID
-    0xD92B41554C61746ELLU, // ljw_Latn_AU
-    0xDD2B41554C61746ELLU, // ljx_Latn_AU
-    0x814B544C4C61746ELLU, // lka_Latn_TL
-    0x854B4B454C61746ELLU, // lkb_Latn_KE
-    0x894B564E4C61746ELLU, // lkc_Latn_VN
-    0x8D4B42524C61746ELLU, // lkd_Latn_BR
-    0x914B55474C61746ELLU, // lke_Latn_UG
-    0x9D4B425454696274LLU, // lkh_Tibt_BT
-    0xA14B495241726162LLU, // lki_Arab_IR
-    0xA54B4D594C61746ELLU, // lkj_Latn_MY
-    0xAD4B50474C61746ELLU, // lkl_Latn_PG
-    0xB14B41554C61746ELLU, // lkm_Latn_AU
-    0xB54B56554C61746ELLU, // lkn_Latn_VU
-    0xB94B4B454C61746ELLU, // lko_Latn_KE
-    0xC54B53534C61746ELLU, // lkr_Latn_SS
-    0xC94B4B454C61746ELLU, // lks_Latn_KE
-    0xCD4B55534C61746ELLU, // lkt_Latn_US
-    0xD14B41554C61746ELLU, // lku_Latn_AU
-    0xE14B53534C61746ELLU, // lky_Latn_SS
-    0x816B4E474C61746ELLU, // lla_Latn_NG
-    0x856B4D5A4C61746ELLU, // llb_Latn_MZ
-    0x896B474E4C61746ELLU, // llc_Latn_GN
-    0x8D6B49544C61746ELLU, // lld_Latn_IT
-    0x916B50474C61746ELLU, // lle_Latn_PG
-    0x956B50474C61746ELLU, // llf_Latn_PG
-    0x996B49444C61746ELLU, // llg_Latn_ID
-    0xA16B43474C61746ELLU, // lli_Latn_CG
-    0xA56B41554C61746ELLU, // llj_Latn_AU
-    0xA96B4D594C61746ELLU, // llk_Latn_MY
-    0xAD6B50474C61746ELLU, // lll_Latn_PG
-    0xB16B49444C61746ELLU, // llm_Latn_ID
-    0xB56B54444C61746ELLU, // lln_Latn_TD
-    0xBD6B56554C61746ELLU, // llp_Latn_VU
-    0xC16B49444C61746ELLU, // llq_Latn_ID
-    0xD16B53424C61746ELLU, // llu_Latn_SB
-    0xDD6B464A4C61746ELLU, // llx_Latn_FJ
-    0x818B474E4C61746ELLU, // lma_Latn_GN
-    0x858B56554C61746ELLU, // lmb_Latn_VU
-    0x898B41554C61746ELLU, // lmc_Latn_AU
-    0x8D8B53444C61746ELLU, // lmd_Latn_SD
-    0x918B54444C61746ELLU, // lme_Latn_TD
-    0x958B49444C61746ELLU, // lmf_Latn_ID
-    0x998B50474C61746ELLU, // lmg_Latn_PG
-    0x9D8B4E5044657661LLU, // lmh_Deva_NP
-    0xA18B43444C61746ELLU, // lmi_Latn_CD
-    0xA58B49444C61746ELLU, // lmj_Latn_ID
-    0xA98B494E4C61746ELLU, // lmk_Latn_IN
-    0xAD8B56554C61746ELLU, // lml_Latn_VU
-    0xB58B494E54656C75LLU, // lmn_Telu_IN
-    0xB98B49544C61746ELLU, // lmo_Latn_IT
-    0xBD8B434D4C61746ELLU, // lmp_Latn_CM
-    0xC18B49444C61746ELLU, // lmq_Latn_ID
-    0xC58B49444C61746ELLU, // lmr_Latn_ID
-    0xD18B56554C61746ELLU, // lmu_Latn_VU
-    0xD58B464A4C61746ELLU, // lmv_Latn_FJ
-    0xD98B55534C61746ELLU, // lmw_Latn_US
-    0xDD8B434D4C61746ELLU, // lmx_Latn_CM
-    0xE18B49444C61746ELLU, // lmy_Latn_ID
-    0x6C6E43444C61746ELLU, // ln_Latn_CD
-    0x81AB43464C61746ELLU, // lna_Latn_CF
-    0x85AB4E414C61746ELLU, // lnb_Latn_NA
-    0x8DAB49444C61746ELLU, // lnd_Latn_ID
-    0x99AB48554C61746ELLU, // lng_Latn_HU
-    0x9DAB4D594C61746ELLU, // lnh_Latn_MY
-    0xA1AB50474C61746ELLU, // lni_Latn_PG
-    0xA5AB41554C61746ELLU, // lnj_Latn_AU
-    0xADAB43464C61746ELLU, // lnl_Latn_CF
-    0xB1AB50474C61746ELLU, // lnm_Latn_PG
-    0xB5AB56554C61746ELLU, // lnn_Latn_VU
-    0xC9AB434D4C61746ELLU, // lns_Latn_CM
-    0xD1AB4E474C61746ELLU, // lnu_Latn_NG
-    0xD9AB41554C61746ELLU, // lnw_Latn_AU
-    0xE5AB43444C61746ELLU, // lnz_Latn_CD
-    0x6C6F4C414C616F6FLLU, // lo_Laoo_LA
-    0x81CB49444C61746ELLU, // loa_Latn_ID
-    0x85CB42464C61746ELLU, // lob_Latn_BF
-    0x89CB50484C61746ELLU, // loc_Latn_PH
-    0x91CB49444C61746ELLU, // loe_Latn_ID
-    0x99CB43444C61746ELLU, // log_Latn_CD
-    0x9DCB53534C61746ELLU, // loh_Latn_SS
-    0xA1CB43494C61746ELLU, // loi_Latn_CI
-    0xA5CB50474C61746ELLU, // loj_Latn_PG
-    0xA9CB534C4C61746ELLU, // lok_Latn_SL
-    0xADCB43444C61746ELLU, // lol_Latn_CD
-    0xB1CB4C524C61746ELLU, // lom_Latn_LR
-    0xB5CB4D574C61746ELLU, // lon_Latn_MW
-    0xB9CB43444C61746ELLU, // loo_Latn_CD
-    0xBDCB4E474C61746ELLU, // lop_Latn_NG
-    0xC1CB43444C61746ELLU, // loq_Latn_CD
-    0xC5CB43494C61746ELLU, // lor_Latn_CI
-    0xC9CB50474C61746ELLU, // los_Latn_PG
-    0xCDCB53534C61746ELLU, // lot_Latn_SS
-    0xD1CB55534C61746ELLU, // lou_Latn_US
-    0xD9CB4D594C61746ELLU, // low_Latn_MY
-    0xDDCB49444C61746ELLU, // lox_Latn_ID
-    0xE1CB4E5044657661LLU, // loy_Deva_NP
-    0xE5CB5A4D4C61746ELLU, // loz_Latn_ZM
-    0x81EB56554C61746ELLU, // lpa_Latn_VU
-    0x91EB49444C61746ELLU, // lpe_Latn_ID
-    0xB5EB4D4D4C61746ELLU, // lpn_Latn_MM
-    0xB9EB434E506C7264LLU, // lpo_Plrd_CN
-    0xDDEB53534C61746ELLU, // lpx_Latn_SS
-    0xC60B53534C61746ELLU, // lqr_Latn_SS
-    0x822B4D594C61746ELLU, // lra_Latn_MY
-    0x8A2B495241726162LLU, // lrc_Arab_IR
-    0x9A2B41554C61746ELLU, // lrg_Latn_AU
-    0xA22B4B454C61746ELLU, // lri_Latn_KE
-    0xAA2B504B41726162LLU, // lrk_Arab_PK
-    0xAE2B495241726162LLU, // lrl_Arab_IR
-    0xB22B4B454C61746ELLU, // lrm_Latn_KE
-    0xB62B49444C61746ELLU, // lrn_Latn_ID
-    0xBA2B53444C61746ELLU, // lro_Latn_SD
-    0xCE2B49444C61746ELLU, // lrt_Latn_ID
-    0xD62B56554C61746ELLU, // lrv_Latn_VU
-    0xE62B56554C61746ELLU, // lrz_Latn_VU
-    0x824B495241726162LLU, // lsa_Arab_IR
-    0x8E4B494C48656272LLU, // lsd_Hebr_IL
-    0x924B43444C61746ELLU, // lse_Latn_CD
-    0xA24B4D4D4C61746ELLU, // lsi_Latn_MM
-    0xB24B55474C61746ELLU, // lsm_Latn_UG
-    0xC64B50474C61746ELLU, // lsr_Latn_PG
-    0xCA4B504B41726162LLU, // lss_Arab_PK
-    0x6C744C544C61746ELLU, // lt_Latn_LT
-    0x8A6B434E48616E74LLU, // ltc_Hant_CN
-    0x9A6B4C564C61746ELLU, // ltg_Latn_LV
-    0x9E6B55474C61746ELLU, // lth_Latn_UG
-    0xA26B49444C61746ELLU, // lti_Latn_ID
-    0xB66B42524C61746ELLU, // ltn_Latn_BR
-    0xBA6B4B454C61746ELLU, // lto_Latn_KE
-    0xCA6B4B454C61746ELLU, // lts_Latn_KE
-    0xD26B49444C61746ELLU, // ltu_Latn_ID
-    0x6C7543444C61746ELLU, // lu_Latn_CD
-    0x828B43444C61746ELLU, // lua_Latn_CD
-    0x8A8B55474C61746ELLU, // luc_Latn_UG
-    0x8E8B52554C61746ELLU, // lud_Latn_RU
-    0x928B5A4D4C61746ELLU, // lue_Latn_ZM
-    0x968B50474C61746ELLU, // luf_Latn_PG
-    0xA28B55534C61746ELLU, // lui_Latn_US
-    0xA68B43444C61746ELLU, // luj_Latn_CD
-    0xAA8B425454696274LLU, // luk_Tibt_BT
-    0xAE8B53534C61746ELLU, // lul_Latn_SS
-    0xB28B414F4C61746ELLU, // lum_Latn_AO
-    0xB68B5A4D4C61746ELLU, // lun_Latn_ZM
-    0xBA8B4B454C61746ELLU, // luo_Latn_KE
-    0xBE8B47414C61746ELLU, // lup_Latn_GA
-    0xC28B43554C61746ELLU, // luq_Latn_CU
-    0xC68B49444C61746ELLU, // lur_Latn_ID
-    0xCA8B494E4C61746ELLU, // lus_Latn_IN
-    0xCE8B55534C61746ELLU, // lut_Latn_US
-    0xD28B4E5044657661LLU, // luu_Deva_NP
-    0xD68B4F4D41726162LLU, // luv_Arab_OM
-    0xDA8B434D4C61746ELLU, // luw_Latn_CM
-    0xE28B4B454C61746ELLU, // luy_Latn_KE
-    0xE68B495241726162LLU, // luz_Arab_IR
-    0x6C764C564C61746ELLU, // lv_Latn_LV
-    0x82AB544C4C61746ELLU, // lva_Latn_TL
-    0xA2AB4C414C61746ELLU, // lvi_Latn_LA
-    0xAAAB53424C61746ELLU, // lvk_Latn_SB
-    0xAEAB43444C61746ELLU, // lvl_Latn_CD
-    0xD2AB49444C61746ELLU, // lvu_Latn_ID
-    0x82CB43444C61746ELLU, // lwa_Latn_CD
-    0x92CB49444C61746ELLU, // lwe_Latn_ID
-    0x9ACB4B454C61746ELLU, // lwg_Latn_KE
-    0x9ECB564E4C61746ELLU, // lwh_Latn_VN
-    0xAECB544854686169LLU, // lwl_Thai_TH
-    0xB2CB434E54686169LLU, // lwm_Thai_CN
-    0xBACB53534C61746ELLU, // lwo_Latn_SS
-    0xCECB49444C61746ELLU, // lwt_Latn_ID
-    0xDACB56554C61746ELLU, // lww_Latn_VU
-    0xB2EB50474C61746ELLU, // lxm_Latn_PG
-    0x830B425454696274LLU, // lya_Tibt_BT
-    0xB70B5A4D4C61746ELLU, // lyn_Latn_ZM
-    0x9F2B434E48616E73LLU, // lzh_Hans_CN
-    0xAF2B56554C61746ELLU, // lzl_Latn_VU
-    0xB72B4D4D4C61746ELLU, // lzn_Latn_MM
-    0xE72B54524C61746ELLU, // lzz_Latn_TR
-    0x800C4D584C61746ELLU, // maa_Latn_MX
-    0x840C4D584C61746ELLU, // mab_Latn_MX
-    0x8C0C49444C61746ELLU, // mad_Latn_ID
-    0x900C4E474C61746ELLU, // mae_Latn_NG
-    0x940C434D4C61746ELLU, // maf_Latn_CM
-    0x980C494E44657661LLU, // mag_Deva_IN
-    0xA00C494E44657661LLU, // mai_Deva_IN
-    0xA40C4D584C61746ELLU, // maj_Latn_MX
-    0xA80C49444C61746ELLU, // mak_Latn_ID
-    0xB00C47544C61746ELLU, // mam_Latn_GT
-    0xB40C474D4C61746ELLU, // man_Latn_GM
-    0xB40C474E4E6B6F6FLLU, // man_Nkoo_GN
-    0xC00C4D584C61746ELLU, // maq_Latn_MX
-    0xC80C4B454C61746ELLU, // mas_Latn_KE
-    0xCC0C4D584C61746ELLU, // mat_Latn_MX
-    0xD00C4D584C61746ELLU, // mau_Latn_MX
-    0xD40C42524C61746ELLU, // mav_Latn_BR
-    0xD80C47484C61746ELLU, // maw_Latn_GH
-    0xDC0C49444C61746ELLU, // max_Latn_ID
-    0xE40C4D584C61746ELLU, // maz_Latn_MX
-    0x802C50484C61746ELLU, // mba_Latn_PH
-    0x842C50484C61746ELLU, // mbb_Latn_PH
-    0x882C42524C61746ELLU, // mbc_Latn_BR
-    0x8C2C50484C61746ELLU, // mbd_Latn_PH
-    0x942C53474C61746ELLU, // mbf_Latn_SG
-    0x9C2C50474C61746ELLU, // mbh_Latn_PG
-    0xA02C50484C61746ELLU, // mbi_Latn_PH
-    0xA42C42524C61746ELLU, // mbj_Latn_BR
-    0xA82C50474C61746ELLU, // mbk_Latn_PG
-    0xAC2C42524C61746ELLU, // mbl_Latn_BR
-    0xB02C43474C61746ELLU, // mbm_Latn_CG
-    0xB42C434F4C61746ELLU, // mbn_Latn_CO
-    0xB82C434D4C61746ELLU, // mbo_Latn_CM
-    0xBC2C434F4C61746ELLU, // mbp_Latn_CO
-    0xC02C50474C61746ELLU, // mbq_Latn_PG
-    0xC42C434F4C61746ELLU, // mbr_Latn_CO
-    0xC82C50484C61746ELLU, // mbs_Latn_PH
-    0xCC2C50484C61746ELLU, // mbt_Latn_PH
-    0xD02C4E474C61746ELLU, // mbu_Latn_NG
-    0xD42C474E4C61746ELLU, // mbv_Latn_GN
-    0xD82C50474C61746ELLU, // mbw_Latn_PG
-    0xDC2C50474C61746ELLU, // mbx_Latn_PG
-    0xE02C504B41726162LLU, // mby_Arab_PK
-    0xE42C4D584C61746ELLU, // mbz_Latn_MX
-    0x804C50594C61746ELLU, // mca_Latn_PY
-    0x844C50454C61746ELLU, // mcb_Latn_PE
-    0x884C50474C61746ELLU, // mcc_Latn_PG
-    0x8C4C50454C61746ELLU, // mcd_Latn_PE
-    0x904C4D584C61746ELLU, // mce_Latn_MX
-    0x944C50454C61746ELLU, // mcf_Latn_PE
-    0x984C56454C61746ELLU, // mcg_Latn_VE
-    0x9C4C56454C61746ELLU, // mch_Latn_VE
-    0xA04C50474C61746ELLU, // mci_Latn_PG
-    0xA44C4E474C61746ELLU, // mcj_Latn_NG
-    0xA84C414F4C61746ELLU, // mck_Latn_AO
-    0xAC4C434F4C61746ELLU, // mcl_Latn_CO
-    0xB04C4D594C61746ELLU, // mcm_Latn_MY
-    0xB44C54444C61746ELLU, // mcn_Latn_TD
-    0xB84C4D584C61746ELLU, // mco_Latn_MX
-    0xBC4C434D4C61746ELLU, // mcp_Latn_CM
-    0xC04C50474C61746ELLU, // mcq_Latn_PG
-    0xC44C50474C61746ELLU, // mcr_Latn_PG
-    0xC84C434D4C61746ELLU, // mcs_Latn_CM
-    0xCC4C434D4C61746ELLU, // mct_Latn_CM
-    0xD04C434D4C61746ELLU, // mcu_Latn_CM
-    0xD44C50474C61746ELLU, // mcv_Latn_PG
-    0xD84C54444C61746ELLU, // mcw_Latn_TD
-    0xDC4C43464C61746ELLU, // mcx_Latn_CF
-    0xE04C50474C61746ELLU, // mcy_Latn_PG
-    0xE44C50474C61746ELLU, // mcz_Latn_PG
-    0x806C4E474C61746ELLU, // mda_Latn_NG
-    0x846C50474C61746ELLU, // mdb_Latn_PG
-    0x886C50474C61746ELLU, // mdc_Latn_PG
-    0x8C6C434D4C61746ELLU, // mdd_Latn_CM
-    0x906C544441726162LLU, // mde_Arab_TD
-    0x946C52554379726CLLU, // mdf_Cyrl_RU
-    0x986C54444C61746ELLU, // mdg_Latn_TD
-    0x9C6C50484C61746ELLU, // mdh_Latn_PH
-    0xA06C43444C61746ELLU, // mdi_Latn_CD
-    0xA46C43444C61746ELLU, // mdj_Latn_CD
-    0xA86C43444C61746ELLU, // mdk_Latn_CD
-    0xB06C43444C61746ELLU, // mdm_Latn_CD
-    0xB46C43464C61746ELLU, // mdn_Latn_CF
-    0xBC6C43444C61746ELLU, // mdp_Latn_CD
-    0xC06C43444C61746ELLU, // mdq_Latn_CD
-    0xC46C49444C61746ELLU, // mdr_Latn_ID
-    0xC86C50474C61746ELLU, // mds_Latn_PG
-    0xCC6C43474C61746ELLU, // mdt_Latn_CG
-    0xD06C43474C61746ELLU, // mdu_Latn_CG
-    0xD46C4D584C61746ELLU, // mdv_Latn_MX
-    0xD86C43474C61746ELLU, // mdw_Latn_CG
-    0xDC6C455445746869LLU, // mdx_Ethi_ET
-    0xE06C455445746869LLU, // mdy_Ethi_ET
-    0xE46C42524C61746ELLU, // mdz_Latn_BR
-    0x808C434D4C61746ELLU, // mea_Latn_CM
-    0x848C50474C61746ELLU, // meb_Latn_PG
-    0x888C41554C61746ELLU, // mec_Latn_AU
-    0x8C8C50474C61746ELLU, // med_Latn_PG
-    0x908C50474C61746ELLU, // mee_Latn_PG
-    0x9C8C4D584C61746ELLU, // meh_Latn_MX
-    0xA48C49444C61746ELLU, // mej_Latn_ID
-    0xA88C50474C61746ELLU, // mek_Latn_PG
-    0xAC8C4D594C61746ELLU, // mel_Latn_MY
-    0xB08C41554C61746ELLU, // mem_Latn_AU
-    0xB48C534C4C61746ELLU, // men_Latn_SL
-    0xB88C4D594C61746ELLU, // meo_Latn_MY
-    0xBC8C41554C61746ELLU, // mep_Latn_AU
-    0xC08C434D4C61746ELLU, // meq_Latn_CM
-    0xC48C4B454C61746ELLU, // mer_Latn_KE
-    0xC88C54444C61746ELLU, // mes_Latn_TD
-    0xCC8C50474C61746ELLU, // met_Latn_PG
-    0xD08C50474C61746ELLU, // meu_Latn_PG
-    0xD48C4C524C61746ELLU, // mev_Latn_LR
-    0xD88C4E474C61746ELLU, // mew_Latn_NG
-    0xE08C534E4C61746ELLU, // mey_Latn_SN
-    0xE48C55534C61746ELLU, // mez_Latn_US
-    0x80AC544841726162LLU, // mfa_Arab_TH
-    0x84AC49444C61746ELLU, // mfb_Latn_ID
-    0x88AC43444C61746ELLU, // mfc_Latn_CD
-    0x8CAC434D4C61746ELLU, // mfd_Latn_CM
-    0x90AC4D554C61746ELLU, // mfe_Latn_MU
-    0x94AC434D4C61746ELLU, // mff_Latn_CM
-    0x98AC474E4C61746ELLU, // mfg_Latn_GN
-    0x9CAC434D4C61746ELLU, // mfh_Latn_CM
-    0xA0AC434D41726162LLU, // mfi_Arab_CM
-    0xA4AC434D4C61746ELLU, // mfj_Latn_CM
-    0xA8AC434D4C61746ELLU, // mfk_Latn_CM
-    0xACAC4E474C61746ELLU, // mfl_Latn_NG
-    0xB0AC4E474C61746ELLU, // mfm_Latn_NG
-    0xB4AC4E474C61746ELLU, // mfn_Latn_NG
-    0xB8AC4E474C61746ELLU, // mfo_Latn_NG
-    0xBCAC49444C61746ELLU, // mfp_Latn_ID
-    0xC0AC54474C61746ELLU, // mfq_Latn_TG
-    0xC4AC41554C61746ELLU, // mfr_Latn_AU
-    0xCCAC50474C61746ELLU, // mft_Latn_PG
-    0xD0AC414F4C61746ELLU, // mfu_Latn_AO
-    0xD4AC534E4C61746ELLU, // mfv_Latn_SN
-    0xD8AC50474C61746ELLU, // mfw_Latn_PG
-    0xDCAC45544C61746ELLU, // mfx_Latn_ET
-    0xE0AC4D584C61746ELLU, // mfy_Latn_MX
-    0xE4AC53534C61746ELLU, // mfz_Latn_SS
-    0x6D674D474C61746ELLU, // mg_Latn_MG
-    0x80CC49454C617467LLU, // mga_Latg_IE
-    0x84CC54444C61746ELLU, // mgb_Latn_TD
-    0x88CC53534C61746ELLU, // mgc_Latn_SS
-    0x8CCC53534C61746ELLU, // mgd_Latn_SS
-    0x90CC54444C61746ELLU, // mge_Latn_TD
-    0x94CC49444C61746ELLU, // mgf_Latn_ID
-    0x98CC434D4C61746ELLU, // mgg_Latn_CM
-    0x9CCC4D5A4C61746ELLU, // mgh_Latn_MZ
-    0xA0CC4E474C61746ELLU, // mgi_Latn_NG
-    0xA4CC4E474C61746ELLU, // mgj_Latn_NG
-    0xA8CC49444C61746ELLU, // mgk_Latn_ID
-    0xACCC50474C61746ELLU, // mgl_Latn_PG
-    0xB0CC544C4C61746ELLU, // mgm_Latn_TL
-    0xB4CC43464C61746ELLU, // mgn_Latn_CF
-    0xB8CC434D4C61746ELLU, // mgo_Latn_CM
-    0xBCCC4E5044657661LLU, // mgp_Deva_NP
-    0xC0CC545A4C61746ELLU, // mgq_Latn_TZ
-    0xC4CC5A4D4C61746ELLU, // mgr_Latn_ZM
-    0xC8CC545A4C61746ELLU, // mgs_Latn_TZ
-    0xCCCC50474C61746ELLU, // mgt_Latn_PG
-    0xD0CC50474C61746ELLU, // mgu_Latn_PG
-    0xD4CC545A4C61746ELLU, // mgv_Latn_TZ
-    0xD8CC545A4C61746ELLU, // mgw_Latn_TZ
-    0xE0CC545A4C61746ELLU, // mgy_Latn_TZ
-    0xE4CC545A4C61746ELLU, // mgz_Latn_TZ
-    0x6D684D484C61746ELLU, // mh_Latn_MH
-    0x84EC47414C61746ELLU, // mhb_Latn_GA
-    0x88EC4D584C61746ELLU, // mhc_Latn_MX
-    0x8CEC545A4C61746ELLU, // mhd_Latn_TZ
-    0x90EC4D594C61746ELLU, // mhe_Latn_MY
-    0x94EC50474C61746ELLU, // mhf_Latn_PG
-    0x98EC41554C61746ELLU, // mhg_Latn_AU
-    0xA0EC55474C61746ELLU, // mhi_Latn_UG
-    0xA4EC414641726162LLU, // mhj_Arab_AF
-    0xA8EC434D4C61746ELLU, // mhk_Latn_CM
-    0xACEC50474C61746ELLU, // mhl_Latn_PG
-    0xB0EC4D5A4C61746ELLU, // mhm_Latn_MZ
-    0xB4EC49544C61746ELLU, // mhn_Latn_IT
-    0xB8EC5A4D4C61746ELLU, // mho_Latn_ZM
-    0xBCEC49444C61746ELLU, // mhp_Latn_ID
-    0xC0EC55534C61746ELLU, // mhq_Latn_US
-    0xC8EC49444C61746ELLU, // mhs_Latn_ID
-    0xCCEC56454C61746ELLU, // mht_Latn_VE
-    0xD0EC494E4C61746ELLU, // mhu_Latn_IN
-    0xD8EC42574C61746ELLU, // mhw_Latn_BW
-    0xDCEC4D4D4C61746ELLU, // mhx_Latn_MM
-    0xE0EC49444C61746ELLU, // mhy_Latn_ID
-    0xE4EC49444C61746ELLU, // mhz_Latn_ID
-    0x6D694E5A4C61746ELLU, // mi_Latn_NZ
-    0x810C55534C61746ELLU, // mia_Latn_US
-    0x850C4D584C61746ELLU, // mib_Latn_MX
-    0x890C43414C61746ELLU, // mic_Latn_CA
-    0x8D0C49514D616E64LLU, // mid_Mand_IQ
-    0x910C4D584C61746ELLU, // mie_Latn_MX
-    0x950C434D4C61746ELLU, // mif_Latn_CM
-    0x990C4D584C61746ELLU, // mig_Latn_MX
-    0x9D0C4D584C61746ELLU, // mih_Latn_MX
-    0xA10C4D584C61746ELLU, // mii_Latn_MX
-    0xA50C434D4C61746ELLU, // mij_Latn_CM
-    0xA90C55534C61746ELLU, // mik_Latn_US
-    0xAD0C4D584C61746ELLU, // mil_Latn_MX
-    0xB10C4D584C61746ELLU, // mim_Latn_MX
-    0xB50C49444C61746ELLU, // min_Latn_ID
-    0xB90C4D584C61746ELLU, // mio_Latn_MX
-    0xBD0C4D584C61746ELLU, // mip_Latn_MX
-    0xC10C4E494C61746ELLU, // miq_Latn_NI
-    0xC50C4D584C61746ELLU, // mir_Latn_MX
-    0xCD0C4D584C61746ELLU, // mit_Latn_MX
-    0xD10C4D584C61746ELLU, // miu_Latn_MX
-    0xD90C50474C61746ELLU, // miw_Latn_PG
-    0xDD0C4D584C61746ELLU, // mix_Latn_MX
-    0xE10C4D584C61746ELLU, // miy_Latn_MX
-    0xE50C4D584C61746ELLU, // miz_Latn_MX
-    0x852C544C4C61746ELLU, // mjb_Latn_TL
-    0x892C4D584C61746ELLU, // mjc_Latn_MX
-    0x8D2C55534C61746ELLU, // mjd_Latn_US
-    0x912C54444C61746ELLU, // mje_Latn_TD
-    0x992C434E4C61746ELLU, // mjg_Latn_CN
-    0x9D2C545A4C61746ELLU, // mjh_Latn_TZ
-    0xA12C434E4C61746ELLU, // mji_Latn_CN
-    0xA52C50474C61746ELLU, // mjj_Latn_PG
-    0xA92C50474C61746ELLU, // mjk_Latn_PG
-    0xAD2C494E44657661LLU, // mjl_Deva_IN
-    0xB12C50474C61746ELLU, // mjm_Latn_PG
-    0xB52C50474C61746ELLU, // mjn_Latn_PG
-    0xC12C494E4D6C796DLLU, // mjq_Mlym_IN
-    0xC52C494E4D6C796DLLU, // mjr_Mlym_IN
-    0xC92C4E474C61746ELLU, // mjs_Latn_NG
-    0xCD2C494E44657661LLU, // mjt_Deva_IN
-    0xD12C494E54656C75LLU, // mju_Telu_IN
-    0xD52C494E4D6C796DLLU, // mjv_Mlym_IN
-    0xD92C494E4C61746ELLU, // mjw_Latn_IN
-    0xDD2C42444C61746ELLU, // mjx_Latn_BD
-    0xE12C55534C61746ELLU, // mjy_Latn_US
-    0xE52C4E5044657661LLU, // mjz_Deva_NP
-    0x6D6B4D4B4379726CLLU, // mk_Cyrl_MK
-    0x814C43494C61746ELLU, // mka_Latn_CI
-    0x854C494E44657661LLU, // mkb_Deva_IN
-    0x894C50474C61746ELLU, // mkc_Latn_PG
-    0x914C494E44657661LLU, // mke_Deva_IN
-    0x954C4E474C61746ELLU, // mkf_Latn_NG
-    0xA14C504B41726162LLU, // mki_Arab_PK
-    0xA54C464D4C61746ELLU, // mkj_Latn_FM
-    0xA94C434D4C61746ELLU, // mkk_Latn_CM
-    0xAD4C424A4C61746ELLU, // mkl_Latn_BJ
-    0xB14C544854686169LLU, // mkm_Thai_TH
-    0xB54C49444C61746ELLU, // mkn_Latn_ID
-    0xB94C4E474C61746ELLU, // mko_Latn_NG
-    0xBD4C50474C61746ELLU, // mkp_Latn_PG
-    0xC54C50474C61746ELLU, // mkr_Latn_PG
-    0xC94C4D584C61746ELLU, // mks_Latn_MX
-    0xCD4C4E434C61746ELLU, // mkt_Latn_NC
-    0xD14C474E4C61746ELLU, // mku_Latn_GN
-    0xD54C56554C61746ELLU, // mkv_Latn_VU
-    0xD94C43474C61746ELLU, // mkw_Latn_CG
-    0xDD4C50484C61746ELLU, // mkx_Latn_PH
-    0xE14C49444C61746ELLU, // mky_Latn_ID
-    0xE54C544C4C61746ELLU, // mkz_Latn_TL
-    0x6D6C494E4D6C796DLLU, // ml_Mlym_IN
-    0x816C56554C61746ELLU, // mla_Latn_VU
-    0x856C434D4C61746ELLU, // mlb_Latn_CM
-    0x896C564E4C61746ELLU, // mlc_Latn_VN
-    0x916C50474C61746ELLU, // mle_Latn_PG
-    0x956C4C4154686169LLU, // mlf_Thai_LA
-    0x9D6C50474C61746ELLU, // mlh_Latn_PG
-    0xA16C49444C61746ELLU, // mli_Latn_ID
-    0xA56C54444C61746ELLU, // mlj_Latn_TD
-    0xA96C4B454C61746ELLU, // mlk_Latn_KE
-    0xAD6C56554C61746ELLU, // mll_Latn_VU
-    0xB56C53424C61746ELLU, // mln_Latn_SB
-    0xB96C534E4C61746ELLU, // mlo_Latn_SN
-    0xBD6C50474C61746ELLU, // mlp_Latn_PG
-    0xC16C534E4C61746ELLU, // mlq_Latn_SN
-    0xC56C434D4C61746ELLU, // mlr_Latn_CM
-    0xC96C53444C61746ELLU, // mls_Latn_SD
-    0xD16C53424C61746ELLU, // mlu_Latn_SB
-    0xD56C56554C61746ELLU, // mlv_Latn_VU
-    0xD96C434D4C61746ELLU, // mlw_Latn_CM
-    0xDD6C56554C61746ELLU, // mlx_Latn_VU
-    0xE56C50484C61746ELLU, // mlz_Latn_PH
-    0x818C4E474C61746ELLU, // mma_Latn_NG
-    0x858C49444C61746ELLU, // mmb_Latn_ID
-    0x898C4D584C61746ELLU, // mmc_Latn_MX
-    0x8D8C434E4C61746ELLU, // mmd_Latn_CN
-    0x918C56554C61746ELLU, // mme_Latn_VU
-    0x958C4E474C61746ELLU, // mmf_Latn_NG
-    0x998C56554C61746ELLU, // mmg_Latn_VU
-    0x9D8C42524C61746ELLU, // mmh_Latn_BR
-    0xA18C50474C61746ELLU, // mmi_Latn_PG
-    0xB18C56554C61746ELLU, // mmm_Latn_VU
-    0xB58C50484C61746ELLU, // mmn_Latn_PH
-    0xB98C50474C61746ELLU, // mmo_Latn_PG
-    0xBD8C50474C61746ELLU, // mmp_Latn_PG
-    0xC18C50474C61746ELLU, // mmq_Latn_PG
-    0xC58C434E4C61746ELLU, // mmr_Latn_CN
-    0xCD8C50474C61746ELLU, // mmt_Latn_PG
-    0xD18C434D4C61746ELLU, // mmu_Latn_CM
-    0xD58C42524C61746ELLU, // mmv_Latn_BR
-    0xD98C56554C61746ELLU, // mmw_Latn_VU
-    0xDD8C50474C61746ELLU, // mmx_Latn_PG
-    0xE18C54444C61746ELLU, // mmy_Latn_TD
-    0xE58C43444C61746ELLU, // mmz_Latn_CD
-    0x6D6E4D4E4379726CLLU, // mn_Cyrl_MN
-    0x6D6E434E4D6F6E67LLU, // mn_Mong_CN
-    0x81AC50474C61746ELLU, // mna_Latn_PG
-    0x85AC49444C61746ELLU, // mnb_Latn_ID
-    0x89AC434E4D6F6E67LLU, // mnc_Mong_CN
-    0x8DAC42524C61746ELLU, // mnd_Latn_BR
-    0x91AC54444C61746ELLU, // mne_Latn_TD
-    0x95AC434D4C61746ELLU, // mnf_Latn_CM
-    0x99AC564E4C61746ELLU, // mng_Latn_VN
-    0x9DAC43444C61746ELLU, // mnh_Latn_CD
-    0xA1AC494E42656E67LLU, // mni_Beng_IN
-    0xA5AC414641726162LLU, // mnj_Arab_AF
-    0xADAC56554C61746ELLU, // mnl_Latn_VU
-    0xB1AC50474C61746ELLU, // mnm_Latn_PG
-    0xB5AC564E4C61746ELLU, // mnn_Latn_VN
-    0xBDAC434E4C61746ELLU, // mnp_Latn_CN
-    0xC1AC4D594C61746ELLU, // mnq_Latn_MY
-    0xC5AC55534C61746ELLU, // mnr_Latn_US
-    0xC9AC52554379726CLLU, // mns_Cyrl_RU
-    0xD1AC49444C61746ELLU, // mnu_Latn_ID
-    0xD5AC53424C61746ELLU, // mnv_Latn_SB
-    0xD9AC4D4D4D796D72LLU, // mnw_Mymr_MM
-    0xDDAC49444C61746ELLU, // mnx_Latn_ID
-    0xE1AC4D5A4C61746ELLU, // mny_Latn_MZ
-    0xE5AC49444C61746ELLU, // mnz_Latn_ID
-    0x6D6F524F4C61746ELLU, // mo_Latn_RO
-    0x81CC43494C61746ELLU, // moa_Latn_CI
-    0x89CC41524C61746ELLU, // moc_Latn_AR
-    0x8DCC55534C61746ELLU, // mod_Latn_US
-    0x91CC43414C61746ELLU, // moe_Latn_CA
-    0x99CC49444C61746ELLU, // mog_Latn_ID
-    0x9DCC43414C61746ELLU, // moh_Latn_CA
-    0xA1CC4E474C61746ELLU, // moi_Latn_NG
-    0xA5CC43474C61746ELLU, // moj_Latn_CG
-    0xA9CC49444C61746ELLU, // mok_Latn_ID
-    0xB1CC4E494C61746ELLU, // mom_Latn_NI
-    0xB9CC564E4C61746ELLU, // moo_Latn_VN
-    0xBDCC425A4C61746ELLU, // mop_Latn_BZ
-    0xC1CC49444C61746ELLU, // moq_Latn_ID
-    0xC5CC53444C61746ELLU, // mor_Latn_SD
-    0xC9CC42464C61746ELLU, // mos_Latn_BF
-    0xCDCC434F4C61746ELLU, // mot_Latn_CO
-    0xD1CC54444C61746ELLU, // mou_Latn_TD
-    0xD5CC55534C61746ELLU, // mov_Latn_US
-    0xD9CC43474C61746ELLU, // mow_Latn_CG
-    0xDDCC50474C61746ELLU, // mox_Latn_PG
-    0xE1CC45544C61746ELLU, // moy_Latn_ET
-    0xE5CC54444C61746ELLU, // moz_Latn_TD
-    0x81EC545A4C61746ELLU, // mpa_Latn_TZ
-    0x85EC41554C61746ELLU, // mpb_Latn_AU
-    0x89EC41554C61746ELLU, // mpc_Latn_AU
-    0x8DEC42524C61746ELLU, // mpd_Latn_BR
-    0x91EC45544C61746ELLU, // mpe_Latn_ET
-    0x99EC54444C61746ELLU, // mpg_Latn_TD
-    0x9DEC41554C61746ELLU, // mph_Latn_AU
-    0xA1EC434D4C61746ELLU, // mpi_Latn_CM
-    0xA5EC41554C61746ELLU, // mpj_Latn_AU
-    0xA9EC54444C61746ELLU, // mpk_Latn_TD
-    0xADEC50474C61746ELLU, // mpl_Latn_PG
-    0xB1EC4D584C61746ELLU, // mpm_Latn_MX
-    0xB5EC50474C61746ELLU, // mpn_Latn_PG
-    0xB9EC50474C61746ELLU, // mpo_Latn_PG
-    0xBDEC50474C61746ELLU, // mpp_Latn_PG
-    0xC1EC42524C61746ELLU, // mpq_Latn_BR
-    0xC5EC53424C61746ELLU, // mpr_Latn_SB
-    0xC9EC50474C61746ELLU, // mps_Latn_PG
-    0xCDEC50474C61746ELLU, // mpt_Latn_PG
-    0xD1EC42524C61746ELLU, // mpu_Latn_BR
-    0xD5EC50474C61746ELLU, // mpv_Latn_PG
-    0xD9EC42524C61746ELLU, // mpw_Latn_BR
-    0xDDEC50474C61746ELLU, // mpx_Latn_PG
-    0xE1EC49444C61746ELLU, // mpy_Latn_ID
-    0xE5EC544854686169LLU, // mpz_Thai_TH
-    0x820C49444C61746ELLU, // mqa_Latn_ID
-    0x860C434D4C61746ELLU, // mqb_Latn_CM
-    0x8A0C49444C61746ELLU, // mqc_Latn_ID
-    0x920C50474C61746ELLU, // mqe_Latn_PG
-    0x960C49444C61746ELLU, // mqf_Latn_ID
-    0x9A0C49444C61746ELLU, // mqg_Latn_ID
-    0x9E0C4D584C61746ELLU, // mqh_Latn_MX
-    0xA20C49444C61746ELLU, // mqi_Latn_ID
-    0xA60C49444C61746ELLU, // mqj_Latn_ID
-    0xAA0C50484C61746ELLU, // mqk_Latn_PH
-    0xAE0C424A4C61746ELLU, // mql_Latn_BJ
-    0xB20C50464C61746ELLU, // mqm_Latn_PF
-    0xB60C49444C61746ELLU, // mqn_Latn_ID
-    0xBA0C49444C61746ELLU, // mqo_Latn_ID
-    0xBE0C49444C61746ELLU, // mqp_Latn_ID
-    0xC20C4D594C61746ELLU, // mqq_Latn_MY
-    0xC60C49444C61746ELLU, // mqr_Latn_ID
-    0xCA0C49444C61746ELLU, // mqs_Latn_ID
-    0xD20C53534C61746ELLU, // mqu_Latn_SS
-    0xD60C50474C61746ELLU, // mqv_Latn_PG
-    0xDA0C50474C61746ELLU, // mqw_Latn_PG
-    0xDE0C49444C61746ELLU, // mqx_Latn_ID
-    0xE20C49444C61746ELLU, // mqy_Latn_ID
-    0xE60C50474C61746ELLU, // mqz_Latn_PG
-    0x6D72494E44657661LLU, // mr_Deva_IN
-    0x822C544854686169LLU, // mra_Thai_TH
-    0x862C56554C61746ELLU, // mrb_Latn_VU
-    0x8A2C55534C61746ELLU, // mrc_Latn_US
-    0x8E2C4E5044657661LLU, // mrd_Deva_NP
-    0x962C49444C61746ELLU, // mrf_Latn_ID
-    0x9A2C494E4C61746ELLU, // mrg_Latn_IN
-    0x9E2C494E4C61746ELLU, // mrh_Latn_IN
-    0xA62C52554379726CLLU, // mrj_Cyrl_RU
-    0xAA2C4E434C61746ELLU, // mrk_Latn_NC
-    0xAE2C464D4C61746ELLU, // mrl_Latn_FM
-    0xB22C56554C61746ELLU, // mrm_Latn_VU
-    0xB62C53424C61746ELLU, // mrn_Latn_SB
-    0xBA2C42444D726F6FLLU, // mro_Mroo_BD
-    0xBE2C56554C61746ELLU, // mrp_Latn_VU
-    0xC22C50464C61746ELLU, // mrq_Latn_PF
-    0xC62C494E44657661LLU, // mrr_Deva_IN
-    0xCA2C56554C61746ELLU, // mrs_Latn_VU
-    0xCE2C4E474C61746ELLU, // mrt_Latn_NG
-    0xD22C434D4C61746ELLU, // mru_Latn_CM
-    0xD62C50464C61746ELLU, // mrv_Latn_PF
-    0xDA2C50484C61746ELLU, // mrw_Latn_PH
-    0xDE2C49444C61746ELLU, // mrx_Latn_ID
-    0xE22C50484C61746ELLU, // mry_Latn_PH
-    0xE62C49444C61746ELLU, // mrz_Latn_ID
-    0x6D734D594C61746ELLU, // ms_Latn_MY
-    0x864C50484C61746ELLU, // msb_Latn_PH
-    0x8A4C474E4C61746ELLU, // msc_Latn_GN
-    0x924C54444C61746ELLU, // mse_Latn_TD
-    0x964C49444C61746ELLU, // msf_Latn_ID
-    0x9A4C49444C61746ELLU, // msg_Latn_ID
-    0x9E4C4D474C61746ELLU, // msh_Latn_MG
-    0xA24C4D594C61746ELLU, // msi_Latn_MY
-    0xA64C43444C61746ELLU, // msj_Latn_CD
-    0xAA4C50484C61746ELLU, // msk_Latn_PH
-    0xAE4C49444C61746ELLU, // msl_Latn_ID
-    0xB24C50484C61746ELLU, // msm_Latn_PH
-    0xB64C56554C61746ELLU, // msn_Latn_VU
-    0xBA4C49444C61746ELLU, // mso_Latn_ID
-    0xBE4C42524C61746ELLU, // msp_Latn_BR
-    0xC24C4E434C61746ELLU, // msq_Latn_NC
-    0xCA4C49444C61746ELLU, // mss_Latn_ID
-    0xD24C50474C61746ELLU, // msu_Latn_PG
-    0xD64C434D4C61746ELLU, // msv_Latn_CM
-    0xDA4C47574C61746ELLU, // msw_Latn_GW
-    0xDE4C50474C61746ELLU, // msx_Latn_PG
-    0xE24C50474C61746ELLU, // msy_Latn_PG
-    0xE64C50474C61746ELLU, // msz_Latn_PG
-    0x6D744D544C61746ELLU, // mt_Latn_MT
-    0x826C50484C61746ELLU, // mta_Latn_PH
-    0x866C43494C61746ELLU, // mtb_Latn_CI
-    0x8A6C50474C61746ELLU, // mtc_Latn_PG
-    0x8E6C49444C61746ELLU, // mtd_Latn_ID
-    0x926C53424C61746ELLU, // mte_Latn_SB
-    0x966C50474C61746ELLU, // mtf_Latn_PG
-    0x9A6C49444C61746ELLU, // mtg_Latn_ID
-    0x9E6C49444C61746ELLU, // mth_Latn_ID
-    0xA26C50474C61746ELLU, // mti_Latn_PG
-    0xA66C49444C61746ELLU, // mtj_Latn_ID
-    0xAA6C434D4C61746ELLU, // mtk_Latn_CM
-    0xAE6C4E474C61746ELLU, // mtl_Latn_NG
-    0xB26C52554379726CLLU, // mtm_Cyrl_RU
-    0xB66C4E494C61746ELLU, // mtn_Latn_NI
-    0xBA6C4D584C61746ELLU, // mto_Latn_MX
-    0xBE6C424F4C61746ELLU, // mtp_Latn_BO
-    0xC26C564E4C61746ELLU, // mtq_Latn_VN
-    0xC66C494E44657661LLU, // mtr_Deva_IN
-    0xCA6C50454C61746ELLU, // mts_Latn_PE
-    0xCE6C56554C61746ELLU, // mtt_Latn_VU
-    0xD26C4D584C61746ELLU, // mtu_Latn_MX
-    0xD66C50474C61746ELLU, // mtv_Latn_PG
-    0xDA6C50484C61746ELLU, // mtw_Latn_PH
-    0xDE6C4D584C61746ELLU, // mtx_Latn_MX
-    0xE26C50474C61746ELLU, // mty_Latn_PG
-    0x828C434D4C61746ELLU, // mua_Latn_CM
-    0x868C54444C61746ELLU, // mub_Latn_TD
-    0x8A8C434D4C61746ELLU, // muc_Latn_CM
-    0x8E8C52554379726CLLU, // mud_Cyrl_RU
-    0x928C45434C61746ELLU, // mue_Latn_EC
-    0x9A8C434D4C61746ELLU, // mug_Latn_CM
-    0x9E8C53534C61746ELLU, // muh_Latn_SS
-    0xA28C49444C61746ELLU, // mui_Latn_ID
-    0xA68C54444C61746ELLU, // muj_Latn_TD
-    0xAA8C4E5054696274LLU, // muk_Tibt_NP
-    0xB28C50474C61746ELLU, // mum_Latn_PG
-    0xBA8C434D4C61746ELLU, // muo_Latn_CM
-    0xC28C434E4C61746ELLU, // muq_Latn_CN
-    0xC68C53534C61746ELLU, // mur_Latn_SS
-    0xCA8C55534C61746ELLU, // mus_Latn_US
-    0xCE8C494E44657661LLU, // mut_Deva_IN
-    0xD28C4B454C61746ELLU, // muu_Latn_KE
-    0xD68C494E54616D6CLLU, // muv_Taml_IN
-    0xDE8C50474C61746ELLU, // mux_Latn_PG
-    0xE28C434D4C61746ELLU, // muy_Latn_CM
-    0xE68C455445746869LLU, // muz_Ethi_ET
-    0x82AC50474C61746ELLU, // mva_Latn_PG
-    0x8EAC49444C61746ELLU, // mvd_Latn_ID
-    0x92AC504B41726162LLU, // mve_Arab_PK
-    0x96AC434E4D6F6E67LLU, // mvf_Mong_CN
-    0x9AAC4D584C61746ELLU, // mvg_Latn_MX
-    0x9EAC54444C61746ELLU, // mvh_Latn_TD
-    0xAAAC50474C61746ELLU, // mvk_Latn_PG
-    0xAEAC41554C61746ELLU, // mvl_Latn_AU
-    0xB6AC50474C61746ELLU, // mvn_Latn_PG
-    0xBAAC53424C61746ELLU, // mvo_Latn_SB
-    0xBEAC49444C61746ELLU, // mvp_Latn_ID
-    0xC2AC50474C61746ELLU, // mvq_Latn_PG
-    0xC6AC49444C61746ELLU, // mvr_Latn_ID
-    0xCAAC49444C61746ELLU, // mvs_Latn_ID
-    0xCEAC56554C61746ELLU, // mvt_Latn_VU
-    0xD2AC54444C61746ELLU, // mvu_Latn_TD
-    0xD6AC4D594C61746ELLU, // mvv_Latn_MY
-    0xDAAC545A4C61746ELLU, // mvw_Latn_TZ
-    0xDEAC49444C61746ELLU, // mvx_Latn_ID
-    0xE2AC504B41726162LLU, // mvy_Arab_PK
-    0xE6AC455445746869LLU, // mvz_Ethi_ET
-    0x82CC50474C61746ELLU, // mwa_Latn_PG
-    0x86CC50474C61746ELLU, // mwb_Latn_PG
-    0x8ACC50474C61746ELLU, // mwc_Latn_PG
-    0x92CC545A4C61746ELLU, // mwe_Latn_TZ
-    0x96CC41554C61746ELLU, // mwf_Latn_AU
-    0x9ACC50474C61746ELLU, // mwg_Latn_PG
-    0x9ECC50474C61746ELLU, // mwh_Latn_PG
-    0xA2CC56554C61746ELLU, // mwi_Latn_VU
-    0xAACC4D4C4C61746ELLU, // mwk_Latn_ML
-    0xAECC50544C61746ELLU, // mwl_Latn_PT
-    0xB2CC54444C61746ELLU, // mwm_Latn_TD
-    0xB6CC5A4D4C61746ELLU, // mwn_Latn_ZM
-    0xBACC56554C61746ELLU, // mwo_Latn_VU
-    0xBECC41554C61746ELLU, // mwp_Latn_AU
-    0xC2CC4D4D4C61746ELLU, // mwq_Latn_MM
-    0xC6CC494E44657661LLU, // mwr_Deva_IN
-    0xCACC4B454C61746ELLU, // mws_Latn_KE
-    0xCECC4D4D4D796D72LLU, // mwt_Mymr_MM
-    0xD2CC53534C61746ELLU, // mwu_Latn_SS
-    0xD6CC49444C61746ELLU, // mwv_Latn_ID
-    0xDACC5553486D6E70LLU, // mww_Hmnp_US
-    0xE6CC43444C61746ELLU, // mwz_Latn_CD
-    0x82EC4D584C61746ELLU, // mxa_Latn_MX
-    0x86EC4D584C61746ELLU, // mxb_Latn_MX
-    0x8AEC5A574C61746ELLU, // mxc_Latn_ZW
-    0x8EEC49444C61746ELLU, // mxd_Latn_ID
-    0x92EC56554C61746ELLU, // mxe_Latn_VU
-    0x96EC434D4C61746ELLU, // mxf_Latn_CM
-    0x9AEC414F4C61746ELLU, // mxg_Latn_AO
-    0x9EEC43444C61746ELLU, // mxh_Latn_CD
-    0xA2EC45534C61746ELLU, // mxi_Latn_ES
-    0xA6EC494E4C61746ELLU, // mxj_Latn_IN
-    0xAAEC50474C61746ELLU, // mxk_Latn_PG
-    0xAEEC424A4C61746ELLU, // mxl_Latn_BJ
-    0xB2EC50474C61746ELLU, // mxm_Latn_PG
-    0xB6EC49444C61746ELLU, // mxn_Latn_ID
-    0xBAEC5A4D4C61746ELLU, // mxo_Latn_ZM
-    0xBEEC4D584C61746ELLU, // mxp_Latn_MX
-    0xC2EC4D584C61746ELLU, // mxq_Latn_MX
-    0xC6EC4D594C61746ELLU, // mxr_Latn_MY
-    0xCAEC4D584C61746ELLU, // mxs_Latn_MX
-    0xCEEC4D584C61746ELLU, // mxt_Latn_MX
-    0xD2EC434D4C61746ELLU, // mxu_Latn_CM
-    0xD6EC4D584C61746ELLU, // mxv_Latn_MX
-    0xDAEC50474C61746ELLU, // mxw_Latn_PG
-    0xDEEC43494C61746ELLU, // mxx_Latn_CI
-    0xE2EC4D584C61746ELLU, // mxy_Latn_MX
-    0xE6EC49444C61746ELLU, // mxz_Latn_ID
-    0x6D794D4D4D796D72LLU, // my_Mymr_MM
-    0x870C54444C61746ELLU, // myb_Latn_TD
-    0x8B0C43444C61746ELLU, // myc_Latn_CD
-    0x930C47414C61746ELLU, // mye_Latn_GA
-    0x970C45544C61746ELLU, // myf_Latn_ET
-    0x9B0C434D4C61746ELLU, // myg_Latn_CM
-    0x9F0C55534C61746ELLU, // myh_Latn_US
-    0xA70C53534C61746ELLU, // myj_Latn_SS
-    0xAB0C4D4C4C61746ELLU, // myk_Latn_ML
-    0xAF0C49444C61746ELLU, // myl_Latn_ID
-    0xB30C455445746869LLU, // mym_Ethi_ET
-    0xBF0C42524C61746ELLU, // myp_Latn_BR
-    0xC70C50454C61746ELLU, // myr_Latn_PE
-    0xD30C42524C61746ELLU, // myu_Latn_BR
-    0xD70C52554379726CLLU, // myv_Cyrl_RU
-    0xDB0C50474C61746ELLU, // myw_Latn_PG
-    0xDF0C55474C61746ELLU, // myx_Latn_UG
-    0xE30C434F4C61746ELLU, // myy_Latn_CO
-    0xE70C49524D616E64LLU, // myz_Mand_IR
-    0x832C4D584C61746ELLU, // mza_Latn_MX
-    0x8F2C434D4C61746ELLU, // mzd_Latn_CM
-    0x932C50474C61746ELLU, // mze_Latn_PG
-    0x9F2C41524C61746ELLU, // mzh_Latn_AR
-    0xA32C4D584C61746ELLU, // mzi_Latn_MX
-    0xA72C4C524C61746ELLU, // mzj_Latn_LR
-    0xAB2C4E474C61746ELLU, // mzk_Latn_NG
-    0xAF2C4D584C61746ELLU, // mzl_Latn_MX
-    0xB32C4E474C61746ELLU, // mzm_Latn_NG
-    0xB72C495241726162LLU, // mzn_Arab_IR
-    0xBB2C42524C61746ELLU, // mzo_Latn_BR
-    0xBF2C424F4C61746ELLU, // mzp_Latn_BO
-    0xC32C49444C61746ELLU, // mzq_Latn_ID
-    0xC72C42524C61746ELLU, // mzr_Latn_BR
-    0xCF2C4D594C61746ELLU, // mzt_Latn_MY
-    0xD32C50474C61746ELLU, // mzu_Latn_PG
-    0xD72C43464C61746ELLU, // mzv_Latn_CF
-    0xDB2C47484C61746ELLU, // mzw_Latn_GH
-    0xDF2C47594C61746ELLU, // mzx_Latn_GY
-    0xE72C50474C61746ELLU, // mzz_Latn_PG
-    0x6E614E524C61746ELLU, // na_Latn_NR
-    0x800D49444C61746ELLU, // naa_Latn_ID
-    0x840D42524C61746ELLU, // nab_Latn_BR
-    0x880D50474C61746ELLU, // nac_Latn_PG
-    0x900D49444C61746ELLU, // nae_Latn_ID
-    0x940D50474C61746ELLU, // naf_Latn_PG
-    0x980D494E4C61746ELLU, // nag_Latn_IN
-    0xA40D474E4C61746ELLU, // naj_Latn_GN
-    0xA80D50474C61746ELLU, // nak_Latn_PG
-    0xAC0D50474C61746ELLU, // nal_Latn_PG
-    0xB00D41554C61746ELLU, // nam_Latn_AU
-    0xB40D434E48616E73LLU, // nan_Hans_CN
-    0xB80D4E5044657661LLU, // nao_Deva_NP
-    0xBC0D49544C61746ELLU, // nap_Latn_IT
-    0xC00D4E414C61746ELLU, // naq_Latn_NA
-    0xC40D4E474C61746ELLU, // nar_Latn_NG
-    0xC80D50474C61746ELLU, // nas_Latn_PG
-    0xCC0D4E474C61746ELLU, // nat_Latn_NG
-    0xD80D47484C61746ELLU, // naw_Latn_GH
-    0xDC0D50474C61746ELLU, // nax_Latn_PG
-    0xE00D41554C61746ELLU, // nay_Latn_AU
-    0xE40D4D584C61746ELLU, // naz_Latn_MX
-    0x6E624E4F4C61746ELLU, // nb_Latn_NO
-    0x802D414F4C61746ELLU, // nba_Latn_AO
-    0x842D4E474C61746ELLU, // nbb_Latn_NG
-    0x882D494E4C61746ELLU, // nbc_Latn_IN
-    0x8C2D43444C61746ELLU, // nbd_Latn_CD
-    0x902D494E4C61746ELLU, // nbe_Latn_IN
-    0x9C2D4E474C61746ELLU, // nbh_Latn_NG
-    0xA02D494E4C61746ELLU, // nbi_Latn_IN
-    0xA42D41554C61746ELLU, // nbj_Latn_AU
-    0xA82D50474C61746ELLU, // nbk_Latn_PG
-    0xB02D43464C61746ELLU, // nbm_Latn_CF
-    0xB42D49444C61746ELLU, // nbn_Latn_ID
-    0xB82D4E474C61746ELLU, // nbo_Latn_NG
-    0xBC2D4E474C61746ELLU, // nbp_Latn_NG
-    0xC02D49444C61746ELLU, // nbq_Latn_ID
-    0xC42D4E474C61746ELLU, // nbr_Latn_NG
-    0xCC2D494E4C61746ELLU, // nbt_Latn_IN
-    0xD02D494E4C61746ELLU, // nbu_Latn_IN
-    0xD42D434D4C61746ELLU, // nbv_Latn_CM
-    0xD82D43444C61746ELLU, // nbw_Latn_CD
-    0xE02D50474C61746ELLU, // nby_Latn_PG
-    0x804D50474C61746ELLU, // nca_Latn_PG
-    0x844D494E4C61746ELLU, // ncb_Latn_IN
-    0x884D50474C61746ELLU, // ncc_Latn_PG
-    0x8C4D4E5044657661LLU, // ncd_Deva_NP
-    0x904D50474C61746ELLU, // nce_Latn_PG
-    0x944D50474C61746ELLU, // ncf_Latn_PG
-    0x984D43414C61746ELLU, // ncg_Latn_CA
-    0x9C4D4D584C61746ELLU, // nch_Latn_MX
-    0xA04D4D584C61746ELLU, // nci_Latn_MX
-    0xA44D4D584C61746ELLU, // ncj_Latn_MX
-    0xA84D41554C61746ELLU, // nck_Latn_AU
-    0xAC4D4D584C61746ELLU, // ncl_Latn_MX
-    0xB04D50474C61746ELLU, // ncm_Latn_PG
-    0xB44D50474C61746ELLU, // ncn_Latn_PG
-    0xB84D50474C61746ELLU, // nco_Latn_PG
-    0xC04D4C414C616F6FLLU, // ncq_Laoo_LA
-    0xC44D434D4C61746ELLU, // ncr_Latn_CM
-    0xCC4D494E4C61746ELLU, // nct_Latn_IN
-    0xD04D47484C61746ELLU, // ncu_Latn_GH
-    0xDC4D4D584C61746ELLU, // ncx_Latn_MX
-    0xE44D55534C61746ELLU, // ncz_Latn_US
-    0x6E645A574C61746ELLU, // nd_Latn_ZW
-    0x806D43474C61746ELLU, // nda_Latn_CG
-    0x846D434D4C61746ELLU, // ndb_Latn_CM
-    0x886D4D5A4C61746ELLU, // ndc_Latn_MZ
-    0x8C6D4E474C61746ELLU, // ndd_Latn_NG
-    0x946D52554379726CLLU, // ndf_Cyrl_RU
-    0x986D545A4C61746ELLU, // ndg_Latn_TZ
-    0x9C6D545A4C61746ELLU, // ndh_Latn_TZ
-    0xA06D4E474C61746ELLU, // ndi_Latn_NG
-    0xA46D545A4C61746ELLU, // ndj_Latn_TZ
-    0xA86D43444C61746ELLU, // ndk_Latn_CD
-    0xAC6D43444C61746ELLU, // ndl_Latn_CD
-    0xB06D54444C61746ELLU, // ndm_Latn_TD
-    0xB46D43474C61746ELLU, // ndn_Latn_CG
-    0xBC6D55474C61746ELLU, // ndp_Latn_UG
-    0xC06D414F4C61746ELLU, // ndq_Latn_AO
-    0xC46D4E474C61746ELLU, // ndr_Latn_NG
-    0xC86D44454C61746ELLU, // nds_Latn_DE
-    0xCC6D43444C61746ELLU, // ndt_Latn_CD
-    0xD06D434D4C61746ELLU, // ndu_Latn_CM
-    0xD46D534E4C61746ELLU, // ndv_Latn_SN
-    0xD86D43444C61746ELLU, // ndw_Latn_CD
-    0xDC6D49444C61746ELLU, // ndx_Latn_ID
-    0xE06D43464C61746ELLU, // ndy_Latn_CF
-    0xE46D53534C61746ELLU, // ndz_Latn_SS
-    0x6E654E5044657661LLU, // ne_Deva_NP
-    0x808D49444C61746ELLU, // nea_Latn_ID
-    0x848D43494C61746ELLU, // neb_Latn_CI
-    0x888D49444C61746ELLU, // nec_Latn_ID
-    0x8C8D4E474C61746ELLU, // ned_Latn_NG
-    0x908D4E434C61746ELLU, // nee_Latn_NC
-    0x988D52554379726CLLU, // neg_Cyrl_RU
-    0x9C8D425454696274LLU, // neh_Tibt_BT
-    0xA08D545258737578LLU, // nei_Xsux_TR
-    0xA48D50474C61746ELLU, // nej_Latn_PG
-    0xA88D4E434C61746ELLU, // nek_Latn_NC
-    0xB08D4E434C61746ELLU, // nem_Latn_NC
-    0xB48D4E434C61746ELLU, // nen_Latn_NC
-    0xB88D564E4C61746ELLU, // neo_Latn_VN
-    0xC08D4D584C61746ELLU, // neq_Latn_MX
-    0xC48D49444C61746ELLU, // ner_Latn_ID
-    0xCC8D50474C61746ELLU, // net_Latn_PG
-    0xD88D4E5044657661LLU, // new_Deva_NP
-    0xDC8D50474C61746ELLU, // nex_Latn_PG
-    0xE08D43494C61746ELLU, // ney_Latn_CI
-    0xE48D55534C61746ELLU, // nez_Latn_US
-    0x80AD49444C61746ELLU, // nfa_Latn_ID
-    0x8CAD4E474C61746ELLU, // nfd_Latn_NG
-    0xACAD53424C61746ELLU, // nfl_Latn_SB
-    0xC4AD47484C61746ELLU, // nfr_Latn_GH
-    0xD0AD434D4C61746ELLU, // nfu_Latn_CM
-    0x6E674E414C61746ELLU, // ng_Latn_NA
-    0x80CD43444C61746ELLU, // nga_Latn_CD
-    0x84CD43444C61746ELLU, // ngb_Latn_CD
-    0x88CD43444C61746ELLU, // ngc_Latn_CD
-    0x8CCD43464C61746ELLU, // ngd_Latn_CF
-    0x90CD434D4C61746ELLU, // nge_Latn_CM
-    0x98CD43464C61746ELLU, // ngg_Latn_CF
-    0x9CCD5A414C61746ELLU, // ngh_Latn_ZA
-    0xA0CD4E474C61746ELLU, // ngi_Latn_NG
-    0xA4CD434D4C61746ELLU, // ngj_Latn_CM
-    0xA8CD41554C61746ELLU, // ngk_Latn_AU
-    0xACCD4D5A4C61746ELLU, // ngl_Latn_MZ
-    0xB0CD464D4C61746ELLU, // ngm_Latn_FM
-    0xB4CD434D4C61746ELLU, // ngn_Latn_CM
-    0xBCCD545A4C61746ELLU, // ngp_Latn_TZ
-    0xC0CD545A4C61746ELLU, // ngq_Latn_TZ
-    0xC4CD53424C61746ELLU, // ngr_Latn_SB
-    0xC8CD4E474C61746ELLU, // ngs_Latn_NG
-    0xCCCD4C414C616F6FLLU, // ngt_Laoo_LA
-    0xD0CD4D584C61746ELLU, // ngu_Latn_MX
-    0xD4CD434D4C61746ELLU, // ngv_Latn_CM
-    0xD8CD4E474C61746ELLU, // ngw_Latn_NG
-    0xDCCD4E474C61746ELLU, // ngx_Latn_NG
-    0xE0CD434D4C61746ELLU, // ngy_Latn_CM
-    0xE4CD43474C61746ELLU, // ngz_Latn_CG
-    0x80ED41554C61746ELLU, // nha_Latn_AU
-    0x84ED43494C61746ELLU, // nhb_Latn_CI
-    0x88ED4D584C61746ELLU, // nhc_Latn_MX
-    0x8CED50594C61746ELLU, // nhd_Latn_PY
-    0x90ED4D584C61746ELLU, // nhe_Latn_MX
-    0x94ED41554C61746ELLU, // nhf_Latn_AU
-    0x98ED4D584C61746ELLU, // nhg_Latn_MX
-    0xA0ED4D584C61746ELLU, // nhi_Latn_MX
-    0xA8ED4D584C61746ELLU, // nhk_Latn_MX
-    0xB0ED4D584C61746ELLU, // nhm_Latn_MX
-    0xB4ED4D584C61746ELLU, // nhn_Latn_MX
-    0xB8ED50474C61746ELLU, // nho_Latn_PG
-    0xBCED4D584C61746ELLU, // nhp_Latn_MX
-    0xC0ED4D584C61746ELLU, // nhq_Latn_MX
-    0xC4ED42574C61746ELLU, // nhr_Latn_BW
-    0xCCED4D584C61746ELLU, // nht_Latn_MX
-    0xD0ED434D4C61746ELLU, // nhu_Latn_CM
-    0xD4ED4D584C61746ELLU, // nhv_Latn_MX
-    0xD8ED4D584C61746ELLU, // nhw_Latn_MX
-    0xDCED4D584C61746ELLU, // nhx_Latn_MX
-    0xE0ED4D584C61746ELLU, // nhy_Latn_MX
-    0xE4ED4D584C61746ELLU, // nhz_Latn_MX
-    0x810D49444C61746ELLU, // nia_Latn_ID
-    0x850D50474C61746ELLU, // nib_Latn_PG
-    0x8D0D41554C61746ELLU, // nid_Latn_AU
-    0x910D54444C61746ELLU, // nie_Latn_TD
-    0x950D50474C61746ELLU, // nif_Latn_PG
-    0x990D41554C61746ELLU, // nig_Latn_AU
-    0x9D0D545A4C61746ELLU, // nih_Latn_TZ
-    0xA10D50474C61746ELLU, // nii_Latn_PG
-    0xA50D49444C61746ELLU, // nij_Latn_ID
-    0xAD0D49444C61746ELLU, // nil_Latn_ID
-    0xB10D545A4C61746ELLU, // nim_Latn_TZ
-    0xB50D4E474C61746ELLU, // nin_Latn_NG
-    0xB90D52554379726CLLU, // nio_Cyrl_RU
-    0xC10D4B454C61746ELLU, // niq_Latn_KE
-    0xC50D49444C61746ELLU, // nir_Latn_ID
-    0xC90D50474C61746ELLU, // nis_Latn_PG
-    0xCD0D494E54656C75LLU, // nit_Telu_IN
-    0xD10D4E554C61746ELLU, // niu_Latn_NU
-    0xD50D52554379726CLLU, // niv_Cyrl_RU
-    0xD90D50474C61746ELLU, // niw_Latn_PG
-    0xDD0D43444C61746ELLU, // nix_Latn_CD
-    0xE10D43444C61746ELLU, // niy_Latn_CD
-    0xE50D50474C61746ELLU, // niz_Latn_PG
-    0x812D4E474C61746ELLU, // nja_Latn_NG
-    0x852D494E4C61746ELLU, // njb_Latn_IN
-    0x8D2D545A4C61746ELLU, // njd_Latn_TZ
-    0x9D2D494E4C61746ELLU, // njh_Latn_IN
-    0xA12D41554C61746ELLU, // nji_Latn_AU
-    0xA52D434D4C61746ELLU, // njj_Latn_CM
-    0xAD2D53534C61746ELLU, // njl_Latn_SS
-    0xB12D494E4C61746ELLU, // njm_Latn_IN
-    0xB52D494E4C61746ELLU, // njn_Latn_IN
-    0xB92D494E4C61746ELLU, // njo_Latn_IN
-    0xC52D4E474C61746ELLU, // njr_Latn_NG
-    0xC92D49444C61746ELLU, // njs_Latn_ID
-    0xCD2D53524C61746ELLU, // njt_Latn_SR
-    0xD12D41554C61746ELLU, // nju_Latn_AU
-    0xDD2D43474C61746ELLU, // njx_Latn_CG
-    0xE12D434D4C61746ELLU, // njy_Latn_CM
-    0xE52D494E4C61746ELLU, // njz_Latn_IN
-    0x814D5A4D4C61746ELLU, // nka_Latn_ZM
-    0x854D494E4C61746ELLU, // nkb_Latn_IN
-    0x894D434D4C61746ELLU, // nkc_Latn_CM
-    0x8D4D494E4C61746ELLU, // nkd_Latn_IN
-    0x914D53424C61746ELLU, // nke_Latn_SB
-    0x954D494E4C61746ELLU, // nkf_Latn_IN
-    0x994D50474C61746ELLU, // nkg_Latn_PG
-    0x9D4D494E4C61746ELLU, // nkh_Latn_IN
-    0xA14D494E4C61746ELLU, // nki_Latn_IN
-    0xA54D49444C61746ELLU, // nkj_Latn_ID
-    0xA94D56554C61746ELLU, // nkk_Latn_VU
-    0xB14D50474C61746ELLU, // nkm_Latn_PG
-    0xB54D414F4C61746ELLU, // nkn_Latn_AO
-    0xB94D47484C61746ELLU, // nko_Latn_GH
-    0xC14D47484C61746ELLU, // nkq_Latn_GH
-    0xC54D464D4C61746ELLU, // nkr_Latn_FM
-    0xC94D49444C61746ELLU, // nks_Latn_ID
-    0xCD4D545A4C61746ELLU, // nkt_Latn_TZ
-    0xD14D43494C61746ELLU, // nku_Latn_CI
-    0xD54D4D574C61746ELLU, // nkv_Latn_MW
-    0xD94D43444C61746ELLU, // nkw_Latn_CD
-    0xDD4D4E474C61746ELLU, // nkx_Latn_NG
-    0xE54D4E474C61746ELLU, // nkz_Latn_NG
-    0x6E6C4E4C4C61746ELLU, // nl_Latn_NL
-    0x816D434D4C61746ELLU, // nla_Latn_CM
-    0x896D49444C61746ELLU, // nlc_Latn_ID
-    0x916D4B454C61746ELLU, // nle_Latn_KE
-    0x996D53424C61746ELLU, // nlg_Latn_SB
-    0xA16D414641726162LLU, // nli_Arab_AF
-    0xA56D43444C61746ELLU, // nlj_Latn_CD
-    0xA96D49444C61746ELLU, // nlk_Latn_ID
-    0xB16D504B41726162LLU, // nlm_Arab_PK
-    0xB96D43444C61746ELLU, // nlo_Latn_CD
-    0xC16D4D4D4C61746ELLU, // nlq_Latn_MM
-    0xD16D47484C61746ELLU, // nlu_Latn_GH
-    0xD56D4D584C61746ELLU, // nlv_Latn_MX
-    0xD96D41554C61746ELLU, // nlw_Latn_AU
-    0xDD6D494E44657661LLU, // nlx_Deva_IN
-    0xE16D41554C61746ELLU, // nly_Latn_AU
-    0xE56D53424C61746ELLU, // nlz_Latn_SB
-    0x818D494E4C61746ELLU, // nma_Latn_IN
-    0x858D56554C61746ELLU, // nmb_Latn_VU
-    0x898D54444C61746ELLU, // nmc_Latn_TD
-    0x8D8D47414C61746ELLU, // nmd_Latn_GA
-    0x918D494E4C61746ELLU, // nme_Latn_IN
-    0x958D494E4C61746ELLU, // nmf_Latn_IN
-    0x998D434D4C61746ELLU, // nmg_Latn_CM
-    0x9D8D494E4C61746ELLU, // nmh_Latn_IN
-    0xA18D4E474C61746ELLU, // nmi_Latn_NG
-    0xA58D43464C61746ELLU, // nmj_Latn_CF
-    0xA98D56554C61746ELLU, // nmk_Latn_VU
-    0xAD8D434D4C61746ELLU, // nml_Latn_CM
-    0xB18D4E5044657661LLU, // nmm_Deva_NP
-    0xB58D42574C61746ELLU, // nmn_Latn_BW
-    0xB98D494E4C61746ELLU, // nmo_Latn_IN
-    0xBD8D41554C61746ELLU, // nmp_Latn_AU
-    0xC18D5A574C61746ELLU, // nmq_Latn_ZW
-    0xC58D434D4C61746ELLU, // nmr_Latn_CM
-    0xC98D56554C61746ELLU, // nms_Latn_VU
-    0xCD8D464D4C61746ELLU, // nmt_Latn_FM
-    0xD18D55534C61746ELLU, // nmu_Latn_US
-    0xD58D41554C61746ELLU, // nmv_Latn_AU
-    0xD98D50474C61746ELLU, // nmw_Latn_PG
-    0xDD8D50474C61746ELLU, // nmx_Latn_PG
-    0xE58D54474C61746ELLU, // nmz_Latn_TG
-    0x6E6E4E4F4C61746ELLU, // nn_Latn_NO
-    0x81AD41554C61746ELLU, // nna_Latn_AU
-    0x85AD43444C61746ELLU, // nnb_Latn_CD
-    0x89AD54444C61746ELLU, // nnc_Latn_TD
-    0x8DAD56554C61746ELLU, // nnd_Latn_VU
-    0x91AD414F4C61746ELLU, // nne_Latn_AO
-    0x95AD50474C61746ELLU, // nnf_Latn_PG
-    0x99AD494E4C61746ELLU, // nng_Latn_IN
-    0x9DAD434D4C61746ELLU, // nnh_Latn_CM
-    0xA1AD49444C61746ELLU, // nni_Latn_ID
-    0xA5AD45544C61746ELLU, // nnj_Latn_ET
-    0xA9AD50474C61746ELLU, // nnk_Latn_PG
-    0xADAD494E4C61746ELLU, // nnl_Latn_IN
-    0xB1AD50474C61746ELLU, // nnm_Latn_PG
-    0xB5AD54444C61746ELLU, // nnn_Latn_TD
-    0xBDAD494E5763686FLLU, // nnp_Wcho_IN
-    0xC1AD545A4C61746ELLU, // nnq_Latn_TZ
-    0xC5AD41554C61746ELLU, // nnr_Latn_AU
-    0xCDAD55534C61746ELLU, // nnt_Latn_US
-    0xD1AD47484C61746ELLU, // nnu_Latn_GH
-    0xD5AD41554C61746ELLU, // nnv_Latn_AU
-    0xD9AD42464C61746ELLU, // nnw_Latn_BF
-    0xE1AD41554C61746ELLU, // nny_Latn_AU
-    0xE5AD434D4C61746ELLU, // nnz_Latn_CM
-    0x6E6F4E4F4C61746ELLU, // no_Latn_NO
-    0x81CD434F4C61746ELLU, // noa_Latn_CO
-    0x89CD50474C61746ELLU, // noc_Latn_PG
-    0x8DCD54484C616E61LLU, // nod_Lana_TH
-    0x91CD494E44657661LLU, // noe_Deva_IN
-    0x95CD50474C61746ELLU, // nof_Latn_PG
-    0x99CD52554379726CLLU, // nog_Cyrl_RU
-    0x9DCD50474C61746ELLU, // noh_Latn_PG
-    0xA1CD494E44657661LLU, // noi_Deva_IN
-    0xA5CD434F4C61746ELLU, // noj_Latn_CO
-    0xA9CD55534C61746ELLU, // nok_Latn_US
-    0xB5CD534552756E72LLU, // non_Runr_SE
-    0xBDCD50474C61746ELLU, // nop_Latn_PG
-    0xC1CD43444C61746ELLU, // noq_Latn_CD
-    0xC9CD434E59696969LLU, // nos_Yiii_CN
-    0xCDCD50454C61746ELLU, // not_Latn_PE
-    0xD1CD50474C61746ELLU, // nou_Latn_PG
-    0xD9CD545A4C61746ELLU, // now_Latn_TZ
-    0xE1CD54444C61746ELLU, // noy_Latn_TD
-    0x85ED425454696274LLU, // npb_Tibt_BT
-    0x99ED4D4D4C61746ELLU, // npg_Latn_MM
-    0x9DED494E4C61746ELLU, // nph_Latn_IN
-    0xADED4D584C61746ELLU, // npl_Latn_MX
-    0xB5ED50474C61746ELLU, // npn_Latn_PG
-    0xB9ED494E4C61746ELLU, // npo_Latn_IN
-    0xC9ED49444C61746ELLU, // nps_Latn_ID
-    0xD1ED494E4C61746ELLU, // npu_Latn_IN
-    0xDDED53424C61746ELLU, // npx_Latn_SB
-    0xE1ED49444C61746ELLU, // npy_Latn_ID
-    0x9A0D424A4C61746ELLU, // nqg_Latn_BJ
-    0xAA0D424A4C61746ELLU, // nqk_Latn_BJ
-    0xAE0D414F4C61746ELLU, // nql_Latn_AO
-    0xB20D49444C61746ELLU, // nqm_Latn_ID
-    0xB60D50474C61746ELLU, // nqn_Latn_PG
-    0xBA0D474E4E6B6F6FLLU, // nqo_Nkoo_GN
-    0xC20D4D4D4C61746ELLU, // nqq_Latn_MM
-    0xCE0D4E474C61746ELLU, // nqt_Latn_NG
-    0xE20D4D4D4C61746ELLU, // nqy_Latn_MM
-    0x6E725A414C61746ELLU, // nr_Latn_ZA
-    0x822D47414C61746ELLU, // nra_Latn_GA
-    0x862D45524C61746ELLU, // nrb_Latn_ER
-    0x922D494E4C61746ELLU, // nre_Latn_IN
-    0x962D4A454C61746ELLU, // nrf_Latn_JE
-    0x9A2D56554C61746ELLU, // nrg_Latn_VU
-    0xA22D494E4C61746ELLU, // nri_Latn_IN
-    0xAA2D41554C61746ELLU, // nrk_Latn_AU
-    0xAE2D41554C61746ELLU, // nrl_Latn_AU
-    0xB22D4D594C61746ELLU, // nrm_Latn_MY
-    0xB62D474252756E72LLU, // nrn_Runr_GB
-    0xBE2D49544C61746ELLU, // nrp_Latn_IT
-    0xD22D434E4C61746ELLU, // nru_Latn_CN
-    0xDE2D41554C61746ELLU, // nrx_Latn_AU
-    0xE62D50474C61746ELLU, // nrz_Latn_PG
-    0x824D494E4C61746ELLU, // nsa_Latn_IN
-    0x864D5A414C61746ELLU, // nsb_Latn_ZA
-    0x8A4D4E474C61746ELLU, // nsc_Latn_NG
-    0x8E4D434E59696969LLU, // nsd_Yiii_CN
-    0x924D5A4D4C61746ELLU, // nse_Latn_ZM
-    0x964D434E59696969LLU, // nsf_Yiii_CN
-    0x9A4D545A4C61746ELLU, // nsg_Latn_TZ
-    0x9E4D434D4C61746ELLU, // nsh_Latn_CM
-    0xAA4D434143616E73LLU, // nsk_Cans_CA
-    0xB24D494E4C61746ELLU, // nsm_Latn_IN
-    0xB64D50474C61746ELLU, // nsn_Latn_PG
-    0xBA4D5A414C61746ELLU, // nso_Latn_ZA
-    0xC24D55534C61746ELLU, // nsq_Latn_US
-    0xCA4D50474C61746ELLU, // nss_Latn_PG
-    0xCE4D494E546E7361LLU, // nst_Tnsa_IN
-    0xD24D4D584C61746ELLU, // nsu_Latn_MX
-    0xD64D434E59696969LLU, // nsv_Yiii_CN
-    0xDA4D56554C61746ELLU, // nsw_Latn_VU
-    0xDE4D414F4C61746ELLU, // nsx_Latn_AO
-    0xE24D49444C61746ELLU, // nsy_Latn_ID
-    0xE64D55534C61746ELLU, // nsz_Latn_US
-    0x8E6D4D594C61746ELLU, // ntd_Latn_MY
-    0x926D4D5A4C61746ELLU, // nte_Latn_MZ
-    0x9A6D41554C61746ELLU, // ntg_Latn_AU
-    0xA26D42464C61746ELLU, // nti_Latn_BF
-    0xA66D41554C61746ELLU, // ntj_Latn_AU
-    0xAA6D545A4C61746ELLU, // ntk_Latn_TZ
-    0xB26D424A4C61746ELLU, // ntm_Latn_BJ
-    0xBA6D43444C61746ELLU, // nto_Latn_CD
-    0xBE6D4D584C61746ELLU, // ntp_Latn_MX
-    0xC66D47484C61746ELLU, // ntr_Latn_GH
-    0xD26D53424C61746ELLU, // ntu_Latn_SB
-    0xDE6D4D4D4C61746ELLU, // ntx_Latn_MM
-    0xE26D564E59696969LLU, // nty_Yiii_VN
-    0xE66D495241726162LLU, // ntz_Arab_IR
-    0x828D4E434C61746ELLU, // nua_Latn_NC
-    0x8A8D42524C61746ELLU, // nuc_Latn_BR
-    0x8E8D50474C61746ELLU, // nud_Latn_PG
-    0x928D43444C61746ELLU, // nue_Latn_CD
-    0x968D434E4C61746ELLU, // nuf_Latn_CN
-    0x9A8D41554C61746ELLU, // nug_Latn_AU
-    0x9E8D4E474C61746ELLU, // nuh_Latn_NG
-    0xA28D47514C61746ELLU, // nui_Latn_GQ
-    0xA68D55474C61746ELLU, // nuj_Latn_UG
-    0xAA8D43414C61746ELLU, // nuk_Latn_CA
-    0xB28D544F4C61746ELLU, // num_Latn_TO
-    0xB68D4D4D4C61746ELLU, // nun_Latn_MM
-    0xBA8D564E4C61746ELLU, // nuo_Latn_VN
-    0xBE8D4E474C61746ELLU, // nup_Latn_NG
-    0xC28D50474C61746ELLU, // nuq_Latn_PG
-    0xC68D50474C61746ELLU, // nur_Latn_PG
-    0xCA8D53534C61746ELLU, // nus_Latn_SS
-    0xCE8D564E4C61746ELLU, // nut_Latn_VN
-    0xD28D43444C61746ELLU, // nuu_Latn_CD
-    0xD68D42464C61746ELLU, // nuv_Latn_BF
-    0xDA8D464D4C61746ELLU, // nuw_Latn_FM
-    0xDE8D50474C61746ELLU, // nux_Latn_PG
-    0xE28D41554C61746ELLU, // nuy_Latn_AU
-    0xE68D4D584C61746ELLU, // nuz_Latn_MX
-    0x6E7655534C61746ELLU, // nv_Latn_US
-    0x9EAD56554C61746ELLU, // nvh_Latn_VU
-    0xB2AD50474C61746ELLU, // nvm_Latn_PG
-    0xBAAD434D4C61746ELLU, // nvo_Latn_CM
-    0x86CD43494C61746ELLU, // nwb_Latn_CI
-    0x8ACD4E504E657761LLU, // nwc_Newa_NP
-    0x92CD434D4C61746ELLU, // nwe_Latn_CM
-    0x9ACD41554C61746ELLU, // nwg_Latn_AU
-    0xA2CD56554C61746ELLU, // nwi_Latn_VU
-    0xB2CD53534C61746ELLU, // nwm_Latn_SS
-    0xBACD41554C61746ELLU, // nwo_Latn_AU
-    0xC6CD50474C61746ELLU, // nwr_Latn_PG
-    0xDACD545A4C61746ELLU, // nww_Latn_TZ
-    0xDECD4E5044657661LLU, // nwx_Deva_NP
-    0x82ED544C4C61746ELLU, // nxa_Latn_TL
-    0x8EED43444C61746ELLU, // nxd_Latn_CD
-    0x92ED49444C61746ELLU, // nxe_Latn_ID
-    0x9AED49444C61746ELLU, // nxg_Latn_ID
-    0xA2ED545A4C61746ELLU, // nxi_Latn_TZ
-    0xAEED49444C61746ELLU, // nxl_Latn_ID
-    0xB6ED41554C61746ELLU, // nxn_Latn_AU
-    0xBAED47414C61746ELLU, // nxo_Latn_GA
-    0xC2ED434E4C61746ELLU, // nxq_Latn_CN
-    0xC6ED50474C61746ELLU, // nxr_Latn_PG
-    0xDEED49444C61746ELLU, // nxx_Latn_ID
-    0x6E794D574C61746ELLU, // ny_Latn_MW
-    0x870D47484C61746ELLU, // nyb_Latn_GH
-    0x8B0D43444C61746ELLU, // nyc_Latn_CD
-    0x8F0D4B454C61746ELLU, // nyd_Latn_KE
-    0x930D414F4C61746ELLU, // nye_Latn_AO
-    0x970D4B454C61746ELLU, // nyf_Latn_KE
-    0x9B0D43444C61746ELLU, // nyg_Latn_CD
-    0x9F0D41554C61746ELLU, // nyh_Latn_AU
-    0xA30D53444C61746ELLU, // nyi_Latn_SD
-    0xA70D43444C61746ELLU, // nyj_Latn_CD
-    0xAB0D414F4C61746ELLU, // nyk_Latn_AO
-    0xAF0D544854686169LLU, // nyl_Thai_TH
-    0xB30D545A4C61746ELLU, // nym_Latn_TZ
-    0xB70D55474C61746ELLU, // nyn_Latn_UG
-    0xBB0D55474C61746ELLU, // nyo_Latn_UG
-    0xBF0D55474C61746ELLU, // nyp_Latn_UG
-    0xC30D495241726162LLU, // nyq_Arab_IR
-    0xC70D4D574C61746ELLU, // nyr_Latn_MW
-    0xCB0D41554C61746ELLU, // nys_Latn_AU
-    0xCF0D41554C61746ELLU, // nyt_Latn_AU
-    0xD30D4D5A4C61746ELLU, // nyu_Latn_MZ
-    0xD70D41554C61746ELLU, // nyv_Latn_AU
-    0xDB0D544854686169LLU, // nyw_Thai_TH
-    0xDF0D41554C61746ELLU, // nyx_Latn_AU
-    0xE30D545A4C61746ELLU, // nyy_Latn_TZ
-    0x832D434D4C61746ELLU, // nza_Latn_CM
-    0x872D47414C61746ELLU, // nzb_Latn_GA
-    0x8F2D43444C61746ELLU, // nzd_Latn_CD
-    0xA32D47484C61746ELLU, // nzi_Latn_GH
-    0xAB2D43464C61746ELLU, // nzk_Latn_CF
-    0xB32D494E4C61746ELLU, // nzm_Latn_IN
-    0xC72D4E474C61746ELLU, // nzr_Latn_NG
-    0xD32D43474C61746ELLU, // nzu_Latn_CG
-    0xE32D54444C61746ELLU, // nzy_Latn_TD
-    0xE72D4D4C4C61746ELLU, // nzz_Latn_ML
-    0x800E52554379726CLLU, // oaa_Cyrl_RU
-    0x880E52554379726CLLU, // oac_Cyrl_RU
-    0xC40E535953797263LLU, // oar_Syrc_SY
-    0xD40E474547656F72LLU, // oav_Geor_GE
-    0xA02E55534C61746ELLU, // obi_Latn_US
-    0xA82E50484C61746ELLU, // obk_Latn_PH
-    0xAC2E434D4C61746ELLU, // obl_Latn_CM
-    0xB02E4A4F50686E78LLU, // obm_Phnx_JO
-    0xB82E50484C61746ELLU, // obo_Latn_PH
-    0xC42E4D4D4D796D72LLU, // obr_Mymr_MM
-    0xCC2E46524C61746ELLU, // obt_Latn_FR
-    0xD02E4E474C61746ELLU, // obu_Latn_NG
-    0x6F6346524C61746ELLU, // oc_Latn_FR
-    0x804E50454C61746ELLU, // oca_Latn_PE
-    0xB84E47424C61746ELLU, // oco_Latn_GB
-    0xD04E4D584C61746ELLU, // ocu_Latn_MX
-    0x806E4E474C61746ELLU, // oda_Latn_NG
-    0xA86E504B41726162LLU, // odk_Arab_PK
-    0xCC6E4E4C4C61746ELLU, // odt_Latn_NL
-    0xD06E4E474C61746ELLU, // odu_Latn_NG
-    0xC8AE4E4C4C61746ELLU, // ofs_Latn_NL
-    0xD0AE4E474C61746ELLU, // ofu_Latn_NG
-    0x84CE4E474C61746ELLU, // ogb_Latn_NG
-    0x88CE4E474C61746ELLU, // ogc_Latn_NG
-    0x98CE4E474C61746ELLU, // ogg_Latn_NG
-    0xB8CE4E474C61746ELLU, // ogo_Latn_NG
-    0xD0CE4E474C61746ELLU, // ogu_Latn_NG
-    0xCCEE545258737578LLU, // oht_Xsux_TR
-    0xD0EE48554C61746ELLU, // ohu_Latn_HU
-    0x810E49444C61746ELLU, // oia_Latn_ID
-    0x910E53534C61746ELLU, // oie_Latn_SS
-    0xB50E50474C61746ELLU, // oin_Latn_PG
-    0x6F6A434143616E73LLU, // oj_Cans_CA
-    0x852E43414C61746ELLU, // ojb_Latn_CA
-    0x892E43414C61746ELLU, // ojc_Latn_CA
-    0xC92E434143616E73LLU, // ojs_Cans_CA
-    0xD52E53424C61746ELLU, // ojv_Latn_SB
-    0xD92E43414C61746ELLU, // ojw_Latn_CA
-    0x814E43414C61746ELLU, // oka_Latn_CA
-    0x854E4E474C61746ELLU, // okb_Latn_NG
-    0x894E43444C61746ELLU, // okc_Latn_CD
-    0x8D4E4E474C61746ELLU, // okd_Latn_NG
-    0x914E4E474C61746ELLU, // oke_Latn_NG
-    0x994E41554C61746ELLU, // okg_Latn_AU
-    0xA14E4B454C61746ELLU, // oki_Latn_KE
-    0xA94E50474C61746ELLU, // okk_Latn_PG
-    0xB14E4B5248616E67LLU, // okm_Hang_KR
-    0xB94E4B5248616E69LLU, // oko_Hani_KR
-    0xC54E4E474C61746ELLU, // okr_Latn_NG
-    0xC94E4E474C61746ELLU, // oks_Latn_NG
-    0xD14E434D4C61746ELLU, // oku_Latn_CM
-    0xD54E50474C61746ELLU, // okv_Latn_PG
-    0xDD4E4E474C61746ELLU, // okx_Latn_NG
-    0xE54E4B484B686D72LLU, // okz_Khmr_KH
-    0x816E4E5044657661LLU, // ola_Deva_NP
-    0x8D6E545A4C61746ELLU, // old_Latn_TZ
-    0x916E425454696274LLU, // ole_Tibt_BT
-    0xA96E41554C61746ELLU, // olk_Latn_AU
-    0xB16E4E474C61746ELLU, // olm_Latn_NG
-    0xB96E52554C61746ELLU, // olo_Latn_RU
-    0xC56E56554C61746ELLU, // olr_Latn_VU
-    0xCD6E4C544C61746ELLU, // olt_Latn_LT
-    0xD16E414F4C61746ELLU, // olu_Latn_AO
-    0x6F6D45544C61746ELLU, // om_Latn_ET
-    0x818E55534C61746ELLU, // oma_Latn_US
-    0x858E56554C61746ELLU, // omb_Latn_VU
-    0x898E50454C61746ELLU, // omc_Latn_PE
-    0x998E50454C61746ELLU, // omg_Latn_PE
-    0xA18E43444C61746ELLU, // omi_Latn_CD
-    0xA98E52554379726CLLU, // omk_Cyrl_RU
-    0xAD8E43444C61746ELLU, // oml_Latn_CD
-    0xB98E50474C61746ELLU, // omo_Latn_PG
-    0xBD8E494E4D746569LLU, // omp_Mtei_IN
-    0xC58E494E4D6F6469LLU, // omr_Modi_IN
-    0xCD8E4B454C61746ELLU, // omt_Latn_KE
-    0xD18E50454C61746ELLU, // omu_Latn_PE
-    0xD98E50474C61746ELLU, // omw_Latn_PG
-    0xDD8E4D4D4D796D72LLU, // omx_Mymr_MM
-    0x81AE41524C61746ELLU, // ona_Latn_AR
-    0x91AE43414C61746ELLU, // one_Latn_CA
-    0x99AE50474C61746ELLU, // ong_Latn_PG
-    0xA1AE49444C61746ELLU, // oni_Latn_ID
-    0xA5AE50474C61746ELLU, // onj_Latn_PG
-    0xA9AE50474C61746ELLU, // onk_Latn_PG
-    0xB5AE50474C61746ELLU, // onn_Latn_PG
-    0xB9AE43414C61746ELLU, // ono_Latn_CA
-    0xBDAE494E4C61746ELLU, // onp_Latn_IN
-    0xC5AE50474C61746ELLU, // onr_Latn_PG
-    0xC9AE50474C61746ELLU, // ons_Latn_PG
-    0xCDAE50474C61746ELLU, // ont_Latn_PG
-    0xD1AE56554C61746ELLU, // onu_Latn_VU
-    0xDDAE49444C61746ELLU, // onx_Latn_ID
-    0x8DCE55534C61746ELLU, // ood_Latn_US
-    0xB5CE494E44657661LLU, // oon_Deva_IN
-    0xC5CE5A414C61746ELLU, // oor_Latn_ZA
-    0x81EE4E474C61746ELLU, // opa_Latn_NG
-    0xA9EE49444C61746ELLU, // opk_Latn_ID
-    0xB1EE50474C61746ELLU, // opm_Latn_PG
-    0xB9EE50474C61746ELLU, // opo_Latn_PG
-    0xCDEE4D584C61746ELLU, // opt_Latn_MX
-    0xE1EE42524C61746ELLU, // opy_Latn_BR
-    0x6F72494E4F727961LLU, // or_Orya_IN
-    0x822E53424C61746ELLU, // ora_Latn_SB
-    0x8A2E4B454C61746ELLU, // orc_Latn_KE
-    0x922E50454C61746ELLU, // ore_Latn_PE
-    0x9A2E4E474C61746ELLU, // org_Latn_NG
-    0xB62E4D594C61746ELLU, // orn_Latn_MY
-    0xBA2E50474C61746ELLU, // oro_Latn_PG
-    0xC62E4E474C61746ELLU, // orr_Latn_NG
-    0xCA2E4D594C61746ELLU, // ors_Latn_MY
-    0xCE2E494E54656C75LLU, // ort_Telu_IN
-    0xD22E504B41726162LLU, // oru_Arab_PK
-    0xD62E52554379726CLLU, // orv_Cyrl_RU
-    0xDA2E42524C61746ELLU, // orw_Latn_BR
-    0xDE2E4E474C61746ELLU, // orx_Latn_NG
-    0xE62E49444C61746ELLU, // orz_Latn_ID
-    0x6F7347454379726CLLU, // os_Cyrl_GE
-    0x824E55534F736765LLU, // osa_Osge_US
-    0x8A4E49544974616CLLU, // osc_Ital_IT
-    0xA24E49444A617661LLU, // osi_Java_ID
-    0xBA4E4E474C61746ELLU, // oso_Latn_NG
-    0xBE4E45534C61746ELLU, // osp_Latn_ES
-    0xCE4E434D4C61746ELLU, // ost_Latn_CM
-    0xD24E50474C61746ELLU, // osu_Latn_PG
-    0xDE4E44454C61746ELLU, // osx_Latn_DE
-    0x826E545241726162LLU, // ota_Arab_TR
-    0x866E434E54696274LLU, // otb_Tibt_CN
-    0x8E6E49444C61746ELLU, // otd_Latn_ID
-    0x926E4D584C61746ELLU, // ote_Latn_MX
-    0xA26E42524C61746ELLU, // oti_Latn_BR
-    0xAA6E4D4E4F726B68LLU, // otk_Orkh_MN
-    0xAE6E4D584C61746ELLU, // otl_Latn_MX
-    0xB26E4D584C61746ELLU, // otm_Latn_MX
-    0xB66E4D584C61746ELLU, // otn_Latn_MX
-    0xC26E4D584C61746ELLU, // otq_Latn_MX
-    0xC66E53444C61746ELLU, // otr_Latn_SD
-    0xCA6E4D584C61746ELLU, // ots_Latn_MX
-    0xCE6E4D584C61746ELLU, // ott_Latn_MX
-    0xD26E42524C61746ELLU, // otu_Latn_BR
-    0xDA6E43414C61746ELLU, // otw_Latn_CA
-    0xDE6E4D584C61746ELLU, // otx_Latn_MX
-    0xE26E494E4772616ELLU, // oty_Gran_IN
-    0xE66E4D584C61746ELLU, // otz_Latn_MX
-    0x868E4C524C61746ELLU, // oub_Latn_LR
-    0x928E50474C61746ELLU, // oue_Latn_PG
-    0xA28E434E4F756772LLU, // oui_Ougr_CN
-    0xB28E50474C61746ELLU, // oum_Latn_PG
-    0x8EAE53454C61746ELLU, // ovd_Latn_SE
-    0xA2CE50474C61746ELLU, // owi_Latn_PG
-    0xAECE47424C61746ELLU, // owl_Latn_GB
-    0x8F0E45544C61746ELLU, // oyd_Latn_ET
-    0xB30E42524C61746ELLU, // oym_Latn_BR
-    0xE30E50474C61746ELLU, // oyy_Latn_PG
-    0xB32E434D4C61746ELLU, // ozm_Latn_CM
-    0x7061504B41726162LLU, // pa_Arab_PK
-    0x7061494E47757275LLU, // pa_Guru_IN
-    0x840F42524C61746ELLU, // pab_Latn_BR
-    0x880F564E4C61746ELLU, // pac_Latn_VN
-    0x8C0F42524C61746ELLU, // pad_Latn_BR
-    0x900F43444C61746ELLU, // pae_Latn_CD
-    0x940F42524C61746ELLU, // paf_Latn_BR
-    0x980F50484C61746ELLU, // pag_Latn_PH
-    0x9C0F42524C61746ELLU, // pah_Latn_BR
-    0xA00F4E474C61746ELLU, // pai_Latn_NG
-    0xA80F42524C61746ELLU, // pak_Latn_BR
-    0xAC0F495250686C69LLU, // pal_Phli_IR
-    0xAC0F434E50686C70LLU, // pal_Phlp_CN
-    0xB00F50484C61746ELLU, // pam_Latn_PH
-    0xB80F55534C61746ELLU, // pao_Latn_US
-    0xBC0F43574C61746ELLU, // pap_Latn_CW
-    0xC00F544A4379726CLLU, // paq_Cyrl_TJ
-    0xC40F55534C61746ELLU, // par_Latn_US
-    0xC80F49444C61746ELLU, // pas_Latn_ID
-    0xD00F50574C61746ELLU, // pau_Latn_PW
-    0xD40F42524C61746ELLU, // pav_Latn_BR
-    0xD80F55534C61746ELLU, // paw_Latn_US
-    0xDC0F42524C61746ELLU, // pax_Latn_BR
-    0xE00F484E4C61746ELLU, // pay_Latn_HN
-    0xE40F42524C61746ELLU, // paz_Latn_BR
-    0x842F434F4C61746ELLU, // pbb_Latn_CO
-    0x882F47594C61746ELLU, // pbc_Latn_GY
-    0x902F4D584C61746ELLU, // pbe_Latn_MX
-    0x942F4D584C61746ELLU, // pbf_Latn_MX
-    0x982F56454C61746ELLU, // pbg_Latn_VE
-    0x9C2F56454C61746ELLU, // pbh_Latn_VE
-    0xA02F434D4C61746ELLU, // pbi_Latn_CM
-    0xAC2F4E474C61746ELLU, // pbl_Latn_NG
-    0xB02F4D584C61746ELLU, // pbm_Latn_MX
-    0xB42F4E474C61746ELLU, // pbn_Latn_NG
-    0xB82F47574C61746ELLU, // pbo_Latn_GW
-    0xBC2F474E4C61746ELLU, // pbp_Latn_GN
-    0xC42F545A4C61746ELLU, // pbr_Latn_TZ
-    0xC82F4D584C61746ELLU, // pbs_Latn_MX
-    0xCC2F414641726162LLU, // pbt_Arab_AF
-    0xD42F494E4C61746ELLU, // pbv_Latn_IN
-    0xE02F50474C61746ELLU, // pby_Latn_PG
-    0x804F4D584C61746ELLU, // pca_Latn_MX
-    0x844F4B484B686D72LLU, // pcb_Khmr_KH
-    0x884F434E4C61746ELLU, // pcc_Latn_CN
-    0x8C4F46524C61746ELLU, // pcd_Latn_FR
-    0x904F4D4D4D796D72LLU, // pce_Mymr_MM
-    0x944F494E4D6C796DLLU, // pcf_Mlym_IN
-    0x984F494E4D6C796DLLU, // pcg_Mlym_IN
-    0x9C4F494E44657661LLU, // pch_Deva_IN
-    0xA04F494E44657661LLU, // pci_Deva_IN
-    0xA44F494E54656C75LLU, // pcj_Telu_IN
-    0xA84F494E4C61746ELLU, // pck_Latn_IN
-    0xB04F4E474C61746ELLU, // pcm_Latn_NG
-    0xB44F4E474C61746ELLU, // pcn_Latn_NG
-    0xBC4F424F4C61746ELLU, // pcp_Latn_BO
-    0xD84F4E474C61746ELLU, // pcw_Latn_NG
-    0x806F50474C61746ELLU, // pda_Latn_PG
-    0x886F55534C61746ELLU, // pdc_Latn_US
-    0xB46F49444C61746ELLU, // pdn_Latn_ID
-    0xB86F49444C61746ELLU, // pdo_Latn_ID
-    0xCC6F43414C61746ELLU, // pdt_Latn_CA
-    0xD06F4D4D4C61746ELLU, // pdu_Latn_MM
-    0x808F49444C61746ELLU, // pea_Latn_ID
-    0x848F55534C61746ELLU, // peb_Latn_US
-    0x8C8F50474C61746ELLU, // ped_Latn_PG
-    0x908F49444C61746ELLU, // pee_Latn_ID
-    0x988F494E4F727961LLU, // peg_Orya_IN
-    0xA08F4D584C61746ELLU, // pei_Latn_MX
-    0xA88F50474C61746ELLU, // pek_Latn_PG
-    0xAC8F49444C61746ELLU, // pel_Latn_ID
-    0xB08F43444C61746ELLU, // pem_Latn_CD
-    0xB88F49525870656FLLU, // peo_Xpeo_IR
-    0xBC8F50474C61746ELLU, // pep_Latn_PG
-    0xC08F55534C61746ELLU, // peq_Latn_US
-    0xD48F56454C61746ELLU, // pev_Latn_VE
-    0xDC8F50474C61746ELLU, // pex_Latn_PG
-    0xE08F49444C61746ELLU, // pey_Latn_ID
-    0xE48F4D594C61746ELLU, // pez_Latn_MY
-    0x80AF464D4C61746ELLU, // pfa_Latn_FM
-    0x90AF434D4C61746ELLU, // pfe_Latn_CM
-    0xACAF44454C61746ELLU, // pfl_Latn_DE
-    0x80CF53534C61746ELLU, // pga_Latn_SS
-    0x8CCF504B4B686172LLU, // pgd_Khar_PK
-    0x98CF494E44657661LLU, // pgg_Deva_IN
-    0xA0CF50474C61746ELLU, // pgi_Latn_PG
-    0xA8CF56554C61746ELLU, // pgk_Latn_VU
-    0xACCF49454F67616DLLU, // pgl_Ogam_IE
-    0xB4CF49544974616CLLU, // pgn_Ital_IT
-    0xC8CF4E474C61746ELLU, // pgs_Latn_NG
-    0xD0CF49444C61746ELLU, // pgu_Latn_ID
-    0x8CEF494E44657661LLU, // phd_Deva_IN
-    0x98EF564E4C61746ELLU, // phg_Latn_VN
-    0x9CEF564E4C61746ELLU, // phh_Latn_VN
-    0xA8EF494E4D796D72LLU, // phk_Mymr_IN
-    0xACEF504B41726162LLU, // phl_Arab_PK
-    0xB0EF4D5A4C61746ELLU, // phm_Latn_MZ
-    0xB4EF4C4250686E78LLU, // phn_Phnx_LB
-    0xB8EF4C414C616F6FLLU, // pho_Laoo_LA
-    0xC4EF504B41726162LLU, // phr_Arab_PK
-    0xCCEF544854686169LLU, // pht_Thai_TH
-    0xD0EF544854686169LLU, // phu_Thai_TH
-    0xD4EF414641726162LLU, // phv_Arab_AF
-    0xD8EF4E5044657661LLU, // phw_Deva_NP
-    0x7069494E53696E68LLU, // pi_Sinh_IN
-    0x810F4D584C61746ELLU, // pia_Latn_MX
-    0x850F50454C61746ELLU, // pib_Latn_PE
-    0x890F47414C61746ELLU, // pic_Latn_GA
-    0x8D0F56454C61746ELLU, // pid_Latn_VE
-    0x950F464D4C61746ELLU, // pif_Latn_FM
-    0x990F50454C61746ELLU, // pig_Latn_PE
-    0x9D0F4E464C61746ELLU, // pih_Latn_NF
-    0xA50F434F4C61746ELLU, // pij_Latn_CO
-    0xAD0F424A4C61746ELLU, // pil_Latn_BJ
-    0xB10F55534C61746ELLU, // pim_Latn_US
-    0xB50F50474C61746ELLU, // pin_Latn_PG
-    0xB90F434F4C61746ELLU, // pio_Latn_CO
-    0xBD0F4E474C61746ELLU, // pip_Latn_NG
-    0xC50F42524C61746ELLU, // pir_Latn_BR
-    0xC90F53424C61746ELLU, // pis_Latn_SB
-    0xCD0F41554C61746ELLU, // pit_Latn_AU
-    0xD10F41554C61746ELLU, // piu_Latn_AU
-    0xD50F53424C61746ELLU, // piv_Latn_SB
-    0xD90F545A4C61746ELLU, // piw_Latn_TZ
-    0xDD0F50474C61746ELLU, // pix_Latn_PG
-    0xE10F4E474C61746ELLU, // piy_Latn_NG
-    0xE50F4E434C61746ELLU, // piz_Latn_NC
-    0xCD2F41554C61746ELLU, // pjt_Latn_AU
-    0x814F494E42726168LLU, // pka_Brah_IN
-    0x854F4B454C61746ELLU, // pkb_Latn_KE
-    0x994F50474C61746ELLU, // pkg_Latn_PG
-    0x9D4F42444C61746ELLU, // pkh_Latn_BD
-    0xB54F41554C61746ELLU, // pkn_Latn_AU
-    0xB94F4B454C61746ELLU, // pko_Latn_KE
-    0xBD4F434B4C61746ELLU, // pkp_Latn_CK
-    0xC54F494E4D6C796DLLU, // pkr_Mlym_IN
-    0xD14F49444C61746ELLU, // pku_Latn_ID
-    0x706C504C4C61746ELLU, // pl_Latn_PL
-    0x816F50474C61746ELLU, // pla_Latn_PG
-    0x856F56554C61746ELLU, // plb_Latn_VU
-    0x896F50484C61746ELLU, // plc_Latn_PH
-    0x8D6F47424C61746ELLU, // pld_Latn_GB
-    0x916F49444C61746ELLU, // ple_Latn_ID
-    0x996F41524C61746ELLU, // plg_Latn_AR
-    0x9D6F49444C61746ELLU, // plh_Latn_ID
-    0xA96F504B41726162LLU, // plk_Arab_PK
-    0xAD6F4D4D4D796D72LLU, // pll_Mymr_MM
-    0xB56F434F4C61746ELLU, // pln_Latn_CO
-    0xB96F4D584C61746ELLU, // plo_Latn_MX
-    0xC56F43494C61746ELLU, // plr_Latn_CI
-    0xC96F4D584C61746ELLU, // pls_Latn_MX
-    0xD16F42524C61746ELLU, // plu_Latn_BR
-    0xD56F50484C61746ELLU, // plv_Latn_PH
-    0xD96F50484C61746ELLU, // plw_Latn_PH
-    0xE56F4D594C61746ELLU, // plz_Latn_MY
-    0x818F56554C61746ELLU, // pma_Latn_VU
-    0x858F43444C61746ELLU, // pmb_Latn_CD
-    0x8D8F41554C61746ELLU, // pmd_Latn_AU
-    0x918F4E434C61746ELLU, // pme_Latn_NC
-    0x958F49444C61746ELLU, // pmf_Latn_ID
-    0x9D8F494E42726168LLU, // pmh_Brah_IN
-    0xA18F434E4C61746ELLU, // pmi_Latn_CN
-    0xA58F434E4C61746ELLU, // pmj_Latn_CN
-    0xAD8F544E4C61746ELLU, // pml_Latn_TN
-    0xB18F434D4C61746ELLU, // pmm_Latn_CM
-    0xB58F434D4C61746ELLU, // pmn_Latn_CM
-    0xB98F49444C61746ELLU, // pmo_Latn_ID
-    0xC18F4D584C61746ELLU, // pmq_Latn_MX
-    0xC58F50474C61746ELLU, // pmr_Latn_PG
-    0xC98F49544C61746ELLU, // pms_Latn_IT
-    0xCD8F50464C61746ELLU, // pmt_Latn_PF
-    0xD98F55534C61746ELLU, // pmw_Latn_US
-    0xDD8F494E4C61746ELLU, // pmx_Latn_IN
-    0xE18F49444C61746ELLU, // pmy_Latn_ID
-    0xE58F4D584C61746ELLU, // pmz_Latn_MX
-    0x81AF4D594C61746ELLU, // pna_Latn_MY
-    0x89AF49444C61746ELLU, // pnc_Latn_ID
-    0x8DAF414F4C61746ELLU, // pnd_Latn_AO
-    0x91AF4D594C61746ELLU, // pne_Latn_MY
-    0x99AF4E474C61746ELLU, // png_Latn_NG
-    0x9DAF434B4C61746ELLU, // pnh_Latn_CK
-    0xA1AF49444C61746ELLU, // pni_Latn_ID
-    0xA5AF41554C61746ELLU, // pnj_Latn_AU
-    0xA9AF424F4C61746ELLU, // pnk_Latn_BO
-    0xADAF42464C61746ELLU, // pnl_Latn_BF
-    0xB1AF4D594C61746ELLU, // pnm_Latn_MY
-    0xB5AF50474C61746ELLU, // pnn_Latn_PG
-    0xB9AF50454C61746ELLU, // pno_Latn_PE
-    0xBDAF49444C61746ELLU, // pnp_Latn_ID
-    0xC1AF42464C61746ELLU, // pnq_Latn_BF
-    0xC5AF50474C61746ELLU, // pnr_Latn_PG
-    0xC9AF49444C61746ELLU, // pns_Latn_ID
-    0xCDAF47524772656BLLU, // pnt_Grek_GR
-    0xD5AF41554C61746ELLU, // pnv_Latn_AU
-    0xD9AF41554C61746ELLU, // pnw_Latn_AU
-    0xE1AF434D4C61746ELLU, // pny_Latn_CM
-    0xE5AF43464C61746ELLU, // pnz_Latn_CF
-    0x89CF47544C61746ELLU, // poc_Latn_GT
-    0x91CF4D584C61746ELLU, // poe_Latn_MX
-    0x95CF43444C61746ELLU, // pof_Latn_CD
-    0x99CF42524C61746ELLU, // pog_Latn_BR
-    0x9DCF47544C61746ELLU, // poh_Latn_GT
-    0xA1CF4D584C61746ELLU, // poi_Latn_MX
-    0xA9CF42524C61746ELLU, // pok_Latn_BR
-    0xB1CF55534C61746ELLU, // pom_Latn_US
-    0xB5CF464D4C61746ELLU, // pon_Latn_FM
-    0xB9CF55534C61746ELLU, // poo_Latn_US
-    0xBDCF4E434C61746ELLU, // pop_Latn_NC
-    0xC1CF4D584C61746ELLU, // poq_Latn_MX
-    0xC9CF4D584C61746ELLU, // pos_Latn_MX
-    0xCDCF55534C61746ELLU, // pot_Latn_US
-    0xD5CF47574C61746ELLU, // pov_Latn_GW
-    0xD9CF4D584C61746ELLU, // pow_Latn_MX
-    0xE1CF545A4C61746ELLU, // poy_Latn_TZ
-    0x91EF50474C61746ELLU, // ppe_Latn_PG
-    0xA1EF4D584C61746ELLU, // ppi_Latn_MX
-    0xA9EF49444C61746ELLU, // ppk_Latn_ID
-    0xADEF53564C61746ELLU, // ppl_Latn_SV
-    0xB1EF49444C61746ELLU, // ppm_Latn_ID
-    0xB5EF50474C61746ELLU, // ppn_Latn_PG
-    0xB9EF50474C61746ELLU, // ppo_Latn_PG
-    0xBDEF43444C61746ELLU, // ppp_Latn_CD
-    0xC1EF50474C61746ELLU, // ppq_Latn_PG
-    0xC9EF4D584C61746ELLU, // pps_Latn_MX
-    0xCDEF50474C61746ELLU, // ppt_Latn_PG
-    0x820F4E474C61746ELLU, // pqa_Latn_NG
-    0xB20F43414C61746ELLU, // pqm_Latn_CA
-    0x822F504B4B686172LLU, // pra_Khar_PK
-    0x8A2F414641726162LLU, // prc_Arab_AF
-    0x8E2F495241726162LLU, // prd_Arab_IR
-    0x922F53544C61746ELLU, // pre_Latn_ST
-    0x962F50484C61746ELLU, // prf_Latn_PH
-    0x9A2F504C4C61746ELLU, // prg_Latn_PL
-    0x9E2F50484C61746ELLU, // prh_Latn_PH
-    0xA22F4E434C61746ELLU, // pri_Latn_NC
-    0xAA2F4D4D4C61746ELLU, // prk_Latn_MM
-    0xB22F50474C61746ELLU, // prm_Latn_PG
-    0xBA2F46524C61746ELLU, // pro_Latn_FR
-    0xC22F50454C61746ELLU, // prq_Latn_PE
-    0xC62F42524C61746ELLU, // prr_Latn_BR
-    0xCE2F544854686169LLU, // prt_Thai_TH
-    0xD22F49444C61746ELLU, // pru_Latn_ID
-    0xDA2F50474C61746ELLU, // prw_Latn_PG
-    0xDE2F494E41726162LLU, // prx_Arab_IN
-    0x7073414641726162LLU, // ps_Arab_AF
-    0x824F49444C61746ELLU, // psa_Latn_ID
-    0x924F49444C61746ELLU, // pse_Latn_ID
-    0x9E4F414641726162LLU, // psh_Arab_AF
-    0xA24F414641726162LLU, // psi_Arab_AF
-    0xB24F424F4C61746ELLU, // psm_Latn_BO
-    0xB64F49444C61746ELLU, // psn_Latn_ID
-    0xC24F50474C61746ELLU, // psq_Latn_PG
-    0xCA4F50474C61746ELLU, // pss_Latn_PG
-    0xCE4F504B41726162LLU, // pst_Arab_PK
-    0xD24F494E42726168LLU, // psu_Brah_IN
-    0xDA4F56554C61746ELLU, // psw_Latn_VU
-    0x707442524C61746ELLU, // pt_Latn_BR
-    0x826F50594C61746ELLU, // pta_Latn_PY
-    0x9E6F42524C61746ELLU, // pth_Latn_BR
-    0xA26F41554C61746ELLU, // pti_Latn_AU
-    0xB66F49444C61746ELLU, // ptn_Latn_ID
-    0xBA6F42524C61746ELLU, // pto_Latn_BR
-    0xBE6F50474C61746ELLU, // ptp_Latn_PG
-    0xC66F56554C61746ELLU, // ptr_Latn_VU
-    0xCE6F49444C61746ELLU, // ptt_Latn_ID
-    0xD26F49444C61746ELLU, // ptu_Latn_ID
-    0xD66F56554C61746ELLU, // ptv_Latn_VU
-    0x828F4D584C61746ELLU, // pua_Latn_MX
-    0x868F494E4C61746ELLU, // pub_Latn_IN
-    0x8A8F49444C61746ELLU, // puc_Latn_ID
-    0x8E8F49444C61746ELLU, // pud_Latn_ID
-    0x928F41524C61746ELLU, // pue_Latn_AR
-    0x968F49444C61746ELLU, // puf_Latn_ID
-    0x9A8F42464C61746ELLU, // pug_Latn_BF
-    0xA28F434F4C61746ELLU, // pui_Latn_CO
-    0xA68F49444C61746ELLU, // puj_Latn_ID
-    0xB28F4E5044657661LLU, // pum_Deva_NP
-    0xBA8F564E4C61746ELLU, // puo_Latn_VN
-    0xBE8F50474C61746ELLU, // pup_Latn_PG
-    0xC28F424F4C61746ELLU, // puq_Latn_BO
-    0xC68F42524C61746ELLU, // pur_Latn_BR
-    0xCE8F49444C61746ELLU, // put_Latn_ID
-    0xD28F47414C61746ELLU, // puu_Latn_GA
-    0xDA8F464D4C61746ELLU, // puw_Latn_FM
-    0xDE8F50474C61746ELLU, // pux_Latn_PG
-    0xE28F55534C61746ELLU, // puy_Latn_US
-    0x82CF50474C61746ELLU, // pwa_Latn_PG
-    0x86CF4E474C61746ELLU, // pwb_Latn_NG
-    0x9ACF50474C61746ELLU, // pwg_Latn_PG
-    0xB2CF50484C61746ELLU, // pwm_Latn_PH
-    0xB6CF54574C61746ELLU, // pwn_Latn_TW
-    0xBACF4D4D4D796D72LLU, // pwo_Mymr_MM
-    0xC6CF494E44657661LLU, // pwr_Deva_IN
-    0xDACF544854686169LLU, // pww_Thai_TH
-    0xB2EF4D584C61746ELLU, // pxm_Latn_MX
-    0x930F43494C61746ELLU, // pye_Latn_CI
-    0xB30F4E474C61746ELLU, // pym_Latn_NG
-    0xB70F42524C61746ELLU, // pyn_Latn_BR
-    0xD30F54574C61746ELLU, // pyu_Latn_TW
-    0xDF0F4D4D4D796D72LLU, // pyx_Mymr_MM
-    0xE30F4D4D4C61746ELLU, // pyy_Latn_MM
-    0x932F4E474C61746ELLU, // pze_Latn_NG
-    0x9F2F54574C61746ELLU, // pzh_Latn_TW
-    0xB72F4D4D4C61746ELLU, // pzn_Latn_MM
-    0x717550454C61746ELLU, // qu_Latn_PE
-    0x829055534C61746ELLU, // qua_Latn_US
-    0x869050454C61746ELLU, // qub_Latn_PE
-    0x8A9047544C61746ELLU, // quc_Latn_GT
-    0x8E9045434C61746ELLU, // qud_Latn_EC
-    0x969050454C61746ELLU, // quf_Latn_PE
-    0x9A9045434C61746ELLU, // qug_Latn_EC
-    0xA29055534C61746ELLU, // qui_Latn_US
-    0xAA9050454C61746ELLU, // quk_Latn_PE
-    0xAE90424F4C61746ELLU, // qul_Latn_BO
-    0xB29047544C61746ELLU, // qum_Latn_GT
-    0xB69055534C61746ELLU, // qun_Latn_US
-    0xBE9050454C61746ELLU, // qup_Latn_PE
-    0xC29045534C61746ELLU, // quq_Latn_ES
-    0xC69050454C61746ELLU, // qur_Latn_PE
-    0xCA9041524C61746ELLU, // qus_Latn_AR
-    0xD69047544C61746ELLU, // quv_Latn_GT
-    0xDA9045434C61746ELLU, // quw_Latn_EC
-    0xDE9050454C61746ELLU, // qux_Latn_PE
-    0xE29050454C61746ELLU, // quy_Latn_PE
-    0x82B050454C61746ELLU, // qva_Latn_PE
-    0x8AB050454C61746ELLU, // qvc_Latn_PE
-    0x92B050454C61746ELLU, // qve_Latn_PE
-    0x9EB050454C61746ELLU, // qvh_Latn_PE
-    0xA2B045434C61746ELLU, // qvi_Latn_EC
-    0xA6B045434C61746ELLU, // qvj_Latn_EC
-    0xAEB050454C61746ELLU, // qvl_Latn_PE
-    0xB2B050454C61746ELLU, // qvm_Latn_PE
-    0xB6B050454C61746ELLU, // qvn_Latn_PE
-    0xBAB050454C61746ELLU, // qvo_Latn_PE
-    0xBEB050454C61746ELLU, // qvp_Latn_PE
-    0xCAB050454C61746ELLU, // qvs_Latn_PE
-    0xDAB050454C61746ELLU, // qvw_Latn_PE
-    0xE6B045434C61746ELLU, // qvz_Latn_EC
-    0x82D050454C61746ELLU, // qwa_Latn_PE
-    0x8AD050454C61746ELLU, // qwc_Latn_PE
-    0x9ED050454C61746ELLU, // qwh_Latn_PE
-    0xB2D048554C61746ELLU, // qwm_Latn_HU
-    0xCAD050454C61746ELLU, // qws_Latn_PE
-    0xCED055534C61746ELLU, // qwt_Latn_US
-    0x82F050454C61746ELLU, // qxa_Latn_PE
-    0x8AF050454C61746ELLU, // qxc_Latn_PE
-    0x9EF050454C61746ELLU, // qxh_Latn_PE
-    0xAEF045434C61746ELLU, // qxl_Latn_EC
-    0xB6F050454C61746ELLU, // qxn_Latn_PE
-    0xBAF050454C61746ELLU, // qxo_Latn_PE
-    0xBEF050454C61746ELLU, // qxp_Latn_PE
-    0xC2F0495241726162LLU, // qxq_Arab_IR
-    0xC6F045434C61746ELLU, // qxr_Latn_EC
-    0xCEF050454C61746ELLU, // qxt_Latn_PE
-    0xD2F050454C61746ELLU, // qxu_Latn_PE
-    0xDAF050454C61746ELLU, // qxw_Latn_PE
-    0xBF1055534C61746ELLU, // qyp_Latn_US
-    0x80114E5044657661LLU, // raa_Deva_NP
-    0x84114E5044657661LLU, // rab_Deva_NP
-    0x881149444C61746ELLU, // rac_Latn_ID
-    0x8C11564E4C61746ELLU, // rad_Latn_VN
-    0x94114E5044657661LLU, // raf_Deva_NP
-    0x98114B454C61746ELLU, // rag_Latn_KE
-    0x9C11494E42656E67LLU, // rah_Beng_IN
-    0xA01150474C61746ELLU, // rai_Latn_PG
-    0xA411494E44657661LLU, // raj_Deva_IN
-    0xA81150474C61746ELLU, // rak_Latn_PG
-    0xB01142524C61746ELLU, // ram_Latn_BR
-    0xB41149444C61746ELLU, // ran_Latn_ID
-    0xB81150474C61746ELLU, // rao_Latn_PG
-    0xBC11434C4C61746ELLU, // rap_Latn_CL
-    0xC411434B4C61746ELLU, // rar_Latn_CK
-    0xD4114E5044657661LLU, // rav_Deva_NP
-    0xD8114D4D4C61746ELLU, // raw_Latn_MM
-    0xDC114E474C61746ELLU, // rax_Latn_NG
-    0xE01150464C61746ELLU, // ray_Latn_PF
-    0xE41149444C61746ELLU, // raz_Latn_ID
-    0x84314D4D4D796D72LLU, // rbb_Mymr_MM
-    0xA83150484C61746ELLU, // rbk_Latn_PH
-    0xAC3150484C61746ELLU, // rbl_Latn_PH
-    0xBC3141554C61746ELLU, // rbp_Latn_AU
-    0x945152454C61746ELLU, // rcf_Latn_RE
-    0x8471495241726162LLU, // rdb_Arab_IR
-    0x809150474C61746ELLU, // rea_Latn_PG
-    0x849149444C61746ELLU, // reb_Latn_ID
-    0x90914D594C61746ELLU, // ree_Latn_MY
-    0x9891545A4C61746ELLU, // reg_Latn_TZ
-    0xA091494E4F727961LLU, // rei_Orya_IN
-    0xA49149444C61746ELLU, // rej_Latn_ID
-    0xAC914B454C61746ELLU, // rel_Latn_KE
-    0xB09150454C61746ELLU, // rem_Latn_PE
-    0xB491564E4C61746ELLU, // ren_Latn_VN
-    0xC8914E474C61746ELLU, // res_Latn_NG
-    0xCC9149444C61746ELLU, // ret_Latn_ID
-    0xE091424F4C61746ELLU, // rey_Latn_BO
-    0x80D156554C61746ELLU, // rga_Latn_VU
-    0xB4D149544C61746ELLU, // rgn_Latn_IT
-    0xC4D150454C61746ELLU, // rgr_Latn_PE
-    0xC8D1564E4C61746ELLU, // rgs_Latn_VN
-    0xD0D149444C61746ELLU, // rgu_Latn_ID
-    0x98F14D4D526F6867LLU, // rhg_Rohg_MM
-    0xBCF150474C61746ELLU, // rhp_Latn_PG
-    0x8111494E4C61746ELLU, // ria_Latn_IN
-    0x95114D414C61746ELLU, // rif_Latn_MA
-    0xAD114D4D4C61746ELLU, // ril_Latn_MM
-    0xB111545A4C61746ELLU, // rim_Latn_TZ
-    0xB5114E474C61746ELLU, // rin_Latn_NG
-    0xC51149444C61746ELLU, // rir_Latn_ID
-    0xCD1141554C61746ELLU, // rit_Latn_AU
-    0xD11149444C61746ELLU, // riu_Latn_ID
-    0x993149444C61746ELLU, // rjg_Latn_ID
-    0xA1314E5044657661LLU, // rji_Deva_NP
-    0xC9314E5044657661LLU, // rjs_Deva_NP
-    0x81514B484B686D72LLU, // rka_Khmr_KH
-    0x855142524C61746ELLU, // rkb_Latn_BR
-    0x9D51434B4C61746ELLU, // rkh_Latn_CK
-    0xA1514D4D4D796D72LLU, // rki_Mymr_MM
-    0xB15142464C61746ELLU, // rkm_Latn_BF
-    0xCD51424442656E67LLU, // rkt_Beng_BD
-    0xD95141554C61746ELLU, // rkw_Latn_AU
-    0x726D43484C61746ELLU, // rm_Latn_CH
-    0x81914E494C61746ELLU, // rma_Latn_NI
-    0x859141554C61746ELLU, // rmb_Latn_AU
-    0x8991534B4C61746ELLU, // rmc_Latn_SK
-    0x8D91444B4C61746ELLU, // rmd_Latn_DK
-    0x919147424C61746ELLU, // rme_Latn_GB
-    0x959146494C61746ELLU, // rmf_Latn_FI
-    0x99914E4F4C61746ELLU, // rmg_Latn_NO
-    0x9D9149444C61746ELLU, // rmh_Latn_ID
-    0xA191414D41726D6ELLU, // rmi_Armn_AM
-    0xA99150474C61746ELLU, // rmk_Latn_PG
-    0xAD91504C4C61746ELLU, // rml_Latn_PL
-    0xB19149444C61746ELLU, // rmm_Latn_ID
-    0xB59152534C61746ELLU, // rmn_Latn_RS
-    0xB99143484C61746ELLU, // rmo_Latn_CH
-    0xBD9150474C61746ELLU, // rmp_Latn_PG
-    0xC19145534C61746ELLU, // rmq_Latn_ES
-    0xCD91495241726162LLU, // rmt_Arab_IR
-    0xD19153454C61746ELLU, // rmu_Latn_SE
-    0xD99147424C61746ELLU, // rmw_Latn_GB
-    0xDD91564E4C61746ELLU, // rmx_Latn_VN
-    0xE591494E4D796D72LLU, // rmz_Mymr_IN
-    0x726E42494C61746ELLU, // rn_Latn_BI
-    0x8DB143444C61746ELLU, // rnd_Latn_CD
-    0x99B14D5A4C61746ELLU, // rng_Latn_MZ
-    0xADB1494E4C61746ELLU, // rnl_Latn_IN
-    0xB5B149444C61746ELLU, // rnn_Latn_ID
-    0xC5B141554C61746ELLU, // rnr_Latn_AU
-    0xD9B1545A4C61746ELLU, // rnw_Latn_TZ
-    0x726F524F4C61746ELLU, // ro_Latn_RO
-    0x85D149444C61746ELLU, // rob_Latn_ID
-    0x89D1564E4C61746ELLU, // roc_Latn_VN
-    0x8DD14E474C61746ELLU, // rod_Latn_NG
-    0x91D150474C61746ELLU, // roe_Latn_PG
-    0x95D1545A4C61746ELLU, // rof_Latn_TZ
-    0x99D1564E4C61746ELLU, // rog_Latn_VN
-    0xADD150484C61746ELLU, // rol_Latn_PH
-    0xB1D1524F4C61746ELLU, // rom_Latn_RO
-    0xB9D150474C61746ELLU, // roo_Latn_PG
-    0xBDD141554C61746ELLU, // rop_Latn_AU
-    0xC5D149444C61746ELLU, // ror_Latn_ID
-    0xD1D154444C61746ELLU, // rou_Latn_TD
-    0xD9D149444C61746ELLU, // row_Latn_ID
-    0xB5F156554C61746ELLU, // rpn_Latn_VU
-    0xCDF150474C61746ELLU, // rpt_Latn_PG
-    0xA23153424C61746ELLU, // rri_Latn_SB
-    0xB2314E5A4C61746ELLU, // rrm_Latn_NZ
-    0xBA3150474C61746ELLU, // rro_Latn_PG
-    0xCE3141554C61746ELLU, // rrt_Latn_AU
-    0xAA5152534379726CLLU, // rsk_Cyrl_RS
-    0xDA514E474C61746ELLU, // rsw_Latn_NG
-    0x8A714D4D4C61746ELLU, // rtc_Latn_MM
-    0x9E7149444C61746ELLU, // rth_Latn_ID
-    0xB271464A4C61746ELLU, // rtm_Latn_FJ
-    0xDA71494E44657661LLU, // rtw_Deva_IN
-    0x727552554379726CLLU, // ru_Cyrl_RU
-    0x869155474C61746ELLU, // rub_Latn_UG
-    0x8A9155474C61746ELLU, // ruc_Latn_UG
-    0x929155414379726CLLU, // rue_Cyrl_UA
-    0x9691545A4C61746ELLU, // ruf_Latn_TZ
-    0x9A9153424C61746ELLU, // rug_Latn_SB
-    0xA291545A4C61746ELLU, // rui_Latn_TZ
-    0xAA914E474C61746ELLU, // ruk_Latn_NG
-    0xBA9148524C61746ELLU, // ruo_Latn_HR
-    0xBE91524F4C61746ELLU, // rup_Latn_RO
-    0xC29147524C61746ELLU, // ruq_Latn_GR
-    0xCE9152554379726CLLU, // rut_Cyrl_RU
-    0xD2914D594C61746ELLU, // ruu_Latn_MY
-    0xE2914E474C61746ELLU, // ruy_Latn_NG
-    0xE6914E474C61746ELLU, // ruz_Latn_NG
-    0x727752574C61746ELLU, // rw_Latn_RW
-    0x82D150474C61746ELLU, // rwa_Latn_PG
-    0xAAD1545A4C61746ELLU, // rwk_Latn_TZ
-    0xAED1545A4C61746ELLU, // rwl_Latn_TZ
-    0xB2D155474C61746ELLU, // rwm_Latn_UG
-    0xBAD150474C61746ELLU, // rwo_Latn_PG
-    0xC6D1494E44657661LLU, // rwr_Deva_IN
-    0x8EF141554C61746ELLU, // rxd_Latn_AU
-    0xDAF141554C61746ELLU, // rxw_Latn_AU
-    0xD3114A504B616E61LLU, // ryu_Kana_JP
-    0x7361494E44657661LLU, // sa_Deva_IN
-    0x801254444C61746ELLU, // saa_Latn_TD
-    0x841250414C61746ELLU, // sab_Latn_PA
-    0x881255534C61746ELLU, // sac_Latn_US
-    0x8C12545A4C61746ELLU, // sad_Latn_TZ
-    0x901242524C61746ELLU, // sae_Latn_BR
-    0x941247484C61746ELLU, // saf_Latn_GH
-    0x9C1252554379726CLLU, // sah_Cyrl_RU
-    0xA41249444C61746ELLU, // saj_Latn_ID
-    0xA81247414C61746ELLU, // sak_Latn_GA
-    0xB012505353616D72LLU, // sam_Samr_PS
-    0xB81249444C61746ELLU, // sao_Latn_ID
-    0xC0124B454C61746ELLU, // saq_Latn_KE
-    0xC412424F4C61746ELLU, // sar_Latn_BO
-    0xC81249444C61746ELLU, // sas_Latn_ID
-    0xCC12494E4F6C636BLLU, // sat_Olck_IN
-    0xD01249444C61746ELLU, // sau_Latn_ID
-    0xD412534E4C61746ELLU, // sav_Latn_SN
-    0xD81249444C61746ELLU, // saw_Latn_ID
-    0xDC1256554C61746ELLU, // sax_Latn_VU
-    0xE0124E474C61746ELLU, // say_Latn_NG
-    0xE412494E53617572LLU, // saz_Saur_IN
-    0x803254444C61746ELLU, // sba_Latn_TD
-    0x843253424C61746ELLU, // sbb_Latn_SB
-    0x883250474C61746ELLU, // sbc_Latn_PG
-    0x8C3242464C61746ELLU, // sbd_Latn_BF
-    0x903250474C61746ELLU, // sbe_Latn_PG
-    0x983249444C61746ELLU, // sbg_Latn_ID
-    0x9C3250474C61746ELLU, // sbh_Latn_PG
-    0xA03250474C61746ELLU, // sbi_Latn_PG
-    0xA43254444C61746ELLU, // sbj_Latn_TD
-    0xA832545A4C61746ELLU, // sbk_Latn_TZ
-    0xAC3250484C61746ELLU, // sbl_Latn_PH
-    0xB032545A4C61746ELLU, // sbm_Latn_TZ
-    0xB432504B41726162LLU, // sbn_Arab_PK
-    0xB8324D594C61746ELLU, // sbo_Latn_MY
-    0xBC32545A4C61746ELLU, // sbp_Latn_TZ
-    0xC03250474C61746ELLU, // sbq_Latn_PG
-    0xC43249444C61746ELLU, // sbr_Latn_ID
-    0xC8324E414C61746ELLU, // sbs_Latn_NA
-    0xCC3249444C61746ELLU, // sbt_Latn_ID
-    0xD032494E54696274LLU, // sbu_Tibt_IN
-    0xD43249544C61746ELLU, // sbv_Latn_IT
-    0xD83247414C61746ELLU, // sbw_Latn_GA
-    0xDC3249444C61746ELLU, // sbx_Latn_ID
-    0xE0325A4D4C61746ELLU, // sby_Latn_ZM
-    0xE43243464C61746ELLU, // sbz_Latn_CF
-    0x736349544C61746ELLU, // sc_Latn_IT
-    0x8452564E4C61746ELLU, // scb_Latn_VN
-    0x9052434E4C61746ELLU, // sce_Latn_CN
-    0x945250414C61746ELLU, // scf_Latn_PA
-    0x985249444C61746ELLU, // scg_Latn_ID
-    0x9C52494E4C61746ELLU, // sch_Latn_IN
-    0xA0524C4B4C61746ELLU, // sci_Latn_LK
-    0xA852494E44657661LLU, // sck_Deva_IN
-    0xAC52504B41726162LLU, // scl_Arab_PK
-    0xB45249544C61746ELLU, // scn_Latn_IT
-    0xB85247424C61746ELLU, // sco_Latn_GB
-    0xBC524E5044657661LLU, // scp_Deva_NP
-    0xC85243414C61746ELLU, // scs_Latn_CA
-    0xCC524C414C616F6FLLU, // sct_Laoo_LA
-    0xD052494E54616B72LLU, // scu_Takr_IN
-    0xD4524E474C61746ELLU, // scv_Latn_NG
-    0xD8524E474C61746ELLU, // scw_Latn_NG
-    0xDC5249544772656BLLU, // scx_Grek_IT
-    0x7364504B41726162LLU, // sd_Arab_PK
-    0x7364494E44657661LLU, // sd_Deva_IN
-    0x7364494E4B686F6ALLU, // sd_Khoj_IN
-    0x7364494E53696E64LLU, // sd_Sind_IN
-    0x807249444C61746ELLU, // sda_Latn_ID
-    0x8472495141726162LLU, // sdb_Arab_IQ
-    0x887249544C61746ELLU, // sdc_Latn_IT
-    0x90724E474C61746ELLU, // sde_Latn_NG
-    0x9472495141726162LLU, // sdf_Arab_IQ
-    0x9872414641726162LLU, // sdg_Arab_AF
-    0x9C72495241726162LLU, // sdh_Arab_IR
-    0xA47243474C61746ELLU, // sdj_Latn_CG
-    0xA87250474C61746ELLU, // sdk_Latn_PG
-    0xB47249544C61746ELLU, // sdn_Latn_IT
-    0xB8724D594C61746ELLU, // sdo_Latn_MY
-    0xC07249444C61746ELLU, // sdq_Latn_ID
-    0xC472424442656E67LLU, // sdr_Beng_BD
-    0xC872544E41726162LLU, // sds_Arab_TN
-    0xD07249444C61746ELLU, // sdu_Latn_ID
-    0xDC724D594C61746ELLU, // sdx_Latn_MY
-    0x73654E4F4C61746ELLU, // se_Latn_NO
-    0x80924D594C61746ELLU, // sea_Latn_MY
-    0x849243494C61746ELLU, // seb_Latn_CI
-    0x889243414C61746ELLU, // sec_Latn_CA
-    0x8C92564E4C61746ELLU, // sed_Latn_VN
-    0x909255534C61746ELLU, // see_Latn_US
-    0x949243494C61746ELLU, // sef_Latn_CI
-    0x9892545A4C61746ELLU, // seg_Latn_TZ
-    0x9C924D5A4C61746ELLU, // seh_Latn_MZ
-    0xA0924D584C61746ELLU, // sei_Latn_MX
-    0xA49250474C61746ELLU, // sej_Latn_PG
-    0xA89243414C61746ELLU, // sek_Latn_CA
-    0xAC9252554379726CLLU, // sel_Cyrl_RU
-    0xB49242464C61746ELLU, // sen_Latn_BF
-    0xB89250474C61746ELLU, // seo_Latn_PG
-    0xBC9242464C61746ELLU, // sep_Latn_BF
-    0xC09242464C61746ELLU, // seq_Latn_BF
-    0xC49255534C61746ELLU, // ser_Latn_US
-    0xC8924D4C4C61746ELLU, // ses_Latn_ML
-    0xCC9249444C61746ELLU, // set_Latn_ID
-    0xD09249444C61746ELLU, // seu_Latn_ID
-    0xD49243494C61746ELLU, // sev_Latn_CI
-    0xD89250474C61746ELLU, // sew_Latn_PG
-    0xE09245434C61746ELLU, // sey_Latn_EC
-    0xE4924D4D4C61746ELLU, // sez_Latn_MM
-    0x90B250484C61746ELLU, // sfe_Latn_PH
-    0xB0B2434E506C7264LLU, // sfm_Plrd_CN
-    0xD8B247484C61746ELLU, // sfw_Latn_GH
-    0x736743464C61746ELLU, // sg_Latn_CF
-    0x80D249454F67616DLLU, // sga_Ogam_IE
-    0x84D250484C61746ELLU, // sgb_Latn_PH
-    0x88D24B454C61746ELLU, // sgc_Latn_KE
-    0x8CD250484C61746ELLU, // sgd_Latn_PH
-    0x90D249444C61746ELLU, // sge_Latn_ID
-    0x9CD2544A4379726CLLU, // sgh_Cyrl_TJ
-    0xA0D2434D4C61746ELLU, // sgi_Latn_CM
-    0xA4D2494E44657661LLU, // sgj_Deva_IN
-    0xB0D24B454C61746ELLU, // sgm_Latn_KE
-    0xBCD2494E4C61746ELLU, // sgp_Latn_IN
-    0xC4D2495241726162LLU, // sgr_Arab_IR
-    0xC8D24C544C61746ELLU, // sgs_Latn_LT
-    0xCCD2425454696274LLU, // sgt_Tibt_BT
-    0xD0D249444C61746ELLU, // sgu_Latn_ID
-    0xD8D2455445746869LLU, // sgw_Ethi_ET
-    0xE0D2414641726162LLU, // sgy_Arab_AF
-    0xE4D250474C61746ELLU, // sgz_Latn_PG
-    0x80F24E474C61746ELLU, // sha_Latn_NG
-    0x84F242524C61746ELLU, // shb_Latn_BR
-    0x88F243444C61746ELLU, // shc_Latn_CD
-    0x8CF2504B41726162LLU, // shd_Arab_PK
-    0x90F245544C61746ELLU, // she_Latn_ET
-    0x98F242574C61746ELLU, // shg_Latn_BW
-    0x9CF255534C61746ELLU, // shh_Latn_US
-    0xA0F24D4154666E67LLU, // shi_Tfng_MA
-    0xA4F253444C61746ELLU, // shj_Latn_SD
-    0xA8F253534C61746ELLU, // shk_Latn_SS
-    0xB0F2495241726162LLU, // shm_Arab_IR
-    0xB4F24D4D4D796D72LLU, // shn_Mymr_MM
-    0xB8F24E474C61746ELLU, // sho_Latn_NG
-    0xBCF250454C61746ELLU, // shp_Latn_PE
-    0xC0F25A4D4C61746ELLU, // shq_Latn_ZM
-    0xC4F243444C61746ELLU, // shr_Latn_CD
-    0xC8F243414C61746ELLU, // shs_Latn_CA
-    0xCCF255534C61746ELLU, // sht_Latn_US
-    0xD0F2544441726162LLU, // shu_Arab_TD
-    0xD4F24F4D41726162LLU, // shv_Arab_OM
-    0xD8F253444C61746ELLU, // shw_Latn_SD
-    0xE0F2445A4C61746ELLU, // shy_Latn_DZ
-    0xE4F24D4C4C61746ELLU, // shz_Latn_ML
-    0x73694C4B53696E68LLU, // si_Sinh_LK
-    0x811252554379726CLLU, // sia_Cyrl_RU
-    0x85124D594C61746ELLU, // sib_Latn_MY
-    0x8D1245544C61746ELLU, // sid_Latn_ET
-    0x91125A4D4C61746ELLU, // sie_Latn_ZM
-    0x951242464C61746ELLU, // sif_Latn_BF
-    0x991247484C61746ELLU, // sig_Latn_GH
-    0x9D124E434C61746ELLU, // sih_Latn_NC
-    0xA112494E4C61746ELLU, // sii_Latn_IN
-    0xA51250474C61746ELLU, // sij_Latn_PG
-    0xA91242524C61746ELLU, // sik_Latn_BR
-    0xAD1247484C61746ELLU, // sil_Latn_GH
-    0xB11250474C61746ELLU, // sim_Latn_PG
-    0xBD12494E54696274LLU, // sip_Tibt_IN
-    0xC11250474C61746ELLU, // siq_Latn_PG
-    0xC5124E474C61746ELLU, // sir_Latn_NG
-    0xC91255534C61746ELLU, // sis_Latn_US
-    0xD11250474C61746ELLU, // siu_Latn_PG
-    0xD51250474C61746ELLU, // siv_Latn_PG
-    0xD91250474C61746ELLU, // siw_Latn_PG
-    0xDD1250474C61746ELLU, // six_Latn_PG
-    0xE112495241726162LLU, // siy_Arab_IR
-    0xE512454741726162LLU, // siz_Arab_EG
-    0x8132434F4C61746ELLU, // sja_Latn_CO
-    0x853249444C61746ELLU, // sjb_Latn_ID
-    0x8D3252554379726CLLU, // sjd_Cyrl_RU
-    0x913253454C61746ELLU, // sje_Latn_SE
-    0x993254444C61746ELLU, // sjg_Latn_TD
-    0xAD32494E4C61746ELLU, // sjl_Latn_IN
-    0xB13250484C61746ELLU, // sjm_Latn_PH
-    0xBD32494E44657661LLU, // sjp_Deva_IN
-    0xC53250474C61746ELLU, // sjr_Latn_PG
-    0xCD3252554379726CLLU, // sjt_Cyrl_RU
-    0xD13253454C61746ELLU, // sju_Latn_SE
-    0xD93255534C61746ELLU, // sjw_Latn_US
-    0x736B534B4C61746ELLU, // sk_Latn_SK
-    0x815255534C61746ELLU, // ska_Latn_US
-    0x8552544854686169LLU, // skb_Thai_TH
-    0x895250474C61746ELLU, // skc_Latn_PG
-    0x8D5255534C61746ELLU, // skd_Latn_US
-    0x915256554C61746ELLU, // ske_Latn_VU
-    0x955242524C61746ELLU, // skf_Latn_BR
-    0x99524D474C61746ELLU, // skg_Latn_MG
-    0x9D5249444C61746ELLU, // skh_Latn_ID
-    0xA15249444C61746ELLU, // ski_Latn_ID
-    0xA5524E5044657661LLU, // skj_Deva_NP
-    0xB15250474C61746ELLU, // skm_Latn_PG
-    0xB55250484C61746ELLU, // skn_Latn_PH
-    0xB95249444C61746ELLU, // sko_Latn_ID
-    0xBD524D594C61746ELLU, // skp_Latn_MY
-    0xC15242464C61746ELLU, // skq_Latn_BF
-    0xC552504B41726162LLU, // skr_Arab_PK
-    0xC95250474C61746ELLU, // sks_Latn_PG
-    0xCD5243444C61746ELLU, // skt_Latn_CD
-    0xD15256554C61746ELLU, // sku_Latn_VU
-    0xD55249444C61746ELLU, // skv_Latn_ID
-    0xD95247594C61746ELLU, // skw_Latn_GY
-    0xDD5249444C61746ELLU, // skx_Latn_ID
-    0xE15253424C61746ELLU, // sky_Latn_SB
-    0xE55249444C61746ELLU, // skz_Latn_ID
-    0x736C53494C61746ELLU, // sl_Latn_SI
-    0x8972434F4C61746ELLU, // slc_Latn_CO
-    0x8D7242464C61746ELLU, // sld_Latn_BF
-    0x997249444C61746ELLU, // slg_Latn_ID
-    0x9D7255534C61746ELLU, // slh_Latn_US
-    0xA172504C4C61746ELLU, // sli_Latn_PL
-    0xA57242524C61746ELLU, // slj_Latn_BR
-    0xAD7250474C61746ELLU, // sll_Latn_PG
-    0xB17250484C61746ELLU, // slm_Latn_PH
-    0xB57255534C61746ELLU, // sln_Latn_US
-    0xBD7249444C61746ELLU, // slp_Latn_ID
-    0xC572434E4C61746ELLU, // slr_Latn_CN
-    0xD17249444C61746ELLU, // slu_Latn_ID
-    0xD97250474C61746ELLU, // slw_Latn_PG
-    0xDD7243444C61746ELLU, // slx_Latn_CD
-    0xE17249444C61746ELLU, // sly_Latn_ID
-    0xE57249444C61746ELLU, // slz_Latn_ID
-    0x736D57534C61746ELLU, // sm_Latn_WS
-    0x819253454C61746ELLU, // sma_Latn_SE
-    0x859250474C61746ELLU, // smb_Latn_PG
-    0x899250474C61746ELLU, // smc_Latn_PG
-    0x959250474C61746ELLU, // smf_Latn_PG
-    0x999250474C61746ELLU, // smg_Latn_PG
-    0x9D92434E59696969LLU, // smh_Yiii_CN
-    0xA59253454C61746ELLU, // smj_Latn_SE
-    0xA99250484C61746ELLU, // smk_Latn_PH
-    0xAD9250484C61746ELLU, // sml_Latn_PH
-    0xB59246494C61746ELLU, // smn_Latn_FI
-    0xBD92494C53616D72LLU, // smp_Samr_IL
-    0xC19250474C61746ELLU, // smq_Latn_PG
-    0xC59249444C61746ELLU, // smr_Latn_ID
-    0xC99246494C61746ELLU, // sms_Latn_FI
-    0xCD92494E4C61746ELLU, // smt_Latn_IN
-    0xD1924B484B686D72LLU, // smu_Khmr_KH
-    0xD99249444C61746ELLU, // smw_Latn_ID
-    0xDD9243444C61746ELLU, // smx_Latn_CD
-    0xE192495241726162LLU, // smy_Arab_IR
-    0xE59250474C61746ELLU, // smz_Latn_PG
-    0x736E5A574C61746ELLU, // sn_Latn_ZW
-    0x89B250474C61746ELLU, // snc_Latn_PG
-    0x91B24D594C61746ELLU, // sne_Latn_MY
-    0x95B2534E4C61746ELLU, // snf_Latn_SN
-    0x99B243444C61746ELLU, // sng_Latn_CD
-    0xA1B250454C61746ELLU, // sni_Latn_PE
-    0xA5B243464C61746ELLU, // snj_Latn_CF
-    0xA9B24D4C4C61746ELLU, // snk_Latn_ML
-    0xADB250484C61746ELLU, // snl_Latn_PH
-    0xB1B255474C61746ELLU, // snm_Latn_UG
-    0xB5B2434F4C61746ELLU, // snn_Latn_CO
-    0xB9B255534C61746ELLU, // sno_Latn_US
-    0xBDB250474C61746ELLU, // snp_Latn_PG
-    0xC1B247414C61746ELLU, // snq_Latn_GA
-    0xC5B250474C61746ELLU, // snr_Latn_PG
-    0xC9B256554C61746ELLU, // sns_Latn_VU
-    0xD1B249444C61746ELLU, // snu_Latn_ID
-    0xD5B24D594C61746ELLU, // snv_Latn_MY
-    0xD9B247484C61746ELLU, // snw_Latn_GH
-    0xDDB250474C61746ELLU, // snx_Latn_PG
-    0xE1B250474C61746ELLU, // sny_Latn_PG
-    0xE5B250474C61746ELLU, // snz_Latn_PG
-    0x736F534F4C61746ELLU, // so_Latn_SO
-    0x81D2544854617674LLU, // soa_Tavt_TH
-    0x85D249444C61746ELLU, // sob_Latn_ID
-    0x89D243444C61746ELLU, // soc_Latn_CD
-    0x8DD243444C61746ELLU, // sod_Latn_CD
-    0x91D243444C61746ELLU, // soe_Latn_CD
-    0x99D2555A536F6764LLU, // sog_Sogd_UZ
-    0xA1D24E5044657661LLU, // soi_Deva_NP
-    0xA9D254444C61746ELLU, // sok_Latn_TD
-    0xADD250474C61746ELLU, // sol_Latn_PG
-    0xB9D243444C61746ELLU, // soo_Latn_CD
-    0xBDD243444C61746ELLU, // sop_Latn_CD
-    0xC1D250474C61746ELLU, // soq_Latn_PG
-    0xC5D254444C61746ELLU, // sor_Latn_TD
-    0xC9D242464C61746ELLU, // sos_Latn_BF
-    0xD1D2544854686169LLU, // sou_Thai_TH
-    0xD5D250574C61746ELLU, // sov_Latn_PW
-    0xD9D250474C61746ELLU, // sow_Latn_PG
-    0xDDD2434D4C61746ELLU, // sox_Latn_CM
-    0xE1D2424A4C61746ELLU, // soy_Latn_BJ
-    0xE5D2545A4C61746ELLU, // soz_Latn_TZ
-    0x85F249444C61746ELLU, // spb_Latn_ID
-    0x89F256454C61746ELLU, // spc_Latn_VE
-    0x8DF250474C61746ELLU, // spd_Latn_PG
-    0x91F250474C61746ELLU, // spe_Latn_PG
-    0x99F24D594C61746ELLU, // spg_Latn_MY
-    0xA1F249444C61746ELLU, // spi_Latn_ID
-    0xA9F250474C61746ELLU, // spk_Latn_PG
-    0xADF250474C61746ELLU, // spl_Latn_PG
-    0xB1F250474C61746ELLU, // spm_Latn_PG
-    0xB5F250594C61746ELLU, // spn_Latn_PY
-    0xB9F255534C61746ELLU, // spo_Latn_US
-    0xBDF24D4C4C61746ELLU, // spp_Latn_ML
-    0xC1F250454C61746ELLU, // spq_Latn_PE
-    0xC5F249444C61746ELLU, // spr_Latn_ID
-    0xC9F250474C61746ELLU, // sps_Latn_PG
-    0xCDF2494E54696274LLU, // spt_Tibt_IN
-    0xD5F2494E4F727961LLU, // spv_Orya_IN
-    0x7371414C4C61746ELLU, // sq_Latn_AL
-    0x82124E474C61746ELLU, // sqa_Latn_NG
-    0x9E124E474C61746ELLU, // sqh_Latn_NG
-    0xB21243464C61746ELLU, // sqm_Latn_CF
-    0xBA12495241726162LLU, // sqo_Arab_IR
-    0xC2124C414C616F6FLLU, // sqq_Laoo_LA
-    0xCE12594541726162LLU, // sqt_Arab_YE
-    0xD21243414C61746ELLU, // squ_Latn_CA
-    0x737252534379726CLLU, // sr_Cyrl_RS
-    0x823250474C61746ELLU, // sra_Latn_PG
-    0x8632494E536F7261LLU, // srb_Sora_IN
-    0x923249444C61746ELLU, // sre_Latn_ID
-    0x963250474C61746ELLU, // srf_Latn_PG
-    0x9A3250484C61746ELLU, // srg_Latn_PH
-    0x9E32434E41726162LLU, // srh_Arab_CN
-    0xA232434F4C61746ELLU, // sri_Latn_CO
-    0xAA324D594C61746ELLU, // srk_Latn_MY
-    0xAE3249444C61746ELLU, // srl_Latn_ID
-    0xB23253524C61746ELLU, // srm_Latn_SR
-    0xB63253524C61746ELLU, // srn_Latn_SR
-    0xBA3249544C61746ELLU, // sro_Latn_IT
-    0xC232424F4C61746ELLU, // srq_Latn_BO
-    0xC632534E4C61746ELLU, // srr_Latn_SN
-    0xCA3243414C61746ELLU, // srs_Latn_CA
-    0xCE3249444C61746ELLU, // srt_Latn_ID
-    0xD23242524C61746ELLU, // sru_Latn_BR
-    0xD63250484C61746ELLU, // srv_Latn_PH
-    0xDA3249444C61746ELLU, // srw_Latn_ID
-    0xDE32494E44657661LLU, // srx_Deva_IN
-    0xE23250474C61746ELLU, // sry_Latn_PG
-    0xE632495241726162LLU, // srz_Arab_IR
-    0x73735A414C61746ELLU, // ss_Latn_ZA
-    0x865250484C61746ELLU, // ssb_Latn_PH
-    0x8A52545A4C61746ELLU, // ssc_Latn_TZ
-    0x8E5250474C61746ELLU, // ssd_Latn_PG
-    0x925250484C61746ELLU, // sse_Latn_PH
-    0x965254574C61746ELLU, // ssf_Latn_TW
-    0x9A5250474C61746ELLU, // ssg_Latn_PG
-    0x9E52414541726162LLU, // ssh_Arab_AE
-    0xA65250474C61746ELLU, // ssj_Latn_PG
-    0xAE5247484C61746ELLU, // ssl_Latn_GH
-    0xB2524D594C61746ELLU, // ssm_Latn_MY
-    0xB6524B454C61746ELLU, // ssn_Latn_KE
-    0xBA5250474C61746ELLU, // sso_Latn_PG
-    0xC25249444C61746ELLU, // ssq_Latn_ID
-    0xCA524C414C616F6FLLU, // sss_Laoo_LA
-    0xCE5250474C61746ELLU, // sst_Latn_PG
-    0xD25250474C61746ELLU, // ssu_Latn_PG
-    0xD65256554C61746ELLU, // ssv_Latn_VU
-    0xDE5250474C61746ELLU, // ssx_Latn_PG
-    0xE25245524C61746ELLU, // ssy_Latn_ER
-    0xE65250474C61746ELLU, // ssz_Latn_PG
-    0x73745A414C61746ELLU, // st_Latn_ZA
-    0x82725A4D4C61746ELLU, // sta_Latn_ZM
-    0x867250484C61746ELLU, // stb_Latn_PH
-    0x927249444C61746ELLU, // ste_Latn_ID
-    0x967250474C61746ELLU, // stf_Latn_PG
-    0x9A72564E4C61746ELLU, // stg_Latn_VN
-    0x9E7249454C61746ELLU, // sth_Latn_IE
-    0xA272564E4C61746ELLU, // sti_Latn_VN
-    0xA67242464C61746ELLU, // stj_Latn_BF
-    0xAA7250474C61746ELLU, // stk_Latn_PG
-    0xAE724E4C4C61746ELLU, // stl_Latn_NL
-    0xB27250474C61746ELLU, // stm_Latn_PG
-    0xB67253424C61746ELLU, // stn_Latn_SB
-    0xBA7243414C61746ELLU, // sto_Latn_CA
-    0xBE724D584C61746ELLU, // stp_Latn_MX
-    0xC27244454C61746ELLU, // stq_Latn_DE
-    0xC67243414C61746ELLU, // str_Latn_CA
-    0xCA72414641726162LLU, // sts_Arab_AF
-    0xCE72564E4C61746ELLU, // stt_Latn_VN
-    0xD672455445746869LLU, // stv_Ethi_ET
-    0xDA72464D4C61746ELLU, // stw_Latn_FM
-    0xE27252554379726CLLU, // sty_Cyrl_RU
-    0x737549444C61746ELLU, // su_Latn_ID
-    0x829250474C61746ELLU, // sua_Latn_PG
-    0x869243444C61746ELLU, // sub_Latn_CD
-    0x8A9250484C61746ELLU, // suc_Latn_PH
-    0x929250474C61746ELLU, // sue_Latn_PG
-    0x9A9250474C61746ELLU, // sug_Latn_PG
-    0xA29250474C61746ELLU, // sui_Latn_PG
-    0xA692545A4C61746ELLU, // suj_Latn_TZ
-    0xAA92545A4C61746ELLU, // suk_Latn_TZ
-    0xBA9250474C61746ELLU, // suo_Latn_PG
-    0xC29245544C61746ELLU, // suq_Latn_ET
-    0xC6924E474C61746ELLU, // sur_Latn_NG
-    0xCA92474E4C61746ELLU, // sus_Latn_GN
-    0xCE924E494C61746ELLU, // sut_Latn_NI
-    0xD692494E4C61746ELLU, // suv_Latn_IN
-    0xDA92545A4C61746ELLU, // suw_Latn_TZ
-    0xE29242524C61746ELLU, // suy_Latn_BR
-    0xE6924E5053756E75LLU, // suz_Sunu_NP
-    0x737653454C61746ELLU, // sv_Latn_SE
-    0x82B2474547656F72LLU, // sva_Geor_GE
-    0x86B250474C61746ELLU, // svb_Latn_PG
-    0x8AB256434C61746ELLU, // svc_Latn_VC
-    0x92B249444C61746ELLU, // sve_Latn_ID
-    0xB2B249544C61746ELLU, // svm_Latn_IT
-    0xCAB253424C61746ELLU, // svs_Latn_SB
-    0x7377545A4C61746ELLU, // sw_Latn_TZ
-    0x86D2595441726162LLU, // swb_Arab_YT
-    0x96D243444C61746ELLU, // swf_Latn_CD
-    0x9AD244454C61746ELLU, // swg_Latn_DE
-    0xA2D2434E48616E69LLU, // swi_Hani_CN
-    0xA6D247414C61746ELLU, // swj_Latn_GA
-    0xAAD24D574C61746ELLU, // swk_Latn_MW
-    0xB2D250474C61746ELLU, // swm_Latn_PG
-    0xBAD242524C61746ELLU, // swo_Latn_BR
-    0xBED250474C61746ELLU, // swp_Latn_PG
-    0xC2D2434D4C61746ELLU, // swq_Latn_CM
-    0xC6D249444C61746ELLU, // swr_Latn_ID
-    0xCAD249444C61746ELLU, // sws_Latn_ID
-    0xCED249444C61746ELLU, // swt_Latn_ID
-    0xD2D249444C61746ELLU, // swu_Latn_ID
-    0xD6D2494E44657661LLU, // swv_Deva_IN
-    0xDAD256554C61746ELLU, // sww_Latn_VU
-    0xDED242524C61746ELLU, // swx_Latn_BR
-    0xE2D254444C61746ELLU, // swy_Latn_TD
-    0x86F24B454C61746ELLU, // sxb_Latn_KE
-    0x92F247414C61746ELLU, // sxe_Latn_GA
-    0xB6F249444C61746ELLU, // sxn_Latn_ID
-    0xC6F254574C61746ELLU, // sxr_Latn_TW
-    0xCAF24E474C61746ELLU, // sxs_Latn_NG
-    0xD2F2444552756E72LLU, // sxu_Runr_DE
-    0xDAF2424A4C61746ELLU, // sxw_Latn_BJ
-    0x831249444C61746ELLU, // sya_Latn_ID
-    0x871250484C61746ELLU, // syb_Latn_PH
-    0x8B12545253797263LLU, // syc_Syrc_TR
-    0xA31247414C61746ELLU, // syi_Latn_GA
-    0xAB124E474C61746ELLU, // syk_Latn_NG
-    0xAF12424442656E67LLU, // syl_Beng_BD
-    0xB31242464C61746ELLU, // sym_Latn_BF
-    0xB712495253797263LLU, // syn_Syrc_IR
-    0xBB124B484C61746ELLU, // syo_Latn_KH
-    0xC712495153797263LLU, // syr_Syrc_IQ
-    0xCB1254444C61746ELLU, // sys_Latn_TD
-    0xDB124E5044657661LLU, // syw_Deva_NP
-    0xDF1247414C61746ELLU, // syx_Latn_GA
-    0x83324D594C61746ELLU, // sza_Latn_MY
-    0x873249444C61746ELLU, // szb_Latn_ID
-    0x8B324D594C61746ELLU, // szc_Latn_MY
-    0x9B3243444C61746ELLU, // szg_Latn_CD
-    0xAF32504C4C61746ELLU, // szl_Latn_PL
-    0xB73249444C61746ELLU, // szn_Latn_ID
-    0xBF3249444C61746ELLU, // szp_Latn_ID
-    0xD732434D4C61746ELLU, // szv_Latn_CM
-    0xDB3249444C61746ELLU, // szw_Latn_ID
-    0xE33254574C61746ELLU, // szy_Latn_TW
-    0x7461494E54616D6CLLU, // ta_Taml_IN
-    0x801355534C61746ELLU, // taa_Latn_US
-    0x841352554379726CLLU, // tab_Cyrl_RU
-    0x88134D584C61746ELLU, // tac_Latn_MX
-    0x8C1349444C61746ELLU, // tad_Latn_ID
-    0x901342524C61746ELLU, // tae_Latn_BR
-    0x941342524C61746ELLU, // taf_Latn_BR
-    0x981353444C61746ELLU, // tag_Latn_SD
-    0xA4134E5044657661LLU, // taj_Deva_NP
-    0xA8134E474C61746ELLU, // tak_Latn_NG
-    0xAC134E474C61746ELLU, // tal_Latn_NG
-    0xB4134E474C61746ELLU, // tan_Latn_NG
-    0xB81354574C61746ELLU, // tao_Latn_TW
-    0xBC1343444C61746ELLU, // tap_Latn_CD
-    0xC0134D4C4C61746ELLU, // taq_Latn_ML
-    0xC4134D584C61746ELLU, // tar_Latn_MX
-    0xC813564E4C61746ELLU, // tas_Latn_VN
-    0xD01355534C61746ELLU, // tau_Latn_US
-    0xD413434F4C61746ELLU, // tav_Latn_CO
-    0xD81350474C61746ELLU, // taw_Latn_PG
-    0xDC1354444C61746ELLU, // tax_Latn_TD
-    0xE01354574C61746ELLU, // tay_Latn_TW
-    0xE41353444C61746ELLU, // taz_Latn_SD
-    0x803342524C61746ELLU, // tba_Latn_BR
-    0x883350474C61746ELLU, // tbc_Latn_PG
-    0x8C3350474C61746ELLU, // tbd_Latn_PG
-    0x903353424C61746ELLU, // tbe_Latn_SB
-    0x943350474C61746ELLU, // tbf_Latn_PG
-    0x983350474C61746ELLU, // tbg_Latn_PG
-    0x9C3341554C61746ELLU, // tbh_Latn_AU
-    0xA03353444C61746ELLU, // tbi_Latn_SD
-    0xA43350474C61746ELLU, // tbj_Latn_PG
-    0xA833504854616762LLU, // tbk_Tagb_PH
-    0xAC3350484C61746ELLU, // tbl_Latn_PH
-    0xB03343444C61746ELLU, // tbm_Latn_CD
-    0xB433434F4C61746ELLU, // tbn_Latn_CO
-    0xB83350474C61746ELLU, // tbo_Latn_PG
-    0xBC3349444C61746ELLU, // tbp_Latn_ID
-    0xC83350474C61746ELLU, // tbs_Latn_PG
-    0xCC3343444C61746ELLU, // tbt_Latn_CD
-    0xD0334D584C61746ELLU, // tbu_Latn_MX
-    0xD43350474C61746ELLU, // tbv_Latn_PG
-    0xD83350484C61746ELLU, // tbw_Latn_PH
-    0xDC3350474C61746ELLU, // tbx_Latn_PG
-    0xE03349444C61746ELLU, // tby_Latn_ID
-    0xE433424A4C61746ELLU, // tbz_Latn_BJ
-    0x805342524C61746ELLU, // tca_Latn_BR
-    0x845355534C61746ELLU, // tcb_Latn_US
-    0x8853545A4C61746ELLU, // tcc_Latn_TZ
-    0x8C5347484C61746ELLU, // tcd_Latn_GH
-    0x905343414C61746ELLU, // tce_Latn_CA
-    0x94534D584C61746ELLU, // tcf_Latn_MX
-    0x985349444C61746ELLU, // tcg_Latn_ID
-    0x9C5354434C61746ELLU, // tch_Latn_TC
-    0xA05350474C61746ELLU, // tci_Latn_PG
-    0xA85347414C61746ELLU, // tck_Latn_GA
-    0xB05349444C61746ELLU, // tcm_Latn_ID
-    0xB4534E5054696274LLU, // tcn_Tibt_NP
-    0xB8534D4D4D796D72LLU, // tco_Mymr_MM
-    0xBC534D4D4C61746ELLU, // tcp_Latn_MM
-    0xC05349444C61746ELLU, // tcq_Latn_ID
-    0xC85341554C61746ELLU, // tcs_Latn_AU
-    0xD0534D584C61746ELLU, // tcu_Latn_MX
-    0xD8534D584C61746ELLU, // tcw_Latn_MX
-    0xDC53494E54616D6CLLU, // tcx_Taml_IN
-    0xE053494E4B6E6461LLU, // tcy_Knda_IN
-    0xE453494E4C61746ELLU, // tcz_Latn_IN
-    0x80734E4554666E67LLU, // tda_Tfng_NE
-    0x8473494E44657661LLU, // tdb_Deva_IN
-    0x8873434F4C61746ELLU, // tdc_Latn_CO
-    0x8C73434E54616C65LLU, // tdd_Tale_CN
-    0x90734D4C4C61746ELLU, // tde_Latn_ML
-    0x98734E5044657661LLU, // tdg_Deva_NP
-    0x9C734E5044657661LLU, // tdh_Deva_NP
-    0xA07349444C61746ELLU, // tdi_Latn_ID
-    0xA47349444C61746ELLU, // tdj_Latn_ID
-    0xA8734E474C61746ELLU, // tdk_Latn_NG
-    0xAC734E474C61746ELLU, // tdl_Latn_NG
-    0xB07347594C61746ELLU, // tdm_Latn_GY
-    0xB47349444C61746ELLU, // tdn_Latn_ID
-    0xB8734E474C61746ELLU, // tdo_Latn_NG
-    0xC0734E474C61746ELLU, // tdq_Latn_NG
-    0xC473564E4C61746ELLU, // tdr_Latn_VN
-    0xC87349444C61746ELLU, // tds_Latn_ID
-    0xCC73544C4C61746ELLU, // tdt_Latn_TL
-    0xD4734E474C61746ELLU, // tdv_Latn_NG
-    0xDC734D474C61746ELLU, // tdx_Latn_MG
-    0xE07350484C61746ELLU, // tdy_Latn_PH
-    0x7465494E54656C75LLU, // te_Telu_IN
-    0x80934D594C61746ELLU, // tea_Latn_MY
-    0x849345434C61746ELLU, // teb_Latn_EC
-    0x88934B454C61746ELLU, // tec_Latn_KE
-    0x8C9343494C61746ELLU, // ted_Latn_CI
-    0x90934D584C61746ELLU, // tee_Latn_MX
-    0x989347414C61746ELLU, // teg_Latn_GA
-    0x9C9341524C61746ELLU, // teh_Latn_AR
-    0xA09350474C61746ELLU, // tei_Latn_PG
-    0xA89343444C61746ELLU, // tek_Latn_CD
-    0xB093534C4C61746ELLU, // tem_Latn_SL
-    0xB493434F4C61746ELLU, // ten_Latn_CO
-    0xB89355474C61746ELLU, // teo_Latn_UG
-    0xBC934D584C61746ELLU, // tep_Latn_MX
-    0xC09353444C61746ELLU, // teq_Latn_SD
-    0xC49342524C61746ELLU, // ter_Latn_BR
-    0xC89349444A617661LLU, // tes_Java_ID
-    0xCC93544C4C61746ELLU, // tet_Latn_TL
-    0xD09355474C61746ELLU, // teu_Latn_UG
-    0xD49349444C61746ELLU, // tev_Latn_ID
-    0xD89355534C61746ELLU, // tew_Latn_US
-    0xDC9353534C61746ELLU, // tex_Latn_SS
-    0xE09353444C61746ELLU, // tey_Latn_SD
-    0xE4934E454C61746ELLU, // tez_Latn_NE
-    0xA0B3424A4C61746ELLU, // tfi_Latn_BJ
-    0xB4B355534C61746ELLU, // tfn_Latn_US
-    0xB8B349444C61746ELLU, // tfo_Latn_ID
-    0xC4B350414C61746ELLU, // tfr_Latn_PA
-    0xCCB349444C61746ELLU, // tft_Latn_ID
-    0x7467504B41726162LLU, // tg_Arab_PK
-    0x7467544A4379726CLLU, // tg_Cyrl_TJ
-    0x80D34B454C61746ELLU, // tga_Latn_KE
-    0x84D34D594C61746ELLU, // tgb_Latn_MY
-    0x88D350474C61746ELLU, // tgc_Latn_PG
-    0x8CD34E474C61746ELLU, // tgd_Latn_NG
-    0x90D34E5044657661LLU, // tge_Deva_NP
-    0x94D3425454696274LLU, // tgf_Tibt_BT
-    0x9CD354544C61746ELLU, // tgh_Latn_TT
-    0xA0D350474C61746ELLU, // tgi_Latn_PG
-    0xA4D3494E4C61746ELLU, // tgj_Latn_IN
-    0xB4D350484C61746ELLU, // tgn_Latn_PH
-    0xB8D350474C61746ELLU, // tgo_Latn_PG
-    0xBCD356554C61746ELLU, // tgp_Latn_VU
-    0xC0D34D594C61746ELLU, // tgq_Latn_MY
-    0xC8D356554C61746ELLU, // tgs_Latn_VU
-    0xCCD350484C61746ELLU, // tgt_Latn_PH
-    0xD0D350474C61746ELLU, // tgu_Latn_PG
-    0xD4D342524C61746ELLU, // tgv_Latn_BR
-    0xD8D343494C61746ELLU, // tgw_Latn_CI
-    0xDCD343414C61746ELLU, // tgx_Latn_CA
-    0xE0D353534C61746ELLU, // tgy_Latn_SS
-    0xE4D341554C61746ELLU, // tgz_Latn_AU
-    0x7468544854686169LLU, // th_Thai_TH
-    0x8CF341554C61746ELLU, // thd_Latn_AU
-    0x90F34E5044657661LLU, // the_Deva_NP
-    0x94F34E5044657661LLU, // thf_Deva_NP
-    0x9CF34D584C61746ELLU, // thh_Latn_MX
-    0xA0F34C4154616C65LLU, // thi_Tale_LA
-    0xA8F34B454C61746ELLU, // thk_Latn_KE
-    0xACF34E5044657661LLU, // thl_Deva_NP
-    0xB0F3544854686169LLU, // thm_Thai_TH
-    0xBCF343414C61746ELLU, // thp_Latn_CA
-    0xC0F34E5044657661LLU, // thq_Deva_NP
-    0xC4F34E5044657661LLU, // thr_Deva_NP
-    0xC8F34E5044657661LLU, // ths_Deva_NP
-    0xCCF343414C61746ELLU, // tht_Latn_CA
-    0xD0F353534C61746ELLU, // thu_Latn_SS
-    0xD4F3445A4C61746ELLU, // thv_Latn_DZ
-    0xE0F34E474C61746ELLU, // thy_Latn_NG
-    0xE4F34E454C61746ELLU, // thz_Latn_NE
-    0x7469455445746869LLU, // ti_Ethi_ET
-    0x891353444C61746ELLU, // tic_Latn_SD
-    0x951350474C61746ELLU, // tif_Latn_PG
-    0x9913455245746869LLU, // tig_Ethi_ER
-    0x9D134D594C61746ELLU, // tih_Latn_MY
-    0xA11343444C61746ELLU, // tii_Latn_CD
-    0xA5134E5044657661LLU, // tij_Deva_NP
-    0xA913434D4C61746ELLU, // tik_Latn_CM
-    0xAD1355534C61746ELLU, // til_Latn_US
-    0xB11350474C61746ELLU, // tim_Latn_PG
-    0xB51352554379726CLLU, // tin_Cyrl_RU
-    0xB91350474C61746ELLU, // tio_Latn_PG
-    0xBD1349444C61746ELLU, // tip_Latn_ID
-    0xC11342464C61746ELLU, // tiq_Latn_BF
-    0xC91350484C61746ELLU, // tis_Latn_PH
-    0xCD13434F4C61746ELLU, // tit_Latn_CO
-    0xD11350484C61746ELLU, // tiu_Latn_PH
-    0xD5134E474C61746ELLU, // tiv_Latn_NG
-    0xD91341554C61746ELLU, // tiw_Latn_AU
-    0xDD1355534C61746ELLU, // tix_Latn_US
-    0xE11350484C61746ELLU, // tiy_Latn_PH
-    0x81334C524C61746ELLU, // tja_Latn_LR
-    0x993349444C61746ELLU, // tjg_Latn_ID
-    0xA133434E4C61746ELLU, // tji_Latn_CN
-    0xA53341554C61746ELLU, // tjj_Latn_AU
-    0xAD334D4D4D796D72LLU, // tjl_Mymr_MM
-    0xB53343494C61746ELLU, // tjn_Latn_CI
-    0xB933445A41726162LLU, // tjo_Arab_DZ
-    0xBD3341554C61746ELLU, // tjp_Latn_AU
-    0xC933434E4C61746ELLU, // tjs_Latn_CN
-    0xD13341554C61746ELLU, // tju_Latn_AU
-    0xD93341554C61746ELLU, // tjw_Latn_AU
-    0x746B544D4C61746ELLU, // tk_Latn_TM
-    0x815342524C61746ELLU, // tka_Latn_BR
-    0x8553494E44657661LLU, // tkb_Deva_IN
-    0x8D53544C4C61746ELLU, // tkd_Latn_TL
-    0x91534D5A4C61746ELLU, // tke_Latn_MZ
-    0x955342524C61746ELLU, // tkf_Latn_BR
-    0x99534D474C61746ELLU, // tkg_Latn_MG
-    0xAD53544B4C61746ELLU, // tkl_Latn_TK
-    0xBD5353424C61746ELLU, // tkp_Latn_SB
-    0xC1534E474C61746ELLU, // tkq_Latn_NG
-    0xC553415A4C61746ELLU, // tkr_Latn_AZ
-    0xC953495241726162LLU, // tks_Arab_IR
-    0xCD534E5044657661LLU, // tkt_Deva_NP
-    0xD1534D584C61746ELLU, // tku_Latn_MX
-    0xD55350474C61746ELLU, // tkv_Latn_PG
-    0xD95353424C61746ELLU, // tkw_Latn_SB
-    0xDD5349444C61746ELLU, // tkx_Latn_ID
-    0xE553564E4C61746ELLU, // tkz_Latn_VN
-    0x746C50484C61746ELLU, // tl_Latn_PH
-    0x81734D584C61746ELLU, // tla_Latn_MX
-    0x857349444C61746ELLU, // tlb_Latn_ID
-    0x89734D584C61746ELLU, // tlc_Latn_MX
-    0x8D7349444C61746ELLU, // tld_Latn_ID
-    0x957350474C61746ELLU, // tlf_Latn_PG
-    0x997349444C61746ELLU, // tlg_Latn_ID
-    0xA17355534C61746ELLU, // tli_Latn_US
-    0xA57355474C61746ELLU, // tlj_Latn_UG
-    0xA97349444C61746ELLU, // tlk_Latn_ID
-    0xAD7343444C61746ELLU, // tll_Latn_CD
-    0xB17356554C61746ELLU, // tlm_Latn_VU
-    0xB57349444C61746ELLU, // tln_Latn_ID
-    0xBD734D584C61746ELLU, // tlp_Latn_MX
-    0xC1734D4D4C61746ELLU, // tlq_Latn_MM
-    0xC57353424C61746ELLU, // tlr_Latn_SB
-    0xC97356554C61746ELLU, // tls_Latn_VU
-    0xCD7349444C61746ELLU, // tlt_Latn_ID
-    0xD17349444C61746ELLU, // tlu_Latn_ID
-    0xD57349444C61746ELLU, // tlv_Latn_ID
-    0xDD7350474C61746ELLU, // tlx_Latn_PG
-    0xE173415A4C61746ELLU, // tly_Latn_AZ
-    0x819354444C61746ELLU, // tma_Latn_TD
-    0x859356554C61746ELLU, // tmb_Latn_VU
-    0x899354444C61746ELLU, // tmc_Latn_TD
-    0x8D9350474C61746ELLU, // tmd_Latn_PG
-    0x919342524C61746ELLU, // tme_Latn_BR
-    0x959350594C61746ELLU, // tmf_Latn_PY
-    0x999349444C61746ELLU, // tmg_Latn_ID
-    0x9D934E454C61746ELLU, // tmh_Latn_NE
-    0xA19356554C61746ELLU, // tmi_Latn_VU
-    0xA59349444C61746ELLU, // tmj_Latn_ID
-    0xAD9349444C61746ELLU, // tml_Latn_ID
-    0xB193564E4C61746ELLU, // tmm_Latn_VN
-    0xB59349444C61746ELLU, // tmn_Latn_ID
-    0xB9934D594C61746ELLU, // tmo_Latn_MY
-    0xC19350474C61746ELLU, // tmq_Latn_PG
-    0xC593494C53797263LLU, // tmr_Syrc_IL
-    0xCD9356554C61746ELLU, // tmt_Latn_VU
-    0xD19349444C61746ELLU, // tmu_Latn_ID
-    0xD59343444C61746ELLU, // tmv_Latn_CD
-    0xD9934D594C61746ELLU, // tmw_Latn_MY
-    0xE19350474C61746ELLU, // tmy_Latn_PG
-    0xE59356454C61746ELLU, // tmz_Latn_VE
-    0x746E5A414C61746ELLU, // tn_Latn_ZA
-    0x81B3424F4C61746ELLU, // tna_Latn_BO
-    0x85B3434F4C61746ELLU, // tnb_Latn_CO
-    0x89B3434F4C61746ELLU, // tnc_Latn_CO
-    0x8DB3434F4C61746ELLU, // tnd_Latn_CO
-    0x99B354444C61746ELLU, // tng_Latn_TD
-    0x9DB350474C61746ELLU, // tnh_Latn_PG
-    0xA1B349444C61746ELLU, // tni_Latn_ID
-    0xA9B356554C61746ELLU, // tnk_Latn_VU
-    0xADB356554C61746ELLU, // tnl_Latn_VU
-    0xB1B349444C61746ELLU, // tnm_Latn_ID
-    0xB5B356554C61746ELLU, // tnn_Latn_VU
-    0xB9B3424F4C61746ELLU, // tno_Latn_BO
-    0xBDB356554C61746ELLU, // tnp_Latn_VU
-    0xC1B350524C61746ELLU, // tnq_Latn_PR
-    0xC5B3534E4C61746ELLU, // tnr_Latn_SN
-    0xC9B350474C61746ELLU, // tns_Latn_PG
-    0xCDB349444C61746ELLU, // tnt_Latn_ID
-    0xD5B3424443616B6DLLU, // tnv_Cakm_BD
-    0xD9B349444C61746ELLU, // tnw_Latn_ID
-    0xDDB353424C61746ELLU, // tnx_Latn_SB
-    0xE1B3545A4C61746ELLU, // tny_Latn_TZ
-    0x746F544F4C61746ELLU, // to_Latn_TO
-    0x85D341524C61746ELLU, // tob_Latn_AR
-    0x89D34D584C61746ELLU, // toc_Latn_MX
-    0x8DD3474E4C61746ELLU, // tod_Latn_GN
-    0x95D350474C61746ELLU, // tof_Latn_PG
-    0x99D34D574C61746ELLU, // tog_Latn_MW
-    0x9DD34D5A4C61746ELLU, // toh_Latn_MZ
-    0xA1D35A4D4C61746ELLU, // toi_Latn_ZM
-    0xA5D34D584C61746ELLU, // toj_Latn_MX
-    0xADD355534C61746ELLU, // tol_Latn_US
-    0xB1D349444C61746ELLU, // tom_Latn_ID
-    0xB9D34D584C61746ELLU, // too_Latn_MX
-    0xBDD34D584C61746ELLU, // top_Latn_MX
-    0xC1D353534C61746ELLU, // toq_Latn_SS
-    0xC5D343444C61746ELLU, // tor_Latn_CD
-    0xC9D34D584C61746ELLU, // tos_Latn_MX
-    0xD1D3564E4C61746ELLU, // tou_Latn_VN
-    0xD5D3495241726162LLU, // tov_Arab_IR
-    0xD9D355534C61746ELLU, // tow_Latn_US
-    0xDDD350574C61746ELLU, // tox_Latn_PW
-    0xE1D349444C61746ELLU, // toy_Latn_ID
-    0xE5D3434D4C61746ELLU, // toz_Latn_CM
-    0x81F350474C61746ELLU, // tpa_Latn_PG
-    0x89F34D584C61746ELLU, // tpc_Latn_MX
-    0x91F342444C61746ELLU, // tpe_Latn_BD
-    0x95F349444C61746ELLU, // tpf_Latn_ID
-    0x99F349444C61746ELLU, // tpg_Latn_ID
-    0xA1F350474C61746ELLU, // tpi_Latn_PG
-    0xA5F350594C61746ELLU, // tpj_Latn_PY
-    0xA9F342524C61746ELLU, // tpk_Latn_BR
-    0xADF34D584C61746ELLU, // tpl_Latn_MX
-    0xB1F347484C61746ELLU, // tpm_Latn_GH
-    0xB5F342524C61746ELLU, // tpn_Latn_BR
-    0xBDF34D584C61746ELLU, // tpp_Latn_MX
-    0xC5F342524C61746ELLU, // tpr_Latn_BR
-    0xCDF34D584C61746ELLU, // tpt_Latn_MX
-    0xD1F34B484B686D72LLU, // tpu_Khmr_KH
-    0xD5F34D504C61746ELLU, // tpv_Latn_MP
-    0xDDF34D584C61746ELLU, // tpx_Latn_MX
-    0xE1F342524C61746ELLU, // tpy_Latn_BR
-    0xE5F350474C61746ELLU, // tpz_Latn_PG
-    0x861342524C61746ELLU, // tqb_Latn_BR
-    0xAE1356554C61746ELLU, // tql_Latn_VU
-    0xB21350474C61746ELLU, // tqm_Latn_PG
-    0xB61355534C61746ELLU, // tqn_Latn_US
-    0xBA1350474C61746ELLU, // tqo_Latn_PG
-    0xBE1350474C61746ELLU, // tqp_Latn_PG
-    0xCE134D584C61746ELLU, // tqt_Latn_MX
-    0xD21353424C61746ELLU, // tqu_Latn_SB
-    0xDA1355534C61746ELLU, // tqw_Latn_US
-    0x747254524C61746ELLU, // tr_Latn_TR
-    0x8233414641726162LLU, // tra_Arab_AF
-    0x863350474C61746ELLU, // trb_Latn_PG
-    0x8A334D584C61746ELLU, // trc_Latn_MX
-    0x923349444C61746ELLU, // tre_Latn_ID
-    0x963354544C61746ELLU, // trf_Latn_TT
-    0x9A33494C48656272LLU, // trg_Hebr_IL
-    0x9E3350474C61746ELLU, // trh_Latn_PG
-    0xA23353524C61746ELLU, // tri_Latn_SR
-    0xA63354444C61746ELLU, // trj_Latn_TD
-    0xAE3347424C61746ELLU, // trl_Latn_GB
-    0xB233414641726162LLU, // trm_Arab_AF
-    0xB633424F4C61746ELLU, // trn_Latn_BO
-    0xBA33494E4C61746ELLU, // tro_Latn_IN
-    0xBE33494E4C61746ELLU, // trp_Latn_IN
-    0xC2334D584C61746ELLU, // trq_Latn_MX
-    0xC63350454C61746ELLU, // trr_Latn_PE
-    0xCA334D584C61746ELLU, // trs_Latn_MX
-    0xCE3349444C61746ELLU, // trt_Latn_ID
-    0xD23354524C61746ELLU, // tru_Latn_TR
-    0xD63354574C61746ELLU, // trv_Latn_TW
-    0xDA33504B41726162LLU, // trw_Arab_PK
-    0xDE334D594C61746ELLU, // trx_Latn_MY
-    0xE233494E4C61746ELLU, // try_Latn_IN
-    0xE63342524C61746ELLU, // trz_Latn_BR
-    0x74735A414C61746ELLU, // ts_Latn_ZA
-    0x825343474C61746ELLU, // tsa_Latn_CG
-    0x865345544C61746ELLU, // tsb_Latn_ET
-    0x8A534D5A4C61746ELLU, // tsc_Latn_MZ
-    0x8E5347524772656BLLU, // tsd_Grek_GR
-    0x9A5350484C61746ELLU, // tsg_Latn_PH
-    0x9E53434D4C61746ELLU, // tsh_Latn_CM
-    0xA25343414C61746ELLU, // tsi_Latn_CA
-    0xA653425454696274LLU, // tsj_Tibt_BT
-    0xAE53564E4C61746ELLU, // tsl_Latn_VN
-    0xBE5342464C61746ELLU, // tsp_Latn_BF
-    0xC65356554C61746ELLU, // tsr_Latn_VU
-    0xCE534D4C4C61746ELLU, // tst_Latn_ML
-    0xD25354574C61746ELLU, // tsu_Latn_TW
-    0xD65347414C61746ELLU, // tsv_Latn_GA
-    0xDA534E474C61746ELLU, // tsw_Latn_NG
-    0xDE5350474C61746ELLU, // tsx_Latn_PG
-    0xE6534D584C61746ELLU, // tsz_Latn_MX
-    0x747452554379726CLLU, // tt_Cyrl_RU
-    0x86734E474C61746ELLU, // ttb_Latn_NG
-    0x8A7347544C61746ELLU, // ttc_Latn_GT
-    0x8E7350474C61746ELLU, // ttd_Latn_PG
-    0x927350474C61746ELLU, // tte_Latn_PG
-    0x9673434D4C61746ELLU, // ttf_Latn_CM
-    0x9E734C414C616F6FLLU, // tth_Laoo_LA
-    0xA27349444C61746ELLU, // tti_Latn_ID
-    0xA67355474C61746ELLU, // ttj_Latn_UG
-    0xAA73434F4C61746ELLU, // ttk_Latn_CO
-    0xAE735A4D4C61746ELLU, // ttl_Latn_ZM
-    0xB27343414C61746ELLU, // ttm_Latn_CA
-    0xB67349444C61746ELLU, // ttn_Latn_ID
-    0xBA734C414C616F6FLLU, // tto_Laoo_LA
-    0xBE7349444C61746ELLU, // ttp_Latn_ID
-    0xC6734E474C61746ELLU, // ttr_Latn_NG
-    0xCA73544854686169LLU, // tts_Thai_TH
-    0xCE73415A4C61746ELLU, // ttt_Latn_AZ
-    0xD27350474C61746ELLU, // ttu_Latn_PG
-    0xD67350474C61746ELLU, // ttv_Latn_PG
-    0xDA734D594C61746ELLU, // ttw_Latn_MY
-    0xE27349444C61746ELLU, // tty_Latn_ID
-    0xE6734E5044657661LLU, // ttz_Deva_NP
-    0x829350474C61746ELLU, // tua_Latn_PG
-    0x869355534C61746ELLU, // tub_Latn_US
-    0x8A9350474C61746ELLU, // tuc_Latn_PG
-    0x8E9342524C61746ELLU, // tud_Latn_BR
-    0x9293434F4C61746ELLU, // tue_Latn_CO
-    0x9693434F4C61746ELLU, // tuf_Latn_CO
-    0x9A9354444C61746ELLU, // tug_Latn_TD
-    0x9E9350474C61746ELLU, // tuh_Latn_PG
-    0xA293434D4C61746ELLU, // tui_Latn_CM
-    0xA69349444C61746ELLU, // tuj_Latn_ID
-    0xAE934E474C61746ELLU, // tul_Latn_NG
-    0xB2934D574C61746ELLU, // tum_Latn_MW
-    0xB69355534C61746ELLU, // tun_Latn_US
-    0xBA9342524C61746ELLU, // tuo_Latn_BR
-    0xC29354444C61746ELLU, // tuq_Latn_TD
-    0xCA9343414C61746ELLU, // tus_Latn_CA
-    0xD29355534C61746ELLU, // tuu_Latn_US
-    0xD6934B454C61746ELLU, // tuv_Latn_KE
-    0xDE9342524C61746ELLU, // tux_Latn_BR
-    0xE2934B454C61746ELLU, // tuy_Latn_KE
-    0xE69342464C61746ELLU, // tuz_Latn_BF
-    0x82B353424C61746ELLU, // tva_Latn_SB
-    0x8EB34E474C61746ELLU, // tvd_Latn_NG
-    0x92B349444C61746ELLU, // tve_Latn_ID
-    0xA2B34E474C61746ELLU, // tvi_Latn_NG
-    0xAAB356554C61746ELLU, // tvk_Latn_VU
-    0xAEB354564C61746ELLU, // tvl_Latn_TV
-    0xB2B349444C61746ELLU, // tvm_Latn_ID
-    0xB6B34D4D4D796D72LLU, // tvn_Mymr_MM
-    0xBAB349444C61746ELLU, // tvo_Latn_ID
-    0xCAB34B454C61746ELLU, // tvs_Latn_KE
-    0xCEB3494E4C61746ELLU, // tvt_Latn_IN
-    0xD2B3434D4C61746ELLU, // tvu_Latn_CM
-    0xDAB349444C61746ELLU, // tvw_Latn_ID
-    0xDEB354574C61746ELLU, // tvx_Latn_TW
-    0x82D355534C61746ELLU, // twa_Latn_US
-    0x86D350484C61746ELLU, // twb_Latn_PH
-    0x8ED34E4C4C61746ELLU, // twd_Latn_NL
-    0x92D349444C61746ELLU, // twe_Latn_ID
-    0x96D355534C61746ELLU, // twf_Latn_US
-    0x9AD349444C61746ELLU, // twg_Latn_ID
-    0x9ED3564E4C61746ELLU, // twh_Latn_VN
-    0xAED34D5A4C61746ELLU, // twl_Latn_MZ
-    0xB2D3494E44657661LLU, // twm_Deva_IN
-    0xB6D3434D4C61746ELLU, // twn_Latn_CM
-    0xBAD342574C61746ELLU, // two_Latn_BW
-    0xBED350474C61746ELLU, // twp_Latn_PG
-    0xC2D34E454C61746ELLU, // twq_Latn_NE
-    0xC6D34D584C61746ELLU, // twr_Latn_MX
-    0xCED342524C61746ELLU, // twt_Latn_BR
-    0xD2D349444C61746ELLU, // twu_Latn_ID
-    0xDAD350474C61746ELLU, // tww_Latn_PG
-    0xDED34D5A4C61746ELLU, // twx_Latn_MZ
-    0xE2D349444C61746ELLU, // twy_Latn_ID
-    0x82F34D594C61746ELLU, // txa_Latn_MY
-    0x92F349444C61746ELLU, // txe_Latn_ID
-    0x9AF3434E54616E67LLU, // txg_Tang_CN
-    0xA2F342524C61746ELLU, // txi_Latn_BR
-    0xA6F34E474C61746ELLU, // txj_Latn_NG
-    0xB2F349444C61746ELLU, // txm_Latn_ID
-    0xB6F349444C61746ELLU, // txn_Latn_ID
-    0xBAF3494E546F746FLLU, // txo_Toto_IN
-    0xC2F349444C61746ELLU, // txq_Latn_ID
-    0xCAF349444C61746ELLU, // txs_Latn_ID
-    0xCEF349444C61746ELLU, // txt_Latn_ID
-    0xD2F342524C61746ELLU, // txu_Latn_BR
-    0xDEF34D594C61746ELLU, // txx_Latn_MY
-    0xE2F34D474C61746ELLU, // txy_Latn_MG
-    0x747950464C61746ELLU, // ty_Latn_PF
-    0x831350474C61746ELLU, // tya_Latn_PG
-    0x93134E474C61746ELLU, // tye_Latn_NG
-    0x9F13564E4C61746ELLU, // tyh_Latn_VN
-    0xA31343474C61746ELLU, // tyi_Latn_CG
-    0xA713564E4C61746ELLU, // tyj_Latn_VN
-    0xAF13564E4C61746ELLU, // tyl_Latn_VN
-    0xB71349444C61746ELLU, // tyn_Latn_ID
-    0xBF1341554C61746ELLU, // typ_Latn_AU
-    0xC713564E54617674LLU, // tyr_Tavt_VN
-    0xCB13564E4C61746ELLU, // tys_Latn_VN
-    0xCF13564E4C61746ELLU, // tyt_Latn_VN
-    0xD31342574C61746ELLU, // tyu_Latn_BW
-    0xD71352554379726CLLU, // tyv_Cyrl_RU
-    0xDF1343474C61746ELLU, // tyx_Latn_CG
-    0xE3134E474C61746ELLU, // tyy_Latn_NG
-    0xE713564E4C61746ELLU, // tyz_Latn_VN
-    0x9F334D584C61746ELLU, // tzh_Latn_MX
-    0xA73347544C61746ELLU, // tzj_Latn_GT
-    0xB3334D414C61746ELLU, // tzm_Latn_MA
-    0xB73349444C61746ELLU, // tzn_Latn_ID
-    0xBB334D584C61746ELLU, // tzo_Latn_MX
-    0xDF3350474C61746ELLU, // tzx_Latn_PG
-    0xB01442524C61746ELLU, // uam_Latn_BR
-    0xC41450474C61746ELLU, // uar_Latn_PG
-    0x80344E474C61746ELLU, // uba_Latn_NG
-    0xA03454444C61746ELLU, // ubi_Latn_TD
-    0xAC3450484C61746ELLU, // ubl_Latn_PH
-    0xC43450474C61746ELLU, // ubr_Latn_PG
-    0xD03450474C61746ELLU, // ubu_Latn_PG
-    0xE03454524C61746ELLU, // uby_Latn_TR
-    0x80744E474C61746ELLU, // uda_Latn_NG
-    0x907452554379726CLLU, // ude_Cyrl_RU
-    0x9874494E4D6C796DLLU, // udg_Mlym_IN
-    0xA07452554379726CLLU, // udi_Cyrl_RU
-    0xA47449444C61746ELLU, // udj_Latn_ID
-    0xAC74434D4C61746ELLU, // udl_Latn_CM
-    0xB07452554379726CLLU, // udm_Cyrl_RU
-    0xD07453444C61746ELLU, // udu_Latn_SD
-    0xC89449444C61746ELLU, // ues_Latn_ID
-    0xA0B450474C61746ELLU, // ufi_Latn_PG
-    0x7567434E41726162LLU, // ug_Arab_CN
-    0x75674B5A4379726CLLU, // ug_Cyrl_KZ
-    0x80D4535955676172LLU, // uga_Ugar_SY
-    0x84D441554C61746ELLU, // ugb_Latn_AU
-    0x90D453424C61746ELLU, // uge_Latn_SB
-    0x9CD452554379726CLLU, // ugh_Cyrl_RU
-    0xB8D4544854686169LLU, // ugo_Thai_TH
-    0x80F44E474C61746ELLU, // uha_Latn_NG
-    0xB4F449444C61746ELLU, // uhn_Latn_ID
-    0xC91450474C61746ELLU, // uis_Latn_PG
-    0xD514434D4C61746ELLU, // uiv_Latn_CM
-    0xA1344E474C61746ELLU, // uji_Latn_NG
-    0x756B55414379726CLLU, // uk_Cyrl_UA
-    0x815449444C61746ELLU, // uka_Latn_ID
-    0x995450474C61746ELLU, // ukg_Latn_PG
-    0x9D5443464C61746ELLU, // ukh_Latn_CF
-    0xA154494E4F727961LLU, // uki_Orya_IN
-    0xA9544D4D4C61746ELLU, // ukk_Latn_MM
-    0xBD544E474C61746ELLU, // ukp_Latn_NG
-    0xC1544E474C61746ELLU, // ukq_Latn_NG
-    0xD1544E474C61746ELLU, // uku_Latn_NG
-    0xD55453534C61746ELLU, // ukv_Latn_SS
-    0xD9544E474C61746ELLU, // ukw_Latn_NG
-    0xE15441554C61746ELLU, // uky_Latn_AU
-    0x81744E474C61746ELLU, // ula_Latn_NG
-    0x85744E474C61746ELLU, // ulb_Latn_NG
-    0x897452554379726CLLU, // ulc_Cyrl_RU
-    0x917441524C61746ELLU, // ule_Latn_AR
-    0x957449444C61746ELLU, // ulf_Latn_ID
-    0xA174464D4C61746ELLU, // uli_Latn_FM
-    0xA97441554C61746ELLU, // ulk_Latn_AU
-    0xB17449444C61746ELLU, // ulm_Latn_ID
-    0xB57450474C61746ELLU, // uln_Latn_PG
-    0xD17449444C61746ELLU, // ulu_Latn_ID
-    0xD9744E494C61746ELLU, // ulw_Latn_NI
-    0xE1744E474C61746ELLU, // uly_Latn_NG
-    0x819455534C61746ELLU, // uma_Latn_US
-    0x8594414F4C61746ELLU, // umb_Latn_AO
-    0x8D9441554C61746ELLU, // umd_Latn_AU
-    0x999441554C61746ELLU, // umg_Latn_AU
-    0xA1944D594C61746ELLU, // umi_Latn_MY
-    0xB1944E474C61746ELLU, // umm_Latn_NG
-    0xB5944D4D4C61746ELLU, // umn_Latn_MM
-    0xB99442524C61746ELLU, // umo_Latn_BR
-    0xBD9441554C61746ELLU, // ump_Latn_AU
-    0xC59441554C61746ELLU, // umr_Latn_AU
-    0xC99449444C61746ELLU, // ums_Latn_ID
-    0x81B450474C61746ELLU, // una_Latn_PG
-    0x91B44E474C61746ELLU, // une_Latn_NG
-    0x99B441554C61746ELLU, // ung_Latn_AU
-    0xA1B450474C61746ELLU, // uni_Latn_PG
-    0xA9B442524C61746ELLU, // unk_Latn_BR
-    0xB1B455534C61746ELLU, // unm_Latn_US
-    0xB5B441554C61746ELLU, // unn_Latn_AU
-    0xC5B4494E42656E67LLU, // unr_Beng_IN
-    0xC5B44E5044657661LLU, // unr_Deva_NP
-    0xD1B450474C61746ELLU, // unu_Latn_PG
-    0xDDB4494E42656E67LLU, // unx_Beng_IN
-    0xE5B449444C61746ELLU, // unz_Latn_ID
-    0xB5D454574C61746ELLU, // uon_Latn_TW
-    0xA1F450474C61746ELLU, // upi_Latn_PG
-    0xD5F456554C61746ELLU, // upv_Latn_VU
-    0x7572504B41726162LLU, // ur_Arab_PK
-    0x823450454C61746ELLU, // ura_Latn_PE
-    0x863442524C61746ELLU, // urb_Latn_BR
-    0x8A3441554C61746ELLU, // urc_Latn_AU
-    0x9234424F4C61746ELLU, // ure_Latn_BO
-    0x963441554C61746ELLU, // urf_Latn_AU
-    0x9A3450474C61746ELLU, // urg_Latn_PG
-    0x9E344E474C61746ELLU, // urh_Latn_NG
-    0xA23450474C61746ELLU, // uri_Latn_PG
-    0xAA34544854686169LLU, // urk_Thai_TH
-    0xB23450474C61746ELLU, // urm_Latn_PG
-    0xB63449444C61746ELLU, // urn_Latn_ID
-    0xBA3450474C61746ELLU, // uro_Latn_PG
-    0xBE3442524C61746ELLU, // urp_Latn_BR
-    0xC63456554C61746ELLU, // urr_Latn_VU
-    0xCE3450474C61746ELLU, // urt_Latn_PG
-    0xD23442524C61746ELLU, // uru_Latn_BR
-    0xD63450474C61746ELLU, // urv_Latn_PG
-    0xDA3450474C61746ELLU, // urw_Latn_PG
-    0xDE3450474C61746ELLU, // urx_Latn_PG
-    0xE23449444C61746ELLU, // ury_Latn_ID
-    0xE63442524C61746ELLU, // urz_Latn_BR
-    0x825450474C61746ELLU, // usa_Latn_PG
-    0x9E54504B41726162LLU, // ush_Arab_PK
-    0xA25442444C61746ELLU, // usi_Latn_BD
-    0xAA54434D4C61746ELLU, // usk_Latn_CM
-    0xBE5447544C61746ELLU, // usp_Latn_GT
-    0xCA544E474C61746ELLU, // uss_Latn_NG
-    0xD25450474C61746ELLU, // usu_Latn_PG
-    0x82744E474C61746ELLU, // uta_Latn_NG
-    0x927455534C61746ELLU, // ute_Latn_US
-    0x9E744E474C61746ELLU, // uth_Latn_NG
-    0xBE7453424C61746ELLU, // utp_Latn_SB
-    0xC6744E474C61746ELLU, // utr_Latn_NG
-    0xD27450474C61746ELLU, // utu_Latn_PG
-    0xB29447454772656BLLU, // uum_Grek_GE
-    0xC69456554C61746ELLU, // uur_Latn_VU
-    0x92B44E434C61746ELLU, // uve_Latn_NC
-    0x9EB450474C61746ELLU, // uvh_Latn_PG
-    0xAEB450474C61746ELLU, // uvl_Latn_PG
-    0x82D441554C61746ELLU, // uwa_Latn_AU
-    0x83144E474C61746ELLU, // uya_Latn_NG
-    0x757A414641726162LLU, // uz_Arab_AF
-    0x757A555A4C61746ELLU, // uz_Latn_UZ
-    0xCB34414641726162LLU, // uzs_Arab_AF
-    0x8015494E54616D6CLLU, // vaa_Taml_IN
-    0x901543464C61746ELLU, // vae_Latn_CF
-    0x9415495241726162LLU, // vaf_Arab_IR
-    0x981547484C61746ELLU, // vag_Latn_GH
-    0x9C15494E44657661LLU, // vah_Deva_IN
-    0xA0154C5256616969LLU, // vai_Vaii_LR
-    0xA4154E414C61746ELLU, // vaj_Latn_NA
-    0xAC1550474C61746ELLU, // val_Latn_PG
-    0xB01550474C61746ELLU, // vam_Latn_PG
-    0xB41550474C61746ELLU, // van_Latn_PG
-    0xB81556554C61746ELLU, // vao_Latn_VU
-    0xBC15494E4C61746ELLU, // vap_Latn_IN
-    0xC4154D584C61746ELLU, // var_Latn_MX
-    0xC815494E44657661LLU, // vas_Deva_IN
-    0xD01543444C61746ELLU, // vau_Latn_CD
-    0xD415494E44657661LLU, // vav_Deva_IN
-    0xE0154E5044657661LLU, // vay_Deva_NP
-    0x843549444C61746ELLU, // vbb_Latn_ID
-    0xA83550484C61746ELLU, // vbk_Latn_PH
-    0x76655A414C61746ELLU, // ve_Latn_ZA
-    0x889549544C61746ELLU, // vec_Latn_IT
-    0xB0954E474C61746ELLU, // vem_Latn_NG
-    0xB89555534C61746ELLU, // veo_Latn_US
-    0xBC9552554C61746ELLU, // vep_Latn_RU
-    0xC4954E474C61746ELLU, // ver_Latn_NG
-    0xC4D5504B41726162LLU, // vgr_Arab_PK
-    0x7669564E4C61746ELLU, // vi_Latn_VN
-    0x891553584C61746ELLU, // vic_Latn_SX
-    0x8D15545A4C61746ELLU, // vid_Latn_TZ
-    0x951543474C61746ELLU, // vif_Latn_CG
-    0x991542464C61746ELLU, // vig_Latn_BF
-    0xAD1541524C61746ELLU, // vil_Latn_AR
-    0xB515545A4C61746ELLU, // vin_Latn_TZ
-    0xCD154E474C61746ELLU, // vit_Latn_NG
-    0xD51550474C61746ELLU, // viv_Latn_PG
-    0xA935494E44657661LLU, // vjk_Deva_IN
-    0x815541554C61746ELLU, // vka_Latn_AU
-    0xA55554444C61746ELLU, // vkj_Latn_TD
-    0xA95549444C61746ELLU, // vkk_Latn_ID
-    0xAD5549444C61746ELLU, // vkl_Latn_ID
-    0xB15542524C61746ELLU, // vkm_Latn_BR
-    0xB5554E474C61746ELLU, // vkn_Latn_NG
-    0xB95549444C61746ELLU, // vko_Latn_ID
-    0xBD55494E4C61746ELLU, // vkp_Latn_IN
-    0xCD5549444C61746ELLU, // vkt_Latn_ID
-    0xD15541554C61746ELLU, // vku_Latn_AU
-    0xE5554E474C61746ELLU, // vkz_Latn_NG
-    0xBD7556554C61746ELLU, // vlp_Latn_VU
-    0xC97542454C61746ELLU, // vls_Latn_BE
-    0x819541554C61746ELLU, // vma_Latn_AU
-    0x859541554C61746ELLU, // vmb_Latn_AU
-    0x89954D584C61746ELLU, // vmc_Latn_MX
-    0x8D95494E4B6E6461LLU, // vmd_Knda_IN
-    0x919549444C61746ELLU, // vme_Latn_ID
-    0x959544454C61746ELLU, // vmf_Latn_DE
-    0x999550474C61746ELLU, // vmg_Latn_PG
-    0x9D95495241726162LLU, // vmh_Arab_IR
-    0xA19541554C61746ELLU, // vmi_Latn_AU
-    0xA5954D584C61746ELLU, // vmj_Latn_MX
-    0xA9954D5A4C61746ELLU, // vmk_Latn_MZ
-    0xAD9541554C61746ELLU, // vml_Latn_AU
-    0xB1954D584C61746ELLU, // vmm_Latn_MX
-    0xBD954D584C61746ELLU, // vmp_Latn_MX
-    0xC1954D584C61746ELLU, // vmq_Latn_MX
-    0xC5954D5A4C61746ELLU, // vmr_Latn_MZ
-    0xC99549444C61746ELLU, // vms_Latn_ID
-    0xD19541554C61746ELLU, // vmu_Latn_AU
-    0xD9954D5A4C61746ELLU, // vmw_Latn_MZ
-    0xDD954D584C61746ELLU, // vmx_Latn_MX
-    0xE1954D584C61746ELLU, // vmy_Latn_MX
-    0xE5954D584C61746ELLU, // vmz_Latn_MX
-    0xA9B553424C61746ELLU, // vnk_Latn_SB
-    0xB1B556554C61746ELLU, // vnm_Latn_VU
-    0xBDB556554C61746ELLU, // vnp_Latn_VU
-    0xC5D54E474C61746ELLU, // vor_Latn_NG
-    0xCDD552554C61746ELLU, // vot_Latn_RU
-    0x823556554C61746ELLU, // vra_Latn_VU
-    0xBA3545454C61746ELLU, // vro_Latn_EE
-    0xCA3553424C61746ELLU, // vrs_Latn_SB
-    0xCE3556554C61746ELLU, // vrt_Latn_VU
-    0xBA7549444C61746ELLU, // vto_Latn_ID
-    0xB29547414C61746ELLU, // vum_Latn_GA
-    0xB695545A4C61746ELLU, // vun_Latn_TZ
-    0xCE95434D4C61746ELLU, // vut_Latn_CM
-    0x82D5434E4C61746ELLU, // vwa_Latn_CN
-    0x776142454C61746ELLU, // wa_Latn_BE
-    0x801655534C61746ELLU, // waa_Latn_US
-    0x841650474C61746ELLU, // wab_Latn_PG
-    0x881655534C61746ELLU, // wac_Latn_US
-    0x8C1649444C61746ELLU, // wad_Latn_ID
-    0x901643484C61746ELLU, // wae_Latn_CH
-    0x941642524C61746ELLU, // waf_Latn_BR
-    0x981650474C61746ELLU, // wag_Latn_PG
-    0x9C1649444C61746ELLU, // wah_Latn_ID
-    0xA01649444C61746ELLU, // wai_Latn_ID
-    0xA41650474C61746ELLU, // waj_Latn_PG
-    0xAC16455445746869LLU, // wal_Ethi_ET
-    0xB01655534C61746ELLU, // wam_Latn_US
-    0xB41643494C61746ELLU, // wan_Latn_CI
-    0xBC1647594C61746ELLU, // wap_Latn_GY
-    0xC01641554C61746ELLU, // waq_Latn_AU
-    0xC41650484C61746ELLU, // war_Latn_PH
-    0xC81655534C61746ELLU, // was_Latn_US
-    0xCC1650474C61746ELLU, // wat_Latn_PG
-    0xD01642524C61746ELLU, // wau_Latn_BR
-    0xD4164E474C61746ELLU, // wav_Latn_NG
-    0xD81642524C61746ELLU, // waw_Latn_BR
-    0xDC1650474C61746ELLU, // wax_Latn_PG
-    0xE01653524C61746ELLU, // way_Latn_SR
-    0xE41650474C61746ELLU, // waz_Latn_PG
-    0x803656454C61746ELLU, // wba_Latn_VE
-    0x843649444C61746ELLU, // wbb_Latn_ID
-    0x903649444C61746ELLU, // wbe_Latn_ID
-    0x943642464C61746ELLU, // wbf_Latn_BF
-    0x9C36545A4C61746ELLU, // wbh_Latn_TZ
-    0xA036545A4C61746ELLU, // wbi_Latn_TZ
-    0xA436545A4C61746ELLU, // wbj_Latn_TZ
-    0xA836414641726162LLU, // wbk_Arab_AF
-    0xAC36504B4C61746ELLU, // wbl_Latn_PK
-    0xB036434E4C61746ELLU, // wbm_Latn_CN
-    0xBC3641554C61746ELLU, // wbp_Latn_AU
-    0xC036494E54656C75LLU, // wbq_Telu_IN
-    0xC436494E44657661LLU, // wbr_Deva_IN
-    0xCC3641554C61746ELLU, // wbt_Latn_AU
-    0xD43641554C61746ELLU, // wbv_Latn_AU
-    0xD83649444C61746ELLU, // wbw_Latn_ID
-    0x805642524C61746ELLU, // wca_Latn_BR
-    0xA05654474C61746ELLU, // wci_Latn_TG
-    0x8C7647414C61746ELLU, // wdd_Latn_GA
-    0x987650474C61746ELLU, // wdg_Latn_PG
-    0xA47641554C61746ELLU, // wdj_Latn_AU
-    0xA87641554C61746ELLU, // wdk_Latn_AU
-    0xCC7643414C61746ELLU, // wdt_Latn_CA
-    0xD07641554C61746ELLU, // wdu_Latn_AU
-    0xE07641554C61746ELLU, // wdy_Latn_AU
-    0x889643494C61746ELLU, // wec_Latn_CI
-    0x8C9650474C61746ELLU, // wed_Latn_PG
-    0x989641554C61746ELLU, // weg_Latn_AU
-    0x9C96434D4C61746ELLU, // weh_Latn_CM
-    0xA09650474C61746ELLU, // wei_Latn_PG
-    0xB096424A4C61746ELLU, // wem_Latn_BJ
-    0xB89649444C61746ELLU, // weo_Latn_ID
-    0xBC9644454C61746ELLU, // wep_Latn_DE
-    0xC49650474C61746ELLU, // wer_Latn_PG
-    0xC896434D4C61746ELLU, // wes_Latn_CM
-    0xCC9649444C61746ELLU, // wet_Latn_ID
-    0xD0964D4D4C61746ELLU, // weu_Latn_MM
-    0xD89649444C61746ELLU, // wew_Latn_ID
-    0x98B649444C61746ELLU, // wfg_Latn_ID
-    0x80D641554C61746ELLU, // wga_Latn_AU
-    0x84D650474C61746ELLU, // wgb_Latn_PG
-    0x98D641554C61746ELLU, // wgg_Latn_AU
-    0xA0D650474C61746ELLU, // wgi_Latn_PG
-    0xB8D649444C61746ELLU, // wgo_Latn_ID
-    0xD0D641554C61746ELLU, // wgu_Latn_AU
-    0xE0D641554C61746ELLU, // wgy_Latn_AU
-    0x80F649444C61746ELLU, // wha_Latn_ID
-    0x98F650474C61746ELLU, // whg_Latn_PG
-    0xA8F649444C61746ELLU, // whk_Latn_ID
-    0xD0F649444C61746ELLU, // whu_Latn_ID
-    0x851642464C61746ELLU, // wib_Latn_BF
-    0x891655534C61746ELLU, // wic_Latn_US
-    0x911641554C61746ELLU, // wie_Latn_AU
-    0x951641554C61746ELLU, // wif_Latn_AU
-    0x991641554C61746ELLU, // wig_Latn_AU
-    0x9D1641554C61746ELLU, // wih_Latn_AU
-    0xA11650474C61746ELLU, // wii_Latn_PG
-    0xA51641554C61746ELLU, // wij_Latn_AU
-    0xA91641554C61746ELLU, // wik_Latn_AU
-    0xAD1641554C61746ELLU, // wil_Latn_AU
-    0xB11641554C61746ELLU, // wim_Latn_AU
-    0xB51655534C61746ELLU, // win_Latn_US
-    0xC51642524C61746ELLU, // wir_Latn_BR
-    0xD11650474C61746ELLU, // wiu_Latn_PG
-    0xD51650474C61746ELLU, // wiv_Latn_PG
-    0xE11655534C61746ELLU, // wiy_Latn_US
-    0x81364E474C61746ELLU, // wja_Latn_NG
-    0xA1364E474C61746ELLU, // wji_Latn_NG
-    0x8156545A4C61746ELLU, // wka_Latn_TZ
-    0x8D5649444C61746ELLU, // wkd_Latn_ID
-    0xC55641554C61746ELLU, // wkr_Latn_AU
-    0xD95641554C61746ELLU, // wkw_Latn_AU
-    0xE15641554C61746ELLU, // wky_Latn_AU
-    0x817650474C61746ELLU, // wla_Latn_PG
-    0x9176455445746869LLU, // wle_Ethi_ET
-    0x997641554C61746ELLU, // wlg_Latn_AU
-    0x9D76544C4C61746ELLU, // wlh_Latn_TL
-    0xA17649444C61746ELLU, // wli_Latn_ID
-    0xB17647424C61746ELLU, // wlm_Latn_GB
-    0xB976494441726162LLU, // wlo_Arab_ID
-    0xC57656554C61746ELLU, // wlr_Latn_VU
-    0xC97657464C61746ELLU, // wls_Latn_WF
-    0xD17641554C61746ELLU, // wlu_Latn_AU
-    0xD57641524C61746ELLU, // wlv_Latn_AR
-    0xD97649444C61746ELLU, // wlw_Latn_ID
-    0xDD7647484C61746ELLU, // wlx_Latn_GH
-    0x81964E474C61746ELLU, // wma_Latn_NG
-    0x859641554C61746ELLU, // wmb_Latn_AU
-    0x899650474C61746ELLU, // wmc_Latn_PG
-    0x8D9642524C61746ELLU, // wmd_Latn_BR
-    0x91964E5044657661LLU, // wme_Deva_NP
-    0x9D96544C4C61746ELLU, // wmh_Latn_TL
-    0xA19641554C61746ELLU, // wmi_Latn_AU
-    0xB19649444C61746ELLU, // wmm_Latn_ID
-    0xB5964E434C61746ELLU, // wmn_Latn_NC
-    0xB99650474C61746ELLU, // wmo_Latn_PG
-    0xC99649444C61746ELLU, // wms_Latn_ID
-    0xCD9641554C61746ELLU, // wmt_Latn_AU
-    0xD9964D5A4C61746ELLU, // wmw_Latn_MZ
-    0xDD9650474C61746ELLU, // wmx_Latn_PG
-    0x85B650474C61746ELLU, // wnb_Latn_PG
-    0x89B650474C61746ELLU, // wnc_Latn_PG
-    0x8DB641554C61746ELLU, // wnd_Latn_AU
-    0x91B6504B41726162LLU, // wne_Arab_PK
-    0x99B649444C61746ELLU, // wng_Latn_ID
-    0xA1B64B4D41726162LLU, // wni_Arab_KM
-    0xA9B649444C61746ELLU, // wnk_Latn_ID
-    0xB1B641554C61746ELLU, // wnm_Latn_AU
-    0xB5B641554C61746ELLU, // wnn_Latn_AU
-    0xB9B649444C61746ELLU, // wno_Latn_ID
-    0xBDB650474C61746ELLU, // wnp_Latn_PG
-    0xD1B650474C61746ELLU, // wnu_Latn_PG
-    0xD9B655534C61746ELLU, // wnw_Latn_US
-    0xE1B641554C61746ELLU, // wny_Latn_AU
-    0x776F534E4C61746ELLU, // wo_Latn_SN
-    0x81D641554C61746ELLU, // woa_Latn_AU
-    0x85D643494C61746ELLU, // wob_Latn_CI
-    0x89D650474C61746ELLU, // woc_Latn_PG
-    0x8DD649444C61746ELLU, // wod_Latn_ID
-    0x91D6464D4C61746ELLU, // woe_Latn_FM
-    0x95D6474D4C61746ELLU, // wof_Latn_GM
-    0x99D650474C61746ELLU, // wog_Latn_PG
-    0xA1D649444C61746ELLU, // woi_Latn_ID
-    0xA9D6434D4C61746ELLU, // wok_Latn_CM
-    0xB1D64E474C61746ELLU, // wom_Latn_NG
-    0xB5D643444C61746ELLU, // won_Latn_CD
-    0xB9D649444C61746ELLU, // woo_Latn_ID
-    0xC5D649444C61746ELLU, // wor_Latn_ID
-    0xC9D650474C61746ELLU, // wos_Latn_PG
-    0xD9D649444C61746ELLU, // wow_Latn_ID
-    0x89F656454C61746ELLU, // wpc_Latn_VE
-    0x863641554C61746ELLU, // wrb_Latn_AU
-    0x9A3641554C61746ELLU, // wrg_Latn_AU
-    0x9E3641554C61746ELLU, // wrh_Latn_AU
-    0xA23641554C61746ELLU, // wri_Latn_AU
-    0xAA3641554C61746ELLU, // wrk_Latn_AU
-    0xAE3641554C61746ELLU, // wrl_Latn_AU
-    0xB23641554C61746ELLU, // wrm_Latn_AU
-    0xBA3641554C61746ELLU, // wro_Latn_AU
-    0xBE3649444C61746ELLU, // wrp_Latn_ID
-    0xC63641554C61746ELLU, // wrr_Latn_AU
-    0xCA3650474C61746ELLU, // wrs_Latn_PG
-    0xD23649444C61746ELLU, // wru_Latn_ID
-    0xD63650474C61746ELLU, // wrv_Latn_PG
-    0xDA3641554C61746ELLU, // wrw_Latn_AU
-    0xDE3649444C61746ELLU, // wrx_Latn_ID
-    0xE63641554C61746ELLU, // wrz_Latn_AU
-    0x825649444C61746ELLU, // wsa_Latn_ID
-    0x9A56494E476F6E67LLU, // wsg_Gong_IN
-    0xA25656554C61746ELLU, // wsi_Latn_VU
-    0xAA5650474C61746ELLU, // wsk_Latn_PG
-    0xC65650474C61746ELLU, // wsr_Latn_PG
-    0xCA5647484C61746ELLU, // wss_Latn_GH
-    0xD25642524C61746ELLU, // wsu_Latn_BR
-    0xD656414641726162LLU, // wsv_Arab_AF
-    0x8676545A4C61746ELLU, // wtb_Latn_TZ
-    0x967650474C61746ELLU, // wtf_Latn_PG
-    0x9E7641554C61746ELLU, // wth_Latn_AU
-    0xA27645544C61746ELLU, // wti_Latn_ET
-    0xAA7650474C61746ELLU, // wtk_Latn_PG
-    0xB276494E44657661LLU, // wtm_Deva_IN
-    0xDA7649444C61746ELLU, // wtw_Latn_ID
-    0x829641554C61746ELLU, // wua_Latn_AU
-    0x869641554C61746ELLU, // wub_Latn_AU
-    0x8E9654474C61746ELLU, // wud_Latn_TG
-    0xAE9649444C61746ELLU, // wul_Latn_ID
-    0xB29647414C61746ELLU, // wum_Latn_GA
-    0xB696545A4C61746ELLU, // wun_Latn_TZ
-    0xC69641554C61746ELLU, // wur_Latn_AU
-    0xCE9650474C61746ELLU, // wut_Latn_PG
-    0xD296434E48616E73LLU, // wuu_Hans_CN
-    0xD69650474C61746ELLU, // wuv_Latn_PG
-    0xDE9641554C61746ELLU, // wux_Latn_AU
-    0xE29649444C61746ELLU, // wuy_Latn_ID
-    0x82D6424A4C61746ELLU, // wwa_Latn_BJ
-    0x86D641554C61746ELLU, // wwb_Latn_AU
-    0xBAD656554C61746ELLU, // wwo_Latn_VU
-    0xC6D641554C61746ELLU, // wwr_Latn_AU
-    0xDAD6434D4C61746ELLU, // www_Latn_CM
-    0xDAF641554C61746ELLU, // wxw_Latn_AU
-    0x871641554C61746ELLU, // wyb_Latn_AU
-    0xA31641554C61746ELLU, // wyi_Latn_AU
-    0xB316504C4C61746ELLU, // wym_Latn_PL
-    0xB71655534C61746ELLU, // wyn_Latn_US
-    0xC71642524C61746ELLU, // wyr_Latn_BR
-    0xE316464A4C61746ELLU, // wyy_Latn_FJ
-    0x801745534C61746ELLU, // xaa_Latn_ES
-    0x84174E474C61746ELLU, // xab_Latn_NG
-    0x9817415A41676862LLU, // xag_Aghb_AZ
-    0xA01742524C61746ELLU, // xai_Latn_BR
-    0xA41742524C61746ELLU, // xaj_Latn_BR
-    0xA81756454C61746ELLU, // xak_Latn_VE
-    0xAC1752554379726CLLU, // xal_Cyrl_RU
-    0xB0175A414C61746ELLU, // xam_Latn_ZA
-    0xB417455445746869LLU, // xan_Ethi_ET
-    0xB817564E4C61746ELLU, // xao_Latn_VN
-    0xC41750474C61746ELLU, // xar_Latn_PG
-    0xC81752554379726CLLU, // xas_Cyrl_RU
-    0xCC1742524C61746ELLU, // xat_Latn_BR
-    0xD01749444C61746ELLU, // xau_Latn_ID
-    0xD41742524C61746ELLU, // xav_Latn_BR
-    0xD81755534C61746ELLU, // xaw_Latn_US
-    0xE01749444C61746ELLU, // xay_Latn_ID
-    0x843741554C61746ELLU, // xbb_Latn_AU
-    0x8C3741554C61746ELLU, // xbd_Latn_AU
-    0x903741554C61746ELLU, // xbe_Latn_AU
-    0x983741554C61746ELLU, // xbg_Latn_AU
-    0xA03750474C61746ELLU, // xbi_Latn_PG
-    0xA43741554C61746ELLU, // xbj_Latn_AU
-    0xB03746524C61746ELLU, // xbm_Latn_FR
-    0xB4374D594C61746ELLU, // xbn_Latn_MY
-    0xBC3741554C61746ELLU, // xbp_Latn_AU
-    0xC43749444C61746ELLU, // xbr_Latn_ID
-    0xD83742524C61746ELLU, // xbw_Latn_BR
-    0xE03741554C61746ELLU, // xby_Latn_AU
-    0x9C5755534C61746ELLU, // xch_Latn_US
-    0xB857555A43687273LLU, // xco_Chrs_UZ
-    0xC457545243617269LLU, // xcr_Cari_TR
-    0x807741554C61746ELLU, // xda_Latn_AU
-    0xA87741554C61746ELLU, // xdk_Latn_AU
-    0xB877414F4C61746ELLU, // xdo_Latn_AO
-    0xC07752554379726CLLU, // xdq_Cyrl_RU
-    0xE07749444C61746ELLU, // xdy_Latn_ID
-    0x8C97434D4C61746ELLU, // xed_Latn_CM
-    0x98975A414C61746ELLU, // xeg_Latn_ZA
-    0xB09749444C61746ELLU, // xem_Latn_ID
-    0xC49742524C61746ELLU, // xer_Latn_BR
-    0xC89750474C61746ELLU, // xes_Latn_PG
-    0xCC9742524C61746ELLU, // xet_Latn_BR
-    0xD09750474C61746ELLU, // xeu_Latn_PG
-    0x84D743494C61746ELLU, // xgb_Latn_CI
-    0x8CD741554C61746ELLU, // xgd_Latn_AU
-    0x98D741554C61746ELLU, // xgg_Latn_AU
-    0xA0D741554C61746ELLU, // xgi_Latn_AU
-    0xB0D741554C61746ELLU, // xgm_Latn_AU
-    0xD0D741554C61746ELLU, // xgu_Latn_AU
-    0xD8D741554C61746ELLU, // xgw_Latn_AU
-    0x78685A414C61746ELLU, // xh_Latn_ZA
-    0x90F7504B41726162LLU, // xhe_Arab_PK
-    0xB0F74B484B686D72LLU, // xhm_Khmr_KH
-    0xD4F7564E4C61746ELLU, // xhv_Latn_VN
-    0xA1175A414C61746ELLU, // xii_Latn_ZA
-    0xB51747544C61746ELLU, // xin_Latn_GT
-    0xC51742524C61746ELLU, // xir_Latn_BR
-    0xC917494E4F727961LLU, // xis_Orya_IN
-    0xE11742524C61746ELLU, // xiy_Latn_BR
-    0x853741554C61746ELLU, // xjb_Latn_AU
-    0xCD3741554C61746ELLU, // xjt_Latn_AU
-    0x8157504B41726162LLU, // xka_Arab_PK
-    0x8557424A4C61746ELLU, // xkb_Latn_BJ
-    0x8957495241726162LLU, // xkc_Arab_IR
-    0x8D5749444C61746ELLU, // xkd_Latn_ID
-    0x915749444C61746ELLU, // xke_Latn_ID
-    0x9557425454696274LLU, // xkf_Tibt_BT
-    0x99574D4C4C61746ELLU, // xkg_Latn_ML
-    0xA557495241726162LLU, // xkj_Arab_IR
-    0xAD5749444C61746ELLU, // xkl_Latn_ID
-    0xB55749444C61746ELLU, // xkn_Latn_ID
-    0xBD57495241726162LLU, // xkp_Arab_IR
-    0xC15749444C61746ELLU, // xkq_Latn_ID
-    0xC55742524C61746ELLU, // xkr_Latn_BR
-    0xC95749444C61746ELLU, // xks_Latn_ID
-    0xCD5747484C61746ELLU, // xkt_Latn_GH
-    0xD15743474C61746ELLU, // xku_Latn_CG
-    0xD55742574C61746ELLU, // xkv_Latn_BW
-    0xD95749444C61746ELLU, // xkw_Latn_ID
-    0xDD5750474C61746ELLU, // xkx_Latn_PG
-    0xE1574D594C61746ELLU, // xky_Latn_MY
-    0xE55742544C61746ELLU, // xkz_Latn_BT
-    0x817750474C61746ELLU, // xla_Latn_PG
-    0x897754524C796369LLU, // xlc_Lyci_TR
-    0x8D7754524C796469LLU, // xld_Lydi_TR
-    0xE1774952456C796DLLU, // xly_Elym_IR
-    0x8197534F4C61746ELLU, // xma_Latn_SO
-    0x8597434D4C61746ELLU, // xmb_Latn_CM
-    0x89974D5A4C61746ELLU, // xmc_Latn_MZ
-    0x8D97434D4C61746ELLU, // xmd_Latn_CM
-    0x9597474547656F72LLU, // xmf_Geor_GE
-    0x9997434D4C61746ELLU, // xmg_Latn_CM
-    0x9D9741554C61746ELLU, // xmh_Latn_AU
-    0xA597434D4C61746ELLU, // xmj_Latn_CM
-    0xB19749444C61746ELLU, // xmm_Latn_ID
-    0xB597434E4D616E69LLU, // xmn_Mani_CN
-    0xB99742524C61746ELLU, // xmo_Latn_BR
-    0xBD9741554C61746ELLU, // xmp_Latn_AU
-    0xC19741554C61746ELLU, // xmq_Latn_AU
-    0xC59753444D657263LLU, // xmr_Merc_SD
-    0xCD9749444C61746ELLU, // xmt_Latn_ID
-    0xD19741554C61746ELLU, // xmu_Latn_AU
-    0xD5974D474C61746ELLU, // xmv_Latn_MG
-    0xD9974D474C61746ELLU, // xmw_Latn_MG
-    0xDD9749444C61746ELLU, // xmx_Latn_ID
-    0xE19741554C61746ELLU, // xmy_Latn_AU
-    0xE59749444C61746ELLU, // xmz_Latn_ID
-    0x81B753414E617262LLU, // xna_Narb_SA
-    0x85B754574C61746ELLU, // xnb_Latn_TW
-    0xA1B741554C61746ELLU, // xni_Latn_AU
-    0xA5B7545A4C61746ELLU, // xnj_Latn_TZ
-    0xA9B741554C61746ELLU, // xnk_Latn_AU
-    0xB1B741554C61746ELLU, // xnm_Latn_AU
-    0xB5B750484C61746ELLU, // xnn_Latn_PH
-    0xC1B74D5A4C61746ELLU, // xnq_Latn_MZ
-    0xC5B7494E44657661LLU, // xnr_Deva_IN
-    0xCDB755534C61746ELLU, // xnt_Latn_US
-    0xD1B741554C61746ELLU, // xnu_Latn_AU
-    0xE1B741554C61746ELLU, // xny_Latn_AU
-    0xE5B745474C61746ELLU, // xnz_Latn_EG
-    0x89D74E474C61746ELLU, // xoc_Latn_NG
-    0x8DD749444C61746ELLU, // xod_Latn_ID
-    0x99D755474C61746ELLU, // xog_Latn_UG
-    0xA1D750474C61746ELLU, // xoi_Latn_PG
-    0xA9D742524C61746ELLU, // xok_Latn_BR
-    0xB1D753444C61746ELLU, // xom_Latn_SD
-    0xB5D747484C61746ELLU, // xon_Latn_GH
-    0xB9D742524C61746ELLU, // xoo_Latn_BR
-    0xBDD750474C61746ELLU, // xop_Latn_PG
-    0xC5D742524C61746ELLU, // xor_Latn_BR
-    0xD9D750474C61746ELLU, // xow_Latn_PG
-    0x81F741554C61746ELLU, // xpa_Latn_AU
-    0x85F741554C61746ELLU, // xpb_Latn_AU
-    0x8DF741554C61746ELLU, // xpd_Latn_AU
-    0x95F741554C61746ELLU, // xpf_Latn_AU
-    0x99F754524772656BLLU, // xpg_Grek_TR
-    0x9DF741554C61746ELLU, // xph_Latn_AU
-    0xA1F747424F67616DLLU, // xpi_Ogam_GB
-    0xA5F741554C61746ELLU, // xpj_Latn_AU
-    0xA9F742524C61746ELLU, // xpk_Latn_BR
-    0xADF741554C61746ELLU, // xpl_Latn_AU
-    0xB1F752554379726CLLU, // xpm_Cyrl_RU
-    0xB5F742524C61746ELLU, // xpn_Latn_BR
-    0xB9F74D584C61746ELLU, // xpo_Latn_MX
-    0xC1F755534C61746ELLU, // xpq_Latn_US
-    0xC5F7495250727469LLU, // xpr_Prti_IR
-    0xCDF741554C61746ELLU, // xpt_Latn_AU
-    0xD5F741554C61746ELLU, // xpv_Latn_AU
-    0xD9F741554C61746ELLU, // xpw_Latn_AU
-    0xDDF741554C61746ELLU, // xpx_Latn_AU
-    0xE5F741554C61746ELLU, // xpz_Latn_AU
-    0x823742524C61746ELLU, // xra_Latn_BR
-    0x863742464C61746ELLU, // xrb_Latn_BF
-    0x8E3741554C61746ELLU, // xrd_Latn_AU
-    0x923742524C61746ELLU, // xre_Latn_BR
-    0x9A3741554C61746ELLU, // xrg_Latn_AU
-    0xA23742524C61746ELLU, // xri_Latn_BR
-    0xB23752554379726CLLU, // xrm_Cyrl_RU
-    0xB63752554379726CLLU, // xrn_Cyrl_RU
-    0xC63749544C61746ELLU, // xrr_Latn_IT
-    0xD23741554C61746ELLU, // xru_Latn_AU
-    0xDA3750474C61746ELLU, // xrw_Latn_PG
-    0x8257594553617262LLU, // xsa_Sarb_YE
-    0x865750484C61746ELLU, // xsb_Latn_PH
-    0x925749444C61746ELLU, // xse_Latn_ID
-    0x9E574E474C61746ELLU, // xsh_Latn_NG
-    0xA25750474C61746ELLU, // xsi_Latn_PG
-    0xB25747484C61746ELLU, // xsm_Latn_GH
-    0xB6574E474C61746ELLU, // xsn_Latn_NG
-    0xBE5750474C61746ELLU, // xsp_Latn_PG
-    0xC2574D5A4C61746ELLU, // xsq_Latn_MZ
-    0xC6574E5044657661LLU, // xsr_Deva_NP
-    0xD25756454C61746ELLU, // xsu_Latn_VE
-    0xE25754574C61746ELLU, // xsy_Latn_TW
-    0x82774D584C61746ELLU, // xta_Latn_MX
-    0x86774D584C61746ELLU, // xtb_Latn_MX
-    0x8A7753444C61746ELLU, // xtc_Latn_SD
-    0x8E774D584C61746ELLU, // xtd_Latn_MX
-    0x927749444C61746ELLU, // xte_Latn_ID
-    0x9E7741554C61746ELLU, // xth_Latn_AU
-    0xA2774D584C61746ELLU, // xti_Latn_MX
-    0xA6774D584C61746ELLU, // xtj_Latn_MX
-    0xAE774D584C61746ELLU, // xtl_Latn_MX
-    0xB2774D584C61746ELLU, // xtm_Latn_MX
-    0xB6774D584C61746ELLU, // xtn_Latn_MX
-    0xBE774D584C61746ELLU, // xtp_Latn_MX
-    0xC277495242726168LLU, // xtq_Brah_IR
-    0xCA774D584C61746ELLU, // xts_Latn_MX
-    0xCE774D584C61746ELLU, // xtt_Latn_MX
-    0xD2774D584C61746ELLU, // xtu_Latn_MX
-    0xD67741554C61746ELLU, // xtv_Latn_AU
-    0xDA7742524C61746ELLU, // xtw_Latn_BR
-    0xE2774D584C61746ELLU, // xty_Latn_MX
-    0x8697494E54616D6CLLU, // xub_Taml_IN
-    0x8E9741554C61746ELLU, // xud_Latn_AU
-    0xA697494E54616D6CLLU, // xuj_Taml_IN
-    0xAE9741554C61746ELLU, // xul_Latn_AU
-    0xB29749544C61746ELLU, // xum_Latn_IT
-    0xB69741554C61746ELLU, // xun_Latn_AU
-    0xBA9754444C61746ELLU, // xuo_Latn_TD
-    0xCE9741554C61746ELLU, // xut_Latn_AU
-    0xD2974E414C61746ELLU, // xuu_Latn_NA
-    0x92B749544974616CLLU, // xve_Ital_IT
-    0xA2B7414641726162LLU, // xvi_Arab_AF
-    0xB6B745534C61746ELLU, // xvn_Latn_ES
-    0xBAB749544C61746ELLU, // xvo_Latn_IT
-    0xCAB749544C61746ELLU, // xvs_Latn_IT
-    0x82D742524C61746ELLU, // xwa_Latn_BR
-    0x8ED741554C61746ELLU, // xwd_Latn_AU
-    0x92D7424A4C61746ELLU, // xwe_Latn_BJ
-    0xA6D741554C61746ELLU, // xwj_Latn_AU
-    0xAAD741554C61746ELLU, // xwk_Latn_AU
-    0xAED7424A4C61746ELLU, // xwl_Latn_BJ
-    0xBAD752554379726CLLU, // xwo_Cyrl_RU
-    0xC6D749444C61746ELLU, // xwr_Latn_ID
-    0xCED741554C61746ELLU, // xwt_Latn_AU
-    0xDAD741554C61746ELLU, // xww_Latn_AU
-    0x86F747484C61746ELLU, // xxb_Latn_GH
-    0xAAF749444C61746ELLU, // xxk_Latn_ID
-    0xB2F741554C61746ELLU, // xxm_Latn_AU
-    0xC6F742524C61746ELLU, // xxr_Latn_BR
-    0xCEF749444C61746ELLU, // xxt_Latn_ID
-    0x831741554C61746ELLU, // xya_Latn_AU
-    0x871741554C61746ELLU, // xyb_Latn_AU
-    0xA71741554C61746ELLU, // xyj_Latn_AU
-    0xAB1741554C61746ELLU, // xyk_Latn_AU
-    0xAF1742524C61746ELLU, // xyl_Latn_BR
-    0xCF1741554C61746ELLU, // xyt_Latn_AU
-    0xE31741554C61746ELLU, // xyy_Latn_AU
-    0x9F37434E4D617263LLU, // xzh_Marc_CN
-    0xBF374D584C61746ELLU, // xzp_Latn_MX
-    0x801850454C61746ELLU, // yaa_Latn_PE
-    0x841842524C61746ELLU, // yab_Latn_BR
-    0x881849444C61746ELLU, // yac_Latn_ID
-    0x8C1850454C61746ELLU, // yad_Latn_PE
-    0x901856454C61746ELLU, // yae_Latn_VE
-    0x941843444C61746ELLU, // yaf_Latn_CD
-    0x9818434C4C61746ELLU, // yag_Latn_CL
-    0x9C18544A4C61746ELLU, // yah_Latn_TJ
-    0xA018544A4379726CLLU, // yai_Cyrl_TJ
-    0xA41843464C61746ELLU, // yaj_Latn_CF
-    0xA81855534C61746ELLU, // yak_Latn_US
-    0xAC18474E4C61746ELLU, // yal_Latn_GN
-    0xB018434D4C61746ELLU, // yam_Latn_CM
-    0xB4184E494C61746ELLU, // yan_Latn_NI
-    0xB8184D5A4C61746ELLU, // yao_Latn_MZ
-    0xBC18464D4C61746ELLU, // yap_Latn_FM
-    0xC0184D584C61746ELLU, // yaq_Latn_MX
-    0xC41856454C61746ELLU, // yar_Latn_VE
-    0xC818434D4C61746ELLU, // yas_Latn_CM
-    0xCC18434D4C61746ELLU, // yat_Latn_CM
-    0xD01856454C61746ELLU, // yau_Latn_VE
-    0xD418434D4C61746ELLU, // yav_Latn_CM
-    0xD81842524C61746ELLU, // yaw_Latn_BR
-    0xDC18414F4C61746ELLU, // yax_Latn_AO
-    0xE0184E474C61746ELLU, // yay_Latn_NG
-    0xE4184E474C61746ELLU, // yaz_Latn_NG
-    0x80384E474C61746ELLU, // yba_Latn_NG
-    0x8438434D4C61746ELLU, // ybb_Latn_CM
-    0x9038434E4C61746ELLU, // ybe_Latn_CN
-    0x9C384E5044657661LLU, // ybh_Deva_NP
-    0xA0384E5044657661LLU, // ybi_Deva_NP
-    0xA4384E474C61746ELLU, // ybj_Latn_NG
-    0xAC384E474C61746ELLU, // ybl_Latn_NG
-    0xB03850474C61746ELLU, // ybm_Latn_PG
-    0xB43842524C61746ELLU, // ybn_Latn_BR
-    0xB83850474C61746ELLU, // ybo_Latn_PG
-    0xDC3850474C61746ELLU, // ybx_Latn_PG
-    0xE03850474C61746ELLU, // yby_Latn_PG
-    0xAC58434E4C61746ELLU, // ycl_Latn_CN
-    0xB458434F4C61746ELLU, // ycn_Latn_CO
-    0xC45854574C61746ELLU, // ycr_Latn_TW
-    0x807841554C61746ELLU, // yda_Latn_AU
-    0x907850474C61746ELLU, // yde_Latn_PG
-    0x9878504B41726162LLU, // ydg_Arab_PK
-    0xA87850474C61746ELLU, // ydk_Latn_PG
-    0x8098494E4D6C796DLLU, // yea_Mlym_IN
-    0x889844454C61746ELLU, // yec_Latn_DE
-    0x909850474C61746ELLU, // yee_Latn_PG
-    0xA098434D4C61746ELLU, // yei_Latn_CM
-    0xA49847524772656BLLU, // yej_Grek_GR
-    0xAC9843444C61746ELLU, // yel_Latn_CD
-    0xC4984E474C61746ELLU, // yer_Latn_NG
-    0xC8984E474C61746ELLU, // yes_Latn_NG
-    0xCC9849444C61746ELLU, // yet_Latn_ID
-    0xD098494E54656C75LLU, // yeu_Telu_IN
-    0xD49850474C61746ELLU, // yev_Latn_PG
-    0xE09842574C61746ELLU, // yey_Latn_BW
-    0x80D841554C61746ELLU, // yga_Latn_AU
-    0xA0D841554C61746ELLU, // ygi_Latn_AU
-    0xACD850474C61746ELLU, // ygl_Latn_PG
-    0xB0D850474C61746ELLU, // ygm_Latn_PG
-    0xBCD8434E506C7264LLU, // ygp_Plrd_CN
-    0xC4D850474C61746ELLU, // ygr_Latn_PG
-    0xD0D841554C61746ELLU, // ygu_Latn_AU
-    0xD8D850474C61746ELLU, // ygw_Latn_PG
-    0x8CF8494C48656272LLU, // yhd_Hebr_IL
-    0x7969554148656272LLU, // yi_Hebr_UA
-    0x811841554C61746ELLU, // yia_Latn_AU
-    0x9918434E59696969LLU, // yig_Yiii_CN
-    0x9D18444548656272LLU, // yih_Hebr_DE
-    0xA11841554C61746ELLU, // yii_Latn_AU
-    0xA51841554C61746ELLU, // yij_Latn_AU
-    0xAD1841554C61746ELLU, // yil_Latn_AU
-    0xB118494E4C61746ELLU, // yim_Latn_IN
-    0xC51849444C61746ELLU, // yir_Latn_ID
-    0xC91850474C61746ELLU, // yis_Latn_PG
-    0xD518434E59696969LLU, // yiv_Yiii_CN
-    0x815850484C61746ELLU, // yka_Latn_PH
-    0x995852554379726CLLU, // ykg_Cyrl_RU
-    0x9D584D4E4379726CLLU, // ykh_Cyrl_MN
-    0xA15849444C61746ELLU, // yki_Latn_ID
-    0xA95850474C61746ELLU, // ykk_Latn_PG
-    0xB15850474C61746ELLU, // ykm_Latn_PG
-    0xB958434D4C61746ELLU, // yko_Latn_CM
-    0xC55850474C61746ELLU, // ykr_Latn_PG
-    0xE15843464C61746ELLU, // yky_Latn_CF
-    0x817850474C61746ELLU, // yla_Latn_PG
-    0x857850474C61746ELLU, // ylb_Latn_PG
-    0x917850474C61746ELLU, // yle_Latn_PG
-    0x997850474C61746ELLU, // ylg_Latn_PG
-    0xA17849444C61746ELLU, // yli_Latn_ID
-    0xAD7850474C61746ELLU, // yll_Latn_PG
-    0xC57841554C61746ELLU, // ylr_Latn_AU
-    0xD17850474C61746ELLU, // ylu_Latn_PG
-    0xE1784E434C61746ELLU, // yly_Latn_NC
-    0x859850474C61746ELLU, // ymb_Latn_PG
-    0x919850454C61746ELLU, // yme_Latn_PE
-    0x999843444C61746ELLU, // ymg_Latn_CD
-    0xA9984D5A4C61746ELLU, // ymk_Latn_MZ
-    0xAD9850474C61746ELLU, // yml_Latn_PG
-    0xB198534F4C61746ELLU, // ymm_Latn_SO
-    0xB59849444C61746ELLU, // ymn_Latn_ID
-    0xB99850474C61746ELLU, // ymo_Latn_PG
-    0xBD9850474C61746ELLU, // ymp_Latn_PG
-    0x81B8434E506C7264LLU, // yna_Plrd_CN
-    0x8DB841554C61746ELLU, // ynd_Latn_AU
-    0x99B843444C61746ELLU, // yng_Latn_CD
-    0xA9B852554379726CLLU, // ynk_Cyrl_RU
-    0xADB850474C61746ELLU, // ynl_Latn_PG
-    0xC1B84E474C61746ELLU, // ynq_Latn_NG
-    0xC9B843444C61746ELLU, // yns_Latn_CD
-    0xD1B8434F4C61746ELLU, // ynu_Latn_CO
-    0x796F4E474C61746ELLU, // yo_Latn_NG
-    0x85D850474C61746ELLU, // yob_Latn_PG
-    0x99D850484C61746ELLU, // yog_Latn_PH
-    0xA1D84A504A70616ELLU, // yoi_Jpan_JP
-    0xA9D855534C61746ELLU, // yok_Latn_US
-    0xADD849454C61746ELLU, // yol_Latn_IE
-    0xB1D843444C61746ELLU, // yom_Latn_CD
-    0xB5D850474C61746ELLU, // yon_Latn_PG
-    0xCDD84E474C61746ELLU, // yot_Latn_NG
-    0xE1D8544854686169LLU, // yoy_Thai_TH
-    0x823850474C61746ELLU, // yra_Latn_PG
-    0x863850474C61746ELLU, // yrb_Latn_PG
-    0x923843494C61746ELLU, // yre_Latn_CI
-    0xAA3852554379726CLLU, // yrk_Cyrl_RU
-    0xAE3842524C61746ELLU, // yrl_Latn_BR
-    0xB23841554C61746ELLU, // yrm_Latn_AU
-    0xBA3842524C61746ELLU, // yro_Latn_BR
-    0xCA3849444C61746ELLU, // yrs_Latn_ID
-    0xDA3850474C61746ELLU, // yrw_Latn_PG
-    0xE23841554C61746ELLU, // yry_Latn_AU
-    0x8E58434E59696969LLU, // ysd_Yiii_CN
-    0xB658434E59696969LLU, // ysn_Yiii_CN
-    0xBE58434E59696969LLU, // ysp_Yiii_CN
-    0xC65852554379726CLLU, // ysr_Cyrl_RU
-    0xCA5850474C61746ELLU, // yss_Latn_PG
-    0xE258434E506C7264LLU, // ysy_Plrd_CN
-    0xDA7850474C61746ELLU, // ytw_Latn_PG
-    0xE27841554C61746ELLU, // yty_Latn_AU
-    0x82984D584C61746ELLU, // yua_Latn_MX
-    0x869841554C61746ELLU, // yub_Latn_AU
-    0x8A9855534C61746ELLU, // yuc_Latn_US
-    0x8E98494C48656272LLU, // yud_Hebr_IL
-    0x9298434E48616E73LLU, // yue_Hans_CN
-    0x9298484B48616E74LLU, // yue_Hant_HK
-    0x969855534C61746ELLU, // yuf_Latn_US
-    0x9A9852554379726CLLU, // yug_Cyrl_RU
-    0xA298434F4C61746ELLU, // yui_Latn_CO
-    0xA69850474C61746ELLU, // yuj_Latn_PG
-    0xAE9843464C61746ELLU, // yul_Latn_CF
-    0xB29855534C61746ELLU, // yum_Latn_US
-    0xB6984E474C61746ELLU, // yun_Latn_NG
-    0xBE98434F4C61746ELLU, // yup_Latn_CO
-    0xC298424F4C61746ELLU, // yuq_Latn_BO
-    0xC69855534C61746ELLU, // yur_Latn_US
-    0xCE9850474C61746ELLU, // yut_Latn_PG
-    0xDA9850474C61746ELLU, // yuw_Latn_PG
-    0xDE9852554379726CLLU, // yux_Cyrl_RU
-    0xE698424F4C61746ELLU, // yuz_Latn_BO
-    0x82B849444C61746ELLU, // yva_Latn_ID
-    0xCEB856454C61746ELLU, // yvt_Latn_VE
-    0x82D850474C61746ELLU, // ywa_Latn_PG
-    0x9AD841554C61746ELLU, // ywg_Latn_AU
-    0xB6D842524C61746ELLU, // ywn_Latn_BR
-    0xC2D8434E506C7264LLU, // ywq_Plrd_CN
-    0xC6D841554C61746ELLU, // ywr_Latn_AU
-    0xD2D8434E506C7264LLU, // ywu_Plrd_CN
-    0xDAD841554C61746ELLU, // yww_Latn_AU
-    0x82F841554C61746ELLU, // yxa_Latn_AU
-    0x9AF841554C61746ELLU, // yxg_Latn_AU
-    0xAEF841554C61746ELLU, // yxl_Latn_AU
-    0xB2F841554C61746ELLU, // yxm_Latn_AU
-    0xD2F841554C61746ELLU, // yxu_Latn_AU
-    0xE2F841554C61746ELLU, // yxy_Latn_AU
-    0xC71841554C61746ELLU, // yyr_Latn_AU
-    0xD31850474C61746ELLU, // yyu_Latn_PG
-    0x7A61434E4C61746ELLU, // za_Latn_CN
-    0x80194D584C61746ELLU, // zaa_Latn_MX
-    0x84194D584C61746ELLU, // zab_Latn_MX
-    0x88194D584C61746ELLU, // zac_Latn_MX
-    0x8C194D584C61746ELLU, // zad_Latn_MX
-    0x90194D584C61746ELLU, // zae_Latn_MX
-    0x94194D584C61746ELLU, // zaf_Latn_MX
-    0x981953444C61746ELLU, // zag_Latn_SD
-    0x9C194E474C61746ELLU, // zah_Latn_NG
-    0xA419545A4C61746ELLU, // zaj_Latn_TZ
-    0xA819545A4C61746ELLU, // zak_Latn_TZ
-    0xB0194D584C61746ELLU, // zam_Latn_MX
-    0xB8194D584C61746ELLU, // zao_Latn_MX
-    0xBC194D584C61746ELLU, // zap_Latn_MX
-    0xC0194D584C61746ELLU, // zaq_Latn_MX
-    0xC4194D584C61746ELLU, // zar_Latn_MX
-    0xC8194D584C61746ELLU, // zas_Latn_MX
-    0xCC194D584C61746ELLU, // zat_Latn_MX
-    0xD019494E54696274LLU, // zau_Tibt_IN
-    0xD4194D584C61746ELLU, // zav_Latn_MX
-    0xD8194D584C61746ELLU, // zaw_Latn_MX
-    0xDC194D584C61746ELLU, // zax_Latn_MX
-    0xE01945544C61746ELLU, // zay_Latn_ET
-    0xE4194E474C61746ELLU, // zaz_Latn_NG
-    0x88394D594C61746ELLU, // zbc_Latn_MY
-    0x90394D594C61746ELLU, // zbe_Latn_MY
-    0xCC3949444C61746ELLU, // zbt_Latn_ID
-    0xD0394E474C61746ELLU, // zbu_Latn_NG
-    0xD8394D594C61746ELLU, // zbw_Latn_MY
-    0x80594D584C61746ELLU, // zca_Latn_MX
-    0x9C59434E48616E69LLU, // zch_Hani_CN
-    0xA4794B4D41726162LLU, // zdj_Arab_KM
-    0x80994E4C4C61746ELLU, // zea_Latn_NL
-    0x989950474C61746ELLU, // zeg_Latn_PG
-    0x9C99434E48616E69LLU, // zeh_Hani_CN
-    0xB0994E474C61746ELLU, // zem_Latn_NG
-    0xB4994D5254666E67LLU, // zen_Tfng_MR
-    0x80D9545A4C61746ELLU, // zga_Latn_TZ
-    0x84D9434E48616E69LLU, // zgb_Hani_CN
-    0x9CD94D4154666E67LLU, // zgh_Tfng_MA
-    0xB0D9434E48616E69LLU, // zgm_Hani_CN
-    0xB4D9434E48616E69LLU, // zgn_Hani_CN
-    0xC4D950474C61746ELLU, // zgr_Latn_PG
-    0x7A685457426F706FLLU, // zh_Bopo_TW
-    0x7A68545748616E62LLU, // zh_Hanb_TW
-    0x7A68434E48616E73LLU, // zh_Hans_CN
-    0x7A68545748616E74LLU, // zh_Hant_TW
-    0x8CF9434E48616E69LLU, // zhd_Hani_CN
-    0xA0F94E474C61746ELLU, // zhi_Latn_NG
-    0xB4F9434E4C61746ELLU, // zhn_Latn_CN
-    0xD8F9434D4C61746ELLU, // zhw_Latn_CM
-    0xDCF9434E4E736875LLU, // zhx_Nshu_CN
-    0x811950474C61746ELLU, // zia_Latn_PG
-    0xA91950474C61746ELLU, // zik_Latn_PG
-    0xAD19474E4C61746ELLU, // zil_Latn_GN
-    0xB11954444C61746ELLU, // zim_Latn_TD
-    0xB519545A4C61746ELLU, // zin_Latn_TZ
-    0xD919545A4C61746ELLU, // ziw_Latn_TZ
-    0xE5194E474C61746ELLU, // ziz_Latn_NG
-    0x815949444C61746ELLU, // zka_Latn_ID
-    0x8D594D4D4C61746ELLU, // zkd_Latn_MM
-    0xB95952554379726CLLU, // zko_Cyrl_RU
-    0xBD5942524C61746ELLU, // zkp_Latn_BR
-    0xCD59434E4B697473LLU, // zkt_Kits_CN
-    0xD15941554C61746ELLU, // zku_Latn_AU
-    0xE55952554379726CLLU, // zkz_Cyrl_RU
-    0x817943444C61746ELLU, // zla_Latn_CD
-    0xA579434E48616E69LLU, // zlj_Hani_CN
-    0xB17954474C61746ELLU, // zlm_Latn_TG
-    0xB579434E48616E69LLU, // zln_Hani_CN
-    0xC179434E48616E69LLU, // zlq_Hani_CN
-    0xD1794E474C61746ELLU, // zlu_Latn_NG
-    0x819941554C61746ELLU, // zma_Latn_AU
-    0x859943444C61746ELLU, // zmb_Latn_CD
-    0x899941554C61746ELLU, // zmc_Latn_AU
-    0x8D9941554C61746ELLU, // zmd_Latn_AU
-    0x919941554C61746ELLU, // zme_Latn_AU
-    0x959943444C61746ELLU, // zmf_Latn_CD
-    0x999941554C61746ELLU, // zmg_Latn_AU
-    0x9D9950474C61746ELLU, // zmh_Latn_PG
-    0xA1994D594C61746ELLU, // zmi_Latn_MY
-    0xA59941554C61746ELLU, // zmj_Latn_AU
-    0xA99941554C61746ELLU, // zmk_Latn_AU
-    0xAD9941554C61746ELLU, // zml_Latn_AU
-    0xB19941554C61746ELLU, // zmm_Latn_AU
-    0xB59947414C61746ELLU, // zmn_Latn_GA
-    0xB99953444C61746ELLU, // zmo_Latn_SD
-    0xBD9943444C61746ELLU, // zmp_Latn_CD
-    0xC19943444C61746ELLU, // zmq_Latn_CD
-    0xC59941554C61746ELLU, // zmr_Latn_AU
-    0xC99943444C61746ELLU, // zms_Latn_CD
-    0xCD9941554C61746ELLU, // zmt_Latn_AU
-    0xD19941554C61746ELLU, // zmu_Latn_AU
-    0xD59941554C61746ELLU, // zmv_Latn_AU
-    0xD99943444C61746ELLU, // zmw_Latn_CD
-    0xDD9943474C61746ELLU, // zmx_Latn_CG
-    0xE19941554C61746ELLU, // zmy_Latn_AU
-    0xE59943444C61746ELLU, // zmz_Latn_CD
-    0x81B954444C61746ELLU, // zna_Latn_TD
-    0x91B943444C61746ELLU, // zne_Latn_CD
-    0x99B9564E4C61746ELLU, // zng_Latn_VN
-    0xA9B941554C61746ELLU, // znk_Latn_AU
-    0xC9B94E474C61746ELLU, // zns_Latn_NG
-    0x89D94D584C61746ELLU, // zoc_Latn_MX
-    0x9DD94D584C61746ELLU, // zoh_Latn_MX
-    0xB1D9494E4C61746ELLU, // zom_Latn_IN
-    0xB9D94D584C61746ELLU, // zoo_Latn_MX
-    0xC1D94D584C61746ELLU, // zoq_Latn_MX
-    0xC5D94D584C61746ELLU, // zor_Latn_MX
-    0xC9D94D584C61746ELLU, // zos_Latn_MX
-    0x81F94D584C61746ELLU, // zpa_Latn_MX
-    0x85F94D584C61746ELLU, // zpb_Latn_MX
-    0x89F94D584C61746ELLU, // zpc_Latn_MX
-    0x8DF94D584C61746ELLU, // zpd_Latn_MX
-    0x91F94D584C61746ELLU, // zpe_Latn_MX
-    0x95F94D584C61746ELLU, // zpf_Latn_MX
-    0x99F94D584C61746ELLU, // zpg_Latn_MX
-    0x9DF94D584C61746ELLU, // zph_Latn_MX
-    0xA1F94D584C61746ELLU, // zpi_Latn_MX
-    0xA5F94D584C61746ELLU, // zpj_Latn_MX
-    0xA9F94D584C61746ELLU, // zpk_Latn_MX
-    0xADF94D584C61746ELLU, // zpl_Latn_MX
-    0xB1F94D584C61746ELLU, // zpm_Latn_MX
-    0xB5F94D584C61746ELLU, // zpn_Latn_MX
-    0xB9F94D584C61746ELLU, // zpo_Latn_MX
-    0xBDF94D584C61746ELLU, // zpp_Latn_MX
-    0xC1F94D584C61746ELLU, // zpq_Latn_MX
-    0xC5F94D584C61746ELLU, // zpr_Latn_MX
-    0xC9F94D584C61746ELLU, // zps_Latn_MX
-    0xCDF94D584C61746ELLU, // zpt_Latn_MX
-    0xD1F94D584C61746ELLU, // zpu_Latn_MX
-    0xD5F94D584C61746ELLU, // zpv_Latn_MX
-    0xD9F94D584C61746ELLU, // zpw_Latn_MX
-    0xDDF94D584C61746ELLU, // zpx_Latn_MX
-    0xE1F94D584C61746ELLU, // zpy_Latn_MX
-    0xE5F94D584C61746ELLU, // zpz_Latn_MX
-    0x9219434E48616E69LLU, // zqe_Hani_CN
-    0x9A39494E4F727961LLU, // zrg_Orya_IN
-    0xB63954444C61746ELLU, // zrn_Latn_TD
-    0xBA3945434C61746ELLU, // zro_Latn_EC
-    0xBE39465248656272LLU, // zrp_Hebr_FR
-    0xCA3949444C61746ELLU, // zrs_Latn_ID
-    0x825950474C61746ELLU, // zsa_Latn_PG
-    0xC6594D584C61746ELLU, // zsr_Latn_MX
-    0xD25950474C61746ELLU, // zsu_Latn_PG
-    0x92794D584C61746ELLU, // zte_Latn_MX
-    0x9A794D584C61746ELLU, // ztg_Latn_MX
-    0xAE794D584C61746ELLU, // ztl_Latn_MX
-    0xB2794D584C61746ELLU, // ztm_Latn_MX
-    0xB6794D584C61746ELLU, // ztn_Latn_MX
-    0xBE794D584C61746ELLU, // ztp_Latn_MX
-    0xC2794D584C61746ELLU, // ztq_Latn_MX
-    0xCA794D584C61746ELLU, // zts_Latn_MX
-    0xCE794D584C61746ELLU, // ztt_Latn_MX
-    0xD2794D584C61746ELLU, // ztu_Latn_MX
-    0xDE794D584C61746ELLU, // ztx_Latn_MX
-    0xE2794D584C61746ELLU, // zty_Latn_MX
-    0x7A755A414C61746ELLU, // zu_Latn_ZA
-    0x9E9950474C61746ELLU, // zuh_Latn_PG
-    0xB2994F4D41726162LLU, // zum_Arab_OM
-    0xB69955534C61746ELLU, // zun_Latn_US
-    0xE299434D4C61746ELLU, // zuy_Latn_CM
-    0x82D9455445746869LLU, // zwa_Ethi_ET
-    0x9B19434E48616E69LLU, // zyg_Hani_CN
-    0xA719434E4C61746ELLU, // zyj_Latn_CN
-    0xB719434E48616E69LLU, // zyn_Hani_CN
-    0xBF194D4D4C61746ELLU, // zyp_Latn_MM
-    0x833954524C61746ELLU, // zza_Latn_TR
-    0xA739434E48616E69LLU, // zzj_Hani_CN
-});
-
-const std::unordered_map<uint32_t, uint32_t> ARAB_PARENTS({
-    {0x61724145u, 0x61729420u}, // ar-AE -> ar-015
-    {0x6172445Au, 0x61729420u}, // ar-DZ -> ar-015
-    {0x61724548u, 0x61729420u}, // ar-EH -> ar-015
-    {0x61724C59u, 0x61729420u}, // ar-LY -> ar-015
-    {0x61724D41u, 0x61729420u}, // ar-MA -> ar-015
-    {0x6172544Eu, 0x61729420u}, // ar-TN -> ar-015
-});
-
-const std::unordered_map<uint32_t, uint32_t> DEVA_PARENTS({
-    {0x68690000u, 0x656E494Eu}, // hi-Latn -> en-IN
-});
-
-const std::unordered_map<uint32_t, uint32_t> HANT_PARENTS({
-    {0x7A684D4Fu, 0x7A68484Bu}, // zh-Hant-MO -> zh-Hant-HK
-});
-
-const std::unordered_map<uint32_t, uint32_t> LATN_PARENTS({
-    {0x656E80A1u, 0x656E8400u}, // en-150 -> en-001
-    {0x656E4147u, 0x656E8400u}, // en-AG -> en-001
-    {0x656E4149u, 0x656E8400u}, // en-AI -> en-001
-    {0x656E4154u, 0x656E80A1u}, // en-AT -> en-150
-    {0x656E4155u, 0x656E8400u}, // en-AU -> en-001
-    {0x656E4242u, 0x656E8400u}, // en-BB -> en-001
-    {0x656E4245u, 0x656E80A1u}, // en-BE -> en-150
-    {0x656E424Du, 0x656E8400u}, // en-BM -> en-001
-    {0x656E4253u, 0x656E8400u}, // en-BS -> en-001
-    {0x656E4257u, 0x656E8400u}, // en-BW -> en-001
-    {0x656E425Au, 0x656E8400u}, // en-BZ -> en-001
-    {0x656E4343u, 0x656E8400u}, // en-CC -> en-001
-    {0x656E4348u, 0x656E80A1u}, // en-CH -> en-150
-    {0x656E434Bu, 0x656E8400u}, // en-CK -> en-001
-    {0x656E434Du, 0x656E8400u}, // en-CM -> en-001
-    {0x656E4358u, 0x656E8400u}, // en-CX -> en-001
-    {0x656E4359u, 0x656E8400u}, // en-CY -> en-001
-    {0x656E4445u, 0x656E80A1u}, // en-DE -> en-150
-    {0x656E4447u, 0x656E8400u}, // en-DG -> en-001
-    {0x656E444Bu, 0x656E80A1u}, // en-DK -> en-150
-    {0x656E444Du, 0x656E8400u}, // en-DM -> en-001
-    {0x656E4552u, 0x656E8400u}, // en-ER -> en-001
-    {0x656E4649u, 0x656E80A1u}, // en-FI -> en-150
-    {0x656E464Au, 0x656E8400u}, // en-FJ -> en-001
-    {0x656E464Bu, 0x656E8400u}, // en-FK -> en-001
-    {0x656E464Du, 0x656E8400u}, // en-FM -> en-001
-    {0x656E4742u, 0x656E8400u}, // en-GB -> en-001
-    {0x656E4744u, 0x656E8400u}, // en-GD -> en-001
-    {0x656E4747u, 0x656E8400u}, // en-GG -> en-001
-    {0x656E4748u, 0x656E8400u}, // en-GH -> en-001
-    {0x656E4749u, 0x656E8400u}, // en-GI -> en-001
-    {0x656E474Du, 0x656E8400u}, // en-GM -> en-001
-    {0x656E4759u, 0x656E8400u}, // en-GY -> en-001
-    {0x656E484Bu, 0x656E8400u}, // en-HK -> en-001
-    {0x656E4944u, 0x656E8400u}, // en-ID -> en-001
-    {0x656E4945u, 0x656E8400u}, // en-IE -> en-001
-    {0x656E494Cu, 0x656E8400u}, // en-IL -> en-001
-    {0x656E494Du, 0x656E8400u}, // en-IM -> en-001
-    {0x656E494Eu, 0x656E8400u}, // en-IN -> en-001
-    {0x656E494Fu, 0x656E8400u}, // en-IO -> en-001
-    {0x656E4A45u, 0x656E8400u}, // en-JE -> en-001
-    {0x656E4A4Du, 0x656E8400u}, // en-JM -> en-001
-    {0x656E4B45u, 0x656E8400u}, // en-KE -> en-001
-    {0x656E4B49u, 0x656E8400u}, // en-KI -> en-001
-    {0x656E4B4Eu, 0x656E8400u}, // en-KN -> en-001
-    {0x656E4B59u, 0x656E8400u}, // en-KY -> en-001
-    {0x656E4C43u, 0x656E8400u}, // en-LC -> en-001
-    {0x656E4C52u, 0x656E8400u}, // en-LR -> en-001
-    {0x656E4C53u, 0x656E8400u}, // en-LS -> en-001
-    {0x656E4D47u, 0x656E8400u}, // en-MG -> en-001
-    {0x656E4D4Fu, 0x656E8400u}, // en-MO -> en-001
-    {0x656E4D53u, 0x656E8400u}, // en-MS -> en-001
-    {0x656E4D54u, 0x656E8400u}, // en-MT -> en-001
-    {0x656E4D55u, 0x656E8400u}, // en-MU -> en-001
-    {0x656E4D56u, 0x656E8400u}, // en-MV -> en-001
-    {0x656E4D57u, 0x656E8400u}, // en-MW -> en-001
-    {0x656E4D59u, 0x656E8400u}, // en-MY -> en-001
-    {0x656E4E41u, 0x656E8400u}, // en-NA -> en-001
-    {0x656E4E46u, 0x656E8400u}, // en-NF -> en-001
-    {0x656E4E47u, 0x656E8400u}, // en-NG -> en-001
-    {0x656E4E4Cu, 0x656E80A1u}, // en-NL -> en-150
-    {0x656E4E52u, 0x656E8400u}, // en-NR -> en-001
-    {0x656E4E55u, 0x656E8400u}, // en-NU -> en-001
-    {0x656E4E5Au, 0x656E8400u}, // en-NZ -> en-001
-    {0x656E5047u, 0x656E8400u}, // en-PG -> en-001
-    {0x656E504Bu, 0x656E8400u}, // en-PK -> en-001
-    {0x656E504Eu, 0x656E8400u}, // en-PN -> en-001
-    {0x656E5057u, 0x656E8400u}, // en-PW -> en-001
-    {0x656E5257u, 0x656E8400u}, // en-RW -> en-001
-    {0x656E5342u, 0x656E8400u}, // en-SB -> en-001
-    {0x656E5343u, 0x656E8400u}, // en-SC -> en-001
-    {0x656E5344u, 0x656E8400u}, // en-SD -> en-001
-    {0x656E5345u, 0x656E80A1u}, // en-SE -> en-150
-    {0x656E5347u, 0x656E8400u}, // en-SG -> en-001
-    {0x656E5348u, 0x656E8400u}, // en-SH -> en-001
-    {0x656E5349u, 0x656E80A1u}, // en-SI -> en-150
-    {0x656E534Cu, 0x656E8400u}, // en-SL -> en-001
-    {0x656E5353u, 0x656E8400u}, // en-SS -> en-001
-    {0x656E5358u, 0x656E8400u}, // en-SX -> en-001
-    {0x656E535Au, 0x656E8400u}, // en-SZ -> en-001
-    {0x656E5443u, 0x656E8400u}, // en-TC -> en-001
-    {0x656E544Bu, 0x656E8400u}, // en-TK -> en-001
-    {0x656E544Fu, 0x656E8400u}, // en-TO -> en-001
-    {0x656E5454u, 0x656E8400u}, // en-TT -> en-001
-    {0x656E5456u, 0x656E8400u}, // en-TV -> en-001
-    {0x656E545Au, 0x656E8400u}, // en-TZ -> en-001
-    {0x656E5547u, 0x656E8400u}, // en-UG -> en-001
-    {0x656E5643u, 0x656E8400u}, // en-VC -> en-001
-    {0x656E5647u, 0x656E8400u}, // en-VG -> en-001
-    {0x656E5655u, 0x656E8400u}, // en-VU -> en-001
-    {0x656E5753u, 0x656E8400u}, // en-WS -> en-001
-    {0x656E5A41u, 0x656E8400u}, // en-ZA -> en-001
-    {0x656E5A4Du, 0x656E8400u}, // en-ZM -> en-001
-    {0x656E5A57u, 0x656E8400u}, // en-ZW -> en-001
-    {0x65734152u, 0x6573A424u}, // es-AR -> es-419
-    {0x6573424Fu, 0x6573A424u}, // es-BO -> es-419
-    {0x65734252u, 0x6573A424u}, // es-BR -> es-419
-    {0x6573425Au, 0x6573A424u}, // es-BZ -> es-419
-    {0x6573434Cu, 0x6573A424u}, // es-CL -> es-419
-    {0x6573434Fu, 0x6573A424u}, // es-CO -> es-419
-    {0x65734352u, 0x6573A424u}, // es-CR -> es-419
-    {0x65734355u, 0x6573A424u}, // es-CU -> es-419
-    {0x6573444Fu, 0x6573A424u}, // es-DO -> es-419
-    {0x65734543u, 0x6573A424u}, // es-EC -> es-419
-    {0x65734754u, 0x6573A424u}, // es-GT -> es-419
-    {0x6573484Eu, 0x6573A424u}, // es-HN -> es-419
-    {0x65734D58u, 0x6573A424u}, // es-MX -> es-419
-    {0x65734E49u, 0x6573A424u}, // es-NI -> es-419
-    {0x65735041u, 0x6573A424u}, // es-PA -> es-419
-    {0x65735045u, 0x6573A424u}, // es-PE -> es-419
-    {0x65735052u, 0x6573A424u}, // es-PR -> es-419
-    {0x65735059u, 0x6573A424u}, // es-PY -> es-419
-    {0x65735356u, 0x6573A424u}, // es-SV -> es-419
-    {0x65735553u, 0x6573A424u}, // es-US -> es-419
-    {0x65735559u, 0x6573A424u}, // es-UY -> es-419
-    {0x65735645u, 0x6573A424u}, // es-VE -> es-419
-    {0x6E620000u, 0x6E6F0000u}, // nb -> no
-    {0x6E6E0000u, 0x6E6F0000u}, // nn -> no
-    {0x7074414Fu, 0x70745054u}, // pt-AO -> pt-PT
-    {0x70744348u, 0x70745054u}, // pt-CH -> pt-PT
-    {0x70744356u, 0x70745054u}, // pt-CV -> pt-PT
-    {0x70744751u, 0x70745054u}, // pt-GQ -> pt-PT
-    {0x70744757u, 0x70745054u}, // pt-GW -> pt-PT
-    {0x70744C55u, 0x70745054u}, // pt-LU -> pt-PT
-    {0x70744D4Fu, 0x70745054u}, // pt-MO -> pt-PT
-    {0x70744D5Au, 0x70745054u}, // pt-MZ -> pt-PT
-    {0x70745354u, 0x70745054u}, // pt-ST -> pt-PT
-    {0x7074544Cu, 0x70745054u}, // pt-TL -> pt-PT
-});
-
-const std::unordered_map<uint32_t, uint32_t> ___B_PARENTS({
-    {0x61725842u, 0x61729420u}, // ar-XB -> ar-015
-});
-
-const struct {
-    const char script[4];
-    const std::unordered_map<uint32_t, uint32_t>* map;
-} SCRIPT_PARENTS[] = {
-    {{'A', 'r', 'a', 'b'}, &ARAB_PARENTS},
-    {{'D', 'e', 'v', 'a'}, &DEVA_PARENTS},
-    {{'H', 'a', 'n', 't'}, &HANT_PARENTS},
-    {{'L', 'a', 't', 'n'}, &LATN_PARENTS},
-    {{'~', '~', '~', 'B'}, &___B_PARENTS},
-};
-
-const size_t MAX_PARENT_DEPTH = 3;
diff --git a/libs/androidfw/OWNERS b/libs/androidfw/OWNERS
index ef4cc46..47b2a1e 100644
--- a/libs/androidfw/OWNERS
+++ b/libs/androidfw/OWNERS
@@ -3,4 +3,4 @@
 patb@google.com
 
 per-file CursorWindow.cpp=omakoto@google.com
-per-file LocaleDataTables.cpp=vichang@google.com,ngeoffray@google.com
+per-file LocaleDataLookup.cpp=vichang@google.com,ngeoffray@google.com
diff --git a/libs/androidfw/include/androidfw/LocaleDataLookup.h b/libs/androidfw/include/androidfw/LocaleDataLookup.h
index 7fde712..5a24e83 100644
--- a/libs/androidfw/include/androidfw/LocaleDataLookup.h
+++ b/libs/androidfw/include/androidfw/LocaleDataLookup.h
@@ -22,10 +22,6 @@
 
 namespace android {
 
-namespace hidden {
-    bool isRepresentative(uint64_t packed_locale);
-}
-
 constexpr size_t SCRIPT_LENGTH = 4;
 
 constexpr inline uint32_t packLocale(const char* language, const char* region) {
@@ -45,6 +41,14 @@
     return (packed_locale & 0x0000FFFFLU) != 0;
 }
 
+constexpr inline uint32_t packScript(const char* script) {
+    const unsigned char* s = reinterpret_cast<const unsigned char*>(script);
+    return ((static_cast<uint32_t>(s[0]) << 24u) |
+            (static_cast<uint32_t>(s[1]) << 16u) |
+            (static_cast<uint32_t>(s[2]) <<  8u) |
+            static_cast<uint32_t>(s[3]));
+}
+
 /**
  * Return nullptr if the key isn't found. The input packed_lang_region can be computed
  * by android::packLocale.
@@ -56,17 +60,7 @@
  * Return false if the key isn't representative. The input lookup key can be computed
  * by android::packLocale.
  */
-bool inline isLocaleRepresentative(uint32_t language_and_region, const char* script) {
-    const unsigned char* s = reinterpret_cast<const unsigned char*>(script);
-    const uint64_t packed_locale = (
-            ((static_cast<uint64_t>(language_and_region)) << 32u) |
-            (static_cast<uint64_t>(s[0]) << 24u) |
-            (static_cast<uint64_t>(s[1]) << 16u) |
-            (static_cast<uint64_t>(s[2]) <<  8u) |
-            static_cast<uint64_t>(s[3]));
-
-    return hidden::isRepresentative(packed_locale);
-}
+bool isLocaleRepresentative(uint32_t language_and_region, const char* script);
 
 /**
  * Return a parent packed key for a given script and child packed key. Return 0 if
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 36f62da..c9625c4 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -5866,19 +5866,31 @@
                 @NonNull MediaCodec codec, @NonNull MediaFormat format);
 
         /**
-         * Called when the metrics for this codec have been flushed due to the
-         * start of a new subsession.
+         * Called when the metrics for this codec have been flushed "mid-stream"
+         * due to the start of a new subsession during execution.
          * <p>
-         * This can happen when the codec is reconfigured after stop(), or
-         * mid-stream e.g. if the video size changes. When this happens, the
-         * metrics for the previous subsession are flushed, and
-         * {@link MediaCodec#getMetrics} will return the metrics for the
-         * new subsession. This happens just before the {@link Callback#onOutputFormatChanged}
+         * A new codec subsession normally starts when the codec is reconfigured
+         * after stop(), but it can also happen mid-stream e.g. if the video size
+         * changes. When this happens, the metrics for the previous subsession
+         * are flushed, and {@link MediaCodec#getMetrics} will return the metrics
+         * for the new subsession.
+         * <p>
+         * For subsessions that begin due to a reconfiguration, the metrics for
+         * the prior subsession can be retrieved via {@link MediaCodec#getMetrics}
+         * prior to calling {@link #configure}.
+         * <p>
+         * When a new subsession begins "mid-stream", the metrics for the prior
+         * subsession are flushed just before the {@link Callback#onOutputFormatChanged}
          * event, so this <b>optional</b> callback is provided to be able to
          * capture the final metrics for the previous subsession.
          *
          * @param codec The MediaCodec object.
-         * @param metrics The flushed metrics for this codec.
+         * @param metrics The flushed metrics for this codec. This is a
+         *                {@link PersistableBundle} containing the set of
+         *                attributes and values available for the media being
+         *                handled by this instance of MediaCodec. The attributes
+         *                are described in {@link MetricsConstants}. Additional
+         *                vendor-specific fields may also be present.
          */
         @FlaggedApi(FLAG_SUBSESSION_METRICS)
         public void onMetricsFlushed(
diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java
index 678150b..4c5efc1 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -18,6 +18,8 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.TestApi;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.media.MediaCodec.BufferInfo;
 import android.os.Build;
@@ -257,6 +259,8 @@
          */
         private OutputFormat() {}
         /** @hide */
+        @SuppressLint("UnflaggedApi")
+        @TestApi
         public static final int MUXER_OUTPUT_FIRST   = 0;
         /** MPEG4 media file format*/
         public static final int MUXER_OUTPUT_MPEG_4 = MUXER_OUTPUT_FIRST;
@@ -269,6 +273,8 @@
         /** Ogg media file format*/
         public static final int MUXER_OUTPUT_OGG   = MUXER_OUTPUT_FIRST + 4;
         /** @hide */
+        @SuppressLint("UnflaggedApi")
+        @TestApi
         public static final int MUXER_OUTPUT_LAST   = MUXER_OUTPUT_OGG;
     };
 
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index f629c88..b30b779 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -320,6 +320,9 @@
     ASystemFontIterator_open; # introduced=29
     ASystemFontIterator_close; # introduced=29
     ASystemFontIterator_next; # introduced=29
+    ASystemHealth_getMaxCpuHeadroomTidsSize; # introduced=36
+    ASystemHealth_getCpuHeadroomCalculationWindowRange; # introduced=36
+    ASystemHealth_getGpuHeadroomCalculationWindowRange; # introduced=36
     ASystemHealth_getCpuHeadroom; # introduced=36
     ASystemHealth_getGpuHeadroom; # introduced=36
     ASystemHealth_getCpuHeadroomMinIntervalMillis; # introduced=36
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index 68c1983..1e6a7b7 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -859,7 +859,7 @@
         std::vector<ANativeWindow*> windowVec(windows, windows + numWindows);
         for (auto&& window : windowVec) {
             Surface* surface = static_cast<Surface*>(window);
-            if (Surface::isValid(surface)) {
+            if (surface != nullptr) {
                 const sp<IBinder>& handle = surface->getSurfaceControlHandle();
                 if (handle != nullptr) {
                     out.push_back(handle);
diff --git a/native/android/system_health.cpp b/native/android/system_health.cpp
index f3fa9f6..5c07ac7 100644
--- a/native/android/system_health.cpp
+++ b/native/android/system_health.cpp
@@ -31,26 +31,28 @@
 struct ACpuHeadroomParams : public CpuHeadroomParamsInternal {};
 struct AGpuHeadroomParams : public GpuHeadroomParamsInternal {};
 
-const int CPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN = 50;
-const int CPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX = 10000;
-const int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN = 50;
-const int GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX = 10000;
-const int CPU_HEADROOM_MAX_TID_COUNT = 5;
-
 struct ASystemHealthManager {
 public:
     static ASystemHealthManager* getInstance();
-    ASystemHealthManager(std::shared_ptr<IHintManager>& hintManager);
+
+    ASystemHealthManager(std::shared_ptr<IHintManager>& hintManager,
+                         IHintManager::HintManagerClientData&& clientData);
     ASystemHealthManager() = delete;
     ~ASystemHealthManager();
     int getCpuHeadroom(const ACpuHeadroomParams* params, float* outHeadroom);
     int getGpuHeadroom(const AGpuHeadroomParams* params, float* outHeadroom);
     int getCpuHeadroomMinIntervalMillis(int64_t* outMinIntervalMillis);
     int getGpuHeadroomMinIntervalMillis(int64_t* outMinIntervalMillis);
+    int getMaxCpuHeadroomTidsSize(size_t* outSize);
+    int getCpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                             int32_t* _Nonnull outMaxMillis);
+    int getGpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                             int32_t* _Nonnull outMaxMillis);
 
 private:
     static ASystemHealthManager* create(std::shared_ptr<IHintManager> hintManager);
     std::shared_ptr<IHintManager> mHintManager;
+    IHintManager::HintManagerClientData mClientData;
 };
 
 ASystemHealthManager* ASystemHealthManager::getInstance() {
@@ -60,10 +62,11 @@
     return instance;
 }
 
-ASystemHealthManager::ASystemHealthManager(std::shared_ptr<IHintManager>& hintManager)
-      : mHintManager(std::move(hintManager)) {}
+ASystemHealthManager::ASystemHealthManager(std::shared_ptr<IHintManager>& hintManager,
+                                           IHintManager::HintManagerClientData&& clientData)
+      : mHintManager(std::move(hintManager)), mClientData(clientData) {}
 
-ASystemHealthManager::~ASystemHealthManager() {}
+ASystemHealthManager::~ASystemHealthManager() = default;
 
 ASystemHealthManager* ASystemHealthManager::create(std::shared_ptr<IHintManager> hintManager) {
     if (!hintManager) {
@@ -74,20 +77,37 @@
         ALOGE("%s: PerformanceHint service is not ready ", __FUNCTION__);
         return nullptr;
     }
-    return new ASystemHealthManager(hintManager);
-}
-
-ASystemHealthManager* ASystemHealth_acquireManager() {
-    return ASystemHealthManager::getInstance();
+    IHintManager::HintManagerClientData clientData;
+    ndk::ScopedAStatus ret = hintManager->getClientData(&clientData);
+    if (!ret.isOk()) {
+        ALOGE("%s: PerformanceHint service is not initialized %s", __FUNCTION__, ret.getMessage());
+        return nullptr;
+    }
+    return new ASystemHealthManager(hintManager, std::move(clientData));
 }
 
 int ASystemHealthManager::getCpuHeadroom(const ACpuHeadroomParams* params, float* outHeadroom) {
+    if (!mClientData.supportInfo.headroom.isCpuSupported) return ENOTSUP;
     std::optional<hal::CpuHeadroomResult> res;
     ::ndk::ScopedAStatus ret;
     CpuHeadroomParamsInternal internalParams;
     if (!params) {
         ret = mHintManager->getCpuHeadroom(internalParams, &res);
     } else {
+        LOG_ALWAYS_FATAL_IF((int)params->tids.size() > mClientData.maxCpuHeadroomThreads,
+                            "%s: tids size should not exceed %d", __FUNCTION__,
+                            mClientData.maxCpuHeadroomThreads);
+        LOG_ALWAYS_FATAL_IF(params->calculationWindowMillis <
+                                            mClientData.supportInfo.headroom
+                                                    .cpuMinCalculationWindowMillis ||
+                                    params->calculationWindowMillis >
+                                            mClientData.supportInfo.headroom
+                                                    .cpuMaxCalculationWindowMillis,
+                            "%s: calculationWindowMillis should be in range [%d, %d] but got %d",
+                            __FUNCTION__,
+                            mClientData.supportInfo.headroom.cpuMinCalculationWindowMillis,
+                            mClientData.supportInfo.headroom.cpuMaxCalculationWindowMillis,
+                            params->calculationWindowMillis);
         ret = mHintManager->getCpuHeadroom(*params, &res);
     }
     if (!ret.isOk()) {
@@ -106,12 +126,24 @@
 }
 
 int ASystemHealthManager::getGpuHeadroom(const AGpuHeadroomParams* params, float* outHeadroom) {
+    if (!mClientData.supportInfo.headroom.isGpuSupported) return ENOTSUP;
     std::optional<hal::GpuHeadroomResult> res;
     ::ndk::ScopedAStatus ret;
     GpuHeadroomParamsInternal internalParams;
     if (!params) {
         ret = mHintManager->getGpuHeadroom(internalParams, &res);
     } else {
+        LOG_ALWAYS_FATAL_IF(params->calculationWindowMillis <
+                                            mClientData.supportInfo.headroom
+                                                    .gpuMinCalculationWindowMillis ||
+                                    params->calculationWindowMillis >
+                                            mClientData.supportInfo.headroom
+                                                    .gpuMaxCalculationWindowMillis,
+                            "%s: calculationWindowMillis should be in range [%d, %d] but got %d",
+                            __FUNCTION__,
+                            mClientData.supportInfo.headroom.gpuMinCalculationWindowMillis,
+                            mClientData.supportInfo.headroom.gpuMaxCalculationWindowMillis,
+                            params->calculationWindowMillis);
         ret = mHintManager->getGpuHeadroom(*params, &res);
     }
     if (!ret.isOk()) {
@@ -128,6 +160,7 @@
 }
 
 int ASystemHealthManager::getCpuHeadroomMinIntervalMillis(int64_t* outMinIntervalMillis) {
+    if (!mClientData.supportInfo.headroom.isCpuSupported) return ENOTSUP;
     int64_t minIntervalMillis = 0;
     ::ndk::ScopedAStatus ret = mHintManager->getCpuHeadroomMinIntervalMillis(&minIntervalMillis);
     if (!ret.isOk()) {
@@ -142,6 +175,7 @@
 }
 
 int ASystemHealthManager::getGpuHeadroomMinIntervalMillis(int64_t* outMinIntervalMillis) {
+    if (!mClientData.supportInfo.headroom.isGpuSupported) return ENOTSUP;
     int64_t minIntervalMillis = 0;
     ::ndk::ScopedAStatus ret = mHintManager->getGpuHeadroomMinIntervalMillis(&minIntervalMillis);
     if (!ret.isOk()) {
@@ -155,6 +189,57 @@
     return OK;
 }
 
+int ASystemHealthManager::getMaxCpuHeadroomTidsSize(size_t* outSize) {
+    if (!mClientData.supportInfo.headroom.isGpuSupported) return ENOTSUP;
+    *outSize = mClientData.maxCpuHeadroomThreads;
+    return OK;
+}
+
+int ASystemHealthManager::getCpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                                               int32_t* _Nonnull outMaxMillis) {
+    if (!mClientData.supportInfo.headroom.isCpuSupported) return ENOTSUP;
+    *outMinMillis = mClientData.supportInfo.headroom.cpuMinCalculationWindowMillis;
+    *outMaxMillis = mClientData.supportInfo.headroom.cpuMaxCalculationWindowMillis;
+    return OK;
+}
+
+int ASystemHealthManager::getGpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                                               int32_t* _Nonnull outMaxMillis) {
+    if (!mClientData.supportInfo.headroom.isGpuSupported) return ENOTSUP;
+    *outMinMillis = mClientData.supportInfo.headroom.gpuMinCalculationWindowMillis;
+    *outMaxMillis = mClientData.supportInfo.headroom.gpuMaxCalculationWindowMillis;
+    return OK;
+}
+
+int ASystemHealth_getMaxCpuHeadroomTidsSize(size_t* _Nonnull outSize) {
+    LOG_ALWAYS_FATAL_IF(outSize == nullptr, "%s: outSize should not be null", __FUNCTION__);
+    auto manager = ASystemHealthManager::getInstance();
+    if (manager == nullptr) return ENOTSUP;
+    return manager->getMaxCpuHeadroomTidsSize(outSize);
+}
+
+int ASystemHealth_getCpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                                       int32_t* _Nonnull outMaxMillis) {
+    LOG_ALWAYS_FATAL_IF(outMinMillis == nullptr, "%s: outMinMillis should not be null",
+                        __FUNCTION__);
+    LOG_ALWAYS_FATAL_IF(outMaxMillis == nullptr, "%s: outMaxMillis should not be null",
+                        __FUNCTION__);
+    auto manager = ASystemHealthManager::getInstance();
+    if (manager == nullptr) return ENOTSUP;
+    return manager->getCpuHeadroomCalculationWindowRange(outMinMillis, outMaxMillis);
+}
+
+int ASystemHealth_getGpuHeadroomCalculationWindowRange(int32_t* _Nonnull outMinMillis,
+                                                       int32_t* _Nonnull outMaxMillis) {
+    LOG_ALWAYS_FATAL_IF(outMinMillis == nullptr, "%s: outMinMillis should not be null",
+                        __FUNCTION__);
+    LOG_ALWAYS_FATAL_IF(outMaxMillis == nullptr, "%s: outMaxMillis should not be null",
+                        __FUNCTION__);
+    auto manager = ASystemHealthManager::getInstance();
+    if (manager == nullptr) return ENOTSUP;
+    return manager->getGpuHeadroomCalculationWindowRange(outMinMillis, outMaxMillis);
+}
+
 int ASystemHealth_getCpuHeadroom(const ACpuHeadroomParams* _Nullable params,
                                  float* _Nonnull outHeadroom) {
     LOG_ALWAYS_FATAL_IF(outHeadroom == nullptr, "%s: outHeadroom should not be null", __FUNCTION__);
@@ -189,19 +274,15 @@
 
 void ACpuHeadroomParams_setCalculationWindowMillis(ACpuHeadroomParams* _Nonnull params,
                                                    int windowMillis) {
-    LOG_ALWAYS_FATAL_IF(windowMillis < CPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN ||
-                                windowMillis > CPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX,
-                        "%s: windowMillis should be in range [50, 10000] but got %d", __FUNCTION__,
-                        windowMillis);
+    LOG_ALWAYS_FATAL_IF(windowMillis <= 0, "%s: windowMillis should be positive but got %d",
+                        __FUNCTION__, windowMillis);
     params->calculationWindowMillis = windowMillis;
 }
 
 void AGpuHeadroomParams_setCalculationWindowMillis(AGpuHeadroomParams* _Nonnull params,
                                                    int windowMillis) {
-    LOG_ALWAYS_FATAL_IF(windowMillis < GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MIN ||
-                                windowMillis > GPU_HEADROOM_CALCULATION_WINDOW_MILLIS_MAX,
-                        "%s: windowMillis should be in range [50, 10000] but got %d", __FUNCTION__,
-                        windowMillis);
+    LOG_ALWAYS_FATAL_IF(windowMillis <= 0, "%s: windowMillis should be positive but got %d",
+                        __FUNCTION__, windowMillis);
     params->calculationWindowMillis = windowMillis;
 }
 
@@ -214,13 +295,11 @@
 }
 
 void ACpuHeadroomParams_setTids(ACpuHeadroomParams* _Nonnull params, const int* _Nonnull tids,
-                                int tidsSize) {
+                                size_t tidsSize) {
     LOG_ALWAYS_FATAL_IF(tids == nullptr, "%s: tids should not be null", __FUNCTION__);
-    LOG_ALWAYS_FATAL_IF(tidsSize > CPU_HEADROOM_MAX_TID_COUNT, "%s: tids size should not exceed 5",
-                        __FUNCTION__);
     params->tids.resize(tidsSize);
     params->tids.clear();
-    for (int i = 0; i < tidsSize; ++i) {
+    for (int i = 0; i < (int)tidsSize; ++i) {
         LOG_ALWAYS_FATAL_IF(tids[i] <= 0, "ACpuHeadroomParams_setTids: Invalid non-positive tid %d",
                             tids[i]);
         params->tids[i] = tids[i];
@@ -269,10 +348,10 @@
     return new AGpuHeadroomParams();
 }
 
-void ACpuHeadroomParams_destroy(ACpuHeadroomParams* _Nonnull params) {
+void ACpuHeadroomParams_destroy(ACpuHeadroomParams* _Nullable params) {
     delete params;
 }
 
-void AGpuHeadroomParams_destroy(AGpuHeadroomParams* _Nonnull params) {
+void AGpuHeadroomParams_destroy(AGpuHeadroomParams* _Nullable params) {
     delete params;
 }
diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
index f68fa1a..0fa92ea 100644
--- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
+++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
@@ -161,6 +161,9 @@
                          clientDataIn,
                  ::aidl::android::os::IHintManager::HintManagerClientData* _aidl_return),
                 (override));
+    MOCK_METHOD(ScopedAStatus, getClientData,
+                (::aidl::android::os::IHintManager::HintManagerClientData * _aidl_return),
+                (override));
     MOCK_METHOD(SpAIBinder, asBinder, (), (override));
     MOCK_METHOD(bool, isRemote, (), (override));
 };
@@ -602,6 +605,15 @@
     ASSERT_NE(config, nullptr);
 }
 
+TEST_F(PerformanceHintTest, TestSessionCreationWithNullLayers) {
+    EXPECT_CALL(*mMockIHintManager, createHintSessionWithConfig(_, _, _, _, _)).Times(1);
+    auto&& config = configFromCreator(
+            {.tids = mTids, .nativeWindows = {nullptr}, .surfaceControls = {nullptr}});
+    APerformanceHintManager* manager = createManager();
+    auto&& session = createSessionUsingConfig(manager, config);
+    ASSERT_TRUE(session);
+}
+
 TEST_F(PerformanceHintTest, TestSupportObject) {
     // Disable GPU and Power Efficiency support to test partial enabling
     mClientData.supportInfo.sessionModes &= ~(1 << (int)hal::SessionMode::AUTO_GPU);
diff --git a/packages/CredentialManager/tests/robotests/Android.bp b/packages/CredentialManager/tests/robotests/Android.bp
index 27afaaa..01f403d 100644
--- a/packages/CredentialManager/tests/robotests/Android.bp
+++ b/packages/CredentialManager/tests/robotests/Android.bp
@@ -53,7 +53,6 @@
         "android.test.mock.stubs.system",
         "truth",
     ],
-    upstream: true,
     java_resource_dirs: ["config"],
     instrumentation_for: "CredentialManagerRobo",
 }
diff --git a/packages/CredentialManager/wear/robotests/Android.bp b/packages/CredentialManager/wear/robotests/Android.bp
index 589a3d6..db3c363 100644
--- a/packages/CredentialManager/wear/robotests/Android.bp
+++ b/packages/CredentialManager/wear/robotests/Android.bp
@@ -24,6 +24,5 @@
         "framework_graphics_flags_java_lib",
     ],
     java_resource_dirs: ["config"],
-    upstream: true,
     strict_mode: false,
 }
diff --git a/packages/InputDevices/res/raw/keyboard_layout_romanian.kcm b/packages/InputDevices/res/raw/keyboard_layout_romanian.kcm
new file mode 100644
index 0000000..b384a24
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_romanian.kcm
@@ -0,0 +1,357 @@
+# Copyright (C) 2024 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.
+
+#
+# Romanian keyboard layout.
+#
+
+type OVERLAY
+
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u201e'
+    base:                               '\u201e'
+    shift:                              '\u201d'
+    ralt:                               '`'
+    ralt+shift:                         '~'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+    ralt:                               '\u0303'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '@'
+    ralt:                               '\u030C'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u0302'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+    ralt:                               '\u0306'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u030A'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '^'
+    ralt:                               '\u0328'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '&'
+    ralt:                               '\u0300'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '*'
+    ralt:                               '\u0307'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              '('
+    ralt:                               '\u0301'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              ')'
+    ralt:                               '\u030B'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '\u0308'
+    ralt+shift:                         '\u2013'
+}
+
+key EQUALS {
+    label:                              '='
+    base:                               '='
+    shift:                              '+'
+    ralt:                               '\u0327'
+    ralt+shift:                         '\u00b1'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base, capslock+shift:               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base, capslock+shift:               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base, capslock+shift:               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base, capslock+shift:               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base, capslock+shift:               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base, capslock+shift:               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base, capslock+shift:               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base, capslock+shift:               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base, capslock+shift:               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base, capslock+shift:               'p'
+    shift, capslock:                    'P'
+    ralt:                               '\u00a7'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u0102'
+    base, capslock+shift:               '\u0103'
+    shift, capslock:                    '\u0102'
+    ralt:                               '['
+    ralt+shift:                         '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00ce'
+    base, capslock+shift:               '\u00ee'
+    shift, capslock:                    '\u00ce'
+    ralt:                               ']'
+    ralt+shift:                         '}'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base, capslock+shift:               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base, capslock+shift:               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u00df'
+}
+
+key D {
+    label:                              'D'
+    base, capslock+shift:               'd'
+    shift, capslock:                    'D'
+    ralt:                               '\u0111'
+    ralt+shift, ralt+capslock:          '\u0110'
+    ralt+shift+capslock:                '\u0111'
+}
+
+key F {
+    label:                              'F'
+    base, capslock+shift:               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base, capslock+shift:               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base, capslock+shift:               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base, capslock+shift:               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base, capslock+shift:               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base, capslock+shift:               'l'
+    shift, capslock:                    'L'
+    ralt:                               '\u0142'
+    ralt+shift, ralt+capslock:          '\u0141'
+    ralt+shift+capslock:                '\u0142'
+}
+
+key SEMICOLON {
+    label:                              '\u0218'
+    base, capslock+shift:               '\u0219'
+    shift, capslock:                    '\u0218'
+    ralt:                               ';'
+    ralt+shift:                         ':'
+}
+
+key APOSTROPHE {
+    label:                              '\u021a'
+    base, capslock+shift:               '\u021b'
+    shift, capslock:                    '\u021a'
+    ralt:                               '\''
+    ralt+shift:                         '\u0022'
+}
+
+key BACKSLASH {
+    label:                              '\u00c2'
+    base, capslock+shift:               '\u00e2'
+    shift, capslock:                    '\u00c2'
+    ralt:                               '\\'
+    ralt+shift:                         '|'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+key Z {
+    label:                              'Z'
+    base, capslock+shift:               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base, capslock+shift:               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base, capslock+shift:               'c'
+    shift, capslock:                    'C'
+    ralt:                               '\u00a9'
+}
+
+key V {
+    label:                              'V'
+    base, capslock+shift:               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base, capslock+shift:               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base, capslock+shift:               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base, capslock+shift:               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+    ralt:                               '<'
+    ralt+shift:                         '\u00ab'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+    ralt:                               '>'
+    ralt+shift:                         '\u00bb'
+}
+
+key SLASH {
+    label:                              '/'
+    base:                               '/'
+    shift:                              '?'
+}
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index 5a91125..bd7cdc4 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -164,4 +164,7 @@
 
     <!-- Montenegrin (Cyrillic) keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_montenegrin_cyrillic">Montenegrin (Cyrillic)</string>
+
+    <!-- Romanian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_romanian">Romanian</string>
 </resources>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 9309489..9ce9a87 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -360,4 +360,11 @@
         android:keyboardLayout="@raw/keyboard_layout_serbian_and_montenegrin_cyrillic"
         android:keyboardLocale="cnr-Cyrl-ME"
         android:keyboardLayoutType="extended" />
+
+    <keyboard-layout
+        android:name="keyboard_layout_romanian"
+        android:label="@string/keyboard_layout_romanian"
+        android:keyboardLayout="@raw/keyboard_layout_romanian"
+        android:keyboardLocale="ro-Latn-RO"
+        android:keyboardLayoutType="qwerty" />
 </keyboard-layouts>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveActivity.java
index b20117d..c99d37b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveActivity.java
@@ -19,6 +19,7 @@
 import static android.Manifest.permission;
 import static android.content.pm.PackageManager.GET_PERMISSIONS;
 import static android.content.pm.PackageManager.MATCH_ARCHIVED_PACKAGES;
+import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 
 import android.app.Activity;
 import android.app.DialogFragment;
@@ -53,6 +54,8 @@
 
     @Override
     public void onCreate(Bundle icicle) {
+        getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+
         super.onCreate(null);
 
         int callingUid = getLaunchedFromUid();
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveFragment.java
index 42dd382..fbb0fa4 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveFragment.java
@@ -21,10 +21,14 @@
 import android.app.DialogFragment;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.widget.Button;
 
 public class UnarchiveFragment extends DialogFragment implements
         DialogInterface.OnClickListener {
 
+    private Dialog mDialog;
+    private Button mRestoreButton;
+
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         String appTitle = getArguments().getString(UnarchiveActivity.APP_TITLE);
@@ -40,7 +44,32 @@
         dialogBuilder.setPositiveButton(R.string.restore, this);
         dialogBuilder.setNegativeButton(android.R.string.cancel, this);
 
-        return dialogBuilder.create();
+        mDialog = dialogBuilder.create();
+        return mDialog;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mDialog != null) {
+            mRestoreButton = ((AlertDialog) mDialog).getButton(DialogInterface.BUTTON_POSITIVE);
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (mRestoreButton != null) {
+            mRestoreButton.setEnabled(false);
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (mRestoreButton != null) {
+            mRestoreButton.setEnabled(true);
+        }
     }
 
     @Override
diff --git a/packages/SettingsLib/DataStore/tests/Android.bp b/packages/SettingsLib/DataStore/tests/Android.bp
index 2e3b42d..6044eab 100644
--- a/packages/SettingsLib/DataStore/tests/Android.bp
+++ b/packages/SettingsLib/DataStore/tests/Android.bp
@@ -25,6 +25,5 @@
     java_resource_dirs: ["config"],
     instrumentation_for: "SettingsLibDataStoreShell",
     coverage_libs: ["SettingsLibDataStore"],
-    upstream: true,
     strict_mode: false,
 }
diff --git a/packages/SettingsLib/Ipc/Android.bp b/packages/SettingsLib/Ipc/Android.bp
index 2c7209a..bc5a936 100644
--- a/packages/SettingsLib/Ipc/Android.bp
+++ b/packages/SettingsLib/Ipc/Android.bp
@@ -25,7 +25,7 @@
     name: "SettingsLibIpc-testutils",
     srcs: ["testutils/**/*.kt"],
     static_libs: [
-        "Robolectric_all-target_upstream",
+        "Robolectric_all-target",
         "SettingsLibIpc",
         "androidx.test.core",
         "flag-junit",
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/Android.bp b/packages/SettingsLib/Spa/screenshot/robotests/Android.bp
index f6477e2..dd6743b 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/Android.bp
+++ b/packages/SettingsLib/Spa/screenshot/robotests/Android.bp
@@ -68,7 +68,6 @@
         "android.test.mock.stubs.system",
         "truth",
     ],
-    upstream: true,
     java_resource_dirs: ["config"],
     instrumentation_for: "SpaRoboApp",
 
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt
new file mode 100644
index 0000000..5b7e2a8
--- /dev/null
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2025 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 com.android.settingslib.spaprivileged.framework.common
+
+import android.content.Context
+import android.content.res.Resources
+import android.icu.text.DecimalFormat
+import android.icu.text.MeasureFormat
+import android.icu.text.NumberFormat
+import android.icu.text.UnicodeSet
+import android.icu.text.UnicodeSetSpanner
+import android.icu.util.Measure
+import android.text.format.Formatter
+import android.text.format.Formatter.RoundedBytesResult
+import java.math.BigDecimal
+
+class BytesFormatter(resources: Resources) {
+
+    enum class UseCase(val flag: Int) {
+        FileSize(Formatter.FLAG_SI_UNITS),
+        DataUsage(Formatter.FLAG_IEC_UNITS),
+    }
+
+    data class Result(val number: String, val units: String)
+
+    constructor(context: Context) : this(context.resources)
+
+    private val locale = resources.configuration.locales[0]
+
+    fun format(bytes: Long, useCase: UseCase): String {
+        val rounded = RoundedBytesResult.roundBytes(bytes, useCase.flag)
+        val numberFormatter = getNumberFormatter(rounded.fractionDigits)
+        return numberFormatter.formatRoundedBytesResult(rounded)
+    }
+
+    fun formatWithUnits(bytes: Long, useCase: UseCase): Result {
+        val rounded = RoundedBytesResult.roundBytes(bytes, useCase.flag)
+        val numberFormatter = getNumberFormatter(rounded.fractionDigits)
+        val formattedString = numberFormatter.formatRoundedBytesResult(rounded)
+        val formattedNumber = numberFormatter.format(rounded.value)
+        return Result(
+            number = formattedNumber,
+            units = formattedString.removeFirst(formattedNumber),
+        )
+    }
+
+    private fun NumberFormat.formatRoundedBytesResult(rounded: RoundedBytesResult): String {
+        val measureFormatter =
+            MeasureFormat.getInstance(locale, MeasureFormat.FormatWidth.SHORT, this)
+        return measureFormatter.format(Measure(rounded.value, rounded.units))
+    }
+
+    private fun getNumberFormatter(fractionDigits: Int) =
+        NumberFormat.getInstance(locale).apply {
+            minimumFractionDigits = fractionDigits
+            maximumFractionDigits = fractionDigits
+            isGroupingUsed = false
+            if (this is DecimalFormat) {
+                setRoundingMode(BigDecimal.ROUND_HALF_UP)
+            }
+        }
+
+    private companion object {
+        fun String.removeFirst(removed: String): String =
+            SPACES_AND_CONTROLS.trim(replaceFirst(removed, "")).toString()
+
+        val SPACES_AND_CONTROLS = UnicodeSetSpanner(UnicodeSet("[[:Zs:][:Cf:]]").freeze())
+    }
+}
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatterTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatterTest.kt
new file mode 100644
index 0000000..7220848
--- /dev/null
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatterTest.kt
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2025 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 com.android.settingslib.spaprivileged.framework.common
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class BytesFormatterTest {
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+
+    private val formatter = BytesFormatter(context)
+
+    @Test
+    fun `Zero bytes`() {
+        // Given a byte value of 0, the formatted output should be "0 byte" for both FileSize
+        // and DataUsage UseCases. This verifies special handling of zero values.
+
+        val fileSizeResult = formatter.format(0, BytesFormatter.UseCase.FileSize)
+        assertThat(fileSizeResult).isEqualTo("0 byte")
+
+        val dataUsageResult = formatter.format(0, BytesFormatter.UseCase.DataUsage)
+        assertThat(dataUsageResult).isEqualTo("0 byte")
+    }
+
+    @Test
+    fun `Positive bytes`() {
+        // Given a positive byte value (e.g., 1000), the formatted output should be correctly
+        // displayed with appropriate units (e.g., '1.00 kB') for both UseCases.
+
+        val fileSizeResult = formatter.format(1000, BytesFormatter.UseCase.FileSize)
+        assertThat(fileSizeResult).isEqualTo("1.00 kB")
+
+        val dataUsageResult = formatter.format(1024, BytesFormatter.UseCase.DataUsage)
+        assertThat(dataUsageResult).isEqualTo("1.00 kB")
+    }
+
+    @Test
+    fun `Large bytes`() {
+        // Given a very large byte value (e.g., Long.MAX_VALUE), the formatted output should be
+        // correctly displayed with the largest unit (e.g., 'PB') for both UseCases.
+
+        val fileSizeResult = formatter.format(Long.MAX_VALUE, BytesFormatter.UseCase.FileSize)
+        assertThat(fileSizeResult).isEqualTo("9223 PB")
+
+        val dataUsageResult = formatter.format(Long.MAX_VALUE, BytesFormatter.UseCase.DataUsage)
+        assertThat(dataUsageResult).isEqualTo("8192 PB")
+    }
+
+    @Test
+    fun `Bytes requiring rounding`() {
+        // Given byte values that require rounding (e.g., 1512), the formatted output should be
+        // rounded to the appropriate number of decimal places (e.g., '1.51 kB').
+
+        val fileSizeResult = formatter.format(1512, BytesFormatter.UseCase.FileSize)
+        assertThat(fileSizeResult).isEqualTo("1.51 kB")
+
+        val dataUsageResult = formatter.format(1512, BytesFormatter.UseCase.DataUsage)
+        assertThat(dataUsageResult).isEqualTo("1.48 kB")
+    }
+
+    @Test
+    fun `FileSize UseCase`() {
+        // When the UseCase is FileSize, the correct units (byte, KB, kB, GB, TB, PB) should
+        // be used.
+        val values =
+            listOf(
+                1L,
+                1024L,
+                1024L * 1024L,
+                1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L * 1024L * 1024L,
+            )
+        val expectedUnits = listOf("byte", "kB", "MB", "GB", "TB", "PB", "PB")
+
+        values.zip(expectedUnits).forEach { (value, expectedUnit) ->
+            val result = formatter.format(value, BytesFormatter.UseCase.FileSize)
+            assertThat(result).contains(expectedUnit)
+        }
+    }
+
+    @Test
+    fun `DataUsage UseCase`() {
+        // When the UseCase is DataUsage, the correct units (byte, kB, MB, GB, TB, PB) should
+        // be used.
+        val values =
+            listOf(
+                1L,
+                1024L,
+                1024L * 1024L,
+                1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L * 1024L,
+                1024L * 1024L * 1024L * 1024L * 1024L * 1024L,
+            )
+        val expectedUnits = listOf("byte", "kB", "MB", "GB", "TB", "PB", "PB")
+
+        values.zip(expectedUnits).forEach { (value, expectedUnit) ->
+            val result = formatter.format(value, BytesFormatter.UseCase.DataUsage)
+            assertThat(result).contains(expectedUnit)
+        }
+    }
+
+    @Test
+    fun `Fraction digits`() {
+        // The number of fraction digits in the output should be correctly determined based on
+        // the rounded byte value.
+
+        assertThat(formatter.format(1500, BytesFormatter.UseCase.FileSize)).isEqualTo("1.50 kB")
+        assertThat(formatter.format(1050, BytesFormatter.UseCase.FileSize)).isEqualTo("1.05 kB")
+        assertThat(formatter.format(999, BytesFormatter.UseCase.FileSize)).isEqualTo("1.00 kB")
+    }
+
+    @Test
+    fun `Rounding mode`() {
+        // The rounding mode used for formatting should be ROUND_HALF_UP.
+
+        val result = formatter.format(1006, BytesFormatter.UseCase.FileSize)
+
+        assertThat(result).isEqualTo("1.01 kB") // Ensure rounding mode is effective
+    }
+
+    @Test
+    fun `Grouping separator`() {
+        // Grouping separators should not be used in the formatted output.
+
+        val result = formatter.format(Long.MAX_VALUE, BytesFormatter.UseCase.FileSize)
+
+        assertThat(result).isEqualTo("9223 PB")
+    }
+
+    @Test
+    fun `Format with units`() {
+        // Verify that the `formatWithUnits` method correctly formats the given bytes with the
+        // specified units.
+
+        val resultByte = formatter.formatWithUnits(0, BytesFormatter.UseCase.FileSize)
+        assertThat(resultByte).isEqualTo(BytesFormatter.Result("0", "byte"))
+
+        val resultKb = formatter.formatWithUnits(1000, BytesFormatter.UseCase.FileSize)
+        assertThat(resultKb).isEqualTo(BytesFormatter.Result("1.00", "kB"))
+
+        val resultMb = formatter.formatWithUnits(479_999_999, BytesFormatter.UseCase.FileSize)
+        assertThat(resultMb).isEqualTo(BytesFormatter.Result("480", "MB"))
+
+        val resultGb = formatter.formatWithUnits(20_100_000_000, BytesFormatter.UseCase.FileSize)
+        assertThat(resultGb).isEqualTo(BytesFormatter.Result("20.10", "GB"))
+
+        val resultTb =
+            formatter.formatWithUnits(300_100_000_000_000, BytesFormatter.UseCase.FileSize)
+        assertThat(resultTb).isEqualTo(BytesFormatter.Result("300", "TB"))
+
+        val resultPb =
+            formatter.formatWithUnits(1000_000_000_000_000, BytesFormatter.UseCase.FileSize)
+        assertThat(resultPb).isEqualTo(BytesFormatter.Result("1.00", "PB"))
+    }
+}
diff --git a/packages/SettingsLib/aconfig/settingslib.aconfig b/packages/SettingsLib/aconfig/settingslib.aconfig
index 2f91097..bbe08f2 100644
--- a/packages/SettingsLib/aconfig/settingslib.aconfig
+++ b/packages/SettingsLib/aconfig/settingslib.aconfig
@@ -209,3 +209,13 @@
         purpose: PURPOSE_BUGFIX
     }
 }
+
+flag {
+    name: "enable_temporary_bond_devices_ui"
+    namespace: "cross_device_experiences"
+    description: "UI changes for temporary bond devices in audio sharing."
+    bug: "362859132"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 3c36c44..68e9fe7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -73,6 +73,13 @@
     private static final Set<Integer> SA_PROFILES =
             ImmutableSet.of(
                     BluetoothProfile.A2DP, BluetoothProfile.LE_AUDIO, BluetoothProfile.HEARING_AID);
+    private static final List<Integer> BLUETOOTH_DEVICE_CLASS_HEADSET =
+            List.of(
+                    BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES,
+                    BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET);
+
+    private static final String TEMP_BOND_TYPE = "TEMP_BOND_TYPE";
+    private static final String TEMP_BOND_DEVICE_METADATA_VALUE = "le_audio_sharing";
 
     private static ErrorListener sErrorListener;
 
@@ -387,6 +394,19 @@
         return false;
     }
 
+    /** Checks whether the bluetooth device is a headset. */
+    public static boolean isHeadset(@NonNull BluetoothDevice bluetoothDevice) {
+        String deviceType =
+                BluetoothUtils.getStringMetaData(
+                        bluetoothDevice, BluetoothDevice.METADATA_DEVICE_TYPE);
+        if (!TextUtils.isEmpty(deviceType)) {
+            return BluetoothDevice.DEVICE_TYPE_HEADSET.equals(deviceType)
+                    || BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.equals(deviceType);
+        }
+        BluetoothClass btClass = bluetoothDevice.getBluetoothClass();
+        return btClass != null && BLUETOOTH_DEVICE_CLASS_HEADSET.contains(btClass.getDeviceClass());
+    }
+
     /** Create an Icon pointing to a drawable. */
     public static IconCompat createIconWithDrawable(Drawable drawable) {
         Bitmap bitmap;
@@ -1138,4 +1158,15 @@
         }
         return saDevice;
     }
+
+    /**
+     * Verifies if the device is temporary bond in audio sharing.
+     *
+     * @param bluetoothDevice the BluetoothDevice to verify
+     * @return if the device is temporary bond
+     */
+    public static boolean isTemporaryBondDevice(@Nullable BluetoothDevice bluetoothDevice) {
+        String metadataValue = getFastPairCustomizedField(bluetoothDevice, TEMP_BOND_TYPE);
+        return Objects.equals(metadataValue, TEMP_BOND_DEVICE_METADATA_VALUE);
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp
index 81358ca..117ca85 100644
--- a/packages/SettingsLib/tests/robotests/Android.bp
+++ b/packages/SettingsLib/tests/robotests/Android.bp
@@ -65,7 +65,6 @@
     test_options: {
         timeout: 36000,
     },
-    upstream: true,
 
     strict_mode: false,
 }
@@ -100,10 +99,10 @@
     plugins: [
         "auto_value_plugin_1.9",
         "auto_value_builder_plugin_1.9",
-        "Robolectric_processor_upstream",
+        "Robolectric_processor",
     ],
     libs: [
-        "Robolectric_all-target_upstream",
+        "Robolectric_all-target",
         "mockito-robolectric-prebuilt",
         "truth",
     ],
diff --git a/packages/SettingsLib/tests/robotests/fragment/Android.bp b/packages/SettingsLib/tests/robotests/fragment/Android.bp
index 3e67156..0214874 100644
--- a/packages/SettingsLib/tests/robotests/fragment/Android.bp
+++ b/packages/SettingsLib/tests/robotests/fragment/Android.bp
@@ -28,13 +28,13 @@
         //"-J-verbose",
     ],
     libs: [
-        "Robolectric_all-target_upstream",
+        "Robolectric_all-target",
         "androidx.fragment_fragment",
     ],
     plugins: [
         "auto_value_plugin_1.9",
         "auto_value_builder_plugin_1.9",
-        "Robolectric_processor_upstream",
+        "Robolectric_processor",
     ],
 
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index ab9f871..cafe19f 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -80,7 +80,9 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private CachedBluetoothDevice mCachedBluetoothDevice;
 
-    @Mock private BluetoothDevice mBluetoothDevice;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private BluetoothDevice mBluetoothDevice;
+
     @Mock private AudioManager mAudioManager;
     @Mock private PackageManager mPackageManager;
     @Mock private LeAudioProfile mA2dpProfile;
@@ -96,6 +98,7 @@
     private Context mContext;
     private ShadowBluetoothAdapter mShadowBluetoothAdapter;
     private static final String STRING_METADATA = "string_metadata";
+    private static final String LE_AUDIO_SHARING_METADATA = "le_audio_sharing";
     private static final String BOOL_METADATA = "true";
     private static final String INT_METADATA = "25";
     private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
@@ -104,6 +107,8 @@
             "<HEARABLE_CONTROL_SLICE_WITH_WIDTH>"
                     + STRING_METADATA
                     + "</HEARABLE_CONTROL_SLICE_WITH_WIDTH>";
+    private static final String TEMP_BOND_METADATA =
+            "<TEMP_BOND_TYPE>" + LE_AUDIO_SHARING_METADATA + "</TEMP_BOND_TYPE>";
     private static final String TEST_EXCLUSIVE_MANAGER_PACKAGE = "com.test.manager";
     private static final String TEST_EXCLUSIVE_MANAGER_COMPONENT = "com.test.manager/.component";
     private static final int TEST_BROADCAST_ID = 25;
@@ -396,6 +401,38 @@
     }
 
     @Test
+    public void isHeadset_metadataMatched_returnTrue() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE))
+                .thenReturn(BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.getBytes());
+
+        assertThat(BluetoothUtils.isHeadset(mBluetoothDevice)).isTrue();
+    }
+
+    @Test
+    public void isHeadset_metadataNotMatched_returnFalse() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE))
+                .thenReturn(BluetoothDevice.DEVICE_TYPE_CARKIT.getBytes());
+
+        assertThat(BluetoothUtils.isHeadset(mBluetoothDevice)).isFalse();
+    }
+
+    @Test
+    public void isHeadset_btClassMatched_returnTrue() {
+        when(mBluetoothDevice.getBluetoothClass().getDeviceClass())
+                .thenReturn(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
+
+        assertThat(BluetoothUtils.isHeadset(mBluetoothDevice)).isTrue();
+    }
+
+    @Test
+    public void isHeadset_btClassNotMatched_returnFalse() {
+        when(mBluetoothDevice.getBluetoothClass().getDeviceClass())
+                .thenReturn(BluetoothClass.Device.AUDIO_VIDEO_LOUDSPEAKER);
+
+        assertThat(BluetoothUtils.isHeadset(mBluetoothDevice)).isFalse();
+    }
+
+    @Test
     public void isAvailableMediaBluetoothDevice_isConnectedLeAudioDevice_returnTrue() {
         when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
@@ -1303,4 +1340,12 @@
 
         assertThat(BluetoothUtils.isAudioSharingHysteresisModeFixAvailable(mContext)).isTrue();
     }
+
+    @Test
+    public void isTemporaryBondDevice_hasMetadata_returnsTrue() {
+        when(mBluetoothDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS))
+                .thenReturn(TEMP_BOND_METADATA.getBytes());
+
+        assertThat(BluetoothUtils.isTemporaryBondDevice(mBluetoothDevice)).isTrue();
+    }
 }
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index b9f8c71..1fc1f05 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -186,11 +186,6 @@
         Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT,
         Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT,
         Settings.Secure.NAVIGATION_MODE,
-        Settings.Secure.TRACKPAD_GESTURE_BACK_ENABLED,
-        Settings.Secure.TRACKPAD_GESTURE_HOME_ENABLED,
-        Settings.Secure.TRACKPAD_GESTURE_OVERVIEW_ENABLED,
-        Settings.Secure.TRACKPAD_GESTURE_NOTIFICATION_ENABLED,
-        Settings.Secure.TRACKPAD_GESTURE_QUICK_SWITCH_ENABLED,
         Settings.Secure.SKIP_GESTURE_COUNT,
         Settings.Secure.SKIP_TOUCH_COUNT,
         Settings.Secure.SILENCE_ALARMS_GESTURE_COUNT,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 7c5e577..d0e88d5 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -284,11 +284,6 @@
                 new InclusiveFloatRangeValidator(0.0f, Float.MAX_VALUE));
         VALIDATORS.put(Secure.BACK_GESTURE_INSET_SCALE_RIGHT,
                 new InclusiveFloatRangeValidator(0.0f, Float.MAX_VALUE));
-        VALIDATORS.put(Secure.TRACKPAD_GESTURE_BACK_ENABLED, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.TRACKPAD_GESTURE_HOME_ENABLED, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.TRACKPAD_GESTURE_OVERVIEW_ENABLED, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.TRACKPAD_GESTURE_NOTIFICATION_ENABLED, BOOLEAN_VALIDATOR);
-        VALIDATORS.put(Secure.TRACKPAD_GESTURE_QUICK_SWITCH_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.AWARE_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.SKIP_GESTURE_COUNT, NON_NEGATIVE_INTEGER_VALIDATOR);
         VALIDATORS.put(Secure.SKIP_TOUCH_COUNT, NON_NEGATIVE_INTEGER_VALIDATOR);
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index b88ae37..227fff5 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -85,6 +85,9 @@
 filegroup {
     name: "SystemUI-tests-broken-robofiles-run",
     srcs: [
+        "tests/src/**/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt",
+        "tests/src/**/systemui/power/PowerNotificationWarningsTest.java",
+        "tests/src/**/systemui/user/domain/interactor/RefreshUsersSchedulerTest.kt",
         "tests/src/**/systemui/dreams/touch/CommunalTouchHandlerTest.java",
         "tests/src/**/systemui/shade/NotificationShadeWindowViewControllerTest.kt",
         "tests/src/**/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt",
@@ -841,7 +844,6 @@
         "androidx.test.ext.truth",
     ],
 
-    upstream: true,
 
     instrumentation_for: "SystemUIRobo-stub",
     java_resource_dirs: ["tests/robolectric/config"],
@@ -879,7 +881,6 @@
         "androidx.test.ext.truth",
     ],
 
-    upstream: true,
 
     instrumentation_for: "SystemUIRobo-stub",
     java_resource_dirs: ["tests/robolectric/config"],
@@ -916,6 +917,7 @@
         "android.test.mock.impl",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
     plugins: [
         "dagger2-compiler",
     ],
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 99d704f..51ea529 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -413,7 +413,8 @@
         android:defaultToDeviceProtectedStorage="true"
         android:directBootAware="true"
         tools:replace="android:appComponentFactory"
-        android:appComponentFactory=".PhoneSystemUIAppComponentFactory">
+        android:appComponentFactory=".PhoneSystemUIAppComponentFactory"
+        android:enableOnBackInvokedCallback="true">
         <!-- Keep theme in sync with SystemUIApplication.onCreate().
              Setting the theme on the application does not affect views inflated by services.
              The application theme is set again from onCreate to take effect for those views. -->
diff --git a/packages/SystemUI/aconfig/predictive_back.aconfig b/packages/SystemUI/aconfig/predictive_back.aconfig
index 46eb9e1..ee918c2 100644
--- a/packages/SystemUI/aconfig/predictive_back.aconfig
+++ b/packages/SystemUI/aconfig/predictive_back.aconfig
@@ -2,29 +2,8 @@
 container: "system"
 
 flag {
-    name: "predictive_back_sysui"
-    namespace: "systemui"
-    description: "Predictive Back Dispatching for SysUI"
-    bug: "327737297"
-}
-
-flag {
     name: "predictive_back_animate_shade"
     namespace: "systemui"
     description: "Enable Shade Animations"
     bug: "327732946"
 }
-
-flag {
-    name: "predictive_back_animate_bouncer"
-    namespace: "systemui"
-    description: "Enable Predictive Back Animation in Bouncer"
-    bug: "327733487"
-}
-
-flag {
-    name: "predictive_back_animate_dialogs"
-    namespace: "systemui"
-    description: "Enable Predictive Back Animation for SysUI dialogs"
-    bug: "327721544"
-}
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java
index 91fad4f..56d85ab 100644
--- a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java
@@ -107,7 +107,7 @@
             IBinder mergeTarget,
             IRemoteTransitionFinishedCallback finishCallback) {
         logD("mergeAnimation - " + info);
-        mHandler.post(this::cancel);
+        cancel();
     }
 
     @Override
@@ -129,7 +129,7 @@
     @Override
     public void onTransitionConsumed(IBinder transition, boolean aborted) {
         logD("onTransitionConsumed - aborted: " + aborted);
-        mHandler.post(this::cancel);
+        cancel();
     }
 
     private void startAnimationInternal(
@@ -342,11 +342,14 @@
         mFinishCallback = null;
     }
 
-    private void cancel() {
+    public void cancel() {
         logD("cancel()");
-        if (mAnimator != null) {
-            mAnimator.cancel();
-        }
+        mHandler.post(
+                () -> {
+                    if (mAnimator != null) {
+                        mAnimator.cancel();
+                    }
+                });
     }
 
     private static void logD(String msg) {
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
index 6d6aa88..cb3dfb9 100644
--- a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java
@@ -43,6 +43,7 @@
 /**
  * A session object that holds origin transition states for starting an activity from an on-screen
  * UI component and smoothly transitioning back from the activity to the same UI component.
+ *
  * @hide
  */
 public class OriginTransitionSession {
@@ -143,6 +144,12 @@
                 logE("Unable to cancel origin transition!", e);
             }
         }
+        if (mEntryTransition instanceof OriginRemoteTransition) {
+            ((OriginRemoteTransition) mEntryTransition).cancel();
+        }
+        if (mExitTransition instanceof OriginRemoteTransition) {
+            ((OriginRemoteTransition) mExitTransition).cancel();
+        }
     }
 
     private boolean hasEntryTransition() {
@@ -182,6 +189,7 @@
 
     /**
      * A builder to build a {@link OriginTransitionSession}.
+     *
      * @hide
      */
     public static class Builder {
diff --git a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java
index 7c219c6..2e8f928 100644
--- a/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java
+++ b/packages/SystemUI/animation/lib/src/com/android/systemui/animation/ViewUIComponent.java
@@ -24,13 +24,15 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
 import android.util.Log;
 import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewRootImpl;
-import android.view.ViewTreeObserver.OnDrawListener;
+import android.view.ViewTreeObserver;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -51,8 +53,9 @@
     private final Path mClippingPath = new Path();
     private final Outline mClippingOutline = new Outline();
 
-    private final OnDrawListener mOnDrawListener = this::postDraw;
+    private final LifecycleListener mLifecycleListener = new LifecycleListener();
     private final View mView;
+    private final Handler mMainHandler;
 
     @Nullable private SurfaceControl mSurfaceControl;
     @Nullable private Surface mSurface;
@@ -62,6 +65,7 @@
 
     public ViewUIComponent(View view) {
         mView = view;
+        mMainHandler = new Handler(Looper.getMainLooper());
     }
 
     /**
@@ -110,11 +114,11 @@
         t.reparent(mSurfaceControl, transitionLeash).show(mSurfaceControl);
 
         // Make sure view draw triggers surface draw.
-        mView.getViewTreeObserver().addOnDrawListener(mOnDrawListener);
+        mLifecycleListener.register();
 
         // Make the view invisible AFTER the surface is shown.
         t.addTransactionCommittedListener(
-                        mView::post,
+                        this::post,
                         () -> {
                             logD("Surface attached!");
                             forceDraw();
@@ -129,14 +133,14 @@
         SurfaceControl sc = mSurfaceControl;
         mSurface = null;
         mSurfaceControl = null;
-        mView.getViewTreeObserver().removeOnDrawListener(mOnDrawListener);
+        mLifecycleListener.unregister();
         // Restore view visibility
         mView.setVisibility(mVisibleOverride ? View.VISIBLE : View.INVISIBLE);
         // Clean up surfaces.
         SurfaceControl.Transaction t = new SurfaceControl.Transaction();
         t.reparent(sc, null)
                 .addTransactionCommittedListener(
-                        mView::post,
+                        this::post,
                         () -> {
                             s.release();
                             sc.release();
@@ -269,7 +273,66 @@
             return;
         }
         mDirty = true;
-        mView.post(this::draw);
+        post(this::draw);
+    }
+
+    private void post(Runnable r) {
+        if (mView.isAttachedToWindow()) {
+            mView.post(r);
+        } else {
+            // If the view is detached from window, {@code View.post()} will postpone the action
+            // until the view is attached again. However, we don't know if the view will be attached
+            // again, so we post the action to the main thread in this case. This could lead to race
+            // condition if the attachment change caused a thread switching, and it's the caller's
+            // responsibility to ensure the window attachment state doesn't change unexpectedly.
+            if (DEBUG) {
+                Log.w(TAG, mView + " is not attached. Posting action to main thread!");
+            }
+            mMainHandler.post(r);
+        }
+    }
+
+    /** A listener for monitoring view life cycles. */
+    private class LifecycleListener
+            implements ViewTreeObserver.OnDrawListener, View.OnAttachStateChangeListener {
+        private boolean mRegistered;
+
+        @Override
+        public void onDraw() {
+            // View draw should trigger surface draw.
+            postDraw();
+        }
+
+        @Override
+        public void onViewAttachedToWindow(View v) {
+            // empty
+        }
+
+        @Override
+        public void onViewDetachedFromWindow(View v) {
+            Log.w(
+                    TAG,
+                    v + " is detached from the window. Unregistering the life cycle listener ...");
+            unregister();
+        }
+
+        public void register() {
+            if (mRegistered) {
+                return;
+            }
+            mRegistered = true;
+            mView.getViewTreeObserver().addOnDrawListener(this);
+            mView.addOnAttachStateChangeListener(this);
+        }
+
+        public void unregister() {
+            if (!mRegistered) {
+                return;
+            }
+            mRegistered = false;
+            mView.getViewTreeObserver().removeOnDrawListener(this);
+            mView.removeOnAttachStateChangeListener(this);
+        }
     }
 
     /** @hide */
@@ -278,34 +341,33 @@
 
         @Override
         public Transaction setAlpha(ViewUIComponent ui, float alpha) {
-            mChanges.add(() -> ui.mView.post(() -> ui.setAlpha(alpha)));
+            mChanges.add(() -> ui.post(() -> ui.setAlpha(alpha)));
             return this;
         }
 
         @Override
         public Transaction setVisible(ViewUIComponent ui, boolean visible) {
-            mChanges.add(() -> ui.mView.post(() -> ui.setVisible(visible)));
+            mChanges.add(() -> ui.post(() -> ui.setVisible(visible)));
             return this;
         }
 
         @Override
         public Transaction setBounds(ViewUIComponent ui, Rect bounds) {
-            mChanges.add(() -> ui.mView.post(() -> ui.setBounds(bounds)));
+            mChanges.add(() -> ui.post(() -> ui.setBounds(bounds)));
             return this;
         }
 
         @Override
         public Transaction attachToTransitionLeash(
                 ViewUIComponent ui, SurfaceControl transitionLeash, int w, int h) {
-            mChanges.add(
-                    () -> ui.mView.post(() -> ui.attachToTransitionLeash(transitionLeash, w, h)));
+            mChanges.add(() -> ui.post(() -> ui.attachToTransitionLeash(transitionLeash, w, h)));
             return this;
         }
 
         @Override
         public Transaction detachFromTransitionLeash(
                 ViewUIComponent ui, Executor executor, Runnable onDone) {
-            mChanges.add(() -> ui.mView.post(() -> ui.detachFromTransitionLeash(executor, onDone)));
+            mChanges.add(() -> ui.post(() -> ui.detachFromTransitionLeash(executor, onDone)));
             return this;
         }
 
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/AnimationFeatureFlags.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/AnimationFeatureFlags.kt
deleted file mode 100644
index 1c9dabb..0000000
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/AnimationFeatureFlags.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.android.systemui.animation
-
-interface AnimationFeatureFlags {
-    val isPredictiveBackQsDialogAnim: Boolean
-        get() = false
-}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
index 907c39d..c88c4ebb 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
@@ -59,13 +59,8 @@
     private val mainExecutor: Executor,
     private val callback: Callback,
     private val interactionJankMonitor: InteractionJankMonitor,
-    private val featureFlags: AnimationFeatureFlags,
     private val transitionAnimator: TransitionAnimator =
-        TransitionAnimator(
-            mainExecutor,
-            TIMINGS,
-            INTERPOLATORS,
-        ),
+        TransitionAnimator(mainExecutor, TIMINGS, INTERPOLATORS),
     private val isForTesting: Boolean = false,
 ) {
     private companion object {
@@ -219,7 +214,7 @@
         dialog: Dialog,
         view: View,
         cuj: DialogCuj? = null,
-        animateBackgroundBoundsChange: Boolean = false
+        animateBackgroundBoundsChange: Boolean = false,
     ) {
         val controller = Controller.fromView(view, cuj)
         if (controller == null) {
@@ -245,7 +240,7 @@
     fun show(
         dialog: Dialog,
         controller: Controller,
-        animateBackgroundBoundsChange: Boolean = false
+        animateBackgroundBoundsChange: Boolean = false,
     ) {
         if (Looper.myLooper() != Looper.getMainLooper()) {
             throw IllegalStateException(
@@ -263,15 +258,14 @@
         val controller =
             animatedParent?.dialogContentWithBackground?.let {
                 Controller.fromView(it, controller.cuj)
-            }
-                ?: controller
+            } ?: controller
 
         // Make sure we don't run the launch animation from the same source twice at the same time.
         if (openedDialogs.any { it.controller.sourceIdentity == controller.sourceIdentity }) {
             Log.e(
                 TAG,
                 "Not running dialog launch animation from source as it is already expanded into a" +
-                    " dialog"
+                    " dialog",
             )
             dialog.show()
             return
@@ -288,7 +282,6 @@
                 animateBackgroundBoundsChange = animateBackgroundBoundsChange,
                 parentAnimatedDialog = animatedParent,
                 forceDisableSynchronization = isForTesting,
-                featureFlags = featureFlags,
             )
 
         openedDialogs.add(animatedDialog)
@@ -305,7 +298,7 @@
         dialog: Dialog,
         animateFrom: Dialog,
         cuj: DialogCuj? = null,
-        animateBackgroundBoundsChange: Boolean = false
+        animateBackgroundBoundsChange: Boolean = false,
     ) {
         val view =
             openedDialogs.firstOrNull { it.dialog == animateFrom }?.dialogContentWithBackground
@@ -313,7 +306,7 @@
             Log.w(
                 TAG,
                 "Showing dialog $dialog normally as the dialog it is shown from was not shown " +
-                    "using DialogTransitionAnimator"
+                    "using DialogTransitionAnimator",
             )
             dialog.show()
             return
@@ -323,7 +316,7 @@
             dialog,
             view,
             animateBackgroundBoundsChange = animateBackgroundBoundsChange,
-            cuj = cuj
+            cuj = cuj,
         )
     }
 
@@ -346,8 +339,7 @@
         val animatedDialog =
             openedDialogs.firstOrNull {
                 it.dialog.window?.decorView?.viewRootImpl == view.viewRootImpl
-            }
-                ?: return null
+            } ?: return null
         return createActivityTransitionController(animatedDialog, cujType)
     }
 
@@ -373,7 +365,7 @@
 
     private fun createActivityTransitionController(
         animatedDialog: AnimatedDialog,
-        cujType: Int? = null
+        cujType: Int? = null,
     ): ActivityTransitionAnimator.Controller? {
         // At this point, we know that the intent of the caller is to dismiss the dialog to show
         // an app, so we disable the exit animation into the source because we will never want to
@@ -440,7 +432,7 @@
             }
 
             private fun disableDialogDismiss() {
-                dialog.setDismissOverride { /* Do nothing */}
+                dialog.setDismissOverride { /* Do nothing */ }
             }
 
             private fun enableDialogDismiss() {
@@ -530,7 +522,6 @@
      * Whether synchronization should be disabled, which can be useful if we are running in a test.
      */
     private val forceDisableSynchronization: Boolean,
-    private val featureFlags: AnimationFeatureFlags,
 ) {
     /**
      * The DecorView of this dialog window.
@@ -643,8 +634,7 @@
         originalDialogBackgroundColor =
             GhostedViewTransitionAnimatorController.findGradientDrawable(background)
                 ?.color
-                ?.defaultColor
-                ?: Color.BLACK
+                ?.defaultColor ?: Color.BLACK
 
         // Make the background view invisible until we start the animation. We use the transition
         // visibility like GhostView does so that we don't mess up with the accessibility tree (see
@@ -700,7 +690,7 @@
                     oldLeft: Int,
                     oldTop: Int,
                     oldRight: Int,
-                    oldBottom: Int
+                    oldBottom: Int,
                 ) {
                     dialogContentWithBackground.removeOnLayoutChangeListener(this)
 
@@ -717,9 +707,7 @@
         // the dialog.
         dialog.setDismissOverride(this::onDialogDismissed)
 
-        if (featureFlags.isPredictiveBackQsDialogAnim) {
-            dialog.registerAnimationOnBackInvoked(targetView = dialogContentWithBackground)
-        }
+        dialog.registerAnimationOnBackInvoked(targetView = dialogContentWithBackground)
 
         // Show the dialog.
         dialog.show()
@@ -815,7 +803,7 @@
                 if (hasInstrumentedJank) {
                     interactionJankMonitor.end(controller.cuj!!.cujType)
                 }
-            }
+            },
         )
     }
 
@@ -888,14 +876,14 @@
                     onAnimationFinished(true /* instantDismiss */)
                     onDialogDismissed(this@AnimatedDialog)
                 }
-            }
+            },
         )
     }
 
     private fun startAnimation(
         isLaunching: Boolean,
         onLaunchAnimationStart: () -> Unit = {},
-        onLaunchAnimationEnd: () -> Unit = {}
+        onLaunchAnimationEnd: () -> Unit = {},
     ) {
         // Create 2 controllers to animate both the dialog and the source.
         val startController =
@@ -969,7 +957,7 @@
                 override fun onTransitionAnimationProgress(
                     state: TransitionAnimator.State,
                     progress: Float,
-                    linearProgress: Float
+                    linearProgress: Float,
                 ) {
                     startController.onTransitionAnimationProgress(state, progress, linearProgress)
 
@@ -1026,7 +1014,7 @@
             oldLeft: Int,
             oldTop: Int,
             oldRight: Int,
-            oldBottom: Int
+            oldBottom: Int,
         ) {
             // Don't animate if bounds didn't actually change.
             if (left == oldLeft && top == oldTop && right == oldRight && bottom == oldBottom) {
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
index 35e85a0..e02e8b4 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedDraggable.kt
@@ -52,10 +52,10 @@
 import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.Velocity
-import androidx.compose.ui.util.fastAny
 import androidx.compose.ui.util.fastSumBy
 import com.android.compose.modifiers.thenIf
 import kotlin.math.sign
+import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
 
@@ -107,12 +107,16 @@
         /**
          * Stop the current drag with the given [velocity].
          *
+         * @param velocity the velocity of the drag when it stopped.
+         * @param awaitFling a lambda that can be used to wait for the end of the full fling, i.e.
+         *   wait for the end of the nested scroll fling or overscroll fling performed with the
+         *   unconsumed velocity *after* this call to [onDragStopped] returned.
          * @return the consumed [velocity]. Any non-consumed velocity will be dispatched to the next
          *   nested scroll connection to be consumed by any composable above in the hierarchy. If
          *   the drag was performed on this draggable directly (instead of on a nested scrollable),
          *   any remaining velocity will be used to animate the overscroll of this draggable.
          */
-        suspend fun onDragStopped(velocity: Float): Float
+        suspend fun onDragStopped(velocity: Float, awaitFling: suspend () -> Unit): Float
     }
 }
 
@@ -277,29 +281,7 @@
                 }
             }
 
-            var drag = awaitTouchSlopOrCancellation(down.id)
-
-            // We try to pick-up the drag gesture in case the touch slop swipe was consumed by a
-            // nested scrollable child that disappeared.
-            // This was copied from http://shortn/_10L8U02IoL.
-            // TODO(b/380838584): Reuse detect(Horizontal|Vertical)DragGestures() instead.
-            while (drag == null && currentEvent.changes.fastAny { it.pressed }) {
-                var event: PointerEvent
-                do {
-                    event = awaitPointerEvent()
-                } while (
-                    event.changes.fastAny { it.isConsumed } && event.changes.fastAny { it.pressed }
-                )
-
-                // An event was not consumed and there's still a pointer in the screen.
-                if (event.changes.fastAny { it.pressed }) {
-                    // Await touch slop again, using the initial down as starting point.
-                    // For most cases this should return immediately since we probably moved
-                    // far enough from the initial down event.
-                    drag = awaitTouchSlopOrCancellation(down.id)
-                }
-            }
-
+            val drag = awaitTouchSlopOrCancellation(down.id)
             if (drag != null) {
                 velocityTracker.resetTracking()
                 val sign = drag.positionChangeIgnoreConsumed().toFloat().sign
@@ -378,10 +360,20 @@
         // We launch in the scope of the dispatcher so that the fling is not cancelled if this node
         // is removed right after onDragStopped() is called.
         nestedScrollDispatcher.coroutineScope.launch {
-            flingWithOverscroll(velocity) { velocityFromOverscroll ->
-                flingWithNestedScroll(velocityFromOverscroll) { velocityFromNestedScroll ->
-                    controller.onDragStopped(velocityFromNestedScroll.toFloat()).toVelocity()
+            val flingCompletable = CompletableDeferred<Unit>()
+            try {
+                flingWithOverscroll(velocity) { velocityFromOverscroll ->
+                    flingWithNestedScroll(velocityFromOverscroll) { velocityFromNestedScroll ->
+                        controller
+                            .onDragStopped(
+                                velocityFromNestedScroll.toFloat(),
+                                awaitFling = { flingCompletable.await() },
+                            )
+                            .toVelocity()
+                    }
                 }
+            } finally {
+                flingCompletable.complete(Unit)
             }
         }
     }
@@ -536,8 +528,15 @@
         }
 
         suspend fun flingWithOverscroll(velocity: Velocity): Velocity {
-            return flingWithOverscroll(overscrollEffect, velocity) {
-                controller.onDragStopped(it.toFloat()).toVelocity()
+            val flingCompletable = CompletableDeferred<Unit>()
+            return try {
+                flingWithOverscroll(overscrollEffect, velocity) {
+                    controller
+                        .onDragStopped(it.toFloat(), awaitFling = { flingCompletable.await() })
+                        .toVelocity()
+                }
+            } finally {
+                flingCompletable.complete(Unit)
             }
         }
     }
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedScrollController.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedScrollController.kt
new file mode 100644
index 0000000..2530a4f
--- /dev/null
+++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/NestedScrollController.kt
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2024 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 com.android.compose.gesture
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
+import androidx.compose.ui.input.nestedscroll.NestedScrollSource
+import androidx.compose.ui.input.nestedscroll.nestedScrollModifierNode
+import androidx.compose.ui.node.DelegatingNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.Velocity
+
+/**
+ * Update [state] and disallow outer scroll after a child node consumed a non-zero scroll amount
+ * before reaching its [bounds], so that the child is overscrolled instead of letting the outer
+ * scrollable(s) consume the extra scroll.
+ *
+ * Example:
+ * ```
+ * val nestedScrollControlState = remember { NestedScrollControlState() }
+ * Column(
+ *     Modifier
+ *         // Note: Any scrollable/draggable parent should use nestedScrollControlState to
+ *         // enable/disable themselves.
+ *         .verticalScroll(
+ *             rememberScrollState(),
+ *             enabled = nestedScrollControlState.isOuterScrollAllowed,
+ *         )
+ * ) {
+ *     Column(
+ *         Modifier
+ *             .nestedScrollController(nestedScrollControlState)
+ *             .verticalScroll(rememberScrollState())
+ *     ) { ...}
+ * }
+ * ```
+ */
+fun Modifier.nestedScrollController(
+    state: NestedScrollControlState,
+    bounds: NestedScrollableBound = NestedScrollableBound.Any,
+): Modifier {
+    return this.then(NestedScrollControllerElement(state, bounds))
+}
+
+/**
+ * A state that should be used by outer scrollables to disable themselves so that nested scrollables
+ * will overscroll when reaching their bounds.
+ *
+ * @see nestedScrollController
+ */
+class NestedScrollControlState {
+    var isOuterScrollAllowed by mutableStateOf(true)
+        internal set
+}
+
+/**
+ * Specifies when to disable outer scroll after reaching the bounds of a nested scrollable.
+ *
+ * @see nestedScrollController
+ */
+enum class NestedScrollableBound {
+    /** Disable after reaching any of the scrollable bounds. */
+    Any,
+
+    /** Disable after reaching the top (left) bound when scrolling vertically (horizontally). */
+    TopLeft,
+
+    /** Disable after reaching the bottom (right) bound when scrolling vertically (horizontally). */
+    BottomRight;
+
+    companion object {
+        /**
+         * Disable after reaching the left (right) bound when scrolling horizontally in a LTR (RTL)
+         * layout.
+         */
+        val Start: NestedScrollableBound
+            @Composable
+            get() =
+                when (LocalLayoutDirection.current) {
+                    LayoutDirection.Ltr -> TopLeft
+                    LayoutDirection.Rtl -> BottomRight
+                }
+
+        /**
+         * Disable after reaching the right (left) bound when scrolling horizontally in a LTR (RTL)
+         * layout.
+         */
+        val End: NestedScrollableBound
+            @Composable
+            get() =
+                when (LocalLayoutDirection.current) {
+                    LayoutDirection.Ltr -> BottomRight
+                    LayoutDirection.Rtl -> TopLeft
+                }
+    }
+}
+
+private data class NestedScrollControllerElement(
+    private val state: NestedScrollControlState,
+    private val bounds: NestedScrollableBound,
+) : ModifierNodeElement<NestedScrollControllerNode>() {
+    override fun create(): NestedScrollControllerNode {
+        return NestedScrollControllerNode(state, bounds)
+    }
+
+    override fun update(node: NestedScrollControllerNode) {
+        node.update(state, bounds)
+    }
+}
+
+private class NestedScrollControllerNode(
+    private var state: NestedScrollControlState,
+    private var bounds: NestedScrollableBound,
+) : DelegatingNode(), NestedScrollConnection {
+    private var childrenConsumedAnyScroll = false
+
+    init {
+        delegate(nestedScrollModifierNode(this, dispatcher = null))
+    }
+
+    override fun onDetach() {
+        state.isOuterScrollAllowed = true
+    }
+
+    fun update(controller: NestedScrollControlState, bounds: NestedScrollableBound) {
+        if (controller != this.state) {
+            controller.isOuterScrollAllowed = this.state.isOuterScrollAllowed
+            this.state.isOuterScrollAllowed = true
+            this.state = controller
+        }
+
+        this.bounds = bounds
+    }
+
+    override fun onPostScroll(
+        consumed: Offset,
+        available: Offset,
+        source: NestedScrollSource,
+    ): Offset {
+        if (hasConsumedScrollInBounds(consumed.x) || hasConsumedScrollInBounds(consumed.y)) {
+            childrenConsumedAnyScroll = true
+        }
+
+        if (!childrenConsumedAnyScroll) {
+            state.isOuterScrollAllowed = true
+        } else {
+            state.isOuterScrollAllowed = false
+        }
+
+        return Offset.Zero
+    }
+
+    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+        childrenConsumedAnyScroll = false
+        state.isOuterScrollAllowed = true
+        return super.onPostFling(consumed, available)
+    }
+
+    private fun hasConsumedScrollInBounds(consumed: Float): Boolean {
+        return when {
+            consumed < 0f ->
+                bounds == NestedScrollableBound.Any || bounds == NestedScrollableBound.BottomRight
+
+            consumed > 0f ->
+                bounds == NestedScrollableBound.Any || bounds == NestedScrollableBound.TopLeft
+
+            else -> false
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
index f98b090..9c49090 100644
--- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedDraggableTest.kt
@@ -45,6 +45,9 @@
 import kotlin.math.ceil
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
@@ -593,6 +596,63 @@
         assertThat(effect.applyToFlingDone).isTrue()
     }
 
+    @Test
+    fun awaitFling() = runTest {
+        var flingIsDone = false
+        val draggable =
+            TestDraggable(
+                onDragStopped = { _, awaitFling ->
+                    // Start a coroutine in the background that waits for the fling to be finished.
+                    launch {
+                        awaitFling()
+                        flingIsDone = true
+                    }
+
+                    0f
+                }
+            )
+
+        val effectPostFlingCompletable = CompletableDeferred<Unit>()
+        val effect =
+            TestOverscrollEffect(
+                orientation,
+                onPostScroll = { 0f },
+                onPostFling = {
+                    effectPostFlingCompletable.await()
+                    it
+                },
+            )
+
+        val touchSlop =
+            rule.setContentWithTouchSlop {
+                Box(
+                    Modifier.fillMaxSize()
+                        .nestedDraggable(draggable, orientation, overscrollEffect = effect)
+                )
+            }
+
+        assertThat(draggable.onDragStartedCalled).isFalse()
+
+        rule.onRoot().performTouchInput {
+            down(center)
+            moveBy(touchSlop.toOffset())
+            up()
+        }
+
+        // The drag was started and stopped, but the fling is not finished yet as the overscroll
+        // effect is stuck on the effectPostFlingCompletable.
+        runCurrent()
+        rule.waitForIdle()
+        assertThat(draggable.onDragStartedCalled).isTrue()
+        assertThat(draggable.onDragStoppedCalled).isTrue()
+        assertThat(flingIsDone).isFalse()
+
+        effectPostFlingCompletable.complete(Unit)
+        runCurrent()
+        rule.waitForIdle()
+        assertThat(flingIsDone).isTrue()
+    }
+
     private fun ComposeContentTestRule.setContentWithTouchSlop(
         content: @Composable () -> Unit
     ): Float {
@@ -614,7 +674,10 @@
     private class TestDraggable(
         private val onDragStarted: (Offset, Float) -> Unit = { _, _ -> },
         private val onDrag: (Float) -> Float = { it },
-        private val onDragStopped: suspend (Float) -> Float = { it },
+        private val onDragStopped: suspend (Float, awaitFling: suspend () -> Unit) -> Float =
+            { velocity, _ ->
+                velocity
+            },
         private val shouldConsumeNestedScroll: (Float) -> Boolean = { true },
     ) : NestedDraggable {
         var shouldStartDrag = true
@@ -648,9 +711,12 @@
                     return onDrag.invoke(delta)
                 }
 
-                override suspend fun onDragStopped(velocity: Float): Float {
+                override suspend fun onDragStopped(
+                    velocity: Float,
+                    awaitFling: suspend () -> Unit,
+                ): Float {
                     onDragStoppedCalled = true
-                    return onDragStopped.invoke(velocity)
+                    return onDragStopped.invoke(velocity, awaitFling)
                 }
             }
         }
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedScrollControllerTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedScrollControllerTest.kt
new file mode 100644
index 0000000..424af33
--- /dev/null
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/NestedScrollControllerTest.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2025 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 com.android.compose.gesture
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.rememberScrollableState
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onRoot
+import androidx.compose.ui.test.performTouchInput
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.compose.modifiers.thenIf
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class NestedScrollControllerTest {
+    @get:Rule val rule = createComposeRule()
+
+    @Test
+    fun nestedScrollController() {
+        val state = NestedScrollControlState()
+        var nestedScrollConsumesDelta = false
+        rule.setContent {
+            Box(
+                Modifier.fillMaxSize()
+                    .nestedScrollController(state)
+                    .scrollable(
+                        rememberScrollableState { if (nestedScrollConsumesDelta) it else 0f },
+                        Orientation.Vertical,
+                    )
+            )
+        }
+
+        // If the nested child does not consume scrolls, then outer scrolling is allowed.
+        assertThat(state.isOuterScrollAllowed).isTrue()
+        nestedScrollConsumesDelta = false
+        rule.onRoot().performTouchInput {
+            down(topLeft)
+            moveBy(Offset(0f, bottom))
+        }
+        assertThat(state.isOuterScrollAllowed).isTrue()
+        rule.onRoot().performTouchInput { up() }
+
+        // If the nested child consumes scrolls, then outer scrolling is disabled.
+        nestedScrollConsumesDelta = true
+        rule.onRoot().performTouchInput {
+            down(topLeft)
+            moveBy(Offset(0f, bottom))
+        }
+        assertThat(state.isOuterScrollAllowed).isFalse()
+
+        // Outer scrolling is enabled again when stopping the scroll.
+        rule.onRoot().performTouchInput { up() }
+        assertThat(state.isOuterScrollAllowed).isTrue()
+    }
+
+    @Test
+    fun nestedScrollController_detached() {
+        val state = NestedScrollControlState()
+        var composeNestedScroll by mutableStateOf(true)
+        rule.setContent {
+            val scrollableState = rememberScrollableState { it }
+            Box(
+                Modifier.fillMaxSize().thenIf(composeNestedScroll) {
+                    Modifier.nestedScrollController(state)
+                        .scrollable(scrollableState, Orientation.Vertical)
+                }
+            )
+        }
+        // The nested child consumes scrolls, so outer scrolling is disabled.
+        rule.onRoot().performTouchInput {
+            down(topLeft)
+            moveBy(Offset(0f, bottom))
+        }
+        assertThat(state.isOuterScrollAllowed).isFalse()
+
+        // Outer scrolling is enabled again when removing the controller from composition.
+        composeNestedScroll = false
+        rule.waitForIdle()
+        assertThat(state.isOuterScrollAllowed).isTrue()
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
index 46e0efa..183929c 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
@@ -43,6 +43,7 @@
 import androidx.compose.foundation.layout.imeAnimationTarget
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawing
 import androidx.compose.foundation.layout.systemBars
 import androidx.compose.foundation.layout.windowInsetsBottomHeight
 import androidx.compose.foundation.overscroll
@@ -180,10 +181,12 @@
     stackScrollView: NotificationScrollView,
     viewModel: NotificationsPlaceholderViewModel,
 ) {
+
     val isHeadsUp by viewModel.isHeadsUpOrAnimatingAway.collectAsStateWithLifecycle(false)
 
     var scrollOffset by remember { mutableFloatStateOf(0f) }
-    val minScrollOffset = -(stackScrollView.getHeadsUpInset().toFloat())
+    val headsUpInset = with(LocalDensity.current) { headsUpTopInset().toPx() }
+    val minScrollOffset = -headsUpInset
     val maxScrollOffset = 0f
 
     val scrollableState = rememberScrollableState { delta ->
@@ -241,6 +244,12 @@
     )
 }
 
+/** Y position of the HUNs at rest, when the shade is closed. */
+@Composable
+fun headsUpTopInset(): Dp =
+    WindowInsets.safeDrawing.asPaddingValues().calculateTopPadding() +
+        dimensionResource(R.dimen.heads_up_status_bar_padding)
+
 /** Adds the space where notification stack should appear in the scene. */
 @Composable
 fun ContentScope.ConstrainedNotificationStack(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
index 75226b3..2e1100a 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt
@@ -19,6 +19,7 @@
 import android.annotation.StringRes
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
@@ -31,7 +32,6 @@
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.HorizontalDivider
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
@@ -45,6 +45,7 @@
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.systemui.compose.modifiers.sysuiResTag
@@ -60,7 +61,11 @@
  *   the Activity/Fragment/View hosting this Composable once a result is available.
  */
 @Composable
-fun PeopleScreen(viewModel: PeopleViewModel, onResult: (PeopleViewModel.Result) -> Unit) {
+fun PeopleScreen(
+    viewModel: PeopleViewModel,
+    onResult: (PeopleViewModel.Result) -> Unit,
+    modifier: Modifier = Modifier,
+) {
     val priorityTiles by viewModel.priorityTiles.collectAsStateWithLifecycle()
     val recentTiles by viewModel.recentTiles.collectAsStateWithLifecycle()
 
@@ -74,7 +79,7 @@
         }
     }
 
-    Surface(color = MaterialTheme.colorScheme.background, modifier = Modifier.fillMaxSize()) {
+    Surface(color = MaterialTheme.colorScheme.background, modifier = modifier.fillMaxSize()) {
         if (priorityTiles.isNotEmpty() || recentTiles.isNotEmpty()) {
             PeopleScreenWithConversations(priorityTiles, recentTiles, viewModel.onTileClicked)
         } else {
@@ -88,9 +93,10 @@
     priorityTiles: List<PeopleTileViewModel>,
     recentTiles: List<PeopleTileViewModel>,
     onTileClicked: (PeopleTileViewModel) -> Unit,
+    modifier: Modifier = Modifier,
 ) {
     Column(
-        Modifier.fillMaxSize().safeDrawingPadding().sysuiResTag("top_level_with_conversations")
+        modifier.fillMaxSize().safeDrawingPadding().sysuiResTag("top_level_with_conversations")
     ) {
         Column(
             Modifier.fillMaxWidth().padding(PeopleSpacePadding),
@@ -139,28 +145,32 @@
     @StringRes headerTextResource: Int,
     tiles: List<PeopleTileViewModel>,
     onTileClicked: (PeopleTileViewModel) -> Unit,
+    modifier: Modifier = Modifier,
 ) {
-    Text(
-        stringResource(headerTextResource),
-        Modifier.padding(start = 16.dp),
-        style = MaterialTheme.typography.labelLarge,
-        color = MaterialTheme.colorScheme.primary,
-    )
+    val largeCornerRadius = dimensionResource(R.dimen.people_space_widget_radius)
+    val smallCornerRadius = 4.dp
 
-    Spacer(Modifier.height(10.dp))
+    fun topRadius(i: Int): Dp = if (i == 0) largeCornerRadius else smallCornerRadius
+    fun bottomRadius(i: Int): Dp =
+        if (i == tiles.lastIndex) largeCornerRadius else smallCornerRadius
 
-    tiles.forEachIndexed { index, tile ->
-        if (index > 0) {
-            HorizontalDivider(color = MaterialTheme.colorScheme.background, thickness = 2.dp)
-        }
+    Column(modifier, verticalArrangement = Arrangement.spacedBy(2.dp)) {
+        Text(
+            stringResource(headerTextResource),
+            Modifier.padding(start = 16.dp, bottom = 8.dp),
+            style = MaterialTheme.typography.labelLarge,
+            color = MaterialTheme.colorScheme.primary,
+        )
 
-        key(tile.key.toString()) {
-            Tile(
-                tile,
-                onTileClicked,
-                withTopCornerRadius = index == 0,
-                withBottomCornerRadius = index == tiles.lastIndex,
-            )
+        tiles.forEachIndexed { index, tile ->
+            key(tile.key.toString()) {
+                Tile(
+                    tile,
+                    onTileClicked,
+                    topCornerRadius = topRadius(index),
+                    bottomCornerRadius = bottomRadius(index),
+                )
+            }
         }
     }
 }
@@ -169,14 +179,12 @@
 private fun Tile(
     tile: PeopleTileViewModel,
     onTileClicked: (PeopleTileViewModel) -> Unit,
-    withTopCornerRadius: Boolean,
-    withBottomCornerRadius: Boolean,
+    topCornerRadius: Dp,
+    bottomCornerRadius: Dp,
+    modifier: Modifier = Modifier,
 ) {
-    val cornerRadius = dimensionResource(R.dimen.people_space_widget_radius)
-    val topCornerRadius = if (withTopCornerRadius) cornerRadius else 0.dp
-    val bottomCornerRadius = if (withBottomCornerRadius) cornerRadius else 0.dp
-
     Surface(
+        modifier,
         color = MaterialTheme.colorScheme.secondaryContainer,
         shape =
             RoundedCornerShape(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
index 527314d..d4dea65 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreenEmpty.kt
@@ -44,9 +44,9 @@
 import com.android.systemui.res.R
 
 @Composable
-internal fun PeopleScreenEmpty(onGotItClicked: () -> Unit) {
+internal fun PeopleScreenEmpty(onGotItClicked: () -> Unit, modifier: Modifier = Modifier) {
     Column(
-        Modifier.fillMaxSize().safeDrawingPadding().padding(PeopleSpacePadding),
+        modifier.fillMaxSize().safeDrawingPadding().padding(PeopleSpacePadding),
         horizontalAlignment = Alignment.CenterHorizontally,
     ) {
         Text(
@@ -74,8 +74,9 @@
 }
 
 @Composable
-private fun ExampleTile() {
+private fun ExampleTile(modifier: Modifier = Modifier) {
     Surface(
+        modifier,
         shape = RoundedCornerShape(28.dp),
         color = MaterialTheme.colorScheme.secondaryContainer,
     ) {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt
index e4f4df3..9ee25c3 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt
@@ -24,6 +24,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalDensity
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
@@ -34,6 +35,7 @@
 import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.lifecycle.rememberViewModel
 import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace
+import com.android.systemui.notifications.ui.composable.headsUpTopInset
 import com.android.systemui.qs.ui.composable.QuickSettings
 import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaLandscapeTopOffset
 import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaOffset.Default
@@ -78,6 +80,8 @@
             }
         }
 
+        val headsUpInset = with(LocalDensity.current) { headsUpTopInset().toPx() }
+
         LaunchedEffect(isIdleAndNotOccluded) {
             // Wait for being Idle on this Scene, otherwise LaunchedEffect would fire too soon,
             // and another transition could override the NSSL stack bounds.
@@ -86,7 +90,7 @@
                 // and not to confuse the StackScrollAlgorithm when it displays a HUN over GONE.
                 notificationStackScrolLView.get().apply {
                     // use -headsUpInset to allow HUN translation outside bounds for snoozing
-                    setStackTop(-getHeadsUpInset().toFloat())
+                    setStackTop(-headsUpInset)
                     setStackCutoff(0f)
                 }
             }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
index c704a3e..de428a7 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
@@ -35,6 +35,7 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
+import com.android.compose.gesture.NestedScrollableBound
 import com.android.compose.gesture.effect.ContentOverscrollEffect
 
 /**
@@ -238,6 +239,18 @@
     fun Modifier.noResizeDuringTransitions(): Modifier
 
     /**
+     * Temporarily disable this content swipe actions when any scrollable below this modifier has
+     * consumed any amount of scroll delta, until the scroll gesture is finished.
+     *
+     * This can for instance be used to ensure that a scrollable list is overscrolled once it
+     * reached its bounds instead of directly starting a scene transition from the same scroll
+     * gesture.
+     */
+    fun Modifier.disableSwipesWhenScrolling(
+        bounds: NestedScrollableBound = NestedScrollableBound.Any
+    ): Modifier
+
+    /**
      * A [NestedSceneTransitionLayout] will share its elements with its ancestor STLs therefore
      * enabling sharedElement transitions between them.
      */
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
index 568a358..8153586 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
@@ -232,6 +232,8 @@
     canShowOverlay: (OverlayKey) -> Boolean = { true },
     canHideOverlay: (OverlayKey) -> Boolean = { true },
     canReplaceOverlay: (from: OverlayKey, to: OverlayKey) -> Boolean = { _, _ -> true },
+    onTransitionStart: (TransitionState.Transition) -> Unit = {},
+    onTransitionEnd: (TransitionState.Transition) -> Unit = {},
 ): MutableSceneTransitionLayoutState {
     return MutableSceneTransitionLayoutStateImpl(
         initialScene,
@@ -241,6 +243,8 @@
         canShowOverlay,
         canHideOverlay,
         canReplaceOverlay,
+        onTransitionStart,
+        onTransitionEnd,
     )
 }
 
@@ -252,7 +256,11 @@
     internal val canChangeScene: (SceneKey) -> Boolean = { true },
     internal val canShowOverlay: (OverlayKey) -> Boolean = { true },
     internal val canHideOverlay: (OverlayKey) -> Boolean = { true },
-    internal val canReplaceOverlay: (from: OverlayKey, to: OverlayKey) -> Boolean = { _, _ -> true },
+    internal val canReplaceOverlay: (from: OverlayKey, to: OverlayKey) -> Boolean = { _, _ ->
+        true
+    },
+    private val onTransitionStart: (TransitionState.Transition) -> Unit = {},
+    private val onTransitionEnd: (TransitionState.Transition) -> Unit = {},
 ) : MutableSceneTransitionLayoutState {
     private val creationThread: Thread = Thread.currentThread()
 
@@ -367,9 +375,11 @@
             startTransitionInternal(transition, chain)
 
             // Run the transition until it is finished.
+            onTransitionStart(transition)
             transition.runInternal()
         } finally {
             finishTransition(transition)
+            onTransitionEnd(transition)
         }
     }
 
@@ -384,14 +394,10 @@
         val toContent = transition.toContent
 
         // Update the transition specs.
-        transition.transformationSpec =
-            transitions
-                .transitionSpec(fromContent, toContent, key = transition.key)
-                .transformationSpec(transition)
-        transition.previewTransformationSpec =
-            transitions
-                .transitionSpec(fromContent, toContent, key = transition.key)
-                .previewTransformationSpec(transition)
+        val spec = transitions.transitionSpec(fromContent, toContent, key = transition.key)
+        transition._cuj = spec.cuj
+        transition.transformationSpec = spec.transformationSpec(transition)
+        transition.previewTransformationSpec = spec.previewTransformationSpec(transition)
     }
 
     private fun startTransitionInternal(transition: TransitionState.Transition, chain: Boolean) {
@@ -411,9 +417,7 @@
                     if (tooManyTransitions) logTooManyTransitions()
 
                     // Force finish all transitions.
-                    while (currentTransitions.isNotEmpty()) {
-                        finishTransition(transitionStates[0] as TransitionState.Transition)
-                    }
+                    currentTransitions.fastForEach { finishTransition(it) }
 
                     // We finished all transitions, so we are now idle. We remove this state so that
                     // we end up only with the new transition after appending it.
@@ -475,46 +479,36 @@
         // Mark this transition as finished.
         finishedTransitions.add(transition)
 
-        // Keep a reference to the last transition, in case we remove all transitions and should
-        // settle to Idle.
+        if (finishedTransitions.size != transitionStates.size) {
+            // Some transitions were not finished, so we won't settle to idle.
+            return
+        }
+
+        // Keep a reference to the last transition, in case all transitions are finished and we
+        // should settle to Idle.
         val lastTransition = transitionStates.last()
 
-        // Remove all first n finished transitions.
-        var i = 0
-        val nStates = transitionStates.size
-        while (i < nStates) {
-            val t = transitionStates[i]
-            if (!finishedTransitions.contains(t)) {
-                // Stop here.
-                break
+        transitionStates.fastForEach { state ->
+            if (!finishedTransitions.contains(state)) {
+                // Some transitions were not finished, so we won't settle to idle.
+                return
             }
-
-            // Remove the transition from the set of finished transitions.
-            finishedTransitions.remove(t)
-            i++
         }
 
-        // If all transitions are finished, we are idle.
-        if (i == nStates) {
-            check(finishedTransitions.isEmpty())
-            val idle =
-                TransitionState.Idle(lastTransition.currentScene, lastTransition.currentOverlays)
-            Log.i(TAG, "all transitions finished. idle=$idle")
-            this.transitionStates = listOf(idle)
-        } else if (i > 0) {
-            this.transitionStates = transitionStates.subList(fromIndex = i, toIndex = nStates)
-        }
+        val idle = TransitionState.Idle(lastTransition.currentScene, lastTransition.currentOverlays)
+        Log.i(TAG, "all transitions finished. idle=$idle")
+        finishedTransitions.clear()
+        this.transitionStates = listOf(idle)
     }
 
     override fun snapToScene(scene: SceneKey, currentOverlays: Set<OverlayKey>) {
         checkThread()
 
         // Force finish all transitions.
-        while (currentTransitions.isNotEmpty()) {
-            finishTransition(transitionStates[0] as TransitionState.Transition)
-        }
+        currentTransitions.fastForEach { finishTransition(it) }
 
         check(transitionStates.size == 1)
+        check(currentTransitions.isEmpty())
         transitionStates = listOf(TransitionState.Idle(scene, currentOverlays))
     }
 
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
index 756d71c..ff8efc2 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitions.kt
@@ -29,6 +29,7 @@
 import com.android.compose.animation.scene.transformation.SharedElementTransformation
 import com.android.compose.animation.scene.transformation.TransformationMatcher
 import com.android.compose.animation.scene.transformation.TransformationWithRange
+import com.android.internal.jank.Cuj.CujType
 
 /** The transitions configuration of a [SceneTransitionLayout]. */
 class SceneTransitions
@@ -111,7 +112,15 @@
     }
 
     private fun defaultTransition(from: ContentKey, to: ContentKey) =
-        TransitionSpecImpl(key = null, from, to, null, null, TransformationSpec.EmptyProvider)
+        TransitionSpecImpl(
+            key = null,
+            from,
+            to,
+            cuj = null,
+            previewTransformationSpec = null,
+            reversePreviewTransformationSpec = null,
+            TransformationSpec.EmptyProvider,
+        )
 
     companion object {
         internal val DefaultSwipeSpec =
@@ -147,6 +156,9 @@
      */
     val to: ContentKey?
 
+    /** The CUJ covered by this transition. */
+    @CujType val cuj: Int?
+
     /**
      * Return a reversed version of this [TransitionSpec] for a transition going from [to] to
      * [from].
@@ -213,6 +225,7 @@
     override val key: TransitionKey?,
     override val from: ContentKey?,
     override val to: ContentKey?,
+    override val cuj: Int?,
     private val previewTransformationSpec:
         ((TransitionState.Transition) -> TransformationSpecImpl)? =
         null,
@@ -226,6 +239,7 @@
             key = key,
             from = to,
             to = from,
+            cuj = cuj,
             previewTransformationSpec = reversePreviewTransformationSpec,
             reversePreviewTransformationSpec = previewTransformationSpec,
             transformationSpec = { transition ->
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
index c5b3df2..3f6bce7 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeToScene.kt
@@ -54,7 +54,7 @@
 
 /** Whether swipe should be enabled in the given [orientation]. */
 internal fun Content.shouldEnableSwipes(orientation: Orientation): Boolean {
-    if (userActions.isEmpty()) {
+    if (userActions.isEmpty() || !areSwipesAllowed()) {
         return false
     }
 
@@ -69,6 +69,10 @@
  * @return The best matching [UserActionResult], or `null` if no match is found.
  */
 internal fun Content.findActionResultBestMatch(swipe: Swipe.Resolved): UserActionResult? {
+    if (!areSwipesAllowed()) {
+        return null
+    }
+
     var bestPoints = Int.MIN_VALUE
     var bestMatch: UserActionResult? = null
     userActions.forEach { (actionSwipe, actionResult) ->
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt
index fda6fab..998054e 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt
@@ -25,6 +25,7 @@
 import androidx.compose.ui.unit.dp
 import com.android.compose.animation.scene.content.state.TransitionState
 import com.android.compose.animation.scene.transformation.Transformation
+import com.android.internal.jank.Cuj.CujType
 
 /** Define the [transitions][SceneTransitions] to be used with a [SceneTransitionLayout]. */
 fun transitions(builder: SceneTransitionsBuilder.() -> Unit): SceneTransitions {
@@ -64,6 +65,7 @@
     fun to(
         to: ContentKey,
         key: TransitionKey? = null,
+        @CujType cuj: Int? = null,
         preview: (TransitionBuilder.() -> Unit)? = null,
         reversePreview: (TransitionBuilder.() -> Unit)? = null,
         builder: TransitionBuilder.() -> Unit = {},
@@ -90,6 +92,7 @@
         from: ContentKey,
         to: ContentKey? = null,
         key: TransitionKey? = null,
+        @CujType cuj: Int? = null,
         preview: (TransitionBuilder.() -> Unit)? = null,
         reversePreview: (TransitionBuilder.() -> Unit)? = null,
         builder: TransitionBuilder.() -> Unit = {},
@@ -146,6 +149,9 @@
      */
     var swipeSpec: SpringSpec<Float>?
 
+    /** The CUJ associated to this transitions. */
+    @CujType var cuj: Int?
+
     /**
      * Define a timestamp-based range for the transformations inside [builder].
      *
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt
index a164996..7ca5215 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt
@@ -37,6 +37,7 @@
 import com.android.compose.animation.scene.transformation.TransformationMatcher
 import com.android.compose.animation.scene.transformation.TransformationRange
 import com.android.compose.animation.scene.transformation.Translate
+import com.android.internal.jank.Cuj.CujType
 
 internal fun transitionsImpl(builder: SceneTransitionsBuilder.() -> Unit): SceneTransitions {
     val impl = SceneTransitionsBuilderImpl().apply(builder)
@@ -52,28 +53,47 @@
     override fun to(
         to: ContentKey,
         key: TransitionKey?,
+        @CujType cuj: Int?,
         preview: (TransitionBuilder.() -> Unit)?,
         reversePreview: (TransitionBuilder.() -> Unit)?,
         builder: TransitionBuilder.() -> Unit,
     ) {
-        transition(from = null, to = to, key = key, preview, reversePreview, builder)
+        transition(
+            from = null,
+            to = to,
+            key = key,
+            cuj = cuj,
+            preview = preview,
+            reversePreview = reversePreview,
+            builder = builder,
+        )
     }
 
     override fun from(
         from: ContentKey,
         to: ContentKey?,
         key: TransitionKey?,
+        @CujType cuj: Int?,
         preview: (TransitionBuilder.() -> Unit)?,
         reversePreview: (TransitionBuilder.() -> Unit)?,
         builder: TransitionBuilder.() -> Unit,
     ) {
-        transition(from = from, to = to, key = key, preview, reversePreview, builder)
+        transition(
+            from = from,
+            to = to,
+            key = key,
+            cuj = cuj,
+            preview = preview,
+            reversePreview = reversePreview,
+            builder = builder,
+        )
     }
 
     private fun transition(
         from: ContentKey?,
         to: ContentKey?,
         key: TransitionKey?,
+        @CujType cuj: Int?,
         preview: (TransitionBuilder.() -> Unit)?,
         reversePreview: (TransitionBuilder.() -> Unit)?,
         builder: TransitionBuilder.() -> Unit,
@@ -93,9 +113,10 @@
 
         val spec =
             TransitionSpecImpl(
-                key,
-                from,
-                to,
+                key = key,
+                from = from,
+                to = to,
+                cuj = cuj,
                 previewTransformationSpec = preview?.let { { t -> transformationSpec(t, it) } },
                 reversePreviewTransformationSpec =
                     reversePreview?.let { { t -> transformationSpec(t, it) } },
@@ -190,6 +211,7 @@
     override var spec: AnimationSpec<Float> = spring(stiffness = Spring.StiffnessLow)
     override var swipeSpec: SpringSpec<Float>? = null
     override var distance: UserActionDistance? = null
+    override var cuj: Int? = null
     private val durationMillis: Int by lazy {
         val spec = spec
         if (spec !is DurationBasedAnimationSpec) {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
index 4c15f7a..59b4a09 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
@@ -56,7 +56,10 @@
 import com.android.compose.animation.scene.effect.VisualEffect
 import com.android.compose.animation.scene.element
 import com.android.compose.animation.scene.modifiers.noResizeDuringTransitions
+import com.android.compose.gesture.NestedScrollControlState
+import com.android.compose.gesture.NestedScrollableBound
 import com.android.compose.gesture.effect.OffsetOverscrollEffect
+import com.android.compose.gesture.nestedScrollController
 import com.android.compose.modifiers.thenIf
 import com.android.compose.ui.graphics.ContainerState
 import com.android.compose.ui.graphics.container
@@ -70,7 +73,8 @@
     actions: Map<UserAction.Resolved, UserActionResult>,
     zIndex: Float,
 ) {
-    internal val scope = ContentScopeImpl(layoutImpl, content = this)
+    private val nestedScrollControlState = NestedScrollControlState()
+    internal val scope = ContentScopeImpl(layoutImpl, content = this, nestedScrollControlState)
     val containerState = ContainerState()
 
     var content by mutableStateOf(content)
@@ -101,11 +105,14 @@
             scope.content()
         }
     }
+
+    fun areSwipesAllowed(): Boolean = nestedScrollControlState.isOuterScrollAllowed
 }
 
 internal class ContentScopeImpl(
     private val layoutImpl: SceneTransitionLayoutImpl,
     private val content: Content,
+    private val nestedScrollControlState: NestedScrollControlState,
 ) : ContentScope, ElementStateScope by layoutImpl.elementStateScope {
     override val contentKey: ContentKey
         get() = content.key
@@ -176,6 +183,10 @@
         return noResizeDuringTransitions(layoutState = layoutImpl.state)
     }
 
+    override fun Modifier.disableSwipesWhenScrolling(bounds: NestedScrollableBound): Modifier {
+        return nestedScrollController(nestedScrollControlState, bounds)
+    }
+
     @Composable
     override fun NestedSceneTransitionLayout(
         state: SceneTransitionLayoutState,
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt
index e7ca511..712af56 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt
@@ -32,6 +32,7 @@
 import com.android.compose.animation.scene.TransformationSpec
 import com.android.compose.animation.scene.TransformationSpecImpl
 import com.android.compose.animation.scene.TransitionKey
+import com.android.internal.jank.Cuj.CujType
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
@@ -237,6 +238,11 @@
         /** Whether user input is currently driving the transition. */
         abstract val isUserInputOngoing: Boolean
 
+        /** The CUJ covered by this transition. */
+        @CujType
+        val cuj: Int?
+            get() = _cuj
+
         /**
          * The progress of the preview transition. This is usually in the `[0; 1]` range, but it can
          * also be less than `0` or greater than `1` when using transitions with a spring
@@ -251,13 +257,15 @@
         internal open val isInPreviewStage: Boolean = false
 
         /**
-         * The current [TransformationSpecImpl] associated to this transition.
+         * The current [TransformationSpecImpl] and other values associated to this transition from
+         * the spec.
          *
          * Important: These will be set exactly once, when this transition is
          * [started][MutableSceneTransitionLayoutStateImpl.startTransition].
          */
         internal var transformationSpec: TransformationSpecImpl = TransformationSpec.Empty
         internal var previewTransformationSpec: TransformationSpecImpl? = null
+        internal var _cuj: Int? = null
 
         /**
          * An animatable that animates from 1f to 0f. This will be used to nicely animate the sudden
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ContentTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ContentTest.kt
new file mode 100644
index 0000000..06a9735
--- /dev/null
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ContentTest.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2025 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 com.android.compose.animation.scene
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.rememberScrollableState
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onRoot
+import androidx.compose.ui.test.performTouchInput
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.compose.animation.scene.TestScenes.SceneA
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class ContentTest {
+    @get:Rule val rule = createComposeRule()
+
+    @Test
+    fun disableSwipesWhenScrolling() {
+        lateinit var layoutImpl: SceneTransitionLayoutImpl
+        rule.setContent {
+            SceneTransitionLayoutForTesting(
+                remember { MutableSceneTransitionLayoutState(SceneA) },
+                onLayoutImpl = { layoutImpl = it },
+            ) {
+                scene(SceneA) {
+                    Box(
+                        Modifier.fillMaxSize()
+                            .disableSwipesWhenScrolling()
+                            .scrollable(rememberScrollableState { it }, Orientation.Vertical)
+                    )
+                }
+            }
+        }
+
+        val content = layoutImpl.content(SceneA)
+        assertThat(content.areSwipesAllowed()).isTrue()
+        rule.onRoot().performTouchInput {
+            down(topLeft)
+            moveBy(bottomLeft)
+        }
+
+        assertThat(content.areSwipesAllowed()).isFalse()
+        rule.onRoot().performTouchInput { up() }
+        assertThat(content.areSwipesAllowed()).isTrue()
+    }
+}
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
index d1bd52b..f3be5e4 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
@@ -198,23 +198,30 @@
         assertThat(state.currentTransitions).containsExactly(aToB, bToC).inOrder()
 
         // C => A. This should automatically call freezeAndAnimateToCurrentState() on bToC.
-        state.startTransitionImmediately(animationScope = backgroundScope, cToA)
+        val cToAJob = state.startTransitionImmediately(animationScope = backgroundScope, cToA)
         assertThat(frozenTransitions).containsExactly(aToB, bToC)
         assertThat(state.finishedTransitions).isEmpty()
         assertThat(state.currentTransitions).containsExactly(aToB, bToC, cToA).inOrder()
 
-        // Mark bToC as finished. The list of current transitions does not change because aToB is
-        // still not marked as finished.
-        bToC.finish()
-        bToCJob.join()
-        assertThat(state.finishedTransitions).containsExactly(bToC)
-        assertThat(state.currentTransitions).containsExactly(aToB, bToC, cToA).inOrder()
-
-        // Mark aToB as finished. This will remove both aToB and bToC from the list of transitions.
+        // Mark aToB and bToC as finished. The list of current transitions does not change because
+        // cToA is still running.
         aToB.finish()
         aToBJob.join()
+        assertThat(state.finishedTransitions).containsExactly(aToB)
+        assertThat(state.currentTransitions).containsExactly(aToB, bToC, cToA).inOrder()
+
+        bToC.finish()
+        bToCJob.join()
+        assertThat(state.finishedTransitions).containsExactly(aToB, bToC)
+        assertThat(state.currentTransitions).containsExactly(aToB, bToC, cToA).inOrder()
+
+        // Mark cToA as finished. This should clear all transitions and settle to idle.
+        cToA.finish()
+        cToAJob.join()
         assertThat(state.finishedTransitions).isEmpty()
-        assertThat(state.currentTransitions).containsExactly(cToA).inOrder()
+        assertThat(state.currentTransitions).isEmpty()
+        assertThat(state.transitionState).isIdle()
+        assertThat(state.transitionState).hasCurrentScene(SceneA)
     }
 
     @Test
@@ -473,4 +480,77 @@
                     "SceneKey(debugName=SceneB)"
             )
     }
+
+    @Test
+    fun snapToScene_multipleTransitions() = runMonotonicClockTest {
+        val state = MutableSceneTransitionLayoutState(SceneA)
+        state.startTransitionImmediately(this, transition(SceneA, SceneB))
+        state.startTransitionImmediately(this, transition(SceneB, SceneC))
+        state.snapToScene(SceneC)
+
+        assertThat(state.transitionState).isIdle()
+        assertThat(state.transitionState).hasCurrentScene(SceneC)
+    }
+
+    @Test
+    fun trackTransitionCujs() = runTest {
+        val started = mutableSetOf<TransitionState.Transition>()
+        val finished = mutableSetOf<TransitionState.Transition>()
+        val cujWhenStarting = mutableMapOf<TransitionState.Transition, Int?>()
+        val state =
+            MutableSceneTransitionLayoutState(
+                SceneA,
+                transitions {
+                    // A <=> B.
+                    from(SceneA, to = SceneB, cuj = 1)
+
+                    // A <=> C.
+                    from(SceneA, to = SceneC, cuj = 2)
+                    from(SceneC, to = SceneA, cuj = 3)
+                },
+                onTransitionStart = { transition ->
+                    started.add(transition)
+                    cujWhenStarting[transition] = transition.cuj
+                },
+                onTransitionEnd = { finished.add(it) },
+            )
+
+        val aToB = transition(SceneA, SceneB)
+        val bToA = transition(SceneB, SceneA)
+        val aToC = transition(SceneA, SceneC)
+        val cToA = transition(SceneC, SceneA)
+
+        val animationScope = this
+        state.startTransitionImmediately(animationScope, aToB)
+        assertThat(started).containsExactly(aToB)
+        assertThat(finished).isEmpty()
+
+        state.startTransitionImmediately(animationScope, bToA)
+        assertThat(started).containsExactly(aToB, bToA)
+        assertThat(finished).isEmpty()
+
+        aToB.finish()
+        runCurrent()
+        assertThat(finished).containsExactly(aToB)
+
+        state.startTransitionImmediately(animationScope, aToC)
+        assertThat(started).containsExactly(aToB, bToA, aToC)
+        assertThat(finished).containsExactly(aToB)
+
+        state.startTransitionImmediately(animationScope, cToA)
+        assertThat(started).containsExactly(aToB, bToA, aToC, cToA)
+        assertThat(finished).containsExactly(aToB)
+
+        bToA.finish()
+        aToC.finish()
+        cToA.finish()
+        runCurrent()
+        assertThat(started).containsExactly(aToB, bToA, aToC, cToA)
+        assertThat(finished).containsExactly(aToB, bToA, aToC, cToA)
+
+        assertThat(cujWhenStarting[aToB]).isEqualTo(1)
+        assertThat(cujWhenStarting[bToA]).isEqualTo(1)
+        assertThat(cujWhenStarting[aToC]).isEqualTo(2)
+        assertThat(cujWhenStarting[cToA]).isEqualTo(3)
+    }
 }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
index fdbd0f6..7c8c6e5 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
@@ -379,8 +379,8 @@
         assertThat(transition).hasProgress(0.5f)
         rule.waitForIdle()
 
-        // B and C are composed.
-        rule.onNodeWithTag("aRoot").assertDoesNotExist()
+        // A, B and C are still composed given that B => C is not finished yet.
+        rule.onNodeWithTag("aRoot").assertExists()
         rule.onNodeWithTag("bRoot").assertExists()
         rule.onNodeWithTag("cRoot").assertExists()
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt
deleted file mode 100644
index 15373d3..0000000
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockDesign.kt
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.shared.clocks
-
-import android.graphics.Point
-import android.view.animation.Interpolator
-import com.android.app.animation.Interpolators
-import com.android.internal.annotations.Keep
-import com.android.systemui.monet.Style as MonetStyle
-import com.android.systemui.shared.clocks.view.HorizontalAlignment
-import com.android.systemui.shared.clocks.view.VerticalAlignment
-
-/** Data format for a simple asset-defined clock */
-@Keep
-data class ClockDesign(
-    val id: String,
-    val name: String? = null,
-    val description: String? = null,
-    val thumbnail: String? = null,
-    val large: ClockFace? = null,
-    val small: ClockFace? = null,
-    @MonetStyle.Type val colorPalette: Int? = null,
-)
-
-/** Describes a clock using layers */
-@Keep
-data class ClockFace(
-    val layers: List<ClockLayer> = listOf<ClockLayer>(),
-    val layerBounds: LayerBounds = LayerBounds.FIT,
-    val wallpaper: String? = null,
-    val faceLayout: DigitalFaceLayout? = null,
-    val pickerScale: ClockFaceScaleInPicker? = ClockFaceScaleInPicker(1.0f, 1.0f),
-)
-
-@Keep data class ClockFaceScaleInPicker(val scaleX: Float, val scaleY: Float)
-
-/** Base Type for a Clock Layer */
-@Keep
-interface ClockLayer {
-    /** Override of face LayerBounds setting for this layer */
-    val layerBounds: LayerBounds?
-}
-
-/** Clock layer that renders a static asset */
-@Keep
-data class AssetLayer(
-    /** Asset to render in this layer */
-    val asset: AssetReference,
-    override val layerBounds: LayerBounds? = null,
-) : ClockLayer
-
-/** Clock layer that renders the time (or a component of it) using numerals */
-@Keep
-data class DigitalHandLayer(
-    /** See SimpleDateFormat for timespec format info */
-    val timespec: DigitalTimespec,
-    val style: TextStyle,
-    // adoStyle concrete type must match style,
-    // cause styles will transition between style and aodStyle
-    val aodStyle: TextStyle?,
-    val timer: Int? = null,
-    override val layerBounds: LayerBounds? = null,
-    var faceLayout: DigitalFaceLayout? = null,
-    // we pass 12-hour format from json, which will be converted to 24-hour format in codes
-    val dateTimeFormat: String,
-    val alignment: DigitalAlignment?,
-    // ratio of margins to measured size, currently used for handwritten clocks
-    val marginRatio: DigitalMarginRatio? = DigitalMarginRatio(),
-) : ClockLayer
-
-/** Clock layer that renders the time (or a component of it) using numerals */
-@Keep
-data class ComposedDigitalHandLayer(
-    val customizedView: String? = null,
-    /** See SimpleDateFormat for timespec format info */
-    val digitalLayers: List<DigitalHandLayer> = listOf<DigitalHandLayer>(),
-    override val layerBounds: LayerBounds? = null,
-) : ClockLayer
-
-@Keep
-data class DigitalAlignment(
-    val horizontalAlignment: HorizontalAlignment?,
-    val verticalAlignment: VerticalAlignment?,
-)
-
-@Keep
-data class DigitalMarginRatio(
-    val left: Float = 0F,
-    val top: Float = 0F,
-    val right: Float = 0F,
-    val bottom: Float = 0F,
-)
-
-/** Clock layer which renders a component of the time using an analog hand */
-@Keep
-data class AnalogHandLayer(
-    val timespec: AnalogTimespec,
-    val tickMode: AnalogTickMode,
-    val asset: AssetReference,
-    val timer: Int? = null,
-    val clock_pivot: Point = Point(0, 0),
-    val asset_pivot: Point? = null,
-    val length: Float = 1f,
-    override val layerBounds: LayerBounds? = null,
-) : ClockLayer
-
-/** Clock layer which renders the time using an AVD */
-@Keep
-data class AnimatedHandLayer(
-    val timespec: AnalogTimespec,
-    val asset: AssetReference,
-    val timer: Int? = null,
-    override val layerBounds: LayerBounds? = null,
-) : ClockLayer
-
-/** A collection of asset references for use in different device modes */
-@Keep
-data class AssetReference(
-    val light: String,
-    val dark: String,
-    val doze: String? = null,
-    val lightTint: String? = null,
-    val darkTint: String? = null,
-    val dozeTint: String? = null,
-)
-
-/**
- * Core TextStyling attributes for text clocks. Both color and sizing information can be applied to
- * either subtype.
- */
-@Keep
-interface TextStyle {
-    // fontSizeScale is a scale factor applied to the default clock's font size.
-    val fontSizeScale: Float?
-}
-
-/**
- * This specifies a font and styling parameters for that font. This is rendered using a text view
- * and the text animation classes used by the default clock. To ensure default value take effects,
- * all parameters MUST have a default value
- */
-@Keep
-data class FontTextStyle(
-    // Font to load and use in the TextView
-    val fontFamily: String? = null,
-    val lineHeight: Float? = null,
-    val borderWidth: String? = null,
-    // ratio of borderWidth / fontSize
-    val borderWidthScale: Float? = null,
-    // A color literal like `#FF00FF` or a color resource like `@android:color/system_accent1_100`
-    val fillColorLight: String? = null,
-    // A color literal like `#FF00FF` or a color resource like `@android:color/system_accent1_100`
-    val fillColorDark: String? = null,
-    override val fontSizeScale: Float? = null,
-    // used when alternate in one font file is needed
-    var fontFeatureSettings: String? = null,
-    val renderType: RenderType = RenderType.STROKE_TEXT,
-    val outlineColor: String? = null,
-    val transitionDuration: Long = -1L,
-    val transitionInterpolator: InterpolatorEnum? = null,
-) : TextStyle
-
-/**
- * As an alternative to using a font, we can instead render a digital clock using a set of drawables
- * for each numeral, and optionally a colon. These drawables will be rendered directly after sizing
- * and placing them. This may be easier than generating a font file in some cases, and is provided
- * for ease of use. Unlike fonts, these are not localizable to other numeric systems (like Burmese).
- */
-@Keep
-data class LottieTextStyle(
-    val numbers: List<String> = listOf(),
-    // Spacing between numbers, dimension string
-    val spacing: String = "0dp",
-    // Colon drawable may be omitted if unused in format spec
-    val colon: String? = null,
-    // key is keypath name to get strokes from lottie, value is the color name to query color in
-    // palette, e.g. @android:color/system_accent1_100
-    val fillColorLightMap: Map<String, String>? = null,
-    val fillColorDarkMap: Map<String, String>? = null,
-    override val fontSizeScale: Float? = null,
-    val paddingVertical: String = "0dp",
-    val paddingHorizontal: String = "0dp",
-) : TextStyle
-
-/** Layer sizing mode for the clockface or layer */
-enum class LayerBounds {
-    /**
-     * Sized so the larger dimension matches the allocated space. This results in some of the
-     * allocated space being unused.
-     */
-    FIT,
-
-    /**
-     * Sized so the smaller dimension matches the allocated space. This will clip some content to
-     * the edges of the space.
-     */
-    FILL,
-
-    /** Fills the allocated space exactly by stretching the layer */
-    STRETCH,
-}
-
-/** Ticking mode for analog hands. */
-enum class AnalogTickMode {
-    SWEEP,
-    TICK,
-}
-
-/** Timspec options for Analog Hands. Named for tick interval. */
-enum class AnalogTimespec {
-    SECONDS,
-    MINUTES,
-    HOURS,
-    HOURS_OF_DAY,
-    DAY_OF_WEEK,
-    DAY_OF_MONTH,
-    DAY_OF_YEAR,
-    WEEK,
-    MONTH,
-    TIMER,
-}
-
-enum class DigitalTimespec {
-    TIME_FULL_FORMAT,
-    DIGIT_PAIR,
-    FIRST_DIGIT,
-    SECOND_DIGIT,
-    DATE_FORMAT,
-}
-
-enum class DigitalFaceLayout {
-    // can only use HH_PAIR, MM_PAIR from DigitalTimespec
-    TWO_PAIRS_VERTICAL,
-    TWO_PAIRS_HORIZONTAL,
-    // can only use HOUR_FIRST_DIGIT, HOUR_SECOND_DIGIT, MINUTE_FIRST_DIGIT, MINUTE_SECOND_DIGIT
-    // from DigitalTimespec, used for tabular layout when the font doesn't support tnum
-    FOUR_DIGITS_ALIGN_CENTER,
-    FOUR_DIGITS_HORIZONTAL,
-}
-
-enum class RenderType {
-    CHANGE_WEIGHT,
-    HOLLOW_TEXT,
-    STROKE_TEXT,
-    OUTER_OUTLINE_TEXT,
-}
-
-enum class InterpolatorEnum(factory: () -> Interpolator) {
-    STANDARD({ Interpolators.STANDARD }),
-    EMPHASIZED({ Interpolators.EMPHASIZED });
-
-    val interpolator: Interpolator by lazy(factory)
-}
-
-fun generateDigitalLayerIdString(layer: DigitalHandLayer): String {
-    return if (
-        layer.timespec == DigitalTimespec.TIME_FULL_FORMAT ||
-            layer.timespec == DigitalTimespec.DATE_FORMAT
-    ) {
-        layer.timespec.toString()
-    } else {
-        if ("h" in layer.dateTimeFormat) {
-            "HOUR" + "_" + layer.timespec.toString()
-        } else {
-            "MINUTE" + "_" + layer.timespec.toString()
-        }
-    }
-}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt
index d0a32dc..9fb60c7 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt
@@ -18,6 +18,7 @@
 
 import android.graphics.Rect
 import androidx.annotation.VisibleForTesting
+import com.android.app.animation.Interpolators
 import com.android.systemui.log.core.Logger
 import com.android.systemui.plugins.clocks.AlarmData
 import com.android.systemui.plugins.clocks.ClockAnimations
@@ -29,14 +30,13 @@
 import com.android.systemui.plugins.clocks.WeatherData
 import com.android.systemui.plugins.clocks.ZenData
 import com.android.systemui.shared.clocks.view.FlexClockView
-import com.android.systemui.shared.clocks.view.SimpleDigitalClockTextView
+import com.android.systemui.shared.clocks.view.HorizontalAlignment
+import com.android.systemui.shared.clocks.view.VerticalAlignment
 import java.util.Locale
 import java.util.TimeZone
 
-class ComposedDigitalLayerController(
-    private val clockCtx: ClockContext,
-    private val layer: ComposedDigitalHandLayer,
-) : SimpleClockLayerController {
+class ComposedDigitalLayerController(private val clockCtx: ClockContext) :
+    SimpleClockLayerController {
     private val logger =
         Logger(clockCtx.messageBuffer, ComposedDigitalLayerController::class.simpleName!!)
 
@@ -46,14 +46,40 @@
     override val view = FlexClockView(clockCtx)
 
     init {
-        layer.digitalLayers.forEach {
-            val childView = SimpleDigitalClockTextView(clockCtx)
-            val controller =
-                SimpleDigitalHandLayerController(clockCtx, it as DigitalHandLayer, childView)
-
-            view.addView(childView)
+        fun createController(cfg: LayerConfig) {
+            val controller = SimpleDigitalHandLayerController(clockCtx, cfg)
+            view.addView(controller.view)
             layerControllers.add(controller)
         }
+
+        val layerCfg =
+            LayerConfig(
+                style = FontTextStyle(lineHeight = 147.25f),
+                aodStyle =
+                    FontTextStyle(
+                        transitionInterpolator = Interpolators.EMPHASIZED,
+                        transitionDuration = 750,
+                    ),
+                alignment =
+                    DigitalAlignment(HorizontalAlignment.CENTER, VerticalAlignment.BASELINE),
+
+                // Placeholders
+                timespec = DigitalTimespec.TIME_FULL_FORMAT,
+                dateTimeFormat = "hh:mm",
+            )
+
+        createController(
+            layerCfg.copy(timespec = DigitalTimespec.FIRST_DIGIT, dateTimeFormat = "hh")
+        )
+        createController(
+            layerCfg.copy(timespec = DigitalTimespec.SECOND_DIGIT, dateTimeFormat = "hh")
+        )
+        createController(
+            layerCfg.copy(timespec = DigitalTimespec.FIRST_DIGIT, dateTimeFormat = "mm")
+        )
+        createController(
+            layerCfg.copy(timespec = DigitalTimespec.SECOND_DIGIT, dateTimeFormat = "mm")
+        )
     }
 
     private fun refreshTime() {
@@ -79,17 +105,11 @@
                 refreshTime()
             }
 
-            override fun onWeatherDataChanged(data: WeatherData) {
-                view.onWeatherDataChanged(data)
-            }
+            override fun onWeatherDataChanged(data: WeatherData) {}
 
-            override fun onAlarmDataChanged(data: AlarmData) {
-                view.onAlarmDataChanged(data)
-            }
+            override fun onAlarmDataChanged(data: AlarmData) {}
 
-            override fun onZenDataChanged(data: ZenData) {
-                view.onZenDataChanged(data)
-            }
+            override fun onZenDataChanged(data: ZenData) {}
 
             override fun onFontAxesChanged(axes: List<ClockFontAxisSetting>) {
                 view.updateAxes(axes)
@@ -123,15 +143,11 @@
                 view.animateCharge()
             }
 
-            override fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {
-                view.onPositionUpdated(fromLeft, direction, fraction)
-            }
+            override fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {}
 
             override fun onPositionUpdated(distance: Float, fraction: Float) {}
 
-            override fun onPickerCarouselSwiping(swipingFraction: Float) {
-                view.onPickerCarouselSwiping(swipingFraction)
-            }
+            override fun onPickerCarouselSwiping(swipingFraction: Float) {}
         }
 
     override val faceEvents =
@@ -163,9 +179,8 @@
 
     override val config =
         ClockFaceConfig(
-            hasCustomWeatherDataDisplay = view.hasCustomWeatherDataDisplay,
-            hasCustomPositionUpdatedAnimation = view.hasCustomPositionUpdatedAnimation,
-            useCustomClockScene = view.useCustomClockScene,
+            hasCustomWeatherDataDisplay = false,
+            hasCustomPositionUpdatedAnimation = true,
         )
 
     @VisibleForTesting
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
index c73e1c3..f6ff3268 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
@@ -27,8 +27,6 @@
 import com.android.systemui.plugins.clocks.ClockPickerConfig
 import com.android.systemui.plugins.clocks.ClockProvider
 import com.android.systemui.plugins.clocks.ClockSettings
-import com.android.systemui.shared.clocks.view.HorizontalAlignment
-import com.android.systemui.shared.clocks.view.VerticalAlignment
 
 private val TAG = DefaultClockProvider::class.simpleName
 const val DEFAULT_CLOCK_ID = "DEFAULT"
@@ -78,8 +76,7 @@
                     typefaceCache,
                     buffers,
                     buffers.infraMessageBuffer,
-                ),
-                FLEX_DESIGN,
+                )
             )
         } else {
             DefaultClockController(ctx, layoutInflater, resources, settings, messageBuffers)
@@ -128,119 +125,5 @@
             // TODO(b/364680873): Move constant to config_clockFontFamily when shipping
             Typeface.create("google-sans-flex-clock", Typeface.NORMAL)
         }
-
-        val FLEX_DESIGN = run {
-            val largeLayer =
-                listOf(
-                    ComposedDigitalHandLayer(
-                        layerBounds = LayerBounds.FIT,
-                        customizedView = "FlexClockView",
-                        digitalLayers =
-                            listOf(
-                                DigitalHandLayer(
-                                    layerBounds = LayerBounds.FIT,
-                                    timespec = DigitalTimespec.FIRST_DIGIT,
-                                    style = FontTextStyle(lineHeight = 147.25f),
-                                    aodStyle =
-                                        FontTextStyle(
-                                            fillColorLight = "#FFFFFFFF",
-                                            outlineColor = "#00000000",
-                                            renderType = RenderType.CHANGE_WEIGHT,
-                                            transitionInterpolator = InterpolatorEnum.EMPHASIZED,
-                                            transitionDuration = 750,
-                                        ),
-                                    alignment =
-                                        DigitalAlignment(
-                                            HorizontalAlignment.CENTER,
-                                            VerticalAlignment.BASELINE,
-                                        ),
-                                    dateTimeFormat = "hh",
-                                ),
-                                DigitalHandLayer(
-                                    layerBounds = LayerBounds.FIT,
-                                    timespec = DigitalTimespec.SECOND_DIGIT,
-                                    style = FontTextStyle(lineHeight = 147.25f),
-                                    aodStyle =
-                                        FontTextStyle(
-                                            fillColorLight = "#FFFFFFFF",
-                                            outlineColor = "#00000000",
-                                            renderType = RenderType.CHANGE_WEIGHT,
-                                            transitionInterpolator = InterpolatorEnum.EMPHASIZED,
-                                            transitionDuration = 750,
-                                        ),
-                                    alignment =
-                                        DigitalAlignment(
-                                            HorizontalAlignment.CENTER,
-                                            VerticalAlignment.BASELINE,
-                                        ),
-                                    dateTimeFormat = "hh",
-                                ),
-                                DigitalHandLayer(
-                                    layerBounds = LayerBounds.FIT,
-                                    timespec = DigitalTimespec.FIRST_DIGIT,
-                                    style = FontTextStyle(lineHeight = 147.25f),
-                                    aodStyle =
-                                        FontTextStyle(
-                                            fillColorLight = "#FFFFFFFF",
-                                            outlineColor = "#00000000",
-                                            renderType = RenderType.CHANGE_WEIGHT,
-                                            transitionInterpolator = InterpolatorEnum.EMPHASIZED,
-                                            transitionDuration = 750,
-                                        ),
-                                    alignment =
-                                        DigitalAlignment(
-                                            HorizontalAlignment.CENTER,
-                                            VerticalAlignment.BASELINE,
-                                        ),
-                                    dateTimeFormat = "mm",
-                                ),
-                                DigitalHandLayer(
-                                    layerBounds = LayerBounds.FIT,
-                                    timespec = DigitalTimespec.SECOND_DIGIT,
-                                    style = FontTextStyle(lineHeight = 147.25f),
-                                    aodStyle =
-                                        FontTextStyle(
-                                            fillColorLight = "#FFFFFFFF",
-                                            outlineColor = "#00000000",
-                                            renderType = RenderType.CHANGE_WEIGHT,
-                                            transitionInterpolator = InterpolatorEnum.EMPHASIZED,
-                                            transitionDuration = 750,
-                                        ),
-                                    alignment =
-                                        DigitalAlignment(
-                                            HorizontalAlignment.CENTER,
-                                            VerticalAlignment.BASELINE,
-                                        ),
-                                    dateTimeFormat = "mm",
-                                ),
-                            ),
-                    )
-                )
-
-            val smallLayer =
-                listOf(
-                    DigitalHandLayer(
-                        layerBounds = LayerBounds.FIT,
-                        timespec = DigitalTimespec.TIME_FULL_FORMAT,
-                        style = FontTextStyle(fontSizeScale = 0.98f),
-                        aodStyle =
-                            FontTextStyle(
-                                fillColorLight = "#FFFFFFFF",
-                                outlineColor = "#00000000",
-                                renderType = RenderType.CHANGE_WEIGHT,
-                            ),
-                        alignment = DigitalAlignment(HorizontalAlignment.LEFT, null),
-                        dateTimeFormat = "h:mm",
-                    )
-                )
-
-            ClockDesign(
-                id = DEFAULT_CLOCK_ID,
-                name = "@string/clock_default_name",
-                description = "@string/clock_default_description",
-                large = ClockFace(layers = largeLayer),
-                small = ClockFace(layers = smallLayer),
-            )
-        }
     }
 }
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
index 7f01fd7..aed3a2d 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
@@ -32,21 +32,16 @@
 import java.util.TimeZone
 
 /** Controller for the default flex clock */
-class FlexClockController(
-    private val clockCtx: ClockContext,
-    val design: ClockDesign, // TODO(b/364680879): Remove when done inlining
-) : ClockController {
+class FlexClockController(private val clockCtx: ClockContext) : ClockController {
     override val smallClock =
         FlexClockFaceController(
             clockCtx.copy(messageBuffer = clockCtx.messageBuffers.smallClockMessageBuffer),
-            design.small ?: design.large!!,
             isLargeClock = false,
         )
 
     override val largeClock =
         FlexClockFaceController(
             clockCtx.copy(messageBuffer = clockCtx.messageBuffers.largeClockMessageBuffer),
-            design.large ?: design.small!!,
             isLargeClock = true,
         )
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
index 4a47f1b..827bd68 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
@@ -35,17 +35,14 @@
 import com.android.systemui.plugins.clocks.WeatherData
 import com.android.systemui.plugins.clocks.ZenData
 import com.android.systemui.shared.clocks.view.FlexClockView
-import com.android.systemui.shared.clocks.view.SimpleDigitalClockTextView
+import com.android.systemui.shared.clocks.view.HorizontalAlignment
 import java.util.Locale
 import java.util.TimeZone
 import kotlin.math.max
 
 // TODO(b/364680879): Merge w/ ComposedDigitalLayerController
-class FlexClockFaceController(
-    clockCtx: ClockContext,
-    face: ClockFace,
-    private val isLargeClock: Boolean,
-) : ClockFaceController {
+class FlexClockFaceController(clockCtx: ClockContext, private val isLargeClock: Boolean) :
+    ClockFaceController {
     override val view: View
         get() = layerController.view
 
@@ -59,19 +56,12 @@
     val timespecHandler = DigitalTimespecHandler(DigitalTimespec.TIME_FULL_FORMAT, "hh:mm")
 
     init {
-        val lp = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)
-        lp.gravity = Gravity.CENTER
-
-        val layer = face.layers[0]
-
         layerController =
-            if (isLargeClock) {
-                ComposedDigitalLayerController(clockCtx, layer as ComposedDigitalHandLayer)
-            } else {
-                val childView = SimpleDigitalClockTextView(clockCtx)
-                SimpleDigitalHandLayerController(clockCtx, layer as DigitalHandLayer, childView)
-            }
-        layerController.view.layoutParams = lp
+            if (isLargeClock) ComposedDigitalLayerController(clockCtx)
+            else SimpleDigitalHandLayerController(clockCtx, SMALL_LAYER_CONFIG)
+
+        layerController.view.layoutParams =
+            FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT).apply { gravity = Gravity.CENTER }
     }
 
     /** See documentation at [FlexClockView.offsetGlyphsForStepClockAnimation]. */
@@ -227,10 +217,6 @@
             }
 
             override fun onPickerCarouselSwiping(swipingFraction: Float) {
-                face.pickerScale?.let {
-                    view.scaleX = swipingFraction * (1 - it.scaleX) + it.scaleX
-                    view.scaleY = swipingFraction * (1 - it.scaleY) + it.scaleY
-                }
                 if (isLargeClock && !(view as FlexClockView).isAlignedWithScreen()) {
                     view.translationY = keyguardLargeClockTopMargin / 2F * swipingFraction
                 }
@@ -248,4 +234,15 @@
                 // TODO(b/378128811) port stepping animation
             }
         }
+
+    companion object {
+        val SMALL_LAYER_CONFIG =
+            LayerConfig(
+                timespec = DigitalTimespec.TIME_FULL_FORMAT,
+                style = FontTextStyle(fontSizeScale = 0.98f),
+                aodStyle = FontTextStyle(),
+                alignment = DigitalAlignment(HorizontalAlignment.LEFT, null),
+                dateTimeFormat = "h:mm",
+            )
+    }
 }
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockRelativeLayout.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockRelativeLayout.kt
deleted file mode 100644
index 6e1b9aa..0000000
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockRelativeLayout.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.shared.clocks
-
-import android.content.Context
-import android.view.View.MeasureSpec.EXACTLY
-import android.widget.RelativeLayout
-import androidx.core.view.children
-import com.android.systemui.shared.clocks.view.SimpleDigitalClockView
-
-class SimpleClockRelativeLayout(context: Context, val faceLayout: DigitalFaceLayout?) :
-    RelativeLayout(context) {
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        // For migrate_clocks_to_blueprint, mode is EXACTLY
-        // when the flag is turned off, we won't execute this codes
-        if (MeasureSpec.getMode(heightMeasureSpec) == EXACTLY) {
-            if (
-                faceLayout == DigitalFaceLayout.TWO_PAIRS_VERTICAL ||
-                    faceLayout == DigitalFaceLayout.FOUR_DIGITS_ALIGN_CENTER
-            ) {
-                val constrainedHeight = MeasureSpec.getSize(heightMeasureSpec) / 2F
-                children.forEach {
-                    // The assumption here is the height of text view is linear to font size
-                    (it as SimpleDigitalClockView).applyTextSize(
-                        constrainedHeight,
-                        constrainedByHeight = true,
-                    )
-                }
-            }
-        }
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
-    }
-}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt
index ebac4b24..82fc3501 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt
@@ -17,8 +17,8 @@
 package com.android.systemui.shared.clocks
 
 import android.graphics.Rect
-import android.view.View
 import android.view.ViewGroup
+import android.view.animation.Interpolator
 import android.widget.RelativeLayout
 import androidx.annotation.VisibleForTesting
 import com.android.systemui.customization.R
@@ -32,22 +32,56 @@
 import com.android.systemui.plugins.clocks.ThemeConfig
 import com.android.systemui.plugins.clocks.WeatherData
 import com.android.systemui.plugins.clocks.ZenData
-import com.android.systemui.shared.clocks.view.SimpleDigitalClockView
+import com.android.systemui.shared.clocks.view.HorizontalAlignment
+import com.android.systemui.shared.clocks.view.SimpleDigitalClockTextView
+import com.android.systemui.shared.clocks.view.VerticalAlignment
 import java.util.Locale
 import java.util.TimeZone
 
 private val TAG = SimpleDigitalHandLayerController::class.simpleName!!
 
-open class SimpleDigitalHandLayerController<T>(
-    private val clockCtx: ClockContext,
-    private val layer: DigitalHandLayer,
-    override val view: T,
-) : SimpleClockLayerController where T : View, T : SimpleDigitalClockView {
-    private val logger = Logger(clockCtx.messageBuffer, TAG)
-    val timespec = DigitalTimespecHandler(layer.timespec, layer.dateTimeFormat)
+// TODO(b/364680879): The remains of ClockDesign. Cut further.
+data class LayerConfig(
+    val style: FontTextStyle,
+    val aodStyle: FontTextStyle,
+    val alignment: DigitalAlignment,
+    val timespec: DigitalTimespec,
+    val dateTimeFormat: String,
+) {
+    fun generateDigitalLayerIdString(): String {
+        return when {
+            timespec == DigitalTimespec.TIME_FULL_FORMAT -> "$timespec"
+            "h" in dateTimeFormat -> "HOUR_$timespec"
+            else -> "MINUTE_$timespec"
+        }
+    }
+}
 
-    @VisibleForTesting
-    fun hasLeadingZero() = layer.dateTimeFormat.startsWith("hh") || timespec.is24Hr
+data class DigitalAlignment(
+    val horizontalAlignment: HorizontalAlignment?,
+    val verticalAlignment: VerticalAlignment?,
+)
+
+data class FontTextStyle(
+    val lineHeight: Float? = null,
+    val fontSizeScale: Float? = null,
+    val transitionDuration: Long = -1L,
+    val transitionInterpolator: Interpolator? = null,
+)
+
+enum class DigitalTimespec {
+    TIME_FULL_FORMAT,
+    FIRST_DIGIT,
+    SECOND_DIGIT,
+}
+
+open class SimpleDigitalHandLayerController(
+    private val clockCtx: ClockContext,
+    private val layerCfg: LayerConfig,
+) : SimpleClockLayerController {
+    override val view = SimpleDigitalClockTextView(clockCtx)
+    private val logger = Logger(clockCtx.messageBuffer, TAG)
+    val timespec = DigitalTimespecHandler(layerCfg.timespec, layerCfg.dateTimeFormat)
 
     @VisibleForTesting
     override var fakeTimeMills: Long?
@@ -65,145 +99,17 @@
                 ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT,
             )
-        if (layer.alignment != null) {
-            layer.alignment.verticalAlignment?.let { view.verticalAlignment = it }
-            layer.alignment.horizontalAlignment?.let { view.horizontalAlignment = it }
-        }
-        view.applyStyles(layer.style, layer.aodStyle)
+        layerCfg.alignment.verticalAlignment?.let { view.verticalAlignment = it }
+        layerCfg.alignment.horizontalAlignment?.let { view.horizontalAlignment = it }
+        view.applyStyles(layerCfg.style, layerCfg.aodStyle)
         view.id =
             clockCtx.resources.getIdentifier(
-                generateDigitalLayerIdString(layer),
+                layerCfg.generateDigitalLayerIdString(),
                 "id",
                 clockCtx.context.getPackageName(),
             )
     }
 
-    fun applyLayout(layout: DigitalFaceLayout?) {
-        when (layout) {
-            DigitalFaceLayout.FOUR_DIGITS_ALIGN_CENTER,
-            DigitalFaceLayout.FOUR_DIGITS_HORIZONTAL -> applyFourDigitsLayout(layout)
-            DigitalFaceLayout.TWO_PAIRS_HORIZONTAL,
-            DigitalFaceLayout.TWO_PAIRS_VERTICAL -> applyTwoPairsLayout(layout)
-            else -> {
-                // one view always use FrameLayout
-                // no need to change here
-            }
-        }
-        applyMargin()
-    }
-
-    private fun applyMargin() {
-        if (view.layoutParams is RelativeLayout.LayoutParams) {
-            val lp = view.layoutParams as RelativeLayout.LayoutParams
-            layer.marginRatio?.let {
-                lp.setMargins(
-                    /* left = */ (it.left * view.measuredWidth).toInt(),
-                    /* top = */ (it.top * view.measuredHeight).toInt(),
-                    /* right = */ (it.right * view.measuredWidth).toInt(),
-                    /* bottom = */ (it.bottom * view.measuredHeight).toInt(),
-                )
-            }
-            view.layoutParams = lp
-        }
-    }
-
-    private fun applyTwoPairsLayout(twoPairsLayout: DigitalFaceLayout) {
-        val lp = view.layoutParams as RelativeLayout.LayoutParams
-        lp.addRule(RelativeLayout.TEXT_ALIGNMENT_CENTER)
-        if (twoPairsLayout == DigitalFaceLayout.TWO_PAIRS_HORIZONTAL) {
-            when (view.id) {
-                R.id.HOUR_DIGIT_PAIR -> {
-                    lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                    lp.addRule(RelativeLayout.ALIGN_PARENT_START)
-                }
-                R.id.MINUTE_DIGIT_PAIR -> {
-                    lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                    lp.addRule(RelativeLayout.END_OF, R.id.HOUR_DIGIT_PAIR)
-                }
-                else -> {
-                    throw Exception("cannot apply two pairs layout to view ${view.id}")
-                }
-            }
-        } else {
-            when (view.id) {
-                R.id.HOUR_DIGIT_PAIR -> {
-                    lp.addRule(RelativeLayout.CENTER_HORIZONTAL)
-                    lp.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-                }
-                R.id.MINUTE_DIGIT_PAIR -> {
-                    lp.addRule(RelativeLayout.CENTER_HORIZONTAL)
-                    lp.addRule(RelativeLayout.BELOW, R.id.HOUR_DIGIT_PAIR)
-                }
-                else -> {
-                    throw Exception("cannot apply two pairs layout to view ${view.id}")
-                }
-            }
-        }
-        view.layoutParams = lp
-    }
-
-    private fun applyFourDigitsLayout(fourDigitsfaceLayout: DigitalFaceLayout) {
-        val lp = view.layoutParams as RelativeLayout.LayoutParams
-        when (fourDigitsfaceLayout) {
-            DigitalFaceLayout.FOUR_DIGITS_ALIGN_CENTER -> {
-                when (view.id) {
-                    R.id.HOUR_FIRST_DIGIT -> {
-                        lp.addRule(RelativeLayout.ALIGN_PARENT_START)
-                        lp.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-                    }
-                    R.id.HOUR_SECOND_DIGIT -> {
-                        lp.addRule(RelativeLayout.END_OF, R.id.HOUR_FIRST_DIGIT)
-                        lp.addRule(RelativeLayout.ALIGN_TOP, R.id.HOUR_FIRST_DIGIT)
-                    }
-                    R.id.MINUTE_FIRST_DIGIT -> {
-                        lp.addRule(RelativeLayout.ALIGN_START, R.id.HOUR_FIRST_DIGIT)
-                        lp.addRule(RelativeLayout.BELOW, R.id.HOUR_FIRST_DIGIT)
-                    }
-                    R.id.MINUTE_SECOND_DIGIT -> {
-                        lp.addRule(RelativeLayout.ALIGN_START, R.id.HOUR_SECOND_DIGIT)
-                        lp.addRule(RelativeLayout.BELOW, R.id.HOUR_SECOND_DIGIT)
-                    }
-                    else -> {
-                        throw Exception("cannot apply four digits layout to view ${view.id}")
-                    }
-                }
-            }
-            DigitalFaceLayout.FOUR_DIGITS_HORIZONTAL -> {
-                when (view.id) {
-                    R.id.HOUR_FIRST_DIGIT -> {
-                        lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                        lp.addRule(RelativeLayout.ALIGN_PARENT_START)
-                    }
-                    R.id.HOUR_SECOND_DIGIT -> {
-                        lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                        lp.addRule(RelativeLayout.END_OF, R.id.HOUR_FIRST_DIGIT)
-                    }
-                    R.id.MINUTE_FIRST_DIGIT -> {
-                        lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                        lp.addRule(RelativeLayout.END_OF, R.id.HOUR_SECOND_DIGIT)
-                    }
-                    R.id.MINUTE_SECOND_DIGIT -> {
-                        lp.addRule(RelativeLayout.CENTER_VERTICAL)
-                        lp.addRule(RelativeLayout.END_OF, R.id.MINUTE_FIRST_DIGIT)
-                    }
-                    else -> {
-                        throw Exception("cannot apply FOUR_DIGITS_HORIZONTAL to view ${view.id}")
-                    }
-                }
-            }
-            else -> {
-                throw IllegalArgumentException(
-                    "applyFourDigitsLayout function should not " +
-                        "have parameters as ${layer.faceLayout}"
-                )
-            }
-        }
-        if (lp == view.layoutParams) {
-            return
-        }
-        view.layoutParams = lp
-    }
-
     fun refreshTime() {
         timespec.updateTime()
         val text = timespec.getDigitString()
@@ -248,7 +154,6 @@
     override val animations =
         object : ClockAnimations {
             override fun enter() {
-                applyLayout(layer.faceLayout)
                 refreshTime()
             }
 
@@ -264,7 +169,6 @@
             }
 
             override fun fold(fraction: Float) {
-                applyLayout(layer.faceLayout)
                 refreshTime()
             }
 
@@ -283,17 +187,13 @@
         object : ClockFaceEvents {
             override fun onTimeTick() {
                 refreshTime()
-                if (
-                    layer.timespec == DigitalTimespec.TIME_FULL_FORMAT ||
-                        layer.timespec == DigitalTimespec.DATE_FORMAT
-                ) {
+                if (layerCfg.timespec == DigitalTimespec.TIME_FULL_FORMAT) {
                     view.contentDescription = timespec.getContentDescription()
                 }
             }
 
             override fun onFontSettingChanged(fontSizePx: Float) {
                 view.applyTextSize(fontSizePx)
-                applyMargin()
             }
 
             override fun onThemeChanged(theme: ThemeConfig) {
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TimespecHandler.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TimespecHandler.kt
index ed6a403..37db783 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TimespecHandler.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/TimespecHandler.kt
@@ -25,9 +25,7 @@
 import java.util.Locale
 import java.util.TimeZone
 
-open class TimespecHandler(
-    val cal: Calendar,
-) {
+open class TimespecHandler(val cal: Calendar) {
     var timeZone: TimeZone
         get() = cal.timeZone
         set(value) {
@@ -82,10 +80,7 @@
     }
 
     private fun updateSimpleDateFormat(locale: Locale): DateFormat {
-        if (
-            locale.language.equals(Locale.ENGLISH.language) ||
-                timespec != DigitalTimespec.DATE_FORMAT
-        ) {
+        if (locale.language.equals(Locale.ENGLISH.language)) {
             // force date format in English, and time format to use format defined in json
             return SimpleDateFormat(timeFormat, timeFormat, ULocale.forLocale(locale))
         } else {
@@ -97,24 +92,18 @@
         return when (timespec) {
             DigitalTimespec.TIME_FULL_FORMAT ->
                 SimpleDateFormat.getInstanceForSkeleton("hh:mm", locale)
-            DigitalTimespec.DATE_FORMAT ->
-                SimpleDateFormat.getInstanceForSkeleton("EEEE MMMM d", locale)
-            else -> {
-                null
-            }
+            else -> null
         }
     }
 
     private fun applyPattern() {
         val timeFormat24Hour = timeFormat.replace("hh", "h").replace("h", "HH")
         val format = if (is24Hr) timeFormat24Hour else timeFormat
-        if (timespec != DigitalTimespec.DATE_FORMAT) {
-            (dateFormat as SimpleDateFormat).applyPattern(format)
-            (contentDescriptionFormat as? SimpleDateFormat)?.applyPattern(
-                if (is24Hr) CONTENT_DESCRIPTION_TIME_FORMAT_24_HOUR
-                else CONTENT_DESCRIPTION_TIME_FORMAT_12_HOUR
-            )
-        }
+        (dateFormat as SimpleDateFormat).applyPattern(format)
+        (contentDescriptionFormat as? SimpleDateFormat)?.applyPattern(
+            if (is24Hr) CONTENT_DESCRIPTION_TIME_FORMAT_24_HOUR
+            else CONTENT_DESCRIPTION_TIME_FORMAT_12_HOUR
+        )
     }
 
     private fun getSingleDigit(): String {
@@ -122,7 +111,7 @@
         val text = dateFormat.format(cal.time).toString()
         return text.substring(
             if (isFirstDigit) 0 else text.length - 1,
-            if (isFirstDigit) text.length - 1 else text.length
+            if (isFirstDigit) text.length - 1 else text.length,
         )
     }
 
@@ -130,27 +119,16 @@
         return when (timespec) {
             DigitalTimespec.FIRST_DIGIT,
             DigitalTimespec.SECOND_DIGIT -> getSingleDigit()
-            DigitalTimespec.DIGIT_PAIR -> {
-                dateFormat.format(cal.time).toString()
-            }
-            DigitalTimespec.TIME_FULL_FORMAT -> {
-                dateFormat.format(cal.time).toString()
-            }
-            DigitalTimespec.DATE_FORMAT -> {
-                dateFormat.format(cal.time).toString().uppercase()
-            }
+            DigitalTimespec.TIME_FULL_FORMAT -> dateFormat.format(cal.time).toString()
         }
     }
 
     fun getContentDescription(): String? {
         return when (timespec) {
-            DigitalTimespec.TIME_FULL_FORMAT,
-            DigitalTimespec.DATE_FORMAT -> {
+            DigitalTimespec.TIME_FULL_FORMAT -> {
                 contentDescriptionFormat?.format(cal.time).toString()
             }
-            else -> {
-                return null
-            }
+            else -> return null
         }
     }
 
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt
deleted file mode 100644
index d4eb767..0000000
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.shared.clocks.view
-
-import android.graphics.Canvas
-import android.graphics.Point
-import android.view.View
-import android.widget.FrameLayout
-import androidx.annotation.VisibleForTesting
-import com.android.systemui.log.core.Logger
-import com.android.systemui.plugins.clocks.AlarmData
-import com.android.systemui.plugins.clocks.ClockFontAxisSetting
-import com.android.systemui.plugins.clocks.WeatherData
-import com.android.systemui.plugins.clocks.ZenData
-import com.android.systemui.shared.clocks.ClockContext
-import com.android.systemui.shared.clocks.LogUtil
-import java.util.Locale
-
-// TODO(b/364680879): Merge w/ only subclass FlexClockView
-abstract class DigitalClockFaceView(clockCtx: ClockContext) : FrameLayout(clockCtx.context) {
-    protected val logger = Logger(clockCtx.messageBuffer, this::class.simpleName!!)
-        get() = field ?: LogUtil.FALLBACK_INIT_LOGGER
-
-    abstract var digitalClockTextViewMap: MutableMap<Int, SimpleDigitalClockTextView>
-
-    @VisibleForTesting
-    var isAnimationEnabled = true
-        set(value) {
-            field = value
-            digitalClockTextViewMap.forEach { _, view -> view.isAnimationEnabled = value }
-        }
-
-    var dozeFraction: Float = 0F
-        set(value) {
-            field = value
-            digitalClockTextViewMap.forEach { _, view -> view.dozeFraction = field }
-        }
-
-    val dozeControlState = DozeControlState()
-
-    var isReactiveTouchInteractionEnabled = false
-        set(value) {
-            field = value
-        }
-
-    open val text: String?
-        get() = null
-
-    open fun refreshTime() = logger.d("refreshTime()")
-
-    override fun invalidate() {
-        logger.d("invalidate()")
-        super.invalidate()
-    }
-
-    override fun requestLayout() {
-        logger.d("requestLayout()")
-        super.requestLayout()
-    }
-
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        logger.d("onMeasure()")
-        calculateSize(widthMeasureSpec, heightMeasureSpec)?.let { setMeasuredDimension(it.x, it.y) }
-            ?: run { super.onMeasure(widthMeasureSpec, heightMeasureSpec) }
-        calculateLeftTopPosition()
-        dozeControlState.animateReady = true
-    }
-
-    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
-        logger.d("onLayout()")
-        super.onLayout(changed, left, top, right, bottom)
-    }
-
-    override fun onDraw(canvas: Canvas) {
-        text?.let { logger.d({ "onDraw($str1)" }) { str1 = it } } ?: run { logger.d("onDraw()") }
-        super.onDraw(canvas)
-    }
-
-    /*
-     * Called in onMeasure to generate width/height overrides to the normal measuring logic. A null
-     * result causes the normal view measuring logic to execute.
-     */
-    protected open fun calculateSize(widthMeasureSpec: Int, heightMeasureSpec: Int): Point? = null
-
-    protected open fun calculateLeftTopPosition() {}
-
-    override fun addView(child: View?) {
-        if (child == null) return
-        logger.d({ "addView($str1 @$int1)" }) {
-            str1 = child::class.simpleName!!
-            int1 = child.id
-        }
-        super.addView(child)
-        if (child is SimpleDigitalClockTextView) {
-            digitalClockTextViewMap[child.id] = child
-        }
-        child.setWillNotDraw(true)
-    }
-
-    open fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
-        digitalClockTextViewMap.forEach { _, view -> view.animateDoze(isDozing, isAnimated) }
-    }
-
-    open fun animateCharge() {
-        digitalClockTextViewMap.forEach { _, view -> view.animateCharge() }
-    }
-
-    open fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {}
-
-    fun updateColor(color: Int) {
-        digitalClockTextViewMap.forEach { _, view -> view.updateColor(color) }
-        invalidate()
-    }
-
-    fun updateAxes(axes: List<ClockFontAxisSetting>) {
-        digitalClockTextViewMap.forEach { _, view -> view.updateAxes(axes) }
-        requestLayout()
-    }
-
-    fun onFontSettingChanged(fontSizePx: Float) {
-        digitalClockTextViewMap.forEach { _, view -> view.applyTextSize(fontSizePx) }
-    }
-
-    open val hasCustomWeatherDataDisplay
-        get() = false
-
-    open val hasCustomPositionUpdatedAnimation
-        get() = false
-
-    /** True if it's large weather clock, will use weatherBlueprint in compose */
-    open val useCustomClockScene
-        get() = false
-
-    open fun onLocaleChanged(locale: Locale) {}
-
-    open fun onWeatherDataChanged(data: WeatherData) {}
-
-    open fun onAlarmDataChanged(data: AlarmData) {}
-
-    open fun onZenDataChanged(data: ZenData) {}
-
-    open fun onPickerCarouselSwiping(swipingFraction: Float) {}
-
-    open fun isAlignedWithScreen(): Boolean = false
-
-    /**
-     * animateDoze needs correct translate value, which is calculated in onMeasure so we need to
-     * delay this animation when we get correct values
-     */
-    class DozeControlState {
-        var animateDoze: () -> Unit = {}
-            set(value) {
-                if (animateReady) {
-                    value()
-                    field = {}
-                } else {
-                    field = value
-                }
-            }
-
-        var animateReady = false
-            set(value) {
-                if (value) {
-                    animateDoze()
-                    animateDoze = {}
-                }
-                field = value
-            }
-    }
-}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt
index faef18c..c40bb9a 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/FlexClockView.kt
@@ -22,11 +22,16 @@
 import android.util.MathUtils.constrainedMap
 import android.view.View
 import android.view.ViewGroup
+import android.widget.FrameLayout
 import android.widget.RelativeLayout
+import androidx.annotation.VisibleForTesting
 import com.android.app.animation.Interpolators
 import com.android.systemui.customization.R
+import com.android.systemui.log.core.Logger
+import com.android.systemui.plugins.clocks.ClockFontAxisSetting
 import com.android.systemui.shared.clocks.ClockContext
 import com.android.systemui.shared.clocks.DigitTranslateAnimator
+import com.android.systemui.shared.clocks.LogUtil
 import java.util.Locale
 import kotlin.math.abs
 import kotlin.math.max
@@ -34,14 +39,38 @@
 
 fun clamp(value: Float, minVal: Float, maxVal: Float): Float = max(min(value, maxVal), minVal)
 
-class FlexClockView(clockCtx: ClockContext) : DigitalClockFaceView(clockCtx) {
-    override var digitalClockTextViewMap = mutableMapOf<Int, SimpleDigitalClockTextView>()
+class FlexClockView(clockCtx: ClockContext) : FrameLayout(clockCtx.context) {
+    protected val logger = Logger(clockCtx.messageBuffer, this::class.simpleName!!)
+        get() = field ?: LogUtil.FALLBACK_INIT_LOGGER
+
+    @VisibleForTesting
+    var isAnimationEnabled = true
+        set(value) {
+            field = value
+            digitalClockTextViewMap.forEach { _, view -> view.isAnimationEnabled = value }
+        }
+
+    var dozeFraction: Float = 0F
+        set(value) {
+            field = value
+            digitalClockTextViewMap.forEach { _, view -> view.dozeFraction = field }
+        }
+
+    var isReactiveTouchInteractionEnabled = false
+        set(value) {
+            field = value
+        }
+
+    var digitalClockTextViewMap = mutableMapOf<Int, SimpleDigitalClockTextView>()
     private val digitLeftTopMap = mutableMapOf<Int, Point>()
 
     private var maxSingleDigitSize = Point(-1, -1)
     private val lockscreenTranslate = Point(0, 0)
     private var aodTranslate = Point(0, 0)
 
+    private var onAnimateDoze: (() -> Unit)? = null
+    private var isDozeReadyToAnimate = false
+
     // Does the current language have mono vertical size when displaying numerals
     private var isMonoVerticalNumericLineSpacing = true
 
@@ -57,13 +86,7 @@
 
     private val digitOffsets = mutableMapOf<Int, Float>()
 
-    override fun addView(child: View?) {
-        super.addView(child)
-        (child as SimpleDigitalClockTextView).digitTranslateAnimator =
-            DigitTranslateAnimator(::invalidate)
-    }
-
-    protected override fun calculateSize(widthMeasureSpec: Int, heightMeasureSpec: Int): Point {
+    protected fun calculateSize(widthMeasureSpec: Int, heightMeasureSpec: Int): Point? {
         maxSingleDigitSize = Point(-1, -1)
         val bottomLocation: (textView: SimpleDigitalClockTextView) -> Int = { textView ->
             if (isMonoVerticalNumericLineSpacing) {
@@ -85,7 +108,7 @@
         )
     }
 
-    protected override fun calculateLeftTopPosition() {
+    protected fun calculateLeftTopPosition() {
         digitLeftTopMap[R.id.HOUR_FIRST_DIGIT] = Point(0, 0)
         digitLeftTopMap[R.id.HOUR_SECOND_DIGIT] = Point(maxSingleDigitSize.x, 0)
         digitLeftTopMap[R.id.MINUTE_FIRST_DIGIT] = Point(0, maxSingleDigitSize.y)
@@ -96,13 +119,57 @@
         }
     }
 
-    override fun refreshTime() {
-        super.refreshTime()
+    override fun addView(child: View?) {
+        if (child == null) return
+        logger.d({ "addView($str1 @$int1)" }) {
+            str1 = child::class.simpleName!!
+            int1 = child.id
+        }
+
+        super.addView(child)
+        (child as? SimpleDigitalClockTextView)?.let {
+            it.digitTranslateAnimator = DigitTranslateAnimator(::invalidate)
+            digitalClockTextViewMap[child.id] = child
+        }
+        child.setWillNotDraw(true)
+    }
+
+    fun refreshTime() {
+        logger.d("refreshTime()")
         digitalClockTextViewMap.forEach { (_, textView) -> textView.refreshText() }
     }
 
+    override fun invalidate() {
+        logger.d("invalidate()")
+        super.invalidate()
+    }
+
+    override fun requestLayout() {
+        logger.d("requestLayout()")
+        super.requestLayout()
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        logger.d("onMeasure()")
+        calculateSize(widthMeasureSpec, heightMeasureSpec)?.let { size ->
+            setMeasuredDimension(size.x, size.y)
+        } ?: run { super.onMeasure(widthMeasureSpec, heightMeasureSpec) }
+        calculateLeftTopPosition()
+
+        isDozeReadyToAnimate = true
+        onAnimateDoze?.invoke()
+        onAnimateDoze = null
+    }
+
+    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+        logger.d("onLayout()")
+        super.onLayout(changed, left, top, right, bottom)
+    }
+
     override fun onDraw(canvas: Canvas) {
+        logger.d("onDraw()")
         super.onDraw(canvas)
+
         digitalClockTextViewMap.forEach { (id, textView) ->
             // save canvas location in anticipation of restoration later
             canvas.save()
@@ -117,14 +184,30 @@
         }
     }
 
-    override fun onLocaleChanged(locale: Locale) {
+    fun isAlignedWithScreen(): Boolean = false
+
+    fun onLocaleChanged(locale: Locale) {
         updateLocale(locale)
         requestLayout()
     }
 
-    override fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
-        dozeControlState.animateDoze = {
-            super.animateDoze(isDozing, isAnimated)
+    fun updateColor(color: Int) {
+        digitalClockTextViewMap.forEach { _, view -> view.updateColor(color) }
+        invalidate()
+    }
+
+    fun updateAxes(axes: List<ClockFontAxisSetting>) {
+        digitalClockTextViewMap.forEach { _, view -> view.updateAxes(axes) }
+        requestLayout()
+    }
+
+    fun onFontSettingChanged(fontSizePx: Float) {
+        digitalClockTextViewMap.forEach { _, view -> view.applyTextSize(fontSizePx) }
+    }
+
+    fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
+        fun executeDozeAnimation() {
+            digitalClockTextViewMap.forEach { _, view -> view.animateDoze(isDozing, isAnimated) }
             if (maxSingleDigitSize.x < 0 || maxSingleDigitSize.y < 0) {
                 measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
             }
@@ -150,10 +233,13 @@
                 }
             }
         }
+
+        if (isDozeReadyToAnimate) executeDozeAnimation()
+        else onAnimateDoze = { executeDozeAnimation() }
     }
 
-    override fun animateCharge() {
-        super.animateCharge()
+    fun animateCharge() {
+        digitalClockTextViewMap.forEach { _, view -> view.animateCharge() }
         digitalClockTextViewMap.forEach { (id, textView) ->
             textView.digitTranslateAnimator?.let {
                 it.animatePosition(
@@ -301,7 +387,7 @@
         // Add language tags below that do not have vertically mono spaced numerals
         private val NON_MONO_VERTICAL_NUMERIC_LINE_SPACING_LANGUAGES =
             setOf(
-                "my", // Burmese
+                "my" // Burmese
             )
 
         // Use the sign of targetTranslation to control the direction of digit translation
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
index cef24e9..0f8ca94 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
@@ -44,19 +44,30 @@
 import com.android.systemui.shared.clocks.DimensionParser
 import com.android.systemui.shared.clocks.FontTextStyle
 import com.android.systemui.shared.clocks.LogUtil
-import com.android.systemui.shared.clocks.RenderType
-import com.android.systemui.shared.clocks.TextStyle
 import java.lang.Thread
 import kotlin.math.max
 import kotlin.math.min
 
 private val TAG = SimpleDigitalClockTextView::class.simpleName!!
 
+enum class VerticalAlignment {
+    TOP,
+    BOTTOM,
+    BASELINE, // default
+    CENTER,
+}
+
+enum class HorizontalAlignment {
+    LEFT,
+    RIGHT,
+    CENTER, // default
+}
+
 @SuppressLint("AppCompatCustomView")
 open class SimpleDigitalClockTextView(clockCtx: ClockContext, attrs: AttributeSet? = null) :
-    TextView(clockCtx.context, attrs), SimpleDigitalClockView {
+    TextView(clockCtx.context, attrs) {
     val lockScreenPaint = TextPaint()
-    override lateinit var textStyle: FontTextStyle
+    lateinit var textStyle: FontTextStyle
     lateinit var aodStyle: FontTextStyle
 
     private var lsFontVariation = ClockFontAxisSetting.toFVar(DEFAULT_LS_VARIATION)
@@ -98,25 +109,20 @@
         TextAnimator(layout, typefaceCache, invalidateCb)
     }
 
-    override var verticalAlignment: VerticalAlignment = VerticalAlignment.BASELINE
-    override var horizontalAlignment: HorizontalAlignment = HorizontalAlignment.LEFT
-    override var isAnimationEnabled = true
-    override var dozeFraction: Float = 0F
+    var verticalAlignment: VerticalAlignment = VerticalAlignment.BASELINE
+    var horizontalAlignment: HorizontalAlignment = HorizontalAlignment.LEFT
+    var isAnimationEnabled = true
+    var dozeFraction: Float = 0F
         set(value) {
             field = value
             invalidate()
         }
 
-    // Have to passthrough to unify View with SimpleDigitalClockView
-    override var text: String
-        get() = super.getText().toString()
-        set(value) = super.setText(value)
-
     var textBorderWidth = 0F
     var baselineFromMeasure = 0
     var lockscreenColor = Color.WHITE
 
-    override fun updateColor(color: Int) {
+    fun updateColor(color: Int) {
         lockscreenColor = color
         lockScreenPaint.color = lockscreenColor
         if (dozeFraction < 1f) {
@@ -125,7 +131,7 @@
         invalidate()
     }
 
-    override fun updateAxes(axes: List<ClockFontAxisSetting>) {
+    fun updateAxes(axes: List<ClockFontAxisSetting>) {
         lsFontVariation = ClockFontAxisSetting.toFVar(axes + OPTICAL_SIZE_AXIS)
         lockScreenPaint.typeface = typefaceCache.getTypefaceForVariant(lsFontVariation)
         typeface = lockScreenPaint.typeface
@@ -226,24 +232,6 @@
             canvas.translate(it.updatedTranslate.x.toFloat(), it.updatedTranslate.y.toFloat())
         }
 
-        if (aodStyle.renderType == RenderType.HOLLOW_TEXT) {
-            canvas.saveLayer(
-                -translation.x.toFloat(),
-                -translation.y.toFloat(),
-                (-translation.x + measuredWidth).toFloat(),
-                (-translation.y + measuredHeight).toFloat(),
-                null,
-            )
-            canvas.saveLayer(
-                -translation.x.toFloat(),
-                -translation.y.toFloat(),
-                (-translation.x + measuredWidth).toFloat(),
-                (-translation.y + measuredHeight).toFloat(),
-                PORTER_DUFF_XFER_MODE_PAINT,
-            )
-            canvas.restore()
-            canvas.restore()
-        }
         textAnimator.draw(canvas)
 
         digitTranslateAnimator?.let {
@@ -258,15 +246,15 @@
     override fun invalidate() {
         logger.d("invalidate()")
         super.invalidate()
-        (parent as? DigitalClockFaceView)?.invalidate()
+        (parent as? FlexClockView)?.invalidate()
     }
 
-    override fun refreshTime() {
+    fun refreshTime() {
         logger.d("refreshTime()")
         refreshText()
     }
 
-    override fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
+    fun animateDoze(isDozing: Boolean, isAnimated: Boolean) {
         if (!this::textAnimator.isInitialized) return
         textAnimator.setTextStyle(
             animate = isAnimated && isAnimationEnabled,
@@ -279,7 +267,7 @@
         updateTextBoundsForTextAnimator()
     }
 
-    override fun animateCharge() {
+    fun animateCharge() {
         if (!this::textAnimator.isInitialized || textAnimator.isRunning()) {
             // Skip charge animation if dozing animation is already playing.
             return
@@ -419,27 +407,15 @@
         return updateXtranslation(localTranslation, interpolatedTextBounds)
     }
 
-    override fun applyStyles(textStyle: TextStyle, aodStyle: TextStyle?) {
-        this.textStyle = textStyle as FontTextStyle
-        val typefaceName = "fonts/" + textStyle.fontFamily
+    fun applyStyles(textStyle: FontTextStyle, aodStyle: FontTextStyle?) {
+        this.textStyle = textStyle
         lockScreenPaint.strokeJoin = Paint.Join.ROUND
         lockScreenPaint.typeface = typefaceCache.getTypefaceForVariant(lsFontVariation)
-        textStyle.fontFeatureSettings?.let {
-            lockScreenPaint.fontFeatureSettings = it
-            fontFeatureSettings = it
-        }
         typeface = lockScreenPaint.typeface
         textStyle.lineHeight?.let { lineHeight = it.toInt() }
-        // borderWidth in textStyle and aodStyle is used to draw,
-        // strokeWidth in lockScreenPaint is used to measure and get enough space for the text
-        textStyle.borderWidth?.let { textBorderWidth = parser.convert(it) }
 
-        if (aodStyle != null && aodStyle is FontTextStyle) {
-            this.aodStyle = aodStyle
-        } else {
-            this.aodStyle = textStyle.copy()
-        }
-        this.aodStyle.transitionInterpolator?.let { aodDozingInterpolator = it.interpolator }
+        this.aodStyle = aodStyle ?: textStyle.copy()
+        this.aodStyle.transitionInterpolator?.let { aodDozingInterpolator = it }
         lockScreenPaint.strokeWidth = textBorderWidth
         measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
         setInterpolatorPaint()
@@ -448,7 +424,7 @@
     }
 
     // When constrainedByHeight is on, targetFontSizePx is the constrained height of textView
-    override fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean) {
+    fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean = false) {
         val adjustedFontSizePx = adjustFontSize(targetFontSizePx, constrainedByHeight)
         val fontSizePx = adjustedFontSizePx * (textStyle.fontSizeScale ?: 1f)
         aodFontSizePx =
@@ -463,7 +439,6 @@
             val lastUnconstrainedHeight = textBounds.height() + lockScreenPaint.strokeWidth * 2
             fontSizeAdjustFactor = lastUnconstrainedHeight / lastUnconstrainedTextSize
         }
-        textStyle.borderWidthScale?.let { textBorderWidth = fontSizePx * it }
 
         lockScreenPaint.strokeWidth = textBorderWidth
         recomputeMaxSingleDigitSizes()
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt
deleted file mode 100644
index e8be28f..0000000
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.shared.clocks.view
-
-import androidx.annotation.VisibleForTesting
-import com.android.systemui.plugins.clocks.ClockFontAxisSetting
-import com.android.systemui.shared.clocks.TextStyle
-
-interface SimpleDigitalClockView {
-    var text: String
-    var verticalAlignment: VerticalAlignment
-    var horizontalAlignment: HorizontalAlignment
-    var dozeFraction: Float
-    val textStyle: TextStyle
-    @VisibleForTesting var isAnimationEnabled: Boolean
-
-    fun applyStyles(textStyle: TextStyle, aodStyle: TextStyle?)
-
-    fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean = false)
-
-    fun updateColor(color: Int)
-
-    fun updateAxes(axes: List<ClockFontAxisSetting>)
-
-    fun refreshTime()
-
-    fun animateCharge()
-
-    fun animateDoze(isDozing: Boolean, isAnimated: Boolean)
-}
-
-enum class VerticalAlignment {
-    TOP,
-    BOTTOM,
-    BASELINE, // default
-    CENTER,
-}
-
-enum class HorizontalAlignment {
-    LEFT,
-    RIGHT,
-    CENTER, // default
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
index 2c1dacd..4d2a6d9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
@@ -232,7 +232,6 @@
     @Test
     fun testOnViewAttached_withAutoPinConfirmationFailedPasswordAttemptsLessThan5() {
         val pinViewController = constructPinViewController(mockKeyguardPinView)
-        `when`(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
         `when`(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
         `when`(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
         `when`(lockPatternUtils.getCurrentFailedPasswordAttempts(anyInt())).thenReturn(3)
@@ -249,7 +248,6 @@
     @Test
     fun testOnViewAttached_withAutoPinConfirmationFailedPasswordAttemptsMoreThan5() {
         val pinViewController = constructPinViewController(mockKeyguardPinView)
-        `when`(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
         `when`(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
         `when`(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
         `when`(lockPatternUtils.getCurrentFailedPasswordAttempts(anyInt())).thenReturn(6)
@@ -275,7 +273,6 @@
     @Test
     fun onUserInput_autoConfirmation_attemptsUnlock() {
         val pinViewController = constructPinViewController(mockKeyguardPinView)
-        whenever(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
         whenever(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
         whenever(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
         whenever(passwordTextView.text).thenReturn("000000")
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/data/repository/TutorialSchedulerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/data/repository/TutorialSchedulerRepositoryTest.kt
index 4630674..b9e8613 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/data/repository/TutorialSchedulerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/data/repository/TutorialSchedulerRepositoryTest.kt
@@ -84,9 +84,11 @@
 
     @Test
     fun notifyKeyboard() = runTestAndClear {
-        underTest.setNotified(KEYBOARD)
+        val now = Instant.now()
+        underTest.setNotifiedTime(KEYBOARD, now)
 
         assertThat(underTest.isNotified(KEYBOARD)).isTrue()
+        assertThat(underTest.getNotifiedTime(KEYBOARD)!!.epochSecond).isEqualTo(now.epochSecond)
         assertThat(underTest.isNotified(TOUCHPAD)).isFalse()
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepositoryTest.kt
index e659ef2..698fac1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepositoryTest.kt
@@ -18,7 +18,9 @@
 
 import android.content.Context
 import android.content.Context.INPUT_SERVICE
+import android.content.Intent
 import android.hardware.input.InputGestureData
+import android.hardware.input.InputManager
 import android.hardware.input.InputManager.CUSTOM_INPUT_GESTURE_RESULT_SUCCESS
 import android.hardware.input.fakeInputManager
 import android.platform.test.annotations.EnableFlags
@@ -27,9 +29,12 @@
 import com.android.hardware.input.Flags.FLAG_ENABLE_CUSTOMIZABLE_INPUT_GESTURES
 import com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.keyboard.shortcut.customInputGesturesRepository
 import com.android.systemui.keyboard.shortcut.data.source.TestShortcuts.allAppsInputGestureData
+import com.android.systemui.keyboard.shortcut.data.source.TestShortcuts.goHomeInputGestureData
+import com.android.systemui.keyboard.shortcut.shortcutHelperTestHelper
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.settings.FakeUserTracker
 import com.android.systemui.settings.userTracker
@@ -48,18 +53,41 @@
 @EnableFlags(FLAG_ENABLE_CUSTOMIZABLE_INPUT_GESTURES, FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
 class CustomInputGesturesRepositoryTest : SysuiTestCase() {
 
-    private val mockUserContext: Context = mock()
+    private val primaryUserContext: Context = mock()
+    private val secondaryUserContext: Context = mock()
+    private var activeUserContext: Context = primaryUserContext
+
     private val kosmos = testKosmos().also {
-        it.userTracker = FakeUserTracker(onCreateCurrentUserContext = { mockUserContext })
+        it.userTracker = FakeUserTracker(onCreateCurrentUserContext = { activeUserContext })
     }
 
     private val inputManager = kosmos.fakeInputManager.inputManager
+    private val broadcastDispatcher = kosmos.broadcastDispatcher
+    private val inputManagerForSecondaryUser: InputManager = mock()
     private val testScope = kosmos.testScope
+    private val testHelper = kosmos.shortcutHelperTestHelper
     private val customInputGesturesRepository = kosmos.customInputGesturesRepository
 
     @Before
-    fun setup(){
-        whenever(mockUserContext.getSystemService(INPUT_SERVICE)).thenReturn(inputManager)
+    fun setup() {
+        activeUserContext = primaryUserContext
+        whenever(primaryUserContext.getSystemService(INPUT_SERVICE)).thenReturn(inputManager)
+        whenever(secondaryUserContext.getSystemService(INPUT_SERVICE))
+            .thenReturn(inputManagerForSecondaryUser)
+    }
+
+    @Test
+    fun customInputGestures_emitsNewUsersInputGesturesWhenUserIsSwitch() {
+        testScope.runTest {
+            setCustomInputGesturesForPrimaryUser(allAppsInputGestureData)
+            setCustomInputGesturesForSecondaryUser(goHomeInputGestureData)
+
+            val inputGestures by collectLastValue(customInputGesturesRepository.customInputGestures)
+            assertThat(inputGestures).containsExactly(allAppsInputGestureData)
+
+            switchToSecondaryUser()
+            assertThat(inputGestures).containsExactly(goHomeInputGestureData)
+        }
     }
 
     @Test
@@ -115,4 +143,24 @@
         }
     }
 
+    private fun setCustomInputGesturesForPrimaryUser(vararg inputGesture: InputGestureData) {
+        whenever(
+            inputManager.getCustomInputGestures(/* filter= */ InputGestureData.Filter.KEY)
+        ).thenReturn(inputGesture.toList())
+    }
+
+    private fun setCustomInputGesturesForSecondaryUser(vararg inputGesture: InputGestureData) {
+        whenever(
+            inputManagerForSecondaryUser.getCustomInputGestures(/* filter= */ InputGestureData.Filter.KEY)
+        ).thenReturn(inputGesture.toList())
+    }
+
+    private fun switchToSecondaryUser() {
+        activeUserContext = secondaryUserContext
+        broadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            context,
+            Intent(Intent.ACTION_USER_SWITCHED)
+        )
+    }
+
 }
\ No newline at end of file
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
index b29a5f4..9e8713b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
@@ -34,6 +34,7 @@
 import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat as assertThatRepository
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.shade.data.repository.FlingInfo
 import com.android.systemui.shade.data.repository.fakeShadeRepository
@@ -47,7 +48,6 @@
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
 import org.mockito.Mockito.spy
-import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat as assertThatRepository
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -55,9 +55,8 @@
 class FromLockscreenTransitionInteractorTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            this.fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository(
-                testScope = testScope,
-            ))
+            this.fakeKeyguardTransitionRepository =
+                spy(FakeKeyguardTransitionRepository(testScope = testScope))
         }
 
     private val testScope = kosmos.testScope
@@ -181,6 +180,12 @@
             underTest.start()
             assertThatRepository(transitionRepository).noTransitionsStarted()
 
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.DOZING,
+                to = KeyguardState.LOCKSCREEN,
+                testScope = testScope,
+            )
+
             keyguardRepository.setKeyguardDismissible(true)
             runCurrent()
             shadeRepository.setCurrentFling(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
index ea2b3cd..605a5d2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityManagerTest.kt
@@ -21,6 +21,7 @@
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.CheckFlagsRule
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import android.view.IRemoteAnimationFinishedCallback
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -38,10 +39,13 @@
 import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mock
 import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.MockitoAnnotations
 import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
@@ -222,4 +226,22 @@
         underTest.setSurfaceBehindVisibility(false)
         verify(keyguardTransitions).startKeyguardTransition(eq(true), any())
     }
+
+    @Test
+    fun remoteAnimationInstantlyFinished_ifDismissTransitionNotStarted() {
+        val mockedCallback = mock<IRemoteAnimationFinishedCallback>()
+        whenever(keyguardDismissTransitionInteractor.startDismissKeyguardTransition(any()))
+            .thenReturn(false)
+
+        underTest.onKeyguardGoingAwayRemoteAnimationStart(
+            transit = 0,
+            apps = emptyArray(),
+            wallpapers = emptyArray(),
+            nonApps = emptyArray(),
+            finishedCallback = mockedCallback,
+        )
+
+        verify(mockedCallback).onAnimationFinished()
+        verifyNoMoreInteractions(mockedCallback)
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt
index a36e0ea..9bae7bd 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt
@@ -1,6 +1,7 @@
 package com.android.systemui.navigationbar
 
 import android.app.ActivityManager
+import android.os.Handler
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -61,6 +62,7 @@
     @Mock lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager
     @Mock lateinit var mStatusBarStateController: StatusBarStateController
     @Mock lateinit var mDisplayTracker: DisplayTracker
+    @Mock lateinit var mHandler: Handler
 
     @Before
     fun setup() {
@@ -69,6 +71,11 @@
         `when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController)
         `when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState)
         `when`(mSysUiState.setFlag(anyLong(), anyBoolean())).thenReturn(mSysUiState)
+        `when`(mHandler.post(any())).thenAnswer {
+            (it.arguments[0] as Runnable).run()
+            true
+        }
+
         mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance()
         mTaskbarDelegate =
             TaskbarDelegate(
@@ -76,6 +83,7 @@
                 mLightBarControllerFactory,
                 mStatusBarKeyguardViewManager,
                 mStatusBarStateController,
+                mHandler,
             )
         mTaskbarDelegate.setDependencies(
             mCommandQueue,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
index b5043ce..fe44c3e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
@@ -39,7 +39,7 @@
 
     @Before
     fun setUp() {
-        underTest = ShadeRepositoryImpl()
+        underTest = ShadeRepositoryImpl(testScope)
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
index 4a3be44..20474c8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
@@ -81,6 +81,7 @@
 import com.android.systemui.flags.DisableSceneContainer;
 import com.android.systemui.flags.EnableSceneContainer;
 import com.android.systemui.flags.FakeFeatureFlagsClassic;
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
 import com.android.systemui.log.LogWtfHandlerRule;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
@@ -90,6 +91,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
+import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedaction;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.concurrency.FakeExecutor;
@@ -115,6 +117,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
 
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
 import platform.test.runner.parameterized.Parameters;
@@ -169,6 +172,10 @@
     @Mock
     private DeviceUnlockedInteractor mDeviceUnlockedInteractor;
     @Mock
+    private Lazy<KeyguardInteractor> mKeyguardInteractorLazy;
+    @Mock
+    private KeyguardInteractor mKeyguardInteractor;
+    @Mock
     private StateFlow<DeviceUnlockStatus> mDeviceUnlockStatusStateFlow;
 
     private UserInfo mCurrentUser;
@@ -181,6 +188,7 @@
     private NotificationEntry mSecondaryUserNotif;
     private NotificationEntry mWorkProfileNotif;
     private NotificationEntry mSensitiveContentNotif;
+    private long mSensitiveNotifPostTime;
     private final FakeFeatureFlagsClassic mFakeFeatureFlags = new FakeFeatureFlagsClassic();
     private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
     private final FakeExecutor mBackgroundExecutor = new FakeExecutor(mFakeSystemClock);
@@ -246,13 +254,17 @@
         mSensitiveContentNotif = new NotificationEntryBuilder()
                 .setNotification(notifWithPrivateVisibility)
                 .setUser(new UserHandle(mCurrentUser.id))
+                .setPostTime(System.currentTimeMillis())
                 .build();
         mSensitiveContentNotif.setRanking(new RankingBuilder(mCurrentUserNotif.getRanking())
                 .setChannel(channel)
                 .setSensitiveContent(true)
                 .setVisibilityOverride(VISIBILITY_NO_OVERRIDE).build());
+        mSensitiveNotifPostTime = mSensitiveContentNotif.getSbn().getPostTime();
         when(mNotifCollection.getEntry(mWorkProfileNotif.getKey())).thenReturn(mWorkProfileNotif);
-
+        when(mKeyguardInteractorLazy.get()).thenReturn(mKeyguardInteractor);
+        when(mKeyguardInteractor.isKeyguardDismissible())
+                .thenReturn(mock(StateFlow.class));
         mLockscreenUserManager = new TestNotificationLockscreenUserManager(mContext);
         mLockscreenUserManager.setUpWithPresenter(mPresenter);
 
@@ -504,11 +516,85 @@
     }
 
     @Test
+    @EnableFlags(LockscreenOtpRedaction.FLAG_NAME)
+    public void testHasSensitiveContent_notRedactedIfNotLocked() {
+        // Allow private notifications for this user
+        mSettings.putIntForUser(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1,
+                mCurrentUser.id);
+        changeSetting(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        // Claim the device was last locked 1 day ago
+        mLockscreenUserManager.mLastLockTime
+                .set(mSensitiveNotifPostTime - TimeUnit.DAYS.toMillis(1));
+        // Device is not currently locked
+        when(mKeyguardManager.isDeviceLocked()).thenReturn(false);
+
+        // Sensitive Content notifications are always redacted
+        assertEquals(REDACTION_TYPE_NONE,
+                mLockscreenUserManager.getRedactionType(mSensitiveContentNotif));
+    }
+
+    @Test
+    @EnableFlags(LockscreenOtpRedaction.FLAG_NAME)
+    public void testHasSensitiveContent_notRedactedIfUnlockedSinceReceipt() {
+        // Allow private notifications for this user
+        mSettings.putIntForUser(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1,
+                mCurrentUser.id);
+        changeSetting(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        when(mKeyguardManager.isDeviceLocked()).thenReturn(true);
+        // Device was locked after this notification arrived
+        mLockscreenUserManager.mLastLockTime
+                .set(mSensitiveNotifPostTime + TimeUnit.DAYS.toMillis(1));
+
+        // Sensitive Content notifications are always redacted
+        assertEquals(REDACTION_TYPE_NONE,
+                mLockscreenUserManager.getRedactionType(mSensitiveContentNotif));
+    }
+
+    @Test
+    @EnableFlags(LockscreenOtpRedaction.FLAG_NAME)
+    public void testHasSensitiveContent_notRedactedIfNotLockedForLongEnough() {
+        // Allow private notifications for this user
+        mSettings.putIntForUser(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1,
+                mCurrentUser.id);
+        changeSetting(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        // Device has been locked for 1 second before the notification came in, which is too short
+        mLockscreenUserManager.mLastLockTime
+                .set(mSensitiveNotifPostTime - TimeUnit.SECONDS.toMillis(1));
+        when(mKeyguardManager.isDeviceLocked()).thenReturn(true);
+
+        // Sensitive Content notifications are always redacted
+        assertEquals(REDACTION_TYPE_NONE,
+                mLockscreenUserManager.getRedactionType(mSensitiveContentNotif));
+    }
+
+    @Test
+    @DisableFlags(LockscreenOtpRedaction.FLAG_NAME)
+    public void testHasSensitiveContent_notRedactedFlagDisabled() {
+        // Allow private notifications for this user
+        mSettings.putIntForUser(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1,
+                mCurrentUser.id);
+        changeSetting(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        // Claim the device was last locked 1 day ago
+        mLockscreenUserManager.mLastLockTime
+                .set(mSensitiveNotifPostTime - TimeUnit.DAYS.toMillis(1));
+        when(mKeyguardManager.isDeviceLocked()).thenReturn(true);
+
+        // Sensitive Content notifications are always redacted
+        assertEquals(REDACTION_TYPE_NONE,
+                mLockscreenUserManager.getRedactionType(mSensitiveContentNotif));
+    }
+
+    @Test
+    @EnableFlags(LockscreenOtpRedaction.FLAG_NAME)
     public void testHasSensitiveContent_redacted() {
         // Allow private notifications for this user
         mSettings.putIntForUser(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1,
                 mCurrentUser.id);
         changeSetting(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+        when(mKeyguardManager.isDeviceLocked()).thenReturn(true);
+        // Claim the device was last unlocked 1 day ago
+        mLockscreenUserManager.mLastLockTime
+                .set(mSensitiveNotifPostTime - TimeUnit.DAYS.toMillis(1));
 
         // Sensitive Content notifications are always redacted
         assertEquals(REDACTION_TYPE_SENSITIVE_CONTENT,
@@ -1066,7 +1152,9 @@
                     mock(DumpManager.class),
                     mock(LockPatternUtils.class),
                     mFakeFeatureFlags,
-                    mDeviceUnlockedInteractorLazy
+                    mDeviceUnlockedInteractorLazy,
+                    mKeyguardInteractorLazy,
+                    null //CoroutineScope
             );
         }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
index a62d9d5..0061c41 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
@@ -132,7 +132,7 @@
             val latest by collectLastValue(underTest.chip)
 
             repo.setOngoingCallState(
-                inCallModel(startTimeMs = 1000, notificationIcon = mock<StatusBarIconView>())
+                inCallModel(startTimeMs = 1000, notificationIcon = createStatusBarIconViewOrNull())
             )
 
             assertThat((latest as OngoingActivityChipModel.Shown).icon)
@@ -147,11 +147,12 @@
 
     @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
     fun chip_positiveStartTime_notifIconFlagOn_iconIsNotifIcon() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
 
-            val notifIcon = mock<StatusBarIconView>()
+            val notifIcon = createStatusBarIconViewOrNull()
             repo.setOngoingCallState(inCallModel(startTimeMs = 1000, notificationIcon = notifIcon))
 
             assertThat((latest as OngoingActivityChipModel.Shown).icon)
@@ -165,6 +166,24 @@
 
     @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun chip_positiveStartTime_notifIconFlagOn_cdFlagOn_iconIsNotifKeyIcon() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.chip)
+
+            repo.setOngoingCallState(
+                inCallModel(
+                    startTimeMs = 1000,
+                    notificationIcon = createStatusBarIconViewOrNull(),
+                    notificationKey = "notifKey",
+                )
+            )
+
+            assertThat((latest as OngoingActivityChipModel.Shown).icon)
+                .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon("notifKey"))
+        }
+
+    @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
     fun chip_positiveStartTime_notifIconAndConnectedDisplaysFlagOn_iconIsNotifIcon() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
@@ -192,7 +211,7 @@
             val latest by collectLastValue(underTest.chip)
 
             repo.setOngoingCallState(
-                inCallModel(startTimeMs = 0, notificationIcon = mock<StatusBarIconView>())
+                inCallModel(startTimeMs = 0, notificationIcon = createStatusBarIconViewOrNull())
             )
 
             assertThat((latest as OngoingActivityChipModel.Shown).icon)
@@ -207,11 +226,12 @@
 
     @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
-    fun chip_zeroStartTime_notifIconFlagOn_iconIsNotifIcon() =
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun chip_zeroStartTime_notifIconFlagOn_cdFlagOff_iconIsNotifIcon() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
 
-            val notifIcon = mock<StatusBarIconView>()
+            val notifIcon = createStatusBarIconViewOrNull()
             repo.setOngoingCallState(inCallModel(startTimeMs = 0, notificationIcon = notifIcon))
 
             assertThat((latest as OngoingActivityChipModel.Shown).icon)
@@ -224,8 +244,27 @@
         }
 
     @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun chip_zeroStartTime_notifIconFlagOn_cdFlagOn_iconIsNotifKeyIcon() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.chip)
+
+            repo.setOngoingCallState(
+                inCallModel(
+                    startTimeMs = 0,
+                    notificationIcon = createStatusBarIconViewOrNull(),
+                    notificationKey = "notifKey",
+                )
+            )
+
+            assertThat((latest as OngoingActivityChipModel.Shown).icon)
+                .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon("notifKey"))
+        }
+
+    @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
-    fun chip_notifIconFlagOn_butNullNotifIcon_iconIsPhone() =
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun chip_notifIconFlagOn_butNullNotifIcon_cdFlagOff_iconIsPhone() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
 
@@ -242,6 +281,24 @@
         }
 
     @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun chip_notifIconFlagOn_butNullNotifIcon_iconNotifKey() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.chip)
+
+            repo.setOngoingCallState(
+                inCallModel(
+                    startTimeMs = 1000,
+                    notificationIcon = null,
+                    notificationKey = "notifKey",
+                )
+            )
+
+            assertThat((latest as OngoingActivityChipModel.Shown).icon)
+                .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon("notifKey"))
+        }
+
+    @Test
     fun chip_positiveStartTime_colorsAreThemed() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
@@ -330,4 +387,13 @@
 
             verify(kosmos.activityStarter).postStartActivityDismissingKeyguard(intent, null)
         }
+
+    companion object {
+        fun createStatusBarIconViewOrNull(): StatusBarIconView? =
+            if (StatusBarConnectedDisplays.isEnabled) {
+                null
+            } else {
+                mock<StatusBarIconView>()
+            }
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
index 0d033a4..fe15eac 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.chips.notification.domain.interactor
 
+import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -148,7 +149,8 @@
         }
 
     @Test
-    fun notificationChip_missingStatusBarIconChipView_inConstructor_emitsNull() =
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChip_missingStatusBarIconChipView_cdFlagDisabled_inConstructor_emitsNull() =
         kosmos.runTest {
             val underTest =
                 factory.create(
@@ -167,6 +169,25 @@
 
     @Test
     @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChip_missingStatusBarIconChipView_cdFlagEnabled_inConstructor_emitsNotNull() =
+        kosmos.runTest {
+            val underTest =
+                factory.create(
+                    activeNotificationModel(
+                        key = "notif1",
+                        statusBarChipIcon = null,
+                        promotedContent = PROMOTED_CONTENT,
+                    ),
+                    32L,
+                )
+
+            val latest by collectLastValue(underTest.notificationChip)
+
+            assertThat(latest).isNotNull()
+        }
+
+    @Test
+    @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
     fun notificationChip_cdEnabled_missingStatusBarIconChipView_inConstructor_emitsNotNull() =
         kosmos.runTest {
             val underTest =
@@ -186,7 +207,8 @@
         }
 
     @Test
-    fun notificationChip_missingStatusBarIconChipView_inSet_emitsNull() =
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChip_cdFlagDisabled_missingStatusBarIconChipView_inSet_emitsNull() =
         kosmos.runTest {
             val startingNotif =
                 activeNotificationModel(
@@ -211,6 +233,31 @@
 
     @Test
     @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChip_cdFlagEnabled_missingStatusBarIconChipView_inSet_emitsNotNull() =
+        kosmos.runTest {
+            val startingNotif =
+                activeNotificationModel(
+                    key = "notif1",
+                    statusBarChipIcon = mock(),
+                    promotedContent = PROMOTED_CONTENT,
+                )
+            val underTest = factory.create(startingNotif, 123L)
+            val latest by collectLastValue(underTest.notificationChip)
+            assertThat(latest).isNotNull()
+
+            underTest.setNotification(
+                activeNotificationModel(
+                    key = "notif1",
+                    statusBarChipIcon = null,
+                    promotedContent = PROMOTED_CONTENT,
+                )
+            )
+
+            assertThat(latest).isNotNull()
+        }
+
+    @Test
+    @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
     fun notificationChip_missingStatusBarIconChipView_inSet_cdEnabled_emitsNotNull() =
         kosmos.runTest {
             val startingNotif =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
index f703d78..ee4a52d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
@@ -30,6 +30,7 @@
 import com.android.systemui.kosmos.useUnconfinedTestDispatcher
 import com.android.systemui.statusbar.StatusBarIconView
 import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
 import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore
 import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
@@ -83,7 +84,8 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_notifMissingStatusBarChipIconView_empty() =
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChips_notifMissingStatusBarChipIconView_cdFlagOff_empty() =
         kosmos.runTest {
             val latest by collectLastValue(underTest.notificationChips)
 
@@ -101,6 +103,25 @@
         }
 
     @Test
+    @EnableFlags(StatusBarNotifChips.FLAG_NAME, StatusBarConnectedDisplays.FLAG_NAME)
+    fun notificationChips_notifMissingStatusBarChipIconView_cdFlagOn_notEmpty() =
+        kosmos.runTest {
+            val latest by collectLastValue(underTest.notificationChips)
+
+            setNotifs(
+                listOf(
+                    activeNotificationModel(
+                        key = "notif",
+                        statusBarChipIcon = null,
+                        promotedContent = PromotedNotificationContentModel.Builder("notif").build(),
+                    )
+                )
+            )
+
+            assertThat(latest).isNotEmpty()
+        }
+
+    @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
     fun notificationChips_onePromotedNotif_statusBarIconViewMatches() =
         kosmos.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
index 17076b4..e561e3e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
@@ -23,7 +23,6 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags.FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.kosmos.collectLastValue
@@ -31,6 +30,7 @@
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.kosmos.useUnconfinedTestDispatcher
 import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.chips.call.ui.viewmodel.CallChipViewModelTest.Companion.createStatusBarIconViewOrNull
 import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor
 import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
 import com.android.systemui.statusbar.chips.ui.model.ColorsModel
@@ -48,7 +48,6 @@
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
 import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.runner.RunWith
 import org.mockito.kotlin.mock
@@ -84,8 +83,8 @@
         }
 
     @Test
-    @DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY)
-    fun chips_notifMissingStatusBarChipIconView_empty() =
+    @DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY, StatusBarConnectedDisplays.FLAG_NAME)
+    fun chips_notifMissingStatusBarChipIconView_cdFlagDisabled_empty() =
         kosmos.runTest {
             val latest by collectLastValue(underTest.chips)
 
@@ -104,11 +103,31 @@
 
     @Test
     @DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY)
+    @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun chips_notifMissingStatusBarChipIconView_cdFlagEnabled_notEmpty() =
+        kosmos.runTest {
+            val latest by collectLastValue(underTest.chips)
+
+            setNotifs(
+                listOf(
+                    activeNotificationModel(
+                        key = "notif",
+                        statusBarChipIcon = null,
+                        promotedContent = PromotedNotificationContentModel.Builder("notif").build(),
+                    )
+                )
+            )
+
+            assertThat(latest).isNotEmpty()
+        }
+
+    @Test
+    @DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY)
     fun chips_onePromotedNotif_statusBarIconViewMatches() =
         kosmos.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            val icon = mock<StatusBarIconView>()
+            val icon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -121,8 +140,7 @@
 
             assertThat(latest).hasSize(1)
             val chip = latest!![0]
-            assertThat(chip).isInstanceOf(OngoingActivityChipModel.Shown::class.java)
-            assertThat(chip.icon).isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarView(icon))
+            assertIsNotifChip(chip, icon, "notif")
         }
 
     @Test
@@ -168,7 +186,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -187,8 +205,8 @@
         kosmos.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            val firstIcon = mock<StatusBarIconView>()
-            val secondIcon = mock<StatusBarIconView>()
+            val firstIcon = createStatusBarIconViewOrNull()
+            val secondIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -203,15 +221,15 @@
                     ),
                     activeNotificationModel(
                         key = "notif3",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = null,
                     ),
                 )
             )
 
             assertThat(latest).hasSize(2)
-            assertIsNotifChip(latest!![0], firstIcon)
-            assertIsNotifChip(latest!![1], secondIcon)
+            assertIsNotifChip(latest!![0], firstIcon, "notif1")
+            assertIsNotifChip(latest!![1], secondIcon, "notif2")
         }
 
     @Test
@@ -269,7 +287,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -293,7 +311,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -323,7 +341,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -353,7 +371,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -382,7 +400,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -411,7 +429,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -439,7 +457,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -467,7 +485,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -499,7 +517,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = promotedContentBuilder.build(),
                     )
                 )
@@ -531,7 +549,7 @@
                 listOf(
                     activeNotificationModel(
                         key = "clickTest",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent =
                             PromotedNotificationContentModel.Builder("clickTest").build(),
                     )
@@ -552,9 +570,21 @@
     }
 
     companion object {
-        fun assertIsNotifChip(latest: OngoingActivityChipModel?, expectedIcon: StatusBarIconView) {
-            assertThat((latest as OngoingActivityChipModel.Shown).icon)
-                .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarView(expectedIcon))
+        fun assertIsNotifChip(
+            latest: OngoingActivityChipModel?,
+            expectedIcon: StatusBarIconView?,
+            notificationKey: String,
+        ) {
+            val shown = latest as OngoingActivityChipModel.Shown
+            if (StatusBarConnectedDisplays.isEnabled) {
+                assertThat(shown.icon)
+                    .isEqualTo(
+                        OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon(notificationKey)
+                    )
+            } else {
+                assertThat(latest.icon)
+                    .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarView(expectedIcon!!))
+            }
         }
 
         fun assertIsNotifKey(latest: OngoingActivityChipModel?, expectedKey: String) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
index 4fb42e9..42358cc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
@@ -41,6 +41,7 @@
 import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.phone.SystemUIDialog
 import com.android.systemui.statusbar.phone.mockSystemUIDialogFactory
 import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository
@@ -169,29 +170,35 @@
     @Test
     fun primaryChip_screenRecordAndShareToAppAndCastToOtherHideAndCallShown_callShown() =
         testScope.runTest {
+            val notificationKey = "call"
             screenRecordState.value = ScreenRecordModel.DoingNothing
             // MediaProjection covers both share-to-app and cast-to-other-device
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = notificationKey)
+            )
 
             val latest by collectLastValue(underTest.primaryChip)
 
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, notificationKey)
         }
 
     @Test
     fun primaryChip_higherPriorityChipAdded_lowerPriorityChipReplaced() =
         testScope.runTest {
             // Start with just the lowest priority chip shown
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            val callNotificationKey = "call"
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
             // And everything else hidden
             mediaProjectionState.value = MediaProjectionState.NotProjecting
             screenRecordState.value = ScreenRecordModel.DoingNothing
 
             val latest by collectLastValue(underTest.primaryChip)
 
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, callNotificationKey)
 
             // WHEN the higher priority media projection chip is added
             mediaProjectionState.value =
@@ -218,7 +225,10 @@
             screenRecordState.value = ScreenRecordModel.Recording
             mediaProjectionState.value =
                 MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            val callNotificationKey = "call"
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             val latest by collectLastValue(underTest.primaryChip)
 
@@ -235,7 +245,7 @@
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
             // THEN the lower priority call is used
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, callNotificationKey)
         }
 
     /** Regression test for b/347726238. */
@@ -364,13 +374,27 @@
             assertThat(icon.res).isEqualTo(R.drawable.ic_present_to_all)
         }
 
-        fun assertIsCallChip(latest: OngoingActivityChipModel?) {
-            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Shown::class.java)
+        fun assertIsCallChip(latest: OngoingActivityChipModel?, notificationKey: String) {
+            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Shown.Timer::class.java)
+            if (StatusBarConnectedDisplays.isEnabled) {
+                assertNotificationIcon(latest, notificationKey)
+                return
+            }
             val icon =
                 (((latest as OngoingActivityChipModel.Shown).icon)
                         as OngoingActivityChipModel.ChipIcon.SingleColorIcon)
                     .impl as Icon.Resource
             assertThat(icon.res).isEqualTo(com.android.internal.R.drawable.ic_phone)
         }
+
+        private fun assertNotificationIcon(
+            latest: OngoingActivityChipModel?,
+            notificationKey: String,
+        ) {
+            val shown = latest as OngoingActivityChipModel.Shown
+            val notificationIcon =
+                shown.icon as OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon
+            assertThat(notificationIcon.notificationKey).isEqualTo(notificationKey)
+        }
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithNotifsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithNotifsViewModelTest.kt
index 0050ebe..0f42f29 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithNotifsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsWithNotifsViewModelTest.kt
@@ -34,7 +34,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.screenrecord.data.model.ScreenRecordModel
 import com.android.systemui.screenrecord.data.repository.screenRecordRepository
-import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.chips.call.ui.viewmodel.CallChipViewModelTest.Companion.createStatusBarIconViewOrNull
 import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.NORMAL_PACKAGE
 import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.setUpPackageManagerForMediaProjection
 import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor
@@ -186,13 +186,16 @@
     @Test
     fun chips_screenRecordShowAndCallShow_primaryIsScreenRecordSecondaryIsCall() =
         testScope.runTest {
+            val callNotificationKey = "call"
             screenRecordState.value = ScreenRecordModel.Recording
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             val latest by collectLastValue(underTest.chips)
 
             assertIsScreenRecordChip(latest!!.primary)
-            assertIsCallChip(latest!!.secondary)
+            assertIsCallChip(latest!!.secondary, callNotificationKey)
         }
 
     @Test
@@ -240,15 +243,18 @@
     @Test
     fun chips_shareToAppShowAndCallShow_primaryIsShareToAppSecondaryIsCall() =
         testScope.runTest {
+            val callNotificationKey = "call"
             screenRecordState.value = ScreenRecordModel.DoingNothing
             mediaProjectionState.value =
                 MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             val latest by collectLastValue(underTest.chips)
 
             assertIsShareToAppChip(latest!!.primary)
-            assertIsCallChip(latest!!.secondary)
+            assertIsCallChip(latest!!.secondary, callNotificationKey)
         }
 
     @Test
@@ -258,25 +264,31 @@
             // MediaProjection covers both share-to-app and cast-to-other-device
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            val callNotificationKey = "call"
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             val latest by collectLastValue(underTest.primaryChip)
 
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, callNotificationKey)
         }
 
     @Test
     fun chips_onlyCallShown_primaryIsCallSecondaryIsHidden() =
         testScope.runTest {
+            val callNotificationKey = "call"
             screenRecordState.value = ScreenRecordModel.DoingNothing
             // MediaProjection covers both share-to-app and cast-to-other-device
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             val latest by collectLastValue(underTest.chips)
 
-            assertIsCallChip(latest!!.primary)
+            assertIsCallChip(latest!!.primary, callNotificationKey)
             assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java)
         }
 
@@ -285,7 +297,7 @@
         testScope.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            val icon = mock<StatusBarIconView>()
+            val icon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -296,7 +308,7 @@
                 )
             )
 
-            assertIsNotifChip(latest!!.primary, icon)
+            assertIsNotifChip(latest!!.primary, icon, "notif")
             assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java)
         }
 
@@ -305,8 +317,8 @@
         testScope.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            val firstIcon = mock<StatusBarIconView>()
-            val secondIcon = mock<StatusBarIconView>()
+            val firstIcon = createStatusBarIconViewOrNull()
+            val secondIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -324,8 +336,8 @@
                 )
             )
 
-            assertIsNotifChip(latest!!.primary, firstIcon)
-            assertIsNotifChip(latest!!.secondary, secondIcon)
+            assertIsNotifChip(latest!!.primary, firstIcon, "firstNotif")
+            assertIsNotifChip(latest!!.secondary, secondIcon, "secondNotif")
         }
 
     @Test
@@ -333,9 +345,9 @@
         testScope.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            val firstIcon = mock<StatusBarIconView>()
-            val secondIcon = mock<StatusBarIconView>()
-            val thirdIcon = mock<StatusBarIconView>()
+            val firstIcon = createStatusBarIconViewOrNull()
+            val secondIcon = createStatusBarIconViewOrNull()
+            val thirdIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -359,8 +371,8 @@
                 )
             )
 
-            assertIsNotifChip(latest!!.primary, firstIcon)
-            assertIsNotifChip(latest!!.secondary, secondIcon)
+            assertIsNotifChip(latest!!.primary, firstIcon, "firstNotif")
+            assertIsNotifChip(latest!!.secondary, secondIcon, "secondNotif")
         }
 
     @Test
@@ -368,8 +380,12 @@
         testScope.runTest {
             val latest by collectLastValue(underTest.chips)
 
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
-            val firstIcon = mock<StatusBarIconView>()
+            val callNotificationKey = "call"
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
+
+            val firstIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -380,43 +396,47 @@
                     ),
                     activeNotificationModel(
                         key = "secondNotif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent =
                             PromotedNotificationContentModel.Builder("secondNotif").build(),
                     ),
                 )
             )
 
-            assertIsCallChip(latest!!.primary)
-            assertIsNotifChip(latest!!.secondary, firstIcon)
+            assertIsCallChip(latest!!.primary, callNotificationKey)
+            assertIsNotifChip(latest!!.secondary, firstIcon, "firstNotif")
         }
 
     @Test
     fun chips_screenRecordAndCallAndPromotedNotifs_notifsNotShown() =
         testScope.runTest {
+            val callNotificationKey = "call"
             val latest by collectLastValue(underTest.chips)
 
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
             screenRecordState.value = ScreenRecordModel.Recording
             setNotifs(
                 listOf(
                     activeNotificationModel(
                         key = "notif",
-                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                         promotedContent = PromotedNotificationContentModel.Builder("notif").build(),
                     )
                 )
             )
 
             assertIsScreenRecordChip(latest!!.primary)
-            assertIsCallChip(latest!!.secondary)
+            assertIsCallChip(latest!!.secondary, callNotificationKey)
         }
 
     @Test
     fun primaryChip_higherPriorityChipAdded_lowerPriorityChipReplaced() =
         testScope.runTest {
+            val callNotificationKey = "call"
             // Start with just the lowest priority chip shown
-            val notifIcon = mock<StatusBarIconView>()
+            val notifIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -433,13 +453,15 @@
 
             val latest by collectLastValue(underTest.primaryChip)
 
-            assertIsNotifChip(latest, notifIcon)
+            assertIsNotifChip(latest, notifIcon, "notif")
 
             // WHEN the higher priority call chip is added
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             // THEN the higher priority call chip is used
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, callNotificationKey)
 
             // WHEN the higher priority media projection chip is added
             mediaProjectionState.value =
@@ -462,12 +484,15 @@
     @Test
     fun primaryChip_highestPriorityChipRemoved_showsNextPriorityChip() =
         testScope.runTest {
+            val callNotificationKey = "call"
             // WHEN all chips are active
             screenRecordState.value = ScreenRecordModel.Recording
             mediaProjectionState.value =
                 MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
-            val notifIcon = mock<StatusBarIconView>()
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
+            val notifIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -493,20 +518,21 @@
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
             // THEN the lower priority call is used
-            assertIsCallChip(latest)
+            assertIsCallChip(latest, callNotificationKey)
 
             // WHEN the higher priority call is removed
             callRepo.setOngoingCallState(OngoingCallModel.NoCall)
 
             // THEN the lower priority notif is used
-            assertIsNotifChip(latest, notifIcon)
+            assertIsNotifChip(latest, notifIcon, "notif")
         }
 
     @Test
     fun chips_movesChipsAroundAccordingToPriority() =
         testScope.runTest {
+            val callNotificationKey = "call"
             // Start with just the lowest priority chip shown
-            val notifIcon = mock<StatusBarIconView>()
+            val notifIcon = createStatusBarIconViewOrNull()
             setNotifs(
                 listOf(
                     activeNotificationModel(
@@ -523,16 +549,18 @@
 
             val latest by collectLastValue(underTest.chips)
 
-            assertIsNotifChip(latest!!.primary, notifIcon)
+            assertIsNotifChip(latest!!.primary, notifIcon, "notif")
             assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java)
 
             // WHEN the higher priority call chip is added
-            callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+            callRepo.setOngoingCallState(
+                inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
+            )
 
             // THEN the higher priority call chip is used as primary and notif is demoted to
             // secondary
-            assertIsCallChip(latest!!.primary)
-            assertIsNotifChip(latest!!.secondary, notifIcon)
+            assertIsCallChip(latest!!.primary, callNotificationKey)
+            assertIsNotifChip(latest!!.secondary, notifIcon, "notif")
 
             // WHEN the higher priority media projection chip is added
             mediaProjectionState.value =
@@ -545,7 +573,7 @@
             // THEN the higher priority media projection chip is used as primary and call is demoted
             // to secondary (and notif is dropped altogether)
             assertIsShareToAppChip(latest!!.primary)
-            assertIsCallChip(latest!!.secondary)
+            assertIsCallChip(latest!!.secondary, callNotificationKey)
 
             // WHEN the higher priority screen record chip is added
             screenRecordState.value = ScreenRecordModel.Recording
@@ -559,13 +587,13 @@
 
             // THEN media projection and notif remain
             assertIsShareToAppChip(latest!!.primary)
-            assertIsNotifChip(latest!!.secondary, notifIcon)
+            assertIsNotifChip(latest!!.secondary, notifIcon, "notif")
 
             // WHEN media projection is dropped
             mediaProjectionState.value = MediaProjectionState.NotProjecting
 
             // THEN notif is promoted to primary
-            assertIsNotifChip(latest!!.primary, notifIcon)
+            assertIsNotifChip(latest!!.primary, notifIcon, "notif")
             assertThat(latest!!.secondary).isInstanceOf(OngoingActivityChipModel.Hidden::class.java)
         }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt
index feda0c6..ab475c5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/StatusBarModeRepositoryImplTest.kt
@@ -32,10 +32,10 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.data.model.StatusBarMode
-import com.android.systemui.statusbar.phone.BoundsPair
-import com.android.systemui.statusbar.phone.LetterboxAppearance
-import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
-import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
+import com.android.systemui.statusbar.layout.BoundsPair
+import com.android.systemui.statusbar.layout.LetterboxAppearance
+import com.android.systemui.statusbar.layout.LetterboxAppearanceCalculator
+import com.android.systemui.statusbar.layout.StatusBarBoundsProvider
 import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent
 import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository
 import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
index 4795a12..db51a58 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
@@ -33,7 +33,7 @@
 import com.android.systemui.statusbar.events.PrivacyDotCorner.BottomRight
 import com.android.systemui.statusbar.events.PrivacyDotCorner.TopLeft
 import com.android.systemui.statusbar.events.PrivacyDotCorner.TopRight
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.policy.FakeConfigurationController
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt
index 5f3668a..0a96013 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt
@@ -27,8 +27,8 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.animation.AnimatorTestRule
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsChangedListener
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.window.StatusBarWindowController
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.argumentCaptor
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculatorTest.kt
similarity index 82%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculatorTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculatorTest.kt
index 518b327..f1affbc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculatorTest.kt
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.graphics.Color
 import android.graphics.Rect
-import android.view.WindowInsetsController
+import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
 import android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -42,7 +42,7 @@
 
     companion object {
         private const val DEFAULT_APPEARANCE = 0
-        private const val TEST_APPEARANCE = WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
+        private const val TEST_APPEARANCE = APPEARANCE_LIGHT_STATUS_BARS
         private val TEST_APPEARANCE_REGION_BOUNDS = Rect(0, 0, 20, 100)
         private val TEST_APPEARANCE_REGION =
             AppearanceRegion(TEST_APPEARANCE, TEST_APPEARANCE_REGION_BOUNDS)
@@ -74,7 +74,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         expect
             .that(letterboxAppearance.appearance)
@@ -90,7 +94,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         expect
             .that(letterboxAppearance.appearance)
@@ -109,10 +117,10 @@
         val letterBoxInnerBoundsCopy = Rect(letterBoxInnerBounds)
 
         calculator.getLetterboxAppearance(
-                TEST_APPEARANCE,
-                TEST_APPEARANCE_REGIONS,
+            TEST_APPEARANCE,
+            TEST_APPEARANCE_REGIONS,
             listOf(letterboxWithInnerBounds(letterBoxInnerBounds)),
-            BoundsPair(statusBarStartSideBounds, statusBarEndSideBounds)
+            BoundsPair(statusBarStartSideBounds, statusBarEndSideBounds),
         )
 
         expect.that(statusBarStartSideBounds).isEqualTo(statusBarStartSideBoundsCopy)
@@ -129,11 +137,15 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         expect
-                .that(letterboxAppearance.appearance)
-                .isEqualTo(TEST_APPEARANCE or APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS)
+            .that(letterboxAppearance.appearance)
+            .isEqualTo(TEST_APPEARANCE or APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS)
         expect.that(letterboxAppearance.appearanceRegions).isEqualTo(TEST_APPEARANCE_REGIONS)
     }
 
@@ -145,7 +157,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
     }
@@ -158,7 +174,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
     }
@@ -171,7 +191,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
     }
@@ -184,7 +208,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, TEST_APPEARANCE_REGIONS, listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                TEST_APPEARANCE_REGIONS,
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         assertThat(letterboxAppearance.appearance).isEqualTo(TEST_APPEARANCE)
     }
@@ -198,7 +226,11 @@
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, listOf(letterboxRegion), listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                listOf(letterboxRegion),
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         val letterboxAdaptedRegion = letterboxRegion.copy(bounds = letterbox.letterboxInnerBounds)
         assertThat(letterboxAppearance.appearanceRegions.toList()).contains(letterboxAdaptedRegion)
@@ -212,12 +244,17 @@
         val letterbox =
             letterboxWithBounds(
                 innerBounds = Rect(left = 25, top = 0, right = 75, bottom = 100),
-                fullBounds = Rect(left = 0, top = 0, right = 100, bottom = 100))
+                fullBounds = Rect(left = 0, top = 0, right = 100, bottom = 100),
+            )
         val letterboxRegion = TEST_APPEARANCE_REGION.copy(bounds = letterbox.letterboxFullBounds)
 
         val letterboxAppearance =
             calculator.getLetterboxAppearance(
-                TEST_APPEARANCE, listOf(letterboxRegion), listOf(letterbox), BoundsPair(start, end))
+                TEST_APPEARANCE,
+                listOf(letterboxRegion),
+                listOf(letterbox),
+                BoundsPair(start, end),
+            )
 
         val outerRegions =
             listOf(
@@ -230,8 +267,7 @@
                     Rect(left = 75, top = 0, right = 100, bottom = 100),
                 ),
             )
-        assertThat(letterboxAppearance.appearanceRegions)
-            .containsAtLeastElementsIn(outerRegions)
+        assertThat(letterboxAppearance.appearanceRegions).containsAtLeastElementsIn(outerRegions)
     }
 
     private fun letterboxWithBounds(innerBounds: Rect, fullBounds: Rect) =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarBoundsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarBoundsProviderTest.kt
similarity index 95%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarBoundsProviderTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarBoundsProviderTest.kt
index b9cfe21..04319f05 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarBoundsProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarBoundsProviderTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.graphics.Rect
 import android.testing.TestableLooper.RunWithLooper
@@ -23,7 +23,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.statusbar.phone.StatusBarBoundsProvider.BoundsChangeListener
 import com.android.systemui.util.mockito.any
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
@@ -47,7 +46,7 @@
         private val END_SIDE_BOUNDS = Rect(250, 300, 350, 400)
     }
 
-    @Mock private lateinit var boundsChangeListener: BoundsChangeListener
+    @Mock private lateinit var boundsChangeListener: StatusBarBoundsProvider.BoundsChangeListener
 
     private lateinit var boundsProvider: StatusBarBoundsProvider
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderTest.kt
similarity index 99%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderTest.kt
index 7a51b2d..c9c9617 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.content.Context
 import android.content.res.Configuration
@@ -32,6 +32,7 @@
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.statusbar.commandline.CommandRegistry
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
+import com.android.systemui.statusbar.phone.ConfigurationControllerImpl
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.util.leak.RotationUtils
 import com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
index 92318b9..ffd349d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
@@ -53,6 +53,7 @@
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler
+import com.android.systemui.statusbar.layout.statusBarContentInsetsProvider
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController
 import com.android.systemui.statusbar.phone.ui.TintedIconManager
 import com.android.systemui.statusbar.policy.BatteryController
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt
index 788c2cb2..7786689 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt
@@ -25,6 +25,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.layout.LetterboxBackgroundProvider
 import com.android.systemui.util.concurrency.FakeExecutor
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.time.FakeSystemClock
@@ -134,6 +135,7 @@
     fun isLetterboxBackgroundMultiColored_defaultValue_returnsFalse() {
         assertThat(provider.isLetterboxBackgroundMultiColored).isEqualTo(false)
     }
+
     @Test
     fun isLetterboxBackgroundMultiColored_afterOnStart_executorNotDone_returnsDefaultValue() {
         whenever(windowManager.isLetterboxBackgroundMultiColored).thenReturn(true)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
index 9099334..a65ccad 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
@@ -51,6 +51,7 @@
 import com.android.systemui.statusbar.data.model.StatusBarAppearance;
 import com.android.systemui.statusbar.data.model.StatusBarMode;
 import com.android.systemui.statusbar.data.repository.FakeStatusBarModePerDisplayRepository;
+import com.android.systemui.statusbar.layout.BoundsPair;
 import com.android.systemui.statusbar.policy.BatteryController;
 
 import kotlinx.coroutines.test.TestScope;
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index d174484..2e12336 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -40,7 +40,6 @@
 
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.testing.TestableLooper;
@@ -610,7 +609,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_ANIMATE_BOUNCER)
     public void testPredictiveBackCallback_registration() {
         /* verify that a predictive back callback is registered when the bouncer becomes visible */
         mBouncerExpansionCallback.onVisibilityChanged(true);
@@ -625,7 +623,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_ANIMATE_BOUNCER)
     public void testPredictiveBackCallback_invocationHidesBouncer() {
         mBouncerExpansionCallback.onVisibilityChanged(true);
         /* capture the predictive back callback during registration */
@@ -643,7 +640,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_ANIMATE_BOUNCER)
     public void testPredictiveBackCallback_noBackAnimationForFullScreenBouncer() {
         when(mKeyguardSecurityModel.getSecurityMode(anyInt()))
                 .thenReturn(KeyguardSecurityModel.SecurityMode.SimPin);
@@ -663,7 +659,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_ANIMATE_BOUNCER)
     public void testPredictiveBackCallback_forwardsBackDispatches() {
         mBouncerExpansionCallback.onVisibilityChanged(true);
         /* capture the predictive back callback during registration */
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
index 0652a83..650fa7c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
@@ -31,7 +31,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Configuration;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.platform.test.ravenwood.RavenwoodRule;
@@ -41,7 +40,6 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.Dependency;
-import com.android.systemui.Flags;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.animation.DialogTransitionAnimator;
 import com.android.systemui.animation.back.BackAnimationSpec;
@@ -137,7 +135,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_PREDICTIVE_BACK_ANIMATE_DIALOGS)
     public void usePredictiveBackAnimFlag() {
         final SystemUIDialog dialog = new SystemUIDialog(mContext);
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
index 3d6882c..c6bae19 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
@@ -18,9 +18,8 @@
 
 import android.app.AutomaticZenRule
 import android.app.Flags
-import android.app.NotificationManager.INTERRUPTION_FILTER_NONE
-import android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY
 import android.app.NotificationManager.Policy
+import android.media.AudioManager
 import android.platform.test.annotations.EnableFlags
 import android.provider.Settings
 import android.provider.Settings.Secure.ZEN_DURATION
@@ -34,6 +33,7 @@
 import com.android.internal.R
 import com.android.settingslib.notification.data.repository.updateNotificationPolicy
 import com.android.settingslib.notification.modes.TestModeBuilder
+import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.kosmos.testScope
@@ -402,47 +402,12 @@
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI)
-    fun activeModesBlockingEverything_hasModesWithFilterNone() =
-        testScope.runTest {
-            val blockingEverything by collectLastValue(underTest.activeModesBlockingEverything)
-
-            zenModeRepository.addModes(
-                listOf(
-                    TestModeBuilder()
-                        .setName("Filter=None, Not active")
-                        .setInterruptionFilter(INTERRUPTION_FILTER_NONE)
-                        .setActive(false)
-                        .build(),
-                    TestModeBuilder()
-                        .setName("Filter=Priority, Active")
-                        .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
-                        .setActive(true)
-                        .build(),
-                    TestModeBuilder()
-                        .setName("Filter=None, Active")
-                        .setInterruptionFilter(INTERRUPTION_FILTER_NONE)
-                        .setActive(true)
-                        .build(),
-                    TestModeBuilder()
-                        .setName("Filter=None, Active Too")
-                        .setInterruptionFilter(INTERRUPTION_FILTER_NONE)
-                        .setActive(true)
-                        .build(),
-                )
-            )
-            runCurrent()
-
-            assertThat(blockingEverything!!.mainMode!!.name).isEqualTo("Filter=None, Active")
-            assertThat(blockingEverything!!.modeNames)
-                .containsExactly("Filter=None, Active", "Filter=None, Active Too")
-                .inOrder()
-        }
-
-    @Test
-    @EnableFlags(Flags.FLAG_MODES_UI)
     fun activeModesBlockingMedia_hasModesWithPolicyBlockingMedia() =
         testScope.runTest {
-            val blockingMedia by collectLastValue(underTest.activeModesBlockingMedia)
+            val blockingMedia by
+                collectLastValue(
+                    underTest.activeModesBlockingStream(AudioStream(AudioManager.STREAM_MUSIC))
+                )
 
             zenModeRepository.addModes(
                 listOf(
@@ -480,7 +445,10 @@
     @EnableFlags(Flags.FLAG_MODES_UI)
     fun activeModesBlockingAlarms_hasModesWithPolicyBlockingAlarms() =
         testScope.runTest {
-            val blockingAlarms by collectLastValue(underTest.activeModesBlockingAlarms)
+            val blockingAlarms by
+                collectLastValue(
+                    underTest.activeModesBlockingStream(AudioStream(AudioManager.STREAM_ALARM))
+                )
 
             zenModeRepository.addModes(
                 listOf(
@@ -515,6 +483,47 @@
         }
 
     @Test
+    @EnableFlags(Flags.FLAG_MODES_UI)
+    fun activeModesBlockingAlarms_hasModesWithPolicyBlockingSystem() =
+        testScope.runTest {
+            val blockingSystem by
+                collectLastValue(
+                    underTest.activeModesBlockingStream(AudioStream(AudioManager.STREAM_SYSTEM))
+                )
+
+            zenModeRepository.addModes(
+                listOf(
+                    TestModeBuilder()
+                        .setName("Blocks system, Not active")
+                        .setZenPolicy(ZenPolicy.Builder().allowSystem(false).build())
+                        .setActive(false)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Allows system, Active")
+                        .setZenPolicy(ZenPolicy.Builder().allowSystem(true).build())
+                        .setActive(true)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Blocks system, Active")
+                        .setZenPolicy(ZenPolicy.Builder().allowSystem(false).build())
+                        .setActive(true)
+                        .build(),
+                    TestModeBuilder()
+                        .setName("Blocks system, Active Too")
+                        .setZenPolicy(ZenPolicy.Builder().allowSystem(false).build())
+                        .setActive(true)
+                        .build(),
+                )
+            )
+            runCurrent()
+
+            assertThat(blockingSystem!!.mainMode!!.name).isEqualTo("Blocks system, Active")
+            assertThat(blockingSystem!!.modeNames)
+                .containsExactly("Blocks system, Active", "Blocks system, Active Too")
+                .inOrder()
+        }
+
+    @Test
     @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
     fun modesHidingNotifications_onlyIncludesModesWithNotifListSuppression() =
         testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt
index 79c1f9f..4aec88e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModelTest.kt
@@ -16,12 +16,13 @@
 
 package com.android.systemui.touchpad.tutorial.ui.viewmodel
 
+import android.content.res.mockResources
 import android.view.MotionEvent
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
-import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.runTest
@@ -34,18 +35,27 @@
 import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState.InProgress
 import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
 import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
+import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.kotlin.whenever
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class BackGestureScreenViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
+    private val resources = kosmos.mockResources
     private val fakeConfigRepository = kosmos.fakeConfigurationRepository
-    private val viewModel = BackGestureScreenViewModel(kosmos.configurationInteractor)
+    private val viewModel =
+        BackGestureScreenViewModel(
+            GestureRecognizerAdapter(
+                BackGestureRecognizerProvider(kosmos.touchpadGestureResources),
+                kosmos.inputDeviceTutorialLogger,
+            )
+        )
 
     @Before
     fun before() {
@@ -115,10 +125,12 @@
         }
 
     private fun setThresholdResource(threshold: Float) {
-        fakeConfigRepository.setDimensionPixelSize(
-            R.dimen.touchpad_tutorial_gestures_distance_threshold,
-            (threshold).toInt(),
-        )
+        whenever(
+                resources.getDimensionPixelSize(
+                    R.dimen.touchpad_tutorial_gestures_distance_threshold
+                )
+            )
+            .thenReturn(threshold.toInt())
         fakeConfigRepository.onAnyConfigurationChange()
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt
index 4af3742..8bd796b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModelTest.kt
@@ -20,6 +20,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.runTest
@@ -36,7 +37,13 @@
 class EasterEggGestureViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
-    private val viewModel = EasterEggGestureViewModel()
+    private val viewModel =
+        EasterEggGestureViewModel(
+            GestureRecognizerAdapter(
+                EasterEggRecognizerProvider(),
+                kosmos.inputDeviceTutorialLogger,
+            )
+        )
 
     @Before
     fun before() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt
index 4dfd01a..65a995d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModelTest.kt
@@ -22,7 +22,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
-import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.runTest
@@ -37,6 +37,7 @@
 import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
 import com.android.systemui.touchpad.tutorial.ui.gesture.Velocity
 import com.android.systemui.touchpad.ui.gesture.fakeVelocityTracker
+import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -59,7 +60,12 @@
     private val resources = kosmos.mockResources
 
     private val viewModel =
-        HomeGestureScreenViewModel(kosmos.configurationInteractor, resources, fakeVelocityTracker)
+        HomeGestureScreenViewModel(
+            GestureRecognizerAdapter(
+                HomeGestureRecognizerProvider(kosmos.touchpadGestureResources, fakeVelocityTracker),
+                kosmos.inputDeviceTutorialLogger,
+            )
+        )
 
     @Before
     fun before() {
@@ -126,10 +132,12 @@
         }
 
     private fun setDistanceThreshold(threshold: Float) {
-        fakeConfigRepository.setDimensionPixelSize(
-            R.dimen.touchpad_tutorial_gestures_distance_threshold,
-            (threshold).toInt(),
-        )
+        whenever(
+                resources.getDimensionPixelSize(
+                    R.dimen.touchpad_tutorial_gestures_distance_threshold
+                )
+            )
+            .thenReturn(threshold.toInt())
         fakeConfigRepository.onAnyConfigurationChange()
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt
index 66bf778..1bc60b6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModelTest.kt
@@ -22,7 +22,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
-import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.runTest
@@ -37,6 +37,7 @@
 import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
 import com.android.systemui.touchpad.tutorial.ui.gesture.Velocity
 import com.android.systemui.touchpad.ui.gesture.fakeVelocityTracker
+import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -60,9 +61,13 @@
 
     private val viewModel =
         RecentAppsGestureScreenViewModel(
-            kosmos.configurationInteractor,
-            resources,
-            fakeVelocityTracker,
+            GestureRecognizerAdapter(
+                RecentAppsGestureRecognizerProvider(
+                    kosmos.touchpadGestureResources,
+                    fakeVelocityTracker,
+                ),
+                kosmos.inputDeviceTutorialLogger,
+            )
         )
 
     @Before
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModelTest.kt
index d3071f8..51cac69 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModelTest.kt
@@ -23,66 +23,40 @@
 import android.service.notification.ZenPolicy
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import com.android.internal.logging.uiEventLogger
 import com.android.settingslib.notification.modes.TestModeBuilder
 import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.haptics.slider.sliderHapticsViewModelFactory
-import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.statusbar.policy.data.repository.fakeZenModeRepository
-import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor
 import com.android.systemui.testKosmos
-import com.android.systemui.volume.domain.interactor.audioVolumeInteractor
-import com.android.systemui.volume.shared.volumePanelLogger
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class AudioStreamSliderViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
     private val zenModeRepository = kosmos.fakeZenModeRepository
 
-    private lateinit var mediaStream: AudioStreamSliderViewModel
-    private lateinit var alarmsStream: AudioStreamSliderViewModel
-    private lateinit var notificationStream: AudioStreamSliderViewModel
-    private lateinit var otherStream: AudioStreamSliderViewModel
-
-    @Before
-    fun setUp() {
-        mediaStream = audioStreamSliderViewModel(AudioManager.STREAM_MUSIC)
-        alarmsStream = audioStreamSliderViewModel(AudioManager.STREAM_ALARM)
-        notificationStream = audioStreamSliderViewModel(AudioManager.STREAM_NOTIFICATION)
-        otherStream = audioStreamSliderViewModel(AudioManager.STREAM_VOICE_CALL)
-    }
-
-    private fun audioStreamSliderViewModel(stream: Int): AudioStreamSliderViewModel {
-        return AudioStreamSliderViewModel(
+    private fun Kosmos.audioStreamSliderViewModel(stream: Int): AudioStreamSliderViewModel {
+        return audioStreamSliderViewModelFactory.create(
             AudioStreamSliderViewModel.FactoryAudioStreamWrapper(AudioStream(stream)),
-            testScope.backgroundScope,
-            context,
-            kosmos.audioVolumeInteractor,
-            kosmos.zenModeInteractor,
-            kosmos.uiEventLogger,
-            kosmos.volumePanelLogger,
-            kosmos.sliderHapticsViewModelFactory,
+            applicationCoroutineScope,
         )
     }
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_UI_ICONS)
     fun slider_media_hasDisabledByModesText() =
-        testScope.runTest {
-            val mediaSlider by collectLastValue(mediaStream.slider)
+        kosmos.runTest {
+            val mediaSlider by
+                collectLastValue(audioStreamSliderViewModel(AudioManager.STREAM_MUSIC).slider)
 
             zenModeRepository.addMode(
                 TestModeBuilder()
@@ -112,8 +86,9 @@
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_UI_ICONS)
     fun slider_alarms_hasDisabledByModesText() =
-        testScope.runTest {
-            val alarmsSlider by collectLastValue(alarmsStream.slider)
+        kosmos.runTest {
+            val alarmsSlider by
+                collectLastValue(audioStreamSliderViewModel(AudioManager.STREAM_ALARM).slider)
 
             zenModeRepository.addMode(
                 TestModeBuilder()
@@ -141,9 +116,10 @@
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_UI_ICONS)
-    fun slider_other_hasDisabledByModesText() =
-        testScope.runTest {
-            val otherSlider by collectLastValue(otherStream.slider)
+    fun slider_other_hasDisabledText() =
+        kosmos.runTest {
+            val otherSlider by
+                collectLastValue(audioStreamSliderViewModel(AudioManager.STREAM_VOICE_CALL).slider)
 
             zenModeRepository.addMode(
                 TestModeBuilder()
@@ -154,20 +130,17 @@
             )
             runCurrent()
 
-            assertThat(otherSlider!!.disabledMessage)
-                .isEqualTo("Unavailable because Everything blocked is on")
-
-            zenModeRepository.clearModes()
-            runCurrent()
-
             assertThat(otherSlider!!.disabledMessage).isEqualTo("Unavailable")
         }
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_UI_ICONS)
     fun slider_notification_hasSpecialDisabledText() =
-        testScope.runTest {
-            val notificationSlider by collectLastValue(notificationStream.slider)
+        kosmos.runTest {
+            val notificationSlider by
+                collectLastValue(
+                    audioStreamSliderViewModel(AudioManager.STREAM_NOTIFICATION).slider
+                )
             runCurrent()
 
             assertThat(notificationSlider!!.disabledMessage)
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index cd37c22..a01ff3d 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -3798,7 +3798,7 @@
     <!-- Title at the top of the keyboard shortcut helper UI when in customize mode. The helper
          is a component that shows the user which keyboard shortcuts they can use.
          [CHAR LIMIT=NONE] -->
-    <string name="shortcut_helper_customize_mode_title">Customize keyboard shortcuts</string>
+    <string name="shortcut_helper_customize_mode_title">Customize shortcuts</string>
     <!-- Title at the top of the keyboard shortcut helper remove shortcut dialog.
          The helper is a component that shows the user which keyboard shortcuts they can use. Also
          allows the user to add/remove custom shortcuts.[CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
index 7d220b5..6e23a07 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
@@ -21,11 +21,9 @@
 import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.window.PictureInPictureSurfaceTransaction;
-import android.window.TaskSnapshot;
 import android.window.WindowAnimationState;
 
 import com.android.internal.os.IResultReceiver;
-import com.android.systemui.shared.recents.model.ThumbnailData;
 import com.android.wm.shell.recents.IRecentsAnimationController;
 
 public class RecentsAnimationControllerCompat {
@@ -40,18 +38,6 @@
         mAnimationController = animationController;
     }
 
-    public ThumbnailData screenshotTask(int taskId) {
-        try {
-            final TaskSnapshot snapshot = mAnimationController.screenshotTask(taskId);
-            if (snapshot != null) {
-                return ThumbnailData.fromSnapshot(snapshot);
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to screenshot task", e);
-        }
-        return new ThumbnailData();
-    }
-
     public void setInputConsumerEnabled(boolean enabled) {
         try {
             mAnimationController.setInputConsumerEnabled(enabled);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index d3c02e6..b159a70 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -29,7 +29,6 @@
 import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer;
 import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.policy.DevicePostureController;
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
@@ -93,10 +92,8 @@
         mPasswordEntry.setUserActivityListener(this::onUserInput);
         mView.onDevicePostureChanged(mPostureController.getDevicePosture());
         mPostureController.addCallback(mPostureCallback);
-        if (mFeatureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)) {
-            mPasswordEntry.setUsePinShapes(true);
-            updateAutoConfirmationState();
-        }
+        mPasswordEntry.setUsePinShapes(true);
+        updateAutoConfirmationState();
     }
 
     protected void onUserInput() {
diff --git a/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt b/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt
index 2978595..9596a54 100644
--- a/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/data/repository/UserContextualEducationRepository.kt
@@ -20,10 +20,12 @@
 import android.hardware.input.InputManager
 import android.hardware.input.KeyGestureEvent
 import androidx.datastore.core.DataStore
+import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
 import androidx.datastore.preferences.core.MutablePreferences
 import androidx.datastore.preferences.core.PreferenceDataStoreFactory
 import androidx.datastore.preferences.core.Preferences
 import androidx.datastore.preferences.core.edit
+import androidx.datastore.preferences.core.emptyPreferences
 import androidx.datastore.preferences.core.intPreferencesKey
 import androidx.datastore.preferences.core.longPreferencesKey
 import androidx.datastore.preferences.preferencesDataStoreFile
@@ -68,7 +70,7 @@
 
     suspend fun updateGestureEduModel(
         gestureType: GestureType,
-        transform: (GestureEduModel) -> GestureEduModel
+        transform: (GestureEduModel) -> GestureEduModel,
     )
 
     suspend fun updateEduDeviceConnectionTime(
@@ -149,6 +151,8 @@
                         String.format(DATASTORE_DIR, userId)
                     )
                 },
+                corruptionHandler =
+                    ReplaceFileCorruptionHandler(produceNewData = { emptyPreferences() }),
                 scope = newDsScope,
             )
         dataStoreScope = newDsScope
@@ -159,7 +163,7 @@
 
     private fun getGestureEduModel(
         gestureType: GestureType,
-        preferences: Preferences
+        preferences: Preferences,
     ): GestureEduModel {
         return GestureEduModel(
             signalCount = preferences[getSignalCountKey(gestureType)] ?: 0,
@@ -183,7 +187,7 @@
 
     override suspend fun updateGestureEduModel(
         gestureType: GestureType,
-        transform: (GestureEduModel) -> GestureEduModel
+        transform: (GestureEduModel) -> GestureEduModel,
     ) {
         datastore.filterNotNull().first().edit { preferences ->
             val currentModel = getGestureEduModel(gestureType, preferences)
@@ -193,17 +197,17 @@
             setInstant(
                 preferences,
                 updatedModel.lastShortcutTriggeredTime,
-                getLastShortcutTriggeredTimeKey(gestureType)
+                getLastShortcutTriggeredTimeKey(gestureType),
             )
             setInstant(
                 preferences,
                 updatedModel.usageSessionStartTime,
-                getUsageSessionStartTimeKey(gestureType)
+                getUsageSessionStartTimeKey(gestureType),
             )
             setInstant(
                 preferences,
                 updatedModel.lastEducationTime,
-                getLastEducationTimeKey(gestureType)
+                getLastEducationTimeKey(gestureType),
             )
         }
     }
@@ -220,12 +224,12 @@
             setInstant(
                 preferences,
                 updatedModel.keyboardFirstConnectionTime,
-                getKeyboardFirstConnectionTimeKey()
+                getKeyboardFirstConnectionTimeKey(),
             )
             setInstant(
                 preferences,
                 updatedModel.touchpadFirstConnectionTime,
-                getTouchpadFirstConnectionTimeKey()
+                getTouchpadFirstConnectionTimeKey(),
             )
         }
     }
@@ -235,7 +239,7 @@
             keyboardFirstConnectionTime =
                 preferences[getKeyboardFirstConnectionTimeKey()]?.let { Instant.ofEpochSecond(it) },
             touchpadFirstConnectionTime =
-                preferences[getTouchpadFirstConnectionTimeKey()]?.let { Instant.ofEpochSecond(it) }
+                preferences[getTouchpadFirstConnectionTimeKey()]?.let { Instant.ofEpochSecond(it) },
         )
     }
 
@@ -263,7 +267,7 @@
     private fun setInstant(
         preferences: MutablePreferences,
         instant: Instant?,
-        key: Preferences.Key<Long>
+        key: Preferences.Key<Long>,
     ) {
         if (instant != null) {
             // Use epochSecond because an instant is defined as a signed long (64bit number) of
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index c039e01..2c33c0b 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -76,21 +76,10 @@
     val LOCKSCREEN_CUSTOM_CLOCKS =
         resourceBooleanFlag(R.bool.config_enableLockScreenCustomClocks, "lockscreen_custom_clocks")
 
-    /**
-     * Migration from the legacy isDozing/dozeAmount paths to the new KeyguardTransitionRepository
-     * will occur in stages. This is one stage of many to come.
-     */
-    // TODO(b/255607168): Tracking Bug
-    @JvmField val DOZING_MIGRATION_1 = unreleasedFlag("dozing_migration_1")
-
     /** Flag to control the revamp of keyguard biometrics progress animation */
     // TODO(b/244313043): Tracking bug
     @JvmField val BIOMETRICS_ANIMATION_REVAMP = unreleasedFlag("biometrics_animation_revamp")
 
-    // flag for controlling auto pin confirmation and material u shapes in bouncer
-    @JvmField
-    val AUTO_PIN_CONFIRMATION = releasedFlag("auto_pin_confirmation", "auto_pin_confirmation")
-
     /** Enables code to show contextual loyalty cards in wallet entrypoints */
     // TODO(b/294110497): Tracking Bug
     @JvmField
@@ -100,10 +89,6 @@
     // TODO(b/242908637): Tracking Bug
     @JvmField val WALLPAPER_FULLSCREEN_PREVIEW = releasedFlag("wallpaper_fullscreen_preview")
 
-    /** Inflate and bind views upon emitting a blueprint value . */
-    // TODO(b/297365780): Tracking Bug
-    @JvmField val LAZY_INFLATE_KEYGUARD = releasedFlag("lazy_inflate_keyguard")
-
     /** Enables UI updates for AI wallpapers in the wallpaper picker. */
     // TODO(b/267722622): Tracking Bug
     @JvmField val WALLPAPER_PICKER_UI_FOR_AIWP = releasedFlag("wallpaper_picker_ui_for_aiwp")
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/model/DeviceSchedulerInfo.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/model/DeviceSchedulerInfo.kt
index c436ef0..9a065be 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/model/DeviceSchedulerInfo.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/model/DeviceSchedulerInfo.kt
@@ -19,23 +19,26 @@
 import java.time.Instant
 
 data class DeviceSchedulerInfo(
-    var launchTime: Instant? = null,
+    var launchedTime: Instant? = null,
     var firstConnectionTime: Instant? = null,
-    var isNotified: Boolean = false,
+    var notifiedTime: Instant? = null,
 ) {
     constructor(
         launchTimeSec: Long?,
         firstConnectionTimeSec: Long?,
-        isNotified: Boolean = false,
+        notifyTimeSec: Long?,
     ) : this(
         launchTimeSec?.let { Instant.ofEpochSecond(it) },
         firstConnectionTimeSec?.let { Instant.ofEpochSecond(it) },
-        isNotified,
+        notifyTimeSec?.let { Instant.ofEpochSecond(it) },
     )
 
     val wasEverConnected: Boolean
         get() = firstConnectionTime != null
 
     val isLaunched: Boolean
-        get() = launchTime != null
+        get() = launchedTime != null
+
+    val isNotified: Boolean
+        get() = notifiedTime != null
 }
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/repository/TutorialSchedulerRepository.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/repository/TutorialSchedulerRepository.kt
index 526e7db..8b0accd 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/repository/TutorialSchedulerRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/data/repository/TutorialSchedulerRepository.kt
@@ -19,7 +19,6 @@
 import android.content.Context
 import androidx.datastore.core.DataStore
 import androidx.datastore.preferences.core.Preferences
-import androidx.datastore.preferences.core.booleanPreferencesKey
 import androidx.datastore.preferences.core.edit
 import androidx.datastore.preferences.core.longPreferencesKey
 import androidx.datastore.preferences.preferencesDataStore
@@ -49,35 +48,42 @@
         preferencesDataStore(name = dataStoreName, scope = backgroundScope)
 
     suspend fun setScheduledTutorialLaunchTime(device: DeviceType, time: Instant) {
-        applicationContext.dataStore.edit { pref -> pref[getLaunchKey(device)] = time.epochSecond }
+        updateData(key = getLaunchedKey(device), value = time.epochSecond)
     }
 
     suspend fun isScheduledTutorialLaunched(deviceType: DeviceType): Boolean =
         loadData()[deviceType]!!.isLaunched
 
     suspend fun getScheduledTutorialLaunchTime(deviceType: DeviceType): Instant? =
-        loadData()[deviceType]!!.launchTime
+        loadData()[deviceType]!!.launchedTime
 
     suspend fun setFirstConnectionTime(device: DeviceType, time: Instant) {
-        applicationContext.dataStore.edit { pref -> pref[getConnectKey(device)] = time.epochSecond }
+        updateData(key = getConnectedKey(device), value = time.epochSecond)
     }
 
-    suspend fun setNotified(device: DeviceType) {
-        applicationContext.dataStore.edit { pref -> pref[getNotificationKey(device)] = true }
-    }
-
-    suspend fun isNotified(deviceType: DeviceType): Boolean = loadData()[deviceType]!!.isNotified
-
     suspend fun wasEverConnected(deviceType: DeviceType): Boolean =
         loadData()[deviceType]!!.wasEverConnected
 
     suspend fun getFirstConnectionTime(deviceType: DeviceType): Instant? =
         loadData()[deviceType]!!.firstConnectionTime
 
+    suspend fun setNotifiedTime(device: DeviceType, time: Instant) {
+        updateData(key = getNotifiedKey(device), value = time.epochSecond)
+    }
+
+    suspend fun isNotified(deviceType: DeviceType): Boolean = loadData()[deviceType]!!.isNotified
+
+    suspend fun getNotifiedTime(deviceType: DeviceType): Instant? =
+        loadData()[deviceType]!!.notifiedTime
+
     private suspend fun loadData(): Map<DeviceType, DeviceSchedulerInfo> {
         return applicationContext.dataStore.data.map { pref -> getSchedulerInfo(pref) }.first()
     }
 
+    private suspend fun <T> updateData(key: Preferences.Key<T>, value: T) {
+        applicationContext.dataStore.edit { pref -> pref[key] = value }
+    }
+
     private fun getSchedulerInfo(pref: Preferences): Map<DeviceType, DeviceSchedulerInfo> {
         return mapOf(
             DeviceType.KEYBOARD to getDeviceSchedulerInfo(pref, DeviceType.KEYBOARD),
@@ -86,20 +92,20 @@
     }
 
     private fun getDeviceSchedulerInfo(pref: Preferences, device: DeviceType): DeviceSchedulerInfo {
-        val launchTime = pref[getLaunchKey(device)]
-        val connectionTime = pref[getConnectKey(device)]
-        val isNotified = pref[getNotificationKey(device)] == true
-        return DeviceSchedulerInfo(launchTime, connectionTime, isNotified)
+        val launchedTime = pref[getLaunchedKey(device)]
+        val connectedTime = pref[getConnectedKey(device)]
+        val notifiedTime = pref[getNotifiedKey(device)]
+        return DeviceSchedulerInfo(launchedTime, connectedTime, notifiedTime)
     }
 
-    private fun getLaunchKey(device: DeviceType) =
-        longPreferencesKey(device.name + LAUNCH_TIME_SUFFIX)
+    private fun getLaunchedKey(device: DeviceType) =
+        longPreferencesKey(device.name + LAUNCHED_TIME_SUFFIX)
 
-    private fun getConnectKey(device: DeviceType) =
-        longPreferencesKey(device.name + CONNECT_TIME_SUFFIX)
+    private fun getConnectedKey(device: DeviceType) =
+        longPreferencesKey(device.name + CONNECTED_TIME_SUFFIX)
 
-    private fun getNotificationKey(device: DeviceType) =
-        booleanPreferencesKey(device.name + NOTIFIED_SUFFIX)
+    private fun getNotifiedKey(device: DeviceType) =
+        longPreferencesKey(device.name + NOTIFIED_TIME_SUFFIX)
 
     suspend fun clear() {
         applicationContext.dataStore.edit { it.clear() }
@@ -107,9 +113,9 @@
 
     companion object {
         const val DATASTORE_NAME = "TutorialScheduler"
-        const val LAUNCH_TIME_SUFFIX = "_LAUNCH_TIME"
-        const val CONNECT_TIME_SUFFIX = "_CONNECT_TIME"
-        const val NOTIFIED_SUFFIX = "_NOTIFIED"
+        const val LAUNCHED_TIME_SUFFIX = "_LAUNCHED_TIME"
+        const val CONNECTED_TIME_SUFFIX = "_CONNECTED_TIME"
+        const val NOTIFIED_TIME_SUFFIX = "_NOTIFIED_TIME"
     }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
index 419eefe..9607053 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
@@ -111,9 +111,9 @@
             val tutorialType = resolveTutorialType(it)
 
             if (tutorialType == TutorialType.KEYBOARD || tutorialType == TutorialType.BOTH)
-                repo.setNotified(KEYBOARD)
+                repo.setNotifiedTime(KEYBOARD, Instant.now())
             if (tutorialType == TutorialType.TOUCHPAD || tutorialType == TutorialType.BOTH)
-                repo.setNotified(TOUCHPAD)
+                repo.setNotifiedTime(TOUCHPAD, Instant.now())
 
             logger.logTutorialLaunched(tutorialType)
             tutorialType
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperCoreStartable.kt
index 19a19d5..c702ba9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperCoreStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperCoreStartable.kt
@@ -25,6 +25,7 @@
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.keyboard.shortcut.data.repository.CustomInputGesturesRepository
 import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperStateRepository
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.statusbar.CommandQueue
@@ -41,6 +42,7 @@
     private val stateRepository: ShortcutHelperStateRepository,
     private val activityStarter: ActivityStarter,
     @Background private val backgroundScope: CoroutineScope,
+    private val customInputGesturesRepository: CustomInputGesturesRepository
 ) : CoreStartable {
     override fun start() {
         registerBroadcastReceiver(
@@ -55,6 +57,10 @@
             action = Intent.ACTION_CLOSE_SYSTEM_DIALOGS,
             onReceive = { stateRepository.hide() },
         )
+        registerBroadcastReceiver(
+            action = Intent.ACTION_USER_SWITCHED,
+            onReceive = { customInputGesturesRepository.refreshCustomInputGestures() },
+        )
         commandQueue.addCallback(
             object : CommandQueue.Callbacks {
                 override fun dismissKeyboardShortcutsMenu() {
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepository.kt
index 36cd400..e5c638c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/CustomInputGesturesRepository.kt
@@ -25,6 +25,7 @@
 import android.hardware.input.InputManager.CUSTOM_INPUT_GESTURE_RESULT_SUCCESS
 import android.hardware.input.InputSettings
 import android.util.Log
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.keyboard.shared.model.ShortcutCustomizationRequestResult
 import com.android.systemui.keyboard.shared.model.ShortcutCustomizationRequestResult.ERROR_OTHER
@@ -37,6 +38,7 @@
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
 
+@SysUISingleton
 class CustomInputGesturesRepository
 @Inject
 constructor(private val userTracker: UserTracker,
@@ -56,7 +58,7 @@
     val customInputGestures =
         _customInputGesture.onStart { refreshCustomInputGestures() }
 
-    private fun refreshCustomInputGestures() {
+    fun refreshCustomInputGestures() {
         setCustomInputGestures(inputGestures = retrieveCustomInputGestures())
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
index d7be5e6..e255bde 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/InputGestureMaps.kt
@@ -27,14 +27,19 @@
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_LOCK_SCREEN
+import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW
+import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_SHORTCUT_HELPER
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER
+import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW
+import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT
+import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW
 import android.hardware.input.KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL
 import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.AppCategories
 import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.MultiTasking
@@ -66,6 +71,11 @@
             KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION to MultiTasking,
             KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT to MultiTasking,
             KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT to MultiTasking,
+            KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW to MultiTasking,
+            KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW to MultiTasking,
+            KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW to MultiTasking,
+            KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW to MultiTasking,
+            KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY to MultiTasking,
 
             // App Category
             KEY_GESTURE_TYPE_LAUNCH_APPLICATION to AppCategories,
@@ -102,15 +112,23 @@
                 R.string.shortcutHelper_category_split_screen,
             KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT to
                 R.string.shortcutHelper_category_split_screen,
+            KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW to
+                R.string.shortcutHelper_category_split_screen,
+            KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW to
+                R.string.shortcutHelper_category_split_screen,
+            KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW to
+                R.string.shortcutHelper_category_split_screen,
+            KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW to
+                R.string.shortcutHelper_category_split_screen,
+            KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY to R.string.shortcutHelper_category_split_screen,
 
             // App Category
-            KEY_GESTURE_TYPE_LAUNCH_APPLICATION to
-                R.string.keyboard_shortcut_group_applications,
+            KEY_GESTURE_TYPE_LAUNCH_APPLICATION to R.string.keyboard_shortcut_group_applications,
         )
 
     /**
-     * App Category shortcut labels are mapped dynamically based on intent
-     * see [InputGestureDataAdapter.fetchShortcutLabelByAppLaunchData]
+     * App Category shortcut labels are mapped dynamically based on intent see
+     * [InputGestureDataAdapter.fetchShortcutLabelByAppLaunchData]
      */
     val gestureToInternalKeyboardShortcutInfoLabelResIdMap =
         mapOf(
@@ -136,6 +154,16 @@
             KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT to R.string.system_multitasking_lhs,
             KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_RIGHT to R.string.system_multitasking_rhs,
             KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION to R.string.system_multitasking_full_screen,
+            KEY_GESTURE_TYPE_SNAP_LEFT_FREEFORM_WINDOW to
+                R.string.system_desktop_mode_snap_left_window,
+            KEY_GESTURE_TYPE_SNAP_RIGHT_FREEFORM_WINDOW to
+                R.string.system_desktop_mode_snap_right_window,
+            KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW to
+                R.string.system_desktop_mode_minimize_window,
+            KEY_GESTURE_TYPE_TOGGLE_MAXIMIZE_FREEFORM_WINDOW to
+                R.string.system_desktop_mode_toggle_maximize_window,
+            KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY to
+                R.string.system_multitasking_move_to_next_display,
         )
 
     val shortcutLabelToKeyGestureTypeMap: Map<String, Int>
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt
index ac6708a..3819f6d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutCustomizer.kt
@@ -46,6 +46,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.key.KeyEvent
@@ -269,6 +270,7 @@
                 .sizeIn(minWidth = 332.dp, minHeight = 56.dp)
                 .border(width = 2.dp, color = outlineColor, shape = RoundedCornerShape(50.dp))
                 .onKeyEvent { onKeyPress(it) }
+                .focusProperties { canFocus = true } // enables keyboard focus when in touch mode
                 .focusRequester(focusRequester),
         interactionSource = interactionSource,
     ) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
index 5b28a3f..a74384f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerLockscreenVisibilityManager.kt
@@ -156,6 +156,13 @@
         setWmLockscreenState(lockscreenShowing = lockscreenShown)
     }
 
+    /**
+     * Called when the keyguard going away remote animation is started, and we have a
+     * RemoteAnimationTarget to animate.
+     *
+     * This is triggered either by this class calling ATMS#keyguardGoingAway, or by WM directly,
+     * such as when an activity with FLAG_DISMISS_KEYGUARD is launched over a dismissible keyguard.
+     */
     fun onKeyguardGoingAwayRemoteAnimationStart(
         @WindowManager.TransitionOldType transit: Int,
         apps: Array<RemoteAnimationTarget>,
@@ -163,19 +170,32 @@
         nonApps: Array<RemoteAnimationTarget>,
         finishedCallback: IRemoteAnimationFinishedCallback,
     ) {
-        // Make sure this is true - we set it true when requesting keyguardGoingAway, but there are
-        // cases where WM starts this transition on its own.
-        isKeyguardGoingAway = true
+        // If we weren't expecting the keyguard to be going away, WM triggered this transition.
+        if (!isKeyguardGoingAway) {
+            // Since WM triggered this, we're likely not transitioning to GONE yet. See if we can
+            // start that transition.
+            val startedDismiss =
+                keyguardDismissTransitionInteractor.startDismissKeyguardTransition(
+                    reason = "Going away remote animation started"
+                )
 
-        // Ensure that we've started a dismiss keyguard transition. WindowManager can start the
-        // going away animation on its own, if an activity launches and then requests dismissing the
-        // keyguard. In this case, this is the first and only signal we'll receive to start
-        // a transition to GONE. This transition needs to start even if we're not provided an app
-        // animation target - it's possible the app is destroyed on creation, etc. but we'll still
-        // be unlocking.
-        keyguardDismissTransitionInteractor.startDismissKeyguardTransition(
-            reason = "Going away remote animation started"
-        )
+            if (!startedDismiss) {
+                // If the transition wasn't started, we're already GONE. This can happen with timing
+                // issues, where the remote animation took a long time to start, and something else
+                // caused us to unlock in the meantime. Since we're already GONE, simply end the
+                // remote animatiom immediately.
+                Log.d(
+                    TAG,
+                    "onKeyguardGoingAwayRemoteAnimationStart: " +
+                        "Dismiss transition was not started; we're already GONE. " +
+                        "Ending remote animation.",
+                )
+                finishedCallback.onAnimationFinished()
+                return
+            }
+
+            isKeyguardGoingAway = true
+        }
 
         if (apps.isNotEmpty()) {
             goingAwayRemoteAnimationFinishedCallback = finishedCallback
@@ -278,6 +298,6 @@
     }
 
     companion object {
-        private val TAG = WindowManagerLockscreenVisibilityManager::class.java.simpleName
+        private val TAG = "WindowManagerLsVis"
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt
index 4793d95..089e5dc 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt
@@ -48,9 +48,12 @@
      *
      * This is called exclusively by sources that can authoritatively say we should be unlocked,
      * including KeyguardSecurityContainerController and WindowManager.
+     *
+     * Returns [false] if the transition was not started, because we're already GONE or we don't
+     * know how to dismiss keyguard from the current state.
      */
-    fun startDismissKeyguardTransition(reason: String = "") {
-        if (SceneContainerFlag.isEnabled) return
+    fun startDismissKeyguardTransition(reason: String = ""): Boolean {
+        if (SceneContainerFlag.isEnabled) return false
         Log.d(TAG, "#startDismissKeyguardTransition(reason=$reason)")
         val startedState =
             if (transitionRaceCondition()) {
@@ -65,13 +68,20 @@
             AOD -> fromAodTransitionInteractor.dismissAod()
             DOZING -> fromDozingTransitionInteractor.dismissFromDozing()
             KeyguardState.OCCLUDED -> fromOccludedTransitionInteractor.dismissFromOccluded()
-            KeyguardState.GONE ->
+            KeyguardState.GONE -> {
                 Log.i(
                     TAG,
                     "Already transitioning to GONE; ignoring startDismissKeyguardTransition.",
                 )
-            else -> Log.e(TAG, "We don't know how to dismiss keyguard from state $startedState.")
+                return false
+            }
+            else -> {
+                Log.e(TAG, "We don't know how to dismiss keyguard from state $startedState.")
+                return false
+            }
         }
+
+        return true
     }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
index 2497def..d981eeb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import android.util.MathUtils
+import com.android.systemui.Flags.lightRevealMigration
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.domain.interactor.FromAodTransitionInteractor
 import com.android.systemui.keyguard.shared.model.Edge
@@ -32,9 +33,7 @@
 @SysUISingleton
 class AodToOccludedTransitionViewModel
 @Inject
-constructor(
-    animationFlow: KeyguardTransitionAnimationFlow,
-) : DeviceEntryIconTransition {
+constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {
     private val transitionAnimation =
         animationFlow.setup(
             duration = FromAodTransitionInteractor.TO_OCCLUDED_DURATION,
@@ -52,10 +51,20 @@
         var currentAlpha = 0f
         return transitionAnimation.sharedFlow(
             duration = 250.milliseconds,
-            startTime = 100.milliseconds, // Wait for the light reveal to "hit" the LS elements.
-            onStart = { currentAlpha = viewState.alpha() },
+            startTime =
+                if (lightRevealMigration()) {
+                    100.milliseconds // Wait for the light reveal to "hit" the LS elements.
+                } else {
+                    0.milliseconds
+                },
+            onStart = {
+                if (lightRevealMigration()) {
+                    currentAlpha = viewState.alpha()
+                } else {
+                    currentAlpha = 0f
+                }
+            },
             onStep = { MathUtils.lerp(currentAlpha, 0f, it) },
-            onCancel = { 0f },
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
index af37eea..1a2238c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java
@@ -234,8 +234,6 @@
                     (ViewGroup.MarginLayoutParams) mItemLayout.getLayoutParams();
             params.rightMargin = showEndTouchArea ? mController.getItemMarginEndSelectable()
                     : mController.getItemMarginEndDefault();
-            mTitleIcon.setBackgroundTintList(
-                    ColorStateList.valueOf(mController.getColorItemContent()));
         }
 
         void setTwoLineLayout(MediaDevice device, boolean bFocused, boolean showSeekBar,
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
index 1dbb317..15afd22 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaSwitchingController.java
@@ -37,9 +37,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.media.AudioManager;
@@ -535,17 +532,9 @@
             // Use default Bluetooth device icon to handle getIcon() is null case.
             drawable = mContext.getDrawable(com.android.internal.R.drawable.ic_bt_headphones_a2dp);
         }
-        if (!(drawable instanceof BitmapDrawable)) {
-            setColorFilter(drawable, isActiveItem(device));
-        }
         return BluetoothUtils.createIconWithDrawable(drawable);
     }
 
-    void setColorFilter(Drawable drawable, boolean isActive) {
-        drawable.setColorFilter(new PorterDuffColorFilter(mColorItemContent,
-                PorterDuff.Mode.SRC_IN));
-    }
-
     boolean isActiveItem(MediaDevice device) {
         boolean isConnected = mLocalMediaManager.getCurrentConnectedDevice().getId().equals(
                 device.getId());
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
index e9b7534..3f14b55e 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
@@ -44,6 +44,7 @@
 import android.inputmethodservice.InputMethodService;
 import android.inputmethodservice.InputMethodService.BackDispositionMode;
 import android.inputmethodservice.InputMethodService.ImeWindowVisibility;
+import android.os.Handler;
 import android.os.RemoteException;
 import android.os.Trace;
 import android.util.Log;
@@ -61,6 +62,7 @@
 import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.Dumpable;
 import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
@@ -182,15 +184,18 @@
     private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     private final StatusBarStateController mStatusBarStateController;
     private DisplayTracker mDisplayTracker;
+    private final Handler mBgHandler;
 
     @Inject
     public TaskbarDelegate(Context context,
             LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
             StatusBarKeyguardViewManager statusBarKeyguardViewManager,
-            StatusBarStateController statusBarStateController) {
+            StatusBarStateController statusBarStateController,
+            @Background Handler bgHandler) {
         mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory;
 
         mContext = context;
+        mBgHandler = bgHandler;
         mDisplayManager = mContext.getSystemService(DisplayManager.class);
         mPipListener = (bounds) -> {
             mEdgeBackGestureHandler.setPipStashExclusionBounds(bounds);
@@ -245,7 +250,9 @@
                 new LightBarTransitionsController.DarkIntensityApplier() {
                     @Override
                     public void applyDarkIntensity(float darkIntensity) {
-                        mOverviewProxyService.onNavButtonsDarkIntensityChanged(darkIntensity);
+                        mBgHandler.post(() -> {
+                            mOverviewProxyService.onNavButtonsDarkIntensityChanged(darkIntensity);
+                        });
                     }
 
                     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index d401b6e..a98b8e5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -784,7 +784,11 @@
 
     private fun updateLongPressEffect(handlesLongClick: Boolean) {
         // The long press effect in the tile can't be updated if it is still running
-        if (longPressEffect?.state != QSLongPressEffect.State.IDLE) return
+        if (
+            longPressEffect?.state != QSLongPressEffect.State.IDLE &&
+                longPressEffect?.state != QSLongPressEffect.State.CLICKED
+        )
+            return
 
         longPressEffect.qsTile?.state?.handlesLongClick = handlesLongClick
         if (handlesLongClick && longPressEffect.initializeEffect(longPressEffectDuration)) {
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlag.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlag.kt
index dc0c4dc..2bcd1d1 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlag.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlag.kt
@@ -24,7 +24,6 @@
 import com.android.systemui.flags.RefactorFlagUtils
 import com.android.systemui.keyguard.KeyguardWmStateRefactor
 import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
-import com.android.systemui.statusbar.phone.PredictiveBackSysUiFlag
 
 /** Helper for reading or using the scene container flag state. */
 object SceneContainerFlag {
@@ -36,8 +35,7 @@
         get() =
             sceneContainer() && // mainAconfigFlag
                 KeyguardWmStateRefactor.isEnabled &&
-                NotificationThrottleHun.isEnabled &&
-                PredictiveBackSysUiFlag.isEnabled
+                NotificationThrottleHun.isEnabled
 
     // NOTE: Changes should also be made in getSecondaryFlags and @EnableSceneContainer
 
@@ -49,7 +47,6 @@
         sequenceOf(
             KeyguardWmStateRefactor.token,
             NotificationThrottleHun.token,
-            PredictiveBackSysUiFlag.token,
             // NOTE: Changes should also be made in isEnabled and @EnableSceneContainer
         )
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
index e5ff252..f295c0c 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
@@ -19,6 +19,7 @@
 import android.hardware.display.DisplayManager
 import android.os.Bundle
 import android.os.UserHandle
+import android.view.View
 import androidx.annotation.StyleRes
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
@@ -119,6 +120,12 @@
         super<BaseMediaProjectionPermissionDialogDelegate>.onCreate(dialog, savedInstanceState)
         setDialogTitle(R.string.screenrecord_permission_dialog_title)
         dialog.setTitle(R.string.screenrecord_title)
+        setStartButtonOnClickListener { v: View? ->
+            val screenRecordViewBinder: ScreenRecordPermissionViewBinder? =
+                viewBinder as ScreenRecordPermissionViewBinder?
+            screenRecordViewBinder?.startButtonOnClicked()
+            dialog.dismiss()
+        }
         setCancelButtonOnClickListener { dialog.dismiss() }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionViewBinder.kt
index 9f7e1ad..691bdd4 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionViewBinder.kt
@@ -79,37 +79,38 @@
     override fun bind() {
         super.bind()
         initRecordOptionsView()
-        setStartButtonOnClickListener { _: View? ->
-            onStartRecordingClicked?.run()
-            if (selectedScreenShareOption.mode == ENTIRE_SCREEN) {
-                requestScreenCapture(
-                    captureTarget = null,
-                    displayId = selectedScreenShareOption.displayId,
-                )
-            }
-            if (selectedScreenShareOption.mode == SINGLE_APP) {
-                val intent = Intent(dialog.context, MediaProjectionAppSelectorActivity::class.java)
-                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        setStartButtonOnClickListener { startButtonOnClicked() }
+    }
 
-                // We can't start activity for result here so we use result receiver to get
-                // the selected target to capture
-                intent.putExtra(
-                    MediaProjectionAppSelectorActivity.EXTRA_CAPTURE_REGION_RESULT_RECEIVER,
-                    CaptureTargetResultReceiver(),
-                )
+    fun startButtonOnClicked() {
+        onStartRecordingClicked?.run()
+        if (selectedScreenShareOption.mode == ENTIRE_SCREEN) {
+            requestScreenCapture(
+                captureTarget = null,
+                displayId = selectedScreenShareOption.displayId,
+            )
+        }
+        if (selectedScreenShareOption.mode == SINGLE_APP) {
+            val intent = Intent(dialog.context, MediaProjectionAppSelectorActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
 
-                intent.putExtra(
-                    MediaProjectionAppSelectorActivity.EXTRA_HOST_APP_USER_HANDLE,
-                    hostUserHandle,
-                )
-                intent.putExtra(MediaProjectionAppSelectorActivity.EXTRA_HOST_APP_UID, hostUid)
-                intent.putExtra(
-                    MediaProjectionAppSelectorActivity.EXTRA_SCREEN_SHARE_TYPE,
-                    MediaProjectionAppSelectorActivity.ScreenShareType.ScreenRecord.name,
-                )
-                activityStarter.startActivity(intent, /* dismissShade= */ true)
-            }
-            dialog.dismiss()
+            // We can't start activity for result here so we use result receiver to get
+            // the selected target to capture
+            intent.putExtra(
+                MediaProjectionAppSelectorActivity.EXTRA_CAPTURE_REGION_RESULT_RECEIVER,
+                CaptureTargetResultReceiver(),
+            )
+
+            intent.putExtra(
+                MediaProjectionAppSelectorActivity.EXTRA_HOST_APP_USER_HANDLE,
+                hostUserHandle,
+            )
+            intent.putExtra(MediaProjectionAppSelectorActivity.EXTRA_HOST_APP_UID, hostUid)
+            intent.putExtra(
+                MediaProjectionAppSelectorActivity.EXTRA_SCREEN_SHARE_TYPE,
+                MediaProjectionAppSelectorActivity.ScreenShareType.ScreenRecord.name,
+            )
+            activityStarter.startActivity(intent, /* dismissShade= */ true)
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt
index e1631cc..bbb13d5 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt
@@ -61,9 +61,18 @@
     /** Callback for notifying of changes. */
     @WeaklyReferencedCallback
     interface Callback {
-        /** Notifies that the current user will be changed. */
+        /**
+         * Same as {@link onBeforeUserSwitching(Int, Runnable)} but the callback will be called
+         * automatically after the completion of this method.
+         */
         fun onBeforeUserSwitching(newUser: Int) {}
 
+        /** Notifies that the current user will be changed. */
+        fun onBeforeUserSwitching(newUser: Int, resultCallback: Runnable) {
+            onBeforeUserSwitching(newUser)
+            resultCallback.run()
+        }
+
         /**
          * Same as {@link onUserChanging(Int, Context, Runnable)} but the callback will be called
          * automatically after the completion of this method.
diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
index b7a3aed..42d8363 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt
@@ -196,8 +196,9 @@
     private fun registerUserSwitchObserver() {
         iActivityManager.registerUserSwitchObserver(
             object : UserSwitchObserver() {
-                override fun onBeforeUserSwitching(newUserId: Int) {
+                override fun onBeforeUserSwitching(newUserId: Int, reply: IRemoteCallback?) {
                     handleBeforeUserSwitching(newUserId)
+                    reply?.sendResult(null)
                 }
 
                 override fun onUserSwitching(newUserId: Int, reply: IRemoteCallback?) {
@@ -236,8 +237,7 @@
         setUserIdInternal(newUserId)
 
         notifySubscribers { callback, resultCallback ->
-                callback.onBeforeUserSwitching(newUserId)
-                resultCallback.run()
+                callback.onBeforeUserSwitching(newUserId, resultCallback)
             }
             .await()
     }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
index ef62d2d..a2edd3ab 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
@@ -15,11 +15,18 @@
  */
 package com.android.systemui.shade.data.repository
 
+import android.annotation.SuppressLint
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharedFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.launch
 
 /** Data for the shade, mostly related to expansion of the shade and quick settings. */
 interface ShadeRepository {
@@ -36,7 +43,7 @@
      * Information about the currently running fling animation, or null if no fling animation is
      * running.
      */
-    val currentFling: StateFlow<FlingInfo?>
+    val currentFling: SharedFlow<FlingInfo?>
 
     /**
      * The amount the lockscreen shade has dragged down by the user, [0-1]. 0 means fully collapsed,
@@ -180,7 +187,8 @@
 
 /** Business logic for shade interactions */
 @SysUISingleton
-class ShadeRepositoryImpl @Inject constructor() : ShadeRepository {
+class ShadeRepositoryImpl @Inject constructor(@Background val backgroundScope: CoroutineScope) :
+    ShadeRepository {
     private val _qsExpansion = MutableStateFlow(0f)
     @Deprecated("Use ShadeInteractor.qsExpansion instead")
     override val qsExpansion: StateFlow<Float> = _qsExpansion.asStateFlow()
@@ -193,8 +201,13 @@
     override val udfpsTransitionToFullShadeProgress: StateFlow<Float> =
         _udfpsTransitionToFullShadeProgress.asStateFlow()
 
-    private val _currentFling: MutableStateFlow<FlingInfo?> = MutableStateFlow(null)
-    override val currentFling: StateFlow<FlingInfo?> = _currentFling.asStateFlow()
+    /**
+     * Must be a SharedFlow, since the fling is by definition an event and dropping it has extreme
+     * consequences in some cases (for example, keyguard uses this to decide when to unlock).
+     */
+    @SuppressLint("SharedFlowCreation")
+    override val currentFling: MutableSharedFlow<FlingInfo?> =
+        MutableSharedFlow(replay = 2, onBufferOverflow = BufferOverflow.DROP_OLDEST)
 
     private val _legacyShadeExpansion = MutableStateFlow(0f)
     @Deprecated("Use ShadeInteractor.shadeExpansion instead")
@@ -294,7 +307,7 @@
     }
 
     override fun setCurrentFling(info: FlingInfo?) {
-        _currentFling.value = info
+        backgroundScope.launch { currentFling.emit(info) }
     }
 
     @Deprecated("Should only be called by NPVC and tests")
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 239257d..2bcd3fc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -61,11 +61,13 @@
 import com.android.systemui.Flags;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Application;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.flags.FeatureFlagsClassic;
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
 import com.android.systemui.recents.OverviewProxyService;
@@ -78,6 +80,7 @@
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.ListenerSet;
+import com.android.systemui.util.kotlin.JavaAdapterKt;
 import com.android.systemui.util.settings.SecureSettings;
 
 import dagger.Lazy;
@@ -88,9 +91,13 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.inject.Inject;
 
+import kotlinx.coroutines.CoroutineScope;
+
 /**
  * Handles keeping track of the current user, profiles, and various things related to hiding
  * contents, redacting notifications, and the lockscreen.
@@ -111,6 +118,9 @@
     private static final Uri SHOW_PRIVATE_LOCKSCREEN =
             Settings.Secure.getUriFor(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
 
+    private static final long LOCK_TIME_FOR_SENSITIVE_REDACTION_MS =
+            TimeUnit.MINUTES.toMillis(10);
+
     private final Lazy<NotificationVisibilityProvider> mVisibilityProviderLazy;
     private final Lazy<CommonNotifCollection> mCommonNotifCollectionLazy;
     private final DevicePolicyManager mDevicePolicyManager;
@@ -284,7 +294,12 @@
     protected final SparseArray<UserInfo> mCurrentProfiles = new SparseArray<>();
     protected final SparseArray<UserInfo> mCurrentManagedProfiles = new SparseArray<>();
 
+    // The last lock time. Uses currentTimeMillis
+    @VisibleForTesting
+    protected final AtomicLong mLastLockTime = new AtomicLong(-1);
+
     protected int mCurrentUserId = 0;
+
     protected NotificationPresenter mPresenter;
     protected ContentObserver mLockscreenSettingsObserver;
     protected ContentObserver mSettingsObserver;
@@ -311,7 +326,10 @@
             DumpManager dumpManager,
             LockPatternUtils lockPatternUtils,
             FeatureFlagsClassic featureFlags,
-            Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy) {
+            Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy,
+            Lazy<KeyguardInteractor> keyguardInteractor,
+            @Application CoroutineScope coroutineScope
+    ) {
         mContext = context;
         mMainExecutor = mainExecutor;
         mBackgroundExecutor = backgroundExecutor;
@@ -341,6 +359,18 @@
         if (keyguardPrivateNotifications()) {
             init();
         }
+
+        // To avoid dependency injection cycle, finish constructing this object before using the
+        // KeyguardInteractor. The CoroutineScope will only be null in tests.
+        if (LockscreenOtpRedaction.isEnabled() && coroutineScope != null) {
+            mMainExecutor.execute(() -> JavaAdapterKt.collectFlow(coroutineScope,
+                    keyguardInteractor.get().isKeyguardDismissible(),
+                    unlocked -> {
+                        if (!unlocked) {
+                            mLastLockTime.set(System.currentTimeMillis());
+                        }
+                    }));
+        }
     }
 
     public void setUpWithPresenter(NotificationPresenter presenter) {
@@ -443,7 +473,7 @@
         mCurrentUserId = mUserTracker.getUserId(); // in case we reg'd receiver too late
         updateCurrentProfilesCache();
 
-        // Set  up
+        // Set up
         mBackgroundExecutor.execute(() -> {
             @SuppressLint("MissingPermission") List<UserInfo> users = mUserManager.getUsers();
             for (int i = users.size() - 1; i >= 0; i--) {
@@ -667,8 +697,6 @@
                 !userAllowsPrivateNotificationsInPublic(mCurrentUserId);
         boolean isNotifForManagedProfile = mCurrentManagedProfiles.contains(userId);
         boolean isNotifUserRedacted = !userAllowsPrivateNotificationsInPublic(userId);
-        boolean isNotifSensitive = LockscreenOtpRedaction.isEnabled()
-                && ent.getRanking() != null && ent.getRanking().hasSensitiveContent();
 
         // redact notifications if the current user is redacting notifications or the notification
         // contains sensitive content. However if the notification is associated with a managed
@@ -689,12 +717,45 @@
         if (keyguardPrivateNotifications() && !mKeyguardAllowingNotifications) {
             return REDACTION_TYPE_PUBLIC;
         }
-        if (isNotifSensitive) {
+
+        if (shouldShowSensitiveContentRedactedView(ent)) {
             return REDACTION_TYPE_SENSITIVE_CONTENT;
         }
         return REDACTION_TYPE_NONE;
     }
 
+    /*
+     * We show the sensitive content redaction view if
+     * 1. The feature is enabled
+     * 2. The device is locked
+     * 3. The notification has the `hasSensitiveContent` ranking variable set to true
+     * 4. The device has been locked for at least LOCK_TIME_FOR_SENSITIVE_REDACTION_MS
+     * 5. The notification arrived since the last lock time
+     */
+    private boolean shouldShowSensitiveContentRedactedView(NotificationEntry ent) {
+        if (!LockscreenOtpRedaction.isEnabled()) {
+            return false;
+        }
+
+        if (!mKeyguardManager.isDeviceLocked()) {
+            return false;
+        }
+
+        if (ent.getRanking() == null || !ent.getRanking().hasSensitiveContent()) {
+            return false;
+        }
+
+        long lastLockedTime = mLastLockTime.get();
+        if (ent.getSbn().getPostTime() < lastLockedTime) {
+            return false;
+        }
+
+        if ((System.currentTimeMillis() - lastLockedTime) < LOCK_TIME_FOR_SENSITIVE_REDACTION_MS) {
+            return false;
+        }
+        return true;
+    }
+
     private boolean packageHasVisibilityOverride(String key) {
         if (mCommonNotifCollectionLazy.get() == null) {
             Log.wtf(TAG, "mEntryManager was null!", new Throwable());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
index 059e69a..69ef09d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
@@ -242,8 +242,9 @@
         chipTimeView: ChipChronometer,
         chipShortTimeDeltaView: DateTimeView,
     ) {
-        if (chipModel.icon != null) {
-            if (chipModel.icon is OngoingActivityChipModel.ChipIcon.StatusBarView) {
+        val icon = chipModel.icon
+        if (icon != null) {
+            if (iconRequiresEmbeddedPadding(icon)) {
                 // If the icon is a custom [StatusBarIconView], then it should've come from
                 // `Notification.smallIcon`, which is required to embed its own paddings. We need to
                 // adjust the other paddings to make everything look good :)
@@ -265,6 +266,10 @@
         }
     }
 
+    private fun iconRequiresEmbeddedPadding(icon: OngoingActivityChipModel.ChipIcon) =
+        icon is OngoingActivityChipModel.ChipIcon.StatusBarView ||
+            icon is OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon
+
     private fun View.setTextPaddingForEmbeddedPaddingIcon() {
         val newPaddingEnd =
             context.resources.getDimensionPixelSize(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipText.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipText.kt
new file mode 100644
index 0000000..3d768d2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipText.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.statusbar.chips.ui.compose
+
+import androidx.compose.foundation.layout.sizeIn
+import androidx.compose.material3.LocalTextStyle
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+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.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.rememberTextMeasurer
+import com.android.systemui.res.R
+
+/**
+ * Renders text within a status bar chip. The text is only displayed if more than 50% of its width
+ * can fit inside the bounds of the chip. If there is any overflow,
+ * [R.dimen.ongoing_activity_chip_text_fading_edge_length] is used to fade out the edge of the text.
+ */
+@Composable
+fun ChipText(
+    text: String,
+    backgroundColor: Color,
+    modifier: Modifier = Modifier,
+    color: Color = Color.Unspecified,
+    style: TextStyle = LocalTextStyle.current,
+    minimumVisibleRatio: Float = 0.5f,
+) {
+    val density = LocalDensity.current
+    val textMeasurer = rememberTextMeasurer()
+
+    val textFadeLength =
+        dimensionResource(id = R.dimen.ongoing_activity_chip_text_fading_edge_length)
+    val maxTextWidthDp = dimensionResource(id = R.dimen.ongoing_activity_chip_max_text_width)
+    val maxTextWidthPx = with(density) { maxTextWidthDp.toPx() }
+
+    val textLayoutResult = remember(text, style) { textMeasurer.measure(text, style) }
+    val willOverflowWidth = textLayoutResult.size.width > maxTextWidthPx
+
+    if (isSufficientlyVisible(maxTextWidthPx, minimumVisibleRatio, textLayoutResult)) {
+        Text(
+            text = text,
+            style = style,
+            softWrap = false,
+            color = color,
+            modifier =
+                modifier
+                    .sizeIn(maxWidth = maxTextWidthDp)
+                    .then(
+                        if (willOverflowWidth) {
+                            Modifier.overflowFadeOut(
+                                with(density) { textFadeLength.roundToPx() },
+                                backgroundColor,
+                            )
+                        } else {
+                            Modifier
+                        }
+                    ),
+        )
+    }
+}
+
+private fun Modifier.overflowFadeOut(fadeLength: Int, color: Color): Modifier = drawWithContent {
+    drawContent()
+
+    val brush =
+        Brush.horizontalGradient(
+            colors = listOf(Color.Transparent, color),
+            startX = size.width - fadeLength,
+            endX = size.width,
+        )
+    drawRect(
+        brush = brush,
+        topLeft = Offset(size.width - fadeLength, 0f),
+        size = Size(fadeLength.toFloat(), size.height),
+    )
+}
+
+/**
+ * Returns `true` if at least [minimumVisibleRatio] of the text width fits within the given
+ * [maxAvailableWidthPx].
+ */
+@Composable
+private fun isSufficientlyVisible(
+    maxAvailableWidthPx: Float,
+    minimumVisibleRatio: Float,
+    textLayoutResult: TextLayoutResult,
+): Boolean {
+    val widthPx = textLayoutResult.size.width
+
+    return (maxAvailableWidthPx / widthPx) > minimumVisibleRatio
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt
index a747abb..1c14d33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChronometerText.kt
@@ -28,17 +28,11 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.Measurable
-import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.node.LayoutModifierNode
-import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.constrain
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.compose.LocalLifecycleOwner
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.statusbar.chips.ui.compose.modifiers.neverDecreaseWidth
 import kotlinx.coroutines.delay
 
 /** Platform-optimized interface for getting current time */
@@ -97,35 +91,3 @@
         modifier = modifier.neverDecreaseWidth(),
     )
 }
-
-/** A modifier that ensures the width of the content only increases and never decreases. */
-private fun Modifier.neverDecreaseWidth(): Modifier {
-    return this.then(neverDecreaseWidthElement)
-}
-
-private data object neverDecreaseWidthElement : ModifierNodeElement<NeverDecreaseWidthNode>() {
-    override fun create(): NeverDecreaseWidthNode {
-        return NeverDecreaseWidthNode()
-    }
-
-    override fun update(node: NeverDecreaseWidthNode) {
-        error("This should never be called")
-    }
-}
-
-private class NeverDecreaseWidthNode : Modifier.Node(), LayoutModifierNode {
-    private var minWidth = 0
-
-    override fun MeasureScope.measure(
-        measurable: Measurable,
-        constraints: Constraints,
-    ): MeasureResult {
-        val placeable = measurable.measure(Constraints(minWidth = minWidth).constrain(constraints))
-        val width = placeable.width
-        val height = placeable.height
-
-        minWidth = maxOf(minWidth, width)
-
-        return layout(width, height) { placeable.place(0, 0) }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/modifiers/NeverDecreaseWidth.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/modifiers/NeverDecreaseWidth.kt
new file mode 100644
index 0000000..505a5fc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/modifiers/NeverDecreaseWidth.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.statusbar.chips.ui.compose.modifiers
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.node.LayoutModifierNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.constrain
+
+/** A modifier that ensures the width of the content only increases and never decreases. */
+fun Modifier.neverDecreaseWidth(): Modifier {
+    return this.then(neverDecreaseWidthElement)
+}
+
+private data object neverDecreaseWidthElement : ModifierNodeElement<NeverDecreaseWidthNode>() {
+    override fun create(): NeverDecreaseWidthNode {
+        return NeverDecreaseWidthNode()
+    }
+
+    override fun update(node: NeverDecreaseWidthNode) {
+        error("This should never be called")
+    }
+}
+
+private class NeverDecreaseWidthNode : Modifier.Node(), LayoutModifierNode {
+    private var minWidth = 0
+
+    override fun MeasureScope.measure(
+        measurable: Measurable,
+        constraints: Constraints,
+    ): MeasureResult {
+        val placeable = measurable.measure(Constraints(minWidth = minWidth).constrain(constraints))
+        val width = placeable.width
+        val height = placeable.height
+
+        minWidth = maxOf(minWidth, width)
+
+        return layout(width, height) { placeable.place(0, 0) }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index 254b792..d327fc2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.statusbar.dagger;
 
-import static com.android.systemui.Flags.predictiveBackAnimateDialogs;
-
 import android.content.Context;
 import android.os.Handler;
 import android.os.RemoteException;
@@ -28,7 +26,6 @@
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.CoreStartable;
 import com.android.systemui.animation.ActivityTransitionAnimator;
-import com.android.systemui.animation.AnimationFeatureFlags;
 import com.android.systemui.animation.DialogTransitionAnimator;
 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
 import com.android.systemui.dagger.SysUISingleton;
@@ -226,8 +223,7 @@
             IDreamManager dreamManager,
             KeyguardStateController keyguardStateController,
             Lazy<AlternateBouncerInteractor> alternateBouncerInteractor,
-            InteractionJankMonitor interactionJankMonitor,
-            AnimationFeatureFlags animationFeatureFlags) {
+            InteractionJankMonitor interactionJankMonitor) {
         DialogTransitionAnimator.Callback callback = new DialogTransitionAnimator.Callback() {
             @Override
             public boolean isDreaming() {
@@ -249,19 +245,6 @@
                 return alternateBouncerInteractor.get().canShowAlternateBouncerForFingerprint();
             }
         };
-        return new DialogTransitionAnimator(
-                mainExecutor, callback, interactionJankMonitor, animationFeatureFlags);
-    }
-
-    /** */
-    @Provides
-    @SysUISingleton
-    static AnimationFeatureFlags provideAnimationFeatureFlags() {
-        return new AnimationFeatureFlags() {
-            @Override
-            public boolean isPredictiveBackQsDialogAnim() {
-                return predictiveBackAnimateDialogs();
-            }
-        };
+        return new DialogTransitionAnimator(mainExecutor, callback, interactionJankMonitor);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
index 46c84fbc..eff959d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
@@ -27,12 +27,12 @@
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.data.StatusBarDataLayerModule
 import com.android.systemui.statusbar.data.repository.LightBarControllerStore
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProviderImpl
 import com.android.systemui.statusbar.phone.AutoHideController
 import com.android.systemui.statusbar.phone.AutoHideControllerImpl
 import com.android.systemui.statusbar.phone.LightBarController
 import com.android.systemui.statusbar.phone.LightBarControllerImpl
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl
 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLog
@@ -91,9 +91,7 @@
         @SysUISingleton
         @IntoMap
         @ClassKey(OngoingCallController::class)
-        fun ongoingCallController(
-            controller: OngoingCallController
-        ): CoreStartable =
+        fun ongoingCallController(controller: OngoingCallController): CoreStartable =
             if (StatusBarChipsModernization.isEnabled) {
                 CoreStartable.NOP
             } else {
@@ -104,9 +102,7 @@
         @SysUISingleton
         @IntoMap
         @ClassKey(OngoingCallInteractor::class)
-        fun ongoingCallInteractor(
-            interactor: OngoingCallInteractor
-        ): CoreStartable =
+        fun ongoingCallInteractor(interactor: OngoingCallInteractor): CoreStartable =
             if (StatusBarChipsModernization.isEnabled) {
                 interactor
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/model/StatusBarAppearance.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/model/StatusBarAppearance.kt
index 0cd31d0..b7b91fa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/model/StatusBarAppearance.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/model/StatusBarAppearance.kt
@@ -17,7 +17,7 @@
 package com.android.systemui.statusbar.data.model
 
 import com.android.internal.view.AppearanceRegion
-import com.android.systemui.statusbar.phone.BoundsPair
+import com.android.systemui.statusbar.layout.BoundsPair
 
 /** Keeps track of various parameters coordinating the appearance of the status bar. */
 data class StatusBarAppearance(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
index 554c46f..5ea1211 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
@@ -28,8 +28,8 @@
 import com.android.systemui.display.data.repository.PerDisplayStoreImpl
 import com.android.systemui.display.data.repository.SingleDisplayStore
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProviderImpl
 import dagger.Lazy
 import dagger.Module
 import dagger.Provides
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
index 22c37df..7fa9f0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt
@@ -33,9 +33,9 @@
 import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener
 import com.android.systemui.statusbar.data.model.StatusBarAppearance
 import com.android.systemui.statusbar.data.model.StatusBarMode
-import com.android.systemui.statusbar.phone.BoundsPair
-import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
-import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
+import com.android.systemui.statusbar.layout.BoundsPair
+import com.android.systemui.statusbar.layout.LetterboxAppearanceCalculator
+import com.android.systemui.statusbar.layout.StatusBarBoundsProvider
 import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent
 import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
 import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
@@ -209,9 +209,7 @@
     override val ongoingProcessRequiresStatusBarVisible =
         _ongoingProcessRequiresStatusBarVisible.asStateFlow()
 
-    override fun setOngoingProcessRequiresStatusBarVisible(
-        requiredVisible: Boolean
-    ) {
+    override fun setOngoingProcessRequiresStatusBarVisible(requiredVisible: Boolean) {
         _ongoingProcessRequiresStatusBarVisible.value = requiredVisible
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
index f7bc23c..63410d746 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
@@ -41,8 +41,8 @@
 import com.android.systemui.statusbar.events.PrivacyDotCorner.BottomRight
 import com.android.systemui.statusbar.events.PrivacyDotCorner.TopLeft
 import com.android.systemui.statusbar.events.PrivacyDotCorner.TopRight
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsChangedListener
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.leak.RotationUtils
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
index 1038ad4..70632b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt
@@ -36,8 +36,8 @@
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsChangedListener
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.window.StatusBarWindowController
 import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
 import com.android.systemui.util.animation.AnimationUtil.Companion.frames
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculator.kt
similarity index 87%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculator.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculator.kt
index 231a8c6..1469fe7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxAppearanceCalculator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxAppearanceCalculator.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.annotation.ColorInt
 import android.content.Context
@@ -39,7 +39,7 @@
 ) {
     override fun toString(): String {
         val appearanceString =
-                ViewDebug.flagsToString(InsetsFlags::class.java, "appearance", appearance)
+            ViewDebug.flagsToString(InsetsFlags::class.java, "appearance", appearance)
         return "LetterboxAppearance{$appearanceString, $appearanceRegions}"
     }
 }
@@ -57,14 +57,16 @@
     private val letterboxBackgroundProvider: LetterboxBackgroundProvider,
 ) : Dumpable {
 
-    private val darkAppearanceIconColor = context.getColor(
-        // For a dark background status bar, use a *light* icon color.
-        com.android.settingslib.R.color.light_mode_icon_color_single_tone
-    )
-    private val lightAppearanceIconColor = context.getColor(
-        // For a light background status bar, use a *dark* icon color.
-        com.android.settingslib.R.color.dark_mode_icon_color_single_tone
-    )
+    private val darkAppearanceIconColor =
+        context.getColor(
+            // For a dark background status bar, use a *light* icon color.
+            com.android.settingslib.R.color.light_mode_icon_color_single_tone
+        )
+    private val lightAppearanceIconColor =
+        context.getColor(
+            // For a light background status bar, use a *dark* icon color.
+            com.android.settingslib.R.color.dark_mode_icon_color_single_tone
+        )
 
     init {
         dumpManager.registerCriticalDumpable(this)
@@ -85,7 +87,11 @@
         lastAppearanceRegions = originalAppearanceRegions
         lastLetterboxes = letterboxes
         return getLetterboxAppearanceInternal(
-                letterboxes, originalAppearance, originalAppearanceRegions, statusBarBounds)
+                letterboxes,
+                originalAppearance,
+                originalAppearanceRegions,
+                statusBarBounds,
+            )
             .also { lastLetterboxAppearance = it }
     }
 
@@ -118,7 +124,7 @@
 
     private fun getAppearanceRegions(
         originalAppearanceRegions: List<AppearanceRegion>,
-        letterboxes: List<LetterboxDetails>
+        letterboxes: List<LetterboxDetails>,
     ): List<AppearanceRegion> {
         return sanitizeAppearanceRegions(originalAppearanceRegions, letterboxes) +
             getAllOuterAppearanceRegions(letterboxes)
@@ -126,7 +132,7 @@
 
     private fun sanitizeAppearanceRegions(
         originalAppearanceRegions: List<AppearanceRegion>,
-        letterboxes: List<LetterboxDetails>
+        letterboxes: List<LetterboxDetails>,
     ): List<AppearanceRegion> =
         originalAppearanceRegions.map { appearanceRegion ->
             val matchingLetterbox =
@@ -138,17 +144,20 @@
                 // full bounds of its window.
                 // Here we want the bounds to be only for the inner bounds of the letterboxed app.
                 AppearanceRegion(
-                    appearanceRegion.appearance, matchingLetterbox.letterboxInnerBounds)
+                    appearanceRegion.appearance,
+                    matchingLetterbox.letterboxInnerBounds,
+                )
             }
         }
 
     private fun originalAppearanceWithScrim(
         @Appearance originalAppearance: Int,
-        originalAppearanceRegions: List<AppearanceRegion>
+        originalAppearanceRegions: List<AppearanceRegion>,
     ): LetterboxAppearance {
         return LetterboxAppearance(
             originalAppearance or APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS,
-            originalAppearanceRegions)
+            originalAppearanceRegions,
+        )
     }
 
     @Appearance
@@ -215,7 +224,9 @@
            lastAppearanceRegion: $lastAppearanceRegions,
            lastLetterboxes: $lastLetterboxes,
            lastLetterboxAppearance: $lastLetterboxAppearance
-       """.trimIndent())
+       """
+                .trimIndent()
+        )
     }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxBackgroundProvider.kt
similarity index 93%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProvider.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxBackgroundProvider.kt
index 34c7059e..3d8ced1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/layout/LetterboxBackgroundProvider.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.annotation.ColorInt
 import android.app.WallpaperManager
@@ -49,9 +49,7 @@
         private set
 
     private val wallpaperColorsListener =
-        WallpaperManager.OnColorsChangedListener { _, _ ->
-            fetchBackgroundColorInfo()
-        }
+        WallpaperManager.OnColorsChangedListener { _, _ -> fetchBackgroundColorInfo() }
 
     override fun start() {
         fetchBackgroundColorInfo()
@@ -75,6 +73,8 @@
             """
            letterboxBackgroundColor: ${Color.valueOf(letterboxBackgroundColor)}
            isLetterboxBackgroundMultiColored: $isLetterboxBackgroundMultiColored
-       """.trimIndent())
+       """
+                .trimIndent()
+        )
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarBoundsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarBoundsProvider.kt
similarity index 98%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarBoundsProvider.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarBoundsProvider.kt
index 3ac0bac..ac5b037 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarBoundsProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarBoundsProvider.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.graphics.Rect
 import android.view.View
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt
similarity index 99%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt
index 41db5f4..f7a9094 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.annotation.Px
 import android.content.Context
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 9766f9e..071d232 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -2663,12 +2663,6 @@
     }
 
     @Override
-    public int getHeadsUpInset() {
-        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return 0;
-        return mHeadsUpInset;
-    }
-
-    @Override
     public int getStackBottomInset() {
         return mPaddingBetweenElements + mShelf.getIntrinsicHeight();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
index 5249a6d..d302fb6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
@@ -106,9 +106,6 @@
     /** Sets whether the view is displayed in pulsing mode. */
     fun setPulsing(pulsing: Boolean, animated: Boolean)
 
-    /** Gets the inset for HUNs when they are not visible */
-    fun getHeadsUpInset(): Int
-
     /**
      * Signals that any open Notification guts should be closed, as scene container is handling
      * touch events.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index aba30d2..1474789 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -851,10 +851,6 @@
         mLightRevealScrim = lightRevealScrim;
 
         mViewCaptureAwareWindowManager = viewCaptureAwareWindowManager;
-
-        if (PredictiveBackSysUiFlag.isEnabled()) {
-            mContext.getApplicationInfo().setEnableOnBackInvokedCallback(true);
-        }
     }
 
     private void initBubbles(Bubbles bubbles) {
@@ -3031,9 +3027,6 @@
         public void onConfigChanged(Configuration newConfig) {
             updateResources();
             updateDisplaySize(); // populates mDisplayMetrics
-            if (PredictiveBackSysUiFlag.isEnabled()) {
-                mContext.getApplicationInfo().setEnableOnBackInvokedCallback(true);
-            }
 
             if (DEBUG) {
                 Log.v(TAG, "configuration changed: " + mContext.getResources().getConfiguration());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 6a77988..a339bc9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -47,6 +47,7 @@
 import com.android.systemui.battery.BatteryMeterView;
 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
 import com.android.systemui.res.R;
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider;
 import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange;
 import com.android.systemui.statusbar.phone.ui.TintedIconManager;
 import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index 6028f17..4c2bfe5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -64,6 +64,7 @@
 import com.android.systemui.statusbar.disableflags.DisableStateTracker;
 import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider;
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.PropertyAnimator;
 import com.android.systemui.statusbar.notification.stack.AnimationProperties;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxModule.kt
index 2e3f0d0..1e6a0f8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxModule.kt
@@ -18,6 +18,7 @@
 package com.android.systemui.statusbar.phone
 
 import com.android.systemui.CoreStartable
+import com.android.systemui.statusbar.layout.LetterboxBackgroundProvider
 import dagger.Binds
 import dagger.Module
 import dagger.multibindings.ClassKey
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java
index ca0c1ac9..0a28551 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarControllerImpl.java
@@ -44,6 +44,7 @@
 import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore;
 import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository;
 import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore;
+import com.android.systemui.statusbar.layout.BoundsPair;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.util.Compile;
 import com.android.systemui.util.kotlin.JavaAdapterKt;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
index ccd1b6c..aa13089 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
@@ -46,6 +46,7 @@
 import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.policy.Clock
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.statusbar.window.StatusBarWindowStateController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.kt
deleted file mode 100644
index 74d6ba5..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.statusbar.phone
-
-import com.android.systemui.Flags
-import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.RefactorFlagUtils
-
-/** Helper for reading or using the predictive back flag state. */
-@Suppress("NOTHING_TO_INLINE")
-object PredictiveBackSysUiFlag {
-    /** The aconfig flag name */
-    const val FLAG_NAME = Flags.FLAG_PREDICTIVE_BACK_SYSUI
-
-    /** A token used for dependency declaration */
-    val token: FlagToken
-        get() = FlagToken(FLAG_NAME, isEnabled)
-
-    /** Is the refactor enabled */
-    @JvmStatic
-    inline val isEnabled
-        get() = Flags.predictiveBackSysui()
-
-    /**
-     * Called to ensure code is only run when the flag is enabled. This protects users from the
-     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
-     * build to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun isUnexpectedlyInLegacyMode() =
-        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
-
-    /**
-     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
-     * the flag is enabled to ensure that the refactor author catches issues in testing.
-     */
-    @JvmStatic
-    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 3749b96..8443edd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -18,7 +18,6 @@
 
 import static android.view.WindowInsets.Type.navigationBars;
 
-import static com.android.systemui.Flags.predictiveBackAnimateBouncer;
 import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN;
 import static com.android.systemui.plugins.ActivityStarter.OnDismissAction;
 import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
@@ -328,7 +327,6 @@
     private float mQsExpansion;
 
     final Set<KeyguardViewManagerCallback> mCallbacks = new HashSet<>();
-    private boolean mIsBackAnimationEnabled;
     private final UdfpsOverlayInteractor mUdfpsOverlayInteractor;
     private final ActivityStarter mActivityStarter;
 
@@ -434,7 +432,6 @@
                 .map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null);
         mAlternateBouncerInteractor = alternateBouncerInteractor;
         mBouncerInteractor = bouncerInteractor;
-        mIsBackAnimationEnabled = predictiveBackAnimateBouncer();
         mUdfpsOverlayInteractor = udfpsOverlayInteractor;
         mActivityStarter = activityStarter;
         mKeyguardTransitionInteractor = keyguardTransitionInteractor;
@@ -630,7 +627,7 @@
 
     private boolean shouldPlayBackAnimation() {
         // Suppress back animation when bouncer shouldn't be dismissed on back invocation.
-        return !needsFullscreenBouncer() && mIsBackAnimationEnabled;
+        return !needsFullscreenBouncer();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 03324d2..c47ed17 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.statusbar.phone;
 
-import static com.android.systemui.Flags.predictiveBackAnimateDialogs;
-
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.BroadcastReceiver;
@@ -285,15 +283,13 @@
         for (int i = 0; i < mOnCreateRunnables.size(); i++) {
             mOnCreateRunnables.get(i).run();
         }
-        if (predictiveBackAnimateDialogs()) {
-            View targetView = getWindow().getDecorView();
-            DialogKt.registerAnimationOnBackInvoked(
-                    /* dialog = */ this,
-                    /* targetView = */ targetView,
-                    /* backAnimationSpec= */mDelegate.getBackAnimationSpec(
-                            () -> targetView.getResources().getDisplayMetrics())
-            );
-        }
+        View targetView = getWindow().getDecorView();
+        DialogKt.registerAnimationOnBackInvoked(
+                /* dialog = */ this,
+                /* targetView = */ targetView,
+                /* backAnimationSpec= */mDelegate.getBackAnimationSpec(
+                        () -> targetView.getResources().getDisplayMetrics())
+        );
     }
 
     private void updateWindowSize() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
index 5837752..7207d0a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
@@ -21,13 +21,13 @@
 import com.android.systemui.dagger.qualifiers.RootView;
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController;
+import com.android.systemui.statusbar.layout.StatusBarBoundsProvider;
 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor;
 import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
 import com.android.systemui.statusbar.phone.LegacyLightsOutNotifController;
 import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions;
 import com.android.systemui.statusbar.phone.PhoneStatusBarView;
 import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
-import com.android.systemui.statusbar.phone.StatusBarBoundsProvider;
 import com.android.systemui.statusbar.phone.StatusBarDemoMode;
 import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
 import com.android.systemui.statusbar.window.StatusBarWindowController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarStartablesModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarStartablesModule.kt
index ba91814..b56a9a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarStartablesModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarStartablesModule.kt
@@ -16,7 +16,7 @@
 
 package com.android.systemui.statusbar.phone.fragment.dagger
 
-import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
+import com.android.systemui.statusbar.layout.StatusBarBoundsProvider
 import dagger.Binds
 import dagger.Module
 import dagger.multibindings.IntoSet
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
index 12ed647..fdc2d8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt
@@ -16,8 +16,8 @@
 
 package com.android.systemui.statusbar.policy.domain.interactor
 
-import android.app.NotificationManager.INTERRUPTION_FILTER_NONE
 import android.content.Context
+import android.media.AudioManager
 import android.provider.Settings
 import android.provider.Settings.Secure.ZEN_DURATION_FOREVER
 import android.provider.Settings.Secure.ZEN_DURATION_PROMPT
@@ -29,6 +29,7 @@
 import com.android.settingslib.notification.modes.ZenIcon
 import com.android.settingslib.notification.modes.ZenIconLoader
 import com.android.settingslib.notification.modes.ZenMode
+import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.modes.shared.ModesUi
 import com.android.systemui.shared.notifications.data.repository.NotificationSettingsRepository
@@ -67,6 +68,17 @@
     deviceProvisioningRepository: DeviceProvisioningRepository,
     userSetupRepository: UserSetupRepository,
 ) {
+    /**
+     * List of predicates to determine if the [ZenMode] blocks an audio stream. Typical use case
+     * would be: `zenModeByStreamPredicates[stream](zenMode)`
+     */
+    private val zenModeByStreamPredicates =
+        mapOf<Int, (ZenMode) -> Boolean>(
+            AudioManager.STREAM_MUSIC to { it.policy.priorityCategoryMedia == STATE_DISALLOW },
+            AudioManager.STREAM_ALARM to { it.policy.priorityCategoryAlarms == STATE_DISALLOW },
+            AudioManager.STREAM_SYSTEM to { it.policy.priorityCategorySystem == STATE_DISALLOW },
+        )
+
     val isZenAvailable: Flow<Boolean> =
         combine(
             deviceProvisioningRepository.isDeviceProvisioned,
@@ -125,21 +137,16 @@
             .flowOn(bgDispatcher)
             .distinctUntilChanged()
 
-    val activeModesBlockingEverything: Flow<ActiveZenModes> = getFilteredActiveModesFlow { mode ->
-        mode.interruptionFilter == INTERRUPTION_FILTER_NONE
-    }
+    fun canBeBlockedByZenMode(stream: AudioStream): Boolean =
+        zenModeByStreamPredicates.containsKey(stream.value)
 
-    val activeModesBlockingMedia: Flow<ActiveZenModes> = getFilteredActiveModesFlow { mode ->
-        mode.policy.priorityCategoryMedia == STATE_DISALLOW
-    }
-
-    val activeModesBlockingAlarms: Flow<ActiveZenModes> = getFilteredActiveModesFlow { mode ->
-        mode.policy.priorityCategoryAlarms == STATE_DISALLOW
-    }
-
-    private fun getFilteredActiveModesFlow(predicate: (ZenMode) -> Boolean): Flow<ActiveZenModes> {
+    fun activeModesBlockingStream(stream: AudioStream): Flow<ActiveZenModes> {
+        val isBlockingStream = zenModeByStreamPredicates[stream.value]
+        require(isBlockingStream != null) {
+            "$stream is unsupported. Use canBeBlockedByZenMode to check if the stream can be affected by the Zen Mode."
+        }
         return modes
-            .map { modes -> modes.filter { mode -> predicate(mode) } }
+            .map { modes -> modes.filter { isBlockingStream(it) } }
             .map { modes -> buildActiveZenModes(modes) }
             .flowOn(bgDispatcher)
             .distinctUntilChanged()
@@ -194,7 +201,6 @@
                         )
                         null
                     }
-
                     ZEN_DURATION_FOREVER -> null
                     else -> Duration.ofMinutes(zenDuration.toLong())
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt
index 1e043ec..ecfcb29 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt
@@ -23,7 +23,7 @@
 import com.android.systemui.animation.ActivityTransitionAnimator
 import com.android.systemui.fragments.FragmentHostManager
 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import java.util.Optional
 
 /** Encapsulates all logic for the status bar window state management. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java
index 848e91d..8518acb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java
@@ -58,7 +58,7 @@
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays;
 import com.android.systemui.statusbar.core.StatusBarRootModernization;
 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController;
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider;
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider;
 import com.android.systemui.statusbar.window.StatusBarWindowModule.InternalWindowViewInflater;
 import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
 import com.android.systemui.unfold.util.JankMonitorTransitionProgressListener;
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
index a6c0665..c43f31b 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
@@ -30,9 +30,15 @@
 import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
 import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker
 import com.android.systemui.touchpad.tutorial.ui.view.TouchpadTutorialActivity
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureRecognizerProvider
 import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel
 import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggRecognizerProvider
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.GestureRecognizerAdapter
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureRecognizerProvider
 import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureRecognizerProvider
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureScreenViewModel
 import dagger.Binds
 import dagger.Module
 import dagger.Provides
@@ -53,14 +59,46 @@
         fun touchpadScreensProvider(
             backGestureScreenViewModel: BackGestureScreenViewModel,
             homeGestureScreenViewModel: HomeGestureScreenViewModel,
+            easterEggGestureViewModel: EasterEggGestureViewModel,
         ): TouchpadTutorialScreensProvider {
             return ScreensProvider(
                 backGestureScreenViewModel,
                 homeGestureScreenViewModel,
-                EasterEggGestureViewModel(),
+                easterEggGestureViewModel,
             )
         }
 
+        @Provides
+        fun recentAppsViewModel(
+            recognizerProvider: RecentAppsGestureRecognizerProvider,
+            adapterFactory: GestureRecognizerAdapter.Factory,
+        ): RecentAppsGestureScreenViewModel {
+            return RecentAppsGestureScreenViewModel(adapterFactory.create(recognizerProvider))
+        }
+
+        @Provides
+        fun backViewModel(
+            recognizerProvider: BackGestureRecognizerProvider,
+            adapterFactory: GestureRecognizerAdapter.Factory,
+        ): BackGestureScreenViewModel {
+            return BackGestureScreenViewModel(adapterFactory.create(recognizerProvider))
+        }
+
+        @Provides
+        fun homeViewModel(
+            recognizerProvider: HomeGestureRecognizerProvider,
+            adapterFactory: GestureRecognizerAdapter.Factory,
+        ): HomeGestureScreenViewModel {
+            return HomeGestureScreenViewModel(adapterFactory.create(recognizerProvider))
+        }
+
+        @Provides
+        fun easterEggViewModel(
+            adapterFactory: GestureRecognizerAdapter.Factory
+        ): EasterEggGestureViewModel {
+            return EasterEggGestureViewModel(adapterFactory.create(EasterEggRecognizerProvider()))
+        }
+
         @SysUISingleton
         @Provides
         fun touchpadGesturesInteractor(
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt
deleted file mode 100644
index 23e31b0..0000000
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.gesture
-
-import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-
-class GestureFlowAdapter(gestureRecognizer: GestureRecognizer) {
-
-    val gestureStateAsFlow: Flow<GestureState> = conflatedCallbackFlow {
-        val callback: (GestureState) -> Unit = { trySend(it) }
-        gestureRecognizer.addGestureStateCallback(callback)
-        awaitClose { gestureRecognizer.clearGestureStateCallback() }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt
index bddeb0b..b4b8ff0 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/TouchpadEventsFilter.kt
@@ -20,6 +20,7 @@
 import android.view.MotionEvent
 import android.view.MotionEvent.ACTION_DOWN
 import android.view.MotionEvent.BUTTON_PRIMARY
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.GestureRecognizerAdapter
 
 object TouchpadEventsFilter {
 
@@ -42,3 +43,12 @@
         false
     }
 }
+
+fun GestureRecognizerAdapter.handleTouchpadMotionEvent(event: MotionEvent): Boolean {
+    return if (TouchpadEventsFilter.isTouchpadAndNonClickEvent(event)) {
+        this.accept(event)
+        true
+    } else {
+        false
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
index cefe382..3264300 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt
@@ -58,6 +58,7 @@
     private val backGestureViewModel: BackGestureScreenViewModel,
     private val homeGestureViewModel: HomeGestureScreenViewModel,
     private val recentAppsGestureViewModel: RecentAppsGestureScreenViewModel,
+    private val easterEggGestureViewModel: EasterEggGestureViewModel,
 ) : ComponentActivity() {
 
     private val tutorialViewModel by
@@ -74,7 +75,7 @@
                     backGestureViewModel,
                     homeGestureViewModel,
                     recentAppsGestureViewModel,
-                    EasterEggGestureViewModel(),
+                    easterEggGestureViewModel,
                     closeTutorial = ::finishTutorial,
                 )
             }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureRecognizerProvider.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureRecognizerProvider.kt
new file mode 100644
index 0000000..b089882
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureRecognizerProvider.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
+
+class BackGestureRecognizerProvider @Inject constructor(val resources: TouchpadGestureResources) :
+    GestureRecognizerProvider {
+
+    override val recognizer: Flow<GestureRecognizer> =
+        resources.distanceThreshold().map { distance ->
+            BackGestureRecognizer(gestureDistanceThresholdPx = distance)
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt
index 93e8d31..8e53669a 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/BackGestureScreenViewModel.kt
@@ -17,47 +17,26 @@
 package com.android.systemui.touchpad.tutorial.ui.viewmodel
 
 import android.view.MotionEvent
-import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.res.R
 import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState
 import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState
-import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer
 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter
 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
 import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent
 import com.android.systemui.util.kotlin.pairwiseBy
-import javax.inject.Inject
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flatMapLatest
 
-class BackGestureScreenViewModel
-@Inject
-constructor(configurationInteractor: ConfigurationInteractor) : TouchpadTutorialScreenViewModel {
+class BackGestureScreenViewModel(val gestureRecognizer: GestureRecognizerAdapter) :
+    TouchpadTutorialScreenViewModel {
 
-    private var recognizer: BackGestureRecognizer? = null
-
-    private val distanceThreshold: Flow<Int> =
-        configurationInteractor
-            .dimensionPixelSize(R.dimen.touchpad_tutorial_gestures_distance_threshold)
-            .distinctUntilChanged()
-
-    @OptIn(ExperimentalCoroutinesApi::class)
     override val gestureUiState: Flow<GestureUiState> =
-        distanceThreshold
-            .flatMapLatest {
-                recognizer = BackGestureRecognizer(gestureDistanceThresholdPx = it)
-                GestureFlowAdapter(recognizer!!).gestureStateAsFlow
-            }
-            .pairwiseBy(GestureState.NotStarted) { previous, current ->
-                toGestureUiState(current, previous)
-            }
+        gestureRecognizer.gestureState.pairwiseBy(GestureState.NotStarted) { previous, current ->
+            toGestureUiState(current, previous)
+        }
 
     override fun handleEvent(event: MotionEvent): Boolean {
-        return recognizer?.handleTouchpadMotionEvent(event) ?: false
+        return gestureRecognizer.handleTouchpadMotionEvent(event)
     }
 
     private fun toGestureUiState(current: GestureState, previous: GestureState): GestureUiState {
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt
index 69cdab6..9ca456d 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggGestureViewModel.kt
@@ -17,8 +17,6 @@
 package com.android.systemui.touchpad.tutorial.ui.viewmodel
 
 import android.view.MotionEvent
-import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureRecognizer
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter
 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
 import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent
 import java.util.function.Consumer
@@ -29,14 +27,10 @@
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.receiveAsFlow
 
-class EasterEggGestureViewModel(
-    private val gestureRecognizer: EasterEggGestureRecognizer = EasterEggGestureRecognizer()
-) : Consumer<MotionEvent> {
+class EasterEggGestureViewModel(val gestureRecognizer: GestureRecognizerAdapter) :
+    Consumer<MotionEvent> {
 
-    private val gestureDone =
-        GestureFlowAdapter(gestureRecognizer).gestureStateAsFlow.filter {
-            it == GestureState.Finished
-        }
+    private val gestureDone = gestureRecognizer.gestureState.filter { it == GestureState.Finished }
 
     private val easterEggFinished = Channel<Unit>()
 
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggRecognizerProvider.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggRecognizerProvider.kt
new file mode 100644
index 0000000..c48ccb5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/EasterEggRecognizerProvider.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+
+class EasterEggRecognizerProvider : GestureRecognizerProvider {
+
+    override val recognizer: Flow<GestureRecognizer> =
+        MutableStateFlow(EasterEggGestureRecognizer())
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerAdapter.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerAdapter.kt
new file mode 100644
index 0000000..8e7375f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerAdapter.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import android.view.MotionEvent
+import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import java.util.function.Consumer
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flatMapLatest
+
+/**
+ * Adapter for [GestureRecognizer] exposing [GestureState] as Flow and ensuring that motion events
+ * are always handled by latest [GestureRecognizer].
+ */
+class GestureRecognizerAdapter
+@AssistedInject
+constructor(
+    @Assisted provider: GestureRecognizerProvider,
+    private val logger: InputDeviceTutorialLogger,
+) : Consumer<MotionEvent> {
+
+    private var gestureRecognizer: GestureRecognizer? = null
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    val gestureState: Flow<GestureState> =
+        provider.recognizer.flatMapLatest {
+            gestureRecognizer = it
+            gestureStateAsFlow(it)
+        }
+
+    override fun accept(event: MotionEvent) {
+        if (gestureRecognizer == null) {
+            logger.w("sending MotionEvent before gesture recognizer is initialized")
+        } else {
+            gestureRecognizer?.accept(event)
+        }
+    }
+
+    private fun gestureStateAsFlow(recognizer: GestureRecognizer): Flow<GestureState> =
+        conflatedCallbackFlow {
+            val callback: (GestureState) -> Unit = { trySend(it) }
+            recognizer.addGestureStateCallback(callback)
+            awaitClose { recognizer.clearGestureStateCallback() }
+        }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(provider: GestureRecognizerProvider): GestureRecognizerAdapter
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerProvider.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerProvider.kt
new file mode 100644
index 0000000..585bc0c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/GestureRecognizerProvider.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import kotlinx.coroutines.flow.Flow
+
+/** Observes state of the system and provides always up-to-date [GestureRecognizer] */
+interface GestureRecognizerProvider {
+    val recognizer: Flow<GestureRecognizer>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureRecognizerProvider.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureRecognizerProvider.kt
new file mode 100644
index 0000000..6d818a6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureRecognizerProvider.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import com.android.systemui.res.R
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.HomeGestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+
+class HomeGestureRecognizerProvider
+@Inject
+constructor(val resources: TouchpadGestureResources, val velocityTracker: VelocityTracker) :
+    GestureRecognizerProvider {
+
+    override val recognizer: Flow<GestureRecognizer> =
+        resources
+            .distanceThreshold()
+            .combine(
+                resources.velocityThreshold(R.dimen.touchpad_home_gesture_velocity_threshold),
+                { distance, velocity -> distance to velocity },
+            )
+            .map { (distance, velocity) ->
+                HomeGestureRecognizer(
+                    gestureDistanceThresholdPx = distance,
+                    velocityThresholdPxPerMs = velocity,
+                    velocityTracker = velocityTracker,
+                )
+            }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt
index 9a817d8..9d6f568 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/HomeGestureScreenViewModel.kt
@@ -16,70 +16,27 @@
 
 package com.android.systemui.touchpad.tutorial.ui.viewmodel
 
-import android.content.res.Resources
 import android.view.MotionEvent
-import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
-import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.res.R
 import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState
 import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
-import com.android.systemui.touchpad.tutorial.ui.gesture.HomeGestureRecognizer
-import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
-import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker
 import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent
-import javax.inject.Inject
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.map
 
-class HomeGestureScreenViewModel
-@Inject
-constructor(
-    val configurationInteractor: ConfigurationInteractor,
-    @Main val resources: Resources,
-    val velocityTracker: VelocityTracker = VerticalVelocityTracker(),
-) : TouchpadTutorialScreenViewModel {
+class HomeGestureScreenViewModel(private val gestureRecognizer: GestureRecognizerAdapter) :
+    TouchpadTutorialScreenViewModel {
 
-    private var recognizer: HomeGestureRecognizer? = null
-
-    private val distanceThreshold: Flow<Int> =
-        configurationInteractor
-            .dimensionPixelSize(R.dimen.touchpad_tutorial_gestures_distance_threshold)
-            .distinctUntilChanged()
-
-    private val velocityThreshold: Flow<Float> =
-        configurationInteractor.onAnyConfigurationChange
-            .map { resources.getDimension(R.dimen.touchpad_home_gesture_velocity_threshold) }
-            .distinctUntilChanged()
-
-    @OptIn(ExperimentalCoroutinesApi::class)
     override val gestureUiState: Flow<GestureUiState> =
-        distanceThreshold
-            .combine(velocityThreshold, { distance, velocity -> distance to velocity })
-            .flatMapLatest { (distance, velocity) ->
-                recognizer =
-                    HomeGestureRecognizer(
-                        gestureDistanceThresholdPx = distance,
-                        velocityThresholdPxPerMs = velocity,
-                        velocityTracker = velocityTracker,
-                    )
-                GestureFlowAdapter(recognizer!!).gestureStateAsFlow
-            }
-            .map { toGestureUiState(it) }
-
-    private fun toGestureUiState(it: GestureState) =
-        it.toGestureUiState(
-            progressStartMarker = "drag with gesture",
-            progressEndMarker = "release playback realtime",
-            successAnimation = R.raw.trackpad_home_success,
-        )
+        gestureRecognizer.gestureState.map {
+            it.toGestureUiState(
+                progressStartMarker = "drag with gesture",
+                progressEndMarker = "release playback realtime",
+                successAnimation = R.raw.trackpad_home_success,
+            )
+        }
 
     override fun handleEvent(event: MotionEvent): Boolean {
-        return recognizer?.handleTouchpadMotionEvent(event) ?: false
+        return gestureRecognizer.handleTouchpadMotionEvent(event)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureRecognizerProvider.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureRecognizerProvider.kt
new file mode 100644
index 0000000..3e0b434
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureRecognizerProvider.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import com.android.systemui.res.R
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizer
+import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+
+class RecentAppsGestureRecognizerProvider
+@Inject
+constructor(val resources: TouchpadGestureResources, val velocityTracker: VelocityTracker) :
+    GestureRecognizerProvider {
+
+    override val recognizer: Flow<GestureRecognizer> =
+        resources
+            .distanceThreshold()
+            .combine(
+                resources.velocityThreshold(
+                    R.dimen.touchpad_recent_apps_gesture_velocity_threshold
+                ),
+                { distance, velocity -> distance to velocity },
+            )
+            .map { (distance, velocity) ->
+                RecentAppsGestureRecognizer(
+                    gestureDistanceThresholdPx = distance,
+                    velocityThresholdPxPerMs = velocity,
+                    velocityTracker = velocityTracker,
+                )
+            }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt
index 8215078..9752858 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/RecentAppsGestureScreenViewModel.kt
@@ -16,74 +16,27 @@
 
 package com.android.systemui.touchpad.tutorial.ui.viewmodel
 
-import android.content.res.Resources
 import android.view.MotionEvent
-import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
-import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.res.R
 import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState
 import com.android.systemui.touchpad.tutorial.ui.composable.toGestureUiState
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter
-import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
-import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizer
-import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
-import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker
 import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent
-import javax.inject.Inject
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.map
 
-class RecentAppsGestureScreenViewModel
-@Inject
-constructor(
-    configurationInteractor: ConfigurationInteractor,
-    @Main private val resources: Resources,
-    private val velocityTracker: VelocityTracker = VerticalVelocityTracker(),
-) : TouchpadTutorialScreenViewModel {
+class RecentAppsGestureScreenViewModel(private val gestureRecognizer: GestureRecognizerAdapter) :
+    TouchpadTutorialScreenViewModel {
 
-    private var recognizer: RecentAppsGestureRecognizer? = null
-
-    private val distanceThreshold: Flow<Int> =
-        configurationInteractor.onAnyConfigurationChange
-            .map {
-                resources.getDimensionPixelSize(
-                    R.dimen.touchpad_tutorial_gestures_distance_threshold
-                )
-            }
-            .distinctUntilChanged()
-
-    private val velocityThreshold: Flow<Float> =
-        configurationInteractor.onAnyConfigurationChange
-            .map { resources.getDimension(R.dimen.touchpad_recent_apps_gesture_velocity_threshold) }
-            .distinctUntilChanged()
-
-    @OptIn(ExperimentalCoroutinesApi::class)
     override val gestureUiState: Flow<GestureUiState> =
-        distanceThreshold
-            .combine(velocityThreshold, { distance, velocity -> distance to velocity })
-            .flatMapLatest { (distance, velocity) ->
-                recognizer =
-                    RecentAppsGestureRecognizer(
-                        gestureDistanceThresholdPx = distance,
-                        velocityThresholdPxPerMs = velocity,
-                        velocityTracker = velocityTracker,
-                    )
-                GestureFlowAdapter(recognizer!!).gestureStateAsFlow
-            }
-            .map { toGestureUiState(it) }
-
-    private fun toGestureUiState(it: GestureState) =
-        it.toGestureUiState(
-            progressStartMarker = "drag with gesture",
-            progressEndMarker = "onPause",
-            successAnimation = R.raw.trackpad_recent_apps_success,
-        )
+        gestureRecognizer.gestureState.map {
+            it.toGestureUiState(
+                progressStartMarker = "drag with gesture",
+                progressEndMarker = "onPause",
+                successAnimation = R.raw.trackpad_recent_apps_success,
+            )
+        }
 
     override fun handleEvent(event: MotionEvent): Boolean {
-        return recognizer?.handleTouchpadMotionEvent(event) ?: false
+        return gestureRecognizer.handleTouchpadMotionEvent(event)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadGestureResources.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadGestureResources.kt
new file mode 100644
index 0000000..3d99bd8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/viewmodel/TouchpadGestureResources.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.tutorial.ui.viewmodel
+
+import android.content.res.Resources
+import androidx.annotation.DimenRes
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+
+class TouchpadGestureResources
+@Inject
+constructor(val configurationInteractor: ConfigurationInteractor, @Main val resources: Resources) {
+
+    fun distanceThreshold(): Flow<Int> =
+        configurationInteractor.onAnyConfigurationChange
+            .map {
+                resources.getDimensionPixelSize(
+                    R.dimen.touchpad_tutorial_gestures_distance_threshold
+                )
+            }
+            .distinctUntilChanged()
+
+    fun velocityThreshold(@DimenRes resId: Int): Flow<Float> =
+        configurationInteractor.onAnyConfigurationChange
+            .map { resources.getDimension(resId) }
+            .distinctUntilChanged()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt
index 6597097..7d3966b 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt
@@ -17,8 +17,9 @@
 
 import android.content.Context
 import android.hardware.devicestate.DeviceStateManager
-import android.os.Trace
 import com.android.app.tracing.TraceStateLogger
+import com.android.app.tracing.coroutines.TrackTracer
+import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.systemui.CoreStartable
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -29,7 +30,6 @@
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineScope
-import com.android.app.tracing.coroutines.launchTraced as launch
 import kotlinx.coroutines.plus
 
 /**
@@ -45,7 +45,7 @@
     @Application applicationScope: CoroutineScope,
     @Background private val coroutineContext: CoroutineContext,
     private val deviceStateRepository: DeviceStateRepository,
-    private val deviceStateManager: DeviceStateManager
+    private val deviceStateManager: DeviceStateManager,
 ) : CoreStartable {
     private val isFoldable: Boolean = isDeviceFoldable(context.resources, deviceStateManager)
 
@@ -61,7 +61,7 @@
 
         bgScope.launch {
             foldStateRepository.hingeAngle.collect {
-                Trace.traceCounter(Trace.TRACE_TAG_APP, "hingeAngle", it.toInt())
+                TrackTracer.instantForGroup("unfold", "hingeAngle", it.toInt())
             }
         }
         bgScope.launch {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt
index fa108842..3b0c8a6 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/domain/interactor/VolumeDialogCallbacksInteractor.kt
@@ -46,7 +46,7 @@
 constructor(
     private val volumeDialogController: VolumeDialogController,
     @VolumeDialogPlugin private val coroutineScope: CoroutineScope,
-    @Background private val bgHandler: Handler,
+    @Background private val bgHandler: Handler?,
 ) {
 
     @SuppressLint("SharedFlowCreation") // event-bus needed
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt
index 88af210..940c79c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt
@@ -19,7 +19,6 @@
 import com.android.systemui.volume.dialog.sliders.domain.model.VolumeDialogSliderType
 import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogOverscrollViewBinder
 import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderHapticsViewBinder
-import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderTouchesViewBinder
 import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderViewBinder
 import dagger.BindsInstance
 import dagger.Subcomponent
@@ -34,8 +33,6 @@
 
     fun sliderViewBinder(): VolumeDialogSliderViewBinder
 
-    fun sliderTouchesViewBinder(): VolumeDialogSliderTouchesViewBinder
-
     fun sliderHapticsViewBinder(): VolumeDialogSliderHapticsViewBinder
 
     fun overscrollViewBinder(): VolumeDialogOverscrollViewBinder
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt
deleted file mode 100644
index 4ecac7a..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.volume.dialog.sliders.ui
-
-import android.annotation.SuppressLint
-import android.view.View
-import com.android.systemui.res.R
-import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope
-import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderInputEventsViewModel
-import com.google.android.material.slider.Slider
-import javax.inject.Inject
-
-@VolumeDialogSliderScope
-class VolumeDialogSliderTouchesViewBinder
-@Inject
-constructor(private val viewModel: VolumeDialogSliderInputEventsViewModel) {
-
-    @SuppressLint("ClickableViewAccessibility")
-    fun bind(view: View) {
-        with(view.requireViewById<Slider>(R.id.volume_dialog_slider)) {
-            setOnTouchListener { _, event ->
-                viewModel.onTouchEvent(event)
-                false
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
index 67ffb06..ccd16ac 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
@@ -23,6 +23,7 @@
 import androidx.dynamicanimation.animation.SpringForce
 import com.android.systemui.res.R
 import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope
+import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderInputEventsViewModel
 import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderStateModel
 import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderViewModel
 import com.google.android.material.slider.Slider
@@ -35,7 +36,10 @@
 @VolumeDialogSliderScope
 class VolumeDialogSliderViewBinder
 @Inject
-constructor(private val viewModel: VolumeDialogSliderViewModel) {
+constructor(
+    private val viewModel: VolumeDialogSliderViewModel,
+    private val inputViewModel: VolumeDialogSliderInputEventsViewModel,
+) {
 
     private val sliderValueProperty =
         object : FloatPropertyCompat<Slider>("value") {
@@ -51,12 +55,16 @@
             dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY
         }
 
+    @SuppressLint("ClickableViewAccessibility")
     fun CoroutineScope.bind(view: View) {
         var isInitialUpdate = true
         val sliderView: Slider = view.requireViewById(R.id.volume_dialog_slider)
         val animation = SpringAnimation(sliderView, sliderValueProperty)
         animation.spring = springForce
-
+        sliderView.setOnTouchListener { _, event ->
+            inputViewModel.onTouchEvent(event)
+            false
+        }
         sliderView.addOnChangeListener { _, value, fromUser ->
             viewModel.setStreamVolume(value.roundToInt(), fromUser)
         }
@@ -82,7 +90,7 @@
         // coerce the current value to the new value range before animating it. This prevents
         // animating from the value that is outside of current [valueFrom, valueTo].
         value = value.coerceIn(valueFrom, valueTo)
-        setTrackIconActiveStart(model.iconRes)
+        trackIconActiveStart = model.icon
         if (isInitialUpdate) {
             value = model.value
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
index f066b56..75d427a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
@@ -71,7 +71,6 @@
         viewsToAnimate: Array<View>,
     ) {
         with(component.sliderViewBinder()) { bind(sliderContainer) }
-        with(component.sliderTouchesViewBinder()) { bind(sliderContainer) }
         with(component.sliderHapticsViewBinder()) { bind(sliderContainer) }
         with(component.overscrollViewBinder()) { bind(sliderContainer, viewsToAnimate) }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderIconProvider.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderIconProvider.kt
index 5c39b6f..daf4c82 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderIconProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderIconProvider.kt
@@ -16,13 +16,16 @@
 
 package com.android.systemui.volume.dialog.sliders.ui.viewmodel
 
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.drawable.Drawable
 import android.media.AudioManager
 import androidx.annotation.DrawableRes
-import com.android.settingslib.notification.domain.interactor.NotificationsSoundPolicyInteractor
 import com.android.settingslib.volume.domain.interactor.AudioVolumeInteractor
 import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.settingslib.volume.shared.model.RingerMode
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
@@ -31,11 +34,12 @@
 class VolumeDialogSliderIconProvider
 @Inject
 constructor(
-    private val notificationsSoundPolicyInteractor: NotificationsSoundPolicyInteractor,
+    private val context: Context,
+    private val zenModeInteractor: ZenModeInteractor,
     private val audioVolumeInteractor: AudioVolumeInteractor,
 ) {
 
-    @DrawableRes
+    @SuppressLint("UseCompatLoadingForDrawables")
     fun getStreamIcon(
         stream: Int,
         level: Int,
@@ -43,54 +47,71 @@
         levelMax: Int,
         isMuted: Boolean,
         isRoutedToBluetooth: Boolean,
-    ): Flow<Int> {
+    ): Flow<Drawable> {
         return combine(
-            notificationsSoundPolicyInteractor.isZenMuted(AudioStream(stream)),
+            zenModeInteractor.activeModesBlockingStream(AudioStream(stream)),
             ringerModeForStream(stream),
-        ) { isZenMuted, ringerMode ->
-            val isStreamOffline = level == 0 || isMuted
-            if (isZenMuted) {
-                // TODO(b/372466264) use icon for the corresponding zenmode
-                return@combine com.android.internal.R.drawable.ic_qs_dnd
-            }
-            when (ringerMode?.value) {
-                AudioManager.RINGER_MODE_VIBRATE ->
-                    return@combine R.drawable.ic_volume_ringer_vibrate
-                AudioManager.RINGER_MODE_SILENT -> return@combine R.drawable.ic_ring_volume_off
-            }
-            if (isRoutedToBluetooth) {
-                return@combine if (stream == AudioManager.STREAM_VOICE_CALL) {
-                    R.drawable.ic_volume_bt_sco
-                } else {
-                    if (isStreamOffline) {
-                        R.drawable.ic_volume_media_bt_mute
-                    } else {
-                        R.drawable.ic_volume_media_bt
-                    }
-                }
-            }
-
-            return@combine if (isStreamOffline) {
-                getMutedIconForStream(stream) ?: getIconForStream(stream)
+        ) { activeModesBlockingStream, ringerMode ->
+            if (activeModesBlockingStream.mainMode?.icon != null) {
+                return@combine activeModesBlockingStream.mainMode.icon.drawable
             } else {
-                if (level < (levelMax + levelMin) / 2) {
-                    // This icon is different on TV
-                    R.drawable.ic_volume_media_low
-                } else {
-                    getIconForStream(stream)
-                }
+                context.getDrawable(
+                    getIconRes(
+                        stream,
+                        level,
+                        levelMin,
+                        levelMax,
+                        isMuted,
+                        isRoutedToBluetooth,
+                        ringerMode,
+                    )
+                )!!
             }
         }
     }
 
     @DrawableRes
-    private fun getMutedIconForStream(stream: Int): Int? {
-        return when (stream) {
-            AudioManager.STREAM_MUSIC -> R.drawable.ic_volume_media_mute
-            AudioManager.STREAM_NOTIFICATION -> R.drawable.ic_volume_ringer_mute
-            AudioManager.STREAM_ALARM -> R.drawable.ic_volume_alarm_mute
-            AudioManager.STREAM_SYSTEM -> R.drawable.ic_volume_system_mute
-            else -> null
+    private fun getIconRes(
+        stream: Int,
+        level: Int,
+        levelMin: Int,
+        levelMax: Int,
+        isMuted: Boolean,
+        isRoutedToBluetooth: Boolean,
+        ringerMode: RingerMode?,
+    ): Int {
+        val isStreamOffline = level == 0 || isMuted
+        when (ringerMode?.value) {
+            AudioManager.RINGER_MODE_VIBRATE -> return R.drawable.ic_volume_ringer_vibrate
+            AudioManager.RINGER_MODE_SILENT -> return R.drawable.ic_ring_volume_off
+        }
+        if (isRoutedToBluetooth) {
+            return if (stream == AudioManager.STREAM_VOICE_CALL) {
+                R.drawable.ic_volume_bt_sco
+            } else {
+                if (isStreamOffline) {
+                    R.drawable.ic_volume_media_bt_mute
+                } else {
+                    R.drawable.ic_volume_media_bt
+                }
+            }
+        }
+
+        return if (isStreamOffline) {
+            when (stream) {
+                AudioManager.STREAM_MUSIC -> R.drawable.ic_volume_media_mute
+                AudioManager.STREAM_NOTIFICATION -> R.drawable.ic_volume_ringer_mute
+                AudioManager.STREAM_ALARM -> R.drawable.ic_volume_alarm_mute
+                AudioManager.STREAM_SYSTEM -> R.drawable.ic_volume_system_mute
+                else -> null
+            } ?: getIconForStream(stream)
+        } else {
+            if (level < (levelMax + levelMin) / 2) {
+                // This icon is different on TV
+                R.drawable.ic_volume_media_low
+            } else {
+                getIconForStream(stream)
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderStateModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderStateModel.kt
index 5750c04..8df9e78 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderStateModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderStateModel.kt
@@ -16,21 +16,21 @@
 
 package com.android.systemui.volume.dialog.sliders.ui.viewmodel
 
-import androidx.annotation.DrawableRes
+import android.graphics.drawable.Drawable
 import com.android.systemui.volume.dialog.shared.model.VolumeDialogStreamModel
 
 data class VolumeDialogSliderStateModel(
     val minValue: Float,
     val maxValue: Float,
     val value: Float,
-    @DrawableRes val iconRes: Int,
+    val icon: Drawable,
 )
 
-fun VolumeDialogStreamModel.toStateModel(@DrawableRes iconRes: Int): VolumeDialogSliderStateModel {
+fun VolumeDialogStreamModel.toStateModel(icon: Drawable): VolumeDialogSliderStateModel {
     return VolumeDialogSliderStateModel(
         minValue = levelMin.toFloat(),
         value = level.toFloat(),
         maxValue = levelMax.toFloat(),
-        iconRes = iconRes,
+        icon = icon,
     )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
index 6d8457b..06d9426 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
@@ -66,7 +66,8 @@
     private val model: Flow<VolumeDialogStreamModel> =
         interactor.slider
             .filter {
-                val lastVolumeUpdateTime = userVolumeUpdates.value?.timestampMillis ?: 0
+                val currentVolumeUpdate = userVolumeUpdates.value ?: return@filter true
+                val lastVolumeUpdateTime = currentVolumeUpdate.timestampMillis
                 getTimestampMillis() - lastVolumeUpdateTime > VOLUME_UPDATE_GRACE_PERIOD
             }
             .stateIn(coroutineScope, SharingStarted.Eagerly, null)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogResources.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogResources.kt
deleted file mode 100644
index e5cf62b..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogResources.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.volume.dialog.ui
-
-import android.content.Context
-import android.content.res.Resources
-import com.android.systemui.dagger.qualifiers.UiBackground
-import com.android.systemui.res.R
-import com.android.systemui.statusbar.policy.ConfigurationController
-import com.android.systemui.statusbar.policy.onConfigChanged
-import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
-import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
-import javax.inject.Inject
-import kotlin.coroutines.CoroutineContext
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.onStart
-import kotlinx.coroutines.flow.stateIn
-
-/**
- * Provides cached resources [Flow]s that update when the configuration changes.
- *
- * Consume or use [kotlinx.coroutines.flow.first] to get the value.
- */
-@VolumeDialogScope
-class VolumeDialogResources
-@Inject
-constructor(
-    @VolumeDialog private val coroutineScope: CoroutineScope,
-    @UiBackground private val uiBackgroundContext: CoroutineContext,
-    private val context: Context,
-    private val configurationController: ConfigurationController,
-) {
-
-    val dialogShowDurationMillis: Flow<Long> = configurationResource {
-        getInteger(R.integer.config_dialogShowAnimationDurationMs).toLong()
-    }
-
-    val dialogHideDurationMillis: Flow<Long> = configurationResource {
-        getInteger(R.integer.config_dialogHideAnimationDurationMs).toLong()
-    }
-
-    private fun <T> configurationResource(get: Resources.() -> T): Flow<T> =
-        configurationController.onConfigChanged
-            .map { context.resources.get() }
-            .onStart { emit(context.resources.get()) }
-            .flowOn(uiBackgroundContext)
-            .stateIn(coroutineScope, SharingStarted.Eagerly, null)
-            .filterNotNull()
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
index a3166a9..1da2491 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.volume.dialog.ui.binder
 
 import android.app.Dialog
+import android.content.res.Resources
 import android.graphics.Rect
 import android.graphics.Region
 import android.view.View
@@ -25,6 +26,7 @@
 import android.view.ViewTreeObserver.InternalInsetsInfo
 import androidx.constraintlayout.motion.widget.MotionLayout
 import com.android.internal.view.RotationPolicy
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.res.R
 import com.android.systemui.util.children
 import com.android.systemui.volume.SystemUIInterpolators
@@ -33,7 +35,6 @@
 import com.android.systemui.volume.dialog.settings.ui.binder.VolumeDialogSettingsButtonViewBinder
 import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityModel
 import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSlidersViewBinder
-import com.android.systemui.volume.dialog.ui.VolumeDialogResources
 import com.android.systemui.volume.dialog.ui.utils.JankListenerFactory
 import com.android.systemui.volume.dialog.ui.utils.suspendAnimate
 import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
@@ -42,7 +43,6 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.mapLatest
 import kotlinx.coroutines.flow.onEach
@@ -56,7 +56,7 @@
 class VolumeDialogViewBinder
 @Inject
 constructor(
-    private val volumeResources: VolumeDialogResources,
+    @Main resources: Resources,
     private val viewModel: VolumeDialogViewModel,
     private val jankListenerFactory: JankListenerFactory,
     private val tracer: VolumeTracer,
@@ -65,6 +65,11 @@
     private val settingsButtonViewBinder: VolumeDialogSettingsButtonViewBinder,
 ) {
 
+    private val dialogShowAnimationDurationMs =
+        resources.getInteger(R.integer.config_dialogShowAnimationDurationMs).toLong()
+    private val dialogHideAnimationDurationMs =
+        resources.getInteger(R.integer.config_dialogHideAnimationDurationMs).toLong()
+
     fun CoroutineScope.bind(dialog: Dialog) {
         // Root view of the Volume Dialog.
         val root: MotionLayout = dialog.requireViewById(R.id.volume_dialog_root)
@@ -99,12 +104,12 @@
                     is VolumeDialogVisibilityModel.Visible -> {
                         tracer.traceVisibilityEnd(it)
                         calculateTranslationX(view)?.let(view::setTranslationX)
-                        view.animateShow(volumeResources.dialogShowDurationMillis.first())
+                        view.animateShow(dialogShowAnimationDurationMs)
                     }
                     is VolumeDialogVisibilityModel.Dismissed -> {
                         tracer.traceVisibilityEnd(it)
                         view.animateHide(
-                            duration = volumeResources.dialogHideDurationMillis.first(),
+                            duration = dialogHideAnimationDurationMs,
                             translationX = calculateTranslationX(view),
                         )
                         dialog.dismiss()
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt
index b20dffb..7a6ede4 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogViewModel.kt
@@ -44,9 +44,9 @@
 @Inject
 constructor(
     private val context: Context,
-    private val dialogVisibilityInteractor: VolumeDialogVisibilityInteractor,
+    dialogVisibilityInteractor: VolumeDialogVisibilityInteractor,
     volumeDialogSlidersInteractor: VolumeDialogSlidersInteractor,
-    private val volumeDialogStateInteractor: VolumeDialogStateInteractor,
+    volumeDialogStateInteractor: VolumeDialogStateInteractor,
     devicePostureController: DevicePostureController,
     configurationController: ConfigurationController,
 ) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
index cec3d1e..5b8d9b0 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
@@ -18,9 +18,6 @@
 
 import android.content.Context
 import android.media.AudioManager
-import android.media.AudioManager.STREAM_ALARM
-import android.media.AudioManager.STREAM_MUSIC
-import android.media.AudioManager.STREAM_NOTIFICATION
 import android.util.Log
 import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.internal.logging.UiEventLogger
@@ -34,8 +31,6 @@
 import com.android.systemui.modes.shared.ModesUiIcons
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
-import com.android.systemui.statusbar.policy.domain.model.ActiveZenModes
-import com.android.systemui.util.kotlin.combine
 import com.android.systemui.volume.panel.shared.VolumePanelLogger
 import com.android.systemui.volume.panel.ui.VolumePanelUiEvent
 import dagger.assisted.Assisted
@@ -43,12 +38,15 @@
 import dagger.assisted.AssistedInject
 import kotlin.math.roundToInt
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.stateIn
 
@@ -101,48 +99,16 @@
         )
 
     override val slider: StateFlow<SliderState> =
-        if (ModesUiIcons.isEnabled) {
-            combine(
-                    audioVolumeInteractor.getAudioStream(audioStream),
-                    audioVolumeInteractor.canChangeVolume(audioStream),
-                    audioVolumeInteractor.ringerMode,
-                    zenModeInteractor.activeModesBlockingEverything,
-                    zenModeInteractor.activeModesBlockingAlarms,
-                    zenModeInteractor.activeModesBlockingMedia,
-                ) {
-                    model,
-                    isEnabled,
-                    ringerMode,
-                    modesBlockingEverything,
-                    modesBlockingAlarms,
-                    modesBlockingMedia ->
-                    volumePanelLogger.onVolumeUpdateReceived(audioStream, model.volume)
-                    model.toState(
-                        isEnabled,
-                        ringerMode,
-                        getStreamDisabledMessage(
-                            modesBlockingEverything,
-                            modesBlockingAlarms,
-                            modesBlockingMedia,
-                        ),
-                    )
-                }
-                .stateIn(coroutineScope, SharingStarted.Eagerly, SliderState.Empty)
-        } else {
-            combine(
-                    audioVolumeInteractor.getAudioStream(audioStream),
-                    audioVolumeInteractor.canChangeVolume(audioStream),
-                    audioVolumeInteractor.ringerMode,
-                ) { model, isEnabled, ringerMode ->
-                    volumePanelLogger.onVolumeUpdateReceived(audioStream, model.volume)
-                    model.toState(
-                        isEnabled,
-                        ringerMode,
-                        getStreamDisabledMessageWithoutModes(audioStream),
-                    )
-                }
-                .stateIn(coroutineScope, SharingStarted.Eagerly, SliderState.Empty)
-        }
+        combine(
+                audioVolumeInteractor.getAudioStream(audioStream),
+                audioVolumeInteractor.canChangeVolume(audioStream),
+                audioVolumeInteractor.ringerMode,
+                streamDisabledMessage(),
+            ) { model, isEnabled, ringerMode, streamDisabledMessage ->
+                volumePanelLogger.onVolumeUpdateReceived(audioStream, model.volume)
+                model.toState(isEnabled, ringerMode, streamDisabledMessage)
+            }
+            .stateIn(coroutineScope, SharingStarted.Eagerly, SliderState.Empty)
 
     init {
         volumeChanges
@@ -229,40 +195,32 @@
         )
     }
 
-    private fun getStreamDisabledMessage(
-        blockingEverything: ActiveZenModes,
-        blockingAlarms: ActiveZenModes,
-        blockingMedia: ActiveZenModes,
-    ): String {
-        // TODO: b/372213356 - Figure out the correct messages for VOICE_CALL and RING.
-        //  In fact, VOICE_CALL should not be affected by interruption filtering at all.
-        return if (audioStream.value == STREAM_NOTIFICATION) {
-            context.getString(R.string.stream_notification_unavailable)
-        } else {
-            val blockingModeName =
-                when {
-                    blockingEverything.mainMode != null -> blockingEverything.mainMode.name
-                    audioStream.value == STREAM_ALARM -> blockingAlarms.mainMode?.name
-                    audioStream.value == STREAM_MUSIC -> blockingMedia.mainMode?.name
-                    else -> null
-                }
-
-            if (blockingModeName != null) {
-                context.getString(R.string.stream_unavailable_by_modes, blockingModeName)
+    // TODO: b/372213356 - Figure out the correct messages for VOICE_CALL and RING.
+    //  In fact, VOICE_CALL should not be affected by interruption filtering at all.
+    private fun streamDisabledMessage(): Flow<String> {
+        return if (ModesUiIcons.isEnabled) {
+            if (audioStream.value == AudioManager.STREAM_NOTIFICATION) {
+                flowOf(context.getString(R.string.stream_notification_unavailable))
             } else {
-                // Should not actually be visible, but as a catch-all.
-                context.getString(R.string.stream_unavailable_by_unknown)
+                if (zenModeInteractor.canBeBlockedByZenMode(audioStream)) {
+                    zenModeInteractor.activeModesBlockingStream(audioStream).map { blockingZenModes
+                        ->
+                        blockingZenModes.mainMode?.name?.let {
+                            context.getString(R.string.stream_unavailable_by_modes, it)
+                        } ?: context.getString(R.string.stream_unavailable_by_unknown)
+                    }
+                } else {
+                    flowOf(context.getString(R.string.stream_unavailable_by_unknown))
+                }
             }
-        }
-    }
-
-    private fun getStreamDisabledMessageWithoutModes(audioStream: AudioStream): String {
-        // TODO: b/372213356 - Figure out the correct messages for VOICE_CALL and RING.
-        //  In fact, VOICE_CALL should not be affected by interruption filtering at all.
-        return if (audioStream.value == STREAM_NOTIFICATION) {
-            context.getString(R.string.stream_notification_unavailable)
         } else {
-            context.getString(R.string.stream_alarm_unavailable)
+            flowOf(
+                if (audioStream.value == AudioManager.STREAM_NOTIFICATION) {
+                    context.getString(R.string.stream_notification_unavailable)
+                } else {
+                    context.getString(R.string.stream_alarm_unavailable)
+                }
+            )
         }
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
index 7ba797c..86063ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaSwitchingControllerTest.java
@@ -39,7 +39,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.media.AudioDeviceAttributes;
@@ -1286,13 +1285,6 @@
     }
 
     @Test
-    public void setColorFilter_setColorFilterToDrawable() {
-        mMediaSwitchingController.setColorFilter(mDrawable, true);
-
-        verify(mDrawable).setColorFilter(any(PorterDuffColorFilter.class));
-    }
-
-    @Test
     public void resetGroupMediaDevices_clearGroupDevices() {
         final MediaDevice selectedMediaDevice1 = mock(MediaDevice.class);
         final MediaDevice selectedMediaDevice2 = mock(MediaDevice.class);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt
index a0ecb80..f695c13 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/UserTrackerImplTest.kt
@@ -76,6 +76,8 @@
 
     @Mock private lateinit var iActivityManager: IActivityManager
 
+    @Mock private lateinit var beforeUserSwitchingReply: IRemoteCallback
+
     @Mock private lateinit var userSwitchingReply: IRemoteCallback
 
     @Mock(stubOnly = true) private lateinit var dumpManager: DumpManager
@@ -199,9 +201,10 @@
 
             val captor = ArgumentCaptor.forClass(IUserSwitchObserver::class.java)
             verify(iActivityManager).registerUserSwitchObserver(capture(captor), anyString())
-            captor.value.onBeforeUserSwitching(newID)
+            captor.value.onBeforeUserSwitching(newID, beforeUserSwitchingReply)
             captor.value.onUserSwitching(newID, userSwitchingReply)
             runCurrent()
+            verify(beforeUserSwitchingReply).sendResult(any())
             verify(userSwitchingReply).sendResult(any())
 
             verify(userManager).getProfiles(newID)
@@ -341,10 +344,11 @@
 
             val captor = ArgumentCaptor.forClass(IUserSwitchObserver::class.java)
             verify(iActivityManager).registerUserSwitchObserver(capture(captor), anyString())
-            captor.value.onBeforeUserSwitching(newID)
+            captor.value.onBeforeUserSwitching(newID, beforeUserSwitchingReply)
             captor.value.onUserSwitching(newID, userSwitchingReply)
             runCurrent()
 
+            verify(beforeUserSwitchingReply).sendResult(any())
             verify(userSwitchingReply).sendResult(any())
             assertThat(callback.calledOnUserChanging).isEqualTo(1)
             assertThat(callback.lastUser).isEqualTo(newID)
@@ -395,7 +399,7 @@
 
             val captor = ArgumentCaptor.forClass(IUserSwitchObserver::class.java)
             verify(iActivityManager).registerUserSwitchObserver(capture(captor), anyString())
-            captor.value.onBeforeUserSwitching(newID)
+            captor.value.onBeforeUserSwitching(newID, any())
             captor.value.onUserSwitchComplete(newID)
             runCurrent()
 
@@ -453,8 +457,10 @@
 
             val captor = ArgumentCaptor.forClass(IUserSwitchObserver::class.java)
             verify(iActivityManager).registerUserSwitchObserver(capture(captor), anyString())
+            captor.value.onBeforeUserSwitching(newID, beforeUserSwitchingReply)
             captor.value.onUserSwitching(newID, userSwitchingReply)
             runCurrent()
+            verify(beforeUserSwitchingReply).sendResult(any())
             verify(userSwitchingReply).sendResult(any())
             captor.value.onUserSwitchComplete(newID)
 
@@ -488,6 +494,7 @@
         }
 
     private class TestCallback : UserTracker.Callback {
+        var calledOnBeforeUserChanging = 0
         var calledOnUserChanging = 0
         var calledOnUserChanged = 0
         var calledOnProfilesChanged = 0
@@ -495,6 +502,11 @@
         var lastUserContext: Context? = null
         var lastUserProfiles = emptyList<UserInfo>()
 
+        override fun onBeforeUserSwitching(newUser: Int) {
+            calledOnBeforeUserChanging++
+            lastUser = newUser
+        }
+
         override fun onUserChanging(newUser: Int, userContext: Context) {
             calledOnUserChanging++
             lastUser = newUser
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
index 4cad5f7..77ca51c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt
@@ -36,7 +36,7 @@
 import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle
 import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.RunningChipAnim
 import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.ShowingPersistentDot
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import com.android.systemui.statusbar.window.StatusBarWindowController
 import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
 import com.android.systemui.util.time.FakeSystemClock
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt
index 25138fd..57a12df 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/IconManagerTest.kt
@@ -38,6 +38,7 @@
 import com.android.systemui.Flags.FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapperTest.Companion.any
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
@@ -123,7 +124,8 @@
 
     @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
-    fun testCreateIcons_chipNotifIconFlagEnabled_statusBarChipIconIsNull() {
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun testCreateIcons_chipNotifIconFlagEnabled_cdFlagDisabled_statusBarChipIconIsNotNull() {
         val entry =
             notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = true)
         entry?.let { iconManager.createIcons(it) }
@@ -133,6 +135,17 @@
     }
 
     @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun testCreateIcons_chipNotifIconFlagEnabled_cdFlagEnabled_statusBarChipIconIsNull() {
+        val entry =
+            notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = true)
+        entry?.let { iconManager.createIcons(it) }
+        testScope.runCurrent()
+
+        assertThat(entry?.icons?.statusBarChipIcon).isNull()
+    }
+
+    @Test
     fun testCreateIcons_importantConversation_shortcutIcon() {
         val entry =
             notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = true)
@@ -158,7 +171,7 @@
             notificationEntry(
                 hasShortcut = false,
                 hasMessageSenderIcon = false,
-                hasLargeIcon = true
+                hasLargeIcon = true,
             )
         entry?.channel?.isImportantConversation = true
         entry?.let { iconManager.createIcons(it) }
@@ -172,7 +185,7 @@
             notificationEntry(
                 hasShortcut = false,
                 hasMessageSenderIcon = false,
-                hasLargeIcon = false
+                hasLargeIcon = false,
             )
         entry?.channel?.isImportantConversation = true
         entry?.let { iconManager.createIcons(it) }
@@ -187,7 +200,7 @@
                 hasShortcut = true,
                 hasMessageSenderIcon = true,
                 useMessagingStyle = false,
-                hasLargeIcon = true
+                hasLargeIcon = true,
             )
         entry?.channel?.isImportantConversation = true
         entry?.let { iconManager.createIcons(it) }
@@ -205,7 +218,8 @@
 
     @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
-    fun testCreateIcons_sensitiveImportantConversation() {
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun testCreateIcons_cdFlagDisabled_sensitiveImportantConversation() {
         val entry =
             notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false)
         entry?.setSensitive(true, true)
@@ -219,8 +233,24 @@
     }
 
     @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun testCreateIcons_cdFlagEnabled_sensitiveImportantConversation() {
+        val entry =
+            notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false)
+        entry?.setSensitive(true, true)
+        entry?.channel?.isImportantConversation = true
+        entry?.let { iconManager.createIcons(it) }
+        testScope.runCurrent()
+        assertThat(entry?.icons?.statusBarIcon?.sourceIcon).isEqualTo(shortcutIc)
+        assertThat(entry?.icons?.statusBarChipIcon).isNull()
+        assertThat(entry?.icons?.shelfIcon?.sourceIcon).isEqualTo(smallIc)
+        assertThat(entry?.icons?.aodIcon?.sourceIcon).isEqualTo(smallIc)
+    }
+
+    @Test
     @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON)
-    fun testUpdateIcons_sensitiveImportantConversation() {
+    @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
+    fun testUpdateIcons_cdFlagDisabled_sensitiveImportantConversation() {
         val entry =
             notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false)
         entry?.setSensitive(true, true)
@@ -236,6 +266,23 @@
     }
 
     @Test
+    @EnableFlags(FLAG_STATUS_BAR_CALL_CHIP_NOTIFICATION_ICON, StatusBarConnectedDisplays.FLAG_NAME)
+    fun testUpdateIcons_cdFlagEnabled_sensitiveImportantConversation() {
+        val entry =
+            notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false)
+        entry?.setSensitive(true, true)
+        entry?.channel?.isImportantConversation = true
+        entry?.let { iconManager.createIcons(it) }
+        // Updating the icons after creation shouldn't break anything
+        entry?.let { iconManager.updateIcons(it) }
+        testScope.runCurrent()
+        assertThat(entry?.icons?.statusBarIcon?.sourceIcon).isEqualTo(shortcutIc)
+        assertThat(entry?.icons?.statusBarChipIcon).isNull()
+        assertThat(entry?.icons?.shelfIcon?.sourceIcon).isEqualTo(smallIc)
+        assertThat(entry?.icons?.aodIcon?.sourceIcon).isEqualTo(smallIc)
+    }
+
+    @Test
     fun testUpdateIcons_sensitivityChange() {
         val entry =
             notificationEntry(hasShortcut = true, hasMessageSenderIcon = true, hasLargeIcon = false)
@@ -254,7 +301,7 @@
         hasShortcut: Boolean,
         hasMessageSenderIcon: Boolean,
         useMessagingStyle: Boolean = true,
-        hasLargeIcon: Boolean
+        hasLargeIcon: Boolean,
     ): NotificationEntry? {
         val n =
             Notification.Builder(mContext, "id")
@@ -270,7 +317,7 @@
                         SystemClock.currentThreadTimeMillis(),
                         Person.Builder()
                             .setIcon(if (hasMessageSenderIcon) messageIc else null)
-                            .build()
+                            .build(),
                     )
                 )
         if (useMessagingStyle) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/user/domain/interactor/RefreshUsersSchedulerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/RefreshUsersSchedulerTest.kt
similarity index 100%
rename from packages/SystemUI/multivalentTests/src/com/android/systemui/user/domain/interactor/RefreshUsersSchedulerTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/RefreshUsersSchedulerTest.kt
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
index 1709329..2a1877a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeDialogTransitionAnimator.kt
@@ -24,7 +24,6 @@
     @Main mainExecutor: Executor,
     isUnlocked: Boolean = true,
     isShowingAlternateAuthOnUnlock: Boolean = false,
-    isPredictiveBackQsDialogAnim: Boolean = false,
     interactionJankMonitor: InteractionJankMonitor,
 ): DialogTransitionAnimator {
     return DialogTransitionAnimator(
@@ -35,10 +34,6 @@
                 isShowingAlternateAuthOnUnlock = isShowingAlternateAuthOnUnlock,
             ),
         interactionJankMonitor = interactionJankMonitor,
-        featureFlags =
-            object : AnimationFeatureFlags {
-                override val isPredictiveBackQsDialogAnim = isPredictiveBackQsDialogAnim
-            },
         transitionAnimator = fakeTransitionAnimator(mainExecutor),
         isForTesting = true,
     )
@@ -50,6 +45,8 @@
     private val isShowingAlternateAuthOnUnlock: Boolean = false,
 ) : DialogTransitionAnimator.Callback {
     override fun isDreaming(): Boolean = isDreaming
+
     override fun isUnlocked(): Boolean = isUnlocked
+
     override fun isShowingAlternateAuthOnUnlock() = isShowingAlternateAuthOnUnlock
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
index dad8569..9815da9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.EnableFlags
 import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
 import com.android.systemui.Flags.FLAG_NOTIFICATION_AVALANCHE_THROTTLE_HUN
-import com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_SYSUI
 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
 
 /**
@@ -29,7 +28,6 @@
 @EnableFlags(
     FLAG_KEYGUARD_WM_STATE_REFACTOR,
     FLAG_NOTIFICATION_AVALANCHE_THROTTLE_HUN,
-    FLAG_PREDICTIVE_BACK_SYSUI,
     FLAG_SCENE_CONTAINER,
 )
 @Retention(AnnotationRetention.RUNTIME)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt
index 47991b3..3df3ee9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt
@@ -154,6 +154,7 @@
             shortcutHelperStateRepository,
             activityStarter,
             testScope,
+            customInputGesturesRepository
         )
     }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
index 4383560..1881a94 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
@@ -1,5 +1,6 @@
 package com.android.systemui.kosmos
 
+import androidx.compose.runtime.snapshots.Snapshot
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.FlowValue
 import com.android.systemui.coroutines.collectLastValue
@@ -57,6 +58,23 @@
 fun Kosmos.runTest(testBody: suspend Kosmos.() -> Unit) =
     testScope.runTest testBody@{ this@runTest.testBody() }
 
+/**
+ * Runs the given [Kosmos]-scoped test [block] in an environment where compose snapshot state is
+ * settled eagerly. This is the compose equivalent to using an [UnconfinedTestDispatcher] or using
+ * [runCurrent] a lot.
+ *
+ * Note that this shouldn't be needed or used in a compose test environment.
+ */
+fun Kosmos.runTestWithSnapshots(block: suspend Kosmos.() -> Unit) {
+    val handle = Snapshot.registerGlobalWriteObserver { Snapshot.sendApplyNotifications() }
+
+    try {
+        testScope.runTest { block() }
+    } finally {
+        handle.dispose()
+    }
+}
+
 fun Kosmos.runCurrent() = testScope.runCurrent()
 
 fun <T> Kosmos.collectLastValue(flow: Flow<T>) = testScope.collectLastValue(flow)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
index 4a86fd5..74deaab 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
@@ -21,6 +21,8 @@
 import dagger.Binds
 import dagger.Module
 import javax.inject.Inject
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
@@ -37,8 +39,8 @@
     override val udfpsTransitionToFullShadeProgress =
         _udfpsTransitionToFullShadeProgress.asStateFlow()
 
-    private val _currentFling: MutableStateFlow<FlingInfo?> = MutableStateFlow(null)
-    override val currentFling: StateFlow<FlingInfo?> = _currentFling.asStateFlow()
+    override val currentFling: MutableSharedFlow<FlingInfo?> =
+        MutableSharedFlow(replay = 2, onBufferOverflow = BufferOverflow.DROP_OLDEST)
 
     private val _lockscreenShadeExpansion = MutableStateFlow(0f)
     override val lockscreenShadeExpansion = _lockscreenShadeExpansion.asStateFlow()
@@ -139,7 +141,7 @@
     }
 
     override fun setCurrentFling(info: FlingInfo?) {
-        _currentFling.value = info
+        currentFling.tryEmit(info)
     }
 
     override fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt
index 642c2ff..67f8572 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt
@@ -17,7 +17,7 @@
 package com.android.systemui.statusbar.data.repository
 
 import android.view.Display
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 import org.mockito.kotlin.mock
 
 class FakeStatusBarContentInsetsProviderStore() : StatusBarContentInsetsProviderStore {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
index a34fb09..af7a463 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
@@ -21,7 +21,7 @@
 import com.android.systemui.display.data.repository.displayWindowPropertiesRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
-import com.android.systemui.statusbar.phone.statusBarContentInsetsProviderFactory
+import com.android.systemui.statusbar.layout.statusBarContentInsetsProviderFactory
 import com.android.systemui.sysUICutoutProviderFactory
 
 val Kosmos.fakeStatusBarContentInsetsProviderStore by
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/FakeStatusBarContentInsetsProviderFactory.kt
similarity index 95%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/FakeStatusBarContentInsetsProviderFactory.kt
index 4fb8cf4..ad742c8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/FakeStatusBarContentInsetsProviderFactory.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import android.content.Context
 import com.android.systemui.SysUICutoutProvider
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderKosmos.kt
similarity index 91%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderKosmos.kt
index 705df3c..69e215d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProviderKosmos.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024 The Android Open Source Project
+ * Copyright (C) 2025 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.layout
 
 import com.android.systemui.kosmos.Kosmos
 import org.mockito.kotlin.mock
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt
index 7eaecb1..3a19547 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt
@@ -19,7 +19,7 @@
 import android.content.Context
 import com.android.app.viewcapture.ViewCaptureAwareWindowManager
 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController
-import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
 
 class FakeStatusBarWindowControllerFactory : StatusBarWindowController.Factory {
     override fun create(
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt
index 23f2b42..f595aef 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/StatusBarWindowControllerKosmos.kt
@@ -22,7 +22,7 @@
 import com.android.systemui.concurrency.fakeExecutor
 import com.android.systemui.fragments.fragmentService
 import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.statusbar.phone.statusBarContentInsetsProvider
+import com.android.systemui.statusbar.layout.statusBarContentInsetsProvider
 import com.android.systemui.statusbar.policy.statusBarConfigurationController
 import java.util.Optional
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/TouchpadGestureResourcesKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/TouchpadGestureResourcesKosmos.kt
new file mode 100644
index 0000000..d795941
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/touchpad/ui/gesture/TouchpadGestureResourcesKosmos.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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 com.android.systemui.touchpad.ui.gesture
+
+import android.content.res.mockResources
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.touchpad.tutorial.ui.viewmodel.TouchpadGestureResources
+
+var Kosmos.touchpadGestureResources: TouchpadGestureResources by
+    Kosmos.Fixture { TouchpadGestureResources(configurationInteractor, mockResources) }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Booleans.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Booleans.kt
new file mode 100644
index 0000000..ca02576
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Booleans.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+/** Returns a [State] that is `true` only when all of [states] are `true`. */
+@ExperimentalKairosApi
+fun allOf(vararg states: State<Boolean>): State<Boolean> = combine(*states) { it.allTrue() }
+
+/** Returns a [State] that is `true` when any of [states] are `true`. */
+@ExperimentalKairosApi
+fun anyOf(vararg states: State<Boolean>): State<Boolean> = combine(*states) { it.anyTrue() }
+
+/** Returns a [State] containing the inverse of the Boolean held by the original [State]. */
+@ExperimentalKairosApi fun not(state: State<Boolean>): State<Boolean> = state.mapCheapUnsafe { !it }
+
+private fun Iterable<Boolean>.allTrue() = all { it }
+
+private fun Iterable<Boolean>.anyTrue() = any { it }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/BuildScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/BuildScope.kt
index b691870..bd2173c 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/BuildScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/BuildScope.kt
@@ -17,17 +17,14 @@
 package com.android.systemui.kairos
 
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.just
 import com.android.systemui.kairos.util.map
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.awaitCancellation
-import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.FlowCollector
 import kotlinx.coroutines.flow.MutableSharedFlow
@@ -36,9 +33,8 @@
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.dropWhile
 import kotlinx.coroutines.flow.scan
-import kotlinx.coroutines.launch
 
-/** A function that modifies the KairosNetwork. */
+/** A computation that can modify the Kairos network. */
 typealias BuildSpec<A> = BuildScope.() -> A
 
 /**
@@ -56,17 +52,7 @@
 
 /** Operations that add inputs and outputs to a Kairos network. */
 @ExperimentalKairosApi
-interface BuildScope : StateScope {
-
-    /**
-     * A [KairosNetwork] handle that is bound to this [BuildScope].
-     *
-     * It supports all of the standard functionality by which external code can interact with this
-     * Kairos network, but all [activated][KairosNetwork.activateSpec] [BuildSpec]s are bound as
-     * children to this [BuildScope], such that when this [BuildScope] is destroyed, all children
-     * are also destroyed.
-     */
-    val kairosNetwork: KairosNetwork
+interface BuildScope : HasNetwork, StateScope {
 
     /**
      * Defers invoking [block] until after the current [BuildScope] code-path completes, returning a
@@ -110,11 +96,21 @@
      * executed if this [BuildScope] is still active by that time. It can be deactivated due to a
      * -Latest combinator, for example.
      *
-     * Shorthand for:
-     * ```kotlin
-     *   events.observe { effect { ... } }
+     * [Disposing][DisposableHandle.dispose] of the returned [DisposableHandle] will stop the
+     * observation of new emissions. It will however *not* cancel any running effects from previous
+     * emissions. To achieve this behavior, use [launchScope] or [asyncScope] to create a child
+     * build scope:
+     * ``` kotlin
+     *   val job = launchScope {
+     *       events.observe { x ->
+     *           launchEffect { longRunningEffect(x) }
+     *       }
+     *   }
+     *   // cancels observer and any running effects:
+     *   job.cancel()
      * ```
      */
+    // TODO: remove disposable handle return? might add more confusion than convenience
     fun <A> Events<A>.observe(
         coroutineContext: CoroutineContext = EmptyCoroutineContext,
         block: EffectScope.(A) -> Unit = {},
@@ -129,7 +125,7 @@
      * same key are undone (any registered [observers][observe] are unregistered, and any pending
      * [side-effects][effect] are cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildSpec] will be undone with no replacement.
      */
     fun <K, A, B> Events<Map<K, Maybe<BuildSpec<A>>>>.applyLatestSpecForKey(
@@ -138,32 +134,32 @@
     ): Pair<Events<Map<K, Maybe<A>>>, DeferredValue<Map<K, B>>>
 
     /**
-     * Creates an instance of an [Events] with elements that are from [builder].
+     * Creates an instance of an [Events] with elements that are emitted from [builder].
      *
      * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the
-     * provided [MutableState].
+     * provided [EventProducerScope].
      *
      * By default, [builder] is only running while the returned [Events] is being
      * [observed][observe]. If you want it to run at all times, simply add a no-op observer:
-     * ```kotlin
-     * events { ... }.apply { observe() }
+     * ``` kotlin
+     *   events { ... }.apply { observe() }
      * ```
      */
-    fun <T> events(
-        name: String? = null,
-        builder: suspend EventProducerScope<T>.() -> Unit,
-    ): Events<T>
+    // TODO: eventually this should be defined on KairosNetwork + an extension on HasNetwork
+    //  - will require modifying InputNode so that it can be manually killed, as opposed to using
+    //    takeUntil (which requires a StateScope).
+    fun <T> events(builder: suspend EventProducerScope<T>.() -> Unit): Events<T>
 
     /**
      * Creates an instance of an [Events] with elements that are emitted from [builder].
      *
      * [builder] is run in its own coroutine, allowing for ongoing work that can emit to the
-     * provided [MutableState].
+     * provided [CoalescingEventProducerScope].
      *
      * By default, [builder] is only running while the returned [Events] is being
      * [observed][observe]. If you want it to run at all times, simply add a no-op observer:
-     * ```kotlin
-     * events { ... }.apply { observe() }
+     * ``` kotlin
+     *   events { ... }.apply { observe() }
      * ```
      *
      * In the event of backpressure, emissions are *coalesced* into batches. When a value is
@@ -171,6 +167,7 @@
      * [coalesce]. Once the batch is consumed by the kairos network in the next transaction, the
      * batch is reset back to [getInitialValue].
      */
+    // TODO: see TODO for [events]
     fun <In, Out> coalescingEvents(
         getInitialValue: () -> Out,
         coalesce: (old: Out, new: In) -> Out,
@@ -186,6 +183,7 @@
      *
      * The return value from [block] can be accessed via the returned [DeferredValue].
      */
+    // TODO: return a DisposableHandle instead of Job?
     fun <A> asyncScope(block: BuildSpec<A>): Pair<DeferredValue<A>, Job>
 
     // TODO: once we have context params, these can all become extensions:
@@ -198,9 +196,9 @@
      * outside of the current Kairos transaction; when [transform] returns, the returned value is
      * emitted from the result [Events] in a new transaction.
      *
-     * Shorthand for:
-     * ```kotlin
-     * events.mapLatestBuild { a -> asyncEvent { transform(a) } }.flatten()
+     * ``` kotlin
+     *     fun <A, B> Events<A>.mapAsyncLatest(transform: suspend (A) -> B): Events<B> =
+     *         mapLatestBuild { a -> asyncEvent { transform(a) } }.flatten()
      * ```
      */
     fun <A, B> Events<A>.mapAsyncLatest(transform: suspend (A) -> B): Events<B> =
@@ -219,42 +217,19 @@
     /**
      * Returns a [StateFlow] whose [value][StateFlow.value] tracks the current
      * [value of this State][State.sample], and will emit at the same rate as [State.changes].
-     *
-     * Note that the [value][StateFlow.value] is not available until the *end* of the current
-     * transaction. If you need the current value before this time, then use [State.sample].
      */
     fun <A> State<A>.toStateFlow(): StateFlow<A> {
-        val uninitialized = Any()
-        var initialValue: Any? = uninitialized
-        val innerStateFlow = MutableStateFlow<Any?>(uninitialized)
-        deferredBuildScope {
-            initialValue = sample()
-            changes.observe {
-                innerStateFlow.value = it
-                initialValue = null
-            }
-        }
-
-        @Suppress("UNCHECKED_CAST")
-        fun getValue(innerValue: Any?): A =
-            when {
-                innerValue !== uninitialized -> innerValue as A
-                initialValue !== uninitialized -> initialValue as A
-                else ->
-                    error(
-                        "Attempted to access StateFlow.value before Kairos transaction has completed."
-                    )
-            }
-
+        val innerStateFlow = MutableStateFlow(sampleDeferred())
+        changes.observe { innerStateFlow.value = deferredOf(it) }
         return object : StateFlow<A> {
             override val replayCache: List<A>
-                get() = innerStateFlow.replayCache.map(::getValue)
+                get() = innerStateFlow.replayCache.map { it.value }
 
             override val value: A
-                get() = getValue(innerStateFlow.value)
+                get() = innerStateFlow.value.value
 
             override suspend fun collect(collector: FlowCollector<A>): Nothing {
-                innerStateFlow.collect { collector.emit(getValue(it)) }
+                innerStateFlow.collect { collector.emit(it.value) }
             }
         }
     }
@@ -365,14 +340,14 @@
         initialSpec: BuildSpec<A>
     ): Pair<Events<B>, DeferredValue<A>> {
         val (events, result) =
-            mapCheap { spec -> mapOf(Unit to just(spec)) }
+            mapCheap { spec -> mapOf(Unit to Maybe.present(spec)) }
                 .applyLatestSpecForKey(initialSpecs = mapOf(Unit to initialSpec), numKeys = 1)
         val outEvents: Events<B> =
             events.mapMaybe {
                 checkNotNull(it[Unit]) { "applyLatest: expected result, but none present in: $it" }
             }
         val outInit: DeferredValue<A> = deferredBuildScope {
-            val initResult: Map<Unit, A> = result.get()
+            val initResult: Map<Unit, A> = result.value
             check(Unit in initResult) {
                 "applyLatest: expected initial result, but none present in: $initResult"
             }
@@ -425,7 +400,7 @@
         transform: BuildScope.(A) -> B,
     ): Pair<Events<B>, DeferredValue<B>> =
         mapCheap { buildSpec { transform(it) } }
-            .applyLatestSpec(initialSpec = buildSpec { transform(initialValue.get()) })
+            .applyLatestSpec(initialSpec = buildSpec { transform(initialValue.value) })
 
     /**
      * Returns an [Events] containing the results of applying each [BuildSpec] emitted from the
@@ -436,7 +411,7 @@
      * same key are undone (any registered [observers][observe] are unregistered, and any pending
      * [side-effects][effect] are cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildSpec] will be undone with no replacement.
      */
     fun <K, A, B> Events<Map<K, Maybe<BuildSpec<A>>>>.applyLatestSpecForKey(
@@ -445,6 +420,17 @@
     ): Pair<Events<Map<K, Maybe<A>>>, DeferredValue<Map<K, B>>> =
         applyLatestSpecForKey(deferredOf(initialSpecs), numKeys)
 
+    /**
+     * Returns an [Incremental] containing the results of applying each [BuildSpec] emitted from the
+     * original [Incremental].
+     *
+     * When each [BuildSpec] is applied, changes from the previously-active [BuildSpec] with the
+     * same key are undone (any registered [observers][observe] are unregistered, and any pending
+     * [side-effects][effect] are cancelled).
+     *
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
+     * previously-active [BuildSpec] will be undone with no replacement.
+     */
     fun <K, V> Incremental<K, BuildSpec<V>>.applyLatestSpecForKey(
         numKeys: Int? = null
     ): Incremental<K, V> {
@@ -460,7 +446,7 @@
      * same key are undone (any registered [observers][observe] are unregistered, and any pending
      * [side-effects][effect] are cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildSpec] will be undone with no replacement.
      */
     fun <K, V> Events<Map<K, Maybe<BuildSpec<V>>>>.applyLatestSpecForKey(
@@ -476,7 +462,7 @@
      * same key are undone (any registered [observers][observe] are unregistered, and any pending
      * [side-effects][effect] are cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildSpec] will be undone with no replacement.
      */
     fun <K, V> Events<Map<K, Maybe<BuildSpec<V>>>>.holdLatestSpecForKey(
@@ -495,7 +481,7 @@
      * same key are undone (any registered [observers][observe] are unregistered, and any pending
      * [side-effects][effect] are cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildSpec] will be undone with no replacement.
      */
     fun <K, V> Events<Map<K, Maybe<BuildSpec<V>>>>.holdLatestSpecForKey(
@@ -513,7 +499,7 @@
      * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
      * cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildScope] will be undone with no replacement.
      */
     fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestBuildForKey(
@@ -524,7 +510,7 @@
         map { patch -> patch.mapValues { (k, v) -> v.map { buildSpec { transform(k, it) } } } }
             .applyLatestSpecForKey(
                 deferredBuildScope {
-                    initialValues.get().mapValues { (k, v) -> buildSpec { transform(k, v) } }
+                    initialValues.value.mapValues { (k, v) -> buildSpec { transform(k, v) } }
                 },
                 numKeys = numKeys,
             )
@@ -539,7 +525,7 @@
      * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
      * cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildScope] will be undone with no replacement.
      */
     fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestBuildForKey(
@@ -558,7 +544,7 @@
      * registered [observers][observe] are unregistered, and any pending [side-effects][effect] are
      * cancelled).
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
+     * If the [Maybe] value for an associated key is [absent][Maybe.absent], then the
      * previously-active [BuildScope] will be undone with no replacement.
      */
     fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestBuildForKey(
@@ -570,7 +556,7 @@
     fun <R> Events<R>.nextDeferred(): Deferred<R> {
         lateinit var next: CompletableDeferred<R>
         val job = launchScope { nextOnly().observe { next.complete(it) } }
-        next = CompletableDeferred<R>(parent = job)
+        next = CompletableDeferred(parent = job)
         return next
     }
 
@@ -581,12 +567,11 @@
     }
 
     /** Returns an [Events] that emits whenever this [Flow] emits. */
-    fun <A> Flow<A>.toEvents(name: String? = null): Events<A> =
-        events(name) { collect { emit(it) } }
+    fun <A> Flow<A>.toEvents(): Events<A> = events { collect { emit(it) } }
 
     /**
      * Shorthand for:
-     * ```kotlin
+     * ``` kotlin
      * flow.toEvents().holdState(initialValue)
      * ```
      */
@@ -594,7 +579,7 @@
 
     /**
      * Shorthand for:
-     * ```kotlin
+     * ``` kotlin
      * flow.scan(initialValue, operation).toEvents().holdState(initialValue)
      * ```
      */
@@ -603,7 +588,7 @@
 
     /**
      * Shorthand for:
-     * ```kotlin
+     * ``` kotlin
      * flow.scan(initialValue) { a, f -> f(a) }.toEvents().holdState(initialValue)
      * ```
      */
@@ -679,6 +664,13 @@
      * Invokes [block] on the value held in this [State]. [block] receives an [BuildScope] that can
      * be used to make further modifications to the Kairos network, and/or perform side-effects via
      * [effect].
+     *
+     * ``` kotlin
+     *     fun <A> State<A>.observeBuild(block: BuildScope.(A) -> Unit = {}): Job = launchScope {
+     *         block(sample())
+     *         changes.observeBuild(block)
+     *     }
+     * ```
      */
     fun <A> State<A>.observeBuild(block: BuildScope.(A) -> Unit = {}): Job = launchScope {
         block(sample())
@@ -706,12 +698,9 @@
  * outside of the current Kairos transaction; when it completes, the returned [Events] emits in a
  * new transaction.
  *
- * Shorthand for:
- * ```
- * events { emitter: MutableEvents<A> ->
- *     val a = block()
- *     emitter.emit(a)
- * }
+ * ``` kotlin
+ *   fun <A> BuildScope.asyncEvent(block: suspend () -> A): Events<A> =
+ *       events { emit(block()) }.apply { observe() }
  * ```
  */
 @ExperimentalKairosApi
@@ -730,9 +719,12 @@
  * executed if this [BuildScope] is still active by that time. It can be deactivated due to a
  * -Latest combinator, for example.
  *
- * Shorthand for:
- * ```kotlin
- *   launchScope { now.observe { block() } }
+ * ``` kotlin
+ *   fun BuildScope.effect(
+ *       context: CoroutineContext = EmptyCoroutineContext,
+ *       block: EffectScope.() -> Unit,
+ *   ): Job =
+ *       launchScope { now.observe(context) { block() } }
  * ```
  */
 @ExperimentalKairosApi
@@ -748,13 +740,14 @@
  * done because the current [BuildScope] might be deactivated within this transaction, perhaps due
  * to a -Latest combinator. If this happens, then the coroutine will never actually be started.
  *
- * Shorthand for:
- * ```kotlin
- *   effect { effectCoroutineScope.launch { block() } }
+ * ``` kotlin
+ *   fun BuildScope.launchEffect(block: suspend KairosScope.() -> Unit): Job =
+ *       effect { effectCoroutineScope.launch { block() } }
  * ```
  */
 @ExperimentalKairosApi
-fun BuildScope.launchEffect(block: suspend CoroutineScope.() -> Unit): Job = asyncEffect(block)
+fun BuildScope.launchEffect(block: suspend KairosCoroutineScope.() -> Unit): Job =
+    asyncEffect(block)
 
 /**
  * Launches [block] in a new coroutine, returning the result as a [Deferred].
@@ -764,17 +757,18 @@
  * to a -Latest combinator. If this happens, then the coroutine will never actually be started.
  *
  * Shorthand for:
- * ```kotlin
- *   CompletableDeferred<R>.apply {
- *       effect { effectCoroutineScope.launch { complete(coroutineScope { block() }) } }
- *     }
- *     .await()
+ * ``` kotlin
+ *   fun <R> BuildScope.asyncEffect(block: suspend KairosScope.() -> R): Deferred<R> =
+ *       CompletableDeferred<R>.apply {
+ *               effect { effectCoroutineScope.launch { complete(block()) } }
+ *           }
+ *           .await()
  * ```
  */
 @ExperimentalKairosApi
-fun <R> BuildScope.asyncEffect(block: suspend CoroutineScope.() -> R): Deferred<R> {
+fun <R> BuildScope.asyncEffect(block: suspend KairosCoroutineScope.() -> R): Deferred<R> {
     val result = CompletableDeferred<R>()
-    val job = effect { effectCoroutineScope.launch { result.complete(coroutineScope(block)) } }
+    val job = effect { launch { result.complete(block()) } }
     val handle = job.invokeOnCompletion { result.cancel() }
     result.invokeOnCompletion {
         handle.dispose()
@@ -795,7 +789,7 @@
  *
  * By default, [builder] is only running while the returned [Events] is being
  * [observed][BuildScope.observe]. If you want it to run at all times, simply add a no-op observer:
- * ```kotlin
+ * ``` kotlin
  * events { ... }.apply { observe() }
  * ```
  *
@@ -819,7 +813,7 @@
  *
  * By default, [builder] is only running while the returned [Events] is being
  * [observed][BuildScope.observe]. If you want it to run at all times, simply add a no-op observer:
- * ```kotlin
+ * ``` kotlin
  * events { ... }.apply { observe() }
  * ```
  *
@@ -837,7 +831,7 @@
         }
 
 /** Scope for emitting to a [BuildScope.coalescingEvents]. */
-interface CoalescingEventProducerScope<in T> {
+fun interface CoalescingEventProducerScope<in T> {
     /**
      * Inserts [value] into the current batch, enqueueing it for emission from this [Events] if not
      * already pending.
@@ -850,7 +844,7 @@
 }
 
 /** Scope for emitting to a [BuildScope.events]. */
-interface EventProducerScope<in T> {
+fun interface EventProducerScope<in T> {
     /**
      * Emits a [value] to this [Events], suspending the caller until the Kairos transaction
      * containing the emission has completed.
@@ -868,3 +862,11 @@
     } finally {
         block()
     }
+
+/**
+ * Runs [spec] in this [BuildScope], and then re-runs it whenever [rebuildSignal] emits. Returns a
+ * [State] that holds the result of the currently-active [BuildSpec].
+ */
+@ExperimentalKairosApi
+fun <A> BuildScope.rebuildOn(rebuildSignal: Events<*>, spec: BuildSpec<A>): State<A> =
+    rebuildSignal.map { spec }.holdLatestSpec(spec)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
deleted file mode 100644
index c208646..0000000
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combinators.kt
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2024 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 com.android.systemui.kairos
-
-import com.android.systemui.kairos.util.These
-import com.android.systemui.kairos.util.WithPrev
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.none
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.channelFlow
-import kotlinx.coroutines.flow.conflate
-
-/**
- * Returns an [Events] that emits the value sampled from the [Transactional] produced by each
- * emission of the original [Events], within the same transaction of the original emission.
- */
-@ExperimentalKairosApi
-fun <A> Events<Transactional<A>>.sampleTransactionals(): Events<A> = map { it.sample() }
-
-/** @see TransactionScope.sample */
-@ExperimentalKairosApi
-fun <A, B, C> Events<A>.sample(
-    state: State<B>,
-    transform: TransactionScope.(A, B) -> C,
-): Events<C> = map { transform(it, state.sample()) }
-
-/** @see TransactionScope.sample */
-@ExperimentalKairosApi
-fun <A, B, C> Events<A>.sample(
-    sampleable: Transactional<B>,
-    transform: TransactionScope.(A, B) -> C,
-): Events<C> = map { transform(it, sampleable.sample()) }
-
-/**
- * Like [sample], but if [state] is changing at the time it is sampled ([changes] is emitting), then
- * the new value is passed to [transform].
- *
- * Note that [sample] is both more performant, and safer to use with recursive definitions. You will
- * generally want to use it rather than this.
- *
- * @see sample
- */
-@ExperimentalKairosApi
-fun <A, B, C> Events<A>.samplePromptly(
-    state: State<B>,
-    transform: TransactionScope.(A, B) -> C,
-): Events<C> =
-    sample(state) { a, b -> These.thiz(a to b) }
-        .mergeWith(state.changes.map { These.that(it) }) { thiz, that ->
-            These.both((thiz as These.This).thiz, (that as These.That).that)
-        }
-        .mapMaybe { these ->
-            when (these) {
-                // both present, transform the upstream value and the new value
-                is These.Both -> just(transform(these.thiz.first, these.that))
-                // no upstream present, so don't perform the sample
-                is These.That -> none()
-                // just the upstream, so transform the upstream and the old value
-                is These.This -> just(transform(these.thiz.first, these.thiz.second))
-            }
-        }
-
-/**
- * Returns a cold [Flow] that, when collected, emits from this [Events]. [network] is needed to
- * transactionally connect to / disconnect from the [Events] when collection starts/stops.
- */
-@ExperimentalKairosApi
-fun <A> Events<A>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, emits from this [State]. [network] is needed to
- * transactionally connect to / disconnect from the [State] when collection starts/stops.
- */
-@ExperimentalKairosApi
-fun <A> State<A>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [BuildSpec] in a new transaction in this
- * [network], and then emits from the returned [Events].
- *
- * When collection is cancelled, so is the [BuildSpec]. This means all ongoing work is cleaned up.
- */
-@ExperimentalKairosApi
-@JvmName("eventsSpecToColdConflatedFlow")
-fun <A> BuildSpec<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [BuildSpec] in a new transaction in this
- * [network], and then emits from the returned [State].
- *
- * When collection is cancelled, so is the [BuildSpec]. This means all ongoing work is cleaned up.
- */
-@ExperimentalKairosApi
-@JvmName("stateSpecToColdConflatedFlow")
-fun <A> BuildSpec<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
- * this [network], and then emits from the returned [Events].
- */
-@ExperimentalKairosApi
-@JvmName("transactionalFlowToColdConflatedFlow")
-fun <A> Transactional<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
- * this [network], and then emits from the returned [State].
- */
-@ExperimentalKairosApi
-@JvmName("transactionalStateToColdConflatedFlow")
-fun <A> Transactional<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [Stateful] in a new transaction in this
- * [network], and then emits from the returned [Events].
- *
- * When collection is cancelled, so is the [Stateful]. This means all ongoing work is cleaned up.
- */
-@ExperimentalKairosApi
-@JvmName("statefulFlowToColdConflatedFlow")
-fun <A> Stateful<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
-
-/**
- * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
- * this [network], and then emits from the returned [State].
- *
- * When collection is cancelled, so is the [Stateful]. This means all ongoing work is cleaned up.
- */
-@ExperimentalKairosApi
-@JvmName("statefulStateToColdConflatedFlow")
-fun <A> Stateful<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
-    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
-
-/** Return an [Events] that emits from the original [Events] only when [state] is `true`. */
-@ExperimentalKairosApi
-fun <A> Events<A>.filter(state: State<Boolean>): Events<A> = filter { state.sample() }
-
-private fun Iterable<Boolean>.allTrue() = all { it }
-
-private fun Iterable<Boolean>.anyTrue() = any { it }
-
-/** Returns a [State] that is `true` only when all of [states] are `true`. */
-@ExperimentalKairosApi
-fun allOf(vararg states: State<Boolean>): State<Boolean> = combine(*states) { it.allTrue() }
-
-/** Returns a [State] that is `true` when any of [states] are `true`. */
-@ExperimentalKairosApi
-fun anyOf(vararg states: State<Boolean>): State<Boolean> = combine(*states) { it.anyTrue() }
-
-/** Returns a [State] containing the inverse of the Boolean held by the original [State]. */
-@ExperimentalKairosApi fun not(state: State<Boolean>): State<Boolean> = state.mapCheapUnsafe { !it }
-
-/**
- * Represents a modal Kairos sub-network.
- *
- * When [enabled][enableMode], all network modifications are applied immediately to the Kairos
- * network. When the returned [Events] emits a [BuildMode], that mode is enabled and replaces this
- * mode, undoing all modifications in the process (any registered [observers][BuildScope.observe]
- * are unregistered, and any pending [side-effects][BuildScope.effect] are cancelled).
- *
- * Use [compiledBuildSpec] to compile and stand-up a mode graph.
- *
- * @see StatefulMode
- */
-@ExperimentalKairosApi
-fun interface BuildMode<out A> {
-    /**
-     * Invoked when this mode is enabled. Returns a value and an [Events] that signals a switch to a
-     * new mode.
-     */
-    fun BuildScope.enableMode(): Pair<A, Events<BuildMode<A>>>
-}
-
-/**
- * Returns an [BuildSpec] that, when [applied][BuildScope.applySpec], stands up a modal-transition
- * graph starting with this [BuildMode], automatically switching to new modes as they are produced.
- *
- * @see BuildMode
- */
-@ExperimentalKairosApi
-val <A> BuildMode<A>.compiledBuildSpec: BuildSpec<State<A>>
-    get() = buildSpec {
-        var modeChangeEvents by EventsLoop<BuildMode<A>>()
-        val activeMode: State<Pair<A, Events<BuildMode<A>>>> =
-            modeChangeEvents
-                .map { it.run { buildSpec { enableMode() } } }
-                .holdLatestSpec(buildSpec { enableMode() })
-        modeChangeEvents =
-            activeMode
-                .map { statefully { it.second.nextOnly() } }
-                .applyLatestStateful()
-                .switchEvents()
-        activeMode.map { it.first }
-    }
-
-/**
- * Represents a modal Kairos sub-network.
- *
- * When [enabled][enableMode], all state accumulation is immediately started. When the returned
- * [Events] emits a [BuildMode], that mode is enabled and replaces this mode, stopping all state
- * accumulation in the process.
- *
- * Use [compiledStateful] to compile and stand-up a mode graph.
- *
- * @see BuildMode
- */
-@ExperimentalKairosApi
-fun interface StatefulMode<out A> {
-    /**
-     * Invoked when this mode is enabled. Returns a value and an [Events] that signals a switch to a
-     * new mode.
-     */
-    fun StateScope.enableMode(): Pair<A, Events<StatefulMode<A>>>
-}
-
-/**
- * Returns an [Stateful] that, when [applied][StateScope.applyStateful], stands up a
- * modal-transition graph starting with this [StatefulMode], automatically switching to new modes as
- * they are produced.
- *
- * @see BuildMode
- */
-@ExperimentalKairosApi
-val <A> StatefulMode<A>.compiledStateful: Stateful<State<A>>
-    get() = statefully {
-        var modeChangeEvents by EventsLoop<StatefulMode<A>>()
-        val activeMode: State<Pair<A, Events<StatefulMode<A>>>> =
-            modeChangeEvents
-                .map { it.run { statefully { enableMode() } } }
-                .holdLatestStateful(statefully { enableMode() })
-        modeChangeEvents =
-            activeMode
-                .map { statefully { it.second.nextOnly() } }
-                .applyLatestStateful()
-                .switchEvents()
-        activeMode.map { it.first }
-    }
-
-/**
- * Runs [spec] in this [BuildScope], and then re-runs it whenever [rebuildSignal] emits. Returns a
- * [State] that holds the result of the currently-active [BuildSpec].
- */
-@ExperimentalKairosApi
-fun <A> BuildScope.rebuildOn(rebuildSignal: Events<*>, spec: BuildSpec<A>): State<A> =
-    rebuildSignal.map { spec }.holdLatestSpec(spec)
-
-/**
- * Like [changes] but also includes the old value of this [State].
- *
- * Shorthand for:
- * ``` kotlin
- *     stateChanges.map { WithPrev(previousValue = sample(), newValue = it) }
- * ```
- */
-@ExperimentalKairosApi
-val <A> State<A>.transitions: Events<WithPrev<A, A>>
-    get() = changes.map { WithPrev(previousValue = sample(), newValue = it) }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combine.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combine.kt
new file mode 100644
index 0000000..b3d89c3
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Combine.kt
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.NoScope
+import com.android.systemui.kairos.internal.init
+import com.android.systemui.kairos.internal.zipStates
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.combineState
+ */
+@ExperimentalKairosApi
+@JvmName(name = "stateCombine")
+fun <A, B, C> State<A>.combine(other: State<B>, transform: KairosScope.(A, B) -> C): State<C> =
+    combine(this, other, transform)
+
+/**
+ * Returns a [State] by combining the values held inside the given [States][State] into a [List].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A> Iterable<State<A>>.combine(): State<List<A>> {
+    val operatorName = "combine"
+    val name = operatorName
+    return StateInit(
+        init(name) {
+            val states = map { it.init }
+            zipStates(
+                name,
+                operatorName,
+                states.size,
+                states = init(null) { states.map { it.connect(this) } },
+            )
+        }
+    )
+}
+
+/**
+ * Returns a [State] by combining the values held inside the given [States][State] into a [Map].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <K, A> Map<K, State<A>>.combine(): State<Map<K, A>> =
+    asIterable().map { (k, state) -> state.map { v -> k to v } }.combine().map { it.toMap() }
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B> Iterable<State<A>>.combine(transform: KairosScope.(List<A>) -> B): State<B> =
+    combine().map(transform)
+
+/**
+ * Returns a [State] by combining the values held inside the given [State]s into a [List].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A> combine(vararg states: State<A>): State<List<A>> = states.asIterable().combine()
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B> combine(vararg states: State<A>, transform: KairosScope.(List<A>) -> B): State<B> =
+    states.asIterable().combine(transform)
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B, Z> combine(
+    stateA: State<A>,
+    stateB: State<B>,
+    transform: KairosScope.(A, B) -> Z,
+): State<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return StateInit(
+        init(name) {
+            zipStates(name, operatorName, stateA.init, stateB.init) { a, b ->
+                NoScope.transform(a, b)
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B, C, Z> combine(
+    stateA: State<A>,
+    stateB: State<B>,
+    stateC: State<C>,
+    transform: KairosScope.(A, B, C) -> Z,
+): State<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return StateInit(
+        init(name) {
+            zipStates(name, operatorName, stateA.init, stateB.init, stateC.init) { a, b, c ->
+                NoScope.transform(a, b, c)
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B, C, D, Z> combine(
+    stateA: State<A>,
+    stateB: State<B>,
+    stateC: State<C>,
+    stateD: State<D>,
+    transform: KairosScope.(A, B, C, D) -> Z,
+): State<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return StateInit(
+        init(name) {
+            zipStates(name, operatorName, stateA.init, stateB.init, stateC.init, stateD.init) {
+                a,
+                b,
+                c,
+                d ->
+                NoScope.transform(a, b, c, d)
+            }
+        }
+    )
+}
+
+/**
+ * Returns a [State] whose value is generated with [transform] by combining the current values of
+ * each given [State].
+ *
+ * @see State.combine
+ */
+@ExperimentalKairosApi
+fun <A, B, C, D, E, Z> combine(
+    stateA: State<A>,
+    stateB: State<B>,
+    stateC: State<C>,
+    stateD: State<D>,
+    stateE: State<E>,
+    transform: KairosScope.(A, B, C, D, E) -> Z,
+): State<Z> {
+    val operatorName = "combine"
+    val name = operatorName
+    return StateInit(
+        init(name) {
+            zipStates(
+                name,
+                operatorName,
+                stateA.init,
+                stateB.init,
+                stateC.init,
+                stateD.init,
+                stateE.init,
+            ) { a, b, c, d, e ->
+                NoScope.transform(a, b, c, d, e)
+            }
+        }
+    )
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/DeferredValue.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/DeferredValue.kt
new file mode 100644
index 0000000..4b9bb0e
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/DeferredValue.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.CompletableLazy
+
+/**
+ * A value that may not be immediately (synchronously) available, but is guaranteed to be available
+ * before this transaction is completed.
+ */
+@ExperimentalKairosApi
+class DeferredValue<out A> internal constructor(internal val unwrapped: Lazy<A>) {
+    /**
+     * Returns the value held by this [DeferredValue], or throws [IllegalStateException] if it is
+     * not yet available.
+     */
+    val value: A
+        get() = unwrapped.value
+}
+
+/** Returns an already-available [DeferredValue] containing [value]. */
+@ExperimentalKairosApi
+fun <A> deferredOf(value: A): DeferredValue<A> = DeferredValue(CompletableLazy(value))
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/EffectScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/EffectScope.kt
index 7e257f2..14d45d4 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/EffectScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/EffectScope.kt
@@ -16,33 +16,46 @@
 
 package com.android.systemui.kairos
 
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Job
 
 /**
- * Scope for external side-effects triggered by the Kairos network. This still occurs within the
- * context of a transaction, so general suspending calls are disallowed to prevent blocking the
- * transaction. You can use [effectCoroutineScope] to [launch][kotlinx.coroutines.launch] new
- * coroutines to perform long-running asynchronous work. This scope is alive for the duration of the
- * containing [BuildScope] that this side-effect scope is running in.
+ * Scope for external side-effects triggered by the Kairos network.
+ *
+ * This still occurs within the context of a transaction, so general suspending calls are disallowed
+ * to prevent blocking the transaction. You can [launch] new coroutines to perform long-running
+ * asynchronous work. These coroutines are kept alive for the duration of the containing
+ * [BuildScope] that this side-effect scope is running in.
  */
 @ExperimentalKairosApi
-interface EffectScope : TransactionScope {
+interface EffectScope : HasNetwork, TransactionScope {
     /**
-     * A [CoroutineScope] whose lifecycle lives for as long as this [EffectScope] is alive. This is
-     * generally until the [Job][kotlinx.coroutines.Job] returned by [BuildScope.effect] is
-     * cancelled.
+     * Creates a coroutine that is a child of this [EffectScope], and returns its future result as a
+     * [Deferred].
+     *
+     * @see kotlinx.coroutines.async
      */
-    @ExperimentalKairosApi val effectCoroutineScope: CoroutineScope
+    fun <R> async(
+        context: CoroutineContext = EmptyCoroutineContext,
+        start: CoroutineStart = CoroutineStart.DEFAULT,
+        block: suspend KairosCoroutineScope.() -> R,
+    ): Deferred<R>
 
     /**
-     * A [KairosNetwork] instance that can be used to transactionally query / modify the Kairos
-     * network.
+     * Launches a new coroutine that is a child of this [EffectScope] without blocking the current
+     * thread and returns a reference to the coroutine as a [Job].
      *
-     * The lambda passed to [KairosNetwork.transact] on this instance will receive an [BuildScope]
-     * that is lifetime-bound to this [EffectScope]. Once this [EffectScope] is no longer alive, any
-     * modifications to the Kairos network performed via this [KairosNetwork] instance will be
-     * undone (any registered [observers][BuildScope.observe] are unregistered, and any pending
-     * [side-effects][BuildScope.effect] are cancelled).
+     * @see kotlinx.coroutines.launch
      */
-    @ExperimentalKairosApi val kairosNetwork: KairosNetwork
+    fun launch(
+        context: CoroutineContext = EmptyCoroutineContext,
+        start: CoroutineStart = CoroutineStart.DEFAULT,
+        block: suspend KairosCoroutineScope.() -> Unit,
+    ): Job = async(context, start, block)
 }
+
+@ExperimentalKairosApi interface KairosCoroutineScope : HasNetwork, CoroutineScope
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Events.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Events.kt
index e7d0096..8f468c1 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Events.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Events.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.kairos
 
 import com.android.systemui.kairos.internal.CompletableLazy
-import com.android.systemui.kairos.internal.DemuxImpl
 import com.android.systemui.kairos.internal.EventsImpl
 import com.android.systemui.kairos.internal.Init
 import com.android.systemui.kairos.internal.InitScope
@@ -27,22 +26,11 @@
 import com.android.systemui.kairos.internal.activated
 import com.android.systemui.kairos.internal.cached
 import com.android.systemui.kairos.internal.constInit
-import com.android.systemui.kairos.internal.demuxMap
-import com.android.systemui.kairos.internal.filterImpl
-import com.android.systemui.kairos.internal.filterJustImpl
 import com.android.systemui.kairos.internal.init
 import com.android.systemui.kairos.internal.mapImpl
-import com.android.systemui.kairos.internal.mergeNodes
-import com.android.systemui.kairos.internal.mergeNodesLeft
 import com.android.systemui.kairos.internal.neverImpl
-import com.android.systemui.kairos.internal.switchDeferredImplSingle
-import com.android.systemui.kairos.internal.switchPromptImplSingle
 import com.android.systemui.kairos.internal.util.hashString
-import com.android.systemui.kairos.util.Either
-import com.android.systemui.kairos.util.Either.Left
-import com.android.systemui.kairos.util.Either.Right
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.just
 import com.android.systemui.kairos.util.toMaybe
 import java.util.concurrent.atomic.AtomicReference
 import kotlin.reflect.KProperty
@@ -51,7 +39,16 @@
 import kotlinx.coroutines.async
 import kotlinx.coroutines.coroutineScope
 
-/** A series of values of type [A] available at discrete points in time. */
+/**
+ * A series of values of type [A] available at discrete points in time.
+ *
+ * [Events] follow these rules:
+ * 1. Within a single Kairos network transaction, an [Events] instance will only emit *once*.
+ * 2. The order that different [Events] instances emit values within a transaction is undefined, and
+ *    are conceptually *simultaneous*.
+ * 3. [Events] emissions are *ephemeral* and do not last beyond the transaction they are emitted,
+ *    unless explicitly [observed][BuildScope.observe] or [held][StateScope.holdState] as a [State].
+ */
 @ExperimentalKairosApi
 sealed class Events<out A> {
     companion object {
@@ -67,7 +64,9 @@
  * A forward-reference to an [Events]. Useful for recursive definitions.
  *
  * This reference can be used like a standard [Events], but will throw an error if its [loopback] is
- * unset before the end of the first transaction which accesses it.
+ * unset before it is [observed][BuildScope.observe].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.eventsLoop
  */
 @ExperimentalKairosApi
 class EventsLoop<A> : Events<A>() {
@@ -76,7 +75,10 @@
     internal val init: Init<EventsImpl<A>> =
         init(name = null) { deferred.value.init.connect(evalScope = this) }
 
-    /** The [Events] this reference is referring to. */
+    /**
+     * The [Events] this reference is referring to. Must be set before this [EventsLoop] is
+     * [observed][BuildScope.observe].
+     */
     var loopback: Events<A>? = null
         set(value) {
             value?.let {
@@ -102,6 +104,12 @@
  * will be queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> Lazy<Events<A>>.defer() = deferredEvents { value }
+ * ```
+ *
+ * @see deferredEvents
  */
 @ExperimentalKairosApi fun <A> Lazy<Events<A>>.defer(): Events<A> = deferInline { value }
 
@@ -113,6 +121,12 @@
  * and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> DeferredValue<Events<A>>.defer() = deferredEvents { get() }
+ * ```
+ *
+ * @see deferredEvents
  */
 @ExperimentalKairosApi
 fun <A> DeferredValue<Events<A>>.defer(): Events<A> = deferInline { unwrapped.value }
@@ -130,25 +144,27 @@
     NoScope.block()
 }
 
-/** Returns an [Events] that emits the new value of this [State] when it changes. */
-@ExperimentalKairosApi
-val <A> State<A>.changes: Events<A>
-    get() = EventsInit(init(name = null) { init.connect(evalScope = this).changes })
-
 /**
- * Returns an [Events] that contains only the [just] results of applying [transform] to each value
- * of the original [Events].
+ * Returns an [Events] that contains only the
+ * [present][com.android.systemui.kairos.util.Maybe.present] results of applying [transform] to each
+ * value of the original [Events].
  *
+ * @sample com.android.systemui.kairos.KairosSamples.mapMaybe
  * @see mapNotNull
  */
 @ExperimentalKairosApi
 fun <A, B> Events<A>.mapMaybe(transform: TransactionScope.(A) -> Maybe<B>): Events<B> =
-    map(transform).filterJust()
+    map(transform).filterPresent()
 
 /**
  * Returns an [Events] that contains only the non-null results of applying [transform] to each value
  * of the original [Events].
  *
+ * ``` kotlin
+ *  fun <A> Events<A>.mapNotNull(transform: TransactionScope.(A) -> B?): Events<B> =
+ *      mapMaybe { if (it == null) absent else present(it) }
+ * ```
+ *
  * @see mapMaybe
  */
 @ExperimentalKairosApi
@@ -156,23 +172,11 @@
     transform(it).toMaybe()
 }
 
-/** Returns an [Events] containing only values of the original [Events] that are not null. */
-@ExperimentalKairosApi
-fun <A> Events<A?>.filterNotNull(): Events<A> = mapCheap { it.toMaybe() }.filterJust()
-
-/** Shorthand for `mapNotNull { it as? A }`. */
-@ExperimentalKairosApi
-inline fun <reified A> Events<*>.filterIsInstance(): Events<A> =
-    mapCheap { it as? A }.filterNotNull()
-
-/** Shorthand for `mapMaybe { it }`. */
-@ExperimentalKairosApi
-fun <A> Events<Maybe<A>>.filterJust(): Events<A> =
-    EventsInit(constInit(name = null, filterJustImpl { init.connect(evalScope = this) }))
-
 /**
  * Returns an [Events] containing the results of applying [transform] to each value of the original
  * [Events].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.mapEvents
  */
 @ExperimentalKairosApi
 fun <A, B> Events<A>.map(transform: TransactionScope.(A) -> B): Events<B> {
@@ -184,6 +188,7 @@
  * Like [map], but the emission is not cached during the transaction. Use only if [transform] is
  * fast and pure.
  *
+ * @sample com.android.systemui.kairos.KairosSamples.mapCheap
  * @see map
  */
 @ExperimentalKairosApi
@@ -196,8 +201,9 @@
  * Returns an [Events] that invokes [action] before each value of the original [Events] is emitted.
  * Useful for logging and debugging.
  *
- * ```
- *   pulse.onEach { foo(it) } == pulse.map { foo(it); it }
+ * ``` kotlin
+ *   fun <A> Events<A>.onEach(action: TransactionScope.(A) -> Unit): Events<A> =
+ *       map { it.also { action(it) } }
  * ```
  *
  * Note that the side effects performed in [onEach] are only performed while the resulting [Events]
@@ -207,29 +213,19 @@
  */
 @ExperimentalKairosApi
 fun <A> Events<A>.onEach(action: TransactionScope.(A) -> Unit): Events<A> = map {
-    action(it)
-    it
-}
-
-/**
- * Returns an [Events] containing only values of the original [Events] that satisfy the given
- * [predicate].
- */
-@ExperimentalKairosApi
-fun <A> Events<A>.filter(predicate: TransactionScope.(A) -> Boolean): Events<A> {
-    val pulse = filterImpl({ init.connect(evalScope = this) }) { predicate(it) }
-    return EventsInit(constInit(name = null, pulse))
+    it.also { action(it) }
 }
 
 /**
  * Splits an [Events] of pairs into a pair of [Events], where each returned [Events] emits half of
  * the original.
  *
- * Shorthand for:
- * ```kotlin
- * val lefts = map { it.first }
- * val rights = map { it.second }
- * return Pair(lefts, rights)
+ * ``` kotlin
+ *   fun <A, B> Events<Pair<A, B>>.unzip(): Pair<Events<A>, Events<B>> {
+ *       val lefts = map { it.first }
+ *       val rights = map { it.second }
+ *       return lefts to rights
+ *   }
  * ```
  */
 @ExperimentalKairosApi
@@ -240,246 +236,6 @@
 }
 
 /**
- * Merges the given [Events] into a single [Events] that emits events from both.
- *
- * Because [Events] can only emit one value per transaction, the provided [transformCoincidence]
- * function is used to combine coincident emissions to produce the result value to be emitted by the
- * merged [Events].
- */
-@ExperimentalKairosApi
-fun <A> Events<A>.mergeWith(
-    other: Events<A>,
-    name: String? = null,
-    transformCoincidence: TransactionScope.(A, A) -> A = { a, _ -> a },
-): Events<A> {
-    val node =
-        mergeNodes(
-            name = name,
-            getPulse = { init.connect(evalScope = this) },
-            getOther = { other.init.connect(evalScope = this) },
-        ) { a, b ->
-            transformCoincidence(a, b)
-        }
-    return EventsInit(constInit(name = null, node))
-}
-
-/**
- * Merges the given [Events] into a single [Events] that emits events from all. All coincident
- * emissions are collected into the emitted [List], preserving the input ordering.
- *
- * @see mergeWith
- * @see mergeLeft
- */
-@ExperimentalKairosApi
-fun <A> merge(vararg events: Events<A>): Events<List<A>> = events.asIterable().merge()
-
-/**
- * Merges the given [Events] into a single [Events] that emits events from all. In the case of
- * coincident emissions, the emission from the left-most [Events] is emitted.
- *
- * @see merge
- */
-@ExperimentalKairosApi
-fun <A> mergeLeft(vararg events: Events<A>): Events<A> = events.asIterable().mergeLeft()
-
-/**
- * Merges the given [Events] into a single [Events] that emits events from all.
- *
- * Because [Events] can only emit one value per transaction, the provided [transformCoincidence]
- * function is used to combine coincident emissions to produce the result value to be emitted by the
- * merged [Events].
- */
-// TODO: can be optimized to avoid creating the intermediate list
-fun <A> merge(vararg events: Events<A>, transformCoincidence: (A, A) -> A): Events<A> =
-    merge(*events).map { l -> l.reduce(transformCoincidence) }
-
-/**
- * Merges the given [Events] into a single [Events] that emits events from all. All coincident
- * emissions are collected into the emitted [List], preserving the input ordering.
- *
- * @see mergeWith
- * @see mergeLeft
- */
-@ExperimentalKairosApi
-fun <A> Iterable<Events<A>>.merge(): Events<List<A>> =
-    EventsInit(constInit(name = null, mergeNodes { map { it.init.connect(evalScope = this) } }))
-
-/**
- * Merges the given [Events] into a single [Events] that emits events from all. In the case of
- * coincident emissions, the emission from the left-most [Events] is emitted.
- *
- * @see merge
- */
-@ExperimentalKairosApi
-fun <A> Iterable<Events<A>>.mergeLeft(): Events<A> =
-    EventsInit(constInit(name = null, mergeNodesLeft { map { it.init.connect(evalScope = this) } }))
-
-/**
- * Creates a new [Events] that emits events from all given [Events]. All simultaneous emissions are
- * collected into the emitted [List], preserving the input ordering.
- *
- * @see mergeWith
- */
-@ExperimentalKairosApi fun <A> Sequence<Events<A>>.merge(): Events<List<A>> = asIterable().merge()
-
-/**
- * Creates a new [Events] that emits events from all given [Events]. All simultaneous emissions are
- * collected into the emitted [Map], and are given the same key of the associated [Events] in the
- * input [Map].
- *
- * @see mergeWith
- */
-@ExperimentalKairosApi
-fun <K, A> Map<K, Events<A>>.merge(): Events<Map<K, A>> =
-    asSequence()
-        .map { (k, events) -> events.map { a -> k to a } }
-        .toList()
-        .merge()
-        .map { it.toMap() }
-
-/**
- * Returns a [GroupedEvents] that can be used to efficiently split a single [Events] into multiple
- * downstream [Events].
- *
- * The input [Events] emits [Map] instances that specify which downstream [Events] the associated
- * value will be emitted from. These downstream [Events] can be obtained via
- * [GroupedEvents.eventsForKey].
- *
- * An example:
- * ```
- *   val fooEvents: Events<Map<String, Foo>> = ...
- *   val fooById: GroupedEvents<String, Foo> = fooEvents.groupByKey()
- *   val fooBar: Events<Foo> = fooById["bar"]
- * ```
- *
- * This is semantically equivalent to `val fooBar = fooEvents.mapNotNull { map -> map["bar"] }` but
- * is significantly more efficient; specifically, using [mapNotNull] in this way incurs a `O(n)`
- * performance hit, where `n` is the number of different [mapNotNull] operations used to filter on a
- * specific key's presence in the emitted [Map]. [groupByKey] internally uses a [HashMap] to lookup
- * the appropriate downstream [Events], and so operates in `O(1)`.
- *
- * Note that the returned [GroupedEvents] should be cached and re-used to gain the performance
- * benefit.
- *
- * @see selector
- */
-@ExperimentalKairosApi
-fun <K, A> Events<Map<K, A>>.groupByKey(numKeys: Int? = null): GroupedEvents<K, A> =
-    GroupedEvents(demuxMap({ init.connect(this) }, numKeys))
-
-/**
- * Shorthand for `map { mapOf(extractKey(it) to it) }.groupByKey()`
- *
- * @see groupByKey
- */
-@ExperimentalKairosApi
-fun <K, A> Events<A>.groupBy(
-    numKeys: Int? = null,
-    extractKey: TransactionScope.(A) -> K,
-): GroupedEvents<K, A> = map { mapOf(extractKey(it) to it) }.groupByKey(numKeys)
-
-/**
- * Returns two new [Events] that contain elements from this [Events] that satisfy or don't satisfy
- * [predicate].
- *
- * Using this is equivalent to `upstream.filter(predicate) to upstream.filter { !predicate(it) }`
- * but is more efficient; specifically, [partition] will only invoke [predicate] once per element.
- */
-@ExperimentalKairosApi
-fun <A> Events<A>.partition(
-    predicate: TransactionScope.(A) -> Boolean
-): Pair<Events<A>, Events<A>> {
-    val grouped: GroupedEvents<Boolean, A> = groupBy(numKeys = 2, extractKey = predicate)
-    return Pair(grouped.eventsForKey(true), grouped.eventsForKey(false))
-}
-
-/**
- * Returns two new [Events] that contain elements from this [Events]; [Pair.first] will contain
- * [Left] values, and [Pair.second] will contain [Right] values.
- *
- * Using this is equivalent to using [filterIsInstance] in conjunction with [map] twice, once for
- * [Left]s and once for [Right]s, but is slightly more efficient; specifically, the
- * [filterIsInstance] check is only performed once per element.
- */
-@ExperimentalKairosApi
-fun <A, B> Events<Either<A, B>>.partitionEither(): Pair<Events<A>, Events<B>> {
-    val (left, right) = partition { it is Left }
-    return Pair(left.mapCheap { (it as Left).value }, right.mapCheap { (it as Right).value })
-}
-
-/**
- * A mapping from keys of type [K] to [Events] emitting values of type [A].
- *
- * @see groupByKey
- */
-@ExperimentalKairosApi
-class GroupedEvents<in K, out A> internal constructor(internal val impl: DemuxImpl<K, A>) {
-    /**
-     * Returns an [Events] that emits values of type [A] that correspond to the given [key].
-     *
-     * @see groupByKey
-     */
-    fun eventsForKey(key: K): Events<A> = EventsInit(constInit(name = null, impl.eventsForKey(key)))
-
-    /**
-     * Returns an [Events] that emits values of type [A] that correspond to the given [key].
-     *
-     * @see groupByKey
-     */
-    operator fun get(key: K): Events<A> = eventsForKey(key)
-}
-
-/**
- * Returns an [Events] that switches to the [Events] contained within this [State] whenever it
- * changes.
- *
- * This switch does take effect until the *next* transaction after [State] changes. For a switch
- * that takes effect immediately, see [switchEventsPromptly].
- */
-@ExperimentalKairosApi
-fun <A> State<Events<A>>.switchEvents(name: String? = null): Events<A> {
-    val patches =
-        mapImpl({ init.connect(this).changes }) { newEvents, _ -> newEvents.init.connect(this) }
-    return EventsInit(
-        constInit(
-            name = null,
-            switchDeferredImplSingle(
-                name = name,
-                getStorage = {
-                    init.connect(this).getCurrentWithEpoch(this).first.init.connect(this)
-                },
-                getPatches = { patches },
-            ),
-        )
-    )
-}
-
-/**
- * Returns an [Events] that switches to the [Events] contained within this [State] whenever it
- * changes.
- *
- * This switch takes effect immediately within the same transaction that [State] changes. In
- * general, you should prefer [switchEvents] over this method. It is both safer and more performant.
- */
-// TODO: parameter to handle coincidental emission from both old and new
-@ExperimentalKairosApi
-fun <A> State<Events<A>>.switchEventsPromptly(): Events<A> {
-    val patches =
-        mapImpl({ init.connect(this).changes }) { newEvents, _ -> newEvents.init.connect(this) }
-    return EventsInit(
-        constInit(
-            name = null,
-            switchPromptImplSingle(
-                getStorage = {
-                    init.connect(this).getCurrentWithEpoch(this).first.init.connect(this)
-                },
-                getPatches = { patches },
-            ),
-        )
-    )
-}
-
-/**
  * A mutable [Events] that provides the ability to [emit] values to the network, handling
  * backpressure by coalescing all emissions into batches.
  *
@@ -494,7 +250,7 @@
     private val getInitialValue: () -> Out,
     internal val impl: InputNode<Out> = InputNode(),
 ) : Events<Out>() {
-    internal val storage = AtomicReference(false to lazy { getInitialValue() })
+    private val storage = AtomicReference(false to lazy { getInitialValue() })
 
     override fun toString(): String = "${this::class.simpleName}@$hashString"
 
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Filter.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Filter.kt
new file mode 100644
index 0000000..8ca5ac8
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Filter.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.filterImpl
+import com.android.systemui.kairos.internal.filterPresentImpl
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.toMaybe
+
+/** Return an [Events] that emits from the original [Events] only when [state] is `true`. */
+@ExperimentalKairosApi
+fun <A> Events<A>.filter(state: State<Boolean>): Events<A> = filter { state.sample() }
+
+/**
+ * Returns an [Events] containing only values of the original [Events] that are not null.
+ *
+ * ``` kotlin
+ *  fun <A> Events<A?>.filterNotNull(): Events<A> = mapNotNull { it }
+ * ```
+ *
+ * @see mapNotNull
+ */
+@ExperimentalKairosApi
+fun <A> Events<A?>.filterNotNull(): Events<A> = mapCheap { it.toMaybe() }.filterPresent()
+
+/**
+ * Returns an [Events] containing only values of the original [Events] that are instances of [A].
+ *
+ * ``` kotlin
+ *   inline fun <reified A> Events<*>.filterIsInstance(): Events<A> =
+ *       mapNotNull { it as? A }
+ * ```
+ *
+ * @see mapNotNull
+ */
+@ExperimentalKairosApi
+inline fun <reified A> Events<*>.filterIsInstance(): Events<A> =
+    mapCheap { it as? A }.filterNotNull()
+
+/**
+ * Returns an [Events] containing only values of the original [Events] that are present.
+ *
+ * ``` kotlin
+ *  fun <A> Events<Maybe<A>>.filterPresent(): Events<A> = mapMaybe { it }
+ * ```
+ *
+ * @see mapMaybe
+ */
+@ExperimentalKairosApi
+fun <A> Events<Maybe<A>>.filterPresent(): Events<A> =
+    EventsInit(constInit(name = null, filterPresentImpl { init.connect(evalScope = this) }))
+
+/**
+ * Returns an [Events] containing only values of the original [Events] that satisfy the given
+ * [predicate].
+ *
+ * ``` kotlin
+ *   fun <A> Events<A>.filter(predicate: TransactionScope.(A) -> Boolean): Events<A> =
+ *       mapMaybe { if (predicate(it)) present(it) else absent }
+ * ```
+ *
+ * @see mapMaybe
+ */
+@ExperimentalKairosApi
+fun <A> Events<A>.filter(predicate: TransactionScope.(A) -> Boolean): Events<A> {
+    val pulse = filterImpl({ init.connect(evalScope = this) }) { predicate(it) }
+    return EventsInit(constInit(name = null, pulse))
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/GroupBy.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/GroupBy.kt
new file mode 100644
index 0000000..45da34a
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/GroupBy.kt
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.DemuxImpl
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.demuxMap
+import com.android.systemui.kairos.util.Either
+import com.android.systemui.kairos.util.These
+import com.android.systemui.kairos.util.maybeFirst
+import com.android.systemui.kairos.util.maybeSecond
+import com.android.systemui.kairos.util.orError
+
+/**
+ * Returns a [GroupedEvents] that can be used to efficiently split a single [Events] into multiple
+ * downstream [Events].
+ *
+ * The input [Events] emits [Map] instances that specify which downstream [Events] the associated
+ * value will be emitted from. These downstream [Events] can be obtained via
+ * [GroupedEvents.eventsForKey].
+ *
+ * An example:
+ * ```
+ *   val fooEvents: Events<Map<String, Foo>> = ...
+ *   val fooById: GroupedEvents<String, Foo> = fooEvents.groupByKey()
+ *   val fooBar: Events<Foo> = fooById["bar"]
+ * ```
+ *
+ * This is semantically equivalent to `val fooBar = fooEvents.mapNotNull { map -> map["bar"] }` but
+ * is significantly more efficient; specifically, using [mapNotNull] in this way incurs a `O(n)`
+ * performance hit, where `n` is the number of different [mapNotNull] operations used to filter on a
+ * specific key's presence in the emitted [Map]. [groupByKey] internally uses a [HashMap] to lookup
+ * the appropriate downstream [Events], and so operates in `O(1)`.
+ *
+ * The optional [numKeys] argument is an optimization used to initialize the internal [HashMap].
+ *
+ * Note that the returned [GroupedEvents] should be cached and re-used to gain the performance
+ * benefit.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.groupByKey
+ * @see selector
+ */
+@ExperimentalKairosApi
+fun <K, A> Events<Map<K, A>>.groupByKey(numKeys: Int? = null): GroupedEvents<K, A> =
+    GroupedEvents(demuxMap({ init.connect(this) }, numKeys))
+
+/**
+ * Returns a [GroupedEvents] that can be used to efficiently split a single [Events] into multiple
+ * downstream [Events]. The downstream [Events] are associated with a [key][K], which is derived
+ * from each emission of the original [Events] via [extractKey].
+ *
+ * ``` kotlin
+ *   fun <K, A> Events<A>.groupBy(
+ *       numKeys: Int? = null,
+ *       extractKey: TransactionScope.(A) -> K,
+ *   ): GroupedEvents<K, A> =
+ *       map { mapOf(extractKey(it) to it) }.groupByKey(numKeys)
+ * ```
+ *
+ * @see groupByKey
+ */
+@ExperimentalKairosApi
+fun <K, A> Events<A>.groupBy(
+    numKeys: Int? = null,
+    extractKey: TransactionScope.(A) -> K,
+): GroupedEvents<K, A> = map { mapOf(extractKey(it) to it) }.groupByKey(numKeys)
+
+/**
+ * A mapping from keys of type [K] to [Events] emitting values of type [A].
+ *
+ * @see groupByKey
+ */
+@ExperimentalKairosApi
+class GroupedEvents<in K, out A> internal constructor(internal val impl: DemuxImpl<K, A>) {
+    /**
+     * Returns an [Events] that emits values of type [A] that correspond to the given [key].
+     *
+     * @see groupByKey
+     */
+    fun eventsForKey(key: K): Events<A> = EventsInit(constInit(name = null, impl.eventsForKey(key)))
+
+    /**
+     * Returns an [Events] that emits values of type [A] that correspond to the given [key].
+     *
+     * @see groupByKey
+     */
+    operator fun get(key: K): Events<A> = eventsForKey(key)
+}
+
+/**
+ * Returns two new [Events] that contain elements from this [Events] that satisfy or don't satisfy
+ * [predicate].
+ *
+ * Using this is equivalent to `upstream.filter(predicate) to upstream.filter { !predicate(it) }`
+ * but is more efficient; specifically, [partition] will only invoke [predicate] once per element.
+ *
+ * ``` kotlin
+ *   fun <A> Events<A>.partition(
+ *       predicate: TransactionScope.(A) -> Boolean
+ *   ): Pair<Events<A>, Events<A>> =
+ *       map { if (predicate(it)) left(it) else right(it) }.partitionEither()
+ * ```
+ *
+ * @see partitionEither
+ */
+@ExperimentalKairosApi
+fun <A> Events<A>.partition(
+    predicate: TransactionScope.(A) -> Boolean
+): Pair<Events<A>, Events<A>> {
+    val grouped: GroupedEvents<Boolean, A> = groupBy(numKeys = 2, extractKey = predicate)
+    return Pair(grouped.eventsForKey(true), grouped.eventsForKey(false))
+}
+
+/**
+ * Returns two new [Events] that contain elements from this [Events]; [Pair.first] will contain
+ * [First] values, and [Pair.second] will contain [Second] values.
+ *
+ * Using this is equivalent to using [filterIsInstance] in conjunction with [map] twice, once for
+ * [First]s and once for [Second]s, but is slightly more efficient; specifically, the
+ * [filterIsInstance] check is only performed once per element.
+ *
+ * ``` kotlin
+ *   fun <A, B> Events<Either<A, B>>.partitionEither(): Pair<Events<A>, Events<B>> =
+ *     map { it.asThese() }.partitionThese()
+ * ```
+ *
+ * @see partitionThese
+ */
+@ExperimentalKairosApi
+fun <A, B> Events<Either<A, B>>.partitionEither(): Pair<Events<A>, Events<B>> {
+    val (left, right) = partition { it is Either.First }
+    return Pair(
+        left.mapCheap { (it as Either.First).value },
+        right.mapCheap { (it as Either.Second).value },
+    )
+}
+
+/**
+ * Returns two new [Events] that contain elements from this [Events]; [Pair.first] will contain
+ * [These.first] values, and [Pair.second] will contain [These.second] values. If the original
+ * emission was a [These.both], then both result [Events] will emit a value simultaneously.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.partitionThese
+ */
+@ExperimentalKairosApi
+fun <A, B> Events<These<A, B>>.partitionThese(): Pair<Events<A>, Events<B>> {
+    val grouped =
+        mapCheap {
+                when (it) {
+                    is These.Both -> mapOf(true to it, false to it)
+                    is These.Second -> mapOf(false to it)
+                    is These.First -> mapOf(true to it)
+                }
+            }
+            .groupByKey(numKeys = 2)
+    return Pair(
+        grouped.eventsForKey(true).mapCheap {
+            it.maybeFirst().orError { "unexpected missing value" }
+        },
+        grouped.eventsForKey(false).mapCheap {
+            it.maybeSecond().orError { "unexpected missing value" }
+        },
+    )
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Incremental.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Incremental.kt
index c95b9e8..d88ae3b8 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Incremental.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Incremental.kt
@@ -21,27 +21,31 @@
 import com.android.systemui.kairos.internal.Init
 import com.android.systemui.kairos.internal.InitScope
 import com.android.systemui.kairos.internal.NoScope
-import com.android.systemui.kairos.internal.awaitValues
 import com.android.systemui.kairos.internal.constIncremental
 import com.android.systemui.kairos.internal.constInit
 import com.android.systemui.kairos.internal.init
-import com.android.systemui.kairos.internal.mapImpl
 import com.android.systemui.kairos.internal.mapValuesImpl
-import com.android.systemui.kairos.internal.store.ConcurrentHashMapK
-import com.android.systemui.kairos.internal.switchDeferredImpl
-import com.android.systemui.kairos.internal.switchPromptImpl
 import com.android.systemui.kairos.internal.util.hashString
 import com.android.systemui.kairos.util.MapPatch
-import com.android.systemui.kairos.util.map
 import com.android.systemui.kairos.util.mapPatchFromFullDiff
 import kotlin.reflect.KProperty
 
-/** A [State] tracking a [Map] that receives incremental updates. */
+/**
+ * A [State] tracking a [Map] that receives incremental updates.
+ *
+ * [Incremental] allows one to react to the [subset of changes][updates] to the held map, without
+ * having to perform a manual diff of the map to determine what changed.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.incrementals
+ */
 sealed class Incremental<K, out V> : State<Map<K, V>>() {
     abstract override val init: Init<IncrementalImpl<K, V>>
 }
 
-/** An [Incremental] that never changes. */
+/**
+ * Returns a constant [Incremental] that never changes. [changes] and [updates] are both equivalent
+ * to [emptyEvents], and [TransactionScope.sample] will always produce [value].
+ */
 @ExperimentalKairosApi
 fun <K, V> incrementalOf(value: Map<K, V>): Incremental<K, V> {
     val operatorName = "stateOf"
@@ -57,6 +61,10 @@
  * [value][Lazy.value] will be queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> Lazy<Incremental<K, V>>.defer() = deferredIncremental { value }
+ * ```
  */
 @ExperimentalKairosApi
 fun <K, V> Lazy<Incremental<K, V>>.defer(): Incremental<K, V> = deferInline { value }
@@ -69,6 +77,10 @@
  * queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> DeferredValue<Incremental<K, V>>.defer() = deferredIncremental { get() }
+ * ```
  */
 @ExperimentalKairosApi
 fun <K, V> DeferredValue<Incremental<K, V>>.defer(): Incremental<K, V> = deferInline {
@@ -119,94 +131,14 @@
 }
 
 /**
- * Returns an [Events] that emits from a merged, incrementally-accumulated collection of [Events]
- * emitted from this, following the same "patch" rules as outlined in
- * [StateScope.foldStateMapIncrementally].
+ * A forward-reference to an [Incremental]. Useful for recursive definitions.
  *
- * Conceptually this is equivalent to:
- * ```kotlin
- *   fun <K, V> State<Map<K, V>>.mergeEventsIncrementally(): Events<Map<K, V>> =
- *     map { it.merge() }.switchEvents()
- * ```
- *
- * While the behavior is equivalent to the conceptual definition above, the implementation is
- * significantly more efficient.
- *
- * @see merge
+ * This reference can be used like a standard [Incremental], but will throw an error if its
+ * [loopback] is unset before it is [observed][BuildScope.observe] or
+ * [sampled][TransactionScope.sample]. Note that it is safe to invoke
+ * [TransactionScope.sampleDeferred] before [loopback] is set, provided the [DeferredValue] is not
+ * [queried][KairosScope.get].
  */
-fun <K, V> Incremental<K, Events<V>>.mergeEventsIncrementally(): Events<Map<K, V>> {
-    val operatorName = "mergeEventsIncrementally"
-    val name = operatorName
-    val patches =
-        mapImpl({ init.connect(this).patches }) { patch, _ ->
-            patch.mapValues { (_, m) -> m.map { events -> events.init.connect(this) } }.asIterable()
-        }
-    return EventsInit(
-        constInit(
-            name,
-            switchDeferredImpl(
-                    name = name,
-                    getStorage = {
-                        init
-                            .connect(this)
-                            .getCurrentWithEpoch(this)
-                            .first
-                            .mapValues { (_, events) -> events.init.connect(this) }
-                            .asIterable()
-                    },
-                    getPatches = { patches },
-                    storeFactory = ConcurrentHashMapK.Factory(),
-                )
-                .awaitValues(),
-        )
-    )
-}
-
-/**
- * Returns an [Events] that emits from a merged, incrementally-accumulated collection of [Events]
- * emitted from this, following the same "patch" rules as outlined in
- * [StateScope.foldStateMapIncrementally].
- *
- * Conceptually this is equivalent to:
- * ```kotlin
- *   fun <K, V> State<Map<K, V>>.mergeEventsIncrementallyPromptly(): Events<Map<K, V>> =
- *     map { it.merge() }.switchEventsPromptly()
- * ```
- *
- * While the behavior is equivalent to the conceptual definition above, the implementation is
- * significantly more efficient.
- *
- * @see merge
- */
-fun <K, V> Incremental<K, Events<V>>.mergeEventsIncrementallyPromptly(): Events<Map<K, V>> {
-    val operatorName = "mergeEventsIncrementally"
-    val name = operatorName
-    val patches =
-        mapImpl({ init.connect(this).patches }) { patch, _ ->
-            patch.mapValues { (_, m) -> m.map { events -> events.init.connect(this) } }.asIterable()
-        }
-    return EventsInit(
-        constInit(
-            name,
-            switchPromptImpl(
-                    name = name,
-                    getStorage = {
-                        init
-                            .connect(this)
-                            .getCurrentWithEpoch(this)
-                            .first
-                            .mapValues { (_, events) -> events.init.connect(this) }
-                            .asIterable()
-                    },
-                    getPatches = { patches },
-                    storeFactory = ConcurrentHashMapK.Factory(),
-                )
-                .awaitValues(),
-        )
-    )
-}
-
-/** A forward-reference to an [Incremental], allowing for recursive definitions. */
 @ExperimentalKairosApi
 class IncrementalLoop<K, V>(private val name: String? = null) : Incremental<K, V>() {
 
@@ -215,7 +147,10 @@
     override val init: Init<IncrementalImpl<K, V>> =
         init(name) { deferred.value.init.connect(evalScope = this) }
 
-    /** The [Incremental] this [IncrementalLoop] will forward to. */
+    /**
+     * The [Incremental] this reference is referring to. Must be set before this [IncrementalLoop]
+     * is [observed][BuildScope.observe].
+     */
     var loopback: Incremental<K, V>? = null
         set(value) {
             value?.let {
@@ -237,8 +172,8 @@
 }
 
 /**
- * Returns an [Incremental] whose [updates] are calculated by diffing the given [State]'s
- * [transitions].
+ * Returns an [Incremental] whose [updates] are calculated by [diffing][mapPatchFromFullDiff] the
+ * given [State]'s [transitions].
  */
 fun <K, V> State<Map<K, V>>.asIncremental(): Incremental<K, V> {
     if (this is Incremental<K, V>) return this
@@ -264,34 +199,6 @@
     )
 }
 
-/** Returns an [Incremental] that acts like the current value of the given [State]. */
-fun <K, V> State<Incremental<K, V>>.switchIncremental(): Incremental<K, V> {
-    val stateChangePatches =
-        transitions.mapNotNull { (old, new) ->
-            mapPatchFromFullDiff(old.sample(), new.sample()).takeIf { it.isNotEmpty() }
-        }
-    val innerChanges =
-        map { inner ->
-                merge(stateChangePatches, inner.updates) { switchPatch, upcomingPatch ->
-                    switchPatch + upcomingPatch
-                }
-            }
-            .switchEventsPromptly()
-    val flattened = flatten()
-    return IncrementalInit(
-        init("switchIncremental") {
-            val upstream = flattened.init.connect(this)
-            IncrementalImpl(
-                "switchIncremental",
-                "switchIncremental",
-                upstream.changes,
-                innerChanges.init.connect(this),
-                upstream.store,
-            )
-        }
-    )
-}
-
 private inline fun <K, V> deferInline(
     crossinline block: InitScope.() -> Incremental<K, V>
 ): Incremental<K, V> = IncrementalInit(init(name = null) { block().init.connect(evalScope = this) })
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosNetwork.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosNetwork.kt
index 77598b3..19e3fcd 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosNetwork.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosNetwork.kt
@@ -23,16 +23,15 @@
 import com.android.systemui.kairos.internal.util.childScope
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
+import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.job
 import kotlinx.coroutines.launch
 
-/**
- * Marks declarations that are still **experimental** and shouldn't be used in general production
- * code.
- */
+/** Marks APIs that are still **experimental** and shouldn't be used in general production code. */
 @RequiresOptIn(
     message = "This API is experimental and should not be used in general production code."
 )
@@ -139,37 +138,46 @@
     private val endSignal: Events<Any>,
 ) : KairosNetwork {
     override suspend fun <R> transact(block: TransactionScope.() -> R): R =
-        network.transaction("KairosNetwork.transact") { block() }.await()
+        network.transaction("KairosNetwork.transact") { block() }.awaitOrCancel()
 
     override suspend fun activateSpec(spec: BuildSpec<*>) {
-        val stopEmitter =
-            CoalescingMutableEvents(
-                name = "activateSpec",
-                coalesce = { _, _: Unit -> },
-                network = network,
-                getInitialValue = {},
-            )
-        val job =
-            network
-                .transaction("KairosNetwork.activateSpec") {
-                    val buildScope =
-                        BuildScopeImpl(
-                            stateScope =
-                                StateScopeImpl(
-                                    evalScope = this,
-                                    endSignal = mergeLeft(stopEmitter, endSignal),
-                                ),
-                            coroutineScope = scope,
-                        )
-                    buildScope.launchScope(spec)
+        val stopEmitter = conflatedMutableEvents<Unit>()
+        network
+            .transaction("KairosNetwork.activateSpec") {
+                val buildScope =
+                    BuildScopeImpl(
+                        stateScope =
+                            StateScopeImpl(
+                                evalScope = this,
+                                endSignalLazy = lazy { mergeLeft(stopEmitter, endSignal) },
+                            ),
+                        coroutineScope = scope,
+                    )
+                buildScope.launchScope {
+                    spec.applySpec()
+                    launchEffect { awaitCancellationAndThen { stopEmitter.emit(Unit) } }
                 }
-                .await()
-        awaitCancellationAndThen {
-            stopEmitter.emit(Unit)
-            job.cancel()
-        }
+            }
+            .awaitOrCancel()
+            .joinOrCancel()
     }
 
+    private suspend fun <T> Deferred<T>.awaitOrCancel(): T =
+        try {
+            await()
+        } catch (ex: CancellationException) {
+            cancel(ex)
+            throw ex
+        }
+
+    private suspend fun Job.joinOrCancel(): Unit =
+        try {
+            join()
+        } catch (ex: CancellationException) {
+            cancel(ex)
+            throw ex
+        }
+
     override fun <In, Out> coalescingMutableEvents(
         coalesce: (old: Out, new: In) -> Out,
         getInitialValue: () -> Out,
@@ -214,3 +222,45 @@
     scope.launch(CoroutineName("launchKairosNetwork scheduler")) { network.runInputScheduler() }
     return RootKairosNetwork(network, scope, scope.coroutineContext.job)
 }
+
+@ExperimentalKairosApi
+interface HasNetwork : KairosScope {
+    /**
+     * A [KairosNetwork] handle that is bound to the lifetime of a [BuildScope].
+     *
+     * It supports all of the standard functionality by which external code can interact with this
+     * Kairos network, but all [activated][KairosNetwork.activateSpec] [BuildSpec]s are bound as
+     * children to the [BuildScope], such that when the [BuildScope] is destroyed, all children are
+     * also destroyed.
+     */
+    val kairosNetwork: KairosNetwork
+}
+
+/** Returns a [MutableEvents] that can emit values into this [KairosNetwork]. */
+@ExperimentalKairosApi
+fun <T> HasNetwork.MutableEvents(): MutableEvents<T> = MutableEvents(kairosNetwork)
+
+/** Returns a [MutableState] with initial state [initialValue]. */
+@ExperimentalKairosApi
+fun <T> HasNetwork.MutableState(initialValue: T): MutableState<T> =
+    MutableState(kairosNetwork, initialValue)
+
+/** Returns a [CoalescingMutableEvents] that can emit values into this [KairosNetwork]. */
+@ExperimentalKairosApi
+fun <In, Out> HasNetwork.CoalescingMutableEvents(
+    coalesce: (old: Out, new: In) -> Out,
+    initialValue: Out,
+): CoalescingMutableEvents<In, Out> = CoalescingMutableEvents(kairosNetwork, coalesce, initialValue)
+
+/** Returns a [CoalescingMutableEvents] that can emit values into this [KairosNetwork]. */
+@ExperimentalKairosApi
+fun <In, Out> HasNetwork.CoalescingMutableEvents(
+    coalesce: (old: Out, new: In) -> Out,
+    getInitialValue: () -> Out,
+): CoalescingMutableEvents<In, Out> =
+    CoalescingMutableEvents(kairosNetwork, coalesce, getInitialValue)
+
+/** Returns a [CoalescingMutableEvents] that can emit values into this [KairosNetwork]. */
+@ExperimentalKairosApi
+fun <T> HasNetwork.ConflatedMutableEvents(): CoalescingMutableEvents<T, T> =
+    ConflatedMutableEvents(kairosNetwork)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosScope.kt
index ce3e923..e526f45 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/KairosScope.kt
@@ -16,42 +16,11 @@
 
 package com.android.systemui.kairos
 
-import com.android.systemui.kairos.internal.CompletableLazy
-
 /** Denotes [KairosScope] interfaces as [DSL markers][DslMarker]. */
 @DslMarker annotation class KairosScopeMarker
 
 /**
- * Base scope for all Kairos scopes. Used to prevent implicitly capturing other scopes from in
+ * Base scope for all Kairos scopes. Used to prevent implicitly capturing other scopes from inner
  * lambdas.
  */
-@KairosScopeMarker
-@ExperimentalKairosApi
-interface KairosScope {
-    /** Returns the value held by the [DeferredValue], suspending until available if necessary. */
-    fun <A> DeferredValue<A>.get(): A = unwrapped.value
-}
-
-/**
- * A value that may not be immediately (synchronously) available, but is guaranteed to be available
- * before this transaction is completed.
- *
- * @see KairosScope.get
- */
-@ExperimentalKairosApi
-class DeferredValue<out A> internal constructor(internal val unwrapped: Lazy<A>)
-
-/**
- * Returns the value held by this [DeferredValue], or throws [IllegalStateException] if it is not
- * yet available.
- *
- * This API is not meant for general usage within the Kairos network. It is made available mainly
- * for debugging and logging. You should always prefer [get][KairosScope.get] if possible.
- *
- * @see KairosScope.get
- */
-@ExperimentalKairosApi fun <A> DeferredValue<A>.getUnsafe(): A = unwrapped.value
-
-/** Returns an already-available [DeferredValue] containing [value]. */
-@ExperimentalKairosApi
-fun <A> deferredOf(value: A): DeferredValue<A> = DeferredValue(CompletableLazy(value))
+@KairosScopeMarker @ExperimentalKairosApi interface KairosScope
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Merge.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Merge.kt
new file mode 100644
index 0000000..de9dca4
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Merge.kt
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.awaitValues
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.mapImpl
+import com.android.systemui.kairos.internal.mergeNodes
+import com.android.systemui.kairos.internal.mergeNodesLeft
+import com.android.systemui.kairos.internal.store.ConcurrentHashMapK
+import com.android.systemui.kairos.internal.switchDeferredImpl
+import com.android.systemui.kairos.internal.switchPromptImpl
+import com.android.systemui.kairos.util.map
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from both.
+ *
+ * Because [Events] can only emit one value per transaction, the provided [transformCoincidence]
+ * function is used to combine coincident emissions to produce the result value to be emitted by the
+ * merged [Events].
+ *
+ * ``` kotlin
+ * fun <A> Events<A>.mergeWith(
+ *     other: Events<A>,
+ *     transformCoincidence: TransactionScope.(A, A) -> A = { a, _ -> a },
+ * ): Events<A> =
+ *     listOf(this, other).merge().map { it.reduce(transformCoincidence) }
+ * ```
+ *
+ * @see merge
+ */
+@ExperimentalKairosApi
+fun <A> Events<A>.mergeWith(
+    other: Events<A>,
+    transformCoincidence: TransactionScope.(A, A) -> A = { a, _ -> a },
+): Events<A> {
+    val node =
+        mergeNodes(
+            getPulse = { init.connect(evalScope = this) },
+            getOther = { other.init.connect(evalScope = this) },
+        ) { a, b ->
+            transformCoincidence(a, b)
+        }
+    return EventsInit(constInit(name = null, node))
+}
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from all. All coincident
+ * emissions are collected into the emitted [List], preserving the input ordering.
+ *
+ * ``` kotlin
+ *   fun <A> merge(vararg events: Events<A>): Events<List<A>> = events.asIterable().merge()
+ * ```
+ *
+ * @see mergeWith
+ * @see mergeLeft
+ */
+@ExperimentalKairosApi
+fun <A> merge(vararg events: Events<A>): Events<List<A>> = events.asIterable().merge()
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from all. In the case of
+ * coincident emissions, the emission from the left-most [Events] is emitted.
+ *
+ * ``` kotlin
+ *   fun <A> mergeLeft(vararg events: Events<A>): Events<A> = events.asIterable().mergeLeft()
+ * ```
+ *
+ * @see merge
+ */
+@ExperimentalKairosApi
+fun <A> mergeLeft(vararg events: Events<A>): Events<A> = events.asIterable().mergeLeft()
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from all.
+ *
+ * Because [Events] can only emit one value per transaction, the provided [transformCoincidence]
+ * function is used to combine coincident emissions to produce the result value to be emitted by the
+ * merged [Events].
+ *
+ * ``` kotlin
+ *   fun <A> merge(vararg events: Events<A>, transformCoincidence: (A, A) -> A): Events<A> =
+ *       merge(*events).map { l -> l.reduce(transformCoincidence) }
+ * ```
+ */
+fun <A> merge(vararg events: Events<A>, transformCoincidence: (A, A) -> A): Events<A> =
+    merge(*events).map { l -> l.reduce(transformCoincidence) }
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from all. All coincident
+ * emissions are collected into the emitted [List], preserving the input ordering.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.merge
+ * @see mergeWith
+ * @see mergeLeft
+ */
+@ExperimentalKairosApi
+fun <A> Iterable<Events<A>>.merge(): Events<List<A>> =
+    EventsInit(constInit(name = null, mergeNodes { map { it.init.connect(evalScope = this) } }))
+
+/**
+ * Merges the given [Events] into a single [Events] that emits events from all. In the case of
+ * coincident emissions, the emission from the left-most [Events] is emitted.
+ *
+ * Semantically equivalent to the following definition:
+ * ``` kotlin
+ *   fun <A> Iterable<Events<A>>.mergeLeft(): Events<A> =
+ *       merge().mapCheap { it.first() }
+ * ```
+ *
+ * In reality, the implementation avoids allocating the intermediate list of all coincident
+ * emissions.
+ *
+ * @see merge
+ */
+@ExperimentalKairosApi
+fun <A> Iterable<Events<A>>.mergeLeft(): Events<A> =
+    EventsInit(constInit(name = null, mergeNodesLeft { map { it.init.connect(evalScope = this) } }))
+
+/**
+ * Creates a new [Events] that emits events from all given [Events]. All simultaneous emissions are
+ * collected into the emitted [List], preserving the input ordering.
+ *
+ * ``` kotlin
+ *   fun <A> Sequence<Events<A>>.merge(): Events<List<A>> = asIterable().merge()
+ * ```
+ *
+ * @see mergeWith
+ */
+@ExperimentalKairosApi fun <A> Sequence<Events<A>>.merge(): Events<List<A>> = asIterable().merge()
+
+/**
+ * Creates a new [Events] that emits events from all given [Events]. All simultaneous emissions are
+ * collected into the emitted [Map], and are given the same key of the associated [Events] in the
+ * input [Map].
+ *
+ * ``` kotlin
+ *   fun <K, A> Map<K, Events<A>>.merge(): Events<Map<K, A>> =
+ *       asSequence()
+ *           .map { (k, events) -> events.map { a -> k to a } }
+ *           .toList()
+ *           .merge()
+ *           .map { it.toMap() }
+ * ```
+ *
+ * @see merge
+ */
+@ExperimentalKairosApi
+fun <K, A> Map<K, Events<A>>.merge(): Events<Map<K, A>> =
+    asSequence()
+        .map { (k, events) -> events.map { a -> k to a } }
+        .toList()
+        .merge()
+        .map { it.toMap() }
+
+/**
+ * Returns an [Events] that emits from a merged, incrementally-accumulated collection of [Events]
+ * emitted from this, following the patch rules outlined in
+ * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
+ *
+ * Conceptually this is equivalent to:
+ * ``` kotlin
+ *   fun <K, V> State<Map<K, V>>.mergeEventsIncrementally(): Events<Map<K, V>> =
+ *       map { it.merge() }.switchEvents()
+ * ```
+ *
+ * While the behavior is equivalent to the conceptual definition above, the implementation is
+ * significantly more efficient.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.mergeEventsIncrementally
+ * @see merge
+ */
+fun <K, V> Incremental<K, Events<V>>.mergeEventsIncrementally(): Events<Map<K, V>> {
+    val operatorName = "mergeEventsIncrementally"
+    val name = operatorName
+    val patches =
+        mapImpl({ init.connect(this).patches }) { patch, _ ->
+            patch.mapValues { (_, m) -> m.map { events -> events.init.connect(this) } }.asIterable()
+        }
+    return EventsInit(
+        constInit(
+            name,
+            switchDeferredImpl(
+                    name = name,
+                    getStorage = {
+                        init
+                            .connect(this)
+                            .getCurrentWithEpoch(this)
+                            .first
+                            .mapValues { (_, events) -> events.init.connect(this) }
+                            .asIterable()
+                    },
+                    getPatches = { patches },
+                    storeFactory = ConcurrentHashMapK.Factory(),
+                )
+                .awaitValues(),
+        )
+    )
+}
+
+/**
+ * Returns an [Events] that emits from a merged, incrementally-accumulated collection of [Events]
+ * emitted from this, following the patch rules outlined in
+ * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
+ *
+ * Conceptually this is equivalent to:
+ * ``` kotlin
+ *   fun <K, V> State<Map<K, V>>.mergeEventsIncrementallyPromptly(): Events<Map<K, V>> =
+ *       map { it.merge() }.switchEventsPromptly()
+ * ```
+ *
+ * While the behavior is equivalent to the conceptual definition above, the implementation is
+ * significantly more efficient.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.mergeEventsIncrementallyPromptly
+ * @see merge
+ */
+fun <K, V> Incremental<K, Events<V>>.mergeEventsIncrementallyPromptly(): Events<Map<K, V>> {
+    val operatorName = "mergeEventsIncrementallyPromptly"
+    val name = operatorName
+    val patches =
+        mapImpl({ init.connect(this).patches }) { patch, _ ->
+            patch.mapValues { (_, m) -> m.map { events -> events.init.connect(this) } }.asIterable()
+        }
+    return EventsInit(
+        constInit(
+            name,
+            switchPromptImpl(
+                    name = name,
+                    getStorage = {
+                        init
+                            .connect(this)
+                            .getCurrentWithEpoch(this)
+                            .first
+                            .mapValues { (_, events) -> events.init.connect(this) }
+                            .asIterable()
+                    },
+                    getPatches = { patches },
+                    storeFactory = ConcurrentHashMapK.Factory(),
+                )
+                .awaitValues(),
+        )
+    )
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Modes.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Modes.kt
new file mode 100644
index 0000000..6c070a6
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Modes.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+/**
+ * A modal Kairos sub-network.
+ *
+ * When [enabled][enableMode], all network modifications are applied immediately to the Kairos
+ * network. When the returned [Events] emits a [BuildMode], that mode is enabled and replaces this
+ * mode, undoing all modifications in the process (any registered [observers][BuildScope.observe]
+ * are unregistered, and any pending [side-effects][BuildScope.effect] are cancelled).
+ *
+ * Use [compiledBuildSpec] to compile and stand-up a mode graph.
+ *
+ * @see StatefulMode
+ */
+@ExperimentalKairosApi
+fun interface BuildMode<out A> {
+    /**
+     * Invoked when this mode is enabled. Returns a value and an [Events] that signals a switch to a
+     * new mode.
+     */
+    fun BuildScope.enableMode(): Pair<A, Events<BuildMode<A>>>
+}
+
+/**
+ * Returns a [BuildSpec] that, when [applied][BuildScope.applySpec], stands up a modal-transition
+ * graph starting with this [BuildMode], automatically switching to new modes as they are produced.
+ *
+ * @see BuildMode
+ */
+@ExperimentalKairosApi
+val <A> BuildMode<A>.compiledBuildSpec: BuildSpec<State<A>>
+    get() = buildSpec {
+        var modeChangeEvents by EventsLoop<BuildMode<A>>()
+        val activeMode: State<Pair<A, Events<BuildMode<A>>>> =
+            modeChangeEvents
+                .map { it.run { buildSpec { enableMode() } } }
+                .holdLatestSpec(buildSpec { enableMode() })
+        modeChangeEvents =
+            activeMode
+                .map { statefully { it.second.nextOnly() } }
+                .applyLatestStateful()
+                .switchEvents()
+        activeMode.map { it.first }
+    }
+
+/**
+ * A modal Kairos sub-network.
+ *
+ * When [enabled][enableMode], all state accumulation is immediately started. When the returned
+ * [Events] emits a [BuildMode], that mode is enabled and replaces this mode, stopping all state
+ * accumulation in the process.
+ *
+ * Use [compiledStateful] to compile and stand-up a mode graph.
+ *
+ * @see BuildMode
+ */
+@ExperimentalKairosApi
+fun interface StatefulMode<out A> {
+    /**
+     * Invoked when this mode is enabled. Returns a value and an [Events] that signals a switch to a
+     * new mode.
+     */
+    fun StateScope.enableMode(): Pair<A, Events<StatefulMode<A>>>
+}
+
+/**
+ * Returns a [Stateful] that, when [applied][StateScope.applyStateful], stands up a modal-transition
+ * graph starting with this [StatefulMode], automatically switching to new modes as they are
+ * produced.
+ *
+ * @see StatefulMode
+ */
+@ExperimentalKairosApi
+val <A> StatefulMode<A>.compiledStateful: Stateful<State<A>>
+    get() = statefully {
+        var modeChangeEvents by EventsLoop<StatefulMode<A>>()
+        val activeMode: State<Pair<A, Events<StatefulMode<A>>>> =
+            modeChangeEvents
+                .map { it.run { statefully { enableMode() } } }
+                .holdLatestStateful(statefully { enableMode() })
+        modeChangeEvents =
+            activeMode
+                .map { statefully { it.second.nextOnly() } }
+                .applyLatestStateful()
+                .switchEvents()
+        activeMode.map { it.first }
+    }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Selector.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Selector.kt
new file mode 100644
index 0000000..f7decbb
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Selector.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.DerivedMapCheap
+import com.android.systemui.kairos.internal.StateImpl
+import com.android.systemui.kairos.internal.init
+
+/**
+ * Returns a [StateSelector] that can be used to efficiently check if the input [State] is currently
+ * holding a specific value.
+ *
+ * An example:
+ * ```
+ *   val intState: State<Int> = ...
+ *   val intSelector: StateSelector<Int> = intState.selector()
+ *   // Tracks if intState is holding 1
+ *   val isOne: State<Boolean> = intSelector.whenSelected(1)
+ * ```
+ *
+ * This is semantically equivalent to `val isOne = intState.map { i -> i == 1 }`, but is
+ * significantly more efficient; specifically, using [State.map] in this way incurs a `O(n)`
+ * performance hit, where `n` is the number of different [State.map] operations used to track a
+ * specific value. [selector] internally uses a [HashMap] to lookup the appropriate downstream
+ * [State] to update, and so operates in `O(1)`.
+ *
+ * Note that the returned [StateSelector] should be cached and re-used to gain the performance
+ * benefit.
+ *
+ * @see groupByKey
+ */
+@ExperimentalKairosApi
+fun <A> State<A>.selector(numDistinctValues: Int? = null): StateSelector<A> =
+    StateSelector(
+        this,
+        changes
+            .map { new -> mapOf(new to true, sampleDeferred().value to false) }
+            .groupByKey(numDistinctValues),
+    )
+
+/**
+ * Tracks the currently selected value of type [A] from an upstream [State].
+ *
+ * @see selector
+ */
+@ExperimentalKairosApi
+class StateSelector<in A>
+internal constructor(
+    private val upstream: State<A>,
+    private val groupedChanges: GroupedEvents<A, Boolean>,
+) {
+    /**
+     * Returns a [State] that tracks whether the upstream [State] is currently holding the given
+     * [value].
+     *
+     * @see selector
+     */
+    fun whenSelected(value: A): State<Boolean> {
+        val operatorName = "StateSelector#whenSelected"
+        val name = "$operatorName[$value]"
+        return StateInit(
+            init(name) {
+                StateImpl(
+                    name,
+                    operatorName,
+                    groupedChanges.impl.eventsForKey(value),
+                    DerivedMapCheap(upstream.init) { it == value },
+                )
+            }
+        )
+    }
+
+    operator fun get(value: A): State<Boolean> = whenSelected(value)
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/State.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/State.kt
index 1f0a19d..22ca83c 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/State.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/State.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.kairos
 
 import com.android.systemui.kairos.internal.CompletableLazy
-import com.android.systemui.kairos.internal.DerivedMapCheap
 import com.android.systemui.kairos.internal.EventsImpl
 import com.android.systemui.kairos.internal.Init
 import com.android.systemui.kairos.internal.InitScope
@@ -37,20 +36,31 @@
 import com.android.systemui.kairos.internal.mapStateImpl
 import com.android.systemui.kairos.internal.mapStateImplCheap
 import com.android.systemui.kairos.internal.util.hashString
-import com.android.systemui.kairos.internal.zipStateMap
-import com.android.systemui.kairos.internal.zipStates
+import com.android.systemui.kairos.util.WithPrev
 import kotlin.reflect.KProperty
 
 /**
- * A time-varying value with discrete changes. Essentially, a combination of a [Transactional] that
- * holds a value, and an [Events] that emits when the value changes.
+ * A time-varying value with discrete changes. Conceptually, a combination of a [Transactional] that
+ * holds a value, and an [Events] that emits when the value [changes].
+ *
+ * [States][State] follow these rules:
+ * 1. In the same transaction that [changes] emits a new value, [sample] will continue to return the
+ *    previous value.
+ * 2. Unless it is [constant][stateOf], [States][State] can only be created via [StateScope]
+ *    operations, or derived from other existing [States][State] via [State.map], [combine], etc.
+ * 3. [States][State] can only be [sampled][TransactionScope.sample] within a [TransactionScope].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.states
  */
 @ExperimentalKairosApi
 sealed class State<out A> {
     internal abstract val init: Init<StateImpl<A>>
 }
 
-/** A [State] that never changes. */
+/**
+ * Returns a constant [State] that never changes. [changes] is equivalent to [emptyEvents] and
+ * [TransactionScope.sample] will always produce [value].
+ */
 @ExperimentalKairosApi
 fun <A> stateOf(value: A): State<A> {
     val operatorName = "stateOf"
@@ -65,6 +75,10 @@
  * will be queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> Lazy<State<A>>.defer() = deferredState { value }
+ * ```
  */
 @ExperimentalKairosApi fun <A> Lazy<State<A>>.defer(): State<A> = deferInline { value }
 
@@ -76,6 +90,10 @@
  * and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> DeferredValue<State<A>>.defer() = deferredState { get() }
+ * ```
  */
 @ExperimentalKairosApi
 fun <A> DeferredValue<State<A>>.defer(): State<A> = deferInline { unwrapped.value }
@@ -94,6 +112,8 @@
 /**
  * Returns a [State] containing the results of applying [transform] to the value held by the
  * original [State].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.mapState
  */
 @ExperimentalKairosApi
 fun <A, B> State<A>.map(transform: KairosScope.(A) -> B): State<B> {
@@ -110,10 +130,12 @@
  * Returns a [State] that transforms the value held inside this [State] by applying it to the
  * [transform].
  *
- * Note that unlike [map], the result is not cached. This means that not only should [transform] be
- * fast and pure, it should be *monomorphic* (1-to-1). Failure to do this means that [changes] for
- * the returned [State] will operate unexpectedly, emitting at rates that do not reflect an
- * observable change to the returned [State].
+ * Note that unlike [State.map], the result is not cached. This means that not only should
+ * [transform] be fast and pure, it should be *monomorphic* (1-to-1). Failure to do this means that
+ * [changes] for the returned [State] will operate unexpectedly, emitting at rates that do not
+ * reflect an observable change to the returned [State].
+ *
+ * @see State.map
  */
 @ExperimentalKairosApi
 fun <A, B> State<A>.mapCheapUnsafe(transform: KairosScope.(A) -> B): State<B> {
@@ -125,214 +147,30 @@
 }
 
 /**
- * Returns a [State] by combining the values held inside the given [State]s by applying them to the
- * given function [transform].
- */
-@ExperimentalKairosApi
-fun <A, B, C> State<A>.combineWith(other: State<B>, transform: KairosScope.(A, B) -> C): State<C> =
-    combine(this, other, transform)
-
-/**
  * Splits a [State] of pairs into a pair of [Events][State], where each returned [State] holds half
  * of the original.
  *
- * Shorthand for:
- * ```kotlin
- * val lefts = map { it.first }
- * val rights = map { it.second }
- * return Pair(lefts, rights)
+ * ``` kotlin
+ *   fun <A, B> State<Pair<A, B>>.unzip(): Pair<State<A>, State<B>> {
+ *       val first = map { it.first }
+ *       val second = map { it.second }
+ *       return first to second
+ *   }
  * ```
  */
 @ExperimentalKairosApi
 fun <A, B> State<Pair<A, B>>.unzip(): Pair<State<A>, State<B>> {
-    val left = map { it.first }
-    val right = map { it.second }
-    return left to right
+    val first = map { it.first }
+    val second = map { it.second }
+    return first to second
 }
 
 /**
- * Returns a [State] by combining the values held inside the given [States][State] into a [List].
+ * Returns a [State] by applying [transform] to the value held by the original [State].
  *
- * @see State.combineWith
+ * @sample com.android.systemui.kairos.KairosSamples.flatMap
  */
 @ExperimentalKairosApi
-fun <A> Iterable<State<A>>.combine(): State<List<A>> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            val states = map { it.init }
-            zipStates(
-                name,
-                operatorName,
-                states.size,
-                states = init(null) { states.map { it.connect(this) } },
-            )
-        }
-    )
-}
-
-/**
- * Returns a [State] by combining the values held inside the given [States][State] into a [Map].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <K, A> Map<K, State<A>>.combine(): State<Map<K, A>> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            zipStateMap(
-                name,
-                operatorName,
-                size,
-                states = init(null) { mapValues { it.value.init.connect(evalScope = this) } },
-            )
-        }
-    )
-}
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B> Iterable<State<A>>.combine(transform: KairosScope.(List<A>) -> B): State<B> =
-    combine().map(transform)
-
-/**
- * Returns a [State] by combining the values held inside the given [State]s into a [List].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A> combine(vararg states: State<A>): State<List<A>> = states.asIterable().combine()
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B> combine(vararg states: State<A>, transform: KairosScope.(List<A>) -> B): State<B> =
-    states.asIterable().combine(transform)
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B, Z> combine(
-    stateA: State<A>,
-    stateB: State<B>,
-    transform: KairosScope.(A, B) -> Z,
-): State<Z> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            zipStates(name, operatorName, stateA.init, stateB.init) { a, b ->
-                NoScope.transform(a, b)
-            }
-        }
-    )
-}
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B, C, Z> combine(
-    stateA: State<A>,
-    stateB: State<B>,
-    stateC: State<C>,
-    transform: KairosScope.(A, B, C) -> Z,
-): State<Z> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            zipStates(name, operatorName, stateA.init, stateB.init, stateC.init) { a, b, c ->
-                NoScope.transform(a, b, c)
-            }
-        }
-    )
-}
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B, C, D, Z> combine(
-    stateA: State<A>,
-    stateB: State<B>,
-    stateC: State<C>,
-    stateD: State<D>,
-    transform: KairosScope.(A, B, C, D) -> Z,
-): State<Z> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            zipStates(name, operatorName, stateA.init, stateB.init, stateC.init, stateD.init) {
-                a,
-                b,
-                c,
-                d ->
-                NoScope.transform(a, b, c, d)
-            }
-        }
-    )
-}
-
-/**
- * Returns a [State] whose value is generated with [transform] by combining the current values of
- * each given [State].
- *
- * @see State.combineWith
- */
-@ExperimentalKairosApi
-fun <A, B, C, D, E, Z> combine(
-    stateA: State<A>,
-    stateB: State<B>,
-    stateC: State<C>,
-    stateD: State<D>,
-    stateE: State<E>,
-    transform: KairosScope.(A, B, C, D, E) -> Z,
-): State<Z> {
-    val operatorName = "combine"
-    val name = operatorName
-    return StateInit(
-        init(name) {
-            zipStates(
-                name,
-                operatorName,
-                stateA.init,
-                stateB.init,
-                stateC.init,
-                stateD.init,
-                stateE.init,
-            ) { a, b, c, d, e ->
-                NoScope.transform(a, b, c, d, e)
-            }
-        }
-    )
-}
-
-/** Returns a [State] by applying [transform] to the value held by the original [State]. */
-@ExperimentalKairosApi
 fun <A, B> State<A>.flatMap(transform: KairosScope.(A) -> State<B>): State<B> {
     val operatorName = "flatMap"
     val name = operatorName
@@ -345,77 +183,18 @@
     )
 }
 
-/** Shorthand for `flatMap { it }` */
+/**
+ * Returns a [State] that behaves like the current value of the original [State].
+ *
+ * ``` kotlin
+ *   fun <A> State<State<A>>.flatten() = flatMap { it }
+ * ```
+ *
+ * @see flatMap
+ */
 @ExperimentalKairosApi fun <A> State<State<A>>.flatten() = flatMap { it }
 
 /**
- * Returns a [StateSelector] that can be used to efficiently check if the input [State] is currently
- * holding a specific value.
- *
- * An example:
- * ```
- *   val intState: State<Int> = ...
- *   val intSelector: StateSelector<Int> = intState.selector()
- *   // Tracks if lInt is holding 1
- *   val isOne: State<Boolean> = intSelector.whenSelected(1)
- * ```
- *
- * This is semantically equivalent to `val isOne = intState.map { i -> i == 1 }`, but is
- * significantly more efficient; specifically, using [State.map] in this way incurs a `O(n)`
- * performance hit, where `n` is the number of different [State.map] operations used to track a
- * specific value. [selector] internally uses a [HashMap] to lookup the appropriate downstream
- * [State] to update, and so operates in `O(1)`.
- *
- * Note that the returned [StateSelector] should be cached and re-used to gain the performance
- * benefit.
- *
- * @see groupByKey
- */
-@ExperimentalKairosApi
-fun <A> State<A>.selector(numDistinctValues: Int? = null): StateSelector<A> =
-    StateSelector(
-        this,
-        changes
-            .map { new -> mapOf(new to true, sampleDeferred().get() to false) }
-            .groupByKey(numDistinctValues),
-    )
-
-/**
- * Tracks the currently selected value of type [A] from an upstream [State].
- *
- * @see selector
- */
-@ExperimentalKairosApi
-class StateSelector<in A>
-internal constructor(
-    private val upstream: State<A>,
-    private val groupedChanges: GroupedEvents<A, Boolean>,
-) {
-    /**
-     * Returns a [State] that tracks whether the upstream [State] is currently holding the given
-     * [value].
-     *
-     * @see selector
-     */
-    fun whenSelected(value: A): State<Boolean> {
-        val operatorName = "StateSelector#whenSelected"
-        val name = "$operatorName[$value]"
-        return StateInit(
-            init(name) {
-                StateImpl(
-                    name,
-                    operatorName,
-                    groupedChanges.impl.eventsForKey(value),
-                    DerivedMapCheap(upstream.init) { it == value },
-                )
-            }
-        )
-    }
-
-    operator fun get(value: A): State<Boolean> = whenSelected(value)
-}
-
-/**
  * A mutable [State] that provides the ability to manually [set its value][setValue].
  *
  * Multiple invocations of [setValue] that occur before a transaction are conflated; only the most
@@ -441,6 +220,9 @@
     override val init: Init<StateImpl<T>>
         get() = state.init
 
+    // TODO: not convinced this is totally safe
+    //  - at least for the BuildScope smart-constructor, we can avoid the network.transaction { }
+    //    call since we're already in a transaction
     internal val state = run {
         val changes = input.impl
         val name = null
@@ -491,7 +273,17 @@
     fun setValueDeferred(value: DeferredValue<T>) = input.emit(value.unwrapped)
 }
 
-/** A forward-reference to a [State], allowing for recursive definitions. */
+/**
+ * A forward-reference to a [State]. Useful for recursive definitions.
+ *
+ * This reference can be used like a standard [State], but will throw an error if its [loopback] is
+ * unset before it is [observed][BuildScope.observe] or [sampled][TransactionScope.sample].
+ *
+ * Note that it is safe to invoke [TransactionScope.sampleDeferred] before [loopback] is set,
+ * provided the returned [DeferredValue] is not [queried][KairosScope.get].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.stateLoop
+ */
 @ExperimentalKairosApi
 class StateLoop<A> : State<A>() {
 
@@ -502,7 +294,10 @@
     override val init: Init<StateImpl<A>> =
         init(name) { deferred.value.init.connect(evalScope = this) }
 
-    /** The [State] this [StateLoop] will forward to. */
+    /**
+     * The [State] this reference is referring to. Must be set before this [StateLoop] is
+     * [observed][BuildScope.observe] or [sampled][TransactionScope.sample].
+     */
     var loopback: State<A>? = null
         set(value) {
             value?.let {
@@ -528,3 +323,24 @@
 
 private inline fun <A> deferInline(crossinline block: InitScope.() -> State<A>): State<A> =
     StateInit(init(name = null) { block().init.connect(evalScope = this) })
+
+/**
+ * Like [changes] but also includes the old value of this [State].
+ *
+ * Shorthand for:
+ * ``` kotlin
+ *     stateChanges.map { WithPrev(previousValue = sample(), newValue = it) }
+ * ```
+ */
+@ExperimentalKairosApi
+val <A> State<A>.transitions: Events<WithPrev<A, A>>
+    get() = changes.map { WithPrev(previousValue = sample(), newValue = it) }
+
+/**
+ * Returns an [Events] that emits the new value of this [State] when it changes.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.changes
+ */
+@ExperimentalKairosApi
+val <A> State<A>.changes: Events<A>
+    get() = EventsInit(init(name = null) { init.connect(evalScope = this).changes })
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/StateScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/StateScope.kt
index 933ff1a..faeffe8 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/StateScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/StateScope.kt
@@ -16,13 +16,11 @@
 
 package com.android.systemui.kairos
 
+import com.android.systemui.kairos.util.MapPatch
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
 import com.android.systemui.kairos.util.WithPrev
-import com.android.systemui.kairos.util.just
 import com.android.systemui.kairos.util.map
 import com.android.systemui.kairos.util.mapMaybeValues
-import com.android.systemui.kairos.util.none
 import com.android.systemui.kairos.util.zipWith
 
 // TODO: caching story? should each Scope have a cache of applied Stateful instances?
@@ -64,6 +62,8 @@
      * Note that the value contained within the [State] is not updated until *after* all [Events]
      * have been processed; this keeps the value of the [State] consistent during the entire Kairos
      * transaction.
+     *
+     * @see holdState
      */
     fun <A> Events<A>.holdStateDeferred(initialValue: DeferredValue<A>): State<A>
 
@@ -71,113 +71,128 @@
      * Returns a [State] holding a [Map] that is updated incrementally whenever this emits a value.
      *
      * The value emitted is used as a "patch" for the tracked [Map]; for each key [K] in the emitted
-     * map, an associated value of [Just] will insert or replace the value in the tracked [Map], and
-     * an associated value of [none] will remove the key from the tracked [Map].
+     * map, an associated value of [present][Maybe.present] will insert or replace the value in the
+     * tracked [Map], and an associated value of [absent][Maybe.absent] will remove the key from the
+     * tracked [Map].
+     *
+     * @sample com.android.systemui.kairos.KairosSamples.incrementals
+     * @see MapPatch
      */
-    fun <K, V> Events<Map<K, Maybe<V>>>.foldStateMapIncrementally(
+    fun <K, V> Events<MapPatch<K, V>>.foldStateMapIncrementally(
         initialValues: DeferredValue<Map<K, V>>
     ): Incremental<K, V>
 
+    /**
+     * Returns an [Events] the emits the result of applying [Statefuls][Stateful] emitted from the
+     * original [Events].
+     *
+     * Unlike [applyLatestStateful], state accumulation is not stopped with each subsequent emission
+     * of the original [Events].
+     */
+    fun <A> Events<Stateful<A>>.applyStatefuls(): Events<A>
+
+    /**
+     * Returns an [Events] containing the results of applying each [Stateful] emitted from the
+     * original [Events], and a [DeferredValue] containing the result of applying [init]
+     * immediately.
+     *
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
+     * with the same key is stopped.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
+     */
+    fun <K, A, B> Events<MapPatch<K, Stateful<A>>>.applyLatestStatefulForKey(
+        init: DeferredValue<Map<K, Stateful<B>>>,
+        numKeys: Int? = null,
+    ): Pair<Events<MapPatch<K, A>>, DeferredValue<Map<K, B>>>
+
     // TODO: everything below this comment can be made into extensions once we have context params
 
     /**
      * Returns an [Events] that emits from a merged, incrementally-accumulated collection of
-     * [Events] emitted from this, following the same "patch" rules as outlined in
-     * [foldStateMapIncrementally].
+     * [Events] emitted from this, following the patch rules outlined in
+     * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
      *
-     * Conceptually this is equivalent to:
-     * ```kotlin
-     *   fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementally(
-     *     initialEvents: Map<K, Events<V>>,
+     * ``` kotlin
+     *   fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementally(
+     *     initialEvents: DeferredValue<Map<K, Events<V>>>,
      *   ): Events<Map<K, V>> =
-     *     foldMapIncrementally(initialEvents).map { it.merge() }.switchEvents()
+     *     foldMapIncrementally(initialEvents).mergeEventsIncrementally(initialEvents)
      * ```
      *
-     * While the behavior is equivalent to the conceptual definition above, the implementation is
-     * significantly more efficient.
-     *
+     * @see Incremental.mergeEventsIncrementally
      * @see merge
      */
-    fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementally(
-        name: String? = null,
-        initialEvents: DeferredValue<Map<K, Events<V>>>,
+    fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementally(
+        initialEvents: DeferredValue<Map<K, Events<V>>>
     ): Events<Map<K, V>> = foldStateMapIncrementally(initialEvents).mergeEventsIncrementally()
 
     /**
      * Returns an [Events] that emits from a merged, incrementally-accumulated collection of
-     * [Events] emitted from this, following the same "patch" rules as outlined in
-     * [foldStateMapIncrementally].
+     * [Events] emitted from this, following the patch rules outlined in
+     * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
      *
-     * Conceptually this is equivalent to:
-     * ```kotlin
-     *   fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementallyPromptly(
-     *     initialEvents: Map<K, Events<V>>,
+     * ``` kotlin
+     *   fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementallyPromptly(
+     *     initialEvents: DeferredValue<Map<K, Events<V>>>,
      *   ): Events<Map<K, V>> =
-     *     foldMapIncrementally(initialEvents).map { it.merge() }.switchEventsPromptly()
+     *     foldMapIncrementally(initialEvents).mergeEventsIncrementallyPromptly(initialEvents)
      * ```
      *
-     * While the behavior is equivalent to the conceptual definition above, the implementation is
-     * significantly more efficient.
-     *
+     * @see Incremental.mergeEventsIncrementallyPromptly
      * @see merge
      */
-    fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementallyPromptly(
-        initialEvents: DeferredValue<Map<K, Events<V>>>,
-        name: String? = null,
+    fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementallyPromptly(
+        initialEvents: DeferredValue<Map<K, Events<V>>>
     ): Events<Map<K, V>> =
         foldStateMapIncrementally(initialEvents).mergeEventsIncrementallyPromptly()
 
     /**
      * Returns an [Events] that emits from a merged, incrementally-accumulated collection of
-     * [Events] emitted from this, following the same "patch" rules as outlined in
-     * [foldStateMapIncrementally].
+     * [Events] emitted from this, following the patch rules outlined in
+     * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
      *
-     * Conceptually this is equivalent to:
-     * ```kotlin
-     *   fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementally(
+     * ``` kotlin
+     *   fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementally(
      *     initialEvents: Map<K, Events<V>>,
      *   ): Events<Map<K, V>> =
-     *     foldMapIncrementally(initialEvents).map { it.merge() }.switchEvents()
+     *     foldMapIncrementally(initialEvents).mergeEventsIncrementally(initialEvents)
      * ```
      *
-     * While the behavior is equivalent to the conceptual definition above, the implementation is
-     * significantly more efficient.
-     *
+     * @see Incremental.mergeEventsIncrementally
      * @see merge
      */
-    fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementally(
-        name: String? = null,
-        initialEvents: Map<K, Events<V>> = emptyMap(),
-    ): Events<Map<K, V>> = mergeIncrementally(name, deferredOf(initialEvents))
+    fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementally(
+        initialEvents: Map<K, Events<V>> = emptyMap()
+    ): Events<Map<K, V>> = mergeEventsIncrementally(deferredOf(initialEvents))
 
     /**
      * Returns an [Events] that emits from a merged, incrementally-accumulated collection of
-     * [Events] emitted from this, following the same "patch" rules as outlined in
-     * [foldStateMapIncrementally].
+     * [Events] emitted from this, following the patch rules outlined in
+     * [Map.applyPatch][com.android.systemui.kairos.util.applyPatch].
      *
-     * Conceptually this is equivalent to:
-     * ```kotlin
-     *   fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementallyPromptly(
+     * ``` kotlin
+     *   fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementallyPromptly(
      *     initialEvents: Map<K, Events<V>>,
      *   ): Events<Map<K, V>> =
-     *     foldMapIncrementally(initialEvents).map { it.merge() }.switchEventsPromptly()
+     *     foldMapIncrementally(initialEvents).mergeEventsIncrementallyPromptly(initialEvents)
      * ```
      *
-     * While the behavior is equivalent to the conceptual definition above, the implementation is
-     * significantly more efficient.
-     *
+     * @see Incremental.mergeEventsIncrementallyPromptly
      * @see merge
      */
-    fun <K, V> Events<Map<K, Maybe<Events<V>>>>.mergeIncrementallyPromptly(
-        initialEvents: Map<K, Events<V>> = emptyMap(),
-        name: String? = null,
-    ): Events<Map<K, V>> = mergeIncrementallyPromptly(deferredOf(initialEvents), name)
+    fun <K, V> Events<MapPatch<K, Events<V>>>.mergeEventsIncrementallyPromptly(
+        initialEvents: Map<K, Events<V>> = emptyMap()
+    ): Events<Map<K, V>> = mergeEventsIncrementallyPromptly(deferredOf(initialEvents))
 
     /** Applies the [Stateful] within this [StateScope]. */
     fun <A> Stateful<A>.applyStateful(): A = this()
 
     /**
-     * Applies the [Stateful] within this [StateScope], returning the result as an [DeferredValue].
+     * Applies the [Stateful] within this [StateScope], returning the result as a [DeferredValue].
      */
     fun <A> Stateful<A>.applyStatefulDeferred(): DeferredValue<A> = deferredStateScope {
         applyStateful()
@@ -190,42 +205,59 @@
      * Note that the value contained within the [State] is not updated until *after* all [Events]
      * have been processed; this keeps the value of the [State] consistent during the entire Kairos
      * transaction.
+     *
+     * @sample com.android.systemui.kairos.KairosSamples.holdState
+     * @see holdStateDeferred
      */
     fun <A> Events<A>.holdState(initialValue: A): State<A> =
         holdStateDeferred(deferredOf(initialValue))
 
     /**
-     * Returns an [Events] the emits the result of applying [Statefuls][Stateful] emitted from the
-     * original [Events].
-     *
-     * Unlike [applyLatestStateful], state accumulation is not stopped with each subsequent emission
-     * of the original [Events].
-     */
-    fun <A> Events<Stateful<A>>.applyStatefuls(): Events<A>
-
-    /**
      * Returns an [Events] containing the results of applying [transform] to each value of the
      * original [Events].
      *
      * [transform] can perform state accumulation via its [StateScope] receiver. Unlike
      * [mapLatestStateful], accumulation is not stopped with each subsequent emission of the
      * original [Events].
+     *
+     * ``` kotlin
+     *   fun <A, B> Events<A>.mapStateful(transform: StateScope.(A) -> B): Events<B> =
+     *       map { statefully { transform(it) } }.applyStatefuls()
+     * ```
      */
     fun <A, B> Events<A>.mapStateful(transform: StateScope.(A) -> B): Events<B> =
-        map { statefully { transform(it) } }.applyStatefuls()
+        mapCheap { statefully { transform(it) } }.applyStatefuls()
 
     /**
      * Returns a [State] the holds the result of applying the [Stateful] held by the original
      * [State].
      *
      * Unlike [applyLatestStateful], state accumulation is not stopped with each state change.
+     *
+     * ``` kotlin
+     *   fun <A> State<Stateful<A>>.applyStatefuls(): State<A> =
+     *       changes
+     *           .applyStatefuls()
+     *           .holdState(initialValue = sample().applyStateful())
+     * ```
      */
     fun <A> State<Stateful<A>>.applyStatefuls(): State<A> =
         changes
             .applyStatefuls()
-            .holdStateDeferred(initialValue = deferredStateScope { sampleDeferred().get()() })
+            .holdStateDeferred(
+                initialValue = deferredStateScope { sampleDeferred().value.applyStateful() }
+            )
 
-    /** Returns an [Events] that switches to the [Events] emitted by the original [Events]. */
+    /**
+     * Returns an [Events] that acts like the most recent [Events] to be emitted from the original
+     * [Events].
+     *
+     * ``` kotlin
+     *   fun <A> Events<Events<A>>.flatten() = holdState(emptyEvents).switchEvents()
+     * ```
+     *
+     * @see switchEvents
+     */
     fun <A> Events<Events<A>>.flatten() = holdState(emptyEvents).switchEvents()
 
     /**
@@ -234,9 +266,14 @@
      *
      * [transform] can perform state accumulation via its [StateScope] receiver. With each
      * invocation of [transform], state accumulation from previous invocation is stopped.
+     *
+     * ``` kotlin
+     *   fun <A, B> Events<A>.mapLatestStateful(transform: StateScope.(A) -> B): Events<B> =
+     *       map { statefully { transform(it) } }.applyLatestStateful()
+     * ```
      */
     fun <A, B> Events<A>.mapLatestStateful(transform: StateScope.(A) -> B): Events<B> =
-        map { statefully { transform(it) } }.applyLatestStateful()
+        mapCheap { statefully { transform(it) } }.applyLatestStateful()
 
     /**
      * Returns an [Events] that switches to a new [Events] produced by [transform] every time the
@@ -244,6 +281,13 @@
      *
      * [transform] can perform state accumulation via its [StateScope] receiver. With each
      * invocation of [transform], state accumulation from previous invocation is stopped.
+     *
+     * ``` kotlin
+     *   fun <A, B> Events<A>.flatMapLatestStateful(
+     *       transform: StateScope.(A) -> Events<B>
+     *   ): Events<B> =
+     *       mapLatestStateful(transform).flatten()
+     * ```
      */
     fun <A, B> Events<A>.flatMapLatestStateful(transform: StateScope.(A) -> Events<B>): Events<B> =
         mapLatestStateful(transform).flatten()
@@ -254,6 +298,8 @@
      *
      * When each [Stateful] is applied, state accumulation from the previously-active [Stateful] is
      * stopped.
+     *
+     * @sample com.android.systemui.kairos.KairosSamples.applyLatestStateful
      */
     fun <A> Events<Stateful<A>>.applyLatestStateful(): Events<A> = applyLatestStateful {}.first
 
@@ -281,19 +327,18 @@
         init: Stateful<A>
     ): Pair<Events<B>, DeferredValue<A>> {
         val (events, result) =
-            mapCheap { spec -> mapOf(Unit to just(spec)) }
+            mapCheap { spec -> mapOf(Unit to Maybe.present(spec)) }
                 .applyLatestStatefulForKey(init = mapOf(Unit to init), numKeys = 1)
         val outEvents: Events<B> =
             events.mapMaybe {
                 checkNotNull(it[Unit]) { "applyLatest: expected result, but none present in: $it" }
             }
         val outInit: DeferredValue<A> = deferredTransactionScope {
-            val initResult: Map<Unit, A> = result.get()
+            val initResult: Map<Unit, A> = result.value
             check(Unit in initResult) {
                 "applyLatest: expected initial result, but none present in: $initResult"
             }
-            @Suppress("UNCHECKED_CAST")
-            initResult.getOrDefault(Unit) { null } as A
+            initResult.getValue(Unit)
         }
         return Pair(outEvents, outInit)
     }
@@ -303,34 +348,32 @@
      * original [Events], and a [DeferredValue] containing the result of applying [init]
      * immediately.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [Stateful] will be stopped with no replacement.
-     *
-     * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
-     * with the same key is stopped.
-     */
-    fun <K, A, B> Events<Map<K, Maybe<Stateful<A>>>>.applyLatestStatefulForKey(
-        init: DeferredValue<Map<K, Stateful<B>>>,
-        numKeys: Int? = null,
-    ): Pair<Events<Map<K, Maybe<A>>>, DeferredValue<Map<K, B>>>
-
-    /**
-     * Returns an [Events] containing the results of applying each [Stateful] emitted from the
-     * original [Events], and a [DeferredValue] containing the result of applying [init]
-     * immediately.
-     *
      * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
      * with the same key is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [Stateful] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
      */
-    fun <K, A, B> Events<Map<K, Maybe<Stateful<A>>>>.applyLatestStatefulForKey(
+    fun <K, A, B> Events<MapPatch<K, Stateful<A>>>.applyLatestStatefulForKey(
         init: Map<K, Stateful<B>>,
         numKeys: Int? = null,
-    ): Pair<Events<Map<K, Maybe<A>>>, DeferredValue<Map<K, B>>> =
+    ): Pair<Events<MapPatch<K, A>>, DeferredValue<Map<K, B>>> =
         applyLatestStatefulForKey(deferredOf(init), numKeys)
 
+    /**
+     * Returns an [Incremental] containing the latest results of applying each [Stateful] emitted
+     * from the original [Incremental]'s [updates].
+     *
+     * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
+     * with the same key is stopped.
+     *
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
+     */
     fun <K, V> Incremental<K, Stateful<V>>.applyLatestStatefulForKey(
         numKeys: Int? = null
     ): Incremental<K, V> {
@@ -345,10 +388,12 @@
      * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
      * with the same key is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [Stateful] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
      */
-    fun <K, A> Events<Map<K, Maybe<Stateful<A>>>>.holdLatestStatefulForKey(
+    fun <K, A> Events<MapPatch<K, Stateful<A>>>.holdLatestStatefulForKey(
         init: DeferredValue<Map<K, Stateful<A>>>,
         numKeys: Int? = null,
     ): Incremental<K, A> {
@@ -363,28 +408,33 @@
      * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
      * with the same key is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [Stateful] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
      */
-    fun <K, A> Events<Map<K, Maybe<Stateful<A>>>>.holdLatestStatefulForKey(
+    fun <K, A> Events<MapPatch<K, Stateful<A>>>.holdLatestStatefulForKey(
         init: Map<K, Stateful<A>> = emptyMap(),
         numKeys: Int? = null,
     ): Incremental<K, A> = holdLatestStatefulForKey(deferredOf(init), numKeys)
 
     /**
      * Returns an [Events] containing the results of applying each [Stateful] emitted from the
-     * original [Events], and a [DeferredValue] containing the result of applying [stateInit]
-     * immediately.
+     * original [Events].
      *
      * When each [Stateful] is applied, state accumulation from the previously-active [Stateful]
      * with the same key is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [Stateful] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [Stateful] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
+     *
+     * @sample com.android.systemui.kairos.KairosSamples.applyLatestStatefulForKey
      */
-    fun <K, A> Events<Map<K, Maybe<Stateful<A>>>>.applyLatestStatefulForKey(
+    fun <K, A> Events<MapPatch<K, Stateful<A>>>.applyLatestStatefulForKey(
         numKeys: Int? = null
-    ): Events<Map<K, Maybe<A>>> =
+    ): Events<MapPatch<K, A>> =
         applyLatestStatefulForKey(init = emptyMap<K, Stateful<*>>(), numKeys = numKeys).first
 
     /**
@@ -395,18 +445,20 @@
      * [transform] can perform state accumulation via its [StateScope] receiver. With each
      * invocation of [transform], state accumulation from previous invocation is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [StateScope] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [StateScope] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
      */
-    fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+    fun <K, A, B> Events<MapPatch<K, A>>.mapLatestStatefulForKey(
         initialValues: DeferredValue<Map<K, A>>,
         numKeys: Int? = null,
         transform: StateScope.(A) -> B,
-    ): Pair<Events<Map<K, Maybe<B>>>, DeferredValue<Map<K, B>>> =
+    ): Pair<Events<MapPatch<K, B>>, DeferredValue<Map<K, B>>> =
         map { patch -> patch.mapValues { (_, v) -> v.map { statefully { transform(it) } } } }
             .applyLatestStatefulForKey(
                 deferredStateScope {
-                    initialValues.get().mapValues { (_, v) -> statefully { transform(v) } }
+                    initialValues.value.mapValues { (_, v) -> statefully { transform(v) } }
                 },
                 numKeys = numKeys,
             )
@@ -419,14 +471,16 @@
      * [transform] can perform state accumulation via its [StateScope] receiver. With each
      * invocation of [transform], state accumulation from previous invocation is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [StateScope] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [StateScope] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
      */
-    fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+    fun <K, A, B> Events<MapPatch<K, A>>.mapLatestStatefulForKey(
         initialValues: Map<K, A>,
         numKeys: Int? = null,
         transform: StateScope.(A) -> B,
-    ): Pair<Events<Map<K, Maybe<B>>>, DeferredValue<Map<K, B>>> =
+    ): Pair<Events<MapPatch<K, B>>, DeferredValue<Map<K, B>>> =
         mapLatestStatefulForKey(deferredOf(initialValues), numKeys, transform)
 
     /**
@@ -436,13 +490,24 @@
      * [transform] can perform state accumulation via its [StateScope] receiver. With each
      * invocation of [transform], state accumulation from previous invocation is stopped.
      *
-     * If the [Maybe] contained within the value for an associated key is [none], then the
-     * previously-active [StateScope] will be stopped with no replacement.
+     * If the [Maybe] contained within the value for an associated key is [absent][Maybe.absent],
+     * then the previously-active [StateScope] will be stopped with no replacement.
+     *
+     * The optional [numKeys] argument is an optimization used to initialize the internal storage.
+     *
+     * ``` kotlin
+     *   fun <K, A, B> Events<MapPatch<K, A>>.mapLatestStatefulForKey(
+     *       numKeys: Int? = null,
+     *       transform: StateScope.(A) -> B,
+     *   ): Pair<Events<MapPatch<K, B>>, DeferredValue<Map<K, B>>> =
+     *       map { patch -> patch.mapValues { (_, mv) -> mv.map { statefully { transform(it) } } } }
+     *           .applyLatestStatefulForKey(numKeys)
+     * ```
      */
-    fun <K, A, B> Events<Map<K, Maybe<A>>>.mapLatestStatefulForKey(
+    fun <K, A, B> Events<MapPatch<K, A>>.mapLatestStatefulForKey(
         numKeys: Int? = null,
         transform: StateScope.(A) -> B,
-    ): Events<Map<K, Maybe<B>>> = mapLatestStatefulForKey(emptyMap(), numKeys, transform).first
+    ): Events<MapPatch<K, B>> = mapLatestStatefulForKey(emptyMap(), numKeys, transform).first
 
     /**
      * Returns an [Events] that will only emit the next event of the original [Events], and then
@@ -450,18 +515,31 @@
      *
      * If the original [Events] is emitting an event at this exact time, then it will be the only
      * even emitted from the result [Events].
+     *
+     * ``` kotlin
+     *   fun <A> Events<A>.nextOnly(): Events<A> =
+     *       EventsLoop<A>().apply {
+     *           loopback = map { emptyEvents }.holdState(this@nextOnly).switchEvents()
+     *       }
+     * ```
      */
-    fun <A> Events<A>.nextOnly(name: String? = null): Events<A> =
+    fun <A> Events<A>.nextOnly(): Events<A> =
         if (this === emptyEvents) {
             this
         } else {
-            EventsLoop<A>().also {
-                it.loopback =
-                    it.mapCheap { emptyEvents }.holdState(this@nextOnly).switchEvents(name)
+            EventsLoop<A>().apply {
+                loopback = mapCheap { emptyEvents }.holdState(this@nextOnly).switchEvents()
             }
         }
 
-    /** Returns an [Events] that skips the next emission of the original [Events]. */
+    /**
+     * Returns an [Events] that skips the next emission of the original [Events].
+     *
+     * ``` kotlin
+     *   fun <A> Events<A>.skipNext(): Events<A> =
+     *       nextOnly().map { this@skipNext }.holdState(emptyEvents).switchEvents()
+     * ```
+     */
     fun <A> Events<A>.skipNext(): Events<A> =
         if (this === emptyEvents) {
             this
@@ -475,6 +553,11 @@
      *
      * If the original [Events] emits at the same time as [stop], then the returned [Events] will
      * emit that value.
+     *
+     * ``` kotlin
+     *   fun <A> Events<A>.takeUntil(stop: Events<*>): Events<A> =
+     *       stop.map { emptyEvents }.nextOnly().holdState(this).switchEvents()
+     * ```
      */
     fun <A> Events<A>.takeUntil(stop: Events<*>): Events<A> =
         if (stop === emptyEvents) {
@@ -494,14 +577,19 @@
         val (_, init: DeferredValue<Map<Unit, A>>) =
             stop
                 .nextOnly()
-                .map { mapOf(Unit to none<Stateful<A>>()) }
+                .map { mapOf(Unit to Maybe.absent<Stateful<A>>()) }
                 .applyLatestStatefulForKey(init = mapOf(Unit to stateful), numKeys = 1)
-        return deferredStateScope { init.get().getValue(Unit) }
+        return deferredStateScope { init.value.getValue(Unit) }
     }
 
     /**
      * Returns an [Events] that emits values from the original [Events] up to and including a value
      * is emitted that satisfies [predicate].
+     *
+     * ``` kotlin
+     *   fun <A> Events<A>.takeUntil(predicate: TransactionScope.(A) -> Boolean): Events<A> =
+     *       takeUntil(filter(predicate))
+     * ```
      */
     fun <A> Events<A>.takeUntil(predicate: TransactionScope.(A) -> Boolean): Events<A> =
         takeUntil(filter(predicate))
@@ -513,6 +601,18 @@
      * Note that the value contained within the [State] is not updated until *after* all [Events]
      * have been processed; this keeps the value of the [State] consistent during the entire Kairos
      * transaction.
+     *
+     * ``` kotlin
+     *   fun <A, B> Events<A>.foldState(
+     *       initialValue: B,
+     *       transform: TransactionScope.(A, B) -> B,
+     *   ): State<B> {
+     *       lateinit var state: State<B>
+     *       return map { a -> transform(a, state.sample()) }
+     *           .holdState(initialValue)
+     *           .also { state = it }
+     *   }
+     * ```
      */
     fun <A, B> Events<A>.foldState(
         initialValue: B,
@@ -529,6 +629,18 @@
      * Note that the value contained within the [State] is not updated until *after* all [Events]
      * have been processed; this keeps the value of the [State] consistent during the entire Kairos
      * transaction.
+     *
+     * ``` kotlin
+     *   fun <A, B> Events<A>.foldStateDeferred(
+     *       initialValue: DeferredValue<B>,
+     *       transform: TransactionScope.(A, B) -> B,
+     *   ): State<B> {
+     *       lateinit var state: State<B>
+     *       return map { a -> transform(a, state.sample()) }
+     *           .holdStateDeferred(initialValue)
+     *           .also { state = it }
+     *   }
+     * ```
      */
     fun <A, B> Events<A>.foldStateDeferred(
         initialValue: DeferredValue<B>,
@@ -551,10 +663,11 @@
      * have been processed; this keeps the value of the [State] consistent during the entire Kairos
      * transaction.
      *
-     * Shorthand for:
-     * ```kotlin
-     * val (changes, initApplied) = applyLatestStateful(init)
-     * return changes.holdStateDeferred(initApplied)
+     * ``` kotlin
+     *   fun <A> Events<Stateful<A>>.holdLatestStateful(init: Stateful<A>): State<A> {
+     *       val (changes, initApplied) = applyLatestStateful(init)
+     *       return changes.holdStateDeferred(initApplied)
+     *   }
      * ```
      */
     fun <A> Events<Stateful<A>>.holdLatestStateful(init: Stateful<A>): State<A> {
@@ -578,8 +691,8 @@
      * that the returned [Events] will not emit until the original [Events] has emitted twice.
      */
     fun <A> Events<A>.pairwise(): Events<WithPrev<A, A>> =
-        mapCheap { just(it) }
-            .pairwise(none)
+        mapCheap { Maybe.present(it) }
+            .pairwise(Maybe.absent)
             .mapMaybe { (prev, next) -> prev.zipWith(next, ::WithPrev) }
 
     /**
@@ -599,10 +712,11 @@
      * Returns a [State] holding a [Map] that is updated incrementally whenever this emits a value.
      *
      * The value emitted is used as a "patch" for the tracked [Map]; for each key [K] in the emitted
-     * map, an associated value of [Just] will insert or replace the value in the tracked [Map], and
-     * an associated value of [none] will remove the key from the tracked [Map].
+     * map, an associated value of [Maybe.present] will insert or replace the value in the tracked
+     * [Map], and an associated value of [absent][Maybe.absent] will remove the key from the tracked
+     * [Map].
      */
-    fun <K, V> Events<Map<K, Maybe<V>>>.foldStateMapIncrementally(
+    fun <K, V> Events<MapPatch<K, V>>.foldStateMapIncrementally(
         initialValues: Map<K, V> = emptyMap()
     ): Incremental<K, V> = foldStateMapIncrementally(deferredOf(initialValues))
 
@@ -610,10 +724,11 @@
      * Returns an [Events] that wraps each emission of the original [Events] into an [IndexedValue],
      * containing the emitted value and its index (starting from zero).
      *
-     * Shorthand for:
-     * ```
-     *   val index = fold(0) { _, oldIdx -> oldIdx + 1 }
-     *   sample(index) { a, idx -> IndexedValue(idx, a) }
+     * ``` kotlin
+     *   fun <A> Events<A>.withIndex(): Events<IndexedValue<A>> {
+     *     val index = fold(0) { _, oldIdx -> oldIdx + 1 }
+     *     return sample(index) { a, idx -> IndexedValue(idx, a) }
+     *   }
      * ```
      */
     fun <A> Events<A>.withIndex(): Events<IndexedValue<A>> {
@@ -625,9 +740,11 @@
      * Returns an [Events] containing the results of applying [transform] to each value of the
      * original [Events] and its index (starting from zero).
      *
-     * Shorthand for:
-     * ```
-     *   withIndex().map { (idx, a) -> transform(idx, a) }
+     * ``` kotlin
+     *   fun <A> Events<A>.mapIndexed(transform: TransactionScope.(Int, A) -> B): Events<B> {
+     *       val index = foldState(0) { _, i -> i + 1 }
+     *       return sample(index) { a, idx -> transform(idx, a) }
+     *   }
      * ```
      */
     fun <A, B> Events<A>.mapIndexed(transform: TransactionScope.(Int, A) -> B): Events<B> {
@@ -635,7 +752,16 @@
         return sample(index) { a, idx -> transform(idx, a) }
     }
 
-    /** Returns an [Events] where all subsequent repetitions of the same value are filtered out. */
+    /**
+     * Returns an [Events] where all subsequent repetitions of the same value are filtered out.
+     *
+     * ``` kotlin
+     *   fun <A> Events<A>.distinctUntilChanged(): Events<A> {
+     *       val state: State<Any?> = holdState(Any())
+     *       return filter { it != state.sample() }
+     *   }
+     * ```
+     */
     fun <A> Events<A>.distinctUntilChanged(): Events<A> {
         val state: State<Any?> = holdState(Any())
         return filter { it != state.sample() }
@@ -647,18 +773,35 @@
      *
      * Note that the returned [Events] will not emit anything until [other] has emitted at least one
      * value.
+     *
+     * ``` kotlin
+     *   fun <A, B, C> Events<A>.sample(
+     *       other: Events<B>,
+     *       transform: TransactionScope.(A, B) -> C,
+     *   ): Events<C> {
+     *       val state = other.mapCheap { Maybe.present(it) }.holdState(Maybe.absent)
+     *       return sample(state) { a, b -> b.map { transform(a, it) } }.filterPresent()
+     *   }
+     * ```
      */
     fun <A, B, C> Events<A>.sample(
         other: Events<B>,
         transform: TransactionScope.(A, B) -> C,
     ): Events<C> {
-        val state = other.mapCheap { just(it) }.holdState(none)
-        return sample(state) { a, b -> b.map { transform(a, it) } }.filterJust()
+        val state = other.mapCheap { Maybe.present(it) }.holdState(Maybe.absent)
+        return sample(state) { a, b -> b.map { transform(a, it) } }.filterPresent()
     }
 
     /**
      * Returns a [State] that samples the [Transactional] held by the given [State] within the same
      * transaction that the state changes.
+     *
+     * ``` kotlin
+     *   fun <A> State<Transactional<A>>.sampleTransactionals(): State<A> =
+     *       changes
+     *           .sampleTransactionals()
+     *           .holdStateDeferred(deferredTransactionScope { sample().sample() })
+     * ```
      */
     fun <A> State<Transactional<A>>.sampleTransactionals(): State<A> =
         changes
@@ -668,6 +811,14 @@
     /**
      * Returns a [State] that transforms the value held inside this [State] by applying it to the
      * given function [transform].
+     *
+     * Note that this is less efficient than [State.map], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * ``` kotlin
+     *   fun <A, B> State<A>.mapTransactionally(transform: TransactionScope.(A) -> B): State<B> =
+     *       map { transactionally { transform(it) } }.sampleTransactionals()
+     * ```
      */
     fun <A, B> State<A>.mapTransactionally(transform: TransactionScope.(A) -> B): State<B> =
         map { transactionally { transform(it) } }.sampleTransactionals()
@@ -676,7 +827,20 @@
      * Returns a [State] whose value is generated with [transform] by combining the current values
      * of each given [State].
      *
-     * @see State.combineWithTransactionally
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * ``` kotlin
+     *   fun <A, B, Z> combineTransactionally(
+     *       stateA: State<A>,
+     *       stateB: State<B>,
+     *       transform: TransactionScope.(A, B) -> Z,
+     *   ): State<Z> =
+     *       combine(stateA, stateB) { a, b -> transactionally { transform(a, b) } }
+     *           .sampleTransactionals()
+     * ```
+     *
+     * @see State.combineTransactionally
      */
     fun <A, B, Z> combineTransactionally(
         stateA: State<A>,
@@ -690,7 +854,10 @@
      * Returns a [State] whose value is generated with [transform] by combining the current values
      * of each given [State].
      *
-     * @see State.combineWithTransactionally
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * @see State.combineTransactionally
      */
     fun <A, B, C, Z> combineTransactionally(
         stateA: State<A>,
@@ -705,7 +872,10 @@
      * Returns a [State] whose value is generated with [transform] by combining the current values
      * of each given [State].
      *
-     * @see State.combineWithTransactionally
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * @see State.combineTransactionally
      */
     fun <A, B, C, D, Z> combineTransactionally(
         stateA: State<A>,
@@ -719,7 +889,18 @@
             }
             .sampleTransactionals()
 
-    /** Returns a [State] by applying [transform] to the value held by the original [State]. */
+    /**
+     * Returns a [State] by applying [transform] to the value held by the original [State].
+     *
+     * Note that this is less efficient than [flatMap], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * ``` kotlin
+     *   fun <A, B> State<A>.flatMapTransactionally(
+     *       transform: TransactionScope.(A) -> State<B>
+     *   ): State<B> = map { transactionally { transform(it) } }.sampleTransactionals().flatten()
+     * ```
+     */
     fun <A, B> State<A>.flatMapTransactionally(
         transform: TransactionScope.(A) -> State<B>
     ): State<B> = map { transactionally { transform(it) } }.sampleTransactionals().flatten()
@@ -728,7 +909,10 @@
      * Returns a [State] whose value is generated with [transform] by combining the current values
      * of each given [State].
      *
-     * @see State.combineWithTransactionally
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * @see State.combineTransactionally
      */
     fun <A, Z> combineTransactionally(
         vararg states: State<A>,
@@ -739,7 +923,10 @@
      * Returns a [State] whose value is generated with [transform] by combining the current values
      * of each given [State].
      *
-     * @see State.combineWithTransactionally
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * @see State.combineTransactionally
      */
     fun <A, Z> Iterable<State<A>>.combineTransactionally(
         transform: TransactionScope.(List<A>) -> Z
@@ -748,8 +935,13 @@
     /**
      * Returns a [State] by combining the values held inside the given [State]s by applying them to
      * the given function [transform].
+     *
+     * Note that this is less efficient than [combine], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
      */
-    fun <A, B, C> State<A>.combineWithTransactionally(
+    @Suppress("INAPPLICABLE_JVM_NAME")
+    @JvmName(name = "combineStateTransactionally")
+    fun <A, B, C> State<A>.combineTransactionally(
         other: State<B>,
         transform: TransactionScope.(A, B) -> C,
     ): State<C> = combineTransactionally(this, other, transform)
@@ -757,6 +949,15 @@
     /**
      * Returns an [Incremental] that reflects the state of the original [Incremental], but also adds
      * / removes entries based on the state of the original's values.
+     *
+     * ``` kotlin
+     *   fun <K, V> Incremental<K, State<Maybe<V>>>.applyStateIncrementally(): Incremental<K, V> =
+     *       mapValues { (_, v) -> v.changes }
+     *           .mergeEventsIncrementallyPromptly()
+     *           .foldStateMapIncrementally(
+     *               deferredStateScope { sample().mapMaybeValues { (_, s) -> s.sample() } }
+     *           )
+     * ```
      */
     fun <K, V> Incremental<K, State<Maybe<V>>>.applyStateIncrementally(): Incremental<K, V> =
         mapValues { (_, v) -> v.changes }
@@ -769,6 +970,12 @@
      * Returns an [Incremental] that reflects the state of the original [Incremental], but also adds
      * / removes entries based on the [State] returned from applying [transform] to the original's
      * entries.
+     *
+     * ``` kotlin
+     *   fun <K, V, U> Incremental<K, V>.mapIncrementalState(
+     *       transform: KairosScope.(Map.Entry<K, V>) -> State<Maybe<U>>
+     *   ): Incremental<K, U> = mapValues { transform(it) }.applyStateIncrementally()
+     * ```
      */
     fun <K, V, U> Incremental<K, V>.mapIncrementalState(
         transform: KairosScope.(Map.Entry<K, V>) -> State<Maybe<U>>
@@ -778,16 +985,33 @@
      * Returns an [Incremental] that reflects the state of the original [Incremental], but also adds
      * / removes entries based on the [State] returned from applying [transform] to the original's
      * entries, such that entries are added when that state is `true`, and removed when `false`.
+     *
+     * ``` kotlin
+     *   fun <K, V> Incremental<K, V>.filterIncrementally(
+     *       transform: KairosScope.(Map.Entry<K, V>) -> State<Boolean>
+     *   ): Incremental<K, V> = mapIncrementalState { entry ->
+     *       transform(entry).map { if (it) Maybe.present(entry.value) else Maybe.absent }
+     *   }
+     * ```
      */
     fun <K, V> Incremental<K, V>.filterIncrementally(
         transform: KairosScope.(Map.Entry<K, V>) -> State<Boolean>
     ): Incremental<K, V> = mapIncrementalState { entry ->
-        transform(entry).map { if (it) just(entry.value) else none }
+        transform(entry).map { if (it) Maybe.present(entry.value) else Maybe.absent }
     }
 
     /**
      * Returns an [Incremental] that samples the [Transactionals][Transactional] held by the
      * original within the same transaction that the incremental [updates].
+     *
+     * ``` kotlin
+     *   fun <K, V> Incremental<K, Transactional<V>>.sampleTransactionals(): Incremental<K, V> =
+     *       updates
+     *           .map { patch -> patch.mapValues { (k, mv) -> mv.map { it.sample() } } }
+     *           .foldStateMapIncrementally(
+     *               deferredStateScope { sample().mapValues { (k, v) -> v.sample() } }
+     *           )
+     * ```
      */
     fun <K, V> Incremental<K, Transactional<V>>.sampleTransactionals(): Incremental<K, V> =
         updates
@@ -799,6 +1023,16 @@
     /**
      * Returns an [Incremental] that tracks the entries of the original incremental, but values
      * replaced with those obtained by applying [transform] to each original entry.
+     *
+     * Note that this is less efficient than [mapValues], which should be preferred if [transform]
+     * does not need access to [TransactionScope].
+     *
+     * ``` kotlin
+     *   fun <K, V, U> Incremental<K, V>.mapValuesTransactionally(
+     *       transform: TransactionScope.(Map.Entry<K, V>) -> U
+     *   ): Incremental<K, U> =
+     *       mapValues { transactionally { transform(it) } }.sampleTransactionals()
+     * ```
      */
     fun <K, V, U> Incremental<K, V>.mapValuesTransactionally(
         transform: TransactionScope.(Map.Entry<K, V>) -> U
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Switch.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Switch.kt
new file mode 100644
index 0000000..63e27d0
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Switch.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.internal.IncrementalImpl
+import com.android.systemui.kairos.internal.constInit
+import com.android.systemui.kairos.internal.init
+import com.android.systemui.kairos.internal.mapImpl
+import com.android.systemui.kairos.internal.switchDeferredImplSingle
+import com.android.systemui.kairos.internal.switchPromptImplSingle
+import com.android.systemui.kairos.util.mapPatchFromFullDiff
+
+/**
+ * Returns an [Events] that switches to the [Events] contained within this [State] whenever it
+ * changes.
+ *
+ * This switch does take effect until the *next* transaction after [State] changes. For a switch
+ * that takes effect immediately, see [switchEventsPromptly].
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.switchEvents
+ */
+@ExperimentalKairosApi
+fun <A> State<Events<A>>.switchEvents(): Events<A> {
+    val patches =
+        mapImpl({ init.connect(this).changes }) { newEvents, _ -> newEvents.init.connect(this) }
+    return EventsInit(
+        constInit(
+            name = null,
+            switchDeferredImplSingle(
+                getStorage = {
+                    init.connect(this).getCurrentWithEpoch(this).first.init.connect(this)
+                },
+                getPatches = { patches },
+            ),
+        )
+    )
+}
+
+/**
+ * Returns an [Events] that switches to the [Events] contained within this [State] whenever it
+ * changes.
+ *
+ * This switch takes effect immediately within the same transaction that [State] changes. If the
+ * newly-switched-in [Events] is emitting a value within this transaction, then that value will be
+ * emitted from this switch. If not, but the previously-switched-in [Events] *is* emitting, then
+ * that value will be emitted from this switch instead. Otherwise, there will be no emission.
+ *
+ * In general, you should prefer [switchEvents] over this method. It is both safer and more
+ * performant.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.switchEventsPromptly
+ */
+// TODO: parameter to handle coincidental emission from both old and new
+@ExperimentalKairosApi
+fun <A> State<Events<A>>.switchEventsPromptly(): Events<A> {
+    val patches =
+        mapImpl({ init.connect(this).changes }) { newEvents, _ -> newEvents.init.connect(this) }
+    return EventsInit(
+        constInit(
+            name = null,
+            switchPromptImplSingle(
+                getStorage = {
+                    init.connect(this).getCurrentWithEpoch(this).first.init.connect(this)
+                },
+                getPatches = { patches },
+            ),
+        )
+    )
+}
+
+/** Returns an [Incremental] that behaves like current value of this [State]. */
+fun <K, V> State<Incremental<K, V>>.switchIncremental(): Incremental<K, V> {
+    val stateChangePatches =
+        transitions.mapNotNull { (old, new) ->
+            mapPatchFromFullDiff(old.sample(), new.sample()).takeIf { it.isNotEmpty() }
+        }
+    val innerChanges =
+        map { inner ->
+                merge(stateChangePatches, inner.updates) { switchPatch, upcomingPatch ->
+                    switchPatch + upcomingPatch
+                }
+            }
+            .switchEventsPromptly()
+    val flattened = flatten()
+    return IncrementalInit(
+        init("switchIncremental") {
+            val upstream = flattened.init.connect(this)
+            IncrementalImpl(
+                "switchIncremental",
+                "switchIncremental",
+                upstream.changes,
+                innerChanges.init.connect(this),
+                upstream.store,
+            )
+        }
+    )
+}
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/ToColdFlow.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/ToColdFlow.kt
new file mode 100644
index 0000000..3d2768b
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/ToColdFlow.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.channelFlow
+import kotlinx.coroutines.flow.conflate
+
+/**
+ * Returns a cold [Flow] that, when collected, emits from this [Events]. [network] is needed to
+ * transactionally connect to / disconnect from the [Events] when collection starts/stops.
+ */
+@ExperimentalKairosApi
+fun <A> Events<A>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, emits from this [State]. [network] is needed to
+ * transactionally connect to / disconnect from the [State] when collection starts/stops.
+ */
+@ExperimentalKairosApi
+fun <A> State<A>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [BuildSpec] in a new transaction in this
+ * [network], and then emits from the returned [Events].
+ *
+ * When collection is cancelled, so is the [BuildSpec]. This means all ongoing work is cleaned up.
+ */
+@ExperimentalKairosApi
+@JvmName("eventsSpecToColdConflatedFlow")
+fun <A> BuildSpec<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [BuildSpec] in a new transaction in this
+ * [network], and then emits from the returned [State].
+ *
+ * When collection is cancelled, so is the [BuildSpec]. This means all ongoing work is cleaned up.
+ */
+@ExperimentalKairosApi
+@JvmName("stateSpecToColdConflatedFlow")
+fun <A> BuildSpec<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applySpec().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [Events].
+ */
+@ExperimentalKairosApi
+@JvmName("transactionalFlowToColdConflatedFlow")
+fun <A> Transactional<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [State].
+ */
+@ExperimentalKairosApi
+@JvmName("transactionalStateToColdConflatedFlow")
+fun <A> Transactional<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { sample().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Stateful] in a new transaction in this
+ * [network], and then emits from the returned [Events].
+ *
+ * When collection is cancelled, so is the [Stateful]. This means all ongoing work is cleaned up.
+ */
+@ExperimentalKairosApi
+@JvmName("statefulFlowToColdConflatedFlow")
+fun <A> Stateful<Events<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
+
+/**
+ * Returns a cold [Flow] that, when collected, applies this [Transactional] in a new transaction in
+ * this [network], and then emits from the returned [State].
+ *
+ * When collection is cancelled, so is the [Stateful]. This means all ongoing work is cleaned up.
+ */
+@ExperimentalKairosApi
+@JvmName("statefulStateToColdConflatedFlow")
+fun <A> Stateful<State<A>>.toColdConflatedFlow(network: KairosNetwork): Flow<A> =
+    channelFlow { network.activateSpec { applyStateful().observe { trySend(it) } } }.conflate()
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TransactionScope.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TransactionScope.kt
index 2254169..a5ac909 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TransactionScope.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/TransactionScope.kt
@@ -16,11 +16,14 @@
 
 package com.android.systemui.kairos
 
+import com.android.systemui.kairos.util.Maybe
+import com.android.systemui.kairos.util.These
+
 /**
  * Kairos operations that are available while a transaction is active.
  *
  * These operations do not accumulate state, which makes [TransactionScope] weaker than
- * [StateScope], but allows them to be used in more places.
+ * [StateScope], but allows it to be used in more places.
  */
 @ExperimentalKairosApi
 interface TransactionScope : KairosScope {
@@ -57,7 +60,7 @@
      */
     fun <A> deferredTransactionScope(block: TransactionScope.() -> A): DeferredValue<A>
 
-    /** An [Events] that emits once, within this transaction, and then never again. */
+    /** An [Events] that emits once, within the current transaction, and then never again. */
     val now: Events<Unit>
 
     /**
@@ -66,7 +69,7 @@
      *
      * @see sampleDeferred
      */
-    fun <A> State<A>.sample(): A = sampleDeferred().get()
+    fun <A> State<A>.sample(): A = sampleDeferred().value
 
     /**
      * Returns the current value held by this [Transactional]. Guaranteed to be consistent within
@@ -74,5 +77,55 @@
      *
      * @see sampleDeferred
      */
-    fun <A> Transactional<A>.sample(): A = sampleDeferred().get()
+    fun <A> Transactional<A>.sample(): A = sampleDeferred().value
 }
+
+/**
+ * Returns an [Events] that emits the value sampled from the [Transactional] produced by each
+ * emission of the original [Events], within the same transaction of the original emission.
+ */
+@ExperimentalKairosApi
+fun <A> Events<Transactional<A>>.sampleTransactionals(): Events<A> = map { it.sample() }
+
+/** @see TransactionScope.sample */
+@ExperimentalKairosApi
+fun <A, B, C> Events<A>.sample(
+    state: State<B>,
+    transform: TransactionScope.(A, B) -> C,
+): Events<C> = map { transform(it, state.sample()) }
+
+/** @see TransactionScope.sample */
+@ExperimentalKairosApi
+fun <A, B, C> Events<A>.sample(
+    sampleable: Transactional<B>,
+    transform: TransactionScope.(A, B) -> C,
+): Events<C> = map { transform(it, sampleable.sample()) }
+
+/**
+ * Like [sample], but if [state] is changing at the time it is sampled ([changes] is emitting), then
+ * the new value is passed to [transform].
+ *
+ * Note that [sample] is both more performant and safer to use with recursive definitions. You will
+ * generally want to use it rather than this.
+ *
+ * @see sample
+ */
+@ExperimentalKairosApi
+fun <A, B, C> Events<A>.samplePromptly(
+    state: State<B>,
+    transform: TransactionScope.(A, B) -> C,
+): Events<C> =
+    sample(state) { a, b -> These.first(a to b) }
+        .mergeWith(state.changes.map { These.second(it) }) { thiz, that ->
+            These.both((thiz as These.First).value, (that as These.Second).value)
+        }
+        .mapMaybe { these ->
+            when (these) {
+                // both present, transform the upstream value and the new value
+                is These.Both -> Maybe.present(transform(these.first.first, these.second))
+                // no upstream present, so don't perform the sample
+                is These.Second -> Maybe.absent()
+                // just the upstream, so transform the upstream and the old value
+                is These.First -> Maybe.present(transform(these.value.first, these.value.second))
+            }
+        }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt
index 9485cd21..cf98821 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/Transactional.kt
@@ -29,8 +29,8 @@
  * it is "sampled", a new result may be produced.
  *
  * Because Kairos operates over an "idealized" model of Time that can be passed around as a data
- * type, [Transactional]s are guaranteed to produce the same result if queried multiple times at the
- * same (conceptual) time, in order to preserve _referential transparency_.
+ * type, [Transactionals][Transactional] are guaranteed to produce the same result if queried
+ * multiple times at the same (conceptual) time, in order to preserve _referential transparency_.
  */
 @ExperimentalKairosApi
 class Transactional<out A> internal constructor(internal val impl: State<TransactionalImpl<A>>) {
@@ -50,6 +50,10 @@
  * queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> DeferredValue<Transactional<A>>.defer() = deferredTransactional { get() }
+ * ```
  */
 @ExperimentalKairosApi
 fun <A> DeferredValue<Transactional<A>>.defer(): Transactional<A> = deferInline { unwrapped.value }
@@ -62,6 +66,10 @@
  * [value][Lazy.value] will be queried and used.
  *
  * Useful for recursive definitions.
+ *
+ * ``` kotlin
+ *   fun <A> Lazy<Transactional<A>>.defer() = deferredTransactional { value }
+ * ```
  */
 @ExperimentalKairosApi
 fun <A> Lazy<Transactional<A>>.defer(): Transactional<A> = deferInline { value }
@@ -89,7 +97,13 @@
 /**
  * Returns a [Transactional]. The passed [block] will be evaluated on demand at most once per
  * transaction; any subsequent sampling within the same transaction will receive a cached value.
+ *
+ * @sample com.android.systemui.kairos.KairosSamples.sampleTransactional
  */
 @ExperimentalKairosApi
 fun <A> transactionally(block: TransactionScope.() -> A): Transactional<A> =
     Transactional(stateOf(transactionalImpl { block() }))
+
+/** Returns a [Transactional] that, when queried, samples this [State]. */
+fun <A> State<A>.asTransactional(): Transactional<A> =
+    Transactional(map { TransactionalImpl.Const(CompletableLazy(it)) })
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
index b20e77a..2f4c396 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/BuildScopeImpl.kt
@@ -26,6 +26,7 @@
 import com.android.systemui.kairos.Events
 import com.android.systemui.kairos.EventsInit
 import com.android.systemui.kairos.GroupedEvents
+import com.android.systemui.kairos.KairosCoroutineScope
 import com.android.systemui.kairos.KairosNetwork
 import com.android.systemui.kairos.LocalNetwork
 import com.android.systemui.kairos.MutableEvents
@@ -33,20 +34,23 @@
 import com.android.systemui.kairos.groupByKey
 import com.android.systemui.kairos.init
 import com.android.systemui.kairos.internal.util.childScope
+import com.android.systemui.kairos.internal.util.invokeOnCancel
 import com.android.systemui.kairos.internal.util.launchImmediate
 import com.android.systemui.kairos.launchEffect
 import com.android.systemui.kairos.mergeLeft
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.Maybe.None
-import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.Maybe.Absent
+import com.android.systemui.kairos.util.Maybe.Present
 import com.android.systemui.kairos.util.map
 import java.util.concurrent.atomic.AtomicReference
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CompletableJob
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.job
 
@@ -60,12 +64,8 @@
         LocalNetwork(network, coroutineScope, endSignal)
     }
 
-    override fun <T> events(
-        name: String?,
-        builder: suspend EventProducerScope<T>.() -> Unit,
-    ): Events<T> =
+    override fun <T> events(builder: suspend EventProducerScope<T>.() -> Unit): Events<T> =
         buildEvents(
-            name,
             constructEvents = { inputNode ->
                 val events = MutableEvents(network, inputNode)
                 events to
@@ -123,9 +123,9 @@
         val childScope = coroutineScope.childScope()
         lateinit var cancelHandle: DisposableHandle
         val handle = DisposableHandle {
-            subRef.getAndSet(None)?.let { output ->
-                cancelHandle.dispose()
-                if (output is Just) {
+            cancelHandle.dispose()
+            subRef.getAndSet(Absent)?.let { output ->
+                if (output is Present) {
                     @Suppress("DeferredResultUnused")
                     network.transaction("observeEffect cancelled") {
                         scheduleDeactivation(output.value)
@@ -139,14 +139,27 @@
         val outputNode =
             Output<A>(
                 context = coroutineContext,
-                onDeath = { subRef.set(None) },
+                onDeath = { subRef.set(Absent) },
                 onEmit = { output ->
-                    if (subRef.get() is Just) {
+                    if (subRef.get() is Present) {
                         // Not cancelled, safe to emit
                         val scope =
                             object : EffectScope, TransactionScope by this {
-                                override val effectCoroutineScope: CoroutineScope = childScope
-                                override val kairosNetwork: KairosNetwork = localNetwork
+                                override fun <R> async(
+                                    context: CoroutineContext,
+                                    start: CoroutineStart,
+                                    block: suspend KairosCoroutineScope.() -> R,
+                                ): Deferred<R> =
+                                    childScope.async(context, start) {
+                                        object : KairosCoroutineScope, CoroutineScope by this {
+                                                override val kairosNetwork: KairosNetwork
+                                                    get() = localNetwork
+                                            }
+                                            .block()
+                                    }
+
+                                override val kairosNetwork: KairosNetwork
+                                    get() = localNetwork
                             }
                         scope.block(output)
                     }
@@ -162,7 +175,7 @@
                 .activate(evalScope = stateScope.evalScope, outputNode.schedulable)
                 ?.let { (conn, needsEval) ->
                     outputNode.upstream = conn
-                    if (!subRef.compareAndSet(null, just(outputNode))) {
+                    if (!subRef.compareAndSet(null, Maybe.present(outputNode))) {
                         // Job's already been cancelled, schedule deactivation
                         scheduleDeactivation(outputNode)
                     } else if (needsEval) {
@@ -289,21 +302,15 @@
     }
 
     private fun mutableChildBuildScope(): BuildScopeImpl {
-        val stopEmitter = newStopEmitter("mutableChildBuildScope")
         val childScope = coroutineScope.childScope()
-        childScope.coroutineContext.job.invokeOnCompletion { stopEmitter.emit(Unit) }
-        // Ensure that once this transaction is done, the new child scope enters the completing
-        // state (kept alive so long as there are child jobs).
-        // TODO: need to keep the scope alive if it's used to accumulate state.
-        //  Otherwise, stopEmitter will emit early, due to the call to complete().
-        //        scheduleOutput(
-        //            OneShot {
-        //                // TODO: don't like this cast
-        //                (childScope.coroutineContext.job as CompletableJob).complete()
-        //            }
-        //        )
+        val stopEmitter = lazy {
+            newStopEmitter("mutableChildBuildScope").apply {
+                childScope.invokeOnCancel { emit(Unit) }
+            }
+        }
         return BuildScopeImpl(
-            stateScope = StateScopeImpl(evalScope = stateScope.evalScope, endSignal = stopEmitter),
+            stateScope =
+                StateScopeImpl(evalScope = stateScope.evalScope, endSignalLazy = stopEmitter),
             coroutineScope = childScope,
         )
     }
@@ -314,6 +321,7 @@
     coroutineScope: CoroutineScope,
 ) =
     BuildScopeImpl(
-        stateScope = StateScopeImpl(evalScope = this, endSignal = outerScope.endSignal),
+        stateScope =
+            StateScopeImpl(evalScope = this, endSignalLazy = outerScope.stateScope.endSignalLazy),
         coroutineScope,
     )
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt
index 9496b06..f86e761 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/FilterNode.kt
@@ -19,16 +19,14 @@
 import com.android.systemui.kairos.internal.store.Single
 import com.android.systemui.kairos.internal.store.SingletonMapK
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.none
+import com.android.systemui.kairos.util.Maybe.Present
 
-internal inline fun <A> filterJustImpl(
+internal inline fun <A> filterPresentImpl(
     crossinline getPulse: EvalScope.() -> EventsImpl<Maybe<A>>
 ): EventsImpl<A> =
     DemuxImpl(
             mapImpl(getPulse) { maybeResult, _ ->
-                if (maybeResult is Just) {
+                if (maybeResult is Present) {
                     Single(maybeResult.value)
                 } else {
                     Single<A>()
@@ -43,6 +41,7 @@
     crossinline getPulse: EvalScope.() -> EventsImpl<A>,
     crossinline f: EvalScope.(A) -> Boolean,
 ): EventsImpl<A> {
-    val mapped = mapImpl(getPulse) { it, _ -> if (f(it)) just(it) else none }.cached()
-    return filterJustImpl { mapped }
+    val mapped =
+        mapImpl(getPulse) { it, _ -> if (f(it)) Maybe.present(it) else Maybe.absent }.cached()
+    return filterPresentImpl { mapped }
 }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/IncrementalImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/IncrementalImpl.kt
index 8a3e01a..9b4778a 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/IncrementalImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/IncrementalImpl.kt
@@ -17,11 +17,10 @@
 package com.android.systemui.kairos.internal
 
 import com.android.systemui.kairos.internal.store.StoreEntry
+import com.android.systemui.kairos.util.MapPatch
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.applyPatch
-import com.android.systemui.kairos.util.just
 import com.android.systemui.kairos.util.map
-import com.android.systemui.kairos.util.none
+import com.android.systemui.kairos.util.toMaybe
 
 internal class IncrementalImpl<K, out V>(
     name: String?,
@@ -48,12 +47,11 @@
     val store = StateSource(init)
     val maybeChanges =
         mapImpl(getPatches) { patch, _ ->
-                val (old, _) = store.getCurrentWithEpoch(evalScope = this)
-                val new = old.applyPatch(patch)
-                if (new != old) just(patch to new) else none
+                val (current, _) = store.getCurrentWithEpoch(evalScope = this)
+                current.applyPatchCalm(patch).toMaybe()
             }
             .cached()
-    val calm = filterJustImpl { maybeChanges }
+    val calm = filterPresentImpl { maybeChanges }
     val changes = mapImpl({ calm }) { (_, change), _ -> change }
     val patches = mapImpl({ calm }) { (patch, _), _ -> patch }
     evalScope.scheduleOutput(
@@ -70,22 +68,44 @@
     return IncrementalImpl(name, operatorName, changes, patches, store)
 }
 
+private fun <K, V> Map<K, V>.applyPatchCalm(
+    patch: MapPatch<K, V>
+): Pair<MapPatch<K, V>, Map<K, V>>? {
+    val current = this
+    val filteredPatch = mutableMapOf<K, Maybe<V>>()
+    val new = current.toMutableMap()
+    for ((key, change) in patch) {
+        when (change) {
+            is Maybe.Present -> {
+                if (key !in current || current.getValue(key) != change.value) {
+                    filteredPatch[key] = change
+                    new[key] = change.value
+                }
+            }
+            Maybe.Absent -> {
+                if (key in current) {
+                    filteredPatch[key] = change
+                    new.remove(key)
+                }
+            }
+        }
+    }
+    return if (filteredPatch.isNotEmpty()) filteredPatch to new else null
+}
+
 internal inline fun <K, V> EventsImpl<Map<K, Maybe<V>>>.calmUpdates(
     state: StateDerived<Map<K, V>>
 ): Pair<EventsImpl<Map<K, Maybe<V>>>, EventsImpl<Map<K, V>>> {
     val maybeUpdate =
         mapImpl({ this@calmUpdates }) { patch, _ ->
                 val (current, _) = state.getCurrentWithEpoch(evalScope = this)
-                val new = current.applyPatch(patch)
-                if (new != current) {
-                    state.setCacheFromPush(new, epoch)
-                    just(patch to new)
-                } else {
-                    none
-                }
+                current
+                    .applyPatchCalm(patch)
+                    ?.also { (_, newMap) -> state.setCacheFromPush(newMap, epoch) }
+                    .toMaybe()
             }
             .cached()
-    val calm = filterJustImpl { maybeUpdate }
+    val calm = filterPresentImpl { maybeUpdate }
     val patches = mapImpl({ calm }) { (p, _), _ -> p }
     val changes = mapImpl({ calm }) { (_, s), _ -> s }
     return patches to changes
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt
index 640c561..4fa1070 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Init.kt
@@ -17,8 +17,6 @@
 package com.android.systemui.kairos.internal
 
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.none
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 /** Performs actions once, when the reactive component is first connected to the network. */
@@ -44,9 +42,9 @@
     @OptIn(ExperimentalCoroutinesApi::class)
     fun getUnsafe(): Maybe<A> =
         if (cache.isInitialized()) {
-            just(cache.value.second)
+            Maybe.present(cache.value.second)
         } else {
-            none
+            Maybe.absent
         }
 }
 
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
index cf74f75..c11eb12 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxDeferred.kt
@@ -28,14 +28,13 @@
 import com.android.systemui.kairos.internal.util.logDuration
 import com.android.systemui.kairos.internal.util.logLn
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.Maybe.None
+import com.android.systemui.kairos.util.Maybe.Absent
+import com.android.systemui.kairos.util.Maybe.Present
 import com.android.systemui.kairos.util.These
 import com.android.systemui.kairos.util.flatMap
 import com.android.systemui.kairos.util.getMaybe
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.maybeThat
-import com.android.systemui.kairos.util.maybeThis
+import com.android.systemui.kairos.util.maybeFirst
+import com.android.systemui.kairos.util.maybeSecond
 import com.android.systemui.kairos.util.merge
 import com.android.systemui.kairos.util.orError
 import com.android.systemui.kairos.util.these
@@ -133,8 +132,8 @@
         val removes = mutableListOf<K>()
         patch.forEach { (k, newUpstream) ->
             when (newUpstream) {
-                is Just -> adds.add(k to newUpstream.value)
-                None -> removes.add(k)
+                is Present -> adds.add(k to newUpstream.value)
+                Absent -> removes.add(k)
             }
         }
 
@@ -282,7 +281,8 @@
     crossinline getStorage: EvalScope.() -> EventsImpl<A>,
     crossinline getPatches: EvalScope.() -> EventsImpl<EventsImpl<A>>,
 ): EventsImpl<A> {
-    val patches = mapImpl(getPatches) { newEvents, _ -> singleOf(just(newEvents)).asIterable() }
+    val patches =
+        mapImpl(getPatches) { newEvents, _ -> singleOf(Maybe.present(newEvents)).asIterable() }
     val switchDeferredImpl =
         switchDeferredImpl(
             name = name,
@@ -402,8 +402,8 @@
 ): EventsImpl<These<A, B>> {
     val storage =
         listOf(
-                mapImpl(getPulse) { it, _ -> These.thiz(it) },
-                mapImpl(getOther) { it, _ -> These.that(it) },
+                mapImpl(getPulse) { it, _ -> These.first(it) },
+                mapImpl(getOther) { it, _ -> These.second(it) },
             )
             .asIterableWithIndex()
     val switchNode =
@@ -417,9 +417,9 @@
         mapImpl({ switchNode }) { it, logIndent ->
             val mergeResults = it.asArrayHolder()
             val first =
-                mergeResults.getMaybe(0).flatMap { it.getPushEvent(logIndent, this).maybeThis() }
+                mergeResults.getMaybe(0).flatMap { it.getPushEvent(logIndent, this).maybeFirst() }
             val second =
-                mergeResults.getMaybe(1).flatMap { it.getPushEvent(logIndent, this).maybeThat() }
+                mergeResults.getMaybe(1).flatMap { it.getPushEvent(logIndent, this).maybeSecond() }
             these(first, second).orError { "unexpected missing merge result" }
         }
     return merged.cached()
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
index 32aef5c..cb2c6e5 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/MuxPrompt.kt
@@ -24,9 +24,8 @@
 import com.android.systemui.kairos.internal.util.hashString
 import com.android.systemui.kairos.internal.util.logDuration
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.Maybe.None
-import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.Maybe.Absent
+import com.android.systemui.kairos.util.Maybe.Present
 
 internal class MuxPromptNode<W, K, V>(
     val name: String?,
@@ -94,8 +93,8 @@
         val removes = mutableListOf<K>()
         patch.forEach { (k, newUpstream) ->
             when (newUpstream) {
-                is Just -> adds.add(k to newUpstream.value)
-                None -> removes.add(k)
+                is Present -> adds.add(k to newUpstream.value)
+                Absent -> removes.add(k)
             }
         }
 
@@ -311,7 +310,9 @@
         switchPromptImpl(
             getStorage = { singleOf(getStorage()).asIterable() },
             getPatches = {
-                mapImpl(getPatches) { newEvents, _ -> singleOf(just(newEvents)).asIterable() }
+                mapImpl(getPatches) { newEvents, _ ->
+                    singleOf(Maybe.present(newEvents)).asIterable()
+                }
             },
             storeFactory = SingletonMapK.Factory(),
         )
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
index fbc2b364..6e86dd1 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/Network.kt
@@ -21,9 +21,7 @@
 import com.android.systemui.kairos.internal.util.logDuration
 import com.android.systemui.kairos.internal.util.logLn
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.none
+import com.android.systemui.kairos.util.Maybe.Present
 import java.util.concurrent.atomic.AtomicLong
 import kotlin.coroutines.ContinuationInterceptor
 import kotlin.time.measureTime
@@ -33,6 +31,7 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.isActive
 import kotlinx.coroutines.job
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.sync.Mutex
@@ -148,6 +147,10 @@
     /** Evaluates [block] inside of a new transaction when the network is ready. */
     fun <R> transaction(reason: String, block: suspend EvalScope.() -> R): Deferred<R> =
         CompletableDeferred<R>(parent = coroutineScope.coroutineContext.job).also { onResult ->
+            if (!coroutineScope.isActive) {
+                onResult.cancel()
+                return@also
+            }
             val job =
                 coroutineScope.launch {
                     inputScheduleChan.send(
@@ -261,25 +264,25 @@
     private val onResult: CompletableDeferred<T>? = null,
     private val onStartTransaction: suspend EvalScope.() -> T,
 ) {
-    private var result: Maybe<T> = none
+    private var result: Maybe<T> = Maybe.absent
 
     suspend fun started(evalScope: EvalScope) {
-        result = just(onStartTransaction(evalScope))
+        result = Maybe.present(onStartTransaction(evalScope))
     }
 
     fun fail(ex: Exception) {
-        result = none
+        result = Maybe.absent
         onResult?.completeExceptionally(ex)
     }
 
     fun completed() {
         if (onResult != null) {
             when (val result = result) {
-                is Just -> onResult.complete(result.value)
+                is Present -> onResult.complete(result.value)
                 else -> {}
             }
         }
-        result = none
+        result = Maybe.absent
     }
 }
 
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateImpl.kt
index 46127cb2..da83258 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateImpl.kt
@@ -22,8 +22,6 @@
 import com.android.systemui.kairos.internal.store.StoreEntry
 import com.android.systemui.kairos.internal.util.hashString
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.just
-import com.android.systemui.kairos.util.none
 
 internal open class StateImpl<out A>(
     val name: String?,
@@ -73,7 +71,7 @@
 
     fun getCachedUnsafe(): Maybe<A> {
         @Suppress("UNCHECKED_CAST")
-        return if (cache == EmptyCache) none else just(cache as A)
+        return if (cache == EmptyCache) Maybe.absent else Maybe.present(cache as A)
     }
 
     protected abstract fun recalc(evalScope: EvalScope): Pair<A, Long>?
@@ -117,7 +115,8 @@
 
     override fun toString(): String = "StateImpl(current=$_current, writeEpoch=$writeEpoch)"
 
-    fun getStorageUnsafe(): Maybe<S> = if (_current.isInitialized()) just(_current.value) else none
+    fun getStorageUnsafe(): Maybe<S> =
+        if (_current.isInitialized()) Maybe.present(_current.value) else Maybe.absent
 }
 
 internal fun <A> constState(name: String?, operatorName: String, init: A): StateImpl<A> =
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt
index bd1f94f..53a704a 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/StateScopeImpl.kt
@@ -36,10 +36,14 @@
 import com.android.systemui.kairos.util.Maybe
 import com.android.systemui.kairos.util.map
 
-internal class StateScopeImpl(val evalScope: EvalScope, override val endSignal: Events<Any>) :
+internal class StateScopeImpl(val evalScope: EvalScope, val endSignalLazy: Lazy<Events<Any>>) :
     InternalStateScope, EvalScope by evalScope {
 
-    override val endSignalOnce: Events<Any> = endSignal.nextOnlyInternal("StateScope.endSignal")
+    override val endSignal: Events<Any> by endSignalLazy
+
+    override val endSignalOnce: Events<Any> by lazy {
+        endSignal.nextOnlyInternal("StateScope.endSignal")
+    }
 
     override fun <A> deferredStateScope(block: StateScope.() -> A): DeferredValue<A> =
         DeferredValue(deferAsync { block() })
@@ -119,7 +123,7 @@
     }
 
     override fun childStateScope(newEnd: Events<Any>) =
-        StateScopeImpl(evalScope, merge(newEnd, endSignal))
+        StateScopeImpl(evalScope, lazy { merge(newEnd, endSignal) })
 
     private fun <A> Events<A>.truncateToScope(operatorName: String): Events<A> =
         if (endSignalOnce === emptyEvents) {
@@ -165,4 +169,4 @@
 }
 
 private fun EvalScope.reenterStateScope(outerScope: StateScopeImpl) =
-    StateScopeImpl(evalScope = this, endSignal = outerScope.endSignal)
+    StateScopeImpl(evalScope = this, endSignalLazy = outerScope.endSignalLazy)
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt
index 9b6940d..c34e67e 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/HeteroMap.kt
@@ -17,8 +17,7 @@
 package com.android.systemui.kairos.internal.util
 
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.None
-import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.Maybe.Absent
 import java.util.concurrent.ConcurrentHashMap
 
 private object NULL
@@ -32,7 +31,7 @@
 
     @Suppress("UNCHECKED_CAST")
     operator fun <A> get(key: Key<A>): Maybe<A> =
-        store[key]?.let { just((if (it === NULL) null else it) as A) } ?: None
+        store[key]?.let { Maybe.present((if (it === NULL) null else it) as A) } ?: Absent
 
     operator fun <A> set(key: Key<A>, value: A) {
         store[key] = value ?: NULL
@@ -57,7 +56,7 @@
 
     @Suppress("UNCHECKED_CAST")
     fun <A> remove(key: Key<A>): Maybe<A> =
-        store.remove(key)?.let { just((if (it === NULL) null else it) as A) } ?: None
+        store.remove(key)?.let { Maybe.present((if (it === NULL) null else it) as A) } ?: Absent
 
     @Suppress("UNCHECKED_CAST")
     fun <A> getOrPut(key: Key<A>, defaultValue: () -> A): A =
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt
index 466a9f8..d2a169c 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/util/Util.kt
@@ -112,7 +112,7 @@
     }
 }
 
-internal fun CoroutineScope.launchOnCancel(
+internal fun CoroutineScope.invokeOnCancel(
     context: CoroutineContext = EmptyCoroutineContext,
     block: () -> Unit,
 ): Job =
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt
index 957d46f..9f17d56 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Either.kt
@@ -18,100 +18,118 @@
 
 package com.android.systemui.kairos.util
 
-import com.android.systemui.kairos.util.Either.Left
-import com.android.systemui.kairos.util.Either.Right
+import com.android.systemui.kairos.util.Either.First
+import com.android.systemui.kairos.util.Either.Second
 
 /**
- * Contains a value of two possibilities: `Left<A>` or `Right<B>`
+ * Contains a value of two possibilities: `First<A>` or `Second<B>`
  *
  * [Either] generalizes sealed classes the same way that [Pair] generalizes data classes; if a
  * [Pair] is effectively an anonymous grouping of two instances, then an [Either] is an anonymous
  * set of two options.
  */
 sealed interface Either<out A, out B> {
-    /** An [Either] that contains a [Left] value. */
-    @JvmInline value class Left<out A>(val value: A) : Either<A, Nothing>
+    /** An [Either] that contains a [First] value. */
+    @JvmInline value class First<out A>(val value: A) : Either<A, Nothing>
 
-    /** An [Either] that contains a [Right] value. */
-    @JvmInline value class Right<out B>(val value: B) : Either<Nothing, B>
+    /** An [Either] that contains a [Second] value. */
+    @JvmInline value class Second<out B>(val value: B) : Either<Nothing, B>
+
+    companion object {
+        /** Constructs an [Either] containing the first possibility. */
+        fun <A> first(value: A): Either<A, Nothing> = First(value)
+
+        /** Constructs a [Either] containing the second possibility. */
+        fun <B> second(value: B): Either<Nothing, B> = Second(value)
+    }
 }
 
 /**
- * Returns an [Either] containing the result of applying [transform] to the [Left] value, or the
- * [Right] value unchanged.
+ * Returns an [Either] containing the result of applying [transform] to the [First] value, or the
+ * [Second] value unchanged.
  */
-inline fun <A, B, C> Either<A, C>.mapLeft(transform: (A) -> B): Either<B, C> =
+inline fun <A, B, C> Either<A, C>.mapFirst(transform: (A) -> B): Either<B, C> =
     when (this) {
-        is Left -> Left(transform(value))
-        is Right -> this
+        is First -> First(transform(value))
+        is Second -> this
     }
 
 /**
- * Returns an [Either] containing the result of applying [transform] to the [Right] value, or the
- * [Left] value unchanged.
+ * Returns an [Either] containing the result of applying [transform] to the [Second] value, or the
+ * [First] value unchanged.
  */
-inline fun <A, B, C> Either<A, B>.mapRight(transform: (B) -> C): Either<A, C> =
+inline fun <A, B, C> Either<A, B>.mapSecond(transform: (B) -> C): Either<A, C> =
     when (this) {
-        is Left -> this
-        is Right -> Right(transform(value))
+        is First -> this
+        is Second -> Second(transform(value))
     }
 
-/** Returns a [Maybe] containing the [Left] value held by this [Either], if present. */
-inline fun <A> Either<A, *>.leftMaybe(): Maybe<A> =
+/** Returns a [Maybe] containing the [First] value held by this [Either], if present. */
+inline fun <A> Either<A, *>.firstMaybe(): Maybe<A> =
     when (this) {
-        is Left -> just(value)
-        else -> none
+        is First -> Maybe.present(value)
+        else -> Maybe.absent
     }
 
-/** Returns the [Left] value held by this [Either], or `null` if this is a [Right] value. */
-inline fun <A> Either<A, *>.leftOrNull(): A? =
+/** Returns the [First] value held by this [Either], or `null` if this is a [Second] value. */
+inline fun <A> Either<A, *>.firstOrNull(): A? =
     when (this) {
-        is Left -> value
+        is First -> value
         else -> null
     }
 
-/** Returns a [Maybe] containing the [Right] value held by this [Either], if present. */
-inline fun <B> Either<*, B>.rightMaybe(): Maybe<B> =
+/** Returns a [Maybe] containing the [Second] value held by this [Either], if present. */
+inline fun <B> Either<*, B>.secondMaybe(): Maybe<B> =
     when (this) {
-        is Right -> just(value)
-        else -> none
+        is Second -> Maybe.present(value)
+        else -> Maybe.absent
     }
 
-/** Returns the [Right] value held by this [Either], or `null` if this is a [Left] value. */
-inline fun <B> Either<*, B>.rightOrNull(): B? =
+/** Returns the [Second] value held by this [Either], or `null` if this is a [First] value. */
+inline fun <B> Either<*, B>.secondOrNull(): B? =
     when (this) {
-        is Right -> value
+        is Second -> value
         else -> null
     }
 
 /**
- * Partitions this sequence of [Either] into two lists; [Pair.first] contains all [Left] values, and
- * [Pair.second] contains all [Right] values.
+ * Returns a [These] containing either the [First] value as [These.first], or the [Second] value as
+ * [These.second]. Will never return a [These.both].
+ */
+fun <A, B> Either<A, B>.asThese(): These<A, B> =
+    when (this) {
+        is Second -> These.second(value)
+        is First -> These.first(value)
+    }
+
+/**
+ * Partitions this sequence of [Either] into two lists; [Pair.first] contains all [First] values,
+ * and [Pair.second] contains all [Second] values.
  */
 fun <A, B> Sequence<Either<A, B>>.partitionEithers(): Pair<List<A>, List<B>> {
-    val lefts = mutableListOf<A>()
-    val rights = mutableListOf<B>()
+    val firsts = mutableListOf<A>()
+    val seconds = mutableListOf<B>()
     for (either in this) {
         when (either) {
-            is Left -> lefts.add(either.value)
-            is Right -> rights.add(either.value)
+            is First -> firsts.add(either.value)
+            is Second -> seconds.add(either.value)
         }
     }
-    return lefts to rights
+    return firsts to seconds
 }
 
 /**
- * Partitions this map of [Either] values into two maps; [Pair.first] contains all [Left] values,
- * and [Pair.second] contains all [Right] values.
+ * Partitions this map of [Either] values into two maps; [Pair.first] contains all [First] values,
+ * and [Pair.second] contains all [Second] values.
  */
 fun <K, A, B> Map<K, Either<A, B>>.partitionEithers(): Pair<Map<K, A>, Map<K, B>> {
-    val lefts = mutableMapOf<K, A>()
-    val rights = mutableMapOf<K, B>()
+    val firsts = mutableMapOf<K, A>()
+    val seconds = mutableMapOf<K, B>()
     for ((k, e) in this) {
         when (e) {
-            is Left -> lefts[k] = e.value
-            is Right -> rights[k] = e.value
+            is First -> firsts[k] = e.value
+            is Second -> seconds[k] = e.value
         }
     }
-    return lefts to rights
+    return firsts to seconds
 }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/MapPatch.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/MapPatch.kt
index f368cbf..8fe41bc 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/MapPatch.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/MapPatch.kt
@@ -16,9 +16,9 @@
 
 package com.android.systemui.kairos.util
 
-import com.android.systemui.kairos.util.Either.Left
-import com.android.systemui.kairos.util.Either.Right
-import com.android.systemui.kairos.util.Maybe.Just
+import com.android.systemui.kairos.util.Either.First
+import com.android.systemui.kairos.util.Either.Second
+import com.android.systemui.kairos.util.Maybe.Present
 
 /** A "patch" that can be used to batch-update a [Map], via [applyPatch]. */
 typealias MapPatch<K, V> = Map<K, Maybe<V>>
@@ -27,16 +27,16 @@
  * Returns a new [Map] that has [patch] applied to the original map.
  *
  * For each entry in [patch]:
- * * a [Just] value will be included in the new map, replacing the entry in the original map with
+ * * a [Present] value will be included in the new map, replacing the entry in the original map with
  *   the same key, if present.
- * * a [Maybe.None] value will be omitted from the new map, excluding the entry in the original map
- *   with the same key, if present.
+ * * a [Maybe.Absent] value will be omitted from the new map, excluding the entry in the original
+ *   map with the same key, if present.
  */
 fun <K, V> Map<K, V>.applyPatch(patch: MapPatch<K, V>): Map<K, V> {
     val (adds: List<Pair<K, V>>, removes: List<K>) =
         patch
             .asSequence()
-            .map { (k, v) -> if (v is Just) Left(k to v.value) else Right(k) }
+            .map { (k, v) -> if (v is Present) First(k to v.value) else Second(k) }
             .partitionEithers()
     val removed: Map<K, V> = this - removes.toSet()
     val updated: Map<K, V> = removed + adds
@@ -47,11 +47,11 @@
  * Returns a [MapPatch] that, when applied, includes all of the values from the original [Map].
  *
  * Shorthand for:
- * ```kotlin
- * mapValues { just(it.value) }
+ * ``` kotlin
+ *   mapValues { (key, value) -> Maybe.present(value) }
  * ```
  */
-fun <K, V> Map<K, V>.toMapPatch(): MapPatch<K, V> = mapValues { just(it.value) }
+fun <K, V> Map<K, V>.toMapPatch(): MapPatch<K, V> = mapValues { Maybe.present(it.value) }
 
 /**
  * Returns a [MapPatch] that, when applied, includes all of the entries from [new] whose keys are
@@ -67,10 +67,10 @@
     val adds = new - old.keys
     return buildMap {
         for (removed in removes) {
-            put(removed, none)
+            put(removed, Maybe.absent)
         }
         for ((newKey, newValue) in adds) {
-            put(newKey, just(newValue))
+            put(newKey, Maybe.present(newValue))
         }
     }
 }
@@ -86,13 +86,16 @@
  */
 fun <K, V> mapPatchFromFullDiff(old: Map<K, V>, new: Map<K, V>): MapPatch<K, V> {
     val removes = old.keys - new.keys
-    val adds = new.mapMaybeValues { (k, v) -> if (k in old && v == old[k]) none else just(v) }
+    val adds =
+        new.mapMaybeValues { (k, v) ->
+            if (k in old && v == old[k]) Maybe.absent else Maybe.present(v)
+        }
     return hashMapOf<K, Maybe<V>>().apply {
         for (removed in removes) {
-            put(removed, none)
+            put(removed, Maybe.absent)
         }
         for ((newKey, newValue) in adds) {
-            put(newKey, just(newValue))
+            put(newKey, Maybe.present(newValue))
         }
     }
 }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt
index 681218399..4754bc4 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/Maybe.kt
@@ -18,8 +18,8 @@
 
 package com.android.systemui.kairos.util
 
-import com.android.systemui.kairos.util.Maybe.Just
-import com.android.systemui.kairos.util.Maybe.None
+import com.android.systemui.kairos.util.Maybe.Absent
+import com.android.systemui.kairos.util.Maybe.Present
 import kotlin.coroutines.Continuation
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
@@ -31,17 +31,28 @@
 /** Represents a value that may or may not be present. */
 sealed interface Maybe<out A> {
     /** A [Maybe] value that is present. */
-    @JvmInline value class Just<out A> internal constructor(val value: A) : Maybe<A>
+    @JvmInline value class Present<out A> internal constructor(val value: A) : Maybe<A>
 
     /** A [Maybe] value that is not present. */
-    data object None : Maybe<Nothing>
+    data object Absent : Maybe<Nothing>
+
+    companion object {
+        /** Returns a [Maybe] containing [value]. */
+        fun <A> present(value: A): Maybe<A> = Present(value)
+
+        /** A [Maybe] that is not present. */
+        val absent: Maybe<Nothing> = Absent
+
+        /** A [Maybe] that is not present. */
+        inline fun <A> absent(): Maybe<A> = Absent
+    }
 }
 
 /** Utilities to query [Maybe] instances from within a [maybe] block. */
 @RestrictsSuspension
 object MaybeScope {
     suspend operator fun <A> Maybe<A>.not(): A = suspendCoroutine { k ->
-        if (this is Just) k.resume(value)
+        if (this is Present) k.resume(value)
     }
 
     suspend inline fun guard(crossinline block: () -> Boolean): Unit = suspendCoroutine { k ->
@@ -53,7 +64,8 @@
  * Returns a [Maybe] value produced by evaluating [block].
  *
  * [block] can use its [MaybeScope] receiver to query other [Maybe] values, automatically cancelling
- * execution of [block] and producing [None] when attempting to query a [Maybe] that is not present.
+ * execution of [block] and producing [Absent] when attempting to query a [Maybe] that is not
+ * present.
  *
  * This can be used instead of Kotlin's built-in nullability (`?.` and `?:`) operators when dealing
  * with complex combinations of nullables:
@@ -68,33 +80,30 @@
  * ```
  */
 fun <A> maybe(block: suspend MaybeScope.() -> A): Maybe<A> {
-    var maybeResult: Maybe<A> = None
+    var maybeResult: Maybe<A> = Absent
     val k =
         object : Continuation<A> {
             override val context: CoroutineContext = EmptyCoroutineContext
 
             override fun resumeWith(result: Result<A>) {
-                maybeResult = result.getOrNull()?.let { just(it) } ?: None
+                maybeResult = result.getOrNull()?.let { Maybe.present(it) } ?: Absent
             }
         }
     block.startCoroutine(MaybeScope, k)
     return maybeResult
 }
 
-/** Returns a [Just] containing this value, or [None] if `null`. */
+/** Returns a [Maybe] containing this value if it is not `null`. */
 inline fun <A> (A?).toMaybe(): Maybe<A> = maybe(this)
 
-/** Returns a [Just] containing a non-null [value], or [None] if `null`. */
-inline fun <A> maybe(value: A?): Maybe<A> = value?.let(::just) ?: None
+/** Returns a [Maybe] containing [value] if it is not `null`. */
+inline fun <A> maybe(value: A?): Maybe<A> = value?.let { Maybe.present(it) } ?: Absent
 
-/** Returns a [Just] containing [value]. */
-fun <A> just(value: A): Maybe<A> = Just(value)
+/** Returns a [Maybe] that is absent. */
+fun <A> maybeOf(): Maybe<A> = Absent
 
-/** A [Maybe] that is not present. */
-val none: Maybe<Nothing> = None
-
-/** A [Maybe] that is not present. */
-inline fun <A> none(): Maybe<A> = None
+/** Returns a [Maybe] containing [value]. */
+fun <A> maybeOf(value: A): Maybe<A> = Present(value)
 
 /** Returns the value present in this [Maybe], or `null` if not present. */
 inline fun <A> Maybe<A>.orNull(): A? = orElse(null)
@@ -105,22 +114,22 @@
  */
 inline fun <A, B> Maybe<A>.map(transform: (A) -> B): Maybe<B> =
     when (this) {
-        is Just -> just(transform(value))
-        is None -> None
+        is Present -> Maybe.present(transform(value))
+        is Absent -> Absent
     }
 
 /** Returns the result of applying [transform] to the value in the original [Maybe]. */
 inline fun <A, B> Maybe<A>.flatMap(transform: (A) -> Maybe<B>): Maybe<B> =
     when (this) {
-        is Just -> transform(value)
-        is None -> None
+        is Present -> transform(value)
+        is Absent -> Absent
     }
 
 /** Returns the value present in this [Maybe], or the result of [defaultValue] if not present. */
 inline fun <A> Maybe<A>.orElseGet(defaultValue: () -> A): A =
     when (this) {
-        is Just -> value
-        is None -> defaultValue()
+        is Present -> value
+        is Absent -> defaultValue()
     }
 
 /**
@@ -132,8 +141,8 @@
 /** Returns the value present in this [Maybe], or [defaultValue] if not present. */
 inline fun <A> Maybe<A>.orElse(defaultValue: A): A =
     when (this) {
-        is Just -> value
-        is None -> defaultValue
+        is Present -> value
+        is Absent -> defaultValue
     }
 
 /**
@@ -142,15 +151,16 @@
  */
 inline fun <A> Maybe<A>.filter(predicate: (A) -> Boolean): Maybe<A> =
     when (this) {
-        is Just -> if (predicate(value)) this else None
+        is Present -> if (predicate(value)) this else Absent
         else -> this
     }
 
 /** Returns a [List] containing all values that are present in this [Iterable]. */
-fun <A> Iterable<Maybe<A>>.filterJust(): List<A> = asSequence().filterJust().toList()
+fun <A> Iterable<Maybe<A>>.filterPresent(): List<A> = asSequence().filterPresent().toList()
 
 /** Returns a [List] containing all values that are present in this [Sequence]. */
-fun <A> Sequence<Maybe<A>>.filterJust(): Sequence<A> = filterIsInstance<Just<A>>().map { it.value }
+fun <A> Sequence<Maybe<A>>.filterPresent(): Sequence<A> =
+    filterIsInstance<Present<A>>().map { it.value }
 
 // Align
 
@@ -160,23 +170,25 @@
  */
 inline fun <A, B, C> Maybe<A>.alignWith(other: Maybe<B>, transform: (These<A, B>) -> C): Maybe<C> =
     when (this) {
-        is Just -> {
+        is Present -> {
             val a = value
             when (other) {
-                is Just -> {
+                is Present -> {
                     val b = other.value
-                    just(transform(These.both(a, b)))
+                    Maybe.present(transform(These.both(a, b)))
                 }
-                None -> just(transform(These.thiz(a)))
+
+                Absent -> Maybe.present(transform(These.first(a)))
             }
         }
-        None ->
+        Absent ->
             when (other) {
-                is Just -> {
+                is Present -> {
                     val b = other.value
-                    just(transform(These.that(b)))
+                    Maybe.present(transform(These.second(b)))
                 }
-                None -> none
+
+                Absent -> Maybe.absent
             }
     }
 
@@ -190,7 +202,7 @@
  */
 inline fun <A> Maybe<A>.orElseGetMaybe(other: () -> Maybe<A>): Maybe<A> =
     when (this) {
-        is Just -> this
+        is Present -> this
         else -> other()
     }
 
@@ -235,7 +247,7 @@
 inline fun <A, B> Iterable<A>.mapMaybe(transform: (A) -> Maybe<B>): List<B> = buildList {
     for (a in this@mapMaybe) {
         val result = transform(a)
-        if (result is Just) {
+        if (result is Present) {
             add(result.value)
         }
     }
@@ -246,7 +258,7 @@
  * the original sequence.
  */
 fun <A, B> Sequence<A>.mapMaybe(transform: (A) -> Maybe<B>): Sequence<B> =
-    map(transform).filterIsInstance<Just<B>>().map { it.value }
+    map(transform).filterIsInstance<Present<B>>().map { it.value }
 
 /**
  * Returns a map with values of only the present results of applying [transform] to each entry in
@@ -256,14 +268,14 @@
     buildMap {
         for (entry in this@mapMaybeValues) {
             val result = transform(entry)
-            if (result is Just) {
+            if (result is Present) {
                 put(entry.key, result.value)
             }
         }
     }
 
 /** Returns a map with all non-present values filtered out. */
-fun <K, A> Map<K, Maybe<A>>.filterJustValues(): Map<K, A> =
+fun <K, A> Map<K, Maybe<A>>.filterPresentValues(): Map<K, A> =
     asSequence().mapMaybe { (key, mValue) -> mValue.map { key to it } }.toMap()
 
 /**
@@ -277,9 +289,9 @@
 fun <K, V> Map<K, V>.getMaybe(key: K): Maybe<V> {
     val value = get(key)
     if (value == null && !containsKey(key)) {
-        return none
+        return Maybe.absent
     } else {
         @Suppress("UNCHECKED_CAST")
-        return just(value as V)
+        return Maybe.present(value as V)
     }
 }
diff --git a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt
index 092dca4..fc7b1e0 100644
--- a/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt
+++ b/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/util/These.kt
@@ -16,28 +16,28 @@
 
 package com.android.systemui.kairos.util
 
-import com.android.systemui.kairos.util.Maybe.Just
+import com.android.systemui.kairos.util.Maybe.Present
 
 /** Contains at least one of two potential values. */
 sealed class These<out A, out B> {
-    /** Contains a single potential value. */
-    class This<A, B> internal constructor(val thiz: A) : These<A, B>()
+    /** A [These] that contains a [First] value. */
+    class First<A, B> internal constructor(val value: A) : These<A, B>()
 
-    /** Contains a single potential value. */
-    class That<A, B> internal constructor(val that: B) : These<A, B>()
+    /** A [These] that contains a [Second] value. */
+    class Second<A, B> internal constructor(val value: B) : These<A, B>()
 
-    /** Contains both potential values. */
-    class Both<A, B> internal constructor(val thiz: A, val that: B) : These<A, B>()
+    /** A [These] that contains [Both] a [first] and [second] value. */
+    class Both<A, B> internal constructor(val first: A, val second: B) : These<A, B>()
 
     companion object {
-        /** Constructs a [These] containing only [thiz]. */
-        fun <A> thiz(thiz: A): These<A, Nothing> = This(thiz)
+        /** Constructs a [These] containing the first possibility. */
+        fun <A> first(value: A): These<A, Nothing> = First(value)
 
-        /** Constructs a [These] containing only [that]. */
-        fun <B> that(that: B): These<Nothing, B> = That(that)
+        /** Constructs a [These] containing the second possibility. */
+        fun <B> second(value: B): These<Nothing, B> = Second(value)
 
-        /** Constructs a [These] containing both [thiz] and [that]. */
-        fun <A, B> both(thiz: A, that: B): These<A, B> = Both(thiz, that)
+        /** Constructs a [These] containing both possibilities. */
+        fun <A, B> both(first: A, second: B): These<A, B> = Both(first, second)
     }
 }
 
@@ -47,87 +47,88 @@
  */
 inline fun <A> These<A, A>.merge(f: (A, A) -> A): A =
     when (this) {
-        is These.This -> thiz
-        is These.That -> that
-        is These.Both -> f(thiz, that)
+        is These.First -> value
+        is These.Second -> value
+        is These.Both -> f(first, second)
     }
 
-/** Returns the [These.This] [value][These.This.thiz] present in this [These] as a [Maybe]. */
-fun <A> These<A, *>.maybeThis(): Maybe<A> =
+/** Returns the [These.First] [value][These.First.value] present in this [These] as a [Maybe]. */
+fun <A> These<A, *>.maybeFirst(): Maybe<A> =
     when (this) {
-        is These.Both -> just(thiz)
-        is These.That -> none
-        is These.This -> just(thiz)
+        is These.Both -> Maybe.present(first)
+        is These.Second -> Maybe.absent
+        is These.First -> Maybe.present(value)
     }
 
 /**
- * Returns the [These.This] [value][These.This.thiz] present in this [These], or `null` if not
+ * Returns the [These.First] [value][These.First.value] present in this [These], or `null` if not
  * present.
  */
-fun <A : Any> These<A, *>.thisOrNull(): A? =
+fun <A : Any> These<A, *>.firstOrNull(): A? =
     when (this) {
-        is These.Both -> thiz
-        is These.That -> null
-        is These.This -> thiz
+        is These.Both -> first
+        is These.Second -> null
+        is These.First -> value
     }
 
-/** Returns the [These.That] [value][These.That.that] present in this [These] as a [Maybe]. */
-fun <A> These<*, A>.maybeThat(): Maybe<A> =
+/** Returns the [These.Second] [value][These.Second.value] present in this [These] as a [Maybe]. */
+fun <A> These<*, A>.maybeSecond(): Maybe<A> =
     when (this) {
-        is These.Both -> just(that)
-        is These.That -> just(that)
-        is These.This -> none
+        is These.Both -> Maybe.present(second)
+        is These.Second -> Maybe.present(value)
+        is These.First -> Maybe.absent
     }
 
 /**
- * Returns the [These.That] [value][These.That.that] present in this [These], or `null` if not
+ * Returns the [These.Second] [value][These.Second.value] present in this [These], or `null` if not
  * present.
  */
-fun <A : Any> These<*, A>.thatOrNull(): A? =
+fun <A : Any> These<*, A>.secondOrNull(): A? =
     when (this) {
-        is These.Both -> that
-        is These.That -> that
-        is These.This -> null
+        is These.Both -> second
+        is These.Second -> value
+        is These.First -> null
     }
 
 /** Returns [These.Both] values present in this [These] as a [Maybe]. */
 fun <A, B> These<A, B>.maybeBoth(): Maybe<Pair<A, B>> =
     when (this) {
-        is These.Both -> just(thiz to that)
-        else -> none
+        is These.Both -> Maybe.present(first to second)
+        else -> Maybe.absent
     }
 
-/** Returns a [These] containing [thiz] and/or [that] if they are present. */
-fun <A, B> these(thiz: Maybe<A>, that: Maybe<B>): Maybe<These<A, B>> =
-    when (thiz) {
-        is Just ->
-            just(
-                when (that) {
-                    is Just -> These.both(thiz.value, that.value)
-                    else -> These.thiz(thiz.value)
+/** Returns a [These] containing [first] and/or [second] if they are present. */
+fun <A, B> these(first: Maybe<A>, second: Maybe<B>): Maybe<These<A, B>> =
+    when (first) {
+        is Present ->
+            Maybe.present(
+                when (second) {
+                    is Present -> These.both(first.value, second.value)
+                    else -> These.first(first.value)
                 }
             )
+
         else ->
-            when (that) {
-                is Just -> just(These.that(that.value))
-                else -> none
+            when (second) {
+                is Present -> Maybe.present(These.second(second.value))
+                else -> Maybe.absent
             }
     }
 
 /**
- * Returns a [These] containing [thiz] and/or [that] if they are non-null, or `null` if both are
+ * Returns a [These] containing [first] and/or [second] if they are non-null, or `null` if both are
  * `null`.
  */
-fun <A : Any, B : Any> theseNull(thiz: A?, that: B?): These<A, B>? =
-    thiz?.let { that?.let { These.both(thiz, that) } ?: These.thiz(thiz) }
-        ?: that?.let { These.that(that) }
+fun <A : Any, B : Any> theseNotNull(first: A?, second: B?): These<A, B>? =
+    first?.let { second?.let { These.both(first, second) } ?: These.first(first) }
+        ?: second?.let { These.second(second) }
 
 /**
- * Returns two maps, with [Pair.first] containing all [These.This] values and [Pair.second]
- * containing all [These.That] values.
+ * Returns two maps, with [Pair.first] containing all [These.First] values and [Pair.second]
+ * containing all [These.Second] values.
  *
  * If the value is [These.Both], then the associated key with appear in both output maps, bound to
- * [These.Both.thiz] and [These.Both.that] in each respective output.
+ * [These.Both.first] and [These.Both.second] in each respective output.
  */
 fun <K, A, B> Map<K, These<A, B>>.partitionThese(): Pair<Map<K, A>, Map<K, B>> {
     val a = mutableMapOf<K, A>()
@@ -135,14 +136,14 @@
     for ((k, t) in this) {
         when (t) {
             is These.Both -> {
-                a[k] = t.thiz
-                b[k] = t.that
+                a[k] = t.first
+                b[k] = t.second
             }
-            is These.That -> {
-                b[k] = t.that
+            is These.Second -> {
+                b[k] = t.value
             }
-            is These.This -> {
-                a[k] = t.thiz
+            is These.First -> {
+                a[k] = t.value
             }
         }
     }
diff --git a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosSamples.kt b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosSamples.kt
new file mode 100644
index 0000000..88a5b7a
--- /dev/null
+++ b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosSamples.kt
@@ -0,0 +1,774 @@
+/*
+ * Copyright (C) 2025 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 com.android.systemui.kairos
+
+import com.android.systemui.kairos.util.MapPatch
+import com.android.systemui.kairos.util.These
+import com.android.systemui.kairos.util.maybeOf
+import com.android.systemui.kairos.util.toMaybe
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestDispatcher
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class KairosSamples {
+
+    @Test fun test_mapMaybe() = runSample { mapMaybe() }
+
+    fun BuildScope.mapMaybe() {
+        val emitter = MutableEvents<String>()
+        val ints = emitter.mapMaybe { it.toIntOrNull().toMaybe() }
+
+        var observedInput: String? = null
+        emitter.observe { observedInput = it }
+
+        var observedInt: Int? = null
+        ints.observe { observedInt = it }
+
+        launchEffect {
+            // parse succeeds
+            emitter.emit("6")
+            assertEquals(observedInput, "6")
+            assertEquals(observedInt, 6)
+
+            // parse fails
+            emitter.emit("foo")
+            assertEquals(observedInput, "foo")
+            assertEquals(observedInt, 6)
+
+            // parse succeeds
+            emitter.emit("500")
+            assertEquals(observedInput, "500")
+            assertEquals(observedInt, 500)
+        }
+    }
+
+    @Test fun test_mapCheap() = runSample { mapCheap() }
+
+    fun BuildScope.mapCheap() {
+        val emitter = MutableEvents<Int>()
+
+        var invocationCount = 0
+        val squared =
+            emitter.mapCheap {
+                invocationCount++
+                it * it
+            }
+
+        var observedSquare: Int? = null
+        squared.observe { observedSquare = it }
+
+        launchEffect {
+            emitter.emit(10)
+            assertTrue(invocationCount >= 1)
+            assertEquals(observedSquare, 100)
+
+            emitter.emit(2)
+            assertTrue(invocationCount >= 2)
+            assertEquals(observedSquare, 4)
+        }
+    }
+
+    @Test fun test_mapEvents() = runSample { mapEvents() }
+
+    fun BuildScope.mapEvents() {
+        val emitter = MutableEvents<Int>()
+
+        val squared = emitter.map { it * it }
+
+        var observedSquare: Int? = null
+        squared.observe { observedSquare = it }
+
+        launchEffect {
+            emitter.emit(10)
+            assertEquals(observedSquare, 100)
+
+            emitter.emit(2)
+            assertEquals(observedSquare, 4)
+        }
+    }
+
+    @Test fun test_eventsLoop() = runSample { eventsLoop() }
+
+    fun BuildScope.eventsLoop() {
+        val emitter = MutableEvents<Unit>()
+        var newCount: Events<Int> by EventsLoop()
+        val count = newCount.holdState(0)
+        newCount = emitter.map { count.sample() + 1 }
+
+        var observedCount = 0
+        count.observe { observedCount = it }
+
+        launchEffect {
+            emitter.emit(Unit)
+            assertEquals(observedCount, expected = 1)
+
+            emitter.emit(Unit)
+            assertEquals(observedCount, expected = 2)
+        }
+    }
+
+    @Test fun test_stateLoop() = runSample { stateLoop() }
+
+    fun BuildScope.stateLoop() {
+        val emitter = MutableEvents<Unit>()
+        var count: State<Int> by StateLoop()
+        count = emitter.map { count.sample() + 1 }.holdState(0)
+
+        var observedCount = 0
+        count.observe { observedCount = it }
+
+        launchEffect {
+            emitter.emit(Unit)
+            assertEquals(observedCount, expected = 1)
+
+            emitter.emit(Unit)
+            assertEquals(observedCount, expected = 2)
+        }
+    }
+
+    @Test fun test_changes() = runSample { changes() }
+
+    fun BuildScope.changes() {
+        val emitter = MutableEvents<Int>()
+        val state = emitter.holdState(0)
+
+        var numEmissions = 0
+        emitter.observe { numEmissions++ }
+
+        var observedState = 0
+        var numChangeEmissions = 0
+        state.changes.observe {
+            observedState = it
+            numChangeEmissions++
+        }
+
+        launchEffect {
+            emitter.emit(0)
+            assertEquals(numEmissions, expected = 1)
+            assertEquals(numChangeEmissions, expected = 0)
+            assertEquals(observedState, expected = 0)
+
+            emitter.emit(5)
+            assertEquals(numEmissions, expected = 2)
+            assertEquals(numChangeEmissions, expected = 1)
+            assertEquals(observedState, expected = 5)
+
+            emitter.emit(3)
+            assertEquals(numEmissions, expected = 3)
+            assertEquals(numChangeEmissions, expected = 2)
+            assertEquals(observedState, expected = 3)
+
+            emitter.emit(3)
+            assertEquals(numEmissions, expected = 4)
+            assertEquals(numChangeEmissions, expected = 2)
+            assertEquals(observedState, expected = 3)
+
+            emitter.emit(5)
+            assertEquals(numEmissions, expected = 5)
+            assertEquals(numChangeEmissions, expected = 3)
+            assertEquals(observedState, expected = 5)
+        }
+    }
+
+    @Test fun test_partitionThese() = runSample { partitionThese() }
+
+    fun BuildScope.partitionThese() {
+        val emitter = MutableEvents<These<Int, String>>()
+        val (lefts, rights) = emitter.partitionThese()
+
+        var observedLeft: Int? = null
+        lefts.observe { observedLeft = it }
+
+        var observedRight: String? = null
+        rights.observe { observedRight = it }
+
+        launchEffect {
+            emitter.emit(These.first(10))
+            assertEquals(observedLeft, 10)
+            assertEquals(observedRight, null)
+
+            emitter.emit(These.both(2, "foo"))
+            assertEquals(observedLeft, 2)
+            assertEquals(observedRight, "foo")
+
+            emitter.emit(These.second("bar"))
+            assertEquals(observedLeft, 2)
+            assertEquals(observedRight, "bar")
+        }
+    }
+
+    @Test fun test_merge() = runSample { merge() }
+
+    fun BuildScope.merge() {
+        val emitter = MutableEvents<Int>()
+        val fizz = emitter.mapNotNull { if (it % 3 == 0) "Fizz" else null }
+        val buzz = emitter.mapNotNull { if (it % 5 == 0) "Buzz" else null }
+        val fizzbuzz = fizz.mergeWith(buzz) { _, _ -> "Fizz Buzz" }
+        val output = mergeLeft(fizzbuzz, emitter.mapCheap { it.toString() })
+
+        var observedOutput: String? = null
+        output.observe { observedOutput = it }
+
+        launchEffect {
+            emitter.emit(1)
+            assertEquals(observedOutput, "1")
+            emitter.emit(2)
+            assertEquals(observedOutput, "2")
+            emitter.emit(3)
+            assertEquals(observedOutput, "Fizz")
+            emitter.emit(4)
+            assertEquals(observedOutput, "4")
+            emitter.emit(5)
+            assertEquals(observedOutput, "Buzz")
+            emitter.emit(6)
+            assertEquals(observedOutput, "Fizz")
+            emitter.emit(15)
+            assertEquals(observedOutput, "Fizz Buzz")
+        }
+    }
+
+    @Test fun test_groupByKey() = runSample { groupByKey() }
+
+    fun BuildScope.groupByKey() {
+        val emitter = MutableEvents<Map<String, Int>>()
+        val grouped = emitter.groupByKey()
+        val groupA = grouped["A"]
+        val groupB = grouped["B"]
+
+        var numEmissions = 0
+        emitter.observe { numEmissions++ }
+
+        var observedA: Int? = null
+        groupA.observe { observedA = it }
+
+        var observedB: Int? = null
+        groupB.observe { observedB = it }
+
+        launchEffect {
+            // emit to group A
+            emitter.emit(mapOf("A" to 3))
+            assertEquals(numEmissions, 1)
+            assertEquals(observedA, 3)
+            assertEquals(observedB, null)
+
+            // emit to groups B and C, even though there are no observers of C
+            emitter.emit(mapOf("B" to 9, "C" to 100))
+            assertEquals(numEmissions, 2)
+            assertEquals(observedA, 3)
+            assertEquals(observedB, 9)
+
+            // emit to groups A and B
+            emitter.emit(mapOf("B" to 6, "A" to 14))
+            assertEquals(numEmissions, 3)
+            assertEquals(observedA, 14)
+            assertEquals(observedB, 6)
+
+            // emit to group with no listeners
+            emitter.emit(mapOf("Q" to -66))
+            assertEquals(numEmissions, 4)
+            assertEquals(observedA, 14)
+            assertEquals(observedB, 6)
+
+            // no-op emission
+            emitter.emit(emptyMap())
+            assertEquals(numEmissions, 5)
+            assertEquals(observedA, 14)
+            assertEquals(observedB, 6)
+        }
+    }
+
+    @Test fun test_switchEvents() = runSample { switchEvents() }
+
+    fun BuildScope.switchEvents() {
+        val negator = MutableEvents<Unit>()
+        val emitter = MutableEvents<Int>()
+        val negate = negator.foldState(false) { _, negate -> !negate }
+        val output =
+            negate.map { negate -> if (negate) emitter.map { it * -1 } else emitter }.switchEvents()
+
+        var observed: Int? = null
+        output.observe { observed = it }
+
+        launchEffect {
+            // emit like normal
+            emitter.emit(10)
+            assertEquals(observed, 10)
+
+            // enable negation
+            observed = null
+            negator.emit(Unit)
+            assertEquals(observed, null)
+
+            emitter.emit(99)
+            assertEquals(observed, -99)
+
+            // disable negation
+            observed = null
+            negator.emit(Unit)
+            emitter.emit(7)
+            assertEquals(observed, 7)
+        }
+    }
+
+    @Test fun test_switchEventsPromptly() = runSample { switchEventsPromptly() }
+
+    fun BuildScope.switchEventsPromptly() {
+        val emitter = MutableEvents<Int>()
+        val enabled = emitter.map { it > 10 }.holdState(false)
+        val switchedIn = enabled.map { enabled -> if (enabled) emitter else emptyEvents }
+        val deferredSwitch = switchedIn.switchEvents()
+        val promptSwitch = switchedIn.switchEventsPromptly()
+
+        var observedDeferred: Int? = null
+        deferredSwitch.observe { observedDeferred = it }
+
+        var observedPrompt: Int? = null
+        promptSwitch.observe { observedPrompt = it }
+
+        launchEffect {
+            emitter.emit(3)
+            assertEquals(observedDeferred, null)
+            assertEquals(observedPrompt, null)
+
+            emitter.emit(20)
+            assertEquals(observedDeferred, null)
+            assertEquals(observedPrompt, 20)
+
+            emitter.emit(30)
+            assertEquals(observedDeferred, 30)
+            assertEquals(observedPrompt, 30)
+
+            emitter.emit(8)
+            assertEquals(observedDeferred, 8)
+            assertEquals(observedPrompt, 8)
+
+            emitter.emit(1)
+            assertEquals(observedDeferred, 8)
+            assertEquals(observedPrompt, 8)
+        }
+    }
+
+    @Test fun test_sampleTransactional() = runSample { sampleTransactional() }
+
+    fun BuildScope.sampleTransactional() {
+        var store = 0
+        val transactional = transactionally { store++ }
+
+        effect {
+            assertEquals(store, 0)
+            assertEquals(transactional.sample(), 0)
+            assertEquals(store, 1)
+            assertEquals(transactional.sample(), 0)
+            assertEquals(store, 1)
+        }
+    }
+
+    @Test fun test_states() = runSample { states() }
+
+    fun BuildScope.states() {
+        val constantState = stateOf(10)
+        effect { assertEquals(constantState.sample(), 10) }
+
+        val mappedConstantState: State<Int> = constantState.map { it * 2 }
+        effect { assertEquals(mappedConstantState.sample(), 20) }
+
+        val emitter = MutableEvents<Int>()
+        val heldState: State<Int?> = emitter.holdState(null)
+        effect { assertEquals(heldState.sample(), null) }
+
+        var observed: Int? = null
+        var wasObserved = false
+        heldState.observe {
+            observed = it
+            wasObserved = true
+        }
+        launchEffect {
+            assertTrue(wasObserved)
+            emitter.emit(4)
+            assertEquals(observed, 4)
+        }
+
+        val combinedStates: State<Pair<Int, Int?>> =
+            combine(mappedConstantState, heldState) { a, b -> Pair(a, b) }
+
+        effect { assertEquals(combinedStates.sample(), 20 to null) }
+
+        var observedPair: Pair<Int, Int?>? = null
+        combinedStates.observe { observedPair = it }
+        launchEffect {
+            emitter.emit(12)
+            assertEquals(observedPair, 20 to 12)
+        }
+    }
+
+    @Test fun test_holdState() = runSample { holdState() }
+
+    fun BuildScope.holdState() {
+        val emitter = MutableEvents<Int>()
+        val heldState: State<Int?> = emitter.holdState(null)
+        effect { assertEquals(heldState.sample(), null) }
+
+        var observed: Int? = null
+        var wasObserved = false
+        heldState.observe {
+            observed = it
+            wasObserved = true
+        }
+        launchEffect {
+            // observation of the initial state took place immediately
+            assertTrue(wasObserved)
+
+            // state changes are also observed
+            emitter.emit(4)
+            assertEquals(observed, 4)
+
+            emitter.emit(20)
+            assertEquals(observed, 20)
+        }
+    }
+
+    @Test fun test_mapState() = runSample { mapState() }
+
+    fun BuildScope.mapState() {
+        val emitter = MutableEvents<Int>()
+        val held: State<Int> = emitter.holdState(0)
+        val squared: State<Int> = held.map { it * it }
+
+        var observed: Int? = null
+        squared.observe { observed = it }
+
+        launchEffect {
+            assertEquals(observed, 0)
+
+            emitter.emit(10)
+            assertEquals(observed, 100)
+        }
+    }
+
+    @Test fun test_combineState() = runSample { combineState() }
+
+    fun BuildScope.combineState() {
+        val emitter = MutableEvents<Int>()
+        val state = emitter.holdState(0)
+        val squared = state.map { it * it }
+        val negated = state.map { -it }
+        val combined = squared.combine(negated) { a, b -> Pair(a, b) }
+
+        val observed = mutableListOf<Pair<Int, Int>>()
+        combined.observe { observed.add(it) }
+
+        launchEffect {
+            emitter.emit(10)
+            emitter.emit(20)
+            emitter.emit(3)
+
+            assertEquals(observed, listOf(0 to 0, 100 to -10, 400 to -20, 9 to -3))
+        }
+    }
+
+    @Test fun test_flatMap() = runSample { flatMap() }
+
+    fun BuildScope.flatMap() {
+        val toggler = MutableEvents<Unit>()
+        val firstEmitter = MutableEvents<Unit>()
+        val secondEmitter = MutableEvents<Unit>()
+
+        val firstCount: State<Int> = firstEmitter.foldState(0) { _, count -> count + 1 }
+        val secondCount: State<Int> = secondEmitter.foldState(0) { _, count -> count + 1 }
+        val toggleState: State<Boolean> = toggler.foldState(true) { _, state -> !state }
+
+        val activeCount: State<Int> =
+            toggleState.flatMap { b -> if (b) firstCount else secondCount }
+
+        var observed: Int? = null
+        activeCount.observe { observed = it }
+
+        launchEffect {
+            assertEquals(observed, 0)
+
+            firstEmitter.emit(Unit)
+            assertEquals(observed, 1)
+
+            secondEmitter.emit(Unit)
+            assertEquals(observed, 1)
+
+            secondEmitter.emit(Unit)
+            assertEquals(observed, 1)
+
+            toggler.emit(Unit)
+            assertEquals(observed, 2)
+
+            toggler.emit(Unit)
+            assertEquals(observed, 1)
+        }
+    }
+
+    @Test fun test_incrementals() = runSample { incrementals() }
+
+    fun BuildScope.incrementals() {
+        val patchEmitter = MutableEvents<MapPatch<String, Int>>()
+        val incremental: Incremental<String, Int> = patchEmitter.foldStateMapIncrementally()
+        val squared = incremental.mapValues { (key, value) -> value * value }
+
+        var observedUpdate: MapPatch<String, Int>? = null
+        squared.updates.observe { observedUpdate = it }
+
+        var observedState: Map<String, Int>? = null
+        squared.observe { observedState = it }
+
+        launchEffect {
+            assertEquals(observedState, emptyMap())
+            assertEquals(observedUpdate, null)
+
+            // add entry: A => 10
+            patchEmitter.emit(mapOf("A" to maybeOf(10)))
+            assertEquals(observedState, mapOf("A" to 100))
+            assertEquals(observedUpdate, mapOf("A" to maybeOf(100)))
+
+            // update entry: A => 5
+            // add entry: B => 6
+            patchEmitter.emit(mapOf("A" to maybeOf(5), "B" to maybeOf(6)))
+            assertEquals(observedState, mapOf("A" to 25, "B" to 36))
+            assertEquals(observedUpdate, mapOf("A" to maybeOf(25), "B" to maybeOf(36)))
+
+            // remove entry: A
+            // add entry: C => 9
+            // remove non-existent entry: F
+            patchEmitter.emit(mapOf("A" to maybeOf(), "C" to maybeOf(9), "F" to maybeOf()))
+            assertEquals(observedState, mapOf("B" to 36, "C" to 81))
+            // non-existent entry is filtered from the update
+            assertEquals(observedUpdate, mapOf("A" to maybeOf(), "C" to maybeOf(81)))
+        }
+    }
+
+    @Test fun test_mergeEventsIncrementally() = runSample(block = mergeEventsIncrementally())
+
+    fun mergeEventsIncrementally(): BuildSpec<Unit> = buildSpec {
+        val patchEmitter = MutableEvents<MapPatch<String, Events<Int>>>()
+        val incremental: Incremental<String, Events<Int>> = patchEmitter.foldStateMapIncrementally()
+        val merged: Events<Map<String, Int>> = incremental.mergeEventsIncrementally()
+
+        var observed: Map<String, Int>? = null
+        merged.observe { observed = it }
+
+        launchEffect {
+            // add events entry: A
+            val emitterA = MutableEvents<Int>()
+            patchEmitter.emit(mapOf("A" to maybeOf(emitterA)))
+
+            emitterA.emit(100)
+            assertEquals(observed, mapOf("A" to 100))
+
+            // add events entry: B
+            val emitterB = MutableEvents<Int>()
+            patchEmitter.emit(mapOf("B" to maybeOf(emitterB)))
+
+            // merged emits from both A and B
+            emitterB.emit(5)
+            assertEquals(observed, mapOf("B" to 5))
+
+            emitterA.emit(20)
+            assertEquals(observed, mapOf("A" to 20))
+
+            // remove entry: A
+            patchEmitter.emit(mapOf("A" to maybeOf()))
+            emitterA.emit(0)
+            // event is not emitted now that A has been removed
+            assertEquals(observed, mapOf("A" to 20))
+
+            // but B still works
+            emitterB.emit(3)
+            assertEquals(observed, mapOf("B" to 3))
+        }
+    }
+
+    @Test
+    fun test_mergeEventsIncrementallyPromptly() =
+        runSample(block = mergeEventsIncrementallyPromptly())
+
+    fun mergeEventsIncrementallyPromptly(): BuildSpec<Unit> = buildSpec {
+        val patchEmitter = MutableEvents<MapPatch<String, Events<Int>>>()
+        val incremental: Incremental<String, Events<Int>> = patchEmitter.foldStateMapIncrementally()
+        val deferredMerge: Events<Map<String, Int>> = incremental.mergeEventsIncrementally()
+        val promptMerge: Events<Map<String, Int>> = incremental.mergeEventsIncrementallyPromptly()
+
+        var observedDeferred: Map<String, Int>? = null
+        deferredMerge.observe { observedDeferred = it }
+
+        var observedPrompt: Map<String, Int>? = null
+        promptMerge.observe { observedPrompt = it }
+
+        launchEffect {
+            val emitterA = MutableEvents<Int>()
+            patchEmitter.emit(mapOf("A" to maybeOf(emitterA)))
+
+            emitterA.emit(100)
+            assertEquals(observedDeferred, mapOf("A" to 100))
+            assertEquals(observedPrompt, mapOf("A" to 100))
+
+            val emitterB = patchEmitter.map { 5 }
+            patchEmitter.emit(mapOf("B" to maybeOf(emitterB)))
+
+            assertEquals(observedDeferred, mapOf("A" to 100))
+            assertEquals(observedPrompt, mapOf("B" to 5))
+        }
+    }
+
+    @Test fun test_applyLatestStateful() = runSample(block = applyLatestStateful())
+
+    fun applyLatestStateful(): BuildSpec<Unit> = buildSpec {
+        val reset = MutableEvents<Unit>()
+        val emitter = MutableEvents<Unit>()
+        val stateEvents: Events<State<Int>> =
+            reset
+                .map { statefully { emitter.foldState(0) { _, count -> count + 1 } } }
+                .applyLatestStateful()
+        val activeState: State<State<Int>?> = stateEvents.holdState(null)
+
+        launchEffect {
+            // nothing is active yet
+            kairosNetwork.transact { assertEquals(activeState.sample(), null) }
+
+            // activate the counter
+            reset.emit(Unit)
+            val firstState =
+                kairosNetwork.transact {
+                    assertEquals(activeState.sample()?.sample(), 0)
+                    activeState.sample()!!
+                }
+
+            // emit twice
+            emitter.emit(Unit)
+            emitter.emit(Unit)
+            kairosNetwork.transact { assertEquals(firstState.sample(), 2) }
+
+            // start a new counter, disabling the old one
+            reset.emit(Unit)
+            val secondState =
+                kairosNetwork.transact {
+                    assertEquals(activeState.sample()?.sample(), 0)
+                    activeState.sample()!!
+                }
+            kairosNetwork.transact { assertEquals(firstState.sample(), 2) }
+
+            // emit: the new counter updates, but the old one does not
+            emitter.emit(Unit)
+            kairosNetwork.transact { assertEquals(secondState.sample(), 1) }
+            kairosNetwork.transact { assertEquals(firstState.sample(), 2) }
+        }
+    }
+
+    @Test fun test_applyLatestStatefulForKey() = runSample(block = applyLatestStatefulForKey())
+
+    fun applyLatestStatefulForKey(): BuildSpec<Unit> = buildSpec {
+        val reset = MutableEvents<String>()
+        val emitter = MutableEvents<String>()
+        val stateEvents: Events<MapPatch<String, State<Int>>> =
+            reset
+                .map { key ->
+                    mapOf(
+                        key to
+                            maybeOf(
+                                statefully {
+                                    emitter
+                                        .filter { it == key }
+                                        .foldState(0) { _, count -> count + 1 }
+                                }
+                            )
+                    )
+                }
+                .applyLatestStatefulForKey()
+        val activeStatesByKey: Incremental<String, State<Int>> =
+            stateEvents.foldStateMapIncrementally(emptyMap())
+
+        launchEffect {
+            // nothing is active yet
+            kairosNetwork.transact { assertEquals(activeStatesByKey.sample(), emptyMap()) }
+
+            // activate a new entry A
+            reset.emit("A")
+            val firstStateA =
+                kairosNetwork.transact {
+                    val stateMap: Map<String, State<Int>> = activeStatesByKey.sample()
+                    assertEquals(stateMap.keys, setOf("A"))
+                    stateMap.getValue("A").also { assertEquals(it.sample(), 0) }
+                }
+
+            // emit twice to A
+            emitter.emit("A")
+            emitter.emit("A")
+            kairosNetwork.transact { assertEquals(firstStateA.sample(), 2) }
+
+            // active a new entry B
+            reset.emit("B")
+            val firstStateB =
+                kairosNetwork.transact {
+                    val stateMap: Map<String, State<Int>> = activeStatesByKey.sample()
+                    assertEquals(stateMap.keys, setOf("A", "B"))
+                    stateMap.getValue("B").also {
+                        assertEquals(it.sample(), 0)
+                        assertEquals(firstStateA.sample(), 2)
+                    }
+                }
+
+            // emit once to B
+            emitter.emit("B")
+            kairosNetwork.transact {
+                assertEquals(firstStateA.sample(), 2)
+                assertEquals(firstStateB.sample(), 1)
+            }
+
+            // activate a new entry for A, disabling the old entry
+            reset.emit("A")
+            val secondStateA =
+                kairosNetwork.transact {
+                    val stateMap: Map<String, State<Int>> = activeStatesByKey.sample()
+                    assertEquals(stateMap.keys, setOf("A", "B"))
+                    stateMap.getValue("A").also {
+                        assertEquals(it.sample(), 0)
+                        assertEquals(firstStateB.sample(), 1)
+                    }
+                }
+
+            // emit to A: the new A state updates, but the old one does not
+            emitter.emit("A")
+            kairosNetwork.transact {
+                assertEquals(firstStateA.sample(), 2)
+                assertEquals(secondStateA.sample(), 1)
+            }
+        }
+    }
+
+    private fun runSample(
+        dispatcher: TestDispatcher = UnconfinedTestDispatcher(),
+        block: BuildScope.() -> Unit,
+    ) {
+        runTest(dispatcher, timeout = 1.seconds) {
+            val kairosNetwork = backgroundScope.launchKairosNetwork()
+            backgroundScope.launch { kairosNetwork.activateSpec { block() } }
+        }
+    }
+}
+
+private fun <T> assertEquals(actual: T, expected: T) = Assert.assertEquals(expected, actual)
diff --git a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
index 150b462..ffe6e95 100644
--- a/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
+++ b/packages/SystemUI/utils/kairos/test/com/android/systemui/kairos/KairosTests.kt
@@ -1,14 +1,12 @@
 package com.android.systemui.kairos
 
 import com.android.systemui.kairos.util.Either
-import com.android.systemui.kairos.util.Either.Left
-import com.android.systemui.kairos.util.Either.Right
+import com.android.systemui.kairos.util.Either.First
+import com.android.systemui.kairos.util.Either.Second
 import com.android.systemui.kairos.util.Maybe
-import com.android.systemui.kairos.util.Maybe.None
-import com.android.systemui.kairos.util.just
+import com.android.systemui.kairos.util.Maybe.Absent
 import com.android.systemui.kairos.util.map
 import com.android.systemui.kairos.util.maybe
-import com.android.systemui.kairos.util.none
 import kotlin.time.Duration
 import kotlin.time.Duration.Companion.seconds
 import kotlin.time.DurationUnit
@@ -142,7 +140,7 @@
 
                 // convert Eventss to States so that they can be combined
                 val combined =
-                    left.holdState("left" to 0).combineWith(right.holdState("right" to 0)) { l, r ->
+                    left.holdState("left" to 0).combine(right.holdState("right" to 0)) { l, r ->
                         l to r
                     }
                 combined.changes // get State changes
@@ -590,7 +588,7 @@
         intStopEmitter.emit(Unit) // intAH.complete()
         runCurrent()
 
-        // assertEquals(just(10), network.await())
+        // assertEquals(present(10), network.await())
     }
 
     @Test
@@ -692,12 +690,12 @@
             }
         runCurrent()
 
-        emitter.emit(Left(10))
+        emitter.emit(First(10))
         runCurrent()
 
         assertEquals(20, result.value)
 
-        emitter.emit(Right(30))
+        emitter.emit(Second(30))
         runCurrent()
 
         assertEquals(-30, result.value)
@@ -908,7 +906,7 @@
             activateSpecWithResult(network) {
                 val bA = updater.map { it * 2 }.holdState(0)
                 val bB = updater.holdState(0)
-                val combineD: State<Pair<Int, Int>> = bA.combineWith(bB) { a, b -> a to b }
+                val combineD: State<Pair<Int, Int>> = bA.combine(bB) { a, b -> a to b }
                 val sampleS = emitter.sample(combineD) { _, b -> b }
                 sampleS.nextDeferred()
             }
@@ -1142,16 +1140,13 @@
                                                     val eRemoved =
                                                         childChangeById
                                                             .eventsForKey(childId)
-                                                            .filter { it === None }
+                                                            .filter { it === Absent }
                                                             .onEach {
                                                                 println(
                                                                     "removing? (groupId=$groupId, childId=$childId)"
                                                                 )
                                                             }
-                                                            .nextOnly(
-                                                                name =
-                                                                    "eRemoved(groupId=$groupId, childId=$childId)"
-                                                            )
+                                                            .nextOnly()
 
                                                     val addChild: Events<Maybe<State<String>>> =
                                                         now.map { mChild }
@@ -1168,13 +1163,9 @@
                                                                     "removeChild (groupId=$groupId, childId=$childId)"
                                                                 )
                                                             }
-                                                            .map { none() }
+                                                            .map { Maybe.absent() }
 
-                                                    addChild.mergeWith(
-                                                        removeChild,
-                                                        name =
-                                                            "childUpdatesMerged(groupId=$groupId, childId=$childId)",
-                                                    ) { _, _ ->
+                                                    addChild.mergeWith(removeChild) { _, _ ->
                                                         error("unexpected coincidence")
                                                     }
                                                 }
@@ -1182,7 +1173,7 @@
                                         }
                                     val mergeIncrementally: Events<Map<Int, Maybe<State<String>>>> =
                                         map.onEach { println("merge patch: $it") }
-                                            .mergeIncrementallyPromptly(name = "mergeIncrementally")
+                                            .mergeEventsIncrementallyPromptly()
                                     mergeIncrementally
                                         .onEach { println("foldmap patch: $it") }
                                         .foldStateMapIncrementally()
@@ -1203,14 +1194,14 @@
         val emitter2 = network.mutableEvents<Map<Int, Maybe<StateFlow<String>>>>()
         println()
         println("init outer 0")
-        e.emit(mapOf(0 to just(emitter2.onEach { println("emitter2 emit: $it") })))
+        e.emit(mapOf(0 to Maybe.present(emitter2.onEach { println("emitter2 emit: $it") })))
         runCurrent()
 
         assertEquals(mapOf(0 to emptyMap()), state.value)
 
         println()
         println("init inner 10")
-        emitter2.emit(mapOf(10 to just(MutableStateFlow("(0, 10)"))))
+        emitter2.emit(mapOf(10 to Maybe.present(MutableStateFlow("(0, 10)"))))
         runCurrent()
 
         assertEquals(mapOf(0 to mapOf(10 to "(0, 10)")), state.value)
@@ -1218,19 +1209,19 @@
         // replace
         println()
         println("replace inner 10")
-        emitter2.emit(mapOf(10 to just(MutableStateFlow("(1, 10)"))))
+        emitter2.emit(mapOf(10 to Maybe.present(MutableStateFlow("(1, 10)"))))
         runCurrent()
 
         assertEquals(mapOf(0 to mapOf(10 to "(1, 10)")), state.value)
 
         // remove
-        emitter2.emit(mapOf(10 to none()))
+        emitter2.emit(mapOf(10 to Maybe.absent()))
         runCurrent()
 
         assertEquals(mapOf(0 to emptyMap()), state.value)
 
         // add again
-        emitter2.emit(mapOf(10 to just(MutableStateFlow("(2, 10)"))))
+        emitter2.emit(mapOf(10 to Maybe.present(MutableStateFlow("(2, 10)"))))
         runCurrent()
 
         assertEquals(mapOf(0 to mapOf(10 to "(2, 10)")), state.value)
@@ -1242,9 +1233,9 @@
         // batch update
         emitter2.emit(
             mapOf(
-                10 to none(),
-                11 to just(MutableStateFlow("(0, 11)")),
-                12 to just(MutableStateFlow("(0, 12)")),
+                10 to Maybe.absent(),
+                11 to Maybe.present(MutableStateFlow("(0, 11)")),
+                12 to Maybe.present(MutableStateFlow("(0, 12)")),
             )
         )
         runCurrent()
@@ -1278,7 +1269,7 @@
         }
 
         var outerCount = 0
-        val laseventss: StateFlow<Pair<StateFlow<Int?>, StateFlow<Int?>>> =
+        val lastEvent: StateFlow<Pair<StateFlow<Int?>, StateFlow<Int?>>> =
             flowOfFlows
                 .map { it.stateIn(backgroundScope, SharingStarted.Eagerly, null) }
                 .pairwise(MutableStateFlow(null))
@@ -1296,18 +1287,18 @@
 
         assertEquals(1, outerCount)
         //        assertEquals(1, incCount.subscriptionCount)
-        assertNull(laseventss.value.second.value)
+        assertNull(lastEvent.value.second.value)
 
         incCount.emit(Unit)
         runCurrent()
 
         println("checking")
-        assertEquals(1, laseventss.value.second.value)
+        assertEquals(1, lastEvent.value.second.value)
 
         incCount.emit(Unit)
         runCurrent()
 
-        assertEquals(2, laseventss.value.second.value)
+        assertEquals(2, lastEvent.value.second.value)
 
         newCount.emit(newFlow())
         runCurrent()
@@ -1315,9 +1306,9 @@
         runCurrent()
 
         // verify old flow is not getting updates
-        assertEquals(2, laseventss.value.first.value)
+        assertEquals(2, lastEvent.value.first.value)
         // but the new one is
-        assertEquals(1, laseventss.value.second.value)
+        assertEquals(1, lastEvent.value.second.value)
     }
 
     @Test
@@ -1326,7 +1317,7 @@
         var observedCount: Int? = null
         activateSpec(network) {
             val (c, j) = asyncScope { input.foldState(0) { _, x -> x + 1 } }
-            deferredBuildScopeAction { c.get().observe { observedCount = it } }
+            deferredBuildScopeAction { c.value.observe { observedCount = it } }
         }
         runCurrent()
         assertEquals(0, observedCount)
@@ -1385,7 +1376,7 @@
             activateSpec(network) {
                 val handle =
                     input.observe {
-                        effectCoroutineScope.launch {
+                        launch {
                             runningCount++
                             awaitClose { runningCount-- }
                         }
@@ -1420,7 +1411,7 @@
         val specJob =
             activateSpec(network) {
                 input.takeUntil(stopper).observe {
-                    effectCoroutineScope.launch {
+                    launch {
                         runningCount++
                         awaitClose { runningCount-- }
                     }
diff --git a/ravenwood/tests/bivalenttest/Android.bp b/ravenwood/tests/bivalenttest/Android.bp
index ac545df..c4086c5 100644
--- a/ravenwood/tests/bivalenttest/Android.bp
+++ b/ravenwood/tests/bivalenttest/Android.bp
@@ -40,6 +40,7 @@
 
         "junit-params",
         "platform-parametric-runner-lib",
+        "platform-compat-test-rules",
 
         // To make sure it won't cause VerifyError (b/324063814)
         "platformprotosnano",
diff --git a/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/compat/RavenwoodCompatFrameworkTest.kt b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/compat/RavenwoodCompatFrameworkTest.kt
index 882c91c..540b082 100644
--- a/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/compat/RavenwoodCompatFrameworkTest.kt
+++ b/ravenwood/tests/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/compat/RavenwoodCompatFrameworkTest.kt
@@ -16,31 +16,52 @@
 package com.android.ravenwoodtest.bivalenttest.compat
 
 import android.app.compat.CompatChanges
+import android.compat.testing.PlatformCompatChangeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.internal.ravenwood.RavenwoodEnvironment.CompatIdsForTest
-import org.junit.Assert
+import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges
+import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
 class RavenwoodCompatFrameworkTest {
+
+    @get:Rule
+    val compatRule = PlatformCompatChangeRule()
+
     @Test
     fun testEnabled() {
-        Assert.assertTrue(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_1))
+        assertTrue(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_1))
     }
 
     @Test
     fun testDisabled() {
-        Assert.assertFalse(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_2))
+        assertFalse(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_2))
     }
 
     @Test
     fun testEnabledAfterSForUApps() {
-        Assert.assertTrue(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_3))
+        assertTrue(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_3))
     }
 
     @Test
     fun testEnabledAfterUForUApps() {
-        Assert.assertFalse(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_4))
+        assertFalse(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_4))
+    }
+
+    @Test
+    @EnableCompatChanges(CompatIdsForTest.TEST_COMPAT_ID_5)
+    fun testEnableCompatChanges() {
+        assertTrue(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_5))
+    }
+
+    @Test
+    @DisableCompatChanges(CompatIdsForTest.TEST_COMPAT_ID_5)
+    fun testDisableCompatChanges() {
+        assertFalse(CompatChanges.isChangeEnabled(CompatIdsForTest.TEST_COMPAT_ID_5))
     }
 }
diff --git a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
index c196a09..f8315fe 100644
--- a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
@@ -30,6 +30,10 @@
 android.util.ArrayMap
 android.util.ArraySet
 android.util.AtomicFile
+android.util.AtomicFileOutputStream
+android.util.AtomicFileBufferedOutputStream
+android.util.AtomicFilePrintWriter
+android.util.AtomicFileBufferedPrintWriter
 android.util.BackupUtils
 android.util.Base64
 android.util.Base64DataException
diff --git a/services/accessibility/java/com/android/server/accessibility/AutoclickController.java b/services/accessibility/java/com/android/server/accessibility/AutoclickController.java
index a69ecec..e3d7062 100644
--- a/services/accessibility/java/com/android/server/accessibility/AutoclickController.java
+++ b/services/accessibility/java/com/android/server/accessibility/AutoclickController.java
@@ -18,6 +18,8 @@
 
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
 
+import static com.android.server.accessibility.AutoclickIndicatorView.SHOW_INDICATOR_DELAY_TIME;
+
 import android.accessibilityservice.AccessibilityTrace;
 import android.annotation.NonNull;
 import android.content.ContentResolver;
@@ -286,8 +288,6 @@
         }
 
         public void update() {
-            // TODO(b/383901288): update delay time once determined by UX.
-            long SHOW_INDICATOR_DELAY_TIME = 150;
             long scheduledShowIndicatorTime =
                     SystemClock.uptimeMillis() + SHOW_INDICATOR_DELAY_TIME;
             // If there already is a scheduled show indicator at time before the updated time, just
@@ -432,6 +432,10 @@
          */
         public void updateDelay(int delay) {
             mDelay = delay;
+
+            if (Flags.enableAutoclickIndicator() && mAutoclickIndicatorView != null) {
+                mAutoclickIndicatorView.setAnimationDuration(delay - SHOW_INDICATOR_DELAY_TIME);
+            }
         }
 
         /**
diff --git a/services/accessibility/java/com/android/server/accessibility/AutoclickIndicatorView.java b/services/accessibility/java/com/android/server/accessibility/AutoclickIndicatorView.java
index 54c31e5..816d8e45 100644
--- a/services/accessibility/java/com/android/server/accessibility/AutoclickIndicatorView.java
+++ b/services/accessibility/java/com/android/server/accessibility/AutoclickIndicatorView.java
@@ -16,25 +16,43 @@
 
 package com.android.server.accessibility;
 
+import android.animation.ValueAnimator;
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Paint;
+import android.graphics.RectF;
 import android.util.DisplayMetrics;
 import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.LinearInterpolator;
 
 // A visual indicator for the autoclick feature.
 public class AutoclickIndicatorView extends View {
     private static final String TAG = AutoclickIndicatorView.class.getSimpleName();
 
+    // TODO(b/383901288): update delay time once determined by UX.
+    static final int SHOW_INDICATOR_DELAY_TIME = 150;
+
+    static final int MINIMAL_ANIMATION_DURATION = 50;
+
     // TODO(b/383901288): allow users to customize the indicator area.
     static final float RADIUS = 50;
 
     private final Paint mPaint;
 
+    private final ValueAnimator mAnimator;
+
+    private final RectF mRingRect;
+
     // x and y coordinates of the visual indicator.
     private float mX;
     private float mY;
 
+    // Current sweep angle of the animated ring.
+    private float mSweepAngle;
+
+    private int mAnimationDuration = AccessibilityManager.AUTOCLICK_DELAY_DEFAULT;
+
     // Status of whether the visual indicator should display or not.
     private boolean showIndicator = false;
 
@@ -46,6 +64,18 @@
         mPaint.setARGB(255, 52, 103, 235);
         mPaint.setStyle(Paint.Style.STROKE);
         mPaint.setStrokeWidth(10);
+
+        mAnimator = ValueAnimator.ofFloat(0, 360);
+        mAnimator.setDuration(mAnimationDuration);
+        mAnimator.setInterpolator(new LinearInterpolator());
+        mAnimator.addUpdateListener(
+                animation -> {
+                    mSweepAngle = (float) animation.getAnimatedValue();
+                    // Redraw the view with the updated angle.
+                    invalidate();
+                });
+
+        mRingRect = new RectF();
     }
 
     @Override
@@ -53,7 +83,12 @@
         super.onDraw(canvas);
 
         if (showIndicator) {
-            canvas.drawCircle(mX, mY, RADIUS, mPaint);
+            mRingRect.set(
+                    /* left= */ mX - RADIUS,
+                    /* top= */ mY - RADIUS,
+                    /* right= */ mX + RADIUS,
+                    /* bottom= */ mY + RADIUS);
+            canvas.drawArc(mRingRect, /* startAngle= */ -90, mSweepAngle, false, mPaint);
         }
     }
 
@@ -75,10 +110,17 @@
     public void redrawIndicator() {
         showIndicator = true;
         invalidate();
+        mAnimator.start();
     }
 
     public void clearIndicator() {
         showIndicator = false;
+        mAnimator.cancel();
         invalidate();
     }
+
+    public void setAnimationDuration(int duration) {
+        mAnimationDuration = Math.max(duration, MINIMAL_ANIMATION_DURATION);
+        mAnimator.setDuration(mAnimationDuration);
+    }
 }
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
index 1f3b316..aeb2f5e 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
@@ -176,7 +176,7 @@
     public VirtualDeviceManagerService(Context context) {
         super(context);
         mImpl = new VirtualDeviceManagerImpl();
-        mNativeImpl = Flags.enableNativeVdm() ? new VirtualDeviceManagerNativeImpl() : null;
+        mNativeImpl = new VirtualDeviceManagerNativeImpl();
         mLocalService = new LocalService();
     }
 
@@ -208,9 +208,7 @@
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
     public void onStart() {
         publishBinderService(Context.VIRTUAL_DEVICE_SERVICE, mImpl);
-        if (Flags.enableNativeVdm()) {
-            publishBinderService(VIRTUAL_DEVICE_NATIVE_SERVICE, mNativeImpl);
-        }
+        publishBinderService(VIRTUAL_DEVICE_NATIVE_SERVICE, mNativeImpl);
         publishLocalService(VirtualDeviceManagerInternal.class, mLocalService);
         ActivityTaskManagerInternal activityTaskManagerInternal = getLocalService(
                 ActivityTaskManagerInternal.class);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 41b4cbd..6cca7d1 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -8950,18 +8950,12 @@
         if (!mAm.mConstants.mFgsStartRestrictionCheckCallerTargetSdk) {
             return true; // In this case, we only check the service's target SDK level.
         }
-        final int callingUid;
-        if (Flags.newFgsRestrictionLogic()) {
-            // We always consider SYSTEM_UID to target S+, so just enable the restrictions.
-            if (actualCallingUid == Process.SYSTEM_UID) {
-                return true;
-            }
-            callingUid = actualCallingUid;
-        } else {
-            // Legacy logic used mRecentCallingUid.
-            callingUid = r.mRecentCallingUid;
+        // We always consider SYSTEM_UID to target S+, so just enable the restrictions.
+        if (actualCallingUid == Process.SYSTEM_UID) {
+            return true;
         }
-        if (!CompatChanges.isChangeEnabled(FGS_BG_START_RESTRICTION_CHANGE_ID, callingUid)) {
+        if (!CompatChanges.isChangeEnabled(FGS_BG_START_RESTRICTION_CHANGE_ID,
+                actualCallingUid)) {
             return false; // If the caller targets < S, then we still disable the restrictions.
         }
 
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 92d33c9..ca34a13 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -278,24 +278,21 @@
      * Whether to use the new "while-in-use permission" logic for FGS start
      */
     private boolean useNewWiuLogic_forStart() {
-        return Flags.newFgsRestrictionLogic() // This flag should only be set on V+
-                && CompatChanges.isChangeEnabled(USE_NEW_WIU_LOGIC_FOR_START, appInfo.uid);
+        return CompatChanges.isChangeEnabled(USE_NEW_WIU_LOGIC_FOR_START, appInfo.uid);
     }
 
     /**
      * Whether to use the new "while-in-use permission" logic for capabilities
      */
     private boolean useNewWiuLogic_forCapabilities() {
-        return Flags.newFgsRestrictionLogic() // This flag should only be set on V+
-                && CompatChanges.isChangeEnabled(USE_NEW_WIU_LOGIC_FOR_CAPABILITIES, appInfo.uid);
+        return CompatChanges.isChangeEnabled(USE_NEW_WIU_LOGIC_FOR_CAPABILITIES, appInfo.uid);
     }
 
     /**
      * Whether to use the new "FGS BG start exemption" logic.
      */
     private boolean useNewBfslLogic() {
-        return Flags.newFgsRestrictionLogic() // This flag should only be set on V+
-                && CompatChanges.isChangeEnabled(USE_NEW_BFSL_LOGIC, appInfo.uid);
+        return CompatChanges.isChangeEnabled(USE_NEW_BFSL_LOGIC, appInfo.uid);
     }
 
 
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index c31b9ef..ec74f60 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -160,6 +160,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
 /**
@@ -1920,8 +1921,14 @@
                 return false;
             }
 
-            mHandler.post(() -> startUserInternalOnHandler(userId, oldUserId, userStartMode,
-                    unlockListener, callingUid, callingPid));
+            final Runnable continueStartUserInternal = () -> continueStartUserInternal(userInfo,
+                    oldUserId, userStartMode, unlockListener, callingUid, callingPid);
+            if (foreground) {
+                mHandler.post(() -> dispatchOnBeforeUserSwitching(userId, () ->
+                        mHandler.post(continueStartUserInternal)));
+            } else {
+                continueStartUserInternal.run();
+            }
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
@@ -1929,11 +1936,11 @@
         return true;
     }
 
-    private void startUserInternalOnHandler(int userId, int oldUserId, int userStartMode,
+    private void continueStartUserInternal(UserInfo userInfo, int oldUserId, int userStartMode,
             IProgressListener unlockListener, int callingUid, int callingPid) {
         final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
         final boolean foreground = userStartMode == USER_START_MODE_FOREGROUND;
-        final UserInfo userInfo = getUserInfo(userId);
+        final int userId = userInfo.id;
 
         boolean needStart = false;
         boolean updateUmState = false;
@@ -1995,7 +2002,6 @@
             // it should be moved outside, but for now it's not as there are many calls to
             // external components here afterwards
             updateProfileRelatedCaches();
-            dispatchOnBeforeUserSwitching(userId);
             mInjector.getWindowManager().setCurrentUser(userId);
             mInjector.reportCurWakefulnessUsageEvent();
             // Once the internal notion of the active user has switched, we lock the device
@@ -2296,25 +2302,42 @@
         mUserSwitchObservers.finishBroadcast();
     }
 
-    private void dispatchOnBeforeUserSwitching(@UserIdInt int newUserId) {
+    private void dispatchOnBeforeUserSwitching(@UserIdInt int newUserId, Runnable onComplete) {
         final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
         t.traceBegin("dispatchOnBeforeUserSwitching-" + newUserId);
-        final int observerCount = mUserSwitchObservers.beginBroadcast();
-        for (int i = 0; i < observerCount; i++) {
-            final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i);
-            t.traceBegin("onBeforeUserSwitching-" + name);
+        final AtomicBoolean isFirst = new AtomicBoolean(true);
+        startTimeoutForOnBeforeUserSwitching(isFirst, onComplete);
+        informUserSwitchObservers((observer, callback) -> {
             try {
-                mUserSwitchObservers.getBroadcastItem(i).onBeforeUserSwitching(newUserId);
+                observer.onBeforeUserSwitching(newUserId, callback);
             } catch (RemoteException e) {
-                // Ignore
-            } finally {
-                t.traceEnd();
+                // ignore
             }
-        }
-        mUserSwitchObservers.finishBroadcast();
+        }, () -> {
+            if (isFirst.getAndSet(false)) {
+                onComplete.run();
+            }
+        }, "onBeforeUserSwitching");
         t.traceEnd();
     }
 
+    private void startTimeoutForOnBeforeUserSwitching(AtomicBoolean isFirst,
+            Runnable onComplete) {
+        final long timeout = getUserSwitchTimeoutMs();
+        mHandler.postDelayed(() -> {
+            if (isFirst.getAndSet(false)) {
+                String unresponsiveObservers;
+                synchronized (mLock) {
+                    unresponsiveObservers = String.join(", ", mCurWaitingUserSwitchCallbacks);
+                }
+                Slogf.e(TAG, "Timeout on dispatchOnBeforeUserSwitching. These UserSwitchObservers "
+                        + "did not respond in " + timeout + "ms: " + unresponsiveObservers + ".");
+                onComplete.run();
+            }
+        }, timeout);
+    }
+
+
     /** Called on handler thread */
     @VisibleForTesting
     void dispatchUserSwitchComplete(@UserIdInt int oldUserId, @UserIdInt int newUserId) {
@@ -2527,70 +2550,76 @@
         t.traceBegin("dispatchUserSwitch-" + oldUserId + "-to-" + newUserId);
 
         EventLog.writeEvent(EventLogTags.UC_DISPATCH_USER_SWITCH, oldUserId, newUserId);
-
-        final int observerCount = mUserSwitchObservers.beginBroadcast();
-        if (observerCount > 0) {
-            final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>();
-            synchronized (mLock) {
-                uss.switching = true;
-                mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks;
+        uss.switching = true;
+        informUserSwitchObservers((observer, callback) -> {
+            try {
+                observer.onUserSwitching(newUserId, callback);
+            } catch (RemoteException e) {
+                // ignore
             }
-            final AtomicInteger waitingCallbacksCount = new AtomicInteger(observerCount);
-            final long userSwitchTimeoutMs = getUserSwitchTimeoutMs();
-            final long dispatchStartedTime = SystemClock.elapsedRealtime();
-            for (int i = 0; i < observerCount; i++) {
-                final long dispatchStartedTimeForObserver = SystemClock.elapsedRealtime();
-                try {
-                    // Prepend with unique prefix to guarantee that keys are unique
-                    final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i);
-                    synchronized (mLock) {
-                        curWaitingUserSwitchCallbacks.add(name);
-                    }
-                    final IRemoteCallback callback = new IRemoteCallback.Stub() {
-                        @Override
-                        public void sendResult(Bundle data) throws RemoteException {
-                            asyncTraceEnd("onUserSwitching-" + name, newUserId);
-                            synchronized (mLock) {
-                                long delayForObserver = SystemClock.elapsedRealtime()
-                                        - dispatchStartedTimeForObserver;
-                                if (delayForObserver > LONG_USER_SWITCH_OBSERVER_WARNING_TIME_MS) {
-                                    Slogf.w(TAG, "User switch slowed down by observer " + name
-                                            + ": result took " + delayForObserver
-                                            + " ms to process.");
-                                }
-
-                                long totalDelay = SystemClock.elapsedRealtime()
-                                        - dispatchStartedTime;
-                                if (totalDelay > userSwitchTimeoutMs) {
-                                    Slogf.e(TAG, "User switch timeout: observer " + name
-                                            + "'s result was received " + totalDelay
-                                            + " ms after dispatchUserSwitch.");
-                                }
-
-                                curWaitingUserSwitchCallbacks.remove(name);
-                                // Continue switching if all callbacks have been notified and
-                                // user switching session is still valid
-                                if (waitingCallbacksCount.decrementAndGet() == 0
-                                        && (curWaitingUserSwitchCallbacks
-                                        == mCurWaitingUserSwitchCallbacks)) {
-                                    sendContinueUserSwitchLU(uss, oldUserId, newUserId);
-                                }
-                            }
-                        }
-                    };
-                    asyncTraceBegin("onUserSwitching-" + name, newUserId);
-                    mUserSwitchObservers.getBroadcastItem(i).onUserSwitching(newUserId, callback);
-                } catch (RemoteException e) {
-                    // Ignore
-                }
-            }
-        } else {
+        }, () -> {
             synchronized (mLock) {
                 sendContinueUserSwitchLU(uss, oldUserId, newUserId);
             }
+        }, "onUserSwitching");
+        t.traceEnd();
+    }
+
+    void informUserSwitchObservers(BiConsumer<IUserSwitchObserver, IRemoteCallback> consumer,
+            final Runnable onComplete, String trace) {
+        final int observerCount = mUserSwitchObservers.beginBroadcast();
+        if (observerCount == 0) {
+            onComplete.run();
+            mUserSwitchObservers.finishBroadcast();
+            return;
+        }
+        final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>();
+        synchronized (mLock) {
+            mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks;
+        }
+        final AtomicInteger waitingCallbacksCount = new AtomicInteger(observerCount);
+        final long userSwitchTimeoutMs = getUserSwitchTimeoutMs();
+        final long dispatchStartedTime = SystemClock.elapsedRealtime();
+        for (int i = 0; i < observerCount; i++) {
+            final long dispatchStartedTimeForObserver = SystemClock.elapsedRealtime();
+            // Prepend with unique prefix to guarantee that keys are unique
+            final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i);
+            synchronized (mLock) {
+                curWaitingUserSwitchCallbacks.add(name);
+            }
+            final IRemoteCallback callback = new IRemoteCallback.Stub() {
+                @Override
+                public void sendResult(Bundle data) throws RemoteException {
+                    asyncTraceEnd(trace + "-" + name, 0);
+                    synchronized (mLock) {
+                        long delayForObserver = SystemClock.elapsedRealtime()
+                                - dispatchStartedTimeForObserver;
+                        if (delayForObserver > LONG_USER_SWITCH_OBSERVER_WARNING_TIME_MS) {
+                            Slogf.w(TAG, "User switch slowed down by observer " + name
+                                    + ": result took " + delayForObserver
+                                    + " ms to process. " + trace);
+                        }
+                        long totalDelay = SystemClock.elapsedRealtime() - dispatchStartedTime;
+                        if (totalDelay > userSwitchTimeoutMs) {
+                            Slogf.e(TAG, "User switch timeout: observer " + name
+                                    + "'s result was received " + totalDelay
+                                    + " ms after dispatchUserSwitch. " + trace);
+                        }
+                        curWaitingUserSwitchCallbacks.remove(name);
+                        // Continue switching if all callbacks have been notified and
+                        // user switching session is still valid
+                        if (waitingCallbacksCount.decrementAndGet() == 0
+                                && (curWaitingUserSwitchCallbacks
+                                == mCurWaitingUserSwitchCallbacks)) {
+                            onComplete.run();
+                        }
+                    }
+                }
+            };
+            asyncTraceBegin(trace + "-" + name, 0);
+            consumer.accept(mUserSwitchObservers.getBroadcastItem(i), callback);
         }
         mUserSwitchObservers.finishBroadcast();
-        t.traceEnd(); // end dispatchUserSwitch-
     }
 
     @GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0fd4716..bd27142 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -242,6 +242,7 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
+import android.util.SystemPropertySetter;
 import android.view.Display;
 import android.view.KeyEvent;
 import android.view.accessibility.AccessibilityManager;
@@ -11032,7 +11033,7 @@
         @GuardedBy("mLock")
         private void updateLocked() {
             String n = Long.toString(mToken++);
-            SystemProperties.set(PermissionManager.CACHE_KEY_PACKAGE_INFO_NOTIFY, n);
+            SystemPropertySetter.setWithRetry(PermissionManager.CACHE_KEY_PACKAGE_INFO_NOTIFY, n);
         }
 
         private void trigger() {
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java
index e89f43b..20c3327 100644
--- a/services/core/java/com/android/server/compat/CompatConfig.java
+++ b/services/core/java/com/android/server/compat/CompatConfig.java
@@ -876,7 +876,28 @@
     }
 
     @Nullable
+    @android.ravenwood.annotation.RavenwoodReplace(
+            blockedBy = PackageManager.class,
+            reason = "PackageManager.getApplicationInfo() isn't supported yet")
     private Long getVersionCodeOrNull(String packageName) {
+        return getVersionCodeOrNullImpl(packageName);
+    }
+
+    @SuppressWarnings("unused")
+    @Nullable
+    private Long getVersionCodeOrNull$ravenwood(String packageName) {
+        try {
+            // It's possible that the context is mocked, try the real method first
+            return getVersionCodeOrNullImpl(packageName);
+        } catch (Throwable e) {
+            // For now, Ravenwood doesn't support the concept of "app updates", so let's
+            // just use a fixed version code for all packages.
+            return 1L;
+        }
+    }
+
+    @Nullable
+    private Long getVersionCodeOrNullImpl(String packageName) {
         try {
             ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(
                     packageName, MATCH_ANY_USER);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index c384b54..9349ea5 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -1030,10 +1030,20 @@
     }
 
     @ServiceThreadOnly
+    void addAndStartAction(final HdmiCecFeatureAction action, final boolean remove) {
+        assertRunOnServiceThread();
+        if (hasAction(action.getClass()) && remove) {
+            // If the action is currently running, remove it and restart it.
+            Slog.i(TAG, action.getClass().getName() + " is in progress. Restarting.");
+            removeAction(action.getClass());
+        }
+        addAndStartAction(action);
+    }
+
+    @ServiceThreadOnly
     void startNewAvbAudioStatusAction(int targetAddress) {
         assertRunOnServiceThread();
-        removeAction(AbsoluteVolumeAudioStatusAction.class);
-        addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress));
+        addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress), true);
     }
 
     @ServiceThreadOnly
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 1e90ab2..510e4f5 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -317,11 +317,7 @@
         if ((systemAudioOnPowerOnProp == ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
                 || ((systemAudioOnPowerOnProp == USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
                 && lastSystemAudioControlStatus && isSystemAudioControlFeatureEnabled())) {
-            if (hasAction(SystemAudioInitiationActionFromAvr.class)) {
-                Slog.i(TAG, "SystemAudioInitiationActionFromAvr is in progress. Restarting.");
-                removeAction(SystemAudioInitiationActionFromAvr.class);
-            }
-            addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
+            addAndStartAction(new SystemAudioInitiationActionFromAvr(this), true);
         }
     }
 
@@ -457,6 +453,7 @@
             HdmiLogger.debug("AVR device is not directly connected with TV");
             return Constants.ABORT_NOT_IN_CORRECT_MODE;
         } else {
+            // Action has been removed if it existed, do not attempt to remove again before start.
             addAndStartAction(new ArcInitiationActionFromAvr(this));
             return Constants.HANDLED;
         }
@@ -477,11 +474,9 @@
                     && !getActions(ArcTerminationActionFromAvr.class).get(0).mCallbacks.isEmpty()) {
                 IHdmiControlCallback callback =
                         getActions(ArcTerminationActionFromAvr.class).get(0).mCallbacks.get(0);
-                removeAction(ArcTerminationActionFromAvr.class);
-                addAndStartAction(new ArcTerminationActionFromAvr(this, callback));
+                addAndStartAction(new ArcTerminationActionFromAvr(this, callback), true);
             } else {
-                removeAction(ArcTerminationActionFromAvr.class);
-                addAndStartAction(new ArcTerminationActionFromAvr(this));
+                addAndStartAction(new ArcTerminationActionFromAvr(this), true);
             }
             return Constants.HANDLED;
         }
@@ -1036,11 +1031,7 @@
     void onSystemAudioControlFeatureSupportChanged(boolean enabled) {
         setSystemAudioControlFeatureEnabled(enabled);
         if (enabled) {
-            if (hasAction(SystemAudioInitiationActionFromAvr.class)) {
-                Slog.i(TAG, "SystemAudioInitiationActionFromAvr is in progress. Restarting.");
-                removeAction(SystemAudioInitiationActionFromAvr.class);
-            }
-            addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
+            addAndStartAction(new SystemAudioInitiationActionFromAvr(this), true);
         }
     }
 
@@ -1221,8 +1212,7 @@
         removeAction(ArcTerminationActionFromAvr.class);
         if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)
                 && isDirectConnectToTv() && !isArcEnabled()) {
-            removeAction(ArcInitiationActionFromAvr.class);
-            addAndStartAction(new ArcInitiationActionFromAvr(this));
+            addAndStartAction(new ArcInitiationActionFromAvr(this), true);
         }
     }
 
@@ -1367,10 +1357,6 @@
         if (mService.isDeviceDiscoveryHandledByPlayback()) {
             return;
         }
-        if (hasAction(DeviceDiscoveryAction.class)) {
-            Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
-            removeAction(DeviceDiscoveryAction.class);
-        }
         DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
                 new DeviceDiscoveryCallback() {
                     @Override
@@ -1380,7 +1366,7 @@
                         }
                     }
                 });
-        addAndStartAction(action);
+        addAndStartAction(action, true);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 0b667fc..86abbc4 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -21,7 +21,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.hardware.display.DeviceProductInfo;
 import android.hardware.hdmi.HdmiControlManager;
 import android.hardware.hdmi.HdmiDeviceInfo;
 import android.hardware.hdmi.IHdmiControlCallback;
@@ -32,7 +31,6 @@
 import android.os.SystemProperties;
 import android.sysprop.HdmiProperties;
 import android.util.Slog;
-import android.view.Display;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.LocalePicker;
@@ -151,10 +149,6 @@
     private void launchDeviceDiscovery() {
         assertRunOnServiceThread();
         clearDeviceInfoList();
-        if (hasAction(DeviceDiscoveryAction.class)) {
-            Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
-            removeAction(DeviceDiscoveryAction.class);
-        }
         DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
                 new DeviceDiscoveryAction.DeviceDiscoveryCallback() {
                     @Override
@@ -163,25 +157,21 @@
                             mService.getHdmiCecNetwork().addCecDevice(info);
                         }
 
-                        // Since we removed all devices when it starts and device discovery action
-                        // does not poll local devices, we should put device info of local device
-                        // manually here.
+                        // Since we removed all devices when it starts and device discovery
+                        // action does not poll local devices, we should put device info of
+                        // local device manually here.
                         for (HdmiCecLocalDevice device : mService.getAllCecLocalDevices()) {
                             mService.getHdmiCecNetwork().addCecDevice(device.getDeviceInfo());
                         }
 
-                        List<HotplugDetectionAction> hotplugActions =
-                                getActions(HotplugDetectionAction.class);
-                        if (hotplugActions.isEmpty()) {
+                        if (!hasAction(HotplugDetectionAction.class)) {
                             addAndStartAction(
-                                    new HotplugDetectionAction(HdmiCecLocalDevicePlayback.this));
+                                    new HotplugDetectionAction(
+                                            HdmiCecLocalDevicePlayback.this));
                         }
 
                         if (mService.isHdmiControlEnhancedBehaviorFlagEnabled()) {
-                            List<PowerStatusMonitorActionFromPlayback>
-                                    powerStatusMonitorActionsFromPlayback =
-                                    getActions(PowerStatusMonitorActionFromPlayback.class);
-                            if (powerStatusMonitorActionsFromPlayback.isEmpty()) {
+                            if (!hasAction(PowerStatusMonitorActionFromPlayback.class)) {
                                 addAndStartAction(
                                         new PowerStatusMonitorActionFromPlayback(
                                                 HdmiCecLocalDevicePlayback.this));
@@ -189,7 +179,7 @@
                         }
                     }
                 });
-        addAndStartAction(action);
+        addAndStartAction(action, true);
     }
 
     @Override
@@ -235,8 +225,16 @@
             invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
             return;
         }
-        removeAction(DeviceSelectActionFromPlayback.class);
-        addAndStartAction(new DeviceSelectActionFromPlayback(this, targetDevice, callback));
+        List<DeviceSelectActionFromPlayback> actions = getActions(
+                DeviceSelectActionFromPlayback.class);
+        if (!actions.isEmpty()) {
+            DeviceSelectActionFromPlayback action = actions.get(0);
+            if (action.getTargetAddress() == targetDevice.getLogicalAddress()) {
+                return;
+            }
+        }
+        addAndStartAction(new DeviceSelectActionFromPlayback(this, targetDevice, callback),
+                true);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 424102c..3d6d34b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -220,10 +220,6 @@
         List<HdmiCecMessage> bufferedActiveSource = mDelayedMessageBuffer
                 .getBufferedMessagesWithOpcode(Constants.MESSAGE_ACTIVE_SOURCE);
         if (bufferedActiveSource.isEmpty()) {
-            if (hasAction(RequestActiveSourceAction.class)) {
-                Slog.i(TAG, "RequestActiveSourceAction is in progress. Restarting.");
-                removeAction(RequestActiveSourceAction.class);
-            }
             addAndStartAction(new RequestActiveSourceAction(this, new IHdmiControlCallback.Stub() {
                 @Override
                 public void onComplete(int result) {
@@ -231,7 +227,7 @@
                         launchRoutingControl(routingForBootup);
                     }
                 }
-            }));
+            }), true);
         } else {
             addCecDeviceForBufferedActiveSource(bufferedActiveSource.get(0));
         }
@@ -328,8 +324,15 @@
             invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
             return;
         }
-        removeAction(DeviceSelectActionFromTv.class);
-        addAndStartAction(new DeviceSelectActionFromTv(this, targetDevice, callback));
+        List<DeviceSelectActionFromTv> actions = getActions(DeviceSelectActionFromTv.class);
+        if (!actions.isEmpty()) {
+            DeviceSelectActionFromTv action = actions.get(0);
+            if (action.getTargetAddress() == targetDevice.getLogicalAddress()) {
+                return;
+            }
+        }
+        addAndStartAction(new DeviceSelectActionFromTv(this, targetDevice, callback),
+                true);
     }
 
     @ServiceThreadOnly
@@ -475,9 +478,8 @@
                 HdmiCecMessageBuilder.buildRoutingChange(
                         getDeviceInfo().getLogicalAddress(), oldPath, newPath);
         mService.sendCecCommand(routingChange);
-        removeAction(RoutingControlAction.class);
         addAndStartAction(
-                new RoutingControlAction(this, newPath, callback));
+                new RoutingControlAction(this, newPath, callback), true);
     }
 
     @ServiceThreadOnly
@@ -801,16 +803,12 @@
                         mSelectRequestBuffer.process();
                         resetSelectRequestBuffer();
 
-                        List<HotplugDetectionAction> hotplugActions
-                                = getActions(HotplugDetectionAction.class);
-                        if (hotplugActions.isEmpty()) {
+                        if (!hasAction(HotplugDetectionAction.class)) {
                             addAndStartAction(
                                     new HotplugDetectionAction(HdmiCecLocalDeviceTv.this));
                         }
 
-                        List<PowerStatusMonitorAction> powerStatusActions
-                                = getActions(PowerStatusMonitorAction.class);
-                        if (powerStatusActions.isEmpty()) {
+                        if (!hasAction(PowerStatusMonitorAction.class)) {
                             addAndStartAction(
                                     new PowerStatusMonitorAction(HdmiCecLocalDeviceTv.this));
                         }
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 35ef18b..bd8b67b9 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -17,7 +17,6 @@
 package com.android.server.hdmi;
 
 import static android.media.tv.flags.Flags.hdmiControlEnhancedBehavior;
-
 import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE;
 import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE;
 import static android.hardware.hdmi.HdmiControlManager.EARC_FEATURE_DISABLED;
@@ -107,7 +106,6 @@
 import android.util.SparseArray;
 import android.view.Display;
 import android.view.KeyEvent;
-import android.view.WindowManager;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -1218,9 +1216,6 @@
                 audioSystem.terminateSystemAudioMode();
             }
             if (isArcEnabled) {
-                if (audioSystem.hasAction(ArcTerminationActionFromAvr.class)) {
-                    audioSystem.removeAction(ArcTerminationActionFromAvr.class);
-                }
                 audioSystem.addAndStartAction(new ArcTerminationActionFromAvr(audioSystem,
                         new IHdmiControlCallback.Stub() {
                             @Override
@@ -1228,7 +1223,7 @@
                                 mAddressAllocated = false;
                                 initializeCecLocalDevices(INITIATED_BY_SOUNDBAR_MODE);
                             }
-                        }));
+                        }), true);
             }
         }
         if (!isArcEnabled) {
diff --git a/services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java b/services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java
index 9a3cde1..d05ded5 100644
--- a/services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java
+++ b/services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java
@@ -68,6 +68,8 @@
 
     private boolean handleReportPowerStatusFromTv(HdmiCecMessage cmd) {
         int powerStatus = cmd.getParams()[0] & 0xFF;
+        mState = STATE_WAIT_FOR_NEXT_MONITORING;
+        addTimer(mState, MONITORING_INTERVAL_MS);
         if (powerStatus == POWER_STATUS_STANDBY) {
             Slog.d(TAG, "TV reported it turned off, going to sleep.");
             source().getService().standby();
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 6053557..6780866 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -103,6 +103,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.Preconditions;
 import com.android.server.FgThread;
 import com.android.server.LocalServices;
@@ -537,11 +538,16 @@
         }
 
         if (Flags.populationDensityProvider()) {
+            long startTime = System.currentTimeMillis();
             setProxyPopulationDensityProvider(
                     ProxyPopulationDensityProvider.createAndRegister(mContext));
+            int duration = (int) (System.currentTimeMillis() - startTime);
             if (mPopulationDensityProvider == null) {
                 Log.e(TAG, "no population density provider found");
             }
+            FrameworkStatsLog.write(FrameworkStatsLog.POPULATION_DENSITY_PROVIDER_LOADING_REPORTED,
+                /* provider_null= */ (mPopulationDensityProvider == null),
+                /* provider_start_time_millis= */ duration);
         }
         if (mPopulationDensityProvider != null && Flags.densityBasedCoarseLocations()) {
             setLocationFudgerCache(new LocationFudgerCache(mPopulationDensityProvider));
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
index 7698a87..740c4f1 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
@@ -36,6 +36,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
 
 /**
  * A class that manages registration/unregistration of clients and manages messages to/from clients.
@@ -312,15 +313,9 @@
 
     @Override
     public void onCloseEndpointSession(int sessionId, byte reason) {
-        boolean callbackInvoked = false;
-        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
-            if (broker.hasSessionId(sessionId)) {
-                broker.onCloseEndpointSession(sessionId, reason);
-                callbackInvoked = true;
-                break;
-            }
-        }
-
+        boolean callbackInvoked =
+                invokeCallbackForMatchingSession(
+                        sessionId, (broker) -> broker.onCloseEndpointSession(sessionId, reason));
         if (!callbackInvoked) {
             Log.w(TAG, "onCloseEndpointSession: unknown session ID " + sessionId);
         }
@@ -328,15 +323,9 @@
 
     @Override
     public void onEndpointSessionOpenComplete(int sessionId) {
-        boolean callbackInvoked = false;
-        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
-            if (broker.hasSessionId(sessionId)) {
-                broker.onEndpointSessionOpenComplete(sessionId);
-                callbackInvoked = true;
-                break;
-            }
-        }
-
+        boolean callbackInvoked =
+                invokeCallbackForMatchingSession(
+                        sessionId, (broker) -> broker.onEndpointSessionOpenComplete(sessionId));
         if (!callbackInvoked) {
             Log.w(TAG, "onEndpointSessionOpenComplete: unknown session ID " + sessionId);
         }
@@ -344,15 +333,9 @@
 
     @Override
     public void onMessageReceived(int sessionId, HubMessage message) {
-        boolean callbackInvoked = false;
-        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
-            if (broker.hasSessionId(sessionId)) {
-                broker.onMessageReceived(sessionId, message);
-                callbackInvoked = true;
-                break;
-            }
-        }
-
+        boolean callbackInvoked =
+                invokeCallbackForMatchingSession(
+                        sessionId, (broker) -> broker.onMessageReceived(sessionId, message));
         if (!callbackInvoked) {
             Log.w(TAG, "onMessageReceived: unknown session ID " + sessionId);
         }
@@ -360,20 +343,38 @@
 
     @Override
     public void onMessageDeliveryStatusReceived(int sessionId, int sequenceNumber, byte errorCode) {
-        boolean callbackInvoked = false;
-        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
-            if (broker.hasSessionId(sessionId)) {
-                broker.onMessageDeliveryStatusReceived(sessionId, sequenceNumber, errorCode);
-                callbackInvoked = true;
-                break;
-            }
-        }
-
+        boolean callbackInvoked =
+                invokeCallbackForMatchingSession(
+                        sessionId,
+                        (broker) ->
+                                broker.onMessageDeliveryStatusReceived(
+                                        sessionId, sequenceNumber, errorCode));
         if (!callbackInvoked) {
             Log.w(TAG, "onMessageDeliveryStatusReceived: unknown session ID " + sessionId);
         }
     }
 
+    /**
+     * Invokes a callback for a session with matching ID.
+     *
+     * @param callback The callback to execute
+     * @return true if a callback was executed
+     */
+    private boolean invokeCallbackForMatchingSession(
+            int sessionId, Consumer<ContextHubEndpointBroker> callback) {
+        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
+            if (broker.hasSessionId(sessionId)) {
+                try {
+                    callback.accept(broker);
+                } catch (RuntimeException e) {
+                    Log.e(TAG, "Exception while invoking callback", e);
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
     /** Unregister the hub (called during init() failure). Silence errors. */
     private void unregisterHub() {
         try {
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
index 54ed5a9..2615a76 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
@@ -756,9 +756,7 @@
     @Override
     public List<HubInfo> getHubs() throws RemoteException {
         super.getHubs_enforcePermission();
-        if (mHubInfoRegistry == null) {
-            return Collections.emptyList();
-        }
+        checkHubDiscoveryPreconditions();
         return mHubInfoRegistry.getHubs();
     }
 
@@ -766,9 +764,7 @@
     @Override
     public List<HubEndpointInfo> findEndpoints(long endpointId) {
         super.findEndpoints_enforcePermission();
-        if (mHubInfoRegistry == null) {
-            return Collections.emptyList();
-        }
+        checkEndpointDiscoveryPreconditions();
         return mHubInfoRegistry.findEndpoints(endpointId);
     }
 
@@ -776,9 +772,7 @@
     @Override
     public List<HubEndpointInfo> findEndpointsWithService(String serviceDescriptor) {
         super.findEndpointsWithService_enforcePermission();
-        if (mHubInfoRegistry == null) {
-            return Collections.emptyList();
-        }
+        checkEndpointDiscoveryPreconditions();
         return mHubInfoRegistry.findEndpointsWithService(serviceDescriptor);
     }
 
@@ -834,6 +828,13 @@
         }
     }
 
+    private void checkHubDiscoveryPreconditions() {
+        if (mHubInfoRegistry == null) {
+            Log.e(TAG, "Hub registry failed to initialize");
+            throw new UnsupportedOperationException("Hub discovery is not supported");
+        }
+    }
+
     /**
      * Creates an internal load transaction callback to be used for old API clients
      *
diff --git a/services/core/java/com/android/server/location/fudger/LocationFudger.java b/services/core/java/com/android/server/location/fudger/LocationFudger.java
index bbd8aa1..2757764 100644
--- a/services/core/java/com/android/server/location/fudger/LocationFudger.java
+++ b/services/core/java/com/android/server/location/fudger/LocationFudger.java
@@ -203,7 +203,7 @@
             } else {
                 // Try to fetch the default value. The answer won't come in time, but will be used
                 // for the next location to coarsen.
-                cacheCopy.fetchDefaultCoarseningLevelIfNeeded();
+                cacheCopy.onDefaultCoarseningLevelNotSet();
                 // Previous algorithm that snaps to a grid of width mAccuracyM.
                 coarsened = snapToGrid(latitude, longitude);
             }
diff --git a/services/core/java/com/android/server/location/fudger/LocationFudgerCache.java b/services/core/java/com/android/server/location/fudger/LocationFudgerCache.java
index 19ec38c..3ef2b56 100644
--- a/services/core/java/com/android/server/location/fudger/LocationFudgerCache.java
+++ b/services/core/java/com/android/server/location/fudger/LocationFudgerCache.java
@@ -26,6 +26,7 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.location.geometry.S2CellIdUtils;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.location.provider.proxy.ProxyPopulationDensityProvider;
 
 import java.util.Objects;
@@ -68,6 +69,15 @@
     // The provider that asynchronously provides what is stored in the cache.
     private final ProxyPopulationDensityProvider mPopulationDensityProvider;
 
+    // If two calls to logDensityBasedLocsUsed are made in an interval shorter than this value,
+    // the second is dropped.
+    protected static final int LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS = 1000 * 60 * 10; // 10 min
+
+    // The system time at which the last query to logDensityBasedLocsUsed was made.
+    // Initialized to -LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS, so even if made at time 0, the
+    // first call succeeds.
+    private long mLastQueryToLogDensityBasedLocsUsedMs = -LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS;
+
     private static String sTAG = "LocationFudgerCache";
 
     public LocationFudgerCache(@NonNull ProxyPopulationDensityProvider provider) {
@@ -76,11 +86,17 @@
         asyncFetchDefaultCoarseningLevel();
     }
 
-    /** If the cache's default coarsening value hasn't been set, asynchronously fetches it. */
-    public void fetchDefaultCoarseningLevelIfNeeded() {
+    /**
+     * Called by the LocationFudger when a query couldn't be fulfilled because the cache isn't set.
+     */
+    public void onDefaultCoarseningLevelNotSet() {
         if (!hasDefaultValue()) {
             asyncFetchDefaultCoarseningLevel();
         }
+        logDensityBasedLocsUsed(/* nowMs=*/ System.currentTimeMillis(),
+            /* skippedNoDefault= */ true,
+            /* isCacheHit= */ false,
+            /* defaultCoarseningLevel= */ -1);
     }
 
     /** Returns true if the cache has successfully received a default value from the provider. */
@@ -101,17 +117,46 @@
             asyncFetchDefaultCoarseningLevel();
         }
         Long s2CellId = readCacheForLatLng(latitudeDegrees, longitudeDegrees);
+        int defaultLevel = getDefaultCoarseningLevel();
         if (s2CellId == null) {
             // Asynchronously queries the density from the provider. The answer won't come in time,
             // but it will update the cache for the following queries.
             refreshCache(latitudeDegrees, longitudeDegrees);
 
-            return getDefaultCoarseningLevel();
+            logDensityBasedLocsUsed(/* nowMs=*/ System.currentTimeMillis(),
+                    /* skippedNoDefault= */ false,
+                    /* isCacheHit= */ false,
+                    /* defaultCoarseningLevel= */ defaultLevel);
+            return defaultLevel;
         }
+        logDensityBasedLocsUsed(/* nowMs=*/ System.currentTimeMillis(),
+            /* skippedNoDefault= */ false,
+            /* isCacheHit= */ true,
+            /* defaultCoarseningLevel= */ defaultLevel);
         return S2CellIdUtils.getLevel(s2CellId);
     }
 
     /**
+     * A simple wrapper around FrameworkStatsLog.write() that rate-limits the calls.
+     * Returns true on success, false if the call was dropped.
+     */
+    protected boolean logDensityBasedLocsUsed(long nowMs, boolean skippedNoDefault,
+            boolean isCacheHit, int defaultCoarseningLevel) {
+
+        if (nowMs - mLastQueryToLogDensityBasedLocsUsedMs
+                < LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS) {
+            return false;
+        }
+        mLastQueryToLogDensityBasedLocsUsedMs = nowMs;
+
+        FrameworkStatsLog.write(FrameworkStatsLog.DENSITY_BASED_COARSE_LOCATIONS_USAGE_REPORTED,
+                /* skipped_no_default= */ skippedNoDefault,
+                /* is_cache_hit= */ isCacheHit,
+                /* default_coarsening_level= */ defaultCoarseningLevel);
+        return true;
+    }
+
+    /**
      * If the cache contains the current location, returns the corresponding S2 cell id.
      * Otherwise, returns null.
      */
@@ -176,15 +221,26 @@
      *  Queries the population density provider and store the result in the cache.
      */
     private void refreshCache(double latitude, double longitude) {
+        long startTime = System.currentTimeMillis();
         IS2CellIdsCallback callback = new IS2CellIdsCallback.Stub() {
             @Override
             public void onResult(long[] s2CellIds) {
+                int durationMs = (int) (System.currentTimeMillis() - startTime);
+                FrameworkStatsLog.write(
+                        FrameworkStatsLog.DENSITY_BASED_COARSE_LOCATIONS_PROVIDER_QUERY_REPORTED,
+                        /* query_duration_millis= */ durationMs,
+                        /* is_error= */ false);
                 addToCache(s2CellIds);
             }
 
             @Override
             public void onError() {
                 Log.e(sTAG, "could not get population density");
+                int durationMs = (int) (System.currentTimeMillis() - startTime);
+                FrameworkStatsLog.write(
+                        FrameworkStatsLog.DENSITY_BASED_COARSE_LOCATIONS_PROVIDER_QUERY_REPORTED,
+                        /* query_duration_millis= */ durationMs,
+                        /* is_error= */ true);
             }
         };
         mPopulationDensityProvider.getCoarsenedS2Cells(latitude, longitude, MAX_CACHE_SIZE - 1,
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 3f91575..286238e 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -451,6 +451,7 @@
      * @param profileUserId  profile user Id
      * @param profileUserPassword  profile original password (when it has separated lock).
      */
+    @GuardedBy("mSpManager")
     private void tieProfileLockIfNecessary(int profileUserId,
             LockscreenCredential profileUserPassword) {
         // Only for profiles that shares credential with parent
@@ -909,14 +910,8 @@
                 // Hide notification first, as tie profile lock takes time
                 hideEncryptionNotification(new UserHandle(userId));
 
-                if (android.app.admin.flags.Flags.fixRaceConditionInTieProfileLock()) {
-                    synchronized (mSpManager) {
-                        tieProfileLockIfNecessary(userId, LockscreenCredential.createNone());
-                    }
-                } else {
-                    if (isCredentialSharableWithParent(userId)) {
-                        tieProfileLockIfNecessary(userId, LockscreenCredential.createNone());
-                    }
+                synchronized (mSpManager) {
+                    tieProfileLockIfNecessary(userId, LockscreenCredential.createNone());
                 }
             }
         });
@@ -1380,11 +1375,7 @@
                 mStorage.removeChildProfileLock(userId);
                 removeKeystoreProfileKey(userId);
             } else {
-                if (android.app.admin.flags.Flags.fixRaceConditionInTieProfileLock()) {
-                    synchronized (mSpManager) {
-                        tieProfileLockIfNecessary(userId, profileUserPassword);
-                    }
-                } else {
+                synchronized (mSpManager) {
                     tieProfileLockIfNecessary(userId, profileUserPassword);
                 }
             }
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 0b40d64..3f2c222 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -325,7 +325,7 @@
         for (int i = 0; i < N; i++) {
             final Condition c = conditions[i];
             if (mCallback != null) {
-                mCallback.onConditionChanged(c.id, c);
+                mCallback.onConditionChanged(c.id, c, info.uid);
             }
         }
     }
@@ -515,7 +515,7 @@
 
     public interface Callback {
         void onServiceAdded(ComponentName component);
-        void onConditionChanged(Uri id, Condition condition);
+        void onConditionChanged(Uri id, Condition condition, int callerUid);
     }
 
 }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f50e8aa..9567c81 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -5903,8 +5903,9 @@
         // TODO: b/310620812 - Remove getZenRules() when MODES_API is inlined.
         @Override
         public List<ZenModeConfig.ZenRule> getZenRules() throws RemoteException {
-            enforcePolicyAccess(Binder.getCallingUid(), "getZenRules");
-            return mZenModeHelper.getZenRules(getCallingZenUser());
+            int callingUid = Binder.getCallingUid();
+            enforcePolicyAccess(callingUid, "getZenRules");
+            return mZenModeHelper.getZenRules(getCallingZenUser(), callingUid);
         }
 
         @Override
@@ -5912,15 +5913,17 @@
             if (!android.app.Flags.modesApi()) {
                 throw new IllegalStateException("getAutomaticZenRules called with flag off!");
             }
-            enforcePolicyAccess(Binder.getCallingUid(), "getAutomaticZenRules");
-            return mZenModeHelper.getAutomaticZenRules(getCallingZenUser());
+            int callingUid = Binder.getCallingUid();
+            enforcePolicyAccess(callingUid, "getAutomaticZenRules");
+            return mZenModeHelper.getAutomaticZenRules(getCallingZenUser(), callingUid);
         }
 
         @Override
         public AutomaticZenRule getAutomaticZenRule(String id) throws RemoteException {
             Objects.requireNonNull(id, "Id is null");
-            enforcePolicyAccess(Binder.getCallingUid(), "getAutomaticZenRule");
-            return mZenModeHelper.getAutomaticZenRule(getCallingZenUser(), id);
+            int callingUid = Binder.getCallingUid();
+            enforcePolicyAccess(callingUid, "getAutomaticZenRule");
+            return mZenModeHelper.getAutomaticZenRule(getCallingZenUser(), id, callingUid);
         }
 
         @Override
@@ -6065,8 +6068,9 @@
         @Condition.State
         public int getAutomaticZenRuleState(@NonNull String id) {
             Objects.requireNonNull(id, "id is null");
-            enforcePolicyAccess(Binder.getCallingUid(), "getAutomaticZenRuleState");
-            return mZenModeHelper.getAutomaticZenRuleState(getCallingZenUser(), id);
+            int callingUid = Binder.getCallingUid();
+            enforcePolicyAccess(callingUid, "getAutomaticZenRuleState");
+            return mZenModeHelper.getAutomaticZenRuleState(getCallingZenUser(), id, callingUid);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/notification/ZenModeConditions.java b/services/core/java/com/android/server/notification/ZenModeConditions.java
index 52d0c41..d44baeb 100644
--- a/services/core/java/com/android/server/notification/ZenModeConditions.java
+++ b/services/core/java/com/android/server/notification/ZenModeConditions.java
@@ -113,15 +113,18 @@
     }
 
     @Override
-    public void onConditionChanged(Uri id, Condition condition) {
+    public void onConditionChanged(Uri id, Condition condition, int callingUid) {
         if (DEBUG) Log.d(TAG, "onConditionChanged " + id + " " + condition);
         ZenModeConfig config = mHelper.getConfig();
         if (config == null) return;
-        final int callingUid = Binder.getCallingUid();
+        if (!Flags.fixCallingUidFromCps()) {
+            // Old behavior: overwrite with known-bad callingUid (always system_server).
+            callingUid = Binder.getCallingUid();
+        }
 
         // This change is known to be for UserHandle.CURRENT because ConditionProviders for
         // background users are not bound.
-        mHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id, condition,
+        mHelper.setAutomaticZenRuleStateFromConditionProvider(UserHandle.CURRENT, id, condition,
                 callingUid == Process.SYSTEM_UID ? ZenModeConfig.ORIGIN_SYSTEM
                         : ZenModeConfig.ORIGIN_APP,
                 callingUid);
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index b571d62..0a63f3f 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -413,13 +413,13 @@
     }
 
     // TODO: b/310620812 - Make private (or inline) when MODES_API is inlined.
-    public List<ZenRule> getZenRules(UserHandle user) {
+    public List<ZenRule> getZenRules(UserHandle user, int callingUid) {
         List<ZenRule> rules = new ArrayList<>();
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
             if (config == null) return rules;
             for (ZenRule rule : config.automaticRules.values()) {
-                if (canManageAutomaticZenRule(rule)) {
+                if (canManageAutomaticZenRule(rule, callingUid)) {
                     rules.add(rule);
                 }
             }
@@ -432,8 +432,8 @@
      * (which means the owned rules for a regular app, and every rule for system callers) together
      * with their ids.
      */
-    Map<String, AutomaticZenRule> getAutomaticZenRules(UserHandle user) {
-        List<ZenRule> ruleList = getZenRules(user);
+    Map<String, AutomaticZenRule> getAutomaticZenRules(UserHandle user, int callingUid) {
+        List<ZenRule> ruleList = getZenRules(user, callingUid);
         HashMap<String, AutomaticZenRule> rules = new HashMap<>(ruleList.size());
         for (ZenRule rule : ruleList) {
             rules.put(rule.id, zenRuleToAutomaticZenRule(rule));
@@ -441,7 +441,7 @@
         return rules;
     }
 
-    public AutomaticZenRule getAutomaticZenRule(UserHandle user, String id) {
+    public AutomaticZenRule getAutomaticZenRule(UserHandle user, String id, int callingUid) {
         ZenRule rule;
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
@@ -449,7 +449,7 @@
             rule = config.automaticRules.get(id);
         }
         if (rule == null) return null;
-        if (canManageAutomaticZenRule(rule)) {
+        if (canManageAutomaticZenRule(rule, callingUid)) {
             return zenRuleToAutomaticZenRule(rule);
         }
         return null;
@@ -591,7 +591,7 @@
                         + " reason=" + reason);
             }
             ZenModeConfig.ZenRule oldRule = config.automaticRules.get(ruleId);
-            if (oldRule == null || !canManageAutomaticZenRule(oldRule)) {
+            if (oldRule == null || !canManageAutomaticZenRule(oldRule, callingUid)) {
                 throw new SecurityException(
                         "Cannot update rules not owned by your condition provider");
             }
@@ -859,7 +859,7 @@
             newConfig = config.copy();
             ZenRule ruleToRemove = newConfig.automaticRules.get(id);
             if (ruleToRemove == null) return false;
-            if (canManageAutomaticZenRule(ruleToRemove)) {
+            if (canManageAutomaticZenRule(ruleToRemove, callingUid)) {
                 newConfig.automaticRules.remove(id);
                 maybePreserveRemovedRule(newConfig, ruleToRemove, origin);
                 if (ruleToRemove.getPkg() != null
@@ -893,7 +893,8 @@
             newConfig = config.copy();
             for (int i = newConfig.automaticRules.size() - 1; i >= 0; i--) {
                 ZenRule rule = newConfig.automaticRules.get(newConfig.automaticRules.keyAt(i));
-                if (Objects.equals(rule.getPkg(), packageName) && canManageAutomaticZenRule(rule)) {
+                if (Objects.equals(rule.getPkg(), packageName)
+                        && canManageAutomaticZenRule(rule, callingUid)) {
                     newConfig.automaticRules.removeAt(i);
                     maybePreserveRemovedRule(newConfig, rule, origin);
                 }
@@ -938,14 +939,14 @@
     }
 
     @Condition.State
-    int getAutomaticZenRuleState(UserHandle user, String id) {
+    int getAutomaticZenRuleState(UserHandle user, String id, int callingUid) {
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
             if (config == null) {
                 return Condition.STATE_UNKNOWN;
             }
             ZenRule rule = config.automaticRules.get(id);
-            if (rule == null || !canManageAutomaticZenRule(rule)) {
+            if (rule == null || !canManageAutomaticZenRule(rule, callingUid)) {
                 return Condition.STATE_UNKNOWN;
             }
             if (Flags.modesApi() && Flags.modesUi()) {
@@ -968,7 +969,7 @@
             newConfig = config.copy();
             ZenRule rule = newConfig.automaticRules.get(id);
             if (Flags.modesApi()) {
-                if (rule != null && canManageAutomaticZenRule(rule)) {
+                if (rule != null && canManageAutomaticZenRule(rule, callingUid)) {
                     setAutomaticZenRuleStateLocked(newConfig, Collections.singletonList(rule),
                             condition, origin, callingUid);
                 }
@@ -980,8 +981,8 @@
         }
     }
 
-    void setAutomaticZenRuleState(UserHandle user, Uri ruleDefinition, Condition condition,
-            @ConfigOrigin int origin, int callingUid) {
+    void setAutomaticZenRuleStateFromConditionProvider(UserHandle user, Uri ruleDefinition,
+            Condition condition, @ConfigOrigin int origin, int callingUid) {
         checkSetRuleStateOrigin("setAutomaticZenRuleState(Uri ruleDefinition)", origin);
         ZenModeConfig newConfig;
         synchronized (mConfigLock) {
@@ -992,7 +993,7 @@
             List<ZenRule> matchingRules = findMatchingRules(newConfig, ruleDefinition, condition);
             if (Flags.modesApi()) {
                 for (int i = matchingRules.size() - 1; i >= 0; i--) {
-                    if (!canManageAutomaticZenRule(matchingRules.get(i))) {
+                    if (!canManageAutomaticZenRule(matchingRules.get(i), callingUid)) {
                         matchingRules.remove(i);
                     }
                 }
@@ -1125,15 +1126,21 @@
         return count;
     }
 
-    public boolean canManageAutomaticZenRule(ZenRule rule) {
-        final int callingUid = Binder.getCallingUid();
+    public boolean canManageAutomaticZenRule(ZenRule rule, int callingUid) {
+        if (!com.android.server.notification.Flags.fixCallingUidFromCps()) {
+            // Old behavior: ignore supplied callingUid and instead obtain it here. Will be
+            // incorrect if not currently handling a Binder call.
+            callingUid = Binder.getCallingUid();
+        }
+
         if (callingUid == 0 || callingUid == Process.SYSTEM_UID) {
+            // Checked specifically, because checkCallingPermission() will fail.
             return true;
         } else if (mContext.checkCallingPermission(android.Manifest.permission.MANAGE_NOTIFICATIONS)
                 == PackageManager.PERMISSION_GRANTED) {
             return true;
         } else {
-            String[] packages = mPm.getPackagesForUid(Binder.getCallingUid());
+            String[] packages = mPm.getPackagesForUid(callingUid);
             if (packages != null) {
                 final int packageCount = packages.length;
                 for (int i = 0; i < packageCount; i++) {
@@ -2902,8 +2909,8 @@
     }
 
     /**
-     * Checks that the {@code origin} supplied to {@link #setAutomaticZenRuleState} overloads makes
-     * sense.
+     * Checks that the {@code origin} supplied to {@link #setAutomaticZenRuleState} or
+     * {@link #setAutomaticZenRuleStateFromConditionProvider} makes sense.
      */
     private static void checkSetRuleStateOrigin(String method, @ConfigOrigin int origin) {
         if (!Flags.modesApi()) {
diff --git a/services/core/java/com/android/server/notification/flags.aconfig b/services/core/java/com/android/server/notification/flags.aconfig
index f15c23e..2b4d71e 100644
--- a/services/core/java/com/android/server/notification/flags.aconfig
+++ b/services/core/java/com/android/server/notification/flags.aconfig
@@ -196,4 +196,14 @@
   metadata {
     purpose: PURPOSE_BUGFIX
   }
-}
\ No newline at end of file
+}
+
+flag {
+  name: "fix_calling_uid_from_cps"
+  namespace: "systemui"
+  description: "Correctly checks zen rule ownership when a CPS notifies with a Condition"
+  bug: "379722187"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/services/core/java/com/android/server/om/OverlayActorEnforcer.java b/services/core/java/com/android/server/om/OverlayActorEnforcer.java
index 38f3939..cc5c88b 100644
--- a/services/core/java/com/android/server/om/OverlayActorEnforcer.java
+++ b/services/core/java/com/android/server/om/OverlayActorEnforcer.java
@@ -50,6 +50,10 @@
      */
     static Pair<String, ActorState> getPackageNameForActor(@NonNull String actorUriString,
             @NonNull Map<String, Map<String, String>> namedActors) {
+        if (namedActors.isEmpty()) {
+            return Pair.create(null, ActorState.NO_NAMED_ACTORS);
+        }
+
         Uri actorUri = Uri.parse(actorUriString);
 
         String actorScheme = actorUri.getScheme();
@@ -58,10 +62,6 @@
             return Pair.create(null, ActorState.INVALID_OVERLAYABLE_ACTOR_NAME);
         }
 
-        if (namedActors.isEmpty()) {
-            return Pair.create(null, ActorState.NO_NAMED_ACTORS);
-        }
-
         String actorNamespace = actorUri.getAuthority();
         Map<String, String> namespace = namedActors.get(actorNamespace);
         if (ArrayUtils.isEmpty(namespace)) {
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index 1726f0d..a6f2a37 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -121,6 +121,8 @@
     @VisibleForTesting final long mHintSessionPreferredRate;
 
     @VisibleForTesting static final int MAX_GRAPHICS_PIPELINE_THREADS_COUNT = 5;
+    private static final int DEFAULT_MAX_CPU_HEADROOM_THREADS_COUNT = 5;
+    private static final int DEFAULT_CHECK_HEADROOM_PROC_STAT_MIN_MILLIS = 50;
 
     // Multi-level map storing all active AppHintSessions.
     // First level is keyed by the UID of the client process creating the session.
@@ -206,12 +208,17 @@
             "persist.hms.check_headroom_affinity";
     private static final String PROPERTY_CHECK_HEADROOM_PROC_STAT_MIN_MILLIS =
             "persist.hms.check_headroom_proc_stat_min_millis";
+    private static final String PROPERTY_CPU_HEADROOM_TID_MAX_CNT =
+            "persist.hms.cpu_headroom_tid_max_cnt";
     private Boolean mFMQUsesIntegratedEventFlag = false;
 
     private final Object mCpuHeadroomLock = new Object();
     @VisibleForTesting
     final float mJiffyMillis;
+    private final boolean mCheckHeadroomTid;
+    private final boolean mCheckHeadroomAffinity;
     private final int mCheckHeadroomProcStatMinMillis;
+    private final int mCpuHeadroomMaxTidCnt;
     @GuardedBy("mCpuHeadroomLock")
     private long mLastCpuUserModeTimeCheckedMillis = 0;
     @GuardedBy("mCpuHeadroomLock")
@@ -339,13 +346,23 @@
             mUidToLastUserModeJiffies = new ArrayMap<>();
             long jiffyHz = Os.sysconf(OsConstants._SC_CLK_TCK);
             mJiffyMillis = 1000.0f / jiffyHz;
+            mCheckHeadroomTid = SystemProperties.getBoolean(PROPERTY_CHECK_HEADROOM_TID, true);
+            mCheckHeadroomAffinity = SystemProperties.getBoolean(PROPERTY_CHECK_HEADROOM_AFFINITY,
+                    true);
             mCheckHeadroomProcStatMinMillis = SystemProperties.getInt(
-                    PROPERTY_CHECK_HEADROOM_PROC_STAT_MIN_MILLIS, 50);
+                    PROPERTY_CHECK_HEADROOM_PROC_STAT_MIN_MILLIS,
+                    DEFAULT_CHECK_HEADROOM_PROC_STAT_MIN_MILLIS);
+            mCpuHeadroomMaxTidCnt = Math.min(SystemProperties.getInt(
+                    PROPERTY_CPU_HEADROOM_TID_MAX_CNT, DEFAULT_MAX_CPU_HEADROOM_THREADS_COUNT),
+                    mSupportInfo.headroom.cpuMaxTidCount);
         } else {
             mCpuHeadroomCache = null;
             mUidToLastUserModeJiffies = null;
             mJiffyMillis = 0.0f;
+            mCheckHeadroomTid = true;
+            mCheckHeadroomAffinity = true;
             mCheckHeadroomProcStatMinMillis = 0;
+            mCpuHeadroomMaxTidCnt = 0;
         }
         if (mSupportInfo.headroom.isGpuSupported) {
             mGpuHeadroomCache = new HeadroomCache<>(2, mSupportInfo.headroom.gpuMinIntervalMillis);
@@ -1577,8 +1594,7 @@
             if (params.usesDeviceHeadroom) {
                 halParams.tids = new int[]{};
             } else if (params.tids != null && params.tids.length > 0) {
-                if (UserHandle.getAppId(uid) != Process.SYSTEM_UID && SystemProperties.getBoolean(
-                        PROPERTY_CHECK_HEADROOM_TID, true)) {
+                if (UserHandle.getAppId(uid) != Process.SYSTEM_UID && mCheckHeadroomTid) {
                     final int tgid = Process.getThreadGroupLeader(Binder.getCallingPid());
                     for (int tid : params.tids) {
                         if (Process.getThreadGroupLeader(tid) != tgid) {
@@ -1588,8 +1604,8 @@
                         }
                     }
                 }
-                if (cpuHeadroomAffinityCheck() && params.tids.length > 1
-                        && SystemProperties.getBoolean(PROPERTY_CHECK_HEADROOM_AFFINITY, true)) {
+                if (cpuHeadroomAffinityCheck() && mCheckHeadroomAffinity
+                        && params.tids.length > 1) {
                     checkThreadAffinityForTids(params.tids);
                 }
                 halParams.tids = params.tids;
@@ -1709,15 +1725,22 @@
                 throw new IllegalArgumentException(
                         "Unknown CPU headroom calculation type " + (int) params.calculationType);
             }
-            if (params.calculationWindowMillis < 50 || params.calculationWindowMillis > 10000) {
+            if (params.calculationWindowMillis < mSupportInfo.headroom.cpuMinCalculationWindowMillis
+                    || params.calculationWindowMillis
+                    > mSupportInfo.headroom.cpuMaxCalculationWindowMillis) {
                 throw new IllegalArgumentException(
-                        "Invalid CPU headroom calculation window, expected [50, 10000] but got "
+                        "Invalid CPU headroom calculation window, expected ["
+                                + mSupportInfo.headroom.cpuMinCalculationWindowMillis
+                                + ", "
+                                + mSupportInfo.headroom.cpuMaxCalculationWindowMillis
+                                + "] but got "
                                 + params.calculationWindowMillis);
             }
             if (!params.usesDeviceHeadroom) {
-                if (params.tids != null && params.tids.length > 5) {
+                if (params.tids != null && params.tids.length > mCpuHeadroomMaxTidCnt) {
                     throw new IllegalArgumentException(
-                            "More than 5 TIDs requested: " + params.tids.length);
+                            "More than " + mCpuHeadroomMaxTidCnt + " TIDs requested: "
+                                    + params.tids.length);
                 }
             }
         }
@@ -1772,9 +1795,13 @@
                 throw new IllegalArgumentException(
                         "Unknown GPU headroom calculation type " + (int) params.calculationType);
             }
-            if (params.calculationWindowMillis < 50 || params.calculationWindowMillis > 10000) {
+            if (params.calculationWindowMillis < mSupportInfo.headroom.gpuMinCalculationWindowMillis
+                    || params.calculationWindowMillis
+                    > mSupportInfo.headroom.gpuMaxCalculationWindowMillis) {
                 throw new IllegalArgumentException(
-                        "Invalid GPU headroom calculation window, expected [50, 10000] but got "
+                        "Invalid GPU headroom calculation window, expected ["
+                                + mSupportInfo.headroom.gpuMinCalculationWindowMillis + ", "
+                                + mSupportInfo.headroom.gpuMaxCalculationWindowMillis + "] but got "
                                 + params.calculationWindowMillis);
             }
         }
@@ -1807,9 +1834,15 @@
         @Override
         public IHintManager.HintManagerClientData
                 registerClient(@NonNull IHintManager.IHintManagerClient clientBinder) {
+            return getClientData();
+        }
+
+        @Override
+        public IHintManager.HintManagerClientData getClientData() {
             IHintManager.HintManagerClientData out = new IHintManager.HintManagerClientData();
             out.preferredRateNanos = mHintSessionPreferredRate;
             out.maxGraphicsPipelineThreads = getMaxGraphicsPipelineThreadsCount();
+            out.maxCpuHeadroomThreads = DEFAULT_MAX_CPU_HEADROOM_THREADS_COUNT;
             out.powerHalVersion = mPowerHalVersion;
             out.supportInfo = mSupportInfo;
             return out;
@@ -1838,23 +1871,40 @@
                     }
                 }
             }
-            pw.println("CPU Headroom Interval: " + mSupportInfo.headroom.cpuMinIntervalMillis);
-            pw.println("GPU Headroom Interval: " + mSupportInfo.headroom.gpuMinIntervalMillis);
-            try {
-                CpuHeadroomParamsInternal params = new CpuHeadroomParamsInternal();
-                params.usesDeviceHeadroom = true;
-                CpuHeadroomResult ret = getCpuHeadroom(params);
-                pw.println("CPU headroom: " + (ret == null ? "N/A" : ret.getGlobalHeadroom()));
-            } catch (Exception e) {
-                Slog.d(TAG, "Failed to dump CPU headroom", e);
-                pw.println("CPU headroom: N/A");
+            pw.println("CPU Headroom Supported: " + mSupportInfo.headroom.isCpuSupported);
+            if (mSupportInfo.headroom.isCpuSupported) {
+                pw.println("CPU Headroom Interval: " + mSupportInfo.headroom.cpuMinIntervalMillis);
+                pw.println("CPU Headroom TID Max Count: " + mCpuHeadroomMaxTidCnt);
+                pw.println("CPU Headroom TID Max Count From HAL: "
+                        + mSupportInfo.headroom.cpuMaxTidCount);
+                pw.println("CPU Headroom Calculation Window Range: ["
+                        + mSupportInfo.headroom.cpuMinCalculationWindowMillis + ", "
+                        + mSupportInfo.headroom.cpuMaxCalculationWindowMillis + "]");
+                try {
+                    CpuHeadroomParamsInternal params = new CpuHeadroomParamsInternal();
+                    params.usesDeviceHeadroom = true;
+                    CpuHeadroomResult ret = getCpuHeadroom(params);
+                    pw.println("CPU headroom: " + (ret == null ? "N/A" : ret.getGlobalHeadroom()));
+                } catch (Exception e) {
+                    Slog.d(TAG, "Failed to dump CPU headroom", e);
+                    pw.println("CPU headroom: N/A");
+                }
             }
-            try {
-                GpuHeadroomResult ret = getGpuHeadroom(new GpuHeadroomParamsInternal());
-                pw.println("GPU headroom: " + (ret == null ? "N/A" : ret.getGlobalHeadroom()));
-            } catch (Exception e) {
-                Slog.d(TAG, "Failed to dump GPU headroom", e);
-                pw.println("GPU headroom: N/A");
+            pw.println("GPU Headroom Supported: " + mSupportInfo.headroom.isGpuSupported);
+            if (mSupportInfo.headroom.isGpuSupported) {
+                pw.println("GPU Headroom Interval: " + mSupportInfo.headroom.gpuMinIntervalMillis);
+                pw.println("GPU Headroom Calculation Window Range: ["
+                        + mSupportInfo.headroom.gpuMinCalculationWindowMillis + ", "
+                        + mSupportInfo.headroom.gpuMaxCalculationWindowMillis + "]");
+                try {
+                    GpuHeadroomParamsInternal params = new GpuHeadroomParamsInternal();
+                    params.calculationWindowMillis = mDefaultGpuHeadroomCalculationWindowMillis;
+                    GpuHeadroomResult ret = getGpuHeadroom(params);
+                    pw.println("GPU headroom: " + (ret == null ? "N/A" : ret.getGlobalHeadroom()));
+                } catch (Exception e) {
+                    Slog.d(TAG, "Failed to dump GPU headroom", e);
+                    pw.println("GPU headroom: N/A");
+                }
             }
         }
 
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index caaf5a2..9206cce 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -2205,6 +2205,11 @@
                 getWakelockDurationRetriever() {
             return mWakelockDurationRetriever;
         }
+
+        @Override
+        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+            return BatteryStatsImpl.this.networkStatsDelta(stats, oldStats);
+        }
     }
 
     private final PowerStatsCollectorInjector mPowerStatsCollectorInjector =
@@ -12392,83 +12397,13 @@
         return networkStatsManager.getWifiUidStats();
     }
 
-    static class NetworkStatsDelta {
-        int mUid;
-        int mSet;
-        long mRxBytes;
-        long mRxPackets;
-        long mTxBytes;
-        long mTxPackets;
-
-        public int getUid() {
-            return mUid;
+    @VisibleForTesting
+    protected NetworkStats networkStatsDelta(@NonNull NetworkStats stats,
+            @Nullable NetworkStats oldStats) {
+        if (oldStats == null) {
+            return stats;
         }
-
-
-        public int getSet() {
-            return mSet;
-        }
-
-        public long getRxBytes() {
-            return mRxBytes;
-        }
-
-        public long getRxPackets() {
-            return mRxPackets;
-        }
-
-        public long getTxBytes() {
-            return mTxBytes;
-        }
-
-        public long getTxPackets() {
-            return mTxPackets;
-        }
-
-        @Override
-        public String toString() {
-            return "NetworkStatsDelta{mUid=" + mUid + ", mSet=" + mSet + ", mRxBytes=" + mRxBytes
-                    + ", mRxPackets=" + mRxPackets + ", mTxBytes=" + mTxBytes + ", mTxPackets="
-                    + mTxPackets + '}';
-        }
-    }
-
-    static List<NetworkStatsDelta> computeDelta(NetworkStats currentStats,
-            NetworkStats lastStats) {
-        List<NetworkStatsDelta> deltaList = new ArrayList<>();
-        for (NetworkStats.Entry entry : currentStats) {
-            NetworkStatsDelta delta = new NetworkStatsDelta();
-            delta.mUid = entry.getUid();
-            delta.mSet = entry.getSet();
-            NetworkStats.Entry lastEntry = null;
-            if (lastStats != null) {
-                for (NetworkStats.Entry e : lastStats) {
-                    if (e.getUid() == entry.getUid() && e.getSet() == entry.getSet()
-                            && e.getTag() == entry.getTag()
-                            && e.getMetered() == entry.getMetered()
-                            && e.getRoaming() == entry.getRoaming()
-                            && e.getDefaultNetwork() == entry.getDefaultNetwork()
-                            /*&& Objects.equals(e.getIface(), entry.getIface())*/) {
-                        lastEntry = e;
-                        break;
-                    }
-                }
-            }
-            if (lastEntry != null) {
-                delta.mRxBytes = Math.max(0, entry.getRxBytes() - lastEntry.getRxBytes());
-                delta.mRxPackets = Math.max(0, entry.getRxPackets() - lastEntry.getRxPackets());
-                delta.mTxBytes = Math.max(0, entry.getTxBytes() - lastEntry.getTxBytes());
-                delta.mTxPackets = Math.max(0, entry.getTxPackets() - lastEntry.getTxPackets());
-            } else {
-                delta.mRxBytes = entry.getRxBytes();
-                delta.mRxPackets = entry.getRxPackets();
-                delta.mTxBytes = entry.getTxBytes();
-                delta.mTxPackets = entry.getTxPackets();
-            }
-            deltaList.add(delta);
-        }
-
-        return deltaList;
+        return stats.subtract(oldStats);
     }
 
     /**
@@ -12486,12 +12421,12 @@
             }
         }
 
+        NetworkStats delta;
         // Grab a separate lock to acquire the network stats, which may do I/O.
-        List<NetworkStatsDelta> delta;
         synchronized (mWifiNetworkLock) {
             final NetworkStats latestStats = readWifiNetworkStatsLocked(networkStatsManager);
             if (latestStats != null) {
-                delta = computeDelta(latestStats, mLastWifiNetworkStats);
+                delta = networkStatsDelta(latestStats, mLastWifiNetworkStats);
                 mLastWifiNetworkStats = latestStats;
             } else {
                 delta = null;
@@ -12501,15 +12436,15 @@
     }
 
     private void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo wifiActivityEnergyInfo,
-            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
+            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
         // Do not populate consumed energy, because energy attribution is done by
         // WifiPowerStatsProcessor.
-        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
+        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                 elapsedRealtimeMs, uptimeMs);
     }
 
     private void updateWifiBatteryStats(WifiActivityEnergyInfo info,
-            List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
+            NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
             long uptimeMs) {
         synchronized (this) {
             if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
@@ -12535,7 +12470,7 @@
             long totalTxPackets = 0;
             long totalRxPackets = 0;
             if (delta != null) {
-                for (NetworkStatsDelta entry : delta) {
+                for (NetworkStats.Entry entry : delta) {
                     if (DEBUG_ENERGY) {
                         Slog.d(TAG, "Wifi uid " + entry.getUid()
                                 + ": delta rx=" + entry.getRxBytes()
@@ -12879,11 +12814,11 @@
         mLastModemActivityInfo = activityInfo;
 
         // Grab a separate lock to acquire the network stats, which may do I/O.
-        List<NetworkStatsDelta> delta = null;
+        NetworkStats delta = null;
         synchronized (mModemNetworkLock) {
             final NetworkStats latestStats = readMobileNetworkStatsLocked(networkStatsManager);
             if (latestStats != null) {
-                delta = computeDelta(latestStats, mLastModemNetworkStats);
+                delta = networkStatsDelta(latestStats, mLastModemNetworkStats);
                 mLastModemNetworkStats = latestStats;
             }
         }
@@ -12892,15 +12827,15 @@
     }
 
     private void onMobileRadioPowerStatsRetrieved(ModemActivityInfo modemActivityInfo,
-            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
+            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
         // Do not populate consumed energy, because energy attribution is done by
         // MobileRadioPowerStatsProcessor.
-        updateCellularBatteryStats(modemActivityInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
+        updateCellularBatteryStats(modemActivityInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                 elapsedRealtimeMs, uptimeMs);
     }
 
     private void updateCellularBatteryStats(@Nullable ModemActivityInfo deltaInfo,
-            @Nullable List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
+            @Nullable NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
             long uptimeMs) {
         // Add modem tx power to history.
         addModemTxPowerToHistory(deltaInfo, elapsedRealtimeMs, uptimeMs);
@@ -13003,7 +12938,7 @@
             long totalRxPackets = 0;
             long totalTxPackets = 0;
             if (delta != null) {
-                for (NetworkStatsDelta entry : delta) {
+                for (NetworkStats.Entry entry : delta) {
                     if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                         continue;
                     }
@@ -13044,7 +12979,7 @@
                 // Now distribute proportional blame to the apps that did networking.
                 long totalPackets = totalRxPackets + totalTxPackets;
                 if (totalPackets > 0) {
-                    for (NetworkStatsDelta entry : delta) {
+                    for (NetworkStats.Entry entry : delta) {
                         if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                             continue;
                         }
diff --git a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java
index cbd6fab..f971e2e 100644
--- a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java
@@ -38,7 +38,6 @@
 import com.android.server.power.stats.format.MobileRadioPowerStatsLayout;
 
 import java.util.Arrays;
-import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.function.LongSupplier;
@@ -71,7 +70,7 @@
     interface Observer {
         void onMobileRadioPowerStatsRetrieved(
                 @Nullable ModemActivityInfo modemActivityDelta,
-                @Nullable List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas,
+                @Nullable NetworkStats networkStatsDeltas,
                 long elapsedRealtimeMs, long uptimeMs);
     }
 
@@ -86,6 +85,8 @@
         TelephonyManager getTelephonyManager();
         LongSupplier getCallDurationSupplier();
         LongSupplier getPhoneSignalScanDurationSupplier();
+
+        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
     }
 
     private final Injector mInjector;
@@ -190,7 +191,7 @@
         mPowerStats.uidStats.clear();
 
         ModemActivityInfo modemActivityDelta = collectModemActivityInfo();
-        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
+        NetworkStats networkStatsDeltas = collectNetworkStats();
 
         mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);
 
@@ -288,17 +289,15 @@
         return deltaInfo;
     }
 
-    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
+    private NetworkStats collectNetworkStats() {
         NetworkStats networkStats = mNetworkStatsSupplier.get();
         if (networkStats == null) {
             return null;
         }
 
-        List<BatteryStatsImpl.NetworkStatsDelta> delta =
-                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
+        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
         mLastNetworkStats = networkStats;
-        for (int i = delta.size() - 1; i >= 0; i--) {
-            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
+        for (NetworkStats.Entry uidDelta : delta) {
             long rxBytes = uidDelta.getRxBytes();
             long txBytes = uidDelta.getTxBytes();
             long rxPackets = uidDelta.getRxPackets();
diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
index 1fdeac9..5440bcf 100644
--- a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java
@@ -31,7 +31,6 @@
 import com.android.server.power.stats.format.WifiPowerStatsLayout;
 
 import java.util.Arrays;
-import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
@@ -43,7 +42,7 @@
 
     interface Observer {
         void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo info,
-                List<BatteryStatsImpl.NetworkStatsDelta> delta, long elapsedRealtimeMs,
+                NetworkStats delta, long elapsedRealtimeMs,
                 long uptimeMs);
     }
 
@@ -66,6 +65,8 @@
         Supplier<NetworkStats> getWifiNetworkStatsSupplier();
         WifiManager getWifiManager();
         WifiStatsRetriever getWifiStatsRetriever();
+
+        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
     }
 
     private final Injector mInjector;
@@ -161,7 +162,7 @@
         } else {
             collectWifiActivityStats();
         }
-        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
+        NetworkStats networkStatsDeltas = collectNetworkStats();
         collectWifiScanTime();
 
         mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);
@@ -227,17 +228,15 @@
         mPowerStats.durationMs = duration;
     }
 
-    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
+    private NetworkStats collectNetworkStats() {
         NetworkStats networkStats = mNetworkStatsSupplier.get();
         if (networkStats == null) {
             return null;
         }
 
-        List<BatteryStatsImpl.NetworkStatsDelta> delta =
-                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
+        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
         mLastNetworkStats = networkStats;
-        for (int i = delta.size() - 1; i >= 0; i--) {
-            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
+        for (NetworkStats.Entry uidDelta : delta) {
             long rxBytes = uidDelta.getRxBytes();
             long txBytes = uidDelta.getTxBytes();
             long rxPackets = uidDelta.getRxPackets();
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 17a5435..9e2c00e 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -7175,7 +7175,23 @@
         @Override
         public void onHandleAppCrash(@NonNull WindowProcessController wpc) {
             synchronized (mGlobalLock) {
-                wpc.handleAppCrash();
+                final boolean hasVisibleActivity;
+                mTaskSupervisor.beginDeferResume();
+                try {
+                    hasVisibleActivity = wpc.handleAppCrash();
+                } finally {
+                    mTaskSupervisor.endDeferResume();
+                }
+
+                if (hasVisibleActivity) {
+                    deferWindowLayout();
+                    try {
+                        mRootWindowContainer.ensureVisibilityOnVisibleActivityDiedOrCrashed(
+                                "onHandleAppCrash");
+                    } finally {
+                        continueWindowLayout();
+                    }
+                }
             }
         }
 
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 98ed6f7..54ae80c 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -103,6 +103,8 @@
             // again, so that the control with leash can be eventually dispatched
             if (!mGivenInsetsReady && isServerVisible() && !givenInsetsPending
                     && mControlTarget != null) {
+                ProtoLog.d(WM_DEBUG_IME,
+                        "onPostLayout: IME control ready to be dispatched, ws=%s", ws);
                 mGivenInsetsReady = true;
                 ImeTracker.forLogging().onProgress(mStatsToken,
                         ImeTracker.PHASE_WM_POST_LAYOUT_NOTIFY_CONTROLS_CHANGED);
@@ -118,6 +120,8 @@
                         ImeTracker.PHASE_WM_POST_LAYOUT_NOTIFY_CONTROLS_CHANGED);
                 mStatsToken = null;
             } else if (wasServerVisible && !isServerVisible()) {
+                ProtoLog.d(WM_DEBUG_IME, "onPostLayout: setImeShowing(false) was: %s, ws=%s",
+                        isImeShowing(), ws);
                 setImeShowing(false);
             }
         }
@@ -621,6 +625,7 @@
             // request (cancelling the initial show) or hide request (aborting the initial show).
             logIsScheduledAndReadyToShowIme(!visible /* aborted */);
         }
+        ProtoLog.d(WM_DEBUG_IME, "receiveImeStatsToken: visible=%s", visible);
         if (visible) {
             ImeTracker.forLogging().onCancelled(
                     mStatsToken, ImeTracker.PHASE_WM_ABORT_SHOW_IME_POST_LAYOUT);
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 5929a21..f0f1b2e 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -595,7 +595,10 @@
                 }
                 final ActionChain chain = mService.mChainTracker.start("tfTransact", transition);
                 final int effects = applyTransaction(wct, -1 /* syncId */, chain, caller, deferred);
-                if (effects == TRANSACT_EFFECTS_NONE && transition.mParticipants.isEmpty()) {
+                if (effects == TRANSACT_EFFECTS_NONE && transition.mParticipants.isEmpty()
+                        // Always send the remote transition even if it is no-op because the remote
+                        // handler may still want to handle it.
+                        && remoteTransition == null) {
                     transition.abort();
                     return;
                 }
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 80e4c30..26bc09f 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -465,17 +465,22 @@
         mCrashing = crashing;
     }
 
-    void handleAppCrash() {
+    boolean handleAppCrash() {
+        boolean hasVisibleActivity = false;
         ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
         for (int i = activities.size() - 1; i >= 0; --i) {
             final ActivityRecord r = activities.get(i);
             Slog.w(TAG, "  Force finishing activity "
                     + r.mActivityComponent.flattenToShortString());
             r.detachFromProcess();
-            r.mDisplayContent.requestTransitionAndLegacyPrepare(TRANSIT_CLOSE,
-                    TRANSIT_FLAG_APP_CRASHED);
+            if (r.isVisibleRequested()) {
+                hasVisibleActivity = true;
+                r.mDisplayContent.requestTransitionAndLegacyPrepare(TRANSIT_CLOSE,
+                        TRANSIT_FLAG_APP_CRASHED);
+            }
             r.destroyIfPossible("handleAppCrashed");
         }
+        return hasVisibleActivity;
     }
 
     boolean isCrashing() {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 9ab9a8f..c5d42ad 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1787,9 +1787,11 @@
             SignedConfigService.registerUpdateReceiver(mSystemContext);
             t.traceEnd();
 
-            t.traceBegin("AppIntegrityService");
-            mSystemServiceManager.startService(AppIntegrityManagerService.class);
-            t.traceEnd();
+            if (!android.server.Flags.removeAppIntegrityManagerService()) {
+                t.traceBegin("AppIntegrityService");
+                mSystemServiceManager.startService(AppIntegrityManagerService.class);
+                t.traceEnd();
+            }
 
             t.traceBegin("StartLogcatManager");
             mSystemServiceManager.startService(LogcatManagerService.class);
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index 0d222fb..4d021ec 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -51,4 +51,11 @@
      description: "Remove GameManagerService from Wear"
      bug: "340929737"
      is_fixed_read_only: true
+}
+
+flag {
+     name: "remove_app_integrity_manager_service"
+     namespace: "package_manager_service"
+     description: "Remove AppIntegrityManagerService"
+     bug: "364200023"
 }
\ No newline at end of file
diff --git a/services/robotests/Android.bp b/services/robotests/Android.bp
index 6c4158e..8e0eb6b 100644
--- a/services/robotests/Android.bp
+++ b/services/robotests/Android.bp
@@ -63,7 +63,6 @@
 
     instrumentation_for: "FrameworksServicesLib",
 
-    upstream: true,
 
     strict_mode: false,
 }
diff --git a/services/robotests/backup/Android.bp b/services/robotests/backup/Android.bp
index 3ace3fb..95b38e5 100644
--- a/services/robotests/backup/Android.bp
+++ b/services/robotests/backup/Android.bp
@@ -66,7 +66,6 @@
 
     instrumentation_for: "BackupFrameworksServicesLib",
 
-    upstream: true,
 
     strict_mode: false,
 
diff --git a/services/tests/InputMethodSystemServerTests/Android.bp b/services/tests/InputMethodSystemServerTests/Android.bp
index e6ff506..da58aa1 100644
--- a/services/tests/InputMethodSystemServerTests/Android.bp
+++ b/services/tests/InputMethodSystemServerTests/Android.bp
@@ -86,6 +86,7 @@
         "src/com/android/server/inputmethod/**/ClientControllerTest.java",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
 
 android_test {
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 9e96800..4a09802 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -258,7 +258,6 @@
         mService.mOomAdjuster = mService.mProcessStateController.getOomAdjuster();
         mService.mOomAdjuster.mAdjSeq = 10000;
         mService.mWakefulness = new AtomicInteger(PowerManagerInternal.WAKEFULNESS_AWAKE);
-        mSetFlagsRule.enableFlags(Flags.FLAG_NEW_FGS_RESTRICTION_LOGIC);
 
         mUiTierSize = mService.mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE;
         mFirstNonUiCachedAdj = sFirstUiCachedAdj + mUiTierSize;
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerCacheTest.java b/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerCacheTest.java
index c89048a..c3706c3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerCacheTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerCacheTest.java
@@ -281,7 +281,7 @@
     }
 
     @Test
-    public void fetchDefaultCoarseningLevelIfNeeded_withDefaultValue_doesNotQueryProvider()
+    public void onDefaultCoarseningLevelNotSet_withDefaultValue_doesNotQueryProvider()
             throws RemoteException {
         // Arrange.
         ProxyPopulationDensityProvider provider = mock(ProxyPopulationDensityProvider.class);
@@ -297,14 +297,14 @@
         assertThat(cache.hasDefaultValue()).isTrue();
 
         // Act.
-        cache.fetchDefaultCoarseningLevelIfNeeded();
+        cache.onDefaultCoarseningLevelNotSet();
 
         // Assert. The method is not called again.
         verify(provider, times(1)).getDefaultCoarseningLevel(any());
     }
 
     @Test
-    public void fetchDefaultCoarseningLevelIfNeeded_withoutDefaultValue_doesQueryProvider()
+    public void onDefaultCoarseningLevelNotSet_withoutDefaultValue_doesQueryProvider()
             throws RemoteException {
         // Arrange.
         ProxyPopulationDensityProvider provider = mock(ProxyPopulationDensityProvider.class);
@@ -320,7 +320,7 @@
         assertThat(cache.hasDefaultValue()).isFalse();
 
         // Act.
-        cache.fetchDefaultCoarseningLevelIfNeeded();
+        cache.onDefaultCoarseningLevelNotSet();
 
         // Assert. The method is called again.
         verify(provider, times(2)).getDefaultCoarseningLevel(any());
@@ -383,4 +383,56 @@
         assertThat(cache.getCoarseningLevel(latlngs[size - 1][0], latlngs[size - 1][1]))
                 .isEqualTo(0);
     }
+
+    @Test
+    public void logDensityBasedLocsUsed_rateLimitsTheSecondCall() {
+        // To avoid having to mock the logger, logDensityBasedLocsUsed returns a boolean indicating
+        // if the log was successful or rate-limited.
+
+        ProxyPopulationDensityProvider provider = mock(ProxyPopulationDensityProvider.class);
+        LocationFudgerCache cache = new LocationFudgerCache(provider);
+        boolean skippedNoDefault = false;
+        boolean isCacheHit = false;
+        int defaultCoarseningLevel = 3;
+        long time1 = 0;
+        // 7 min later. Can be any value < time1 + LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS
+        long time2 = time1 + 7 * 60 * 1000;
+
+        boolean success1 = cache.logDensityBasedLocsUsed(time1, skippedNoDefault, isCacheHit,
+                defaultCoarseningLevel);
+        boolean success2 = cache.logDensityBasedLocsUsed(time2, skippedNoDefault, isCacheHit,
+                defaultCoarseningLevel);
+
+        assertThat(success1).isTrue();  // log OK
+        assertThat(success2).isFalse();  // dropped
+    }
+
+    @Test
+    public void logDensityBasedLocsUsed_rateLimitOf3rdCall_isNotAffectedByDropped2ndCall() {
+        // To avoid having to mock the logger, logDensityBasedLocsUsed returns a boolean indicating
+        // if the log was successful or rate-limited.
+
+        ProxyPopulationDensityProvider provider = mock(ProxyPopulationDensityProvider.class);
+        LocationFudgerCache cache = new LocationFudgerCache(provider);
+        boolean skippedNoDefault = false;
+        boolean isCacheHit = false;
+        int defaultCoarseningLevel = 3;
+        long time1 = 0;
+        // 7 min later. Can be any value < time1 + LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS
+        long time2 = time1 + 7 * 60 * 1000;
+        // 11 min later. Can be any value >= time1 + LOG_DENSITY_BASED_LOCS_USED_RATE_LIMIT_MS
+        long time3 = time1 + 11 * 60 * 1000;
+
+        boolean success1 = cache.logDensityBasedLocsUsed(time1, skippedNoDefault, isCacheHit,
+                defaultCoarseningLevel);
+        boolean success2 = cache.logDensityBasedLocsUsed(time2, skippedNoDefault, isCacheHit,
+                defaultCoarseningLevel);
+        boolean success3 = cache.logDensityBasedLocsUsed(time3, skippedNoDefault, isCacheHit,
+                defaultCoarseningLevel);
+
+        assertThat(success1).isTrue();  // log OK
+        assertThat(success2).isFalse();  // dropped
+        assertThat(success3).isTrue();  // log OK
+    }
+
 }
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerTest.java
index 2e4652e..f442eb6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/fudger/LocationFudgerTest.java
@@ -232,7 +232,7 @@
 
         mFudger.createCoarse(createLocation("test", mRandom));
 
-        verify(cache).fetchDefaultCoarseningLevelIfNeeded();
+        verify(cache).onDefaultCoarseningLevelNotSet();
     }
 
     @Test
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java
index 00b911b..cd3683b 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java
@@ -158,6 +158,11 @@
         public LongSupplier getPhoneSignalScanDurationSupplier() {
             return mScanDurationSupplier;
         }
+
+        @Override
+        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+            return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+        }
     };
 
     @Before
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
index 4b6fcc3..8a081f8 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java
@@ -283,6 +283,11 @@
     protected void updateBatteryPropertiesLocked() {
     }
 
+    @Override
+    protected NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+        return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+    }
+
     public static class DummyExternalStatsSync implements ExternalStatsSync {
         public int flags = 0;
 
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/NetworkStatsTestUtils.java b/services/tests/powerstatstests/src/com/android/server/power/stats/NetworkStatsTestUtils.java
new file mode 100644
index 0000000..21be654
--- /dev/null
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/NetworkStatsTestUtils.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2025 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 com.android.server.power.stats;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.NetworkStats;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NetworkStatsTestUtils {
+    /**
+     * Equivalent to NetworkStats.subtract, reimplementing the method for Ravenwood tests.
+     */
+    @NonNull
+    public static NetworkStats networkStatsDelta(@NonNull NetworkStats currentStats,
+            @Nullable NetworkStats lastStats) {
+        if (!RavenwoodRule.isOnRavenwood()) {
+            if (lastStats == null) {
+                return currentStats;
+            }
+            return currentStats.subtract(lastStats);
+        }
+
+        List<NetworkStats.Entry> entries = new ArrayList<>();
+        for (NetworkStats.Entry entry : currentStats) {
+            NetworkStats.Entry lastEntry = null;
+            int uid = entry.getUid();
+            if (lastStats != null) {
+                for (NetworkStats.Entry e : lastStats) {
+                    if (e.getUid() == uid && e.getSet() == entry.getSet()
+                            && e.getTag() == entry.getTag()
+                            && e.getMetered() == entry.getMetered()
+                            && e.getRoaming() == entry.getRoaming()
+                            && e.getDefaultNetwork() == entry.getDefaultNetwork()
+                        /*&& Objects.equals(e.getIface(), entry.getIface())*/) {
+                        lastEntry = e;
+                        break;
+                    }
+                }
+            }
+            long rxBytes, rxPackets, txBytes, txPackets;
+            if (lastEntry != null) {
+                rxBytes = Math.max(0, entry.getRxBytes() - lastEntry.getRxBytes());
+                rxPackets = Math.max(0, entry.getRxPackets() - lastEntry.getRxPackets());
+                txBytes = Math.max(0, entry.getTxBytes() - lastEntry.getTxBytes());
+                txPackets = Math.max(0, entry.getTxPackets() - lastEntry.getTxPackets());
+            } else {
+                rxBytes = entry.getRxBytes();
+                rxPackets = entry.getRxPackets();
+                txBytes = entry.getTxBytes();
+                txPackets = entry.getTxPackets();
+            }
+
+            NetworkStats.Entry uidEntry = mock(NetworkStats.Entry.class);
+            when(uidEntry.getUid()).thenReturn(uid);
+            when(uidEntry.getRxBytes()).thenReturn(rxBytes);
+            when(uidEntry.getRxPackets()).thenReturn(rxPackets);
+            when(uidEntry.getTxBytes()).thenReturn(txBytes);
+            when(uidEntry.getTxPackets()).thenReturn(txPackets);
+
+            entries.add(uidEntry);
+        }
+        NetworkStats delta = mock(NetworkStats.class);
+        when(delta.iterator()).thenAnswer(inv -> entries.iterator());
+        return delta;
+    }
+}
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java
index 8b5e6ee..a26b2c9 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java
@@ -168,6 +168,11 @@
         public WifiManager getWifiManager() {
             return mWifiManager;
         }
+
+        @Override
+        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+            return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+        }
     };
 
     @Before
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
index 4ed44a0..6acd368 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java
@@ -56,6 +56,7 @@
 import com.android.internal.os.PowerStats;
 import com.android.server.power.stats.BatteryUsageStatsRule;
 import com.android.server.power.stats.MobileRadioPowerStatsCollector;
+import com.android.server.power.stats.NetworkStatsTestUtils;
 import com.android.server.power.stats.PowerStatsCollector;
 import com.android.server.power.stats.PowerStatsUidResolver;
 import com.android.server.power.stats.format.MobileRadioPowerStatsLayout;
@@ -152,6 +153,11 @@
                 public LongSupplier getPhoneSignalScanDurationSupplier() {
                     return mScanDurationSupplier;
                 }
+
+                @Override
+                public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+                    return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+                }
             };
 
     @Before
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java
index 535f2da..a20274f 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java
@@ -43,6 +43,7 @@
 import com.android.internal.os.Clock;
 import com.android.server.power.stats.BatteryUsageStatsRule;
 import com.android.server.power.stats.MobileRadioPowerStatsCollector;
+import com.android.server.power.stats.NetworkStatsTestUtils;
 import com.android.server.power.stats.PowerStatsCollector;
 import com.android.server.power.stats.PowerStatsUidResolver;
 import com.android.server.power.stats.format.PowerStatsLayout;
@@ -135,6 +136,11 @@
                 public LongSupplier getPhoneSignalScanDurationSupplier() {
                     return mScanDurationSupplier;
                 }
+
+                @Override
+                public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+                    return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+                }
             };
 
     @Before
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
index 1e09769..bd92a84 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java
@@ -56,6 +56,7 @@
 import com.android.internal.os.PowerProfile;
 import com.android.server.power.stats.BatteryUsageStatsRule;
 import com.android.server.power.stats.MockBatteryStatsImpl;
+import com.android.server.power.stats.NetworkStatsTestUtils;
 import com.android.server.power.stats.PowerStatsCollector;
 import com.android.server.power.stats.PowerStatsUidResolver;
 import com.android.server.power.stats.WifiPowerStatsCollector;
@@ -178,6 +179,11 @@
                 public WifiStatsRetriever getWifiStatsRetriever() {
                     return mWifiStatsRetriever;
                 }
+
+                @Override
+                public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
+                    return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
+                }
             };
 
     @Before
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index 2fe6918..6411463 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -94,6 +94,7 @@
 import android.os.Message;
 import android.os.PowerManagerInternal;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.IStorageManager;
@@ -181,14 +182,12 @@
             Intent.ACTION_USER_STARTING);
 
     private static final Set<Integer> START_FOREGROUND_USER_MESSAGE_CODES = newHashSet(
-            0, // for startUserInternalOnHandler
             REPORT_USER_SWITCH_MSG,
             USER_SWITCH_TIMEOUT_MSG,
             USER_START_MSG,
             USER_CURRENT_MSG);
 
     private static final Set<Integer> START_BACKGROUND_USER_MESSAGE_CODES = newHashSet(
-            0, // for startUserInternalOnHandler
             USER_START_MSG,
             REPORT_LOCKED_BOOT_COMPLETE_MSG);
 
@@ -376,7 +375,7 @@
         // and the cascade effect goes on...). In fact, a better approach would to not assert the
         // binder calls, but their side effects (in this case, that the user is stopped right away)
         assertWithMessage("wrong binder message calls").that(mInjector.mHandler.getMessageCodes())
-                .containsExactly(/* for startUserInternalOnHandler */ 0, USER_START_MSG);
+                .containsExactly(USER_START_MSG);
     }
 
     private void startUserAssertions(
@@ -419,17 +418,12 @@
     @Test
     public void testDispatchUserSwitch() throws RemoteException {
         // Prepare mock observer and register it
-        IUserSwitchObserver observer = mock(IUserSwitchObserver.class);
-        when(observer.asBinder()).thenReturn(new Binder());
-        doAnswer(invocation -> {
-            IRemoteCallback callback = (IRemoteCallback) invocation.getArguments()[1];
-            callback.sendResult(null);
-            return null;
-        }).when(observer).onUserSwitching(anyInt(), any());
-        mUserController.registerUserSwitchObserver(observer, "mock");
+        IUserSwitchObserver observer = registerUserSwitchObserver(
+                /* replyToOnBeforeUserSwitchingCallback= */ true,
+                /* replyToOnUserSwitchingCallback= */ true);
         // Start user -- this will update state of mUserController
         mUserController.startUser(TEST_USER_ID, USER_START_MODE_FOREGROUND);
-        verify(observer, times(1)).onBeforeUserSwitching(eq(TEST_USER_ID));
+        verify(observer, times(1)).onBeforeUserSwitching(eq(TEST_USER_ID), any());
         Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
         assertNotNull(reportMsg);
         UserState userState = (UserState) reportMsg.obj;
@@ -454,13 +448,13 @@
 
     @Test
     public void testDispatchUserSwitchBadReceiver() throws RemoteException {
-        // Prepare mock observer which doesn't notify the callback and register it
-        IUserSwitchObserver observer = mock(IUserSwitchObserver.class);
-        when(observer.asBinder()).thenReturn(new Binder());
-        mUserController.registerUserSwitchObserver(observer, "mock");
+        // Prepare mock observer which doesn't notify the onUserSwitching callback and register it
+        IUserSwitchObserver observer = registerUserSwitchObserver(
+                /* replyToOnBeforeUserSwitchingCallback= */ true,
+                /* replyToOnUserSwitchingCallback= */ false);
         // Start user -- this will update state of mUserController
         mUserController.startUser(TEST_USER_ID, USER_START_MODE_FOREGROUND);
-        verify(observer, times(1)).onBeforeUserSwitching(eq(TEST_USER_ID));
+        verify(observer, times(1)).onBeforeUserSwitching(eq(TEST_USER_ID), any());
         Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
         assertNotNull(reportMsg);
         UserState userState = (UserState) reportMsg.obj;
@@ -551,7 +545,6 @@
         expectedCodes.add(REPORT_USER_SWITCH_COMPLETE_MSG);
         if (backgroundUserStopping) {
             expectedCodes.add(CLEAR_USER_JOURNEY_SESSION_MSG);
-            expectedCodes.add(0); // this is for directly posting in stopping.
         }
         if (expectScheduleBackgroundUserStopping) {
             expectedCodes.add(SCHEDULED_STOP_BACKGROUND_USER_MSG);
@@ -567,9 +560,9 @@
     @Test
     public void testDispatchUserSwitchComplete() throws RemoteException {
         // Prepare mock observer and register it
-        IUserSwitchObserver observer = mock(IUserSwitchObserver.class);
-        when(observer.asBinder()).thenReturn(new Binder());
-        mUserController.registerUserSwitchObserver(observer, "mock");
+        IUserSwitchObserver observer = registerUserSwitchObserver(
+                /* replyToOnBeforeUserSwitchingCallback= */ true,
+                /* replyToOnUserSwitchingCallback= */ true);
         // Start user -- this will update state of mUserController
         mUserController.startUser(TEST_USER_ID, USER_START_MODE_FOREGROUND);
         Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
@@ -1752,6 +1745,29 @@
         verify(mInjector, never()).onSystemUserVisibilityChanged(anyBoolean());
     }
 
+    private IUserSwitchObserver registerUserSwitchObserver(
+            boolean replyToOnBeforeUserSwitchingCallback, boolean replyToOnUserSwitchingCallback)
+            throws RemoteException {
+        IUserSwitchObserver observer = mock(IUserSwitchObserver.class);
+        when(observer.asBinder()).thenReturn(new Binder());
+        if (replyToOnBeforeUserSwitchingCallback) {
+            doAnswer(invocation -> {
+                IRemoteCallback callback = (IRemoteCallback) invocation.getArguments()[1];
+                callback.sendResult(null);
+                return null;
+            }).when(observer).onBeforeUserSwitching(anyInt(), any());
+        }
+        if (replyToOnUserSwitchingCallback) {
+            doAnswer(invocation -> {
+                IRemoteCallback callback = (IRemoteCallback) invocation.getArguments()[1];
+                callback.sendResult(null);
+                return null;
+            }).when(observer).onUserSwitching(anyInt(), any());
+        }
+        mUserController.registerUserSwitchObserver(observer, "mock");
+        return observer;
+    }
+
     // Should be public to allow mocking
     private static class TestInjector extends UserController.Injector {
         public final TestHandler mHandler;
@@ -1957,6 +1973,7 @@
          * fix this, but in the meantime, this is your warning.
          */
         private final List<Message> mMessages = new ArrayList<>();
+        private final List<Runnable> mPendingCallbacks = new ArrayList<>();
 
         TestHandler(Looper looper) {
             super(looper);
@@ -1989,14 +2006,24 @@
 
         @Override
         public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
-            Message copy = new Message();
-            copy.copyFrom(msg);
-            mMessages.add(copy);
-            if (msg.getCallback() != null) {
-                msg.getCallback().run();
+            if (msg.getCallback() == null) {
+                Message copy = new Message();
+                copy.copyFrom(msg);
+                mMessages.add(copy);
+            } else {
+                if (SystemClock.uptimeMillis() >= uptimeMillis) {
+                    msg.getCallback().run();
+                } else {
+                    mPendingCallbacks.add(msg.getCallback());
+                }
                 msg.setCallback(null);
             }
             return super.sendMessageAtTime(msg, uptimeMillis);
         }
+
+        private void runPendingCallbacks() {
+            mPendingCallbacks.forEach(Runnable::run);
+            mPendingCallbacks.clear();
+        }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 0244164..4f55111 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -887,6 +887,21 @@
                 systemAudioModeRequest_fromAudioSystem);
     }
 
+    @Test
+    public void addAndStartAction_remove() throws Exception {
+        // utilize callback test to test if addAndStartAction(action, remove)
+        TestCallback callback = new TestCallback();
+
+        mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
+        mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
+                new ArcTerminationActionFromAvr(mHdmiCecLocalDeviceAudioSystem, callback),
+                true);
+
+        mTestLooper.dispatchAll();
+        assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(
+                ArcTerminationActionFromAvr.class).size()).isEqualTo(1);
+    }
+
     private static class TestCallback extends IHdmiControlCallback.Stub {
         private final ArrayList<Integer> mCallbackResult = new ArrayList<Integer>();
 
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt b/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt
index 72fa949..085ef53b 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt
@@ -196,6 +196,8 @@
                 },
                 ActorState.INVALID_OVERLAYABLE_ACTOR_NAME withCases {
                     fun TestState.mockActor(actorUri: String) {
+                        namedActorsMap = mapOf(VALID_NAMESPACE to
+                                mapOf(VALID_ACTOR_NAME to VALID_ACTOR_PKG))
                         targetOverlayableInfo = OverlayableInfo(OVERLAYABLE_NAME, actorUri)
                     }
                     failure("wrongScheme") {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
index af7f703..b332331 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ConditionProvidersTest.java
@@ -101,9 +101,12 @@
 
         mProviders.notifyConditions("package", msi, conditionsToNotify);
 
-        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]));
-        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[1]));
-        verify(mCallback).onConditionChanged(eq(Uri.parse("c")), eq(conditionsToNotify[2]));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]),
+                eq(100));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[1]),
+                eq(100));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("c")), eq(conditionsToNotify[2]),
+                eq(100));
         verifyNoMoreInteractions(mCallback);
     }
 
@@ -121,8 +124,10 @@
 
         mProviders.notifyConditions("package", msi, conditionsToNotify);
 
-        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]));
-        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[1]));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]),
+                eq(100));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[1]),
+                eq(100));
 
         verifyNoMoreInteractions(mCallback);
     }
@@ -141,8 +146,10 @@
 
         mProviders.notifyConditions("package", msi, conditionsToNotify);
 
-        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]));
-        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[3]));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(conditionsToNotify[0]),
+                eq(100));
+        verify(mCallback).onConditionChanged(eq(Uri.parse("b")), eq(conditionsToNotify[3]),
+                eq(100));
         verifyNoMoreInteractions(mCallback);
     }
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 301165f..7885c9b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -11213,7 +11213,7 @@
         // Representative used to verify getCallingZenUser().
         mBinderService.getAutomaticZenRules();
 
-        verify(zenModeHelper).getAutomaticZenRules(eq(UserHandle.CURRENT));
+        verify(zenModeHelper).getAutomaticZenRules(eq(UserHandle.CURRENT), anyInt());
     }
 
     @Test
@@ -11225,7 +11225,7 @@
         // Representative used to verify getCallingZenUser().
         mBinderService.getAutomaticZenRules();
 
-        verify(zenModeHelper).getAutomaticZenRules(eq(Binder.getCallingUserHandle()));
+        verify(zenModeHelper).getAutomaticZenRules(eq(Binder.getCallingUserHandle()), anyInt());
     }
 
     /** Prepares for a zen-related test that uses a mocked {@link ZenModeHelper}. */
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 1884bbd..6ef078b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -291,7 +291,8 @@
 
     @Parameters(name = "{0}")
     public static List<FlagsParameterization> getParams() {
-        return FlagsParameterization.allCombinationsOf(FLAG_MODES_UI, FLAG_BACKUP_RESTORE_LOGGING);
+        return FlagsParameterization.allCombinationsOf(FLAG_MODES_UI, FLAG_BACKUP_RESTORE_LOGGING,
+                com.android.server.notification.Flags.FLAG_FIX_CALLING_UID_FROM_CPS);
     }
 
     public ZenModeHelperTest(FlagsParameterization flags) {
@@ -2617,7 +2618,7 @@
     }
 
     @Test
-    public void testSetAutomaticZenRuleState_nullPkg() {
+    public void testSetAutomaticZenRuleStateFromConditionProvider_nullPkg() {
         AutomaticZenRule zenRule = new AutomaticZenRule("name",
                 null,
                 new ComponentName(mContext.getPackageName(), "ScheduleConditionProvider"),
@@ -2627,10 +2628,9 @@
 
         String id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, null, zenRule,
                 ORIGIN_APP, "test", CUSTOM_PKG_UID);
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, zenRule.getConditionId(),
-                new Condition(zenRule.getConditionId(), "", STATE_TRUE),
-                ORIGIN_APP,
-                CUSTOM_PKG_UID);
+        mZenModeHelper.setAutomaticZenRuleStateFromConditionProvider(UserHandle.CURRENT,
+                zenRule.getConditionId(), new Condition(zenRule.getConditionId(), "", STATE_TRUE),
+                ORIGIN_APP, CUSTOM_PKG_UID);
 
         ZenModeConfig.ZenRule ruleInConfig = mZenModeHelper.mConfig.automaticRules.get(id);
         assertEquals(STATE_TRUE, ruleInConfig.condition.state);
@@ -2726,8 +2726,8 @@
                 ORIGIN_SYSTEM, "test", SYSTEM_UID);
 
         Condition condition = new Condition(sharedUri, "", STATE_TRUE);
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, sharedUri, condition,
-                ORIGIN_SYSTEM, SYSTEM_UID);
+        mZenModeHelper.setAutomaticZenRuleStateFromConditionProvider(UserHandle.CURRENT, sharedUri,
+                condition, ORIGIN_SYSTEM, SYSTEM_UID);
 
         for (ZenModeConfig.ZenRule rule : mZenModeHelper.mConfig.automaticRules.values()) {
             if (rule.id.equals(id)) {
@@ -2741,8 +2741,8 @@
         }
 
         condition = new Condition(sharedUri, "", STATE_FALSE);
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, sharedUri, condition,
-                ORIGIN_SYSTEM, SYSTEM_UID);
+        mZenModeHelper.setAutomaticZenRuleStateFromConditionProvider(UserHandle.CURRENT, sharedUri,
+                condition, ORIGIN_SYSTEM, SYSTEM_UID);
 
         for (ZenModeConfig.ZenRule rule : mZenModeHelper.mConfig.automaticRules.values()) {
             if (rule.id.equals(id)) {
@@ -2780,9 +2780,10 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(zde)
                         .build(),
-                ORIGIN_APP, "reasons", 0);
+                ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
         assertThat(savedRule.getDeviceEffects()).isEqualTo(
                 new ZenDeviceEffects.Builder()
                         .setShouldDisplayGrayscale(true)
@@ -2814,9 +2815,10 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(zde)
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         assertThat(savedRule.getDeviceEffects()).isEqualTo(zde);
     }
 
@@ -2845,7 +2847,8 @@
                 ORIGIN_USER_IN_SYSTEMUI,
                 "reasons", 0);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
 
         assertThat(savedRule.getDeviceEffects()).isEqualTo(zde);
     }
@@ -2863,7 +2866,7 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(original)
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
         ZenDeviceEffects updateFromApp = new ZenDeviceEffects.Builder()
                 .setShouldUseNightMode(true) // Good
@@ -2875,9 +2878,10 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(updateFromApp)
                         .build(),
-                ORIGIN_APP, "reasons", 0);
+                ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
         assertThat(savedRule.getDeviceEffects()).isEqualTo(
                 new ZenDeviceEffects.Builder()
                         .setShouldUseNightMode(true) // From update.
@@ -2898,7 +2902,7 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(original)
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
         ZenDeviceEffects updateFromSystem = new ZenDeviceEffects.Builder()
                 .setShouldUseNightMode(true) // Good
@@ -2908,9 +2912,10 @@
                 new AutomaticZenRule.Builder("Rule", CONDITION_ID)
                         .setDeviceEffects(updateFromSystem)
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         assertThat(savedRule.getDeviceEffects()).isEqualTo(updateFromSystem);
     }
 
@@ -2926,7 +2931,7 @@
                         .setOwner(OWNER)
                         .setDeviceEffects(original)
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
         ZenDeviceEffects updateFromUser = new ZenDeviceEffects.Builder()
                 .setShouldUseNightMode(true)
@@ -2939,9 +2944,10 @@
                 new AutomaticZenRule.Builder("Rule", CONDITION_ID)
                         .setDeviceEffects(updateFromUser)
                         .build(),
-                ORIGIN_USER_IN_SYSTEMUI, "reasons", 0);
+                ORIGIN_USER_IN_SYSTEMUI, "reasons", SYSTEM_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
 
         assertThat(savedRule.getDeviceEffects()).isEqualTo(updateFromUser);
     }
@@ -2959,15 +2965,16 @@
                                 .allowCalls(ZenPolicy.PEOPLE_TYPE_NONE) // default is stars
                                 .build())
                         .build(),
-                ORIGIN_APP, "reasons", 0);
+                ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId,
                 new AutomaticZenRule.Builder("Rule", CONDITION_ID)
                         // no zen policy
                         .build(),
-                ORIGIN_APP, "reasons", 0);
+                ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
         assertThat(savedRule.getZenPolicy().getPriorityCategoryCalls())
                 .isEqualTo(STATE_DISALLOW);
     }
@@ -2988,7 +2995,7 @@
                                 .allowReminders(true)
                                 .build())
                         .build(),
-                ORIGIN_SYSTEM, "reasons", 0);
+                ORIGIN_SYSTEM, "reasons", SYSTEM_UID);
 
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId,
                 new AutomaticZenRule.Builder("Rule", CONDITION_ID)
@@ -2996,9 +3003,10 @@
                                 .allowCalls(ZenPolicy.PEOPLE_TYPE_CONTACTS)
                                 .build())
                         .build(),
-                ORIGIN_APP, "reasons", 0);
+                ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
-        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule savedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
         assertThat(savedRule.getZenPolicy().getPriorityCategoryCalls())
                 .isEqualTo(STATE_ALLOW);  // from update
         assertThat(savedRule.getZenPolicy().getPriorityCallSenders())
@@ -4441,7 +4449,8 @@
         rule.triggerDescription = TRIGGER_DESC;
 
         mZenModeHelper.mConfig.automaticRules.put(rule.id, rule);
-        AutomaticZenRule actual = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, rule.id);
+        AutomaticZenRule actual = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, rule.id,
+                SYSTEM_UID);
 
         assertEquals(NAME, actual.getName());
         assertEquals(OWNER, actual.getOwner());
@@ -4508,16 +4517,17 @@
                 .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // Checks the name can be changed by the app because the user has not modified it.
         AutomaticZenRule azrUpdate = new AutomaticZenRule.Builder(rule)
                 .setName("NewName")
                 .build();
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate, ORIGIN_APP,
-                "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                "reason", CUSTOM_PKG_UID);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
         assertThat(rule.getName()).isEqualTo("NewName");
 
         // The user modifies some other field in the rule, which makes the rule as a whole not
@@ -4534,8 +4544,8 @@
                 .setName("NewAppName")
                 .build();
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate, ORIGIN_APP,
-                "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                "reason", CUSTOM_PKG_UID);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
         assertThat(rule.getName()).isEqualTo("NewAppName");
 
         // The user modifies the name.
@@ -4544,7 +4554,7 @@
                 .build();
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
         assertThat(rule.getName()).isEqualTo("UserProvidedName");
 
         // The app is no longer able to modify the name.
@@ -4552,8 +4562,8 @@
                 .setName("NewAppName")
                 .build();
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate, ORIGIN_APP,
-                "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                "reason", CUSTOM_PKG_UID);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
         assertThat(rule.getName()).isEqualTo("UserProvidedName");
     }
 
@@ -4568,8 +4578,9 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // Modifies the filter, icon, zen policy, and device effects
         ZenPolicy policy = new ZenPolicy.Builder(rule.getZenPolicy())
@@ -4589,7 +4600,7 @@
         // Update the rule with the AZR from origin user.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
 
         // UPDATE_ORIGIN_USER should change the bitmask and change the values.
         assertThat(rule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_PRIORITY);
@@ -4625,8 +4636,9 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // Modifies the icon, zen policy and device effects
         ZenPolicy policy = new ZenPolicy.Builder(rule.getZenPolicy())
@@ -4646,7 +4658,7 @@
         // Update the rule with the AZR from origin systemUI.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate, ORIGIN_SYSTEM,
                 "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
 
         // UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI should change the value but NOT update the bitmask.
         assertThat(rule.getIconResId()).isEqualTo(ICON_RES_ID);
@@ -4675,8 +4687,9 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         ZenPolicy policy = new ZenPolicy.Builder()
                 .allowReminders(true)
@@ -4693,7 +4706,7 @@
         // Since the rule is not already user modified, UPDATE_ORIGIN_APP can modify the rule.
         // The bitmask is not modified.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azrUpdate, ORIGIN_APP,
-                "reason", SYSTEM_UID);
+                "reason", CUSTOM_PKG_UID);
 
         ZenRule storedRule = mZenModeHelper.mConfig.automaticRules.get(ruleId);
         assertThat(storedRule.userModifiedFields).isEqualTo(0);
@@ -4717,9 +4730,9 @@
         // Zen rule update coming from the app again. This cannot fully update the rule, because
         // the rule is already considered user modified.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleIdUser, azrUpdate, ORIGIN_APP,
-                "reason", SYSTEM_UID);
+                "reason", CUSTOM_PKG_UID);
         AutomaticZenRule ruleUser = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                ruleIdUser);
+                ruleIdUser, CUSTOM_PKG_UID);
 
         // The app can only change the value if the rule is not already user modified,
         // so the rule is not changed, and neither is the bitmask.
@@ -4749,8 +4762,9 @@
                         .build())
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // The values are modified but the bitmask is not.
         assertThat(rule.getZenPolicy().getPriorityCategoryReminders())
@@ -4771,7 +4785,7 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
 
         AutomaticZenRule azr = new AutomaticZenRule.Builder(azrBase)
                 // Sets Device Effects to null
@@ -4781,8 +4795,9 @@
         // Zen rule update coming from app, but since the rule isn't already
         // user modified, it can be updated.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azr, ORIGIN_APP, "reason",
-                SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // When AZR's ZenDeviceEffects is null, the updated rule's device effects are kept.
         assertThat(rule.getDeviceEffects()).isEqualTo(zde);
@@ -4797,8 +4812,7 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
 
         AutomaticZenRule azr = new AutomaticZenRule.Builder(azrBase)
                 // Set zen policy to null
@@ -4808,8 +4822,9 @@
         // Zen rule update coming from app, but since the rule isn't already
         // user modified, it can be updated.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azr, ORIGIN_APP, "reason",
-                SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // When AZR's ZenPolicy is null, we expect the updated rule's policy to be unchanged
         // (equivalent to the provided policy, with additional fields filled in with defaults).
@@ -4829,8 +4844,7 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
 
         // Create a fully populated ZenPolicy.
         ZenPolicy policy = new ZenPolicy.Builder()
@@ -4860,7 +4874,8 @@
         // Default config defined in getDefaultConfigParser() is used as the original rule.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azr,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         // New ZenPolicy differs from the default config
         assertThat(rule.getZenPolicy()).isNotNull();
@@ -4890,8 +4905,9 @@
                 .build();
         // Adds the rule using the app, to avoid having any user modified bits set.
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", SYSTEM_UID);
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+                mContext.getPackageName(), azrBase, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
 
         ZenDeviceEffects deviceEffects = new ZenDeviceEffects.Builder()
                 .setShouldDisplayGrayscale(true)
@@ -4903,7 +4919,7 @@
         // Applies the update to the rule.
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, azr,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
-        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID);
 
         // New ZenDeviceEffects is used; all fields considered set, since previously were null.
         assertThat(rule.getDeviceEffects()).isNotNull();
@@ -5286,7 +5302,8 @@
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, update,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
 
-        AutomaticZenRule result = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule result = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         assertThat(result).isNotNull();
         assertThat(result.getOwner().getClassName()).isEqualTo("brand.new.cps");
     }
@@ -5306,7 +5323,8 @@
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId, update,
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
 
-        AutomaticZenRule result = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule result = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID);
         assertThat(result).isNotNull();
         assertThat(result.getOwner().getClassName()).isEqualTo("old.third.party.cps");
     }
@@ -5518,8 +5536,8 @@
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(), rule, ORIGIN_APP, "add it", CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId).getCreationTime())
-                .isEqualTo(1000);
+        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID).getCreationTime()).isEqualTo(1000);
 
         // User customizes it.
         AutomaticZenRule userUpdate = new AutomaticZenRule.Builder(rule)
@@ -5546,7 +5564,7 @@
         // - ZenPolicy is the one that the user had set.
         // - rule still has the user-modified fields.
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getCreationTime()).isEqualTo(1000); // And not 3000.
         assertThat(newRuleId).isEqualTo(ruleId);
         assertThat(finalRule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_ALARMS);
@@ -5575,8 +5593,8 @@
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(), rule, ORIGIN_APP, "add it", CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId).getCreationTime())
-                .isEqualTo(1000);
+        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID).getCreationTime()).isEqualTo(1000);
 
         // App deletes it.
         mTestClock.advanceByMillis(1000);
@@ -5592,7 +5610,7 @@
 
         // Verify that the rule was recreated. This means id and creation time are new.
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getCreationTime()).isEqualTo(3000);
         assertThat(newRuleId).isNotEqualTo(ruleId);
     }
@@ -5609,8 +5627,8 @@
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(), rule, ORIGIN_APP, "add it", CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId).getCreationTime())
-                .isEqualTo(1000);
+        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID)
+                .getCreationTime()).isEqualTo(1000);
 
         // User customizes it.
         mTestClock.advanceByMillis(1000);
@@ -5637,7 +5655,7 @@
         // Verify that the rule was recreated. This means id and creation time are new, and the rule
         // matches the latest data supplied to addAZR.
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getCreationTime()).isEqualTo(4000);
         assertThat(newRuleId).isNotEqualTo(ruleId);
         assertThat(finalRule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_PRIORITY);
@@ -5660,8 +5678,8 @@
                 .build();
         String ruleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(), rule, ORIGIN_APP, "add it", CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId).getCreationTime())
-                .isEqualTo(1000);
+        assertThat(mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                CUSTOM_PKG_UID).getCreationTime()).isEqualTo(1000);
 
         // User customizes it.
         mTestClock.advanceByMillis(1000);
@@ -5686,7 +5704,7 @@
 
         // Verify that the rule was recreated. This means id and creation time are new.
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getCreationTime()).isEqualTo(4000);
         assertThat(newRuleId).isNotEqualTo(ruleId);
     }
@@ -5728,7 +5746,7 @@
         // Verify that the rule was NOT restored:
         assertThat(newRuleId).isNotEqualTo(ruleId);
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_ALARMS);
         assertThat(finalRule.getOwner()).isEqualTo(new ComponentName("second", "owner"));
 
@@ -5869,7 +5887,7 @@
         // The rule is restored...
         assertThat(newRuleId).isEqualTo(ruleId);
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_ALARMS);
 
         // ... but it is NOT active
@@ -5923,7 +5941,7 @@
         // The rule is restored...
         assertThat(newRuleId).isEqualTo(ruleId);
         AutomaticZenRule finalRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                newRuleId);
+                newRuleId, CUSTOM_PKG_UID);
         assertThat(finalRule.getInterruptionFilter()).isEqualTo(INTERRUPTION_FILTER_ALARMS);
 
         // ... but it is NEITHER active NOR snoozed.
@@ -6005,22 +6023,22 @@
                 ORIGIN_APP, "reasons", CUSTOM_PKG_UID);
 
         // Null condition -> STATE_FALSE
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id))
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id, CUSTOM_PKG_UID))
                 .isEqualTo(Condition.STATE_FALSE);
 
         mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id, CONDITION_TRUE, ORIGIN_APP,
                 CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id))
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id, CUSTOM_PKG_UID))
                 .isEqualTo(Condition.STATE_TRUE);
 
         mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id, CONDITION_FALSE, ORIGIN_APP,
                 CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id))
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id, CUSTOM_PKG_UID))
                 .isEqualTo(Condition.STATE_FALSE);
 
         mZenModeHelper.removeAutomaticZenRule(UserHandle.CURRENT, id, ORIGIN_APP, "",
                 CUSTOM_PKG_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id))
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, id, CUSTOM_PKG_UID))
                 .isEqualTo(Condition.STATE_UNKNOWN);
     }
 
@@ -6036,8 +6054,8 @@
         mZenModeHelper.setConfig(config, null, ORIGIN_INIT, "", SYSTEM_UID);
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_ALARMS);
 
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, "systemRule"))
-                .isEqualTo(Condition.STATE_UNKNOWN);
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, "systemRule",
+                CUSTOM_PKG_UID)).isEqualTo(Condition.STATE_UNKNOWN);
     }
 
     @Test
@@ -6063,7 +6081,7 @@
 
     @Test
     @EnableFlags(FLAG_MODES_API)
-    public void setAutomaticZenRuleState_conditionForNotOwnedRule_ignored() {
+    public void setAutomaticZenRuleStateFromConditionProvider_conditionForNotOwnedRule_ignored() {
         // Assume existence of an other-package-owned rule that is currently ACTIVE.
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
         ZenRule otherRule = newZenRule("another.package", Instant.now(), null);
@@ -6075,7 +6093,8 @@
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_ALARMS);
 
         // Should be ignored.
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, otherRule.conditionId,
+        mZenModeHelper.setAutomaticZenRuleStateFromConditionProvider(UserHandle.CURRENT,
+                otherRule.conditionId,
                 new Condition(otherRule.conditionId, "off", Condition.STATE_FALSE),
                 ORIGIN_APP, CUSTOM_PKG_UID);
 
@@ -6182,7 +6201,8 @@
                 .isEqualTo(ZEN_MODE_IMPORTANT_INTERRUPTIONS);
 
         // From user, update that rule's interruption filter.
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         AutomaticZenRule userUpdateRule = new AutomaticZenRule.Builder(rule)
                 .setInterruptionFilter(INTERRUPTION_FILTER_ALARMS)
                 .build();
@@ -6214,7 +6234,8 @@
                 .isEqualTo(ZEN_MODE_IMPORTANT_INTERRUPTIONS);
 
         // From user, update something in that rule, but not the interruption filter.
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         AutomaticZenRule userUpdateRule = new AutomaticZenRule.Builder(rule)
                 .setName("Renamed")
                 .build();
@@ -6315,7 +6336,8 @@
         String ruleId = ZenModeConfig.implicitRuleId(mContext.getPackageName());
 
         // User chooses a new name.
-        AutomaticZenRule azr = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule azr = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId,
                 new AutomaticZenRule.Builder(azr).setName("User chose this").build(),
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
@@ -6414,7 +6436,8 @@
                 mZenModeHelper.mConfig.getZenPolicy()).allowMedia(true).build();
 
         // From user, update that rule's policy.
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         ZenPolicy userUpdateZenPolicy = new ZenPolicy.Builder().disallowAllSounds()
                 .allowAlarms(true).build();
         AutomaticZenRule userUpdateRule = new AutomaticZenRule.Builder(rule)
@@ -6456,7 +6479,8 @@
                 mZenModeHelper.mConfig.getZenPolicy()).allowMedia(true).build();
 
         // From user, update something in that rule, but not the ZenPolicy.
-        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule rule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         AutomaticZenRule userUpdateRule = new AutomaticZenRule.Builder(rule)
                 .setName("Rule renamed, not touching policy")
                 .build();
@@ -6509,7 +6533,8 @@
         String ruleId = ZenModeConfig.implicitRuleId(mContext.getPackageName());
 
         // User chooses a new name.
-        AutomaticZenRule azr = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId);
+        AutomaticZenRule azr = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT, ruleId,
+                SYSTEM_UID);
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, ruleId,
                 new AutomaticZenRule.Builder(azr).setName("User chose this").build(),
                 ORIGIN_USER_IN_SYSTEMUI, "reason", SYSTEM_UID);
@@ -6645,7 +6670,7 @@
                 new AutomaticZenRule.Builder("Rule", CONDITION_ID).setIconResId(resourceId).build(),
                 ORIGIN_APP, "reason", CUSTOM_PKG_UID);
         AutomaticZenRule storedRule = mZenModeHelper.getAutomaticZenRule(UserHandle.CURRENT,
-                ruleId);
+                ruleId, CUSTOM_PKG_UID);
 
         assertThat(storedRule.getIconResId()).isEqualTo(0);
     }
@@ -7087,8 +7112,8 @@
                 ORIGIN_USER_IN_SYSTEMUI, SYSTEM_UID);
 
         implicitRule = getZenRule(implicitRuleId(CUSTOM_PKG_NAME));
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, implicitRule.id))
-                .isEqualTo(STATE_TRUE);
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, implicitRule.id,
+                CUSTOM_PKG_UID)).isEqualTo(STATE_TRUE);
         assertThat(implicitRule.isActive()).isTrue();
         assertThat(implicitRule.getConditionOverride()).isEqualTo(OVERRIDE_NONE);
     }
@@ -7108,8 +7133,8 @@
                 ORIGIN_USER_IN_SYSTEMUI, SYSTEM_UID);
 
         implicitRule = getZenRule(implicitRuleId(CUSTOM_PKG_NAME));
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, implicitRule.id))
-                .isEqualTo(STATE_FALSE);
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, implicitRule.id,
+                CUSTOM_PKG_UID)).isEqualTo(STATE_FALSE);
         assertThat(implicitRule.isActive()).isFalse();
         assertThat(implicitRule.getConditionOverride()).isEqualTo(OVERRIDE_NONE);
     }
@@ -7177,7 +7202,7 @@
         mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleId,
                 new Condition(rule.getConditionId(), "manual-on", STATE_TRUE, SOURCE_USER_ACTION),
                 ORIGIN_USER_IN_SYSTEMUI, SYSTEM_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId))
+        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId, SYSTEM_UID))
                 .isEqualTo(STATE_TRUE);
         ZenRule zenRule = mZenModeHelper.mConfig.automaticRules.get(ruleId);
         assertThat(zenRule.getConditionOverride()).isEqualTo(OVERRIDE_ACTIVATE);
@@ -7192,14 +7217,14 @@
         mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null);
 
         if (Flags.modesUi()) {
-            assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId))
-                    .isEqualTo(STATE_TRUE);
+            assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId,
+                    SYSTEM_UID)).isEqualTo(STATE_TRUE);
             zenRule = mZenModeHelper.mConfig.automaticRules.get(ruleId);
             assertThat(zenRule.getConditionOverride()).isEqualTo(OVERRIDE_ACTIVATE);
             assertThat(zenRule.condition).isNull();
         } else {
-            assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId))
-                    .isEqualTo(STATE_FALSE);
+            assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId,
+                    SYSTEM_UID)).isEqualTo(STATE_FALSE);
         }
     }
 
@@ -7218,7 +7243,8 @@
         mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, ruleId,
                 new Condition(rule.getConditionId(), "snooze", STATE_FALSE, SOURCE_USER_ACTION),
                 ORIGIN_USER_IN_SYSTEMUI, SYSTEM_UID);
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId))
+        assertThat(
+                mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID))
                 .isEqualTo(STATE_FALSE);
         ZenRule zenRule = mZenModeHelper.mConfig.automaticRules.get(ruleId);
         assertThat(zenRule.getConditionOverride()).isEqualTo(OVERRIDE_DEACTIVATE);
@@ -7232,7 +7258,8 @@
         TypedXmlPullParser parser = getParserForByteStream(xmlBytes);
         mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null);
 
-        assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId))
+        assertThat(
+                mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId, CUSTOM_PKG_UID))
                 .isEqualTo(STATE_TRUE);
         zenRule = mZenModeHelper.mConfig.automaticRules.get(ruleId);
         assertThat(zenRule.getConditionOverride()).isEqualTo(OVERRIDE_NONE);
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index b6e393d..03d9042 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -342,8 +342,8 @@
     public void testCancelRemoteAnimationWhenFreeze() {
         final DisplayContent dc = createNewDisplay(Display.STATE_ON);
         doReturn(false).when(dc).onDescendantOrientationChanged(any());
-        final WindowState exitingAppWindow = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
-                dc, "exiting app");
+        final WindowState exitingAppWindow = newWindowBuilder("exiting app",
+                TYPE_BASE_APPLICATION).setDisplay(dc).build();
         final ActivityRecord exitingActivity = exitingAppWindow.mActivityRecord;
         // Wait until everything in animation handler get executed to prevent the exiting window
         // from being removed during WindowSurfacePlacer Traversal.
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
index 14276ae..7033d79 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
@@ -266,10 +266,10 @@
         mSetFlagsRule.enableFlags(Flags.FLAG_WAIT_FOR_TRANSITION_ON_DISPLAY_SWITCH);
         prepareSecondaryDisplay();
 
-        final WindowState defaultDisplayWindow = createWindow(/* parent= */ null,
-                TYPE_BASE_APPLICATION, mDisplayContent, "DefaultDisplayWindow");
-        final WindowState secondaryDisplayWindow = createWindow(/* parent= */ null,
-                TYPE_BASE_APPLICATION, mSecondaryDisplayContent, "SecondaryDisplayWindow");
+        final WindowState defaultDisplayWindow = newWindowBuilder("DefaultDisplayWindow",
+                TYPE_BASE_APPLICATION).setDisplay(mDisplayContent).build();
+        final WindowState secondaryDisplayWindow = newWindowBuilder("SecondaryDisplayWindow",
+                TYPE_BASE_APPLICATION).setDisplay(mSecondaryDisplayContent).build();
         makeWindowVisibleAndNotDrawn(defaultDisplayWindow, secondaryDisplayWindow);
 
         // Mark as display switching only for the default display as we filter out
diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
index bd15bc4..347d1bc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
@@ -379,13 +379,11 @@
         assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mDisplay);
         assertThat(mDisplay.findAreaForTokenInLayer(imeToken)).isEqualTo(imeContainer);
 
-        final WindowState firstActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
-                        "firstActivityWin");
+        final WindowState firstActivityWin = newWindowBuilder("firstActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mFirstActivity).build();
         spyOn(firstActivityWin);
-        final WindowState secondActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mSecondActivity,
-                        "firstActivityWin");
+        final WindowState secondActivityWin = newWindowBuilder("secondActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mSecondActivity).build();
         spyOn(secondActivityWin);
 
         // firstActivityWin should be the target
@@ -424,13 +422,11 @@
         setupImeWindow();
         final DisplayArea.Tokens imeContainer = mDisplay.getImeContainer();
         final WindowToken imeToken = tokenOfType(TYPE_INPUT_METHOD);
-        final WindowState firstActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
-                        "firstActivityWin");
+        final WindowState firstActivityWin = newWindowBuilder("firstActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mFirstActivity).build();
         spyOn(firstActivityWin);
-        final WindowState secondActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mSecondActivity,
-                        "secondActivityWin");
+        final WindowState secondActivityWin = newWindowBuilder("secondActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mSecondActivity).build();
         spyOn(secondActivityWin);
 
         // firstActivityWin should be the target
@@ -464,9 +460,8 @@
         assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mDisplay);
         assertThat(mDisplay.findAreaForTokenInLayer(imeToken)).isEqualTo(imeContainer);
 
-        final WindowState firstActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
-                        "firstActivityWin");
+        final WindowState firstActivityWin = newWindowBuilder("firstActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mFirstActivity).build();
         spyOn(firstActivityWin);
         // firstActivityWin should be the target
         doReturn(true).when(firstActivityWin).canBeImeTarget();
@@ -499,9 +494,8 @@
         assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mDisplay);
 
         // firstActivityWin should be the target
-        final WindowState firstActivityWin =
-                createWindow(null /* parent */, TYPE_APPLICATION_STARTING, mFirstActivity,
-                        "firstActivityWin");
+        final WindowState firstActivityWin = newWindowBuilder("firstActivityWin",
+                TYPE_APPLICATION_STARTING).setWindowToken(mFirstActivity).build();
         spyOn(firstActivityWin);
         doReturn(true).when(firstActivityWin).canBeImeTarget();
         WindowState imeTarget = mDisplay.computeImeTarget(true /* updateImeTarget */);
@@ -560,8 +554,8 @@
     }
 
     private void setupImeWindow() {
-        final WindowState imeWindow = createWindow(null /* parent */,
-                TYPE_INPUT_METHOD, mDisplay, "mImeWindow");
+        final WindowState imeWindow = newWindowBuilder("mImeWindow", TYPE_INPUT_METHOD).setDisplay(
+                mDisplay).build();
         imeWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
         mDisplay.mInputMethodWindow = imeWindow;
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
index dc4adcc..2997173 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
@@ -878,8 +878,10 @@
                 .build();
         final ActivityRecord activity0 = tf0.getTopMostActivity();
         final ActivityRecord activity1 = tf1.getTopMostActivity();
-        final WindowState win0 = createWindow(null, TYPE_BASE_APPLICATION, activity0, "win0");
-        final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity1, "win1");
+        final WindowState win0 = newWindowBuilder("win0", TYPE_BASE_APPLICATION).setWindowToken(
+                activity0).build();
+        final WindowState win1 = newWindowBuilder("win1", TYPE_BASE_APPLICATION).setWindowToken(
+                activity1).build();
         doReturn(false).when(mDisplayContent).shouldImeAttachedToApp();
 
         mDisplayContent.setImeInputTarget(win0);
@@ -1174,8 +1176,8 @@
     }
 
     private WindowState createAppWindow(ActivityRecord app, String name) {
-        final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, app, name,
-                0 /* ownerId */, false /* ownerCanAddInternalSystemWindow */, new TestIWindow());
+        final WindowState win = newWindowBuilder(name, TYPE_BASE_APPLICATION).setWindowToken(
+                app).setClientWindow(new TestIWindow()).build();
         mWm.mWindowMap.put(win.mClient.asBinder(), win);
         return win;
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
index f145b40..f9250f9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
@@ -63,7 +63,7 @@
 
     @Test
     public void testAppRemoved() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mCache.putSnapshot(window.getTask(), createSnapshot());
         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
         mCache.onAppRemoved(window.mActivityRecord);
@@ -72,7 +72,7 @@
 
     @Test
     public void testAppDied() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mCache.putSnapshot(window.getTask(), createSnapshot());
         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
         mCache.onAppDied(window.mActivityRecord);
@@ -81,7 +81,7 @@
 
     @Test
     public void testTaskRemoved() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mCache.putSnapshot(window.getTask(), createSnapshot());
         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
         mCache.onIdRemoved(window.getTask().mTaskId);
@@ -90,7 +90,7 @@
 
     @Test
     public void testReduced_notCached() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot());
         mSnapshotPersistQueue.waitForQueueEmpty();
         assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
@@ -105,7 +105,7 @@
 
     @Test
     public void testRestoreFromDisk() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot());
         mSnapshotPersistQueue.waitForQueueEmpty();
         assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
@@ -117,7 +117,7 @@
 
     @Test
     public void testClearCache() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mCache.putSnapshot(window.getTask(), mSnapshot);
         assertEquals(mSnapshot, mCache.getSnapshot(window.getTask().mTaskId,
                 false /* isLowResolution */));
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
index c6b2a6b..1bca53a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -74,8 +74,8 @@
 
     @Test
     public void testGetClosingApps_closing() {
-        final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
-                "closingWindow");
+        final WindowState closingWindow = newWindowBuilder("closingWindow",
+                FIRST_APPLICATION_WINDOW).build();
         closingWindow.mActivityRecord.commitVisibility(
                 false /* visible */, true /* performLayout */);
         final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
@@ -88,8 +88,8 @@
 
     @Test
     public void testGetClosingApps_notClosing() {
-        final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
-                "closingWindow");
+        final WindowState closingWindow = newWindowBuilder("closingWindow",
+                FIRST_APPLICATION_WINDOW).build();
         final WindowState openingWindow = createAppWindow(closingWindow.getTask(),
                 FIRST_APPLICATION_WINDOW, "openingWindow");
         closingWindow.mActivityRecord.commitVisibility(
@@ -105,8 +105,8 @@
 
     @Test
     public void testGetClosingApps_skipClosingAppsSnapshotTasks() {
-        final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
-                "closingWindow");
+        final WindowState closingWindow = newWindowBuilder("closingWindow",
+                FIRST_APPLICATION_WINDOW).build();
         closingWindow.mActivityRecord.commitVisibility(
                 false /* visible */, true /* performLayout */);
         final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
@@ -133,19 +133,19 @@
 
     @Test
     public void testGetSnapshotMode() {
-        final WindowState disabledWindow = createWindow(null,
-                FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
+        final WindowState disabledWindow = newWindowBuilder("disabledWindow",
+                FIRST_APPLICATION_WINDOW).setDisplay(mDisplayContent).build();
         disabledWindow.mActivityRecord.setRecentsScreenshotEnabled(false);
         assertEquals(SNAPSHOT_MODE_APP_THEME,
                 mWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
 
-        final WindowState normalWindow = createWindow(null,
-                FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
+        final WindowState normalWindow = newWindowBuilder("normalWindow",
+                FIRST_APPLICATION_WINDOW).setDisplay(mDisplayContent).build();
         assertEquals(SNAPSHOT_MODE_REAL,
                 mWm.mTaskSnapshotController.getSnapshotMode(normalWindow.getTask()));
 
-        final WindowState secureWindow = createWindow(null,
-                FIRST_APPLICATION_WINDOW, mDisplayContent, "secureWindow");
+        final WindowState secureWindow = newWindowBuilder("secureWindow",
+                FIRST_APPLICATION_WINDOW).setDisplay(mDisplayContent).build();
         secureWindow.mAttrs.flags |= FLAG_SECURE;
         assertEquals(SNAPSHOT_MODE_APP_THEME,
                 mWm.mTaskSnapshotController.getSnapshotMode(secureWindow.getTask()));
@@ -297,8 +297,8 @@
         spyOn(mWm.mTaskSnapshotController);
         doReturn(false).when(mWm.mTaskSnapshotController).shouldDisableSnapshots();
 
-        final WindowState normalWindow = createWindow(null,
-                FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
+        final WindowState normalWindow = newWindowBuilder("normalWindow",
+                FIRST_APPLICATION_WINDOW).setDisplay(mDisplayContent).build();
         final TaskSnapshot snapshot = new TaskSnapshotPersisterTestBase.TaskSnapshotBuilder()
                 .setTopActivityComponent(normalWindow.mActivityRecord.mActivityComponent).build();
         doReturn(snapshot).when(mWm.mTaskSnapshotController).snapshot(any());
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
index 9bde066..51ea498 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
@@ -41,7 +41,7 @@
  * Test class for {@link TaskSnapshotPersister} and {@link AppSnapshotLoader}
  *
  * Build/Install/Run:
- * atest TaskSnapshotPersisterLoaderTest
+ * atest TaskSnapshotLowResDisabledTest
  */
 @MediumTest
 @Presubmit
@@ -126,7 +126,7 @@
 
     @Test
     public void testReduced_notCached() {
-        final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
+        final WindowState window = newWindowBuilder("window", FIRST_APPLICATION_WINDOW).build();
         mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot());
         mSnapshotPersistQueue.waitForQueueEmpty();
         assertNull(mCache.getSnapshot(window.getTask().mTaskId, false /* isLowResolution */));
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 1fa6578..5ed2df3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -504,8 +504,8 @@
         assertTrue(child.isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION));
         assertFalse(child.isAnimating(PARENTS, ANIMATION_TYPE_SCREEN_ROTATION));
 
-        final WindowState windowState = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
-                mDisplayContent, "TestWindowState");
+        final WindowState windowState = newWindowBuilder("TestWindowState",
+                TYPE_BASE_APPLICATION).setDisplay(mDisplayContent).build();
         WindowContainer parent = windowState.getParent();
         spyOn(windowState.mSurfaceAnimator);
         doReturn(true).when(windowState.mSurfaceAnimator).isAnimating();
@@ -1045,8 +1045,8 @@
 
         // An animating window with mRemoveOnExit can be removed by handleCompleteDeferredRemoval
         // once it no longer animates.
-        final WindowState exitingWindow = createWindow(null, TYPE_APPLICATION_OVERLAY,
-                displayContent, "exiting window");
+        final WindowState exitingWindow = newWindowBuilder("exiting window",
+                TYPE_APPLICATION_OVERLAY).setDisplay(displayContent).build();
         exitingWindow.startAnimation(exitingWindow.getPendingTransaction(),
                 mock(AnimationAdapter.class), false /* hidden */,
                 SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION);
@@ -1063,7 +1063,7 @@
         final ActivityRecord r = new TaskBuilder(mSupervisor).setCreateActivity(true)
                 .setDisplay(displayContent).build().getTopMostActivity();
         // Add a window and make the activity animating so the removal of activity is deferred.
-        createWindow(null, TYPE_BASE_APPLICATION, r, "win");
+        newWindowBuilder("win", TYPE_BASE_APPLICATION).setWindowToken(r).build();
         doReturn(true).when(r).isAnimating(anyInt(), anyInt());
 
         displayContent.remove();
@@ -1216,7 +1216,8 @@
     public void testFreezeInsets() {
         final Task task = createTask(mDisplayContent);
         final ActivityRecord activity = createActivityRecord(mDisplayContent, task);
-        final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, activity, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_BASE_APPLICATION).setWindowToken(
+                activity).build();
 
         // Set visibility to false, verify the main window of the task will be set the frozen
         // insets state immediately.
@@ -1233,7 +1234,8 @@
         final Task rootTask = createTask(mDisplayContent);
         final Task task = createTaskInRootTask(rootTask, 0 /* userId */);
         final ActivityRecord activity = createActivityRecord(mDisplayContent, task);
-        final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, activity, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_BASE_APPLICATION).setWindowToken(
+                activity).build();
         task.getDisplayContent().prepareAppTransition(TRANSIT_CLOSE);
         spyOn(win);
         doReturn(true).when(task).okToAnimate();
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
index 72935cb..8606581 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
@@ -49,9 +49,10 @@
     @SetupWindows(addWindows = { W_DOCK_DIVIDER, W_INPUT_METHOD })
     @Test
     public void testDockedDividerPosition() {
-        final WindowState splitScreenWindow = createWindow(null,
-                WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION,
-                mDisplayContent, "splitScreenWindow");
+        final WindowState splitScreenWindow = newWindowBuilder("splitScreenWindow",
+                TYPE_BASE_APPLICATION).setWindowingMode(
+                WINDOWING_MODE_MULTI_WINDOW).setActivityType(ACTIVITY_TYPE_STANDARD).setDisplay(
+                mDisplayContent).build();
 
         mDisplayContent.setImeLayeringTarget(splitScreenWindow);
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 50e0e18..513ba1d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -154,9 +154,11 @@
 
     @Test
     public void testIsParentWindowHidden() {
-        final WindowState parentWindow = createWindow(null, TYPE_APPLICATION, "parentWindow");
-        final WindowState child1 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child1");
-        final WindowState child2 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child2");
+        final WindowState parentWindow = newWindowBuilder("parentWindow", TYPE_APPLICATION).build();
+        final WindowState child1 = newWindowBuilder("child1", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
+        final WindowState child2 = newWindowBuilder("child2", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
 
         // parentWindow is initially set to hidden.
         assertTrue(parentWindow.mHidden);
@@ -172,10 +174,12 @@
 
     @Test
     public void testIsChildWindow() {
-        final WindowState parentWindow = createWindow(null, TYPE_APPLICATION, "parentWindow");
-        final WindowState child1 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child1");
-        final WindowState child2 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child2");
-        final WindowState randomWindow = createWindow(null, TYPE_APPLICATION, "randomWindow");
+        final WindowState parentWindow = newWindowBuilder("parentWindow", TYPE_APPLICATION).build();
+        final WindowState child1 = newWindowBuilder("child1", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
+        final WindowState child2 = newWindowBuilder("child2", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
+        final WindowState randomWindow = newWindowBuilder("randomWindow", TYPE_APPLICATION).build();
 
         assertFalse(parentWindow.isChildWindow());
         assertTrue(child1.isChildWindow());
@@ -185,12 +189,15 @@
 
     @Test
     public void testHasChild() {
-        final WindowState win1 = createWindow(null, TYPE_APPLICATION, "win1");
-        final WindowState win11 = createWindow(win1, FIRST_SUB_WINDOW, "win11");
-        final WindowState win12 = createWindow(win1, FIRST_SUB_WINDOW, "win12");
-        final WindowState win2 = createWindow(null, TYPE_APPLICATION, "win2");
-        final WindowState win21 = createWindow(win2, FIRST_SUB_WINDOW, "win21");
-        final WindowState randomWindow = createWindow(null, TYPE_APPLICATION, "randomWindow");
+        final WindowState win1 = newWindowBuilder("win1", TYPE_APPLICATION).build();
+        final WindowState win11 = newWindowBuilder("win11", FIRST_SUB_WINDOW).setParent(
+                win1).build();
+        final WindowState win12 = newWindowBuilder("win12", FIRST_SUB_WINDOW).setParent(
+                win1).build();
+        final WindowState win2 = newWindowBuilder("win2", TYPE_APPLICATION).build();
+        final WindowState win21 = newWindowBuilder("win21", FIRST_SUB_WINDOW).setParent(
+                win2).build();
+        final WindowState randomWindow = newWindowBuilder("randomWindow", TYPE_APPLICATION).build();
 
         assertTrue(win1.hasChild(win11));
         assertTrue(win1.hasChild(win12));
@@ -206,9 +213,11 @@
 
     @Test
     public void testGetParentWindow() {
-        final WindowState parentWindow = createWindow(null, TYPE_APPLICATION, "parentWindow");
-        final WindowState child1 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child1");
-        final WindowState child2 = createWindow(parentWindow, FIRST_SUB_WINDOW, "child2");
+        final WindowState parentWindow = newWindowBuilder("parentWindow", TYPE_APPLICATION).build();
+        final WindowState child1 = newWindowBuilder("child1", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
+        final WindowState child2 = newWindowBuilder("child2", FIRST_SUB_WINDOW).setParent(
+                parentWindow).build();
 
         assertNull(parentWindow.getParentWindow());
         assertEquals(parentWindow, child1.getParentWindow());
@@ -217,8 +226,8 @@
 
     @Test
     public void testOverlayWindowHiddenWhenSuspended() {
-        final WindowState overlayWindow = spy(createWindow(null, TYPE_APPLICATION_OVERLAY,
-                "overlayWindow"));
+        final WindowState overlayWindow = spy(
+                newWindowBuilder("overlayWindow", TYPE_APPLICATION_OVERLAY).build());
         overlayWindow.setHiddenWhileSuspended(true);
         verify(overlayWindow).hide(true /* doAnimation */, true /* requestAnim */);
         overlayWindow.setHiddenWhileSuspended(false);
@@ -227,9 +236,11 @@
 
     @Test
     public void testGetTopParentWindow() {
-        final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
-        final WindowState child1 = createWindow(root, FIRST_SUB_WINDOW, "child1");
-        final WindowState child2 = createWindow(child1, FIRST_SUB_WINDOW, "child2");
+        final WindowState root = newWindowBuilder("root", TYPE_APPLICATION).build();
+        final WindowState child1 = newWindowBuilder("child1", FIRST_SUB_WINDOW).setParent(
+                root).build();
+        final WindowState child2 = newWindowBuilder("child2", FIRST_SUB_WINDOW).setParent(
+                child1).build();
 
         assertEquals(root, root.getTopParentWindow());
         assertEquals(root, child1.getTopParentWindow());
@@ -244,7 +255,7 @@
 
     @Test
     public void testIsOnScreen_hiddenByPolicy() {
-        final WindowState window = createWindow(null, TYPE_APPLICATION, "window");
+        final WindowState window = newWindowBuilder("window", TYPE_APPLICATION).build();
         window.setHasSurface(true);
         assertTrue(window.isOnScreen());
         window.hide(false /* doAnimation */, false /* requestAnim */);
@@ -273,8 +284,8 @@
 
     @Test
     public void testCanBeImeTarget() {
-        final WindowState appWindow = createWindow(null, TYPE_APPLICATION, "appWindow");
-        final WindowState imeWindow = createWindow(null, TYPE_INPUT_METHOD, "imeWindow");
+        final WindowState appWindow = newWindowBuilder("appWindow", TYPE_APPLICATION).build();
+        final WindowState imeWindow = newWindowBuilder("imeWindow", TYPE_INPUT_METHOD).build();
 
         // Setting FLAG_NOT_FOCUSABLE prevents the window from being an IME target.
         appWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
@@ -328,16 +339,17 @@
 
     @Test
     public void testGetWindow() {
-        final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
-        final WindowState mediaChild = createWindow(root, TYPE_APPLICATION_MEDIA, "mediaChild");
-        final WindowState mediaOverlayChild = createWindow(root,
-                TYPE_APPLICATION_MEDIA_OVERLAY, "mediaOverlayChild");
-        final WindowState attachedDialogChild = createWindow(root,
-                TYPE_APPLICATION_ATTACHED_DIALOG, "attachedDialogChild");
-        final WindowState subPanelChild = createWindow(root,
-                TYPE_APPLICATION_SUB_PANEL, "subPanelChild");
-        final WindowState aboveSubPanelChild = createWindow(root,
-                TYPE_APPLICATION_ABOVE_SUB_PANEL, "aboveSubPanelChild");
+        final WindowState root = newWindowBuilder("root", TYPE_APPLICATION).build();
+        final WindowState mediaChild = newWindowBuilder("mediaChild",
+                TYPE_APPLICATION_MEDIA).setParent(root).build();
+        final WindowState mediaOverlayChild = newWindowBuilder("mediaOverlayChild",
+                TYPE_APPLICATION_MEDIA_OVERLAY).setParent(root).build();
+        final WindowState attachedDialogChild = newWindowBuilder("attachedDialogChild",
+                TYPE_APPLICATION_ATTACHED_DIALOG).setParent(root).build();
+        final WindowState subPanelChild = newWindowBuilder("subPanelChild",
+                TYPE_APPLICATION_SUB_PANEL).setParent(root).build();
+        final WindowState aboveSubPanelChild = newWindowBuilder("aboveSubPanelChild",
+                TYPE_APPLICATION_ABOVE_SUB_PANEL).setParent(root).build();
 
         final LinkedList<WindowState> windows = new LinkedList<>();
 
@@ -358,7 +370,7 @@
 
     @Test
     public void testDestroySurface() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).build();
         win.mHasSurface = win.mAnimatingExit = true;
         win.mWinAnimator.mSurfaceControl = mock(SurfaceControl.class);
         win.onExitAnimationDone();
@@ -384,8 +396,10 @@
         // Call prepareWindowToDisplayDuringRelayout for a window without FLAG_TURN_SCREEN_ON before
         // calling setCurrentLaunchCanTurnScreenOn for windows with flag in the same activity.
         final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        final WindowState first = createWindow(null, TYPE_APPLICATION, activity, "first");
-        final WindowState second = createWindow(null, TYPE_APPLICATION, activity, "second");
+        final WindowState first = newWindowBuilder("first", TYPE_APPLICATION).setWindowToken(
+                activity).build();
+        final WindowState second = newWindowBuilder("second", TYPE_APPLICATION).setWindowToken(
+                activity).build();
 
         testPrepareWindowToDisplayDuringRelayout(first, false /* expectedWakeupCalled */,
                 true /* expectedCurrentLaunchCanTurnScreenOn */);
@@ -423,10 +437,10 @@
         // Call prepareWindowToDisplayDuringRelayout for a windows that are not children of an
         // activity. Both windows have the FLAG_TURNS_SCREEN_ON so both should call wakeup
         final WindowToken windowToken = createTestWindowToken(FIRST_SUB_WINDOW, mDisplayContent);
-        final WindowState firstWindow = createWindow(null, TYPE_APPLICATION, windowToken,
-                "firstWindow");
-        final WindowState secondWindow = createWindow(null, TYPE_APPLICATION, windowToken,
-                "secondWindow");
+        final WindowState firstWindow = newWindowBuilder("firstWindow",
+                TYPE_APPLICATION).setWindowToken(windowToken).build();
+        final WindowState secondWindow = newWindowBuilder("secondWindow",
+                TYPE_APPLICATION).setWindowToken(windowToken).build();
         firstWindow.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
         secondWindow.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
 
@@ -459,7 +473,7 @@
 
     @Test
     public void testCanAffectSystemUiFlags() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         app.mActivityRecord.setVisible(true);
         assertTrue(app.canAffectSystemUiFlags());
         app.mActivityRecord.setVisible(false);
@@ -471,7 +485,7 @@
 
     @Test
     public void testCanAffectSystemUiFlags_starting() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION_STARTING, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION_STARTING).build();
         app.mActivityRecord.setVisible(true);
         app.mStartingData = new SnapshotStartingData(mWm, null, 0);
         assertFalse(app.canAffectSystemUiFlags());
@@ -481,7 +495,7 @@
 
     @Test
     public void testCanAffectSystemUiFlags_disallow() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         app.mActivityRecord.setVisible(true);
         assertTrue(app.canAffectSystemUiFlags());
         app.getTask().setCanAffectSystemUiFlags(false);
@@ -538,9 +552,11 @@
 
     @Test
     public void testIsSelfOrAncestorWindowAnimating() {
-        final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
-        final WindowState child1 = createWindow(root, FIRST_SUB_WINDOW, "child1");
-        final WindowState child2 = createWindow(child1, FIRST_SUB_WINDOW, "child2");
+        final WindowState root = newWindowBuilder("root", TYPE_APPLICATION).build();
+        final WindowState child1 = newWindowBuilder("child1", FIRST_SUB_WINDOW).setParent(
+                root).build();
+        final WindowState child2 = newWindowBuilder("child2", FIRST_SUB_WINDOW).setParent(
+                child1).build();
         assertFalse(child2.isSelfOrAncestorWindowAnimatingExit());
         child2.mAnimatingExit = true;
         assertTrue(child2.isSelfOrAncestorWindowAnimatingExit());
@@ -551,7 +567,7 @@
 
     @Test
     public void testDeferredRemovalByAnimating() {
-        final WindowState appWindow = createWindow(null, TYPE_APPLICATION, "appWindow");
+        final WindowState appWindow = newWindowBuilder("appWindow", TYPE_APPLICATION).build();
         makeWindowVisible(appWindow);
         spyOn(appWindow.mWinAnimator);
         doReturn(true).when(appWindow.mWinAnimator).getShown();
@@ -571,8 +587,9 @@
 
     @Test
     public void testOnExitAnimationDone() {
-        final WindowState parent = createWindow(null, TYPE_APPLICATION, "parent");
-        final WindowState child = createWindow(parent, TYPE_APPLICATION_PANEL, "child");
+        final WindowState parent = newWindowBuilder("parent", TYPE_APPLICATION).build();
+        final WindowState child = newWindowBuilder("child", TYPE_APPLICATION_PANEL).setParent(
+                parent).build();
         final SurfaceControl.Transaction t = parent.getPendingTransaction();
         child.startAnimation(t, mock(AnimationAdapter.class), false /* hidden */,
                 SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION);
@@ -609,7 +626,7 @@
 
     @Test
     public void testLayoutSeqResetOnReparent() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         app.mLayoutSeq = 1;
         mDisplayContent.mLayoutSeq = 1;
 
@@ -622,7 +639,7 @@
 
     @Test
     public void testDisplayIdUpdatedOnReparent() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         // fake a different display
         app.mInputWindowHandle.setDisplayId(mDisplayContent.getDisplayId() + 1);
         app.onDisplayChanged(mDisplayContent);
@@ -633,7 +650,7 @@
 
     @Test
     public void testApplyWithNextDraw() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION_OVERLAY, "app");
+        final WindowState win = newWindowBuilder("app", TYPE_APPLICATION_OVERLAY).build();
         final SurfaceControl.Transaction[] handledT = { null };
         // The normal case that the draw transaction is applied with finishing drawing.
         win.applyWithNextDraw(t -> handledT[0] = t);
@@ -657,7 +674,7 @@
 
     @Test
     public void testSeamlesslyRotateWindow() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         final SurfaceControl.Transaction t = spy(StubTransaction.class);
 
         makeWindowVisible(app);
@@ -707,7 +724,7 @@
 
     @Test
     public void testVisibilityChangeSwitchUser() {
-        final WindowState window = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState window = newWindowBuilder("app", TYPE_APPLICATION).build();
         window.mHasSurface = true;
         spyOn(window);
         doReturn(false).when(window).showForAllUsers();
@@ -729,8 +746,9 @@
         final CompatModePackages cmp = mWm.mAtmService.mCompatModePackages;
         spyOn(cmp);
         doReturn(overrideScale).when(cmp).getCompatScale(anyString(), anyInt());
-        final WindowState w = createWindow(null, TYPE_APPLICATION_OVERLAY, "win");
-        final WindowState child = createWindow(w, TYPE_APPLICATION_PANEL, "child");
+        final WindowState w = newWindowBuilder("win", TYPE_APPLICATION_OVERLAY).build();
+        final WindowState child = newWindowBuilder("child", TYPE_APPLICATION_PANEL).setParent(
+                w).build();
 
         assertTrue(w.hasCompatScale());
         assertTrue(child.hasCompatScale());
@@ -788,7 +806,8 @@
 
         // Child window without scale (e.g. different app) should apply inverse scale of parent.
         doReturn(1f).when(cmp).getCompatScale(anyString(), anyInt());
-        final WindowState child2 = createWindow(w, TYPE_APPLICATION_SUB_PANEL, "child2");
+        final WindowState child2 = newWindowBuilder("child2", TYPE_APPLICATION_SUB_PANEL).setParent(
+                w).build();
         makeWindowVisible(w, child2);
         clearInvocations(t);
         child2.prepareSurfaces();
@@ -798,10 +817,10 @@
     @SetupWindows(addWindows = { W_ABOVE_ACTIVITY, W_NOTIFICATION_SHADE })
     @Test
     public void testRequestDrawIfNeeded() {
-        final WindowState startingApp = createWindow(null /* parent */,
-                TYPE_BASE_APPLICATION, "startingApp");
-        final WindowState startingWindow = createWindow(null /* parent */,
-                TYPE_APPLICATION_STARTING, startingApp.mToken, "starting");
+        final WindowState startingApp = newWindowBuilder("startingApp",
+                TYPE_BASE_APPLICATION).build();
+        final WindowState startingWindow = newWindowBuilder("starting",
+                TYPE_APPLICATION_STARTING).setWindowToken(startingApp.mToken).build();
         startingApp.mActivityRecord.mStartingWindow = startingWindow;
         final WindowState keyguardHostWindow = mNotificationShadeWindow;
         final WindowState allDrawnApp = mAppWindow;
@@ -878,7 +897,7 @@
 
     @Test
     public void testRequestResizeForBlastSync() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "window");
+        final WindowState win = newWindowBuilder("window", TYPE_APPLICATION).build();
         makeWindowVisible(win);
         makeLastConfigReportedToClient(win, true /* visible */);
         win.mLayoutSeq = win.getDisplayContent().mLayoutSeq;
@@ -926,8 +945,8 @@
         final Task task = createTask(mDisplayContent);
         final TaskFragment embeddedTf = createTaskFragmentWithEmbeddedActivity(task, organizer);
         final ActivityRecord embeddedActivity = embeddedTf.getTopMostActivity();
-        final WindowState win = createWindow(null /* parent */, TYPE_APPLICATION, embeddedActivity,
-                "App window");
+        final WindowState win = newWindowBuilder("App window", TYPE_APPLICATION).setWindowToken(
+                embeddedActivity).build();
         doReturn(true).when(embeddedActivity).isVisible();
         embeddedActivity.setVisibleRequested(true);
         makeWindowVisible(win);
@@ -949,14 +968,14 @@
 
     @Test
     public void testCantReceiveTouchWhenAppTokenHiddenRequested() {
-        final WindowState win0 = createWindow(null, TYPE_APPLICATION, "win0");
+        final WindowState win0 = newWindowBuilder("win0", TYPE_APPLICATION).build();
         win0.mActivityRecord.setVisibleRequested(false);
         assertFalse(win0.canReceiveTouchInput());
     }
 
     @Test
     public void testCantReceiveTouchWhenNotFocusable() {
-        final WindowState win0 = createWindow(null, TYPE_APPLICATION, "win0");
+        final WindowState win0 = newWindowBuilder("win0", TYPE_APPLICATION).build();
         final Task rootTask = win0.mActivityRecord.getRootTask();
         spyOn(rootTask);
         when(rootTask.shouldIgnoreInput()).thenReturn(true);
@@ -969,7 +988,7 @@
 
     @Test
     public void testUpdateInputWindowHandle() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).build();
         win.mAttrs.inputFeatures = WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
         win.mAttrs.flags = FLAG_WATCH_OUTSIDE_TOUCH | FLAG_SPLIT_TOUCH;
         final InputWindowHandle handle = new InputWindowHandle(
@@ -1026,7 +1045,7 @@
     @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
     @Test
     public void testTouchRegionUsesLetterboxBoundsIfTransformedBoundsAndLetterboxScrolling() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).build();
 
         // Transformed bounds used for size of touchable region if letterbox inner bounds are empty.
         final Rect transformedBounds = new Rect(0, 0, 300, 500);
@@ -1051,7 +1070,7 @@
     @DisableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
     @Test
     public void testTouchRegionUsesLetterboxBoundsIfNullTransformedBoundsAndLetterboxScrolling() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).build();
 
         // Fragment bounds used for size of touchable region if letterbox inner bounds are empty
         // and Transform bounds are null.
@@ -1083,7 +1102,7 @@
     @EnableFlags(Flags.FLAG_SCROLLING_FROM_LETTERBOX)
     @Test
     public void testTouchRegionUsesTransformedBoundsIfLetterboxScrolling() {
-        final WindowState win = createWindow(null, TYPE_APPLICATION, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).build();
 
         // Transformed bounds used for size of touchable region if letterbox inner bounds are empty.
         final Rect transformedBounds = new Rect(0, 0, 300, 500);
@@ -1109,7 +1128,7 @@
     public void testHasActiveVisibleWindow() {
         final int uid = ActivityBuilder.DEFAULT_FAKE_UID;
 
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app", uid);
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).setOwnerId(uid).build();
         app.mActivityRecord.setVisible(false);
         app.mActivityRecord.setVisibility(false);
         assertFalse(mAtm.hasActiveVisibleWindow(uid));
@@ -1120,15 +1139,17 @@
         // Make the activity invisible and add a visible toast. The uid should have no active
         // visible window because toast can be misused by legacy app to bypass background check.
         app.mActivityRecord.setVisibility(false);
-        final WindowState overlay = createWindow(null, TYPE_APPLICATION_OVERLAY, "overlay", uid);
-        final WindowState toast = createWindow(null, TYPE_TOAST, app.mToken, "toast", uid);
+        final WindowState overlay = newWindowBuilder("overlay",
+                TYPE_APPLICATION_OVERLAY).setOwnerId(uid).build();
+        final WindowState toast = newWindowBuilder("toast", TYPE_TOAST).setWindowToken(
+                app.mToken).setOwnerId(uid).build();
         toast.onSurfaceShownChanged(true);
         assertFalse(mAtm.hasActiveVisibleWindow(uid));
 
         // Though starting window should belong to system. Make sure it is ignored to avoid being
         // allow-list unexpectedly, see b/129563343.
-        final WindowState starting =
-                createWindow(null, TYPE_APPLICATION_STARTING, app.mToken, "starting", uid);
+        final WindowState starting = newWindowBuilder("starting",
+                TYPE_APPLICATION_STARTING).setWindowToken(app.mToken).setOwnerId(uid).build();
         starting.onSurfaceShownChanged(true);
         assertFalse(mAtm.hasActiveVisibleWindow(uid));
 
@@ -1145,8 +1166,8 @@
     @SetupWindows(addWindows = { W_ACTIVITY, W_INPUT_METHOD })
     @Test
     public void testNeedsRelativeLayeringToIme_notAttached() {
-        WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
-                "SameTokenWindow");
+        WindowState sameTokenWindow = newWindowBuilder("SameTokenWindow",
+                TYPE_BASE_APPLICATION).setWindowToken(mAppWindow.mToken).build();
         mDisplayContent.setImeLayeringTarget(mAppWindow);
         makeWindowVisible(mImeWindow);
         sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
@@ -1158,8 +1179,8 @@
     @SetupWindows(addWindows = { W_ACTIVITY, W_INPUT_METHOD })
     @Test
     public void testNeedsRelativeLayeringToIme_startingWindow() {
-        WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
-                mAppWindow.mToken, "SameTokenWindow");
+        WindowState sameTokenWindow = newWindowBuilder("SameTokenWindow",
+                TYPE_APPLICATION_STARTING).setWindowToken(mAppWindow.mToken).build();
         mDisplayContent.setImeLayeringTarget(mAppWindow);
         makeWindowVisible(mImeWindow);
         sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
@@ -1169,9 +1190,9 @@
     @UseTestDisplay(addWindows = {W_ACTIVITY, W_INPUT_METHOD})
     @Test
     public void testNeedsRelativeLayeringToIme_systemDialog() {
-        WindowState systemDialogWindow = createWindow(null, TYPE_SECURE_SYSTEM_OVERLAY,
-                mDisplayContent,
-                "SystemDialog", true);
+        WindowState systemDialogWindow = newWindowBuilder("SystemDialog",
+                TYPE_SECURE_SYSTEM_OVERLAY).setDisplay(
+                mDisplayContent).setOwnerCanAddInternalSystemWindow(true).build();
         mDisplayContent.setImeLayeringTarget(mAppWindow);
         mAppWindow.getTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
         makeWindowVisible(mImeWindow);
@@ -1182,20 +1203,21 @@
     @UseTestDisplay(addWindows = {W_INPUT_METHOD})
     @Test
     public void testNeedsRelativeLayeringToIme_notificationShadeShouldNotHideSystemDialog() {
-        WindowState systemDialogWindow = createWindow(null, TYPE_SECURE_SYSTEM_OVERLAY,
-                mDisplayContent,
-                "SystemDialog", true);
+        WindowState systemDialogWindow = newWindowBuilder("SystemDialog",
+                TYPE_SECURE_SYSTEM_OVERLAY).setDisplay(
+                mDisplayContent).setOwnerCanAddInternalSystemWindow(true).build();
         mDisplayContent.setImeLayeringTarget(systemDialogWindow);
         makeWindowVisible(mImeWindow);
-        WindowState notificationShade = createWindow(null, TYPE_NOTIFICATION_SHADE,
-                mDisplayContent, "NotificationShade", true);
+        WindowState notificationShade = newWindowBuilder("NotificationShade",
+                TYPE_NOTIFICATION_SHADE).setDisplay(
+                mDisplayContent).setOwnerCanAddInternalSystemWindow(true).build();
         notificationShade.mAttrs.flags |= FLAG_ALT_FOCUSABLE_IM;
         assertFalse(notificationShade.needsRelativeLayeringToIme());
     }
 
     @Test
     public void testSetFreezeInsetsState() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         spyOn(app);
         doReturn(true).when(app).isVisible();
 
@@ -1216,7 +1238,7 @@
         verify(app).notifyInsetsChanged();
 
         // Verify that invisible non-activity window won't dispatch insets changed.
-        final WindowState overlay = createWindow(null, TYPE_APPLICATION_OVERLAY, "overlay");
+        final WindowState overlay = newWindowBuilder("overlay", TYPE_APPLICATION_OVERLAY).build();
         makeWindowVisible(overlay);
         assertTrue(overlay.isReadyToDispatchInsetsState());
         overlay.mHasSurface = false;
@@ -1244,9 +1266,9 @@
 
     @Test
     public void testAdjustImeInsetsVisibilityWhenSwitchingApps() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
-        final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2");
-        final WindowState imeWindow = createWindow(null, TYPE_APPLICATION, "imeWindow");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
+        final WindowState app2 = newWindowBuilder("app2", TYPE_APPLICATION).build();
+        final WindowState imeWindow = newWindowBuilder("imeWindow", TYPE_APPLICATION).build();
         spyOn(imeWindow);
         doReturn(true).when(imeWindow).isVisible();
         mDisplayContent.mInputMethodWindow = imeWindow;
@@ -1279,10 +1301,11 @@
 
     @Test
     public void testAdjustImeInsetsVisibilityWhenSwitchingApps_toAppInMultiWindowMode() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
-        final WindowState app2 = createWindow(null, WINDOWING_MODE_MULTI_WINDOW,
-                ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app2");
-        final WindowState imeWindow = createWindow(null, TYPE_APPLICATION, "imeWindow");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
+        final WindowState app2 = newWindowBuilder("app2", TYPE_APPLICATION).setWindowingMode(
+                WINDOWING_MODE_MULTI_WINDOW).setActivityType(ACTIVITY_TYPE_STANDARD).setDisplay(
+                mDisplayContent).build();
+        final WindowState imeWindow = newWindowBuilder("imeWindow", TYPE_APPLICATION).build();
         spyOn(imeWindow);
         doReturn(true).when(imeWindow).isVisible();
         mDisplayContent.mInputMethodWindow = imeWindow;
@@ -1321,8 +1344,8 @@
     @SetupWindows(addWindows = W_ACTIVITY)
     @Test
     public void testUpdateImeControlTargetWhenLeavingMultiWindow() {
-        WindowState app = createWindow(null, TYPE_BASE_APPLICATION,
-                mAppWindow.mToken, "app");
+        WindowState app = newWindowBuilder("app", TYPE_BASE_APPLICATION).setWindowToken(
+                mAppWindow.mToken).build();
         mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController());
 
         spyOn(app);
@@ -1349,8 +1372,8 @@
     @SetupWindows(addWindows = { W_ACTIVITY, W_INPUT_METHOD, W_NOTIFICATION_SHADE })
     @Test
     public void testNotificationShadeHasImeInsetsWhenMultiWindow() {
-        WindowState app = createWindow(null, TYPE_BASE_APPLICATION,
-                mAppWindow.mToken, "app");
+        WindowState app = newWindowBuilder("app", TYPE_BASE_APPLICATION).setWindowToken(
+                mAppWindow.mToken).build();
 
         // Simulate entering multi-window mode and windowing mode is multi-window.
         app.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
@@ -1376,7 +1399,7 @@
 
     @Test
     public void testRequestedVisibility() {
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         app.mActivityRecord.setVisible(false);
         app.mActivityRecord.setVisibility(false);
         assertFalse(app.isVisibleRequested());
@@ -1391,7 +1414,7 @@
 
     @Test
     public void testKeepClearAreas() {
-        final WindowState window = createWindow(null, TYPE_APPLICATION, "window");
+        final WindowState window = newWindowBuilder("window", TYPE_APPLICATION).build();
         makeWindowVisible(window);
 
         final Rect keepClearArea1 = new Rect(0, 0, 10, 10);
@@ -1433,7 +1456,7 @@
 
     @Test
     public void testUnrestrictedKeepClearAreas() {
-        final WindowState window = createWindow(null, TYPE_APPLICATION, "window");
+        final WindowState window = newWindowBuilder("window", TYPE_APPLICATION).build();
         makeWindowVisible(window);
 
         final Rect keepClearArea1 = new Rect(0, 0, 10, 10);
@@ -1481,8 +1504,9 @@
         final InputMethodManagerInternal immi = InputMethodManagerInternal.get();
         spyOn(immi);
 
-        final WindowState imeTarget = createWindow(null /* parent */, TYPE_BASE_APPLICATION,
-                createActivityRecord(mDisplayContent), "imeTarget");
+        final WindowState imeTarget = newWindowBuilder("imeTarget",
+                TYPE_BASE_APPLICATION).setWindowToken(
+                createActivityRecord(mDisplayContent)).build();
 
         imeTarget.mActivityRecord.setVisibleRequested(true);
         makeWindowVisible(imeTarget);
@@ -1562,8 +1586,8 @@
 
     @Test
     public void testIsSecureLocked_flagSecureSet() {
-        WindowState window = createWindow(null /* parent */, TYPE_APPLICATION, "test-window",
-                1 /* ownerId */);
+        WindowState window = newWindowBuilder("test-window", TYPE_APPLICATION).setOwnerId(
+                1).build();
         window.mAttrs.flags |= WindowManager.LayoutParams.FLAG_SECURE;
 
         assertTrue(window.isSecureLocked());
@@ -1571,8 +1595,8 @@
 
     @Test
     public void testIsSecureLocked_flagSecureNotSet() {
-        WindowState window = createWindow(null /* parent */, TYPE_APPLICATION, "test-window",
-                1 /* ownerId */);
+        WindowState window = newWindowBuilder("test-window", TYPE_APPLICATION).setOwnerId(
+                1).build();
 
         assertFalse(window.isSecureLocked());
     }
@@ -1581,8 +1605,8 @@
     public void testIsSecureLocked_disableSecureWindows() {
         assumeTrue(Build.IS_DEBUGGABLE);
 
-        WindowState window = createWindow(null /* parent */, TYPE_APPLICATION, "test-window",
-                1 /* ownerId */);
+        WindowState window = newWindowBuilder("test-window", TYPE_APPLICATION).setOwnerId(
+                1).build();
         window.mAttrs.flags |= WindowManager.LayoutParams.FLAG_SECURE;
         ContentResolver cr = useFakeSettingsProvider();
 
@@ -1617,8 +1641,10 @@
         String testPackage = "test";
         int ownerId1 = 20;
         int ownerId2 = 21;
-        final WindowState window1 = createWindow(null, TYPE_APPLICATION, "window1", ownerId1);
-        final WindowState window2 = createWindow(null, TYPE_APPLICATION, "window2", ownerId2);
+        final WindowState window1 = newWindowBuilder("window1", TYPE_APPLICATION).setOwnerId(
+                ownerId1).build();
+        final WindowState window2 = newWindowBuilder("window2", TYPE_APPLICATION).setOwnerId(
+                ownerId2).build();
 
         // Setting packagename for targeted feature
         window1.mAttrs.packageName = testPackage;
@@ -1638,7 +1664,8 @@
     public void testIsSecureLocked_sensitiveContentBlockOrClearScreenCaptureForApp() {
         String testPackage = "test";
         int ownerId = 20;
-        final WindowState window = createWindow(null, TYPE_APPLICATION, "window", ownerId);
+        final WindowState window = newWindowBuilder("window", TYPE_APPLICATION).setOwnerId(
+                ownerId).build();
         window.mAttrs.packageName = testPackage;
         assertFalse(window.isSecureLocked());
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
index f226b9d..a02c3db 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
@@ -74,11 +74,16 @@
 
         assertEquals(0, token.getWindowsCount());
 
-        final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1");
-        final WindowState window11 = createWindow(window1, FIRST_SUB_WINDOW, token, "window11");
-        final WindowState window12 = createWindow(window1, FIRST_SUB_WINDOW, token, "window12");
-        final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2");
-        final WindowState window3 = createWindow(null, TYPE_APPLICATION, token, "window3");
+        final WindowState window1 = newWindowBuilder("window1", TYPE_APPLICATION).setWindowToken(
+                token).build();
+        final WindowState window11 = newWindowBuilder("window11", FIRST_SUB_WINDOW).setParent(
+                window1).setWindowToken(token).build();
+        final WindowState window12 = newWindowBuilder("window12", FIRST_SUB_WINDOW).setParent(
+                window1).setWindowToken(token).build();
+        final WindowState window2 = newWindowBuilder("window2", TYPE_APPLICATION).setWindowToken(
+                token).build();
+        final WindowState window3 = newWindowBuilder("window3", TYPE_APPLICATION).setWindowToken(
+                token).build();
 
         token.addWindow(window1);
         // NOTE: Child windows will not be added to the token as window containers can only
@@ -105,8 +110,10 @@
     public void testAddWindow_assignsLayers() {
         final TestWindowToken token1 = createTestWindowToken(0, mDisplayContent);
         final TestWindowToken token2 = createTestWindowToken(0, mDisplayContent);
-        final WindowState window1 = createWindow(null, TYPE_STATUS_BAR, token1, "window1");
-        final WindowState window2 = createWindow(null, TYPE_STATUS_BAR, token2, "window2");
+        final WindowState window1 = newWindowBuilder("window1", TYPE_STATUS_BAR).setWindowToken(
+                token1).build();
+        final WindowState window2 = newWindowBuilder("window2", TYPE_STATUS_BAR).setWindowToken(
+                token2).build();
 
         token1.addWindow(window1);
         token2.addWindow(window2);
@@ -122,8 +129,10 @@
 
         assertEquals(token, dc.getWindowToken(token.token));
 
-        final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1");
-        final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2");
+        final WindowState window1 = newWindowBuilder("window1", TYPE_APPLICATION).setWindowToken(
+                token).build();
+        final WindowState window2 = newWindowBuilder("window2", TYPE_APPLICATION).setWindowToken(
+                token).build();
 
         window2.removeImmediately();
         // The token should still be mapped in the display content since it still has a child.
@@ -147,8 +156,10 @@
         // Verify that the token is on the display
         assertNotNull(mDisplayContent.getWindowToken(token.token));
 
-        final WindowState window1 = createWindow(null, TYPE_TOAST, token, "window1");
-        final WindowState window2 = createWindow(null, TYPE_TOAST, token, "window2");
+        final WindowState window1 = newWindowBuilder("window1", TYPE_TOAST).setWindowToken(
+                token).build();
+        final WindowState window2 = newWindowBuilder("window2", TYPE_TOAST).setWindowToken(
+                token).build();
 
         mDisplayContent.removeWindowToken(token.token, true /* animateExit */);
         // Verify that the token is no longer mapped on the display
@@ -231,7 +242,8 @@
 
         assertNull(fromClientToken.mSurfaceControl);
 
-        createWindow(null, TYPE_APPLICATION_OVERLAY, fromClientToken, "window");
+        newWindowBuilder("window", TYPE_APPLICATION_OVERLAY).setWindowToken(
+                fromClientToken).build();
         assertNotNull(fromClientToken.mSurfaceControl);
 
         final WindowToken nonClientToken = new WindowToken.Builder(mDisplayContent.mWmService,
@@ -285,7 +297,7 @@
 
         // Simulate an app window to be the IME layering target, assume the app window has no
         // frozen insets state by default.
-        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build();
         mDisplayContent.setImeLayeringTarget(app);
         assertNull(app.getFrozenInsetsState());
         assertTrue(app.isImeLayeringTarget());
@@ -299,7 +311,8 @@
     @Test
     public void testRemoveWindowToken_noAnimateExitWhenSet() {
         final TestWindowToken token = createTestWindowToken(0, mDisplayContent);
-        final WindowState win = createWindow(null, TYPE_APPLICATION, token, "win");
+        final WindowState win = newWindowBuilder("win", TYPE_APPLICATION).setWindowToken(
+                token).build();
         makeWindowVisible(win);
         assertTrue(win.isOnScreen());
         spyOn(win);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
index 4f60106..84e2118 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
@@ -221,7 +221,7 @@
     }
 
     WindowState createWindow(String name) {
-        return createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, name);
+        return newWindowBuilder(name, TYPE_BASE_APPLICATION).setDisplay(mDisplayContent).build();
     }
 
     @Test
@@ -263,12 +263,12 @@
     @Test
     public void testAssignWindowLayers_ForImeWithAppTargetWithChildWindows() {
         final WindowState imeAppTarget = createWindow("imeAppTarget");
-        final WindowState imeAppTargetChildAboveWindow = createWindow(imeAppTarget,
-                TYPE_APPLICATION_ATTACHED_DIALOG, imeAppTarget.mToken,
-                "imeAppTargetChildAboveWindow");
-        final WindowState imeAppTargetChildBelowWindow = createWindow(imeAppTarget,
-                TYPE_APPLICATION_MEDIA_OVERLAY, imeAppTarget.mToken,
-                "imeAppTargetChildBelowWindow");
+        final WindowState imeAppTargetChildAboveWindow = newWindowBuilder(
+                "imeAppTargetChildAboveWindow", TYPE_APPLICATION_ATTACHED_DIALOG).setParent(
+                imeAppTarget).setWindowToken(imeAppTarget.mToken).build();
+        final WindowState imeAppTargetChildBelowWindow = newWindowBuilder(
+                "imeAppTargetChildBelowWindow", TYPE_APPLICATION_MEDIA_OVERLAY).setParent(
+                imeAppTarget).setWindowToken(imeAppTarget.mToken).build();
 
         mDisplayContent.setImeLayeringTarget(imeAppTarget);
         makeWindowVisible(mImeWindow);
@@ -313,9 +313,9 @@
 
     @Test
     public void testAssignWindowLayers_ForImeNonAppImeTarget() {
-        final WindowState imeSystemOverlayTarget = createWindow(null, TYPE_SYSTEM_OVERLAY,
-                mDisplayContent, "imeSystemOverlayTarget",
-                true /* ownerCanAddInternalSystemWindow */);
+        final WindowState imeSystemOverlayTarget = newWindowBuilder("imeSystemOverlayTarget",
+                TYPE_SYSTEM_OVERLAY).setDisplay(mDisplayContent).setOwnerCanAddInternalSystemWindow(
+                true).build();
 
         mDisplayContent.setImeLayeringTarget(imeSystemOverlayTarget);
         mDisplayContent.assignChildLayers(mTransaction);
@@ -354,18 +354,19 @@
     @Test
     public void testStackLayers() {
         final WindowState anyWindow1 = createWindow("anyWindow");
-        final WindowState pinnedStackWindow = createWindow(null, WINDOWING_MODE_PINNED,
-                ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent,
-                "pinnedStackWindow");
-        final WindowState dockedStackWindow = createWindow(null,
-                WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION,
-                mDisplayContent, "dockedStackWindow");
-        final WindowState assistantStackWindow = createWindow(null,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, TYPE_BASE_APPLICATION,
-                mDisplayContent, "assistantStackWindow");
-        final WindowState homeActivityWindow = createWindow(null, WINDOWING_MODE_FULLSCREEN,
-                ACTIVITY_TYPE_HOME, TYPE_BASE_APPLICATION,
-                mDisplayContent, "homeActivityWindow");
+        final WindowState pinnedStackWindow = newWindowBuilder("pinnedStackWindow",
+                TYPE_BASE_APPLICATION).setWindowingMode(WINDOWING_MODE_PINNED).setActivityType(
+                ACTIVITY_TYPE_STANDARD).setDisplay(mDisplayContent).build();
+        final WindowState dockedStackWindow = newWindowBuilder("dockedStackWindow",
+                TYPE_BASE_APPLICATION).setWindowingMode(
+                WINDOWING_MODE_MULTI_WINDOW).setActivityType(ACTIVITY_TYPE_STANDARD).setDisplay(
+                mDisplayContent).build();
+        final WindowState assistantStackWindow = newWindowBuilder("assistantStackWindow",
+                TYPE_BASE_APPLICATION).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setActivityType(
+                ACTIVITY_TYPE_ASSISTANT).setDisplay(mDisplayContent).build();
+        final WindowState homeActivityWindow = newWindowBuilder("homeActivityWindow",
+                TYPE_BASE_APPLICATION).setWindowingMode(WINDOWING_MODE_FULLSCREEN).setActivityType(
+                ACTIVITY_TYPE_HOME).setDisplay(mDisplayContent).build();
         final WindowState anyWindow2 = createWindow("anyWindow2");
 
         mDisplayContent.assignChildLayers(mTransaction);
@@ -383,13 +384,12 @@
 
     @Test
     public void testAssignWindowLayers_ForSysUiPanels() {
-        final WindowState navBarPanel =
-                createWindow(null, TYPE_NAVIGATION_BAR_PANEL, mDisplayContent, "NavBarPanel");
-        final WindowState statusBarPanel =
-                createWindow(null, TYPE_STATUS_BAR_ADDITIONAL, mDisplayContent,
-                        "StatusBarAdditional");
-        final WindowState statusBarSubPanel =
-                createWindow(null, TYPE_STATUS_BAR_SUB_PANEL, mDisplayContent, "StatusBarSubPanel");
+        final WindowState navBarPanel = newWindowBuilder("NavBarPanel",
+                TYPE_NAVIGATION_BAR_PANEL).setDisplay(mDisplayContent).build();
+        final WindowState statusBarPanel = newWindowBuilder("StatusBarAdditional",
+                TYPE_STATUS_BAR_ADDITIONAL).setDisplay(mDisplayContent).build();
+        final WindowState statusBarSubPanel = newWindowBuilder("StatusBarSubPanel",
+                TYPE_STATUS_BAR_SUB_PANEL).setDisplay(mDisplayContent).build();
         mDisplayContent.assignChildLayers(mTransaction);
 
         // Ime should be above all app windows and below system windows if it is targeting an app
@@ -401,15 +401,16 @@
 
     @Test
     public void testAssignWindowLayers_ForImeOnPopupImeLayeringTarget() {
-        final WindowState imeAppTarget = createWindow(null, TYPE_APPLICATION,
-                mAppWindow.mActivityRecord, "imeAppTarget");
+        final WindowState imeAppTarget = newWindowBuilder("imeAppTarget",
+                TYPE_APPLICATION).setWindowToken(mAppWindow.mActivityRecord).build();
         mDisplayContent.setImeInputTarget(imeAppTarget);
         mDisplayContent.setImeLayeringTarget(imeAppTarget);
         mDisplayContent.setImeControlTarget(imeAppTarget);
 
         // Set a popup IME layering target and keeps the original IME control target behinds it.
-        final WindowState popupImeTargetWin = createWindow(imeAppTarget,
-                TYPE_APPLICATION_SUB_PANEL, mAppWindow.mActivityRecord, "popupImeTargetWin");
+        final WindowState popupImeTargetWin = newWindowBuilder("popupImeTargetWin",
+                TYPE_APPLICATION_SUB_PANEL).setParent(imeAppTarget).setWindowToken(
+                mAppWindow.mActivityRecord).build();
         mDisplayContent.setImeLayeringTarget(popupImeTargetWin);
         mDisplayContent.updateImeParent();
 
@@ -424,11 +425,11 @@
         // then we can drop all negative layering on the windowing side.
 
         final WindowState anyWindow = createWindow("anyWindow");
-        final WindowState child = createWindow(anyWindow, TYPE_APPLICATION_MEDIA, mDisplayContent,
-                "TypeApplicationMediaChild");
-        final WindowState mediaOverlayChild = createWindow(anyWindow,
-                TYPE_APPLICATION_MEDIA_OVERLAY,
-                mDisplayContent, "TypeApplicationMediaOverlayChild");
+        final WindowState child = newWindowBuilder("TypeApplicationMediaChild",
+                TYPE_APPLICATION_MEDIA).setParent(anyWindow).setDisplay(mDisplayContent).build();
+        final WindowState mediaOverlayChild = newWindowBuilder("TypeApplicationMediaOverlayChild",
+                TYPE_APPLICATION_MEDIA_OVERLAY).setParent(anyWindow).setDisplay(
+                mDisplayContent).build();
 
         mDisplayContent.assignChildLayers(mTransaction);
 
@@ -440,14 +441,17 @@
     public void testAssignWindowLayers_ForPostivelyZOrderedSubtype() {
         final WindowState anyWindow = createWindow("anyWindow");
         final ArrayList<WindowState> childList = new ArrayList<>();
-        childList.add(createWindow(anyWindow, TYPE_APPLICATION_PANEL, mDisplayContent,
-                "TypeApplicationPanelChild"));
-        childList.add(createWindow(anyWindow, TYPE_APPLICATION_SUB_PANEL, mDisplayContent,
-                "TypeApplicationSubPanelChild"));
-        childList.add(createWindow(anyWindow, TYPE_APPLICATION_ATTACHED_DIALOG, mDisplayContent,
-                "TypeApplicationAttachedDialogChild"));
-        childList.add(createWindow(anyWindow, TYPE_APPLICATION_ABOVE_SUB_PANEL, mDisplayContent,
-                "TypeApplicationAboveSubPanelPanelChild"));
+        childList.add(newWindowBuilder("TypeApplicationPanelChild",
+                TYPE_APPLICATION_PANEL).setParent(anyWindow).setDisplay(mDisplayContent).build());
+        childList.add(newWindowBuilder("TypeApplicationSubPanelChild",
+                TYPE_APPLICATION_SUB_PANEL).setParent(anyWindow).setDisplay(
+                mDisplayContent).build());
+        childList.add(newWindowBuilder("TypeApplicationAttachedDialogChild",
+                TYPE_APPLICATION_ATTACHED_DIALOG).setParent(anyWindow).setDisplay(
+                mDisplayContent).build());
+        childList.add(newWindowBuilder("TypeApplicationAboveSubPanelPanelChild",
+                TYPE_APPLICATION_ABOVE_SUB_PANEL).setParent(anyWindow).setDisplay(
+                mDisplayContent).build());
 
         final LayerRecordingTransaction t = mTransaction;
         mDisplayContent.assignChildLayers(t);
@@ -469,8 +473,8 @@
 
         // Create a popupWindow
         assertWindowHigher(mImeWindow, mAppWindow);
-        final WindowState popupWindow = createWindow(mAppWindow, TYPE_APPLICATION_PANEL,
-                mDisplayContent, "PopupWindow");
+        final WindowState popupWindow = newWindowBuilder("PopupWindow",
+                TYPE_APPLICATION_PANEL).setParent(mAppWindow).setDisplay(mDisplayContent).build();
         spyOn(popupWindow);
 
         mDisplayContent.assignChildLayers(mTransaction);
@@ -492,8 +496,9 @@
         makeWindowVisible(mImeWindow);
 
         // Create a popupWindow
-        final WindowState systemDialogWindow = createWindow(null, TYPE_SECURE_SYSTEM_OVERLAY,
-                mDisplayContent, "SystemDialog", true);
+        final WindowState systemDialogWindow = newWindowBuilder("SystemDialog",
+                TYPE_SECURE_SYSTEM_OVERLAY).setDisplay(
+                mDisplayContent).setOwnerCanAddInternalSystemWindow(true).build();
         systemDialogWindow.mAttrs.flags |= FLAG_ALT_FOCUSABLE_IM;
         spyOn(systemDialogWindow);
 
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index 71f3033..cadb0bd 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -72,6 +72,7 @@
         "tests/**/*.java",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
 
 // Make the current.txt available for use by the cts/tests/signature and /vendor tests.
diff --git a/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java b/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java
index df92898..9640a84 100644
--- a/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java
+++ b/tests/AppJankTest/src/android/app/jank/tests/JankUtils.java
@@ -29,6 +29,7 @@
         AppJankStats jankStats = new AppJankStats(
                 /*App Uid*/APP_ID,
                 /*Widget Id*/"test widget id",
+                /*navigationComponent*/null,
                 /*Widget Category*/AppJankStats.WIDGET_CATEGORY_SCROLL,
                 /*Widget State*/AppJankStats.WIDGET_STATE_SCROLLING,
                 /*Total Frames*/100,
diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/BottomHalfPipAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/BottomHalfPipAppHelper.kt
index ed2cff4..fe344c9 100644
--- a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/BottomHalfPipAppHelper.kt
+++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/BottomHalfPipAppHelper.kt
@@ -18,25 +18,28 @@
 
 import android.app.Instrumentation
 import android.content.Intent
-import android.tools.traces.parsers.toFlickerComponent
 import android.tools.traces.parsers.WindowManagerStateHelper
-import com.android.server.wm.flicker.testapp.ActivityOptions
+import android.tools.traces.parsers.toFlickerComponent
+import com.android.server.wm.flicker.testapp.ActivityOptions.BottomHalfPip
 
 class BottomHalfPipAppHelper(
     instrumentation: Instrumentation,
     private val useLaunchingActivity: Boolean = false,
+    private val fillTaskOnCreate: Boolean = true,
 ) : PipAppHelper(
     instrumentation,
-    appName = ActivityOptions.BottomHalfPip.LABEL,
-    componentNameMatcher = ActivityOptions.BottomHalfPip.COMPONENT
-        .toFlickerComponent()
+    appName = BottomHalfPip.LABEL,
+    componentNameMatcher = BottomHalfPip.COMPONENT.toFlickerComponent()
 ) {
     override val openAppIntent: Intent
         get() = super.openAppIntent.apply {
             component = if (useLaunchingActivity) {
-                ActivityOptions.BottomHalfPip.LAUNCHING_APP_COMPONENT
+                BottomHalfPip.LAUNCHING_APP_COMPONENT
             } else {
-                ActivityOptions.BottomHalfPip.COMPONENT
+                BottomHalfPip.COMPONENT
+            }
+            if (fillTaskOnCreate) {
+                putExtra(BottomHalfPip.EXTRA_BOTTOM_HALF_LAYOUT, false.toString())
             }
         }
 
@@ -44,9 +47,17 @@
         launchViaIntent(
             wmHelper,
             Intent().apply {
-                component = ActivityOptions.BottomHalfPip.COMPONENT
+                component = BottomHalfPip.COMPONENT
                 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
             }
         )
     }
+
+    fun toggleBottomHalfLayout() {
+        clickObject(TOGGLE_BOTTOM_HALF_LAYOUT_ID)
+    }
+
+    companion object {
+        private const val TOGGLE_BOTTOM_HALF_LAYOUT_ID = "toggle_bottom_half_layout"
+    }
 }
\ No newline at end of file
diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_bottom_half_pip.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_bottom_half_pip.xml
new file mode 100644
index 0000000..2f9c3aa
--- /dev/null
+++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_bottom_half_pip.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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.
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@android:color/holo_blue_bright">
+
+    <!-- All the buttons (and other clickable elements) should be arranged in a way so that it is
+         possible to "cycle" over all them by clicking on the D-Pad DOWN button. The way we do it
+         here is by arranging them this vertical LL and by relying on the nextFocusDown attribute
+         where things are arranged differently and to circle back up to the top once we reach the
+         bottom. -->
+
+    <Button
+        android:id="@+id/enter_pip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Enter PIP"
+        android:onClick="enterPip"/>
+
+    <Button
+        android:id="@+id/toggle_bottom_half_layout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Set Bottom Half Layout"
+        android:onClick="toggleBottomHalfLayout"/>
+
+    <CheckBox
+        android:id="@+id/with_custom_actions"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="With custom actions"/>
+
+    <RadioGroup
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:checkedButton="@id/enter_pip_on_leave_disabled">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Enter PiP on home press"/>
+
+        <RadioButton
+            android:id="@+id/enter_pip_on_leave_disabled"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Disabled"
+            android:onClick="onAutoPipSelected"/>
+
+        <RadioButton
+            android:id="@+id/enter_pip_on_leave_manual"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Via code behind"
+            android:onClick="onAutoPipSelected"/>
+
+        <RadioButton
+            android:id="@+id/enter_pip_on_leave_autoenter"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Auto-enter PiP"
+            android:onClick="onAutoPipSelected"/>
+    </RadioGroup>
+
+    <RadioGroup
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:checkedButton="@id/ratio_default">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Ratio"/>
+
+        <RadioButton
+            android:id="@+id/ratio_default"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Default"
+            android:onClick="onRatioSelected"/>
+
+        <RadioButton
+            android:id="@+id/ratio_square"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Square [1:1]"
+            android:onClick="onRatioSelected"/>
+
+        <RadioButton
+            android:id="@+id/ratio_wide"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Wide [2:1]"
+            android:onClick="onRatioSelected"/>
+
+        <RadioButton
+            android:id="@+id/ratio_tall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Tall [1:2]"
+            android:onClick="onRatioSelected"/>
+    </RadioGroup>
+
+    <CheckBox
+        android:id="@+id/set_source_rect_hint"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Set SourceRectHint"/>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Media Session"/>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <Button
+            android:id="@+id/media_session_start"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:nextFocusDown="@id/media_session_stop"
+            android:text="Start"/>
+
+        <Button
+            android:id="@+id/media_session_stop"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:nextFocusDown="@id/enter_pip"
+            android:text="Stop"/>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/BottomHalfPipActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/BottomHalfPipActivity.java
index 3d48655..3bbb945 100644
--- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/BottomHalfPipActivity.java
+++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/BottomHalfPipActivity.java
@@ -16,9 +16,14 @@
 
 package com.android.server.wm.flicker.testapp;
 
+import static com.android.server.wm.flicker.testapp.ActivityOptions.BottomHalfPip.EXTRA_BOTTOM_HALF_LAYOUT;
+
 import android.app.Activity;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.view.Gravity;
+import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
 
@@ -26,11 +31,13 @@
 
 public class BottomHalfPipActivity extends PipActivity {
 
+    private boolean mUseBottomHalfLayout;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_bottom_half_pip);
         setTheme(R.style.TranslucentTheme);
-        updateLayout();
     }
 
     @Override
@@ -41,14 +48,28 @@
     }
 
     /**
+     * Toggles the layout mode between fill task and half-bottom modes.
+     */
+    public void toggleBottomHalfLayout(View v) {
+        mUseBottomHalfLayout = !mUseBottomHalfLayout;
+        updateLayout();
+    }
+
+    /**
      * Sets to match parent layout if the activity is
-     * {@link Activity#isInPictureInPictureMode()}. Otherwise, set to bottom half
-     * layout.
+     * {@link Activity#isInPictureInPictureMode()}. Otherwise,
+     * follows {@link #mUseBottomHalfLayout}.
      *
      * @see #setToBottomHalfMode(boolean)
      */
     private void updateLayout() {
-        setToBottomHalfMode(!isInPictureInPictureMode());
+        final boolean useBottomHalfLayout;
+        if (isInPictureInPictureMode()) {
+            useBottomHalfLayout = false;
+        } else {
+            useBottomHalfLayout = mUseBottomHalfLayout;
+        }
+        setToBottomHalfMode(useBottomHalfLayout);
     }
 
     /**
@@ -57,15 +78,31 @@
      */
     private void setToBottomHalfMode(boolean useBottomHalfLayout) {
         final WindowManager.LayoutParams attrs = getWindow().getAttributes();
+        attrs.gravity = Gravity.BOTTOM;
         if (useBottomHalfLayout) {
             final int taskHeight = getWindowManager().getCurrentWindowMetrics().getBounds()
                     .height();
-            attrs.y = taskHeight / 2;
             attrs.height = taskHeight / 2;
         } else {
-            attrs.y = 0;
             attrs.height = LayoutParams.MATCH_PARENT;
         }
         getWindow().setAttributes(attrs);
     }
+
+    @Override
+    void handleIntentExtra(@NonNull Intent intent) {
+        super.handleIntentExtra(intent);
+        if (intent.hasExtra(EXTRA_BOTTOM_HALF_LAYOUT)) {
+            final String booleanString = intent.getStringExtra(EXTRA_BOTTOM_HALF_LAYOUT);
+            // We don't use Boolean#parseBoolean here because the impl only checks if the string
+            // equals to "true", and returns for any other cases. We use our own impl here to
+            // prevent false positive.
+            if ("true".equals(booleanString)) {
+                mUseBottomHalfLayout = true;
+            } else if ("false".equals(booleanString)) {
+                mUseBottomHalfLayout = false;
+            }
+        }
+        updateLayout();
+    }
 }
diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java
index 13d7f7f..ee25ab2 100644
--- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java
+++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java
@@ -350,7 +350,7 @@
         mMediaSession.setActive(newState != STATE_STOPPED);
     }
 
-    private void handleIntentExtra(Intent intent) {
+    void handleIntentExtra(Intent intent) {
         // Set the fixed orientation if requested
         if (intent.hasExtra(EXTRA_PIP_ORIENTATION)) {
             final int ori = Integer.parseInt(getIntent().getStringExtra(EXTRA_PIP_ORIENTATION));
diff --git a/tests/InputScreenshotTest/robotests/Android.bp b/tests/InputScreenshotTest/robotests/Android.bp
index b2414a8..63a1384 100644
--- a/tests/InputScreenshotTest/robotests/Android.bp
+++ b/tests/InputScreenshotTest/robotests/Android.bp
@@ -66,7 +66,6 @@
         "android.test.mock.stubs.system",
         "truth",
     ],
-    upstream: true,
     java_resource_dirs: ["config"],
     instrumentation_for: "InputRoboApp",
 
diff --git a/tests/Internal/Android.bp b/tests/Internal/Android.bp
index 9f35c7b..e294da1 100644
--- a/tests/Internal/Android.bp
+++ b/tests/Internal/Android.bp
@@ -65,6 +65,7 @@
         "src/com/android/internal/util/ParcellingTests.java",
     ],
     auto_gen_config: true,
+    team: "trendy_team_ravenwood",
 }
 
 java_test_helper_library {
diff --git a/tests/testables/tests/AndroidTest.xml b/tests/testables/tests/AndroidTest.xml
index 85f6e62..392bf67 100644
--- a/tests/testables/tests/AndroidTest.xml
+++ b/tests/testables/tests/AndroidTest.xml
@@ -45,6 +45,7 @@
 
     <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
         <option name="directory-keys" value="/data/user/0/com.android.testables/files"/>
+        <option name="directory-keys" value="/data/user/10/com.android.testables/files"/>
         <option name="collect-on-run-ended-only" value="true"/>
         <option name="clean-up" value="true"/>
     </metrics_collector>
diff --git a/tools/localedata/extract_icu_data.py b/tools/localedata/extract_icu_data.py
index 8f67fa8..ec53127 100755
--- a/tools/localedata/extract_icu_data.py
+++ b/tools/localedata/extract_icu_data.py
@@ -121,7 +121,7 @@
 
 def dump_script_codes(all_scripts):
     """Dump the SCRIPT_CODES table."""
-    print('const char SCRIPT_CODES[][4] = {')
+    print('constexpr const char SCRIPT_CODES[][4] = {')
     for index, script in enumerate(all_scripts):
         print("    /* %-2d */ {'%c', '%c', '%c', '%c'}," % (
             index, script[0], script[1], script[2], script[3]))
@@ -132,15 +132,33 @@
 def dump_script_data(likely_script_dict, all_scripts):
     """Dump the script data."""
     print()
-    print('const std::unordered_map<uint32_t, uint8_t> LIKELY_SCRIPTS({')
+    print('const char* lookupLikelyScript(uint32_t packed_lang_region) {')
+    print('    switch(packed_lang_region) {')
+
+    # partition the mapping by the script code
+    parts = {}
     for locale in sorted(likely_script_dict.keys()):
         script = likely_script_dict[locale]
-        print('    {0x%08Xu, %2du}, // %s -> %s' % (
-            pack_to_uint32(locale),
-            all_scripts.index(script),
-            locale.replace('_', '-'),
-            script))
-    print('});')
+        if script in parts:
+            l = parts[script]
+        else:
+            l = []
+            parts[script] = l
+        l.append(locale)
+
+    for script in sorted(parts.keys()):
+        locales = parts[script]
+        for locale in locales:
+            print('        case 0x%08Xu: // %s -> %s' % (
+                pack_to_uint32(locale),
+                locale.replace('_', '-'),
+                script))
+        print('            return SCRIPT_CODES[%2du];' %
+              all_scripts.index(script))
+    print('        default:')
+    print('            return nullptr;')
+    print('     }')
+    print('}')
 
 
 def pack_to_uint64(locale):
@@ -152,16 +170,32 @@
             (ord(script[2]) << 8) |
             ord(script[3]))
 
+def pack_script_to_uint32(script):
+    """Pack a 4-letter script code into a 32-bit unsigned integer."""
+    return ((ord(script[0]) << 24) |
+            (ord(script[1]) << 16) |
+            (ord(script[2]) << 8) |
+            ord(script[3]))
+
 
 def dump_representative_locales(representative_locales):
     """Dump the set of representative locales."""
     print()
-    print('std::unordered_set<uint64_t> REPRESENTATIVE_LOCALES({')
+    print('bool isLocaleRepresentative(uint32_t language_and_region, const char* script) {')
+    print('    const uint64_t packed_locale =')
+    print('            ((static_cast<uint64_t>(language_and_region)) << 32u) |')
+    print('            (static_cast<uint64_t>(packScript(script)));')
+    print('    switch(packed_locale) {')
     for locale in sorted(representative_locales):
-        print('    0x%08XLLU, // %s' % (
+        print('        case 0x%08XLLU: // %s' % (
             pack_to_uint64(locale),
             locale))
-    print('});')
+
+    print('            return true;')
+    print('        default:')
+    print('            return false;')
+    print('    }')
+    print('}')
 
 
 def read_and_dump_likely_data(cldr_source_dir):
@@ -182,7 +216,7 @@
 
 def escape_script_variable_name(script):
     """Escape characters, e.g. '~', in a C++ variable name"""
-    return script.replace("~", "_")
+    return script.replace("~", "0")
 
 def read_parent_data(icu_data_dir):
     """Read locale parent data from ICU data files."""
@@ -225,29 +259,52 @@
     """Dump information for parents of locales."""
     sorted_scripts = sorted(script_organized_dict.keys())
     print()
+
     for script in sorted_scripts:
         parent_dict = script_organized_dict[script]
-        print ('const std::unordered_map<uint32_t, uint32_t> %s_PARENTS({'
-            % escape_script_variable_name(script.upper()))
+
+        # partition the mapping by the parent's value
+        parts = {}
         for locale in sorted(parent_dict.keys()):
             parent = parent_dict[locale]
-            print('    {0x%08Xu, 0x%08Xu}, // %s -> %s' % (
-                pack_to_uint32(locale),
-                pack_to_uint32(parent),
-                locale.replace('_', '-'),
-                parent.replace('_', '-')))
-        print('});')
+            if parent in parts:
+                l = parts[parent]
+            else:
+                l = []
+                parts[parent] = l
+            l.append(locale)
+
+        print('static uint32_t find%sParent(uint32_t packed_lang_region) {' % escape_script_variable_name(script))
+        print('    switch(packed_lang_region) {')
+        for parent in sorted(parts.keys()):
+            locales = parts[parent]
+            for locale in locales:
+                print('        case 0x%08Xu: // %s -> %s' % (
+                    pack_to_uint32(locale),
+                    locale.replace('_', '-'),
+                    parent.replace('_', '-')))
+
+            print('            return 0x%08Xu;' % pack_to_uint32(parent))
+
+        print('        default:')
+        print('            return 0;')
+        print('    }')
+        print('}')
         print()
 
-    print('const struct {')
-    print('    const char script[4];')
-    print('    const std::unordered_map<uint32_t, uint32_t>* map;')
-    print('} SCRIPT_PARENTS[] = {')
+    print('uint32_t findParentLocalePackedKey(const char* script, uint32_t packed_lang_region) {')
+    print('    uint32_t packedScript = packScript(script);')
+    print('    switch (packedScript) {')
+
     for script in sorted_scripts:
-        print("    {{'%c', '%c', '%c', '%c'}, &%s_PARENTS}," % (
-            script[0], script[1], script[2], script[3],
-            escape_script_variable_name(script.upper())))
-    print('};')
+        print('        case 0x%08Xu: // %s' % (pack_script_to_uint32(script), script))
+        print('            return find%sParent(packed_lang_region);' %
+              escape_script_variable_name(script))
+
+    print('        default:')
+    print('            return 0;')
+    print('    }')
+    print('}')
 
 
 def dump_parent_tree_depth(parent_dict):
@@ -261,7 +318,9 @@
         max_depth = max(max_depth, depth)
     assert max_depth < 5 # Our algorithms assume small max_depth
     print()
-    print('const size_t MAX_PARENT_DEPTH = %d;' % max_depth)
+    print('uint32_t getMaxAncestorTreeDepth() {')
+    print('    return %d;' % max_depth)
+    print('}')
 
 
 def read_and_dump_parent_data(icu_data_dir, likely_script_dict):
@@ -286,10 +345,33 @@
         'external', 'icu', 'icu4c', 'source', 'data')
     cldr_source_dir = os.path.join(source_root, 'external', 'cldr')
 
+    print('''/*
+ * Copyright (C) 2025 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.
+ */
+
+''')
     print('// Auto-generated by %s' % sys.argv[0])
-    print()
+    print('''
+#include <androidfw/LocaleDataLookup.h>
+
+namespace android {
+''')
     likely_script_dict = read_and_dump_likely_data(cldr_source_dir)
     read_and_dump_parent_data(icu_data_dir, likely_script_dict)
+    print()
+    print('} // namespace android')
 
 
 if __name__ == '__main__':