diff --git a/DEPS b/DEPS index f432f8d..3172b141 100644 --- a/DEPS +++ b/DEPS
@@ -175,11 +175,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'b47eb188cc52354bac043fbd25f20689b5d2f294', + 'skia_revision': 'af203a677aacb4291eb77f8cc76d223be2e89bce', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'd3cd492629b80bbf4433278508bf99e97163c2f3', + 'v8_revision': '3b4586216b8e96a98bd46c76068caadd744956d0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -187,15 +187,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '816132a33463d8a826bce5f6e0d005745600d84f', + 'angle_revision': '291be9acc1d0a61d571420f25af0a0989817b3bf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'ab210f92a84f1806e0a6af7e5c88d8cd46705ec3', + 'swiftshader_revision': '6e3a387c01598240a7a8722ab8cbd1015ec1cd0a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '1c9b1c07affbe5d325a107fd24b52152f684292f', + 'pdfium_revision': 'a919e1bd9dd0ed0f8fa7534dfe6659c511fe7a1c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -238,7 +238,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '47e7bed70800a39ea9c97195f1235b8e2fbd07cc', + 'catapult_revision': 'efb804d60cd79f22379c43a4cce0d9dffc9f310a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -246,7 +246,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'e730e5b1a28a4913af1887f40b04301e06ccbd5d', + 'devtools_frontend_revision': 'd892991127bfa890d2e417919004939074ddff58', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -306,7 +306,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'f58f69f66bacefb0aaf78e91b462b5db97cea391', + 'dawn_revision': '87d31381588b26edb3da1d75dd0588b2df4dd968', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -533,7 +533,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '286cf2ae8c6f0509b15380b1992bac813c05e7e0', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '7967e9ed75ed62d5613a4f4e646f57666c78306c', 'condition': 'checkout_ios', }, @@ -889,7 +889,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8b876bd4074ba806460807ba440bc20327ddad42', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '44134341fa8b46e83bad3bef48a8bc6badaa3083', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1254,7 +1254,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '2b02e3287584ed6582dcced9ec08b3acdece37e3', + Var('chromium_git') + '/openscreen' + '@' + '8b5e9a4830efe03b7d8e737025808ceaedd0ed14', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '46d7cb392019e934e2944bdd317be8ed5176b3f2', @@ -1282,7 +1282,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b1a4f570b72fc9c07d5d9906ba3440ee82b4fd29', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f04938adfc40c1ae4425fdc6a70f9b14961146f5', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1553,7 +1553,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a16932a784b6dfb0919dece17836ef615b322076', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@041b5b6ffaa5766967ac7ea347ddbeb1071f8639', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 0f4afb5..3b01b4c 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -495,6 +495,7 @@ sources = [ "java/src/org/chromium/android_webview/common/AwResource.java", "java/src/org/chromium/android_webview/common/Flag.java", + "java/src/org/chromium/android_webview/common/FlagOverrideConstants.java", "java/src/org/chromium/android_webview/common/FlagOverrideHelper.java", "java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java", "java/src/org/chromium/android_webview/common/services/ServiceNames.java",
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java index a0279c7f..7cf005e 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
@@ -168,6 +168,10 @@ // available when AwFeatureListCreator::SetUpFieldTrials() runs. finishVariationsInitLocked(); + if (AwBrowserProcess.isDeveloperModeEnabled()) { + AwBrowserProcess.getAndApplyFlagOverridesSync(); + } + AwBrowserProcess.start(); AwBrowserProcess.handleMinidumpsAndSetMetricsConsent(true /* updateMetricsConsent */);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java index 2448771..9b426c4 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java +++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -8,6 +8,9 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; import android.os.Build; import android.os.IBinder; import android.os.ParcelFileDescriptor; @@ -15,7 +18,10 @@ import android.os.StrictMode; import org.chromium.android_webview.common.CommandLineUtil; +import org.chromium.android_webview.common.FlagOverrideConstants; +import org.chromium.android_webview.common.FlagOverrideHelper; import org.chromium.android_webview.common.PlatformServiceBridge; +import org.chromium.android_webview.common.ProductionSupportedFlagList; import org.chromium.android_webview.common.services.ICrashReceiverService; import org.chromium.android_webview.common.services.ServiceNames; import org.chromium.android_webview.metrics.AwMetricsServiceClient; @@ -46,6 +52,7 @@ import java.io.RandomAccessFile; import java.nio.channels.FileLock; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -364,6 +371,47 @@ }); } + // Quickly determine whether developer mode is enabled. + public static boolean isDeveloperModeEnabled() { + final Context context = ContextUtils.getApplicationContext(); + ComponentName flagOverrideContentProvider = new ComponentName( + getWebViewPackageName(), ServiceNames.FLAG_OVERRIDE_CONTENT_PROVIDER); + int enabledState = + context.getPackageManager().getComponentEnabledSetting(flagOverrideContentProvider); + return enabledState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + } + + public static void getAndApplyFlagOverridesSync() { + FlagOverrideHelper helper = new FlagOverrideHelper(ProductionSupportedFlagList.sFlagList); + helper.applyFlagOverrides(getFlagOverrides()); + } + + private static Map<String, Boolean> getFlagOverrides() { + Map<String, Boolean> flagOverrides = new HashMap<>(); + + Uri uri = new Uri.Builder() + .scheme("content") + .authority(getWebViewPackageName() + + FlagOverrideConstants.URI_AUTHORITY_SUFFIX) + .path(FlagOverrideConstants.URI_PATH) + .build(); + final Context appContext = ContextUtils.getApplicationContext(); + try (Cursor cursor = appContext.getContentResolver().query(uri, /* projection */ null, + /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) { + assert cursor != null : "ContentProvider doesn't support querying '" + uri + "'"; + int flagNameColumnIndex = + cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_NAME_COLUMN); + int flagStateColumnIndex = + cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_STATE_COLUMN); + while (cursor.moveToNext()) { + String flagName = cursor.getString(flagNameColumnIndex); + boolean flagState = cursor.getInt(flagStateColumnIndex) != 0; + flagOverrides.put(flagName, flagState); + } + } + return flagOverrides; + } + // Do not instantiate this class. private AwBrowserProcess() {} }
diff --git a/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java b/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java new file mode 100644 index 0000000..fcb0a83 --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java
@@ -0,0 +1,18 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.common; + +/** + * Constants to facilitate communication with {@code FlagOverrideContentProvider}. + */ +public final class FlagOverrideConstants { + // Do not instantiate this class. + private FlagOverrideConstants() {} + + public static final String URI_AUTHORITY_SUFFIX = ".FlagOverrideContentProvider"; + public static final String URI_PATH = "/flag-overrides"; + public static final String FLAG_NAME_COLUMN = "flagName"; + public static final String FLAG_STATE_COLUMN = "flagState"; +}
diff --git a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java index ea88cd9..48fc0ba 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java +++ b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java
@@ -17,6 +17,8 @@ "org.chromium.android_webview.services.CrashReceiverService"; public static final String DEVELOPER_UI_SERVICE = "org.chromium.android_webview.services.DeveloperUiService"; + public static final String FLAG_OVERRIDE_CONTENT_PROVIDER = + "org.chromium.android_webview.services.FlagOverrideContentProvider"; public static final String VARIATIONS_SEED_SERVER = "org.chromium.android_webview.services.VariationsSeedServer";
diff --git a/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java index a56ff0c..e1ec9b3 100644 --- a/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java +++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java
@@ -15,6 +15,7 @@ import org.chromium.android_webview.services.AwMinidumpUploadJobService; import org.chromium.android_webview.services.CrashReceiverService; import org.chromium.android_webview.services.DeveloperUiService; +import org.chromium.android_webview.services.FlagOverrideContentProvider; import org.chromium.android_webview.services.VariationsSeedServer; import org.chromium.testing.local.LocalRobolectricTestRunner; @@ -32,6 +33,9 @@ ServiceNames.CRASH_RECEIVER_SERVICE); Assert.assertEquals("Incorrect class name constant", DeveloperUiService.class.getName(), ServiceNames.DEVELOPER_UI_SERVICE); + Assert.assertEquals("Incorrect class name constant", + FlagOverrideContentProvider.class.getName(), + ServiceNames.FLAG_OVERRIDE_CONTENT_PROVIDER); Assert.assertEquals("Incorrect class name constant", VariationsSeedServer.class.getName(), ServiceNames.VARIATIONS_SEED_SERVER); }
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn index cd1867ab..80baf3e 100644 --- a/android_webview/nonembedded/BUILD.gn +++ b/android_webview/nonembedded/BUILD.gn
@@ -73,6 +73,7 @@ "java/src/org/chromium/android_webview/services/AwVariationsSeedFetcher.java", "java/src/org/chromium/android_webview/services/CrashReceiverService.java", "java/src/org/chromium/android_webview/services/DeveloperUiService.java", + "java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java", "java/src/org/chromium/android_webview/services/VariationsSeedHolder.java", "java/src/org/chromium/android_webview/services/VariationsSeedServer.java", ]
diff --git a/android_webview/nonembedded/java/AndroidManifest.xml b/android_webview/nonembedded/java/AndroidManifest.xml index c9dea7b..b4cd519d 100644 --- a/android_webview/nonembedded/java/AndroidManifest.xml +++ b/android_webview/nonembedded/java/AndroidManifest.xml
@@ -72,6 +72,12 @@ android:exported="true" android:authorities="{{ manifest_package }}.LicenseContentProvider" android:process=":webview_apk" /> {# Explicit process required for monochrome compatibility. #} + <!-- Disabled by default, enabled at runtime by Developer UI. --> + <provider android:name="org.chromium.android_webview.services.FlagOverrideContentProvider" + android:exported="true" + android:enabled="false" + android:authorities="{{ manifest_package }}.FlagOverrideContentProvider" + android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} {% if donor_package is not defined %} <!-- If you change the variations services, also see android_webview/test/shell/AndroidManifest.xml. --> @@ -92,10 +98,8 @@ android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} - <!-- Disabled by default, enabled at runtime by Developer UI. --> <service android:name="org.chromium.android_webview.services.DeveloperUiService" - android:exported="true" - android:enabled="false" + android:exported="false" android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} {% endif %} {% endmacro %}
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java index 1e4f091..ec1859fc 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java
@@ -10,7 +10,6 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; @@ -192,7 +191,6 @@ private class FlagsServiceConnection implements ServiceConnection { public void start() { - enableDeveloperMode(); Intent intent = new Intent(); intent.setClassName( FlagsActivity.this.getPackageName(), ServiceNames.DEVELOPER_UI_SERVICE); @@ -226,13 +224,6 @@ connection.start(); } - private void enableDeveloperMode() { - ComponentName developerModeService = - new ComponentName(this, ServiceNames.DEVELOPER_UI_SERVICE); - this.getPackageManager().setComponentEnabledSetting(developerModeService, - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - } - private void resetAllFlags() { // Clear the map, then update the Spinners from the map value. mOverriddenFlags.clear();
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java index 3439622..415f132 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java
@@ -32,13 +32,11 @@ private static final String CHANNEL_ID = "DevUiChannel"; private static final int FLAG_OVERRIDE_NOTIFICATION_ID = 1; - private final Object mLock = new Object(); - // TODO(ntfschr): at the moment we're only writing to this map. When we implement the - // WebView-side implementation, we'll read the map to send the flag overrides. - @GuardedBy("mLock") - private Map<String, Boolean> mOverriddenFlags = new HashMap<>(); + private static final Object sLock = new Object(); + @GuardedBy("sLock") + private static Map<String, Boolean> sOverriddenFlags = new HashMap<>(); - @GuardedBy("mLock") + @GuardedBy("sLock") private boolean mDeveloperModeEnabled; private final IDeveloperUiService.Stub mBinder = new IDeveloperUiService.Stub() { @@ -48,9 +46,9 @@ throw new SecurityException( "setFlagOverrides() may only be called by the Developer UI app"); } - synchronized (mLock) { - mOverriddenFlags = overriddenFlags; - if (mOverriddenFlags.isEmpty()) { + synchronized (sLock) { + sOverriddenFlags = overriddenFlags; + if (sOverriddenFlags.isEmpty()) { disableDeveloperMode(); } else { enableDeveloperMode(); @@ -59,6 +57,14 @@ } }; + public static Map<String, Boolean> getFlagOverrides() { + synchronized (sLock) { + // Create a copy so the caller can do what it wants with the Map without worrying about + // thread safety. + return new HashMap<>(sOverriddenFlags); + } + } + @Override public IBinder onBind(Intent intent) { return mBinder; @@ -118,28 +124,34 @@ } private void enableDeveloperMode() { - synchronized (mLock) { + synchronized (sLock) { if (mDeveloperModeEnabled) return; // Keep this service alive as long as we're in developer mode. startService(new Intent(this, DeveloperUiService.class)); markAsForegroundService(); + + ComponentName flagOverrideContentProvider = + new ComponentName(this, FlagOverrideContentProvider.class.getName()); + getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + mDeveloperModeEnabled = true; } } private void disableDeveloperMode() { - synchronized (mLock) { + synchronized (sLock) { if (!mDeveloperModeEnabled) return; - stopForeground(/* removeNotification */ true); mDeveloperModeEnabled = false; - ComponentName developerModeService = - new ComponentName(this, DeveloperUiService.class.getName()); - getPackageManager().setComponentEnabledSetting(developerModeService, + ComponentName flagOverrideContentProvider = + new ComponentName(this, FlagOverrideContentProvider.class.getName()); + getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); // Finally, stop the service explicitly. Do this last to make sure we do the other // necessary cleanup. + stopForeground(/* removeNotification */ true); stopSelf(); } }
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java new file mode 100644 index 0000000..e39f8e64 --- /dev/null +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java
@@ -0,0 +1,80 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package org.chromium.android_webview.services; + +import android.content.ComponentName; +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; + +import org.chromium.android_webview.common.FlagOverrideConstants; + +import java.util.Map; + +/** + * A {@link ContentProvider} to fetch the flag overrides, via the {@code query()} method. No special + * permissions are required to access this ContentProvider, and it can be accessed by any context + * (including the embedded WebView implementation). + */ +public final class FlagOverrideContentProvider extends ContentProvider { + @Override + public boolean onCreate() { + return true; + } + + @Override + public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { + throw new UnsupportedOperationException(); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + throw new UnsupportedOperationException(); + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + throw new UnsupportedOperationException(); + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + if (FlagOverrideConstants.URI_PATH.equals(uri.getPath())) { + Map<String, Boolean> flagOverrides = DeveloperUiService.getFlagOverrides(); + final String[] columns = {FlagOverrideConstants.FLAG_NAME_COLUMN, + FlagOverrideConstants.FLAG_STATE_COLUMN}; + MatrixCursor cursor = new MatrixCursor(columns, flagOverrides.size()); + for (Map.Entry<String, Boolean> entry : flagOverrides.entrySet()) { + String flagName = entry.getKey(); + boolean enabled = entry.getValue(); + cursor.addRow(new Object[] {flagName, enabled ? 1 : 0}); + } + if (flagOverrides.isEmpty()) { + disableDeveloperMode(); + } + return cursor; + } + return null; + } + + private void disableDeveloperMode() { + ComponentName flagOverrideContentProvider = + new ComponentName(getContext(), FlagOverrideContentProvider.class.getName()); + getContext().getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + + // Stop the service explicitly, in case it's running. NOOP if the service is not running. + getContext().stopService(new Intent(getContext(), DeveloperUiService.class)); + } + + @Override + public String getType(Uri uri) { + throw new UnsupportedOperationException(); + } +}
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index e365616..b527bb7 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -525,6 +525,9 @@ if (!app_list_features::IsAssistantLauncherUIEnabled()) return; + ash::ShelfConfig::Get()->SetAssistantVisible( + new_state == AppListState::kStateEmbeddedAssistant); + UpdateLauncherContainer(); // Band-aid for https://b/144056527 to update visibility after AppListState
diff --git a/ash/assistant/model/ui/assistant_card_element.h b/ash/assistant/model/ui/assistant_card_element.h index bcb9c08c..ade91e0 100644 --- a/ash/assistant/model/ui/assistant_card_element.h +++ b/ash/assistant/model/ui/assistant_card_element.h
@@ -28,11 +28,8 @@ ~AssistantCardElement() override; const std::string& html() const { return html_; } - const std::string& fallback() const { return fallback_; } - const content::NavigableContents* contents() const { return contents_.get(); } - content::NavigableContents* contents() { return contents_.get(); } void set_contents(std::unique_ptr<content::NavigableContents> contents) { contents_ = std::move(contents);
diff --git a/ash/assistant/ui/BUILD.gn b/ash/assistant/ui/BUILD.gn index 89d3113..f122b12 100644 --- a/ash/assistant/ui/BUILD.gn +++ b/ash/assistant/ui/BUILD.gn
@@ -89,6 +89,8 @@ "main_stage/assistant_query_view.h", "main_stage/assistant_text_element_view.cc", "main_stage/assistant_text_element_view.h", + "main_stage/assistant_ui_element_view.cc", + "main_stage/assistant_ui_element_view.h", "main_stage/element_animator.cc", "main_stage/element_animator.h", "main_stage/suggestion_chip_view.cc",
diff --git a/ash/assistant/ui/assistant_web_view.h b/ash/assistant/ui/assistant_web_view.h index af5e752..2403373 100644 --- a/ash/assistant/ui/assistant_web_view.h +++ b/ash/assistant/ui/assistant_web_view.h
@@ -24,10 +24,12 @@ enum class AssistantButtonId; class AssistantWebViewDelegate; -// AssistantWebView is a child of AssistantBubbleView which allows Assistant UI -// to render remotely hosted content within its bubble. It provides a CaptionBar -// for window level controls and embeds web contents with help from the Content -// Service. +// TODO(b/146520500): Merge into AssistantWebContainerView after deprecating +// standalone Assistant UI. +// AssistantWebView is a child of AssistantContainerView which allows Assistant +// UI to render remotely hosted content within its bubble. It provides a +// CaptionBar for window level controls and embeds web contents with help from +// the Content Service. class COMPONENT_EXPORT(ASSISTANT_UI) AssistantWebView : public views::View, public CaptionBarDelegate,
diff --git a/ash/assistant/ui/main_stage/assistant_card_element_view.cc b/ash/assistant/ui/main_stage/assistant_card_element_view.cc index bb78ded..b1305bfd 100644 --- a/ash/assistant/ui/main_stage/assistant_card_element_view.cc +++ b/ash/assistant/ui/main_stage/assistant_card_element_view.cc
@@ -74,6 +74,14 @@ return "AssistantCardElementView"; } +ui::Layer* AssistantCardElementView::GetLayerForAnimating() { + return native_view()->layer(); +} + +std::string AssistantCardElementView::ToStringForTesting() const { + return card_element_->html(); +} + void AssistantCardElementView::AddedToWidget() { aura::Window* const top_level_window = native_view()->GetToplevelWindow(); @@ -223,7 +231,7 @@ } content::NavigableContents* AssistantCardElementView::contents() { - return const_cast<AssistantCardElement*>(card_element_)->contents(); + return const_cast<content::NavigableContents*>(card_element_->contents()); } } // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_card_element_view.h b/ash/assistant/ui/main_stage/assistant_card_element_view.h index 56ae2b9..b363e5b 100644 --- a/ash/assistant/ui/main_stage/assistant_card_element_view.h +++ b/ash/assistant/ui/main_stage/assistant_card_element_view.h
@@ -5,11 +5,13 @@ #ifndef ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_CARD_ELEMENT_VIEW_H_ #define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_CARD_ELEMENT_VIEW_H_ +#include <string> + +#include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" #include "base/component_export.h" #include "base/macros.h" #include "services/content/public/cpp/navigable_contents.h" #include "services/content/public/cpp/navigable_contents_view.h" -#include "ui/views/view.h" namespace ash { @@ -19,15 +21,17 @@ // AssistantCardElementView is the visual representation of an // AssistantCardElement. It is a child view of UiElementContainerView. class COMPONENT_EXPORT(ASSISTANT_UI) AssistantCardElementView - : public views::View, + : public AssistantUiElementView, public content::NavigableContentsObserver { public: AssistantCardElementView(AssistantViewDelegate* delegate, const AssistantCardElement* card_element); ~AssistantCardElementView() override; - // views::View: + // AssistantUiElementView: const char* GetClassName() const override; + ui::Layer* GetLayerForAnimating() override; + std::string ToStringForTesting() const override; void AddedToWidget() override; void ChildPreferredSizeChanged(views::View* child) override; void AboutToRequestFocusFromTabTraversal(bool reverse) override; @@ -49,17 +53,12 @@ // belonging to AssistantCardElementView. gfx::NativeView native_view() { return contents()->GetView()->native_view(); } - const AssistantCardElement* GetCardElementForTesting() const { - return card_element_; - } - private: void InitLayout(const AssistantCardElement* card_element); content::NavigableContents* contents(); AssistantViewDelegate* const delegate_; - const AssistantCardElement* const card_element_; // Rect of the focused node in the |contents_|.
diff --git a/ash/assistant/ui/main_stage/assistant_text_element_view.cc b/ash/assistant/ui/main_stage/assistant_text_element_view.cc index 0ae1f5d5..a252ade 100644 --- a/ash/assistant/ui/main_stage/assistant_text_element_view.cc +++ b/ash/assistant/ui/main_stage/assistant_text_element_view.cc
@@ -4,26 +4,22 @@ #include "ash/assistant/ui/main_stage/assistant_text_element_view.h" +#include <memory> + #include "ash/assistant/model/ui/assistant_text_element.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "base/strings/utf_string_conversions.h" #include "ui/views/background.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/fill_layout.h" namespace ash { // AssistantTextElementView ---------------------------------------------------- AssistantTextElementView::AssistantTextElementView( - const AssistantTextElement* text_element) - : views::Label(base::UTF8ToUTF16(text_element->text())) { - SetAutoColorReadabilityEnabled(false); - SetEnabledColor(kTextColorPrimary); - SetFontList(assistant::ui::GetDefaultFontList() - .DeriveWithSizeDelta(2) - .DeriveWithWeight(gfx::Font::Weight::MEDIUM)); - SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - SetMultiLine(true); - SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); + const AssistantTextElement* text_element) { + InitLayout(text_element); } AssistantTextElementView::~AssistantTextElementView() = default; @@ -32,4 +28,33 @@ return "AssistantTextElementView"; } +ui::Layer* AssistantTextElementView::GetLayerForAnimating() { + return layer(); +} + +std::string AssistantTextElementView::ToStringForTesting() const { + return base::UTF16ToUTF8(label_->GetText()); +} + +void AssistantTextElementView::ChildPreferredSizeChanged(views::View* child) { + PreferredSizeChanged(); +} + +void AssistantTextElementView::InitLayout( + const AssistantTextElement* text_element) { + SetLayoutManager(std::make_unique<views::FillLayout>()); + + // Label. + label_ = AddChildView( + std::make_unique<views::Label>(base::UTF8ToUTF16(text_element->text()))); + label_->SetAutoColorReadabilityEnabled(false); + label_->SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); + label_->SetEnabledColor(kTextColorPrimary); + label_->SetFontList(assistant::ui::GetDefaultFontList() + .DeriveWithSizeDelta(2) + .DeriveWithWeight(gfx::Font::Weight::MEDIUM)); + label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + label_->SetMultiLine(true); +} + } // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_text_element_view.h b/ash/assistant/ui/main_stage/assistant_text_element_view.h index df3ef4e6..ffc7cba 100644 --- a/ash/assistant/ui/main_stage/assistant_text_element_view.h +++ b/ash/assistant/ui/main_stage/assistant_text_element_view.h
@@ -5,9 +5,15 @@ #ifndef ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_TEXT_ELEMENT_VIEW_H_ #define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_TEXT_ELEMENT_VIEW_H_ +#include <string> + +#include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" #include "base/component_export.h" #include "base/macros.h" -#include "ui/views/controls/label.h" + +namespace views { +class Label; +} // namespace views namespace ash { @@ -16,15 +22,22 @@ // AssistantTextElementView is the visual representation of an // AssistantTextElement. It is a child view of UiElementContainerView. class COMPONENT_EXPORT(ASSISTANT_UI) AssistantTextElementView - : public views::Label { + : public AssistantUiElementView { public: explicit AssistantTextElementView(const AssistantTextElement* text_element); ~AssistantTextElementView() override; - // views::Label: + // AssistantUiElementView: const char* GetClassName() const override; + ui::Layer* GetLayerForAnimating() override; + std::string ToStringForTesting() const override; + void ChildPreferredSizeChanged(views::View* child) override; private: + void InitLayout(const AssistantTextElement* text_element); + + views::Label* label_; // Owned by view hierarchy. + DISALLOW_COPY_AND_ASSIGN(AssistantTextElementView); };
diff --git a/ash/assistant/ui/main_stage/assistant_ui_element_view.cc b/ash/assistant/ui/main_stage/assistant_ui_element_view.cc new file mode 100644 index 0000000..2862dbb --- /dev/null +++ b/ash/assistant/ui/main_stage/assistant_ui_element_view.cc
@@ -0,0 +1,156 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" + +#include "ash/assistant/ui/main_stage/element_animator.h" +#include "ash/assistant/util/animation_util.h" +#include "ash/public/cpp/app_list/app_list_features.h" +#include "ui/compositor/callback_layer_animation_observer.h" +#include "ui/compositor/layer_animation_element.h" +#include "ui/compositor/layer_animator.h" + +namespace ash { + +namespace { + +using assistant::util::CreateLayerAnimationSequence; +using assistant::util::CreateOpacityElement; +using assistant::util::CreateTransformElement; +using assistant::util::StartLayerAnimationSequence; +using assistant::util::StartLayerAnimationSequencesTogether; + +// Main UI animation. +constexpr base::TimeDelta kMainUiElementAnimationFadeInDelay = + base::TimeDelta::FromMilliseconds(83); +constexpr base::TimeDelta kMainUiElementAnimationFadeInDuration = + base::TimeDelta::FromMilliseconds(250); +constexpr base::TimeDelta kMainUiElementAnimationFadeOutDuration = + base::TimeDelta::FromMilliseconds(167); + +// Embedded UI animation. +constexpr base::TimeDelta kEmbeddedUiElementAnimationFadeInDuration = + base::TimeDelta::FromMilliseconds(250); +constexpr base::TimeDelta kEmbeddedUiElementAnimationFadeOutDuration = + base::TimeDelta::FromMilliseconds(200); +constexpr base::TimeDelta kEmbeddedUiElementAnimationTranslateUpDuration = + base::TimeDelta::FromMilliseconds(250); +constexpr int kEmbeddedUiElementAnimationTranslateUpDistanceDip = 32; + +// AssistantUiElementViewAnimator ---------------------------------------------- + +class AssistantUiElementViewAnimator : public ElementAnimator { + public: + explicit AssistantUiElementViewAnimator(AssistantUiElementView* view) + : ElementAnimator(view), view_(view) {} + explicit AssistantUiElementViewAnimator( + AssistantUiElementViewAnimator& copy) = delete; + AssistantUiElementViewAnimator& operator=( + AssistantUiElementViewAnimator& assign) = delete; + ~AssistantUiElementViewAnimator() override = default; + + // ElementAnimator: + void AnimateIn(ui::CallbackLayerAnimationObserver* observer) override { + if (app_list_features::IsAssistantLauncherUIEnabled()) { + // As part of the animation we will translate the element up from the + // bottom so we need to start by translating it down. + TranslateDown(); + StartLayerAnimationSequencesTogether(layer()->GetAnimator(), + { + CreateFadeInAnimation(), + CreateTranslateUpAnimation(), + }, + observer); + } else { + StartLayerAnimationSequence( + layer()->GetAnimator(), + CreateLayerAnimationSequence( + ui::LayerAnimationElement::CreatePauseElement( + ui::LayerAnimationElement::AnimatableProperty::OPACITY, + kMainUiElementAnimationFadeInDelay), + CreateOpacityElement(1.f, kMainUiElementAnimationFadeInDuration)), + observer); + } + } + + void AnimateOut(ui::CallbackLayerAnimationObserver* observer) override { + if (app_list_features::IsAssistantLauncherUIEnabled()) { + StartLayerAnimationSequence( + layer()->GetAnimator(), + CreateLayerAnimationSequence( + CreateOpacityElement(kMinimumAnimateOutOpacity, + kEmbeddedUiElementAnimationFadeOutDuration)), + observer); + } else { + StartLayerAnimationSequence( + layer()->GetAnimator(), + CreateLayerAnimationSequence(CreateOpacityElement( + kMinimumAnimateOutOpacity, kMainUiElementAnimationFadeOutDuration, + gfx::Tween::Type::FAST_OUT_SLOW_IN)), + observer); + } + } + + // TODO(dmblack): Remove this override after deprecating standalone UI. It + // handles a one-off case for standalone UI that didn't seem worth abstracting + // out given that standalone UI is soon to be removed from the code base. + void FadeOut(ui::CallbackLayerAnimationObserver* observer) override { + if (!app_list_features::IsAssistantLauncherUIEnabled() && + strcmp(view_->GetClassName(), "AssistantTextElementView") == 0) { + // Text elements in standalone UI must fade out completely as the thinking + // dots will appear in the location of the first text element. + StartLayerAnimationSequence( + layer()->GetAnimator(), + assistant::util::CreateLayerAnimationSequence( + assistant::util::CreateOpacityElement(0.f, kFadeOutDuration)), + observer); + } else { + ElementAnimator::FadeOut(observer); + } + } + + ui::Layer* layer() const override { return view_->GetLayerForAnimating(); } + + private: + void TranslateDown() const { + DCHECK(app_list_features::IsAssistantLauncherUIEnabled()); + gfx::Transform transform; + transform.Translate(0, kEmbeddedUiElementAnimationTranslateUpDistanceDip); + layer()->SetTransform(transform); + } + + ui::LayerAnimationSequence* CreateFadeInAnimation() const { + DCHECK(app_list_features::IsAssistantLauncherUIEnabled()); + return CreateLayerAnimationSequence( + CreateOpacityElement(1.f, kEmbeddedUiElementAnimationFadeInDuration, + gfx::Tween::Type::FAST_OUT_SLOW_IN)); + } + + ui::LayerAnimationSequence* CreateTranslateUpAnimation() const { + DCHECK(app_list_features::IsAssistantLauncherUIEnabled()); + return CreateLayerAnimationSequence(CreateTransformElement( + gfx::Transform(), kEmbeddedUiElementAnimationTranslateUpDuration, + gfx::Tween::Type::FAST_OUT_SLOW_IN)); + } + + AssistantUiElementView* const view_; +}; + +} // namespace + +// AssistantUiElementView ------------------------------------------------------ + +AssistantUiElementView::AssistantUiElementView() = default; + +AssistantUiElementView::~AssistantUiElementView() = default; + +const char* AssistantUiElementView::GetClassName() const { + return "AssistantUiElementView"; +} + +std::unique_ptr<ElementAnimator> AssistantUiElementView::CreateAnimator() { + return std::make_unique<AssistantUiElementViewAnimator>(this); +} + +} // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_ui_element_view.h b/ash/assistant/ui/main_stage/assistant_ui_element_view.h new file mode 100644 index 0000000..ca36f22 --- /dev/null +++ b/ash/assistant/ui/main_stage/assistant_ui_element_view.h
@@ -0,0 +1,46 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_UI_ELEMENT_VIEW_H_ +#define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_UI_ELEMENT_VIEW_H_ + +#include <memory> +#include <string> + +#include "base/component_export.h" +#include "ui/views/view.h" + +namespace ash { + +class ElementAnimator; + +// Base class for a visual representation of an AssistantUiElement. It is a +// child view of UiElementContainerView. +class COMPONENT_EXPORT(ASSISTANT_UI) AssistantUiElementView + : public views::View { + public: + explicit AssistantUiElementView(AssistantUiElementView& copy) = delete; + AssistantUiElementView& operator=(AssistantUiElementView& assign) = delete; + ~AssistantUiElementView() override; + + // views::View: + const char* GetClassName() const override; + + // Returns the layer that should be used when animating this view. + virtual ui::Layer* GetLayerForAnimating() = 0; + + // Returns a string representation of this view for testing. + virtual std::string ToStringForTesting() const = 0; + + // Returns a newly created animator which is used by UiElementContainerView + // to animate this view on/off stage in sync with Assistant response events. + virtual std::unique_ptr<ElementAnimator> CreateAnimator(); + + protected: + AssistantUiElementView(); +}; + +} // namespace ash + +#endif // ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_UI_ELEMENT_VIEW_H_
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc index 61b91d4..db2686a 100644 --- a/ash/assistant/ui/main_stage/ui_element_container_view.cc +++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -18,14 +18,10 @@ #include "ash/assistant/ui/main_stage/assistant_card_element_view.h" #include "ash/assistant/ui/main_stage/assistant_text_element_view.h" #include "ash/assistant/ui/main_stage/element_animator.h" -#include "ash/assistant/util/animation_util.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "base/callback.h" #include "base/time/time.h" #include "ui/aura/window.h" -#include "ui/compositor/callback_layer_animation_observer.h" -#include "ui/compositor/layer_animation_element.h" -#include "ui/compositor/layer_animator.h" #include "ui/views/border.h" #include "ui/views/layout/box_layout.h" @@ -33,37 +29,12 @@ namespace { -using assistant::util::CreateLayerAnimationSequence; -using assistant::util::CreateOpacityElement; -using assistant::util::CreateTransformElement; -using assistant::util::StartLayerAnimationSequence; - // Appearance. constexpr int kEmbeddedUiFirstCardMarginTopDip = 8; constexpr int kEmbeddedUiPaddingBottomDip = 8; constexpr int kMainUiFirstCardMarginTopDip = 40; constexpr int kMainUiPaddingBottomDip = 24; -// Main UI element animation. -constexpr base::TimeDelta kMainUiElementAnimationFadeInDelay = - base::TimeDelta::FromMilliseconds(83); -constexpr base::TimeDelta kMainUiElementAnimationFadeInDuration = - base::TimeDelta::FromMilliseconds(250); -constexpr base::TimeDelta kMainUiElementAnimationFadeOutDuration = - base::TimeDelta::FromMilliseconds(167); -// Text elements must fade out to 0 as the thinking dots will appear in the -// location of the first text element. -constexpr float kMainUiTextElementAnimationFadeOutOpacity = 0.f; - -// Embedded UI element animation. -constexpr base::TimeDelta kEmbeddedUiElementAnimationFadeInDuration = - base::TimeDelta::FromMilliseconds(250); -constexpr base::TimeDelta kEmbeddedUiElementAnimationMoveUpDuration = - base::TimeDelta::FromMilliseconds(250); -constexpr base::TimeDelta kEmbeddedUiElementAnimationFadeOutDuration = - base::TimeDelta::FromMilliseconds(200); -constexpr int kEmbeddedUiElementAnimationMoveUpDistanceDip = 32; - // Helpers --------------------------------------------------------------------- int GetFirstCardMarginTopDip() { @@ -78,159 +49,6 @@ : kMainUiPaddingBottomDip; } -// Animator for elements in the main (non-embedded) UI. -class MainUiAnimator : public ElementAnimator { - public: - using ElementAnimator::ElementAnimator; - ~MainUiAnimator() override = default; - - // ElementAnimator: - void AnimateOut(ui::CallbackLayerAnimationObserver* observer) override { - StartLayerAnimationSequence( - layer()->GetAnimator(), - CreateLayerAnimationSequence(CreateOpacityElement( - kMinimumAnimateOutOpacity, kMainUiElementAnimationFadeOutDuration, - gfx::Tween::Type::FAST_OUT_SLOW_IN)), - observer); - } - - void AnimateIn(ui::CallbackLayerAnimationObserver* observer) override { - // We fade in the views to full opacity after a slight delay. - assistant::util::StartLayerAnimationSequence( - layer()->GetAnimator(), - CreateLayerAnimationSequence( - ui::LayerAnimationElement::CreatePauseElement( - ui::LayerAnimationElement::AnimatableProperty::OPACITY, - kMainUiElementAnimationFadeInDelay), - CreateOpacityElement(1.f, kMainUiElementAnimationFadeInDuration)), - observer); - } - - private: - DISALLOW_COPY_AND_ASSIGN(MainUiAnimator); -}; - -// Animator used for card elements in the main (non-embedded) UI. -class MainUiCardAnimator : public MainUiAnimator { - public: - // Constructor used for card elements. - explicit MainUiCardAnimator(AssistantCardElementView* element) - : MainUiAnimator(element), element_(element) {} - - ui::Layer* layer() const override { return element_->native_view()->layer(); } - - private: - AssistantCardElementView* const element_; - - DISALLOW_COPY_AND_ASSIGN(MainUiCardAnimator); -}; - -// Animator used for text elements in the main (non-embedded) UI. -class MainUiTextAnimator : public MainUiAnimator { - public: - // Constructor used for text elements. - explicit MainUiTextAnimator(AssistantTextElementView* element) - : MainUiAnimator(element) {} - - void FadeOut(ui::CallbackLayerAnimationObserver* observer) override { - assistant::util::StartLayerAnimationSequence( - layer()->GetAnimator(), - assistant::util::CreateLayerAnimationSequence( - assistant::util::CreateOpacityElement( - kMainUiTextElementAnimationFadeOutOpacity, kFadeOutDuration)), - observer); - } - - private: - DISALLOW_COPY_AND_ASSIGN(MainUiTextAnimator); -}; - -// Animator for elements in the embedded UI. -class EmbeddedUiAnimator : public ElementAnimator { - public: - using ElementAnimator::ElementAnimator; - ~EmbeddedUiAnimator() override = default; - - // ElementAnimator: - void AnimateOut(ui::CallbackLayerAnimationObserver* observer) override { - StartLayerAnimationSequence( - layer()->GetAnimator(), - CreateLayerAnimationSequence( - CreateOpacityElement(kMinimumAnimateOutOpacity, - kEmbeddedUiElementAnimationFadeOutDuration)), - observer); - } - - void AnimateIn(ui::CallbackLayerAnimationObserver* observer) override { - // As part of the animation we will move up the element from the bottom - // so we need to start by moving it down. - MoveElementDown(); - - assistant::util::StartLayerAnimationSequencesTogether( - layer()->GetAnimator(), - { - CreateFadeInAnimation(), - CreateMoveUpAnimation(), - }, - observer); - } - - private: - void MoveElementDown() const { - gfx::Transform transform; - transform.Translate(0, kEmbeddedUiElementAnimationMoveUpDistanceDip); - layer()->SetTransform(transform); - } - - ui::LayerAnimationSequence* CreateFadeInAnimation() const { - return CreateLayerAnimationSequence( - CreateOpacityElement(1.f, kEmbeddedUiElementAnimationFadeInDuration, - gfx::Tween::Type::FAST_OUT_SLOW_IN)); - } - - ui::LayerAnimationSequence* CreateMoveUpAnimation() const { - return CreateLayerAnimationSequence(CreateTransformElement( - gfx::Transform(), kEmbeddedUiElementAnimationMoveUpDuration, - gfx::Tween::Type::FAST_OUT_SLOW_IN)); - } - - DISALLOW_COPY_AND_ASSIGN(EmbeddedUiAnimator); -}; - -// Animator for card elements in the embedded UI. -class EmbeddedUiCardAnimator : public EmbeddedUiAnimator { - public: - // Constructor used for card elements. - explicit EmbeddedUiCardAnimator(AssistantCardElementView* element) - : EmbeddedUiAnimator(element), element_(element) {} - - ui::Layer* layer() const override { return element_->native_view()->layer(); } - - private: - AssistantCardElementView* const element_; - - DISALLOW_COPY_AND_ASSIGN(EmbeddedUiCardAnimator); -}; - -// Animator for text elements in the embedded UI. -using EmbeddedUiTextAnimator = EmbeddedUiAnimator; - -std::unique_ptr<ElementAnimator> CreateCardAnimator( - AssistantCardElementView* card_element) { - if (app_list_features::IsAssistantLauncherUIEnabled()) - return std::make_unique<EmbeddedUiCardAnimator>(card_element); - else - return std::make_unique<MainUiCardAnimator>(card_element); -} - -std::unique_ptr<ElementAnimator> CreateTextAnimator( - AssistantTextElementView* text_element) { - if (app_list_features::IsAssistantLauncherUIEnabled()) - return std::make_unique<EmbeddedUiTextAnimator>(text_element); - else - return std::make_unique<MainUiTextAnimator>(text_element); -} - } // namespace // UiElementContainerView ------------------------------------------------------ @@ -335,7 +153,7 @@ card_element_view->native_view()->layer()->SetOpacity(0.f); // We set the animator to handle all animations for this view. - AddElementAnimator(CreateCardAnimator(card_element_view)); + AddElementAnimator(card_element_view->CreateAnimator()); } void UiElementContainerView::OnTextElementAdded( @@ -351,7 +169,7 @@ content_view()->AddChildView(text_element_view); // We set the animator to handle all animations for this view. - AddElementAnimator(CreateTextAnimator(text_element_view)); + AddElementAnimator(text_element_view->CreateAnimator()); } void UiElementContainerView::OnAllViewsRemoved() {
diff --git a/ash/assistant/util/assistant_util.cc b/ash/assistant/util/assistant_util.cc index 8875bca..69870d9 100644 --- a/ash/assistant/util/assistant_util.cc +++ b/ash/assistant/util/assistant_util.cc
@@ -12,6 +12,7 @@ namespace { +constexpr char kAtlasBoardType[] = "atlas"; constexpr char kEveBoardType[] = "eve"; constexpr char kNocturneBoardType[] = "nocturne"; @@ -83,6 +84,7 @@ bool IsGoogleDevice() { const std::string board_name = base::SysInfo::GetLsbReleaseBoard(); return g_override_is_google_device || + IsBoardType(board_name, kAtlasBoardType) || IsBoardType(board_name, kEveBoardType) || IsBoardType(board_name, kNocturneBoardType); }
diff --git a/ash/home_screen/drag_window_from_shelf_controller.cc b/ash/home_screen/drag_window_from_shelf_controller.cc index d57a64c17..3cb4522 100644 --- a/ash/home_screen/drag_window_from_shelf_controller.cc +++ b/ash/home_screen/drag_window_from_shelf_controller.cc
@@ -173,17 +173,16 @@ if (overview_controller->InOverviewSession()) { const SplitViewController::SnapPosition snap_position = GetSnapPosition(location_in_screen); - OverviewSession* overview_session = overview_controller->overview_session(); - overview_session->UpdateSplitViewDragIndicatorsWindowDraggingStates( - Shell::GetPrimaryRootWindow(), /*is_dragging=*/true, - SplitViewDragIndicators::WindowDraggingState::kFromShelf, - snap_position); - overview_session->OnWindowDragContinued( - window_, location_in_screen, + const SplitViewDragIndicators::WindowDraggingState window_dragging_state = SplitViewDragIndicators::ComputeWindowDraggingState( /*is_dragging=*/true, SplitViewDragIndicators::WindowDraggingState::kFromShelf, - snap_position)); + snap_position); + OverviewSession* overview_session = overview_controller->overview_session(); + overview_session->UpdateSplitViewDragIndicatorsWindowDraggingStates( + Shell::GetPrimaryRootWindow(), window_dragging_state); + overview_session->OnWindowDragContinued(window_, location_in_screen, + window_dragging_state); if (snap_position != SplitViewController::NONE) { // If the dragged window is in snap preview area, make sure overview is @@ -346,10 +345,7 @@ ShowOverviewDuringOrAfterDrag(); OverviewSession* overview_session = overview_controller->overview_session(); - overview_session->UpdateSplitViewDragIndicatorsWindowDraggingStates( - Shell::GetPrimaryRootWindow(), /*is_dragging=*/false, - SplitViewDragIndicators::WindowDraggingState::kNoDrag, - SplitViewController::NONE); + overview_session->ResetSplitViewDragIndicatorsWindowDraggingStates(); overview_session->OnWindowDragEnded( window_, location_in_screen, should_drop_window_in_overview, /*snap=*/snap_position != SplitViewController::NONE);
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 52c6e46..b2b1da3 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -67,6 +67,10 @@ "assistant/assistant_state.h", "assistant/assistant_state_base.cc", "assistant/assistant_state_base.h", + "assistant/assistant_web_view_2.cc", + "assistant/assistant_web_view_2.h", + "assistant/assistant_web_view_factory.cc", + "assistant/assistant_web_view_factory.h", "assistant/proactive_suggestions.cc", "assistant/proactive_suggestions.h", "assistant/proactive_suggestions_client.cc",
diff --git a/ash/public/cpp/arc_notifications_host_initializer.h b/ash/public/cpp/arc_notifications_host_initializer.h index 3238ad58..4006d6b1 100644 --- a/ash/public/cpp/arc_notifications_host_initializer.h +++ b/ash/public/cpp/arc_notifications_host_initializer.h
@@ -7,6 +7,7 @@ #include "ash/public/cpp/ash_public_export.h" #include "components/arc/mojom/notifications.mojom.h" +#include "mojo/public/cpp/bindings/pending_remote.h" namespace ash { @@ -15,7 +16,8 @@ static ArcNotificationsHostInitializer* Get(); virtual void SetArcNotificationsInstance( - arc::mojom::NotificationsInstancePtr arc_notification_instance) = 0; + mojo::PendingRemote<arc::mojom::NotificationsInstance> + arc_notification_instance) = 0; protected: ArcNotificationsHostInitializer();
diff --git a/ash/public/cpp/assistant/assistant_web_view_2.cc b/ash/public/cpp/assistant/assistant_web_view_2.cc new file mode 100644 index 0000000..4231e68 --- /dev/null +++ b/ash/public/cpp/assistant/assistant_web_view_2.cc
@@ -0,0 +1,20 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/public/cpp/assistant/assistant_web_view_2.h" + +namespace ash { + +// AssistantWebView2 ----------------------------------------------------------- + +AssistantWebView2::AssistantWebView2() = default; +AssistantWebView2::~AssistantWebView2() = default; + +// AssistantWebView2::InitParams ----------------------------------------------- + +AssistantWebView2::InitParams::InitParams() = default; +AssistantWebView2::InitParams::InitParams(const InitParams& copy) = default; +AssistantWebView2::InitParams::~InitParams() = default; + +} // namespace ash
diff --git a/ash/public/cpp/assistant/assistant_web_view_2.h b/ash/public/cpp/assistant/assistant_web_view_2.h new file mode 100644 index 0000000..46644b76 --- /dev/null +++ b/ash/public/cpp/assistant/assistant_web_view_2.h
@@ -0,0 +1,80 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_2_H_ +#define ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_2_H_ + +#include "ash/public/cpp/ash_public_export.h" +#include "base/observer_list_types.h" +#include "base/optional.h" +#include "ui/views/view.h" + +class GURL; +enum class WindowOpenDisposition; + +namespace ash { + +// TODO(b/146520500): Rename to AssistantWebView after freeing up name which is +// currently in use. +// A view which wraps a views::WebView (and associated content::WebContents) to +// work around dependency restrictions in Ash. +class ASH_PUBLIC_EXPORT AssistantWebView2 : public views::View { + public: + // Initialization parameters which dictate how an instance of + // AssistantWebView2 should behave. + struct InitParams { + InitParams(); + InitParams(const InitParams& copy); + ~InitParams(); + + // If enabled, AssistantWebView2 will automatically resize to the size + // desired by its embedded content::WebContents. Note that, if specified, + // the content::WebContents will be bounded by |min_size| and |max_size|. + bool enable_auto_resize = false; + base::Optional<gfx::Size> min_size = base::nullopt; + base::Optional<gfx::Size> max_size = base::nullopt; + + // If enabled, AssistantWebView2 will suppress navigation attempts of its + // embedded content::WebContents. When navigation suppression occurs, + // Observer::DidSuppressNavigation() will be invoked. + bool suppress_navigation = false; + }; + + // An observer which receives AssistantWebView2 events. + class Observer : public base::CheckedObserver { + public: + // Invoked when the embedded content::WebContents has stopped loading. + virtual void DidStopLoading() {} + + // Invoked when the embedded content::WebContents has suppressed navigation. + virtual void DidSuppressNavigation(const GURL& url, + WindowOpenDisposition disposition, + bool from_user_gesture) {} + + // Invoked when the focused node within the embedded content::WebContents + // has changed. + virtual void DidChangeFocusedNode(const gfx::Rect& node_bounds_in_screen) {} + }; + + ~AssistantWebView2() override; + + // Adds/removes the specified |observer|. + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + + // Invoke to navigate back in the embedded content::WebContents' navigation + // stack. If backwards navigation is not possible, return |false|. Otherwise + // returns |true| to indicate success. + virtual bool GoBack() = 0; + + // Invoke to navigate the embedded content::WebContents' to |url|. + virtual void Navigate(const GURL& url) = 0; + + protected: + AssistantWebView2(); +}; + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_2_H_
diff --git a/ash/public/cpp/assistant/assistant_web_view_factory.cc b/ash/public/cpp/assistant/assistant_web_view_factory.cc new file mode 100644 index 0000000..8055aace --- /dev/null +++ b/ash/public/cpp/assistant/assistant_web_view_factory.cc
@@ -0,0 +1,32 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/public/cpp/assistant/assistant_web_view_factory.h" + +#include "base/logging.h" + +namespace ash { + +namespace { + +AssistantWebViewFactory* g_instance = nullptr; + +} // namespace + +AssistantWebViewFactory::AssistantWebViewFactory() { + DCHECK_EQ(nullptr, g_instance); + g_instance = this; +} + +AssistantWebViewFactory::~AssistantWebViewFactory() { + DCHECK_EQ(g_instance, this); + g_instance = nullptr; +} + +// static +AssistantWebViewFactory* AssistantWebViewFactory::Get() { + return g_instance; +} + +} // namespace ash
diff --git a/ash/public/cpp/assistant/assistant_web_view_factory.h b/ash/public/cpp/assistant/assistant_web_view_factory.h new file mode 100644 index 0000000..6a5e1b8f --- /dev/null +++ b/ash/public/cpp/assistant/assistant_web_view_factory.h
@@ -0,0 +1,33 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_H_ +#define ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_H_ + +#include <memory> + +#include "ash/public/cpp/ash_public_export.h" +#include "ash/public/cpp/assistant/assistant_web_view_2.h" + +namespace ash { + +// A factory implemented in Browser which is responsible for creating instances +// of AssistantWebView2 to work around dependency restrictions in Ash. +class ASH_PUBLIC_EXPORT AssistantWebViewFactory { + public: + // Returns the singleton factory instance. + static AssistantWebViewFactory* Get(); + + // Creates a new AssistantWebView2 instance with the given |params|. + virtual std::unique_ptr<AssistantWebView2> Create( + const AssistantWebView2::InitParams& params) = 0; + + protected: + AssistantWebViewFactory(); + virtual ~AssistantWebViewFactory(); +}; + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_H_
diff --git a/ash/public/cpp/shelf_config.h b/ash/public/cpp/shelf_config.h index 232f5766..e1e1f51 100644 --- a/ash/public/cpp/shelf_config.h +++ b/ash/public/cpp/shelf_config.h
@@ -53,6 +53,8 @@ // AppListControllerObserver: void OnAppListVisibilityWillChange(bool shown, int64_t display_id) override; + void SetAssistantVisible(bool visible); + // Size of the shelf when visible (height when the shelf is horizontal and // width when the shelf is vertical). int shelf_size() const; @@ -189,6 +191,9 @@ // Whether the app list (or home launcher in tablet mode) is visible. bool is_app_list_visible_; + // Whether the Assistant launcher UI is visible. + bool is_assistant_visible_ = false; + // Size of the icons within shelf buttons. const int shelf_button_icon_size_; const int shelf_button_icon_size_dense_;
diff --git a/ash/shelf/home_button_unittest.cc b/ash/shelf/home_button_unittest.cc index db51bae3..92c95d1 100644 --- a/ash/shelf/home_button_unittest.cc +++ b/ash/shelf/home_button_unittest.cc
@@ -106,12 +106,12 @@ start, end, base::TimeDelta::FromMilliseconds(100), 4 /* steps */); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kPeeking); + GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); // Closing the app list. GetAppListTestHelper()->DismissAndRunLoop(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Swiping above the threshold should trigger a fullscreen app list. end.set_y(shelf->GetIdealBounds().bottom() - @@ -121,7 +121,7 @@ base::RunLoop().RunUntilIdle(); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } TEST_P(HomeButtonTest, ClickToOpenAppList) { @@ -136,11 +136,11 @@ GetEventGenerator()->ClickLeftButton(); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kPeeking); + GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); GetEventGenerator()->ClickLeftButton(); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Shift-click should open the app list in fullscreen. GetEventGenerator()->set_flags(ui::EF_SHIFT_DOWN); @@ -148,7 +148,7 @@ GetEventGenerator()->set_flags(0); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Another shift-click should close the app list. GetEventGenerator()->set_flags(ui::EF_SHIFT_DOWN); @@ -156,7 +156,7 @@ GetEventGenerator()->set_flags(0); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); } TEST_P(HomeButtonTest, ButtonPositionInTabletMode) {
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc index bb9919b..a5e798e 100644 --- a/ash/shelf/scrollable_shelf_view.cc +++ b/ash/shelf/scrollable_shelf_view.cc
@@ -219,7 +219,7 @@ // ScrollableShelfArrowView class ScrollableShelfView::ScrollableShelfArrowView - : public ash::ScrollArrowView, + : public ScrollArrowView, public views::ViewTargeterDelegate { public: explicit ScrollableShelfArrowView(ArrowType arrow_type, @@ -1218,31 +1218,27 @@ DCHECK(!presentation_time_recorder_); if (IsInTabletMode()) { if (Shell::Get()->app_list_controller()->IsVisible()) { - presentation_time_recorder_ = - ash::CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), - kScrollDraggingTabletLauncherVisibleHistogram, - kScrollDraggingTabletLauncherVisibleMaxLatencyHistogram); + presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( + GetWidget()->GetCompositor(), + kScrollDraggingTabletLauncherVisibleHistogram, + kScrollDraggingTabletLauncherVisibleMaxLatencyHistogram); } else { - presentation_time_recorder_ = - ash::CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), - kScrollDraggingTabletLauncherHiddenHistogram, - kScrollDraggingTabletLauncherHiddenMaxLatencyHistogram); + presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( + GetWidget()->GetCompositor(), + kScrollDraggingTabletLauncherHiddenHistogram, + kScrollDraggingTabletLauncherHiddenMaxLatencyHistogram); } } else { if (Shell::Get()->app_list_controller()->IsVisible()) { - presentation_time_recorder_ = - ash::CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), - kScrollDraggingClamshellLauncherVisibleHistogram, - kScrollDraggingClamshellLauncherVisibleMaxLatencyHistogram); + presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( + GetWidget()->GetCompositor(), + kScrollDraggingClamshellLauncherVisibleHistogram, + kScrollDraggingClamshellLauncherVisibleMaxLatencyHistogram); } else { - presentation_time_recorder_ = - ash::CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), - kScrollDraggingClamshellLauncherHiddenHistogram, - kScrollDraggingClamshellLauncherHiddenMaxLatencyHistogram); + presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( + GetWidget()->GetCompositor(), + kScrollDraggingClamshellLauncherHiddenHistogram, + kScrollDraggingClamshellLauncherHiddenMaxLatencyHistogram); } } return true;
diff --git a/ash/shelf/scrollable_shelf_view_unittest.cc b/ash/shelf/scrollable_shelf_view_unittest.cc index aaf4e1a..12f2af0 100644 --- a/ash/shelf/scrollable_shelf_view_unittest.cc +++ b/ash/shelf/scrollable_shelf_view_unittest.cc
@@ -50,7 +50,7 @@ // ShelfItemDelegate: void ItemSelected(std::unique_ptr<ui::Event> event, int64_t display_id, - ash::ShelfLaunchSource source, + ShelfLaunchSource source, ItemSelectedCallback callback) override { std::move(callback).Run(SHELF_ACTION_WINDOW_ACTIVATED, {}); }
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc index 7793b89e..bf6e6c98 100644 --- a/ash/shelf/shelf.cc +++ b/ash/shelf/shelf.cc
@@ -472,7 +472,7 @@ auto_hide_event_handler_ = std::make_unique<AutoHideEventHandler>(this); } - if (!auto_dim_event_handler_ && ash::switches::IsUsingShelfAutoDim()) { + if (!auto_dim_event_handler_ && switches::IsUsingShelfAutoDim()) { auto_dim_event_handler_ = std::make_unique<AutoDimEventHandler>(this); } }
diff --git a/ash/shelf/shelf_app_button.cc b/ash/shelf/shelf_app_button.cc index fe8d84a11..d456f0a 100644 --- a/ash/shelf/shelf_app_button.cc +++ b/ash/shelf/shelf_app_button.cc
@@ -731,7 +731,7 @@ std::unique_ptr<views::InkDropRipple> ShelfAppButton::CreateInkDropRipple() const { - const int ink_drop_small_size = ash::ShelfConfig::Get()->hotseat_size(); + const int ink_drop_small_size = ShelfConfig::Get()->hotseat_size(); return std::make_unique<views::SquareInkDropRipple>( gfx::Size(GetInkDropLargeSize(), GetInkDropLargeSize()), ink_drop_large_corner_radius(),
diff --git a/ash/shelf/shelf_config.cc b/ash/shelf/shelf_config.cc index dd1033b..24ce128 100644 --- a/ash/shelf/shelf_config.cc +++ b/ash/shelf/shelf_config.cc
@@ -122,6 +122,14 @@ OnShelfConfigUpdated(); } +void ShelfConfig::SetAssistantVisible(bool visible) { + if (is_assistant_visible_ == visible) + return; + + is_assistant_visible_ = visible; + OnShelfConfigUpdated(); +} + int ShelfConfig::shelf_size() const { return GetShelfSize(false /*ignore_in_app_state*/); } @@ -204,8 +212,9 @@ const auto* session = shell->session_controller(); if (!session) return false; + return session->GetSessionState() == session_manager::SessionState::ACTIVE && - !is_app_list_visible_; + (!is_app_list_visible_ || is_assistant_visible_); } void ShelfConfig::UpdateIsDense() {
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index 2a60592..343f126 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -2352,7 +2352,7 @@ if (hotseat_is_in_drag_) { DCHECK(!hotseat_presentation_time_recorder_); hotseat_presentation_time_recorder_ = - ash::CreatePresentationTimeHistogramRecorder( + CreatePresentationTimeHistogramRecorder( shelf_widget_->hotseat_widget()->GetCompositor(), "Ash.HotseatTransition.Drag.PresentationTime", "Ash.HotseatTransition.Drag.PresentationTime.MaxLatency");
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index c9f6376..8046e82b 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -1466,8 +1466,8 @@ OverviewController* overview_controller = Shell::Get()->overview_controller(); // Tests that the shelf is visible when in overview mode overview_controller->StartOverview(); - ash::ShellTestApi().WaitForOverviewAnimationState( - ash::OverviewAnimationState::kEnterAnimationComplete); + ShellTestApi().WaitForOverviewAnimationState( + OverviewAnimationState::kEnterAnimationComplete); EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState()); EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState()); @@ -1476,8 +1476,8 @@ // Test that on exiting overview mode, the shelf returns to auto hide state. overview_controller->EndOverview(); - ash::ShellTestApi().WaitForOverviewAnimationState( - ash::OverviewAnimationState::kExitAnimationComplete); + ShellTestApi().WaitForOverviewAnimationState( + OverviewAnimationState::kExitAnimationComplete); EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState()); EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState()); @@ -1960,20 +1960,19 @@ gfx::Point target_point = gfx::Point(x, 0); auto test_procedure = [this, &start_point, &target_point]() { - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Drag AppListView from bottom to top. Check that the final state of // AppList is kFullscreenAllApps. MouseDragShelfTo(start_point, target_point); GetAppListTestHelper()->WaitUntilIdle(); - GetAppListTestHelper()->CheckState( - ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Drag AppListView from top to bottom. Check that the AppList is closed // after dragging. MouseDragShelfTo(target_point, start_point); GetAppListTestHelper()->WaitUntilIdle(); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); }; { @@ -2029,12 +2028,12 @@ -(AppListView::kDragVelocityFromShelfThreshold + 10)); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Closing the app list. GetAppListTestHelper()->DismissAndRunLoop(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Fling down that exceeds the velocity threshold should close the app list. StartScroll(start); @@ -2043,7 +2042,7 @@ AppListView::kDragVelocityFromShelfThreshold + 10); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Fling the app list not exceed the velocity threshold, the state depends on // the drag amount. @@ -2053,14 +2052,14 @@ -(AppListView::kDragVelocityFromShelfThreshold - 10)); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kPeeking); + GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); } // Tests that duplicate swipe up from bottom bezel should not make app list // undraggable. (See https://crbug.com/896934) TEST_P(ShelfLayoutManagerTest, DuplicateDragUpFromBezel) { GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Start the drag from the bottom bezel to the area that snaps to fullscreen // state. @@ -2077,13 +2076,13 @@ generator->GestureScrollSequence(start, end, kTimeDelta, kNumScrollSteps); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Start the same drag event from bezel. generator->GestureScrollSequence(start, end, kTimeDelta, kNumScrollSteps); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Start the drag from top screen to the area that snaps to closed state. (The // launcher is still draggable now.) @@ -2094,7 +2093,7 @@ generator->GestureScrollSequence(start, end, kTimeDelta, kNumScrollSteps); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); } // Change the shelf alignment during dragging should dismiss the app list. @@ -2138,7 +2137,7 @@ EXPECT_EQ(SHELF_VISIBLE, shelf->GetVisibilityState()); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Swiping up more than the close threshold but less than peeking threshold // should keep the app list at PEEKING state. @@ -2148,12 +2147,12 @@ EXPECT_EQ(SHELF_VISIBLE, shelf->GetVisibilityState()); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kPeeking); + GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); // Closing the app list. GetAppListTestHelper()->DismissAndRunLoop(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); // Swiping up more than the peeking threshold should keep the app list at // FULLSCREEN_ALL_APPS state. @@ -2163,12 +2162,12 @@ EXPECT_EQ(SHELF_VISIBLE, shelf->GetVisibilityState()); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckVisibility(true); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kFullscreenAllApps); + GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); // Closing the app list. GetAppListTestHelper()->DismissAndRunLoop(); GetAppListTestHelper()->CheckVisibility(false); - GetAppListTestHelper()->CheckState(ash::AppListViewState::kClosed); + GetAppListTestHelper()->CheckState(AppListViewState::kClosed); shelf->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways); // Create a normal unmaximized window, the auto-hide shelf should be hidden. @@ -5764,7 +5763,7 @@ void SetUp() override { if (GetParam()) { base::CommandLine::ForCurrentProcess()->AppendSwitch( - ash::switches::kEnableDimShelf); + switches::kEnableDimShelf); } DimShelfLayoutManagerTestBase::SetUp(); } @@ -5877,7 +5876,7 @@ } base::CommandLine::ForCurrentProcess()->AppendSwitch( - ash::switches::kEnableDimShelf); + switches::kEnableDimShelf); DimShelfLayoutManagerTestBase::SetUp(); }
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index d462d66..8682c86 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -619,7 +619,7 @@ bool ShelfView::OnKeyPressed(const ui::KeyEvent& event) { if (event.IsControlDown() && - ash::keyboard_util::IsArrowKeyCode(event.key_code())) { + keyboard_util::IsArrowKeyCode(event.key_code())) { bool swap_with_next = (event.key_code() == ui::VKEY_DOWN || event.key_code() == ui::VKEY_RIGHT); SwapButtons(GetFocusManager()->GetFocusedView(), swap_with_next);
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index 6884231..92f7998 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -113,7 +113,7 @@ public views::BoundsAnimatorObserver, public ApplicationDragAndDropHost, public ShelfTooltipDelegate, - public ash::TabletModeObserver, + public TabletModeObserver, public ShelfConfig::Observer { public: ShelfView(ShelfModel* model, @@ -656,7 +656,7 @@ // The image proxy for drag operations when a drag and drop host exists and // the item can be dragged outside the app grid. - std::unique_ptr<ash::DragImageView> drag_image_; + std::unique_ptr<DragImageView> drag_image_; // The cursor offset to the middle of the dragged item. gfx::Vector2d drag_image_offset_; @@ -714,7 +714,7 @@ // The AppListViewState recorded before a button press, used to record app // launching metrics. This allows an accurate AppListViewState to be recorded // before AppListViewState changes. - ash::AppListViewState recorded_app_list_view_state_; + AppListViewState recorded_app_list_view_state_; // Whether the applist was shown before a button press, used to record app // launching metrics. This is recorded because AppList visibility can change
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index 33191de..df6c0871 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -2883,7 +2883,7 @@ TEST_P(ShelfViewMenuTest, ShelfViewMenuAnchorPoint) { const ShelfAppButton* shelf_button = GetButtonByID(AddApp()); const bool context_menu = GetParam(); - EXPECT_EQ(ash::ShelfAlignment::kBottom, GetPrimaryShelf()->alignment()); + EXPECT_EQ(ShelfAlignment::kBottom, GetPrimaryShelf()->alignment()); // Test for bottom shelf. EXPECT_EQ( @@ -2892,7 +2892,7 @@ .y()); // Test for left shelf. - GetPrimaryShelf()->SetAlignment(ash::ShelfAlignment::kLeft); + GetPrimaryShelf()->SetAlignment(ShelfAlignment::kLeft); EXPECT_EQ( shelf_button->GetBoundsInScreen().x(), @@ -2900,7 +2900,7 @@ .x()); // Test for right shelf. - GetPrimaryShelf()->SetAlignment(ash::ShelfAlignment::kRight); + GetPrimaryShelf()->SetAlignment(ShelfAlignment::kRight); EXPECT_EQ( shelf_button->GetBoundsInScreen().x(),
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index d0d5cf57..eb4a5eba 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Saamgebinde toestelle</translation> <translation id="1175572348579024023">Rollees</translation> <translation id="1178581264944972037">Laat wag</translation> +<translation id="1190609913194133056">Kennisgewingsentrum</translation> <translation id="1195412055398077112">oorskandeer</translation> <translation id="119944043368869598">Vee alles uit</translation> <translation id="1247372569136754018">Mikrofoon (intern)</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index e4e82fc..ecf223a 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">የተጣመሩ መሣሪያዎች</translation> <translation id="1175572348579024023">ሸብልል</translation> <translation id="1178581264944972037">ለአፍታ አቁም</translation> +<translation id="1190609913194133056">የማሳወቂያ ማዕከል</translation> <translation id="1195412055398077112">ትርፍ ቅኝት</translation> <translation id="119944043368869598">ሁሉንም አጽዳ</translation> <translation id="1247372569136754018">ማይክሮፎን (ውስጣዊ)</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 9f245f58..86033b1 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">الأجهزة المقترنة</translation> <translation id="1175572348579024023">التمرير</translation> <translation id="1178581264944972037">الإيقاف مؤقتًا</translation> +<translation id="1190609913194133056">مركز الإشعارات</translation> <translation id="1195412055398077112">الخروج عن إطار الشاشة</translation> <translation id="119944043368869598">محو الكل</translation> <translation id="1247372569136754018">ميكروفون (داخلي)</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 419fe11..eb531fae 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Birləşmiş cihazlar</translation> <translation id="1175572348579024023">Sürüşdürün</translation> <translation id="1178581264944972037">Durdurun</translation> +<translation id="1190609913194133056">Bildiriş Mərkəzi</translation> <translation id="1195412055398077112">overskan</translation> <translation id="119944043368869598">Hamısını silin</translation> <translation id="1247372569136754018">Mikrofon (daxili)</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index a3f4ce2..a482a8f 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Сдвоени устройства</translation> <translation id="1175572348579024023">Превъртане</translation> <translation id="1178581264944972037">Пауза</translation> +<translation id="1190609913194133056">Център за известия</translation> <translation id="1195412055398077112">допълнителна област</translation> <translation id="119944043368869598">Изчистване на всички</translation> <translation id="1247372569136754018">Микрофон (вътрешен)</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 39ffa4ec..c66b52f 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> <translation id="1175572348579024023">স্ক্রল করুন</translation> <translation id="1178581264944972037">বিরতি</translation> +<translation id="1190609913194133056">বিজ্ঞপ্তি কেন্দ্র</translation> <translation id="1195412055398077112">ওভারস্ক্যান</translation> <translation id="119944043368869598">সব পরিষ্কার করুন</translation> <translation id="1247372569136754018">মাইক্রোফোন (অভ্যন্তরীণ)</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 1266621..1e19ba8 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Upareni uređaji</translation> <translation id="1175572348579024023">Klizanje</translation> <translation id="1178581264944972037">Pauziraj</translation> +<translation id="1190609913194133056">Centar za obavijesti</translation> <translation id="1195412055398077112">ivično područje ekrana</translation> <translation id="119944043368869598">Očisti sve</translation> <translation id="1247372569136754018">Mikrofon (interno)</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 13fa86e2..826e80cf 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositius vinculats</translation> <translation id="1175572348579024023">Desplaça</translation> <translation id="1178581264944972037">Posa en pausa</translation> +<translation id="1190609913194133056">Centre de notificacions</translation> <translation id="1195412055398077112">ajusta la mida</translation> <translation id="119944043368869598">Esborra-ho tot</translation> <translation id="1247372569136754018">Micròfon (intern)</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index fa03624..b8b2f16 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Spárovaná zařízení</translation> <translation id="1175572348579024023">Posunout</translation> <translation id="1178581264944972037">Pozastavit</translation> +<translation id="1190609913194133056">Centrum oznámení</translation> <translation id="1195412055398077112">přesah obrazu</translation> <translation id="119944043368869598">Vymazat vše</translation> <translation id="1247372569136754018">Mikrofon (interní)</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index d915bd2..0cff630 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Parrede enheder</translation> <translation id="1175572348579024023">Rul</translation> <translation id="1178581264944972037">Pause</translation> +<translation id="1190609913194133056">Underretningcenter</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Ryd alle</translation> <translation id="1247372569136754018">Mikrofon (indbygget)</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index d7d3b2c..493eacc 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Gekoppelte Geräte</translation> <translation id="1175572348579024023">Scrollen</translation> <translation id="1178581264944972037">Anhalten</translation> +<translation id="1190609913194133056">Benachrichtigungscenter</translation> <translation id="1195412055398077112">Overscan</translation> <translation id="119944043368869598">Alle löschen</translation> <translation id="1247372569136754018">Mikrofon (intern)</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index b7c539a..5daea524 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation> <translation id="1175572348579024023">Κύλιση</translation> <translation id="1178581264944972037">Παύση</translation> +<translation id="1190609913194133056">Κέντρο ειδοποιήσεων</translation> <translation id="1195412055398077112">υπερσάρωση</translation> <translation id="119944043368869598">Διαγραφή όλων</translation> <translation id="1247372569136754018">Μικρόφωνο (εσωτερικό)</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 35f1ba9fe..404d742 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Paired devices</translation> <translation id="1175572348579024023">Scroll</translation> <translation id="1178581264944972037">Pause</translation> +<translation id="1190609913194133056">Notification Centre</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Clear all</translation> <translation id="1247372569136754018">Microphone (internal)</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 2c8b803..f7bcedf 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1175572348579024023">Desplazamiento</translation> <translation id="1178581264944972037">Detener</translation> +<translation id="1190609913194133056">Centro de notificaciones</translation> <translation id="1195412055398077112">desajuste de dimensiones</translation> <translation id="119944043368869598">Borrar todo</translation> <translation id="1247372569136754018">Micrófono (interno)</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 394b84c..99ff1e11 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivos vinculados</translation> <translation id="1175572348579024023">Desplazarse</translation> <translation id="1178581264944972037">Pausar</translation> +<translation id="1190609913194133056">Centro de notificaciones</translation> <translation id="1195412055398077112">reajustar</translation> <translation id="119944043368869598">Eliminar todo</translation> <translation id="1247372569136754018">Micrófono (interno)</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 82d62cf..e69d9ca 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Seotud seadmed</translation> <translation id="1175572348579024023">Keri</translation> <translation id="1178581264944972037">Peata</translation> +<translation id="1190609913194133056">Märguannete keskus</translation> <translation id="1195412055398077112">liighälvitus</translation> <translation id="119944043368869598">Tühjenda kõik</translation> <translation id="1247372569136754018">Mikrofon (sisemine)</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index f86fb3b1..be7aff1 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Parekatutako gailuak</translation> <translation id="1175572348579024023">Egin gora edo behera</translation> <translation id="1178581264944972037">Pausatu</translation> +<translation id="1190609913194133056">Jakinarazpen-zentroa</translation> <translation id="1195412055398077112">bistaratzen ez den eremua</translation> <translation id="119944043368869598">Garbitu guztiak</translation> <translation id="1247372569136754018">Mikrofonoa (barnekoa)</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index d545bee..742f0f302 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">دستگاههای مرتبطشده</translation> <translation id="1175572348579024023">پیمایش</translation> <translation id="1178581264944972037">مکث</translation> +<translation id="1190609913194133056">مرکز اعلان</translation> <translation id="1195412055398077112">بزرگتر از صفحه</translation> <translation id="119944043368869598">پاک کردن همه</translation> <translation id="1247372569136754018">میکروفون (داخلی)</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 76f79a9..389d385c 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Laiteparit</translation> <translation id="1175572348579024023">Vieritä</translation> <translation id="1178581264944972037">Tauko</translation> +<translation id="1190609913194133056">Ilmoituskeskus</translation> <translation id="1195412055398077112">kuvasta rajataan pois osa</translation> <translation id="119944043368869598">Tyhjennä kaikki</translation> <translation id="1247372569136754018">Mikrofoni (sisäinen)</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index ecf56a4b..5a7659ea 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Mga nakapares na device</translation> <translation id="1175572348579024023">Mag-scroll</translation> <translation id="1178581264944972037">I-pause</translation> +<translation id="1190609913194133056">Notification Center</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">I-clear lahat</translation> <translation id="1247372569136754018">Mikropono (internal)</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 96b835b..9744286 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Appareils associés</translation> <translation id="1175572348579024023">Faire défiler</translation> <translation id="1178581264944972037">Interrompre</translation> +<translation id="1190609913194133056">Centre de notification</translation> <translation id="1195412055398077112">surbalayage</translation> <translation id="119944043368869598">Tout effacer</translation> <translation id="1247372569136754018">Microphone (interne)</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index d2241b6..cf8ead67 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Appareils associés</translation> <translation id="1175572348579024023">Faire défiler</translation> <translation id="1178581264944972037">Suspendre</translation> +<translation id="1190609913194133056">Centre de notification</translation> <translation id="1195412055398077112">Surbalayage</translation> <translation id="119944043368869598">Tout effacer</translation> <translation id="1247372569136754018">Micro (interne)</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 943ea98f..c68a3f8 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1175572348579024023">Desprazarse</translation> <translation id="1178581264944972037">Pausar</translation> +<translation id="1190609913194133056">Centro de notificacións</translation> <translation id="1195412055398077112">sobrevarrido</translation> <translation id="119944043368869598">Borrar todo</translation> <translation id="1247372569136754018">Micrófono (interno)</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 320e1572..f57be493 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation> <translation id="1175572348579024023">સ્ક્રોલ કરો</translation> <translation id="1178581264944972037">થોભો</translation> +<translation id="1190609913194133056">સૂચના કેન્દ્ર</translation> <translation id="1195412055398077112">ઓવરસ્કૅન</translation> <translation id="119944043368869598">બધા દૂર કરો</translation> <translation id="1247372569136754018">માઇક્રોફોન (આંતરિક)</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index cd734a1..38b9c6cd 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">युग्मित डिवाइस</translation> <translation id="1175572348579024023">स्क्रोल करें</translation> <translation id="1178581264944972037">रोकें</translation> +<translation id="1190609913194133056">सूचना केंद्र</translation> <translation id="1195412055398077112">ओवरस्कैन</translation> <translation id="119944043368869598">सारा डेटा साफ़ करें</translation> <translation id="1247372569136754018">माइक्रोफ़ोन (आंतरिक)</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 36d514b..6ff2a42 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Upareni uređaji</translation> <translation id="1175572348579024023">Pomicanje</translation> <translation id="1178581264944972037">Pauziraj</translation> +<translation id="1190609913194133056">Centar za obavijesti</translation> <translation id="1195412055398077112">rubno područje zaslona</translation> <translation id="119944043368869598">Očisti sve</translation> <translation id="1247372569136754018">Mikrofon (ugrađeni)</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 5bb47a0..7e59286 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Párosított eszközök</translation> <translation id="1175572348579024023">Görgetés</translation> <translation id="1178581264944972037">Szünet</translation> +<translation id="1190609913194133056">Értesítési központ</translation> <translation id="1195412055398077112">túlpásztázás</translation> <translation id="119944043368869598">Összes törlése</translation> <translation id="1247372569136754018">Mikrofon (belső)</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 772e43a..5f854431 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Զուգակցված սարքեր</translation> <translation id="1175572348579024023">Ոլորել</translation> <translation id="1178581264944972037">Դադար</translation> +<translation id="1190609913194133056">Ծանուցումների կենտրոն</translation> <translation id="1195412055398077112">էկրանի եզերվածք</translation> <translation id="119944043368869598">Մաքրել բոլորը</translation> <translation id="1247372569136754018">Խոսափող (ներքին)</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index f689b9d..008aec3b 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Perangkat dihubungkan</translation> <translation id="1175572348579024023">Scroll</translation> <translation id="1178581264944972037">Jeda</translation> +<translation id="1190609913194133056">Pusat Notifikasi</translation> <translation id="1195412055398077112">pemindaian berlebih</translation> <translation id="119944043368869598">Hapus semua</translation> <translation id="1247372569136754018">Mikrofon (internal)</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index c0c4a5c..d31dc44 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Pöruð tæki</translation> <translation id="1175572348579024023">Fletta</translation> <translation id="1178581264944972037">Gera hlé</translation> +<translation id="1190609913194133056">Tilkynningamiðstöð</translation> <translation id="1195412055398077112">klipptur rammi</translation> <translation id="119944043368869598">Hreinsa allt</translation> <translation id="1247372569136754018">Hljóðnemi (innbyggður)</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index e9631d2..9c07066 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivi accoppiati</translation> <translation id="1175572348579024023">Scorri</translation> <translation id="1178581264944972037">Pausa</translation> +<translation id="1190609913194133056">Centro notifiche</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Cancella tutto</translation> <translation id="1247372569136754018">Microfono (interno)</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index ee8e22d3..a95398c 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">מכשירים מותאמים</translation> <translation id="1175572348579024023">גלילה</translation> <translation id="1178581264944972037">השהה</translation> +<translation id="1190609913194133056">מרכז התראות</translation> <translation id="1195412055398077112">סריקת יתר</translation> <translation id="119944043368869598">ניקוי הכל</translation> <translation id="1247372569136754018">מיקרופון (פנימי)</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 61a060c..d05d1bd 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ペア設定されたデバイス</translation> <translation id="1175572348579024023">スクロール</translation> <translation id="1178581264944972037">一時停止</translation> +<translation id="1190609913194133056">通知センター</translation> <translation id="1195412055398077112">オーバースキャン</translation> <translation id="119944043368869598">すべて削除</translation> <translation id="1247372569136754018">マイク(内蔵)</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 25d8956..23fc6f5 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">დაწყვილებული მოწყობილობები</translation> <translation id="1175572348579024023">გადაადგილება</translation> <translation id="1178581264944972037">პაუზა</translation> +<translation id="1190609913194133056">შეტყობინებათა ცენტრი</translation> <translation id="1195412055398077112">არასამუშაო არე</translation> <translation id="119944043368869598">ყველაფრის გასუფთავება</translation> <translation id="1247372569136754018">მიკროფონი (შიდა)</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 803d9ed1..cb77fe7 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Жұпталған құрылғылар</translation> <translation id="1175572348579024023">Айналдыру</translation> <translation id="1178581264944972037">Кідірту</translation> +<translation id="1190609913194133056">Хабарландыру орталығы</translation> <translation id="1195412055398077112">көрінбейтін бөлік</translation> <translation id="119944043368869598">Барлығын өшіру</translation> <translation id="1247372569136754018">Микрофон (ішкі)</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index b288d8e..1570af4 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ឧបករណ៍ដែលបានផ្គូផ្គង</translation> <translation id="1175572348579024023">រំកិល</translation> <translation id="1178581264944972037">ផ្អាក</translation> +<translation id="1190609913194133056">មជ្ឈមណ្ឌលជូនដំណឹង</translation> <translation id="1195412055398077112">ពង្រីកអេក្រង់ជ្រុល</translation> <translation id="119944043368869598">ជម្រះទាំងអស់</translation> <translation id="1247372569136754018">មីក្រូហ្វូន (ខាងក្នុង)</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index badd8d1..781fb51a 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ಜೋಡಿ ಮಾಡಲಾದ ಸಾಧನಗಳು</translation> <translation id="1175572348579024023">ಸ್ಕ್ರಾಲ್</translation> <translation id="1178581264944972037">ವಿರಾಮ</translation> +<translation id="1190609913194133056">ಅಧಿಸೂಚನೆಯ ಕೇಂದ್ರ</translation> <translation id="1195412055398077112">ಓವರ್ಸ್ಕ್ಯಾನ್</translation> <translation id="119944043368869598">ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ</translation> <translation id="1247372569136754018">ಮೈಕ್ರೊಫೋನ್ (ಆಂತರಿಕ)</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 6eaf79fe7..61aaa80 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">페어링된 기기</translation> <translation id="1175572348579024023">스크롤</translation> <translation id="1178581264944972037">일시중지</translation> +<translation id="1190609913194133056">알림 센터</translation> <translation id="1195412055398077112">오버스캔</translation> <translation id="119944043368869598">모두 삭제</translation> <translation id="1247372569136754018">마이크(내부)</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index d31a814..ae7b88a 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Жупташкан түзмөктөр</translation> <translation id="1175572348579024023">Сыдыруу</translation> <translation id="1178581264944972037">Бир азга токтотуу</translation> +<translation id="1190609913194133056">Эскертмелер борбору</translation> <translation id="1195412055398077112">иштебеген аймак</translation> <translation id="119944043368869598">Баарын тазалоо</translation> <translation id="1247372569136754018">Микрофон (ички)</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 3cb1ec0e..1d12192 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ອຸປະກອນທີ່ຈັບຄູ່ກັນແລ້ວ</translation> <translation id="1175572348579024023">ເລື່ອນ</translation> <translation id="1178581264944972037">ຢຸດຊົ່ວຄາວ</translation> +<translation id="1190609913194133056">ສູນແຈ້ງເຕືອນ</translation> <translation id="1195412055398077112">ສະແກນເກີນ</translation> <translation id="119944043368869598">ລຶບທັງຫມົດ</translation> <translation id="1247372569136754018">ໄມໂຄຣໂຟນ (ພາຍໃນ)</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 8345e56c0..6068982 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Susieti įrenginiai</translation> <translation id="1175572348579024023">Slinkti</translation> <translation id="1178581264944972037">Pristabdyti</translation> +<translation id="1190609913194133056">Pranešimų centras</translation> <translation id="1195412055398077112">sritis aplink vaizdo kraštus</translation> <translation id="119944043368869598">Valyti viską</translation> <translation id="1247372569136754018">Mikrofonas (vidinis)</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 06e94b1..a3b77bc 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Pārī savienotās ierīces</translation> <translation id="1175572348579024023">Ritināt</translation> <translation id="1178581264944972037">Pauzēt</translation> +<translation id="1190609913194133056">Paziņojumu centrs</translation> <translation id="1195412055398077112">attēla izvērse</translation> <translation id="119944043368869598">Notīrīt visu</translation> <translation id="1247372569136754018">Mikrofons (iebūvētais)</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 2c744d0..3676b09e 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Спарени уреди</translation> <translation id="1175572348579024023">Лизгај</translation> <translation id="1178581264944972037">Пауза</translation> +<translation id="1190609913194133056">Центар за известување</translation> <translation id="1195412055398077112">прескенирање</translation> <translation id="119944043368869598">Исчисти ги сите</translation> <translation id="1247372569136754018">Микрофон (внатрешен)</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 93c9bce..ac19367 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ജോടിയാക്കിയ ഉപകരണങ്ങൾ</translation> <translation id="1175572348579024023">സ്ക്രോൾ ചെയ്യുക</translation> <translation id="1178581264944972037">അല്പംനിര്ത്തൂ</translation> +<translation id="1190609913194133056">അറിയിപ്പ് കേന്ദ്രം</translation> <translation id="1195412055398077112">ഓവർസ്കാൻ</translation> <translation id="119944043368869598">എല്ലാം നീക്കുക</translation> <translation id="1247372569136754018">മൈക്രോഫോൺ (ഇന്റേണൽ)</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index a56932e..ad8b47a 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Хослуулсан төхөөрөмж</translation> <translation id="1175572348579024023">Гүйлгэх</translation> <translation id="1178581264944972037">Түр зогсоох</translation> +<translation id="1190609913194133056">Мэдэгдлийн төв</translation> <translation id="1195412055398077112">Дэлгэцийн дүрс таарахгүй байх</translation> <translation id="119944043368869598">Бүгдийг арилгах</translation> <translation id="1247372569136754018">Микрофон (дотоод)</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index f57ee1fa..a055645b 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">जोडलेली डिव्हाइस</translation> <translation id="1175572348579024023">स्क्रोल करा</translation> <translation id="1178581264944972037">विराम द्या</translation> +<translation id="1190609913194133056">सूचना केंद्र</translation> <translation id="1195412055398077112">ओव्हरस्कॅन</translation> <translation id="119944043368869598">सर्व साफ करा</translation> <translation id="1247372569136754018">मायक्रोफोन (अंतर्गत)</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index ef076ea..7c409f7f 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Peranti digandingkan</translation> <translation id="1175572348579024023">Tatal</translation> <translation id="1178581264944972037">Jeda</translation> +<translation id="1190609913194133056">Pusat Pemberitahuan</translation> <translation id="1195412055398077112">imbas lampau</translation> <translation id="119944043368869598">Kosongkan semua</translation> <translation id="1247372569136754018">Mikrofon (dalaman)</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 0406a98..5370a67 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">တွဲချိတ်ထားသည့် စက်ပစ္စည်းများ</translation> <translation id="1175572348579024023">လှိမ့်ရန်</translation> <translation id="1178581264944972037">ဆိုင်းငံ့ထားရန်</translation> +<translation id="1190609913194133056">အသိပေးချက် စင်တာ</translation> <translation id="1195412055398077112">စကင်လုပ်</translation> <translation id="119944043368869598">အားလုံး ရှင်းရန်</translation> <translation id="1247372569136754018">မိုက်ခရိုဖုန်း (စက်တွင်း)</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 956b5984..f4185a6 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">जोडा बनाइएका यन्त्रहरू</translation> <translation id="1175572348579024023">स्क्रोल गर्नुहोस्</translation> <translation id="1178581264944972037">पज गर्नुहोस्</translation> +<translation id="1190609913194133056">सूचना केन्द्र</translation> <translation id="1195412055398077112">अत्याधिकस्क्यान</translation> <translation id="119944043368869598">सबै सफा गर्नुहोस्</translation> <translation id="1247372569136754018">माइक्रोफोन (आन्तरिक)</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 9802c3c..cfed307 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Gekoppelde apparaten</translation> <translation id="1175572348579024023">Scrollen</translation> <translation id="1178581264944972037">Onderbreken</translation> +<translation id="1190609913194133056">Meldingscentrum</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Alles wissen</translation> <translation id="1247372569136754018">Microfoon (intern)</translation> @@ -131,7 +132,7 @@ <translation id="2653659639078652383">Verzenden</translation> <translation id="2658778018866295321">Klikken en slepen</translation> <translation id="2700493154570097719">Je toetsenbord instellen</translation> -<translation id="2704781753052663061">Deelnemen aan andere wifi-netwerken</translation> +<translation id="2704781753052663061">Verbinden met andere wifi-netwerken</translation> <translation id="2718395828230677721">Nachtverlichting</translation> <translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation> <translation id="2761704814324807722">Statusvak, tijd <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 679f466..a7d3683 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Tilkoblede enheter</translation> <translation id="1175572348579024023">Rull</translation> <translation id="1178581264944972037">Stans midlertidig</translation> +<translation id="1190609913194133056">Varselsenter</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Fjern alle</translation> <translation id="1247372569136754018">Mikrofon (intern)</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index ec63475..cf032ebb 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ</translation> <translation id="1175572348579024023">ਸਕ੍ਰੋਲ</translation> <translation id="1178581264944972037">ਰੋਕੋ</translation> +<translation id="1190609913194133056">ਸੂਚਨਾ ਕੇਂਦਰ</translation> <translation id="1195412055398077112">ਓਵਰਸਕੈਨ</translation> <translation id="119944043368869598">ਸਾਰੇ ਹਟਾਓ</translation> <translation id="1247372569136754018">ਮਾਈਕ੍ਰੋਫ਼ੋਨ (ਅੰਦਰੂਨੀ)</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 3febe35..203cb3f9 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Sparowane urządzenia</translation> <translation id="1175572348579024023">Przewijanie</translation> <translation id="1178581264944972037">Wstrzymaj</translation> +<translation id="1190609913194133056">Centrum powiadomień</translation> <translation id="1195412055398077112">nadmiarowość obrazu</translation> <translation id="119944043368869598">Wyczyść wszystko</translation> <translation id="1247372569136754018">Mikrofon (wewnętrzny)</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index e8cba10..1d0c86f 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivos pareados</translation> <translation id="1175572348579024023">Rolar</translation> <translation id="1178581264944972037">Pausar</translation> +<translation id="1190609913194133056">Central de Notificações</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="1247372569136754018">Microfone (interno)</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 6a5979f..c04d452 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1175572348579024023">Deslocar</translation> <translation id="1178581264944972037">Pausa</translation> +<translation id="1190609913194133056">Centro de Notificações</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="1247372569136754018">Microfone (interno)</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 26a42dd8..bd964dc 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Dispozitive asociate</translation> <translation id="1175572348579024023">Derulează</translation> <translation id="1178581264944972037">Întrerupe</translation> +<translation id="1190609913194133056">Centrul pentru notificări</translation> <translation id="1195412055398077112">suprascanare</translation> <translation id="119944043368869598">Șterge-le pe toate</translation> <translation id="1247372569136754018">Microfon (intern)</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index fb30532..d23e34417 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Сопряженные устройства</translation> <translation id="1175572348579024023">Прокрутка</translation> <translation id="1178581264944972037">Пауза</translation> +<translation id="1190609913194133056">Центр уведомлений</translation> <translation id="1195412055398077112">Каемка экрана</translation> <translation id="119944043368869598">Удалить все</translation> <translation id="1247372569136754018">Микрофон (встроенный)</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 020f378..196a979f 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">යුගලිත උපාංග</translation> <translation id="1175572348579024023">අනුචලන කරන්න</translation> <translation id="1178581264944972037">විරාමය</translation> +<translation id="1190609913194133056">දැනුම්දීම් මධ්යස්ථානය</translation> <translation id="1195412055398077112">ඕවර්ස්කෑන්</translation> <translation id="119944043368869598">සියල්ල පිරිසිදු කරන්න</translation> <translation id="1247372569136754018">මයික්රෆෝනය (අභ්යන්තර)</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 3a586e5a..42c6868 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Spárované zariadenia</translation> <translation id="1175572348579024023">Posúvanie</translation> <translation id="1178581264944972037">Pozastaviť</translation> +<translation id="1190609913194133056">Centrum upozornení</translation> <translation id="1195412055398077112">presah obsahu</translation> <translation id="119944043368869598">Vymazať všetko</translation> <translation id="1247372569136754018">Mikrofón (vnútorný)</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index c3b3b26..ad726ec 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Seznanjene naprave</translation> <translation id="1175572348579024023">Drseče pomikanje</translation> <translation id="1178581264944972037">Prekini</translation> +<translation id="1190609913194133056">Središče za obvestila</translation> <translation id="1195412055398077112">upodabljanje čez rob zaslona</translation> <translation id="119944043368869598">Izbriši vse</translation> <translation id="1247372569136754018">Mikrofon (vgrajeni)</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index f6e1c05..94e5ba3 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Pajisjet e çiftuara</translation> <translation id="1175572348579024023">Lëviz</translation> <translation id="1178581264944972037">Pauzë</translation> +<translation id="1190609913194133056">Qendra e njoftimeve</translation> <translation id="1195412055398077112">mbiskanim</translation> <translation id="119944043368869598">Pastroji të gjitha</translation> <translation id="1247372569136754018">Mikrofoni (i brendshëm)</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 5e70524..47fe3020 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Упарени уређаји</translation> <translation id="1175572348579024023">Померај</translation> <translation id="1178581264944972037">Паузирај</translation> +<translation id="1190609913194133056">Центар за обавештења</translation> <translation id="1195412055398077112">ивично подручје екрана</translation> <translation id="119944043368869598">Обриши све</translation> <translation id="1247372569136754018">Микрофон (интерни)</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 007ef0d..68a5e11a 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Kopplade enheter</translation> <translation id="1175572348579024023">Rulla</translation> <translation id="1178581264944972037">Paus</translation> +<translation id="1190609913194133056">Meddelandecenter</translation> <translation id="1195412055398077112">överskanning</translation> <translation id="119944043368869598">Ta bort alla</translation> <translation id="1247372569136754018">Mikrofon (inbyggd)</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index c1ab527..12a65fc 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> <translation id="1175572348579024023">Sogeza</translation> <translation id="1178581264944972037">Sitisha</translation> +<translation id="1190609913194133056">Kituo cha Arifa</translation> <translation id="1195412055398077112">angalia kwa ujumla:</translation> <translation id="119944043368869598">Ondoa vyote</translation> <translation id="1247372569136754018">Maikrofoni (ya ndani)</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index f62898d..5340ea3 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation> <translation id="1175572348579024023">நகர்த்து</translation> <translation id="1178581264944972037">இடைநிறுத்து</translation> +<translation id="1190609913194133056">அறிவிப்பு மையம்</translation> <translation id="1195412055398077112">ஓவர்ஸ்கேன்</translation> <translation id="119944043368869598">அனைத்தையும் அழி</translation> <translation id="1247372569136754018">மைக்ரோஃபோன் (அகம்)</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index db8f2c8..af7a53d 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">జత చేసిన పరికరాలు</translation> <translation id="1175572348579024023">స్క్రోల్ చేస్తుంది</translation> <translation id="1178581264944972037">పాజ్ చేయి</translation> +<translation id="1190609913194133056">నోటిఫికేషన్ కేంద్రం</translation> <translation id="1195412055398077112">ఓవర్స్కాన్</translation> <translation id="119944043368869598">అన్ని క్లియర్ చెయ్యి</translation> <translation id="1247372569136754018">మైక్రోఫోన్ (అంతర్గతం)</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 96b143c..2e577fcbc 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> <translation id="1175572348579024023">เลื่อน</translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> +<translation id="1190609913194133056">ศูนย์การแจ้งเตือน</translation> <translation id="1195412055398077112">โอเวอร์สแกน</translation> <translation id="119944043368869598">ล้างทั้งหมด</translation> <translation id="1247372569136754018">ไมโครโฟน (ภายใน)</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index dd2fc34..50a27514 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Eşlenen cihazlar</translation> <translation id="1175572348579024023">Kaydır</translation> <translation id="1178581264944972037">Duraklat</translation> +<translation id="1190609913194133056">Bildirim Merkezi</translation> <translation id="1195412055398077112">fazla tarama</translation> <translation id="119944043368869598">Tümünü temizle</translation> <translation id="1247372569136754018">Mikrofon (dahili)</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index d30ee5b..7a2a0f6 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Підключені пристрої</translation> <translation id="1175572348579024023">Прокрутити</translation> <translation id="1178581264944972037">Пауза</translation> +<translation id="1190609913194133056">Центр сповіщень</translation> <translation id="1195412055398077112">облямівка екрана</translation> <translation id="119944043368869598">Очистити все</translation> <translation id="1247372569136754018">Мікрофон (внутрішній)</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 235be151..d3572b7 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">جوڑا بنائے ہوئے آلات</translation> <translation id="1175572348579024023">اسکرول کریں</translation> <translation id="1178581264944972037">موقوف کریں</translation> +<translation id="1190609913194133056">اطلاعاتی مرکز</translation> <translation id="1195412055398077112">اوور سکین</translation> <translation id="119944043368869598">سب کو صاف کریں</translation> <translation id="1247372569136754018">مائیکروفون (داخلی)</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index e647247..2a050696 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Ulangan qurilmalar</translation> <translation id="1175572348579024023">Aylantirish</translation> <translation id="1178581264944972037">Pauza</translation> +<translation id="1190609913194133056">Bildirishnomalar markazi</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Barchasini tozalash</translation> <translation id="1247372569136754018">Mikrofon (ichki)</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 4adb598..9643941 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Thiết bị được ghép nối</translation> <translation id="1175572348579024023">Cuộn</translation> <translation id="1178581264944972037">Tạm dừng</translation> +<translation id="1190609913194133056">Trung tâm thông báo</translation> <translation id="1195412055398077112">quét quá mức</translation> <translation id="119944043368869598">Xóa tất cả</translation> <translation id="1247372569136754018">Micrô (bên trong)</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 5999e0a..83d54a6 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">已配对的设备</translation> <translation id="1175572348579024023">滚动</translation> <translation id="1178581264944972037">暂停</translation> +<translation id="1190609913194133056">通知中心</translation> <translation id="1195412055398077112">过扫描</translation> <translation id="119944043368869598">全部清除</translation> <translation id="1247372569136754018">麦克风(内部)</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 0461e36..dd35ac2 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">已配對的裝置</translation> <translation id="1175572348579024023">捲動</translation> <translation id="1178581264944972037">暫停</translation> +<translation id="1190609913194133056">通知中心</translation> <translation id="1195412055398077112">溢出掃描描</translation> <translation id="119944043368869598">全部清除</translation> <translation id="1247372569136754018">麥克風 (內置)</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 3b481bdc..a3d4eac 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">配對裝置</translation> <translation id="1175572348579024023">捲動</translation> <translation id="1178581264944972037">暫停</translation> +<translation id="1190609913194133056">通知中心</translation> <translation id="1195412055398077112">遮視區域</translation> <translation id="119944043368869598">全部清除</translation> <translation id="1247372569136754018">麥克風 (內部)</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 1596ef0..4333776 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -15,6 +15,7 @@ <translation id="1153356358378277386">Amadivaysi abhanqene</translation> <translation id="1175572348579024023">Skrola</translation> <translation id="1178581264944972037">Misa isikhashana</translation> +<translation id="1190609913194133056">Isikhungo Sokwazisa</translation> <translation id="1195412055398077112">skena ngaphezulu</translation> <translation id="119944043368869598">Sula konke</translation> <translation id="1247372569136754018">Imakrofoni (okwangaphakathi)</translation>
diff --git a/ash/system/accessibility/dictation_button_tray.cc b/ash/system/accessibility/dictation_button_tray.cc index bd131dbd..7d66357 100644 --- a/ash/system/accessibility/dictation_button_tray.cc +++ b/ash/system/accessibility/dictation_button_tray.cc
@@ -23,8 +23,6 @@ DictationButtonTray::DictationButtonTray(Shelf* shelf) : TrayBackgroundView(shelf), icon_(new views::ImageView()) { - UpdateVisibility(); - off_image_ = gfx::CreateVectorIcon(kDictationOffNewuiIcon, ShelfConfig::Get()->shelf_icon_color()); on_image_ = gfx::CreateVectorIcon(kDictationOnNewuiIcon, @@ -54,6 +52,11 @@ return true; } +void DictationButtonTray::Initialize() { + TrayBackgroundView::Initialize(); + UpdateVisibility(); +} + void DictationButtonTray::ClickedOutsideBubble() {} void DictationButtonTray::OnDictationStarted() {
diff --git a/ash/system/accessibility/dictation_button_tray.h b/ash/system/accessibility/dictation_button_tray.h index bf646c6..da924a4 100644 --- a/ash/system/accessibility/dictation_button_tray.h +++ b/ash/system/accessibility/dictation_button_tray.h
@@ -42,6 +42,7 @@ void OnAccessibilityStatusChanged() override; // TrayBackgroundView: + void Initialize() override; void ClickedOutsideBubble() override; base::string16 GetAccessibleNameForTray() override; void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
diff --git a/ash/system/message_center/arc/arc_notification_manager.cc b/ash/system/message_center/arc/arc_notification_manager.cc index 511d6491..c45cb7ed 100644 --- a/ash/system/message_center/arc/arc_notification_manager.cc +++ b/ash/system/message_center/arc/arc_notification_manager.cc
@@ -74,15 +74,16 @@ InstanceOwner() = default; ~InstanceOwner() = default; - void SetInstancePtr(NotificationsInstancePtr instance_ptr) { + void SetInstanceRemote( + mojo::PendingRemote<arc::mojom::NotificationsInstance> instance_remote) { DCHECK(!channel_); channel_ = std::make_unique<MojoChannel<NotificationsInstance, NotificationsHost>>( - &holder_, std::move(instance_ptr)); + &holder_, std::move(instance_remote)); // Using base::Unretained because |this| owns |channel_|. - channel_->set_connection_error_handler( + channel_->set_disconnect_handler( base::BindOnce(&InstanceOwner::OnDisconnected, base::Unretained(this))); channel_->QueryVersion(); } @@ -139,8 +140,9 @@ instance_owner_.reset(); } -void ArcNotificationManager::SetInstance(NotificationsInstancePtr instance) { - instance_owner_->SetInstancePtr(std::move(instance)); +void ArcNotificationManager::SetInstance( + mojo::PendingRemote<arc::mojom::NotificationsInstance> instance_remote) { + instance_owner_->SetInstanceRemote(std::move(instance_remote)); } ConnectionHolder<NotificationsInstance, NotificationsHost>*
diff --git a/ash/system/message_center/arc/arc_notification_manager.h b/ash/system/message_center/arc/arc_notification_manager.h index 84e61eda..c324fbfb 100644 --- a/ash/system/message_center/arc/arc_notification_manager.h +++ b/ash/system/message_center/arc/arc_notification_manager.h
@@ -14,6 +14,7 @@ #include "components/arc/mojom/notifications.mojom.h" #include "components/arc/session/connection_holder.h" #include "components/arc/session/connection_observer.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "ui/message_center/message_center.h" namespace ash { @@ -36,7 +37,8 @@ ~ArcNotificationManager() override; - void SetInstance(arc::mojom::NotificationsInstancePtr instance); + void SetInstance( + mojo::PendingRemote<arc::mojom::NotificationsInstance> instance_remote); arc::ConnectionHolder<arc::mojom::NotificationsInstance, arc::mojom::NotificationsHost>*
diff --git a/ash/system/message_center/arc/arc_notification_manager_unittest.cc b/ash/system/message_center/arc/arc_notification_manager_unittest.cc index b467602c..9125a4a 100644 --- a/ash/system/message_center/arc/arc_notification_manager_unittest.cc +++ b/ash/system/message_center/arc/arc_notification_manager_unittest.cc
@@ -16,7 +16,7 @@ #include "components/arc/session/connection_holder.h" #include "components/arc/test/connection_holder_util.h" #include "components/arc/test/fake_notifications_instance.h" -#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/message_center/fake_message_center.h" @@ -140,10 +140,10 @@ receiver_ = std::make_unique<mojo::Receiver<arc::mojom::NotificationsInstance>>( arc_notifications_instance_.get()); - arc::mojom::NotificationsInstancePtr instance_ptr; - receiver_->Bind(mojo::MakeRequest(&instance_ptr)); + mojo::PendingRemote<arc::mojom::NotificationsInstance> remote; + receiver_->Bind(remote.InitWithNewPipeAndPassReceiver()); - arc_notification_manager_->SetInstance(std::move(instance_ptr)); + arc_notification_manager_->SetInstance(std::move(remote)); WaitForInstanceReady( arc_notification_manager_->GetConnectionHolderForTest()); }
diff --git a/ash/system/message_center/message_center_controller.cc b/ash/system/message_center/message_center_controller.cc index 13738ab..1d7dba9 100644 --- a/ash/system/message_center/message_center_controller.cc +++ b/ash/system/message_center/message_center_controller.cc
@@ -97,7 +97,8 @@ } void MessageCenterController::SetArcNotificationsInstance( - arc::mojom::NotificationsInstancePtr arc_notification_instance) { + mojo::PendingRemote<arc::mojom::NotificationsInstance> + arc_notification_instance) { if (!arc_notification_manager_) { arc_notification_manager_ = std::make_unique<ArcNotificationManager>( std::make_unique<ArcNotificationManagerDelegateImpl>(),
diff --git a/ash/system/message_center/message_center_controller.h b/ash/system/message_center/message_center_controller.h index 88bbc1e9..203cc36 100644 --- a/ash/system/message_center/message_center_controller.h +++ b/ash/system/message_center/message_center_controller.h
@@ -10,6 +10,7 @@ #include "ash/ash_export.h" #include "ash/public/cpp/arc_notifications_host_initializer.h" #include "base/macros.h" +#include "mojo/public/cpp/bindings/pending_remote.h" class PrefRegistrySimple; @@ -36,7 +37,8 @@ // ArcNotificationsHostInitializer: void SetArcNotificationsInstance( - arc::mojom::NotificationsInstancePtr arc_notification_instance) override; + mojo::PendingRemote<arc::mojom::NotificationsInstance> + arc_notification_instance) override; InactiveUserNotificationBlocker* inactive_user_notification_blocker_for_testing() {
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc index 51767f5..7a89b1b 100644 --- a/ash/system/tray/tray_background_view.cc +++ b/ash/system/tray/tray_background_view.cc
@@ -516,6 +516,9 @@ if (!visible_preferred_) return false; + if (!GetWidget()) + return false; + // When the status area is collapsed, the effective visibility of the view is // determined by |show_when_collapsed_|. StatusAreaWidget::CollapseState collapse_state =
diff --git a/ash/wm/desks/close_desk_button.cc b/ash/wm/desks/close_desk_button.cc index 120b51b..28930da 100644 --- a/ash/wm/desks/close_desk_button.cc +++ b/ash/wm/desks/close_desk_button.cc
@@ -8,8 +8,10 @@ #include "ash/resources/vector_icons/vector_icons.h" #include "ash/style/ash_color_provider.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/paint_vector_icon.h" +#include "ui/strings/grit/ui_strings.h" #include "ui/views/animation/flood_fill_ink_drop_ripple.h" #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" @@ -44,6 +46,7 @@ SetBackground( CreateBackgroundFromPainter(views::Painter::CreateSolidRoundRectPainter( icon_background_color, kCornerRadius))); + SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE)); AshColorProvider::RippleAttributes ripple_attributes = AshColorProvider::Get()->GetRippleAttributes(icon_background_color);
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index 3de3ce6..b72d4ee 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -19,8 +19,6 @@ #include "ash/root_window_settings.h" #include "ash/rotator/screen_rotation_animator.h" #include "ash/screen_util.h" -#include "ash/shelf/shelf.h" -#include "ash/shelf/shelf_layout_manager.h" #include "ash/shell.h" #include "ash/wallpaper/wallpaper_controller_impl.h" #include "ash/wm/desks/desk_mini_view.h" @@ -239,24 +237,12 @@ // clamp the bounds to a minimum size and shift the bounds offscreen. gfx::Rect GetGridBoundsInScreen(aura::Window* root_window, bool divider_changed) { - gfx::Rect grid_bounds = + const gfx::Rect work_area = WorkAreaInsets::ForWindow(root_window)->ComputeStableWorkArea(); - - // If the hotseat is extended, exclude its bounds when calculating overview - // bounds otherwise there may be overlap between it and overview items. - Shelf* shelf = Shelf::ForWindow(root_window); - if (shelf->shelf_layout_manager()->hotseat_state() == - HotseatState::kExtended) { - const int hotseat_bottom_inset = - ShelfConfig::Get()->hotseat_size() + - ShelfConfig::Get()->hotseat_bottom_padding(); - grid_bounds.Inset(0, 0, 0, hotseat_bottom_inset); - } - SplitViewController* split_view_controller = SplitViewController::Get(root_window); if (!split_view_controller->InSplitViewMode()) - return grid_bounds; + return work_area; SplitViewController::SnapPosition opposite_position = (split_view_controller->default_snap_position() == @@ -270,7 +256,7 @@ const bool horizontal = SplitViewController::IsLayoutHorizontal(); const int min_length = - (horizontal ? grid_bounds.width() : grid_bounds.height()) / 3; + (horizontal ? work_area.width() : work_area.height()) / 3; const int current_length = horizontal ? bounds.width() : bounds.height(); if (current_length > min_length)
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index 96e75d1..c0beece 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -339,22 +339,25 @@ void OverviewSession::UpdateSplitViewDragIndicatorsWindowDraggingStates( const aura::Window* root_window_being_dragged_in, - bool is_dragging, - SplitViewDragIndicators::WindowDraggingState non_snap_state, - SplitViewController::SnapPosition snap_position) { - using State = SplitViewDragIndicators::WindowDraggingState; - const State window_dragging_state_on_root_window_being_dragged_in = - SplitViewDragIndicators::ComputeWindowDraggingState( - is_dragging, non_snap_state, snap_position); - const State window_dragging_state_on_root_windows_not_being_dragged_in = - window_dragging_state_on_root_window_being_dragged_in == State::kNoDrag - ? State::kNoDrag - : State::kOtherDisplay; + SplitViewDragIndicators::WindowDraggingState + state_on_root_window_being_dragged_in) { + if (state_on_root_window_being_dragged_in == + SplitViewDragIndicators::WindowDraggingState::kNoDrag) { + ResetSplitViewDragIndicatorsWindowDraggingStates(); + return; + } for (std::unique_ptr<OverviewGrid>& grid : grid_list_) { grid->SetSplitViewDragIndicatorsWindowDraggingState( grid->root_window() == root_window_being_dragged_in - ? window_dragging_state_on_root_window_being_dragged_in - : window_dragging_state_on_root_windows_not_being_dragged_in); + ? state_on_root_window_being_dragged_in + : SplitViewDragIndicators::WindowDraggingState::kOtherDisplay); + } +} + +void OverviewSession::ResetSplitViewDragIndicatorsWindowDraggingStates() { + for (std::unique_ptr<OverviewGrid>& grid : grid_list_) { + grid->SetSplitViewDragIndicatorsWindowDraggingState( + SplitViewDragIndicators::WindowDraggingState::kNoDrag); } }
diff --git a/ash/wm/overview/overview_session.h b/ash/wm/overview/overview_session.h index 5d41b828..294f553 100644 --- a/ash/wm/overview/overview_session.h +++ b/ash/wm/overview/overview_session.h
@@ -132,18 +132,17 @@ // Sets the dragged window on the split view drag indicators. void SetSplitViewDragIndicatorsDraggedWindow(aura::Window* dragged_window); - // This function sets the window dragging state on the split view drag - // indicators on every root window. On |root_window_being_dragged_in|, the - // state is determined by forwarding the other three arguments to - // |SplitViewDragIndicators::ComputeWindowDraggingState|. If the state on - // |root_window_being_dragged_in| turns out to be kNoDrag, then the states on - // the other root windows are also set to kNoDrag. Otherwise, the states on - // the other root windows are set to kOtherDisplay. + // If |state_on_root_window_being_dragged_in| is kNoDrag, this function sets + // the state on every root window to kNoDrag. Otherwise it sets the state on + // |root_window_being_dragged_in| to |state_on_root_window_being_dragged_in|, + // and sets the state on other root windows to kOtherDisplay. void UpdateSplitViewDragIndicatorsWindowDraggingStates( const aura::Window* root_window_being_dragged_in, - bool is_dragging, - SplitViewDragIndicators::WindowDraggingState non_snap_state, - SplitViewController::SnapPosition snap_position); + SplitViewDragIndicators::WindowDraggingState + state_on_root_window_being_dragged_in); + + // Sets the state on every root window to kNoDrag. + void ResetSplitViewDragIndicatorsWindowDraggingStates(); // See |OverviewGrid::RearrangeDuringDrag|. void RearrangeDuringDrag(aura::Window* dragged_window);
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 484016e..6a32e425 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -1700,44 +1700,28 @@ overview_session()->CompleteDrag(overview_item, drag_point); } -class HotseatOverviewSessionTest : public OverviewSessionTest { +class HotseatDisabledOverviewSessionTest : public OverviewSessionTest { public: - HotseatOverviewSessionTest() = default; - ~HotseatOverviewSessionTest() override = default; + HotseatDisabledOverviewSessionTest() = default; + ~HotseatDisabledOverviewSessionTest() override = default; // AshTestBase: void SetUp() override { - if (GetParam()) - feature_list_.InitAndEnableFeature(chromeos::features::kShelfHotseat); - else - feature_list_.InitAndDisableFeature(chromeos::features::kShelfHotseat); + feature_list_.InitAndDisableFeature(chromeos::features::kShelfHotseat); OverviewSessionTest::SetUp(); } private: base::test::ScopedFeatureList feature_list_; - DISALLOW_COPY_AND_ASSIGN(HotseatOverviewSessionTest); + DISALLOW_COPY_AND_ASSIGN(HotseatDisabledOverviewSessionTest); }; -INSTANTIATE_TEST_SUITE_P(All, HotseatOverviewSessionTest, testing::Bool()); +INSTANTIATE_TEST_SUITE_P(All, + HotseatDisabledOverviewSessionTest, + testing::Bool()); -// Tests that the bounds of the grid do not intersect the shelf or its hotseat. -TEST_P(HotseatOverviewSessionTest, OverviewGridBounds) { - EnterTabletMode(); - std::unique_ptr<aura::Window> window(CreateTestWindow()); - - ToggleOverview(); - ASSERT_TRUE(overview_session()); - - Shelf* shelf = Shelf::ForWindow(Shell::GetPrimaryRootWindow()); - const gfx::Rect shelf_bounds = shelf->GetIdealBounds(); - const gfx::Rect hotseat_bounds = - shelf->shelf_widget()->hotseat_widget()->GetWindowBoundsInScreen(); - EXPECT_FALSE(GetGridBounds().Intersects(shelf_bounds)); - EXPECT_FALSE(GetGridBounds().Intersects(hotseat_bounds)); -} - -TEST_P(HotseatOverviewSessionTest, NoWindowsIndicatorPositionSplitview) { +TEST_P(HotseatDisabledOverviewSessionTest, + NoWindowsIndicatorPositionSplitview) { UpdateDisplay("400x300"); EnterTabletMode(); std::unique_ptr<aura::Window> window(CreateTestWindow()); @@ -1773,6 +1757,44 @@ no_windows_widget->GetWindowBoundsInScreen().CenterPoint()); } +TEST_P(OverviewSessionTest, NoWindowsIndicatorPositionSplitview) { + // TODO(https://crbug.com/1009550): Make the shelf in-app for split view and + // overview. + if (chromeos::switches::ShouldShowShelfHotseat()) + return; + + UpdateDisplay("400x300"); + EnterTabletMode(); + std::unique_ptr<aura::Window> window(CreateTestWindow()); + + ToggleOverview(); + ASSERT_TRUE(overview_session()); + RoundedLabelWidget* no_windows_widget = + overview_session()->no_windows_widget_for_testing(); + EXPECT_FALSE(no_windows_widget); + + // Tests that when snapping a window to the left in splitview, the no windows + // indicator shows up in the middle of the right side of the screen. + split_view_controller()->SnapWindow(window.get(), SplitViewController::LEFT); + no_windows_widget = overview_session()->no_windows_widget_for_testing(); + ASSERT_TRUE(no_windows_widget); + + // There is a 8dp divider in splitview, the indicator should take that into + // account. + const int bounds_left = 200 + 4; + int expected_x = bounds_left + (400 - (bounds_left)) / 2; + const int expected_y = (300 - ShelfConfig::Get()->shelf_size()) / 2; + EXPECT_EQ(gfx::Point(expected_x, expected_y), + no_windows_widget->GetWindowBoundsInScreen().CenterPoint()); + + // Tests that when snapping a window to the right in splitview, the no windows + // indicator shows up in the middle of the left side of the screen. + split_view_controller()->SnapWindow(window.get(), SplitViewController::RIGHT); + expected_x = /*bounds_right=*/(200 - 4) / 2; + EXPECT_EQ(gfx::Point(expected_x, expected_y), + no_windows_widget->GetWindowBoundsInScreen().CenterPoint()); +} + // Tests that the no windows indicator shows properly after adding an item. TEST_P(OverviewSessionTest, NoWindowsIndicatorAddItem) { EnterTabletMode();
diff --git a/ash/wm/overview/overview_utils.cc b/ash/wm/overview/overview_utils.cc index e8d80d9..426a042 100644 --- a/ash/wm/overview/overview_utils.cc +++ b/ash/wm/overview/overview_utils.cc
@@ -21,6 +21,7 @@ #include "ash/wm/overview/scoped_overview_animation_settings.h" #include "ash/wm/splitview/split_view_controller.h" #include "ash/wm/splitview/split_view_utils.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_state.h" #include "ash/wm/window_transient_descendant_iterator.h" #include "ash/wm/wm_event.h" @@ -262,6 +263,8 @@ aura::Window* window) { if (!ShouldAllowSplitView()) return base::nullopt; + if (!Shell::Get()->tablet_mode_controller()->InTabletMode()) + return base::nullopt; auto* overview_session = Shell::Get()->overview_controller()->overview_session(); DCHECK(overview_session);
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc index 8881795..8bb52de 100644 --- a/ash/wm/overview/overview_window_drag_controller.cc +++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -243,9 +243,11 @@ overview_session_->SetSplitViewDragIndicatorsDraggedWindow( item_->GetWindow()); overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates( - GetRootWindowBeingDraggedIn(), /*is_dragging=*/true, - SplitViewDragIndicators::WindowDraggingState::kFromOverview, - SplitViewController::NONE); + GetRootWindowBeingDraggedIn(), + SplitViewDragIndicators::ComputeWindowDraggingState( + /*is_dragging=*/true, + SplitViewDragIndicators::WindowDraggingState::kFromOverview, + SplitViewController::NONE)); item_->HideCannotSnapWarning(); // Update the split view divider bar status if necessary. If splitview is @@ -340,10 +342,7 @@ if (should_allow_split_view_) { SplitViewController::Get(Shell::GetPrimaryRootWindow()) ->OnWindowDragCanceled(); - overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates( - item_->overview_grid()->root_window(), /*is_dragging=*/false, - SplitViewDragIndicators::WindowDraggingState::kNoDrag, - SplitViewController::NONE); + overview_session_->ResetSplitViewDragIndicatorsWindowDraggingStates(); item_->UpdateCannotSnapWarningVisibility(); } } @@ -542,10 +541,7 @@ // Update window grid bounds and |snap_position_| in case the screen // orientation was changed. UpdateDragIndicatorsAndOverviewGrid(location_in_screen); - overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates( - GetRootWindowBeingDraggedIn(), /*is_dragging=*/true, - SplitViewDragIndicators::WindowDraggingState::kNoDrag, - SplitViewController::NONE); + overview_session_->ResetSplitViewDragIndicatorsWindowDraggingStates(); item_->UpdateCannotSnapWarningVisibility(); } @@ -606,9 +602,11 @@ snap_position_ = GetSnapPosition(location_in_screen); overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates( - GetRootWindowBeingDraggedIn(), /*is_dragging=*/true, - SplitViewDragIndicators::WindowDraggingState::kFromOverview, - snap_position_); + GetRootWindowBeingDraggedIn(), + SplitViewDragIndicators::ComputeWindowDraggingState( + /*is_dragging=*/true, + SplitViewDragIndicators::WindowDraggingState::kFromOverview, + snap_position_)); overview_session_->RearrangeDuringDrag(item_->GetWindow()); }
diff --git a/base/compiler_specific.h b/base/compiler_specific.h index 7e2c5101..5f931c8 100644 --- a/base/compiler_specific.h +++ b/base/compiler_specific.h
@@ -26,8 +26,8 @@ // MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled. // The warning remains disabled until popped by MSVC_POP_WARNING. -#define MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ - __pragma(warning(disable:n)) +#define MSVC_PUSH_DISABLE_WARNING(n) \ + __pragma(warning(push)) __pragma(warning(disable : n)) // Pop effects of innermost MSVC_PUSH_* macro. #define MSVC_POP_WARNING() __pragma(warning(pop)) @@ -141,7 +141,7 @@ // For member functions, the implicit this parameter counts as index 1. #if defined(COMPILER_GCC) || defined(__clang__) #define PRINTF_FORMAT(format_param, dots_param) \ - __attribute__((format(printf, format_param, dots_param))) + __attribute__((format(printf, format_param, dots_param))) #else #define PRINTF_FORMAT(format_param, dots_param) #endif @@ -170,14 +170,14 @@ // Mark a memory region fully initialized. // Use this to annotate code that deliberately reads uninitialized data, for // example a GC scavenging root set pointers from the stack. -#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size) +#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size) // Check a memory region for initializedness, as if it was being used here. // If any bits are uninitialized, crash with an MSan report. // Use this to sanitize data which MSan won't be able to track, e.g. before // passing data to another process via shared memory. #define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \ - __msan_check_mem_is_initialized(p, size) + __msan_check_mem_is_initialized(p, size) #else // MEMORY_SANITIZER #define MSAN_UNPOISON(p, size) #define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) @@ -260,4 +260,39 @@ #endif #endif +#if defined(__clang__) && __has_attribute(uninitialized) +// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for +// the specified variable. +// Library-wide alternative is +// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn +// file. +// +// See "init_stack_vars" in build/config/compiler/BUILD.gn and +// http://crbug.com/977230 +// "init_stack_vars" is enabled for non-official builds and we hope to enable it +// in official build in 2020 as well. The flag writes fixed pattern into +// uninitialized parts of all local variables. In rare cases such initialization +// is undesirable and attribute can be used: +// 1. Degraded performance +// In most cases compiler is able to remove additional stores. E.g. if memory is +// never accessed or properly initialized later. Preserved stores mostly will +// not affect program performance. However if compiler failed on some +// performance critical code we can get a visible regression in a benchmark. +// 2. memset, memcpy calls +// Compiler may replaces some memory writes with memset or memcpy calls. This is +// not -ftrivial-auto-var-init specific, but it can happen more likely with the +// flag. It can be a problem if code is not linked with C run-time library. +// +// Note: The flag is security risk mitigation feature. So in future the +// attribute uses should be avoided when possible. However to enable this +// mitigation on the most of the code we need to be less strict now and minimize +// number of exceptions later. So if in doubt feel free to use attribute, but +// please document the problem for someone who is going to cleanup it later. +// E.g. platform, bot, benchmark or test name in patch description or next to +// the attribute. +#define STACK_UNINITIALIZED __attribute__((uninitialized)) +#else +#define STACK_UNINITIALIZED +#endif + #endif // BASE_COMPILER_SPECIFIC_H_
diff --git a/base/test/test_timeouts.cc b/base/test/test_timeouts.cc index beee123..3cca9e6 100644 --- a/base/test/test_timeouts.cc +++ b/base/test/test_timeouts.cc
@@ -60,6 +60,10 @@ #elif BUILDFLAG(CLANG_COVERAGE) // On coverage build, tests run 3x slower. constexpr int kTimeoutMultiplier = 3; +#elif !defined(NDEBUG) && defined(OS_CHROMEOS) + // A number of tests on ChromeOS run very close to the base limit, so ChromeOS + // gets 2x. + constexpr int kTimeoutMultiplier = 2; #else constexpr int kTimeoutMultiplier = 1; #endif
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index a30a45d..21a8574 100755 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -942,6 +942,7 @@ self._from_wrapper_script = from_wrapper_script self.args = None self.apk_helper = None + self.additional_apk_helpers = None self.install_dict = None self.devices = None self.is_bundle = is_bundle @@ -1038,7 +1039,7 @@ self._RegisterExtraArgs(group) - def _CreateApkHelper(self, args, incremental_apk_path, install_dict): + def _CreateApkHelpers(self, args, incremental_apk_path, install_dict): """Returns true iff self.apk_helper was created and assigned.""" if self.apk_helper is None: if args.apk_path: @@ -1050,6 +1051,11 @@ _GenerateBundleApks(self.bundle_generation_info) self.apk_helper = apk_helper.ToHelper( self.bundle_generation_info.bundle_apks_path) + if args.additional_apk_paths and self.additional_apk_helpers is None: + self.additional_apk_helpers = [ + apk_helper.ToHelper(apk_path) + for apk_path in args.additional_apk_paths + ] return self.apk_helper is not None def ProcessArgs(self, args): @@ -1087,15 +1093,15 @@ 'Select using --incremental or --non-incremental') - # Gate apk_helper creation with _CreateApkHelper since for bundles it takes + # Gate apk_helper creation with _CreateApkHelpers since for bundles it takes # a while to unpack the apks file from the aab file, so avoid this slowdown # for simple commands that don't need apk_helper. if self.needs_apk_helper: - if not self._CreateApkHelper(args, incremental_apk_path, install_dict): + if not self._CreateApkHelpers(args, incremental_apk_path, install_dict): self._parser.error('App is not built.') if self.needs_package_name and not args.package_name: - if self._CreateApkHelper(args, incremental_apk_path, install_dict): + if self._CreateApkHelpers(args, incremental_apk_path, install_dict): args.package_name = self.apk_helper.GetPackageName() elif self._from_wrapper_script: self._parser.error('App is not built.') @@ -1105,7 +1111,7 @@ self.devices = [] if self.need_device_args: abis = None - if self._CreateApkHelper(args, incremental_apk_path, install_dict): + if self._CreateApkHelpers(args, incremental_apk_path, install_dict): abis = self.apk_helper.GetAbis() self.devices = device_utils.DeviceUtils.HealthyDevices( device_arg=args.devices, @@ -1179,6 +1185,9 @@ BASE_MODULE)) def Run(self): + if self.additional_apk_helpers: + for additional_apk_helper in self.additional_apk_helpers: + _InstallApk(self.devices, additional_apk_helper, None) if self.is_bundle: _InstallBundle(self.devices, self.apk_helper, self.args.package_name, self.args.command_line_flags_file, self.args.module, @@ -1656,24 +1665,30 @@ _SaveDeviceCaches(args.command.devices, output_directory) -def Run(output_directory, apk_path, incremental_json, command_line_flags_file, - target_cpu, proguard_mapping_path): +def Run(output_directory, apk_path, additional_apk_paths, incremental_json, + command_line_flags_file, target_cpu, proguard_mapping_path): """Entry point for generated wrapper scripts.""" constants.SetOutputDirectory(output_directory) devil_chromium.Initialize(output_directory=output_directory) parser = argparse.ArgumentParser() exists_or_none = lambda p: p if p and os.path.exists(p) else None + + for path in additional_apk_paths: + if not path or not os.path.exists(path): + raise Exception('Invalid additional APK path "{}"'.format(path)) parser.set_defaults( command_line_flags_file=command_line_flags_file, target_cpu=target_cpu, apk_path=exists_or_none(apk_path), + additional_apk_paths=additional_apk_paths, incremental_json=exists_or_none(incremental_json), proguard_mapping_path=proguard_mapping_path) _RunInternal(parser, output_directory=output_directory) -def RunForBundle(output_directory, bundle_path, bundle_apks_path, aapt2_path, - keystore_path, keystore_password, keystore_alias, package_name, +def RunForBundle(output_directory, bundle_path, bundle_apks_path, + additional_apk_paths, aapt2_path, keystore_path, + keystore_password, keystore_alias, package_name, command_line_flags_file, proguard_mapping_path, target_cpu, system_image_locales): """Entry point for generated app bundle wrapper scripts. @@ -1682,6 +1697,7 @@ output_dir: Chromium output directory path. bundle_path: Input bundle path. bundle_apks_path: Output bundle .apks archive path. + additional_apk_paths: Additional APKs to install prior to bundle install. aapt2_path: Aapt2 tool path. keystore_path: Keystore file path. keystore_password: Keystore password. @@ -1706,8 +1722,12 @@ keystore_alias=keystore_alias, system_image_locales=system_image_locales) + for path in additional_apk_paths: + if not path or not os.path.exists(path): + raise Exception('Invalid additional APK path "{}"'.format(path)) parser = argparse.ArgumentParser() parser.set_defaults( + additional_apk_paths=additional_apk_paths, package_name=package_name, command_line_flags_file=command_line_flags_file, proguard_mapping_path=proguard_mapping_path,
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py index b75dbee8..c36c90c 100755 --- a/build/android/gyp/compile_java.py +++ b/build/android/gyp/compile_java.py
@@ -536,9 +536,7 @@ def main(argv): - logging.basicConfig( - level=logging.INFO if os.environ.get('JAVAC_DEBUG') else logging.WARNING, - format='%(levelname).1s %(relativeCreated)6d %(message)s') + build_utils.InitLogging('JAVAC_DEBUG') colorama.init() argv = build_utils.ExpandFileArgs(argv) @@ -626,7 +624,6 @@ input_paths=input_paths, input_strings=input_strings, output_paths=output_paths) - logging.info('Script complete: %s', __file__) if __name__ == '__main__':
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 45e911b..2d4b96d 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -16,6 +16,7 @@ import collections import contextlib import filecmp +import logging import multiprocessing.pool import os import re @@ -33,11 +34,6 @@ from util import resource_utils -# Name of environment variable that can be used to force this script to -# put temporary resource files into specific sub-directories, instead of -# temporary ones. -_ENV_DEBUG_VARIABLE = 'ANDROID_DEBUG_TEMP_RESOURCES_DIR' - # Import jinja2 from third_party/jinja2 sys.path.insert(1, os.path.join(build_utils.DIR_SOURCE_ROOT, 'third_party')) from jinja2 import Template # pylint: disable=F0401 @@ -661,8 +657,10 @@ Returns: The manifest package name for the APK. """ + logging.debug('Extracting resource .zips') dep_subdirs = resource_utils.ExtractDeps(options.dependencies_res_zips, build.deps_dir) + logging.debug('Applying locale transformations') path_info = resource_utils.ResourceInfoFile() _DuplicateZhResources(dep_subdirs, path_info) _RenameLocaleResourceDirs(dep_subdirs, path_info) @@ -672,6 +670,7 @@ # Create a function that selects which resource files should be packaged # into the final output. Any file that does not pass the predicate will # be removed below. + logging.debug('Applying file-based blacklist') keep_predicate = _CreateKeepPredicate(options.resource_blacklist_regex, options.resource_blacklist_exceptions) png_paths = [] @@ -682,7 +681,9 @@ elif f.endswith('.png'): png_paths.append((f, directory)) if png_paths and options.png_to_webp: + logging.debug('Converting png->webp') _ConvertToWebP(options.webp_binary, png_paths, path_info) + logging.debug('Applying drawable transformations') for directory in dep_subdirs: _MoveImagesToNonMdpiFolders(directory, path_info) _RemoveImageExtensions(directory, path_info) @@ -764,13 +765,16 @@ _, arsc_path = tempfile.mkstmp() link_command += ['-o', build.arsc_path] + logging.debug('Starting: aapt2 link') link_proc = subprocess.Popen(link_command) # Create .res.info file in parallel. _CreateResourceInfoFile(path_info, build.info_path, options.dependencies_res_zips) + logging.debug('Created .res.info file') exit_code = link_proc.wait() + logging.debug('Finished: aapt2 link') if exit_code: raise subprocess.CalledProcessError(exit_code, link_command) @@ -787,6 +791,7 @@ '''.format(package=desired_manifest_package_name) proguard_file.write(textwrap.dedent(keep_rule)) + logging.debug('Running aapt2 convert') build_utils.CheckOutput([ options.aapt2_path, 'convert', '--output-format', 'proto', '-o', build.proto_path, build.arsc_path @@ -851,6 +856,7 @@ '--resource-path-shortening-map', options.resources_path_map_out_path ] + logging.debug('Running aapt2 optimize') build_utils.CheckOutput( optimize_command, print_stdout=False, print_stderr=False) @@ -915,11 +921,12 @@ def main(args): + build_utils.InitLogging('RESOURCE_DEBUG') args = build_utils.ExpandFileArgs(args) options = _ParseArgs(args) path = options.arsc_path or options.proto_path - debug_temp_resources_dir = os.environ.get(_ENV_DEBUG_VARIABLE) + debug_temp_resources_dir = os.environ.get('TEMP_RESOURCES_DIR') if debug_temp_resources_dir: path = os.path.join(debug_temp_resources_dir, os.path.basename(path)) else: @@ -968,15 +975,16 @@ else: package_for_library = None + logging.debug('Creating R.srcjar') resource_utils.CreateRJavaFiles( build.srcjar_dir, package_for_library, build.r_txt_path, options.extra_res_packages, options.extra_r_text_files, rjava_build_options, options.srcjar_out, custom_root_package_name, grandparent_custom_package_name, options.extra_main_r_text_files) - build_utils.ZipDir(build.srcjar_path, build.srcjar_dir) # Sanity check that the created resources have the expected package ID. + logging.debug('Performing sanity check') if options.package_id: expected_id = options.package_id elif options.shared_resources: @@ -990,6 +998,7 @@ raise Exception( 'Invalid package ID 0x%x (expected 0x%x)' % (package_id, expected_id)) + logging.debug('Copying outputs') _WriteOutputs(options, build) if options.depfile:
diff --git a/build/android/gyp/create_apk_operations_script.py b/build/android/gyp/create_apk_operations_script.py index cd2722f9..a39752b 100755 --- a/build/android/gyp/create_apk_operations_script.py +++ b/build/android/gyp/create_apk_operations_script.py
@@ -9,6 +9,7 @@ import string import sys +from util import build_utils SCRIPT_TEMPLATE = string.Template("""\ #!/usr/bin/env python @@ -29,6 +30,7 @@ apk_operations.Run( output_dir, resolve(${APK_PATH}), + [resolve(p) for p in ${ADDITIONAL_APK_PATHS}], resolve(${INC_JSON_PATH}), ${FLAGS_FILE}, ${TARGET_CPU}, @@ -47,6 +49,7 @@ def main(args): + args = build_utils.ExpandFileArgs(args) parser = argparse.ArgumentParser() parser.add_argument('--script-output-path', help='Output path for executable script.') @@ -54,6 +57,12 @@ parser.add_argument('--incremental-install-json-path') parser.add_argument('--command-line-flags-file') parser.add_argument('--target-cpu') + parser.add_argument( + '--additional-apk-path', + action='append', + dest='additional_apk_paths', + default=[], + help='Paths to APKs to be installed prior to --apk-path.') parser.add_argument('--proguard-mapping-path') args = parser.parse_args(args) @@ -70,6 +79,8 @@ 'APK_OPERATIONS_DIR': repr(apk_operations_dir), 'OUTPUT_DIR': repr(relativize('.')), 'APK_PATH': repr(relativize(args.apk_path)), + 'ADDITIONAL_APK_PATHS': + [relativize(p) for p in args.additional_apk_paths], 'INC_JSON_PATH': repr(relativize(args.incremental_install_json_path)), 'MAPPING_PATH': repr(relativize(args.proguard_mapping_path)), 'FLAGS_FILE': repr(args.command_line_flags_file),
diff --git a/build/android/gyp/create_apk_operations_script.pydeps b/build/android/gyp/create_apk_operations_script.pydeps index 9d4dcb8..e09bb72 100644 --- a/build/android/gyp/create_apk_operations_script.pydeps +++ b/build/android/gyp/create_apk_operations_script.pydeps
@@ -1,3 +1,6 @@ # Generated by running: # build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_apk_operations_script.pydeps build/android/gyp/create_apk_operations_script.py +../../gn_helpers.py create_apk_operations_script.py +util/__init__.py +util/build_utils.py
diff --git a/build/android/gyp/create_bundle_wrapper_script.py b/build/android/gyp/create_bundle_wrapper_script.py index a1a34fe..89051ff 100755 --- a/build/android/gyp/create_bundle_wrapper_script.py +++ b/build/android/gyp/create_bundle_wrapper_script.py
@@ -32,9 +32,11 @@ sys.path.append(resolve(${WRAPPED_SCRIPT_DIR})) import apk_operations + additional_apk_paths = [resolve(p) for p in ${ADDITIONAL_APK_PATHS}] apk_operations.RunForBundle(output_directory=resolve(${OUTPUT_DIR}), bundle_path=resolve(${BUNDLE_PATH}), bundle_apks_path=resolve(${BUNDLE_APKS_PATH}), + additional_apk_paths=additional_apk_paths, aapt2_path=resolve(${AAPT2_PATH}), keystore_path=resolve(${KEYSTORE_PATH}), keystore_password=${KEYSTORE_PASSWORD}, @@ -57,6 +59,12 @@ help='Output path for executable script.') parser.add_argument('--bundle-path', required=True) parser.add_argument('--bundle-apks-path', required=True) + parser.add_argument( + '--additional-apk-path', + action='append', + dest='additional_apk_paths', + default=[], + help='Paths to APKs to be installed prior to --apk-path.') parser.add_argument('--package-name', required=True) parser.add_argument('--aapt2-path', required=True) parser.add_argument('--keystore-path', required=True) @@ -76,7 +84,6 @@ wrapped_script_dir = os.path.join(os.path.dirname(__file__), os.path.pardir) wrapped_script_dir = relativize(wrapped_script_dir) - with open(args.script_output_path, 'w') as script: script_dict = { 'WRAPPED_SCRIPT_DIR': @@ -87,6 +94,8 @@ repr(relativize(args.bundle_path)), 'BUNDLE_APKS_PATH': repr(relativize(args.bundle_apks_path)), + 'ADDITIONAL_APK_PATHS': + [relativize(p) for p in args.additional_apk_paths], 'PACKAGE_NAME': repr(args.package_name), 'AAPT2_PATH':
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py index 209907a..52fafae 100755 --- a/build/android/gyp/dex.py +++ b/build/android/gyp/dex.py
@@ -375,7 +375,6 @@ _CreateFinalDex( final_dex_inputs, options.output, tmp_dir, dex_cmd, options=options) - logging.debug('Dex finished for: %s', options.output) def MergeDexForIncrementalInstall(r8_jar_path, src_paths, dest_dex_jar): @@ -390,9 +389,7 @@ def main(args): - logging.basicConfig( - level=logging.INFO if os.environ.get('DEX_DEBUG') else logging.WARNING, - format='%(levelname).1s %(relativeCreated)6d %(message)s') + build_utils.InitLogging('DEX_DEBUG') options = _ParseArgs(args) options.class_inputs += options.class_inputs_filearg
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py index d846de1..feb22fc 100644 --- a/build/android/gyp/util/build_utils.py +++ b/build/android/gyp/util/build_utils.py
@@ -4,11 +4,13 @@ """Contains common helpers for GN action()s.""" +import atexit import collections import contextlib import filecmp import fnmatch import json +import logging import os import pipes import re @@ -580,6 +582,23 @@ break +def InitLogging(enabling_env): + logging.basicConfig( + level=logging.DEBUG if os.environ.get(enabling_env) else logging.WARNING, + format='%(levelname).1s %(process)d %(relativeCreated)6d %(message)s') + script_name = os.path.basename(sys.argv[0]) + logging.info('Started (%s)', script_name) + + my_pid = os.getpid() + + def log_exit(): + # Do not log for fork'ed processes. + if os.getpid() == my_pid: + logging.info("Job's done (%s)", script_name) + + atexit.register(log_exit) + + def AddDepfileOption(parser): # TODO(agrieve): Get rid of this once we've moved to argparse. if hasattr(parser, 'add_option'):
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml index b0a71f6..18731b7 100644 --- a/build/android/lint/suppressions.xml +++ b/build/android/lint/suppressions.xml
@@ -390,8 +390,9 @@ <ignore regexp="android_webview/test/shell/res/raw/resource_file.html"/> <ignore regexp="android_webview/test/shell/res/raw/resource_icon.png"/> <ignore regexp="android_webview/tools/automated_ui_tests/java/res/layout/"/> - <!-- TODO(https://crbug.com/1017190): Remove suppression once we lint entire app rather than + <!-- TODO(https://crbug.com/1017190): Remove suppressions once we lint entire app rather than each individual target --> + <ignore regexp="components/browser_ui/strings/android/browser_ui_strings_grd"/> <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd"/> <!-- 1 resource used by android tv to generate resources.zip file --> <ignore regexp="chromecast/internal/shell/browser/android/java/res/drawable-hdpi/ic_settings_cast.png"/>
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 60099c0..b328b51f 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -3356,6 +3356,22 @@ # Generate apk operation related script. if (!_is_bundle_module && (!defined(invoker.create_apk_script) || invoker.create_apk_script)) { + if (_uses_static_library) { + _install_artifacts_target = "${target_name}__install_artifacts" + _install_artifacts_json = + "${target_gen_dir}/${target_name}.install_artifacts" + generated_file(_install_artifacts_target) { + output_conversion = "json" + deps = [ + invoker.static_library_provider, + ] + outputs = [ + _install_artifacts_json, + ] + data_keys = [ "install_artifacts" ] + rebase = root_build_dir + } + } _apk_operations_target_name = "${target_name}__apk_operations" action_with_pydeps(_apk_operations_target_name) { _generated_script = "$root_build_dir/bin/${invoker.target_name}" @@ -3394,6 +3410,19 @@ rebase_path(_final_apk_path, root_build_dir), ] } + if (_uses_static_library) { + deps = [ + ":$_install_artifacts_target", + ] + _rebased_install_artifacts_json = + rebase_path(_install_artifacts_json, root_build_dir) + _static_library_apk_path = + "@FileArg($_rebased_install_artifacts_json[])" + args += [ + "--additional-apk", + _static_library_apk_path, + ] + } if (_proguard_enabled) { args += [ "--proguard-mapping-path", @@ -4884,6 +4913,23 @@ } } + if (_uses_static_library) { + _install_artifacts_target = "${target_name}__install_artifacts" + _install_artifacts_json = + "${target_gen_dir}/${target_name}.install_artifacts" + generated_file(_install_artifacts_target) { + output_conversion = "json" + deps = [ + invoker.static_library_provider, + ] + outputs = [ + _install_artifacts_json, + ] + data_keys = [ "install_artifacts" ] + rebase = root_build_dir + } + } + # Generate a wrapper script for the bundle. _android_aapt2_path = android_sdk_tools_bundle_aapt2 @@ -4944,6 +4990,17 @@ invoker.command_line_flags_file, ] } + if (_uses_static_library) { + deps += [ ":$_install_artifacts_target" ] + _rebased_install_artifacts_json = + rebase_path(_install_artifacts_json, root_build_dir) + _static_library_apk_path = + "@FileArg($_rebased_install_artifacts_json[])" + args += [ + "--additional-apk", + _static_library_apk_path, + ] + } if (_proguard_enabled) { args += [
diff --git a/components/paint_preview/buildflags/buildflags.gni b/build/config/buildflags_paint_preview.gni similarity index 67% rename from components/paint_preview/buildflags/buildflags.gni rename to build/config/buildflags_paint_preview.gni index 1ce611b..d5b833e 100644 --- a/components/paint_preview/buildflags/buildflags.gni +++ b/build/config/buildflags_paint_preview.gni
@@ -9,6 +9,10 @@ # Enable basic paint preview support. Does not work on iOS or Fuchsia. Should # not be included with Chromecast. Not ready for shipping builds yet so # include in unofficial builds. + # Used by //components/paint_preview and //third_party/harfbuzz-ng. + # TODO(bug/webrtc:11223) Move back this file in //components/paint_preview/ + # once WebRTC doesn't roll harfbuzz-ng anymore, for consistency sake. + # (Just revert the CL) enable_paint_preview = !is_chromecast && !is_ios && !is_fuchsia && !is_official_build }
diff --git a/build/config/c++/BUILD.gn b/build/config/c++/BUILD.gn index 27909959..efcf92e 100644 --- a/build/config/c++/BUILD.gn +++ b/build/config/c++/BUILD.gn
@@ -67,7 +67,7 @@ # libc++ has two levels of debug mode. Setting _LIBCPP_DEBUG to zero # enables most assertions. Setting it to one additionally enables iterator # debugging. See https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html - if (enable_iterator_debugging && is_debug) { + if (enable_iterator_debugging) { defines += [ "_LIBCPP_DEBUG=1" ] } else if (is_debug || dcheck_always_on) { defines += [ "_LIBCPP_DEBUG=0" ]
diff --git a/build/config/c++/c++.gni b/build/config/c++/c++.gni index d2416d1..5ced459 100644 --- a/build/config/c++/c++.gni +++ b/build/config/c++/c++.gni
@@ -29,10 +29,7 @@ # http://crbug.com/966687. libcxx_natvis_include = true - # When set, enables C++ iterator debugging in debug builds. Iterator - # debugging is always off in release builds (technically, this flag affects - # the "debug" config, which is always available but applied by default only - # in debug builds). + # When set, enables libc++ debug mode with iterator debugging. # # Iterator debugging is generally useful for catching bugs. But it can # introduce extra locking to check the state of an iterator against the state
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn index f58b79c..65feeba5 100644 --- a/build/config/sanitizers/BUILD.gn +++ b/build/config/sanitizers/BUILD.gn
@@ -493,7 +493,6 @@ "-fsanitize=integer-divide-by-zero", "-fsanitize=null", "-fsanitize=object-size", - "-fsanitize=pointer-overflow", "-fsanitize=return", "-fsanitize=returns-nonnull-attribute", "-fsanitize=shift-exponent", @@ -536,7 +535,6 @@ } cflags = [ "-fsanitize=function", - "-fsanitize=pointer-overflow", "-fsanitize=shift", "-fsanitize=signed-integer-overflow", "-fsanitize=vla-bound",
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 917bfc8..7956491 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8893545019345431616 \ No newline at end of file +8893522874278687104 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 123f48d..e04844b 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8893571277147712224 \ No newline at end of file +8893522874409666240 \ No newline at end of file
diff --git a/build/toolchain/clang_code_coverage_wrapper.py b/build/toolchain/clang_code_coverage_wrapper.py index 9e2c1a8..238462f 100755 --- a/build/toolchain/clang_code_coverage_wrapper.py +++ b/build/toolchain/clang_code_coverage_wrapper.py
@@ -16,11 +16,18 @@ instrument, indexed by target operating system. Files in these lists have their flags removed in both modes. The OS can be selected with --target-os. +This script also contains hard-coded force lists of files to always instrument, +indexed by target operating system. Files in these lists never have their flags +removed in either mode. The OS can be selected with --target-os. + +The order of precedence is: force list, exclusion list, --files-to-instrument. + The path to the coverage instrumentation input file should be relative to the root build directory, and the file consists of multiple lines where each line represents a path to a source file, and the specified paths must be relative to the root build directory. e.g. ../../base/task/post_task.cc for build -directory 'out/Release'. +directory 'out/Release'. The paths should be written using OS-native path +separators for the current platform. One caveat with this compiler wrapper is that it may introduce unexpected behaviors in incremental builds when the file path to the coverage @@ -50,12 +57,14 @@ # Flags should be listed in the same order that they are added in # build/config/coverage/BUILD.gn _COVERAGE_FLAGS = [ - '-fprofile-instr-generate', '-fcoverage-mapping', + '-fprofile-instr-generate', + '-fcoverage-mapping', # Following experimental flags remove unused header functions from the # coverage mapping data embedded in the test binaries, and the reduction # of binary size enables building Chrome's large unit test targets on # MacOS. Please refer to crbug.com/796290 for more details. - '-mllvm', '-limited-coverage-experimental=true' + '-mllvm', + '-limited-coverage-experimental=true', ] # Files that should not be built with coverage flags by default. @@ -89,6 +98,16 @@ 'win': [], } +# Map of force lists indexed by target OS. +_COVERAGE_FORCE_LIST_MAP = { + # clang_coverage.cc refers to the symbol `__llvm_profile_dump` from the + # profiling runtime. In a partial coverage build, it is possible for a + # binary to include clang_coverage.cc but have no instrumented files, thus + # causing an unresolved symbol error because the profiling runtime will not + # be linked in. Therefore we force coverage for this file to ensure that + # any target that includes it will also get the profiling runtime. + 'win': [r'..\..\base\test\clang_coverage.cc'], +} def _remove_flags_from_command(command): @@ -104,12 +123,13 @@ while True: idx = command.index(start_flag, start_idx) start_idx = idx + 1 - if command[idx:idx+num_flags] == _COVERAGE_FLAGS: - del command[idx:idx+num_flags] + if command[idx:idx + num_flags] == _COVERAGE_FLAGS: + del command[idx:idx + num_flags] break except ValueError: pass + def main(): # TODO(crbug.com/898695): Make this wrapper work on Windows platform. arg_parser = argparse.ArgumentParser() @@ -119,9 +139,7 @@ type=str, help='Path to a file that contains a list of file names to instrument.') arg_parser.add_argument( - '--target-os', - required=False, - help='The OS to compile for.') + '--target-os', required=False, help='The OS to compile for.') arg_parser.add_argument('args', nargs=argparse.REMAINDER) parsed_args = arg_parser.parse_args() @@ -159,15 +177,22 @@ compile_source_file = os.path.normpath(compile_command[source_flag_index + 1]) exclusion_list = _COVERAGE_EXCLUSION_LIST_MAP.get( target_os, _DEFAULT_COVERAGE_EXCLUSION_LIST) + force_list = _COVERAGE_FORCE_LIST_MAP.get(target_os, []) - if compile_source_file in exclusion_list: + should_remove_flags = False + if compile_source_file not in force_list: + if compile_source_file in exclusion_list: + should_remove_flags = True + elif parsed_args.files_to_instrument: + with open(parsed_args.files_to_instrument) as f: + if compile_source_file not in f.read(): + should_remove_flags = True + + if should_remove_flags: _remove_flags_from_command(compile_command) - elif parsed_args.files_to_instrument: - with open(parsed_args.files_to_instrument) as f: - if compile_source_file not in f.read(): - _remove_flags_from_command(compile_command) return subprocess.call(compile_command) + if __name__ == '__main__': sys.exit(main())
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 335cbec..09d00dd 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -158,6 +158,8 @@ "metrics/compositor_timing_history.h", "metrics/frame_sequence_tracker.cc", "metrics/frame_sequence_tracker.h", + "metrics/latency_ukm_reporter.cc", + "metrics/latency_ukm_reporter.h", "metrics/throughput_ukm_reporter.cc", "metrics/throughput_ukm_reporter.h", "raster/bitmap_raster_buffer_provider.cc",
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index d90c2cd..c04bda3 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -11,6 +11,7 @@ #include "base/trace_event/trace_event.h" #include "cc/base/rolling_time_delta_history.h" #include "cc/metrics/frame_sequence_tracker.h" +#include "cc/metrics/latency_ukm_reporter.h" namespace cc { namespace { @@ -144,14 +145,17 @@ CompositorFrameReporter::CompositorFrameReporter( const base::flat_set<FrameSequenceTrackerType>* active_trackers, + LatencyUkmReporter* latency_ukm_reporter, bool is_single_threaded) : is_single_threaded_(is_single_threaded), - active_trackers_(active_trackers) { + active_trackers_(active_trackers), + latency_ukm_reporter_(latency_ukm_reporter) { TRACE_EVENT_ASYNC_BEGIN1("cc,benchmark", "PipelineReporter", this, "is_single_threaded", is_single_threaded); } CompositorFrameReporter::~CompositorFrameReporter() { + latency_ukm_reporter_ = nullptr; TerminateReporter(); } @@ -282,6 +286,10 @@ frame_sequence_tracker_type); } } + if (latency_ukm_reporter_) { + latency_ukm_reporter_->ReportLatencyUkm(missed_frame, stage_history_, + active_trackers_, viz_breakdown_); + } } void CompositorFrameReporter::ReportStageHistogramWithBreakdown(
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h index a5eebc6..85c9d43 100644 --- a/cc/metrics/compositor_frame_reporter.h +++ b/cc/metrics/compositor_frame_reporter.h
@@ -20,6 +20,7 @@ } namespace cc { +class LatencyUkmReporter; class RollingTimeDeltaHistory; // This is used for tracing and reporting the duration of pipeline stages within @@ -103,8 +104,21 @@ kBreakdownCount }; + struct StageData { + StageType stage_type; + base::TimeTicks start_time; + base::TimeTicks end_time; + StageData(); + StageData(StageType stage_type, + base::TimeTicks start_time, + base::TimeTicks end_time); + StageData(const StageData&); + ~StageData(); + }; + CompositorFrameReporter( const base::flat_set<FrameSequenceTrackerType>* active_trackers, + LatencyUkmReporter* latency_ukm_reporter, bool is_single_threaded = false); ~CompositorFrameReporter(); @@ -134,18 +148,6 @@ } private: - struct StageData { - StageType stage_type; - base::TimeTicks start_time; - base::TimeTicks end_time; - StageData(); - StageData(StageType stage_type, - base::TimeTicks start_time, - base::TimeTicks end_time); - StageData(const StageData&); - ~StageData(); - }; - void TerminateReporter(); void EndCurrentStage(base::TimeTicks end_time); void ReportStageHistograms(bool missed_frame) const; @@ -187,6 +189,8 @@ const base::flat_set<FrameSequenceTrackerType>* active_trackers_; + LatencyUkmReporter* latency_ukm_reporter_; + // Indicates if work on Impl frame is finished. bool did_finish_impl_frame_ = false; // Indicates if main frame is aborted after begin.
diff --git a/cc/metrics/compositor_frame_reporter_unittest.cc b/cc/metrics/compositor_frame_reporter_unittest.cc index 391dcd69..18a67030 100644 --- a/cc/metrics/compositor_frame_reporter_unittest.cc +++ b/cc/metrics/compositor_frame_reporter_unittest.cc
@@ -18,7 +18,8 @@ const base::flat_set<FrameSequenceTrackerType> active_trackers = {}; CompositorFrameReporterTest() : pipeline_reporter_( - std::make_unique<CompositorFrameReporter>(&active_trackers)) { + std::make_unique<CompositorFrameReporter>(&active_trackers, + nullptr)) { AdvanceNowByMs(1); }
diff --git a/cc/metrics/compositor_frame_reporting_controller.cc b/cc/metrics/compositor_frame_reporting_controller.cc index 13a575f..41d13a0b 100644 --- a/cc/metrics/compositor_frame_reporting_controller.cc +++ b/cc/metrics/compositor_frame_reporting_controller.cc
@@ -5,6 +5,7 @@ #include "cc/metrics/compositor_frame_reporting_controller.h" #include "cc/metrics/compositor_frame_reporter.h" +#include "cc/metrics/latency_ukm_reporter.h" #include "components/viz/common/frame_timing_details.h" #include "components/viz/common/quads/compositor_frame_metadata.h" @@ -15,7 +16,8 @@ CompositorFrameReportingController::CompositorFrameReportingController( bool is_single_threaded) - : is_single_threaded_(is_single_threaded) {} + : is_single_threaded_(is_single_threaded), + latency_ukm_reporter_(std::make_unique<LatencyUkmReporter>()) {} CompositorFrameReportingController::~CompositorFrameReportingController() { base::TimeTicks now = Now(); @@ -59,8 +61,8 @@ begin_time); } std::unique_ptr<CompositorFrameReporter> reporter = - std::make_unique<CompositorFrameReporter>(&active_trackers_, - is_single_threaded_); + std::make_unique<CompositorFrameReporter>( + &active_trackers_, latency_ukm_reporter_.get(), is_single_threaded_); reporter->StartStage(StageType::kBeginImplFrameToSendBeginMainFrame, begin_time); reporters_[PipelineStage::kBeginImplFrame] = std::move(reporter); @@ -82,6 +84,7 @@ // deadline yet). So will start a new reporter at BeginMainFrame. std::unique_ptr<CompositorFrameReporter> reporter = std::make_unique<CompositorFrameReporter>(&active_trackers_, + latency_ukm_reporter_.get(), is_single_threaded_); reporter->StartStage(StageType::kSendBeginMainFrameToCommit, Now()); reporters_[PipelineStage::kBeginMainFrame] = std::move(reporter); @@ -236,4 +239,9 @@ } reporters_[target] = std::move(reporters_[start]); } + +void CompositorFrameReportingController::SetUkmManager(UkmManager* manager) { + latency_ukm_reporter_->SetUkmManager(manager); +} + } // namespace cc
diff --git a/cc/metrics/compositor_frame_reporting_controller.h b/cc/metrics/compositor_frame_reporting_controller.h index eda4886..8848f43 100644 --- a/cc/metrics/compositor_frame_reporting_controller.h +++ b/cc/metrics/compositor_frame_reporting_controller.h
@@ -65,6 +65,8 @@ void SetBlinkBreakdown(std::unique_ptr<BeginMainFrameMetrics> details); + void SetUkmManager(UkmManager* manager); + virtual void AddActiveTracker(FrameSequenceTrackerType type); virtual void RemoveActiveTracker(FrameSequenceTrackerType type); @@ -96,6 +98,10 @@ // frames. base::circular_deque<SubmittedCompositorFrame> submitted_compositor_frames_; + // The latency reporter passed to each CompositorFrameReporter. Owned here + // because it must be common among all reporters. + std::unique_ptr<LatencyUkmReporter> latency_ukm_reporter_; + // These keep track of stage durations for when a frame did not miss a // deadline. The history is used by reporter instances to determine if a // missed frame had a stage duration that was abnormally large.
diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h index 7ad95a0..87c7cb7 100644 --- a/cc/metrics/frame_sequence_tracker.h +++ b/cc/metrics/frame_sequence_tracker.h
@@ -37,6 +37,8 @@ class UkmManager; enum FrameSequenceTrackerType { + // Used as an enum for metrics. DO NOT reorder or delete values. Rather, + // add them at the end and increment kMaxType. kCompositorAnimation = 0, kMainThreadAnimation = 1, kPinchZoom = 2,
diff --git a/cc/metrics/latency_ukm_reporter.cc b/cc/metrics/latency_ukm_reporter.cc new file mode 100644 index 0000000..add9a60 --- /dev/null +++ b/cc/metrics/latency_ukm_reporter.cc
@@ -0,0 +1,60 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/metrics/latency_ukm_reporter.h" + +#include "base/rand_util.h" +#include "cc/trees/ukm_manager.h" + +namespace cc { + +void LatencyUkmReporter::ReportLatencyUkm( + bool missed_frame, + const std::vector<CompositorFrameReporter::StageData>& stage_history, + const base::flat_set<FrameSequenceTrackerType>* active_trackers, + const viz::FrameTimingDetails& viz_breakdown) { + if (!ukm_manager_) + return; + if (!frames_to_next_event_) { + ukm_manager_->RecordLatencyUKM(missed_frame, stage_history, active_trackers, + viz_breakdown); + frames_to_next_event_ += SampleFramesToNextEvent(); + } + DCHECK_GT(frames_to_next_event_, 0u); + --frames_to_next_event_; +} + +unsigned LatencyUkmReporter::SampleFramesToNextEvent() { + // Return the test interval if set + if (frames_to_next_event_for_test_) + return frames_to_next_event_for_test_; + + // Sample from an exponential distribution to give a poisson distribution + // of samples per time unit, then weigh it with an exponential multiplier to + // give a few samples in rapid succession (for frames early in the page's + // life) then exponentially fewer as the page lives longer. + // RandDouble() returns [0,1), but we need (0,1]. If RandDouble() is + // uniformly random, so is 1-RandDouble(), so use it to adjust the range. + // When RandDouble returns 0.0, as it could, we will get a float_sample of + // 0, causing underflow in UpdateEventTimeAndRecordIfNeeded. So rejection + // sample until we get a positive count. + double float_sample = 0; + do { + float_sample = -(sample_rate_multiplier_ * + std::exp(samples_so_far_ / sample_decay_rate_) * + std::log(1.0 - base::RandDouble())); + } while (float_sample == 0); + // float_sample is positive, so we don't need to worry about underflow. + // After around 100 samples we will end up with a super high + // sample. That's OK because it just means we'll stop reporting metrics + // for that session, but we do need to be careful about overflow and NaN. + samples_so_far_++; + unsigned unsigned_sample = + std::isnan(float_sample) + ? UINT_MAX + : base::saturated_cast<unsigned>(std::ceil(float_sample)); + return unsigned_sample; +} + +} // namespace cc
diff --git a/cc/metrics/latency_ukm_reporter.h b/cc/metrics/latency_ukm_reporter.h new file mode 100644 index 0000000..3599cd9 --- /dev/null +++ b/cc/metrics/latency_ukm_reporter.h
@@ -0,0 +1,67 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_METRICS_LATENCY_UKM_REPORTER_H_ +#define CC_METRICS_LATENCY_UKM_REPORTER_H_ + +#include "base/optional.h" +#include "cc/cc_export.h" +#include "cc/metrics/compositor_frame_reporter.h" +#include "components/viz/common/frame_timing_details.h" + +namespace cc { +class UkmManager; + +// A helper class that takes latency data from a CompositorFrameReporter and +// talks to UkmManager to report it. +class CC_EXPORT LatencyUkmReporter { + public: + LatencyUkmReporter() = default; + ~LatencyUkmReporter() = default; + + void ReportLatencyUkm( + bool missed_frame, + const std::vector<CompositorFrameReporter::StageData>& stage_history, + const base::flat_set<FrameSequenceTrackerType>* active_trackers, + const viz::FrameTimingDetails& viz_breakdown); + + void SetUkmManager(UkmManager* manager) { ukm_manager_ = manager; } + + private: + unsigned SampleFramesToNextEvent(); + + // To test event sampling. This and all future intervals will be the given + // frame count, until this is called again. + void FramesToNextEventForTest(unsigned num_frames) { + frames_to_next_event_for_test_ = num_frames; + } + + // This is pointing to the LayerTreeHostImpl::ukm_manager_, which is + // initialized right after the LayerTreeHostImpl is created. So when this + // pointer is initialized, there should be no trackers yet. Moreover, the + // LayerTreeHostImpl::ukm_manager_ lives as long as the LayerTreeHostImpl, so + // this pointer should never be null as long as LayerTreeHostImpl is alive. + UkmManager* ukm_manager_ = nullptr; + + // Sampling control. We use a Poisson process with an exponential decay + // multiplier. The goal is to get many randomly distributed samples early + // during page load and initial interaction, then samples at an exponentially + // decreasing rate to effectively cap the number of samples. The particular + // parameters chosen here give roughly 10-15 samples in the first 100 frames, + // decaying to several hours between samples by the 40th sample. The + // multiplier value should be tuned to achieve a total sample count that + // avoids throttling by the UKM system. + // The sample_rate_multiplier_ has been set to meet UKM goals for data volume. + double sample_decay_rate_ = 3; + double sample_rate_multiplier_ = 4; + unsigned samples_so_far_ = 0; + unsigned frames_to_next_event_ = 0; + + // Test data, used for SampleFramesToNextEvent if present + unsigned frames_to_next_event_for_test_ = 0; +}; + +} // namespace cc + +#endif // CC_METRICS_LATENCY_UKM_REPORTER_H_
diff --git a/cc/paint/paint_recorder.cc b/cc/paint/paint_recorder.cc index f584bff..08f0bd9 100644 --- a/cc/paint/paint_recorder.cc +++ b/cc/paint/paint_recorder.cc
@@ -17,7 +17,7 @@ PaintCanvas* PaintRecorder::beginRecording(const SkRect& bounds) { display_item_list_->StartPaint(); - canvas_.emplace(display_item_list_.get(), bounds); + canvas_ = CreateCanvas(display_item_list_.get(), bounds); return getRecordingCanvas(); } @@ -41,4 +41,10 @@ return display_item_list_->ReleaseAsRecord(); } +std::unique_ptr<RecordPaintCanvas> PaintRecorder::CreateCanvas( + DisplayItemList* list, + const SkRect& bounds) { + return std::make_unique<RecordPaintCanvas>(list, bounds); +} + } // namespace cc
diff --git a/cc/paint/paint_recorder.h b/cc/paint/paint_recorder.h index 4dce74a7..b57fcb23 100644 --- a/cc/paint/paint_recorder.h +++ b/cc/paint/paint_recorder.h
@@ -18,7 +18,7 @@ public: PaintRecorder(); PaintRecorder(const PaintRecorder&) = delete; - ~PaintRecorder(); + virtual ~PaintRecorder(); PaintRecorder& operator=(const PaintRecorder&) = delete; @@ -32,14 +32,18 @@ // Only valid while recording. ALWAYS_INLINE RecordPaintCanvas* getRecordingCanvas() { - return canvas_.has_value() ? &canvas_.value() : nullptr; + return canvas_.get(); } sk_sp<PaintRecord> finishRecordingAsPicture(); + protected: + virtual std::unique_ptr<RecordPaintCanvas> CreateCanvas(DisplayItemList* list, + const SkRect& bounds); + private: scoped_refptr<DisplayItemList> display_item_list_; - base::Optional<RecordPaintCanvas> canvas_; + std::unique_ptr<RecordPaintCanvas> canvas_; }; } // namespace cc
diff --git a/cc/paint/record_paint_canvas.h b/cc/paint/record_paint_canvas.h index 27256f5..0a33a9c 100644 --- a/cc/paint/record_paint_canvas.h +++ b/cc/paint/record_paint_canvas.h
@@ -21,7 +21,7 @@ class DisplayItemList; class PaintFlags; -class CC_PAINT_EXPORT RecordPaintCanvas final : public PaintCanvas { +class CC_PAINT_EXPORT RecordPaintCanvas : public PaintCanvas { public: RecordPaintCanvas(DisplayItemList* list, const SkRect& bounds); RecordPaintCanvas(const RecordPaintCanvas&) = delete;
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc index 6c0c9d9..d22e89c 100644 --- a/cc/raster/one_copy_raster_buffer_provider.cc +++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -452,7 +452,8 @@ ri->CopySubTexture(staging_buffer->mailbox, *mailbox, mailbox_texture_target, 0, y, 0, y, rect_to_copy.width(), - rows_to_copy); + rows_to_copy, false /* unpack_flip_y */, + false /* unpack_premultiply_alpha */); y += rows_to_copy; // Increment |bytes_scheduled_since_last_flush_| by the amount of memory
diff --git a/cc/trees/draw_properties_unittest.cc b/cc/trees/draw_properties_unittest.cc index f508b1c..d74ab14 100644 --- a/cc/trees/draw_properties_unittest.cc +++ b/cc/trees/draw_properties_unittest.cc
@@ -4868,9 +4868,9 @@ sticky_position.is_anchored_top = true; sticky_position.top_offset = 10.0f; sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(10, 20, 10, 10); + gfx::RectF(10, 20, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 50, 50); + gfx::RectF(0, 0, 50, 50); CommitAndUpdateImplPointers(); @@ -4908,6 +4908,54 @@ sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); } +TEST_F(DrawPropertiesStickyPositionTest, StickyPositionTopRounded) { + CreateTree(); + + SetPostTranslation(sticky_pos_.get(), gfx::Vector2dF(10, 20)); + auto& sticky_position = EnsureStickyData(sticky_pos_.get()).constraints; + sticky_position.is_anchored_top = true; + sticky_position.top_offset = 10.5f; + sticky_position.scroll_container_relative_sticky_box_rect = + gfx::RectF(10, 20, 10, 10); + sticky_position.scroll_container_relative_containing_block_rect = + gfx::RectF(0, 0, 50, 50); + + CommitAndUpdateImplPointers(); + + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(10.f, 20.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + + // Scroll less than sticking point, sticky element should move with scroll as + // we haven't gotten to the initial sticky item location yet. + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(5.f, 5.f)); + + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(5.f, 15.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + + // Scroll past the sticking point, the Y coordinate should now be clamped. + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(15.f, 15.f)); + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(-5.f, 11.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(15.f, 25.f)); + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(-5.f, 11.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + + // Scroll past the end of the sticky container (note: this element does not + // have its own layer as it does not need to be composited). + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(15.f, 50.f)); + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(-5.f, -10.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); +} + TEST_F(DrawPropertiesStickyPositionTest, StickyPositionSubpixelScroll) { CreateTree(); @@ -4915,11 +4963,11 @@ auto& sticky_position = EnsureStickyData(sticky_pos_.get()).constraints; sticky_position.is_anchored_bottom = true; sticky_position.bottom_offset = 10.0f; - sticky_position.constraint_box_rect = gfx::Rect(0, 0, 100, 100); + sticky_position.constraint_box_rect = gfx::RectF(0, 0, 100, 100); sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 200, 10, 10); + gfx::RectF(0, 200, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 100, 500); + gfx::RectF(0, 0, 100, 500); CommitAndUpdateImplPointers(); @@ -4938,11 +4986,11 @@ auto& sticky_position = EnsureStickyData(sticky_pos_.get()).constraints; sticky_position.is_anchored_bottom = true; sticky_position.bottom_offset = 10.0f; - sticky_position.constraint_box_rect = gfx::Rect(0, 0, 100, 100); + sticky_position.constraint_box_rect = gfx::RectF(0, 0, 100, 100); sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 150, 10, 10); + gfx::RectF(0, 150, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 100, 50, 50); + gfx::RectF(0, 100, 50, 50); CommitAndUpdateImplPointers(); @@ -4978,6 +5026,46 @@ sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); } +TEST_F(DrawPropertiesStickyPositionTest, StickyPositionBottomRounded) { + CreateTree(); + + SetPostTranslation(sticky_pos_.get(), gfx::Vector2dF(0, 150)); + auto& sticky_position = EnsureStickyData(sticky_pos_.get()).constraints; + sticky_position.is_anchored_bottom = true; + sticky_position.bottom_offset = 10.5f; + sticky_position.constraint_box_rect = gfx::RectF(0, 0, 100, 100); + sticky_position.scroll_container_relative_sticky_box_rect = + gfx::RectF(0, 150, 10, 10); + sticky_position.scroll_container_relative_containing_block_rect = + gfx::RectF(0, 100, 50, 50); + + CommitAndUpdateImplPointers(); + + // Initially the sticky element is moved up to the top of the container. + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(0.f, 100.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(0.f, 5.f)); + + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(0.f, 95.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + + // Once we get past the top of the container it moves to be aligned 10px + // up from the the bottom of the scroller. + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(0.f, 25.f)); + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(0.f, 79.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); + SetScrollOffsetDelta(scroller_impl_, gfx::Vector2dF(0.f, 30.f)); + UpdateActiveTreeDrawProperties(); + EXPECT_VECTOR2DF_EQ( + gfx::Vector2dF(0.f, 79.f), + sticky_pos_impl_->ScreenSpaceTransform().To2dTranslation()); +} + TEST_F(DrawPropertiesStickyPositionTest, StickyPositionBottomOuterViewportDelta) { CreateTree(); @@ -4991,11 +5079,11 @@ auto& sticky_position = EnsureStickyData(sticky_pos_.get()).constraints; sticky_position.is_anchored_bottom = true; sticky_position.bottom_offset = 10.0f; - sticky_position.constraint_box_rect = gfx::Rect(0, 0, 100, 100); + sticky_position.constraint_box_rect = gfx::RectF(0, 0, 100, 100); sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 70, 10, 10); + gfx::RectF(0, 70, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 60, 100, 100); + gfx::RectF(0, 60, 100, 100); CommitAndUpdateImplPointers(); @@ -5043,11 +5131,11 @@ sticky_position.is_anchored_right = true; sticky_position.left_offset = 10.0f; sticky_position.right_offset = 10.0f; - sticky_position.constraint_box_rect = gfx::Rect(0, 0, 100, 100); + sticky_position.constraint_box_rect = gfx::RectF(0, 0, 100, 100); sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(145, 0, 10, 10); + gfx::RectF(145, 0, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(100, 0, 100, 100); + gfx::RectF(100, 0, 100, 100); CommitAndUpdateImplPointers(); @@ -5125,9 +5213,9 @@ sticky_position.is_anchored_top = true; sticky_position.top_offset = 10.0f; sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(10, 20, 10, 10); + gfx::RectF(10, 20, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 50, 50); + gfx::RectF(0, 0, 50, 50); CommitAndUpdateImplPointers(); @@ -5197,9 +5285,9 @@ sticky_position.is_anchored_top = true; sticky_position.top_offset = 10.0f; sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(20, 30, 10, 10); + gfx::RectF(20, 30, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(20, 20, 30, 30); + gfx::RectF(20, 20, 30, 30); CommitAndUpdateImplPointers(); @@ -5267,9 +5355,9 @@ sticky_position.is_anchored_top = true; sticky_position.top_offset = 0.0f; sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 20, 10, 10); + gfx::RectF(0, 20, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 50, 50); + gfx::RectF(0, 0, 50, 50); CommitAndUpdateImplPointers(); @@ -5324,9 +5412,9 @@ sticky_position.is_anchored_top = true; sticky_position.top_offset = 0.0f; sticky_position.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 20, 10, 10); + gfx::RectF(0, 20, 10, 10); sticky_position.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 50, 50); + gfx::RectF(0, 0, 50, 50); CommitAndUpdateImplPointers(); @@ -5371,18 +5459,18 @@ outer_sticky_pos.is_anchored_top = true; outer_sticky_pos.top_offset = 10.0f; outer_sticky_pos.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 50, 10, 50); + gfx::RectF(0, 50, 10, 50); outer_sticky_pos.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 0, 50, 400); + gfx::RectF(0, 0, 50, 400); scoped_refptr<Layer> inner_sticky = CreateSticky(sticky_pos_.get()); auto& inner_sticky_pos = EnsureStickyData(inner_sticky.get()).constraints; inner_sticky_pos.is_anchored_top = true; inner_sticky_pos.top_offset = 25.0f; inner_sticky_pos.scroll_container_relative_sticky_box_rect = - gfx::Rect(0, 50, 10, 10); + gfx::RectF(0, 50, 10, 10); inner_sticky_pos.scroll_container_relative_containing_block_rect = - gfx::Rect(0, 50, 10, 50); + gfx::RectF(0, 50, 10, 50); EnsureStickyData(inner_sticky.get()).nearest_node_shifting_containing_block = sticky_pos_->transform_tree_index();
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index d3f4aa1..524b1309 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -366,6 +366,10 @@ mutator_host_->ClearMutators(); mutator_host_->SetMutatorHostClient(nullptr); + + // Clear the UKM Manager so that we do not try to report when the + // UKM System has shut down. + compositor_frame_reporting_controller_->SetUkmManager(nullptr); } void LayerTreeHostImpl::WillSendBeginMainFrame() { @@ -6216,6 +6220,7 @@ DCHECK(!ukm_manager_); ukm_manager_ = std::make_unique<UkmManager>(std::move(recorder)); frame_trackers_.SetUkmManager(ukm_manager_.get()); + compositor_frame_reporting_controller_->SetUkmManager(ukm_manager_.get()); } void LayerTreeHostImpl::SetActiveURL(const GURL& url, ukm::SourceId source_id) {
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 94f32ea..b60f04a 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -297,7 +297,7 @@ } // This function should match the offset we set for sticky position layer in -// CompositedLayerMapping::UpdateMainGraphicsLayerGeometry. +// blink::LayoutBoxModelObject::StickyPositionOffset. gfx::Vector2dF TransformTree::StickyPositionOffset(TransformNode* node) { StickyPositionNodeData* sticky_data = MutableStickyPositionData(node->id); if (!sticky_data) @@ -317,7 +317,7 @@ scroll_position -= transform_node->snap_amount; } - gfx::Rect clip = constraint.constraint_box_rect; + gfx::RectF clip = constraint.constraint_box_rect; clip.Offset(scroll_position.x(), scroll_position.y()); // The clip region may need to be offset by the outer viewport bounds, e.g. if @@ -418,7 +418,8 @@ ancestor_sticky_box_offset + ancestor_containing_block_offset + sticky_offset; - return sticky_offset; + // return + return gfx::Vector2dF(roundf(sticky_offset.x()), roundf(sticky_offset.y())); } void TransformTree::UpdateLocalTransform(TransformNode* node) {
diff --git a/cc/trees/sticky_position_constraint.h b/cc/trees/sticky_position_constraint.h index 3a0b06b0..3a6ac240 100644 --- a/cc/trees/sticky_position_constraint.h +++ b/cc/trees/sticky_position_constraint.h
@@ -32,18 +32,18 @@ // The rectangle in which the sticky box is able to be positioned. This may be // smaller than the scroller viewport due to things like padding. - gfx::Rect constraint_box_rect; + gfx::RectF constraint_box_rect; // The rectangle corresponding to original layout position of the sticky box // relative to the scroll ancestor. The sticky box is only offset once the // scroll has passed its initial position (e.g. top_offset will only push // the element down from its original position). - gfx::Rect scroll_container_relative_sticky_box_rect; + gfx::RectF scroll_container_relative_sticky_box_rect; // The layout rectangle of the sticky box's containing block relative to the // scroll ancestor. The sticky box is only moved as far as its containing // block boundary. - gfx::Rect scroll_container_relative_containing_block_rect; + gfx::RectF scroll_container_relative_containing_block_rect; // The nearest ancestor sticky element ids that affect the sticky box // constraint rect and the containing block constraint rect respectively.
diff --git a/cc/trees/ukm_manager.cc b/cc/trees/ukm_manager.cc index 578464d..84d560f 100644 --- a/cc/trees/ukm_manager.cc +++ b/cc/trees/ukm_manager.cc
@@ -169,4 +169,94 @@ builder.Record(recorder_.get()); } +void UkmManager::RecordLatencyUKM( + bool missed_frame, + const std::vector<CompositorFrameReporter::StageData>& stage_history, + const base::flat_set<FrameSequenceTrackerType>* active_trackers, + const viz::FrameTimingDetails& viz_breakdown) const { + ukm::builders::Graphics_Smoothness_Latency builder(source_id_); + + if (missed_frame) + builder.SetMissedFrame(true); + + // Record each stage + for (const CompositorFrameReporter::StageData& stage : stage_history) { + switch (stage.stage_type) { +#define CASE_FOR_STAGE(name) \ + case CompositorFrameReporter::StageType::k##name: \ + builder.Set##name((stage.end_time - stage.start_time).InMicroseconds()); \ + break; + CASE_FOR_STAGE(BeginImplFrameToSendBeginMainFrame); + CASE_FOR_STAGE(SendBeginMainFrameToCommit); + CASE_FOR_STAGE(Commit); + CASE_FOR_STAGE(EndCommitToActivation); + CASE_FOR_STAGE(Activation); + CASE_FOR_STAGE(EndActivateToSubmitCompositorFrame); + CASE_FOR_STAGE(TotalLatency); +#undef CASE_FOR_STAGE + // Break out kSubmitCompositorFrameToPresentationCompositorFrame to report + // the viz breakdown. + case CompositorFrameReporter::StageType:: + kSubmitCompositorFrameToPresentationCompositorFrame: + builder.SetSubmitCompositorFrameToPresentationCompositorFrame( + (stage.end_time - stage.start_time).InMicroseconds()); + if (viz_breakdown.received_compositor_frame_timestamp.is_null()) + break; + builder + .SetSubmitCompositorFrameToPresentationCompositorFrame_SubmitToReceiveCompositorFrame( + (viz_breakdown.received_compositor_frame_timestamp - + stage.start_time) + .InMicroseconds()); + if (viz_breakdown.draw_start_timestamp.is_null()) + break; + builder + .SetSubmitCompositorFrameToPresentationCompositorFrame_ReceivedCompositorFrameToStartDraw( + (viz_breakdown.draw_start_timestamp - + viz_breakdown.received_compositor_frame_timestamp) + .InMicroseconds()); + if (viz_breakdown.swap_timings.is_null()) + break; + builder + .SetSubmitCompositorFrameToPresentationCompositorFrame_StartDrawToSwapEnd( + (viz_breakdown.swap_timings.swap_end - + viz_breakdown.draw_start_timestamp) + .InMicroseconds()); + builder + .SetSubmitCompositorFrameToPresentationCompositorFrame_SwapEndToPresentationCompositorFrame( + (viz_breakdown.presentation_feedback.timestamp - + viz_breakdown.swap_timings.swap_end) + .InMicroseconds()); + break; + default: + NOTREACHED(); + break; + } + } + + // Record the active trackers + for (const auto& frame_sequence_tracker_type : *active_trackers) { + if (frame_sequence_tracker_type == FrameSequenceTrackerType::kUniversal) + continue; + switch (frame_sequence_tracker_type) { +#define CASE_FOR_TRACKER(name) \ + case FrameSequenceTrackerType::k##name: \ + builder.Set##name(true); \ + break; + CASE_FOR_TRACKER(CompositorAnimation); + CASE_FOR_TRACKER(MainThreadAnimation); + CASE_FOR_TRACKER(PinchZoom); + CASE_FOR_TRACKER(RAF); + CASE_FOR_TRACKER(TouchScroll); + CASE_FOR_TRACKER(Video); + CASE_FOR_TRACKER(WheelScroll); +#undef CASE_FOR_TRACKER + default: + NOTREACHED(); + break; + } + } + + builder.Record(recorder_.get()); +} + } // namespace cc
diff --git a/cc/trees/ukm_manager.h b/cc/trees/ukm_manager.h index adffd995..010a1d3 100644 --- a/cc/trees/ukm_manager.h +++ b/cc/trees/ukm_manager.h
@@ -6,6 +6,7 @@ #define CC_TREES_UKM_MANAGER_H_ #include "cc/cc_export.h" +#include "cc/metrics/compositor_frame_reporter.h" #include "cc/metrics/frame_sequence_tracker.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "url/gurl.h" @@ -43,6 +44,11 @@ void RecordThroughputUKM(FrameSequenceTrackerType tracker_type, FrameSequenceMetrics::ThreadType thread_type, int64_t throughput) const; + void RecordLatencyUKM( + bool missed_frame, + const std::vector<CompositorFrameReporter::StageData>& stage_history, + const base::flat_set<FrameSequenceTrackerType>* active_trackers, + const viz::FrameTimingDetails& viz_breakdown) const; ukm::UkmRecorder* recorder_for_testing() { return recorder_.get(); }
diff --git a/chrome/VERSION b/chrome/VERSION index 338395e..06f733d 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=81 MINOR=0 -BUILD=4003 +BUILD=4004 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index ec1e320..512b15f 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -134,8 +134,10 @@ "//chrome/browser/ui/android/strings:ui_strings_grd", "//chrome/browser/ui/android/widget:ui_widget_java_resources", "//chrome/browser/ui/messages/android:java_resources", + "//components/app_modal/android:java_resources", "//components/autofill/android:autofill_java_resources", "//components/browser_ui/modaldialog/android:java_resources", + "//components/browser_ui/strings/android:browser_ui_strings_grd", "//components/browser_ui/styles/android:java_resources", "//components/browser_ui/widget/android:java_resources", "//components/policy:app_restrictions_resources", @@ -267,6 +269,7 @@ "//chrome/browser/ui/android/widget:java", "//chrome/browser/util:java", "//chrome/lib/lifecycle/public/android:java", + "//components/app_modal/android:java", "//components/autofill/android:autofill_java", "//components/autofill_assistant/browser:proto_java", "//components/background_task_scheduler:background_task_scheduler_java", @@ -789,6 +792,7 @@ "//chrome/lib/lifecycle/public/android:java", "//chrome/test/android:chrome_java_test_support", "//chrome/test/android/test_trusted_web_activity:test_trusted_web_activity_java", + "//components/app_modal/android:java", "//components/autofill/android:autofill_java", "//components/background_task_scheduler:background_task_scheduler_java", "//components/background_task_scheduler:background_task_scheduler_javatests", @@ -2302,27 +2306,28 @@ ] } } -} -instrumentation_test_runner("trichrome_chrome_bundle_smoke_test") { - apk_under_test = "//chrome/android:trichrome_chrome_bundle_apks" - android_test_apk = ":chrome_bundle_smoke_test_apk" - android_test_apk_name = "ChromeBundleSmokeTest" - never_incremental = true - modules = [ "test_dummy" ] - additional_apks = [ "//chrome/android:trichrome_library_apk" ] - extra_args = _bundle_smoke_test_extra_args -} + instrumentation_test_runner("trichrome_chrome_bundle_smoke_test") { + apk_under_test = "//chrome/android:trichrome_chrome_bundle_apks" + android_test_apk = ":chrome_bundle_smoke_test_apk" + android_test_apk_name = "ChromeBundleSmokeTest" + never_incremental = true + modules = [ "test_dummy" ] + additional_apks = [ "//chrome/android:trichrome_library_apk" ] + extra_args = _bundle_smoke_test_extra_args + } -instrumentation_test_runner("trichrome_chrome_bundle_fake_modules_smoke_test") { - apk_under_test = "//chrome/android:trichrome_chrome_bundle_apks" - android_test_apk = ":chrome_bundle_smoke_test_apk" - android_test_apk_name = "ChromeBundleSmokeTest" - never_incremental = true - fake_modules = [ "test_dummy" ] - additional_apks = [ "//chrome/android:trichrome_library_apk" ] - extra_args = - _bundle_smoke_test_extra_args + _bundle_fake_modules_smoke_test_extra_args + instrumentation_test_runner( + "trichrome_chrome_bundle_fake_modules_smoke_test") { + apk_under_test = "//chrome/android:trichrome_chrome_bundle_apks" + android_test_apk = ":chrome_bundle_smoke_test_apk" + android_test_apk_name = "ChromeBundleSmokeTest" + never_incremental = true + fake_modules = [ "test_dummy" ] + additional_apks = [ "//chrome/android:trichrome_library_apk" ] + extra_args = _bundle_smoke_test_extra_args + + _bundle_fake_modules_smoke_test_extra_args + } } group("chrome_public_wpt") { @@ -2710,7 +2715,6 @@ "java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java", "java/src/org/chromium/chrome/browser/init/NativeStartupBridge.java", "java/src/org/chromium/chrome/browser/instantapps/InstantAppsSettings.java", - "java/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialog.java", "java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java", "java/src/org/chromium/chrome/browser/locale/LocaleManager.java", "java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java",
diff --git a/chrome/android/DEPS b/chrome/android/DEPS index 29b39d32..1d74955 100644 --- a/chrome/android/DEPS +++ b/chrome/android/DEPS
@@ -3,6 +3,7 @@ "+chrome/browser/preferences/android/java", "+chrome/browser/ui/android/widget", "+chrome/browser/util/android/java", + "+components/app_modal/android", "+components/browser_ui/modaldialog/android", "+components/browser_ui/widget/android", "+components/content_capture",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index c93b91dc..9efca7c 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -867,9 +867,6 @@ "java/src/org/chromium/chrome/browser/invalidation/ResumableDelayedTaskRunner.java", "java/src/org/chromium/chrome/browser/invalidation/SessionsInvalidationManager.java", "java/src/org/chromium/chrome/browser/invalidation/UniqueIdInvalidationClientNameGenerator.java", - "java/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialog.java", - "java/src/org/chromium/chrome/browser/jsdialog/JavascriptDialogCustomView.java", - "java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java", "java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java", "java/src/org/chromium/chrome/browser/language/LanguageAskPrompt.java", "java/src/org/chromium/chrome/browser/locale/DefaultSearchEngineDialogHelper.java", @@ -941,7 +938,6 @@ "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java", "java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java", "java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java", - "java/src/org/chromium/chrome/browser/night_mode/NightModeReparentingController.java", "java/src/org/chromium/chrome/browser/night_mode/NightModeStateProvider.java", "java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java", "java/src/org/chromium/chrome/browser/night_mode/PowerSavingModeMonitor.java", @@ -1624,7 +1620,6 @@ "java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java", "java/src/org/chromium/chrome/browser/tab/TrustedCdn.java", "java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java", - "java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingDelegateFactory.java", "java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingTask.java", "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java", "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java", @@ -1639,8 +1634,6 @@ "java/src/org/chromium/chrome/browser/tabmodel/EmptyTabModelSelectorObserver.java", "java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModel.java", "java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator.java", - "java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java", - "java/src/org/chromium/chrome/browser/tabmodel/SingleTabModelSelector.java", "java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java", "java/src/org/chromium/chrome/browser/tabmodel/TabList.java", "java/src/org/chromium/chrome/browser/tabmodel/TabModel.java",
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb index 96decbc5..c8ce1829 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
@@ -10,7 +10,7 @@ <translation id="4850886885716139402">Zobrazit</translation> <translation id="4952448020231702394">Asistent Google vám šetří čas tím, že vám pomáhá dokončovat akce na webu, jako jsou vyhledávání a platby.</translation> <translation id="5267269112080050255">Asistent Google v Chromu byl otevřen na celou výšku.</translation> -<translation id="6235816755461937614">Asistent Google odesílá dotazy (textové a hlasové) do Chromu. Chrome adresu URL a obsah webu a relevantní osobní údaje odešle do Googlu. Tyto údaje mohou u některých typů dotazů zahrnovat e‑mailovou adresu a typ platební karty. Tuto funkci můžete v nastavení Chromu vypnout. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> +<translation id="6235816755461937614">Asistent Google odesílá dotazy (textové a hlasové) do Chromu. Chrome adresu URL, obsah webu a relevantní osobní údaje odešle do Googlu. Tyto údaje mohou u některých typů dotazů zahrnovat e‑mailovou adresu a typ platební karty. Tuto funkci můžete v nastavení Chromu vypnout. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Asistent Google v Chromu je otevřený na poloviční výšku.</translation> <translation id="6973932557599545801">Pardon, nedokážu vám pomoct. Je to na vás.</translation> <translation id="7658239707568436148">Zrušit</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb index 0eaa242..d213ae5 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
@@ -10,7 +10,7 @@ <translation id="4850886885716139402">Prikaz</translation> <translation id="4952448020231702394">Google asistent štedi vaše vrijeme jer vam pomaže dovršiti radnje na webu, kao što su pretraživanje i naplata.</translation> <translation id="5267269112080050255">Google asistent u Chromeu otvoren je u punoj visini.</translation> -<translation id="6235816755461937614">Google asistent šalje upite (tekstualne i glasovne) Chromeu. Chrome će Googleu poslati URL i sadržaj web-lokacije te relevantne osobne podatke. Ovisno o upitu to može uključivati e-poštu i vrstu kreditne kartice. To možete isključiti u Chromeovim postavkama. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> +<translation id="6235816755461937614">Google asistent šalje upite (tekstualne i glasovne) Chromeu. Chrome će Googleu poslati URL i sadržaj web-lokacije te relevantne osobne podatke. Ovisno o upitu to može uključivati e-poštu i vrstu kreditne kartice. Tu značajku možete isključiti u Chromeovim postavkama. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google asistent u Chromeu otvoren je na pola visine.</translation> <translation id="6973932557599545801">Nažalost, ne mogu vam pomoći, nastavite sami.</translation> <translation id="7658239707568436148">Odustani</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ka.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ka.xtb index 2b98eb0c..57ed4df 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ka.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ka.xtb
@@ -10,7 +10,7 @@ <translation id="4850886885716139402">გადახედვა</translation> <translation id="4952448020231702394">Google ასისტენტი გეხმარებათ დროის დაზოგვაში და ვებში ისეთი ქმედებების შესრულებაში, როგორიცაა ძიება თუ ანგარიშსწორება.</translation> <translation id="5267269112080050255">Google ასისტენტი Chrome-ში გახსნილია სრულ სიმაღლეზე.</translation> -<translation id="6235816755461937614">Google ასისტენტი მოთხოვნებს (ტექსტურ და ხმოვან) უგზავნის Chrome-ს. Chrome გაუგზავნის Google-ს ამ საიტის URL-სა და კონტენტს, ასევე შესაბამის პერსონალურ ინფორმაციას. აღნიშნული შეიძლება მოიცავდეს ელფოსტის მისამართსა და საკრედიტო ბარათის ტიპს, რაც დამოკიდებულია მოთხოვნაზე. ამის გამორთვა შეგიძლიათ Chrome-ის პარამეტრებში. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> +<translation id="6235816755461937614">Google ასისტენტი (ტექსტურ და ხმოვან) მოთხოვნებს უგზავნის Chrome-ს. Chrome გაუგზავნის Google-ს ამ საიტის URL-სა და კონტენტს, ასევე შესაბამის პერსონალურ ინფორმაციას. აღნიშნული შეიძლება მოიცავდეს ელფოსტის მისამართსა და საკრედიტო ბარათის ტიპს, რაც დამოკიდებულია მოთხოვნაზე. ამის გამორთვა შეგიძლიათ Chrome-ის პარამეტრებში. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google ასისტენტი Chrome-ში გახსნილია ნახევარ სიმაღლეზე.</translation> <translation id="6973932557599545801">სამწუხაროდ, ვერ დაგეხმარებით. გთხოვთ, დამოუკიდებლად გააგრძელოთ.</translation> <translation id="7658239707568436148">გაუქმება</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb index 3b4a53d97..94c227d 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb
@@ -8,7 +8,7 @@ <translation id="4437727785356380473">Google Assistente no Chrome fechado.</translation> <translation id="4517854969512651305">Aumentar valor</translation> <translation id="4850886885716139402">Visualizar</translation> -<translation id="4952448020231702394">Com o Google Assistente, você economiza tempo ao ajudar a realizar ações na Web, como pesquisas e finalizações de compra.</translation> +<translation id="4952448020231702394">O Google Assistente economiza seu tempo ao ajudar você a realizar ações na Web, como pesquisas e finalizações de compra.</translation> <translation id="5267269112080050255">Google Assistente no Chrome aberto no tamanho máximo.</translation> <translation id="6235816755461937614">O Google Assistente envia consultas (texto e voz) para o Chrome. O Chrome enviará ao Google o URL e o conteúdo do site, assim como informações pessoais relevantes. Dependendo da consulta, isso pode incluir o e-mail e o tipo de cartão de crédito. É possível desativar esse recurso nas configurações do Chrome. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google Assistente no Chrome aberto no tamanho médio.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb index 84bed8f..1f1bad1 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb
@@ -10,7 +10,7 @@ <translation id="4850886885716139402">Ko‘rish</translation> <translation id="4952448020231702394">Google Assistent internetdagi faoliyatingizda yordam beradi. Masalan, kerakli axborotlarni topadi va buyurtmalarni rasmiylashiradi.</translation> <translation id="5267269112080050255">Chromedagi Google Assistent toʻliq hajmda ochildi.</translation> -<translation id="6235816755461937614">Google Assistent Google Chrome brauzeriga soʻrovlar (matn va tovush) yuboradi. Chrome bu sayt URL manzili va shaxsiy maʼlumotlarga aloqador kontent axborotlarini Google serverlariga yuboradi. Soʻrovga qarab shaxsiy maʼlumotlarga email va kredit karta turini kiritish mumkin. Buni Chrome sozlamalari orqali faolsizlantirish mumkin. <ph name="BEGIN_LINK" />Batafsil axborot<ph name="END_LINK" /></translation> +<translation id="6235816755461937614">Google Assistent Google Chrome brauzeriga soʻrovlar (matn va tovush) yuboradi. Chrome bu sayt URL manzili va shaxsiy maʼlumotlarga aloqador kontent axborotini Google serverlariga yuboradi. Soʻrovga qarab shaxsiy maʼlumotlarga email va kredit karta turini kiritish mumkin. Buni Chrome sozlamalari orqali faolsizlantirish mumkin. <ph name="BEGIN_LINK" />Batafsil axborot<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Chromedagi Google Assistent yarim hajmda ochildi.</translation> <translation id="6973932557599545801">Uzr, men yordam bera olmayman. Oʻzingiz harakat qiling.</translation> <translation id="7658239707568436148">Bekor qilish</translation>
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index b654a782..fe97421 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -208,7 +208,7 @@ mSecondaryTasksSurfacePropertyModel.set( IS_FAKE_SEARCH_BOX_VISIBLE, !hasFocus); } else { - mPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, !hasFocus); + setFakeBoxVisibility(!hasFocus); } } notifyStateChange(); @@ -255,6 +255,7 @@ setTabCarouselVisibility( mTabModelSelector.getModel(false).getCount() > 0 && !mIsIncognito); setMVTilesVisibility(!mIsIncognito); + setFakeBoxVisibility(!mIsIncognito); setSecondaryTasksSurfaceVisibility(mIsIncognito); // Only pad single pane home page since tabs grid has already been padding for the @@ -266,6 +267,7 @@ setExploreSurfaceVisibility(false); setTabCarouselVisibility(false); setMVTilesVisibility(false); + setFakeBoxVisibility(false); setSecondaryTasksSurfaceVisibility(true); } else if (mOverviewModeState == OverviewModeState.SHOWN_TWO_PANES) { RecordUserAction.record("StartSurface.TwoPanes"); @@ -289,6 +291,7 @@ RecordUserAction.record("StartSurface.TasksOnly"); setMVTilesVisibility(!mIsIncognito); setExploreSurfaceVisibility(false); + setFakeBoxVisibility(true); } else if (mOverviewModeState == OverviewModeState.NOT_SHOWN) { if (mSecondaryTasksSurfaceController != null) setSecondaryTasksSurfaceVisibility(false); } @@ -463,16 +466,6 @@ if (isIncognito == mIsIncognito) return; mIsIncognito = isIncognito; - // This is because LocationBarVoiceRecognitionHandler monitors incognito mode and returns - // false in incognito mode. However, when switching incognito mode, this class is notified - // earlier than the LocationBarVoiceRecognitionHandler, so isVoiceSearchEnabled returns - // incorrect state if check synchronously. - ThreadUtils.postOnUiThread(() -> { - mPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE, - mFakeboxDelegate.getLocationBarVoiceRecognitionHandler() - .isVoiceSearchEnabled()); - }); - mPropertyModel.set(IS_INCOGNITO, mIsIncognito); setOverviewStateInternal(); @@ -525,6 +518,9 @@ } // Do not show Tab switcher toolbar when focusing the Omnibox. + if (mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)) { + return mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE); + } return mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE); } @@ -539,6 +535,21 @@ mPropertyModel.set(MV_TILES_VISIBLE, isVisible); } + private void setFakeBoxVisibility(boolean isVisible) { + if (mPropertyModel == null) return; + mPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, isVisible); + + // This is because LocationBarVoiceRecognitionHandler monitors incognito mode and returns + // false in incognito mode. However, when switching incognito mode, this class is notified + // earlier than the LocationBarVoiceRecognitionHandler, so isVoiceSearchEnabled returns + // incorrect state if check synchronously. + ThreadUtils.postOnUiThread(() -> { + mPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE, + mFakeboxDelegate.getLocationBarVoiceRecognitionHandler() + .isVoiceSearchEnabled()); + }); + } + private void setIncognitoModeDescriptionVisibility(boolean isVisible) { if (isVisible == mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE)) return;
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java index 39993ea..cc45b3af 100644 --- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -183,6 +183,7 @@ assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); mediator.hideOverview(true); verify(mMainTabGridController).hideOverview(eq(true)); @@ -230,6 +231,7 @@ assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); mediator.hideOverview(true); verify(mMainTabGridController).hideOverview(eq(true)); @@ -516,6 +518,8 @@ assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(true)); assertThat( mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), + equalTo(false)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); mediator.setOverviewState(OverviewModeState.SHOWN_TABSWITCHER); @@ -540,6 +544,8 @@ assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(true)); assertThat( mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), + equalTo(false)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); mediator.hideOverview(false); @@ -606,6 +612,8 @@ assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(true)); assertThat( mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), + equalTo(false)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); doReturn(false).when(mTabModelSelector).isIncognitoSelected(); @@ -704,6 +712,8 @@ assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); assertThat( mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); + assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), + equalTo(false)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb index c40a9d2..3bc7039 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">পৰামৰ্শসমূহ পৰ্যালোচনা কৰক।</translation> <translation id="7885132941432959125">টেবটো সোঁফাললৈ নিয়ক</translation> <translation id="7966321538264951561">পৰামৰ্শসমূহ বাতিল কৰক।</translation> +<translation id="8205266828577616993">টেবটো ওপৰলৈ নিয়ক</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> টা বাছনি কৰা টেব বন্ধ কৰক}one{<ph name="TABS_COUNT_MANY" /> টা বাছনি কৰা টেব বন্ধ কৰক}other{<ph name="TABS_COUNT_MANY" /> টা বাছনি কৰা টেব বন্ধ কৰক}}</translation> <translation id="9150694013019234766">স্ক্রীণৰ একেবাৰে তলৰ কাষত থকা টেবৰ গোটৰ টেবসমূহ সলনা সলনিকৈ ব্যৱহাৰ কৰক</translation> <translation id="9169594135889675189">গোটত নতুন টেব যোগ কৰক</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb index 69639a0..b3ce734 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Təklifləri nəzərdən keçirin.</translation> <translation id="7885132941432959125">Tabı sağa daşıyın</translation> <translation id="7966321538264951561">Təkliflərdən imtina edin.</translation> +<translation id="8205266828577616993">Tabı yuxarıya daşıyın</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Seçilmiş <ph name="TABS_COUNT_ONE" /> tabeli bağlayın}other{Seçilmiş <ph name="TABS_COUNT_MANY" /> tabeli bağlayın}}</translation> <translation id="9150694013019234766">Ekranın aşağısındakı tab qrupunda tablar arasında keçid edin</translation> <translation id="9169594135889675189">Qrupa yeni tab əlavə edin</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb index 12e339a..b8b0235 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Праглядзець прапановы.</translation> <translation id="7885132941432959125">Перамясціць укладку ўправа</translation> <translation id="7966321538264951561">Адхіліць прапановы.</translation> +<translation id="8205266828577616993">Перамясціць укладку ўверх</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Закрыць <ph name="TABS_COUNT_ONE" /> выбраную ўкладку}one{Закрыць <ph name="TABS_COUNT_MANY" /> выбраную ўкладку}few{Закрыць <ph name="TABS_COUNT_MANY" /> выбраныя ўкладкі}many{Закрыць <ph name="TABS_COUNT_MANY" /> выбраных укладак}other{Закрыць <ph name="TABS_COUNT_MANY" /> выбранай укладкі}}</translation> <translation id="9150694013019234766">Пераключайцеся паміж укладкамі групы ў ніжняй частцы экрана</translation> <translation id="9169594135889675189">Дадаць у групу новую ўкладку</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb index 98b5f9d..656d6e4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Преглед на предложенията.</translation> <translation id="7885132941432959125">Преместване на раздела надясно</translation> <translation id="7966321538264951561">Отхвърляне на предложенията.</translation> +<translation id="8205266828577616993">Преместване на раздела нагоре</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Затваряне на избрания <ph name="TABS_COUNT_ONE" /> раздел}other{Затваряне на избраните <ph name="TABS_COUNT_MANY" /> раздела}}</translation> <translation id="9150694013019234766">Превключвайте между разделите в групата в долната част на екрана</translation> <translation id="9169594135889675189">Добавяне на нов раздел към групата</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb index 6007a22..ce8a2ea 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
@@ -29,7 +29,7 @@ <translation id="7792771145871471484">Pregled prijedloga.</translation> <translation id="7885132941432959125">Pomjeranje kartice udesno</translation> <translation id="7966321538264951561">Odbacivanje prijedloga.</translation> -<translation id="8205266828577616993">Premjestite karticu gore</translation> +<translation id="8205266828577616993">Pomjeri karticu prema gore</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Zatvaranje <ph name="TABS_COUNT_ONE" /> odabrane kartice}one{Zatvaranje <ph name="TABS_COUNT_MANY" /> odabrane kartice}few{Zatvaranje <ph name="TABS_COUNT_MANY" /> odabrane kartice}other{Zatvaranje <ph name="TABS_COUNT_MANY" /> odabranih kartica}}</translation> <translation id="9150694013019234766">Prebacivanje između kartica unutar grupe kartica pri dnu ekrana</translation> <translation id="9169594135889675189">Dodaj novu karticu u grupu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb index 428f44c..ccd62f2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Revisa els suggeriments.</translation> <translation id="7885132941432959125">Mou la pestanya cap a la dreta</translation> <translation id="7966321538264951561">Ignora els suggeriments.</translation> +<translation id="8205266828577616993">Mou la pestanya cap amunt</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Tanca <ph name="TABS_COUNT_ONE" /> pestanya seleccionada}other{Tanca les <ph name="TABS_COUNT_MANY" /> pestanyes seleccionades}}</translation> <translation id="9150694013019234766">Canvia de pestanya al grup de pestanyes de la part inferior de la pantalla</translation> <translation id="9169594135889675189">Afegeix una pestanya nova al grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb index cb86198..08b99b7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Zkontrolovat návrhy.</translation> <translation id="7885132941432959125">Přesunout kartu doprava</translation> <translation id="7966321538264951561">Zavřít návrhy.</translation> +<translation id="8205266828577616993">Posunout kartu nahoru</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Zavřít <ph name="TABS_COUNT_ONE" /> vybranou kartu}few{Zavřít <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Zavřít <ph name="TABS_COUNT_MANY" /> vybrané karty}other{Zavřít <ph name="TABS_COUNT_MANY" /> vybraných karet}}</translation> <translation id="9150694013019234766">Ve skupině karet v dolní části obrazovky můžete přepínat mezi kartami</translation> <translation id="9169594135889675189">Přidat do skupiny novou kartu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb index 2246b65..ca60168 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Gennemgå forslagene.</translation> <translation id="7885132941432959125">Flyt fane til højre</translation> <translation id="7966321538264951561">Afvis forslagene.</translation> +<translation id="8205266828577616993">Flyt fane op</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Luk <ph name="TABS_COUNT_ONE" /> valgt fane}one{Luk <ph name="TABS_COUNT_MANY" /> valgt fane}other{Luk de <ph name="TABS_COUNT_MANY" /> valgte faner}}</translation> <translation id="9150694013019234766">Skift mellem faner i din fanegruppe nederst på skærmen</translation> <translation id="9169594135889675189">Føj en ny fane til gruppen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb index 30d2991..ac52a7c 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Vorschläge ansehen.</translation> <translation id="7885132941432959125">Tab nach rechts verschieben</translation> <translation id="7966321538264951561">Vorschläge ablehnen.</translation> +<translation id="8205266828577616993">Tab nach oben verschieben</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ausgewählten Tab schließen}other{<ph name="TABS_COUNT_MANY" /> ausgewählte Tabs schließen}}</translation> <translation id="9150694013019234766">Am unteren Bildschirmrand können Sie zwischen den Tabs in Ihrer Tabgruppe wechseln</translation> <translation id="9169594135889675189">Der Gruppe einen neuen Tab hinzufügen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb index dcde3fe0..c285791 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Revisa las sugerencias.</translation> <translation id="7885132941432959125">Mover la pestaña a la derecha</translation> <translation id="7966321538264951561">Descarta las sugerencias.</translation> +<translation id="8205266828577616993">Mover la pestaña hacia arriba</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Cierra <ph name="TABS_COUNT_ONE" /> pestaña seleccionada}other{Cierra <ph name="TABS_COUNT_MANY" /> pestañas seleccionadas}}</translation> <translation id="9150694013019234766">Alterna entre las pestañas que aparecen en el grupo de pestañas cerca de la parte inferior de la pantalla</translation> <translation id="9169594135889675189">Agrega una pestaña nueva al grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb index b672870..72efd17 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Revisar las sugerencias.</translation> <translation id="7885132941432959125">Mover pestaña a la derecha</translation> <translation id="7966321538264951561">Cerrar las sugerencias.</translation> +<translation id="8205266828577616993">Subir pestaña</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Cerrar <ph name="TABS_COUNT_ONE" /> pestaña seleccionada}other{Cerrar <ph name="TABS_COUNT_MANY" /> pestañas seleccionadas}}</translation> <translation id="9150694013019234766">Cambia de una pestaña a otra en tu grupo de pestañas de la parte inferior de la pantalla</translation> <translation id="9169594135889675189">Añadir una pestaña al grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb index bf240b5..f530293 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Vaadake soovitused üle.</translation> <translation id="7885132941432959125">Teisalda vaheleht paremale</translation> <translation id="7966321538264951561">Loobuge soovitustest.</translation> +<translation id="8205266828577616993">Teisalda vaheleht üles</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Sule <ph name="TABS_COUNT_ONE" /> valitud vaheleht}other{Sule <ph name="TABS_COUNT_MANY" /> valitud vahelehte}}</translation> <translation id="9150694013019234766">Ekraanikuva allosas olevas vahelehtede grupis vahelehtede vahel vahetamine</translation> <translation id="9169594135889675189">Lisa gruppi uus vaheleht</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb index b2d5626..05891182 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">پیشنهادها مرور شود.</translation> <translation id="7885132941432959125">انتقال برگه به چپ</translation> <translation id="7966321538264951561">پیشنهادها رد شود.</translation> +<translation id="8205266828577616993">انتقال برگه به بالا</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{بستن <ph name="TABS_COUNT_ONE" /> برگه انتخابی}one{بستن <ph name="TABS_COUNT_MANY" /> برگه انتخابی}other{بستن <ph name="TABS_COUNT_MANY" /> برگه انتخابی}}</translation> <translation id="9150694013019234766">جابهجایی بین برگهها در گروه برگه شما واقع در نزدیک پایین صفحهنمایش</translation> <translation id="9169594135889675189">افزودن برگه جدید به گروه</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb index 9aac7791..65b69c933 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Suriin ang mga suhestyon.</translation> <translation id="7885132941432959125">Ilipat ang tab sa kanan</translation> <translation id="7966321538264951561">I-dismiss ang mga suhestyon.</translation> +<translation id="8205266828577616993">Ilipat ang tab sa itaas</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Isara ang <ph name="TABS_COUNT_ONE" /> napiling tab}one{Isara ang <ph name="TABS_COUNT_MANY" /> napiling tab}other{Isara ang <ph name="TABS_COUNT_MANY" /> na napiling tab}}</translation> <translation id="9150694013019234766">Magpalipat-lipat sa mga tab sa iyong grupo ng tab malapit sa ibaba ng screen</translation> <translation id="9169594135889675189">Magdagdag ng bagong tab sa grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb index 18e26ad..45895cd 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Examiner les suggestions.</translation> <translation id="7885132941432959125">Déplacer l'onglet vers la droite</translation> <translation id="7966321538264951561">Ignorer les suggestions.</translation> +<translation id="8205266828577616993">Déplacer l'onglet vers le haut</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Fermer <ph name="TABS_COUNT_ONE" /> onglet sélectionné}one{Fermer <ph name="TABS_COUNT_MANY" /> onglet sélectionné}other{Fermer <ph name="TABS_COUNT_MANY" /> onglets sélectionnés}}</translation> <translation id="9150694013019234766">Basculez entre les onglets dans votre groupe d'onglets, près du bas de l'écran</translation> <translation id="9169594135889675189">Ajouter un onglet au groupe</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb index 105f8feb..79f5451 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Revisar as suxestións.</translation> <translation id="7885132941432959125">Mover pestana cara á dereita</translation> <translation id="7966321538264951561">Ignorar estas suxestións.</translation> +<translation id="8205266828577616993">Mover pestana cara arriba</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Pechar <ph name="TABS_COUNT_ONE" /> pestana seleccionada}other{Pechar <ph name="TABS_COUNT_MANY" /> pestanas seleccionadas}}</translation> <translation id="9150694013019234766">Cambia dunha pestana a outra no grupo de pestanas da parte inferior da pantalla</translation> <translation id="9169594135889675189">Engadir nova pestana ao grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb index 0fd15ef..f50b210 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">સૂચનોનો રિવ્યૂ કરો.</translation> <translation id="7885132941432959125">ટૅબને જમણે ખસેડો</translation> <translation id="7966321538264951561">સૂચનોને છોડી દો.</translation> +<translation id="8205266828577616993">ટૅબ ઉપર ખસેડો</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{પસંદ કરેલા <ph name="TABS_COUNT_ONE" /> ટૅબને બંધ કરો}one{પસંદ કરેલા <ph name="TABS_COUNT_MANY" /> ટૅબને બંધ કરો}other{પસંદ કરેલા <ph name="TABS_COUNT_MANY" /> ટૅબને બંધ કરો}}</translation> <translation id="9150694013019234766">સ્ક્રીનના નીચેના ભાગમાં, તમારા ટૅબ ગ્રૂપમાં એકથી વધુ ટૅબની વચ્ચે સ્વિચ કરો</translation> <translation id="9169594135889675189">ગ્રૂપમાં નવું ટૅબ ઉમેરો</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb index e878f83..42c4525 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">सुझावों की समीक्षा करें.</translation> <translation id="7885132941432959125">टैब को दाईं ओर ले जाएं</translation> <translation id="7966321538264951561">सुझावों को खारिज करें.</translation> +<translation id="8205266828577616993">टैब ऊपर भेजें</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> चुना गया टैब बंद करें}one{<ph name="TABS_COUNT_MANY" /> चुने गए टैब बंद करें}other{<ph name="TABS_COUNT_MANY" /> चुने गए टैब बंद करें}}</translation> <translation id="9150694013019234766">स्क्रीन के सबसे नीचे दिए गए अपने टैब समूह में एक से दूसरे टैब पर जाएं</translation> <translation id="9169594135889675189">समूह में नया टैब जोड़ें</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb index d326566..6906cea7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Javaslatok áttekintése.</translation> <translation id="7885132941432959125">Lap mozgatása jobbra</translation> <translation id="7966321538264951561">Javaslatok elvetése.</translation> +<translation id="8205266828577616993">Lap mozgatása felfelé</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> kijelölt lap bezárása}other{<ph name="TABS_COUNT_MANY" /> kijelölt lap bezárása}}</translation> <translation id="9150694013019234766">Válthat a képernyő aljánál lévő lapcsoport lapjai között</translation> <translation id="9169594135889675189">Új lap hozzáadása a csoporthoz</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb index a331d8c..4b5ad0187 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Դիտել հուշումները։</translation> <translation id="7885132941432959125">Տեղափոխել ներդիրն աջ</translation> <translation id="7966321538264951561">Փակել հուշումները։</translation> +<translation id="8205266828577616993">Տեղափոխել ներդիրը վերև</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Փակել ընտրված <ph name="TABS_COUNT_ONE" /> ներդիրը}one{Փակել ընտրված <ph name="TABS_COUNT_MANY" /> ներդիրը}other{Փակել ընտրված <ph name="TABS_COUNT_MANY" /> ներդիրները}}</translation> <translation id="9150694013019234766">Էկրանի ներքևի հատվածում գտնվող ներդիրների խմբում կարող եք անցնել մի ներդիրից մյուսը</translation> <translation id="9169594135889675189">Ավելացնել նոր ներդիր խմբում</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb index 83779c7..3f07dbb 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Tinjau saran.</translation> <translation id="7885132941432959125">Pindahkan tab ke kanan</translation> <translation id="7966321538264951561">Tutup saran.</translation> +<translation id="8205266828577616993">Pindahkan tab ke atas</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Tutup <ph name="TABS_COUNT_ONE" /> tab yang dipilih}other{Tutup <ph name="TABS_COUNT_MANY" /> tab yang dipilih}}</translation> <translation id="9150694013019234766">Beralih ke tab lain pada grup tab Anda di dekat bagian bawah layar</translation> <translation id="9169594135889675189">Tambahkan tab baru ke grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb index 04240ca..9d806e2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">提案を確認します。</translation> <translation id="7885132941432959125">タブを右に移動</translation> <translation id="7966321538264951561">提案を閉じます。</translation> +<translation id="8205266828577616993">タブを上に移動</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{選択した <ph name="TABS_COUNT_ONE" /> 個のタブを閉じます}other{選択した <ph name="TABS_COUNT_MANY" /> 個のタブを閉じます}}</translation> <translation id="9150694013019234766">画面下部にあるタブグループのタブを切り替えます</translation> <translation id="9169594135889675189">グループに新しいタブを追加</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb index 2603fa2..6f1e534 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">შემოთავაზებების გადახედვა.</translation> <translation id="7885132941432959125">ჩანართის მარჯვნივ გადატანა</translation> <translation id="7966321538264951561">შემოთავაზებების დახურვა.</translation> +<translation id="8205266828577616993">ჩანართის ზემოთ გადატანა</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> არჩეული ჩანართის დახურვა}other{<ph name="TABS_COUNT_MANY" /> არჩეული ჩანართის დახურვა}}</translation> <translation id="9150694013019234766">გადაერთეთ ჩანართებს შორის თქვენს ჩანართების ჯგუფში, ეკრანის ქვედა ნაწილში</translation> <translation id="9169594135889675189">ჯგუფში ახალი ჩანართის დამატება</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb index 8f6a22dc..60f97af 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Ұсыныстарды көріңіз.</translation> <translation id="7885132941432959125">Қойындыны оңға жылжыту</translation> <translation id="7966321538264951561">Ұсыныстарды қабылдамау.</translation> +<translation id="8205266828577616993">Қойындыны жоғары жылжыту</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Таңдалған <ph name="TABS_COUNT_ONE" /> қойындыны жабу}other{Таңдалған <ph name="TABS_COUNT_MANY" /> қойындыны жабу}}</translation> <translation id="9150694013019234766">Экранның төменгі жағындағы қойындылар тобында қойындылар арасында ауысуға болады.</translation> <translation id="9169594135889675189">Топқа жаңа қойынды енгізу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb index 0c93cd1..1391d650 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">ពិនិត្យមើលការណែនាំ។</translation> <translation id="7885132941432959125">ផ្លាស់ទីផ្ទាំងទៅខាងស្ដាំ</translation> <translation id="7966321538264951561">ច្រានចោលការណែនាំ។</translation> +<translation id="8205266828577616993">រំកិលផ្ទាំងឡើងលើ</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{បិទផ្ទាំងដែលបានជ្រើសរើស <ph name="TABS_COUNT_ONE" />}other{បិទផ្ទាំងដែលបានជ្រើសរើស <ph name="TABS_COUNT_MANY" />}}</translation> <translation id="9150694013019234766">ប្ដូររវាងផ្ទាំងនៅក្នុងក្រុមផ្ទាំងរបស់អ្នកនៅជិតផ្នែកខាងក្រោមបំផុតរបស់អេក្រង់</translation> <translation id="9169594135889675189">បញ្ចូលផ្ទាំងថ្មីទៅក្រុម</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb index 6cfe03f..bcd0068 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">추천을 검토합니다.</translation> <translation id="7885132941432959125">탭을 오른쪽으로 이동</translation> <translation id="7966321538264951561">추천을 닫습니다.</translation> +<translation id="8205266828577616993">탭을 위로 이동</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{선택된 탭 <ph name="TABS_COUNT_ONE" />개 닫기}other{선택된 탭 <ph name="TABS_COUNT_MANY" />개 닫기}}</translation> <translation id="9150694013019234766">화면 하단의 탭 그룹에서 탭 간 전환</translation> <translation id="9169594135889675189">그룹에 새 탭 추가</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb index 04567f6..2d90ab6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Сунуштарды карап чыгуу.</translation> <translation id="7885132941432959125">Өтмөктү оңго жылдыруу</translation> <translation id="7966321538264951561">Сунушту жабуу.</translation> +<translation id="8205266828577616993">Өтмөктү жогору жылдыруу</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Тандалган <ph name="TABS_COUNT_ONE" /> өтмөктү жабуу}other{Тандалган <ph name="TABS_COUNT_MANY" /> өтмөктү жабуу}}</translation> <translation id="9150694013019234766">Экраныңыздын ылдый жагында жайгашкан өтмөктөрдүн тобунан өтмөктөрүңүздү которуштуруңуз</translation> <translation id="9169594135889675189">Топко жаңы өтмөк кошуу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb index 593da37..24466f0 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">ກວດເບິ່ງການແນະນຳ.</translation> <translation id="7885132941432959125">ຍ້າຍແຖບໄປເບື້ອງຂວາ</translation> <translation id="7966321538264951561">ປິດການແນະນຳໄວ້.</translation> +<translation id="8205266828577616993">ຍ້າຍແຖບຂຶ້ນເທິງ</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{ປິດ <ph name="TABS_COUNT_ONE" /> ແຖບທີ່ເລືອກ}other{ປິດ <ph name="TABS_COUNT_MANY" /> ແຖບທີ່ເລືອກ}}</translation> <translation id="9150694013019234766">ປ່ຽນໄປມາລະຫວ່າງແຖບຕ່າງໆໃນກຸ່ມແຖບຂອງທ່ານຢູ່ໃກ້ລຸ່ມສຸດຂອງໜ້າຈໍ</translation> <translation id="9169594135889675189">ເພີ່ມແຖບໃໝ່ໃສ່ກຸ່ມ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb index c918423c..c29840d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Pārskatīt ieteikumus.</translation> <translation id="7885132941432959125">Pārvietot cilni pa labi</translation> <translation id="7966321538264951561">Nerādīt ieteikumus.</translation> +<translation id="8205266828577616993">Pārvietot cilni uz augšu</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Aizvērt atlasīto cilni (skaits: <ph name="TABS_COUNT_ONE" />)}zero{Aizvērt atlasītās cilnes (skaits: <ph name="TABS_COUNT_MANY" />)}one{Aizvērt atlasītās cilnes (skaits: <ph name="TABS_COUNT_MANY" />)}other{Aizvērt atlasītās cilnes (skaits: <ph name="TABS_COUNT_MANY" />)}}</translation> <translation id="9150694013019234766">Pārslēdziet cilnes savā ciļņu grupā ekrāna apakšdaļā.</translation> <translation id="9169594135889675189">Pievienot grupai jaunu cilni</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb index 645fae3..f3bbdf3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">നിർദ്ദേശങ്ങൾ അവലോകനം ചെയ്യുക.</translation> <translation id="7885132941432959125">ടാബ് വലത്തേക്ക് നീക്കുക</translation> <translation id="7966321538264951561">നിർദ്ദേശങ്ങൾ ഡിസ്മിസ് ചെയ്യുക.</translation> +<translation id="8205266828577616993">ടാബ് മുകളിലേക്ക് നീക്കുക</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{തിരഞ്ഞെടുത്ത <ph name="TABS_COUNT_ONE" /> ടാബ് അടയ്ക്കുക}other{തിരഞ്ഞെടുത്ത <ph name="TABS_COUNT_MANY" /> ടാബുകൾ അടയ്ക്കുക}}</translation> <translation id="9150694013019234766">സ്ക്രീനിന്റെ ചുവടെയുള്ള നിങ്ങളുടെ ടാബ് ഗ്രൂപ്പിലെ, ടാബുകൾക്കിടയിൽ മാറുക</translation> <translation id="9169594135889675189">ഗ്രൂപ്പിലേക്ക് പുതിയ ടാബ് ചേർക്കുക</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb index b381d758..b6d1c03 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Зөвлөмжийг шалгах.</translation> <translation id="7885132941432959125">Табыг баруун тийш зөөх</translation> <translation id="7966321538264951561">Зөвлөмжийг үл хэрэгсэх.</translation> +<translation id="8205266828577616993">Табыг дээш зөөх</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Сонгосон <ph name="TABS_COUNT_ONE" /> табыг хаах}other{Сонгосон <ph name="TABS_COUNT_MANY" /> табыг хаах}}</translation> <translation id="9150694013019234766">Дэлгэцийн доод хэсгийн ойролцоо байгаа табын бүлгээсээ таб хооронд сэлгэнэ үү</translation> <translation id="9169594135889675189">Бүлэгт шинэ таб нэмэх</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb index 9c01817..2e2c5e3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">सूचनांचे पुनरावलोकन करा.</translation> <translation id="7885132941432959125">टॅब उजवीकडे हलवा</translation> <translation id="7966321538264951561">सूचना डिसमिस करा.</translation> +<translation id="8205266828577616993">टॅब वर हलवा</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{निवडलेला <ph name="TABS_COUNT_ONE" /> टॅब बंद करा}other{निवडलेले <ph name="TABS_COUNT_MANY" /> टॅब बंद करा}}</translation> <translation id="9150694013019234766">स्क्रीनच्या तळाजवळ तुमच्या टॅब गटातील टॅब दरम्यान स्विच करा</translation> <translation id="9169594135889675189">गटामध्ये नवीन टॅब जोडा</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb index ed4b06d..834bf2d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Gjennomgå forslagene.</translation> <translation id="7885132941432959125">Flytt fanen mot høyre</translation> <translation id="7966321538264951561">Avvis forslagene.</translation> +<translation id="8205266828577616993">Flytt fanen oppover</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Lukk <ph name="TABS_COUNT_ONE" /> valgt fane}other{Lukk <ph name="TABS_COUNT_MANY" /> valgte faner}}</translation> <translation id="9150694013019234766">Bytt mellom faner i fanegruppen på nedre del av skjermen</translation> <translation id="9169594135889675189">Legg til ny fane i gruppen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb index 7a7ae5692..00ee1cc 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">ਸੁਝਾਵਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ।</translation> <translation id="7885132941432959125">ਟੈਬ ਨੂੰ ਸੱਜੇ ਲਿਜਾਓ</translation> <translation id="7966321538264951561">ਸੁਝਾਵਾਂ ਨੂੰ ਖਾਰਜ ਕਰੋ।</translation> +<translation id="8205266828577616993">ਟੈਬ ਨੂੰ ਉੱਪਰ ਲਿਜਾਓ</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{ਚੁਣੀ ਹੋਈ <ph name="TABS_COUNT_ONE" /> ਟੈਬ ਬੰਦ ਕਰੋ}one{ਚੁਣੀ ਹੋਈ <ph name="TABS_COUNT_MANY" /> ਟੈਬ ਬੰਦ ਕਰੋ}other{ਚੁਣੀਆਂ ਹੋਈਆਂ <ph name="TABS_COUNT_MANY" /> ਟੈਬਾਂ ਬੰਦ ਕਰੋ}}</translation> <translation id="9150694013019234766">ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਪਾਸੇ ਆਪਣੇ ਟੈਬ ਗਰੁੱਪ ਵਿੱਚ ਟੈਬਾਂ ਦੀ ਅਦਲਾ-ਬਦਲੀ ਕਰੋ</translation> <translation id="9169594135889675189">ਗਰੁੱਪ ਵਿੱਚ ਨਵੀਂ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb index b15a1bd..efc5e68 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Examinează sugestiile.</translation> <translation id="7885132941432959125">Mută fila spre dreapta</translation> <translation id="7966321538264951561">Închide sugestiile.</translation> +<translation id="8205266828577616993">Mută fila mai sus</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Închide <ph name="TABS_COUNT_ONE" /> filă selectată}few{Închide <ph name="TABS_COUNT_MANY" /> file selectate}other{Închide <ph name="TABS_COUNT_MANY" /> de file selectate}}</translation> <translation id="9150694013019234766">Comută între filele din grupul de file în partea de jos a ecranului</translation> <translation id="9169594135889675189">Adaugă o filă nouă în grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb index 30119da..4058aea1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Подробнее.</translation> <translation id="7885132941432959125">Переместить вкладку вправо</translation> <translation id="7966321538264951561">Скрыть подсказки.</translation> +<translation id="8205266828577616993">Переместить вкладку вверх</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Закрыть <ph name="TABS_COUNT_ONE" /> выбранную вкладку}one{Закрыть <ph name="TABS_COUNT_MANY" /> выбранную вкладку}few{Закрыть <ph name="TABS_COUNT_MANY" /> выбранные вкладки}many{Закрыть <ph name="TABS_COUNT_MANY" /> выбранных вкладок}other{Закрыть <ph name="TABS_COUNT_MANY" /> выбранной вкладки}}</translation> <translation id="9150694013019234766">В нижней части экрана можно переключаться между вкладками, объединенными в группы</translation> <translation id="9169594135889675189">Добавить новую вкладку в группу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb index 72f0c65..d44c098 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Prezrieť návrhy.</translation> <translation id="7885132941432959125">Presunúť kartu doprava</translation> <translation id="7966321538264951561">Zavrieť návrhy.</translation> +<translation id="8205266828577616993">Presunúť kartu nahor</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Zavrieť <ph name="TABS_COUNT_ONE" /> vybranú kartu}few{Zavrieť <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Close <ph name="TABS_COUNT_MANY" /> selected tabs}other{Zavrieť <ph name="TABS_COUNT_MANY" /> vybraných kariet}}</translation> <translation id="9150694013019234766">Prepínajte karty v skupine kariet v dolnej časti obrazovky</translation> <translation id="9169594135889675189">Pridať novú kartu do skupiny</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb index f73ae3e..067ce8b3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Rishiko sugjerimet.</translation> <translation id="7885132941432959125">Lëviz skedën djathtas</translation> <translation id="7966321538264951561">Largo sugjerimet.</translation> +<translation id="8205266828577616993">Lëviz skedën lart</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Mbyll <ph name="TABS_COUNT_ONE" /> skedë të zgjedhur}other{Mbyll <ph name="TABS_COUNT_MANY" /> skeda të zgjedhura}}</translation> <translation id="9150694013019234766">Kalo mes skedave në grupin e skedave pranë fundit të ekranit</translation> <translation id="9169594135889675189">Shto skedë të re te grupi</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb index 5d017d27..1575c8fc 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Soma mapendekezo.</translation> <translation id="7885132941432959125">Sogeza kichupo kulia</translation> <translation id="7966321538264951561">Ondoa mapendekezo.</translation> +<translation id="8205266828577616993">Sogeza kichupo juu</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Funga kichupo <ph name="TABS_COUNT_ONE" /> ulichochagua}other{Funga vichupo <ph name="TABS_COUNT_MANY" /> ulivyochagua}}</translation> <translation id="9150694013019234766">Badili kati ya vichupo vilivyo katika kikundi chako cha vichupo karibu na sehemu ya chini ya skrini</translation> <translation id="9169594135889675189">Ongeza kichupo kipya kwenye kikundi</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb index 8552e7ed..b0dd7e4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">ดูคำแนะนำ</translation> <translation id="7885132941432959125">ย้ายแท็บไปทางขวา</translation> <translation id="7966321538264951561">ปิดคำแนะนำ</translation> +<translation id="8205266828577616993">เลื่อนแท็บขึ้น</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{ปิดแท็บที่เลือก <ph name="TABS_COUNT_ONE" /> แท็บ}other{ปิดแท็บที่เลือก <ph name="TABS_COUNT_MANY" /> แท็บ}}</translation> <translation id="9150694013019234766">สลับไปมาระหว่างแท็บในกลุ่มแท็บบริเวณด้านล่างของหน้าจอ</translation> <translation id="9169594135889675189">เพิ่มแท็บใหม่ลงในกลุ่ม</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb index 7c6b565f..399e5e5e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Önerileri inceleyin.</translation> <translation id="7885132941432959125">Sekmeyi sağa taşı</translation> <translation id="7966321538264951561">Önerileri kapat.</translation> +<translation id="8205266828577616993">Sekmeyi yukarı taşı</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Seçilen <ph name="TABS_COUNT_ONE" /> sekmeyi kapat}other{Seçilen <ph name="TABS_COUNT_MANY" /> sekmeyi kapat}}</translation> <translation id="9150694013019234766">Ekranın altına yakın bir yerde bulunan sekme grubunuzdaki sekmeler arasında geçiş yapın</translation> <translation id="9169594135889675189">Gruba yeni sekme ekler</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb index da2629bf..93286b8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">تجاویز کا جائزہ لیں۔</translation> <translation id="7885132941432959125">ٹیب کو دائیں منتقل کریں</translation> <translation id="7966321538264951561">تجاویز مسترد کریں۔</translation> +<translation id="8205266828577616993">ٹیب اوپر منتقل کریں</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> منتخب کردہ ٹیب بند کریں}other{<ph name="TABS_COUNT_MANY" /> منتخب کردہ ٹیبز بند کریں}}</translation> <translation id="9150694013019234766">اسکرین کے نچلے حصے کے قریب ٹیبز کے اپنے گروپ میں ٹیبز کے درمیان سوئچ کریں</translation> <translation id="9169594135889675189">گروپ میں نیا ٹیب شامل کریں</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb index 0617a08..e7634e5 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">Xem lại các đề xuất.</translation> <translation id="7885132941432959125">Chuyển tab sang phải</translation> <translation id="7966321538264951561">Đóng nội dung đề xuất.</translation> +<translation id="8205266828577616993">Chuyển tab lên trên</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Đóng <ph name="TABS_COUNT_ONE" /> tab đã chọn}other{Đóng <ph name="TABS_COUNT_MANY" /> tab đã chọn}}</translation> <translation id="9150694013019234766">Chuyển đổi giữa các tab trong nhóm tab ở gần cuối màn hình</translation> <translation id="9169594135889675189">Thêm tab mới vào nhóm</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb index 3ba2eb8f..1a94cfb9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">查看建议。</translation> <translation id="7885132941432959125">右移标签页</translation> <translation id="7966321538264951561">忽略此建议。</translation> +<translation id="8205266828577616993">上移标签页</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{关闭 <ph name="TABS_COUNT_ONE" /> 个所选标签页}other{关闭 <ph name="TABS_COUNT_MANY" /> 个所选标签页}}</translation> <translation id="9150694013019234766">在屏幕底部附近的标签页组中切换标签页</translation> <translation id="9169594135889675189">向组中添加新标签页</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb index f04ed13..1a6ab4b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">睇下建議。</translation> <translation id="7885132941432959125">移去右邊</translation> <translation id="7966321538264951561">閂建議。</translation> +<translation id="8205266828577616993">將分頁上移</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{閂 <ph name="TABS_COUNT_ONE" /> 個揀咗嘅分頁}other{閂 <ph name="TABS_COUNT_MANY" /> 個揀咗嘅分頁}}</translation> <translation id="9150694013019234766">喺接近畫面底部附近嘅分頁群組入面切換分頁</translation> <translation id="9169594135889675189">喺群組入面加新嘅分頁</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb index b0cd5b6..5f3a432 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
@@ -29,6 +29,7 @@ <translation id="7792771145871471484">查看建議項目。</translation> <translation id="7885132941432959125">將分頁向右移</translation> <translation id="7966321538264951561">關閉建議項目。</translation> +<translation id="8205266828577616993">將分頁上移</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{關閉 <ph name="TABS_COUNT_ONE" /> 個所選分頁}other{關閉 <ph name="TABS_COUNT_MANY" /> 個所選分頁}}</translation> <translation id="9150694013019234766">在靠近畫面底部的分頁群組中切換分頁</translation> <translation id="9169594135889675189">在群組中新增分頁</translation>
diff --git a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrWindowAndroid.java b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrWindowAndroid.java index 99dd4fef..87e7176 100644 --- a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrWindowAndroid.java +++ b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrWindowAndroid.java
@@ -6,7 +6,6 @@ import android.app.Activity; import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Process; @@ -16,10 +15,12 @@ import org.chromium.base.ApplicationStatus; import org.chromium.base.Callback; import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.ChromeActivity; import org.chromium.ui.base.AndroidPermissionDelegate; import org.chromium.ui.base.PermissionCallback; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.display.DisplayAndroid; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.lang.ref.WeakReference; import java.util.Arrays; @@ -30,12 +31,8 @@ */ public class VrWindowAndroid extends WindowAndroid implements ApplicationStatus.ActivityStateListener { - public VrWindowAndroid(Context context, DisplayAndroid display) { - super(context, display); - Activity activity = ContextUtils.activityFromContext(context); - if (activity == null) { - throw new IllegalArgumentException("Context is not and does not wrap an Activity"); - } + public VrWindowAndroid(ChromeActivity activity, DisplayAndroid display) { + super(activity, display); ApplicationStatus.registerStateListenerForActivity(this, activity); setAndroidPermissionDelegate(new ActivityAndroidPermissionDelegate()); } @@ -75,6 +72,13 @@ } } + @Override + public ModalDialogManager getModalDialogManager() { + // TODO(estade): consider replacing null check with an assert. + ChromeActivity activity = (ChromeActivity) getActivity().get(); + return activity == null ? null : activity.getModalDialogManager(); + } + // We can't request permissions inside of VR without getting kicked out of VR. // TODO(mthiesse): Should we add some UI to ask the user to exit VR, then accept the permission? // There's also the possibility that GVR will handle this in the future.
diff --git a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected index a5e9291..60008aeb 100644 --- a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected +++ b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
@@ -1324,6 +1324,12 @@ android:resource="@xml/file_paths"/> </provider> <provider + android:authorities="org.chromium.chrome.FlagOverrideContentProvider" + android:enabled="false" + android:exported="true" + android:name="org.chromium.android_webview.services.FlagOverrideContentProvider" + android:process=":webview_service"/> + <provider android:authorities="org.chromium.chrome.LicenseContentProvider" android:exported="true" android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider" @@ -1490,11 +1496,6 @@ android:name="org.chromium.chrome.browser.photo_picker.DecoderService" android:process=":decoder_service"/> <service - android:enabled="false" - android:exported="true" - android:name="org.chromium.android_webview.services.DeveloperUiService" - android:process=":webview_service"/> - <service android:exported="false" android:isolatedProcess="false" android:name="org.chromium.content.app.PrivilegedProcessService0" @@ -1550,6 +1551,10 @@ android:process=":webview_service"/> <service android:exported="false" + android:name="org.chromium.android_webview.services.DeveloperUiService" + android:process=":webview_service"/> + <service + android:exported="false" android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS"/> <service
diff --git a/chrome/android/java/res/layout/add_site_dialog.xml b/chrome/android/java/res/layout/add_site_dialog.xml index f95cce3..c51c6a3 100644 --- a/chrome/android/java/res/layout/add_site_dialog.xml +++ b/chrome/android/java/res/layout/add_site_dialog.xml
@@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/website_settings_add_site_site_url" /> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/site" android:layout_width="match_parent" android:layout_height="wrap_content"
diff --git a/chrome/android/java/res/layout/add_to_homescreen_dialog.xml b/chrome/android/java/res/layout/add_to_homescreen_dialog.xml index e14dddc3..ddf8b3e 100644 --- a/chrome/android/java/res/layout/add_to_homescreen_dialog.xml +++ b/chrome/android/java/res/layout/add_to_homescreen_dialog.xml
@@ -27,7 +27,7 @@ android:layout_marginTop="10dp" /> <!-- An editable text field for the name of the home screen icon. --> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/text" android:inputType="text" android:layout_width="match_parent"
diff --git a/chrome/android/java/res/layout/http_auth_dialog.xml b/chrome/android/java/res/layout/http_auth_dialog.xml index 1136199..7842ad1 100644 --- a/chrome/android/java/res/layout/http_auth_dialog.xml +++ b/chrome/android/java/res/layout/http_auth_dialog.xml
@@ -21,7 +21,7 @@ android:id="@+id/username_label" android:layout_width="match_parent" android:layout_height="wrap_content" > - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -35,7 +35,7 @@ android:id="@+id/password_label" android:layout_width="match_parent" android:layout_height="wrap_content" > - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content"
diff --git a/chrome/android/java/res/layout/sync_custom_passphrase.xml b/chrome/android/java/res/layout/sync_custom_passphrase.xml index c88dfd6..f1d6f2ad 100644 --- a/chrome/android/java/res/layout/sync_custom_passphrase.xml +++ b/chrome/android/java/res/layout/sync_custom_passphrase.xml
@@ -11,7 +11,7 @@ <LinearLayout android:orientation="vertical" style="@style/AlertDialogContent"> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/passphrase" android:hint="@string/sync_enter_custom_passphrase_hint" android:layout_width="match_parent" @@ -19,7 +19,7 @@ android:inputType="textPassword" android:singleLine="true" android:imeOptions="actionNext" /> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/confirm_passphrase" android:hint="@string/sync_enter_custom_passphrase_hint_confirm" android:layout_width="match_parent"
diff --git a/chrome/android/java/res/layout/sync_enter_passphrase.xml b/chrome/android/java/res/layout/sync_enter_passphrase.xml index 060db77..af549ed 100644 --- a/chrome/android/java/res/layout/sync_enter_passphrase.xml +++ b/chrome/android/java/res/layout/sync_enter_passphrase.xml
@@ -16,7 +16,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="25dp" /> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/passphrase" android:layout_width="match_parent" android:layout_height="wrap_content"
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index 2644865..4cdf821 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -58,7 +58,7 @@ <dimen name="tab_switcher_menu_width">222dp</dimen> <dimen name="tab_switcher_menu_vertical_padding">8dp</dimen> - <dimen name="menu_badge_translation_y_distance">6dp</dimen> + <dimen name="menu_badge_translation_y">6dp</dimen> <!-- Infobar dimensions --> <!-- Text size of the infobar message and other controls. -->
diff --git a/chrome/android/java/res_download/layout/download_location_dialog.xml b/chrome/android/java/res_download/layout/download_location_dialog.xml index efd2769..c05e055 100644 --- a/chrome/android/java/res_download/layout/download_location_dialog.xml +++ b/chrome/android/java/res_download/layout/download_location_dialog.xml
@@ -35,7 +35,7 @@ app:tint="@color/default_icon_color" style="@style/ListItemStartIcon" /> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/file_name" android:layout_width="match_parent" android:layout_height="wrap_content"
diff --git a/chrome/android/java/res_download/layout/download_rename_custom_dialog.xml b/chrome/android/java/res_download/layout/download_rename_custom_dialog.xml index 035fddb..2e249523 100644 --- a/chrome/android/java/res_download/layout/download_rename_custom_dialog.xml +++ b/chrome/android/java/res_download/layout/download_rename_custom_dialog.xml
@@ -15,7 +15,7 @@ android:layout_height="wrap_content" style="@style/AlertDialogContent"> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/file_name" android:layout_width="match_parent" android:layout_height="48dp"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index 6075076..9bf3099 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -87,7 +87,6 @@ import org.chromium.chrome.browser.flags.ActivityType; import org.chromium.chrome.browser.flags.FeatureUtilities; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; -import org.chromium.chrome.browser.fullscreen.ComposedBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.gsa.ContextReporter; import org.chromium.chrome.browser.gsa.GSAAccountChangeListener; import org.chromium.chrome.browser.gsa.GSAState; @@ -106,7 +105,6 @@ import org.chromium.chrome.browser.metrics.UmaSessionStats; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.nfc.BeamController; -import org.chromium.chrome.browser.night_mode.NightModeReparentingController; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; @@ -131,13 +129,11 @@ import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.SyncController; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabHidingType; import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.tab.TabState; -import org.chromium.chrome.browser.tab_activity_glue.ReparentingDelegateFactory; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.EmptyTabModel; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; @@ -324,9 +320,6 @@ private List<MenuOrKeyboardActionController.MenuOrKeyboardActionHandler> mMenuActionHandlers = new ArrayList<>(); - /** Controls tab reparenting for night mode. */ - NightModeReparentingController mNightModeReparentingController; - @Override protected ActivityWindowAndroid createWindowAndroid() { return new ChromeWindow(this); @@ -363,11 +356,6 @@ } getWindow().setBackgroundDrawable(getBackgroundDrawable()); - - mNightModeReparentingController = new NightModeReparentingController( - ReparentingDelegateFactory.createNightModeReparentingControllerDelegate(this), - ReparentingDelegateFactory.createReparentingTaskDelegate(this)); - getLifecycleDispatcher().register(mNightModeReparentingController); } protected RootUiCoordinator createRootUiCoordinator() { @@ -1557,11 +1545,6 @@ return mActivityTabProvider; } - public TabDelegateFactory getTabDelegateFactory() { - return new TabbedModeTabDelegateFactory( - this, new ComposedBrowserControlsVisibilityDelegate(), getShareDelegateSupplier()); - } - /** * Returns the {@link InsetObserverView} that has the current system window * insets information. @@ -2421,16 +2404,4 @@ public RootUiCoordinator getRootUiCoordinatorForTesting() { return mRootUiCoordinator; } - - // NightModeStateProvider.Observer implementation. - @Override - public void onNightModeStateChanged() { - // Note: order matters here because the call to super will recreate the activity. - // Note: it's possible for this method to be called before mNightModeReparentingController - // is constructed. - if (mNightModeReparentingController != null) { - mNightModeReparentingController.onNightModeStateChanged(); - } - super.onNightModeStateChanged(); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 08c2817..5db2a3b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -252,6 +252,7 @@ public static final String GRANT_NOTIFICATIONS_TO_DSE = "GrantNotificationsToDSE"; public static final String HANDLE_MEDIA_INTENTS = "HandleMediaIntents"; public static final String HOMEPAGE_LOCATION_POLICY = "HomepageLocationPolicy"; + public static final String HOMEPAGE_SETTINGS_UI_CONVERSION = "HomepageSettingsUIConversion"; public static final String HORIZONTAL_TAB_SWITCHER_ANDROID = "HorizontalTabSwitcherAndroid"; public static final String IMMERSIVE_UI_MODE = "ImmersiveUiMode"; public static final String IMPROVED_COOKIE_CONTROLS_FOR_THIRD_PARTY_COOKIE_BLOCKING =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java index 9ec59f3..fd25352 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java
@@ -17,6 +17,7 @@ import org.chromium.ui.base.ActivityAndroidPermissionDelegate; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.lang.ref.WeakReference; @@ -54,6 +55,13 @@ } @Override + public ModalDialogManager getModalDialogManager() { + // TODO(estade): consider replacing null check with an assert. + ChromeActivity activity = (ChromeActivity) getActivity().get(); + return activity == null ? null : activity.getModalDialogManager(); + } + + @Override protected ActivityAndroidPermissionDelegate createAndroidPermissionDelegate() { return new ActivityAndroidPermissionDelegate(getActivity()) { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java index 4f8f189f..ac5218b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java
@@ -151,7 +151,6 @@ if (mDelegate != null) mDelegate.removeUIObserver(this); } - // TODO(lazzzis): try to clean up reference to mLocation if position. private ModelList getItems() { // Rebuild listItems, cause mLocation may be changed anytime. boolean canMove = false; @@ -310,4 +309,4 @@ super.onClick(view); } } -} \ No newline at end of file +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java index a530247..adaebee7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -25,10 +25,6 @@ //========================================================================================== // Public settings synchronized with src/components/contextual_search/core/browser/public.cc //========================================================================================== - public static final String LONGPRESS_RESOLVE_PARAM_NAME = "longpress_resolve_variation"; - public static final String LONGPRESS_RESOLVE_PRESERVE_TAP = "3"; - - //========================================================================================== private static final String FIELD_TRIAL_NAME = "ContextualSearch"; private static final String DISABLED_PARAM = "disabled"; private static final String ENABLED_VALUE = "true";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index 05887c5..b7e86aa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -112,8 +112,6 @@ * @return Whether a Tap gesture is currently supported as a trigger for the feature. */ boolean isTapSupported() { - if (isTapDisabledDueToLongpress()) return false; - return (!isUserUndecided() || ContextualSearchFieldTrial.getSwitch( ContextualSearchSwitch @@ -256,15 +254,6 @@ && (selectionType == SelectionType.LONG_PRESS || !shouldPreviousGestureResolve())); } - /** @return whether Tap is disabled due to the longpress experiment. */ - private boolean isTapDisabledDueToLongpress() { - return ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE) - && !ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRESERVE_TAP.equals( - ChromeFeatureList.getFieldTrialParamByFeature( - ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE, - ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PARAM_NAME)); - } - /** * Determines whether an error from a search term resolution request should * be shown to the user, or not.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java index d4025d4..abc4e2a9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -4,8 +4,10 @@ package org.chromium.chrome.browser.customtabs; +import android.util.Pair; import android.view.KeyEvent; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.chrome.R; @@ -13,12 +15,17 @@ import org.chromium.chrome.browser.KeyboardShortcuts; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController; +import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider; import org.chromium.chrome.browser.customtabs.content.TabCreationMode; import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityComponent; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator; import org.chromium.chrome.browser.dependency_injection.ChromeActivityComponent; +import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabState; +import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.ui.RootUiCoordinator; /** @@ -33,6 +40,7 @@ protected CustomTabActivityNavigationController mNavigationController; protected CustomTabActivityTabProvider mTabProvider; protected CustomTabStatusBarColorProvider mStatusBarColorProvider; + protected CustomTabActivityTabFactory mTabFactory; // This is to give the right package name while using the client's resources during an // overridePendingTransition call. @@ -60,12 +68,40 @@ mNavigationController = component.resolveNavigationController(); mTabProvider = component.resolveTabProvider(); mStatusBarColorProvider = component.resolveCustomTabStatusBarColorProvider(); + mTabFactory = component.resolveTabFactory(); component.resolveCompositorContentInitializer(); component.resolveTaskDescriptionHelper(); } @Override + protected TabModelSelector createTabModelSelector() { + return mTabFactory.createTabModelSelector(); + } + + @Override + protected Pair<ChromeTabCreator, ChromeTabCreator> createTabCreators() { + return mTabFactory.createTabCreators(); + } + + @Override + public void initializeCompositor() { + super.initializeCompositor(); + getTabModelSelector().onNativeLibraryReady(getTabContentManager()); + } + + @Override + public TabModelSelectorImpl getTabModelSelector() { + return (TabModelSelectorImpl) super.getTabModelSelector(); + } + + @Override + @Nullable + public Tab getActivityTab() { + return mTabProvider.getTab(); + } + + @Override protected int getControlContainerLayoutId() { return R.layout.custom_tabs_control_container; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index c1564ea..03d8074 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -18,7 +18,6 @@ import android.net.Uri; import android.os.Bundle; import android.provider.Browser; -import android.util.Pair; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -38,7 +37,6 @@ import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController; -import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider; import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler; import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.IntentIgnoringCriterion; @@ -58,9 +56,6 @@ import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabImpl; -import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; import org.chromium.chrome.browser.usage_stats.UsageStatsService; import org.chromium.chrome.browser.util.IntentUtils; @@ -74,7 +69,6 @@ private CustomTabIntentDataProvider mIntentDataProvider; private CustomTabsSessionToken mSession; private CustomTabActivityTabController mTabController; - private CustomTabActivityTabFactory mTabFactory; private CustomTabIntentHandler mCustomTabIntentHandler; private final CustomTabsConnection mConnection = CustomTabsConnection.getInstance(); @@ -190,16 +184,6 @@ } @Override - protected TabModelSelector createTabModelSelector() { - return mTabFactory.createTabModelSelector(); - } - - @Override - protected Pair<ChromeTabCreator, ChromeTabCreator> createTabCreators() { - return mTabFactory.createTabCreators(); - } - - @Override protected NightModeStateProvider createNightModeStateProvider() { // This is called before Dagger component is created, so using getInstance() directly. mNightModeStateController = new CustomTabNightModeStateController(getLifecycleDispatcher(), @@ -266,29 +250,12 @@ } @Override - public void initializeCompositor() { - super.initializeCompositor(); - getTabModelSelector().onNativeLibraryReady(getTabContentManager()); - } - - @Override public void createContextualSearchTab(String searchUrl) { if (getActivityTab() == null) return; getActivityTab().loadUrl(new LoadUrlParams(searchUrl)); } @Override - public TabModelSelectorImpl getTabModelSelector() { - return (TabModelSelectorImpl) super.getTabModelSelector(); - } - - @Override - @Nullable - public Tab getActivityTab() { - return mTabProvider.getTab(); - } - - @Override public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), @@ -473,7 +440,6 @@ onComponentCreated(component); mTabController = component.resolveTabController(); - mTabFactory = component.resolveTabFactory(); component.resolveUmaTracker(); CustomTabActivityClientConnectionKeeper connectionKeeper = component.resolveConnectionKeeper();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java index b2480c0d..c2b1d2e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java
@@ -276,7 +276,8 @@ * @param activity The activity whose tab IDs are to be collected from. * @param tabIds Where the tab IDs should be added to. */ - private static void getAllTabIdsForActivity(CustomTabActivity activity, Set<Integer> tabIds) { + private static void getAllTabIdsForActivity( + BaseCustomTabActivity activity, Set<Integer> tabIds) { if (activity == null) return; TabModelSelector selector = activity.getTabModelSelector(); if (selector == null) return; @@ -300,8 +301,8 @@ ThreadUtils.assertOnUiThread(); for (Activity activity : ApplicationStatus.getRunningActivities()) { - if (!(activity instanceof CustomTabActivity)) continue; - getAllTabIdsForActivity((CustomTabActivity) activity, liveTabIds); + if (!(activity instanceof BaseCustomTabActivity)) continue; + getAllTabIdsForActivity((BaseCustomTabActivity) activity, liveTabIds); liveTaskIds.add(activity.getTaskId()); } } @@ -389,7 +390,8 @@ try { int taskId = Integer.parseInt(id); - // Ignore the metadata file if it belongs to a currently live CustomTabActivity. + // Ignore the metadata file if it belongs to a currently live + // BaseCustomTabActivity. if (liveTaskIds.contains(taskId)) continue; filesToDelete.add(metadataFile.getName());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/HiddenTabHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/HiddenTabHolder.java index d27040d..cffd28e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/HiddenTabHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/HiddenTabHolder.java
@@ -127,7 +127,7 @@ int width = bounds.right - bounds.left; int height = bounds.bottom - bounds.top; tab.getWebContents().setSize(width, height); - ReparentingTask.from(tab).detach(); + ReparentingTask.detach(tab); return tab; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java index 917cc396..f8da609 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java
@@ -46,7 +46,6 @@ import org.chromium.chrome.browser.tab.TabAssociatedApp; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabRedirectHandler; -import org.chromium.chrome.browser.tab_activity_glue.ReparentingDelegateFactory; import org.chromium.chrome.browser.tabmodel.AsyncTabParams; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -317,8 +316,7 @@ if (mode == TabCreationMode.HIDDEN) { TabReparentingParams params = (TabReparentingParams) AsyncTabParamsManager.remove(tab.getId()); - mReparentingTaskProvider.get(tab).finish( - ReparentingDelegateFactory.createReparentingTaskDelegate(mActivity), + mReparentingTaskProvider.get(tab).finish(mActivity, mCustomTabDelegateFactory.get(), (params == null ? null : params.getFinalizeCallback())); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabFactory.java index 65edad5..9ec8821 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabFactory.java
@@ -24,6 +24,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.util.IntentUtils; +import org.chromium.chrome.browser.webapps.WebappActivity; +import org.chromium.chrome.browser.webapps.WebappTabDelegate; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.ActivityWindowAndroid; @@ -42,6 +44,8 @@ private final Lazy<ActivityWindowAndroid> mActivityWindowAndroid; private final Lazy<CustomTabDelegateFactory> mCustomTabDelegateFactory; private final BrowserServicesIntentDataProvider mIntentDataProvider; + + @Nullable private final StartupTabPreloader mStartupTabPreloader; @Nullable @@ -53,7 +57,7 @@ Lazy<ActivityWindowAndroid> activityWindowAndroid, Lazy<CustomTabDelegateFactory> customTabDelegateFactory, BrowserServicesIntentDataProvider intentDataProvider, - StartupTabPreloader startupTabPreloader) { + @Nullable StartupTabPreloader startupTabPreloader) { mActivity = activity; mPersistencePolicy = persistencePolicy; mActivityWindowAndroid = activityWindowAndroid; @@ -84,6 +88,10 @@ } private ChromeTabCreator createTabCreator(boolean incognito) { + if (mIntentDataProvider.getWebappExtras() != null) { + return new WebappTabDelegate((WebappActivity) mActivity, mActivityWindowAndroid.get(), + mStartupTabPreloader, mCustomTabDelegateFactory::get, incognito); + } return new ChromeTabCreator(mActivity, mActivityWindowAndroid.get(), mStartupTabPreloader, mCustomTabDelegateFactory::get, incognito) { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java index 503d296..4e4a30ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java
@@ -9,6 +9,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider; import org.chromium.chrome.browser.customtabs.CustomTabTaskDescriptionHelper; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController; +import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider; import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator; @@ -21,6 +22,7 @@ */ public interface BaseCustomTabActivityComponent extends ChromeActivityComponent { CustomTabActivityNavigationController resolveNavigationController(); + CustomTabActivityTabFactory resolveTabFactory(); CustomTabActivityTabProvider resolveTabProvider(); CustomTabCompositorContentInitializer resolveCompositorContentInitializer(); CustomTabDelegateFactory resolveTabDelegateFactory();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java index 32abdcf2..4205217 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
@@ -15,7 +15,6 @@ import org.chromium.chrome.browser.customtabs.CustomTabUmaRecorder; import org.chromium.chrome.browser.customtabs.ReparentingTaskProvider; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController; -import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory; import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler; import org.chromium.chrome.browser.customtabs.dynamicmodule.DynamicModuleCoordinator; import org.chromium.chrome.browser.customtabs.dynamicmodule.DynamicModuleToolbarController; @@ -39,7 +38,6 @@ CustomTabBottomBarDelegate resolveBottomBarDelegate(); CustomTabActivityTabController resolveTabController(); - CustomTabActivityTabFactory resolveTabFactory(); CustomTabActivityLifecycleUmaTracker resolveUmaTracker(); CustomTabIntentHandler resolveIntentHandler(); CustomTabIncognitoManager resolveCustomTabIncognitoManager();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java index 8288d3b..13b6e1fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java
@@ -19,8 +19,8 @@ import androidx.annotation.Nullable; import org.chromium.chrome.browser.settings.download.DownloadDirectoryAdapter; -import org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText; import org.chromium.chrome.download.R; +import org.chromium.components.browser_ui.widget.text.AlertDialogEditText; import java.io.File;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/rename/RenameDialogCustomView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/rename/RenameDialogCustomView.java index 4770524..f8243b0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/rename/RenameDialogCustomView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/rename/RenameDialogCustomView.java
@@ -19,8 +19,8 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText; import org.chromium.chrome.download.R; +import org.chromium.components.browser_ui.widget.text.AlertDialogEditText; import org.chromium.components.offline_items_collection.RenameResult; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java index af7e75f..a7973ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialog.java
@@ -4,10 +4,12 @@ package org.chromium.chrome.browser.jsdialog; +import android.content.Context; + import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.components.app_modal.JavascriptModalDialog; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; @@ -46,9 +48,11 @@ @CalledByNative private void showDialog(WindowAndroid window, long nativeDialogPointer) { assert window != null; - ChromeActivity activity = (ChromeActivity) window.getActivity().get(); - // If the activity has gone away, then just clean up the native pointer. - if (activity == null) { + Context context = window.getContext().get(); + ModalDialogManager dialogManager = window.getModalDialogManager(); + // If the context has gone away, then just clean up the native pointer. + // TODO(estade): consider changing null checks to an assert. + if (context == null || dialogManager == null) { JavascriptTabModalDialogJni.get().cancel( nativeDialogPointer, JavascriptTabModalDialog.this, false); return; @@ -56,7 +60,7 @@ // Cache the native dialog pointer so that we can use it to return the response. mNativeDialogPointer = nativeDialogPointer; - show(activity, ModalDialogManager.ModalDialogType.TAB); + show(context, dialogManager, ModalDialogManager.ModalDialogType.TAB); } @CalledByNative
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeReparentingController.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeReparentingController.java deleted file mode 100644 index 1b75029..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeReparentingController.java +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.night_mode; - -import android.util.SparseArray; - -import androidx.annotation.NonNull; - -import org.chromium.chrome.browser.ActivityTabProvider; -import org.chromium.chrome.browser.lifecycle.StartStopWithNativeObserver; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabLaunchType; -import org.chromium.chrome.browser.tab_activity_glue.ReparentingTask; -import org.chromium.chrome.browser.tabmodel.AsyncTabParams; -import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; -import org.chromium.chrome.browser.tabmodel.TabModel; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabReparentingParams; - -// TODO(wylieb): Write unittests for this class. -/** Controls the reparenting of tabs when the theme is swapped. */ -public class NightModeReparentingController - implements StartStopWithNativeObserver, NightModeStateProvider.Observer { - /** Provides data to {@link NightModeReparentingController} facilitate reparenting tabs. */ - public interface Delegate { - /** The current ActivityTabProvider which is used to get the current Tab. */ - ActivityTabProvider getActivityTabProvider(); - - /** Gets a {@link TabModelSelector} which is used to add the tab. */ - TabModelSelector getTabModelSelector(); - } - - private Delegate mDelegate; - private ReparentingTask.Delegate mReparentingDelegate; - - /** Constructs a {@link NightModeReparentingController} with the given delegate. */ - public NightModeReparentingController( - @NonNull Delegate delegate, @NonNull ReparentingTask.Delegate reparentingDelegate) { - mDelegate = delegate; - mReparentingDelegate = reparentingDelegate; - } - - @Override - public void onStartWithNative() { - // Note: for now only the current tab is added to the AsyncTabParamsManager when the theme - // is changed. In the future these will be added in tab index order and read at reverse - // tab index order. - final SparseArray<AsyncTabParams> paramsArray = AsyncTabParamsManager.getAsyncTabParams(); - for (int i = 0; i < paramsArray.size(); i++) { - final int tabId = paramsArray.keyAt(i); - AsyncTabParams params = paramsArray.get(tabId); - if (!(params instanceof TabReparentingParams)) continue; - if (params == null) continue; - - final TabReparentingParams reparentingParams = (TabReparentingParams) params; - if (!reparentingParams.isFromNightModeReparenting()) continue; - if (!reparentingParams.hasTabToReparent()) continue; - if (!reparentingParams.hasTabIndex()) continue; - - final ReparentingTask reparentingTask = - ReparentingTask.get(reparentingParams.getTabToReparent()); - if (reparentingTask == null) continue; - reparentingTask.finish(mReparentingDelegate, () -> { - mDelegate.getTabModelSelector().getCurrentModel().addTab( - reparentingParams.getTabToReparent(), reparentingParams.getTabIndex(), - TabLaunchType.FROM_REPARENTING); - AsyncTabParamsManager.remove(tabId); - }); - } - } - - @Override - public void onStopWithNative() {} - - @Override - public void onNightModeStateChanged() { - // TODO(crbug.com/1031332): Reparent all tabs in the current tab model. - Tab tabToDetach = mDelegate.getActivityTabProvider().get(); - TabModel currentTabModel = mDelegate.getTabModelSelector().getCurrentModel(); - - TabReparentingParams params = new TabReparentingParams(tabToDetach, null, null); - params.setTabIndex(currentTabModel.indexOf(tabToDetach)); - params.setFromNightModeReparenting(true); - - AsyncTabParamsManager.add(tabToDetach.getId(), params); - currentTabModel.removeTab(tabToDetach); - ReparentingTask.from(tabToDetach).detach(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java index d07396f..13c1842 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -130,6 +130,10 @@ protected ActivityKeyboardVisibilityDelegate createKeyboardVisibilityDelegate() { return new SingleWindowKeyboardVisibilityDelegate(getActivity()); } + @Override + public ModalDialogManager getModalDialogManager() { + return SearchActivity.this.getModalDialogManager(); + } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingDelegateFactory.java deleted file mode 100644 index ef9b417..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingDelegateFactory.java +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.tab_activity_glue; - -import org.chromium.chrome.browser.ActivityTabProvider; -import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.compositor.CompositorViewHolder; -import org.chromium.chrome.browser.night_mode.NightModeReparentingController; -import org.chromium.chrome.browser.tab.TabDelegateFactory; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.ui.base.WindowAndroid; - -/** Constructs delegates needed for reparenting tabs. */ -public class ReparentingDelegateFactory { - /** - * @return Creates an implementation of {@link ReparentingTask.Delegate} that supplies - * dependencies for {@link ReparentingTask} to reparent a Tab. - */ - public static ReparentingTask.Delegate createReparentingTaskDelegate( - final ChromeActivity chromeActivity) { - return new ReparentingTask.Delegate() { - @Override - public CompositorViewHolder getCompositorViewHolder() { - return chromeActivity.getCompositorViewHolder(); - } - - @Override - public WindowAndroid getWindowAndroid() { - return chromeActivity.getWindowAndroid(); - } - - @Override - public TabDelegateFactory getTabDelegateFactory() { - return chromeActivity.getTabDelegateFactory(); - } - }; - } - - /** - * @return Creates an implementation of {@link NightModeReparentingController.Delegate} that - * supplies dependencies to {@link NightModeReparentingController}. - */ - public static NightModeReparentingController.Delegate - createNightModeReparentingControllerDelegate(final ChromeActivity chromeActivity) { - return new NightModeReparentingController.Delegate() { - @Override - public ActivityTabProvider getActivityTabProvider() { - return chromeActivity.getActivityTabProvider(); - } - - @Override - public TabModelSelector getTabModelSelector() { - return chromeActivity.getTabModelSelector(); - } - }; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingTask.java b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingTask.java index 1013b86..1289db15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ReparentingTask.java
@@ -12,21 +12,19 @@ import android.provider.Browser; import android.text.TextUtils; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.chromium.base.ContextUtils; import org.chromium.base.UserData; import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.IntentHandler; -import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; @@ -35,27 +33,6 @@ * Takes care of reparenting a Tab object from one Activity to another. */ public class ReparentingTask implements UserData { - /** Provides data to {@link ReparentingTask} facilitate reparenting tabs. */ - public interface Delegate { - /** - * Gets a {@link CompositorViewHolder} which is passed on to {@link ReparentingTask}, used - * in the reparenting process. - */ - CompositorViewHolder getCompositorViewHolder(); - - /** - * Gets a {@link WindowAndroid} which is passed on to {@link ReparentingTask}, used in the - * reparenting process. - */ - WindowAndroid getWindowAndroid(); - - /** - * Gets a {@link TabDelegateFactory} which is passed on to {@link ReparentingTask}, used in - * the reparenting process. - */ - TabDelegateFactory getTabDelegateFactory(); - } - private static final Class<ReparentingTask> USER_DATA_KEY = ReparentingTask.class; private final Tab mTab; @@ -75,7 +52,7 @@ } @Nullable - public static ReparentingTask get(Tab tab) { + private static ReparentingTask get(Tab tab) { return tab.getUserDataHost().getUserData(USER_DATA_KEY); } @@ -119,7 +96,7 @@ AsyncTabParamsManager.add( mTab.getId(), new TabReparentingParams(mTab, intent, finalizeCallback)); - detach(); + detach(mTab); } context.startActivity(intent, startActivityOptions); @@ -133,16 +110,16 @@ * - Removes the tab from its current {@link TabModelSelector}, effectively severing * the {@link Activity} to {@link Tab} link. */ - public void detach() { + public static void detach(Tab tab) { // TODO(yusufo): We can't call tab.updateWindowAndroid that sets |mWindowAndroid| to null // because many code paths (including navigation) expect the tab to always be associated // with an activity, and will crash. crbug.com/657007 - WebContents webContents = mTab.getWebContents(); + WebContents webContents = tab.getWebContents(); if (webContents != null) webContents.setTopLevelNativeWindow(null); // TabModelSelector of this Tab, if present, gets notified to remove the tab from // the TabModel it belonged to. - mTab.updateAttachment(null, null); + tab.updateAttachment(null, null); } /** @@ -150,12 +127,14 @@ * the tab and related objects to reference it. This updates many delegates inside the tab * and {@link WebContents} both on java and native sides. * - * @param delegate A delegate that provides dependencies. + * @param activity A new {@link ChromeActivity} to attach this Tab instance to. + * @param tabDelegateFactory The new delegate factory this tab should be using. * @param finalizeCallback A Callback to be called after the Tab has been reparented. */ - public void finish(@NonNull Delegate delegate, @Nullable Runnable finalizeCallback) { - delegate.getCompositorViewHolder().prepareForTabReparenting(); - attach(delegate.getWindowAndroid(), delegate.getTabDelegateFactory()); + public void finish(ChromeActivity activity, TabDelegateFactory tabDelegateFactory, + @Nullable Runnable finalizeCallback) { + activity.getCompositorViewHolder().prepareForTabReparenting(); + attach(activity.getWindowAndroid(), tabDelegateFactory); ((TabImpl) mTab).setIsTabStateDirty(true); if (finalizeCallback != null) finalizeCallback.run(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index 6c52c70..57b9356f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -25,7 +25,6 @@ import org.chromium.chrome.browser.tab.TabParentIntent; import org.chromium.chrome.browser.tab.TabRedirectHandler; import org.chromium.chrome.browser.tab.TabState; -import org.chromium.chrome.browser.tab_activity_glue.ReparentingDelegateFactory; import org.chromium.chrome.browser.tab_activity_glue.ReparentingTask; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.components.url_formatter.UrlFormatter; @@ -129,8 +128,7 @@ TabReparentingParams params = (TabReparentingParams) asyncParams; tab = params.getTabToReparent(); ReparentingTask.from(tab).finish( - ReparentingDelegateFactory.createReparentingTaskDelegate(mActivity), - params.getFinalizeCallback()); + mActivity, createDefaultTabDelegateFactory(), params.getFinalizeCallback()); } else if (asyncParams != null && asyncParams.getWebContents() != null) { openInForeground = true; WebContents webContents = asyncParams.getWebContents();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java deleted file mode 100644 index 63e4555..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java +++ /dev/null
@@ -1,214 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.tabmodel; - -import android.app.Activity; - -import org.chromium.base.ActivityState; -import org.chromium.base.ApplicationStatus; -import org.chromium.base.ObserverList; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabImpl; -import org.chromium.chrome.browser.tab.TabLaunchType; -import org.chromium.chrome.browser.tab.TabSelectionType; - -import java.util.List; - -/** - * Simple TabModel that assumes that only one Tab exists. - */ -public class SingleTabModel implements TabModel { - private final Activity mActivity; - private final ObserverList<TabModelObserver> mObservers = new ObserverList<>(); - - private Tab mTab; - private boolean mIsIncognito; - - SingleTabModel(Activity activity, boolean incognito) { - mActivity = activity; - mIsIncognito = incognito; - } - - /** - * Sets the Tab that is managed by the SingleTabModel. - * @param tab Tab to manage. - */ - void setTab(Tab tab) { - if (mTab == tab) return; - Tab oldTab = mTab; - mTab = tab; - if (oldTab != null) { - for (TabModelObserver observer : mObservers) { - observer.willCloseTab(oldTab, false); - } - } - if (tab != null) { - assert mTab.isIncognito() == mIsIncognito; - - for (TabModelObserver observer : mObservers) { - observer.didAddTab(tab, TabLaunchType.FROM_LINK); - observer.didSelectTab(tab, TabSelectionType.FROM_USER, Tab.INVALID_TAB_ID); - } - - int state = ApplicationStatus.getStateForActivity(mActivity); - if (state == ActivityState.CREATED || state == ActivityState.STARTED - || state == ActivityState.RESUMED) { - mTab.show(TabSelectionType.FROM_USER); - } - } - if (oldTab != null && oldTab.isInitialized()) { - for (TabModelObserver observer : mObservers) { - observer.didCloseTab(oldTab.getId(), oldTab.isIncognito()); - } - oldTab.destroy(); - } - } - - @Override - public Profile getProfile() { - return mTab == null ? null : ((TabImpl) mTab).getProfile(); - } - - @Override - public boolean isIncognito() { - return mIsIncognito; - } - - @Override - public int getCount() { - return mTab == null ? 0 : 1; - } - - @Override - public int indexOf(Tab tab) { - if (tab == null) return INVALID_TAB_INDEX; - return mTab != null && mTab.getId() == tab.getId() ? 0 : INVALID_TAB_INDEX; - } - - @Override - public int index() { - return mTab != null ? 0 : INVALID_TAB_INDEX; - } - - @Override - public boolean closeTab(Tab tab) { - return closeTab(tab, false, false, false); - } - - @Override - public boolean closeTab(Tab tab, boolean animate, boolean uponExit, boolean canUndo) { - if (mTab == null || mTab.getId() != tab.getId()) return false; - setTab(null); - return true; - } - - @Override - public boolean closeTab( - Tab tab, Tab recommendedNextTab, boolean animate, boolean uponExit, boolean canUndo) { - return closeTab(tab, animate, uponExit, canUndo); - } - - @Override - public void closeMultipleTabs(List<Tab> tabs, boolean canUndo) { - if (mTab == null) return; - for (Tab tab : tabs) { - if (tab.getId() == mTab.getId()) { - setTab(null); - return; - } - } - } - - @Override - public void closeAllTabs() { - closeAllTabs(true, false); - } - - @Override - public void closeAllTabs(boolean allowDelegation, boolean uponExit) { - setTab(null); - } - - // Tab retrieval functions. - @Override - public Tab getTabAt(int position) { - return position == 0 ? mTab : null; - } - - @Override - public void setIndex(int i, final @TabSelectionType int type) { - assert i == 0; - } - - @Override - public boolean isCurrentModel() { - return true; - } - - @Override - public void moveTab(int id, int newIndex) { - assert false; - } - - @Override - public void destroy() { - if (mTab != null) mTab.destroy(); - mTab = null; - } - - @Override - public Tab getNextTabIfClosed(int id) { - return null; - } - - @Override - public boolean isClosurePending(int tabId) { - return false; - } - - @Override - public TabList getComprehensiveModel() { - return this; - } - - @Override - public void commitAllTabClosures() {} - - @Override - public void commitTabClosure(int tabId) {} - - @Override - public void cancelTabClosure(int tabId) {} - - @Override - public boolean supportsPendingClosures() { - return false; - } - - @Override - public void addTab(Tab tab, int index, @TabLaunchType int type) { - setTab(tab); - } - - @Override - public void removeTab(Tab tab) { - mTab = null; - for (TabModelObserver obs : mObservers) obs.tabRemoved(tab); - } - - @Override - public void addObserver(TabModelObserver observer) { - mObservers.addObserver(observer); - } - - @Override - public void removeObserver(TabModelObserver observer) { - mObservers.removeObserver(observer); - } - - @Override - public void openMostRecentlyClosedTab() {} -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModelSelector.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModelSelector.java deleted file mode 100644 index 6a20e01..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModelSelector.java +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.tabmodel; - -import android.app.Activity; - -import org.chromium.chrome.browser.tab.Tab; - -/** - * Simple TabModelSelector that assumes that only a single TabModel exists at a time. - */ -public class SingleTabModelSelector extends TabModelSelectorBase { - public SingleTabModelSelector( - Activity activity, TabCreatorManager tabCreatorManager, boolean incognito) { - super(tabCreatorManager, incognito); - initialize(new SingleTabModel(activity, incognito)); - - TabModelObserver tabModelObserver = new EmptyTabModelObserver() { - @Override - public void didCloseTab(int tabId, boolean incognito) { - // TabModelSelectorImpl handles the equivalent case of closing the last tab in - // TabModelSelectorImpl#requestToShowTab, which we don't have for this - // TabModelSelector, so we do it here instead. - if (getCurrentModel().getTabAt(0) == null) notifyChanged(); - } - }; - for (TabModel model : getModels()) { - model.addObserver(tabModelObserver); - } - } - - public void setTab(Tab tab) { - ((SingleTabModel) getCurrentModel()).setTab(tab); - markTabStateInitialized(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java index 821b9e49..968ca49c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java
@@ -17,15 +17,10 @@ * Class for handling tab reparenting operations across multiple activities. */ public class TabReparentingParams implements AsyncTabParams { - private static final int TAB_INDEX_NOT_SET = -1; - private final Tab mTabToReparent; private final Intent mOriginalIntent; private final Runnable mFinalizeCallback; - private int mTabIndex = TAB_INDEX_NOT_SET; - private boolean mIsFromNightModeReparenting; - /** * Basic constructor for {@link TabReparentingParams}. */ @@ -66,10 +61,6 @@ return mTabToReparent; } - public boolean hasTabToReparent() { - return mTabToReparent != null; - } - /** * Returns the callback to be used once Tab reparenting has finished, if any. */ @@ -81,31 +72,4 @@ public void destroy() { if (mTabToReparent != null) mTabToReparent.destroy(); } - - // Night mode reparenting implementation. - - /** Set the tab index for later retrieval. */ - public void setTabIndex(int tabIndex) { - mTabIndex = tabIndex; - } - - /** @return Index of the stored tab. */ - public int getTabIndex() { - return mTabIndex; - } - - /** @return Whether this holds a tab index. */ - public boolean hasTabIndex() { - return mTabIndex != TAB_INDEX_NOT_SET; - } - - /** Set whether these params are from night mode reparenting. */ - public void setFromNightModeReparenting(boolean fromNightModeReparenting) { - mIsFromNightModeReparenting = fromNightModeReparenting; - } - - /** @return Whether these params are from night mode reparenting. */ - public boolean isFromNightModeReparenting() { - return mIsFromNightModeReparenting; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java index 99aea0f..5b42a48 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
@@ -294,7 +294,7 @@ badgeFadeAnimator.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); int pixelTranslation = menuBadge.getResources().getDimensionPixelSize( - R.dimen.menu_badge_translation_y_distance); + R.dimen.menu_badge_translation_y); ObjectAnimator badgeTranslateYAnimator = ObjectAnimator.ofFloat(menuBadge, View.TRANSLATION_Y, pixelTranslation, 0.f); badgeTranslateYAnimator.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index 7fcdfde..110f63aa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -15,7 +15,6 @@ import android.os.Bundle; import android.os.StrictMode; import android.text.TextUtils; -import android.util.Pair; import android.view.ViewGroup; import androidx.annotation.Nullable; @@ -25,7 +24,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ApplicationStatus; import org.chromium.base.Log; -import org.chromium.base.StrictModeContext; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.task.PostTask; @@ -48,16 +46,10 @@ import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper; -import org.chromium.chrome.browser.tab.TabBuilder; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabImpl; -import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabObserver; -import org.chromium.chrome.browser.tab.TabSelectionType; -import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.tab.TabThemeColorHelper; -import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; import org.chromium.chrome.browser.ui.system.StatusBarColorController; import org.chromium.chrome.browser.usage_stats.UsageStatsService; @@ -72,7 +64,6 @@ import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.PageTransition; -import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; @@ -89,8 +80,6 @@ protected static final String BUNDLE_TAB_ID = "tabId"; - private final WebappDirectoryManager mDirectoryManager; - private WebappInfo mWebappInfo; private BrowserServicesIntentDataProvider mIntentDataProvider; @@ -153,7 +142,6 @@ */ public WebappActivity() { mWebappInfo = createWebappInfo(null); - mDirectoryManager = new WebappDirectoryManager(); mDisclosureSnackbarController = new WebappDisclosureSnackbarController(); } @@ -211,8 +199,7 @@ public void initializeState() { super.initializeState(); - createAndShowTab(); - mTabController.setInitialTab(getActivityTab()); + mTabController.initializeState(); initializeUI(getSavedInstanceState()); } @@ -386,16 +373,9 @@ } @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - mDirectoryManager.cancelCleanup(); - saveState(outState); - } - - @Override public void onStartWithNative() { super.onStartWithNative(); - mDirectoryManager.cleanUpDirectories(this, getActivityId()); + WebappDirectoryManager.cleanUpDirectories(); } @Override @@ -404,30 +384,6 @@ getFullscreenManager().exitPersistentFullscreenMode(); } - /** - * Saves the tab data out to a file. - */ - private void saveState(Bundle outState) { - if (getActivityTab() == null || getActivityTab().getUrl() == null - || getActivityTab().getUrl().isEmpty()) { - return; - } - - outState.putInt(BUNDLE_TAB_ID, getActivityTab().getId()); - - String tabFileName = TabState.getTabStateFilename(getActivityTab().getId(), false); - File tabFile = new File(getActivityDirectory(), tabFileName); - - // TODO(crbug.com/525785): Temporarily allowing disk access until more permanent fix is in. - try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) { - TabState.saveState(tabFile, TabState.from(getActivityTab()), false); - } - } - - private TabState restoreTabState(Bundle savedInstanceState, int tabId) { - return TabState.restoreTabState(getActivityDirectory(), tabId); - } - @Override public void onResume() { if (!isFinishing()) { @@ -706,15 +662,6 @@ return mWebappInfo.id(); } - /** - * Get the active directory by this web app. - * - * @return The directory used for the current web app. - */ - private File getActivityDirectory() { - return mDirectoryManager.getWebappDirectory(this, getActivityId()); - } - @VisibleForTesting SplashController getSplashControllerForTests() { return mSplashController; @@ -732,10 +679,6 @@ return mDelegateFactory; } - private TabCreator createNormalTabCreator() { - return new WebappTabDelegate(false /* incognito */, mWebappInfo); - } - // We're temporarily disable CS on webapp since there are some issues. (http://crbug.com/471950) // TODO(changwan): re-enable it once the issues are resolved. @Override @@ -806,64 +749,5 @@ } @Override - protected TabModelSelector createTabModelSelector() { - return new SingleTabModelSelector(this, this, false); - } - - @Override - protected Pair<? extends TabCreator, ? extends TabCreator> createTabCreators() { - return Pair.create(createNormalTabCreator(), null); - } - - protected void createAndShowTab() { - TabImpl tab = (TabImpl) createTab(); - getTabModelSelector().setTab(tab); - tab.show(TabSelectionType.FROM_NEW); - } - - @Override - public SingleTabModelSelector getTabModelSelector() { - return (SingleTabModelSelector) super.getTabModelSelector(); - } - - /** - * Creates the {@link Tab} used by the {@link SingleTabActivity}. - * If the {@code savedInstanceState} exists, then the user did not intentionally close the app - * by swiping it away in the recent tasks list. In that case, we try to restore the tab from - * disk. - */ - protected Tab createTab() { - Tab tab = null; - TabState tabState = null; - int tabId = Tab.INVALID_TAB_ID; - Bundle savedInstanceState = getSavedInstanceState(); - if (savedInstanceState != null) { - tabId = savedInstanceState.getInt(BUNDLE_TAB_ID, Tab.INVALID_TAB_ID); - if (tabId != Tab.INVALID_TAB_ID) { - tabState = restoreTabState(savedInstanceState, tabId); - } - } - boolean unfreeze = tabId != Tab.INVALID_TAB_ID && tabState != null; - if (unfreeze) { - tab = TabBuilder.createFromFrozenState() - .setId(tabId) - .setWindow(getWindowAndroid()) - .setDelegateFactory(createTabDelegateFactory()) - .setTabState(tabState) - .setUnfreeze(unfreeze) - .build(); - } else { - tab = new TabBuilder() - .setWindow(getWindowAndroid()) - .setLaunchType(TabLaunchType.FROM_CHROME_UI) - .setDelegateFactory(createTabDelegateFactory()) - .setTabState(tabState) - .setUnfreeze(unfreeze) - .build(); - } - return tab; - } - - @Override public void onUpdateStateChanged() {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityTabController.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityTabController.java index 1a9b7ba..b8cd34fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityTabController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityTabController.java
@@ -11,25 +11,39 @@ import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.ActivityTabProvider.HintlessActivityTabObserver; +import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.WebContentsFactory; import org.chromium.chrome.browser.browserservices.BrowserServicesActivityTabController; +import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory; +import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy; +import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabFactory; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider; import org.chromium.chrome.browser.customtabs.content.TabCreationMode; import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar; import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabImpl; +import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; +import org.chromium.content_public.browser.WebContents; import javax.inject.Inject; +import dagger.Lazy; + /** * Shortcut/WebAPK implementation of {@link BrowserServicesActivityTabController}. */ @ActivityScope public class WebappActivityTabController implements BrowserServicesActivityTabController { - private final ActivityTabProvider mActivityTabProvider; - private final CustomTabActivityTabProvider mTabProvider; + private final Lazy<CustomTabDelegateFactory> mTabDelegateFactory; + private final ChromeActivity mActivity; private final TabObserverRegistrar mTabObserverRegistrar; + private final CustomTabTabPersistencePolicy mTabPersistencePolicy; + private final CustomTabActivityTabFactory mTabFactory; + private final ActivityTabProvider mActivityTabProvider; + private final WebContentsFactory mWebContentsFactory; + private final CustomTabActivityTabProvider mTabProvider; private HintlessActivityTabObserver mTabSwapObserver = new HintlessActivityTabObserver() { @Override @@ -39,17 +53,19 @@ }; @Inject - public WebappActivityTabController(ActivityTabProvider activityTabProvider, - CustomTabActivityTabProvider tabProvider, TabObserverRegistrar tabObserverRegistrar) { - mActivityTabProvider = activityTabProvider; - mTabProvider = tabProvider; + public WebappActivityTabController(ChromeActivity activity, + Lazy<CustomTabDelegateFactory> tabDelegateFactory, + ActivityTabProvider activityTabProvider, TabObserverRegistrar tabObserverRegistrar, + CustomTabTabPersistencePolicy persistencePolicy, CustomTabActivityTabFactory tabFactory, + WebContentsFactory webContentsFactory, CustomTabActivityTabProvider tabProvider) { + mTabDelegateFactory = tabDelegateFactory; + mActivity = activity; mTabObserverRegistrar = tabObserverRegistrar; - } - - public void setInitialTab(Tab tab) { - mTabProvider.setInitialTab(tab, TabCreationMode.DEFAULT); - mActivityTabProvider.addObserverAndTrigger(mTabSwapObserver); - mTabObserverRegistrar.addObserversForTab(tab); + mTabPersistencePolicy = persistencePolicy; + mTabFactory = tabFactory; + mActivityTabProvider = activityTabProvider; + mWebContentsFactory = webContentsFactory; + mTabProvider = tabProvider; } @Override @@ -58,26 +74,94 @@ @Override public void closeTab() { - Tab tab = mTabProvider.getTab(); - if (tab == null) return; - - getTabModelSelector().closeAllTabs(true); + mTabFactory.getTabModelSelector().getCurrentModel().closeTab( + mTabProvider.getTab(), false, false, false); } @Override public void closeAndForgetTab() { - closeTab(); + mTabFactory.getTabModelSelector().closeAllTabs(true); + mTabPersistencePolicy.deleteMetadataStateFileAsync(); } @Override - public void saveState() {} + public void saveState() { + mTabFactory.getTabModelSelector().saveState(); + } @Override @Nullable public TabModelSelector getTabModelSelector() { - Tab tab = mTabProvider.getTab(); - if (tab == null) return null; + return mTabFactory.getTabModelSelector(); + } - return ((TabImpl) tab).getActivity().getTabModelSelector(); + public void initializeState() { + TabModelSelectorImpl tabModelSelector = mTabFactory.getTabModelSelector(); + + TabModel tabModel = tabModelSelector.getModel(false /* incognito */); + tabModel.addObserver(mTabObserverRegistrar); + + finalizeCreatingTab(tabModelSelector, tabModel); + Tab tab = mTabProvider.getTab(); + assert tab != null; + assert mTabProvider.getInitialTabCreationMode() != TabCreationMode.NONE; + + // Put Sync in the correct state by calling tab state initialized. crbug.com/581811. + tabModelSelector.markTabStateInitialized(); + } + + // Creates the tab on native init, if it hasn't been created yet, and does all the additional + // initialization steps necessary at this stage. + private void finalizeCreatingTab(TabModelSelectorImpl tabModelSelector, TabModel tabModel) { + Tab tab = null; + @TabCreationMode + int mode = mTabProvider.getInitialTabCreationMode(); + + Tab restoredTab = tryRestoringTab(tabModelSelector); + if (restoredTab != null) { + tab = restoredTab; + mode = TabCreationMode.RESTORED; + } + + if (tab == null) { + // No tab was restored, creating a new tab. + tab = createTab(); + mode = TabCreationMode.DEFAULT; + } + + assert tab != null; + + if (mode != TabCreationMode.RESTORED) { + tabModel.addTab(tab, 0, tab.getLaunchType()); + } + + mTabProvider.setInitialTab(tab, mode); + + // Listen to tab swapping and closing. + mActivityTabProvider.addObserverAndTrigger(mTabSwapObserver); + } + + @Nullable + private Tab tryRestoringTab(TabModelSelectorImpl tabModelSelector) { + if (mActivity.getSavedInstanceState() == null) return null; + tabModelSelector.loadState(true); + tabModelSelector.restoreTabs(true); + Tab tab = tabModelSelector.getCurrentTab(); + if (tab != null) { + initializeTab(tab); + } + return tab; + } + + private Tab createTab() { + WebContents webContents = + mWebContentsFactory.createWebContentsWithWarmRenderer(false /* incognito */, false); + Tab tab = mTabFactory.createTab(webContents, mTabDelegateFactory.get()); + initializeTab(tab); + return tab; + } + + private void initializeTab(Tab tab) { + mTabObserverRegistrar.addObserversForTab(tab); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java index be2157e..33a30849 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
@@ -4,46 +4,27 @@ package org.chromium.chrome.browser.webapps; -import android.annotation.TargetApi; -import android.app.ActivityManager; -import android.app.ActivityManager.AppTask; import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.text.TextUtils; import android.text.format.DateUtils; import org.chromium.base.ContextUtils; import org.chromium.base.FileUtils; -import org.chromium.base.Log; -import org.chromium.base.PackageUtils; import org.chromium.base.PathUtils; -import org.chromium.base.StrictModeContext; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.BackgroundOnlyAsyncTask; import org.chromium.chrome.browser.metrics.WebApkUma; -import org.chromium.chrome.browser.util.AndroidTaskUtils; -import org.chromium.webapk.lib.common.WebApkConstants; import java.io.File; -import java.util.HashSet; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** - * Manages directories created to store data for web apps. - * - * Directories managed by this class are all subdirectories of the app_WebappActivity/ directory, - * which each WebappActivity using a directory named either for its Webapp's ID in Document mode, - * or the index of the WebappActivity if it is a subclass of the WebappManagedActivity class (which - * are used in pre-L devices to allow multiple WebappActivities launching). + * Manages directories created to store data for WebAPK updates, and cleans up stale state + * directories left behind under app_WebappActivity/. * * Also records metrics about files in the "WebAPK update" directory. */ public class WebappDirectoryManager { - protected static final String WEBAPP_DIRECTORY_NAME = "WebappActivity"; - private static final String TAG = "WebappDirectoryManag"; + protected static final String DEPRECATED_WEBAPP_DIRECTORY_NAME = "WebappActivity"; /** Path of subdirectory within cache directory which contains data for pending updates. */ private static final String UPDATE_DIRECTORY_PATH = "webapk/update"; @@ -51,111 +32,30 @@ /** Whether or not the class has already started trying to clean up obsolete directories. */ private static final AtomicBoolean sMustCleanUpOldDirectories = new AtomicBoolean(true); - /** AsyncTask that is used to clean up the web app directories. */ - private AsyncTask<Void> mCleanupTask; - /** * Deletes web app directories with stale data. - * - * This should be called by a {@link WebappActivity} after it has restored all the data it - * needs from its directory because the directory will be deleted during the process. - * - * @param context Context to pull info and Files from. - * @param currentWebappId ID for the currently running web app. */ - public void cleanUpDirectories(final Context context, final String currentWebappId) { - if (mCleanupTask != null) return; + public static void cleanUpDirectories() { + if (!sMustCleanUpOldDirectories.getAndSet(false)) return; - mCleanupTask = new BackgroundOnlyAsyncTask<Void>() { + new BackgroundOnlyAsyncTask<Void>() { @Override protected final Void doInBackground() { recordNumberOfStaleWebApkUpdateRequestFiles(); - - Set<File> directoriesToDelete = new HashSet<File>(); - directoriesToDelete.add(getWebappDirectory(context, currentWebappId)); - - boolean shouldDeleteOldDirectories = - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - if (shouldDeleteOldDirectories && sMustCleanUpOldDirectories.getAndSet(false)) { - findStaleWebappDirectories(context, directoriesToDelete); - } - - for (File directory : directoriesToDelete) { - if (isCancelled()) return null; - FileUtils.recursivelyDeleteFile(directory); - } - + FileUtils.recursivelyDeleteFile( + getBaseWebappDirectory(ContextUtils.getApplicationContext())); return null; } - }; - mCleanupTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - /** Cancels the cleanup task, if one exists. */ - public void cancelCleanup() { - if (mCleanupTask != null) mCleanupTask.cancel(true); + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } /** Resets class' static state */ - public void resetForTesting() { - sMustCleanUpOldDirectories.getAndSet(true); - } - - /** - * Finds all directories for web apps containing stale data. - * - * This includes all directories using the old pre-L directory structure, which used directories - * named * app_WebappActivity*, as well as directories corresponding to WebappActivities that - * are no longer listed in Android's recents, since these will be unable to restore their data. - * - * @param directoriesToDelete Set to append directory names to. - */ - private void findStaleWebappDirectories(Context context, Set<File> directoriesToDelete) { - File webappBaseDirectory = getBaseWebappDirectory(context); - - // Figure out what WebappActivities are still listed in Android's recents menu. - Set<String> liveWebapps = new HashSet<String>(); - Set<Intent> baseIntents = getBaseIntentsForAllTasks(); - for (Intent intent : baseIntents) { - Uri data = intent.getData(); - if (data != null && TextUtils.equals(WebappActivity.WEBAPP_SCHEME, data.getScheme())) { - liveWebapps.add(data.getHost()); - } - } - - // Delete all web app directories in the main directory, which were for pre-L web apps. - File appDirectory = new File(context.getApplicationInfo().dataDir); - String webappDirectoryAppBaseName = webappBaseDirectory.getName(); - File[] files = appDirectory.listFiles(); - if (files != null) { - for (File file : files) { - String filename = file.getName(); - if (!filename.startsWith(webappDirectoryAppBaseName)) continue; - if (filename.length() == webappDirectoryAppBaseName.length()) continue; - directoriesToDelete.add(file); - } - } - - // Clean out web app directories which no longer correspond to a task in recents. - // Check if a WebAPK is installed to avoid an issue where - // {@link ActivityManager#getAppTasks()} does not return WebAPK tasks when - // WebApkActivity is not the root of the task (e.g. when the new-style splash screen - // is the root). - files = webappBaseDirectory.listFiles(); - if (files != null) { - for (File file : files) { - String webApkPackageName = getWebApkPackageFromWebappDirectory(file); - if ((TextUtils.isEmpty(webApkPackageName) - || !PackageUtils.isPackageInstalled(context, webApkPackageName)) - && !liveWebapps.contains(file.getName())) { - directoriesToDelete.add(file); - } - } - } + public static void resetForTesting() { + sMustCleanUpOldDirectories.set(true); } /** Records to UMA the count of old "WebAPK update request" files. */ - private void recordNumberOfStaleWebApkUpdateRequestFiles() { + private static void recordNumberOfStaleWebApkUpdateRequestFiles() { File updateDirectory = getWebApkUpdateDirectory(); int count = 0; File[] children = updateDirectory.listFiles(); @@ -177,37 +77,9 @@ WebApkUma.recordNumberOfStaleWebApkUpdateRequestFiles(count); } - /** - * Returns the directory for a web app, creating it if necessary. - * @param webappId ID for the web app. Used as a subdirectory name. - * @return File for storing information about the web app. - */ - File getWebappDirectory(Context context, String webappId) { - // TODO(crbug.com/525785): Temporarily allowing disk access until more permanent fix is in. - try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) { - File webappDirectory = new File(getBaseWebappDirectory(context), webappId); - if (!webappDirectory.exists() && !webappDirectory.mkdir()) { - Log.e(TAG, "Failed to create web app directory."); - } - return webappDirectory; - } - } - - /** - * Returns the WebAPK package name if the passed-in directory is for a WebAPK. Returns null - * otherwise. - */ - private static String getWebApkPackageFromWebappDirectory(File directory) { - String name = directory.getName(); - if (!name.startsWith(WebApkConstants.WEBAPK_ID_PREFIX)) { - return null; - } - return name.substring(WebApkConstants.WEBAPK_ID_PREFIX.length()); - } - /** Returns the directory containing all of Chrome's web app data, creating it if needed. */ - final File getBaseWebappDirectory(Context context) { - return context.getDir(WEBAPP_DIRECTORY_NAME, Context.MODE_PRIVATE); + static final File getBaseWebappDirectory(Context context) { + return context.getDir(DEPRECATED_WEBAPP_DIRECTORY_NAME, Context.MODE_PRIVATE); } /** Returns the directory for "WebAPK update" files. Does not create the directory. */ @@ -219,20 +91,4 @@ static final File getWebApkUpdateFilePathForStorage(WebappDataStorage storage) { return new File(getWebApkUpdateDirectory(), storage.getId()); } - - /** Returns a Set of Intents for all Chrome tasks currently known by the ActivityManager. */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - protected Set<Intent> getBaseIntentsForAllTasks() { - Set<Intent> baseIntents = new HashSet<Intent>(); - - Context context = ContextUtils.getApplicationContext(); - ActivityManager manager = - (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - for (AppTask task : manager.getAppTasks()) { - Intent intent = AndroidTaskUtils.getBaseIntentFromTask(task); - if (intent != null) baseIntents.add(intent); - } - - return baseIntents; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java index c98ca1c..fb62689 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappTabDelegate.java
@@ -9,22 +9,30 @@ import android.net.Uri; import android.provider.Browser; +import androidx.annotation.Nullable; import androidx.browser.customtabs.CustomTabsIntent; import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.PackageManagerUtils; import org.chromium.base.StrictModeContext; +import org.chromium.base.Supplier; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider; import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.LaunchSourceType; import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; +import org.chromium.chrome.browser.init.StartupTabPreloader; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabIdManager; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; +import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams; import org.chromium.chrome.browser.tabmodel.document.TabDelegate; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; import java.net.URISyntaxException; import java.util.List; @@ -35,37 +43,78 @@ * This is the same as the parent class with exception of checking for a specialized native handlers * first, and if none are found opening a Custom Tab instead of creating a new tab in Chrome. */ -public class WebappTabDelegate extends TabDelegate { +public class WebappTabDelegate extends ChromeTabCreator { private static final String TAG = "WebappTabDelegate"; private String mApkPackageName; private @LaunchSourceType int mLaunchSourceType; + private final TabDelegate mTabDelegate; - public WebappTabDelegate(boolean incognito, WebappInfo webappInfo) { - super(incognito); + public WebappTabDelegate(WebappActivity activity, WindowAndroid nativeWindow, + StartupTabPreloader startupTabPreloader, + Supplier<TabDelegateFactory> tabDelegateFactory, boolean incognito) { + super(activity, nativeWindow, startupTabPreloader, tabDelegateFactory, incognito); + WebappInfo webappInfo = activity.getWebappInfo(); mApkPackageName = webappInfo.webApkPackageName(); mLaunchSourceType = webappInfo.isForWebApk() ? LaunchSourceType.WEBAPK : LaunchSourceType.WEBAPP; + + mTabDelegate = new TabDelegate(incognito) { + @Override + public void createNewTab( + AsyncTabCreationParams asyncParams, @TabLaunchType int type, int parentId) { + String url = asyncParams.getLoadUrlParams().getUrl(); + if (maybeStartExternalActivity(url)) return; + + int assignedTabId = TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID); + AsyncTabParamsManager.add(assignedTabId, asyncParams); + + Intent intent = new CustomTabsIntent.Builder().setShowTitle(true).build().intent; + intent.setData(Uri.parse(url)); + intent.putExtra( + CustomTabIntentDataProvider.EXTRA_SEND_TO_EXTERNAL_DEFAULT_HANDLER, true); + intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_CHROME, true); + intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_WEBAPK, true); + intent.putExtra( + CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, mLaunchSourceType); + intent.putExtra(Browser.EXTRA_APPLICATION_ID, mApkPackageName); + addAsyncTabExtras( + asyncParams, parentId, false /* isChromeUI */, assignedTabId, intent); + + IntentHandler.startActivityForTrustedIntent(intent); + } + }; } @Override - public void createNewTab( - AsyncTabCreationParams asyncParams, @TabLaunchType int type, int parentId) { - String url = asyncParams.getLoadUrlParams().getUrl(); - if (maybeStartExternalActivity(url)) return; + public boolean createsTabsAsynchronously() { + return mTabDelegate.createsTabsAsynchronously(); + } - int assignedTabId = TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID); - AsyncTabParamsManager.add(assignedTabId, asyncParams); + @Override + @Nullable + public Tab createNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent) { + if (type != TabLaunchType.FROM_RESTORE) { + return mTabDelegate.createNewTab(loadUrlParams, type, parent); + } + return super.createNewTab(loadUrlParams, type, parent); + } - Intent intent = new CustomTabsIntent.Builder().setShowTitle(true).build().intent; - intent.setData(Uri.parse(url)); - intent.putExtra(CustomTabIntentDataProvider.EXTRA_SEND_TO_EXTERNAL_DEFAULT_HANDLER, true); - intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_CHROME, true); - intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_WEBAPK, true); - intent.putExtra(CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, mLaunchSourceType); - intent.putExtra(Browser.EXTRA_APPLICATION_ID, mApkPackageName); - addAsyncTabExtras(asyncParams, parentId, false /* isChromeUI */, assignedTabId, intent); + @Override + @Nullable + public Tab launchUrl(String url, @TabLaunchType int type) { + if (type != TabLaunchType.FROM_RESTORE) { + return mTabDelegate.launchUrl(url, type); + } + return super.launchUrl(url, type); + } - IntentHandler.startActivityForTrustedIntent(intent); + @Override + public boolean createTabWithWebContents( + @Nullable Tab parent, WebContents webContents, @TabLaunchType int type, String url) { + if (type != TabLaunchType.FROM_RESTORE) { + return mTabDelegate.createTabWithWebContents(parent, webContents, type, url); + } + return super.createTabWithWebContents(parent, webContents, type, url); } private boolean maybeStartExternalActivity(String url) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java index 20c8485..e4cdf8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java
@@ -9,6 +9,7 @@ import org.chromium.chrome.browser.browserservices.BrowserServicesActivityTabController; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.customtabs.CustomTabUmaRecorder; +import org.chromium.chrome.browser.init.StartupTabPreloader; import org.chromium.chrome.browser.webapps.WebappActivityTabController; import dagger.Module; @@ -43,4 +44,10 @@ public CustomTabUmaRecorder provideCustomTabUmaRecorder() { return null; } + + @Nullable + @Provides + public StartupTabPreloader provideStartupTabPreloader() { + return null; + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java index dad3bc7..4ee0b551 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -25,10 +25,8 @@ import org.junit.runner.RunWith; import org.chromium.base.ActivityState; -import org.chromium.base.ApplicationStatus; import org.chromium.base.test.params.ParameterAnnotations; import org.chromium.base.test.params.ParameterizedRunner; -import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; @@ -48,6 +46,7 @@ import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.util.ActivityUtils; +import org.chromium.chrome.test.util.ApplicationTestUtils; import org.chromium.chrome.test.util.BookmarkTestUtil; import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; @@ -483,17 +482,12 @@ openBookmarkManager(); - CallbackHelper activityDestroyedCallback = new CallbackHelper(); - ApplicationStatus.registerStateListenerForActivity((activity, newState) -> { - if (newState == ActivityState.DESTROYED) activityDestroyedCallback.notifyCalled(); - }, mBookmarkActivity); - final BookmarkActionBar toolbar = mManager.getToolbarForTests(); TestThreadUtils.runOnUiThreadBlocking( () -> toolbar.onMenuItemClick(toolbar.getMenu().findItem(R.id.close_menu_id))); - activityDestroyedCallback.waitForCallback(0); + ApplicationTestUtils.waitForActivityState(mBookmarkActivity, ActivityState.DESTROYED); BookmarkManager.preventLoadingForTesting(false); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index cf3cca41..269293b0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -2134,6 +2134,7 @@ @Test @LargeTest @Feature({"ContextualSearch"}) + @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O_MR1, message = "crbug.com/1036414") public void testTapALot() throws InterruptedException, TimeoutException { for (int i = 0; i < 50; i++) { clickToTriggerPrefetch(); @@ -3139,18 +3140,4 @@ assertPanelClosedOrUndefined(); assertLoadedNoUrl(); } - - @Test - @SmallTest - @Feature({"ContextualSearch"}) - @CommandLineFlags.Add({"enable-features=ContextualSearchLongpressResolve<FakeStudyName", - "force-fieldtrials=FakeStudyName/FakeGroup", - "force-fieldtrial-params=FakeStudyName.FakeGroup:longpress_resolve_variation/" - + ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRESERVE_TAP}) - public void - testTapNotIgnoredWithLongpressResolveEnabledAndVariationPreserveTap() throws TimeoutException { - clickWordNode("states"); - Assert.assertEquals("States", getSelectedText()); - waitForPanelToPeek(); - } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java index 4d57abc..e214813 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java
@@ -26,7 +26,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; -import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -71,13 +70,9 @@ assertThat( mSelector.getCurrentTab(), Matchers.not(Matchers.sameInstance(initiallyCurrent))); - if (!(mSelector instanceof SingleTabModelSelector)) { - assertEquals(1, mSelector.getTotalTabCount()); - // Close last tab - performAction("close_tab"); - } else { - assertEquals(0, mSelector.getTotalTabCount()); - } + assertEquals(1, mSelector.getTotalTabCount()); + // Close last tab + performAction("close_tab"); // No tabs are left, so actions aren't available anymore. assertThat(getDirectActions(), Matchers.empty());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java index e851193e..6c0aae2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java
@@ -27,7 +27,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -91,8 +90,6 @@ Matchers.containsInAnyOrder("bookmark_this_page", "reload", "downloads", "help", "new_tab", "open_history", "preferences", "close_all_tabs")); - // Tabs can't be closed for SingleTab Activities. - if (mTabModelSelector instanceof SingleTabModelSelector) return; TestThreadUtils.runOnUiThreadBlocking(() -> { mTabModelSelector.closeAllTabs(); }); // Wait for any pending animations for tab closures to complete. CriteriaHelper.pollUiThread(Criteria.equals(0, () -> mTabModelSelector.getTotalTabCount()));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index 6e9fc53..efd49e32 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -36,7 +36,6 @@ import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; -import org.chromium.chrome.browser.tabmodel.SingleTabModel; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content_public.browser.LoadUrlParams; @@ -402,30 +401,24 @@ @SmallTest @RetryOnFailure public void testOpenWindowFromUserGesture() { - boolean opensNewTab = - !(mActivityTestRule.getActivity().getCurrentTabModel() instanceof SingleTabModel); loadUrlAndWaitForIntentUrl(mTestServer.getURL(OPEN_WINDOW_FROM_USER_GESTURE_PAGE), true, - opensNewTab, true, null, true); + true, true, null, true); } @Test @SmallTest @RetryOnFailure public void testOpenWindowFromLinkUserGesture() { - boolean opensNewTab = - !(mActivityTestRule.getActivity().getCurrentTabModel() instanceof SingleTabModel); loadUrlAndWaitForIntentUrl(mTestServer.getURL(OPEN_WINDOW_FROM_LINK_USER_GESTURE_PAGE), - true, opensNewTab, true, null, true, "link"); + true, true, true, null, true, "link"); } @Test @SmallTest @RetryOnFailure public void testOpenWindowFromSvgUserGesture() { - boolean opensNewTab = - !(mActivityTestRule.getActivity().getCurrentTabModel() instanceof SingleTabModel); loadUrlAndWaitForIntentUrl(mTestServer.getURL(OPEN_WINDOW_FROM_SVG_USER_GESTURE_PAGE), true, - opensNewTab, true, null, true, "link"); + true, true, null, true, "link"); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java index 12f39a8..51fb493 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.app_modal.JavascriptAppModalDialog; import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java index b702ca1..c8b43ca 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
@@ -21,9 +21,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.ActivityState; -import org.chromium.base.ApplicationStatus; -import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; @@ -299,37 +296,10 @@ InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } - // TODO(https://crbug.com/1015449): Move this function to ApplicationTestUtils. - private void waitForActivityState(Activity activity, @ActivityState int state) - throws Exception { - final CallbackHelper callbackHelper = new CallbackHelper(); - final ApplicationStatus.ActivityStateListener activityStateListener = - (activity1, newState) -> { - if (newState == state) { - callbackHelper.notifyCalled(); - } - }; - try { - boolean correctState = TestThreadUtils.runOnUiThreadBlocking(() -> { - if (ApplicationStatus.getStateForActivity(activity) == state) { - return true; - } - ApplicationStatus.registerStateListenerForActivity(activityStateListener, activity); - activity.finish(); - return false; - }); - if (!correctState) { - callbackHelper.waitForCallback(0); - } - } finally { - ApplicationStatus.unregisterActivityStateListener(activityStateListener); - } - } - private void pressBackAndDismissActivity(Activity activity) throws Exception { UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.pressBack(); - waitForActivityState(activity, ActivityState.DESTROYED); + ApplicationTestUtils.finishActivity(activity); } private ChromeSwitchPreference getSyncSwitch(SyncAndServicesPreferences fragment) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java index ee56bf4a..45de5ba 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.webapps; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -19,10 +18,8 @@ import org.chromium.base.ActivityState; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.ApplicationStatus; import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.ChromeActivity; @@ -36,6 +33,7 @@ import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.util.ApplicationTestUtils; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.browser.webapps.WebApkInfoBuilder; import org.chromium.content_public.browser.test.NativeLibraryTestRule; @@ -150,7 +148,6 @@ @LargeTest @Feature({"WebApk"}) public void testLaunchIntervalHistogramNotRecordedOnFirstLaunch() { - android.util.Log.e("ABCD", "Start"); final String histogramName = "WebApk.LaunchInterval"; WebApkActivity webApkActivity = mActivityTestRule.startWebApkActivity(createWebApkInfo( getTestServerUrl("manifest_test_page.html"), getTestServerUrl("/"))); @@ -167,7 +164,6 @@ WebappDataStorage storage = WebappRegistry.getInstance().getWebappDataStorage(TEST_WEBAPK_ID); Assert.assertNotEquals(WebappDataStorage.TIMESTAMP_INVALID, storage.getLastUsedTimeMs()); - android.util.Log.e("ABCD", "Start2"); } /** Test that the "WebApk.LaunchInterval" histogram is recorded on susbequent launches. */ @@ -220,7 +216,7 @@ InstrumentationRegistry.getTargetContext().startActivity(intent); ChromeActivityTestRule.waitFor(mainClass); - waitForActivityState(webApkActivity, ActivityState.STOPPED); + ApplicationTestUtils.waitForActivityState(webApkActivity, ActivityState.STOPPED); TestThreadUtils.runOnUiThreadBlocking(() -> { TabWebContentsDelegateAndroid tabDelegate = @@ -251,29 +247,4 @@ callback.waitForCallback(0); return WebappRegistry.getInstance().getWebappDataStorage(webappId); } - - private void waitForActivityState(Activity activity, @ActivityState int state) - throws Exception { - final CallbackHelper callbackHelper = new CallbackHelper(); - final ApplicationStatus.ActivityStateListener activityStateListener = - (activity1, newState) -> { - if (newState == state) { - callbackHelper.notifyCalled(); - } - }; - try { - boolean correctState = TestThreadUtils.runOnUiThreadBlocking(() -> { - if (ApplicationStatus.getStateForActivity(activity) == state) { - return true; - } - ApplicationStatus.registerStateListenerForActivity(activityStateListener, activity); - return false; - }); - if (!correctState) { - callbackHelper.waitForCallback(0); - } - } finally { - ApplicationStatus.unregisterActivityStateListener(activityStateListener); - } - } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java index 4db3db4..601b395 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java
@@ -41,6 +41,7 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@MinAndroidSdkLevel(Build.VERSION_CODES.M) // NotificationManager.getActiveNotifications @TargetApi(Build.VERSION_CODES.M) public class WebappActionsNotificationTest { private static final String WEB_APP_PATH = "/chrome/test/data/banners/manifest_test_page.html"; @@ -59,7 +60,6 @@ @SmallTest @Feature({"Webapps"}) @RetryOnFailure - @MinAndroidSdkLevel(Build.VERSION_CODES.M) // NotificationManager.getActiveNotifications public void testNotification_openInChrome() throws Exception { Notification notification = getWebappNotification(); @@ -89,7 +89,6 @@ @SmallTest @Feature({"Webapps"}) @RetryOnFailure - @MinAndroidSdkLevel(Build.VERSION_CODES.M) // NotificationManager.getActiveNotifications */ @DisabledTest(message = "crbug.com/774491") public void testNotification_copyUrl() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java index be7b4a56..a3d5d03 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java
@@ -37,7 +37,7 @@ public static final String WEBAPP_NAME = "webapp name"; public static final String WEBAPP_SHORT_NAME = "webapp short name"; - private static final long STARTUP_TIMEOUT = 10000L; + private static final long STARTUP_TIMEOUT = 15000L; // Empty 192x192 image generated with: // ShortcutHelper.encodeBitmapAsString(Bitmap.createBitmap(192, 192, Bitmap.Config.ARGB_4444));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java index b91752d..38113b9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java
@@ -126,7 +126,7 @@ public void finishesReparentingHiddenTab() { Tab hiddenTab = env.prepareHiddenTab(); env.reachNativeInit(mTabController); - verify(env.reparentingTaskProvider.get(hiddenTab)).finish(any(), any()); + verify(env.reparentingTaskProvider.get(hiddenTab)).finish(any(), any(), any()); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDirectoryManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDirectoryManagerTest.java index 01851c6a..2efabbc 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDirectoryManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDirectoryManagerTest.java
@@ -5,10 +5,7 @@ package org.chromium.chrome.browser.webapps; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Build; -import android.os.Bundle; import org.junit.After; import org.junit.Assert; @@ -21,6 +18,7 @@ import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowLooper; +import org.chromium.base.ContextUtils; import org.chromium.base.PathUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordHistogram; @@ -29,11 +27,8 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; import org.chromium.webapk.lib.common.WebApkConstants; -import org.chromium.webapk.test.WebApkTestHelper; import java.io.File; -import java.util.HashSet; -import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -46,38 +41,22 @@ @Rule public MockWebappDataStorageClockRule mClockRule = new MockWebappDataStorageClockRule(); - private static final String WEBAPP_ID_1 = "webapp_1"; - private static final String WEBAPP_ID_2 = "webapp_2"; - private static final String WEBAPP_ID_3 = "webapp_3"; private static final String WEBAPK_PACKAGE_NAME_1 = "webapk_1"; private static final String WEBAPK_PACKAGE_NAME_2 = "webapk_2"; - private static final String WEBAPK_PACKAGE_NAME_3 = "webapk_3"; private static final String WEBAPK_ID_1 = WebApkConstants.WEBAPK_ID_PREFIX + WEBAPK_PACKAGE_NAME_1; private static final String WEBAPK_ID_2 = WebApkConstants.WEBAPK_ID_PREFIX + WEBAPK_PACKAGE_NAME_2; - private static final String WEBAPK_ID_3 = - WebApkConstants.WEBAPK_ID_PREFIX + WEBAPK_PACKAGE_NAME_3; - - private static class TestWebappDirectoryManager extends WebappDirectoryManager { - private Set<Intent> mBaseIntents = new HashSet<Intent>(); - - @Override - protected Set<Intent> getBaseIntentsForAllTasks() { - return mBaseIntents; - } - } private Context mContext; - private TestWebappDirectoryManager mWebappDirectoryManager; @Before public void setUp() { mContext = RuntimeEnvironment.application; + ContextUtils.initApplicationContext(mContext); ThreadUtils.setThreadAssertsDisabledForTesting(true); PathUtils.setPrivateDataDirectorySuffix("chrome"); - mWebappDirectoryManager = new TestWebappDirectoryManager(); - mWebappDirectoryManager.resetForTesting(); + WebappDirectoryManager.resetForTesting(); } @After @@ -96,101 +75,25 @@ @Test @Feature({"Webapps"}) - public void testDeletesOwnDirectory() throws Exception { - File webappDirectory = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPP_ID_1); - Assert.assertTrue(webappDirectory.mkdirs()); - Assert.assertTrue(webappDirectory.exists()); - - // Confirm that it deletes the current web app's directory. - runCleanup(); - Assert.assertFalse(webappDirectory.exists()); - } - - /** - * On Lollipop and higher, the {@link WebappDirectoryManager} also deletes directories for web - * apps that no longer correspond to tasks in Recents. - */ - @Test - @Feature({"Webapps"}) - public void testDeletesDirectoriesForDeadTasks() throws Exception { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; - - // Track the three web app directories. - File directory1 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPP_ID_1); - File directory2 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPP_ID_2); - File directory3 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPP_ID_3); - - // Seed the directory with folders for web apps. - Assert.assertTrue(directory1.mkdirs()); - Assert.assertTrue(directory2.mkdirs()); - Assert.assertTrue(directory3.mkdirs()); - - // Indicate that another of the web apps is listed in Recents; in real usage this web app - // would not be in the foreground and would have persisted its state. - mWebappDirectoryManager.mBaseIntents = new HashSet<Intent>(); - mWebappDirectoryManager.mBaseIntents.add( - new Intent(Intent.ACTION_VIEW, Uri.parse("webapp://webapp_2"))); - - // Only the directory for the background web app should survive. - runCleanup(); - Assert.assertFalse(directory1.exists()); - Assert.assertTrue(directory2.exists()); - Assert.assertFalse(directory3.exists()); - } - - /** - * On Lollipop and higher, the {@link WebappDirectoryManager} also deletes directories for - * *WebApks* that are no longer installed. - */ - @Test - @Feature({"Webapps"}) - public void testDeletesDirectoriesForUninstalledWebApks() throws Exception { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; - - WebApkTestHelper.registerWebApkWithMetaData(WEBAPK_PACKAGE_NAME_2, new Bundle(), null); - - // Track the three web app directories. - File directory1 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPK_ID_1); - File directory2 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPK_ID_2); - File directory3 = - new File(mWebappDirectoryManager.getBaseWebappDirectory(mContext), WEBAPK_ID_3); - - // Seed the directory with folders for web apps. - Assert.assertTrue(directory1.mkdirs()); - Assert.assertTrue(directory2.mkdirs()); - Assert.assertTrue(directory3.mkdirs()); - - // Only the directory for the still installed WebAPK should survive. - runCleanup(); - Assert.assertFalse(directory1.exists()); - Assert.assertTrue(directory2.exists()); - Assert.assertFalse(directory3.exists()); - } - - @Test - @Feature({"Webapps"}) - public void testDeletesObsoleteDirectories() throws Exception { + public void testDeletesObsoleteDirectories() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; // Seed the base directory with folders that correspond to pre-L web apps. File baseDirectory = mContext.getDataDir(); - File webappDirectory1 = new File(baseDirectory, "app_WebappActivity1"); - File webappDirectory6 = new File(baseDirectory, "app_WebappActivity6"); + File webappDirectory = new File(baseDirectory, "app_WebappActivity"); File nonWebappDirectory = new File(baseDirectory, "app_ChromeDocumentActivity"); - Assert.assertTrue(webappDirectory1.mkdirs()); - Assert.assertTrue(webappDirectory6.mkdirs()); + Assert.assertTrue(webappDirectory.mkdirs()); Assert.assertTrue(nonWebappDirectory.mkdirs()); // Make sure only the web app folders are deleted. runCleanup(); - Assert.assertFalse(webappDirectory1.exists()); - Assert.assertFalse(webappDirectory6.exists()); + Assert.assertFalse(webappDirectory.exists()); + Assert.assertTrue(nonWebappDirectory.exists()); + + Assert.assertTrue(webappDirectory.mkdirs()); + // Make sure the second cleanup call no-ops. + runCleanup(); + Assert.assertTrue(webappDirectory.exists()); Assert.assertTrue(nonWebappDirectory.exists()); } @@ -200,7 +103,7 @@ */ @Test @Feature({"Webapps"}) - public void testCountsUpdateFilesForUninstalledWebApks() throws Exception { + public void testCountsUpdateFilesForUninstalledWebApks() { File directory1 = new File(WebappDirectoryManager.getWebApkUpdateDirectory(), WEBAPK_ID_1); directory1.mkdirs(); File directory2 = new File(WebappDirectoryManager.getWebApkUpdateDirectory(), WEBAPK_ID_2); @@ -221,7 +124,7 @@ */ @Test @Feature({"Webapps"}) - public void testCountsOldWebApkUpdateFiles() throws Exception { + public void testCountsOldWebApkUpdateFiles() { File directory = new File(WebappDirectoryManager.getWebApkUpdateDirectory(), WEBAPK_ID_1); directory.mkdirs(); registerWebapp(WEBAPK_ID_1); @@ -242,7 +145,7 @@ */ @Test @Feature({"Webapps"}) - public void testDoesNotCountFilesForNewlyScheduledUpdates() throws Exception { + public void testDoesNotCountFilesForNewlyScheduledUpdates() { File directory = new File(WebappDirectoryManager.getWebApkUpdateDirectory(), WEBAPK_ID_1); directory.mkdirs(); registerWebapp(WEBAPK_ID_1); @@ -256,8 +159,8 @@ "WebApk.Update.NumStaleUpdateRequestFiles", 1)); } - private void runCleanup() throws Exception { - mWebappDirectoryManager.cleanUpDirectories(mContext, WEBAPP_ID_1); + private void runCleanup() { + WebappDirectoryManager.cleanUpDirectories(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); } }
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 283583b..23c46ea 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-81.0.4000.0_rc-r1-merged.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-81.0.4001.0_rc-r1-merged.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 6b792c286..7724c18 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1545,10 +1545,10 @@ <ph name="BEGIN_BOLD"><b></ph>Note:<ph name="END_BOLD"></b></ph> The system will reboot during the process. </message> <message name="IDS_ENABLE_ARC_ADB_SIDELOADING_SETUP_TITLE" desc="Title of the enable ARC ADB Sideloading screen upon reboot"> - Do you want to proceed? + Enable ADB debugging? </message> <message name="IDS_ENABLE_ARC_ADB_SIDELOADING_SETUP_MESSAGE" desc="Setup message in dialog for enabling ARC ADB Sideloading."> - Continuing will enable ADB debugging for creating and testing Android apps. Note that ADB debugging allows installation of test apps that haven't been verified by Google. + Continuing will enable ADB debugging for creating and testing Android apps. Note that this action allows installation of Android apps that haven't been verified by Google, and requires a factory reset to disable. </message> <message name="IDS_ENABLE_ARC_ADB_SIDELOADING_SETUP_ILLUSTRATION_TITLE" desc="Accessible title of ARC ADB sideloading illustration depicting the setup screen."> Enabling adb to create apps illustration
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index da32d2c..afe187a 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromiumএ ডিফ’ল্ট ব্ৰাউজাৰ নির্ধাৰণ বা ছেট কৰিব নোৱাৰে</translation> <translation id="2008474315282236005">এইটোৱে এই ডিভাইচটোৰ পৰা ১টা বস্তু মচিব। আপোনাৰ ডেটা পাছত পুনৰুদ্ধাৰ কৰিবলৈ Chromiumত <ph name="USER_EMAIL" /> হিচাপে ছাইন ইন কৰক।</translation> <translation id="2119636228670142020">&Chromium OSৰ বিষয়ে</translation> +<translation id="2147976119693222405">Chromium OSএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰিলে। এতিয়াই সমাধান কৰক।</translation> <translation id="2241627712206172106">আপুনি যদি কোনো কম্পিউটাৰ শ্বেয়াৰ কৰে, আপোনাৰ বন্ধুবৰ্গ আৰু পৰিয়ালে পৃথককৈ ব্ৰাউজ কৰিব পাৰে আৰু তেওঁলোকে বিচৰা ধৰণে Chromium ছেট আপ কৰিব পাৰে।</translation> <translation id="2347108572062610441">আপুনি Chromium আৰম্ভ কৰিলে কি পৃষ্ঠা দেখুওৱা হ‘ব এই এক্সটেনশ্বনটোৱে সেইটো সলনি কৰিছে।</translation> <translation id="2396765026452590966">আপুনি Chromium আৰম্ভ কৰিলে কোনটো পৃষ্ঠা দেখুওৱা হ’ব সেয়া "<ph name="EXTENSION_NAME" />" এক্সটেনশ্বনে সলনি কৰিছে৷</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">অতিৰিক্ত সুৰক্ষাৰ বাবে Chromiumএ আপোনাৰ ডেটা এনক্ৰিপ্ট কৰিব।</translation> <translation id="2770231113462710648">ইয়ালৈ ডিফ’ল্ট ব্ৰাউজাৰ সলনি কৰক:</translation> <translation id="2799223571221894425">পুনৰ লঞ্চ কৰক</translation> +<translation id="2805036593126168338">Chromium OSএ আপোনাৰ পাছৱৰ্ডসমূহ ছিংক কৰিব নোৱাৰিলে। এতিয়াই সমাধান কৰক।</translation> <translation id="2838154144102149890">আপডে'ট কৰিবলৈ এই কম্পিউটাৰত Chromium বন্ধ হ'ব লাগিব। ইয়াৰ ফলত এই কম্পিউটাৰত লগ ইন কৰা অন্য ব্যৱহাৰকাৰীসকলে নিজৰ ছেভ নকৰা সাল সলনি কার্যসমূহ হেৰুৱাব পাৰে।</translation> <translation id="2847479871509788944">Chromiumৰপৰা আঁতৰাওক...</translation> <translation id="2886012850691518054">ঐচ্ছিক: স্বয়ংক্ৰিয়ভাৱে Googleলৈ ব্যৱহাৰৰ পৰিসংখ্যা আৰু ক্ৰেশ্ব ৰিপ'ৰ্ট পঠিয়াই Chromiumক উন্নত কৰাত সহায় কৰক।</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index fc16fe1..7ee65c5a 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium defolt brauzeri müəyyən edə və ya ayarlaya bilmir</translation> <translation id="2008474315282236005">1 element cihazdan silinəcək. Sonradan datanızı bərpa etmək üçün <ph name="USER_EMAIL" /> kimi Chromiuma daxil olun.</translation> <translation id="2119636228670142020">Chromium OS haqqında</translation> +<translation id="2147976119693222405">Chromium OS datanızı sinxronizasiya edə bilmədi. İndi düzəliş edin.</translation> <translation id="2241627712206172106">Paylaşılan kompüteriniz varsa, kompüterin paylaşıldığı şəxslər ayrı-ayrılıqda istifadə edə və Chromium'u istədikləri kimi quraşdıra bilər.</translation> <translation id="2347108572062610441">Bu artırma Chromium'u başlatdığınız zaman hansı səhifənin göstərildiyini dəyişdi.</translation> <translation id="2396765026452590966">"<ph name="EXTENSION_NAME" />" artırması Chromium'u başlatdığınız zaman hansı səhifənin göstərildiyini dəyişdi.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Əlavə təhlükəsizlik üçün, Chromium datanızı şifrələyəcək.</translation> <translation id="2770231113462710648">Defolt brauzeri dəyişin:</translation> <translation id="2799223571221894425">Yenidən başladın</translation> +<translation id="2805036593126168338">Chromium OS parollarınızı sinxronizasiya edə bilmədi. İndi düzəliş edin.</translation> <translation id="2838154144102149890">Güncəlləmək üçün bu kompüterdə Chromium dayandırılmalıdır. Bu, həmin kompüterə daxil olmuş digər istifadəçilərin yadda saxlanılmayan dəyişikliklərinin silinməsinə səbəb ola bilər.</translation> <translation id="2847479871509788944">Chromium'dan silin...</translation> <translation id="2886012850691518054">Seçimə görə: İstifadə statistikası və xəta hesabatlarını avtomatik Google'a göndərməklə Chromium tətbiqini təkmilləşdirin.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 9b5e9c4..b599469 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium не можа вызначыць або задаць стандартны браўзер</translation> <translation id="2008474315282236005">Будзе выдалены 1 элемент з гэтай прылады. Каб потым атрымаць свае даныя, увайдзіце ва ўліковы запіс Chromium як <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Пра &Chromium OS</translation> +<translation id="2147976119693222405">Сістэме Chromium OS не ўдалося сінхранізаваць даныя. Вырашыце праблему.</translation> <translation id="2241627712206172106">Калі камп'ютар выкарыстоўваюць некалькі чалавек, кожны з іх можа наладзіць Chromium для сябе і праглядаць старонкі асобна ад іншых.</translation> <translation id="2347108572062610441">Гэта пашырэнне змяніла старонку, якая паказваецца пры запуску Chromium.</translation> <translation id="2396765026452590966">Пашырэнне "<ph name="EXTENSION_NAME" />" змяніла старонку, якая паказваецца пры запуску Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Для большай бяспекі Chromium будзе шыфраваць даныя.</translation> <translation id="2770231113462710648">Зрабіць стандартным наступны браўзер:</translation> <translation id="2799223571221894425">Перазапусціць</translation> +<translation id="2805036593126168338">Сістэме Chromium OS не ўдалося сінхранізаваць паролі. Вырашыце праблему.</translation> <translation id="2838154144102149890">Для абнаўлення браўзеру Chromium трэба спыніць працу на гэтым камп'ютары. Іншыя карыстальнікі, якія ўвайшлі на камп'ютар, могуць страціць незахаваныя змены.</translation> <translation id="2847479871509788944">Выдаліць з Chromium...</translation> <translation id="2886012850691518054">(Неабавязкова.) Дапамажыце палепшыць Chromium, дазволіўшы аўтаматычна адпраўляць у Google статыстыку выкарыстання і справаздачы аб збоях.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index cfbaf8ad..dcff4cb3 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium не може да определи или зададе браузъра по подразбиране</translation> <translation id="2008474315282236005">1 елемент ще се изтрие от това устройство. За да извлечете данните си по-късно, влезте в Chromium като <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Всичко за &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS не синхронизира данните ви. Отстранете проблема.</translation> <translation id="2241627712206172106">Ако споделяте компютър, близките и приятелите ви могат да сърфират отделно и да настроят Chromium точно така, както искат.</translation> <translation id="2347108572062610441">Това разширение промени страницата, която се показва при стартиране на Chromium.</translation> <translation id="2396765026452590966">Разширението „<ph name="EXTENSION_NAME" />“ промени страницата, която се показва при стартиране на Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">За повишаване на сигурността Chromium ще шифрова данните ви.</translation> <translation id="2770231113462710648">Промяна на браузъра по подразбиране с/ъс:</translation> <translation id="2799223571221894425">Стартиране отново</translation> +<translation id="2805036593126168338">Chromium OS не синхронизира паролите ви. Отстранете проблема.</translation> <translation id="2838154144102149890">За да се извърши актуализацията, Chromium трябва да спре работа на този компютър. Това може да доведе до изтриване на незапазените промени на други потребители, които са влезли в профила си на този компютър.</translation> <translation id="2847479871509788944">Премахване от Chromium...</translation> <translation id="2886012850691518054">По избор: Помогнете ни да подобрим Chromium, като автоматично изпращате на Google статистически данни за използването му и сигнали за сривове.</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 13ecf07..de409ac 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -22,7 +22,7 @@ <translation id="1966382378801805537">Chromium ne može utvrditi niti postaviti zadani preglednik</translation> <translation id="2008474315282236005">Ovim će se izbrisati jedna stavka s uređaja. Za preuzimanje podataka kasnije, prijavite se u Chromium kao <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">O &Chromium OS-u</translation> -<translation id="2147976119693222405">OS Chromium nije mogao sinkronizirati vaše podatke. Ispravite to odmah.</translation> +<translation id="2147976119693222405">Chromium OS nije uspio sinhronizirati vaše podatke. Ispravi sada.</translation> <translation id="2241627712206172106">Ako dijelite računar, prijatelji i porodica mogu odvojeno pretraživati i postaviti Chromium na način koji njima odgovara.</translation> <translation id="2347108572062610441">Ova ekstenzija je promijenila stranicu koja se prikazuje prilikom pokretanja Chromiuma.</translation> <translation id="2396765026452590966">Ekstenzija "<ph name="EXTENSION_NAME" />" je promijenila stranicu koja se prikazuje prilikom pokretanja Chromiuma.</translation> @@ -38,7 +38,7 @@ <translation id="2718390899429598676">Chromium će šifrirati vaše podatke radi dodatne sigurnosti.</translation> <translation id="2770231113462710648">Promijenite zadani preglednik u:</translation> <translation id="2799223571221894425">Ponovo pokreni</translation> -<translation id="2805036593126168338">OS Chromium nije mogao sinkronizirati vaše zaporke. Ispravite to odmah.</translation> +<translation id="2805036593126168338">Chromium OS nije uspio sinhronizirati vaše lozinke. Ispravi sada.</translation> <translation id="2838154144102149890">Za potrebe ažuriranja, Chromium mora prestati raditi na ovom uređaju. Zbog toga drugi korisnici koji su prijavljeni na ovaj računar mogu izgubiti izmjene koje nisu sačuvane.</translation> <translation id="2847479871509788944">Ukloni iz Chromiuma...</translation> <translation id="2886012850691518054">Nije obavezno: Pomozite nam poboljšati Chromium automatskim slanjem Googleu statistika korištenja i izvještaja o padovima aplikacija.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index a8b15f3..01b29db 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium no pot determinar ni definir el navegador predeterminat</translation> <translation id="2008474315282236005">Amb aquesta acció, se suprimirà 1 element d'aquest dispositiu. Per recuperar les teves dades més endavant, inicia la sessió a Chromium com a <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Quant a &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS no ha pogut sincronitzar les teves dades. Soluciona aquest problema.</translation> <translation id="2241627712206172106">Si compartiu un ordinador, els amics i els familiars poden navegar de manera independent i configurar Chromium com vulguin.</translation> <translation id="2347108572062610441">Aquesta extensió ha canviat la pàgina que es mostra quan inicieu Chromium.</translation> <translation id="2396765026452590966">L'extensió <ph name="EXTENSION_NAME" /> ha canviat la pàgina que es mostra quan inicieu Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Per més seguretat, Chromium encriptarà les vostres dades.</translation> <translation id="2770231113462710648">Canvia el navegador predeterminat a:</translation> <translation id="2799223571221894425">Reinicia</translation> +<translation id="2805036593126168338">Chromium OS no ha pogut sincronitzar les teves contrasenyes. Soluciona aquest problema.</translation> <translation id="2838154144102149890">Per fer l'actualització, cal que Chromium deixi d'executar-se en aquest ordinador. Com a conseqüència, és possible que altres usuaris que hagin iniciat la sessió en aquest ordinador perdin els canvis que no hagin desat.</translation> <translation id="2847479871509788944">Suprimeix de Chromium...</translation> <translation id="2886012850691518054">Opcional: ajuda'ns a millorar Chromium enviant estadístiques d'ús i informes d'error a Google automàticament.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index bec2859..31b6b01 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium nemůže určit ani nastavit výchozí prohlížeč</translation> <translation id="2008474315282236005">Z tohoto zařízení bude smazána 1 položka. Budete-li chtít své údaje později načíst, přihlaste se do prohlížeče Chromium jako <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">O systému &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS vaše data nemohl synchronizovat. Vyřešit.</translation> <translation id="2241627712206172106">Pokud počítač sdílíte s kamarády a členy rodiny, každý může web procházet samostatně a nastavit si Chromium podle svých požadavků.</translation> <translation id="2347108572062610441">Toto rozšíření změnilo stránku, která se zobrazí při spuštění prohlížeče Chromium.</translation> <translation id="2396765026452590966">Rozšíření <ph name="EXTENSION_NAME" /> změnilo stránku, která se zobrazí při spuštění prohlížeče Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">V zájmu lepšího zabezpečení bude Chromium šifrovat vaše data.</translation> <translation id="2770231113462710648">Změnit výchozí prohlížeč na:</translation> <translation id="2799223571221894425">Restartovat</translation> +<translation id="2805036593126168338">Chromium OS vaše hesla nemohl synchronizovat. Vyřešit.</translation> <translation id="2838154144102149890">Aby prohlížeč Chromium bylo možné aktualizovat, je třeba ho na tomto počítači ukončit. Může to vést ke ztrátě neuložených změn u ostatních uživatelů, kteří jsou na tomto počítači přihlášeni.</translation> <translation id="2847479871509788944">Odstranit z prohlížeče Chromium...</translation> <translation id="2886012850691518054">Volitelné: Pomozte Chromium zlepšit – posílejte automaticky společnosti Google statistiky o využívání a zprávy o selhání aplikace.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 1a4081e..9fd11f9 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium kan ikke fastlægge eller angive standardbrowseren</translation> <translation id="2008474315282236005">Denne handling sletter ét element på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Om &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS kunne ikke synkronisere dine data. Løs problemet nu.</translation> <translation id="2241627712206172106">Hvis du deler en computer, kan venner og familie browse individuelt og konfigurere Chromium, som de ønsker hver især.</translation> <translation id="2347108572062610441">Denne udvidelse har ændret din startside i Chromium.</translation> <translation id="2396765026452590966">Udvidelsen "<ph name="EXTENSION_NAME" />" har ændret din startside i Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Som et ekstra sikkerhedsniveau krypterer Chromium dine data.</translation> <translation id="2770231113462710648">Skift standardbrowser til:</translation> <translation id="2799223571221894425">Genstart</translation> +<translation id="2805036593126168338">Chromium OS kunne ikke synkronisere dine adgangskoder. Løs problemet nu.</translation> <translation id="2838154144102149890">Chromium skal standses på denne computer, før du kan opdatere. Det kan medføre, at andre brugere, som er logget ind på computeren, mister ændringer, der ikke er gemt.</translation> <translation id="2847479871509788944">Fjern fra Chromium...</translation> <translation id="2886012850691518054">Valgfrit: Hjælp med at gøre Chromium bedre ved automatisk at sende forbrugsstatistik og nedbrudsrapporter til Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index cd4f872..6de1a3d 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium kann den Standardbrowser nicht bestimmen oder festlegen</translation> <translation id="2008474315282236005">Dadurch wird 1 Element von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als <ph name="USER_EMAIL" /> in Chromium an.</translation> <translation id="2119636228670142020">Über &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS konnte Ihre Daten nicht synchronisieren. Jetzt beheben.</translation> <translation id="2241627712206172106">Bei gemeinsam genutzten Computern können die verschiedenen Personen separat surfen und Chromium jeweils nach ihren Wünschen einrichten.</translation> <translation id="2347108572062610441">Die beim Start von Chromium angezeigte Seite wurde durch diese Erweiterung geändert.</translation> <translation id="2396765026452590966">Die beim Start von Chromium angezeigte Seite wurde durch die Erweiterung <ph name="EXTENSION_NAME" /> geändert.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Chromium verschlüsselt Ihre Daten zur Erhöhung der Sicherheit.</translation> <translation id="2770231113462710648">Standardbrowser ändern in:</translation> <translation id="2799223571221894425">Neu starten</translation> +<translation id="2805036593126168338">Chromium OS konnte Ihre Passwörter nicht synchronisieren. Jetzt beheben.</translation> <translation id="2838154144102149890">Zum Aktualisieren muss Chromium auf diesem Computer geschlossen werden. Nicht gespeicherte Änderungen von anderen Nutzern, die auf diesem Computer angemeldet sind, gehen dann eventuell verloren.</translation> <translation id="2847479871509788944">Aus Chromium entfernen...</translation> <translation id="2886012850691518054">Optional: Unterstützen Sie Google bei der Verbesserung von Chromium durch automatisches Senden von Nutzungsstatistiken und Absturzberichten.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 0ee7426..54d1092a 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium no puede determinar ni establecer el navegador predeterminado</translation> <translation id="2008474315282236005">Esta acción borrará 1 elemento de este dispositivo. Si más adelante deseas recuperar los datos, accede a tu cuenta en Chromium como <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Acerca de &Chromium OS</translation> +<translation id="2147976119693222405">El Sistema operativo Chromium no pudo sincronizar los datos. Soluciona el problema ahora.</translation> <translation id="2241627712206172106">Si compartes una computadora, tus amigos y familiares pueden navegar de forma independiente y configurar Chromium según los gustos individuales.</translation> <translation id="2347108572062610441">Esta extensión cambió la página que se muestra al iniciar Chromium.</translation> <translation id="2396765026452590966">La extensión "<ph name="EXTENSION_NAME" />" cambió la página que se muestra al iniciar Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Para mayor seguridad, Chromium encriptará los datos.</translation> <translation id="2770231113462710648">Cambiar el navegador predeterminado a:</translation> <translation id="2799223571221894425">Reiniciar</translation> +<translation id="2805036593126168338">El Sistema operativo Chromium no pudo sincronizar tus contraseñas. Soluciona el problema ahora.</translation> <translation id="2838154144102149890">Para actualizarse, Chromium debe dejar de ejecutarse en esta computadora. Es posible que esta acción haga que los usuarios que accedieron en esta computadora pierdan cambios no guardados.</translation> <translation id="2847479871509788944">Eliminar de Chromium…</translation> <translation id="2886012850691518054">Opcional: Ayúdanos a mejorar Chromium enviando estadísticas de uso e informes de errores a Google de manera automática.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index 381b3da..adb611e2 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium no puede determinar ni establecer el navegador predeterminado</translation> <translation id="2008474315282236005">Se eliminará un elemento de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chromium como <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Información de &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS no ha podido sincronizar los datos. Soluciónalo ahora.</translation> <translation id="2241627712206172106">Si compartes un ordenador, tus amigos y familiares pueden navegar de forma independiente y configurar Chromium a su gusto.</translation> <translation id="2347108572062610441">Esta extensión ha cambiado la página que se muestra al iniciar Chromium.</translation> <translation id="2396765026452590966">La extensión <ph name="EXTENSION_NAME" /> ha cambiado la página que se muestra al iniciar Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Para mayor seguridad, Chromium cifrará tus datos.</translation> <translation id="2770231113462710648">Cambiar navegador predeterminado por:</translation> <translation id="2799223571221894425">Reiniciar</translation> +<translation id="2805036593126168338">Chromium OS no ha podido sincronizar las contraseñas. Soluciónalo ahora.</translation> <translation id="2838154144102149890">Para actualizar, es necesario que Chromium deje de estar en uso en este ordenador. Es posible que otros usuarios que hayan iniciado sesión en este ordenador pierdan los cambios que no han guardado.</translation> <translation id="2847479871509788944">Desinstalar de Chromium...</translation> <translation id="2886012850691518054">Opcional: ayudar a mejorar Chromium enviando automáticamente a Google estadísticas de uso e informes de errores</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 6d8ed3c..39b047d 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium ei saa määrata ega seadistada vaikebrauserit</translation> <translation id="2008474315282236005">See kustutab seadmest ühe üksuse. Hiljem oma andmete toomiseks logige Chromiumi sisse kasutajana <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Teave &Chromium OS-i kohta</translation> +<translation id="2147976119693222405">Chromium OS ei saanud teie andmeid sünkroonida. Parandage kohe.</translation> <translation id="2241627712206172106">Kui jagate arvutit, saavad sõbrad ja pereliikmed eraldi sirvida ning seadistada Chromiumi just nii, nagu neile meeldib.</translation> <translation id="2347108572062610441">See laiendus muutis seda, milline leht kuvatakse Chromiumi käivitamisel.</translation> <translation id="2396765026452590966">Laiendus „<ph name="EXTENSION_NAME" />” muutis seda, milline leht kuvatakse Chromiumi käivitamisel.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Turvalisuse suurendamiseks krüptib Chromium teie andmed.</translation> <translation id="2770231113462710648">Asenda vaikebrauser:</translation> <translation id="2799223571221894425">Taaskäivita</translation> +<translation id="2805036593126168338">Chromium OS ei saanud teie paroole sünkroonida. Parandage kohe.</translation> <translation id="2838154144102149890">Värskendamiseks peab Chromiumi selles arvutis sulgema. Seetõttu võivad teiste sellesse arvutisse sisselogitud kasutajate salvestamata muudatused kaotsi minna.</translation> <translation id="2847479871509788944">Chromiumist eemaldamine ...</translation> <translation id="2886012850691518054">Valikuline: aidake muuta Chromiumi paremaks, saates Google'ile automaatselt kasutusstatistikat ja krahhiaruandeid.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 816c0d7..fcb1c14 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium نمیتواند مرورگر پیشفرض را تعیین یا تنظیم کند</translation> <translation id="2008474315282236005">این کار یک مورد را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation> <translation id="2119636228670142020">درباره &سیستم عامل Chromium </translation> +<translation id="2147976119693222405">سیستمعامل Chromium نتوانست دادههایتان را همگامسازی کند. اکنون مشکل رفع شود.</translation> <translation id="2241627712206172106">اگر رایانهای را به صورت مشترک استفاده میکنید، دوستان و خانواده میتوانند به صورت جداگانه مرور کنند و Chromium را به صورتی که مایلند تنظیم کنند.</translation> <translation id="2347108572062610441">این افزونه، صفحهای را تغییر داده است که هنگام راهاندازی Chromium نشان داده میشود.</translation> <translation id="2396765026452590966">افزونه «<ph name="EXTENSION_NAME" />»، صفحهای را تغییر داده است که هنگام راهاندازی Chromium نشان داده میشود.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">برای امنیت بیشتر، Chromium دادههای شما را رمزگذاری میکند.</translation> <translation id="2770231113462710648">تغییر مرورگر پیشفرض به:</translation> <translation id="2799223571221894425">راهاندازی مجدد</translation> +<translation id="2805036593126168338">سیستمعامل Chromium نتوانست گذرواژههایتان را همگامسازی کند. اکنون مشکل رفع شود.</translation> <translation id="2838154144102149890">برای بهروزرسانی، Chromium باید در این رایانه متوقف شود. شاید با این کار، تغییرات ذخیرهنشده کاربرانی که در این رایانه به سیستم وارد شدهاند، از دست برود.</translation> <translation id="2847479871509788944">حذف از Chromium...</translation> <translation id="2886012850691518054">اختیاری: با ارسال خودکار آمار کاربرد و گزارشهای خرابی برنامه به Chromium، به پیشرفت Chrome کمک کنید.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 96722d8..341171f 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Hindi matukoy o maitakda ng Chromium ang default na browser</translation> <translation id="2008474315282236005">Magde-delete ito ng 1 item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Tungkol sa &Chromium OS</translation> +<translation id="2147976119693222405">Hindi ma-sync ng Chromium OS ang iyong data. Ayusin ngayon.</translation> <translation id="2241627712206172106">Kung nagpapahiram ka ng computer, ang mga kaibigan at kapamilya ay maaaring mag-browse nang hiwalay at i-set up ang Chromium sa paraang gusto nila.</translation> <translation id="2347108572062610441">Binago ng extension na ito ang ipinapakitang page kapag sinimulan mo ang Chronium.</translation> <translation id="2396765026452590966">Binago ng extension na "<ph name="EXTENSION_NAME" />" ang ipinapakitang page kapag sinimulan mo ang Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Para sa karagdagang seguridad, ie-encrypt ng Chromium ang iyong data.</translation> <translation id="2770231113462710648">Baguhin ang default na browser sa:</translation> <translation id="2799223571221894425">Ilunsad Muli</translation> +<translation id="2805036593126168338">Hindi ma-sync ng Chromium ang iyong mga password. Ayusin ngayon.</translation> <translation id="2838154144102149890">Para i-update, kailangang huminto sa pagtakbo ng Chromium sa computer na ito. Puwedeng magdulot ito sa iba pang user na naka-log in sa computer na ito na mawala ang mga hindi naka-save na pagbabago.</translation> <translation id="2847479871509788944">Alisin sa Chromium...</translation> <translation id="2886012850691518054">Opsyonal: Tumulong na pahusayin ang Chromium sa pamamagitan ng awtomatikong pagpapadala sa Google ng mga istatistika ng paggamit at mga ulat ng pag-crash.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index c6dcfe3..29f113f 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ne parvient pas à déterminer quel est le navigateur par défaut ou à le définir</translation> <translation id="2008474315282236005">Cette action entraînera la suppression d'un élément de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chromium en tant que <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">À propos de &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS n'a pas pu synchroniser vos données. Corriger maintenant.</translation> <translation id="2241627712206172106">Si vous partagez un ordinateur avec vos proches, ceux-ci peuvent configurer Google Chrome comme bon leur semble et naviguer sur le Web à leur manière.</translation> <translation id="2347108572062610441">Cette extension a modifié la page qui s'affiche au démarrage de Chromium.</translation> <translation id="2396765026452590966">L'extension « <ph name="EXTENSION_NAME" /> » a modifié la page qui s'affiche au démarrage de Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Pour une sécurité accrue, Chromium va chiffrer vos données.</translation> <translation id="2770231113462710648">Remplacer le navigateur par défaut par :</translation> <translation id="2799223571221894425">Redémarrer</translation> +<translation id="2805036593126168338">Chromium OS n'a pas pu synchroniser vos mots de passe. Corriger maintenant.</translation> <translation id="2838154144102149890">Pour installer la mise à jour, vous devez fermer Chromium sur cet ordinateur. Cela pourrait engendrer la perte de modifications non enregistrées pour d'autres utilisateurs connectés à cet ordinateur.</translation> <translation id="2847479871509788944">Supprimer de Chromium...</translation> <translation id="2886012850691518054">Facultatif : aidez-nous à améliorer Chromium en envoyant automatiquement des statistiques d'utilisation et des rapports d'erreur à Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index 0ae9d71..ec5638b 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium non pode determinar nin establecer o navegador predeterminado</translation> <translation id="2008474315282236005">Esta acción eliminará 1 elemento deste dispositivo. Para recuperar os teus datos máis tarde, inicia sesión en Chromium como <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Acerca de &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS non puido sincronizar os teus datos. Corríxeo agora.</translation> <translation id="2241627712206172106">Se compartes un ordenador, os teus amigos e familiares poderán navegar por separado e configurar Chromium como prefiran.</translation> <translation id="2347108572062610441">Esta extensión cambiou a páxina que se mostra ao iniciar Chromium.</translation> <translation id="2396765026452590966">A extensión "<ph name="EXTENSION_NAME" />" cambiou a páxina que se mostra ao iniciar Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Para obter unha maior seguranza, Chromium encriptará os teus datos.</translation> <translation id="2770231113462710648">Cambiar o navegador predeterminado a:</translation> <translation id="2799223571221894425">Iniciar de novo</translation> +<translation id="2805036593126168338">Chromium OS non puido sincronizar os teus contrasinais. Corríxeo agora.</translation> <translation id="2838154144102149890">Para aplicar a actualización, é necesario que Chromium deixe de executarse neste ordenador, o que pode provocar que outros usuarios que iniciasen sesión nel perdan os cambios non gardados.</translation> <translation id="2847479871509788944">Eliminar de Chromium...</translation> <translation id="2886012850691518054">Opcional: axuda a mellorar Chromium mediante o envío automático de estatísticas de uso e informes de erros a Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 9ac759b..a528fa21 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ડિફૉલ્ટ બ્રાઉઝરને નિર્ધારિત અથવા સેટ કરી શકતું નથી</translation> <translation id="2008474315282236005">આ, 1 આઇટમને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromium માં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> <translation id="2119636228670142020">&Chromium OS વિશે</translation> +<translation id="2147976119693222405">Chromium OS તમારા ડેટાને સિંક કરી શક્યું નથી. હમણાં જ સુધારો.</translation> <translation id="2241627712206172106">જો તમે કમ્પ્યુટરને શેર કરો છો, તો મિત્રો અને કુટુંબીજનો અલગ-અલગ બ્રાઉઝ કરી અને તેમને જોઇએ તેમ Chromium ને સેટ કરી શકે છે.</translation> <translation id="2347108572062610441">જ્યારે તમે Chromium શરૂ કરો છો ત્યારે જે પૃષ્ઠ દર્શાવવામાં આવે છે તે આ એક્સટેન્શને બદલ્યું છે.</translation> <translation id="2396765026452590966">જ્યારે તમે Chromium શરૂ કરો છો ત્યારે જે પૃષ્ઠ દર્શાવવામાં આવે છે તે <ph name="EXTENSION_NAME" /> એક્સટેન્શને બદલ્યું છે.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">ઉમેરેલી સુરક્ષા માટે, Chromium તમારા ડેટાને એન્ક્રિપ્ટ કરશે.</translation> <translation id="2770231113462710648">ડિફૉલ્ટ બ્રાઉઝરને આના પર બદલો:</translation> <translation id="2799223571221894425">ફરીથી લોંચ કરો</translation> +<translation id="2805036593126168338">Chromium OS તમારા પાસવર્ડને સિંક કરી શક્યું નથી. હમણાં જ સુધારો.</translation> <translation id="2838154144102149890">અપડેટ થવા માટે, આ કમ્પ્યુટર પર Chromium ચાલતું બંધ થવું જરૂરી છે. આના કારણે, આ કમ્પ્યુટરમાં લૉગ ઇન થયેલા બીજા વપરાશકર્તાઓના સાચવ્યા વિનાના ફેરફારો ગુમ થઈ શકે છે.</translation> <translation id="2847479871509788944">Chromium માંથી દૂર કરો...</translation> <translation id="2886012850691518054">વૈકલ્પિક: ઉપયોગનાં આંકડાઓ અને ક્રૅશ રીપોર્ટ્સ ઑટોમૅટિક રીતે Googleને મોકલીને Chromium ને વધુ સારું બનાવવમાં સહાય કરો.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index f0c92af..6954d146 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">क्रोमियम, डिफ़ॉल्ट ब्राउज़र को तय या सेट नहीं कर सकता</translation> <translation id="2008474315282236005">ऐसा करने से इस डिवाइस से 1 आइटम मिट जाएगा. बाद में अपना डेटा पाने के लिए, Chromium में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation> <translation id="2119636228670142020">&क्रोमियम OS के बारे में</translation> +<translation id="2147976119693222405">क्रोमियम OS आपका डेटा सिंक नहीं कर सका. अभी ठीक करें.</translation> <translation id="2241627712206172106">अगर आप किसी कंप्यूटर को शेयर करते हैं, तो दोस्त और परिवार अलग-अलग ब्राउज़ कर सकते हैं और क्रोमियम को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="2347108572062610441">इस एक्सटेंशन ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="2396765026452590966">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">ज़्यादा सुरक्षा के लिए, क्रोमियम आपके डेटा को सुरक्षित करेगा.</translation> <translation id="2770231113462710648">डिफ़ॉल्ट ब्राउज़र को इसमें बदलें:</translation> <translation id="2799223571221894425">फिर से लॉन्च करें</translation> +<translation id="2805036593126168338">क्रोमियम OS आपके पासवर्ड सिंक नहीं कर सका. अभी ठीक करें.</translation> <translation id="2838154144102149890">अपडेट करने के लिए, क्रोमियम को इस कंप्यूटर पर बंद करना होगा. इससे कंप्यूटर में लॉगिन करने वाले अन्य उपयोगकर्ता वह डेटा खो सकते हैं जिसे सेव नहीं किया गया है.</translation> <translation id="2847479871509788944">क्रोमियम से निकालें...</translation> <translation id="2886012850691518054">वैकल्पिक: अपने आप इस्तेमाल के आंकड़े और खराबी रिपोर्ट Google को भेजकर Chrome को बेहतर बनाने में मदद करें.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 4550b1b..6b97dba6 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">A Chromium problémába ütközött az alapértelmezett böngésző megállapításakor vagy beállításakor</translation> <translation id="2008474315282236005">Ezzel egyetlen elemet töröl erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chromiumba a következő e-mail-címmel: <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">A &Chromium OS névjegye</translation> +<translation id="2147976119693222405">A Chromium OS nem tudta szinkronizálni az adatait. Javítsa most.</translation> <translation id="2241627712206172106">Ha megoszt egy számítógépet, ismerősei és családtagjai külön fiókokban internetezve a saját kívánságaik szerint állíthatják be a Chromiumot.</translation> <translation id="2347108572062610441">Ez a bővítmény módosította, hogy melyik oldal jelenjen meg a Chromium indításakor.</translation> <translation id="2396765026452590966">A(z) <ph name="EXTENSION_NAME" /> bővítmény módosította, hogy melyik oldal jelenjen meg a Chromium indításakor.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">A nagyobb biztonság érdekében a Chromium titkosítja az Ön adatait.</translation> <translation id="2770231113462710648">Alapértelmezett böngésző beállítása:</translation> <translation id="2799223571221894425">Újraindítás</translation> +<translation id="2805036593126168338">A Chromium OS nem tudta szinkronizálni az Ön jelszavait. Javítsa most.</translation> <translation id="2838154144102149890">A frissítéshez le kell állítani a Chromiumot ezen a számítógépen. Ennek következményeként a számítógépen bejelentkezett további felhasználók elveszthetik a nem mentett módosításokat.</translation> <translation id="2847479871509788944">Eltávolítás a Chromiumból…</translation> <translation id="2886012850691518054">Opcionális: Segítsen a Chromium fejlesztésében azáltal, hogy automatikusan elküldi a használati statisztikákat és hibajelentéseket a Google-nak.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 12eaaae8..fe43ae9 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium-ը չի կարողանում որոշել կամ սահմանել կանխադրված դիտարկիչը</translation> <translation id="2008474315282236005">1 տարր կջնջվի այս սարքից: Հետագայում ձեր տվյալներն առբերելու համար մուտք գործեք Chromium <ph name="USER_EMAIL" /> հաշվով:</translation> <translation id="2119636228670142020">Տեղեկություններ &Chromium OS-ի մասին</translation> +<translation id="2147976119693222405">Chromium OS-ը չկարողացավ համաժամացնել ձեր տվյալները։ Շտկել խնդիրը։</translation> <translation id="2241627712206172106">Եթե ձեզնից բացի որևէ այլ մեկն օգտվում է այս համակարգչից, օրինակ ձեր ընկերները կամ հարազատները, ապա նրանք կարող են առանձին աշխատել և կարգավորել Chromium-ն իրենց ուզած ձևով:</translation> <translation id="2347108572062610441">Այս ընդլայնումը փոխել է Chromium-ի մեկնարկի ժամանակ ցուցադրվող էջը:</translation> <translation id="2396765026452590966">«<ph name="EXTENSION_NAME" />» ընդլայնումը փոխել է Chromium-ի մեկնարկի ժամանակ ցուցադրվող էջը:</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Լրացուցիչ անվտանգության համար Chromium-ը կգաղտնագրի ձեր տվյալները:</translation> <translation id="2770231113462710648">Կանխադրված դիտարկիչը դարձնել՝</translation> <translation id="2799223571221894425">Վերագործարկել</translation> +<translation id="2805036593126168338">Chromium OS-ը չկարողացավ համաժամացնել ձեր գաղտնաբառերը։ Շտկել խնդիրը։</translation> <translation id="2838154144102149890">Թարմացման համար անհրաժեշտ է փակել Chromium-ն այս համակարգչում։ Այս համակարգչում մյուս օգտատերերի չպահված փոփոխությունները կարող են կորել։</translation> <translation id="2847479871509788944">Հեռացնել Chromium-ից...</translation> <translation id="2886012850691518054">Կամընտիր. Օգնեք բարելավել Chromium-ը՝ ավտոմատ Google-ին ուղարկելով օգտագործման վիճակագրությունները և խափանումների մասին հաշվետվությունները:</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 3590910..a1e5b66 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium tidak dapat menentukan atau menyetel browser default</translation> <translation id="2008474315282236005">Tindakan ini akan menghapus 1 item dari perangkat. Untuk mengambil data nanti, login ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Tentang &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS tidak dapat menyinkronkan data Anda. Perbaiki sekarang.</translation> <translation id="2241627712206172106">Jika Anda berbagi komputer, teman dan keluarga bisa menjelajah secara terpisah dan menyiapkan Chromium sesuai keinginannya.</translation> <translation id="2347108572062610441">Ekstensi ini telah mengubah apa yang ditampilkan oleh halaman saat Anda memulai Chromium.</translation> <translation id="2396765026452590966">Ekstensi "<ph name="EXTENSION_NAME" />" telah mengubah apa yang ditampilkan oleh halaman saat Anda memulai Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Untuk keamanan tambahan, Chromium akan mengenkripsi data Anda.</translation> <translation id="2770231113462710648">Ubah browser default ke:</translation> <translation id="2799223571221894425">Luncurkan Ulang</translation> +<translation id="2805036593126168338">Chromium OS tidak dapat menyinkronkan sandi Anda. Perbaiki sekarang.</translation> <translation id="2838154144102149890">Untuk menjalankan update, Chromium harus ditutup di komputer ini. Proses ini dapat menyebabkan pengguna lain yang login ke komputer ini kehilangan perubahan yang belum tersimpan.</translation> <translation id="2847479871509788944">Buang dari Chromium...</translation> <translation id="2886012850691518054">Opsional: Bantu menjadikan Chrome lebih baik dengan mengirim statistik penggunaan dan laporan kerusakan secara otomatis ke Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 8f35a727..270603a 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium では既定のブラウザを判定または設定できません</translation> <translation id="2008474315282236005">このデバイスから 1 件の項目を削除します。後でデータを取得するには、<ph name="USER_EMAIL" /> として Chromium にログインしてください。</translation> <translation id="2119636228670142020">Chromium OS について(&C)</translation> +<translation id="2147976119693222405">Chromium OS でデータを同期できませんでした。今すぐ問題を修正してください。</translation> <translation id="2241627712206172106">パソコンを共有している場合、友だちや家族はそれぞれ Chromium を自分専用のブラウザとして自分用の設定をして使うことができます。</translation> <translation id="2347108572062610441">この拡張機能により、Chromium の起動時に表示されるページが変更されました。</translation> <translation id="2396765026452590966">拡張機能「<ph name="EXTENSION_NAME" />」により、Chromium の起動時に表示されるページが変更されました。</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">セキュリティ強化のため、Chromium ではデータが暗号化されます。</translation> <translation id="2770231113462710648">既定のブラウザを変更:</translation> <translation id="2799223571221894425">再起動</translation> +<translation id="2805036593126168338">Chromium OS でパスワードを同期できませんでした。今すぐ問題を修正してください。</translation> <translation id="2838154144102149890">更新するには、このパソコン上の Chromium を終了する必要があります。このパソコンにログインしているユーザーが他にいる場合、保存していない変更が失われる可能性があります。</translation> <translation id="2847479871509788944">Chromium から削除...</translation> <translation id="2886012850691518054">オプション: 使用状況データと障害レポートを Google に自動送信して Chromium の機能向上に役立てる。</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index b9b39637..ae83d4e 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ნაგულისხმევ ბრაუზერს ვერ საზღვრავს, ან ვერ აყენებს</translation> <translation id="2008474315282236005">ეს მოქმედება წაშლის 1 ერთეულს ამ მოწყობილობიდან. თქვენი მონაცემების მოგვიანებით მისაღებად, შედით Chromium-ში, როგორც <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">&Chromium OS-ის შესახებ</translation> +<translation id="2147976119693222405">Chromium OS-მა ვერ მოახერხა თქვენი მონაცემების სინქრონიზაცია. შეასწორეთ ახლავე.</translation> <translation id="2241627712206172106">თუ თქვენ გაზიარებული გაქვთ კომპიუტერი, თქვენი მეგობრები და ოჯახის წევრები შეძლებენ დამოუკიდებლად დათვალიერებას და Chromium-ის დაყენებას სურვილისამებრ.</translation> <translation id="2347108572062610441">ამ გაფართოებამ თქვენ მიერ Chromium-ის გაშვებისას ნაჩვენები გვერდი შეცვალა.</translation> <translation id="2396765026452590966">გაფართოებამ „<ph name="EXTENSION_NAME" />“ თქვენ მიერ Chromium-ის გაშვებისას ნაჩვენები გვერდი შეცვალა.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">დამატებითი უსაფრთხოებისთვის, Chromium თქვენს მონაცემებს დაშიფრავს.</translation> <translation id="2770231113462710648">შეცვალეთ ნაგულისხმევი ბრაუზერი-ით:</translation> <translation id="2799223571221894425">ხელახლა გაშვება</translation> +<translation id="2805036593126168338">Chromium OS-მა ვერ მოახერხა თქვენი პაროლების სინქრონიზაცია. შეასწორეთ ახლავე.</translation> <translation id="2838154144102149890">გასაახლებლად Chromium-მა უნდა შეწყვიტოს მუშაობა ამ კომპიუტერზე. აღნიშნულის შედეგად ამ კომპიუტერში შესულმა სხვა მომხმარებლებმა შესაძლოა დაკარგონ შეუნახავი ცვლილებები.</translation> <translation id="2847479871509788944">Chromium-იდან ამოღება...</translation> <translation id="2886012850691518054">არასავალდებულო: დაგვეხმარეთ Chromium-ის გაუმჯობესებაში, გამოყენების სტატისტიკისა და შეცდომების შესახებ მოხსენების Google-ში ავტომატური გაგზავნის გზით.</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index d9327301..24173f6 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium әдепкі браузерді анықтай не орната алмайды</translation> <translation id="2008474315282236005">Құрылғыдан 1 элемент жойылады. Деректерді кейінірек алу үшін Chromium браузеріне <ph name="USER_EMAIL" /> болып кіріңіз.</translation> <translation id="2119636228670142020">&Chromium OS туралы</translation> +<translation id="2147976119693222405">Chromium OS деректеріңізді синхрондай алмады. Қазір түзету.</translation> <translation id="2241627712206172106">Компьютерді бөлісетін болсаңыз, достарыңыз интернетке бөлек кіріп, Chromium жүйесін қалауынша орната алады.</translation> <translation id="2347108572062610441">Бұл кеңейтім Chromium браузерін іске қосқан кезде көрсетілетін бетті өзгертті.</translation> <translation id="2396765026452590966">«<ph name="EXTENSION_NAME" />» кеңейтімі Chromium браузерін іске қосқан кезде көрсетілетін бетті өзгертті.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Қосымша қауіпсіздік үшін Chromium деректеріңізді шифрлайды.</translation> <translation id="2770231113462710648">Әдепкі браузерді келесіге өзгерту:</translation> <translation id="2799223571221894425">Қайта іске қосу</translation> +<translation id="2805036593126168338">Chromium OS құпия сөздеріңізді синхрондай алмады. Қазір түзету.</translation> <translation id="2838154144102149890">Chromium браузерін жаңарту үшін ол осы компьютерде жұмысын тоқтатуы керек. Бұл компьютердегі есептік жазбасына кірген пайдаланушылардың сақталмаған өзгерістері жоғалып кетуі мүмкін.</translation> <translation id="2847479871509788944">Chromium жүйесінен алып тастау…</translation> <translation id="2886012850691518054">Қосымша: Google компаниясына пайдалану статистикасы мен жаңылыс есептерін автоматты түрде жіберу арқылы Chromium қызметін жақсартуға көмектесіңіз.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index bc48dd7..a1e20df 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium មិនអាចសម្រេចយក ឬកំណត់កម្មវិធីរុករកលំនាំដើមបានទេ</translation> <translation id="2008474315282236005">វានឹងលុបធាតុ 1 ចេញពីឧបករណ៍នេះ។ ដើម្បីទាញយកទិន្នន័យរបស់អ្នកមកវិញនៅពេលក្រោយ សូមចូលទៅកាន់ Chromium ជា <ph name="USER_EMAIL" /> ។</translation> <translation id="2119636228670142020">អំពី Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS មិនអាចធ្វើសមកាលកម្មទិន្នន័យរបស់អ្នកបានទេ។ ដោះស្រាយឥឡូវនេះ។</translation> <translation id="2241627712206172106">ប្រសិនបើអ្នកចែករំលែកកុំព្យូទ័រ មិត្តភ័ក្ត និងគ្រួសារអាចរុករកដាច់ដោយឡែក ហើយតំឡើង Chromium តាមរបៀបដែលអ្នកចង់បាន។</translation> <translation id="2347108572062610441">កម្មវិធីបន្ថែមនេះបានប្តូរអ្វីដែលបានបង្ហាញនៅលើទំព័រនៅពេលអ្នកចាប់ផ្តើម Chromium។</translation> <translation id="2396765026452590966">កម្មវិធីបន្ថែម "<ph name="EXTENSION_NAME" />" បានប្តូរអ្វីដែលបានបង្ហាញនៅលើទំព័រនៅពេលអ្នកចាប់ផ្តើម Chromium។</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម Chromium នឹងអ៊ិនគ្រីបទិន្នន័យរបស់អ្នក។</translation> <translation id="2770231113462710648">ប្តូរកម្មវិធីរុករកលំនាំដើមទៅ៖</translation> <translation id="2799223571221894425">បើកដំណើរការឡើងវិញ</translation> +<translation id="2805036593126168338">Chromium OS មិនអាចធ្វើសមកាលកម្មពាក្យសម្ងាត់របស់អ្នកបានទេ។ ដោះស្រាយឥឡូវនេះ។</translation> <translation id="2838154144102149890">ដើម្បីដំឡើងកំណែ Chromium ត្រូវឈប់ដំណើរការនៅលើកុំព្យូទ័រនេះ។ ការធ្វើបែបនេះអាចបណ្ដាញឱ្យបាត់បង់ការផ្លាស់ប្ដូរ ដែលមិនបានរក្សាទុកសម្រាប់អ្នកប្រើប្រាស់ដែលបានចូលកុំព្យូទ័រនេះ។</translation> <translation id="2847479871509788944">ដកចេញពី Chromium...</translation> <translation id="2886012850691518054">ស្រេចចិត្ត៖ ជួយធ្វើឲ្យ Chromium ប្រសើរជាងមុនដោយការផ្ញើស្ថិតិការប្រើប្រាស់ និងរបាយការណ៍ការគាំងទៅ Google ដោយស្វ័យប្រវត្តិ។</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 93825df..43ffd67 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium에서 기본 브라우저를 확인하거나 설정할 수 없습니다.</translation> <translation id="2008474315282236005">항목 1개가 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chromium에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation> <translation id="2119636228670142020">Chromium OS 정보</translation> +<translation id="2147976119693222405">Chromium OS에서 데이터를 동기화할 수 없습니다. 지금 문제를 해결해 주세요.</translation> <translation id="2241627712206172106">컴퓨터를 공유하는 경우 친구와 가족이 개별적으로 탐색하고 원하는 대로 Chromium을 설정할 수 있습니다.</translation> <translation id="2347108572062610441">Chromium을 시작하면 표시되는 페이지가 이 확장 프로그램으로 인해 변경되었습니다.</translation> <translation id="2396765026452590966">Chromium을 시작하면 표시되는 페이지가 '<ph name="EXTENSION_NAME" />' 확장 프로그램으로 인해 변경되었습니다.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">보안 강화를 위해 Chromium에서 사용자 데이터를 암호화합니다.</translation> <translation id="2770231113462710648">다음으로 기본 브라우저 변경:</translation> <translation id="2799223571221894425">다시 시작</translation> +<translation id="2805036593126168338">Chromium OS에서 비밀번호를 동기화할 수 없습니다. 지금 문제를 해결해 주세요.</translation> <translation id="2838154144102149890">업데이트하려면 이 컴퓨터에서 Chromium 실행을 중단해야 합니다. 중단하면 이 컴퓨터에 로그인한 다른 사용자가 저장하지 않은 변경 사항을 잃을 수 있습니다.</translation> <translation id="2847479871509788944">Chromium에서 제거...</translation> <translation id="2886012850691518054">선택사항: 사용 통계 및 비정상 종료 보고서가 Google로 자동 전송되도록 선택하시면 Chromium을 개선하는 데 도움이 됩니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index 8dded0c1f..f921d58 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium демейки серепчини аныктап же коё албай жатат</translation> <translation id="2008474315282236005">Ушуну менен түзмөктөгү 1 нерсе жок кылынат. Дайындарыңызды кийинчерээк чыгарып алуу үчүн Chromium'га <ph name="USER_EMAIL" /> каттоо эсеби менен кириңиз.</translation> <translation id="2119636228670142020">&Chromium OS жөнүндө</translation> +<translation id="2147976119693222405">Chromium OS маалыматыңызды шайкештештире албай койду. Азыр оңдоо.</translation> <translation id="2241627712206172106">Компьютерди бөлүшсөңүз, жакындарыңыз өзүнчө серептеп, Chromium'ду өзүлөрү каалагандай орнотуп алышат.</translation> <translation id="2347108572062610441">Бул кеңейтүү Chromium иштеп баштаганда көрсөтүлө турган бетти өзгөрттү.</translation> <translation id="2396765026452590966">"<ph name="EXTENSION_NAME" />" кеңейтүүсү Chromium иштеп баштаганда көрсөтүлө турган бетти өзгөрттү.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Кошумча коопсуздук үчүн, Chromium дайындарыңызды шифрлейт.</translation> <translation id="2770231113462710648">Демейки серепчини төмөнкүгө өзгөртүү:</translation> <translation id="2799223571221894425">Кайра ишке киргизүү</translation> +<translation id="2805036593126168338">Chromium OS сырсөздөрүңүздү шайкештештире албай койду. Азыр оңдоо.</translation> <translation id="2838154144102149890">Жаңыртуу үчүн, Chromium'ду бул компьютерде жабуу керек. Компьютерге кирип турган башка колдонуучулардын сакталбаган өзгөртүүлөрү өчүп калышы мүмкүн.</translation> <translation id="2847479871509788944">Chromium'дан чыгарып салуу…</translation> <translation id="2886012850691518054">Кошумча: Google'га автоматтык түрдө колдонуу статистикасын жөнөтүп, каталар жөнүндө кабар берүү менен, Chromium'ду өркүндөтүүгө кол кабыш кылыңыз.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 171fd751..3c40010d 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ບໍ່ສາມາດກຳນົດ ຫຼື ຕັ້ງໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນໄດ້</translation> <translation id="2008474315282236005">ນີ້ຈະລຶບ 1 ລາຍການອອກຈາກອຸປະກອນນີ້. ເພື່ອກູ້ຂໍ້ມູນຂອງທ່ານຄືນໃນພາຍຫຼັງ, ກະລຸນາເຂົ້າສູ່ລະບົບ Chromium ເປັນ <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">ກ່ຽວກັບ Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS ບໍ່ສາມາດຊິ້ງຂໍ້ມູນຂອງທ່ານໄດ້. ແກ້ໄຂຕອນນີ້ເລີຍ.</translation> <translation id="2241627712206172106">ຖ້າທ່ານແຊຣ໌ຄອມພິວເຕີ, ໝູ່ເພື່ອນ ແລະຄອບຄົວຂອງທ່ານ ສາມາດທ່ອງເນັດໄດ້ແຍກຕ່າງຫາກ ແລະຕັ້ງ Chromium ໄດ້ຕາມແບບທີ່ພວກເຂົາຕ້ອງການ.</translation> <translation id="2347108572062610441">ສ່ວນຂະຫຍາຍນີ້ໄດ້ປ່ຽນສິ່ງທີ່ໜ້າສະແດງຂຶ້ນ ເມື່ອທ່ານເລີ່ມຕົ້ນ Chromium.</translation> <translation id="2396765026452590966">ສ່ວນຂະຫຍາຍ "<ph name="EXTENSION_NAME" />" ໄດ້ປ່ຽນສິ່ງທີ່ໜ້າສະແດງຂຶ້ນ ເມື່ອທ່ານເລີ່ມຕົ້ນ Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, Chromium ຈະເຂົ້າລະຫັດຂໍ້ມູນຂອງທ່ານ.</translation> <translation id="2770231113462710648">ປ່ຽນບຣາວເຊີມາດຕະຖານເປັນ:</translation> <translation id="2799223571221894425">ເລີ່ມເປີດໃຊ້ໃໝ່</translation> +<translation id="2805036593126168338">Chromium OS ບໍ່ສາມາດຊິ້ງຂໍ້ມູນລະຫັດຜ່ານຂອງທ່ານໄດ້. ແກ້ໄຂຕອນນີ້ເລີຍ.</translation> <translation id="2838154144102149890">ເພື່ອອັບເດດ, Chromium ຈໍາເປັນຕ້ອງຢຸດການເປີດໃຊ້ໃນຄອມພິວເຕີນີ້. ນີ້ອາດຈະເຮັດໃຫ້ຜູ້ໃຊ້ອື່ນທີ່ເຂົ້າສູ່ລະບົບຄອມພິວເຕີນີ້ສູນເສຍການປ່ຽນແປງທີ່ບໍ່ໄດ້ບັນທຶກໄວ້.</translation> <translation id="2847479871509788944">ເອົາອອກຈາກ Chromium...</translation> <translation id="2886012850691518054">ເລືອກໄດ້: ຊ່ວຍເຮັດໃຫ້ Chromium ດີກ່ວາ່ ໂດຍການສົ່ງສະຖິຕິການໃຊ້ ແລະລາຍງານການຂັດຂ້ອງຫາ Google ໂດຍອັດຕະໂນມັດ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index 4903d0b..df1860f 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium nevar noteikt vai iestatīt noklusējuma pārlūku.</translation> <translation id="2008474315282236005">Veicot šo darbību, no šīs ierīces tiks dzēsts 1 vienums. Lai vēlāk izgūtu datus, pierakstieties pārlūkā Chromium kā <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Par &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS nevarēja sinhronizēt jūsu datus. Novērsiet problēmu jau tūlīt.</translation> <translation id="2241627712206172106">Ja jūsu datoru izmanto arī jūsu draugi un ģimenes locekļi, viņi var iestatīt pārlūku Chromium atbilstoši savām vēlmēm un pārlūkot saturu atsevišķos kontos.</translation> <translation id="2347108572062610441">Šis paplašinājums mainīja iestatījumu, kura lapa tiek parādīta, palaižot pārlūku Chromium.</translation> <translation id="2396765026452590966">Paplašinājums “<ph name="EXTENSION_NAME" />” mainīja iestatījumu, kura lapa tiek parādīta, palaižot pārlūku Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Papildu drošības nolūkos Chromium šifrēs jūsu datus.</translation> <translation id="2770231113462710648">Mainīt noklusējuma pārlūkprogrammu uz:</translation> <translation id="2799223571221894425">Restartēt</translation> +<translation id="2805036593126168338">Chromium OS nevarēja sinhronizēt jūsu paroles. Novērsiet problēmu jau tūlīt.</translation> <translation id="2838154144102149890">Lai varētu atjaunināt pārlūku Chromium, pārlūkam šajā datorā jāpārtrauc darboties. Citi lietotāji, kas ir pieteikušies šajā datorā, var zaudēt nesaglabātās izmaiņas.</translation> <translation id="2847479871509788944">Noņemšana no pārlūka Chromium...</translation> <translation id="2886012850691518054">Izvēles: palīdziet uzlabot Chromium, automātiski nosūtot lietojuma statistiku un avārijas pārskatus uzņēmumam Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 843fe04..08f4276 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium-ത്തിന് ഡിഫോൾട്ട് ബ്രൗസർ നിർണ്ണയിക്കാനോ സജ്ജമാക്കാനോ കഴിയില്ല</translation> <translation id="2008474315282236005">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും ഒരിനം ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="2119636228670142020">&Chromium OS-നെക്കുറിച്ച്</translation> +<translation id="2147976119693222405">Chromium OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. ഇപ്പോൾ പരിഹരിക്കുക.</translation> <translation id="2241627712206172106">നിങ്ങളൊരു കമ്പ്യൂട്ടർ പങ്കിടുകയാണെങ്കിൽ, സുഹൃത്തുക്കൾക്കും കുടുബാംഗങ്ങൾക്കും വെവ്വേറെ ബ്രൗസ് ചെയ്യാനും അവർക്ക് ആവശ്യമുള്ള രീതിയിൽ Chromium സജ്ജീകരിക്കാനുമാകും.</translation> <translation id="2347108572062610441">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ ഈ വിപുലീകരണം മാറ്റി.</translation> <translation id="2396765026452590966">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ ദൃശ്യമാകുന്ന പേജിനെ "<ph name="EXTENSION_NAME" />" വിപുലീകരണം മാറ്റി.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">അധിക സുരക്ഷക്കായി, Chromium നിങ്ങളുടെ ഡാറ്റ എന്ക്രിപ്റ്റ് ചെയ്യും.</translation> <translation id="2770231113462710648">ഡിഫോൾട്ട് ബ്രൗസര് ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> +<translation id="2805036593126168338">Chromium OS-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ സമന്വയിപ്പിക്കാനായില്ല. ഇപ്പോൾ പരിഹരിക്കുക.</translation> <translation id="2838154144102149890">അപ്ഡേറ്റ് ചെയ്യാൻ, ഈ കമ്പ്യൂട്ടറിൽ Chromium റൺ ചെയ്യുന്നത് നിർത്തേണ്ടതുണ്ട്. ഈ കമ്പ്യൂട്ടറിൽ ലോഗിൻ ചെയ്തിരിക്കുന്ന മറ്റ് ഉപയോക്താക്കളുടെ സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇത് കാരണമായേക്കാം.</translation> <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation> <translation id="2886012850691518054">ഓപ്ഷണൽ: ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും Google-ലേക്ക് സ്വയമേവ അയയ്ക്കുന്നതിലൂടെ Chromium-ത്തിനെ മികച്ചതാക്കി മാറ്റാൻ സഹായിക്കുക.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index ab49dbeb..e79a712d 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium нь өгөгдмөл хөтчийг тодорхойлох эсвэл тохируулах боломжгүй</translation> <translation id="2008474315282236005">Энэ нь төхөөрөмжөөс 1 зүйл устгана. Өгөгдлөө дараа сэргээхийн тулд Chromium-д <ph name="USER_EMAIL" />-р нэвтэрнэ үү.</translation> <translation id="2119636228670142020">Chromium OS-ын тухай</translation> +<translation id="2147976119693222405">Chromium үйлдлийн систем таны өгөгдлийг синк хийж чадсангүй. Одоо засна уу.</translation> <translation id="2241627712206172106">Хэрэв та компьютероо дундаа ашиглаж байгаа бол таны найз нөхөд, гэр бүл тусдаа хайлт хийж, өөрсдийн хүссэнээрээ Chromium-ыг тохируулж болно.</translation> <translation id="2347108572062610441">Энэ өргөтгөл нь таныг Chromium эхлүүлэх үед хуудас дээр харуулах зүйлийг өөрчилсөн.</translation> <translation id="2396765026452590966">"<ph name="EXTENSION_NAME" />" өргөтгөл нь таныг Chromium эхлүүлэх үед хуудасны харуулах зүйлийг өөрчилсөн.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Таны аюулгүй байдлыг сайжруулахын тулд Chromium таны өгөгдлийг шифрлэх болно.</translation> <translation id="2770231113462710648">Стандарт вэб хөтчийг дараах руу өөрчил:</translation> <translation id="2799223571221894425">Дахин эхлүүлэх</translation> +<translation id="2805036593126168338">Chromium үйлдлийн систем таны нууц үгийг синк хийж чадсангүй. Одоо засна уу.</translation> <translation id="2838154144102149890">Шинэчлэхийн тулд Chromium-г энэ компьютер дээр ажиллуулахаа зогсоох шаардлагатай. Энэ нь энэ компьютерт нэвтэрсэн бусад хэрэглэгчийг хадгалаагүй өөрчлөлтөө алдахад хүргэж болзошгүй.</translation> <translation id="2847479871509788944">Chromium-аас устгах ...</translation> <translation id="2886012850691518054">Заавал биш: Хэрэглээний статистик мэдээ болон алдаа ослын тайланг автоматаар Google рүү илгээж, Chromium-ыг улам сайжруулахад тусална уу.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 9598b3b..ac4e668a 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -21,6 +21,7 @@ <translation id="1966382378801805537">Chromium डीफॉल्ट ब्राउझर निर्धारित किंवा सेट करू शकत नाही</translation> <translation id="2008474315282236005">हे या डिव्हाइस मधून 1 आयटम हटवेल. नंतर तुमचा डेटा पुनर्प्राप्त करण्यासाठी, Chromium मध्ये <ph name="USER_EMAIL" /> म्हणून साइन इन करा.</translation> <translation id="2119636228670142020">&Chromium OS बद्दल</translation> +<translation id="2147976119693222405">Chromium OS तुमचा डेटा सिंक करू शकले नाही. आता निराकरण करा.</translation> <translation id="2241627712206172106">तुम्ही कॉंप्युटर शेअर केल्यास, मित्र आणि कुटुंब स्वतंत्रपणे ब्राउझ करू शकतात आणि त्यांना पाहिजे तसे Chromium सेट अप करू शकतात.</translation> <translation id="2347108572062610441">तुम्ही Chromium सुरू करता तेव्हा कोणते पेज दर्शविले जाते हे या एक्स्टेंशनने बदलले आहे.</translation> <translation id="2396765026452590966">तुम्ही Chromium सुरू करता तेव्हा कोणते पेज दर्शविले जाते हे "<ph name="EXTENSION_NAME" />" एक्स्टेंशनने बदलले आहे.</translation> @@ -36,6 +37,7 @@ <translation id="2718390899429598676">अतिरिक्त सुरक्षिततेसाठी, Chromium तुमचा डेटा एंक्रिप्ट करेल.</translation> <translation id="2770231113462710648">डीफॉल्ट ब्राउझर यावर बदला:</translation> <translation id="2799223571221894425">पुन्हा लाँच करा</translation> +<translation id="2805036593126168338">Chromium OS तुमचे पासवर्ड सिंक करू शकले नाही. आता निराकरण करा.</translation> <translation id="2838154144102149890">अपडेट करण्यासाठी, या कॉंप्युटरवर Chromium बंद करणे आवश्यक आहे. यामुळे या कॉंप्युटरवर लॉग इन केलेल्या इतर वापरकर्त्यांनी सेव्ह न केलेले बदल गमावू शकतात.</translation> <translation id="2847479871509788944">Chromium मधून काढून टाका...</translation> <translation id="2886012850691518054">पर्यायी: वापर आकडेवारी आणि क्रॅश अहवाल Google कडे आपोआप पाठवून Chromium ला अधिक चांगले करण्यात मदत करा.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index 35882c4..6e6bdf1 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium kan ikke fastslå eller angi standardnettleseren</translation> <translation id="2008474315282236005">Dette sletter 1 element fra denne enheten. For å hente dataene dine igjen senere må du logge på Chromium som <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Om &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS kunne ikke synkronisere dataene dine. Løs dette nå.</translation> <translation id="2241627712206172106">Hvis du deler en datamaskin med andre, kan venner og familie surfe hver for seg og konfigurere Chromium akkurat slik de vil.</translation> <translation id="2347108572062610441">Denne utvidelsen har endret hvilken side som vises når du starter Chromium.</translation> <translation id="2396765026452590966">Utvidelsen «<ph name="EXTENSION_NAME" />» har endret hvilken side som vises når du starter Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Chromium krypterer dataene dine for å øke sikkerheten.</translation> <translation id="2770231113462710648">Endre standardnettleser til:</translation> <translation id="2799223571221894425">Start på nytt</translation> +<translation id="2805036593126168338">Chromium OS kunne ikke synkronisere passordene dine. Løs dette nå.</translation> <translation id="2838154144102149890">For å oppdateres må Chromium slutte å kjøre på denne datamaskinen. Dette kan medføre at andre brukere som er logget på datamaskinen, mister endringer som ikke er lagret.</translation> <translation id="2847479871509788944">Fjern fra Chromium</translation> <translation id="2886012850691518054">Valgfritt: Bidra til å gjøre Chromium bedre ved å sende brukerstatistikk og krasjrapporter automatisk til Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 4ad40b04..8ab0cac8 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪਤਾ ਨਹੀਂ ਲਗਾ ਸਕਦਾ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੈੱਟ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="2008474315282236005">ਇਸ ਨਾਲ ਇਸ ਡੀਵਾਈਸ ਤੋਂ 1 ਆਈਟਮ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ। ਬਾਅਦ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Chromium 'ਤੇ <ph name="USER_EMAIL" /> ਵਜੋਂ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> <translation id="2119636228670142020">&Chromium OS ਬਾਰੇ</translation> +<translation id="2147976119693222405">Chromium OS ਤੁਹਾਡੇ ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਹੁਣੇ ਠੀਕ ਕਰੋ।</translation> <translation id="2241627712206172106">ਜੇਕਰ ਤੁਸੀਂ ਕੋਈ ਕੰਪਿਊਟਰ ਸਾਂਝਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਦੋਸਤ ਅਤੇ ਪਰਿਵਾਰ ਵੱਖਰੇ ਤੌਰ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰ ਸਕਦੇ ਹਨ ਅਤੇ ਆਪਣੇ ਤਰੀਕੇ ਨਾਲ Chromium ਦਾ ਸੈੱਟ ਅੱਪ ਕਰ ਸਕਦੇ ਹਨ।</translation> <translation id="2347108572062610441">ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੇ ਤੁਹਾਡੇ ਵੱਲੋਂ Chromium ਸ਼ੁਰੂ ਕੀਤੇ ਜਾਣ ਵੇਲੇ ਦਿਖਾਏ ਗਏ ਪੰਨੇ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਹੈ।</translation> <translation id="2396765026452590966">ਐਕਸਟੈਂਸ਼ਨ "<ph name="EXTENSION_NAME" />" ਬਦਲਿਆ ਗਿਆ ਹੈ ਕਿ ਕਿਹੜਾ ਸਫ਼ਾ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਤੁਸੀਂ Chromium ਚਾਲੂ ਕਰਦੇ ਹੋ।</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, Chromium ਤੁਹਾਡਾ ਡਾਟਾ ਐਨਕ੍ਰਿਪਟ ਕਰੇਗਾ।</translation> <translation id="2770231113462710648">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਨੂੰ ਇਸ ਵਿੱਚ ਬਦਲੋ:</translation> <translation id="2799223571221894425">ਰੀਲੌਂਚ ਕਰੋ</translation> +<translation id="2805036593126168338">Chromium OS ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਹੁਣੇ ਠੀਕ ਕਰੋ।</translation> <translation id="2838154144102149890">ਅੱਪਡੇਟ ਕਰਨ ਲਈ, ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ ਚੱਲ ਰਹੇ Chromium ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਸ਼ਾਇਦ ਇਸਦੇ ਕਾਰਨ ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ ਲੌਗ-ਇਨ ਹੋਏ ਹੋਰ ਵਰਤੋਂਕਾਰ ਅਣਰੱਖਿਅਤ ਤਬਦੀਲੀਆਂ ਗੁਆ ਬੈਠਣ।</translation> <translation id="2847479871509788944">Chromium ਤੋਂ ਹਟਾਓ...</translation> <translation id="2886012850691518054">ਵਿਕਲਪਿਕ: Chromium ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕ੍ਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਭੇਜੋ।</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index 5b2e4ba..eb917a1b 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium nu poate determina sau seta browserul prestabilit</translation> <translation id="2008474315282236005">Astfel, se va șterge 1 element de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chromium ca <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Despre sistemul de operare &Chromium</translation> +<translation id="2147976119693222405">Sistemul de operare Chromium nu a putut sincroniza datele. Remediază acum.</translation> <translation id="2241627712206172106">Dacă permiteți accesul la un computer, familia și prietenii pot să navigheze separat și să configureze Chromium cum doresc.</translation> <translation id="2347108572062610441">Această extensie a modificat ce pagină se afișează când pornești Chromium.</translation> <translation id="2396765026452590966">Extensia „<ph name="EXTENSION_NAME" />” a modificat ce pagină se afișează când pornești Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Pentru un plus de securitate, Chromium îți va cripta datele.</translation> <translation id="2770231113462710648">Schimbă browserul prestabilit la:</translation> <translation id="2799223571221894425">Repornește</translation> +<translation id="2805036593126168338">Sistemul de operare Chromium nu a putut sincroniza parolele. Remediază acum.</translation> <translation id="2838154144102149890">Pentru a se actualiza, Chromium trebuie să nu mai ruleze pe acest computer. Din acest motiv, alți utilizatori conectați la acest computer pot pierde modificări nesalvate.</translation> <translation id="2847479871509788944">Elimină din Chromium...</translation> <translation id="2886012850691518054">Opțional: contribuie la îmbunătățirea Chromium prin trimiterea automată de statistici privind utilizarea și rapoarte de blocare la Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 8cc7c66..d8db209 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium не удалось определить или задать браузер по умолчанию</translation> <translation id="2008474315282236005">С устройства будет удален 1 объект. Чтобы восстановить данные позже, войдите в Chromium как <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">О &Chromium OS</translation> +<translation id="2147976119693222405">Не удалось синхронизировать данные. Войдите, чтобы исправить эту ошибку.</translation> <translation id="2241627712206172106">Если, кроме вас, компьютером пользуется кто-то ещё, например родные или друзья, они тоже смогут настроить Chromium на свой вкус.</translation> <translation id="2347108572062610441">Расширение изменило стартовую страницу Chromium.</translation> <translation id="2396765026452590966">Расширение "<ph name="EXTENSION_NAME" />" изменило стартовую страницу Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">В целях повышения безопасности Chromium шифрует ваши данные.</translation> <translation id="2770231113462710648">Назначить браузером по умолчанию:</translation> <translation id="2799223571221894425">Перезапустить</translation> +<translation id="2805036593126168338">Не удалось синхронизировать пароли. Войдите, чтобы исправить эту ошибку.</translation> <translation id="2838154144102149890">Чтобы выполнить обновление, необходимо остановить работу Chromium. В результате могут быть потеряны несохраненные изменения, внесенные другими пользователями на этом компьютере.</translation> <translation id="2847479871509788944">Удалить из Chromium</translation> <translation id="2886012850691518054">(Необязательно) Помогите сделать Chromium лучше, автоматически отправляя статистику использования и отчеты об ошибках в Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 1888d360..c8a0f45 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium nedokáže určiť alebo nastaviť predvolený prehliadač</translation> <translation id="2008474315282236005">Táto akcia odstráni zo zariadenia jednu položku. Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Informácie o systéme &Chromium OS</translation> +<translation id="2147976119693222405">Systému Chromium OS sa nepodarilo synchronizovať vaše údaje. Opravte.</translation> <translation id="2241627712206172106">Ak počítač zdieľate s rodinou a priateľmi, môžu v prehliadači Chromium prehliadať oddelene a tiež si ho nastaviť podľa vlastných požiadaviek.</translation> <translation id="2347108572062610441">Toto rozšírenie zmenilo stránku, ktorá sa zobrazí pri spustení prehliadača Chromium.</translation> <translation id="2396765026452590966">Rozšírenie „<ph name="EXTENSION_NAME" />“ zmenilo stránku, ktorá sa zobrazí pri spustení prehliadača Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">V záujme vyššej miery zabezpečenia budú dáta v prehliadači Chromium šifrované.</translation> <translation id="2770231113462710648">Zmeniť predvolený prehliadač na:</translation> <translation id="2799223571221894425">Znova spustiť</translation> +<translation id="2805036593126168338">Systému Chromium OS sa nepodarilo synchronizovať vaše heslá. Opravte.</translation> <translation id="2838154144102149890">Ak chcete prehliadač Chromium aktualizovať, nesmie byť spustený v tomto počítači. Ostatní používatelia prihlásení do tohto počítača môžu prísť o neuložené zmeny.</translation> <translation id="2847479871509788944">Odstrániť z prehliadača Chromium...</translation> <translation id="2886012850691518054">Voliteľné: Pomôžte vylepšiť služby prehliadača Chromium tým, že nastavíte automatické odosielanie štatistík používania a správ o zlyhaní spoločnosti Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 1001078..4e470bd 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium nuk mund të përcaktojë ose caktojë shfletuesin e parazgjedhur</translation> <translation id="2008474315282236005">Kjo do të fshijë 1 artikull nga kjo pajisje. Për t'i marrë më vonë të dhënat, identifikohu te Chromium si <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Rreth sistemit operativ &Chromium</translation> +<translation id="2147976119693222405">Sistemi operativ Chromium nuk mund t'i sinkronizonte të dhënat e tua. Rregulloje tani.</translation> <translation id="2241627712206172106">Nëse e ndan një kompjuter, miqtë dhe familja mund të shfletojnë veçmas dhe ta konfigurojnë Chromium pikërisht ashtu si dëshirojnë.</translation> <translation id="2347108572062610441">Kjo shtesë ka ndryshuar se cila faqe shfaqet kur nis Chromium.</translation> <translation id="2396765026452590966">Shtesa "<ph name="EXTENSION_NAME" />" ka ndryshuar se cila faqe shfaqet kur nis Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Për më shumë siguri, Chromium do t'i enkriptojë të dhënat e tua.</translation> <translation id="2770231113462710648">Ndrysho shfletuesin me parazgjedhje në:</translation> <translation id="2799223571221894425">Nis sërish</translation> +<translation id="2805036593126168338">Sistemi operativ Chromium nuk mund t'i sinkronizonte fjalëkalimet e tua. Rregulloje tani.</translation> <translation id="2838154144102149890">Chromium duhet të mbyllet në këtë kompjuter, që të mund të përditësohet. Kjo mund të bëjë që përdorues të tjerë të identifikuar në këtë kompjuter të humbin ndryshimet e paruajtura.</translation> <translation id="2847479871509788944">Hiqe nga Chromium...</translation> <translation id="2886012850691518054">Opsionale: Ndihmo në përmirësimin e Chromium duke i dërguar automatikisht Google statistika përdorimi dhe raporte të ndërprerjeve aksidentale.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 4bc9402..735563f6 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium haijafaulu kubainisha wala kuweka kivinjari chaguomsingi</translation> <translation id="2008474315282236005">Hatua hii itafuta kipengee 1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chromium ukitumia <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Kuhusu Chromium OS</translation> +<translation id="2147976119693222405">Mfumo wa Uendeshaji wa Chromium umeshindwa kusawazisha data yako. Rekebisha sasa.</translation> <translation id="2241627712206172106">Kama unatumia kompyuta pamoja na wengine, marafiki na familia wanaweza kuvinjari tofauti na kusanidi Chromium jinsi wapendavyo.</translation> <translation id="2347108572062610441">Kiendelezi hiki kimebadilisha ukurasa unaoonyeshwa unapoanzisha Chromium.</translation> <translation id="2396765026452590966">Kiendelezi hiki "<ph name="EXTENSION_NAME" />" kimebadilisha ukurasa unaoonyeshwa unapoanzisha Chromium.</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">Kwa usalama ulioongezwa, Chromium itasimba data yako kwa njia fiche.</translation> <translation id="2770231113462710648">Badilisha kivinjari chaguomsingi kiwe:</translation> <translation id="2799223571221894425">Funga na ufungue</translation> +<translation id="2805036593126168338">Mfumo wa Uendeshaji wa Chromium umeshindwa kusawazisha manenosiri yako. Rekebisha sasa.</translation> <translation id="2838154144102149890">Ili usasishe, unahitaji kuacha kutumia Chromium kwenye kompyuta hii. Hali hii inaweza kusababisha watumiaji wengine walioingia katika akaunti kwenye kompyuta hii kupoteza mabadiliko ambayo hawajahifadhi.</translation> <translation id="2847479871509788944">Ondoa kwenye Chromium...</translation> <translation id="2886012850691518054">Si lazima: Saidia kuboresha Chromium kwa kutumia Google takwimu za matumizi na ripoti wakati wowote huduma hii inapoacha kufanya kazi.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index 507a0ae9..71b8e40 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium ไม่สามารถกำหนดหรือตั้งค่าเบราว์เซอร์เริ่มต้น</translation> <translation id="2008474315282236005">การดำเนินการนี้จะลบ 1 รายการออกจากอุปกรณ์นี้ หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chromium ด้วย <ph name="USER_EMAIL" /></translation> <translation id="2119636228670142020">เกี่ยวกับ &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS ซิงค์ข้อมูลของคุณไม่ได้ แก้ไขเลย</translation> <translation id="2241627712206172106">ถ้าคุณให้ผู้อื่นใช้คอมพิวเตอร์ร่วมด้วย เพื่อนๆ และครอบครัวของคุณสามารถท่องเว็บแยกกันได้และตั้งค่า Chromium ได้ตามที่พวกเขาต้องการ</translation> <translation id="2347108572062610441">ส่วนขยายนี้ได้เปลี่ยนหน้าที่จะแสดงเมื่อคุณเริ่มต้น Chromium</translation> <translation id="2396765026452590966">ส่วนขยาย "<ph name="EXTENSION_NAME" />" ได้เปลี่ยนหน้าที่จะแสดงเมื่อคุณเริ่มต้น Chromium</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">เพื่อเพิ่มความปลอดภัยให้มากยิ่งขึ้น Chromium จะเข้ารหัสข้อมูลของคุณ</translation> <translation id="2770231113462710648">เปลี่ยนเบราว์เซอร์ที่เป็นค่าเริ่มต้นเป็น:</translation> <translation id="2799223571221894425">เปิดใหม่</translation> +<translation id="2805036593126168338">Chromium OS ซิงค์รหัสผ่านของคุณไม่ได้ แก้ไขเลย</translation> <translation id="2838154144102149890">Chromium ต้องหยุดทำงานในคอมพิวเตอร์เครื่องนี้ก่อนจึงจะอัปเดตได้ การดำเนินการนี้อาจทำให้ผู้ใช้ที่อยู่ในระบบของคอมพิวเตอร์เครื่องนี้สูญเสียการเปลี่ยนแปลงที่ยังไม่ได้บันทึก</translation> <translation id="2847479871509788944">นำออกจาก Chromium...</translation> <translation id="2886012850691518054">ตัวเลือก: ช่วยปรับปรุง Chromium ให้ดีขึ้นโดยการส่งสถิติการใช้งานและรายงานข้อขัดข้องไปยัง Google โดยอัตโนมัติ</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 1f8511d..48f11eee 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium, varsayılan tarayıcıyı tespit edemiyor veya ayarlayamıyor</translation> <translation id="2008474315282236005">Bu işlem 1 öğeyi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chromium'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> <translation id="2119636228670142020">&Chromium OS hakkında</translation> +<translation id="2147976119693222405">Chromium OS, verilerinizi senkronize edemedi. Şimdi düzelt.</translation> <translation id="2241627712206172106">Bir bilgisayarı paylaşıyorsanız arkadaşlarınız ve aileniz ayrı olarak göz atabilir ve Chromium'u tam olarak istedikleri şekilde ayarlayabilir.</translation> <translation id="2347108572062610441">Bu uzantı, Chromium'u başlattığınızda gösterilen sayfayı değiştirdi.</translation> <translation id="2396765026452590966">"<ph name="EXTENSION_NAME" />" uzantısı, Chromium'u başlattığınızda gösterilen sayfayı değiştirdi.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Chromium ek güvenlik için verilerinizi şifreler.</translation> <translation id="2770231113462710648">Varsayılan tarayıcıyı şuna dönüştür:</translation> <translation id="2799223571221894425">Yeniden başlat</translation> +<translation id="2805036593126168338">Chromium OS, şifrelerinizi senkronize edemedi. Şimdi düzelt.</translation> <translation id="2838154144102149890">Güncellemek için Chromuium'un bu bilgisayarda kapatılması gerekiyor. Bu durum, bilgisayara giriş yapmış diğer kullanıcıların kaydedilmemiş bilgilerinin silinmesine yol açabilir.</translation> <translation id="2847479871509788944">Chromium'dan kaldır...</translation> <translation id="2886012850691518054">İsteğe Bağlı: Kullanıcı istatistiklerini ve kilitlenme raporlarını Google'a otomatik olarak göndererek Chromium'u iyileştirmemize yardımcı olun.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index 7aa2356..e454876 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium ڈیفالٹ براؤزر کا تعین یا اس کو سیٹ نہیں کر سکتا ہے</translation> <translation id="2008474315282236005">یہ اس آلہ سے 1 آئٹم کو حذف کر دے گا۔ بعد میں اپنا ڈیٹا بازیافت کرنے کیلئے، Chromium میں <ph name="USER_EMAIL" /> کے بطور سائن ان کریں۔</translation> <translation id="2119636228670142020">&Chromium OS کے بارے میں</translation> +<translation id="2147976119693222405">Chromium OS آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا۔ ابھی درست کریں۔</translation> <translation id="2241627712206172106">اگر آپ ایک کمپیوٹر کا اشتراک کرتے ہیں تو دوست اور خاندان الگ الگ براؤز کر سکتے ہیں اور اپنی مرضی کے موافق Chromium کو ترتیب دے سکتے ہیں۔</translation> <translation id="2347108572062610441">آپ کی جانب سے Chromium شروع کرنے پر دکھائی دینے والے صفحہ کو اس ایکسٹینشن نے تبدیل کر دیا ہے۔</translation> <translation id="2396765026452590966">آپ کی جانب سے Chromium شروع کرنے پر دکھائی دینے والے صفحہ کو ایکسٹینشن "<ph name="EXTENSION_NAME" />" نے تبدیل کر دیا ہے۔</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">اضافی سیکیورٹی کیلئے، Chromium آپ کا ڈیٹا مرموز کر دے گا۔</translation> <translation id="2770231113462710648">ڈیفالٹ براؤزر کو اس میں تبدیل کریں:</translation> <translation id="2799223571221894425">دوبارہ شروع کریں</translation> +<translation id="2805036593126168338">Chromium OS آپ کے پاس ورڈز کی مطابقت پذیری نہیں کر سکا۔ ابھی درست کریں۔</translation> <translation id="2838154144102149890">اپ ڈیٹ کرنے کے لیے، Chromium کا اس کمپیوٹر پر چلنا بند ہونا ضروری ہے۔ اس وجہ سے اس کمپیوٹر پر لاگ ان کیے ہوئے دیگر صارفین کی غیر محفوظ کردہ تبدیلیاں ضائع ہو سکتی ہیں۔</translation> <translation id="2847479871509788944">Chromium سے ہٹائیں…</translation> <translation id="2886012850691518054">اختیاری: Google کو استعمال کے اعداد و شمار اور کریش رپورٹس خودکار طور پر بھیج کر Chromium کو بہتر بنانے میں مدد کریں۔</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index c3928690..3d0d852 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium không thể xác định hoặc đặt trình duyệt mặc định</translation> <translation id="2008474315282236005">Thao tác này sẽ xóa 1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chromium dưới dạng <ph name="USER_EMAIL" />.</translation> <translation id="2119636228670142020">Giới thiệu về &Chromium OS</translation> +<translation id="2147976119693222405">Chromium OS không thể đồng bộ hóa dữ liệu của bạn. Khắc phục ngay.</translation> <translation id="2241627712206172106">Nếu bạn chia sẻ máy tính, bạn bè và gia đình có thể duyệt web một cách riêng biệt và thiết lập Chromium theo ý của họ.</translation> <translation id="2347108572062610441">Tiện ích này đã thay đổi trang nào được hiển thị khi bạn khởi động Chromium.</translation> <translation id="2396765026452590966">Tiện ích "<ph name="EXTENSION_NAME" />" đã thay đổi trang nào được hiển thị khi bạn khởi động Chromium.</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">Để bảo mật hơn, Chromium sẽ mã hóa dữ liệu của bạn.</translation> <translation id="2770231113462710648">Thay đổi trình duyệt mặc định thành:</translation> <translation id="2799223571221894425">Chạy lại</translation> +<translation id="2805036593126168338">Chromium OS không thể đồng bộ hóa mật khẩu của bạn. Khắc phục ngay.</translation> <translation id="2838154144102149890">Để cập nhật, bạn cần ngừng chạy Chromium trên máy tính này. Nếu ngừng chạy, những người dùng khác đăng nhập vào máy tính này có thể bị mất các thay đổi chưa lưu.</translation> <translation id="2847479871509788944">Xóa khỏi Chromium...</translation> <translation id="2886012850691518054">Tùy chọn: giúp cải thiện Chromium bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 62748d6..20961ee 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium 无法确定或设置默认浏览器</translation> <translation id="2008474315282236005">这会从这台设备上删除 1 项内容。如果日后想要检索您的数据,届时请以 <ph name="USER_EMAIL" /> 的身份登录 Chromium。</translation> <translation id="2119636228670142020">关于 Chromium 操作系统(&C)</translation> +<translation id="2147976119693222405">Chromium 操作系统无法同步您的数据。请立即修正。</translation> <translation id="2241627712206172106">如果您与亲朋好友共用计算机,他们将能够使用单独的帐号进行浏览,并可随心所欲地设置Chromium。</translation> <translation id="2347108572062610441">此扩展程序更改了 Chromium 启动后系统显示的页面。</translation> <translation id="2396765026452590966">“<ph name="EXTENSION_NAME" />”扩展程序更改了 Chromium 启动后系统显示的页面。</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">为了提高安全性,Chromium 将对您的数据进行加密。</translation> <translation id="2770231113462710648">将默认浏览器更改为:</translation> <translation id="2799223571221894425">重新启动</translation> +<translation id="2805036593126168338">Chromium 操作系统无法同步您的密码。请立即修正。</translation> <translation id="2838154144102149890">若要更新,Chromium 需要在此计算机上停止运行。这可能会导致登录此计算机的其他用户丢失未保存的更改。</translation> <translation id="2847479871509788944">从Chromium中移除…</translation> <translation id="2886012850691518054">可选:将使用情况统计信息和崩溃报告自动发送给 Google,帮助我们完善 Chromium。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index 9354426..2b69705 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -22,6 +22,7 @@ <translation id="1966382378801805537">Chromium 無法偵測或設定預設瀏覽器</translation> <translation id="2008474315282236005">這會刪除此裝置上的 1 個項目。如果日後想擷取資料,請以 <ph name="USER_EMAIL" /> 的身分登入 Chromium。</translation> <translation id="2119636228670142020">關於 Chromium 作業系統(&C)</translation> +<translation id="2147976119693222405">Chromium 作業系統無法同步處理你的資料。立即修正。</translation> <translation id="2241627712206172106">如果您與親朋好友共用電腦,每個人均可享有獨立的瀏覽空間,依照自己的偏好設定 Chromium。</translation> <translation id="2347108572062610441">擴充功能已變更 Chromium 啟動時所顯示的網頁。</translation> <translation id="2396765026452590966">擴充功能「<ph name="EXTENSION_NAME" />」已變更 Chromium 啟動時所顯示的網頁。</translation> @@ -37,6 +38,7 @@ <translation id="2718390899429598676">為提高安全性,Chromium 會將您的資料加密。</translation> <translation id="2770231113462710648">將預設瀏覽器變更為:</translation> <translation id="2799223571221894425">重新啟動</translation> +<translation id="2805036593126168338">Chromium 作業系統無法同步處理你的密碼。立即修正。</translation> <translation id="2838154144102149890">此電腦上的 Chromium 需要停止執行才可更新。這可能會導致其他登入此電腦的使用者遺失尚未儲存的變更。</translation> <translation id="2847479871509788944">從 Chromium 中移除…</translation> <translation id="2886012850691518054">選擇性:將使用統計資料及當機報告自動傳送給 Google,助我們一臂之力,讓 Chromium 更臻完美。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 02342d5d..c93f319 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -20,6 +20,7 @@ <translation id="1966382378801805537">Chromium 無法偵測或設定預設瀏覽器</translation> <translation id="2008474315282236005">登出後,系統會將 1 個項目從這個裝置上刪除。日後如要重新取得你的資料,請以 <ph name="USER_EMAIL" /> 身分登入 Chromium。</translation> <translation id="2119636228670142020">關於 Chromium 作業系統(&C)</translation> +<translation id="2147976119693222405">Chromium 作業系統無法同步處理你的資料。立即修正。</translation> <translation id="2241627712206172106">如果你與親朋好友共用電腦,人人皆可享有獨立的瀏覽空間,依照自己的偏好設定 Chromium。</translation> <translation id="2347108572062610441">這個擴充功能已變更 Chromium 啟動時所顯示的網頁。</translation> <translation id="2396765026452590966">擴充功能「<ph name="EXTENSION_NAME" />」已變更 Chromium 啟動時所顯示的網頁。</translation> @@ -35,6 +36,7 @@ <translation id="2718390899429598676">為了提升安全性,Chromium 會將您的資料加密保護。</translation> <translation id="2770231113462710648">將預設瀏覽器變更為:</translation> <translation id="2799223571221894425">重新啟動</translation> +<translation id="2805036593126168338">Chromium 作業系統無法同步處理你的密碼。立即修正。</translation> <translation id="2838154144102149890">這台電腦上的 Chromium 必須停止執行,才能進行更新。這可能會導致其他登入這台電腦的使用者遺失尚未儲存的變更。</translation> <translation id="2847479871509788944">從 Chromium 中移除...</translation> <translation id="2886012850691518054">選用:將使用統計資料及當機報告自動傳送給 Google,助我們一臂之力,讓 Chromium 更臻完美。</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index be8f6d4..83038c13 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Oeps! Die stelsel kon nie die beleid vir jou toestel gaan haal nie.</translation> <translation id="347785443197175480">Hou aan om <ph name="HOST" /> toegang tot jou kamera en mikrofoon te gee</translation> <translation id="3478685642445675458">Ontsluit asseblief jou profiel voordat jy 'n persoon verwyder.</translation> -<translation id="3479539252931486093">Was dit onverwags? <ph name="BEGIN_LINK" />Laat weet ons<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Nie nou nie</translation> <translation id="3481268647794498892">Maak <ph name="ALTERNATIVE_BROWSER_NAME" /> binne <ph name="COUNTDOWN_SECONDS" /> sekondes oop</translation> <translation id="3484273680291419129">Verwyder tans skadelike sagteware …</translation> @@ -4491,7 +4490,6 @@ <translation id="7442465037756169001">Jou Hangouts Vergader-hardeware is gereed om opgestel te word.</translation> <translation id="744341768939279100">Skep 'n nuwe profiel</translation> <translation id="7443806024147773267">Kry toegang tot jou wagwoorde wanneer jy by jou Google-rekening aangemeld is</translation> -<translation id="7444046173054089907">Hierdie werf is geblokkeer</translation> <translation id="7444983668544353857">Deaktiveer <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installeer programme outomaties</translation> <translation id="7450761244949417357">Maak tans <ph name="ALTERNATIVE_BROWSER_NAME" /> oop</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 2da05ac..caae1c6b 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1757,7 +1757,6 @@ <translation id="347670947055184738">ውይ! ሥርዓቱ ለመሣሪያዎ መመሪያን ማግኘት አልተሳካለትም።</translation> <translation id="347785443197175480"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን እንዲደርስ መፍቀዱን ይቀጥሉ</translation> <translation id="3478685642445675458">አንድ ሰው ከማስወገድዎ በፊት እባክዎ የእርስዎን መገለጫ ይክፈቱ።</translation> -<translation id="3479539252931486093">ይህ ያልተጠበቀ ነበር? <ph name="BEGIN_LINK" />ያሳውቁን<ph name="END_LINK" /></translation> <translation id="3479552764303398839">አሁን አይደለም</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" />ን በ<ph name="COUNTDOWN_SECONDS" /> ሰከንዶች ውስጥ ይከፈታል</translation> <translation id="3484273680291419129">ጎጂ ሶፍትዌርን በማስወገድ ላይ...</translation> @@ -4487,7 +4486,6 @@ <translation id="7442465037756169001">የእርስዎ Hangouts Meet hardware ለመዋቀር ዝግጁ ነው።</translation> <translation id="744341768939279100">አዲስ መገለጫ ፍጠር</translation> <translation id="7443806024147773267">ወደ የእርስዎ የ Google መለያ በገቡ ቁጥር የእርስዎን የይለፍ ቃላት ይድረሱባቸው</translation> -<translation id="7444046173054089907">ይህ ጣቢያ ታግዷል</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />ን አሰናክል</translation> <translation id="7448430327655618736">መተግበሪያዎችን በራስ-ሰር ጫን</translation> <translation id="7450761244949417357">አሁን በ<ph name="ALTERNATIVE_BROWSER_NAME" /> ውስጥ ይከፈታል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 1ec087d..2cd80f47 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1750,7 +1750,6 @@ <translation id="347670947055184738">عفوًا! تعذّر النظام في جلب السياسة لجهازك.</translation> <translation id="347785443197175480">مواصلة إتاحة دخول <ph name="HOST" /> إلى الكاميرا والميكروفون التابعين لك</translation> <translation id="3478685642445675458">يُرجى إلغاء قفل ملفك الشخصي قبل إزالة شخص.</translation> -<translation id="3479539252931486093">ألم تتوقَّع هذا؟ <ph name="BEGIN_LINK" />أطلِعنا على الأمر<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ليس الآن</translation> <translation id="3481268647794498892">جارٍ الفتح في <ph name="ALTERNATIVE_BROWSER_NAME" /> خلال <ph name="COUNTDOWN_SECONDS" /> ثانية</translation> <translation id="3484273680291419129">جارٍ إزالة البرامج الضارة...</translation> @@ -4466,7 +4465,6 @@ <translation id="7442465037756169001">جهاز Hangouts Meet جاهز للإعداد.</translation> <translation id="744341768939279100">إنشاء ملف شخصي جديد</translation> <translation id="7443806024147773267">يمكنك الوصول إلى كلمات المرور عند تسجيل الدخول إلى حسابك على Google.</translation> -<translation id="7444046173054089907">تم حظر هذا الموقع</translation> <translation id="7444983668544353857">إيقاف <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">يمكنك تثبيت التطبيقات تلقائيًا.</translation> <translation id="7450761244949417357">سيتم الفتح في <ph name="ALTERNATIVE_BROWSER_NAME" /> الآن.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index eb6148e..a3a96df 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">এই পৃষ্ঠাটোৱে সঁহাৰি জনোৱা নাই</translation> <translation id="1041263367839475438">উপলব্ধ ডিভাইচসমূ্হ</translation> <translation id="1042174272890264476">আপোনাৰ কম্পিউটাৰৰ সৈতে <ph name="SHORT_PRODUCT_NAME" />ৰ RLZ লাইব্ৰেৰী অন্তনিৰ্মিত ভাৱে আছে। কোনো বিশেষ প্ৰচাৰ অভিযানত ব্যৱহাৰ হোৱা সন্ধান আৰু <ph name="SHORT_PRODUCT_NAME" />ৰ ব্যৱহাৰ জুখিবলৈ RLZএ কোনো অদ্বৈত নোহোৱা, ব্যক্তিগতভাৱে চিনাক্ত কৰিব নোৱাৰা টেগ দিয়ে। এই লেবেলসমূহ কেতিয়াবা <ph name="PRODUCT_NAME" />ৰ Google Searchত কৰা সন্ধানত প্ৰদর্শিত হয়।</translation> +<translation id="1043818413152647937">লগতে এই এপ্সমূহৰ পৰা ডেটা মচিবনে?</translation> <translation id="1045692658517323508">{0,plural, =1{১ মিনিটৰ ভিতৰত আপডে'ট কৰক}one{# মিনিটৰ ভিতৰত আপডে'ট কৰক}other{# মিনিটৰ ভিতৰত আপডে'ট কৰক}}</translation> <translation id="1046635659603195359">আপুনি কোনো অন্য ডিভাইচত আপোনাৰ Google Assistantৰ বাবে ইতিমধ্যে কণ্ঠস্বৰ মিলোৱা সুবিধাটো ছেট আপ কৰি থোৱা যেন লাগিছে। পূৰ্বৰ এই ৰেকর্ডিংবোৰ এই ডিভাইচটোত এটা কণ্ঠস্বৰৰ ম’ডেল বনাবলৈ ব্যৱহাৰ কৰিব পাৰি। এই কার্যৰ বাবে এক মিনিটতকৈও কম সময়ৰ প্ৰয়োজন হ’ব লাগে।</translation> <translation id="1047431265488717055">লিংক আৰু পা&ঠ প্ৰতিলিপি কৰক</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chromeত Googleৰ সেৱা পাওক</translation> <translation id="1147991416141538220">এক্সেছ বিচাৰিবলৈ এই ডিভাইচটোৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</translation> <translation id="1149401351239820326">ম্যাদ উকলা মাহ</translation> +<translation id="1150490752229770117">এয়া এই <ph name="DEVICE_TYPE" />টোৰ বাবে অন্তিমটো স্বয়ংক্ৰিয় ছফ্টৱেৰ আৰু সুৰক্ষাৰ আপডে’ট। ভৱিষ্যতৰ আপডে’টসমূহ পাবলৈ এটা নতুন ম’ডেললৈ আপগ্ৰে’ড কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1150565364351027703">ছানগ্লাছ</translation> <translation id="1151917987301063366"><ph name="HOST" />এ ছেন্সৰসমূহলৈ এক্সেছ কৰিবলৈ সদায় অনুমতি দিয়ক</translation> <translation id="1153356358378277386">যোৰা লগোৱা ডিভাইচ</translation> @@ -281,6 +283,7 @@ <translation id="1397500194120344683">কোনো যোগ্য ডিভাইচ নাই। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1398853756734560583">সৰ্বাধিক মাত্ৰালৈ বঢ়াওক</translation> <translation id="1399511500114202393">কোনো ব্যৱহাৰকাৰীৰ প্ৰমাণপত্ৰ নাই</translation> +<translation id="1403519882106291341">Google Chrome OSৰ চৰ্তাৱলী</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (নিৰীক্ষণত থকা)</translation> <translation id="1405779994569073824">ক্ৰেশ্ব হ’ল।</translation> <translation id="1406500794671479665">সত্যাপন কৰি থকা হৈছে…</translation> @@ -504,7 +507,9 @@ <translation id="1709217939274742847">বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিবলৈ এটা টিকেট বাছনি কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1712349894969001173">আপোনাৰ iPhoneত এই পাছৱর্ডটো পাওক</translation> <translation id="1712552549805331520"><ph name="URL" />এ আপোনাৰ ল’কেল কম্পিউটাৰত স্থায়ীভাৱে ডেটা ষ্ট’ৰ কৰিব বিচাৰে</translation> +<translation id="1714644264617423774">আপোনাৰ ডিভাইচটো ব্যৱহাৰৰ বাবে অধিক সুবিধাজনক কৰিবলৈ সাধ্য সুবিধাসমূহ সক্ষম কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1717218214683051432">ম'শ্বন ছেন্সৰসমূহ</translation> +<translation id="171824261579749339">অষ্ট্ৰেলিয়ান <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="1718835860248848330">যোৱা ১ ঘণ্টাৰ</translation> <translation id="1719312230114180055">টোকা: এটা জটিল আৰ্হি বা পিনতকৈ আপোনাৰ ফিংগাৰপ্ৰিণ্টটো কম সুৰক্ষিত হ’ব পাৰে।</translation> <translation id="1720318856472900922">TLS WWW ছাৰ্ভাৰৰ বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ</translation> @@ -765,6 +770,7 @@ <translation id="2096715839409389970">তৃতীয় পক্ষৰ কুকিসমূহ মচক</translation> <translation id="2097372108957554726">আপুনি নতুন ডিভাইচসমূহ পঞ্জীকৰণ কৰিবলৈ Chromeলৈ ছাইন ইন কৰিব লাগিব।</translation> <translation id="2099172618127234427">আপুনি Chrome OS ডিবাগ কৰা সুবিধাসমূহ সক্ষম কৰিছে যিবোৰে sshd daemon ছেট আপ কৰিব আৰু USB ড্ৰাইভসমূহৰ পৰা বুটিং সক্ষম কৰিব।</translation> +<translation id="2099625543891475722">আপোনাৰ শাৰীৰিক বৈশিষ্ট্যসমূহ, যেনে উচ্চতা</translation> <translation id="2099686503067610784">ছার্ভাৰৰ প্ৰমাণপত্ৰ "<ph name="CERTIFICATE_NAME" />" মচিবনে?</translation> <translation id="2100273922101894616">স্বয়ংক্ৰিয়ভাৱে ছাইন ইন কৰক</translation> <translation id="2101225219012730419">সংস্কৰণ:</translation> @@ -1019,6 +1025,7 @@ <translation id="2445484935443597917">এটা নতুন প্ৰ’ফাইল সৃষ্টি কৰক</translation> <translation id="2446585455334014596"><ph name="APP_NAME" />এ আপোনাৰ পৰিচয় সত্যাপন কৰিব খোজে</translation> <translation id="2448312741937722512">প্রকাৰ</translation> +<translation id="2448734521821581858">কুকিবোৰ হৈছে আপুনি চোৱা ৱেবছাইটসমূহে সৃষ্টি কৰা ফাইল। দুই ধৰণৰ কুকি থাকে: প্ৰথম-পক্ষৰ কুকিসমূহ আপুনি চোৱা ছাইটসমূহে সৃষ্টি কৰে। ছাইটটো ঠিকনাৰ বাৰডালত দেখুওৱা হয়। তৃতীয়-পক্ষৰ কুকিসমূহ অন্য ছাইটসমূহে সৃষ্টি কৰে। এই ছাইটসমূহ আপুনি চোৱা ৱেবছাইটটোত দেখা পোৱা বিজ্ঞাপন অথবা প্ৰতিচ্ছবিবোৰৰ দৰে কিছুমান সমলৰ গৰাকী।</translation> <translation id="2450223707519584812">Google API চাবিসমূহ নথকাৰ বাবে আপুনি ব্যৱহাৰকাৰীক যোগ দিব নোৱাৰিব। সবিশেষৰ বাবে <ph name="DETAILS_URL" /> চাওক।</translation> <translation id="2450849356604136918">কোনো সক্ৰিয় ভিউ নাই</translation> <translation id="2451298179137331965">২x</translation> @@ -1131,6 +1138,7 @@ <translation id="2587922766792651800">সময় উকলিছে</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" />ৰ ডিভাইচসমূহ</translation> <translation id="2594999711683503743">Googleত সন্ধান কৰক বা URL টাইপ কৰক</translation> +<translation id="2600522410036850735">এই ডিভাইচটোৱে <ph name="MONTH_AND_YEAR" /> পৰ্যন্ত স্বয়ংক্ৰিয় ছফ্টৱেৰ আৰু সুৰক্ষাৰ আপডে’টসমূহ পাব। <a target="_blank" href="<ph name="URL" />">অধিক জানক</a></translation> <translation id="2603115962224169880">কম্পিউটাৰৰ ডেটা মচক</translation> <translation id="2603463522847370204">&ইনক’গনিট’ ৱিণ্ড’ত খোলক</translation> <translation id="2604255671529671813">নেটৱৰ্ক সংযোগ সম্পর্কীয় আসোঁৱাহ</translation> @@ -1547,6 +1555,7 @@ <translation id="3181954750937456830">সুৰক্ষিত ব্ৰাউজিং (আপোনাৰ ডিভাইচটোক বিপজ্জনক ছাইটৰ পৰা সুৰক্ষা প্ৰদান কৰে)</translation> <translation id="3182749001423093222">বানান পৰীক্ষা</translation> <translation id="3183139917765991655">প্ৰ’ফাইল ৰপ্তানি কৰোঁতা</translation> +<translation id="3184536091884214176">CUPS প্ৰিণ্টাৰসমূহ ছেট আপ কৰক অথবা পৰিচালনা কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="3188257591659621405">মোৰ ফাইলসমূহ</translation> <translation id="3188465121994729530">গতিশীল গঢ়</translation> <translation id="3190558889382726167">পাছৱর্ড ছেভ কৰা হ'ল</translation> @@ -1735,7 +1744,6 @@ <translation id="347670947055184738">আমি দুঃখিত! ছিষ্টেমটোৱে আপোনাৰ ডিভাইচটোৰ বাবে নীতি আহৰণ কৰিব নোৱাৰিলে।</translation> <translation id="347785443197175480"><ph name="HOST" />ক আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন এক্সেছ কৰি থাকিবলৈ দিয়ক</translation> <translation id="3478685642445675458">কোনো ব্যক্তিক আঁতৰোৱাৰ পূর্বে আপোনাৰ প্ৰ‘ফাইল আনলক কৰক।</translation> -<translation id="3479539252931486093">এয়া অপ্ৰত্যাশিত নেকি? <ph name="BEGIN_LINK" />আমাক জানিবলৈ দিয়ক<ph name="END_LINK" /></translation> <translation id="3479552764303398839">এতিয়া নহয়</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> ছেকেণ্ডত <ph name="ALTERNATIVE_BROWSER_NAME" />ত খোলা হ'ব</translation> <translation id="3484273680291419129">ক্ষতিকাৰক ছফ্টৱেৰবোৰ আঁতৰাই থকা হৈছে...</translation> @@ -2238,6 +2246,7 @@ <translation id="4138267921960073861">ছাইন ইন কৰা পৃষ্ঠাত ব্যৱহাৰকাৰীৰ নাম আৰু ফট’সমূহ দেখুৱাওক</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID ডিভাইচ সংযোগ কৰা আছে</translation> <translation id="4142052906269098341">আপোনাৰ ফ’নৰ জৰিয়তে নিজৰ <ph name="DEVICE_TYPE" /> আনলক কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">চিনাক্ত হোৱা প্ৰিণ্টাৰসমূহ আপোনাৰ প্ৰ’ফাইলত ছেভ কৰক অথবা এটা নতুন প্ৰিণ্টাৰ যোগ কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="4144218403971135344">উন্নত মানৰ ভিডিঅ’ পাওক আৰু বেটাৰীৰ খৰচ ৰাহি কৰক। আপোনাৰ কাষ্ট কৰিব পৰা সুবিধাটো সক্ষম কৰি থোৱা স্ক্ৰীণতহে ভিডিঅ’ প্লে’ হ’ব।</translation> <translation id="4146026355784316281">সদায় ছিষ্টেম ভিউৱাৰৰ জৰিয়তে খোলক</translation> <translation id="4146785383423576110">ৰিছেট কৰক আৰু ক্ষতিকাৰক ছফ্টৱেৰ মচক</translation> @@ -2361,6 +2370,7 @@ <translation id="4364327530094270451">মেল’ন</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />এ এখন ৱিণ্ড' শ্বেয়াৰ কৰি আছে।</translation> <translation id="4364830672918311045">জাননী দেখুওৱা</translation> +<translation id="436499142539576997">এপ্ ডেটা আহৰণ কৰিব পৰা নগ’ল, এপ্টো চলাবলৈ এতিয়াও চেষ্টা কৰি থকা হৈছে...</translation> <translation id="4370975561335139969">আপুনি দিয়া ইমেইল আৰু পাছৱৰ্ড মিলা নাই</translation> <translation id="437184764829821926">উচ্চখাপৰ ফ’ণ্টৰ ছেটিংসমূহ</translation> <translation id="4374831787438678295">Linux ইনষ্টলাৰ</translation> @@ -2550,6 +2560,7 @@ <translation id="465878909996028221">ব্ৰাউজাৰ পুনৰ্নিৰ্দেশৰ বাবে কেৱল http, https আৰু ফাইলৰ প্ৰট'কলসমূহহে সমৰ্থিত।</translation> <translation id="4659077111144409915">প্ৰাথমিক একাউণ্ট</translation> <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" সংস্কৰণৰ অনুমান কৰা হৈছিল কিন্তু সংস্কৰণটো "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">আপোনাৰ কোঠাটোৰ লে’আউট</translation> <translation id="4662788913887017617">এই বুকমাৰ্কটো আপোনাৰ iPhoneৰ সৈতে শ্বেয়াৰ কৰক</translation> <translation id="4663373278480897665">কেমেৰা ব্যৱহাৰৰ অনুমতি দিয়া হৈছে</translation> <translation id="4664482161435122549">PKCS #12 আমদানি সম্পর্কীয় আসোঁৱাহ</translation> @@ -2712,6 +2723,7 @@ <translation id="4900392736118574277">আপোনাৰ আৰম্ভণিতে খোল খুৱা পৃষ্ঠাটো <ph name="URL" />লৈ সলনি কৰা হৈছে।</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" />টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, সংযোগ কৰক</translation> <translation id="49027928311173603">ছাৰ্ভাৰৰ পৰা ডাউনল’ড কৰা নীতিটো অমান্য: <ph name="VALIDATION_ERROR" />।</translation> +<translation id="4906490889887219338">নেটৱৰ্কৰ ফাইল শ্বেয়াৰ কৰা সুবিধাটো ছেট আপ অথবা পৰিচালনা কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="4907161631261076876">এই ফাইলটো সাধাৰণতে ডাউনল’ড কৰা নহয় আৰু ই ক্ষতিকাৰক হ’ব পাৰে।</translation> <translation id="4907306957610201395">অনুমতিৰ শ্ৰেণী</translation> <translation id="4908811072292128752">দুটা ছাইট একেলগে ব্ৰাউজ কৰিবলৈ এটা নতুন টেব খোলক</translation> @@ -2799,6 +2811,7 @@ <translation id="5038863510258510803">সক্ষম কৰি থকা হৈছে…</translation> <translation id="5039804452771397117">অনুমতি দিয়ক</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />ক Linuxৰ সৈতে সংযুক্ত কৰিবলৈ ছেটিংসমূহ খোলক</translation> +<translation id="5043913660911154449">অথবা আপোনাৰ প্ৰিণ্টাৰ PPD নিৰ্দিষ্ট কৰক <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ভুল পাছৱৰ্ড</translation> <translation id="504561833207953641">পূর্বে থকা ব্ৰাউজাৰ ছেশ্বনত খুলি আছে।</translation> <translation id="5047421709274785093">গতি আৰু পোহৰৰ ছেন্সৰ ব্যৱহাৰ কৰাৰ ক্ষেত্ৰত ছাইটবোৰক অৱৰোধ কৰক</translation> @@ -3083,6 +3096,7 @@ <translation id="5464660706533281090">এই ছেটিংটো কোনো শিশু ব্যৱহাৰকাৰীয়ে সলনি কৰিব নোৱাৰে।</translation> <translation id="5466374726908360271">পে&ষ্ট কৰি “<ph name="SEARCH_TERMS" />”ৰ সন্ধান কৰক</translation> <translation id="5468173180030470402">ফাইলৰ শ্বেয়াৰসমূহ বিচাৰি থকা হৈছে</translation> +<translation id="5470735824776589490">পাৱাৰৱাশ্বৰ জৰিয়তে আপোনাৰ ডিভাইচটো ৰিছেট কৰিব পৰাৰ পূর্বে এবাৰ ৰিষ্টার্ট কৰাৰ আৱশ্যক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="5471768120198416576">নমস্কাৰ! মই আপোনাৰ পাঠৰপৰা কথনৰ ভইচ।</translation> <translation id="5472133193607270166">যেতিয়া অন থাকে তেতিয়া আপুনি বেলেগ বেলেগ ছাইটত কৰা ব্ৰাউজিং কাৰ্যকলাপ ছাইটসমূহে বিজ্ঞাপনসমূহ ব্যক্তিগতকৃত কৰিবলৈ ব্যৱহাৰ কৰিব নোৱাৰে। কিছুমান ছাইটে ভালকৈ কাম নকৰিব পাৰে।</translation> <translation id="5473333559083690127">আপোনাৰ নতুন পিনটো আকৌ দিয়ক</translation> @@ -3106,6 +3120,7 @@ <translation id="5496587651328244253">শৃংখলাবদ্ধ কৰক</translation> <translation id="5499313591153584299">এই ফাইলটো আপোনাৰ কম্পিউটাৰৰ বাবে ক্ষতিকাৰক হ'ব পাৰে।</translation> <translation id="5502500733115278303">Firefoxৰ পৰা আমদানি কৰা হৈছে</translation> +<translation id="5505264765875738116">ছাইটসমূহে জাননী পঠিয়াবলৈ ক’ব নোৱাৰে</translation> <translation id="5505307013568720083">চিয়াহী শেষ হৈছে</translation> <translation id="5507756662695126555">প্ৰত্যাখ্যান নকৰা</translation> <translation id="5509693895992845810">ইয়াৰ এটা &হিচাপে ছেভ কৰক...</translation> @@ -3317,6 +3332,7 @@ <translation id="5801568494490449797">অগ্ৰাধিকাৰসমূহ</translation> <translation id="5804175651771201311">ৰ’মিং অফ কৰা আছে</translation> <translation id="5804241973901381774">অনুমতি</translation> +<translation id="5804427196348435412">NFC ডিভাইচসমূহ ব্যৱহাৰ কৰক</translation> <translation id="5805697420284793859">ৱিণ্ড‘ পৰিচালক</translation> <translation id="5806773519584576205">০° (ডিফ’ল্ট)</translation> <translation id="5811750797187914944">সকলো সাজু</translation> @@ -3531,6 +3547,7 @@ <translation id="6096047740730590436">বিস্তাৰিত আকাৰত খোলক</translation> <translation id="6096326118418049043">X.500 নাম</translation> <translation id="6097480669505687979">যদি আপুনি ঠাই খালী নকৰে, ব্যৱহাৰকাৰী আৰু ডেটা হয়তো স্বয়ংক্ৰিয়ভাৱে আঁতৰোৱা হ’ব পাৰে।</translation> +<translation id="6097600385983390082">কণ্ঠধ্বনিৰ দ্বাৰা সন্ধান কৰা সুবিধাটো বন্ধ কৰা হৈছে</translation> <translation id="6098793583803863900">এটা অজ্ঞাত ফাইল বিপজ্জনক সমলৰ বাবে স্কেন কৰি থকা হৈছে।</translation> <translation id="6100736666660498114">আৰম্ভণি মেনু</translation> <translation id="6102043788063419338">এই ফাইলটো উন্নত সুৰক্ষাৰ দ্বাৰা সুৰক্ষিত নীতিয়ে অৱৰোধ কৰিছে।</translation> @@ -3625,6 +3642,7 @@ <translation id="6233154960150021497">ডিফ'ল্ট হৈছে কীব'ৰ্ডৰ পৰিৱৰ্তে কণ্ঠধ্বনিৰ ব্যৱহাৰ কৰা</translation> <translation id="6234474535228214774">ইনষ্টল বাকী আছে</translation> <translation id="6237816943013845465">আপোনাক নিজৰ স্ক্ৰীণৰ ৰিজ'লিউশ্বন মিলাবলৈ অনুমতি দিয়ে</translation> +<translation id="6238624845858322552">ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ কৰক</translation> <translation id="6238767809035845642">অন্য ডিভাইচৰ পৰা শ্বেয়াৰ কৰা পাঠ</translation> <translation id="6238923052227198598">শেহতীয়া টোকাটো লক স্ক্ৰীণত ৰাখক</translation> <translation id="6239558157302047471">&ফ্ৰে'ম পুনৰ ল'ড কৰক</translation> @@ -3651,6 +3669,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" />টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" />, <ph name="PHONE_NAME" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, ফ’নৰ বেটাৰী <ph name="BATTERY_STATUS" />%, সংযোগ কৰক</translation> <translation id="6268252012308737255"><ph name="APP" />ৰ জৰিয়তে খোলক</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">ছাইটসমূহে জাননী পঠিয়াবলৈ ক’ব পাৰে</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />ছিষ্টেম আৰু এপৰ তথ্য<ph name="END_LINK1" /> আৰু <ph name="BEGIN_LINK2" />মেট্ৰিক্স<ph name="END_LINK2" /> পঠিয়াওক</translation> <translation id="6272643420381259437">প্লাগইন ডাউনল’ড কৰাৰ সময়ত কোনো আসোঁৱাহ (<ph name="ERROR" />) হৈছে</translation> <translation id="6273677812470008672">গুণগত মান</translation> @@ -3672,6 +3691,7 @@ <translation id="629730747756840877">একাউণ্ট</translation> <translation id="6298962879096096191">Androidৰ এপ্ ইনষ্টল কৰিবলৈ Google Play ব্যৱহাৰ কৰক</translation> <translation id="630065524203833229">প্ৰ&স্থান কৰক</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" />ক স্বয়ংক্রিয়ভাৱে কনফিগাৰ কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি প্ৰিণ্টাৰৰ উচ্চখাপৰ সবিশেষ নিৰ্দিষ্ট কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="6305607932814307878">গ্ল’বেল নীতি:</translation> <translation id="6307990684951724544">ছিষ্টেম ব্যস্ত আছে</translation> <translation id="6308493641021088955">ছাইন ইনটো <ph name="EXTENSION_NAME" />এ প্ৰদান কৰিছে</translation> @@ -3839,6 +3859,7 @@ <translation id="6555810572223193255">বর্তমান মচিব নোৱাৰি</translation> <translation id="6556866813142980365">ৰিডু</translation> <translation id="6557290421156335491">মোৰ শ্বৰ্টকাটসমূহ</translation> +<translation id="6561560012278703671">নীৰৱ বাৰ্তা আদান-প্ৰদানৰ সুবিধা ব্যৱহাৰ কৰক (জাননীৰ প্ৰম্প্টসমূহে আপোনাৰ বাবে ব্যাঘাত সৃষ্টি কৰিব নোৱৰাকৈ সেইবোৰ অৱৰোধ কৰে)</translation> <translation id="6561726789132298588">দিয়ক</translation> <translation id="656293578423618167">ফাইল পাথ বা নামটো অতি দীঘল। অনুগ্ৰহ কৰি এটা চুটি নামৰ সৈতে বা অন্য ঠাইত ছেভ কৰক।</translation> <translation id="6563469144985748109">আপোনাৰ পৰিচালকে এই পর্যন্ত এইটো অনুমোদন জনোৱা নাই</translation> @@ -4021,6 +4042,7 @@ <translation id="6840155290835956714">পঠিওৱাৰ আগতে সোধক</translation> <translation id="6840184929775541289">প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ নহয়</translation> <translation id="6841186874966388268">আসোঁৱাহ</translation> +<translation id="6843267103192918276">আপোনাৰ সকলো ডিভাইচত বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য ছেটিংসমূহ পাবলৈ ছাইন ইন কৰক। আপোনাকো স্বয়ংক্ৰিয়ভাৱে আপোনাৰ Google সেৱাসমূহলৈ ছাইন ইন কৰোৱা হ’ব। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google সাজু</translation> <translation id="6845325883481699275">Chromeৰ সুৰক্ষা উন্নত কৰাত সহায় কৰক</translation> <translation id="6848388270925200958">এই মুহূৰ্তত আপোনাৰ লগত কেইখনমান কাৰ্ড আছে যিবোৰ কেৱল এই ডিভাইচটোতহে ব্যৱহাৰ কৰিব পাৰি</translation> @@ -4433,7 +4455,6 @@ <translation id="7442465037756169001">আপোনাৰ Hangouts Meetৰ হাৰ্ডৱেৰ ছেট আপ কৰিবলৈ সাজু আছে।</translation> <translation id="744341768939279100">কোনো নতুন প্ৰ’ফাইল সৃষ্টি কৰক</translation> <translation id="7443806024147773267">আপুনি আপোনাৰ Google একাউণ্টত ছাইন ইন হৈ থাকিলে নিজৰ পাছৱৰ্ডসমূহ এক্সেছ কৰক</translation> -<translation id="7444046173054089907">এই ছাইটটো অৱৰোধ কৰা হৈছে</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> অক্ষম কৰক</translation> <translation id="7448430327655618736">এপ্সমূহ স্বয়ংক্ৰিয়ভাৱে ইনষ্টল কৰক</translation> <translation id="7450761244949417357">এতিয়া <ph name="ALTERNATIVE_BROWSER_NAME" />ত খুলি থকা হৈছে</translation> @@ -4994,6 +5015,7 @@ <translation id="8214962590150211830">এই ব্যৱহাৰকাৰীজনক আঁতৰাওক</translation> <translation id="8215295261562449873">Linux আপগ্ৰে’ড কৰাৰ আগতে মোৰ এপ্ আৰু ফাইলসমূহ ডাউনল’ডসমূহ ফ’ল্ডাৰটোত বেক আপ কৰক।</translation> <translation id="8217399928341212914">স্বয়ংক্ৰিয়ভাৱে একাধিক ফাইল ডাউনল’ড হোৱা সুবিধাটো অৱৰোধ কৰিয়েই ৰাখক</translation> +<translation id="8218847192766059983">ভাষাসমূহ যোগ কৰক অথবা সূচীখনৰ ক্ৰম সলনি কৰক। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="8221491193165283816">আপুনি সাধাৰণতে জাননীসমূহ অৱৰোধ কৰে। এই ছাইটটোৱে আপোনাক জাননী দিয়াত অনুমতি দিবলৈ ইয়াত ক্লিক কৰক।</translation> <translation id="8225265270453771718">কোনো এপ্লিকেশ্বন ৱিণ্ড’ শ্বেয়াৰ কৰক</translation> <translation id="8225753906568652947">আপোনাৰ অফাৰসমূহ দাবী কৰক</translation> @@ -5265,6 +5287,7 @@ <translation id="862542460444371744">&এক্সটেনশ্বন</translation> <translation id="862727964348362408">স্থগিত</translation> <translation id="862750493060684461">CSS কেশ্ব</translation> +<translation id="8627706565932943526">ছিংক কৰাত আসোঁৱাহ</translation> <translation id="8627795981664801467">কেৱল সুৰক্ষিত সংযোগসমূহহে</translation> <translation id="8630903300770275248">তদাৰক কৰা ব্যৱহাৰকাৰী আমদানি কৰক</translation> <translation id="8631032106121706562">ফুলৰ পাহি</translation> @@ -5603,6 +5626,7 @@ <translation id="9065203028668620118">সম্পাদনা কৰক</translation> <translation id="9066773882585798925">ডাঙৰকৈ পঢ়া পাঠ শুনক</translation> <translation id="9066782832737749352">পাঠৰ পৰা কথন</translation> +<translation id="9067559831321817373">আপুনি ছাইন ইন কৰি থোৱা একাউণ্টসমূহ পৰিচালনা কৰক। Chrome আৰু Google Playৰ ৱেবছাইট, এপ্ আৰু এক্সটেনশ্বনসমূহে অনুমতি সাপেক্ষে আপোনাৰ অভিজ্ঞতা কাষ্টমাইজ কৰিবলৈ এই একাউণ্টসমূহ ব্যৱহাৰ কৰিব পাৰে। <a>অধিক জানক</a></translation> <translation id="9068849894565669697">ৰং বাছনি কৰক</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">ব্লুটুথ</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 527cc0b9..c50eef8ce 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Bu səhifə cavab vermir</translation> <translation id="1041263367839475438">Əlçatan cihazlar</translation> <translation id="1042174272890264476">Kompüteriniz həmçinin daxili <ph name="SHORT_PRODUCT_NAME" /> RLZ kitabxanası ilə gəlir. RLZ axtarışları və <ph name="SHORT_PRODUCT_NAME" /> istifadəsini ölçmək üçün identifikasiya edilə bilən teq ayırır. Bu etiketlər bəzən <ph name="PRODUCT_NAME" /> daxilində, Google Axtarış sorğularında görünür.</translation> +<translation id="1043818413152647937">Həmçinin bu tətbiqlərdən data silinsin?</translation> <translation id="1045692658517323508">{0,plural, =1{1 dəqiqə ərzində güncəllənəcək}other{# dəqiqə ərzində güncəllənəcək}}</translation> <translation id="1046635659603195359">Artıq digər cihazda Google Assistent ilə Voice Match ayarlamısınız. Əvvəlki səsyazıları bu cihazda səs modeli yaratmaq üçün istifadə edilə bilər. Bu, bir dəqiqədən az vaxt ala bilər.</translation> <translation id="1047431265488717055">Link Mətnini Kopyalayın</translation> @@ -107,6 +108,7 @@ <translation id="114721135501989771">Chrome'da Google yenilikləri əldə edin</translation> <translation id="1147991416141538220">Giriş tələb etmək üçün bu cihazın administratoru ilə əlaqə saxlayın.</translation> <translation id="1149401351239820326">Bitmə ayı</translation> +<translation id="1150490752229770117">Bu, <ph name="DEVICE_TYPE" /> cihazı üçün sonuncu avtomatik proqram təminatı və təhlükəsizlik güncəlləməsidir. Növbəti güncəlləmələri əldə etmək üçün cihazı yeni modelə təkmilləşdirin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Gün eynəyi</translation> <translation id="1151917987301063366"><ph name="HOST" /> hostunun daima sensorlara daxil olmasına icazə verin</translation> <translation id="1153356358378277386">Birləşmiş cihazlar</translation> @@ -507,7 +509,9 @@ <translation id="1709217939274742847">Doğrulamada istifadə edəcəyiniz bileti seçin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1712349894969001173">iPhone'da bu parolu əldə edin</translation> <translation id="1712552549805331520"><ph name="URL" /> datanı həmişəlik lokal kompüterinizdə yadda saxlamaq istəyir</translation> +<translation id="1714644264617423774">Cihazınızın daha asan istfadəsi üçün əlçatımlıq funksiyalarını aktiv edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Hərəkət sensorları</translation> +<translation id="171824261579749339">Avstraliya <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Son saat</translation> <translation id="1719312230114180055">Qeyd: Barmaq izi güclü kod və ya PIN koddan daha az təhlükəsiz ola bilər.</translation> <translation id="1720318856472900922">TLS WWW Server Doğrulaması</translation> @@ -769,6 +773,7 @@ <translation id="2096715839409389970">Üçüncü tərəf kukilərini təmizləyin</translation> <translation id="2097372108957554726">Yeni cihazları qeydiyyat etmək üçün Chrome'a daxil olmalısınız</translation> <translation id="2099172618127234427">Chrome OS baq ləğvini aktivləşdirirsiniz ki, sshd daemon quraşdırır və USB cihazlarından yüklənməyə imkan verir.</translation> +<translation id="2099625543891475722">boy kimi fiziki göstəriciləriniz</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" server sertifikatı silinsin?</translation> <translation id="2100273922101894616">Hesaba avtomatik giriş</translation> <translation id="2101225219012730419">Versiya:</translation> @@ -1022,6 +1027,7 @@ <translation id="2445484935443597917">Yeni Profil Yaradın</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> şəxsiyyətinizi doğrulamaq istəyir</translation> <translation id="2448312741937722512">Növ</translation> +<translation id="2448734521821581858">Kukilər ziyarət etdiyiniz vebsaytların yaratdığı fayllardır. İki növ kuki var: Birinci tərəf kukilər ziyarət etdiyiniz sayt tərəfindən yaradılır. Sayt ünvan panelində göstərilir. Üçüncü tərəf kukilər başqa saytlar tərəfindən yaradılır. Bu saytlar ziyarət etdiyiniz vebsaytda gördüyünüz reklam və ya şəkillər kimi bəzi məzmunun sahibidir.</translation> <translation id="2450223707519584812">Google API açarları çatışmadığı üçün istifadəçiləri əlavə edə bilməyəcəksiniz. Ətraflı məlumat üçün <ph name="DETAILS_URL" /> baxın.</translation> <translation id="2450849356604136918">Aktiv baxış yoxdur</translation> <translation id="2451298179137331965">2x</translation> @@ -1135,6 +1141,7 @@ <translation id="2587922766792651800">Vaxt bitdi</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> vendorundan cihazlar</translation> <translation id="2594999711683503743">Google'da axtarın və ya link yazın</translation> +<translation id="2600522410036850735">Avtomatik proqram təminatı və təhlükəsizlik güncəlləmələri <ph name="MONTH_AND_YEAR" /> tarixinə kimi bu cihaza göndəriləcək. <a target="_blank" href="<ph name="URL" />">Ətraflı məlumat</a></translation> <translation id="2603115962224169880">Kompüteri təmizləyin</translation> <translation id="2603463522847370204">İnkoqnito pəncərəsində açın</translation> <translation id="2604255671529671813">Şəbəkə bağlantı xətası</translation> @@ -1555,6 +1562,7 @@ <translation id="3181954750937456830">Təhlükəsiz Axtarış (Sizi və cihazınızı təhlükəli saytlardan qoruyur)</translation> <translation id="3182749001423093222">Orfoqrafik yoxlanış</translation> <translation id="3183139917765991655">Profil İmporter</translation> +<translation id="3184536091884214176">CUPS printerlərini quraşdırın və ya idarə edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Fayllarım</translation> <translation id="3188465121994729530">Hərəkətli Ortalama</translation> <translation id="3190558889382726167">Yadda saxlanılmış Parol</translation> @@ -1745,7 +1753,6 @@ <translation id="347670947055184738">Ups! Sistem cihaz siyasətini əldə edə bilmədi.</translation> <translation id="347785443197175480"><ph name="HOST" /> hostuna kameranıza və mikrofonunuza giriş verirsiniz</translation> <translation id="3478685642445675458">Bir şəxsi silməmişdən əvvəl, profilinizin kilidini açın.</translation> -<translation id="3479539252931486093">Bu gözlənilməz oldu? <ph name="BEGIN_LINK" />Bizə bildirin<ph name="END_LINK" /></translation> <translation id="3479552764303398839">İndi yox</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> saniyə ərzində <ph name="ALTERNATIVE_BROWSER_NAME" /> tətbiqində açılacaq</translation> <translation id="3484273680291419129">Zərərli proqram təminatı silinir...</translation> @@ -2250,6 +2257,7 @@ <translation id="4138267921960073861">Hesaba giriş ekranında istifadəçi adları və fotoları göstərin</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID cihazı qoşuludur</translation> <translation id="4142052906269098341"><ph name="DEVICE_TYPE" /> cihazını telefon ilə kiliddən çıxarın. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Aşkarlanan printerləri profilinizdə saxlayın və ya yenisini əlavə edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Daha yaxşı video keyfiyyəti əldə edin və batareyaya qənaət edin. Video yalnız Yayımın aktiv edildiyi ekranda oxudulacaq.</translation> <translation id="4146026355784316281">Həmişə sistem izləyicisini açın</translation> <translation id="4146785383423576110">Sıfırlayın və təmizləyin</translation> @@ -2374,6 +2382,7 @@ <translation id="4364327530094270451">Yemiş</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> tətbiqi pəncərə paylaşır.</translation> <translation id="4364830672918311045">Bildirişləri görüntüləyin</translation> +<translation id="436499142539576997">Tətbiq datasını əldə etmək alınmadı, hələ də tətbiqi icra etməyə cəhd edilir...</translation> <translation id="4370975561335139969">Daxil etdiyiniz e-poçt və parol uyğun gəlmir</translation> <translation id="437184764829821926">Qabaqcıl şrift ayarları</translation> <translation id="4374831787438678295">Linux quraşdırıcısı</translation> @@ -2564,6 +2573,7 @@ <translation id="465878909996028221">Yalnız http, https və fayl protokolları brauzer yönləndirməsini dəstəkləyir.</translation> <translation id="4659077111144409915">Əsas hesab</translation> <translation id="4660476621274971848">Gözlənilən versiya "<ph name="EXPECTED_VERSION" />" olsa da, versiya "<ph name="NEW_ID" />" idi.</translation> +<translation id="4660838440047236328">otağınızın tərtibatı</translation> <translation id="4662788913887017617">Bu əlfəcini iPhone ilə paylaşın</translation> <translation id="4663373278480897665">Kameraya icazə verildi</translation> <translation id="4664482161435122549">PKCS #12 Eksport Xətası</translation> @@ -2727,6 +2737,7 @@ <translation id="4900392736118574277">Başlanğıc səhifə <ph name="URL" /> olaraq dəyişdirildi.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> şəbəkə, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Qoşulun</translation> <translation id="49027928311173603">Serverdən endirilmiş qaydalar güvənsizdir: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Şəbəkə fayl paylaşımlarını ayarlayın və ya idarə edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Bu tətbiq adətən endirilmir və təhlükəli ola bilər.</translation> <translation id="4907306957610201395">İcazə Kateqoriyası</translation> <translation id="4908811072292128752">Eyni anda iki saytı axtarmaq üçün yeni tab açın</translation> @@ -2814,6 +2825,7 @@ <translation id="5038863510258510803">Aktivləşir...</translation> <translation id="5039804452771397117">İcazə verin</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> cihazını Linux'a qoşmaq üçün Ayarları açın</translation> +<translation id="5043913660911154449">Və ya printer PPD faylını təyin edin <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Yanlış parol</translation> <translation id="504561833207953641">Mövcud brauzer sessiyasında açılır.</translation> <translation id="5047421709274785093">Saytların hərəkət və işıq senorlarından istifadə etməsini blok edin</translation> @@ -3099,6 +3111,7 @@ <translation id="5464660706533281090">Bu ayarı azyaşlı istifadəçi dəyişə bilməz.</translation> <translation id="5466374726908360271">"<ph name="SEARCH_TERMS" />" ifadəsini yerləşdirib axtarın</translation> <translation id="5468173180030470402">Fayl paylaşımı axtarılır</translation> +<translation id="5470735824776589490">Cihazınız fabrik sıfırlaması etmədən öncə yenidən başladılmalıdır. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Salam! Mən Sizin mətndən-nitqə səsinizəm.</translation> <translation id="5472133193607270166">Aktiv olduqda, saytlar reklamları fərdiləşdirmək üçün müxtəlif saytlarda axtarış fəaliyyətinizi istifadə edə bilməz. Bəzi saytlar düzgün işləməyə bilər.</translation> <translation id="5473333559083690127">Yeni PIN kodu yenidən daxil edin</translation> @@ -3122,6 +3135,7 @@ <translation id="5496587651328244253">Təşkil etmək</translation> <translation id="5499313591153584299">Bu fayl kompüteriniz üçün zərərli ola bilər.</translation> <translation id="5502500733115278303">Firefox'dan import edilib</translation> +<translation id="5505264765875738116">Saytlar bildiriş göndərilməsini tələb edə bilməz</translation> <translation id="5505307013568720083">Mürəkkəb bitdi</translation> <translation id="5507756662695126555">İmtinasızlıq</translation> <translation id="5509693895992845810">Yadda saxlama formatı:</translation> @@ -3336,6 +3350,7 @@ <translation id="5801568494490449797">Seçimlər</translation> <translation id="5804175651771201311">Rominq deaktivdir</translation> <translation id="5804241973901381774">İcazələr</translation> +<translation id="5804427196348435412">NFC cihazlarını istifadə edin</translation> <translation id="5805697420284793859">Pəncərə meneceri</translation> <translation id="5806773519584576205">0° (Defolt)</translation> <translation id="5811750797187914944">Tam hazır</translation> @@ -3549,6 +3564,7 @@ <translation id="6096047740730590436">Maksimal açın</translation> <translation id="6096326118418049043">X.500 Ad</translation> <translation id="6097480669505687979">Yer boşaltmasanız, istifadəçilər və data avtomatik silinə bilər.</translation> +<translation id="6097600385983390082">Səslə axtarış bağlıdır</translation> <translation id="6098793583803863900">Naməlum fayl skanlanaraq məzmunun təhlükəli olub-olmaması yoxlanılır.</translation> <translation id="6100736666660498114">Başlanğıc menyusu</translation> <translation id="6101226222197207147">Yeni tətbiq əlavə edildi (<ph name="EXTENSION_NAME" />)</translation> @@ -3644,6 +3660,7 @@ <translation id="6233154960150021497">Klaviatura əvəzinə səsdən istifadə üçün defolt</translation> <translation id="6234474535228214774">Quraşdırma gözlənilir</translation> <translation id="6237816943013845465">Ekran ayırdetmə dəqiqliyini nizamlamağa icazə verir</translation> +<translation id="6238624845858322552">Bluetooth cihazına qoşulun</translation> <translation id="6238767809035845642">Digər Cihazdan paylaşılan mətn</translation> <translation id="6238923052227198598">Ən son qeydi kilid ekranında saxlayın</translation> <translation id="6239558157302047471">Çərçivəni yenidən yükləyin</translation> @@ -3670,6 +3687,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> şəbəkə, <ph name="PHONE_NAME" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Telefonun Batareyası <ph name="BATTERY_STATUS" />%, Qoşulun</translation> <translation id="6268252012308737255"><ph name="APP" /> ilə açın</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Saytlar bildiriş göndərilməsini tələb edə bilər</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Sistem və tətbiq məlumatı<ph name="END_LINK1" /> və <ph name="BEGIN_LINK2" />ölçüləri<ph name="END_LINK2" /> göndərin</translation> <translation id="6272643420381259437">Plaqin endirilən zaman xəta (<ph name="ERROR" />) oldu</translation> <translation id="6273677812470008672">Keyfiyyət</translation> @@ -3691,6 +3709,7 @@ <translation id="629730747756840877">Hesab</translation> <translation id="6298962879096096191">Android tətbiqlərini quraşdırmaq üçün Google Play istifadə edin</translation> <translation id="630065524203833229">Çıxış</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> avtomatik konfiqurasiya edilə bilmədi. Qabaqcıl printer məlumatlarını təyin edin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Qlobal Siyasət:</translation> <translation id="6307990684951724544">Sistem məşğuldur</translation> <translation id="6308493641021088955">Giriş <ph name="EXTENSION_NAME" /> tərəfindən təmin edilib</translation> @@ -3860,6 +3879,7 @@ <translation id="6555810572223193255">Təmizləmə hazırda əlçatandır</translation> <translation id="6556866813142980365">Yenidən edin</translation> <translation id="6557290421156335491">Qısayollarım</translation> +<translation id="6561560012278703671">Səssiz mesajlaşmadan istifadə edin (bildirişlər sizi narahat etməyəcək)</translation> <translation id="6561726789132298588">girin</translation> <translation id="656293578423618167">Fayl yolu və ya adı çox uzundur. Qısa ad ilə və ya başqa yerə saxlayın.</translation> <translation id="6563469144985748109">Meneceriniz hələ ki təsdiq etməyib</translation> @@ -4043,6 +4063,7 @@ <translation id="6840155290835956714">Göndərməmişdən əvvəl soruşun</translation> <translation id="6840184929775541289">Sertifikatlaşdırma Təşkilatı deyil</translation> <translation id="6841186874966388268">Xətalar</translation> +<translation id="6843267103192918276">Bütün cihazlarınızda əlfəcin, tarixçə, parol və digər ayarları əldə etmək üçün daxil olun. Həmçinin, avtomatik olaraq Google xidmətlərinə daxil ediləcəksiniz. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google tam hazırdır</translation> <translation id="6845038076637626672">Maksimal açın</translation> <translation id="6845325883481699275">Chrome təhlükəsizliyini təkmilləşdirin</translation> @@ -4459,7 +4480,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware quraşdırmağa hazırdır.</translation> <translation id="744341768939279100">Yeni profil yaradın</translation> <translation id="7443806024147773267">Google Hesabına hər dəfə daxil olduğunuz zaman parollarınızı əldə edin</translation> -<translation id="7444046173054089907">Bu sayt blok edilib</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> deaktiv edin</translation> <translation id="7448430327655618736">Tətbiqləri avtomatik quraşdırın</translation> <translation id="7450761244949417357">İndi <ph name="ALTERNATIVE_BROWSER_NAME" /> tətbiqində açılır</translation> @@ -5022,6 +5042,7 @@ <translation id="8214962590150211830">Bu Şəxsi Silin</translation> <translation id="8215295261562449873">Linux'u güncəlləmədən öncə tətbiq və fayllarımı Endirmələr qovluğuna yedəkləyin.</translation> <translation id="8217399928341212914">Çoxsaylı faylların avtomatik endirilməsini bloklamağa davam edin</translation> +<translation id="8218847192766059983">Dillər əlavə edin və ya siyahını yenidən sıralayın. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Bildirişləri, adətən, bloklayırsınız. Bu saytın sizə bildirişlər göndərməsinə icazə vermək üçün buraya klikləyin.</translation> <translation id="8225265270453771718">Tətbiq pəncərəsini paylaşın</translation> <translation id="8225753906568652947">Təkliflərinizi əldə edin</translation> @@ -5633,6 +5654,7 @@ <translation id="9065203028668620118">Düzəliş edin</translation> <translation id="9066773882585798925">Mətnin ucadan səsləndirilməsinə qulaq asın</translation> <translation id="9066782832737749352">Yazıdan Nitqə Çevirmə</translation> +<translation id="9067559831321817373">Giriş edilən hesabları idarə edin. Chrome və Google Play'dəki veb saytlar, tətbiqlər və artırmalar icazələrdən asılı olaraq təcrübənizi fərdiləşdirmək üçün bu hesablardan istifadə edə bilər. <a>Ətraflı məlumat</a></translation> <translation id="9068849894565669697">Rəng seçin</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 20cfa98..bb0a069 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Гэтая старонка не адказвае</translation> <translation id="1041263367839475438">Даступныя прылады</translation> <translation id="1042174272890264476">Ваш камп'ютар пастаўляецца з убудаванай бібліятэкай RLZ для <ph name="SHORT_PRODUCT_NAME" />. RLZ прызначае неўнікальны цэтлік, які не дазваляе ідэнтыфікаваць асобу, для ацэнкі пошукавых запытаў і статыстыкі выкарыстання <ph name="SHORT_PRODUCT_NAME" />, якія з'яўляюцца вынікам пэўных рэкламных кампаній. Гэтыя меткі часам з'яўляюцца ў пошукавых запытах у Google у прадукце <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Таксама выдаліць даныя з гэтых праграм?</translation> <translation id="1045692658517323508">{0,plural, =1{Абнавіце прыладу на працягу 1 хвіліны}one{Абнавіце прыладу на працягу # хвіліны}few{Абнавіце прыладу на працягу # хвілін}many{Абнавіце прыладу на працягу # хвілін}other{Абнавіце прыладу на працягу # хвіліны}}</translation> <translation id="1046635659603195359">Здаецца, вы ўжо наладзілі функцыю Voice Match у Памочніку Google на іншай прыладзе. Зробленыя запісы можна выкарыстоўваць для стварэння галасавой мадэлі на гэтай прыладзе. Гэта зойме менш за хвіліну.</translation> <translation id="1047431265488717055">Скапіраваць &тэкст спасылкі</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Разумныя функцыі ў Chrome</translation> <translation id="1147991416141538220">Каб запытаць доступ, звярніцеся да адміністратара гэтай прылады.</translation> <translation id="1149401351239820326">Месяц заканчэння тэрміну дзеяння</translation> +<translation id="1150490752229770117">Гэта апошняе аўтаматычнае абнаўленне праграмнага забеспячэння і сістэмы бяспекі для гэтай прылады <ph name="DEVICE_TYPE" />. Каб атрымліваць наступныя абнаўленні, перайдзіце на новую мадэль. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Сонечныя акуляры</translation> <translation id="1151917987301063366">Заўсёды даваць хосту <ph name="HOST" /> доступ да датчыкаў</translation> <translation id="1153356358378277386">Спалучаныя прылады</translation> @@ -281,6 +283,7 @@ <translation id="1397500194120344683">Няма прыдатных прылад. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1398853756734560583">Разгарнуць</translation> <translation id="1399511500114202393">Не выкарыстоўваць сертыфікат карыстальніка</translation> +<translation id="1403519882106291341">Умовы Google Chrome OS</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (падкантрольны карыстальнік)</translation> <translation id="1405779994569073824">Збой.</translation> <translation id="1406500794671479665">Ідзе спраўджанне...</translation> @@ -510,7 +513,9 @@ <translation id="1709217939274742847">Выберыце, які білет выкарыстоўваць для аўтэнтыфікацыі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Атрымайце гэты пароль на свой iPhone</translation> <translation id="1712552549805331520">Сайт <ph name="URL" /> запытвае дазволу захоўваць даныя на лакальным камп'ютары</translation> +<translation id="1714644264617423774">Каб спрасціць карыстанне прыладай, уключыце спецыяльныя магчымасці. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Датчыкі руху</translation> +<translation id="171824261579749339">Адваротная прагортка <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1718835860248848330">За апошнюю гадзіну</translation> <translation id="1719312230114180055">Заўвага. Выкарыстанне адбітка пальца можа быць менш бяспечным, чым надзейны пароль або PIN-код.</translation> <translation id="1720318856472900922">Аўтэнтыфікацыя сервера TLS WWW</translation> @@ -772,6 +777,7 @@ <translation id="2096715839409389970">Выдаліць староннія файлы cookie</translation> <translation id="2097372108957554726">Каб рэгістраваць новыя прылады, трэба ўвайсці ў Chrome</translation> <translation id="2099172618127234427">Вы ўключаеце функцыі адладкі Chrome OS. Будзе наладжаны дэман SSHD і дазволена загрузка з USB-дыскаў.</translation> +<translation id="2099625543891475722">вашы фізічныя характарыстыкі, такія як рост</translation> <translation id="2099686503067610784">Выдаліць сертыфікат сервера "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Аўтаматычны ўваход</translation> <translation id="2101225219012730419">Версія:</translation> @@ -1026,6 +1032,7 @@ <translation id="2445484935443597917">Стварыць новы профіль</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> запытвае спраўджанне вашай асобы</translation> <translation id="2448312741937722512">Тып</translation> +<translation id="2448734521821581858">Файлы cookie – гэта файлы, якія ствараюцца вэб-сайтамі, якія вы наведваеце. Ёсць два віды файлаў cookie. Асноўныя файлы cookie ствараюцца самім сайтам, які вы наведваеце. Ён паказваецца ў адрасным радку. Староннія файлы cookie ствараюцца іншымі сайтамі. Гэтым сайтам належыць пэўнае змесціва, такое як рэклама або відарысы, якое вы бачыце на вэб-сайце, які наведваеце.</translation> <translation id="2450223707519584812">Вы не зможаце дадаваць карыстальнікаў, бо адсутнічаюць ключы Google API. Даведацца больш: <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Няма актыўных праглядаў</translation> <translation id="2451298179137331965">2х</translation> @@ -1139,6 +1146,7 @@ <translation id="2587922766792651800">Праверка пратэрмінавана</translation> <translation id="2588636910004461974">Прылады ад пастаўшчыка "<ph name="VENDOR_NAME" />"</translation> <translation id="2594999711683503743">Увядзіце URL-адрас або пошукавы запыт у Google</translation> +<translation id="2600522410036850735">Гэта прылада будзе ўсталёўваць аўтаматычныя абнаўленні праграмнага забеспячэння і сістэмы бяспекі да <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Даведацца больш</a></translation> <translation id="2603115962224169880">Ачыстка камп'ютара</translation> <translation id="2603463522847370204">Адкрыць у &акне ў рэжыме інкогніта</translation> <translation id="2604255671529671813">Памылка падключэння да сеткі</translation> @@ -1559,6 +1567,7 @@ <translation id="3181954750937456830">Бяспечны прагляд (абараняе вас і прыладу ад небяспечных сайтаў)</translation> <translation id="3182749001423093222">Праверка правапісу</translation> <translation id="3183139917765991655">Сродак імпарту профілю</translation> +<translation id="3184536091884214176">Наладжванне прынтараў CUPS і кіраванне імі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Мае файлы</translation> <translation id="3188465121994729530">Рухомае сярэдняе</translation> <translation id="3190558889382726167">Пароль захаваны</translation> @@ -1749,7 +1758,6 @@ <translation id="347670947055184738">Памылка. Сістэме не ўдалося атрымаць палітыку для прылады.</translation> <translation id="347785443197175480">І далей даваць <ph name="HOST" /> доступ да камеры і мікрафона</translation> <translation id="3478685642445675458">Перш чым выдаляць карыстальніка, разблакіруйце свой профіль.</translation> -<translation id="3479539252931486093">Вы гэтага не чакалі? <ph name="BEGIN_LINK" />Паведаміце нам<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не зараз</translation> <translation id="3481268647794498892">Адкрыецца ў браўзеры <ph name="ALTERNATIVE_BROWSER_NAME" /> праз <ph name="COUNTDOWN_SECONDS" /> с</translation> <translation id="3484273680291419129">Ідзе выдаленне шкоднага праграмнага забеспячэння...</translation> @@ -2256,6 +2264,7 @@ <translation id="4138267921960073861">Паказваць фота і імёны карыстальнікаў на экране ўваходу</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – падключана прылада HID</translation> <translation id="4142052906269098341">Ажыццяўляйце разблакіроўку прылады <ph name="DEVICE_TYPE" /> з дапамогай тэлефона. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Захаванне ў профіль выяўленых прынтараў або дадаванне новага прынтара. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Гэта функцыя дазваляе павысіць якасць відэа і падоўжыць тэрмін службы акумулятара. Відэа будуць прайгравацца толькі на экранах з падтрымкай Cast.</translation> <translation id="4146026355784316281">Заўсёды адкрываць з дапамогай сістэмнага сродку прагляду</translation> <translation id="4146785383423576110">Скід налад і выдаленне шкоднага ПЗ</translation> @@ -2380,6 +2389,7 @@ <translation id="4364327530094270451">Дыня</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> абагульвае акно.</translation> <translation id="4364830672918311045">Паказ апавяшчэнняў</translation> +<translation id="436499142539576997">Не ўдалося атрымаць даныя праграмы. Працягваем спробы запусціць праграму...</translation> <translation id="4370975561335139969">Вы ўвялі няправільны адрас электроннай пошты або пароль</translation> <translation id="437184764829821926">Пашыраныя налады шрыфтоў</translation> <translation id="4374831787438678295">Усталёўшчык Linux</translation> @@ -2570,6 +2580,7 @@ <translation id="465878909996028221">Для перанакіравання з браўзера падтрымліваюцца толькі пратаколы "http", "https" і "file".</translation> <translation id="4659077111144409915">Асноўны ўліковы запіс</translation> <translation id="4660476621274971848">Чакалася версія "<ph name="EXPECTED_VERSION" />", фактычная версія – "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">планіроўку вашага пакоя</translation> <translation id="4662788913887017617">Абагульце гэту закладку з вашым iPhone</translation> <translation id="4663373278480897665">Камера дазволена</translation> <translation id="4664482161435122549">Памылка экспарту PKCS #12</translation> @@ -2733,6 +2744,7 @@ <translation id="4900392736118574277">Пачатковая старонка зменена на наступную: <ph name="URL" />.</translation> <translation id="4902546322522096650">Сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />%, падключыцца</translation> <translation id="49027928311173603">Палітыка, спампаваная з сервера, памылковая: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Наладка сеткавых файлаабменнікаў і кіраванне імі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Гэты файл звычайна не спампоўваецца і можа быць небяспечным.</translation> <translation id="4907306957610201395">Катэгорыя дазволаў</translation> <translation id="4908811072292128752">Адкрыйце новую ўкладку, каб праглядаць разам два сайты</translation> @@ -2820,6 +2832,7 @@ <translation id="5038863510258510803">Уключаецца...</translation> <translation id="5039804452771397117">Дазволіць</translation> <translation id="5042282098504489593">Каб падключыць прыладу "<ph name="USB_DEVICE_NAME" />" да сістэмы Linux, адкрыйце Налады</translation> +<translation id="5043913660911154449">Або ўкажыце файл PPD прынтара <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Няправільны пароль</translation> <translation id="504561833207953641">Ідзе адкрыццё ў бягучым сеансе браўзера.</translation> <translation id="5047421709274785093">Заблакіраваць сайтам выкарыстанне датчыкаў руху і святла</translation> @@ -3105,6 +3118,7 @@ <translation id="5464660706533281090">Карыстальнік-дзіця не можа змяняць гэту наладу.</translation> <translation id="5466374726908360271">У&ставіць і шукаць па запыце "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Ідзе пошук файлаабменнікаў</translation> +<translation id="5470735824776589490">Трэба перазапусціць прыладу, перш чым скідваць налады з дапамогай Powerwash. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Вітаю! Мой голас будзе выкарыстоўвацца для сінтэзу маўлення.</translation> <translation id="5472133193607270166">Калі ўключыць гэту наладу, сайты не змогуць выкарыстоўваць вашы дзеянні ў браўзеры на розных сайтах у мэтах персаналізацыі рэкламы. Некаторыя сайты могуць не працаваць належным чынам.</translation> <translation id="5473333559083690127">Паўторна ўвядзіце новы PIN-код</translation> @@ -3128,6 +3142,7 @@ <translation id="5496587651328244253">Упарадкаванне</translation> <translation id="5499313591153584299">Гэты файл можа нанесці шкоду вашаму камп'ютару.</translation> <translation id="5502500733115278303">Імпартаваныя з браўзера Firefox</translation> +<translation id="5505264765875738116">Сайтам забаронена запытваць дазвол на паказ апавяшчэнняў</translation> <translation id="5505307013568720083">Чарніла скончылася</translation> <translation id="5507756662695126555">Неабвержны</translation> <translation id="5509693895992845810">Захаваць &як...</translation> @@ -3342,6 +3357,7 @@ <translation id="5801568494490449797">Параметры</translation> <translation id="5804175651771201311">Роўмінг выключаны</translation> <translation id="5804241973901381774">Дазволы</translation> +<translation id="5804427196348435412">выкарыстоўваць прылады NFC</translation> <translation id="5805697420284793859">Менеджар вокнаў</translation> <translation id="5806773519584576205">0° (стандартна)</translation> <translation id="5811750797187914944">Гатова</translation> @@ -3557,6 +3573,7 @@ <translation id="6096047740730590436">Адкрыць у разгорнутым выглядзе</translation> <translation id="6096326118418049043">Назва X.500</translation> <translation id="6097480669505687979">Калі не вызваліць месца, могуць быць аўтаматычна выдалены карыстальнікі і даныя.</translation> +<translation id="6097600385983390082">Галасавы пошук закрыты</translation> <translation id="6098793583803863900">Невядомы файл правяраецца на наяўнасць небяспечнага змесціва.</translation> <translation id="6100736666660498114">Меню "Пуск"</translation> <translation id="6101226222197207147">Дададзена новая праграма (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3669,7 @@ <translation id="6233154960150021497">Стандартныя паводзіны — выкарыстоўваць голас замест клавіятуры</translation> <translation id="6234474535228214774">Чакаецца ўсталёўка</translation> <translation id="6237816943013845465">Дазваляе наладзіць раздзяляльнасць экрана</translation> +<translation id="6238624845858322552">Падключэнне да прылады Bluetooth</translation> <translation id="6238767809035845642">Тэкст, абагулены з іншай прылады</translation> <translation id="6238923052227198598">Захоўваць апошнюю нататку на экране блакіроўкі</translation> <translation id="6239558157302047471">Перазагрузіць &фрэйм</translation> @@ -3678,6 +3696,7 @@ <translation id="6267547857941397424">Сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />%, зарад акумулятара тэлефона – <ph name="BATTERY_STATUS" />%, падключыцца</translation> <translation id="6268252012308737255">Адкрыць у праграме <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайтам дазволена запытваць дазвол на паказ апавяшчэнняў</translation> <translation id="6270770586500173387">Адправіць <ph name="BEGIN_LINK1" />звесткі пра сістэму і праграмы<ph name="END_LINK1" />, а таксама <ph name="BEGIN_LINK2" />паказчыкі<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Адбылася памылка (<ph name="ERROR" />) падчас спампоўкі ўбудовы</translation> <translation id="6273677812470008672">Якасць</translation> @@ -3699,6 +3718,7 @@ <translation id="629730747756840877">Уліковы запіс</translation> <translation id="6298962879096096191">Для ўсталявання праграм Android выкарыстоўвайце Google Play</translation> <translation id="630065524203833229">В&ыйсці</translation> +<translation id="6300718114348072351">Не ўдалося аўтаматычна наладзіць <ph name="PRINTER_NAME" />. Укажыце пашыраныя звесткі пра прынтар. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Глабальная палітыка:</translation> <translation id="6307990684951724544">Сістэма занятая</translation> <translation id="6308493641021088955">Уваход забяспечвае сэрвіс <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3888,7 @@ <translation id="6555810572223193255">Ачыстка пакуль што недаступная</translation> <translation id="6556866813142980365">Узнавіць</translation> <translation id="6557290421156335491">Мае ярлыкі</translation> +<translation id="6561560012278703671">Забараніць сайтам адцягваць вашу ўвагу запытамі дазволу на паказ апавяшчэнняў. Паказваць замест іх індыкатар блакіроўкі ў адрасным радку</translation> <translation id="6561726789132298588">Enter</translation> <translation id="656293578423618167">Шлях да файла або яго назва занадта доўгія. Зрабіце назву карацейшай або ўкажыце іншае месцазнаходжанне.</translation> <translation id="6563469144985748109">Ваш менеджар пакуль што не ўхваліў гэты сайт</translation> @@ -4051,6 +4072,7 @@ <translation id="6840155290835956714">Запытваць перад адпраўкай</translation> <translation id="6840184929775541289">Не з'яўляецца цэнтрам сертыфікацыі</translation> <translation id="6841186874966388268">Памылкі</translation> +<translation id="6843267103192918276">Каб закладкі, гісторыя, паролі і іншыя налады былі даступнымі на ўсіх вашых прыладах, увайдзіце ў сістэму. Вы таксама аўтаматычна ўвойдзеце ў сэрвісы Google. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="6843423766595476978">"Ok Google" наладжаны</translation> <translation id="6845038076637626672">Адкрыць у разгорнутым выглядзе</translation> <translation id="6845325883481699275">Дапамагаць павысіць бяспеку Chrome</translation> @@ -4467,7 +4489,6 @@ <translation id="7442465037756169001">Абсталяванне для Hangouts Meet гатовае да наладжвання.</translation> <translation id="744341768939279100">Стварыць новы профіль</translation> <translation id="7443806024147773267">Доступ да пароляў на ўсіх прыладах, з якіх вы ўвайшлі ў свой Уліковы запіс Google</translation> -<translation id="7444046173054089907">Гэты сайт заблакіраваны</translation> <translation id="7444983668544353857">Выключыць <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Усталёўваць праграмы аўтаматычна</translation> <translation id="7450761244949417357">Зараз адкрываецца ў браўзеры <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5031,6 +5052,7 @@ <translation id="8214962590150211830">Выдаліць гэтага карыстальніка</translation> <translation id="8215295261562449873">Перад абнаўленнем Linux рабіць рэзервовыя копіі маіх файлаў і праграм у папку "Спампоўкі".</translation> <translation id="8217399928341212914">Працягваць блакіраваць аўтаматычнае спампоўванне некалькіх файлаў</translation> +<translation id="8218847192766059983">Дадайце мовы або змяніце іх парадак у спісе. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Звычайна вы блакіруеце апавяшчэнні. Каб даць дазвол гэтаму сайту на паказ апавяшчэнняў, націсніце тут.</translation> <translation id="8225265270453771718">Абагульце акно праграмы</translation> <translation id="8225753906568652947">Скарыстаць прапановы</translation> @@ -5304,6 +5326,7 @@ <translation id="862542460444371744">&Пашырэнні</translation> <translation id="862727964348362408">Прыпынена</translation> <translation id="862750493060684461">Кэш CSS</translation> +<translation id="8627706565932943526">Памылка сінхранізацыі</translation> <translation id="8627795981664801467">Толькі бяспечныя падключэнні</translation> <translation id="8630903300770275248">Імпартаваць даныя падкантрольнага карыстальніка</translation> <translation id="8631032106121706562">Пялёсткі</translation> @@ -5643,6 +5666,7 @@ <translation id="9065203028668620118">Змяніць</translation> <translation id="9066773882585798925">Слухаць чытанне тэксту ўслых</translation> <translation id="9066782832737749352">Сінтэз маўлення</translation> +<translation id="9067559831321817373">Тут можна кіраваць уліковымі запісамі, у якія вы ўвайшлі: вэб-сайты, праграмы і пашырэнні ў браўзеры Chrome і краме Google Play могуць выкарыстоўваць іх для персаналізацыі сваіх функцый згодна з дазволамі. <a>Даведацца больш</a></translation> <translation id="9068849894565669697">Выбар колеру</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 8cf58f66..787603a 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Страницата не реагира</translation> <translation id="1041263367839475438">Налични устройства</translation> <translation id="1042174272890264476">Компютърът ви също се предлага с библиотеката RLZ на <ph name="SHORT_PRODUCT_NAME" />, която е вградена. Тя задава неуникален и непозволяващ лично идентифициране маркер за измерване на търсенията и използването на <ph name="SHORT_PRODUCT_NAME" />, стимулирани от определена промоционална кампания. Тези етикети понякога се показват в заявките за търсене с Google в <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Да се изчистят ли данните от следните приложения?</translation> <translation id="1045692658517323508">{0,plural, =1{Актуализиране до 1 минута}other{Актуализиране до # минути}}</translation> <translation id="1046635659603195359">Изглежда, че вече сте настроили Voice Match за Google Асистент на друго устройство. Предишните записи могат да се използват за създаване на гласов модел на това устройство. Процесът следва да отнеме по-малко от минута.</translation> <translation id="1047431265488717055">Копиране на тек&ста на връзката</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome с интелекта на Google</translation> <translation id="1147991416141538220">За да поискате достъп, обърнете се към администратора на това устройство.</translation> <translation id="1149401351239820326">Месец на валидност</translation> +<translation id="1150490752229770117">Това е последната автоматична актуализация на софтуера и сигурността за устройството <ph name="DEVICE_TYPE" />. За да получавате бъдещи актуализации, надстройте до по-нов модел. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Слънчеви очила</translation> <translation id="1151917987301063366">Достъпът на <ph name="HOST" /> до сензорите винаги да е разрешен</translation> <translation id="1153356358378277386">Сдвоени устройства</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Изберете пропуск, който да използвате за удостоверяване. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Пренасяне на тази парола на вашия iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> иска да съхранява за постоянно данни на локалния ви компютър</translation> +<translation id="1714644264617423774">Активирайте функциите за достъпност, за да улесните използването на устройството си. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Сензори за движение</translation> +<translation id="171824261579749339">Превъртане в посока, противоположна на движението. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Последния час</translation> <translation id="1719312230114180055">Забележка: Отпечатъкът ви може да е по-малко сигурен в сравнение с надеждна парола или ПИН код.</translation> <translation id="1720318856472900922">Удостоверяване на TLS WWW сървър</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Изчистване на „бисквитките“ на трети страни</translation> <translation id="2097372108957554726">За да регистрирате нови устройства, трябва да влезете в Chrome</translation> <translation id="2099172618127234427">Активирате функциите за отстраняване на грешки в Chrome OS, които ще настроят демон sshd и ще позволят стартирането от USB дискове.</translation> +<translation id="2099625543891475722">физическите ви черти, като ръст;</translation> <translation id="2099686503067610784">Да се изтрие ли сертификатът на сървър „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="2100273922101894616">Автоматичен вход</translation> <translation id="2101225219012730419">Версия:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Създаване на нов потребителски профил</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> иска да потвърди самоличността ви</translation> <translation id="2448312741937722512">Тип</translation> +<translation id="2448734521821581858">„Бисквитките“ са файлове, създавани от уебсайтовете, които посещавате. Има два типа „бисквитки“: Тези на първи страни се създават от сайта, който посещавате. Той се показва в адресната лента. „Бисквитките“ на трети страни се създават от други сайтове. Те притежават част от съдържанието, като например реклами или изображения, което виждате на посетения от вас уебсайт.</translation> <translation id="2450223707519584812">Няма да можете да добавяте потребители, тъй като липсват ключове за приложните програмни интерфейси (API) на Google. За подробности вижте <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Няма активни изгледи</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Времето за изчакване изтече</translation> <translation id="2588636910004461974">Устройства от <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Потърсете с Google или въведете URL адрес</translation> +<translation id="2600522410036850735">Това устройство ще получава автоматични актуализации на софтуера и сигурността до <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Научете повече</a></translation> <translation id="2603115962224169880">Почистване на компютъра</translation> <translation id="2603463522847370204">Отваряне на прозорец в режим „&инкогнито“</translation> <translation id="2604255671529671813">Грешка при свързване с мрежата</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">„Безопасно сърфиране“ (защитава вас и устройството ви от опасни сайтове)</translation> <translation id="3182749001423093222">Проверка на правописа</translation> <translation id="3183139917765991655">Импортиране на потребителски профили</translation> +<translation id="3184536091884214176">Настройване или управление на принтери, използващи CUPS. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Моите файлове</translation> <translation id="3188465121994729530">Пълзяща средна стойност</translation> <translation id="3190558889382726167">Паролата бе запазена</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">Ами сега! Системата не успя да извлече правилата за устройството ви.</translation> <translation id="347785443197175480">Достъпът на <ph name="HOST" /> до камерата и микрофона ви да продължава да е разрешен</translation> <translation id="3478685642445675458">Моля, отключете потребителския си профил, преди да премахнете човек.</translation> -<translation id="3479539252931486093">Това неочаквано ли беше? <ph name="BEGIN_LINK" />Уведомете ни<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не сега</translation> <translation id="3481268647794498892">Ще се отвори чрез <ph name="ALTERNATIVE_BROWSER_NAME" /> след <ph name="COUNTDOWN_SECONDS" /> секунди</translation> <translation id="3484273680291419129">Опасният софтуер се премахва...</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">Потребителските имена и снимките да се показват на екрана за вход</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – свързано е HID устройство</translation> <translation id="4142052906269098341">Отключвайте своя <ph name="DEVICE_TYPE" /> с телефона си. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Запазване на откритите принтери в потребителския ви профил или добавяне на нов принтер. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Гледайте видео с по-добро качество и удължете живота на батерията. Видеото ще се възпроизвежда само на екрана ви, поддържащ Cast.</translation> <translation id="4146026355784316281">Отваряне винаги със системния визуализатор</translation> <translation id="4146785383423576110">Нулиране на настройките и почистване</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">Пъпеш</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation> <translation id="4364830672918311045">Показване на известия</translation> +<translation id="436499142539576997">Получаването на данни от приложението не бе успешно. Все още се опитваме да го стартираме...</translation> <translation id="4370975561335139969">Въведените имейл адрес и парола не съвпадат</translation> <translation id="437184764829821926">Разширени настройки за шрифтовете</translation> <translation id="4374831787438678295">Инсталационна програма за Linux</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">Само протоколите http, https и file се поддържат за пренасочвания на браузъра.</translation> <translation id="4659077111144409915">Основен профил</translation> <translation id="4660476621274971848">Очакваната версия е <ph name="EXPECTED_VERSION" />, но тя бе <ph name="NEW_ID" /></translation> +<translation id="4660838440047236328">плана на стаята ви.</translation> <translation id="4662788913887017617">Споделете тази отметка със своя iPhone</translation> <translation id="4663373278480897665">Достъпът до камерата е разрешен</translation> <translation id="4664482161435122549">Грешка при експортиране на PKCS #12</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">Страницата ви при стартиране бе променена на <ph name="URL" />.</translation> <translation id="4902546322522096650">Мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, сила на сигнала <ph name="SIGNAL_STRENGTH" />%, свързване</translation> <translation id="49027928311173603">Изтегленото от сървъра правило е невалидно: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Настройване или управление на споделени хранилища в мрежата. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Този файл обикновено не се изтегля и може да е опасен.</translation> <translation id="4907306957610201395">Категория за разрешения</translation> <translation id="4908811072292128752">Отворете нов раздел, за да сърфирате в два сайта едновременно</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">Активира се...</translation> <translation id="5039804452771397117">Разрешаване</translation> <translation id="5042282098504489593">Отворете настройките, за да свържете <ph name="USB_DEVICE_NAME" /> с Linux</translation> +<translation id="5043913660911154449">Или посочете PPD файла за принтера си. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Грешна парола</translation> <translation id="504561833207953641">Отваря се в съществуваща сесия на браузъра.</translation> <translation id="5047421709274785093">Забраняване на сайтовете да използват сензори за движение и светлина</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">Тази настройка не може да бъде променена от дете.</translation> <translation id="5466374726908360271">Пост&авяне и търсене на „<ph name="SEARCH_TERMS" />“</translation> <translation id="5468173180030470402">Търсят се споделени хранилища</translation> +<translation id="5470735824776589490">Изисква се да рестартирате устройството си, преди да може да бъде възстановено с Powerwash. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Здравейте! Аз съм гласът за синтезиран говор.</translation> <translation id="5472133193607270166">Когато тази функция е включена, сайтовете не могат да използват активността ви при сърфиране на различните сайтове, за да персонализират рекламите. Някои сайтове може да не работят правилно.</translation> <translation id="5473333559083690127">Въведете пак новия ПИН</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">Организиране</translation> <translation id="5499313591153584299">Този файл може да навреди на компютъра ви.</translation> <translation id="5502500733115278303">Импортирани от Firefox</translation> +<translation id="5505264765875738116">Сайтовете не могат да извеждат подкани за изпращане на известия</translation> <translation id="5505307013568720083">Няма мастило</translation> <translation id="5507756662695126555">Невъзможност за отричане</translation> <translation id="5509693895992845810">Запазване &като...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Предпочитания</translation> <translation id="5804175651771201311">Роумингът е изключен</translation> <translation id="5804241973901381774">Разрешения</translation> +<translation id="5804427196348435412">Използване на устройства с NFC</translation> <translation id="5805697420284793859">Мениджър на прозорците</translation> <translation id="5806773519584576205">0° (по подразбиране)</translation> <translation id="5811750797187914944">Готово</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Отваряне с увеличен изглед</translation> <translation id="6096326118418049043">Име на X.500</translation> <translation id="6097480669505687979">Ако не освободите място, може да последва автоматично премахване на потребители и данни.</translation> +<translation id="6097600385983390082">Гласовото търсене бе затворено</translation> <translation id="6098793583803863900">Неизвестен файл се сканира за опасно съдържание.</translation> <translation id="6100736666660498114">Меню „Старт“</translation> <translation id="6101226222197207147">Бе добавено ново приложение (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Стандартно използване на глас вместо клавиатура</translation> <translation id="6234474535228214774">Предстои инсталиране</translation> <translation id="6237816943013845465">Позволява ви да коригирате разделителната способност на екрана</translation> +<translation id="6238624845858322552">Свързване с Bluetooth устройство</translation> <translation id="6238767809035845642">Текст, споделен от друго устройство</translation> <translation id="6238923052227198598">Запазване на най-новата бележка на заключения екран</translation> <translation id="6239558157302047471">Презареждане на рамката</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424">Мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, сила на сигнала <ph name="SIGNAL_STRENGTH" />%, батерия на телефона <ph name="BATTERY_STATUS" />%, свързване</translation> <translation id="6268252012308737255">Отваряне чрез <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайтовете могат да извеждат подкани за изпращане на известия</translation> <translation id="6270770586500173387">Изпращане на <ph name="BEGIN_LINK1" />информация за системата и приложенията<ph name="END_LINK1" />, както и за <ph name="BEGIN_LINK2" />показателите<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">При изтеглянето на приставката възникна грешка (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Качество</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Профил</translation> <translation id="6298962879096096191">Използване на Google Play за инсталиране на приложения за Android</translation> <translation id="630065524203833229">Из&ход</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> не се конфигурира автоматично. Моля, посочете разширени подробности за принтера. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Глобално правило:</translation> <translation id="6307990684951724544">Системата е заета</translation> <translation id="6308493641021088955">Влизането се осигурява от <ph name="EXTENSION_NAME" /></translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Почистването понастоящем не е налице.</translation> <translation id="6556866813142980365">Възстановяване</translation> <translation id="6557290421156335491">Моите преки пътища</translation> +<translation id="6561560012278703671">Използване на по-малко натрапчиви съобщения (подканите за известия се блокират, така че да не ви прекъсват)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Пътят или името на файла са твърде дълги. Моля, запазете файла с по-кратко име или на друго място.</translation> <translation id="6563469144985748109">Мениджърът ви все още не е одобрил заявката</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Извеждане на запитване преди изпращане</translation> <translation id="6840184929775541289">Не е сертифициращ орган</translation> <translation id="6841186874966388268">Грешки</translation> +<translation id="6843267103192918276">Влезте в профила си и получете своите отметки, история, пароли и др. настройки на всички устройства. Също така ще влезете автоматично в използваните от вас услуги на Google. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Настроихте Ok Google</translation> <translation id="6845038076637626672">Отваряне с увеличен изглед</translation> <translation id="6845325883481699275">Помощ за подобряването на сигурността на Chrome</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Хардуерът Hangouts Meet е готов за настройване.</translation> <translation id="744341768939279100">Създаване на нов потребителски профил</translation> <translation id="7443806024147773267">Осъществявайте достъп до паролите си винаги когато сте влезли в профила си в Google</translation> -<translation id="7444046173054089907">Този сайт е блокиран</translation> <translation id="7444983668544353857">Деактивиране на <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Автоматично инсталиране на приложения</translation> <translation id="7450761244949417357">Отваря се чрез <ph name="ALTERNATIVE_BROWSER_NAME" /> сега</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Премахване на този човек</translation> <translation id="8215295261562449873">Създаване на резервно копие на приложенията и файловете ми в папката „Изтегляния“, преди да се надстрои Linux.</translation> <translation id="8217399928341212914">Автоматичното изтегляне на няколко файла да остане блокирано</translation> +<translation id="8218847192766059983">Добавяне на езици или пренареждане на списъка. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Обикновено блокирате известията. Кликнете тук, за да разрешите на този сайт да ви изпраща известия.</translation> <translation id="8225265270453771718">Споделяне на прозорец на приложение</translation> <translation id="8225753906568652947">Осребряване на офертите</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Редактиране</translation> <translation id="9066773882585798925">Прослушване на текст, прочетен на глас</translation> <translation id="9066782832737749352">Синтезиран говор</translation> +<translation id="9067559831321817373">Управлявайте профилите, в които сте влезли. В зависимост от разрешенията уебсайтовете, приложенията и разширенията в Chrome и Google Play може да използват тези профили, за да персонализират практическата ви работа. <a>Научете повече</a></translation> <translation id="9068849894565669697">Избор на цвят</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 8718481..c6b0ecc 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1749,7 +1749,6 @@ <translation id="347670947055184738">ওহো! সিস্টেম আপনার ডিভাইসের জন্য নীতি আনতে পারেনি।</translation> <translation id="347785443197175480">আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে <ph name="HOST" /> এর মঞ্জুরি অবিরত রাখুন</translation> <translation id="3478685642445675458">কোনো ব্যক্তিকে মুছে ফেলার আগে দয়া করে আপনার প্রোফাইলটি আনলক করুন।</translation> -<translation id="3479539252931486093">এটি কি অপ্রত্যাশিত ছিল? <ph name="BEGIN_LINK" />আমাদেরকে জানান<ph name="END_LINK" /></translation> <translation id="3479552764303398839">এখনই নয়</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> সেকেন্ডের মধ্যে <ph name="ALTERNATIVE_BROWSER_NAME" /> চালু হতে চলেছে</translation> <translation id="3484273680291419129">ক্ষতিকর সফ্টওয়্যার সরানো হচ্ছে...</translation> @@ -4468,7 +4467,6 @@ <translation id="7442465037756169001">আপনার Hangouts Meet Hardware সেট-আপ করার জন্য প্রস্তুত।</translation> <translation id="744341768939279100">একটি নতুন প্রোফাইল তৈরি করুন</translation> <translation id="7443806024147773267">Google অ্যাকাউন্টে যেকোনও সময়ে সাইন-ইন করে আপনার পাসওয়ার্ড অ্যাক্সেস করুন</translation> -<translation id="7444046173054089907">সাইটটি অবরুদ্ধ</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> বন্ধ করুন</translation> <translation id="7448430327655618736">অ্যাপ অটোমেটিক ইনস্টল করে</translation> <translation id="7450761244949417357">এখন <ph name="ALTERNATIVE_BROWSER_NAME" /> চালু হচ্ছে</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index a6ef38e..83349a15 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -36,7 +36,7 @@ <translation id="1041175011127912238">Ova stranica ne reagira</translation> <translation id="1041263367839475438">Dostupni uređaji</translation> <translation id="1042174272890264476">Vaš računar također ima ugrađenu RLZ biblioteku proizvoda <ph name="SHORT_PRODUCT_NAME" />. RLZ dodjeljuje nejedinstvenu oznaku koja ne može poslužiti za ličnu identifikaciju za mjerenje pretraživanja i korištenje proizvoda <ph name="SHORT_PRODUCT_NAME" /> do kojeg je došlo putem određene promotivne kampanje. Te oznake se nekada pojavljuju u upitima Google Pretraživanja u proizvodu <ph name="PRODUCT_NAME" />.</translation> -<translation id="1043818413152647937">Želite li izbrisati podatke i iz ovih aplikacija?</translation> +<translation id="1043818413152647937">Obrisati i podatke iz ovih aplikacija?</translation> <translation id="1045692658517323508">{0,plural, =1{Ažurirajte u roku od 1 minute}one{Ažurirajte u roku od # minute}few{Ažurirajte u roku od # minute}other{Ažurirajte u roku od # minuta}}</translation> <translation id="1046635659603195359">Izgleda da ste već postavili Voice Match s Google Asistentom na drugom uređaju. Ti prethodni snimci se mogu iskoristiti za izradu modela glasa na ovom uređaju. To ne bi trebalo trajati duže od jedne minute.</translation> <translation id="1047431265488717055">Kopiraj tekst linka</translation> @@ -110,7 +110,7 @@ <translation id="114721135501989771">Preuzmite pametne Google funkcije za Chrome</translation> <translation id="1147991416141538220">Da zatražite pristup, kontaktirajte administratora ovog uređaja.</translation> <translation id="1149401351239820326">Mjesec isteka</translation> -<translation id="1150490752229770117">To je posljednje automatsko ažuriranje softvera i sigurnosno ažuriranje za ovaj <ph name="DEVICE_TYPE" />. Za buduća ažuriranja potrebna je nadogradnja na noviji model. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="1150490752229770117">To je posljednje automatsko ažuriranje softvera i sigurnosno ažuriranje za uređaj <ph name="DEVICE_TYPE" />. Nadogradite na noviji model za buduća ažuriranja. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Sunčane naočale</translation> <translation id="1151917987301063366">Uvijek dozvoli da host računar <ph name="HOST" /> pristupa senzorima</translation> <translation id="1153356358378277386">Upareni uređaji</translation> @@ -513,9 +513,9 @@ <translation id="1709217939274742847">Odaberite tiket za autentifikaciju. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Preuzmite ovu lozinku na svom iPhoneu</translation> <translation id="1712552549805331520">URL <ph name="URL" /> želi trajno pohraniti podatke na vaš lokalni računar</translation> -<translation id="1714644264617423774">Omogućite značajke pristupačnosti radi jednostavnije upotrebe uređaja. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="1714644264617423774">Omogućite funkcije pristupačnosti radi jednostavnijeg korištenja uređaja. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Senzori pokreta</translation> -<translation id="171824261579749339">Prirodno <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="171824261579749339">Australijski <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Posljednji sat</translation> <translation id="1719312230114180055">Napomena: Otisak prsta može biti manje siguran od jake lozinke ili PIN-a.</translation> <translation id="1720318856472900922">TLS WWW autentifikacija servera</translation> @@ -777,7 +777,7 @@ <translation id="2096715839409389970">Izbriši kolačiće trećih strana</translation> <translation id="2097372108957554726">Morate se prijaviti na Chrome da registrirate nove uređaje</translation> <translation id="2099172618127234427">Omogućujete funkcije za otklanjanje grešaka na Chrome OS-u kojim će se postaviti sshd daemon i omogućiti pokretanje sistema s USB uređaja.</translation> -<translation id="2099625543891475722">vaše fizičke značajke, primjerice visinu</translation> +<translation id="2099625543891475722">vaše fizičke osobine, kao što je visina</translation> <translation id="2099686503067610784">Izbrisati potvrdu servera "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Automatsko prijavljivanje</translation> <translation id="2101225219012730419">Verzija:</translation> @@ -1032,7 +1032,7 @@ <translation id="2445484935443597917">Izradi novi profil</translation> <translation id="2446585455334014596">Aplikacija <ph name="APP_NAME" /> želi potvrditi vaš identitet</translation> <translation id="2448312741937722512">Vrsta</translation> -<translation id="2448734521821581858">Kolačići su datoteke web-lokacija koje ste posjetili. Postoje dvije vrste kolačića: kolačiće prve strane izrađuje web-lokacija koju posjetite. Ta je web-lokacija navedena u adresnoj traci. Kolačiće trećih strana izrađuju ostale web-lokacije. Te web-lokacije posjeduju dio sadržaja prikazanog na web-lokaciji koju ste posjetili, primjerice oglase ili slike.</translation> +<translation id="2448734521821581858">Kolačići su fajlovi koje kreiraju web lokacije koje posjetite. Postoje dvije vrste kolačića: Izvorne kolačiće kreira web lokacija koju posjećujete. Web lokacija je prikazana na traci za adresu. Kolačiće treće strane kreiraju druge web lokacije. Te web lokacije posjeduju dio sadržaja, kao što su oglasi ili slike, koji se prikazuju na web lokaciji koju posjećujete.</translation> <translation id="2450223707519584812">Nećete moći dodati korisnike jer nedostaju ključevi Google API-ja. Za više detalja pogledajte <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Nema aktivnih pregleda</translation> <translation id="2451298179137331965">2x</translation> @@ -1146,7 +1146,7 @@ <translation id="2587922766792651800">Vrijeme je isteklo</translation> <translation id="2588636910004461974">Uređaji dobavljača <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Pretražite Google ili upišite URL</translation> -<translation id="2600522410036850735">Uređaj će primati automatska ažuriranja softvera i sigurnosna ažuriranja do <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Saznajte više</a></translation> +<translation id="2600522410036850735">Ovaj uređaj će primati automatska ažuriranja softvera i sigurnosna ažuriranja do <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Saznajte više</a></translation> <translation id="2603115962224169880">Očisti računar</translation> <translation id="2603463522847370204">Otvaranje u &anonimnom prozoru</translation> <translation id="2604255671529671813">Greška mrežne veze</translation> @@ -1567,7 +1567,7 @@ <translation id="3181954750937456830">Sigurno pregledavanje (štiti vas i vaš uređaj od opasnih web-lokacija)</translation> <translation id="3182749001423093222">Provjera pravopisa</translation> <translation id="3183139917765991655">Proces za uvoz profila</translation> -<translation id="3184536091884214176">Postavljanje CUPS pisača ili upravljanje njima. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="3184536091884214176">Postavite CUPS štampače ili upravljajte njima. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Moji fajlovi</translation> <translation id="3188465121994729530">Prosjek premještanja</translation> <translation id="3190558889382726167">Lozinka je sačuvana</translation> @@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ups! Sistem nije uspio preuzeti pravila za vaš uređaj.</translation> <translation id="347785443197175480">I dalje dozvoljavaj host računaru <ph name="HOST" /> da pristupa kameri i mikrofonu</translation> <translation id="3478685642445675458">Prije uklanjanja osobe otključajte svoj profil.</translation> -<translation id="3479539252931486093">Je li ovo bilo neočekivano? <ph name="BEGIN_LINK" />Javite nam<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ne sada</translation> <translation id="3481268647794498892">Otvaranje u pregledniku <ph name="ALTERNATIVE_BROWSER_NAME" /> za <ph name="COUNTDOWN_SECONDS" /> s</translation> <translation id="3484273680291419129">Uklanjanje štetnog softvera...</translation> @@ -2265,7 +2264,7 @@ <translation id="4138267921960073861">Prikazuje korisnička imena i fotografije na ekranu za prijavu</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – povezan je HID uređaj</translation> <translation id="4142052906269098341">Otključajte uređaj <ph name="DEVICE_TYPE" /> pomoću telefona. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> -<translation id="4142518881503042940">Spremite otkrivene pisače na svoj profil ili dodajte novi pisač. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Sačuvajte otkrivene štampače na svoj profil ili dodajte novi štampač. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Preuzmite videozapise bolje kvalitete i sačuvajte vijek trajanja baterije. Videozapis će se reproducirati samo na ekranu na kojem je omogućeno emitiranje.</translation> <translation id="4146026355784316281">Uvijek otvori u prikazivaču sistema</translation> <translation id="4146785383423576110">Vrati aplikaciju na zadano i počisti</translation> @@ -2390,7 +2389,7 @@ <translation id="4364327530094270451">Dinja</translation> <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> dijeli prozor.</translation> <translation id="4364830672918311045">Prikaži obavještenja</translation> -<translation id="436499142539576997">Dohvaćanje podataka aplikacije nije uspjelo. I dalje pokušavamo pokrenuti aplikaciju...</translation> +<translation id="436499142539576997">Preuzimanje podataka aplikacije nije uspjelo. I dalje pokušavamo pokrenuti aplikaciju…</translation> <translation id="4370975561335139969">Unijeli ste e-adresu i zaporku koje se ne podudaraju</translation> <translation id="437184764829821926">Napredne postavke fonta</translation> <translation id="4374831787438678295">Paket za instalaciju Linuxa</translation> @@ -2581,7 +2580,7 @@ <translation id="465878909996028221">Za preusmjeravanja preglednika su podržani samo protokoli http, https i protokoli za fajlove.</translation> <translation id="4659077111144409915">Primarni račun</translation> <translation id="4660476621274971848">Očekivana je verzija "<ph name="EXPECTED_VERSION" />", ali je bila verzija "<ph name="NEW_ID" />"</translation> -<translation id="4660838440047236328">izgled vaše sobe</translation> +<translation id="4660838440047236328">raspored stvari u vašoj sobi</translation> <translation id="4662788913887017617">Dijelite ovu oznaku putem svog iPhone uređaja</translation> <translation id="4663373278480897665">Kamera je dozvoljena</translation> <translation id="4664482161435122549">Greška o izvozu PKCS #12</translation> @@ -2745,7 +2744,7 @@ <translation id="4900392736118574277">Vaša je polazna stranica promijenjena u <ph name="URL" />.</translation> <translation id="4902546322522096650">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, poveži</translation> <translation id="49027928311173603">Pravilo preuzeto sa servera je nevažeće: <ph name="VALIDATION_ERROR" />.</translation> -<translation id="4906490889887219338">Postavite mrežna dijeljenja datoteka ili upravljajte njima. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="4906490889887219338">Postavite dijeljenje fajlova na mreži ili upravljajte njime. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Ovaj fajl se ne preuzima često i može biti opasan.</translation> <translation id="4907306957610201395">Kategorija odobrenja</translation> <translation id="4908811072292128752">Otvorite novu karticu da istovremeno pregledate dvije web lokacije</translation> @@ -2833,7 +2832,7 @@ <translation id="5038863510258510803">Omogućavanje…</translation> <translation id="5039804452771397117">Dozvoli</translation> <translation id="5042282098504489593">Otvorite Postavke da biste povezali uređaj <ph name="USB_DEVICE_NAME" /> s Linuxom</translation> -<translation id="5043913660911154449">Možete i navesti PPD pisača. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="5043913660911154449">Ili navedite PPD štampača <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Pogrešna lozinka</translation> <translation id="504561833207953641">Otvaranje u postojećoj sesiji preglednika.</translation> <translation id="5047421709274785093">Web-lokacijama nije dopuštena upotreba senzora pokreta i osvjetljenja</translation> @@ -3119,7 +3118,7 @@ <translation id="5464660706533281090">Dijete ne može promijeniti ovu postavku.</translation> <translation id="5466374726908360271">Za&lijepi i pretraži pojam “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Traženje dijeljenja fajlova</translation> -<translation id="5470735824776589490">Da biste mogli izvršiti Powerwash, trebate ponovo pokrenuti uređaj. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="5470735824776589490">Prije vraćanja na zadane vrijednosti pomoću Powerwasha potrebno je ponovo pokrenuti uređaj. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Zdravo! Ja sam vaš glas za pretvaranje teksta u govor.</translation> <translation id="5472133193607270166">Kada je funkcija uključena, web lokacije neće moći koristiti vašu aktivnost pregledanja na različitim web lokacijama radi prilagođavanja oglasa. Moguće je da neke web lokacije neće pravilno funkcionirati.</translation> <translation id="5473333559083690127">Ponovo unesite novi PIN</translation> @@ -3143,7 +3142,7 @@ <translation id="5496587651328244253">Organizacija</translation> <translation id="5499313591153584299">Ovaj fajl može naštetiti vašem računaru.</translation> <translation id="5502500733115278303">Uvezeno iz Firefoxa</translation> -<translation id="5505264765875738116">Web-lokacije ne mogu postavljati pitanja o slanju obavijesti</translation> +<translation id="5505264765875738116">Web lokacije ne mogu tražiti da šalju obavještenja</translation> <translation id="5505307013568720083">Nema tinte</translation> <translation id="5507756662695126555">Garantirano priznavanje</translation> <translation id="5509693895992845810">Spremi &kao...</translation> @@ -3358,7 +3357,7 @@ <translation id="5801568494490449797">Postavke</translation> <translation id="5804175651771201311">Roming je isključen</translation> <translation id="5804241973901381774">Odobrenja</translation> -<translation id="5804427196348435412">koristiti NFC uređaje</translation> +<translation id="5804427196348435412">Koristiti NFC uređaje</translation> <translation id="5805697420284793859">Upravitelj prozora</translation> <translation id="5806773519584576205">0° (zadano)</translation> <translation id="5811750797187914944">Sve je spremno</translation> @@ -3574,7 +3573,7 @@ <translation id="6096047740730590436">Otvori u najvećem prozoru</translation> <translation id="6096326118418049043">X.500 naziv</translation> <translation id="6097480669505687979">Ako ne oslobodite prostor, može doći do automatskog uklanjanja korisnika i podataka.</translation> -<translation id="6097600385983390082">Glasovno pretraživanje zatvoreno</translation> +<translation id="6097600385983390082">Glasovno pretraživanje je zatvoreno</translation> <translation id="6098793583803863900">Skeniranje nepoznatog fajla radi pronalaženja opasnog sadržaja.</translation> <translation id="6100736666660498114">Početni meni</translation> <translation id="6101226222197207147">Dodana je nova aplikacija (<ph name="EXTENSION_NAME" />)</translation> @@ -3670,7 +3669,7 @@ <translation id="6233154960150021497">Kao zadanu postavku koristi glas umjesto tastature</translation> <translation id="6234474535228214774">Instalacija je na čekanju</translation> <translation id="6237816943013845465">Omogućuje prilagodbu razlučivosti zaslona</translation> -<translation id="6238624845858322552">Povežite se s Bluetooth uređajem</translation> +<translation id="6238624845858322552">Povezivanje s Bluetooth uređajem</translation> <translation id="6238767809035845642">Tekst dijeljen s drugog uređaja</translation> <translation id="6238923052227198598">Zadrži posljednju napomenu na zaključanom ekranu</translation> <translation id="6239558157302047471">Ponovo učitaj okvir</translation> @@ -3697,7 +3696,7 @@ <translation id="6267547857941397424">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, baterija telefona <ph name="BATTERY_STATUS" />%, poveži</translation> <translation id="6268252012308737255">Otvori koristeći aplikaciju <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> -<translation id="6270391203985052864">Web-lokacije mogu postavljati pitanja o slanju obavijesti</translation> +<translation id="6270391203985052864">Web lokacije mogu tražiti da šalju obavještenja</translation> <translation id="6270770586500173387">Pošalji <ph name="BEGIN_LINK1" />sistemske informacije i informacije o aplikacijama<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />metriku<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Došlo je do greške (<ph name="ERROR" />) pri preuzimanju dodatka</translation> <translation id="6273677812470008672">Kvalitet</translation> @@ -3719,7 +3718,7 @@ <translation id="629730747756840877">Račun</translation> <translation id="6298962879096096191">Korištenje Google Playa za instaliranje Android aplikacija</translation> <translation id="630065524203833229">I&zađi</translation> -<translation id="6300718114348072351">Automatsko konfiguriranje pisača <ph name="PRINTER_NAME" /> nije uspjelo. Navedite napredne pojedinosti pisača. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="6300718114348072351">Automatsko konfiguriranje štampača <ph name="PRINTER_NAME" /> nije uspjelo. Navedite napredne detalje za štampač. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globalno pravilo:</translation> <translation id="6307990684951724544">Sistem je zauzet</translation> <translation id="6308493641021088955">Prijavu omogućava <ph name="EXTENSION_NAME" /></translation> @@ -3889,7 +3888,7 @@ <translation id="6555810572223193255">Čišćenje je trenutno nedostupno</translation> <translation id="6556866813142980365">Ponovi</translation> <translation id="6557290421156335491">Moje prečice</translation> -<translation id="6561560012278703671">Koristi tiše poruke (onemogućuje upitima za obavijesti da vas ometaju)</translation> +<translation id="6561560012278703671">Koristi tiše poruke (blokira upite s obavještenjima da vas ne prekidaju)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Putanja ili naziv fajla su predugi. Sačuvajte fajl s kraćim nazivom ili na drugoj lokaciji.</translation> <translation id="6563469144985748109">Voditelj je još nije odobrio</translation> @@ -4073,7 +4072,7 @@ <translation id="6840155290835956714">Pitaj prije slanja</translation> <translation id="6840184929775541289">Nije tijelo za izdavanje potvrde</translation> <translation id="6841186874966388268">Greške</translation> -<translation id="6843267103192918276">Prijavite se kako bi vam oznake, povijest i druge postavke bile dostupne na svim vašim uređajima. Automatski ćete se prijaviti i na Googleove usluge. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="6843267103192918276">Prijavite se da dobijete oznake, historiju, lozinke i ostale postavke na svim svojim uređajima. Također ćete biti automatski prijavljeni na svoje Google usluge. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google spreman je za upotrebu</translation> <translation id="6845038076637626672">Maksimalno otvaranje</translation> <translation id="6845325883481699275">Pomognite poboljšati sigurnost na Chromeu</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hardver za Hangouts Meet je spreman za postavljanje.</translation> <translation id="744341768939279100">Izradi novi profil</translation> <translation id="7443806024147773267">Pristupite svojim lozinkama kad god ste prijavljeni na Google račun.</translation> -<translation id="7444046173054089907">Ova web lokacija je blokirana</translation> <translation id="7444983668544353857">Onemogući <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalirajte aplikacije automatski</translation> <translation id="7450761244949417357">Otvaranje u pregledniku <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5055,7 +5053,7 @@ <translation id="8214962590150211830">Ukloni ovu osobu</translation> <translation id="8215295261562449873">Kreiraj sigurnosnu kopiju aplikacija i fajlova u folderu Preuzimanja prije nadogradnje Linuxa.</translation> <translation id="8217399928341212914">Nastavi blokiranje automatskih preuzimanja više fajlova</translation> -<translation id="8218847192766059983">Dodajte jezike ili promijenite redoslijed popisa. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> +<translation id="8218847192766059983">Dodajte jezike ili preuredite listu. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Obično blokirate obavještenja. Da dozvolite ovoj web lokaciji da vas obavještava, kliknite ovdje.</translation> <translation id="8225265270453771718">Dijelite prozor aplikacije</translation> <translation id="8225753906568652947">Iskoristite ponude</translation> @@ -5669,7 +5667,7 @@ <translation id="9065203028668620118">Uredi</translation> <translation id="9066773882585798925">Poslušajte naglas pročitan tekst</translation> <translation id="9066782832737749352">Pretvaranje teksta u govor</translation> -<translation id="9067559831321817373">Upravljajte računima na koje ste prijavljeni. Web-lokacije, aplikacije i proširenja u Chromeu i Google Playu mogu upotrebljavati te račune da bi vam prilagodile doživljaj, ovisno o dopuštenjima. <a>Saznajte više</a></translation> +<translation id="9067559831321817373">Upravljajte računima na kojima ste prijavljeni. U zavisnosti od odobrenja, web lokacije, aplikacije i ekstenzije na Chromeu i Google Playu mogu koristiti ove račune da prilagode vaše iskustvo. <a>Saznajte više</a></translation> <translation id="9068849894565669697">Odaberite boju</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 1ac8a641..7573421 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Aquesta pàgina no respon</translation> <translation id="1041263367839475438">Dispositius disponibles</translation> <translation id="1042174272890264476">L'ordinador també incorpora la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" />. La biblioteca RLZ assigna una etiqueta no única i sense identificació personal per mesurar les cerques i l'ús de <ph name="SHORT_PRODUCT_NAME" /> derivats d'una campanya promocional concreta. De vegades, aquestes etiquetes apareixen a les consultes de la Cerca de Google a <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">També vols esborrar les dades d'aquestes aplicacions?</translation> <translation id="1045692658517323508">{0,plural, =1{Actualitza el dispositiu en 1 minut}other{Actualitza el dispositiu en # minuts}}</translation> <translation id="1046635659603195359">Sembla que ja has configurat Voice Match amb l'Assistent de Google en un altre dispositiu. Aquestes gravacions anteriors es poden utilitzar per crear un model de veu en aquest dispositiu. Aquest procés hauria de tardar menys d'un minut.</translation> <translation id="1047431265488717055">Copia el te&xt de l'enllaç</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Eines intel·ligents a Chrome</translation> <translation id="1147991416141538220">Per demanar accés, contacta amb l'administrador d'aquest dispositiu.</translation> <translation id="1149401351239820326">Mes de caducitat</translation> +<translation id="1150490752229770117">Aquesta actualització de programari i seguretat és l'última que rebràs per a aquest <ph name="DEVICE_TYPE" />. Per obtenir actualitzacions en el futur, canvia el dispositiu per un model més nou. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Ulleres de sol</translation> <translation id="1151917987301063366">Permet sempre que <ph name="HOST" /> accedeixi als sensors</translation> <translation id="1153356358378277386">Dispositius vinculats</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Tria un tiquet per autenticar-te. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Obtén aquesta contrasenya al dispositiu iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> vol emmagatzemar dades a l'ordinador local de manera permanent</translation> +<translation id="1714644264617423774">Activa les funcions d'accessibilitat per facilitar l'ús del dispositiu. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensors de moviment</translation> +<translation id="171824261579749339">Australià <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Darrera hora</translation> <translation id="1719312230114180055">Nota: és possible que fer servir una empremta digital sigui menys segur que utilitzar una contrasenya segura o un PIN.</translation> <translation id="1720318856472900922">Autenticació de servidor WWW de TLS</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Esborra les galetes de tercers</translation> <translation id="2097372108957554726">Inicieu la sessió a Chrome per registrar dispositius nous</translation> <translation id="2099172618127234427">Esteu activant les funcions de depuració de Chrome OS, de manera que es configurarà el dimoni sshd i es permetrà iniciar el sistema des d'unitats USB.</translation> +<translation id="2099625543891475722">els teus trets físics, com ara l'alçada</translation> <translation id="2099686503067610784">Voleu suprimir el certificat de servidor "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Inici de sessió automàtic</translation> <translation id="2101225219012730419">Versió:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">Crea un perfil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> vol verificar la teva identitat</translation> <translation id="2448312741937722512">Tipus</translation> +<translation id="2448734521821581858">Les galetes són fitxers que creen els llocs web que visites. N'hi ha de dos tipus: les galetes pròpies són les que crea el lloc web que visites. El lloc web es mostra a la barra d'adreces. Les galetes de tercers són les que creen altres llocs web. Aquests llocs web són els propietaris de part del contingut que es mostra al lloc web que visites, com ara els anuncis o les imatges.</translation> <translation id="2450223707519584812">No podreu afegir usuaris perquè falten les claus de l'API de Google. Consulteu <ph name="DETAILS_URL" /> per obtenir-ne més informació.</translation> <translation id="2450849356604136918">No hi ha cap visualització activa</translation> <translation id="2451298179137331965">2x</translation> @@ -1039,7 +1045,7 @@ <translation id="2462724976360937186">Identificador de clau d'entitat emissora de certificats</translation> <translation id="2462752602710430187">S'ha afegit <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Servidor intermediari HTTP</translation> -<translation id="2467267713099745100">Xarxa <ph name="NETWORK_TYPE" />, desactivada</translation> +<translation id="2467267713099745100">Xarxa <ph name="NETWORK_TYPE" /> (desactivada)</translation> <translation id="2468205691404969808">Utilitza galetes per recordar les teves preferències, fins i tot si no visites aquestes pàgines</translation> <translation id="2468402215065996499">Tamagotxi</translation> <translation id="2469259292033957819">No tens cap impressora desada.</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">S'ha esgotat el temps d'espera</translation> <translation id="2588636910004461974">Dispositius del proveïdor <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Fes una cerca a Google o escriu l'URL</translation> +<translation id="2600522410036850735">Aquest dispositiu rebrà actualitzacions automàtiques de programari i seguretat fins a la data: <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Més informació</a></translation> <translation id="2603115962224169880">Neteja l'ordinador</translation> <translation id="2603463522847370204">Obre-ho en una &finestra d'incògnit</translation> <translation id="2604255671529671813">Error de connexió a la xarxa</translation> @@ -1342,7 +1349,7 @@ <translation id="2861941300086904918">Administrador de seguretat de Native Client</translation> <translation id="2864601841139725659">Estableix la teva foto de perfil</translation> <translation id="2865919525181940183">Captura de pantalla de programes que hi ha en pantalla en aquests moments</translation> -<translation id="286674810810214575">S'estan comprovant les fonts de corrent...</translation> +<translation id="286674810810214575">S'estan comprovant les fonts d'alimentació...</translation> <translation id="2867768963760577682">Obre com a pestanya fixada</translation> <translation id="2868746137289129307">Aquesta extensió no està actualitzada i està desactivada per a la política d'empresa. És possible que s'activi de manera automàtica quan estigui disponible una versió nova.</translation> <translation id="2870560284913253234">Lloc web</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">Navegació segura (et protegeix a tu i al teu dispositiu de llocs web perillosos)</translation> <translation id="3182749001423093222">Corrector ortogràfic</translation> <translation id="3183139917765991655">Importador de perfils</translation> +<translation id="3184536091884214176">Configura o gestiona les impressores CUPS. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Els meus fitxers</translation> <translation id="3188465121994729530">Mitjana variable</translation> <translation id="3190558889382726167">S'ha desat la contrasenya</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">El sistema no ha pogut obtenir la política per al dispositiu.</translation> <translation id="347785443197175480">Continua permetent que <ph name="HOST" /> accedeixi a la càmera i al micròfon</translation> <translation id="3478685642445675458">Desbloquegeu el vostre perfil per poder suprimir una persona.</translation> -<translation id="3479539252931486093">Heu trobat el lloc bloquejat de manera inesperada? <ph name="BEGIN_LINK" />Informeu-nos-en<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ara no</translation> <translation id="3481268647794498892">S'obrirà a <ph name="ALTERNATIVE_BROWSER_NAME" /> d'aquí a <ph name="COUNTDOWN_SECONDS" /> segons</translation> <translation id="3484273680291419129">S'està suprimint el programari nociu...</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">Mostra els noms d'usuari i les fotos a la pantalla d'inici de sessió</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: dispositiu HID connectat</translation> <translation id="4142052906269098341">Desbloqueja el dispositiu <ph name="DEVICE_TYPE" /> amb el telèfon. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Desa al teu perfil impressores detectades o afegeix-ne una de nova. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Obtén una millor qualitat de vídeo i estalvia bateria. El vídeo només es reproduirà a la pantalla compatible amb Cast.</translation> <translation id="4146026355784316281">Obrir sempre amb el visualitzador del sistema</translation> <translation id="4146785383423576110">Restableix i neteja</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">Meló</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> està compartint una finestra.</translation> <translation id="4364830672918311045">Mostra les notificacions</translation> +<translation id="436499142539576997">No s'han pogut obtenir les dades de l'aplicació. S'està provant d'executar-la igualment...</translation> <translation id="4370975561335139969">El correu electrònic i la contrasenya indicats no coincideixen</translation> <translation id="437184764829821926">Configuració avançada de tipus de lletra</translation> <translation id="4374831787438678295">Instal·lador de Linux</translation> @@ -2499,7 +2508,7 @@ <translation id="4549791035683739768">La clau de seguretat no té empremtes digitals emmagatzemades</translation> <translation id="4551763574344810652">Prem <ph name="MODIFIER_KEY_DESCRIPTION" /> per desfer l'acció</translation> <translation id="4552089082226364758">Flash</translation> -<translation id="4552759165874948005">Xarxa <ph name="NETWORK_TYPE" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal</translation> +<translation id="4552759165874948005">Xarxa <ph name="NETWORK_TYPE" /> (intensitat del senyal: <ph name="SIGNAL_STRENGTH" />%)</translation> <translation id="4554591392113183336">L'extensió externa té la mateixa versió, o una d'anterior, en comparació amb l'existent.</translation> <translation id="4555769855065597957">Ombra</translation> <translation id="4555863373929230635">Per desar les contrasenyes al teu Compte de Google, inicia-hi la sessió i activa la sincronització.</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">Les redireccions del navegador només admeten els protocols http, https i de fitxers.</translation> <translation id="4659077111144409915">Compte principal</translation> <translation id="4660476621274971848">La versió esperada era <ph name="EXPECTED_VERSION" />, però la que hi havia era <ph name="NEW_ID" /></translation> +<translation id="4660838440047236328">la distribució de la teva habitació</translation> <translation id="4662788913887017617">Comparteix aquesta adreça d'interès amb el teu iPhone</translation> <translation id="4663373278480897665">La càmera es pot utilitzar</translation> <translation id="4664482161435122549">Error d'exportació PKCS #12</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">La pàgina d'inici ha canviat a <ph name="URL" />.</translation> <translation id="4902546322522096650">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal, connecta</translation> <translation id="49027928311173603">La política que s'ha baixat del servidor no és vàlida: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Configura o gestiona els fitxers compartits de la xarxa. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Aquest fitxer no se sol baixar i podria ser perillós.</translation> <translation id="4907306957610201395">Categoria de permisos</translation> <translation id="4908811072292128752">Obre una pestanya nova per navegar per dos llocs web a la vegada</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">S'està activant...</translation> <translation id="5039804452771397117">Permet</translation> <translation id="5042282098504489593">Obre Configuració per connectar <ph name="USB_DEVICE_NAME" /> a Linux</translation> +<translation id="5043913660911154449">També pots especificar el fitxer PPD de la teva impressora. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Contrasenya incorrecta</translation> <translation id="504561833207953641">S'està obrint a la sessió actual del navegador.</translation> <translation id="5047421709274785093">Impedeix que els llocs web utilitzin els sensors de moviment i de llum</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">Els usuaris menors d'edat no poden canviar aquesta opció de configuració.</translation> <translation id="5466374726908360271">Engan&xa i cerca "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">S'estan cercant usos compartits de fitxers</translation> +<translation id="5470735824776589490">Cal reiniciar el dispositiu per poder restablir-lo amb Powerwash. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hola! Soc la teva veu per a la conversió de text a parla.</translation> <translation id="5472133193607270166">Quan aquesta opció està activada, els llocs web no poden fer servir la teva activitat de navegació en diferents llocs web per personalitzar els anuncis. Pot ser que alguns llocs web no funcionin correctament.</translation> <translation id="5473333559083690127">Torna a introduir el PIN nou</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">Organitza</translation> <translation id="5499313591153584299">Aquest fitxer pot malmetre l'ordinador.</translation> <translation id="5502500733115278303">Importat de Firefox</translation> +<translation id="5505264765875738116">Els llocs web no poden demanar-te permís per enviar-te notificacions</translation> <translation id="5505307013568720083">No queda tinta</translation> <translation id="5507756662695126555">No repudiació</translation> <translation id="5509693895992845810">Desa &com a...</translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">Preferències</translation> <translation id="5804175651771201311">Itinerància desactivada</translation> <translation id="5804241973901381774">Permisos</translation> +<translation id="5804427196348435412">Utilitza dispositius amb NFC</translation> <translation id="5805697420284793859">Gestor de finestres</translation> <translation id="5806773519584576205">0° (valor predeterminat)</translation> <translation id="5811750797187914944">Tot a punt</translation> @@ -3522,7 +3537,7 @@ <translation id="6053401458108962351">&Esborra les dades de navegació...</translation> <translation id="6055171183283175969">La contrasenya que has introduït és incorrecta.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 amb encriptació RSA</translation> -<translation id="6055907707645252013">Xarxa <ph name="NETWORK_TYPE" />, no connectada</translation> +<translation id="6055907707645252013">Xarxa <ph name="NETWORK_TYPE" /> (no connectada)</translation> <translation id="6056710589053485679">Torna a carregar de manera normal</translation> <translation id="6057381398996433816">No es permet que aquest lloc web utilitzi els sensors de llum i moviment.</translation> <translation id="6058567592298841668">Màquina virtual de connectors: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">Obre-la maximitzada</translation> <translation id="6096326118418049043">Nom X.500</translation> <translation id="6097480669505687979">Si no alliberes espai, pot ser que se suprimeixin dades i usuaris automàticament.</translation> +<translation id="6097600385983390082">La cerca per veu està desactivada</translation> <translation id="6098793583803863900">S'està cercant contingut perillós en un fitxer desconegut.</translation> <translation id="6100736666660498114">Menú Inici</translation> <translation id="6101226222197207147">S'ha afegit una aplicació nova (<ph name="EXTENSION_NAME" />)</translation> @@ -3586,7 +3602,7 @@ <translation id="6136114942382973861">Tanca la barra de baixades</translation> <translation id="6137767437444130246">Certificat d'usuari</translation> <translation id="6138680304137685902">Signatura d'ECDSA X9.62 amb SHA-384</translation> -<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, sense xarxa</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" /> (sense xarxa)</translation> <translation id="6141988275892716286">Confirma la baixada</translation> <translation id="6143186082490678276">Obtén ajuda</translation> <translation id="6144938890088808325">Contribuïu a millorar els dispositius Chromebook</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">Utilitza la veu en comptes del teclat de manera predeterminada</translation> <translation id="6234474535228214774">Instal·lació pendent</translation> <translation id="6237816943013845465">Permet ajustar la resolució de pantalla</translation> +<translation id="6238624845858322552">Connecta't al dispositiu Bluetooth</translation> <translation id="6238767809035845642">Text compartit d'un altre dispositiu</translation> <translation id="6238923052227198598">Mantén la darrera nota a la pantalla de bloqueig</translation> <translation id="6239558157302047471">Torna a carregar el &marc</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal, <ph name="BATTERY_STATUS" />% de bateria al telèfon, connecta</translation> <translation id="6268252012308737255">Obre amb <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Els llocs web poden demanar-te permís per enviar-te notificacions</translation> <translation id="6270770586500173387">Envia <ph name="BEGIN_LINK1" />informació del sistema i de l'aplicació<ph name="END_LINK1" />, així com <ph name="BEGIN_LINK2" />mètriques<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">S'ha produït un error (<ph name="ERROR" />) en baixar el connector</translation> <translation id="6273677812470008672">Qualitat</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">Compte</translation> <translation id="6298962879096096191">Utilitza Google Play per instal·lar aplicacions per a Android</translation> <translation id="630065524203833229">S&urt</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> no s'ha pogut configurar automàticament. Especifica els detalls avançats de la impressora. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Política global:</translation> <translation id="6307990684951724544">El sistema està ocupat</translation> <translation id="6308493641021088955">Inici de sessió proporcionat per <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">Actualment no es pot dur a terme la neteja</translation> <translation id="6556866813142980365">Refés</translation> <translation id="6557290421156335491">Les meves dreceres</translation> +<translation id="6561560012278703671">Utilitza missatges més silenciosos (bloqueja les sol·licituds de notificacions per evitar interrupcions)</translation> <translation id="6561726789132298588">retorn</translation> <translation id="656293578423618167">El camí o el nom del fitxer és massa llarg. Deseu-ho amb un nom més curt o en una altra ubicació.</translation> <translation id="6563469144985748109">El teu gestor encara no ho ha aprovat</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">Pregunta abans d'enviar</translation> <translation id="6840184929775541289">No és una entitat emissora de certificats</translation> <translation id="6841186874966388268">Errors</translation> +<translation id="6843267103192918276">Inicia la sessió per tenir les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en tots els dispositius. A més, s'iniciarà la sessió automàticament als serveis de Google. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google ja està configurat</translation> <translation id="6845038076637626672">Obre-la maximitzada</translation> <translation id="6845325883481699275">Ajuda a millorar la seguretat de Chrome</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">El programari de Hangouts Meet ja es pot configurar.</translation> <translation id="744341768939279100">Crea un perfil</translation> <translation id="7443806024147773267">Accedeix a les contrasenyes sempre que tinguis la sessió iniciada al Compte de Google</translation> -<translation id="7444046173054089907">Aquest lloc està bloquejat</translation> <translation id="7444983668544353857">Desactiva <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instal·la aplicacions automàticament</translation> <translation id="7450761244949417357">S'està obrint a <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">Suprimeix aquesta persona</translation> <translation id="8215295261562449873">Abans d'actualitzar Linux, fes una còpia de seguretat de les meves aplicacions i dels meus fitxers a la carpeta Baixades.</translation> <translation id="8217399928341212914">Continua bloquejant les baixades automàtiques de diversos fitxers</translation> +<translation id="8218847192766059983">Afegeix idiomes o torna a ordenar la llista. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Normalment bloqueges les notificacions. Per permetre que aquest lloc web et mostri notificacions, fes clic aquí.</translation> <translation id="8225265270453771718">Comparteix la finestra d'una aplicació</translation> <translation id="8225753906568652947">Bescanvia les teves ofertes</translation> @@ -5161,7 +5182,7 @@ <translation id="8400146488506985033">Gestiona persones</translation> <translation id="8401432541486058167">Proporciona el PIN que està associat a la teva targeta intel·ligent.</translation> <translation id="8405046151008197676">Descobreix les novetats més destacades de la darrera actualització</translation> -<translation id="8408068190360279472">Xarxa <ph name="NETWORK_TYPE" />, s'està connectant</translation> +<translation id="8408068190360279472">Xarxa <ph name="NETWORK_TYPE" /> (connectant)</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Pregunta-m'ho abans (opció recomanada)</translation> <translation id="8418445294933751433">&Mostra com a pestanya</translation> @@ -5645,6 +5666,7 @@ <translation id="9065203028668620118">Edita</translation> <translation id="9066773882585798925">Sent text en veu alta</translation> <translation id="9066782832737749352">Text a parla</translation> +<translation id="9067559831321817373">Gestiona els comptes en què tens la sessió iniciada. És possible que els llocs web, les aplicacions i les extensions de Chrome i Google Play utilitzin aquests comptes per personalitzar la teva experiència, en funció dels permisos. <a>Més informació</a></translation> <translation id="9068849894565669697">Selecció de color</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 888e749..29738c7 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Tato stránka nereaguje</translation> <translation id="1041263367839475438">Dostupná zařízení</translation> <translation id="1042174272890264476">Počítač je dodáván s integrovanou knihovnou RLZ prohlížeče <ph name="SHORT_PRODUCT_NAME" />. RLZ přiřadí značku, která slouží k vyhodnocení vyhledávání a využití prohlížečů <ph name="SHORT_PRODUCT_NAME" />, které pocházejí z konkrétní propagační kampaně. Tato značka není jedinečná a neumožňuje osobní identifikaci. Tyto značky jsou někdy v prohlížeči <ph name="PRODUCT_NAME" /> uváděny v dotazech ve Vyhledávání Google.</translation> +<translation id="1043818413152647937">Vymazat data také z těchto aplikací?</translation> <translation id="1045692658517323508">{0,plural, =1{Aktualizovat do 1 minuty}few{Aktualizovat do # minut}many{Aktualizovat do # minuty}other{Aktualizovat do # minut}}</translation> <translation id="1046635659603195359">Funkci rozpoznání hlasu Voice Match jste u Asistenta Google už zřejmě nastavili v jiném zařízení. Dřívější nahrávky lze použít k vytvoření hlasového modelu v tomto zařízení. Mělo by to trvat méně než minutu.</translation> <translation id="1047431265488717055">Kopírovat te&xt odkazu</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Získejte do Chromu chytré funkce Google</translation> <translation id="1147991416141538220">Chcete-li požádat o přístup, kontaktujte administrátora tohoto zařízení.</translation> <translation id="1149401351239820326">Měsíc vypršení platnosti</translation> +<translation id="1150490752229770117">Toto je poslední automatická aktualizace softwaru a zabezpečení pro toto zařízení typu <ph name="DEVICE_TYPE" />. Chcete-li dostávat budoucí aktualizace, upgradujte na novější model. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Sluneční brýle</translation> <translation id="1151917987301063366">Vždy povolit webu <ph name="HOST" /> přístup k senzorům</translation> <translation id="1153356358378277386">Spárovaná zařízení</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Vyberte lístek, který chcete použít k ověření. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Mějte toto heslo k dispozici i na iPhonu</translation> <translation id="1712552549805331520">Stránka <ph name="URL" /> chce trvale ukládat data v místním počítači</translation> +<translation id="1714644264617423774">Aktivuje funkce usnadnění přístupu pro snazší používání zařízení. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Pohybová čidla</translation> +<translation id="171824261579749339">Opačné <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Poslední hodina</translation> <translation id="1719312230114180055">Poznámka: Otisk prstu může být méně bezpečný než silné heslo nebo PIN.</translation> <translation id="1720318856472900922">Ověření TLS webového serveru</translation> @@ -748,7 +752,7 @@ <translation id="2048653237708779538">Akce není k dispozici</translation> <translation id="2050339315714019657">Na výšku</translation> <translation id="2053312383184521053">Údaje o stavu nečinnosti</translation> -<translation id="2055585478631012616">Z těchto webů budete odhlášeni (i v otevřených kartách)</translation> +<translation id="2055585478631012616">Z těchto webů budete odhlášeni (i na otevřených kartách)</translation> <translation id="205560151218727633">Logo Asistenta Google</translation> <translation id="2058456167109518507">Bylo zjištěno zařízení</translation> <translation id="2059913712424898428">Časové pásmo</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Vymazat soubory cookie třetích stran</translation> <translation id="2097372108957554726">Chcete-li zaregistrovat nová zařízení, musíte se přihlásit do Chromu.</translation> <translation id="2099172618127234427">Aktivujete funkce ladění systému Chrome OS, které nastaví démona sshd a umožní spouštění z jednotek USB.</translation> +<translation id="2099625543891475722">vaše fyzické vlastnosti, například výšku,</translation> <translation id="2099686503067610784">Smazat certifikát serveru <ph name="CERTIFICATE_NAME" />?</translation> <translation id="2100273922101894616">Přihlásit se automaticky</translation> <translation id="2101225219012730419">Verze:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">Vytvořit nový profil</translation> <translation id="2446585455334014596">Web <ph name="APP_NAME" /> chce ověřit vaši identitu</translation> <translation id="2448312741937722512">Typ</translation> +<translation id="2448734521821581858">Soubory cookie jsou vytvářeny webovými stránkami, které navštěvujete. Existují dva typy souborů cookie: Soubory cookie první strany jsou vytvářeny navštíveným webem. Web je uveden na adresním řádku. Soubory cookie třetích stran jsou vytvářeny ostatními weby. Tyto weby na navštívené stránce vlastní nějaký obsah, např. reklamy nebo obrázky.</translation> <translation id="2450223707519584812">Uživatele nebudete moci přidávat, protože chybí klíče rozhraní Google API. Podrobnosti naleznete na adrese <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Žádná aktivní zobrazení</translation> <translation id="2451298179137331965">2×</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">Časový limit vypršel</translation> <translation id="2588636910004461974">Zařízení od dodavatele <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Vyhledávejte na Googlu nebo zadejte adresu URL</translation> +<translation id="2600522410036850735">Toto zařízení bude dostávat automatické aktualizace softwaru a zabezpečení do: <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Další informace</a></translation> <translation id="2603115962224169880">Vyčištění počítače</translation> <translation id="2603463522847370204">Otevřít v &anonymním okně</translation> <translation id="2604255671529671813">Chyba připojení k síti</translation> @@ -1294,7 +1301,7 @@ <translation id="2800760947029405028">Nahrát obrázek</translation> <translation id="2803375539583399270">Zadejte kód PIN</translation> <translation id="2804043232879091219">Alternativní prohlížeč se nepodařilo otevřít</translation> -<translation id="2804667941345577550">Z tohoto webu budete odhlášení (i v otevřených kartách)</translation> +<translation id="2804667941345577550">Z tohoto webu budete odhlášení (i na otevřených kartách)</translation> <translation id="2804680522274557040">Kamera je vypnutá</translation> <translation id="2805646850212350655">Systém souborů Microsoft EFS</translation> <translation id="2805756323405976993">Aplikace</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">Bezpečné prohlížení (chrání vás a vaše zařízení před nebezpečnými weby)</translation> <translation id="3182749001423093222">Kontrola pravopisu</translation> <translation id="3183139917765991655">Nástroj na import profilů</translation> +<translation id="3184536091884214176">Nastavení nebo správa tiskáren CUPS. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Moje soubory</translation> <translation id="3188465121994729530">Plovoucí průměr</translation> <translation id="3190558889382726167">Heslo uloženo</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">Jejda! Systému se nepodařilo načíst zásady pro vaše zařízení.</translation> <translation id="347785443197175480">Povolit webu <ph name="HOST" /> přístup k webové kameře a mikrofonu i nadále</translation> <translation id="3478685642445675458">Před odebráním osoby prosím odemkněte svůj profil.</translation> -<translation id="3479539252931486093">Nebylo toto očekáváno? <ph name="BEGIN_LINK" />Informujte nás<ph name="END_LINK" />.</translation> <translation id="3479552764303398839">Teď ne</translation> <translation id="3481268647794498892">Za <ph name="COUNTDOWN_SECONDS" /> se obsah otevře v prohlížeči <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> <translation id="3484273680291419129">Odstraňování škodlivého softwaru...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">Zobrazit na přihlašovací obrazovce uživatelská jména a fotografie</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – připojeno zařízení HID</translation> <translation id="4142052906269098341">Odemykejte své zařízení <ph name="DEVICE_TYPE" /> telefonem. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Uložte si nalezené tiskárny do svého profilu nebo přidejte novou tiskárnu. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Získejte kvalitnější video a prodlužte životnost baterie. Video se bude přehrávat jen na obrazovce, která podporuje technologii Cast.</translation> <translation id="4146026355784316281">Vždy otevřít pomocí systémového prohlížeče</translation> <translation id="4146785383423576110">Resetovat a vyčistit</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">Meloun</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> sdílí okno.</translation> <translation id="4364830672918311045">Zobrazování oznámení</translation> +<translation id="436499142539576997">Nepodařilo se získat data aplikace, pokračuje pokus o spuštění aplikace...</translation> <translation id="4370975561335139969">Zadaný e-mail a heslo se neshodují.</translation> <translation id="437184764829821926">Rozšířené nastavení písma</translation> <translation id="4374831787438678295">Instalační program Linuxu</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">U přesměrování prohlížeče jsou podporovány pouze protokoly http, https a file.</translation> <translation id="4659077111144409915">Primární účet</translation> <translation id="4660476621274971848">Byla očekávána verze <ph name="EXPECTED_VERSION" />, ale použita byla verze <ph name="NEW_ID" /></translation> +<translation id="4660838440047236328">rozvržení vaší místnosti.</translation> <translation id="4662788913887017617">Sdílejte tuto záložku se svým iPhonem</translation> <translation id="4663373278480897665">Kamera je povolena</translation> <translation id="4664482161435122549">Chyba exportu souboru PKCS #12</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">Počáteční stránka byla změněna na <ph name="URL" />.</translation> <translation id="4902546322522096650">Síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, síla signálu: <ph name="SIGNAL_STRENGTH" /> %, připojit</translation> <translation id="49027928311173603">Zásada stažená ze serveru je neplatná: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Nastavit nebo spravovat sdílená úložiště na síti. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Tento soubor se běžně nestahuje a může být nebezpečný.</translation> <translation id="4907306957610201395">Kategorie oprávnění</translation> <translation id="4908811072292128752">Otevřete novou kartu a prohlížejte dvě webové stránky naráz</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">Aktivování...</translation> <translation id="5039804452771397117">Povolit</translation> <translation id="5042282098504489593">Chcete-li zařízení <ph name="USB_DEVICE_NAME" /> připojit k Linuxu, otevřete Nastavení</translation> +<translation id="5043913660911154449">Případně zadejte PPD tiskárny <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Nesprávné heslo</translation> <translation id="504561833207953641">Otevírání v existující relaci prohlížeče.</translation> <translation id="5047421709274785093">Bránit webům v používání senzorů pohybu a světla</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">Dětský uživatel toto nastavení nemůže změnit.</translation> <translation id="5466374726908360271">Vl&ožit a vyhledat výraz „<ph name="SEARCH_TERMS" />“</translation> <translation id="5468173180030470402">Vyhledávání sdílených úložišť</translation> +<translation id="5470735824776589490">Než bude možné zařízení resetovat pomocí funkce Powerwash, je třeba ho restartovat. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Zdravím vás. Jsem váš hlas převodu textu na řeč.</translation> <translation id="5472133193607270166">Když je tato možnost zapnutá, weby nemohou používat vaši aktivitu prohlížení na různých webech k personalizaci reklam. Některé weby nemusí fungovat správně.</translation> <translation id="5473333559083690127">Znovu zadejte nový PIN</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">Uspořádat</translation> <translation id="5499313591153584299">Tento soubor může poškodit váš počítač.</translation> <translation id="5502500733115278303">Importováno z Firefoxu</translation> +<translation id="5505264765875738116">Weby nemohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="5505307013568720083">Došel inkoust</translation> <translation id="5507756662695126555">Neodvolatelnost</translation> <translation id="5509693895992845810">Uložit &jako...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">Nastavení</translation> <translation id="5804175651771201311">Roaming je zakázán</translation> <translation id="5804241973901381774">Oprávnění</translation> +<translation id="5804427196348435412">Používat zařízení NFC</translation> <translation id="5805697420284793859">Správce oken</translation> <translation id="5806773519584576205">0° (výchozí)</translation> <translation id="5811750797187914944">Vše je nastaveno</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">Otevřít maximalizované</translation> <translation id="6096326118418049043">Název X.500</translation> <translation id="6097480669505687979">Pokud neuvolníte místo, může dojít k automatickému odebrání uživatelů a dat.</translation> +<translation id="6097600385983390082">Hlasové vyhledávání bylo zavřeno</translation> <translation id="6098793583803863900">Probíhá vyhledávání nebezpečného obsahu v neznámém souboru.</translation> <translation id="6100736666660498114">Nabídka Start</translation> <translation id="6101226222197207147">Byla přidána nová aplikace (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">Ve výchozím nastavení používat místo klávesnice hlas</translation> <translation id="6234474535228214774">Čeká se na instalaci</translation> <translation id="6237816943013845465">Umožňuje upravit rozlišení obrazovky</translation> +<translation id="6238624845858322552">Umožňuje připojení zařízení s rozhraním Bluetooth</translation> <translation id="6238767809035845642">Text sdílený z jiného zařízení</translation> <translation id="6238923052227198598">Zobrazovat poslední poznámku na obrazovce uzamčení</translation> <translation id="6239558157302047471">Znovu načíst &rámec</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">Síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, síla signálu: <ph name="SIGNAL_STRENGTH" /> %, baterie telefonu: <ph name="BATTERY_STATUS" /> %, připojit</translation> <translation id="6268252012308737255">Otevřít v aplikaci <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Weby mohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="6270770586500173387">Posílat <ph name="BEGIN_LINK1" />informace o systému a aplikacích<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />metriky<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Při stahování pluginu došlo k chybě (<ph name="ERROR" />).</translation> <translation id="6273677812470008672">Kvalita</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">Účet</translation> <translation id="6298962879096096191">Používat Google Play k instalaci aplikací pro Android</translation> <translation id="630065524203833229">Konec</translation> +<translation id="6300718114348072351">Tiskárnu <ph name="PRINTER_NAME" /> se nepodařilo nakonfigurovat automaticky. Zadejte rozšířené podrobnosti o tiskárně. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globální zásada:</translation> <translation id="6307990684951724544">Systém je zaneprázděný</translation> <translation id="6308493641021088955">Poskytovatel přihlášení: <ph name="EXTENSION_NAME" /></translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">Vyčištění aktuálně není k dispozici</translation> <translation id="6556866813142980365">Opakovat</translation> <translation id="6557290421156335491">Moje zkratky</translation> +<translation id="6561560012278703671">Použít méně rušivou zprávu (blokuje žádosti o zobrazení oznámení)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Cesta nebo název souboru jsou příliš dlouhé. Použijte kratší název nebo vyberte jiné umístění.</translation> <translation id="6563469144985748109">Správce vám přístup na web dosud neschválil.</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">Před odesláním se zeptat</translation> <translation id="6840184929775541289">Není certifikační autorita</translation> <translation id="6841186874966388268">Chyby</translation> +<translation id="6843267103192918276">Přihlaste se a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení. Budete také automaticky přihlášeni do svých služeb Google. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Funkce OK Google je připravená</translation> <translation id="6845038076637626672">Otevřít maximalizované</translation> <translation id="6845325883481699275">Pomoci zlepšovat zabezpečení Chromu</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware je připraven k nastavení.</translation> <translation id="744341768939279100">Vytvořit nový profil</translation> <translation id="7443806024147773267">Mějte hesla k dispozici vždy, když jste přihlášeni k účtu Google</translation> -<translation id="7444046173054089907">Tento web je blokován</translation> <translation id="7444983668544353857">Deaktivovat <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automaticky instalovat aplikace</translation> <translation id="7450761244949417357">Otevírání v prohlížeči <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">Odebrat tohoto uživatele</translation> <translation id="8215295261562449873">Před upgradováním Linuxu zálohovat mé aplikace a soubory do složky Stažené soubory.</translation> <translation id="8217399928341212914">I nadále blokovat automatické stahování několika souborů</translation> +<translation id="8218847192766059983">Přidejte jazyky nebo přeuspořádejte seznam. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Obvykle oznámení blokujete. Chcete-li tomuto webu zobrazování oznámení povolit, klikněte sem.</translation> <translation id="8225265270453771718">Sdílet okno aplikace</translation> <translation id="8225753906568652947">Využít nabídky</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">Upravit</translation> <translation id="9066773882585798925">Čtení textu nahlas</translation> <translation id="9066782832737749352">Převod textu na řeč</translation> +<translation id="9067559831321817373">Spravujte účty, ve kterých jste přihlášeni. V závislosti na oprávněních vám weby, aplikace a rozšíření v Chromu a na Google Play pomocí těchto účtů mohou přizpůsobovat prostředí. <a>Další informace</a></translation> <translation id="9068849894565669697">Výběr barvy</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 947bad21..03ac6977 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Denne side svarer ikke</translation> <translation id="1041263367839475438">Tilgængelige enheder</translation> <translation id="1042174272890264476">Computeren leveres også med <ph name="SHORT_PRODUCT_NAME" />s RLZ-samling indbygget. RLZ tildeler et ikke-unikt, ikke-personligt identificerbart tag til at måle søgninger og <ph name="SHORT_PRODUCT_NAME" />-brug, der er drevet af en bestemt kampagne. Disse etiketter vises nogle gange i Googles søgeforespørgsler i <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Vil du også rydde dataene fra disse apps?</translation> <translation id="1045692658517323508">{0,plural, =1{Opdater inden for 1 minut}one{Opdater inden for # minut}other{Opdater inden for # minutter}}</translation> <translation id="1046635659603195359">Det ser ud til, at du allerede har konfigureret Voice Match med Google-assistenten på en anden enhed. Disse tidligere optagelser kan bruges til at oprette en stemmemodel på denne enhed. Dette bør tage mindre end et minut.</translation> <translation id="1047431265488717055">Kopiér linkte&kst</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Få Googles smarte funktioner i Chrome</translation> <translation id="1147991416141538220">Hvis du vil anmode om adgang, skal du kontakte administratoren af denne enhed.</translation> <translation id="1149401351239820326">Udløbsmåned</translation> +<translation id="1150490752229770117">Dette er den sidste automatiske software- og sikkerhedsopdatering for denne <ph name="DEVICE_TYPE" />. Opgrader til en nyere model for at få fremtidige opdateringer. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Solbriller</translation> <translation id="1151917987301063366">Tillad altid, at <ph name="HOST" /> kan få adgang til sensorer</translation> <translation id="1153356358378277386">Parrede enheder</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Vælg en billet, som du vil bruge til godkendelse. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Få denne adgangskode på din iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> anmoder om at gemme data permanent på din lokale computer</translation> +<translation id="1714644264617423774">Aktivér hjælpefunktioner for at gøre din enhed nemmere at bruge. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Bevægelsessensorer</translation> +<translation id="171824261579749339">Naturlig <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Den seneste time</translation> <translation id="1719312230114180055">Bemærk! Adgang via fingeraftryk kan være mindre sikkert end adgang via en stærk adgangskode eller pinkode.</translation> <translation id="1720318856472900922">TLS WWW-servergodkendelse</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Slet cookies fra tredjeparter</translation> <translation id="2097372108957554726">Du skal logge ind i Chrome for at registrere nye enheder</translation> <translation id="2099172618127234427">Du aktiverer Chrome OS-fejlretningsfunktioner, som konfigurerer sshd daemon og aktiverer systemgenstart via USB-drev.</translation> +<translation id="2099625543891475722">Dine fysiske træk som f.eks. højde</translation> <translation id="2099686503067610784">Slet servercertifikatet "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Automatisk login</translation> <translation id="2101225219012730419">Version:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Opret en ny profil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> vil bekræfte din identitet</translation> <translation id="2448312741937722512">Type</translation> +<translation id="2448734521821581858">Cookies er filer, som oprettes af de websites, du besøger. Der findes to slags cookies: Førstepartscookies oprettes af det website, du besøger. Websitet vises i adresselinjen. Tredjepartscookies oprettes af andre websites. Disse websites ejer noget af indholdet, f.eks. de annoncer eller billeder, der vises på det website, du besøger.</translation> <translation id="2450223707519584812">Du vil ikke kunne tilføje brugere, da der mangler Google API-nøgler. Se <ph name="DETAILS_URL" /> for at få flere oplysninger.</translation> <translation id="2450849356604136918">Ingen aktive visninger</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Der opstod timeout</translation> <translation id="2588636910004461974">Enheder fra <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Søg på Google, eller angiv webadressen</translation> +<translation id="2600522410036850735">Denne enhed får automatiske software- og sikkerhedsopdateringer indtil <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Få flere oplysninger</a></translation> <translation id="2603115962224169880">Ryd op på computeren</translation> <translation id="2603463522847370204">Åbn i &inkognitovindue</translation> <translation id="2604255671529671813">Fejl i netværksforbindelsen</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Beskyttet browsing (beskytter dig og din enhed mod farlige websites)</translation> <translation id="3182749001423093222">Stavekontrol</translation> <translation id="3183139917765991655">Profilimport</translation> +<translation id="3184536091884214176">Konfigurer eller administrer CUPS-printere. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mine filer</translation> <translation id="3188465121994729530">Glidende gennemsnit</translation> <translation id="3190558889382726167">Adgangskoden er blevet gemt</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Ups! Systemet kunne ikke hente politikken til din enhed.</translation> <translation id="347785443197175480">Tillad fortsat, at <ph name="HOST" /> har adgang til dit kamera og din mikrofon</translation> <translation id="3478685642445675458">Lås din profil op, før du kan fjerne en person.</translation> -<translation id="3479539252931486093">Var dette uventet? <ph name="BEGIN_LINK" />Giv os gerne feedback<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ikke nu</translation> <translation id="3481268647794498892">Åbner i <ph name="ALTERNATIVE_BROWSER_NAME" /> om <ph name="COUNTDOWN_SECONDS" /> sekunder</translation> <translation id="3484273680291419129">Sletter skadelig software...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Vis brugernavne og billeder på loginskærmen</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-enhed er tilsluttet</translation> <translation id="4142052906269098341">Lås din <ph name="DEVICE_TYPE" /> op med din telefon. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Gem registrerede printere på din profil, eller tilføj en ny printer. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Se video i bedre kvalitet, og forlæng batteritiden. Der afspilles kun video på din Cast-kompatible skærm.</translation> <translation id="4146026355784316281">Åbn altid med systemets visningsprogram</translation> <translation id="4146785383423576110">Nulstil og ryd op</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindue.</translation> <translation id="4364830672918311045">Vis notifikationer</translation> +<translation id="436499142539576997">Der kunne ikke hentes appdata, men kørsel af appen forsøges stadig...</translation> <translation id="4370975561335139969">Den mail og adgangskode, du indtastede, stemmer ikke overens</translation> <translation id="437184764829821926">Avancerede indstillinger for skrifttype</translation> <translation id="4374831787438678295">Linux-installationsprogram</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Det er kun http, https og filprotokoller, der kan omdirigeres til en alternativ browser.</translation> <translation id="4659077111144409915">Primær konto</translation> <translation id="4660476621274971848">Den forventede version var "<ph name="EXPECTED_VERSION" />", men versionen viste sig at være "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">Layoutet af dit rum</translation> <translation id="4662788913887017617">Del dette bogmærke med din iPhone</translation> <translation id="4663373278480897665">Der er givet adgang til kameraet</translation> <translation id="4664482161435122549">PKCS #12-eksportfejl</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Din opstartsside blev ændret til <ph name="URL" />.</translation> <translation id="4902546322522096650">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, signalstyrke <ph name="SIGNAL_STRENGTH" /> %, opret forbindelse</translation> <translation id="49027928311173603">Den politik, der er downloadet fra serveren, er ugyldig: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Konfigurer eller administrer fildeling via netværk. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Denne fil er ikke downloadet på almindelig vis og kan være farlig.</translation> <translation id="4907306957610201395">Tilladelseskategori</translation> <translation id="4908811072292128752">Åbn en ny fane for at se to websites på én gang</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Aktiverer...</translation> <translation id="5039804452771397117">Tillad</translation> <translation id="5042282098504489593">Åbn Indstillinger for at knytte <ph name="USB_DEVICE_NAME" /> til Linux</translation> +<translation id="5043913660911154449">Du kan også angive PPD-filen for printeren <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Ugyldig adgangskode</translation> <translation id="504561833207953641">Åbner i eksisterende browsersession.</translation> <translation id="5047421709274785093">Bloker websites, så de ikke kan anvende bevægelses- og lyssensorer</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Denne indstilling kan ikke ændres af en bruger, som er et barn.</translation> <translation id="5466374726908360271">Ind&sæt, og søg efter "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Søger efter fildelinger</translation> +<translation id="5470735824776589490">Enheden skal genstartes, før den kan nulstilles med Powerwash. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hej! Jeg er din stemme til oplæsning.</translation> <translation id="5472133193607270166">Når dette er slået til, kan websites ikke anvende din browseraktivitet på andre websites til at tilpasse annoncer. Nogle websites vil muligvis ikke fungere korrekt.</translation> <translation id="5473333559083690127">Angiv ny pinkode igen</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Organiser</translation> <translation id="5499313591153584299">Denne fil kan være skadelig for din computer.</translation> <translation id="5502500733115278303">Importeret fra Firefox</translation> +<translation id="5505264765875738116">Websites kan ikke spørge dig, om de må sende dig notifikationer</translation> <translation id="5505307013568720083">Der mangler blæk</translation> <translation id="5507756662695126555">Uafviselighed</translation> <translation id="5509693895992845810">Gem &som...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Præferencer</translation> <translation id="5804175651771201311">Roaming er deaktiveret</translation> <translation id="5804241973901381774">Tilladelser</translation> +<translation id="5804427196348435412">Brug NFC-enheder</translation> <translation id="5805697420284793859">Vinduesadministrator</translation> <translation id="5806773519584576205">0° (standard)</translation> <translation id="5811750797187914944">Udført</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Åbn maksimeret</translation> <translation id="6096326118418049043">X.500-navn</translation> <translation id="6097480669505687979">Hvis du ikke frigør plads, kan brugere og data blive fjernet automatisk.</translation> +<translation id="6097600385983390082">Stemmesøgning er lukket</translation> <translation id="6098793583803863900">En ukendt fil scannes for skadeligt indhold.</translation> <translation id="6100736666660498114">Startmenu</translation> <translation id="6101226222197207147">Ny app er tilføjet (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">Brug stemmen som standard i stedet for tastaturet</translation> <translation id="6234474535228214774">Installation afventer</translation> <translation id="6237816943013845465">Giver dig mulighed for at justere skærmopløsningen</translation> +<translation id="6238624845858322552">Opret forbindelse til Bluetooth-enhed</translation> <translation id="6238767809035845642">Tekst, der er delt fra en anden enhed</translation> <translation id="6238923052227198598">Behold den nyeste note på låseskærmen</translation> <translation id="6239558157302047471">Genindlæs &ramme</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, signalstyrke <ph name="SIGNAL_STRENGTH" /> %, telefonbatteri <ph name="BATTERY_STATUS" /> %, opret forbindelse</translation> <translation id="6268252012308737255">Åbn med <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Websites kan spørge dig, om de må sende dig notifikationer</translation> <translation id="6270770586500173387">Send <ph name="BEGIN_LINK1" />system- og appoplysninger<ph name="END_LINK1" /> samt <ph name="BEGIN_LINK2" />metrics<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Der opstod en fejl (<ph name="ERROR" />) under download af pluginnet</translation> <translation id="6273677812470008672">Kvalitet</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">Konto</translation> <translation id="6298962879096096191">Brug Google Play til at installere Android-apps</translation> <translation id="630065524203833229">Af&slut</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> kunne ikke konfigureres automatisk. Angiv avancerede indstillinger for printeren. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Global politik:</translation> <translation id="6307990684951724544">Systemet er optaget</translation> <translation id="6308493641021088955">Login leveres af <ph name="EXTENSION_NAME" /></translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">Det er i øjeblikket ikke muligt at rydde indhold</translation> <translation id="6556866813142980365">Gør det igen</translation> <translation id="6557290421156335491">Mine genveje</translation> +<translation id="6561560012278703671">Få lydløse meddelelser (dette sørger for, at dine notifikationsprompts ikke forstyrrer dig)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Filstien eller -navnet er for langt. Gem med et kortere navn eller på en anden placering.</translation> <translation id="6563469144985748109">Din administrator har ikke godkendt det endnu</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">Spørg, før der sendes</translation> <translation id="6840184929775541289">Er ikke en certificeringsautoritet</translation> <translation id="6841186874966388268">Fejl</translation> +<translation id="6843267103192918276">Log ind for at hente bogmærker, historik, adgangskoder og andre indstillinger på alle dine enheder. Du logges også automatisk ind på dine Google-tjenester. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google er konfigureret</translation> <translation id="6845038076637626672">Åbn maksimeret</translation> <translation id="6845325883481699275">Hjælp med at forbedre sikkerheden i Chrome</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">Dit Hangouts Meet-hardware er klar til konfiguration.</translation> <translation id="744341768939279100">Opret en ny profil</translation> <translation id="7443806024147773267">Få adgang til dine adgangskoder, så snart du logger ind på din Google-konto</translation> -<translation id="7444046173054089907">Dette website er blokeret</translation> <translation id="7444983668544353857">Deaktiver <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installer apps automatisk</translation> <translation id="7450761244949417357">Åbner i <ph name="ALTERNATIVE_BROWSER_NAME" /> nu</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Fjern denne person</translation> <translation id="8215295261562449873">Sikkerhedskopiér mine apps og filer til mappen Downloads, før Linux opgraderes.</translation> <translation id="8217399928341212914">Fortsæt med at blokere automatiske downloads af flere filer</translation> +<translation id="8218847192766059983">Tilføj sprog, eller omorganiser listen. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Du blokerer som regel notifikationer. Klik her for at give websitet tilladelse til at sende notifikationer.</translation> <translation id="8225265270453771718">Del et appvindue</translation> <translation id="8225753906568652947">Indløs dine tilbud</translation> @@ -5647,6 +5668,7 @@ <translation id="9065203028668620118">Rediger</translation> <translation id="9066773882585798925">Få læst teksten højt</translation> <translation id="9066782832737749352">Oplæsning</translation> +<translation id="9067559831321817373">Administrer de konti, hvor du er logget ind. Websites, apps og udvidelser i Chrome og Google Play kan bruge disse konti til at tilpasse din oplevelse afhængigt af tilladelserne. <a>Få flere oplysninger</a></translation> <translation id="9068849894565669697">Vælg farve</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 4c9bda4..f9aacc3 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Diese Seite reagiert nicht</translation> <translation id="1041263367839475438">Verfügbare Geräte</translation> <translation id="1042174272890264476">Auch die RLZ-Bibliothek von <ph name="SHORT_PRODUCT_NAME" /> ist auf Ihrem Computer vorinstalliert. RLZ sorgt für die Zuweisung von Tags, anhand derer gemessen wird, wie sich einzelne Werbekampagnen auf die Suchanfragen und die Nutzung von <ph name="SHORT_PRODUCT_NAME" /> auswirken. Die Tags sind weder eindeutig, noch personenbezogen und kommen manchmal in Google-Suchanfragen in <ph name="PRODUCT_NAME" /> vor.</translation> +<translation id="1043818413152647937">Daten auch aus folgenden Apps löschen?</translation> <translation id="1045692658517323508">{0,plural, =1{Innerhalb einer Minute aktualisieren}other{Innerhalb von # Minuten aktualisieren}}</translation> <translation id="1046635659603195359">Offenbar haben Sie Voice Match bereits auf einem anderen Gerät für Google Assistant eingerichtet. Diese vorherigen Aufnahmen können verwendet werden, um ein Sprachmodell auf diesem Gerät zu erstellen. Dies sollte weniger als eine Minute dauern.</translation> <translation id="1047431265488717055">Linkte&xt kopieren</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome cleverer nutzen – dank Google</translation> <translation id="1147991416141538220">Wenn Sie Zugriff benötigen, wenden Sie sich an den Administrator dieses Geräts.</translation> <translation id="1149401351239820326">Ablaufmonat</translation> +<translation id="1150490752229770117">Das ist das letzte automatische Software- und Sicherheitsupdate für dieses <ph name="DEVICE_TYPE" />. Wenn Sie weiter Updates erhalten möchten, ist ein neueres Modell erforderlich. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Sonnenbrille</translation> <translation id="1151917987301063366"><ph name="HOST" /> immer den Zugriff auf Sensoren erlauben</translation> <translation id="1153356358378277386">Gekoppelte Geräte</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Wählen Sie ein Ticket für die Authentifizierung aus. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Dieses Passwort auf dem iPhone abrufen</translation> <translation id="1712552549805331520"><ph name="URL" /> möchte Daten dauerhaft auf Ihrem lokalen Computer speichern</translation> +<translation id="1714644264617423774">Aktivieren Sie die Bedienungshilfen, damit Ihr Gerät leichter zu verwenden ist. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Bewegungssensoren</translation> +<translation id="171824261579749339">Australisch <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Letzte Stunde</translation> <translation id="1719312230114180055">Hinweis: Ihr Fingerabdruck ist möglicherweise nicht so sicher wie ein starkes Passwort oder eine PIN.</translation> <translation id="1720318856472900922">TLS-WWW-Serverauthentifizierung</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Cookies von Drittanbietern löschen</translation> <translation id="2097372108957554726">Melden Sie sich in Chrome an, um neue Geräte zu registrieren.</translation> <translation id="2099172618127234427">Sie aktivieren Debugging-Funktionen für Chrome OS. Dadurch wird der SSHD-Daemon eingerichtet und das Starten über USB aktiviert.</translation> +<translation id="2099625543891475722">physische Merkmale wie Ihre Größe</translation> <translation id="2099686503067610784">Serverzertifikat "<ph name="CERTIFICATE_NAME" />" löschen?</translation> <translation id="2100273922101894616">Automatisch anmelden</translation> <translation id="2101225219012730419">Version:</translation> @@ -1023,6 +1028,7 @@ <translation id="2445484935443597917">Neues Profil erstellen</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> möchte Ihre Identität überprüfen</translation> <translation id="2448312741937722512">Art</translation> +<translation id="2448734521821581858">Cookies sind Dateien, die durch von Ihnen besuchte Websites erstellt werden. Es gibt zwei Arten von Cookies: Erstanbieter-Cookies werden von der Website erstellt, die Sie besuchen. Die Website wird in der Adressleiste angezeigt. Drittanbieter-Cookies werden von anderen Websites erstellt. Diesen Websites gehören einige der Inhalte, wie z. B. Werbeanzeigen oder Bilder, die Sie auf der besuchten Website sehen.</translation> <translation id="2450223707519584812">Sie können keine Nutzer hinzufügen, da Google API-Schlüssel fehlen. Weitere Informationen erhalten Sie unter <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Keine aktiven Ansichten</translation> <translation id="2451298179137331965">2-fach</translation> @@ -1136,6 +1142,7 @@ <translation id="2587922766792651800">Zeitüberschreitung</translation> <translation id="2588636910004461974">Geräte von <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Bei Google suchen oder URL eingeben</translation> +<translation id="2600522410036850735">Dieses Gerät erhält automatische Software- und Sicherheitsupdates bis <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Weitere Informationen</a></translation> <translation id="2603115962224169880">Computer bereinigen</translation> <translation id="2603463522847370204">In &Inkognito-Fenster öffnen</translation> <translation id="2604255671529671813">Fehler bei der Netzwerkverbindung</translation> @@ -1556,6 +1563,7 @@ <translation id="3181954750937456830">Safe Browsing (mich und mein Gerät vor schädlichen Websites schützen)</translation> <translation id="3182749001423093222">Rechtschreibprüfung</translation> <translation id="3183139917765991655">Profilimport</translation> +<translation id="3184536091884214176">CUPS-Drucker einrichten oder verwalten. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Meine Dateien</translation> <translation id="3188465121994729530">Gleitender Durchschnitt</translation> <translation id="3190558889382726167">Passwort gespeichert</translation> @@ -1746,7 +1754,6 @@ <translation id="347670947055184738">Hoppla! Das System konnte die Richtlinie für Ihr Gerät nicht abrufen.</translation> <translation id="347785443197175480"><ph name="HOST" /> weiterhin Zugriff auf Kamera und Mikrofon gestatten</translation> <translation id="3478685642445675458">Entsperren Sie Ihr Profil, bevor Sie eine Person entfernen.</translation> -<translation id="3479539252931486093">Geschah dies unerwartet? <ph name="BEGIN_LINK" />Informieren Sie uns<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Jetzt nicht</translation> <translation id="3481268647794498892">Wird in <ph name="COUNTDOWN_SECONDS" /> Sekunden in <ph name="ALTERNATIVE_BROWSER_NAME" /> geöffnet</translation> <translation id="3484273680291419129">Schädliche Software wird entfernt...</translation> @@ -2253,6 +2260,7 @@ <translation id="4138267921960073861">Nutzernamen und Fotos auf der Anmeldeseite anzeigen</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-Gerät verbunden</translation> <translation id="4142052906269098341"><ph name="DEVICE_TYPE" /> mit dem Smartphone entsperren. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Sie können erkannte Drucker in Ihrem Profil speichern oder neue Drucker hinzufügen. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Bessere Videoqualität und längere Akkulaufzeit. Videos werden nur auf Ihrem für Google Cast optimierten Gerät abgespielt.</translation> <translation id="4146026355784316281">Immer mit System Viewer öffnen</translation> <translation id="4146785383423576110">Zurücksetzen und bereinigen</translation> @@ -2377,6 +2385,7 @@ <translation id="4364327530094270451">Melone</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation> <translation id="4364830672918311045">Benachrichtigungen einblenden</translation> +<translation id="436499142539576997">App-Daten konnten nicht abgerufen werden. Es wird versucht, die App trotzdem auszuführen…</translation> <translation id="4370975561335139969">Die E-Mail-Adresse und das Passwort, die Sie eingegeben haben, stimmen nicht überein.</translation> <translation id="437184764829821926">Erweiterte Schriftarteinstellungen</translation> <translation id="4374831787438678295">Linux-Installationsprogramm</translation> @@ -2567,6 +2576,7 @@ <translation id="465878909996028221">Nur HTTP-, HTTPS- und Dateiprotokolle werden für Browserweiterleitungen unterstützt.</translation> <translation id="4659077111144409915">Primäres Konto</translation> <translation id="4660476621274971848">Erwartete Version: "<ph name="EXPECTED_VERSION" />", tatsächliche Version "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">der Grundriss Ihres Zimmers</translation> <translation id="4662788913887017617">Dieses Lesezeichen für mein iPhone freigeben</translation> <translation id="4663373278480897665">Kameranutzung zulässig</translation> <translation id="4664482161435122549">PKCS #12 - Fehler beim Export</translation> @@ -2730,6 +2740,7 @@ <translation id="4900392736118574277">Ihre "Beim Start"-Seite wurde in <ph name="URL" /> geändert.</translation> <translation id="4902546322522096650">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Signalstärke bei <ph name="SIGNAL_STRENGTH" /> %, Verbinden</translation> <translation id="49027928311173603">Die vom Server heruntergeladene Richtlinie ist ungültig: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Netzwerkfreigaben einrichten oder verwalten. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Diese Datei ist ein ungewöhnlicher Download und könnte schädlich sein.</translation> <translation id="4907306957610201395">Berechtigungskategorie</translation> <translation id="4908811072292128752">Wenn Sie zwei Websites gleichzeitig ansehen möchten, öffnen Sie einen neuen Tab</translation> @@ -2817,6 +2828,7 @@ <translation id="5038863510258510803">Wird aktiviert...</translation> <translation id="5039804452771397117">Zulassen</translation> <translation id="5042282098504489593">"Einstellungen" öffnen, um <ph name="USB_DEVICE_NAME" /> mit Linux zu verbinden</translation> +<translation id="5043913660911154449">Oder Sie können die PPD für den Drucker auswählen <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Falsches Passwort</translation> <translation id="504561833207953641">Wird in einer aktuellen Browsersitzung geöffnet.</translation> <translation id="5047421709274785093">Verwendung von Bewegungs- und Lichtsensoren für Websites blockieren</translation> @@ -3102,6 +3114,7 @@ <translation id="5464660706533281090">Diese Einstellung kann nicht von einem Kind geändert werden.</translation> <translation id="5466374726908360271">Ei&nfügen und nach "<ph name="SEARCH_TERMS" />" suchen</translation> <translation id="5468173180030470402">Nach Dateifreigaben wird gesucht</translation> +<translation id="5470735824776589490">Für das Zurücksetzen Ihres Geräts mit Powerwash ist ein Neustart erforderlich. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hallo! Ich bin die Stimme Ihrer Sprachausgabe.</translation> <translation id="5472133193607270166">Wenn die Funktion aktiviert ist, können Websites Ihre Browseraktivitäten auf anderen Websites nicht verwenden, um Werbung zu personalisieren. Einige Websites funktionieren dann eventuell nicht richtig.</translation> <translation id="5473333559083690127">Neue PIN noch einmal eingeben</translation> @@ -3125,6 +3138,7 @@ <translation id="5496587651328244253">Organisieren</translation> <translation id="5499313591153584299">Diese Datei könnte schädlich für Ihren Computer sein.</translation> <translation id="5502500733115278303">Aus Firefox importiert</translation> +<translation id="5505264765875738116">Websites können nicht fragen, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="5505307013568720083">Patrone leer</translation> <translation id="5507756662695126555">Zugelassen</translation> <translation id="5509693895992845810">Speichern &unter...</translation> @@ -3339,6 +3353,7 @@ <translation id="5801568494490449797">Einstellungen</translation> <translation id="5804175651771201311">Roaming aus</translation> <translation id="5804241973901381774">Berechtigungen</translation> +<translation id="5804427196348435412">NFC-Geräte verwenden</translation> <translation id="5805697420284793859">Fenstermanager</translation> <translation id="5806773519584576205">0° (Standard)</translation> <translation id="5811750797187914944">Fertig</translation> @@ -3554,6 +3569,7 @@ <translation id="6096047740730590436">Maximiert öffnen</translation> <translation id="6096326118418049043">X.500-Name</translation> <translation id="6097480669505687979">Wenn kein Speicherplatz freigegeben wird, können Nutzer und Daten automatisch entfernt werden.</translation> +<translation id="6097600385983390082">Sprachsuche geschlossen</translation> <translation id="6098793583803863900">Eine unbekannte Datei wird zur Untersuchung auf schädliche Inhalte gescannt.</translation> <translation id="6100736666660498114">Startmenü</translation> <translation id="6101226222197207147">Neue App hinzugefügt (<ph name="EXTENSION_NAME" />)</translation> @@ -3649,6 +3665,7 @@ <translation id="6233154960150021497">Standardmäßig Sprachsteuerung anstatt Tastatur verwenden</translation> <translation id="6234474535228214774">Installation ausstehend</translation> <translation id="6237816943013845465">Ermöglicht die Anpassung der Bildschirmauflösung</translation> +<translation id="6238624845858322552">Mit Bluetooth-Gerät verbinden</translation> <translation id="6238767809035845642">Text, der über ein anderes Gerät geteilt wurde</translation> <translation id="6238923052227198598">Neueste Notiz auf Sperrbildschirm anzeigen</translation> <translation id="6239558157302047471">&Frame neu laden</translation> @@ -3675,6 +3692,7 @@ <translation id="6267547857941397424">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, Signalstärke bei <ph name="SIGNAL_STRENGTH" /> %, Smartphone-Akku bei <ph name="BATTERY_STATUS" /> %, Verbinden</translation> <translation id="6268252012308737255">Öffnen mit <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Websites können fragen, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />System- und App-Informationen<ph name="END_LINK1" /> sowie <ph name="BEGIN_LINK2" />Messwerte<ph name="END_LINK2" /> senden</translation> <translation id="6272643420381259437">Beim Herunterladen des Plug-ins ist ein Fehler aufgetreten (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Qualität</translation> @@ -3696,6 +3714,7 @@ <translation id="629730747756840877">Konto</translation> <translation id="6298962879096096191">Google Play verwenden, um Android-Apps zu installieren</translation> <translation id="630065524203833229">&Beenden</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> konnte nicht automatisch konfiguriert werden. Bitte legen Sie erweiterte Einstellungen für den Drucker fest. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globale Richtlinien:</translation> <translation id="6307990684951724544">System ausgelastet</translation> <translation id="6308493641021088955">Anmeldung zur Verfügung gestellt von <ph name="EXTENSION_NAME" /></translation> @@ -3865,6 +3884,7 @@ <translation id="6555810572223193255">Die Bereinigung ist derzeit nicht verfügbar</translation> <translation id="6556866813142980365">Wiederholen</translation> <translation id="6557290421156335491">Meine Verknüpfungen</translation> +<translation id="6561560012278703671">Ein Symbol in der Adressleiste einblenden (störende Aufforderungen zum Anzeigen von Benachrichtigungen werden blockiert)</translation> <translation id="6561726789132298588">Eingabe</translation> <translation id="656293578423618167">Der Dateipfad oder Dateiname ist zu lang. Verwenden Sie bitte einen kürzeren Namen oder einen anderen Speicherort.</translation> <translation id="6563469144985748109">Der Administrator hat die Berechtigung noch nicht erteilt</translation> @@ -4048,6 +4068,7 @@ <translation id="6840155290835956714">Vor dem Senden nachfragen</translation> <translation id="6840184929775541289">Ist keine Zertifizierungsstelle</translation> <translation id="6841186874966388268">Fehler</translation> +<translation id="6843267103192918276">Melden Sie sich an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und andere Einstellungen auf allen Ihren Geräten aufzurufen. Sie werden auch automatisch in Ihren Google-Diensten angemeldet. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="6843423766595476978">"Ok Google" ist eingerichtet</translation> <translation id="6845038076637626672">Maximiert öffnen</translation> <translation id="6845325883481699275">Zur Verbesserung der Sicherheit von Chrome beitragen</translation> @@ -4464,7 +4485,6 @@ <translation id="7442465037756169001">Sie können Ihre Hangouts Meet-Hardware jetzt einrichten.</translation> <translation id="744341768939279100">Neues Profil erstellen</translation> <translation id="7443806024147773267">Überall dort, wo Sie mit Ihrem Google-Konto angemeldet sind, können Sie auf Ihre Passwörter zugreifen</translation> -<translation id="7444046173054089907">Diese Website ist blockiert</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> deaktivieren</translation> <translation id="7448430327655618736">Apps automatisch installieren</translation> <translation id="7450761244949417357">Wird jetzt in <ph name="ALTERNATIVE_BROWSER_NAME" /> geöffnet</translation> @@ -5028,6 +5048,7 @@ <translation id="8214962590150211830">Diese Person entfernen</translation> <translation id="8215295261562449873">Meine Apps und Dateien vor dem Upgrade von Linux im Ordner "Downloads" sichern.</translation> <translation id="8217399928341212914">Weiterhin automatisches Herunterladen mehrerer Dateien blockieren</translation> +<translation id="8218847192766059983">Sie können Sprachen hinzufügen oder die Liste neu anordnen. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Normalerweise blockieren Sie Benachrichtigungen. Klicken Sie hier, wenn Sie von dieser Website Benachrichtigungen erhalten möchten.</translation> <translation id="8225265270453771718">Anwendungsfenster freigeben</translation> <translation id="8225753906568652947">Meine Angebote einlösen</translation> @@ -5641,6 +5662,7 @@ <translation id="9065203028668620118">Bearbeiten</translation> <translation id="9066773882585798925">Text vorlesen lassen</translation> <translation id="9066782832737749352">Sprachausgabe</translation> +<translation id="9067559831321817373">Hier können Sie Ihre angemeldeten Konten verwalten. Websites, Apps und Erweiterungen in Chrome und Google Play greifen möglicherweise auf diese Konten zurück, um Ihnen – abhängig von den jeweiligen Berechtigungen – personalisierte Inhalte anzuzeigen. <a>Weitere Informationen</a></translation> <translation id="9068849894565669697">Farbe auswählen</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index f91f51b..062f1232 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ωχ! Το σύστημα δεν κατάφερε να ανακτήσει την πολιτική για τη συσκευή σας.</translation> <translation id="347785443197175480">Να συνεχίσει να επιτρέπεται στο <ph name="HOST" /> η πρόσβαση στην κάμερα και στο μικρόφωνό σας</translation> <translation id="3478685642445675458">Ξεκλειδώστε το προφίλ σας προτού καταργήσετε κάποιο άτομο.</translation> -<translation id="3479539252931486093">Δεν το περιμένατε; <ph name="BEGIN_LINK" />Ενημερώστε μας<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Όχι τώρα</translation> <translation id="3481268647794498892">Άνοιγμα σε <ph name="ALTERNATIVE_BROWSER_NAME" /> σε <ph name="COUNTDOWN_SECONDS" /> δευτερόλεπτα</translation> <translation id="3484273680291419129">Κατάργηση επιβλαβούς λογισμικού…</translation> @@ -4491,7 +4490,6 @@ <translation id="7442465037756169001">Το Hangouts Meet hardware είναι έτοιμο για ρύθμιση.</translation> <translation id="744341768939279100">Δημιουργήστε ένα νέο προφίλ</translation> <translation id="7443806024147773267">Αποκτήστε πρόσβαση στους κωδικούς πρόσβασής σας κάθε φορά που συνδέεστε στον Λογαριασμό σας Google.</translation> -<translation id="7444046173054089907">Αυτός ο ιστότοπος είναι αποκλεισμένος</translation> <translation id="7444983668544353857">Απενεργοποίηση <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Αυτόματη εγκατάσταση εφαρμογών</translation> <translation id="7450761244949417357">Άνοιγμα σε <ph name="ALTERNATIVE_BROWSER_NAME" /> τώρα</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 677d2be..318c8f7 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Oops! The system failed to fetch policy for your device.</translation> <translation id="347785443197175480">Continue allowing <ph name="HOST" /> to access your camera and microphone</translation> <translation id="3478685642445675458">Please unlock your profile before removing a person.</translation> -<translation id="3479539252931486093">Was this unexpected? <ph name="BEGIN_LINK" />Let us know<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Not now</translation> <translation id="3481268647794498892">Opening in <ph name="ALTERNATIVE_BROWSER_NAME" /> in <ph name="COUNTDOWN_SECONDS" /> seconds</translation> <translation id="3484273680291419129">Removing harmful software...</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Your Hangouts Meet hardware is ready to be set up.</translation> <translation id="744341768939279100">Create a new profile</translation> <translation id="7443806024147773267">Access your passwords whenever you're signed in to your Google account</translation> -<translation id="7444046173054089907">This site is blocked</translation> <translation id="7444983668544353857">Disable <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automatically install apps</translation> <translation id="7450761244949417357">Opening in <ph name="ALTERNATIVE_BROWSER_NAME" /> now</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 13bb710ba..41cd45a 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Esta página no responde</translation> <translation id="1041263367839475438">Dispositivos disponibles</translation> <translation id="1042174272890264476">Tu computadora también tiene la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" /> incorporada. RLZ asigna una etiqueta identificable, no exclusiva y no personal para medir las búsquedas y el uso de <ph name="SHORT_PRODUCT_NAME" /> impulsados por una determinada campaña de promoción. Estas etiquetas aparecen a veces en las consultas de la Búsqueda de Google en <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">¿También quieres borrar los datos de estas apps?</translation> <translation id="1045692658517323508">{0,plural, =1{Actualiza el dispositivo en el transcurso de 1 minuto}other{Actualiza el dispositivo en el transcurso de # minutos}}</translation> <translation id="1046635659603195359">Al parecer, ya configuraste Voice Match con tu Asistente de Google en otro dispositivo. Las grabaciones anteriores pueden usarse para crear un modelo de voz en este dispositivo. El proceso debería tomar menos de un minuto.</translation> <translation id="1047431265488717055">Copiar texto del vínculo</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Obtén las mejores funciones de Google en Chrome</translation> <translation id="1147991416141538220">Para solicitar el acceso, comunícate con el administrador de este dispositivo.</translation> <translation id="1149401351239820326">Mes de vencimiento</translation> +<translation id="1150490752229770117">Esta es la última actualización automática de software y seguridad para el dispositivo <ph name="DEVICE_TYPE" />. Si quieres recibir futuras actualizaciones, obtén un modelo más nuevo. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Gafas de sol</translation> <translation id="1151917987301063366">Siempre permitir que <ph name="HOST" /> acceda a los sensores</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Elige un ticket para usar en la autenticación. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Recibir esta contraseña en tu iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> desea almacenar de forma permanente los datos en tu computadora local</translation> +<translation id="1714644264617423774">Permite habilitar las funciones de accesibilidad para que tu dispositivo sea más fácil de usar. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensores de movimiento</translation> +<translation id="171824261579749339">Australiano <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1719312230114180055">Nota: La huella digital puede ser menos segura que un PIN o una contraseña eficaz.</translation> <translation id="1720318856472900922">Autenticación de servidor TLS WWW</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Borrar cookies de terceros</translation> <translation id="2097372108957554726">Debes acceder a Chrome para registrar nuevos dispositivos.</translation> <translation id="2099172618127234427">Estás habilitando las funciones de depuración del Sistema operativo Chrome que configurarán el daemon sshd y habilitarán el inicio desde unidades USB.</translation> +<translation id="2099625543891475722">tus rasgos físicos, como la estatura</translation> <translation id="2099686503067610784">¿Eliminar certificado "<ph name="CERTIFICATE_NAME" />" del servidor?</translation> <translation id="2100273922101894616">Acceso automático</translation> <translation id="2101225219012730419">Versión:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Crear un perfil nuevo</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> quiere verificar tu identidad</translation> <translation id="2448312741937722512">Tipo</translation> +<translation id="2448734521821581858">Las cookies son archivos que crean los sitios web que visitas. Existen dos tipos de cookies. Las propias son aquellas que crea el sitio que visitas (que se muestra en la barra de direcciones). Las cookies de terceros son las que se generan desde otros sitios, a los cuales pertenece parte del contenido que ves en el sitio web que visitas (como anuncios o imágenes).</translation> <translation id="2450223707519584812">No podrás agregar usuarios porque faltan las claves de la API de Google. Consulta <ph name="DETAILS_URL" /> para obtener más detalles.</translation> <translation id="2450849356604136918">No hay vistas activas</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Se agotó el tiempo de espera</translation> <translation id="2588636910004461974">Dispositivos del proveedor <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Buscar en Google o escribir una URL</translation> +<translation id="2600522410036850735">Este dispositivo recibirá actualizaciones automáticas de software y seguridad hasta <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Más información</a></translation> <translation id="2603115962224169880">Limpiar la computadora</translation> <translation id="2603463522847370204">Abrir en una ventana de &incógnito</translation> <translation id="2604255671529671813">Error de conexión de red</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">Navegación segura (te protege a ti y tu dispositivo de sitios peligrosos)</translation> <translation id="3182749001423093222">Corrector ortográfico</translation> <translation id="3183139917765991655">Importador de perfiles</translation> +<translation id="3184536091884214176">Configura o administra impresoras CUPS. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mis archivos</translation> <translation id="3188465121994729530">Promedio móvil</translation> <translation id="3190558889382726167">Se guardó la contraseña</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">El sistema no pudo recuperar la política para tu dispositivo.</translation> <translation id="347785443197175480">Continuar permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation> <translation id="3478685642445675458">Desbloquea tu perfil antes de quitar a una persona.</translation> -<translation id="3479539252931486093">¿Ocurrió algo inesperado? <ph name="BEGIN_LINK" />Cuéntanos<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ahora no</translation> <translation id="3481268647794498892">Se abrirá en <ph name="ALTERNATIVE_BROWSER_NAME" /> en <ph name="COUNTDOWN_SECONDS" /> segundos</translation> <translation id="3484273680291419129">Quitando software dañino…</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">Mostrar nombres de usuarios y fotos en la pantalla de inicio</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: Dispositivo de HID conectado</translation> <translation id="4142052906269098341">Desbloquea tu <ph name="DEVICE_TYPE" /> con el teléfono. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Guarda las impresoras detectadas en tu perfil o agrega una nueva. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Obtén videos de mejor calidad y extiende la duración de la batería. El video solo se reproducirá en tu pantalla compatible con Cast.</translation> <translation id="4146026355784316281">Abrir siempre con el visualizador del sistema</translation> <translation id="4146785383423576110">Restablecer y limpiar</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">Melón</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> comparte una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> +<translation id="436499142539576997">No se pudieron obtener los datos de la app. De todos modos, se sigue intentando ejecutar la app…</translation> <translation id="4370975561335139969">El correo electrónico y la contraseña que ingresaste no coinciden.</translation> <translation id="437184764829821926">Configuración de fuentes avanzadas</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">Solo se admiten los protocolos http, https y de archivo para las redirecciones a navegadores.</translation> <translation id="4659077111144409915">Cuenta principal</translation> <translation id="4660476621274971848">Se esperaba la versión "<ph name="EXPECTED_VERSION" />", pero la versión fue "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">la disposición de tu habitación</translation> <translation id="4662788913887017617">Compartir este favorito con tu iPhone</translation> <translation id="4663373278480897665">Cámara permitida</translation> <translation id="4664482161435122549">Error en la exportación de PKCS #12</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">Tu página de inicio se cambió a <ph name="URL" />.</translation> <translation id="4902546322522096650">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />%, conectar</translation> <translation id="49027928311173603">La política descargada del servidor no es válida: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Configura o administra archivos compartidos de red. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Este archivo no se descarga con frecuencia y podría ser peligroso.</translation> <translation id="4907306957610201395">Categoría de permiso</translation> <translation id="4908811072292128752">Abre una pestaña nueva para navegar en dos sitios al mismo tiempo</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">Habilitando...</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5042282098504489593">Abrir la configuración para conectar <ph name="USB_DEVICE_NAME" /> a Linux</translation> +<translation id="5043913660911154449">O especifica el PPD de tu impresora. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Contraseña incorrecta</translation> <translation id="504561833207953641">Abriendo en una sesión existente del navegador</translation> <translation id="5047421709274785093">Bloquear el uso de los sensores de luz y movimiento en los sitios</translation> @@ -3103,6 +3115,7 @@ <translation id="5464660706533281090">Un niño no puede cambiar esta configuración.</translation> <translation id="5466374726908360271">&Pegar y buscar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Buscando archivos compartidos</translation> +<translation id="5470735824776589490">Es necesario que reinicies tu dispositivo para poder restablecerlo con Powerwash. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hola, soy la voz que leerá tus textos.</translation> <translation id="5472133193607270166">Si se activa esta opción, los sitios web no podrán usar tu actividad de navegación en diferentes sitios para personalizar anuncios. Es posible que algunos sitios no funcionen correctamente.</translation> <translation id="5473333559083690127">Vuelve a ingresar el PIN nuevo</translation> @@ -3126,6 +3139,7 @@ <translation id="5496587651328244253">Organizar</translation> <translation id="5499313591153584299">Este archivo puede dañar el equipo.</translation> <translation id="5502500733115278303">Importado desde Firefox</translation> +<translation id="5505264765875738116">Los sitios no podrán preguntarte si quieres recibir notificaciones</translation> <translation id="5505307013568720083">Se agotó la tinta</translation> <translation id="5507756662695126555">No rechazo</translation> <translation id="5509693895992845810">Gu&ardar como...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">Preferencias</translation> <translation id="5804175651771201311">Roaming inhabilitado</translation> <translation id="5804241973901381774">Permisos</translation> +<translation id="5804427196348435412">Usar dispositivos con NFC</translation> <translation id="5805697420284793859">Administrador de ventanas</translation> <translation id="5806773519584576205">0° (predeterminado)</translation> <translation id="5811750797187914944">Listo</translation> @@ -3555,6 +3570,7 @@ <translation id="6096047740730590436">Abrir de forma maximizada</translation> <translation id="6096326118418049043">Nombre X 500</translation> <translation id="6097480669505687979">Si no liberas espacio, es posible que se quiten usuarios y datos de forma automática.</translation> +<translation id="6097600385983390082">Se cerró la búsqueda por voz</translation> <translation id="6098793583803863900">Se está analizando un archivo desconocido para determinar si incluye contenido peligroso.</translation> <translation id="6100736666660498114">Menú Inicio</translation> <translation id="6101226222197207147">Se agregó una aplicación nueva (<ph name="EXTENSION_NAME" />).</translation> @@ -3650,6 +3666,7 @@ <translation id="6233154960150021497">Usar de forma predeterminada la voz en lugar del teclado</translation> <translation id="6234474535228214774">Instalación pendiente</translation> <translation id="6237816943013845465">Permite ajustar la resolución de pantalla</translation> +<translation id="6238624845858322552">Establece conexión con el dispositivo Bluetooth</translation> <translation id="6238767809035845642">Texto compartido desde otro dispositivo</translation> <translation id="6238923052227198598">Mantener la nota más reciente en la pantalla bloqueada</translation> <translation id="6239558157302047471">Volver a cargar &marco</translation> @@ -3676,6 +3693,7 @@ <translation id="6267547857941397424">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />%, nivel de la batería del teléfono: <ph name="BATTERY_STATUS" />%, conectar</translation> <translation id="6268252012308737255">Abrir con <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Los sitios podrán preguntarte si quieres recibir notificaciones</translation> <translation id="6270770586500173387">Enviar <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /> e <ph name="BEGIN_LINK1" />información de apps y el sistema<ph name="END_LINK1" /></translation> <translation id="6272643420381259437">Se produjo un error (<ph name="ERROR" />) al descargar el complemento</translation> <translation id="6273677812470008672">Calidad</translation> @@ -3697,6 +3715,7 @@ <translation id="629730747756840877">Cuenta</translation> <translation id="6298962879096096191">Usar Google Play para instalar apps de Android</translation> <translation id="630065524203833229">&Salir</translation> +<translation id="6300718114348072351">No se pudo configurar <ph name="PRINTER_NAME" /> automáticamente. Especifica los detalles avanzados de la impresora. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Política global:</translation> <translation id="6307990684951724544">Sistema ocupado</translation> <translation id="6308493641021088955">Acceso proporcionado por <ph name="EXTENSION_NAME" /></translation> @@ -3866,6 +3885,7 @@ <translation id="6555810572223193255">La limpieza no está disponible en este momento</translation> <translation id="6556866813142980365">Rehacer</translation> <translation id="6557290421156335491">Mis accesos directos</translation> +<translation id="6561560012278703671">Usar un tipo de aviso más discreto (bloquear las notificaciones emergentes para evitar interrupciones)</translation> <translation id="6561726789132298588">ingresar</translation> <translation id="656293578423618167">La ruta de acceso o el nombre del archivo es demasiado largo. Guarda con un nombre más corto o en otra ubicación.</translation> <translation id="6563469144985748109">Tu administrador aún no lo aprobó</translation> @@ -4049,6 +4069,7 @@ <translation id="6840155290835956714">Preguntar antes de enviar</translation> <translation id="6840184929775541289">No es una Entidad de certificación</translation> <translation id="6841186874966388268">Errores</translation> +<translation id="6843267103192918276">Accede a tu cuenta para ver los favoritos, el historial, las contraseñas y otras opciones de configuración en todos los dispositivos. Además, accederás de forma automática a los servicios de Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google ya está configurado</translation> <translation id="6845038076637626672">Abrir de forma maximizada</translation> <translation id="6845325883481699275">Ayudar a mejorar la seguridad de Chrome</translation> @@ -4465,7 +4486,6 @@ <translation id="7442465037756169001">El hardware de Hangouts Meet ya está listo para su configuración.</translation> <translation id="744341768939279100">Crear un perfil nuevo</translation> <translation id="7443806024147773267">Cuando accedas a tu Cuenta de Google, podrás consultar tus contraseñas en cualquier momento</translation> -<translation id="7444046173054089907">Este sitio está bloqueado</translation> <translation id="7444983668544353857">Inhabilitar <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instala apps automáticamente</translation> <translation id="7450761244949417357">Se está abriendo en <ph name="ALTERNATIVE_BROWSER_NAME" /> en este momento</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">Eliminar a esta persona</translation> <translation id="8215295261562449873">Antes de actualizar Linux, crea una copia de seguridad de mis apps y archivos en la carpeta Descargas.</translation> <translation id="8217399928341212914">Seguir bloqueando las descargas automáticas de varios archivos</translation> +<translation id="8218847192766059983">Agrega idiomas o cambia el orden de la lista. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Por lo general, bloqueas las notificaciones. Si quieres permitir que este sitio las muestre, haz clic aquí.</translation> <translation id="8225265270453771718">Compartir la ventana de una aplicación</translation> <translation id="8225753906568652947">Canjear tus ofertas</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">Editar</translation> <translation id="9066773882585798925">Escucha el texto leído en voz alta</translation> <translation id="9066782832737749352">Texto a voz</translation> +<translation id="9067559831321817373">Administra las cuentas en las que accediste. En función de los permisos, es posible que los sitios web, las apps y las extensiones en Chrome y Google Play usen estas cuentas para personalizar tu experiencia. <a>Más información</a></translation> <translation id="9068849894565669697">Seleccionar color</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index a4f8e77..c42e3ac 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">La página no responde</translation> <translation id="1041263367839475438">Dispositivos disponibles</translation> <translation id="1042174272890264476">El ordenador también incluye la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" />. RLZ asigna una etiqueta identificable, no exclusiva y no personal para medir las búsquedas y el uso de <ph name="SHORT_PRODUCT_NAME" /> derivados de una determinada campaña promocional. Estas etiquetas aparecen a veces en las consultas de la Búsqueda de Google realizadas en <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">¿Quieres borrar también los datos de estas aplicaciones?</translation> <translation id="1045692658517323508">{0,plural, =1{Actualizar en el transcurso de 1 minuto}other{Actualizar en el transcurso de # minutos}}</translation> <translation id="1046635659603195359">Parece que ya has configurado Voice Match con el Asistente de Google en otro dispositivo. Esas grabaciones anteriores pueden servir para crear un modelo de voz en este dispositivo. No debería llevar más de un minuto.</translation> <translation id="1047431265488717055">Copiar te&xto de enlace</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Obtén funciones inteligentes en Chrome</translation> <translation id="1147991416141538220">Para solicitar acceso, ponte en contacto con el administrador de este dispositivo.</translation> <translation id="1149401351239820326">Mes de caducidad</translation> +<translation id="1150490752229770117">Esta es la última actualización automática de software y seguridad que recibirá este <ph name="DEVICE_TYPE" />. Para recibir las actualizaciones posteriores, cambia este modelo por otro más reciente. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Gafas de sol</translation> <translation id="1151917987301063366">Permitir siempre que <ph name="HOST" /> acceda a los sensores</translation> <translation id="1153356358378277386">Dispositivos vinculados</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Selecciona el ticket que vas a usar para autenticarte. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Recibe esta contraseña en tu iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> quiere almacenar datos de forma permanente en tu ordenador local</translation> +<translation id="1714644264617423774">Permite habilitar las funciones de accesibilidad para facilitar el uso de tu dispositivo. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensores de movimiento</translation> +<translation id="171824261579749339">Australiano <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1719312230114180055">Nota: Tu huella digital puede ser menos segura que una buena contraseña o un buen PIN.</translation> <translation id="1720318856472900922">Autenticación de servidor WWW TLS</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Borrar cookies de terceros</translation> <translation id="2097372108957554726">Debes iniciar sesión en Chrome para registrar nuevos dispositivos</translation> <translation id="2099172618127234427">Vas a habilitar las funciones de depuración de Chrome OS, que configurarán el daemon sshd y habilitará el arranque desde unidades USB.</translation> +<translation id="2099625543891475722">tus rasgos físicos, como tu altura</translation> <translation id="2099686503067610784">¿Quieres eliminar el certificado de servidor "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Iniciar sesión automáticamente</translation> <translation id="2101225219012730419">Versión:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Crear perfil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> quiere verificar tu identidad</translation> <translation id="2448312741937722512">Tipo</translation> +<translation id="2448734521821581858">Las cookies son archivos que crean los sitios web que visitas. Existen dos tipos de cookies: las cookies propias las crea el sitio web al que accedes. El sitio web se muestra en la barra de direcciones. Las cookies de terceros las crean otros sitios web. Estos sitios poseen parte del contenido que ves en el sitio web que visitas, como anuncios o imágenes.</translation> <translation id="2450223707519584812">No podrás añadir usuarios porque faltan las claves de la API de Google. Consulta <ph name="DETAILS_URL" /> para obtener más información.</translation> <translation id="2450849356604136918">No hay vistas activas</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Tiempo de espera agotado</translation> <translation id="2588636910004461974">Dispositivos de <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Busca en Google o escribe una URL</translation> +<translation id="2600522410036850735">Este dispositivo recibirá actualizaciones de software y seguridad automáticas hasta <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Más información</a></translation> <translation id="2603115962224169880">Limpiar ordenador</translation> <translation id="2603463522847370204">Abrir en una ventana de &incógnito</translation> <translation id="2604255671529671813">No se ha podido establecer conexión con la red</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Navegación Segura (te protege a ti y a tu dispositivo frente a sitios web peligrosos)</translation> <translation id="3182749001423093222">Revisión ortográfica</translation> <translation id="3183139917765991655">Importador de perfiles</translation> +<translation id="3184536091884214176">Configurar o gestionar impresoras CUPS <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mis archivos</translation> <translation id="3188465121994729530">Media móvil</translation> <translation id="3190558889382726167">Contraseña guardada</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">¡Vaya! El sistema no ha podido recuperar la política para tu dispositivo.</translation> <translation id="347785443197175480">Seguir permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation> <translation id="3478685642445675458">Desbloquea tu perfil antes de eliminar a un usuario.</translation> -<translation id="3479539252931486093">¿No te lo esperabas? <ph name="BEGIN_LINK" />Notifícanoslo<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ahora no</translation> <translation id="3481268647794498892">Se abrirá en <ph name="ALTERNATIVE_BROWSER_NAME" /> dentro de <ph name="COUNTDOWN_SECONDS" /> segundos</translation> <translation id="3484273680291419129">Eliminando software dañino...</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">Mostrar nombres de usuario y fotos en la pantalla de inicio de sesión</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: dispositivo HID conectado</translation> <translation id="4142052906269098341">Desbloquea el <ph name="DEVICE_TYPE" /> con tu teléfono. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Guarda las impresoras detectadas en tu perfil o añade una nueva. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Disfruta de una mejor calidad de vídeo y ahorra batería. El vídeo se reproducirá solo en tu pantalla compatible con Google Cast.</translation> <translation id="4146026355784316281">Abrir siempre con el visor del sistema</translation> <translation id="4146785383423576110">Recuperar ajustes y borrar</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">Melón</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartiendo una ventana.</translation> <translation id="4364830672918311045">Mostrar notificaciones</translation> +<translation id="436499142539576997">No se han podido obtener datos de aplicaciones, pero seguimos intentando ejecutar la aplicación…</translation> <translation id="4370975561335139969">La dirección de correo electrónico y la contraseña que has introducido no coinciden</translation> <translation id="437184764829821926">Configuración de fuentes avanzada</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">Las redirecciones de navegador solo son compatibles con los protocolos HTTP, HTTPS y de archivo.</translation> <translation id="4659077111144409915">Cuenta principal</translation> <translation id="4660476621274971848">Se esperaba la versión "<ph name="EXPECTED_VERSION" />", pero se ha detectado la versión "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">la distribución de tu habitación</translation> <translation id="4662788913887017617">Compartir este marcador con tu iPhone</translation> <translation id="4663373278480897665">Cámara permitida</translation> <translation id="4664482161435122549">Error de exportación de archivos PKCS #12</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">Tu página de inicio ha cambiado a <ph name="URL" />.</translation> <translation id="4902546322522096650">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" /> %, conectar</translation> <translation id="49027928311173603">La política que has descargado del servidor no es válida (<ph name="VALIDATION_ERROR" />).</translation> +<translation id="4906490889887219338">Configurar o gestionar sistemas de archivos compartidos de red. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Este archivo no se descarga habitualmente y puede ser peligroso.</translation> <translation id="4907306957610201395">Categoría de permisos</translation> <translation id="4908811072292128752">Abre una pestaña nueva para navegar por dos sitios web a la vez</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">Habilitando...</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5042282098504489593">Abrir Ajustes para conectar <ph name="USB_DEVICE_NAME" /> a Linux</translation> +<translation id="5043913660911154449">O especifica el archivo PPD de tu impresora <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Contraseña incorrecta</translation> <translation id="504561833207953641">Se está abriendo en una sesión de navegador existente.</translation> <translation id="5047421709274785093">Evitar que los sitios web usen los sensores de luz y movimiento</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">Los usuarios menores de edad no pueden cambiar este ajuste.</translation> <translation id="5466374726908360271">Pe&gar y buscar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Buscando sistemas de archivos compartidos</translation> +<translation id="5470735824776589490">Es necesario reiniciar el dispositivo antes de poder restablecerlo con Powerwash. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5471768120198416576">¡Hola! Soy tu voz de la síntesis de voz.</translation> <translation id="5472133193607270166">Si activas esta opción, los sitios web no podrán utilizar tu actividad de navegación en otros sitios web para personalizar anuncios. Es posible que algunos sitios no funcionen correctamente.</translation> <translation id="5473333559083690127">Volver a introducir el nuevo PIN</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">Organizar</translation> <translation id="5499313591153584299">Este archivo puede ser dañino para tu ordenador.</translation> <translation id="5502500733115278303">Importado desde Firefox</translation> +<translation id="5505264765875738116">Los sitios web no pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="5505307013568720083">No hay tinta</translation> <translation id="5507756662695126555">Sin rechazo</translation> <translation id="5509693895992845810">Guardar &como...</translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">Preferencias</translation> <translation id="5804175651771201311">Itinerancia desactivada</translation> <translation id="5804241973901381774">Permisos</translation> +<translation id="5804427196348435412">Usar dispositivos NFC</translation> <translation id="5805697420284793859">Administrador de ventanas</translation> <translation id="5806773519584576205">0° (Predeterminado)</translation> <translation id="5811750797187914944">Todo listo</translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">Abrir de forma maximizada</translation> <translation id="6096326118418049043">Nombre X.500</translation> <translation id="6097480669505687979">Si no liberas espacio, es posible que se eliminen automáticamente usuarios y datos.</translation> +<translation id="6097600385983390082">La búsqueda por voz está cerrada</translation> <translation id="6098793583803863900">Se está analizando un archivo desconocido en busca de contenido peligroso.</translation> <translation id="6100736666660498114">Menú Inicio</translation> <translation id="6101226222197207147">Nueva aplicación añadida (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">Usar la voz en lugar del teclado de forma predeterminada</translation> <translation id="6234474535228214774">Instalación pendiente</translation> <translation id="6237816943013845465">Te permite ajustar la resolución de pantalla</translation> +<translation id="6238624845858322552">Conectar con un dispositivo Bluetooth</translation> <translation id="6238767809035845642">Texto compartido desde otro dispositivo</translation> <translation id="6238923052227198598">Mantener la última nota en la pantalla de bloqueo</translation> <translation id="6239558157302047471">Volver a cargar &marco</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" /> %, batería del teléfono: <ph name="BATTERY_STATUS" /> %, conectar</translation> <translation id="6268252012308737255">Abrir con <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Los sitios web pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="6270770586500173387">Enviar <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /> e <ph name="BEGIN_LINK1" />información de aplicaciones y del sistema<ph name="END_LINK1" /></translation> <translation id="6272643420381259437">Se ha producido un error (<ph name="ERROR" />) al descargar el complemento</translation> <translation id="6273677812470008672">Calidad</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">Cuenta</translation> <translation id="6298962879096096191">Usa Google Play para descargar aplicaciones de Android</translation> <translation id="630065524203833229">&Salir</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> no se ha podido configurar automáticamente. Debes especificar información detallada de la impresora. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Política global:</translation> <translation id="6307990684951724544">Sistema ocupado</translation> <translation id="6308493641021088955">Inicio de sesión proporcionado por <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">No se puede eliminar en este momento</translation> <translation id="6556866813142980365">Rehacer</translation> <translation id="6557290421156335491">Mis accesos directos</translation> +<translation id="6561560012278703671">Usa un tipo de aviso más discreto (bloquea las notificaciones emergentes para evitar interrupciones)</translation> <translation id="6561726789132298588">intro</translation> <translation id="656293578423618167">La ruta o el nombre del archivo es demasiado largo. Especifica un nombre más corto o guarda el archivo en otra ubicación.</translation> <translation id="6563469144985748109">Tu administrador aún no la ha aprobado</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">Preguntar antes de enviar</translation> <translation id="6840184929775541289">No es una entidad emisora de certificados.</translation> <translation id="6841186874966388268">Errores</translation> +<translation id="6843267103192918276">Inicia sesión para acceder a los marcadores, el historial, las contraseñas y los ajustes en todos tus dispositivos. También iniciarás sesión de forma automática en tus servicios de Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google ya se ha configurado</translation> <translation id="6845038076637626672">Abrir de forma maximizada</translation> <translation id="6845325883481699275">Ayudar a mejorar la seguridad de Chrome</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">Ya puedes configurar el hardware de Hangouts Meet.</translation> <translation id="744341768939279100">Crear un nuevo perfil</translation> <translation id="7443806024147773267">Accede cuando quieras a tus contraseñas con tu cuenta de Google</translation> -<translation id="7444046173054089907">Este sitio web se ha bloqueado</translation> <translation id="7444983668544353857">Inhabilitar <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalar aplicaciones automáticamente</translation> <translation id="7450761244949417357">Abriendo en <ph name="ALTERNATIVE_BROWSER_NAME" /> ahora</translation> @@ -5032,6 +5052,7 @@ <translation id="8214962590150211830">Eliminar este perfil</translation> <translation id="8215295261562449873">Crear una copia de seguridad de las aplicaciones y archivos en la carpeta Descargas antes de actualizar Linux.</translation> <translation id="8217399928341212914">Seguir bloqueando descargas automáticas de varios archivos</translation> +<translation id="8218847192766059983">Añade o reordena idiomas. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Normalmente bloqueas todas las notificaciones. Si quieres permitir que este sitio web te muestre notificaciones, haz clic aquí.</translation> <translation id="8225265270453771718">Compartir una ventana de aplicación</translation> <translation id="8225753906568652947">Canjear tus ofertas</translation> @@ -5645,6 +5666,7 @@ <translation id="9065203028668620118">Editar</translation> <translation id="9066773882585798925">Escuchar el texto leído en voz alta</translation> <translation id="9066782832737749352">Síntesis de voz</translation> +<translation id="9067559831321817373">Gestiona las cuentas con las que hayas iniciado sesión. Los sitios web, las aplicaciones y las extensiones de Chrome y Google Play pueden usar estas cuentas para personalizar tu experiencia si has concedido los permisos correspondientes. <a>Más información</a></translation> <translation id="9068849894565669697">Seleccionar color</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 97d8666aa..cbd8067 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Leht ei reageeri</translation> <translation id="1041263367839475438">Saadaolevad seadmed</translation> <translation id="1042174272890264476">Teie arvutil on ka toote <ph name="SHORT_PRODUCT_NAME" /> sisseehitatud RLZ-teek. RLZ määrab korduva ja isikut mittetuvastava ID-tunnuse, et mõõta konkreetse reklaamikampaania tekitatud otsinguid ja toote <ph name="SHORT_PRODUCT_NAME" /> kasutust. Need sildid kuvatakse vahel ka tootes <ph name="PRODUCT_NAME" /> Google'i otsingupäringutes.</translation> +<translation id="1043818413152647937">Kas kustutada andmed ka nendest rakendustest?</translation> <translation id="1045692658517323508">{0,plural, =1{Uuendage 1 minuti jooksul}other{Uuendage # minuti jooksul}}</translation> <translation id="1046635659603195359">Näib, et olete Voice Matchi oma Google'i assistendiga juba mõnes teises seadmes seadistanud. Neid varasemaid salvestisi saab kasutada häälemudeli loomiseks selles seadmes. See peaks võtma alla minuti.</translation> <translation id="1047431265488717055">Kopeeri lingi te&kst</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google'i nutikus Chrome'is</translation> <translation id="1147991416141538220">Juurdepääsu palumiseks võtke ühendust selle seadme administraatoriga.</translation> <translation id="1149401351239820326">Aegumiskuu</translation> +<translation id="1150490752229770117">See on seadme <ph name="DEVICE_TYPE" /> viimane automaatne tarkvara- ja turbevärskendus. Tulevaste värskenduste hankimiseks võtke kasutusele uuem mudel. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Päikeseprillid</translation> <translation id="1151917987301063366">Luba saidi <ph name="HOST" /> jaoks alati juurdepääs anduritele</translation> <translation id="1153356358378277386">Seotud seadmed</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Valige pilet, mida autentimiseks kasutada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Saatke see parool oma iPhone'i</translation> <translation id="1712552549805331520"><ph name="URL" /> soovib andmed alaliselt teie kohalikku arvutisse salvestada</translation> +<translation id="1714644264617423774">Lubage juurdepääsufunktsioonid, et seadet oleks lihtsam kasutada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Liikumisandurid</translation> +<translation id="171824261579749339">Austraalia <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Viimase tunni jooksul</translation> <translation id="1719312230114180055">Märkus. Sõrmejälg võib olla vähem turvaline kui tugev parool või PIN-kood.</translation> <translation id="1720318856472900922">TLS WWW serveri autentimine</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Kustuta kolmanda osapoole küpsisefailid</translation> <translation id="2097372108957554726">Uute seadmete registreerimiseks peate Chrome'i sisse logima</translation> <translation id="2099172618127234427">Soovite lubada Chrome OS-i silumisfunktsioonid, mis seadistavad üksuse sshd daemon ja lubavad käivitamise USB-kettalt.</translation> +<translation id="2099625543891475722">teie füüsilised omadused, nt pikkus</translation> <translation id="2099686503067610784">Kustutada serveri sertifikaat „<ph name="CERTIFICATE_NAME" />”</translation> <translation id="2100273922101894616">Automaatne sisselogimine</translation> <translation id="2101225219012730419">Versioon:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Loo uus profiil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> soovib teie identiteedi kinnitada</translation> <translation id="2448312741937722512">Tüüp</translation> +<translation id="2448734521821581858">Küpsisefailid on failid, mille on loonud teie külastatud veebisaidid. Küpsisefaile on kahte tüüpi: esimese osapoole küpsisefailid loob sait, mida külastate. Saidi aadress kuvatakse aadressiribal. Kolmanda osapoole küpsisefailid loovad teised saidid. Need saidid omavad külastatud veebisaidil kuvatud sisu, nt reklaame või pilte.</translation> <translation id="2450223707519584812">Te ei saa kasutajaid lisada, kuna Google API võtmed puuduvad. Üksikasju vt <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Aktiivsed kuvad puuduvad</translation> <translation id="2451298179137331965">2-kordne</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Ajalõpp</translation> <translation id="2588636910004461974">Seadmed teenusepakkujalt <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Otsige Google'ist või sisestage URL</translation> +<translation id="2600522410036850735">See seade saab automaatseid tarkvara- ja turvavärskendusi kuni ajani <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Lisateave</a></translation> <translation id="2603115962224169880">Puhasta arvuti</translation> <translation id="2603463522847370204">Ava &inkognito aknas</translation> <translation id="2604255671529671813">Võrguühenduse viga</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Ohutu sirvimine (kaitseb teid ja teie seadet ohtlike saitide eest)</translation> <translation id="3182749001423093222">Õigekirjakontroll</translation> <translation id="3183139917765991655">Profiili importija</translation> +<translation id="3184536091884214176">CUPS-printerite seadistamine või haldamine. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Minu failid</translation> <translation id="3188465121994729530">Liikuv keskmine</translation> <translation id="3190558889382726167">Parool salvestati</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Vabandust! Süsteemil ei õnnestunud teie seadme jaoks eeskirju tuua.</translation> <translation id="347785443197175480">Luba hostile <ph name="HOST" /> jätkuvalt juurdepääs kaamerale ja mikrofonile</translation> <translation id="3478685642445675458">Enne inimese eemaldamist avage oma profiil.</translation> -<translation id="3479539252931486093">Kas see oli ootamatu? <ph name="BEGIN_LINK" />Andke meile sellest teada<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Mitte praegu</translation> <translation id="3481268647794498892">Brauser <ph name="ALTERNATIVE_BROWSER_NAME" /> avatakse <ph name="COUNTDOWN_SECONDS" /> sekundi pärast</translation> <translation id="3484273680291419129">Kahjuliku tarkvara eemaldamine …</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Kuva sisselogimisekraanil kasutajanimed ja fotod</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-seade on ühendatud</translation> <translation id="4142052906269098341">Avage seade <ph name="DEVICE_TYPE" /> oma telefoniga. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Salvestage tuvastatud printerid oma profiilile või lisage uus printer. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Vaadake parema kvaliteediga videoid ja säästke aku tööiga. Videot esitatakse ainult Casti toega ekraanikuval.</translation> <translation id="4146026355784316281">Ava alati süsteemivaaturiga</translation> <translation id="4146785383423576110">Lähtestamine ja puhastamine</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491">Rakendus <ph name="APP_NAME" /> jagab akent.</translation> <translation id="4364830672918311045">Kuva märguanded</translation> +<translation id="436499142539576997">Rakenduse andmete hankimine ebaõnnestus, rakendust üritatakse siiski käitada …</translation> <translation id="4370975561335139969">Sisestatud e-posti aadress ja parool ei ühildu</translation> <translation id="437184764829821926">Täiustatud fondiseaded</translation> <translation id="4374831787438678295">Linuxi installiprogramm</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Brauseri ümbersuunamiste puhul toetatakse ainult HTTP-d, HTTPS-i ja failiprotokolle.</translation> <translation id="4659077111144409915">Peamine konto</translation> <translation id="4660476621274971848">Eeldatav versioon oli „<ph name="EXPECTED_VERSION" />”, kuid versioon oli „<ph name="NEW_ID" />”</translation> +<translation id="4660838440047236328">teie ruumi paigutus</translation> <translation id="4662788913887017617">Jagage seda järjehoidjat oma iPhone'iga</translation> <translation id="4663373278480897665">Kaamera on lubatud</translation> <translation id="4664482161435122549">PKCS #12 ekspordi viga</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Käivitamisel avatavaks leheks määrati <ph name="URL" />.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />. võrk <ph name="NETWORK_COUNT" />-st, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, signaalitugevus: <ph name="SIGNAL_STRENGTH" />, ühenda</translation> <translation id="49027928311173603">Serverist alla laaditud reegel on kehtetu: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Seadistage või hallake failide võrguhoidlaid. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Seda faili ei laadita tavaliselt alla ja see võib olla ohtlik.</translation> <translation id="4907306957610201395">Loa kategooria</translation> <translation id="4908811072292128752">Avage uus vaheleht, et kahte saiti korraga sirvida</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Lubamine ...</translation> <translation id="5039804452771397117">Luba</translation> <translation id="5042282098504489593">Seadme <ph name="USB_DEVICE_NAME" /> Linuxiga ühendamiseks avage menüü Seaded</translation> +<translation id="5043913660911154449">Või määrake printeri PPD <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Vale salasõna</translation> <translation id="504561833207953641">Olemasolevas brauseriseansis avamine.</translation> <translation id="5047421709274785093">Blokeeri saitide jaoks liikumis- ja valgusandurite kasutamine</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Seda seadet ei saa lapskasutaja muuta.</translation> <translation id="5466374726908360271">Kleebi ja otsi üksust „<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Jagatud failide otsimine</translation> +<translation id="5470735824776589490">Seade tuleb taaskäivitada, enne kui saate selle Powerwashiga lähtestada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Tere! Mina olen teie kõnesünteesi hääl.</translation> <translation id="5472133193607270166">Kui on sisse lülitatud, ei saa saidid reklaamide isikupärastamiseks eri saitidel teie sirvimistegevust kasutada. Mõned saidid ei pruugi korralikult töötada.</translation> <translation id="5473333559083690127">Sisestage uus PIN-kood uuesti</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Korraldamine</translation> <translation id="5499313591153584299">See fail võib teie arvuti jaoks ohtlik olla.</translation> <translation id="5502500733115278303">Imporditud Firefoxist</translation> +<translation id="5505264765875738116">Saidid ei saa küsida luba märguannete saatmiseks</translation> <translation id="5505307013568720083">Tint on otsas</translation> <translation id="5507756662695126555">Tagasivõetamatus</translation> <translation id="5509693895992845810">Salvesta &nimega...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Eelistused</translation> <translation id="5804175651771201311">Rändlus välja</translation> <translation id="5804241973901381774">Load</translation> +<translation id="5804427196348435412">NFC-seadmete kasutamine</translation> <translation id="5805697420284793859">Aknahaldur</translation> <translation id="5806773519584576205">0° (vaikeseade)</translation> <translation id="5811750797187914944">Valmis</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Ava maksimeeritult</translation> <translation id="6096326118418049043">X.500 nimi</translation> <translation id="6097480669505687979">Kui te kettaruumi ei vabasta, võidakse kasutajad ja andmed automaatselt eemaldada.</translation> +<translation id="6097600385983390082">Häälotsing suleti</translation> <translation id="6098793583803863900">Tundmatut faili kontrollitakse ohtliku sisu suhtes.</translation> <translation id="6100736666660498114">Menüü Start</translation> <translation id="6101226222197207147">Lisati uus rakendus (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Kasuta vaikimisi häält, mitte klaviatuuri</translation> <translation id="6234474535228214774">Installimine on ootel</translation> <translation id="6237816943013845465">Võimaldab kohandada ekraani eraldusvõimet</translation> +<translation id="6238624845858322552">Ühenda Bluetooth-seadmega</translation> <translation id="6238767809035845642">Muust seadmest jagatud tekst</translation> <translation id="6238923052227198598">Säilita viimane märge lukustuskuval</translation> <translation id="6239558157302047471">Laadi &raam uuesti</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />. võrk <ph name="NETWORK_COUNT" />-st, <ph name="PHONE_NAME" />, <ph name="SIGNAL_STRENGTH" />, signaalitugevus: <ph name="BATTERY_STATUS" />%, telefoni aku: %, ühenda</translation> <translation id="6268252012308737255">Ava rakendusega <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Saidid saavad küsida luba märguannete saatmiseks</translation> <translation id="6270770586500173387">Saada <ph name="BEGIN_LINK1" />süsteemi ja rakenduste teavet<ph name="END_LINK1" /> ning <ph name="BEGIN_LINK2" />mõõdikuid<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Pistikprogrammi allalaadimisel ilmnes viga (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Kvaliteet</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Konto</translation> <translation id="6298962879096096191">Androidi rakenduste installimiseks kasutatakse Google Playd</translation> <translation id="630065524203833229">V&älju</translation> +<translation id="6300718114348072351">Printerit <ph name="PRINTER_NAME" /> ei saanud automaatselt seadistada. Esitage printeri täpsemad üksikasjad. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Üldised eeskirjad:</translation> <translation id="6307990684951724544">Süsteem on hõivatud</translation> <translation id="6308493641021088955">Sisselogimise funktsiooni pakub <ph name="EXTENSION_NAME" /></translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Puhastamine ei ole praegu saadaval</translation> <translation id="6556866813142980365">Tee uuesti</translation> <translation id="6557290421156335491">Minu otseteed</translation> +<translation id="6561560012278703671">Kasuta vaiksemat sõnumsidet (märguandeviibad blokeeritakse)</translation> <translation id="6561726789132298588">sisestusklahv</translation> <translation id="656293578423618167">Faili tee või nimi on liiga pikk. Salvestage lühema nimega või muusse asukohta.</translation> <translation id="6563469144985748109">Haldur ei ole seda veel kinnitanud</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Küsi enne saatmist</translation> <translation id="6840184929775541289">Ei ole sertifitseerimisorgan</translation> <translation id="6841186874966388268">Vead</translation> +<translation id="6843267103192918276">Logige sisse, et tuua kõikidesse seadmetesse järjehoidjad, ajalugu, paroolid ja muud seaded. Teid logitakse ka automaatselt sisse Google'i teenustesse. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="6843423766595476978">„Ok Google” on kasutamiseks valmis</translation> <translation id="6845038076637626672">Ava maksimeeritult</translation> <translation id="6845325883481699275">Aidake Chrome'i turvalisust täiustada</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Rakenduse Hangouts Meet riistvara on seadistamiseks valmis.</translation> <translation id="744341768939279100">Loo uus profiil</translation> <translation id="7443806024147773267">Pääsete oma paroolidele juurde alati, kui olete oma Google'i kontole sisse logitud</translation> -<translation id="7444046173054089907">See sait on blokeeritud</translation> <translation id="7444983668544353857">Keela <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Rakenduste automaatne installimine</translation> <translation id="7450761244949417357">Brauser <ph name="ALTERNATIVE_BROWSER_NAME" /> avatakse kohe</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Eemalda see isik</translation> <translation id="8215295261562449873">Varunda minu rakendused ja failid enne Linuxi versiooni uuendamist kausta Allalaadimised.</translation> <translation id="8217399928341212914">Jätka mitme faili automaatse allalaadimise blokeerimist</translation> +<translation id="8218847192766059983">Lisage keeli või muutke loendi järjestust. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Tavaliselt blokeerite märguanded. Kui soovite lubada sellel saidil endale märguandeid saata, klõpsake siin.</translation> <translation id="8225265270453771718">Rakenduse akna jagamine</translation> <translation id="8225753906568652947">Lunastage oma pakkumised</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Muuda</translation> <translation id="9066773882585798925">Teksti ettelugemine</translation> <translation id="9066782832737749352">Kõnesüntees</translation> +<translation id="9067559831321817373">Hallake oma sisselogitud kontosid. Veebisaidid, rakendused ja laiendused Chrome’is ning Google Plays võivad olenevalt lubadest kasutada neid kontosid teie kasutuskogemuse isikupärastamiseks. <a>Lisateave</a></translation> <translation id="9068849894565669697">Värvi valimine</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 265ef8f..7c66c29b 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1750,7 +1750,6 @@ <translation id="347670947055184738">Sistemak ezin izan ditu eskuratu gailuaren gidalerroak.</translation> <translation id="347785443197175480">Jarraitu <ph name="HOST" /> webguneari kamera eta mikrofonoa atzitzea baimentzen</translation> <translation id="3478685642445675458">Desblokeatu profila inor kendu aurretik.</translation> -<translation id="3479539252931486093">Ez al zenuen halakorik espero? <ph name="BEGIN_LINK" />Jakinaraz iezaguzu<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Orain ez</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> arakatzailean irekiko da <ph name="COUNTDOWN_SECONDS" /> segundo barru</translation> <translation id="3484273680291419129">Software kaltegarria kentzen…</translation> @@ -4468,7 +4467,6 @@ <translation id="7442465037756169001">Konfiguratzeko prest dago Hangouts Meet hardwarea.</translation> <translation id="744341768939279100">Sortu profila</translation> <translation id="7443806024147773267">Pasahitzak eskura izango dituzu Google-ko kontuan saioa hasita badaukazu</translation> -<translation id="7444046173054089907">Blokeatuta dago webgune hau</translation> <translation id="7444983668544353857">Desgaitu <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalatu aplikazioak automatikoki</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> arakatzailean irekiko da orain</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 23bf6e9..581af2d 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">این صفحه پاسخ نمیدهد</translation> <translation id="1041263367839475438">دستگاههای در دسترس</translation> <translation id="1042174272890264476">همچنین کتابخانه RLZ <ph name="SHORT_PRODUCT_NAME" /> از قبل بر روی رایانه شما نصب شده است. RLZ یک برچسب غیرمنحصر بفرد و غیرقابلشناسایی برای سنجش جستجوها و استفاده از <ph name="SHORT_PRODUCT_NAME" /> اختصاص میدهد که توسط یک کمپین تبلیغاتی خاص ارائه میشود. در بعضی مواقع در <ph name="PRODUCT_NAME" /> این برچسبها در عباراتی که در جستجوی Goole جستجو میشوند نمایان میشوند.</translation> +<translation id="1043818413152647937">دادههای این برنامهها نیز پاک شود؟</translation> <translation id="1045692658517323508">{0,plural, =1{بهروزرسانی ۱ دقیقه دیگر}one{بهروزرسانی # دقیقه دیگر}other{بهروزرسانی # دقیقه دیگر}}</translation> <translation id="1046635659603195359">بهنظر میرسد ازقبل Voice Match را با «دستیار Google» در دستگاه دیگری راهاندازی کردهاید. از این قطعههای قبلاً ضبطشده میتوان برای ایجاد مدل صوتی در این دستگاه استفاده کرد. نباید بیشتر از یک دقیقه طول بکشد.</translation> <translation id="1047431265488717055">کپی کردن متن &پیوند</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">هوشمندیهای Google را در Chrome دریافت کنید</translation> <translation id="1147991416141538220">برای درخواست دسترسی، با سرپرست این دستگاه تماس بگیرید.</translation> <translation id="1149401351239820326">ماه انقضا</translation> +<translation id="1150490752229770117">این آخرین بهروزرسانی خودکار نرمافزار و امنیتی برای این <ph name="DEVICE_TYPE" /> است. برای دریافت بهروزرسانیهای بعدی، به مدل جدیدتری ارتقا دهید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1150565364351027703">عینک آفتابی</translation> <translation id="1151917987301063366">همیشه اجازه دسترسی به حسگرها به <ph name="HOST" /> داده شود</translation> <translation id="1153356358378277386">دستگاههای مرتبطشده</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">بلیتی انتخاب کنید تا برای احراز هویت از آن استفاده کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1712349894969001173">دریافت این گذرواژه در iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> میخواهد دادهها را برای همیشه در رایانه محلیتان ذخیره کند</translation> +<translation id="1714644264617423774">ویژگیهای دسترسپذیری را برای استفاده آسانتر از دستگاهتان فعال کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1717218214683051432">حسگرهای حرکتی</translation> +<translation id="171824261579749339">استرالیایی <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1718835860248848330">ساعت قبل</translation> <translation id="1719312230114180055">توجه: ممکن است امنیت اثر انگشت شما از یک گذرواژه یا پین قوی کمتر باشد.</translation> <translation id="1720318856472900922">راستیآزمایی سرور TLS WWW</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">پاک کردن کوکیهای شخص ثالث</translation> <translation id="2097372108957554726">برای ثبت دستگاههای جدید باید به سیستم Chrome وارد شوید</translation> <translation id="2099172618127234427">ویژگیهای رفع اشکال سیستم عامل Chrome را فعال میکنید که sshd daemon را تنظیم خواهد کرد و راهاندازی از درایوهای USB را فعال میکند.</translation> +<translation id="2099625543891475722">ویژگیهای ظاهری شما، مانند قد</translation> <translation id="2099686503067610784">مجوز سرور "<ph name="CERTIFICATE_NAME" />" حذف شود؟</translation> <translation id="2100273922101894616">ورود به سیستم خودکار</translation> <translation id="2101225219012730419">نسخه:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">ایجاد نمایه جدید</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> میخواهد هویتتان را به تأیید برساند</translation> <translation id="2448312741937722512">نوع</translation> +<translation id="2448734521821581858">کوکیها فایلهایی هستند که توسط وبسایتهایی که بازدید میکنید ایجاد میشوند. دو نوع کوکی وجود دارد: کوکیهای شخص اول که توسط سایتی که بازدید میکنید ایجاد میشوند. این سایت در نوار نشانی نشان داده میشود. کوکیهای شخص ثالث که توسط سایتهای دیگر ایجاد میشوند. برخی از محتواها، مثل آگهیها یا تصاویر موجود در وبسایتی که بازدید میکنید، متعلق به این سایتها هستند.</translation> <translation id="2450223707519584812">نمیتوانید کاربران را اضافه کنید زیرا کلیدهای Google API موجود نیستند. برای جزئیات به <ph name="DETAILS_URL" /> مراجعه کنید.</translation> <translation id="2450849356604136918">هیچ نمای فعالی وجود ندارد</translation> <translation id="2451298179137331965">۲ برابر</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">پایان مهلت زمانی</translation> <translation id="2588636910004461974">دستگاههای <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">در Google جستجو کنید یا نشانی وب را تایپ کنید</translation> +<translation id="2600522410036850735">این دستگاه بهروزرسانیهای نرمافزار و امنیتی خودکار را تا <ph name="MONTH_AND_YEAR" /> دریافت خواهد کرد. <a target="_blank" href="<ph name="URL" />">بیشتر بدانید</a></translation> <translation id="2603115962224169880">پاک کردن رایانه</translation> <translation id="2603463522847370204">باز کردن در پنجره &ناشناس</translation> <translation id="2604255671529671813">خطای اتصال شبکه</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">مرور ایمن (از شما و دستگاهتان درمقابل سایتهای خطرناک محافظت میکند)</translation> <translation id="3182749001423093222">غلطگیر املا</translation> <translation id="3183139917765991655">واردکننده نمایه</translation> +<translation id="3184536091884214176">چاپگرهای CUPS را راهاندازی یا مدیریت کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="3188257591659621405">فایلهای من</translation> <translation id="3188465121994729530">میانگین متحرک</translation> <translation id="3190558889382726167">گذرواژه ذخیره شد</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">وای! سیستم نتوانست خطمشی را برای دستگاهتان واکشی کند.</translation> <translation id="347785443197175480">همچنان دسترسی به دوربین و میکروفون شما، توسط <ph name="HOST" /> مجاز باشد</translation> <translation id="3478685642445675458">لطفاً قبل از حذف کردن شخصی، قفل نمایهتان را باز کنید.</translation> -<translation id="3479539252931486093">غیرمنتظره بود؟ <ph name="BEGIN_LINK" />به ما اطلاع دهید<ph name="END_LINK" /></translation> <translation id="3479552764303398839">اکنون نه</translation> <translation id="3481268647794498892">درحال باز شدن در <ph name="ALTERNATIVE_BROWSER_NAME" /> در<ph name="COUNTDOWN_SECONDS" /> ثانیه</translation> <translation id="3484273680291419129">درحال پاک کردن نرمافزار مضر…</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">نمایش نامهای کاربری و عکسها در صفحه ورود به سیستم</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - متصل به دستگاه HID</translation> <translation id="4142052906269098341">قفل <ph name="DEVICE_TYPE" /> را با تلفنتان باز کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">چاپگرهای شناساییشده را در نمایهتان ذخیره کنید یا چاپگر جدیدی اضافه کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="4144218403971135344">دریافت ویدیوی با کیفیت بهتر و افزایش ماندگاری شارژ باتری. ویدیو فقط در صفحهنمایش سازگار با Cast پخش خواهد شد.</translation> <translation id="4146026355784316281">همیشه با نظارهگر سیستم باز شود</translation> <translation id="4146785383423576110">بارنشانی و پاک کردن</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">خربزه</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> در حال اشتراکگذاری یک پنجره است.</translation> <translation id="4364830672918311045">نمایش اعلانها</translation> +<translation id="436499142539576997">دادههای برنامه دریافت نشد، همچنان تلاش میکنیم برنامه را اجرا کنیم...</translation> <translation id="4370975561335139969">ایمیل و گذرواژهای که وارد کردهاید، مطابقت ندارند</translation> <translation id="437184764829821926">تنظیمات پیشرفته قلم</translation> <translation id="4374831787438678295">نصبکننده Linux</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">فقط پروتکلهای فایل، http و https برای ویژگی هدایت کردن مرورگر پشتیبانی میشوند.</translation> <translation id="4659077111144409915">حساب اصلی</translation> <translation id="4660476621274971848">نسخه موردانتظار «<ph name="EXPECTED_VERSION" />» است، اما نسخه «<ph name="NEW_ID" />» بود</translation> +<translation id="4660838440047236328">چیدمان اتاق شما</translation> <translation id="4662788913887017617">این نشانک را با iPhone خود به اشتراک بگذارید</translation> <translation id="4663373278480897665">دوربین مجاز است</translation> <translation id="4664482161435122549">خطای صادر کردن PKCS #12</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">صفحه شروع به <ph name="URL" /> تغییر کرد.</translation> <translation id="4902546322522096650">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="SECURITY_STATUS" />, قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، اتصال</translation> <translation id="49027928311173603">خطمشی بارگیریشده از سرور نامعتبر است: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">راهاندازی یا مدیریت دستگاههای ذخیرهسازی متصل به شبکه. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="4907161631261076876">این فایل معمولاً بارگیری نمیشود و ممکن است خطرناک باشد.</translation> <translation id="4907306957610201395">دسته مجوز</translation> <translation id="4908811072292128752">برای مرور دو سایت بهطور همزمان، برگه جدیدی را باز کنید</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">در حال فعالسازی...</translation> <translation id="5039804452771397117">اجازه دادن</translation> <translation id="5042282098504489593">برای اتصال <ph name="USB_DEVICE_NAME" /> به Linux، «تنظیمات» را باز کنید</translation> +<translation id="5043913660911154449">یا PPD چاپگرتان را تعیین کنید <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="5045550434625856497">گذرواژه نادرست</translation> <translation id="504561833207953641">درحال باز شدن در جلسه مرورگر کنونی.</translation> <translation id="5047421709274785093">استفاده از حسگرهای نوری و حرکتی توسط سایتها مسدود شود</translation> @@ -3103,6 +3115,7 @@ <translation id="5464660706533281090">کاربر کودک نمیتواند این تنظیم را تغییر دهد.</translation> <translation id="5466374726908360271">جایگذاری و جستجوی «<ph name="SEARCH_TERMS" />»</translation> <translation id="5468173180030470402">درحال یافتن دستگاه ذخیرهسازی متصل به شبکه</translation> +<translation id="5470735824776589490">قبل از اینکه دستگاه شما با Powerwash بازنشانی شود، راهاندازی مجدد لازم است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="5471768120198416576">سلام! من صدای نوشتار به گفتار شما هستم.</translation> <translation id="5472133193607270166">وقتی روشن باشد، سایتها نمیتوانند از فعالیت مرور شما در سایتهای مختلف برای شخصیسازی آگهی استفاده کنند. ممکن است برخی سایتها بهدرستی کار نکنند.</translation> <translation id="5473333559083690127">پین جدید را دوباره وارد کنید</translation> @@ -3126,6 +3139,7 @@ <translation id="5496587651328244253">سازماندهی</translation> <translation id="5499313591153584299">شاید این فایل برای کامپیوتر شما مضر باشد.</translation> <translation id="5502500733115278303">وارد شده از Firefox</translation> +<translation id="5505264765875738116">سایتها نمیتوانند برای ارسال اعلان درخواست دهند</translation> <translation id="5505307013568720083">جوهر تمام شده است</translation> <translation id="5507756662695126555">انکارناپذیری</translation> <translation id="5509693895992845810">ذخیره &بهعنوان...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">موارد برگزیده</translation> <translation id="5804175651771201311">فراگیری خاموش است</translation> <translation id="5804241973901381774">مجوزها</translation> +<translation id="5804427196348435412">استفاده از دستگاههای مجهز به NFC</translation> <translation id="5805697420284793859">مدیر پنجره</translation> <translation id="5806773519584576205">۰ درجه (پیشفرض)</translation> <translation id="5811750797187914944">همه چیز آماده است</translation> @@ -3555,6 +3570,7 @@ <translation id="6096047740730590436">باز کردن در حداکثر اندازه</translation> <translation id="6096326118418049043">نام X.500</translation> <translation id="6097480669505687979">اگر فضا را آزاد نکنید، ممکن است کاربران و دادهها بهطور خودکار حذف شوند.</translation> +<translation id="6097600385983390082">جستجوی گفتاری بسته شد</translation> <translation id="6098793583803863900">فایل ناشناسی از نظر وجود محتوای خطرناک درحال اسکن شدن است.</translation> <translation id="6100736666660498114">منوی شروع</translation> <translation id="6101226222197207147">برنامه جدید اضافه شده (<ph name="EXTENSION_NAME" />)</translation> @@ -3650,6 +3666,7 @@ <translation id="6233154960150021497">پیشفرض استفاده از صدا بهجای صفحهکلید</translation> <translation id="6234474535228214774">نصب درانتظار</translation> <translation id="6237816943013845465">به شما امکان میدهد وضوح صفحه را تنظیم کنید</translation> +<translation id="6238624845858322552">اتصال به دستگاه بلوتوث</translation> <translation id="6238767809035845642">نوشتار همرسانیشده از دستگاه دیگر</translation> <translation id="6238923052227198598">نگه داشتن جدیدترین یادداشت در صفحه درحالت قفل</translation> <translation id="6239558157302047471">تازهسازی قاب</translation> @@ -3676,6 +3693,7 @@ <translation id="6267547857941397424">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="PHONE_NAME" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، باتری تلفن <ph name="BATTERY_STATUS" />٪، اتصال</translation> <translation id="6268252012308737255">باز کردن با <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">سایتها میتوانند برای ارسال اعلان درخواست دهند</translation> <translation id="6270770586500173387">ارسال <ph name="BEGIN_LINK1" />اطلاعات برنامه و سیستم<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />معیارها<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">هنگام بارگیری افزایه، خطایی (<ph name="ERROR" />) روی داد</translation> <translation id="6273677812470008672">کیفیت</translation> @@ -3697,6 +3715,7 @@ <translation id="629730747756840877">حساب</translation> <translation id="6298962879096096191">برای نصب برنامههای Android از Google Play استفاده کنید</translation> <translation id="630065524203833229">&خروج</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> بهطور خودکار پیکربندی نشد. لطفاً جزئیات پیشرفته چاپگر را مشخص کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="6305607932814307878">خطمشی کلی:</translation> <translation id="6307990684951724544">سیستم مشغول است</translation> <translation id="6308493641021088955">ورود به سیستم ارائهشده توسط <ph name="EXTENSION_NAME" /></translation> @@ -3866,6 +3885,7 @@ <translation id="6555810572223193255">پاکسازی فعلاً در دسترس نیست</translation> <translation id="6556866813142980365">انجام مجدد</translation> <translation id="6557290421156335491">میانبرهای من</translation> +<translation id="6561560012278703671">استفاده از پیامرسانی کمصداتر (درخواستهای اعلان را مسدود میکند تا مزاحمتان نشود)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="656293578423618167">مسیر یا نام فایل خیلی طولانی است. لطفاً با یک نام کوتاهتر یا در محل دیگری ذخیره کنید.</translation> <translation id="6563469144985748109">مدیرتان هنوز این سایت را تأیید نکرده است</translation> @@ -4049,6 +4069,7 @@ <translation id="6840155290835956714">پیش از ارسال سؤال شود</translation> <translation id="6840184929775541289">یک ارائه دهنده مجوز نیست</translation> <translation id="6841186874966388268">خطاها</translation> +<translation id="6843267103192918276">برای دریافت نشانکها، سابقه، گذرواژهها، و سایر تنظیماتتان در همه دستگاهها وارد سیستم شوید. بهعلاوه، بهطور خودکار به سیستم سرویسهای Google خود وارد خواهید شد. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google کاملاً آماده است</translation> <translation id="6845038076637626672">باز کردن در حداکثر اندازه</translation> <translation id="6845325883481699275">کمک به بهبود امنیت Chrome</translation> @@ -4465,7 +4486,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware شما آماده راهاندازی است.</translation> <translation id="744341768939279100">ایجاد نمایهای جدید</translation> <translation id="7443806024147773267">هروقت به سیستم حساب Google وارد میشوید، به گذرواژههایتان دسترسی داشته باشید</translation> -<translation id="7444046173054089907">این سایت مسدود شده است</translation> <translation id="7444983668544353857">غیر فعال کردن <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">نصب خودکار برنامهها</translation> <translation id="7450761244949417357">اکنون درحال باز کردن در <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">حذف این شخص</translation> <translation id="8215295261562449873">قبل از ارتقای Linux، برنامهها و فایلهای من در پوشه «بارگیریها» پشتیبانگیری شوند.</translation> <translation id="8217399928341212914">ادامه مسدود کردن بارگیری خودکار چندین فایل</translation> +<translation id="8218847192766059983">زبان اضافه کنید یا ترتیب فهرست را تغییر دهید. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="8221491193165283816">معمولاً اعلانها را مسدود میکنید. برای اینکه اجازه دهید این سایت اعلان بفرستد، اینجا را کلیک کنید.</translation> <translation id="8225265270453771718">همرسانی پنجره برنامه</translation> <translation id="8225753906568652947">استفاده از پیشنهادها</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">ویرایش</translation> <translation id="9066773882585798925">بلند خوانده شدن نوشتار</translation> <translation id="9066782832737749352">تبدیل نوشتار به گفتار</translation> +<translation id="9067559831321817373">حسابهایی را که به سیستم آنها وارد شدهاید مدیریت کنید. وبسایتها، برنامهها، و افزونههای Chrome و Google Play ممکن است بسته به مجوزها، از این حسابها برای سفارشی کردن تجربه شما استفاده کنند. <a>بیشتر بدانید</a></translation> <translation id="9068849894565669697">انتخاب رنگ</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">بلوتوث</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index e3661f6..f971b4f 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Hups! Järjestelmä ei onnistunut noutamaan käytäntöä laitteellesi.</translation> <translation id="347785443197175480">Anna sivuston <ph name="HOST" /> käyttää edelleen kameraasi ja mikrofoniasi</translation> <translation id="3478685642445675458">Avaa profiilisi lukitus ennen henkilön poistamista.</translation> -<translation id="3479539252931486093">Etkö odottanut tätä? <ph name="BEGIN_LINK" />Kerro siitä meille.<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ei nyt</translation> <translation id="3481268647794498892">Avataan selaimessa <ph name="ALTERNATIVE_BROWSER_NAME" /> <ph name="COUNTDOWN_SECONDS" /> sekunnin päästä</translation> <translation id="3484273680291419129">Poistetaan haittaohjelmia…</translation> @@ -4489,7 +4488,6 @@ <translation id="7442465037756169001">Hangouts Meet ‑laitteistosi on valmis määritettäväksi.</translation> <translation id="744341768939279100">Luo uusi profiili</translation> <translation id="7443806024147773267">Käytä salasanojasi kaikkialla ollessasi kirjautuneena Google-tilille</translation> -<translation id="7444046173054089907">Tämä sivusto on estetty</translation> <translation id="7444983668544353857">Poista <ph name="NETWORKDEVICE" /> käytöstä </translation> <translation id="7448430327655618736">Asenna sovellukset automaattisesti</translation> <translation id="7450761244949417357">Avataan nyt selaimessa <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 3800869..f3870e0 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Hindi tumutugon ang page na ito</translation> <translation id="1041263367839475438">Mga available na device</translation> <translation id="1042174272890264476">Ang iyong computer ay may naka-built in din na RLZ library ng <ph name="SHORT_PRODUCT_NAME" />. Nagtatalaga ang RLZ ng hindi natatangi at hindi personal na nakakapagpakilalang tag upang sukatin ang mga paghahanap at paggamit ng <ph name="SHORT_PRODUCT_NAME" /> na nahimok ng isang partikular na kampanya sa pag-promote. Lumalabas minsan ang mga label na ito sa mga query sa Paghahanap sa Google sa <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">I-clear din ang data mula sa mga app na ito?</translation> <translation id="1045692658517323508">{0,plural, =1{I-update sa loob ng 1 minuto}one{I-update sa loob ng # minuto}other{I-update sa loob ng # na minuto}}</translation> <translation id="1046635659603195359">Mukhang na-set up mo na ang Voice Match sa iyong Google Assistant sa isa pang device. Magagamit ang mga nakaraang recording na ito para gumawa ng voice model sa device na ito. Hindi dapat ito abutin nang mahigit isang minuto.</translation> <translation id="1047431265488717055">Kopyahin ang Text ng Link</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Magkaroon ng mga smart na feature ng Google sa Chrome</translation> <translation id="1147991416141538220">Para humiling ng access, makipag-ugnayan sa administrator ng device na ito.</translation> <translation id="1149401351239820326">Buwan ng pag-expire</translation> +<translation id="1150490752229770117">Ito ang huling pag-update ng software at seguridad para sa ganitong <ph name="DEVICE_TYPE" />. Para makakuha ng mga update sa hinaharap, mag-upgrade sa mas bagong modelo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Sunglasses</translation> <translation id="1151917987301063366">Palaging payagan ang <ph name="HOST" /> na i-access ang mga sensor</translation> <translation id="1153356358378277386">Mga nakapares na device</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Pumili ng ticket para magamit sa pag-authenticate. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Kunin ang password na ito sa iyong iPhone</translation> <translation id="1712552549805331520">Gusto ng <ph name="URL" /> na permanenteng mag-store ng data sa iyong lokal na computer</translation> +<translation id="1714644264617423774">I-enable ang mga feature ng accessibility para maging mas madaling gamitin ang iyong device. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Mga sensor ng paggalaw</translation> +<translation id="171824261579749339">Australian <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Huling oras</translation> <translation id="1719312230114180055">Tandaan: Maaaring hindi gaanong ligtas ang iyong fingerprint kaysa sa isang mahirap hulaang password o PIN.</translation> <translation id="1720318856472900922">TLS WWW na Pagpapatotoo ng Server</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">I-clear ang cookies ng third party</translation> <translation id="2097372108957554726">Kailangan mong mag-sign in sa Chrome upang makapagrehistro ng mga bagong device</translation> <translation id="2099172618127234427">Ie-enable mo ang mga feature para sa pagde-debug ng Chrome OS na magse-set up ng sshd daemon at mag-e-enable ng pagbu-boot mula sa mga USB drive.</translation> +<translation id="2099625543891475722">iyong mga pisikal na katangian, tulad ng tangkad</translation> <translation id="2099686503067610784">Tanggalin ang certificate ng server na "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Awtomatikong Mag-sign in</translation> <translation id="2101225219012730419">Bersyon:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Gumawa ng Bagong Profile</translation> <translation id="2446585455334014596">Gustong i-verify ng <ph name="APP_NAME" /> ang iyong pagkakakilanlan</translation> <translation id="2448312741937722512">Uri</translation> +<translation id="2448734521821581858">Ang cookies ay mga file na ginagawa ng mga website na binibisita mo. May dalawang uri ng cookies: Ginagawa ng site na iyong binibisita ang cookies ng first-party. Ipinapakita ang site sa address bar. Ginagawa ng iba pang site ang third-party na cookies. Nagmamay-ari ang mga site na ito ng ilan sa content, tulad ng mga ad o larawan, na nakikita mo sa website na iyong binibisita.</translation> <translation id="2450223707519584812">Hindi mo magagawang magdagdag ng mga user dahil wala ang mga Google API key. Tingnan ang <ph name="DETAILS_URL" /> para sa mga detalye.</translation> <translation id="2450849356604136918">Walang aktibong view</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Nag-time out</translation> <translation id="2588636910004461974">Mga device mula sa <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Hanapin sa Google o i-type ang URL</translation> +<translation id="2600522410036850735">Makakakuha ang device na ito ng mga awtomatikong update sa software at seguridad hanggang <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Matuto pa</a></translation> <translation id="2603115962224169880">Linisin ang computer</translation> <translation id="2603463522847370204">Buksan sa &incognito window</translation> <translation id="2604255671529671813">Error sa koneksyon ng network</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Ligtas na Pag-browse (pinoprotektahan ka at ang iyong device mula sa mga mapanganib na site)</translation> <translation id="3182749001423093222">Pang-check ng pagbabaybay</translation> <translation id="3183139917765991655">Pang-import ng Profile</translation> +<translation id="3184536091884214176">Mag-set up o mamahala ng mga printer ng CUPS. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Aking mga file</translation> <translation id="3188465121994729530">Average ng Paglipat</translation> <translation id="3190558889382726167">Nai-save ang password</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Oops! Hindi nakuha ng system ang patakaran para sa iyong device.</translation> <translation id="347785443197175480">Magpatuloy sa pagpayag sa <ph name="HOST" /> na i-access ang iyong camera at mikropono</translation> <translation id="3478685642445675458">Paki-unlock ang iyong profile bago mag-alis ng tao.</translation> -<translation id="3479539252931486093">Hindi mo ba ito inaasahan? <ph name="BEGIN_LINK" />Ipaalam sa amin<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Hindi ngayon</translation> <translation id="3481268647794498892">Bubukas sa <ph name="ALTERNATIVE_BROWSER_NAME" /> sa loob ng <ph name="COUNTDOWN_SECONDS" /> segundo</translation> <translation id="3484273680291419129">Inaalis ang mapaminsalang software...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Ipakita ang mga username at larawan sa screen sa pag-sign-in</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - Nakakonekta sa HID device</translation> <translation id="4142052906269098341">I-unlock ang iyong <ph name="DEVICE_TYPE" /> gamit ang telepono mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">I-save ang mga natukoy na printer sa iyong profile, o magdagdag ng bagong printer. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Magkaroon ng mas magandang kalidad na video at makatipid ng baterya. Magpe-play lang ang video sa iyong screen na may naka-enable na Cast.</translation> <translation id="4146026355784316281">Palaging Buksan Gamit ang System Viewer</translation> <translation id="4146785383423576110">I-reset at linisin</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491">Nagbabahagi ng window ang <ph name="APP_NAME" />.</translation> <translation id="4364830672918311045">Ipakita ang mga notification</translation> +<translation id="436499142539576997">Nabigong makuha ang data ng app, sinusubukan pa ring patakbuhin ang app...</translation> <translation id="4370975561335139969">Hindi nagtutugma ang inilagay mong email at password</translation> <translation id="437184764829821926">Mga advanced na setting ng font</translation> <translation id="4374831787438678295">Installer ng Linux</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Tanging http, https at file protocol ang sinusuportahan para sa mga pag-redirect ng browser.</translation> <translation id="4659077111144409915">Pangunahing account</translation> <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" ang inaasahang bersyon, ngunit "<ph name="NEW_ID" />" ang bersyon</translation> +<translation id="4660838440047236328">ang layout ng iyong kwarto</translation> <translation id="4662788913887017617">Ibahagi ang bookmark na ito sa iyong iPhone</translation> <translation id="4663373278480897665">Pinapayagan ang camera</translation> <translation id="4664482161435122549">Error sa Pag-export ng PKCS #12</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Naging <ph name="URL" /> ang iyong pahina sa pagsisimula.</translation> <translation id="4902546322522096650">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Kumonekta</translation> <translation id="49027928311173603">Di-wasto ang patakaran na-download mula sa server: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Mag-set up o mamahala ng mga file share ng network. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Hindi karaniwang dina-download ang app na ito at maaaring mapanganib.</translation> <translation id="4907306957610201395">Kategorya ng Pahintulot</translation> <translation id="4908811072292128752">Magbukas ng bagong tab upang mag-browse ng dalawang site nang sabay</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Pinapagana...</translation> <translation id="5039804452771397117">Payagan</translation> <translation id="5042282098504489593">Buksan ang Mga Setting para ikonekta ang <ph name="USB_DEVICE_NAME" /> sa Linux</translation> +<translation id="5043913660911154449">O tukuyin ang PPD ng iyong printer <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Hindi wastong password</translation> <translation id="504561833207953641">Binubuksan sa kasalukuyang session ng browser.</translation> <translation id="5047421709274785093">I-block ang paggamit ng mga site ng mga motion at light sensor</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Hindi mababago ng batang user ang setting na ito.</translation> <translation id="5466374726908360271">I-pa&ste at hanapin ang “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Naghahanap ng mga file share</translation> +<translation id="5470735824776589490">Kinakailangang mag-restart bago ma-reset ang iyong device gamit ang Powerwash. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Kumusta! Ako ang iyong boses ng text-to-speech.</translation> <translation id="5472133193607270166">Kapag naka-on, hindi magagamit ng mga site ang iyong aktibidad sa pag-browse sa iba't ibang site para i-personalize ang mga ad. Puwedeng hindi gumana nang maayos ang ilang site.</translation> <translation id="5473333559083690127">Muling ilagay ang bagong PIN</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Isaayos</translation> <translation id="5499313591153584299">Maaaring nakakapinsala ang file na ito para sa iyong computer.</translation> <translation id="5502500733115278303">Nai-import Mula sa Firefox</translation> +<translation id="5505264765875738116">Hindi puwedeng humiling ang mga site na magpadala ng mga notification</translation> <translation id="5505307013568720083">Wala nang ink</translation> <translation id="5507756662695126555">Hindi makokontra</translation> <translation id="5509693895992845810">I-save &Bilang...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Mga Kagustuhan</translation> <translation id="5804175651771201311">Naka-off ang roaming</translation> <translation id="5804241973901381774">Mga Pahintulot</translation> +<translation id="5804427196348435412">Gumamit ng mga NFC device</translation> <translation id="5805697420284793859">Window manager</translation> <translation id="5806773519584576205">0° (Default)</translation> <translation id="5811750797187914944">Handa na ang lahat</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Buksan ang naka-maximize</translation> <translation id="6096326118418049043">Pangalan na X.500</translation> <translation id="6097480669505687979">Kung hindi ka magbabakante ng espasyo, maaaring awtomatikong alisin ang mga user at data.</translation> +<translation id="6097600385983390082">Isinara ang paghahanap gamit ang boses</translation> <translation id="6098793583803863900">Sina-scan ang isang hindi kilalang file para matukoy kung may mapanganib na content.</translation> <translation id="6100736666660498114">Start menu</translation> <translation id="6101226222197207147">Nagdagdag ng bagong app (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Default na gumamit ng boses sa halip na keyboard</translation> <translation id="6234474535228214774">Nakabinbin ang pag-install</translation> <translation id="6237816943013845465">Nagbibigay-daan sa iyong i-adjust ang resolution ng iyong screen</translation> +<translation id="6238624845858322552">Kumonekta sa device ng bluetooth</translation> <translation id="6238767809035845642">Ibinahaging text mula sa Ibang Device</translation> <translation id="6238923052227198598">Panatilihin ang pinakabagong tala sa lock screen</translation> <translation id="6239558157302047471">I-reload ang &frame</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Baterya ng Telepono <ph name="BATTERY_STATUS" />%, Kumonekta</translation> <translation id="6268252012308737255">Buksan sa <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Puwedeng humiling ang mga site na magpadala ng mga notification</translation> <translation id="6270770586500173387">Ipadala ang <ph name="BEGIN_LINK1" />impormasyon ng system at app<ph name="END_LINK1" />, at <ph name="BEGIN_LINK2" />mga sukatan<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Nagkaroon ng error (<ph name="ERROR" />) habang dina-download ang plugin</translation> <translation id="6273677812470008672">Kalidad</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Account</translation> <translation id="6298962879096096191">Gamitin ang Google Play upang mag-install ng mga Android app</translation> <translation id="630065524203833229">L&umabas</translation> +<translation id="6300718114348072351">Hindi ma-configure nang awtomatiko ang <ph name="PRINTER_NAME" />. Pakitukoy ang mga advanced na detalye ng printer. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Pandaigdigang Patakaran:</translation> <translation id="6307990684951724544">Abala ang system</translation> <translation id="6308493641021088955">Ibinibigay ng <ph name="EXTENSION_NAME" /> ang pag-sign in</translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Hindi available sa kasalukuyan ang pag-clean up</translation> <translation id="6556866813142980365">Redo</translation> <translation id="6557290421156335491">Aking mga shortcut</translation> +<translation id="6561560012278703671">Gamitin ang mas tahimik na pagmemensahe (bina-block ang mga prompt ng notification na gumagambala sa iyo)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Masyadong mahaba ang path o pangalan ng file. Mangyaring i-save nang may mas maikling pangalan o sa isa pang lokasyon.</translation> <translation id="6563469144985748109">Hindi pa ito inaaprubahan ng iyong manager</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Magtanong bago magpadala</translation> <translation id="6840184929775541289">Ay hindi isang Certification Authority</translation> <translation id="6841186874966388268">Mga error</translation> +<translation id="6843267103192918276">Mag-sign in para makuha ang iyong mga bookmark, history, password, at ibang setting sa lahat ng iyong device. Awtomatiko ka ring masa-sign in sa iyong mga serbisyo ng Google. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Nakahanda na ang Ok Google</translation> <translation id="6845038076637626672">Buksan ang naka-maximize</translation> <translation id="6845325883481699275">Tulungang paigtingin ang seguridad ng Chrome</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Handa nang ma-set up ang iyong Hangouts Meet hardware.</translation> <translation id="744341768939279100">Gumawa ng bagong profile</translation> <translation id="7443806024147773267">I-access ang iyong mga password kapag naka-sign in ka sa Google Account mo</translation> -<translation id="7444046173054089907">Naka-block ang site na ito</translation> <translation id="7444983668544353857">Huwag paganahin <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Awtomatikong nag-i-install ng mga app</translation> <translation id="7450761244949417357">Binubuksan ngayon sa <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Alisin ang Taong Ito</translation> <translation id="8215295261562449873">I-back up ang aking mga app at file sa folder na Mga Download bago i-upgrade ang Linux.</translation> <translation id="8217399928341212914">Patuloy na i-block ang mga awtomatikong pagda-download ng maraming file</translation> +<translation id="8218847192766059983">Magdagdag ng mga wika o baguhin ang pagkakasunud-sunod ng listahan. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Kadalasan mong bina-block ang mga notification. Para hayaan ang site na itong abisuhan ka, mag-click dito.</translation> <translation id="8225265270453771718">Magbahagi ng application window</translation> <translation id="8225753906568652947">I-redeem ang iyong mga alok</translation> @@ -5648,6 +5669,7 @@ <translation id="9065203028668620118">I-edit</translation> <translation id="9066773882585798925">Marinig na binabasa nang malakas ang text</translation> <translation id="9066782832737749352">Text-to-Speech</translation> +<translation id="9067559831321817373">Pamahalaan ang iyong mga naka-sign in na account. Puwedeng gamitin ng mga website, app, at extension sa Chrome at Google Play ang mga account na ito para i-customize ang iyong karanasan, depende sa mga pahintulot. <a>Matuto pa</a></translation> <translation id="9068849894565669697">Pumili ng kulay</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 51a1bc7..992c27c7 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Cette page ne répond pas</translation> <translation id="1041263367839475438">Appareils accessibles</translation> <translation id="1042174272890264476">Votre ordinateur est fourni avec la bibliothèque RLZ de <ph name="SHORT_PRODUCT_NAME" />. RLZ attribue une étiquette non unique et qui ne permet pas d'identifier des internautes afin de mesurer les recherches et l'utilisation de <ph name="SHORT_PRODUCT_NAME" /> générées par une campagne de promotion particulière. Ces étiquettes s'affichent parfois dans les requêtes de recherche Google dans <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Effacer également les données issues de ces applications?</translation> <translation id="1045692658517323508">{0,plural, =1{Mettre à jour d'ici 1 minute}one{Mettre à jour d'ici # minute}other{Mettre à jour d'ici # minutes}}</translation> <translation id="1046635659603195359">Il semble que vous avez déjà configuré la fonction Voice Match avec l'Assistant Google sur un autre appareil. Ces enregistrements précédents peuvent être utilisés pour créer un modèle vocal sur cet appareil. L'opération devrait prendre moins d'une minute.</translation> <translation id="1047431265488717055">Copier le texte du lien</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Fonctionnalités intelligentes Google dans Chrome</translation> <translation id="1147991416141538220">Pour demander l'accès, communiquez avec l'administrateur de cet appareil.</translation> <translation id="1149401351239820326">Mois d'expiration</translation> +<translation id="1150490752229770117">Il s'agit de la dernière mise à jour logicielle et de sécurité pour ce <ph name="DEVICE_TYPE" />. Pour recevoir les mises à jour ultérieures, procurez-vous un modèle plus récent. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Lunettes de soleil</translation> <translation id="1151917987301063366">Toujours autoriser le site <ph name="HOST" /> à accéder aux capteurs</translation> <translation id="1153356358378277386">Appareils associés</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Choisissez un ticket à utiliser pour l'authentification. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Obtenez ce mot de passe sur votre iPhone</translation> <translation id="1712552549805331520">L'URL <ph name="URL" /> veut stocker des données de façon permanente sur votre ordinateur local</translation> +<translation id="1714644264617423774">Activer les fonctionnalités d'accessibilité afin de faciliter l'utilisation de votre appareil. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Capteurs de mouvements</translation> +<translation id="171824261579749339">Australien <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Dernière heure</translation> <translation id="1719312230114180055">Remarque : Votre empreinte digitale peut être moins sécuritaire qu'un mot de passe ou un NIP fiables.</translation> <translation id="1720318856472900922">Authentification du serveur WWW TLS</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Effacer les témoins tiers</translation> <translation id="2097372108957554726">Vous devez vous connecter à Chrome pour enregistrer de nouveaux appareils.</translation> <translation id="2099172618127234427">Vous activez les fonctions de débogage de Chrome OS qui vont installer le démon sshd et activer le démarrage depuis les appareils USB.</translation> +<translation id="2099625543891475722">vos caractéristiques physiques, comme votre taille</translation> <translation id="2099686503067610784">Supprimer le certificat de serveur « <ph name="CERTIFICATE_NAME" /> »?</translation> <translation id="2100273922101894616">Connexion automatique</translation> <translation id="2101225219012730419">Version :</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Créer un profil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> souhaite vérifier votre identité</translation> <translation id="2448312741937722512">Type</translation> +<translation id="2448734521821581858">Les témoins sont des fichiers créés par les sites Web que vous visitez. Il y a deux types de témoins : les témoins directs sont ceux que créent les sites que vous visitez. Le site en question figure dans la barre d'adresse. Les témoins tiers sont ceux que créent d'autres sites. Ces sites possèdent certains types de contenu, comme les annonces et les images, que vous voyez sur les sites que vous visitez.</translation> <translation id="2450223707519584812">Vous ne pourrez pas ajouter d'utilisateurs, car il manque les clés de l'API Google. Consultez <ph name="DETAILS_URL" /> pour plus de détails.</translation> <translation id="2450849356604136918">Aucun affichage actif</translation> <translation id="2451298179137331965">2x</translation> @@ -1141,6 +1147,7 @@ <translation id="2587922766792651800">Délai dépassé</translation> <translation id="2588636910004461974">Appareils appartenant à <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Effectuez une recherche sur Google ou entrez une adresse URL</translation> +<translation id="2600522410036850735">Cet appareil recevra les mises à jour logicielles et de sécurité jusqu'en <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">En savoir plus</a></translation> <translation id="2603115962224169880">Nettoyer l'ordinateur</translation> <translation id="2603463522847370204">Ouvrir dans une fenêtre de &navigation privée</translation> <translation id="2604255671529671813">Erreur de connexion réseau</translation> @@ -1561,6 +1568,7 @@ <translation id="3181954750937456830">Navigation sécurisée (vous protège, vous et votre appareil, des sites dangereux)</translation> <translation id="3182749001423093222">Correcteur orthographique</translation> <translation id="3183139917765991655">Importateur de profils</translation> +<translation id="3184536091884214176">Configurer ou gérer les imprimantes CUPS. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mes fichiers</translation> <translation id="3188465121994729530">Moyenne mobile</translation> <translation id="3190558889382726167">Mot de passe enregistré</translation> @@ -1751,7 +1759,6 @@ <translation id="347670947055184738">Oups! Le système n'a pas réussi à récupérer la politique pour votre appareil.</translation> <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre microphone</translation> <translation id="3478685642445675458">Veuillez déverrouiller votre profil avant de supprimer une personne.</translation> -<translation id="3479539252931486093">C'était inattendu? <ph name="BEGIN_LINK" />Dites-le-nous<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Pas maintenant</translation> <translation id="3481268647794498892">Ouverture dans <ph name="ALTERNATIVE_BROWSER_NAME" /> dans <ph name="COUNTDOWN_SECONDS" /> secondes</translation> <translation id="3484273680291419129">Suppression du logiciel nuisible en cours…</translation> @@ -2258,6 +2265,7 @@ <translation id="4138267921960073861">Afficher les noms d'utilisateur et leur photo sur la page de connexion</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - appareil HID connecté</translation> <translation id="4142052906269098341">Déverrouillez votre <ph name="DEVICE_TYPE" /> avec votre téléphone. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Enregistrez les imprimantes détectées dans votre profil ou ajoutez-en une. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Obtenez une vidéo de meilleure qualité et économisez l'énergie de la pile. La vidéo sera lue uniquement sur votre écran compatible Google Cast.</translation> <translation id="4146026355784316281">Toujours ouvrir avec System Viewer</translation> <translation id="4146785383423576110">Réinitialiser et nettoyer</translation> @@ -2382,6 +2390,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation> <translation id="4364830672918311045">Afficher les notifications</translation> +<translation id="436499142539576997">Impossible d'obtenir les données de l'application qui tente toujours de s'exécuter…</translation> <translation id="4370975561335139969">L’adresse de courriel et le mot de passe que vous avez entrés ne correspondent pas</translation> <translation id="437184764829821926">Paramètres de police avancés</translation> <translation id="4374831787438678295">Installateur Linux</translation> @@ -2572,6 +2581,7 @@ <translation id="465878909996028221">Seuls les protocoles http, https et de fichiers sont pris en charge pour les redirections de navigateur.</translation> <translation id="4659077111144409915">Compte principal</translation> <translation id="4660476621274971848">Version « <ph name="NEW_ID" /> » reçue au lieu de la version « <ph name="EXPECTED_VERSION" /> » attendue</translation> +<translation id="4660838440047236328">la disposition de votre pièce</translation> <translation id="4662788913887017617">Partagez ce favori avec votre iPhone</translation> <translation id="4663373278480897665">La caméra est autorisée</translation> <translation id="4664482161435122549">Erreur d'exportation de fichiers PKCS n° 12</translation> @@ -2735,6 +2745,7 @@ <translation id="4900392736118574277">Votre page de démarrage a été remplacée par <ph name="URL" />.</translation> <translation id="4902546322522096650">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" /> %, connexion</translation> <translation id="49027928311173603">La règle téléchargée du serveur n'est pas valide : <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Configurer ou gérer les partages de fichiers sur le réseau. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Ce fichier n'est pas souvent téléchargé et peut être dangereux.</translation> <translation id="4907306957610201395">Catégorie d'autorisation</translation> <translation id="4908811072292128752">Ouvrez un nouvel onglet pour naviguer sur deux sites en même temps</translation> @@ -2822,6 +2833,7 @@ <translation id="5038863510258510803">Activation en cours…</translation> <translation id="5039804452771397117">Autoriser</translation> <translation id="5042282098504489593">Ouvrez le menu Paramètres pour connecter <ph name="USB_DEVICE_NAME" /> à Linux</translation> +<translation id="5043913660911154449">Ou encore, sélectionnez le fichier PPD de votre imprimante <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Mot de passe incorrect</translation> <translation id="504561833207953641">Ouverture dans une session de navigateur existante.</translation> <translation id="5047421709274785093">Bloquer l'utilisation de capteurs de mouvement et de luminosité par les sites</translation> @@ -3107,6 +3119,7 @@ <translation id="5464660706533281090">Ce paramètre ne peut pas être modifié par un utilisateur enfant.</translation> <translation id="5466374726908360271">Coller et rechercher « <ph name="SEARCH_TERMS" /> »</translation> <translation id="5468173180030470402">Recherche de partages de fichiers en cours…</translation> +<translation id="5470735824776589490">Vous devez redémarrer votre appareil avant de pouvoir faire une réinitialisation Powerwash. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Bonjour! Je suis votre voix pour la synthèse vocale.</translation> <translation id="5472133193607270166">Lorsque cette option est activée, les sites ne peuvent pas utiliser votre activité de navigation sur différents sites afin de personnaliser les annonces. Certains sites pourraient ne pas fonctionner correctement.</translation> <translation id="5473333559083690127">Entrez une autre fois le nouveau NIP</translation> @@ -3130,6 +3143,7 @@ <translation id="5496587651328244253">Organiser</translation> <translation id="5499313591153584299">Ce fichier peut présenter un risque pour votre ordinateur.</translation> <translation id="5502500733115278303">Importés de Firefox</translation> +<translation id="5505264765875738116">Les sites ne peuvent pas vous demander l'autorisation d'envoyer des notifications</translation> <translation id="5505307013568720083">À court d'encre</translation> <translation id="5507756662695126555">Non-répudiation</translation> <translation id="5509693895992845810">Enreg&istrer sous...</translation> @@ -3344,6 +3358,7 @@ <translation id="5801568494490449797">Préférences</translation> <translation id="5804175651771201311">Itinérance désactivée</translation> <translation id="5804241973901381774">Autorisations</translation> +<translation id="5804427196348435412">Utiliser les appareils NFC</translation> <translation id="5805697420284793859">Gestionnaire de fenêtres</translation> <translation id="5806773519584576205">0° (par défaut)</translation> <translation id="5811750797187914944">Terminé</translation> @@ -3559,6 +3574,7 @@ <translation id="6096047740730590436">Ouvrir la version agrandie</translation> <translation id="6096326118418049043">Nom X.500</translation> <translation id="6097480669505687979">Si vous ne libérez d'espace, des utilisateurs et des données peuvent être supprimés automatiquement.</translation> +<translation id="6097600385983390082">Recherche vocale fermée</translation> <translation id="6098793583803863900">Un fichier inconnu est en cours d'analyse afin de vérifier que son contenu n'est pas dangereux.</translation> <translation id="6100736666660498114">Menu Démarrer</translation> <translation id="6101226222197207147">Nouvelle application installée (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">Utiliser la voix plutôt que le clavier par défaut</translation> <translation id="6234474535228214774">Installation en attente…</translation> <translation id="6237816943013845465">Permet de régler la résolution de votre écran</translation> +<translation id="6238624845858322552">Connecter à un appareil Bluetooth</translation> <translation id="6238767809035845642">Texte partagé à partir d'un autre appareil</translation> <translation id="6238923052227198598">Afficher la dernière note sur l'écran de verrouillage</translation> <translation id="6239558157302047471">Actualiser le &cadre</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, force du signal : <ph name="SIGNAL_STRENGTH" /> %, pile du téléphone : <ph name="BATTERY_STATUS" /> %, connexion</translation> <translation id="6268252012308737255">Ouvrir avec <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Les sites peuvent vous demander l'autorisation d'envoyer des notifications</translation> <translation id="6270770586500173387">Envoyer <ph name="BEGIN_LINK1" />des données relatives au système et aux applications<ph name="END_LINK1" /> et des <ph name="BEGIN_LINK2" />statistiques<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Une erreur (<ph name="ERROR" />) s'est produite pendant le téléchargement du plugiciel</translation> <translation id="6273677812470008672">Qualité</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">Compte</translation> <translation id="6298962879096096191">Utilisez Google Play pour installer des applications Android</translation> <translation id="630065524203833229">&Quitter</translation> +<translation id="6300718114348072351">Impossible de configurer automatiquement l'imprimante <ph name="PRINTER_NAME" />. Veuillez spécifier les détails avancés de l'imprimante. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Politique globale :</translation> <translation id="6307990684951724544">Système occupé</translation> <translation id="6308493641021088955">Service de connexion fourni par <ph name="EXTENSION_NAME" /></translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">Le nettoyage n'est pas accessible pour le moment.</translation> <translation id="6556866813142980365">Rétablir</translation> <translation id="6557290421156335491">Mes raccourcis</translation> +<translation id="6561560012278703671">Activer l'affichage discret des messages (permet d'empêcher les notifications de vous interrompre)</translation> <translation id="6561726789132298588">entrée</translation> <translation id="656293578423618167">Le chemin d'accès ou le nom du fichier est trop long. Veuillez raccourcir le nom ou enregistrer le fichier à un autre endroit.</translation> <translation id="6563469144985748109">Votre gestionnaire n'a pas encore donné son autorisation</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">Demander avant d'envoyer</translation> <translation id="6840184929775541289">N'est pas une autorité de certification</translation> <translation id="6841186874966388268">Erreurs</translation> +<translation id="6843267103192918276">Connectez-vous pour synchroniser vos favoris, votre historique, vos mots de passe et d'autres paramètres sur tous vos appareils. Vous serez également automatiquement connecté à vos services Google. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google est prêt</translation> <translation id="6845038076637626672">Ouvrir maximisé</translation> <translation id="6845325883481699275">Contribuer à améliorer la sécurité de Chrome</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">Vos accessoires Hangouts Meet sont prêts à être configurés.</translation> <translation id="744341768939279100">Créer un nouveau profil</translation> <translation id="7443806024147773267">Accédez à vos mots de passe lorsque vous êtes connecté à votre compte Google</translation> -<translation id="7444046173054089907">Ce site est bloqué</translation> <translation id="7444983668544353857">Désactiver <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installer automatiquement les applications</translation> <translation id="7450761244949417357">Ouverture dans <ph name="ALTERNATIVE_BROWSER_NAME" /> en cours…</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Supprimer cette personne</translation> <translation id="8215295261562449873">Sauvegarder mes applications et mes fichiers dans le dossier Téléchargements avant d'effectuer la mise à niveau de Linux.</translation> <translation id="8217399928341212914">Continuer à bloquer le téléchargement automatique de plusieurs fichiers</translation> +<translation id="8218847192766059983">Ajoutez des langues ou réorganisez la liste. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Vous bloquez habituellement les notifications. Pour autoriser ce site à vous envoyer des notifications, cliquez ici.</translation> <translation id="8225265270453771718">Partager la fenêtre d'une application</translation> <translation id="8225753906568652947">Utiliser vos offres</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Modifier</translation> <translation id="9066773882585798925">Lire à voix haute le texte à l'écran</translation> <translation id="9066782832737749352">Synthèse vocale</translation> +<translation id="9067559831321817373">Gérez vos comptes auxquels vous êtes connecté. Les sites Web, les applications et les extensions dans Chrome et dans Google Play peuvent utiliser ces comptes pour personnaliser votre expérience, selon les autorisations accordées. <a>En savoir plus</a></translation> <translation id="9068849894565669697">Sélectionner une couleur</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 0adb9a1..237dc04 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Petit problème… Le système n'a pas réussi à récupérer les règles pour votre appareil.</translation> <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre micro</translation> <translation id="3478685642445675458">Veuillez déverrouiller votre profil avant de supprimer une personne.</translation> -<translation id="3479539252931486093">S'agit-il d'une erreur inattendue ? <ph name="BEGIN_LINK" />Signalez-nous ce problème.<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Pas maintenant</translation> <translation id="3481268647794498892">Ouverture dans <ph name="ALTERNATIVE_BROWSER_NAME" /> dans <ph name="COUNTDOWN_SECONDS" /> secondes</translation> <translation id="3484273680291419129">Suppression du logiciel malveillant…</translation> @@ -4491,7 +4490,6 @@ <translation id="7442465037756169001">Votre matériel Hangouts Meet est prêt à être configuré.</translation> <translation id="744341768939279100">Créer un profil</translation> <translation id="7443806024147773267">Accédez à vos mots de passe chaque fois que vous êtes connecté à votre compte Google</translation> -<translation id="7444046173054089907">Ce site est bloqué</translation> <translation id="7444983668544353857">Désactiver <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installer automatiquement les applications</translation> <translation id="7450761244949417357">Ouverture dans <ph name="ALTERNATIVE_BROWSER_NAME" /> maintenant</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 521cfe0..141fe80 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Esta páxina non responde</translation> <translation id="1041263367839475438">Dispositivos dispoñibles</translation> <translation id="1042174272890264476">O ordenador tamén inclúe a biblioteca de <ph name="SHORT_PRODUCT_NAME" />. RLZ asigna unha etiqueta que non é exclusiva e sen identificación persoal para medir as buscas e o uso de <ph name="SHORT_PRODUCT_NAME" /> derivados dunha determinada campaña promocional. En ocasións estas etiquetas aparecen nas consultas de Busca de Google en <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Tamén queres borrar os datos destas aplicacións?</translation> <translation id="1045692658517323508">{0,plural, =1{Actualiza en 1 minuto}other{Actualiza en # minutos}}</translation> <translation id="1046635659603195359">Parece que xa configuraches a Voice Match co teu Asistente de Google noutro dispositivo. As gravacións anteriores pódense usar para crear un modelo de voz neste dispositivo. Esta acción debería levar menos dun minuto.</translation> <translation id="1047431265488717055">Copiar te&xto da ligazón</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Obter tecnoloxía de Google en Chrome</translation> <translation id="1147991416141538220">Para solicitar acceso, ponte en contacto co administrador deste dispositivo.</translation> <translation id="1149401351239820326">Mes de caducidade</translation> +<translation id="1150490752229770117">Esta é a última actualización automática de software e seguranza para este dispositivo (<ph name="DEVICE_TYPE" />). Se queres recibir futuras actualizacións, cambia a un modelo máis novo. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Lentes de sol</translation> <translation id="1151917987301063366">Permitir sempre a <ph name="HOST" /> acceder aos sensores</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> @@ -510,7 +512,9 @@ <translation id="1709217939274742847">Escolle o tícket que queres utilizar para a autenticación. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Recibe este contrasinal no iPhone</translation> <translation id="1712552549805331520">O URL <ph name="URL" /> quere almacenar datos de forma permanente no teu ordenador local</translation> +<translation id="1714644264617423774">Activa as funcións de accesibilidade para que o dispositivo resulte máis fácil de utilizar. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensores de movemento</translation> +<translation id="171824261579749339">Australiano <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1719312230114180055">Nota: É posible que a túa impresión dixital sexa menos segura que un contrasinal ou PIN fiables.</translation> <translation id="1720318856472900922">Autenticación do servidor TLS WWW</translation> @@ -772,6 +776,7 @@ <translation id="2096715839409389970">Borrar cookies de terceiros</translation> <translation id="2097372108957554726">Tes que iniciar sesión en Chrome para rexistrar novos dispositivos</translation> <translation id="2099172618127234427">Vas activar as funcións de depuración de Chrome OS que configurarán o daemon sshd e activarán o arranque desde unidades USB.</translation> +<translation id="2099625543891475722">as túas características físicas, como a altura</translation> <translation id="2099686503067610784">Queres eliminar o certificado do servidor "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Inicio de sesión automático</translation> <translation id="2101225219012730419">Versión:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">Crear un novo perfil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> quere verificar a túa identidade</translation> <translation id="2448312741937722512">Tipo</translation> +<translation id="2448734521821581858">As cookies son ficheiros creados polos sitios web e poden ser de dous tipos: propias ou de terceiros. As propias son as que crean os sitios que visitas. Neste caso, o sitio en cuestión aparece na barra de enderezos. As de terceiros son as que crean outros sitios. Parte do contido que ves nos sitios que visitas, como anuncios ou imaxes, pertence a eses outros sitios.</translation> <translation id="2450223707519584812">Non poderás engadir usuarios porque faltan as claves da API de Google. Consulta <ph name="DETAILS_URL" /> para obter máis información.</translation> <translation id="2450849356604136918">non hai visualizacións activas</translation> <translation id="2451298179137331965">2x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">Esgotouse o tempo de espera</translation> <translation id="2588636910004461974">Dispositivos de <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Realiza unha busca en Google ou escribe o URL</translation> +<translation id="2600522410036850735">Este dispositivo recibirá actualizacións de software e seguranza automáticas ata <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Máis información</a></translation> <translation id="2603115962224169880">Fai limpeza no ordenador</translation> <translation id="2603463522847370204">Abrir nunha ventá de &incógnito</translation> <translation id="2604255671529671813">Produciuse un erro de conexión de rede</translation> @@ -1420,7 +1427,7 @@ <translation id="2972581237482394796">&Refacer</translation> <translation id="2973324205039581528">Silenciar sitio</translation> <translation id="2977480621796371840">Quitar do grupo</translation> -<translation id="2979520980928493164">Unha aplicación Chrome máis rápida e en mellor estado</translation> +<translation id="2979520980928493164">Chrome máis rápido e en mellor estado</translation> <translation id="2979639724566107830">Abre o marcador nunha ventá nova</translation> <translation id="2981113813906970160">Mostrar cursor do rato grande</translation> <translation id="2982970937345031">Enviar informe de maneira anónima</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">Navegación segura (protección para ti e o teu dispositivo contra os sitios perigosos)</translation> <translation id="3182749001423093222">Corrector ortográfico</translation> <translation id="3183139917765991655">Importador de perfís</translation> +<translation id="3184536091884214176">Configurar ou xestionar impresoras CUPS. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Os meus ficheiros</translation> <translation id="3188465121994729530">Media de movemento</translation> <translation id="3190558889382726167">Gardouse o contrasinal</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">O sistema non puido obter a política do teu dispositivo.</translation> <translation id="347785443197175480">Continuar permitindo a <ph name="HOST" /> acceder á túa cámara e micrófono</translation> <translation id="3478685642445675458">Desbloquea o teu perfil antes de eliminar unha persoa.</translation> -<translation id="3479539252931486093">Ocorreu algo inesperado? <ph name="BEGIN_LINK" />Notificar<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Agora non</translation> <translation id="3481268647794498892">Abrirase a páxina no navegador <ph name="ALTERNATIVE_BROWSER_NAME" /> en <ph name="COUNTDOWN_SECONDS" /> segundos</translation> <translation id="3484273680291419129">Eliminando software daniño...</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">Mostrar nomes de usuario e fotos na pantalla de inicio de sesión</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: conectouse o dispositivo HID</translation> <translation id="4142052906269098341">Desbloquea o <ph name="DEVICE_TYPE" /> co teu teléfono. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Garda no teu perfil as impresoras detectadas ou engade unha impresora nova. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Consigue vídeo de mellor calidade e aforra batería. O vídeo só se reproducirá na pantalla compatible con Cast.</translation> <translation id="4146026355784316281">Abrir sempre co visualizador do sistema</translation> <translation id="4146785383423576110">Restablece e limpa</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">Melón</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartindo unha ventá.</translation> <translation id="4364830672918311045">Mostrar notificacións</translation> +<translation id="436499142539576997">Produciuse un erro ao obter os datos da aplicación, pero estase tentando executar de todas formas…</translation> <translation id="4370975561335139969">O correo electrónico e o contrasinal inseridos non coinciden</translation> <translation id="437184764829821926">Configuración de tipo de letra avanzada</translation> <translation id="4374831787438678295">Instalador de Linux</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">Só se poden redirixir a outro navegador os URL que utilicen os protocolos http, https e de ficheiro.</translation> <translation id="4659077111144409915">Conta principal</translation> <translation id="4660476621274971848">A versión esperada era "<ph name="EXPECTED_VERSION" />", pero a obtida foi "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">a distribución do teu cuarto</translation> <translation id="4662788913887017617">Comparte este marcador co iPhone</translation> <translation id="4663373278480897665">Permítese a cámara</translation> <translation id="4664482161435122549">Erro de exportación de PKCS #12</translation> @@ -2577,7 +2587,7 @@ <translation id="4665446389743427678">Eliminaranse todos os datos almacenados por <ph name="SITE" />.</translation> <translation id="4668721319092543482">Fai clic para activar <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Converter páxina</translation> -<translation id="46733273239502219">Tamén se borrarán os datos gardados sen conexión das aplicacións instaladas</translation> +<translation id="46733273239502219">Os datos sen conexión das aplicacións instaladas tamén se borrarán</translation> <translation id="4673442866648850031">Abre as ferramentas do lapis óptico ao extraelo</translation> <translation id="4677585247300749148">O URL <ph name="URL" /> quere responder a eventos de accesibilidade</translation> <translation id="4677772697204437347">Memoria da GPU</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">A páxina de inicio cambiou a <ph name="URL" />.</translation> <translation id="4902546322522096650">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, intensidade do sinal do <ph name="SIGNAL_STRENGTH" /> %, conectar</translation> <translation id="49027928311173603">A política descargada do servidor non é válida: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Configura ou xestiona sistemas de ficheiros compartidos en rede. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Este ficheiro non se descarga habitualmente e pode ser perigoso.</translation> <translation id="4907306957610201395">Categoría de permisos</translation> <translation id="4908811072292128752">Abre unha nova pestana para explorar dous sitios á vez</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">Activando...</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5042282098504489593">Para conectar o dispositivo <ph name="USB_DEVICE_NAME" /> con Linux, abre Configuración</translation> +<translation id="5043913660911154449">Tamén podes especificar o PPD da túa impresora <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Contrasinal incorrecto</translation> <translation id="504561833207953641">Abrindo nunha sesión xa aberta do navegador.</translation> <translation id="5047421709274785093">Impedir que os sitios utilicen sensores de movemento e de luz</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">Os nenos non poden cambiar esta opción de configuración.</translation> <translation id="5466374726908360271">Pegar e bu&scar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Buscando ficheiros compartidos</translation> +<translation id="5470735824776589490">É necesario reiniciar o dispositivo para poder restablecelo cun Powerwash. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Ola! Son a túa voz de síntese de voz.</translation> <translation id="5472133193607270166">Con esta opción activada, os sitios web non poden utilizar a túa actividade de navegación a través de distintos sitios para personalizar os anuncios. É posible que algúns sitios non funcionen correctamente.</translation> <translation id="5473333559083690127">Volve introducir o novo PIN</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">Organizar</translation> <translation id="5499313591153584299">É posible que este ficheiro sexa daniño para o teu ordenador.</translation> <translation id="5502500733115278303">Importados desde Firefox</translation> +<translation id="5505264765875738116">Os sitios non poden pedir permiso para enviar notificacións</translation> <translation id="5505307013568720083">Non hai tinta</translation> <translation id="5507756662695126555">Sen rexeitamento</translation> <translation id="5509693895992845810">Gardar &como...</translation> @@ -3264,7 +3278,7 @@ <translation id="5687326903064479980">Fuso horario</translation> <translation id="5689516760719285838">Localización</translation> <translation id="56907980372820799">Ligar datos</translation> -<translation id="5691180005790455277">Borraranse todos os datos e as cookies que almacenase<ph name="SITE_GROUP_NAME" /> e todos os sitios que formen parte dese grupo.</translation> +<translation id="5691180005790455277">Borraranse todos os datos e as cookies que almacenase <ph name="SITE_GROUP_NAME" /> e todos os sitios que formen parte dese grupo.</translation> <translation id="5691511426247308406">Familia</translation> <translation id="5692183275898619210">Finalizou a impresión</translation> <translation id="5696143504434933566">Informar dun uso inadecuado de <ph name="EXTENSION_NAME" /></translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">Preferencias</translation> <translation id="5804175651771201311">A itinerancia está desactivada</translation> <translation id="5804241973901381774">Permisos</translation> +<translation id="5804427196348435412">Utilizar dispositivos con NFC</translation> <translation id="5805697420284793859">Xestor de ventás</translation> <translation id="5806773519584576205">0° (predeterminado)</translation> <translation id="5811750797187914944">Todo listo</translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">Abrir de forma maximizada</translation> <translation id="6096326118418049043">Nome X.500</translation> <translation id="6097480669505687979">Se non liberas espazo, é posible que se eliminen usuarios e datos automaticamente.</translation> +<translation id="6097600385983390082">Pechouse a busca por voz</translation> <translation id="6098793583803863900">Estase analizando un ficheiro descoñecido para comprobar se o seu contido é perigoso.</translation> <translation id="6100736666660498114">Menú de inicio</translation> <translation id="6101226222197207147">Nova aplicación engadida (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">Uso predeterminado da voz en lugar do teclado</translation> <translation id="6234474535228214774">Pendente de instalación</translation> <translation id="6237816943013845465">Permíteche axustar a resolución de pantalla</translation> +<translation id="6238624845858322552">Conectar a un dispositivo Bluetooth</translation> <translation id="6238767809035845642">O texto compartiuse desde outro dispositivo</translation> <translation id="6238923052227198598">Conservar a última nota na pantalla de bloqueo</translation> <translation id="6239558157302047471">Volver cargar &marco</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, intensidade do sinal do <ph name="SIGNAL_STRENGTH" /> %, batería do teléfono ao <ph name="BATTERY_STATUS" /> %, conectar</translation> <translation id="6268252012308737255">Abrir con <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Os sitios poden pedir permiso para enviar notificacións</translation> <translation id="6270770586500173387">Enviar <ph name="BEGIN_LINK1" />información sobre o sistema e as aplicacións<ph name="END_LINK1" />, así como <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Produciuse un erro (<ph name="ERROR" />) ao descargar o plugin</translation> <translation id="6273677812470008672">Calidade</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">Conta</translation> <translation id="6298962879096096191">Utiliza Google Play para instalar aplicacións Android</translation> <translation id="630065524203833229">Sa&ír</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> non se puido configurar automaticamente. Indica os detalles avanzados da impresora. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Política global:</translation> <translation id="6307990684951724544">Sistema ocupado</translation> <translation id="6308493641021088955">Inicio de sesión fornecido por <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">A limpeza non está dispoñible</translation> <translation id="6556866813142980365">Refacer</translation> <translation id="6557290421156335491">Os meus atallos</translation> +<translation id="6561560012278703671">Utilizar mensaxaría máis silenciosa (impide que as notificacións te interrompan)</translation> <translation id="6561726789132298588">intro</translation> <translation id="656293578423618167">A ruta ou o nome do ficheiro é demasiado longo. Gárdao con outro nome máis curto ou noutra localización.</translation> <translation id="6563469144985748109">O teu xestor aínda non o aprobou</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">Preguntar antes de enviar</translation> <translation id="6840184929775541289">Non é unha autoridade de certificación</translation> <translation id="6841186874966388268">Erros</translation> +<translation id="6843267103192918276">Inicia sesión para ter os marcadores, o historial, os contrasinais e o resto da túa configuración en todos os teus dispositivos. Tamén iniciarás sesión automaticamente nos teus servizos de Google. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google está listo</translation> <translation id="6845038076637626672">Abrir a aplicación maximizada</translation> <translation id="6845325883481699275">Axudar a mellorar a seguranza de Chrome</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">O hardware de Hangouts Meet está listo para configurarse.</translation> <translation id="744341768939279100">Crear un novo perfil</translation> <translation id="7443806024147773267">Accede aos teus contrasinais sempre que teñas a sesión iniciada na túa Conta de Google</translation> -<translation id="7444046173054089907">Este sitio está bloqueado</translation> <translation id="7444983668544353857">Desactivar <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instala aplicacións automaticamente</translation> <translation id="7450761244949417357">Abrindo a páxina no navegador <ph name="ALTERNATIVE_BROWSER_NAME" /> agora</translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">Eliminar esta persoa</translation> <translation id="8215295261562449873">Antes de actualizar Linux, facer unha copia de seguranza das miñas aplicacións e ficheiros no cartafol Descargas.</translation> <translation id="8217399928341212914">Continuar bloqueando as descargas automáticas de varios ficheiros</translation> +<translation id="8218847192766059983">Engade idiomas ou reordena a lista. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Adoitas bloquear as notificacións. Para permitir que este sitio che envíe notificacións, fai clic aquí.</translation> <translation id="8225265270453771718">Compartir unha ventá dunha aplicación</translation> <translation id="8225753906568652947">Trocar as túas ofertas</translation> @@ -5644,6 +5665,7 @@ <translation id="9065203028668620118">Editar</translation> <translation id="9066773882585798925">Escoita o texto en voz alta</translation> <translation id="9066782832737749352">Síntese de voz</translation> +<translation id="9067559831321817373">Xestiona as contas nas que teñas a sesión iniciada. O sitios web, as aplicacións e as extensións de Chrome e Google Play poden utilizar estas contas para personalizar a túa experiencia, dependendo dos permisos. <a>Máis información</a></translation> <translation id="9068849894565669697">Seleccionar cor</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation> @@ -5716,7 +5738,7 @@ <translation id="9188732951356337132">Enviar datos de uso e de diagnóstico. Este dispositivo envía automaticamente datos de diagnóstico e de uso do dispositivo e das aplicacións a Google. Esta información non se utilizará para identificar o teu fillo, senón co obxectivo de aumentar a estabilidade do sistema e das aplicacións, e de realizar outras melloras. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android. Se está activada a opción de configuración Actividade web e das aplicacións adicional para o teu fillo, estes datos pódense gardar na súa Conta de Google <ph name="BEGIN_LINK2" />Máis información<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + clave precompartida</translation> <translation id="920045321358709304">Realizar a busca en <ph name="SEARCH_ENGINE" /></translation> -<translation id="9201023452444595544">Borraranse os datos que se gardaron sen conexión</translation> +<translation id="9201023452444595544">Todos os datos sen conexión borraranse</translation> <translation id="9201220332032049474">Opcións de bloqueo da pantalla</translation> <translation id="9203398526606335860">Creación de &perfís activada</translation> <translation id="9203904171912129171">Seleccionar un dispositivo</translation> @@ -5729,7 +5751,7 @@ <translation id="9220525904950070496">Quitar conta</translation> <translation id="9220820413868316583">Levanta o dedo e téntao de novo.</translation> <translation id="923467487918828349">Mostrar todo</translation> -<translation id="929117907539171075">Tamén se borrarán os datos gardados sen conexión da aplicación instalada</translation> +<translation id="929117907539171075">Os datos sen conexión da aplicación instalada tamén se borrarán</translation> <translation id="930268624053534560">Marcas de tempo detalladas</translation> <translation id="932327136139879170">Inicio</translation> <translation id="932508678520956232">Non se puido empezar a imprimir.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 5a3ae9b8..0ba6b4b 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">આ પેજ પ્રતિભાવ આપી રહ્યું નથી</translation> <translation id="1041263367839475438">ઉપલબ્ધ ડિવાઇસ</translation> <translation id="1042174272890264476">તમારા કમ્પ્યુટરની સાથે <ph name="SHORT_PRODUCT_NAME" /> ની RLZ લાઇબ્રેરી બિલ્ટ ઇન પણ આવે છે. RLZ વિશેષ પ્રચારાત્મક ઝુંબેશ દ્વારા ચલાવવામાં આવતી શોધ અને <ph name="SHORT_PRODUCT_NAME" /> ઉપયોગને માપવા માટે બિન-અદ્વિતીય, બિન-વ્યક્તિગત રૂપે ઓળખી શકાય તેવા ટૅગ સોંપે છે. આ લેબલ્સ કેટલીકવાર <ph name="PRODUCT_NAME" /> માં Google શોધ ક્વેરીઝમાં દેખાય છે.</translation> +<translation id="1043818413152647937">આ ઍપમાંથી પણ ડેટા સાફ કરીએ?</translation> <translation id="1045692658517323508">{0,plural, =1{1 મિનિટની અંદર અપડેટ કરો}one{# મિનિટની અંદર અપડેટ કરો}other{# મિનિટની અંદર અપડેટ કરો}}</translation> <translation id="1046635659603195359">એવું લાગી રહ્યું છે કે તમે પહેલેથી જ કોઈ અન્ય ડિવાઇસ પર તમારા Google આસિસ્ટંટ વડે Voice Matchનું સેટઅપ કર્યું છે. અગાઉની આ બધી રેકોર્ડિંગનો ઉપયોગ આ ડિવાઇસ પર વૉઇસ મૉડલ બનાવવા માટે કરી શકાશે. આમાં એક મિનિટ કરતાં પણ ઓછો સમય લાગે છે.</translation> <translation id="1047431265488717055">લિંક ટે&ક્સ્ટને કૉપિ કરો</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chromeમાં Google સ્માર્ટ મેળવો</translation> <translation id="1147991416141538220">ઍક્સેસ વિશે પૂછવા માટે આ ડિવાઇસના વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="1149401351239820326">સમય સમાપ્તિ મહિનો</translation> +<translation id="1150490752229770117">આ <ph name="DEVICE_TYPE" /> માટે આ છેલ્લું ઑટોમૅટિક સૉફ્ટવેર અને સુરક્ષા અપડેટ છે. ભાવિ અપડેટ મેળવવા માટે, નવા મૉડલ પર અપગ્રેડ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1150565364351027703">ગોગલ્સ</translation> <translation id="1151917987301063366"><ph name="HOST" />ને હંમેશાં સેન્સર ઍક્સેસ કરવાની મંજૂરી આપો</translation> <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation> @@ -507,7 +509,9 @@ <translation id="1709217939274742847">પ્રમાણીકરણના ઉપયોગ માટે કોઈ ટિકિટ પસંદ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1712349894969001173">તમારા iPhone પર આ પાસવર્ડ મેળવો</translation> <translation id="1712552549805331520"><ph name="URL" /> તમારા સ્થાનિક કમ્પ્યુટર પર કાયમી ધોરણે ડેટા સ્ટોર કરવા માગે છે</translation> +<translation id="1714644264617423774">તમારા ડિવાઇસને વાપરવાનું સરળ બનાવવા માટે ઍક્સેસિબિલિટી સુવિધાઓને ચાલુ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1717218214683051432">મોશન સેન્સર</translation> +<translation id="171824261579749339">ઑસ્ટ્રેલિયન <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="1718835860248848330">છેલ્લા એક કલાક</translation> <translation id="1719312230114180055">નોંધ: તમારી ફિંગરપ્રિન્ટ એક સશક્ત પાસવર્ડ અથવા PIN થી ઓછી સુરક્ષિત હોઇ શકે છે.</translation> <translation id="1720318856472900922">TLS WWW સર્વર પ્રમાણીકરણ</translation> @@ -769,6 +773,7 @@ <translation id="2096715839409389970">ત્રીજા પક્ષની કુકીને સાફ કરો</translation> <translation id="2097372108957554726">નવા ડિવાઇસને નોંધવા માટે તમારે Chromeમાં સાઇન ઇન કરવાની જરૂર છે</translation> <translation id="2099172618127234427">તમે Chrome OS ડિબગીંગ સુવિધાઓને ચાલુ કરી રહ્યાં છો જે sshd daemon સેટ કરશે અને USB ડ્રાઇવથી બૂટ કરવું ચાલુ કરશે.</translation> +<translation id="2099625543891475722">તમારા શારીરિક લક્ષણો, જેમ કે ઊંચાઈ</translation> <translation id="2099686503067610784">સર્વર પ્રમાણપત્ર "<ph name="CERTIFICATE_NAME" />"ને ડિલીટ કરી દઈએ?</translation> <translation id="2100273922101894616">સ્વતઃ સાઇન-ઇન</translation> <translation id="2101225219012730419">વર્ઝન:</translation> @@ -1023,6 +1028,7 @@ <translation id="2445484935443597917">એક નવી પ્રોફાઇલ બનાવો</translation> <translation id="2446585455334014596"><ph name="APP_NAME" />ને તમારી ઓળખ ચકાસવી છે</translation> <translation id="2448312741937722512">પ્રકાર</translation> +<translation id="2448734521821581858">કુકી એ તમે મુલાકાત લો છો તે વેબસાઇટ દ્વારા બનાવવામાં આવેલી ફાઇલો છે. કુકી બે પ્રકારની હોય છે: પહેલા પક્ષની કુકી જે તમે મુલાકાત લો છો તે સાઇટ દ્વારા બનાવવામાં આવે છે. સાઇટ ઍડ્રેસ બાર બતાવવામાં આવે છે. ત્રીજા પક્ષની કુકી અન્ય સાઇટ દ્વારા બનાવવામાં આવે છે. અમુક પ્રકારનું કન્ટેન્ટ આ સાઇટની માલિકીનું હોય છે, જેમ કે તમે મુલાકાત લો છો તે વેબસાઇટ પર તમે જુઓ છો તે જાહેરાતો અથવા છબીઓ.</translation> <translation id="2450223707519584812">તમે વપરાશકર્તાઓને ઉમેરવામાં સમર્થ થશો નહીં કારણ કે Google API કીઝ ખૂટે છે. વિગતો માટે <ph name="DETAILS_URL" /> જુઓ.</translation> <translation id="2450849356604136918">કોઈ દૃશ્ય નથી</translation> <translation id="2451298179137331965">2x</translation> @@ -1136,6 +1142,7 @@ <translation id="2587922766792651800">સમય સમાપ્ત થયો</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> પાસે ઉપલબ્ધ ડિવાઇસની શ્રેણી</translation> <translation id="2594999711683503743">Googleમાં શોધો અથવા URL ટાઇપ કરો</translation> +<translation id="2600522410036850735">આ ડિવાઇસને <ph name="MONTH_AND_YEAR" /> સુધી ઑટોમૅટિક સૉફ્ટવેર અને સુરક્ષા અપડેટ મળશે. <a target="_blank" href="<ph name="URL" />">વધુ જાણો</a></translation> <translation id="2603115962224169880">કમ્પ્યુટર સાફ કરો</translation> <translation id="2603463522847370204">&છુપી વિંડોમાં ખોલો</translation> <translation id="2604255671529671813">નેટવર્ક કનેક્શનમાં ભૂલ</translation> @@ -1556,6 +1563,7 @@ <translation id="3181954750937456830">Safe Browsing (તમારું અને તમારા ડિવાઇસનું જોખમી સાઇટથી રક્ષણ કરે છે)</translation> <translation id="3182749001423093222">જોડણીની તપાસ</translation> <translation id="3183139917765991655">પ્રોફાઇલ આયાતકાર</translation> +<translation id="3184536091884214176">CUPS પ્રિન્ટર સેટઅપ કરો અથવા મેનેજ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="3188257591659621405">મારી ફાઇલો</translation> <translation id="3188465121994729530">ચલ સરેરાશ</translation> <translation id="3190558889382726167">પાસવર્ડ સાચવ્યો</translation> @@ -1746,7 +1754,6 @@ <translation id="347670947055184738">અરેરે! તમારા ઉપકરણ માટે સિસ્ટમ નીતિ લાવવામાં નિષ્ફળ થયું.</translation> <translation id="347785443197175480">તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવા માટે <ph name="HOST" /> ને સતત મંજૂરી આપે છે </translation> <translation id="3478685642445675458">કોઇ વ્યક્તિને દૂર કરતા પહેલાં કૃપા કરીને તમારી પ્રોફાઇલ અનલૉક કરો.</translation> -<translation id="3479539252931486093">શું આ અનપેક્ષિત હતું? <ph name="BEGIN_LINK" />અમને જણાવો<ph name="END_LINK" /></translation> <translation id="3479552764303398839">હમણાં નહીં</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> સેકન્ડમાં <ph name="ALTERNATIVE_BROWSER_NAME" />માં ખુલી રહ્યું છે</translation> <translation id="3484273680291419129">નુકસાનકારક સૉફ્ટવેર દૂર કરી રહ્યાં છીએ...</translation> @@ -2253,6 +2260,7 @@ <translation id="4138267921960073861">સાઇન-ઇન સ્ક્રીન પર વપરાશકર્તા નામ અને ફોટો બતાવો</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID ડિવાઇસ કનેક્ટ કરેલું છે</translation> <translation id="4142052906269098341">તમારા ફોન વડે તમારું <ph name="DEVICE_TYPE" /> અનલૉક કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">શોધાયેલા બધાં પ્રિન્ટરને તમારી પ્રોફાઇલમાં સાચવો અથવા એક નવું પ્રિન્ટર ઉમેરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="4144218403971135344">બહેતર ક્વૉલિટીના વીડિઓ મેળવો અને બૅટરી આવરદા સાચવો. વીડિઓ માત્ર તમારી કાસ્ટ ચાલુ કરેલ હોય એવી સ્ક્રીન પર જ ચલાવવામાં આવશે.</translation> <translation id="4146026355784316281">હંમેશા સિસ્ટમ દર્શક સાથે ખોલો</translation> <translation id="4146785383423576110">રીસેટ કરો અને સાફ કરો</translation> @@ -2377,6 +2385,7 @@ <translation id="4364327530094270451">ટેટી</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, એક વિંડો શેર કરી રહી છે.</translation> <translation id="4364830672918311045">નોટિફિકેશન બતાવો</translation> +<translation id="436499142539576997">ઍપનો ડેટા મેળવવામાં નિષ્ફળ થયા, હજી પણ ઍપ ચલાવવાનો પ્રયાસ કરી રહ્યાં છીએ...</translation> <translation id="4370975561335139969">તમે દાખલ કરેલ ઇમેઇલ અને પાસવર્ડ મેળ ખાતા નથી</translation> <translation id="437184764829821926">વિગતવાર ફોન્ટ સેટિંગ્સ</translation> <translation id="4374831787438678295">Linux ઇન્સ્ટૉલર</translation> @@ -2567,6 +2576,7 @@ <translation id="465878909996028221">બ્રાઉઝર રીડાયરેક્ટ માટે માત્ર http, https અને ફાઇલ પ્રોટોકૉલ સમર્થિત છે.</translation> <translation id="4659077111144409915">પ્રાથમિક એકાઉન્ટ</translation> <translation id="4660476621274971848">અપેક્ષિત વર્ઝન "<ph name="EXPECTED_VERSION" />" છે, પરંતુ વર્ઝન "<ph name="NEW_ID" />" હતું.</translation> +<translation id="4660838440047236328">તમારા રૂમનો લેઆઉટ</translation> <translation id="4662788913887017617">તમારા iPhone સાથે આ બુકમાર્ક શેર કરો</translation> <translation id="4663373278480897665">કૅમેરાને મંજૂરી</translation> <translation id="4664482161435122549">PKCS #12 નિકાસ ભૂલ</translation> @@ -2730,6 +2740,7 @@ <translation id="4900392736118574277">તમારું સ્ટાર્ટઅપ પૃષ્ઠ, <ph name="URL" /> પર બદલવામાં આવ્યું હતું.</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" />માંથી નેટવર્ક <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />%, કનેક્ટ કરો</translation> <translation id="49027928311173603">સર્વરમાંથી ડાઉનલોડ કરેલી નીતિ અમાન્ય છે: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">નેટવર્ક ફાઇલ શેર સેટઅપ કરો અથવા મેનેજ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="4907161631261076876">આ ફાઇલ સામાન્ય રીતે ડાઉનલોડ કરવામાં આવતી નથી અને તે જોખમી હોઈ શકે છે.</translation> <translation id="4907306957610201395">પરવાનગી કૅટેગરી</translation> <translation id="4908811072292128752">બે સાઇટ એકસાથે બ્રાઉઝ કરવા માટે એક નવી ટૅબ ખોલો</translation> @@ -2817,6 +2828,7 @@ <translation id="5038863510258510803">સક્ષમ કરી રહ્યું છે...</translation> <translation id="5039804452771397117">મંજૂરી આપો</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />ને Linuxથી કનેક્ટ કરવા માટે સેટિંગ ખોલો</translation> +<translation id="5043913660911154449">તમારા પ્રિન્ટરની PPD ફાઇલનો ઉલ્લેખ કરો <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation> <translation id="504561833207953641">હાલના બ્રાઉઝર સત્રમાં ખોલી રહ્યા છીએ.</translation> <translation id="5047421709274785093">સાઇટને મોશન અને લાઇટ સેન્સરનો ઉપયોગ કરવાથી બ્લૉક કરો</translation> @@ -3102,6 +3114,7 @@ <translation id="5464660706533281090">બાળ વપરાશકર્તા આ સેટિંગમાં ફેરફાર કરી શકતા નથી.</translation> <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” પે&સ્ટ કરો અને શોધો</translation> <translation id="5468173180030470402">શેર કરેલી ફાઇલ માટે શોધી રહ્યાં છીએ</translation> +<translation id="5470735824776589490">તમારું ડિવાઇસ Powerwash સાથે રીસેટ થઈ શકે તે પહેલાં એકવાર ફરી શરૂ કરવું આવશ્યક છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="5471768120198416576">કેમ છો! હું તમારો ટેક્સ્ટ-ટુ-સ્પીચ વૉઇસ છું.</translation> <translation id="5472133193607270166">જ્યારે ચાલુ હોય, ત્યારે સાઇટ જાહેરાતોને વ્યક્તિગત બનાવવા માટે બધી અલગ-અલગ સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિનો ઉપયોગ કરી શકતી નથી. અમુક સાઇટ કદાચ યોગ્ય રીતે કાર્ય કરશે નહીં.</translation> <translation id="5473333559083690127">નવો PIN ફરીથી દાખલ કરો</translation> @@ -3125,6 +3138,7 @@ <translation id="5496587651328244253">ગોઠવો</translation> <translation id="5499313591153584299">આ ફાઇલ તમારા કમ્પ્યુટર માટે હાનિકારક હોઇ શકે છે.</translation> <translation id="5502500733115278303">Firefox પરથી આયાત કરેલું</translation> +<translation id="5505264765875738116">સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકશે નહીં</translation> <translation id="5505307013568720083">શાહી ખલાસ થઇ ગઇ છે</translation> <translation id="5507756662695126555">નૉન-રીપ્યૂડિએશન</translation> <translation id="5509693895992845810">આ &રૂપમાં સાચવો...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">પસંદગીઓ</translation> <translation id="5804175651771201311">રોમિંગ બંધ છે</translation> <translation id="5804241973901381774">પરવાનગીઓ</translation> +<translation id="5804427196348435412">NFC ડિવાઇસનો ઉપયોગ કરો</translation> <translation id="5805697420284793859">વિન્ડો મેનેજર</translation> <translation id="5806773519584576205">0° (ડિફૉલ્ટ)</translation> <translation id="5811750797187914944">બધું સેટ છે</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">મહત્તમ ખોલો</translation> <translation id="6096326118418049043">X.500 નામ</translation> <translation id="6097480669505687979">જો તમે સ્થાન ખાલી કરશો નહીં, તો વપરાશકર્તાઓ અને ડેટા આપમેળે દૂર કરવામાં આવી શકે છે.</translation> +<translation id="6097600385983390082">વૉઇસ શોધ બંધ કરી</translation> <translation id="6098793583803863900">જોખમી કન્ટેન્ટ માટે કોઈ અજાણી ફાઇલને સ્કૅન કરવામાં આવી રહી છે.</translation> <translation id="6100736666660498114">પ્રારંભ મેનૂ</translation> <translation id="6101226222197207147">નવી ઍપ્લિકેશન ઉમેરાઈ (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">કીબોર્ડને બદલે અવાજનો ઉપયોગ કરવા માટે ડિફૉલ્ટ</translation> <translation id="6234474535228214774">ઇન્સ્ટૉલ બાકી છે</translation> <translation id="6237816943013845465">તમને તમારું સ્ક્રીન રિઝોલ્યૂશન સમાયોજિત કરવાની મંજૂરી આપે છે</translation> +<translation id="6238624845858322552">બ્લૂટૂથ ડિવાઇસ સાથે કનેક્ટ કરો</translation> <translation id="6238767809035845642">બીજા ડિવાઇસ પરથી શેર કરવામાં આવેલી ટેક્સ્ટ</translation> <translation id="6238923052227198598">લૉક સ્ક્રીન પર એક એકદમ નવી નોંધ રાખો</translation> <translation id="6239558157302047471">&ફ્રેમ ફરીથી લોડ કરો</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" />માંથી <ph name="NETWORK_INDEX" /> નેટવર્ક, <ph name="PHONE_NAME" />, સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />%, ફોનની બૅટરી <ph name="BATTERY_STATUS" />%, કનેક્ટ કરો</translation> <translation id="6268252012308737255"><ph name="APP" /> સાથે ખોલો</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકે છે</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />સિસ્ટમ અને ઍપ્લિકેશન માહિતી<ph name="END_LINK1" /> અને <ph name="BEGIN_LINK2" />મેટ્રિક્સ<ph name="END_LINK2" /> મોકલો</translation> <translation id="6272643420381259437">પ્લગ-ઇનને ડાઉનલોડ કરવામાં (<ph name="ERROR" />) ભૂલ આવી હતી</translation> <translation id="6273677812470008672">ગુણવત્તા</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">એકાઉન્ટ</translation> <translation id="6298962879096096191">Android ઍપ્લિકેશનોને ઇન્સ્ટૉલ કરવા માટે Google Play નો ઉપયોગ કરો</translation> <translation id="630065524203833229">&બહાર નીકળો</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" />ને ઑટોમૅટિક રીતે ગોઠવી શકાતું નથી. કૃપા કરીને વિગતવાર પ્રિન્ટરની વિગતો જણાવો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="6305607932814307878">વૈશ્વિક નીતિ:</translation> <translation id="6307990684951724544">સિસ્ટમ વ્યસ્ત છે</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> દ્વારા આપવામાં આવેલું સાઇન-ઇન</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">ક્લીન અપ હાલમાં અનુપલબ્ધ છે</translation> <translation id="6556866813142980365">ફરી કરો</translation> <translation id="6557290421156335491">મારા શૉર્ટકટ</translation> +<translation id="6561560012278703671">ગુપચુપ મેસેજિંગનો ઉપયોગ કરો (તમને ખલેલ પહોંચાડે તેવા નોટિફિકેશન સંકેતોને બ્લૉક કરે છે)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="656293578423618167">ફાઇલ પાથ અથવા નામ ખૂબ લાંબા છે. કૃપા કરીને ટૂંકા નામથી બીજી જગ્યાએ સાચવો.</translation> <translation id="6563469144985748109">તમારા સંચાલકે હજી સુધી તેને મંજૂર કરેલ નથી</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">મોકલતાં પહેલાં પૂછો</translation> <translation id="6840184929775541289">કોઈ પ્રમાણન અધિકારી નથી</translation> <translation id="6841186874966388268">ભૂલો</translation> +<translation id="6843267103192918276">તમારા તમામ ડિવાઇસ પર તમારા બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને અન્ય સેટિંગ મેળવવા માટે સાઇન ઇન કરો. તમે તમારી Google સેવાઓમાં પર પણ ઑટોમૅટિક રીતે સાઇન ઇન થઈ જશો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="6843423766595476978">ઓકે Google તૈયાર છે</translation> <translation id="6845038076637626672">મહત્તમ ખોલો</translation> <translation id="6845325883481699275">Chrome સુરક્ષાને વધુ સારી બનાવવામાં સહાય કરો</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">તમારું Hangouts Meet hardware સેટ કરવા માટે તૈયાર છે.</translation> <translation id="744341768939279100">એક નવી પ્રોફાઇલ બનાવો</translation> <translation id="7443806024147773267">તમે જ્યારે પણ તમારા Google એકાઉન્ટમાં સાઇન ઇન કરેલું હોય ત્યારે તમારા પાસવર્ડને ઍક્સેસ કરો</translation> -<translation id="7444046173054089907">આ સાઇટ અવરોધિત છે</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> બંધ કરો</translation> <translation id="7448430327655618736">ઍપ ઑટોમૅટિક રીતે ઇન્સ્ટૉલ કરો</translation> <translation id="7450761244949417357">હમણાં <ph name="ALTERNATIVE_BROWSER_NAME" />માં ખુલી રહ્યું છે</translation> @@ -5025,6 +5045,7 @@ <translation id="8214962590150211830">આ વ્યક્તિને દૂર કરો</translation> <translation id="8215295261562449873">Linuxને અપગ્રેડ કરતા પહેલાં મારી ઍપ અને ફાઇલોનું ડાઉનલોડ ફોલ્ડરમાં બૅકઅપ લો.</translation> <translation id="8217399928341212914">બહુવિધ ફાઇલો આપમેળે ડાઉનલોડ કરવું અવરોધિત કરવાનું ચાલુ રાખો</translation> +<translation id="8218847192766059983">ભાષાઓ ઉમેરો અથવા સૂચિને પુનઃક્રમાંકિત કરો. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="8221491193165283816">તમે સામાન્ય રીતે નોટિફિકેશનને બ્લૉક કરો છો. આ સાઇટને તમને નોટિફિકેશન આપવાની મંજૂરી આપવા માટે, અહીં ક્લિક કરો.</translation> <translation id="8225265270453771718">ઍપ્લિકેશન વિંડો શેર કરો</translation> <translation id="8225753906568652947">તમારી ઑફરો રિડિમ કરો</translation> @@ -5638,6 +5659,7 @@ <translation id="9065203028668620118">ફેરફાર કરો</translation> <translation id="9066773882585798925">ટેક્સ્ટ મોટેથી વંચાતી સાંભળો</translation> <translation id="9066782832737749352">ટેક્સ્ટ-ટુ-સ્પીચ</translation> +<translation id="9067559831321817373">તમારા સાઇન ઇન કરેલા એકાઉન્ટ મેનેજ કરો. Chrome અને Google Playમાં રહેલી વેબસાઇટ, ઍપ અને એક્સ્ટેંશન, પરવાનગીઓના આધારે આ એકાઉન્ટનો ઉપયોગ તમારા અનુભવને ક્સ્ટમાઇઝ કરવા માટે કરી શકે છે. <a>વધુ જાણો</a></translation> <translation id="9068849894565669697">રંગ પસંદ કરો</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 24bd27d..575cbcf 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">इस पेज से जवाब नहीं मिल रहा है</translation> <translation id="1041263367839475438">उपलब्ध डिवाइस</translation> <translation id="1042174272890264476">आपके कंप्यूटर में पहले से ही <ph name="SHORT_PRODUCT_NAME" /> की RLZ लाइब्रेरी होती है. किसी खास प्रचार कैंपेन में इस्तेमाल हुई खोजों और <ph name="SHORT_PRODUCT_NAME" /> के इस्तेमाल को मापने के लिए, RLZ एक बिना-विशिष्ट, बिना निजी तौर वाला टैग तय करता है. कभी-कभी ये लेबल <ph name="PRODUCT_NAME" /> में 'Google सर्च' क्वेरी में दिखाई देते हैं.</translation> +<translation id="1043818413152647937">क्या आप इन ऐप्लिकेशन से डेटा भी मिटाना चाहते हैं?</translation> <translation id="1045692658517323508">{0,plural, =1{1 मिनट में अपडेट करें}one{# मिनट में अपडेट करें}other{# मिनट में अपडेट करें}}</translation> <translation id="1046635659603195359">ऐसा लगता है कि आपने पहले ही किसी दूसरे डिवाइस पर अपनी Google Assistant की मदद से Voice Match सेट अप कर लिया है. इस डिवाइस पर आवाज़ का नमूना बनाने के लिए इन पुरानी रिकॉर्डिंग का इस्तेमाल किया जा सकता है. इसमें एक मिनट से भी कम समय लगेगा.</translation> <translation id="1047431265488717055">लिंक ले&ख को कॉपी करें</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome में Google स्मार्ट पाएं</translation> <translation id="1147991416141538220">ऐक्सेस मांगने के लिए, इस डिवाइस के एडमिन से संपर्क करें.</translation> <translation id="1149401351239820326">समाप्ति माह</translation> +<translation id="1150490752229770117">इस <ph name="DEVICE_TYPE" /> के लिए अपने-आप होने वाला यह आखिरी साॅफ़्टवेयर और सुरक्षा अपडेट था. आने वाले समय में अपडेट पाने के लिए, नए माॅडल पर अपग्रेड करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1150565364351027703">धूप के चश्मे</translation> <translation id="1151917987301063366"><ph name="HOST" /> को सेंसर ऐक्सेस करने की हमेशा मंज़ूरी दें</translation> <translation id="1153356358378277386">युग्मित डिवाइस</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">पुष्टि करने के लिए टिकट चुनें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1712349894969001173">यह पासवर्ड अपने iPhone पर पाएं</translation> <translation id="1712552549805331520"><ph name="URL" /> आपके स्थानीय कंप्यूटर पर हमेशा के लिए डेटा संग्रहित करना चाहता है</translation> +<translation id="1714644264617423774">अपने डिवाइस को आसानी से इस्तेमाल करने के लिए सुलभता सुविधाएं चालू करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1717218214683051432">मोशन सेंसर</translation> +<translation id="171824261579749339">ऑस्ट्रेलियाई <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1718835860248848330">अंतिम घंटा</translation> <translation id="1719312230114180055">ध्यान दें: आपका फ़िंगरप्रिंट किसी मज़बूत पासवर्ड या पिन की तुलना में कम सुरक्षित हो सकता है.</translation> <translation id="1720318856472900922">TLS WWW सर्वर प्रमाणीकरण</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">तीसरे पक्ष की कुकी मिटाएं</translation> <translation id="2097372108957554726">नए डिवाइस रजिस्टर करने के लिए आपको Chrome में साइन इन करना होगा.</translation> <translation id="2099172618127234427">आप Chrome OS की डीबग करने वाली सुविधाएं चालू कर रहे हैं जिससे sshd daemon सेट हो जाएगा और यूएसबी डिवाइस से बूट करना चालू हो जाएगा.</translation> +<translation id="2099625543891475722">आपकी शारीरिक विशेषता, जैसे कि लंबाई</translation> <translation id="2099686503067610784">सर्वर प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" मिटाएं?</translation> <translation id="2100273922101894616">अपने आप साइन इन करने की सुविधा</translation> <translation id="2101225219012730419">वर्शन:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">नई प्रोफ़ाइल बनाएं</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> आपकी पहचान की पुष्टि करना चाहता है</translation> <translation id="2448312741937722512">प्रकार</translation> +<translation id="2448734521821581858">कुकी ऐसी फ़ाइलें होती हैं जिन्हें आपकी देखी जाने वाली वेबसाइटें बनाती हैं. कुकी दो तरह की होती हैं: पहले पक्ष की कुकी वह साइट बनाती है जिस पर आप जाते हैं. यह साइट, पता बार में दिखती है. तीसरे पक्ष की कुकी, अन्य साइटें बनाती हैं. इन साइटों पर विज्ञापन या इमेज जैसी कुछ ऐसी सामग्री होती है जो उस वेबसाइट पर दिखती है जिस पर आप जाते हैं.</translation> <translation id="2450223707519584812">आप उपयोगकर्ताओं को नहीं जोड़ सकेंगे क्योंकि Google API (एपीआई) कुंजियां मौजूद नहीं हैं. जानकारी के लिए <ph name="DETAILS_URL" /> देखें.</translation> <translation id="2450849356604136918">कोई सक्रिय दृश्य नहीं</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">समय खत्म</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> की ओर से डिवाइस</translation> <translation id="2594999711683503743">Google पर खोजें या URL टाइप करें</translation> +<translation id="2600522410036850735">इस डिवाइस को <ph name="MONTH_AND_YEAR" /> तक सॉफ़्टवेयर और सुरक्षा अपडेट अपने-आप मिलेंगे. <a target="_blank" href="<ph name="URL" />">ज़्यादा जानें</a></translation> <translation id="2603115962224169880">कंप्यूटर साफ़ करें</translation> <translation id="2603463522847370204">&गुप्त विंडो में खोलें</translation> <translation id="2604255671529671813">नेटवर्क कनेक्शन गड़बड़ी</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">सुरक्षित ब्राउज़िंग (आपकी और आपके डिवाइस की खतरनाक साइट से सुरक्षा करती है)</translation> <translation id="3182749001423093222">वर्तनी जांच</translation> <translation id="3183139917765991655">प्रोफ़ाइल आयातकर्ता</translation> +<translation id="3184536091884214176">CUPS प्रिंटर सेट अप या प्रबंधित करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="3188257591659621405">मेरी फ़ाइलें</translation> <translation id="3188465121994729530">गतिशील औसत</translation> <translation id="3190558889382726167">पासवर्ड सहेजा गया</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">ओह! सिस्टम आपके डिवाइस की नीति नहीं निकाल पाया.</translation> <translation id="347785443197175480"><ph name="HOST" /> को अपने कैमरे और माइक्रोफ़ोन को एक्सेस करते रहने दें</translation> <translation id="3478685642445675458">कृपया किसी व्यक्ति को निकालने से पहले अपनी प्रोफ़ाइल अनलॉक करें.</translation> -<translation id="3479539252931486093">क्या यह अनपेक्षित था? <ph name="BEGIN_LINK" />हमें बताएं<ph name="END_LINK" /></translation> <translation id="3479552764303398839">अभी नहीं</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> पर <ph name="COUNTDOWN_SECONDS" /> सेकंड में खाेला जा रहा है</translation> <translation id="3484273680291419129">नुकसान पहुंचाने वाला सॉफ़्टवेयर निकाला जा रहा है...</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">साइन इन स्क्रीन पर उपयोगकर्ता का नाम और फ़ोटो दिखाएं</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - एचआईडी डिवाइस कनेक्ट हो गया</translation> <translation id="4142052906269098341">अपने फ़ोन से <ph name="DEVICE_TYPE" /> को अनलॉक करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">अपनी प्रोफ़ाइल में वे प्रिंटर सेव करें जिनका पता लगाया जा चुका है या नया प्रिंटर जोड़ें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="4144218403971135344">बेहतर गुणवत्ता वाले वीडियो पाएं और बैटरी लाइफ़ बचाएं. वीडियो सिर्फ़ उस स्क्रीन पर चलेगा जिस पर आपने कास्ट करने की सुविधा चालू की है.</translation> <translation id="4146026355784316281">हमेशा सिस्टम व्यूअर से खोलें</translation> <translation id="4146785383423576110">रीसेट करें और साफ़ करें</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">खरबूजा</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> किसी विंडो को शेयर कर रहा है.</translation> <translation id="4364830672918311045">डिसप्ले नोटिफ़िकेशन</translation> +<translation id="436499142539576997">ऐप्लिकेशन का डेटा नहीं मिल सका, ऐप्लिकेशन चलाने की अब भी कोशिश की जा रही है...</translation> <translation id="4370975561335139969"> डाले गए ईमेल और पासवर्ड का मिलान नहीं हो रहा</translation> <translation id="437184764829821926">बेहतर फ़ॉन्ट सेटिंग</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">ब्राउज़र रीडायरेक्ट के लिए सिर्फ़ एचटीटीपी, एचटीटीपीएस और फ़ाइल प्रोटोकॉल काम करते हैं.</translation> <translation id="4659077111144409915">प्राथमिक खाता</translation> <translation id="4660476621274971848">अपेक्षित वर्शन "<ph name="EXPECTED_VERSION" />" है, लेकिन वर्शन "<ph name="NEW_ID" />" था</translation> +<translation id="4660838440047236328">आपके कमरे का लेआउट</translation> <translation id="4662788913887017617">इस बुकमार्क को अपने iPhone से शेयर करें</translation> <translation id="4663373278480897665">कैमरे की अनुमति है</translation> <translation id="4664482161435122549">PKCS #12 निर्यात गड़बड़ी</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">आपका स्टार्टअप पेज<ph name="URL" /> में बदल दिया गया था.</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" /> में से <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />%, कनेक्ट करें</translation> <translation id="49027928311173603">सर्वर से डाउनलोड की गई नीति अमान्य है: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">नेटवर्क फ़ाइल शेयर सेट अप या प्रबंधित करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="4907161631261076876">यह फ़ाइल आमतौर पर डाउनलोड नहीं की जाती है और यह खतरनाक हो सकती है.</translation> <translation id="4907306957610201395">अनुमति श्रेणी</translation> <translation id="4908811072292128752">एक बार में दो साइटें ब्राउज़ करने के लिए नया टैब खोलें</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">सक्षम किया जा रहा है...</translation> <translation id="5039804452771397117">अनुमति दें</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> काे Linux से कनेक्ट करने के लिए 'सेटिंग' खाेलें</translation> +<translation id="5043913660911154449">इसके अलावा, आप अपने PPD प्रिंटर की फ़ाइल दे सकते हैं <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ग़लत पासवर्ड</translation> <translation id="504561833207953641">मौजूदा ब्राउज़र सत्र में खुल रहा है.</translation> <translation id="5047421709274785093">गति और लाइट सेंसर का उपयोग करने से साइटों को रोकें</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">कोई भी बच्चा इस सेटिंग में बदलाव नहीं कर सकता.</translation> <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” को चिपकाएं और खोजें</translation> <translation id="5468173180030470402">फ़ाइल शेयर को ढूंढा जा रहा है</translation> +<translation id="5470735824776589490">डिवाइस को 'पावरवॉश' से रीसेट करने से पहले रीस्टार्ट करना ज़रूरी है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5471768120198416576">नमस्ते! मैं आपकी लिखाई को बोली में बदलने वाली आवाज़ हूं.</translation> <translation id="5472133193607270166">जब यह चालू होगा, तब साइटें अलग-अलग साइटों पर की गई आपकी ब्राउज़िंग गतिविधि का इस्तेमाल दर्शकों की पसंद को ध्यान में रखकर विज्ञापन दिखाने के लिए नहीं कर पाएंगी. कुछ साइटें शायद ठीक से काम नहीं करेंगी.</translation> <translation id="5473333559083690127">नया पिन फिर से डालें</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">व्यवस्थित करें</translation> <translation id="5499313591153584299">यह फ़ाइल आपके कंप्यूटर के लिए हानिकारक हो सकती है.</translation> <translation id="5502500733115278303">Firefox से आयात किया गया</translation> +<translation id="5505264765875738116">साइटें आपको सूचनाएं भेजने के लिए नहीं पूछ सकतीं</translation> <translation id="5505307013568720083">इंक खत्म हो गया है</translation> <translation id="5507756662695126555">गैर-अस्वीकरण</translation> <translation id="5509693895992845810">इस रूप में सेव करें...</translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">प्राथमिकताएं</translation> <translation id="5804175651771201311">रोमिंग बंद है</translation> <translation id="5804241973901381774">अनुमतियां</translation> +<translation id="5804427196348435412">NFC डिवाइस इस्तेमाल करें</translation> <translation id="5805697420284793859">विंडो मैनेजर</translation> <translation id="5806773519584576205">0° (डिफ़ॉल्ट)</translation> <translation id="5811750797187914944">पूरी तरह तैयार है</translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">बड़े दृश्य में खोलें</translation> <translation id="6096326118418049043">X.500 नाम</translation> <translation id="6097480669505687979">अगर आप स्थान खाली नहीं करते, तो उपयोगकर्ता और डेटा अपने आप निकाले जा सकते हैं.</translation> +<translation id="6097600385983390082">बोलकर खोजने की सुविधा बंद है</translation> <translation id="6098793583803863900">खतरनाक मानी जाने वाली सामग्री का पता लगाने के लिए एक अज्ञात फ़ाइल स्कैन की जा रही है.</translation> <translation id="6100736666660498114">स्टार्ट मेन्यू</translation> <translation id="6101226222197207147">नया ऐप्लिकेशन जोड़ा गया (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">कीबोर्ड के बजाय आवाज़ का इस्तेमाल करना डिफ़ॉल्ट करें</translation> <translation id="6234474535228214774">इंस्टॉल होना बाकी है</translation> <translation id="6237816943013845465">आपको अपना स्क्रीन रिज़ॉल्यूशन समायोजित करने देती है</translation> +<translation id="6238624845858322552">ब्लूटूथ डिवाइस से कनेक्ट करना</translation> <translation id="6238767809035845642">अन्य डिवाइस से शेयर किया गया टेक्स्ट</translation> <translation id="6238923052227198598">सबसे नया नोट लॉक स्क्रीन पर रखें</translation> <translation id="6239558157302047471">फ़्रेम को फिर लोड करें</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" /> में से <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="PHONE_NAME" />, सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />%, फ़ोन की बैटरी <ph name="BATTERY_STATUS" />%, कनेक्ट करें</translation> <translation id="6268252012308737255"><ph name="APP" /> में खोलें</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">साइटें आपको सूचनाएं भेजने के लिए पूछ सकती हैं</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />सिस्टम और ऐप्लिकेशन की जानकारी<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />मेट्रिक<ph name="END_LINK2" /> भेजें</translation> <translation id="6272643420381259437">प्लग इन को डाउनलोड करते समय एक गड़बड़ी (<ph name="ERROR" />) हुई थी</translation> <translation id="6273677812470008672">गुणवत्ता</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">खाता</translation> <translation id="6298962879096096191">Android ऐप्लिकेशन इंस्टॉल करने के लिए Google Play का उपयोग करें</translation> <translation id="630065524203833229">&बाहर निकलें</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> को अपने-आप कॉन्फ़िगर नहीं किया जा सका. कृपया प्रिंटर की बेहतर जानकारी के बारे में बताएं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="6305607932814307878">वैश्विक नीति:</translation> <translation id="6307990684951724544">सिस्टम व्यस्त है</translation> <translation id="6308493641021088955">साइन-इन की सुविधा <ph name="EXTENSION_NAME" /> ने दी है</translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">क्लीनअप अभी उपलब्ध नहीं है</translation> <translation id="6556866813142980365">फिर से करें</translation> <translation id="6557290421156335491">मेरे शॉर्टकट</translation> +<translation id="6561560012278703671">बिना आवाज़ के मैसेज पाएं (सूचनाओं में आवाज़ को रोकता है, ताकि आपके काम में रुकावट न आए)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">फ़ाइल पाथ या नाम बहुत बड़ा है. कृपया छोटे नाम के साथ या किसी दूसरी जगह पर सेव करें.</translation> <translation id="6563469144985748109">आपके प्रबंधक ने अभी तक इसकी अनुमति नहीं दी है</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">भेजने से पहले पूछें</translation> <translation id="6840184929775541289">एक प्रमाणन प्राधिकरण नहीं है</translation> <translation id="6841186874966388268">त्रुटियां</translation> +<translation id="6843267103192918276">अपने सभी डिवाइस पर बुकमार्क, इतिहास, पासवर्ड, और दूसरी तरह की सेटिंग पाने के लिए साइन इन करें. आप अपने-आप Google सेवाओं में भी साइन इन हो जाएंगे. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google पूरी तरह तैयार है</translation> <translation id="6845038076637626672">बड़े दृश्य में खोलें</translation> <translation id="6845325883481699275">'Chrome सुरक्षा' को बेहतर बनाने में मदद करें</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">आपका Hangouts Meet hardware सेट अप किए जाने के लिए तैयार है.</translation> <translation id="744341768939279100">नई प्रोफ़ाइल बनाएं</translation> <translation id="7443806024147773267">अपने Google खाते में साइन इन करके जब चाहें अपने पासवर्ड को ऐक्सेस करें</translation> -<translation id="7444046173054089907">यह साइट अवरोधित है</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> बंद करें</translation> <translation id="7448430327655618736">ऐप्लिकेशन को अपने आप इंस्टॉल करें</translation> <translation id="7450761244949417357">अभी <ph name="ALTERNATIVE_BROWSER_NAME" /> में खुल रहा है</translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">इस व्यक्ति को निकालें</translation> <translation id="8215295261562449873">Linux को बेहतर बनाने से पहले, डाउनलोड फ़ोल्डर में मेरे ऐप्लिकेशन और फ़ाइलों का बैक अप लें.</translation> <translation id="8217399928341212914">कई फ़ाइलों के अपने आप डाउनलोड होने को ब्लॉक करना जारी रखें</translation> +<translation id="8218847192766059983">भाषाएं जोड़ें या सूची का क्रम बदलें. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="8221491193165283816">आम तौर पर, आप सूचनाओंं पर रोक लगाते हैं. यह साइट आपको सूचना दिखा सके, इसके लिए यहां क्लिक करें.</translation> <translation id="8225265270453771718">ऐप्लिकेशन की विंडो शेयर करें</translation> <translation id="8225753906568652947">अपने ऑफ़र रिडीम करें</translation> @@ -5644,6 +5665,7 @@ <translation id="9065203028668620118">बदलाव करें</translation> <translation id="9066773882585798925">ज़ोर से पढ़ा गया लेख सुनें</translation> <translation id="9066782832737749352">लिखाई को बोली में बदलना</translation> +<translation id="9067559831321817373">अपने साइन इन किए गए खातों को प्रबंधित करें. Chrome और Google Play में वेबसाइट, ऐप्लिकेशन, और एक्सटेंशन, इन खातों का इस्तेमाल करके आपको पसंद के मुताबिक अनुभव दे सकते हैं. ऐसा आपकी अनुमतियों के आधार पर किया जाता है. <a>ज़्यादा जानें</a></translation> <translation id="9068849894565669697">रंग चुनें</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">ब्लूटूथ</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index a027589c..7190ba7 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ups! Sustav nije uspio dohvatiti pravila za vaš uređaj.</translation> <translation id="347785443197175480">Nastavi dopuštati hostu <ph name="HOST" /> pristup kameri i mikrofonu</translation> <translation id="3478685642445675458">Otključajte profil da biste mogli ukloniti osobu.</translation> -<translation id="3479539252931486093">Niste to očekivali? <ph name="BEGIN_LINK" />Javite nam<ph name="END_LINK" />.</translation> <translation id="3479552764303398839">Ne sada</translation> <translation id="3481268647794498892">Otvaranje u pregledniku <ph name="ALTERNATIVE_BROWSER_NAME" /> za <ph name="COUNTDOWN_SECONDS" /> s</translation> <translation id="3484273680291419129">Uklanjanje štetnog softvera...</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware spreman je za postavljanje.</translation> <translation id="744341768939279100">Izradi novi profil</translation> <translation id="7443806024147773267">Pristupite svojim zaporkama kad god ste prijavljeni u svoj Google račun</translation> -<translation id="7444046173054089907">Ova je web-lokacija blokirana</translation> <translation id="7444983668544353857">Onemogući <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automatsko instaliranje aplikacija</translation> <translation id="7450761244949417357">Otvara se u pregledniku <ph name="ALTERNATIVE_BROWSER_NAME" /> sad</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index bc2346b..bbd0b2b 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Az oldal nem válaszol</translation> <translation id="1041263367839475438">Rendelkezésre álló eszközök</translation> <translation id="1042174272890264476">Számítógépe a <ph name="SHORT_PRODUCT_NAME" /> RLZ-könyvtárát is tartalmazza beépítve. Az RLZ egy nem egyedi, személy szerinti azonosításra nem alkalmas címkét rendel hozzá a keresések és a <ph name="SHORT_PRODUCT_NAME" /> használatának egy adott promóciós kampány keretein belüli felméréséhez. Ezek a címkék időnként a <ph name="PRODUCT_NAME" /> Google-keresési lekérdezéseiben is feltűnnek.</translation> +<translation id="1043818413152647937">Ezekből az alkalmazásokból is törli az adatokat?</translation> <translation id="1045692658517323508">{0,plural, =1{1 percen belül frissítenie kell}other{# percen belül frissítenie kell}}</translation> <translation id="1046635659603195359">Úgy tűnik, hogy Google Segédjéhez már beállította a Voice Match funkciót valamelyik másik eszközön. Korábbi felvételeiből ezen az eszközön is létrehozhat hangmintát. Ez legfeljebb egy percet vesz igénybe.</translation> <translation id="1047431265488717055">Link szövegének má&solása</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google-funkciók a Chrome-ban</translation> <translation id="1147991416141538220">Hozzáférés kéréséhez forduljon az eszköz adminisztrátorához.</translation> <translation id="1149401351239820326">Lejárat hónapja</translation> +<translation id="1150490752229770117">Ez az utolsó automatikus szoftver- és biztonsági frissítés ehhez a <ph name="DEVICE_TYPE" /> eszközhöz. Ha a jövőben is szeretne frissítéseket kapni, váltson újabb modellre. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="1150565364351027703">Napszemüveg</translation> <translation id="1151917987301063366">A(z) <ph name="HOST" /> mindig hozzáférhet az érzékelőkhöz</translation> <translation id="1153356358378277386">Párosított eszközök</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Válassza ki a hitelesítéshez használni kívánt jegyet. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="1712349894969001173">Legyen meg ez a jelszó iPhone eszközén</translation> <translation id="1712552549805331520">A(z) <ph name="URL" /> webhely állandó jelleggel adatokat szeretne tárolni a helyi számítógépen</translation> +<translation id="1714644264617423774">Engedélyezheti a kisegítő lehetőségeket az eszköz használatának megkönnyítéséhez. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="1717218214683051432">Mozgásérzékelők</translation> +<translation id="171824261579749339">Ausztrál – <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Az elmúlt órából</translation> <translation id="1719312230114180055">Megjegyzés: Az ujjlenyomat kevésbé biztonságos, mint az erős jelszó vagy PIN-kód.</translation> <translation id="1720318856472900922">TLS WWW szerver hitelesítése</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Harmadik féltől származó cookie-k törlése</translation> <translation id="2097372108957554726">Új eszközök regisztrálásához be kell jelentkeznie a Chrome-ba</translation> <translation id="2099172618127234427">Ön engedélyezi a Chrome OS hibakeresési funkcióit, melyek be fogják állítani az sshd daemon szolgáltatást, és engedélyezni fogják az USB-meghajtókról való indítást.</translation> +<translation id="2099625543891475722">az Ön fizikai jellemzőiről, például a magasságáról;</translation> <translation id="2099686503067610784">Törli a(z) "<ph name="CERTIFICATE_NAME" />" szervertanúsítványt?</translation> <translation id="2100273922101894616">Automatikus bejelentkezés</translation> <translation id="2101225219012730419">Verzió:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Új profil létrehozása</translation> <translation id="2446585455334014596">A(z) <ph name="APP_NAME" /> ellenőrizni szeretné az Ön személyazonosságát</translation> <translation id="2448312741937722512">Típus</translation> +<translation id="2448734521821581858">A cookie-k a felkeresett webhelyek által létrehozott fájlok. Kétféle cookie-t különböztetünk meg: a belső cookie-kat a meglátogatott webhelyek hozzák létre. Az adott webhely a címsávban látható. A harmadik féltől származó cookie-kat más webhelyek hozzák létre. Ezek a webhelyek birtokolják a meglátogatott webhelyeken látható tartalom bizonyos részét (például hirdetéseket vagy képeket).</translation> <translation id="2450223707519584812">Nem tud majd hozzáadni felhasználókat, mert hiányoznak a Google API-kulcsok. Részletekért lásd: <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Nincs aktív nézet</translation> <translation id="2451298179137331965">2×</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Időtúllépés</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> gyártótól származó eszközök</translation> <translation id="2594999711683503743">Keressen a Google-lal, vagy írja be az URL-t</translation> +<translation id="2600522410036850735">Ez az eszköz a következő dátumig kapja meg automatikusan a szoftver- és biztonsági frissítéseket: <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">További információ.</a></translation> <translation id="2603115962224169880">A számítógép megtisztítása</translation> <translation id="2603463522847370204">Megnyitás &inkognitóablakban</translation> <translation id="2604255671529671813">Hálózati kapcsolati hiba</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Biztonságos Böngészés (megvédi Önt és eszközét a veszélyes webhelyekkel szemben)</translation> <translation id="3182749001423093222">Helyesírás-ellenőrzés</translation> <translation id="3183139917765991655">Profilimportáló</translation> +<translation id="3184536091884214176">CUPS-nyomtatók beállítása és kezelése. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="3188257591659621405">Saját fájlok</translation> <translation id="3188465121994729530">Mozgás átlaga</translation> <translation id="3190558889382726167">A jelszó mentése megtörtént</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Hoppá! A rendszer nem tudta lehívni az eszköz házirendjét.</translation> <translation id="347785443197175480">A(z) <ph name="HOST" /> továbbra is hozzáférhet az Ön kamerájához és mikrofonjához</translation> <translation id="3478685642445675458">Mielőtt eltávolítana valakit, oldja fel profilját.</translation> -<translation id="3479539252931486093">Ez váratlanul érte Önt? <ph name="BEGIN_LINK" />Tudassa velünk.<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ne most</translation> <translation id="3481268647794498892">Megnyitás a(z) <ph name="ALTERNATIVE_BROWSER_NAME" /> böngészőben <ph name="COUNTDOWN_SECONDS" /> másodperc múlva…</translation> <translation id="3484273680291419129">Kártékony szoftver eltávolítása…</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">Felhasználónevek és képek megjelenítése a bejelentkezési oldalon</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-eszköz csatlakoztatva</translation> <translation id="4142052906269098341">Feloldhatja <ph name="DEVICE_TYPE" /> eszközét telefonjával. <ph name="LINK_BEGIN" />További információ.<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Elmentheti az észlelt nyomtatókat a profiljába, vagy hozzáadhat új nyomtatót. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="4144218403971135344">Jobb videóminőséget és hosszabb akkumulátor-üzemidőt biztosít. A videókat csak a Cast-kompatibilis képernyőn játssza le a rendszer.</translation> <translation id="4146026355784316281">Megnyitás mindig a rendszer megtekintőjével</translation> <translation id="4146785383423576110">Visszaállítás és megtisztítás</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">Dinnye</translation> <translation id="4364567974334641491">A(z) <ph name="APP_NAME" /> megoszt egy ablakot.</translation> <translation id="4364830672918311045">Értesítések megjelenítése</translation> +<translation id="436499142539576997">Nem sikerült az alkalmazásadatok lekérése, de továbbra is próbálkozunk az alkalmazás futtatásával…</translation> <translation id="4370975561335139969">A megadott e-mail-cím és jelszó nem egyezik</translation> <translation id="437184764829821926">Speciális betűtípus-beállítások</translation> <translation id="4374831787438678295">Linux-telepítő</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">A böngészőátirányítások esetén csak a http-, https- és fájlprotokollok támogatottak.</translation> <translation id="4659077111144409915">Elsődleges fiók</translation> <translation id="4660476621274971848">A várt verzió „<ph name="EXPECTED_VERSION" />”, de a kapott verzió „<ph name="NEW_ID" />”</translation> +<translation id="4660838440047236328">a szoba elrendezéséről.</translation> <translation id="4662788913887017617">Ossza meg ezt a könyvjelzőt iPhone eszközével</translation> <translation id="4663373278480897665">Kamera engedélyezve</translation> <translation id="4664482161435122549">PKCS #12 exportálási hiba</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">Kezdőoldala a következőre módosult: <ph name="URL" />.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, csatlakozás</translation> <translation id="49027928311173603">A szerverről letöltött irányelv érvénytelen: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Hálózati fájlmegosztások beállítása, illetve kezelése. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="4907161631261076876">Ezt a fájlt nem töltik le gyakran, és veszélyes lehet.</translation> <translation id="4907306957610201395">Engedélykategória</translation> <translation id="4908811072292128752">Új lap megnyitása két webhely egyidejű böngészéséhez</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">Engedélyezés...</translation> <translation id="5039804452771397117">Engedélyezés</translation> <translation id="5042282098504489593">Ha csatlakoztatni szeretné a(z) <ph name="USB_DEVICE_NAME" /> eszközt a Linux rendszerhez, nyissa meg a Beállítások menüt</translation> +<translation id="5043913660911154449">Vagy adja meg a nyomtatóhoz tartozó PPD-fájlt – <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Helytelen jelszó</translation> <translation id="504561833207953641">Megnyitás meglévő böngésző-munkamenetben.</translation> <translation id="5047421709274785093">A mozgás- és fényérzékelők használatnak tiltása a webhelyek számára</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Ezt a beállítást nem módosíthatja gyermek felhasználó.</translation> <translation id="5466374726908360271">„<ph name="SEARCH_TERMS" />” be&illesztése és keresése</translation> <translation id="5468173180030470402">Fájlmegosztások keresése</translation> +<translation id="5470735824776589490">Mielőtt a Powerwash segítségével visszaállítaná, újra kell indítania az eszközt. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="5471768120198416576">Üdvözlöm! A szövegfelolvasó az én hangomon szólal majd meg.</translation> <translation id="5472133193607270166">Ha be van kapcsolva, a webhelyek nem használhatják fel az Ön különböző webhelyeken végzett böngészési tevékenységeit a hirdetések személyre szabásához. Előfordulhat, hogy ennek következtében egyes webhelyek nem működnek megfelelően.</translation> <translation id="5473333559083690127">Írja be újra az új PIN-kódot</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Rendezés</translation> <translation id="5499313591153584299">Ez a fájl káros lehet a számítógépre.</translation> <translation id="5502500733115278303">A Firefox alkalmazásból importálva</translation> +<translation id="5505264765875738116">A webhelyek nem kérdezhetnek rá, hogy küldjenek-e Önnek értesítéseket</translation> <translation id="5505307013568720083">Elfogyott a tinta</translation> <translation id="5507756662695126555">Letagadhatatlanság</translation> <translation id="5509693895992845810">Mentés &másként...</translation> @@ -3344,6 +3358,7 @@ <translation id="5801568494490449797">Beállítások</translation> <translation id="5804175651771201311">Roaming kikapcsolva</translation> <translation id="5804241973901381774">Engedélyek</translation> +<translation id="5804427196348435412">NFC-eszközök használata</translation> <translation id="5805697420284793859">Ablakkezelő</translation> <translation id="5806773519584576205">0° (alapértelmezett)</translation> <translation id="5811750797187914944">Minden kész</translation> @@ -3559,6 +3574,7 @@ <translation id="6096047740730590436">Megnyitás teljes méretben</translation> <translation id="6096326118418049043">X.500 név</translation> <translation id="6097480669505687979">Ha nem szabadít fel tárhelyet, előfordulhat, hogy a rendszer automatikusan eltávolít bizonyos felhasználókat és adatokat.</translation> +<translation id="6097600385983390082">Hangalapú keresés bezárva</translation> <translation id="6098793583803863900">A rendszer veszélyes tartalmakat keres egy ismeretlen fájlban.</translation> <translation id="6100736666660498114">Start menü</translation> <translation id="6101226222197207147">Új alkalmazás hozzáadva (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">Alapértelmezés szerint hang használata billentyűzet helyett</translation> <translation id="6234474535228214774">Telepítés függőben</translation> <translation id="6237816943013845465">Lehetővé teszi a képernyő felbontásának módosítását</translation> +<translation id="6238624845858322552">Csatlakozás Bluetooth-eszközhöz</translation> <translation id="6238767809035845642">Más eszközről megosztott szöveg</translation> <translation id="6238923052227198598">Legutóbbi jegyzet megtartása a lezárási képernyőn</translation> <translation id="6239558157302047471">&Keret újratöltése</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="PHONE_NAME" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, telefon akkumulátora: <ph name="BATTERY_STATUS" />%, csatlakozás</translation> <translation id="6268252012308737255">Megnyitás ezzel: <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">A webhelyek rákérdezhetnek, hogy küldjenek-e Önnek értesítéseket</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Redszer- és alkalmazásadatok<ph name="END_LINK1" />, valamint <ph name="BEGIN_LINK2" />mutatószámok<ph name="END_LINK2" /> küldése</translation> <translation id="6272643420381259437">Hiba (<ph name="ERROR" />) történt a beépülő modul letöltése során</translation> <translation id="6273677812470008672">Minőség</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">Fiók</translation> <translation id="6298962879096096191">A Google Play használata Android-alkalmazások telepítésére</translation> <translation id="630065524203833229">K&ilépés</translation> +<translation id="6300718114348072351">Nem sikerült a(z) <ph name="PRINTER_NAME" /> automatikus beállítása. Adja meg a nyomtató speciális adatait. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="6305607932814307878">Globális irányelvek:</translation> <translation id="6307990684951724544">A rendszer foglalt</translation> <translation id="6308493641021088955">A bejelentkezést biztosítja: <ph name="EXTENSION_NAME" /></translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">Az eltávolítási funkció jelenleg nem áll rendelkezésre</translation> <translation id="6556866813142980365">Újra</translation> <translation id="6557290421156335491">Saját parancsikonok</translation> +<translation id="6561560012278703671">Halkabb üzenetküldés használata (letiltja az értesítéseket, hogy ne zavarják meg Önt)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">A fájl elérési útja vagy neve túl hosszú. Kérjük, mentse rövidebb névvel, illetve másik helyre.</translation> <translation id="6563469144985748109">A kezelő még nem hagyta jóvá</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">Kérdezzen rá küldés előtt</translation> <translation id="6840184929775541289">Nem tanúsítványkibocsátó</translation> <translation id="6841186874966388268">Hibák</translation> +<translation id="6843267103192918276">Ha bejelentkezik, könyvjelzőit, előzményeit, jelszavait és egyéb beállításait az összes eszközéről elérheti. Ráadásul automatikusan bejelentkezik a Google-szolgáltatásokba is. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="6843423766595476978">Az Ok Google használatra kész</translation> <translation id="6845038076637626672">Megnyitás teljes méretben</translation> <translation id="6845325883481699275">Segítség a Chrome biztonságának továbberősítésében</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">A Hangouts Meet-hardver készen áll a beállításra.</translation> <translation id="744341768939279100">Új profil létrehozása</translation> <translation id="7443806024147773267">Bármikor hozzáférhet jelszavaihoz, ha be van jelentkezve Google-fiókjába.</translation> -<translation id="7444046173054089907">Ez a webhely le van tiltva</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> kikapcsolása</translation> <translation id="7448430327655618736">Alkalmazások automatikus telepítése</translation> <translation id="7450761244949417357">Megnyitás most a(z) <ph name="ALTERNATIVE_BROWSER_NAME" /> böngészőben</translation> @@ -5034,6 +5054,7 @@ <translation id="8214962590150211830">Személy eltávolítása</translation> <translation id="8215295261562449873">Alkalmazásaim és fájljaim biztonsági mentése a Letöltések mappába a Linux frissítése előtt.</translation> <translation id="8217399928341212914">Továbbra is tiltsa le több fájl automatikus letöltését</translation> +<translation id="8218847192766059983">Hozzáadhat nyelveket, és átrendezheti a listát. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation> <translation id="8221491193165283816">Ön általában letiltja az értesítéseket. Ha azt szeretné, hogy ez a webhely küldjön értesítéseket, kattintson ide.</translation> <translation id="8225265270453771718">Alkalmazásablak megosztása</translation> <translation id="8225753906568652947">Ajánlatok beváltása</translation> @@ -5647,6 +5668,7 @@ <translation id="9065203028668620118">Szerkesztés</translation> <translation id="9066773882585798925">Szöveg felolvastatása</translation> <translation id="9066782832737749352">Szövegfelolvasás</translation> +<translation id="9067559831321817373">Kezelheti a bejelentkezett fiókjait. A webhelyek, az alkalmazások, a Chrome-bővítmények és a Google Play – az engedélyektől függően – ezeket a fiókokat használhatják az élmény személyre szabására. <a>További információ.</a></translation> <translation id="9068849894565669697">Szín kiválasztása</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 7cd2bc3..f28ed52 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Էջը չի արձագանքում</translation> <translation id="1041263367839475438">Հասանելի սարքեր</translation> <translation id="1042174272890264476">Ձեր համակարգչում նաև առկա է <ph name="SHORT_PRODUCT_NAME" />-ի ներկառուցված RLZ գրադարանը: RLZ-ը նշանակում է ոչ եզակի, անձը չնույնացնող ներդիր` որոնումների և <ph name="SHORT_PRODUCT_NAME" />-ի օգտագործման չափումների համար` նախագծված հատուկ գովազդային արշավի կողմից: Այս պիտակները երբեմն ցուցադրվում են Google որոնման հարցումների մեջ <ph name="PRODUCT_NAME" />-ում:</translation> +<translation id="1043818413152647937">Նաև մաքրե՞լ այս հավելվածների տվյալները</translation> <translation id="1045692658517323508">{0,plural, =1{Թարմացրեք 1 րոպեից}one{Թարմացրեք # րոպեից}other{Թարմացրեք # րոպեից}}</translation> <translation id="1046635659603195359">Դուք արդեն կարգավորել եք Voice Match-ը այլ սարքում: Նախորդ ձայնագրությունները կարող են օգտագործվել ձեր ձայնի նմուշն այս սարքում ստեղծելու համար: Կարգավորումը կխլի մոտ մեկ րոպե:</translation> <translation id="1047431265488717055">Պատճենել հղման տեքստը</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google-ի տեխնոլոգիաներ Chrome-ում</translation> <translation id="1147991416141538220">Օգտագործելու թույլտվություն խնդրելու համար կապվեք այս սարքի ադմինիստրատորի հետ:</translation> <translation id="1149401351239820326">Ժամկետի սպառման ամիսը</translation> +<translation id="1150490752229770117">Սա ծրագրային և անվտանգության կարգավորումների վերջին ավտոմատ թարմացումն է այս <ph name="DEVICE_TYPE" /> սարքի համար։ Հետագա թարմացումները ստանալու համար անցեք ավելի նոր մոդելի։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Արևային ակնոց</translation> <translation id="1151917987301063366">Միշտ թույլ տալ <ph name="HOST" />-ին օգտագործել տվիչները</translation> <translation id="1153356358378277386">Զուգակցված սարքեր</translation> @@ -349,7 +351,7 @@ <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />-ի սպասում…</translation> <translation id="1495486559005647033">Եվս <ph name="NUM_PRINTERS" /> մատչելի սարք:</translation> <translation id="1495677929897281669">Վերադառնալ ներդիր</translation> -<translation id="1499271269825557605">Եթե ընդլայնումը ձեզ անհայտ է կամ եթե ձեր դիտարկիչը սխալներով է աշխատում, կարող եք անջատել կամ կարգավորել ընդլայնումներն այստեղ։</translation> +<translation id="1499271269825557605">Եթե ընդլայնումը ձեզ անծանոթ է, կամ եթե ձեր դիտարկիչը սխալներով է աշխատում, կարող եք անջատել կամ կարգավորել ընդլայնումներն այստեղ։</translation> <translation id="1500297251995790841">Անհայտ սարք [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Բազմակի մուտքի աշխատաշրջանում տիրոջ հաշիվը պետք է առաջին մուտք գործած հաշիվը լինի:</translation> <translation id="150411034776756821">Հեռացնել <ph name="SITE" /> կայքը</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Ընտրեք տոմս՝ նույնականացման համար օգտագործելու համար: <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Ստացեք այս գաղտնաբառը ձեր iPhone-ին</translation> <translation id="1712552549805331520"><ph name="URL" /> կայքն ուզում է ձեր համակարգչում տվյալներ մշտապես պահել</translation> +<translation id="1714644264617423774">Միացնել հատուկ գործառույթները՝ սարքն ավելի հեշտ օգտագործելու համար։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Շարժման տվիչներ</translation> +<translation id="171824261579749339">Ավստրալական <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Վերջին 1 ժամվա</translation> <translation id="1719312230114180055">Նկատի ունեցեք, որ ապակողպման հուսալի գաղտնաբառը կամ PIN կոդը կարող է մատնահետքից ավելի ապահով լինել:</translation> <translation id="1720318856472900922">TLS WWW սերվերի նույնականացում</translation> @@ -774,6 +778,7 @@ <translation id="2096715839409389970">Արգելափակել երրորդ կողմի քուքիները</translation> <translation id="2097372108957554726">Նոր սարքեր գրանցելու համար դուք պետք է մուտք գործեք Chrome</translation> <translation id="2099172618127234427">Դուք միացնում եք Chrome-ի օպերացիոն համակարգի վրիպազերծման գործառույթները, որոնք կկարգավորեն sshd daemon-ը և թույլ կտան սկզբնաբեռնել USB հիշասարքերից:</translation> +<translation id="2099625543891475722">ձեր ֆիզիկական բնութագրերը, օրինակ՝ հասակը</translation> <translation id="2099686503067610784">Ջնջե՞լ սերվերի «<ph name="CERTIFICATE_NAME" />» վկայագիրը:</translation> <translation id="2100273922101894616">Ավտոմատ մուտք</translation> <translation id="2101225219012730419">Տարբերակ՝</translation> @@ -1028,6 +1033,7 @@ <translation id="2445484935443597917">Ստեղծել նոր պրոֆիլ</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> հավելվածն ուզում է հաստատել ձեր ինքնությունը</translation> <translation id="2448312741937722512">Տեսակ</translation> +<translation id="2448734521821581858">Քուքիները ֆայլեր են, որոնք ստեղծվում են ձեր այցելած կայքերի կողմից։ Քուքիների երկու տեսակ կա. առաջին կողմի քուքիները ստեղծվում են ձեր այցելած կայքի կողմից։ Կայքը ցուցադրվում է հասցեագոտում։ Երրորդ կողմի քուքիները ստեղծվում են այլ կայքերի կողմից։ Այս կայքերն ունեն որոշակի բովանդակություն, օր․՝ գովազդ կամ պատկերներ, որոնք դուք տեսնում եք ձեր այցելած կայքում։</translation> <translation id="2450223707519584812">Դուք չեք կարող օգտատերեր ավելացնել, քանի որ Google API-ի բանալիները բացակայում են: Մանրամասների համար անցեք <ph name="DETAILS_URL" />:</translation> <translation id="2450849356604136918">Դիտման ակտիվ ռեժիմներ չկան</translation> <translation id="2451298179137331965">2x</translation> @@ -1041,7 +1047,7 @@ <translation id="2462724976360937186">Հավաստագրման կենտրոնի բանալու ID</translation> <translation id="2462752602710430187">Ավելացվեց <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP միջնորդ սերվեր</translation> -<translation id="2467267713099745100"><ph name="NETWORK_TYPE" /> network, off</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" /> ցանց, անջատած է</translation> <translation id="2468205691404969808">Օգտագործում է քուքիները՝ ձեր նախընտրանքները հիշելու համար, նույնիսկ եթե չեք այցելում այդ կայքեր</translation> <translation id="2468402215065996499">Տամագոչի</translation> <translation id="2469259292033957819">Դուք պահված տպիչներ չունեք։</translation> @@ -1141,6 +1147,7 @@ <translation id="2587922766792651800">Ժամանակը սպառվել է</translation> <translation id="2588636910004461974">Սարքեր <ph name="VENDOR_NAME" /> մատակարարից</translation> <translation id="2594999711683503743">Որոնեք Google-ում կամ մուտքագրեք հասցեն</translation> +<translation id="2600522410036850735">Մինչև <ph name="MONTH_AND_YEAR" /> սարքը կստանա ծրագրային և անվտանգության կարգավորումների ավտոմատ թարմացումներ։ <a target="_blank" href="<ph name="URL" />">Իմանալ ավելին</a></translation> <translation id="2603115962224169880">Մաքրեք համակարգիչը</translation> <translation id="2603463522847370204">Բացել &ինկոգնիտո պատուհանում</translation> <translation id="2604255671529671813">Ցանցի միացման սխալ</translation> @@ -1304,7 +1311,7 @@ <translation id="2806891468525657116">Դյուրանցումն արդեն գոյություն ունի</translation> <translation id="2807517655263062534">Ձեր ներբեռնած ֆայլերը կցուցադրվեն այստեղ</translation> <translation id="2809586584051668049">ու ևս <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation> -<translation id="2810390687497823527">Եթե ընդլայնումը ձեզ անհայտ է կամ եթե ձեր դիտարկիչը սխալներով է աշխատում, կարող եք անջատել կարգավորել ընդլայնումներն այստեղ։</translation> +<translation id="2810390687497823527">Եթե ընդլայնումը ձեզ անծանոթ է, կամ եթե ձեր դիտարկիչը սխալներով է աշխատում, կարող եք անջատել կամ կարգավորել ընդլայնումներն այստեղ։</translation> <translation id="2812049959647166806">Thunderbolt-ը չի աջակցվում</translation> <translation id="2812944337881233323">Դուրս եկեք հաշվից և նորից մուտք գործեք</translation> <translation id="2812989263793994277">Ցույց չտալ պատկերներ</translation> @@ -1561,6 +1568,7 @@ <translation id="3181954750937456830">Անվտանգ դիտարկում (պաշտպանում է ձեզ և ձեր սարքը վտանգավոր կայքերից)</translation> <translation id="3182749001423093222">Ուղղագրության ստուգում</translation> <translation id="3183139917765991655">Պրոֆիլի ներմուծիչ</translation> +<translation id="3184536091884214176">CUPS տպիչների կարգավորում և կառավարում <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Իմ ֆայլերը</translation> <translation id="3188465121994729530">Սահող միջին</translation> <translation id="3190558889382726167">Գաղտնաբառը պահվեց</translation> @@ -1751,7 +1759,6 @@ <translation id="347670947055184738">Համակարգին չհաջողվեց առբերել սարքի քաղաքականությունը։</translation> <translation id="347785443197175480">Շարունակել թույլ տալ <ph name="HOST" />-ին օգտագործել ձեր տեսախցիկն ու խոսափողը</translation> <translation id="3478685642445675458">Ապակողպեք ձեր պրոֆիլը նախքան որևէ մեկին հեռացնելը:</translation> -<translation id="3479539252931486093">Չէի՞ք սպասում: <ph name="BEGIN_LINK" />Տեղեկացրեք մեզ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Հիմա չէ</translation> <translation id="3481268647794498892">Կբացվի <ph name="ALTERNATIVE_BROWSER_NAME" /> դիտարկիչով <ph name="COUNTDOWN_SECONDS" /> վայրկյանից</translation> <translation id="3484273680291419129">Վնասարար ծրագրի հեռացում...</translation> @@ -2258,6 +2265,7 @@ <translation id="4138267921960073861">Մուտքի էկրանին ցույց տալ օգտանունները և լուսանկարները</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – միացված է HID սարք</translation> <translation id="4142052906269098341">Ապակողպեք <ph name="DEVICE_TYPE" /> սարքը ձեր հեռախոսով։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Պահեք հայտնաբերված տպիչները ձեր պրոֆիլում կամ ավելացրեք նորերը։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Այս գործառույթը կօգնի բարելավել տեսանյութի որակը և երկարացնել մարտկոցի կյանքը: Տեսանյութը կնվագարկվի միայն Cast աջակցող էկրաններին:</translation> <translation id="4146026355784316281">Միշտ բացել համակարգի դիտման ծրագրի միջոցով</translation> <translation id="4146785383423576110">Վերակայել և մաքրել</translation> @@ -2382,6 +2390,7 @@ <translation id="4364327530094270451">Սեխ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> հավելվածը կիսվում է պատուհանով:</translation> <translation id="4364830672918311045">Ցուցադրել ծանուցումները</translation> +<translation id="436499142539576997">Չհաջողվեց ստանալ հավելվածի տվյալները։ Դեռ փորձում ենք գործարկել հավելվածը...</translation> <translation id="4370975561335139969">Մուտքագրված էլփոստը և գաղտնաբառը չեն համընկնում</translation> <translation id="437184764829821926">Տառատեսակի լրացուցիչ կարգավորումներ</translation> <translation id="4374831787438678295">Լինուքսի տեղադրիչ</translation> @@ -2503,7 +2512,7 @@ <translation id="4549791035683739768">Անվտանգության բանալու վրա պահված մատնահետքեր չկան</translation> <translation id="4551763574344810652">Հետարկելու համար սեղմեք <ph name="MODIFIER_KEY_DESCRIPTION" /></translation> <translation id="4552089082226364758">Flash</translation> -<translation id="4552759165874948005">Ցանց՝ <ph name="NETWORK_TYPE" />, ազդանշանի ուժշգություն՝ <ph name="SIGNAL_STRENGTH" /></translation> +<translation id="4552759165874948005">Ցանց՝ <ph name="NETWORK_TYPE" />, ազդանշանի ուժգնություն՝ <ph name="SIGNAL_STRENGTH" /></translation> <translation id="4554591392113183336">Արտաքին ընդլայնումը ընթացիկի համեմատ ունի նույն կամ ավելի հին տարբերակ:</translation> <translation id="4555769855065597957">Ստվեր</translation> <translation id="4555863373929230635">Գաղտնաբառերը ձեր Google հաշվում պահելու համար մտեք հաշիվ և միացրեք համաժամացումը։</translation> @@ -2572,6 +2581,7 @@ <translation id="465878909996028221">Դիտարկիչի վերահասցեավորման համար աջակցվում են միայն http, https և ֆայլային հաղորդակարգերը</translation> <translation id="4659077111144409915">Հիմնական հաշիվ</translation> <translation id="4660476621274971848">Սպասված տարբերակը՝ «<ph name="EXPECTED_VERSION" />», ստացված տարբերակը՝ «<ph name="NEW_ID" />»</translation> +<translation id="4660838440047236328">ձեր սենյակի դասավորությունը</translation> <translation id="4662788913887017617">Օգտագործեք այս էջանիշը ձեր iPhone-ում</translation> <translation id="4663373278480897665">Տեսախցիկի օգտագործումը թույլատրված է</translation> <translation id="4664482161435122549">PKCS #12 Արտահանման սխալ</translation> @@ -2736,6 +2746,7 @@ <translation id="4900392736118574277">Մեկնարկի էջը փոխվել է: Նոր էջն է՝ <ph name="URL" />:</translation> <translation id="4902546322522096650">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />%, կապակցում</translation> <translation id="49027928311173603">Սերվերից ներբեռնված քաղաքականությունն անվավեր է՝ <ph name="VALIDATION_ERROR" />:</translation> +<translation id="4906490889887219338">Կարգավորել կամ կառավարել ցանցային պահեստը <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Այս ֆայլը ոչ սովորական կերպով է ներբեռնվել և կարող է վտանգավոր լինել:</translation> <translation id="4907306957610201395">Թույլտվության կատեգորիա</translation> <translation id="4908811072292128752">Բացեք նոր ներդիր՝ միաժամանակ երկու կայքում աշխատելու համար</translation> @@ -2823,6 +2834,7 @@ <translation id="5038863510258510803">Միացում…</translation> <translation id="5039804452771397117">Թույլ տալ</translation> <translation id="5042282098504489593">Անցեք Կարգավորումներ՝ <ph name="USB_DEVICE_NAME" /> սարքը Լինուքսին միացնելու համար</translation> +<translation id="5043913660911154449">Կամ նշեք ձեր տպիչի PPD ֆայլը <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Գաղտնաբառը սխալ է</translation> <translation id="504561833207953641">Բացվում է դիտարկիչի ընթացիկ աշխատաշրջանում։</translation> <translation id="5047421709274785093">Արգելել կայքերին օգտագործել շարժման և լուսավորության սենսորները</translation> @@ -3110,6 +3122,7 @@ <translation id="5464660706533281090">Այս կարգավորումը չի կարող փոխվել երեխայի կողմից։</translation> <translation id="5466374726908360271">Տեղադրել և որոնել «<ph name="SEARCH_TERMS" />»</translation> <translation id="5468173180030470402">Ընդհանուր ֆայլերի որոնում</translation> +<translation id="5470735824776589490">Պետք է վերագործարկեք սարքը՝ նախքան Powerwash կատարելը։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Ողջո՛ւյն: Ես տեքստի հնչեցման ձայնն եմ:</translation> <translation id="5472133193607270166">Երբ այս կարգավորումը միացված է, կայքերը չեն կարող օգտագործել ձեր այցելությունների պատմությունը՝ գովազդն անհատականացնելու նպատակով: Որոշ կայքեր կարող են սխալներով աշխատել:</translation> <translation id="5473333559083690127">Կրկին մուտքագրեք նոր PIN կոդը</translation> @@ -3133,6 +3146,7 @@ <translation id="5496587651328244253">Կազմակերպել</translation> <translation id="5499313591153584299">Այս ֆայլը կարող է վնասաբեր լինել ձեր համակարգչի համար:</translation> <translation id="5502500733115278303">Firefox-ից ներմուծված</translation> +<translation id="5505264765875738116">Կայքերը չեն կարող խնդրել ծանուցումներ ուղարկել</translation> <translation id="5505307013568720083">Թանաքը վերջացել է</translation> <translation id="5507756662695126555">Առանց մերժման</translation> <translation id="5509693895992845810">Պահել &որպես…</translation> @@ -3347,6 +3361,7 @@ <translation id="5801568494490449797">Նախընտրանքներ</translation> <translation id="5804175651771201311">Ռոումինգն անջատած է</translation> <translation id="5804241973901381774">Թույլտվություններ</translation> +<translation id="5804427196348435412">Օգտագործել NFC սարքերը</translation> <translation id="5805697420284793859">Պատուհանների կառավարիչ</translation> <translation id="5806773519584576205">0° (կանխադրված)</translation> <translation id="5811750797187914944">Պատրաստ է</translation> @@ -3562,6 +3577,7 @@ <translation id="6096047740730590436">Բացել առավելացված</translation> <translation id="6096326118418049043">X.500 անուն</translation> <translation id="6097480669505687979">Եթե չազատեք տարածք, օգտատերերն ու տվյալները կարող են ավտոմատ ջնջվել:</translation> +<translation id="6097600385983390082">Ձայնային որոնումը փակվեց</translation> <translation id="6098793583803863900">Անհայտ ֆայլում ստուգվում է վտանգավոր բովանդակության առկայությունը</translation> <translation id="6100736666660498114">Մեկնարկի ընտրացանկ</translation> <translation id="6101226222197207147">Ավելացվել է նոր հավելված (<ph name="EXTENSION_NAME" />)</translation> @@ -3657,6 +3673,7 @@ <translation id="6233154960150021497">Ըստ կանխադրման օգտագործվում է ձայնը՝ ստեղնաշարի փոխարեն</translation> <translation id="6234474535228214774">Սպասում է տեղադրման</translation> <translation id="6237816943013845465">Թույլ է տալիս կարգավորել էկրանի լուծաչափը</translation> +<translation id="6238624845858322552">Միանալ Bluetooth սարքին</translation> <translation id="6238767809035845642">Այլ սարքից ուղարկված տեքստ</translation> <translation id="6238923052227198598">Ցուցադրել վերջին նշումը կողպէկրանին</translation> <translation id="6239558157302047471">Վերաբեռնել &շրջանակը</translation> @@ -3683,6 +3700,7 @@ <translation id="6267547857941397424">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="PHONE_NAME" />, ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />%, մարտկոցի լիցքը՝ <ph name="BATTERY_STATUS" />%, կապակցում</translation> <translation id="6268252012308737255">Բացել <ph name="APP" />-ով</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Կայքերը կարող են խնդրել ծանուցումներ ուղարկել</translation> <translation id="6270770586500173387">Ուղարկել <ph name="BEGIN_LINK1" />համակարգի և հավելվածների մասին տեղեկությունները<ph name="END_LINK1" /> և այլ <ph name="BEGIN_LINK2" />ցուցանիշները<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Փլագինը ներբեռնելիս սխալ առաջացավ (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Որակյալ</translation> @@ -3704,6 +3722,7 @@ <translation id="629730747756840877">Հաշիվ</translation> <translation id="6298962879096096191">Android հավելվածներ տեղադրելու համար օգտագործել Google Play-ը</translation> <translation id="630065524203833229">Ե&լք</translation> +<translation id="6300718114348072351">Չհաջողվեց ավտոմատ կարգավորել <ph name="PRINTER_NAME" /> տպիչը։ Նշեք տպիչի վերաբերյալ լրացուցիչ մանրամասներ։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Գլոբալ քաղաքականություն՝</translation> <translation id="6307990684951724544">Համակարգը զբաղված է</translation> <translation id="6308493641021088955">Մուտք «<ph name="EXTENSION_NAME" />» ընդլայնման միջոցով</translation> @@ -3873,6 +3892,7 @@ <translation id="6555810572223193255">Մաքրիչը ներկայումս հասանելի չէ</translation> <translation id="6556866813142980365">Կրկնել</translation> <translation id="6557290421156335491">Իմ դյուրանցումները</translation> +<translation id="6561560012278703671">Օգտագործել ավելի հանգիստ հաղորդագրություններ (արգելափակում է շեղող ծանուցումները)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Ֆայլի ուղին կամ անունը չափազանց երկար է: Տվեք ավելի կարճ անուն կամ պահեք այլ տեղում:</translation> <translation id="6563469144985748109">Ձեր ադմինիստրատորը դեռ չի հաստատել</translation> @@ -4056,6 +4076,7 @@ <translation id="6840155290835956714">Հարցնել՝ մինչ ուղարկելը</translation> <translation id="6840184929775541289">Հավաստագրման կենտրոն չէ</translation> <translation id="6841186874966388268">Սխալներ</translation> +<translation id="6843267103192918276">Մուտք գործեք՝ ձեր էջանիշները, պատմությունը, գաղտնաբառերն ու մյուս կարգավորումները ձեր բոլոր սարքերում համաժամացնելու համար։ Դուք նաև ավտոմատ մուտք կգործեք ձեր Google ծառայություններ։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="6843423766595476978">«Ok Google»-ը կարգավորված է</translation> <translation id="6845038076637626672">Բացել առավելացված</translation> <translation id="6845325883481699275">Օգնել ավելի անվտանգ դարձնել Chrome-ը</translation> @@ -4472,7 +4493,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware-ը պատրաստ է կարգավորման։</translation> <translation id="744341768939279100">Ստեղծել նոր պրոֆիլ</translation> <translation id="7443806024147773267">Ձեր գաղտնաբառերը հասանելի կլինեն ամեն անգամ, երբ մտնեք ձեր Google հաշիվ</translation> -<translation id="7444046173054089907">Այս կայքն արգելափակված է</translation> <translation id="7444983668544353857">Անջատել <ph name="NETWORKDEVICE" />-ը</translation> <translation id="7448430327655618736">Ավտոմատ տեղադրել հավելվածներ</translation> <translation id="7450761244949417357">Բացվում է <ph name="ALTERNATIVE_BROWSER_NAME" /> դիտարկիչով</translation> @@ -5035,6 +5055,7 @@ <translation id="8214962590150211830">Հեռացնել այս անձին</translation> <translation id="8215295261562449873">Նախքան Լինուքսի նոր տարբերակին անցնելը պահուստավորել իմ հավելվածներն ու ֆայլերը «Ներբեռնումներ» պանակում։</translation> <translation id="8217399928341212914">Շարունակել արգելափակել բազմակի ֆայլերի ավտոմատ ներբեռնումները</translation> +<translation id="8218847192766059983">Ավելացրեք լեզուներ կամ վերադասավորեք ցանկը։ <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Դուք սովորաբար արգելափակում եք ծանուցումները։ Այս կայքում ծանուցումներ ստանալու համար սեղմեք այստեղ։</translation> <translation id="8225265270453771718">Կիսվեք հավելվածի պատուհանով</translation> <translation id="8225753906568652947">Օգտագործել բոնուսները</translation> @@ -5648,6 +5669,7 @@ <translation id="9065203028668620118">Փոփոխել</translation> <translation id="9066773882585798925">Հնչեցրեք տեքստը</translation> <translation id="9066782832737749352">Տեքստի հնչեցում</translation> +<translation id="9067559831321817373">Կառավարեք ձեր հաշիվները, որոնք մուտք եք գործել։ Chrome-ի և Google Play-ի կայքերը, հավելվածներն ու ընդլայնումները կարող են օգտագործել այս հաշիվները՝ ձեր աշխատանքն ըստ ձեր թույլտվությունների անհատականացնելու համար։ <a>Իմանալ ավելին</a></translation> <translation id="9068849894565669697">Ընտրեք գույնը</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index ea9b44f..36d997c0 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Halaman ini tidak merespons</translation> <translation id="1041263367839475438">Perangkat yang tersedia</translation> <translation id="1042174272890264476">Komputer Anda juga dilengkapi dengan perpustakaan RLZ <ph name="SHORT_PRODUCT_NAME" /> yang tertanam di dalamnya. RLZ menetapkan tag tak unik dan tidak dapat diidentifikasi secara pribadi untuk mengukur penelusuran dan penggunaan <ph name="SHORT_PRODUCT_NAME" /> yang didorong oleh kampanye promosi tertentu. Biasanya label ini muncul di kueri Google Penelusuran di <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Hapus data dari aplikasi ini juga?</translation> <translation id="1045692658517323508">{0,plural, =1{Update dalam 1 menit}other{Update dalam # menit}}</translation> <translation id="1046635659603195359">Sepertinya Anda sudah menyiapkan Voice Match dengan Asisten Google di perangkat lainnya. Rekaman sebelumnya tersebut dapat digunakan untuk membuat model suara di perangkat ini. Tindakan ini perlu waktu kurang dari satu menit.</translation> <translation id="1047431265488717055">Salin Te&ks Tautan</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Dapatkan kecanggihan Google di Chrome</translation> <translation id="1147991416141538220">Untuk meminta akses, hubungi administrator perangkat ini.</translation> <translation id="1149401351239820326">Bulan akhir masa berlaku</translation> +<translation id="1150490752229770117">Ini adalah update keamanan dan software otomatis yang terakhir untuk <ph name="DEVICE_TYPE" /> ini. Untuk mendapatkan update mendatang, upgrade ke model yang lebih baru. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Kacamata Hitam</translation> <translation id="1151917987301063366">Selalu izinkan <ph name="HOST" /> mengakses sensor</translation> <translation id="1153356358378277386">Perangkat dihubungkan</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Pilih tiket untuk digunakan dalam proses autentikasi. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Dapatkan sandi ini di iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> ingin menyimpan data di komputer lokal Anda secara permanen</translation> +<translation id="1714644264617423774">Aktifkan fitur aksesibilitas untuk membuat perangkat Anda lebih mudah digunakan. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensor gerakan</translation> +<translation id="171824261579749339">Australia <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="1718835860248848330">1 jam terakhir</translation> <translation id="1719312230114180055">Catatan: Sidik jari mungkin kurang aman dibandingkan dengan PIN atau sandi yang kuat.</translation> <translation id="1720318856472900922">Autentikasi Server TLS WWW</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Hapus cookie pihak ketiga</translation> <translation id="2097372108957554726">Anda perlu masuk ke Chrome untuk mendaftarkan perangkat baru</translation> <translation id="2099172618127234427">Anda mengaktifkan fitur debug Chrome OS yang akan menyiapkan daemon sshd dan memungkinkan booting dari perangkat USB.</translation> +<translation id="2099625543891475722">fitur fisik Anda, seperti tinggi badan</translation> <translation id="2099686503067610784">Hapus sertifikat server "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Login Otomatis</translation> <translation id="2101225219012730419">Versi:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Buat Profil Baru</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ingin memverifikasi identitas Anda</translation> <translation id="2448312741937722512">Jenis</translation> +<translation id="2448734521821581858">Cookie adalah file yang dibuat oleh situs yang Anda kunjungi. Terdapat dua jenis cookie: Cookie pihak pertama dibuat oleh situs yang Anda kunjungi. Situs tersebut ditampilkan di kolom URL. Cookie pihak ketiga dibuat oleh situs lain. Situs ini memiliki beberapa konten, seperti iklan atau gambar, yang dilihat di situs yang Anda kunjungi.</translation> <translation id="2450223707519584812">Anda tidak dapat menambahkan pengguna karena kunci API Google tidak ada. Buka <ph name="DETAILS_URL" /> untuk melihat detailnya.</translation> <translation id="2450849356604136918">Tidak ada tampilan aktif</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Waktu habis</translation> <translation id="2588636910004461974">Perangkat dari <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Telusuri di Google atau ketik URL</translation> +<translation id="2600522410036850735">Perangkat ini akan mendapatkan update software dan keamanan otomatis hingga <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Pelajari lebih lanjut</a></translation> <translation id="2603115962224169880">Bersihkan komputer</translation> <translation id="2603463522847370204">Buka di &jendela samaran</translation> <translation id="2604255671529671813">Error koneksi jaringan</translation> @@ -1558,6 +1565,7 @@ <translation id="3181954750937456830">Safe Browsing (melindungi Anda dan perangkat dari situs berbahaya)</translation> <translation id="3182749001423093222">Periksa ejaan</translation> <translation id="3183139917765991655">Pengimpor Profil</translation> +<translation id="3184536091884214176">Siapkan atau kelola printer CUPS. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="3188257591659621405">File saya</translation> <translation id="3188465121994729530">Rata-rata Perpindahan</translation> <translation id="3190558889382726167">Sandi tersimpan</translation> @@ -1748,7 +1756,6 @@ <translation id="347670947055184738">Maaf! Sistem gagal mengambil kebijakan untuk perangkat Anda.</translation> <translation id="347785443197175480">Terus izinkan <ph name="HOST" /> untuk mengakses kamera dan mikrofon Anda</translation> <translation id="3478685642445675458">Buka kunci profil sebelum menghapus orang.</translation> -<translation id="3479539252931486093">Apakah hal ini tidak diharapkan? <ph name="BEGIN_LINK" />Beri tahu kami<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Jangan sekarang</translation> <translation id="3481268647794498892">Membuka di <ph name="ALTERNATIVE_BROWSER_NAME" /> dalam <ph name="COUNTDOWN_SECONDS" /> detik</translation> <translation id="3484273680291419129">Menghapus software berbahaya...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">Tampilkan nama pengguna dan foto pada layar masuk</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - perangkat HID tersambung</translation> <translation id="4142052906269098341">Buka kunci <ph name="DEVICE_TYPE" /> Anda dengan ponsel. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Simpan printer yang terdeteksi ke profil Anda, atau tambahkan printer baru. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Dapatkan video yang berkualitas lebih baik dan hemat baterai. Video hanya akan diputar di layar yang kompatibel untuk Cast.</translation> <translation id="4146026355784316281">Selalu Buka Dengan Penampil Sistem</translation> <translation id="4146785383423576110">Setel ulang dan bersihkan</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> membagikan jendela.</translation> <translation id="4364830672918311045">Tampilkan notifikasi</translation> +<translation id="436499142539576997">Gagal mendapatkan data aplikasi, masih mencoba menjalankan aplikasi...</translation> <translation id="4370975561335139969">Email dan sandi yang Anda masukkan tidak cocok</translation> <translation id="437184764829821926">Setelan font lanjutan</translation> <translation id="4374831787438678295">Installer Linux</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">Hanya protokol file, http, dan https yang didukung untuk pengalihan browser.</translation> <translation id="4659077111144409915">Akun utama</translation> <translation id="4660476621274971848">Versi yang diharapkan "<ph name="EXPECTED_VERSION" />", namun versinya adalah "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">tata letak ruangan Anda</translation> <translation id="4662788913887017617">Bagikan bookmark ini dengan iPhone Anda</translation> <translation id="4663373278480897665">Kamera diizinkan</translation> <translation id="4664482161435122549">PKCS #12 Kesalahan Ekspor</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">Halaman awal diubah menjadi <ph name="URL" />.</translation> <translation id="4902546322522096650">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Sambungkan</translation> <translation id="49027928311173603">Kebijakan yang didownload dari server tidak valid: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Siapkan atau kelola berbagi file jaringan. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="4907161631261076876">File ini tidak biasa didownload dan mungkin berbahaya.</translation> <translation id="4907306957610201395">Kategori Izin</translation> <translation id="4908811072292128752">Buka tab baru untuk mengakses 2 situs sekaligus</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">Mengaktifkan...</translation> <translation id="5039804452771397117">Izinkan</translation> <translation id="5042282098504489593">Buka Setelan untuk menghubungkan <ph name="USB_DEVICE_NAME" /> ke Linux</translation> +<translation id="5043913660911154449">Atau tentukan PPD printer <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Sandi salah</translation> <translation id="504561833207953641">Membuka di sesi browser yang ada.</translation> <translation id="5047421709274785093">Blokir situs agar tidak menggunakan sensor gerakan dan cahaya</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">Setelan ini tidak dapat diubah oleh pengguna turunan.</translation> <translation id="5466374726908360271">Tempel dan telusuri “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Mencari berbagi file</translation> +<translation id="5470735824776589490">Mulai ulang diperlukan sebelum perangkat Anda dapat disetel ulang dengan Powerwash. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Halo! Saya suara text to speech Anda.</translation> <translation id="5472133193607270166">Jika diaktifkan, situs tidak dapat menggunakan aktivitas penjelajahan di situs lain untuk mempersonalisasi iklan. Beberapa situs mungkin tidak berfungsi dengan baik.</translation> <translation id="5473333559083690127">Masukkan lagi PIN baru</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">Atur</translation> <translation id="5499313591153584299">File ini mungkin berbahaya untuk komputer Anda.</translation> <translation id="5502500733115278303">Diimpor dari Firefox</translation> +<translation id="5505264765875738116">Situs tidak dapat meminta izin mengirimkan notifikasi</translation> <translation id="5505307013568720083">Kehabisan tinta</translation> <translation id="5507756662695126555">Non-repudiasi</translation> <translation id="5509693895992845810">Simp&an Sebagai...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">Preferensi</translation> <translation id="5804175651771201311">Roaming nonaktif</translation> <translation id="5804241973901381774">Izin</translation> +<translation id="5804427196348435412">Gunakan perangkat NFC</translation> <translation id="5805697420284793859">Window manager</translation> <translation id="5806773519584576205">0° (Default)</translation> <translation id="5811750797187914944">Semua siap</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">Buka yang dimaksimalkan</translation> <translation id="6096326118418049043">X.500 Name</translation> <translation id="6097480669505687979">Jika Anda tidak mengosongkan ruang penyimpanan, pengguna dan data dapat otomatis dihapus.</translation> +<translation id="6097600385983390082">Penelusuran suara ditutup</translation> <translation id="6098793583803863900">File tidak dikenal sedang dipindai untuk mendeteksi konten berbahaya.</translation> <translation id="6100736666660498114">Menu mulai</translation> <translation id="6101226222197207147">Aplikasi baru ditambahkan (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">Default untuk menggunakan suara, bukan keyboard</translation> <translation id="6234474535228214774">Penginstalan menunggu antrean</translation> <translation id="6237816943013845465">Memungkinkan Anda menyesuaikan resolusi layar</translation> +<translation id="6238624845858322552">Sambungkan ke perangkat Bluetooth</translation> <translation id="6238767809035845642">Teks yang dibagikan dari Perangkat Lain</translation> <translation id="6238923052227198598">Tampilkan catatan terbaru di layar kunci</translation> <translation id="6239558157302047471">Muat ulang &frame</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Baterai Ponsel <ph name="BATTERY_STATUS" />%, Sambungkan</translation> <translation id="6268252012308737255">Buka dengan <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Situs dapat meminta izin mengirimkan notifikasi</translation> <translation id="6270770586500173387">Kirim <ph name="BEGIN_LINK1" />informasi aplikasi dan sistem<ph name="END_LINK1" /> serta <ph name="BEGIN_LINK2" />metrik<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Terjadi kesalahan (<ph name="ERROR" />) saat mendownload plugin</translation> <translation id="6273677812470008672">Kualitas</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">Akun</translation> <translation id="6298962879096096191">Menggunakan Google Play untuk memasang aplikasi Android</translation> <translation id="630065524203833229">K&eluar</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> tidak dapat dikonfigurasi secara otomatis. Harap tentukan detail printer lanjutan. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Kebijakan Global:</translation> <translation id="6307990684951724544">Sistem sibuk</translation> <translation id="6308493641021088955">Login disediakan oleh <ph name="EXTENSION_NAME" /></translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">Pembersihan saat ini tidak tersedia</translation> <translation id="6556866813142980365">Urungkan</translation> <translation id="6557290421156335491">Pintasan saya</translation> +<translation id="6561560012278703671">Gunakan notifikasi yang lebih tenang (memblokir pop-up notifikasi agar tidak mengganggu Anda)</translation> <translation id="6561726789132298588">masuk</translation> <translation id="656293578423618167">Jalur atau nama file terlalu panjang. Simpan dengan nama yang lebih pendek atau ke lokasi lain.</translation> <translation id="6563469144985748109">Pengelola Anda belum menyetujuinya</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">Tanyakan sebelum mengirim</translation> <translation id="6840184929775541289">Bukan Otoritas Sertifikasi</translation> <translation id="6841186874966388268">Kesalahan</translation> +<translation id="6843267103192918276">Login untuk mendapatkan bookmark, histori, sandi, dan setelan lainnya di semua perangkat Anda. Anda juga akan dibuat login ke layanan Google secara otomatis. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google sudah siap</translation> <translation id="6845038076637626672">Buka yang Dimaksimalkan</translation> <translation id="6845325883481699275">Bantu meningkatkan keamanan Chrome</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">Hangouts Meet Hardware sudah bisa disiapkan.</translation> <translation id="744341768939279100">Buat profil baru</translation> <translation id="7443806024147773267">Akses sandi kapan pun Anda login ke Akun Google Anda</translation> -<translation id="7444046173054089907">Situs ini diblokir</translation> <translation id="7444983668544353857">Nonaktifkan <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Otomatis menginstal aplikasi</translation> <translation id="7450761244949417357">Membuka di <ph name="ALTERNATIVE_BROWSER_NAME" /> sekarang</translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">Hapus Orang ini</translation> <translation id="8215295261562449873">Cadangkan aplikasi dan file saya ke folder Download sebelum mengupgrade Linux.</translation> <translation id="8217399928341212914">Lanjutkan memblokir download otomatis beberapa file</translation> +<translation id="8218847192766059983">Tambahkan bahasa atau urutkan ulang daftar. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Anda biasanya memblokir notifikasi. Untuk mengizinkan situs ini memberi Anda notifikasi, klik di sini.</translation> <translation id="8225265270453771718">Bagikan jendela aplikasi</translation> <translation id="8225753906568652947">Ambil penawaran</translation> @@ -5644,6 +5665,7 @@ <translation id="9065203028668620118">Edit</translation> <translation id="9066773882585798925">Mendengar teks dibacakan dengan keras</translation> <translation id="9066782832737749352">Text-to-Speech</translation> +<translation id="9067559831321817373">Kelola akun yang login. Situs, aplikasi, serta ekstensi di Chrome dan Google Play mungkin menggunakan akun ini untuk menyesuaikan pengalaman Anda, bergantung pada setelan izin. <a>Pelajari lebih lanjut</a></translation> <translation id="9068849894565669697">Pilih warna</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 1cb1dd5a..3ecd85d 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Úbbs! Kerfið gat ekki sótt stefnu úr tækinu þínu.</translation> <translation id="347785443197175480">Halda áfram að veita <ph name="HOST" /> aðgang að myndavélinni og hljóðnemanum</translation> <translation id="3478685642445675458">Opnaðu prófílinn þinn áður en aðili er fjarlægður.</translation> -<translation id="3479539252931486093">Bjóstu ekki við þessu? <ph name="BEGIN_LINK" />Sendu okkur línu<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ekki núna</translation> <translation id="3481268647794498892">Opnar í <ph name="ALTERNATIVE_BROWSER_NAME" /> eftir <ph name="COUNTDOWN_SECONDS" /> sekúndur</translation> <translation id="3484273680291419129">Fjarlægir skaðlegan hugbúnað...</translation> @@ -3502,7 +3501,7 @@ <translation id="6007240208646052708">Raddleit er ekki í boði á þínu tungumáli.</translation> <translation id="6009781704028455063">Innbyggður skynjari</translation> <translation id="6010869025736512584">Fær aðgang að myndinntaki</translation> -<translation id="6011074160056912900">Ethernet-net</translation> +<translation id="6011074160056912900">Ethernet</translation> <translation id="6011193465932186973">Fingrafar</translation> <translation id="6011449291337289699">Hreinsa vefsvæðagögn</translation> <translation id="6015266928248016057">Ógilt PUK-númer. Tilraunir eftir: <ph name="RETRIES" />.</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware er reiðubúinn til uppsetningar.</translation> <translation id="744341768939279100">Búa til nýjan prófíl</translation> <translation id="7443806024147773267">Hafðu aðgang að aðgangsorðunum þínum hvenær sem þú ert skráð(ur) inn á Google reikninginn þinn</translation> -<translation id="7444046173054089907">Lokað er fyrir þetta vefsvæði</translation> <translation id="7444983668544353857">Slökkva á <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Setja forrit upp sjálfkrafa</translation> <translation id="7450761244949417357">Opnar núna í <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 0499f1b4..e0bddf8 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1757,7 +1757,6 @@ <translation id="347670947055184738">Spiacenti. Il sistema non è riuscito a recuperare le norme del tuo dispositivo.</translation> <translation id="347785443197175480">Continua a consentire l'accesso di <ph name="HOST" /> alla webcam e al microfono</translation> <translation id="3478685642445675458">Sblocca il tuo profilo prima di rimuovere una persona.</translation> -<translation id="3479539252931486093">Non era previsto? <ph name="BEGIN_LINK" />Contattaci<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Non adesso</translation> <translation id="3481268647794498892">Apertura in <ph name="ALTERNATIVE_BROWSER_NAME" /> tra <ph name="COUNTDOWN_SECONDS" /> secondi</translation> <translation id="3484273680291419129">Rimozione del software dannoso...</translation> @@ -4489,7 +4488,6 @@ <translation id="7442465037756169001">L'hardware Hangouts Meet è pronto per la configurazione.</translation> <translation id="744341768939279100">Crea un nuovo profilo</translation> <translation id="7443806024147773267">Puoi avere a disposizione le tue password ogni volta che accedi al tuo Account Google</translation> -<translation id="7444046173054089907">Questo sito è bloccato</translation> <translation id="7444983668544353857">Disabilita <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Consente di installare automaticamente le app</translation> <translation id="7450761244949417357">Apertura in <ph name="ALTERNATIVE_BROWSER_NAME" /> ora</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index c63c0f6a..c51f3e8 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1747,7 +1747,6 @@ <translation id="347670947055184738">אופס! המערכת לא הצליחה לשלוף מדיניות למכשיר שלך.</translation> <translation id="347785443197175480">המשך לאפשר ל-<ph name="HOST" /> לגשת למצלמה ולמיקרופון</translation> <translation id="3478685642445675458">יש לבטל את נעילת הפרופיל שלך לפני הסרה של משתמש מסוים.</translation> -<translation id="3479539252931486093">האם זה קרה באופן בלתי צפוי? <ph name="BEGIN_LINK" />ספר לנו על כך<ph name="END_LINK" /></translation> <translation id="3479552764303398839">לא עכשיו</translation> <translation id="3481268647794498892">ייפתח ב-<ph name="ALTERNATIVE_BROWSER_NAME" /> בעוד <ph name="COUNTDOWN_SECONDS" /> שניות</translation> <translation id="3484273680291419129">מסיר תוכנה מזיקה...</translation> @@ -4465,7 +4464,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware מוכן להגדרה.</translation> <translation id="744341768939279100">צור פרופיל חדש</translation> <translation id="7443806024147773267">לאחר שנכנסת לחשבון Google, הסיסמאות שלך תמיד זמינות</translation> -<translation id="7444046173054089907">האתר הזה חסום</translation> <translation id="7444983668544353857">השבת <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">התקנה אוטומטית של אפליקציות</translation> <translation id="7450761244949417357">נפתח ב-<ph name="ALTERNATIVE_BROWSER_NAME" /> עכשיו</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 3bdf380c..6596098 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">このページは応答していません</translation> <translation id="1041263367839475438">使用可能なデバイス</translation> <translation id="1042174272890264476">お使いのパソコンには <ph name="SHORT_PRODUCT_NAME" /> の RLZ ライブラリも組み込まれています。RLZ は、個人を特定できないタグを割り当てて、特定の販促キャンペーンで生じた検索や <ph name="SHORT_PRODUCT_NAME" /> の利用状況を計測します。これらのラベルは <ph name="PRODUCT_NAME" /> で Google 検索キーワード内に表示されることがあります。</translation> +<translation id="1043818413152647937">次のアプリのデータも削除しますか?</translation> <translation id="1045692658517323508">{0,plural, =1{1 分以内に更新してください}other{# 分以内に更新してください}}</translation> <translation id="1046635659603195359">別のデバイスの Google アシスタントで Voice Match をすでに設定しているようです。そこですでに登録してある音声を使ってこのデバイスで音声モデルを作成できます。処理にかかる時間は 1 分以内です。</translation> <translation id="1047431265488717055">リンクテキストをコピー(&X)</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome で Google の最先端技術を活用</translation> <translation id="1147991416141538220">アクセスをリクエストするには、このデバイスの管理者にご連絡ください。</translation> <translation id="1149401351239820326">有効期限(月)</translation> +<translation id="1150490752229770117">この <ph name="DEVICE_TYPE" /> でソフトウェアとセキュリティの自動アップデートが行われるのは今回が最後です。今後もアップデートを取得するには、新しいモデルにアップグレードしてください。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="1150565364351027703">サングラス</translation> <translation id="1151917987301063366"><ph name="HOST" /> によるセンサーへのアクセスを常に許可する</translation> <translation id="1153356358378277386">ペア設定されたデバイス</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">認証に使用するチケットを選択します。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="1712349894969001173">このパスワードを iPhone で取得</translation> <translation id="1712552549805331520"><ph name="URL" /> から、ローカルのパソコンにデータを永続的に保存する許可を求められています</translation> +<translation id="1714644264617423774">ユーザー補助機能を有効にするとデバイスが使いやすくなります。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="1717218214683051432">モーション センサー</translation> +<translation id="171824261579749339">逆スクロール(<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" />)</translation> <translation id="1718835860248848330">1 時間以内</translation> <translation id="1719312230114180055">注: 指紋は複雑なパスワードや PIN より安全面で劣る場合があります。</translation> <translation id="1720318856472900922">TLS WWW サーバー認証</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">サードパーティの Cookie を消去</translation> <translation id="2097372108957554726">新しいデバイスを登録するには、Chrome にログインする必要があります</translation> <translation id="2099172618127234427">Chrome OS デバッグ機能を有効にしています。この機能を有効にすると、sshd デーモンが設定され USB デバイスからの起動が可能になります。</translation> +<translation id="2099625543891475722">あなたの身体的特徴(身長など)</translation> <translation id="2099686503067610784">サーバー証明書「<ph name="CERTIFICATE_NAME" />」を削除しますか?</translation> <translation id="2100273922101894616">自動ログイン</translation> <translation id="2101225219012730419">バージョン:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">新しいプロフィールを作成</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> が本人確認を求めています</translation> <translation id="2448312741937722512">種類</translation> +<translation id="2448734521821581858">Cookie は、アクセスしたウェブサイトによって作成されるファイルです。Cookie には 2 種類あります。1 つ目の「ファーストパーティの Cookie」は、現在アクセスしているサイト、つまりアドレスバーに表示されているサイトによって作成されます。2 つ目の「サードパーティの Cookie」は、他のサイト、つまりアクセス中のウェブサイトに表示されているコンテンツの一部(広告、画像など)を所有しているサイトによって作成されます。</translation> <translation id="2450223707519584812">Google API キーがないため、ユーザーを追加できません。詳しくは、<ph name="DETAILS_URL" /> をご覧ください。</translation> <translation id="2450849356604136918">アクティブ ビューなし</translation> <translation id="2451298179137331965">2 倍</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">タイムアウトしました</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> のデバイス</translation> <translation id="2594999711683503743">Google で検索、または URL を入力</translation> +<translation id="2600522410036850735">このデバイスでは、<ph name="MONTH_AND_YEAR" />までソフトウェアとセキュリティが自動更新されます。<a target="_blank" href="<ph name="URL" />">詳細</a></translation> <translation id="2603115962224169880">パソコンのクリーンアップ</translation> <translation id="2603463522847370204">シークレット ウィンドウで開く(&I)</translation> <translation id="2604255671529671813">ネットワーク接続エラー</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">セーフ ブラウジング(危険なサイトからユーザーとデバイスを保護します)</translation> <translation id="3182749001423093222">スペルチェック</translation> <translation id="3183139917765991655">プロフィール インポーター</translation> +<translation id="3184536091884214176">CUPS プリンタを設定または管理します。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="3188257591659621405">マイファイル</translation> <translation id="3188465121994729530">移動平均</translation> <translation id="3190558889382726167">パスワードを保存しました</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">デバイスのポリシーを取得できませんでした。</translation> <translation id="347785443197175480"><ph name="HOST" /> によるカメラとマイクへのアクセスを引き続き許可する</translation> <translation id="3478685642445675458">ユーザーを削除するにはまずプロフィールのロックを解除してください。</translation> -<translation id="3479539252931486093">想定外の動作である場合は、<ph name="BEGIN_LINK" />問題を報告<ph name="END_LINK" />してください。</translation> <translation id="3479552764303398839">後で</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> 秒後に <ph name="ALTERNATIVE_BROWSER_NAME" /> で開きます</translation> <translation id="3484273680291419129">有害なソフトウェアを削除しています...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">ログイン ページにユーザー名と写真を表示する</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID デバイスに接続中</translation> <translation id="4142052906269098341">スマートフォンを使って <ph name="DEVICE_TYPE" /> のロックを解除します。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">検出されたプリンタをプロフィールに保存するか、新しいプリンタを追加してください。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="4144218403971135344">動画の品質を向上させ、バッテリー消費を抑えます。動画はキャスト対応のスクリーンでのみ再生されます。</translation> <translation id="4146026355784316281">常にシステム ビューアで開く</translation> <translation id="4146785383423576110">リセットとクリーンアップ</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">メロン</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> がウィンドウを共有しています。</translation> <translation id="4364830672918311045">通知を表示</translation> +<translation id="436499142539576997">アプリのデータを取得できませんでした。引き続きアプリの実行を試みています...</translation> <translation id="4370975561335139969">入力したメールアドレスとパスワードが一致しません</translation> <translation id="437184764829821926">フォントの詳細設定</translation> <translation id="4374831787438678295">Linux インストーラ</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">ブラウザのリダイレクトでは、http、https、file プロトコルのみサポートされています。</translation> <translation id="4659077111144409915">メイン アカウント</translation> <translation id="4660476621274971848">バージョン「<ph name="EXPECTED_VERSION" />」が必要ですが、バージョン「<ph name="NEW_ID" />」が検出されました</translation> +<translation id="4660838440047236328">あなたの部屋のレイアウト</translation> <translation id="4662788913887017617">このブックマークは iPhone と共有できます</translation> <translation id="4663373278480897665">カメラを使用できます</translation> <translation id="4664482161435122549">PKCS #12 エクスポート エラー</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">起動ページが <ph name="URL" /> に変更されました。</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="NETWORK_NAME" />、<ph name="SECURITY_STATUS" />、信号強度 <ph name="SIGNAL_STRENGTH" />%、接続</translation> <translation id="49027928311173603">サーバーからダウンロードされたポリシーが無効です: <ph name="VALIDATION_ERROR" />。</translation> +<translation id="4906490889887219338">ネットワーク ファイル共有を設定または管理します。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="4907161631261076876">このファイルは一般的にダウンロードされているファイルではなく、危害を及ぼす可能性があります。</translation> <translation id="4907306957610201395">権限のカテゴリ</translation> <translation id="4908811072292128752">新しいタブを開いて 2 つのサイトを同時に閲覧できます</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">有効にしています...</translation> <translation id="5039804452771397117">許可</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> を Linux に接続する設定を開きます</translation> +<translation id="5043913660911154449">または、プリンタの PPD を指定してください(<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" />)</translation> <translation id="5045550434625856497">パスワードが正しくありません</translation> <translation id="504561833207953641">既存のブラウザ セッションで開いています。</translation> <translation id="5047421709274785093">サイトによるモーション センサーと光センサーの使用をブロックする</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">子ユーザーはこの設定を変更できません。</translation> <translation id="5466374726908360271">「<ph name="SEARCH_TERMS" />」を貼り付けて検索</translation> <translation id="5468173180030470402">ファイル共有を探しています</translation> +<translation id="5470735824776589490">デバイスを Powerwash でリセットするにはまず再起動が必要です。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="5471768120198416576">こんにちは。テキスト読み上げの音声です。</translation> <translation id="5472133193607270166">オンにすると、サイトはあなたが別のサイトで閲覧した内容に基づいて広告をカスタマイズできなくなります。一部のサイトは適切に機能しなくなる可能性があります。</translation> <translation id="5473333559083690127">新しい PIN を再入力</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">管理</translation> <translation id="5499313591153584299">このファイルはパソコンに危害を加える可能性があります。</translation> <translation id="5502500733115278303">Firefox ブックマーク</translation> +<translation id="5505264765875738116">通知を送信するかどうかの確認をサイトに許可しない</translation> <translation id="5505307013568720083">インクがありません</translation> <translation id="5507756662695126555">否認防止</translation> <translation id="5509693895992845810">別名で保存(&A)...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">設定</translation> <translation id="5804175651771201311">ローミング オフ</translation> <translation id="5804241973901381774">権限</translation> +<translation id="5804427196348435412">NFC デバイスの使用</translation> <translation id="5805697420284793859">ウィンドウ マネージャ</translation> <translation id="5806773519584576205">0°(デフォルト)</translation> <translation id="5811750797187914944">設定を完了</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">最大化して開く</translation> <translation id="6096326118418049043">X.500 名</translation> <translation id="6097480669505687979">空き領域を確保しない場合、ユーザーとデータが自動的に削除される可能性があります。</translation> +<translation id="6097600385983390082">音声検索が閉じられました</translation> <translation id="6098793583803863900">不明なファイルで危険なコンテンツがないかどうかのスキャンが行われています。</translation> <translation id="6100736666660498114">スタート メニュー</translation> <translation id="6101226222197207147">新しいアプリが追加されました(<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">キーボードではなく音声をデフォルトで使用します</translation> <translation id="6234474535228214774">インストールを準備しています</translation> <translation id="6237816943013845465">画面の解像度を調整できます</translation> +<translation id="6238624845858322552">Bluetooth デバイスに接続</translation> <translation id="6238767809035845642">他のデバイスから共有されたテキスト</translation> <translation id="6238923052227198598">ロック画面に最新のメモを表示する</translation> <translation id="6239558157302047471">フレームを再読み込み(&F)</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="PHONE_NAME" />、信号強度 <ph name="SIGNAL_STRENGTH" />%、電池残量 <ph name="BATTERY_STATUS" />%、接続</translation> <translation id="6268252012308737255"><ph name="APP" /> で開く</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">通知を送信するかどうかの確認をサイトに許可する</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />システムとアプリの情報<ph name="END_LINK1" />と<ph name="BEGIN_LINK2" />指標<ph name="END_LINK2" />を送信する</translation> <translation id="6272643420381259437">プラグインのダウンロード中にエラー(<ph name="ERROR" />)が発生しました。</translation> <translation id="6273677812470008672">品質</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">アカウント</translation> <translation id="6298962879096096191">Google Play を使用して Android アプリをインストールします</translation> <translation id="630065524203833229">終了(&X)</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> を自動的に設定できませんでした。プリンタの詳細設定を指定してください。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="6305607932814307878">グローバル ポリシー:</translation> <translation id="6307990684951724544">システムがビジー状態です</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> によるログイン</translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">現在、クリーンアップ ツールをご利用いただけません</translation> <translation id="6556866813142980365">やり直す</translation> <translation id="6557290421156335491">カスタム ショートカット</translation> +<translation id="6561560012278703671">静かな方法で通知する(割り込み通知を行わない)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="656293578423618167">ファイルのパスまたは名前が長すぎます。名前を短くするか、別の場所に保存してください。</translation> <translation id="6563469144985748109">管理者がまだサイトを開くことを許可していません</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">送信する前に確認する</translation> <translation id="6840184929775541289">認証局ではない</translation> <translation id="6841186874966388268">エラー</translation> +<translation id="6843267103192918276">ログインすると、どのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できます。また、利用している Google サービスでも自動的にログイン状態となります。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="6843423766595476978">OK Google の設定が完了しました</translation> <translation id="6845038076637626672">最大化して開く</translation> <translation id="6845325883481699275">Chrome のセキュリティ改善に協力する</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet ハードウェアを設定できます。</translation> <translation id="744341768939279100">新しいプロフィールを作成</translation> <translation id="7443806024147773267">Google アカウントにログインすれば、いつでもパスワードにアクセスできます。</translation> -<translation id="7444046173054089907">このサイトはブロックされています</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> を無効にする</translation> <translation id="7448430327655618736">アプリの自動インストール</translation> <translation id="7450761244949417357">まもなく <ph name="ALTERNATIVE_BROWSER_NAME" /> で開きます</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">このユーザーを削除</translation> <translation id="8215295261562449873">Linux をアップグレードする前に、アプリとファイルをダウンロード フォルダにバックアップします。</translation> <translation id="8217399928341212914">複数ファイルの自動ダウンロードを今後もブロックする</translation> +<translation id="8218847192766059983">言語を追加するか、リストを並べ替えます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation> <translation id="8221491193165283816">通知はデフォルトでブロックされています。このサイトの通知を表示するには、ここをクリックしてください。</translation> <translation id="8225265270453771718">アプリケーション ウィンドウの共有</translation> <translation id="8225753906568652947">特典を利用</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">編集</translation> <translation id="9066773882585798925">テキストを読み上げます</translation> <translation id="9066782832737749352">テキスト読み上げ</translation> +<translation id="9067559831321817373">ログインしているアカウントを管理します。Chrome と Google Play のウェブサイト、アプリ、拡張機能では、許可されている場合に、これらのアカウントを使用してユーザー エクスペリエンスのカスタマイズが行われることがあります。<a>詳細</a></translation> <translation id="9068849894565669697">色の選択</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index b61268c..41e3a39e 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">ეს გვერდი არ რეაგირებს</translation> <translation id="1041263367839475438">ხელმისაწვდომი მოწყობილობები</translation> <translation id="1042174272890264476">თქვენს კომპიუტერში ასევე ჩაშენებულია <ph name="SHORT_PRODUCT_NAME" />-ის RLZ ბიბლიოთეკა. RLZ მიამაგრებს არაუნიკალურ, არაპერსონალურ ტეგს, რომელიც გაზომავს ძიებებს და <ph name="SHORT_PRODUCT_NAME" />-ის გამოყენებას, რომლებიც აქტიურდება გარკვეული სარეკლამო კამპანიის მიერ. ეს წარწერები ზოგჯერ გამოჩნდება Google-ის ძიების მოთხოვნებში <ph name="PRODUCT_NAME" />-ში.</translation> +<translation id="1043818413152647937">ამ აპებიდანაც გსურთ მონაცემთა გასუფთავება?</translation> <translation id="1045692658517323508">{0,plural, =1{განაახლეთ 1 წუთის განმავლობაში}other{განაახლეთ # წუთის განმავლობაში}}</translation> <translation id="1046635659603195359">როგორც ჩანს, სხვა მოწყობილობაზე Google ასისტენტით უკვე დააყენეთ Voice Match. ეს ძველი ჩანაწერები გამოყენებული იქნება ამ მოწყობილობაზე ხმის მოდელის შესაქმნელად. ამას დასჭირდება წუთზე ნაკლები დრო.</translation> <translation id="1047431265488717055">ბმულის ტე&ქსტის კოპირება</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">ისარგებლეთ Google-ის გონიერი ფუნქციებით Chrome-ში</translation> <translation id="1147991416141538220">წვდომის მოთხოვნით მიმართეთ ამ მოწყობილობის ადმინისტრატორს.</translation> <translation id="1149401351239820326">ვადის გასვლის თვე</translation> +<translation id="1150490752229770117">ეს არის პროგრამული უზრუნველყოფისა და უსაფრთხოების ბოლო განახლება, რომელსაც თქვენი <ph name="DEVICE_TYPE" /> იღებს. მომავალი განახლებების მისაღებად გადადით ახალ მოდელზე. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="1150565364351027703">მზის სათვალე</translation> <translation id="1151917987301063366"><ph name="HOST" />-ისთვის სენსორებზე წვდომის ყოველთვის დაშვება</translation> <translation id="1153356358378277386">დაწყვილებული მოწყობილობები</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">აირჩიეთ ავტორიზაციისთვის გამოსაყენებელი ბილეთი. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="1712349894969001173">მიიღეთ ეს პაროლი თქვენს iPhone-ზე</translation> <translation id="1712552549805331520"><ph name="URL" /> ითხოვს თქვენს ადგილობრივ კომპიუტერზე მონაცემების სამუდამოდ შენახვის ნებართვას</translation> +<translation id="1714644264617423774">მარტივი წვდომის ფუნქციების ჩართვა მოწყობილობის გამარტივებისთვის. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="1717218214683051432">მოძრაობის სენსორები</translation> +<translation id="171824261579749339">ავსტრალიური. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="1718835860248848330">ბოლო საათი</translation> <translation id="1719312230114180055">შენიშვნა: თქვენი თითის ანაბეჭდი შეიძლება ძლიერ პაროლზე ან PIN-კოდზე ნაკლებად საიმედო იყოს.</translation> <translation id="1720318856472900922">TLS WWW სერვერის ავთენტიფიკაცია</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">მესამე მხარის ქუქი-ჩანაწერების გასუფთავება</translation> <translation id="2097372108957554726">ახალი მოწყობილობების რეგისრტაციისთვის უნდა შეხვიდეთ Chrome-ში</translation> <translation id="2099172618127234427">თქვენ საშუალებას აძლევთ Chrome OS -ს გამართვოს თვისებები, რომელიც შეიქმნა sshd daemon და რთავს ჩატვირთვას USB დრაივიდან.</translation> +<translation id="2099625543891475722">თქვენი ფიზიკური მონაცემები, როგორიცაა სიმაღლე</translation> <translation id="2099686503067610784">წავშალოთ სერვერის სერთიფიკატი „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="2100273922101894616">ავტომატური შესვლა</translation> <translation id="2101225219012730419">ვერსია:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">ახალი პროფილის შექმნა</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ითხოვს თქვენი ვინაობის დადასტურებას</translation> <translation id="2448312741937722512">ტიპი</translation> +<translation id="2448734521821581858">ქუქი-ჩანაწერები თქვენ მიერ მონახულებული ვებსაიტების მიერ შექმნილი ფაილებია. არსებობს ქუქი-ჩანაწერების ორი ტიპი: პირველი მხარის ქუქი-ჩანაწერები იქმნება თქვენ მიერ მონახულებული საიტის მიერ. საიტი ნაჩვენებია მისამართთა ზოლში. მესამე მხარის ქუქი-ჩანაწერები იქმნება სხვა საიტების მიერ. აღნიშნულ საიტებს ეკუთვნის თქვენ მიერ მონახულებულ ვებსაიტზე თქვენთვის ხილული გარკვეული კონტენტი (როგორიცაა რეკლამა ან სურათები).</translation> <translation id="2450223707519584812">თქვენ ვერ შეძლებთ მომხმარებლების დამატებას, რადგან აკლია Google API გასაღებები. დამატებითი ინფორმაციისათვის იხილეთ <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">აქტიური ხედები არ არის</translation> <translation id="2451298179137331965">2x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">მოლოდინის დრო ამოიწურა</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" />-ის მოწყობილობები</translation> <translation id="2594999711683503743">მოიძიეთ Google-ში, ან აკრიფეთ URL</translation> +<translation id="2600522410036850735">პროგრამული უზრუნველყოფისა და უსაფრთხოების განახლებებს ეს მოწყობილობა მიიღებს <ph name="MONTH_AND_YEAR" />-მდე. <a target="_blank" href="<ph name="URL" />">შეიტყვეთ მეტი</a></translation> <translation id="2603115962224169880">კომპიუტერის გასუფთავება</translation> <translation id="2603463522847370204">გახსნა &ინკოგნიტო ფანჯარაში</translation> <translation id="2604255671529671813">ქსელთან კავშირის შეცდომა</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">Safe Browsing (თქვენ და თქვენს მოწყობილობებს გიცავთ სახიფათო საიტებისგან)</translation> <translation id="3182749001423093222">მართლწერის შემოწმება</translation> <translation id="3183139917765991655">პროფილის იმპორტიორი</translation> +<translation id="3184536091884214176">CUPS პრინტერების დაყენება ან მართვა. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="3188257591659621405">ჩემი ფაილები</translation> <translation id="3188465121994729530">საშუალო გადაადგილება</translation> <translation id="3190558889382726167">პაროლი შენახულია</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">სამწუხაროდ, სისტემამ თქვენი მოწყობილობისთვის წესები ვერ გადმოიტანა.</translation> <translation id="347785443197175480">გაგრძელება <ph name="HOST" />-ისთვის კამერაზე და მიკროფონზე წვდომის მიცემით</translation> <translation id="3478685642445675458">პიროვნების ამოშლამდე, გთხოვთ, განბლოკოთ თქვენი პროფილი.</translation> -<translation id="3479539252931486093">მოულოდნელი იყო? <ph name="BEGIN_LINK" />შეგვატყობინეთ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ახლა არა</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" />-ში გაიხსნება <ph name="COUNTDOWN_SECONDS" /> წამში</translation> <translation id="3484273680291419129">მიმდინარეობს საზიანო პროგრამული უზრუნველყოფის ამოშლა...</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">მომხმარებლების სახელების და ფოტოების ჩვენება შესვლის ეკრანზე</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> — დაკავშირებულია HID მოწყობილობა</translation> <translation id="4142052906269098341">განბლოკეთ <ph name="DEVICE_TYPE" /> თქვენი ტელეფონით. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">შეინახეთ აღმოჩენილი პრინტერები თქვენს პროფილში, ან დაამატეთ ახალი პრინტერი. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="4144218403971135344">ნახეთ ვიდეოები უკეთესი ხარისხით და დაზოგეთ ბატარეა. ვიდეოები დაიკვრება მხოლოდ Cast-ის მხარდაჭერის მქონე ეკრანზე.</translation> <translation id="4146026355784316281">ყოველთვის გახსნა სისტემის დამთვალიერებლით</translation> <translation id="4146785383423576110">გადაყენება და გასუფთავება</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">ნესვი</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ფანჯარას აზიარებს.</translation> <translation id="4364830672918311045">შეტყობინებების ჩვენება</translation> +<translation id="436499142539576997">აპის მონაცემების მიღება ვერ მოხერხდა, თუმცა მისი გაშვების მცდელობა მაინც მიმდინარეობს...</translation> <translation id="4370975561335139969">თქვენ მიერ შეყვანილი ელფოსტა და პაროლი არ ემთხვევა</translation> <translation id="437184764829821926">შრიფტის გაფართოებული პარამეტრები</translation> <translation id="4374831787438678295">Linux ინსტალატორი</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">ბრაუზერის გადამისამართებისთვის მხარდაჭერილია მხოლოდ http, https და ფაილების პროტოკოლები.</translation> <translation id="4659077111144409915">ძირითადი ანგარიში</translation> <translation id="4660476621274971848">მოსალოდნელი ვერსია: „<ph name="EXPECTED_VERSION" />“, მიღებული ვერსია: „<ph name="NEW_ID" />“</translation> +<translation id="4660838440047236328">თქვენი ოთახის განლაგება</translation> <translation id="4662788913887017617">გააზიარეთ სანიშნე თქვენს iPhone-თან</translation> <translation id="4663373278480897665">კამერა დაშვებულია</translation> <translation id="4664482161435122549">PKCS #12 ექსპორტის შეცდომა</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">თქვენი გაშვების გვერდი გახდა <ph name="URL" />.</translation> <translation id="4902546322522096650">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, დაკავშირება</translation> <translation id="49027928311173603">სერვერზე გადმოწერილი პოლიტიკა არასწორია: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">ქსელში ფაილების გაზიარების დაყენება ან მართვა. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ამ ფაილის ჩამოტვირთვა ხშირად არ ხორციელდება ხოლმე და ის შეიძლება სახიფათო იყოს.</translation> <translation id="4907306957610201395">ნებართვის კატეგორია</translation> <translation id="4908811072292128752">ორი საიტის ერთდროულად დასათვალიერებლად გახსენით ახალი ჩანართი</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">ჩართვა…</translation> <translation id="5039804452771397117">დაშვება</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> რომ დაუკავშიროთ Linux-ს, გახსენით პარამეტრები</translation> +<translation id="5043913660911154449">ან მიუთითეთ პრინტერის PPD. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5045550434625856497">არასწორი პაროლი</translation> <translation id="504561833207953641">მიმდინარეობს ბრაუზერის არსებულ სესიაში გახსნა.</translation> <translation id="5047421709274785093">საიტებისთვის მოძრაობისა და განათების სენსორების გამოყენების აკრძალვა</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">ამ პარამეტრს ბავშვი-მომხმარებელი ვერ შეცვლის.</translation> <translation id="5466374726908360271">ჩა&სმა და „<ph name="SEARCH_TERMS" />“-ის ძიება</translation> <translation id="5468173180030470402">მიმდინარეობს ფაილების გაზიარებების ძიება.</translation> +<translation id="5470735824776589490">გადატვირთვა საჭიროა, სანამ განხორციელდება თქვენი მოწყობილობის გადატვირთვა Powerwash-ით. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5471768120198416576">გამარჯობა! ეს არის ჩემი ხმა ტექსტის გახმოვანებისთვის.</translation> <translation id="5472133193607270166">ჩართვის შემთხვევაში ვებსაიტები ვერ გამოიყენებს თქვენი დათვალიერების აქტივობას სხვადასხვა ვებსაიტზე რეკლამის პერსონალიზებისთვის. ზოგიერთმა ვებსაიტმა შეიძლება გაუმართავად იმუშაოს.</translation> <translation id="5473333559083690127">ხელახლა შეიყვანეთ ახალი PIN-კოდი</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">ორგანიზება</translation> <translation id="5499313591153584299">ეს ფაილი შეიძლება მავნე იყოს თქვენი კომპიუტერისთვის.</translation> <translation id="5502500733115278303">იმპორტირებულია Firefox-იდან</translation> +<translation id="5505264765875738116">საიტები ვერ გთხოვთ შეტყობინებების გამოგზავნას</translation> <translation id="5505307013568720083">მელანი ამოიწურა</translation> <translation id="5507756662695126555">არა უარყოფილი</translation> <translation id="5509693895992845810">შენ&ახვა როგორც…</translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">პარამეტრები</translation> <translation id="5804175651771201311">როუმინგის გამორთვა</translation> <translation id="5804241973901381774">ნებართვები</translation> +<translation id="5804427196348435412">NFC მოწყობილობების გამოყენება</translation> <translation id="5805697420284793859">ფანჯრების მმართველი</translation> <translation id="5806773519584576205">0° (ნაგულისხმევი)</translation> <translation id="5811750797187914944">ყველაფერი მზად არის</translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">გახსენით მაქსიმალური</translation> <translation id="6096326118418049043">X.500 სახელი</translation> <translation id="6097480669505687979">თუ მეხსიერებას არ გამოათავისუფლებთ, მომხმარებლები და მონაცემები შეიძლება ავტომატურად ამოიშალოს.</translation> +<translation id="6097600385983390082">ხმოვანი ძიება დაიხურა</translation> <translation id="6098793583803863900">მიმდინარეობს სახიფათო კონტენტის სკანირება უცნობ ფაილში.</translation> <translation id="6100736666660498114">დაწყების მენიუ</translation> <translation id="6101226222197207147">დამატებულია ახალი პროგრამა (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">კლავიატურის ნაცვლად ნაგულისხმევად ხმის გამოყენება</translation> <translation id="6234474535228214774">ინსტალაცია მოლოდინის რეჟიმშია</translation> <translation id="6237816943013845465">საშუალებას გაძლევთ, დაარეგულიროთ ეკრანის გარჩევადობა</translation> +<translation id="6238624845858322552">Bluetooth მოწყობილობასთან დაკავშირება</translation> <translation id="6238767809035845642">სხვა მოწყობილობიდან გაზიარებული ტექსტი</translation> <translation id="6238923052227198598">უახლესი ჩანიშვნის შენარჩუნება ჩაკეტილ ეკრანზე</translation> <translation id="6239558157302047471">&ფრეიმის ხელახლა ჩატვირთვა</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="PHONE_NAME" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, ტელეფონის ბატარეა: <ph name="BATTERY_STATUS" />%, დაკავშირება</translation> <translation id="6268252012308737255">გახსნა <ph name="APP" />-ით</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">საიტებს შეუძლიათ შეტყობინებების გამოგზავნის თხოვნა</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />სისტემისა/აპების ინფორმაციისა<ph name="END_LINK1" /> და <ph name="BEGIN_LINK2" />მეტრიკის<ph name="END_LINK2" /> გაგზავნა</translation> <translation id="6272643420381259437">დანამატის ჩამოტვირთვისას შეცდომა (<ph name="ERROR" />) წარმოიქმნა</translation> <translation id="6273677812470008672">ხარისხი</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">ანგარიში</translation> <translation id="6298962879096096191">Android-ის აპების ინსტალაციისთვის Google Play-ს გამოყენება</translation> <translation id="630065524203833229">გ&ასვლა</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> ვერ დაკონფიგურირდა ავტომატურად. გთხოვთ, მიუთითოთ პრინტერის გაფართოებული დეტალები. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="6305607932814307878">გლობალური წესები:</translation> <translation id="6307990684951724544">სისტემა დაკავებულია</translation> <translation id="6308493641021088955">შესვლას უზრუნველყოფს <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">გასუფთავების ფუნქცია ამჟამად მიუწვდომელია</translation> <translation id="6556866813142980365">გამეორება</translation> <translation id="6557290421156335491">ჩემი მალსახმობები</translation> +<translation id="6561560012278703671">ჩუმი შეტყობინების გამოყენება (დაბლოკავს შეტყობინებებთან დაკავშირებულ ხელისშემშლელ მოთხოვნებს)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">ფაილის მდებარეობა ან სახელი ძალიან გრძელია. გთხოვთ, შეინახოთ იგი უფრო მოკლე სახელით ან სხვა ადგილას.</translation> <translation id="6563469144985748109">თქვენს მენეჯერს ის ჯერ არ დაუდასტურებია</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">ნებართვის მოთხოვნა გაგზავნამდე</translation> <translation id="6840184929775541289">არ არის სერტიფიკაციის ცენტრი</translation> <translation id="6841186874966388268">შეცდომები</translation> +<translation id="6843267103192918276">შედით სისტემაში თქვენი სანიშნეების, ისტორიის, პაროლების და სხვა პარამეტრების თქვენს ყველა მოწყობილობაში მისაღებად. გარდა ამისა, ავტომატურად შეხვალთ Google-ის სერვისებში. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google მზად არის</translation> <translation id="6845038076637626672">გახსენით მაქსიმალური</translation> <translation id="6845325883481699275">Chrome-ის უსაფრთხოების გაუმჯობესების ხელშეწყობა</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware მზად არის დასაყენებლად.</translation> <translation id="744341768939279100">შექმენით ახალი პროფილი</translation> <translation id="7443806024147773267">იქონიეთ წვდომა თქვენს პაროლებზე, როცა შესული ხართ თქვენს Google ანგარიშში</translation> -<translation id="7444046173054089907">ეს საიტი დაბლოკილია</translation> <translation id="7444983668544353857">გამორთეთ <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">აპების ავტომატურად ინსტალაცია</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" />-ში გაიხსნება ახლა</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">ამ პირის ამოღება</translation> <translation id="8215295261562449873">Linux-ის ახალ ვერსიაზე გადასვლამდე ჩემი აპებისა და ფაილების სარეზერვო ასლების შექმნა „ჩამოტვირთვების“ საქაღალდეში.</translation> <translation id="8217399928341212914">გააგრძელეთ რამოდენიმე ფაილის ავტომატური ჩამოტვირთვის დაბლოკვა</translation> +<translation id="8218847192766059983">დაამატეთ ენები, ან შეცვალეთ სიის მიმდევრობა. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> <translation id="8221491193165283816">როგორც წესი, თქვენ ბლოკავთ შეტყობინებებს. ამ საიტისგან შეტყობინებების მისაღებად დააწკაპუნეთ აქ.</translation> <translation id="8225265270453771718">აპლიკაციის ფანჯრის გაზიარება</translation> <translation id="8225753906568652947">შემოთავაზებებით სარგებლობა</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">რედაქტირება</translation> <translation id="9066773882585798925">ტექსტის გახმოვანების მოსმენა</translation> <translation id="9066782832737749352">ტექსტის გახმოვანება</translation> +<translation id="9067559831321817373">მართეთ თქვენი სისტემაში შესული ანგარიშები. მინიჭებული ნებართვების მიხედვით, Chrome-სა და Google Play-ში არსებულმა ვებსაიტებმა, აპებმა თუ გაფართოებებმა შეიძლება გამოიყენოს აღნიშნული ანგარიშები სერვისებით სარგებლობის პროცესის თქვენზე მოსარგებად. <a>შეიტყვეთ მეტი</a></translation> <translation id="9068849894565669697">აირჩიეთ ფერი</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index d81115b..0f621d0 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Бұл бет жауап бермей жатыр.</translation> <translation id="1041263367839475438">Қолжетімді құрылғылар</translation> <translation id="1042174272890264476">Сонымен қатар компьютеріңізге <ph name="SHORT_PRODUCT_NAME" /> RLZ кітапханасы ендірілген. RLZ кітапханасы белгілі бір науқан арқылы жүргізілген іздеулер мен <ph name="SHORT_PRODUCT_NAME" /> пайдалану мүмкіндігін өлшеу үшін бірегей емес, жеке анықталмайтын тегті тағайындайды. Бұл белгілер кейде <ph name="PRODUCT_NAME" /> өніміндегі Google Search сұрауларында пайда болады.</translation> +<translation id="1043818413152647937">Осы қолданбалардағы деректер де өшірілсін бе?</translation> <translation id="1045692658517323508">{0,plural, =1{1 минуттың ішінде жаңартыңыз}other{# минуттың ішінде жаңартыңыз}}</translation> <translation id="1046635659603195359">Voice Match функциясын бұрын Google Assistant қолданбасымен басқа құрылғыда орнатқан сияқтысыз. Бұл алдыңғы жазбаларды осы құрылғыда дауыс үлгісін жасауға пайдалануға болады. Бұған бір минутқа жетпейтін уақыт кетеді.</translation> <translation id="1047431265488717055">Сілтеме мә&тінін көшіру</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome-дағы Google ақылды функциялары</translation> <translation id="1147991416141538220">Пайдалану рұқсатын алу үшін құрылғының әкімшісіне хабарласыңыз.</translation> <translation id="1149401351239820326">Жарамдылық мерзімі бітетін ай</translation> +<translation id="1150490752229770117">Бұл – <ph name="DEVICE_TYPE" /> құрылғысына арналған бағдарламалық құрал мен қауіпсіздік жүйесінің жаңа нұсқасы. Бұдан кейін де жаңа нұсқаларын алғыңыз келсе, жаңа үлгіге өтіңіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Күнқағар көзілдірік</translation> <translation id="1151917987301063366"><ph name="HOST" /> сайтына датчиктерді пайдалануға үнемі рұқсат ету</translation> <translation id="1153356358378277386">Жұпталған құрылғылар</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Аутентификация үшін қолдануға арналған билетті таңдаңыз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="1712349894969001173">iPhone телефонында осы құпия сөзді алу</translation> <translation id="1712552549805331520"><ph name="URL" /> деректерді жергілікті компьютеріңізде біржола сақтағысы келеді</translation> +<translation id="1714644264617423774">Құрылғыңызды пайдалануды жеңілдету үшін арнайы мүмкіндіктерді қосу. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Қозғалыс датчиктері</translation> +<translation id="171824261579749339">Кері <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Соңғы сағат</translation> <translation id="1719312230114180055">Ескертпе: саусақ ізінің қауіпсіздік деңгейі күрделі өрнек не PIN кодына қарағанда төменірек болуы мүмкін.</translation> <translation id="1720318856472900922">TLS WWW сервер аутентификациясы</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Бөгде сайттардың cookie файлдарын тазалау</translation> <translation id="2097372108957554726">Жаңа құрылғыларды тіркеу үшін Chrome жүйесіне кіру қажет</translation> <translation id="2099172618127234427">Сіз Chrome OS жөндеу мүмкіндіктерін қосқалы жатырсыз. Олар sshd демонын орнатып, USB дискілерінен жүктеу мүмкіндігін береді.</translation> +<translation id="2099625543891475722">бойыңыз сияқты физикалық сипаттар</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" сервер сертификатын жою қажет пе?</translation> <translation id="2100273922101894616">Автоматты кіру</translation> <translation id="2101225219012730419">Нұсқа:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Жаңа профиль жасау</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> жеке басыңызды растағысы келеді</translation> <translation id="2448312741937722512">Түрі</translation> +<translation id="2448734521821581858">Cookie файлдары сайттарға кірген кезде жасалады. Cookie файлдарының екі түрі бар: кірген сайт жасаған жеке cookie файлдары. Сайт мекенжай жолағында көрсетіледі. Басқа сайттар жасаған үшінші тарап cookie файлдары. Бұл сайттарда сіз кірген сайтта көрсетілетін мазмұн (мысалы, жарнамалар немесе суреттер) болады.</translation> <translation id="2450223707519584812">Google API кілттері жетіспей тұрғандықтан, пайдаланушыларды қоса алмайсыз. Толық ақпаратты қараңыз: <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Белсенді көру режимдері жоқ</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Уақыты өтіп кетті</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> құрылғылары</translation> <translation id="2594999711683503743">Google арқылы іздеңіз немесе URL мекенжайын енгізіңіз</translation> +<translation id="2600522410036850735">Бұл құрылғыға бағдарламалық құрал мен қауіпсіздік жүйесінің жаңа нұсқасының автоматты түрде орнатылуы <ph name="MONTH_AND_YEAR" /> дейін жіберіледі. <a target="_blank" href="<ph name="URL" />">Толығырақ</a></translation> <translation id="2603115962224169880">Компьютерді тазалау</translation> <translation id="2603463522847370204">&Инкогнито терезесінде ашу</translation> <translation id="2604255671529671813">Желімен байланыс қатесі</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">Safe Browsing қызметі (сізді және құрылғыңызды қауіпті сайттардан қорғайды)</translation> <translation id="3182749001423093222">Емле тексеру</translation> <translation id="3183139917765991655">Profile Importer</translation> +<translation id="3184536091884214176">CUPS принтерлерін реттеу және басқару. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Файлдарым</translation> <translation id="3188465121994729530">Орташа мәнді жылжыту</translation> <translation id="3190558889382726167">Құпия сөз сақталды</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">Қап! Жүйе құрылғыңызға арналған саясатты ала алмады.</translation> <translation id="347785443197175480"><ph name="HOST" /> хостына камераңыз бен микрофоныңызды пайдалануға берген рұқсатты сақтау</translation> <translation id="3478685642445675458">Адам суретін алып тастау үшін профиліңіздің құлпын ашыңыз.</translation> -<translation id="3479539252931486093">Мұны күтпеген бе едіңіз? <ph name="BEGIN_LINK" />Бізге хабарлаңыз<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Қазір емес</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> браузері <ph name="COUNTDOWN_SECONDS" /> секундта ашылады.</translation> <translation id="3484273680291419129">Зиян бағдарламалық құрал өшірілуде…</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">Кіру экранында пайдаланушы аттары мен фотосуреттерді көрсету</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID құрылғысы қосылған</translation> <translation id="4142052906269098341">Телефон арқылы <ph name="DEVICE_TYPE" /> құрылғысының құлпын ашыңыз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Анықталған принтерлерді профиліңізге сақтаңыз немесе жаңа принтер енгізіңіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Жоғары сапалы бейнелерді көріп, батарея зарядын үнемдеңіз. Бейне Cast қосылған экранда ғана ойнайды.</translation> <translation id="4146026355784316281">Әрқашан жүйелік көру құралымен ашу</translation> <translation id="4146785383423576110">Бастапқы күйге қайтару және жою</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">Қауын</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> терезені бөлісуде.</translation> <translation id="4364830672918311045">Дисплей хабарландырулары</translation> +<translation id="436499142539576997">Қолданба деректерін алу мүмкін болмады. Қолданбаны іке қосудамыз…</translation> <translation id="4370975561335139969">Сіз енгізген электрондық пошта және құпия сөз сәйкес емес</translation> <translation id="437184764829821926">Кеңейтілген қаріп параметрлері</translation> <translation id="4374831787438678295">Linux орнату құралы</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">Тек http, https және файл протоколдары браузер бағытын ауыстырады.</translation> <translation id="4659077111144409915">Негізгі есептік жазба</translation> <translation id="4660476621274971848">"<ph name="NEW_ID" />" нұсқасы күтілген "<ph name="EXPECTED_VERSION" />" нұсқасына сәйкес келмейді</translation> +<translation id="4660838440047236328">бөлменің жобасы</translation> <translation id="4662788913887017617">Осы бетбелгіні iPhone арқылы бөлісіңіз</translation> <translation id="4663373278480897665">Камераны пайдалануға рұқсат берілген</translation> <translation id="4664482161435122549">PKCS #12 экспорттау қатесі</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">Іске қосу беті <ph name="URL" /> мекенжайына өзгерді.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, қосылу</translation> <translation id="49027928311173603">Серверден жүктелген саясат жарамсыз: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Желінің ортақ каталогтерін реттеу немесе басқару. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Бұл файл әдетте жүктелмейді және ол қауіпті болуы мүмкін.</translation> <translation id="4907306957610201395">Рұқсат санаты</translation> <translation id="4908811072292128752">Екі сайтты бірден шолу үшін жаңа қойындыны ашыңыз</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">Қосылуда…</translation> <translation id="5039804452771397117">Рұқсат беру</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> құрылғысын Linux жүйесіне жалғау үшін "Параметрлер" бөлімін ашыңыз.</translation> +<translation id="5043913660911154449">Немесе принтер үшін PPD файлын көрсетіңіз <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Құпия сөз дұрыс емес</translation> <translation id="504561833207953641">Бұрыннан бар браузер сеансында ашылуда.</translation> <translation id="5047421709274785093">Сайттардың қозғалыс және жарық датчиктерін пайдалануына тыйым салу</translation> @@ -3103,6 +3115,7 @@ <translation id="5464660706533281090">Бұл параметрді бала пайдаланушы өзгерте алмайды.</translation> <translation id="5466374726908360271">"<ph name="SEARCH_TERMS" />" сұрауын қою және іздеу</translation> <translation id="5468173180030470402">Ортақ каталогтер ізделіп жатыр.</translation> +<translation id="5470735824776589490">Powerwash арқылы қалпына келтіру үшін, құрылғыңызды қайта іске қосу қажет. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Сәлеметсіз бе! Мен сізге мәтінді дыбыстап беремін.</translation> <translation id="5472133193607270166">Бұл параметр қосулы кезде, жарнамаларды жеке қажеттіліктерге бейімдеу үшін сайттар браузерді қолдану мәліметін пайдалана алмайды. Кейбір сайттар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="5473333559083690127">Жаңа PIN кодын қайта енгізіңіз</translation> @@ -3126,6 +3139,7 @@ <translation id="5496587651328244253">Ұйымдастыру</translation> <translation id="5499313591153584299">Бұл файл компьютеріңізге зиянды болуы мүмкін.</translation> <translation id="5502500733115278303">Firefox браузерінен импортталған</translation> +<translation id="5505264765875738116">Сайттар хабарландырулар жіберу рұқсатын сұрай алмайды</translation> <translation id="5505307013568720083">Сия бітті</translation> <translation id="5507756662695126555">Бас тартылмайды</translation> <translation id="5509693895992845810">&Басқаша сақтау…</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">Параметрлер</translation> <translation id="5804175651771201311">Роуминг өшірулі</translation> <translation id="5804241973901381774">Рұқсаттар</translation> +<translation id="5804427196348435412">NFC функциясы бар құрылғыларды пайдалану</translation> <translation id="5805697420284793859">Терезе менеджері</translation> <translation id="5806773519584576205">0° (Әдепкі)</translation> <translation id="5811750797187914944">Бәрі дайын</translation> @@ -3555,6 +3570,7 @@ <translation id="6096047740730590436">Барынша ашу</translation> <translation id="6096326118418049043">X.500 атауы</translation> <translation id="6097480669505687979">Орын босатпасаңыз, пайдаланушылар мен деректер автоматты өшірілуі мүмкін.</translation> +<translation id="6097600385983390082">Дауыспен іздеу жабық</translation> <translation id="6098793583803863900">Белгісіз файлда қауіпті мазмұнның бар-жоғы тексерілуде.</translation> <translation id="6100736666660498114">Іске қосу мәзірі</translation> <translation id="6101226222197207147">Жаңа қолданба қосылды (<ph name="EXTENSION_NAME" />)</translation> @@ -3650,6 +3666,7 @@ <translation id="6233154960150021497">Пернетақтаның орнына дауыс пәрмендерін әдепкі етіп пайдалану</translation> <translation id="6234474535228214774">Орнату процесі кезекте тұр</translation> <translation id="6237816943013845465">Экран ажыратымдылығын реттеуге мүмкіндік береді</translation> +<translation id="6238624845858322552">Bluetooth құрылғысына жалғау</translation> <translation id="6238767809035845642">Басқа құрылғыдан келген мәтін</translation> <translation id="6238923052227198598">Құлып экранында соңғы ескертуді сақтау</translation> <translation id="6239558157302047471">&Кадрды қайта жүктеу</translation> @@ -3676,6 +3693,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="PHONE_NAME" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, телефон батареясы: <ph name="BATTERY_STATUS" />%, қосылу</translation> <translation id="6268252012308737255"><ph name="APP" /> қолданбасымен ашу</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайттар хабарландырулар жіберу рұқсатын сұрай алады</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Жүйе және қолданба ақпараты<ph name="END_LINK1" /> мен <ph name="BEGIN_LINK2" />көрсеткіштерді<ph name="END_LINK2" /> жіберу</translation> <translation id="6272643420381259437">Плагинді жүктеу кезінде қате (<ph name="ERROR" />) кетті</translation> <translation id="6273677812470008672">Сапа</translation> @@ -3697,6 +3715,7 @@ <translation id="629730747756840877">Есептік жазба</translation> <translation id="6298962879096096191">Android қолданбаларын Google Play арқылы орнату</translation> <translation id="630065524203833229">Ш&ығу</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> принтері автоматты түрде конфигурацияланбады. Принтердің қосымша мәліметтерін көрсетіңіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Ғаламдық саясат:</translation> <translation id="6307990684951724544">Жүйе бос емес</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> кеңейтімі арқылы кіру керек</translation> @@ -3866,6 +3885,7 @@ <translation id="6555810572223193255">Әзірге өшіру мүмкін емес</translation> <translation id="6556866813142980365">Қайта орындау</translation> <translation id="6557290421156335491">Таңбашаларым</translation> +<translation id="6561560012278703671">Дыбысы бәсең шығатын хабарларды пайдаланыңыз (кедергі келтіретін хабарландыруларды бөгейді).</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Файл жолы немесе атауы тым ұзын. Қысқа атаумен немесе басқа орынға сақтаңыз.</translation> <translation id="6563469144985748109">Менеджеріңіз әлі мақұлдаған жоқ</translation> @@ -4049,6 +4069,7 @@ <translation id="6840155290835956714">Жіберу алдында рұқсат сұрау</translation> <translation id="6840184929775541289">Сертификат беретін орган емес</translation> <translation id="6841186874966388268">Қателер</translation> +<translation id="6843267103192918276">Барлық құрылғыларда бетбелгілеріңізді, тарихыңызды, құпия сөздеріңізді және басқа параметрлеріңізді алу үшін есептік жазбаңызға кіріңіз. Сонымен қатар Google қызметтеріне автоматты түрде кіресіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="6843423766595476978">"Ok Google" пәрмені реттеліп болды</translation> <translation id="6845038076637626672">Жайып ашу</translation> <translation id="6845325883481699275">Chrome қауіпсіздігін жетілдіруге көмектесу</translation> @@ -4465,7 +4486,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware реттеуге дайын.</translation> <translation id="744341768939279100">Жаңа профиль жасау</translation> <translation id="7443806024147773267">Google есептік жазбаңызға кіріп тұрған кез келген құрылғыдан құпия сөздеріңізді пайдалана аласыз.</translation> -<translation id="7444046173054089907">Бұл сайт бөгелді</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> өшіру</translation> <translation id="7448430327655618736">Қолданбаларды автоматты түрде орнатыңыз</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> браузерінде ашылады.</translation> @@ -5029,6 +5049,7 @@ <translation id="8214962590150211830">Бұл тұлғаны өшіру</translation> <translation id="8215295261562449873">Linux жүйесінің жаңа нұсқасын орнатпас бұрын, "Жүктеп алынғандар" қалтасында қолданбалар мен файлдардың сақтық көшірмесін жасаңыз.</translation> <translation id="8217399928341212914">Бірнеше файлды автоматты жүктеуге салынған тыйымды сақтау</translation> +<translation id="8218847192766059983">Тілдерді енгізіңіз немесе тізімнің ретін өзгертіңіз. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Әдетте хабарландыруларға тыйым саласыз. Осы сайттың сізге хабарландыру жіберуіне рұқсат ету үшін осы жерді басыңыз.</translation> <translation id="8225265270453771718">Қолданба терезесін бөлісу</translation> <translation id="8225753906568652947">Ұсыныстарды белсендіру</translation> @@ -5642,6 +5663,7 @@ <translation id="9065203028668620118">Өзгерту</translation> <translation id="9066773882585798925">Дауыстап оқылған мәтінді тыңдау</translation> <translation id="9066782832737749352">Мәтінді сөзге айналдыру</translation> +<translation id="9067559831321817373">Кірген есептік жазбаларды басқарыңыз. Рұқсаттарыңызға байланысты мүмкіндігіңізді реттеу үшін веб-сайттар, қолданбалар, Chrome және Google Play кеңейтімдері осы есептік жазбаларды пайдалануы мүмкін. <a>Толығырақ</a></translation> <translation id="9068849894565669697">Түс таңдау</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index eee1ed20..f53ea39 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">ទំព័រនេះមិនដំណើរការទេ</translation> <translation id="1041263367839475438">ឧបករណ៍ដែលអាចប្រើបាន</translation> <translation id="1042174272890264476">កុំព្យូទ័ររបស់អ្នកក៏ភ្ជាប់មកជាមួយបណ្តាល័យដែលបំពាក់ RLZ របស់ <ph name="SHORT_PRODUCT_NAME" /> ផងដែរ។ RLZ ចាត់ស្លាកដែលអាចសម្គាល់បានដោយមិនមែនលក្ខណៈបុគ្គល ឬពិសេស ដើម្បីវាស់វែងការស្វែងរក និងការប្រើប្រាស់ <ph name="SHORT_PRODUCT_NAME" /> ដែលដំណើរការដោយយុទ្ធនាការផ្សព្ធផ្សាយជាក់លាក់មួយ។ ជួនកាល ផ្លាកទាំងនេះលេចឡើងនៅក្នុងការសួរ Google ស្វែងរក <ph name="PRODUCT_NAME" />។</translation> +<translation id="1043818413152647937">សម្អាតទិន្នន័យពីកម្មវិធីទាំងនេះផងដែរ?</translation> <translation id="1045692658517323508">{0,plural, =1{ដំឡើងកំណែក្នុងរយៈពេល 1 នាទីទៀត}other{ដំឡើងកំណែក្នុងរយៈពេល # នាទីទៀត}}</translation> <translation id="1046635659603195359">អ្នកហាក់បីដូចជាបានរៀបចំមុខងារ Voice Match ជាមួយ Google ជំនួយការរបស់អ្នកនៅលើឧបករណ៍ផ្សេងទៀតរួចហើយ។ ការថតសំឡេងពីមុនៗទាំងនេះអាចត្រូវបានប្រើ ដើម្បីបង្កើតគំរូសំឡេងនៅលើឧបករណ៍នេះ។ សកម្មភាពនេះគួរតែចំណាយពេលមិនលើសពីមួយនាទីទេ។</translation> <translation id="1047431265488717055">ចម្លងអត្ថបទតំណ</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">ទទួលបានមុខងារឆ្លាតវៃរបស់ Google នៅក្នុង Chrome</translation> <translation id="1147991416141538220">ដើម្បីស្នើសុំសិទ្ធិចូលប្រើប្រាស់ សូមទាក់ទងអ្នកគ្រប់គ្រងឧបករណ៍នេះ។</translation> <translation id="1149401351239820326">ខែផុតកំណត់</translation> +<translation id="1150490752229770117">នេះគឺជាការដំឡើងកំណែកម្មវិធី និងសុវត្ថិភាពថ្មីដោយស្វ័យប្រវត្តិចុងក្រោយសម្រាប់ <ph name="DEVICE_TYPE" /> នេះ។ ដើម្បីទទួលបានកំណែថ្មីក្នុងពេលអនាគត សូមប្ដូរទៅប្រើម៉ូដែលថ្មីជាងនេះ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="1150565364351027703">វ៉ែនតាការពារពន្លឺព្រះអាទិត្យ</translation> <translation id="1151917987301063366">អនុញ្ញាត <ph name="HOST" /> ឱ្យចូលប្រើឧបករណ៍ចាប់សញ្ញាជានិច្ច</translation> <translation id="1153356358378277386">ឧបករណ៍ដែលបានផ្គូផ្គង</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">សូមជ្រើសរើសសំបុត្រ ដើម្បីប្រើសម្រាប់ការផ្ទៀងផ្ទាត់។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="1712349894969001173">ទទួលពាក្យសម្ងាត់នេះនៅលើ iPhone របស់អ្នក</translation> <translation id="1712552549805331520"><ph name="URL" /> ចង់ផ្ទុកទិន្នន័យនៅក្នុងកុំព្យូទ័រមូលដ្ឋានរបស់អ្នកជាអចិន្ត្រៃយ៍</translation> +<translation id="1714644264617423774">បើកមុខងារភាពងាយប្រើ ដើម្បីធ្វើឱ្យឧបករណ៍របស់អ្នកងាយស្រួលប្រើជាងមុន។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="1717218214683051432">ឧបករណ៍ចាប់ចលនា</translation> +<translation id="171824261579749339">អូស្ត្រាលី <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="1718835860248848330">មួយម៉ោងមុន</translation> <translation id="1719312230114180055">ចំណាំ៖ ស្នាមម្រាមដៃរបស់អ្នកអាចនឹងមិនសូវមានសុវត្ថិភាពដូចពាក្យសម្ងាត់ ឬកូដ PIN ដែលរឹងមាំនោះទេ។</translation> <translation id="1720318856472900922">ការសម្គាល់អត្តសញ្ញាណម៉ាស៊ីនមេ TLS WWW</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">សម្អាតខូគីភាគីទីបី</translation> <translation id="2097372108957554726">អ្នកត្រូវចូលទៅ Chrome ដើម្បីចុះឈ្មោះឧបករណ៍ថ្មី</translation> <translation id="2099172618127234427">អ្នកកំពុងបើកដំណើរការលក្ខណៈពិសេសកម្ចាត់កំហុស Chrome OS ដែលនឹងកំណត់ sshd daemon និងបើកដំណើរការចាប់ផ្តើមចេញពីឧបករណ៍ USB។</translation> +<translation id="2099625543891475722">លក្ខណសម្បត្តិនៃរាងកាយរបស់អ្នក ដូចជាកម្ពស់ជាដើម</translation> <translation id="2099686503067610784">លុបវិញ្ញាបនប័ត្រម៉ាស៊ីនមេ "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">ចូលស្វ័យប្រវត្តិ</translation> <translation id="2101225219012730419">កំណែ៖</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">បង្កើតកម្រងព័ត៌មានថ្មី</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ចង់ផ្ទៀងផ្ទាត់អត្តសញ្ញាណរបស់អ្នក</translation> <translation id="2448312741937722512">ប្រភេទ</translation> +<translation id="2448734521821581858">ខូគីជាឯកសារដែលបង្កើតដោយគេហទំព័រដែលអ្នកចូលមើល។ ខូគីមានពីរប្រភេទ៖ ខូគីភាគីទីមួយបង្កើតដោយគេហទំព័រដែលអ្នកមើល។ គេហទំព័រនេះបង្ហាញនៅលើរបារអាសយដ្ឋាន។ ខូគីភាគីទីបីបង្កើតដោយគេហទំព័រផ្សេងទៀត។ គេហទំព័រទាំងនេះគឺជាម្ចាស់នៃខ្លឹមសារមួយចំនួន ដូចជាការផ្សាយពាណិជ្ជកម្ម ឬរូបភាព ដែលអ្នកឃើញនៅលើគេហទំព័រដែលអ្នកចូលមើលជាដើម។</translation> <translation id="2450223707519584812">អ្នកនឹងមិនអាចបន្ថែមអ្នកប្រើបានទេ ពីព្រោះសោ Google API បានបាត់បង់។ សូមមើល <ph name="DETAILS_URL" /> សម្រាប់ព័ត៌មានលម្អិត។</translation> <translation id="2450849356604136918">មិនមានទិដ្ឋភាពសកម្មទេ</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">អស់ម៉ោងហើយ</translation> <translation id="2588636910004461974">ឧបករណ៍ពី <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">ស្វែងរកតាម Google ឬវាយបញ្ចូល URL</translation> +<translation id="2600522410036850735">ឧបករណ៍នេះនឹងទទួលបានកំណែកម្មវិធី និងសុវត្ថិភាពថ្មីដោយស្វ័យប្រវត្តិ រហូតដល់ខែ <ph name="MONTH_AND_YEAR" />។ <a target="_blank" href="<ph name="URL" />">ស្វែងយល់បន្ថែម</a></translation> <translation id="2603115962224169880">សម្អាតកុំព្យូទ័រ</translation> <translation id="2603463522847370204">បើកនៅក្នុងផ្ទាំងអនាមិក</translation> <translation id="2604255671529671813">មានបញ្ហាក្នុងការភ្ជាប់បណ្តាញ</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">មុខងាររុករកដោយសុវត្ថិភាព (ការពារអ្នក និងឧបករណ៍របស់អ្នកពីគេហទំព័រគ្រោះថ្នាក់)</translation> <translation id="3182749001423093222">ពិនិត្យអក្ខរាវិរុទ្ធ</translation> <translation id="3183139917765991655">កម្មវិធីនាំចូលប្រវត្តិរូប</translation> +<translation id="3184536091884214176">រៀបចំ ឬគ្រប់គ្រងម៉ាស៊ីន CUPS បោះពុម្ព។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="3188257591659621405">ឯកសាររបស់ខ្ញុំ</translation> <translation id="3188465121994729530">Moving Average</translation> <translation id="3190558889382726167">បានរក្សាទុកពាក្យសម្ងាត់</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">អូ៎! ប្រព័ន្ធមិនអាចទាញយកគោលការណ៍សម្រាប់ឧបករណ៍របស់អ្នកបានទេ។</translation> <translation id="347785443197175480">បន្តអនុញ្ញាត <ph name="HOST" /> ឲ្យចូលប្រើកាមេរ៉ា និងម៉ៃក្រូហ្វូនរបស់អ្នក</translation> <translation id="3478685642445675458">សូមដោះសោប្រវត្តិរូបរបស់អ្នកមុនពេលយកអ្នកណាម្នាក់ចេញ</translation> -<translation id="3479539252931486093">តើវាកើតឡើងដោយមិនបានរំពឹងទុកឬ? <ph name="BEGIN_LINK" />សូមមេត្តាឲ្យយើងដឹង<ph name="END_LINK" /></translation> <translation id="3479552764303398839">មិនមែនឥឡូវនេះទេ</translation> <translation id="3481268647794498892">នឹងបើកនៅក្នុង <ph name="ALTERNATIVE_BROWSER_NAME" /> ក្នុងរយៈពេល <ph name="COUNTDOWN_SECONDS" /> វិនាទីទៀត</translation> <translation id="3484273680291419129">កំពុងលុបកម្មវិធីដែលបង្កគ្រោះថ្នាក់...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">បង្ហាញឈ្មោះអ្នកប្រើប្រាស់ និងរូបថតនៅលើអេក្រង់ចូល</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - បានភ្ជាប់ជាមួយឧបករណ៍ HID</translation> <translation id="4142052906269098341">ដោះសោ <ph name="DEVICE_TYPE" /> តាមរយៈទូរសព្ទរបស់អ្នក។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">រក្សាទុកម៉ាស៊ីនបោះពុម្ពដែលបានរកឃើញទៅក្នុងកម្រងព័ត៌មានរបស់អ្នក ឬបញ្ចូលម៉ាស៊ីនបោះពុម្ពថ្មី។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="4144218403971135344">ទទួលបានវីដេអូគុណភាពកាន់តែប្រសើរ និងសន្សំកម្រិតថាមពលថ្ម។ វីដេអូនឹងចាក់នៅលើអេក្រង់ដែលស្គាល់កម្មវិធី Cast របស់អ្នកតែប៉ុណ្ណោះ។</translation> <translation id="4146026355784316281">បើកជាមួយកម្មវិធីមើលប្រព័ន្ធជានិច្ច</translation> <translation id="4146785383423576110">កំណត់ឡើងវិញ និងសម្អាត</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">ត្រសក់ផ្អែម</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> កំពុងចែករំលែកផ្ទាំងវិនដូ</translation> <translation id="4364830672918311045">បង្ហាញការជូនដំណឹង</translation> +<translation id="436499142539576997">មិនអាចទទួលទិន្នន័យកម្មវិធីបានទេ កំពុងព្យាយាមដំណើរការកម្មវិធីនៅឡើយ...</translation> <translation id="4370975561335139969">អ៊ីមែល និងពាក្យសម្ងាត់ដែលអ្នកបញ្ចូលមិនត្រូវគ្នាទេ</translation> <translation id="437184764829821926">ការកំណត់ពុម្ពអក្សរកម្រិតខ្ពស់</translation> <translation id="4374831787438678295">កម្មវិធីដំឡើង Linux</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">មានតែប្រូតូកូល http, https និងឯកសារប៉ុណ្ណោះដែលស្គាល់ការបញ្ជូនបន្តកម្មវិធីរុករកតាមអ៊ីនធឺណិត។</translation> <translation id="4659077111144409915">គណនីចម្បង</translation> <translation id="4660476621274971848">កំណែដែលបានរំពឹងទុកគឺ "<ph name="EXPECTED_VERSION" />" ប៉ុន្តែកំណែជាក់ស្ដែង "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">ប្លង់បន្ទប់របស់អ្នក</translation> <translation id="4662788913887017617">ចែករំលែកចំណាំនេះជាមួយ iPhone របស់អ្នក</translation> <translation id="4663373278480897665">បានអនុញ្ញាតឱ្យប្រើកាមេរ៉ា</translation> <translation id="4664482161435122549">កំហុសឆ្គងការនាំចេញ PKCS #12</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">ទំព័រចាប់ផ្តើមរបស់អ្នកត្រូវបានប្តូរទៅ <ph name="URL" /> ។</translation> <translation id="4902546322522096650">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, ភ្ជាប់</translation> <translation id="49027928311173603">គោលការណ៍ដែលបានទាញយកពីម់ាស៊ីនមេគ្មានសុពលភាពទេ៖ <ph name="VALIDATION_ERROR" /></translation> +<translation id="4906490889887219338">រៀបចំ ឬគ្រប់គ្រងការចែករំលែកឯកសារតាមបណ្ដាញ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ឯកសារនេះមិនមានការទាញយកជាទូទៅនោះទេ ហើយវាអាចនឹងបង្កគ្រោះថ្នាក់។</translation> <translation id="4907306957610201395">ប្រភេទសិទ្ធិអនុញ្ញាត</translation> <translation id="4908811072292128752">បើកផ្ទាំងថ្មីដើម្បីរុករកទំព័រពីរក្នុងពេលតែមួយ</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">កំពុងបើកដំណើរការ...</translation> <translation id="5039804452771397117">អនុញ្ញាត</translation> <translation id="5042282098504489593">បើកការកំណត់ ដើម្បីភ្ជាប់ <ph name="USB_DEVICE_NAME" /> ទៅ Linux</translation> +<translation id="5043913660911154449">ឬបញ្ជាក់ PPD ម៉ាស៊ីនបោះពុម្ពរបស់អ្នក <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ពាក្យសម្ងាត់មិនត្រឹមត្រូវ</translation> <translation id="504561833207953641">កំពុងបើកនៅក្នុងរយៈពេលចូលប្រើកម្មវិធីរុករកដែលមានស្រាប់។</translation> <translation id="5047421709274785093">ទប់ស្កាត់ទំព័រមិនឱ្យប្រើឧបករណ៍ចាប់សញ្ញាពន្លឺ និងចលនា</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">អ្នកប្រើប្រាស់ដែលជាកុមារមិនអាចផ្លាស់ប្ដូរការកំណត់នេះបានទេ។</translation> <translation id="5466374726908360271">ដាក់ចូល ហើយស្វែងរក “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">កំពុងរកមើលឧបករណ៍ចែករំលែកឯកសារ</translation> +<translation id="5470735824776589490">តម្រូវឱ្យចាប់ផ្តើមឡើងវិញ មុនពេលអាចកំណត់ឧបករណ៍របស់អ្នកឡើងវិញដោយប្រើ Powerwash។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="5471768120198416576">សួស្ដី! ខ្ញុំគឺជាសំឡេងម៉ាស៊ីនអត្ថបទទៅជាការនិយាយរបស់អ្នក។</translation> <translation id="5472133193607270166">នៅពេលបើក គេហទំព័រមិនអាចប្រើសកម្មភាពរុករកតាមអ៊ីនធឺណិតរបស់អ្នកនៅលើគេហទំព័រផ្សេងៗគ្នា ដើម្បីកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របតាមបុគ្គលបានទេ។ គេហទំព័រមួយចំនួនប្រហែលជាដំណើរការមិនត្រឹមត្រូវទេ។</translation> <translation id="5473333559083690127">បញ្ចូលកូដ PIN ថ្មីឡើងវិញ</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">រៀបចំ</translation> <translation id="5499313591153584299">ឯកសារនេះអាចបង្កគ្រោះថ្នាក់ដល់កុំព្យូទ័ររបស់អ្នក។</translation> <translation id="5502500733115278303">បាននាំចូលពី Firefox</translation> +<translation id="5505264765875738116">គេហទំព័រមិនអាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹងបានទេ</translation> <translation id="5505307013568720083">អស់ទឹកថ្នាំ</translation> <translation id="5507756662695126555">ការមិនបដិសេធ</translation> <translation id="5509693895992845810">រក្សាទុកជា...</translation> @@ -3344,6 +3358,7 @@ <translation id="5801568494490449797">ចំណូលចិត្ត</translation> <translation id="5804175651771201311">រ៉ូមីងបានបិទ</translation> <translation id="5804241973901381774">ការអនុញ្ញាត</translation> +<translation id="5804427196348435412">ប្រើឧបករណ៍ NFC</translation> <translation id="5805697420284793859">កម្មវិធីគ្រប់គ្រងវិនដូ</translation> <translation id="5806773519584576205">0° (លំនាំដើម)</translation> <translation id="5811750797187914944">រួចហើយ</translation> @@ -3559,6 +3574,7 @@ <translation id="6096047740730590436">បើកការពង្រីក</translation> <translation id="6096326118418049043">ឈ្មោះ X.500</translation> <translation id="6097480669505687979">ប្រសិនបើអ្នកមិនបង្កើនទំហំផ្ទុកទេ អ្នកប្រើ និងទិន្នន័យអាចត្រូវបានលុបចេញដោយស្វ័យប្រវត្តិ។</translation> +<translation id="6097600385983390082">បានបិទការស្វែងរកតាមសំឡេង</translation> <translation id="6098793583803863900">កំពុងស្កេនរកខ្លឹមសារគ្រោះថ្នាក់នៅក្នុងឯកសារមិនស្គាល់។</translation> <translation id="6100736666660498114">ម៉ឺនុយចាប់ផ្តើម</translation> <translation id="6101226222197207147">កម្មវិធីថ្មីបានបន្ថែម (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">លំនាំដើមសម្រាប់ការប្រើប្រាស់សំឡេងជំនួសក្ដារចុច</translation> <translation id="6234474535228214774">រង់ចាំការដំឡើង</translation> <translation id="6237816943013845465">អនុញ្ញាតឲ្យអ្នកកែសម្រួលគុណភាពបង្ហាញនៃអេក្រង់របស់អ្នក</translation> +<translation id="6238624845858322552">ភ្ជាប់ទៅឧបករណ៍ប៊្លូធូស</translation> <translation id="6238767809035845642">អត្ថបទដែលចែករំលែកពីឧបករណ៍ផ្សេងទៀត</translation> <translation id="6238923052227198598">រក្សាទុកកំណត់សម្គាល់ចុងក្រោយបំផុតនៅលើអេក្រង់ចាក់សោ</translation> <translation id="6239558157302047471">ដំណើរការហ្វ្រេមឡើងវិញ</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, ថ្មទូរសព្ទ <ph name="BATTERY_STATUS" />%, ភ្ជាប់</translation> <translation id="6268252012308737255">បើកដោយប្រើ <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">គេហទំព័រអាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹង</translation> <translation id="6270770586500173387">ផ្ញើ <ph name="BEGIN_LINK1" />ព័ត៌មានប្រព័ន្ធ និងកម្មវិធី<ph name="END_LINK1" /> និង<ph name="BEGIN_LINK2" />ប្រព័ន្ធវាស់វែង<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">មានបញ្ហា (<ph name="ERROR" />) ខណៈពេលទាញយកកម្មវិធីជំនួយនេះ</translation> <translation id="6273677812470008672">គុណភាព</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">គណនី</translation> <translation id="6298962879096096191">ប្រើ Google Play ដើម្បីដំឡើងកម្មវិធី Android</translation> <translation id="630065524203833229">ចាកចេញ</translation> +<translation id="6300718114348072351">មិនអាចកំណត់រចនាសម្ព័ន្ធ <ph name="PRINTER_NAME" /> ដោយស្វ័យប្រវត្តិបានទេ។ សូមបញ្ជាក់ព័ត៌មានលម្អិតម៉ាស៊ីនបោះពុម្ពកម្រិតខ្ពស់។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="6305607932814307878">គោលការណ៍សកល៖</translation> <translation id="6307990684951724544">ប្រព័ន្ធជាប់រវល់</translation> <translation id="6308493641021088955">ការចូលគណនីដែលផ្ដល់ដោយ <ph name="EXTENSION_NAME" /></translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">មិនអាចធ្វើការសម្អាតនៅពេលនេះបានទេ</translation> <translation id="6556866813142980365">ធ្វើវិញ</translation> <translation id="6557290421156335491">ផ្លូវកាត់របស់ខ្ញុំ</translation> +<translation id="6561560012278703671">ប្រើការផ្ញើសារស្ងាត់ជាងមុន (ទប់ស្កាត់សារជូនដំណឹងមិនឱ្យរំខានអ្នក)</translation> <translation id="6561726789132298588">បញ្ចូល</translation> <translation id="656293578423618167">ផ្លូវ និងឈ្មោះឯកសារវែងពេក។ សូមរក្សាទុកជាមួយឈ្មោះខ្លីជាងនេះ ឬទៅទីតាំងដ៏ទៃទៀត។</translation> <translation id="6563469144985748109">អ្នកគ្រប់គ្រងរបស់អ្នកមិនទាន់យល់ព្រមនៅឡើយទេ</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">សួរមុនពេលផ្ញើ</translation> <translation id="6840184929775541289">មិនមែនជាអាជ្ញាធរវិញ្ញាបនប័ត្រទេ</translation> <translation id="6841186874966388268">កំហុស</translation> +<translation id="6843267103192918276">ចូលគណនី ដើម្បីទទួលបានចំណាំ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតរបស់អ្នកនៅលើឧបករណ៍ទាំងអស់របស់អ្នក។ អ្នកក៏នឹងចូលសេវាកម្ម Google របស់អ្នកដោយស្វ័យប្រវត្តិផងដែរ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google ត្រូវបានកំណត់រួចហើយ</translation> <translation id="6845038076637626672">បើកការពង្រីក</translation> <translation id="6845325883481699275">ជួយកែលម្អសុវត្ថិភាព Chrome</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware របស់អ្នកអាចធ្វើការរៀបចំបានហើយ។</translation> <translation id="744341768939279100">បង្កើតទម្រង់ថ្មី</translation> <translation id="7443806024147773267">ចូលប្រើពាក្យសម្ងាត់របស់អ្នក រាល់ពេលដែលអ្នកចូលគណនី Google របស់អ្នក</translation> -<translation id="7444046173054089907">ទំព័រនេះត្រូវបានរារាំង</translation> <translation id="7444983668544353857">បិទដំណើរការ <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">ដំឡើងកម្មវិធីដោយស្វ័យប្រវត្តិ</translation> <translation id="7450761244949417357">កំពុងបើកនៅក្នុង <ph name="ALTERNATIVE_BROWSER_NAME" /> ឥឡូវនេះ</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">ដកបុគ្គលនេះចេញ</translation> <translation id="8215295261562449873">បម្រុងទុកកម្មវិធី និងឯកសាររបស់ខ្ញុំទៅក្នុងថត "ទាញយក" មុនពេលដំឡើងកំណែ Linux។</translation> <translation id="8217399928341212914">បន្តរារាំងការទាញយកឯកសារជាច្រើនដោយស្វ័យប្រវត្តិ</translation> +<translation id="8218847192766059983">បញ្ចូលភាសា ឬតម្រៀបបញ្ជីឡើងវិញ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation> <translation id="8221491193165283816">ជាធម្មតា អ្នកទប់ស្កាត់ការជូនដំណឹង។ ដើម្បីអនុញ្ញាតឱ្យគេហទំព័រនេះជូនដំណឹងដល់អ្នក សូមចុចត្រង់នេះ។</translation> <translation id="8225265270453771718">ចែករំលែកវិនដូកម្មវិធី</translation> <translation id="8225753906568652947">ប្ដូរការផ្តល់ជូនរបស់អ្នក</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">កែប្រែ</translation> <translation id="9066773882585798925">ស្តាប់ការអានអក្សរឮៗ</translation> <translation id="9066782832737749352">អត្ថបទទៅការនិយាយ</translation> +<translation id="9067559831321817373">គ្រប់គ្រងគណនីដែលអ្នកបានចូល។ គេហទំព័រ កម្មវិធី និងកម្មវិធីបន្ថែមនៅក្នុង Chrome និង Google Play អាចប្រើគណនីទាំងនេះ ដើម្បីកំណត់បទពិសោធន៍ប្រើប្រាស់តាមបំណងរបស់អ្នក ដោយផ្អែកលើការអនុញ្ញាត។ <a>ស្វែងយល់បន្ថែម</a></translation> <translation id="9068849894565669697">ជ្រើសរើសពណ៌</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">ប៊្លូធូស</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 4446bcc..860a636 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1750,7 +1750,6 @@ <translation id="347670947055184738">ಓಹ್! ನಿಮ್ಮ ಸಾಧನಕ್ಕಾಗಿ ನೀತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation> <translation id="347785443197175480">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಗೆ ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರೆಸಿ</translation> <translation id="3478685642445675458">ವ್ಯಕ್ತಿಯನ್ನು ತೆಗೆದುಹಾಕುವ ಮೊದಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ.</translation> -<translation id="3479539252931486093">ಇದು ಅನಿರೀಕ್ಷಿತವೇ? <ph name="BEGIN_LINK" />ನಮಗೆ ತಿಳಿಸಿ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ಈಗ ಬೇಡ</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> ಸೆಕೆಂಡುಗಳಲ್ಲಿ <ph name="ALTERNATIVE_BROWSER_NAME" /> ನಲ್ಲಿ ತೆರೆಯಲಾಗುತ್ತದೆ</translation> <translation id="3484273680291419129">ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ...</translation> @@ -4471,7 +4470,6 @@ <translation id="7442465037756169001">ನಿಮ್ಮ Hangouts Meet hardware ಸೆಟಪ್ಗೆ ಎಲ್ಲ ರೀತಿಯಲ್ಲಿಯೂ ಸಿದ್ಧವಾಗಿದೆ.</translation> <translation id="744341768939279100">ಹೊಸ ಪ್ರೊಫೈಲ್ ರಚಿಸಿ</translation> <translation id="7443806024147773267">ನಿಮ್ಮ Google ಖಾತೆಗೆ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗಲೆಲ್ಲಾ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಿರಿ</translation> -<translation id="7444046173054089907">ಈ ಸೈಟ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="7448430327655618736">ಆ್ಯಪ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ</translation> <translation id="7450761244949417357">ಇದೀಗ <ph name="ALTERNATIVE_BROWSER_NAME" /> ನಲ್ಲಿ ತೆರೆಯಲಾಗುತ್ತಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 59736883..5460105 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">페이지가 응답하지 않음</translation> <translation id="1041263367839475438">사용 가능한 기기</translation> <translation id="1042174272890264476">또한 컴퓨터에는 <ph name="SHORT_PRODUCT_NAME" /> RLZ 라이브러리가 내장되어 있습니다. RLZ는 고유하지 않고 개인 식별이 불가능한 태그를 할당하여 특정 홍보 캠페인을 통한 검색 및 <ph name="SHORT_PRODUCT_NAME" /> 사용 실태를 측정합니다. 이러한 라벨은 <ph name="PRODUCT_NAME" />의 Google 검색어에 표시되기도 합니다.</translation> +<translation id="1043818413152647937">아래 앱의 데이터도 삭제하시겠습니까?</translation> <translation id="1045692658517323508">{0,plural, =1{1분 이내로 업데이트해 주세요}other{#분 이내로 업데이트해 주세요}}</translation> <translation id="1046635659603195359">다른 기기의 Google 어시스턴트에서 이미 Voice Match를 설정한 것 같습니다. 이전에 녹음된 음성을 사용하여 이 기기에서 음성 모델을 만들 수 있습니다. 이 작업은 최대 1분 정도 걸립니다.</translation> <translation id="1047431265488717055">링크 텍스트 복사(&X)</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google로 Chrome을 더욱 스마트하게</translation> <translation id="1147991416141538220">액세스 권한을 요청하려면 기기 관리자에게 문의하세요.</translation> <translation id="1149401351239820326">유효기간 월</translation> +<translation id="1150490752229770117">이 <ph name="DEVICE_TYPE" />의 마지막 자동 소프트웨어 및 보안 업데이트입니다. 향후 업데이트를 받으려면 새 모델로 업그레이드하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="1150565364351027703">선글라스</translation> <translation id="1151917987301063366"><ph name="HOST" />에서 센서에 액세스하도록 항상 허용</translation> <translation id="1153356358378277386">페어링된 기기</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">인증에 사용할 티켓을 선택하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="1712349894969001173">iPhone에 이 비밀번호 받기</translation> <translation id="1712552549805331520"><ph name="URL" />에서 로컬 컴퓨터에 데이터를 영구 저장하려고 합니다</translation> +<translation id="1714644264617423774">기기를 더 편하게 이용하기 위한 접근성 기능을 사용 설정합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="1717218214683051432">움직임 감지 센서</translation> +<translation id="171824261579749339">역방향 <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="1718835860248848330">지난 1시간</translation> <translation id="1719312230114180055">참고: 지문은 안전한 비밀번호 또는 PIN보다 보안 수준이 낮을 수도 있습니다.</translation> <translation id="1720318856472900922">TLS WWW 서버 인증</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">타사 쿠키 삭제</translation> <translation id="2097372108957554726">새 기기를 등록하려면 Chrome에 로그인하세요.</translation> <translation id="2099172618127234427">sshd 데몬을 설정하고 USB 드라이브에서 부팅하도록 사용 설정하는 Chrome OS 디버깅 기능을 사용 설정 중입니다.</translation> +<translation id="2099625543891475722">키와 같은 신체적 특징</translation> <translation id="2099686503067610784">서버 인증서 '<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation> <translation id="2100273922101894616">자동 로그인</translation> <translation id="2101225219012730419">버전:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">새 프로필 만들기</translation> <translation id="2446585455334014596"><ph name="APP_NAME" />에서 귀하의 신원을 확인하려고 합니다</translation> <translation id="2448312741937722512">유형</translation> +<translation id="2448734521821581858">쿠키는 사용자가 방문하는 웹사이트에서 생성된 파일로, 2가지 유형이 있습니다. 자사 쿠키는 방문하는 사이트에 의해 생성됩니다. 이때 사이트가 주소 표시줄에 나타납니다. 타사 쿠키는 다른 사이트, 즉 광고나 이미지 등 방문하는 웹사이트에 표시되는 일부 콘텐츠를 소유한 사이트에 의해 생성됩니다.</translation> <translation id="2450223707519584812">Google API 키가 누락되었으므로 사용자를 추가할 수 없습니다. 자세한 내용은 <ph name="DETAILS_URL" /> 페이지를 참조하세요.</translation> <translation id="2450849356604136918">활성화된 뷰 없음</translation> <translation id="2451298179137331965">2배</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">타임아웃</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" />의 기기</translation> <translation id="2594999711683503743">Google에서 검색하거나 URL을 입력하세요.</translation> +<translation id="2600522410036850735">이 기기는 <ph name="MONTH_AND_YEAR" />까지 자동 소프트웨어 및 보안 업데이트를 받습니다. <a target="_blank" href="<ph name="URL" />">자세히 알아보기</a></translation> <translation id="2603115962224169880">컴퓨터 정리</translation> <translation id="2603463522847370204">시크릿 창에서 열기(&I)</translation> <translation id="2604255671529671813">네트워크 연결 오류</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">세이프 브라우징(사용자와 사용자의 기기를 위험한 사이트로부터 보호)</translation> <translation id="3182749001423093222">맞춤법 검사</translation> <translation id="3183139917765991655">프로필 가져오기 도구</translation> +<translation id="3184536091884214176">CUPS 프린터를 설정하거나 관리합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="3188257591659621405">내 파일</translation> <translation id="3188465121994729530">이동 평균</translation> <translation id="3190558889382726167">비밀번호 저장됨</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">시스템에서 기기 정책을 가져오지 못했습니다.</translation> <translation id="347785443197175480"><ph name="HOST" />에서 카메라와 마이크에 액세스하도록 계속 허용</translation> <translation id="3478685642445675458">프로필을 잠금 해제한 다음 사용자를 삭제하세요.</translation> -<translation id="3479539252931486093">예기치 않은 문제가 발생했나요? <ph name="BEGIN_LINK" />Google에 알리기<ph name="END_LINK" /></translation> <translation id="3479552764303398839">나중에</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" />초 후 <ph name="ALTERNATIVE_BROWSER_NAME" />에서 열립니다.</translation> <translation id="3484273680291419129">유해한 소프트웨어 삭제 중...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">로그인 화면에 사용자 이름과 사진 표시</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID 기기 연결됨</translation> <translation id="4142052906269098341">휴대전화를 사용해 <ph name="DEVICE_TYPE" />을(를) 잠금 해제하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">감지된 프린터를 프로필에 저장하거나 새 프린터를 추가합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="4144218403971135344">우수한 화질의 동영상을 감상하고 배터리를 더 오래 사용하세요. 동영상은 Cast가 지원되는 화면에서만 재생됩니다.</translation> <translation id="4146026355784316281">항상 시스템 뷰어로 열기</translation> <translation id="4146785383423576110">재설정 및 정리하기</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">멜론</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation> <translation id="4364830672918311045">알림 표시</translation> +<translation id="436499142539576997">앱 데이터를 가져올 수 없습니다. 아직 앱 실행을 시도하는 중입니다...</translation> <translation id="4370975561335139969">입력한 이메일과 비밀번호가 일치하지 않습니다.</translation> <translation id="437184764829821926">고급 글꼴 설정</translation> <translation id="4374831787438678295">Linux 설치 프로그램</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">http, https 및 파일 프로토콜에만 브라우저 리디렉션이 지원됩니다.</translation> <translation id="4659077111144409915">기본 계정</translation> <translation id="4660476621274971848">'<ph name="EXPECTED_VERSION" />' 버전을 예상했으나 '<ph name="NEW_ID" />' 버전이 표시되었습니다</translation> +<translation id="4660838440047236328">방의 구조</translation> <translation id="4662788913887017617">이 북마크를 내 iPhone과 공유</translation> <translation id="4663373278480897665">카메라 허용됨</translation> <translation id="4664482161435122549">PKCS #12 내보내기 오류</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">시작 페이지가 <ph name="URL" />(으)로 변경되었습니다.</translation> <translation id="4902546322522096650">네트워크 <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 연결</translation> <translation id="49027928311173603">서버에서 다운로드한 정책이 잘못됨: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">네트워크 파일 공유를 설정하거나 관리합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="4907161631261076876">이 파일은 위험할 수 있기 때문에 일반적으로 다운로드하지 않습니다.</translation> <translation id="4907306957610201395">권한 카테고리</translation> <translation id="4908811072292128752">새 탭을 열어 한 번에 두 개의 사이트를 탐색할 수 있습니다</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">사용 설정 중...</translation> <translation id="5039804452771397117">허용</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />을(를) Linux에 연결하려면 설정으로 이동하세요.</translation> +<translation id="5043913660911154449">또는 프린터 PPD 지정 <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation> <translation id="504561833207953641">기존 브라우저 세션에서 여는 중입니다.</translation> <translation id="5047421709274785093">사이트에서 모션 및 조도 센서 사용 차단</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">이 설정은 자녀 사용자가 변경할 수 없습니다.</translation> <translation id="5466374726908360271">'<ph name="SEARCH_TERMS" />' 붙여넣기 및 검색(&S)</translation> <translation id="5468173180030470402">파일 공유 찾는 중</translation> +<translation id="5470735824776589490">기기를 파워워시로 초기화하기 전에 다시 시작해야 합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5471768120198416576">안녕하세요. 텍스트 음성 변환의 음성입니다.</translation> <translation id="5472133193607270166">사용 설정하면 사이트에서 사용자의 타 사이트 탐색 활동 정보를 이용해 광고를 맞춤설정할 수 없습니다. 일부 사이트는 제대로 작동하지 않을 수 있습니다.</translation> <translation id="5473333559083690127">새 PIN 다시 입력</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">정리</translation> <translation id="5499313591153584299">이 파일은 컴퓨터에 해로울 수 있습니다.</translation> <translation id="5502500733115278303">Firefox에서 가져온 북마크</translation> +<translation id="5505264765875738116">사이트에서 알림 전송 허용을 요청할 수 없음</translation> <translation id="5505307013568720083">잉크 부족</translation> <translation id="5507756662695126555">부인 방지</translation> <translation id="5509693895992845810">다른 이름으로 저장(&A)...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">환경설정</translation> <translation id="5804175651771201311">로밍 꺼짐</translation> <translation id="5804241973901381774">권한</translation> +<translation id="5804427196348435412">NFC 기기 사용</translation> <translation id="5805697420284793859">창 관리자</translation> <translation id="5806773519584576205">0°(기본값)</translation> <translation id="5811750797187914944">설정 완료</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">최대화 상태로 열기</translation> <translation id="6096326118418049043">X.500 이름</translation> <translation id="6097480669505687979">저장 공간을 확보하지 않으면 사용자 및 데이터가 자동으로 삭제될 수 있습니다.</translation> +<translation id="6097600385983390082">음성 검색 닫힘</translation> <translation id="6098793583803863900">위험한 콘텐츠가 있는지 확인하기 위해 알 수 없는 파일을 검사 중입니다.</translation> <translation id="6100736666660498114">시작 메뉴</translation> <translation id="6101226222197207147">새 앱이 추가됨(<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">키보드 대신 음성 사용을 기본값으로 설정</translation> <translation id="6234474535228214774">설치 대기 중</translation> <translation id="6237816943013845465">화면 해상도를 조정할 수 있습니다.</translation> +<translation id="6238624845858322552">블루투스 장치에 연결</translation> <translation id="6238767809035845642">다른 기기에서 공유된 텍스트</translation> <translation id="6238923052227198598">잠금 화면에 최근 메모 보관</translation> <translation id="6239558157302047471">프레임 새로고침(&F)</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">네트워크 <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 휴대전화 배터리 <ph name="BATTERY_STATUS" />%, 연결</translation> <translation id="6268252012308737255"><ph name="APP" />(으)로 열기</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">사이트에서 알림 전송 허용을 요청할 수 있음</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />시스템 및 앱 정보<ph name="END_LINK1" />와 <ph name="BEGIN_LINK2" />통계<ph name="END_LINK2" /> 전송</translation> <translation id="6272643420381259437">플러그인을 다운로드하는 중에 오류(<ph name="ERROR" />)가 발생했습니다.</translation> <translation id="6273677812470008672">품질</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">계정</translation> <translation id="6298962879096096191">Google Play를 사용하여 Android 앱을 설치합니다.</translation> <translation id="630065524203833229">종료(&X)</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" />을(를) 자동으로 설정할 수 없습니다. 고급 프린터 세부정보를 지정해 주세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="6305607932814307878">전체 정책:</translation> <translation id="6307990684951724544">시스템 사용 중</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" />에서 제공한 로그인</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">현재 정리 기능을 사용할 수 없음</translation> <translation id="6556866813142980365">다시실행</translation> <translation id="6557290421156335491">내 바로가기</translation> +<translation id="6561560012278703671">눈에 띄지 않는 메시지 사용(방해가 되지 않도록 알림 메시지 차단)</translation> <translation id="6561726789132298588">입력</translation> <translation id="656293578423618167">파일 경로 또는 이름이 너무 깁니다. 짧은 이름으로 변경하거나 다른 위치에 저장하세요.</translation> <translation id="6563469144985748109">관리자가 아직 승인하지 않았습니다.</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">보내기 전에 확인</translation> <translation id="6840184929775541289">인증 기관 아님</translation> <translation id="6841186874966388268">오류</translation> +<translation id="6843267103192918276">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다. Google 서비스에도 자동으로 로그인됩니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google 설정 완료</translation> <translation id="6845038076637626672">최대화 상태로 열기</translation> <translation id="6845325883481699275">Chrome 보안 강화 개선에 참여하기</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">행아웃 미팅 하드웨어 설정 준비가 완료되었습니다.</translation> <translation id="744341768939279100">새 프로필 만들기</translation> <translation id="7443806024147773267">Google 계정에 로그인되어 있으면 어디서나 비밀번호에 액세스할 수 있습니다.</translation> -<translation id="7444046173054089907">차단된 사이트</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> 사용 중지</translation> <translation id="7448430327655618736">앱 자동 설치</translation> <translation id="7450761244949417357">지금 <ph name="ALTERNATIVE_BROWSER_NAME" />에서 여는 중</translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">이 사용자 삭제</translation> <translation id="8215295261562449873">Linux를 업그레이드하기 전에 앱과 파일을 다운로드 폴더에 백업합니다.</translation> <translation id="8217399928341212914">여러 파일을 다운로드하지 못하도록 계속 차단</translation> +<translation id="8218847192766059983">언어를 추가하거나 목록을 재정렬합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="8221491193165283816">기본적으로 알림을 차단하는 중입니다. 이 사이트의 알림을 허용하려면 여기를 클릭하세요.</translation> <translation id="8225265270453771718">애플리케이션 창 공유</translation> <translation id="8225753906568652947">혜택 사용하기</translation> @@ -5644,6 +5665,7 @@ <translation id="9065203028668620118">수정</translation> <translation id="9066773882585798925">소리 내어 읽은 텍스트 듣기</translation> <translation id="9066782832737749352">텍스트 음성 변환</translation> +<translation id="9067559831321817373">로그인된 계정을 관리합니다. 웹사이트, 앱, Chrome 확장 프로그램 및 Google Play에서 권한에 따라 이 계정을 사용하여 사용 환경을 맞춤설정할 수 있습니다. <a>자세히 알아보기</a></translation> <translation id="9068849894565669697">색상 선택</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">블루투스</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index be2fb39..ece42976 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Барак жооп бербей жатат</translation> <translation id="1041263367839475438">Жеткиликтүү түзмөктөр</translation> <translation id="1042174272890264476">Компьютериңизде <ph name="SHORT_PRODUCT_NAME" /> өнүмүнүн RLZ китепканасы камтылган. Белгилүү бир жарнамалык иш-чара башкарган издөө аракеттерин жана <ph name="SHORT_PRODUCT_NAME" /> колдонулушун талдап туруу үчүн RLZ кеңири кездешкен жалпы таанылуучу тегди дайындайт. Бул белгилер айрым учурларда Google Издөө сурамдарындагы <ph name="PRODUCT_NAME" /> өнүмүндө көрүнөт.</translation> +<translation id="1043818413152647937">Дайын-даректер бул колдонмолордон да өчүрүлсүнбү?</translation> <translation id="1045692658517323508">{0,plural, =1{1 мүнөттүн ичинде жаңыртыңыз}other{# мүнөттүн ичинде жаңыртыңыз}}</translation> <translation id="1046635659603195359">Google Жардамчыңыздагы Voice Match'ти буга чейин башка түзмөктө жөндөп алган окшойсуз. Мурунку жаздырууларыңыздын негизинде үнүңүздүн үлгүсүн ушул түзмөктө даярдоого болот. Буга бир мүнөткө жетпеген убакыт керек.</translation> <translation id="1047431265488717055">Шилтеме тек&стин көчүрүү</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google'дун акылдуу жөндөөлөрүн Chrome'до колдонуңуз</translation> <translation id="1147991416141538220">Кирүү мүмкүнчүлүгүн алуу үчүн түзмөктүн администраторуна кайрылыңыз.</translation> <translation id="1149401351239820326">Колдонуу мөөнөтү аяктаган ай</translation> +<translation id="1150490752229770117">Бул <ph name="DEVICE_TYPE" /> үчүн программаны жаңылоо жана коопсуздук жаңыртуу акыркы жолу автоматтык түрдө аткарылат. Кийинки жаңыртууларды алуу үчүн учурдагы үлгүсүн кийинки версияга көтөрүңүз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Күндөн калкалоочу көз айнек</translation> <translation id="1151917987301063366"><ph name="HOST" /> сайты түзмөктүн сенсорлорун ар дайым колдоно берсин</translation> <translation id="1153356358378277386">Жупташкан түзмөктөр</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Аутентификациядан өтүү үчүн билет тандоо. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Бул сырсөздү iPhone’уңузга көчүрүп алыңыз</translation> <translation id="1712552549805331520"><ph name="URL" /> компьютериңизге дайындарды биротоло сактаганы жатат</translation> +<translation id="1714644264617423774">Түзмөгүңүздүн колдонулушун жеңилдетүү үчүн жеткиликтүүлүк мүмкүнчүлүктөрүн иштетиңиз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Кыймыл сенсорлору</translation> +<translation id="171824261579749339">Австралиялык <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Акыркы бир саат</translation> <translation id="1719312230114180055">Эскертүү: Манжа издерине караганда сырсөз же PIN код кыйла коопсузураак.</translation> <translation id="1720318856472900922">TLS WWW серверинин аныктыгын текшерүү</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Үчүнчү тараптын cookie файлдары тазалансын</translation> <translation id="2097372108957554726">Жаңы түзмөктөрдү каттоо үчүн Chrome'го киришиңиз керек</translation> <translation id="2099172618127234427">sshd демонду орнотуп, USB дисктерден жүктөөнү иштете турган Chrome OS мүчүлүштүктөрдү оңдоо өзгөчөлүктөрүн иштетип жатасыз.</translation> +<translation id="2099625543891475722">боюңуз сыяктуу физикалык мүнөздөмөлөрүңүз</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" сервер тастыктамасы жок кылынсынбы?</translation> <translation id="2100273922101894616">Авто кирүү</translation> <translation id="2101225219012730419">Версиясы:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Жаңы профиль түзүү</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> колдонмосу аныктыгыңызды текшергени жатат</translation> <translation id="2448312741937722512">Түрү</translation> +<translation id="2448734521821581858">Cookie файлдары сиз баш баккан вебсайттар түзгөн файлдар. Cookie файлдарынын эки түрү болот: Биринчи тараптын cookie файлдарын сиз баш баккан сайттар түзөт. Сайт дарек тилкесинде көрүнүп турат. Биринчи тараптын cookie файлдарын башка сайттар түзөт. Ал сайттарга сиз баш баккан сайттарда көрсөтүлгөн жарнамалар жана сүрөттөр сыяктуу айрым мазмун таандык.</translation> <translation id="2450223707519584812">Google API ачкычтары жок болгондуктан колдонуучуларды кошо албайсыз. Чоо-жайын <ph name="DETAILS_URL" /> дарегинен караңыз.</translation> <translation id="2450849356604136918">активдүү көрүү режимдери жок</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Күтүү убакыты аяктады</translation> <translation id="2588636910004461974">Камсыздоочунун (<ph name="VENDOR_NAME" />) түзмөктөрү</translation> <translation id="2594999711683503743">Google'дан издеңиз же URL'ди териңиз</translation> +<translation id="2600522410036850735">Бул түзмөк программанын жана коопсуздук жаңыртууларын <ph name="MONTH_AND_YEAR" /> чейин автоматтык түрдө алат. <a target="_blank" href="<ph name="URL" />">Кеңири маалымат</a></translation> <translation id="2603115962224169880">Компьютерди тазалоо</translation> <translation id="2603463522847370204">&Жашыруун терезеде ачуу</translation> <translation id="2604255671529671813">Тармакка туташуу катасы</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Коопсуз серептөө (сизди жана түзмөгүңүздү кооптуу сайттардан коргойт)</translation> <translation id="3182749001423093222">Орфографиялык текшерүү</translation> <translation id="3183139917765991655">Профиль импорттогуч</translation> +<translation id="3184536091884214176">CUPS принтерлерин жөндөө же башкаруу. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Менин файлдарым</translation> <translation id="3188465121994729530">Жылма ортоломо</translation> <translation id="3190558889382726167">Сырсөз сакталды</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Ой! Тутум бул түзмөк үчүн саясатты ала албай калды.</translation> <translation id="347785443197175480"><ph name="HOST" /> камераңыз менен микрофонуңузду колдоно берсин</translation> <translation id="3478685642445675458">Адамды алып салаардан мурун, профилиңиздин кулпусун ачыңыз.</translation> -<translation id="3479539252931486093">Мындайды күткөн жок белеңиз? <ph name="BEGIN_LINK" />Бизге билдирип коюңуз<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Азыр эмес</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> аркылуу <ph name="COUNTDOWN_SECONDS" /> секунддан кийин ачылат</translation> <translation id="3484273680291419129">Зыянкеч программа алынып салынууда…</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Кирүү экранында колдонуучунун ысымдары менен сүрөттөрдү көрсөтүү</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID түзмөгү туташты</translation> <translation id="4142052906269098341"><ph name="DEVICE_TYPE" /> кулпусун телефонуңуз менен ачасыз. <ph name="LINK_BEGIN" />Көбүрөөк билүү<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Аныкталган принтерлерди профилиңизге сактаңыз же жаңы принтер кошуңуз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Видеонун сапатын жакшыртуу менен бирге түзмөгүңүздүн кубатын үнөмдөңүз. Видео Google Cast иштетилген экранда гана ойнотулат.</translation> <translation id="4146026355784316281">Ар дайым тутум көрсөткүч менен ачуу</translation> <translation id="4146785383423576110">Баштапкы абалга келтирип, тазалоо</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Коон</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> колдонмосу терезесин бөлүшүүдө.</translation> <translation id="4364830672918311045">Эскертмелерди чагылдыруу</translation> +<translation id="436499142539576997">Колдонмонун маалыматы алынбай калды. Колдонмону иштетүүгө аракет кылынууда…</translation> <translation id="4370975561335139969">Киргизилген электрондук почта дареги менен сырсөз дал келбейт</translation> <translation id="437184764829821926">Өркүндөтүлгөн арип жөндөөлөрү</translation> <translation id="4374831787438678295">Linux орноткучу</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Серепчидеги башка дарекке багыттамада http, https жана файл протоколдору гана колдоого алынат.</translation> <translation id="4659077111144409915">Негизги аккаунт</translation> <translation id="4660476621274971848">Күтүлүп жаткан версия – "<ph name="EXPECTED_VERSION" />" болчу, бирок "<ph name="NEW_ID" />" версиясы алынып калды</translation> +<translation id="4660838440047236328">бөлмөңүздүн көрүнүшү</translation> <translation id="4662788913887017617">Бул кыстарманы iPhone’уңуз менен бөлүшүңүз</translation> <translation id="4663373278480897665">Камераны колдонууга уруксат берилди</translation> <translation id="4664482161435122549">PKCS #12 экспорт катасы</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Баштоо бетиңиз <ph name="URL" /> дарегине өзгөртүлдү.</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, Туташуу</translation> <translation id="49027928311173603">Серверден жүктөлүп алынган саясат жараксыз: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Тармактын жалпы файлдарын жөндөңүз же башкарыңыз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Бул файл негизинен жүктөлүп алынбайт, ошондуктан коркунучтуу болушу мүмкүн.</translation> <translation id="4907306957610201395">Уруксат категориясы</translation> <translation id="4908811072292128752">Бир убакта эки сайтта серептөө үчүн жаңы өтмөк ачыңыз</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Иштетилүүдө…</translation> <translation id="5039804452771397117">Уруксат берүү</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> түзмөгүн Linux менен байланыштыруу үчүн, Жөндөөлөрдү ачыңыз</translation> +<translation id="5043913660911154449">Же принтериңиздин PPD файлын көрсөтүңүз <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Сырсөз туура эмес</translation> <translation id="504561833207953641">Терезе же өтмөк серепчинин учурдагы сеансында ачылат.</translation> <translation id="5047421709274785093">Сайттарда кыймыл жана жарык сенсорлорун колдонуу бөгөттөлсүн</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Бул жөндөөнү жашы жете элек колдонуучу өзгөртө албайт.</translation> <translation id="5466374726908360271">"<ph name="SEARCH_TERMS" />" дегенди ча&птап, издөө</translation> <translation id="5468173180030470402">Бөлүшүлгөн файлдар изделүүдө</translation> +<translation id="5470735824776589490">Түзмөктү "жууп салып" баштапкы абалга келтирээрден мурун, аны өчүрүп күйгүзүү керек. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Салам! Мен сизге текстти окуп беремин.</translation> <translation id="5472133193607270166">Күйгүзүлсө, сайттар жарнамаларды жекелештирүү үчүн башка сайттардагы серептөө аракеттериңизди колдоно алышпайт Айрым сайттар туура иштебеши мүмкүн.</translation> <translation id="5473333559083690127">Жаңы PIN'ди кайра киргизиңиз</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Уюштуруу</translation> <translation id="5499313591153584299">Бул файлдын компьютериңизге зыяны тийип калышы мүмкүн.</translation> <translation id="5502500733115278303">Firefox'тон импорттолгон</translation> +<translation id="5505264765875738116">Сайттар билдирмелери жөнөтүүнү сурана алышпайт</translation> <translation id="5505307013568720083">Сыя түгөндү</translation> <translation id="5507756662695126555">Баш тартпастык</translation> <translation id="5509693895992845810">&Төмөнкүдөй сактоо…</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Жеке жөндөөлөр</translation> <translation id="5804175651771201311">Роуминг өчүк</translation> <translation id="5804241973901381774">Уруксаттар</translation> +<translation id="5804427196348435412">NFC түзмөктөрүн колдонуу</translation> <translation id="5805697420284793859">Терезе башкаргычы</translation> <translation id="5806773519584576205">0° (Демейки)</translation> <translation id="5811750797187914944">Даяр болду!</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Чоңойтулуп ачылды</translation> <translation id="6096326118418049043">X.500 аталышы</translation> <translation id="6097480669505687979">Эгер орун бошотпосоңуз, колдонуучулар жана дайындар автоматтык түрдө алынып салынышы мүмкүн.</translation> +<translation id="6097600385983390082">Үн менен издөө жабылды</translation> <translation id="6098793583803863900">Белгисиз файлдагы зыяндуу мазмун изделүүдө.</translation> <translation id="6100736666660498114">Баштоо менюсу</translation> <translation id="6101226222197207147">Жаңы колдонмо кошулду (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Демейки шартта баскычтопту колдонуунун ордуна оозеки кайрылуу</translation> <translation id="6234474535228214774">Орнотуу күтүүдө</translation> <translation id="6237816943013845465">Экраныңыздын дааналыгын өзгөртө аласыз</translation> +<translation id="6238624845858322552">Bluetooth түзмөгүнө туташуу</translation> <translation id="6238767809035845642">Текст башка түзмөктөн бөлүшүлдү</translation> <translation id="6238923052227198598">Кулпуланган экранда эң акыркы эскертүү көрсөтүлсүн</translation> <translation id="6239558157302047471">Алкакты кайра жүктөө</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак, <ph name="PHONE_NAME" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, Телефондун батареясы <ph name="BATTERY_STATUS" />%, Туташуу</translation> <translation id="6268252012308737255"><ph name="APP" /> менен ачуу</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайттар билдирмелери жөнөтүүнү сурана алышат</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Тутум менен колдонмо жөнүндө маалымат<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />чендер<ph name="END_LINK2" /> жөнөтүлсүн</translation> <translation id="6272643420381259437">Плагин жүктөлүп алынып жатканда ката (<ph name="ERROR" />) кетти</translation> <translation id="6273677812470008672">Сапат</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Каттоо эсеби</translation> <translation id="6298962879096096191">Android колдонмолорун орнотуу үчүн Google Play'ди пайдаланыңыз</translation> <translation id="630065524203833229">Ч&ыгуу</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> автоматтык түрдө конфигурацияланган жок. Өркүндөтүлгөн принтердин чоо-жайын көрсөтүңүз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Глобалдык саясат:</translation> <translation id="6307990684951724544">Тутум бош эмес</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> менен кирдиңиз</translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Тазалоо учурда жеткиликсиз</translation> <translation id="6556866813142980365">Кайталоо</translation> <translation id="6557290421156335491">Менин ыкчам баскычтарым</translation> +<translation id="6561560012278703671">Даректер тилкесинде көрсөтүлгөн билдирмелерди колдонуңуз (сизди алаксыткан билдирмелерди бөгөттөйт)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Файлдын аталышы же ага алып барчу жол өтө узун. Анын аталышын кыскартыңыз же жакыныраак жерге сактаңыз.</translation> <translation id="6563469144985748109">Башкаруучуңуз буга уруксат бере элек</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Жөнөтүүдөн мурун суроо</translation> <translation id="6840184929775541289">Тастыктама борбору эмес</translation> <translation id="6841186874966388268">Каталар</translation> +<translation id="6843267103192918276">Бардык түзмөктөрүңүздөн кыстармаларды, таржымалды, сырсөздөрдү жана башка жөндөөлөрүңүздү алуу үчүн аккаунтуңузга кириңиз. Мындан тышкары Google кызматтарына да автоматтык түрдө киресиз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="6843423766595476978">"Окей Google" даяр</translation> <translation id="6845038076637626672">Чоңойтулуп ачылды</translation> <translation id="6845325883481699275">Chrome'догу коопсуздукту коргоону жакшыртууга жардам берүү</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet Hardware жөндөөгө даяр.</translation> <translation id="744341768939279100">Жаңы профиль түзүү</translation> <translation id="7443806024147773267">Google аккаунтуңузга кирериңиз менен сырсөздөрүңүзгө мүмкүнчүлүк аласыз</translation> -<translation id="7444046173054089907">Бул сайт бөгөттөлдү</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> өчүрүү</translation> <translation id="7448430327655618736">Колдонмолорду автоматтык түрдө орнотуу</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> аркылуу ачылууда</translation> @@ -5032,6 +5052,7 @@ <translation id="8214962590150211830">Бул адамды алып салуу</translation> <translation id="8215295261562449873">Linux'ту жаңыртуудан мурда колдонмолор менен файлдардын камдык көчүрмөлөрү "Жүктөлүп алынгандар" папкасына сакталсын.</translation> <translation id="8217399928341212914">Бир нече файлды автоматтык түрдө жүктөп алуу аракети бөгөттөлө берсин</translation> +<translation id="8218847192766059983">Тилдерди кошуңуз же тизмени иреттеңиз. <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Адатта билдирмелерди өчүрөсүз. Бул сайтка билдирмелерди жөнөтүүгө уруксат берүү үчүн бул жерди чыкылдатыңыз.</translation> <translation id="8225265270453771718">Колдонмонун терезесин бөлүшүңүз…</translation> <translation id="8225753906568652947">Сунуштарды пайдалануу</translation> @@ -5645,6 +5666,7 @@ <translation id="9065203028668620118">Түзөтүү</translation> <translation id="9066773882585798925">Тексттин окулушун угуу</translation> <translation id="9066782832737749352">Кеп синтезатору</translation> +<translation id="9067559831321817373">Кирип турган аккаунттарыңызды башкарасыз. Уруксаттарга жараша Chrome менен Google Play'деги вебсайттар, колдонмолор жана кеңейтүүлөр бул аккаунттарды сизге көрсөтүлгөн кызматтарды жекечелештирүү үчүн колдонушу мүмкүн. <a>Кеңири маалымат</a></translation> <translation id="9068849894565669697">Түс тандоо</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index cdf9795..8f6b873a 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">ໜ້ານີ້ບໍ່ຕອບສະໜອງ</translation> <translation id="1041263367839475438">ອຸປະກອນທີ່ໃຊ້ໄດ້</translation> <translation id="1042174272890264476">ຄອມພິວເຕີຂອງທ່ານຍັງມາພ້ອມກັບຄັງເກັບມ້ຽນ RLZ ຂອງ <ph name="SHORT_PRODUCT_NAME" /> ມາກັບເຄື່ອງ. RLZ ມອບໝາຍໃຫ້ແທັກສາມາດລະບຸໄດ້ບໍ່ເປັນເອກະລັກ, ບໍ່ເປັນສ່ວນຕົວ ເພື່ອວັດແທກການຄົ້ນຫາ ແລະການໃຊ້ <ph name="SHORT_PRODUCT_NAME" /> ຂັບເຄື່ອນໂດຍການໂຄສະນາສະເພາະ. ບາງຄັ້ງສະຫຼາກເຫຼົ່ານີ້ປະກົດຂຶ້ນຢູ່ໃນການສອບຖາມການຄົ້ນຫາ Google ຢູ່ໃນ <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">ລຶບຂໍ້ມູນອອກຈາກແອັບເຫຼົ່ານີ້ນຳບໍ?</translation> <translation id="1045692658517323508">{0,plural, =1{ອັບເດດພາຍໃນ 1 ນາທີ}other{ອັບເດດພາຍໃນ # ນາທີ}}</translation> <translation id="1046635659603195359">ເບິ່ງຄືວ່າທ່ານໄດ້ຕັ້ງຄ່າ Voice Match ກັບຜູ້ຊ່ວຍ Google ຂອງທ່ານໃນອຸປະກອນອື່ນແລ້ວ. ສາມາດໃຊ້ບັນທຶກສຽງຜ່ານມາເຫຼົ່ານີ້ເພື່ອສ້າງຕົວຢ່າງສຽງໃນອຸປະກອນນີ້ໄດ້. ນີ້ຄວນໃຊ້ເວລາໜ້ອຍກວ່າໜຶ່ງນາທີ.</translation> <translation id="1047431265488717055">ອັດສຳເນົາຂໍ້ຄວາມລິ້ງ</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">ມີ Google ອັດສະລິຍະໃນ Chrome</translation> <translation id="1147991416141538220">ເພື່ອຂໍສິດເຂົ້າເຖິງ, ກະລຸນາຕິດຕໍ່ຫາຜູ້ເບິ່ງແຍງລະບົບຂອງອຸປະກອນນີ້.</translation> <translation id="1149401351239820326">ເດືອນໝົດອາຍຸ</translation> +<translation id="1150490752229770117">ນີ້ແມ່ນການອັບເດດຊອບແວ ແລະ ຄວາມປອດໄພອັດຕະໂນມັດສຸດທ້າຍສຳລັບ <ph name="DEVICE_TYPE" /> ນີ້. ເພື່ອຮັບການອັບເດດໃນອະນາຄົດ, ກະລຸນາອັບເກຣດເປັນຮຸ່ນໃໝ່ກວ່າ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1150565364351027703">ແວ່ນກັນແດດ</translation> <translation id="1151917987301063366">ອະນຸຍາດໃຫ້ <ph name="HOST" /> ເຂົ້າເຖິງເຊັນເຊີ</translation> <translation id="1153356358378277386">ອຸປະກອນທີ່ຈັບຄູ່ກັນແລ້ວ</translation> @@ -509,7 +511,9 @@ <translation id="1709217939274742847">ເລືອກປີ້ເພື່ອໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງ <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1712349894969001173">ເອົາລະຫັດຜ່ານນີ້ໃນ iPhone ຂອງທ່ານ</translation> <translation id="1712552549805331520"><ph name="URL" /> ຕ້ອງການເກັບຂໍ້ມູນໄວ້ໃນຄອມພິວເຕີສະເພາະບ່ອນຂອງທ່ານຢ່າງຖາວອນ</translation> +<translation id="1714644264617423774">ເປີດການນຳໃຊ້ຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງເພື່ອເຮັດໃຫ້ອຸປະກອນຂອງທ່ານໃຊ້ງ່າຍຂຶ້ນ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1717218214683051432">ເຊັນກວດຈັບການເຄື່ອນໄຫວ</translation> +<translation id="171824261579749339">ອອສເຕຣເລຍ <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="1718835860248848330">ຊົ່ວໂມງຜ່ານມາ</translation> <translation id="1719312230114180055">ໝາຍເຫດ: ການໃຊ້ລາຍນິ້ວມືຂອງທ່ານອາດຈະປອດໄພໜ້ອຍກວ່າລະຫັດຜ່ານ ຫຼື PIN ທີ່ຄາດເດົາຍາກ.</translation> <translation id="1720318856472900922">ການຮັບຮອງເຊີບເວີ TLS WWW</translation> @@ -771,6 +775,7 @@ <translation id="2096715839409389970">ລຶບລ້າງຄຸກກີ້ພາກສ່ວນທີສາມ</translation> <translation id="2097372108957554726">ທ່ານຈໍາເປັນຕ້ອງລົງຊື່ເຂົ້າໃຊ້ Chrome ເພື່ອລົງທະບຽນອຸປະກອນໃໝ່</translation> <translation id="2099172618127234427">ທ່ານກຳລັງເປີດໃຊ້ງານຄຸນສົມບັດການແກ້ໄຂບັນຫາ Chrome OS ເຊິ່ງຈະຕັ້ງ sshd daemon ແລaະເປີດໃຊ້ງານການບູດnຈາກອຸປະກອນ USB.</translation> +<translation id="2099625543891475722">ລັກສະນະຮ່າງກາຍຂອງທ່ານ ເຊັ່ນ: ລວງສູງ</translation> <translation id="2099686503067610784">ລຶບໃບຢັ້ງຢືນເຊີບເວີ "<ph name="CERTIFICATE_NAME" />" ບໍ?</translation> <translation id="2100273922101894616">ເຂົ້າສູ່ລະບົບອັດຕະໂນມັດ</translation> <translation id="2101225219012730419">ລຸ້ນ:</translation> @@ -1025,6 +1030,7 @@ <translation id="2445484935443597917">ສ້າງໂປຣໄຟລ໌ໃໝ່</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ຕ້ອງການຢັ້ງຢືນຕົວຕົນຂອງທ່ານ</translation> <translation id="2448312741937722512">ປະເພດ</translation> +<translation id="2448734521821581858">ຄຸກກີ້ແມ່ນໄຟລ໌ທີ່ສ້າງຂຶ້ນໂດຍເວັບໄຊທີ່ທ່ານເຂົ້າເບິ່ງ. ມີຄຸກກີ້ຢູ່ສອງປະເພດຄື: ຄຸກກີ້ພາກສ່ວນທຳອິດຖືກສ້າງຂຶ້ນໂດຍເວັບໄຊທີ່ທ່ານເຂົ້າເບິ່ງ. ເວັບໄຊປາກົດໃນແຖບທີ່ຢູ່. ຄຸກກີ້ພາກສ່ວນທີສາມຖືກສ້າງຂຶ້ນໂດຍເວັບໄຊອື່ນ. ເວັບໄຊເຫຼົ່ານີ້ເປັນເຈົ້າຂອງບາງເນື້ອຫາ ເຊັ່ນ: ໂຄສະນາ ຫຼື ຮູບພາບ ທີ່ທ່າເຫັນໃນເວັບໄຊທີ່ທ່ານເຂົ້າເບິ່ງ.</translation> <translation id="2450223707519584812">ທ່ານຈະບໍ່ສາມາດເພີ່ມຜູ້ໃຊ້ໄດ້ ເພາະວ່າຂາດປຸ່ມ Google API ໄປ. ເບິ່ງ <ph name="DETAILS_URL" /> ເປັນລາຍລະອຽດ.</translation> <translation id="2450849356604136918">ບໍ່ມີມຸມມອງເປີດຢູ່</translation> <translation id="2451298179137331965">2x</translation> @@ -1138,6 +1144,7 @@ <translation id="2587922766792651800">ໝົດເວລາແລ້ວ</translation> <translation id="2588636910004461974">ອຸປະກອນຈາກ <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">ຊອກຫາໃນ Google ຫຼື ພິມ URL</translation> +<translation id="2600522410036850735">ອຸປະກອນນີ້ຈະໄດ້ຮັບການອັບເດດຊອບແວ ແລະ ຄວາມປອດໄພໂດຍອັດຕະໂນມັດຈົນຮອດ <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">ສຶກສາເພີ່ມເຕີມ</a></translation> <translation id="2603115962224169880">ອະນາໄມຄອມພິວເຕີ</translation> <translation id="2603463522847370204">ເປີດຢູ່ໃນໜ້າຕ່າງທີ່ບໍ່ເຜີຍຕົນຕົວ</translation> <translation id="2604255671529671813">ການເຊື່ອມຕໍ່ເຄືອຂ່າຍຜິດພາດ</translation> @@ -1558,6 +1565,7 @@ <translation id="3181954750937456830">Safe Browsing (ປົກປ້ອງທ່ານ ແລະ ອຸປະກອນຂອງທ່ານຈາກເວັບໄຊອັນຕະລາຍ)</translation> <translation id="3182749001423093222">ກວດການສະກົດຄຳ</translation> <translation id="3183139917765991655">ຕົວນຳເຂົ້າໂປຣໄຟລ໌</translation> +<translation id="3184536091884214176">ຕັ້ງຄ່າ ຫຼື ຈັດການເຄື່ອງພິມ CUPS. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="3188257591659621405">ໄຟລ໌ຂອງຂ້ອຍ</translation> <translation id="3188465121994729530">ການຍ້າຍໂດຍສະເລ່ຍ</translation> <translation id="3190558889382726167">ບັນທຶກລະຫັດຜ່ານແລ້ວ</translation> @@ -1748,7 +1756,6 @@ <translation id="347670947055184738">ອຸ້ຍ! ລະບົບດຶງຂໍ້ມູນນະໂຍບາຍສຳລັບອຸປະກອນຂອງທ່ານບໍ່ສຳເລັດ.</translation> <translation id="347785443197175480">ສືບຕໍ່ອະນຸຍາດໃຫ້ <ph name="HOST" /> ເຂົ້າຫາກ້ອງຖ່າຍຮູບ ແລະໄມໂຄຣໂຟນຂອງທ່ານບໍ່</translation> <translation id="3478685642445675458">ກະລຸນາປົດລັອກໂປຣໄຟລ໌ຂອງທ່ານກ່ອນທີ່ຈະເອົາບຸກຄົນໃດໜຶ່ງອອກ.</translation> -<translation id="3479539252931486093">ນີ້ບໍ່ຄາດຄິດແມ່ນບໍ? <ph name="BEGIN_LINK" />ບອກໃຫ້ພວກເຮົາຮູ້<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ບໍ່ແມ່ນດຽວນີ້</translation> <translation id="3481268647794498892">ກຳລັງເປີດໃນ <ph name="ALTERNATIVE_BROWSER_NAME" /> ໃນ <ph name="COUNTDOWN_SECONDS" /> ວິນາທີ</translation> <translation id="3484273680291419129">ກຳລັງລຶບຊອບແວອັນຕະລາຍອອກ...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">ສະແດງຊື່ຜູ້ໃຊ້ ແລະຮຸບຢູ່ໃນໜ້າຈໍລົງຊື່ເຂົ້າໃຊ້</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - ເຊື່ອມຕໍ່ອຸປະກອນ HID ແລ້ວ</translation> <translation id="4142052906269098341">ປົດລັອກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານດ້ວຍໂທລະສັບຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">ບັນທຶກເຄື່ອງພິມທີ່ກວດພົບໄວ້ໃນໂປຣໄຟລ໌ຂອງທ່ານ ຫຼື ເພີ່ມເຄື່ອງພິມໃໝ່. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="4144218403971135344">ມີວິດີໂອຄຸນນະພາບທີ່ດີກວ່າ ແລະ ປະຢັດແບັດເຕີຣີ. ວິດີໂອຈະຫຼິ້ນໃນໜ້າຈໍທີ່ເປີດນຳໃຊ້ Cast ເທົ່ານັ້ນ.</translation> <translation id="4146026355784316281">ເປີດກັບຕົວເບິ່ງລະບົບທຸກຄັ້ງ</translation> <translation id="4146785383423576110">ຣີເຊັດ ແລະ ອະນາໄມ</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">ໝາກໂມ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນໜ້າຈໍ.</translation> <translation id="4364830672918311045">ສະແດງການແຈ້ງເຕືອນ</translation> +<translation id="436499142539576997">ບໍ່ສາມາດຮັບເອົາຂໍ້ມູນແອັບໄດ້, ຍັງພະຍາຍາມເອີ້ນໃຊ້ແອັບຢູ່...</translation> <translation id="4370975561335139969">ອີເມວ ແລະລະຫັດຜ່ານທີ່ທ່ານປ້ອນເຂົ້າບໍ່ກົງກັນ.</translation> <translation id="437184764829821926">ການຕັ້ງຄ່າຟ້ອນໜັງສືຂັ້ນສູງ</translation> <translation id="4374831787438678295">ຕົວຕິດຕັ້ງ Linux</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">ການປ່ຽນເສັ້ນທາງໂປຣແກຣມທ່ອງເວັບຮອງຮັບສະເພາະແຕ່ http, https ແລະ ໂປຣໂຕຄໍໄຟລ໌ເທົ່ານັ້ນ.</translation> <translation id="4659077111144409915">ບັນຊີຫຼັກ</translation> <translation id="4660476621274971848">ເວີຊັນທີ່ຄາດໄວ້ "<ph name="EXPECTED_VERSION" />", ແຕ່ເວີຊັນທີ່ຕິດຕັ້ງແມ່ນ "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">ແຜນຜັງຫ້ອງຂອງທ່ານ</translation> <translation id="4662788913887017617">ແບ່ງປັນບຸກມາກນີ້ກັບ iPhone ຂອງທ່ານ</translation> <translation id="4663373278480897665">ອະນຸຍາດກ້ອງຖ່າຍຮູບແລ້ວ</translation> <translation id="4664482161435122549">ການສົ່ງ PKCS #12 ອອກຜິດພາດ</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">ໜ້າເລີ່ມຕົ້ນຂອງທ່ານໄດ້ຖືກປ່ຽນເປັນ <ph name="URL" /> ແລ້ວ.</translation> <translation id="4902546322522096650">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />%, ເຊື່ອມຕໍ່</translation> <translation id="49027928311173603">ນະໂຍບາຍທີ່ດາວໂຫຼດຈາກເຊີບເວີໃຊ້ບໍ່ໄດ້: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">ຕັ້ງຄ່າ ຫຼື ຈັດການການແບ່ງປັນໄຟລ໌ຜ່ານເຄືອຂ່າຍ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ໄຟລ໌ນີ້ບໍ່ຖືກດາວໂຫລດໂດຍທົ່ວໄປ ແລະ ອາດເປັນອັນຕະລາຍໄດ້.</translation> <translation id="4907306957610201395">ປະເພດການອະນຸຍາດ</translation> <translation id="4908811072292128752">ເປີດແຖບໃໝ່ເພື່ອເລື່ອນເບິ່ງສອງເວັບໄຊພ້ອມກັນ</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">ກຳລັງເປີດນຳໃຊ້...</translation> <translation id="5039804452771397117">ອະນຸຍາດ</translation> <translation id="5042282098504489593">ເປີດການຕັ້ງຄ່າເພື່ອເຊື່ອມຕໍ່ <ph name="USB_DEVICE_NAME" /> ກັບ Linux</translation> +<translation id="5043913660911154449">ຫຼື ລະບຸ PPD ຂອງເຄື່ອງພິມຂອງທ່ານ <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ</translation> <translation id="504561833207953641">ກຳລັງເປີດໃນເຊດຊັນໂປຣແກຣມທ່ອງເວັບທີ່ມີຢູ່ແລ້ວ.</translation> <translation id="5047421709274785093">ບລັອກບໍ່ໃຫ້ເວັບໄຊໃຊ້ເຊັນເຊີກວດຈັບການເຄື່ອນໄຫວ ແລະ ແສງ</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">ຜູ້ໃຊ້ທີ່ເປັນເດັກນ້ອຍບໍ່ສາມາດປ່ຽນການຕັ້ງຄ່ານີ້ໄດ້.</translation> <translation id="5466374726908360271">ວາງໃສ່ ແລະ ຊອກຫາ “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">ກຳລັງຊອກຫາການແບ່ງປັນໄຟລ໌</translation> +<translation id="5470735824776589490">ຈໍາເປັນຕ້ອງຣິສະຕາດກ່ອນທີ່ຈະສາມາດຣີເຊັດອຸປະກອນຂອງທ່ານດ້ວຍ Powerwash ໄດ້. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">ສະບາຍດີ! ຂ້ອຍແມ່ນສຽງການປ່ຽນຂໍ້ຄວາມເປັນສຽງເວົ້າຂອງເຈົ້າ.</translation> <translation id="5472133193607270166">ເມື່ອເປີດຢູ່, ເວັບໄຊບໍ່ສາມາດໃຊ້ການເຄື່ອນໄຫວທ່ອງເວັບຂອງທ່ານໃນທົ່ວເວັບໄຊຕ່າງໆເພື່ອປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວໄດ້. ບາງເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້ຢ່າງຖືກຕ້ອງ.</translation> <translation id="5473333559083690127">ປ້ອນ PIN ໃໝ່ຄືນອີກ</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">ຈັດຕັ້ງ</translation> <translation id="5499313591153584299">ໄຟລ໌ນີ້ອາດຈະເປັນອັນຕະລາຍຕໍ່ຄອມພິວເຕີຂອງທ່ານ.</translation> <translation id="5502500733115278303">ນໍາເຂົ້າມາຈາກ Firefox ແລ້ວ</translation> +<translation id="5505264765875738116">ເວັບໄຊບໍ່ສາມາດຂໍໃຫ້ສົ່ງການແຈ້ງເຕືອນໄດ້</translation> <translation id="5505307013568720083">ໝຶກໝົດ</translation> <translation id="5507756662695126555">ການບໍ່ປະຕິເສດ</translation> <translation id="5509693895992845810">ບັນທຶກເປັນ...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">ຄວາມມັກ</translation> <translation id="5804175651771201311">ການໂຣມມິງປິດຢູ່</translation> <translation id="5804241973901381774">ການອະນຸຍາດ</translation> +<translation id="5804427196348435412">ໃຊ້ອຸປະກອນ NFC</translation> <translation id="5805697420284793859">ຕົວຈັດການໜ້າຈໍ</translation> <translation id="5806773519584576205">0° (ຕາມຄ່າເລີ່ມຕົ້ນ)</translation> <translation id="5811750797187914944">ທຸກຢ່າງພ້ອມແລ້ວ</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">ເປີດທີ່ໄດ້ຂະຫຍາຍແລ້ວ</translation> <translation id="6096326118418049043">ຊື່ X.500</translation> <translation id="6097480669505687979">ຖ້າທ່ານບໍ່ຂະຫຍາຍພື້ນທີ່ຫວ່າງ, ຜູ້ໃຊ້ ແລະ ຂໍ້ມູນອາດຈະຖືກລຶບອອກໂດຍອັດຕະໂນມັດ.</translation> +<translation id="6097600385983390082">ປິດການຊອກຫາດ້ວຍສຽງແລ້ວ</translation> <translation id="6098793583803863900">ກຳລັງສະແກນໄຟລ໌ທີ່ບໍ່ຮູ້ຈັກເພື່ອເບິ່ງເນື້ອຫາທີ່ອັນຕະລາຍ.</translation> <translation id="6100736666660498114">ເມນູເລີ່ມຕົ້ນ</translation> <translation id="6101226222197207147">ເພີ່ມແອັບໃໝ່ແລ້ວ ( <ph name="EXTENSION_NAME" /> )</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">ເຮັດໃຫ້ການໃຊ້ສຽງແທນແປ້ນພິມເປັນຄ່າເລີ່ມຕົ້ນ</translation> <translation id="6234474535228214774">ລໍຖ້າການຕິດຕັ້ງ</translation> <translation id="6237816943013845465">ອະນຸຍາດໃຫ້ທ່ານປັບຄວາມລະອຽດໜ້າຈໍຂອງທ່ານ</translation> +<translation id="6238624845858322552">ເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth</translation> <translation id="6238767809035845642">ຂໍ້ຄວາມທີ່ແບ່ງປັນຈາກອຸປະກອນອື່ນ</translation> <translation id="6238923052227198598">ຮັກສາບັນທຶກຫຼ້າສຸດໃນໜ້າຈໍລັອກ</translation> <translation id="6239558157302047471">ໂຫຼດ&ເຟຣມພາບຄືນໃໝ່</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, ສັນຍານຄວາມແຮງ <ph name="SIGNAL_STRENGTH" />%, ແບັດເຕີຣີໂທລະສັບ <ph name="BATTERY_STATUS" />%, ເຊື່ອມຕໍ່</translation> <translation id="6268252012308737255">ເປີດດ້ວຍ <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">ເວັບໄຊສາມາດຂໍໃຫ້ສົ່ງການແຈ້ງເຕືອນໄດ້</translation> <translation id="6270770586500173387">ສົ່ງ <ph name="BEGIN_LINK1" />ຂໍ້ມູນລະບົບ ແລະ ແອັບ<ph name="END_LINK1" />, ແລະ <ph name="BEGIN_LINK2" />ເມຕຣິກ<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">ມີຄວາມຜິດພາດ (<ph name="ERROR" />) ໃນຂະນະທີ່ດາວໂຫຼດປລັກອິນ</translation> <translation id="6273677812470008672">ຄຸນນະພາບ</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">ບັນຊີ</translation> <translation id="6298962879096096191">ໃຊ້ Google Play ເພື່ອຕິດຕັ້ງແອັບ Android</translation> <translation id="630065524203833229">ອອກ</translation> +<translation id="6300718114348072351">ບໍ່ສາມາດຕັ້ງຄ່າ <ph name="PRINTER_NAME" /> ໂດຍອັດຕະໂນມັດໄດ້. ກະລຸນາລະບຸລາຍລະອຽດເຄື່ອງພິມຂັ້ນສູງ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="6305607932814307878">ນະໂຍບາຍທົ່ວໂລກ:</translation> <translation id="6307990684951724544">ລະບົບບໍ່ຫວ່າງ</translation> <translation id="6308493641021088955">ການເຂົ້າສູ່ລະບົບທີ່ໃຫ້ໂດຍ <ph name="EXTENSION_NAME" /></translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">ການອະນາໄມບໍ່ສາມາດໃຊ້ໄດ້ໃນປັດຈຸບັນ</translation> <translation id="6556866813142980365">ເຮັດຄືນ</translation> <translation id="6557290421156335491">ທາງລັດຂອງຂ້ອຍ</translation> +<translation id="6561560012278703671">ໃຊ້ການສົ່ງຂໍ້ຄວາມທີ່ງຽບກວ່າ (ບລັອກບໍ່ໃຫ້ການແຈ້ງເຕືອນຂັດຈັງຫວະທ່ານ)</translation> <translation id="6561726789132298588">ປ້ອນເຂົ້າ</translation> <translation id="656293578423618167">ຊ່ອງທາງ ຫຼືຊື່ໄຟລ໌ຍາວເກີນໄປ. ກະລຸນາບັນທຶກດ້ວຍຊື່ທີ່ສັ້ນກ່ວາ ຫຼືໄປໃສ່ທີ່ຕັ້ງອື່ນ.</translation> <translation id="6563469144985748109">ຜູ້ຈັດການຂອງທ່ານຍັງບໍ່ທັນອະນຸມັດມັນເທື່ອ</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">ຖາມກ່ອນສົ່ງ</translation> <translation id="6840184929775541289">ບໍ່ແມ່ນໜ່ວຍງານອອກໃບຢັ້ງຢືນ</translation> <translation id="6841186874966388268">ຂໍ້ຜິດພາດ</translation> +<translation id="6843267103192918276">ເຂົ້າສູ່ລະບົບເພື່ອຮັບບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນໃນອຸປະກອນທັງໝົດຂອງທ່ານ ທ່ານຈະຍັງເຂົ້າສູ່ລະບົບການບໍລິການຂອງ Google ໄດ້ໂດຍອັດຕະໂນມັດນຳ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="6843423766595476978">ຕັ້ງຄ່າ Ok Google ຮຽບຮ້ອຍແລ້ວ</translation> <translation id="6845038076637626672">ເປີດທີ່ໄດ້ຂະຫຍາຍແລ້ວ</translation> <translation id="6845325883481699275">ຊ່ວຍປັບປຸງຄວາມປອດໄພຂອງ Chrome</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware ຂອງທ່ານພ້ອມໃຫ້ຕັ້ງຄ່າແລ້ວ.</translation> <translation id="744341768939279100">ສ້າງໂປຣໄຟລ໌ໃຫມ່</translation> <translation id="7443806024147773267">ເຂົ້າເຖິງລະຫັດຜ່ານຂອງທ່ານໄດ້ທຸກເມື່ອທີ່ທ່ານເຂົ້າສູ່ລະບົບບັນຊີ Google ຂອງທ່ານ</translation> -<translation id="7444046173054089907">ເວັບໄຊນີ້ຖືກບລັອກໄວ້</translation> <translation id="7444983668544353857">ປິດໃຊ້ງານ <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">ຕິດຕັ້ງແອັບໂດຍອັດຕະໂນມັດ</translation> <translation id="7450761244949417357">ກຳລັງເປີດໃນ <ph name="ALTERNATIVE_BROWSER_NAME" /> ຕອນນີ້</translation> @@ -5029,6 +5049,7 @@ <translation id="8214962590150211830">ເອົາຄົນນີ້ອອກໄປ</translation> <translation id="8215295261562449873">ສຳຮອງຂໍ້ມູນແອັບ ແລະ ໄຟລ໌ຂອງຂ້ອຍໄວ້ໃນໂຟນເດີດາວໂຫຼດກ່ອນທີ່ຈະອັບເກຣດ Linux.</translation> <translation id="8217399928341212914">ສືບຕໍ່ບລັອກການດາວໂຫຼດຫຼາຍໄຟລ໌ອັດຕະໂນມັດ</translation> +<translation id="8218847192766059983">ເພີ່ມພາສາ ຫຼື ຈັດລຳດັບລາຍການໃໝ່. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="8221491193165283816">ໂດຍປົກກະຕິແລ້ວທ່ານບລັອກການແຈ້ງເຕືອນ. ເພື່ອອະນຸຍາດໃຫ້ເວັບໄຊນີ້ແຈ້ງເຕືອນທ່ານ, ກະລຸນາຄລິກບ່ອນນີ້.</translation> <translation id="8225265270453771718">ແບ່ງປັນໜ້າຈໍແອັບພລິເຄຊັນ</translation> <translation id="8225753906568652947">ແລກຂໍ້ສະເໜີຂອງທ່ານ</translation> @@ -5642,6 +5663,7 @@ <translation id="9065203028668620118">ແກ້ໄຂ</translation> <translation id="9066773882585798925">ຟັງການອ່ານຂໍ້ຄວາມດັງໆ</translation> <translation id="9066782832737749352">ການປ່ຽນຂໍ້ຄວາມເປັນສຽງເວົ້າ</translation> +<translation id="9067559831321817373">ຈັດການບັນຊີທີ່ເຂົ້າສູ່ລະບົບຂອງທ່ານ. ເວັບໄຊ, ແອັບ ແລະ ສ່ວນຂະຫຍາຍໃນ Chrome ແລະ Google Play ອາດຈະໃຊ້ບັນຊີເຫຼົ່ານີ້ເພື່ອປັບແຕ່ງປະສົບການຂອງທ່ານ, ໂດຍຂຶ້ນກັບການອະນຸຍາດ. <a>ສຶກສາເພີ່ມເຕີມ</a></translation> <translation id="9068849894565669697">ເລືອກສີ</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 0b8f11b..c467143a 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1750,7 +1750,6 @@ <translation id="347670947055184738">Oi! Sistemai nepavyko pateikti įrenginio politikos.</translation> <translation id="347785443197175480">Toliau leisti <ph name="HOST" /> pasiekti fotoaparatą ir mikrofoną</translation> <translation id="3478685642445675458">Prieš pašalindami asmenį atrakinkite savo profilį.</translation> -<translation id="3479539252931486093">Ar tai buvo netikėta? <ph name="BEGIN_LINK" />Praneškime mums apie tai<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ne dabar</translation> <translation id="3481268647794498892">Atidaroma naršyklėje „<ph name="ALTERNATIVE_BROWSER_NAME" />“ po <ph name="COUNTDOWN_SECONDS" /> sek.</translation> <translation id="3484273680291419129">Šalinama žalinga programinė įranga...</translation> @@ -4469,7 +4468,6 @@ <translation id="7442465037756169001">„Hangout Meet hardware“ paruošta nustatyti.</translation> <translation id="744341768939279100">Kurti naują profilį</translation> <translation id="7443806024147773267">Pasiekite slaptažodžius, kai esate prisijungę prie „Google“ paskyros</translation> -<translation id="7444046173054089907">Ši svetainė užblokuota</translation> <translation id="7444983668544353857">Neleisti <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automatiškai įdiekite programas</translation> <translation id="7450761244949417357">Dabar atidaroma naršyklėje „<ph name="ALTERNATIVE_BROWSER_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index abcaaa1..b158dc9 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Šī lapa nereaģē</translation> <translation id="1041263367839475438">Pieejamās ierīces</translation> <translation id="1042174272890264476">Jūsu datorā ir iebūvēta arī pārlūka <ph name="SHORT_PRODUCT_NAME" /> RLZ bibliotēka. RLZ piešķir neunikālu, personu neidentificējošu atzīmi, lai novērtētu noteiktas reklāmas kampaņas ietvaros ievadītos meklēšanas vienumus un pārlūka <ph name="SHORT_PRODUCT_NAME" /> lietojumu. Šīs atzīmes pārlūkā <ph name="PRODUCT_NAME" /> dažkārt tiek rādītas Google meklēšanas vaicājumos.</translation> +<translation id="1043818413152647937">Vai notīrīt datus arī no šīm lietotnēm?</translation> <translation id="1045692658517323508">{0,plural, =1{Ierīces atjaunināšana jāsāk 1 minūtes laikā}zero{Ierīces atjaunināšana jāsāk # minūšu laikā}one{Ierīces atjaunināšana jāsāk # minūtes laikā}other{Ierīces atjaunināšana jāsāk # minūšu laikā}}</translation> <translation id="1046635659603195359">Šķiet, ka jau esat iestatījis funkciju Voice Match Google asistentā citā ierīcē. Esošos ierakstus var izmantot balss modeļa izveidei šajā ierīcē. Uzgaidiet vēl īsu brīdi.</translation> <translation id="1047431265488717055">Saites te&ksta kopēšana</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google viedās tehnoloģijas pārlūkā Chrome</translation> <translation id="1147991416141538220">Lai pieprasītu piekļuvi, sazinieties ar šīs ierīces administratoru.</translation> <translation id="1149401351239820326">Derīguma termiņa mēnesis</translation> +<translation id="1150490752229770117">Šis ir pēdējais automātiskais programmatūras un drošības atjauninājums šai ierīcei (<ph name="DEVICE_TYPE" />). Lai saņemtu turpmākus atjauninājumus, veiciet jaunināšanu uz jaunāku modeli. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Saulesbrilles</translation> <translation id="1151917987301063366">Vienmēr atļaut <ph name="HOST" /> piekļuvi sensoriem</translation> <translation id="1153356358378277386">Pārī savienotās ierīces</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Izvēlieties biļeti, ko izmantot autentificēšanai. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Iegūstiet šo paroli savā iPhone tālrunī</translation> <translation id="1712552549805331520">Vietnē <ph name="URL" /> tika pieprasīta atļauja pastāvīgi glabāt datus lokālajā datorā.</translation> +<translation id="1714644264617423774">Iespējojiet pieejamības funkcijas, lai jūsu ierīce kļūtu vienkāršāk lietojama. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Kustību sensori</translation> +<translation id="171824261579749339">Austrāliešu <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Pēdējā stunda</translation> <translation id="1719312230114180055">Piezīme. Jūsu pirksta nospiedums var būt mazāk drošs nekā sarežģīta parole vai PIN.</translation> <translation id="1720318856472900922">TLS WWW servera autentifikācija</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Notīrīt trešo pušu sīkfailus</translation> <translation id="2097372108957554726">Lai reģistrētu jaunas ierīces, jums ir jāpierakstās pārlūkā Chrome.</translation> <translation id="2099172618127234427">Jūs iespējojat operētājsistēmas Chrome OS atkļūdošanas funkcijas, kas iestatīs sshd dēmonu un iespējos palaišanu no USB diskiem.</translation> +<translation id="2099625543891475722">jūsu fiziskās īpašības, piemēram, garums;</translation> <translation id="2099686503067610784">Vai dzēst servera sertifikātu “<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="2100273922101894616">Automātiski pierakstīties</translation> <translation id="2101225219012730419">versija:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Izveidot jaunu profilu</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> vēlas verificēt jūsu identitāti</translation> <translation id="2448312741937722512">Tips</translation> +<translation id="2448734521821581858">Sīkfaili ir faili, ko izveido jūsu apmeklētās vietnes. Ir divu veidu sīkfaili. Pirmās puses sīkfailus izveido jūsu apmeklētā vietne. Šī vietne ir redzama adreses joslā. Trešo pušu sīkfailus izveido citas vietnes. Jūsu apmeklētajā tīmekļa vietnē var būt ietverts citu vietņu saturs, piemēram, reklāmas vai attēli.</translation> <translation id="2450223707519584812">Jūs nevarēsiet pievienot lietotājus, jo trūkst Google API atslēgu. Detalizētu informāciju skatiet vietnē <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Nav aktīvu skatījumu</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Noildze</translation> <translation id="2588636910004461974">Ierīces no: <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Meklējiet Google tīklā vai ierakstiet vietrādi URL</translation> +<translation id="2600522410036850735">Šajā ierīcē tiks saņemti automātiski programmatūras un drošības atjauninājumi līdz šim termiņam: <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Uzzināt vairāk</a></translation> <translation id="2603115962224169880">Tīriet datoru</translation> <translation id="2603463522847370204">Atvērt &inkognito režīma logā</translation> <translation id="2604255671529671813">Tīkla savienojuma kļūda</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Droša pārlūkošana (aizsargā jūs un ierīci pret bīstamām vietnēm)</translation> <translation id="3182749001423093222">Pareizrakstības pārbaude</translation> <translation id="3183139917765991655">Profilu importētājs</translation> +<translation id="3184536091884214176">Iestatīt vai pārvaldīt CUPS printerus <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mani faili</translation> <translation id="3188465121994729530">Pārvietotais vidējais</translation> <translation id="3190558889382726167">Parole ir saglabāta</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Diemžēl sistēmai neizdevās izgūt politiku jūsu ierīcei.</translation> <translation id="347785443197175480">Arī turpmāk ļaut vietnei <ph name="HOST" /> piekļūt kamerai un mikrofonam</translation> <translation id="3478685642445675458">Pirms kādas personas noņemšanas, lūdzu, atbloķējiet savu profilu.</translation> -<translation id="3479539252931486093">Vai tas bija negaidīti? <ph name="BEGIN_LINK" />Informējiet mūs<ph name="END_LINK" />!</translation> <translation id="3479552764303398839">Vēlāk</translation> <translation id="3481268647794498892">Atver pārlūkā <ph name="ALTERNATIVE_BROWSER_NAME" /> <ph name="COUNTDOWN_SECONDS" /> sekunžu laikā</translation> <translation id="3484273680291419129">Notiek kaitīgās programmatūras noņemšana…</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Rādīt lietotājvārdus un fotoattēlus pierakstīšanās ekrānā</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> — ir izveidots savienojums ar HID ierīci</translation> <translation id="4142052906269098341">Atbloķējiet <ph name="DEVICE_TYPE" /> ierīci ar tālruni <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Saglabājiet noteiktos printerus savā profilā vai pievienojiet jaunu printeri. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Iegūstiet labāku videoklipu kvalitāti un paildziniet akumulatora darbības laiku. Videoklipi tiks atskaņoti tikai Cast iespējotā ekrānā.</translation> <translation id="4146026355784316281">Vienmēr atvērt, izmantojot sistēmas skatītāju</translation> <translation id="4146785383423576110">Atiestatiet un tīriet</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Melone</translation> <translation id="4364567974334641491">Lietotne <ph name="APP_NAME" /> koplieto logu.</translation> <translation id="4364830672918311045">Parādīt paziņojumus</translation> +<translation id="436499142539576997">Neizdevās iegūt lietotnes datus. Joprojām tiek mēģināts palaist lietotni...</translation> <translation id="4370975561335139969">Ievadītā e-pasta adrese un parole neatbilst.</translation> <translation id="437184764829821926">Uzlaboti fonta iestatījumi</translation> <translation id="4374831787438678295">Linux instalēšanas programma</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Pārlūkprogrammas novirzīšanai tiek atbalstīti tikai http, https un failu protokoli.</translation> <translation id="4659077111144409915">Primārais konts</translation> <translation id="4660476621274971848">Paredzētā versija bija <ph name="EXPECTED_VERSION" />, bet faktiskā versija bija <ph name="NEW_ID" />.</translation> +<translation id="4660838440047236328">jūsu telpas izkārtojums.</translation> <translation id="4662788913887017617">Kopīgojiet šo grāmatzīmi ar savu iPhone tālruni</translation> <translation id="4663373278480897665">Kameras lietošana ir atļauta</translation> <translation id="4664482161435122549">PKCS #12 eksporta kļūda</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Jūsu sākumlapa tika mainīta uz: <ph name="URL" />.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />, tīkls no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, signāla stiprums: <ph name="SIGNAL_STRENGTH" />%, savienojums</translation> <translation id="49027928311173603">No servera lejupielādētā politika nav derīga: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Iestatiet vai pārvaldiet tīkla failu kopīgošanas ierīces. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Šis fails parasti netiek lejupielādēts un var būt bīstams.</translation> <translation id="4907306957610201395">Atļaujas kategorija</translation> <translation id="4908811072292128752">Atveriet jaunu cilni, lai pārlūkotu divas vietnes vienlaikus.</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Notiek iespējošana...</translation> <translation id="5039804452771397117">Atļaut</translation> <translation id="5042282098504489593">Atvērt iestatījumus, lai savienotu <ph name="USB_DEVICE_NAME" /> ar Linux</translation> +<translation id="5043913660911154449">Varat arī norādīt printera PPD. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Nepareiza parole</translation> <translation id="504561833207953641">Tiek atvērts esošā pārlūka sesijā.</translation> <translation id="5047421709274785093">Neļaut vietnēm izmantot kustību un gaismas sensorus</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Bērns šo iestatījumu nevar mainīt.</translation> <translation id="5466374726908360271">Ielīmēt un meklēt “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Notiek failu kopīgošanas ierīču meklēšana</translation> +<translation id="5470735824776589490">Lai ierīces atiestatīšanai izmantotu funkciju Powerwash, ierīci ir nepieciešams restartēt. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Sveiki! Šī ir balss jūsu teksta pārvēršanai runā.</translation> <translation id="5472133193607270166">Kad ir ieslēgta šī opcija, vietnes nevar izmantot jūsu pārlūkošanas darbības dažādās vietnēs, lai personalizētu reklāmas. Dažas vietnes var nedarboties pareizi.</translation> <translation id="5473333559083690127">Atkārtoti ievadiet jauno PIN.</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Sakārtot</translation> <translation id="5499313591153584299">Šis fails var kaitēt jūsu datoram.</translation> <translation id="5502500733115278303">Importēts no Firefox</translation> +<translation id="5505264765875738116">Vietnēs nevar lūgt atļauju sūtīt paziņojumus</translation> <translation id="5505307013568720083">Beigusies tinte</translation> <translation id="5507756662695126555">Neatteikšanās</translation> <translation id="5509693895992845810">S&aglabāt kā...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Preferences</translation> <translation id="5804175651771201311">Viesabonēšana izslēgta</translation> <translation id="5804241973901381774">Atļaujas</translation> +<translation id="5804427196348435412">izmantot NFC ierīces</translation> <translation id="5805697420284793859">Logu pārvaldnieks</translation> <translation id="5806773519584576205">0° (noklusējums)</translation> <translation id="5811750797187914944">Gatavs</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Atvērt maksimizētā logā</translation> <translation id="6096326118418049043">X.500 nosaukums</translation> <translation id="6097480669505687979">Ja netiks atbrīvota vieta, lietotāji un dati var tikt automātiski noņemti.</translation> +<translation id="6097600385983390082">Meklēšana ar balsi ir aizvērta</translation> <translation id="6098793583803863900">Nezināms fails tiek skenēts, lai pārliecinātos, ka tajā nav bīstama satura.</translation> <translation id="6100736666660498114">Starta izvēlne</translation> <translation id="6101226222197207147">Ir pievienota jauna lietotne (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Kā noklusējumu iestatiet balss izmantošanu tastatūras vietā</translation> <translation id="6234474535228214774">Gaida instalēšanu</translation> <translation id="6237816943013845465">Ļauj pielāgot ekrāna izšķirtspēju.</translation> +<translation id="6238624845858322552">Savienojuma izveide ar Bluetooth ierīci</translation> <translation id="6238767809035845642">No citas ierīces kopīgotais teksts</translation> <translation id="6238923052227198598">Paturēt pēdējo piezīmi bloķēšanas ekrānā</translation> <translation id="6239558157302047471">Atkārtoti ielādēt &ietvaru</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />. tīkls no <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, signāla stiprums: <ph name="SIGNAL_STRENGTH" />%, tālruņa akumulatora statuss: <ph name="BATTERY_STATUS" />%, savienojums</translation> <translation id="6268252012308737255">Atvērt lietotnē <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Vietnēs var lūgt atļauju sūtīt paziņojumus</translation> <translation id="6270770586500173387">Sūtīt <ph name="BEGIN_LINK1" />sistēmas un lietotņu informāciju<ph name="END_LINK1" /> un <ph name="BEGIN_LINK2" />metriku<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Lejupielādējot spraudni, radās kļūda (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Kvalitāte</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Konts</translation> <translation id="6298962879096096191">Izmantojiet Google Play, lai instalētu Android lietotnes</translation> <translation id="630065524203833229">I&ziet</translation> +<translation id="6300718114348072351">Printeri (<ph name="PRINTER_NAME" />) neizdevās konfigurēt automātiski. Lūdzu, norādiet detalizētu informāciju par printeri. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globālā politika:</translation> <translation id="6307990684951724544">Sistēma ir aizņemta.</translation> <translation id="6308493641021088955">Pierakstīšanos nodrošina <ph name="EXTENSION_NAME" /></translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Tīrīšana pašlaik nav pieejama</translation> <translation id="6556866813142980365">Atcelt atsaukšanu</translation> <translation id="6557290421156335491">Manas saīsnes</translation> +<translation id="6561560012278703671">Izmantot neuzkrītošāku ziņojumapmaiņu (bloķēt paziņojumu uzvednes, lai tās jūs netraucētu)</translation> <translation id="6561726789132298588">Ievadīt</translation> <translation id="656293578423618167">Faila ceļš vai nosaukums ir pārāk garš. Saglabājiet ar īsāku nosaukumu vai citā atrašanās vietā.</translation> <translation id="6563469144985748109">Jūsu vadītājs vēl nav to apstiprinājis</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Jautāt pirms sūtīšanas</translation> <translation id="6840184929775541289">Nav sertifikāta izdevējiestāde</translation> <translation id="6841186874966388268">Kļūdas</translation> +<translation id="6843267103192918276">Pierakstieties, lai grāmatzīmes, vēsture, paroles un citi iestatījumi būtu pieejami visās jūsu ierīcēs. Turklāt jūs tiksiet automātiski pierakstīts izmantotajos Google pakalpojumos. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Komanda “Ok Google” tika iestatīta</translation> <translation id="6845038076637626672">Atvērt maksimizētā logā</translation> <translation id="6845325883481699275">Palīdzēt uzlabot Chrome drošību</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Jūsu Hangouts Meet hardware ir gatavs iestatīšanai.</translation> <translation id="744341768939279100">Izveidot jaunu profilu</translation> <translation id="7443806024147773267">Piekļūstiet savām parolēm, kad vien esat pierakstījies Google kontā</translation> -<translation id="7444046173054089907">Šī vietne ir bloķēta</translation> <translation id="7444983668544353857">Atspējot <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automātiski instalējiet lietotnes</translation> <translation id="7450761244949417357">Notiek atvēršana <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5032,6 +5052,7 @@ <translation id="8214962590150211830">Noņemt šo lietotāju</translation> <translation id="8215295261562449873">Pirms Linux jaunināšanas dublēt manas lietotnes un failus mapē Lejupielādes.</translation> <translation id="8217399928341212914">Turpināt bloķēt vairāku failu automātisku lejupielādēšanu</translation> +<translation id="8218847192766059983">Pievienojiet valodas vai pārkārtojiet sarakstu. <ph name="BEGIN_LINK" />Uzzināt vairāk<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Parasti jūs bloķējat paziņojumus. Lai ļautu šai vietnei sūtīt jums paziņojumus, noklikšķiniet šeit.</translation> <translation id="8225265270453771718">Lietojumprogrammas loga kopīgošana</translation> <translation id="8225753906568652947">Izmantot piedāvājumus</translation> @@ -5645,6 +5666,7 @@ <translation id="9065203028668620118">Labot</translation> <translation id="9066773882585798925">Noklausīties tekstu</translation> <translation id="9066782832737749352">Teksta pārvēršana runā</translation> +<translation id="9067559831321817373">Pārvaldiet savus kontus, kuros esat pierakstījies. Atkarībā no atļaujām Chrome un Google Play tīmekļa vietnes, lietotnes un paplašinājumi var izmantot šos kontus, lai pielāgotu jūsu pieredzi. <a>Uzzināt vairāk</a></translation> <translation id="9068849894565669697">Krāsas izvēle</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 1cdcdea4..1c750c8 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Упс! Системот не успеа да ја вчита политиката за вашиот уред.</translation> <translation id="347785443197175480">Продолжи дозволувајќи <ph name="HOST" /> да пристапи до вашата камера и микрофон</translation> <translation id="3478685642445675458">Отклучете го профилот пред да отстраните некого.</translation> -<translation id="3479539252931486093">Дали беше ова неочекувано? <ph name="BEGIN_LINK" />Кажете ни<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не сега</translation> <translation id="3481268647794498892">Ќе се отвори во <ph name="ALTERNATIVE_BROWSER_NAME" /> за <ph name="COUNTDOWN_SECONDS" /> секунди</translation> <translation id="3484273680291419129">Се отстранува штетниот софтвер…</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Вашиот Hangouts Meet hardware е подготвен за поставување.</translation> <translation id="744341768939279100">Создај нов профил</translation> <translation id="7443806024147773267">Пристапувајте до своите лозинки секогаш кога сте најавени на сметката на Google</translation> -<translation id="7444046173054089907">Сајтов е блокиран</translation> <translation id="7444983668544353857">Оневозможи <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Инсталирајте ги апликациите автоматски</translation> <translation id="7450761244949417357">Се отвора во <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index bfd314b4..4cff650 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">ഈ പേജ് പ്രതികരിക്കുന്നില്ല</translation> <translation id="1041263367839475438">ലഭ്യമായ ഉപകരണങ്ങൾ</translation> <translation id="1042174272890264476">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ <ph name="SHORT_PRODUCT_NAME" /> എന്നതിന്റെ RLZ ലൈബ്രറി അന്തർനിർമ്മിതവുമാണ്. RLZ, ഒരു നിർദ്ദിഷ്ട പ്രമോഷണൽ കാമ്പെയ്നിലൂടെ ലഭിക്കുന്ന തിരയലുകളും <ph name="SHORT_PRODUCT_NAME" /> ഉപയോഗവും കണക്കാക്കുന്നതിന് അദ്വിതീയമല്ലാത്തതും വ്യക്തിപരമായി തിരിച്ചറിയാനാകാത്തതുമായ ഒരു ടാഗ് നിയുക്തമാക്കുന്നു. ഈ ലേബലുകൾ ചിലസമയത്ത് <ph name="PRODUCT_NAME" /> എന്നതിലെ Google തിരയലിൽ ദൃശ്യമാകുന്നു.</translation> +<translation id="1043818413152647937">ഈ ആപ്പുകളിൽ നിന്നുള്ള ഡാറ്റയും മായ്ക്കണോ?</translation> <translation id="1045692658517323508">{0,plural, =1{ഒരു മിനിറ്റിനുള്ളിൽ അപ്ഡേറ്റ് ചെയ്യുക}other{# മിനിറ്റിനുള്ളിൽ അപ്ഡേറ്റ് ചെയ്യുക}}</translation> <translation id="1046635659603195359">മറ്റൊരു ഉപകരണത്തിൽ മുമ്പേ നിങ്ങൾ Google അസിസ്റ്റന്റിനൊപ്പം Voice Match സജ്ജമാക്കിയിട്ടുള്ളതായി തോന്നുന്നു. ഈ ഉപകരണത്തിൽ ഒരു ശബ്ദ മോഡൽ സൃഷ്ടിക്കുന്നതിന് പഴയ റെക്കോർഡിംഗുകൾ ഉപയോഗപ്പെടുത്താം. ഇതിന് ഒരു മിനിറ്റിൽ കുറവ് സമയമേ എടുക്കൂ.</translation> <translation id="1047431265488717055">ലിങ്ക് ടെ&ക്സ്റ്റ് പകർത്തുക</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome-ൽ Google സ്മാർട്സ് നേടുക</translation> <translation id="1147991416141538220">ആക്സസ് ആവശ്യപ്പെടാൻ, ഈ ഉപകരണത്തിന്റെ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="1149401351239820326">കാലാവധി കഴിയുന്ന മാസം</translation> +<translation id="1150490752229770117">ഈ <ph name="DEVICE_TYPE" /> എന്നതിന് സ്വയമേവയുള്ള അവസാനത്തെ സോഫ്റ്റ്വെയർ, സുരക്ഷാ അപ്ഡേറ്റ് ആണിത്. ഭാവി അപ്ഡേറ്റുകൾ ലഭിക്കാൻ പുതിയ മോഡലിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യൂ. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1150565364351027703">സൺഗ്ലാസുകൾ</translation> <translation id="1151917987301063366">സെൻസറുകൾ ആക്സസ് ചെയ്യാൻ എപ്പോഴും <ph name="HOST" />-നെ അനുവദിക്കുക</translation> <translation id="1153356358378277386">ജോടിയാക്കിയ ഉപകരണങ്ങൾ</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">പരിശോധിച്ചുറപ്പിക്കലിനായി ഒരു ടിക്കറ്റ് തിരഞ്ഞെടുക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1712349894969001173">നിങ്ങളുടെ iPhone-ൽ ഈ പാസ്വേഡ് ലഭ്യമാക്കുക</translation> <translation id="1712552549805331520">നിങ്ങളുടെ ലോക്കൽ കമ്പ്യൂട്ടറില് ശാശ്വതമായി ഡാറ്റ സംഭരിക്കാന് <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation> +<translation id="1714644264617423774">നിങ്ങളുടെ ഉപകരണം ഉപയോഗിക്കുന്നത് എളുപ്പമാക്കുന്നതിന് ഉപയോഗസഹായി സവിശേഷതകൾ പ്രവർത്തനക്ഷമമാക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1717218214683051432">ചലന സെൻസറുകൾ</translation> +<translation id="171824261579749339">ഓസ്ട്രേലിയൻ <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്</translation> <translation id="1719312230114180055">ശ്രദ്ധിക്കുക: ഒരു ശക്തമായ പാസ്വേഡിനേക്കാളോ പിൻ നമ്പറിനേക്കാളോ കുറവായിരിക്കാം നിങ്ങളുടെ വിരലടയാളം ഉപയോഗിച്ചുള്ള സുരക്ഷ.</translation> <translation id="1720318856472900922">TLS WWW സെര്വര് പരിശോധിച്ചുറപ്പിക്കൽ</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">മൂന്നാം കക്ഷി കുക്കികൾ മായ്ക്കുക</translation> <translation id="2097372108957554726">പുതിയ ഉപകരണങ്ങൾ രജിസ്റ്റർ ചെയ്യാൻ നിങ്ങൾ Chrome-ൽ സൈൻ ഇൻ ചെയ്യണം</translation> <translation id="2099172618127234427">sshd daemon സജ്ജീകരിക്കുന്നതും USB ഡ്രൈവുകളിൽ നിന്ന് ബൂട്ട് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുന്നതുമായ Chrome OS ഡീബഗ് ചെയ്യൽ ഫീച്ചറുകൾ നിങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> +<translation id="2099625543891475722">ഉയരം പോലുള്ള, നിങ്ങളുടെ ശാരീരിക സവിശേഷതകൾ</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" എന്ന സെർവർ സർട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കണോ?</translation> <translation id="2100273922101894616">സ്വയമേവയുള്ള സൈൻ ഇൻ</translation> <translation id="2101225219012730419">പതിപ്പ്:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> <translation id="2446585455334014596"><ph name="APP_NAME" />-ന് നിങ്ങളുടെ ഐഡന്റിറ്റി പരിശോധിച്ച് ഉറപ്പിക്കേണ്ടതുണ്ട്</translation> <translation id="2448312741937722512">തരം</translation> +<translation id="2448734521821581858">നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്സൈറ്റുകൾ സൃഷ്ടിക്കുന്ന ഫയലുകളാണ് കുക്കികൾ. രണ്ട് തരത്തിലുള്ള കുക്കികളുണ്ട്: ആദ്യ കക്ഷി കുക്കികളെ സൃഷ്ടിക്കുന്നത് നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റാണ്. വിലാസ ബാറിൽ സൈറ്റ് കാണാം. മൂന്നാം കക്ഷി.കുക്കികളെ സൃഷ്ടിക്കുന്നത് മറ്റ് സൈറ്റുകളാണ്. നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്സൈറ്റിൽ കാണുന്ന പരസ്യങ്ങളോ ചിത്രങ്ങളോ പോലുള്ള ചില ഉള്ളടക്കം ഈ സൈറ്റുകളുടെ ഉടമസ്ഥതയിലാണ്.</translation> <translation id="2450223707519584812">Google API കീകൾ നഷ്ടമായതിനാൽ നിങ്ങൾക്ക് ഉപയോക്താക്കളെ ചേർക്കാനാവില്ല. വിശദാംശങ്ങൾക്ക്, <ph name="DETAILS_URL" /> കാണുക.</translation> <translation id="2450849356604136918">വിവരങ്ങളുടെ പ്രദർശമൊന്നും ഇപ്പോൾ സജീവമല്ല</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">ടൈംഔട്ട് ആയി</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" />-ൽ നിന്നുള്ള ഉപകരണങ്ങൾ</translation> <translation id="2594999711683503743">Google-ൽ തിരയുക അല്ലെങ്കിൽ URL ടൈപ്പ് ചെയ്യുക</translation> +<translation id="2600522410036850735"><ph name="MONTH_AND_YEAR" /> വരെ ഈ ഉപകരണത്തിന് സ്വയമേവയുള്ള സോഫ്റ്റ്വെയർ, സുരക്ഷാ അപ്ഡേറ്റുകൾ ലഭിക്കും. <a target="_blank" href="<ph name="URL" />">കൂടുതലറിയുക</a></translation> <translation id="2603115962224169880">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ക്ലീൻ ചെയ്യുക</translation> <translation id="2603463522847370204">&അദൃശ്യ വിന്ഡോയില് തുറക്കുക</translation> <translation id="2604255671529671813">നെറ്റ്വർക്ക് കണക്ഷൻ പിശക്</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">സുരക്ഷിത ബ്രൗസിംഗ് (അപകടകരമായ സൈറ്റുകളിൽ നിന്ന് നിങ്ങളെയും ഉപകരണത്തെയും പരിരക്ഷിക്കുന്നു)</translation> <translation id="3182749001423093222">അക്ഷരത്തെറ്റ് പരിശോധന</translation> <translation id="3183139917765991655">പ്രൊഫൈൽ ഇംപോർട്ടർ</translation> +<translation id="3184536091884214176">CUPS പ്രിന്ററുകൾ സജ്ജമാക്കുക അല്ലെങ്കിൽ മാനേജ് ചെയ്യുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="3188257591659621405">എൻ്റെ ഫയലുകൾ</translation> <translation id="3188465121994729530">ശരാശരി നീക്കുന്നു</translation> <translation id="3190558889382726167">പാസ്വേഡ് സംരക്ഷിച്ചു</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">ക്ഷമിക്കണം! സിസ്റ്റത്തിന് നിങ്ങളുടെ ഉപകരണത്തിനുള്ള നയം ലഭ്യമാക്കാനായില്ല.</translation> <translation id="347785443197175480">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ് ചെയ്യുന്നതിന് <ph name="HOST" /> എന്നതിനെ അനുവദിക്കുന്നത് തുടരുക</translation> <translation id="3478685642445675458">ഒരാളെ നീക്കംചെയ്യുന്നതിന് മുമ്പ് നിങ്ങളുടെ പ്രൊഫൈൽ അൺലോക്ക് ചെയ്യുക.</translation> -<translation id="3479539252931486093">ഇത് അപ്രതീക്ഷിതമായിരുന്നോ? <ph name="BEGIN_LINK" />ഞങ്ങളെ അറിയിക്കുക<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ഇപ്പോഴല്ല</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> സെക്കൻഡിനുള്ളിൽ <ph name="ALTERNATIVE_BROWSER_NAME" />-ൽ തുറക്കുന്നു</translation> <translation id="3484273680291419129">ദോഷകരമായ സോഫ്റ്റ്വയർ നീക്കംചെയ്യുന്നു...</translation> @@ -2253,6 +2260,7 @@ <translation id="4138267921960073861">പ്രവേശന സ്ക്രീനില് ഫോട്ടോകളും ഉപയോക്തൃനാമങ്ങളും കാണിക്കുക</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID ഉപകരണം കണക്റ്റ് ചെയ്തു</translation> <translation id="4142052906269098341">നിങ്ങളുടെ ഫോൺ ഉപയോഗിച്ച് <ph name="DEVICE_TYPE" /> അൺലോക്ക് ചെയ്യുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">കണ്ടെത്തിയ പ്രിന്ററുകൾ നിങ്ങളുടെ പ്രൊഫൈലിൽ സംരക്ഷിക്കുക അല്ലെങ്കിൽ പുതിയ പ്രിന്റർ ചേർക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="4144218403971135344">മികച്ച ഗുണമേന്മയുള്ള വീഡിയോ നേടുകയും ബാറ്ററി ലൈഫ് കൂട്ടുകയും ചെയ്യുക. നിങ്ങളുടെ Cast ചെയ്യാൻ പ്രാപ്തിയുള്ള സ്ക്രീനിൽ മാത്രം വീഡിയോ പ്ലേ ചെയ്യും.</translation> <translation id="4146026355784316281">എപ്പോഴും സിസ്റ്റം വ്യൂവറിൽ തുറക്കുക</translation> <translation id="4146785383423576110">റീസെറ്റ് ചെയ്ത ശേഷം മായ്ക്കുക</translation> @@ -2377,6 +2385,7 @@ <translation id="4364327530094270451">മത്തങ്ങ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation> <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation> +<translation id="436499142539576997">ആപ്പ് ഡാറ്റ നേടാനായില്ല, ആപ്പ് റൺ ചെയ്യാൻ ഇപ്പോഴും ശ്രമിക്കുന്നു...</translation> <translation id="4370975561335139969">നിങ്ങൾ നൽകിയ ഇമെയിലും പാസ്വേഡും പൊരുത്തപ്പെടുന്നില്ല</translation> <translation id="437184764829821926">വിപുലീകരിച്ച ഫോണ്ട് ക്രമീകരണങ്ങൾ</translation> <translation id="4374831787438678295">Linux ഇൻസ്റ്റാളർ</translation> @@ -2567,6 +2576,7 @@ <translation id="465878909996028221">http, https എന്നിവയും ഫയൽ പ്രോട്ടോകോളുകളും മാത്രമേ ബ്രൗസർ റീഡയറക്റ്റുകളിൽ പിന്തുണയ്ക്കൂ.</translation> <translation id="4659077111144409915">പ്രാഥമിക അക്കൗണ്ട്</translation> <translation id="4660476621274971848">പ്രതീക്ഷിച്ച പതിപ്പ് "<ph name="EXPECTED_VERSION" />" ആണ്, എന്നാൽ ലഭിച്ച പതിപ്പ് "<ph name="NEW_ID" />" ആയിരുന്നു</translation> +<translation id="4660838440047236328">നിങ്ങളുടെ റൂമിന്റെ ലേഔട്ട്</translation> <translation id="4662788913887017617">നിങ്ങളുടെ iPhone ഉപയോഗിച്ച് ഈ ബുക്ക്മാർക്ക് പങ്കിടുക</translation> <translation id="4663373278480897665">ക്യാമറ അനുവദനീയം</translation> <translation id="4664482161435122549">PKCS #12 കയറ്റുമതി പിശക്</translation> @@ -2730,6 +2740,7 @@ <translation id="4900392736118574277">നിങ്ങളുടെ ആരംഭ പേജിനെ <ph name="URL" /> എന്നതിലേക്ക് മാറ്റിയിരിക്കുന്നു.</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, കണക്റ്റ് ചെയ്യുക</translation> <translation id="49027928311173603">സെർവറിൽ നിന്നും ഡൗൺലോഡ് ചെയ്ത നയം അസാധുവാണ്: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">നെറ്റ്വർക്ക് ഫയൽ പങ്കിടലുകൾ സജ്ജീകരിക്കുക അല്ലെങ്കിൽ മാനേജ് ചെയ്യുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="4907161631261076876">അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ ഈ ഫയൽ സാധാരണ ഡൗൺലോഡ് ചെയ്യാറില്ല.</translation> <translation id="4907306957610201395">അനുമതി വിഭാഗം</translation> <translation id="4908811072292128752">ഒരേസമയം രണ്ട് സൈറ്റുകൾ ബ്രൗസ് ചെയ്യാൻ ഒരു പുതിയ ടാബ് തുറക്കുക</translation> @@ -2817,6 +2828,7 @@ <translation id="5038863510258510803">പ്രാപ്തമാക്കുന്നു...</translation> <translation id="5039804452771397117">അനുവദിക്കൂ</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> Linux-ലേക്ക് കണക്റ്റ് ചെയ്യാൻ ക്രമീകരണം തുറക്കുക</translation> +<translation id="5043913660911154449">അല്ലെങ്കിൽ നിങ്ങളുടെ പ്രിന്റർ PPD വ്യക്തമാക്കുക <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="5045550434625856497">പാസ്വേഡ് തെറ്റാണ്</translation> <translation id="504561833207953641">നിലവിലുള്ള ബ്രൗസര് സെഷനില് തുറക്കുന്നു.</translation> <translation id="5047421709274785093">ചലന സെൻസറുകളും വെളിച്ച സെൻസറുകളും ഉപയോഗിക്കുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation> @@ -3102,6 +3114,7 @@ <translation id="5464660706533281090">ഈ ക്രമീകരണം ഒരു കുട്ടി ഉപയോക്താവിന് മാറ്റാനാവില്ല.</translation> <translation id="5466374726908360271">ഒട്ടിച്ച്, “<ph name="SEARCH_TERMS" />” എന്നതിനായി തിരയുക</translation> <translation id="5468173180030470402">ഫയൽ പങ്കിടലുകൾ തിരയുന്നു</translation> +<translation id="5470735824776589490">പവർവാഷ് ഉപയോഗിച്ച് നിങ്ങളുടെ ഉപകരണം പുനസജ്ജമാക്കുന്നതിനുമുമ്പ് പുനരാരംഭിക്കേണ്ടതുണ്ട്. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="5471768120198416576">അവിടെയുണ്ടോ! ഞാനാണ് നിങ്ങളുടെ ടെക്സ്റ്റ് ടു സ്പീച്ച് വോയ്സ്.</translation> <translation id="5472133193607270166">ഓണായിരിക്കുമ്പോൾ, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ വ്യത്യസ്ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി ഉപയോഗിക്കാൻ സൈറ്റുകൾക്കാവില്ല. ചില സൈറ്റുകൾ ശരിയായി പ്രവർത്തിച്ചേക്കില്ല.</translation> <translation id="5473333559083690127">പുതിയ പിൻ വീണ്ടും നൽകുക</translation> @@ -3125,6 +3138,7 @@ <translation id="5496587651328244253">ഓര്ഗനൈസുചെയ്യുക</translation> <translation id="5499313591153584299">ഈ ഫയൽ നിങ്ങളുടെ കമ്പ്യൂട്ടറിന് ഹാനികരമായേക്കാം.</translation> <translation id="5502500733115278303">Firefoxല് നിന്ന് ഇറക്കുമതി ചെയ്തവ</translation> +<translation id="5505264765875738116">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കാനാവില്ല</translation> <translation id="5505307013568720083">മഷിയില്ല</translation> <translation id="5507756662695126555">നിരസിക്കാത്തത്</translation> <translation id="5509693895992845810">ഇതായി &സംരക്ഷിക്കുക...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">മുൻഗണനകൾ</translation> <translation id="5804175651771201311">റോമിംഗ് ഓഫാണ്</translation> <translation id="5804241973901381774">അനുമതികൾ</translation> +<translation id="5804427196348435412">NFC ഉപകരണങ്ങൾ ഉപയോഗിക്കുക</translation> <translation id="5805697420284793859">വിൻഡോ മാനേജർ</translation> <translation id="5806773519584576205">0° (ഡിഫോൾട്ട്)</translation> <translation id="5811750797187914944">എല്ലാം സജ്ജീകരിച്ചു</translation> @@ -3555,6 +3570,7 @@ <translation id="6096047740730590436">വലുതാക്കി തുറക്കുക</translation> <translation id="6096326118418049043">X.500 നാമം</translation> <translation id="6097480669505687979">നിങ്ങൾ ഇടം സൃഷ്ടിച്ചില്ലെങ്കിൽ, ഉപയോക്താക്കളും വിവരങ്ങളും സ്വയം നീക്കംചെയ്യപ്പെടാം.</translation> +<translation id="6097600385983390082">സംസാരത്തിലൂടെ തിരയൽ അടച്ചു</translation> <translation id="6098793583803863900">അപകടകരമായ ഉള്ളടക്കം തിരിച്ചറിയുന്നതിനായി അജ്ഞാത ഫയൽ സ്കാൻ ചെയ്യുന്നു.</translation> <translation id="6100736666660498114">ആരംഭമെനു</translation> <translation id="6101226222197207147">പുതിയ ആപ്പ് ചേർത്തു (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">കീബോഡിന് പകരം ശബ്ദം ഉപയോഗിക്കുന്നത് ഡിഫോൾട്ടാക്കുക</translation> <translation id="6234474535228214774">ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയാക്കിയിട്ടില്ല</translation> <translation id="6237816943013845465">സ്ക്രീൻ റെസല്യൂഷൻ ക്രമീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു</translation> +<translation id="6238624845858322552">Bluetooth ഉപകരണത്തിൽ കണക്റ്റ് ചെയ്യുക</translation> <translation id="6238767809035845642">മറ്റൊരു ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ട ടെക്സ്റ്റ്</translation> <translation id="6238923052227198598">ലോക്ക് സ്ക്രീനിൽ ഏറ്റവും പുതിയ കുറിപ്പ് സൂക്ഷിക്കുക</translation> <translation id="6239558157302047471">റീലോഡും ഫ്രെയിമും</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്വർക്ക്, <ph name="PHONE_NAME" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, ഫോൺ ബാറ്ററി <ph name="BATTERY_STATUS" />%, കണക്റ്റ് ചെയ്യുക</translation> <translation id="6268252012308737255"><ph name="APP" /> ഉപയോഗിച്ച് തുറക്കുക</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കേണ്ടി വരും</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />സിസ്റ്റവും ആപ്പ് വിവരവും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്സും<ph name="END_LINK2" /> അയയ്ക്കുക</translation> <translation id="6272643420381259437">പ്ലഗിൻ ഡൗൺലോഡ് ചെയ്യുമ്പോൾ പിശക് (<ph name="ERROR" />) ഉണ്ടായി</translation> <translation id="6273677812470008672">നിലവാരം</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">അക്കൗണ്ട്</translation> <translation id="6298962879096096191">Android ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ Google Play ഉപയോഗിക്കുക</translation> <translation id="630065524203833229">&പുറത്തുപോകുക</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> സ്വയമേവ കോൺഫിഗർ ചെയ്യാനായില്ല. വിപുലമായ പ്രിൻ്റർ വിശദാംശങ്ങൾ വ്യക്തമാക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6305607932814307878">ആഗോള നയം:</translation> <translation id="6307990684951724544">സിസ്റ്റം തിരക്കിലാണ്</translation> <translation id="6308493641021088955">സൈൻ ഇൻ ലഭ്യമാക്കിയത് <ph name="EXTENSION_NAME" /></translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">ക്ലീനർ ഇപ്പോൾ ലഭ്യമല്ല</translation> <translation id="6556866813142980365">വീണ്ടും ചെയ്യുക</translation> <translation id="6557290421156335491">എൻ്റെ കുറുക്കുവഴികൾ</translation> +<translation id="6561560012278703671">നിശബ്ദമായ സന്ദേശമയയ്ക്കൽ ഉപയോഗിക്കുക (നിങ്ങളെ തടസ്സപ്പെടുത്തുന്നതിൽ നിന്ന് അറിയിപ്പ് നിർദ്ദേശങ്ങളെ ബ്ലോക്ക് ചെയ്യുന്നു)</translation> <translation id="6561726789132298588">എന്റർ</translation> <translation id="656293578423618167">ഫയലിന്റെ പാതയോ പേരോ ദൈർഘ്യമേറിയതാണ്. ഹ്രസ്വമായ പേര് ഉപയോഗിച്ചോ മറ്റൊരു ലൊക്കേഷനിലേക്കോ സംരക്ഷിക്കുക.</translation> <translation id="6563469144985748109">നിങ്ങളുടെ മാനേജർ ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">അയയ്ക്കുന്നതിന് മുമ്പ് ചോദിക്കുക</translation> <translation id="6840184929775541289">ഒരു സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി അല്ല</translation> <translation id="6841186874966388268">പിശകുകൾ</translation> +<translation id="6843267103192918276">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകളും ചരിത്രവും പാസ്വേഡുകളും മറ്റ് ക്രമീകരണവും ലഭിക്കാൻ സൈൻ ഇൻ ചെയ്യുക. നിങ്ങളുടെ Google സേവനങ്ങളിലേക്ക് സ്വയമേവ നിങ്ങൾ സൈൻ ഇൻ ആകുന്നതുമാണ്. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google സജ്ജമാണ്</translation> <translation id="6845038076637626672">ചെറുതാക്കി തുറക്കുക</translation> <translation id="6845325883481699275">Chrome സുരക്ഷ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">നിങ്ങളുടെ Hangouts Meet hardware സജ്ജമാക്കാൻ തയ്യാറാണ്.</translation> <translation id="744341768939279100">ഒരു പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> <translation id="7443806024147773267">Google അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്തിരിക്കുമ്പോഴെല്ലാം നിങ്ങളുടെ പാസ്വേഡുകൾ ആക്സസ് ചെയ്യുക</translation> -<translation id="7444046173054089907">ഈ സൈറ്റ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> അപ്രാപ്തമാക്കുക</translation> <translation id="7448430327655618736">സ്വയമേവ ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="7450761244949417357">ഇപ്പോൾ <ph name="ALTERNATIVE_BROWSER_NAME" />-ൽ തുറക്കുന്നു</translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">ഈ വ്യക്തിയെ നീക്കംചെയ്യുക</translation> <translation id="8215295261562449873">Linux അപ്ഗ്രേഡ് ചെയ്യുന്നതിന് മുമ്പ്, എന്റെ ആപ്പുകളും ഫയലുകളും 'ഡൗൺലോഡുകൾ' ഫോൾഡറിലേക്ക് ബാക്കപ്പ് ചെയ്യുക.</translation> <translation id="8217399928341212914">ഒന്നിലേറെ ഫയലുകളുടെ യാന്ത്രിക ഡൗൺലോഡുകൾ തടയുന്നത് തുടരുക</translation> +<translation id="8218847192766059983">ഭാഷകൾ ചേർക്കുകയോ ലിസ്റ്റ് പുനഃക്രമീകരിക്കുകയോ ചെയ്യുക. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="8221491193165283816">നിങ്ങൾ സാധാരണയായി അറിയിപ്പുകൾ ബ്ലോക്ക് ചെയ്യാറുണ്ട്. നിങ്ങൾക്ക് അറിയിപ്പ് അയയ്ക്കുന്നതിന് ഈ സൈറ്റിനെ അനുവദിക്കാൻ, ഇവിടെ ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="8225265270453771718">ഒരു ആപ്പ് വിൻഡോ പങ്കിടുക</translation> <translation id="8225753906568652947">നിങ്ങളുടെ ഓഫറുകൾ റിഡീം ചെയ്യുക</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">എഡിറ്റ് ചെയ്യുക</translation> <translation id="9066773882585798925">ടെക്സ്റ്റ് ഉച്ചത്തിൽ വായിച്ച് കേൾപ്പിക്കുക</translation> <translation id="9066782832737749352">ടെക്സ്റ്റ് ടു സ്പീച്ച്</translation> +<translation id="9067559831321817373">നിങ്ങളുടെ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന അക്കൗണ്ടുകൾ മാനേജ് ചെയ്യുക. നിങ്ങളുടെ അനുഭവം ഇഷ്ടാനുസൃതമാക്കാൻ Chrome, Google Play എന്നിവയിലെ വെബ്സൈറ്റുകളും ആപ്പുകളും വിപുലീകരണങ്ങളും അനുമതികൾക്കനുസരിച്ച് ഈ അക്കൗണ്ടുകൾ ഉപയോഗിച്ചേക്കാം. <a>കൂടുതലറിയുക</a></translation> <translation id="9068849894565669697">വർണ്ണം തിരഞ്ഞെടുക്കുക</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 3770f15..a9110a9 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Энэ хуудас хариу өгөхгүй байна</translation> <translation id="1041263367839475438">Боломжтой байгаа төхөөрөмжүүд</translation> <translation id="1042174272890264476">Таны компьютер мөн <ph name="SHORT_PRODUCT_NAME" />-ын RLZ программын мэдээллийн сантай байдаг. RLZ нь тодорхой кампанит ажлаар удирдуулсан хайлтууд болон <ph name="SHORT_PRODUCT_NAME" />-ын хэрэглээг хэмжих онцгой бус, мөн хувийн бус, тодорхойлох боломжтой цонхнуудыг ажиллуулдаг. Эдгээр хаягууд нь заримдаа <ph name="PRODUCT_NAME" /> дахь Google Хайлтын асуултуудад харагддаг.</translation> +<translation id="1043818413152647937">Эдгээр аппаас мөн өгөгдлийг арилгах уу?</translation> <translation id="1045692658517323508">{0,plural, =1{1 минутын дотор шинэчилнэ үү}other{# минутын дотор шинэчилнэ үү}}</translation> <translation id="1046635659603195359">Та Google Туслахаараа Voice Match-г өөр төхөөрөмж дээр аль хэдийн тохируулсан бoлолтой. Эдгээр өмнөх бичлэгийг энэ төхөөрөмжид дуу хоолойн загвар үүсгэхэд ашиглаж болно. Үүнд нэг минутаас бага хугацаа зарцуулна.</translation> <translation id="1047431265488717055">Текстийн холбоосыг хуулах</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome-д Google smarts авах</translation> <translation id="1147991416141538220">Хандалт хүсэхийн тулд энэ төхөөрөмжийн администратортай холбоо барина уу.</translation> <translation id="1149401351239820326">Хугацаа дуусах сар</translation> +<translation id="1150490752229770117">Энэ бол энэ <ph name="DEVICE_TYPE" />-н програм хангамж болон аюулгүй байдлын сүүлийн автомат шинэчлэлт. Ирээдүйд шинэчлэлт хийхийн тулд, шинэ загварт дэвшүүлнэ үү. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Нарны шил</translation> <translation id="1151917987301063366"><ph name="HOST" />-д мэдрэгчид хандахыг тогтмол зөвшөөрөх</translation> <translation id="1153356358378277386">Хослуулсан төхөөрөмж</translation> @@ -507,7 +509,9 @@ <translation id="1709217939274742847">Нотолгоонд хэрэглэх тасалбарыг сонгоно уу. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Энэ нууц үгийг iPhone-доо авах</translation> <translation id="1712552549805331520"><ph name="URL" /> таны дотоод компьютерт өгөгдлийг бүрмөсөн хадгалах хүсэлтэй байна</translation> +<translation id="1714644264617423774">Таны төхөөрөмжийг ашиглахад илүү хялбар болгохын тулд хандалтын онцлогуудыг идэвхжүүлэх. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Хөдөлгөөн мэдрэгч</translation> +<translation id="171824261579749339">Австралийн <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Сүүлийн цаг</translation> <translation id="1719312230114180055">Санамж: Таны хурууны хээ нь хүчтэй нууц үг болон ПИН-ээс хамгаалалт муутай байж болзошгүй.</translation> <translation id="1720318856472900922">TLS WWW Сервер таниулах</translation> @@ -769,6 +773,7 @@ <translation id="2096715839409389970">Гуравдагч талын күүкиг устгах</translation> <translation id="2097372108957554726">Та шинэ төхөөрөмжүүдийг бүртгүүлэхийн тулд Chrome руу нэвтрэх хэрэгтэй</translation> <translation id="2099172618127234427">Та sshd daemon-г тохируулах мөн USB төхөөрөмжийг бүүт хийдэг тохиргоог идэвхжүүлэх Chrome OS-н алдаа засах тохиргоог идэвхжүүлж байна.</translation> +<translation id="2099625543891475722">таны биеийн онцлог, жишээлбэл, өндөр</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" серверийн сертификатыг устгах уу?</translation> <translation id="2100273922101894616">Автоматаар нэвтэх</translation> <translation id="2101225219012730419">Хувилбар:</translation> @@ -1022,6 +1027,7 @@ <translation id="2445484935443597917">Шинэ профайл үүсгэх</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> таны аюулгүй байдлын түлхүүрийг баталгаажуулах хүсэлтэй байна</translation> <translation id="2448312741937722512">Төрөл</translation> +<translation id="2448734521821581858">Күүки нь таны зочилдог вэб сайтуудын үүсгэдэг файл юм. Хоёр төрлийн күүки байдаг: Анхдагч талын күүкиг таны зочилдог сайт үүсгэдэг. Сайтыг хаяг оруулах хэсэгт харуулдаг. Гуравдагч талын күүкиг бусад сайт үүсгэдэг. Эдгээр сайт нь таны зочилдог вэб сайт дээрээ хардаг зар эсвэл зураг зэрэг контентын заримыг нь эзэмшдэг.</translation> <translation id="2450223707519584812">Google API-н түлхүүр байхгүй учир та хэрэглэгч нэмэх боломжгүй. Дэлгэрэнгүй мэдээлэл авахын тулд <ph name="DETAILS_URL" />-г хараарай.</translation> <translation id="2450849356604136918">Идэвхтэй харагдац алга</translation> <translation id="2451298179137331965">2x</translation> @@ -1135,6 +1141,7 @@ <translation id="2587922766792651800">Завсарласан</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" />-н төхөөрөмжүүд</translation> <translation id="2594999711683503743">Google-с хайх эсвэл URL бичих</translation> +<translation id="2600522410036850735">Энэ төхөөрөмж нь <ph name="MONTH_AND_YEAR" /> хүртэл програм хангамж болон аюулгүй байдлын автомат шинэчлэлтийг авах болно. <a target="_blank" href="<ph name="URL" />">Нэмэлт мэдээлэл авах</a></translation> <translation id="2603115962224169880">Компьютерийг цэвэрлэх</translation> <translation id="2603463522847370204">Нууцлалтай цонхонд нээх</translation> <translation id="2604255671529671813">Сүлжээний холболтын алдаа</translation> @@ -1555,6 +1562,7 @@ <translation id="3181954750937456830">Аюулгүй хөтөч (таныг болон таны төхөөрөмжийг аюултай сайтаас хамгаалдаг)</translation> <translation id="3182749001423093222">Зөв бичгийн алдаа шалгах</translation> <translation id="3183139917765991655">Профайл импортлогч</translation> +<translation id="3184536091884214176">CUPS хэвлэгчийг тохируулж эсвэл удирдах. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Миний файл</translation> <translation id="3188465121994729530">Дундаж үзүүлэлт</translation> <translation id="3190558889382726167">Нууц үгийг хадгалсан</translation> @@ -1745,7 +1753,6 @@ <translation id="347670947055184738">Уучлаарай! Систем таны төхөөрөмжийн удирдамжийг татаж чадсангүй.</translation> <translation id="347785443197175480"><ph name="HOST" />-д таны камер болон микрофон руу нэвтрэхийг үргэлжлүүлэн зөвшөөр</translation> <translation id="3478685642445675458">Хүн устгахаасаа өмнө профайлынхаа түгжээг тайлна уу.</translation> -<translation id="3479539252931486093">Энэ гэнэтийн байсан уу? <ph name="BEGIN_LINK" />Бидэнд мэдэгдэнэ үү<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Одоо биш</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" />-г <ph name="COUNTDOWN_SECONDS" /> секундийн дараа нээх гэж байна</translation> <translation id="3484273680291419129">Аюултай програмыг устгаж байна...</translation> @@ -2251,6 +2258,7 @@ <translation id="4138267921960073861">Нэвтрэх дэлгэц дээр хэрэглэгчийн нэр болон зургийг харуулах</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID төхөөрөмж холбогдлоо</translation> <translation id="4142052906269098341"><ph name="DEVICE_TYPE" />-н түгжээгээ утсаараа тайлна уу. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Илрүүлсэн хэвлэгчийг профайлдаа хадгалах эсвэл шинэ хэвлэгч нэмэх. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Илүү чанартай видео авж батарейн ажиллах хугацаагаа хэмнээрэй. Видео нь зөвхөн таны дамжуулах боломжтой дэлгэцэд тоглоно.</translation> <translation id="4146026355784316281">Системийн харагчтэй үргэлж хамт нээж байх</translation> <translation id="4146785383423576110">Шинэчлэх, цэвэрлэх</translation> @@ -2375,6 +2383,7 @@ <translation id="4364327530094270451">Амтат гуа</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> цонх хуваалцаж байна.</translation> <translation id="4364830672918311045">Дэлгэцийн мэдэгдэл</translation> +<translation id="436499142539576997">Аппын өгөгдлийг авч чадсангүй, аппыг ажиллуулахыг оролдсоор байна...</translation> <translation id="4370975561335139969">Таны оруулсан имэйл болон нууц үг таарахгүй байна</translation> <translation id="437184764829821926">Фонтны сайжруулсан тохиргоо</translation> <translation id="4374831787438678295">Linux суулгагч</translation> @@ -2565,6 +2574,7 @@ <translation id="465878909996028221">Хөтчийн дахин чиглүүлэлтэд зөвхөн http, https болон файлын протоколыг дэмждэг.</translation> <translation id="4659077111144409915">Үндсэн бүртгэл</translation> <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" хувилбарыг шаардсан хэдий ч "<ph name="NEW_ID" />" хувилбар байсан</translation> +<translation id="4660838440047236328">таны өрөөний төлөвлөлт</translation> <translation id="4662788913887017617">Энэ хавчуургыг iPhone-д хуваалцах</translation> <translation id="4663373278480897665">Камерыг зөвшөөрсөн</translation> <translation id="4664482161435122549">PKCS # 12 Экспортлох үеийн алдаа</translation> @@ -2728,6 +2738,7 @@ <translation id="4900392736118574277">Таны эхлүүлэх хуудсыг <ph name="URL" /> болгож өөрчилсөн.</translation> <translation id="4902546322522096650">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, дохионы хүч<ph name="SIGNAL_STRENGTH" />%, холбогдох</translation> <translation id="49027928311173603">Серверээс татсан бодлого хүчин төгөлдөр бус байна: <ph name="VALIDATION_ERROR" /> .</translation> +<translation id="4906490889887219338">Сүлжээний файл хуваалцахыг тохируулах эсвэл удирдах. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Энэ файлыг ихэвчлэн татдаггүй бөгөөд аюултай байж болзошгүй.</translation> <translation id="4907306957610201395">Зөвшөөрлийн ангилал</translation> <translation id="4908811072292128752">Хоёр сайтыг зэрэг хөтлөхийн тулд шинэ чихтэй хуудас нээх</translation> @@ -2815,6 +2826,7 @@ <translation id="5038863510258510803">Идэвхжүүлж байна...</translation> <translation id="5039804452771397117">Зөвшөөрөх</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />-г Linux-д холбохын тулд Тохиргоог нээнэ үү</translation> +<translation id="5043913660911154449">Эсвэл хэвлэгчийнхээ PPD-г тодорхойлох <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Буруу нууц үг</translation> <translation id="504561833207953641">Ашиглалтад байгаа хөтчийн харилцан үйлдэлд нээж байна.</translation> <translation id="5047421709274785093">Сайтуудад хөдөлгөөн болон гэрэл мэдрэгч ашиглахыг нь хориглох</translation> @@ -3100,6 +3112,7 @@ <translation id="5464660706533281090">Насанд хүрээгүй хэрэглэгчид энэ тохиргоог өөрчлөх боломжгүй.</translation> <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />”-г буулгаад, хайх</translation> <translation id="5468173180030470402">Файл хуваалцахыг хайж байна</translation> +<translation id="5470735824776589490">Үйлдвэрийн тохиргоонд нь буцааж оруулах замаар таны төхөөрөмжийг шинэчлэх боломжтой болохын өмнө дахин эхлүүлэх шаардлагатай. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Сайн байна уу! Би таны текстийг яриа болгогч дуу хоолой байна.</translation> <translation id="5472133193607270166">Асаалттай үед сайтууд нь зарыг хувийн болгохын тулд өөр өөр сайт дээрх таны хөтчийн үйл ажиллагааг ашиглах боломжгүй байна. Зарим сайт нь зохих ёсоор ажиллахгүй байж болзошгүй.</translation> <translation id="5473333559083690127">Шинэ ПИН-г дахин оруулна уу</translation> @@ -3123,6 +3136,7 @@ <translation id="5496587651328244253">Зохион байгуулах</translation> <translation id="5499313591153584299">Энэ файл нь таны компьютерт хор хөнөөлтэй байж болно.</translation> <translation id="5502500733115278303">Firefox-оос импортолж авсан</translation> +<translation id="5505264765875738116">Сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжгүй</translation> <translation id="5505307013568720083">Бэх дууссан</translation> <translation id="5507756662695126555">Үл цуцлах</translation> <translation id="5509693895992845810">... байдлаар хадгалах</translation> @@ -3338,6 +3352,7 @@ <translation id="5801568494490449797">Миний сонголт</translation> <translation id="5804175651771201311">Роуминг унтраалттай</translation> <translation id="5804241973901381774">Зөвшөөрлүүд</translation> +<translation id="5804427196348435412">NFC төхөөрөмжүүдийг ашиглах</translation> <translation id="5805697420284793859">Цонхны менежер</translation> <translation id="5806773519584576205">0° (өгөгдмөл)</translation> <translation id="5811750797187914944">Бүгдийг тохируулсан</translation> @@ -3552,6 +3567,7 @@ <translation id="6096047740730590436">Томоор нээ</translation> <translation id="6096326118418049043">X.500 нэр</translation> <translation id="6097480669505687979">Хэрэв хангалттай багтаамж гаргахгүй бол хэрэглэгчид, өгөгдлийг автоматаар устгах болно.</translation> +<translation id="6097600385983390082">Дуут хайлтыг хаалаа</translation> <translation id="6098793583803863900">Үл таних файлд аюултай агуулгын скан хийж байна.</translation> <translation id="6100736666660498114">Эхлэх цэс</translation> <translation id="6101226222197207147">Шинэ (<ph name="EXTENSION_NAME" />) апп нэмэгдсэн</translation> @@ -3647,6 +3663,7 @@ <translation id="6233154960150021497">Гарын оронд дуу хоолой ашиглах өгөгдмөлийг тохируулах</translation> <translation id="6234474535228214774">Суулгалт хүлээгдэж байна</translation> <translation id="6237816943013845465">Дэлгэцийн нягтралыг тохируулахыг зөвшөөрдөг</translation> +<translation id="6238624845858322552">Bluetooth төхөөрөмжид холбогдох</translation> <translation id="6238767809035845642">Өөр төхөөрөмжөөс хуваалцсан текст</translation> <translation id="6238923052227198598">Хамгийн сүүлийн тэмдэглэлийг түгжигдсэн дэлгэцэд хадгалах</translation> <translation id="6239558157302047471">Дахин ачаалах, фрэйм</translation> @@ -3673,6 +3690,7 @@ <translation id="6267547857941397424">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="PHONE_NAME" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />%, утасны батарей <ph name="BATTERY_STATUS" />%, холбогдох</translation> <translation id="6268252012308737255"><ph name="APP" />-р нээх</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжтой</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Систем, апп-ын мэдээлэл<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />хэмжигдэхүүн<ph name="END_LINK2" />-г илгээх</translation> <translation id="6272643420381259437">Залгаасыг татахад алдаа (<ph name="ERROR" />) гарлаа</translation> <translation id="6273677812470008672">Чанар</translation> @@ -3694,6 +3712,7 @@ <translation id="629730747756840877">Данс</translation> <translation id="6298962879096096191">Андройд апп суулгахын тулд Google Play-г ашиглана уу</translation> <translation id="630065524203833229">Гарах</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" />-г автоматаар тохируулж чадсангүй. Хэвлэгчийн нарийвчилсан дэлгэрэнгүй мэдээллийг тодорхойлно уу. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Олон улсын удирдамж:</translation> <translation id="6307990684951724544">Систем завгүй байна</translation> <translation id="6308493641021088955">Нэвтрэх үйлчилгээ үзүүлэгч: <ph name="EXTENSION_NAME" /></translation> @@ -3863,6 +3882,7 @@ <translation id="6555810572223193255">Одоогоор цэвэрлэх боломжгүй байна</translation> <translation id="6556866813142980365">Дахин хийх</translation> <translation id="6557290421156335491">Миний товчлол</translation> +<translation id="6561560012278703671">Илүү чимээгүй зурвасыг ашиглах (мэдэгдлийн сануулгад танд саад болохыг хориглодог)</translation> <translation id="6561726789132298588">Оруул</translation> <translation id="656293578423618167">Файлын зам эсвэл нэр нь хэтэрхий урт байна. Илүү богино нэрээр эсвэл өөр газарт хадгална уу.</translation> <translation id="6563469144985748109">Таны менежер үүнийг одоогоор зөвшөөрөөгүй байна</translation> @@ -4046,6 +4066,7 @@ <translation id="6840155290835956714">Илгээхээсээ өмнө асуух</translation> <translation id="6840184929775541289">Гэрчилгээжүүлэх эрх байхгүй</translation> <translation id="6841186874966388268">Алдаа</translation> +<translation id="6843267103192918276">Бүх төхөөрөмж дээрх хавчуурга, түүх, нууц үгээ болон бусад тохиргоонд хүрэхийн тулд нэвтэрнэ үү. Мөн та Google үйлчилгээнд автоматаар нэвтрэх болно. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google бэлэн боллоо</translation> <translation id="6845038076637626672">Томоор нээ</translation> <translation id="6845325883481699275">Chrome-н аюулгүй байдлыг сайжруулахад туслах</translation> @@ -4462,7 +4483,6 @@ <translation id="7442465037756169001">Таны Hangouts Meet hardware тохируулахад бэлэн байна.</translation> <translation id="744341768939279100">Шинэ намтар үүсгэх</translation> <translation id="7443806024147773267">Google Бүртгэлдээ нэвтрэх бүрд нууц үгэндээ хандаарай</translation> -<translation id="7444046173054089907">Энэ сайтыг блоклосон байна</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />-ийг идэвхгүй болго</translation> <translation id="7448430327655618736">Автоматаар суулгасан апп</translation> <translation id="7450761244949417357">Одоо <ph name="ALTERNATIVE_BROWSER_NAME" />-д нээж байна</translation> @@ -5023,6 +5043,7 @@ <translation id="8214962590150211830">Энэ хүнийг устга</translation> <translation id="8215295261562449873">Linux-г дэвшүүлэхийн өмнө миний аппууд болон файлуудыг Татаж авсан файлын фолдер луу хуулбарлах.</translation> <translation id="8217399928341212914">Олон файл автоматаар зэрэг татах үйлдлийг блозлох тохиргоог үргэлжлүүлэх</translation> +<translation id="8218847192766059983">Хэл нэмэх эсвэл жагсаалтыг дахин эрэмбэлэх. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Та ихэвчлэн мэдэгдлийг хориглодог. Энэ сайтад танд мэдэгдэхийг зөвшөөрөхийн тулд энд товшино уу.</translation> <translation id="8225265270453771718">Аппликейшний цонхыг хуваалцах</translation> <translation id="8225753906568652947">Саналаа зарцуулах</translation> @@ -5634,6 +5655,7 @@ <translation id="9065203028668620118">Засварлах</translation> <translation id="9066773882585798925">Текстийг чангаар унших</translation> <translation id="9066782832737749352">Текст-яриа</translation> +<translation id="9067559831321817373">Нэвтэрсэн бүртгэлүүдээ удирдах. Chrome болон Google Play-н вэб сайт, апп болон өргөтгөл нь зөвшөөрлөөс хамаарч, таны хэрэглээг өөрчлөхийн тулд эдгээр бүртгэлийг ашиглаж болзошгүй. <a>Нэмэлт мэдээлэл авах</a></translation> <translation id="9068849894565669697">Өнгө сонгох</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 5b62f3d..9d9a531 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">हे पेज प्रतिसाद देत नाही</translation> <translation id="1041263367839475438">उपलब्ध असलेली डिव्हाइस</translation> <translation id="1042174272890264476">तुमचा कॉंप्युटर देखील <ph name="SHORT_PRODUCT_NAME" />च्या RLZ वाचनालयासह बिल्ट-इन आला आहे. एका विशिष्ट जाहिरात मोहीमेद्वारे चालविलेला शोध आणि <ph name="SHORT_PRODUCT_NAME" /> वापर मोजण्यासाठी RLZ एक अद्वितीय-नसलेला, वैयक्तिकरित्या-ओळखता न येणारा टॅग नियुक्त करते. <ph name="PRODUCT_NAME" /> मधील Google शोध क्वेरींमध्ये ही लेबल काहीवेळा दिसतात.</translation> +<translation id="1043818413152647937">तसेच या अॅप्समधून डेटा साफ करायचा?</translation> <translation id="1045692658517323508">{0,plural, =1{एका मिनिटामध्ये अपडेट करा}other{# मिनिटांमध्ये अपडेट करा}}</translation> <translation id="1046635659603195359">असे दिसते की, तुम्ही दुसर्या डिव्हाइसवर आधीपासून Google असिस्टंटसह Voice Match सेट केले आहे. या डिव्हाइसवर आवाजाचा नमुना बनवण्यासाठी या मागील रेकॉर्डिंग वापरल्या जाऊ शकतात. याला एका मिनिटापेक्षा कमी वेळ लागेल.</translation> <translation id="1047431265488717055">लिंक मजकूर कॉपी करा</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome मध्ये Google स्मार्ट मिळवा</translation> <translation id="1147991416141538220">अॅक्सेसची विनंती करण्यासाठी या डिव्हाइसच्या अॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation> <translation id="1149401351239820326">कालबाह्य होण्याचा महिना:</translation> +<translation id="1150490752229770117">या <ph name="DEVICE_TYPE" /> साठी हे अंतिम ऑटोमेटिक सॉफ्टवेअर आणि सुरक्षा अपडेट आहे. वैशिष्ट्यांसंबंधित अपडेट मिळवण्यासाठी, सर्वात नवीन मॉडेलवर अपग्रेड करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="1150565364351027703">सनग्लासेस</translation> <translation id="1151917987301063366"><ph name="HOST" /> ला नेहमी सेन्सर ॲक्सेस करू द्या</translation> <translation id="1153356358378277386">जोडलेली डिव्हाइस</translation> @@ -510,7 +512,9 @@ <translation id="1709217939274742847">ऑथेंटिकेशनसाठी वापरण्याकरिता तिकीट निवडा <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="1712349894969001173">तुमच्या iPhone वर हा पासवर्ड मिळवा</translation> <translation id="1712552549805331520"><ph name="URL" /> ला तुमच्या स्थानिक काँप्युटरवर डेटा कायमचा स्टोअर करायचा आहे</translation> +<translation id="1714644264617423774">तुमचे डिव्हाइस वापरण्यास सुलभ करण्यासाठी अॅक्सेसिबिलिटी वैशिष्ट्ये सुरू करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="1717218214683051432">मोशन सेन्सर</translation> +<translation id="171824261579749339">ऑस्ट्रेलियन <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="1718835860248848330">शेवटच्या तासामधील</translation> <translation id="1719312230114180055">टिप: मजबूत पासवर्ड किंवा पिनपेक्षा तुमचे फिंगरप्रिंट कमी सुरक्षित असू शकतात.</translation> <translation id="1720318856472900922">TLS WWW सर्व्हर ऑथेंटिकेशन</translation> @@ -772,6 +776,7 @@ <translation id="2096715839409389970">तृतीय पक्ष कुकी साफ करा</translation> <translation id="2097372108957554726">नवीन डिव्हाइसेसची नोंदणी करण्यासाठी तुम्हाला Chrome वर साइन इन करणे आवश्यक आहे</translation> <translation id="2099172618127234427">तुम्ही Chrome OS डीबगिंग वैशिष्ट्ये सुरू करत आहात जी ssh केलेल्या daemon सेट आणि USB ड्राइव्हवरून बूट करणे सुरू करतील.</translation> +<translation id="2099625543891475722">तुमची शारीरिक वैशिष्ट्ये जसे की, उंची</translation> <translation id="2099686503067610784">सर्व्हर सर्टिफिकेट "<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation> <translation id="2100273922101894616">ऑटो साइन इन करा</translation> <translation id="2101225219012730419">आवृत्ती:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">नवीन प्रोफाइल तयार करा</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ला तुमची ओळख पडताळयची आहे</translation> <translation id="2448312741937722512">प्रकार</translation> +<translation id="2448734521821581858">कुकी म्हणजे तुम्ही भेट दिलेल्या वेबसाइटने तयार केलेल्या फाइल. दोन प्रकारच्या कुकी आहेत: पहिल्या पक्षाच्या कुकी तुम्ही भेट दिलेल्या साइटद्वारे तयार केल्या जातात. साइट अॅड्रेस बारवर दाखवली जाते. तृतीय पक्षीय कुकी इतर साइटद्वारे तयार केल्या जातात. या साइटमध्ये जाहिराती किंवा इमेज यांसारखा काही आशय आहे जो तुम्ही भेट देत असलेल्या वेबसाइटवर दिसतो.</translation> <translation id="2450223707519584812">Google API की गहाळ असल्याने तुम्ही वापरकर्ते जोडण्यात सक्षम असणार नाही. तपशीलांसाठी <ph name="DETAILS_URL" /> पहा.</translation> <translation id="2450849356604136918">कोणतेही सक्रिय व्ह्यू नाहीत</translation> <translation id="2451298179137331965">२x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">वेळ संपली</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> कडील डिव्हाइस</translation> <translation id="2594999711683503743">Google वर शोधा किंवा URL टाइप करा</translation> +<translation id="2600522410036850735"><ph name="MONTH_AND_YEAR" /> पर्यंत या डिव्हाइसवर ऑटोमॅटिक सॉफ्टवेअर आणि सुरक्षा अपडेट मिळतील. <a target="_blank" href="<ph name="URL" />">अधिक जाणून घ्या</a></translation> <translation id="2603115962224169880">काँप्युटर साफ करा</translation> <translation id="2603463522847370204">&गुप्त विंडोमध्ये उघडा</translation> <translation id="2604255671529671813">नेटवर्क कनेक्शन एरर</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">सुरक्षित ब्राउझिंग (तुम्हाला आणि तुमच्या डिव्हाइसना धोकादायक साइटपासून सुरक्षित ठेवते)</translation> <translation id="3182749001423093222">स्पेल चेक</translation> <translation id="3183139917765991655">प्रोफाईल आयातकर्ता</translation> +<translation id="3184536091884214176">CUPS प्रिंटर सेट किंवा व्यवस्थापित करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="3188257591659621405">माझ्या फायली</translation> <translation id="3188465121994729530">हलविण्याची सरासरी</translation> <translation id="3190558889382726167">पासवर्ड सेव्ह केला</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">अरेरे! तुमच्या डीव्हाइससाठी धोरण आणण्यात सिस्टम अयशस्वी झाली.</translation> <translation id="347785443197175480">तुमचा कॅमेरा आणि मायक्रोफोन ॲक्सेस करण्यासाठी <ph name="HOST" /> ला परवानगी देणे सुरू ठेवा</translation> <translation id="3478685642445675458">कृपया एखाद्या व्यक्तीस काढण्यापूर्वी तुमचे प्रोफाईल अनलॉक करा.</translation> -<translation id="3479539252931486093">हे अनपेक्षित होते? <ph name="BEGIN_LINK" />आम्हाला कळवा<ph name="END_LINK" /></translation> <translation id="3479552764303398839">सध्या नाही</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> मध्ये <ph name="COUNTDOWN_SECONDS" /> सेकंदांत उघडत आहे</translation> <translation id="3484273680291419129">धोकादायक सॉफ्टवेअर काढत आहे...</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">साइन-इन स्क्रीनवर वापरकर्ता नावे आणि फोटो दर्शवा</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID डिव्हाइस कनेक्ट केले</translation> <translation id="4142052906269098341">तुमच्या फोनने <ph name="DEVICE_TYPE" /> अनलॉक करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">तुमच्या प्रोफाइलवर डिटेक्ट केलेले प्रिंटर सेव्ह करा किंवा नवीन प्रिंटर जोडा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="4144218403971135344">आणखी चांगल्या दर्जाचे व्हिडिओ मिळवा आणि बॅटरी लाइफ वाचवा. व्हिडिओ फक्त तुमच्या Cast सुरू केलेल्या स्क्रीनवर प्ले होईल.</translation> <translation id="4146026355784316281">नेहमी सिस्टम दर्शकासह उघडा</translation> <translation id="4146785383423576110">रीसेट करा आणि साफ करा</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">खरबूज</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> विंडो शेअर करीत आहे.</translation> <translation id="4364830672918311045">सूचना डिस्प्ले करा</translation> +<translation id="436499142539576997">अॅप डेटा मिळवता आला नाही, अजूनही अॅप रन करण्याचा प्रयत्न करत आहे...</translation> <translation id="4370975561335139969">तुम्ही एंटर केलेला ईमेल आणि पासवर्ड जुळत नाही</translation> <translation id="437184764829821926">प्रगत फॉन्ट सेटिंग्ज</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">फक्त http, https आणि फाइल प्रोटोकॉलना ब्राउझर रीडिरेक्टला सपोर्ट करते.</translation> <translation id="4659077111144409915">प्राथमिक खाते</translation> <translation id="4660476621274971848">अपेक्षित आवृत्ती "<ph name="EXPECTED_VERSION" />", परंतु आवृत्ती "<ph name="NEW_ID" />" होती</translation> +<translation id="4660838440047236328">तुमच्या रूमचा लेआउट</translation> <translation id="4662788913887017617">हा बुकमार्क आपल्या iPhone सह शेअर करा</translation> <translation id="4663373278480897665">कॅमेऱ्याला अनुमती आहे</translation> <translation id="4664482161435122549">PKCS #12 निर्यात एरर</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">तुमचे स्टार्टअप पेज <ph name="URL" /> मध्ये बदलले.</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" /> पैकी <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />%, कनेक्ट करा</translation> <translation id="49027928311173603">सर्व्हरवरून डाउनलोड केलेले धोरण चुकीचे आहे: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">नेटवर्क फाइल शेअर सेट किंवा व्यवस्थापित करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ही फाईल सामान्यपणे डाउनलोड केली नाही आणि कदाचित धोकादायक असू शकते.</translation> <translation id="4907306957610201395">परवानगी वर्गवारी</translation> <translation id="4908811072292128752">एकाच वेळी दोन साइट ब्राउझ करण्यासाठी एक नवीन टॅब उघडा</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">सक्षम करत आहे...</translation> <translation id="5039804452771397117">परवानगी द्या</translation> <translation id="5042282098504489593">Linux शी <ph name="USB_DEVICE_NAME" /> कनेक्ट करण्यासाठी सेटिंग्ज उघडा</translation> +<translation id="5043913660911154449">किंवा तुमची PPD नमूद करा <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="5045550434625856497">चुकीचा पासवर्ड</translation> <translation id="504561833207953641">अस्तित्वात असलेल्या ब्राउझर सेशनमध्ये उघडत आहे.</translation> <translation id="5047421709274785093">गती आणि प्रकाश सेन्सर वापरण्यापासून साइटना ब्लॉक करा</translation> @@ -3103,6 +3115,7 @@ <translation id="5464660706533281090">ही सेटिंग लहान मूल वापरकर्ता बदलू शकत नाही.</translation> <translation id="5466374726908360271">पेस्ट करा आणि “<ph name="SEARCH_TERMS" />” शोधा</translation> <translation id="5468173180030470402">फाइल शेअर शोधत आहात का</translation> +<translation id="5470735824776589490">Powerwash सह तुमचा डिव्हाइस रीसेट केला जाण्यापूर्वी तो रीस्टार्ट करणे आवश्यक आहे. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="5471768120198416576">हाय! मी तुमचा टेक्स्ट टू स्पीच व्हॉइस आहे.</translation> <translation id="5472133193607270166">सुरू केलेली असेल तेव्हा जाहिराती पर्सनलाइझ करण्यासाठी साइट तुमची ब्राउझिंग ॲक्टिव्हिटी विविध साइटवर वापरू शकत नाहीत. काही साइट कदाचित योग्यप्रकारे काम करणार नाहीत.</translation> <translation id="5473333559083690127">नवीन पिन पुन्हा प्रविष्ट करा</translation> @@ -3126,6 +3139,7 @@ <translation id="5496587651328244253">संयोजित करा</translation> <translation id="5499313591153584299">ही फाइल तुमच्या कॉंप्युटरसाठी हानिकारक ठरू शकते.</translation> <translation id="5502500733115278303">Firefox कडून आयातीत</translation> +<translation id="5505264765875738116">साइट सूचना पाठवण्यास सांगू शकत नाहीत</translation> <translation id="5505307013568720083">शाई संपली</translation> <translation id="5507756662695126555">अस्वीकार नसलेले</translation> <translation id="5509693895992845810">या फॉरमॅटमध्ये सेव्ह करा...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">प्राधान्ये</translation> <translation id="5804175651771201311">रोमिंग बंद आहे</translation> <translation id="5804241973901381774">परवानग्या</translation> +<translation id="5804427196348435412">NFC डिव्हाइस वापरा</translation> <translation id="5805697420284793859">विंडो व्यवस्थापक</translation> <translation id="5806773519584576205">०° (डीफॉल्ट)</translation> <translation id="5811750797187914944">सर्व तयार आहे</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">वाढवलेले उघडा</translation> <translation id="6096326118418049043">X.500 नाव</translation> <translation id="6097480669505687979">तुम्ही स्थान मोकळे न केल्यास, वापरकर्ते आणि डेटा स्वयंचलितपणे काढला जाऊ शकतो.</translation> +<translation id="6097600385983390082">व्हॉइस शोध बंद झाला</translation> <translation id="6098793583803863900">एक अज्ञात फाइल धोकादायक आशयासाठी स्कॅन केली जात आहे.</translation> <translation id="6100736666660498114">प्रारंभ मेनू</translation> <translation id="6101226222197207147">नवीन अॅप जोडला (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">कीबोर्डऐवजी व्हॉइस वापरण्यासाठी डीफॉल्ट</translation> <translation id="6234474535228214774">इंस्टॉल करणे प्रलंबित आहे</translation> <translation id="6237816943013845465">तुम्हाला स्क्रीन रिझोल्युशन ॲडजस्ट करण्याची अनुमती देते</translation> +<translation id="6238624845858322552">ब्लूटूथ डिव्हाइसशी कनेक्ट करा</translation> <translation id="6238767809035845642">मजकूर इतर डिव्हाइसवरून शेअर केला आहे</translation> <translation id="6238923052227198598">लॉक स्क्रीनवर नवीनतम टीप ठेवा</translation> <translation id="6239558157302047471">रीलोड आणि फ्रेम करा</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" /> पैकी <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="PHONE_NAME" />, सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />%, फोन बॅटरी <ph name="BATTERY_STATUS" />%, कनेक्ट करा</translation> <translation id="6268252012308737255"><ph name="APP" /> सह उघडा</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">साइट सूचना पाठवण्यास सांगू शकतात</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />सिस्टम आणि ॲप माहिती<ph name="END_LINK1" /> आणि <ph name="BEGIN_LINK2" />मेट्रिक्स<ph name="END_LINK2" /> पाठवा</translation> <translation id="6272643420381259437">प्लग-इन डाउनलोड करताना (<ph name="ERROR" />) एरर आली</translation> <translation id="6273677812470008672">गुणवत्ता</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">खाते</translation> <translation id="6298962879096096191">Android ॲप्स इंस्टॉल करण्यासाठी Google Play वापरा</translation> <translation id="630065524203833229">नि&र्गमन</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> आपोआप कॉंफिगत होऊ शकत नाही. कृपया प्रगत प्रिंटर तपशील नमूद करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="6305607932814307878">जागतिक धोरण:</translation> <translation id="6307990684951724544">सिस्टीम व्यस्त</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> ने पुरवलेले साइन इन</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">क्लीनअप सध्या अनुपलब्ध आहे</translation> <translation id="6556866813142980365">पुन्हा करा</translation> <translation id="6557290421156335491">माझे शॉर्टकट</translation> +<translation id="6561560012278703671">कमी आवाजाचा मेसेज वापरा (तुम्हाला व्यत्यय आणणे थांबवण्यासाठी सूचना ब्लॉक करा)</translation> <translation id="6561726789132298588">प्रविष्ट करा</translation> <translation id="656293578423618167">फाइल पथ किंवा नाव खूप मोठे आहे. कृपया एका छोट्या नावाने किंवा दुसर्या स्थानावर सेव्ह करा.</translation> <translation id="6563469144985748109">आपल्या व्यवस्थापकाने अद्याप ती मंजूर केली नाही</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">पाठविण्यापूर्वी विचारा</translation> <translation id="6840184929775541289">प्रमाणन अधिकृतता नाही</translation> <translation id="6841186874966388268">एरर</translation> +<translation id="6843267103192918276">तुमच्या सर्व डिव्हाइसवर तुमचे बुकमार्क, इतिहास, पासवर्ड आणि इतर सेटिंग्ज मिळविण्यासाठी साइन इन करा. तुम्हाला तुमच्या Google सेवांमध्ये देखील आपोआप साइन इन केले जाईल. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google सर्व तयार आहे</translation> <translation id="6845038076637626672">वाढवलेले उघडा</translation> <translation id="6845325883481699275">Chrome सुरक्षेमध्ये सुधारणा करण्यात मदत करा</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">तुमचे Hangouts Meet hardware सेट अप होण्यासाठी सज्ज आहे.</translation> <translation id="744341768939279100">एक नवीन प्रोफाईल तयार करा</translation> <translation id="7443806024147773267">तुम्ही तुमच्या Google खात्यामध्ये कधीही साइन इन करता तेव्हा तुमचे पासवर्ड ॲक्सेस करा</translation> -<translation id="7444046173054089907">ही साइट अवरोधित केली आहे</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> अक्षम करा</translation> <translation id="7448430327655618736">अॅप्स आपोआप इंस्टॉल करा</translation> <translation id="7450761244949417357">आता <ph name="ALTERNATIVE_BROWSER_NAME" /> मध्ये उघडत आहे</translation> @@ -5029,6 +5049,7 @@ <translation id="8214962590150211830">या व्यक्तीस काढून टाका</translation> <translation id="8215295261562449873">Linux अपग्रेड करण्यापूर्वी डाउनलोड फोल्डरवर माझी अॅप्स आणि फाइलचा बॅकअप घ्या.</translation> <translation id="8217399928341212914">एकाधिक फायलींचे स्वयंचलित डाउनलोड अवरोधित करणे सुरू ठेवा</translation> +<translation id="8218847192766059983">भाषा जोडा किंवा सूचीचा क्रम पुन्हा लावा. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="8221491193165283816">तुम्ही सहसा सूचना ब्लॉक करता. या साइटला तुम्हाला सूचित करू देण्यासाठी, येथे क्लिक करा.</translation> <translation id="8225265270453771718">ॲप्लिकेशन विंडो शेअर करा</translation> <translation id="8225753906568652947">तुमच्या ऑफर रिडीम करा</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">संपादन</translation> <translation id="9066773882585798925">मोठ्याने वाचलेला मजकूर ऐका</translation> <translation id="9066782832737749352">टेक्स्ट टू स्पीच</translation> +<translation id="9067559831321817373">तुमची साइन-इन केलेली खाती व्यवस्थापित करा. परवानग्यांवर आधारित, तुमचा अनुभव कस्टमाइझ करण्यासाठी Chrome आणि Google Play मधील अॅप्स, वेबसाइट आणि एक्स्टेंशन कदाचित ही खाती वापरतील. <a>अधिक जाणून घ्या</a></translation> <translation id="9068849894565669697">रंग निवडा</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">ब्लूटूथ</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index b268dbb7..c75ae4c 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Op! Sistem gagal mengambil dasar untuk peranti anda.</translation> <translation id="347785443197175480">Teruskan membenarkan <ph name="HOST" /> untuk mengakses kamera dan mikrofon anda</translation> <translation id="3478685642445675458">Sila buka kunci profil anda sebelum mengalih keluar seseorang.</translation> -<translation id="3479539252931486093">Adakah hal ini tidak dijangka? <ph name="BEGIN_LINK" />Beritahu kami<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Bukan sekarang</translation> <translation id="3481268647794498892">Membuka dalam <ph name="ALTERNATIVE_BROWSER_NAME" /> dalam masa <ph name="COUNTDOWN_SECONDS" /> saat</translation> <translation id="3484273680291419129">Mengalih keluar perisian berbahaya...</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware anda sudah boleh disediakan.</translation> <translation id="744341768939279100">Buat profil baharu</translation> <translation id="7443806024147773267">Akses kata laluan anda pada bila-bila masa anda log masuk ke Akaun Google anda</translation> -<translation id="7444046173054089907">Tapak ini disekat</translation> <translation id="7444983668544353857">Lumpuhkan <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Memasang apl secara automatik</translation> <translation id="7450761244949417357">Membuka dalam <ph name="ALTERNATIVE_BROWSER_NAME" /> sekarang</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index d8683a7..311267ab 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1759,7 +1759,6 @@ <translation id="347670947055184738">စနစ်သည် သင့်စက်ပစ္စည်းအတွက် မူဝါဒကို ရယူခြင်း မအောင်မြင်ပါ။</translation> <translation id="347785443197175480"><ph name="HOST" />အား သင်၏ ကင်မရာ နှင့် မိုက်ခရိုဖုန်းကို ရယူသုံးမှု ဆက်ခွင့်ပြုရန်</translation> <translation id="3478685642445675458">လူတစ်ဦးကို ဖယ်ရှားခြင်းမပြုမီ သင့်ပရိုဖိုင်ကို လော့ခ်ဖြုတ်ပါ။</translation> -<translation id="3479539252931486093">မမျှော်လင့်ထားဘူးလား။ <ph name="BEGIN_LINK" />ကျွန်ုပ်တို့ကို အသိပေးပါ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ယခု မလို</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> ကို <ph name="COUNTDOWN_SECONDS" /> စက္ကန့်အကြာတွင် ဖွင့်ပါမည်</translation> <translation id="3484273680291419129">အန္တရာယ်ဖြစ်စေနိုင်သော ဆော့ဖ်ဝဲများကို ဖယ်ရှားနေပါသည်...</translation> @@ -4488,7 +4487,6 @@ <translation id="7442465037756169001">သင်၏ Hangouts Meet စက်ကို စနစ်ထည့်သွင်းရန် အဆင်သင့် ဖြစ်နေပါပြီ။</translation> <translation id="744341768939279100">ပရိုဖိုင် အသစ်ကို ဖန်တီးရန်</translation> <translation id="7443806024147773267">သင်၏ Google အကောင့်သို့ လက်မှတ်ထိုးဝင်သည့်အခါတိုင်း သင့်စကားဝှက်များကို အသုံးပြုနိုင်သည်</translation> -<translation id="7444046173054089907">ဤဆိုက်ကို ပိတ်ဆို့ထားပါသည်</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ပိတ်</translation> <translation id="7448430327655618736">အက်ပ်များကို အလိုအလျောက် ထည့်သွင်းနိုင်သည်</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> တွင် ယခု ဖွင့်ပါမည်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 6443955..b8a8449 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1747,7 +1747,6 @@ <translation id="347670947055184738">हत्तेरिका! प्रणालीले तपाईंको यन्त्रको नीति प्राप्त गर्न सकेन।</translation> <translation id="347785443197175480"><ph name="HOST" /> लाई तपाइँको क्यामेरा र माइक्रोफोन पहुँच गर्न अनुमति दिन जारी राख्नुहोस्</translation> <translation id="3478685642445675458">कृपया कुनै व्यक्तिलाई हटाउनु अघि आफ्नो प्रोफाइललाई अनलक गर्नुहोस्।</translation> -<translation id="3479539252931486093">यो अप्रत्याशित थियो? <ph name="BEGIN_LINK" /> हामीलाई थाहा दिनुहोस् <ph name="END_LINK" /></translation> <translation id="3479552764303398839">अहिले होइन</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> सेकेन्डमा <ph name="ALTERNATIVE_BROWSER_NAME" /> खोलिँदै</translation> <translation id="3484273680291419129">हानिकारक सफ्टवेयर हटाउँदै...</translation> @@ -4463,7 +4462,6 @@ <translation id="7442465037756169001">तपाईंको Hangouts Meet हार्डवेयर सेटअपका लागि तयार छ।</translation> <translation id="744341768939279100">एउटा नयाँ प्रोफाइल बनाउनुहोस्</translation> <translation id="7443806024147773267">आफ्नो Google खातामा साइन इन हुने बित्तिकै आफ्ना पासवर्डमाथिको पहुँच प्राप्त गर्नुहोस्</translation> -<translation id="7444046173054089907">यो साइटमाथि रोक लगाइएको छ</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> लाई अक्षम बनाउनुहोस्</translation> <translation id="7448430327655618736">अनुप्रयोगहरू स्वतः स्थापना गर्नुहोस्</translation> <translation id="7450761244949417357">अहिले <ph name="ALTERNATIVE_BROWSER_NAME" /> मा खोलिँदै</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index bcf576a..a03f3e2 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -565,7 +565,7 @@ <translation id="1776712937009046120">Gebruiker toevoegen</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> <translation id="1777310661937894236">Dit apparaat wordt beheerd door <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. - Klik op Volgende om door te gaan met inloggen op je <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-account.</translation> + Klik op Volgende om door te gaan met inloggen op je <ph name="BEGIN_BOLD" /><ph name="DOMAIN" />-account<ph name="END_BOLD" />.</translation> <translation id="1779652936965200207">Geef deze toegangscode op '<ph name="DEVICE_NAME" />' op:</translation> <translation id="1780152987505130652">Groep sluiten</translation> <translation id="1781291988450150470">Huidige pincode</translation> @@ -1046,7 +1046,7 @@ <translation id="2462724976360937186">Sleutel-ID van certificeringsinstantie</translation> <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> toegevoegd</translation> <translation id="2464089476039395325">HTTP-proxy</translation> -<translation id="2467267713099745100"><ph name="NETWORK_TYPE" />-netwerk, uitgeschakeld</translation> +<translation id="2467267713099745100">Netwerk: <ph name="NETWORK_TYPE" />, uitgeschakeld</translation> <translation id="2468205691404969808">Maakt gebruik van cookies om je voorkeuren te onthouden, zelfs als je deze pagina's niet bezoekt</translation> <translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469259292033957819">Je hebt geen opgeslagen printers.</translation> @@ -1428,7 +1428,7 @@ <translation id="2972581237482394796">&Opnieuw</translation> <translation id="2973324205039581528">Geluid van site dempen</translation> <translation id="2977480621796371840">Uit groep verwijderen</translation> -<translation id="2979520980928493164">Zorg dat Chrome gezonder en beter functioneert</translation> +<translation id="2979520980928493164">Zorg dat Chrome beter functioneert</translation> <translation id="2979639724566107830">Openen in nieuw venster</translation> <translation id="2981113813906970160">Grote muisaanwijzer weergeven</translation> <translation id="2982970937345031">Anoniem melden</translation> @@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Het systeem kan het beleid voor je apparaat niet ophalen.</translation> <translation id="347785443197175480"><ph name="HOST" /> toegang blijven geven tot je camera en microfoon</translation> <translation id="3478685642445675458">Ontgrendel je profiel voordat je een persoon verwijdert.</translation> -<translation id="3479539252931486093">Wat dit onverwacht? <ph name="BEGIN_LINK" />Laat het ons weten<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Niet nu</translation> <translation id="3481268647794498892">Wordt geopend in <ph name="ALTERNATIVE_BROWSER_NAME" /> over <ph name="COUNTDOWN_SECONDS" /> seconden</translation> <translation id="3484273680291419129">Schadelijke software verwijderen...</translation> @@ -2084,7 +2083,7 @@ <translation id="389589731200570180">Delen met gasten</translation> <translation id="389901847090970821">Toetsenbord selecteren</translation> <translation id="3899879303189199559">Langer dan een jaar offline</translation> -<translation id="3900789207771372462">Sommige extensies kunnen je browse-activiteit bekijken, inclusief persoonlijke informatie.</translation> +<translation id="3900789207771372462">Sommige extensies kunnen je browse-activiteit bekijken, waaronder persoonlijke informatie.</translation> <translation id="3900966090527141178">Wachtwoorden exporteren</translation> <translation id="3901991538546252627">Verbinding maken met <ph name="NAME" /></translation> <translation id="3905761538810670789">App repareren</translation> @@ -2512,7 +2511,7 @@ <translation id="4549791035683739768">Je beveiligingssleutel heeft geen opgeslagen vingerafdrukken</translation> <translation id="4551763574344810652">Druk op <ph name="MODIFIER_KEY_DESCRIPTION" /> om dit ongedaan te maken</translation> <translation id="4552089082226364758">Flash</translation> -<translation id="4552759165874948005"><ph name="NETWORK_TYPE" /> netwerk, signaalsterkte <ph name="SIGNAL_STRENGTH" />%</translation> +<translation id="4552759165874948005">Netwerk: <ph name="NETWORK_TYPE" />, signaalsterkte: <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">Externe uitbreiding heeft dezelfde of een lagere versie dan de bestaande.</translation> <translation id="4555769855065597957">Schaduw</translation> <translation id="4555863373929230635">Log in en schakel synchronisatie in om wachtwoorden op te slaan in je Google-account.</translation> @@ -3539,7 +3538,7 @@ <translation id="6053401458108962351">&Browsegegevens wissen</translation> <translation id="6055171183283175969">Het opgegeven wachtwoord is onjuist.</translation> <translation id="6055392876709372977">PKCS nr. 1 SHA-256 met RSA-encryptie</translation> -<translation id="6055907707645252013"><ph name="NETWORK_TYPE" /> netwerk, niet verbonden</translation> +<translation id="6055907707645252013">Netwerk: <ph name="NETWORK_TYPE" />, niet verbonden</translation> <translation id="6056710589053485679">Normaal opnieuw laden</translation> <translation id="6057381398996433816">Deze site mag je bewegings- en lichtsensoren niet gebruiken.</translation> <translation id="6058567592298841668">Plug-in voor virtuele machine: <ph name="PLUGIN_VM_NAME" /></translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Je Hangouts Meet-hardware kan worden ingesteld.</translation> <translation id="744341768939279100">Een nieuw profiel maken</translation> <translation id="7443806024147773267">Toegang tot je wachtwoorden telkens wanneer je bent ingelogd op je Google-account</translation> -<translation id="7444046173054089907">Deze site is geblokkeerd</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> uitschakelen</translation> <translation id="7448430327655618736">Apps automatisch installeren</translation> <translation id="7450761244949417357">Wordt nu geopend in <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5184,7 +5182,7 @@ <translation id="8400146488506985033">Mensen beheren</translation> <translation id="8401432541486058167">Geef de pincode op die hoort bij je smartkaart.</translation> <translation id="8405046151008197676">Ontvang de hoogtepunten van de nieuwste update</translation> -<translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> netwerk, verbinden</translation> +<translation id="8408068190360279472">Netwerk: <ph name="NETWORK_TYPE" />, verbinden</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Eerst vragen (aanbevolen)</translation> <translation id="8418445294933751433">Weergeven al&s tabblad</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 3bc6c7b..be3d4ff 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Denne siden svarer ikke</translation> <translation id="1041263367839475438">Tilgjengelige enheter</translation> <translation id="1042174272890264476">Datamaskinen din har <ph name="SHORT_PRODUCT_NAME" />s RLZ-bibliotek innebygget. RLZ tildeler en ikke-unik, ikke-personlig tagg for å måle søk og <ph name="SHORT_PRODUCT_NAME" />-bruk drevet av en bestemt markedsføringskampanje. Disse etikettene vises noen ganger i Google-søk i <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Vil du også slette data fra disse appene?</translation> <translation id="1045692658517323508">{0,plural, =1{Oppdater innen 1 minutt}other{Oppdater innen # minutter}}</translation> <translation id="1046635659603195359">Det ser ut til at du allerede har konfigurert Voice Match med Google-assistenten din på en annen enhet. Disse tidligere opptakene kan brukes til å lage en stemmemodell på denne enheten. Dette burde ta mindre enn ett minutt.</translation> <translation id="1047431265488717055">Kopiér linkte&kst</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Få Googles smarte funksjoner i Chrome</translation> <translation id="1147991416141538220">For å be om tilgang, kontakt administratoren for denne enheten.</translation> <translation id="1149401351239820326">Utløpsmåned</translation> +<translation id="1150490752229770117">Dette er den siste automatiske programvare- og sikkerhetsoppdateringen for denne <ph name="DEVICE_TYPE" />-enheten. For å få fremtidige oppdateringer, oppgrader til en nyere modell. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Solbriller</translation> <translation id="1151917987301063366">Tillat alltid <ph name="HOST" /> å bruke sensorene</translation> <translation id="1153356358378277386">Tilkoblede enheter</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Velg en sak som skal brukes til autentisering. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Få dette passordet på iPhonen din</translation> <translation id="1712552549805331520"><ph name="URL" /> ber om å lagre data permanent på datamaskinen din</translation> +<translation id="1714644264617423774">Aktivér tilgjengelighetsfunksjoner for å gjøre enheten din enklere å bruke. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Bevegelsessensorer</translation> +<translation id="171824261579749339">Australsk <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Siste time</translation> <translation id="1719312230114180055">Merk: Det kan være mindre sikkert å bruke fingeravtrykk enn et sterkt passord eller en sterk PIN-kode.</translation> <translation id="1720318856472900922">Autentisering av tjeneren TLS WWW</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Slett informasjonskapsler fra tredjeparter</translation> <translation id="2097372108957554726">Du må logge på Chrome for å registrere nye enheter</translation> <translation id="2099172618127234427">Du er i ferd med å slå på Chrome OS-feilsøkingsfunksjoner som kommer til å konfigurere sshd daemon og muliggjøre oppstart fra USB-stasjoner.</translation> +<translation id="2099625543891475722">fysiske kjennetegn, som hvor høy du er</translation> <translation id="2099686503067610784">Slette tjenersertifikatet «<ph name="CERTIFICATE_NAME" />»?</translation> <translation id="2100273922101894616">Automatisk pålogging</translation> <translation id="2101225219012730419">Versjon:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Opprett en ny profil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ønsker å bekrefte identiteten din</translation> <translation id="2448312741937722512">Type</translation> +<translation id="2448734521821581858">Informasjonskapsler er filer som opprettes av nettsteder du besøker. Det finnes to typer informasjonskapsler: Informasjonskapsler fra førstetilbyder opprettes av nettstedet du besøker. Nettstedet vises i adressefeltet. Informasjonskapsler fra tredjeparter opprettes av andre nettsteder. Disse nettstedene eier noe av innholdet, for eksempel annonser eller bilder, som du ser på nettstedet du besøker.</translation> <translation id="2450223707519584812">Du kan ikke legge til brukere fordi Google API-nøkler mangler. Se <ph name="DETAILS_URL" /> for nærmere informasjon.</translation> <translation id="2450849356604136918">Ingen aktive visninger</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Tidsavbrutt</translation> <translation id="2588636910004461974">Enheter fra <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Søk på Google, eller skriv inn en nettadresse</translation> +<translation id="2600522410036850735">Denne enheten får automatiske programvare- og sikkerhetsoppdateringer frem til <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Finn ut mer</a></translation> <translation id="2603115962224169880">Rydd opp i datamaskinen</translation> <translation id="2603463522847370204">Åpne i &inkognitovindu</translation> <translation id="2604255671529671813">Feil i nettverkstilkobling</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">Safe Browsing (beskytter deg og enheten din mot farlige nettsteder)</translation> <translation id="3182749001423093222">Stavekontroll</translation> <translation id="3183139917765991655">Profile Importer</translation> +<translation id="3184536091884214176">Konfigurer eller administrer CUPS-skrivere. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Mine filer</translation> <translation id="3188465121994729530">Glidende gjennomsnitt</translation> <translation id="3190558889382726167">Passordet er lagret</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">Beklager. Systemet kunne ikke hente reglene for enheten din.</translation> <translation id="347785443197175480">Fortsett å gi <ph name="HOST" /> tillatelse til å bruke kameraet og mikrofonen</translation> <translation id="3478685642445675458">Du må låse opp profilen din før du kan fjerne en person.</translation> -<translation id="3479539252931486093">Var dette uventet? <ph name="BEGIN_LINK" />Si fra til oss<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ikke nå</translation> <translation id="3481268647794498892">Åpnes i <ph name="ALTERNATIVE_BROWSER_NAME" /> om <ph name="COUNTDOWN_SECONDS" /> sekunder</translation> <translation id="3484273680291419129">Fjerner den skadelige programvaren …</translation> @@ -2252,6 +2259,7 @@ <translation id="4138267921960073861">Vis brukernavn og bilder på påloggingsskjermen</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-enhet er tilkoblet</translation> <translation id="4142052906269098341">Lås opp <ph name="DEVICE_TYPE" /> med telefonen. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Lagre skriverne som ble oppdaget, i profilen din, eller legg til en ny skriver. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Få video med bedre kvalitet og spar batteri. Videoen spilles kun av på den Cast-kompatible skjermen.</translation> <translation id="4146026355784316281">Åpne alltid med systemvisningsprogrammet</translation> <translation id="4146785383423576110">Tilbakestill og rydd opp</translation> @@ -2376,6 +2384,7 @@ <translation id="4364327530094270451">Melon</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindu.</translation> <translation id="4364830672918311045">Vis varsler</translation> +<translation id="436499142539576997">Kunne ikke hente appdata – prøver fremdeles å kjøre appen …</translation> <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation> <translation id="437184764829821926">Avanserte innstillinger for skrifttype</translation> <translation id="4374831787438678295">Linux-installasjonsprogram</translation> @@ -2566,6 +2575,7 @@ <translation id="465878909996028221">Bare protokollene http, https og file støttes for viderekobling av nettleseren.</translation> <translation id="4659077111144409915">Primærkonto</translation> <translation id="4660476621274971848">Den forventede versjonen var «<ph name="EXPECTED_VERSION" />», men den faktiske versjonen var «<ph name="NEW_ID" />»</translation> +<translation id="4660838440047236328">hvordan rommet ditt ser ut</translation> <translation id="4662788913887017617">Del dette bokmerket med iPhone</translation> <translation id="4663373278480897665">Kameraet er tillatt</translation> <translation id="4664482161435122549">Eksportfeil for PKCS #12</translation> @@ -2729,6 +2739,7 @@ <translation id="4900392736118574277">Oppstartssiden er endret til <ph name="URL" />.</translation> <translation id="4902546322522096650">Nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" /> – <ph name="NETWORK_NAME" /> – <ph name="SECURITY_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> % – koble til</translation> <translation id="49027928311173603">Innstillingene som ble lastet ned fra tjeneren er ugyldige: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Konfigurer eller administrer delte nettverksressurser. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Denne filen lastes sjelden ned, og den kan være farlig.</translation> <translation id="4907306957610201395">Tillatelseskategori</translation> <translation id="4908811072292128752">Åpne en ny fane for å surfe på to nettsteder samtidig</translation> @@ -2816,6 +2827,7 @@ <translation id="5038863510258510803">Aktiverer …</translation> <translation id="5039804452771397117">Tillat</translation> <translation id="5042282098504489593">Åpne Innstillinger for å koble <ph name="USB_DEVICE_NAME" /> til Linux</translation> +<translation id="5043913660911154449">Eller angi PPD for skriveren <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Feil passord</translation> <translation id="504561833207953641">Åpner i den eksisterende nettleserøkten.</translation> <translation id="5047421709274785093">Blokkér nettsteder fra å bruke bevegelses- og lyssensorer</translation> @@ -3101,6 +3113,7 @@ <translation id="5464660706533281090">Denne innstillingen kan ikke endres av en barnebruker.</translation> <translation id="5466374726908360271">&Lim inn og søk etter «<ph name="SEARCH_TERMS" />»</translation> <translation id="5468173180030470402">Ser etter delte nettverksressurser</translation> +<translation id="5470735824776589490">En omstart er nødvendig før enheten din kan tilbakestilles med Powerwash. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Heisann! Jeg er tekst til tale-stemmen din.</translation> <translation id="5472133193607270166">Når dette er påslått, kan ikke nettsteder bruke nettleseraktiviteten din fra ulike nettsteder for å vise deg personlig tilpassede annonser. Noen nettsteder fungerer kanskje ikke som de skal.</translation> <translation id="5473333559083690127">Skriv inn den nye PIN-koden på nytt</translation> @@ -3124,6 +3137,7 @@ <translation id="5496587651328244253">Organiser</translation> <translation id="5499313591153584299">Denne filen kan være skadelig for datamaskinen din.</translation> <translation id="5502500733115278303">Importert fra Firefox</translation> +<translation id="5505264765875738116">Nettsteder kan ikke be om å få sende varsler</translation> <translation id="5505307013568720083">Tom for blekk</translation> <translation id="5507756662695126555">Ikke-avvisning</translation> <translation id="5509693895992845810">L&agre som</translation> @@ -3338,6 +3352,7 @@ <translation id="5801568494490449797">Innstillinger</translation> <translation id="5804175651771201311">Roaming er av</translation> <translation id="5804241973901381774">Tillatelser</translation> +<translation id="5804427196348435412">Bruk NFC-enheter</translation> <translation id="5805697420284793859">Window Manager</translation> <translation id="5806773519584576205">0° (standard)</translation> <translation id="5811750797187914944">Ferdig</translation> @@ -3553,6 +3568,7 @@ <translation id="6096047740730590436">Maksimer ved åpning</translation> <translation id="6096326118418049043">X.500 navn</translation> <translation id="6097480669505687979">Hvis du ikke frigjør lagringsplass, kan det hende brukere og data blir fjernet automatisk.</translation> +<translation id="6097600385983390082">Talesøket er lukket</translation> <translation id="6098793583803863900">En ukjent fil gjennomsøkes for farlig innhold.</translation> <translation id="6100736666660498114">Start-menyen</translation> <translation id="6101226222197207147">Ny app lagt til (<ph name="EXTENSION_NAME" />)</translation> @@ -3648,6 +3664,7 @@ <translation id="6233154960150021497">Bruk stemme i stedet for tastatur som standard</translation> <translation id="6234474535228214774">Venter på installering</translation> <translation id="6237816943013845465">Lar deg justere skjermoppløsningen</translation> +<translation id="6238624845858322552">Koble til Bluetooth-enhet</translation> <translation id="6238767809035845642">Tekst er delt fra en annen enhet</translation> <translation id="6238923052227198598">Hold det siste notatet på låseskjermen</translation> <translation id="6239558157302047471">Last inn &rammen på nytt</translation> @@ -3674,6 +3691,7 @@ <translation id="6267547857941397424">Nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" /> – <ph name="PHONE_NAME" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> % – telefonbatterinivå <ph name="BATTERY_STATUS" /> % – koble til</translation> <translation id="6268252012308737255">Åpne med <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Nettsteder kan be om å få sende deg varsler</translation> <translation id="6270770586500173387">Send <ph name="BEGIN_LINK1" />system- og appinformasjon<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />beregninger<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Det oppsto en feil (<ph name="ERROR" />) under nedlasting av programtillegget</translation> <translation id="6273677812470008672">Kvalitet</translation> @@ -3695,6 +3713,7 @@ <translation id="629730747756840877">Konto</translation> <translation id="6298962879096096191">Bruk Google Play til å installere Android-apper</translation> <translation id="630065524203833229">&Avslutt</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> kunne ikke konfigureres automatisk. Angi avanserte detaljer om skriveren. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globale retningslinjer:</translation> <translation id="6307990684951724544">Systemet er opptatt</translation> <translation id="6308493641021088955">Påloggingen leveres av <ph name="EXTENSION_NAME" /></translation> @@ -3864,6 +3883,7 @@ <translation id="6555810572223193255">Opprydning er utilgjengelig for øyeblikket</translation> <translation id="6556866813142980365">Gjør om</translation> <translation id="6557290421156335491">Mine snarveier</translation> +<translation id="6561560012278703671">Bruk stillere meldinger (blokkerer varselmeldinger fra å forstyrre deg)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Filbanen- eller -navnet er for langt. Lagre med et annet navn eller på et annet sted.</translation> <translation id="6563469144985748109">Administratoren din har ikke godkjent det ennå</translation> @@ -4047,6 +4067,7 @@ <translation id="6840155290835956714">Spør før noe sendes</translation> <translation id="6840184929775541289">Er ikke en sertifiseringsinstans</translation> <translation id="6841186874966388268">Feil</translation> +<translation id="6843267103192918276">Logg på for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker. I tillegg blir du automatisk logget på Google-tjenestene dine. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google er konfigurert</translation> <translation id="6845038076637626672">Maksimer ved åpning</translation> <translation id="6845325883481699275">Bidra til å gjøre Chrome sikrere</translation> @@ -4463,7 +4484,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware er klar til å konfigureres.</translation> <translation id="744341768939279100">Opprett en ny profil</translation> <translation id="7443806024147773267">Få tilgang til passordene dine når du er logget på Google-kontoen</translation> -<translation id="7444046173054089907">Dette nettstedet er blokkert</translation> <translation id="7444983668544353857">Slå av <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installer apper automatisk</translation> <translation id="7450761244949417357">Åpnes i <ph name="ALTERNATIVE_BROWSER_NAME" /> nå</translation> @@ -5028,6 +5048,7 @@ <translation id="8214962590150211830">Fjern denne personen</translation> <translation id="8215295261562449873">Sikkerhetskopiér appene og filene mine i Nedlastinger-mappen før Linux oppgraderes.</translation> <translation id="8217399928341212914">Fortsett blokkeringen av automatisk nedlasting av flere filer</translation> +<translation id="8218847192766059983">Legg til språk, eller endre rekkefølgen på listen. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Du blokkerer vanligvis varsler. For å la dette nettstedet varsle deg, klikk her.</translation> <translation id="8225265270453771718">Del et programvindu</translation> <translation id="8225753906568652947">Løs inn tilbudene dine</translation> @@ -5641,6 +5662,7 @@ <translation id="9065203028668620118">Endre</translation> <translation id="9066773882585798925">Få tekst lest opp</translation> <translation id="9066782832737749352">Tekst til tale</translation> +<translation id="9067559831321817373">Administrer de påloggede kontoene dine. Nettsteder, apper og utvidelser i Chrome og Google Play kan bruke disse kontoene til å tilpasse opplevelsen din, avhengig av tillatelser. <a>Finn ut mer</a></translation> <translation id="9068849894565669697">Velg farge</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 36c33bb..8a0a2aa 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1744,7 +1744,6 @@ <translation id="347670947055184738">ଓହୋଃ! ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ନୀତି ଆଣିବାକୁ ବିଫଳ ହେଲା।</translation> <translation id="347785443197175480"><ph name="HOST" />କୁ ଆପଣଙ୍କର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେବା ଜାରି ରଖନ୍ତୁ</translation> <translation id="3478685642445675458">ଜଣେ ବ୍ୟକ୍ତିଙ୍କୁ କାଢ଼ି ଦେବା ପୂର୍ବରୁ ଦୟାକରି ଆପଣଙ୍କର ପ୍ରୋଫାଇଲ୍କୁ ଅନ୍ଲକ୍ କରନ୍ତୁ।</translation> -<translation id="3479539252931486093">ଏହା ଅପ୍ରତ୍ୟାଶିତ ଥିଲା କି? <ph name="BEGIN_LINK" />ଆସନ୍ତୁ ଜାଣିବା<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ଏବେ ନୁହେଁ</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" />ରେ <ph name="COUNTDOWN_SECONDS" />ରେ ଖୋଲୁଛି</translation> <translation id="3484273680291419129">କ୍ଷତିକାରକ ସଫ୍ଟୱେର୍ କାଢୁଛି...</translation> @@ -4463,7 +4462,6 @@ <translation id="7442465037756169001">ଆପଣଙ୍କର Hangouts Meetର ହାର୍ଡୱେର୍ ସେଟ୍ଅପ୍ ହେବାକୁ ପ୍ରସ୍ତୁତ ଅଛି।</translation> <translation id="744341768939279100">ଗୋଟିଏ ନୂଆ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରନ୍ତୁ</translation> <translation id="7443806024147773267">ଯେତେବେଳେ ଆପଣ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ସାଇନ୍ ଇନ୍ କରିଥିବା ସମୟରେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> -<translation id="7444046173054089907">ଏହି ସାଇଟ୍କୁ ବ୍ଲକ୍ କରାଯାଇଛି</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />କୁ ଅକ୍ଷମ କରନ୍ତୁ</translation> <translation id="7448430327655618736">ସ୍ୱଚାଳିତ ଭାବେ ଆପ୍ସ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="7450761244949417357">ବର୍ତ୍ତମାନ <ph name="ALTERNATIVE_BROWSER_NAME" />ରେ ଖୋଲୁଛି</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 86887a00..cf236e3 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">ਇਹ ਪੰਨਾ ਪ੍ਰਤਿਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ</translation> <translation id="1041263367839475438">ਉਪਲਬਧ ਡੀਵਾਈਸਾਂ</translation> <translation id="1042174272890264476">ਤੁਹਾਡਾ ਕੰਪਿਊਟਰ ਵੀ <ph name="SHORT_PRODUCT_NAME" /> ਦੀ RLZ ਲਾਇਬ੍ਰੇਰੀ ਬਿਲਟ ਇਨ ਤੋਂ ਆਉਂਦਾ ਹੈ। RLZ ਖੋਜਾਂ ਅਤੇ ਇੱਕ ਖ਼ਾਸ ਪ੍ਰਚਾਰ ਮੁਹਿੰਮ ਵੱਲੋਂ ਕੀਤੀ ਗਈ <ph name="SHORT_PRODUCT_NAME" /> ਵਰਤੋਂ ਦਾ ਹਿਸਾਬ ਲਗਾਉਣ ਲਈ ਇੱਕ ਗ਼ੈਰ-ਬੇਜੋੜ, ਗ਼ੈਰ-ਨਿੱਜੀ ਪਛਾਣਯੋਗ ਟੈਗ ਅਸਾਈਨ ਕਰਦਾ ਹੈ। ਇਹ ਲੇਬਲ ਕਦੇ-ਕਦਾਈਂ <ph name="PRODUCT_NAME" /> ਵਿੱਚ Google ਖੋਜ ਪੁੱਛਗਿੱਛਾਂ ਵਿੱਚ ਪ੍ਰਗਟ ਹੁੰਦੇ ਹਨ।</translation> +<translation id="1043818413152647937">ਕੀ ਇਹਨਾਂ ਐਪਾਂ ਤੋਂ ਵੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation> <translation id="1045692658517323508">{0,plural, =1{1 ਮਿੰਟ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}one{# ਮਿੰਟ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}other{# ਮਿੰਟਾਂ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}}</translation> <translation id="1046635659603195359">ਇੰਝ ਲੱਗਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਆਪਣੀ 'Google ਅਸਿਸਟੈਂਟ' ਨਾਲ ਪਹਿਲਾਂ ਹੀ Voice Match ਦਾ ਸੈੱਟਅੱਪ ਕਰ ਲਿਆ ਹੈ। ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਇਹਨਾਂ ਪਿਛਲੀਆਂ ਰਿਕਾਰਡਿੰਗਾਂ ਨੂੰ ਅਵਾਜ਼ੀ ਮਾਡਲ ਬਣਾਉਣ ਲਈ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਸਮਾਂ ਲੱਗਣਾ ਚਾਹੀਦਾ ਹੈ।</translation> <translation id="1047431265488717055">ਕਾਪੀ ਲਿੰਕ ਲਿ&ਖਤ</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome ਵਿੱਚ Google ਸਮਾਰਟ ਲਓ</translation> <translation id="1147991416141538220">ਪਹੁੰਚ ਦੀ ਬੇਨਤੀ ਕਰਨ ਲਈ, ਇਸ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="1149401351239820326">ਮਿਆਦ ਸਮਾਪਤੀ ਦਾ ਮਹੀਨਾ</translation> +<translation id="1150490752229770117">ਇਹ ਇਸ <ph name="DEVICE_TYPE" /> ਲਈ ਆਖਰੀ ਸਵੈਚਲਿਤ ਸਾਫ਼ਟਵੇਅਰ ਅਤੇ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਹੈ। ਭਵਿੱਖ ਵਿੱਚ ਅੱਪਡੇਟਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਨਵੇਂ ਮਾਡਲ 'ਤੇ ਅੱਪਗ੍ਰੇਡ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1150565364351027703">ਧੁੱਪ ਦੀਆਂ ਐਨਕਾਂ</translation> <translation id="1151917987301063366"><ph name="HOST" /> ਨੂੰ ਸੈਂਸਰਾਂ ਤੱਕ ਹਮੇਸ਼ਾਂ ਪਹੁੰਚ ਕਰਨ ਦਿਓ</translation> <translation id="1153356358378277386">ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">ਪ੍ਰਮਾਣੀਕਰਨ ਵਰਤਣ ਲਈ ਟਿਕਟ ਚੁਣੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1712349894969001173">ਇਹ ਪਾਸਵਰਡ ਆਪਣੇ iPhone 'ਤੇ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="1712552549805331520"><ph name="URL" /> ਦੀ ਤੁਹਾਡੇ ਸਥਾਨਕ ਕੰਪਿਊਟਰ 'ਤੇ ਸਥਾਈ ਤੌਰ 'ਤੇ ਡਾਟਾ ਸਟੋਰ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ</translation> +<translation id="1714644264617423774">ਆਪਣੇ ਡੀਵਾਈਸ ਦੀ ਆਸਾਨੀ ਨਾਲ ਵਰਤੋਂ ਕਰਨ ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1717218214683051432">ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰ</translation> +<translation id="171824261579749339">ਆਸਟ੍ਰੇਲੀਆਈ <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="1718835860248848330">ਪਿਛਲਾ ਘੰਟਾ</translation> <translation id="1719312230114180055">ਨੋਟ ਕਥਨ: ਤੁਹਾਡਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਇੱਕ ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਜਾਂ PIN ਦੇ ਮੁਕਾਬਲੇ ਘੱਟ ਰੱਖਿਅਤ ਹੋ ਸਕਦਾ ਹੈ।</translation> <translation id="1720318856472900922">TLS WWW ਸਰਵਰ ਪ੍ਰਮਾਣੀਕਰਨ</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="2097372108957554726">ਤੁਹਾਨੂੰ ਨਵੇਂ ਡੀਵਾਈਸਾਂ ਨੂੰ ਰਜਿਸਟਰ ਕਰਨ ਲਈ Chrome 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="2099172618127234427">ਤੁਸੀਂ Chrome OS ਡੀਬੱਗਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰ ਰਹੇ ਹੋ, ਜੋ sshd daemon ਨੂੰ ਸੈੱਟ ਕਰਨਗੀਆਂ ਅਤੇ USB ਡਰਾਈਵ ਵਿੱਚੋਂ ਬੂਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨਗੀਆਂ।</translation> +<translation id="2099625543891475722">ਤੁਹਾਡੀਆਂ ਸਰੀਰਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ, ਜਿਵੇਂ ਕਿ ਲੰਬਾਈ</translation> <translation id="2099686503067610784">ਕੀ ਸਰਵਰ ਪ੍ਰਮਾਣ-ਪੱਤਰ "<ph name="CERTIFICATE_NAME" />" ਮਿਟਾਉਣਾ ਹੈ?</translation> <translation id="2100273922101894616">ਸਵੈਚਲਿਤ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="2101225219012730419">ਵਰਜਨ:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">ਇੱਕ ਨਵਾਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾਓ</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ਦੀ ਤੁਹਾਡੀ ਪਛਾਣ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ</translation> <translation id="2448312741937722512">ਟਾਈਪ ਕਰੋ</translation> +<translation id="2448734521821581858">ਕੁਕੀਜ਼ ਉਹ ਫ਼ਾਈਲਾਂ ਹਨ ਜੋ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਦੁਆਰਾ ਬਣਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਕੁਕੀਜ਼ ਦੋ ਕਿਸਮ ਦੀਆਂ ਹੁੰਦੀਆਂ ਹਨ: ਪਹਿਲੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀ ਸਾਈਟ ਦੁਆਰਾ ਬਣਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਸਾਈਟ ਪਤਾ ਬਾਰ 'ਤੇ ਦਿਖਾਈ ਜਾਂਦੀ ਹੈ। ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਹੋਰ ਸਾਈਟਾਂ ਦੁਆਰਾ ਬਣਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਇਹ ਸਾਈਟਾਂ ਵਿਗਿਆਪਨਾਂ ਜਾਂ ਚਿੱਤਰਾਂ ਵਰਗੀ ਕੁਝ ਸਮੱਗਰੀ ਦੀਆਂ ਮਾਲਕ ਹੁੰਦੀਆਂ ਹਨ, ਜੋ ਤੁਸੀਂ ਵੈੱਬਸਾਈਟ 'ਤੇ ਦੇਖਦੇ ਹੋ।</translation> <translation id="2450223707519584812">ਤੁਸੀਂ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਨਹੀਂ ਸ਼ਾਮਲ ਕਰ ਸਕੋਗੇ ਕਿਉਂਕਿ Google API ਕੁੰਜੀਆਂ ਮੌਜੂਦ ਨਹੀਂ ਹਨ। ਵੇਰਵੇ ਲਈ <ph name="DETAILS_URL" /> ਦੇਖੋ।</translation> <translation id="2450849356604136918">ਕੋਈ ਕਿਰਿਆਸ਼ੀਲ ਝਾਕੇ ਨਹੀਂ</translation> <translation id="2451298179137331965">2x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> ਦੇ ਡੀਵਾਈਸ</translation> <translation id="2594999711683503743">Google ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> +<translation id="2600522410036850735">ਇਸ ਡੀਵਾਈਸ ਨੂੰ <ph name="MONTH_AND_YEAR" /> ਤੱਕ ਸਵੈਚਲਿਤ ਸਾਫ਼ਟਵੇਅਰ ਅਤੇ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਮਿਲਣਗੇ। <a target="_blank" href="<ph name="URL" />">ਹੋਰ ਜਾਣੋ</a></translation> <translation id="2603115962224169880">ਕੰਪਿਊਟਰ ਸਾਫ਼ ਕਰੋ</translation> <translation id="2603463522847370204">&ਗੁਮਨਾਮ window ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="2604255671529671813">ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਗੜਬੜ</translation> @@ -1558,6 +1565,7 @@ <translation id="3181954750937456830">ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ (ਖਤਰਨਾਕ ਸਾਈਟਾਂ ਤੋਂ ਤੁਹਾਡੀ ਅਤੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਸੁਰੱਖਿਆ ਕਰਦੀ ਹੈ)</translation> <translation id="3182749001423093222">ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ</translation> <translation id="3183139917765991655">ਪ੍ਰੋਫਾਈਲ ਆਯਾਤ ਕਰੋ</translation> +<translation id="3184536091884214176">CUPS ਪ੍ਰਿੰਟਰਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ ਜਾਂ ਪ੍ਰਬੰਧਿਤ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="3188257591659621405">ਮੇਰੀਆਂ ਫ਼ਾਈਲਾਂ</translation> <translation id="3188465121994729530">ਮੂਵ ਕਰਨ ਦੀ ਔਸਤ</translation> <translation id="3190558889382726167">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation> @@ -1748,7 +1756,6 @@ <translation id="347670947055184738">ਓਹੋ! ਸਿਸਟਮ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਲਈ ਨੀਤੀ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ।</translation> <translation id="347785443197175480"><ph name="HOST" /> ਨੂੰ ਆਪਣੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫੋਨ ਤੇ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣਾ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="3478685642445675458">ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਵਿਅਕਤੀ ਨੂੰ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣੇ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਣਲਾਕ ਕਰੋ।</translation> -<translation id="3479539252931486093">ਕੀ ਇਸ ਦੀ ਉਮੀਦ ਸੀ? <ph name="BEGIN_LINK" />ਸਾਨੂੰ ਦੱਸੋ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ਹੁਣ ਨਹੀਂ</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> ਸਕਿੰਟਾਂ ਤੱਕ <ph name="ALTERNATIVE_BROWSER_NAME" /> ਵਿੱਚ ਖੁੱਲ੍ਹ ਰਿਹਾ ਹੈ</translation> <translation id="3484273680291419129">ਹਾਨੀਕਾਰਕ ਸਾਫਟਵੇਅਰ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">ਸਾਈਨ-ਇਨ ਸਕ੍ਰੀਨ 'ਤੇ ਵਰਤੋਂਕਾਰ ਨਾਮਾਂ ਅਤੇ ਫ਼ੋਟੋਆਂ ਨੂੰ ਦਿਖਾਓ</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ</translation> <translation id="4142052906269098341">ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਆਪਣੇ ਫ਼ੋਨ ਨਾਲ ਅਣਲਾਕ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">ਪਛਾਣੇ ਗਏ ਪ੍ਰਿੰਟਰਾਂ ਨੂੰ ਆਪਣੇ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ ਜਾਂ ਕੋਈ ਨਵਾਂ ਪ੍ਰਿੰਟਰ ਸ਼ਾਮਲ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="4144218403971135344">ਬਿਹਤਰ ਕੁਆਲਿਟੀ ਦਾ ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਕੇ ਬੈਟਰੀ ਲਾਈਫ਼ ਬਚਾਓ। ਵੀਡੀਓ ਸਿਰਫ਼ ਤੁਹਾਡੀ Cast ਯੋਗ ਬਣਾਈ ਗਈ ਸਕ੍ਰੀਨ 'ਤੇ ਹੀ ਚਲਾਇਆ ਜਾਵੇਗਾ।</translation> <translation id="4146026355784316281">ਹਮੇਸ਼ਾਂ ਸਿਸਟਮ ਵਿਊਅਰ ਨਾਲ ਖੋਲ੍ਹੋ</translation> <translation id="4146785383423576110">ਰੀਸੈੱਟ ਕਰੋ ਅਤੇ ਸਾਫ਼ ਕਰੋ</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">ਖਰਬੂਜ਼ਾ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="4364830672918311045">ਡਿਸਪਲੇ ਸੂਚਨਾਵਾਂ</translation> +<translation id="436499142539576997">ਐਪ ਡਾਟਾ ਪ੍ਰਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ, ਹਾਲੇ ਵੀ ਐਪ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...</translation> <translation id="4370975561335139969">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਰਜ ਕੀਤਾ ਈਮੇਲ ਅਤੇ ਪਾਸਵਰਡ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ</translation> <translation id="437184764829821926">ਉੱਨਤ ਫੌਂਟ ਸੈਟਿੰਗਾਂ</translation> <translation id="4374831787438678295">Linux ਸਥਾਪਨਾਕਾਰ</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">ਬ੍ਰਾਊਜ਼ਰ ਰੀਡਾਇਰੈਕਟਾਂ ਲਈ ਸਿਰਫ਼ http, https ਅਤੇ ਫ਼ਾਈਲ ਪ੍ਰੋਟੋਕੋਲ ਸਮਰਥਿਤ ਹਨ।</translation> <translation id="4659077111144409915">ਮੁੱਖ ਖਾਤਾ</translation> <translation id="4660476621274971848">ਸੰਭਾਵਿਤ ਵਰਜਨ "<ph name="EXPECTED_VERSION" />" ਹੈ, ਪਰ ਵਰਜਨ "<ph name="NEW_ID" />" ਸੀ</translation> +<translation id="4660838440047236328">ਤੁਹਾਡੇ ਕਮਰੇ ਦਾ ਖਾਕਾ</translation> <translation id="4662788913887017617">ਆਪਣੇ iPhone ਨਾਲ ਇਸ ਬੁੱਕਮਾਰਕ ਨੂੰ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="4663373278480897665">ਕੈਮਰੇ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ</translation> <translation id="4664482161435122549">PKCS #12 ਨਿਰਯਾਤ ਗੜਬੜ</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">ਤੁਹਾਡਾ ਸ਼ੁਰੂਆਤੀ ਪੰਨਾ <ph name="URL" /> 'ਤੇ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਸੀ।</translation> <translation id="4902546322522096650">ਨੈੱਟਵਰਕ <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />%, ਕਨੈਕਟ</translation> <translation id="49027928311173603">ਸਰਵਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕੀਤੀ ਨੀਤੀ ਅਵੈਧ ਹੈ: <ph name="VALIDATION_ERROR" />।</translation> +<translation id="4906490889887219338">'ਨੈੱਟਵਰਕ ਫ਼ਾਈਲ ਸਾਂਝਾਕਰਨ' ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ ਜਾਂ ਪ੍ਰਬੰਧਨ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ਇਹ ਫ਼ਾਈਲ ਆਮ ਕਰਕੇ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਇਹ ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ।</translation> <translation id="4907306957610201395">ਇਜਾਜ਼ਤ ਸ਼੍ਰੇਣੀ</translation> <translation id="4908811072292128752">ਦੋ ਸਾਈਟਾਂ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਬ੍ਰਾਊਜ਼ ਕਰਨ ਲਈ ਕੋਈ ਨਵੀਂ ਟੈਬ ਖੋਲ੍ਹੋ</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">ਸਮਰੱਥ ਬਣਾ ਰਿਹਾ ਹੈ...</translation> <translation id="5039804452771397117">ਆਗਿਆ ਦਿਓ</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> ਨੂੰ Linux ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation> +<translation id="5043913660911154449">ਜਾਂ ਆਪਣਾ ਪ੍ਰਿੰਟਰ PPD ਨਿਰਧਾਰਤ ਕਰੋ <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5045550434625856497">ਗਲਤ ਪਾਸਵਰਡ</translation> <translation id="504561833207953641">ਮੌਜੂਦਾ ਬ੍ਰਾਊਜ਼ਰ ਸੈਸ਼ਨ ਵਿੱਚ ਖੋਲ੍ਹੀ ਜਾ ਰਹੀ ਹੈ।</translation> <translation id="5047421709274785093">ਸਾਈਟਾਂ ਨੂੰ ਮੋਸ਼ਨ ਅਤੇ ਲਾਈਟ ਸੈਂਸਰ ਵਰਤਣ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬੱਚਾ ਬਦਲ ਨਹੀਂ ਸਕਦਾ।</translation> <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” ਪੇਸਟ ਕਰਕੇ ਖੋਜੋ</translation> <translation id="5468173180030470402">ਫ਼ਾਈਲ ਸਾਂਝਾਕਰਨਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="5470735824776589490">ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨੂੰ ਪਾਵਰਵਾਸ਼ ਨਾਲ ਰੀਸੈਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ! ਮੈਂ ਤੁਹਾਡੀ ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਵਿੱਚ ਬਦਲੀ ਹੋਈ ਅਵਾਜ਼ ਹਾਂ।</translation> <translation id="5472133193607270166">ਚਾਲੂ ਹੋਣ 'ਤੇ, ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੀ ਵਰਤੋਂ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ। ਸ਼ਾਇਦ ਕੁਝ ਸਾਈਟਾਂ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ।</translation> <translation id="5473333559083690127">ਨਵਾਂ PIN ਮੁੜ-ਦਾਖਲ ਕਰੋ</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">ਪ੍ਰਬੰਧ ਕਰੋ</translation> <translation id="5499313591153584299">ਇਹ ਫ਼ਾਈਲ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਹਾਨੀਕਾਰਕ ਹੋ ਸਕਦੀ ਹੈ।</translation> <translation id="5502500733115278303">Firefox ਤੋਂ ਆਯਾਤ ਕੀਤਾ</translation> +<translation id="5505264765875738116">ਸਾਈਟਾਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਨਹੀਂ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="5505307013568720083">ਸਿਆਹੀ ਖਤਮ ਹੋਈ</translation> <translation id="5507756662695126555">ਗ਼ੈਰ-repudiation</translation> <translation id="5509693895992845810">ਇਸ ਵਜੋਂ &ਰੱਖਿਅਤ ਕਰੋ...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">ਤਰਜੀਹਾਂ</translation> <translation id="5804175651771201311">ਰੋਮਿੰਗ ਬੰਦ ਹੈ</translation> <translation id="5804241973901381774">ਅਨੁਮਤੀਆਂ</translation> +<translation id="5804427196348435412">NFC ਡੀਵਾਈਸ ਵਰਤੋ</translation> <translation id="5805697420284793859">Window ਪ੍ਰਬੰਧਕ</translation> <translation id="5806773519584576205">0° (ਪੂਰਵ-ਨਿਰਧਾਰਤ)</translation> <translation id="5811750797187914944">ਪੂਰੀ ਤਰ੍ਹਾਂ ਤਿਆਰ ਹੋ</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">ਅਧਿਕਤਮ ਕੀਤਾ ਖੋਲ੍ਹੋ</translation> <translation id="6096326118418049043">X.500 ਨਾਮ</translation> <translation id="6097480669505687979">ਜੇਕਰ ਤੁਸੀਂ ਜਗ੍ਹਾ ਖਾਲੀ ਨਹੀਂ ਕਰਦੇ, ਤਾਂ ਵਰਤੋਂਕਾਰਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਆਪਣੇ ਆਪ ਹਟਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।</translation> +<translation id="6097600385983390082">ਅਵਾਜ਼ੀ ਖੋਜ ਬੰਦ ਹੈ</translation> <translation id="6098793583803863900">ਕਿਸੇ ਅਗਿਆਤ ਫ਼ਾਈਲ ਨੂੰ ਖਤਰਨਾਕ ਸਮੱਗਰੀ ਲਈ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="6100736666660498114">ਸਟਾਰਟ ਮੀਨੂ</translation> <translation id="6101226222197207147">ਨਵੀਂ ਐਪ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">ਕੀ-ਬੋਰਡ ਦੀ ਬਜਾਏ ਅਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ</translation> <translation id="6234474535228214774">ਸਥਾਪਨਾ ਵਿਚਾਰ-ਅਧੀਨ ਹੈ</translation> <translation id="6237816943013845465">ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਿਵਸਥਿਤ ਕਰਨ ਦਿੰਦੀ ਹੈ</translation> +<translation id="6238624845858322552">ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ</translation> <translation id="6238767809035845642">ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ ਸਾਂਝੀ ਕੀਤੀ ਲਿਖਤ</translation> <translation id="6238923052227198598">ਨਵੀਨਤਮ ਨੋਟ-ਕਥਨ ਨੂੰ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਰੱਖੋ</translation> <translation id="6239558157302047471">&ਫ੍ਰੇਮ ਮੁੜ-ਲੋਡ ਕਰੋ</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">ਨੈੱਟਵਰਕ <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" />, <ph name="PHONE_NAME" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />%, ਫ਼ੋਨ ਦੀ ਬੈਟਰੀ <ph name="BATTERY_STATUS" />%, ਕਨੈਕਟ ਕਰੋ</translation> <translation id="6268252012308737255"><ph name="APP" /> ਨਾਲ ਖੋਲ੍ਹੋ</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">ਸਾਈਟਾਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />ਸਿਸਟਮ ਅਤੇ ਐਪ ਜਾਣਕਾਰੀ<ph name="END_LINK1" />, ਅਤੇ <ph name="BEGIN_LINK2" />ਮਾਪਕ<ph name="END_LINK2" /> ਭੇਜੋ</translation> <translation id="6272643420381259437">ਪਲੱਗਇਨ ਡਾਊਨਲੋਡ ਕਰਨ ਦੌਰਾਨ ਇੱਕ ਗੜਬੜ (<ph name="ERROR" />) ਹੋਈ ਸੀ</translation> <translation id="6273677812470008672">ਕੁਆਲਿਟੀ</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">ਖਾਤਾ</translation> <translation id="6298962879096096191">Android ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਲਈ Google Play ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="630065524203833229">ਬਾ&ਹਰ ਜਾਓ</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> ਦਾ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਸੰਰੂਪਣ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਉੱਨਤ ਪ੍ਰਿੰਟਰ ਵੇਰਵੇ ਨਿਰਧਾਰਤ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="6305607932814307878">ਗਲੋਬਲ ਨੀਤੀ:</translation> <translation id="6307990684951724544">ਸਿਸਟਮ ਰੁੱਝਾ ਹੋਇਆ ਹੈ</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> ਵੱਲੋਂ ਸਾਈਨ-ਇਨ ਮੁਹੱਈਆ ਕਰਵਾਇਆ ਗਿਆ</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">ਕਲੀਨਅੱਪ ਇਸ ਸਮੇਂ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation> <translation id="6556866813142980365">ਮੁੜ-ਓਹੀ ਕਰੋ</translation> <translation id="6557290421156335491">ਮੇਰੇ ਸ਼ਾਰਟਕੱਟ</translation> +<translation id="6561560012278703671">ਵਧੇਰੇ ਸ਼ਾਂਤ ਸੁਨੇਹਾ ਵਰਤੋ (ਤੁਹਾਡਾ ਧਿਆਨ ਭਟਕਾਉਣ ਵਾਲੇ ਸੂਚਨਾ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਜਾਂਦਾ ਹੈ)</translation> <translation id="6561726789132298588">ਦਰਜ ਕਰੋ</translation> <translation id="656293578423618167">ਫਾਈਲ ਪਾਥ ਜਾਂ ਨਾਮ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡਾ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਛੋਟੇ ਨਾਮ ਨਾਲ ਜਾਂ ਦੂਜੇ ਨਿਰਧਾਰਿਤ ਟਿਕਾਣੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ।</translation> <translation id="6563469144985748109">ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਕ ਨੇ ਹਾਲੇ ਇਸ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਦਿੱਤੀ ਹੈ</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">ਭੇਜਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛੋ</translation> <translation id="6840184929775541289">ਇੱਕ ਸਰਟੀਫਿਕੇਸ਼ਨ ਅਥਾੱਰਿਟੀ ਨਹੀਂ ਹੈ।</translation> <translation id="6841186874966388268">ਤਰੁੱਟੀਆਂ</translation> +<translation id="6843267103192918276">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ। ਤੁਸੀਂ ਆਪਣੀਆਂ Google ਸੇਵਾਵਾਂ 'ਤੇ ਵੀ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਸਾਈਨ-ਇਨ ਹੋ ਜਾਵੋਗੇ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google ਪੂਰੀ ਤਰ੍ਹਾਂ ਤਿਆਰ ਹੈ</translation> <translation id="6845038076637626672">ਅਧਿਕਤਮ ਕੀਤਾ ਖੋਲ੍ਹੋ</translation> <translation id="6845325883481699275">Chrome ਸੁਰੱਖਿਆ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">ਤੁਹਾਡਾ Hangouts Meet ਹਾਰਡਵੇਅਰ ਸਥਾਪਤ ਕੀਤੇ ਜਾਣ ਲਈ ਤਿਆਰ ਹੈ।</translation> <translation id="744341768939279100">ਇੱਕ ਨਵਾਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾਓ</translation> <translation id="7443806024147773267">ਕਦੇ ਵੀ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਕੇ ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ</translation> -<translation id="7444046173054089907">ਇਹ ਸਾਈਟ ਬਲਾਕ ਕੀਤੀ ਗਈ ਹੈ</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ਨੂੰ ਬੰਦ ਕਰੋ</translation> <translation id="7448430327655618736">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਐਪਾਂ ਦੀ ਸਥਾਪਨਾ</translation> <translation id="7450761244949417357">ਹੁਣ <ph name="ALTERNATIVE_BROWSER_NAME" /> ਵਿੱਚ ਖੁੱਲ੍ਹ ਰਿਹਾ ਹੈ</translation> @@ -5028,6 +5048,7 @@ <translation id="8214962590150211830">ਇਹ ਵਿਅਕਤੀ ਹਟਾਓ</translation> <translation id="8215295261562449873">Linux ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਮੇਰੀਆਂ ਐਪਾਂ ਅਤੇ ਫ਼ਾਈਲਾਂ ਦਾ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਵਿੱਚ ਬੈਕਅੱਪ ਲਓ।</translation> <translation id="8217399928341212914">ਮਲਟੀਪਲ ਫਾਈਲਾਂ ਦੀ ਆਟੋਮੈਟਿਕ ਡਾਊਨਲੋਡਸ ਨੂੰ ਬਲੌਕ ਕਰਦੇ ਹੋਏ ਜਾਰੀ ਰੱਖੋ</translation> +<translation id="8218847192766059983">ਭਾਸ਼ਾਵਾਂ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਸੂਚੀ ਨੂੰ ਮੁੜ-ਕ੍ਰਮਬੱਧ ਕਰੋ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="8221491193165283816">ਆਮ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰਦੇ ਹੋ। ਇਹ ਸਾਈਟ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰ ਸਕੇ, ਇਸ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="8225265270453771718">ਐਪਲੀਕੇਸ਼ਨ ਵਿੰਡੋ ਸਾਂਝੀ ਕਰੋ</translation> <translation id="8225753906568652947">ਆਪਣੀਆਂ ਪੇਸ਼ਕਸ਼ਾਂ ਰੀਡੀਮ ਕਰੋ</translation> @@ -5641,6 +5662,7 @@ <translation id="9065203028668620118">ਸੰਪਾਦਿਤ ਕਰੋ</translation> <translation id="9066773882585798925">ਸੁਣਨ ਲਈ ਲਿਖਤ ਨੂੰ ਉੱਚੀ ਅਵਾਜ਼ ਵਿੱਚ ਪੜ੍ਹੋ</translation> <translation id="9066782832737749352">ਲਿਖਤ ਤੋਂ ਬੋਲੀ</translation> +<translation id="9067559831321817373">ਆਪਣੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਖਾਤਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। Chrome ਅਤੇ Google Play ਵਿੱਚ ਵੈਬਸਾਈਟਾਂ, ਐਪਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਇਜਾਜ਼ਤਾਂ ਦੇ ਆਧਾਰ 'ਤੇ ਤੁਹਾਡੇ ਅਨੁਭਵ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਇਹਨਾਂ ਖਾਤਿਆਂ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ। <a>ਹੋਰ ਜਾਣੋ</a></translation> <translation id="9068849894565669697">ਰੰਗ ਚੁਣੋ</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">ਬਲੂਟੁੱਥ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 83603eb..638bd0c1 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ups. System nie mógł pobrać zasad dotyczących Twojego urządzenia.</translation> <translation id="347785443197175480">Nadal zezwalaj witrynie <ph name="HOST" /> na dostęp do kamery i mikrofonu</translation> <translation id="3478685642445675458">Aby usunąć osobę, odblokuj swój profil.</translation> -<translation id="3479539252931486093">Zaskoczyło Cię to? <ph name="BEGIN_LINK" />Daj nam znać<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Nie teraz</translation> <translation id="3481268647794498892">Strona zostanie otwarta w przeglądarce <ph name="ALTERNATIVE_BROWSER_NAME" /> za <ph name="COUNTDOWN_SECONDS" /> s</translation> <translation id="3484273680291419129">Usuwam szkodliwe oprogramowanie…</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hardware Hangouts Meet jest gotowy do konfiguracji.</translation> <translation id="744341768939279100">Utwórz nowy profil</translation> <translation id="7443806024147773267">Miej dostęp do swoich haseł zawsze wtedy, gdy zalogujesz się na swoje konto Google</translation> -<translation id="7444046173054089907">Ta strona jest zablokowana</translation> <translation id="7444983668544353857">Wyłącz – <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Automatyczne instalowanie aplikacji</translation> <translation id="7450761244949417357">Otwieram w przeglądarce <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 6bfd4e796..f2c29ef 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -351,7 +351,7 @@ <translation id="1493892686965953381">Aguardando <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> outros dispositivos disponíveis.</translation> <translation id="1495677929897281669">Voltar à guia</translation> -<translation id="1499271269825557605">Se você não reconhece uma extensão, ou se seu navegador não está funcionando como o esperado, é possível desativar ou personalizar extensões aqui.</translation> +<translation id="1499271269825557605">Caso não reconheça uma extensão, ou se seu navegador não estiver funcionando como o esperado, você poderá desativar ou personalizar extensões aqui.</translation> <translation id="1500297251995790841">Dispositivo desconhecido [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Esta conta de proprietário precisa ser a primeira conta a fazer login em uma sessão de login múltiplo.</translation> <translation id="150411034776756821">Remover <ph name="SITE" /></translation> @@ -1310,7 +1310,7 @@ <translation id="2806891468525657116">O atalho já existe</translation> <translation id="2807517655263062534">Os arquivos transferidos por download aparecem aqui</translation> <translation id="2809586584051668049">e mais <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation> -<translation id="2810390687497823527">Se você não reconhece uma extensão, ou se o navegador não está funcionando como esperado, é possível desativar ou personalizar extensões aqui.</translation> +<translation id="2810390687497823527">Caso não reconheça uma extensão, ou se seu navegador não estiver funcionando como o esperado, você poderá desativar ou personalizar extensões aqui.</translation> <translation id="2812049959647166806">O Thunderbolt não é compatível</translation> <translation id="2812944337881233323">Tente sair e fazer login novamente</translation> <translation id="2812989263793994277">Não mostrar nenhuma imagem</translation> @@ -1534,7 +1534,7 @@ <translation id="3143515551205905069">Cancelar sincronização</translation> <translation id="3143754809889689516">Reproduzir do início</translation> <translation id="3144647712221361880">Abrir link como</translation> -<translation id="3145187901750964977">Não foi possível instalar a máquina virtual. Tente novamente ou entre em contato com o administrador do dispositivo da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> +<translation id="3145187901750964977">Não foi possível instalar a máquina virtual. Tente novamente ou entre em contato com o administrador de dispositivos da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Versão: <ph name="LINUX_VERSION" /> @@ -1574,7 +1574,7 @@ <translation id="3192947282887913208">Arquivos de áudio</translation> <translation id="3194737229810486521"><ph name="URL" /> quer armazenar permanentemente os dados no seu dispositivo</translation> <translation id="3199127022143353223">Servidores</translation> -<translation id="3201306578844503970">Não foi possível instalar a máquina virtual devido a um erro de rede. Tente novamente ou entre em contato com o administrador do dispositivo da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> +<translation id="3201306578844503970">Não foi possível instalar a máquina virtual devido a um erro de rede. Tente novamente ou entre em contato com o administrador de dispositivos da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Os dispositivos USB disponíveis serão exibidos aqui.</translation> <translation id="3202131003361292969">Caminho</translation> <translation id="3202173864863109533">O áudio desta guia está sendo desativado.</translation> @@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Falha do sistema ao buscar a política do seu dispositivo.</translation> <translation id="347785443197175480">Continuar permitindo que <ph name="HOST" /> acesse sua câmera e seu microfone</translation> <translation id="3478685642445675458">Desbloqueie seu perfil antes de remover uma pessoa.</translation> -<translation id="3479539252931486093">Isso foi inesperado? <ph name="BEGIN_LINK" />Informe-nos<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Não agora</translation> <translation id="3481268647794498892">Abrindo no <ph name="ALTERNATIVE_BROWSER_NAME" /> em <ph name="COUNTDOWN_SECONDS" /> segundos</translation> <translation id="3484273680291419129">Removendo software perigoso...</translation> @@ -2287,7 +2286,7 @@ <translation id="4181841719683918333">Idiomas</translation> <translation id="4184885522552335684">Arraste para mover uma tela</translation> <translation id="4194570336751258953">Ativar toque para clicar</translation> -<translation id="4194595472342532425">Não foi possível definir a Plugin VM devido a um problema de configuração. Entre em contato com o administrador do dispositivo da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> +<translation id="4194595472342532425">Não foi possível definir o Plugin VM devido a um problema de configuração. Entre em contato com o administrador de dispositivos da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Abrir em uma nova guia</translation> <translation id="4195814663415092787">Continuar de onde você parou</translation> <translation id="4198146608511578238">Basta tocar no ícone de tela de início e mantê-lo pressionado para falar com seu Google Assistente.</translation> @@ -2777,7 +2776,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" quer se conectar a uma porta serial</translation> <translation id="4944310289250773232">Este serviço de autenticação é hospedado por <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Ações</translation> -<translation id="4952981627953231344">A Plugin VM não é permitida neste dispositivo. Entre em contato com o administrador de dispositivos da sua organização.</translation> +<translation id="4952981627953231344">O Plugin VM não é permitido neste dispositivo. Entre em contato com o administrador de dispositivos da sua organização.</translation> <translation id="4953689047182316270">Responder a eventos de acessibilidade</translation> <translation id="4953808748584563296">Avatar laranja padrão</translation> <translation id="4955710816792587366">Escolher o PIN</translation> @@ -4492,7 +4491,6 @@ <translation id="7442465037756169001">Seu hardware Hangouts Meet está pronto para ser configurado.</translation> <translation id="744341768939279100">Criar um novo perfil</translation> <translation id="7443806024147773267">Acesse suas senhas sempre que estiver utilizando sua Conta Google</translation> -<translation id="7444046173054089907">Este site está bloqueado</translation> <translation id="7444983668544353857">Desativar <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalar apps automaticamente</translation> <translation id="7450761244949417357">Abrindo no <ph name="ALTERNATIVE_BROWSER_NAME" /> agora</translation> @@ -4893,7 +4891,7 @@ <translation id="7987814697832569482">Sempre se conectar usando esta VPN</translation> <translation id="7988355189918024273">Ativa os recursos de acessibilidade</translation> <translation id="7991296728590311172">Configurações do acesso com interruptor</translation> -<translation id="7994350303002908848">Não foi possível instalar a Plugin VM. Tente novamente ou entre em contato com o administrador do dispositivo da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> +<translation id="7994350303002908848">Não foi possível instalar o Plugin VM. Tente novamente ou entre em contato com o administrador de dispositivos da sua organização. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">Método EAP</translation> <translation id="7997826902155442747">Prioridade de processo</translation> <translation id="7999229196265990314">Os seguintes arquivos foram criados: @@ -5783,7 +5781,7 @@ <translation id="960719561871045870">Código da operadora</translation> <translation id="960987915827980018">Cerca de 1 hora restante</translation> <translation id="962802172452141067">Árvore de pastas de favoritos</translation> -<translation id="964057662886721376">Algumas extensões podem deixar o dispositivo lento, especialmente aquelas que você não quis instalar.</translation> +<translation id="964057662886721376">Algumas extensões podem deixar o dispositivo lento, especialmente aquelas que você instalou sem querer.</translation> <translation id="964286338916298286">Seu administrador de TI desativou os Goodies do Chrome para seu dispositivo.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicativo}one{Aplicativo}other{Aplicativos}}</translation> <translation id="965211523698323809">Envie e receba mensagens de texto no <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 4c418928..21b00a3 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ups! O sistema não conseguiu obter a política para o seu dispositivo.</translation> <translation id="347785443197175480">Continuar a permitir que <ph name="HOST" /> aceda à sua câmara e microfone</translation> <translation id="3478685642445675458">Desbloqueie o seu perfil antes de remover uma pessoa.</translation> -<translation id="3479539252931486093">Esta ação foi inesperada? <ph name="BEGIN_LINK" />Informe-nos<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Agora não</translation> <translation id="3481268647794498892">A abrir o <ph name="ALTERNATIVE_BROWSER_NAME" /> dentro de <ph name="COUNTDOWN_SECONDS" /> segundos</translation> <translation id="3484273680291419129">A remover software prejudicial…</translation> @@ -4491,7 +4490,6 @@ <translation id="7442465037756169001">O hardware Hangouts Meet está pronto para ser configurado.</translation> <translation id="744341768939279100">Criar um novo perfil</translation> <translation id="7443806024147773267">Aceda às suas palavras-passe sempre que tiver sessão iniciada na sua Conta Google.</translation> -<translation id="7444046173054089907">Este site está bloqueado</translation> <translation id="7444983668544353857">Desactivar <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalar aplicações automaticamente</translation> <translation id="7450761244949417357">A abrir no <ph name="ALTERNATIVE_BROWSER_NAME" /> agora</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 93d1fb6..08d975f 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Pagina nu răspunde</translation> <translation id="1041263367839475438">Dispozitive disponibile</translation> <translation id="1042174272890264476">Computerul este dotat, de asemenea, cu o bibliotecă RLZ încorporată, oferită de <ph name="SHORT_PRODUCT_NAME" />. Biblioteca RLZ atribuie o etichetă non-unică și care nu vă identifică în mod personal, pentru a măsura căutările și modul în care este utilizat <ph name="SHORT_PRODUCT_NAME" /> în funcție de o anumită campanie promoțională. Aceste etichete pot apărea uneori în interogările Căutării Google din <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Ștergi și datele din aceste aplicații?</translation> <translation id="1045692658517323508">{0,plural, =1{Actualizează într-un minut}few{Actualizează într-un interval de # minute}other{Actualizează într-un interval de # de minute}}</translation> <translation id="1046635659603195359">Se pare că ai configurat deja Voice Match cu Asistentul Google pe alt dispozitiv. Aceste înregistrări anterioare pot fi folosite pentru a crea un model vocal pe acest dispozitiv. Ar trebui să dureze cel mult un minut.</translation> <translation id="1047431265488717055">Copiază te&xtul linkului</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Profită de ingeniozitatea Google în Chrome</translation> <translation id="1147991416141538220">Pentru a solicita acces, contactează administratorul dispozitivului.</translation> <translation id="1149401351239820326">Luna expirării</translation> +<translation id="1150490752229770117">Aceasta este cea mai recentă actualizare automată de software și securitate pentru acest dispozitiv <ph name="DEVICE_TYPE" />. Pentru a primi actualizări viitoare, fă upgrade la un model mai nou. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Ochelari de soare</translation> <translation id="1151917987301063366">Permite întotdeauna accesul <ph name="HOST" /> la senzori</translation> <translation id="1153356358378277386">Dispozitive asociate</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Alege un tichet pe care să îl folosești pentru autentificare. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Obține parola pe iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> dorește să stocheze permanent date pe computer</translation> +<translation id="1714644264617423774">Activează funcțiile de accesibilitate, pentru a face dispozitivul mai ușor de utilizat. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Senzori de mișcare</translation> +<translation id="171824261579749339">Australiană <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Ultima oră</translation> <translation id="1719312230114180055">Notă: este posibil ca amprenta să fie mai puțin sigură decât o parolă sau un cod PIN puternic.</translation> <translation id="1720318856472900922">Autentificarea serverului TLS WWW</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Șterge cookie-urile terță parte</translation> <translation id="2097372108957554726">Pentru a înregistra dispozitive noi, este necesar să vă conectați la Chrome</translation> <translation id="2099172618127234427">În prezent, activezi funcțiile de remediere a erorilor în sistemul de operare Chrome, care vor configura SSH daemon și vor activa pornirea de pe dispozitive USB.</translation> +<translation id="2099625543891475722">trăsăturile tale fizice, cum ar fi înălțimea;</translation> <translation id="2099686503067610784">Șterge certificatul de server „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="2100273922101894616">Conectare automată</translation> <translation id="2101225219012730419">Versiune:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Creează un profil nou</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> dorește să-ți confirme identitatea</translation> <translation id="2448312741937722512">Tipul</translation> +<translation id="2448734521821581858">Cookie-urile sunt fișiere create de site-urile pe care le accesezi. Există două tipuri de cookie-uri: cookie-urile primare sunt create de site-ul pe care îl accesezi. Site-ul este afișat în bara de adrese. Cookie-urile terță parte sunt create de alte site-uri. Aceste site-uri dețin o parte din conținut, cum ar fi anunțuri sau imagini, pe care le vezi pe site-ul pe care îl accesezi.</translation> <translation id="2450223707519584812">Nu vei putea adăuga utilizatori, deoarece lipsesc cheile pentru API-ul Google. Pentru detalii, consultă <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Nu există afișări active</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">A expirat</translation> <translation id="2588636910004461974">Dispozitive de la <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Caută pe Google sau introdu adresa URL</translation> +<translation id="2600522410036850735">Acest dispozitiv va primi actualizări automate de software și de securitate până în <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Află mai multe</a></translation> <translation id="2603115962224169880">Curăță computerul</translation> <translation id="2603463522847370204">Deschideți într-o &fereastră incognito</translation> <translation id="2604255671529671813">Eroare de conectare la rețea</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Navigare sigură (protecție împotriva site-urilor periculoase)</translation> <translation id="3182749001423093222">Verificarea ortografiei</translation> <translation id="3183139917765991655">Instrument de import al profilurilor</translation> +<translation id="3184536091884214176">Configurează sau gestionează imprimantele CUPS. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Fișierele mele</translation> <translation id="3188465121994729530">Medie mobilă</translation> <translation id="3190558889382726167">Parola a fost salvată</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Hopa! Sistemul nu a putut prelua politica pentru dispozitivul tău.</translation> <translation id="347785443197175480">Permiteți în continuare accesul <ph name="HOST" /> la camera și microfonul dvs.</translation> <translation id="3478685642445675458">Deblochează profilul înainte de a elimina o persoană.</translation> -<translation id="3479539252931486093">A fost o situație neașteptată? <ph name="BEGIN_LINK" />Anunță-ne<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Nu acum</translation> <translation id="3481268647794498892">Se deschide în <ph name="ALTERNATIVE_BROWSER_NAME" /> în <ph name="COUNTDOWN_SECONDS" /> secunde</translation> <translation id="3484273680291419129">Se elimină software-ul dăunător...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Afișează numele de utilizatori și fotografiile pe ecranul de conectare</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – dispozitiv HID conectat</translation> <translation id="4142052906269098341">Deblochează <ph name="DEVICE_TYPE" /> cu telefonul. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Salvează imprimantele detectate în profilul tău sau adaugă o imprimantă nouă. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Obține videoclipuri de o calitate mai bună și mărește autonomia bateriei. Videoclipul va fi redat numai pe un ecran compatibil cu Cast.</translation> <translation id="4146026355784316281">Deschide întotdeauna cu Utilitarul de vizualizare al sistemului</translation> <translation id="4146785383423576110">Resetează și curăță</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Pepene galben</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> trimite conținutul unei ferestre.</translation> <translation id="4364830672918311045">Afișează notificările</translation> +<translation id="436499142539576997">Nu s-au obținut datele aplicației, se încearcă încă rularea aplicației...</translation> <translation id="4370975561335139969">Adresa de e-mail și parola pe care le-ai introdus nu se potrivesc</translation> <translation id="437184764829821926">Setări avansate pentru fonturi</translation> <translation id="4374831787438678295">Programul de instalare Linux</translation> @@ -2502,7 +2511,7 @@ <translation id="4549791035683739768">Cheia de securitate nu are amprente stocate.</translation> <translation id="4551763574344810652">Apasă pe <ph name="MODIFIER_KEY_DESCRIPTION" /> pentru a anula</translation> <translation id="4552089082226364758">Flash</translation> -<translation id="4552759165874948005">Rețea <ph name="NETWORK_TYPE" />, puterea semnalului <ph name="SIGNAL_STRENGTH" />%</translation> +<translation id="4552759165874948005">Rețea <ph name="NETWORK_TYPE" />, puterea semnalului <ph name="SIGNAL_STRENGTH" /> %</translation> <translation id="4554591392113183336">Extensia externă este în aceeași versiune sau într-o versiune inferioară celei existente.</translation> <translation id="4555769855065597957">Umbră</translation> <translation id="4555863373929230635">Conectează-te și activează sincronizarea ca să salvezi parolele în Contul tău Google.</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Numai http, https și protocoalele de fișiere sunt compatibile cu redirecționarea către un browser secundar.</translation> <translation id="4659077111144409915">Cont principal</translation> <translation id="4660476621274971848">Versiunea așteptată era „<ph name="EXPECTED_VERSION" />”, dar versiunea a fost „<ph name="NEW_ID" />”</translation> +<translation id="4660838440047236328">aspectul camerei în care te afli.</translation> <translation id="4662788913887017617">Trimite marcajul pe iPhone</translation> <translation id="4663373278480897665">Camera foto este permisă</translation> <translation id="4664482161435122549">PKCS # 12 Eroare de export</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Pagina de pornire a fost înlocuită cu <ph name="URL" />.</translation> <translation id="4902546322522096650">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, conectează-te</translation> <translation id="49027928311173603">Politica descărcată de pe server este nevalidă: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Configurează sau gestionează spații comune de stocare fișiere în rețea. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Acest fișier nu este descărcat de obicei și ar putea fi periculos.</translation> <translation id="4907306957610201395">Categoria de permisiuni</translation> <translation id="4908811072292128752">Deschide o filă nouă pentru a naviga pe două site-uri simultan</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Se activează...</translation> <translation id="5039804452771397117">Permite</translation> <translation id="5042282098504489593">Deschide Setările pentru a conecta <ph name="USB_DEVICE_NAME" /> la Linux</translation> +<translation id="5043913660911154449">Sau indică PPD-ul imprimantei <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Parolă incorectă</translation> <translation id="504561833207953641">Se deschide în sesiunea de browser existentă.</translation> <translation id="5047421709274785093">Blochează folosirea senzorilor de mișcare și de lumină de către site-uri</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Setarea nu poate fi modificată de un copil.</translation> <translation id="5466374726908360271">In&serează și caută „<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Se caută dispozitive de stocare în rețea</translation> +<translation id="5470735824776589490">Trebuie să repornești dispozitivul înainte de a fi resetat folosind Powerwash. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Bună! Eu sunt vocea pentru redarea vocală a textului.</translation> <translation id="5472133193607270166">Dacă opțiunea este activată, site-urile nu pot folosi activitatea ta de navigare de pe diferite site-uri pentru a personaliza anunțurile. Unele site-uri pot să nu funcționeze corect.</translation> <translation id="5473333559083690127">Reintrodu noul cod PIN</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Organizați</translation> <translation id="5499313591153584299">Este posibil ca acest fișier să fie dăunător pentru computer.</translation> <translation id="5502500733115278303">Importate din Firefox</translation> +<translation id="5505264765875738116">Site-urile nu îți pot solicita să îți trimită notificări</translation> <translation id="5505307013568720083">Lipsă cerneală</translation> <translation id="5507756662695126555">Non-repudiere</translation> <translation id="5509693895992845810">Salvează c&a...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Preferințe</translation> <translation id="5804175651771201311">Roaming dezactivat</translation> <translation id="5804241973901381774">Permisiuni</translation> +<translation id="5804427196348435412">Folosește dispozitive NFC</translation> <translation id="5805697420284793859">Managerul de ferestre</translation> <translation id="5806773519584576205">0° (prestabilit)</translation> <translation id="5811750797187914944">Gata</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Deschideți aplicația maximizată</translation> <translation id="6096326118418049043">Nume X.500</translation> <translation id="6097480669505687979">Dacă nu eliberezi spațiu, este posibil ca utilizatorii și datele să fie eliminate automat.</translation> +<translation id="6097600385983390082">Căutarea vocală a fost închisă</translation> <translation id="6098793583803863900">Se caută conținut periculos într-un fișier necunoscut.</translation> <translation id="6100736666660498114">Meniul Start</translation> <translation id="6101226222197207147">A fost adăugată o aplicație (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Setarea prestabilită este de a folosi vocea în locul tastaturii</translation> <translation id="6234474535228214774">Instalare în așteptare</translation> <translation id="6237816943013845465">Cu ajutorul acestei setări, poți să ajustezi rezoluția ecranului</translation> +<translation id="6238624845858322552">Conectează-te la dispozitivul Bluetooth</translation> <translation id="6238767809035845642">Text trimis de pe alt dispozitiv</translation> <translation id="6238923052227198598">Păstrează cea mai recentă notă pe ecranul de blocare</translation> <translation id="6239558157302047471">Reîncarcă &cadrul</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, bateria telefonului: <ph name="BATTERY_STATUS" /> %, conectează-te</translation> <translation id="6268252012308737255">Deschide cu <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Site-urile îți pot solicita să îți trimită notificări</translation> <translation id="6270770586500173387">Trimite <ph name="BEGIN_LINK1" />informații despre sistem și aplicații<ph name="END_LINK1" /> și <ph name="BEGIN_LINK2" />valori<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">A apărut o eroare (<ph name="ERROR" />) la descărcarea pluginului</translation> <translation id="6273677812470008672">Calitate</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Cont</translation> <translation id="6298962879096096191">Folosește Google Play pentru a instala aplicații Android</translation> <translation id="630065524203833229">&Ieși</translation> +<translation id="6300718114348072351">Imprimanta <ph name="PRINTER_NAME" /> nu a putut fi configurată automat. Indică detaliile de printare avansate. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Politică globală:</translation> <translation id="6307990684951724544">Sistem ocupat</translation> <translation id="6308493641021088955">Conectare asigurată de <ph name="EXTENSION_NAME" /></translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Funcția de curățare este indisponibilă momentan</translation> <translation id="6556866813142980365">Repetă</translation> <translation id="6557290421156335491">Comenzile mele rapide</translation> +<translation id="6561560012278703671">Folosește mesageria mai discretă (împiedică solicitările de notificări astfel încât să nu te întrerupă)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Calea sau numele fișierului sunt prea lungi. Salvați utilizând un nume mai scurt sau într-o altă locație.</translation> <translation id="6563469144985748109">Administratorul nu l-a aprobat încă</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Întreabă înainte de a trimite</translation> <translation id="6840184929775541289">Nu este o Autoritate de certificare</translation> <translation id="6841186874966388268">Erori</translation> +<translation id="6843267103192918276">Conectează-te și accesează marcajele, istoricul, parolele și alte setări pe toate dispozitivele. În plus, te vei conecta automat la serviciile Google. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google este configurat</translation> <translation id="6845038076637626672">Deschideți aplicația maximizată</translation> <translation id="6845325883481699275">Contribuie la îmbunătățirea securității pentru Chrome</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Hardware-ul Hangouts Meet este gata pentru configurare.</translation> <translation id="744341768939279100">Creați un profil nou</translation> <translation id="7443806024147773267">Accesează-ți parolele oricând te conectezi la Contul Google</translation> -<translation id="7444046173054089907">Acest site este blocat</translation> <translation id="7444983668544353857">Dezactivează <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalează automat aplicații</translation> <translation id="7450761244949417357">Se deschide acum în <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Exclude această persoană</translation> <translation id="8215295261562449873">Fă backup aplicațiilor și fișierelor în dosarul Descărcări înainte să faci upgrade la Linux.</translation> <translation id="8217399928341212914">Blocați în continuare descărcarea automată a mai multor fișiere</translation> +<translation id="8218847192766059983">Adaugă limbi sau reordonează lista. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="8221491193165283816">De obicei blochezi notificările. Ca să-i permiți acestui site să îți trimită notificări, dă clic aici.</translation> <translation id="8225265270453771718">Distribuie fereastra unei aplicații</translation> <translation id="8225753906568652947">Valorifică-ți ofertele</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Editează</translation> <translation id="9066773882585798925">Ascultă textul citit cu voce tare</translation> <translation id="9066782832737749352">Redarea vocală a textului</translation> +<translation id="9067559831321817373">Gestionează-ți conturile conectate. Site-urile, aplicațiile și extensiile din Chrome și Google Play pot folosi aceste conturi pentru a-ți personaliza experiența, în funcție de permisiuni. <a>Află mai multe</a></translation> <translation id="9068849894565669697">Selectați culoarea</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 368d179..326079d8 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Страница не отвечает</translation> <translation id="1041263367839475438">Доступные устройства</translation> <translation id="1042174272890264476">В ваш компьютер встроена библиотека RLZ <ph name="SHORT_PRODUCT_NAME" />. RLZ присваивает компьютеру неуникальную и не позволяющую идентифицировать пользователя метку, с помощью которой мы можем оценить количество запросов и статистику использования этого продукта (<ph name="SHORT_PRODUCT_NAME" />) по результатам рекламных кампаний. Иногда метки могут включаться в поисковые запросы, сделанные в этом продукте (<ph name="PRODUCT_NAME" />).</translation> +<translation id="1043818413152647937">Удалить данные этих приложений?</translation> <translation id="1045692658517323508">{0,plural, =1{Перезагрузите устройство в течение 1 минуты}one{Перезагрузите устройство в течение # минуты}few{Перезагрузите устройство в течение # минут}many{Перезагрузите устройство в течение # минут}other{Перезагрузите устройство в течение # минуты}}</translation> <translation id="1046635659603195359">Вы уже настроили Voice Match в Google Ассистенте на другом устройстве. Предыдущие записи вашего голоса можно использовать для создания образца на этом устройстве. Настройка займет не больше минуты.</translation> <translation id="1047431265488717055">Скопировать &текст ссылки</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Интеллектуальные функции Google в Chrome</translation> <translation id="1147991416141538220">Чтобы запросить доступ, обратитесь к администратору устройства.</translation> <translation id="1149401351239820326">Месяц окончания срока действия</translation> +<translation id="1150490752229770117">Это последнее автоматическое обновление ПО и безопасности для устройства <ph name="DEVICE_TYPE" />. Если вы хотите получать обновления в дальнейшем, перейдите на более новую модель. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Солнцезащитные очки</translation> <translation id="1151917987301063366">Всегда разрешать сайту <ph name="HOST" /> использовать датчики</translation> <translation id="1153356358378277386">Сопряженные устройства</translation> @@ -510,7 +512,9 @@ <translation id="1709217939274742847">Выберите билет для аутентификации. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Получите этот пароль на iPhone</translation> <translation id="1712552549805331520">Сайт <ph name="URL" /> запрашивает разрешение на постоянное хранение данных на вашем компьютере.</translation> +<translation id="1714644264617423774">Чтобы пользоваться устройством было проще, включите специальные возможности. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Датчики движения</translation> +<translation id="171824261579749339">Обратная. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Последний час</translation> <translation id="1719312230114180055">Помните, что распознавание отпечатков защищает не так надежно, как сложный пароль или PIN-код.</translation> <translation id="1720318856472900922">Аутентификация сервера TLS WWW</translation> @@ -772,6 +776,7 @@ <translation id="2096715839409389970">Удалить сторонние файлы cookie</translation> <translation id="2097372108957554726">Войдите в Chrome, чтобы зарегистрировать новое устройство</translation> <translation id="2099172618127234427">Вы включаете функции отладки Chrome OS. Будет настроен SSHD-демон и разрешена загрузка с USB-дисков.</translation> +<translation id="2099625543891475722">получить представление о параметрах вашего тела, например о росте;</translation> <translation id="2099686503067610784">Удалить сертификат сервера <ph name="CERTIFICATE_NAME" />?</translation> <translation id="2100273922101894616">Автоматический вход</translation> <translation id="2101225219012730419">Версия:</translation> @@ -1025,6 +1030,7 @@ <translation id="2445484935443597917">Создать профиль</translation> <translation id="2446585455334014596">Приложение "<ph name="APP_NAME" />" запрашивает подтверждение вашей личности</translation> <translation id="2448312741937722512">Тип</translation> +<translation id="2448734521821581858">Файлы cookie создаются сайтами для хранения пользовательской информации. Существует два типа таких файлов. Собственные файлы cookie создает тот сайт, на который вы зашли. Он указан в адресной строке браузера. Сторонние файлы cookie создаются другими сайтами, которые размещают свой контент (например, объявления или изображения) на просматриваемых вами веб-страницах.</translation> <translation id="2450223707519584812">Отсутствуют ключи API Google. Вы не сможете добавлять пользователей. Подробная информация: <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">нет активных режимов просмотра.</translation> <translation id="2451298179137331965">2x</translation> @@ -1138,6 +1144,7 @@ <translation id="2587922766792651800">Превышено время ожидания</translation> <translation id="2588636910004461974">Устройства от поставщика <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Введите запрос для поиска в Google или укажите URL</translation> +<translation id="2600522410036850735">Устройство будет получать автоматические обновления ПО и системы безопасности до этой даты: <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Подробнее…</a></translation> <translation id="2603115962224169880">Удалить вредоносное ПО с компьютера</translation> <translation id="2603463522847370204">Открыть в режиме &инкогнито</translation> <translation id="2604255671529671813">Ошибка подключения к сети</translation> @@ -1558,6 +1565,7 @@ <translation id="3181954750937456830">Безопасный просмотр (защищает вас и ваше устройство от опасных сайтов)</translation> <translation id="3182749001423093222">Проверка правописания</translation> <translation id="3183139917765991655">Импорт профилей</translation> +<translation id="3184536091884214176">Настройте принтеры CUPS. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Мои файлы</translation> <translation id="3188465121994729530">Скользящее среднее</translation> <translation id="3190558889382726167">Пароль сохранен</translation> @@ -1748,7 +1756,6 @@ <translation id="347670947055184738">Не удалось извлечь правила для вашего устройства.</translation> <translation id="347785443197175480">Предоставить сайту <ph name="HOST" /> доступ к камере и микрофону</translation> <translation id="3478685642445675458">Разблокируйте свой профиль, прежде чем удалять другой.</translation> -<translation id="3479539252931486093">Этот сайт не должен быть заблокирован? <ph name="BEGIN_LINK" />Сообщите нам об этом<ph name="END_LINK" />.</translation> <translation id="3479552764303398839">Не сейчас</translation> <translation id="3481268647794498892">Открывается в <ph name="ALTERNATIVE_BROWSER_NAME" />. Осталось <ph name="COUNTDOWN_SECONDS" /> сек.</translation> <translation id="3484273680291419129">Удаление вредоносного ПО...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">Показывать имена и фотографии пользователей на экране входа</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – подключено HID-устройство</translation> <translation id="4142052906269098341">Снимать блокировку <ph name="DEVICE_TYPE" /> с помощью телефона. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Сохраните найденные принтеры в своем профиле или добавьте новый принтер. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="4144218403971135344">С помощью этой функции вы улучшите качество видео и продлите время работы от батареи. Видео будет воспроизводиться только на экранах с поддержкой Cast.</translation> <translation id="4146026355784316281">Всегда открывать в программе просмотра по умолчанию</translation> <translation id="4146785383423576110">Сброс настроек и удаление вредоносного ПО</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">Дыня</translation> <translation id="4364567974334641491">Приложение "<ph name="APP_NAME" />" предоставило доступ к окну.</translation> <translation id="4364830672918311045">Показывать уведомления</translation> +<translation id="436499142539576997">Получить данные приложения не удалось. Мы пытаемся запустить его…</translation> <translation id="4370975561335139969">Указан неправильный адрес или пароль</translation> <translation id="437184764829821926">Расширенные настройки шрифтов</translation> <translation id="4374831787438678295">Установщик Linux</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">Для переадресации в браузере поддерживаются только протоколы HTTP, HTTPS и файловые протоколы.</translation> <translation id="4659077111144409915">Основной аккаунт</translation> <translation id="4660476621274971848">Ожидаемая версия: <ph name="EXPECTED_VERSION" />, полученная версия: <ph name="NEW_ID" /></translation> +<translation id="4660838440047236328">узнать планировку комнаты, в которой вы находитесь.</translation> <translation id="4662788913887017617">Поделитесь закладкой с iPhone</translation> <translation id="4663373278480897665">Доступ к камере разрешен</translation> <translation id="4664482161435122549">Ошибка экспорта PKCS #12</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">Стартовая страница изменена на <ph name="URL" />.</translation> <translation id="4902546322522096650">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус защиты – "<ph name="SECURITY_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, подключение</translation> <translation id="49027928311173603">Скачанная с сервера политика недействительна: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Настройте общие папки сети. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Этот файл скачивают редко. Возможно, он вредоносный.</translation> <translation id="4907306957610201395">Категория разрешения</translation> <translation id="4908811072292128752">Откройте новую вкладку, чтобы перейти на другой сайт, не закрывая предыдущий</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">Активация...</translation> <translation id="5039804452771397117">Разрешить</translation> <translation id="5042282098504489593">Откройте настройки, чтобы подключить устройство <ph name="USB_DEVICE_NAME" /> к Linux</translation> +<translation id="5043913660911154449">Или укажите PPD-файл для принтера. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Неправильный пароль</translation> <translation id="504561833207953641">Окно или вкладка откроются в текущем сеансе браузера.</translation> <translation id="5047421709274785093">Запретить сайтам использовать датчики движения и освещенности</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">Значение этого параметра может изменить только взрослый пользователь.</translation> <translation id="5466374726908360271">Вст&авить и найти "<ph name="SEARCH_TERMS" />"</translation> <translation id="5468173180030470402">Поиск общих папок…</translation> +<translation id="5470735824776589490">Перед сбросом настроек с помощью функции Powerwash необходимо перезагрузить устройство. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Здравствуйте! Я буду озвучивать для вас текст.</translation> <translation id="5472133193607270166">Когда эта настройка включена, сайты не могут отслеживать ваши действия в браузере для показа персонализированной рекламы. Некоторые сайты могут работать некорректно.</translation> <translation id="5473333559083690127">Повторно введите новый PIN-код</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">Управление</translation> <translation id="5499313591153584299">Этот файл может быть опасен для вашего компьютера.</translation> <translation id="5502500733115278303">Импортированные из Firefox</translation> +<translation id="5505264765875738116">Сайты не могут запрашивать разрешения на отправку уведомлений</translation> <translation id="5505307013568720083">Закончились чернила</translation> <translation id="5507756662695126555">Без отказа</translation> <translation id="5509693895992845810">Сохранить как...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">Настройки</translation> <translation id="5804175651771201311">Роуминг отключен</translation> <translation id="5804241973901381774">Разрешения</translation> +<translation id="5804427196348435412">Использование устройств с функцией NFC</translation> <translation id="5805697420284793859">Менеджер окон</translation> <translation id="5806773519584576205">0° (по умолчанию)</translation> <translation id="5811750797187914944">Готово</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">Развернуть</translation> <translation id="6096326118418049043">Имя X.500</translation> <translation id="6097480669505687979">Если вы не освободите пространство, пользователи и их данные могут быть удалены автоматически.</translation> +<translation id="6097600385983390082">Оверлей голосового поиска закрыт</translation> <translation id="6098793583803863900">Неизвестный файл проверяется на наличие опасного контента.</translation> <translation id="6100736666660498114">Меню "Пуск"</translation> <translation id="6101226222197207147">Добавлено новое приложение (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">Использовать голос вместо клавиатуры по умолчанию</translation> <translation id="6234474535228214774">Ожидание установки…</translation> <translation id="6237816943013845465">Позволяет настроить разрешение экрана</translation> +<translation id="6238624845858322552">Подключение к Bluetooth-устройству</translation> <translation id="6238767809035845642">Текст, полученный с другого устройства</translation> <translation id="6238923052227198598">Показывать последнюю заметку на заблокированном экране</translation> <translation id="6239558157302047471">Перезагрузить &фрейм</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, телефон – <ph name="PHONE_NAME" />, уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, заряд батареи – <ph name="BATTERY_STATUS" /> %, подключение</translation> <translation id="6268252012308737255">Открыть в приложении <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Сайты могут запрашивать разрешения на отправку уведомлений</translation> <translation id="6270770586500173387">Отправлять <ph name="BEGIN_LINK1" />информацию о системе и приложениях<ph name="END_LINK1" /> и различные <ph name="BEGIN_LINK2" />показатели<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">При скачивании плагина произошла ошибка (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Качество</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">Аккаунт</translation> <translation id="6298962879096096191">Использование Google Play для установки приложений Android</translation> <translation id="630065524203833229">В&ыход</translation> +<translation id="6300718114348072351">Не удалось автоматически настроить принтер "<ph name="PRINTER_NAME" />". Задайте дополнительные параметры. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Общая политика:</translation> <translation id="6307990684951724544">Система перегружена</translation> <translation id="6308493641021088955">Вход через расширение "<ph name="EXTENSION_NAME" />"</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">Инструмент очистки недоступен</translation> <translation id="6556866813142980365">Повторить</translation> <translation id="6557290421156335491">Мои ярлыки</translation> +<translation id="6561560012278703671">Не прерывать мою работу при запросе разрешения на показ уведомлений</translation> <translation id="6561726789132298588">Войти</translation> <translation id="656293578423618167">Слишком длинное название файла или путь к нему. Выберите другое название или каталог.</translation> <translation id="6563469144985748109">Ещё не одобрено администратором</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">Запрашивать разрешение перед отправкой</translation> <translation id="6840184929775541289">Не является Центром сертификации</translation> <translation id="6841186874966388268">Ошибки</translation> +<translation id="6843267103192918276">Войдите в аккаунт, чтобы синхронизировать закладки, историю, пароли и другие настройки на всех своих устройствах. При этом будет автоматически выполнен вход в сервисах Google. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Команда "Окей, Google" настроена</translation> <translation id="6845038076637626672">Развернуть</translation> <translation id="6845325883481699275">Помочь Chrome стать ещё безопаснее</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">Оборудование Hangouts Meet готово к настройке.</translation> <translation id="744341768939279100">Создать профиль</translation> <translation id="7443806024147773267">Войдите в аккаунт Google с любого устройства, чтобы получить доступ ко всем вашим паролям.</translation> -<translation id="7444046173054089907">Сайт заблокирован</translation> <translation id="7444983668544353857">Отключить <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Устанавливайте приложения автоматически</translation> <translation id="7450761244949417357">Открывается <ph name="ALTERNATIVE_BROWSER_NAME" />…</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">Удалить пользователя</translation> <translation id="8215295261562449873">Сохранить резервную копию моих приложений и файлов в папке скачанных файлов перед установкой обновления Linux</translation> <translation id="8217399928341212914">Всегда блокировать автоскачивание нескольких файлов</translation> +<translation id="8218847192766059983">Добавьте языки или измените порядок их расположения. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Обычно вы блокируете уведомления. Чтобы получать их с этого сайта, нажмите здесь.</translation> <translation id="8225265270453771718">Откройте доступ к окну приложения</translation> <translation id="8225753906568652947">Использовать бонусы</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">Изменить</translation> <translation id="9066773882585798925">Позволяет прослушивать текст с экрана.</translation> <translation id="9066782832737749352">Озвучивание текста</translation> +<translation id="9067559831321817373">Управляйте аккаунтами, в которые вы вошли. При наличии разрешений сайты, приложения и расширения в Chrome и Google Play могут использовать данные этих аккаунтов для персонализации сервисов. <a>Подробнее…</a></translation> <translation id="9068849894565669697">Выберите цвет</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index cfb0acd..ffa0bf39 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1755,7 +1755,6 @@ <translation id="347670947055184738">අපොයි! ඔබගේ උපාංගය සඳහා ප්රතිපත්තිය ලබා ගැනීමට පද්ධතිය අසමත් විය.</translation> <translation id="347785443197175480"><ph name="HOST" /> හට ඔබේ කැමරාවට සහ මයික්රෆෝනයට පිවිසීමට අඛණ්ඩව ඉඩ දෙන්න</translation> <translation id="3478685642445675458">පුද්ගලයෙකු ඉවත් කිරීමට පෙර ඔබගේ පැතිකඩ අගුළු හරින්න.</translation> -<translation id="3479539252931486093">මෙය අනපේක්ෂිත ද?<ph name="BEGIN_LINK" />අපට දන්වන්න<ph name="END_LINK" /></translation> <translation id="3479552764303398839">දැන් නොවේ</translation> <translation id="3481268647794498892">තත්පර <ph name="COUNTDOWN_SECONDS" />කින් <ph name="ALTERNATIVE_BROWSER_NAME" /> තුළ විවෘත කෙරේ</translation> <translation id="3484273680291419129">හානිකර මෘදුකාංග ඉවත් කරමින්...</translation> @@ -4487,7 +4486,6 @@ <translation id="7442465037756169001">Your Hangouts Meet hardware is ready to be set up.</translation> <translation id="744341768939279100">නව පැතිකඩ නිර්මාණය කරන්න</translation> <translation id="7443806024147773267">ඔබ ඔබේ Google ගිණුමට පුරනය වී සිටින සැම විටම ඔබේ මුරපද වෙත ප්රවේශ වන්න</translation> -<translation id="7444046173054089907">මෙම අඩවිය අවහිර කර ඇත.</translation> <translation id="7444983668544353857">අක්රිය කරන්න <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">යෙදුම් ස්වයංක්රීයව ස්ථාපන කරන්න</translation> <translation id="7450761244949417357">දැන් <ph name="ALTERNATIVE_BROWSER_NAME" /> තුළ විවෘත කෙරේ</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 980a398..7cf1c3c 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Táto stránka nereaguje</translation> <translation id="1041263367839475438">Dostupné zariadenia</translation> <translation id="1042174272890264476">Váš počítač má tiež vstavanú knižnicu RLZ prehliadača <ph name="SHORT_PRODUCT_NAME" />. Knižnica RLZ priradí nejedinečnú značku, pomocou ktorej sa nedá zistiť totožnosť, na meranie výsledkov a použitia prehliadača <ph name="SHORT_PRODUCT_NAME" /> vyplývajúceho z konkrétnej propagačnej kampane. Tieto menovky sa niekedy zobrazujú v dopytoch Vyhľadávania Google v prehliadači <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Chcete vymazať dáta aj z týchto aplikácií?</translation> <translation id="1045692658517323508">{0,plural, =1{Aktualizujte do 1 minúty}few{Aktualizujte do # minút}many{Aktualizujte do # minúty}other{Aktualizujte do # minút}}</translation> <translation id="1046635659603195359">Zdá sa, že ste už funkciu Voice Match nastavili pomocou Asistenta Google v inom zariadení. Tieto predchádzajúce záznamy môžete použiť na vytvorenie hlasového modelu v tomto zariadení. Malo by to trvať menej ako minútu.</translation> <translation id="1047431265488717055">Kopírovať te&xt odkazu</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Získajte inteligentné doplnky Googlu v Chrome</translation> <translation id="1147991416141538220">Ak chcete požiadať o prístup, kontaktujte správcu tohto zariadenia.</translation> <translation id="1149401351239820326">Mesiac vypršania platnosti</translation> +<translation id="1150490752229770117">Toto je posledná automatická aktualizácia softvéru a zabezpečenia pre toto zariadenie (<ph name="DEVICE_TYPE" />). Ak chcete v budúcnosti dostávať aktualizácie, prejdite na novší model. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Slnečné okuliare</translation> <translation id="1151917987301063366">Vždy povoliť webu <ph name="HOST" /> prístup k senzorom</translation> <translation id="1153356358378277386">Spárované zariadenia</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Vyberte tiket, ktorý sa má použiť na overenie. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Uložte si toto heslo na svojom zariadení iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> chce natrvalo ukladať dáta v miestnom počítači</translation> +<translation id="1714644264617423774">Povoliť funkcie dostupnosti zjednodušujúce používanie zariadenia. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Senzory pohybu</translation> +<translation id="171824261579749339">Austrálske <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Posledná hodina</translation> <translation id="1719312230114180055">Poznámka: Odtlačok môže byť menej bezpečný ako silné heslo alebo kód PIN.</translation> <translation id="1720318856472900922">Overenie WWW servera protokolom TLS</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Vymazať súbory cookie tretej strany</translation> <translation id="2097372108957554726">Ak chcete registrovať nové zariadenia, musíte sa prihlásiť do prehliadača Chrome</translation> <translation id="2099172618127234427">Aktivujete funkcie ladenia systému OS Chrome, ktoré nastavia démona sshd a umožnia spúšťanie z jednotiek USB.</translation> +<translation id="2099625543891475722">vašich fyzických vlastnostiach, napríklad výške;</translation> <translation id="2099686503067610784">Odstrániť certifikát servera „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="2100273922101894616">Automaticky prihlasovať</translation> <translation id="2101225219012730419">Verzia:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">Vytvoriť nový profil</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> chce overiť vašu totožnosť</translation> <translation id="2448312741937722512">Typ</translation> +<translation id="2448734521821581858">Súbory cookie sú vytvárané webmi, ktoré navštívite. Existujú dva typy súborov cookie: súbory cookie hostiteľskej domény sú vytvorené webom, ktorý navštívite. Tento web je uvedený v paneli s adresou. Súbory cookie tretích strán sú vytvárané ďalšími webmi. Tieto weby sú vlastníkmi niektorého obsahu (napríklad reklám alebo obrázkov), ktorý sa vám pri ich návšteve zobrazuje.</translation> <translation id="2450223707519584812">Nebudete môcť pridať používateľov, pretože chýbajú kľúče rozhrania Google API. Podrobnosti si môžete prečítať na adrese <ph name="DETAILS_URL" />.</translation> <translation id="2450849356604136918">Žiadne aktívne zobrazenia</translation> <translation id="2451298179137331965">2x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">Časový limit uplynul</translation> <translation id="2588636910004461974">Zariadenia od dodávateľa <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Vyhľadávajte na Googli alebo zadajte webovú adresu</translation> +<translation id="2600522410036850735">Toto zariadenie bude do <ph name="MONTH_AND_YEAR" /> dostávať automatické aktualizácie softvéru a zabezpečenia. <a target="_blank" href="<ph name="URL" />">Ďalšie informácie</a></translation> <translation id="2603115962224169880">Vyčistiť počítač</translation> <translation id="2603463522847370204">Otvoriť v okne &inkognito</translation> <translation id="2604255671529671813">Chyba sieťového pripojenia</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">Bezpečné prehliadanie (chráni vás aj zariadenie pred nebezpečnými webmi)</translation> <translation id="3182749001423093222">Kontrola pravopisu</translation> <translation id="3183139917765991655">Profile Importer</translation> +<translation id="3184536091884214176">Nastaviť alebo spravovať tlačiarne CUPS. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Moje súbory</translation> <translation id="3188465121994729530">Kĺzavý priemer</translation> <translation id="3190558889382726167">Heslo bolo uložené</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">Ojoj! Systému sa nepodarilo načítať pravidlo pre vaše zariadenie.</translation> <translation id="347785443197175480">Aj naďalej povoliť stránkam <ph name="HOST" /> prístup ku kamere a mikrofónu</translation> <translation id="3478685642445675458">Skôr ako odstránite osobu, odomknite svoj profil.</translation> -<translation id="3479539252931486093">Neočakávali ste to? <ph name="BEGIN_LINK" />Dajte nám vedieť<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Teraz nie</translation> <translation id="3481268647794498892">O <ph name="COUNTDOWN_SECONDS" /> s sa otvorí v prehliadači <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> <translation id="3484273680291419129">Odstraňujte sa škodlivý softvér…</translation> @@ -2256,6 +2263,7 @@ <translation id="4138267921960073861">Zobraziť používateľské mená a fotografie na prihlasovacej obrazovke</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – bolo pripojené zariadenie HID</translation> <translation id="4142052906269098341">Odomykajte zariadenie <ph name="DEVICE_TYPE" /> svojím telefónom. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Uložte rozpoznané tlačiarne do svojho profilu alebo pridajte novú. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Získajte kvalitnejšie video a predĺžte výdrž batérie. Video sa bude prehrávať iba na obrazovke podporujúcej Cast.</translation> <translation id="4146026355784316281">Vždy otvárať pomocou systémového zobrazovača</translation> <translation id="4146785383423576110">Resetovať a vyčistiť</translation> @@ -2380,6 +2388,7 @@ <translation id="4364327530094270451">Dyňa</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> zdieľa okno.</translation> <translation id="4364830672918311045">Zobrazovať upozornenia</translation> +<translation id="436499142539576997">Dáta aplikácie sa nepodarilo získať. Pokus o spustenie aplikácie stále prebieha…</translation> <translation id="4370975561335139969">Zadaný e-mail a heslo nesúhlasia.</translation> <translation id="437184764829821926">Rozšírené nastavenia písma</translation> <translation id="4374831787438678295">Inštalátor systému Linux</translation> @@ -2570,6 +2579,7 @@ <translation id="465878909996028221">Presmerovania prehliadača podporujú iba protokoly http, https a file.</translation> <translation id="4659077111144409915">Primárny účet</translation> <translation id="4660476621274971848">Očakávaná verzia bola „<ph name="EXPECTED_VERSION" />“. Skutočná verzia bola „<ph name="NEW_ID" />“.</translation> +<translation id="4660838440047236328">rozložení vašej miestnosti.</translation> <translation id="4662788913887017617">Zdieľajte túto záložku so zariadením iPhone</translation> <translation id="4663373278480897665">Kamera je povolená</translation> <translation id="4664482161435122549">Chyba exportovania súborov PKCS #12</translation> @@ -2733,6 +2743,7 @@ <translation id="4900392736118574277">Vaša stránka pri spustení bola zmenená na <ph name="URL" />.</translation> <translation id="4902546322522096650"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" /> %, pripojenie</translation> <translation id="49027928311173603">Pravidlo stiahnuté zo servera je neplatné: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Nastaviť alebo spravovať sieťové zdieľané úložiská. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Tento súbor sa bežne nesťahuje a môže byť nebezpečný.</translation> <translation id="4907306957610201395">Kategória povolení</translation> <translation id="4908811072292128752">Otvorte novú kartu a prehliadajte dva weby súčasne</translation> @@ -2820,6 +2831,7 @@ <translation id="5038863510258510803">Prebieha povoľovanie...</translation> <translation id="5039804452771397117">Povoliť</translation> <translation id="5042282098504489593">Ak chcete pripojiť zariadenie <ph name="USB_DEVICE_NAME" /> k systému Linux, otvorte Nastavenia</translation> +<translation id="5043913660911154449">Prípadne špecifikuje PPD svojej tlačiarne <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Nesprávne heslo</translation> <translation id="504561833207953641">Otvára sa v existujúcej relácii prehliadača.</translation> <translation id="5047421709274785093">Zakázať webom používať senzory pohybu a svetla</translation> @@ -3105,6 +3117,7 @@ <translation id="5464660706533281090">Toto nastavenie nemôže zmeniť používateľ, ktorý je dieťa.</translation> <translation id="5466374726908360271">Prilepiť a &vyhľadať „<ph name="SEARCH_TERMS" />“</translation> <translation id="5468173180030470402">Hľadajú sa zdieľané úložiská</translation> +<translation id="5470735824776589490">Pred resetovaním zariadenia pomocou funkcie Powerwash sa vyžaduje jeho reštart. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Dobrý deň, som hlas prevodu textu na reč.</translation> <translation id="5472133193607270166">Keď je táto možnosť zapnutá, weby nemôžu prispôsobovať reklamy na základe vašej aktivity prehliadania na rôznych stránkach. Niektoré weby nemusia fungovať správne.</translation> <translation id="5473333559083690127">Opätovné zadanie nového kódu PIN</translation> @@ -3128,6 +3141,7 @@ <translation id="5496587651328244253">Usporiadať</translation> <translation id="5499313591153584299">Tento súbor môže poškodiť váš počítať.</translation> <translation id="5502500733115278303">Importované z Firefoxu</translation> +<translation id="5505264765875738116">Weby nemôžu žiadať o odosielanie upozornení</translation> <translation id="5505307013568720083">Minul sa atrament</translation> <translation id="5507756662695126555">Zrušenie zamietnutia</translation> <translation id="5509693895992845810">Uložiť &ako...</translation> @@ -3342,6 +3356,7 @@ <translation id="5801568494490449797">Predvoľby</translation> <translation id="5804175651771201311">Roaming je vypnutý</translation> <translation id="5804241973901381774">Povolenia</translation> +<translation id="5804427196348435412">Používať zariadenia s technológiou NFC</translation> <translation id="5805697420284793859">Správca okien</translation> <translation id="5806773519584576205">0° (predvolené)</translation> <translation id="5811750797187914944">Hotovo</translation> @@ -3557,6 +3572,7 @@ <translation id="6096047740730590436">Otvoriť maximalizované</translation> <translation id="6096326118418049043">Názov X.500</translation> <translation id="6097480669505687979">Ak neuvoľníte miesto, môže dôjsť k automatickému odstráneniu používateľov a dát.</translation> +<translation id="6097600385983390082">Hlasové vyhľadávanie bolo uzatvorené</translation> <translation id="6098793583803863900">V neznámom súbore sa kontroluje prítomnosť nebezpečného obsahu.</translation> <translation id="6100736666660498114">Ponuka Štart</translation> <translation id="6101226222197207147">Bola pridaná nová aplikácia (<ph name="EXTENSION_NAME" />)</translation> @@ -3652,6 +3668,7 @@ <translation id="6233154960150021497">Predvolene používať namiesto klávesnice hlas</translation> <translation id="6234474535228214774">Inštalácia čaká na spracovanie</translation> <translation id="6237816943013845465">Umožňuje nastaviť rozlíšenie obrazovky</translation> +<translation id="6238624845858322552">Pripojenie zariadenia s rozhraním Bluetooth</translation> <translation id="6238767809035845642">Text zdieľaný z iného zariadenia</translation> <translation id="6238923052227198598">Zobrazovať poslednú poznámku na uzamknutej obrazovke</translation> <translation id="6239558157302047471">Znova načítať prvok &frame</translation> @@ -3678,6 +3695,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, sila signálu <ph name="SIGNAL_STRENGTH" /> %, batéria telefónu <ph name="BATTERY_STATUS" /> %, pripojenie</translation> <translation id="6268252012308737255">Otvoriť pomocou aplikácie <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Weby môžu žiadať o odosielanie upozornení</translation> <translation id="6270770586500173387">Posielať <ph name="BEGIN_LINK1" />informácie o systéme a aplikáciách<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />metriky<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Pri sťahovaní doplnku došlo k chybe (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">Kvalita</translation> @@ -3699,6 +3717,7 @@ <translation id="629730747756840877">Účet</translation> <translation id="6298962879096096191">Inštalácia aplikácií pre Android pomocou služby Google Play</translation> <translation id="630065524203833229">U&končiť</translation> +<translation id="6300718114348072351">Tlačiareň <ph name="PRINTER_NAME" /> sa nepodarilo automaticky nakonfigurovať. Špecifikujte rozšírené podrobnosti o tlačiarni. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Globálne pravidlá:</translation> <translation id="6307990684951724544">Systém je zaneprázdnený</translation> <translation id="6308493641021088955">Prihlásenie poskytuje <ph name="EXTENSION_NAME" /></translation> @@ -3868,6 +3887,7 @@ <translation id="6555810572223193255">Vyčistenie momentálne nie je k dispozícii</translation> <translation id="6556866813142980365">Znova</translation> <translation id="6557290421156335491">Moje skratky</translation> +<translation id="6561560012278703671">Použiť tichšie správy (blokovanie vyrušovania upozorneniami)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Názov súboru alebo cesta má veľa znakov. Uložte súbor pod kratším názvom alebo inde.</translation> <translation id="6563469144985748109">Váš správca to zatiaľ neschválil</translation> @@ -4051,6 +4071,7 @@ <translation id="6840155290835956714">Spýtať sa pred odoslaním</translation> <translation id="6840184929775541289">Nie je certifikačnou autoritou</translation> <translation id="6841186874966388268">Chyby</translation> +<translation id="6843267103192918276">Prihláste sa a používajte svoje záložky, históriu, heslá a ďalšie nastavenia vo všetkých svojich zariadeniach. Systém vás tiež automaticky prihlási do vašich služieb Googlu. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Výraz „Ok Google“ je nastavený</translation> <translation id="6845038076637626672">Otvoriť maximalizované</translation> <translation id="6845325883481699275">Pomoc so zlepšením zabezpečenia Chromu</translation> @@ -4467,7 +4488,6 @@ <translation id="7442465037756169001">Ovládač Hangouts Meet hardware je pripravený na nastavenie.</translation> <translation id="744341768939279100">Vytvoriť nový profil</translation> <translation id="7443806024147773267">Získajte prístup k svojim heslám, keď sa prihlásite do účtu Google</translation> -<translation id="7444046173054089907">Tento web je blokovaný</translation> <translation id="7444983668544353857">Zakázať zariadenie <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Inštalujte aplikácie automaticky</translation> <translation id="7450761244949417357">Otvára sa v prehliadači <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5031,6 +5051,7 @@ <translation id="8214962590150211830">Odstrániť túto osobu</translation> <translation id="8215295261562449873">Zálohovať moje aplikácie a súbory do priečinka Stiahnuté súbory ešte pred inováciou systému Linux.</translation> <translation id="8217399928341212914">Naďalej blokovať automatické sťahovanie viacerých súborov súčasne</translation> +<translation id="8218847192766059983">Pridajte jazyky alebo upravte poradie zoznamu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Zvyčajne blokujete upozornenia. Ak chcete tomuto webu povoliť odosielanie upozornení, kliknite tu.</translation> <translation id="8225265270453771718">Zdieľanie okna aplikácie</translation> <translation id="8225753906568652947">Uplatniť ponuky</translation> @@ -5644,6 +5665,7 @@ <translation id="9065203028668620118">Upraviť</translation> <translation id="9066773882585798925">Čítanie textu nahlas</translation> <translation id="9066782832737749352">Prevod textu na reč</translation> +<translation id="9067559831321817373">Spravujte účty, do ktorých ste sa prihlásili. Prostredníctvom týchto účtov môžu weby, aplikácie a rozšírenia v Chrome a na Google Play prispôsobovať vaše prostredie (v závislosti od povolení). <a>Ďalšie informácie</a></translation> <translation id="9068849894565669697">Výber farby</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 73fef47..76ed01b 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Ojoj. Sistemu ni uspelo prenesti pravilnika za napravo.</translation> <translation id="347785443197175480">Še naprej omogočaj gostitelju <ph name="HOST" /> dostop do kamere in mikrofona</translation> <translation id="3478685642445675458">Preden odstranite osebo, odklenite profil.</translation> -<translation id="3479539252931486093">Ali tega niste pričakovali? <ph name="BEGIN_LINK" />Sporočite nam<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Ne zdaj</translation> <translation id="3481268647794498892">Odpiranje v brskalniku <ph name="ALTERNATIVE_BROWSER_NAME" /> čez <ph name="COUNTDOWN_SECONDS" /> s</translation> <translation id="3484273680291419129">Odstranjevanje škodljive programske opreme ...</translation> @@ -4492,7 +4491,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware je pripravljen za nastavitev.</translation> <translation id="744341768939279100">Ustvari nov profil</translation> <translation id="7443806024147773267">Dostopajte do svojih gesel, ko ste prijavljeni v račun Google</translation> -<translation id="7444046173054089907">To spletno mesto je blokirano</translation> <translation id="7444983668544353857">Onemogoči <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Samodejno nameščanje aplikacij</translation> <translation id="7450761244949417357">Odpiranje v brskalniku <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index c7210c3..b76e408 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Kjo faqe nuk përgjigjet</translation> <translation id="1041263367839475438">Pajisjet që ofrohen</translation> <translation id="1042174272890264476">Kompjuteri yt vjen po ashtu me bibliotekën RLZ të <ph name="SHORT_PRODUCT_NAME" /> të integruar. Parametri RLZ cakton një etiketë jo unike, jo personalisht të identifikueshme për të matur kërkimet dhe përdorimin e <ph name="SHORT_PRODUCT_NAME" /> të nxitur nga një fushatë promocionale të veçantë. Këto etiketa ndonjëherë shfaqen në pyetjet e "Kërko me Google" në <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Do të pastrosh po ashtu të dhënat nga këto aplikacione?</translation> <translation id="1045692658517323508">{0,plural, =1{Përditësoje brenda 1 minute}other{Përditësoje brenda # minutash}}</translation> <translation id="1046635659603195359">Me sa duket e ke konfiguruar tashmë Voice Match me "Asistentin tënd të Google" në një pajisje tjetër. Këto regjistrime të mëparshme mund të përdoren për të krijuar një model zanor në këtë pajisje. Kjo duhet të kërkojë më pak se një minutë.</translation> <translation id="1047431265488717055">Kopjo tekstin e lidhjes</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Merr funksionet inteligjente të Google në Chrome</translation> <translation id="1147991416141538220">Për të kërkuar qasjen, kontakto me administratorin e kësaj pajisjeje.</translation> <translation id="1149401351239820326">Muaji i skadimit</translation> +<translation id="1150490752229770117">Ky është përditësimi i fundit automatik i softuerit dhe i sigurisë për këtë pajisje <ph name="DEVICE_TYPE" />. Për të marrë përditësime të ardhshme, përmirësoje në një model më të ri. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Syze dielli</translation> <translation id="1151917987301063366">Lejo gjithmonë që <ph name="HOST" /> të qaset te sensorët</translation> <translation id="1153356358378277386">Pajisjet e çiftuara</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Zgjidh një biletë për ta përdorur për vërtetim. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Merre këtë fjalëkalim në telefonin tënd iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> kërkon të ruajë të dhëna në mënyrë të përhershme në kompjuterin tënd lokal</translation> +<translation id="1714644264617423774">Aktivizo veçoritë e qasshmërisë për ta bërë më të lehtë përdorimin e pajisjes. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensorët e lëvizjes</translation> +<translation id="171824261579749339">Australian <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Ora e fundit</translation> <translation id="1719312230114180055">Shënim. Gjurma jote e gishtit mund të jetë më pak e sigurt se një fjalëkalim ose një kod PIN i fortë.</translation> <translation id="1720318856472900922">Vërtetimi i serverit TLS WWW</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Pastro kukit e palëve të treta</translation> <translation id="2097372108957554726">Duhet të identifikohesh te Chrome për të regjistruar pajisjet e tua</translation> <translation id="2099172618127234427">Po aktivizon funksionet e korrigjimit të sistemit operativ Chrome që do të konfigurojnë sshd daemon dhe do të aktivizojnë fillimin nga disqet USB.</translation> +<translation id="2099625543891475722">karakteristikat e tua fizike, si gjatësia</translation> <translation id="2099686503067610784">Dëshiron ta fshish certifikatën "<ph name="CERTIFICATE_NAME" />" të serverit?</translation> <translation id="2100273922101894616">Identifikohu automatikisht</translation> <translation id="2101225219012730419">Versioni:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Krijo një profil të ri</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> dëshiron të verifikojë identitetin tënd</translation> <translation id="2448312741937722512">Shkruaj</translation> +<translation id="2448734521821581858">Kukit janë skedarë të krijuar nga sajtet e uebit që viziton ti. Ka dy lloje kukish: Kukit e palëve të para krijohen nga sajti që viziton ti. Sajti shfaqet në shiritin e kërkimit. Kukit e palëve të treta krijohen nga sajte të tjera. Këto sajte zotërojnë disa nga përmbajtjet, si p.sh. reklamat ose imazhet, që ti shikon në sajtin e uebit që viziton.</translation> <translation id="2450223707519584812">Nuk do të jesh në gjendje të shtosh përdorues sepse mungojnë çelësat e API Google. Shiko <ph name="DETAILS_URL" /> për detaje.</translation> <translation id="2450849356604136918">Nuk ka shikime aktive</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Skadoi</translation> <translation id="2588636910004461974">Pajisjet nga <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Kërko në Google ose shkruaj URL-në</translation> +<translation id="2600522410036850735">Kjo pajisje do të marrë përditësime automatike të softuerëve dhe të sigurisë deri në <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Mëso më shumë</a></translation> <translation id="2603115962224169880">Pastro kompjuterin</translation> <translation id="2603463522847370204">Hape në &dritare "të fshehtë"</translation> <translation id="2604255671529671813">Gabim në lidhjen e rrjetit</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">"Shfletimi i sigurt" (të mbron ty dhe pajisjen tënde nga sajtet e rrezikshme)</translation> <translation id="3182749001423093222">Kontrolli drejtshkrimor</translation> <translation id="3183139917765991655">Importuesi i profilit</translation> +<translation id="3184536091884214176">Konfiguro ose menaxho printerët CUPS. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Skedarët e mi</translation> <translation id="3188465121994729530">Mesatarja e lëvizshme</translation> <translation id="3190558889382726167">Fjalëkalimi u ruajt</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">Mos! Sistemi nuk arriti të marrë politikën për pajisjen tënde.</translation> <translation id="347785443197175480">Vazhdo të lejosh <ph name="HOST" /> që të qaset te kamera dhe mikrofoni</translation> <translation id="3478685642445675458">Shkyçe profilin tënd para se ta heqësh një person.</translation> -<translation id="3479539252931486093">Ishte e papritur kjo? <ph name="BEGIN_LINK" />Na njofto<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Jo tani</translation> <translation id="3481268647794498892">Po hapet në <ph name="ALTERNATIVE_BROWSER_NAME" /> pas <ph name="COUNTDOWN_SECONDS" /> sekondash</translation> <translation id="3484273680291419129">Po hiqet softueri keqdashës...</translation> @@ -2254,6 +2261,7 @@ <translation id="4138267921960073861">Shfaq emrat e përdoruesit dhe fotografitë në ekranin e identifikimit</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - pajisja HID u lidh</translation> <translation id="4142052906269098341">Shkyç <ph name="DEVICE_TYPE" /> me telefonin tënd. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Ruaji printerët e zbuluar në profilin tënd ose shto një printer të ri. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Merr video me cilësi më të mirë dhe kurse kohëzgjatjen e baterisë. Videoja do të luhet vetëm në ekranin që mbështet transmetime.</translation> <translation id="4146026355784316281">Hape gjithmonë me shikuesin e sistemit</translation> <translation id="4146785383423576110">Rivendos dhe pastro</translation> @@ -2378,6 +2386,7 @@ <translation id="4364327530094270451">Pjepër</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> po ndan një dritare.</translation> <translation id="4364830672918311045">Shfaq njoftimet</translation> +<translation id="436499142539576997">Marrja e të dhënave të aplikacionit dështoi, por po përpiqemi përsëri të ekzekutojmë aplikacionin...</translation> <translation id="4370975561335139969">Mail-i dhe fjalëkalimi që ke futur nuk përputhen</translation> <translation id="437184764829821926">Cilësimet e përparuara të shkrimeve</translation> <translation id="4374831787438678295">Instaluesi për Linux</translation> @@ -2568,6 +2577,7 @@ <translation id="465878909996028221">Për ridrejtimet e shfletuesve mbështeten vetëm protokollet http, https dhe të skedarëve.</translation> <translation id="4659077111144409915">Llogaria parësore</translation> <translation id="4660476621274971848">Versioni i pritur ishte "<ph name="EXPECTED_VERSION" />", por versioni rezultoi "<ph name="NEW_ID" />".</translation> +<translation id="4660838440047236328">struktura e dhomës</translation> <translation id="4662788913887017617">Ndaje këtë faqeshënues me telefonin tënd iPhone</translation> <translation id="4663373278480897665">Kamera lejohet</translation> <translation id="4664482161435122549">Gabim në eksport PKCS #12</translation> @@ -2731,6 +2741,7 @@ <translation id="4900392736118574277">Faqja e nisjes u ndryshua në <ph name="URL" />.</translation> <translation id="4902546322522096650">Rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />%, lidhu</translation> <translation id="49027928311173603">Politika e shkarkuar nga serveri është e pavlefshme: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Konfiguro ose menaxho ndarjet e skedarëve në rrjet. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Ky skedar nuk shkarkohet zakonisht dhe mund të jetë i rrezikshëm.</translation> <translation id="4907306957610201395">Kategoria e lejes</translation> <translation id="4908811072292128752">Hap një skedë të re për të shfletuar dy sajte njëkohësisht</translation> @@ -2818,6 +2829,7 @@ <translation id="5038863510258510803">Po aktivizohet...</translation> <translation id="5039804452771397117">Lejo</translation> <translation id="5042282098504489593">Hap "Cilësimet" për ta lidhur <ph name="USB_DEVICE_NAME" /> me Linux</translation> +<translation id="5043913660911154449">Ose specifiko skedarin PPD të printerit <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Fjalëkalim i gabuar</translation> <translation id="504561833207953641">Po hapet në sesionin ekzistues të shfletuesit.</translation> <translation id="5047421709274785093">Blloko sajtet nga përdorimi i sensorëve të lëvizjes dhe të dritës</translation> @@ -3103,6 +3115,7 @@ <translation id="5464660706533281090">Ky cilësim nuk mund të ndryshohet nga një përdorues fëmijë.</translation> <translation id="5466374726908360271">Ngj&it dhe kërko për “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Po kërkon për ndarjet e skedarëve</translation> +<translation id="5470735824776589490">Kërkohet një rinisje para se pajisja jote të mund të rivendoset me Powerwash. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Përshëndetje! Unë jam zëri i tekstit në ligjërim.</translation> <translation id="5472133193607270166">Kur është aktive, sajtet nuk mund t'i përdorin të dhënat e shfletimit nëpër sajte të ndryshme për t'i personalizuar reklamat. Disa sajte mund të mos punojnë mirë.</translation> <translation id="5473333559083690127">Fut përsëri kodin e ri PIN</translation> @@ -3126,6 +3139,7 @@ <translation id="5496587651328244253">Organizo</translation> <translation id="5499313591153584299">Ky skedar mund të jetë i dëmshëm për kompjuterin tënd.</translation> <translation id="5502500733115278303">Importuar nga Firefox</translation> +<translation id="5505264765875738116">Sajtet nuk mund të kërkojnë të dërgojnë njoftime</translation> <translation id="5505307013568720083">Nuk ka bojë</translation> <translation id="5507756662695126555">Anulimi i mospranimit</translation> <translation id="5509693895992845810">Ruaje &si...</translation> @@ -3340,6 +3354,7 @@ <translation id="5801568494490449797">Preferencat</translation> <translation id="5804175651771201311">Roaming joaktiv</translation> <translation id="5804241973901381774">Lejet</translation> +<translation id="5804427196348435412">Përdor pajisjet me NFC</translation> <translation id="5805697420284793859">Menaxheri i dritareve</translation> <translation id="5806773519584576205">0° (parazgjedhja)</translation> <translation id="5811750797187914944">Plotësisht gati</translation> @@ -3555,6 +3570,7 @@ <translation id="6096047740730590436">Hape të zmadhuar</translation> <translation id="6096326118418049043">Emri X.500</translation> <translation id="6097480669505687979">Nëse nuk liron hapësirë, përdoruesit dhe të dhënat mund të hiqen automatikisht.</translation> +<translation id="6097600385983390082">Kërkimi me zë u mbyll</translation> <translation id="6098793583803863900">Një skedar i panjohur po skanohet për përmbajtje të rrezikshme.</translation> <translation id="6100736666660498114">Menyja e nisjes</translation> <translation id="6101226222197207147">U shtua aplikacion i ri (<ph name="EXTENSION_NAME" />)</translation> @@ -3650,6 +3666,7 @@ <translation id="6233154960150021497">Cakto si parazgjedhje përdorimin e zërit në vend të tastierës</translation> <translation id="6234474535228214774">Instalimi në pritje</translation> <translation id="6237816943013845465">Të lejon të personalizosh rezolucionin e ekranit</translation> +<translation id="6238624845858322552">Lidhu me pajisjen me Bluetooth</translation> <translation id="6238767809035845642">Teksti i ndarë nga pajisje tjetër</translation> <translation id="6238923052227198598">Mbaj shënimin më të fundit në ekranin e kyçjes</translation> <translation id="6239558157302047471">Ringarko &kornizën</translation> @@ -3676,6 +3693,7 @@ <translation id="6267547857941397424">Rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />%, bateria e telefonit <ph name="BATTERY_STATUS" />%, lidhu</translation> <translation id="6268252012308737255">Hape me <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Sajtet mund të kërkojnë të dërgojnë njoftime</translation> <translation id="6270770586500173387">Dërgo <ph name="BEGIN_LINK1" />informacionet e sistemit dhe të aplikacionit<ph name="END_LINK1" />, si dhe <ph name="BEGIN_LINK2" />metrikën<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Ndodhi një gabim (<ph name="ERROR" />) gjatë shkarkimit të përbërësit shtesë.</translation> <translation id="6273677812470008672">Cilësia</translation> @@ -3697,6 +3715,7 @@ <translation id="629730747756840877">Llogaria</translation> <translation id="6298962879096096191">Përdor Google Play për të instaluar aplikacionet e Android</translation> <translation id="630065524203833229">D&il</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> nuk mund të konfigurohej automatikisht. Përcakto detajet e përparuara të printerit. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Politika globale:</translation> <translation id="6307990684951724544">Sistemi është i zënë</translation> <translation id="6308493641021088955">Identifikimi ofrohet nga <ph name="EXTENSION_NAME" /></translation> @@ -3866,6 +3885,7 @@ <translation id="6555810572223193255">Pastrimi aktualisht nuk ofrohet</translation> <translation id="6556866813142980365">Ribëje</translation> <translation id="6557290421156335491">Shkurtoret e mia</translation> +<translation id="6561560012278703671">Përdor mesazhe më të qeta (bllokon kërkesat e njoftimeve që mos të të ndërpresin)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Shtegu ose emri i skedarit është tepër i gjatë. Ruaje me një emër më të shkurtër ose në një vendndodhje tjetër.</translation> <translation id="6563469144985748109">Menaxheri yt nuk e ka miratuar ende</translation> @@ -4049,6 +4069,7 @@ <translation id="6840155290835956714">Pyet përpara dërgimit</translation> <translation id="6840184929775541289">Nuk është një autoritet certifikimi</translation> <translation id="6841186874966388268">Gabimet</translation> +<translation id="6843267103192918276">Identifikohu për të marrë faqeshënuesit, historikun, fjalëkalimet dhe cilësime të tjera në të gjitha pajisjet e tua. Do të identifikohesh gjithashtu automatikisht në shërbimet e tua të Google. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="6843423766595476978">"Ok Google" është plotësisht gati</translation> <translation id="6845038076637626672">Hape të zmadhuar</translation> <translation id="6845325883481699275">Ndihmo në përmirësimin e sigurisë së Chrome</translation> @@ -4465,7 +4486,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware është i gatshëm të konfigurohet.</translation> <translation id="744341768939279100">Krijo një profil të ri</translation> <translation id="7443806024147773267">Merr qasjen te fjalëkalimet e tua kur je identifikuar në "Llogarinë tënde të Google"</translation> -<translation id="7444046173054089907">Ky sajt është i bllokuar</translation> <translation id="7444983668544353857">Çaktivizoje <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Instalo automatikisht aplikacionet</translation> <translation id="7450761244949417357">Po hapet në <ph name="ALTERNATIVE_BROWSER_NAME" /> tani</translation> @@ -5028,6 +5048,7 @@ <translation id="8214962590150211830">Hiqe këtë person</translation> <translation id="8215295261562449873">Rezervo aplikacionet dhe skedarët e mi në dosjen "Shkarkimet" përpara se të përmirësosh Linux.</translation> <translation id="8217399928341212914">Vazhdo bllokimin e shkarkimeve automatike të shumë skedarëve</translation> +<translation id="8218847192766059983">Shto gjuhën ose rendit përsëri listën. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Ti i bllokon zakonisht njoftimet. Për ta lejuar këtë sajt që të të njoftojë, kliko këtu.</translation> <translation id="8225265270453771718">Ndaj një dritare të aplikacionit</translation> <translation id="8225753906568652947">Përdor ofertat e tua</translation> @@ -5641,6 +5662,7 @@ <translation id="9065203028668620118">Redakto</translation> <translation id="9066773882585798925">Dëgjoje tekstin të lexuar me zë të lartë</translation> <translation id="9066782832737749352">Teksti në të folur</translation> +<translation id="9067559831321817373">Menaxho llogaritë ku je identifikuar. Sajtet e uebit, aplikacionet dhe shtesat në Chrome dhe Google Play mund t'i përdorin këto llogari për të personalizuar përvojën tënde, në varësi të lejeve. <a>Mëso më shumë</a></translation> <translation id="9068849894565669697">Zgjidh ngjyrën</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth-i</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index a0a70c8..641c5c9 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1755,7 +1755,6 @@ <translation id="347670947055184738">Упс! Систем није успео да преузме смернице за уређај.</translation> <translation id="347785443197175480">И даље дозвољавај сајту <ph name="HOST" /> да приступа камери и микрофону</translation> <translation id="3478685642445675458">Откључајте профил да бисте уклонили особу.</translation> -<translation id="3479539252931486093">Да ли је ово било неочекивано? <ph name="BEGIN_LINK" />Обавестите нас<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не сада</translation> <translation id="3481268647794498892">Отвара се у прегледачу <ph name="ALTERNATIVE_BROWSER_NAME" /> за <ph name="COUNTDOWN_SECONDS" /> сек</translation> <translation id="3484273680291419129">Штетан софтвер се уклања...</translation> @@ -4489,7 +4488,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware је спреман за подешавање.</translation> <translation id="744341768939279100">Направи нови профил</translation> <translation id="7443806024147773267">Приступајте лозинкама увек када сте пријављени на Google налог</translation> -<translation id="7444046173054089907">Овај сајт је блокиран</translation> <translation id="7444983668544353857">Онемогући <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Аутоматски инсталира апликације</translation> <translation id="7450761244949417357">Сада се отвара у прегледачу <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index eda990c..336e2cb 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1758,7 +1758,6 @@ <translation id="347670947055184738">Hoppsan! Det gick inte att hämta enhetsprincipen.</translation> <translation id="347785443197175480">Fortsätt tillåta att <ph name="HOST" /> använder kameran och mikrofonen</translation> <translation id="3478685642445675458">Du måste låsa upp din profil innan du kan ta bort en person.</translation> -<translation id="3479539252931486093">Var det här oväntat? <ph name="BEGIN_LINK" />Meddela oss<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Inte nu</translation> <translation id="3481268647794498892">Öppnas i <ph name="ALTERNATIVE_BROWSER_NAME" /> om <ph name="COUNTDOWN_SECONDS" /> sekunder</translation> <translation id="3484273680291419129">Den skadliga programvaran tas bort …</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware är klar att konfigurera.</translation> <translation id="744341768939279100">Skapa en ny profil</translation> <translation id="7443806024147773267">Få tillgång till dina lösenord när du är inloggad på Google-kontot</translation> -<translation id="7444046173054089907">Webbplatsen är blockerad</translation> <translation id="7444983668544353857">Inaktivera <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Installera appar automatiskt</translation> <translation id="7450761244949417357">Öppnas i <ph name="ALTERNATIVE_BROWSER_NAME" /> nu</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 877b611..5bffe48 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Ukurasa huu haufanyi kazi</translation> <translation id="1041263367839475438">Vifaa vinavyopatikana</translation> <translation id="1042174272890264476">Kompyuta yako pia huja na maktaba ya <ph name="SHORT_PRODUCT_NAME" /> ya RLZ iliyojengewa ndani. RLZ hutoa lebo isiyo ya kipekee, isiyotambulika kibinafsi ili kupima utafutaji na matumizi ya <ph name="SHORT_PRODUCT_NAME" /> yanayoendeshwa na kampeni husika ya ukwezaji. Lebo hizi wakati mwingine hutokea katika hoja za Huduma ya Tafuta na Google katika <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Pia, futa data kutoka kwenye programu hizi?</translation> <translation id="1045692658517323508">{0,plural, =1{Sasisha ndani ya dakika 1}other{Sasisha ndani ya dakika #}}</translation> <translation id="1046635659603195359">Inaonekana kuwa tayari umeweka mipangilio ya Voice Match katika programu ya Mratibu wa Google kwenye kifaa kingine. Rekodi hizi za awali zinaweza kutumika kutengeneza mfano wa sauti kwenye kifaa hiki. Hatua hii haitachukua zaidi ya dakika moja.</translation> <translation id="1047431265488717055">Nakili Maandishi ya Kiungo</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Pata Google mahiri kwenye Chrome</translation> <translation id="1147991416141538220">Ili uombe uwezo wa kufikia, wasiliana na msimamizi wa kifaa hiki.</translation> <translation id="1149401351239820326">Mwezi wa kuisha kwa muda wa matumizi</translation> +<translation id="1150490752229770117">Hili ndilo sasisho la mwisho la kiotomatiki la programu na usalama wa <ph name="DEVICE_TYPE" />. Ili upate masasisho katika siku zijazo, tumia muundo mpya zaidi. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Miwani</translation> <translation id="1151917987301063366">Ruhusu <ph name="HOST" /> ifikie vitambuzi kila wakati</translation> <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">Chagua tiketi ili uitumie kwenye uthibitishaji. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Pata nenosiri hili kwenye iPhone yako</translation> <translation id="1712552549805331520"><ph name="URL" /> inataka kuhifadhi kabisa data kwenye kompyuta yako ya karibu</translation> +<translation id="1714644264617423774">Washa vipengele vya ufikivu ili ufanye kifaa chako kitumike kwa urahisi. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Vitambuzi vya mwendo</translation> +<translation id="171824261579749339">Kiaustralia <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Saa iliyopita</translation> <translation id="1719312230114180055">Kumbuka: Huenda alama ya kidole chako ikawa si salama sana ikilinganishwa na nenosiri thabiti au PIN.</translation> <translation id="1720318856472900922">Uthibitishaji wa Seva ya TLS WWW</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">Futa vidakuzi vya watu au kampuni nyingine</translation> <translation id="2097372108957554726">Unahitaji kuingia katika akaunti kwenye Chrome ili usajili vifaa vipya</translation> <translation id="2099172618127234427">Unawasha vipengele vya kutatua vya Chrome OS ambavyo vitasanidi sshd daemon na kuwezesha uwashaji kutoka kwenye hifadhi za USB.</translation> +<translation id="2099625543891475722">sifa zako za kimwili, kama vile urefu</translation> <translation id="2099686503067610784">Futa cheti cha seva "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Ingia katika Akaunti Kiotomatiki</translation> <translation id="2101225219012730419">Toleo:</translation> @@ -1024,6 +1029,7 @@ <translation id="2445484935443597917">Unda Wasifu Mpya</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> inataka kuthibitisha utambulisho wako</translation> <translation id="2448312741937722512">Aina</translation> +<translation id="2448734521821581858">Vidakuzi ni faili zinazoundwa na tovuti unazotembelea. Kuna aina mbili za vidakuzi: Vidakuzi vya tovuti zenyewe hutengenezwa na tovuti unayotembelea. Tovuti inaonyeshwa kwenye sehemu ya anwani. Vidakuzi vya tovuti nyingine hutengenezwa na tovuti nyingine. Tovuti hizi zinamiliki baadhi ya maudhui kama vile matangazo au picha ambazo unaona kwenye tovuti unazotembelea.</translation> <translation id="2450223707519584812">Hutaweza kuwaongeza watumiaji kwa sababu funguo za API ya Google hazipo. Angalia <ph name="DETAILS_URL" /> kwa maelezo.</translation> <translation id="2450849356604136918">Haijatazamwa</translation> <translation id="2451298179137331965">2x</translation> @@ -1137,6 +1143,7 @@ <translation id="2587922766792651800">Muda umeisha</translation> <translation id="2588636910004461974">Vifaa kutoka <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Tafuta kwenye Google au charaza URL</translation> +<translation id="2600522410036850735">Kifaa hiki kitapata masasisho ya kiotomatiki ya programu na usalama hadi <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Pata maelezo zaidi</a></translation> <translation id="2603115962224169880">Futa programu hatari kwenye kompyuta yako</translation> <translation id="2603463522847370204">Fungua kwenye dirisha &chini kwa chini</translation> <translation id="2604255671529671813">Hitilafu ya muunganisho wa mtandao</translation> @@ -1557,6 +1564,7 @@ <translation id="3181954750937456830">Kuvinjari Salama (hukulinda wewe na kifaa chako dhidi ya tovuti hatari)</translation> <translation id="3182749001423093222">Kikagua maendelezo</translation> <translation id="3183139917765991655">Kiletaji cha Wasifu</translation> +<translation id="3184536091884214176">Dhibiti au weka mipangilio ya printa za CUPS. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Faili zangu</translation> <translation id="3188465121994729530">Wastani Unaosonga</translation> <translation id="3190558889382726167">Nenosiri limehifadhiwa</translation> @@ -1747,7 +1755,6 @@ <translation id="347670947055184738">Lo! Mfumo umeshindwa kuleta sera ya kifaa chako.</translation> <translation id="347785443197175480">Endelea kuruhusu <ph name="HOST" /> kufikia kamera na maikrofoni yako</translation> <translation id="3478685642445675458">Tafadhali fungua wasifu wako kabla ya kumwondoa mtumiaji.</translation> -<translation id="3479539252931486093">Je, hukutarajia tukio hili? <ph name="BEGIN_LINK" />Tujulishe<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Si sasa</translation> <translation id="3481268647794498892">Inafungua katika <ph name="ALTERNATIVE_BROWSER_NAME" /> baada ya sekunde <ph name="COUNTDOWN_SECONDS" /></translation> <translation id="3484273680291419129">Inaondoa programu hatari...</translation> @@ -2252,6 +2259,7 @@ <translation id="4138267921960073861">Onyesha majina ya watumiaji na picha kwenye skrini ya kuingia</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - Kifaa cha HID kimeunganishwa</translation> <translation id="4142052906269098341">Fungua <ph name="DEVICE_TYPE" /> yako ukitumia simu yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Hifadhi printa zilizotambuliwa kwenye wasifu wako au uweke printa mpya. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Pata video bora na uokoe muda wa matumizi ya betri. Video itacheza tu kwenye skrini inayoweza kutumia Google Cast.</translation> <translation id="4146026355784316281">Fungua Ukitumia Kitazamaji Cha Mfumo Wakati Wowote</translation> <translation id="4146785383423576110">Weka mipangilio upya na ufute programu hatari</translation> @@ -2376,6 +2384,7 @@ <translation id="4364327530094270451">Tikiti</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation> <translation id="4364830672918311045">Onyesha arifa</translation> +<translation id="436499142539576997">Imeshindwa kupata data ya programu, bado inajaribu kutekeleza programu...</translation> <translation id="4370975561335139969">Anwani ya barua pepe na nenosiri uliloweka havilingani</translation> <translation id="437184764829821926">Mipangilio ya kina ya fonti</translation> <translation id="4374831787438678295">Kisakinishaji cha Linux</translation> @@ -2566,6 +2575,7 @@ <translation id="465878909996028221">Ni http, https na itifaki za faili ndizo tu zinazotumika kwenye uelekezaji wa kivinjari kwingine.</translation> <translation id="4659077111144409915">Akaunti ya msingi</translation> <translation id="4660476621274971848">Ilitarajia toleo la "<ph name="EXPECTED_VERSION" />", lakini ilipata toleo la "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">muundo wa chumba chako</translation> <translation id="4662788913887017617">Shiriki alamisho hii na iPhone yako</translation> <translation id="4663373278480897665">Kamera imeruhusiwa</translation> <translation id="4664482161435122549">Hitilafu ya Kuhamisha ya PKCS #12</translation> @@ -2729,6 +2739,7 @@ <translation id="4900392736118574277">Ukurasa wako unaoanza umebadilishwa kuwa <ph name="URL" />.</translation> <translation id="4902546322522096650">Mtandao wa <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Uthabiti wa Mtandao <ph name="SIGNAL_STRENGTH" />%, Unganisha</translation> <translation id="49027928311173603">Sera iliyopakuliwa kutoka kwenye seva ni batili: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Dhibiti au uweke mipangilio ya faili za kushiriki katika mtandao. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Faili hii haipakuliwi kwa kawaida na huenda ikawa hatari.</translation> <translation id="4907306957610201395">Aina ya Ruhusa</translation> <translation id="4908811072292128752">Fungua kichupo kipya ili uvinjari tovuti mbili kwa wakati mmoja</translation> @@ -2816,6 +2827,7 @@ <translation id="5038863510258510803">Inawezesha...</translation> <translation id="5039804452771397117">Ruhusu</translation> <translation id="5042282098504489593">Fungua Mipangilio ili uunganishe <ph name="USB_DEVICE_NAME" /> kwenye Linux</translation> +<translation id="5043913660911154449">Au ubainishe PPD ya printa yako <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation> <translation id="504561833207953641">Inafungua katika kipindi cha kuvinjari kilichopo.</translation> <translation id="5047421709274785093">Zuia tovuti zisitumie vitambuzi vya mwendo na mwangaza</translation> @@ -3101,6 +3113,7 @@ <translation id="5464660706533281090">Mipangilio hii haiwezi kubadilishwa na mtoto.</translation> <translation id="5466374726908360271">Ba&ndika na utafute “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Inatafuta faili za kushiriki</translation> +<translation id="5470735824776589490">Unahitaji kuwasha upya kabla ya kuweka mipangilio kwenye kifaa chako ukitumia Powerwash. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hujambo! Mimi ni sauti yako inayobadilisha maandishi kwenda usemi.</translation> <translation id="5472133193607270166">Ukiwasha, tovuti haziwezi kutumia shughuli zako za kuvinjari kwenye tovuti tofauti ili kukuonyesha matangazo yanayokufaa zaidi. Huenda baadhi ya tovuti zisifanye kazi vizuri.</translation> <translation id="5473333559083690127">Weka tena PIN mpya</translation> @@ -3124,6 +3137,7 @@ <translation id="5496587651328244253">Panga</translation> <translation id="5499313591153584299">Faili hii inaweza kudhuru kompyuta yako.</translation> <translation id="5502500733115278303">Zilizoingizwa Kutoka Firefox</translation> +<translation id="5505264765875738116">Tovuti haziwezi kukuuliza kutuma arifa</translation> <translation id="5505307013568720083">Wino umeisha</translation> <translation id="5507756662695126555">Kutokanusha</translation> <translation id="5509693895992845810">Hifadhi K&ama</translation> @@ -3338,6 +3352,7 @@ <translation id="5801568494490449797">Mapendeleo</translation> <translation id="5804175651771201311">Umezima kipengele cha kutumia mitandao ya ng'ambo</translation> <translation id="5804241973901381774">Idhini</translation> +<translation id="5804427196348435412">Tumia vifaa vya NFC</translation> <translation id="5805697420284793859">Kidhibiti cha dirisha</translation> <translation id="5806773519584576205">0° (Chaguomsingi)</translation> <translation id="5811750797187914944">Kila kitu kiko tayari</translation> @@ -3553,6 +3568,7 @@ <translation id="6096047740730590436">Fungua iliyoongezwa</translation> <translation id="6096326118418049043">Jina la X.500</translation> <translation id="6097480669505687979">Ikiwa hutafuta faili kwenye hifadhi, huenda watumiaji pamoja na data ikaondolewa kiotomatiki.</translation> +<translation id="6097600385983390082">Kipengele cha kutafuta kwa kutamka kimefungwa</translation> <translation id="6098793583803863900">Faili isiyojulikana inachanganuliwa ili kubaini maudhui hatari.</translation> <translation id="6100736666660498114">Menyu ya kuanzia</translation> <translation id="6101226222197207147">Programu mpya imeongezwa (<ph name="EXTENSION_NAME" />)</translation> @@ -3648,6 +3664,7 @@ <translation id="6233154960150021497">Weka chaguomsingi iwe sauti badala ya kibodi</translation> <translation id="6234474535228214774">Inasubiri kusakinisha</translation> <translation id="6237816943013845465">Hukuruhusu kurekebisha ubora wa skrini yako</translation> +<translation id="6238624845858322552">Unganisha kwenye kifaa cha Bluetooth</translation> <translation id="6238767809035845642">Maandishi yaliyoshirikiwa kutoka Kifaa Kingine</translation> <translation id="6238923052227198598">Kiweke kidokezo cha hivi punde kwenye skrini iliyofungwa</translation> <translation id="6239558157302047471">Pakia fremu upya</translation> @@ -3674,6 +3691,7 @@ <translation id="6267547857941397424">Mtandao wa <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, Uthabiti wa Mtandao <ph name="SIGNAL_STRENGTH" />%, Betri ya Simu <ph name="BATTERY_STATUS" />%, Unganisha</translation> <translation id="6268252012308737255">Fungua kwa kutumia <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Tovuti zinaweza kukuuliza kutuma arifa</translation> <translation id="6270770586500173387">Tuma <ph name="BEGIN_LINK1" />maelezo ya mfumo na programu<ph name="END_LINK1" />, na <ph name="BEGIN_LINK2" />metriki<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Hitilafu imetokea <ph name="ERROR" /> wakati wa kupakua programu jalizi</translation> <translation id="6273677812470008672">Ubora</translation> @@ -3695,6 +3713,7 @@ <translation id="629730747756840877">Akaunti</translation> <translation id="6298962879096096191">Tumia Google Play kusakinisha programu za Android</translation> <translation id="630065524203833229">Ondoka</translation> +<translation id="6300718114348072351">Imeshindwa kuweka mipangilio ya <ph name="PRINTER_NAME" /> kiotomatiki. Tafadhali bainisha maelezo ya kina ya printa. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Sera ya Kimataifa:</translation> <translation id="6307990684951724544">Mfumo unashughulika</translation> <translation id="6308493641021088955">Shughuli ya kuingia katika akaunti inafanywa na <ph name="EXTENSION_NAME" /></translation> @@ -3864,6 +3883,7 @@ <translation id="6555810572223193255">Kipengele cha usafishaji hakiwezi kutumika kwa sasa</translation> <translation id="6556866813142980365">Rudia</translation> <translation id="6557290421156335491">Njia zangu za mikato</translation> +<translation id="6561560012278703671">Tumia kipengele cha kutuma na kupokea ujumbe bila sauti (huzuia vidokezo vya arifa visikusumbue)</translation> <translation id="6561726789132298588">ingiza</translation> <translation id="656293578423618167">Njia ya faili au jina ni ndefu mno. Tafadhali hifadhi ikiwa na jina fupi au kwenye eneo jingine.</translation> <translation id="6563469144985748109">Msimamizi wako bado hajaiidhinisha</translation> @@ -4047,6 +4067,7 @@ <translation id="6840155290835956714">Uliza kabla ya kutuma</translation> <translation id="6840184929775541289">Siyo Idhini ya Cheti</translation> <translation id="6841186874966388268">Hitilafu</translation> +<translation id="6843267103192918276">Ingia katika akaunti ili upate alamisho, historia, manenosiri, na mipangilio yako mingine kwenye vifaa vyako vyote. Pia utaingia kiotomatiki katika huduma zako kwenye Google. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Imemaliza kuweka mipangilio ya Ok Google</translation> <translation id="6845038076637626672">Fungua Iliyoongezwa</translation> <translation id="6845325883481699275">Tusaidie kuboresha usalama wa Chrome</translation> @@ -4463,7 +4484,6 @@ <translation id="7442465037756169001">Maunzi yako ya Hangouts Meet yako tayari kuwekwa.</translation> <translation id="744341768939279100">Unda wasifu mpya</translation> <translation id="7443806024147773267">Fikia manenosiri yako kila unapoingia katika Akaunti yako ya Google</translation> -<translation id="7444046173054089907">Tovuti hii imezuiwa</translation> <translation id="7444983668544353857">Zima <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Husakinisha programu kiotomatiki</translation> <translation id="7450761244949417357">Inafunguka katika <ph name="ALTERNATIVE_BROWSER_NAME" /> sasa</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">Ondoa Mtumiaji Huyu</translation> <translation id="8215295261562449873">Hifadhi nakala ya programu na faili zangu katika folda ya Vipakuliwa kabla ya kupata toleo jipya la Linux.</translation> <translation id="8217399928341212914">Endelea kuzuia upakuaji otomatiki wa faili nyingi</translation> +<translation id="8218847192766059983">Weka lugha au panga orodha upya. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Huwa unazuia arifa. Ili uruhusu tovuti hii ikuarifu, bofya hapa.</translation> <translation id="8225265270453771718">Shiriki dirisha la programu</translation> <translation id="8225753906568652947">Tumia ofa zako</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">Badilisha</translation> <translation id="9066773882585798925">Maandishi yatasomwa kwa sauti</translation> <translation id="9066782832737749352">Kusoma maandishi kwa sauti</translation> +<translation id="9067559831321817373">Dhibiti akaunti ulikoingia. Tovuti, programu na viendelezi katika Chrome na Google Play vinaweza kutumia akaunti hizi ili kuboresha hali yako ya utumiaji, kulingana na ruhusa. <a>Pata maelezo zaidi</a></translation> <translation id="9068849894565669697">Chagua rangi</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index bc171b5..f58c83f 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1735,7 +1735,6 @@ <translation id="347670947055184738">அச்சச்சோ! உங்கள் சாதனத்திற்கான கொள்கையைப் பெற முடியவில்லை.</translation> <translation id="347785443197175480">உங்கள் கேமராவையும் மைக்ரோஃபோனையும் அணுக <ph name="HOST" /> ஐத் தொடர்ந்து அனுமதி</translation> <translation id="3478685642445675458">பயனரை அகற்றும் முன், உங்கள் சுயவிவரத்தைத் திறக்கவும்.</translation> -<translation id="3479539252931486093">இதை எதிர்பார்க்கவில்லையா? <ph name="BEGIN_LINK" />எங்களுக்குத் தெரியப்படுத்தவும்<ph name="END_LINK" /></translation> <translation id="3479552764303398839">இப்பொழுது இல்லை</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> விநாடிகளில் <ph name="ALTERNATIVE_BROWSER_NAME" /> உலாவியில் திறக்கும்</translation> <translation id="3484273680291419129">தீங்கிழைக்கும் மென்பொருளை அகற்றுகிறது...</translation> @@ -4439,7 +4438,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware அமைப்பதற்குத் தயாராக உள்ளது.</translation> <translation id="744341768939279100">புதிய சுயவிவரத்தை உருவாக்கு</translation> <translation id="7443806024147773267">உங்கள் Google கணக்கில் உள்நுழைந்திருக்கும் போதெல்லாம் உங்கள் கடவுச்சொற்களைப் பயன்படுத்தலாம்</translation> -<translation id="7444046173054089907">இந்தத் தளம் தடுக்கப்பட்டது</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ஐ முடக்கு</translation> <translation id="7448430327655618736">ஆப்ஸைத் தானாகவே நிறுவும்</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> உலாவியில் திறக்கும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 94c5e480..6b65c72 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1749,7 +1749,6 @@ <translation id="347670947055184738">అయ్యో! మీ పరికరానికి సంబంధించిన విధానాన్ని పొందడంలో సిస్టమ్ విఫలమైంది.</translation> <translation id="347785443197175480">మీ కెమెరా మరియు మైక్రోఫోన్ను యాక్సెస్ చేయడానికి <ph name="HOST" />ను అనుమతించడాన్ని కొనసాగించండి</translation> <translation id="3478685642445675458">వ్యక్తిని తీసివేయబోయే ముందు దయచేసి మీ ప్రొఫైల్ను అన్లాక్ చేయండి.</translation> -<translation id="3479539252931486093">ఊహించని విధంగా ఇది సంభవించిందా? <ph name="BEGIN_LINK" />మాకు తెలియజేయండి<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ఇప్పుడు కాదు</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> క్షణాలలో <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరవబోతోంది</translation> <translation id="3484273680291419129">హానికరమైన సాఫ్ట్వేర్ని తీసివేస్తోంది...</translation> @@ -4467,7 +4466,6 @@ <translation id="7442465037756169001">మీ Hangouts Meet hardware సెటప్ చేయడానికి సిద్ధంగా ఉంది.</translation> <translation id="744341768939279100">కొత్త ప్రొఫైల్ను సృష్టించు</translation> <translation id="7443806024147773267">మీ Google ఖాతాలో ఎప్పుడు సైన్ ఇన్ చేసినా, మీ పాస్వర్డ్లను యాక్సెస్ చేయండి</translation> -<translation id="7444046173054089907">ఈ సైట్ బ్లాక్ చేయబడింది</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />ను నిలిపివేయి</translation> <translation id="7448430327655618736">యాప్లను ఆటోమేటిక్గా ఇన్స్టాల్ చేస్తుంది</translation> <translation id="7450761244949417357">ఇప్పుడు <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరుస్తోంది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 94e77508..35bbb2b 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">หน้านี้ไม่ตอบสนอง</translation> <translation id="1041263367839475438">อุปกรณ์ที่ใช้ได้</translation> <translation id="1042174272890264476">คอมพิวเตอร์ของคุณมาพร้อมกับไลบรารี RLZ ของ <ph name="SHORT_PRODUCT_NAME" /> ในตัว โดย RLZ จะระบุแท็กที่ซ้ำกันได้และไม่สามารถระบุตัวบุคคลเพื่อวัดการค้นหาและการใช้งาน <ph name="SHORT_PRODUCT_NAME" /> ที่ทำงานโดยแคมเปญส่งเสริมการขายบางรายการ บางครั้งป้ายกำกับจะปรากฏในคำค้นหาของ Google Search ใน <ph name="PRODUCT_NAME" /></translation> +<translation id="1043818413152647937">ล้างข้อมูลในแอปเหล่านี้ด้วยไหม</translation> <translation id="1045692658517323508">{0,plural, =1{อัปเดตภายใน 1 นาที}other{อัปเดตภายใน # นาที}}</translation> <translation id="1046635659603195359">ดูเหมือนคุณได้ตั้งค่า Voice Match กับ Google Assistant ในอุปกรณ์อื่นแล้ว สิ่งที่บันทึกไว้ก่อนหน้านี้จะนำมาใช้สร้างรูปแบบเสียงในอุปกรณ์นี้ได้ ซึ่งจะใช้เวลาไม่ถึงนาที</translation> <translation id="1047431265488717055">คัดลอก&ข้อความของลิงก์</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">ใช้ฟีเจอร์เจ๋งๆ จาก Google ใน Chrome</translation> <translation id="1147991416141538220">หากต้องการสิทธิ์เข้าถึง ให้ติดต่อผู้ดูแลระบบของอุปกรณ์นี้</translation> <translation id="1149401351239820326">เดือนที่หมดอายุ</translation> +<translation id="1150490752229770117">นี่เป็นการอัปเดตซอฟต์แวร์และความปลอดภัยอัตโนมัติครั้งสุดท้ายสำหรับ <ph name="DEVICE_TYPE" /> เครื่องนี้ โปรดอัปเกรดเป็นรุ่นที่ใหม่กว่าเพื่อรับการอัปเดตในอนาคต <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="1150565364351027703">แว่นกันแดด</translation> <translation id="1151917987301063366">อนุญาตให้ <ph name="HOST" /> เข้าถึงเซ็นเซอร์เสมอ</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">เลือกตั๋วที่จะใช้สำหรับการตรวจสอบสิทธิ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="1712349894969001173">รับรหัสผ่านนี้ใน iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> ต้องการจัดเก็บข้อมูลถาวรในเครื่องคอมพิวเตอร์ของคุณ</translation> +<translation id="1714644264617423774">เปิดใช้งานฟีเจอร์การช่วยเหลือพิเศษเพื่อให้อุปกรณ์ใช้งานง่ายยิ่งขึ้น <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="1717218214683051432">เซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation> +<translation id="171824261579749339">ออสเตรเลีย <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="1718835860248848330">ชั่วโมงที่แล้ว</translation> <translation id="1719312230114180055">หมายเหตุ: ลายนิ้วมืออาจมีความปลอดภัยน้อยกว่ารหัสผ่านหรือ PIN ที่เดายาก</translation> <translation id="1720318856472900922">การตรวจสอบสิทธิ์เซิร์ฟเวอร์ TLS WWW </translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">ล้างคุกกี้ของบุคคลที่สาม</translation> <translation id="2097372108957554726">คุณต้องลงชื่อเข้าใช้ Chrome เพื่อลงทะเบียนอุปกรณ์ใหม่</translation> <translation id="2099172618127234427">คุณกำลังเปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่องของ Chrome OS ซึ่งจะตั้งค่า sshd daemon และเปิดใช้การเปิดเครื่องจากไดรฟ์ USB</translation> +<translation id="2099625543891475722">ลักษณะทางกายภาพของคุณ เช่น ส่วนสูง</translation> <translation id="2099686503067610784">ลบใบรับรองของเซิร์ฟเวอร์ "<ph name="CERTIFICATE_NAME" />" หรือไม่</translation> <translation id="2100273922101894616">ลงชื่อเข้าใช้อัตโนมัติ</translation> <translation id="2101225219012730419">รุ่น:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">สร้างโปรไฟล์ใหม่</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> ต้องการยืนยันตัวตนของคุณ</translation> <translation id="2448312741937722512">ประเภท</translation> +<translation id="2448734521821581858">คุกกี้คือไฟล์ที่เว็บไซต์ต่างๆ ที่คุณเข้าชมสร้างขึ้น มีคุกกี้อยู่ 2 ประเภท ได้แก่ คุกกี้ของบุคคลที่หนึ่งซึ่งเว็บไซต์ที่คุณเข้าชมเป็นผู้สร้างขึ้น เว็บไซต์จะแสดงอยู่ในแถบที่อยู่ คุกกี้ของบุคคลที่สามซึ่งเว็บไซต์อื่นๆ เป็นผู้สร้างขึ้น เว็บไซต์เหล่านี้เป็นเจ้าของเนื้อหาบางอย่าง เช่น โฆษณาหรือรูปภาพที่คุณเห็นในเว็บไซต์ที่เข้าชม</translation> <translation id="2450223707519584812">คุณจะไม่สามารถเพิ่มผู้ใช้เนื่องจากไม่มีคีย์ของ Google API ดูรายละเอียดได้ที่ <ph name="DETAILS_URL" /></translation> <translation id="2450849356604136918">ไม่มีมุมมองที่เปิดอยู่</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">หมดเวลา</translation> <translation id="2588636910004461974">อุปกรณ์จาก <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">ค้นหาด้วย Google หรือพิมพ์ URL</translation> +<translation id="2600522410036850735">อุปกรณ์นี้จะได้รับการอัปเดตซอฟต์แวร์และความปลอดภัยอัตโนมัติจนถึง <ph name="MONTH_AND_YEAR" /> <a target="_blank" href="<ph name="URL" />">ดูข้อมูลเพิ่มเติม</a></translation> <translation id="2603115962224169880">ล้างข้อมูลในคอมพิวเตอร์</translation> <translation id="2603463522847370204">เปิดใน&หน้าต่างที่ไม่ระบุตัวตน</translation> <translation id="2604255671529671813">ข้อผิดพลาดในการเชื่อมต่อเครือข่าย</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Google Safe Browsing (ปกป้องคุณและอุปกรณ์จากเว็บไซต์ที่เป็นอันตราย)</translation> <translation id="3182749001423093222">ตรวจตัวสะกด</translation> <translation id="3183139917765991655">ตัวนำเข้าโปรไฟล์</translation> +<translation id="3184536091884214176">ตั้งค่าหรือจัดการเครื่องพิมพ์ CUPS <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="3188257591659621405">ไฟล์ของฉัน</translation> <translation id="3188465121994729530">ค่าเฉลี่ยเคลื่อนที่</translation> <translation id="3190558889382726167">บันทึกรหัสผ่านแล้ว</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">อ๊ะ! ระบบไม่สามารถดึงข้อมูลนโยบายจากอุปกรณ์</translation> <translation id="347785443197175480">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องถ่ายรูปและไมโครโฟนของคุณต่อไป</translation> <translation id="3478685642445675458">โปรดปลดล็อกโปรไฟล์ของคุณก่อนนำบุคคลออก</translation> -<translation id="3479539252931486093">หากเหตุการณ์นี้ผิดปกติ <ph name="BEGIN_LINK" />โปรดแจ้งให้เราทราบ<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation> <translation id="3481268647794498892">กำลังจะเปิดใน <ph name="ALTERNATIVE_BROWSER_NAME" /> ในอีก <ph name="COUNTDOWN_SECONDS" /> วินาที</translation> <translation id="3484273680291419129">กำลังนำซอฟต์แวร์อันตรายออก...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">แสดงชื่อผู้ใช้และภาพถ่ายบนหน้าจอลงชื่อเข้าใช้</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - เชื่อมต่ออุปกรณ์ HID แล้ว</translation> <translation id="4142052906269098341">ปลดล็อก <ph name="DEVICE_TYPE" /> ด้วยโทรศัพท์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">บันทึกเครื่องพิมพ์ที่ตรวจพบลงในโปรไฟล์ของคุณหรือเพิ่มเครื่องพิมพ์ใหม่ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="4144218403971135344">ดูวิดีโอคุณภาพดีขึ้นและยืดอายุการใช้งานแบตเตอรี่ วิดีโอจะเล่นเฉพาะในหน้าจอที่พร้อมใช้งาน Cast</translation> <translation id="4146026355784316281">เปิดด้วยโปรแกรมดูของระบบทุกครั้ง</translation> <translation id="4146785383423576110">รีเซ็ตและล้างข้อมูล</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">เมลอน</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> กำลังแชร์หน้าต่าง</translation> <translation id="4364830672918311045">แสดงการแจ้งเตือน</translation> +<translation id="436499142539576997">รับข้อมูลแอปไม่สำเร็จ ยังพยายามเรียกใช้แอปอยู่...</translation> <translation id="4370975561335139969">อีเมลและรหัสผ่านที่คุณป้อนไม่ตรงกัน</translation> <translation id="437184764829821926">การตั้งค่าแบบอักษรขึ้นสูง</translation> <translation id="4374831787438678295">โปรแกรมติดตั้ง Linux</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">การเปลี่ยนเส้นทางเบราว์เซอร์รองรับเฉพาะ http, https และโปรโตคอลไฟล์เท่านั้น</translation> <translation id="4659077111144409915">บัญชีหลัก</translation> <translation id="4660476621274971848">เวอร์ชันที่คาดการณ์ "<ph name="EXPECTED_VERSION" />" แต่เวอร์ชันที่แจ้งคือ "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">เลย์เอาต์ของห้อง</translation> <translation id="4662788913887017617">แชร์บุ๊กมาร์กนี้กับ iPhone ของคุณ</translation> <translation id="4663373278480897665">อนุญาตให้ใช้กล้องถ่ายรูป</translation> <translation id="4664482161435122549">ข้อผิดพลาดในการส่งออก PKCS #12</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">หน้าเริ่มต้นใช้งานของคุณเปลี่ยนเป็น <ph name="URL" /></translation> <translation id="4902546322522096650">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, เชื่อมต่อ</translation> <translation id="49027928311173603">นโยบายที่ดาวน์โหลดจากเซิร์ฟเวอร์ไม่ถูกต้อง: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4906490889887219338">ตั้งค่าหรือจัดการพื้นที่แชร์ไฟล์ของเครือข่าย <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="4907161631261076876">ไฟล์นี้ไม่ได้มีการดาวน์โหลดเป็นที่แพร่หลายและอาจเป็นอันตราย</translation> <translation id="4907306957610201395">หมวดหมู่สิทธิ์</translation> <translation id="4908811072292128752">เปิดแท็บใหม่เพื่อเรียกดูไซต์ 2 ไซต์พร้อมกัน</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">กำลังเปิดใช้งาน...</translation> <translation id="5039804452771397117">อนุญาต</translation> <translation id="5042282098504489593">เปิดการตั้งค่าเพื่อเชื่อมต่อ <ph name="USB_DEVICE_NAME" /> กับ Linux</translation> +<translation id="5043913660911154449">หรือระบุ PPD ของเครื่องพิมพ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation> <translation id="504561833207953641">กำลังเปิดในเซสชันเบราว์เซอร์ที่มีอยู่</translation> <translation id="5047421709274785093">บล็อกเว็บไซต์ไม่ให้ใช้เซ็นเซอร์จับความเคลื่อนไหวและเซ็นเซอร์แสง</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">ผู้ใช้ที่เป็นเด็กจะเปลี่ยนแปลงการตั้งค่านี้ไม่ได้</translation> <translation id="5466374726908360271">ว&างและค้นหา “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">กำลังมองหาพื้นที่แชร์ไฟล์</translation> +<translation id="5470735824776589490">ต้องรีสตาร์ทก่อน จึงจะรีเซ็ตอุปกรณ์ของคุณด้วย Powerwash ได้ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5471768120198416576">สวัสดี นี่เป็นเสียงของระบบอ่านออกเสียงข้อความ</translation> <translation id="5472133193607270166">เมื่อเปิดใช้ เว็บไซต์จะใช้กิจกรรมการท่องเว็บตามเว็บไซต์ต่างๆ ของคุณเพื่อปรับโฆษณาตามโปรไฟล์ของผู้ใช้ไม่ได้ บางเว็บไซต์อาจทำงานไม่ถูกต้อง</translation> <translation id="5473333559083690127">ป้อน PIN ใหม่อีกครั้ง</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">จัดระเบียบ</translation> <translation id="5499313591153584299">ไฟล์นี้อาจเป็นอันตรายต่อคอมพิวเตอร์</translation> <translation id="5502500733115278303">นำเข้าจาก Firefox</translation> +<translation id="5505264765875738116">เว็บไซต์ขออนุญาตเพื่อส่งการแจ้งเตือนไม่ได้</translation> <translation id="5505307013568720083">หมึกหมด</translation> <translation id="5507756662695126555">การป้องกันการปฏิเสธความรับผิดชอบต่อข้อมูล</translation> <translation id="5509693895992845810">บันทึกเ&ป็น...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">ค่ากำหนด</translation> <translation id="5804175651771201311">ปิดโรมมิ่ง</translation> <translation id="5804241973901381774">การอนุญาต</translation> +<translation id="5804427196348435412">ใช้อุปกรณ์ NFC</translation> <translation id="5805697420284793859">ตัวจัดการหน้าต่าง</translation> <translation id="5806773519584576205">0° (ค่าเริ่มต้น)</translation> <translation id="5811750797187914944">ตั้งค่าเรียบร้อย</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">เปิดแบบเต็มหน้าจอ</translation> <translation id="6096326118418049043">ชื่อ X.500</translation> <translation id="6097480669505687979">หากคุณไม่เพิ่มพื้นที่ว่าง ระบบจะนำผู้ใช้และข้อมูลออกโดยอัตโนมัติ</translation> +<translation id="6097600385983390082">ปิดการค้นหาด้วยเสียงแล้ว</translation> <translation id="6098793583803863900">กำลังสแกนไฟล์ที่ไม่รู้จักเพื่อตรวจหาเนื้อหาที่เป็นอันตราย</translation> <translation id="6100736666660498114">เมนูเริ่มต้น</translation> <translation id="6101226222197207147">เพิ่มแอปพลิเคชันใหม่แล้ว (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">มีค่าเริ่มต้นเป็นการใช้เสียงแทนแป้นพิมพ์</translation> <translation id="6234474535228214774">กำลังรอการติดตั้ง</translation> <translation id="6237816943013845465">ให้คุณปรับเปลี่ยนความละเอียดของหน้าจอ</translation> +<translation id="6238624845858322552">เชื่อมต่อกับอุปกรณ์บลูทูธ</translation> <translation id="6238767809035845642">ข้อความแชร์มาจากอุปกรณ์อื่น</translation> <translation id="6238923052227198598">เก็บโน้ตล่าสุดไว้ในหน้าจอล็อก</translation> <translation id="6239558157302047471">โหลดเ&ฟรมซ้ำ</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, แบตเตอรี่โทรศัพท์ <ph name="BATTERY_STATUS" />%, เชื่อมต่อ</translation> <translation id="6268252012308737255">เปิดด้วย <ph name="APP" /></translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">เว็บไซต์ขออนุญาตเพื่อส่งการแจ้งเตือนได้</translation> <translation id="6270770586500173387">ส่ง<ph name="BEGIN_LINK1" />ข้อมูลระบบและแอป<ph name="END_LINK1" />และ<ph name="BEGIN_LINK2" />เมตริก<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">เกิดข้อผิดพลาด (<ph name="ERROR" />) ขณะดาวน์โหลดปลั๊กอิน</translation> <translation id="6273677812470008672">คุณภาพ</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">บัญชี</translation> <translation id="6298962879096096191">ใช้ Google Play เพื่อติดตั้งแอป Android</translation> <translation id="630065524203833229">&ออก</translation> +<translation id="6300718114348072351">กำหนดค่า <ph name="PRINTER_NAME" /> โดยอัตโนมัติไม่ได้ โปรดระบุรายละเอียดเครื่องพิมพ์ขั้นสูง <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="6305607932814307878">นโยบายทั่วโลก:</translation> <translation id="6307990684951724544">ระบบกำลังทำงานอื่นอยู่</translation> <translation id="6308493641021088955">การลงชื่อเข้าใช้ให้บริการโดย <ph name="EXTENSION_NAME" /></translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">การทำความสะอาดไม่พร้อมใช้งานในขณะนี้</translation> <translation id="6556866813142980365">ทำซ้ำ</translation> <translation id="6557290421156335491">ทางลัดของฉัน</translation> +<translation id="6561560012278703671">ใช้การส่งข้อความแบบไม่ส่งเสียง (บล็อกข้อความแจ้งเตือนไม่ให้รบกวนคุณ)</translation> <translation id="6561726789132298588">ป้อน</translation> <translation id="656293578423618167">เส้นทางหรือชื่อของไฟล์ยาวเกินไป โปรดบันทึกด้วยชื่อที่สั้นกว่านี้หรือบันทึกลงในตำแหน่งอื่น</translation> <translation id="6563469144985748109">ผู้จัดการยังไม่ได้อนุมัติเว็บไซต์นี้</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">ถามก่อนที่จะส่ง</translation> <translation id="6840184929775541289">ไม่ได้เป็นผู้ออกใบรับรอง</translation> <translation id="6841186874966388268">ข้อผิดพลาด</translation> +<translation id="6843267103192918276">ลงชื่อเข้าใช้เพื่อรับบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ ในอุปกรณ์ทั้งหมด ระบบจะลงชื่อเข้าใช้บริการต่างๆ ของ Google ให้คุณโดยอัตโนมัติด้วย <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google พร้อมใช้งานแล้ว</translation> <translation id="6845038076637626672">เปิดแบบเต็มหน้าจอ</translation> <translation id="6845325883481699275">ช่วยปรับปรุงความปลอดภัยของ Chrome</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">พร้อมตั้งค่าชุดฮาร์ดแวร์ Hangouts Meet แล้ว</translation> <translation id="744341768939279100">สร้างโปรไฟล์ใหม่</translation> <translation id="7443806024147773267">เข้าถึงรหัสผ่านได้เมื่อใดก็ตามที่ลงชื่อเข้าใช้บัญชี Google อยู่</translation> -<translation id="7444046173054089907">เว็บไซต์นี้ถูกบล็อก</translation> <translation id="7444983668544353857">ปิดการใช้งาน<ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">ติดตั้งแอปโดยอัตโนมัติ</translation> <translation id="7450761244949417357">เปิดอยู่ใน <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">นำบุคคลนี้ออก</translation> <translation id="8215295261562449873">สำรองข้อมูลแอปและไฟล์ในโฟลเดอร์ดาวน์โหลดก่อนที่จะอัปเกรด Linux</translation> <translation id="8217399928341212914">ดำเนินการบล็อกการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติต่อไป</translation> +<translation id="8218847192766059983">เพิ่มภาษาหรือจัดเรียงรายการใหม่ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="8221491193165283816">คุณมักจะบล็อกการแจ้งเตือน หากต้องการให้เว็บไซต์ส่งการแจ้งเตือน ให้คลิกที่นี่</translation> <translation id="8225265270453771718">แชร์หน้าต่างแอปพลิเคชัน</translation> <translation id="8225753906568652947">แลกข้อเสนอพิเศษ</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">แก้ไข</translation> <translation id="9066773882585798925">ฟังข้อความที่อ่านออกเสียง</translation> <translation id="9066782832737749352">การอ่านออกเสียงข้อความ</translation> +<translation id="9067559831321817373">จัดการบัญชีที่ลงชื่อเข้าใช้ เว็บไซต์ แอป และส่วนขยายใน Chrome และ Google Play อาจใช้บัญชีเหล่านี้เพื่อปรับแต่งประสบการณ์การใช้งานของคุณ ทั้งนี้ขึ้นอยู่กับสิทธิ์ต่างๆ <a>ดูข้อมูลเพิ่มเติม</a></translation> <translation id="9068849894565669697">เลือกสี</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">บลูทูธ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 7a34604..af1b95d 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Bu sayfa yanıt vermiyor</translation> <translation id="1041263367839475438">Kullanılabilir cihazlar</translation> <translation id="1042174272890264476">Bilgisayarınızda aynı zamanda yerleşik <ph name="SHORT_PRODUCT_NAME" /> RLZ kitaplığı da bulunur. RLZ, aramaları ve belirli bir promosyon kampanyasının sağladığı <ph name="SHORT_PRODUCT_NAME" /> kullanımını ölçmek için benzersiz olmayan ve kimlik bilgileri içermeyen bir etiket atar. Bu etiketler bazen <ph name="PRODUCT_NAME" /> içindeki Google Arama sorgularında görünür.</translation> +<translation id="1043818413152647937">Ayrıca veriler bu uygulamalardan da temizlensin mi?</translation> <translation id="1045692658517323508">{0,plural, =1{1 dakika içinde güncelleyin}other{# dakika içinde güncelleyin}}</translation> <translation id="1046635659603195359">Google Asistan'la Voice Match'i başka bir cihazda zaten kurmuş olduğunuz anlaşılıyor. Önceki bu kayıtlar, bu cihazda bir ses modeli oluşturmak için kullanılabilir. Bu işlem, bir dakikadan az sürecektir.</translation> <translation id="1047431265488717055">&Bağlantı Metnini Kopyala</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Google zekası Chrome'da</translation> <translation id="1147991416141538220">Erişim izni istemek için bu cihazın yöneticisiyle iletişime geçin.</translation> <translation id="1149401351239820326">Son kullanım tarihinin ayı</translation> +<translation id="1150490752229770117">Bu, <ph name="DEVICE_TYPE" /> için son otomatik yazılım ve güvenlik güncellemesidir. Gelecekteki güncellemeleri almak için daha yeni bir sürüme geçin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Güneş Gözlüğü</translation> <translation id="1151917987301063366"><ph name="HOST" /> sitesinin sensörlere erişmesine her zaman izin ver</translation> <translation id="1153356358378277386">Eşlenen cihazlar</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Kimlik doğrulama için kullanılacak bir bilet seçin <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Bu şifreyi iPhone'unuzda alın</translation> <translation id="1712552549805331520"><ph name="URL" />, verileri yerel bilgisayarınızda kalıcı olarak saklamak istiyor</translation> +<translation id="1714644264617423774">Cihazınızı daha kolay kullanılır duruma getirmek için erişilebilirlik özelliklerini etkinleştirin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Hareket sensörleri</translation> +<translation id="171824261579749339">Avustralya <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Son saat</translation> <translation id="1719312230114180055">Not: Parmak iziniz güçlü bir şifre veya PIN kadar güvenli olmayabilir.</translation> <translation id="1720318856472900922">TLS WWW Sunucu Kimlik Doğrulaması</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Üçüncü taraf çerezlerini sil</translation> <translation id="2097372108957554726">Yeni cihazlar kaydettirebilmeniz için Chrome'da oturum açmanız gerekir</translation> <translation id="2099172618127234427">sshd yardımcı programını ayarlayacak ve USB sürücülerinden önyüklemeyi etkinleştirecek Chrome OS hata ayıklama özelliklerini etkinleştiriyorsunuz.</translation> +<translation id="2099625543891475722">boyunuz gibi fiziksel özellikleriniz</translation> <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" sunucusu sertifikası silinsin mi?</translation> <translation id="2100273922101894616">Otomatik Oturum Aç</translation> <translation id="2101225219012730419">Sürüm:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Yeni Profil Oluştur</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> kimliğinizi doğrulamak istiyor</translation> <translation id="2448312741937722512">Tür</translation> +<translation id="2448734521821581858">Çerezler, ziyaret ettiğiniz web siteleri tarafından oluşturulan dosyalardır. İki tür çerez vardır: Birinci taraf çerezleri ziyaret ettiğiniz site tarafından oluşturulur. Site, adres çubuğunda gösterilir. Üçüncü taraf çerezleri diğer siteler tarafından oluşturulur. Bu siteler, ziyaret ettiğiniz web sitesinde gördüğünüz reklam veya resim gibi içeriğin bir kısmına sahiptir.</translation> <translation id="2450223707519584812">Google API anahtarları eksik olduğundan kullanıcı ekleyemezsiniz. Ayrıntılar için <ph name="DETAILS_URL" /> sayfasına bakın.</translation> <translation id="2450849356604136918">Etkin görünüm yok</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Zaman aşımına uğradı</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> tedarikçisinin cihazları</translation> <translation id="2594999711683503743">Google'da arayın veya URL'yi yazın</translation> +<translation id="2600522410036850735">Bu cihaz, <ph name="MONTH_AND_YEAR" /> tarihine kadar otomatik yazılım ve güvenlik güncellemelerini alacak. <a target="_blank" href="<ph name="URL" />">Daha fazla bilgi</a></translation> <translation id="2603115962224169880">Bilgisayarı temizleme</translation> <translation id="2603463522847370204">&Gizli pencerede aç</translation> <translation id="2604255671529671813">Ağ bağlantısı hatası</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Gizli Göz Atma (sizi ve cihazınızı tehlikelerden korur)</translation> <translation id="3182749001423093222">Yazım denetimi</translation> <translation id="3183139917765991655">Profil İçe Aktarıcısı</translation> +<translation id="3184536091884214176">CUPS yazıcıları kurun veya yönetin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Dosyalarım</translation> <translation id="3188465121994729530">Hareketli Ortalama</translation> <translation id="3190558889382726167">Şifre kaydedildi</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Hay aksi! Sistem, cihazınıza ait politikayı getiremedi.</translation> <translation id="347785443197175480"><ph name="HOST" /> sitesinin kamerama ve mikrofonuma erişmesine izin vermeye devam et</translation> <translation id="3478685642445675458">Lütfen bir kişiyi kaldırmadan önce profilinizin kilidini açın.</translation> -<translation id="3479539252931486093">Bu beklenmedik bir durum mu? <ph name="BEGIN_LINK" />Bize bildirin<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Şimdi değil</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> <ph name="COUNTDOWN_SECONDS" /> saniye içinde açılıyor</translation> <translation id="3484273680291419129">Zararlı yazılım kaldırılıyor...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Oturum açma ekranında kullanıcı adlarını ve fotoğrafları göster</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID cihazı bağlandı</translation> <translation id="4142052906269098341"><ph name="DEVICE_TYPE" /> cihazınızın kilidini telefonunuzla açın. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Algılanan yazıcıları profilinize kaydedin veya yeni bir yazıcı ekleyin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Daha iyi video kalitesi elde edin ve pil ömründen tasarruf edin. Video yalnızca Cast uyumlu ekranınızda oynatılır.</translation> <translation id="4146026355784316281">Her Zaman Sistem Görüntüleyici ile Aç</translation> <translation id="4146785383423576110">Sıfırla ve temizle</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Kavun</translation> <translation id="4364567974334641491"><ph name="APP_NAME" />, bir pencereyi paylaşıyor.</translation> <translation id="4364830672918311045">Bildirimleri görüntüleme</translation> +<translation id="436499142539576997">Uygulama verileri alınamadı, hâlâ uygulamanın çalışması için uğraşılıyor...</translation> <translation id="4370975561335139969">Girdiğiniz e-posta ve şifre eşleşmiyor</translation> <translation id="437184764829821926">Gelişmiş yazı tipi ayarları</translation> <translation id="4374831787438678295">Linux yükleyici</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Yalnızca http, https ve dosya protokolleri tarayıcı yönlendirmeleri için desteklenir.</translation> <translation id="4659077111144409915">Birincil hesap</translation> <translation id="4660476621274971848">Beklenen sürüm "<ph name="EXPECTED_VERSION" />" idi, ancak "<ph name="NEW_ID" />" sürümü belirlendi</translation> +<translation id="4660838440047236328">odanızın düzeni</translation> <translation id="4662788913887017617">Bu yer işaretini iPhone'unuzla paylaşın</translation> <translation id="4663373278480897665">Kameraya izin veriliyor</translation> <translation id="4664482161435122549">PKCS #12 Dışa Aktarma Hatası</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Başlangıç sayfanız <ph name="URL" /> olarak değiştirildi.</translation> <translation id="4902546322522096650">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, %<ph name="SIGNAL_STRENGTH" /> Sinyal Gücü, Bağlan</translation> <translation id="49027928311173603">Sunucudan indirilen politika geçersiz: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Ağ dosya paylaşımlarını kurun veya yönetin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Bu uygulama çok indirilen bir uygulama değil ve tehlikeli olabilir.</translation> <translation id="4907306957610201395">İzin Kategorisi</translation> <translation id="4908811072292128752">İki siteye aynı anda göz atmak için yeni bir sekme açın</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Etkinleştiriliyor...</translation> <translation id="5039804452771397117">İzin ver</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> cihazını Linux'a bağlamak için Ayarlar'ı açın</translation> +<translation id="5043913660911154449">İsterseniz yazıcınızın PPD'sini de belirtebilirsiniz <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Hatalı parola</translation> <translation id="504561833207953641">Mevcut tarayıcı oturumunda açılıyor.</translation> <translation id="5047421709274785093">Sitelerin hareket ve ışık sensörlerini kullanmasını engelle</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Bu ayar, çocuk kullanıcılar tarafından değiştirilemez.</translation> <translation id="5466374726908360271">Ya&pıştır ve “<ph name="SEARCH_TERMS" />” sorgusunu ara</translation> <translation id="5468173180030470402">Dosya paylaşımı aranıyor</translation> +<translation id="5470735824776589490">Cihazınızın Powerwash ile sıfırlanabilmesi için yeniden başlatılması gerekir. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Merhaba! Ben sizin metin okuma sesinizim.</translation> <translation id="5472133193607270166">Bu ayar açıkken, siteler reklamları kişiselleştirmek için farklı sitelerde gezinme etkinliğinizi kullanamaz Bazı siteler düzgün çalışmayabilir.</translation> <translation id="5473333559083690127">Yeni PIN'i tekrar girin</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Düzenle</translation> <translation id="5499313591153584299">Bu dosya bilgisayarınıza zarar verebilir.</translation> <translation id="5502500733115278303">Firefox'tan Aktarıldı</translation> +<translation id="5505264765875738116">Siteler bildirim göndermek isteyemez</translation> <translation id="5505307013568720083">Mürekkep bitti</translation> <translation id="5507756662695126555">İnkar edilemez</translation> <translation id="5509693895992845810">Farklı &Kaydet...</translation> @@ -3344,6 +3358,7 @@ <translation id="5801568494490449797">Tercihler</translation> <translation id="5804175651771201311">Dolaşım kapalı</translation> <translation id="5804241973901381774">İzinler</translation> +<translation id="5804427196348435412">NFC cihazlarını kullanma</translation> <translation id="5805697420284793859">Pencere yöneticisi</translation> <translation id="5806773519584576205">0° (Varsayılan)</translation> <translation id="5811750797187914944">Hazır</translation> @@ -3559,6 +3574,7 @@ <translation id="6096047740730590436">Ekranı kaplayacak şekilde aç</translation> <translation id="6096326118418049043">X.500 Adı</translation> <translation id="6097480669505687979">Yer açmazsanız kullanıcılar ve veriler otomatik olarak kaldırılabilir.</translation> +<translation id="6097600385983390082">Sesli arama kapalı</translation> <translation id="6098793583803863900">Bilinmeyen bir dosya, tehlikeli içerikler için taranıyor.</translation> <translation id="6100736666660498114">Başlat menüsü</translation> <translation id="6101226222197207147">Yeni uygulama eklendi (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">Varsayılan olarak klavye yerine sesi kullan</translation> <translation id="6234474535228214774">Yükleme bekleniyor</translation> <translation id="6237816943013845465">Ekran çözünürlüğünü ayarlamanıza olanak tanır</translation> +<translation id="6238624845858322552">Bluetooth cihazına bağlan</translation> <translation id="6238767809035845642">Metin diğer cihazdan paylaşıldı</translation> <translation id="6238923052227198598">En son notu kilit ekranında tut</translation> <translation id="6239558157302047471">Ç&erçeveyi yeniden yükle</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, %<ph name="SIGNAL_STRENGTH" /> Sinyal Gücü, %<ph name="BATTERY_STATUS" /> Telefon Pili, Bağlan</translation> <translation id="6268252012308737255"><ph name="APP" /> ile aç</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">Siteler bildirim göndermek isteyebilir</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Sistem ve uygulama bilgilerini<ph name="END_LINK1" /> ve <ph name="BEGIN_LINK2" />metrikleri<ph name="END_LINK2" /> gönder</translation> <translation id="6272643420381259437">Eklenti indirilirken bir hata (<ph name="ERROR" />) oluştu</translation> <translation id="6273677812470008672">Kalite</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">Hesap</translation> <translation id="6298962879096096191">Android uygulamalarını yüklemek için Google Play'i kullanın</translation> <translation id="630065524203833229">Çı&kış</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> otomatik olarak yapılandırılamıyor. Lütfen gelişmiş yazıcı ayrıntılarını belirtin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Genel Politika:</translation> <translation id="6307990684951724544">Sistem meşgul</translation> <translation id="6308493641021088955">Oturum açma işlemi <ph name="EXTENSION_NAME" /> tarafından sağlanmıştır</translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">Temizleme şu anda kullanılamıyor</translation> <translation id="6556866813142980365">Yeniden Yap</translation> <translation id="6557290421156335491">Kısayollarım</translation> +<translation id="6561560012278703671">Bilgiyi daha az rahatsız edici bir şekilde alın (bildirim istemlerinin sizi rahatsız etmesini engelleyin)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Dosya yolu veya adı çok uzun. Lütfen daha kısa bir adla veya başka bir konuma kaydedin.</translation> <translation id="6563469144985748109">Yöneticiniz henüz onaylamadı</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">Göndermeden önce sor</translation> <translation id="6840184929775541289">Sertifika Yetkilisi değildir</translation> <translation id="6841186874966388268">Hatalar</translation> +<translation id="6843267103192918276">Yer işaretlerinize, geçmişinize ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için oturum açın. Ayrıca Google hizmetlerinizde de otomatik olarak oturum açarsınız. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google hazır</translation> <translation id="6845038076637626672">Ekranı Kaplayacak Şekilde Aç</translation> <translation id="6845325883481699275">Chrome güvenliğini iyileştirmeye yardımcı olun</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">Hangouts Meet hardware cihazınız kuruluma hazır.</translation> <translation id="744341768939279100">Yeni profil oluştur</translation> <translation id="7443806024147773267">Google Hesabınıza her giriş yaptığınızda şifrelerinize erişin</translation> -<translation id="7444046173054089907">Bu site engellenmiş</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ağ cihazını devre dışı bırak</translation> <translation id="7448430327655618736">Uygulamaları otomatik olarak yükle</translation> <translation id="7450761244949417357">Şimdi <ph name="ALTERNATIVE_BROWSER_NAME" /> tarayıcısında açılıyor</translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Bu kişiyi kaldır</translation> <translation id="8215295261562449873">Linux'ı yeni sürüme geçirmeden önce uygulamalarımı ve dosyalarımı İndirilenler klasörüne yedekle.</translation> <translation id="8217399928341212914">Otomatik olarak birden fazla dosya indirilmesini engellemeye devam et</translation> +<translation id="8218847192766059983">Dil ekleyin veya listeyi yeniden sıralayın <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Genelde bildirimleri engelliyorsunuz. Bu sitenin size bildirim göndermesine izin vermek için burayı tıklayın.</translation> <translation id="8225265270453771718">Uygulama penceresi paylaşın</translation> <translation id="8225753906568652947">Tekliflerinizi kullanın</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Düzenle</translation> <translation id="9066773882585798925">Metnin sesli olarak okunmasını duyma</translation> <translation id="9066782832737749352">Metin-Konuşma</translation> +<translation id="9067559831321817373">Oturum açtığınız hesaplarınızı yönetin. Chrome ve Google Play'deki web siteleri, uygulamalar ve uzantılar, izinlere bağlı olarak deneyiminizi özelleştirmek için bu hesapları kullanabilirler. <a>Daha fazla bilgi edinin</a></translation> <translation id="9068849894565669697">Renk seçin</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 9cfe08af..dcc1d5dd 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1750,7 +1750,6 @@ <translation id="347670947055184738">На жаль, системі не вдалось отримати правило для вашого пристрою.</translation> <translation id="347785443197175480">Продовжити надавати хосту <ph name="HOST" /> доступ до ваших камери та мікрофона</translation> <translation id="3478685642445675458">Перш ніж видалити особу, розблокуйте свій профіль.</translation> -<translation id="3479539252931486093">Не очікували? <ph name="BEGIN_LINK" />Повідомте нас<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Не зараз</translation> <translation id="3481268647794498892">Відкриється в <ph name="ALTERNATIVE_BROWSER_NAME" /> через <ph name="COUNTDOWN_SECONDS" /> с</translation> <translation id="3484273680291419129">Вилучення зловмисного програмного забезпечення…</translation> @@ -4468,7 +4467,6 @@ <translation id="7442465037756169001">Обладнання Hangouts Meet hardware можна налаштовувати.</translation> <translation id="744341768939279100">Створити новий профіль</translation> <translation id="7443806024147773267">Отримуйте доступ до своїх паролів після входу в обліковий запис Google</translation> -<translation id="7444046173054089907">Цей сайт заблоковано</translation> <translation id="7444983668544353857">Вимкнути <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Автоматично встановлювати додатки</translation> <translation id="7450761244949417357">Відкривається в <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 87bc3708..a95d6f70 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">یہ صفحہ نہیں کھل رہا ہے</translation> <translation id="1041263367839475438">دستیاب آلات</translation> <translation id="1042174272890264476">آپ کا کمپیوٹر <ph name="SHORT_PRODUCT_NAME" /> کی پہلے سے شامل RLZ لائبریری کے ساتھ بھی آتا ہے۔ RLZ ایک غیر منفرد، ذاتی طور پر ناقابل شناخت ٹیگ کو تفویض کرتا ہے تاکہ تلاشوں اور ایک خاص پروموشنل مہم کے ذریعہ چلائے گئے <ph name="SHORT_PRODUCT_NAME" /> استعمال کی پیمائش کر سکے۔ یہ لیبلز کبھی کبھی Google تلاش استفسارات میں <ph name="PRODUCT_NAME" /> میں ظاہر ہوتے ہیں۔</translation> +<translation id="1043818413152647937">ان ایپس سے بھی ڈیٹا کو صاف کریں؟</translation> <translation id="1045692658517323508">{0,plural, =1{1 منٹ کے اندر اپ ڈیٹ کریں}other{# منٹ کے اندر اپ ڈیٹ کریں}}</translation> <translation id="1046635659603195359">ایسا لگتا ہے کہ آپ نے پہلے ہی کسی دوسرے آلہ پر اپنی Google اسسٹنٹ کے ساتھ Voice Match کو ترتیب دے دیا ہے۔ ان پچھلی ریکارڈنگز کو اس آلہ پر ایک صوتی ماڈل بنانے کے لیے استعمال کیا جا سکتا ہے۔ اس میں ایک منٹ سے کم وقت لگے گا۔</translation> <translation id="1047431265488717055">لنک کا مت&ن کاپی کریں</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Chrome میں Google کی اسمارٹ سروسز حاصل کریں</translation> <translation id="1147991416141538220">رسائی طلب کرنے کے لیے، اس آلہ کے منتظم سے رابطہ کریں۔</translation> <translation id="1149401351239820326">میعاد کے اختتام کا مہینہ</translation> +<translation id="1150490752229770117">یہ اس <ph name="DEVICE_TYPE" /> کے لیے آخری خودکار سافٹ ویئر اور سیکیورٹی اپ ڈیٹ ہے۔ آئندہ کے اپ ڈیٹس حاصل کرنے کے لیے، نئے ماڈل پر اپ گریڈ کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1150565364351027703">دھوپ کا چشمہ</translation> <translation id="1151917987301063366"><ph name="HOST" /> کو ہمیشہ سینسرز تک رسائی حاصل کرنے کی اجازت دیں</translation> <translation id="1153356358378277386">جوڑا بنائے ہوئے آلات</translation> @@ -512,7 +514,9 @@ <translation id="1709217939274742847">تصدیق کے لیے استعمال کرنے کے لیے ایک ٹکٹ منتخب کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1712349894969001173">اپنے iPhone پر یہ پاس ورڈ حاصل کریں</translation> <translation id="1712552549805331520"><ph name="URL" /> آپ کے مقامی کمپیوٹر پر مستقل طور پر ڈیٹا اسٹور کرنا چاہتا ہے</translation> +<translation id="1714644264617423774">اپنے آلہ کو استعمال میں آسان تر بنانے کیلئے accessibility خصوصیات کو فعال کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1717218214683051432">موشن سینسرز</translation> +<translation id="171824261579749339">آسٹریلیائی <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="1718835860248848330">پچھلے گھنٹے</translation> <translation id="1719312230114180055">نوٹ: ایک مضبوط پاس ورڈ یا PIN کی نسبت آپ کا فنگر پرنٹ شاید کم محفوظ ہو۔</translation> <translation id="1720318856472900922">TLS WWW سرور کی توثیق</translation> @@ -774,6 +778,7 @@ <translation id="2096715839409389970">فریق ثالث کوکیز صاف کریں</translation> <translation id="2097372108957554726">نئے آلات رجسٹر کرنے کیلئے آپ کو Chrome میں سائن ان کرنے کی ضرورت ہے</translation> <translation id="2099172618127234427">آپ Chrome OS ڈیبگنگ کی خصوصیات فعال کر رہے رہیں جو sshd daemon تشکیل دیں گی اور USB ڈرائیورز سے بوٹنگ کو فعال کریں گی۔</translation> +<translation id="2099625543891475722">آپ کی جسمانی خصوصیات، جیسے کہ قد</translation> <translation id="2099686503067610784">سرور سرٹیفیکیٹ "<ph name="CERTIFICATE_NAME" />" حذف کریں؟</translation> <translation id="2100273922101894616">خودکار سائن ان</translation> <translation id="2101225219012730419">ورژن:</translation> @@ -1028,6 +1033,7 @@ <translation id="2445484935443597917">'نیا پروفائل' بنائیں</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> آپ کی شناخت کی توثیق کرنا چاہتی ہے</translation> <translation id="2448312741937722512">قسم</translation> +<translation id="2448734521821581858">کوکیز ایسی فائلز ہوتی ہیں جنہیں آپ کی ملاحظہ جانے والی ویب سائٹس تخلیق کرتی ہیں۔ کوکیز کی دو قسمیں ہوتی ہیں: فریق اول کوکیز جنہیں آپ کی ملاحظہ کی جانے والی سائٹ تخلیق کرتی ہے۔ سائٹ ایڈریس بار پر دکھائی گئی ہے۔ فریق ثالث کوکیز دیگر سائٹس کے ذریعے تخلیق کی جاتی ہیں۔ یہ سائٹس کچھ مواد کی مالک ہوتی ہیں، جیسے اشتہارات یا تصاویر جنہیں آپ ملاحظہ کی جانے والی ویب سائٹ پر دیکھتے ہیں۔</translation> <translation id="2450223707519584812">Google API کلیدیں موجود نہ ہونے کی وجہ سے آپ صارفین کو شامل نہیں کر سکیں گے۔ تفصیلات کیلئے <ph name="DETAILS_URL" /> دیکھیں۔</translation> <translation id="2450849356604136918">کوئی فعال ملاحظات نہیں</translation> <translation id="2451298179137331965">2x</translation> @@ -1141,6 +1147,7 @@ <translation id="2587922766792651800">وقت ختم ہو گيا</translation> <translation id="2588636910004461974"><ph name="VENDOR_NAME" /> کے آلات</translation> <translation id="2594999711683503743">Google پر تلاش کریں یا URL ٹائپ کریں</translation> +<translation id="2600522410036850735">اس آلے کو <ph name="MONTH_AND_YEAR" /> تک خودکار سافٹ ویئر اور سیکیورٹی اپ ڈیٹس حاصل ہوں گی۔ <a target="_blank" href="<ph name="URL" />">مزید جانیں</a></translation> <translation id="2603115962224169880">کمپیوٹر صاف کریں</translation> <translation id="2603463522847370204">&پوشیدگی ونڈو میں کھولیں</translation> <translation id="2604255671529671813">نیٹ ورک کنکشن میں خرابی</translation> @@ -1561,6 +1568,7 @@ <translation id="3181954750937456830">محفوظ براؤزنگ (آپ اور آپ کے آلہ کی خطرناک سائٹس سے حفاظت کرتی ہے)</translation> <translation id="3182749001423093222">املا کی جانچ</translation> <translation id="3183139917765991655">پروفائل درآمد کنندہ</translation> +<translation id="3184536091884214176">ترتیب دیں یا CUPS پرنٹرز کا نظم کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="3188257591659621405">میری فائلز</translation> <translation id="3188465121994729530">اوسط کی منتقلی</translation> <translation id="3190558889382726167">پاس ورڈ محفوظ ہوگیا</translation> @@ -1751,7 +1759,6 @@ <translation id="347670947055184738">افوہ! سسٹم آپ کے آلہ کیلئے پالیسی بازیافت کرنے میں ناکام ہو گیا۔</translation> <translation id="347785443197175480"><ph name="HOST" /> کو اپنے کیمرا اور مائیکروفون تک حاصل کرنے کی اجازت دینا جاری رکھیں</translation> <translation id="3478685642445675458">کسی شخص کو ہٹانے سے پہلے براہ کرم اپنا پروفائل غیر مقفل کریں۔</translation> -<translation id="3479539252931486093">کیا یہ غیر متوقع تھا؟ <ph name="BEGIN_LINK" />ہمیں بتائیں<ph name="END_LINK" /></translation> <translation id="3479552764303398839">ابھی نہیں</translation> <translation id="3481268647794498892"><ph name="ALTERNATIVE_BROWSER_NAME" /> میں <ph name="COUNTDOWN_SECONDS" /> سیکنڈ میں کھل رہا ہے</translation> <translation id="3484273680291419129">نقصان دہ سافٹ ویئر ہٹایا جا رہا ہے...</translation> @@ -2258,6 +2265,7 @@ <translation id="4138267921960073861">صارف کے نام اور تصاویر سائن ان اسکرین پر دکھائیں</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID آلہ منسلک ہے</translation> <translation id="4142052906269098341">اپنے <ph name="DEVICE_TYPE" /> کو اپنے فون سے غیر فعال کریں <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">دریافت کردہ پرنٹرز کو اپنی پروفائل میں محفوظ کریں، یا ایک نیا پرنٹر شامل کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="4144218403971135344">بہتر معیار کی ویڈیو حاصل کریں اور بیٹری لائف کی بچت کریں۔ ویڈیو صرف آپ کی اس اسکرین پر چلے گی جس پر Cast فعال ہے۔</translation> <translation id="4146026355784316281">ہمیشہ سسٹم ناظر کے ساتھ کھولیں</translation> <translation id="4146785383423576110">ری سیٹ کریں اور صاف کریں</translation> @@ -2382,6 +2390,7 @@ <translation id="4364327530094270451">خربوزہ</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> ایک ونڈو کا اشتراک کر رہی ہے۔</translation> <translation id="4364830672918311045">اطلاعات ڈسپلے کریں</translation> +<translation id="436499142539576997">ایپ کا ڈیٹا حاصل کرنے میں ناکام، اب بھی ایپ کو چلانے کی کوشش کر رہا ہے...</translation> <translation id="4370975561335139969">آپ کی جانب سے درج کردہ ای میل اور پاس ورڈ مماثل نہیں ہیں</translation> <translation id="437184764829821926">جدید ترین فونٹس کی ترتیبات</translation> <translation id="4374831787438678295">Linux انسٹالر</translation> @@ -2572,6 +2581,7 @@ <translation id="465878909996028221">صرف http، https اور فائل پروٹوکولز ہی براؤزر کے ری ڈائریکٹس کے لئے تعاون یافتہ ہیں۔</translation> <translation id="4659077111144409915">بنیادی اکاؤنٹ</translation> <translation id="4660476621274971848">متوقع ورژن "<ph name="EXPECTED_VERSION" />"، لیکن ورژن تھا "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">آپ کے کمرے کا لے آؤٹ</translation> <translation id="4662788913887017617">اپنے iPhone کے ساتھ اس بُک مارک کا اشتراک کریں</translation> <translation id="4663373278480897665">کیمرا اجازت یافتہ ہے</translation> <translation id="4664482161435122549">PKCS #12 برآمد کرنے میں خرابی</translation> @@ -2735,6 +2745,7 @@ <translation id="4900392736118574277">آپ کا ابتدائی صفحہ <ph name="URL" /> پر تبدیل کر دیا گیا۔</translation> <translation id="4902546322522096650"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، <ph name="SECURITY_STATUS" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />%، منسلک کریں</translation> <translation id="49027928311173603">سرور سے ڈاؤن لوڈ کردہ پالیسی غلط ہے: <ph name="VALIDATION_ERROR" />۔</translation> +<translation id="4906490889887219338">نیٹ ورک فائل کے اشتراکات کو سیٹ اپ کریں یا ان کا نظم کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="4907161631261076876">یہ فائل عام طور پر ڈاؤن لوڈ نہیں کی جاتی ہے اور یہ خطرناک ہو سکتی ہے۔</translation> <translation id="4907306957610201395">اجازت کا زمرہ</translation> <translation id="4908811072292128752">ایک بار میں دو سائٹس کو براؤز کرنے کے لئے ایک نیا ٹیب کھولیں</translation> @@ -2822,6 +2833,7 @@ <translation id="5038863510258510803">فعال کر رہا ہے…</translation> <translation id="5039804452771397117">اجازت دیں</translation> <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> کو Linux سے منسلک کرنے کیلئے ترتیبات کھولیں</translation> +<translation id="5043913660911154449">یا اپنے پرنٹر PPD کی وضاحت کریں <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="5045550434625856497">غلط پاس ورڈ</translation> <translation id="504561833207953641">موجودہ براؤزر کے سیشن میں کھل رہا ہے۔</translation> <translation id="5047421709274785093">سائٹس کو موشن اور لائٹ سینسرز استعمال کرنے سے مسدود کریں</translation> @@ -3107,6 +3119,7 @@ <translation id="5464660706533281090">بچہ صارف اس ترتیب کو تبدیل نہیں کر سکتا۔</translation> <translation id="5466374726908360271">پیسٹ کریں اور “<ph name="SEARCH_TERMS" />” تلاش کریں</translation> <translation id="5468173180030470402">فائل کے اشتراکات تلاش کر رہے ہیں</translation> +<translation id="5470735824776589490">پاور واش کے ساتھ آپ کا آلہ دوبارہ ترتیب دیے جا سکنے سے پہلے ایک ری اسٹارٹ درکار ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="5471768120198416576">آداب! میں آپ کی ٹیکسٹ ٹو اسپیچ آواز ہوں۔</translation> <translation id="5472133193607270166">آن ہونے پر، اشتہارات کو مختلف سائٹس پر ذاتی نوعیت کا بنانے کے لیے سائٹس آپ کی براؤزنگ کی سرگرمی کا استعمال نہیں کر سکتی ہیں۔ ہو سکتا ہے کہ کچھ سائٹس ٹھیک طرح سے کام نہ کریں۔</translation> <translation id="5473333559083690127">نیا PIN دوبارہ درج کریں</translation> @@ -3130,6 +3143,7 @@ <translation id="5496587651328244253">منظم کریں</translation> <translation id="5499313591153584299">یہ فائل آپ کے کمپیوٹر کیلئے نقصاندہ ہو سکتی ہے۔</translation> <translation id="5502500733115278303">Firefox سے درآمد کردہ</translation> +<translation id="5505264765875738116">سائٹس اطلاعات بھیجنے کے لیے نہیں کہہ سکتی ہیں</translation> <translation id="5505307013568720083">سیاہی ختم ہو گئی</translation> <translation id="5507756662695126555">عدم استرداد</translation> <translation id="5509693895992845810">محفوظ کریں بطور…</translation> @@ -3344,6 +3358,7 @@ <translation id="5801568494490449797">ترجیحات</translation> <translation id="5804175651771201311">رومنگ آف ہے</translation> <translation id="5804241973901381774">اجازتیں</translation> +<translation id="5804427196348435412">NFC آلات استعمال کریں</translation> <translation id="5805697420284793859">ونڈو مینیجر</translation> <translation id="5806773519584576205">0° (ڈیفالٹ)</translation> <translation id="5811750797187914944">پوری طرح تیار ہے</translation> @@ -3559,6 +3574,7 @@ <translation id="6096047740730590436">بڑی کی ہوئی کھولیں</translation> <translation id="6096326118418049043">X.500 نام</translation> <translation id="6097480669505687979">اگر آپ جگہ خالی نہیں کرتے ہیں تو صارفین اور ڈیٹا کو خودکار طور پر ہٹایا جا سکتا ہے۔</translation> +<translation id="6097600385983390082">صوتی تلاش بند ہو گئی</translation> <translation id="6098793583803863900">خطرناک مواد کیلئے ایک نامعلوم فائل اسکین کی جا رہی ہے۔</translation> <translation id="6100736666660498114">شروع کرنے کا مینو</translation> <translation id="6101226222197207147">نئی ایپ شامل کر دی گئی (<ph name="EXTENSION_NAME" />)</translation> @@ -3654,6 +3670,7 @@ <translation id="6233154960150021497">کی بورڈ کی بجائے بطور ڈیفالٹ آواز کا استعمال کریں</translation> <translation id="6234474535228214774">انسٹال زیر التوا ہے</translation> <translation id="6237816943013845465">آپ کو آپ کی اسکرین ریزولیوشن کو ایڈجسٹ کرنے کی اجازت دیتی ہے</translation> +<translation id="6238624845858322552">بلوٹوتھ آلہ سے مربوط ہوں</translation> <translation id="6238767809035845642">دوسرے آلے سے اشتراک کردہ متن</translation> <translation id="6238923052227198598">مقفل اسکرین پر تازہ ترین نوٹ رکھیں</translation> <translation id="6239558157302047471">&فریم دوبارہ لوڈ کریں</translation> @@ -3680,6 +3697,7 @@ <translation id="6267547857941397424"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="PHONE_NAME" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />%، فون کی بیٹری <ph name="BATTERY_STATUS" />%، منسلک کریں</translation> <translation id="6268252012308737255"><ph name="APP" /> کے ساتھ کھولیں</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">سائٹس اطلاعات بھیجنے کے لیے کہہ سکتی ہیں</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />سسٹم اور ایپ کی معلومات<ph name="END_LINK1" /> اور <ph name="BEGIN_LINK2" />میٹرکس<ph name="END_LINK2" /> بھیجیں</translation> <translation id="6272643420381259437">پلگ ان کو ڈاؤن لوڈ کرتے ہوئے ایک خرابی (<ph name="ERROR" />) پیش آگئی</translation> <translation id="6273677812470008672">معیار</translation> @@ -3701,6 +3719,7 @@ <translation id="629730747756840877">اکاؤنٹ</translation> <translation id="6298962879096096191">Android ایپس کو انسٹال کرنے کیلئے Google Play استعمال کریں</translation> <translation id="630065524203833229">&خارج ہوں</translation> +<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> کو خودکار طور پر کنفیگر نہیں کیا جا سکا۔ براہ کرم پرنٹر کی جدید ترین تفصیلات بیان کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="6305607932814307878">عالمی پالیسی:</translation> <translation id="6307990684951724544">سسٹم مصروف ہے</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> کی طرف سے فراہم کردہ سائن ان</translation> @@ -3870,6 +3889,7 @@ <translation id="6555810572223193255">کلین اپ فی الحال دستیاب نہیں ہے</translation> <translation id="6556866813142980365">واپس لائیں</translation> <translation id="6557290421156335491">میرے شارٹ کٹس</translation> +<translation id="6561560012278703671">پر سکون پیغام رسانی کا استعمال کریں (اطلاع کی پرامپٹس کو آپ کو خلل ڈالنے سے مسدود کرتا ہے)</translation> <translation id="6561726789132298588">انٹر</translation> <translation id="656293578423618167">فائل کا پاتھ یا نام کافی طویل ہیں۔ براہ کرم ایک چھوٹے نام کے ساتھ یا کسی دوسرے مقام میں محفوظ کریں۔</translation> <translation id="6563469144985748109">آپ کے مینیجر نے ابھی تک اسے منظور نہیں کیا ہے</translation> @@ -4053,6 +4073,7 @@ <translation id="6840155290835956714">بھیجنے سے پہلے پوچھیں</translation> <translation id="6840184929775541289">ایک توثیقی ادارہ نہیں ہے</translation> <translation id="6841186874966388268">خرابیاں</translation> +<translation id="6843267103192918276">اپنے سبھی آلات پر اپنے بُک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات حاصل کرنے کیلئے سائن ان کریں۔ آپ اپنی Google سروسز میں خود بخود سائن ان بھی ہو جائیں گے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google پوری طرح تیار ہے</translation> <translation id="6845038076637626672">بڑی کی ہوئی کھولیں</translation> <translation id="6845325883481699275">Chrome کی سیکیورٹی کو بہتر بنانے میں مدد کریں</translation> @@ -4469,7 +4490,6 @@ <translation id="7442465037756169001">آپ کا Hangouts Meet hardware سیٹ اپ کیلئے تیار ہے۔</translation> <translation id="744341768939279100">ایک نیا پروفائل بنائیں</translation> <translation id="7443806024147773267">آپ جب بھی اپنے Google اکاؤنٹ میں سائن ان ہوں، اپنے پاس ورڈز تک رسائی حاصل کریں</translation> -<translation id="7444046173054089907">یہ سائٹ مسدود ہے</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> غیر فعال کریں</translation> <translation id="7448430327655618736">ایپس خودکار طور پر انسٹال کریں</translation> <translation id="7450761244949417357">ابھی <ph name="ALTERNATIVE_BROWSER_NAME" /> میں کھل رہا ہے</translation> @@ -5034,6 +5054,7 @@ <translation id="8214962590150211830">اس شخص کو ہٹا دیں</translation> <translation id="8215295261562449873">Linux اپ گریڈ کرنے سے پہلے میری ایپس اور فائلز کا ڈاؤن لوڈز فولڈر میں بیک اپ لیں۔</translation> <translation id="8217399928341212914">متعدد فائلوں کے خودکار ڈاؤن لوڈز کو مسدود کرنا جاری رکھیں</translation> +<translation id="8218847192766059983">زبانیں شامل کریں یا فہرست دوبارہ ترتیب دیں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="8221491193165283816">آپ عام طور پر اطلاعات کو مسدود کرتے ہیں۔ اس سائٹ کو آپ کو مطلع کرنے دینے کے لیے، یہاں کلک کریں۔</translation> <translation id="8225265270453771718">ایک ایپلیکیشن ونڈو کا اشتراک کریں</translation> <translation id="8225753906568652947">اپنی پیشکشوں کو بھنائیں</translation> @@ -5647,6 +5668,7 @@ <translation id="9065203028668620118">تبدیل کریں</translation> <translation id="9066773882585798925">بلند آواز سے پڑھا جانے والا ٹیکسٹ سنیں</translation> <translation id="9066782832737749352">ٹیکسٹ ٹو اسپیچ</translation> +<translation id="9067559831321817373">اپنے سائن ان کردہ اکاؤنٹس کا نظم کریں۔ Chrome اور Google Play کی ویب سائٹس، ایپس اور ایکسٹینشنز اجازتوں کی بنیاد پر آپ کے تجربہ کو حسب ضرورت بنانے کیلئے ان اکاؤنٹس کا استعمال کر سکتی ہیں۔ <a>مزید جانیں</a></translation> <translation id="9068849894565669697">رنگ منتخب کریں</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">بلوٹوتھ</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index d7b342b..13de84c 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1572,7 +1572,7 @@ <translation id="3192947282887913208">Audio fayllar</translation> <translation id="3194737229810486521"><ph name="URL" /> saytidan ma’lumotlarni mobil qurilmangizda doimiy saqlashga ruxsat so‘rovi keldi</translation> <translation id="3199127022143353223">Serverlar</translation> -<translation id="3201306578844503970">Tarmoqda muammo yuz berganligi uchun virtual mashina oʻrnatilmadi. Qayta urining yoki tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation> +<translation id="3201306578844503970">Tarmoqda muammo yuz bergani uchun virtual mashina oʻrnatilmadi. Qayta urining yoki tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Mavjud USB qurilmalar bu yerda chiqadi.</translation> <translation id="3202131003361292969">Fayl yo‘lagi</translation> <translation id="3202173864863109533">Bu ichki oyna ovozi o‘chirib qo‘yilgan</translation> @@ -1756,7 +1756,6 @@ <translation id="347670947055184738">Tizim qurilmangiz uchun qoidalarni aniqlay olmadi.</translation> <translation id="347785443197175480"><ph name="HOST" /> saytiga kamera va mikrofondan foydalanishga ruxsat berish</translation> <translation id="3478685642445675458">Foydalanuvchini olib tashlash uchun o‘z profilingizga kiring.</translation> -<translation id="3479539252931486093">Bu sayt bloklanmasligi kerakmidi? <ph name="BEGIN_LINK" />Bizga xabar qiling<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Hozir emas</translation> <translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> soniyadan keyin <ph name="ALTERNATIVE_BROWSER_NAME" /> orqali ochiladi</translation> <translation id="3484273680291419129">Zararli dastur o‘chirilmoqda...</translation> @@ -2285,7 +2284,7 @@ <translation id="4181841719683918333">Tillar</translation> <translation id="4184885522552335684">Ekranga o‘tkazish uchun sudrang</translation> <translation id="4194570336751258953">Teginib bosish xususiyatini yoqish</translation> -<translation id="4194595472342532425">Sozlashda muammo yuz berganligi uchun Plugin VM sozlanmadi. Tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation> +<translation id="4194595472342532425">Sozlashda muammo yuz bergani uchun Plugin VM sozlanmadi. Tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Yangi varaqda ochish</translation> <translation id="4195814663415092787">Avval ochilgan ichki oynalar</translation> <translation id="4198146608511578238">Google Assistent bilan gaplashish uchun Launcher ikonkasini bosib turing.</translation> @@ -4488,7 +4487,6 @@ <translation id="7442465037756169001">Hangouts Meet qurilmasi sozlash uchun tayyor</translation> <translation id="744341768939279100">Yangi profil yaratish</translation> <translation id="7443806024147773267">Istalgan qurilmadan Google hisobingizga kirsangiz, barcha parollaringizni doim ishlata olasiz.</translation> -<translation id="7444046173054089907">Bu sayt bloklangan</translation> <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> qurilmasini o‘chirib qo‘yish</translation> <translation id="7448430327655618736">Ilovalarni avtomatik ravishda oʻrnatish</translation> <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> orqali ochilmoqda</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index d8f5a546..804520f 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">Trang này hiện không phản hồi</translation> <translation id="1041263367839475438">Thiết bị hiện có</translation> <translation id="1042174272890264476">Máy tính của bạn cũng đi kèm với thư viện RLZ của <ph name="SHORT_PRODUCT_NAME" /> được tích hợp sẵn. RLZ chỉ định thẻ không thể nhận dạng cá nhân, không duy nhất để đo lường các tìm kiếm và mức độ sử dụng <ph name="SHORT_PRODUCT_NAME" /> mà một chiến dịch quảng cáo cụ thể mang lại. Đôi khi các nhãn này xuất hiện trong truy vấn Google Tìm kiếm trong <ph name="PRODUCT_NAME" />.</translation> +<translation id="1043818413152647937">Cũng xóa dữ liệu khỏi các ứng dụng này?</translation> <translation id="1045692658517323508">{0,plural, =1{Cập nhật trong vòng 1 phút}other{Cập nhật trong vòng # phút}}</translation> <translation id="1046635659603195359">Có vẻ như bạn đã thiết lập tính năng Voice Match với Trợ lý Google trên một thiết bị khác. Trợ lý có thể dùng những bản ghi âm đã có trước đây để tạo một mẫu giọng nói trên thiết bị này. Quá trình này sẽ mất chưa đến 1 phút.</translation> <translation id="1047431265488717055">Sao chép &văn bản liên kết</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">Trải nghiệm Google thông minh trong Chrome</translation> <translation id="1147991416141538220">Để yêu cầu quyền truy cập, hãy liên hệ với quản trị viên của thiết bị này.</translation> <translation id="1149401351239820326">Tháng hết hạn</translation> +<translation id="1150490752229770117">Đây là bản tự động cập nhật bảo mật và phần mềm mới nhất cho <ph name="DEVICE_TYPE" /> này. Để nhận các bản cập nhật trong tương lai, hãy nâng cấp lên mẫu thiết bị mới hơn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="1150565364351027703">Kính mát</translation> <translation id="1151917987301063366">Luôn cho phép <ph name="HOST" /> sử dụng các cảm biến của thiết bị</translation> <translation id="1153356358378277386">Thiết bị được ghép nối</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">Chọn một phiếu để dùng cho việc xác thực. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="1712349894969001173">Nhận mật khẩu này trên iPhone của bạn</translation> <translation id="1712552549805331520"><ph name="URL" /> muốn lưu trữ vĩnh viễn dữ liệu trên máy tính cục bộ của bạn</translation> +<translation id="1714644264617423774">Bật các tính năng hỗ trợ tiếp cận để dễ dàng sử dụng thiết bị của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Cảm biến chuyển động</translation> +<translation id="171824261579749339">Tiếng Úc <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="1718835860248848330">Giờ vừa qua</translation> <translation id="1719312230114180055">Lưu ý: Vân tay của bạn có thể kém an toàn hơn so với việc dùng mã PIN hoặc mật khẩu mạnh.</translation> <translation id="1720318856472900922">Xác thực Máy chủ TLS WWW</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">Xóa cookie của bên thứ ba</translation> <translation id="2097372108957554726">Bạn cần đăng nhập Chrome để đăng ký thiết bị mới</translation> <translation id="2099172618127234427">Bạn đâng bật tính năng gỡ lỗi của Chrome OS, thao tác này sẽ thiết lập sshd daemon và bật tính năng khởi động từ ổ USB.</translation> +<translation id="2099625543891475722">đặc điểm hình thể của bạn, chẳng hạn như chiều cao</translation> <translation id="2099686503067610784">Xóa chứng chỉ máy chủ "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Tự động đăng nhập</translation> <translation id="2101225219012730419">Phiên bản:</translation> @@ -1027,6 +1032,7 @@ <translation id="2445484935443597917">Tạo hồ sơ mới</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> muốn xác minh danh tính của bạn</translation> <translation id="2448312741937722512">Loại</translation> +<translation id="2448734521821581858">Cookie là những tệp do các trang web bạn truy cập tạo ra. Có 2 loại cookie: Cookie của bên thứ nhất do trang web mà bạn truy cập tạo ra. Trang web này hiển thị trên thanh địa chỉ. Cookie của bên thứ ba do các trang web khác tạo ra. Các trang web này sở hữu một số nội dung như quảng cáo hoặc hình ảnh mà bạn thấy trên trang web mình truy cập.</translation> <translation id="2450223707519584812">Bạn không thể thêm người dùng vì thiếu khóa Google API. Xem <ph name="DETAILS_URL" /> để biết thông tin chi tiết.</translation> <translation id="2450849356604136918">Không có chế độ xem đang hoạt động nào</translation> <translation id="2451298179137331965">2x</translation> @@ -1140,6 +1146,7 @@ <translation id="2587922766792651800">Đã hết thời gian chờ</translation> <translation id="2588636910004461974">Thiết bị của <ph name="VENDOR_NAME" /></translation> <translation id="2594999711683503743">Tìm kiếm trên Google hoặc nhập URL</translation> +<translation id="2600522410036850735">Thiết bị này sẽ tự động nhận được các bản cập nhật bảo mật và phần mềm cho đến <ph name="MONTH_AND_YEAR" />. <a target="_blank" href="<ph name="URL" />">Tìm hiểu thêm</a></translation> <translation id="2603115962224169880">Dọn dẹp máy tính</translation> <translation id="2603463522847370204">Mở trong cửa sổ ẩ&n danh</translation> <translation id="2604255671529671813">Lỗi kết nối mạng</translation> @@ -1560,6 +1567,7 @@ <translation id="3181954750937456830">Duyệt web an toàn (bảo vệ bạn cũng như thiết bị của bạn khỏi các trang web nguy hiểm)</translation> <translation id="3182749001423093222">Kiểm tra chính tả</translation> <translation id="3183139917765991655">Trình nhập hồ sơ</translation> +<translation id="3184536091884214176">Thiết lập hoặc quản lý máy in CUPS. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="3188257591659621405">Tệp của tôi</translation> <translation id="3188465121994729530">Trung bình động</translation> <translation id="3190558889382726167">Đã lưu mật khẩu</translation> @@ -1750,7 +1758,6 @@ <translation id="347670947055184738">Rất tiếc! Hệ thống không tìm nạp được chính sách cho thiết bị của bạn.</translation> <translation id="347785443197175480">Tiếp tục cho phép <ph name="HOST" /> truy cập vào máy ảnh và micrô của bạn</translation> <translation id="3478685642445675458">Vui lòng mở khóa hồ sơ của bạn trước khi xóa một người.</translation> -<translation id="3479539252931486093">Trang web này có như bạn mong đợi không? Hãy <ph name="BEGIN_LINK" />cho chúng tôi biết<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Không phải bây giờ</translation> <translation id="3481268647794498892">Sẽ mở trong <ph name="ALTERNATIVE_BROWSER_NAME" /> sau <ph name="COUNTDOWN_SECONDS" /> giây</translation> <translation id="3484273680291419129">Đang xóa phần mềm độc hại...</translation> @@ -2257,6 +2264,7 @@ <translation id="4138267921960073861">Hiển thị tên người dùng và ảnh trên màn hình đăng nhập</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – Đã kết nối thiết bị giao diện tương tác với con người (HID)</translation> <translation id="4142052906269098341">Mở khóa <ph name="DEVICE_TYPE" /> bằng điện thoại của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">Lưu các máy in đã phát hiện vào hồ sơ của bạn hoặc thêm một máy in mới. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="4144218403971135344">Trải nhiệm chất lượng video tốt hơn và tiết kiệm pin. Video sẽ chỉ phát trên màn hình có hỗ trợ tính năng Truyền.</translation> <translation id="4146026355784316281">Luôn mở bằng trình xem hệ thống</translation> <translation id="4146785383423576110">Đặt lại và dọn dẹp</translation> @@ -2381,6 +2389,7 @@ <translation id="4364327530094270451">Quả dưa</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation> <translation id="4364830672918311045">Hiển thị thông báo</translation> +<translation id="436499142539576997">Không lấy được dữ liệu ứng dụng. Hệ thống vẫn đang cố chạy ứng dụng...</translation> <translation id="4370975561335139969">Email và mật khẩu bạn nhập không khớp</translation> <translation id="437184764829821926">Cài đặt phông chữ nâng cao</translation> <translation id="4374831787438678295">Trình cài đặt Linux</translation> @@ -2571,6 +2580,7 @@ <translation id="465878909996028221">Chỉ hỗ trợ chuyển hướng trình duyệt cho các giao thức http, https và tệp.</translation> <translation id="4659077111144409915">Tài khoản chính</translation> <translation id="4660476621274971848">Phiên bản mong muốn là "<ph name="EXPECTED_VERSION" />", nhưng phiên bản phát hiện là "<ph name="NEW_ID" />"</translation> +<translation id="4660838440047236328">cách bài trí phòng của bạn</translation> <translation id="4662788913887017617">Chia sẻ dấu trang này với iPhone của bạn</translation> <translation id="4663373278480897665">Cho phép máy ảnh</translation> <translation id="4664482161435122549">Lỗi xuất PKCS #12</translation> @@ -2734,6 +2744,7 @@ <translation id="4900392736118574277">Trang khởi động của bạn đã được thay đổi thành <ph name="URL" />.</translation> <translation id="4902546322522096650">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, Cường độ tín hiệu <ph name="SIGNAL_STRENGTH" />%, Kết nối</translation> <translation id="49027928311173603">Chính sách được tải xuống từ máy chủ không hợp lệ: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4906490889887219338">Thiết lập hoặc quản lý tính năng chia sẻ tệp trong mạng. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="4907161631261076876">Tệp này thường không được tải xuống và có thể nguy hiểm.</translation> <translation id="4907306957610201395">Danh mục quyền</translation> <translation id="4908811072292128752">Mở tab mới để duyệt hai trang web cùng lúc</translation> @@ -2821,6 +2832,7 @@ <translation id="5038863510258510803">Đang bật...</translation> <translation id="5039804452771397117">Cho phép</translation> <translation id="5042282098504489593">Mở phần Cài đặt để kết nối <ph name="USB_DEVICE_NAME" /> với Linux</translation> +<translation id="5043913660911154449">Hoặc chỉ định tệp PPD cho máy in của bạn <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5045550434625856497">Mật khẩu sai</translation> <translation id="504561833207953641">Mở trong phiên trình duyệt hiện tại.</translation> <translation id="5047421709274785093">Chặn các trang web sử dụng cảm biến chuyển động và ánh sáng</translation> @@ -3106,6 +3118,7 @@ <translation id="5464660706533281090">Người dùng là trẻ em không thể thay đổi tùy chọn cài đặt này.</translation> <translation id="5466374726908360271">Dá&n và tìm kiếm “<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">Đang tìm mục chia sẻ tệp</translation> +<translation id="5470735824776589490">Bạn cần khởi động lại trước khi có thể đặt lại thiết bị của mình bằng Powerwash. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Chào bạn! Đây là giọng nói của tính năng chuyển văn bản sang lời nói.</translation> <translation id="5472133193607270166">Khi tùy chọn này bật, các trang web không thể dùng hoạt động duyệt web của bạn trên nhiều trang web để cá nhân hóa quảng cáo. Một số trang web có thể không hoạt động bình thường.</translation> <translation id="5473333559083690127">Nhập lại mã PIN mới</translation> @@ -3129,6 +3142,7 @@ <translation id="5496587651328244253">Tổ chức</translation> <translation id="5499313591153584299">Tệp này có thể có hại cho máy tính của bạn.</translation> <translation id="5502500733115278303">Đã nhập từ Firefox</translation> +<translation id="5505264765875738116">Các trang web không thể xin phép gửi thông báo</translation> <translation id="5505307013568720083">Hết mực</translation> <translation id="5507756662695126555">Không tuân thủ</translation> <translation id="5509693895992845810">Lưu &Dưới dạng...</translation> @@ -3343,6 +3357,7 @@ <translation id="5801568494490449797">Tùy chọn</translation> <translation id="5804175651771201311">Chế độ chuyển vùng đang tắt</translation> <translation id="5804241973901381774">Quyền</translation> +<translation id="5804427196348435412">Sử dụng các thiết bị dùng công nghệ NFC</translation> <translation id="5805697420284793859">Trình quản lý cửa sổ</translation> <translation id="5806773519584576205">0° (Mặc định)</translation> <translation id="5811750797187914944">Đã hoàn tất</translation> @@ -3558,6 +3573,7 @@ <translation id="6096047740730590436">Mở ở dạng phóng to</translation> <translation id="6096326118418049043">Tên X.500</translation> <translation id="6097480669505687979">Nếu bạn không giải phóng dung lượng, người dùng và dữ liệu có thể tự động bị xóa.</translation> +<translation id="6097600385983390082">Tùy chọn tìm kiếm bằng giọng nói đã đóng</translation> <translation id="6098793583803863900">Đang quét một tệp không xác định để tìm nội dung nguy hiểm.</translation> <translation id="6100736666660498114">Menu Start</translation> <translation id="6101226222197207147">Đã thêm ứng dụng mới (<ph name="EXTENSION_NAME" />)</translation> @@ -3653,6 +3669,7 @@ <translation id="6233154960150021497">Đặt chế độ mặc định là sử dụng giọng nói thay cho bàn phím</translation> <translation id="6234474535228214774">Đang chờ cài đặt</translation> <translation id="6237816943013845465">Cho phép bạn điều chỉnh độ phân giải màn hình</translation> +<translation id="6238624845858322552">Kết nối với thiết bị Bluetooth</translation> <translation id="6238767809035845642">Văn bản được chia sẻ từ Thiết bị khác</translation> <translation id="6238923052227198598">Giữ ghi chú mới nhất trên màn hình khóa</translation> <translation id="6239558157302047471">Tải lại &khung</translation> @@ -3679,6 +3696,7 @@ <translation id="6267547857941397424">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, Cường độ tín hiệu <ph name="SIGNAL_STRENGTH" />%, Pin điện thoại <ph name="BATTERY_STATUS" />%, Kết nối</translation> <translation id="6268252012308737255">Mở bằng <ph name="APP" /></translation> <translation id="6268718011101775129">Công nghệ giao tiếp tầm gần (NFC)</translation> +<translation id="6270391203985052864">Các trang web có thể xin phép gửi thông báo</translation> <translation id="6270770586500173387">Gửi <ph name="BEGIN_LINK1" />thông tin hệ thống và ứng dụng<ph name="END_LINK1" /> cũng như <ph name="BEGIN_LINK2" />số liệu<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">Đã xảy ra lỗi (<ph name="ERROR" />) khi tải xuống plugin</translation> <translation id="6273677812470008672">Chất lượng</translation> @@ -3700,6 +3718,7 @@ <translation id="629730747756840877">Tài khoản</translation> <translation id="6298962879096096191">Sử dụng Google Play để cài đặt các ứng dụng Android</translation> <translation id="630065524203833229">T&hoát</translation> +<translation id="6300718114348072351">Không thể tự động định cấu hình cho <ph name="PRINTER_NAME" />. Vui lòng chỉ định các tùy chọn cài đặt nâng cao cho máy in. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="6305607932814307878">Chính sách toàn cầu:</translation> <translation id="6307990684951724544">Hệ thống đang bận</translation> <translation id="6308493641021088955">Màn hình đăng nhập do <ph name="EXTENSION_NAME" /> cung cấp</translation> @@ -3869,6 +3888,7 @@ <translation id="6555810572223193255">Tính năng dọn dẹp hiện không khả dụng</translation> <translation id="6556866813142980365">Làm lại</translation> <translation id="6557290421156335491">Lối tắt của tôi</translation> +<translation id="6561560012278703671">Dùng thông báo nhẹ nhàng hơn (chặn thông báo bật lên làm phiền bạn)</translation> <translation id="6561726789132298588">enter</translation> <translation id="656293578423618167">Tên hoặc đường dẫn của tệp quá dài. Hãy lưu với tên ngắn hơn hoặc lưu vào một vị trí khác.</translation> <translation id="6563469144985748109">Người quản lý của bạn chưa phê duyệt trang web</translation> @@ -4052,6 +4072,7 @@ <translation id="6840155290835956714">Hỏi trước khi gửi</translation> <translation id="6840184929775541289">Không phải là Tổ chức phát hành chứng chỉ</translation> <translation id="6841186874966388268">Lỗi</translation> +<translation id="6843267103192918276">Đăng nhập để sử dụng dấu trang, lịch sử hoạt động, mật khẩu và các tùy chọn cài đặt khác trên tất cả thiết bị của bạn. Bạn cũng sẽ tự động được đăng nhập vào các dịch vụ Google mà mình đang sử dụng. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Đã thiết lập xong Ok Google</translation> <translation id="6845038076637626672">Mở ở dạng phóng to</translation> <translation id="6845325883481699275">Giúp cải thiện khả năng bảo mật của Chrome</translation> @@ -4468,7 +4489,6 @@ <translation id="7442465037756169001">Bạn hiện có thể thiết lập phần cứng Hangouts Meet.</translation> <translation id="744341768939279100">Tạo cấu hình mới</translation> <translation id="7443806024147773267">Sử dụng mật khẩu mỗi khi bạn đăng nhập vào Tài khoản Google của mình</translation> -<translation id="7444046173054089907">Trang web này bị chặn</translation> <translation id="7444983668544353857">Vô hiệu hóa <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Tự động cài đặt ứng dụng</translation> <translation id="7450761244949417357">Hiện đang mở trong <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> @@ -5033,6 +5053,7 @@ <translation id="8214962590150211830">Xóa người này</translation> <translation id="8215295261562449873">Sao lưu ứng dụng và tệp của tôi vào thư mục Tệp đã tải xuống trước khi nâng cấp Linux.</translation> <translation id="8217399928341212914">Tiếp tục chặn tự động tải nhiều tệp xuống</translation> +<translation id="8218847192766059983">Thêm ngôn ngữ hoặc sắp xếp lại danh sách. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="8221491193165283816">Bạn thường chặn các thông báo. Để cho phép trang web này thông báo cho bạn, hãy nhấp vào đây.</translation> <translation id="8225265270453771718">Chia sẻ cửa sổ ứng dụng</translation> <translation id="8225753906568652947">Đổi ưu đãi của bạn</translation> @@ -5646,6 +5667,7 @@ <translation id="9065203028668620118">Chỉnh sửa</translation> <translation id="9066773882585798925">Nghe đọc to văn bản</translation> <translation id="9066782832737749352">Chuyển văn bản sang lời nói</translation> +<translation id="9067559831321817373">Quản lý các tài khoản bạn đã đăng nhập. Các trang web, ứng dụng và tiện ích trong Chrome cũng như Google Play có thể dùng những tài khoản này để mang lại trải nghiệm phù hợp cho bạn, tùy theo sự cho phép. <a>Tìm hiểu thêm</a></translation> <translation id="9068849894565669697">Chọn màu</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 4d500b5..b154c877c 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">该页面未响应</translation> <translation id="1041263367839475438">可用的设备</translation> <translation id="1042174272890264476">您的计算机还内置了 <ph name="SHORT_PRODUCT_NAME" /> 的 RLZ 库。RLZ 会指定非唯一、非个人身份识别代码来衡量某推广活动所带来的搜索量和 <ph name="SHORT_PRODUCT_NAME" /> 使用量。这些标签有时会显示在 <ph name="PRODUCT_NAME" /> 的 Google 搜索查询中。</translation> +<translation id="1043818413152647937">也清除以下应用内的数据?</translation> <translation id="1045692658517323508">{0,plural, =1{请在 1 分钟内更新}other{请在 # 分钟内更新}}</translation> <translation id="1046635659603195359">您似乎已在另一部设备上为 Google 助理设置了 Voice Match 功能。这些先前的录音可用于在此设备上创建语音模型,创建过程通常会在 1 分钟内完成。</translation> <translation id="1047431265488717055">复制链接文字(&X)</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">在 Chrome 中畅享 Google 的智能技术</translation> <translation id="1147991416141538220">要申请访问权限,请与此设备的管理员联系。</translation> <translation id="1149401351239820326">过期月份</translation> +<translation id="1150490752229770117">这是最后一次自动为此 <ph name="DEVICE_TYPE" /> 提供软件更新和安全更新。要想接收未来的更新,请升级至较新的型号。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1150565364351027703">太阳镜</translation> <translation id="1151917987301063366">始终允许 <ph name="HOST" /> 使用传感器</translation> <translation id="1153356358378277386">已配对的设备</translation> @@ -508,7 +510,9 @@ <translation id="1709217939274742847">选择用于进行身份验证的票据。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1712349894969001173">通过您的 iPhone 获取此密码</translation> <translation id="1712552549805331520"><ph name="URL" /> 想在您的本地计算机上永久存储数据</translation> +<translation id="1714644264617423774">启用无障碍功能,以使您的设备更易于使用。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1717218214683051432">动态传感器</translation> +<translation id="171824261579749339">自然滚动<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="1718835860248848330">过去一小时</translation> <translation id="1719312230114180055">请注意:指纹识别的安全性可能不及安全系数高的密码或 PIN 码。</translation> <translation id="1720318856472900922">TLS WWW 服务器身份验证</translation> @@ -770,6 +774,7 @@ <translation id="2096715839409389970">清除第三方 Cookie</translation> <translation id="2097372108957554726">您需要登录 Chrome 才能注册新设备</translation> <translation id="2099172618127234427">您正在启用 Chrome 操作系统调试功能,此功能将设置 sshd 守护程序并允许从 U 盘启动设备。</translation> +<translation id="2099625543891475722">您的身体特征,例如身高</translation> <translation id="2099686503067610784">要删除服务器证书“<ph name="CERTIFICATE_NAME" />”吗?</translation> <translation id="2100273922101894616">自动登录</translation> <translation id="2101225219012730419">版本:</translation> @@ -1023,6 +1028,7 @@ <translation id="2445484935443597917">创建新的个人资料</translation> <translation id="2446585455334014596">“<ph name="APP_NAME" />”想验证您的身份</translation> <translation id="2448312741937722512">类型</translation> +<translation id="2448734521821581858">Cookie 是您访问过的网站所创建的文件。Cookie 分为两类:第一方 Cookie 是由您访问过的网站创建而成。相应网站会显示在地址栏中。第三方 Cookie 是由其他网站创建而成。这些网站拥有您在所访问网站上看到的部分内容(比如广告或图片)。</translation> <translation id="2450223707519584812">您将无法添加用户,因为缺少 Google API 密钥。详情请见 <ph name="DETAILS_URL" />。</translation> <translation id="2450849356604136918">没有正在运行的视图</translation> <translation id="2451298179137331965">2 倍</translation> @@ -1136,6 +1142,7 @@ <translation id="2587922766792651800">已超时</translation> <translation id="2588636910004461974">来自<ph name="VENDOR_NAME" />的设备</translation> <translation id="2594999711683503743">使用 Google 执行搜索,或者输入网址</translation> +<translation id="2600522410036850735">此设备将会自动收到软件更新和安全更新,直至 <ph name="MONTH_AND_YEAR" />为止。<a target="_blank" href="<ph name="URL" />">了解详情</a></translation> <translation id="2603115962224169880">清理计算机</translation> <translation id="2603463522847370204">在隐身窗口中打开(&I)</translation> <translation id="2604255671529671813">网络连接错误</translation> @@ -1556,6 +1563,7 @@ <translation id="3181954750937456830">安全浏览(保护您和您的设备不受危险网站的侵害)</translation> <translation id="3182749001423093222">拼写检查</translation> <translation id="3183139917765991655">个人资料导入应用</translation> +<translation id="3184536091884214176">设置或管理 CUPS 打印机。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="3188257591659621405">我的文件</translation> <translation id="3188465121994729530">移动平均值</translation> <translation id="3190558889382726167">密码已保存</translation> @@ -1746,7 +1754,6 @@ <translation id="347670947055184738">糟糕!系统未能成功抓取您设备的政策。</translation> <translation id="347785443197175480">继续允许 <ph name="HOST" /> 使用您的摄像头和麦克风</translation> <translation id="3478685642445675458">在移除用户前,请先解锁您的个人资料。</translation> -<translation id="3479539252931486093">不应该出现这种情况?请<ph name="BEGIN_LINK" />告诉我们<ph name="END_LINK" /></translation> <translation id="3479552764303398839">以后再说</translation> <translation id="3481268647794498892">将于 <ph name="COUNTDOWN_SECONDS" /> 秒后在<ph name="ALTERNATIVE_BROWSER_NAME" />中打开</translation> <translation id="3484273680291419129">正在移除有害软件…</translation> @@ -2252,6 +2259,7 @@ <translation id="4138267921960073861">在登录屏幕上显示用户名和照片</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID 设备已连接</translation> <translation id="4142052906269098341">使用手机解锁 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">您既可将检测到的打印机保存至您的个人资料名下,也可添加新的打印机。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="4144218403971135344">获取更优质的视频并减少耗电量。视频仅会在支持 Cast 的屏幕上播放。</translation> <translation id="4146026355784316281">始终使用系统查看器打开</translation> <translation id="4146785383423576110">重置并清理</translation> @@ -2376,6 +2384,7 @@ <translation id="4364327530094270451">甜瓜</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共享窗口。</translation> <translation id="4364830672918311045">显示通知</translation> +<translation id="436499142539576997">未能获取应用数据,仍在尝试运行此应用…</translation> <translation id="4370975561335139969">您输入的电子邮件地址和密码不匹配。</translation> <translation id="437184764829821926">高级字体设置</translation> <translation id="4374831787438678295">Linux 安装程序</translation> @@ -2566,6 +2575,7 @@ <translation id="465878909996028221">浏览器重定向仅支持 http、https 和文件协议。</translation> <translation id="4659077111144409915">主帐号</translation> <translation id="4660476621274971848">预期版本是“<ph name="EXPECTED_VERSION" />”,但实际版本是“<ph name="NEW_ID" />”</translation> +<translation id="4660838440047236328">您房间的布局</translation> <translation id="4662788913887017617">将此书签共享给您的 iPhone</translation> <translation id="4663373278480897665">已允许使用摄像头</translation> <translation id="4664482161435122549">PKCS #12 导出错误</translation> @@ -2729,6 +2739,7 @@ <translation id="4900392736118574277">您的启动页已改为 <ph name="URL" />。</translation> <translation id="4902546322522096650">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="SECURITY_STATUS" />,信号强度为 <ph name="SIGNAL_STRENGTH" />%,连接</translation> <translation id="49027928311173603">从服务器下载的策略无效:<ph name="VALIDATION_ERROR" />。</translation> +<translation id="4906490889887219338">设置或管理网络文件共享。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="4907161631261076876">此文件属于不常下载的内容,可能存在危险。</translation> <translation id="4907306957610201395">权限类别</translation> <translation id="4908811072292128752">只需打开一个新标签页,即可同时浏览两个网站</translation> @@ -2816,6 +2827,7 @@ <translation id="5038863510258510803">正在启用...</translation> <translation id="5039804452771397117">允许</translation> <translation id="5042282098504489593">打开“设置”以将<ph name="USB_DEVICE_NAME" />连接到 Linux</translation> +<translation id="5043913660911154449">或指定您的打印机 PPD <ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="5045550434625856497">密码不正确</translation> <translation id="504561833207953641">正在现有的浏览器会话中打开。</translation> <translation id="5047421709274785093">禁止网站使用动作传感器和光传感器</translation> @@ -3101,6 +3113,7 @@ <translation id="5464660706533281090">未成年用户无法更改此设置。</translation> <translation id="5466374726908360271">粘贴并搜索“<ph name="SEARCH_TERMS" />”</translation> <translation id="5468173180030470402">正在查找文件共享</translation> +<translation id="5470735824776589490">必须先重启设备,然后才能通过 Powerwash 重置它。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="5471768120198416576">您好!这是文字转语音的语音。</translation> <translation id="5472133193607270166">当此设置处于开启状态时,网站无法根据您在各个不同网站上的浏览活动为您展示个性化广告。某些网站可能会无法正常运行。</translation> <translation id="5473333559083690127">请重新输入新的 PIN 码</translation> @@ -3124,6 +3137,7 @@ <translation id="5496587651328244253">整理</translation> <translation id="5499313591153584299">此文件可能对您的计算机有害。</translation> <translation id="5502500733115278303">从 Firefox 导入</translation> +<translation id="5505264765875738116">网站无法询问能否向您发送通知</translation> <translation id="5505307013568720083">墨水已耗尽</translation> <translation id="5507756662695126555">不可否认</translation> <translation id="5509693895992845810">存储为(&A)...</translation> @@ -3338,6 +3352,7 @@ <translation id="5801568494490449797">偏好设置</translation> <translation id="5804175651771201311">漫游服务已关闭</translation> <translation id="5804241973901381774">权限</translation> +<translation id="5804427196348435412">使用 NFC 设备</translation> <translation id="5805697420284793859">窗口管理器</translation> <translation id="5806773519584576205">0°(默认)</translation> <translation id="5811750797187914944">设置完毕</translation> @@ -3553,6 +3568,7 @@ <translation id="6096047740730590436">以最大化模式打开</translation> <translation id="6096326118418049043">X.500 名称</translation> <translation id="6097480669505687979">如果不释放空间,系统可能会自动移除用户和数据。</translation> +<translation id="6097600385983390082">已关闭语音搜索</translation> <translation id="6098793583803863900">正在扫描一个不明文件以确认其中是否包含危险内容。</translation> <translation id="6100736666660498114">“开始”菜单</translation> <translation id="6101226222197207147">已添加新应用(<ph name="EXTENSION_NAME" />)</translation> @@ -3648,6 +3664,7 @@ <translation id="6233154960150021497">默认为使用语音(而非键盘)</translation> <translation id="6234474535228214774">正等待安装</translation> <translation id="6237816943013845465">可让您调整屏幕分辨率</translation> +<translation id="6238624845858322552">连接到蓝牙设备</translation> <translation id="6238767809035845642">从其他设备分享的文字</translation> <translation id="6238923052227198598">始终将最新记事显示在锁定屏幕上</translation> <translation id="6239558157302047471">重新加载框架(&F)</translation> @@ -3674,6 +3691,7 @@ <translation id="6267547857941397424">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="PHONE_NAME" />,信号强度为 <ph name="SIGNAL_STRENGTH" />%,剩余电量为 <ph name="BATTERY_STATUS" />%,连接</translation> <translation id="6268252012308737255">使用<ph name="APP" />打开</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">网站可以询问能否向您发送通知</translation> <translation id="6270770586500173387">发送<ph name="BEGIN_LINK1" />系统和应用信息<ph name="END_LINK1" />以及<ph name="BEGIN_LINK2" />指标<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">下载该插件时出现错误 (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">打印质量</translation> @@ -3695,6 +3713,7 @@ <translation id="629730747756840877">帐号</translation> <translation id="6298962879096096191">使用 Google Play 安装 Android 应用</translation> <translation id="630065524203833229">退出(&X)</translation> +<translation id="6300718114348072351">无法自动配置<ph name="PRINTER_NAME" />。请指定高级打印机详细信息。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="6305607932814307878">全局政策:</translation> <translation id="6307990684951724544">系统繁忙</translation> <translation id="6308493641021088955">登录服务提供方:<ph name="EXTENSION_NAME" /></translation> @@ -3864,6 +3883,7 @@ <translation id="6555810572223193255">目前无法进行清理</translation> <translation id="6556866813142980365">重做</translation> <translation id="6557290421156335491">我的快捷方式</translation> +<translation id="6561560012278703671">改用更静默的提示方式(不直接弹出提示来询问能否向您发送通知,以免造成打扰)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="656293578423618167">该文件的路径或名称过长。请以较短的名称保存或保存到其他位置。</translation> <translation id="6563469144985748109">您的管理员尚未批准此网站</translation> @@ -4047,6 +4067,7 @@ <translation id="6840155290835956714">发送前先询问</translation> <translation id="6840184929775541289">不是证书授权中心</translation> <translation id="6841186874966388268">错误</translation> +<translation id="6843267103192918276">开启同步功能后,您只需在任一设备上使用自己的 Google 帐号登录 Chrome,便可轻松获取您的所有 Chrome 书签、历史记录、密码和其他设置。在这种情况下,您也会自动登录 Google 服务。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google 已设置完毕</translation> <translation id="6845038076637626672">以最大化模式打开</translation> <translation id="6845325883481699275">帮助我们改善 Chrome 安全性</translation> @@ -4463,7 +4484,6 @@ <translation id="7442465037756169001">您的 Hangouts Meet 设备现已可供设置了。</translation> <translation id="744341768939279100">创建新的个人资料</translation> <translation id="7443806024147773267">只要您登录自己的 Google 帐号,即可获取您的密码</translation> -<translation id="7444046173054089907">此网站已被屏蔽</translation> <translation id="7444983668544353857">停用<ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">自动安装应用</translation> <translation id="7450761244949417357">正在<ph name="ALTERNATIVE_BROWSER_NAME" />中打开</translation> @@ -5027,6 +5047,7 @@ <translation id="8214962590150211830">移除此用户</translation> <translation id="8215295261562449873">在升级 Linux 之前,将我的应用和文件备份到“下载内容”文件夹。</translation> <translation id="8217399928341212914">继续阻止自动下载多个文件</translation> +<translation id="8218847192766059983">添加语言或调整列表中的语言排序。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> <translation id="8221491193165283816">您通常会屏蔽通知。要允许此网站向您发送通知,请点击此处。</translation> <translation id="8225265270453771718">共享应用窗口</translation> <translation id="8225753906568652947">兑换优惠</translation> @@ -5640,6 +5661,7 @@ <translation id="9065203028668620118">编辑</translation> <translation id="9066773882585798925">让系统大声朗读文字</translation> <translation id="9066782832737749352">文字转语音</translation> +<translation id="9067559831321817373">管理您登录过的帐号。Chrome 和 Google Play 中的网站、应用和扩展程序可能会使用这些帐号为您定制专属体验,具体取决于所获权限。<a>了解详情</a></translation> <translation id="9068849894565669697">选择颜色</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">蓝牙</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index a709f55..e2288c9f 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">此網頁沒有回應</translation> <translation id="1041263367839475438">可用的裝置</translation> <translation id="1042174272890264476">您的電腦也內置了 <ph name="SHORT_PRODUCT_NAME" /> 的 RLZ 資料庫。RLZ 可指定非重複、非個人的可識別標記,以評估特定宣傳廣告活動所提升的搜尋數量與 <ph name="SHORT_PRODUCT_NAME" /> 使用量。這些標籤有時也會顯示在 <ph name="PRODUCT_NAME" /> 的 Google 搜尋查詢中。</translation> +<translation id="1043818413152647937">要一併清除這些應用程式中的資料嗎?</translation> <translation id="1045692658517323508">{0,plural, =1{請在 1 分鐘內更新}other{請在 # 分鐘內更新}}</translation> <translation id="1046635659603195359">您似乎已在另一部裝置上透過「Google 助理」設定了 Voice Match 功能。先前的錄音可在此裝置上用於建立語音模型,過程需時少於一分鐘。</translation> <translation id="1047431265488717055">複製連結文字(&X)</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">在 Chrome 中體驗 Google 的智能功能</translation> <translation id="1147991416141538220">如要求存取權,請聯絡此裝置的管理員。</translation> <translation id="1149401351239820326">到期月份</translation> +<translation id="1150490752229770117">這是這部 <ph name="DEVICE_TYPE" /> 最後一次自動更新軟體和安全性。如要取得後續更新,請升級為較新的型號。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1150565364351027703">太陽眼鏡</translation> <translation id="1151917987301063366">永遠允許 <ph name="HOST" /> 存取感應器</translation> <translation id="1153356358378277386">已配對的裝置</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">選擇用作驗證的票證。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1712349894969001173">在 iPhone 上取得此密碼</translation> <translation id="1712552549805331520"><ph name="URL" /> 要求在您的本機電腦上永久儲存數據</translation> +<translation id="1714644264617423774">啟用無障礙功能,讓裝置更容易使用。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1717218214683051432">動作感應器</translation> +<translation id="171824261579749339">澳洲式。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1718835860248848330">過去一小時</translation> <translation id="1719312230114180055">請注意:相比安全性較強的密碼或 PIN,指紋識別的安全性較低。</translation> <translation id="1720318856472900922">TLS WWW 伺服器驗證</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">清除第三方 Cookie</translation> <translation id="2097372108957554726">您必須登入 Chrome 以註冊新裝置</translation> <translation id="2099172618127234427">您即將啟用 Chrome 作業系統偵錯功能;啟用後,系統會設定 sshd 協助程式,並啟用 USB 記憶體開機功能。</translation> +<translation id="2099625543891475722">你的身體特徵,例如身高</translation> <translation id="2099686503067610784">要刪除伺服器憑證「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2101225219012730419">版本:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">建立新的設定檔</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> 要求驗證您的身分</translation> <translation id="2448312741937722512">類型</translation> +<translation id="2448734521821581858">Cookie 是你造訪過的網站所建立的檔案,Cookie 分為兩種類型:第一方 Cookie 由你造訪過的網站所建立,也就是網址列所顯示的網站。第三方 Cookie 由其他網站所建立。這類網站通常是在你造訪的網站上提供部分內容 (例如廣告或圖片) 的其他網站。</translation> <translation id="2450223707519584812">找不到 Google API 金鑰,因此您無法新增使用者。詳情請參閱 <ph name="DETAILS_URL" />。</translation> <translation id="2450849356604136918">沒有運作中的檢視</translation> <translation id="2451298179137331965">2 倍</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">已逾時</translation> <translation id="2588636910004461974">來自 <ph name="VENDOR_NAME" /> 的裝置</translation> <translation id="2594999711683503743">搜尋 Google 或輸入網址</translation> +<translation id="2600522410036850735">這部裝置在 <ph name="MONTH_AND_YEAR" />前會自動更新軟體和安全性。<a target="_blank" href="<ph name="URL" />">瞭解詳情</a></translation> <translation id="2603115962224169880">清理電腦</translation> <translation id="2603463522847370204">在無痕式視窗中開啟(&I)</translation> <translation id="2604255671529671813">網絡連線錯誤</translation> @@ -1558,6 +1565,7 @@ <translation id="3181954750937456830">安全瀏覽 (保護您和裝置免受危險網站攻擊)</translation> <translation id="3182749001423093222">拼字檢查</translation> <translation id="3183139917765991655">個人檔案匯入工具</translation> +<translation id="3184536091884214176">設定或管理 CUPS 印表機。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="3188257591659621405">我的檔案</translation> <translation id="3188465121994729530">移動平均</translation> <translation id="3190558889382726167">密碼已儲存</translation> @@ -1748,7 +1756,6 @@ <translation id="347670947055184738">抱歉!系統無法擷取裝置政策。</translation> <translation id="347785443197175480">繼續允許 <ph name="HOST" /> 存取您的相機和麥克風</translation> <translation id="3478685642445675458">移除任何使用者前,請先取消鎖定您的個人檔案。</translation> -<translation id="3479539252931486093">這是意料之外的情況嗎?<ph name="BEGIN_LINK" />請告訴我們<ph name="END_LINK" /></translation> <translation id="3479552764303398839">略過</translation> <translation id="3481268647794498892">將於 <ph name="COUNTDOWN_SECONDS" /> 秒後在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟</translation> <translation id="3484273680291419129">正在移除有害的軟件…</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">在登入螢幕中顯示使用者名稱和相片</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - 已經連接 HID 裝置</translation> <translation id="4142052906269098341">使用手機解鎖 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">將偵測到的印表機儲存至你的個人資料,或新增印表機。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4144218403971135344">觀看更高品質的影片並延長電池壽命。影片只會在支援 Cast 的螢幕上播放。</translation> <translation id="4146026355784316281">一律使用系統檢視器開啟</translation> <translation id="4146785383423576110">重設並清理</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">蜜瓜</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation> <translation id="4364830672918311045">顯示通知</translation> +<translation id="436499142539576997">無法取得應用程式資料,系統仍在嘗試執行應用程式…</translation> <translation id="4370975561335139969">您所輸入的電郵與密碼不符</translation> <translation id="437184764829821926">進階字型設定</translation> <translation id="4374831787438678295">Linux 安裝程式</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">瀏覽器重新導向僅支援 http、https 和 file 通訊協定。</translation> <translation id="4659077111144409915">主要帳戶</translation> <translation id="4660476621274971848">預期版本為 <ph name="EXPECTED_VERSION" />,但實際為 <ph name="NEW_ID" /></translation> +<translation id="4660838440047236328">你的房間配置</translation> <translation id="4662788913887017617">透過您的 iPhone 分享此書籤</translation> <translation id="4663373278480897665">已允許使用相機</translation> <translation id="4664482161435122549">PKCS #12 匯出錯誤</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">您的起始網頁已變更為 <ph name="URL" />。</translation> <translation id="4902546322522096650">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="SECURITY_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,連接</translation> <translation id="49027928311173603">從伺服器下載的政策無效:<ph name="VALIDATION_ERROR" />。</translation> +<translation id="4906490889887219338">設定或管理網路檔案共用功能。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4907161631261076876">此檔案不常下載,代表此檔案可能不安全。</translation> <translation id="4907306957610201395">權限類別</translation> <translation id="4908811072292128752">開啟新分頁,即可同時瀏覽兩個網站</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">啟用中…</translation> <translation id="5039804452771397117">允許</translation> <translation id="5042282098504489593">開啟「設定」以將 <ph name="USB_DEVICE_NAME" /> 連線至 Linux</translation> +<translation id="5043913660911154449">或指定印表機 PPD。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5045550434625856497">密碼不正確</translation> <translation id="504561833207953641">正在現有的瀏覽器工作階段中開啟。</translation> <translation id="5047421709274785093">禁止網站使用動態和光線感應器</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">兒童使用者無法變更此設定。</translation> <translation id="5466374726908360271">貼上並搜尋「<ph name="SEARCH_TERMS" />」 (&S)</translation> <translation id="5468173180030470402">正在尋找檔案共用</translation> +<translation id="5470735824776589490">你必須先重新啟動裝置,才能透過 Powerwash 重設裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5471768120198416576">您好!呢個係文字轉語音嘅聲音。</translation> <translation id="5472133193607270166">開啟此功能時,網站不能使用您在各網站的瀏覽活動放送個人化廣告。部分網站可能無法正常運作。</translation> <translation id="5473333559083690127">重新輸入新的 PIN</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">管理</translation> <translation id="5499313591153584299">這個檔案可能對您的電腦有害。</translation> <translation id="5502500733115278303">從 Firefox 匯入的書籤</translation> +<translation id="5505264765875738116">不允許網站要求傳送通知給你</translation> <translation id="5505307013568720083">墨水用完</translation> <translation id="5507756662695126555">不可否認性</translation> <translation id="5509693895992845810">另存為(&A)…</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">偏好設定</translation> <translation id="5804175651771201311">已關閉漫遊服務</translation> <translation id="5804241973901381774">權限</translation> +<translation id="5804427196348435412">使用 NFC 裝置</translation> <translation id="5805697420284793859">視窗管理員</translation> <translation id="5806773519584576205">0° (預設)</translation> <translation id="5811750797187914944">設定完成</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">最大化開啟</translation> <translation id="6096326118418049043">X.500 名稱</translation> <translation id="6097480669505687979">如不釋出儲存空間,系統可能會自動移除使用者和資料。</translation> +<translation id="6097600385983390082">語音搜尋功能已關閉</translation> <translation id="6098793583803863900">系統正在掃瞄不明檔案是否包含危險內容。</translation> <translation id="6100736666660498114">開始選單</translation> <translation id="6101226222197207147">已新增應用程式 (<ph name="EXTENSION_NAME" />)</translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">預設使用語音取代鍵盤</translation> <translation id="6234474535228214774">正在等待安裝</translation> <translation id="6237816943013845465">讓您調整螢幕解像度</translation> +<translation id="6238624845858322552">連線至藍牙裝置</translation> <translation id="6238767809035845642">從其他裝置分享的文字</translation> <translation id="6238923052227198598">在上鎖畫面上顯示最新筆記</translation> <translation id="6239558157302047471">重新載入頁框(&F)</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="PHONE_NAME" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,手機電量係 <ph name="BATTERY_STATUS" />%,連接</translation> <translation id="6268252012308737255">使用 <ph name="APP" /> 開啟</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">網站可以要求傳送通知給你</translation> <translation id="6270770586500173387">傳送<ph name="BEGIN_LINK1" />系統和應用程式資訊<ph name="END_LINK1" />,以及<ph name="BEGIN_LINK2" />指標數據<ph name="END_LINK2" /></translation> <translation id="6272643420381259437">下載外掛程式時發生錯誤 (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">品質</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">帳戶</translation> <translation id="6298962879096096191">使用 Google Play 安裝 Android 應用程式</translation> <translation id="630065524203833229">結束(&X)</translation> +<translation id="6300718114348072351">無法自動設定「<ph name="PRINTER_NAME" />」。請手動設定印表機的進階選項。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6305607932814307878">通用政策:</translation> <translation id="6307990684951724544">系統忙碌中</translation> <translation id="6308493641021088955">登入資料由<ph name="EXTENSION_NAME" />提供</translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">目前無法進行清理</translation> <translation id="6556866813142980365">重做</translation> <translation id="6557290421156335491">我的捷徑</translation> +<translation id="6561560012278703671">使用低擾模式 (禁止網站顯示通知,以免干擾)</translation> <translation id="6561726789132298588">Enter 鍵</translation> <translation id="656293578423618167">檔案路徑或名稱太長。請選用較短的名稱或將其儲存至其他位置。</translation> <translation id="6563469144985748109">您的管理員尚未批准瀏覽此網站</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">傳送前先詢問</translation> <translation id="6840184929775541289">不是憑證授權單位</translation> <translation id="6841186874966388268">錯誤</translation> +<translation id="6843267103192918276">只要登入帳戶,你在任何裝置上都能取得自己的書籤、歷史記錄和密碼,並套用相同的設定。此外,系統還會自動讓你登入各項 Google 服務。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6843423766595476978">「Ok Google」已設定完成</translation> <translation id="6845038076637626672">最大化開啟</translation> <translation id="6845325883481699275">協助提高 Chrome 安全性</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">現在可以開始設定您的 Hangouts Meet 裝置了。</translation> <translation id="744341768939279100">建立新的設定檔</translation> <translation id="7443806024147773267">系統會在您每次登入 Google 帳戶時都會存取密碼</translation> -<translation id="7444046173054089907">系統已封鎖此網站</translation> <translation id="7444983668544353857">停用 <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">自動安裝應用程式</translation> <translation id="7450761244949417357">正在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">移除這個使用者</translation> <translation id="8215295261562449873">在升級 Linux 前備份應用程式和檔案至「下載檔案」資料夾。</translation> <translation id="8217399928341212914">繼續禁止自動下載多個檔案</translation> +<translation id="8218847192766059983">新增語言或重新排列清單。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="8221491193165283816">您通常會封鎖通知。如要允許此網站向您傳送通知,請按這裡。</translation> <translation id="8225265270453771718">分享應用程式視窗</translation> <translation id="8225753906568652947">兌換優惠</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">編輯</translation> <translation id="9066773882585798925">由系統讀出文字</translation> <translation id="9066782832737749352">文字轉語音</translation> +<translation id="9067559831321817373">管理已登入的帳戶。Chrome 和 Google Play 的網站、應用程式和擴充功能可能會使用這些帳戶為你提供個人化的使用體驗 (依權限而定)。<a>瞭解詳情</a></translation> <translation id="9068849894565669697">選取顏色</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">藍牙</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 4c9306c..13a3b5a 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -36,6 +36,7 @@ <translation id="1041175011127912238">這個網頁沒有回應</translation> <translation id="1041263367839475438">可用的裝置</translation> <translation id="1042174272890264476">你的電腦也內建了 <ph name="SHORT_PRODUCT_NAME" /> 的 RLZ 程式庫。RLZ 可指定非重複、非個人的可辨識標記,以評估特定宣傳廣告活動所提升的搜尋數與 <ph name="SHORT_PRODUCT_NAME" /> 使用量。這些標籤有時也會顯示在 <ph name="PRODUCT_NAME" /> 的 Google 搜尋查詢中。</translation> +<translation id="1043818413152647937">要一併清除這些應用程式中的資料嗎?</translation> <translation id="1045692658517323508">{0,plural, =1{請在 1 分鐘內更新}other{請在 # 分鐘內更新}}</translation> <translation id="1046635659603195359">你似乎已在其他裝置上設定 Google 助理的 Voice Match 功能。你可以使用先前的錄音檔在這個裝置上建立語音模型,通常不到 1 分鐘即可完成。</translation> <translation id="1047431265488717055">複製連結文字(&X)</translation> @@ -109,6 +110,7 @@ <translation id="114721135501989771">在 Chrome 中體驗 Google 智慧功能</translation> <translation id="1147991416141538220">如需要求存取權限,請與這個裝置的系統管理員聯絡。</translation> <translation id="1149401351239820326">到期月份</translation> +<translation id="1150490752229770117">這是這部 <ph name="DEVICE_TYPE" /> 最後一次自動更新軟體和安全性。如要取得後續更新,請升級為較新的型號。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1150565364351027703">太陽眼鏡</translation> <translation id="1151917987301063366">一律允許 <ph name="HOST" /> 存取感應器</translation> <translation id="1153356358378277386">配對裝置</translation> @@ -511,7 +513,9 @@ <translation id="1709217939274742847">選擇要用於驗證的票證。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1712349894969001173">在 iPhone 上取得這個密碼</translation> <translation id="1712552549805331520"><ph name="URL" /> 要求在你的本機電腦上永久儲存資料</translation> +<translation id="1714644264617423774">啟用無障礙功能,讓裝置更容易使用。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1717218214683051432">動作感應器</translation> +<translation id="171824261579749339">澳洲式。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="1718835860248848330">過去 1 小時</translation> <translation id="1719312230114180055">注意:使用高強度的密碼或 PIN 碼會比感應指紋來得安全。</translation> <translation id="1720318856472900922">TLS WWW 伺服器驗證</translation> @@ -773,6 +777,7 @@ <translation id="2096715839409389970">清除第三方 Cookie</translation> <translation id="2097372108957554726">你必須登入 Chrome 註冊新裝置</translation> <translation id="2099172618127234427">你即將啟用 Chrome 作業系統偵錯功能,這會一併設定 sshd 精靈,並允許從 USB 磁碟機執行啟動作業。</translation> +<translation id="2099625543891475722">你的身體特徵,例如身高</translation> <translation id="2099686503067610784">要刪除伺服器憑證「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2101225219012730419">版本:</translation> @@ -1026,6 +1031,7 @@ <translation id="2445484935443597917">建立新的個人資料</translation> <translation id="2446585455334014596"><ph name="APP_NAME" /> 想驗證你的身分</translation> <translation id="2448312741937722512">類型</translation> +<translation id="2448734521821581858">Cookie 是你造訪過的網站所建立的檔案,Cookie 分為兩種類型:第一方 Cookie 由你造訪過的網站所建立,也就是網址列所顯示的網站。第三方 Cookie 由其他網站所建立。這類網站通常是在你造訪的網站上提供部分內容 (例如廣告或圖片) 的其他網站。</translation> <translation id="2450223707519584812">找不到 Google API 金鑰,因此您無法新增使用者。詳情請參閱 <ph name="DETAILS_URL" />。</translation> <translation id="2450849356604136918">沒有運作中的檢視畫面</translation> <translation id="2451298179137331965">2x</translation> @@ -1139,6 +1145,7 @@ <translation id="2587922766792651800">作業逾時</translation> <translation id="2588636910004461974">來自 <ph name="VENDOR_NAME" /> 的裝置</translation> <translation id="2594999711683503743">搜尋 Google 或輸入網址</translation> +<translation id="2600522410036850735">這部裝置在 <ph name="MONTH_AND_YEAR" />前會自動更新軟體和安全性。<a target="_blank" href="<ph name="URL" />">瞭解詳情</a></translation> <translation id="2603115962224169880">清理電腦</translation> <translation id="2603463522847370204">在無痕式視窗中開啟(&I)</translation> <translation id="2604255671529671813">網路連線錯誤</translation> @@ -1559,6 +1566,7 @@ <translation id="3181954750937456830">安全瀏覽 (保護你和你的裝置不受危險網站攻擊)</translation> <translation id="3182749001423093222">拼字檢查</translation> <translation id="3183139917765991655">設定檔匯入工具</translation> +<translation id="3184536091884214176">設定或管理 CUPS 印表機。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="3188257591659621405">我的檔案</translation> <translation id="3188465121994729530">移動平均</translation> <translation id="3190558889382726167">密碼已儲存</translation> @@ -1749,7 +1757,6 @@ <translation id="347670947055184738">糟糕!系統無法擷取裝置政策。</translation> <translation id="347785443197175480">繼續允許 <ph name="HOST" /> 存取你的攝影機和麥克風</translation> <translation id="3478685642445675458">移除任何人之前,請先取消鎖定您的個人資料。</translation> -<translation id="3479539252931486093">這是未預期的情況嗎?<ph name="BEGIN_LINK" />通知我們<ph name="END_LINK" /></translation> <translation id="3479552764303398839">現在不要</translation> <translation id="3481268647794498892">將於 <ph name="COUNTDOWN_SECONDS" /> 秒後在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟</translation> <translation id="3484273680291419129">正在移除有害軟體...</translation> @@ -2255,6 +2262,7 @@ <translation id="4138267921960073861">在登入畫面中顯示使用者名稱和相片</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - 已連線至 HID 裝置</translation> <translation id="4142052906269098341">用你的手機解鎖 <ph name="DEVICE_TYPE" />。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> +<translation id="4142518881503042940">將偵測到的印表機儲存至你的個人資料,或新增印表機。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4144218403971135344">取得畫質更高的影片,並降低耗電量。只能透過支援 Cast 的螢幕播放影片。</translation> <translation id="4146026355784316281">一律使用系統檢視器開啟</translation> <translation id="4146785383423576110">重設與清理</translation> @@ -2379,6 +2387,7 @@ <translation id="4364327530094270451">瓜</translation> <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation> <translation id="4364830672918311045">顯示通知</translation> +<translation id="436499142539576997">無法取得應用程式資料,系統仍在嘗試執行應用程式…</translation> <translation id="4370975561335139969">您所輸入的電子郵件和密碼不相符</translation> <translation id="437184764829821926">進階字型設定</translation> <translation id="4374831787438678295">Linux 安裝程式</translation> @@ -2569,6 +2578,7 @@ <translation id="465878909996028221">瀏覽器重新導向僅支援 http、https 和 file 通訊協定。</translation> <translation id="4659077111144409915">主要帳戶</translation> <translation id="4660476621274971848">預期的版本為「<ph name="EXPECTED_VERSION" />」,但實際的版本為「<ph name="NEW_ID" />」</translation> +<translation id="4660838440047236328">你的房間配置</translation> <translation id="4662788913887017617">在 iPhone 上取得這個書籤</translation> <translation id="4663373278480897665">可使用攝影機</translation> <translation id="4664482161435122549">PKCS #12 匯出錯誤</translation> @@ -2732,6 +2742,7 @@ <translation id="4900392736118574277">你的起始網頁已變更為 <ph name="URL" />。</translation> <translation id="4902546322522096650">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="NETWORK_NAME" />,<ph name="SECURITY_STATUS" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,連線</translation> <translation id="49027928311173603">從伺服器下載的政策無效:<ph name="VALIDATION_ERROR" />。</translation> +<translation id="4906490889887219338">設定或管理網路檔案共用功能。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4907161631261076876">一般使用者不常下載這個檔案,代表這個檔案可能不安全。</translation> <translation id="4907306957610201395">權限類別</translation> <translation id="4908811072292128752">開啟新分頁即可一次瀏覽兩個網站</translation> @@ -2819,6 +2830,7 @@ <translation id="5038863510258510803">啟用中...</translation> <translation id="5039804452771397117">允許</translation> <translation id="5042282098504489593">開啟設定以將 <ph name="USB_DEVICE_NAME" /> 連線至 Linux</translation> +<translation id="5043913660911154449">或指定印表機 PPD。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5045550434625856497">密碼不正確</translation> <translation id="504561833207953641">正於現有瀏覽器工作階段中開啟。</translation> <translation id="5047421709274785093">禁止網站使用動作感應器和光源感應器</translation> @@ -3104,6 +3116,7 @@ <translation id="5464660706533281090">兒童使用者無法變更這項設定。</translation> <translation id="5466374726908360271">貼上「<ph name="SEARCH_TERMS" />」並執行搜尋 (&S)</translation> <translation id="5468173180030470402">正在尋找檔案共用區</translation> +<translation id="5470735824776589490">你必須先重新啟動裝置,才能透過 Powerwash 重設裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5471768120198416576">你好!這是文字轉語音的語音。</translation> <translation id="5472133193607270166">開啟這項功能時,網站不能根據你在各網站的瀏覽活動放送個人化廣告。部分網站可能無法正常運作。</translation> <translation id="5473333559083690127">再次輸入新的 PIN 碼</translation> @@ -3127,6 +3140,7 @@ <translation id="5496587651328244253">整理</translation> <translation id="5499313591153584299">這個檔案可能對你的電腦有害。</translation> <translation id="5502500733115278303">從 Firefox 匯入的書籤</translation> +<translation id="5505264765875738116">不允許網站要求傳送通知給你</translation> <translation id="5505307013568720083">墨水已用盡</translation> <translation id="5507756662695126555">不可否認性</translation> <translation id="5509693895992845810">另存為(&A)...</translation> @@ -3341,6 +3355,7 @@ <translation id="5801568494490449797">偏好設定</translation> <translation id="5804175651771201311">已關閉漫遊服務</translation> <translation id="5804241973901381774">權限</translation> +<translation id="5804427196348435412">使用 NFC 裝置</translation> <translation id="5805697420284793859">視窗管理員</translation> <translation id="5806773519584576205">0° (預設)</translation> <translation id="5811750797187914944">設定完成</translation> @@ -3556,6 +3571,7 @@ <translation id="6096047740730590436">最大化開啟</translation> <translation id="6096326118418049043">X.500 姓名</translation> <translation id="6097480669505687979">如果您未釋出空間,系統可能會自動移除使用者和資料。</translation> +<translation id="6097600385983390082">語音搜尋功能已關閉</translation> <translation id="6098793583803863900">系統正在掃描不明檔案是否包含危險內容。</translation> <translation id="6100736666660498114">開始功能表</translation> <translation id="6101226222197207147">已新增以下應用程式:<ph name="EXTENSION_NAME" /></translation> @@ -3651,6 +3667,7 @@ <translation id="6233154960150021497">預設使用語音,而不使用鍵盤</translation> <translation id="6234474535228214774">等待安裝中</translation> <translation id="6237816943013845465">讓你調整螢幕解析度</translation> +<translation id="6238624845858322552">連線至藍牙裝置</translation> <translation id="6238767809035845642">從其他裝置分享的文字</translation> <translation id="6238923052227198598">在鎖定畫面上顯示最新記事</translation> <translation id="6239558157302047471">重新載入頁框(&F)</translation> @@ -3677,6 +3694,7 @@ <translation id="6267547857941397424">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="PHONE_NAME" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,手機電量:<ph name="BATTERY_STATUS" />%,連線</translation> <translation id="6268252012308737255">使用「<ph name="APP" />」開啟</translation> <translation id="6268718011101775129">NFC</translation> +<translation id="6270391203985052864">網站可以要求傳送通知給你</translation> <translation id="6270770586500173387">傳送<ph name="BEGIN_LINK1" />系統和應用程式資訊<ph name="END_LINK1" />,以及<ph name="BEGIN_LINK2" />指標<ph name="END_LINK2" />資訊</translation> <translation id="6272643420381259437">下載外掛程式時發生錯誤 (<ph name="ERROR" />)</translation> <translation id="6273677812470008672">品質</translation> @@ -3698,6 +3716,7 @@ <translation id="629730747756840877">帳戶</translation> <translation id="6298962879096096191">使用 Google Play 安裝 Android 應用程式</translation> <translation id="630065524203833229">結束(&X)</translation> +<translation id="6300718114348072351">無法自動設定「<ph name="PRINTER_NAME" />」。請手動設定印表機的進階選項。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6305607932814307878">全域政策:</translation> <translation id="6307990684951724544">系統忙碌中</translation> <translation id="6308493641021088955">登入資訊提供者:<ph name="EXTENSION_NAME" /></translation> @@ -3867,6 +3886,7 @@ <translation id="6555810572223193255">目前無法執行清理作業</translation> <translation id="6556866813142980365">重做</translation> <translation id="6557290421156335491">我的捷徑</translation> +<translation id="6561560012278703671">使用低擾模式 (禁止網站顯示通知,以免干擾)</translation> <translation id="6561726789132298588">Enter 鍵</translation> <translation id="656293578423618167">檔案路徑或檔案名稱過長。請縮短檔案名稱或選擇其他儲存位置。</translation> <translation id="6563469144985748109">你的管理員尚未核准這個網站</translation> @@ -4050,6 +4070,7 @@ <translation id="6840155290835956714">傳送前詢問我</translation> <translation id="6840184929775541289">這不是憑證授權單位</translation> <translation id="6841186874966388268">錯誤</translation> +<translation id="6843267103192918276">只要登入帳戶,你在任何裝置上都能取得自己的書籤、歷史記錄和密碼,並套用相同的設定。此外,系統還會自動讓你登入各項 Google 服務。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6843423766595476978">Ok Google 設定完成</translation> <translation id="6845038076637626672">最大化開啟</translation> <translation id="6845325883481699275">協助改善 Chrome 安全性</translation> @@ -4466,7 +4487,6 @@ <translation id="7442465037756169001">現在可以開始設定你的 Hangouts Meet 設備了。</translation> <translation id="744341768939279100">建立新的設定檔</translation> <translation id="7443806024147773267">系統會在你每次登入 Google 帳戶時存取你的密碼</translation> -<translation id="7444046173054089907">這個網站遭到封鎖</translation> <translation id="7444983668544353857">停用 <ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">自動安裝應用程式</translation> <translation id="7450761244949417357">正在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟</translation> @@ -5030,6 +5050,7 @@ <translation id="8214962590150211830">移除這個使用者</translation> <translation id="8215295261562449873">先將我的應用程式和檔案備份至「下載內容」資料夾再升級 Linux。</translation> <translation id="8217399928341212914">繼續禁止自動下載多個檔案</translation> +<translation id="8218847192766059983">新增語言或重新排列清單。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="8221491193165283816">你通常會封鎖通知。如要允許這個網站傳送通知給你,請按這裡。</translation> <translation id="8225265270453771718">分享應用程式視窗</translation> <translation id="8225753906568652947">兌換優惠</translation> @@ -5643,6 +5664,7 @@ <translation id="9065203028668620118">編輯</translation> <translation id="9066773882585798925">讓系統朗讀文字內容</translation> <translation id="9066782832737749352">文字轉語音</translation> +<translation id="9067559831321817373">管理已登入的帳戶。Chrome 和 Google Play 的網站、應用程式和擴充功能可能會使用這些帳戶為你提供個人化的使用體驗 (依權限而定)。<a>瞭解詳情</a></translation> <translation id="9068849894565669697">選取顏色</translation> <translation id="9073281213608662541">PAP</translation> <translation id="9074739597929991885">藍牙</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 650ed54..f1398ba9 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1756,7 +1756,6 @@ <translation id="347670947055184738">Eshu! Isistimu yehlulekile ukulanda inqubomgomo yedivayisi yakho.</translation> <translation id="347785443197175480">Qhubeka uvumele i-<ph name="HOST" /> ukuthi ifinyelele kukhamela yakho nemakrofoni</translation> <translation id="3478685642445675458">Sicela uvule iphrofayela yakho ngaphambi kokususa umuntu.</translation> -<translation id="3479539252931486093">Ingabe lokhu bokungalindelwe? <ph name="BEGIN_LINK" />Sazise<ph name="END_LINK" /></translation> <translation id="3479552764303398839">Hhayi manje</translation> <translation id="3481268647794498892">Ivuleka ku-<ph name="ALTERNATIVE_BROWSER_NAME" /> ngamasekhondi angu-<ph name="COUNTDOWN_SECONDS" /></translation> <translation id="3484273680291419129">Isusa isofthiwe eyingozi...</translation> @@ -4490,7 +4489,6 @@ <translation id="7442465037756169001">Hangouts Meet Hardware yakho ilungele ukusethwa.</translation> <translation id="744341768939279100">Dala iphrofayela entsha</translation> <translation id="7443806024147773267">Finyelela amaphasiwedi akho noma kunini lapho ungena ngemvume ku-akhawunti yakho ye-Google</translation> -<translation id="7444046173054089907">Leli sayithi livinjelwe</translation> <translation id="7444983668544353857">Khubaza i-<ph name="NETWORKDEVICE" /></translation> <translation id="7448430327655618736">Faka ngokuzenzakalela izinhlelo zokusebenza</translation> <translation id="7450761244949417357">Ivula manje ngo-<ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 19b6c53..9089ac0 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API কীসমূহ নাই। Google Chromeৰ কিছুমান কার্যক্ৰম অক্ষম কৰা হ’ব।</translation> <translation id="2290095356545025170">আপুনি Google Chrome আনইনষ্টল কৰিবলৈ বিচাৰে বুলি নিশ্চিতনে?</translation> <translation id="2309047409763057870">এয়া Google Chromeৰ এক গৌণ ইনষ্টলেশ্বন আৰু ইয়াক আপোনাৰ ডিফ’ল্ট ব্ৰাউজাৰ কৰিব নোৱাৰি।</translation> +<translation id="2341767445688917208">Chrome OSএ আপোনাৰ পাছৱৰ্ডসমূহ ছিংক কৰিব নোৱাৰিলে। এতিয়াই সমাধান কৰক।</translation> <translation id="2348335408836342058">এই ছাইটটোত আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন এক্সেছ কৰিবলৈ Chromeক অনুমতিৰ আৱশ্যক</translation> <translation id="2429317896000329049">আপোনাৰ ড’মেইনত ছিংক কৰা সুবিধাটো নাই বাবে Google Chromeএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰে।</translation> <translation id="2467438592969358367">Google Chromeএ আপোনাৰ পাছৱর্ডসমূহ ৰপ্তানি কৰিব খোজে। এই কার্যৰ বাবে অনুমতি দিবলৈ আপোনাৰ Windowsৰ পাছৱর্ড দিয়ক।</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome একেবাৰে শেহতীয়া অৱস্থাত আছে</translation> <translation id="7890208801193284374">আপুনি যদি কোনো কম্পিউটাৰ শ্বেয়াৰ কৰে, আপোনাৰ বন্ধুবৰ্গ আৰু পৰিয়ালে পৃথককৈ ব্ৰাউজ কৰিব পাৰে আৰু তেওঁলোকে বিচৰা ধৰণে Chrome ছেট আপ কৰিব পাৰে।</translation> <translation id="7896673875602241923">কোনো লোকে এই কম্পিউটাৰৰ Chromeত <ph name="ACCOUNT_EMAIL_LAST" /> হিচাপে পূর্বে ছাইন ইন কৰিছে। আপোনাৰ তথ্য পৃথক কৰি ৰাখিবলৈ কোনো নতুন Chrome ব্যৱহাৰকাৰী সৃষ্টি কৰক।</translation> +<translation id="7916016681687251387">Chrome OSএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰিলে। এতিয়াই সমাধান কৰক।</translation> <translation id="7962410387636238736">এতিয়াৰ পৰা Windows XP আৰু Windows Vista সমৰ্থন কৰা নহয় বাবে এই কম্পিউটাৰটোৱে এতিয়াৰে পৰা Google Chromeৰ আপডে'টসমূহ নাপাব</translation> <translation id="8008534537613507642">Chrome পুনৰ ইনষ্টল কৰক</translation> <translation id="8013993649590906847">যদি কোনো প্ৰতিচ্ছবিত উপযোগী বিৱৰণ নাই তেন্তে Chromeএ আপোনাক সেয়া প্ৰদান কৰিবলৈ চেষ্টা কৰিব। বিৱৰণ সৃষ্টি কৰিবলৈ প্ৰতিচ্ছবি Googleলৈ প্ৰেৰণ কৰা হয়।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index deda84e3..1b28e0c7 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -51,6 +51,7 @@ <translation id="2290014774651636340">Google API açarları çatışmır. Google Chrome'un bəzi funksionallığı deaktiv ediləcək.</translation> <translation id="2290095356545025170">Google Chrome'u silmək istəyirsiniz?</translation> <translation id="2309047409763057870">Bu Chromium'un ikinci quraşdırmasıdır və defolt brauzer kimi ayarlana bilmir.</translation> +<translation id="2341767445688917208">Chrome OS parollarınızı sinxronizasiya edə bilmədi. İndi düzəliş edin.</translation> <translation id="2348335408836342058">Chrome bu sayt üçün kamera və mikrofona giriş tələb edir</translation> <translation id="2429317896000329049">Google Chrome datanızı sinxronizasiya edə bilmədi, çünki sinxronizasiya domeniniz üçün əlçatan deyil.</translation> <translation id="2467438592969358367">Google Chrome parolları eksport etmək istəyir. Buna icazə vermək üçün Windows parolunuzu yazın.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Google Chrome güncəldir</translation> <translation id="7890208801193284374">Kompüteri paylaşsanız dostlarınız və ailəniz ayrıca brauzer ilə Chrome'u istədikləri kimi ayarlaya bilər.</translation> <translation id="7896673875602241923">Kimsə bu kompüterdə <ph name="ACCOUNT_EMAIL_LAST" /> olaraq Chrome'a daxil olub. Məlumatınızı ayrı saxlamaq üçün yeni Chrome istifadəçisi yaradın.</translation> +<translation id="7916016681687251387">Chrome OS datanızı sinxronizasiya edə bilmədi. İndi düzəliş edin.</translation> <translation id="7962410387636238736">Windows XP və Windows Vista artıq dəstəklənmədiyi üçün bu kompüter Google Chrome güncəlləmələrini qəbul etməyəcək</translation> <translation id="8008534537613507642">Chrome'u yenidən quraşdırın</translation> <translation id="8013993649590906847">Şəklin təsviri faydalı deyilsə, Chrome Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 194ce45..0d67f180 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Адсутнічаюць ключы Google API. Некаторыя функцыі Google Chrome будуць выключаны.</translation> <translation id="2290095356545025170">Сапраўды выдаліць Google Chrome?</translation> <translation id="2309047409763057870">Гэта другасны ўсталяваны экзэмпляр Google Chrome – яго нельга зрабіць стандартным браўзерам.</translation> +<translation id="2341767445688917208">Сістэме Chrome OS не ўдалося сінхранізаваць паролі. Вырашыце праблему.</translation> <translation id="2348335408836342058">Chrome запытвае дазвол на доступ да вашай камеры і мікрафона для гэтага сайта</translation> <translation id="2429317896000329049">Браўзеру Google Chrome не ўдалося сінхранізаваць даныя: для вашага дамена сінхранізацыя недаступная.</translation> <translation id="2467438592969358367">Google Chrome запытвае дазвол на экспартаванне вашых пароляў. Каб дазволіць гэта, увядзіце пароль Windows.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome абноўлены да апошняй версіі</translation> <translation id="7890208801193284374">Калі камп'ютар выкарыстоўваюць некалькі чалавек, кожны з іх можа наладзіць Chrome для сябе і праглядаць старонкі асобна ад іншых.</translation> <translation id="7896673875602241923">Нехта раней увайшоў у Chrome на гэтым камп'ютары як <ph name="ACCOUNT_EMAIL_LAST" />. Стварыце новага карыстальніка Chrome, каб трымаць сваю інфармацыю асобна.</translation> +<translation id="7916016681687251387">Сістэме Chrome OS не ўдалося сінхранізаваць даныя. Вырашыце праблему.</translation> <translation id="7962410387636238736">Гэты камп'ютар больш не будзе атрымліваць абнаўленні Google Chrome: Windows XP і Windows Vista цяпер не падтрымліваюцца</translation> <translation id="8008534537613507642">Пераўсталяваць Chrome</translation> <translation id="8013993649590906847">Калі відарыс не мае прыдатнага апісання, Chrome паспрабуе дадаць яго для вас. Каб стварыць апісанні, відарысы адпраўляюцца ў Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 8722284..f506d7d1 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -50,6 +50,7 @@ <translation id="2290014774651636340">Ключовете на приложния програмен интерфейс (API) на Google липсват. Някои функции на Google Chrome ще бъдат деактивирани.</translation> <translation id="2290095356545025170">Наистина ли искате да деинсталирате Google Chrome?</translation> <translation id="2309047409763057870">Тази инсталация на Google Chrome е алтернативна и не може да се зададе като браузър по подразбиране.</translation> +<translation id="2341767445688917208">Chrome OS не синхронизира паролите ви. Отстранете проблема.</translation> <translation id="2348335408836342058">Chrome се нуждае от разрешение за достъп до камерата и микрофона ви за този сайт</translation> <translation id="2429317896000329049">Google Chrome не можа да синхронизира данните ви, защото синхронизирането не е налице за домейна ви.</translation> <translation id="2467438592969358367">Google Chrome иска да експортира паролите ви. За да разрешите това, въведете паролата си за Windows.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome е актуален</translation> <translation id="7890208801193284374">Ако споделяте компютър, близките и приятелите ви могат да сърфират отделно и да настроят Chrome точно така, както искат.</translation> <translation id="7896673875602241923">По-рано някой влезе в Chrome на този компютър като <ph name="ACCOUNT_EMAIL_LAST" />. Моля, създайте нов потребител в браузъра, така че информацията ви да се съхранява отделно.</translation> +<translation id="7916016681687251387">Chrome OS не можа да синхронизира данните ви. Отстранете проблема.</translation> <translation id="7962410387636238736">От сега нататък този компютър няма да получава актуализации на Google Chrome, тъй като Windows XP и Windows Vista вече не се поддържат</translation> <translation id="8008534537613507642">Повторно инсталиране на Chrome</translation> <translation id="8013993649590906847">Ако няма полезно описание за дадено изображение, Chrome ще се опита да предостави такова. За да бъдат създадени описания, съответните изображения се изпращат до Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 1261369..2474d5c 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -53,7 +53,7 @@ <translation id="2290014774651636340">Nedostaju ključevi za Google API. Neke funkcionalnosti Google Chromea će biti onemogućene.</translation> <translation id="2290095356545025170">Jeste li sigurni da želite deinstalirati Google Chrome?</translation> <translation id="2309047409763057870">Ovo je sekundarna instalacija Google Chromea, pa on ne može biti vaš zadani preglednik.</translation> -<translation id="2341767445688917208">OS Chrome nije mogao sinkronizirati vaše zaporke. Ispravite to odmah.</translation> +<translation id="2341767445688917208">Chrome OS nije uspio sinhronizirati vaše lozinke. Ispravi sada.</translation> <translation id="2348335408836342058">Chromeu treba odobrenje za pristup vašoj kameri i mikrofonu na ovoj web lokaciji</translation> <translation id="2429317896000329049">Google Chrome ne može sinhronizirati vaše podatke jer sinhronizacija nije dostupna za vašu domenu.</translation> <translation id="2467438592969358367">Google Chrome želi izvesti vaše lozinke. Unesite svoju lozinku za Windows da ovo omogućite.</translation> @@ -213,7 +213,7 @@ <translation id="7855730255114109580">Google Chrome je ažuriran</translation> <translation id="7890208801193284374">Ako dijelite računar, prijatelji i porodica mogu odvojeno pretraživati i postaviti Chrome na način koji njima odgovara.</translation> <translation id="7896673875602241923">Netko se prethodno prijavio u Chrome na ovom računalu kao <ph name="ACCOUNT_EMAIL_LAST" />. Izradite novog korisnika Chromea kako bi vaši podaci bili odvojeni.</translation> -<translation id="7916016681687251387">OS Chrome nije mogao sinkronizirati vaše podatke. Ispravite to odmah.</translation> +<translation id="7916016681687251387">Chrome OS nije uspio sinhronizirati vaše podatke. Ispravi sada.</translation> <translation id="7962410387636238736">Ovaj računar više neće primati ažuriranja za Google Chrome jer sistemi Windows XP i Windows Vista više nisu podržani</translation> <translation id="8008534537613507642">Ponovo instaliraj Chrome</translation> <translation id="8013993649590906847">Ako slika ne sadrži koristan opis, Chrome će ga pokušati pružiti. Slike se šalju Googleu radi kreiranja opisa.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 3e0a598..6242c18 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -48,6 +48,7 @@ <translation id="2290014774651636340">Falten les claus de l'API de Google. Es desactivaran algunes de les funcionalitats de Google Chrome.</translation> <translation id="2290095356545025170">Confirmeu que voleu desinstal·lar Google Chrome?</translation> <translation id="2309047409763057870">Aquesta és una instal·lació secundària de Google Chrome i no pot definir-se com a navegador predeterminat.</translation> +<translation id="2341767445688917208">Chrome OS no ha pogut sincronitzar les teves contrasenyes. Soluciona aquest problema.</translation> <translation id="2348335408836342058">Per visitar aquest lloc web, Chrome necessita permís per accedir a la càmera i al micròfon</translation> <translation id="2429317896000329049">Google Chrome no ha pogut sincronitzar les dades perquè la sincronització no està disponible per al vostre domini.</translation> <translation id="2467438592969358367">Google Chrome vol exportar les teves contrasenyes. Escriu la contrasenya de Windows per permetre-ho.</translation> @@ -204,6 +205,7 @@ <translation id="7855730255114109580">Google Chrome està actualitzat</translation> <translation id="7890208801193284374">Si compartiu un ordinador, els amics i els familiars poden navegar de manera independent i configurar Chrome com vulguin.</translation> <translation id="7896673875602241923">Algú ha iniciat anteriorment la sessió a Chrome en aquest ordinador com a <ph name="ACCOUNT_EMAIL_LAST" />. Crea un usuari de Chrome per mantenir la informació separada.</translation> +<translation id="7916016681687251387">Chrome OS no ha pogut sincronitzar les teves dades. Soluciona aquest problema.</translation> <translation id="7962410387636238736">Aquest ordinador ja no rebrà més actualitzacions de Google Chrome perquè Windows XP i Windows Vista ja no són compatibles</translation> <translation id="8008534537613507642">Torna a instal·lar Chrome</translation> <translation id="8013993649590906847">Si una imatge no té una descripció útil, Chrome provarà d'oferir-te'n una. Per crear les descripcions, les imatges s'envien a Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 37dea037..a62b59e 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">Chybí klíče rozhraní Google API. Některé funkce Google Chrome nebudou k dispozici.</translation> <translation id="2290095356545025170">Opravdu chcete odinstalovat Google Chrome?</translation> <translation id="2309047409763057870">Toto je druhá instalace prohlížeče Google Chrome. Tuto instalaci nelze nastavit jako výchozí prohlížeč.</translation> +<translation id="2341767445688917208">Chrome OS vaše hesla nemohl synchronizovat. Vyřešit.</translation> <translation id="2348335408836342058">Chrome pro tento web potřebuje oprávnění k přístupu k fotoaparátu a mikrofonu</translation> <translation id="2429317896000329049">Google Chrome nemohl synchronizovat vaše data, protože Synchronizace ve vaší doméně není k dispozici.</translation> <translation id="2467438592969358367">Google Chrome chce exportovat vaše hesla. Tato akce vyžaduje zadání hesla systému Windows.</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome je aktuální</translation> <translation id="7890208801193284374">Pokud počítač sdílíte s kamarády a členy rodiny, každý může web procházet samostatně a nastavit si Chrome podle svých požadavků.</translation> <translation id="7896673875602241923">Prohlížeč Chrome v tomto počítači je již přihlášen k účtu <ph name="ACCOUNT_EMAIL_LAST" />. Chcete-li své informace uchovat odděleně, vytvořte nového uživatele Chromu.</translation> +<translation id="7916016681687251387">Chrome OS vaše data nemohl synchronizovat. Vyřešit.</translation> <translation id="7962410387636238736">Google Chrome se v tomto počítači již nebude aktualizovat, protože systémy Windows XP a Windows Vista již nejsou podporovány.</translation> <translation id="8008534537613507642">Přeinstalovat Chrome</translation> <translation id="8013993649590906847">Pokud obrázek nemá užitečný popis, Chrome se vám jej pokusí poskytnout. Za účelem vytváření popisů jsou obrázky odesílány do Googlu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index e2b9c4eb..eac7638f 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Google API-nøgler mangler. Nogle funktioner i Google Chrome deaktiveres.</translation> <translation id="2290095356545025170">Er du sikker på, at du vil afinstallere Google Chrome?</translation> <translation id="2309047409763057870">Dette er en sekundær installation af Google Chrome, og den kan ikke gøres til din standardbrowser.</translation> +<translation id="2341767445688917208">Chrome OS kunne ikke synkronisere dine adgangskoder. Løs problemet nu.</translation> <translation id="2348335408836342058">Chrome skal have tilladelse til at bruge dit kamera og din mikrofon på dette website</translation> <translation id="2429317896000329049">Google Chrome kunne ikke synkronisere dine data, fordi synkronisering ikke er tilgængelig for dit domæne.</translation> <translation id="2467438592969358367">Google Chrome anmoder om at eksportere dine adgangskoder. Angiv din Windows-adgangskode for at tillade dette.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome er opdateret</translation> <translation id="7890208801193284374">Hvis du deler en computer, kan venner og familie browse individuelt og konfigurere Chrome, som de ønsker hver især.</translation> <translation id="7896673875602241923">Nogen har tidligere logget ind på Chrome på denne computer som <ph name="ACCOUNT_EMAIL_LAST" />. Opret en ny Chrome-bruger for at holde dine oplysninger adskilt.</translation> +<translation id="7916016681687251387">Chrome OS kunne ikke synkronisere dine data. Løs problemet nu.</translation> <translation id="7962410387636238736">Denne computer modtager ikke længere Google Chrome-opdateringer, da Windows XP og Windows Vista ikke længere understøttes.</translation> <translation id="8008534537613507642">Geninstaller Chrome</translation> <translation id="8013993649590906847">Hvis et billede ikke har en brugbar beskrivelse, forsøger Chrome at angive en for dig. Billederne sendes til Google, så der kan oprettes beskrivelser.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index f14ac46..b76e2df 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -48,6 +48,7 @@ <translation id="2290014774651636340">Google API-Schlüssel fehlen. Einige Funktionen von Google Chrome sind deaktiviert.</translation> <translation id="2290095356545025170">Möchten Sie Google Chrome wirklich deinstallieren?</translation> <translation id="2309047409763057870">Dies ist eine Zweitinstallation, daher kann Google Chrome nicht als Standardbrowser festgelegt werden.</translation> +<translation id="2341767445688917208">Chrome OS konnte Ihre Passwörter nicht synchronisieren. Jetzt beheben.</translation> <translation id="2348335408836342058">Chrome benötigt für diese Website die Berechtigung, auf Ihre Kamera und Ihr Mikrofon zuzugreifen</translation> <translation id="2429317896000329049">Google Chrome konnte Ihre Daten nicht synchronisieren, da die Synchronisierung für Ihre Domain nicht zur Verfügung steht.</translation> <translation id="2467438592969358367">Google Chrome möchte Ihre Passwörter exportieren. Wenn Sie dies zulassen möchten, geben Sie Ihr Windows-Passwort ein.</translation> @@ -204,6 +205,7 @@ <translation id="7855730255114109580">Google Chrome ist auf dem neuesten Stand.</translation> <translation id="7890208801193284374">Bei gemeinsam genutzten Computern können die verschiedenen Personen separat surfen und Chrome jeweils nach ihren Wünschen einrichten.</translation> <translation id="7896673875602241923">Auf diesem Computer war zuvor ein Nutzer mit dem Konto <ph name="ACCOUNT_EMAIL_LAST" /> in Chrome angemeldet. Erstellen Sie einen neuen Chrome-Nutzer, um Ihre Daten getrennt zu verwenden.</translation> +<translation id="7916016681687251387">Chrome OS konnte Ihre Daten nicht synchronisieren. Jetzt beheben.</translation> <translation id="7962410387636238736">Dieser Computer erhält keine Google Chrome-Updates mehr, da Windows XP und Windows Vista nicht mehr unterstützt werden</translation> <translation id="8008534537613507642">Chrome erneut installieren</translation> <translation id="8013993649590906847">Wenn ein Bild keine brauchbare Beschreibung hat, versucht Chrome, eine für Sie zu finden. Damit entsprechende Beschreibungen erstellt werden können, werden die Bilder an Google gesendet.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 6b07c33..4d044bb 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Google Chrome.</translation> <translation id="2290095356545025170">¿Estás seguro de que deseas desinstalar Google Chrome?</translation> <translation id="2309047409763057870">Como esta es una instalación secundaria de Google Chrome, no puede establecerse como tu navegador predeterminado.</translation> +<translation id="2341767445688917208">El Sistema operativo Chrome no pudo sincronizar tus contraseñas. Soluciona el problema ahora.</translation> <translation id="2348335408836342058">Chrome necesita permiso para acceder a tu cámara y micrófono para este sitio</translation> <translation id="2429317896000329049">Google Chrome no pudo sincronizar los datos porque la sincronización no está disponible para el dominio.</translation> <translation id="2467438592969358367">Google Chrome desea exportar tus contraseñas. Para permitirlo, ingresa tu contraseña de Windows.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome está actualizado</translation> <translation id="7890208801193284374">Si compartes una computadora, tus amigos y familiares pueden navegar de forma independiente y configurar Chrome según los gustos individuales.</translation> <translation id="7896673875602241923">Alguien accedió anteriormente a Google Chrome en esta computadora como <ph name="ACCOUNT_EMAIL_LAST" />. Crea un usuario de Chrome nuevo para mantener tu información por separado.</translation> +<translation id="7916016681687251387">El Sistema operativo Chrome no pudo sincronizar los datos. Soluciona el problema ahora.</translation> <translation id="7962410387636238736">Esta computadora dejará de recibir actualizaciones de Google Chrome porque Windows XP y Windows Vista ya no son compatibles</translation> <translation id="8008534537613507642">Reinstalar Chrome</translation> <translation id="8013993649590906847">Si una imagen no tiene una descripción útil, Chrome intentará proporcionarte una. Para crear descripciones, se envían las imágenes a Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index f2a0913..a27eea96 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Google Chrome.</translation> <translation id="2290095356545025170">¿Seguro que quieres desinstalar Google Chrome?</translation> <translation id="2309047409763057870">Esta instalación de Google Chrome es secundaria, por lo que no se puede establecer como navegador predeterminado.</translation> +<translation id="2341767445688917208">Chrome OS no ha podido sincronizar las contraseñas. Soluciónalo ahora.</translation> <translation id="2348335408836342058">Chrome necesita permiso para acceder a la cámara y al micrófono en este sitio web</translation> <translation id="2429317896000329049">Google Chrome no ha podido sincronizar los datos porque la función de sincronización no está disponible para tu dominio.</translation> <translation id="2467438592969358367">Google Chrome quiere exportar tus contraseñas. Escribe tu contraseña de Windows para permitirlo.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome está actualizado</translation> <translation id="7890208801193284374">Si compartes un ordenador, tus amigos y familiares pueden navegar de forma independiente y configurar Chrome a su gusto.</translation> <translation id="7896673875602241923">Otro usuario ha iniciado sesión anteriormente en Chrome con la cuenta <ph name="ACCOUNT_EMAIL_LAST" /> a través de este ordenador. Debes crear un usuario de Chrome para proteger tu información.</translation> +<translation id="7916016681687251387">Chrome OS no ha podido sincronizar los datos. Soluciónalo ahora.</translation> <translation id="7962410387636238736">Este ordenador dejará de recibir actualizaciones de Google Chrome porque ya no es compatible con Windows XP ni Windows Vista.</translation> <translation id="8008534537613507642">Reinstalar Chrome</translation> <translation id="8013993649590906847">Si una imagen no tiene ninguna descripción útil, Chrome intentará proporcionártela. Para crear las descripciones, las imágenes se envían a Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 4879dc8..6ea52f41 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -51,6 +51,7 @@ <translation id="2290014774651636340">Google API võtmed on puudu. Google Chrome'i teatud funktsioonid keelatakse.</translation> <translation id="2290095356545025170">Olete kindel, et soovite Google Chrome'i desinstallida?</translation> <translation id="2309047409763057870">See on Google Chrome'i sekundaarne install ja seda ei saa määrata vaikebrauseriks.</translation> +<translation id="2341767445688917208">Chrome OS ei saanud teie paroole sünkroonida. Parandage kohe.</translation> <translation id="2348335408836342058">Chrome vajab selle saidi puhul luba, et teie kaamerale ja mikrofonile juurde pääseda</translation> <translation id="2429317896000329049">Google Chrome ei saa teie andmeid sünkroonida, sest sünkroonimine pole teie domeenil saadaval.</translation> <translation id="2467438592969358367">Google Chrome soovib teie paroole eksportida. Selle lubamiseks sisestage oma Windowsi parool.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Google Chrome on ajakohane</translation> <translation id="7890208801193284374">Kui jagate oma arvutit, siis saavad sõbrad ja pereliikmed eraldi sirvida ning seadistada Chrome'i just nii, nagu neile meeldib.</translation> <translation id="7896673875602241923">Keegi on varem selles arvutis Chrome'i sisse loginud kasutajana <ph name="ACCOUNT_EMAIL_LAST" />. Looge uus Chrome'i kasutaja, et oma teave eraldi hoida.</translation> +<translation id="7916016681687251387">Chrome OS ei saanud teie andmeid sünkroonida. Parandage kohe.</translation> <translation id="7962410387636238736">See arvuti ei saa enam Google Chrome'i värskendusi, kuna Windows XP-d ja Windows Vistat enam ei toetata</translation> <translation id="8008534537613507642">Installi Chrome uuesti</translation> <translation id="8013993649590906847">Kui pildil puudub kasulik kirjeldus, üritab Chrome selle ise luua. Kirjelduste loomiseks saadetakse pildid Google'ile.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 878e1a6..e29b7228 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">کلیدهای Google API وجود ندارد. برخی از عملکردهای Google Chrome از کار خواهد افتاد.</translation> <translation id="2290095356545025170">آیا میخواهید Google Chrome را غیر فعال کنید؟</translation> <translation id="2309047409763057870">این نصب ثانویه Google Chrome است و نمیتواند مرورگر پیشفرضتان شود.</translation> +<translation id="2341767445688917208">سیستمعامل Chrome نتوانست گذرواژههایتان را همگامسازی کند. اکنون مشکل رفع شود.</translation> <translation id="2348335408836342058">Chrome برای این سایت به مجوز دسترسی به دوربین و میکروفون نیاز دارد</translation> <translation id="2429317896000329049">Google Chrome قادر به همگامسازی دادههای شما نبود زیرا همگامسازی برای دامنه شما قابل دسترسی نیست.</translation> <translation id="2467438592969358367">Google Chrome میخواهد گذرواژههای شما را صادر کند. برای اجازه به این کار، گذرواژه Windows خود را تایپ کنید.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome بهروز است</translation> <translation id="7890208801193284374">اگر رایانهای را به صورت مشترک استفاده میکنید، دوستان و خانواده میتوانند به صورت جداگانه مرور کنند و Chrome را به صورتی که مایلند تنظیم کنند.</translation> <translation id="7896673875602241923">شخصی قبلاً بهعنوان <ph name="ACCOUNT_EMAIL_LAST" /> به سیستم Chrome در این رایانه وارد شده است. برای اینکه اطلاعاتتان جدا حفظ شود، لطفاً کاربر Chrome جدیدی ایجاد کنید.</translation> +<translation id="7916016681687251387">سیستمعامل Chrome نتوانست دادههایتان را همگامسازی کند. اکنون مشکل رفع شود.</translation> <translation id="7962410387636238736">این رایانه دیگر بهروزرسانیهای Google Chrome را دریافت نمیکند زیرا Windows XP و Windows Vista دیگر پشتیبانی نمیشوند</translation> <translation id="8008534537613507642">نصب مجدد Chrome</translation> <translation id="8013993649590906847">اگر تصویری توضیح مفیدی نداشته باشد، Chrome توضیحی برای شما ارائه خواهد کرد. برای ایجاد توضیحات، تصاویر به Google ارسال میشود.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index b5ec2e1..6942b4c 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Nawawala ang mga Google API key. Madi-disable ang ilang pagpapagana ng Google Chrome.</translation> <translation id="2290095356545025170">Sigurado ka bang nais mong i-uninstall ang Google Chrome?</translation> <translation id="2309047409763057870">Pangalawang pag-install ito ng Google Chrome at hindi ito maaaring gawing iyong default na browser.</translation> +<translation id="2341767445688917208">Hindi ma-sync ng Chrome OS ang iyong mga password. Ayusin ngayon.</translation> <translation id="2348335408836342058">Kailangan ng Chrome ng pahintulot na i-access ang iyong camera at mikropono para sa site na ito</translation> <translation id="2429317896000329049">Hindi mai-sync ng Google Chrome ang iyong data dahil hindi available ang Pag-sync para sa iyong domain.</translation> <translation id="2467438592969358367">Gustong i-export ng Google Chrome ang iyong mga password. I-type ang password mo sa Windows para payagan ito.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Napapanahon ang Google Chrome</translation> <translation id="7890208801193284374">Kung nagpapahiram ka ng computer, ang mga kaibigan at kapamilya ay maaaring mag-browse nang hiwalay at i-set up ang Chrome sa paraang gusto nila.</translation> <translation id="7896673875602241923">May nag-sign in dati sa Chrome sa computer na ito bilang <ph name="ACCOUNT_EMAIL_LAST" />. Mangyaring gumawa ng bagong user ng Chrome upang ihiwalay ang iyong impormasyon.</translation> +<translation id="7916016681687251387">Hindi ma-sync ng Chrome OS ang iyong data. Ayusin ngayon.</translation> <translation id="7962410387636238736">Hindi na makakatanggap ang computer na ito ng mga update sa Google Chrome dahil hindi na sinusuportahan ang Windows XP at Windows Vista</translation> <translation id="8008534537613507642">Muling i-install ang Chrome</translation> <translation id="8013993649590906847">Kung hindi sapat ang deskripsyon ng isang larawan, susubukan ng Chrome na ayusin ito para sa iyo. Para gumawa ng mga deskripsyon, ipinapadala ang mga larawan sa Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 877fe5a..76288f3a 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">Les clés d'API Google sont manquantes. Certaines fonctionnalités de Google Chrome seront désactivées.</translation> <translation id="2290095356545025170">Voulez-vous vraiment désinstaller Google Chrome?</translation> <translation id="2309047409763057870">Cette installation de Google Chrome est secondaire. Celui-ci ne peut donc pas servir de navigateur par défaut.</translation> +<translation id="2341767445688917208">Chrome OS n'a pas pu synchroniser vos mots de passe. Corriger maintenant.</translation> <translation id="2348335408836342058">Chrome a besoin de votre autorisation pour accéder à votre appareil photo et à votre micro pour ce site</translation> <translation id="2429317896000329049">Google Chrome ne peut pas synchroniser vos données, car la synchronisation n'est pas offerte pour votre domaine.</translation> <translation id="2467438592969358367">Google Chrome veut exporter vos mots de passe. Pour autoriser cette action, entrez votre mot de passe Windows.</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome est à jour</translation> <translation id="7890208801193284374">Si vous partagez un ordinateur avec vos proches, ceux-ci peuvent configurer Google Chrome comme bon leur semble et naviguer sur le Web à leur manière.</translation> <translation id="7896673875602241923">Un utilisateur s'est récemment connecté à Google Chrome sur cet ordinateur en tant que <ph name="ACCOUNT_EMAIL_LAST" />. Veuillez créer un autre utilisateur Google Chrome pour séparer vos données.</translation> +<translation id="7916016681687251387">Chrome OS n'a pas pu synchroniser vos données. Corriger maintenant.</translation> <translation id="7962410387636238736">Cet ordinateur ne recevra plus de mises à jour de Google Chrome, car Windows XP et Windows Vista ne sont plus pris en charge</translation> <translation id="8008534537613507642">Réinstaller Chrome</translation> <translation id="8013993649590906847">Si une image n'est pas accompagnée d'une description utile, Chrome essaiera de vous en proposer une. Pour créer des descriptions, les images sont envoyées à Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index 69d7011..0f73038 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Non se atopan as claves da API de Google. Desactivaranse algunhas funcións de Google Chrome.</translation> <translation id="2290095356545025170">Estás seguro de que queres desinstalar Google Chrome?</translation> <translation id="2309047409763057870">Esta é unha instalación secundaria de Google Chrome e non se pode converter no teu navegador predeterminado.</translation> +<translation id="2341767445688917208">Chrome OS non puido sincronizar os teus contrasinais. Corríxeo agora.</translation> <translation id="2348335408836342058">Chrome necesita permiso para acceder á cámara e ao micrófono neste sitio</translation> <translation id="2429317896000329049">Google Chrome non puido sincronizar os teus datos porque a sincronización non está dispoñible para o teu dominio.</translation> <translation id="2467438592969358367">Google Chrome quere exportar os teus contrasinais. Escribe o teu contrasinal de Windows para permitir esta acción.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome está actualizado</translation> <translation id="7890208801193284374">Se compartes un ordenador, os teus amigos e familiares poderán navegar por separado e configurar Chrome como prefiran.</translation> <translation id="7896673875602241923">Anteriormente, alguén iniciou sesión como <ph name="ACCOUNT_EMAIL_LAST" /> en Chrome neste ordenador. Crea un novo usuario de Chrome para manter a túa información por separado.</translation> +<translation id="7916016681687251387">Chrome OS non puido sincronizar os teus datos. Corríxeo agora.</translation> <translation id="7962410387636238736">Este ordenador deixará de recibir actualizacións de Google Chrome porque xa non se admiten Windows XP nin Windows Vista.</translation> <translation id="8008534537613507642">Reinstalar Chrome</translation> <translation id="8013993649590906847">Se unha imaxe non ten unha descrición útil, Chrome tentará proporcionarche unha. Para crear descricións, envíanse imaxes a Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index d9d2389d..1267c01 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API કીઝ ખૂટે છે. Google Chrome ની કેટલીક કાર્યક્ષમતા અક્ષમ થશે.</translation> <translation id="2290095356545025170">શું તમને ખાતરી છે કે તમારે Google Chromeને અનઇન્સ્ટૉલ કરવું છે?</translation> <translation id="2309047409763057870">આ Google Chrome નું દ્વિતીય ઇન્સ્ટૉલેશન છે અને આને તમારું ડિફૉલ્ટ બ્રાઉઝર બનાવી શકાતું નથી.</translation> +<translation id="2341767445688917208">Chrome OS તમારા પાસવર્ડને સિંક કરી શક્યું નથી. હમણાં જ સુધારો.</translation> <translation id="2348335408836342058">Chromeને આ સાઇટ માટે તમારા કૅમેરા અને માઇક્રોફોનના ઍક્સેસની પરવાનગીની જરૂર પડે છે</translation> <translation id="2429317896000329049">Google Chrome તમારા ડેટાને સમન્વયિત કરી શક્યું નથી કારણ કે તમારા ડોમેન માટે સમન્વયન ઉપલબ્ધ નથી.</translation> <translation id="2467438592969358367">Google Chrome તમારા પાસવર્ડની નિકાસ કરવા માગે છે. આને મંજૂરી આપવા માટે તમારો Windows પાસવર્ડ ટાઇપ કરો.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome અપ ટૂ ડેટ છે</translation> <translation id="7890208801193284374">જો તમે કમ્પ્યુટરને શેર કરો છો, તો મિત્રો અને કુટુંબીજનો અલગ-અલગ બ્રાઉઝ કરી શકે છે અને તેમને જોઈએ તેમ Chrome ને સેટ કરી શકે છે.</translation> <translation id="7896673875602241923">કોઈએ આ કમ્પ્યુટર પર પહેલા <ph name="ACCOUNT_EMAIL_LAST" /> તરીકે Chromeમાં સાઇન ઇન કર્યું છે. તમારી માહિતી અલગ રાખવા માટે કૃપા કરીને નવો Chrome વપરાશકર્તા બનાવો.</translation> +<translation id="7916016681687251387">Chrome OS તમારા ડેટાને સિંક કરી શક્યું નથી. હમણાં જ સુધારો.</translation> <translation id="7962410387636238736">આ કમ્પ્યુટર હવેથી Google Chrome અપડેટ મેળવી શકશે નહીં કારણકે Windows XP અને Windows Vista હવે સમર્થિત રહ્યાં નથી</translation> <translation id="8008534537613507642">Chrome ફરીથી ઇન્સ્ટોલ કરો</translation> <translation id="8013993649590906847">જો છબીમાં ઉપયોગી વર્ણન ન હોય, તો Chrome તમને વર્ણન પૂરું પાડવાનો પ્રયાસ કરશે. વર્ણન બનાવવા માટે, Googleને છબીઓ મોકલવામાં આવે છે.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 71bbf5d..e2dedf2 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Google API (एपीआई) कुंजियां मौजूद नहीं हैं. Google Chrome के कुछ फ़ंक्शन बंद कर दिए जाएंगे.</translation> <translation id="2290095356545025170">क्या आप वाकई Google Chrome को विस्थापित करना चाहते हैं?</translation> <translation id="2309047409763057870">यह Google Chrome का द्वितीयक इंस्टॉलेशन है और इसे आपका डिफ़ॉल्ट ब्राउज़र नहीं बनाया जा सकता.</translation> +<translation id="2341767445688917208">Chrome OS आपके पासवर्ड सिंक नहीं कर सका. अभी ठीक करें.</translation> <translation id="2348335408836342058">Chrome को इस साइट के लिए आपका कैमरा और माइक्रोफ़ोन एक्सेस करने की अनुमति चाहिए</translation> <translation id="2429317896000329049">Google Chrome आपका डेटा समन्वयित नहीं कर सका क्योंकि समन्वयन आपके डोमेन के लिए उपलब्ध नहीं है.</translation> <translation id="2467438592969358367">Google Chrome आपके पासवर्ड निर्यात करना चाहता है. इसकी मंज़ूरी देने के लिए अपना Windows पासवर्ड लिखें.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Google Chrome अप टू डेट है</translation> <translation id="7890208801193284374">अगर आप कंप्यूटर शेयर करते हैं, तो दोस्त और परिवार अलग-अलग ब्राउज़ कर सकते हैं और Chrome को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="7896673875602241923">इस कंप्यूटर पर पहले किसी और ने <ph name="ACCOUNT_EMAIL_LAST" /> के रूप में Chrome में साइन इन किया है. अपनी जानकारी अलग रखने के लिए कृपया नया 'Chrome उपयोगकर्ता' बनाएं.</translation> +<translation id="7916016681687251387">Chrome OS आपका डेटा सिंक नहीं कर सका. अभी ठीक करें.</translation> <translation id="7962410387636238736">इस कंप्यूटर को अब Google Chrome के अपडेट नहीं मिलेंगे क्योंकि Windows XP और Windows Vista अब काम नहीं करते हैं</translation> <translation id="8008534537613507642">Chrome फिर से इंस्टॉल करें</translation> <translation id="8013993649590906847">अगर किसी इमेज के बारे में मददगार जानकारी मौजूद नहीं है, तो Chrome उसके बारे में जानकारी देने की कोशिश करेगा. जानकारी तैयार करने के लिए, इमेज Google को भेजी जाती हैं.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index a3132f7..345d5fc 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -48,6 +48,7 @@ <translation id="2290014774651636340">Hiányoznak Google API-kulcsok. A Google Chrome egyes funkciói kikapcsolnak.</translation> <translation id="2290095356545025170">Biztos benne, hogy eltávolítja a Google Chrome-ot?</translation> <translation id="2309047409763057870">Ez a Google Chrome második telepítése, amelyet nem állíthat be az alapértelmezett böngészővé.</translation> +<translation id="2341767445688917208">A Chrome OS nem tudta szinkronizálni az Ön jelszavait. Javítsa most.</translation> <translation id="2348335408836342058">A Chrome-nak engedélyre van szüksége ahhoz, hogy hozzáférjen a kamerához és a mikrofonhoz ennél a webhelynél</translation> <translation id="2429317896000329049">A Google Chrome nem tudta szinkronizálni az adatait, mert a szinkronizálás nem érhető el az Ön domainjénél.</translation> <translation id="2467438592969358367">A Google Chrome exportálni szeretné a jelszavakat. Ennek engedélyezéséhez írja be Windows-jelszavát.</translation> @@ -204,6 +205,7 @@ <translation id="7855730255114109580">A Google Chrome naprakész</translation> <translation id="7890208801193284374">Ha megoszt egy számítógépet, ismerősei és családtagjai külön fiókokban internetezve a saját kívánságaik szerint állíthatják be a Chrome-ot.</translation> <translation id="7896673875602241923">Valaki korábban <ph name="ACCOUNT_EMAIL_LAST" /> néven bejelentkezett a Chrome-ba erről a számítógépről. Az adatai elkülönítéséhez hozzon létre új Chrome-felhasználót.</translation> +<translation id="7916016681687251387">A Chrome OS nem tudta szinkronizálni az adatait. Javítsa most.</translation> <translation id="7962410387636238736">Ez a számítógép a továbbiakban már nem kapja meg a Google Chrome frissítéseit, mert már nem támogatjuk a Windows XP és Windows Vista rendszereket.</translation> <translation id="8008534537613507642">A Chrome újratelepítése</translation> <translation id="8013993649590906847">Ha valamelyik kép nem rendelkezik hasznos leírással, akkor a Chrome igyekszik leírást adni róla. A Google automatikusan megkapja a leírások létrehozásához szükséges képeket.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 6cb98740..870bc8b1 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -51,6 +51,7 @@ <translation id="2290014774651636340">Google API-ի բանալիները չկան: Google Chrome-ի որոշ գործառույթներ կանջատվեն:</translation> <translation id="2290095356545025170">Իսկապե՞ս հեռացնել Google Chrome-ը:</translation> <translation id="2309047409763057870">Սա Google Chrome-ի երկրորդային տեղադրումն է: Այն չի կարող դառնալ ձեր կանխադրված դիտարկիչը:</translation> +<translation id="2341767445688917208">Chrome OS-ը չկարողացավ համաժամացնել ձեր գաղտնաբառերը։ Շտկել խնդիրը։</translation> <translation id="2348335408836342058">Chrome-ին այս կայքի համար անհրաժեշտ է ձեր տեսախցիկն ու խոսափողը օգտագործելու թույլտվություն</translation> <translation id="2429317896000329049">Google Chrome-ը չկարողացավ համաժամացնել ձեր տվյալները, քանի որ Sync ծառայությունը մատչելի չէ ձեր տիրույթի համար:</translation> <translation id="2467438592969358367">Google Chrome-ն ուզում է արտահանել ձեր գաղտնաբառերը: Թույլատրելու համար մուտքագրեք Windows-ի ձեր գաղտնաբառը:</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome-ը թարմացված է</translation> <translation id="7890208801193284374">Եթե դուք համակարգիչն օգտագործում եք ընկերների ու ընտանիքի անդամների հետ, նրանք կարող են առանձին աշխատել համացանցում և կարգավորել Chrome-ը՝ իրենց ուզած ձևով:</translation> <translation id="7896673875602241923">Ինչ-որ մեկն այս համակարգչում <ph name="ACCOUNT_EMAIL_LAST" /> հասցեով մուտք է գործել Chrome: Ստեղծեք Chrome-ի նոր պրոֆիլ` ձեր տվյալներն առանձին պահելու համար:</translation> +<translation id="7916016681687251387">Chrome OS-ը չկարողացավ համաժամացնել ձեր տվյալները։ Շտկել խնդիրը։</translation> <translation id="7962410387636238736">Այս համակարգիչն այլևս չի ստանա Google Chrome-ի թարմացումներ, քանի որ Windows XP և Windows Vista համակարգերն այլևս չեն աջակցվում</translation> <translation id="8008534537613507642">Նորից տեղադրել Chrome-ը</translation> <translation id="8013993649590906847">Եթե պատկերն օգտակար նկարագրություն չունի, Chrome-ը կփորձի նոր նկարագրություն տրամադրել: Պատկերներն ուղարկվում են Google-ին՝ նկարագրություններ ստեղծելու համար։</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index ff0e37af..b8451674 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Kunci API Google tidak ada. Beberapa fungsi Google Chrome tidak akan berfungsi.</translation> <translation id="2290095356545025170">Apakah Anda yakin ingin mencopot penginstalan Google Chrome?</translation> <translation id="2309047409763057870">Ini adalah pemasangan Google Chrome sekunder, dan tidak dapat digunakan sebagai browser default.</translation> +<translation id="2341767445688917208">Chrome OS tidak dapat menyinkronkan sandi Anda. Perbaiki sekarang.</translation> <translation id="2348335408836342058">Chrome memerlukan izin akses ke kamera dan mikrofon untuk situs ini</translation> <translation id="2429317896000329049">Google Chrome tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda.</translation> <translation id="2467438592969358367">Google Chrome ingin mengekspor sandi. Ketik sandi Windows Anda untuk mengizinkannya.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Ini adalah Google Chrome versi terbaru</translation> <translation id="7890208801193284374">Jika Anda berbagi komputer, teman dan keluarga bisa menjelajah secara terpisah dan menyiapkan Chrome sesuai keinginannya.</translation> <translation id="7896673875602241923">Seseorang telah masuk ke Chrome pada komputer ini sebagai <ph name="ACCOUNT_EMAIL_LAST" />. Harap buat pengguna Chrome baru untuk memisahkan informasi Anda.</translation> +<translation id="7916016681687251387">Chrome OS tidak dapat menyinkronkan data Anda. Perbaiki sekarang.</translation> <translation id="7962410387636238736">Komputer ini tidak akan menerima update Google Chrome lagi karena Windows XP dan Windows Vista sudah tidak didukung</translation> <translation id="8008534537613507642">Instal Ulang Chrome</translation> <translation id="8013993649590906847">Jika gambar tidak memiliki deskripsi yang berguna, Chrome akan mencoba memberikan deskripsi untuk Anda. Untuk membuat deskripsi, gambar akan dikirim ke Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 42d7d47..96381737 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Google API キーが欠落しています。Google Chrome の一部の機能は無効になります。</translation> <translation id="2290095356545025170">Google Chrome をアンインストールしてもよろしいですか?</translation> <translation id="2309047409763057870">この Google Chrome はセカンダリ インストールのため、既定のブラウザには設定できません。</translation> +<translation id="2341767445688917208">Chrome OS でパスワードを同期できませんでした。今すぐ問題を修正してください。</translation> <translation id="2348335408836342058">このサイトを利用するには、Chrome でカメラとマイクの使用を許可する必要があります</translation> <translation id="2429317896000329049">お使いのドメインでは同期を利用できないため、Google Chrome はデータを同期できませんでした。</translation> <translation id="2467438592969358367">Google Chrome からパスワードをエクスポートするための許可を求められています。許可するには Windows のパスワードを入力してください。</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome は最新版です</translation> <translation id="7890208801193284374">パソコンを共有している場合、友だちや家族はそれぞれ Chrome を自分専用のブラウザとして自分用の設定をして使うことができます。</translation> <translation id="7896673875602241923">前回このパソコンで別のユーザー(<ph name="ACCOUNT_EMAIL_LAST" />)が Chrome にログインしました。情報を個別に保持するには、新しい Chrome ユーザーを作成してください。</translation> +<translation id="7916016681687251387">Chrome OS でデータを同期できませんでした。今すぐ問題を修正してください。</translation> <translation id="7962410387636238736">Windows XP と Windows Vista はサポートされなくなったため、このパソコンでは今後 Google Chrome のアップデートは受信されません</translation> <translation id="8008534537613507642">Chrome を再インストール</translation> <translation id="8013993649590906847">画像に有効な説明が設定されていない場合に、Chrome で説明を自動的に生成できるよう Google に画像が送信されます。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index b97924fa..85f6407 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">Google API გასაღები გამოტოვებულია. Google Chrome-ის ზოგიერთი ფუნქცია გამორთული იქნება.</translation> <translation id="2290095356545025170">ნამდვილად გსურთ მოახდინოთ Google Chrome-ის დეინსტალაცია?</translation> <translation id="2309047409763057870">ეს Google Chrome-ის მეორადი ინსტალაცია არის და ნაგულისხმევ ბრაუზერად ის ვერ დაყენდება.</translation> +<translation id="2341767445688917208">Chrome OS-მა ვერ მოახერხა თქვენი პაროლების სინქრონიზაცია. შეასწორეთ ახლავე.</translation> <translation id="2348335408836342058">Chrome საჭიროებს თქვენს კამერასა და მიკროფონზე წვდომის ნებართვას ამ საიტისთვის</translation> <translation id="2429317896000329049">Google Chrome-მა ვერ დაასინქრონა თქვენი მონაცემები, რადგან სინქრონიზაცია არ არის ხელმისაწვდომი თქვენი დომენისთვის.</translation> <translation id="2467438592969358367">Google Chrome ითხოვს თქვენი პაროლების ექსპორტირებას. აღნიშნულის დასაშვებად აკრიფეთ თქვენი Windows-ის პაროლი.</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome განახლებულია</translation> <translation id="7890208801193284374">თუ თქვენ აზიარებთ კომპიუტერს, თქვენი მეგობრები და ოჯახის წევრები შეძლებენ ინტერნეტ-გვერდების დამოუკიდებლად დათვალიერებას და Chrome-ის დაყენებას საკუთარი სურვილის შესაბამისად.</translation> <translation id="7896673875602241923">Chrome-ში უკვე განხორციელდა შესვლა ამ კომპიუტერიდან, როგორც <ph name="ACCOUNT_EMAIL_LAST" />. გთხოვთ, შექმნათ Chrome-ის ახალი მომხმარებელი თქვენი ინფორმაციის ცალკე შესანახად.</translation> +<translation id="7916016681687251387">Chrome OS-მა ვერ მოახერხა თქვენი მონაცემების სინქრონიზაცია. შეასწორეთ ახლავე.</translation> <translation id="7962410387636238736">ეს კომპიუტერი აღარ მიიღებს Google Chrome-ის განახლებებს, რადგან Windows XP და Windows Vista აღარ არის მხარდაჭერილი</translation> <translation id="8008534537613507642">ხელახლა დააინსტალირეთ Chrome</translation> <translation id="8013993649590906847">თუ სურათს არ ექნება სასარგებლო აღწერილობა, Chrome შეეცდება მის უზრუნველყოფას. აღწერილობების შესაქმნელად სურათები იგზავნება Google-ში.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index 8574fbe..0563760 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API пернелері жоқ. Кейбір Google Chrome функционалдықтары өшіріледі.</translation> <translation id="2290095356545025170">Google Chrome жою қажет пе?</translation> <translation id="2309047409763057870">Бұл – Google Chrome браузерінің қайта орнатылған нұсқасы және әдепкі браузер бола алмайды.</translation> +<translation id="2341767445688917208">Chrome OS құпия сөздеріңізді синхрондай алмады. Қазір түзету.</translation> <translation id="2348335408836342058">Chrome браузеріне бұл сайтта камераны және микрофонды пайдалану үшін рұқсат керек</translation> <translation id="2429317896000329049">Google Chrome деректеріңізді синхрондай алмады, себебі синхрондау функциясы доменіңіз үшін қолжетімді емес.</translation> <translation id="2467438592969358367">Google Chrome құпия сөздерді экспорттағысы келеді. Бұған рұқсат беру үшін Windows құпия сөзіңізді теріңіз.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome жаңартылған</translation> <translation id="7890208801193284374">Компьютерді бөлісетін болсаңыз, достарыңыз бен жақындарыңыз интернетке бөлек кіріп, Chrome браузерін қалауларынша реттей алады.</translation> <translation id="7896673875602241923">Әлдекім бұл компьютерден Chrome жүйесіне <ph name="ACCOUNT_EMAIL_LAST" /> болып кірген. Ақпаратты бөлек сақтау үшін жаңа Chrome пайдаланушысын жасаңыз.</translation> +<translation id="7916016681687251387">Chrome OS деректеріңізді синхрондай алмады. Қазір түзету.</translation> <translation id="7962410387636238736">Windows XP және Windows Vista жүйелеріне қолдау көрсетілмейтіндіктен, бұл компьютер енді Google Chrome жаңартылған нұсқаларын қабылдамайды</translation> <translation id="8008534537613507642">Chrome қайта орнату</translation> <translation id="8013993649590906847">Егер суреттің пайдалы сипаттамасы болмаса, Chrome оны өзі ұсынып көреді. Сипаттамалар жасау үшін суреттер Google-ға жіберіледі.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index a105e093..5111b9ef 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">សោ Google API បានបាត់។ មុខងារមួយចំនួននៃ Google Chrome នឹងត្រូវបានបិទដំណើរការ។</translation> <translation id="2290095356545025170">តើអ្នកប្រាកដថាចង់លុបការតំឡើង Google Chrome ទេ?</translation> <translation id="2309047409763057870">នេះគឺជាការដំឡើេង Google Chrome បន្ទាប់បន្សំ ហើយវាមិនអាចធ្វើជាកម្មវិធីរុករកលំនាំដើមរបស់អ្នកបានទេ។</translation> +<translation id="2341767445688917208">Chrome OS មិនអាចធ្វើសមកាលកម្មពាក្យសម្ងាត់របស់អ្នកបានទេ។ ដោះស្រាយឥឡូវនេះ។</translation> <translation id="2348335408836342058">Chrome ត្រូវការការអនុញ្ញាតដើម្បីចូលប្រើកាមេរ៉ា និងមីក្រូហ្វូនរបស់អ្នកសម្រាប់ទំព័រនេះ</translation> <translation id="2429317896000329049">Google Chrome មិនអាចធ្វើសមកម្មទិន្នន័យរបស់អ្នកទេ ពីព្រោះ សមកម្ម មិនមានសម្រាប់ដែនរបស់អ្នកទេ។</translation> <translation id="2467438592969358367">Google Chrome ចង់នាំចេញពាក្យសម្ងាត់របស់អ្នក។ សូមវាយបញ្ចូលពាក្យសម្ងាត់ Windows របស់អ្នកដើម្បីអនុញ្ញាតការនាំចេញនេះ។</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome នេះជាកំណែថ្មីហើយ</translation> <translation id="7890208801193284374">ប្រសិនបើអ្នកចែករំលែកកុំព្យូទ័រ មិត្តភ័ក្ត និងគ្រួសារអាចរុករកដាច់ដោយឡែក ហើយតំឡើង Chrome តាមរបៀបដែលអ្នកចង់បាន។</translation> <translation id="7896673875602241923">មាននរណាម្នាក់បានចូលទៅកាន់ Chrome នៅលើកុំព្យូទ័រនេះកាលពីមុន ជា <ph name="ACCOUNT_EMAIL_LAST" /> ។ សូមបង្កើតអ្នកប្រើ Chrome ថ្មី ដើម្បីរក្សាព័ត៌មានរបស់អ្នកដាច់ដោយឡែក។</translation> +<translation id="7916016681687251387">Chrome OS មិនអាចធ្វើសមកាលកម្មទិន្នន័យរបស់អ្នកបានទេ។ ដោះស្រាយឥឡូវនេះ។</translation> <translation id="7962410387636238736">កុំព្យូទ័រនេះនឹងមិនទទួលបានកំណែថ្មីរបស់ Google Chrome ទៀតទេ ដោយសារតែ Windows XP និង Windows Vista មិនអាចប្រើបានទៀតទេ</translation> <translation id="8008534537613507642">តំឡើង Chrome ឡើងវិញ</translation> <translation id="8013993649590906847">ប្រសិនបើរូបភាពមិនមានការពណ៌នាដែលមានប្រយោជន៍ Chrome នឹងព្យាយាមផ្ដល់ការពណ៌នាដែលមានប្រយោជន៍សម្រាប់អ្នក។ រូបភាពត្រូវបានផ្ញើទៅ Google ដើម្បីបង្កើតការពណ៌នា។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 288d999..2a06a80 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API 키가 누락되었습니다. Chrome의 일부 기능이 사용 중지됩니다.</translation> <translation id="2290095356545025170">Chrome을 제거하시겠습니까?</translation> <translation id="2309047409763057870">Chrome의 보조 설치이며 기본 브라우저로 설정할 수 없습니다.</translation> +<translation id="2341767445688917208">Chrome OS에서 비밀번호를 동기화할 수 없습니다. 지금 문제를 해결해 주세요.</translation> <translation id="2348335408836342058">이 사이트에서 카메라와 마이크에 액세스하려면 Chrome에 권한이 필요합니다</translation> <translation id="2429317896000329049">도메인에서 동기화를 사용할 수 없어 Chrome에서 데이터를 동기화하지 못했습니다.</translation> <translation id="2467438592969358367">Chrome에서 비밀번호를 내보내려고 합니다. 허용하려면 Windows 비밀번호를 입력하세요.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Chrome이 최신 버전입니다.</translation> <translation id="7890208801193284374">컴퓨터를 공유하는 경우 친구와 가족이 개별적으로 탐색하고 원하는 대로 Chrome을 설정할 수 있습니다.</translation> <translation id="7896673875602241923">다른 사용자가 이전에 이 컴퓨터에서 <ph name="ACCOUNT_EMAIL_LAST" />(으)로 Chrome에 로그인했습니다. 새 Chrome 사용자를 만들어 정보를 별도로 관리하세요.</translation> +<translation id="7916016681687251387">Chrome OS에서 데이터를 동기화할 수 없습니다. 지금 문제를 해결해 주세요.</translation> <translation id="7962410387636238736">Windows XP와 Windows Vista가 더 이상 지원되지 않으므로 이 컴퓨터에서 Chrome 업데이트를 받을 수 없게 됩니다</translation> <translation id="8008534537613507642">Chrome 재설치</translation> <translation id="8013993649590906847">이미지에 유용한 설명이 없으면 Chrome에서 자동으로 설명을 제공하려고 시도합니다. 설명을 생성하기 위해 이미지가 Google로 전송됩니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 00271dbe..b11d337 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API ачкычтары жок. Google Chrome'дун айрым функциялары өчүрүлөт.</translation> <translation id="2290095356545025170">Google Chrome'ду чын эле орнотуудан чыгаргыңыз келеби?</translation> <translation id="2309047409763057870">Бул Chromium'дун кошумча орнотулушу болгондуктан, аны демейки серепчиңиз катары тандай албайсыз.</translation> +<translation id="2341767445688917208">Chrome OS сырсөздөрүңүздү шайкештештире албай койду. Азыр оңдоо.</translation> <translation id="2348335408836342058">Бул сайтта иштөө үчүн Chrome камераңызды жана микрофонуңузду колдонушу керек</translation> <translation id="2429317896000329049">Домениңизде шайкештештирүү аракети жок болгондуктан, Google Chrome дайындарыңызды шайкештештире алган жок.</translation> <translation id="2467438592969358367">Google Chrome сырсөздөрүңүздү экспорттогону жатат. Ага уруксат берүү үчүн Windows аккаунтуңуздун сырсөзүн териңиз.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome жаңыртылган</translation> <translation id="7890208801193284374">Компьютерди бөлүшсөңүз, жакындарыңыз өзүнчө серептеп, Chrome'ду өзүлөрүнө ылайыктап жөндөп алышат.</translation> <translation id="7896673875602241923">Буга чейин кимдир бирөө бул компьютерден Chrome'го <ph name="ACCOUNT_EMAIL_LAST" /> каттоо эсеби менен кирген. Маалыматыңызды өзүнчө сактоо үчүн жаңы Chrome колдонуучусун түзүңүз.</translation> +<translation id="7916016681687251387">Chrome OS маалыматыңызды шайкештештире албай койду. Азыр оңдоо.</translation> <translation id="7962410387636238736">Бул компьютер мындан ары Google Chrome жаңыртууларын албайт, себеби Windows XP жана Windows Vista мындан ары колдоого алынбайт</translation> <translation id="8008534537613507642">Chrome'ду кайра орнотуу</translation> <translation id="8013993649590906847">Эгер сүрөттөрдүн түшүндүрмөсү жок болсо, Chrome аны түшүндүрүп берүүгө аракет кылат. Түшүндүрмөлөрдү даярдоо үчүн, сүрөттөр Google'га жөнөтүлөт.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 3802f83..1f00f28 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">ລະຫັດ Google API ຫາຍໄປ. ການເຮັດໜ້າທີ່ບາງອັນຂອງ Google Chrom ຈະປິດໃຊ້ງານ.</translation> <translation id="2290095356545025170">ທ່ານແນ່ໃຈບໍວ່າ ທ່ານຕ້ອງການຖອນຕິດຕັ້ງ Google Chrome?</translation> <translation id="2309047409763057870">ນີ້ແມ່ນການຕິດຕັ້ງສຳຮອງຂອງ Google Chrome ແລະ ບໍ່ສາມາດຕັ້ງໃຫ້ເປັນໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນຂອງທ່ານໄດ້.</translation> +<translation id="2341767445688917208">Chrome OS ບໍ່ສາມາດຊິ້ງຂໍ້ມູນລະຫັດຜ່ານຂອງທ່ານໄດ້. ແກ້ໄຂຕອນນີ້ເລີຍ.</translation> <translation id="2348335408836342058">Chrome ຕ້ອງການການອະນຸຍາດເພື່ອເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຂອງທ່ານສຳລັບເວັບໄຊນີ້</translation> <translation id="2429317896000329049">Google Chrome ບໍ່ສາມາດຊິງຄ໌ຂໍ້ມູນຂອງທ່ານໄດ້ ເພາະວ່າບໍ່ມີການຊິງຄ໌ຢູ່ໃນໂດເມນຂອງທ່ານ.</translation> <translation id="2467438592969358367">Google Chrome ຕ້ອງການສົ່ງອອກລະຫັດຜ່ານຂອງທ່ານ. ກະລຸນາພິມລະຫັດຜ່ານ Windows ຂອງທ່ານ ເພື່ອອະນຸຍາດສິ່ງນີ້.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome ແມ່ນເວີຊັນໃໝ່ຫຼ້າສຸດແລ້ວ</translation> <translation id="7890208801193284374">ຖ້າທ່ານແຊຣ໌ຄອມພິວເຕີ, ໝູ່ເພື່ອນ ແລະຄອບຄົວຂອງທ່ານສາມາດທ່ອງເນັດໄດ້ແຍກຕ່າງຫາກ ແລະຕັ້ງ Chrome ໃນແບບທີ່ພວກເຂົາຕ້ອງການ.</translation> <translation id="7896673875602241923">ຄົນອື່ນເຄີຍເຂົ້າສູ່ລະບົບ Chrome ໃນຄອມພິວເຕີນີ້ເປັນ <ph name="ACCOUNT_EMAIL_LAST" /> ມາກ່ອນແລ້ວ. ກະລຸນາສ້າງຜູ້ໃຊ້ Chrome ໃໝ່ເພື່ອເກັບຂໍ້ມູນຂອງທ່ານໃຫ້ແຍກກັນຕ່າງຫາກ.</translation> +<translation id="7916016681687251387">Chrome OS ບໍ່ສາມາດຊິ້ງຂໍ້ມູນຂອງທ່ານໄດ້. ແກ້ໄຂຕອນນີ້ເລີຍ.</translation> <translation id="7962410387636238736">ຄອມພິວເຕີນີ້ຈະບໍ່ໄດ້ຮັບການອັບເດດ Google Chrome ອີກຕໍ່ໄປ ເພາະວ່າບໍ່ຮອງຮັບ Windows XP ແລະ Windows Vista ອີກຕໍ່ໄປ</translation> <translation id="8008534537613507642">ຕິດຕັ້ງ Chrome ຄືນໃໝ່</translation> <translation id="8013993649590906847">ຖ້າຮູບບໍ່ມີລາຍລະອຽດທີ່ເປັນປະໂຫຍດ, Chrome ຈະພະຍາຍາມໃຫ້ລາຍລະອຽດແກ່ທ່ານ. ເພື່ອສ້າງລາຍລະອຽດ, ລະບົບຈະສົ່ງຮູບພາບໃຫ້ Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index e71876f..19d8acf8 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -51,6 +51,7 @@ <translation id="2290014774651636340">Trūkst Google API atslēgu. Tiks atspējotas dažas Google Chrome funkcijas.</translation> <translation id="2290095356545025170">Vai tiešām vēlaties atinstalēt Google Chrome?</translation> <translation id="2309047409763057870">Šī ir Google Chrome papildu instalācija, un to nevar izmantot kā noklusējuma pārlūku.</translation> +<translation id="2341767445688917208">Chrome OS nevarēja sinhronizēt jūsu paroles. Novērsiet problēmu jau tūlīt.</translation> <translation id="2348335408836342058">Pārlūkam Chrome ir nepieciešama atļauja piekļūt jūsu kamerai un mikrofonam šajā vietnē.</translation> <translation id="2429317896000329049">Google Chrome nevarēja sinhronizēt jūsu datus, jo jūsu domēnam nav pieejama sinhronizācija.</translation> <translation id="2467438592969358367">Pārlūkā Google Chrome tiek mēģināts eksportēt jūsu paroles. Lai to atļautu, ierakstiet savu Windows paroli.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Pārlūks Google Chrome ir atjaunināts.</translation> <translation id="7890208801193284374">Ja jūsu datoru izmanto arī jūsu draugi un ģimenes locekļi, viņi var iestatīt pārlūku Chrome atbilstoši savām vēlmēm un pārlūkot saturu atsevišķos kontos.</translation> <translation id="7896673875602241923">Kāds iepriekš pierakstījās pārlūkā Chrome šajā datorā, izmantojot e-pasta adresi <ph name="ACCOUNT_EMAIL_LAST" />. Lūdzu, izveidojiet jaunu Chrome lietotāju, lai nošķirtu savu informāciju.</translation> +<translation id="7916016681687251387">Chrome OS nevarēja sinhronizēt jūsu datus. Novērsiet problēmu jau tūlīt.</translation> <translation id="7962410387636238736">Šajā datorā vairs netiks saņemti Google Chrome atjauninājumi, jo operētājsistēmas Windows XP un Windows Vista vairs netiek atbalstītas.</translation> <translation id="8008534537613507642">Pārinstalēt Chrome</translation> <translation id="8013993649590906847">Ja attēlam nav vērtīga apraksta, pārlūks Chrome mēģinās jums tādu nodrošināt. Lai izveidotu aprakstus, attēli tiek nosūtīti uzņēmumam Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 064f4ba5..3b29050 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API കീകൾ നഷ്ടമായി. Google Chrome-ന്റെ ചില പ്രവർത്തനങ്ങൾ പ്രവർത്തനരഹിതമാകും.</translation> <translation id="2290095356545025170">Google Chrome അണിന്സ്റ്റാള് ചെയ്യണമെന്ന് നിങ്ങള്ക്കുറപ്പാണോ?</translation> <translation id="2309047409763057870">ഇത് Google Chrome-ന്റെ ദ്വിതീയ ഇൻസ്റ്റലേഷനായതിനാൽ, നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാൻ കഴിയില്ല.</translation> +<translation id="2341767445688917208">Chrome OS-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ സമന്വയിപ്പിക്കാനായില്ല. ഇപ്പോൾ പരിഹരിക്കുക.</translation> <translation id="2348335408836342058">ഈ സൈറ്റിനായി, Chrome-ന് നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> <translation id="2429317896000329049">നിങ്ങളുടെ ഡൊമെയ്നിനായി സമന്വയം ലഭ്യമല്ലാത്തതിനാൽ Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="2467438592969358367">നിങ്ങളുടെ പാസ്വേഡുകൾ എക്സ്പോർട്ട് ചെയ്യാൻ Google Chrome ആഗ്രഹിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് നൽകുക.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Chromium അപ്ടുഡേറ്റാണ്</translation> <translation id="7890208801193284374">നിങ്ങളൊരു കമ്പ്യൂട്ടർ പങ്കിടുകയാണെങ്കിൽ, സുഹൃത്തുക്കൾക്കും കുടുബാംഗങ്ങൾക്കും വെവ്വേറെ ബ്രൗസ് ചെയ്യാനും അവർക്കാവശ്യമുള്ള രീതിയിൽ Chrome സജ്ജമാക്കാനുമാകും.</translation> <translation id="7896673875602241923">ഈ കമ്പ്യൂട്ടറിലെ Chrome-ൽ മുമ്പ് മറ്റാരോ <ph name="ACCOUNT_EMAIL_LAST" /> എന്നയാളായി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ വിവരങ്ങൾ പ്രത്യേകം വേർതിരിച്ച് സൂക്ഷിക്കാൻ പുതിയ Chrome ഉപയോക്താവിനെ സൃഷ്ടിക്കുക.</translation> +<translation id="7916016681687251387">Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. ഇപ്പോൾ പരിഹരിക്കുക.</translation> <translation id="7962410387636238736">Windows XP-ക്കും Windows Vista-യ്ക്കും ഇനിയങ്ങോട്ട് പിന്തുണ ഇല്ലാത്തതിനാൽ ഈ കമ്പ്യൂട്ടറിന് ഇനി Google Chrome അപ്ഡേറ്റുകൾ സ്വീകരിക്കാനാകില്ല</translation> <translation id="8008534537613507642">Chrome വീണ്ടും ഇൻസ്റ്റാളുചെയ്യുക</translation> <translation id="8013993649590906847">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chrome ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 4b5f068d..6a1267c 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google-ийн API түлхүүр байхгүй байна. Google Chrome-ийн зарим функц идэвхгүй болно.</translation> <translation id="2290095356545025170">Та Google Chrome-ыг устгах гэж байгаадаа итгэлтэй байна уу?</translation> <translation id="2309047409763057870">Энэ нь Google Chrome-н хоёр дахь суулгалт тул таны өгөгдмөл хөтчөөр сонгох боломжгүй.</translation> +<translation id="2341767445688917208">Chrome үйлдлийн систем таны нууц үгийг синк хийж чадсангүй. Одоо засна уу.</translation> <translation id="2348335408836342058">Энэ сайтыг ашиглахын тулд Chrome-д таны камер, микрофонд хандах зөвшөөрөл шаардлагатай</translation> <translation id="2429317896000329049">Таны домэйнд sync хийх боломжгүй учраас Google Chrome нь таны өгөгдлийг sync хийж чадсангүй.</translation> <translation id="2467438592969358367">Google Chrome таны нууц үгийг экспортлох хүсэлтэй байна. Үүнийг зөвшөөрч байгаа бол Windows-н нууц үгээ оруулна уу.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome-г шинэчилсэн байна</translation> <translation id="7890208801193284374">Нэг компьютерыг олон хэрэглэгч хуваан хэрэглэж байгаа тохиолдолд хэрэглэгч бүр өөрийн хүссэнээр Chrome-ыг тохируулж, хайлт хийх боломжтой.</translation> <translation id="7896673875602241923">Өмнө нь хэн нэгэн энэ компьютероос Chrome-д <ph name="ACCOUNT_EMAIL_LAST" /> бүртгэлээр нэвтэрсэн байна. Мэдээллээ тусaд нь байлгахын тулд Chrome-н шинэ хэрэглэгч үүсгэнэ үү.</translation> +<translation id="7916016681687251387">Chrome үйлдлийн систем таны өгөгдлийг синк хийж чадсангүй. Одоо засна уу.</translation> <translation id="7962410387636238736">Энэ компьютер Windows XP болон Windows Vista-г дэмжихээ больсон тул цаашид Google Chrome-н шинэчлэлтийг авахгүй.</translation> <translation id="8008534537613507642">Chrome-ийг дахин суулгах</translation> <translation id="8013993649590906847">Хэрэв зурагт хэрэгтэй тайлбар байхгүй бол Chrome танд тайлбар өгөхөөр оролдох болно. Тайлбар үүсгэхийн тулд зургийг Google-д илгээнэ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 98f237e..e6a4fea 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">Google API की गहाळ आहेत. Google Chrome ची काही कार्यक्षमता अक्षम केली जाईल.</translation> <translation id="2290095356545025170">तुमची खात्री आहे की तुम्ही Google Chrome अनइंस्टॉल करू इच्छिता?</translation> <translation id="2309047409763057870">ही Google Chrome ची दुय्यम स्थापना असून त्यास तुमचा डीफॉल्ट ब्राउझर बनवू शकत नाही.</translation> +<translation id="2341767445688917208">Chrome OS तुमचे पासवर्ड सिंक करू शकले नाही. आता निराकरण करा.</translation> <translation id="2348335408836342058">या साइटसाठी Chrome ला तुमचा कॅमेरा आणि मायक्रोफोन ॲक्सेस करण्याची परवानगी हवी आहे</translation> <translation id="2429317896000329049">आपल्या डोमेनसाठी संकालन उपलब्ध नसल्यामुळे Google Chrome तुमचा डेटा संकालित करू शकले नाही.</translation> <translation id="2467438592969358367">Google Chrome ला तुमचे पासवर्ड निर्यात करायचे आहेत. हे करू देण्यासाठी तुमचा Windows पासवर्ड टाइप करा.</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome अपडेट झाले आहे</translation> <translation id="7890208801193284374">तुम्ही कॉंप्युटर शेअर केल्यास, मित्र आणि कुटुंब स्वतंत्रपणे ब्राउझ करू शकतात आणि त्यांना पाहिजे तसे Chrome सेट अप करू शकतात.</translation> <translation id="7896673875602241923">कोणीतरी यापूर्वी <ph name="ACCOUNT_EMAIL_LAST" /> म्हणून या संंगणकावरील Chrome मध्ये साइन इन केले आहे. कृपया तुमची माहिती स्वतंत्र ठेवण्यासाठी एक नवीन Chrome वापरकर्ता तयार करा.</translation> +<translation id="7916016681687251387">Chrome OS तुमचा डेटा सिंक करू शकले नाही. आता निराकरण करा.</translation> <translation id="7962410387636238736">Windows XP आणि Windows Vista ला आता सपोर्ट नसल्याने या कॉंप्युटरला यापुढे Google Chrome अपडेट मिळणार नाहीत</translation> <translation id="8008534537613507642">Chrome पुनर्स्थापित करा</translation> <translation id="8013993649590906847">इमेजचे उपयोगी वर्णन नसल्यास, Chrome तुमच्यासाठी ते देण्याचा प्रयत्न करेल. वर्णने तयार करण्यासाठी, इमेज Google ला पाठवल्या जातात.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 24eb156..d21409a 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">API-nøkler for Google mangler. Noe funksjonalitet i Google Chrome blir deaktivert.</translation> <translation id="2290095356545025170">Er du sikker på at du vil avinstallere Google Chrome?</translation> <translation id="2309047409763057870">Dette er en sekundær installering av Google Chrome. Den kan ikke brukes som standardnettleser.</translation> +<translation id="2341767445688917208">Chrome OS kunne ikke synkronisere passordene dine. Løs dette nå.</translation> <translation id="2348335408836342058">Chrome trenger tilgang til kameraet ditt og mikrofonen din for dette nettstedet</translation> <translation id="2429317896000329049">Google Chrome kunne ikke synkronisere dataene dine fordi synkronisering ikke er tilgjengelig for domenet ditt.</translation> <translation id="2467438592969358367">Google Chrome forsøker å eksportere passordene dine. Skriv inn Windows-passordet ditt for å tillate dette.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome er oppdatert</translation> <translation id="7890208801193284374">Hvis du deler en datamaskin med andre, kan venner og familie surfe hver for seg og konfigurere Chrome akkurat slik de vil.</translation> <translation id="7896673875602241923">Noen har tidligere logget på Chrome på denne datamaskinen som <ph name="ACCOUNT_EMAIL_LAST" />. Opprett en ny Chrome-bruker for å holde informasjonen din atskilt.</translation> +<translation id="7916016681687251387">Chrome OS kunne ikke synkronisere dataene dine. Løs dette nå.</translation> <translation id="7962410387636238736">Denne datamaskinen kommer ikke lenger til å motta oppdateringer av Google Chrome, fordi Windows XP og Windows Vista ikke støttes lenger</translation> <translation id="8008534537613507642">Installer Chrome på nytt</translation> <translation id="8013993649590906847">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chrome å finne en til deg. For å opprette beskrivelser blir bilder sendt til Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 7ee5c6e7..5eefd70a 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API ਕੁੰਜੀਆਂ ਮੌਜੂਦ ਨਹੀਂ ਹਨ। Google Chrome ਦੀ ਕੁਝ ਫੰਕਸ਼ਨੈਲਿਟੀ ਬੰਦ ਕੀਤੀ ਜਾਵੇਗੀ।</translation> <translation id="2290095356545025170">ਕੀ ਤੁਸੀਂ ਪੱਕਾ Google Chrome ਨੂੰ ਅਣਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="2309047409763057870">ਇਹ Google Chrome ਦੀ ਇੱਕ ਸੈਕੰਡਰੀ ਸਥਾਪਨਾ ਹੈ, ਅਤੇ ਇਸਨੂੰ ਤੁਹਾਡਾ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।</translation> +<translation id="2341767445688917208">Chrome OS ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਹੁਣੇ ਠੀਕ ਕਰੋ।</translation> <translation id="2348335408836342058">Chrome ਨੂੰ ਇਸ ਸਾਈਟ ਵਾਸਤੇ ਤੁਹਾਡੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="2429317896000329049">Google Chrome ਤੁਹਾਡਾ ਡਾਟਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਸਮਕਾਲੀਕਰਨ ਤੁਹਾਡੀ ਡੋਮੇਨ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> <translation id="2467438592969358367">Google Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਨਿਰਯਾਤ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ। ਇਹ ਕਰਨ ਦੇਣ ਲਈ ਆਪਣਾ Windows ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ।</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome ਅੱਪ ਟੂ ਡੇਟ ਹੈ</translation> <translation id="7890208801193284374">ਜੇਕਰ ਤੁਸੀਂ ਕੋਈ ਕੰਪਿਊਟਰ ਸਾਂਝਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਦੋਸਤ ਅਤੇ ਪਰਿਵਾਰ ਵੱਖਰੇ ਤੌਰ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰ ਸਕਦੇ ਹਨ ਅਤੇ ਆਪਣੇ ਤਰੀਕੇ ਨਾਲ Chrome ਦਾ ਸੈੱਟ ਅੱਪ ਕਰ ਸਕਦੇ ਹਨ।</translation> <translation id="7896673875602241923">ਕਿਸੇ ਵਿਅਕਤੀ ਨੇ ਪਹਿਲਾਂ ਹੀ <ph name="ACCOUNT_EMAIL_LAST" /> ਵਜੋਂ ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ Chrome 'ਤੇ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਆਪਣੀ ਜਾਣਕਾਰੀ ਵੱਖਰੀ ਰੱਖਣ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਨਵਾਂ Chrome ਵਰਤੋਂਕਾਰ ਬਣਾਓ।</translation> +<translation id="7916016681687251387">Chrome OS ਤੁਹਾਡੇ ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਹੁਣੇ ਠੀਕ ਕਰੋ।</translation> <translation id="7962410387636238736">ਹੁਣ Windows XP ਅਤੇ Windows Vista ਸਮਰਥਿਤ ਨਾ ਹੋਣ ਕਰਕੇ ਇਸ ਕੰਪਿਊਟਰ ਨੂੰ Google Chrome ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋਣਗੇ</translation> <translation id="8008534537613507642">Chrome ਨੂੰ ਮੁੜ-ਸਥਾਪਤ ਕਰੋ</translation> <translation id="8013993649590906847">ਜੇ ਕਿਸੇ ਚਿੱਤਰ ਦਾ ਲਾਭਕਾਰੀ ਵਰਣਨ ਨਹੀਂ ਹੈ, ਤਾਂ Chrome ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਵਰਣਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਵਰਣਨ ਬਣਾਉਣ ਲਈ, ਚਿੱਤਰ Google ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 049ee2f..279fa9f 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Lipsesc chei pentru API-ul Google. Unele funcționalități Google Chrome vor fi dezactivate.</translation> <translation id="2290095356545025170">Sigur vrei să dezinstalezi Google Chrome?</translation> <translation id="2309047409763057870">Aceasta este o instalare secundară a browserului Google Chrome și nu poate fi setat ca browser prestabilit.</translation> +<translation id="2341767445688917208">Sistemul de operare Chromie nu a putut sincroniza parolele. Remediază acum.</translation> <translation id="2348335408836342058">Chrome are nevoie de permisiune ca să acceseze camera foto și microfonul pentru acest site</translation> <translation id="2429317896000329049">Google Chrome nu a putut sincroniza datele, deoarece sincronizarea nu este disponibilă pentru domeniul dvs.</translation> <translation id="2467438592969358367">Google Chrome vrea să îți exporte parolele. Pentru a permite asta, introdu parola pentru Windows.</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome este actualizat</translation> <translation id="7890208801193284374">Dacă permiteți accesul la un computer, familia și prietenii pot să navigheze separat și să configureze Chrome cum doresc.</translation> <translation id="7896673875602241923">Un alt utilizator s-a conectat anterior la Chrome pe acest computer ca <ph name="ACCOUNT_EMAIL_LAST" />. Creează un nou utilizator Chrome pentru a-ți păstra separat informațiile.</translation> +<translation id="7916016681687251387">Sistemul de operare Chromie nu a putut sincroniza datele. Remediază acum.</translation> <translation id="7962410387636238736">Acest computer nu va mai primi actualizări pentru Google Chrome, deoarece Windows XP și Windows Vista nu mai sunt acceptate</translation> <translation id="8008534537613507642">Reinstalați Chrome</translation> <translation id="8013993649590906847">Dacă o imagine nu are o descriere utilă, Chrome va încerca să o completeze. Pentru a crea descrieri, imaginile sunt trimise la Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 47f2f93..7d505fae 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -48,6 +48,7 @@ <translation id="2290014774651636340">Отсутствуют ключи API Google. Некоторые функции Google Chrome могут не работать.</translation> <translation id="2290095356545025170">Вы действительно хотите удалить Google Chrome?</translation> <translation id="2309047409763057870">Это дополнительная установка Google Chrome. Его нельзя сделать браузером по умолчанию.</translation> +<translation id="2341767445688917208">Не удалось синхронизировать пароли. Войдите, чтобы исправить эту ошибку.</translation> <translation id="2348335408836342058">Для этого сайта Chrome запрашивает доступ к камере и микрофону.</translation> <translation id="2429317896000329049">Google Chrome не удалось синхронизировать данные, поскольку служба Sync недоступна для вашего домена.</translation> <translation id="2467438592969358367">Чтобы экспортировать пароли из Google Chrome, введите пароль своего аккаунта Windows.</translation> @@ -204,6 +205,7 @@ <translation id="7855730255114109580">Последняя версия Google Chrome уже установлена</translation> <translation id="7890208801193284374">Если, кроме вас, компьютером пользуется кто-то ещё, например родные или друзья, они тоже смогут настроить Chrome на свой вкус.</translation> <translation id="7896673875602241923">Ранее вход в Chrome на этом компьютере выполнялся из аккаунта <ph name="ACCOUNT_EMAIL_LAST" />. Чтобы ваши данные хранились отдельно, создайте новый профиль Chrome.</translation> +<translation id="7916016681687251387">Не удалось синхронизировать данные. Войдите, чтобы исправить эту ошибку.</translation> <translation id="7962410387636238736">Google Chrome больше не будет обновляться на этом компьютере, так как поддержка Windows XP и Windows Vista прекращена.</translation> <translation id="8008534537613507642">Переустановить Chrome</translation> <translation id="8013993649590906847">Если у изображения нет понятного описания, Chrome попытается его найти. Для создания описаний изображения отправляются в Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 5ec7342..a5949ed 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -50,6 +50,7 @@ <translation id="2290014774651636340">Chýbajú kľúče rozhrania Google API. Niektoré funkcie prehliadača Google Chrome budú zakázané.</translation> <translation id="2290095356545025170">Naozaj chcete odinštalovať aplikáciu Google Chrome?</translation> <translation id="2309047409763057870">Toto je sekundárna inštalácia prehliadača Google Chrome – nemôže byť nastavený ako váš predvolený prehliadač.</translation> +<translation id="2341767445688917208">Systému Chrome OS sa nepodarilo synchronizovať vaše heslá. Opravte.</translation> <translation id="2348335408836342058">Chrome potrebuje povolenie pre tento web na prístup k fotoaparátu a mikrofónu</translation> <translation id="2429317896000329049">Prehliadaču Google Chrome sa nepodarilo synchronizovať vaše údaje, pretože možnosť synchronizácie nie je pre vašu doménu k dispozícii.</translation> <translation id="2467438592969358367">Google Chrome sa pokúša exportovať vaše heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Google Chrome je aktuálny.</translation> <translation id="7890208801193284374">Ak počítač zdieľate s rodinou a priateľmi, môžu v prehliadači Chrome prehliadať oddelene a tiež si ho nastaviť podľa vlastných požiadaviek.</translation> <translation id="7896673875602241923">Do Chromu sa už na tomto počítači niekto prihlásil pomocou účtu <ph name="ACCOUNT_EMAIL_LAST" />. Ak chcete ponechať svoje informácie oddelené, vytvorte v Chrome nového používateľa.</translation> +<translation id="7916016681687251387">Systému Chrome OS sa nepodarilo synchronizovať vaše údaje. Opravte.</translation> <translation id="7962410387636238736">Tento počítač už nebude dostávať aktualizácie prehliadača Google Chrome, pretože systémy Windows XP a Windows Vista už nie sú podporované</translation> <translation id="8008534537613507642">Preinštalovať prehliadač Chrome</translation> <translation id="8013993649590906847">Ak obrázok nemá užitočný popis, Chrome sa vám ho pokúsi poskytnúť. Obrázky sa odosielajú Googlu, aby bolo možné vytvoriť popisy.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index bab450c..35fe925 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Çelësat API të Google mungojnë. Disa funksione të Chrome do të çaktivizohen.</translation> <translation id="2290095356545025170">Je i sigurt që dëshiron ta çinstalosh Google Chrome?</translation> <translation id="2309047409763057870">Ky është instalim dytësor i Google Chrome dhe nuk mund të bëhet shfletuesi yt i parazgjedhur.</translation> +<translation id="2341767445688917208">Sistemi operativ Chrome nuk mund t'i sinkronizonte fjalëkalimet e tua. Rregulloje tani.</translation> <translation id="2348335408836342058">Chrome ka nevojë për leje për t'u qasur te kamera dhe mikrofoni yt për këtë sajt</translation> <translation id="2429317896000329049">Google Chrome nuk mund t'i sinkronizonte të dhënat për shkak se sinkronizimi nuk ofrohet për domenin tënd.</translation> <translation id="2467438592969358367">Google Chrome dëshiron të eksportojë fjalëkalimet e tua. Shkruaj fjalëkalimin tënd të Windows për ta lejuar këtë.</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome është i përditësuar</translation> <translation id="7890208801193284374">Nëse e ndan një kompjuter, miqtë dhe familja mund të shfletojnë veçmas dhe ta konfigurojnë Chrome pikërisht ashtu si dëshirojnë.</translation> <translation id="7896673875602241923">Dikush është identifikuar më parë në Chrome në këtë kompjuter si <ph name="ACCOUNT_EMAIL_LAST" />. Krijo një përdorues të ri të Chrome për t'i mbajtur të ndara informacionet e tua.</translation> +<translation id="7916016681687251387">Sistemi operativ Chrome nuk mund t'i sinkronizonte të dhënat e tua. Rregulloje tani.</translation> <translation id="7962410387636238736">Ky kompjuter nuk do të marrë më përditësime të Google Chrome sepse Windows XP dhe Windows Vista nuk mbështeten më</translation> <translation id="8008534537613507642">Instalo përsëri Chrome</translation> <translation id="8013993649590906847">Nëse një imazh nuk ka një përshkrim të dobishëm, Chrome do të përpiqet të të japë një përshkrim. Për të krijuar përshkrime, imazhet dërgohen te Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 4b64f71..2d31e01 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">Funguo za API za Google zinakosekana. Baadhi ya utendaji wa Google Chrome utazimwa.</translation> <translation id="2290095356545025170">Je, una hakika kuwa ungependa kusanidua Google Chrome?</translation> <translation id="2309047409763057870">Huu ni usakinishaji wa pili wa Google Chrome, na haiwezi kufanywa kuwa kivinjari chako chaguomsingi.</translation> +<translation id="2341767445688917208">Mfumo wa Uendeshaji Chrome umeshindwa kusawazisha manenosiri yako. Rekebisha sasa.</translation> <translation id="2348335408836342058">Chrome inahitaji ruhusa ya kufikia kamera na maikrofoni yako katika tovuti hii</translation> <translation id="2429317896000329049">Google Chrome haikuweza kusawazisha data yako kwa sababu Usawazishaji haupatikani kwa kikoa chako.</translation> <translation id="2467438592969358367">Google Chrome ingependa kuhamisha manenosiri yako. Andika nenosiri lako la Windows ili uruhusu shughuli hii.</translation> @@ -213,6 +214,7 @@ <translation id="7855730255114109580">Google Chrome imesasishwa</translation> <translation id="7890208801193284374">Kama unatumia kompyuta pamoja na wengine, marafiki na familia wanaweza kuvinjari tofauti na kusanidi Chrome jinsi wapendavyo.</translation> <translation id="7896673875602241923">Kuna mtu aliingia katika Chrome kwenye kompyuta hii akitumia <ph name="ACCOUNT_EMAIL_LAST" />. Tafadhali ongeza wasifu mwingine wa Chrome ili utenganishe maelezo yako.</translation> +<translation id="7916016681687251387">Mfumo wa Uendeshaji wa Chrome umeshindwa kusawazisha data yako. Rekebisha sasa.</translation> <translation id="7962410387636238736">Kompyuta hii haitapokea tena masasisho ya Google Chrome kwa sababu Windows XP na Windows Vista hazitumiki tena</translation> <translation id="8008534537613507642">Sakinisha Chrome Upya</translation> <translation id="8013993649590906847">Ikiwa picha haina ufafanuzi muhimu, Chrome itajaribu kukuwekea. Ili kuweka ufafanuzi, tutatuma picha kwa Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 0a5b2f4c..1fb3245 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -48,6 +48,7 @@ <translation id="2290014774651636340">คีย์ API ของ Google หายไป การทำงานบางอย่างของ Google Chrome จะถูกปิดใช้งาน</translation> <translation id="2290095356545025170">คุณแน่ใจหรือไม่ว่าต้องการยกเลิกการติดตั้ง Google Chrome</translation> <translation id="2309047409763057870">นี่เป็นการติดตั้ง Google Chrome แบบสำรอง และไม่สามารถใช้เป็นเบราว์เซอร์เริ่มต้นของคุณ</translation> +<translation id="2341767445688917208">Chrome OS ซิงค์รหัสผ่านของคุณไม่ได้ แก้ไขเลย</translation> <translation id="2348335408836342058">Chrome ต้องการสิทธิ์เข้าถึงไมโครโฟนและกล้องถ่ายรูปของคุณสำหรับเว็บไซต์นี้</translation> <translation id="2429317896000329049">Google Chrome ไม่สามารถซิงค์ข้อมูลของคุณเนื่องจากไม่สามารถใช้การซิงค์กับโดเมนของคุณ</translation> <translation id="2467438592969358367">Google Chrome ต้องการส่งออกรหัสผ่านของคุณ พิมพ์รหัสผ่าน Windows เพื่ออนุญาตให้ดำเนินการ</translation> @@ -204,6 +205,7 @@ <translation id="7855730255114109580">Google Chrome อัปเดตแล้ว</translation> <translation id="7890208801193284374">ถ้าคุณให้ผู้อื่นใช้คอมพิวเตอร์ร่วมด้วย เพื่อนๆ และครอบครัวของคุณสามารถท่องเว็บแยกกันได้และตั้งค่า Chrome ได้ตามที่พวกเขาต้องการ</translation> <translation id="7896673875602241923">ก่อนหน้านี้มีผู้ลงชื่อเข้าใช้ Chrome ในคอมพิวเตอร์นี้ด้วยชื่อ <ph name="ACCOUNT_EMAIL_LAST" /> โปรดสร้างผู้ใช้ Chrome ใหม่เพื่อเก็บข้อมูลแยก</translation> +<translation id="7916016681687251387">Chrome OS ซิงค์ข้อมูลของคุณไม่ได้ แก้ไขเลย</translation> <translation id="7962410387636238736">คอมพิวเตอร์เครื่องนี้จะไม่ได้รับการอัปเดต Google Chrome อีกต่อไปเพราะระบบไม่รองรับ Windows XP และ Windows Vista แล้ว</translation> <translation id="8008534537613507642">ติดตั้ง Chrome ใหม่</translation> <translation id="8013993649590906847">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chrome จะพยายามใส่คำอธิบายให้คุณ รูปภาพจะส่งมายัง Google เพื่อสร้างคำอธิบาย</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 937f72fd..98a44134 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">Google API anahtarları eksik. Google Chrome'un bazı işlevleri devre dışı bırakılacak.</translation> <translation id="2290095356545025170">Google Chrome'u kaldırmak istediğinizden emin misiniz?</translation> <translation id="2309047409763057870">Bu, Google Chrome'un ikincil bir yüklemesidir ve varsayılan tarayıcınız yapılamaz.</translation> +<translation id="2341767445688917208">Chrome OS, şifrelerinizi senkronize edemedi. Şimdi düzelt.</translation> <translation id="2348335408836342058">Chrome'un bu sitede kameranıza ve mikrofonunuza erişmesi için izin gerekiyor</translation> <translation id="2429317896000329049">Senkronizasyon, alan adınızda kullanılamadığından Google Chrome, verilerinizi senkronize edemedi.</translation> <translation id="2467438592969358367">Google Chrome şifrelerinizi dışa aktarmak istiyor. Buna izin vermek için Windows şifrenizi yazın.</translation> @@ -208,6 +209,7 @@ <translation id="7855730255114109580">Google Chrome güncel durumda</translation> <translation id="7890208801193284374">Bir bilgisayarı paylaşıyorsanız arkadaşlarınız ve aileniz web'e ayrı olarak göz atabilir ve Chrome'u tam olarak istedikleri şekilde ayarlayabilirler.</translation> <translation id="7896673875602241923">Birisi daha önce bu bilgisayarda <ph name="ACCOUNT_EMAIL_LAST" /> olarak Chrome oturumu açmış. Bilgilerinizi ayrı tutmak için yeni bir Chrome kullanıcısı oluşturun.</translation> +<translation id="7916016681687251387">Chrome OS verilerinizi senkronize edemedi. Şimdi düzelt.</translation> <translation id="7962410387636238736">Windows XP ve Windows Vista artık desteklenmediğinden, bu bilgisayar bundan böyle Google Chrome güncellemelerini almayacaktır</translation> <translation id="8008534537613507642">Chrome'u yeniden yükle</translation> <translation id="8013993649590906847">Bir resmin işe yarar bir açıklaması yoksa, Chrome sizin için bir açıklama sağlamaya çalışır. Açıklama oluşturmak için resimler Google'a gönderilir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index aab24b84..e756b1e 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -53,6 +53,7 @@ <translation id="2290014774651636340">Google API کلیدیں چھوٹی ہوئی ہیں۔ Google Chrome کی کچھ فعالیت غیر فعال ہو جائے گی۔</translation> <translation id="2290095356545025170">کیا آپ واقعی Google Chrome کو ان انسٹال کرنا چاہتے ہیں؟</translation> <translation id="2309047409763057870">یہ Google Chrome کا ثانوی انسٹالیشن ہے اور اسے آپ کا ڈیفالٹ براؤزر نہیں بنایا جا سکتا ہے۔</translation> +<translation id="2341767445688917208">Chrome OS آپ کے پاس ورڈز کی مطابقت پذیری نہیں کر سکا۔ ابھی درست کریں۔</translation> <translation id="2348335408836342058">Chrome کو اس سائٹ کیلئے آپ کے کیمرے اور مائیکروفون تک رسائی کی اجازت درکار ہے</translation> <translation id="2429317896000329049">Google Chrome کلاؤڈ آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا کیونکہ مطابقت پذیری آپ کے ڈومین کیلئے فعال نہیں ہے۔</translation> <translation id="2467438592969358367">Google Chrome آپ کے پاس ورڈز برآمد کرنا چاہتا ہے۔ اس کی اجازت دینے کیلئے، اپنا Windows پاس ورڈ ٹائپ کریں۔</translation> @@ -214,6 +215,7 @@ <translation id="7855730255114109580">Google Chrome اپ ٹو ڈیٹ ہے</translation> <translation id="7890208801193284374">اگر آپ ایک کمپیوٹر کا اشتراک کرتے ہیں تو دوست اور خاندان الگ الگ براؤز کر سکتے ہیں اورChrome کو اپنی مرضی کے موافق ترتیب دے سکتے ہیں۔</translation> <translation id="7896673875602241923">کسی نے قبل ازیں اس کمپیوٹر پر Chrome میں <ph name="ACCOUNT_EMAIL_LAST" /> کے بطور سائن ان کیا۔ اپنی معلومات علیحدہ رکھنے کیلئے براہ کرم ایک نیا Chrome صارف بنائیں۔</translation> +<translation id="7916016681687251387">Chrome OS آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا۔ ابھی درست کریں۔</translation> <translation id="7962410387636238736">یہ کمپیوٹر اب Google Chrome اپ ڈيٹس موصول نہیں کرے گا کیونکہ Windows XP اور Windows Vista اب تعاون یافتہ نہیں ہے</translation> <translation id="8008534537613507642">Chrome کو دوبارہ انسٹال کریں</translation> <translation id="8013993649590906847">اگر کسی تصویر میں مفید تفصیل موجود نہیں ہے تو Chrome آپ کے لیے تفصیل فراہم کرنے کی کوشش کرے گا۔ تفصیلات تخلیق کرنے کے لیے، تصاویر Google کو بھیجی جاتی ہیں۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index 6f5970d..4957d7b 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -51,6 +51,7 @@ <translation id="2290014774651636340">Khóa API của Google bị thiếu. Một số chức năng của Google Chrome sẽ bị tắt.</translation> <translation id="2290095356545025170">Bạn có chắc chắn muốn gỡ cài đặt Google Chrome không?</translation> <translation id="2309047409763057870">Đây là cài đặt thứ cấp của Google Chrome và không thể trở thành trình duyệt mặc định của bạn.</translation> +<translation id="2341767445688917208">Chrome OS không thể đồng bộ hóa mật khẩu của bạn. Khắc phục ngay.</translation> <translation id="2348335408836342058">Chrome cần có quyền truy cập vào máy ảnh và micrô của bạn cho trang web này</translation> <translation id="2429317896000329049">Google Chrome không thể đồng bộ hóa dữ liệu của bạn vì Đồng bộ hóa không khả dụng cho miền của bạn.</translation> <translation id="2467438592969358367">Google Chrome muốn xuất các mật khẩu của bạn. Hãy nhập mật khẩu Windows để cho phép thực hiện việc này.</translation> @@ -210,6 +211,7 @@ <translation id="7855730255114109580">Google Chrome đã được cập nhật</translation> <translation id="7890208801193284374">Nếu bạn chia sẻ máy tính, bạn bè và gia đình có thể duyệt web một cách riêng biệt và thiết lập Chrome theo ý của họ.</translation> <translation id="7896673875602241923">Ai đó trước đây đã đăng nhập vào Chrome trên máy tính này bằng <ph name="ACCOUNT_EMAIL_LAST" />. Vui lòng tạo người dùng Chrome mới để giữ riêng biệt thông tin của bạn.</translation> +<translation id="7916016681687251387">Chrome OS không thể đồng bộ hóa dữ liệu của bạn. Khắc phục ngay.</translation> <translation id="7962410387636238736">Máy tính này sẽ không còn nhận được bản cập nhật Google Chrome do Windows XP và Windows Vista không còn được hỗ trợ</translation> <translation id="8008534537613507642">Cài đặt lại Chrome</translation> <translation id="8013993649590906847">Chrome sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Để tạo nội dung mô tả, các hình ảnh sẽ được gửi đến Google.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 6ff6750..a09b8cf3 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">缺少 Google API 密钥,因此 Google Chrome 的部分功能将无法使用。</translation> <translation id="2290095356545025170">确定要卸载 Google Chrome 浏览器吗?</translation> <translation id="2309047409763057870">这是 Google Chrome 的并行安装,您无法将此浏览器设为默认浏览器。</translation> +<translation id="2341767445688917208">Chrome 操作系统无法同步您的密码。请立即修正。</translation> <translation id="2348335408836342058">Chrome 需要获得相应权限,才能允许此网站使用您的摄像头和麦克风</translation> <translation id="2429317896000329049">由于您的网域停用了同步功能,Google Chrome无法同步您的数据。</translation> <translation id="2467438592969358367">Google Chrome 想导出您的密码。请输入您的 Windows 密码以允许此操作。</translation> @@ -206,6 +207,7 @@ <translation id="7855730255114109580">Google Chrome 已是最新版本</translation> <translation id="7890208801193284374">如果您与亲朋好友共用计算机,他们将能够使用单独的帐号进行浏览,并可随心所欲地设置Chrome。</translation> <translation id="7896673875602241923">之前已有人在此计算机上以 <ph name="ACCOUNT_EMAIL_LAST" /> 的身份登录了 Chrome。请新建一个 Chrome 用户来单独保存您的信息。</translation> +<translation id="7916016681687251387">Chrome 操作系统无法同步您的数据。请立即修正。</translation> <translation id="7962410387636238736">此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 已不再受支持</translation> <translation id="8008534537613507642">重新安装Chrome</translation> <translation id="8013993649590906847">如果图片缺少有用的说明,则 Chrome 会尝试为您提供一条说明。为便于创建说明,系统会将图片发送给 Google。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index c8e34bf..c3ff900 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -52,6 +52,7 @@ <translation id="2290014774651636340">缺少 Google API 金鑰,系統將停用 Google Chrome 的部分功能。</translation> <translation id="2290095356545025170">確定要解除安裝 Google Chrome 嗎?</translation> <translation id="2309047409763057870">這是以並行形式安裝的第二個 Google Chrome,因此無法設定為您的預設瀏覽器。</translation> +<translation id="2341767445688917208">Chrome 作業系統無法同步處理你的密碼。立即修正。</translation> <translation id="2348335408836342058">Chrome 需要取得權限,才能讓這個網站存取您的相機和麥克風</translation> <translation id="2429317896000329049">您的網域無法使用「同步功能」,因此 Google Chrome 無法同步處理您的數據。</translation> <translation id="2467438592969358367">Google Chrome 想匯出您的密碼。請輸入 Windows 密碼以允許此操作。</translation> @@ -212,6 +213,7 @@ <translation id="7855730255114109580">Google Chrome 已是最新版本</translation> <translation id="7890208801193284374">如果您與親朋好友共用電腦,每個人均可享有獨立的瀏覽空間,按照自己的偏好設定 Chrome。</translation> <translation id="7896673875602241923">先前已有其他人在這部電腦上以 <ph name="ACCOUNT_EMAIL_LAST" /> 的身分登入 Chrome。請建立新的 Chrome 使用者以個別保存您的資料。</translation> +<translation id="7916016681687251387">Chrome 作業系統無法同步處理你的資料。立即修正。</translation> <translation id="7962410387636238736">由於 Google Chrome 將停止支援 Windows XP 和 Windows Vista,因此這部電腦不會再收到 Google Chrome 更新。</translation> <translation id="8008534537613507642">重新安裝 Chrome</translation> <translation id="8013993649590906847">如果圖片並無有用的說明,Chrome 會嘗試為您提供說明。因此,圖片將傳送至 Google 以建立說明。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index 350b13c4..6a48093 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -49,6 +49,7 @@ <translation id="2290014774651636340">缺少 Google API 金鑰,系統將停用 Google Chrome 的部分功能。</translation> <translation id="2290095356545025170">你是否確定要解除安裝 Google Chrome?</translation> <translation id="2309047409763057870">這是以並存形式安裝的次要 Google Chrome,無法設為您的預設瀏覽器。</translation> +<translation id="2341767445688917208">Chrome 作業系統無法同步處理你的密碼。立即修正。</translation> <translation id="2348335408836342058">Chrome 需要相關權限,才能讓這個網站使用你的攝影機和麥克風</translation> <translation id="2429317896000329049">你的網域無法使用「同步功能」,因此 Google Chrome 無法同步處理你的資料。</translation> <translation id="2467438592969358367">Google Chrome 要求匯出你的密碼。如果允許,請輸入你的 Windows 密碼。</translation> @@ -208,6 +209,7 @@ <translation id="7855730255114109580">Google Chrome 目前是最新版本</translation> <translation id="7890208801193284374">如果你與親朋好友共用電腦,人人皆可享有獨立的瀏覽空間,依照自己的偏好設定 Chrome。</translation> <translation id="7896673875602241923">先前已有其他使用者使用 <ph name="ACCOUNT_EMAIL_LAST" /> 在這部電腦上登入 Chrome。請建立新的 Chrome 使用者,以便另行保存你的資訊。</translation> +<translation id="7916016681687251387">Chrome 作業系統無法同步處理你的資料。立即修正。</translation> <translation id="7962410387636238736">Google Chrome 已停止支援 Windows XP 和 Windows Vista,因此這部電腦不會再收到 Google Chrome 更新</translation> <translation id="8008534537613507642">重新安裝 Chrome</translation> <translation id="8013993649590906847">如果圖片缺少有用的說明,Chrome 會嘗試為你提供說明。系統會將圖片傳送給 Google,以便產生說明。</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index ac798bc..be75397 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -57,7 +57,7 @@ This device will get automatic software and security updates until <ph name="MONTH_AND_YEAR">$1<ex>September 2020</ex></ph>. <a target="_blank" href="<ph name="URL">$2<ex>https://google.com/</ex></ph>">Learn more</a> </message> <message name="IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE" desc="Message shown on the top level about page to inform the user that this device will no longer receive latest software updates."> - This is the last automatic software and security update for this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. To get future updates, upgrade to a newer model. <ph name="LINK_BEGIN"><a></ph>Learn more<ph name="LINK_END"></a></ph> + This is the last automatic software and security update for this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. To get future updates, upgrade to a newer model. <a target="_blank" href="<ph name="URL">$2<ex>https://google.com/</ex></ph>">Learn more</a> </message> <message name="IDS_SETTINGS_ABOUT_PAGE_RELAUNCH" desc="The label for the relaunch button that relaunches the browser once update is complete"> Restart
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 5ae4cfe..a1e6eff7 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -105,6 +105,8 @@ "assist_ranker/assist_ranker_service_factory.h", "autocomplete/autocomplete_classifier_factory.cc", "autocomplete/autocomplete_classifier_factory.h", + "autocomplete/bitmap_fetcher_helper.cc", + "autocomplete/bitmap_fetcher_helper.h", "autocomplete/chrome_autocomplete_provider_client.cc", "autocomplete/chrome_autocomplete_provider_client.h", "autocomplete/chrome_autocomplete_scheme_classifier.cc", @@ -333,6 +335,8 @@ "component_updater/recovery_improved_component_installer_win.cc", "component_updater/safety_tips_component_installer.cc", "component_updater/safety_tips_component_installer.h", + "component_updater/soda_component_installer.cc", + "component_updater/soda_component_installer.h", "component_updater/ssl_error_assistant_component_installer.cc", "component_updater/ssl_error_assistant_component_installer.h", "component_updater/sth_set_component_remover.cc", @@ -2981,6 +2985,7 @@ "//chrome/browser/notifications/scheduler/public", "//chrome/browser/share", "//chrome/services/media_gallery_util/public/cpp", + "//components/app_modal/android:jni_headers", "//components/autofill_assistant/browser", "//components/cdm/browser", "//components/content_capture/android",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index c9cfada4..54d751f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -860,9 +860,13 @@ kOmniboxOnFocusSuggestionsParamNTPRealboxRemoteLocal[] = { {"ZeroSuggestVariant:15:*", "RemoteNoUrl,Local"}}; const FeatureEntry::FeatureParam + kOmniboxOnFocusSuggestionsParamExtensionNTPOmniboxRemoteLocal[] = { + {"ZeroSuggestVariant:1:*", "RemoteNoUrl,Local"}}; +const FeatureEntry::FeatureParam kOmniboxOnFocusSuggestionsParamNTPOmniboxRealboxRemoteLocal[] = { *kOmniboxOnFocusSuggestionsParamNTPOmniboxRemoteLocal, - *kOmniboxOnFocusSuggestionsParamNTPRealboxRemoteLocal}; + *kOmniboxOnFocusSuggestionsParamNTPRealboxRemoteLocal, + *kOmniboxOnFocusSuggestionsParamExtensionNTPOmniboxRemoteLocal}; #endif // defined(OS_ANDROID) const FeatureEntry::FeatureVariation kOmniboxOnFocusSuggestionsVariations[] = { @@ -883,7 +887,11 @@ kOmniboxOnFocusSuggestionsParamNTPRealboxRemoteLocal, base::size(kOmniboxOnFocusSuggestionsParamNTPRealboxRemoteLocal), "t3316133" /* variation_id */}, - {"NTP Omnibox,Realbox - Remote,Local", + {"Extension NTP Omnibox - Remote,Local", + kOmniboxOnFocusSuggestionsParamExtensionNTPOmniboxRemoteLocal, + base::size(kOmniboxOnFocusSuggestionsParamExtensionNTPOmniboxRemoteLocal), + "t3316133" /* variation_id */}, + {"Everywhere - Remote,Local", kOmniboxOnFocusSuggestionsParamNTPOmniboxRealboxRemoteLocal, base::size(kOmniboxOnFocusSuggestionsParamNTPOmniboxRealboxRemoteLocal), "t3316133" /* variation_id */}, @@ -1112,12 +1120,6 @@ base::size(kExploreSitesDenseTitleBottom), nullptr}, {"Dense Title Right", kExploreSitesDenseTitleRight, base::size(kExploreSitesDenseTitleRight), nullptr}}; -const FeatureEntry::FeatureParam kLongpressResolvePreserveTap = { - contextual_search::kLongpressResolveParamName, - contextual_search::kLongpressResolvePreserveTap}; -const FeatureEntry::FeatureVariation kLongpressResolveVariations[] = { - {"and preserve Tap behavior", &kLongpressResolvePreserveTap, 1, nullptr}, -}; #endif // defined(OS_ANDROID) @@ -1574,10 +1576,7 @@ flag_descriptions::kContextualSearchLongpressResolveName, flag_descriptions::kContextualSearchLongpressResolveDescription, kOsAndroid, - FEATURE_WITH_PARAMS_VALUE_TYPE( - chrome::android::kContextualSearchLongpressResolve, - kLongpressResolveVariations, - "ContextualSearchLongpressResolve")}, + FEATURE_VALUE_TYPE(chrome::android::kContextualSearchLongpressResolve)}, {"contextual-search-ml-tap-suppression", flag_descriptions::kContextualSearchMlTapSuppressionName, @@ -4782,6 +4781,10 @@ flag_descriptions::kHomepageLocationName, flag_descriptions::kHomepageLocationDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kHomepageLocation)}, + {"homepage-settings-ui-conversion", + flag_descriptions::kHomepageSettingsUIConversionName, + flag_descriptions::kHomepageSettingsUIConversionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kHomepageSettingsUIConversion)}, #endif // defined(OS_ANDROID) #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index ac196d95..ef143fbf 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -152,6 +152,7 @@ &kFocusOmniboxInIncognitoTabIntents, &kHandleMediaIntents, &kHomepageLocation, + &kHomepageSettingsUIConversion, &kHorizontalTabSwitcherAndroid, &kImmersiveUiMode, &kInlineUpdateFlow, @@ -452,6 +453,9 @@ const base::Feature kHomepageLocation{"HomepageLocationPolicy", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kHomepageSettingsUIConversion{ + "HomepageSettingsUIConversion", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kHorizontalTabSwitcherAndroid{ "HorizontalTabSwitcherAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index f6b2269..94f1dd2 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -77,6 +77,7 @@ extern const base::Feature kFocusOmniboxInIncognitoTabIntents; extern const base::Feature kHandleMediaIntents; extern const base::Feature kHomepageLocation; +extern const base::Feature kHomepageSettingsUIConversion; extern const base::Feature kHorizontalTabSwitcherAndroid; extern const base::Feature kImmersiveUiMode; extern const base::Feature kImprovedA2HS;
diff --git a/chrome/browser/android/metrics/BUILD.gn b/chrome/browser/android/metrics/BUILD.gn index f4698a6..ebb7d8c 100644 --- a/chrome/browser/android/metrics/BUILD.gn +++ b/chrome/browser/android/metrics/BUILD.gn
@@ -5,7 +5,7 @@ if (is_android) { import("//build/config/android/rules.gni") - _jni_java_files = [ "javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java" ] + _jni_sources = [ "javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java" ] static_library("ukm_utils_for_test") { testonly = true @@ -22,12 +22,12 @@ generate_jni("jni_headers") { testonly = true - sources = _jni_java_files + sources = _jni_sources } android_library("ukm_java_test_support") { testonly = true - java_files = _jni_java_files + sources = _jni_sources deps = [ "//base:base_java", ] @@ -35,8 +35,9 @@ android_library("ukm_javatests") { testonly = true - java_files = - [ "javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java" ] + sources = [ + "javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java", + ] deps = [ ":ukm_java_test_support",
diff --git a/chrome/browser/android/thin_webview/BUILD.gn b/chrome/browser/android/thin_webview/BUILD.gn index b01c57b..88ea3c1 100644 --- a/chrome/browser/android/thin_webview/BUILD.gn +++ b/chrome/browser/android/thin_webview/BUILD.gn
@@ -15,7 +15,7 @@ } android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/thinwebview/CompositorView.java", "java/src/org/chromium/chrome/browser/thinwebview/ThinWebView.java", "java/src/org/chromium/chrome/browser/thinwebview/ThinWebViewConstraints.java", @@ -29,7 +29,7 @@ } android_library("factory_java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/thinwebview/CompositorViewFactory.java", "java/src/org/chromium/chrome/browser/thinwebview/ThinWebViewFactory.java", ]
diff --git a/chrome/browser/android/thin_webview/internal/BUILD.gn b/chrome/browser/android/thin_webview/internal/BUILD.gn index 220ecc9..7979294 100644 --- a/chrome/browser/android/thin_webview/internal/BUILD.gn +++ b/chrome/browser/android/thin_webview/internal/BUILD.gn
@@ -28,7 +28,7 @@ } android_library("internal_java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/thinwebview/internal/CompositorViewImpl.java", "java/src/org/chromium/chrome/browser/thinwebview/internal/ThinWebViewImpl.java", ]
diff --git a/chrome/browser/android/vr/BUILD.gn b/chrome/browser/android/vr/BUILD.gn index 8e83c91..74ef15a 100644 --- a/chrome/browser/android/vr/BUILD.gn +++ b/chrome/browser/android/vr/BUILD.gn
@@ -205,7 +205,9 @@ "//third_party/arcore-android-sdk-client:com_google_ar_core_java", ] - java_files = [ "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java" ] + sources = [ + "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java", + ] } if (enable_arcore) {
diff --git a/chrome/browser/autocomplete/bitmap_fetcher_helper.cc b/chrome/browser/autocomplete/bitmap_fetcher_helper.cc new file mode 100644 index 0000000..b4c226ef --- /dev/null +++ b/chrome/browser/autocomplete/bitmap_fetcher_helper.cc
@@ -0,0 +1,114 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/autocomplete/bitmap_fetcher_helper.h" + +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h" +#include "content/public/browser/browser_context.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "url/gurl.h" + +namespace { + +constexpr net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("omnibox_result_change", R"( + semantics { + sender: "Omnibox" + description: + "Chromium provides answers in the suggestion list for " + "certain queries that user types in the omnibox. This request " + "retrieves a small image (for example, an icon illustrating " + "the current weather conditions) when this can add information " + "to an answer." + trigger: + "Change of results for the query typed by the user in the " + "omnibox." + data: + "The only data sent is the path to an image. No user data is " + "included, although some might be inferrable (e.g. whether the " + "weather is sunny or rainy in the user's current location) " + "from the name of the image in the path." + destination: WEBSITE + } + policy { + cookies_allowed: YES + cookies_store: "user" + setting: + "You can enable or disable this feature via 'Use a prediction " + "service to help complete searches and URLs typed in the " + "address bar.' in Chromium's settings under Advanced. The " + "feature is enabled by default." + chrome_policy { + SearchSuggestEnabled { + policy_options {mode: MANDATORY} + SearchSuggestEnabled: false + } + } + })"); + +// Calls the provided callback when the requested image is downloaded. This +// is a separate class instead of BitmapFetcherHelper implementing the observer +// because BitmapFetcherService takes ownership of its observers. +// TODO(crbug.com/1035981): Make BitmapFetcherService use the more typical +// non-owning ObserverList pattern and include its own network traffic +// annonations therefore elimninating the need for BitmapFetcherServiceObserver +// as well as BitmapFetcherHelper. +class BitmapFetcherServiceObserver : public BitmapFetcherService::Observer { + public: + explicit BitmapFetcherServiceObserver( + const BitmapFetcherHelper::BitmapFetchedCallback& callback) + : callback_(callback) {} + + // BitmapFetcherService::Observer + void OnImageChanged(BitmapFetcherService::RequestId request_id, + const SkBitmap& image) override; + + private: + const BitmapFetcherHelper::BitmapFetchedCallback callback_; + + DISALLOW_COPY_AND_ASSIGN(BitmapFetcherServiceObserver); +}; + +void BitmapFetcherServiceObserver::OnImageChanged( + BitmapFetcherService::RequestId request_id, + const SkBitmap& image) { + DCHECK(!image.empty()); + callback_.Run(image); +} + +} // namespace + +BitmapFetcherHelper::BitmapFetcherHelper(content::BrowserContext* context) + : bitmap_fetcher_service_( + BitmapFetcherServiceFactory::GetForBrowserContext(context)) {} + +BitmapFetcherHelper::~BitmapFetcherHelper() = default; + +BitmapFetcherService::RequestId BitmapFetcherHelper::RequestImage( + const GURL& image_url, + BitmapFetchedCallback callback) { + if (!bitmap_fetcher_service_) + return BitmapFetcherService::REQUEST_ID_INVALID; + + return bitmap_fetcher_service_->RequestImage( + image_url, new BitmapFetcherServiceObserver(callback), + traffic_annotation); +} + +void BitmapFetcherHelper::CancelRequest( + BitmapFetcherService::RequestId request) { + if (!bitmap_fetcher_service_) + return; + + bitmap_fetcher_service_->CancelRequest(request); +} + +void BitmapFetcherHelper::PrefetchImage(const GURL& image_url) { + if (!bitmap_fetcher_service_) + return; + + bitmap_fetcher_service_->Prefetch(image_url, traffic_annotation); +}
diff --git a/chrome/browser/autocomplete/bitmap_fetcher_helper.h b/chrome/browser/autocomplete/bitmap_fetcher_helper.h new file mode 100644 index 0000000..a706c03a --- /dev/null +++ b/chrome/browser/autocomplete/bitmap_fetcher_helper.h
@@ -0,0 +1,45 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_AUTOCOMPLETE_BITMAP_FETCHER_HELPER_H_ +#define CHROME_BROWSER_AUTOCOMPLETE_BITMAP_FETCHER_HELPER_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" + +namespace content { +class BrowserContext; +} // namespace content + +class GURL; +class SkBitmap; + +class BitmapFetcherHelper { + public: + using BitmapFetchedCallback = + base::RepeatingCallback<void(const SkBitmap& bitmap)>; + + explicit BitmapFetcherHelper(content::BrowserContext* context); + virtual ~BitmapFetcherHelper(); + + // Requests the image at |image_url| and returns the request ID. |callback| + // will be called with either a cached or a downloaded image if the request is + // successful or with an empty one to signal failure. + BitmapFetcherService::RequestId RequestImage(const GURL& image_url, + BitmapFetchedCallback callback); + + // Cancels |request| if it is still in-flight. + void CancelRequest(BitmapFetcherService::RequestId request); + + // Start fetching the image at |image_url|. + void PrefetchImage(const GURL& image_url); + + private: + BitmapFetcherService* const bitmap_fetcher_service_; + + DISALLOW_COPY_AND_ASSIGN(BitmapFetcherHelper); +}; + +#endif // CHROME_BROWSER_AUTOCOMPLETE_BITMAP_FETCHER_HELPER_H_
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc index 724f1c5b9..fdfc6703 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -16,8 +16,6 @@ #include "chrome/browser/autocomplete/in_memory_url_index_factory.h" #include "chrome/browser/autocomplete/remote_suggestions_service_factory.h" #include "chrome/browser/autocomplete/shortcuts_backend_factory.h" -#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" -#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" @@ -96,6 +94,7 @@ ChromeAutocompleteProviderClient::ChromeAutocompleteProviderClient( Profile* profile) : profile_(profile), + bitmap_fetcher_helper_(profile), scheme_classifier_(profile), url_consent_helper_( unified_consent::UrlKeyedDataCollectionConsentHelper:: @@ -323,51 +322,7 @@ // Note: Android uses different image fetching mechanism to avoid // penalty of copying byte buffers from C++ to Java. #if !defined(OS_ANDROID) - BitmapFetcherService* image_service = - BitmapFetcherServiceFactory::GetForBrowserContext(profile_); - DCHECK(image_service); - - // TODO(jdonnelly, rhalavati): Create a helper function with Callback to - // create annotation and pass it to image_service, merging the annotations - // in omnibox_page_handler.cc, chrome_omnibox_client.cc, - // and chrome_autocomplete_provider_client.cc. - net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("omnibox_prefetch_image", R"( - semantics { - sender: "Omnibox" - description: - "Chromium provides answers in the suggestion list for certain " - "queries that the user types in the omnibox. This request " - "retrieves a small image (for example, an icon illustrating the " - "current weather conditions) when this can add information to an " - "answer." - trigger: - "Change of results for the query typed by the user in the " - "omnibox." - data: - "The only data sent is the path to an image. No user data is " - "included, although some might be inferrable (e.g. whether the " - "weather is sunny or rainy in the user's current location) from " - "the name of the image in the path." - destination: WEBSITE - } - policy { - cookies_allowed: YES - cookies_store: "user" - setting: - "You can enable or disable this feature via 'Use a prediction " - "service to help complete searches and URLs typed in the " - "address bar.' in Chromium's settings under Advanced. The " - "feature is enabled by default." - chrome_policy { - SearchSuggestEnabled { - policy_options {mode: MANDATORY} - SearchSuggestEnabled: false - } - } - })"); - - image_service->Prefetch(url, traffic_annotation); + bitmap_fetcher_helper_.PrefetchImage(url); #endif // !defined(OS_ANDROID) }
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h index b55a961..b4d9707 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_AUTOCOMPLETE_CHROME_AUTOCOMPLETE_PROVIDER_CLIENT_H_ #include "base/macros.h" +#include "chrome/browser/autocomplete/bitmap_fetcher_helper.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" #include "components/omnibox/browser/autocomplete_provider_client.h" @@ -92,6 +93,7 @@ private: Profile* profile_; + BitmapFetcherHelper bitmap_fetcher_helper_; ChromeAutocompleteSchemeClassifier scheme_classifier_; std::unique_ptr<OmniboxPedalProvider> pedal_provider_; std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 1756d8d..c176e05c 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -64,6 +64,7 @@ #include "chrome/browser/component_updater/optimization_hints_component_installer.h" #include "chrome/browser/component_updater/origin_trials_component_installer.h" #include "chrome/browser/component_updater/safety_tips_component_installer.h" +#include "chrome/browser/component_updater/soda_component_installer.h" #include "chrome/browser/component_updater/ssl_error_assistant_component_installer.h" #include "chrome/browser/component_updater/sth_set_component_remover.h" #include "chrome/browser/component_updater/subresource_filter_component_installer.h" @@ -562,6 +563,10 @@ #if BUILDFLAG(GOOGLE_CHROME_BRANDING) && defined(OS_ANDROID) component_updater::RegisterGamesComponent(cus, profile_prefs); #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) && defined(OS_ANDROID) + + if (profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled)) + component_updater::RegisterSODAComponent(cus, profile_prefs, + base::OnceClosure()); } #if !defined(OS_ANDROID)
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 2b274a18..27abdb8 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -224,6 +224,7 @@ "//components/tracing:startup_tracing", "//components/translate/core/browser", "//components/ukm/content", + "//components/unified_consent", "//components/user_manager", "//components/vector_icons", @@ -2183,6 +2184,8 @@ "sync/os_sync_model_type_controller.h", "sync/os_syncable_service_model_type_controller.cc", "sync/os_syncable_service_model_type_controller.h", + "sync/turn_sync_on_helper.cc", + "sync/turn_sync_on_helper.h", "system/automatic_reboot_manager.cc", "system/automatic_reboot_manager.h", "system/automatic_reboot_manager_observer.h", @@ -2987,6 +2990,7 @@ "smb_client/smb_url_unittest.cc", "smb_client/temp_file_manager_unittest.cc", "startup_settings_cache_unittest.cc", + "sync/turn_sync_on_helper_unittest.cc", "system/automatic_reboot_manager_unittest.cc", "system/device_disabling_manager_unittest.cc", "system/procfs_util_unittest.cc",
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc index 1700ad7..eade7b7 100644 --- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc +++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -80,7 +80,6 @@ #include "extensions/common/extension_messages.h" #include "extensions/common/extension_resource.h" #include "extensions/common/host_id.h" -#include "mojo/public/cpp/bindings/binding.h" #include "services/audio/public/cpp/sounds/sounds_manager.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/accessibility/ax_enum_util.h"
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc index 0e7a1973..16dbb01e 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
@@ -112,9 +112,6 @@ if (profile->IsChild()) return mojom::ChromeAccountType::CHILD_ACCOUNT; - if (IsActiveDirectoryUserForProfile(profile)) - return mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT; - chromeos::DemoSession* demo_session = chromeos::DemoSession::Get(); if (demo_session && demo_session->started()) { // Internally, demo mode is implemented as a public session, and should @@ -224,10 +221,6 @@ migrator->Start(); } -std::string GetAuthenticatedUsernameUTF8(Profile* profile) { - return base::UTF16ToUTF8(signin_ui_util::GetAuthenticatedUsername(profile)); -} - } // namespace // static @@ -280,12 +273,6 @@ DispatchAccountsInArc(std::move(callback)); } -void ArcAuthService::RequestPrimaryAccount( - RequestPrimaryAccountCallback callback) { - std::move(callback).Run(GetAuthenticatedUsernameUTF8(profile_), - GetAccountType(profile_)); -} - void ArcAuthService::OnConnectionReady() { // |TriggerAccountsPushToArc()| will not be triggered for the first session, // when ARC has not been provisioned yet. For the first session, an account @@ -672,7 +659,8 @@ DeletePendingTokenRequest(fetcher); if (success) { - const std::string& full_account_id = GetAuthenticatedUsernameUTF8(profile_); + const std::string& full_account_id = + base::UTF16ToUTF8(signin_ui_util::GetAuthenticatedUsername(profile_)); std::move(callback).Run( mojom::ArcSignInStatus::SUCCESS, CreateAccountInfo(!IsArcOptInVerificationDisabled(), auth_code,
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.h b/chrome/browser/chromeos/arc/auth/arc_auth_service.h index 66b61d1..e892dee1 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service.h +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
@@ -65,8 +65,6 @@ // OS Account Manager. void GetGoogleAccountsInArc(GetGoogleAccountsInArcCallback callback); - void RequestPrimaryAccount(RequestPrimaryAccountCallback callback) override; - // For supporting ArcServiceManager::GetService<T>(). static const char kArcServiceName[];
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc index 38dc911..f34ad1d 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -228,8 +228,9 @@ // a dangling pointer to the User. // TODO(nya): Consider removing all users from ProfileHelper in the // destructor of FakeChromeUserManager. - GetFakeUserManager()->RemoveUserFromList( - GetFakeUserManager()->GetActiveUser()->GetAccountId()); + const AccountId account_id(AccountId::FromUserEmailGaiaId( + kFakeUserName, signin::GetTestGaiaIdForEmail(kFakeUserName))); + GetFakeUserManager()->RemoveUserFromList(account_id); // Since ArcServiceLauncher is (re-)set up with profile() in // SetUpOnMainThread() it is necessary to Shutdown() before the profile() // is destroyed. ArcServiceLauncher::Shutdown() will be called again on @@ -254,14 +255,8 @@ } void SetAccountAndProfile(const user_manager::UserType user_type) { - AccountId account_id; - if (user_type == user_manager::USER_TYPE_ACTIVE_DIRECTORY) { - account_id = AccountId::AdFromUserEmailObjGuid( - kFakeUserName, "fake-active-directory-guid"); - } else { - account_id = AccountId::FromUserEmailGaiaId( - kFakeUserName, signin::GetTestGaiaIdForEmail(kFakeUserName)); - } + const AccountId account_id(AccountId::FromUserEmailGaiaId( + kFakeUserName, signin::GetTestGaiaIdForEmail(kFakeUserName))); const user_manager::User* user = nullptr; switch (user_type) { case user_manager::USER_TYPE_CHILD: @@ -273,16 +268,6 @@ case user_manager::USER_TYPE_PUBLIC_ACCOUNT: user = GetFakeUserManager()->AddPublicAccountUser(account_id); break; - case user_manager::USER_TYPE_ACTIVE_DIRECTORY: - user = GetFakeUserManager()->AddUserWithAffiliationAndTypeAndProfile( - account_id, true /*is_affiliated*/, - user_manager::USER_TYPE_ACTIVE_DIRECTORY, nullptr /*profile*/); - break; - case user_manager::USER_TYPE_ARC_KIOSK_APP: - user = GetFakeUserManager()->AddUserWithAffiliationAndTypeAndProfile( - account_id, false /*is_affiliated*/, - user_manager::USER_TYPE_ARC_KIOSK_APP, nullptr /*profile*/); - break; default: ADD_FAILURE() << "Unexpected user type " << user_type; return; @@ -309,11 +294,7 @@ auto* identity_test_env = identity_test_environment_adaptor_->identity_test_env(); identity_test_env->SetAutomaticIssueOfAccessTokens(true); - if (user_type != user_manager::USER_TYPE_ACTIVE_DIRECTORY) { - // Identity service doesn't have a primary account for Active Directory - // sessions. - identity_test_env->MakePrimaryAccountAvailable(kFakeUserName); - } + identity_test_env->MakePrimaryAccountAvailable(kFakeUserName); profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); profile()->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true); @@ -344,8 +325,6 @@ DCHECK(arc_bridge_service_); arc_bridge_service_->auth()->SetInstance(&auth_instance_); WaitForInstanceReady(arc_bridge_service_->auth()); - // Waiting for users and profiles to be setup. - base::RunLoop().RunUntilIdle(); } AccountInfo SeedAccountInfo(const std::string& email) { @@ -390,27 +369,6 @@ void WaitForGoogleAccountsInArcCallback() { run_loop_->RunUntilIdle(); } - std::pair<const std::string&, mojom::ChromeAccountType> - RequestPrimaryAccount() { - base::RunLoop run_loop; - std::string account_name; - mojom::ChromeAccountType account_type = mojom::ChromeAccountType::UNKNOWN; - base::OnceCallback<void(const std::string&, mojom::ChromeAccountType)> - callback = base::BindLambdaForTesting( - [&run_loop, &account_name, &account_type]( - const std::string& returned_account_name, - mojom::ChromeAccountType returned_account_type) { - account_name = returned_account_name; - account_type = returned_account_type; - run_loop.Quit(); - }); - - auth_service().RequestPrimaryAccount(std::move(callback)); - run_loop.Run(); - - return std::make_pair(account_name, account_type); - } - Profile* profile() { return profile_.get(); } void set_profile_name(const std::string& username) { @@ -451,53 +409,6 @@ DISALLOW_COPY_AND_ASSIGN(ArcAuthServiceTest); }; -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, GetPrimaryAccountForGaiaAccounts) { - SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - const std::pair<const std::string&, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(kFakeUserName, primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::USER_ACCOUNT, primary_account.second); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, GetPrimaryAccountForChildAccounts) { - SetAccountAndProfile(user_manager::USER_TYPE_CHILD); - const std::pair<const std::string&, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(kFakeUserName, primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::CHILD_ACCOUNT, primary_account.second); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, - GetPrimaryAccountForActiveDirectoryAccounts) { - SetAccountAndProfile(user_manager::USER_TYPE_ACTIVE_DIRECTORY); - const std::pair<const std::string&, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(std::string(), primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT, - primary_account.second); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, GetPrimaryAccountForPublicAccounts) { - SetAccountAndProfile(user_manager::USER_TYPE_PUBLIC_ACCOUNT); - const std::pair<const std::string&, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(std::string(), primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::ROBOT_ACCOUNT, primary_account.second); -} - -IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, - GetPrimaryAccountForOfflineDemoAccounts) { - chromeos::DemoSession::SetDemoConfigForTesting( - chromeos::DemoSession::DemoModeConfig::kOffline); - chromeos::DemoSession::StartIfInDemoMode(); - SetAccountAndProfile(user_manager::USER_TYPE_PUBLIC_ACCOUNT); - const std::pair<const std::string&, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(std::string(), primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::OFFLINE_DEMO_ACCOUNT, - primary_account.second); -} - // Tests that when ARC requests account info for a non-managed account, via // |RequestAccountInfoDeprecated| API, Chrome supplies the info configured in // SetAccountAndProfile() method.
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc index f71d7117..2c36bdde 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc
@@ -2774,9 +2774,9 @@ return; } std::move(callback).Run(mojom::BluetoothStatus::SUCCESS, listen_channel, - mojo::MakeRequest(&sock_wrapper->remote)); + sock_wrapper->remote.BindNewPipeAndPassReceiver()); - sock_wrapper->remote.set_connection_error_handler( + sock_wrapper->remote.set_disconnect_handler( base::BindOnce(&ArcBluetoothBridge::RfcommCloseListeningSocket, weak_factory_.GetWeakPtr(), sock_wrapper.get())); listening_sockets_.insert(std::move(sock_wrapper)); @@ -2808,8 +2808,8 @@ } std::move(callback).Run(mojom::BluetoothStatus::SUCCESS, - mojo::MakeRequest(&sock_wrapper->remote)); - sock_wrapper->remote.set_connection_error_handler( + sock_wrapper->remote.BindNewPipeAndPassReceiver()); + sock_wrapper->remote.set_disconnect_handler( base::BindOnce(&ArcBluetoothBridge::RfcommCloseConnectingSocket, weak_factory_.GetWeakPtr(), sock_wrapper.get())); connecting_sockets_.insert(std::move(sock_wrapper));
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h index ec3485d..27ef6b3 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h
@@ -37,6 +37,7 @@ #include "device/bluetooth/bluetooth_remote_gatt_descriptor.h" #include "device/bluetooth/bluetooth_remote_gatt_service.h" #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h" +#include "mojo/public/cpp/bindings/remote.h" namespace content { class BrowserContext; @@ -521,14 +522,14 @@ // Data structures for RFCOMM listening/connecting sockets that live in // Chrome. struct RfcommListeningSocket { - mojom::RfcommListeningSocketClientPtr remote; + mojo::Remote<mojom::RfcommListeningSocketClient> remote; base::ScopedFD file; std::unique_ptr<base::FileDescriptorWatcher::Controller> controller; RfcommListeningSocket(); ~RfcommListeningSocket(); }; struct RfcommConnectingSocket { - mojom::RfcommConnectingSocketClientPtr remote; + mojo::Remote<mojom::RfcommConnectingSocketClient> remote; base::ScopedFD file; std::unique_ptr<base::FileDescriptorWatcher::Controller> controller; RfcommConnectingSocket();
diff --git a/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.cc b/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.cc index 8e39aa8..4a8402b 100644 --- a/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.cc +++ b/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.cc
@@ -80,7 +80,7 @@ // it as an error. DVLOG(1) << "ArcOemCryptoBridge had a failure in D-Bus with the daemon"; // Reset this so we don't think it is bound on future calls to Connect. - oemcrypto_host_daemon_ptr_.reset(); + oemcrypto_host_daemon_remote_.reset(); return; } DVLOG(1) << "ArcOemCryptoBridge succeeded with Mojo bootstrapping."; @@ -107,7 +107,7 @@ return; } - if (oemcrypto_host_daemon_ptr_.is_bound()) { + if (oemcrypto_host_daemon_remote_.is_bound()) { DVLOG(1) << "Re-using bootstrap connection for OemCryptoService Connect"; ConnectToDaemon(std::move(request)); return; @@ -126,12 +126,13 @@ // Bind the Mojo pipe to the interface before we send the D-Bus message // to avoid any kind of race condition with detecting it's been bound. // It's safe to do this before the other end binds anyways. - oemcrypto_host_daemon_ptr_.Bind( - mojo::InterfacePtrInfo<arc_oemcrypto::mojom::OemCryptoHostDaemon>( + oemcrypto_host_daemon_remote_.reset(); + oemcrypto_host_daemon_remote_.Bind( + mojo::PendingRemote<arc_oemcrypto::mojom::OemCryptoHostDaemon>( std::move(server_pipe), 0u)); DVLOG(1) << "Bound remote OemCryptoHostDaemon interface to pipe"; - oemcrypto_host_daemon_ptr_.set_connection_error_handler(base::BindOnce( + oemcrypto_host_daemon_remote_.set_disconnect_handler(base::BindOnce( &ArcOemCryptoBridge::OnMojoConnectionError, weak_factory_.GetWeakPtr())); chromeos::DBusThreadManager::Get() ->GetArcOemCryptoClient() @@ -143,7 +144,7 @@ void ArcOemCryptoBridge::ConnectToDaemon( mojom::OemCryptoServiceRequest request) { - if (!oemcrypto_host_daemon_ptr_) { + if (!oemcrypto_host_daemon_remote_) { VLOG(1) << "Mojo connection is already lost."; return; } @@ -160,18 +161,18 @@ void ArcOemCryptoBridge::FinishConnectingToDaemon( mojom::OemCryptoServiceRequest request, mojo::PendingRemote<mojom::ProtectedBufferManager> gpu_buffer_manager) { - if (!oemcrypto_host_daemon_ptr_) { + if (!oemcrypto_host_daemon_remote_) { VLOG(1) << "Mojo connection is already lost."; return; } - oemcrypto_host_daemon_ptr_->Connect(std::move(request), - std::move(gpu_buffer_manager)); + oemcrypto_host_daemon_remote_->Connect(std::move(request), + std::move(gpu_buffer_manager)); } void ArcOemCryptoBridge::OnMojoConnectionError() { LOG(ERROR) << "ArcOemCryptoBridge Mojo connection lost."; - oemcrypto_host_daemon_ptr_.reset(); + oemcrypto_host_daemon_remote_.reset(); } } // namespace arc
diff --git a/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.h b/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.h index 8ed5f06..d280fc2 100644 --- a/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.h +++ b/chrome/browser/chromeos/arc/oemcrypto/arc_oemcrypto_bridge.h
@@ -14,6 +14,7 @@ #include "components/arc/mojom/oemcrypto_daemon.mojom.h" #include "components/keyed_service/core/keyed_service.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" namespace content { class BrowserContext; @@ -48,7 +49,8 @@ void OnMojoConnectionError(); ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager. - arc_oemcrypto::mojom::OemCryptoHostDaemonPtr oemcrypto_host_daemon_ptr_; + mojo::Remote<arc_oemcrypto::mojom::OemCryptoHostDaemon> + oemcrypto_host_daemon_remote_; // WeakPtrFactory to use for callbacks. base::WeakPtrFactory<ArcOemCryptoBridge> weak_factory_{this};
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc index 3a1443ec..60f9d48f 100644 --- a/chrome/browser/chromeos/assistant/assistant_util.cc +++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -24,6 +24,35 @@ #include "third_party/icu/source/common/unicode/locid.h" #include "ui/chromeos/events/keyboard_layout_util.h" +namespace { + +constexpr char kAtlasBoardType[] = "atlas"; +constexpr char kEveBoardType[] = "eve"; +constexpr char kNocturneBoardType[] = "nocturne"; + +bool IsBoardType(const std::string& board_name, const std::string& board_type) { + // The sub-types of the board will have the form boardtype-XXX. + // To prevent the possibility of common prefix in board names we check the + // board type with '-' here. For example there might be two board types with + // codename boardtype1 and boardtype123. + return board_name == board_type || + base::StartsWith(board_name, board_type + '-', + base::CompareCase::SENSITIVE); +} + +// TODO(updowndota): Merge this method with the IsGoogleDevice method in +// ash::assistant::util, probably move to ash::public:cpp. +// +// Returns whether the device has a dedicated Assistant key. +bool IsAssistantDevice() { + const std::string board_name = base::SysInfo::GetLsbReleaseBoard(); + return IsBoardType(board_name, kAtlasBoardType) || + IsBoardType(board_name, kEveBoardType) || + IsBoardType(board_name, kNocturneBoardType); +} + +} // namespace + namespace assistant { ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile( @@ -96,12 +125,8 @@ return ash::mojom::AssistantAllowedState::DISALLOWED_BY_POLICY; // Bypass the account type check when using fake gaia login, e.g. in Tast - // tests, or the account is logged in a device with a physical Assistant key - // on keyboard. - if (!chromeos::switches::IsGaiaServicesDisabled() && - !(ui::DeviceKeyboardHasAssistantKey() || - base::EqualsCaseInsensitiveASCII(base::SysInfo::GetLsbReleaseBoard(), - "nocturne"))) { + // tests, or the account is logged in a device with dedicated Assistant key. + if (!chromeos::switches::IsGaiaServicesDisabled() && !(IsAssistantDevice())) { // Only enable non-dasher accounts for devices without physical key. bool account_supported = false; auto* identity_manager =
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api.cc b/chrome/browser/chromeos/extensions/printing/printing_api.cc index 26d4586..42533da4 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api.cc +++ b/chrome/browser/chromeos/extensions/printing/printing_api.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/chromeos/extensions/printing/printing_api.h" +#include "base/bind.h" +#include "base/values.h" #include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h" namespace extensions { @@ -15,4 +17,43 @@ PrintingAPIHandler::Get(browser_context())->GetPrinters()))); } +PrintingGetPrinterInfoFunction::~PrintingGetPrinterInfoFunction() = default; + +ExtensionFunction::ResponseAction PrintingGetPrinterInfoFunction::Run() { + std::unique_ptr<api::printing::GetPrinterInfo::Params> params( + api::printing::GetPrinterInfo::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + PrintingAPIHandler::Get(browser_context()) + ->GetPrinterInfo( + params->printer_id, + base::BindOnce( + &PrintingGetPrinterInfoFunction::OnPrinterInfoRetrieved, this)); + + return RespondLater(); +} + +void PrintingGetPrinterInfoFunction::OnPrinterInfoRetrieved( + base::Optional<base::Value> capabilities, + base::Optional<api::printing::PrinterStatus> status, + base::Optional<std::string> error) { + if (error.has_value()) { + Respond(Error(error.value())); + return; + } + api::printing::GetPrinterInfoResponse response; + if (capabilities.has_value()) { + response.capabilities = + std::make_unique<api::printing::GetPrinterInfoResponse::Capabilities>(); + base::Value capabilities_value = std::move(capabilities.value()); + CHECK(capabilities_value.is_dict()); + // It's safe just to swap values here as |capabilities_value| stores exactly + // the same object as |response.capabilities| expects. + response.capabilities->additional_properties.Swap( + static_cast<base::DictionaryValue*>(&capabilities_value)); + } + DCHECK(status.has_value()); + response.status = status.value(); + Respond(OneArgument(response.ToValue())); +} + } // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api.h b/chrome/browser/chromeos/extensions/printing/printing_api.h index 353690a..64f0f35 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api.h +++ b/chrome/browser/chromeos/extensions/printing/printing_api.h
@@ -5,9 +5,15 @@ #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_H_ #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_H_ +#include "base/optional.h" +#include "chrome/common/extensions/api/printing.h" #include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function_histogram_value.h" +namespace base { +class Value; +} // namespace base + namespace extensions { class PrintingGetPrintersFunction : public ExtensionFunction { @@ -21,6 +27,21 @@ DECLARE_EXTENSION_FUNCTION("printing.getPrinters", PRINTING_GETPRINTERS) }; +class PrintingGetPrinterInfoFunction : public ExtensionFunction { + protected: + ~PrintingGetPrinterInfoFunction() override; + + // ExtensionFunction: + ResponseAction Run() override; + + private: + void OnPrinterInfoRetrieved( + base::Optional<base::Value> capabilities, + base::Optional<api::printing::PrinterStatus> status, + base::Optional<std::string> error); + DECLARE_EXTENSION_FUNCTION("printing.getPrinterInfo", PRINTING_GETPRINTERINFO) +}; + } // namespace extensions #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_H_
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api_handler.cc b/chrome/browser/chromeos/extensions/printing/printing_api_handler.cc index 7df50624..a658504 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api_handler.cc +++ b/chrome/browser/chromeos/extensions/printing/printing_api_handler.cc
@@ -4,31 +4,83 @@ #include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h" +#include "base/bind.h" +#include "base/location.h" +#include "base/memory/ptr_util.h" #include "base/stl_util.h" +#include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/chromeos/extensions/printing/printing_api_utils.h" #include "chrome/browser/chromeos/printing/cups_print_job.h" #include "chrome/browser/chromeos/printing/cups_printers_manager.h" +#include "chrome/browser/chromeos/printing/cups_wrapper.h" +#include "chrome/browser/chromeos/printing/printer_configurer.h" +#include "chrome/browser/chromeos/printing/printer_error_codes.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/printing/print_preview_sticky_settings.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" +#include "chromeos/printing/printer_configuration.h" #include "components/prefs/pref_service.h" +#include "components/printing/common/cloud_print_cdd_conversion.h" #include "content/public/browser/browser_context.h" #include "extensions/browser/event_router.h" #include "extensions/browser/extension_registry.h" +#include "printing/backend/cups_jobs.h" +#include "printing/backend/print_backend.h" namespace extensions { +namespace { + +constexpr char kInvalidPrinterIdError[] = "Invalid printer ID"; + +} // namespace + +// static +std::unique_ptr<PrintingAPIHandler> PrintingAPIHandler::CreateForTesting( + content::BrowserContext* browser_context, + EventRouter* event_router, + ExtensionRegistry* extension_registry, + chromeos::CupsPrintJobManager* print_job_manager, + chromeos::CupsPrintersManager* printers_manager, + std::unique_ptr<chromeos::PrinterConfigurer> printer_configurer, + std::unique_ptr<chromeos::CupsWrapper> cups_wrapper) { + return base::WrapUnique(new PrintingAPIHandler( + browser_context, event_router, extension_registry, print_job_manager, + printers_manager, std::move(printer_configurer), + std::move(cups_wrapper))); +} + PrintingAPIHandler::PrintingAPIHandler(content::BrowserContext* browser_context) - : browser_context_(browser_context), - event_router_(EventRouter::Get(browser_context)), - extension_registry_(ExtensionRegistry::Get(browser_context)), - print_job_manager_( + : PrintingAPIHandler( + browser_context, + EventRouter::Get(browser_context), + ExtensionRegistry::Get(browser_context), chromeos::CupsPrintJobManagerFactory::GetForBrowserContext( - browser_context)), - printers_manager_( + browser_context), chromeos::CupsPrintersManagerFactory::GetForBrowserContext( - browser_context)), + browser_context), + chromeos::PrinterConfigurer::Create( + Profile::FromBrowserContext(browser_context)), + chromeos::CupsWrapper::Create()) {} + +PrintingAPIHandler::PrintingAPIHandler( + content::BrowserContext* browser_context, + EventRouter* event_router, + ExtensionRegistry* extension_registry, + chromeos::CupsPrintJobManager* print_job_manager, + chromeos::CupsPrintersManager* printers_manager, + std::unique_ptr<chromeos::PrinterConfigurer> printer_configurer, + std::unique_ptr<chromeos::CupsWrapper> cups_wrapper) + : browser_context_(browser_context), + event_router_(event_router), + extension_registry_(extension_registry), + print_job_manager_(print_job_manager), + printers_manager_(printers_manager), + printer_capabilities_provider_(printers_manager, + std::move(printer_configurer)), + cups_wrapper_(std::move(cups_wrapper)), print_job_manager_observer_(this) { print_job_manager_observer_.Add(print_job_manager_); } @@ -80,6 +132,62 @@ return all_printers; } +void PrintingAPIHandler::GetPrinterInfo(const std::string& printer_id, + GetPrinterInfoCallback callback) { + if (!printers_manager_->GetPrinter(printer_id)) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), /*capabilities=*/base::nullopt, + /*status=*/base::nullopt, kInvalidPrinterIdError)); + return; + } + printer_capabilities_provider_.GetPrinterCapabilities( + printer_id, base::BindOnce(&PrintingAPIHandler::GetPrinterStatus, + weak_ptr_factory_.GetWeakPtr(), printer_id, + std::move(callback))); +} + +void PrintingAPIHandler::GetPrinterStatus( + const std::string& printer_id, + GetPrinterInfoCallback callback, + base::Optional<printing::PrinterSemanticCapsAndDefaults> capabilities) { + if (!capabilities.has_value()) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), /*capabilities=*/base::nullopt, + api::printing::PRINTER_STATUS_UNREACHABLE, + /*error=*/base::nullopt)); + return; + } + base::Value capabilities_value = + cloud_print::PrinterSemanticCapsAndDefaultsToCdd(capabilities.value()); + cups_wrapper_->QueryCupsPrinterStatus( + printer_id, + base::BindOnce(&PrintingAPIHandler::OnPrinterStatusRetrieved, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + std::move(capabilities_value))); +} + +void PrintingAPIHandler::OnPrinterStatusRetrieved( + GetPrinterInfoCallback callback, + base::Value capabilities, + std::unique_ptr<::printing::PrinterStatus> printer_status) { + if (!printer_status) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), std::move(capabilities), + api::printing::PRINTER_STATUS_UNREACHABLE, + /*error=*/base::nullopt)); + return; + } + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce( + std::move(callback), std::move(capabilities), + PrinterStatusToIdl(chromeos::PrinterErrorCodeFromPrinterStatusReasons( + *printer_status)), + /*error=*/base::nullopt)); +} + void PrintingAPIHandler::OnPrintJobCreated( base::WeakPtr<chromeos::CupsPrintJob> job) { DispatchJobStatusChangedEvent(api::printing::JOB_STATUS_PENDING, job);
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api_handler.h b/chrome/browser/chromeos/extensions/printing/printing_api_handler.h index 0fbf2d2..a7c9508 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api_handler.h +++ b/chrome/browser/chromeos/extensions/printing/printing_api_handler.h
@@ -5,11 +5,15 @@ #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_HANDLER_H_ #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_HANDLER_H_ +#include <memory> +#include <string> #include <vector> #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "base/scoped_observer.h" +#include "chrome/browser/chromeos/extensions/printing/printer_capabilities_provider.h" #include "chrome/browser/chromeos/printing/cups_print_job_manager.h" #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h" #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h" @@ -17,10 +21,21 @@ #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/event_router_factory.h" +namespace chromeos { +class CupsWrapper; +class Printer; +class PrinterConfigurer; +} // namespace chromeos + namespace content { class BrowserContext; } // namespace content +namespace printing { +struct PrinterSemanticCapsAndDefaults; +struct PrinterStatus; +} // namespace printing + namespace extensions { class ExtensionRegistry; @@ -30,6 +45,20 @@ class PrintingAPIHandler : public BrowserContextKeyedAPI, public chromeos::CupsPrintJobManager::Observer { public: + using GetPrinterInfoCallback = base::OnceCallback<void( + base::Optional<base::Value> capabilities, + base::Optional<api::printing::PrinterStatus> status, + base::Optional<std::string> error)>; + + static std::unique_ptr<PrintingAPIHandler> CreateForTesting( + content::BrowserContext* browser_context, + EventRouter* event_router, + ExtensionRegistry* extension_registry, + chromeos::CupsPrintJobManager* print_job_manager, + chromeos::CupsPrintersManager* printers_manager, + std::unique_ptr<chromeos::PrinterConfigurer> printer_configurer, + std::unique_ptr<chromeos::CupsWrapper> cups_wrapper); + explicit PrintingAPIHandler(content::BrowserContext* browser_context); ~PrintingAPIHandler() override; @@ -42,10 +71,32 @@ std::vector<api::printing::Printer> GetPrinters(); + void GetPrinterInfo(const std::string& printer_id, + GetPrinterInfoCallback callback); + private: // Needed for BrowserContextKeyedAPI implementation. friend class BrowserContextKeyedAPIFactory<PrintingAPIHandler>; + PrintingAPIHandler( + content::BrowserContext* browser_context, + EventRouter* event_router, + ExtensionRegistry* extension_registry, + chromeos::CupsPrintJobManager* print_job_manager, + chromeos::CupsPrintersManager* printers_manager, + std::unique_ptr<chromeos::PrinterConfigurer> printer_configurer, + std::unique_ptr<chromeos::CupsWrapper> cups_wrapper); + + void GetPrinterStatus( + const std::string& printer_id, + GetPrinterInfoCallback callback, + base::Optional<printing::PrinterSemanticCapsAndDefaults> capabilities); + + void OnPrinterStatusRetrieved( + GetPrinterInfoCallback callback, + base::Value capabilities, + std::unique_ptr<::printing::PrinterStatus> printer_status); + // CupsPrintJobManager::Observer: void OnPrintJobCreated(base::WeakPtr<chromeos::CupsPrintJob> job) override; void OnPrintJobStarted(base::WeakPtr<chromeos::CupsPrintJob> job) override; @@ -66,6 +117,8 @@ chromeos::CupsPrintJobManager* print_job_manager_; chromeos::CupsPrintersManager* const printers_manager_; + PrinterCapabilitiesProvider printer_capabilities_provider_; + std::unique_ptr<chromeos::CupsWrapper> cups_wrapper_; ScopedObserver<chromeos::CupsPrintJobManager, chromeos::CupsPrintJobManager::Observer>
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api_handler_unittest.cc b/chrome/browser/chromeos/extensions/printing/printing_api_handler_unittest.cc index f0768fb2..1e9cd205 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api_handler_unittest.cc +++ b/chrome/browser/chromeos/extensions/printing/printing_api_handler_unittest.cc
@@ -7,10 +7,13 @@ #include <memory> #include <string> +#include "base/run_loop.h" #include "base/values.h" #include "chrome/browser/chromeos/printing/cups_print_job.h" #include "chrome/browser/chromeos/printing/test_cups_print_job_manager.h" #include "chrome/browser/chromeos/printing/test_cups_printers_manager.h" +#include "chrome/browser/chromeos/printing/test_cups_wrapper.h" +#include "chrome/browser/chromeos/printing/test_printer_configurer.h" #include "chrome/browser/printing/print_preview_sticky_settings.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_constants.h" @@ -19,12 +22,15 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/printing/printer_configuration.h" #include "content/public/test/browser_task_environment.h" #include "extensions/browser/event_router.h" #include "extensions/browser/event_router_factory.h" #include "extensions/browser/test_event_router.h" #include "extensions/common/extension_builder.h" #include "extensions/common/features/feature_channel.h" +#include "printing/backend/print_backend.h" +#include "printing/backend/test_print_backend.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -85,19 +91,6 @@ constexpr char kDescription[] = "description"; constexpr char kUri[] = "ipp://1.2.3.4/"; -// Creates a new TestCupsPrintJobManager for the given |context|. -std::unique_ptr<KeyedService> BuildCupsPrintJobManager( - content::BrowserContext* context) { - return std::make_unique<chromeos::TestCupsPrintJobManager>( - Profile::FromBrowserContext(context)); -} - -// Creates a new TestCupsPrintersManager for the given |context|. -std::unique_ptr<KeyedService> BuildCupsPrintersManager( - content::BrowserContext* context) { - return std::make_unique<chromeos::TestCupsPrintersManager>(); -} - chromeos::Printer ConstructPrinter(const std::string& id, const std::string& name, const std::string& description, @@ -126,12 +119,6 @@ testing_profile_ = profile_manager_->CreateTestingProfile(chrome::kInitialProfile); - chromeos::CupsPrintJobManagerFactory::GetInstance()->SetTestingFactory( - testing_profile_, base::BindRepeating(&BuildCupsPrintJobManager)); - chromeos::CupsPrintersManagerFactory::GetInstance()->SetTestingFactory( - testing_profile_, base::BindRepeating(&BuildCupsPrintersManager)); - event_router_ = CreateAndUseTestEventRouter(testing_profile_); - const char kExtensionName[] = "Printing extension"; const char kPermissionName[] = "printing"; scoped_refptr<const Extension> extension = @@ -141,22 +128,60 @@ .Build(); ExtensionRegistry::Get(testing_profile_)->AddEnabled(extension); - printing_api_handler_ = - std::make_unique<PrintingAPIHandler>(testing_profile_); + print_job_manager_ = std::make_unique<chromeos::TestCupsPrintJobManager>( + Profile::FromBrowserContext(testing_profile_)); + printers_manager_ = std::make_unique<chromeos::TestCupsPrintersManager>(); + auto cups_wrapper = std::make_unique<chromeos::TestCupsWrapper>(); + cups_wrapper_ = cups_wrapper.get(); + test_backend_ = base::MakeRefCounted<printing::TestPrintBackend>(); + printing::PrintBackend::SetPrintBackendForTesting(test_backend_.get()); + event_router_ = CreateAndUseTestEventRouter(testing_profile_); + + printing_api_handler_ = PrintingAPIHandler::CreateForTesting( + testing_profile_, event_router_, + ExtensionRegistry::Get(testing_profile_), print_job_manager_.get(), + printers_manager_.get(), + std::make_unique<chromeos::TestPrinterConfigurer>(), + std::move(cups_wrapper)); } void TearDown() override { printing_api_handler_.reset(); + test_backend_.reset(); + printers_manager_.reset(); + print_job_manager_.reset(); + testing_profile_ = nullptr; profile_manager_->DeleteTestingProfile(chrome::kInitialProfile); } + void OnPrinterInfoRetrieved( + base::RepeatingClosure run_loop_closure, + base::Optional<base::Value> capabilities, + base::Optional<api::printing::PrinterStatus> status, + base::Optional<std::string> error) { + if (capabilities) + capabilities_ = capabilities.value().Clone(); + else + capabilities_ = base::nullopt; + status_ = status; + error_ = error; + run_loop_closure.Run(); + } + protected: content::BrowserTaskEnvironment task_environment_; TestingProfile* testing_profile_; + scoped_refptr<printing::TestPrintBackend> test_backend_; TestEventRouter* event_router_ = nullptr; + std::unique_ptr<chromeos::TestCupsPrintJobManager> print_job_manager_; + std::unique_ptr<chromeos::TestCupsPrintersManager> printers_manager_; + chromeos::TestCupsWrapper* cups_wrapper_; std::unique_ptr<PrintingAPIHandler> printing_api_handler_; + base::Optional<base::Value> capabilities_; + base::Optional<api::printing::PrinterStatus> status_; + base::Optional<std::string> error_; private: // TODO(crbug.com/992889): Remove this once the API is launched for stable. @@ -172,16 +197,12 @@ PrintingEventObserver event_observer( event_router_, api::printing::OnJobStatusChanged::kEventName); - chromeos::TestCupsPrintJobManager* print_job_manager = - static_cast<chromeos::TestCupsPrintJobManager*>( - chromeos::CupsPrintJobManagerFactory::GetForBrowserContext( - testing_profile_)); std::unique_ptr<chromeos::CupsPrintJob> print_job = std::make_unique<chromeos::CupsPrintJob>( chromeos::Printer(kPrinterId), kJobId, "title", /*total_page_number=*/3, ::printing::PrintJob::Source::EXTENSION, kExtensionId, chromeos::printing::proto::PrintSettings()); - print_job_manager->CreatePrintJob(print_job.get()); + print_job_manager_->CreatePrintJob(print_job.get()); EXPECT_EQ(kExtensionId, event_observer.extension_id()); const base::Value& event_args = event_observer.event_args(); @@ -203,16 +224,12 @@ PrintingEventObserver event_observer( event_router_, api::printing::OnJobStatusChanged::kEventName); - chromeos::TestCupsPrintJobManager* print_job_manager = - static_cast<chromeos::TestCupsPrintJobManager*>( - chromeos::CupsPrintJobManagerFactory::GetForBrowserContext( - testing_profile_)); std::unique_ptr<chromeos::CupsPrintJob> print_job = std::make_unique<chromeos::CupsPrintJob>( chromeos::Printer(kPrinterId), kJobId, "title", /*total_page_number=*/3, ::printing::PrintJob::Source::PRINT_PREVIEW, /*source_id=*/"", chromeos::printing::proto::PrintSettings()); - print_job_manager->CreatePrintJob(print_job.get()); + print_job_manager_->CreatePrintJob(print_job.get()); // Check that the print job created on Print Preview doesn't show up. EXPECT_EQ("", event_observer.extension_id()); @@ -229,13 +246,9 @@ // Test that calling GetPrinters() returns the mock printer. TEST_F(PrintingAPIHandlerUnittest, GetPrinters_OnePrinter) { - chromeos::TestCupsPrintersManager* printers_manager = - static_cast<chromeos::TestCupsPrintersManager*>( - chromeos::CupsPrintersManagerFactory::GetForBrowserContext( - testing_profile_)); chromeos::Printer printer = ConstructPrinter(kId1, kName, kDescription, kUri, chromeos::Printer::SRC_POLICY); - printers_manager->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); + printers_manager_->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); std::vector<api::printing::Printer> printers = printing_api_handler_->GetPrinters(); @@ -254,16 +267,12 @@ // Test that calling GetPrinters() returns printers of all classes. TEST_F(PrintingAPIHandlerUnittest, GetPrinters_ThreePrinters) { - chromeos::TestCupsPrintersManager* printers_manager = - static_cast<chromeos::TestCupsPrintersManager*>( - chromeos::CupsPrintersManagerFactory::GetForBrowserContext( - testing_profile_)); chromeos::Printer printer1 = chromeos::Printer(kId1); chromeos::Printer printer2 = chromeos::Printer(kId2); chromeos::Printer printer3 = chromeos::Printer(kId3); - printers_manager->AddPrinter(printer1, chromeos::PrinterClass::kEnterprise); - printers_manager->AddPrinter(printer2, chromeos::PrinterClass::kSaved); - printers_manager->AddPrinter(printer3, chromeos::PrinterClass::kAutomatic); + printers_manager_->AddPrinter(printer1, chromeos::PrinterClass::kEnterprise); + printers_manager_->AddPrinter(printer2, chromeos::PrinterClass::kSaved); + printers_manager_->AddPrinter(printer3, chromeos::PrinterClass::kAutomatic); std::vector<api::printing::Printer> printers = printing_api_handler_->GetPrinters(); @@ -281,13 +290,9 @@ testing_profile_->GetPrefs()->SetString( prefs::kPrintPreviewDefaultDestinationSelectionRules, R"({"kind": "local", "idPattern": "id.*"})"); - chromeos::TestCupsPrintersManager* printers_manager = - static_cast<chromeos::TestCupsPrintersManager*>( - chromeos::CupsPrintersManagerFactory::GetForBrowserContext( - testing_profile_)); chromeos::Printer printer = ConstructPrinter(kId1, kName, kDescription, kUri, chromeos::Printer::SRC_POLICY); - printers_manager->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); + printers_manager_->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); std::vector<api::printing::Printer> printers = printing_api_handler_->GetPrinters(); @@ -316,13 +321,10 @@ ] })"); sticky_settings->SaveInPrefs(testing_profile_->GetPrefs()); - chromeos::TestCupsPrintersManager* printers_manager = - static_cast<chromeos::TestCupsPrintersManager*>( - chromeos::CupsPrintersManagerFactory::GetForBrowserContext( - testing_profile_)); + chromeos::Printer printer = ConstructPrinter(kId1, kName, kDescription, kUri, chromeos::Printer::SRC_POLICY); - printers_manager->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); + printers_manager_->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); std::vector<api::printing::Printer> printers = printing_api_handler_->GetPrinters(); @@ -337,4 +339,95 @@ EXPECT_EQ(1, *idl_printer.recently_used_rank); } +TEST_F(PrintingAPIHandlerUnittest, GetPrinterInfo_InvalidId) { + base::RunLoop run_loop; + printing_api_handler_->GetPrinterInfo( + kPrinterId, + base::BindOnce(&PrintingAPIHandlerUnittest::OnPrinterInfoRetrieved, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + + // Printer is not added to CupsPrintersManager, so we expect "Invalid printer + // id" error. + EXPECT_FALSE(capabilities_.has_value()); + EXPECT_FALSE(status_.has_value()); + ASSERT_TRUE(error_.has_value()); + EXPECT_EQ("Invalid printer ID", error_.value()); +} + +TEST_F(PrintingAPIHandlerUnittest, GetPrinterInfo_NoCapabilities) { + chromeos::Printer printer = chromeos::Printer(kPrinterId); + printers_manager_->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); + printers_manager_->InstallPrinter(kPrinterId); + + base::RunLoop run_loop; + printing_api_handler_->GetPrinterInfo( + kPrinterId, + base::BindOnce(&PrintingAPIHandlerUnittest::OnPrinterInfoRetrieved, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + + EXPECT_FALSE(capabilities_.has_value()); + ASSERT_TRUE(status_.has_value()); + EXPECT_EQ(api::printing::PRINTER_STATUS_UNREACHABLE, status_.value()); + EXPECT_FALSE(error_.has_value()); +} + +TEST_F(PrintingAPIHandlerUnittest, GetPrinterInfo) { + chromeos::Printer printer = chromeos::Printer(kPrinterId); + printers_manager_->AddPrinter(printer, chromeos::PrinterClass::kEnterprise); + + // Add printer capabilities to |test_backend_|. + test_backend_->AddValidPrinter( + kPrinterId, std::make_unique<printing::PrinterSemanticCapsAndDefaults>()); + + // Mock CUPS wrapper to return predefined status for given printer. + printing::PrinterStatus::PrinterReason reason; + reason.reason = printing::PrinterStatus::PrinterReason::MEDIA_EMPTY; + cups_wrapper_->SetPrinterStatus(kPrinterId, reason); + + base::RunLoop run_loop; + printing_api_handler_->GetPrinterInfo( + kPrinterId, + base::BindOnce(&PrintingAPIHandlerUnittest::OnPrinterInfoRetrieved, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + + ASSERT_TRUE(capabilities_.has_value()); + const base::Value* capabilities_value = capabilities_->FindDictKey("printer"); + ASSERT_TRUE(capabilities_value); + + const base::Value* color = capabilities_value->FindDictKey("color"); + ASSERT_TRUE(color); + const base::Value* color_options = color->FindListKey("option"); + ASSERT_TRUE(color_options); + ASSERT_EQ(1u, color_options->GetList().size()); + const std::string* color_type = + color_options->GetList()[0].FindStringKey("type"); + ASSERT_TRUE(color_type); + EXPECT_EQ("STANDARD_MONOCHROME", *color_type); + + const base::Value* page_orientation = + capabilities_value->FindDictKey("page_orientation"); + ASSERT_TRUE(page_orientation); + const base::Value* page_orientation_options = + page_orientation->FindListKey("option"); + ASSERT_TRUE(page_orientation_options); + ASSERT_EQ(3u, page_orientation_options->GetList().size()); + std::vector<std::string> page_orientation_types; + for (const base::Value& page_orientation_option : + page_orientation_options->GetList()) { + const std::string* page_orientation_type = + page_orientation_option.FindStringKey("type"); + ASSERT_TRUE(page_orientation_type); + page_orientation_types.push_back(*page_orientation_type); + } + EXPECT_THAT(page_orientation_types, + testing::UnorderedElementsAre("PORTRAIT", "LANDSCAPE", "AUTO")); + + ASSERT_TRUE(status_.has_value()); + EXPECT_EQ(api::printing::PRINTER_STATUS_OUT_OF_PAPER, status_.value()); + EXPECT_FALSE(error_.has_value()); +} + } // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api_utils.cc b/chrome/browser/chromeos/extensions/printing/printing_api_utils.cc index 80dcfb1..c764808 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api_utils.cc +++ b/chrome/browser/chromeos/extensions/printing/printing_api_utils.cc
@@ -94,4 +94,30 @@ return idl_printer; } +idl::PrinterStatus PrinterStatusToIdl(chromeos::PrinterErrorCode status) { + switch (status) { + case chromeos::PrinterErrorCode::NO_ERROR: + return idl::PRINTER_STATUS_AVAILABLE; + case chromeos::PrinterErrorCode::PAPER_JAM: + return idl::PRINTER_STATUS_PAPER_JAM; + case chromeos::PrinterErrorCode::OUT_OF_PAPER: + return idl::PRINTER_STATUS_OUT_OF_PAPER; + case chromeos::PrinterErrorCode::OUT_OF_INK: + return idl::PRINTER_STATUS_OUT_OF_INK; + case chromeos::PrinterErrorCode::DOOR_OPEN: + return idl::PRINTER_STATUS_DOOR_OPEN; + case chromeos::PrinterErrorCode::PRINTER_UNREACHABLE: + return idl::PRINTER_STATUS_UNREACHABLE; + case chromeos::PrinterErrorCode::TRAY_MISSING: + return idl::PRINTER_STATUS_TRAY_MISSING; + case chromeos::PrinterErrorCode::OUTPUT_FULL: + return idl::PRINTER_STATUS_OUTPUT_FULL; + case chromeos::PrinterErrorCode::STOPPED: + return idl::PRINTER_STATUS_STOPPED; + default: + return idl::PRINTER_STATUS_GENERIC_ISSUE; + } + return idl::PRINTER_STATUS_GENERIC_ISSUE; +} + } // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/printing/printing_api_utils.h b/chrome/browser/chromeos/extensions/printing/printing_api_utils.h index 60d9023..0d27ef4 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_api_utils.h +++ b/chrome/browser/chromeos/extensions/printing/printing_api_utils.h
@@ -9,6 +9,7 @@ #include "base/containers/flat_map.h" #include "base/optional.h" +#include "chrome/browser/chromeos/printing/printer_error_codes.h" #include "chrome/common/extensions/api/printing.h" namespace chromeos { @@ -34,6 +35,9 @@ const base::Optional<DefaultPrinterRules>& default_printer_rules, const base::flat_map<std::string, int>& recently_used_ranks); +api::printing::PrinterStatus PrinterStatusToIdl( + chromeos::PrinterErrorCode status); + } // namespace extensions #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_PRINTING_PRINTING_API_UTILS_H_
diff --git a/chrome/browser/chromeos/extensions/printing/printing_apitest.cc b/chrome/browser/chromeos/extensions/printing/printing_apitest.cc index da3d5fe..b7397372 100644 --- a/chrome/browser/chromeos/extensions/printing/printing_apitest.cc +++ b/chrome/browser/chromeos/extensions/printing/printing_apitest.cc
@@ -5,19 +5,25 @@ #include "base/bind.h" #include "chrome/browser/chromeos/extensions/printing/printing_api.h" #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h" +#include "chrome/browser/chromeos/printing/printer_configurer.h" #include "chrome/browser/chromeos/printing/test_cups_printers_manager.h" +#include "chrome/browser/chromeos/printing/test_printer_configurer.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/policy_test_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/printing/printer_configuration.h" +#include "printing/backend/print_backend.h" +#include "printing/backend/test_print_backend.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { namespace { +constexpr char kId[] = "id"; + std::unique_ptr<KeyedService> BuildTestCupsPrintersManager( content::BrowserContext* context) { return std::make_unique<chromeos::TestCupsPrintersManager>(); @@ -41,6 +47,8 @@ base::BindRepeating( &PrintingApiTest::OnWillCreateBrowserContextServices, base::Unretained(this))); + chromeos::PrinterConfigurer::SetPrinterConfigurerForTesting( + std::make_unique<chromeos::TestPrinterConfigurer>()); ExtensionApiTest::SetUpInProcessBrowserTestFixture(); } @@ -56,7 +64,6 @@ }; IN_PROC_BROWSER_TEST_F(PrintingApiTest, GetPrinters) { - constexpr char kId[] = "id"; constexpr char kName[] = "name"; chromeos::Printer printer = chromeos::Printer(kId); @@ -71,4 +78,20 @@ ASSERT_TRUE(RunExtensionSubtest("printing", "get_printers.html")); } +IN_PROC_BROWSER_TEST_F(PrintingApiTest, GetPrinterInfo) { + chromeos::Printer printer = chromeos::Printer(kId); + chromeos::TestCupsPrintersManager* printers_manager = + static_cast<chromeos::TestCupsPrintersManager*>( + chromeos::CupsPrintersManagerFactory::GetForBrowserContext( + browser()->profile())); + printers_manager->AddPrinter(printer, chromeos::PrinterClass::kSaved); + + auto test_backend = base::MakeRefCounted<printing::TestPrintBackend>(); + printing::PrintBackend::SetPrintBackendForTesting(test_backend.get()); + test_backend->AddValidPrinter( + kId, std::make_unique<printing::PrinterSemanticCapsAndDefaults>()); + + ASSERT_TRUE(RunExtensionSubtest("printing", "get_printer_info.html")); +} + } // namespace extensions
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 741dacb..f2db16a 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -82,6 +82,7 @@ #include "chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/settings/cros_settings.h" +#include "chrome/browser/chromeos/sync/turn_sync_on_helper.h" #include "chrome/browser/chromeos/tether/tether_service.h" #include "chrome/browser/chromeos/tpm_firmware_update_notification.h" #include "chrome/browser/chromeos/u2f_notification.h" @@ -100,6 +101,7 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h" +#include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/ui/app_list/app_list_client_impl.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" @@ -1768,6 +1770,11 @@ // If needed, create browser observer to display first run OOBE Goodies page. first_run::GoodiesDisplayer::Init(); + if (chromeos::features::IsSplitSettingsSyncEnabled() && + ProfileSyncServiceFactory::IsSyncAllowed(profile)) { + turn_sync_on_helper_ = std::make_unique<TurnSyncOnHelper>(profile); + } + // Schedule a flush if profile is not ephemeral. if (!ProfileHelper::IsEphemeralUserProfile(profile)) ProfileHelper::Get()->FlushProfile(profile); @@ -2435,6 +2442,7 @@ } void UserSessionManager::Shutdown() { + turn_sync_on_helper_.reset(); token_handle_fetcher_.reset(); token_handle_util_.reset(); first_run::GoodiesDisplayer::Delete();
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.h b/chrome/browser/chromeos/login/session/user_session_manager.h index a6c9b885..186c38d 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.h +++ b/chrome/browser/chromeos/login/session/user_session_manager.h
@@ -46,6 +46,7 @@ class PrefService; class Profile; class TokenHandleFetcher; +class TurnSyncOnHelper; namespace base { class CommandLine; @@ -660,6 +661,8 @@ std::unique_ptr<ReleaseNotesNotification> release_notes_notification_; + std::unique_ptr<TurnSyncOnHelper> turn_sync_on_helper_; + base::WeakPtrFactory<UserSessionManager> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(UserSessionManager);
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index b4ab6bda..e776b75 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc
@@ -32,6 +32,7 @@ #include "chrome/browser/chromeos/net/wake_on_wifi_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/settings/cros_settings.h" +#include "chrome/browser/chromeos/sync/turn_sync_on_helper.h" #include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/chromeos/system/timezone_resolver_manager.h" #include "chrome/browser/chromeos/system/timezone_util.h" @@ -160,6 +161,10 @@ // static void Preferences::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { + // Some classes register their own prefs. + TurnSyncOnHelper::RegisterProfilePrefs(registry); + input_method::InputMethodSyncer::RegisterProfilePrefs(registry); + std::string hardware_keyboard_id; // TODO(yusukes): Remove the runtime hack. if (IsRunningAsSystemCompositor()) { @@ -334,8 +339,6 @@ registry->RegisterBooleanPref(prefs::kTouchVirtualKeyboardEnabled, false); - input_method::InputMethodSyncer::RegisterProfilePrefs(registry); - std::string current_timezone_id; if (chromeos::CrosSettings::IsInitialized()) { // In unit tests CrosSettings is not always initialized.
diff --git a/chrome/browser/chromeos/printing/printer_configurer.cc b/chrome/browser/chromeos/printing/printer_configurer.cc index 8fb572d..dd3c7e4 100644 --- a/chrome/browser/chromeos/printing/printer_configurer.cc +++ b/chrome/browser/chromeos/printing/printer_configurer.cc
@@ -15,6 +15,7 @@ #include "base/feature_list.h" #include "base/hash/md5.h" #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" @@ -48,6 +49,9 @@ namespace { +// PrinterConfigurer override for testing. +PrinterConfigurer* g_printer_configurer_for_test = nullptr; + PrinterSetupResult PrinterSetupResultFromDbusResultCode(const Printer& printer, int result_code) { DCHECK_GE(result_code, 0); @@ -280,9 +284,22 @@ // static std::unique_ptr<PrinterConfigurer> PrinterConfigurer::Create(Profile* profile) { + if (g_printer_configurer_for_test) { + auto printer_configurer = + base::WrapUnique<PrinterConfigurer>(g_printer_configurer_for_test); + g_printer_configurer_for_test = nullptr; + return printer_configurer; + } return std::make_unique<PrinterConfigurerImpl>(profile); } +// static +void PrinterConfigurer::SetPrinterConfigurerForTesting( + std::unique_ptr<PrinterConfigurer> printer_configurer) { + DCHECK(!g_printer_configurer_for_test); + g_printer_configurer_for_test = printer_configurer.release(); +} + std::ostream& operator<<(std::ostream& out, const PrinterSetupResult& result) { switch (result) { case kFatalError:
diff --git a/chrome/browser/chromeos/printing/printer_configurer.h b/chrome/browser/chromeos/printing/printer_configurer.h index 09e66ac..39f3637 100644 --- a/chrome/browser/chromeos/printing/printer_configurer.h +++ b/chrome/browser/chromeos/printing/printer_configurer.h
@@ -91,6 +91,10 @@ // Records UMA metrics for USB printer setup. static void RecordUsbPrinterSetupSource(UsbPrinterSetupSource source); + // Test method to override the printer configurer for testing. + static void SetPrinterConfigurerForTesting( + std::unique_ptr<PrinterConfigurer> printer_configurer); + protected: PrinterConfigurer() = default;
diff --git a/chrome/browser/chromeos/sync/turn_sync_on_helper.cc b/chrome/browser/chromeos/sync/turn_sync_on_helper.cc new file mode 100644 index 0000000..c157e45 --- /dev/null +++ b/chrome/browser/chromeos/sync/turn_sync_on_helper.cc
@@ -0,0 +1,200 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/sync/turn_sync_on_helper.h" + +#include <utility> + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/sync/profile_sync_service_factory.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/browser_tabstrip.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" +#include "chrome/browser/unified_consent/unified_consent_service_factory.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/webui_url_constants.h" +#include "chromeos/constants/chromeos_features.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/sync/driver/sync_service.h" +#include "components/sync/driver/sync_user_settings.h" +#include "components/unified_consent/unified_consent_service.h" +#include "components/user_manager/user.h" +#include "components/user_manager/user_manager.h" + +namespace { + +// Whether the user has seen the sync first-run dialog. They might or might not +// have consented to sync. Other platforms don't need this because they can +// infer the no-consent state from IdentityManager::GetPrimaryAccount() +// returning an empty account, but on Chrome OS the primary user isn't allowed +// to sign out. +const char kSyncFirstRunCompleted[] = "sync.first_run_completed"; + +// Ensures a tabbed browser is visible and returns it. +Browser* EnsureBrowser(Browser* browser, Profile* profile) { + if (!browser) { + // The user has closed the browser that we used previously. Grab the most + // recently active browser or else create a new one. + browser = chrome::FindLastActiveWithProfile(profile); + if (!browser) { + // The browser deletes itself. + browser = Browser::Create( + Browser::CreateParams(profile, /*user_gesture=*/true)); + chrome::AddTabAt(browser, GURL(), /*index=*/-1, /*foreground=*/true); + } + } + browser->window()->Show(); + return browser; +} + +// Production delegate with real UI. +class DelegateImpl : public TurnSyncOnHelper::Delegate { + public: + DelegateImpl() = default; + ~DelegateImpl() override = default; + + void ShowSyncConfirmation(Profile* profile, Browser* browser) override { + browser = EnsureBrowser(browser, profile); + browser->signin_view_controller()->ShowModalSyncConfirmationDialog(browser); + } + + void ShowSyncSettings(Profile* profile, Browser* browser) override { + browser = EnsureBrowser(browser, profile); + chrome::ShowSettingsSubPage(browser, chrome::kSyncSetupSubPage); + } +}; + +} // namespace + +TurnSyncOnHelper::TurnSyncOnHelper(Profile* profile) + : TurnSyncOnHelper(profile, std::make_unique<DelegateImpl>()) {} + +TurnSyncOnHelper::TurnSyncOnHelper(Profile* profile, + std::unique_ptr<Delegate> delegate) + : profile_(profile), delegate_(std::move(delegate)) { + DCHECK(profile_); + DCHECK(chromeos::features::IsSplitSettingsSyncEnabled()); + BrowserList::AddObserver(this); +} + +TurnSyncOnHelper::~TurnSyncOnHelper() { + BrowserList::RemoveObserver(this); +} + +// static +void TurnSyncOnHelper::RegisterProfilePrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(kSyncFirstRunCompleted, false); +} + +void TurnSyncOnHelper::OnBrowserSetLastActive(Browser* browser) { + // Tabbed browser window (not an app). + if (!browser->is_type_normal()) + return; + + // Not guest or incognito window. + if (browser->profile()->IsOffTheRecord()) + return; + + // Not skipping first-run. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + if (!command_line->HasSwitch(switches::kForceFirstRun) && + command_line->HasSwitch(switches::kNoFirstRun)) { + return; + } + + // Not previously completed. + if (profile_->GetPrefs()->GetBoolean(kSyncFirstRunCompleted)) + return; + + browser_ = browser; + BrowserList::RemoveObserver(this); + StartFlow(); +} + +void TurnSyncOnHelper::StartFlow() { + syncer::SyncService* sync_service = GetSyncService(); + // Abort if sync not allowed. + if (!sync_service) + return; + + // Record that the user has started the flow ("requested setup"). + sync_service->GetUserSettings()->SetSyncRequested(true); + + // Defer if sync engine is still starting up. + if (SyncStartupTracker::GetSyncServiceState(sync_service) == + SyncStartupTracker::SYNC_STARTUP_PENDING) { + sync_startup_tracker_ = + std::make_unique<SyncStartupTracker>(sync_service, this); + return; + } + + ShowSyncConfirmationUI(); +} + +void TurnSyncOnHelper::SyncStartupCompleted() { + DCHECK(sync_startup_tracker_); + sync_startup_tracker_.reset(); + ShowSyncConfirmationUI(); +} + +void TurnSyncOnHelper::SyncStartupFailed() { + DCHECK(sync_startup_tracker_); + sync_startup_tracker_.reset(); + ShowSyncConfirmationUI(); +} + +void TurnSyncOnHelper::ShowSyncConfirmationUI() { + // Register as an observer so OnSyncConfirmationUIClosed() will be called. + scoped_login_ui_service_observer_.Add( + LoginUIServiceFactory::GetForProfile(profile_)); + delegate_->ShowSyncConfirmation(profile_, browser_); +} + +void TurnSyncOnHelper::OnSyncConfirmationUIClosed( + LoginUIService::SyncConfirmationUIClosedResult result) { + FinishSyncSetup(result); + // This method can be called if the browser is closed from the shelf menu + // with the consent dialog open. Make sure we don't keep a deleted pointer. + browser_ = nullptr; +} + +void TurnSyncOnHelper::FinishSyncSetup( + LoginUIService::SyncConfirmationUIClosedResult result) { + unified_consent::UnifiedConsentService* consent_service = + UnifiedConsentServiceFactory::GetForProfile(profile_); + + switch (result) { + case LoginUIService::CONFIGURE_SYNC_FIRST: + if (consent_service) + consent_service->SetUrlKeyedAnonymizedDataCollectionEnabled(true); + delegate_->ShowSyncSettings(profile_, browser_); + break; + case LoginUIService::SYNC_WITH_DEFAULT_SETTINGS: { + syncer::SyncService* sync_service = GetSyncService(); + if (sync_service) { + sync_service->GetUserSettings()->SetFirstSetupComplete( + syncer::SyncFirstSetupCompleteSource::BASIC_FLOW); + } + if (consent_service) + consent_service->SetUrlKeyedAnonymizedDataCollectionEnabled(true); + break; + } + case LoginUIService::ABORT_SIGNIN: + // Chrome OS users stay signed in even if sync setup is cancelled. + break; + } + profile_->GetPrefs()->SetBoolean(kSyncFirstRunCompleted, true); +} + +syncer::SyncService* TurnSyncOnHelper::GetSyncService() { + return ProfileSyncServiceFactory::IsSyncAllowed(profile_) + ? ProfileSyncServiceFactory::GetForProfile(profile_) + : nullptr; +}
diff --git a/chrome/browser/chromeos/sync/turn_sync_on_helper.h b/chrome/browser/chromeos/sync/turn_sync_on_helper.h new file mode 100644 index 0000000..6f1b3ff --- /dev/null +++ b/chrome/browser/chromeos/sync/turn_sync_on_helper.h
@@ -0,0 +1,86 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_SYNC_TURN_SYNC_ON_HELPER_H_ +#define CHROME_BROWSER_CHROMEOS_SYNC_TURN_SYNC_ON_HELPER_H_ + +#include <memory> + +#include "base/scoped_observer.h" +#include "chrome/browser/sync/sync_startup_tracker.h" +#include "chrome/browser/ui/browser_list_observer.h" +#include "chrome/browser/ui/webui/signin/login_ui_service.h" + +class Browser; +class PrefRegistrySimple; +class Profile; + +namespace syncer { +class SyncService; +} // namespace syncer + +// Shows the browser sync consent dialog and turns on sync if the user consents. +// Similar to DiceTurnSyncOnHelper, but Chrome OS doesn't use DICE and doesn't +// allow the user to sign out. +// TODO(crbug.com/1036440): For development purposes we show the dialog +// immediately when the first browser window opens. Long-term the browser will +// open a page similar to chrome://welcome on first run. Once this browser +// first-run flow is implemented the BrowserListObserver can be removed. +class TurnSyncOnHelper : public SyncStartupTracker::Observer, + public LoginUIService::Observer, + public BrowserListObserver { + public: + // Delegate to stub out the UI for testing. + class Delegate { + public: + virtual ~Delegate() = default; + virtual void ShowSyncConfirmation(Profile* profile, Browser* browser) = 0; + virtual void ShowSyncSettings(Profile* profile, Browser* browser) = 0; + }; + // Uses the production delegate with real UI. + explicit TurnSyncOnHelper(Profile* profile); + TurnSyncOnHelper(Profile* profile, std::unique_ptr<Delegate> delegate); + ~TurnSyncOnHelper() override; + + TurnSyncOnHelper(const TurnSyncOnHelper&) = delete; + TurnSyncOnHelper& operator=(const TurnSyncOnHelper&) = delete; + + static void RegisterProfilePrefs(PrefRegistrySimple* registry); + + // BrowserListObserver: + void OnBrowserSetLastActive(Browser* browser) override; + + // SyncStartupTracker::Observer: + void SyncStartupCompleted() override; + void SyncStartupFailed() override; + + // LoginUIService::Observer: + void OnSyncConfirmationUIClosed( + LoginUIService::SyncConfirmationUIClosedResult result) override; + + private: + // Starts the setup flow. + void StartFlow(); + + // Displays the Sync confirmation UI. + // Note: If sync fails to start (e.g. sync is disabled by admin), the sync + // confirmation dialog will be updated accordingly. + void ShowSyncConfirmationUI(); + + // Handles the user input from the sync confirmation UI. + void FinishSyncSetup(LoginUIService::SyncConfirmationUIClosedResult result); + + // Returns the SyncService, or nullptr if sync is not allowed. + syncer::SyncService* GetSyncService(); + + Profile* const profile_; + std::unique_ptr<Delegate> delegate_; + Browser* browser_; + std::unique_ptr<SyncStartupTracker> sync_startup_tracker_; + + ScopedObserver<LoginUIService, LoginUIService::Observer> + scoped_login_ui_service_observer_{this}; +}; + +#endif // CHROME_BROWSER_CHROMEOS_SYNC_TURN_SYNC_ON_HELPER_H_
diff --git a/chrome/browser/chromeos/sync/turn_sync_on_helper_unittest.cc b/chrome/browser/chromeos/sync/turn_sync_on_helper_unittest.cc new file mode 100644 index 0000000..2a9d886 --- /dev/null +++ b/chrome/browser/chromeos/sync/turn_sync_on_helper_unittest.cc
@@ -0,0 +1,151 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/sync/turn_sync_on_helper.h" + +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/sync/profile_sync_service_factory.h" +#include "chrome/test/base/browser_with_test_window_test.h" +#include "chromeos/constants/chromeos_features.h" +#include "components/sync/driver/sync_service.h" +#include "components/sync/driver/sync_user_settings.h" +#include "components/sync/driver/test_sync_service.h" +#include "components/unified_consent/url_keyed_data_collection_consent_helper.h" + +using unified_consent::UrlKeyedDataCollectionConsentHelper; + +namespace { + +const char kSyncFirstRunCompleted[] = "sync.first_run_completed"; + +class TestDelegate : public TurnSyncOnHelper::Delegate { + public: + TestDelegate() = default; + ~TestDelegate() override = default; + + void ShowSyncConfirmation(Profile* profile, Browser* browser) override { + show_sync_confirmation_count_++; + } + + void ShowSyncSettings(Profile* profile, Browser* browser) override { + show_sync_settings_count_++; + } + + int show_sync_confirmation_count_ = 0; + int show_sync_settings_count_ = 0; +}; + +std::unique_ptr<KeyedService> BuildTestSyncService( + content::BrowserContext* context) { + return std::make_unique<syncer::TestSyncService>(); +} + +class TurnSyncOnHelperTest : public BrowserWithTestWindowTest { + public: + TurnSyncOnHelperTest() { + feature_list_.InitAndEnableFeature(chromeos::features::kSplitSettingsSync); + } + ~TurnSyncOnHelperTest() override = default; + + void SetUp() override { + BrowserWithTestWindowTest::SetUp(); + + sync_service_ = static_cast<syncer::TestSyncService*>( + ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( + profile(), base::BindRepeating(&BuildTestSyncService))); + // Reset the sync service to the pre-setup state. + sync_service_->SetFirstSetupComplete(false); + sync_service_->GetUserSettings()->SetSyncRequested(false); + } + + base::test::ScopedFeatureList feature_list_; + syncer::TestSyncService* sync_service_ = nullptr; +}; + +TEST_F(TurnSyncOnHelperTest, UserAcceptsDefaults) { + auto test_delegate = std::make_unique<TestDelegate>(); + TestDelegate* delegate = test_delegate.get(); + TurnSyncOnHelper helper(profile(), std::move(test_delegate)); + + // Simulate the first browser window becoming active. + helper.OnBrowserSetLastActive(browser()); + + // Sync confirmation dialog is shown + EXPECT_TRUE(sync_service_->GetUserSettings()->IsSyncRequested()); + EXPECT_EQ(1, delegate->show_sync_confirmation_count_); + + // Simulate the user clicking "Yes, I'm in". + helper.OnSyncConfirmationUIClosed(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS); + + // Setup is complete and we didn't show settings. + EXPECT_TRUE(sync_service_->GetUserSettings()->IsFirstSetupComplete()); + EXPECT_EQ(0, delegate->show_sync_settings_count_); +} + +TEST_F(TurnSyncOnHelperTest, UserClicksSettings) { + auto test_delegate = std::make_unique<TestDelegate>(); + TestDelegate* delegate = test_delegate.get(); + TurnSyncOnHelper helper(profile(), std::move(test_delegate)); + + // Simulate the first browser window becoming active. + helper.OnBrowserSetLastActive(browser()); + + // Simulate the user clicking "Settings". + helper.OnSyncConfirmationUIClosed(LoginUIService::CONFIGURE_SYNC_FIRST); + + // Setup is not complete and we opened settings. + EXPECT_FALSE(sync_service_->GetUserSettings()->IsFirstSetupComplete()); + EXPECT_EQ(1, delegate->show_sync_settings_count_); +} + +TEST_F(TurnSyncOnHelperTest, UserClicksCancel) { + auto test_delegate = std::make_unique<TestDelegate>(); + TestDelegate* delegate = test_delegate.get(); + TurnSyncOnHelper helper(profile(), std::move(test_delegate)); + + // Simulate the first browser window becoming active. + helper.OnBrowserSetLastActive(browser()); + + // Simulate the user clicking "Cancel". + helper.OnSyncConfirmationUIClosed(LoginUIService::ABORT_SIGNIN); + + // Setup is not complete and we didn't show settings. + EXPECT_FALSE(sync_service_->GetUserSettings()->IsFirstSetupComplete()); + EXPECT_EQ(0, delegate->show_sync_settings_count_); +} + +TEST_F(TurnSyncOnHelperTest, UserPreviouslySetUpSync) { + // Simulate a user who previously completed the first-run flow. + profile()->GetPrefs()->SetBoolean(kSyncFirstRunCompleted, true); + + auto test_delegate = std::make_unique<TestDelegate>(); + TestDelegate* delegate = test_delegate.get(); + TurnSyncOnHelper helper(profile(), std::move(test_delegate)); + + // Simulate the first browser window becoming active. + helper.OnBrowserSetLastActive(browser()); + + // Sync confirmation dialog isn't shown. + EXPECT_EQ(0, delegate->show_sync_confirmation_count_); +} + +TEST_F(TurnSyncOnHelperTest, UrlKeyedMetricsConsent) { + // User is not consented by default. + std::unique_ptr<UrlKeyedDataCollectionConsentHelper> consent_helper = + UrlKeyedDataCollectionConsentHelper:: + NewAnonymizedDataCollectionConsentHelper( + profile()->GetPrefs(), + ProfileSyncServiceFactory::GetForProfile(profile())); + ASSERT_FALSE(consent_helper->IsEnabled()); + + // Simulate user consenting to sync. + TurnSyncOnHelper helper(profile(), std::make_unique<TestDelegate>()); + helper.OnBrowserSetLastActive(browser()); + helper.OnSyncConfirmationUIClosed(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS); + + // URL keyed metrics are enabled. + EXPECT_TRUE(consent_helper->IsEnabled()); +} + +} // namespace
diff --git a/chrome/browser/component_updater/soda_component_installer.cc b/chrome/browser/component_updater/soda_component_installer.cc new file mode 100644 index 0000000..8009a6d --- /dev/null +++ b/chrome/browser/component_updater/soda_component_installer.cc
@@ -0,0 +1,131 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/component_updater/soda_component_installer.h" + +#include "base/bind.h" +#include "base/files/file_util.h" +#include "base/task/post_task.h" +#include "chrome/browser/browser_process.h" +#include "chrome/common/pref_names.h" +#include "components/component_updater/component_updater_service.h" +#include "components/crx_file/id_util.h" +#include "components/update_client/update_client_errors.h" +#include "content/public/browser/browser_task_traits.h" +#include "crypto/sha2.h" + +using content::BrowserThread; + +namespace component_updater { + +namespace { + +// The SHA256 of the SubjectPublicKeyInfo used to sign the archive. +// TODO(evliu): The SODA library isn't ready to be exposed to the public yet so +// we should not check in the SHA256. +const uint8_t kSODAPublicKeySHA256[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +const base::FilePath::CharType kSODABinaryFileName[] = + FILE_PATH_LITERAL("SODAFiles/libsoda.experimental.so"); + +static_assert(base::size(kSODAPublicKeySHA256) == crypto::kSHA256Length, + "Wrong hash length"); + +const char kSODAManifestName[] = "SODA Library"; + +} // namespace + +SODAComponentInstallerPolicy::SODAComponentInstallerPolicy( + const OnSODAComponentReadyCallback& callback) + : on_component_ready_callback_(callback) {} + +SODAComponentInstallerPolicy::~SODAComponentInstallerPolicy() = default; + +const std::string SODAComponentInstallerPolicy::GetExtensionId() { + return crx_file::id_util::GenerateIdFromHash(kSODAPublicKeySHA256, + sizeof(kSODAPublicKeySHA256)); +} + +void SODAComponentInstallerPolicy::UpdateSODAComponentOnDemand() { + const std::string crx_id = + component_updater::SODAComponentInstallerPolicy::GetExtensionId(); + g_browser_process->component_updater()->GetOnDemandUpdater().OnDemandUpdate( + crx_id, component_updater::OnDemandUpdater::Priority::FOREGROUND, + base::BindOnce([](update_client::Error error) { + if (error != update_client::Error::NONE && + error != update_client::Error::UPDATE_IN_PROGRESS) + LOG(ERROR) << "On demand update of the SODA component failed " + "with error: " + << static_cast<int>(error); + })); +} + +bool SODAComponentInstallerPolicy::VerifyInstallation( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) const { + return base::PathExists(install_dir.Append(kSODABinaryFileName)); +} + +bool SODAComponentInstallerPolicy::SupportsGroupPolicyEnabledComponentUpdates() + const { + return true; +} + +bool SODAComponentInstallerPolicy::RequiresNetworkEncryption() const { + return false; +} + +update_client::CrxInstaller::Result +SODAComponentInstallerPolicy::OnCustomInstall( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) { + return update_client::CrxInstaller::Result(0); // Nothing custom here. +} + +void SODAComponentInstallerPolicy::OnCustomUninstall() {} + +void SODAComponentInstallerPolicy::ComponentReady( + const base::Version& version, + const base::FilePath& install_dir, + std::unique_ptr<base::DictionaryValue> manifest) { + VLOG(1) << "Component ready, version " << version.GetString() << " in " + << install_dir.value(); + + on_component_ready_callback_.Run(install_dir); +} + +base::FilePath SODAComponentInstallerPolicy::GetRelativeInstallDir() const { + return base::FilePath(FILE_PATH_LITERAL("SODA")); +} + +void SODAComponentInstallerPolicy::GetHash(std::vector<uint8_t>* hash) const { + hash->assign(kSODAPublicKeySHA256, + kSODAPublicKeySHA256 + base::size(kSODAPublicKeySHA256)); +} + +std::string SODAComponentInstallerPolicy::GetName() const { + return kSODAManifestName; +} + +update_client::InstallerAttributes +SODAComponentInstallerPolicy::GetInstallerAttributes() const { + return update_client::InstallerAttributes(); +} + +std::vector<std::string> SODAComponentInstallerPolicy::GetMimeTypes() const { + return std::vector<std::string>(); +} + +void RegisterSODAComponent(ComponentUpdateService* cus, + PrefService* prefs, + base::OnceClosure callback) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + // TODO(evliu): The SODA library isn't ready to be exposed to the public yet + // we should not register the component. + NOTIMPLEMENTED(); +} +} // namespace component_updater
diff --git a/chrome/browser/component_updater/soda_component_installer.h b/chrome/browser/component_updater/soda_component_installer.h new file mode 100644 index 0000000..07e3730 --- /dev/null +++ b/chrome/browser/component_updater/soda_component_installer.h
@@ -0,0 +1,66 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_COMPONENT_UPDATER_SODA_COMPONENT_INSTALLER_H_ +#define CHROME_BROWSER_COMPONENT_UPDATER_SODA_COMPONENT_INSTALLER_H_ + +#include <string> + +#include "components/component_updater/component_installer.h" +#include "components/prefs/pref_service.h" +#include "components/update_client/update_client.h" + +namespace component_updater { + +// Success callback to be run after the component is downloaded. +using OnSODAComponentReadyCallback = + base::Callback<void(const base::FilePath&)>; + +class SODAComponentInstallerPolicy : public ComponentInstallerPolicy { + public: + explicit SODAComponentInstallerPolicy( + const OnSODAComponentReadyCallback& callback); + ~SODAComponentInstallerPolicy() override; + + SODAComponentInstallerPolicy(const SODAComponentInstallerPolicy&) = delete; + SODAComponentInstallerPolicy& operator=(const SODAComponentInstallerPolicy&) = + delete; + + static const std::string GetExtensionId(); + static void UpdateSODAComponentOnDemand(); + + private: + FRIEND_TEST_ALL_PREFIXES(SODAComponentInstallerTest, + ComponentReady_CallsLambda); + + // The following methods override ComponentInstallerPolicy. + bool SupportsGroupPolicyEnabledComponentUpdates() const override; + bool RequiresNetworkEncryption() const override; + update_client::CrxInstaller::Result OnCustomInstall( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) override; + void OnCustomUninstall() override; + bool VerifyInstallation(const base::DictionaryValue& manifest, + const base::FilePath& install_dir) const override; + void ComponentReady(const base::Version& version, + const base::FilePath& install_dir, + std::unique_ptr<base::DictionaryValue> manifest) override; + base::FilePath GetRelativeInstallDir() const override; + void GetHash(std::vector<uint8_t>* hash) const override; + std::string GetName() const override; + update_client::InstallerAttributes GetInstallerAttributes() const override; + std::vector<std::string> GetMimeTypes() const override; + + OnSODAComponentReadyCallback on_component_ready_callback_; +}; + +// Call once during startup to make the component update service aware of +// the File Type Policies component. +void RegisterSODAComponent(ComponentUpdateService* cus, + PrefService* prefs, + base::OnceClosure callback); + +} // namespace component_updater + +#endif // CHROME_BROWSER_COMPONENT_UPDATER_SODA_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/soda_component_installer_unittest.cc b/chrome/browser/component_updater/soda_component_installer_unittest.cc new file mode 100644 index 0000000..983fe7ba --- /dev/null +++ b/chrome/browser/component_updater/soda_component_installer_unittest.cc
@@ -0,0 +1,38 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/component_updater/soda_component_installer.h" + +#include "base/files/file_path.h" +#include "base/test/bind_test_util.h" +#include "base/version.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace component_updater { + +class SODAComponentInstallerTest : public ::testing::Test { + public: + SODAComponentInstallerTest() + : fake_install_dir_(FILE_PATH_LITERAL("base/install/dir/")), + fake_version_("0.0.1") {} + + protected: + base::FilePath fake_install_dir_; + base::Version fake_version_; +}; + +TEST_F(SODAComponentInstallerTest, ComponentReady_CallsLambda) { + base::FilePath given_path; + OnSODAComponentReadyCallback lambda = base::BindLambdaForTesting( + [&](const base::FilePath& path) { given_path = path; }); + + SODAComponentInstallerPolicy policy(std::move(lambda)); + + policy.ComponentReady(fake_version_, fake_install_dir_, + std::make_unique<base::DictionaryValue>()); + + ASSERT_EQ(fake_install_dir_, given_path); +} + +} // namespace component_updater
diff --git a/chrome/browser/download/android/BUILD.gn b/chrome/browser/download/android/BUILD.gn index da1ddbdf..f5eee66 100644 --- a/chrome/browser/download/android/BUILD.gn +++ b/chrome/browser/download/android/BUILD.gn
@@ -5,7 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/download/DirectoryOption.java", "java/src/org/chromium/chrome/browser/download/DownloadConstants.java", "java/src/org/chromium/chrome/browser/download/DownloadDirectoryProvider.java", @@ -13,9 +13,9 @@ "java/src/org/chromium/chrome/browser/download/DownloadFilter.java", "java/src/org/chromium/chrome/browser/download/DownloadInfo.java", "java/src/org/chromium/chrome/browser/download/DownloadManagerBridge.java", + "java/src/org/chromium/chrome/browser/download/DownloadStartupUtils.java", "java/src/org/chromium/chrome/browser/download/DownloadStatus.java", "java/src/org/chromium/chrome/browser/download/MediaStoreHelper.java", - "java/src/org/chromium/chrome/browser/download/DownloadStartupUtils.java", "java/src/org/chromium/chrome/browser/download/MimeUtils.java", "java/src/org/chromium/chrome/browser/download/UriUtils.java", ] @@ -45,9 +45,9 @@ android_library("download_java_tests") { testonly = true - java_files = [ - "javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java", + sources = [ "javatests/src/org/chromium/chrome/browser/download/DownloadFileProviderTest.java", + "javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java", ] deps = [
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm b/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm index 4b17fc7..68d2846 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm +++ b/chrome/browser/extensions/api/enterprise_reporting_private/device_info_fetcher_mac.mm
@@ -47,14 +47,13 @@ enterprise_reporting_private::SettingValue GetScreenlockSecured() { CFStringRef screen_saver_application = CFSTR("com.apple.screensaver"); CFStringRef ask_for_password_key = CFSTR("askForPassword"); - - base::ScopedCFTypeRef<CFTypeRef> ask_for_password(CFPreferencesCopyAppValue( - ask_for_password_key, screen_saver_application)); + base::ScopedCFTypeRef<CFNumberRef> ask_for_password( + base::mac::CFCastStrict<CFNumberRef>(CFPreferencesCopyAppValue( + ask_for_password_key, screen_saver_application))); int screen_lock_enabled = 0; - if (!ask_for_password || - !CFNumberGetValue(base::mac::CFCastStrict<CFNumberRef>(ask_for_password), - kCFNumberIntType, &screen_lock_enabled)) { + if (!ask_for_password || !CFNumberGetValue(ask_for_password, kCFNumberIntType, + &screen_lock_enabled)) { return enterprise_reporting_private::SETTING_VALUE_UNKNOWN; }
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index 3337e8e..6f0fe968 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -336,6 +336,8 @@ settings_api::PrefType::PREF_TYPE_STRING; (*s_whitelist)[::prefs::kAccessibilityCaptionsBackgroundOpacity] = settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_whitelist)[::prefs::kLiveCaptionEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; #if defined(OS_CHROMEOS) // Accounts / Users / People.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 1460c119..fbc3c4a9 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -890,7 +890,7 @@ { "name": "enable-advanced-ppd-attributes", "owners": [ "vkuzkokov", "skau" ], - "expiry_milestone": 80 + "expiry_milestone": 83 }, { "name": "enable-ambient-authentication-in-guest-session", @@ -2395,6 +2395,11 @@ "expiry_milestone": 82 }, { + "name": "homepage-settings-ui-conversion", + "owners": [ "wenyufu", "chrome-android-app@chromium.org" ], + "expiry_milestone": 84 + }, + { "name": "http-auth-committed-interstitials", "owners": [ "jdeblasio", "estark" ], "expiry_milestone": 77
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 1f08ecb..764ec583 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2599,6 +2599,13 @@ "Enable enterprice policy HomepageLocation, a rule of configure the home " "page URL"; +const char kHomepageSettingsUIConversionName[] = + "Enable new homepage setting UI"; +const char kHomepageSettingsUIConversionDescription[] = + "Enable new homepage setting UI, which allows user set up customized " + "homepage URL through a radio button group, and add promo box on NTP " + "if homepage is not enabled."; + const char kInterestFeedNotificationsName[] = "Interest Feed Notifications"; const char kInterestFeedNotificationsDescription[] = "Show notifications for some suggested content from the interest feed. "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 01074230..3f9c18bc 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1542,6 +1542,9 @@ extern const char kHomepageLocationName[]; extern const char kHomepageLocationDescription[]; +extern const char kHomepageSettingsUIConversionName[]; +extern const char kHomepageSettingsUIConversionDescription[]; + extern const char kInterestFeedNotificationsName[]; extern const char kInterestFeedNotificationsDescription[];
diff --git a/chrome/browser/image_editor/internal/BUILD.gn b/chrome/browser/image_editor/internal/BUILD.gn index 1eadbac..116179d 100644 --- a/chrome/browser/image_editor/internal/BUILD.gn +++ b/chrome/browser/image_editor/internal/BUILD.gn
@@ -7,7 +7,9 @@ # Upstream ImageEditor implementation which does nothing. Actual implementation # lives downstream. android_library("java") { - java_files = [ "android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorDialogCoordinatorImpl.java" ] + sources = [ + "android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorDialogCoordinatorImpl.java", + ] deps = [ "//chrome/browser/image_editor/public:java",
diff --git a/chrome/browser/image_editor/public/BUILD.gn b/chrome/browser/image_editor/public/BUILD.gn index 5b76664..87f6881 100644 --- a/chrome/browser/image_editor/public/BUILD.gn +++ b/chrome/browser/image_editor/public/BUILD.gn
@@ -5,8 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ - "android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorCoordinator.java", + sources = [ "android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorDialogCoordinator.java", ]
diff --git a/chrome/browser/image_editor/public/android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorCoordinator.java b/chrome/browser/image_editor/public/android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorCoordinator.java deleted file mode 100644 index 7609a0e..0000000 --- a/chrome/browser/image_editor/public/android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorCoordinator.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.image_editor; - -/** - * Interface to interact with the image editor activity. - */ -public interface ImageEditorCoordinator {}
diff --git a/chrome/browser/image_fetcher/BUILD.gn b/chrome/browser/image_fetcher/BUILD.gn index bf16ee4..77877e0 100644 --- a/chrome/browser/image_fetcher/BUILD.gn +++ b/chrome/browser/image_fetcher/BUILD.gn
@@ -14,11 +14,11 @@ "//third_party/gif_player:gif_player_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java", + "android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java", "android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridge.java", "android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactory.java", - "android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java", "android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java", "android/java/src/org/chromium/chrome/browser/image_fetcher/NetworkImageFetcher.java", ]
diff --git a/chrome/browser/importer/profile_writer_unittest.cc b/chrome/browser/importer/profile_writer_unittest.cc index 40510e8..5ad0efc 100644 --- a/chrome/browser/importer/profile_writer_unittest.cc +++ b/chrome/browser/importer/profile_writer_unittest.cc
@@ -45,6 +45,22 @@ ProfileWriterTest() {} ~ProfileWriterTest() override {} + void SetUp() override { + DCHECK(profile_dir_.CreateUniqueTempDir()); + TestingProfile::Builder profile_builder; + profile_builder.SetPath(profile_dir_.GetPath()); + profile_ = profile_builder.Build(); + + DCHECK(second_profile_dir_.CreateUniqueTempDir()); + TestingProfile::Builder second_profile_builder; + second_profile_builder.SetPath(second_profile_dir_.GetPath()); + second_profile_ = second_profile_builder.Build(); + } + + TestingProfile* profile() { return profile_.get(); } + + TestingProfile* second_profile() { return second_profile_.get(); } + // Create test bookmark entries to be added to ProfileWriter to // simulate bookmark importing. void CreateImportedBookmarksEntries() { @@ -133,31 +149,39 @@ bookmarks_.push_back(entry); } + // Profile directories that outlive |task_environment_| are needed because + // CreateHistoryService/CreateBookmarkModel use the directory to host + // databases. See https://crbug.com/546640 for more details. + base::ScopedTempDir profile_dir_; + base::ScopedTempDir second_profile_dir_; + content::BrowserTaskEnvironment task_environment_; + std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<TestingProfile> second_profile_; + DISALLOW_COPY_AND_ASSIGN(ProfileWriterTest); }; // Add bookmarks via ProfileWriter to profile1 when profile2 also exists. TEST_F(ProfileWriterTest, CheckBookmarksWithMultiProfile) { - TestingProfile profile2; - profile2.CreateBookmarkModel(true); + second_profile()->CreateBookmarkModel(true); BookmarkModel* bookmark_model2 = - BookmarkModelFactory::GetForBrowserContext(&profile2); + BookmarkModelFactory::GetForBrowserContext(second_profile()); bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model2); bookmarks::AddIfNotBookmarked( bookmark_model2, GURL("http://www.bing.com"), base::ASCIIToUTF16("Bing")); - TestingProfile profile1; - profile1.CreateBookmarkModel(true); + + profile()->CreateBookmarkModel(true); CreateImportedBookmarksEntries(); BookmarkModel* bookmark_model1 = - BookmarkModelFactory::GetForBrowserContext(&profile1); + BookmarkModelFactory::GetForBrowserContext(profile()); bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model1); scoped_refptr<TestProfileWriter> profile_writer( - new TestProfileWriter(&profile1)); + new TestProfileWriter(profile())); profile_writer->AddBookmarks(bookmarks_, base::ASCIIToUTF16("Imported from Firefox")); @@ -172,16 +196,15 @@ // Verify that bookmarks are duplicated when added twice. TEST_F(ProfileWriterTest, CheckBookmarksAfterWritingDataTwice) { - TestingProfile profile; - profile.CreateBookmarkModel(true); + profile()->CreateBookmarkModel(true); CreateImportedBookmarksEntries(); BookmarkModel* bookmark_model = - BookmarkModelFactory::GetForBrowserContext(&profile); + BookmarkModelFactory::GetForBrowserContext(profile()); bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); scoped_refptr<TestProfileWriter> profile_writer( - new TestProfileWriter(&profile)); + new TestProfileWriter(profile())); profile_writer->AddBookmarks(bookmarks_, base::ASCIIToUTF16("Imported from Firefox")); std::vector<UrlAndTitle> bookmarks_record; @@ -209,28 +232,26 @@ // Verify that history entires are not duplicated when added twice. TEST_F(ProfileWriterTest, CheckHistoryAfterWritingDataTwice) { - TestingProfile profile; - ASSERT_TRUE(profile.CreateHistoryService(true, false)); - profile.BlockUntilHistoryProcessesPendingRequests(); + ASSERT_TRUE(profile()->CreateHistoryService(true, false)); + profile()->BlockUntilHistoryProcessesPendingRequests(); CreateHistoryPageEntries(); scoped_refptr<TestProfileWriter> profile_writer( - new TestProfileWriter(&profile)); + new TestProfileWriter(profile())); profile_writer->AddHistoryPage(pages_, history::SOURCE_FIREFOX_IMPORTED); - VerifyHistoryCount(&profile); + VerifyHistoryCount(profile()); size_t original_history_count = history_count_; history_count_ = 0; profile_writer->AddHistoryPage(pages_, history::SOURCE_FIREFOX_IMPORTED); - VerifyHistoryCount(&profile); + VerifyHistoryCount(profile()); EXPECT_EQ(original_history_count, history_count_); } TEST_F(ProfileWriterTest, AddKeywords) { - TestingProfile profile; - ASSERT_TRUE(profile.CreateHistoryService(true, false)); + ASSERT_TRUE(profile()->CreateHistoryService(true, false)); TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( - &profile, + profile(), base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor)); TemplateURLService::OwnedTemplateURLVector keywords; @@ -242,11 +263,11 @@ // This entry will not be added since the keyword contains spaces. keywords.push_back(CreateTemplateURL("key 3", "http://key3.com", "n3")); - auto profile_writer = base::MakeRefCounted<TestProfileWriter>(&profile); + auto profile_writer = base::MakeRefCounted<TestProfileWriter>(profile()); profile_writer->AddKeywords(std::move(keywords), false); TemplateURLService* turl_model = - TemplateURLServiceFactory::GetForProfile(&profile); + TemplateURLServiceFactory::GetForProfile(profile()); auto turls = turl_model->GetTemplateURLs(); EXPECT_EQ(turls.size(), 2u);
diff --git a/chrome/browser/media/cast_mirroring_service_host.h b/chrome/browser/media/cast_mirroring_service_host.h index 4cab8e2..ceb19fa 100644 --- a/chrome/browser/media/cast_mirroring_service_host.h +++ b/chrome/browser/media/cast_mirroring_service_host.h
@@ -18,7 +18,6 @@ #include "content/public/browser/media_stream_request.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/buildflags/buildflags.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h index 264523c..90c5301 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h +++ b/chrome/browser/media/router/providers/openscreen/network_service_quic_packet_writer.h
@@ -10,8 +10,6 @@ #include "base/macros.h" -#include "mojo/public/cpp/bindings/binding.h" - #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_packet_writer.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h"
diff --git a/chrome/browser/metrics/first_web_contents_profiler.cc b/chrome/browser/metrics/first_web_contents_profiler.cc index 9e48c4c..92bc9105 100644 --- a/chrome/browser/metrics/first_web_contents_profiler.cc +++ b/chrome/browser/metrics/first_web_contents_profiler.cc
@@ -6,7 +6,6 @@ #include <string> -#include "base/debug/dump_without_crashing.h" #include "base/location.h" #include "base/logging.h" #include "base/macros.h" @@ -105,6 +104,11 @@ return; } + // TODO(https://crbug.com/1035419): Ensure that all visible tabs start + // navigating before FirstWebContentsProfiler creation and always handle + // a top-level DidStartNavigation() as a new navigation. + // Upcoming CL: https://crrev.com/c/chromium/src/+/1976500 + if (first_navigation_id_ != kInvalidNavigationId) { // Abandon if this is not the first observed top-level navigation. DCHECK_NE(first_navigation_id_, navigation_handle->GetNavigationId()); @@ -148,19 +152,6 @@ } else if (first_navigation_id_ != navigation_handle->GetNavigationId()) { // Abandon if this is not the first observed top-level navigation. FinishedCollectingMetrics(FinishReason::kAbandonNewNavigation); - - // TODO(https://crbug.com/1027947): If FirstWebContentsProfiler is created - // after 2 DidStartNavigation(), but before the 2 corresponding - // DidFinishNavigation(), this condition will be entered on the 2nd - // DidFinishNavigation(). Also, if FirstWebContentsProfiler is created after - // 1 DidStartNavigation() but before another DidStartNavigation() and 2 - // DidFinishNavigation(), this condition will be entered for one of the 2 - // DidFinishNavigation(). These cases aren't expected, but a fuzzer suggests - // that they do happen. The DumpWithoutCrashing() below will allow us to - // determine whether this happens in the wild. Remove it once the problem is - // understood. - base::debug::DumpWithoutCrashing(); - return; }
diff --git a/chrome/browser/notifications/chime/android/BUILD.gn b/chrome/browser/notifications/chime/android/BUILD.gn index 53fe51cab..71e47146 100644 --- a/chrome/browser/notifications/chime/android/BUILD.gn +++ b/chrome/browser/notifications/chime/android/BUILD.gn
@@ -5,7 +5,9 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ "java/src/org/chromium/chrome/browser/notifications/chime/ChimeSession.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/notifications/chime/ChimeSession.java", + ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/chrome/browser/permissions/permission_context_base_unittest.cc b/chrome/browser/permissions/permission_context_base_unittest.cc index f9162201..ff0f08d8 100644 --- a/chrome/browser/permissions/permission_context_base_unittest.cc +++ b/chrome/browser/permissions/permission_context_base_unittest.cc
@@ -248,11 +248,11 @@ 0, 1); #if defined(OS_ANDROID) histograms.ExpectUniqueSample( - "Permissions.Prompt.Disposition.ModalDialog", + "Permissions.Action.WithDisposition.ModalDialog", static_cast<int>(action.value()), 1); #else histograms.ExpectUniqueSample( - "Permissions.Prompt.Disposition.AnchoredBubble", + "Permissions.Action.WithDisposition.AnchoredBubble", static_cast<int>(action.value()), 1); #endif }
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc index 1dd216db..ece9ff4 100644 --- a/chrome/browser/permissions/permission_uma_util.cc +++ b/chrome/browser/permissions/permission_uma_util.cc
@@ -358,7 +358,7 @@ #endif } - base::UmaHistogramEnumeration("Permissions.Prompt.Disposition." + + base::UmaHistogramEnumeration("Permissions.Action.WithDisposition." + GetPromptDispositionString(ui_disposition), permission_action, PermissionAction::NUM); }
diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn index 72651ff..7241eb1 100644 --- a/chrome/browser/preferences/BUILD.gn +++ b/chrome/browser/preferences/BUILD.gn
@@ -5,7 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ + sources = [ "android/java/src/org/chromium/chrome/browser/preferences/BaseChromePreferenceKeyChecker.java", "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker.java", "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java", @@ -39,7 +39,7 @@ # Skip platform checks since Robolectric depends on requires_android targets. bypass_platform_checks = true testonly = true - java_files = [ + sources = [ "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeyCheckerTest.java", "android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeysTest.java", "android/java/src/org/chromium/chrome/browser/preferences/KeyPrefixTest.java",
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc index 652d217..171a3b1 100644 --- a/chrome/browser/profiles/profile.cc +++ b/chrome/browser/profiles/profile.cc
@@ -184,6 +184,8 @@ std::string()); registry->RegisterStringPref(prefs::kAccessibilityCaptionsTextShadow, std::string()); + registry->RegisterBooleanPref(prefs::kLiveCaptionEnabled, false); + registry->RegisterFilePathPref(prefs::kSODAPath, base::FilePath()); #if !defined(OS_ANDROID) registry->RegisterDictionaryPref(prefs::kPartitionDefaultZoomLevel); registry->RegisterDictionaryPref(prefs::kPartitionPerHostZoomLevels);
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc index 11567c0..b29f9bd 100644 --- a/chrome/browser/referrer_policy_browsertest.cc +++ b/chrome/browser/referrer_policy_browsertest.cc
@@ -8,6 +8,8 @@ #include "base/command_line.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "base/synchronization/lock.h" +#include "base/thread_annotations.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" @@ -67,6 +69,7 @@ // currently, (See the comment on RequestCheck, below.) virtual void OnServerIncomingRequest( const net::test_server::HttpRequest& request) { + base::AutoLock lock(check_on_requests_lock_); if (!check_on_requests_) return; @@ -217,8 +220,10 @@ base::UTF16ToASCII(expected_title) .substr(base::StringPiece("Referrer is ").size()); } + base::ReleasableAutoLock releaseable_lock(&check_on_requests_lock_); check_on_requests_ = RequestCheck{ expected_referrer_value, "/referrer_policy/referrer-policy-log.html"}; + releaseable_lock.Release(); // Watch for all possible outcomes to avoid timeouts if something breaks. AddAllPossibleTitles(start_url, &title_watcher); @@ -260,6 +265,7 @@ EXPECT_EQ(expected_referrer_policy, tab->GetController().GetVisibleEntry()->GetReferrer().policy); + base::AutoLock lock(check_on_requests_lock_); check_on_requests_.reset(); return start_url; @@ -290,7 +296,10 @@ std::string expected_spec; std::string destination_url_to_match; }; - base::Optional<RequestCheck> check_on_requests_; + + base::Lock check_on_requests_lock_; + base::Optional<RequestCheck> check_on_requests_ + GUARDED_BY(check_on_requests_lock_); }; // The basic behavior of referrer policies is covered by layout tests in @@ -872,6 +881,7 @@ content::WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); + base::ReleasableAutoLock lock(&check_on_requests_lock_); check_on_requests_ = RequestCheck{"", "/referrer_policy/logo.gif"}; switch (expectation) { case ReferrerPolicyTest::EXPECT_EMPTY_REFERRER: @@ -884,6 +894,7 @@ check_on_requests_->expected_spec = start_url.GetWithEmptyPath().spec(); break; } + lock.Release(); // set by referrer-policy-subresource.html JS after the embedded image loads base::string16 expected_title(base::ASCIIToUTF16("loaded"));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sw.xtb index 58625b5..2e896de 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/strings/chromevox_strings_sw.xtb
@@ -1239,6 +1239,6 @@ <translation id="962913030769097253">Kichwa cha ngazi ya 1 kinachofuata</translation> <translation id="966588271015727539">Chagua onyesho la braille ya bluetooth</translation> <translation id="973955474346881951">Washa/Zima hali ya kunata</translation> -<translation id="976849232629612000">Hakuna vipengee.</translation> +<translation id="976849232629612000">Hakuna chochote.</translation> <translation id="992256792861109788">Waridi</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/resources/components/components.js b/chrome/browser/resources/components/components.js index 0eee030..f50d4b3 100644 --- a/chrome/browser/resources/components/components.js +++ b/chrome/browser/resources/components/components.js
@@ -110,6 +110,13 @@ const filteredComponents = currentComponentsData.filter(function(entry) { return entry.id === id; }); + + // A component may be added from another page so the status and version + // should only be updated if the component is listed on this page. + if (filteredComponents.length === 0) { + return; + } + const component = filteredComponents[0]; const status = eventArgs['event'];
diff --git a/chrome/browser/resources/extensions/detail_view.html b/chrome/browser/resources/extensions/detail_view.html index 6f63a2a..a96f27f 100644 --- a/chrome/browser/resources/extensions/detail_view.html +++ b/chrome/browser/resources/extensions/detail_view.html
@@ -167,7 +167,7 @@ $i18n{itemReload} </cr-button> </template> - <cr-toggle id="enable-toggle" + <cr-toggle id="enableToggle" aria-label$="[[appOrExtension( data.type, '$i18nPolymer{appEnabled}',
diff --git a/chrome/browser/resources/extensions/detail_view.js b/chrome/browser/resources/extensions/detail_view.js index 56e88c7..c07fcf85 100644 --- a/chrome/browser/resources/extensions/detail_view.js +++ b/chrome/browser/resources/extensions/detail_view.js
@@ -237,7 +237,7 @@ /** @private */ onEnableChange_: function() { - this.delegate.setItemEnabled(this.data.id, this.$['enable-toggle'].checked); + this.delegate.setItemEnabled(this.data.id, this.$.enableToggle.checked); }, /**
diff --git a/chrome/browser/resources/extensions/item.html b/chrome/browser/resources/extensions/item.html index aa60462..c4f300cf 100644 --- a/chrome/browser/resources/extensions/item.html +++ b/chrome/browser/resources/extensions/item.html
@@ -311,7 +311,7 @@ $i18n{itemReload} </cr-button> </template> - <cr-toggle id="enable-toggle" + <cr-toggle id="enableToggle" aria-label$="[[appOrExtension( data.type, '$i18nPolymer{appEnabled}',
diff --git a/chrome/browser/resources/extensions/item.js b/chrome/browser/resources/extensions/item.js index c7f99e3..1795f59c 100644 --- a/chrome/browser/resources/extensions/item.js +++ b/chrome/browser/resources/extensions/item.js
@@ -206,7 +206,7 @@ /** @private */ onEnableChange_: function() { - this.delegate.setItemEnabled(this.data.id, this.$['enable-toggle'].checked); + this.delegate.setItemEnabled(this.data.id, this.$.enableToggle.checked); }, /** @private */
diff --git a/chrome/browser/resources/extensions/service.js b/chrome/browser/resources/extensions/service.js index 91dcb45..c49c474a 100644 --- a/chrome/browser/resources/extensions/service.js +++ b/chrome/browser/resources/extensions/service.js
@@ -191,6 +191,7 @@ if (this.isDeleting_) { return; } + chrome.metricsPrivate.recordUserAction('Extensions.RemoveExtensionClick'); this.isDeleting_ = true; chrome.management.uninstall(id, {showConfirmDialog: true}, () => { // The "last error" was almost certainly the user canceling the dialog. @@ -203,6 +204,9 @@ /** @override */ setItemEnabled(id, isEnabled) { + chrome.metricsPrivate.recordUserAction( + isEnabled ? 'Extensions.ExtensionEnabled' : + 'Extensions.ExtensionDisabled'); chrome.management.setEnabled(id, isEnabled); }
diff --git a/chrome/browser/resources/settings/about_page/BUILD.gn b/chrome/browser/resources/settings/about_page/BUILD.gn index 41910e9..783647a 100644 --- a/chrome/browser/resources/settings/about_page/BUILD.gn +++ b/chrome/browser/resources/settings/about_page/BUILD.gn
@@ -9,13 +9,6 @@ ":about_page", ":about_page_browser_proxy", ] - - if (is_chromeos) { - deps += [ - ":channel_switcher_dialog", - ":detailed_build_info", - ] - } } js_library("about_page") { @@ -23,8 +16,6 @@ ":about_page_browser_proxy", "..:lifetime_browser_proxy", "..:route", - "../settings_page:main_page_behavior", - "../settings_page:settings_animated_pages", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:i18n_behavior", "//ui/webui/resources/js:parse_html_subset", @@ -38,20 +29,3 @@ ] externs_list = [ "$externs_path/chrome_send.js" ] } - -js_library("detailed_build_info") { - deps = [ - ":about_page_browser_proxy", - "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", - "//ui/webui/resources/js:assert", - "//ui/webui/resources/js:i18n_behavior", - "//ui/webui/resources/js/cr/ui:focus_without_ink", - ] -} - -js_library("channel_switcher_dialog") { - deps = [ - ":about_page_browser_proxy", - "//ui/webui/resources/js:load_time_data", - ] -}
diff --git a/chrome/browser/resources/settings/about_page/about_page.html b/chrome/browser/resources/settings/about_page/about_page.html index f50cfca..f70b94e 100644 --- a/chrome/browser/resources/settings/about_page/about_page.html +++ b/chrome/browser/resources/settings/about_page/about_page.html
@@ -6,8 +6,6 @@ <link rel="import" href="../lifetime_browser_proxy.html"> <link rel="import" href="../prefs/prefs.html"> <link rel="import" href="../route.html"> -<link rel="import" href="../settings_page/main_page_behavior.html"> -<link rel="import" href="../settings_page/settings_animated_pages.html"> <link rel="import" href="../settings_page/settings_section.html"> <link rel="import" href="../settings_page_css.html"> <link rel="import" href="../settings_shared_css.html"> @@ -20,14 +18,6 @@ <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<if expr="chromeos"> -<link rel="import" href="detailed_build_info.html"> -<link rel="import" href="update_warning_dialog.html"> -<link rel="import" href="../chromeos/os_icons.html"> -<link rel="import" href="../settings_page/settings_subpage.html"> -<link rel="import" href="../reset_page/powerwash_dialog.html"> -</if> - <dom-module id="settings-about-page"> <template> <style include="settings-shared settings-page-styles"> @@ -77,10 +67,6 @@ white-space: nowrap; } - #regulatoryInfo img { - width: 330px; - } - <if expr="_google_chrome and is_macosx"> #promoteUpdater[disabled] { @apply --cr-secondary-text; @@ -88,181 +74,100 @@ </if> </style> <settings-section page-title="$i18n{aboutPageTitle}" section="about"> - <settings-animated-pages id="pages" section="about" - focus-config="[[focusConfig_]]"> - <div route-path="default"> - <div class="settings-box two-line first"> - <img id="product-logo" on-click="onProductLogoTap_" - srcset="chrome://theme/current-channel-logo@1x 1x, - chrome://theme/current-channel-logo@2x 2x" - alt="$i18n{aboutProductLogoAlt}" - role="presentation"> - <h1 class="product-title">$i18n{aboutProductTitle}</h1> - </div> - <div class="settings-box two-line"> - <!-- TODO(dpapad): Investigate why vulcanize does not handle well - a new line after "getThrobberSrcIfUpdating_(", causes incorrect - src URL --> - <!-- Set the icon from the iconset (when it's obsolete/EOL and - when update is done) or set the src (when it's updating). --> + <div class="settings-box two-line first"> + <img id="product-logo" on-click="onProductLogoTap_" + srcset="chrome://theme/current-channel-logo@1x 1x, + chrome://theme/current-channel-logo@2x 2x" + alt="$i18n{aboutProductLogoAlt}" + role="presentation"> + <h1 class="product-title">$i18n{aboutProductTitle}</h1> + </div> + <div class="settings-box two-line"> + <!-- TODO(dpapad): Investigate why vulcanize does not handle well + a new line after "getThrobberSrcIfUpdating_(", causes incorrect + src URL --> + <!-- Set the icon from the iconset (when it's obsolete/EOL and + when update is done) or set the src (when it's updating). --> <if expr="not chromeos"> - <div class="icon-container" - hidden="[[!shouldShowIcons_(showUpdateStatus_)]]"> - <iron-icon - icon$="[[getUpdateStatusIcon_( - obsoleteSystemInfo_, currentUpdateStatusEvent_)]]" - src="[[getThrobberSrcIfUpdating_(obsoleteSystemInfo_, currentUpdateStatusEvent_)]]"> -</if> -<if expr="chromeos"> - <div class="icon-container" - hidden="[[!shouldShowIcons_(showUpdateStatus_, - showOsSettings_)]]"> - <iron-icon - icon$="[[getUpdateStatusIcon_( - hasEndOfLife_, currentUpdateStatusEvent_)]]" - src="[[getThrobberSrcIfUpdating_(hasEndOfLife_, currentUpdateStatusEvent_)]]"> -</if> - </iron-icon> - </div> - <div class="start padded"> - <div id="updateStatusMessage" hidden="[[!showUpdateStatus_]]"> - <div -<if expr="not chromeos"> - inner-h-t-m-l="[[getUpdateStatusMessage_( - currentUpdateStatusEvent_)]]"> -</if> -<if expr="chromeos"> - inner-h-t-m-l="[[getUpdateStatusMessage_( - currentUpdateStatusEvent_, targetChannel_)]]"> -</if> - </div> - <a hidden$="[[!shouldShowLearnMoreLink_( - currentUpdateStatusEvent_)]]" target="_blank" - href="https://support.google.com/chrome?p=update_error"> - $i18n{learnMore} - </a> - </div> -<if expr="not chromeos"> - <span id="deprecationWarning" - hidden="[[!obsoleteSystemInfo_.obsolete]]"> - $i18n{aboutObsoleteSystem} - <a href="$i18n{aboutObsoleteSystemURL}" target="_blank"> - $i18n{learnMore} - </a> - </span> -</if> -<if expr="chromeos"> - <div id="endOfLifeMessageContainer" hidden="[[!hasEndOfLife_]]"> - $i18n{endOfLifeMessage} - <a href="$i18n{endOfLifeLearnMoreURL}" target="_blank"> - $i18n{learnMore} - </a> - </div> -</if> - <div class="secondary">$i18n{aboutBrowserVersion}</div> -<if expr="chromeos"> - <div class="secondary" - inner-h-t-m-l="[[getUpdateOsSettingsLink_()]]"> - </div> -</if> - </div> - <div class="separator" hidden="[[!showButtonContainer_]]"></div> - <span id="buttonContainer" hidden="[[!showButtonContainer_]]"> - <cr-button id="relaunch" hidden="[[!showRelaunch_]]" - on-click="onRelaunchTap_"> - $i18n{aboutRelaunch} - </cr-button> -<if expr="chromeos"> - <cr-button id="relaunchAndPowerwash" - hidden="[[!showRelaunchAndPowerwash_]]" - on-click="onRelaunchAndPowerwashTap_"> - $i18n{aboutRelaunchAndPowerwash} - </cr-button> - <cr-button id="checkForUpdates" hidden="[[!showCheckUpdates_]]" - on-click="onCheckUpdatesTap_"> - $i18n{aboutCheckForUpdates} - </cr-button> -</if> - </span> - </div> -<if expr="chromeos"> - <cr-link-row - id="aboutTPMFirmwareUpdate" - class="hr" - hidden$="[[!showTPMFirmwareUpdateLineItem_]]" - label="$i18n{aboutTPMFirmwareUpdateTitle}" - on-click="onTPMFirmwareUpdateTap_"> - <div slot="sub-label"> - $i18n{aboutTPMFirmwareUpdateDescription} - <a href="$i18n{aboutTPMFirmwareUpdateLearnMoreURL}" - target="_blank" on-click="onLearnMoreTap_"> - $i18n{learnMore} - </a> - </div> - </cr-link-row> -</if> -<if expr="_google_chrome and is_macosx"> - <template is="dom-if" if="[[!promoteUpdaterStatus_.hidden]]"> - <div id="promoteUpdater" class="settings-box" - disabled$="[[promoteUpdaterStatus_.disabled]]" - actionable$="[[promoteUpdaterStatus_.actionable]]" - on-click="onPromoteUpdaterTap_"> - <div class="start"> - [[promoteUpdaterStatus_.text]] - <a href="https://support.google.com/chrome/answer/95414" - target="_blank" id="updaterLearnMore" - on-click="onLearnMoreTap_"> - $i18n{learnMore} - </a> - </div> - <cr-icon-button class="subpage-arrow" - hidden$="[[!promoteUpdaterStatus_.actionable]]" - disabled="[[promoteUpdaterStatus_.disabled]]" - aria-label$="[[promoteUpdaterStatus_.text]]"></cr-icon-button> - </div> - </template> -</if> -<if expr="chromeos"> - <template is="dom-if" if="[[hasReleaseNotes_]]"> - <cr-link-row class="hr" id="releaseNotesOnline" - hidden="[[!hasInternetConnection_]]" - on-click="onReleaseNotesTap_" - label="$i18n{aboutShowReleaseNotes}" external></cr-link-row> - <cr-link-row class="hr" id="releaseNotesOffline" - hidden="[[hasInternetConnection_]]" - on-click="onReleaseNotesTap_" - label="$i18n{aboutShowReleaseNotes}" - title="$i18n{aboutReleaseNotesOffline}" external></cr-link-row> - </template> -</if> - <cr-link-row class="hr" id="help" on-click="onHelpTap_" - label="$i18n{aboutGetHelpUsingChrome}" external></cr-link-row> -<if expr="_google_chrome"> - <cr-link-row class="hr" id="reportIssue" on-click="onReportIssueTap_" - hidden="[[!prefs.feedback_allowed.value]]" - label="$i18n{aboutReportAnIssue}" external></cr-link-row> -</if> -<if expr="chromeos"> - <cr-link-row class="hr" id="detailed-build-info-trigger" - on-click="onDetailedBuildInfoTap_" - label="$i18n{aboutDetailedBuildInfo}" - role-description="$i18n{subpageArrowRoleDescription}" - hidden$="[[!showOsSettings_]]"> - </cr-link-row> -</if> - <cr-link-row class="hr" on-click="onManagementPageTap_" - start-icon="cr:domain" label="$i18n{managementPage}" - role-description="$i18n{subpageArrowRoleDescription}" - hidden$="[[!isManaged_]]"></cr-link-row> + <div class="icon-container" + hidden="[[!shouldShowIcons_(showUpdateStatus_)]]"> + <iron-icon + icon$="[[getUpdateStatusIcon_( + obsoleteSystemInfo_, currentUpdateStatusEvent_)]]" + src="[[getThrobberSrcIfUpdating_(obsoleteSystemInfo_, currentUpdateStatusEvent_)]]"> + </iron-icon> </div> -<if expr="chromeos"> - <template is="dom-if" route-path="/help/details"> - <settings-subpage page-title="$i18n{aboutDetailedBuildInfo}"> - <settings-detailed-build-info></settings-detailed-build-info> - </settings-subpage> - </template> </if> - </settings-animated-pages> + <div class="start padded"> +<if expr="not chromeos"> + <div id="updateStatusMessage" hidden="[[!showUpdateStatus_]]"> + <div + inner-h-t-m-l="[[getUpdateStatusMessage_( + currentUpdateStatusEvent_)]]"> + </div> + <a hidden$="[[!shouldShowLearnMoreLink_( + currentUpdateStatusEvent_)]]" target="_blank" + href="https://support.google.com/chrome?p=update_error"> + $i18n{learnMore} + </a> + </div> + <span id="deprecationWarning" + hidden="[[!obsoleteSystemInfo_.obsolete]]"> + $i18n{aboutObsoleteSystem} + <a href="$i18n{aboutObsoleteSystemURL}" target="_blank"> + $i18n{learnMore} + </a> + </span> +</if> + <div class="secondary">$i18n{aboutBrowserVersion}</div> +<if expr="chromeos"> + <div class="secondary" + inner-h-t-m-l="[[getUpdateOsSettingsLink_()]]"> + </div> +</if> + </div> +<if expr="not chromeos"> + <div class="separator" hidden="[[!showButtonContainer_]]"></div> + <span id="buttonContainer" hidden="[[!showButtonContainer_]]"> + <cr-button id="relaunch" hidden="[[!showRelaunch_]]" + on-click="onRelaunchTap_"> + $i18n{aboutRelaunch} + </cr-button> + </span> +</if> + </div> +<if expr="_google_chrome and is_macosx"> + <template is="dom-if" if="[[!promoteUpdaterStatus_.hidden]]"> + <div id="promoteUpdater" class="settings-box" + disabled$="[[promoteUpdaterStatus_.disabled]]" + actionable$="[[promoteUpdaterStatus_.actionable]]" + on-click="onPromoteUpdaterTap_"> + <div class="start"> + [[promoteUpdaterStatus_.text]] + <a href="https://support.google.com/chrome/answer/95414" + target="_blank" id="updaterLearnMore" + on-click="onLearnMoreTap_"> + $i18n{learnMore} + </a> + </div> + <cr-icon-button class="subpage-arrow" + hidden$="[[!promoteUpdaterStatus_.actionable]]" + disabled="[[promoteUpdaterStatus_.disabled]]" + aria-label$="[[promoteUpdaterStatus_.text]]"></cr-icon-button> + </div> + </template> +</if> + <cr-link-row class="hr" id="help" on-click="onHelpTap_" + label="$i18n{aboutGetHelpUsingChrome}" external></cr-link-row> +<if expr="_google_chrome"> + <cr-link-row class="hr" id="reportIssue" on-click="onReportIssueTap_" + hidden="[[!prefs.feedback_allowed.value]]" + label="$i18n{aboutReportAnIssue}" external></cr-link-row> +</if> + <cr-link-row class="hr" on-click="onManagementPageTap_" + start-icon="cr:domain" label="$i18n{managementPage}" + role-description="$i18n{subpageArrowRoleDescription}" + hidden$="[[!isManaged_]]"></cr-link-row> </settings-section> <settings-section> @@ -274,45 +179,12 @@ <div class="info-section"> <div class="secondary">$i18nRaw{aboutProductLicense}</div> -<if expr="chromeos"> - <div id="crostiniLicense" class="secondary" - inner-h-t-m-l="[[getAboutProductOsLicense_( - showCrostiniLicense_)]]" hidden$="[[!showOsSettings_]]"></div> -</if> </div> <if expr="_google_chrome"> <div class="secondary">$i18nRaw{aboutProductTos}</div> </if> </div> -<if expr="chromeos"> - <div class="settings-box padded block" id="regulatoryInfo" - hidden$="[[!shouldShowRegulatoryOrSafetyInfo_(regulatoryInfo_, - showOsSettings_)]]"> -<if expr="_google_chrome"> - <div class="secondary" hidden$="[[!shouldShowSafetyInfo_()]]"> - <a target="_blank" href="$i18n{aboutProductSafetyURL}"> - $i18nRaw{aboutProductSafety} - </a> - </div> -</if> - <img src="[[regulatoryInfo_.url]]" alt="[[regulatoryInfo_.text]]" - hidden$="[[!shouldShowRegulatoryInfo_(regulatoryInfo_)]]"> - </div> -</if> </settings-section> -<if expr="chromeos"> - <template is="dom-if" if="[[showUpdateWarningDialog_]]" restamp> - <settings-update-warning-dialog update-info="[[updateInfo_]]" - on-close="onUpdateWarningDialogClose_"> - </settings-update-warning-dialog> - </template> - <template is="dom-if" if="[[showTPMFirmwareUpdateDialog_]]" - restamp> - <settings-powerwash-dialog request-tpm-firmware-update - on-close="onPowerwashDialogClose_"> - </settings-powerwash-dialog> - </template> -</if> </template> <script src="about_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/about_page/about_page.js b/chrome/browser/resources/settings/about_page/about_page.js index cdb84511..34bfeaea 100644 --- a/chrome/browser/resources/settings/about_page/about_page.js +++ b/chrome/browser/resources/settings/about_page/about_page.js
@@ -12,8 +12,6 @@ behaviors: [ WebUIListenerBehavior, - settings.MainPageBehavior, - settings.RouteObserverBehavior, I18nBehavior, ], @@ -41,62 +39,6 @@ }, }, - // <if expr="chromeos"> - /** @private */ - hasCheckedForUpdates_: { - type: Boolean, - value: false, - }, - - /** @private {!BrowserChannel} */ - currentChannel_: String, - - /** @private {!BrowserChannel} */ - targetChannel_: String, - - /** @private {?RegulatoryInfo} */ - regulatoryInfo_: Object, - - /** @private */ - hasEndOfLife_: { - type: Boolean, - value: false, - }, - - /** @private */ - hasReleaseNotes_: { - type: Boolean, - value: false, - }, - - /** @private */ - showCrostini: Boolean, - - /** - * When the SplitSettings feature is disabled, the about page shows the OS- - * specific parts. When SplitSettings is enabled, the OS-specific parts - * will only show up in chrome://os-settings/help. - * TODO(aee): remove after SplitSettings feature flag is removed. - * @private - */ - showOsSettings_: { - type: Boolean, - value: () => loadTimeData.getBoolean('showOSSettings'), - }, - - /** @private */ - showCrostiniLicense_: { - type: Boolean, - value: false, - }, - // </if> - - /** @private */ - hasInternetConnection_: { - type: Boolean, - value: false, - }, - // <if expr="_google_chrome and is_macosx"> /** @private {!PromoteUpdaterStatus} */ promoteUpdaterStatus_: Object, @@ -113,7 +55,6 @@ }; }, }, - // </if> /** @private */ showUpdateStatus_: { @@ -129,54 +70,6 @@ type: Boolean, value: false, }, - - // <if expr="chromeos"> - /** @private */ - showRelaunchAndPowerwash_: { - type: Boolean, - value: false, - computed: 'computeShowRelaunchAndPowerwash_(' + - 'currentUpdateStatusEvent_, targetChannel_, currentChannel_)', - }, - - /** @private */ - showCheckUpdates_: { - type: Boolean, - computed: 'computeShowCheckUpdates_(' + - 'currentUpdateStatusEvent_, hasCheckedForUpdates_, hasEndOfLife_)', - }, - - /** @private {!Map<string, string>} */ - focusConfig_: { - type: Object, - value: function() { - const map = new Map(); - if (settings.routes.DETAILED_BUILD_INFO) { - map.set( - settings.routes.DETAILED_BUILD_INFO.path, - '#detailed-build-info-trigger'); - } - return map; - }, - }, - - /** @private */ - showUpdateWarningDialog_: { - type: Boolean, - value: false, - }, - - /** @private */ - showTPMFirmwareUpdateLineItem_: { - type: Boolean, - value: false, - }, - - /** @private */ - showTPMFirmwareUpdateDialog_: Boolean, - - /** @private {!AboutPageUpdateInfo|undefined} */ - updateInfo_: Object, // </if> }, @@ -187,17 +80,6 @@ 'updateShowRelaunch_(currentUpdateStatusEvent_)', 'updateShowButtonContainer_(showRelaunch_)', // </if> - - // <if expr="chromeos"> - 'updateShowUpdateStatus_(' + - 'hasEndOfLife_, currentUpdateStatusEvent_,' + - 'hasCheckedForUpdates_)', - 'updateShowRelaunch_(currentUpdateStatusEvent_, targetChannel_,' + - 'currentChannel_)', - 'updateShowButtonContainer_(' + - 'showRelaunch_, showRelaunchAndPowerwash_, showCheckUpdates_)', - 'handleCrostiniEnabledChanged_(prefs.crostini.enabled.value)', - // </if> ], /** @private {?settings.AboutPageBrowserProxy} */ @@ -214,60 +96,16 @@ this.lifetimeBrowserProxy_ = settings.LifetimeBrowserProxyImpl.getInstance(); - // <if expr="chromeos"> - if (!this.showOsSettings_) { - return; - } - - this.addEventListener('target-channel-changed', e => { - this.targetChannel_ = e.detail; - }); - - this.aboutBrowserProxy_.getChannelInfo().then(info => { - this.currentChannel_ = info.currentChannel; - this.targetChannel_ = info.targetChannel; - this.startListening_(); - }); - - this.aboutBrowserProxy_.getRegulatoryInfo().then(info => { - this.regulatoryInfo_ = info; - }); - - this.aboutBrowserProxy_.getEndOfLifeInfo().then(result => { - this.hasEndOfLife_ = !!result.hasEndOfLife; - }); - - this.aboutBrowserProxy_.getEnabledReleaseNotes().then(result => { - this.hasReleaseNotes_ = result; - }); - - this.aboutBrowserProxy_.checkInternetConnection().then(result => { - this.hasInternetConnection_ = result; - }); - - // </if> // <if expr="not chromeos"> this.startListening_(); - // </if> if (settings.getQueryParameters().get('checkForUpdate') == 'true') { - this.onCheckUpdatesTap_(); + this.onUpdateStatusChanged_({status: UpdateStatus.CHECKING}); + this.aboutBrowserProxy_.requestUpdate(); } + // </if> }, - /** - * @param {!settings.Route} newRoute - * @param {settings.Route} oldRoute - */ - currentRouteChanged: function(newRoute, oldRoute) { - settings.MainPageBehavior.currentRouteChanged.call( - this, newRoute, oldRoute); - }, - - // Override settings.MainPageBehavior method. - containsRoute: function(route) { - return !route || settings.routes.ABOUT.contains(route); - }, - + // <if expr="not chromeos"> /** @private */ startListening_: function() { this.addWebUIListener( @@ -278,12 +116,6 @@ this.onPromoteUpdaterStatusChanged_.bind(this)); // </if> this.aboutBrowserProxy_.refreshUpdateStatus(); - // <if expr="chromeos"> - this.addWebUIListener( - 'tpm-firmware-update-status-changed', - this.onTPMFirmwareUpdateStatusChanged_.bind(this)); - this.aboutBrowserProxy_.refreshTPMFirmwareUpdateStatus(); - // </if> }, /** @@ -291,16 +123,9 @@ * @private */ onUpdateStatusChanged_: function(event) { - // <if expr="chromeos"> - if (event.status == UpdateStatus.CHECKING) { - this.hasCheckedForUpdates_ = true; - } else if (event.status == UpdateStatus.NEED_PERMISSION_TO_UPDATE) { - this.showUpdateWarningDialog_ = true; - this.updateInfo_ = {version: event.version, size: event.size}; - } - // </if> this.currentUpdateStatusEvent_ = event; }, + // </if> // <if expr="_google_chrome and is_macosx"> /** @@ -350,30 +175,13 @@ this.lifetimeBrowserProxy_.relaunch(); }, + // <if expr="not chromeos"> /** @private */ updateShowUpdateStatus_: function() { - // <if expr="chromeos"> - // Do not show the "updated" status if we haven't checked yet or the update - // warning dialog is shown to user. - if (this.currentUpdateStatusEvent_.status == UpdateStatus.UPDATED && - (!this.hasCheckedForUpdates_ || this.showUpdateWarningDialog_)) { - this.showUpdateStatus_ = false; - return; - } - - // Do not show "updated" status if the device is end of life. - if (this.hasEndOfLife_) { - this.showUpdateStatus_ = false; - return; - } - // </if> - - // <if expr="not chromeos"> if (this.obsoleteSystemInfo_.endOfLine) { this.showUpdateStatus_ = false; return; } - // </if> this.showUpdateStatus_ = this.currentUpdateStatusEvent_.status != UpdateStatus.DISABLED; }, @@ -384,24 +192,12 @@ * @private */ updateShowButtonContainer_: function() { - // <if expr="not chromeos"> this.showButtonContainer_ = this.showRelaunch_; - // </if> - // <if expr="chromeos"> - this.showButtonContainer_ = this.showRelaunch_ || - this.showRelaunchAndPowerwash_ || this.showCheckUpdates_; - // </if> }, /** @private */ updateShowRelaunch_: function() { - // <if expr="not chromeos"> this.showRelaunch_ = this.checkStatus_(UpdateStatus.NEARLY_UPDATED); - // </if> - // <if expr="chromeos"> - this.showRelaunch_ = - this.checkStatus_(UpdateStatus.NEARLY_UPDATED) && !this.isRollback_(); - // </if> }, /** @@ -422,14 +218,6 @@ case UpdateStatus.NEED_PERMISSION_TO_UPDATE: return this.i18nAdvanced('aboutUpgradeCheckStarted'); case UpdateStatus.NEARLY_UPDATED: - // <if expr="chromeos"> - if (this.currentChannel_ != this.targetChannel_) { - return this.i18nAdvanced('aboutUpgradeSuccessChannelSwitch'); - } - if (this.currentUpdateStatusEvent_.rollback) { - return this.i18nAdvanced('aboutRollbackSuccess'); - } - // </if> return this.i18nAdvanced('aboutUpgradeRelaunch'); case UpdateStatus.UPDATED: return this.i18nAdvanced('aboutUpgradeUpToDate'); @@ -437,22 +225,6 @@ assert(typeof this.currentUpdateStatusEvent_.progress == 'number'); const progressPercent = this.currentUpdateStatusEvent_.progress + '%'; - // <if expr="chromeos"> - if (this.currentChannel_ != this.targetChannel_) { - return this.i18nAdvanced('aboutUpgradeUpdatingChannelSwitch', { - substitutions: [ - this.i18nAdvanced( - settings.browserChannelToI18nId(this.targetChannel_)), - progressPercent - ] - }); - } - if (this.currentUpdateStatusEvent_.rollback) { - return this.i18nAdvanced('aboutRollbackInProgress', { - substitutions: [progressPercent], - }); - } - // </if> if (this.currentUpdateStatusEvent_.progress > 0) { // NOTE(dbeam): some platforms (i.e. Mac) always send 0% while // updating (they don't support incremental upgrade progress). Though @@ -487,21 +259,11 @@ * @private */ getUpdateStatusIcon_: function() { - // <if expr="chromeos"> - // If Chrome OS has reached end of life, display a special icon and - // ignore UpdateStatus. - if (this.hasEndOfLife_) { - return 'os-settings:end-of-life'; - } - // </if> - - // <if expr="not chromeos"> // If this platform has reached the end of the line, display an error icon // and ignore UpdateStatus. if (this.obsoleteSystemInfo_.endOfLine) { return 'cr:error'; } - // </if> switch (this.currentUpdateStatusEvent_.status) { case UpdateStatus.DISABLED_BY_ADMIN: @@ -521,17 +283,9 @@ * @private */ getThrobberSrcIfUpdating_: function() { - // <if expr="chromeos"> - if (this.hasEndOfLife_) { - return null; - } - // </if> - - // <if expr="not chromeos"> if (this.obsoleteSystemInfo_.endOfLine) { return null; } - // </if> switch (this.currentUpdateStatusEvent_.status) { case UpdateStatus.CHECKING: @@ -541,6 +295,7 @@ return null; } }, + // </if> /** * @param {!UpdateStatus} status @@ -558,82 +313,6 @@ // <if expr="chromeos"> /** - * @return {boolean} - * @private - */ - isRollback_: function() { - assert(this.currentChannel_.length > 0); - assert(this.targetChannel_.length > 0); - if (this.currentUpdateStatusEvent_.rollback) { - return true; - } - // Channel switch to a more stable channel is also a rollback - return settings.isTargetChannelMoreStable( - this.currentChannel_, this.targetChannel_); - }, - - /** @private */ - onDetailedBuildInfoTap_: function() { - settings.navigateTo(settings.routes.DETAILED_BUILD_INFO); - }, - - /** @private */ - onRelaunchAndPowerwashTap_: function() { - if (this.currentUpdateStatusEvent_.rollback) { - // Wipe already initiated, simply relaunch. - this.lifetimeBrowserProxy_.relaunch(); - } else { - this.lifetimeBrowserProxy_.factoryReset( - /* requestTpmFirmwareUpdate= */ false); - } - }, - - /** - * @return {boolean} - * @private - */ - computeShowRelaunchAndPowerwash_: function() { - return this.checkStatus_(UpdateStatus.NEARLY_UPDATED) && this.isRollback_(); - }, - - /** @private */ - onCheckUpdatesTap_: function() { - this.onUpdateStatusChanged_({status: UpdateStatus.CHECKING}); - this.aboutBrowserProxy_.requestUpdate(); - }, - - /** - * @return {boolean} - * @private - */ - computeShowCheckUpdates_: function() { - // Disable update button if the device is end of life. - if (this.hasEndOfLife_) { - return false; - } - - // Enable the update button if we are in a stale 'updated' status or - // update has failed. Disable it otherwise. - const staleUpdatedStatus = - !this.hasCheckedForUpdates_ && this.checkStatus_(UpdateStatus.UPDATED); - - return staleUpdatedStatus || this.checkStatus_(UpdateStatus.FAILED); - }, - - /** - * @param {boolean} showCrostiniLicense True if Crostini is enabled and - * Crostini UI is allowed. - * @return {string} - * @private - */ - getAboutProductOsLicense_: function(showCrostiniLicense) { - return showCrostiniLicense ? - this.i18nAdvanced('aboutProductOsWithLinuxLicense') : - this.i18nAdvanced('aboutProductOsLicense'); - }, - - // <if expr="chromeos"> - /** * @return {string} * @private */ @@ -646,66 +325,6 @@ }, // </if> - /** - * @param {boolean} enabled True if Crostini is enabled. - * @private - */ - handleCrostiniEnabledChanged_: function(enabled) { - this.showCrostiniLicense_ = enabled && this.showCrostini; - }, - - /** - * @return {boolean} - * @private - */ - shouldShowSafetyInfo_: function() { - return loadTimeData.getBoolean('shouldShowSafetyInfo'); - }, - - /** - * @return {boolean} - * @private - */ - shouldShowRegulatoryInfo_: function() { - return this.regulatoryInfo_ !== null; - }, - - /** - * @return {boolean} - * @private - */ - shouldShowRegulatoryOrSafetyInfo_: function() { - return this.showOsSettings_ && - (this.shouldShowSafetyInfo_() || this.shouldShowRegulatoryInfo_()); - }, - - /** @private */ - onUpdateWarningDialogClose_: function() { - this.showUpdateWarningDialog_ = false; - // Shows 'check for updates' button in case that the user cancels the - // dialog and then intends to check for update again. - this.hasCheckedForUpdates_ = false; - }, - - /** - * @param {!TPMFirmwareUpdateStatusChangedEvent} event - * @private - */ - onTPMFirmwareUpdateStatusChanged_: function(event) { - this.showTPMFirmwareUpdateLineItem_ = event.updateAvailable; - }, - - /** @private */ - onTPMFirmwareUpdateTap_: function() { - this.showTPMFirmwareUpdateDialog_ = true; - }, - - /** @private */ - onPowerwashDialogClose_: function() { - this.showTPMFirmwareUpdateDialog_ = false; - }, - // </if> - /** @private */ onProductLogoTap_: function() { this.$['product-logo'].animate( @@ -730,11 +349,6 @@ * @private */ shouldShowIcons_: function() { - // <if expr="chromeos"> - if (this.hasEndOfLife_) { - return true; - } - // </if> // <if expr="not chromeos"> if (this.obsoleteSystemInfo_.endOfLine) { return true;
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index 6401744..351d813 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -208,8 +208,7 @@ restamp> <settings-section page-title="$i18n{languagesPageTitle}" section="languages"> - <settings-languages-page prefs="{{prefs}}" - page-visibility="[[pageVisibility.languages]]"> + <settings-languages-page prefs="{{prefs}}"> </settings-languages-page> </settings-section> </template>
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn index 46efedd..9dd68e2 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -92,6 +92,7 @@ ":internet_page_browser_proxy", "../..:route", "../..:route_origin_behavior", + "../localized_link:localized_link", "//ui/webui/resources/cr_components/chromeos/network:network_listener_behavior", "//ui/webui/resources/cr_components/chromeos/network:onc_mojo", "//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html index 9070b63d..49bf29bc 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.html
@@ -12,6 +12,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="internet_page_browser_proxy.html"> +<link rel="import" href="../localized_link/localized_link.html"> <link rel="import" href="../../chromeos/os_settings_icons_css.html"> <link rel="import" href="../../i18n_setup.html"> <link rel="import" href="../../route.html"> @@ -160,11 +161,12 @@ </template> <!-- Text shown if no networks exist. --> - <div hidden="[[shouldShowNetworkList_(networkStateList_)]]" - inner-h-t-m-l= - "[[getNoNetworksInnerHtml_(deviceState, tetherDeviceState)]]" - class="no-networks"> - </div> + <settings-localized-link + class="no-networks" + hidden="[[shouldShowNetworkList_(networkStateList_)]]" + localized-string= + "[[getNoNetworksInnerHtml_(deviceState, tetherDeviceState)]]"> + </settings-localized-link> <template is="dom-if" if="[[matchesType_('VPN', deviceState)]]"> <!-- Third party VPNs. -->
diff --git a/chrome/browser/resources/settings/chromeos/localized_link/localized_link.js b/chrome/browser/resources/settings/chromeos/localized_link/localized_link.js index 8f5ece6..f268c2b 100644 --- a/chrome/browser/resources/settings/chromeos/localized_link/localized_link.js +++ b/chrome/browser/resources/settings/chromeos/localized_link/localized_link.js
@@ -4,7 +4,7 @@ /** * @fileoverview 'settings-localized-link' takes a localized string that - * contains exactly one anchor tag, and labels the string contained within the + * contains up to one anchor tag, and labels the string contained within the * anchor tag with the entire localized string. The string should not be bound * by element tags. The string should not contain any elements other than the * single anchor tagged element that will be aria-labelledby the entire string. @@ -13,6 +13,11 @@ * * The "Learn More" will be aria-labelledby like so: "lorem ipsum Learn More * dolor sit". Meanwhile, "Lorem ipsum" and "dolor sit" will be aria-hidden. + * + * This element also supports strings that do not contain anchor tags; in this + * case, the element gracefully falls back to normal text. This can be useful + * when the property is data-bound to a function which sometimes returns a + * string with a link and sometimes returns a normal string. */ Polymer({ @@ -20,8 +25,8 @@ properties: { /** - * The localized string that should contain one anchor tag, the text within - * which will be aria-labelledby the entire localizedString. + * The localized string that contains up to one anchor tag, the text + * within which will be aria-labelledby the entire localizedString. */ localizedString: String, @@ -73,6 +78,12 @@ }); const anchorTags = tempEl.getElementsByTagName('a'); + // In the event the provided localizedString contains only text nodes, + // populate the contents with the provided localizedString. + if (anchorTags.length == 0) { + return localizedString; + } + assert(anchorTags.length == 1, 'settings-localized-link should contain exactly one anchor tag'); anchorTags[0].setAttribute('aria-labelledby', ariaLabelledByIds.join(' '));
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn index 7926668..cf3657ea 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
@@ -6,6 +6,8 @@ js_type_check("closure_compile") { deps = [ + ":channel_switcher_dialog", + ":detailed_build_info", ":os_about_page", ] } @@ -24,3 +26,21 @@ "//ui/webui/resources/js:web_ui_listener_behavior", ] } + +js_library("detailed_build_info") { + deps = [ + "../../about_page:about_page_browser_proxy", + "../localized_link:localized_link", + "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", + "//ui/webui/resources/js:assert", + "//ui/webui/resources/js:i18n_behavior", + "//ui/webui/resources/js/cr/ui:focus_without_ink", + ] +} + +js_library("channel_switcher_dialog") { + deps = [ + "../../about_page:about_page_browser_proxy", + "//ui/webui/resources/js:load_time_data", + ] +}
diff --git a/chrome/browser/resources/settings/about_page/channel_switcher_dialog.html b/chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.html similarity index 95% rename from chrome/browser/resources/settings/about_page/channel_switcher_dialog.html rename to chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.html index 78ac464..153da20 100644 --- a/chrome/browser/resources/settings/about_page/channel_switcher_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.html
@@ -5,8 +5,8 @@ <link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_radio_group/cr_radio_group.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-selector/iron-selector.html"> -<link rel="import" href="about_page_browser_proxy.html"> -<link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="../../about_page/about_page_browser_proxy.html"> +<link rel="import" href="../../settings_shared_css.html"> <dom-module id="settings-channel-switcher-dialog"> <template>
diff --git a/chrome/browser/resources/settings/about_page/channel_switcher_dialog.js b/chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.js similarity index 100% rename from chrome/browser/resources/settings/about_page/channel_switcher_dialog.js rename to chrome/browser/resources/settings/chromeos/os_about_page/channel_switcher_dialog.js
diff --git a/chrome/browser/resources/settings/about_page/detailed_build_info.html b/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.html similarity index 83% rename from chrome/browser/resources/settings/about_page/detailed_build_info.html rename to chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.html index f6043c16..1a2aa3d 100644 --- a/chrome/browser/resources/settings/about_page/detailed_build_info.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.html
@@ -2,10 +2,11 @@ <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> -<link rel="import" href="about_page_browser_proxy.html"> +<link rel="import" href="../../about_page/about_page_browser_proxy.html"> <link rel="import" href="channel_switcher_dialog.html"> -<link rel="import" href="../i18n_setup.html"> -<link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="../../i18n_setup.html"> +<link rel="import" href="../../settings_shared_css.html"> +<link rel="import" href="../localized_link/localized_link.html"> <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> @@ -55,15 +56,9 @@ class="settings-box two-line single-column" hidden="[[!eolMessageWithMonthAndYear]]"> <div role="heading" aria-level="2">$i18n{aboutEndOfLifeTitle}</div> - <div class="secondary"> - <span id="eolMessageWithMonthAndYear" aria-hidden="true"> - [[eolMessageWithMonthAndYear]] - </span> - <a href="$i18nRaw{endOfLifeLearnMoreURL}" - aria-describedby="eolMessageWithMonthAndYear" target="_blank"> - $i18n{learnMore} - </a> - </div> + <settings-localized-link class="secondary" + localized-string="[[eolMessageWithMonthAndYear]]"> + </settings-localized-link> </div> <cr-link-row class="hr" label="$i18n{aboutBuildDetailsTitle}" on-click="onBuildDetailsTap_" external>
diff --git a/chrome/browser/resources/settings/about_page/detailed_build_info.js b/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js similarity index 100% rename from chrome/browser/resources/settings/about_page/detailed_build_info.js rename to chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html index 3ce8f387..18477dee 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -1,8 +1,6 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="../../about_page/about_page_browser_proxy.html"> -<link rel="import" href="../../about_page/detailed_build_info.html"> -<link rel="import" href="../../about_page/update_warning_dialog.html"> <link rel="import" href="../../i18n_setup.html"> <!-- TODO(crbug.com/986596): Don't use browser icons here. Fork them. --> <link rel="import" href="../../icons.html"> @@ -18,6 +16,8 @@ <link rel="import" href="../os_icons.html"> <link rel="import" href="../os_reset_page/os_powerwash_dialog.html"> <link rel="import" href="../localized_link/localized_link.html"> +<link rel="import" href="detailed_build_info.html"> +<link rel="import" href="update_warning_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html"> @@ -117,12 +117,10 @@ $i18n{learnMore} </a> </div> - <div id="endOfLifeMessageContainer" hidden="[[!hasEndOfLife_]]"> - <settings-localized-link - localized-string="$i18n{endOfLifeMessage}" - link-url="$i18n{endOfLifeLearnMoreURL}"> - </settings-localized-link> - </div> + <settings-localized-link + id="endOfLifeMessageContainer" hidden="[[!hasEndOfLife_]]" + localized-string="$i18n{endOfLifeMessage}"> + </settings-localized-link> <div class="secondary">$i18n{aboutBrowserVersion}</div> </div> <div class="separator" hidden="[[!showButtonContainer_]]"></div>
diff --git a/chrome/browser/resources/settings/about_page/update_warning_dialog.html b/chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.html similarity index 88% rename from chrome/browser/resources/settings/about_page/update_warning_dialog.html rename to chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.html index b6fe9f3a..3080573a 100644 --- a/chrome/browser/resources/settings/about_page/update_warning_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.html
@@ -3,8 +3,8 @@ <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="about_page_browser_proxy.html"> -<link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="../../about_page/about_page_browser_proxy.html"> +<link rel="import" href="../../settings_shared_css.html"> <dom-module id="settings-update-warning-dialog"> <template>
diff --git a/chrome/browser/resources/settings/about_page/update_warning_dialog.js b/chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.js similarity index 100% rename from chrome/browser/resources/settings/about_page/update_warning_dialog.js rename to chrome/browser/resources/settings/chromeos/os_about_page/update_warning_dialog.js
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn index c5783ca3..680cdc2 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -6,23 +6,31 @@ js_type_check("closure_compile") { deps = [ + ":manage_input_methods_page", ":os_add_languages_dialog", ":os_languages_page", ":os_languages_section", "../../languages_page:languages", "../../languages_page:languages_browser_proxy", "../../languages_page:languages_types", - "../../languages_page:manage_input_methods_page", ] } +js_library("manage_input_methods_page") { + deps = [ + "../../languages_page:languages_types", + "../../prefs", + ] + externs_list = [ "$externs_path/language_settings_private.js" ] +} + js_library("os_languages_section") { deps = [ + ":manage_input_methods_page", ":os_languages_page", "../..:route", "../../languages_page:languages", "../../languages_page:languages_types", - "../../languages_page:manage_input_methods_page", "../../settings_page:settings_animated_pages", "../../settings_page:settings_subpage", "//ui/webui/resources/js:assert",
diff --git a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.html similarity index 96% rename from chrome/browser/resources/settings/languages_page/manage_input_methods_page.html rename to chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.html index 96a23de..55cd86c1 100644 --- a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.html
@@ -3,7 +3,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr.html"> -<link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="../../settings_shared_css.html"> <dom-module id="settings-manage-input-methods-page"> <template>
diff --git a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.js similarity index 99% rename from chrome/browser/resources/settings/languages_page/manage_input_methods_page.js rename to chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.js index b2b71758..fe83ef24 100644 --- a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.js
@@ -6,8 +6,6 @@ * @fileoverview 'settings-manage-input-methods-page' is a sub-page for enabling * and disabling input methods. Input methods are grouped by base languages to * avoid showing duplicate or ambiguous input methods. - * - * TODO(hsuregan): Move to OS settings. */ Polymer({ is: 'settings-manage-input-methods-page',
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html index d30c9f3..5ecb4bc 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html
@@ -5,7 +5,7 @@ <link rel="import" href="os_languages_page.html"> <link rel="import" href="../../i18n_setup.html"> <link rel="import" href="../../languages_page/languages.html"> -<link rel="import" href="../../languages_page/manage_input_methods_page.html"> +<link rel="import" href="manage_input_methods_page.html"> <link rel="import" href="../../route.html"> <link rel="import" href="../../settings_page/settings_animated_pages.html"> <link rel="import" href="../../settings_page/settings_subpage.html">
diff --git a/chrome/browser/resources/settings/languages_page/BUILD.gn b/chrome/browser/resources/settings/languages_page/BUILD.gn index b0041ec..8bc3523 100644 --- a/chrome/browser/resources/settings/languages_page/BUILD.gn +++ b/chrome/browser/resources/settings/languages_page/BUILD.gn
@@ -12,10 +12,6 @@ ":languages_page", ":languages_types", ] - - if (is_chromeos) { - deps += [ ":manage_input_methods_page" ] - } } js_library("languages_browser_proxy") { @@ -76,14 +72,6 @@ externs_list = [ "$externs_path/language_settings_private.js" ] } -js_library("manage_input_methods_page") { - deps = [ - ":languages_types", - "../prefs", - ] - externs_list = [ "$externs_path/language_settings_private.js" ] -} - js_library("add_languages_dialog") { deps = [ ":languages",
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html index aa80d88..50dab592 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.html +++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -37,10 +37,6 @@ <link rel="import" href="edit_dictionary_page.html"> </if> -<if expr="chromeos"> -<link rel="import" href="manage_input_methods_page.html"> -</if> - <dom-module id="settings-languages-page"> <template> <style include="settings-shared action-link"> @@ -255,56 +251,6 @@ label="$i18n{offerToEnableTranslate}"> </settings-toggle-button> </iron-collapse> -<if expr="chromeos"> - <cr-expand-button - hidden="[[!pageVisibility.inputMethodsList]]" - alt="$i18n{inputMethodsExpandA11yLabel}" - class="settings-box two-line" - expanded="{{inputMethodsOpened_}}" - id="manageInputMethodsSubpageTrigger"> - <div>$i18n{inputMethodsListTitle}</div> - <div class="secondary"> - [[getInputMethodName_(languages.inputMethods.currentId)]] - </div> - </cr-expand-button> - <iron-collapse id="inputMethodsCollapse" - hidden="[[!pageVisibility.inputMethodsList]]" - opened="[[inputMethodsOpened_]]"> - <div class="list-frame vertical-list"> - <template is="dom-repeat" - items="[[languages.inputMethods.enabled]]"> - <div class$="list-item [[getInputMethodItemClass_( - item.id, languages.inputMethods.currentId)]]" - on-click="onInputMethodTap_" on-keypress="onInputMethodTap_" - actionable tabindex="0"> - <div class="start"> - <div>[[item.displayName]]</div> - <div class="explain-selected" - hidden="[[!isCurrentInputMethod_( - item.id, languages.inputMethods.currentId)]]"> - $i18n{inputMethodEnabled} - </div> - </div> - <div class="external-wrapper" hidden="[[!item.hasOptionsPage]]"> - <div class="separator"></div> - <cr-icon-button class="icon-external" - on-click="onInputMethodOptionsTap_"></cr-icon-button> - </div> - </div> - </template> - <cr-link-row class="hr list-item" id="manageInputMethods" - on-click="onManageInputMethodsTap_" - label="$i18n{manageInputMethods}" - role-description="$i18n{subpageArrowRoleDescription}"> - </cr-link-row> - </div> - <settings-toggle-button - pref="{{prefs.settings.language.ime_menu_activated}}" - label="$i18n{showImeMenu}"> - </settings-toggle-button> - </iron-collapse> -</if> - <settings-toggle-button id="enableSpellcheckingToggle" label="$i18n{spellCheckTitle}" @@ -462,19 +408,6 @@ </template> </cr-lazy-render> </div> -<if expr="chromeos"> - <template is="dom-if" route-path="/inputMethods"> - <settings-subpage - hidden="[[!pageVisibility.manageInputMethods]]" - associated-control="[[$$('#manageInputMethodsSubpageTrigger')]]" - page-title="$i18n{manageInputMethodsPageTitle}"> - <settings-manage-input-methods-page languages="{{languages}}" - language-helper="[[languageHelper]]" - prefs="{{prefs}}"> - </settings-manage-input-methods-page> - </settings-subpage> - </template> -</if> <if expr="not is_macosx"> <template is="dom-if" route-path="/editDictionary" no-search="[[!prefs.browser.enable_spellchecking.value]]">
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.js b/chrome/browser/resources/settings/languages_page/languages_page.js index 657239a..218c1e7d 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.js +++ b/chrome/browser/resources/settings/languages_page/languages_page.js
@@ -103,21 +103,10 @@ '#spellCheckSubpageTrigger'); } // </if> - // <if expr="chromeos"> - if (settings.routes.INPUT_METHODS) { - map.set(settings.routes.INPUT_METHODS.path, '#manageInputMethods'); - } - // </if> return map; }, }, - /** - * Dictionary defining page visibility. - * @type {!LanguagesPageVisibility} - */ - pageVisibility: Object, - // <if expr="chromeos"> /** @private */ isGuest_: { @@ -287,81 +276,6 @@ menu.querySelector('#uiLanguageItem').hidden = true; } }, - - /** - * Opens the Manage Input Methods page. - * @private - */ - onManageInputMethodsTap_: function() { - settings.navigateTo(settings.routes.INPUT_METHODS); - }, - - /** - * Handler for tap and <Enter> events on an input method on the main page, - * which sets it as the current input method. - * @param {!{model: !{item: !chrome.languageSettingsPrivate.InputMethod}, - * target: !{tagName: string}, - * type: string, - * key: (string|undefined)}} e - */ - onInputMethodTap_: function(e) { - // Taps on the button are handled in onInputMethodOptionsTap_. - // TODO(dschuyler): The row has two operations that are not clearly - // delineated. crbug.com/740691 - if (e.target.tagName == 'CR-ICON-BUTTON') { - return; - } - - // Ignore key presses other than <Enter>. - if (e.type == 'keypress' && e.key != 'Enter') { - return; - } - - // Set the input method. - this.languageHelper.setCurrentInputMethod(e.model.item.id); - }, - - /** - * Opens the input method extension's options page in a new tab (or focuses - * an existing instance of the IME's options). - * @param {!{model: !{item: chrome.languageSettingsPrivate.InputMethod}}} e - * @private - */ - onInputMethodOptionsTap_: function(e) { - this.languageHelper.openInputMethodOptions(e.model.item.id); - }, - - /** - * @param {string} id The input method ID. - * @param {string} currentId The ID of the currently enabled input method. - * @return {boolean} True if the IDs match. - * @private - */ - isCurrentInputMethod_: function(id, currentId) { - assert(cr.isChromeOS); - return id == currentId; - }, - - /** - * @param {string} id The input method ID. - * @param {string} currentId The ID of the currently enabled input method. - * @return {string} The class for the input method item. - * @private - */ - getInputMethodItemClass_: function(id, currentId) { - assert(cr.isChromeOS); - return this.isCurrentInputMethod_(id, currentId) ? 'selected' : ''; - }, - - getInputMethodName_: function(id) { - assert(cr.isChromeOS); - const inputMethod = - this.languages.inputMethods.enabled.find(function(inputMethod) { - return inputMethod.id == id; - }); - return inputMethod ? inputMethod.displayName : ''; - }, - // </if> // <if expr="chromeos or is_win">
diff --git a/chrome/browser/resources/settings/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/multidevice_page/BUILD.gn index e0ba9079..342655f 100644 --- a/chrome/browser/resources/settings/multidevice_page/BUILD.gn +++ b/chrome/browser/resources/settings/multidevice_page/BUILD.gn
@@ -53,6 +53,7 @@ ":multidevice_feature_behavior", "..:route", "..:route_origin_behavior", + "../chromeos/localized_link:localized_link", "//ui/webui/resources/js:cr", ] } @@ -70,6 +71,7 @@ ":multidevice_constants", ":multidevice_feature_behavior", "..:route", + "../chromeos/localized_link:localized_link", "../controls:password_prompt_dialog", "//ui/webui/resources/js:cr", "//ui/webui/resources/js:web_ui_listener_behavior",
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html index 10c777db..307a7e2 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_feature_item.html
@@ -4,6 +4,7 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> +<link rel="import" href="../chromeos/localized_link/localized_link.html"> <link rel="import" href="../icons.html"> <link rel="import" href="../route.html"> <link rel="import" href="../route_origin_behavior.html"> @@ -39,10 +40,11 @@ </slot> <div id="item-text-container" class="middle"> <div id="featureName">[[getFeatureName(feature)]]</div> - <div class="secondary" + <settings-localized-link + class="secondary" id="featureSecondary" - inner-h-t-m-l="[[getFeatureSummaryHtml(feature)]]"> - </div> + localized-string="[[getFeatureSummaryHtml(feature)]]"> + </settings-localized-link> </div> <template is="dom-if" if="[[hasSubpageClickHandler_(
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_page.html b/chrome/browser/resources/settings/multidevice_page/multidevice_page.html index b4fc312b..ef4a3b24 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_page.html +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_page.html
@@ -7,6 +7,7 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> +<link rel="import" href="../chromeos/localized_link/localized_link.html"> <link rel="import" href="../i18n_setup.html"> <link rel="import" href="../icons.html"> <link rel="import" href="../route.html"> @@ -47,9 +48,10 @@ <div id="multidevice-label"> [[getLabelText_(pageContentData)]] </div> - <div id="multideviceSubLabel" class="secondary" - inner-h-t-m-l="[[getSubLabelInnerHtml_(pageContentData)]]"> - </div> + <settings-localized-link id="multideviceSubLabel" + class="secondary" + localized-string="[[getSubLabelInnerHtml_(pageContentData)]]"> + </settings-localized-link> </div> <template is="dom-if" if="[[doesClickOpenSubpage_(pageContentData)]]"
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd index 9a53fbc..1616e48 100644 --- a/chrome/browser/resources/settings/os_settings_resources.grd +++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -216,22 +216,22 @@ preprocess="true" allowexternalscript="true" /> <structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_HTML" - file="about_page/channel_switcher_dialog.html" + file="chromeos/os_about_page/channel_switcher_dialog.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_CHANNEL_SWITCHER_DIALOG_JS" - file="about_page/channel_switcher_dialog.js" + file="chromeos/os_about_page/channel_switcher_dialog.js" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_JS" - file="about_page/detailed_build_info.js" + file="chromeos/os_about_page/detailed_build_info.js" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_DETAILED_BUILD_INFO_HTML" - file="about_page/detailed_build_info.html" + file="chromeos/os_about_page/detailed_build_info.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_HTML" - file="about_page/update_warning_dialog.html" + file="chromeos/os_about_page/update_warning_dialog.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_UPDATE_WARNING_DIALOG_JS" - file="about_page/update_warning_dialog.js" + file="chromeos/os_about_page/update_warning_dialog.js" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_HTML" file="settings_page/settings_animated_pages.html" @@ -613,10 +613,10 @@ type="chrome_html" allowexternalscript="true" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_HTML" - file="languages_page/manage_input_methods_page.html" + file="chromeos/os_languages_page/manage_input_methods_page.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_JS" - file="languages_page/manage_input_methods_page.js" + file="chromeos/os_languages_page/manage_input_methods_page.js" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_OS_TOOLBAR_JS" file="chromeos/os_toolbar/os_toolbar.js"
diff --git a/chrome/browser/resources/settings/reset_page/powerwash_dialog.html b/chrome/browser/resources/settings/reset_page/powerwash_dialog.html deleted file mode 100644 index 965e35f..0000000 --- a/chrome/browser/resources/settings/reset_page/powerwash_dialog.html +++ /dev/null
@@ -1,33 +0,0 @@ -<link rel="import" href="chrome://resources/html/polymer.html"> - -<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="../lifetime_browser_proxy.html"> -<link rel="import" href="reset_browser_proxy.html"> -<link rel="import" href="../settings_shared_css.html"> - -<dom-module id="settings-powerwash-dialog"> - <template> - <style include="settings-shared"> - </style> - <cr-dialog id="dialog" close-text="$i18n{close}" - ignore-enter-key> - <div slot="title">$i18n{powerwashDialogTitle}</div> - <div slot="body"> - <span> - $i18n{powerwashDialogExplanation} - <a href="$i18nRaw{powerwashLearnMoreUrl}" target="_blank"> - $i18n{learnMore} - </a> - </span> - </div> - <div slot="button-container"> - <cr-button class="cancel-button" on-click="onCancelTap_" - id="cancel">$i18n{cancel}</cr-button> - <cr-button class="action-button" id="powerwash" - on-click="onRestartTap_">$i18n{powerwashDialogButton}</cr-button> - </div> - </cr-dialog> - </template> - <script src="powerwash_dialog.js"></script> -</dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/powerwash_dialog.js b/chrome/browser/resources/settings/reset_page/powerwash_dialog.js deleted file mode 100644 index 3778634..0000000 --- a/chrome/browser/resources/settings/reset_page/powerwash_dialog.js +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * 'settings-powerwash-dialog' is a dialog shown to request confirmation from - * the user for a device reset (aka powerwash). - */ -Polymer({ - is: 'settings-powerwash-dialog', - - properties: { - /** @public */ - requestTpmFirmwareUpdate: { - type: Boolean, - value: false, - } - }, - - /** @override */ - attached: function() { - settings.ResetBrowserProxyImpl.getInstance().onPowerwashDialogShow(); - this.$.dialog.showModal(); - }, - - /** @private */ - onCancelTap_: function() { - this.$.dialog.close(); - }, - - /** @private */ - onRestartTap_: function() { - settings.LifetimeBrowserProxyImpl.getInstance().factoryReset( - this.requestTpmFirmwareUpdate); - }, -});
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 5488b61..ab1dd922 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -60,26 +60,6 @@ type="chrome_html" preprocess="true" allowexternalscript="true" /> - <if expr="chromeos"> - <structure name="IDR_SETTINGS_CHANNEL_SWITCHER_DIALOG_HTML" - file="about_page/channel_switcher_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHANNEL_SWITCHER_DIALOG_JS" - file="about_page/channel_switcher_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DETAILED_BUILD_INFO_JS" - file="about_page/detailed_build_info.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DETAILED_BUILD_INFO_HTML" - file="about_page/detailed_build_info.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_UPDATE_WARNING_DIALOG_HTML" - file="about_page/update_warning_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_UPDATE_WARNING_DIALOG_JS" - file="about_page/update_warning_dialog.js" - type="chrome_html" /> - </if> <structure name="IDR_SETTINGS_ADD_SITE_DIALOG_HTML" file="site_settings/add_site_dialog.html" type="chrome_html" /> @@ -568,12 +548,6 @@ flattenhtml="true" type="chrome_html" /> </if> - <structure name="IDR_SETTINGS_POWERWASH_DIALOG_HTML" - file="reset_page/powerwash_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_POWERWASH_DIALOG_JS" - file="reset_page/powerwash_dialog.js" - type="chrome_html" /> <structure name="IDR_SETTINGS_RESET_PAGE_HTML" file="reset_page/reset_page.html" type="chrome_html" @@ -632,14 +606,6 @@ type="chrome_html" preprocess="true" allowexternalscript="true" /> - <if expr="chromeos"> - <structure name="IDR_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_HTML" - file="languages_page/manage_input_methods_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_JS" - file="languages_page/manage_input_methods_page.js" - type="chrome_html" /> - </if> <if expr="not is_macosx"> <structure name="IDR_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_HTML" file="languages_page/edit_dictionary_page.html"
diff --git a/chrome/browser/resources/tab_strip/tab_list.html b/chrome/browser/resources/tab_strip/tab_list.html index 97f37694..c6ce9ed 100644 --- a/chrome/browser/resources/tab_strip/tab_list.html +++ b/chrome/browser/resources/tab_strip/tab_list.html
@@ -18,6 +18,9 @@ display: flex; min-width: fit-content; overflow: hidden; + padding-inline-end: calc( + var(--tabstrip-new-tab-button-width) + + var(--tabstrip-new-tab-button-margin)); } #pinnedTabs { @@ -47,8 +50,7 @@ } #newTabButton { - --new-tab-button-margin: 24px; - --cr-icon-button-size: 50px; + --cr-icon-button-size: var(--tabstrip-new-tab-button-width); --cr-icon-button-icon-size: 32px; --cr-icon-button-fill-color: var(--tabstrip-tab-text-color); --cr-icon-button-margin-end: var(--new-tab-button-margin); @@ -57,19 +59,17 @@ border-radius: 50%; box-shadow: 0 1px 3px 0 rgba(var(--google-grey-800-rgb), .3), 0 4px 8px 3px rgba(var(--google-grey-800-rgb), .15); - height: 50px; - position: sticky; - right: var(--new-tab-button-margin); + height: var(--tabstrip-new-tab-button-width); + margin: 0; + position: fixed; + right: var(--tabstrip-new-tab-button-margin); top: 50%; transform: translateY(-50%); - width: 50px; + width: var(--tabstrip-new-tab-button-width); } :host-context([dir='rtl']) #newTabButton { - /* TODO(crbug.com/1015605): Sticky positioning does not work with RTL. */ - --cr-icon-button-margin-end: 0; - left: var(--new-tab-button-margin); - position: fixed; + left: var(--tabstrip-new-tab-button-margin); right: auto; }
diff --git a/chrome/browser/resources/tab_strip/tab_list.js b/chrome/browser/resources/tab_strip/tab_list.js index 7f1a15f..0fd428e 100644 --- a/chrome/browser/resources/tab_strip/tab_list.js +++ b/chrome/browser/resources/tab_strip/tab_list.js
@@ -40,6 +40,8 @@ */ const LayoutVariable = { VIEWPORT_WIDTH: '--tabstrip-viewport-width', + NEW_TAB_BUTTON_MARGIN: '--tabstrip-new-tab-button-margin', + NEW_TAB_BUTTON_WIDTH: '--tabstrip-new-tab-button-width', TAB_WIDTH: '--tabstrip-tab-thumbnail-width', }; @@ -595,21 +597,30 @@ const tabElementLeft = isRTL() ? tabElementRect.right - tabElementWidth : tabElementRect.left; + const newTabButtonSpace = + this.getLayoutVariable_(LayoutVariable.NEW_TAB_BUTTON_WIDTH) + + this.getLayoutVariable_(LayoutVariable.NEW_TAB_BUTTON_MARGIN); + const leftBoundary = + isRTL() ? SCROLL_PADDING + newTabButtonSpace : SCROLL_PADDING; + let scrollBy = 0; - if (tabElementLeft === SCROLL_PADDING) { + if (tabElementLeft === leftBoundary) { // Perfectly aligned to the left. return; - } else if (tabElementLeft < SCROLL_PADDING) { - // If the element's left is to the left of the visible screen, scroll - // such that the element's left edge is aligned with the screen's edge. - scrollBy = tabElementLeft - SCROLL_PADDING; + } else if (tabElementLeft < leftBoundary) { + // If the element's left is to the left of the left boundary, scroll + // such that the element's left edge is aligned with the left boundary. + scrollBy = tabElementLeft - leftBoundary; } else { const tabElementRight = tabElementLeft + tabElementWidth; - const viewportWidth = - this.getLayoutVariable_(LayoutVariable.VIEWPORT_WIDTH); + const rightBoundary = isRTL() ? + this.getLayoutVariable_(LayoutVariable.VIEWPORT_WIDTH) - + SCROLL_PADDING : + this.getLayoutVariable_(LayoutVariable.VIEWPORT_WIDTH) - + SCROLL_PADDING - newTabButtonSpace; - if (tabElementRight + SCROLL_PADDING > viewportWidth) { - scrollBy = (tabElementRight + SCROLL_PADDING) - viewportWidth; + if (tabElementRight > rightBoundary) { + scrollBy = (tabElementRight) - rightBoundary; } else { // Perfectly aligned to the right. return;
diff --git a/chrome/browser/resources/tab_strip/tab_strip.html b/chrome/browser/resources/tab_strip/tab_strip.html index 88977577..db922f75 100644 --- a/chrome/browser/resources/tab_strip/tab_strip.html +++ b/chrome/browser/resources/tab_strip/tab_strip.html
@@ -32,7 +32,17 @@ </style> </head> <body> - <tabstrip-tab-list role="tablist"></tabstrip-tab-list> + <!-- + The CSS variables defined inside of TabList's style tag are also + made available through TabList's class object in JavaScript. + --> + <tabstrip-tab-list + role="tablist" + style=" + --tabstrip-new-tab-button-margin: 24px; + --tabstrip-new-tab-button-width: 50px; + "> + </tabstrip-tab-list> <script src="tab_list.js" type="module"></script> </body> </html>
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index 1b4e8ee..2f02960 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -60,7 +60,9 @@ #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sessions/core/session_types.h" #include "components/sessions/core/tab_restore_service.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" +#include "components/tab_groups/tab_group_visual_data.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/notification_service.h" @@ -1055,8 +1057,8 @@ // for the second. const tab_groups::TabGroupVisualData group1_data = *tsm->group_model()->GetTabGroup(group1)->visual_data(); - const tab_groups::TabGroupVisualData group2_data(base::ASCIIToUTF16("Foo"), - gfx::kGoogleBlue600); + const tab_groups::TabGroupVisualData group2_data( + base::ASCIIToUTF16("Foo"), tab_groups::TabGroupColorId::kBlue); tsm->group_model()->GetTabGroup(group2)->SetVisualData(group2_data); Browser* const new_browser = QuitBrowserAndRestore(browser(), 5);
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc index dba9415..4a69077 100644 --- a/chrome/browser/sessions/session_service_unittest.cc +++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -39,6 +39,7 @@ #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sessions/core/session_command.h" #include "components/sessions/core/session_types.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "content/public/browser/navigation_entry.h" @@ -1145,8 +1146,10 @@ tab_groups::TabGroupId::GenerateNew(), tab_groups::TabGroupId::GenerateNew()}; const std::array<tab_groups::TabGroupVisualData, kNumGroups> visual_data = { - tab_groups::TabGroupVisualData(base::ASCIIToUTF16("Foo"), SK_ColorBLUE), - tab_groups::TabGroupVisualData(base::ASCIIToUTF16("Bar"), SK_ColorGREEN)}; + tab_groups::TabGroupVisualData(base::ASCIIToUTF16("Foo"), + tab_groups::TabGroupColorId::kBlue), + tab_groups::TabGroupVisualData(base::ASCIIToUTF16("Bar"), + tab_groups::TabGroupColorId::kGreen)}; // Create |kNumGroups| tab groups, each with one tab. for (int group_ndx = 0; group_ndx < kNumGroups; ++group_ndx) {
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc index 715b57d..236930c 100644 --- a/chrome/browser/sessions/tab_restore_browsertest.cc +++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -39,6 +39,7 @@ #include "components/keep_alive_registry/scoped_keep_alive.h" #include "components/sessions/core/tab_restore_service.h" #include "components/sessions/core/tab_restore_service_observer.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "content/public/browser/navigation_controller.h" @@ -917,8 +918,8 @@ const int grouped_tab_index = tab_count - 1; tab_groups::TabGroupId group_id = browser()->tab_strip_model()->AddToNewGroup({grouped_tab_index}); - const tab_groups::TabGroupVisualData visual_data(base::ASCIIToUTF16("Foo"), - SK_ColorCYAN); + const tab_groups::TabGroupVisualData visual_data( + base::ASCIIToUTF16("Foo"), tab_groups::TabGroupColorId::kCyan); TabGroup* group = browser()->tab_strip_model()->group_model()->GetTabGroup(group_id); @@ -951,10 +952,10 @@ tab_groups::TabGroupId group_id = browser()->tab_strip_model()->AddToNewGroup({0, 1}); - const tab_groups::TabGroupVisualData visual_data_1(base::ASCIIToUTF16("Foo1"), - SK_ColorCYAN); - const tab_groups::TabGroupVisualData visual_data_2(base::ASCIIToUTF16("Foo2"), - SK_ColorCYAN); + const tab_groups::TabGroupVisualData visual_data_1( + base::ASCIIToUTF16("Foo1"), tab_groups::TabGroupColorId::kCyan); + const tab_groups::TabGroupVisualData visual_data_2( + base::ASCIIToUTF16("Foo2"), tab_groups::TabGroupColorId::kCyan); TabGroup* group = browser()->tab_strip_model()->group_model()->GetTabGroup(group_id); @@ -988,13 +989,13 @@ tab_groups::TabGroupId group1 = browser()->tab_strip_model()->AddToNewGroup( {tab_count - 3, tab_count - 2}); tab_groups::TabGroupVisualData group1_data(base::ASCIIToUTF16("Foo"), - SK_ColorRED); + tab_groups::TabGroupColorId::kRed); group_model->GetTabGroup(group1)->SetVisualData(group1_data); tab_groups::TabGroupId group2 = browser()->tab_strip_model()->AddToNewGroup({tab_count - 1}); - tab_groups::TabGroupVisualData group2_data(base::ASCIIToUTF16("Bar"), - SK_ColorBLUE); + tab_groups::TabGroupVisualData group2_data( + base::ASCIIToUTF16("Bar"), tab_groups::TabGroupColorId::kBlue); group_model->GetTabGroup(group2)->SetVisualData(group2_data); CloseBrowserSynchronously(browser());
diff --git a/chrome/browser/subresource_filter/BUILD.gn b/chrome/browser/subresource_filter/BUILD.gn index f838a1cb..b657fad4 100644 --- a/chrome/browser/subresource_filter/BUILD.gn +++ b/chrome/browser/subresource_filter/BUILD.gn
@@ -15,7 +15,9 @@ android_library("subresource_filter_java_test_support") { testonly = true - java_files = [ "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/TestRulesetPublisher.java" ] + sources = [ + "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/TestRulesetPublisher.java", + ] deps = [ "//base:base_java", ] @@ -23,7 +25,9 @@ android_library("subresource_filter_javatests") { testonly = true - java_files = [ "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java" ] + sources = [ + "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java", + ] deps = [ ":subresource_filter_java_test_support", "//base:base_java_test_support",
diff --git a/chrome/browser/touch_to_fill/android/BUILD.gn b/chrome/browser/touch_to_fill/android/BUILD.gn index 2667e400..d938f9e 100644 --- a/chrome/browser/touch_to_fill/android/BUILD.gn +++ b/chrome/browser/touch_to_fill/android/BUILD.gn
@@ -35,16 +35,18 @@ "//ui/android:ui_java", ] - java_files = [ - "java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java", + sources = [ "java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java", + "java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java", ] } junit_binary("touch_to_fill_junit_tests") { testonly = true - java_files = [ "junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java" ] + sources = [ + "junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java", + ] deps = [ "//base:base_java_test_support", @@ -60,7 +62,7 @@ android_library("test_java") { testonly = true - java_files = [ + sources = [ "javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java", ]
diff --git a/chrome/browser/touch_to_fill/android/internal/BUILD.gn b/chrome/browser/touch_to_fill/android/internal/BUILD.gn index 6e01b6b8..b1650ad5 100644 --- a/chrome/browser/touch_to_fill/android/internal/BUILD.gn +++ b/chrome/browser/touch_to_fill/android/internal/BUILD.gn
@@ -20,7 +20,7 @@ "//ui/android:ui_java", ] - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java", "java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillCoordinator.java", "java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java",
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb index b358b98..d3fbc6c 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচী।</translation> <translation id="5441504010984421144">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচীখন সম্পূৰ্ণ উচ্চতাত খোল খাইছে।</translation> <translation id="5624120631404540903">পাছৱৰ্ড সলনি কৰক</translation> +<translation id="804577341878669140">একাউণ্টটোৰ সৈতে অব্যাহত ৰাখক</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb index 9f78b43e..09c369f9 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="5441504010984421144">Tam hündürlükdə açılan toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="5624120631404540903">Parolları idarə edin</translation> +<translation id="804577341878669140">Hesaba davam edin</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_be.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_be.xtb index c83a56f..69cd68d 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_be.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_be.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Спіс уліковых даных, якія трэба ўнесці па націсканні.</translation> <translation id="5441504010984421144">Спіс уліковых даных, якія трэба ўнесці па націсканні, адкрыты на ўвесь экран.</translation> <translation id="5624120631404540903">Кіраваць паролямі</translation> +<translation id="804577341878669140">Працягнуць, выкарыстаўшы ўліковы запіс</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bg.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bg.xtb index 109da59..3acaadb 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bg.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bg.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Списък с идентификационни данни, които да бъдат попълнени при докосване.</translation> <translation id="5441504010984421144">Списъкът с идентификационни данни, които да бъдат попълнени при докосване, е отворен на пълната височина.</translation> <translation id="5624120631404540903">Управление на паролите</translation> +<translation id="804577341878669140">Продължете с профил</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb index 3ccfed1..9029600 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb
@@ -8,5 +8,5 @@ <translation id="3399357656427473483">Lista akreditiva za popunjavanje dodirom.</translation> <translation id="5441504010984421144">Lista akreditiva za popunjavanje dodirom je otvorena na cijelom ekranu.</translation> <translation id="5624120631404540903">Upravljajte lozinkama</translation> -<translation id="804577341878669140">Nastavite uz račun</translation> +<translation id="804577341878669140">Nastavite s računom</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb index 5c78417..dfdcf338 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Llista de credencials que s'emplenaran amb un toc.</translation> <translation id="5441504010984421144">La llista de credencials que s'emplenaran amb un toc està oberta i ocupa tota la pantalla.</translation> <translation id="5624120631404540903">Gestiona les contrasenyes</translation> +<translation id="804577341878669140">Continua amb el teu compte</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb index 6a8f30f..b2f19b4 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Seznam identifikačních údajů k vyplnění při klepnutí.</translation> <translation id="5441504010984421144">Seznam identifikačních údajů k vyplnění při klepnutí je otevřený na celou výšku.</translation> <translation id="5624120631404540903">Spravovat hesla</translation> +<translation id="804577341878669140">Pokračovat s účtem</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb index f2bcbbf6..e77ce07a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Liste over loginoplysninger, der udfyldes ved berøring.</translation> <translation id="5441504010984421144">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i fuld højde.</translation> <translation id="5624120631404540903">Administrer adgangskoder</translation> +<translation id="804577341878669140">Fortsæt med konto</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb index 5bc8d43..cda6ea7d 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist geöffnet.</translation> <translation id="5441504010984421144">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist ganz geöffnet.</translation> <translation id="5624120631404540903">Passwörter verwalten</translation> +<translation id="804577341878669140">Mit Konto fortfahren</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es-419.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es-419.xtb index dca7ee3..96137bb 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es-419.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es-419.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Lista de credenciales que se debe tocar para completar.</translation> <translation id="5441504010984421144">La lista de credenciales que se debe tocar para completar está totalmente abierta.</translation> <translation id="5624120631404540903">Administrar contraseñas</translation> +<translation id="804577341878669140">Continúa con la cuenta</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es.xtb index 8307f1fc..1f33345 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_es.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Lista de credenciales que puedes rellenar con un toque.</translation> <translation id="5441504010984421144">La lista de credenciales que puedes rellenar con un toque está abierta y ocupa toda la pantalla.</translation> <translation id="5624120631404540903">Administrar contraseñas</translation> +<translation id="804577341878669140">Continuar con la cuenta</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb index 96fcc9b..afce736 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Loend mandaatidest, mis tuleb puudutusega täita.</translation> <translation id="5441504010984421144">Loend mandaatidest, mis tuleb puudutusega täita, on avatud täiskõrgusele.</translation> <translation id="5624120631404540903">Paroolide haldamine</translation> +<translation id="804577341878669140">Jätkake selle kontoga</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb index 3d5b8f017..2b8484f3 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود.</translation> <translation id="5441504010984421144">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود کاملاً باز شد.</translation> <translation id="5624120631404540903">مدیریت گذرواژهها</translation> +<translation id="804577341878669140">ادامه دادن با حساب</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb index 4e05f4b..ef016aec 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="5441504010984421144">Nakabukas nang buo ang taas ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="5624120631404540903">Pamahalaan ang mga password</translation> +<translation id="804577341878669140">Magpatuloy gamit ang account</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fr-CA.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fr-CA.xtb index 31eda47..ef9faeb 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fr-CA.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fr-CA.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Liste d'authentifiants à remplir au toucher.</translation> <translation id="5441504010984421144">La liste d'authentifiants à remplir au toucher est ouverte à la pleine hauteur.</translation> <translation id="5624120631404540903">Gérer les mots de passe</translation> +<translation id="804577341878669140">Continuer avec le compte</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gl.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gl.xtb index 9921de8..538eea6d 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gl.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gl.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">A lista de credenciais que se completarán ao tocar.</translation> <translation id="5441504010984421144">A lista de credenciais que se completarán ao tocar está aberta a pantalla completa.</translation> <translation id="5624120631404540903">Xestionar contrasinais</translation> +<translation id="804577341878669140">Continuar coa conta</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb index c3948e9..9b460ab73 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ.</translation> <translation id="5441504010984421144">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ સંપૂર્ણ ઊંચાઈએ ખૂલી.</translation> <translation id="5624120631404540903">પાસવર્ડ્સનું સંચાલન કરો</translation> +<translation id="804577341878669140">એકાઉન્ટ સાથે ચાલુ રાખો</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hi.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hi.xtb index 92b6ed2..b4f9a3f 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hi.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hi.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">टच करके भरी जाने वाली क्रेडेंशियल की सूची.</translation> <translation id="5441504010984421144">टच करके भरी जाने वाली क्रेडेंशियल की सूची पूरी स्क्रीन में खुली हुई है.</translation> <translation id="5624120631404540903">पासवर्ड प्रबंधित करें</translation> +<translation id="804577341878669140">खाते के साथ जारी रखें</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb index 07027b5..4ae22e95 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Az érintéssel kitöltendő hitelesítő adatok listája.</translation> <translation id="5441504010984421144">Az érintéssel kitöltendő hitelesítő adatok listája teljes magasságban megnyitva.</translation> <translation id="5624120631404540903">Jelszavak kezelése</translation> +<translation id="804577341878669140">Folytatás ezzel a fiókkal</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb index 67c7209d..79aa835 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Մուտքի տվյալները, որոնք պետք է լրացվեն հպման ժամանակ։</translation> <translation id="5441504010984421144">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված են ամբողջ էկրանով:</translation> <translation id="5624120631404540903">Կառավարել գաղտնաբառերը</translation> +<translation id="804577341878669140">Շարունակել հաշվով</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb index 6e5885c4..a946ade5 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Daftar kredensial yang terisi dengan gestur sentuhan.</translation> <translation id="5441504010984421144">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka sepenuhnya.</translation> <translation id="5624120631404540903">Kelola sandi</translation> +<translation id="804577341878669140">Lanjutkan dengan akun</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb index b6af48f..18b2bc2a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">タップ操作で入力する認証情報のリスト。</translation> <translation id="5441504010984421144">タップ操作で入力する認証情報のリストが画面全体に表示されています。</translation> <translation id="5624120631404540903">パスワードを管理</translation> +<translation id="804577341878669140">次のアカウントで続行</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb index a340ede..700479f 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">შეხებისას შესავსები ავტორიზაციის მონაცემების სია.</translation> <translation id="5441504010984421144">შეხებისას შესავსები ავტორიზაციის მონაცემების სია გახსნილია სრულ სიმაღლეზე.</translation> <translation id="5624120631404540903">პაროლების მართვა</translation> +<translation id="804577341878669140">ანგარიშით გაგრძელება</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb index 60132923..ea3406e 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Түрту арқылы толтырылатын тіркелу деректері тізімі.</translation> <translation id="5441504010984421144">Түрту арқылы толтырылатын тіркелу деректері тізімі толық экранға ашылған.</translation> <translation id="5624120631404540903">Құпия сөздерді басқару</translation> +<translation id="804577341878669140">Есептік жазбамен кіру</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_km.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_km.xtb index 84a3eb0..a673f0e 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_km.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_km.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះ។</translation> <translation id="5441504010984421144">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះត្រូវបានបើកពេញអេក្រង់។</translation> <translation id="5624120631404540903">គ្រប់គ្រងពាក្យសម្ងាត់</translation> +<translation id="804577341878669140">បន្តដោយប្រើគណនី</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb index 1df5896..5783132 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">터치 시 작성되는 사용자 인증 정보 목록입니다.</translation> <translation id="5441504010984421144">터치 시 작성되는 사용자 인증 정보 목록이 전체 높이로 열렸습니다.</translation> <translation id="5624120631404540903">비밀번호 관리</translation> +<translation id="804577341878669140">계정을 사용하여 로그인</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb index 994a5d30..14900f09 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Эсептик дайындардын басып коюп толтурула турган тизмеси.</translation> <translation id="5441504010984421144">Эсептик дайындардын басып коюп толтурула турган тизмеси толугу менен ачылды.</translation> <translation id="5624120631404540903">Сырсөздөрдү башкаруу</translation> +<translation id="804577341878669140">Аккаунт менен улантуу</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb index 8c7039b..88b080d6 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຕ້ອງຕື່ມເມື່ອແຕະ.</translation> <translation id="5441504010984421144">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຈະຕື່ມເມື່ອແຕະເປີດຢູ່ລະດັບລວງສູງເຕັມຈໍ.</translation> <translation id="5624120631404540903">ຈັດການລະຫັດຜ່ານ</translation> +<translation id="804577341878669140">ສືບຕໍ່ດ້ວຍບັນຊີ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb index 640cc03cb..d95c502 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Pieskaroties aizpildāmo akreditācijas datu saraksts.</translation> <translation id="5441504010984421144">Pieskaroties aizpildāmo akreditācijas datu saraksts ir atvērts pilna ekrāna augstumā.</translation> <translation id="5624120631404540903">Pārvaldīt paroles</translation> +<translation id="804577341878669140">Lai turpinātu, apstipriniet kontu</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ml.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ml.xtb index 79c0abb..28aaf9b 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ml.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ml.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ്.</translation> <translation id="5441504010984421144">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ് പൂർണ്ണ ഉയരത്തിൽ തുറന്നിരിക്കുന്നു.</translation> <translation id="5624120631404540903">പാസ്വേഡുകൾ നിയന്ത്രിക്കുക</translation> +<translation id="804577341878669140">അക്കൗണ്ടിൽ തുടരുക</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mn.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mn.xtb index 3201ad4..66cd3c6a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mn.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mn.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалт.</translation> <translation id="5441504010984421144">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалтыг бүтэн өндрөөр нээлээ.</translation> <translation id="5624120631404540903">Нууц үгийг удирдах</translation> +<translation id="804577341878669140">Дараах бүртгэлээр үргэлжлүүлэх</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mr.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mr.xtb index ecf26e0f..f2a7486f 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mr.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_mr.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची.</translation> <translation id="5441504010984421144">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची संपूर्ण भागावर उघडली आहे.</translation> <translation id="5624120631404540903">पासवर्ड व्यवस्थापित करा</translation> +<translation id="804577341878669140">खात्यासह पुढे सुरू ठेवा</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb index 06b36f88..7c7ac306 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Listen over legitimasjon som kan fylles ut ved å trykke.</translation> <translation id="5441504010984421144">Listen over legitimasjon som kan fylles ut ved å trykke, er åpnet i full høyde.</translation> <translation id="5624120631404540903">Administrer passord</translation> +<translation id="804577341878669140">Fortsett med konto</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb index 08a8edf..08c5ea4 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ</translation> <translation id="5441504010984421144">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="5624120631404540903">ਪਾਸਵਰਡ ਵਿਵਸਥਿਤ ਕਰੋ</translation> +<translation id="804577341878669140">ਖਾਤੇ ਨਾਲ ਜਾਰੀ ਰੱਖੋ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb index c43ca01..1e98511 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Lista datelor de conectare care trebuie completate la atingere.</translation> <translation id="5441504010984421144">Lista datelor de conectare care trebuie completate la atingere este deschisă la înălțimea completă.</translation> <translation id="5624120631404540903">Gestionați parolele</translation> +<translation id="804577341878669140">Accesează contul</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb index a1326e2..f7aef30 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Список учетных данных, которые можно ввести прикосновением.</translation> <translation id="5441504010984421144">Список учетных данных, которые можно ввести прикосновением, развернут на весь экран.</translation> <translation id="5624120631404540903">Настройки паролей</translation> +<translation id="804577341878669140">Вход с аккаунтом</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sk.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sk.xtb index 9c2303a..bb088d21 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sk.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sk.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Zoznam prihlasovacích údajov na vyplnenie po klepnutí.</translation> <translation id="5441504010984421144">Zoznam prihlasovacích údajov na vyplnenie po klepnutí je otvorený na úplnú výšku.</translation> <translation id="5624120631404540903">Správa hesiel</translation> +<translation id="804577341878669140">Pokračujte pomocou účtu</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb index d2fa5c27..677e084 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Lista e kredencialeve për t'u plotësuar me prekje.</translation> <translation id="5441504010984421144">Lista e kredencialeve për t'u plotësuar me prekje është hapur në lartësi të plotë.</translation> <translation id="5624120631404540903">Menaxho fjalëkalimet</translation> +<translation id="804577341878669140">Vazhdo me llogarinë</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb index fed0967f..e294077b 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Orodha ya vitambulisho vya kujaza kwa kugusa.</translation> <translation id="5441504010984421144">Orodha ya vitambulisho vya kujaza kwa kugusa imefunguliwa kwenye skrini nzima.</translation> <translation id="5624120631404540903">Dhibiti manenosiri</translation> +<translation id="804577341878669140">Endelea kutumia akaunti</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_th.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_th.xtb index e0b41cd..a95e83e 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_th.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_th.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะ</translation> <translation id="5441504010984421144">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะเปิดอยู่ที่ระดับความสูงเต็มหน้าจอ</translation> <translation id="5624120631404540903">จัดการรหัสผ่าน</translation> +<translation id="804577341878669140">ดำเนินการต่อกับบัญชี</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb index 64e31bd..5363772 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Dokunarak doldurulacak kimlik bilgisi listesi.</translation> <translation id="5441504010984421144">Dokunarak doldurulacak kimlik bilgisi listesi tam ekranda açıldı.</translation> <translation id="5624120631404540903">Şifreleri yönet</translation> +<translation id="804577341878669140">Hesapla devam edin</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb index 3c05d9d..e4b32ab 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">ٹچ پر پُر کی جانے والی اسناد کی فہرست۔</translation> <translation id="5441504010984421144">ٹچ پر پُر کی جانے والی اسناد کی فہرست مکمل اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="5624120631404540903">پاس ورڈز کا نظم کریں</translation> +<translation id="804577341878669140">اکاؤنٹ کے ساتھ جاری رکھیں</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb index 1d67c756..8e8da2a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">Danh sách các thông tin đăng nhập mà bạn có thể chạm để điền.</translation> <translation id="5441504010984421144">Danh sách các thông tin xác thực mà bạn có thể chạm để điền đã được mở ở toàn độ cao.</translation> <translation id="5624120631404540903">Quản lý mật khẩu</translation> +<translation id="804577341878669140">Tiếp tục dùng tài khoản</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb index 18d68a0..896665a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">轻触即可填充的凭据的列表。</translation> <translation id="5441504010984421144">轻触即可填充的凭据的列表已全屏打开。</translation> <translation id="5624120631404540903">管理密码</translation> +<translation id="804577341878669140">请登录帐号以继续访问</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb index ca44a81..d32fb8e 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">㩒一下先可以填嘅憑證清單。</translation> <translation id="5441504010984421144">㩒一下先可以填嘅憑證清單,宜家顯示喺成個畫面。</translation> <translation id="5624120631404540903">管理密碼</translation> +<translation id="804577341878669140">繼續使用帳戶登入</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-TW.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-TW.xtb index fdc6ffa0..3cd4f70 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-TW.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-TW.xtb
@@ -8,4 +8,5 @@ <translation id="3399357656427473483">輕觸即可填入的憑證清單。</translation> <translation id="5441504010984421144">輕觸即可填入的憑證清單已開啟,顯示於整個畫面。</translation> <translation id="5624120631404540903">管理密碼</translation> +<translation id="804577341878669140">繼續使用帳戶登入</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/translate/translate_manager_render_view_host_android_unittest.cc b/chrome/browser/translate/translate_manager_render_view_host_android_unittest.cc index 7ad4d68..f9ec20a1 100644 --- a/chrome/browser/translate/translate_manager_render_view_host_android_unittest.cc +++ b/chrome/browser/translate/translate_manager_render_view_host_android_unittest.cc
@@ -32,7 +32,6 @@ #include "content/public/common/url_constants.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" -#include "mojo/public/cpp/bindings/binding.h" #include "url/gurl.h" class TranslateManagerRenderViewHostAndroidTest
diff --git a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc index d6b22bd..1ddf7d9 100644 --- a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc +++ b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc
@@ -60,7 +60,6 @@ #include "content/public/common/url_constants.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" -#include "mojo/public/cpp/bindings/binding.h" #include "net/base/net_errors.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 986b6cf..4329fd4 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -654,6 +654,8 @@ "android/autofill/credit_card_scanner_view_android.h", "android/chrome_http_auth_handler.cc", "android/chrome_http_auth_handler.h", + "android/chrome_javascript_app_modal_dialog_android.cc", + "android/chrome_javascript_app_modal_dialog_android.h", "android/color_chooser_dialog_android.cc", "android/content_settings/ads_blocked_infobar_delegate.cc", "android/content_settings/ads_blocked_infobar_delegate.h", @@ -715,8 +717,6 @@ "android/infobars/translate_compact_infobar.h", "android/infobars/update_password_infobar.cc", "android/infobars/update_password_infobar.h", - "android/javascript_app_modal_dialog_android.cc", - "android/javascript_app_modal_dialog_android.h", "android/javascript_dialog_android.cc", "android/javascript_dialog_android.h", "android/login_handler_android.cc", @@ -802,6 +802,7 @@ "//chrome/android/features/dev_ui:buildflags", "//chrome/browser/android/thin_webview:thin_webview", "//chrome/browser/resources/webapks:webapks_ui_resources", + "//components/app_modal/android:jni_headers", "//components/embedder_support/android:web_contents_delegate", "//components/navigation_interception", "//components/subresource_filter/core/browser", @@ -3760,6 +3761,10 @@ "ash/assistant/assistant_setup.h", "ash/assistant/assistant_state_client.cc", "ash/assistant/assistant_state_client.h", + "ash/assistant/assistant_web_view_factory_impl.cc", + "ash/assistant/assistant_web_view_factory_impl.h", + "ash/assistant/assistant_web_view_impl.cc", + "ash/assistant/assistant_web_view_impl.h", "ash/assistant/device_actions.cc", "ash/assistant/device_actions.h", "ash/assistant/proactive_suggestions_client_impl.cc", @@ -4120,6 +4125,9 @@ "webui/tab_strip/chrome_content_browser_client_tab_strip_part.h", "webui/tab_strip/tab_strip_ui.cc", "webui/tab_strip/tab_strip_ui.h", + "webui/tab_strip/tab_strip_ui_embedder.h", + "webui/tab_strip/tab_strip_ui_handler.cc", + "webui/tab_strip/tab_strip_ui_handler.h", "webui/tab_strip/tab_strip_ui_layout.cc", "webui/tab_strip/tab_strip_ui_layout.h", "webui/tab_strip/tab_strip_ui_metrics.cc",
diff --git a/chrome/browser/ui/android/appmenu/BUILD.gn b/chrome/browser/ui/android/appmenu/BUILD.gn index 85eea259..a0a3e95 100644 --- a/chrome/browser/ui/android/appmenu/BUILD.gn +++ b/chrome/browser/ui/android/appmenu/BUILD.gn
@@ -5,7 +5,7 @@ import("//chrome/android/features/android_library_factory_tmpl.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuBlocker.java", "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelper.java", "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinator.java", @@ -33,7 +33,7 @@ android_library("test_support_java") { testonly = true - java_files = [ + sources = [ "test/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTestSupport.java", "test/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuObserver.java", ]
diff --git a/chrome/browser/ui/android/appmenu/internal/BUILD.gn b/chrome/browser/ui/android/appmenu/internal/BUILD.gn index 7093ff2..af18e561 100644 --- a/chrome/browser/ui/android/appmenu/internal/BUILD.gn +++ b/chrome/browser/ui/android/appmenu/internal/BUILD.gn
@@ -5,7 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java", "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuAdapter.java", "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl.java", @@ -44,9 +44,9 @@ android_library("javatests") { testonly = true - java_files = [ - "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuAdapterTest.java", + sources = [ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuAdapterRenderTest.java", + "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuAdapterTest.java", "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java", "java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuDelegate.java", "java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuPropertiesDelegate.java", @@ -85,7 +85,9 @@ # Skip platform checks since Robolectric depends on requires_android targets. bypass_platform_checks = true testonly = true - java_files = [ "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java", + ] deps = [ ":java", "//base:base_junit_test_support",
diff --git a/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.cc b/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.cc new file mode 100644 index 0000000..793acae --- /dev/null +++ b/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.cc
@@ -0,0 +1,58 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.h" + +#include "base/android/jni_android.h" +#include "chrome/browser/android/tab_android.h" +#include "chrome/browser/ui/javascript_dialogs/chrome_javascript_native_app_modal_dialog_factory.h" +#include "components/app_modal/javascript_app_modal_dialog.h" +#include "components/app_modal/javascript_dialog_manager.h" +#include "components/app_modal/javascript_native_dialog_factory.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" + +void ChromeJavascriptAppModalDialogAndroid::ShowAppModalDialog() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + TabAndroid* tab = TabAndroid::FromWebContents(dialog()->web_contents()); + if (!tab) { + CancelAppModalDialog(); + return; + } + + DoShowAppModalDialog(tab->IsUserInteractable()); +} + +ChromeJavascriptAppModalDialogAndroid:: + ~ChromeJavascriptAppModalDialogAndroid() = default; + +namespace { + +class ChromeJavaScriptNativeDialogAndroidFactory + : public app_modal::JavaScriptNativeDialogFactory { + public: + ChromeJavaScriptNativeDialogAndroidFactory() = default; + ~ChromeJavaScriptNativeDialogAndroidFactory() override = default; + + private: + app_modal::NativeAppModalDialog* CreateNativeJavaScriptDialog( + app_modal::JavaScriptAppModalDialog* dialog) override { + dialog->web_contents()->GetDelegate()->ActivateContents( + dialog->web_contents()); + return new ChromeJavascriptAppModalDialogAndroid( + base::android::AttachCurrentThread(), dialog, + dialog->web_contents()->GetTopLevelNativeWindow()); + } + + DISALLOW_COPY_AND_ASSIGN(ChromeJavaScriptNativeDialogAndroidFactory); +}; + +} // namespace + +void InstallChromeJavaScriptNativeAppModalDialogFactory() { + app_modal::JavaScriptDialogManager::GetInstance()->SetNativeDialogFactory( + base::WrapUnique(new ChromeJavaScriptNativeDialogAndroidFactory)); +}
diff --git a/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.h b/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.h new file mode 100644 index 0000000..a3465a3f --- /dev/null +++ b/chrome/browser/ui/android/chrome_javascript_app_modal_dialog_android.h
@@ -0,0 +1,28 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ANDROID_CHROME_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ +#define CHROME_BROWSER_UI_ANDROID_CHROME_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ + +#include <memory> + +#include "base/macros.h" +#include "components/app_modal/android/javascript_app_modal_dialog_android.h" + +class ChromeJavascriptAppModalDialogAndroid + : public app_modal::JavascriptAppModalDialogAndroid { + public: + using JavascriptAppModalDialogAndroid::JavascriptAppModalDialogAndroid; + + // NativeAppModalDialog: + void ShowAppModalDialog() override; + + protected: + ~ChromeJavascriptAppModalDialogAndroid() override; + + private: + DISALLOW_COPY_AND_ASSIGN(ChromeJavascriptAppModalDialogAndroid); +}; + +#endif // CHROME_BROWSER_UI_ANDROID_CHROME_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index d4c3770..84227f6 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -195,130 +195,7 @@ </translations> <release allow_pseudo="false" seq="1"> <messages fallback_to_english="true"> - <!-- Generic strings --> - <message name="IDS_DELETED" desc='Text that announces to the user that something was deleted.'> - Deleted - </message> - <message name="IDS_OK" desc="Label for a confirm button. Used in multiple contexts. [CHAR-LIMIT=20]"> - OK - </message> - <message name="IDS_OK_GOT_IT" desc="Label of a button by which the user confirms that they read and understood the information or instructions. Used in multiple contexts. [CHAR-LIMIT=20]"> - OK, got it - </message> - <message name="IDS_CANCEL" desc="Label for a cancel button. Used in multiple contexts. [CHAR-LIMIT=20]"> - Cancel - </message> - <message name="IDS_NOT_NOW" desc="Label for a not now button. Used in multiple contexts. [CHAR-LIMIT=20]"> - Not now - </message> - <message name="IDS_SAVE" desc="Label for a button to save a change. Used in multiple contexts. [CHAR-LIMIT=20]"> - Save - </message> - <message name="IDS_DETAILS_LINK" desc="In 1) Settings > Clean up computer (desktop), a link to open details of incompatible applications. In 2) Settings > Lite mode (mobile), static title for data usage breakdown." meaning="Short for 'view details'. Link; static title."> - Details - </message> - <message name="IDS_DONE" desc="Label for a button to save a change or finish editing data. Used in multiple contexts. [CHAR-LIMIT=20]"> - Done - </message> - <message name="IDS_DELETE" desc="Label for a delete button. Used in multiple contexts. [CHAR-LIMIT=20]"> - Delete - </message> - <message name="IDS_REMOVE" desc="Label for a button to remove an item (e.g. a bookmark) from a list. [CHAR-LIMIT=20]"> - Remove - </message> - <message name="IDS_RESET" desc="Label for a button to reset information you are editing to a default."> - Reset - </message> - <message name="IDS_TITLE" desc="Text indicating the title of a button or a textfield. Ued in multiple contexts. [CHAR-LIMIT=32]"> - Title - </message> - <message name="IDS_TEXT_ON" desc="Text indicating that an option is turned on. [CHAR-LIMIT=20]"> - On - </message> - <message name="IDS_TEXT_OFF" desc="Text indicating that an option is turned off. [CHAR-LIMIT=20]"> - Off - </message> - <message name="IDS_LEARN_MORE" desc="Generic label for menu item to learn more about a feature. [CHAR-LIMIT=32]"> - Learn more - </message> - <message name="IDS_MORE" desc="Generic label for a button to show more items or options. [CHAR-LIMIT=20]"> - More - </message> - <message name="IDS_CLOSE" desc="Content description for a button to close a dialog or popup" > - Close - </message> - <message name="IDS_NO_THANKS" desc="Generic label to say no thanks for a feature. [CHAR-LIMIT=32]"> - No thanks - </message> - <message name="IDS_NEXT" desc="Generic label for a button to advance to the next item. [CHAR-LIMIT=20]"> - Next - </message> - <message name="IDS_CONTINUE_BUTTON" desc="Generic label for a button to continue to the next screen. Used in multiple contexts. [CHAR-LIMIT=20]"> - Continue - </message> - <message name="IDS_SUBMIT" desc="Generic label for a button to submit data. Used in multiple contexts. [CHAR-LIMIT=20]"> - Submit - </message> - <message name="IDS_UNDO" desc="Generic label for a button to undo the previous action."> - Undo - </message> - <message name="IDS_HELP" desc="Generic label for a button that displays help for the current screen."> - Help - </message> - <message name="IDS_TODAY" desc="Generic Label saying the date is today."> - Today - </message> - <message name="IDS_YESTERDAY" desc="Generic Label saying the date is yesterday."> - Yesterday - </message> - <message name="IDS_SELECT" desc="Prompt for user to select something. [CHAR-LIMIT=20]"> - Select - </message> - <message name="IDS_ADD" desc="Prompt for the user to add something, like a new address. [CHAR-LIMIT=20]"> - Add - </message> - <message name="IDS_SHARE" desc="Content description for a button to share item(s). [CHAR-LIMIT=20]"> - Share - </message> - <message name="IDS_SEARCH" desc="The label for a search button."> - Search - </message> - <message name="IDS_SHOW_INFO" desc="The label for a info button to show info."> - Show Info - </message> - <message name="IDS_HIDE_INFO" desc="The label for a info button to hide info."> - Hide Info - </message> - <message name="IDS_COPY_LINK" desc="The label for a menu item to copy a link. [CHAR-LIMIT=30]"> - Copy link - </message> - <message name="IDS_COPIED" desc="Notification telling the user that something has been copied to the clipboard."> - Copied - </message> - <message name="IDS_TRY_AGAIN" desc="The label for a button allowing the user to try an action again. [CHAR-LIMIT=20]"> - Try again - </message> - <message name="IDS_BACK" desc="Label for a back button to return to a previous UI state or screen. Used in multiple contexts. [CHAR-LIMIT=20]"> - Back - </message> - <message name="IDS_CONFIRM" desc="Label for a confirm button. Used in multiple contexts. [CHAR-LIMIT=20]"> - Confirm - </message> - <message name="IDS_SHOW" desc="Label for a show button. Used in multiple contexts. [CHAR-LIMIT=20]"> - Show - </message> - <message name="IDS_USER" desc="Generic label for UI elements with information about user."> - User - </message> - <message name="IDS_MENU_ITEM_MOVE_UP" desc="Option in item menu. User can click the 'Move up' option to move the item up by one position in its list. [CHAR-LIMIT=24]"> - Move up - </message> - <message name="IDS_MENU_ITEM_MOVE_DOWN" desc="Option in item menu. User can click the 'Move down' option to move the item down by one position in its list. [CHAR-LIMIT=24]"> - Move down - </message> - <message name="IDS_MENU_ITEM_MOVE_TO_TOP" desc="Option in item menu. User can click the 'Move to top' option to move the item up to the top of its list. [CHAR-LIMIT=24]"> - Move to top - </message> + <!-- NOTE: Generic strings used across multiple features belong in //components/browser_ui/strings/android. --> <!-- Main Preferences --> <message name="IDS_SETTINGS" desc="Title for Chrome's Settings."> @@ -1630,17 +1507,6 @@ https://families.google.com/intl/$LOCALE/familylink/privacy/child-policy/ </message> - <!-- JavaScript dialogs --> - <message name="IDS_LEAVE" desc="Dialog button to leave the current page and navigate to a new page. [CHAR-LIMIT=20]"> - Leave - </message> - <message name="IDS_RELOAD" desc="Dialog button to reload the current page. [CHAR-LIMIT=20]"> - Reload - </message> - <message name="IDS_SUPPRESS_JS_MODAL_DIALOGS" desc="Checkbox allowing users to forgo additional prompts from a web page."> - Prevent this page from creating additional dialogs - </message> - <!-- Certificate viewer --> <message name="IDS_CERTTITLE" desc="Dialog box title for viewing security certificates. [CHAR-LIMIT=32]"> Certificate viewer
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 33bba536..b9f5f65 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">ছিংক অন কৰিবনে?</translation> <translation id="123724288017357924">কেশ্ব কৰা সমল অৱজ্ঞা কৰি বর্তমানৰ পৃষ্ঠাটো পুনৰ ল'ড কৰক</translation> <translation id="124116460088058876">অধিক ভাষা</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" />ত এম্বেড কৰা হৈছে</translation> <translation id="124678866338384709">বর্তমানৰ টেবটো বন্ধ কৰক</translation> <translation id="1258753120186372309">Google ডুডল্: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">সন্ধান আৰু অন্বেষণ কৰক</translation> @@ -94,6 +95,7 @@ <translation id="1672586136351118594">পুনৰাই নেদেখুৱাব</translation> <translation id="1692118695553449118">ছিংক অন হৈ আছে</translation> <translation id="169515064810179024">ছাইটসমূহে ম'শ্বন ছেন্সৰসমূহ এক্সেছ কৰাটো অৱৰোধ কৰক</translation> +<translation id="1711267867945983636">অব্যাহত ৰাখিবলৈ আপোনাৰ ফ’নত NFC অন কৰক</translation> <translation id="1717218214683051432">ম'শ্বন ছেন্সৰসমূহ</translation> <translation id="1718835860248848330">যোৱা ১ ঘণ্টাৰ</translation> <translation id="1736419249208073774">অন্বেষণ কৰক</translation> @@ -150,6 +152,7 @@ <translation id="2082238445998314030">ফলাফল <ph name="TOTAL_RESULTS" />ৰ ভিতৰত <ph name="RESULT_NUMBER" /></translation> <translation id="2091887806945687916">শব্দ</translation> <translation id="2096012225669085171">সকলো ডিভাইচতে ছিংক আৰু ব্যক্তিগতকৰণ কৰক</translation> +<translation id="2099625543891475722">আপোনাৰ শাৰীৰিক বৈশিষ্ট্যসমূহ, যেনে উচ্চতা</translation> <translation id="2100273922101894616">স্বয়ংক্ৰিয়ভাৱে ছাইন ইন কৰক</translation> <translation id="2100314319871056947">পাঠখিনি সৰু সৰুকৈ ভাগ কৰি শ্বেয়াৰ কৰিবলৈ চেষ্টা কৰক</translation> <translation id="2107397443965016585">ছাইটসমূহক সুৰক্ষিত সমল প্লে’ কৰাৰ অনুমতি দিয়াৰ আগতে সোধক (আমি চুপাৰিছ কৰোঁ)</translation> @@ -480,6 +483,7 @@ <translation id="4634124774493850572">পাছৱৰ্ড দিয়ক</translation> <translation id="4645575059429386691">আপোনাৰ অভিভাৱকৰ দ্বাৰা পৰিচালিত</translation> <translation id="4650364565596261010">ছিষ্টেম ডিফ’ল্ট</translation> +<translation id="4660838440047236328">আপোনাৰ কোঠাটোৰ লে’আউট</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" />টা বুকমাৰ্ক মচা হ’ল</translation> <translation id="4665282149850138822">আপোনাৰ গৃহ স্ক্ৰীণত <ph name="NAME" />ক যোগ দিয়া হৈছে</translation> <translation id="4684427112815847243">সকলো ছিংক কৰক</translation> @@ -604,6 +608,7 @@ <translation id="5487521232677179737">ডেটা মচক</translation> <translation id="5494752089476963479">অননুমোদিত বা বিভ্ৰান্তিকৰ বিজ্ঞাপন দেখুওৱা ছাইটসমূহত বিজ্ঞাপন অৱৰোধ কৰক</translation> <translation id="5500777121964041360">আপোনাৰ অৱস্থানত উপলব্ধ নহ'বও পাৰে</translation> +<translation id="5505264765875738116">ছাইটসমূহে জাননী পঠিয়াবলৈ ক’ব নোৱাৰে</translation> <translation id="5512137114520586844">এই একাউণ্টটো <ph name="PARENT_NAME" />য়ে পৰিচালনা কৰে।</translation> <translation id="5514904542973294328">এই ডিভাইচটোৰ প্ৰশাসকে অক্ষম কৰিছে</translation> <translation id="5515439363601853141">আপোনাৰ পাছৱৰ্ডটো চাবলৈ আনলক কৰক</translation> @@ -701,6 +706,7 @@ <translation id="6192792657125177640">ব্যতিক্রমসমূহ</translation> <translation id="6194112207524046168">Chromeক আপোনাৰ কেমেৰা এক্সেছ কৰিবলৈ দিবলৈ <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />-তো কেমেৰা অন কৰক।</translation> <translation id="6196640612572343990">তৃতীয়-পক্ষৰ কুকিসমূহ অৱৰোধ কৰক</translation> +<translation id="6201345951596836663">লিংকটোৰ প্ৰতিলিপি কৰা হ’ল</translation> <translation id="6206551242102657620">সংযোগটো নিৰাপদ। ছাইটৰ তথ্য</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> নহয় নেকি?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> বিকল্প</translation> @@ -710,6 +716,7 @@ উদাহৰণস্বৰূপে, কিছুমান ৱেবছাইটে আপোনাক আপুনি চোৱা অন্য ৱেবছাইটসমূহৰ ওপৰত আধাৰিত নোহোৱা কিছুমান বিজ্ঞাপন প্ৰদর্শন কৰি এই অনুৰোধলৈ সঁহাৰি জনাব পাৰে। বহুতো ৱেবছাইটে তথাপিও আপোনাৰ ব্ৰাউজিং ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব - উদাহৰণস্বৰূপে সুৰক্ষা উন্নত কৰিবলৈ, সমলৰ লগতে বিজ্ঞাপন তথা চুপাৰিছ প্ৰদান কৰিবলৈ আৰু ৰিপ’র্টিং কৰা পৰিসংখ্যা সৃষ্টি কৰিবলৈ ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব।</translation> <translation id="624789221780392884">আপডে’ট সাজু</translation> <translation id="6255999984061454636">সমলৰ পৰামৰ্শ</translation> +<translation id="6270391203985052864">ছাইটসমূহে জাননী পঠিয়াবলৈ ক’ব পাৰে</translation> <translation id="6277522088822131679">এই পৃষ্ঠাটো প্ৰিণ্ট কৰোঁতে কিবা সমস্যা হৈছিল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক।</translation> <translation id="6295158916970320988">সকলো ছাইট</translation> <translation id="629730747756840877">একাউণ্ট</translation> @@ -754,6 +761,7 @@ <translation id="6545864417968258051">ব্লুটুথ স্কেনিং</translation> <translation id="6560414384669816528">Sogouৰ জৰিয়তে সন্ধান কৰক</translation> <translation id="656065428026159829">অধিক চাওক</translation> +<translation id="6561560012278703671">নীৰৱ বাৰ্তা আদান-প্ৰদানৰ সুবিধা ব্যৱহাৰ কৰক (জাননীৰ প্ৰম্প্টসমূহে আপোনাৰ বাবে ব্যাঘাত সৃষ্টি কৰিব নোৱৰাকৈ সেইবোৰ অৱৰোধ কৰে)</translation> <translation id="6566259936974865419">Chromeএ আপোনাৰ <ph name="GIGABYTES" /> জিবি ডেটা ৰাহি কৰিছে</translation> <translation id="6573096386450695060">চিৰদিনৰ বাবে অনুমতি দিয়ক</translation> <translation id="6573431926118603307">আপুনি নিজৰ অন্য ডিভাইচসমূহৰ Chromeত খোলা টেবসমূহ ইয়াত প্ৰদর্শিত হ'ব।</translation> @@ -849,6 +857,7 @@ <translation id="729975465115245577">পাছৱৰ্ডৰ ফাইলটো সঞ্চয় কৰিবলৈ আপোনাৰ ডিভাইচত কোনো এপ্ নাই।</translation> <translation id="7302081693174882195">সবিশেষ: ছেভ কৰা ডেটাৰ পৰিমাণৰ ভিত্তিত সজোৱা হৈছে</translation> <translation id="7302486331832100261">আপুনি সাধাৰণতে জাননীসমূহ অৱৰোধ কৰে। অনুমতি দিবলৈ সবিশেষত টিপক।</translation> +<translation id="7311441321349344333">এই ডিভাইচটোৰ বাবে NFC অফ কৰা আছে। <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />ৰ NFCলৈ এইটো অন কৰক।</translation> <translation id="7328017930301109123">লাইট ম'ডত Chromeএ পৃষ্ঠা খৰতকীয়াকৈ ল'ড কৰে আৰু ৬০ শতাংশলৈকে কম ডেটা ব্যৱহাৰ কৰে।</translation> <translation id="7333031090786104871">এতিয়াও পূৰ্বৱৰ্তী ছাইট যোগ কৰি থকা হৈছে</translation> <translation id="7352939065658542140">ভিডিঅ’</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 1ac9cdcf..a9f38a67 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Sinxronizasiya ktiv edilsin?</translation> <translation id="123724288017357924">Keş məzmununu iqnor edərək cari səhifəni yenidən yükləyin</translation> <translation id="124116460088058876">Digər dillər</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> daxilində yerləşdirilib</translation> <translation id="124678866338384709">Cari paneli bağlayın</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Axtarın və kəşf edin</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Daha göstərməyin</translation> <translation id="1692118695553449118">Sinxronizasiya aktivdir</translation> <translation id="169515064810179024">Saytların hərəkət sensorlarına girişini blok edin</translation> +<translation id="1711267867945983636">Davam etmək üçün telefonunuzda NFC'ni aktiv edin</translation> <translation id="1717218214683051432">Hərəkət sensorları</translation> <translation id="1718835860248848330">Son saat</translation> <translation id="1736419249208073774">Araşdırın</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> nəticədən <ph name="RESULT_NUMBER" /></translation> <translation id="2091887806945687916">Səs</translation> <translation id="2096012225669085171">Cihazlarda sinxronizaisya edin və fərdiləşdirin</translation> +<translation id="2099625543891475722">boy kimi fiziki göstəriciləriniz</translation> <translation id="2100273922101894616">Hesaba avtomatik giriş</translation> <translation id="2100314319871056947">Mətni kiçik hissələrlə paylaşın</translation> <translation id="2107397443965016585">Saytlar qorunan kontenti oxutmazdan əvvəl icazə tələb edilsin (tövsiyyə edilir)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Parol istifadə edin</translation> <translation id="4645575059429386691">Valideyniniz tərəfindən idarə olunur</translation> <translation id="4650364565596261010">Sistem defoltu</translation> +<translation id="4660838440047236328">otağınızın tərtibatı</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> əlfəcin silindi</translation> <translation id="4665282149850138822"><ph name="NAME" /> əsas ekranınıza əlavə edildi</translation> <translation id="4684427112815847243">Hər şeyi sinxronlaşdırın</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Datanı silin</translation> <translation id="5494752089476963479">İntruziv və aldadıcı reklamlar göstərən saytlardakı reklamları bloklayın</translation> <translation id="5500777121964041360">Ərazinizdə əlçatan olmaya bilər</translation> +<translation id="5505264765875738116">Saytlar bildiriş göndərilməsini tələb edə bilməz</translation> <translation id="5512137114520586844">Bu hesab <ph name="PARENT_NAME" /> tərəfindən idarə olunur.</translation> <translation id="5514904542973294328">Bu cihazın administratoru tərəfindən deaktiv edildi</translation> <translation id="5515439363601853141">Parola baxmaq üçün kiliddən çıxarın</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">İstisnalar</translation> <translation id="6194112207524046168">Həmçinin, Chrome'un kameraya daxil olmasına icazə vermək üçün <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> kameranı aktiv edin.</translation> <translation id="6196640612572343990">Üçüncü tərəf kukiləri blok edin</translation> +<translation id="6201345951596836663">Keçid kopyalandı</translation> <translation id="6206551242102657620">Bağlantınız güvənlidir. Sayt barədə məlumat</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> deyil?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçimləri</translation> @@ -709,6 +715,7 @@ <translation id="6232535412751077445">İzlənilməyin qadağan edilməsi o deməkdir ki, sorğu brauzer trafikinizə daxil ediləcək. İstənilən effekt saytın sorğuya cavab verməsindən və sorğunun necə anlaşılmasından asılıdır. Məsələn, bəzi saytlar bu sorğuya ziyarət etdiyiniz saytlarda olmayan reklamları göstərməklə cavab verə bilər. Bir çox saytlar hələ də brauzinq datanızı toplayacaq və istifadə edəcək. Məqsədləri güvənliyin artırılması, kontent, xidmət, reklam, tövsiyə təqdim edilməsi və raport statistikasının yaradılması ola bilər.</translation> <translation id="624789221780392884">Yükləmə hazırdır</translation> <translation id="6255999984061454636">Kontent təklifləri</translation> +<translation id="6270391203985052864">Saytlar bildiriş göndərilməsini tələb edə bilər</translation> <translation id="6277522088822131679">Səhifə çap olunarkən problem oldu. Yenidən cəhd edin.</translation> <translation id="6295158916970320988">Bütün saytlar</translation> <translation id="629730747756840877">Hesab</translation> @@ -753,6 +760,7 @@ <translation id="6545864417968258051">Bluetooth skanı</translation> <translation id="6560414384669816528">Sogou ilə axtarış</translation> <translation id="656065428026159829">Daha çoxuna baxın</translation> +<translation id="6561560012278703671">Səssiz mesajlaşmadan istifadə edin (bildirişlər sizi narahat etməyəcək)</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> GB qədər yaddaşa qənaət etdi</translation> <translation id="6573096386450695060">Həmişə icazə verin</translation> <translation id="6573431926118603307">Başqa cihaz ilə Chrome'da açdığınız panellər burada görünəcək.</translation> @@ -850,6 +858,7 @@ <translation id="729975465115245577">Cihazda parollar faylını saxlamaq üçün tətbiq yoxdur.</translation> <translation id="7302081693174882195">Məlumat: Yadda saxlanmış data həcminə görə çeşidlənib</translation> <translation id="7302486331832100261">Adətən bildirişləri bloklayırsınız. İcazə vermək üçün Detallar seçiminə toxunun.</translation> +<translation id="7311441321349344333">NFC bu cihazda deaktivdir. <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> NFC'ni aktiv edin.</translation> <translation id="7328017930301109123">Layt rejimində Chrome səhifələri daha tez yükləyir və dataya 60 faizədək qənaət edir.</translation> <translation id="7333031090786104871">Əvvəlki sayt hələ əlavə olunur</translation> <translation id="7352939065658542140">VİDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 9906c2a..0703cb5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Уключыць сінхранізацыю?</translation> <translation id="123724288017357924">Перазагрузіць бягучую старонку, ігнаруючы змесціва кэша</translation> <translation id="124116460088058876">Іншыя мовы</translation> +<translation id="1242008676835033345">Убудавана на сайце <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Закрыць бягучую ўкладку</translation> <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Агляд прапанаванага змесціва і пошук</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Больш не паказваць</translation> <translation id="1692118695553449118">Сінхранізацыя ўключана</translation> <translation id="169515064810179024">Заблакіраваць сайтам доступ да датчыкаў руху</translation> +<translation id="1711267867945983636">Каб працягнуць, уключыце на тэлефоне функцыю NFC</translation> <translation id="1717218214683051432">Датчыкі руху</translation> <translation id="1718835860248848330">За апошнюю гадзіну</translation> <translation id="1736419249208073774">Агляд</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Вынік <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Гук</translation> <translation id="2096012225669085171">Сінхранізацыя і персаналізацыя на ўсіх прыладах</translation> +<translation id="2099625543891475722">вашы фізічныя характарыстыкі, такія як рост</translation> <translation id="2100273922101894616">Аўтаматычны ўваход</translation> <translation id="2100314319871056947">Паспрабуйце абагуліць тэкст меншымі кавалкамі</translation> <translation id="2107397443965016585">Пытаць, перш чым дазволіць прайграванне абароненага змесціва на сайтах (рэкамендуецца)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Выкарыстаць пароль</translation> <translation id="4645575059429386691">Пад кіраваннем вашых бацькоў</translation> <translation id="4650364565596261010">Стандартная сістэмная</translation> +<translation id="4660838440047236328">планіроўку вашага пакоя</translation> <translation id="4663756553811254707">Закладкі (<ph name="NUMBER_OF_BOOKMARKS" />) выдалены</translation> <translation id="4665282149850138822">Карыстальнік <ph name="NAME" /> дададзены на галоўны экран</translation> <translation id="4684427112815847243">Сінхранізаваць усё</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Ачысціць даныя</translation> <translation id="5494752089476963479">Блакіраваць рэкламу на сайтах, якія паказваюць назойлівую рэкламу або рэкламу, якая ўводзіць у зман</translation> <translation id="5500777121964041360">Функцыя можа быць недаступна ў вашай мясцовасці</translation> +<translation id="5505264765875738116">Сайтам забаронена запытваць дазвол на паказ апавяшчэнняў</translation> <translation id="5512137114520586844">Гэтым уліковым запісам кіруе <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Выключана адміністратарам гэтай прылады</translation> <translation id="5515439363601853141">Каб паглядзець пароль, трэба зняць блакіроўку</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Выключэнні</translation> <translation id="6194112207524046168">Каб Chrome атрымаў доступ да камеры, уключыце камеру таксама ў <ph name="BEGIN_LINK" />наладах Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Блакіраваць староннія файлы cookie</translation> +<translation id="6201345951596836663">Спасылка скапіравана</translation> <translation id="6206551242102657620">Падключэнне бяспечнае. Звесткі пра сайт</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> – гэта не вы?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation> @@ -711,6 +717,7 @@ Напрыклад, некаторыя вэб-сайты могуць пачаць паказ неперсаналізаванай рэкламы. Многія сайты працягнуць збіраць і выкарыстоўваць даныя аб вашых дзеяннях у браўзеры, напрыклад для павышэння бяспекі, паказу змесціва, рэкламы і рэкамендацый або генерацыі статыстыкі для справаздач.</translation> <translation id="624789221780392884">Абнаўленне гатовае</translation> <translation id="6255999984061454636">Рэкамендацыі па змесціве</translation> +<translation id="6270391203985052864">Сайтам дазволена запытваць дазвол на паказ апавяшчэнняў</translation> <translation id="6277522088822131679">Узнікла праблема з друкам старонкі. Паўтарыце спробу.</translation> <translation id="6295158916970320988">Усе сайты</translation> <translation id="629730747756840877">Уліковы запіс</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Пошук прылад Bluetooth</translation> <translation id="6560414384669816528">Пошук праз Sogou</translation> <translation id="656065428026159829">Яшчэ</translation> +<translation id="6561560012278703671">Забараніць сайтам адцягваць вашу ўвагу запытамі дазволу на паказ апавяшчэнняў. Паказваць замест іх індыкатар блакіроўкі ў адрасным радку</translation> <translation id="6566259936974865419">Chrome сэканоміў вам <ph name="GIGABYTES" /> ГБ</translation> <translation id="6573096386450695060">Заўсёды дазваляць</translation> <translation id="6573431926118603307">Тут з'явяцца ўкладкі, адкрытыя вамі ў браўзеры Chrome на іншых прыладах.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">На вашай прыладзе няма праграмы для захоўвання файла з паролямі.</translation> <translation id="7302081693174882195">Падрабязныя звесткі: Адсартавана па аб'ёме захаваных даных</translation> <translation id="7302486331832100261">Звычайна вы блакіруеце апавяшчэнні. Каб дазволіць іх, націсніце "Падрабязнасці".</translation> +<translation id="7311441321349344333">Функцыя NFC выключана на гэтай прыладзе. Уключыць яе можна ў <ph name="BEGIN_LINK" />Наладах Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">У спрошчаным рэжыме Chrome загружае старонкі хутчэй і зніжае выкарыстанне трафіка максімум на 60 працэнтаў.</translation> <translation id="7333031090786104871">Ідзе дадаванне папярэдняга сайта</translation> <translation id="7352939065658542140">ВІДЭА</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 0f8719348..4cd5cdf91 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Да се включи ли синхронизирането?</translation> <translation id="123724288017357924">Презареждане на страницата (кешът се пренебрегва)</translation> <translation id="124116460088058876">Още езици</translation> +<translation id="1242008676835033345">Вграден в <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Затваряне на текущия раздел</translation> <translation id="1258753120186372309">Драскулка на Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Търсене и разглеждане</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Да не се показва отново</translation> <translation id="1692118695553449118">Синхронизирането е включено</translation> <translation id="169515064810179024">Блокиране на достъпа на сайтовете до сензорите за движение</translation> +<translation id="1711267867945983636">За да продължите, включете NFC на телефона си</translation> <translation id="1717218214683051432">Сензори за движение</translation> <translation id="1718835860248848330">Последния час</translation> <translation id="1736419249208073774">Разглеждане</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> от <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Звук</translation> <translation id="2096012225669085171">Синхронизиране и персонализиране на всички устройства</translation> +<translation id="2099625543891475722">физическите ви черти, като ръст;</translation> <translation id="2100273922101894616">Автоматичен вход</translation> <translation id="2100314319871056947">Опитайте да споделите текста на по-малки части</translation> <translation id="2107397443965016585">Запитване преди разрешаване на сайтовете да възпроизвеждат защитено съдържание (препоръчително)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Използване на паролата</translation> <translation id="4645575059429386691">Управлява се от ваш родител</translation> <translation id="4650364565596261010">Стандартно за системата</translation> +<translation id="4660838440047236328">плана на стаята ви.</translation> <translation id="4663756553811254707">Изтрихте <ph name="NUMBER_OF_BOOKMARKS" /> отметки</translation> <translation id="4665282149850138822">Добавихте <ph name="NAME" /> към началния екран</translation> <translation id="4684427112815847243">Синхронизиране на всичко</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Изчиств. на данните</translation> <translation id="5494752089476963479">Блокиране на рекламите от сайтове, на които се показват натрапчиви или подвеждащи реклами</translation> <translation id="5500777121964041360">Може да не се предлага за местоположението ви</translation> +<translation id="5505264765875738116">Сайтовете не могат да извеждат подкани за изпращане на известия</translation> <translation id="5512137114520586844">Този профил се управлява от <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Деактивирано от администратора на това устройство</translation> <translation id="5515439363601853141">Отключете, за да видите паролата си</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Изключения</translation> <translation id="6194112207524046168">За да разрешите на Chrome да осъществява достъп до камерата ви, тя трябва да бъде включена и от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Блокиране на „бисквитките“ на трети страни</translation> +<translation id="6201345951596836663">Връзката е копирана</translation> <translation id="6206551242102657620">Връзката е защитена. Информация за сайта</translation> <translation id="6210748933810148297">Не сте <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Опции за <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Някои уебсайтове например може да отговорят на тази заявка, като ви покажат реклами, които не се базират на други посетени от вас сайтове. Много уебсайтове ще продължат да събират и използват данните ви за сърфиране – например с цел подобряване на сигурността, предоставяне на съдържание, реклами и препоръки и генериране на статистически данни за отчитане.</translation> <translation id="624789221780392884">Актуализацията е готова</translation> <translation id="6255999984061454636">Предложения за съдържание</translation> +<translation id="6270391203985052864">Сайтовете могат да извеждат подкани за изпращане на известия</translation> <translation id="6277522088822131679">При отпечатването на страницата възникна проблем. Моля, опитайте отново.</translation> <translation id="6295158916970320988">Всички сайтове</translation> <translation id="629730747756840877">Профил</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Сканиране за устройства с Bluetooth</translation> <translation id="6560414384669816528">Търсене със Sogou</translation> <translation id="656065428026159829">Вижте още</translation> +<translation id="6561560012278703671">Използване на по-малко натрапчиви съобщения (подканите за известия се блокират, така че да не ви прекъсват)</translation> <translation id="6566259936974865419">Chrome ви спести <ph name="GIGABYTES" /> ГБ</translation> <translation id="6573096386450695060">Разрешаване винаги</translation> <translation id="6573431926118603307">Тук ще се показват разделите, които сте отворили в Chrome на другите си устройства.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">На устройството ви няма приложение за съхраняване на файла с паролите.</translation> <translation id="7302081693174882195">Подробности: сортирани по количество спестени данни</translation> <translation id="7302486331832100261">Обикновено блокирате известията. За да разрешите, докоснете „Подробности“.</translation> +<translation id="7311441321349344333">Функцията за NFC е изключена на това устройство. Включете я от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">В олекотения режим на Chrome страниците се зареждат по-бързо и се използват до 60 процента по-малко данни.</translation> <translation id="7333031090786104871">Още се добавя предишният сайт</translation> <translation id="7352939065658542140">ВИДЕОКЛИП</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index b820489..311e0676 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -96,7 +96,7 @@ <translation id="1672586136351118594">Ne prikazuj ponovo</translation> <translation id="1692118695553449118">Sinhronizacija je uključena</translation> <translation id="169515064810179024">Blokiraj web lokacijama pristup senzorima pokreta</translation> -<translation id="1711267867945983636">Da biste nastavili, uključite NFC na telefonu</translation> +<translation id="1711267867945983636">Da nastavite, uključite NFC na telefonu</translation> <translation id="1717218214683051432">Senzori pokreta</translation> <translation id="1718835860248848330">Posljednji sat</translation> <translation id="1736419249208073774">Istraži</translation> @@ -153,7 +153,7 @@ <translation id="2082238445998314030">Rezultat <ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2096012225669085171">Sinhronizirajte i personalizirajte na svim uređajima</translation> -<translation id="2099625543891475722">vaše fizičke značajke, primjerice visinu</translation> +<translation id="2099625543891475722">vaše fizičke osobine, kao što je visina</translation> <translation id="2100273922101894616">Automatsko prijavljivanje</translation> <translation id="2100314319871056947">Pokušajte dijeliti tekst u manjim segmentima</translation> <translation id="2107397443965016585">Web lokacije moraju tražiti dozvolu za reprodukciju zaštićenog sadržaja (preporučeno)</translation> @@ -484,7 +484,7 @@ <translation id="4634124774493850572">Koristi lozinku</translation> <translation id="4645575059429386691">Upravlja roditelj</translation> <translation id="4650364565596261010">Zadana postavka sustava</translation> -<translation id="4660838440047236328">izgled vaše sobe</translation> +<translation id="4660838440047236328">raspored stvari u vašoj sobi</translation> <translation id="4663756553811254707">Broj izbrisanih oznaka: <ph name="NUMBER_OF_BOOKMARKS" /></translation> <translation id="4665282149850138822">Web lokacija <ph name="NAME" /> je dodana na vaš Početni ekran</translation> <translation id="4684427112815847243">Sinhroniziranje svega</translation> @@ -609,7 +609,7 @@ <translation id="5487521232677179737">Obriši podatke</translation> <translation id="5494752089476963479">Blokiraj oglase na web lokacijama koje prikazuju nametljive ili obmanjujuće oglase</translation> <translation id="5500777121964041360">Moguće je da nije dostupno na vašoj lokaciji</translation> -<translation id="5505264765875738116">Web-lokacije ne mogu postavljati pitanja o slanju obavijesti</translation> +<translation id="5505264765875738116">Web lokacije ne mogu tražiti da šalju obavještenja</translation> <translation id="5512137114520586844">Računom upravlja <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Onemogućio administrator ovog uređaja</translation> <translation id="5515439363601853141">Otključajte za prikaz zaporke</translation> @@ -707,7 +707,7 @@ <translation id="6192792657125177640">Izuzeci</translation> <translation id="6194112207524046168">Da Chromeu dozvolite pristup kameri, uključite kameru i u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation> -<translation id="6201345951596836663">Veza je kopirana</translation> +<translation id="6201345951596836663">Link je kopiran</translation> <translation id="6206551242102657620">Veza je sigurna. Informacije o web lokaciji</translation> <translation id="6210748933810148297">Vi niste <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> opcije</translation> @@ -717,7 +717,7 @@ Naprimjer, neke web lokacije mogu reagirati na ovaj zahtjev prikazivanjem oglasa koji se ne zasnivaju na drugim web lokacijama koje ste posjetili. Mnoge web lokacije će i dalje prikupljati i koristiti vaše podatke o pregledanju kako bi, naprimjer, poboljšale sigurnost, pružale sadržaje, oglase i preporuke te generirale statističke podatke za izvještaje.</translation> <translation id="624789221780392884">Ažuriranje je spremno</translation> <translation id="6255999984061454636">Prijedlozi sadržaja</translation> -<translation id="6270391203985052864">Web-lokacije mogu postavljati pitanja o slanju obavijesti</translation> +<translation id="6270391203985052864">Web lokacije mogu tražiti da šalju obavještenja</translation> <translation id="6277522088822131679">Došlo je do problema sa štampanjem stranice. Pokušajte ponovo.</translation> <translation id="6295158916970320988">Sve web-lokacije</translation> <translation id="629730747756840877">Račun</translation> @@ -762,7 +762,7 @@ <translation id="6545864417968258051">Skeniranje Bluetootha</translation> <translation id="6560414384669816528">Pretražite pomoću usluge Sogou</translation> <translation id="656065428026159829">Prikaži više</translation> -<translation id="6561560012278703671">Koristi tiše poruke (onemogućuje upitima za obavijesti da vas ometaju)</translation> +<translation id="6561560012278703671">Koristi tiše poruke (blokira upite s obavještenjima da vas ne prekidaju)</translation> <translation id="6566259936974865419">Chrome vam je sačuvao <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Uvijek dozvoli</translation> <translation id="6573431926118603307">Kartice koje ste otvorili u Chromeu na drugim uređajima prikazat će se ovdje.</translation> @@ -860,7 +860,7 @@ <translation id="729975465115245577">Na vašem uređaju nema aplikacije za pohranjivanje fajlova s lozinkama.</translation> <translation id="7302081693174882195">Detalji: Poredano po količini ušteđenih podataka</translation> <translation id="7302486331832100261">Obično blokirate obavještenja. Da dozvolite, dodirnite Detalji.</translation> -<translation id="7311441321349344333">NFC je isključen za ovaj uređaj. Uključite NFC u <ph name="BEGIN_LINK" />Androidovim postavkama<ph name="END_LINK" />.</translation> +<translation id="7311441321349344333">NFC je isključen na ovom uređaju. Uključite ga u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">U jednostavnom načinu rada, Chrome učitava stranice brže i koristi do 60 procenata manje podataka.</translation> <translation id="7333031090786104871">Prethodna web lokacija se još uvijek dodaje</translation> <translation id="7352939065658542140">VIDEOZAPIS</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index b7e0ad3..8e1ba914 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Vols activar la sincronització?</translation> <translation id="123724288017357924">Carrega pàgina actual; ignora contingut en memòria</translation> <translation id="124116460088058876">Més idiomes</translation> +<translation id="1242008676835033345">Incrustada a <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Tanca la pestanya actual</translation> <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Fes cerques i explora contingut</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">No m'ho tornis a mostrar</translation> <translation id="1692118695553449118">La sincronització està activada</translation> <translation id="169515064810179024">Impedeix que els llocs web accedeixin als sensors de moviment</translation> +<translation id="1711267867945983636">Per continuar, activa l'NFC al telèfon</translation> <translation id="1717218214683051432">Sensors de moviment</translation> <translation id="1718835860248848330">Darrera hora</translation> <translation id="1736419249208073774">Explora</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">So</translation> <translation id="2096012225669085171">Sincronitza i personalitza el contingut en tots els dispositius</translation> +<translation id="2099625543891475722">els teus trets físics, com ara l'alçada</translation> <translation id="2100273922101894616">Inici de sessió automàtic</translation> <translation id="2100314319871056947">Prova de compartir el text en fragments més petits</translation> <translation id="2107397443965016585">Pregunta'm abans de permetre que els llocs web reprodueixin contingut protegit (opció recomanada)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Fes servir la contrasenya</translation> <translation id="4645575059429386691">Gestionat pels pares</translation> <translation id="4650364565596261010">Opció predeterminada del sistema</translation> +<translation id="4660838440047236328">la distribució de la teva habitació</translation> <translation id="4663756553811254707">S'han suprimit <ph name="NUMBER_OF_BOOKMARKS" /> adreces d'interès</translation> <translation id="4665282149850138822"><ph name="NAME" /> s'ha afegit a la pantalla d'inici</translation> <translation id="4684427112815847243">Sincronitza-ho tot</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Esborra les dades</translation> <translation id="5494752089476963479">Bloqueja els anuncis als llocs web que mostren publicitat intrusiva o enganyosa</translation> <translation id="5500777121964041360">Pot ser que no estigui disponible a la teva ubicació</translation> +<translation id="5505264765875738116">Els llocs web no poden demanar-te permís per enviar-te notificacions</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> gestiona aquest compte.</translation> <translation id="5514904542973294328">Opció desactivada per l'administrador d'aquest dispositiu</translation> <translation id="5515439363601853141">Desbloqueja la pantalla per veure la contrasenya</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Excepcions</translation> <translation id="6194112207524046168">Perquè Chrome pugui accedir a la càmera, també has d'activar-la a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloqueja les galetes de tercers</translation> +<translation id="6201345951596836663">S'ha copiat l'enllaç</translation> <translation id="6206551242102657620">La connexió és segura. Informació del lloc web</translation> <translation id="6210748933810148297">No ets <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opcions per a <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud mostrant-te anuncis que no estiguin basats en altres llocs web que hagis visitat. Molts llocs web continuaran recopilant i utilitzant les teves dades de navegació (per exemple, per millorar la seguretat, per proporcionar contingut, anuncis i recomanacions i per generar estadístiques).</translation> <translation id="624789221780392884">Actualització a punt.</translation> <translation id="6255999984061454636">Suggeriments de contingut</translation> +<translation id="6270391203985052864">Els llocs web poden demanar-te permís per enviar-te notificacions</translation> <translation id="6277522088822131679">S'ha produït un problema en imprimir la pàgina. Torneu-ho a provar.</translation> <translation id="6295158916970320988">Tots els llocs web</translation> <translation id="629730747756840877">Compte</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Cerca de dispositius Bluetooth</translation> <translation id="6560414384669816528">Cerca amb Sogou</translation> <translation id="656065428026159829">Mostra'n més</translation> +<translation id="6561560012278703671">Utilitza missatges més silenciosos (bloqueja les sol·licituds de notificacions per evitar interrupcions)</translation> <translation id="6566259936974865419">Chrome t'ha estalviat <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Permet sempre</translation> <translation id="6573431926118603307">Les pestanyes que tingueu obertes a Chrome als altres dispositius es mostraran aquí.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">El dispositiu no té cap aplicació per emmagatzemar el fitxer de contrasenyes.</translation> <translation id="7302081693174882195">Detalls: files ordenades per quantitat de dades estalviades</translation> <translation id="7302486331832100261">Normalment bloqueges les notificacions. Per permetre-les, toca Detalls.</translation> +<translation id="7311441321349344333">L'NFC està desactivada en aquest dispositiu. Activa-la a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">En el mode bàsic, Chrome carrega les pàgines més ràpidament i utilitza fins a un 60 per cent menys de dades.</translation> <translation id="7333031090786104871">Encara s'hi està afegint el lloc anterior</translation> <translation id="7352939065658542140">VÍDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 07380ff..ea6c8525 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Zapnout synchronizaci?</translation> <translation id="123724288017357924">Obnovit stránku a ignorovat obsah v mezipaměti</translation> <translation id="124116460088058876">Další jazyky</translation> +<translation id="1242008676835033345">Vloženo do <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Zavřít aktuální kartu</translation> <translation id="1258753120186372309">Sváteční logo Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Vyhledávání a prozkoumávání</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Tuto zprávu již nezobrazovat</translation> <translation id="1692118695553449118">Synchronizace je zapnuta</translation> <translation id="169515064810179024">Blokovat webům přístup k senzorům pohybu</translation> +<translation id="1711267867945983636">Chcete-li pokračovat, zapněte v telefonu NFC</translation> <translation id="1717218214683051432">Pohybová čidla</translation> <translation id="1718835860248848330">Poslední hodina</translation> <translation id="1736419249208073774">Prozkoumat</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Výsledek <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2096012225669085171">Synchronizovat a přizpůsobit na různých zařízeních</translation> +<translation id="2099625543891475722">vaše fyzické vlastnosti, například výšku,</translation> <translation id="2100273922101894616">Přihlásit se automaticky</translation> <translation id="2100314319871056947">Zkuste text sdílet po menších částech</translation> <translation id="2107397443965016585">Před povolením spuštění chráněného obsahu na webu se zeptat (doporučeno)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Použít heslo</translation> <translation id="4645575059429386691">Spravováno vaším rodičem</translation> <translation id="4650364565596261010">Výchozí nastavení systému</translation> +<translation id="4660838440047236328">rozvržení vaší místnosti.</translation> <translation id="4663756553811254707">Smazané záložky: <ph name="NUMBER_OF_BOOKMARKS" /></translation> <translation id="4665282149850138822">Na plochu byl přidán web <ph name="NAME" /></translation> <translation id="4684427112815847243">Synchronizovat vše</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Vymazat data</translation> <translation id="5494752089476963479">Blokovat reklamy na webech, které zobrazují obtěžující nebo zavádějící reklamy</translation> <translation id="5500777121964041360">Ve vaší lokalitě nemusí být k dispozici</translation> +<translation id="5505264765875738116">Weby nemohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="5512137114520586844">Tento účet je spravován uživatelem <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Zakázáno administrátorem tohoto zařízení</translation> <translation id="5515439363601853141">Chcete-li zobrazit heslo, odemkněte zařízení</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Výjimky</translation> <translation id="6194112207524046168">Chcete-li Chromu umožnit přístup k fotoaparátu, zapněte fotoaparát také v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokovat soubory cookie třetích stran</translation> +<translation id="6201345951596836663">Odkaz byl zkopírován</translation> <translation id="6206551242102657620">Připojení je zabezpečené. Informace o webu</translation> <translation id="6210748933810148297">Nejste <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation> @@ -711,6 +717,7 @@ Některé weby mohou například na tento požadavek reagovat tak, že vám zobrazí reklamy, které nejsou založeny na ostatních navštívených webových stránkách. Řada webů bude i nadále shromažďovat vaše údaje o prohlížení a používat je například ke zlepšení zabezpečení, poskytování obsahu, reklam a doporučení a ke generování statistik pro přehledy.</translation> <translation id="624789221780392884">Je připravena aktualizace</translation> <translation id="6255999984061454636">Návrhy obsahu</translation> +<translation id="6270391203985052864">Weby mohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="6277522088822131679">Při tištění stránky došlo k problému. Zkuste to prosím znovu.</translation> <translation id="6295158916970320988">Všechny weby</translation> <translation id="629730747756840877">Účet</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Vyhledávání Bluetooth</translation> <translation id="6560414384669816528">Vyhledávat pomocí Sogou</translation> <translation id="656065428026159829">Zobrazit další</translation> +<translation id="6561560012278703671">Použít méně rušivou zprávu (blokuje žádosti o zobrazení oznámení)</translation> <translation id="6566259936974865419">Chrome vám ušetřil <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Vždy povolit</translation> <translation id="6573431926118603307">Zde se objeví karty, které jste otevřeli v Chromu ve svých ostatních zařízeních.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">V zařízení není žádná aplikace, pomocí které by soubor s hesly bylo možné uložit.</translation> <translation id="7302081693174882195">Podrobnosti: Seřazeno podle množství uspořených dat</translation> <translation id="7302486331832100261">Obvykle oznámení blokujete. Chcete-li je povolit, klepněte na Podrobnosti.</translation> +<translation id="7311441321349344333">Funkce NFC je v tomto zařízení vypnutá. NFC zapnete v <ph name="BEGIN_LINK" />nastavení zařízení Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Ve zjednodušeném režimu načítá Chrome stránky rychleji a používá až o 60 procent méně dat.</translation> <translation id="7333031090786104871">Předchozí web se stále přidává</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 3fe4dfc1..bd49afb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Vil du aktivere synkronisering?</translation> <translation id="123724288017357924">Genindlæs aktuel side, og ignorer indhold gemt i cache</translation> <translation id="124116460088058876">Flere sprog</translation> +<translation id="1242008676835033345">Indlejret på <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Luk aktuel fane</translation> <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Søg, og udforsk</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Vis ikke igen</translation> <translation id="1692118695553449118">Synkronisering er slået til</translation> <translation id="169515064810179024">Bloker adgang til bevægelsessensorer på websites</translation> +<translation id="1711267867945983636">Aktivér NFC på din telefon for at fortsætte</translation> <translation id="1717218214683051432">Bevægelsessensorer</translation> <translation id="1718835860248848330">Den seneste time</translation> <translation id="1736419249208073774">Mere</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Lyd</translation> <translation id="2096012225669085171">Synkroniser og tilpas på flere enheder</translation> +<translation id="2099625543891475722">Dine fysiske træk som f.eks. højde</translation> <translation id="2100273922101894616">Automatisk login</translation> <translation id="2100314319871056947">Prøv at opdele teksten i mindre stykker</translation> <translation id="2107397443965016585">Spørg, før websites får tilladelse til at afspille beskyttet indhold (anbefales)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Brug adgangskode</translation> <translation id="4645575059429386691">Administreret af en af dine forældre</translation> <translation id="4650364565596261010">Systemstandard</translation> +<translation id="4660838440047236328">Layoutet af dit rum</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> bogmærker blev slettet</translation> <translation id="4665282149850138822"><ph name="NAME" /> blev føjet til din startskærm</translation> <translation id="4684427112815847243">Synkroniser alt</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Ryd data</translation> <translation id="5494752089476963479">Bloker annoncer på websites, der viser påtrængende eller vildledende annoncer</translation> <translation id="5500777121964041360">Funktionen er muligvis ikke tilgængelig på din placering</translation> +<translation id="5505264765875738116">Websites kan ikke spørge dig, om de må sende dig notifikationer</translation> <translation id="5512137114520586844">Denne konto administreres af <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Deaktiveret af administratoren af denne enhed</translation> <translation id="5515439363601853141">Lås op for at se din adgangskode</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Undtagelser</translation> <translation id="6194112207524046168">Aktivér også dit kamera i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" /> for at give Chrome adgang til kameraet.</translation> <translation id="6196640612572343990">Bloker cookies fra tredjeparter</translation> +<translation id="6201345951596836663">Linket blev kopieret</translation> <translation id="6206551242102657620">Forbindelsen er sikker. Websiteoplysninger</translation> <translation id="6210748933810148297">Ikke <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Valgmuligheder for <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Nogle websites kan f.eks. reagere på denne anmodning ved at vise dig annoncer, som ikke er baseret på andre websites, du har besøgt. Mange websites vil fortsat indsamle og bruge browserdata til f.eks. at forbedre sikkerheden, til at levere indhold, annoncer og anbefalinger og til at generere rapporteringsstatistik.</translation> <translation id="624789221780392884">Opdateringen er klar</translation> <translation id="6255999984061454636">Indholdsforslag</translation> +<translation id="6270391203985052864">Websites kan spørge dig, om de må sende dig notifikationer</translation> <translation id="6277522088822131679">Der opstod et problem med udskrivning af siden. Prøv igen.</translation> <translation id="6295158916970320988">Alle websites</translation> <translation id="629730747756840877">Konto</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth-scanning</translation> <translation id="6560414384669816528">Søg via Sogou</translation> <translation id="656065428026159829">Se mere</translation> +<translation id="6561560012278703671">Få lydløse meddelelser (dette sørger for, at dine notifikationsprompts ikke forstyrrer dig)</translation> <translation id="6566259936974865419">Chrome har sparet dig <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Tillad altid</translation> <translation id="6573431926118603307">Faner, du har åbnet i Chrome på dine andre enheder, vises her.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Der er ikke nogen app på din enhed, hvor filen med adgangskoder kan gemmes.</translation> <translation id="7302081693174882195">Info: Sorteret efter mængden af sparede data</translation> <translation id="7302486331832100261">Du blokerer som regel notifikationer. Tryk på Info for at give tilladelse.</translation> +<translation id="7311441321349344333">NFC er deaktiveret for denne enhed. Aktivér NFC i <ph name="BEGIN_LINK" />Indstillingerne for Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Chrome indlæser sider hurtigere og bruger op til 60 procent mindre data i Lite-tilstand.</translation> <translation id="7333031090786104871">Det forrige website er stadig ved at blive tilføjet</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 0a286c03..46696ad8f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Synchronisierung aktivieren?</translation> <translation id="123724288017357924">Aktuelle Seite neu laden, Cache-Inhalte ignorieren</translation> <translation id="124116460088058876">Weitere Sprachen</translation> +<translation id="1242008676835033345">auf <ph name="WEBSITE_URL" /> eingebettet</translation> <translation id="124678866338384709">Aktuellen Tab schließen</translation> <translation id="1258753120186372309">Google-Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Suchen und entdecken</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Nicht mehr anzeigen</translation> <translation id="1692118695553449118">Synchronisierung ist aktiviert</translation> <translation id="169515064810179024">Zugriff auf Bewegungssensoren für Websites blockieren</translation> +<translation id="1711267867945983636">Aktivieren Sie NFC auf Ihrem Smartphone, um fortzufahren</translation> <translation id="1717218214683051432">Bewegungssensoren</translation> <translation id="1718835860248848330">Letzte Stunde</translation> <translation id="1736419249208073774">Entdecken</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Ton</translation> <translation id="2096012225669085171">Geräteübergreifend synchronisieren und personalisieren</translation> +<translation id="2099625543891475722">physische Merkmale wie Ihre Größe</translation> <translation id="2100273922101894616">Automatisch anmelden</translation> <translation id="2100314319871056947">Teilen Sie den Text am besten in mehreren Abschnitten</translation> <translation id="2107397443965016585">Fragen, bevor Websites erlaubt wird, geschützten Inhalt wiederzugeben (empfohlen)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Passwort verwenden</translation> <translation id="4645575059429386691">Von deinen Eltern verwaltet</translation> <translation id="4650364565596261010">Systemstandardeinstellung</translation> +<translation id="4660838440047236328">der Grundriss Ihres Zimmers</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> Lesezeichen gelöscht</translation> <translation id="4665282149850138822"><ph name="NAME" /> wurde Ihrem Startbildschirm hinzugefügt.</translation> <translation id="4684427112815847243">Alles synchronisieren</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Daten löschen</translation> <translation id="5494752089476963479">Werbung auf Websites blockieren, auf denen aufdringliche oder irreführende Werbung angezeigt wird</translation> <translation id="5500777121964041360">In Ihrem Land möglicherweise nicht verfügbar</translation> +<translation id="5505264765875738116">Websites können nicht fragen, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="5512137114520586844">Dieses Konto wird von <ph name="PARENT_NAME" /> verwaltet.</translation> <translation id="5514904542973294328">Vom Administrator dieses Geräts deaktiviert</translation> <translation id="5515439363601853141">Entsperren, um Ihr Passwort zu sehen</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Ausnahmen</translation> <translation id="6194112207524046168">Aktivieren Sie die Kamera auch in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" />, damit Chrome auf sie zugreifen kann.</translation> <translation id="6196640612572343990">Drittanbieter-Cookies blockieren</translation> +<translation id="6201345951596836663">Link wurde kopiert.</translation> <translation id="6206551242102657620">Die Verbindung ist sicher. Websiteinformationen</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ist nicht Ihre E-Mail-Adresse?</translation> <translation id="6216432067784365534">Optionen für <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Einige Websites schalten möglicherweise Werbeanzeigen, deren Auswahl nicht darauf basiert, welche Websites Sie zuvor besucht haben. Viele Websites erfassen weiterhin Ihre Browserdaten und verwenden sie, um beispielsweise die Sicherheit zu verbessern oder Inhalte, Werbeanzeigen und Empfehlungen bereitzustellen und Statistiken für Berichte zu erstellen.</translation> <translation id="624789221780392884">Update bereit</translation> <translation id="6255999984061454636">Inhaltsvorschläge</translation> +<translation id="6270391203985052864">Websites können fragen, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="6277522088822131679">Beim Drucken der Seite ist ein Problem aufgetreten. Bitte versuchen Sie es erneut.</translation> <translation id="6295158916970320988">Alle Websites</translation> <translation id="629730747756840877">Konto</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth-Suche</translation> <translation id="6560414384669816528">Suche mit Sogou</translation> <translation id="656065428026159829">Mehr anzeigen</translation> +<translation id="6561560012278703671">Ein Symbol in der Adressleiste einblenden (störende Aufforderungen zum Anzeigen von Benachrichtigungen werden blockiert)</translation> <translation id="6566259936974865419">Dank Chrome haben Sie <ph name="GIGABYTES" /> GB eingespart</translation> <translation id="6573096386450695060">Immer zulassen</translation> <translation id="6573431926118603307">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chrome geöffnet haben.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Auf Ihrem Gerät befindet sich keine App zum Speichern der Passwortdatei.</translation> <translation id="7302081693174882195">Details: Nach der Menge der gespeicherten Daten sortiert</translation> <translation id="7302486331832100261">Normalerweise blockieren Sie Benachrichtigungen. Sie können auf Details tippen, um sie zuzulassen.</translation> +<translation id="7311441321349344333">NFC ist für dieses Gerät deaktiviert. Aktivieren Sie NFC in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Im Lite-Modus werden Seiten schneller in Chrome geladen und es werden bis zu 60 Prozent weniger Daten verbraucht.</translation> <translation id="7333031090786104871">Vorherige Website wird noch hinzugefügt</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 8ecddec..534b624 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">¿Quieres activar la sincronización?</translation> <translation id="123724288017357924">Volver a cargar página actual; ignorar contenido en caché</translation> <translation id="124116460088058876">Más idiomas</translation> +<translation id="1242008676835033345">Incorporado en <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Cerrar la pestaña actual</translation> <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Buscar y explorar</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">No volver a mostrar</translation> <translation id="1692118695553449118">La sincronización está activada.</translation> <translation id="169515064810179024">Impedir que los sitios accedan a los sensores de movimiento</translation> +<translation id="1711267867945983636">Para continuar, activa NFC en tu teléfono</translation> <translation id="1717218214683051432">Sensores de movimiento</translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1736419249208073774">Explorar</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Sonido</translation> <translation id="2096012225669085171">Sincroniza y personaliza contenido en diferentes dispositivos</translation> +<translation id="2099625543891475722">tus rasgos físicos, como la estatura</translation> <translation id="2100273922101894616">Acceso automático</translation> <translation id="2100314319871056947">Intenta compartir el texto en fragmentos más pequeños</translation> <translation id="2107397443965016585">Preguntar antes de permitir que los sitios reproduzcan contenido protegido (recomendado)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Usar contraseña</translation> <translation id="4645575059429386691">Administrado por tus padres</translation> <translation id="4650364565596261010">Predeterminado del sistema</translation> +<translation id="4660838440047236328">la disposición de tu habitación</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> favoritos eliminados</translation> <translation id="4665282149850138822">Se agregó <ph name="NAME" /> a la pantalla principal</translation> <translation id="4684427112815847243">Sincronizar todo</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Borrar datos</translation> <translation id="5494752089476963479">Bloquear anuncios de sitios que muestran anuncios intrusivos o engañosos</translation> <translation id="5500777121964041360">Es posible que no esté disponible en tu ubicación</translation> +<translation id="5505264765875738116">Los sitios no podrán preguntarte si quieres recibir notificaciones</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> administra esta cuenta.</translation> <translation id="5514904542973294328">El administrador de este dispositivo inhabilitó esta opción</translation> <translation id="5515439363601853141">Desbloquea la pantalla para ver tu contraseña</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Excepciones</translation> <translation id="6194112207524046168">Para permitir que Chrome acceda a tu cámara, actívala también en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloquear cookies de terceros</translation> +<translation id="6201345951596836663">Se copió el vínculo</translation> <translation id="6206551242102657620">La conexión es segura. Consulta la información del sitio.</translation> <translation id="6210748933810148297">¿No eres <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opciones de <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Por ejemplo, algunos sitios web pueden responder a la solicitud mediante anuncios que no están basados en otros sitios web que hayas visitado. Muchos sitios web seguirán recopilando y utilizando tus datos de navegación, por ejemplo, para mejorar la seguridad, proporcionar contenido, anuncios y recomendaciones, y generar estadísticas de informes.</translation> <translation id="624789221780392884">Actualización lista</translation> <translation id="6255999984061454636">Sugerencias de contenido</translation> +<translation id="6270391203985052864">Los sitios podrán preguntarte si quieres recibir notificaciones</translation> <translation id="6277522088822131679">Se produjo un error al imprimir la página. Vuelve a intentarlo.</translation> <translation id="6295158916970320988">Todos los sitios</translation> <translation id="629730747756840877">Cuenta</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Búsqueda de dispositivos Bluetooth</translation> <translation id="6560414384669816528">Buscar con Sogou</translation> <translation id="656065428026159829">Ver más</translation> +<translation id="6561560012278703671">Usar un tipo de aviso más discreto (bloquear las notificaciones emergentes para evitar interrupciones)</translation> <translation id="6566259936974865419">Chrome te permitió ahorrar <ph name="GIGABYTES" /> gigabytes</translation> <translation id="6573096386450695060">Permitir siempre</translation> <translation id="6573431926118603307">Aquí aparecerán las pestañas que abriste en Chrome en tus otros dispositivos.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Tu dispositivo no tiene una app que pueda almacenar el archivo de contraseñas.</translation> <translation id="7302081693174882195">Detalles: Ordenados por cantidad de datos ahorrados</translation> <translation id="7302486331832100261">Por lo general, bloqueas las notificaciones. Para permitirlas, presiona Detalles.</translation> +<translation id="7311441321349344333">La tecnología NFC está desactivada en este dispositivo. Actívala en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">En el modo lite, Chrome carga las páginas más rápido y usa hasta un 60 por ciento menos de datos.</translation> <translation id="7333031090786104871">Aún se está agregando el sitio anterior</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 55fde4a..cfffb0c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">¿Activar sincronización?</translation> <translation id="123724288017357924">Vuelve a cargar esta página sin contenido en caché</translation> <translation id="124116460088058876">Más idiomas</translation> +<translation id="1242008676835033345">Insertada en <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Cierra la pestaña actual</translation> <translation id="1258753120186372309">Doodles de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Buscar y explorar</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">No volver a mostrar</translation> <translation id="1692118695553449118">La sincronización está activada</translation> <translation id="169515064810179024">No permitir que los sitios web accedan a los sensores de movimiento</translation> +<translation id="1711267867945983636">Para continuar, activa la tecnología NFC en el teléfono</translation> <translation id="1717218214683051432">Sensores de movimiento</translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1736419249208073774">Más información</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Sonido</translation> <translation id="2096012225669085171">Sincroniza y personaliza todos tus dispositivos</translation> +<translation id="2099625543891475722">tus rasgos físicos, como tu altura</translation> <translation id="2100273922101894616">Iniciar sesión automáticamente</translation> <translation id="2100314319871056947">Prueba a compartir el texto dividiéndolo en partes más pequeñas</translation> <translation id="2107397443965016585">Preguntar antes de permitir que los sitios web reproduzcan contenido protegido (opción recomendada)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Utilizar contraseña</translation> <translation id="4645575059429386691">Administrado por uno de tus padres</translation> <translation id="4650364565596261010">Predeterminado del sistema</translation> +<translation id="4660838440047236328">la distribución de tu habitación</translation> <translation id="4663756553811254707">Se han eliminado <ph name="NUMBER_OF_BOOKMARKS" /> marcadores</translation> <translation id="4665282149850138822">Se ha añadido <ph name="NAME" /> a la pantalla de inicio</translation> <translation id="4684427112815847243">Sincronizar todo</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Borrar datos</translation> <translation id="5494752089476963479">Bloquea anuncios invasivos o engañosos en los sitios web que los muestran</translation> <translation id="5500777121964041360">Puede que no esté disponible en tu ubicación</translation> +<translation id="5505264765875738116">Los sitios web no pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="5512137114520586844">Esta cuenta está administrada por <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Inhabilitada por el administrador de este dispositivo</translation> <translation id="5515439363601853141">Desbloquea la pantalla para ver tu contraseña</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Excepciones</translation> <translation id="6194112207524046168">Para que Chrome pueda acceder a tu cámara, activa la cámara en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloquear cookies de terceros</translation> +<translation id="6201345951596836663">Enlace copiado</translation> <translation id="6206551242102657620">La conexión es segura. Información del sitio web</translation> <translation id="6210748933810148297">¿No eres <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opciones de <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Por ejemplo, algunos sitios web pueden responder a la solicitud mostrándote anuncios no basados en otros sitios web que hayas visitado. Muchos sitios web seguirán recopilando y utilizando tus datos de navegación (por ejemplo, para mejorar la seguridad, para proporcionar contenido, anuncios y recomendaciones, o para generar estadísticas de informes).</translation> <translation id="624789221780392884">Actualización lista</translation> <translation id="6255999984061454636">Sugerencias de contenido</translation> +<translation id="6270391203985052864">Los sitios web pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="6277522088822131679">Se ha producido un problema al imprimir la página. Vuelve a intentarlo.</translation> <translation id="6295158916970320988">Todos los sitios</translation> <translation id="629730747756840877">Cuenta</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Búsqueda de dispositivos Bluetooth</translation> <translation id="6560414384669816528">Realizar búsquedas con Sogou</translation> <translation id="656065428026159829">Ver más</translation> +<translation id="6561560012278703671">Usa un tipo de aviso más discreto (bloquea las notificaciones emergentes para evitar interrupciones)</translation> <translation id="6566259936974865419">Chrome te ha permitido ahorrar <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Permitir siempre</translation> <translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Tu dispositivo no tiene ninguna aplicación para almacenar el archivo de contraseñas.</translation> <translation id="7302081693174882195">Detalles: ordenados por cantidad de datos ahorrados</translation> <translation id="7302486331832100261">Sueles bloquear las notificaciones. Para permitirlas, toca Detalles.</translation> +<translation id="7311441321349344333">La tecnología NFC está desactivada en este dispositivo. Actívala en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">En el modo básico, Chrome carga las páginas más rápido y reduce el uso de datos hasta un 60 por ciento.</translation> <translation id="7333031090786104871">Aún se está añadiendo el sitio web anterior</translation> <translation id="7352939065658542140">VÍDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index bed0e75c..a03cb31 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Kas lülitada sünkroonimine sisse?</translation> <translation id="123724288017357924">Praeguse lehe uuesti laadimine, eirates vahemälus olevat sisu</translation> <translation id="124116460088058876">Rohkem keeli</translation> +<translation id="1242008676835033345">Manustatud aadressil <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Aktiivse vahelehe sulgemine</translation> <translation id="1258753120186372309">Google'i Doodle'i vigurlogo: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Otsimine ja avastamine</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Ära kuva uuesti</translation> <translation id="1692118695553449118">Sünkroonimine on sisse lülitatud</translation> <translation id="169515064810179024">Blokeeri saitide juurdepääs liikumisanduritele</translation> +<translation id="1711267867945983636">Jätkamiseks lülitage NFC oma telefonis sisse</translation> <translation id="1717218214683051432">Liikumisandurid</translation> <translation id="1718835860248848330">Viimase tunni jooksul</translation> <translation id="1736419249208073774">Avastage</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Tulemus <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Heli</translation> <translation id="2096012225669085171">Seadmete vahel sünkroonimine ja isikupärastamine</translation> +<translation id="2099625543891475722">teie füüsilised omadused, nt pikkus</translation> <translation id="2100273922101894616">Automaatne sisselogimine</translation> <translation id="2100314319871056947">Proovige teksti jagada väiksemate lõikudena</translation> <translation id="2107397443965016585">Küsi enne saidile kaitstud sisu esitamiseks loa andmist (soovitatav)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Kasuta parooli</translation> <translation id="4645575059429386691">Vanema hallatud</translation> <translation id="4650364565596261010">Süsteemi vaikeseade</translation> +<translation id="4660838440047236328">teie ruumi paigutus</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> järjehoidjat kustutati</translation> <translation id="4665282149850138822"><ph name="NAME" /> lisati teie avaekraanile</translation> <translation id="4684427112815847243">Sünkrooni kõik</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Kustuta andmed</translation> <translation id="5494752089476963479">Blokeeri reklaamid saitidel, mis kuvavad sekkuvaid või eksitavaid reklaame</translation> <translation id="5500777121964041360">Ei pruugi teie asukohas saadaval olla</translation> +<translation id="5505264765875738116">Saidid ei saa küsida luba märguannete saatmiseks</translation> <translation id="5512137114520586844">Seda kontot haldab <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Keelas selle seadme administraator</translation> <translation id="5515439363601853141">Avage oma parooli vaatamiseks</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Erandid</translation> <translation id="6194112207524046168">Selleks et anda Chrome'ile juurdepääs teie kaamerale, lülitage kaamera sisse ka <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokeeri kolmanda osapoole küpsisefailid</translation> +<translation id="6201345951596836663">Link on kopeeritud</translation> <translation id="6206551242102657620">Ühendus on turvaline. Saidi teave</translation> <translation id="6210748933810148297">Kas pole <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Üksuse <ph name="NAME_OF_LIST_ITEM" /> valikud</translation> @@ -711,6 +717,7 @@ Näiteks võivad mõned veebisaidid taotlusele reageerida nii, et näitavad teile reklaame, mis ei põhine muudel külastatud veebisaitidel. Paljud veebisaidid koguvad ning kasutavad endiselt teie sirvimisandmeid, näiteks turvalisuse parandamiseks, sisu, reklaamide ja soovituste pakkumiseks ning aruandlusstatistika loomiseks.</translation> <translation id="624789221780392884">Värskendus on valmis</translation> <translation id="6255999984061454636">Sisu soovitused</translation> +<translation id="6270391203985052864">Saidid saavad küsida luba märguannete saatmiseks</translation> <translation id="6277522088822131679">Lehe printimisel ilmnes probleem. Proovige uuesti.</translation> <translation id="6295158916970320988">Kõik saidid</translation> <translation id="629730747756840877">Konto</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetoothi otsimine</translation> <translation id="6560414384669816528">Otsi teenusega Sogou</translation> <translation id="656065428026159829">Kuva rohkem</translation> +<translation id="6561560012278703671">Kasuta vaiksemat sõnumsidet (märguandeviibad blokeeritakse)</translation> <translation id="6566259936974865419">Chrome aitas teil säästa <ph name="GIGABYTES" /> GB andmemahtu</translation> <translation id="6573096386450695060">Luba alati</translation> <translation id="6573431926118603307">Siin kuvatakse teie teistes seadmetes Chrome'is avatud vahelehed.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Seadmes pole sünkroonimiseks piisavalt salvestusruumi.</translation> <translation id="7302081693174882195">Üksikasjad: sorditud säästetud andmemahu alusel</translation> <translation id="7302486331832100261">Tavaliselt blokeerite märguanded. Lubamiseks puudutage valikut Üksikasjad.</translation> +<translation id="7311441321349344333">NFC on selle seadme puhul välja lülitatud. Lülitage NFC <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" /> sisse.</translation> <translation id="7328017930301109123">Lihtsustatud režiimis laadib Chrome lehti kiiremini ja kasutab kuni 60 protsenti vähem andmemahtu.</translation> <translation id="7333031090786104871">Eelmist saiti alles lisatakse</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 97a014f..0e3a2b78 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">همگامسازی روشن شود؟</translation> <translation id="123724288017357924">تازهسازی صفحه اصلی با نادیده گرفتن محتوای حافظه پنهان</translation> <translation id="124116460088058876">زبانهای بیشتر</translation> +<translation id="1242008676835033345">جاسازیشده در <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">بستن برگه کنونی</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">جستجو و کاوش</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">دیگر نشان داده نشود</translation> <translation id="1692118695553449118">همگامسازی روشن است</translation> <translation id="169515064810179024">سایتها نمیتوانند به حسگرهای حرکتی دسترسی داشته باشند</translation> +<translation id="1711267867945983636">برای ادامه، NFC را در تلفن روشن کنید</translation> <translation id="1717218214683051432">حسگرهای حرکتی</translation> <translation id="1718835860248848330">ساعت قبل</translation> <translation id="1736419249208073774">کاوش</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> نتیجه از <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">صدا</translation> <translation id="2096012225669085171">همگامسازی و شخصیسازی در همه دستگاهها</translation> +<translation id="2099625543891475722">ویژگیهای ظاهری شما، مانند قد</translation> <translation id="2100273922101894616">ورود به سیستم خودکار</translation> <translation id="2100314319871056947">بخشهای کوچکتری از نوشتار را به اشتراک بگذارید</translation> <translation id="2107397443965016585">قبل از اجازه به سایتها برای پخش محتوای محافظتشده سؤال شود (توصیه میشود)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">استفاده از گذرواژه</translation> <translation id="4645575059429386691">مدیریت شده توسط والدین شما</translation> <translation id="4650364565596261010">پیشفرض سیستم</translation> +<translation id="4660838440047236328">چیدمان اتاق شما</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> نشانک حذف شد</translation> <translation id="4665282149850138822"><ph name="NAME" /> به صفحه اصلی شما اضافه شد</translation> <translation id="4684427112815847243">همگامسازی همه</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">پاک کردن دادهها</translation> <translation id="5494752089476963479">آگهی سایتهایی که آگهیهای مزاحم یا گمراهکننده نشان میدهند، مسدود میشود</translation> <translation id="5500777121964041360">ممکن است در مکان شما دردسترس نباشد</translation> +<translation id="5505264765875738116">سایتها نمیتوانند برای ارسال اعلان درخواست دهند</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> این حساب را مدیریت میکند.</translation> <translation id="5514904542973294328">توسط سرپرست این دستگاه غیرفعال شده است</translation> <translation id="5515439363601853141">برای مشاهده گذرواژهتان، قفل صفحه را باز کنید</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">موارد استثنا</translation> <translation id="6194112207524046168">برای اینکه به Chrome امکان دهید به دوربین دسترسی یابد، در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> هم دوربین را روشن کنید.</translation> <translation id="6196640612572343990">مسدود کردن کوکیهای شخص ثالث</translation> +<translation id="6201345951596836663">پیوند کپی شد</translation> <translation id="6206551242102657620">اتصال امن است. اطلاعات سایت</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ایمیل شما نیست؟</translation> <translation id="6216432067784365534">گزینههای <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ مثلاً ممکن است برخی از وبسایتها با نمایش آگهیهایی که براساس وبسایتهای نیستند که بازدید کردهاید به این درخواست پاسخ دهند. بسیاری از وبسایتها همچنان دادههای محصول مرور شما را جمعآوری و استفاده میکنند — مثلاً برای بهبود امنیت، ارائه محتوا، آگهیها و توصیهها و برای ایجاد آمارهای گزارشدهی.</translation> <translation id="624789221780392884">بهروزرسانی آماده است</translation> <translation id="6255999984061454636">پیشنهادهای محتوا</translation> +<translation id="6270391203985052864">سایتها میتوانند برای ارسال اعلان درخواست دهند</translation> <translation id="6277522088822131679">در چاپ صفحه مشکلی پیش آمد. لطفاً دوباره امتحان کنید.</translation> <translation id="6295158916970320988">همه سایتها</translation> <translation id="629730747756840877">حساب</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">اسکن کردن بلوتوث</translation> <translation id="6560414384669816528">جستجو با Sogou</translation> <translation id="656065428026159829">موارد بیشتر</translation> +<translation id="6561560012278703671">استفاده از پیامرسانی کمصداتر (درخواستهای اعلان را مسدود میکند تا مزاحمتان نشود)</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> گیگابایت از دادههای شما را ذخیره کرده است</translation> <translation id="6573096386450695060">همیشه مجاز</translation> <translation id="6573431926118603307">برگههایی که در دستگاههای دیگر در Chrome باز کردهاید، در اینجا نمایان میشوند.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">دستگاه شما برنامهای برای ذخیره فایل گذرواژهها ندارد.</translation> <translation id="7302081693174882195">جزئیات: مرتبشده براساس مقدار داده صرفهجوییشده</translation> <translation id="7302486331832100261">معمولاً اعلانها را مسدود میکنید. برای مجاز کردن، روی «جزئیات» ضربه بزنید.</translation> +<translation id="7311441321349344333">NFC برای این سرویس خاموش است. NFC را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation> <translation id="7328017930301109123">در «حالت ساده»، Chrome صفحهها را سریعتر بار میکند و تا ۶۰ درصد مصرف داده را کاهش میدهد.</translation> <translation id="7333031090786104871">همچنان درحال افزودن سایت قبلی</translation> <translation id="7352939065658542140">ویدیو</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 605051b..4fb216a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">I-on ang pag-sync?</translation> <translation id="123724288017357924">I-reload ang page, balewalain ang cached content</translation> <translation id="124116460088058876">Higit pang wika</translation> +<translation id="1242008676835033345">Naka-embed sa <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Isara ang kasalukuyang tab</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Maghanap at mag-explore</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Huwag ipakitang muli</translation> <translation id="1692118695553449118">Naka-on ang pag-sync</translation> <translation id="169515064810179024">I-block ang mga site sa pag-access sa mga sensor ng paggalaw</translation> +<translation id="1711267867945983636">Para magpatuloy, i-on ang NFC sa iyong telepono</translation> <translation id="1717218214683051432">Mga sensor ng paggalaw</translation> <translation id="1718835860248848330">Huling oras</translation> <translation id="1736419249208073774">I-explore</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Tunog</translation> <translation id="2096012225669085171">Mag-sync at mag-personalize sa lahat ng device</translation> +<translation id="2099625543891475722">iyong mga pisikal na katangian, tulad ng tangkad</translation> <translation id="2100273922101894616">Awtomatikong Mag-sign in</translation> <translation id="2100314319871056947">Subukang ibahagi ang text sa mas maliliit na bahagi</translation> <translation id="2107397443965016585">Magtanong bago pahintulutan ang mga site na mag-play ng pinoprotektahang content (inirerekomenda)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Gamitin ang password</translation> <translation id="4645575059429386691">Pinamamahalaan ng iyong magulang</translation> <translation id="4650364565596261010">Default ng system</translation> +<translation id="4660838440047236328">ang layout ng iyong kwarto</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> (na) bookmark ang na-delete</translation> <translation id="4665282149850138822">Idinagdag ang <ph name="NAME" /> sa iyong Home screen</translation> <translation id="4684427112815847243">I-sync lahat</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">I-clear ang data</translation> <translation id="5494752089476963479">I-block ang mga ad sa mga site na nagpapakita ng mga nakakasagabal o nakakapanlinlang na ad</translation> <translation id="5500777121964041360">Maaaring hindi available sa iyong lokasyon</translation> +<translation id="5505264765875738116">Hindi puwedeng humiling ang mga site na magpadala ng mga notification</translation> <translation id="5512137114520586844">Pinapamahalaan ang account na ito ng <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Na-disable ng administrator ng device na ito</translation> <translation id="5515439363601853141">I-unlock upang tingnan ang iyong password</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Mga Pagbubukod</translation> <translation id="6194112207524046168">Para payagang i-access ng Chrome ang iyong camera, i-on din ang camera sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">I-block ang mga third-party na cookie</translation> +<translation id="6201345951596836663">Nakopya ang Link</translation> <translation id="6206551242102657620">Secure ang koneksyon. Impormasyon ng site</translation> <translation id="6210748933810148297">Hindi si <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Mga Opsyon sa <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Halimbawa, puwedeng tumugon ang ilang website sa kahilingang ito sa pamamagitan ng pagpapakita sa iyo ng mga ad na hindi ibinatay sa iba pang nabisita mo nang website. Kokolektahin at gagamitin pa rin ng maraming website ang iyong data sa pag-browse - halimbawa, para mapahusay ang seguridad, makapagpakita ng content, mga ad, at rekomendasyon, at makabuo ng mga istatistika sa pag-uulat.</translation> <translation id="624789221780392884">Handa na ang pag-update</translation> <translation id="6255999984061454636">Mga suhestyong content</translation> +<translation id="6270391203985052864">Puwedeng humiling ang mga site na magpadala ng mga notification</translation> <translation id="6277522088822131679">Nagkaproblema sa pag-print sa pahina. Pakisubukang muli.</translation> <translation id="6295158916970320988">Lahat ng site</translation> <translation id="629730747756840877">Account</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Pag-scan ng Bluetooth</translation> <translation id="6560414384669816528">Maghanap gamit ang Sogou</translation> <translation id="656065428026159829">Tumingin pa</translation> +<translation id="6561560012278703671">Gamitin ang mas tahimik na pagmemensahe (bina-block ang mga prompt ng notification na gumagambala sa iyo)</translation> <translation id="6566259936974865419">Nag-save ang Chrome ng <ph name="GIGABYTES" /> GB para sa iyo</translation> <translation id="6573096386450695060">Payagan sa lahat ng oras</translation> <translation id="6573431926118603307">Dito lalabas ang mga nabuksan mong tab sa Chrome sa iba mo pang mga device.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Walang app sa iyong device upang ma-store ang file ng mga password.</translation> <translation id="7302081693174882195">Mga detalye: Pinagbukud-bukod ayon sa laki ng natipid na data</translation> <translation id="7302486331832100261">Kadalasan mong bina-block ang mga notification. Para payagan, i-tap ang Mga Detalye.</translation> +<translation id="7311441321349344333">Naka-off ang NFC para sa device na ito. I-on ang NFC sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Sa Lite mode, mas mabilis na nilo-load ng Chrome ang mga page at mas kaunti nang 60 porsyento ang ginagamit nitong data.</translation> <translation id="7333031090786104871">Nagdaragdag pa rin ng nakaraang site</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 32c73e5..cd564241 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Activer la synchronisation?</translation> <translation id="123724288017357924">Actualiser la page, ignorer le contenu mis en cache</translation> <translation id="124116460088058876">Plus de langues</translation> +<translation id="1242008676835033345">Intégré sur <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Fermer l'onglet actuel</translation> <translation id="1258753120186372309">Logo commémoratif de Google : <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Rechercher et explorer</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Ne plus afficher</translation> <translation id="1692118695553449118">La synchronisation est activée</translation> <translation id="169515064810179024">Empêcher les sites d'accéder aux capteurs de mouvement</translation> +<translation id="1711267867945983636">Pour continuer, activer la NFC sur votre téléphone</translation> <translation id="1717218214683051432">Capteurs de mouvements</translation> <translation id="1718835860248848330">Dernière heure</translation> <translation id="1736419249208073774">Explorer</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Son</translation> <translation id="2096012225669085171">Profitez de la synchronisation et d'une expérience personnalisée sur tous vos appareils</translation> +<translation id="2099625543891475722">vos caractéristiques physiques, comme votre taille</translation> <translation id="2100273922101894616">Connexion automatique</translation> <translation id="2100314319871056947">Essayez de partager le texte en plusieurs parties plus petites</translation> <translation id="2107397443965016585">Demander avant d'autoriser les sites à lire du contenu protégé (recommandé)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Utiliser le mot de passe</translation> <translation id="4645575059429386691">Géré par l’un de tes parents</translation> <translation id="4650364565596261010">Paramètres par défaut</translation> +<translation id="4660838440047236328">la disposition de votre pièce</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> favoris supprimés</translation> <translation id="4665282149850138822">Le site <ph name="NAME" /> a été ajouté à votre écran d'accueil</translation> <translation id="4684427112815847243">Tout synchroniser</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Effacer les données</translation> <translation id="5494752089476963479">Bloquer les annonces sur les sites qui diffusent des annonces intrusives ou trompeuses</translation> <translation id="5500777121964041360">Il se peut que cette fonctionnalité ne soit pas offerte dans votre région</translation> +<translation id="5505264765875738116">Les sites ne peuvent pas vous demander l'autorisation d'envoyer des notifications</translation> <translation id="5512137114520586844">Ce compte est géré par <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Option désactivée par l'administrateur de cet appareil</translation> <translation id="5515439363601853141">Déverrouillez pour afficher votre mot de passe</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Exceptions</translation> <translation id="6194112207524046168">Pour autoriser Chrome à accéder à votre appareil photo, activez aussi celui-ci dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloquer les témoins de tiers</translation> +<translation id="6201345951596836663">Lien copié</translation> <translation id="6206551242102657620">La connexion est sécurisée. Renseignements sur le site</translation> <translation id="6210748933810148297">Pas <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Options de <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Par exemple, certains sites Web peuvent répondre à cette demande en diffusant des annonces qui ne sont pas déterminées en fonction des autres sites Web que vous avez consultés. Toutefois, nombre d'entre eux recueillent et utilisent vos données de navigation afin, par exemple, d'améliorer la sécurité du contenu, les annonces et des recommandations, ou encore pour générer des rapports statistiques.</translation> <translation id="624789221780392884">Une mise à jour est prête à être installée</translation> <translation id="6255999984061454636">Suggestions de contenu</translation> +<translation id="6270391203985052864">Les sites peuvent vous demander l'autorisation d'envoyer des notifications</translation> <translation id="6277522088822131679">Un problème est survenu lors de l'impression de la page. Veuillez réessayer.</translation> <translation id="6295158916970320988">Tous les sites</translation> <translation id="629730747756840877">Compte</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Recherche d'appareils Bluetooth</translation> <translation id="6560414384669816528">Utiliser Sogou pour les recherches</translation> <translation id="656065428026159829">En voir plus</translation> +<translation id="6561560012278703671">Activer l'affichage discret des messages (permet d'empêcher les notifications de vous interrompre)</translation> <translation id="6566259936974865419">Chrome vous a fait économiser <ph name="GIGABYTES" /> Go</translation> <translation id="6573096386450695060">Toujours autoriser</translation> <translation id="6573431926118603307">Les onglets déjà ouverts dans Chrome sur vos autres appareils s'afficheront ici.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Votre appareil ne dispose pas d'une application pour stocker le fichier de mots de passe.</translation> <translation id="7302081693174882195">Détails : triés par quantité de données enregistrées</translation> <translation id="7302486331832100261">Vous bloquez habituellement les notifications. Pour les autoriser, touchez Détails.</translation> +<translation id="7311441321349344333">La NFC est désactivée pour cet appareil. Activez la NFC dans le menu <ph name="BEGIN_LINK" />Paramètres Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">En mode simplifié, Chrome charge les pages plus vite et utilise jusqu'à 60 pour cent moins de données.</translation> <translation id="7333031090786104871">Ajout du site précédent toujours en cours…</translation> <translation id="7352939065658542140">VIDÉO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 83e95af..645738de 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Queres activar a sincronización?</translation> <translation id="123724288017357924">Cargar a páxina, ignorando o contido da caché</translation> <translation id="124116460088058876">Máis idiomas</translation> +<translation id="1242008676835033345">Inserido en <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Pechar a pestana actual</translation> <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Buscar e explorar</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Non mostrar outra vez</translation> <translation id="1692118695553449118">A sincronización está activada</translation> <translation id="169515064810179024">Impide que os sitios accedan aos sensores de movemento</translation> +<translation id="1711267867945983636">Para continuar, activa a NFC no teu teléfono</translation> <translation id="1717218214683051432">Sensores de movemento</translation> <translation id="1718835860248848330">Última hora</translation> <translation id="1736419249208073774">Explorar</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Son</translation> <translation id="2096012225669085171">Sincroniza e personaliza o contido en todos os dispositivos</translation> +<translation id="2099625543891475722">as túas características físicas, como a altura</translation> <translation id="2100273922101894616">Inicio de sesión automático</translation> <translation id="2100314319871056947">Proba a compartir o texto dividíndoo en fragmentos máis pequenos</translation> <translation id="2107397443965016585">Preguntar antes de permitir que os sitios reproduzan contido protexido (recomendado)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Usar contrasinal</translation> <translation id="4645575059429386691">Xestionado por teus pais</translation> <translation id="4650364565596261010">Opción predeterminada do sistema</translation> +<translation id="4660838440047236328">a distribución do teu cuarto</translation> <translation id="4663756553811254707">Elimináronse <ph name="NUMBER_OF_BOOKMARKS" /> marcadores</translation> <translation id="4665282149850138822"><ph name="NAME" /> engadiuse á túa pantalla de inicio</translation> <translation id="4684427112815847243">Sincronizar todo</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Borrar datos</translation> <translation id="5494752089476963479">Bloquear anuncios en sitios que mostran anuncios enganosos ou intrusivos</translation> <translation id="5500777121964041360">É posible que non estea dispoñible na túa localización</translation> +<translation id="5505264765875738116">Os sitios non poden pedir permiso para enviar notificacións</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> xestiona esta conta.</translation> <translation id="5514904542973294328">Desactivado polo administrador deste dispositivo</translation> <translation id="5515439363601853141">Desbloquea a pantalla para ver o teu contrasinal</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Excepcións</translation> <translation id="6194112207524046168">Para permitir que Chrome acceda á túa cámara, actívaa tamén en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloquear cookies de terceiros</translation> +<translation id="6201345951596836663">Copiouse a ligazón</translation> <translation id="6206551242102657620">A conexión é segura. Información do sitio</translation> <translation id="6210748933810148297">Non es <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opcións de <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Por exemplo, algúns sitios web poden responder a esta solicitude mostrándoche anuncios que non estean baseados noutros sitios web que visitases. Moitos sitios web seguirán recompilando e utilizando os teus datos de navegación para, por exemplo, mellorar a seguranza, fornecer contido, anuncios e recomendacións e para crear estatísticas de informes.</translation> <translation id="624789221780392884">Actualización lista</translation> <translation id="6255999984061454636">Suxestións de contido</translation> +<translation id="6270391203985052864">Os sitios poden pedir permiso para enviar notificacións</translation> <translation id="6277522088822131679">Produciuse un problema ao imprimir a páxina. Téntao de novo.</translation> <translation id="6295158916970320988">Todos os sitios</translation> <translation id="629730747756840877">Conta</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Busca de dispositivos Bluetooth</translation> <translation id="6560414384669816528">Buscar con Sogou</translation> <translation id="656065428026159829">Ver máis</translation> +<translation id="6561560012278703671">Utilizar mensaxaría máis silenciosa (impide que as notificacións te interrompan)</translation> <translation id="6566259936974865419">Chrome permitiuche aforrar <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Permitir sempre</translation> <translation id="6573431926118603307">Aquí aparecerán as pestanas que abrises en Chrome noutros dispositivos.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">O dispositivo non ten unha aplicación para almacenar o ficheiro de contrasinais.</translation> <translation id="7302081693174882195">Detalles: filas ordenadas por cantidade de datos aforrados</translation> <translation id="7302486331832100261">Adoitas bloquear as notificacións. Para permitilas, toca Detalles.</translation> +<translation id="7311441321349344333">A NFC está desactivada para este dispositivo. Actívaa na <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">No modo básico, Chrome carga as páxinas máis rápido e usa un 60 por cento menos de datos.</translation> <translation id="7333031090786104871">Aínda se está engadindo o sitio anterior</translation> <translation id="7352939065658542140">VÍDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 7cecf30..8afb984 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">સિંક કરવાનું ચાલુ કરીએ?</translation> <translation id="123724288017357924">કૅશ કરેલ કન્ટેન્ટને અવગણીને વર્તમાન પેજ ફરીથી લોડ કરો</translation> <translation id="124116460088058876">વધુ ભાષાઓ</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> પર શામેલ કર્યું</translation> <translation id="124678866338384709">વર્તમાન ટૅબ બંધ કરો</translation> <translation id="1258753120186372309">Google ડૂડલ: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">શોધો તેમજ શોધખોળ કરો</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">ફરીથી બતાવશો નહીં</translation> <translation id="1692118695553449118">સમન્વયન ચાલુ છે</translation> <translation id="169515064810179024">સાઇટને મોશન સેન્સરને ઍક્સેસ કરવાથી બ્લૉક કરો</translation> +<translation id="1711267867945983636">ચાલુ રાખવા માટે, તમારા ફોન પર NFC ચાલુ કરો</translation> <translation id="1717218214683051432">મોશન સેન્સર</translation> <translation id="1718835860248848330">છેલ્લા એક કલાક</translation> <translation id="1736419249208073774">શોધખોળ કરો</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> માંથી <ph name="RESULT_NUMBER" /> પરિણામ</translation> <translation id="2091887806945687916">ધ્વનિ</translation> <translation id="2096012225669085171">સમગ્ર ઉપકરણો પર સિંક કરો અને વ્યક્તિગત બનાવો</translation> +<translation id="2099625543891475722">તમારા શારીરિક લક્ષણો, જેમ કે ઊંચાઈ</translation> <translation id="2100273922101894616">સ્વતઃ સાઇન-ઇન</translation> <translation id="2100314319871056947">ટેક્સ્ટને નાના-નાના ટૂકડામાં શેર કરી જુઓ</translation> <translation id="2107397443965016585">સાઇટને સંરક્ષિત કન્ટેન્ટ ચલાવવાની મંજૂરી આપતા પહેલાંં પૂછો (સુઝાવ આપેલ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="4645575059429386691">તમારા માતાપિતા દ્વારા સંચાલિત</translation> <translation id="4650364565596261010">સિસ્ટમ ડિફૉલ્ટ</translation> +<translation id="4660838440047236328">તમારા રૂમનો લેઆઉટ</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> બુકમાર્ક્સ કાઢી નાખ્યાં</translation> <translation id="4665282149850138822"><ph name="NAME" /> ને તમારા હોમ સ્ક્રીન પર ઉમેરવામાં આવ્યું હતું</translation> <translation id="4684427112815847243">દરેક વસ્તુ સમન્વયિત કરો</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ડેટા સાફ કરો</translation> <translation id="5494752089476963479">ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવતી સાઇટ પરથી જાહેરાતો બ્લૉક કરો</translation> <translation id="5500777121964041360">તમારા સ્થાનમાં ઉપલબ્ધ ન હોઈ શકે</translation> +<translation id="5505264765875738116">સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકશે નહીં</translation> <translation id="5512137114520586844">આ એકાઉન્ટ <ph name="PARENT_NAME" /> દ્વારા મેનેજ થાય છે.</translation> <translation id="5514904542973294328">આ ઉપકરણના વ્યવસ્થાપકે અક્ષમ કરેલ છે</translation> <translation id="5515439363601853141">તમારો પાસવર્ડ જોવા માટે અનલૉક કરો</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">અપવાદો</translation> <translation id="6194112207524046168">Chrome તમારો કૅમેરા ઍક્સેસ કરી શકે તે માટે <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં પણ કૅમેરા ચાલુ કરો.</translation> <translation id="6196640612572343990">તૃતીય પક્ષની કુકીઝ અવરોધિત કરો</translation> +<translation id="6201345951596836663">લિંક કૉપિ કરી</translation> <translation id="6206551242102657620">કનેક્શન સુરક્ષિત છે. સાઇટની માહિતી</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> નથી?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />ના વિકલ્પો</translation> @@ -711,6 +717,7 @@ ઉદાહરણ તરીકે, કેટલીક વેબસાઇટ, તમે મુલાકાત લીધેલી બીજા વેબસાઇટ પર આધારિત ન હોય તેવી જાહેરાતો તમને બતાવીને આ વિનંતી પર પ્રતિસાદ આપી શકે છે. ઘણી વેબસાઇટ હજી પણ તમારા બ્રાઉઝિંગ ડેટાને ભેગો કરશે અને ઉપયોગ કરશે — ઉદાહરણ તરીકે સુરક્ષાને બહેતર બનાવવા, કન્ટેન્ટ, જાહેરાતો અને ભલામણો આપવા અને રિપોર્ટિંગ આંકડા જનરેટ કરવા માટે.</translation> <translation id="624789221780392884">અપડેટ તૈયાર</translation> <translation id="6255999984061454636">કન્ટેન્ટ માટેના સૂચનો</translation> +<translation id="6270391203985052864">સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકે છે</translation> <translation id="6277522088822131679">પૃષ્ઠને છાપવામાં સમસ્યા હતી. કૃપા કરીને ફરીથી પ્રયાસ કરો.</translation> <translation id="6295158916970320988">બધી સાઇટ્સ</translation> <translation id="629730747756840877">એકાઉન્ટ</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">બ્લૂટૂથ સ્કૅનિંગ</translation> <translation id="6560414384669816528">Sogou થી શોધો</translation> <translation id="656065428026159829">વધુ જુઓ</translation> +<translation id="6561560012278703671">ગુપચુપ મેસેજિંગનો ઉપયોગ કરો (તમને ખલેલ પહોંચાડે તેવા નોટિફિકેશન સંકેતોને બ્લૉક કરે છે)</translation> <translation id="6566259936974865419">Chrome એ તમારો <ph name="GIGABYTES" /> GB બચાવ્યો</translation> <translation id="6573096386450695060">હંમેશાં મંજૂરી આપો</translation> <translation id="6573431926118603307">તમારા અન્ય ઉપકરણો પર તમે Chrome માં ખોલેલા ટૅબ્સ અહીં દેખાશે.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">તમારા ઉપકરણ પાસે પાસવર્ડ ફાઇલને સ્ટોર કરવા માટેની ઍપ નથી.</translation> <translation id="7302081693174882195">વિગતો: સાચવેલ ડેટાની માત્રા દ્વારા સૉર્ટ કરેલ</translation> <translation id="7302486331832100261">તમે સામાન્ય રીતે નોટિફિકેશનને બ્લૉક કરો છો. મંજૂરી આપવા માટે, વિગતો પર ટૅપ કરો.</translation> +<translation id="7311441321349344333">આ ડિવાઇસ માટે NFC સેવા બંધ કરેલી છે. NFCને <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં ચાલુ કરો.</translation> <translation id="7328017930301109123">લાઇટ મોડમાં, Chrome પેજને વધુ ઝડપથી લોડ કરે છે અને તે 60 ટકા ઓછા ડેટાનો ઉપયોગ કરે છે.</translation> <translation id="7333031090786104871">હજીપણ પાછલી સાઇટ ઉમેરી રહ્યાં છે</translation> <translation id="7352939065658542140">વીડિયો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index f52ccf0..a1091ee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">क्या सिंक करना चालू करें?</translation> <translation id="123724288017357924">कैश सामग्री को अनदेखा कर, मौजूदा पेज फिर लोड करें</translation> <translation id="124116460088058876">ज़्यादा भाषाएं</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> पर एम्बेड किया गया</translation> <translation id="124678866338384709">वर्तमान टैब को बंद करें</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">खोजें और एक्सप्लोर करें</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">फिर से न दिखाएं</translation> <translation id="1692118695553449118">समन्वयन चालू है</translation> <translation id="169515064810179024">साइटों को हलचल पकड़ने वाले सेंसर ऐक्सेस करने से रोकें</translation> +<translation id="1711267867945983636">जारी रखने के लिए, अपने फ़ोन पर NFC चालू करें</translation> <translation id="1717218214683051432">मोशन सेंसर</translation> <translation id="1718835860248848330">अंतिम घंटा</translation> <translation id="1736419249208073774">बेहतर जानें</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2091887806945687916">आवाज़</translation> <translation id="2096012225669085171">सभी डिवाइस में सिंक करना और मनमुताबिक बनाना</translation> +<translation id="2099625543891475722">आपकी शारीरिक विशेषता, जैसे कि लंबाई</translation> <translation id="2100273922101894616">अपने आप साइन इन करने की सुविधा</translation> <translation id="2100314319871056947">टेक्स्ट को छोटे-छोटे हिस्सों में शेयर करने की कोशिश करें</translation> <translation id="2107397443965016585">साइटों को सुरक्षित सामग्री चलाने देने से पहले पूछें (ऐसा करने का सुझाव दिया जाता है)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">पासवर्ड का इस्तेमाल करें</translation> <translation id="4645575059429386691">आपके अभिभावक द्वारा प्रबंधित</translation> <translation id="4650364565596261010">सिस्टम डिफ़ॉल्ट</translation> +<translation id="4660838440047236328">आपके कमरे का लेआउट</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> बुकमार्क का पता लगा</translation> <translation id="4665282149850138822"><ph name="NAME" /> को आपकी होम स्क्रीन में जोड़ा गया था</translation> <translation id="4684427112815847243">सब कुछ सिंक करें</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">डेटा साफ़ करें</translation> <translation id="5494752089476963479">तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाने वाली साइटों पर विज्ञापन ब्लॉक करें</translation> <translation id="5500777121964041360">शायद, यह सुविधा आपके देश में उपलब्ध न हाे</translation> +<translation id="5505264765875738116">साइटें आपको सूचनाएं भेजने के लिए नहीं पूछ सकतीं</translation> <translation id="5512137114520586844">यह खाता <ph name="PARENT_NAME" /> द्वारा प्रबंधित है.</translation> <translation id="5514904542973294328">इस डिवाइस के व्यवस्थापक ने अक्षम किया है</translation> <translation id="5515439363601853141">अपना पासवर्ड देखने के लिए अनलॉक करें</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">अपवाद</translation> <translation id="6194112207524046168">Chrome को अपना कैमरा ऐक्सेस करने देने के लिए, <ph name="BEGIN_LINK" />Android की सेटिंग<ph name="END_LINK" /> में जाकर भी कैमरा चालू करें.</translation> <translation id="6196640612572343990">तीसरे पक्ष की कुकी ब्लॉक करें</translation> +<translation id="6201345951596836663">लिंक कॉपी किया गया</translation> <translation id="6206551242102657620">कनेक्शन सुरक्षित है. साइट की जानकारी</translation> <translation id="6210748933810148297">क्या <ph name="EMAIL" /> नहीं हैं?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> विकल्प</translation> @@ -711,6 +717,7 @@ उदाहरण के लिए, कुछ वेबसाइटें इस अनुरोध का जवाब आपको ऐसे विज्ञापन दिखाकर दे सकती हैं, जो उन दूसरी वेबसाइटों पर आधारित नहीं हैं जिन्हें आपने देखा है. कई वेबसाइटें अब भी आपके ब्राउज़िंग डेटा को जमा और उनका उपयोग करेंगी - उदाहरण के तौर पर, सुरक्षा को बेहतर बनाने के लिए, अपनी वेबसाइट पर सामग्री, सेवाएं, विज्ञापन और सुझाव देने के लिए और रिपोर्टिंग के आकंड़े जनरेट करने के लिए.</translation> <translation id="624789221780392884">अपडेट तैयार है</translation> <translation id="6255999984061454636">सामग्री के सुझाव</translation> +<translation id="6270391203985052864">साइटें आपको सूचनाएं भेजने के लिए पूछ सकती हैं</translation> <translation id="6277522088822131679">पेज को प्रिंट करने में समस्या थी. कृपया फिर से प्रयास करें.</translation> <translation id="6295158916970320988">सभी साइटें</translation> <translation id="629730747756840877">खाता</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">ब्लूटूथ स्कैन करना</translation> <translation id="6560414384669816528">Sogou से खोजें</translation> <translation id="656065428026159829">ज़्यादा देखें</translation> +<translation id="6561560012278703671">बिना आवाज़ के मैसेज पाएं (सूचनाओं में आवाज़ को रोकता है, ताकि आपके काम में रुकावट न आए)</translation> <translation id="6566259936974865419">Chrome ने आपके <ph name="GIGABYTES" /> जीबी की बचत की</translation> <translation id="6573096386450695060">हमेशा मंज़ूरी दें</translation> <translation id="6573431926118603307"> अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">आपके डिवाइस में पासवर्ड फ़ाइल को स्टोर करने वाला कोई ऐप्लिकेशन नहीं है.</translation> <translation id="7302081693174882195">जानकारी: बचाए गए डेटा की मात्रा के अनुसार क्रम से लगाया गया</translation> <translation id="7302486331832100261">आप आम तौर पर, सूचनाओंं पर रोक लगाते हैं. अनुमति देने के लिए, 'जानकारी' पर टैप करें.</translation> +<translation id="7311441321349344333">इस डिवाइस पर NFC बंद है. <ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में NFC चालू करें.</translation> <translation id="7328017930301109123">'लाइट मोड' में, Chrome पेजों को ज़्यादा तेज़ी से लोड करता है और 60 प्रतिशत तक कम डेटा इस्तेमाल करता है.</translation> <translation id="7333031090786104871">पिछली साइट अब भी जोड़ी जा रही है</translation> <translation id="7352939065658542140">वीडियो</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 221d93f4..fba9171 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -859,7 +859,7 @@ <translation id="7293171162284876153">Da biste pokrenuli sinkronizaciju, uključite postavku "Sinkroniziraj podatke s Chromea".</translation> <translation id="729975465115245577">Vaš uređaj nema aplikaciju za spremanje datoteke zaporki.</translation> <translation id="7302081693174882195">Pojedinosti: poredano prema količini ušteđenih podataka</translation> -<translation id="7302486331832100261">Uglavnom blokirate obavijesti. Da biste dopustili, kliknite Pojedinosti.</translation> +<translation id="7302486331832100261">Uglavnom blokirate obavijesti. Da biste ih dopustili, kliknite Pojedinosti.</translation> <translation id="7311441321349344333">NFC je isključen za ovaj uređaj. Uključite NFC u <ph name="BEGIN_LINK" />Androidovim postavkama<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">U Jednostavnom načinu Chrome učitava stranice brže i smanjuje podatkovni promet do 60 posto.</translation> <translation id="7333031090786104871">I dalje se dodaje prethodna web-lokacija</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index 98fa5f0f7..4934e9a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Bekapcsolja a szinkronizálást?</translation> <translation id="123724288017357924">Oldal újratöltése a gyorsítótárat figyelmen kívül hagyva</translation> <translation id="124116460088058876">További nyelvek…</translation> +<translation id="1242008676835033345">Beágyazva itt: <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Az aktuális lap bezárása</translation> <translation id="1258753120186372309">Google ünnepi embléma: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Keresés és felfedezés</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Ne jelenjen meg többé</translation> <translation id="1692118695553449118">Szinkronizálás bekapcsolva</translation> <translation id="169515064810179024">A mozgásérzékelőkhöz való hozzáférés letiltása a webhelyek számára</translation> +<translation id="1711267867945983636">A folytatáshoz kapcsolja be az NFC-t a telefonján</translation> <translation id="1717218214683051432">Mozgásérzékelők</translation> <translation id="1718835860248848330">Az elmúlt órából</translation> <translation id="1736419249208073774">Felfedezés</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Eredmény: <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Hang</translation> <translation id="2096012225669085171">Szinkronizálás és személyre szabás az eszközök között</translation> +<translation id="2099625543891475722">az Ön fizikai jellemzőiről, például a magasságáról;</translation> <translation id="2100273922101894616">Automatikus bejelentkezés</translation> <translation id="2100314319871056947">Próbálja meg kisebb részletekben megosztani a szöveget</translation> <translation id="2107397443965016585">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára védett tartalmak lejátszását (ajánlott)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Jelszó használata</translation> <translation id="4645575059429386691">A szülő kezeli</translation> <translation id="4650364565596261010">Alapértelmezett</translation> +<translation id="4660838440047236328">a szoba elrendezéséről.</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> könyvjelző törölve</translation> <translation id="4665282149850138822">A(z) <ph name="NAME" /> felkerült a kezdőképernyőre</translation> <translation id="4684427112815847243">Az összes szinkronizálása</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Adatok törlése</translation> <translation id="5494752089476963479">Hirdetések letiltása a tolakodó és félrevezető hirdetéseket megjelenítő webhelyeken</translation> <translation id="5500777121964041360">Előfordulhat, hogy ez a beállítás nem áll rendelkezésre az Ön tartózkodási helyén</translation> +<translation id="5505264765875738116">A webhelyek nem kérdezhetnek rá, hogy küldjenek-e Önnek értesítéseket</translation> <translation id="5512137114520586844">A fiók kezelője: <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Letiltotta az eszköz rendszergazdája</translation> <translation id="5515439363601853141">Oldja fel a képernyőzárat a jelszó megtekintéséhez</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Kivételek</translation> <translation id="6194112207524046168">Ahhoz, hogy a Chrome hozzáférhessen a kamerához, a kamerát az <ph name="BEGIN_LINK" />Android-beállítások<ph name="END_LINK" /> között is be kell kapcsolni.</translation> <translation id="6196640612572343990">Harmadik féltől származó cookie-k letiltása</translation> +<translation id="6201345951596836663">Link másolva</translation> <translation id="6206551242102657620">A kapcsolat biztonságos. Webhelyadatok</translation> <translation id="6210748933810148297">Nem <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – lehetőségek</translation> @@ -711,6 +717,7 @@ Egyes webhelyek például válaszolhatnak rá úgy, hogy olyan hirdetéseket jelenítenek meg, amelyek nem a már felkeresett egyéb webhelyeken alapulnak. Számos webhely ilyenkor is gyűjti és felhasználja a böngészési adatokat (például a biztonság növelése, továbbá tartalom, hirdetések és ajánlatok biztosítása, valamint jelentésekhez használt statisztika előállítása céljából).</translation> <translation id="624789221780392884">A frissítés készen áll</translation> <translation id="6255999984061454636">Javasolt tartalmak</translation> +<translation id="6270391203985052864">A webhelyek rákérdezhetnek, hogy küldjenek-e Önnek értesítéseket</translation> <translation id="6277522088822131679">Hiba történt az oldal nyomtatásakor. Próbálja újra.</translation> <translation id="6295158916970320988">Az összes webhely</translation> <translation id="629730747756840877">Fiók</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth-alapú keresés</translation> <translation id="6560414384669816528">Keresés a Sogou használatával</translation> <translation id="656065428026159829">Továbbiak megjelenítése</translation> +<translation id="6561560012278703671">Halkabb üzenetküldés használata (letiltja az értesítéseket, hogy ne zavarják meg Önt)</translation> <translation id="6566259936974865419">A Chrome megspórolt Önnek <ph name="GIGABYTES" /> GB-ot</translation> <translation id="6573096386450695060">Engedélyezés mindig</translation> <translation id="6573431926118603307">A más eszközökön futó Chrome böngészőben megnyitott lapok itt jelennek meg.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Az eszközön nincs olyan alkalmazás, amely tárolni tudja a jelszavakat tartalmazó fájlt.</translation> <translation id="7302081693174882195">Részletek: Megtakarított adatmennyiség szerinti rendezés</translation> <translation id="7302486331832100261">Ön általában letiltja az értesítéseket. Az engedélyezéshez koppintson a Részletek elemre.</translation> +<translation id="7311441321349344333">Az NFC ki van kapcsolva ezen az eszközön. Kapcsolja be az NFC-t az <ph name="BEGIN_LINK" />Android Beállítások alkalmazásában<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Lite módban a Chrome gyorsabban betölti az oldalakat, és akár 60 százalékkal kisebb adatforgalmat generál.</translation> <translation id="7333031090786104871">Az előző webhely hozzáadása még folyamatban van</translation> <translation id="7352939065658542140">VIDEÓ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 9638b14..c68ba97 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Միացնե՞լ համաժամացումը</translation> <translation id="123724288017357924">Վերաբեռնել ընթացիկ էջը` անտեսելով հիշապահեստի բովանդակությունը</translation> <translation id="124116460088058876">Այլ լեզուներ</translation> +<translation id="1242008676835033345">Զետեղված է <ph name="WEBSITE_URL" /> կայքում</translation> <translation id="124678866338384709">Փակել ընթացիկ ներդիրը</translation> <translation id="1258753120186372309">Google doodle՝ <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Որոնում և առաջարկներ</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Այլևս ցույց չտալ</translation> <translation id="1692118695553449118">Համաժամացումը միացված է</translation> <translation id="169515064810179024">Արգելել կայքերին օգտագործել շարժման տվիչները</translation> +<translation id="1711267867945983636">Շարունակելու համար ձեր հեռախոսում միացրեք NFC-ն</translation> <translation id="1717218214683051432">Շարժման տվիչներ</translation> <translation id="1718835860248848330">Վերջին 1 ժամվա</translation> <translation id="1736419249208073774">Ուսումնասիրել</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />-ից <ph name="TOTAL_RESULTS" /> արդյունք</translation> <translation id="2091887806945687916">Ձայն</translation> <translation id="2096012225669085171">Համաժամացում և անհատականացում բոլոր սարքերում</translation> +<translation id="2099625543891475722">ձեր ֆիզիկական բնութագրերը, օրինակ՝ հասակը</translation> <translation id="2100273922101894616">Ավտոմատ մուտք</translation> <translation id="2100314319871056947">Փորձեք ուղարկել տեքստը մաս-մաս</translation> <translation id="2107397443965016585">Հարցնել՝ նախքան թույլատրելը կայքերին նվագարկել պաշտպանված բովանդակություն (խորհուրդ է տրվում)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Օգտագործել գաղտնաբառը</translation> <translation id="4645575059429386691">Կառավարվում է ձեր ծնողի կողմից</translation> <translation id="4650364565596261010">Կանխադրված</translation> +<translation id="4660838440047236328">ձեր սենյակի դասավորությունը</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> էջանիշ ջնջվեց</translation> <translation id="4665282149850138822"><ph name="NAME" /> կայքն ավելացվեց ձեր հիմնական էկրանին</translation> <translation id="4684427112815847243">Համաժամացնել բոլորը</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Ջնջել տվյալները</translation> <translation id="5494752089476963479">Արգելափակել գովազդը կայքերում, որոնք հոգնեցնող կամ մոլորեցնող գովազդ են ցուցադրում</translation> <translation id="5500777121964041360">Գործառույթը կարող է հասանելի չլինել ձեր երկրում։</translation> +<translation id="5505264765875738116">Կայքերը չեն կարող խնդրել ծանուցումներ ուղարկել</translation> <translation id="5512137114520586844">Այս հաշիվը կառավարվում է <ph name="PARENT_NAME" /> հաշվի կողմից:</translation> <translation id="5514904542973294328">Անջատվել է այս սարքի ադմինիստրատորի կողմից</translation> <translation id="5515439363601853141">Գաղտնաբառը տեսնելու համար ապակողպեք էկրանը</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Բացառություններ</translation> <translation id="6194112207524046168">Որպեսզի տեսախցիկը հասանելի դառնա Chrome-ին, միացրեք այն <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />։</translation> <translation id="6196640612572343990">Արգելափակել երրորդ կողմի քուքիները</translation> +<translation id="6201345951596836663">Հղումը պատճենվեց</translation> <translation id="6206551242102657620">Կապակցումը պաշտպանված չէ: Տեղեկություններ կայքի մասին:</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> հաշիվը ձե՞րը չէ</translation> <translation id="6216432067784365534">Ընտրանքներ՝ <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Օրինակ, որոշ վեբկայքեր կարող են այս հարցմանը պատասխանել՝ ներկայացնելով գովազդ, որը հիմնված չէ ձեր այցելությունների վրա: Շատ վեբկայքեր կշարունակեն հավաքել և օգտագործել ձեր այցելությունների պատմությունը: Այն կարող է օգտագործվել, օրինակ, անվտանգությունը բարելավելու, բովանդակություն, գովազդ և խորհուրդներ տրամադրելու և վիճակագրական տվյալներ հավաքելու նպատակով:</translation> <translation id="624789221780392884">Թարմացումը պատրաստ է</translation> <translation id="6255999984061454636">Բովանդակության առաջարկներ</translation> +<translation id="6270391203985052864">Կայքերը կարող են խնդրել ծանուցումներ ուղարկել</translation> <translation id="6277522088822131679">Այս էջը տպելիս խնդիր առաջացավ: Նորից փորձեք:</translation> <translation id="6295158916970320988">Բոլոր կայքերը</translation> <translation id="629730747756840877">Հաշիվ</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth սարքերի որոնում</translation> <translation id="6560414384669816528">Որոնել Sogou որոնման համակարգով</translation> <translation id="656065428026159829">Տեսնել ավելին</translation> +<translation id="6561560012278703671">Օգտագործել ավելի հանգիստ հաղորդագրություններ (արգելափակում է շեղող ծանուցումները)</translation> <translation id="6566259936974865419">Chrome-ը խնայել է <ph name="GIGABYTES" /> ԳԲ տարածք</translation> <translation id="6573096386450695060">Միշտ թույլատրել</translation> <translation id="6573431926118603307">Ձեր մյուս սարքերում Chrome-ով բացված ներդիրները կտեսնեք այստեղ:</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Ձեր սարքը գաղտնաբառերի ֆայլ պահելու հավելված չունի:</translation> <translation id="7302081693174882195">Տեղեկություններ․ տեսակավորված է ըստ պահված տվյալների ծավալի</translation> <translation id="7302486331832100261">Դուք սովորաբար արգելափակում եք ծանուցումները։ Թույլատրելու համար սեղմեք «Մանրամասներ»։</translation> +<translation id="7311441321349344333">Սարքի NFC-ն անջատված է։ Միացրեք այն <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />։</translation> <translation id="7328017930301109123">Lite ռեժիմում Chrome-ն ավելի արագ է բեռնում էջերը և օգտագործում է մինչև 60 տոկոս պակաս թրաֆիկ:</translation> <translation id="7333031090786104871">Դեռ նախորդ կայքն է ավելացվում</translation> <translation id="7352939065658542140">ՏԵՍԱՆՅՈՒԹ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 1474b9f..2f5a233 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Aktifkan sinkronisasi?</translation> <translation id="123724288017357924">Memuat ulang halaman, mengabaikan konten dalam cache</translation> <translation id="124116460088058876">Bahasa lainnya</translation> +<translation id="1242008676835033345">Disematkan di <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Menutup tab aktif</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Telusuri & jelajahi</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Jangan tampilkan lagi</translation> <translation id="1692118695553449118">Sinkronisasi aktif</translation> <translation id="169515064810179024">Memblokir situs agar tidak mengakses sensor gerakan</translation> +<translation id="1711267867945983636">Untuk melanjutkan, aktifkan NFC di ponsel Anda</translation> <translation id="1717218214683051432">Sensor gerakan</translation> <translation id="1718835860248848330">1 jam terakhir</translation> <translation id="1736419249208073774">Jelajahi</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Hasil <ph name="RESULT_NUMBER" /> dari <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Suara</translation> <translation id="2096012225669085171">Sinkronkan dan personalisasi di berbagai perangkat</translation> +<translation id="2099625543891475722">fitur fisik Anda, seperti tinggi badan</translation> <translation id="2100273922101894616">Login Otomatis</translation> <translation id="2100314319871056947">Coba bagikan teks dalam potongan yang lebih kecil</translation> <translation id="2107397443965016585">Tanyakan sebelum mengizinkan situs memutar konten yang dilindungi (direkomendasikan)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Gunakan sandi</translation> <translation id="4645575059429386691">Dikelola oleh orang tua Anda</translation> <translation id="4650364565596261010">Default sistem</translation> +<translation id="4660838440047236328">tata letak ruangan Anda</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> bookmark dihapus</translation> <translation id="4665282149850138822"><ph name="NAME" /> telah ditambahkan ke layar Utama</translation> <translation id="4684427112815847243">Sinkronkan semua</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Hapus data</translation> <translation id="5494752089476963479">Blokir iklan di situs yang menampilkan iklan yang mengganggu atau menyesatkan</translation> <translation id="5500777121964041360">Mungkin tidak tersedia di lokasi Anda</translation> +<translation id="5505264765875738116">Situs tidak dapat meminta izin mengirimkan notifikasi</translation> <translation id="5512137114520586844">Akun ini dikelola oleh <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Dinonaktifkan oleh administrator perangkat</translation> <translation id="5515439363601853141">Buka kunci untuk melihat sandi Anda</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Pengecualian</translation> <translation id="6194112207524046168">Untuk mengizinkan Chrome mengakses kamera Anda, aktifkan juga kamera di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokir cookie pihak ketiga</translation> +<translation id="6201345951596836663">Link Disalin</translation> <translation id="6206551242102657620">Sambungan aman. Informasi situs</translation> <translation id="6210748933810148297">Bukan <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opsi <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Misalnya, beberapa situs web mungkin menanggapi permintaan ini dengan menayangkan iklan yang tidak berdasarkan pada data kunjungan Anda ke situs web lainnya. Banyak situs web masih akan mengumpulkan dan menggunakan data penjelajahan Anda — misalnya, untuk meningkatkan keamanan, menyediakan konten, iklan, dan saran, serta untuk membuat statistik pelaporan.</translation> <translation id="624789221780392884">Pembaruan siap</translation> <translation id="6255999984061454636">Saran konten</translation> +<translation id="6270391203985052864">Situs dapat meminta izin mengirimkan notifikasi</translation> <translation id="6277522088822131679">Terjadi masalah saat mencetak halaman. Coba lagi.</translation> <translation id="6295158916970320988">Semua situs</translation> <translation id="629730747756840877">Akun</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Pemindaian Bluetooth</translation> <translation id="6560414384669816528">Menelusuri menggunakan Sogou</translation> <translation id="656065428026159829">Lihat lainnya</translation> +<translation id="6561560012278703671">Gunakan notifikasi yang lebih tenang (memblokir pop-up notifikasi agar tidak mengganggu Anda)</translation> <translation id="6566259936974865419">Chrome telah menghemat <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Selalu izinkan</translation> <translation id="6573431926118603307">Tab yang telah dibuka di Chrome pada perangkat lainnya akan muncul di sini.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Perangkat Anda tidak memiliki aplikasi untuk menyimpan file sandi.</translation> <translation id="7302081693174882195">Detail: Diurutkan menurut jumlah kuota yang dihemat</translation> <translation id="7302486331832100261">Anda biasanya memblokir notifikasi. Untuk mengizinkan, ketuk Detail.</translation> +<translation id="7311441321349344333">NFC dinonaktifkan di perangkat ini. Aktifkan NFC di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Dalam mode Ringan, Chrome memuat halaman lebih cepat dan menghemat data hingga 60 persen.</translation> <translation id="7333031090786104871">Masih menambahkan situs sebelumnya</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index ad2760e..bb530842 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">同期を有効にしますか?</translation> <translation id="123724288017357924">キャッシュ コンテンツを無視して現在のページを再読み込みする</translation> <translation id="124116460088058876">その他の言語</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> に埋め込まれたページ</translation> <translation id="124678866338384709">現在のタブを閉じる</translation> <translation id="1258753120186372309">Google Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">検索</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">次回から表示しない</translation> <translation id="1692118695553449118">同期は有効です</translation> <translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation> +<translation id="1711267867945983636">続行するには、スマートフォンで NFC をオンにしてください</translation> <translation id="1717218214683051432">モーション センサー</translation> <translation id="1718835860248848330">1 時間以内</translation> <translation id="1736419249208073774">詳しく見る</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">結果 <ph name="TOTAL_RESULTS" /> 件中 <ph name="RESULT_NUMBER" /> 件目</translation> <translation id="2091887806945687916">音声</translation> <translation id="2096012225669085171">デバイス間の同期とカスタマイズ</translation> +<translation id="2099625543891475722">あなたの身体的特徴(身長など)</translation> <translation id="2100273922101894616">自動ログイン</translation> <translation id="2100314319871056947">共有するテキスト ブロックを小さくしてください</translation> <translation id="2107397443965016585">保護されたコンテンツの再生をサイトに許可する前に確認する(推奨)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">パスワードを使用</translation> <translation id="4645575059429386691">保護者により管理されています</translation> <translation id="4650364565596261010">システムのデフォルト</translation> +<translation id="4660838440047236328">あなたの部屋のレイアウト</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> 件のブックマークを削除しました</translation> <translation id="4665282149850138822">「<ph name="NAME" />」がホーム画面に追加されました</translation> <translation id="4684427112815847243">すべてを同期する</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">データを削除</translation> <translation id="5494752089476963479">煩わしい広告や誤解を招く広告が表示されるサイトで広告をブロックする</translation> <translation id="5500777121964041360">お住まいの地域ではご利用になれない可能性があります</translation> +<translation id="5505264765875738116">通知を送信するかどうかの確認をサイトに許可しない</translation> <translation id="5512137114520586844">このアカウントは <ph name="PARENT_NAME" /> によって管理されています。</translation> <translation id="5514904542973294328">このデバイスの管理者によって無効にされています</translation> <translation id="5515439363601853141">パスワードを表示するにはロックを解除してください</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">例外</translation> <translation id="6194112207524046168">Chrome にカメラへのアクセスを許可するには、<ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />でもカメラをオンにしてください。</translation> <translation id="6196640612572343990">サードパーティの Cookie をブロックする</translation> +<translation id="6201345951596836663">リンクをコピーしました</translation> <translation id="6206551242102657620">接続は保護されています。サイト情報</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ではありませんか?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> のオプション</translation> @@ -711,6 +717,7 @@ たとえば一部のウェブサイトでは、このリクエストに対して、ユーザーが過去にアクセスしたウェブサイトとは関係のない広告が表示されます。トラッキングを拒否しても、実際のところ多くのウェブサイトではユーザーの閲覧データが収集され利用されています。その用途としては、セキュリティの強化や、コンテンツ、サービス、広告、おすすめの表示、レポート統計情報の作成などが挙げられます。</translation> <translation id="624789221780392884">アップデート準備完了</translation> <translation id="6255999984061454636">おすすめのコンテンツ</translation> +<translation id="6270391203985052864">通知を送信するかどうかの確認をサイトに許可する</translation> <translation id="6277522088822131679">ページの印刷中に問題が発生しました。もう一度お試しください。</translation> <translation id="6295158916970320988">すべてのサイト</translation> <translation id="629730747756840877">アカウント</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth のスキャン</translation> <translation id="6560414384669816528">Sogou で検索します</translation> <translation id="656065428026159829">もっと見る</translation> +<translation id="6561560012278703671">静かな方法で通知する(割り込み通知を行わない)</translation> <translation id="6566259936974865419">Chrome で <ph name="GIGABYTES" /> GB の容量を節約しました</translation> <translation id="6573096386450695060">常に許可</translation> <translation id="6573431926118603307">他のデバイスの Chrome で開いているタブがここに表示されます。</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">お使いのデバイスにはパスワード ファイルを保存するためのアプリがインストールされていません。</translation> <translation id="7302081693174882195">詳細: データ節約量の順</translation> <translation id="7302486331832100261">通知はデフォルトでブロックされています。許可するには [詳細] をタップしてください。</translation> +<translation id="7311441321349344333">このデバイスでは NFC がオフになっています。<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />でオンにしてください。</translation> <translation id="7328017930301109123">ライトモードを使用すると、Chrome でページの読み込みが高速化され、データ使用量も最大 60 パーセント抑えることができます。</translation> <translation id="7333031090786104871">前のサイトを追加中です</translation> <translation id="7352939065658542140">動画</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 1ed93dfe..6346a402 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">გსურთ სინქრონიზაციის ჩართვა?</translation> <translation id="123724288017357924">გვერდის გადატვირთვა ქეშირ. კონტენტის იგნორირებით</translation> <translation id="124116460088058876">სხვა ენები</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" />-ში ჩაშენებული</translation> <translation id="124678866338384709">მიმდინარე ჩანართის დახურვა</translation> <translation id="1258753120186372309">Google Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">ძიება და გაცნობა</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">აღარ გამოჩნდეს</translation> <translation id="1692118695553449118">სინქრონიზაცია ჩართულია</translation> <translation id="169515064810179024">საიტებისთვის მოძრაობის სენსორებზე წვდომის აკრძალვა</translation> +<translation id="1711267867945983636">გასაგრძელებლად თქვენს ტელეფონზე ჩართეთ NFC</translation> <translation id="1717218214683051432">მოძრაობის სენსორები</translation> <translation id="1718835860248848330">ბოლო საათი</translation> <translation id="1736419249208073774">მიმოხილვა</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">შედეგი <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" />-დან</translation> <translation id="2091887806945687916">ხმა</translation> <translation id="2096012225669085171">სინქრონიზაცია და პერსონალიზება სხვადასხვა მოწყობილობას შორის</translation> +<translation id="2099625543891475722">თქვენი ფიზიკური მონაცემები, როგორიცაა სიმაღლე</translation> <translation id="2100273922101894616">ავტომატური შესვლა</translation> <translation id="2100314319871056947">ცადეთ ტექსტის გაზიარება უფრო მცირე ფრაგმენტებად</translation> <translation id="2107397443965016585">შეკითხვა საიტებისთვის დაცული კონტენტის დაკვრის დაშვებამდე (რეკომენდებული)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">პაროლის გამოყენება</translation> <translation id="4645575059429386691">იმართება თქვენი მშობლის მიერ</translation> <translation id="4650364565596261010">სისტემის ნაგულისხმევი</translation> +<translation id="4660838440047236328">თქვენი ოთახის განლაგება</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> სანიშნე წაიშალა</translation> <translation id="4665282149850138822"><ph name="NAME" /> დაემატა მთავარ ეკრანს</translation> <translation id="4684427112815847243">ყველაფრის სინქრონიზაცია</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">მონაცემების წაშლა</translation> <translation id="5494752089476963479">რეკლამის დაბლოკვა იმ საიტებზე, რომლებიც აჩვენებს მომაბეზრებელ ან შეცდომაში შემყვან რეკლამას</translation> <translation id="5500777121964041360">შეიძლება მიუწვდომელი იყოს თქვენთან</translation> +<translation id="5505264765875738116">საიტები ვერ გთხოვთ შეტყობინებების გამოგზავნას</translation> <translation id="5512137114520586844">ეს ანგარიში იმართება <ph name="PARENT_NAME" />-ს მიერ.</translation> <translation id="5514904542973294328">გათიშულია ამ მოწყობილობის ადმინისტრატორის მიერ</translation> <translation id="5515439363601853141">განბლოკეთ თქვენი პაროლის სანახავად</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">გამონაკლისები</translation> <translation id="6194112207524046168">Chrome-ისთვის თქვენს კამერაზე წვდომის დასაშვებად ჩართეთ კამერაზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა</translation> +<translation id="6201345951596836663">ბმული დაკოპირდა</translation> <translation id="6206551242102657620">კავშირი დაცულია. საიტის ინფორმაცია.</translation> <translation id="6210748933810148297">არ ხართ <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> — ვარიანტები</translation> @@ -711,6 +717,7 @@ მაგალითად, ზოგიერთი ვებსაიტის რეაგირება შეიძლება გამოიხატოს იმაში, რომ ისინი არ გიჩვენებთ თქვენ მიერ ადრე მონახულებულ ვებსაიტებზე დაფუძნებულ რეკლამას. მრავალი ვებსაიტი მაინც შეაგროვებს და გამოიყენებს თქვენს დათვალიერების მონაცემებს — მაგალითად, უსაფრთხოების გაუმჯობესების, საკუთარ ვებგვერდებზე კონტენტის უზრუნველყოფის, რეკლამისა და რეკომენდაციების ჩვენების, ან ანგარიშგების სტატისტიკის გენერირების მიზნით.</translation> <translation id="624789221780392884">განახლება მზადაა</translation> <translation id="6255999984061454636">კონტენტის შემოთავაზება</translation> +<translation id="6270391203985052864">საიტებს შეუძლიათ შეტყობინებების გამოგზავნის თხოვნა</translation> <translation id="6277522088822131679">გვერდის დაბეჭდვისას დაფიქსირდა შეცდომა. გთხოვთ ცადოთ ხელახლა.</translation> <translation id="6295158916970320988">ყველა საიტი</translation> <translation id="629730747756840877">ანგარიში</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth სკანირება</translation> <translation id="6560414384669816528">ძიების Sogou-ს მეშვეობით განხორციელება</translation> <translation id="656065428026159829">მეტის ნახვა</translation> +<translation id="6561560012278703671">ჩუმი შეტყობინების გამოყენება (დაბლოკავს შეტყობინებებთან დაკავშირებულ ხელისშემშლელ მოთხოვნებს)</translation> <translation id="6566259936974865419">Chrome-ის მეშვეობით თქვენ <ph name="GIGABYTES" /> გბაიტი დაზოგეთ</translation> <translation id="6573096386450695060">ყოველთვის დაშვება</translation> <translation id="6573431926118603307">სხვა მოწყობილობებზე თქვენ მიერ Chrome-ით გახსნილი ჩანართები აქ გამოჩნდება.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">თქვენს მოწყობილობაზე არ არის აპი, რომელიც შეძლებს პაროლების ფაილის შენახვას.</translation> <translation id="7302081693174882195">დეტალები: დალაგებულია დაზოგილი მონაცემების მიხედვით</translation> <translation id="7302486331832100261">როგორც წესი, თქვენ ბლოკავთ შეტყობინებებს. დასაშვებად შეხებით აირჩიეთ „დეტალები“.</translation> +<translation id="7311441321349344333">NFC გამორთულია ამ მოწყობილობისთვის. NFC-ს ჩართვა შეგიძლიათ <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Lite რეჟიმში Chrome უფრო სწრაფად ტვირთავს გვერდებს და 60 პროცენტით ნაკლებ ტრაფიკს მოიხმარს.</translation> <translation id="7333031090786104871">ჯერ კიდევ მიმდინარეობს წინა საიტის დამატება</translation> <translation id="7352939065658542140">ვიდეო</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 63605eb..7c9657f9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Синхрондау қосылсын ба?</translation> <translation id="123724288017357924">Кэштелген мазмұнды елемей, ағымдағы бетті жаңарту</translation> <translation id="124116460088058876">Қосымша тілдер</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> мекенжайына ендірілген</translation> <translation id="124678866338384709">Ағымдағы қойындыны жабу</translation> <translation id="1258753120186372309">Google Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Іздеу және зерттеу</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Қайта көрсетілмесін</translation> <translation id="1692118695553449118">Синхрондау қосылған</translation> <translation id="169515064810179024">Сайттардың қозғалыс датчиктерін пайдалануына тыйым салу</translation> +<translation id="1711267867945983636">Жалғастыру үшін телефондағы NFC функциясын қосыңыз.</translation> <translation id="1717218214683051432">Қозғалыс датчиктері</translation> <translation id="1718835860248848330">Соңғы сағат</translation> <translation id="1736419249208073774">Зерттеу</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ішінен <ph name="RESULT_NUMBER" /> нәтиже</translation> <translation id="2091887806945687916">Дыбыс</translation> <translation id="2096012225669085171">Барлық құрылғыларда синхрондау және жекелендіру</translation> +<translation id="2099625543891475722">бойыңыз сияқты физикалық сипаттар</translation> <translation id="2100273922101894616">Автоматты кіру</translation> <translation id="2100314319871056947">Мәтін тым үлкен, аз-аздан бөлісіп көріңіз.</translation> <translation id="2107397443965016585">Қорғалған мазмұнды ойнатуға рұқсат сұрау (ұсынылады)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Құпия сөзді пайдалану</translation> <translation id="4645575059429386691">Ата-ана басқарады</translation> <translation id="4650364565596261010">Жүйенің әдепкі параметрі</translation> +<translation id="4660838440047236328">бөлменің жобасы</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> бетбелгі жойылды</translation> <translation id="4665282149850138822">Негізгі экранға <ph name="NAME" /> қосылды</translation> <translation id="4684427112815847243">Барлығын синхрондау</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Деректерді жою</translation> <translation id="5494752089476963479">Мазалайтын не жалған ақпаратты жарнамалар берілетін сайттарда жарнамаларды бөгеу</translation> <translation id="5500777121964041360">Орналасқан аймағыңызда қолжетімді болмауы мүмкін.</translation> +<translation id="5505264765875738116">Сайттар хабарландырулар жіберу рұқсатын сұрай алмайды</translation> <translation id="5512137114520586844">Бұл есептік жазбаны <ph name="PARENT_NAME" /> басқарады.</translation> <translation id="5514904542973294328">Құрылғының әкімшісі ажыратқан</translation> <translation id="5515439363601853141">Құпия сөзді көру үшін құлыпты ашыңыз</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Ерекше жағдайлар</translation> <translation id="6194112207524046168">Chrome браузері камераны пайдалануы үшін, оны <ph name="BEGIN_LINK" />Android параметрлерінде<ph name="END_LINK" /> де қосыңыз.</translation> <translation id="6196640612572343990">Үшінші тарап cookie файлдарын бөгеу</translation> +<translation id="6201345951596836663">Сілтеме көшірілді</translation> <translation id="6206551242102657620">Байланыс қорғалған. Сайт ақпараты</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> емес пе?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> опциялары</translation> @@ -711,6 +717,7 @@ Мысалы, кейбір веб-сайттар бұл сұрауға сіз кірген басқа веб-сайттарға негізделмеген жарнамаларды көрсету арқылы жауап беруі мүмкін. Көптеген веб-сайттар әлі де шолу деректеріңізді жинап, пайдаланатын болады (мысалы, қауіпсіздікті жақсарту, мазмұн, жарнама және ұсыныстарды қамтамасыз ету және статистикалық есептерді құру мақсатында).</translation> <translation id="624789221780392884">Жаңарту дайын</translation> <translation id="6255999984061454636">Мазмұн ұсыныстары</translation> +<translation id="6270391203985052864">Сайттар хабарландырулар жіберу рұқсатын сұрай алады</translation> <translation id="6277522088822131679">Бетті басып шығаруда қиындық туындады. Тағы да қайталап көріңіз.</translation> <translation id="6295158916970320988">Барлық сайттар</translation> <translation id="629730747756840877">Есептік жазба</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth құрылғыларын іздеу</translation> <translation id="6560414384669816528">Sogou қызметімен іздеу</translation> <translation id="656065428026159829">Басқаларын көру</translation> +<translation id="6561560012278703671">Дыбысы бәсең шығатын хабарларды пайдаланыңыз (кедергі келтіретін хабарландыруларды бөгейді).</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> ГБ деректі сақтады</translation> <translation id="6573096386450695060">Әрқашан рұқсат беру</translation> <translation id="6573431926118603307">Басқа құрылғыларда Chrome браузерінен ашылған қойындылар осы жерде шығады.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Құрылғыңызда құпия сөздер файлын сақтайтын қолданба орнатылмаған.</translation> <translation id="7302081693174882195">Мәліметтер: сақталған деректер көлемі бойынша сұрыпталды</translation> <translation id="7302486331832100261">Әдетте хабарландыруларға тыйым саласыз. Рұқсат беру үшін "Мәліметтер" түймесін түртіңіз.</translation> +<translation id="7311441321349344333">Бұл құрылғыда NFC функциясы өшірілген. NFC функциясын <ph name="BEGIN_LINK" />Android параметрлерінен<ph name="END_LINK" /> қосыңыз.</translation> <translation id="7328017930301109123">Lite режимінде Chrome беттерді жылдамырақ жүктейді және трафикті 60 пайызға дейін аз жұмсайды.</translation> <translation id="7333031090786104871">Алдыңғы сайт әлі енгізілуде</translation> <translation id="7352939065658542140">БЕЙНЕ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 6c896a7..8be9dbb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">បើកសមកាលកម្ម?</translation> <translation id="123724288017357924">ផ្ទុកទំព័របច្ចុប្បន្នឡើងវិញ ដោយមិនអើពីនឹងមាតិកាដែលបានរក្សាទុកក្នុងឃ្លាំងផ្ទុកទិន្នន័យ</translation> <translation id="124116460088058876">ភាសាច្រើនទៀត</translation> +<translation id="1242008676835033345">បានបង្កប់នៅលើ <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">បិទផ្ទាំងបច្ចុប្បន្ន</translation> <translation id="1258753120186372309">Google doodle៖ <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">ស្វែងរក និងរុករក</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">កុំបង្ហាញម្ដងទៀត</translation> <translation id="1692118695553449118">សមកម្មបានបើក</translation> <translation id="169515064810179024">ទប់ស្កាត់គេហទំព័រមិនឱ្យចូលប្រើឧបករណ៍ចាប់ចលនា</translation> +<translation id="1711267867945983636">ដើម្បីបន្ត សូមបើក NFC នៅលើទូរសព្ទរបស់អ្នក</translation> <translation id="1717218214683051432">ឧបករណ៍ចាប់ចលនា</translation> <translation id="1718835860248848330">មួយម៉ោងមុន</translation> <translation id="1736419249208073774">រុករក</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">លទ្ធផល <ph name="RESULT_NUMBER" /> នៃ <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">សំឡេង</translation> <translation id="2096012225669085171">ធ្វើសមកាលកម្ម និងកំណត់ផ្ទាល់ខ្លួននៅលើឧបករណ៍ផ្សេងៗ</translation> +<translation id="2099625543891475722">លក្ខណសម្បត្តិនៃរាងកាយរបស់អ្នក ដូចជាកម្ពស់ជាដើម</translation> <translation id="2100273922101894616">ចូលស្វ័យប្រវត្តិ</translation> <translation id="2100314319871056947">សាកល្បងចែករំលែកអត្ថបទជាផ្នែកតូចៗជាងនេះ</translation> <translation id="2107397443965016585">សួរមុនពេលអនុញ្ញតឱ្យគេហទំព័រចាក់ខ្លឹមសារដែលមានការការពារ (បានណែនាំ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">ប្រើពាក្យសម្ងាត់</translation> <translation id="4645575059429386691">គ្រប់គ្រងដោយឪពុកម្តាយរបស់អ្នក</translation> <translation id="4650364565596261010">លំនាំដើមរបស់ប្រព័ន្ធ</translation> +<translation id="4660838440047236328">ប្លង់បន្ទប់របស់អ្នក</translation> <translation id="4663756553811254707">បានលុបចំណាំ <ph name="NUMBER_OF_BOOKMARKS" /></translation> <translation id="4665282149850138822"><ph name="NAME" /> ត្រូវបានបន្ថែមទៅអេក្រង់ដើមរបស់អ្នក</translation> <translation id="4684427112815847243">ធ្វើសមកម្មគ្រប់យ៉ាង</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ជម្រះទិន្នន័យ</translation> <translation id="5494752089476963479">ទប់ស្កាត់ការផ្សាយពាណិជ្ជកម្មនៅលើគេហទំព័រដែលបង្ហាញការផ្សាយពាណិជ្ជកម្មនាំឱ្យយល់ច្រឡំ ឬរំខាន</translation> <translation id="5500777121964041360">ប្រហែលជាមិនអាចប្រើនៅក្នុងទីតាំងរបស់អ្នកបានទេ</translation> +<translation id="5505264765875738116">គេហទំព័រមិនអាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹងបានទេ</translation> <translation id="5512137114520586844">គណនីនេះត្រូវបានគ្រប់គ្រងដោយ <ph name="PARENT_NAME" />។</translation> <translation id="5514904542973294328">បិទដោយអ្នកគ្រប់គ្រងឧបករណ៍នេះ</translation> <translation id="5515439363601853141">ដោះសោដើម្បីមើលពាក្យសម្ងាត់របស់អ្នក</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">ការលើកលែង</translation> <translation id="6194112207524046168">ដើម្បីអនុញ្ញាតឱ្យ Chrome ចូលប្រើកាមេរ៉ារបស់អ្នក អ្នកក៏ត្រូវបើកកាមេរ៉ានៅក្នុង<ph name="BEGIN_LINK" />ការកំណត់ Android<ph name="END_LINK" /> ផងដែរ។</translation> <translation id="6196640612572343990">រារាំងខូគីភាគីទីបី</translation> +<translation id="6201345951596836663">បានចម្លងតំណ</translation> <translation id="6206551242102657620">ការតភ្ជាប់មានសុវត្ថិភាព។ ព័ត៌មានអំពីគេហទំព័រ</translation> <translation id="6210748933810148297">មិនមែន <ph name="EMAIL" /> ទេ?</translation> <translation id="6216432067784365534">ជម្រើស <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ ឧទាហរណ៍៖ គេហទំព័រមួយចំនួនអាចឆ្លើយតបទៅនឹងការស្នើសុំនេះដោយការបង្ហាញពាណិជ្ជកម្មដល់អ្នកដោយមិនផ្អែកលើគេហទំព័រផ្សេងទៀតដែលអ្នកបានចូលទៅកាន់។ គេហទំព័រជាច្រើននឹងនៅតែប្រមូល និងប្រើទិន្នន័យការរុករករបស់អ្នកដដែល។ ឧទាហរណ៍ដើម្បីពង្រឹងសុវត្ថិភាព ដើម្បីផ្តល់មាតិកា ពាណិជ្ជកម្ម និងការណែនាំនៅលើគេហទំព័ររបស់ពួកគេ និងដើម្បីបង្កើតស្ថិតិរបាយការណ៍។</translation> <translation id="624789221780392884">ការធ្វើបច្ចុប្បន្នភាពរួចរាល់ក្នុងការចាប់ផ្តើម</translation> <translation id="6255999984061454636">ការណែនាំខ្លឹមសារ</translation> +<translation id="6270391203985052864">គេហទំព័រអាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹង</translation> <translation id="6277522088822131679">មានបញ្ហាក្នុងការបោះពុម្ពទំព័រ។ សូមព្យាយាមម្តងទៀត។</translation> <translation id="6295158916970320988">គេហទំព័រទាំងអស់</translation> <translation id="629730747756840877">គណនី</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">ការស្កេនប៊្លូធូស</translation> <translation id="6560414384669816528">ស្វែងរកដោយប្រើ Sogou</translation> <translation id="656065428026159829">មើលច្រើនទៀត</translation> +<translation id="6561560012278703671">ប្រើការផ្ញើសារស្ងាត់ជាងមុន (ទប់ស្កាត់សារជូនដំណឹងមិនឱ្យរំខានអ្នក)</translation> <translation id="6566259936974865419">Chrome សន្សំឲ្យអ្នកបាន <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">អនុញ្ញាតជានិច្ច</translation> <translation id="6573431926118603307">ផ្ទាំងដែលអ្នកបានបើកនៅក្នុង Chrome នៅលើឧបករណ៍ផ្សេងទៀតរបស់អ្នកនឹងបង្ហាញនៅទីនេះ</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">ឧបករណ៍របស់អ្នកមិនមានកម្មវិធី ដើម្បីផ្ទុកឯកសារពាក្យសម្ងាត់ទេ។</translation> <translation id="7302081693174882195">ព័ត៌មានលម្អិត៖ តម្រៀបតាមទំហំទិន្នន័យដែលបានរក្សាទុក</translation> <translation id="7302486331832100261">ជាធម្មតា អ្នកទប់ស្កាត់ការជូនដំណឹង។ ដើម្បីអនុញ្ញាត សូមចុច "ព័ត៌មានលម្អិត"។</translation> +<translation id="7311441321349344333">NFC ត្រូវបានបិទសម្រាប់ឧបករណ៍នេះ។ សូមបើក NFC នៅក្នុង<ph name="BEGIN_LINK" />ការកំណត់ Android<ph name="END_LINK" />។</translation> <translation id="7328017930301109123">នៅក្នុងមុខងារស្រាល Chrome ផ្ទុកទំព័ររហ័សជាងមុន និងប្រើទិន្នន័យតិចជាងមុនរហូតដល់ 60 ភាគរយ។</translation> <translation id="7333031090786104871">កំពុងបញ្ចូលទំព័រពីមុននៅឡើយ</translation> <translation id="7352939065658542140">វីដេអូ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index cb0f2da..265d7364 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">동기화를 사용하시겠습니까?</translation> <translation id="123724288017357924">캐시된 콘텐츠를 무시하고 현재 페이지 새로고침</translation> <translation id="124116460088058876">다른 언어</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" />에 삽입됨</translation> <translation id="124678866338384709">현재 탭 닫기</translation> <translation id="1258753120186372309">Google 기념일 로고: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">검색 및 탐색</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">다시 표시하지 않음</translation> <translation id="1692118695553449118">동기화 사용 중</translation> <translation id="169515064810179024">사이트에서 움직임 감지 센서에 액세스하지 못하도록 차단</translation> +<translation id="1711267867945983636">계속하려면 휴대전화에서 NFC를 사용 설정하세요.</translation> <translation id="1717218214683051432">움직임 감지 센서</translation> <translation id="1718835860248848330">지난 1시간</translation> <translation id="1736419249208073774">탐색</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation> <translation id="2091887806945687916">소리</translation> <translation id="2096012225669085171">모든 기기 동기화 및 맞춤설정</translation> +<translation id="2099625543891475722">키와 같은 신체적 특징</translation> <translation id="2100273922101894616">자동 로그인</translation> <translation id="2100314319871056947">좀 더 짧은 길이로 텍스트를 줄인 다음 공유해 보세요.</translation> <translation id="2107397443965016585">사이트에서 보호된 콘텐츠를 재생하도록 허용하기 전에 확인(권장)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">비밀번호 사용</translation> <translation id="4645575059429386691">부모님이 관리합니다.</translation> <translation id="4650364565596261010">시스템 기본값</translation> +<translation id="4660838440047236328">방의 구조</translation> <translation id="4663756553811254707">북마크 <ph name="NUMBER_OF_BOOKMARKS" />개 삭제됨</translation> <translation id="4665282149850138822"><ph name="NAME" />이(가) 홈 화면에 추가됨</translation> <translation id="4684427112815847243">모두 동기화</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">인터넷 사용 기록 삭제</translation> <translation id="5494752089476963479">방해가 되거나 사용자를 현혹하는 광고를 표시하는 사이트의 광고 차단</translation> <translation id="5500777121964041360">현재 지역에서는 지원되지 않을 수도 있습니다.</translation> +<translation id="5505264765875738116">사이트에서 알림 전송 허용을 요청할 수 없음</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" />님이 관리하는 계정입니다.</translation> <translation id="5514904542973294328">기기 관리자가 사용 중지함</translation> <translation id="5515439363601853141">비밀번호를 보려면 잠금 해제하세요</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">예외</translation> <translation id="6194112207524046168">Chrome에서 카메라에 액세스하도록 허용하려면 <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서도 카메라를 사용 설정하세요.</translation> <translation id="6196640612572343990">타사 쿠키 차단</translation> +<translation id="6201345951596836663">링크 복사됨</translation> <translation id="6206551242102657620">이 사이트와의 연결은 안전합니다. 사이트 정보</translation> <translation id="6210748933810148297"><ph name="EMAIL" />이(가) 아닌가요?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> 옵션</translation> @@ -711,6 +717,7 @@ 예를 들어 어떤 웹사이트는 사용자가 방문한 다른 웹사이트를 기반으로 하지 않는 광고를 표시하여 이 요청에 응답할 수 있습니다. 그러나 대부분의 웹사이트에서는 보안을 개선하거나 웹사이트에 콘텐츠, 광고, 권장사항 등을 제공하거나 보고서 통계를 생성하기 위해 사용자의 인터넷 사용 기록을 계속 수집하고 사용합니다.</translation> <translation id="624789221780392884">업데이트 준비 완료</translation> <translation id="6255999984061454636">콘텐츠 추천</translation> +<translation id="6270391203985052864">사이트에서 알림 전송 허용을 요청할 수 있음</translation> <translation id="6277522088822131679">페이지를 인쇄하는 중에 문제가 발생했습니다. 다시 시도해 주세요.</translation> <translation id="6295158916970320988">모든 사이트</translation> <translation id="629730747756840877">계정</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">블루투스 검색</translation> <translation id="6560414384669816528">Sogou로 검색</translation> <translation id="656065428026159829">더보기</translation> +<translation id="6561560012278703671">눈에 띄지 않는 메시지 사용(방해가 되지 않도록 알림 메시지 차단)</translation> <translation id="6566259936974865419">Chrome을 통해 <ph name="GIGABYTES" />GB를 절약했습니다.</translation> <translation id="6573096386450695060">항상 허용</translation> <translation id="6573431926118603307">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">기기에 비밀번호 파일을 저장할 수 있는 앱이 없습니다.</translation> <translation id="7302081693174882195">세부정보: 저장된 데이터 양에 따라 정렬</translation> <translation id="7302486331832100261">기본적으로 알림을 차단하는 중입니다. 허용하려면 '세부정보'를 탭하세요.</translation> +<translation id="7311441321349344333">기기에서 NFC가 사용 중지되어 있습니다. <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 NFC를 사용 설정하세요.</translation> <translation id="7328017930301109123">Chrome의 라이트 모드를 사용하면 페이지가 더 빠르게 로드되고 데이터가 최대 60퍼센트 절약됩니다.</translation> <translation id="7333031090786104871">아직 이전 사이트 추가 중</translation> <translation id="7352939065658542140">동영상</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 7ea881e..3384bb89 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Шайкештирүү күйгүзүлсүнбү?</translation> <translation id="123724288017357924">Кэшти колдонбой, учурдагы баракты кайра жүктөө</translation> <translation id="124116460088058876">Дагы тилдер</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> кыналган</translation> <translation id="124678866338384709">Учурдагы өтмөктү жабуу</translation> <translation id="1258753120186372309">Google чиймелек: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Издөө жана изилдөө</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Экинчи көрсөтүлбөсүн</translation> <translation id="1692118695553449118">Шайкештештирүү күйүк</translation> <translation id="169515064810179024">Сайттардын сенсорлорду колдонуусун бөгөттөө</translation> +<translation id="1711267867945983636">Улантуу үчүн телефонуңуздагы NFC'ни күйгүзүңүз</translation> <translation id="1717218214683051432">Кыймыл сенсорлору</translation> <translation id="1718835860248848330">Акыркы бир саат</translation> <translation id="1736419249208073774">Изилдөө</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ичинен <ph name="RESULT_NUMBER" /> натыйжа</translation> <translation id="2091887806945687916">Үн</translation> <translation id="2096012225669085171">Бардык түзмөктөрдө шайкештирүү жана жекечелештирүү</translation> +<translation id="2099625543891475722">боюңуз сыяктуу физикалык мүнөздөмөлөрүңүз</translation> <translation id="2100273922101894616">Авто кирүү</translation> <translation id="2100314319871056947">Текстти бир нече бөлүккө бөлүп анан бөлүшүп көрүңүз</translation> <translation id="2107397443965016585">Сайттар корголгон мазмунду ойнотуудан мурда уруксат суралсын (сунушталат)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Сырсөздү колдонуу</translation> <translation id="4645575059429386691">Ата-энеңиз башкарат</translation> <translation id="4650364565596261010">Демейки тутум</translation> +<translation id="4660838440047236328">бөлмөңүздүн көрүнүшү</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> кыстарма жок кылынды</translation> <translation id="4665282149850138822"><ph name="NAME" /> Башкы экраныңызга кошулду</translation> <translation id="4684427112815847243">Баарын шайкештештирүү</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Дайын-даректерди өчүрүү</translation> <translation id="5494752089476963479">Тажатма же адаштыруучу жарнамаларды көрсөткөн сайттан келген жарнамалар бөгөттөлсүн</translation> <translation id="5500777121964041360">Сиз жашаган өлкөдө жеткиликсиз болушу мүмкүн</translation> +<translation id="5505264765875738116">Сайттар билдирмелери жөнөтүүнү сурана алышпайт</translation> <translation id="5512137114520586844">Бул каттоо эсебин <ph name="PARENT_NAME" /> башкарат.</translation> <translation id="5514904542973294328">Түзмөктүн администратору өчүрүп койгон</translation> <translation id="5515439363601853141">Сырсөзүңүздү көрүү үчүн кулпусун ачыңыз</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Өзгөчө шарттар</translation> <translation id="6194112207524046168">Chrome'го камерага кирүүгө уруксат берүү үчүн, <ph name="BEGIN_LINK" />Android Жөндөөлөрүнөн<ph name="END_LINK" /> камераны күйгүзүңүз.</translation> <translation id="6196640612572343990">Үчүнчү жактын кукилери бөгөттөлсүн</translation> +<translation id="6201345951596836663">Шилтеме көчүрүлдү</translation> <translation id="6206551242102657620">Туташуу корголгон. Сайт тууралуу маалымат</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> эмеспи?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Параметрлер</translation> @@ -711,6 +717,7 @@ Мисалы, айрым веб-сайттар бул сурамга жооп кайтарып, сиз көрүп чыккан вебсайттарга негизделбеген каалаган жарнамаларды көрсөтө берет. Ал эми көпчүлүк вебсайттар коопсуздукту бекемдөө, керектүү мазмундар, жарнамалар жана сунуштар менен камсыз кылуу жана статистикалык маалыматтар жөнүндө кабар берүү максатында серептөө дайындарыңызды топтоп, колдонгонун уланта берет.</translation> <translation id="624789221780392884">Жаңыртуу даяр</translation> <translation id="6255999984061454636">Мазмун сунуштары</translation> +<translation id="6270391203985052864">Сайттар билдирмелери жөнөтүүнү сурана алышат</translation> <translation id="6277522088822131679">Баракты басып чыгарууда көйгөй келип чыкты. Дагы аракет кылып көрүңүз.</translation> <translation id="6295158916970320988">Бардык сайттар</translation> <translation id="629730747756840877">Каттоо эсеби</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth түзмөктөрүн издөө</translation> <translation id="6560414384669816528">Sogou менен издөө</translation> <translation id="656065428026159829">Дагы көрүү</translation> +<translation id="6561560012278703671">Даректер тилкесинде көрсөтүлгөн билдирмелерди колдонуңуз (сизди алаксыткан билдирмелерди бөгөттөйт)</translation> <translation id="6566259936974865419">Chrome сизге <ph name="GIGABYTES" /> Гб үнөмдөп берди</translation> <translation id="6573096386450695060">Дайым уруксат берүү</translation> <translation id="6573431926118603307">Башка түзмөктөрүңүздөн Chrome аркылуу ачылган өтмөктөр ушул жерден көрүнөт.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Түзмөгүңүздө сырсөздөрдүн файлын сактай турган колдонмо жок экен.</translation> <translation id="7302081693174882195">Кошумча маалымат: Үнөмдөлгөн трафик боюнча иргелди</translation> <translation id="7302486331832100261">Адатта билдирмелерди өчүрөсүз. Уруксат берүү үчүн "Чоо-жайын" таптап коюңуз.</translation> +<translation id="7311441321349344333">NFC бул түзмөктө өчүрүлгөн. <ph name="BEGIN_LINK" />Android жөндөөлөрүнө<ph name="END_LINK" /> өтүп, NFC'ни күйгүзүңүз.</translation> <translation id="7328017930301109123">Жөнөкөй режимде Chrome барактарды ылдамыраак жүктөп, 60 пайызга чейин азыраак трафик сарптайт.</translation> <translation id="7333031090786104871">Мурунку сайт дагы эле кошулуп жатат</translation> <translation id="7352939065658542140">ВИДЕО</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 10c23eb..cbd35f6b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">ເປີດການຊິ້ງຂໍ້ມູນບໍ?</translation> <translation id="123724288017357924">ໂຫຼດໜ້າປັດຈຸບັນຄືນໃໝ່, ໂດຍລະເລີຍເນື້ອຫາທີ່ຈັດເກັບໄວ້ຖາວອນ</translation> <translation id="124116460088058876">ພາສາເພີ່ມເຕີມ</translation> +<translation id="1242008676835033345">ຝັງຕິດໃນ <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">ປິດແຖບປັດຈຸບັນ</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">ຊອກຫາ ແລະ ສຳຫຼວດ</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">ຢ່າສະແດງອີກ</translation> <translation id="1692118695553449118">ຊິງຄ໌ເປີດຢູ່</translation> <translation id="169515064810179024">ບລັອກເວັບໄຊບໍ່ໃຫ້ເຂົ້າເຖິງເຊັນເຊີກວດຈັບການເຄື່ອນໄຫວ</translation> +<translation id="1711267867945983636">ກະລຸນາເປີດ NFC ໃນໂທລະສັບຂອງທ່ານເພື່ອສືບຕໍ່</translation> <translation id="1717218214683051432">ເຊັນກວດຈັບການເຄື່ອນໄຫວ</translation> <translation id="1718835860248848330">ຊົ່ວໂມງຜ່ານມາ</translation> <translation id="1736419249208073774">ສຳຫຼວດເບິ່ງ</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">ຜົນຮັບ <ph name="RESULT_NUMBER" /> ຈາກ <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">ສຽງ</translation> <translation id="2096012225669085171">ຊິ້ງຂໍ້ມູນ ແລະ ປັບແຕ່ງໃຫ້ເປັນແບບສ່ວນຕົວໃນທົ່ວອຸປະກອນ</translation> +<translation id="2099625543891475722">ລັກສະນະຮ່າງກາຍຂອງທ່ານ ເຊັ່ນ: ລວງສູງ</translation> <translation id="2100273922101894616">ເຂົ້າສູ່ລະບົບອັດຕະໂນມັດ</translation> <translation id="2100314319871056947">ລອງແບ່ງປັນຂໍ້ຄວາມໃນຈຳນວນທີ່ໜ້ອຍກວ່າ</translation> <translation id="2107397443965016585">ຖາມກ່ອນທີ່ຈະອະນຸຍາດໃຫ້ເວັບໄຊຫຼິ້ນເນື້ອຫາທີ່ມີການປົກປ້ອງ (ແນະນຳ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">ໃຊ້ລະຫັດຜ່ານ</translation> <translation id="4645575059429386691">ຈັດການໂດຍຜູ້ປົກຄອງຂອງທ່ານ</translation> <translation id="4650364565596261010">ຄ່າເລີ່ມຕົ້ນຂອງລະບົບ</translation> +<translation id="4660838440047236328">ແຜນຜັງຫ້ອງຂອງທ່ານ</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> ບຸກມາກຖືກລຶບໄປແລ້ວ</translation> <translation id="4665282149850138822"><ph name="NAME" /> ຖືກເພີ່ມເຂົ້າໃສ່ໜ້າຈໍຫຼັກຂອງທ່ານແລ້ວ</translation> <translation id="4684427112815847243">ຊິງຄ໌ທຸກຢ່າງ</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ລຶບລ້າງຂໍ້ມູນ</translation> <translation id="5494752089476963479">ບລັອກໂຄສະນາໃນເວັບໄຊທີ່ສະແດງໂຄສະນາທີ່ລົບກວນ ຫຼື ຫຼອກລວງ</translation> <translation id="5500777121964041360">ອາດຈະບໍ່ມີໃຫ້ນຳໃຊ້ໃນສະຖານທີ່ຂອງທ່ານ</translation> +<translation id="5505264765875738116">ເວັບໄຊບໍ່ສາມາດຂໍໃຫ້ສົ່ງການແຈ້ງເຕືອນໄດ້</translation> <translation id="5512137114520586844">ບັນຊີນີ້ຖືກຈັດການໂດຍ <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">ປິດນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງອຸປະກອນນີ້</translation> <translation id="5515439363601853141">ປົດລັອກເພື່ອເບິ່ງລະຫັດຜ່ານຂອງທ່ານ</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">ຂໍ້ຍົກເວັ້ນ</translation> <translation id="6194112207524046168">ເພື່ອອະນຸຍາດໃຫ້ Chrome ເຂົ້າເຖິງກ້ອງຖ່າຍຮູບຂອງທ່ານ, ກະລຸນາເປີດກ້ອງຖ່າຍຮູບໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" /> ນຳ.</translation> <translation id="6196640612572343990">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ</translation> +<translation id="6201345951596836663">ສຳເນົາລິ້ງແລ້ວ</translation> <translation id="6206551242102657620">ການເຊື່ອມຕໍ່ປອດໄພ. ຂໍ້ມູນເວັບໄຊ</translation> <translation id="6210748933810148297">ບໍ່ແມ່ນ <ph name="EMAIL" /> ບໍ?</translation> <translation id="6216432067784365534">ຕົວເລືອກ <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ ຕົວຢ່າງ, ບາງເວັບໄຊອາດຕອບສະໜອງຕໍ່ກັບຄຳຮ້ອງຂໍນີ້ ໂດຍການສະແດງໃຫ້ທ່ານເຫັນໂຄສະນາທີ່ບໍ່ອີງໃສ່ເວັບໄຊອື່ນທີ່ທ່ານເຂົ້າເບິ່ງ. ຫຼາຍໆເວັບໄຊຈະຍັງບັນທຶກ ແລະໃຊ້ຂໍ້ມູນການທ່ອງເວັບຂອງທ່ານ — ຕົວຢ່າງ ເຊັ່ນ: ເພື່ອປັບປຸງຄວາມປອດໄພ, ເພື່ອສະໜອງເນື້ອຫາ, ໂຄສະນາ ແລະຄຳແນະນໍາຕ່າງໆ ແລະເພື່ອສ້າງສະຖິຕິການລາຍງານ.</translation> <translation id="624789221780392884">ອັບເດດພ້ອມແລ້ວ</translation> <translation id="6255999984061454636">ການແນະນຳເນື້ອຫາ</translation> +<translation id="6270391203985052864">ເວັບໄຊສາມາດຂໍໃຫ້ສົ່ງການແຈ້ງເຕືອນໄດ້</translation> <translation id="6277522088822131679">ມີບັນຫາການພິມໜ້າ. ກະລຸນາລອງໃໝ່ອີກ.</translation> <translation id="6295158916970320988">ທຸກເວັບໄຊທ໌</translation> <translation id="629730747756840877">ບັນຊີ</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">ການສະແກນ Bluetooth</translation> <translation id="6560414384669816528">ຊອກຫາດ້ວຍ Sogou</translation> <translation id="656065428026159829">ເບິ່ງເພີ່ມເຕີມ</translation> +<translation id="6561560012278703671">ໃຊ້ການສົ່ງຂໍ້ຄວາມທີ່ງຽບກວ່າ (ບລັອກບໍ່ໃຫ້ການແຈ້ງເຕືອນຂັດຈັງຫວະທ່ານ)</translation> <translation id="6566259936974865419">Chrome ຊ່ວຍທ່ານປະຢັດໄດ້ <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">ອະນຸຍາດທຸກເທື່ອ</translation> <translation id="6573431926118603307">ແຖບທີ່ທ່ານໄດ້ເປີດໃນ Chrome ຢູ່ໃນອຸປະກອນອື່ນຂອງທ່ານຈະປາກົດຢູ່ບ່ອນນີ້.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">ອຸປະກອນຂອງທ່ານບໍ່ມີແອັບເພື່ອເກັບໄຟລ໌ລະຫັດຜ່ານໄວ້.</translation> <translation id="7302081693174882195">ລາຍລະອຽດ: ຮຽງລຳດັບຕາມປະລິມານຂໍ້ມູນທີ່ບັນທຶກໄວ້</translation> <translation id="7302486331832100261">ໂດຍປົກກະຕິແລ້ວທ່ານບລັອກການແຈ້ງເຕືອນ. ເພື່ອອະນຸຍາດ, ກະລຸນາແຕະລາຍລະອຽດ.</translation> +<translation id="7311441321349344333">NFC ປິດຢູ່ສຳລັບອຸປະກອນນີ້. ເປີດ NFC ໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">ໃນໂໝດ Lite, Chrome ໂຫຼດໜ້າເວັບໄດ້ໄວກວ່າ ແລະ ປະຢັດອິນເຕີເນັດໄດ້ສູງສຸດ 60 ເປີເຊັນ.</translation> <translation id="7333031090786104871">ຍັງກຳລັງເພີ່ມເວັບໄຊກ່ອນໜ້ານີ້ຢູ່</translation> <translation id="7352939065658542140">ວິດີໂອ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index a9757d1..3a215250 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Vai ieslēgt sinhronizāciju?</translation> <translation id="123724288017357924">Atkārtoti ielādēt lapu, ignorējot saturu kešatmiņā</translation> <translation id="124116460088058876">Citas valodas…</translation> +<translation id="1242008676835033345">Iegults vietnē <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Aizvērt pašreizējo cilni</translation> <translation id="1258753120186372309">Google svētku logotips: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Meklēšana un izpēte</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Vairs nerādīt</translation> <translation id="1692118695553449118">Sinhronizācija ieslēgta</translation> <translation id="169515064810179024">Bloķēt vietņu piekļuvi kustību sensoriem</translation> +<translation id="1711267867945983636">Lai turpinātu, tālrunī ieslēdziet tehnoloģiju NFC</translation> <translation id="1717218214683051432">Kustību sensori</translation> <translation id="1718835860248848330">Pēdējā stunda</translation> <translation id="1736419249208073774">Izpētīt</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultāts no <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Signāls</translation> <translation id="2096012225669085171">Sinhronizējiet un personalizējiet vairākās ierīcēs</translation> +<translation id="2099625543891475722">jūsu fiziskās īpašības, piemēram, garums;</translation> <translation id="2100273922101894616">Automātiski pierakstīties</translation> <translation id="2100314319871056947">Kopīgojiet mazākus teksta fragmentus</translation> <translation id="2107397443965016585">Vaicāt, pirms atļaut vietnēm atskaņot aizsargātu saturu (ieteicams)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Izmantot paroli</translation> <translation id="4645575059429386691">Pārvalda viens no jūsu vecākiem</translation> <translation id="4650364565596261010">Sistēmas noklusējums</translation> +<translation id="4660838440047236328">jūsu telpas izkārtojums.</translation> <translation id="4663756553811254707">Dzēstas <ph name="NUMBER_OF_BOOKMARKS" /> grāmatzīmes</translation> <translation id="4665282149850138822">Vietne <ph name="NAME" /> tika pievienota sākuma ekrānam.</translation> <translation id="4684427112815847243">Sinhronizēt visu</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Notīrīt datus</translation> <translation id="5494752089476963479">Bloķēt reklāmas vietnēs, kurās tiek rādītas traucējošas vai maldinošas reklāmas</translation> <translation id="5500777121964041360">Tas var nebūt pieejams jūsu atrašanās vietā</translation> +<translation id="5505264765875738116">Vietnēs nevar lūgt atļauju sūtīt paziņojumus</translation> <translation id="5512137114520586844">Šo kontu pārvalda <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Atspējoja šīs ierīces administrators</translation> <translation id="5515439363601853141">Atbloķējiet, lai skatītu paroli</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Izņēmumi</translation> <translation id="6194112207524046168">Lai atļautu pārlūkprogrammai Chrome piekļūt jūsu kamerai, ieslēdziet kameru arī <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Bloķēt trešo pušu sīkfailus</translation> +<translation id="6201345951596836663">Saite nokopēta</translation> <translation id="6206551242102657620">Savienojums ir drošs. Vietnes informācija</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> nav mana e-pasta adrese</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: iespējas</translation> @@ -711,6 +717,7 @@ Piemēram, dažas vietnes, reaģējot uz šo pieprasījumu, var rādīt jums reklāmas, kuru pamatā nav citas jūsu apmeklētās vietnes. Tomēr daudzas vietnes apkopos un izmantos jūsu pārlūkošanas datus, piemēram, lai uzlabotu drošību, nodrošinātu saturu, reklāmas un ieteikumus un ģenerētu pārskatu statistiku.</translation> <translation id="624789221780392884">Var veikt atjaunināšanu</translation> <translation id="6255999984061454636">Satura ieteikumi</translation> +<translation id="6270391203985052864">Vietnēs var lūgt atļauju sūtīt paziņojumus</translation> <translation id="6277522088822131679">Drukājot lapu, radās problēma. Lūdzu, mēģiniet vēlreiz.</translation> <translation id="6295158916970320988">Visas vietnes</translation> <translation id="629730747756840877">Konts</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth meklēšana</translation> <translation id="6560414384669816528">Meklēšana, izmantojot Sogou</translation> <translation id="656065428026159829">Skatīt vairāk</translation> +<translation id="6561560012278703671">Izmantot neuzkrītošāku ziņojumapmaiņu (bloķēt paziņojumu uzvednes, lai tās jūs netraucētu)</translation> <translation id="6566259936974865419">Pārlūkā Chrome esat ietaupījis <ph name="GIGABYTES" /> GB.</translation> <translation id="6573096386450695060">Vienmēr atļaut</translation> <translation id="6573431926118603307">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Ierīcē nav lietotnes, kurā uzglabāt paroļu failu.</translation> <translation id="7302081693174882195">Detalizēta informācija: kārtota pēc ietaupīto datu apjoma</translation> <translation id="7302486331832100261">Parasti jūs bloķējat paziņojumus. Lai tos atļautu, pieskarieties vienumam Detalizēta informācija.</translation> +<translation id="7311441321349344333">Šajā ierīcē tehnoloģija NFC ir izslēgta. <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> varat ieslēgt NFC.</translation> <translation id="7328017930301109123">Vienkāršotajā režīmā Chrome ielādē lapas ātrāk un patērē pat par 60 procentiem mazāk datu.</translation> <translation id="7333031090786104871">Joprojām notiek iepriekšējās vietnes pievienošana</translation> <translation id="7352939065658542140">VIDEOKLIPS</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index ef8555c..1676d76d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">സമന്വയിപ്പിക്കൽ ഓണാക്കണോ?</translation> <translation id="123724288017357924">കാഷെ ചെയ്ത ഉള്ളടക്കം ഒഴിവാക്കി കൊണ്ട്, നിലവിലെ പേജ് റീലോഡ് ചെയ്യുക</translation> <translation id="124116460088058876">കൂടുതൽ ഭാഷകൾ</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" />-ൽ ഉൾച്ചേർത്തത്</translation> <translation id="124678866338384709">നിലവിലെ ടാബ് അടയ്ക്കുക</translation> <translation id="1258753120186372309">Google ഡൂഡിൽ: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">തിരയുക, അടുത്തറിയുക</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">വീണ്ടും കാണിക്കരുത്</translation> <translation id="1692118695553449118">സമന്വയം ഓണാണ്</translation> <translation id="169515064810179024">ചലന സെൻസറുകൾ ആക്സസ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation> +<translation id="1711267867945983636">തുടരാൻ നിങ്ങളുടെ ഫോണിൽ NFC ഓണാക്കുക</translation> <translation id="1717218214683051432">ചലന സെൻസറുകൾ</translation> <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്</translation> <translation id="1736419249208073774">അടുത്തറിയുക</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /> ഫലം</translation> <translation id="2091887806945687916">ശബ്ദം</translation> <translation id="2096012225669085171">ഉപകരണങ്ങളിലുടനീളം സമന്വയിപ്പിക്കലും വ്യക്തിപരമാക്കലും നടത്തുക.</translation> +<translation id="2099625543891475722">ഉയരം പോലുള്ള, നിങ്ങളുടെ ശാരീരിക സവിശേഷതകൾ</translation> <translation id="2100273922101894616">സ്വയമേവയുള്ള സൈൻ ഇൻ</translation> <translation id="2100314319871056947">ചെറിയ ഭാഗങ്ങളായി ടെക്സ്റ്റ് പങ്കിടാൻ ശ്രമിക്കൂ</translation> <translation id="2107397443965016585">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുന്നതിന് മുമ്പ് ചോദിക്കുക (ശുപാർശചെയ്തത്)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="4645575059429386691">നിങ്ങളുടെ രക്ഷിതാവ് നിയന്ത്രിക്കുന്നു</translation> <translation id="4650364565596261010">സിസ്റ്റം ഡിഫോൾട്ട്</translation> +<translation id="4660838440047236328">നിങ്ങളുടെ റൂമിന്റെ ലേഔട്ട്</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> ബുക്ക്മാർക്കുകൾ ഇല്ലാതാക്കി</translation> <translation id="4665282149850138822"><ph name="NAME" /> എന്നയാളെ നിങ്ങളുടെ ഹോം സ്ക്രീനിൽ ചേർത്തു</translation> <translation id="4684427112815847243">എല്ലാം സമന്വയിപ്പിക്കുക</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ഡാറ്റ മായ്ക്കുക</translation> <translation id="5494752089476963479">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങള് കാണിക്കുന്ന സൈറ്റുകളിലെ പരസ്യങ്ങൾ ബ്ലോക്ക് ചെയ്യുക</translation> <translation id="5500777121964041360">നിങ്ങളുടെ ലൊക്കേഷനിൽ ലഭ്യമായിരിക്കില്ല</translation> +<translation id="5505264765875738116">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കാനാവില്ല</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> ആണ് ഈ അക്കൗണ്ട് നിയന്ത്രിക്കുന്നത്.</translation> <translation id="5514904542973294328">ഈ ഉപകരണത്തിന്റെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="5515439363601853141">നിങ്ങളുടെ പാസ്വേഡ് കാണാൻ അൺലോക്ക് ചെയ്യുക</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">അപവാദങ്ങള്</translation> <translation id="6194112207524046168">Chrome-നെ നിങ്ങളുടെ ക്യാമറ ആക്സസ് ചെയ്യാൻ അനുവദിക്കുന്നതിന്, <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> ക്യാമറയും ഓണാക്കുക.</translation> <translation id="6196640612572343990">മൂന്നാം കക്ഷി കുക്കികള് ബ്ലോക്കുചെയ്യുക</translation> +<translation id="6201345951596836663">ലിങ്ക് പകർത്തി</translation> <translation id="6206551242102657620">കണക്ഷൻ സുരക്ഷിതമാണ്. സൈറ്റ് വിവരങ്ങള്</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> അല്ലേ?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> ഓപ്ഷനുകൾ</translation> @@ -711,6 +717,7 @@ ഉദാഹരണത്തിന്, ചില വെബ്സൈറ്റുകൾ നിങ്ങൾ സന്ദർശിച്ച മറ്റ് വെബ്സൈറ്റുകളെ അടിസ്ഥാനമാക്കിയുള്ളതല്ലാത്ത പരസ്യങ്ങൾ കാണിച്ച് ഈ അഭ്യർത്ഥനയോട് പ്രതികരിക്കാം. മിക്ക വെബ്സൈറ്റുകളും തുടർന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റ ശേഖരിക്കുകയും ഉപയോഗിക്കുകയും ചെയ്യും - ഉദാഹരണത്തിന് അവരുടെ വെബ്സൈറ്റുകളിൽ സുരക്ഷ മെച്ചപ്പെടുത്തുന്നതിനും ഉള്ളടക്കവും പരസ്യങ്ങളും ശുപാർശകളും നൽകുന്നതിനും റിപ്പോർട്ടിംഗ് സ്ഥിതിവിവരക്കണക്കുകൾ സൃഷ്ടിക്കുന്നതിനും.</translation> <translation id="624789221780392884">അപ്ഡേറ്റ് തയ്യാറാണ്</translation> <translation id="6255999984061454636">ഉള്ളടക്ക നിർദ്ദേശങ്ങൾ</translation> +<translation id="6270391203985052864">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കേണ്ടി വരും</translation> <translation id="6277522088822131679">പേജ് പ്രിന്റുചെയ്യുന്നതിൽ ഒരു പ്രശ്നമുണ്ടായി. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="6295158916970320988">എല്ലാ സൈറ്റുകളും</translation> <translation id="629730747756840877">അക്കൗണ്ട്</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth സ്കാനിംഗ്</translation> <translation id="6560414384669816528">Sogou ഉപയോഗിച്ച് തിരയുക</translation> <translation id="656065428026159829">കൂടുതൽ കാണുക</translation> +<translation id="6561560012278703671">നിശബ്ദമായ സന്ദേശമയയ്ക്കൽ ഉപയോഗിക്കുക (നിങ്ങളെ തടസ്സപ്പെടുത്തുന്നതിൽ നിന്ന് അറിയിപ്പ് നിർദ്ദേശങ്ങളെ ബ്ലോക്ക് ചെയ്യുന്നു)</translation> <translation id="6566259936974865419">Chrome നിങ്ങളുടെ <ph name="GIGABYTES" /> GB ലാഭിച്ചു</translation> <translation id="6573096386450695060">എല്ലായ്പ്പോഴും അനുവദിക്കുക</translation> <translation id="6573431926118603307">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ Chrome-ൽ തുറന്ന ടാബുകൾ ഇവിടെ ദൃശ്യമാകും.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്വേഡ് ഫയൽ സംഭരിക്കാനുള്ള ആപ്പ് ഇല്ല.</translation> <translation id="7302081693174882195">വിശദാംശങ്ങൾ: സംരക്ഷിച്ച ഡാറ്റയുടെ അളവനുസരിച്ച് അടുക്കിയത്</translation> <translation id="7302486331832100261">നിങ്ങൾ സാധാരണയായി അറിയിപ്പുകൾ ബ്ലോക്ക് ചെയ്യാറുണ്ട്. അനുവദിക്കാൻ, വിശദാംശങ്ങൾ ടാപ്പ് ചെയ്യുക.</translation> +<translation id="7311441321349344333">ഈ ഉപകരണത്തിനുള്ള NFC ഓഫാണ്. <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> NFC ഓണാക്കുക.</translation> <translation id="7328017930301109123">ലൈറ്റ് മോഡിൽ, Chrome 60 ശതമാനം വരെ കുറവ് ഡാറ്റ ഉപയോഗിക്കുകയും പേജുകൾ വേഗത്തിൽ ലോഡ് ചെയ്യുകയും ചെയ്യുന്നു.</translation> <translation id="7333031090786104871">ഇപ്പോഴും മുമ്പത്തെ സൈറ്റ് ചേർത്തുകൊണ്ടിരിക്കുകയാണ്</translation> <translation id="7352939065658542140">വീഡിയോ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index f575182..5fc016f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Синк асаах уу?</translation> <translation id="123724288017357924">Нөөцөлсөн агуулгыг алгасч одоогийн хуудсыг дахин ачаалах</translation> <translation id="124116460088058876">Бусад хэл</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" />-д оруулсан</translation> <translation id="124678866338384709">Үндсэн чихтэй хуудсыг хаах</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Хайх, судлах</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Дахиж бүү харуул</translation> <translation id="1692118695553449118">Тохиргоо асаалттай байна.</translation> <translation id="169515064810179024">Сайтуудыг хөдөлгөөн мэдрэгчид хандахыг хориглох</translation> +<translation id="1711267867945983636">Үргэлжлүүлэхийн тулд утсан дээрээ NFC-г асаана уу</translation> <translation id="1717218214683051432">Хөдөлгөөн мэдрэгч</translation> <translation id="1718835860248848330">Сүүлийн цаг</translation> <translation id="1736419249208073774">Судлах</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />-ын <ph name="RESULT_NUMBER" /> илэрц байна</translation> <translation id="2091887806945687916">Дуу</translation> <translation id="2096012225669085171">Төхөөрөмжүүдийг синк хийж хувийн болгох</translation> +<translation id="2099625543891475722">таны биеийн онцлог, жишээлбэл, өндөр</translation> <translation id="2100273922101894616">Автоматаар нэвтэх</translation> <translation id="2100314319871056947">Текстийг жижиг хэсгээр хуваалцахыг оролдоно уу</translation> <translation id="2107397443965016585">Сайтад хамгаалагдсан контент тоглуулахыг зөвшөөрөхөөс өмнө асуух (санал болгосон)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Нууц үг ашиглах</translation> <translation id="4645575059429386691">Эцэг, эх нь хариуцаж байна</translation> <translation id="4650364565596261010">Системийн өгөгдмөл</translation> +<translation id="4660838440047236328">таны өрөөний төлөвлөлт</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> хавчуурга устгасан</translation> <translation id="4665282149850138822"><ph name="NAME" />-г таны үндсэн дэлгэцэд нэмсэн</translation> <translation id="4684427112815847243">Бүгдийг sync хийх</translation> @@ -604,6 +608,7 @@ <translation id="5487521232677179737">Өгөгдлийг устгах</translation> <translation id="5494752089476963479">Төвөгтэй эсвэл хуурамч зар харуулдаг сайтуудын зарыг блоклох</translation> <translation id="5500777121964041360">Таны байршилд боломжгүй байж магадгүй</translation> +<translation id="5505264765875738116">Сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжгүй</translation> <translation id="5512137114520586844">Энэ хаягийг <ph name="PARENT_NAME" /> удирдаж байна.</translation> <translation id="5514904542973294328">Энэ төхөөрөмжийн администратор цуцалсан</translation> <translation id="5515439363601853141">Нууц үгээ харах бол түгжээг тайлна уу</translation> @@ -701,6 +706,7 @@ <translation id="6192792657125177640">Гажих нөхцлүүд</translation> <translation id="6194112207524046168">Chrome-д камертаа хандахыг зөвшөөрөхийн тулд камерыг <ph name="BEGIN_LINK" />Android-н тохиргоонд<ph name="END_LINK" /> мөн адил асаана уу.</translation> <translation id="6196640612572343990">Гуравдагч талын күүкиг блоклох</translation> +<translation id="6201345951596836663">Холбоосыг хууллаа</translation> <translation id="6206551242102657620">Холболт аюулгүй байна. Сайтын мэдээлэл</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> биш үү?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Сонголт</translation> @@ -710,6 +716,7 @@ Жишээ нь: зарим вэб хуудас тухайн хүсэлтэд таны өмнө нь зочилж байсан бусад вэб хуудаснаас хамаарахгүйгээр зар сурталчилгаа үзүүлэх замаар хариу өгч болно. Ихэнх вэб хуудас нь аюулгүй байдлыг сайжруулах, вэб хуудасны мэдээлэл, зар, зөвлөгөөг харуулах, мөн тайлагнах статистик мэдээлэл гаргах зорилгоор таны хөтчийн мэдээллийг цуглуулан ашиглаж магадгүй.</translation> <translation id="624789221780392884">Шинэчлэлт хийхэд бэлэн</translation> <translation id="6255999984061454636">Агуулгын зөвлөмж</translation> +<translation id="6270391203985052864">Сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжтой</translation> <translation id="6277522088822131679">Энэ хуудсыг хэвлэхэд алдаа гарсан байна. Та дахин ачаална уу.</translation> <translation id="6295158916970320988">Бүх сайт</translation> <translation id="629730747756840877">Данс</translation> @@ -754,6 +761,7 @@ <translation id="6545864417968258051">Bluetooth скан хийх</translation> <translation id="6560414384669816528">Sogou-р хайх</translation> <translation id="656065428026159829">Дэлгэрэнгүй үзэх</translation> +<translation id="6561560012278703671">Илүү чимээгүй зурвасыг ашиглах (мэдэгдлийн сануулгад танд саад болохыг хориглодог)</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> гигабайтыг хэмнэсэн</translation> <translation id="6573096386450695060">Байнга зөвшөөрөх</translation> <translation id="6573431926118603307">Таны бусад төхөөрөмжөөрөө Chrome-д нээсэн чихтэй хуудас энд харагдах болно.</translation> @@ -851,6 +859,7 @@ <translation id="729975465115245577">Таны төхөөрөмжид нууц үгийн файлыг хадгалах апп байхгүй байна.</translation> <translation id="7302081693174882195">Дэлгэрэнгүй: Хэмнэсэн датаны хэмжээгээр нь эрэмбэлсэн</translation> <translation id="7302486331832100261">Та ихэвчлэн мэдэгдлийг хориглодог. Зөвшөөрөхийн тулд Дэлгэрэнгүй мэдээлэл дээр товшино уу.</translation> +<translation id="7311441321349344333">Энэ төхөөрөмж дээр NFC унтраалттай байна. Үүнийг <ph name="BEGIN_LINK" />Android тохиргоо<ph name="END_LINK" /> хэсгийн NFC дээр асаана уу.</translation> <translation id="7328017930301109123">Lite горимд байх үед Chrome хуудсыг илүү хурдан ачаалж, 60 хувь хүртэлх бага дата ашигладаг.</translation> <translation id="7333031090786104871">Өмнөх сайтыг нэмж байна</translation> <translation id="7352939065658542140">ВИДЕО</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 7572cfa5..317df1f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">सिंक सुरू करायचे का?</translation> <translation id="123724288017357924">कॅश केलेला आशय दुर्लक्षित करून, सद्य पेज रीलोड करा</translation> <translation id="124116460088058876">आणखी भाषा...</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> वर एम्बेड केले</translation> <translation id="124678866338384709">वर्तमान टॅब बंद करा</translation> <translation id="1258753120186372309">Google डूडल: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">शोधा आणि एक्सप्लोर करा</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">पुन्हा दाखवू नका</translation> <translation id="1692118695553449118">संकालन चालू आहे</translation> <translation id="169515064810179024">साइटना मोशन सेन्सर ॲक्सेसपासून ब्लॉक करा</translation> +<translation id="1711267867945983636">पुढे सुरू ठेवण्यासाठी, तुमच्या फोनवर NFC सुरू करा</translation> <translation id="1717218214683051432">मोशन सेन्सर</translation> <translation id="1718835860248848330">शेवटच्या तासामधील</translation> <translation id="1736419249208073774">एक्सप्लोर करा</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> पैकी <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2091887806945687916">ध्वनी</translation> <translation id="2096012225669085171">डिव्हाइसवर सिंक आणि पर्सनलाइझ करा</translation> +<translation id="2099625543891475722">तुमची शारीरिक वैशिष्ट्ये जसे की, उंची</translation> <translation id="2100273922101894616">ऑटो साइन इन करा</translation> <translation id="2100314319871056947">मजकूर लहान भागांमध्ये शेअर करून पाहा</translation> <translation id="2107397443965016585">साइटना संरक्षित आशय प्ले करू देण्याआधी विचारा (शिफारस केली जाते)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">पासवर्ड वापरा</translation> <translation id="4645575059429386691">आपल्या पालकांद्वारे व्यवस्थापित करण्यात आले</translation> <translation id="4650364565596261010">सिस्टम डीफॉल्ट</translation> +<translation id="4660838440047236328">तुमच्या रूमचा लेआउट</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> बुकमार्क हटविले</translation> <translation id="4665282149850138822"><ph name="NAME" /> ला तुमच्या होम स्क्रीनवर पेअरिंग आले</translation> <translation id="4684427112815847243">सर्वकाही संंकालित करा</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">डेटा साफ करा</translation> <translation id="5494752089476963479">अनाहूत किंवा दिशाभूल करणाऱ्या जाहिराती दाखवणाऱ्या साइटवरील जाहिराती ब्लॉक करा</translation> <translation id="5500777121964041360">तुमच्या स्थानामध्ये उपलब्ध नसू शकते</translation> +<translation id="5505264765875738116">साइट सूचना पाठवण्यास सांगू शकत नाहीत</translation> <translation id="5512137114520586844">हे खाते <ph name="PARENT_NAME" /> द्वारे व्यवस्थापित केले आहे.</translation> <translation id="5514904542973294328">या डिव्हाइसच्या ॲडमिनिस्ट्रेटरने बंद केले आहे.</translation> <translation id="5515439363601853141">तुमचा पासवर्ड पाहण्यासाठी अनलॉक करा</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">अपवाद</translation> <translation id="6194112207524046168">Chrome ला तुमच्या कॅमेराचा ॲक्सेस द्या, <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्ये देखील कॅमेरा सुरू करा.</translation> <translation id="6196640612572343990">तृतीय-पक्ष कुकीज अवरोधित करा</translation> +<translation id="6201345951596836663">लिंक कॉपी केली</translation> <translation id="6206551242102657620">कनेक्शन सुरक्षित आहे. साइट माहिती</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> नाही?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> पर्याय</translation> @@ -711,6 +717,7 @@ उदाहरणार्थ, काही वेबसाइट तुम्ही भेट दिलेल्या इतर वेबसाइटवर आधारित नसलेल्या जाहिराती तुम्हाला दर्शवून या विनंतीस प्रतिसाद देऊ शकतात. अनेक वेबसाइट अद्यापही तुमचा ब्राउझिंग डेटा संकलित करून त्याचा वापर करतील - उदाहरणार्थ त्यांच्या वेबसाइटवर सुरक्षितता सुधारणे, आशय, जाहिराती आणि शिफारशी देऊ करणे आणि अहवाल आकडेवारी व्युत्पन्न करणे.</translation> <translation id="624789221780392884">अपडेट तयार</translation> <translation id="6255999984061454636">आशय सूचना</translation> +<translation id="6270391203985052864">साइट सूचना पाठवण्यास सांगू शकतात</translation> <translation id="6277522088822131679">पृष्ठ प्रिंट करण्यात एक समस्या होती. कृपया पुन्हा प्रयत्न करा.</translation> <translation id="6295158916970320988">सर्व साइट</translation> <translation id="629730747756840877">खाते</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">ब्लूटूथ स्कॅन करत आहे</translation> <translation id="6560414384669816528">Sogou सह शोध करा</translation> <translation id="656065428026159829">आणखी पाहा</translation> +<translation id="6561560012278703671">कमी आवाजाचा मेसेज वापरा (तुम्हाला व्यत्यय आणणे थांबवण्यासाठी सूचना ब्लॉक करा)</translation> <translation id="6566259936974865419">Chrome ने तुमच्यासाठी <ph name="GIGABYTES" /> GB सेव्ह केले आहे</translation> <translation id="6573096386450695060">नेहमी अनुमती द्या</translation> <translation id="6573431926118603307">आपल्या अन्य डिव्हाइसेसवर तुम्ही Chrome मध्ये उघडलेले टॅब येथे दिसतील.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">पासवर्ड फाइल स्टोअर करण्यासाठी तुमच्या डिव्हाइसमध्ये अॅप नाही.</translation> <translation id="7302081693174882195">तपशील: सेव्ह केलेल्या डेटाच्या प्रमाणानुसार क्रमाने लावलेले</translation> <translation id="7302486331832100261">तुम्ही सहसा सूचना ब्लॉक करता. अनुमती देण्यासाठी, तपशील वर टॅप करा.</translation> +<translation id="7311441321349344333">या डिव्हाइससाठी NFC बंद केले आहे. ते <ph name="BEGIN_LINK" />Android सेटिंग्जमध्ये<ph name="END_LINK" /> NFC सुरू करा.</translation> <translation id="7328017930301109123">लाइट मोडमध्ये, Chrome पेज आणखी जलद लोड करते आणि ६० टक्के पर्यंत कमी डेटा वापरते.</translation> <translation id="7333031090786104871">अद्याप मागील साइट जोडत आहे</translation> <translation id="7352939065658542140">व्हिडिओ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 02e334f4..19d4f2e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Vil du slå på synkronisering?</translation> <translation id="123724288017357924">Last inn siden på nytt, men ignorer bufret innhold</translation> <translation id="124116460088058876">Flere språk</translation> +<translation id="1242008676835033345">Bygd inn på <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Lukk den aktive fanen</translation> <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Søk og utforsk</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Ikke vis igjen</translation> <translation id="1692118695553449118">Synkronisering er slått på.</translation> <translation id="169515064810179024">Blokkér nettsteder fra å få tilgang til bevegelsessensorer</translation> +<translation id="1711267867945983636">For å fortsette, slå på NFC på telefonen</translation> <translation id="1717218214683051432">Bevegelsessensorer</translation> <translation id="1718835860248848330">Siste time</translation> <translation id="1736419249208073774">Utforsk</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Lyd</translation> <translation id="2096012225669085171">Synkronisering og personlig tilpasning på alle enheter</translation> +<translation id="2099625543891475722">fysiske kjennetegn, som hvor høy du er</translation> <translation id="2100273922101894616">Automatisk pålogging</translation> <translation id="2100314319871056947">Prøv å dele teksten i mindre deler</translation> <translation id="2107397443965016585">Spør før nettsteder får tillatelse til å spille beskyttet innhold (anbefalt)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Bruk passord</translation> <translation id="4645575059429386691">Administreres av foreldrene dine</translation> <translation id="4650364565596261010">Systemstandard</translation> +<translation id="4660838440047236328">hvordan rommet ditt ser ut</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> bokmerker ble slettet</translation> <translation id="4665282149850138822"><ph name="NAME" /> ble lagt til på startskjermen</translation> <translation id="4684427112815847243">Synkroniser alt</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Slett data</translation> <translation id="5494752089476963479">Blokkér annonser på nettsteder som ofte viser forstyrrende eller villedende annonser</translation> <translation id="5500777121964041360">Funksjonen er kanskje ikke tilgjengelig der du er</translation> +<translation id="5505264765875738116">Nettsteder kan ikke be om å få sende varsler</translation> <translation id="5512137114520586844">Denne kontoen er administrert av <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Deaktivert av administratoren for denne enheten</translation> <translation id="5515439363601853141">Lås opp for å se passordet ditt</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Unntak</translation> <translation id="6194112207524046168">For å gi Chrome tilgang til kameraet må du også slå på kameraet i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokkér informasjonskapsler fra tredjeparter</translation> +<translation id="6201345951596836663">Linken er kopiert</translation> <translation id="6206551242102657620">Tilkoblingen er sikker. Informasjon om nettstedet</translation> <translation id="6210748933810148297">Ikke <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Alternativer for <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Noen nettsteder kan for eksempel svare på denne forespørselen ved å vise deg annonser som ikke er basert på andre nettsteder du har besøkt. Mange nettsteder samler likevel inn og bruker nettlesingsdataene dine – for eksempel for å forbedre sikkerheten, for å levere innhold, annonser og anbefalinger og for å generere rapporteringsstatistikk.</translation> <translation id="624789221780392884">Oppdateringen er klar</translation> <translation id="6255999984061454636">Innholdsforslag</translation> +<translation id="6270391203985052864">Nettsteder kan be om å få sende deg varsler</translation> <translation id="6277522088822131679">Det oppsto et problem med å skrive ut siden. Prøv på nytt.</translation> <translation id="6295158916970320988">Alle nettsteder</translation> <translation id="629730747756840877">Konto</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth-skanning</translation> <translation id="6560414384669816528">Søk med Sogou</translation> <translation id="656065428026159829">Se mer</translation> +<translation id="6561560012278703671">Bruk stillere meldinger (blokkerer varselmeldinger fra å forstyrre deg)</translation> <translation id="6566259936974865419">Chrome har spart deg for <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Tillat alltid</translation> <translation id="6573431926118603307">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Enheten din har ingen app som kan lagre passordfilen.</translation> <translation id="7302081693174882195">Informasjon: Sortert etter mengden data som er lagret</translation> <translation id="7302486331832100261">Du blokkerer vanligvis varsler. For å tillate dette trykker du på Detaljer.</translation> +<translation id="7311441321349344333">NFC er av for denne enheten. Slå på NFC i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">I forenklet modus laster Chrome inn sider raskere og bruker opptil 60 prosent mindre data.</translation> <translation id="7333031090786104871">Holder fortsatt på å legge til det forrige nettstedet</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index c91f4b0d..d1dc6f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">ਕੀ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> <translation id="123724288017357924">ਕੈਸ਼ੇ ਕੀਤੀ ਸਮੱਗਰੀ ਨੂੰ ਅਣਡਿੱਠ ਕਰਕੇ ਮੌਜੂਦਾ ਪੰਨਾ ਰੀਲੋਡ ਕਰੋ</translation> <translation id="124116460088058876">ਹੋਰ ਭਾਸ਼ਾਵਾਂ</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> 'ਤੇ ਪਰੋਇਆ ਗਿਆ</translation> <translation id="124678866338384709">ਮੌਜੂਦਾ ਟੈਬ ਬੰਦ ਕਰੋ</translation> <translation id="1258753120186372309">Google ਡੂਡਲ: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">ਖੋਜੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ</translation> <translation id="1692118695553449118">ਸਿੰਕ ਚਾਲੂ ਹੈ</translation> <translation id="169515064810179024">ਸਾਈਟਾਂ ਨੂੰ ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> +<translation id="1711267867945983636">ਜਾਰੀ ਰੱਖਣ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ 'ਤੇ NFC ਚਾਲੂ ਕਰੋ</translation> <translation id="1717218214683051432">ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰ</translation> <translation id="1718835860248848330">ਪਿਛਲਾ ਘੰਟਾ</translation> <translation id="1736419249208073774">ਪੜਚੋਲ ਕਰੋ</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ਦਾ <ph name="RESULT_NUMBER" /> ਨਤੀਜਾ</translation> <translation id="2091887806945687916">ਧੁਨੀ</translation> <translation id="2096012225669085171">ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ ਸਮਕਾਲੀਕਰਨ ਕਰੋ ਅਤੇ ਵਿਅਕਤੀਗਤ ਬਣਾਓ</translation> +<translation id="2099625543891475722">ਤੁਹਾਡੀਆਂ ਸਰੀਰਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ, ਜਿਵੇਂ ਕਿ ਲੰਬਾਈ</translation> <translation id="2100273922101894616">ਸਵੈਚਲਿਤ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="2100314319871056947">ਲਿਖਤ ਨੂੰ ਵਧੇਰੇ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਸਾਂਝਾ ਕਰਕੇ ਦੇਖੋ</translation> <translation id="2107397443965016585">ਸਾਈਟਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕੀਤੀ ਸਮੱਗਰੀ ਚਲਾਉਣ ਦੇਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛੋ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">ਪਾਸਵਰਡ ਵਰਤੋ</translation> <translation id="4645575059429386691">ਤੁਹਾਡੇ ਮਾਤਾ ਜਾਂ ਪਿਤਾ ਵੱਲੋਂ ਵਿਵਸਥਿਤ</translation> <translation id="4650364565596261010">ਸਿਸਟਮ ਪੂਰਵ-ਨਿਰਧਾਰਤ</translation> +<translation id="4660838440047236328">ਤੁਹਾਡੇ ਕਮਰੇ ਦਾ ਖਾਕਾ</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> ਬੁੁੱਕਮਾਰਕ ਮਿਟਾਏ ਗਏ</translation> <translation id="4665282149850138822"><ph name="NAME" /> ਨੂੰ ਤੁਹਾਡੀ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="4684427112815847243">ਸਭ ਕੁਝ ਸਿੰਕ ਕਰੋ</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737"> ਡਾਟਾ ਸਾਫ਼ ਕਰੋ</translation> <translation id="5494752089476963479">ਉਹਨਾਂ ਸਾਈਟਾਂ 'ਤੇ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ, ਜੋ ਦਖਲਅੰਦਾਜ਼ੀ ਅਤੇ ਗੁਮਰਾਹ ਕਰਨ ਵਾਲੇ ਵਿਗਿਆਪਨ ਦਿਖਾਉਂਦੀਆਂ ਹਨ</translation> <translation id="5500777121964041360">ਸ਼ਾਇਦ ਤੁਹਾਡੇ ਟਿਕਾਣੇ 'ਤੇ ਉਪਲਬਧ ਨਾ ਹੋਵੇ</translation> +<translation id="5505264765875738116">ਸਾਈਟਾਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਨਹੀਂ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="5512137114520586844">ਇਹ ਖਾਤਾ <ph name="PARENT_NAME" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="5514904542973294328">ਇਸ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> <translation id="5515439363601853141">ਆਪਣਾ ਪਾਸਵਰਡ ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">ਵਿਵਰਜਨ</translation> <translation id="6194112207524046168">Chrome ਨੂੰ ਆਪਣੇ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣ ਲਈ <ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਕੈਮਰਾ ਵੀ ਚਾਲੂ ਕਰੋ।</translation> <translation id="6196640612572343990">ਤੀਜੀ-ਧਿਰ ਵਾਲੀਆਂ ਕੁੱਕੀਜ਼ ਨੂੰ ਬਲੌਕ ਕਰੋ</translation> +<translation id="6201345951596836663">ਲਿੰਕ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation> <translation id="6206551242102657620">ਕਨੈਕਸ਼ਨ ਸੁਰੱਖਿਅਤ ਹੈ। ਸਾਈਟ ਜਾਣਕਾਰੀ</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ਨਹੀਂ ਹੋ?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> ਵਿਕਲਪ</translation> @@ -711,6 +717,7 @@ ਉਦਾਹਰਨ ਲਈ, ਕੁਝ ਵੈੱਬਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਉਹ ਵਿਗਿਆਪਨ ਦਿਖਾ ਕੇ ਇਸ ਬੇਨਤੀ ਦਾ ਜਵਾਬ ਦੇ ਸਕਦੀਆਂ ਹਨ ਜੋ ਤੁਹਾਡੇ ਵੱਲੋਂ ਹੋਰਾਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਜਾਣ 'ਤੇ ਆਧਾਰਿਤ ਨਹੀਂ ਹਨ। ਕਈ ਵੈੱਬਸਾਈਟਾਂ ਤਦ ਵੀ ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ ਕਰਨ ਸੰਬੰਧੀ ਡਾਟਾ ਇਕੱਤਰ ਕਰਨਗੀਆਂ ਅਤੇ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰਨਗੀਆਂ - ਉਦਾਹਰਨ ਲਈ ਸੁਰੱਖਿਆ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸਮੱਗਰੀ, ਵਿਗਿਆਪਨ ਅਤੇ ਸਿਫ਼ਾਰਸ਼ਾਂ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਅਤੇ ਰਿਪੋਰਟਿੰਗ ਅੰਕੜੇ ਸਿਰਜਣ ਲਈ।</translation> <translation id="624789221780392884">ਅੱਪਡੇਟ ਤਿਆਰ</translation> <translation id="6255999984061454636">ਸਮੱਗਰੀ ਦੇ ਸੁਝਾਅ</translation> +<translation id="6270391203985052864">ਸਾਈਟਾਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="6277522088822131679">ਸਫ਼ਾ ਪ੍ਰਿੰਟ ਕਰਨ ਵਿੱਚ ਇੱਕ ਸਮੱਸਿਆ ਹੋਈ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="6295158916970320988">ਸਾਰੀਆਂ ਸਾਈਟਾਂ</translation> <translation id="629730747756840877">ਖਾਤਾ</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">ਬਲੂਟੁੱਥ ਸਕੈਨਿੰਗ</translation> <translation id="6560414384669816528">Sogou ਨਾਲ ਖੋਜੋ</translation> <translation id="656065428026159829">ਹੋਰ ਦੇਖੋ</translation> +<translation id="6561560012278703671">ਵਧੇਰੇ ਸ਼ਾਂਤ ਸੁਨੇਹਾ ਵਰਤੋ (ਤੁਹਾਡਾ ਧਿਆਨ ਭਟਕਾਉਣ ਵਾਲੇ ਸੂਚਨਾ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਜਾਂਦਾ ਹੈ)</translation> <translation id="6566259936974865419">Chrome ਨੇ ਤੁਹਾਡੀ <ph name="GIGABYTES" /> GB ਦੀ ਬਚਤ ਕੀਤੀ ਹੈ</translation> <translation id="6573096386450695060">ਹਮੇਸ਼ਾਂ ਰੀਡਾਇਰੈਕਟ ਕਰਨ ਦਿਓ</translation> <translation id="6573431926118603307">ਤੁਹਾਡੇ ਹੋਰ ਡੀਵਾਈਸਾਂ 'ਤੇ Chrome ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਟੈਬਾਂ ਇੱਥੇ ਦਿਖਾਈ ਦੇਣਗੀਆਂ।</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਪਾਸਵਰਡ ਫ਼ਾਈਲ ਨੂੰ ਸਟੋਰ ਕਰਨ ਲਈ ਕੋਈ ਐਪ ਨਹੀਂ ਹੈ।</translation> <translation id="7302081693174882195">ਵੇਰਵੇ: ਰੱਖਿਅਤ ਕੀਤੇ ਗਏ ਡਾਟੇ ਦੀ ਮਾਤਰਾ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕੀਤਾ ਗਿਆ</translation> <translation id="7302486331832100261">ਆਮ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰਦੇ ਹੋ। ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ, ਵੇਰਵਿਆਂ 'ਤੇ ਟੈਪ ਕਰੋ।</translation> +<translation id="7311441321349344333">ਇਸ ਡੀਵਾਈਸ ਲਈ NFC ਬੰਦ ਹੈ। <ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ NFC 'ਤੇ ਇਸਨੂੰ ਚਾਲ ਕਰੋ।</translation> <translation id="7328017930301109123">ਲਾਈਟ ਮੋਡ ਵਿੱਚ, Chrome ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਪੰਨੇ ਲੋਡ ਕਰਦਾ ਹੈ ਅਤੇ 60 ਪ੍ਰਤੀਸ਼ਤ ਤੱਕ ਘੱਟ ਡਾਟਾ ਵਰਤਦਾ ਹੈ।</translation> <translation id="7333031090786104871">ਹਾਲੇ ਪਿਛਲੀ ਸਾਈਟ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="7352939065658542140">ਵੀਡੀਓ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 32b63c6f..c4f93ba 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Activezi sincronizarea?</translation> <translation id="123724288017357924">Reîncarcă pagina, ignorând conținutul din cache</translation> <translation id="124116460088058876">Mai multe limbi</translation> +<translation id="1242008676835033345">Încorporat în <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Închide fila actuală</translation> <translation id="1258753120186372309">Doodle Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Caută și explorează</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Nu mai afișa</translation> <translation id="1692118695553449118">Sincronizarea este activată</translation> <translation id="169515064810179024">Împiedică site-urile să acceseze senzorii de mișcare</translation> +<translation id="1711267867945983636">Pentru a continua, activează NFC pe telefon</translation> <translation id="1717218214683051432">Senzori de mișcare</translation> <translation id="1718835860248848330">Ultima oră</translation> <translation id="1736419249208073774">Explorează</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Rezultatul <ph name="RESULT_NUMBER" /> din <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Sunet</translation> <translation id="2096012225669085171">Sincronizează și personalizează pe toate dispozitivele</translation> +<translation id="2099625543891475722">trăsăturile tale fizice, cum ar fi înălțimea;</translation> <translation id="2100273922101894616">Conectare automată</translation> <translation id="2100314319871056947">Împarte textul în fragmente mai mici</translation> <translation id="2107397443965016585">Întreabă înainte de a permite site-urilor să redea conținut protejat (recomandat)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Folosește parola</translation> <translation id="4645575059429386691">Gestionat de părintele tău</translation> <translation id="4650364565596261010">Setare prestabilită a sistemului</translation> +<translation id="4660838440047236328">aspectul camerei în care te afli.</translation> <translation id="4663756553811254707">S-au șters <ph name="NUMBER_OF_BOOKMARKS" /> (de) marcaje</translation> <translation id="4665282149850138822">Site-ul <ph name="NAME" /> a fost adăugat pe ecranul de pornire</translation> <translation id="4684427112815847243">Sincronizează tot</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Șterge datele</translation> <translation id="5494752089476963479">Blochează anunțurile pe site-urile care afișează anunțuri deranjante sau înșelătoare</translation> <translation id="5500777121964041360">Este posibil să nu fie disponibil în locația ta</translation> +<translation id="5505264765875738116">Site-urile nu îți pot solicita să îți trimită notificări</translation> <translation id="5512137114520586844">Acest cont este gestionat de <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Dezactivată de administratorul dispozitivului</translation> <translation id="5515439363601853141">Deblochează pentru a vedea parola</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Excepții</translation> <translation id="6194112207524046168">Pentru a permite Chrome să acceseze camera, activează camera și în <ph name="BEGIN_LINK" />Setările Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blochează cookie-urile terță parte</translation> +<translation id="6201345951596836663">Linkul a fost copiat</translation> <translation id="6206551242102657620">Conexiunea este sigură. Informații despre site</translation> <translation id="6210748933810148297">Nu ești <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opțiuni pentru <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ De exemplu, unele site-uri pot răspunde la această solicitare afișând anunțuri care nu se bazează pe alte site-uri accesate de tine. Numeroase site-uri vor culege și vor utiliza în continuare datele de navigare. De exemplu, pentru a îmbunătăți securitatea, pentru a oferi conținut, anunțuri și recomandări și pentru a genera statistici de raportare.</translation> <translation id="624789221780392884">Actualizarea este pregătită</translation> <translation id="6255999984061454636">Sugestii de conținut</translation> +<translation id="6270391203985052864">Site-urile îți pot solicita să îți trimită notificări</translation> <translation id="6277522088822131679">A apărut o problemă la printarea paginii. Încercați din nou.</translation> <translation id="6295158916970320988">Toate site-urile</translation> <translation id="629730747756840877">Cont</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Căutare Bluetooth</translation> <translation id="6560414384669816528">Caută cu Sogou</translation> <translation id="656065428026159829">Vezi mai multe</translation> +<translation id="6561560012278703671">Folosește mesageria mai discretă (împiedică solicitările de notificări astfel încât să nu te întrerupă)</translation> <translation id="6566259936974865419">Chrome a economisit <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Permite întotdeauna</translation> <translation id="6573431926118603307">Filele deschise în Chrome pe alte dispozitive vor apărea aici.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Dispozitivul nu are o aplicație pentru stocarea fișierului parolelor.</translation> <translation id="7302081693174882195">Detalii: sortate după volumul de date salvate</translation> <translation id="7302486331832100261">De obicei blochezi notificările. Ca să le permiți, atinge Detalii.</translation> +<translation id="7311441321349344333">NFC este dezactivat pentru acest dispozitiv. Activează-l în <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">În modul Lite, Chrome încarcă mai repede paginile și folosește cu până la 60 de procente mai puține date.</translation> <translation id="7333031090786104871">Încă se adaugă site-ul anterior</translation> <translation id="7352939065658542140">VIDEOCLIP</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 12f2101..1499155 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Включить синхронизацию?</translation> <translation id="123724288017357924">Обновить страницу без учета кешированного контента</translation> <translation id="124116460088058876">Другие языки</translation> +<translation id="1242008676835033345">Встроено на сайте <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Закрыть вкладку</translation> <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Поиск и рекомендации</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Больше не показывать</translation> <translation id="1692118695553449118">Синхронизация включена</translation> <translation id="169515064810179024">Закрыть сайтам доступ к датчикам движения</translation> +<translation id="1711267867945983636">Чтобы продолжить, включите NFC на телефоне.</translation> <translation id="1717218214683051432">Датчики движения</translation> <translation id="1718835860248848330">Последний час</translation> <translation id="1736419249208073774">Подробнее</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" />, всего <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Звук</translation> <translation id="2096012225669085171">Синхронизация и персонализация данных на всех устройствах.</translation> +<translation id="2099625543891475722">получить представление о параметрах вашего тела, например о росте;</translation> <translation id="2100273922101894616">Автоматический вход</translation> <translation id="2100314319871056947">Перед отправкой разбейте текст на несколько частей.</translation> <translation id="2107397443965016585">Запрашивать разрешение на воспроизведение защищенного контента (рекомендуется)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Использовать пароль</translation> <translation id="4645575059429386691">Управляется вашими родителями</translation> <translation id="4650364565596261010">По умолчанию</translation> +<translation id="4660838440047236328">узнать планировку комнаты, в которой вы находитесь.</translation> <translation id="4663756553811254707">Удалено закладок: <ph name="NUMBER_OF_BOOKMARKS" /></translation> <translation id="4665282149850138822">Сайт <ph name="NAME" /> добавлен на главный экран</translation> <translation id="4684427112815847243">Синхронизировать все</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Удалить данные</translation> <translation id="5494752089476963479">Блокировать объявления на сайтах, которые показывают навязчивую или вводящую в заблуждение рекламу</translation> <translation id="5500777121964041360">Возможно, эта функция недоступна в вашей стране.</translation> +<translation id="5505264765875738116">Сайты не могут запрашивать разрешения на отправку уведомлений</translation> <translation id="5512137114520586844">Этим аккаунтом управляет <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Отключено администратором устройства</translation> <translation id="5515439363601853141">Чтобы увидеть пароль, разблокируйте экран</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Исключения</translation> <translation id="6194112207524046168">Чтобы Chrome получил доступ к камере, включите ее в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Блокировать сторонние файлы cookie</translation> +<translation id="6201345951596836663">Ссылка скопирована.</translation> <translation id="6206551242102657620">Подключение защищено. Информация о сайте</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> не ваш аккаунт?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation> @@ -711,6 +717,7 @@ Например, некоторые сайты перестанут показывать рекламу, подобранную на основе посещенных вами страниц. Другие сайты продолжат собирать и использовать данные о работе в браузере (например, для повышения уровня безопасности, предоставления контента, демонстрации рекламы и рекомендаций или формирования статистических отчетов).</translation> <translation id="624789221780392884">Обновление готово</translation> <translation id="6255999984061454636">Предлагаемый контент</translation> +<translation id="6270391203985052864">Сайты могут запрашивать разрешения на отправку уведомлений</translation> <translation id="6277522088822131679">Не удалось распечатать страницу. Повторите попытку.</translation> <translation id="6295158916970320988">Все сайты</translation> <translation id="629730747756840877">Аккаунт</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Поиск Bluetooth-устройств</translation> <translation id="6560414384669816528">Поиск в Sogou</translation> <translation id="656065428026159829">Ещё</translation> +<translation id="6561560012278703671">Не прерывать мою работу при запросе разрешения на показ уведомлений</translation> <translation id="6566259936974865419">Благодаря Chrome вы сэкономили <ph name="GIGABYTES" /> ГБ свободного места</translation> <translation id="6573096386450695060">Разрешать всегда</translation> <translation id="6573431926118603307">Здесь появятся вкладки, открытые в Chrome на других устройствах.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">На устройстве не установлено приложение для хранения файлов паролей.</translation> <translation id="7302081693174882195">Сортировка по объему сэкономленного трафика</translation> <translation id="7302486331832100261">Обычно вы блокируете уведомления. Чтобы разрешить их показ, нажмите "Подробнее".</translation> +<translation id="7311441321349344333">Функция NFC на этом устройстве отключена. Включите ее в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">В упрощенном режиме Chrome быстрее загружает страницы и экономит до 60 процентов трафика.</translation> <translation id="7333031090786104871">Предыдущий сайт ещё не добавлен</translation> <translation id="7352939065658542140">ВИДЕО</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index ae730bd..63ee4ea 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Chcete zapnúť synchronizáciu?</translation> <translation id="123724288017357924">Opätovné načítanie aktuálnej stránky a ignorovanie obsahu vo vyrovnávacej pamäti</translation> <translation id="124116460088058876">Ďalšie jazyky</translation> +<translation id="1242008676835033345">Vložené na webe <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Zavretie aktuálnej karty</translation> <translation id="1258753120186372309">Sviatočné logo Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Prehľadať a preskúmať</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Nabudúce nezobrazovať</translation> <translation id="1692118695553449118">Synchronizácia je zapnutá.</translation> <translation id="169515064810179024">Blokovať webom prístup k senzorom pohybu</translation> +<translation id="1711267867945983636">Ak chcete pokračovať, zapnite NFC vo svojom telefóne</translation> <translation id="1717218214683051432">Senzory pohybu</translation> <translation id="1718835860248848330">Posledná hodina</translation> <translation id="1736419249208073774">Preskúmať</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Výsledok <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2096012225669085171">Synchronizovať a prispôsobiť v rôznych zariadeniach</translation> +<translation id="2099625543891475722">vašich fyzických vlastnostiach, napríklad výške;</translation> <translation id="2100273922101894616">Automaticky prihlasovať</translation> <translation id="2100314319871056947">Skúste text zdieľať po menších častiach</translation> <translation id="2107397443965016585">Pýtať sa, či chcete povoliť webu prehrávať chránený obsah (odporúčané)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Použiť heslo</translation> <translation id="4645575059429386691">Spravované vaším rodičom</translation> <translation id="4650364565596261010">Predvolené</translation> +<translation id="4660838440047236328">rozložení vašej miestnosti.</translation> <translation id="4663756553811254707">Počet odstránených záložiek: <ph name="NUMBER_OF_BOOKMARKS" /></translation> <translation id="4665282149850138822">Stránky <ph name="NAME" /> boli pridané na plochu</translation> <translation id="4684427112815847243">Synchronizovať všetko</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Vymazať dáta</translation> <translation id="5494752089476963479">Blokovať reklamy webov, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy</translation> <translation id="5500777121964041360">Nemusí byť k dispozícii vo vašej krajine</translation> +<translation id="5505264765875738116">Weby nemôžu žiadať o odosielanie upozornení</translation> <translation id="5512137114520586844">Tento účet je spravovaný používateľom <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Deaktivované správcom tohto zariadenia</translation> <translation id="5515439363601853141">Heslo sa zobrazí po odomknutí</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Výnimky</translation> <translation id="6194112207524046168">Ak chcete povoliť Chromu používať fotoaparát, zapnite ho aj v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blokovať súbory cookie tretích strán</translation> +<translation id="6201345951596836663">Odkaz bol skopírovaný</translation> <translation id="6206551242102657620">Spojenie je zabezpečené. Informácie o webe</translation> <translation id="6210748933810148297">Nie som <ph name="EMAIL" /></translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation> @@ -711,6 +717,7 @@ Niektoré weby môžu napríklad na túto žiadosť reagovať tak, že vám zobrazia reklamy, ktoré nie sú založené na ostatných weboch, ktoré ste navštívili. Mnoho webov bude stále zhromažďovať a používať vaše dáta prehliadania, napríklad na zlepšenie zabezpečenia, poskytovanie obsahu, reklám a odporúčaní a na generovanie štatistík prehľadov.</translation> <translation id="624789221780392884">Aktualizácia je pripravená</translation> <translation id="6255999984061454636">Návrhy obsahu</translation> +<translation id="6270391203985052864">Weby môžu žiadať o odosielanie upozornení</translation> <translation id="6277522088822131679">Pri tlačení stránky sa vyskytol problém. Skúste to znova.</translation> <translation id="6295158916970320988">Všetky stránky</translation> <translation id="629730747756840877">Účet</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Vyhľadávanie zariadení Bluetooth</translation> <translation id="6560414384669816528">Vyhľadávať pomocou Sogou</translation> <translation id="656065428026159829">Zobraziť viac</translation> +<translation id="6561560012278703671">Použiť tichšie správy (blokovanie vyrušovania upozorneniami)</translation> <translation id="6566259936974865419">Chrome ušetril <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Vždy povoliť</translation> <translation id="6573431926118603307">Tu sa zobrazia karty, ktoré ste otvorili v Chrome na iných zariadeniach.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Vaše zariadenie nemá aplikáciu na uloženie súboru s heslami.</translation> <translation id="7302081693174882195">Podrobnosti: zoradené podľa množstva ušetrených dát</translation> <translation id="7302486331832100261">Zvyčajne blokujete upozornenia. Ak ich chcete povoliť, klepnite na Podrobnosti.</translation> +<translation id="7311441321349344333">Technológia NFC je v tomto zariadení vypnutá. Zapnite ju v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">V zjednodušenom režime načítava Chrome stránky rýchlejšie a využíva až o 60 percent menej dát.</translation> <translation id="7333031090786104871">Pridávanie predchádzajúceho webu stále prebieha</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 4885cad2..c980cade 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Të aktivizohet sinkronizimi?</translation> <translation id="123724288017357924">Ringarko faqen aktuale, duke shpërfillur përmbajtjen në memorien specifike</translation> <translation id="124116460088058876">Gjuhë të tjera</translation> +<translation id="1242008676835033345">Integruar në <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Mbyll skedën aktuale</translation> <translation id="1258753120186372309">Logoja alternative e Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Kërko dhe eksploro</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Mos e shfaq përsëri</translation> <translation id="1692118695553449118">Sinkronizimi është aktiv</translation> <translation id="169515064810179024">Bllokojua faqeve hapjen e sensorëve të lëvizjes</translation> +<translation id="1711267867945983636">Për të vazhduar, aktivizo veçorinë NFC në telefon</translation> <translation id="1717218214683051432">Sensorët e lëvizjes</translation> <translation id="1718835860248848330">Ora e fundit</translation> <translation id="1736419249208073774">Eksploro</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Rezultati <ph name="RESULT_NUMBER" /> nga <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Tingulli</translation> <translation id="2096012225669085171">Sinkronizo e personalizo përmes pajisjeve</translation> +<translation id="2099625543891475722">karakteristikat e tua fizike, si gjatësia</translation> <translation id="2100273922101894616">Identifikohu automatikisht</translation> <translation id="2100314319871056947">Provo ta ndash tekstin në copëza më të vogla</translation> <translation id="2107397443965016585">Pyet përpara se sajtet të lejohen të luajnë përmbajtje të mbrojtura (rekomandohet)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Përdor fjalëkalimin</translation> <translation id="4645575059429386691">Menaxhohet nga prindi yt</translation> <translation id="4650364565596261010">Parazgjedhja e sistemit</translation> +<translation id="4660838440047236328">struktura e dhomës</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> faqeshënuesë u fshinë</translation> <translation id="4665282149850138822"><ph name="NAME" /> u shtua në ekranin bazë</translation> <translation id="4684427112815847243">Sinkronizo gjithçka</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Pastro të dhënat</translation> <translation id="5494752089476963479">Blloko reklamat në sajtet që shfaqin reklama ndërhyrëse ose mashtruese</translation> <translation id="5500777121964041360">Mund të mos ofrohet në vendndodhjen tënde</translation> +<translation id="5505264765875738116">Sajtet nuk mund të kërkojnë të dërgojnë njoftime</translation> <translation id="5512137114520586844">Kjo llogari menaxhohet nga <ph name="PARENT_NAME" />.</translation> <translation id="5514904542973294328">Çaktivizuar nga administratori i kësaj pajisjeje</translation> <translation id="5515439363601853141">Shkyçe për të parë fjalëkalimin</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Përjashtimet</translation> <translation id="6194112207524046168">Që të lejosh që Chrome të ketë qasje te kamera jote, aktivizoje kamerën edhe te <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Blloko kukit e palëve të treta</translation> +<translation id="6201345951596836663">Lidhja u kopjua</translation> <translation id="6206551242102657620">Lidhja është e sigurt. Informacioni i faqes</translation> <translation id="6210748933810148297">Nuk je <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opsionet për <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Për shembull, disa sajte uebi mund t'i përgjigjen kësaj kërkese duke të treguar reklama që nuk bazohen në sajtet e tjera të uebit që ke vizituar. Shumë sajte uebi do të mbledhin dhe do të përdorin përsëri të dhënat e tua të shfletimit - për shembull, për të përmirësuar sigurinë, për të ofruar përmbajtje, reklama dhe rekomandime, si dhe për të krijuar statistika raportimi.</translation> <translation id="624789221780392884">Përditësimi është gati</translation> <translation id="6255999984061454636">Sugjerimet e përmbajtjes</translation> +<translation id="6270391203985052864">Sajtet mund të kërkojnë të dërgojnë njoftime</translation> <translation id="6277522088822131679">Pati një problem me printimin e faqes. Provo përsëri.</translation> <translation id="6295158916970320988">Të gjitha sajtet</translation> <translation id="629730747756840877">Llogaria</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Skanimi për Bluetooth</translation> <translation id="6560414384669816528">Kërko me Sogou</translation> <translation id="656065428026159829">Shiko më shumë</translation> +<translation id="6561560012278703671">Përdor mesazhe më të qeta (bllokon kërkesat e njoftimeve që mos të të ndërpresin)</translation> <translation id="6566259936974865419">Chrome të ka kursyer <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Lejo gjithmonë</translation> <translation id="6573431926118603307">Skedat që ke hapur në Chrome në pajisjet e tjera do të shfaqen këtu.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Pajisja jote nuk ka një aplikacion për të ruajtur skedarin e fjalëkalimeve.</translation> <translation id="7302081693174882195">Detajet: Renditur sipas sasisë së të dhënave të ruajtura</translation> <translation id="7302486331832100261">Ti i bllokon zakonisht njoftimet. Për t'i lejuar, trokit te "Detajet".</translation> +<translation id="7311441321349344333">Veçoria NFC është joaktive në këtë pajisje. Aktivizoje NFC-në te <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Në "Modalitetin e lehtë", Chrome i ngarkon faqet më shpejt dhe përdor deri në 60 përqind më pak të dhëna.</translation> <translation id="7333031090786104871">Ende po shtohet sajti i mëparshëm</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 89ddae5..59c113c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Ungependa kuwasha usawazishaji?</translation> <translation id="123724288017357924">Pakia upya ukurasa wa sasa, puuza maudhui ya akiba</translation> <translation id="124116460088058876">Lugha zaidi</translation> +<translation id="1242008676835033345">Imepachikwa kwenye <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Funga kichupo kilichofunguka</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Tafuta na ugundue</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Usionyeshe tena</translation> <translation id="1692118695553449118">Usawazishajii umewashwa</translation> <translation id="169515064810179024">Zuia tovuti zisifikie vitambuzi vya mwendo</translation> +<translation id="1711267867945983636">Ili uendelee, washa NFC kwenye simu yako</translation> <translation id="1717218214683051432">Vitambuzi vya mwendo</translation> <translation id="1718835860248848330">Saa iliyopita</translation> <translation id="1736419249208073774">Gundua</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Tokeo <ph name="RESULT_NUMBER" /> kati ya <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Sauti</translation> <translation id="2096012225669085171">Sawazisha na uweke mapendeleo kwenye vifaa vyote</translation> +<translation id="2099625543891475722">sifa zako za kimwili, kama vile urefu</translation> <translation id="2100273922101894616">Ingia katika Akaunti Kiotomatiki</translation> <translation id="2100314319871056947">Jaribu kushiriki maandishi katika sehemu ndogo ndogo</translation> <translation id="2107397443965016585">Iulize kabla ya kuruhusu tovuti kucheza maudhui yanayolindwa (inapendekezwa)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Tumia nenosiri</translation> <translation id="4645575059429386691">Inadhibitiwa na wazazi wako</translation> <translation id="4650364565596261010">Mipangilio chaguomsingi ya mfumo</translation> +<translation id="4660838440047236328">muundo wa chumba chako</translation> <translation id="4663756553811254707">Alamisho <ph name="NUMBER_OF_BOOKMARKS" /> zimefutwa</translation> <translation id="4665282149850138822"><ph name="NAME" /> iliongezwa kwenye Skrini yako ya kwanza</translation> <translation id="4684427112815847243">Sawazisha kila kitu</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Futa data</translation> <translation id="5494752089476963479">Zuia matangazo kwenye tovuti zinazoonyesha matangazo yanayopotosha au yanayokatiza huduma</translation> <translation id="5500777121964041360">Huenda haipatikani mahali uliko</translation> +<translation id="5505264765875738116">Tovuti haziwezi kukuuliza kutuma arifa</translation> <translation id="5512137114520586844">Akaunti hii inadhibitiwa na <ph name="PARENT_NAME" /></translation> <translation id="5514904542973294328">Imezimwa na msimamizi wa kifaa hiki</translation> <translation id="5515439363601853141">Fungua ili uangalie nenosiri lako</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Vighairi</translation> <translation id="6194112207524046168">Ili uruhusu Chrome ifikie kamera yako, washa kamera pia katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Zuia vidakuzi vya tovuti nyingine</translation> +<translation id="6201345951596836663">Kiungo Kimenakiliwa</translation> <translation id="6206551242102657620">Muunganisho ni salama. Maelezo ya tovuti</translation> <translation id="6210748933810148297">Wewe si <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Chaguo za <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Kwa mfano, baadhi ya tovuti zinaweza kujibu ombi hili kwa kukuonyesha matangazo ambayo hayalingani na tovuti nyingine ulizotembelea. Tovuti nyingi bado zitakusanya na kutumia data yako ya kuvinjari — kwa mfano ili kuboresha usalama, kutoa maudhui, matangazo na mapendekezo, na kuzalisha takwimu za kuripoti.</translation> <translation id="624789221780392884">Sasisho iko tayari</translation> <translation id="6255999984061454636">Mapendekezo ya maudhui</translation> +<translation id="6270391203985052864">Tovuti zinaweza kukuuliza kutuma arifa</translation> <translation id="6277522088822131679">Kulikuwa na tatizo katika kuchapisha ukurasa. Tafadhali jaribu tena.</translation> <translation id="6295158916970320988">Tovuti zote</translation> <translation id="629730747756840877">Akaunti</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Kutafuta Bluetooth</translation> <translation id="6560414384669816528">Tafuta kwa kutumia Sogou</translation> <translation id="656065428026159829">Angalia zaidi</translation> +<translation id="6561560012278703671">Tumia kipengele cha kutuma na kupokea ujumbe bila sauti (huzuia vidokezo vya arifa visikusumbue)</translation> <translation id="6566259936974865419">Chrome imekuokolea GB <ph name="GIGABYTES" /></translation> <translation id="6573096386450695060">Ruhusu kila wakati</translation> <translation id="6573431926118603307">Vichupo ulivyofungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Kifaa chako hakina programu ya kuhifadhi faili ya manenosiri.</translation> <translation id="7302081693174882195">Maelezo: Imepangwa kulingana na kiasi cha data kilichookolewa</translation> <translation id="7302486331832100261">Huwa unazuia arifa. Ili uziruhusu, gusa Maelezo.</translation> +<translation id="7311441321349344333">Kipengele cha NFC kimezimwa kwenye kifaa hiki. Iwasha kwenye NFC katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Katika Hali nyepesi, Chrome hupakia kurasa haraka zaidi na huokoa data kwa hadi asilimia 60.</translation> <translation id="7333031090786104871">Bado inaongeza tovuti ya awali</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index de06f04a..96ced741 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">เปิดการซิงค์ไหม</translation> <translation id="123724288017357924">โหลดหน้าปัจจุบันซ้ำ โดยไม่คำนึงถึงเนื้อหาที่แคชไว้</translation> <translation id="124116460088058876">ภาษาเพิ่มเติม</translation> +<translation id="1242008676835033345">ฝังอยู่ใน <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">ปิดแท็บปัจจุบัน</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">ค้นหาและสำรวจ</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">ไม่ต้องแสดงอีก</translation> <translation id="1692118695553449118">การซิงค์เปิดอยู่</translation> <translation id="169515064810179024">บล็อกไม่ให้เว็บไซต์เข้าถึงเซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation> +<translation id="1711267867945983636">หากต้องการดำเนินการต่อ ให้เปิด NFC ในโทรศัพท์</translation> <translation id="1717218214683051432">เซ็นเซอร์ตรวจจับความเคลื่อนไหว</translation> <translation id="1718835860248848330">ชั่วโมงที่แล้ว</translation> <translation id="1736419249208073774">สำรวจ</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation> <translation id="2091887806945687916">เสียง</translation> <translation id="2096012225669085171">ซิงค์และปรับแต่งในอุปกรณ์ทุกเครื่อง</translation> +<translation id="2099625543891475722">ลักษณะทางกายภาพของคุณ เช่น ส่วนสูง</translation> <translation id="2100273922101894616">ลงชื่อเข้าใช้อัตโนมัติ</translation> <translation id="2100314319871056947">ลองแชร์ข้อความโดยแบ่งเป็นส่วนเล็กๆ หลายส่วน</translation> <translation id="2107397443965016585">ถามก่อนอนุญาตให้เว็บไซต์เล่นเนื้อหาที่ได้รับความคุ้มครอง (แนะนำ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">ใช้รหัสผ่าน</translation> <translation id="4645575059429386691">มีการจัดการโดยผู้ปกครอง</translation> <translation id="4650364565596261010">ค่าเริ่มต้นของระบบ</translation> +<translation id="4660838440047236328">เลย์เอาต์ของห้อง</translation> <translation id="4663756553811254707">ลบบุ๊กมาร์ก <ph name="NUMBER_OF_BOOKMARKS" /> รายการแล้ว</translation> <translation id="4665282149850138822">เพิ่ม <ph name="NAME" /> ลงในหน้าแรกแล้ว</translation> <translation id="4684427112815847243">ซิงค์ทุกอย่าง</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ล้างข้อมูล</translation> <translation id="5494752089476963479">บล็อกโฆษณาในเว็บไซต์ที่แสดงโฆษณาที่แทรกหรือทำให้เข้าใจผิด</translation> <translation id="5500777121964041360">อาจไม่พร้อมใช้งานในประเทศของคุณ</translation> +<translation id="5505264765875738116">เว็บไซต์ขออนุญาตเพื่อส่งการแจ้งเตือนไม่ได้</translation> <translation id="5512137114520586844">บัญชีนี้ได้รับการจัดการโดย <ph name="PARENT_NAME" /></translation> <translation id="5514904542973294328">ปิดใช้โดยผู้ดูแลระบบของอุปกรณ์นี้</translation> <translation id="5515439363601853141">ปลดล็อกเพื่อดูรหัสผ่าน</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">ข้อยกเว้น</translation> <translation id="6194112207524046168">หากต้องการให้ Chrome เข้าถึงกล้องถ่ายรูป ให้เปิดกล้องถ่ายรูปใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /> ด้วย</translation> <translation id="6196640612572343990">บล็อกคุกกี้ของบุคคลที่สาม</translation> +<translation id="6201345951596836663">คัดลอกลิงก์แล้ว</translation> <translation id="6206551242102657620">การเชื่อมต่อปลอดภัย ข้อมูลเว็บไซต์</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> ไม่ใช่บัญชีที่ฉันจะใช้</translation> <translation id="6216432067784365534">ตัวเลือกสำหรับ<ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ ตัวอย่างเช่น บางเว็บไซต์อาจตอบสนองต่อคำขอนี้โดยแสดงให้คุณเห็นโฆษณาที่ไม่ได้อิงอยู่กับเว็บไซต์อื่นๆ ที่คุณเข้าชม เว็บไซต์จำนวนมากจะยังคงรวบรวมและใช้ข้อมูลการท่องเว็บของคุณเพื่อปรับปรุงความปลอดภัย เพื่อแสดงเนื้อหา โฆษณา และคำแนะนำ และเพื่อสร้างสถิติในการรายงาน เป็นต้น</translation> <translation id="624789221780392884">พร้อมอัปเดต</translation> <translation id="6255999984061454636">การแนะนำเนื้อหา</translation> +<translation id="6270391203985052864">เว็บไซต์ขออนุญาตเพื่อส่งการแจ้งเตือนได้</translation> <translation id="6277522088822131679">เกิดปัญหาในการพิมพ์หน้านี้ โปรดลองอีกครั้ง</translation> <translation id="6295158916970320988">เว็บไซต์ทั้งหมด</translation> <translation id="629730747756840877">บัญชี</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">การสแกนหาบลูทูธ</translation> <translation id="6560414384669816528">ค้นหาด้วย Sogou</translation> <translation id="656065428026159829">ดูเพิ่มเติม</translation> +<translation id="6561560012278703671">ใช้การส่งข้อความแบบไม่ส่งเสียง (บล็อกข้อความแจ้งเตือนไม่ให้รบกวนคุณ)</translation> <translation id="6566259936974865419">Chrome ได้ประหยัดพื้นที่ให้คุณไป <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">อนุญาตเสมอ</translation> <translation id="6573431926118603307">แท็บที่คุณเปิดไว้ใน Chrome ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">อุปกรณ์ของคุณไม่มีแอปไว้จัดเก็บไฟล์รหัสผ่าน</translation> <translation id="7302081693174882195">รายละเอียด: จัดเรียงตามปริมาณเน็ตมือถือที่ประหยัดได้</translation> <translation id="7302486331832100261">คุณมักจะบล็อกการแจ้งเตือน หากต้องการอนุญาต ให้แตะ "รายละเอียด"</translation> +<translation id="7311441321349344333">NFC ในอุปกรณ์นี้ปิดอยู่ เปิด NFC ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation> <translation id="7328017930301109123">ในโหมด Lite เบราว์เซอร์ Chrome จะโหลดหน้าเว็บได้เร็วขึ้นและใช้เน็ตน้อยลงสูงสุดถึง 60 เปอร์เซ็นต์</translation> <translation id="7333031090786104871">ยังเพิ่มไซต์ก่อนหน้าอยู่</translation> <translation id="7352939065658542140">วิดีโอ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 749b630..b68bb21f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Senkronizasyon açılsın mı?</translation> <translation id="123724288017357924">Önbelleğe alınmış içeriği yoksayarak geçerli sayfayı yeniden yükler</translation> <translation id="124116460088058876">Diğer diller</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> adresinde yerleşik</translation> <translation id="124678866338384709">Geçerli sekmeyi kapatır</translation> <translation id="1258753120186372309">Google doodle'ı: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Arama yapın ve keşfedin</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Bir daha gösterme</translation> <translation id="1692118695553449118">Senkronizasyon açık.</translation> <translation id="169515064810179024">Sitelerin hareket sensörlerine erişimini engelle</translation> +<translation id="1711267867945983636">Devam etmek için telefonunuzda NFC'yi açın</translation> <translation id="1717218214683051432">Hareket sensörleri</translation> <translation id="1718835860248848330">Son saat</translation> <translation id="1736419249208073774">Keşfet</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation> <translation id="2091887806945687916">Ses</translation> <translation id="2096012225669085171">Cihazlar arasında senkronizasyon ve kişiselleştirme</translation> +<translation id="2099625543891475722">boyunuz gibi fiziksel özellikleriniz</translation> <translation id="2100273922101894616">Otomatik Oturum Aç</translation> <translation id="2100314319871056947">Metni daha küçük parçalar halinde paylaşmayı deneyin</translation> <translation id="2107397443965016585">Sitelerin korumalı içeriği oynatmasına izin vermeden önce sor (önerilir)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Şifre kullan</translation> <translation id="4645575059429386691">Ebeveyniniz tarafından yönetiliyor</translation> <translation id="4650364565596261010">Sistem varsayılanı</translation> +<translation id="4660838440047236328">odanızın düzeni</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> yer işareti silindi</translation> <translation id="4665282149850138822"><ph name="NAME" />, Ana ekranınıza eklendi</translation> <translation id="4684427112815847243">Her şeyi senkronize et</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Verileri temizle</translation> <translation id="5494752089476963479">Araya giren veya yanıltıcı reklamlar gösteren sitelerde reklamları engelle</translation> <translation id="5500777121964041360">Bulunduğunuz ülkede kullanılamayabilir</translation> +<translation id="5505264765875738116">Siteler bildirim göndermek isteyemez</translation> <translation id="5512137114520586844">Bu hesap <ph name="PARENT_NAME" /> tarafından yönetiliyor.</translation> <translation id="5514904542973294328">Bu cihazın yöneticisi tarafından devre dışı bırakıldı</translation> <translation id="5515439363601853141">Şifrenizi görüntülemek için kilidi açın</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">İstisnalar</translation> <translation id="6194112207524046168">Chrome'un kameranıza erişebilmesi için <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'ında da kamerayı açın.</translation> <translation id="6196640612572343990">Üçüncü taraf çerezlerini engelle</translation> +<translation id="6201345951596836663">Bağlantı Kopyalandı</translation> <translation id="6206551242102657620">Bağlantı güvenli. Site bilgileri</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> değil misiniz?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçenekleri</translation> @@ -711,6 +717,7 @@ Örneğin bazı web siteleri bu isteği size daha önce gezdiğiniz web sitelerine dayalı olmayan reklamları göstererek yanıtlayabilir. Birçok web sitesi (örneğin güvenliği iyileştirmek; içerik, reklam, öneri sağlamak ve raporlama istatistikleri oluşturmak gibi amaçlarla) göz atma verilerinizi toplayıp kullanmayı sürdürecektir.</translation> <translation id="624789221780392884">Güncelleme hazır</translation> <translation id="6255999984061454636">İçerik önerileri</translation> +<translation id="6270391203985052864">Siteler bildirim göndermek isteyebilir</translation> <translation id="6277522088822131679">Sayfa yazdırılırken bir sorun oluştu. Lütfen tekrar deneyin.</translation> <translation id="6295158916970320988">Tüm siteler</translation> <translation id="629730747756840877">Hesap</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Bluetooth taraması</translation> <translation id="6560414384669816528">Sogou ile arama</translation> <translation id="656065428026159829">Daha fazla göster</translation> +<translation id="6561560012278703671">Bilgiyi daha az rahatsız edici bir şekilde alın (bildirim istemlerinin sizi rahatsız etmesini engelleyin)</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> GB tasarruf sağladı</translation> <translation id="6573096386450695060">Her zaman izin ver</translation> <translation id="6573431926118603307">Diğer cihazlarınızda Chrome ile açtığınız sekmeler burada görünür.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Cihazınızda şifreler dosyasını depolayacak bir uygulama yok.</translation> <translation id="7302081693174882195">Ayrıntılar: Tasarruf edilen veri miktarına göre sıralı</translation> <translation id="7302486331832100261">Genelde bildirimleri engelliyorsunuz. İzin vermek için Ayrıntılar'a dokunun.</translation> +<translation id="7311441321349344333">NFC bu cihazda kapalı. NFC'yi <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda açın.</translation> <translation id="7328017930301109123">Chrome, Basit modda sayfaları daha hızlı yükler ve yüzde 60'a kadar daha az veri kullanır.</translation> <translation id="7333031090786104871">Önceki siteyi ekleme işlemi devam ediyor.</translation> <translation id="7352939065658542140">VİDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 98a2529..56020e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">مطابقت پذیری آن کریں؟</translation> <translation id="123724288017357924">کیش کردہ مواد نظر انداز کرکے موجودہ صفحہ پھر لوڈ کریں</translation> <translation id="124116460088058876">مزید زبانیں</translation> +<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> پر سرایت کردہ</translation> <translation id="124678866338384709">موجودہ ٹیب بند کریں</translation> <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">تلاش اور دریافت کریں</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">دوبارہ نہ دکھائیں</translation> <translation id="1692118695553449118">مطابقت پذیری آن ہے</translation> <translation id="169515064810179024">سائٹس کو موشن سینسرز تک رسائی حاصل کرنے سے مسدود کریں</translation> +<translation id="1711267867945983636">جاری رکھنے کے لیے، اپنے فون پر NFC آن کریں</translation> <translation id="1717218214683051432">موشن سینسرز</translation> <translation id="1718835860248848330">پچھلے گھنٹے</translation> <translation id="1736419249208073774">دریافت کریں</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">نتیجہ <ph name="RESULT_NUMBER" /> از <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">آواز</translation> <translation id="2096012225669085171">سبھی آلات پر مطابقت پذیری اور ذاتی نوعیت سازی کریں</translation> +<translation id="2099625543891475722">آپ کی جسمانی خصوصیات، جیسے کہ قد</translation> <translation id="2100273922101894616">خودکار سائن ان</translation> <translation id="2100314319871056947">چھوٹے ٹکڑوں میں متن کا اشتراک کرنے کی کوشش کریں</translation> <translation id="2107397443965016585">سائٹس کو محفوظ مواد چلانے کی اجازت دینے سے پہلے پوچھیں (تجویز کردہ)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">پاس ورڈ استعمال کریں</translation> <translation id="4645575059429386691">آپ کے والدین کے زیر انتظام</translation> <translation id="4650364565596261010">سسٹم ڈیفالٹ</translation> +<translation id="4660838440047236328">آپ کے کمرے کا لے آؤٹ</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> بُک مارکس حذف کر دیے گئے</translation> <translation id="4665282149850138822"><ph name="NAME" /> کو آپ کی ہوم اسکرین میں شامل کر دیا گیا تھا</translation> <translation id="4684427112815847243">ہر چیز کی مطابقت پذیری کریں</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">ڈیٹا صاف کریں</translation> <translation id="5494752089476963479">دخل انداز یا گمراہ کن اشتہارات دکھانے والی سائٹس پر اشتہارات کو مسدود کریں</translation> <translation id="5500777121964041360">ممکن ہے کہ آپ کے مقام پر دستیاب نہ ہو</translation> +<translation id="5505264765875738116">سائٹس اطلاعات بھیجنے کے لیے نہیں کہہ سکتی ہیں</translation> <translation id="5512137114520586844">یہ اکاؤنٹ <ph name="PARENT_NAME" /> کے زیر انتظام ہے۔</translation> <translation id="5514904542973294328">اس آلہ کے منتظم نے غیر فعال کر دیا</translation> <translation id="5515439363601853141">اپنا پاس ورڈ دیکھنے کیلئے غیر مقفل کریں</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">استثناء</translation> <translation id="6194112207524046168">Chrome کو اپنے کیمرے تک رسائی دینے کیلئے، <ph name="BEGIN_LINK" />Android کی ترتیبات<ph name="END_LINK" /> میں بھی کیمرا آن کریں۔</translation> <translation id="6196640612572343990">فریق ثالث کوکیز کو مسدود کریں</translation> +<translation id="6201345951596836663">لنک کاپی ہو گیا</translation> <translation id="6206551242102657620">کنیکشن محفوظ ہے۔ سائٹ کی معلومات</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> نہیں؟</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> اختیارات</translation> @@ -711,6 +717,7 @@ مثلاً، کچھ ویب سائٹس آپ کو ایسے اشتہارات دکھا کر اس درخواست کا جواب دے سکتی ہیں جو آپ کی ملاحظہ کردہ دوسری ویب سائٹس پر مبنی نہیں ہیں۔ بہت ساری ویب سائٹس اب بھی آپ کا براؤزنگ ڈیٹا اکٹھا اور استعمال کریں گی — مثلاً، سیکیورٹی کو بہتر بنانے، مواد، اشتہارات اور تجاویز فراہم کرنے اوراطلاع دہندگی کے اعداد و شمار تیار کرنے کیلئے۔</translation> <translation id="624789221780392884">اپ ڈیٹ تیار ہے</translation> <translation id="6255999984061454636">مواد کی تجاویز</translation> +<translation id="6270391203985052864">سائٹس اطلاعات بھیجنے کے لیے کہہ سکتی ہیں</translation> <translation id="6277522088822131679">صفحہ کو پرنٹ کرنے میں ایک مسئلہ تھا۔ براہ کرم دوبارہ کوشش کریں۔</translation> <translation id="6295158916970320988">سبھی سائٹس</translation> <translation id="629730747756840877">اکاؤنٹ</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">بلوٹوتھ اسکیننگ</translation> <translation id="6560414384669816528">Sogou کے ساتھ تلاش کریں</translation> <translation id="656065428026159829">مزید دیکھیں</translation> +<translation id="6561560012278703671">پر سکون پیغام رسانی کا استعمال کریں (اطلاع کی پرامپٹس کو آپ کو خلل ڈالنے سے مسدود کرتا ہے)</translation> <translation id="6566259936974865419">Chrome نے آپ کا <ph name="GIGABYTES" /> GB بچایا ہے</translation> <translation id="6573096386450695060">ہمیشہ اجازت دیں</translation> <translation id="6573431926118603307">اپنے دیگر آلات پر Chrome میں آپ نے جو ٹیبز کھولے ہیں وہ یہاں ظاہر ہوں گے۔</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">آپ کے آلہ میں پاسورڈز کی فائل کو اسٹور کرنے والی ایپ نہیں ہے۔</translation> <translation id="7302081693174882195">تفصیلات: محفوظ کردہ ڈیٹا کی مقدار کے لحاظ سے ترتیب دیا گیا</translation> <translation id="7302486331832100261">آپ عام طور پر اطلاعات کو مسدود کرتے ہیں۔ اجازت دینے کے لیے، تفصیلات پر تھپتھپائیں۔</translation> +<translation id="7311441321349344333">اس آلہ کے لیے NFC آف ہے۔ NFC پر <ph name="BEGIN_LINK" />Android کی ترتیبات<ph name="END_LINK" /> میں اسے آن کریں۔</translation> <translation id="7328017930301109123">لائٹ موڈ میں، Chrome صفحات کو زیادہ تیزی سے لوڈ کرتا ہے اور60 فیصد تک کم ڈیٹا استعمال کرتا ہے۔</translation> <translation id="7333031090786104871">ابھی بھی سابقہ سائٹ شامل کی جا رہی ہے</translation> <translation id="7352939065658542140">ویڈیو</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index c5e9d6fa..778d2a0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">Bạn muốn bật tính năng đồng bộ hóa?</translation> <translation id="123724288017357924">Tải lại trang hiện tại, bỏ qua nội dung được lưu trong bộ nhớ đệm</translation> <translation id="124116460088058876">Ngôn ngữ khác</translation> +<translation id="1242008676835033345">Được nhúng trên <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">Đóng tab hiện tại</translation> <translation id="1258753120186372309">Hình tượng trưng của Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">Tìm kiếm và khám phá</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">Không hiển thị lại</translation> <translation id="1692118695553449118">Đồng bộ hóa đang bật</translation> <translation id="169515064810179024">Chặn không cho các trang web sử dụng cảm biến chuyển động</translation> +<translation id="1711267867945983636">Để tiếp tục, hãy bật NFC trên điện thoại</translation> <translation id="1717218214683051432">Cảm biến chuyển động</translation> <translation id="1718835860248848330">Giờ vừa qua</translation> <translation id="1736419249208073774">Khám phá</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation> <translation id="2091887806945687916">Âm thanh</translation> <translation id="2096012225669085171">Đồng bộ hóa và cá nhân hóa trên các thiết bị</translation> +<translation id="2099625543891475722">đặc điểm hình thể của bạn, chẳng hạn như chiều cao</translation> <translation id="2100273922101894616">Tự động đăng nhập</translation> <translation id="2100314319871056947">Hãy thử chia sẻ văn bản theo các đoạn nhỏ hơn</translation> <translation id="2107397443965016585">Hỏi trước khi cho phép trang web phát nội dung được bảo vệ (khuyên dùng)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">Sử dụng mật khẩu</translation> <translation id="4645575059429386691">Do cha mẹ của bạn quản lý</translation> <translation id="4650364565596261010">Tùy chọn mặc định của hệ thống</translation> +<translation id="4660838440047236328">cách bài trí phòng của bạn</translation> <translation id="4663756553811254707">Đã xóa <ph name="NUMBER_OF_BOOKMARKS" /> dấu trang</translation> <translation id="4665282149850138822">Đã thêm <ph name="NAME" /> vào Màn hình chính của bạn</translation> <translation id="4684427112815847243">Đồng bộ hóa mọi thứ</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">Xóa dữ liệu</translation> <translation id="5494752089476963479">Chặn quảng cáo trên các trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm</translation> <translation id="5500777121964041360">Có thể chưa dùng được tại vị trí của bạn</translation> +<translation id="5505264765875738116">Các trang web không thể xin phép gửi thông báo</translation> <translation id="5512137114520586844">Tài khoản này do <ph name="PARENT_NAME" /> quản lý.</translation> <translation id="5514904542973294328">Bị quản trị viên của thiết bị này vô hiệu hóa</translation> <translation id="5515439363601853141">Mở khóa để xem mật khẩu của bạn</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">Ngoại lệ</translation> <translation id="6194112207524046168">Để cho phép Chrome truy cập vào máy ảnh của bạn, hãy bật cả máy ảnh trong phần <ph name="BEGIN_LINK" />Cài đặt của Android<ph name="END_LINK" />.</translation> <translation id="6196640612572343990">Chặn cookie của bên thứ ba</translation> +<translation id="6201345951596836663">Đã sao chép đường liên kết</translation> <translation id="6206551242102657620">Kết nối an toàn. Thông tin trang web</translation> <translation id="6210748933810148297">Không phải là <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Tùy chọn <ph name="NAME_OF_LIST_ITEM" /></translation> @@ -711,6 +717,7 @@ Ví dụ: một số trang web có thể phản hồi yêu cầu này bằng cách hiển thị cho bạn các quảng cáo không dựa trên các trang web khác mà bạn đã truy cập. Nhiều trang web sẽ vẫn thu thập và sử dụng dữ liệu duyệt web của bạn — ví dụ: để tăng cường bảo mật, cung cấp nội dung, quảng cáo và đề xuất, đồng thời tạo số liệu thống kê báo cáo.</translation> <translation id="624789221780392884">Bản cập nhật đã sẵn sàng</translation> <translation id="6255999984061454636">Đề xuất nội dung</translation> +<translation id="6270391203985052864">Các trang web có thể xin phép gửi thông báo</translation> <translation id="6277522088822131679">Đã xảy ra sự cố khi in trang này. Vui lòng thử lại.</translation> <translation id="6295158916970320988">Tất cả các trang web</translation> <translation id="629730747756840877">Tài khoản</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">Quét tìm Bluetooth</translation> <translation id="6560414384669816528">Tìm kiếm với Sogou</translation> <translation id="656065428026159829">Xem thêm</translation> +<translation id="6561560012278703671">Dùng thông báo nhẹ nhàng hơn (chặn thông báo bật lên làm phiền bạn)</translation> <translation id="6566259936974865419">Chrome đã tiết kiệm <ph name="GIGABYTES" /> GB cho bạn</translation> <translation id="6573096386450695060">Luôn cho phép</translation> <translation id="6573431926118603307">Các tab bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">Thiết bị của bạn không có ứng dụng để lưu trữ tệp mật khẩu.</translation> <translation id="7302081693174882195">Thông tin chi tiết: Sắp xếp theo lượng dữ liệu đã tiết kiệm được</translation> <translation id="7302486331832100261">Bạn thường chặn các thông báo. Để cho phép, hãy nhấn vào Chi tiết.</translation> +<translation id="7311441321349344333">NFC đã tắt đối với thiết bị này. Hãy bật NFC trong mục <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation> <translation id="7328017930301109123">Ở Chế độ thu gọn, Chrome tải trang nhanh hơn và sử dụng ít dữ liệu hơn lên tới 60 phần trăm.</translation> <translation id="7333031090786104871">Vẫn đang thêm trang web trước</translation> <translation id="7352939065658542140">VIDEO</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 0c41c26d..982b7ed 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">开启同步功能?</translation> <translation id="123724288017357924">重新加载当前网页(忽略缓存的内容)</translation> <translation id="124116460088058876">更多语言</translation> +<translation id="1242008676835033345">嵌在 <ph name="WEBSITE_URL" /> 上</translation> <translation id="124678866338384709">关闭当前标签页</translation> <translation id="1258753120186372309">Google 涂鸦:<ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">搜索内容与浏览相关建议</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">不再显示</translation> <translation id="1692118695553449118">同步功能已开启</translation> <translation id="169515064810179024">禁止网站使用动态传感器</translation> +<translation id="1711267867945983636">要继续,请开启手机的 NFC 功能</translation> <translation id="1717218214683051432">动态传感器</translation> <translation id="1718835860248848330">过去一小时</translation> <translation id="1736419249208073774">探索</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 条结果,共 <ph name="TOTAL_RESULTS" /> 条</translation> <translation id="2091887806945687916">声音</translation> <translation id="2096012225669085171">在所有设备上保持同步并进行个性化设置</translation> +<translation id="2099625543891475722">您的身体特征,例如身高</translation> <translation id="2100273922101894616">自动登录</translation> <translation id="2100314319871056947">请尝试使用较小的文本块进行分享</translation> <translation id="2107397443965016585">网站需先询问并得到许可才能播放受保护内容 (推荐)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">使用密码</translation> <translation id="4645575059429386691">由您父母管理</translation> <translation id="4650364565596261010">系统默认设置</translation> +<translation id="4660838440047236328">您房间的布局</translation> <translation id="4663756553811254707">已删除 <ph name="NUMBER_OF_BOOKMARKS" /> 个书签</translation> <translation id="4665282149850138822"><ph name="NAME" />已添加到您的主屏幕</translation> <translation id="4684427112815847243">同步所有数据类型</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">清除数据</translation> <translation id="5494752089476963479">禁止会展示侵扰性或误导性广告的网站显示广告</translation> <translation id="5500777121964041360">可能无法在您所在的国家/地区使用</translation> +<translation id="5505264765875738116">网站无法询问能否向您发送通知</translation> <translation id="5512137114520586844">该帐号由 <ph name="PARENT_NAME" /> 管理。</translation> <translation id="5514904542973294328">已被此设备的管理员停用</translation> <translation id="5515439363601853141">需解锁才能查看您的密码</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">例外</translation> <translation id="6194112207524046168">要让 Chrome 使用您的摄像头,您还需要在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启摄像头。</translation> <translation id="6196640612572343990">阻止第三方 Cookie</translation> +<translation id="6201345951596836663">已复制链接</translation> <translation id="6206551242102657620">连接是安全的。网站信息</translation> <translation id="6210748933810148297">不是 <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />选项</translation> @@ -711,6 +717,7 @@ 例如:某些网站在收到该请求后,可能会向您展示相应的广告(这些广告并不是根据您访问过的其他网站而展示的)。许多网站仍会出于一些目的收集并使用您的浏览数据,例如,为了提高安全性,为了提供相关内容、广告和推荐内容,以及为了生成报告统计信息。</translation> <translation id="624789221780392884">有可用的更新</translation> <translation id="6255999984061454636">内容建议</translation> +<translation id="6270391203985052864">网站可以询问能否向您发送通知</translation> <translation id="6277522088822131679">打印该页面时出现问题,请重试。</translation> <translation id="6295158916970320988">所有网站</translation> <translation id="629730747756840877">帐号</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">蓝牙扫描</translation> <translation id="6560414384669816528">改用搜狗搜索</translation> <translation id="656065428026159829">查看更多</translation> +<translation id="6561560012278703671">改用更静默的提示方式(不直接弹出提示来询问能否向您发送通知,以免造成打扰)</translation> <translation id="6566259936974865419">Chrome 已为您保存的数据量:<ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">一律允许</translation> <translation id="6573431926118603307">您在其他设备上的 Chrome 中打开的标签页将列在此处。</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">您的设备上没有可以存储密码文件的应用。</translation> <translation id="7302081693174882195">详细信息:按已节省的数据流量排序</translation> <translation id="7302486331832100261">您通常会屏蔽通知。要允许显示通知,请点按“详细信息”。</translation> +<translation id="7311441321349344333">此设备的 NFC 功能处于关闭状态。请在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启 NFC 功能。</translation> <translation id="7328017930301109123">在精简模式下,Chrome 可更快速地加载网页,并可节省多达百分之 60 的流量。</translation> <translation id="7333031090786104871">仍在添加先前的网站</translation> <translation id="7352939065658542140">视频</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 0d8c3f0..151ffd8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">要開啟同步處理功能嗎?</translation> <translation id="123724288017357924">重新載入目前的網頁,忽略之前快取的內容</translation> <translation id="124116460088058876">更多語言</translation> +<translation id="1242008676835033345">嵌入至 <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">關閉目前分頁</translation> <translation id="1258753120186372309">Google Doodle:<ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">搜尋與探索</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">不要再顯示</translation> <translation id="1692118695553449118">同步處理已開啟</translation> <translation id="169515064810179024">禁止網站存取動作感應器</translation> +<translation id="1711267867945983636">如要繼續,請開啟手機的 NFC 功能</translation> <translation id="1717218214683051432">動作感應器</translation> <translation id="1718835860248848330">過去一小時</translation> <translation id="1736419249208073774">探索</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 項結果 (共 <ph name="TOTAL_RESULTS" /> 項)</translation> <translation id="2091887806945687916">音效</translation> <translation id="2096012225669085171">在不同裝置上同步與個人化</translation> +<translation id="2099625543891475722">你的身體特徵,例如身高</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2100314319871056947">請嘗試將要分享的文字分為數個簡短片段</translation> <translation id="2107397443965016585">網站播放受保護內容前先詢問您 (建議)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">使用密碼</translation> <translation id="4645575059429386691">由您的家長管理</translation> <translation id="4650364565596261010">系統預設</translation> +<translation id="4660838440047236328">你的房間配置</translation> <translation id="4663756553811254707">已刪除 <ph name="NUMBER_OF_BOOKMARKS" /> 個書籤</translation> <translation id="4665282149850138822">已將 <ph name="NAME" /> 新增到主畫面</translation> <translation id="4684427112815847243">同步處理所有資料</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">清除資料</translation> <translation id="5494752089476963479">在顯示滋擾或誤導廣告的網站上封鎖廣告</translation> <translation id="5500777121964041360">此功能可能無法在您所在的地區使用</translation> +<translation id="5505264765875738116">不允許網站要求傳送通知給你</translation> <translation id="5512137114520586844">這個帳戶是由 <ph name="PARENT_NAME" /> 管理。</translation> <translation id="5514904542973294328">此裝置的管理員已停用</translation> <translation id="5515439363601853141">解鎖即可查看您的密碼</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">例外</translation> <translation id="6194112207524046168">如要讓 Chrome 存取您的相機,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟相機。</translation> <translation id="6196640612572343990">封鎖第三方 Cookie</translation> +<translation id="6201345951596836663">已複製連結</translation> <translation id="6206551242102657620">連線安全。網站資料</translation> <translation id="6210748933810148297">不是 <ph name="EMAIL" /> 嗎?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />選項</translation> @@ -711,6 +717,7 @@ 舉例來說,部分網站可能會在顯示廣告時,選擇不根據您所瀏覽的網站記錄來顯示廣告。許多網站仍會收集您的瀏覽資料,並將這些資料用於下列目的:提高網站安全性、在網站上提供相關的內容、廣告和推薦項目,以及產生報告統計資料。</translation> <translation id="624789221780392884">可執行更新</translation> <translation id="6255999984061454636">內容建議</translation> +<translation id="6270391203985052864">網站可以要求傳送通知給你</translation> <translation id="6277522088822131679">列印網頁時發生問題,請再試一次。</translation> <translation id="6295158916970320988">所有網站</translation> <translation id="629730747756840877">帳戶</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">藍牙掃瞄</translation> <translation id="6560414384669816528">使用「搜狗」搜尋內容</translation> <translation id="656065428026159829">查看更多</translation> +<translation id="6561560012278703671">使用低擾模式 (禁止網站顯示通知,以免干擾)</translation> <translation id="6566259936974865419">Chrome 已為您節省 <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">一律允許</translation> <translation id="6573431926118603307">您在其他裝置上開啟的 Chrome 分頁會在這裡顯示。</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">裝置沒有可儲存密碼檔案的應用程式。</translation> <translation id="7302081693174882195">詳情:依節省數據量排序</translation> <translation id="7302486331832100261">您通常會封鎖通知。如要允許,請輕按 [詳情]。</translation> +<translation id="7311441321349344333">這部裝置的 NFC 功能已關閉。請前往 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />開啟這項功能。</translation> <translation id="7328017930301109123">「精簡模式」可加快 Chrome 載入網頁的速度,並節省高達百分之 60 的數據用量。</translation> <translation id="7333031090786104871">仍在新增先前的網站</translation> <translation id="7352939065658542140">影片</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 957d879..8f216ff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -37,6 +37,7 @@ <translation id="1231733316453485619">要開啟同步處理功能嗎?</translation> <translation id="123724288017357924">重新載入目前的網頁,略過已快取的內容</translation> <translation id="124116460088058876">更多語言</translation> +<translation id="1242008676835033345">嵌入至 <ph name="WEBSITE_URL" /></translation> <translation id="124678866338384709">關閉目前的分頁</translation> <translation id="1258753120186372309">Google Doodle:<ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1260236875608242557">搜尋及探索</translation> @@ -95,6 +96,7 @@ <translation id="1672586136351118594">不要再顯示</translation> <translation id="1692118695553449118">同步功能已啟用</translation> <translation id="169515064810179024">禁止網站存取動作感應器</translation> +<translation id="1711267867945983636">如要繼續,請開啟手機的 NFC 功能</translation> <translation id="1717218214683051432">動作感應器</translation> <translation id="1718835860248848330">過去 1 小時</translation> <translation id="1736419249208073774">探索</translation> @@ -151,6 +153,7 @@ <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation> <translation id="2091887806945687916">音訊</translation> <translation id="2096012225669085171">讓多部裝置保持同步,並提供人化體驗</translation> +<translation id="2099625543891475722">你的身體特徵,例如身高</translation> <translation id="2100273922101894616">自動登入</translation> <translation id="2100314319871056947">請嘗試將要分享的文字分成多個片段</translation> <translation id="2107397443965016585">允許網站播放受保護的內容前,必須先詢問你 (建議)</translation> @@ -481,6 +484,7 @@ <translation id="4634124774493850572">使用密碼</translation> <translation id="4645575059429386691">你的家長已停用這項功能</translation> <translation id="4650364565596261010">系統預設</translation> +<translation id="4660838440047236328">你的房間配置</translation> <translation id="4663756553811254707">已刪除 <ph name="NUMBER_OF_BOOKMARKS" /> 個書籤</translation> <translation id="4665282149850138822">「<ph name="NAME" />」已加入您的主畫面</translation> <translation id="4684427112815847243">同步處理所有資料</translation> @@ -605,6 +609,7 @@ <translation id="5487521232677179737">清除資料</translation> <translation id="5494752089476963479">封鎖干擾性或誤導性的網站廣告</translation> <translation id="5500777121964041360">你所在的地區可能不支援這項功能</translation> +<translation id="5505264765875738116">不允許網站要求傳送通知給你</translation> <translation id="5512137114520586844">這個帳戶受 <ph name="PARENT_NAME" /> 管理。</translation> <translation id="5514904542973294328">裝置管理員已停用</translation> <translation id="5515439363601853141">解鎖即可查看你的密碼</translation> @@ -702,6 +707,7 @@ <translation id="6192792657125177640">例外</translation> <translation id="6194112207524046168">如要讓 Chrome 存取你的相機,請一併在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中開啟相機。</translation> <translation id="6196640612572343990">封鎖第三方 Cookie</translation> +<translation id="6201345951596836663">已複製連結</translation> <translation id="6206551242102657620">已建立安全連線。網站資訊</translation> <translation id="6210748933810148297">不是 <ph name="EMAIL" /> 嗎?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />選項</translation> @@ -711,6 +717,7 @@ 舉例來說,部分網站可能會以顯示廣告的方式回應這類要求,而這些廣告並非根據您所造訪的其他網站記錄而產生。許多網站仍會收集您的瀏覽資料,並將這些資料用於下列目的:提高網站安全性、在網站上提供更相關的內容、廣告和推薦項目,以及產生報告統計資料。</translation> <translation id="624789221780392884">可進行更新</translation> <translation id="6255999984061454636">內容建議</translation> +<translation id="6270391203985052864">網站可以要求傳送通知給你</translation> <translation id="6277522088822131679">列印網頁時發生問題,請再試一次。</translation> <translation id="6295158916970320988">所有網站</translation> <translation id="629730747756840877">帳戶</translation> @@ -755,6 +762,7 @@ <translation id="6545864417968258051">藍牙掃描</translation> <translation id="6560414384669816528">使用 Sogou 搜尋</translation> <translation id="656065428026159829">顯示更多</translation> +<translation id="6561560012278703671">使用低擾模式 (禁止網站顯示通知,以免干擾)</translation> <translation id="6566259936974865419">Chrome 為你節省了 <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">一律允許</translation> <translation id="6573431926118603307">您在其他裝置上透過 Chrome 開啟的分頁會顯示在這裡。</translation> @@ -852,6 +860,7 @@ <translation id="729975465115245577">你的裝置沒有可儲存密碼檔案的應用程式。</translation> <translation id="7302081693174882195">詳細資料:依儲存資料量排序</translation> <translation id="7302486331832100261">你通常會封鎖通知。如要允許通知,請輕觸 [詳細資料]。</translation> +<translation id="7311441321349344333">這部裝置的 NFC 功能已關閉。請前往 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />開啟這項功能。</translation> <translation id="7328017930301109123">使用精簡模式時,Chrome 可加快網頁載入速度,並可節省多達百分之 60 的數據用量。</translation> <translation id="7333031090786104871">仍在新增先前的網站</translation> <translation id="7352939065658542140">影片</translation>
diff --git a/chrome/browser/ui/android/widget/BUILD.gn b/chrome/browser/ui/android/widget/BUILD.gn index 36ec68c..1efd7d3 100644 --- a/chrome/browser/ui/android/widget/BUILD.gn +++ b/chrome/browser/ui/android/widget/BUILD.gn
@@ -6,7 +6,7 @@ import("//ui/android/features.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/chrome/browser/ui/widget/AlwaysDismissedDialog.java", "java/src/org/chromium/chrome/browser/ui/widget/ClipDrawableProgressBar.java", "java/src/org/chromium/chrome/browser/ui/widget/CompositeTouchDelegate.java", @@ -14,11 +14,11 @@ "java/src/org/chromium/chrome/browser/ui/widget/FadingShadow.java", "java/src/org/chromium/chrome/browser/ui/widget/FadingShadowView.java", "java/src/org/chromium/chrome/browser/ui/widget/LoadingView.java", + "java/src/org/chromium/chrome/browser/ui/widget/MaterialProgressBar.java", + "java/src/org/chromium/chrome/browser/ui/widget/MoreProgressButton.java", "java/src/org/chromium/chrome/browser/ui/widget/PaddedFrameLayout.java", "java/src/org/chromium/chrome/browser/ui/widget/PromoDialog.java", "java/src/org/chromium/chrome/browser/ui/widget/PromoDialogLayout.java", - "java/src/org/chromium/chrome/browser/ui/widget/MaterialProgressBar.java", - "java/src/org/chromium/chrome/browser/ui/widget/MoreProgressButton.java", "java/src/org/chromium/chrome/browser/ui/widget/RadioButtonLayout.java", "java/src/org/chromium/chrome/browser/ui/widget/RadioButtonWithDescription.java", "java/src/org/chromium/chrome/browser/ui/widget/RadioButtonWithDescriptionLayout.java", @@ -41,15 +41,14 @@ "java/src/org/chromium/chrome/browser/ui/widget/highlight/PulseDrawable.java", "java/src/org/chromium/chrome/browser/ui/widget/highlight/PulseInterpolator.java", "java/src/org/chromium/chrome/browser/ui/widget/highlight/ViewHighlighter.java", - "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenu.java", "java/src/org/chromium/chrome/browser/ui/widget/listmenu/BasicListMenu.java", + "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenu.java", "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuButton.java", "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuButtonDelegate.java", "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuItemAdapter.java", - "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuItemProperties.java", + "java/src/org/chromium/chrome/browser/ui/widget/listmenu/ListMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/ui/widget/text/AccessibleTextView.java", - "java/src/org/chromium/chrome/browser/ui/widget/text/AlertDialogEditText.java", "java/src/org/chromium/chrome/browser/ui/widget/text/TemplatePreservingTextView.java", "java/src/org/chromium/chrome/browser/ui/widget/text/TextViewWithCompoundDrawables.java", "java/src/org/chromium/chrome/browser/ui/widget/text/VerticallyFixedEditText.java", @@ -77,6 +76,7 @@ resource_dirs = [ "java/res" ] deps = [ "//chrome/browser/ui/android/strings:ui_strings_grd", + "//components/browser_ui/strings/android:browser_ui_strings_grd", "//components/browser_ui/styles/android:java_resources", "//components/browser_ui/widget/android:java_resources", "//third_party/android_deps:com_android_support_design_java", @@ -87,7 +87,9 @@ android_library("test_support_java") { testonly = true - java_files = [ "test/java/src/org/chromium/chrome/browser/ui/widget/highlight/ViewHighlighterTestUtils.java" ] + sources = [ + "test/java/src/org/chromium/chrome/browser/ui/widget/highlight/ViewHighlighterTestUtils.java", + ] deps = [ ":java", "//content/public/test/android:content_java_test_support", @@ -97,13 +99,13 @@ android_library("ui_widget_java_tests") { testonly = true - java_files = [ + sources = [ + "java/src/org/chromium/chrome/browser/ui/widget/MoreProgressButtonTest.java", "java/src/org/chromium/chrome/browser/ui/widget/PromoDialogTest.java", "java/src/org/chromium/chrome/browser/ui/widget/RadioButtonLayoutTest.java", "java/src/org/chromium/chrome/browser/ui/widget/RadioButtonWithDescriptionLayoutTest.java", - "java/src/org/chromium/chrome/browser/ui/widget/highlight/ViewHighlighterTest.java", - "java/src/org/chromium/chrome/browser/ui/widget/MoreProgressButtonTest.java", "java/src/org/chromium/chrome/browser/ui/widget/WrappingLayoutTest.java", + "java/src/org/chromium/chrome/browser/ui/widget/highlight/ViewHighlighterTest.java", ] deps = [ ":java", @@ -134,7 +136,9 @@ # Skip platform checks since Robolectric depends on requires_android targets. bypass_platform_checks = true testonly = true - java_files = [ "java/src/org/chromium/chrome/browser/ui/widget/CompositeTouchDelegateUnitTest.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/ui/widget/CompositeTouchDelegateUnitTest.java", + ] deps = [ ":java", "//base:base_java",
diff --git a/chrome/browser/ui/ash/DEPS b/chrome/browser/ui/ash/DEPS index bebe691..0c7954b 100644 --- a/chrome/browser/ui/ash/DEPS +++ b/chrome/browser/ui/ash/DEPS
@@ -14,10 +14,8 @@ "+ash/components/strings/grit/ash_components_strings.h", "+ash/keyboard/ui", "+ash/public", - "+ash/assistant/model/ui/assistant_card_element.h", "+ash/assistant/ui/assistant_ui_constants.h", - "+ash/assistant/ui/main_stage/assistant_card_element_view.h", - "+ash/assistant/ui/main_stage/assistant_text_element_view.h", + "+ash/assistant/ui/main_stage/assistant_ui_element_view.h", ], # AshShellInit supports classic (non-mash) mode so allow ash/ includes. "ash_shell_init\.cc": [
diff --git a/chrome/browser/ui/ash/assistant/assistant_client.cc b/chrome/browser/ui/ash/assistant/assistant_client.cc index 96ce3cd2..cd1778de2 100644 --- a/chrome/browser/ui/ash/assistant/assistant_client.cc +++ b/chrome/browser/ui/ash/assistant/assistant_client.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/ui/ash/assistant/assistant_image_downloader.h" #include "chrome/browser/ui/ash/assistant/assistant_service_connection.h" #include "chrome/browser/ui/ash/assistant/assistant_setup.h" +#include "chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.h" #include "chrome/browser/ui/ash/assistant/proactive_suggestions_client_impl.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_switches.h" @@ -85,8 +86,11 @@ AssistantServiceConnection::GetForProfile(profile_)->service(); service->Init(client_receiver_.BindNewPipeAndPassRemote(), device_actions_.AddReceiver()); + assistant_image_downloader_ = std::make_unique<AssistantImageDownloader>(); assistant_setup_ = std::make_unique<AssistantSetup>(service); + assistant_web_view_factory_ = + std::make_unique<AssistantWebViewFactoryImpl>(profile_); if (chromeos::assistant::features::IsProactiveSuggestionsEnabled()) { proactive_suggestions_client_ =
diff --git a/chrome/browser/ui/ash/assistant/assistant_client.h b/chrome/browser/ui/ash/assistant/assistant_client.h index 407a25a..74d3df9a 100644 --- a/chrome/browser/ui/ash/assistant/assistant_client.h +++ b/chrome/browser/ui/ash/assistant/assistant_client.h
@@ -20,6 +20,7 @@ class AssistantImageDownloader; class AssistantSetup; +class AssistantWebViewFactoryImpl; class ProactiveSuggestionsClientImpl; class Profile; @@ -103,6 +104,7 @@ std::unique_ptr<AssistantImageDownloader> assistant_image_downloader_; std::unique_ptr<AssistantSetup> assistant_setup_; + std::unique_ptr<AssistantWebViewFactoryImpl> assistant_web_view_factory_; std::unique_ptr<ProactiveSuggestionsClientImpl> proactive_suggestions_client_;
diff --git a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc index 25724de..f2c5d5fa 100644 --- a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc +++ b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc
@@ -6,8 +6,7 @@ #include "ash/assistant/model/ui/assistant_card_element.h" #include "ash/assistant/ui/assistant_ui_constants.h" -#include "ash/assistant/ui/main_stage/assistant_card_element_view.h" -#include "ash/assistant/ui/main_stage/assistant_text_element_view.h" +#include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/assistant/assistant_state.h" @@ -211,8 +210,8 @@ base::Optional<std::string> GetResponseTextOfView( views::View* view) const override { if (Equals(view->GetClassName(), "AssistantTextElementView")) { - auto* text_view = static_cast<ash::AssistantTextElementView*>(view); - return base::UTF16ToUTF8(text_view->GetText()); + auto* text_view = static_cast<ash::AssistantUiElementView*>(view); + return text_view->ToStringForTesting(); } return base::nullopt; @@ -226,8 +225,8 @@ base::Optional<std::string> GetResponseTextOfView( views::View* view) const override { if (Equals(view->GetClassName(), "AssistantCardElementView")) { - auto* card_view = static_cast<ash::AssistantCardElementView*>(view); - return card_view->GetCardElementForTesting()->html(); + auto* card_view = static_cast<ash::AssistantUiElementView*>(view); + return card_view->ToStringForTesting(); } return base::nullopt;
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.cc b/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.cc new file mode 100644 index 0000000..b49239c --- /dev/null +++ b/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.cc
@@ -0,0 +1,18 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/ash/assistant/assistant_web_view_impl.h" + +AssistantWebViewFactoryImpl::AssistantWebViewFactoryImpl(Profile* profile) + : profile_(profile) {} + +AssistantWebViewFactoryImpl::~AssistantWebViewFactoryImpl() = default; + +std::unique_ptr<ash::AssistantWebView2> AssistantWebViewFactoryImpl::Create( + const ash::AssistantWebView2::InitParams& params) { + return std::make_unique<AssistantWebViewImpl>(profile_, params); +}
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.h b/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.h new file mode 100644 index 0000000..ca55272 --- /dev/null +++ b/chrome/browser/ui/ash/assistant/assistant_web_view_factory_impl.h
@@ -0,0 +1,30 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_IMPL_H_ +#define CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_IMPL_H_ + +#include "ash/public/cpp/assistant/assistant_web_view_factory.h" + +class Profile; + +// Implements the singleton AssistantWebViewFactory used by Ash to work around +// dependency restrictions. +class AssistantWebViewFactoryImpl : public ash::AssistantWebViewFactory { + public: + explicit AssistantWebViewFactoryImpl(Profile* profile); + AssistantWebViewFactoryImpl(AssistantWebViewFactoryImpl& copy) = delete; + AssistantWebViewFactoryImpl& operator=(AssistantWebViewFactoryImpl& assign) = + delete; + ~AssistantWebViewFactoryImpl() override; + + // ash::AssistantWebViewFactory: + std::unique_ptr<ash::AssistantWebView2> Create( + const ash::AssistantWebView2::InitParams& params) override; + + private: + Profile* const profile_; +}; + +#endif // CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_FACTORY_IMPL_H_
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc new file mode 100644 index 0000000..a6c61ea --- /dev/null +++ b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc
@@ -0,0 +1,170 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/ash/assistant/assistant_web_view_impl.h" + +#include "chrome/browser/profiles/profile.h" +#include "content/public/browser/focused_node_details.h" +#include "content/public/browser/render_widget_host_view.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" +#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" +#include "ui/views/controls/webview/web_contents_set_background_color.h" +#include "ui/views/controls/webview/webview.h" +#include "ui/views/focus/focus_manager.h" +#include "ui/views/view.h" + +AssistantWebViewImpl::AssistantWebViewImpl(Profile* profile, + const InitParams& params) + : params_(params) { + InitWebContents(profile); + InitLayout(profile); +} + +AssistantWebViewImpl::~AssistantWebViewImpl() { + Observe(nullptr); + web_contents_->SetDelegate(nullptr); +} + +const char* AssistantWebViewImpl::GetClassName() const { + return "AssistantWebViewImpl"; +} + +void AssistantWebViewImpl::ChildPreferredSizeChanged(views::View* child) { + DCHECK_EQ(web_view_.get(), child); + SetPreferredSize(web_view_->GetPreferredSize()); +} + +void AssistantWebViewImpl::Layout() { + web_view_->SetBoundsRect(GetContentsBounds()); +} + +void AssistantWebViewImpl::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void AssistantWebViewImpl::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +bool AssistantWebViewImpl::GoBack() { + if (web_contents_->GetController().CanGoBack()) { + web_contents_->GetController().GoBack(); + return true; + } + return false; +} + +void AssistantWebViewImpl::Navigate(const GURL& url) { + content::NavigationController::LoadURLParams params(url); + web_contents_->GetController().LoadURLWithParams(params); +} + +bool AssistantWebViewImpl::IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) { + if (params_.suppress_navigation) { + for (auto& observer : observers_) { + observer.DidSuppressNavigation(target_url, + WindowOpenDisposition::NEW_FOREGROUND_TAB, + /*from_user_gesture=*/true); + } + return true; + } + return content::WebContentsDelegate::IsWebContentsCreationOverridden( + source_site_instance, window_container_type, opener_url, frame_name, + target_url); +} + +content::WebContents* AssistantWebViewImpl::OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params) { + if (params_.suppress_navigation) { + for (auto& observer : observers_) { + observer.DidSuppressNavigation(params.url, params.disposition, + /*from_user_gesture=*/true); + } + return nullptr; + } + return content::WebContentsDelegate::OpenURLFromTab(source, params); +} + +void AssistantWebViewImpl::ResizeDueToAutoResize( + content::WebContents* web_contents, + const gfx::Size& new_size) { + DCHECK_EQ(web_contents_.get(), web_contents); + web_view_->SetPreferredSize(new_size); +} + +bool AssistantWebViewImpl::TakeFocus(content::WebContents* web_contents, + bool reverse) { + DCHECK_EQ(web_contents_.get(), web_contents); + auto* focus_manager = GetFocusManager(); + if (focus_manager) + focus_manager->ClearNativeFocus(); + return false; +} + +void AssistantWebViewImpl::DidStopLoading() { + for (auto& observer : observers_) + observer.DidStopLoading(); +} + +void AssistantWebViewImpl::OnFocusChangedInPage( + content::FocusedNodeDetails* details) { + for (auto& observer : observers_) + observer.DidChangeFocusedNode(details->node_bounds_in_screen); +} + +void AssistantWebViewImpl::RenderViewHostChanged( + content::RenderViewHost* old_host, + content::RenderViewHost* new_host) { + if (!web_contents_->GetRenderWidgetHostView()) + return; + + if (!params_.enable_auto_resize) + return; + + gfx::Size min_size(1, 1); + if (params_.min_size) + min_size.SetToMax(params_.min_size.value()); + + gfx::Size max_size(INT_MAX, INT_MAX); + if (params_.max_size) + max_size.SetToMin(params_.max_size.value()); + + web_contents_->GetRenderWidgetHostView()->EnableAutoResize(min_size, + max_size); +} + +void AssistantWebViewImpl::InitWebContents(Profile* profile) { + web_contents_ = + content::WebContents::Create(content::WebContents::CreateParams( + profile, content::SiteInstance::Create(profile))); + + web_contents_->SetDelegate(this); + Observe(web_contents_.get()); + + // Use a transparent background. + views::WebContentsSetBackgroundColor::CreateForWebContentsWithColor( + web_contents_.get(), SK_ColorTRANSPARENT); + + // If requested, suppress navigation. + if (params_.suppress_navigation) { + web_contents_->GetMutableRendererPrefs() + ->browser_handles_all_top_level_requests = true; + web_contents_->SyncRendererPrefs(); + } +} + +void AssistantWebViewImpl::InitLayout(Profile* profile) { + // Web view. + web_view_ = std::make_unique<views::WebView>(profile); + web_view_->set_owned_by_client(); + web_view_->SetWebContents(web_contents_.get()); + AddChildView(web_view_.get()); +}
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h new file mode 100644 index 0000000..0db9b331 --- /dev/null +++ b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h
@@ -0,0 +1,75 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_IMPL_H_ +#define CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_IMPL_H_ + +#include "ash/public/cpp/assistant/assistant_web_view_2.h" +#include "base/observer_list.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/public/browser/web_contents_observer.h" + +class Profile; + +namespace content { +class WebContents; +} // namespace content + +namespace views { +class WebView; +} // namespace views + +// Implements AssistantWebView2 used by Ash to work around dependency +// restrictions. +class AssistantWebViewImpl : public ash::AssistantWebView2, + public content::WebContentsDelegate, + public content::WebContentsObserver { + public: + explicit AssistantWebViewImpl(Profile* profile, const InitParams& params); + AssistantWebViewImpl(AssistantWebViewImpl& copy) = delete; + AssistantWebViewImpl& operator=(AssistantWebViewImpl& assign) = delete; + ~AssistantWebViewImpl() override; + + // ash::AssistantWebView2: + const char* GetClassName() const override; + void ChildPreferredSizeChanged(views::View* child) override; + void Layout() override; + void AddObserver(Observer* observer) override; + void RemoveObserver(Observer* observer) override; + bool GoBack() override; + void Navigate(const GURL& url) override; + + // content::WebContentsDelegate: + bool IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) override; + content::WebContents* OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params) override; + void ResizeDueToAutoResize(content::WebContents* web_contents, + const gfx::Size& new_size) override; + bool TakeFocus(content::WebContents* web_contents, bool reverse) override; + + // content::WebContentsObserver: + void DidStopLoading() override; + void OnFocusChangedInPage(content::FocusedNodeDetails* details) override; + void RenderViewHostChanged(content::RenderViewHost* old_host, + content::RenderViewHost* new_host) override; + + private: + void InitWebContents(Profile* profile); + void InitLayout(Profile* profile); + + const InitParams params_; + + std::unique_ptr<content::WebContents> web_contents_; + std::unique_ptr<views::WebView> web_view_; + + base::ObserverList<Observer> observers_; +}; + +#endif // CHROME_BROWSER_UI_ASH_ASSISTANT_ASSISTANT_WEB_VIEW_IMPL_H_
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc index 71480e1..a11c67fd 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc
@@ -6,7 +6,6 @@ #include "ash/public/cpp/app_types.h" #include "ash/public/cpp/multi_user_window_manager.h" -#include "ash/public/cpp/shelf_item_delegate.h" #include "ash/public/cpp/shelf_model.h" #include "ash/public/cpp/shelf_types.h" #include "ash/public/cpp/window_properties.h" @@ -359,13 +358,10 @@ } void AppServiceAppWindowArcTracker::OnItemDelegateDiscarded( - const ash::ShelfID& shelf_id, - ash::ShelfItemDelegate* delegate) { + const ash::ShelfID& shelf_id) { arc::ArcAppShelfId app_shelf_id = arc::ArcAppShelfId::FromString(shelf_id.app_id); - auto it = app_shelf_group_to_controller_map_.find(app_shelf_id); - if (static_cast<ash::ShelfItemDelegate*>(it->second) == delegate) - app_shelf_group_to_controller_map_.erase(app_shelf_id); + app_shelf_group_to_controller_map_.erase(app_shelf_id); } ash::ShelfID AppServiceAppWindowArcTracker::GetShelfId(int task_id) const {
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.h b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.h index 0d36c92..114cd0a 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.h +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.h
@@ -20,10 +20,6 @@ class ArcAppShelfId; } -namespace ash { -class ShelfItemDelegate; -} - namespace aura { class window; } @@ -82,8 +78,7 @@ void RemoveCandidateWindow(aura::Window* window); // Removes controller from |app_shelf_group_to_controller_map_|. - void OnItemDelegateDiscarded(const ash::ShelfID& shelf_id, - ash::ShelfItemDelegate* delegate); + void OnItemDelegateDiscarded(const ash::ShelfID& shelf_id); ash::ShelfID GetShelfId(int task_id) const;
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc index 5c78ef7..57ab58a 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
@@ -498,7 +498,7 @@ continue; if (arc_tracker_) - arc_tracker_->OnItemDelegateDiscarded(app_window->shelf_id(), delegate); + arc_tracker_->OnItemDelegateDiscarded(app_window->shelf_id()); if (!app_window || app_window->controller() != delegate) continue;
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h index a09afcf4..7e4f9e2e 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h +++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h" #include "chrome/browser/ui/ash/launcher/arc_app_window_delegate.h" -#include "mojo/public/cpp/bindings/binding.h" #include "ui/aura/env_observer.h" #include "ui/aura/window_observer.h"
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h index 33f4f27..e715298 100644 --- a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h +++ b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h
@@ -14,7 +14,6 @@ #include "base/time/time.h" #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/crostini_app_display.h" -#include "mojo/public/cpp/bindings/binding.h" #include "ui/aura/env_observer.h" #include "ui/aura/window_observer.h" #include "ui/display/display.h"
diff --git a/chrome/browser/ui/ash/test_login_screen.h b/chrome/browser/ui/ash/test_login_screen.h index 1d5765e6..4153812 100644 --- a/chrome/browser/ui/ash/test_login_screen.h +++ b/chrome/browser/ui/ash/test_login_screen.h
@@ -11,7 +11,6 @@ #include "ash/public/cpp/login_screen.h" #include "base/macros.h" #include "chrome/browser/ui/ash/test_login_screen_model.h" -#include "mojo/public/cpp/bindings/binding.h" namespace ash { class ScopedGuestButtonBlocker;
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 25469b4..6914660 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -21,6 +21,7 @@ #include "build/build_config.h" #include "chrome/browser/apps/launch_service/launch_service.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/extensions/default_web_app_ids.h" #include "chrome/browser/download/download_shelf.h" #include "chrome/browser/extensions/launch_util.h" @@ -110,7 +111,7 @@ std::string region; chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic( "region", ®ion); - const std::string language = l10n_util::GetApplicationLocale(std::string()); + const std::string language = g_browser_process->GetApplicationLocale(); const std::string version = version_info::GetVersionNumber(); const std::string milestone = version_info::GetMajorVersionNumber(); std::string channel_name =
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_item.h b/chrome/browser/ui/global_media_controls/cast_media_notification_item.h index 5ad6985..ff70b94 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_item.h +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_item.h
@@ -11,7 +11,6 @@ #include "chrome/common/media_router/media_route.h" #include "chrome/common/media_router/mojom/media_status.mojom.h" #include "components/media_message_center/media_notification_item.h" -#include "mojo/public/cpp/bindings/binding.h" #include "services/media_session/public/cpp/media_metadata.h" class Profile;
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc index f34c87c0..c52a283 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc +++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -22,7 +22,6 @@ #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" -#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/browser_about_handler.h" #include "chrome/browser/command_updater.h" @@ -86,45 +85,11 @@ using predictors::AutocompleteActionPredictor; -namespace { - -typedef base::RepeatingCallback<void(const SkBitmap& bitmap)> - RichSuggestionImageCallback; - -// Calls the specified callback when the requested image is downloaded. This -// is a separate class instead of being implemented on ChromeOmniboxClient -// because BitmapFetcherService currently takes ownership of this object. -// TODO(dschuyler): Make BitmapFetcherService use the more typical non-owning -// ObserverList pattern and have ChromeOmniboxClient implement the Observer -// call directly. -class RichSuggestionImageObserver : public BitmapFetcherService::Observer { - public: - explicit RichSuggestionImageObserver( - const RichSuggestionImageCallback& callback) - : callback_(callback) {} - - void OnImageChanged(BitmapFetcherService::RequestId request_id, - const SkBitmap& image) override; - - private: - const RichSuggestionImageCallback callback_; - - DISALLOW_COPY_AND_ASSIGN(RichSuggestionImageObserver); -}; - -void RichSuggestionImageObserver::OnImageChanged( - BitmapFetcherService::RequestId request_id, - const SkBitmap& image) { - DCHECK(!image.empty()); - callback_.Run(image); -} - -} // namespace - ChromeOmniboxClient::ChromeOmniboxClient(OmniboxEditController* controller, Profile* profile) : controller_(static_cast<ChromeOmniboxEditController*>(controller)), profile_(profile), + bitmap_fetcher_helper_(profile), scheme_classifier_(profile), favicon_cache_(FaviconServiceFactory::GetForProfile( profile, @@ -134,12 +99,8 @@ ServiceAccessType::EXPLICIT_ACCESS)) {} ChromeOmniboxClient::~ChromeOmniboxClient() { - BitmapFetcherService* image_service = - BitmapFetcherServiceFactory::GetForBrowserContext(profile_); - if (image_service) { - for (auto request_id : request_ids_) { - image_service->CancelRequest(request_id); - } + for (auto request_id : request_ids_) { + bitmap_fetcher_helper_.CancelRequest(request_id); } } @@ -305,14 +266,9 @@ const AutocompleteResult& result, bool default_match_changed, const BitmapFetchedCallback& on_bitmap_fetched) { - BitmapFetcherService* image_service = - BitmapFetcherServiceFactory::GetForBrowserContext(profile_); - if (!image_service) { - return; - } // Clear out the old requests. for (auto request_id : request_ids_) { - image_service->CancelRequest(request_id); + bitmap_fetcher_helper_.CancelRequest(request_id); } request_ids_.clear(); // Create new requests. @@ -322,52 +278,12 @@ if (match.ImageUrl().is_empty()) { continue; } - // TODO(jdonnelly, rhalavati): Create a helper function with Callback to - // create annotation and pass it to image_service, merging the annotations - // in omnibox_page_handler.cc, chrome_omnibox_client.cc, - // and chrome_autocomplete_provider_client.cc. - constexpr net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("omnibox_result_change", R"( - semantics { - sender: "Omnibox" - description: - "Chromium provides answers in the suggestion list for " - "certain queries that user types in the omnibox. This request " - "retrieves a small image (for example, an icon illustrating " - "the current weather conditions) when this can add information " - "to an answer." - trigger: - "Change of results for the query typed by the user in the " - "omnibox." - data: - "The only data sent is the path to an image. No user data is " - "included, although some might be inferrable (e.g. whether the " - "weather is sunny or rainy in the user's current location) " - "from the name of the image in the path." - destination: WEBSITE - } - policy { - cookies_allowed: YES - cookies_store: "user" - setting: - "You can enable or disable this feature via 'Use a prediction " - "service to help complete searches and URLs typed in the " - "address bar.' in Chromium's settings under Advanced. The " - "feature is enabled by default." - chrome_policy { - SearchSuggestEnabled { - policy_options {mode: MANDATORY} - SearchSuggestEnabled: false - } - } - })"); - request_ids_.push_back(image_service->RequestImage( + request_ids_.push_back(bitmap_fetcher_helper_.RequestImage( match.ImageUrl(), - new RichSuggestionImageObserver(base::BindRepeating( - &ChromeOmniboxClient::OnBitmapFetched, base::Unretained(this), - on_bitmap_fetched, result_index)), - traffic_annotation)); + base::BindRepeating(&ChromeOmniboxClient::OnBitmapFetched, + base::Unretained(this), on_bitmap_fetched, + result_index))); } }
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.h b/chrome/browser/ui/omnibox/chrome_omnibox_client.h index 20ea2b3..aba28a2 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_client.h +++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.h
@@ -10,6 +10,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "chrome/browser/autocomplete/bitmap_fetcher_helper.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" #include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" #include "chrome/common/search/instant_types.h" @@ -96,6 +97,7 @@ ChromeOmniboxEditController* controller_; Profile* profile_; + BitmapFetcherHelper bitmap_fetcher_helper_; ChromeAutocompleteSchemeClassifier scheme_classifier_; std::vector<BitmapFetcherService::RequestId> request_ids_; FaviconCache favicon_cache_;
diff --git a/chrome/browser/ui/prefs/pref_watcher.cc b/chrome/browser/ui/prefs/pref_watcher.cc index a738dc8..56bd8520 100644 --- a/chrome/browser/ui/prefs/pref_watcher.cc +++ b/chrome/browser/ui/prefs/pref_watcher.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/component_updater/soda_component_installer.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_preferences_util.h" @@ -87,6 +88,11 @@ renderer_callback); #endif + profile_pref_change_registrar_.Add( + prefs::kLiveCaptionEnabled, + base::BindRepeating(&PrefWatcher::OnLiveCaptionEnabledPrefChanged, + base::Unretained(this))); + PrefChangeRegistrar::NamedChangeCallback webkit_callback = base::BindRepeating(&PrefWatcher::OnWebPrefChanged, base::Unretained(this)); @@ -137,6 +143,17 @@ helper->OnWebPrefChanged(pref_name); } +void PrefWatcher::OnLiveCaptionEnabledPrefChanged( + const std::string& pref_name) { + PrefService* profile_prefs = profile_->GetPrefs(); + if (profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled)) { + component_updater::RegisterSODAComponent( + g_browser_process->component_updater(), profile_prefs, + base::BindOnce(&component_updater::SODAComponentInstallerPolicy:: + UpdateSODAComponentOnDemand)); + } +} + // static PrefWatcher* PrefWatcherFactory::GetForProfile(Profile* profile) { return static_cast<PrefWatcher*>(
diff --git a/chrome/browser/ui/prefs/pref_watcher.h b/chrome/browser/ui/prefs/pref_watcher.h index dd06c6d..a439b2ce 100644 --- a/chrome/browser/ui/prefs/pref_watcher.h +++ b/chrome/browser/ui/prefs/pref_watcher.h
@@ -35,6 +35,7 @@ void UpdateRendererPreferences(); void OnWebPrefChanged(const std::string& pref_name); + void OnLiveCaptionEnabledPrefChanged(const std::string& pref_name); Profile* profile_; PrefChangeRegistrar profile_pref_change_registrar_;
diff --git a/chrome/browser/ui/tabs/tab_group_model.cc b/chrome/browser/ui/tabs/tab_group_model.cc index 9eaf466..9754728 100644 --- a/chrome/browser/ui/tabs/tab_group_model.cc +++ b/chrome/browser/ui/tabs/tab_group_model.cc
@@ -12,18 +12,22 @@ #include "base/optional.h" #include "chrome/browser/ui/tabs/tab_group.h" #include "chrome/browser/ui/tabs/tab_group_controller.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" TabGroupModel::TabGroupModel(TabGroupController* controller) : controller_(controller) {} + TabGroupModel::~TabGroupModel() {} TabGroup* TabGroupModel::AddTabGroup( tab_groups::TabGroupId id, base::Optional<tab_groups::TabGroupVisualData> visual_data) { auto tab_group = std::make_unique<TabGroup>( - controller_, id, visual_data.value_or(tab_groups::TabGroupVisualData())); + controller_, id, + visual_data.value_or( + tab_groups::TabGroupVisualData(base::string16(), GetNextColor()))); groups_[id] = std::move(tab_group); return groups_[id].get(); @@ -50,3 +54,23 @@ group_ids.push_back(id_group_pair.first); return group_ids; } + +tab_groups::TabGroupColorId TabGroupModel::GetNextColor() const { + // Count the number of times each available color is used. + std::map<tab_groups::TabGroupColorId, int> color_usage_counts; + for (const auto& id_color_pair : tab_groups::GetTabGroupColorSet()) + color_usage_counts[id_color_pair.first] = 0; + for (const auto& id_group_pair : groups_) + color_usage_counts[id_group_pair.second->visual_data()->color()]++; + + // Find the next least-used color. + tab_groups::TabGroupColorId next_color = color_usage_counts.begin()->first; + int min_usage_count = color_usage_counts.begin()->second; + for (const auto& color_usage_pair : color_usage_counts) { + if (color_usage_pair.second < min_usage_count) { + next_color = color_usage_pair.first; + min_usage_count = color_usage_pair.second; + } + } + return next_color; +}
diff --git a/chrome/browser/ui/tabs/tab_group_model.h b/chrome/browser/ui/tabs/tab_group_model.h index 8e1259d..c0528a7 100644 --- a/chrome/browser/ui/tabs/tab_group_model.h +++ b/chrome/browser/ui/tabs/tab_group_model.h
@@ -13,6 +13,7 @@ #include <vector> #include "base/optional.h" +#include "components/tab_groups/tab_group_color.h" class TabGroup; class TabGroupController; @@ -56,6 +57,11 @@ std::map<tab_groups::TabGroupId, std::unique_ptr<TabGroup>> groups_; TabGroupController* controller_; + + // Returns the least-used color in the color set, breaking ties toward the + // first color in the set. Used to initialize a new group's color, which + // should be as distinct from the other groups as possible. + tab_groups::TabGroupColorId GetNextColor() const; }; #endif // CHROME_BROWSER_UI_TABS_TAB_GROUP_MODEL_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc index bbfc711..68a420e 100644 --- a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc +++ b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
@@ -13,6 +13,7 @@ #include <utility> #include <vector> +#include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/optional.h" #include "base/stl_util.h" @@ -25,6 +26,7 @@ #include "chrome/browser/ui/tabs/tab_group_model.h" #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" #include "chrome/test/base/testing_profile.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/web_modal/web_contents_modal_dialog_manager.h" #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" @@ -3425,14 +3427,38 @@ strip.CloseAllTabs(); } +TEST_F(TabStripModelTest, CreateGroupSetsVisualData) { + TestTabStripModelDelegate delegate; + TabStripModel strip(&delegate, profile()); + base::flat_map<tab_groups::TabGroupColorId, tab_groups::TabGroupColor> + all_colors = tab_groups::GetTabGroupColorSet(); + PrepareTabs(&strip, all_colors.size() + 1); + + // Expect groups to cycle through the available color set. + int index = 0; + for (const auto& color_pair : all_colors) { + const tab_groups::TabGroupId group = strip.AddToNewGroup({index}); + EXPECT_EQ(strip.group_model()->GetTabGroup(group)->visual_data()->color(), + color_pair.first); + ++index; + } + + // Expect the last group to cycle back to the first color. + const tab_groups::TabGroupId group = strip.AddToNewGroup({index}); + EXPECT_EQ(strip.group_model()->GetTabGroup(group)->visual_data()->color(), + all_colors.begin()->first); + + strip.CloseAllTabs(); +} + TEST_F(TabStripModelTest, SetVisualDataForGroup) { TestTabStripModelDelegate delegate; TabStripModel strip(&delegate, profile()); PrepareTabs(&strip, 1); const tab_groups::TabGroupId group = strip.AddToNewGroup({0}); - const tab_groups::TabGroupVisualData new_data(base::ASCIIToUTF16("Foo"), - SK_ColorCYAN); + const tab_groups::TabGroupVisualData new_data( + base::ASCIIToUTF16("Foo"), tab_groups::TabGroupColorId::kCyan); strip.group_model()->GetTabGroup(group)->SetVisualData(new_data); const tab_groups::TabGroupVisualData* data = strip.group_model()->GetTabGroup(group)->visual_data(); @@ -3455,8 +3481,8 @@ ASSERT_EQ(1u, observer.group_updates().size()); EXPECT_EQ(1, observer.group_update(group).contents_update_count); - const tab_groups::TabGroupVisualData new_data(base::ASCIIToUTF16("Foo"), - SK_ColorBLUE); + const tab_groups::TabGroupVisualData new_data( + base::ASCIIToUTF16("Foo"), tab_groups::TabGroupColorId::kBlue); strip.group_model()->GetTabGroup(group)->SetVisualData(new_data); // Now check that we are notified when we change it, once at creation
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h index 8211cc2..856aa13 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "chrome/browser/ui/views/tab_icon_view_model.h" -#include "mojo/public/cpp/bindings/binding.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h"
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h index 8085014bb..d58a34d 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h
@@ -12,6 +12,7 @@ #include "base/time/time.h" #include "chrome/browser/ui/views/toolbar/toolbar_button.h" #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h" #include "chrome/common/buildflags.h" #include "ui/events/event_handler.h" #include "ui/gfx/animation/slide_animation.h" @@ -40,7 +41,7 @@ class Browser; class FeaturePromoBubbleView; -class WebUITabStripContainerView : public TabStripUI::Embedder, +class WebUITabStripContainerView : public TabStripUIEmbedder, public gfx::AnimationDelegate, public views::AccessiblePaneView, public views::ButtonListener,
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index 723caae..33b39e8 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -46,6 +46,9 @@ #include "components/omnibox/browser/autocomplete_classifier.h" #include "components/omnibox/browser/autocomplete_match.h" #include "components/prefs/pref_service.h" +#include "components/tab_groups/tab_group_color.h" +#include "components/tab_groups/tab_group_id.h" +#include "components/tab_groups/tab_group_visual_data.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" @@ -55,6 +58,7 @@ #include "ipc/ipc_message.h" #include "third_party/metrics_proto/omnibox_event.pb.h" #include "ui/base/models/list_selection_model.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/image/image.h" #include "ui/views/controls/menu/menu_runner.h" #include "ui/views/widget/widget.h" @@ -433,10 +437,14 @@ index); } -const tab_groups::TabGroupVisualData* -BrowserTabStripController::GetVisualDataForGroup( +base::string16 BrowserTabStripController::GetGroupTitle( tab_groups::TabGroupId group) const { - return model_->group_model()->GetTabGroup(group)->visual_data(); + return model_->group_model()->GetTabGroup(group)->visual_data()->title(); +} + +tab_groups::TabGroupColorId BrowserTabStripController::GetGroupColorId( + tab_groups::TabGroupId group) const { + return model_->group_model()->GetTabGroup(group)->visual_data()->color(); } void BrowserTabStripController::SetVisualDataForGroup(
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h index b05d332..00d5839dc 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -16,10 +16,13 @@ #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "chrome/browser/ui/views/tabs/tab_strip_controller.h" #include "components/prefs/pref_change_registrar.h" +#include "components/tab_groups/tab_group_color.h" class Browser; class BrowserNonClientFrameView; class Tab; +class TabGroupId; +class TabGroupVisualData; namespace content { class WebContents; @@ -75,7 +78,8 @@ void OnStartedDragging() override; void OnStoppedDragging() override; void OnKeyboardFocusedTabChanged(base::Optional<int> index) override; - const tab_groups::TabGroupVisualData* GetVisualDataForGroup( + base::string16 GetGroupTitle(tab_groups::TabGroupId group_id) const override; + tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupId group_id) const override; void SetVisualDataForGroup( tab_groups::TabGroupId group,
diff --git a/chrome/browser/ui/views/tabs/color_picker_view.cc b/chrome/browser/ui/views/tabs/color_picker_view.cc index d44f974..a3068e7 100644 --- a/chrome/browser/ui/views/tabs/color_picker_view.cc +++ b/chrome/browser/ui/views/tabs/color_picker_view.cc
@@ -5,9 +5,11 @@ #include "chrome/browser/ui/views/tabs/color_picker_view.h" #include <memory> +#include <vector> #include "base/bind.h" #include "base/callback.h" +#include "base/containers/span.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -219,10 +221,10 @@ RemoveAllChildViews(true); } -base::Optional<SkColor> ColorPickerView::GetSelectedColor() const { - for (const ColorPickerElementView* element : elements_) { - if (element->selected()) - return element->color(); +base::Optional<int> ColorPickerView::GetSelectedElement() const { + for (size_t i = 0; i < elements_.size(); ++i) { + if (elements_[i]->selected()) + return static_cast<int>(i); } return base::nullopt; }
diff --git a/chrome/browser/ui/views/tabs/color_picker_view.h b/chrome/browser/ui/views/tabs/color_picker_view.h index d486916..8a3160a 100644 --- a/chrome/browser/ui/views/tabs/color_picker_view.h +++ b/chrome/browser/ui/views/tabs/color_picker_view.h
@@ -22,8 +22,6 @@ // Lets users pick from a list of colors displayed as circles that can be // clicked on. Similar to radio buttons, exactly one is selected after the first // selection is made. -// -// TODO(crbug.com/989174): make this keyboard and screenreader accessible. class ColorPickerView : public views::View { public: using ColorSelectedCallback = base::RepeatingCallback<void()>; @@ -36,8 +34,9 @@ ColorSelectedCallback callback); ~ColorPickerView() override; + // Returns the index of the selected element, if any. // After the callback is called, this is guaranteed to never return nullopt. - base::Optional<SkColor> GetSelectedColor() const; + base::Optional<int> GetSelectedElement() const; // views::View: views::View* GetSelectedViewForGroup(int group) override;
diff --git a/chrome/browser/ui/views/tabs/color_picker_view_unittest.cc b/chrome/browser/ui/views/tabs/color_picker_view_unittest.cc index 0215834..681989c 100644 --- a/chrome/browser/ui/views/tabs/color_picker_view_unittest.cc +++ b/chrome/browser/ui/views/tabs/color_picker_view_unittest.cc
@@ -26,7 +26,7 @@ class ColorPickerViewTest : public ChromeViewsTestBase { protected: - static const std::array<std::pair<SkColor, base::string16>, 3> kTestColors; + static const std::vector<std::pair<SkColor, base::string16>> kTestColors; void SetUp() override { ChromeViewsTestBase::SetUp(); @@ -82,15 +82,16 @@ }; // static -const std::array<std::pair<SkColor, base::string16>, 3> - ColorPickerViewTest::kTestColors{{ - {SK_ColorRED, base::ASCIIToUTF16("Red")}, - {SK_ColorGREEN, base::ASCIIToUTF16("Green")}, - {SK_ColorBLUE, base::ASCIIToUTF16("Blue")}, - }}; +const std::vector<std::pair<SkColor, base::string16>> + ColorPickerViewTest::kTestColors = + std::vector<std::pair<SkColor, base::string16>>{ + {SK_ColorRED, base::ASCIIToUTF16("Red")}, + {SK_ColorGREEN, base::ASCIIToUTF16("Green")}, + {SK_ColorBLUE, base::ASCIIToUTF16("Blue")}, + }; TEST_F(ColorPickerViewTest, NoColorSelectedByDefaultIfNotMatching) { - EXPECT_FALSE(color_picker_->GetSelectedColor().has_value()); + EXPECT_FALSE(color_picker_->GetSelectedElement().has_value()); } TEST_F(ColorPickerViewTest, ColorSelectedByDefaultIfMatching) { @@ -110,24 +111,25 @@ color_picker->SizeToPreferredSize(); - EXPECT_TRUE(color_picker->GetSelectedColor().has_value()); - EXPECT_EQ(color_picker->GetSelectedColor().value(), initial_color); + EXPECT_TRUE(color_picker->GetSelectedElement().has_value()); + // Expect the index to match that of SK_ColorRED in kTestColors. + EXPECT_EQ(color_picker->GetSelectedElement().value(), 0); widget.reset(); } TEST_F(ColorPickerViewTest, ClickingSelectsColor) { ClickColorAtIndex(0); - EXPECT_EQ(kTestColors[0].first, color_picker_->GetSelectedColor()); + EXPECT_EQ(0, color_picker_->GetSelectedElement()); ClickColorAtIndex(1); - EXPECT_EQ(kTestColors[1].first, color_picker_->GetSelectedColor()); + EXPECT_EQ(1, color_picker_->GetSelectedElement()); } TEST_F(ColorPickerViewTest, ColorNotDeselected) { ClickColorAtIndex(0); ClickColorAtIndex(0); - EXPECT_EQ(kTestColors[0].first, color_picker_->GetSelectedColor()); + EXPECT_EQ(0, color_picker_->GetSelectedElement()); } TEST_F(ColorPickerViewTest, SelectingColorNotifiesCallback) {
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc index 05be371..2081095 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
@@ -8,7 +8,11 @@ #include "chrome/browser/ui/tabs/tab_renderer_data.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "components/tab_groups/tab_group_color.h" +#include "components/tab_groups/tab_group_id.h" +#include "components/tab_groups/tab_group_visual_data.h" #include "ui/gfx/color_palette.h" +#include "ui/gfx/color_utils.h" FakeBaseTabStripController::FakeBaseTabStripController() {} @@ -87,11 +91,14 @@ tab_strip_->OnGroupContentsChanged(new_group.value()); } } +base::string16 FakeBaseTabStripController::GetGroupTitle( + tab_groups::TabGroupId group_id) const { + return fake_group_data_.title(); +} -const tab_groups::TabGroupVisualData* -FakeBaseTabStripController::GetVisualDataForGroup( - tab_groups::TabGroupId group) const { - return &fake_group_data_; +tab_groups::TabGroupColorId FakeBaseTabStripController::GetGroupColorId( + tab_groups::TabGroupId group_id) const { + return fake_group_data_.color(); } void FakeBaseTabStripController::SetVisualDataForGroup(
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h index 3af013fa..dd27ce66 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -58,7 +58,8 @@ void OnStartedDragging() override; void OnStoppedDragging() override; void OnKeyboardFocusedTabChanged(base::Optional<int> index) override; - const tab_groups::TabGroupVisualData* GetVisualDataForGroup( + base::string16 GetGroupTitle(tab_groups::TabGroupId group_id) const override; + tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupId group_id) const override; void SetVisualDataForGroup( tab_groups::TabGroupId group,
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index f7577b79..861e7386 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -49,6 +49,7 @@ #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" #include "components/grit/components_scaled_resources.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_visual_data.h" #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/effects/SkGradientShader.h" @@ -740,10 +741,11 @@ } base::Optional<SkColor> Tab::GetGroupColor() const { - return group().has_value() - ? base::make_optional( - controller_->GetVisualDataForGroup(group().value())->color()) - : base::nullopt; + if (!group().has_value()) + return base::nullopt; + + return controller_->GetPaintedGroupColor( + controller_->GetGroupColorId(group().value())); } SkColor Tab::GetAlertIndicatorColor(TabAlertState state) const {
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h index 8d9c2ac..927a476 100644 --- a/chrome/browser/ui/views/tabs/tab_controller.h +++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -7,6 +7,7 @@ #include "chrome/browser/ui/tabs/tab_types.h" #include "chrome/browser/ui/views/tabs/tab_strip_types.h" +#include "components/tab_groups/tab_group_color.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/base/ui_base_types.h" @@ -188,10 +189,19 @@ // Returns opacity for use on tab hover radial highlight. virtual float GetHoverOpacityForRadialHighlight() const = 0; - // Returns the tab_groups::TabGroupVisualData instance for the given |group|. - virtual const tab_groups::TabGroupVisualData* GetVisualDataForGroup( + // Returns the displayed title of the given |group|. + virtual base::string16 GetGroupTitle(tab_groups::TabGroupId group) const = 0; + + // Returns the color ID of the given |group|. + virtual tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupId group) const = 0; + // Returns the actual painted color of the given |group|, which depends on the + // current theme. + virtual SkColor GetPaintedGroupColor( + tab_groups::TabGroupColorId color_id) const = 0; + + // Sets the title and color ID of the given |group|. virtual void SetVisualDataForGroup( tab_groups::TabGroupId group, tab_groups::TabGroupVisualData visual_data) = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc index 082c46c..779701d 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -46,7 +46,9 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" +#include "components/tab_groups/tab_group_visual_data.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_service.h" @@ -1072,8 +1074,8 @@ AddTabsAndResetBrowser(browser(), 3); tab_groups::TabGroupId group1 = model->AddToNewGroup({2, 3}); tab_groups::TabGroupId group2 = model->AddToNewGroup({1}); - const tab_groups::TabGroupVisualData new_data(base::ASCIIToUTF16("Foo"), - SK_ColorCYAN); + const tab_groups::TabGroupVisualData new_data( + base::ASCIIToUTF16("Foo"), tab_groups::TabGroupColorId::kCyan); group_model->GetTabGroup(group2)->SetVisualData(new_data); StopAnimating(tab_strip); @@ -2032,7 +2034,7 @@ TabStripModel* model = browser()->tab_strip_model(); AddTabsAndResetBrowser(browser(), 1); tab_groups::TabGroupId group = model->AddToNewGroup({0, 1}); - SkColor group_color = tab_strip->GetVisualDataForGroup(group)->color(); + tab_groups::TabGroupColorId group_color = tab_strip->GetGroupColorId(group); StopAnimating(tab_strip); // Create another browser. @@ -2056,8 +2058,7 @@ EXPECT_THAT(model2->group_model()->GetTabGroup(groups2[0])->ListTabs(), testing::ElementsAre(1, 2)); EXPECT_NE(groups2[0], group); - EXPECT_EQ(tab_strip2->GetVisualDataForGroup(groups2[0])->color(), - group_color); + EXPECT_EQ(tab_strip2->GetGroupColorId(groups2[0]), group_color); } namespace {
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc index d51a896..501ed6ca 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -23,11 +23,11 @@ #include "chrome/browser/ui/views/tabs/tab_controller.h" #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" #include "chrome/grit/generated_resources.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/insets.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/button/label_button.h" @@ -44,21 +44,6 @@ constexpr int TAB_GROUP_HEADER_CXMENU_UNGROUP = 14; constexpr int TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP = 15; constexpr int TAB_GROUP_HEADER_CXMENU_FEEDBACK = 16; - -// Returns our hard-coded set of colors. -const std::vector<std::pair<SkColor, base::string16>>& GetColorPickerList() { - static const base::NoDestructor< - std::vector<std::pair<SkColor, base::string16>>> - list({{gfx::kGoogleBlue600, base::ASCIIToUTF16("Blue")}, - {gfx::kGoogleRed600, base::ASCIIToUTF16("Red")}, - {gfx::kGoogleYellow600, base::ASCIIToUTF16("Yellow")}, - {gfx::kGoogleGreen600, base::ASCIIToUTF16("Green")}, - {gfx::kGoogleOrange600, base::ASCIIToUTF16("Orange")}, - {gfx::kGooglePink600, base::ASCIIToUTF16("Pink")}, - {gfx::kGooglePurple600, base::ASCIIToUTF16("Purple")}, - {gfx::kGoogleCyan600, base::ASCIIToUTF16("Cyan")}}); - return *list; -} } // namespace // static @@ -99,8 +84,7 @@ DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); const auto* layout_provider = ChromeLayoutProvider::Get(); - const tab_groups::TabGroupVisualData* current_data = - tab_controller_->GetVisualDataForGroup(group_); + const base::string16 title = tab_controller_->GetGroupTitle(group_); const int horizontal_spacing = layout_provider->GetDistanceMetric( views::DISTANCE_RELATED_CONTROL_HORIZONTAL); const int vertical_menu_spacing = layout_provider->GetDistanceMetric( @@ -122,13 +106,17 @@ // Add the text field for editing the title. title_field_ = group_modifier_container->AddChildView( std::make_unique<views::Textfield>()); - title_field_->SetText(current_data->title()); + title_field_->SetText(title); title_field_->SetAccessibleName(base::ASCIIToUTF16("Group title")); title_field_->set_controller(&title_field_controller_); + InitColorSet(); + const SkColor current_color = tab_controller_->GetPaintedGroupColor( + tab_controller_->GetGroupColorId(group_)); + color_selector_ = group_modifier_container->AddChildView(std::make_unique<ColorPickerView>( - GetColorPickerList(), background_color(), current_data->color(), + colors_, background_color(), current_color, base::Bind(&TabGroupEditorBubbleView::UpdateGroup, base::Unretained(this)))); color_selector_->SetBorder(views::CreateEmptyBorder( @@ -186,15 +174,25 @@ TabGroupEditorBubbleView::~TabGroupEditorBubbleView() = default; +void TabGroupEditorBubbleView::InitColorSet() { + base::flat_map<tab_groups::TabGroupColorId, tab_groups::TabGroupColor> + all_colors = tab_groups::GetTabGroupColorSet(); + + color_ids_.reserve(all_colors.size()); + colors_.reserve(all_colors.size()); + for (auto const color_pair : all_colors) { + color_ids_.push_back(color_pair.first); + SkColor color = tab_controller_->GetPaintedGroupColor(color_pair.first); + colors_.push_back({color, color_pair.second.label}); + } +} + void TabGroupEditorBubbleView::UpdateGroup() { - tab_groups::TabGroupVisualData old_data = - *tab_controller_->GetVisualDataForGroup(group_); - - base::Optional<SkColor> selected_color = color_selector_->GetSelectedColor(); - const SkColor color = - selected_color.has_value() ? selected_color.value() : old_data.color(); - tab_groups::TabGroupVisualData new_data(title_field_->GetText(), color); - + base::Optional<int> selected_element = color_selector_->GetSelectedElement(); + const tab_groups::TabGroupColorId color_id = + selected_element.has_value() ? color_ids_[selected_element.value()] + : tab_controller_->GetGroupColorId(group_); + tab_groups::TabGroupVisualData new_data(title_field_->GetText(), color_id); tab_controller_->SetVisualDataForGroup(group_, new_data); }
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h index 376a91a8..539de70 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h
@@ -7,6 +7,7 @@ #include "base/strings/string16.h" #include "chrome/browser/ui/views/tabs/tab_group_header.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" @@ -86,7 +87,11 @@ views::Textfield* title_field_; + std::vector<tab_groups::TabGroupColorId> color_ids_; + std::vector<std::pair<SkColor, base::string16>> colors_; ColorPickerView* color_selector_; + + void InitColorSet(); }; #endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_EDITOR_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.cc b/chrome/browser/ui/views/tabs/tab_group_header.cc index 2e222a87..b111c1f 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.cc +++ b/chrome/browser/ui/views/tabs/tab_group_header.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/ui/views/tabs/tab_strip_controller.h" #include "chrome/browser/ui/views/tabs/tab_strip_layout.h" #include "chrome/browser/ui/views/tabs/tab_strip_types.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "third_party/skia/include/core/SkColor.h" @@ -90,6 +91,10 @@ tab_strip_->UpdateHoverCard(nullptr); } +void TabGroupHeader::OnThemeChanged() { + VisualsChanged(); +} + void TabGroupHeader::OnGestureEvent(ui::GestureEvent* event) { tab_strip_->UpdateHoverCard(nullptr); switch (event->type()) { @@ -148,18 +153,21 @@ // both should look nestled against the group stroke of the tab to the right. // This requires a +/- 2px adjustment to the width, which causes the tab to // the right to be positioned in the right spot. - const tab_groups::TabGroupVisualData* data = - tab_strip_->controller()->GetVisualDataForGroup(group().value()); - const int right_adjust = data->title().empty() ? 2 : -2; + const base::string16 title = + tab_strip_->controller()->GetGroupTitle(group().value()); + const int right_adjust = title.empty() ? 2 : -2; return overlap_margin + title_chip_->width() + right_adjust; } void TabGroupHeader::VisualsChanged() { - const tab_groups::TabGroupVisualData* data = - tab_strip_->controller()->GetVisualDataForGroup(group().value()); + const base::string16 title = + tab_strip_->controller()->GetGroupTitle(group().value()); + const tab_groups::TabGroupColorId color_id = + tab_strip_->controller()->GetGroupColorId(group().value()); + const SkColor color = tab_strip_->GetPaintedGroupColor(color_id); - if (data->title().empty()) { + if (title.empty()) { // If the title is empty, the chip is just a circle. title_->SetVisible(false); @@ -169,14 +177,13 @@ title_chip_->SetBounds(TabGroupUnderline::GetStrokeInset(), y, kEmptyChipSize, kEmptyChipSize); title_chip_->SetBackground( - views::CreateRoundedRectBackground(data->color(), kEmptyChipSize / 2)); + views::CreateRoundedRectBackground(color, kEmptyChipSize / 2)); } else { // If the title is set, the chip is a rounded rect that matches the active // tab shape, particularly the tab's corner radius. title_->SetVisible(true); - title_->SetEnabledColor( - color_utils::GetColorWithMaxContrast(data->color())); - title_->SetText(data->title()); + title_->SetEnabledColor(color_utils::GetColorWithMaxContrast(color)); + title_->SetText(title); // Set the radius such that the chip nestles snugly against the tab corner // radius, taking into account the group underline stroke. @@ -200,7 +207,7 @@ text_width + 2 * text_horizontal_inset, text_height + 2 * text_vertical_inset); title_chip_->SetBackground( - views::CreateRoundedRectBackground(data->color(), corner_radius)); + views::CreateRoundedRectBackground(color, corner_radius)); title_->SetBounds(text_horizontal_inset, text_vertical_inset, text_width, text_height);
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.h b/chrome/browser/ui/views/tabs/tab_group_header.h index 56a0c59..6be00fb 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.h +++ b/chrome/browser/ui/views/tabs/tab_group_header.h
@@ -31,6 +31,7 @@ void OnMouseReleased(const ui::MouseEvent& event) override; void OnMouseEntered(const ui::MouseEvent& event) override; void OnGestureEvent(ui::GestureEvent* event) override; + void OnThemeChanged() override; TabSlotView::ViewType GetTabSlotViewType() const override; TabSizeInfo GetTabSizeInfo() const override;
diff --git a/chrome/browser/ui/views/tabs/tab_group_views.cc b/chrome/browser/ui/views/tabs/tab_group_views.cc index 397ce69c..446c05e 100644 --- a/chrome/browser/ui/views/tabs/tab_group_views.cc +++ b/chrome/browser/ui/views/tabs/tab_group_views.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/views/tabs/tab_strip.h" #include "chrome/browser/ui/views/tabs/tab_strip_controller.h" #include "chrome/browser/ui/views/tabs/tab_strip_types.h" +#include "components/tab_groups/tab_group_color.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/geometry/rect.h" @@ -71,10 +72,9 @@ } SkColor TabGroupViews::GetGroupColor() const { - const tab_groups::TabGroupVisualData* data = - tab_strip_->controller()->GetVisualDataForGroup(group_); - - return data->color(); + const tab_groups::TabGroupColorId color_id = + tab_strip_->controller()->GetGroupColorId(group_); + return tab_strip_->GetPaintedGroupColor(color_id); } SkColor TabGroupViews::GetTabBackgroundColor() const {
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 991b47f..f3a0e32 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -54,6 +54,7 @@ #include "chrome/browser/ui/views/touch_uma/touch_uma.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" #include "third_party/skia/include/core/SkColorFilter.h" @@ -1919,9 +1920,25 @@ return radial_highlight_opacity_; } -const tab_groups::TabGroupVisualData* TabStrip::GetVisualDataForGroup( +base::string16 TabStrip::GetGroupTitle(tab_groups::TabGroupId group) const { + return controller_->GetGroupTitle(group); +} + +tab_groups::TabGroupColorId TabStrip::GetGroupColorId( tab_groups::TabGroupId group) const { - return controller_->GetVisualDataForGroup(group); + return controller_->GetGroupColorId(group); +} + +SkColor TabStrip::GetPaintedGroupColor( + tab_groups::TabGroupColorId color_id) const { + const tab_groups::TabGroupColor color_data = + tab_groups::GetTabGroupColorSet().at(color_id); + + const SkColor background = GetTabBackgroundColor( + TabActive::kInactive, BrowserFrameActiveState::kUseCurrent); + + return color_utils::IsDark(background) ? color_data.dark_theme_color + : color_data.light_theme_color; } void TabStrip::SetVisualDataForGroup(
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index 1b79e02..106bb025 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -29,6 +29,7 @@ #include "chrome/browser/ui/views/tabs/tab_group_header.h" #include "chrome/browser/ui/views/tabs/tab_group_views.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "components/tab_groups/tab_group_visual_data.h" #include "ui/base/material_design/material_design_controller.h" #include "ui/base/material_design/material_design_controller_observer.h" #include "ui/gfx/color_palette.h" @@ -177,9 +178,10 @@ // This should be called when a tab is added to or removed from a group. void OnGroupContentsChanged(tab_groups::TabGroupId group); - // Updates the group's tabs and header when its associated - // tab_groups::TabGroupVisualData changes. This should be called when the - // result of |TabStripController::GetVisualDataForGroup(group)| changes. + // Updates the group's tabs and header when its associated TabGroupVisualData + // changes. This should be called when the result of + // |TabStripController::GetGroupTitle(group)| or + // |TabStripController::GetGroupColorId(group)| changes. void OnGroupVisualsChanged(tab_groups::TabGroupId group); // Destroys the views associated with a recently deleted tab group. The @@ -303,8 +305,11 @@ gfx::Rect GetTabAnimationTargetBounds(const Tab* tab) override; float GetHoverOpacityForTab(float range_parameter) const override; float GetHoverOpacityForRadialHighlight() const override; - const tab_groups::TabGroupVisualData* GetVisualDataForGroup( + base::string16 GetGroupTitle(tab_groups::TabGroupId group) const override; + tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupId group) const override; + SkColor GetPaintedGroupColor( + tab_groups::TabGroupColorId color_id) const override; void SetVisualDataForGroup( tab_groups::TabGroupId group, tab_groups::TabGroupVisualData visual_data) override;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h index 728379b..1fbca576 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -11,6 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" #include "chrome/browser/ui/views/tabs/tab_strip_types.h" +#include "components/tab_groups/tab_group_color.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/base/ui_base_types.h" @@ -128,10 +129,14 @@ // to |index|. virtual void OnKeyboardFocusedTabChanged(base::Optional<int> index) = 0; - // Returns the tab_groups::TabGroupVisualData instance for the given |group|. - virtual const tab_groups::TabGroupVisualData* GetVisualDataForGroup( + // Returns the displayed title of the given |group|. + virtual base::string16 GetGroupTitle(tab_groups::TabGroupId group) const = 0; + + // Returns the color ID of the given |group|. + virtual tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupId group) const = 0; + // Sets the title and color ID of the given |group|. virtual void SetVisualDataForGroup( tab_groups::TabGroupId group, tab_groups::TabGroupVisualData visual_data) = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_style_views.cc b/chrome/browser/ui/views/tabs/tab_style_views.cc index bef69e1..233f2582 100644 --- a/chrome/browser/ui/views/tabs/tab_style_views.cc +++ b/chrome/browser/ui/views/tabs/tab_style_views.cc
@@ -727,8 +727,8 @@ } int GM2TabStyle::GetStrokeThickness(bool should_paint_as_active) const { - base::Optional<SkColor> group_color = tab_->GetGroupColor(); - if (group_color.has_value() && tab_->IsActive()) + base::Optional<tab_groups::TabGroupId> group = tab_->group(); + if (group.has_value() && tab_->IsActive()) return TabGroupUnderline::kStrokeThickness; if (tab_->IsActive() || should_paint_as_active)
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc index bd8b523..0b0009f7 100644 --- a/chrome/browser/ui/views/tabs/tab_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -120,9 +120,18 @@ } float GetHoverOpacityForRadialHighlight() const override { return 1.0f; } - const tab_groups::TabGroupVisualData* GetVisualDataForGroup( - tab_groups::TabGroupId group) const override { - return nullptr; + base::string16 GetGroupTitle(tab_groups::TabGroupId group_id) const override { + return base::string16(); + } + + tab_groups::TabGroupColorId GetGroupColorId( + tab_groups::TabGroupId group_id) const override { + return tab_groups::TabGroupColorId(); + } + + SkColor GetPaintedGroupColor( + tab_groups::TabGroupColorId color_id) const override { + return SkColor(); } void SetVisualDataForGroup(
diff --git a/chrome/browser/ui/webui/downloads/downloads_dom_handler_unittest.cc b/chrome/browser/ui/webui/downloads/downloads_dom_handler_unittest.cc index 8b9d499..dc5abb3 100644 --- a/chrome/browser/ui/webui/downloads/downloads_dom_handler_unittest.cc +++ b/chrome/browser/ui/webui/downloads/downloads_dom_handler_unittest.cc
@@ -15,7 +15,6 @@ #include "content/public/test/browser_task_environment.h" #include "content/public/test/mock_download_manager.h" #include "content/public/test/test_web_ui.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc index c8dc602..17d39b0 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc +++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -18,8 +18,6 @@ #include "base/values.h" #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" -#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" -#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -36,38 +34,13 @@ #include "components/search_engines/template_url.h" #include "content/public/browser/web_ui.h" #include "third_party/metrics_proto/omnibox_event.pb.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/image/image.h" using bookmarks::BookmarkModel; -using OmniboxPageImageCallback = - base::RepeatingCallback<void(const SkBitmap& bitmap)>; namespace { -using ImageReciever = std::function<void(std::string)>; - -class OmniboxPageImageObserver : public BitmapFetcherService::Observer { - public: - explicit OmniboxPageImageObserver(ImageReciever image_reciever) - : image_reciever_(image_reciever) {} - - void OnImageChanged(BitmapFetcherService::RequestId request_id, - const SkBitmap& bitmap) override { - auto data = gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes(); - std::string base_64; - base::Base64Encode(base::StringPiece(data->front_as<char>(), data->size()), - &base_64); - const char kDataUrlPrefix[] = "data:image/png;base64,"; - std::string data_url = GURL(kDataUrlPrefix + base_64).spec(); - image_reciever_(data_url); - } - - private: - const ImageReciever image_reciever_; - - DISALLOW_COPY_AND_ASSIGN(OmniboxPageImageObserver); -}; - std::string SuggestionAnswerTypeToString(int answer_type) { switch (answer_type) { case SuggestionAnswer::ANSWER_TYPE_INVALID: @@ -223,7 +196,10 @@ OmniboxPageHandler::OmniboxPageHandler( Profile* profile, mojo::PendingReceiver<mojom::OmniboxPageHandler> receiver) - : profile_(profile), receiver_(this, std::move(receiver)), observer_(this) { + : profile_(profile), + bitmap_fetcher_helper_(profile), + receiver_(this, std::move(receiver)), + observer_(this) { observer_.Add(OmniboxControllerEmitter::GetForBrowserContext(profile_)); ResetController(); } @@ -304,62 +280,28 @@ controller == controller_.get()); // Fill in image data - BitmapFetcherService* image_service = - BitmapFetcherServiceFactory::GetForBrowserContext(profile_); - if (!image_service) - return; for (std::string image_url : image_urls) { - const ImageReciever handleAnswerImageData = [this, - image_url](std::string data) { - page_->HandleAnswerImageData(image_url, data); - }; - if (!image_url.empty()) { - // TODO(jdonnelly, rhalavati, manukh): Create a helper function with - // Callback to create annotation and pass it to image_service, merging - // the annotations in omnibox_page_handler.cc, chrome_omnibox_client.cc, - // and chrome_autocomplete_provider_client.cc. - auto traffic_annotation = net::DefineNetworkTrafficAnnotation( - "omnibox_debug_results_change", R"( - semantics { - sender: "Omnibox" - description: - "Chromium provides answers in the suggestion list for " - "certain queries that user types in the omnibox. This request " - "retrieves a small image (for example, an icon illustrating " - "the current weather conditions) when this can add information " - "to an answer." - trigger: - "Change of results for the query typed by the user in the " - "omnibox." - data: - "The only data sent is the path to an image. No user data is " - "included, although some might be inferrable (e.g. whether the " - "weather is sunny or rainy in the user's current location) " - "from the name of the image in the path." - destination: WEBSITE - } - policy { - cookies_allowed: YES - cookies_store: "user" - setting: - "You can enable or disable this feature via 'Use a prediction " - "service to help complete searches and URLs typed in the " - "address bar.' in Chromium's settings under Advanced. The " - "feature is enabled by default." - chrome_policy { - SearchSuggestEnabled { - policy_options {mode: MANDATORY} - SearchSuggestEnabled: false - } - } - })"); - image_service->RequestImage( - GURL(image_url), new OmniboxPageImageObserver(handleAnswerImageData), - traffic_annotation); + if (image_url.empty()) { + continue; } + bitmap_fetcher_helper_.RequestImage( + GURL(image_url), + base::BindRepeating(&OmniboxPageHandler::OnBitmapFetched, + base::Unretained(this), image_url)); } } +void OmniboxPageHandler::OnBitmapFetched(const std::string& image_url, + const SkBitmap& bitmap) { + auto data = gfx::Image::CreateFrom1xBitmap(bitmap).As1xPNGBytes(); + std::string base_64; + base::Base64Encode(base::StringPiece(data->front_as<char>(), data->size()), + &base_64); + const char kDataUrlPrefix[] = "data:image/png;base64,"; + std::string data_url = GURL(kDataUrlPrefix + base_64).spec(); + page_->HandleAnswerImageData(image_url, data_url); +} + bool OmniboxPageHandler::LookupIsTypedHost(const base::string16& host, bool* is_typed_host) const { history::HistoryService* const history_service =
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h index c960ff02..6c994bbd 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h +++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
@@ -12,6 +12,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/time/time.h" +#include "chrome/browser/autocomplete/bitmap_fetcher_helper.h" #include "chrome/browser/ui/webui/omnibox/omnibox.mojom.h" #include "components/omnibox/browser/autocomplete_controller_delegate.h" #include "components/omnibox/browser/autocomplete_input.h" @@ -61,6 +62,8 @@ int32_t page_classification) override; private: + void OnBitmapFetched(const std::string& image_url, const SkBitmap& bitmap); + // Looks up whether the hostname is a typed host (i.e., has received // typed visits). Return true if the lookup succeeded; if so, the // value of |is_typed_host| is set appropriately. @@ -88,6 +91,8 @@ // The Profile* handed to us in our constructor. Profile* profile_; + BitmapFetcherHelper bitmap_fetcher_helper_; + mojo::Receiver<mojom::OmniboxPageHandler> receiver_; ScopedObserver<OmniboxControllerEmitter, OmniboxControllerEmitter::Observer>
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc index 802b528..70d59dd 100644 --- a/chrome/browser/ui/webui/settings/about_handler.cc +++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -340,12 +340,11 @@ os_with_linux_license); html_source->AddBoolean("aboutEnterpriseManaged", IsEnterpriseManaged()); - html_source->AddString( - "endOfLifeMessage", - l10n_util::GetStringFUTF16(IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE, - ui::GetChromeOSDeviceName())); - html_source->AddString("endOfLifeLearnMoreURL", - base::ASCIIToUTF16(chrome::kEolNotificationURL)); + html_source->AddString("endOfLifeMessage", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE, + ui::GetChromeOSDeviceName(), + base::ASCIIToUTF16(chrome::kEolNotificationURL))); #endif return new AboutHandler();
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc index 33fb0b0..2910da6 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
@@ -4,39 +4,17 @@ #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/base64.h" -#include "base/bind.h" #include "base/feature_list.h" -#include "base/metrics/histogram_functions.h" -#include "base/metrics/histogram_macros.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "base/values.h" -#include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/tabs/tab_menu_model.h" -#include "chrome/browser/ui/tabs/tab_network_state.h" -#include "chrome/browser/ui/tabs/tab_renderer_data.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" -#include "chrome/browser/ui/tabs/tab_utils.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/favicon_source.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h" #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_layout.h" -#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_metrics.h" #include "chrome/browser/ui/webui/theme_handler.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/webui_url_constants.h" @@ -45,589 +23,16 @@ #include "chrome/grit/tab_strip_resources_map.h" #include "components/favicon_base/favicon_url_parser.h" #include "components/strings/grit/components_strings.h" -#include "content/public/browser/favicon_status.h" #include "content/public/browser/host_zoom_map.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/url_data_source.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_message_handler.h" #include "content/public/common/url_constants.h" -#include "third_party/skia/include/core/SkImageEncoder.h" -#include "third_party/skia/include/core/SkStream.h" -#include "ui/base/accelerators/accelerator.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/models/simple_menu_model.h" #include "ui/base/theme_provider.h" #include "ui/gfx/color_utils.h" -#include "ui/gfx/geometry/point_conversions.h" #include "ui/resources/grit/webui_resources.h" -namespace { - -// Writes bytes to a std::vector that can be fetched. This is used to record the -// output of skia image encoding. -class BufferWStream : public SkWStream { - public: - BufferWStream() = default; - ~BufferWStream() override = default; - - // Returns the output buffer by moving. - std::vector<unsigned char> GetBuffer() { return std::move(result_); } - - // SkWStream: - bool write(const void* buffer, size_t size) override { - const unsigned char* bytes = reinterpret_cast<const unsigned char*>(buffer); - result_.insert(result_.end(), bytes, bytes + size); - return true; - } - - size_t bytesWritten() const override { return result_.size(); } - - private: - std::vector<unsigned char> result_; -}; - -std::string MakeDataURIForImage(base::span<const uint8_t> image_data, - base::StringPiece mime_subtype) { - std::string result = "data:image/"; - result.append(mime_subtype.begin(), mime_subtype.end()); - result += ";base64,"; - result += base::Base64Encode(image_data); - return result; -} - -std::string EncodePNGAndMakeDataURI(gfx::ImageSkia image, float scale_factor) { - const SkBitmap& bitmap = image.GetRepresentation(scale_factor).GetBitmap(); - BufferWStream stream; - const bool encoding_succeeded = - SkEncodeImage(&stream, bitmap, SkEncodedImageFormat::kPNG, 100); - DCHECK(encoding_succeeded); - return MakeDataURIForImage( - base::as_bytes(base::make_span(stream.GetBuffer())), "png"); -} - -class WebUIBackgroundMenuModel : public ui::SimpleMenuModel { - public: - explicit WebUIBackgroundMenuModel(ui::SimpleMenuModel::Delegate* delegate) - : ui::SimpleMenuModel(delegate) { - AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); - AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); - AddItemWithStringId(IDC_BOOKMARK_ALL_TABS, IDS_BOOKMARK_ALL_TABS); - } -}; - -class WebUIBackgroundContextMenu : public ui::SimpleMenuModel::Delegate, - public WebUIBackgroundMenuModel { - public: - WebUIBackgroundContextMenu( - Browser* browser, - const ui::AcceleratorProvider* accelerator_provider) - : WebUIBackgroundMenuModel(this), - browser_(browser), - accelerator_provider_(accelerator_provider) {} - ~WebUIBackgroundContextMenu() override = default; - - void ExecuteCommand(int command_id, int event_flags) override { - chrome::ExecuteCommand(browser_, command_id); - } - - bool GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) const override { - return accelerator_provider_->GetAcceleratorForCommandId(command_id, - accelerator); - } - - private: - Browser* const browser_; - const ui::AcceleratorProvider* const accelerator_provider_; -}; - -class WebUITabMenuModel : public ui::SimpleMenuModel { - public: - WebUITabMenuModel(ui::SimpleMenuModel::Delegate* delegate, - TabStripModel* tab_strip_model, - int tab_index) - : ui::SimpleMenuModel(delegate) { - AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); - AddSeparator(ui::NORMAL_SEPARATOR); - AddItemWithStringId(TabStripModel::CommandReload, IDS_TAB_CXMENU_RELOAD); - AddItemWithStringId(TabStripModel::CommandDuplicate, - IDS_TAB_CXMENU_DUPLICATE); - const int pin_str = tab_strip_model->WillContextMenuPin(tab_index) - ? IDS_TAB_CXMENU_PIN_TAB - : IDS_TAB_CXMENU_UNPIN_TAB; - AddItemWithStringId(TabStripModel::CommandTogglePinned, pin_str); - const int mute_str = chrome::IsSiteMuted(*tab_strip_model, tab_index) - ? IDS_TAB_CXMENU_SOUND_UNMUTE_SITE - : IDS_TAB_CXMENU_SOUND_MUTE_SITE; - AddItem(TabStripModel::CommandToggleSiteMuted, - l10n_util::GetPluralStringFUTF16(mute_str, 1)); - AddSeparator(ui::NORMAL_SEPARATOR); - AddItemWithStringId(TabStripModel::CommandCloseTab, - IDS_TAB_CXMENU_CLOSETAB); - AddItemWithStringId(TabStripModel::CommandCloseTabsToRight, - IDS_TAB_CXMENU_CLOSETABSTORIGHT); - } -}; - -class WebUITabContextMenu : public ui::SimpleMenuModel::Delegate, - public WebUITabMenuModel { - public: - WebUITabContextMenu(Browser* browser, - const ui::AcceleratorProvider* accelerator_provider, - int tab_index) - : WebUITabMenuModel(this, browser->tab_strip_model(), tab_index), - browser_(browser), - accelerator_provider_(accelerator_provider), - tab_index_(tab_index) {} - ~WebUITabContextMenu() override = default; - - void ExecuteCommand(int command_id, int event_flags) override { - DCHECK_LT(tab_index_, browser_->tab_strip_model()->count()); - if (command_id == IDC_NEW_TAB) { - chrome::NewTab(browser_); - UMA_HISTOGRAM_ENUMERATION("Tab.NewTab", - TabStripModel::NEW_TAB_CONTEXT_MENU, - TabStripModel::NEW_TAB_ENUM_COUNT); - return; - } - browser_->tab_strip_model()->ExecuteContextMenuCommand( - tab_index_, static_cast<TabStripModel::ContextMenuCommand>(command_id)); - } - - bool GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) const override { - int real_command = -1; - if (command_id == IDC_NEW_TAB) { - real_command = IDC_NEW_TAB; - } else { - TabStripModel::ContextMenuCommandToBrowserCommand(command_id, - &real_command); - } - - if (real_command != -1) { - return accelerator_provider_->GetAcceleratorForCommandId(real_command, - accelerator); - } else { - return false; - } - } - - private: - Browser* const browser_; - const ui::AcceleratorProvider* const accelerator_provider_; - const int tab_index_; -}; - -} // namespace - -class TabStripUIHandler : public content::WebUIMessageHandler, - public TabStripModelObserver { - public: - explicit TabStripUIHandler(Browser* browser, TabStripUI::Embedder* embedder) - : browser_(browser), - embedder_(embedder), - thumbnail_tracker_(base::Bind(&TabStripUIHandler::HandleThumbnailUpdate, - base::Unretained(this))) {} - ~TabStripUIHandler() override = default; - - void OnJavascriptAllowed() override { - browser_->tab_strip_model()->AddObserver(this); - } - - void NotifyLayoutChanged() { - if (!IsJavascriptAllowed()) - return; - FireWebUIListener("layout-changed", embedder_->GetLayout().AsDictionary()); - } - - void NotifyReceivedKeyboardFocus() { - if (!IsJavascriptAllowed()) - return; - FireWebUIListener("received-keyboard-focus"); - } - - // TabStripModelObserver: - void OnTabStripModelChanged( - TabStripModel* tab_strip_model, - const TabStripModelChange& change, - const TabStripSelectionChange& selection) override { - if (tab_strip_model->empty()) - return; - - switch (change.type()) { - case TabStripModelChange::kInserted: { - for (const auto& contents : change.GetInsert()->contents) { - FireWebUIListener("tab-created", - GetTabData(contents.contents, contents.index)); - } - break; - } - case TabStripModelChange::kRemoved: { - for (const auto& contents : change.GetRemove()->contents) { - FireWebUIListener("tab-removed", - base::Value(extensions::ExtensionTabUtil::GetTabId( - contents.contents))); - } - break; - } - case TabStripModelChange::kMoved: { - auto* move = change.GetMove(); - FireWebUIListener( - "tab-moved", - base::Value(extensions::ExtensionTabUtil::GetTabId(move->contents)), - base::Value(move->to_index)); - break; - } - case TabStripModelChange::kReplaced: { - auto* replace = change.GetReplace(); - FireWebUIListener("tab-replaced", - base::Value(extensions::ExtensionTabUtil::GetTabId( - replace->old_contents)), - base::Value(extensions::ExtensionTabUtil::GetTabId( - replace->new_contents))); - break; - } - case TabStripModelChange::kSelectionOnly: - // Multi-selection is not supported for touch. - break; - } - - if (selection.active_tab_changed()) { - content::WebContents* new_contents = selection.new_contents; - int index = selection.new_model.active(); - if (new_contents && index != TabStripModel::kNoTab) { - FireWebUIListener( - "tab-active-changed", - base::Value(extensions::ExtensionTabUtil::GetTabId(new_contents))); - } - } - } - - void TabChangedAt(content::WebContents* contents, - int index, - TabChangeType change_type) override { - FireWebUIListener("tab-updated", GetTabData(contents, index)); - } - - void TabPinnedStateChanged(TabStripModel* tab_strip_model, - content::WebContents* contents, - int index) override { - FireWebUIListener("tab-updated", GetTabData(contents, index)); - } - - void TabBlockedStateChanged(content::WebContents* contents, - int index) override { - FireWebUIListener("tab-updated", GetTabData(contents, index)); - } - - protected: - // content::WebUIMessageHandler: - void RegisterMessages() override { - web_ui()->RegisterMessageCallback( - "createNewTab", base::Bind(&TabStripUIHandler::HandleCreateNewTab, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "getTabs", - base::Bind(&TabStripUIHandler::HandleGetTabs, base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "getThemeColors", base::Bind(&TabStripUIHandler::HandleGetThemeColors, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "setThumbnailTracked", - base::Bind(&TabStripUIHandler::HandleSetThumbnailTracked, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "closeContainer", base::Bind(&TabStripUIHandler::HandleCloseContainer, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "showBackgroundContextMenu", - base::Bind(&TabStripUIHandler::HandleShowBackgroundContextMenu, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "showTabContextMenu", - base::Bind(&TabStripUIHandler::HandleShowTabContextMenu, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "getLayout", base::Bind(&TabStripUIHandler::HandleGetLayout, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "reportTabActivationDuration", - base::Bind(&TabStripUIHandler::HandleReportTabActivationDuration, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "reportTabDataReceivedDuration", - base::Bind(&TabStripUIHandler::HandleReportTabDataReceivedDuration, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "reportTabCreationDuration", - base::Bind(&TabStripUIHandler::HandleReportTabCreationDuration, - base::Unretained(this))); - } - - private: - void HandleCreateNewTab(const base::ListValue* args) { - chrome::ExecuteCommand(browser_, IDC_NEW_TAB); - } - - base::DictionaryValue GetTabData(content::WebContents* contents, int index) { - base::DictionaryValue tab_data; - - tab_data.SetBoolean("active", - browser_->tab_strip_model()->active_index() == index); - tab_data.SetInteger("id", extensions::ExtensionTabUtil::GetTabId(contents)); - tab_data.SetInteger("index", index); - - TabRendererData tab_renderer_data = - TabRendererData::FromTabInModel(browser_->tab_strip_model(), index); - tab_data.SetBoolean("pinned", tab_renderer_data.pinned); - tab_data.SetString("title", tab_renderer_data.title); - tab_data.SetString("url", tab_renderer_data.visible_url.GetContent()); - - if (!tab_renderer_data.favicon.isNull()) { - tab_data.SetString("favIconUrl", EncodePNGAndMakeDataURI( - tab_renderer_data.favicon, - web_ui()->GetDeviceScaleFactor())); - tab_data.SetBoolean("isDefaultFavicon", - tab_renderer_data.favicon.BackedBySameObjectAs( - favicon::GetDefaultFavicon().AsImageSkia())); - } else { - tab_data.SetBoolean("isDefaultFavicon", true); - } - tab_data.SetBoolean("showIcon", tab_renderer_data.show_icon); - tab_data.SetInteger("networkState", - static_cast<int>(tab_renderer_data.network_state)); - tab_data.SetBoolean("shouldHideThrobber", - tab_renderer_data.should_hide_throbber); - tab_data.SetBoolean("blocked", tab_renderer_data.blocked); - tab_data.SetBoolean("crashed", tab_renderer_data.IsCrashed()); - // TODO(johntlee): Add the rest of TabRendererData - - auto alert_states = std::make_unique<base::ListValue>(); - for (const auto alert_state : - chrome::GetTabAlertStatesForContents(contents)) { - alert_states->Append(static_cast<int>(alert_state)); - } - tab_data.SetList("alertStates", std::move(alert_states)); - - return tab_data; - } - - void HandleGetTabs(const base::ListValue* args) { - AllowJavascript(); - const base::Value& callback_id = args->GetList()[0]; - - base::ListValue tabs; - TabStripModel* tab_strip_model = browser_->tab_strip_model(); - for (int i = 0; i < tab_strip_model->count(); ++i) { - tabs.Append(GetTabData(tab_strip_model->GetWebContentsAt(i), i)); - } - ResolveJavascriptCallback(callback_id, tabs); - } - - void HandleGetThemeColors(const base::ListValue* args) { - AllowJavascript(); - const base::Value& callback_id = args->GetList()[0]; - - const ui::ThemeProvider& tp = - ThemeService::GetThemeProviderForProfile(browser_->profile()); - - // This should return an object of CSS variables to rgba values so that - // the WebUI can use the CSS variables to color the tab strip - base::DictionaryValue colors; - colors.SetString("--tabstrip-background-color", - color_utils::SkColorToRgbaString( - tp.GetColor(ThemeProperties::COLOR_FRAME))); - colors.SetString("--tabstrip-tab-background-color", - color_utils::SkColorToRgbaString( - tp.GetColor(ThemeProperties::COLOR_TOOLBAR))); - colors.SetString("--tabstrip-tab-text-color", - color_utils::SkColorToRgbaString( - tp.GetColor(ThemeProperties::COLOR_TAB_TEXT))); - colors.SetString("--tabstrip-tab-separator-color", - color_utils::SkColorToRgbaString(SkColorSetA( - tp.GetColor(ThemeProperties::COLOR_TAB_TEXT), - /* 16% opacity */ 0.16 * 255))); - - colors.SetString("--tabstrip-tab-loading-spinning-color", - color_utils::SkColorToRgbaString(tp.GetColor( - ThemeProperties::COLOR_TAB_THROBBER_SPINNING))); - colors.SetString("--tabstrip-tab-waiting-spinning-color", - color_utils::SkColorToRgbaString(tp.GetColor( - ThemeProperties::COLOR_TAB_THROBBER_WAITING))); - colors.SetString("--tabstrip-indicator-recording-color", - color_utils::SkColorToRgbaString(tp.GetColor( - ThemeProperties::COLOR_TAB_ALERT_RECORDING))); - colors.SetString("--tabstrip-indicator-pip-color", - color_utils::SkColorToRgbaString( - tp.GetColor(ThemeProperties::COLOR_TAB_PIP_PLAYING))); - colors.SetString("--tabstrip-indicator-capturing-color", - color_utils::SkColorToRgbaString(tp.GetColor( - ThemeProperties::COLOR_TAB_ALERT_CAPTURING))); - colors.SetString("--tabstrip-tab-blocked-color", - color_utils::SkColorToRgbaString( - ui::NativeTheme::GetInstanceForWeb()->GetSystemColor( - ui::NativeTheme::kColorId_ProminentButtonColor))); - colors.SetString("--tabstrip-focus-outline-color", - color_utils::SkColorToRgbaString( - ui::NativeTheme::GetInstanceForWeb()->GetSystemColor( - ui::NativeTheme::kColorId_FocusedBorderColor))); - - ResolveJavascriptCallback(callback_id, colors); - } - - void HandleCloseContainer(const base::ListValue* args) { - // We only autoclose for tab selection. - RecordTabStripUICloseHistogram(TabStripUICloseAction::kTabSelected); - DCHECK(embedder_); - embedder_->CloseContainer(); - } - - void HandleShowBackgroundContextMenu(const base::ListValue* args) { - gfx::PointF point; - { - double x = 0; - args->GetDouble(0, &x); - double y = 0; - args->GetDouble(1, &y); - point = gfx::PointF(x, y); - } - - DCHECK(embedder_); - embedder_->ShowContextMenuAtPoint( - gfx::ToRoundedPoint(point), - std::make_unique<WebUIBackgroundContextMenu>( - browser_, embedder_->GetAcceleratorProvider())); - } - - void HandleShowTabContextMenu(const base::ListValue* args) { - int tab_id = 0; - args->GetInteger(0, &tab_id); - - gfx::PointF point; - { - double x = 0; - args->GetDouble(1, &x); - double y = 0; - args->GetDouble(2, &y); - point = gfx::PointF(x, y); - } - - Browser* browser = nullptr; - int tab_index = -1; - const bool got_tab = extensions::ExtensionTabUtil::GetTabById( - tab_id, browser_->profile(), true /* include_incognito */, &browser, - nullptr, nullptr, &tab_index); - DCHECK(got_tab); - DCHECK_EQ(browser, browser_); - - DCHECK(embedder_); - embedder_->ShowContextMenuAtPoint( - gfx::ToRoundedPoint(point), - std::make_unique<WebUITabContextMenu>( - browser, embedder_->GetAcceleratorProvider(), tab_index)); - } - - void HandleGetLayout(const base::ListValue* args) { - AllowJavascript(); - const base::Value& callback_id = args->GetList()[0]; - - base::Value layout = embedder_->GetLayout().AsDictionary(); - ResolveJavascriptCallback(callback_id, layout); - } - - void HandleSetThumbnailTracked(const base::ListValue* args) { - AllowJavascript(); - - int tab_id = 0; - if (!args->GetInteger(0, &tab_id)) - return; - - const bool thumbnail_tracked = args->GetList()[1].GetBool(); - - content::WebContents* tab = nullptr; - if (!extensions::ExtensionTabUtil::GetTabById(tab_id, browser_->profile(), - true, &tab)) { - // ID didn't refer to a valid tab. - DVLOG(1) << "Invalid tab ID"; - return; - } - - if (thumbnail_tracked) - thumbnail_tracker_.AddTab(tab); - else - thumbnail_tracker_.RemoveTab(tab); - } - - void HandleReportTabActivationDuration(const base::ListValue* args) { - int duration_ms = 0; - args->GetInteger(0, &duration_ms); - UMA_HISTOGRAM_TIMES("WebUITabStrip.TabActivation", - base::TimeDelta::FromMilliseconds(duration_ms)); - } - - void HandleReportTabDataReceivedDuration(const base::ListValue* args) { - int tab_count = 0; - args->GetInteger(0, &tab_count); - int duration_ms = 0; - args->GetInteger(1, &duration_ms); - ReportTabDurationHistogram("TabDataReceived", tab_count, - base::TimeDelta::FromMilliseconds(duration_ms)); - } - - void HandleReportTabCreationDuration(const base::ListValue* args) { - int tab_count = 0; - args->GetInteger(0, &tab_count); - int duration_ms = 0; - args->GetInteger(1, &duration_ms); - ReportTabDurationHistogram("TabCreation", tab_count, - base::TimeDelta::FromMilliseconds(duration_ms)); - } - - // Callback passed to |thumbnail_tracker_|. Called when a tab's thumbnail - // changes, or when we start watching the tab. - void HandleThumbnailUpdate(content::WebContents* tab, - ThumbnailTracker::CompressedThumbnailData image) { - // Send base-64 encoded image to JS side. - std::string data_uri = - MakeDataURIForImage(base::make_span(image->data), "jpeg"); - - const int tab_id = extensions::ExtensionTabUtil::GetTabId(tab); - FireWebUIListener("tab-thumbnail-updated", base::Value(tab_id), - base::Value(data_uri)); - } - - // Reports a histogram using the format - // WebUITabStrip.|histogram_fragment|.[tab count bucket]. - void ReportTabDurationHistogram(const char* histogram_fragment, - int tab_count, - base::TimeDelta duration) { - if (tab_count <= 0) - return; - - // It isn't possible to report both a number of tabs and duration datapoint - // together in a histogram or to correlate two histograms together. As a - // result the histogram is manually bucketed. - const char* tab_count_bucket = "01_05"; - if (6 <= tab_count && tab_count <= 20) { - tab_count_bucket = "06_20"; - } else if (20 < tab_count) { - tab_count_bucket = "21_"; - } - - std::string histogram_name = base::JoinString( - {"WebUITabStrip", histogram_fragment, tab_count_bucket}, "."); - base::UmaHistogramTimes(histogram_name, duration); - } - - Browser* const browser_; - TabStripUI::Embedder* const embedder_; - - ThumbnailTracker thumbnail_tracker_; - - DISALLOW_COPY_AND_ASSIGN(TabStripUIHandler); -}; - TabStripUI::TabStripUI(content::WebUI* web_ui) : content::WebUIController(web_ui) { content::HostZoomMap::Get(web_ui->GetWebContents()->GetSiteInstance()) @@ -684,9 +89,9 @@ web_ui->AddMessageHandler(std::make_unique<ThemeHandler>()); } -TabStripUI::~TabStripUI() {} +TabStripUI::~TabStripUI() = default; -void TabStripUI::Initialize(Browser* browser, Embedder* embedder) { +void TabStripUI::Initialize(Browser* browser, TabStripUIEmbedder* embedder) { content::WebUI* const web_ui = TabStripUI::web_ui(); DCHECK_EQ(Profile::FromWebUI(web_ui), browser->profile()); auto handler = std::make_unique<TabStripUIHandler>(browser, embedder);
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h index f153e10..d9d9887 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
@@ -12,47 +12,20 @@ #include "content/public/browser/web_ui_controller.h" class Browser; +class TabStripUIEmbedder; class TabStripUIHandler; -struct TabStripUILayout; - -namespace gfx { -class Point; -} // namespace gfx - -namespace ui { -class AcceleratorProvider; -class MenuModel; -} // The WebUI version of the tab strip in the browser. It is currently only // supported on ChromeOS in tablet mode. class TabStripUI : public content::WebUIController { public: - // Interface to be implemented by the embedder. Provides native UI - // functionality such as showing context menus. - class Embedder { - public: - Embedder() = default; - virtual ~Embedder() {} - - virtual const ui::AcceleratorProvider* GetAcceleratorProvider() const = 0; - - virtual void CloseContainer() = 0; - - virtual void ShowContextMenuAtPoint( - gfx::Point point, - std::unique_ptr<ui::MenuModel> menu_model) = 0; - - virtual TabStripUILayout GetLayout() = 0; - }; - explicit TabStripUI(content::WebUI* web_ui); ~TabStripUI() override; // Initialize TabStripUI with its embedder and the Browser it's // running in. Must be called exactly once. The WebUI won't work until // this is called. - void Initialize(Browser* browser, Embedder* embedder); + void Initialize(Browser* browser, TabStripUIEmbedder* embedder); // The embedder should call this whenever the result of // Embedder::GetLayout() changes.
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc index f84486b..83c4f01 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h" #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_layout.h" #include "chrome/common/chrome_isolated_world_ids.h" #include "chrome/common/chrome_switches.h" @@ -24,6 +25,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/base/accelerators/accelerator.h" #include "ui/base/models/menu_model.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point_conversions.h" @@ -32,7 +34,7 @@ namespace { -class MockTabStripUIEmbedder : public TabStripUI::Embedder { +class MockTabStripUIEmbedder : public TabStripUIEmbedder { public: MOCK_CONST_METHOD0(GetAcceleratorProvider, const ui::AcceleratorProvider*()); MOCK_METHOD0(CloseContainer, void());
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h new file mode 100644 index 0000000..8b76bc73 --- /dev/null +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h
@@ -0,0 +1,31 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_ +#define CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_ + +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_layout.h" +#include "ui/base/accelerators/accelerator.h" +#include "ui/base/models/menu_model.h" +#include "ui/gfx/geometry/point.h" + +// Interface to be implemented by the embedder. Provides native UI +// functionality such as showing context menus. +class TabStripUIEmbedder { + public: + TabStripUIEmbedder() = default; + virtual ~TabStripUIEmbedder() = default; + + virtual const ui::AcceleratorProvider* GetAcceleratorProvider() const = 0; + + virtual void CloseContainer() = 0; + + virtual void ShowContextMenuAtPoint( + gfx::Point point, + std::unique_ptr<ui::MenuModel> menu_model) = 0; + + virtual TabStripUILayout GetLayout() = 0; +}; + +#endif // CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_EMBEDDER_H_
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc new file mode 100644 index 0000000..81d457d1 --- /dev/null +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
@@ -0,0 +1,591 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h" + +#include "base/base64.h" +#include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" +#include "chrome/app/chrome_command_ids.h" +#include "chrome/browser/extensions/extension_tab_util.h" +#include "chrome/browser/favicon/favicon_utils.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/themes/theme_properties.h" +#include "chrome/browser/themes/theme_service.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/tabs/tab_renderer_data.h" +#include "chrome/browser/ui/tabs/tab_utils.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_metrics.h" +#include "chrome/grit/generated_resources.h" +#include "third_party/skia/include/core/SkStream.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/models/simple_menu_model.h" +#include "ui/base/theme_provider.h" +#include "ui/gfx/color_utils.h" +#include "ui/gfx/geometry/point_conversions.h" + +namespace { + +// Writes bytes to a std::vector that can be fetched. This is used to record the +// output of skia image encoding. +class BufferWStream : public SkWStream { + public: + BufferWStream() = default; + ~BufferWStream() override = default; + + // Returns the output buffer by moving. + std::vector<unsigned char> GetBuffer() { return std::move(result_); } + + // SkWStream: + bool write(const void* buffer, size_t size) override { + const unsigned char* bytes = reinterpret_cast<const unsigned char*>(buffer); + result_.insert(result_.end(), bytes, bytes + size); + return true; + } + + size_t bytesWritten() const override { return result_.size(); } + + private: + std::vector<unsigned char> result_; +}; + +std::string MakeDataURIForImage(base::span<const uint8_t> image_data, + base::StringPiece mime_subtype) { + std::string result = "data:image/"; + result.append(mime_subtype.begin(), mime_subtype.end()); + result += ";base64,"; + result += base::Base64Encode(image_data); + return result; +} + +std::string EncodePNGAndMakeDataURI(gfx::ImageSkia image, float scale_factor) { + const SkBitmap& bitmap = image.GetRepresentation(scale_factor).GetBitmap(); + BufferWStream stream; + const bool encoding_succeeded = + SkEncodeImage(&stream, bitmap, SkEncodedImageFormat::kPNG, 100); + DCHECK(encoding_succeeded); + return MakeDataURIForImage( + base::as_bytes(base::make_span(stream.GetBuffer())), "png"); +} + +class WebUIBackgroundMenuModel : public ui::SimpleMenuModel { + public: + explicit WebUIBackgroundMenuModel(ui::SimpleMenuModel::Delegate* delegate) + : ui::SimpleMenuModel(delegate) { + AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); + AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); + AddItemWithStringId(IDC_BOOKMARK_ALL_TABS, IDS_BOOKMARK_ALL_TABS); + } +}; + +class WebUIBackgroundContextMenu : public ui::SimpleMenuModel::Delegate, + public WebUIBackgroundMenuModel { + public: + WebUIBackgroundContextMenu( + Browser* browser, + const ui::AcceleratorProvider* accelerator_provider) + : WebUIBackgroundMenuModel(this), + browser_(browser), + accelerator_provider_(accelerator_provider) {} + ~WebUIBackgroundContextMenu() override = default; + + void ExecuteCommand(int command_id, int event_flags) override { + chrome::ExecuteCommand(browser_, command_id); + } + + bool GetAcceleratorForCommandId(int command_id, + ui::Accelerator* accelerator) const override { + return accelerator_provider_->GetAcceleratorForCommandId(command_id, + accelerator); + } + + private: + Browser* const browser_; + const ui::AcceleratorProvider* const accelerator_provider_; +}; + +class WebUITabMenuModel : public ui::SimpleMenuModel { + public: + WebUITabMenuModel(ui::SimpleMenuModel::Delegate* delegate, + TabStripModel* tab_strip_model, + int tab_index) + : ui::SimpleMenuModel(delegate) { + AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); + AddSeparator(ui::NORMAL_SEPARATOR); + AddItemWithStringId(TabStripModel::CommandReload, IDS_TAB_CXMENU_RELOAD); + AddItemWithStringId(TabStripModel::CommandDuplicate, + IDS_TAB_CXMENU_DUPLICATE); + const int pin_str = tab_strip_model->WillContextMenuPin(tab_index) + ? IDS_TAB_CXMENU_PIN_TAB + : IDS_TAB_CXMENU_UNPIN_TAB; + AddItemWithStringId(TabStripModel::CommandTogglePinned, pin_str); + const int mute_str = chrome::IsSiteMuted(*tab_strip_model, tab_index) + ? IDS_TAB_CXMENU_SOUND_UNMUTE_SITE + : IDS_TAB_CXMENU_SOUND_MUTE_SITE; + AddItem(TabStripModel::CommandToggleSiteMuted, + l10n_util::GetPluralStringFUTF16(mute_str, 1)); + AddSeparator(ui::NORMAL_SEPARATOR); + AddItemWithStringId(TabStripModel::CommandCloseTab, + IDS_TAB_CXMENU_CLOSETAB); + AddItemWithStringId(TabStripModel::CommandCloseTabsToRight, + IDS_TAB_CXMENU_CLOSETABSTORIGHT); + } +}; + +class WebUITabContextMenu : public ui::SimpleMenuModel::Delegate, + public WebUITabMenuModel { + public: + WebUITabContextMenu(Browser* browser, + const ui::AcceleratorProvider* accelerator_provider, + int tab_index) + : WebUITabMenuModel(this, browser->tab_strip_model(), tab_index), + browser_(browser), + accelerator_provider_(accelerator_provider), + tab_index_(tab_index) {} + ~WebUITabContextMenu() override = default; + + void ExecuteCommand(int command_id, int event_flags) override { + DCHECK_LT(tab_index_, browser_->tab_strip_model()->count()); + if (command_id == IDC_NEW_TAB) { + chrome::NewTab(browser_); + UMA_HISTOGRAM_ENUMERATION("Tab.NewTab", + TabStripModel::NEW_TAB_CONTEXT_MENU, + TabStripModel::NEW_TAB_ENUM_COUNT); + return; + } + browser_->tab_strip_model()->ExecuteContextMenuCommand( + tab_index_, static_cast<TabStripModel::ContextMenuCommand>(command_id)); + } + + bool GetAcceleratorForCommandId(int command_id, + ui::Accelerator* accelerator) const override { + int real_command = -1; + if (command_id == IDC_NEW_TAB) { + real_command = IDC_NEW_TAB; + } else { + TabStripModel::ContextMenuCommandToBrowserCommand(command_id, + &real_command); + } + + if (real_command != -1) { + return accelerator_provider_->GetAcceleratorForCommandId(real_command, + accelerator); + } else { + return false; + } + } + + private: + Browser* const browser_; + const ui::AcceleratorProvider* const accelerator_provider_; + const int tab_index_; +}; + +} // namespace + +TabStripUIHandler::TabStripUIHandler(Browser* browser, + TabStripUIEmbedder* embedder) + : browser_(browser), + embedder_(embedder), + thumbnail_tracker_(base::Bind(&TabStripUIHandler::HandleThumbnailUpdate, + base::Unretained(this))) {} +TabStripUIHandler::~TabStripUIHandler() = default; + +void TabStripUIHandler::NotifyLayoutChanged() { + if (!IsJavascriptAllowed()) + return; + FireWebUIListener("layout-changed", embedder_->GetLayout().AsDictionary()); +} + +void TabStripUIHandler::NotifyReceivedKeyboardFocus() { + if (!IsJavascriptAllowed()) + return; + FireWebUIListener("received-keyboard-focus"); +} + +// content::WebUIMessageHandler: +void TabStripUIHandler::OnJavascriptAllowed() { + browser_->tab_strip_model()->AddObserver(this); +} + +// TabStripModelObserver: +void TabStripUIHandler::OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) { + if (tab_strip_model->empty()) + return; + + switch (change.type()) { + case TabStripModelChange::kInserted: { + for (const auto& contents : change.GetInsert()->contents) { + FireWebUIListener("tab-created", + GetTabData(contents.contents, contents.index)); + } + break; + } + case TabStripModelChange::kRemoved: { + for (const auto& contents : change.GetRemove()->contents) { + FireWebUIListener("tab-removed", + base::Value(extensions::ExtensionTabUtil::GetTabId( + contents.contents))); + } + break; + } + case TabStripModelChange::kMoved: { + auto* move = change.GetMove(); + FireWebUIListener( + "tab-moved", + base::Value(extensions::ExtensionTabUtil::GetTabId(move->contents)), + base::Value(move->to_index)); + break; + } + case TabStripModelChange::kReplaced: { + auto* replace = change.GetReplace(); + FireWebUIListener("tab-replaced", + base::Value(extensions::ExtensionTabUtil::GetTabId( + replace->old_contents)), + base::Value(extensions::ExtensionTabUtil::GetTabId( + replace->new_contents))); + break; + } + case TabStripModelChange::kSelectionOnly: + // Multi-selection is not supported for touch. + break; + } + + if (selection.active_tab_changed()) { + content::WebContents* new_contents = selection.new_contents; + int index = selection.new_model.active(); + if (new_contents && index != TabStripModel::kNoTab) { + FireWebUIListener( + "tab-active-changed", + base::Value(extensions::ExtensionTabUtil::GetTabId(new_contents))); + } + } +} + +void TabStripUIHandler::TabChangedAt(content::WebContents* contents, + int index, + TabChangeType change_type) { + FireWebUIListener("tab-updated", GetTabData(contents, index)); +} + +void TabStripUIHandler::TabPinnedStateChanged(TabStripModel* tab_strip_model, + content::WebContents* contents, + int index) { + FireWebUIListener("tab-updated", GetTabData(contents, index)); +} + +void TabStripUIHandler::TabBlockedStateChanged(content::WebContents* contents, + int index) { + FireWebUIListener("tab-updated", GetTabData(contents, index)); +} + +// content::WebUIMessageHandler: +void TabStripUIHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "createNewTab", base::Bind(&TabStripUIHandler::HandleCreateNewTab, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getTabs", + base::Bind(&TabStripUIHandler::HandleGetTabs, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getThemeColors", base::Bind(&TabStripUIHandler::HandleGetThemeColors, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "setThumbnailTracked", + base::Bind(&TabStripUIHandler::HandleSetThumbnailTracked, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "closeContainer", base::Bind(&TabStripUIHandler::HandleCloseContainer, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "showBackgroundContextMenu", + base::Bind(&TabStripUIHandler::HandleShowBackgroundContextMenu, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "showTabContextMenu", + base::Bind(&TabStripUIHandler::HandleShowTabContextMenu, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getLayout", + base::Bind(&TabStripUIHandler::HandleGetLayout, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "reportTabActivationDuration", + base::Bind(&TabStripUIHandler::HandleReportTabActivationDuration, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "reportTabDataReceivedDuration", + base::Bind(&TabStripUIHandler::HandleReportTabDataReceivedDuration, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "reportTabCreationDuration", + base::Bind(&TabStripUIHandler::HandleReportTabCreationDuration, + base::Unretained(this))); +} + +void TabStripUIHandler::HandleCreateNewTab(const base::ListValue* args) { + chrome::ExecuteCommand(browser_, IDC_NEW_TAB); +} + +base::DictionaryValue TabStripUIHandler::GetTabData( + content::WebContents* contents, + int index) { + base::DictionaryValue tab_data; + + tab_data.SetBoolean("active", + browser_->tab_strip_model()->active_index() == index); + tab_data.SetInteger("id", extensions::ExtensionTabUtil::GetTabId(contents)); + tab_data.SetInteger("index", index); + + TabRendererData tab_renderer_data = + TabRendererData::FromTabInModel(browser_->tab_strip_model(), index); + tab_data.SetBoolean("pinned", tab_renderer_data.pinned); + tab_data.SetString("title", tab_renderer_data.title); + tab_data.SetString("url", tab_renderer_data.visible_url.GetContent()); + + if (!tab_renderer_data.favicon.isNull()) { + tab_data.SetString("favIconUrl", EncodePNGAndMakeDataURI( + tab_renderer_data.favicon, + web_ui()->GetDeviceScaleFactor())); + tab_data.SetBoolean("isDefaultFavicon", + tab_renderer_data.favicon.BackedBySameObjectAs( + favicon::GetDefaultFavicon().AsImageSkia())); + } else { + tab_data.SetBoolean("isDefaultFavicon", true); + } + tab_data.SetBoolean("showIcon", tab_renderer_data.show_icon); + tab_data.SetInteger("networkState", + static_cast<int>(tab_renderer_data.network_state)); + tab_data.SetBoolean("shouldHideThrobber", + tab_renderer_data.should_hide_throbber); + tab_data.SetBoolean("blocked", tab_renderer_data.blocked); + tab_data.SetBoolean("crashed", tab_renderer_data.IsCrashed()); + // TODO(johntlee): Add the rest of TabRendererData + + auto alert_states = std::make_unique<base::ListValue>(); + for (const auto alert_state : + chrome::GetTabAlertStatesForContents(contents)) { + alert_states->Append(static_cast<int>(alert_state)); + } + tab_data.SetList("alertStates", std::move(alert_states)); + + return tab_data; +} + +void TabStripUIHandler::HandleGetTabs(const base::ListValue* args) { + AllowJavascript(); + const base::Value& callback_id = args->GetList()[0]; + + base::ListValue tabs; + TabStripModel* tab_strip_model = browser_->tab_strip_model(); + for (int i = 0; i < tab_strip_model->count(); ++i) { + tabs.Append(GetTabData(tab_strip_model->GetWebContentsAt(i), i)); + } + ResolveJavascriptCallback(callback_id, tabs); +} + +void TabStripUIHandler::HandleGetThemeColors(const base::ListValue* args) { + AllowJavascript(); + const base::Value& callback_id = args->GetList()[0]; + + const ui::ThemeProvider& tp = + ThemeService::GetThemeProviderForProfile(browser_->profile()); + + // This should return an object of CSS variables to rgba values so that + // the WebUI can use the CSS variables to color the tab strip + base::DictionaryValue colors; + colors.SetString("--tabstrip-background-color", + color_utils::SkColorToRgbaString( + tp.GetColor(ThemeProperties::COLOR_FRAME))); + colors.SetString("--tabstrip-tab-background-color", + color_utils::SkColorToRgbaString( + tp.GetColor(ThemeProperties::COLOR_TOOLBAR))); + colors.SetString("--tabstrip-tab-text-color", + color_utils::SkColorToRgbaString( + tp.GetColor(ThemeProperties::COLOR_TAB_TEXT))); + colors.SetString("--tabstrip-tab-separator-color", + color_utils::SkColorToRgbaString( + SkColorSetA(tp.GetColor(ThemeProperties::COLOR_TAB_TEXT), + /* 16% opacity */ 0.16 * 255))); + + colors.SetString("--tabstrip-tab-loading-spinning-color", + color_utils::SkColorToRgbaString(tp.GetColor( + ThemeProperties::COLOR_TAB_THROBBER_SPINNING))); + colors.SetString("--tabstrip-tab-waiting-spinning-color", + color_utils::SkColorToRgbaString(tp.GetColor( + ThemeProperties::COLOR_TAB_THROBBER_WAITING))); + colors.SetString("--tabstrip-indicator-recording-color", + color_utils::SkColorToRgbaString(tp.GetColor( + ThemeProperties::COLOR_TAB_ALERT_RECORDING))); + colors.SetString("--tabstrip-indicator-pip-color", + color_utils::SkColorToRgbaString( + tp.GetColor(ThemeProperties::COLOR_TAB_PIP_PLAYING))); + colors.SetString("--tabstrip-indicator-capturing-color", + color_utils::SkColorToRgbaString(tp.GetColor( + ThemeProperties::COLOR_TAB_ALERT_CAPTURING))); + colors.SetString("--tabstrip-tab-blocked-color", + color_utils::SkColorToRgbaString( + ui::NativeTheme::GetInstanceForWeb()->GetSystemColor( + ui::NativeTheme::kColorId_ProminentButtonColor))); + colors.SetString("--tabstrip-focus-outline-color", + color_utils::SkColorToRgbaString( + ui::NativeTheme::GetInstanceForWeb()->GetSystemColor( + ui::NativeTheme::kColorId_FocusedBorderColor))); + + ResolveJavascriptCallback(callback_id, colors); +} + +void TabStripUIHandler::HandleCloseContainer(const base::ListValue* args) { + // We only autoclose for tab selection. + RecordTabStripUICloseHistogram(TabStripUICloseAction::kTabSelected); + DCHECK(embedder_); + embedder_->CloseContainer(); +} + +void TabStripUIHandler::HandleShowBackgroundContextMenu( + const base::ListValue* args) { + gfx::PointF point; + { + double x = 0; + args->GetDouble(0, &x); + double y = 0; + args->GetDouble(1, &y); + point = gfx::PointF(x, y); + } + + DCHECK(embedder_); + embedder_->ShowContextMenuAtPoint( + gfx::ToRoundedPoint(point), + std::make_unique<WebUIBackgroundContextMenu>( + browser_, embedder_->GetAcceleratorProvider())); +} + +void TabStripUIHandler::HandleShowTabContextMenu(const base::ListValue* args) { + int tab_id = 0; + args->GetInteger(0, &tab_id); + + gfx::PointF point; + { + double x = 0; + args->GetDouble(1, &x); + double y = 0; + args->GetDouble(2, &y); + point = gfx::PointF(x, y); + } + + Browser* browser = nullptr; + int tab_index = -1; + const bool got_tab = extensions::ExtensionTabUtil::GetTabById( + tab_id, browser_->profile(), true /* include_incognito */, &browser, + nullptr, nullptr, &tab_index); + DCHECK(got_tab); + DCHECK_EQ(browser, browser_); + + DCHECK(embedder_); + embedder_->ShowContextMenuAtPoint( + gfx::ToRoundedPoint(point), + std::make_unique<WebUITabContextMenu>( + browser, embedder_->GetAcceleratorProvider(), tab_index)); +} + +void TabStripUIHandler::HandleGetLayout(const base::ListValue* args) { + AllowJavascript(); + const base::Value& callback_id = args->GetList()[0]; + + base::Value layout = embedder_->GetLayout().AsDictionary(); + ResolveJavascriptCallback(callback_id, layout); +} + +void TabStripUIHandler::HandleSetThumbnailTracked(const base::ListValue* args) { + AllowJavascript(); + + int tab_id = 0; + if (!args->GetInteger(0, &tab_id)) + return; + + const bool thumbnail_tracked = args->GetList()[1].GetBool(); + + content::WebContents* tab = nullptr; + if (!extensions::ExtensionTabUtil::GetTabById(tab_id, browser_->profile(), + true, &tab)) { + // ID didn't refer to a valid tab. + DVLOG(1) << "Invalid tab ID"; + return; + } + + if (thumbnail_tracked) + thumbnail_tracker_.AddTab(tab); + else + thumbnail_tracker_.RemoveTab(tab); +} + +void TabStripUIHandler::HandleReportTabActivationDuration( + const base::ListValue* args) { + int duration_ms = 0; + args->GetInteger(0, &duration_ms); + UMA_HISTOGRAM_TIMES("WebUITabStrip.TabActivation", + base::TimeDelta::FromMilliseconds(duration_ms)); +} + +void TabStripUIHandler::HandleReportTabDataReceivedDuration( + const base::ListValue* args) { + int tab_count = 0; + args->GetInteger(0, &tab_count); + int duration_ms = 0; + args->GetInteger(1, &duration_ms); + ReportTabDurationHistogram("TabDataReceived", tab_count, + base::TimeDelta::FromMilliseconds(duration_ms)); +} + +void TabStripUIHandler::HandleReportTabCreationDuration( + const base::ListValue* args) { + int tab_count = 0; + args->GetInteger(0, &tab_count); + int duration_ms = 0; + args->GetInteger(1, &duration_ms); + ReportTabDurationHistogram("TabCreation", tab_count, + base::TimeDelta::FromMilliseconds(duration_ms)); +} + +// Callback passed to |thumbnail_tracker_|. Called when a tab's thumbnail +// changes, or when we start watching the tab. +void TabStripUIHandler::HandleThumbnailUpdate( + content::WebContents* tab, + ThumbnailTracker::CompressedThumbnailData image) { + // Send base-64 encoded image to JS side. + std::string data_uri = + MakeDataURIForImage(base::make_span(image->data), "jpeg"); + + const int tab_id = extensions::ExtensionTabUtil::GetTabId(tab); + FireWebUIListener("tab-thumbnail-updated", base::Value(tab_id), + base::Value(data_uri)); +} + +// Reports a histogram using the format +// WebUITabStrip.|histogram_fragment|.[tab count bucket]. +void TabStripUIHandler::ReportTabDurationHistogram( + const char* histogram_fragment, + int tab_count, + base::TimeDelta duration) { + if (tab_count <= 0) + return; + + // It isn't possible to report both a number of tabs and duration datapoint + // together in a histogram or to correlate two histograms together. As a + // result the histogram is manually bucketed. + const char* tab_count_bucket = "01_05"; + if (6 <= tab_count && tab_count <= 20) { + tab_count_bucket = "06_20"; + } else if (20 < tab_count) { + tab_count_bucket = "21_"; + } + + std::string histogram_name = base::JoinString( + {"WebUITabStrip", histogram_fragment, tab_count_bucket}, "."); + base::UmaHistogramTimes(histogram_name, duration); +}
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h new file mode 100644 index 0000000..a667b6dbb --- /dev/null +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.h
@@ -0,0 +1,73 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_HANDLER_H_ + +#include "base/macros.h" +#include "base/values.h" +#include "chrome/browser/ui/tabs/tab_change_type.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" +#include "chrome/browser/ui/webui/tab_strip/thumbnail_tracker.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui_message_handler.h" + +class Browser; +class TabStripUIEmbedder; + +class TabStripUIHandler : public content::WebUIMessageHandler, + public TabStripModelObserver { + public: + explicit TabStripUIHandler(Browser* browser, TabStripUIEmbedder* embedder); + ~TabStripUIHandler() override; + + void NotifyLayoutChanged(); + void NotifyReceivedKeyboardFocus(); + + // TabStripModelObserver: + void OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) override; + void TabChangedAt(content::WebContents* contents, + int index, + TabChangeType change_type) override; + void TabPinnedStateChanged(TabStripModel* tab_strip_model, + content::WebContents* contents, + int index) override; + void TabBlockedStateChanged(content::WebContents* contents, + int index) override; + + protected: + // content::WebUIMessageHandler: + void OnJavascriptAllowed() override; + void RegisterMessages() override; + + private: + void HandleCreateNewTab(const base::ListValue* args); + base::DictionaryValue GetTabData(content::WebContents* contents, int index); + void HandleGetTabs(const base::ListValue* args); + void HandleGetThemeColors(const base::ListValue* args); + void HandleCloseContainer(const base::ListValue* args); + void HandleShowBackgroundContextMenu(const base::ListValue* args); + void HandleShowTabContextMenu(const base::ListValue* args); + void HandleGetLayout(const base::ListValue* args); + void HandleSetThumbnailTracked(const base::ListValue* args); + void HandleReportTabActivationDuration(const base::ListValue* args); + void HandleReportTabDataReceivedDuration(const base::ListValue* args); + void HandleReportTabCreationDuration(const base::ListValue* args); + void HandleThumbnailUpdate(content::WebContents* tab, + ThumbnailTracker::CompressedThumbnailData image); + void ReportTabDurationHistogram(const char* histogram_fragment, + int tab_count, + base::TimeDelta duration); + + Browser* const browser_; + TabStripUIEmbedder* const embedder_; + ThumbnailTracker thumbnail_tracker_; + + DISALLOW_COPY_AND_ASSIGN(TabStripUIHandler); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_HANDLER_H_
diff --git a/chrome/browser/ui/webui/web_ui_test_handler.h b/chrome/browser/ui/webui/web_ui_test_handler.h index c91a2e6..88ff078 100644 --- a/chrome/browser/ui/webui/web_ui_test_handler.h +++ b/chrome/browser/ui/webui/web_ui_test_handler.h
@@ -10,7 +10,6 @@ #include "base/strings/string16.h" #include "chrome/test/data/webui/web_ui_test.mojom.h" #include "content/public/browser/web_ui_message_handler.h" -#include "mojo/public/cpp/bindings/binding.h" namespace base { class Value;
diff --git a/chrome/browser/util/BUILD.gn b/chrome/browser/util/BUILD.gn index 8fb19aa..b6e8194 100644 --- a/chrome/browser/util/BUILD.gn +++ b/chrome/browser/util/BUILD.gn
@@ -5,7 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { - java_files = [ + sources = [ "android/java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java", "android/java/src/org/chromium/chrome/browser/util/AndroidTaskUtils.java", "android/java/src/org/chromium/chrome/browser/util/BitmapCache.java", @@ -43,7 +43,7 @@ android_library("javatests") { testonly = true - java_files = [ + sources = [ "android/java/src/org/chromium/chrome/browser/util/ChromeFileProviderTest.java", "android/java/src/org/chromium/chrome/browser/util/HashUtilTest.java", "android/java/src/org/chromium/chrome/browser/util/UrlUtilitiesTest.java",
diff --git a/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc b/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc index 1cdce75..9ee8d4d6 100644 --- a/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc +++ b/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc
@@ -50,7 +50,6 @@ #include "chrome/chrome_cleaner/test/test_settings_util.h" #include "chrome/chrome_cleaner/ui/silent_main_dialog.h" #include "chrome/chrome_cleaner/zip_archiver/zip_archiver.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/message_pipe.h" #include "sandbox/win/src/sandbox_factory.h" #include "testing/multiprocess_func_list.h"
diff --git a/chrome/common/extensions/api/printing.idl b/chrome/common/extensions/api/printing.idl index bbcb971..9fdbc4e 100644 --- a/chrome/common/extensions/api/printing.idl +++ b/chrome/common/extensions/api/printing.idl
@@ -48,6 +48,52 @@ long? recentlyUsedRank; }; + // The status of the printer. + enum PrinterStatus { + // The door of the printer is open. Printer still accepts print jobs. + DOOR_OPEN, + + // The tray of the printer is missing. Printer still accepts print jobs. + TRAY_MISSING, + + // The printer is out of ink. Printer still accepts print jobs. + OUT_OF_INK, + + // The printer is out of paper. Printer still accepts print jobs. + OUT_OF_PAPER, + + // The output area of the printer (e.g. tray) is full. Printer still accepts + // print jobs. + OUTPUT_FULL, + + // The printer has a paper jam. Printer still accepts print jobs. + PAPER_JAM, + + // Some generic issue. Printer still accepts print jobs. + GENERIC_ISSUE, + + // The printer is stopped and doesn't print but still accepts print jobs. + STOPPED, + + // The printer is unreachable and doesn't accept print jobs. + UNREACHABLE, + + // The printer is available. + AVAILABLE + }; + + // Response for $(ref:getPrinterInfo) request. + dictionary GetPrinterInfoResponse { + // Printer capabilities in + // <a href="https://developers.google.com/cloud-print/docs/cdd#cdd"> + // CDD format</a>. + // The property may be missing. + object? capabilities; + + // The status of the printer. + PrinterStatus status; + }; + // Status of the print job. enum JobStatus { // Print job is received on Chrome side but was not processed yet. @@ -67,11 +113,20 @@ }; callback GetPrintersCallback = void(Printer[] printers); + callback GetPrinterInfoCallback = void(GetPrinterInfoResponse response); interface Functions { // Returns the list of available printers on the device. This includes // manually added, enterprise and discovered printers. static void getPrinters(GetPrintersCallback callback); + + // Returns the status and capabilities of the printer in + // <a href="https://developers.google.com/cloud-print/docs/cdd#cdd"> + // CDD format</a>. + // This call will fail with a runtime error if no printers with given id are + // installed. + static void getPrinterInfo(DOMString printerId, + GetPrinterInfoCallback callback); }; interface Events {
diff --git a/chrome/common/extensions/docs/templates/public/extensions/printingMetrics.html b/chrome/common/extensions/docs/templates/public/extensions/printingMetrics.html new file mode 100644 index 0000000..319fede --- /dev/null +++ b/chrome/common/extensions/docs/templates/public/extensions/printingMetrics.html
@@ -0,0 +1 @@ +{{+partials.standard_extensions_api api:apis.extensions.printingMetrics chrome_os_only:true/}}
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 0456139..ac2275e 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -1168,6 +1168,13 @@ const char kAccessibilityImageLabelsOptInAccepted[] = "settings.a11y.enable_accessibility_image_labels_opt_in_accepted"; +// Whether the Live Caption feature is enabled. +const char kLiveCaptionEnabled[] = + "accessibility.captions.live_caption_enabled"; + +// The file path of the SODA installation directory. +const char kSODAPath[] = "accessibility.captions.soda_path"; + #if defined(OS_MACOSX) // Boolean that indicates whether the application should show the info bar // asking the user to set up automatic updates when Keystone promotion is
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 6d4574005a..703ca3db 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -180,6 +180,8 @@ extern const char kAccessibilityCaptionsBackgroundColor[]; extern const char kAccessibilityCaptionsTextShadow[]; extern const char kAccessibilityCaptionsBackgroundOpacity[]; +extern const char kLiveCaptionEnabled[]; +extern const char kSODAPath[]; #if defined(OS_MACOSX) extern const char kConfirmToQuitEnabled[]; extern const char kShowFullscreenToolbar[];
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb index 0a47d77..b40664c 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb
@@ -25,7 +25,7 @@ <translation id="7209941495304122410">Insira a senha do Windows</translation> <translation id="7357241217513796177">Verifique se você tem uma conexão de rede e tente novamente.</translation> <translation id="7536769223115622137">Adicionar conta de trabalho</translation> -<translation id="7811865856574012727">O administrador restringiu o login no dispositivo para os seguintes domínios: <ph name="EMAIL_DOMAINS" />. Tente novamente usando uma conta de trabalho válida.</translation> +<translation id="7811865856574012727">O administrador restringiu o login no dispositivo aos seguintes domínios: <ph name="EMAIL_DOMAINS" />. Tente novamente usando uma conta de trabalho válida.</translation> <translation id="7856245195110636219">Não é possível continuar sem inserir a senha atual do Windows. Entre em contato com um administrador do sistema.</translation> <translation id="8639729688781680518">Esqueci minha senha do Windows</translation> <translation id="866458870819756755">Não foi possível criar um usuário.</translation>
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn index 8d4be35d4..c6d2f686 100644 --- a/chrome/renderer/BUILD.gn +++ b/chrome/renderer/BUILD.gn
@@ -2,12 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/buildflags_paint_preview.gni") import("//build/config/features.gni") import("//build/config/jumbo.gni") import("//chrome/common/features.gni") import("//components/nacl/features.gni") import("//components/offline_pages/buildflags/features.gni") -import("//components/paint_preview/buildflags/buildflags.gni") import("//components/spellcheck/spellcheck_build_features.gni") import("//extensions/buildflags/buildflags.gni") import("//media/media_options.gni")
diff --git a/chrome/renderer/chrome_render_thread_observer.h b/chrome/renderer/chrome_render_thread_observer.h index 4648fcac..732d7208 100644 --- a/chrome/renderer/chrome_render_thread_observer.h +++ b/chrome/renderer/chrome_render_thread_observer.h
@@ -20,7 +20,6 @@ #if defined(OS_CHROMEOS) #include "chrome/renderer/chromeos_delayed_callback_group.h" -#include "mojo/public/cpp/bindings/binding.h" #endif // defined(OS_CHROMEOS) namespace content {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index fd7ed1d..515704a8 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/allocator.gni") +import("//build/config/buildflags_paint_preview.gni") import("//build/config/chrome_build.gni") import("//build/config/compiler/compiler.gni") import("//build/config/crypto.gni") @@ -22,7 +23,6 @@ import("//components/nacl/features.gni") import("//components/offline_pages/buildflags/features.gni") import("//components/os_crypt/features.gni") -import("//components/paint_preview/buildflags/buildflags.gni") import("//components/signin/features.gni") import("//components/spellcheck/spellcheck_build_features.gni") import("//extensions/buildflags/buildflags.gni") @@ -2356,6 +2356,8 @@ "../browser/chromeos/printing/test_cups_print_job_manager.h", "../browser/chromeos/printing/test_cups_printers_manager.cc", "../browser/chromeos/printing/test_cups_printers_manager.h", + "../browser/chromeos/printing/test_printer_configurer.cc", + "../browser/chromeos/printing/test_printer_configurer.h", "../browser/chromeos/profiles/profile_helper_browsertest.cc", "../browser/chromeos/shutdown_policy_browsertest.cc", "../browser/chromeos/startup_settings_cache_browsertest.cc", @@ -2450,6 +2452,7 @@ if (use_cups) { sources += [ "../browser/chromeos/extensions/printing/printing_apitest.cc" ] + deps += [ "//printing:test_support" ] } if (enable_cros_libassistant) { sources += [ @@ -3067,6 +3070,7 @@ "../browser/component_updater/games_component_installer_unittest.cc", "../browser/component_updater/optimization_hints_component_installer_unittest.cc", "../browser/component_updater/origin_trials_component_installer_unittest.cc", + "../browser/component_updater/soda_component_installer_unittest.cc", "../browser/component_updater/subresource_filter_component_installer_unittest.cc", "../browser/component_updater/sw_reporter_installer_win_unittest.cc", "../browser/content_index/content_index_provider_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ApplicationTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ApplicationTestUtils.java index 1455589..c641211 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ApplicationTestUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ApplicationTestUtils.java
@@ -149,34 +149,25 @@ })); } - /** Finishes the given activity and waits for its onDestroy() to be called. */ - public static void finishActivity(final Activity activity) throws Exception { + /** Waits until the given activity transitions to the given state. */ + public static void waitForActivityState(Activity activity, @ActivityState int state) + throws Exception { final CallbackHelper callbackHelper = new CallbackHelper(); final ApplicationStatus.ActivityStateListener activityStateListener = - new ApplicationStatus.ActivityStateListener() { - @Override - public void onActivityStateChange(Activity activity, int newState) { - if (newState == ActivityState.DESTROYED) { - callbackHelper.notifyCalled(); - } - } - }; + (activity1, newState) -> { + if (newState == state) { + callbackHelper.notifyCalled(); + } + }; try { - boolean alreadyDestroyed = - TestThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() { - if (ApplicationStatus.getStateForActivity(activity) - == ActivityState.DESTROYED) { - return true; - } - ApplicationStatus.registerStateListenerForActivity( - activityStateListener, activity); - activity.finish(); - return false; - } - }); - if (!alreadyDestroyed) { + boolean correctState = TestThreadUtils.runOnUiThreadBlocking(() -> { + if (ApplicationStatus.getStateForActivity(activity) == state) { + return true; + } + ApplicationStatus.registerStateListenerForActivity(activityStateListener, activity); + return false; + }); + if (!correctState) { callbackHelper.waitForCallback(0); } } finally { @@ -184,6 +175,16 @@ } } + /** Finishes the given activity and waits for its onDestroy() to be called. */ + public static void finishActivity(final Activity activity) throws Exception { + TestThreadUtils.runOnUiThreadBlocking(() -> { + if (ApplicationStatus.getStateForActivity(activity) != ActivityState.DESTROYED) { + activity.finish(); + } + }); + waitForActivityState(activity, ActivityState.DESTROYED); + } + /** Finishes all tasks Chrome has listed in Android's Overview. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void finishAllChromeTasks(final Context context) {
diff --git a/chrome/test/data/extensions/api_test/printing/get_printer_info.html b/chrome/test/data/extensions/api_test/printing/get_printer_info.html new file mode 100644 index 0000000..e28c405 --- /dev/null +++ b/chrome/test/data/extensions/api_test/printing/get_printer_info.html
@@ -0,0 +1,6 @@ +<!-- + * Copyright 2019 The Chromium Authors. All rights reserved. Use of this source + * code is governed by a BSD-style license that can be found in the LICENSE + * file. +--> +<script src="get_printer_info.js"></script>
diff --git a/chrome/test/data/extensions/api_test/printing/get_printer_info.js b/chrome/test/data/extensions/api_test/printing/get_printer_info.js new file mode 100644 index 0000000..bcf5dde0 --- /dev/null +++ b/chrome/test/data/extensions/api_test/printing/get_printer_info.js
@@ -0,0 +1,22 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +chrome.test.runTests([() => { + chrome.printing.getPrinterInfo('id', response => { + chrome.test.assertTrue(response != undefined); + chrome.test.assertTrue(response.capabilities != undefined); + chrome.test.assertTrue(response.capabilities.printer != undefined); + let color = response.capabilities.printer.color; + chrome.test.assertTrue(color != undefined); + chrome.test.assertEq(1, color.option.length); + chrome.test.assertTrue(color.option[0] != undefined); + chrome.test.assertEq('STANDARD_MONOCHROME', color.option[0].type); + + chrome.test.assertTrue(response.status != undefined); + chrome.test.assertEq( + chrome.printing.PrinterStatus.UNREACHABLE, response.status); + + chrome.test.succeed(); + }); +}]);
diff --git a/chrome/test/data/webui/extensions/detail_view_test.js b/chrome/test/data/webui/extensions/detail_view_test.js index 9d43c48..4d15096 100644 --- a/chrome/test/data/webui/extensions/detail_view_test.js +++ b/chrome/test/data/webui/extensions/detail_view_test.js
@@ -63,7 +63,7 @@ const testIsVisible = isVisible.bind(null, item); expectTrue(testIsVisible('#closeButton')); expectTrue(testIsVisible('#icon')); - expectTrue(testIsVisible('#enable-toggle')); + expectTrue(testIsVisible('#enableToggle')); expectFalse(testIsVisible('#extensions-options')); expectTrue( item.$.description.textContent.indexOf('This is an extension') !== -1); @@ -168,11 +168,11 @@ flush(); expectTrue(testIsVisible('.warning-icon')); - expectTrue(testIsVisible('#enable-toggle')); + expectTrue(testIsVisible('#enableToggle')); expectFalse(testIsVisible('#terminated-reload-button')); item.set('data.state', chrome.developerPrivate.ExtensionState.TERMINATED); flush(); - expectFalse(testIsVisible('#enable-toggle')); + expectFalse(testIsVisible('#enableToggle')); expectTrue(testIsVisible('#terminated-reload-button')); // Ensure that the runtime warning reload button is not visible if there
diff --git a/chrome/test/data/webui/extensions/item_test.js b/chrome/test/data/webui/extensions/item_test.js index 6ccf944..c6de28e 100644 --- a/chrome/test/data/webui/extensions/item_test.js +++ b/chrome/test/data/webui/extensions/item_test.js
@@ -25,7 +25,7 @@ {selector: '#name', text: extensionData.name}, {selector: '#icon'}, {selector: '#description', text: extensionData.description}, - {selector: '#enable-toggle'}, + {selector: '#enableToggle'}, {selector: '#detailsButton'}, {selector: '#remove-button'}, ]; @@ -118,11 +118,11 @@ testNormalElementsAreVisible(item); testDeveloperElementsAreHidden(item); - expectTrue(item.$['enable-toggle'].checked); + expectTrue(item.$['enableToggle'].checked); item.set('data.state', 'DISABLED'); - expectFalse(item.$['enable-toggle'].checked); + expectFalse(item.$['enableToggle'].checked); item.set('data.state', 'BLACKLISTED'); - expectFalse(item.$['enable-toggle'].checked); + expectFalse(item.$['enableToggle'].checked); }); test( @@ -158,7 +158,7 @@ mockDelegate.testClickingCalls( item.$['remove-button'], 'deleteItem', [item.data.id]); mockDelegate.testClickingCalls( - item.$['enable-toggle'], 'setItemEnabled', [item.data.id, false]); + item.$['enableToggle'], 'setItemEnabled', [item.data.id, false]); mockDelegate.testClickingCalls( item.$$('#inspect-views a[is="action-link"]'), 'inspectItemView', [item.data.id, item.data.views[0]]); @@ -321,18 +321,18 @@ }); test(assert(extension_item_tests.TestNames.EnableToggle), function() { - expectFalse(item.$['enable-toggle'].disabled); + expectFalse(item.$['enableToggle'].disabled); // Test case where user does not have permission. item.set('data.userMayModify', false); flush(); - expectTrue(item.$['enable-toggle'].disabled); + expectTrue(item.$['enableToggle'].disabled); // Test case of a blacklisted extension. item.set('data.userMayModify', true); item.set('data.state', 'BLACKLISTED'); flush(); - expectTrue(item.$['enable-toggle'].disabled); + expectTrue(item.$['enableToggle'].disabled); }); test(assert(extension_item_tests.TestNames.RemoveButton), function() {
diff --git a/chrome/test/data/webui/settings/about_page_tests.js b/chrome/test/data/webui/settings/about_page_tests.js index 88a25c7..bc20f14 100644 --- a/chrome/test/data/webui/settings/about_page_tests.js +++ b/chrome/test/data/webui/settings/about_page_tests.js
@@ -36,17 +36,12 @@ aboutObsoleteNowOrSoon: false, aboutObsoleteEndOfTheLine: false, }); - if (cr.isChromeOS) { - loadTimeData.overrideValues({ - showOSSettings: true, - }); - } lifetimeBrowserProxy = new settings.TestLifetimeBrowserProxy(); settings.LifetimeBrowserProxyImpl.instance_ = lifetimeBrowserProxy; aboutBrowserProxy = new TestAboutPageBrowserProxy(); settings.AboutPageBrowserProxyImpl.instance_ = aboutBrowserProxy; - return initNewPage(true /* showOsSettings */); + return initNewPage(); }); teardown(function() { @@ -54,102 +49,88 @@ page = null; }); - /** - * TODO(aee): remove |showOsSettings| param after the SplitSettings - * feature tag is removed. - * @param {boolean=} showOsSettings - * @return {!Promise} - */ - function initNewPage(showOsSettings) { + /** @return {!Promise} */ + function initNewPage() { aboutBrowserProxy.reset(); lifetimeBrowserProxy.reset(); PolymerTest.clearBody(); - if (cr.isChromeOS) { - loadTimeData.overrideValues({showOSSettings: showOsSettings}); - } page = document.createElement('settings-about-page'); settings.navigateTo(settings.routes.ABOUT); document.body.appendChild(page); - if (!cr.isChromeOS) { - return aboutBrowserProxy.whenCalled('refreshUpdateStatus'); - } else if (showOsSettings) { - return Promise.all([ - aboutBrowserProxy.whenCalled('getChannelInfo'), - aboutBrowserProxy.whenCalled('refreshUpdateStatus'), - aboutBrowserProxy.whenCalled('refreshTPMFirmwareUpdateStatus'), - ]); - } + return cr.isChromeOS ? + Promise.resolve() : + aboutBrowserProxy.whenCalled('refreshUpdateStatus'); } - /** - * Test that the status icon and status message update according to - * incoming 'update-status-changed' events. - */ - test('IconAndMessageUpdates', function() { - const icon = page.$$('iron-icon'); - assertTrue(!!icon); - const statusMessageEl = page.$$('#updateStatusMessage div'); - let previousMessageText = statusMessageEl.textContent; - - fireStatusChanged(UpdateStatus.CHECKING); - assertEquals(SPINNER_ICON, icon.src); - assertEquals(null, icon.getAttribute('icon')); - assertNotEquals(previousMessageText, statusMessageEl.textContent); - previousMessageText = statusMessageEl.textContent; - - fireStatusChanged(UpdateStatus.UPDATING, {progress: 0}); - assertEquals(SPINNER_ICON, icon.src); - assertEquals(null, icon.getAttribute('icon')); - assertFalse(statusMessageEl.textContent.includes('%')); - assertNotEquals(previousMessageText, statusMessageEl.textContent); - previousMessageText = statusMessageEl.textContent; - - fireStatusChanged(UpdateStatus.UPDATING, {progress: 1}); - assertNotEquals(previousMessageText, statusMessageEl.textContent); - assertTrue(statusMessageEl.textContent.includes('%')); - previousMessageText = statusMessageEl.textContent; - - fireStatusChanged(UpdateStatus.NEARLY_UPDATED); - assertEquals(null, icon.src); - assertEquals('settings:check-circle', icon.icon); - assertNotEquals(previousMessageText, statusMessageEl.textContent); - previousMessageText = statusMessageEl.textContent; - - fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN); - assertEquals(null, icon.src); - assertEquals('cr20:domain', icon.icon); - assertEquals(0, statusMessageEl.textContent.trim().length); - - fireStatusChanged(UpdateStatus.FAILED); - assertEquals(null, icon.src); - assertEquals('cr:error', icon.icon); - assertEquals(0, statusMessageEl.textContent.trim().length); - - fireStatusChanged(UpdateStatus.DISABLED); - assertEquals(null, icon.src); - assertEquals(null, icon.getAttribute('icon')); - assertEquals(0, statusMessageEl.textContent.trim().length); - }); - - test('ErrorMessageWithHtml', function() { - const htmlError = 'hello<br>there<br>was<pre>an</pre>error'; - fireStatusChanged(UpdateStatus.FAILED, {message: htmlError}); - const statusMessageEl = page.$$('#updateStatusMessage div'); - assertEquals(htmlError, statusMessageEl.innerHTML); - }); - - test('FailedLearnMoreLink', function() { - // Check that link is shown when update failed. - fireStatusChanged(UpdateStatus.FAILED, {message: 'foo'}); - assertTrue(!!page.$$('#updateStatusMessage a:not([hidden])')); - - // Check that link is hidden when update hasn't failed. - fireStatusChanged(UpdateStatus.UPDATED, {message: ''}); - assertTrue(!!page.$$('#updateStatusMessage a[hidden]')); - }); - if (!cr.isChromeOS) { /** + * Test that the status icon and status message update according to + * incoming 'update-status-changed' events. + */ + test('IconAndMessageUpdates', function() { + const icon = page.$$('iron-icon'); + assertTrue(!!icon); + const statusMessageEl = page.$$('#updateStatusMessage div'); + let previousMessageText = statusMessageEl.textContent; + + fireStatusChanged(UpdateStatus.CHECKING); + assertEquals(SPINNER_ICON, icon.src); + assertEquals(null, icon.getAttribute('icon')); + assertNotEquals(previousMessageText, statusMessageEl.textContent); + previousMessageText = statusMessageEl.textContent; + + fireStatusChanged(UpdateStatus.UPDATING, {progress: 0}); + assertEquals(SPINNER_ICON, icon.src); + assertEquals(null, icon.getAttribute('icon')); + assertFalse(statusMessageEl.textContent.includes('%')); + assertNotEquals(previousMessageText, statusMessageEl.textContent); + previousMessageText = statusMessageEl.textContent; + + fireStatusChanged(UpdateStatus.UPDATING, {progress: 1}); + assertNotEquals(previousMessageText, statusMessageEl.textContent); + assertTrue(statusMessageEl.textContent.includes('%')); + previousMessageText = statusMessageEl.textContent; + + fireStatusChanged(UpdateStatus.NEARLY_UPDATED); + assertEquals(null, icon.src); + assertEquals('settings:check-circle', icon.icon); + assertNotEquals(previousMessageText, statusMessageEl.textContent); + previousMessageText = statusMessageEl.textContent; + + fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN); + assertEquals(null, icon.src); + assertEquals('cr20:domain', icon.icon); + assertEquals(0, statusMessageEl.textContent.trim().length); + + fireStatusChanged(UpdateStatus.FAILED); + assertEquals(null, icon.src); + assertEquals('cr:error', icon.icon); + assertEquals(0, statusMessageEl.textContent.trim().length); + + fireStatusChanged(UpdateStatus.DISABLED); + assertEquals(null, icon.src); + assertEquals(null, icon.getAttribute('icon')); + assertEquals(0, statusMessageEl.textContent.trim().length); + }); + + test('ErrorMessageWithHtml', function() { + const htmlError = 'hello<br>there<br>was<pre>an</pre>error'; + fireStatusChanged(UpdateStatus.FAILED, {message: htmlError}); + const statusMessageEl = page.$$('#updateStatusMessage div'); + assertEquals(htmlError, statusMessageEl.innerHTML); + }); + + test('FailedLearnMoreLink', function() { + // Check that link is shown when update failed. + fireStatusChanged(UpdateStatus.FAILED, {message: 'foo'}); + assertTrue(!!page.$$('#updateStatusMessage a:not([hidden])')); + + // Check that link is hidden when update hasn't failed. + fireStatusChanged(UpdateStatus.UPDATED, {message: ''}); + assertTrue(!!page.$$('#updateStatusMessage a[hidden]')); + }); + + /** * Test that when the current platform has been marked as deprecated * (but not end of the line) a deprecation warning message is displayed, * without interfering with the update status message and icon. @@ -160,7 +141,7 @@ aboutObsoleteEndOfTheLine: false, }); - await initNewPage(true /* showOsSettings */); + await initNewPage(); const icon = page.$$('iron-icon'); assertTrue(!!icon); assertTrue(!!page.$.updateStatusMessage); @@ -195,7 +176,7 @@ aboutObsoleteNowOrSoon: true, aboutObsoleteEndOfTheLine: true, }); - await initNewPage(true /* showOsSettings */); + await initNewPage(); const icon = page.$$('iron-icon'); assertTrue(!!icon); assertTrue(!!page.$.deprecationWarning); @@ -222,280 +203,21 @@ assertFalse(page.$.deprecationWarning.hidden); assertTrue(page.$.updateStatusMessage.hidden); }); - } - test('Relaunch', function() { - let relaunch = page.$.relaunch; - assertTrue(!!relaunch); - assertTrue(relaunch.hidden); - - fireStatusChanged(UpdateStatus.NEARLY_UPDATED); - assertFalse(relaunch.hidden); - - relaunch = page.$.relaunch; - assertTrue(!!relaunch); - relaunch.click(); - return lifetimeBrowserProxy.whenCalled('relaunch'); - }); - - if (cr.isChromeOS) { - test('NoInternet', function() { - assertTrue(page.$.updateStatusMessage.hidden); - aboutBrowserProxy.sendStatusNoInternet(); - Polymer.dom.flush(); - assertFalse(page.$.updateStatusMessage.hidden); - assertNotEquals( - page.$.updateStatusMessage.innerHTML.includes('no internet')); - }); - - /** - * Test that all buttons update according to incoming - * 'update-status-changed' events for the case where target and current - * channel are the same. - */ - test('ButtonsUpdate_SameChannel', function() { - const relaunch = page.$.relaunch; - const checkForUpdates = page.$.checkForUpdates; - const relaunchAndPowerwash = page.$.relaunchAndPowerwash; - + test('Relaunch', function() { + let relaunch = page.$.relaunch; assertTrue(!!relaunch); - assertTrue(!!relaunchAndPowerwash); - assertTrue(!!checkForUpdates); - - function assertAllHidden() { - assertTrue(checkForUpdates.hidden); - assertTrue(relaunch.hidden); - assertTrue(relaunchAndPowerwash.hidden); - // Ensure that when all buttons are hidden, the container is also - // hidden. - assertTrue(page.$.buttonContainer.hidden); - } - - // Check that |UPDATED| status is ignored if the user has not - // explicitly checked for updates yet. - fireStatusChanged(UpdateStatus.UPDATED); - assertFalse(checkForUpdates.hidden); assertTrue(relaunch.hidden); - assertTrue(relaunchAndPowerwash.hidden); - - // Check that the "Check for updates" button gets hidden for certain - // UpdateStatus values, even if the CHECKING state was never - // encountered (for example triggering update from crosh command - // line). - fireStatusChanged(UpdateStatus.UPDATING); - assertAllHidden(); - fireStatusChanged(UpdateStatus.NEARLY_UPDATED); - assertTrue(checkForUpdates.hidden); - assertFalse(relaunch.hidden); - assertTrue(relaunchAndPowerwash.hidden); - - fireStatusChanged(UpdateStatus.CHECKING); - assertAllHidden(); - - fireStatusChanged(UpdateStatus.UPDATING); - assertAllHidden(); fireStatusChanged(UpdateStatus.NEARLY_UPDATED); - assertTrue(checkForUpdates.hidden); assertFalse(relaunch.hidden); - assertTrue(relaunchAndPowerwash.hidden); - fireStatusChanged(UpdateStatus.UPDATED); - assertAllHidden(); - - fireStatusChanged(UpdateStatus.FAILED); - assertFalse(checkForUpdates.hidden); - assertTrue(relaunch.hidden); - assertTrue(relaunchAndPowerwash.hidden); - - fireStatusChanged(UpdateStatus.DISABLED); - assertAllHidden(); - - fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN); - assertAllHidden(); + relaunch = page.$.relaunch; + assertTrue(!!relaunch); + relaunch.click(); + return lifetimeBrowserProxy.whenCalled('relaunch'); }); - /** - * Test that buttons update according to incoming - * 'update-status-changed' events for the case where the target channel - * is more stable than current channel. - */ - test('ButtonsUpdate_BetaToStable', async () => { - aboutBrowserProxy.setChannels( - BrowserChannel.BETA, BrowserChannel.STABLE); - aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED); - - await initNewPage(true /* showOsSettings */); - assertTrue(!!page.$.relaunch); - assertTrue(!!page.$.relaunchAndPowerwash); - - assertTrue(page.$.relaunch.hidden); - assertFalse(page.$.relaunchAndPowerwash.hidden); - - page.$.relaunchAndPowerwash.click(); - assertFalse(await lifetimeBrowserProxy.whenCalled('factoryReset')); - }); - - /** - * Test that buttons update according to incoming - * 'update-status-changed' events for the case where the target channel - * is less stable than current channel. - */ - test('ButtonsUpdate_StableToBeta', async () => { - aboutBrowserProxy.setChannels( - BrowserChannel.STABLE, BrowserChannel.BETA); - aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED); - - await initNewPage(true /* showOsSettings */); - assertTrue(!!page.$.relaunch); - assertTrue(!!page.$.relaunchAndPowerwash); - - assertFalse(page.$.relaunch.hidden); - assertTrue(page.$.relaunchAndPowerwash.hidden); - - page.$.relaunch.click(); - await lifetimeBrowserProxy.whenCalled('relaunch'); - }); - - /** - * Test that buttons update as a result of receiving a - * 'target-channel-changed' event (normally fired from - * <settings-channel-switcher-dialog>). - */ - test('ButtonsUpdate_TargetChannelChangedEvent', async () => { - aboutBrowserProxy.setChannels( - BrowserChannel.BETA, BrowserChannel.BETA); - aboutBrowserProxy.setUpdateStatus(UpdateStatus.NEARLY_UPDATED); - - await initNewPage(true /* showOsSettings */); - assertFalse(page.$.relaunch.hidden); - assertTrue(page.$.relaunchAndPowerwash.hidden); - - page.fire('target-channel-changed', BrowserChannel.DEV); - assertFalse(page.$.relaunch.hidden); - assertTrue(page.$.relaunchAndPowerwash.hidden); - - page.fire('target-channel-changed', BrowserChannel.STABLE); - assertTrue(page.$.relaunch.hidden); - assertFalse(page.$.relaunchAndPowerwash.hidden); - }); - - test('RegulatoryInfo', async () => { - const regulatoryInfo = {text: 'foo', url: 'bar'}; - - /** - * Checks the visibility of the "regulatory info" section. - * @param {boolean} isShowing Whether the section is expected to be - * visible. - * @return {!Promise} - */ - async function checkRegulatoryInfo(isShowing) { - await aboutBrowserProxy.whenCalled('getRegulatoryInfo'); - const regulatoryInfoEl = page.$.regulatoryInfo; - assertTrue(!!regulatoryInfoEl); - assertEquals(isShowing, !regulatoryInfoEl.hidden); - - if (isShowing) { - const img = regulatoryInfoEl.querySelector('img'); - assertTrue(!!img); - assertEquals(regulatoryInfo.text, img.getAttribute('alt')); - assertEquals(regulatoryInfo.url, img.getAttribute('src')); - } - } - - await checkRegulatoryInfo(false); - aboutBrowserProxy.setRegulatoryInfo(regulatoryInfo); - await initNewPage(true /* showOsSettings */); - await checkRegulatoryInfo(true); - }); - - test('TPMFirmwareUpdate', async () => { - await initNewPage(true /* showOsSettings */); - assertTrue(page.$.aboutTPMFirmwareUpdate.hidden); - aboutBrowserProxy.setTPMFirmwareUpdateStatus({updateAvailable: true}); - aboutBrowserProxy.refreshTPMFirmwareUpdateStatus(); - assertFalse(page.$.aboutTPMFirmwareUpdate.hidden); - page.$.aboutTPMFirmwareUpdate.click(); - await test_util.flushTasks(); - const dialog = page.$$('settings-powerwash-dialog'); - assertTrue(!!dialog); - assertTrue(dialog.$.dialog.open); - dialog.$$('#powerwash').click(); - assertTrue(await lifetimeBrowserProxy.whenCalled('factoryReset')); - }); - - test('DeviceEndOfLife', async () => { - /** - * Checks the visibility of the end of life message and icon. - * @param {boolean} isShowing Whether the end of life UI is expected - * to be visible. - * @return {!Promise} - */ - async function checkHasEndOfLife(isShowing) { - await aboutBrowserProxy.whenCalled('getEndOfLifeInfo'); - const endOfLifeMessageContainer = page.$.endOfLifeMessageContainer; - assertTrue(!!endOfLifeMessageContainer); - assertEquals(isShowing, !endOfLifeMessageContainer.hidden); - - // Update status message should be hidden before user has - // checked for updates. - assertTrue(page.$.updateStatusMessage.hidden); - - fireStatusChanged(UpdateStatus.CHECKING); - assertEquals(isShowing, page.$.updateStatusMessage.hidden); - - if (isShowing) { - const icon = page.$$('iron-icon'); - assertTrue(!!icon); - assertEquals(null, icon.src); - assertEquals('os-settings:end-of-life', icon.icon); - - const checkForUpdates = page.$.checkForUpdates; - assertTrue(!!checkForUpdates); - assertTrue(checkForUpdates.hidden); - } - } - - // Force test proxy to not respond to JS requests. - // End of life message should still be hidden in this case. - aboutBrowserProxy.setEndOfLifeInfo( - new Promise(function(res, rej) {})); - await initNewPage(true /* showOsSettings */); - await checkHasEndOfLife(false); - aboutBrowserProxy.setEndOfLifeInfo({ - hasEndOfLife: true, - aboutPageEndOfLifeMessage: '', - }); - await initNewPage(true /* showOsSettings */); - await checkHasEndOfLife(true); - aboutBrowserProxy.setEndOfLifeInfo({ - hasEndOfLife: false, - aboutPageEndOfLifeMessage: '', - }); - await initNewPage(true /* showOsSettings */); - await checkHasEndOfLife(false); - }); - - test('showOsSettings=false, CrOS parts not visible', async () => { - aboutBrowserProxy.setEndOfLifeInfo({ - hasEndOfLife: true, - aboutPageEndOfLifeMessage: '', - }); - aboutBrowserProxy.setRegulatoryInfo({text: 'text', url: 'url'}); - await initNewPage(true /* showOsSettings */); - assertFalse(!!page.$.endOfLifeMessageContainer.hidden); - assertFalse(!!page.$['detailed-build-info-trigger'].hidden); - assertFalse(!!page.$.regulatoryInfo.hidden); - assertFalse(!!page.$.crostiniLicense.hidden); - await initNewPage(false /* showOsSettings */); - assertTrue(!!page.$.endOfLifeMessageContainer.hidden); - assertTrue(!!page.$['detailed-build-info-trigger'].hidden); - assertTrue(!!page.$.regulatoryInfo.hidden); - assertTrue(!!page.$.crostiniLicense.hidden); - }); - } - - if (!cr.isChromeOS) { /* * Test that the "Relaunch" button updates according to incoming * 'update-status-changed' events. @@ -660,165 +382,8 @@ }); } - if (cr.isChromeOS) { - function registerDetailedBuildInfoTests() { - suite('DetailedBuildInfoTest', function() { - let page = null; - let browserProxy = null; - - setup(function() { - browserProxy = new TestAboutPageBrowserProxy(); - settings.AboutPageBrowserProxyImpl.instance_ = browserProxy; - PolymerTest.clearBody(); - }); - - teardown(function() { - page.remove(); - page = null; - }); - - test('Initialization', async () => { - page = document.createElement('settings-detailed-build-info'); - document.body.appendChild(page); - - await Promise.all([ - browserProxy.whenCalled('pageReady'), - browserProxy.whenCalled('getChannelInfo'), - ]); - }); - - /** - * Checks whether the "change channel" button state (enabled/disabled) - * correctly reflects whether the user is allowed to change channel (as - * dictated by the browser via loadTimeData boolean). - * @param {boolean} canChangeChannel Whether to simulate the case where - * changing channels is allowed. - * @return {!Promise} - */ - async function checkChangeChannelButton(canChangeChannel) { - browserProxy.setCanChangeChannel(canChangeChannel); - page = document.createElement('settings-detailed-build-info'); - document.body.appendChild(page); - await browserProxy.whenCalled('getChannelInfo'); - const changeChannelButton = page.$$('cr-button'); - assertTrue(!!changeChannelButton); - assertEquals(canChangeChannel, !changeChannelButton.disabled); - } - - test('ChangeChannel_Enabled', function() { - return checkChangeChannelButton(true); - }); - - test('ChangeChannel_Disabled', function() { - return checkChangeChannelButton(false); - }); - }); - } - - function registerChannelSwitcherDialogTests() { - suite('ChannelSwitcherDialogTest', function() { - let dialog = null; - let radioButtons = null; - let browserProxy = null; - const currentChannel = BrowserChannel.BETA; - - setup(function() { - browserProxy = new TestAboutPageBrowserProxy(); - browserProxy.setChannels(currentChannel, currentChannel); - settings.AboutPageBrowserProxyImpl.instance_ = browserProxy; - PolymerTest.clearBody(); - dialog = document.createElement('settings-channel-switcher-dialog'); - document.body.appendChild(dialog); - - radioButtons = dialog.shadowRoot.querySelectorAll('cr-radio-button'); - assertEquals(3, radioButtons.length); - return browserProxy.whenCalled('getChannelInfo'); - }); - - teardown(function() { - dialog.remove(); - }); - - test('Initialization', function() { - const radioGroup = dialog.$$('cr-radio-group'); - assertTrue(!!radioGroup); - assertTrue(!!dialog.$.warningSelector); - assertTrue(!!dialog.$.changeChannel); - assertTrue(!!dialog.$.changeChannelAndPowerwash); - - // Check that upon initialization the radio button corresponding to - // the current release channel is pre-selected. - assertEquals(currentChannel, radioGroup.selected); - assertEquals(dialog.$.warningSelector.selected, -1); - - // Check that action buttons are hidden when current and target - // channel are the same. - assertTrue(dialog.$.changeChannel.hidden); - assertTrue(dialog.$.changeChannelAndPowerwash.hidden); - }); - - // Test case where user switches to a less stable channel. - test('ChangeChannel_LessStable', async () => { - assertEquals(BrowserChannel.DEV, radioButtons.item(2).name); - radioButtons.item(2).click(); - Polymer.dom.flush(); - - await browserProxy.whenCalled('getChannelInfo'); - assertEquals(dialog.$.warningSelector.selected, 2); - // Check that only the "Change channel" button becomes visible. - assertTrue(dialog.$.changeChannelAndPowerwash.hidden); - assertFalse(dialog.$.changeChannel.hidden); - - const whenTargetChannelChangedFired = - test_util.eventToPromise('target-channel-changed', dialog); - - dialog.$.changeChannel.click(); - const [channel, isPowerwashAllowed] = - await browserProxy.whenCalled('setChannel'); - assertEquals(BrowserChannel.DEV, channel); - assertFalse(isPowerwashAllowed); - const {detail} = await whenTargetChannelChangedFired; - assertEquals(BrowserChannel.DEV, detail); - }); - - // Test case where user switches to a more stable channel. - test('ChangeChannel_MoreStable', async () => { - assertEquals(BrowserChannel.STABLE, radioButtons.item(0).name); - radioButtons.item(0).click(); - Polymer.dom.flush(); - - await browserProxy.whenCalled('getChannelInfo'); - assertEquals(dialog.$.warningSelector.selected, 1); - // Check that only the "Change channel and Powerwash" button becomes - // visible. - assertFalse(dialog.$.changeChannelAndPowerwash.hidden); - assertTrue(dialog.$.changeChannel.hidden); - - const whenTargetChannelChangedFired = - test_util.eventToPromise('target-channel-changed', dialog); - - dialog.$.changeChannelAndPowerwash.click(); - const [channel, isPowerwashAllowed] = - await browserProxy.whenCalled('setChannel'); - assertEquals(BrowserChannel.STABLE, channel); - assertTrue(isPowerwashAllowed); - const {detail} = await whenTargetChannelChangedFired; - assertEquals(BrowserChannel.STABLE, detail); - }); - }); - } - } - return { - registerTests: function() { - // TODO(aee): move CrOS-specific tests to the OS about page tests when - // when these parts are removed from the browser about page. - if (cr.isChromeOS) { - registerDetailedBuildInfoTests(); - registerChannelSwitcherDialogTests(); - } - registerAboutPageTests(); - }, + registerTests: registerAboutPageTests, registerOfficialBuildTests: registerOfficialBuildTests, }; });
diff --git a/chrome/test/data/webui/settings/chromeos/localized_link_test.js b/chrome/test/data/webui/settings/chromeos/localized_link_test.js index 654f7d94..436ed68 100644 --- a/chrome/test/data/webui/settings/chromeos/localized_link_test.js +++ b/chrome/test/data/webui/settings/chromeos/localized_link_test.js
@@ -65,4 +65,14 @@ `<a href="http://google.com" id="id0" aria-labelledby="id0">` + `pre-populated link</a>`); }); + + test('NoLinkPresent', function() { + document.body.innerHTML = GetLocalizedStringWithLinkElementHtml( + `No anchor tags in this sentence.`, ``); + localizedStringWithLink = + document.body.querySelector('settings-localized-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `No anchor tags in this sentence.`); + }); });
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js index 128628c..649c3a0 100644 --- a/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js +++ b/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js
@@ -94,7 +94,8 @@ }); test('link click does not navigate to subpage', function() { - const link = featureItem.$$('#featureSecondary > a'); + const link = + featureItem.$$('#featureSecondary').$.container.querySelector('a'); assertTrue(!!link); checkWhetherClickRoutesAway(link, false); });
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js index 41339c7a0..d89aab5f 100644 --- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -505,11 +505,159 @@ }); } + function registerDetailedBuildInfoTests() { + suite('DetailedBuildInfoTest', function() { + let page = null; + let browserProxy = null; + + setup(function() { + browserProxy = new TestAboutPageBrowserProxy(); + settings.AboutPageBrowserProxyImpl.instance_ = browserProxy; + PolymerTest.clearBody(); + }); + + teardown(function() { + page.remove(); + page = null; + }); + + test('Initialization', async () => { + page = document.createElement('settings-detailed-build-info'); + document.body.appendChild(page); + + await Promise.all([ + browserProxy.whenCalled('pageReady'), + browserProxy.whenCalled('getChannelInfo'), + ]); + }); + + /** + * Checks whether the "change channel" button state (enabled/disabled) + * correctly reflects whether the user is allowed to change channel (as + * dictated by the browser via loadTimeData boolean). + * @param {boolean} canChangeChannel Whether to simulate the case where + * changing channels is allowed. + * @return {!Promise} + */ + async function checkChangeChannelButton(canChangeChannel) { + browserProxy.setCanChangeChannel(canChangeChannel); + page = document.createElement('settings-detailed-build-info'); + document.body.appendChild(page); + await browserProxy.whenCalled('getChannelInfo'); + const changeChannelButton = page.$$('cr-button'); + assertTrue(!!changeChannelButton); + assertEquals(canChangeChannel, !changeChannelButton.disabled); + } + + test('ChangeChannel_Enabled', function() { + return checkChangeChannelButton(true); + }); + + test('ChangeChannel_Disabled', function() { + return checkChangeChannelButton(false); + }); + }); + } + + function registerChannelSwitcherDialogTests() { + suite('ChannelSwitcherDialogTest', function() { + let dialog = null; + let radioButtons = null; + let browserProxy = null; + const currentChannel = BrowserChannel.BETA; + + setup(function() { + browserProxy = new TestAboutPageBrowserProxy(); + browserProxy.setChannels(currentChannel, currentChannel); + settings.AboutPageBrowserProxyImpl.instance_ = browserProxy; + PolymerTest.clearBody(); + dialog = document.createElement('settings-channel-switcher-dialog'); + document.body.appendChild(dialog); + + radioButtons = dialog.shadowRoot.querySelectorAll('cr-radio-button'); + assertEquals(3, radioButtons.length); + return browserProxy.whenCalled('getChannelInfo'); + }); + + teardown(function() { + dialog.remove(); + }); + + test('Initialization', function() { + const radioGroup = dialog.$$('cr-radio-group'); + assertTrue(!!radioGroup); + assertTrue(!!dialog.$.warningSelector); + assertTrue(!!dialog.$.changeChannel); + assertTrue(!!dialog.$.changeChannelAndPowerwash); + + // Check that upon initialization the radio button corresponding to + // the current release channel is pre-selected. + assertEquals(currentChannel, radioGroup.selected); + assertEquals(dialog.$.warningSelector.selected, -1); + + // Check that action buttons are hidden when current and target + // channel are the same. + assertTrue(dialog.$.changeChannel.hidden); + assertTrue(dialog.$.changeChannelAndPowerwash.hidden); + }); + + // Test case where user switches to a less stable channel. + test('ChangeChannel_LessStable', async () => { + assertEquals(BrowserChannel.DEV, radioButtons.item(2).name); + radioButtons.item(2).click(); + Polymer.dom.flush(); + + await browserProxy.whenCalled('getChannelInfo'); + assertEquals(dialog.$.warningSelector.selected, 2); + // Check that only the "Change channel" button becomes visible. + assertTrue(dialog.$.changeChannelAndPowerwash.hidden); + assertFalse(dialog.$.changeChannel.hidden); + + const whenTargetChannelChangedFired = + test_util.eventToPromise('target-channel-changed', dialog); + + dialog.$.changeChannel.click(); + const [channel, isPowerwashAllowed] = + await browserProxy.whenCalled('setChannel'); + assertEquals(BrowserChannel.DEV, channel); + assertFalse(isPowerwashAllowed); + const {detail} = await whenTargetChannelChangedFired; + assertEquals(BrowserChannel.DEV, detail); + }); + + // Test case where user switches to a more stable channel. + test('ChangeChannel_MoreStable', async () => { + assertEquals(BrowserChannel.STABLE, radioButtons.item(0).name); + radioButtons.item(0).click(); + Polymer.dom.flush(); + + await browserProxy.whenCalled('getChannelInfo'); + assertEquals(dialog.$.warningSelector.selected, 1); + // Check that only the "Change channel and Powerwash" button becomes + // visible. + assertFalse(dialog.$.changeChannelAndPowerwash.hidden); + assertTrue(dialog.$.changeChannel.hidden); + + const whenTargetChannelChangedFired = + test_util.eventToPromise('target-channel-changed', dialog); + + dialog.$.changeChannelAndPowerwash.click(); + const [channel, isPowerwashAllowed] = + await browserProxy.whenCalled('setChannel'); + assertEquals(BrowserChannel.STABLE, channel); + assertTrue(isPowerwashAllowed); + const {detail} = await whenTargetChannelChangedFired; + assertEquals(BrowserChannel.STABLE, detail); + }); + }); + } + return { - // TODO(crbug.com/950007): Move the channel switch dialog tests to here - // from the browser about page tests when those CrOS-specific parts are - // removed from the browser about page. - registerTests: registerAboutPageTests, + registerTests: function() { + registerDetailedBuildInfoTests(); + registerChannelSwitcherDialogTests(); + registerAboutPageTests(); + }, registerOfficialBuildTests: registerOfficialBuildTests, }; });
diff --git a/chrome/test/data/webui/tab_strip/tab_list_test.js b/chrome/test/data/webui/tab_strip/tab_list_test.js index f4e011bf..af32637b 100644 --- a/chrome/test/data/webui/tab_strip/tab_list_test.js +++ b/chrome/test/data/webui/tab_strip/tab_list_test.js
@@ -485,12 +485,18 @@ test('scrolls to active tabs', async () => { await tabList.animationPromises; + const newTabButtonMargin = 15; + const newTabButtonWidth = 50; const scrollPadding = 32; const tabWidth = 200; const viewportWidth = 300; // Mock the width of each tab element. tabList.style.setProperty( + '--tabstrip-new-tab-button-margin', `${newTabButtonMargin}px`); + tabList.style.setProperty( + '--tabstrip-new-tab-button-width', `${newTabButtonWidth}px`); + tabList.style.setProperty( '--tabstrip-tab-thumbnail-width', `${tabWidth}px`); tabList.style.setProperty('--tabstrip-tab-spacing', '0px'); const tabElements = getUnpinnedTabs(); @@ -516,7 +522,8 @@ let activeTab = getUnpinnedTabs()[1]; assertEquals( tabList.scrollLeft + tabList.offsetWidth, - activeTab.offsetLeft + activeTab.offsetWidth + scrollPadding); + activeTab.offsetLeft + activeTab.offsetWidth + scrollPadding + + newTabButtonMargin + newTabButtonWidth); // The 1st tab should be now off-screen to the left, so activating it should // scroll so that the element's left edge is aligned with the screen's
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 0ae739e11..a44a914 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -41,7 +41,6 @@ #include "content/public/test/test_renderer_host.h" #include "extensions/common/constants.h" #include "extensions/test/extension_test_message_listener.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chromecast/media/audio/BUILD.gn b/chromecast/media/audio/BUILD.gn index 1e231ca..8e145dd 100644 --- a/chromecast/media/audio/BUILD.gn +++ b/chromecast/media/audio/BUILD.gn
@@ -24,41 +24,18 @@ ] } -cast_source_set("audio_provider") { - sources = [ - "audio_provider.h", - ] -} - -cast_source_set("fader") { - sources = [ - "audio_fader.cc", - "audio_fader.h", - ] - - deps = [ - "//base", - "//media", - ] - - public_deps = [ - "//chromecast/public/media", - ] - - # Use fastest possible float math. - configs -= [ "//build/config/compiler:default_optimization" ] - configs += [ "//build/config/compiler:optimize_speed" ] - cflags = [ "-ffast-math" ] -} - -cast_source_set("audio_clock_simulator") { +cast_source_set("processing") { sources = [ "audio_clock_simulator.cc", "audio_clock_simulator.h", + "audio_fader.cc", + "audio_fader.h", + "audio_provider.h", + "interleaved_channel_mixer.cc", + "interleaved_channel_mixer.h", ] deps = [ - ":audio_provider", "//base", "//media", ] @@ -87,22 +64,6 @@ cflags = [ "-ffast-math" ] } -cast_source_set("interleaved_channel_mixer") { - sources = [ - "interleaved_channel_mixer.cc", - "interleaved_channel_mixer.h", - ] - deps = [ - "//base", - "//media", - ] - - # Use fastest possible float math. - configs -= [ "//build/config/compiler:default_optimization" ] - configs += [ "//build/config/compiler:optimize_speed" ] - cflags = [ "-ffast-math" ] -} - cast_source_set("audio") { sources = [ "cast_audio_input_stream.cc", @@ -236,9 +197,7 @@ ] deps = [ - ":audio_clock_simulator", - ":fader", - ":interleaved_channel_mixer", + ":processing", "//base", "//media", "//testing/gmock",
diff --git a/chromecast/media/audio/audio_fader.cc b/chromecast/media/audio/audio_fader.cc index 714662df..a603fe5 100644 --- a/chromecast/media/audio/audio_fader.cc +++ b/chromecast/media/audio/audio_fader.cc
@@ -13,35 +13,36 @@ namespace chromecast { namespace media { -AudioFader::AudioFader(Source* source, - base::TimeDelta fade_time, - int num_channels, - int sample_rate, - double playback_rate) - : AudioFader( - source, - std::round(fade_time.InSecondsF() * sample_rate * playback_rate), - num_channels, - sample_rate, - playback_rate) {} +namespace { -AudioFader::AudioFader(Source* source, - int fade_frames, - int num_channels, - int sample_rate, +constexpr size_t kMaxChannels = 8; + +} // namespace + +AudioFader::AudioFader(AudioProvider* provider, + base::TimeDelta fade_time, double playback_rate) - : source_(source), + : AudioFader(provider, + std::round(fade_time.InSecondsF() * provider->sample_rate() * + playback_rate), + playback_rate) {} + +AudioFader::AudioFader(AudioProvider* provider, + int fade_frames, + double playback_rate) + : provider_(provider), // Ensure that fade_frames_ is a multiple of 4 to keep correct alignment. fade_frames_(base::bits::Align(fade_frames, 4)), - num_channels_(num_channels), - sample_rate_(sample_rate), + num_channels_(provider_->num_channels()), + sample_rate_(provider_->sample_rate()), playback_rate_(playback_rate) { - DCHECK(source_); + DCHECK(provider_); DCHECK_GT(fade_frames_, 0); - DCHECK_GT(num_channels_, 0); + DCHECK_GT(num_channels_, 0u); + DCHECK_LE(num_channels_, kMaxChannels); DCHECK_GT(sample_rate_, 0); - fade_buffer_ = ::media::AudioBus::Create(num_channels, fade_frames_); + fade_buffer_ = ::media::AudioBus::Create(num_channels_, fade_frames_); fade_buffer_->Zero(); } @@ -58,16 +59,24 @@ (sample_rate_ * playback_rate_); } +size_t AudioFader::num_channels() const { + return num_channels_; +} + +int AudioFader::sample_rate() const { + return sample_rate_; +} + int AudioFader::FillFrames(int num_frames, - RenderingDelay rendering_delay, + int64_t playout_timestamp, float* const* channel_data) { DCHECK(channel_data); int filled_frames = std::min(buffered_frames_, num_frames); if (filled_frames > 0) { - for (int c = 0; c < num_channels_; ++c) { + for (size_t c = 0; c < num_channels_; ++c) { float* fade_channel = fade_buffer_->channel(c); - // First, copy data from buffered_frames_. + // First, copy data from fade_buffer_. std::copy_n(fade_channel, filled_frames, channel_data[c]); // Move data in fade_buffer_ to start. std::copy(fade_channel + filled_frames, fade_channel + buffered_frames_, @@ -78,28 +87,27 @@ num_frames -= filled_frames; } - float* fill_channel_data[num_channels_]; + float* fill_channel_data[kMaxChannels]; if (num_frames > 0) { // Still need more frames; ask source to fill. - for (int c = 0; c < num_channels_; ++c) { + for (size_t c = 0; c < num_channels_; ++c) { fill_channel_data[c] = channel_data[c] + filled_frames; } - RenderingDelay delay = rendering_delay; - delay.delay_microseconds += - FramesToMicroseconds(filled_frames + buffered_frames_); - int filled = source_->FillFaderFrames(num_frames, delay, fill_channel_data); + int64_t timestamp = playout_timestamp + + FramesToMicroseconds(filled_frames + buffered_frames_); + int filled = + provider_->FillFrames(num_frames, timestamp, fill_channel_data); filled_frames += filled; num_frames -= filled; } // Refill fade_buffer_ from source. - for (int c = 0; c < num_channels_; ++c) { + for (size_t c = 0; c < num_channels_; ++c) { fill_channel_data[c] = fade_buffer_->channel(c) + buffered_frames_; } - RenderingDelay delay = rendering_delay; - delay.delay_microseconds += - FramesToMicroseconds(filled_frames + buffered_frames_); - buffered_frames_ += source_->FillFaderFrames(fade_frames_ - buffered_frames_, - delay, fill_channel_data); + int64_t timestamp = playout_timestamp + + FramesToMicroseconds(filled_frames + buffered_frames_); + buffered_frames_ += provider_->FillFrames(fade_frames_ - buffered_frames_, + timestamp, fill_channel_data); const bool complete = (num_frames == 0 && buffered_frames_ == fade_frames_); if (complete) { @@ -139,7 +147,7 @@ case State::kSilent: // Remain silent. buffered_frames_ = 0; - for (int c = 0; c < num_channels_; ++c) { + for (size_t c = 0; c < num_channels_; ++c) { std::fill_n(channel_data[c], filled_frames, 0); } return; @@ -175,14 +183,14 @@ // static void AudioFader::FadeInHelper(float* const* channel_data, - int num_channels, + size_t num_channels, int filled_frames, int fade_frames, int fade_frames_remaining) { const float inverse_fade_frames = 1.0f / static_cast<float>(fade_frames); const int fade_limit = std::min(filled_frames, fade_frames_remaining + 1); - for (int c = 0; c < num_channels; ++c) { + for (size_t c = 0; c < num_channels; ++c) { float* channel = channel_data[c]; for (int f = 0; f < fade_limit; ++f) { const float fade_multiplier = @@ -207,14 +215,14 @@ // static void AudioFader::FadeOutHelper(float* const* channel_data, - int num_channels, + size_t num_channels, int filled_frames, int fade_frames, int fade_frames_remaining) { const float inverse_fade_frames = 1.0f / static_cast<float>(fade_frames); const int fade_limit = std::min(filled_frames, fade_frames_remaining + 1); - for (int c = 0; c < num_channels; ++c) { + for (size_t c = 0; c < num_channels; ++c) { float* channel = channel_data[c]; for (int f = 0; f < fade_limit; ++f) { const float fade_multiplier = @@ -223,7 +231,7 @@ } } if (filled_frames > fade_frames_remaining) { - for (int c = 0; c < num_channels; ++c) { + for (size_t c = 0; c < num_channels; ++c) { std::fill_n(channel_data[c] + fade_frames_remaining, filled_frames - fade_frames_remaining, 0); }
diff --git a/chromecast/media/audio/audio_fader.h b/chromecast/media/audio/audio_fader.h index ffd82f95..dabc1dab 100644 --- a/chromecast/media/audio/audio_fader.h +++ b/chromecast/media/audio/audio_fader.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/time/time.h" -#include "chromecast/public/media/media_pipeline_backend.h" +#include "chromecast/media/audio/audio_provider.h" namespace media { class AudioBus; @@ -25,48 +25,22 @@ // data to ensure that a full fade can always take place if necessary; note that // this increases output latency by |fade_frames| samples. All methods except // constructor/destructor must be called on the same thread. -class AudioFader { +class AudioFader : public AudioProvider { public: - using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay; - - // The source of real audio data for the fader. - class Source { - public: - // Called to get more audio data for playback. The source must fill in - // the |channels| with up to |num_frames| of audio. Note that only planar - // float format is supported. The |rendering_delay| indicates when the - // first frame of the filled data will be played out. - // Note that this method is called on a high priority audio output thread - // and must not block. - // Returns the number of frames filled. - virtual int FillFaderFrames(int num_frames, - RenderingDelay rendering_delay, - float* const* channels) = 0; - - protected: - virtual ~Source() = default; - }; - - AudioFader(Source* source, + AudioFader(AudioProvider* provider, base::TimeDelta fade_time, - int num_channels, - int sample_rate, double playback_rate); - AudioFader(Source* source, - int fade_frames, - int num_channels, - int sample_rate, - double playback_rate); - ~AudioFader(); + AudioFader(AudioProvider* provider, int fade_frames, double playback_rate); + ~AudioFader() override; int buffered_frames() const { return buffered_frames_; } - // Fills in |channel_data| with |num_frames| frames of properly faded audio. - // The |rendering_delay| should reflect when the first sample of the filled - // audio is expected to play out. + // AudioProvider implementation: int FillFrames(int num_frames, - RenderingDelay rendering_delay, - float* const* channel_data); + int64_t playout_timestamp, + float* const* channel_data) override; + size_t num_channels() const override; + int sample_rate() const override; // Returns the total number of frames that will be requested from the source // (potentially over multiple calls to source_->FillFaderFrames()) if @@ -81,12 +55,12 @@ // (which will be less than |fade_frames| if part of the fade has already // been completed on a previous buffer). static void FadeInHelper(float* const* channel_data, - int num_channels, + size_t num_channels, int filled_frames, int fade_frames, int fade_frames_remaining); static void FadeOutHelper(float* const* channel_data, - int num_channels, + size_t num_channels, int filled_frames, int fade_frames, int fade_frames_remaining); @@ -106,9 +80,9 @@ void FadeIn(float* const* channel_data, int filled_frames); void FadeOut(float* const* channel_data, int filled_frames); - Source* const source_; + AudioProvider* const provider_; const int fade_frames_; - const int num_channels_; + const size_t num_channels_; const int sample_rate_; const double playback_rate_;
diff --git a/chromecast/media/audio/audio_fader_unittest.cc b/chromecast/media/audio/audio_fader_unittest.cc index 0c40dc8..07c1aaa 100644 --- a/chromecast/media/audio/audio_fader_unittest.cc +++ b/chromecast/media/audio/audio_fader_unittest.cc
@@ -33,7 +33,7 @@ return buffer; } -class TestFaderSource : public AudioFader::Source { +class TestFaderSource : public AudioProvider { public: TestFaderSource() : max_fill_frames_(std::numeric_limits<int>::max()), @@ -41,10 +41,10 @@ last_requested_frames_(0), last_filled_frames_(0) {} - // AudioFader::Source implementation: - int FillFaderFrames(int num_frames, - AudioFader::RenderingDelay rendering_delay, - float* const* channels) override { + // AudioProvider implementation: + int FillFrames(int num_frames, + int64_t playout_timestamp, + float* const* channel_data) override { last_requested_frames_ = num_frames; total_requested_frames_ += num_frames; @@ -52,11 +52,13 @@ last_filled_frames_ = count; for (int c = 0; c < kNumChannels; ++c) { - std::fill_n(channels[c], count, 1.0f); + std::fill_n(channel_data[c], count, 1.0f); } return count; } + size_t num_channels() const override { return kNumChannels; } + int sample_rate() const override { return kSampleRate; } void set_max_fill_frames(int frames) { max_fill_frames_ = frames; } @@ -77,7 +79,7 @@ TEST(AudioFaderTest, Startup) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -92,8 +94,7 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Test that FramesNeededFromSource() works correctly. EXPECT_EQ(source.total_requested_frames(), frames_needed); @@ -108,7 +109,7 @@ TEST(AudioFaderTest, FadeInOver2Buffers) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -120,8 +121,7 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Fader's internal buffer should be full. EXPECT_EQ(fader.buffered_frames(), kFadeFrames); @@ -132,8 +132,7 @@ // Fill more data. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); EXPECT_EQ(fader.buffered_frames(), kFadeFrames); // Test that FramesNeededFromSource() works correctly. @@ -148,7 +147,7 @@ TEST(AudioFaderTest, ContinuePlaying) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -161,16 +160,14 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Test that FramesNeededFromSource() works correctly. @@ -182,7 +179,7 @@ TEST(AudioFaderTest, FadeOut) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -195,24 +192,21 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Now make the source not provide enough data. EXPECT_GT(fader.FramesNeededFromSource(kFillSize), 0); source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFillSize); - int filled = - fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels); + int filled = fader.FillFrames(kFillSize, 0, channels); EXPECT_EQ(filled, kFadeFrames); // Test that FramesNeededFromSource() works correctly. @@ -229,7 +223,7 @@ TEST(AudioFaderTest, FadeOutPartially) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -242,24 +236,21 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Now make the source not provide enough data. EXPECT_GT(fader.FramesNeededFromSource(kFillSize), 0); source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFadeFrames / 3); - int filled = - fader.FillFrames(kFadeFrames / 3, AudioFader::RenderingDelay(), channels); + int filled = fader.FillFrames(kFadeFrames / 3, 0, channels); EXPECT_EQ(filled, kFadeFrames / 3); // Data should be partially faded out. @@ -274,8 +265,7 @@ // Now let the source provide data again. source.set_max_fill_frames(std::numeric_limits<int>::max()); frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Data should fade back in from the point it faded out to. EXPECT_GE(dest->channel(0)[0], fade_min); EXPECT_EQ(dest->channel(0)[kFillSize - 1], 1.0f); @@ -289,7 +279,7 @@ TEST(AudioFaderTest, IncompleteFadeIn) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -305,8 +295,7 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - int filled = - fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels); + int filled = fader.FillFrames(kFillSize, 0, channels); // Test that FramesNeededFromSource() works correctly. EXPECT_EQ(source.total_requested_frames(), frames_needed); @@ -322,7 +311,7 @@ TEST(AudioFaderTest, FadeInPartially) { TestFaderSource source; - AudioFader fader(&source, kFadeFrames, kNumChannels, kSampleRate, 1.0); + AudioFader fader(&source, kFadeFrames, 1.0); // Fader has no buffered frames initially. EXPECT_EQ(fader.buffered_frames(), 0); @@ -335,8 +324,7 @@ for (int c = 0; c < kNumChannels; ++c) { channels[c] = dest->channel(c); } - EXPECT_EQ(fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels), - kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, 0, channels), kFillSize); // Fader's internal buffer should be full. EXPECT_EQ(fader.buffered_frames(), kFadeFrames); @@ -351,8 +339,7 @@ // back out to silence. source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFillSize); - int filled = - fader.FillFrames(kFillSize, AudioFader::RenderingDelay(), channels); + int filled = fader.FillFrames(kFillSize, 0, channels); // Data should be faded out. EXPECT_LE(dest->channel(0)[0], fade_max);
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn index 6c50ea64..b1980839 100644 --- a/chromecast/media/cma/backend/BUILD.gn +++ b/chromecast/media/cma/backend/BUILD.gn
@@ -167,7 +167,7 @@ "//base", "//chromecast/base", "//chromecast/media/audio:audio_resampler", - "//chromecast/media/audio:fader", + "//chromecast/media/audio:processing", "//chromecast/media/audio/mixer_service:common", "//chromecast/media/audio/mixer_service:control_connection", "//chromecast/media/audio/mixer_service:output_stream_connection",
diff --git a/chromecast/media/cma/backend/cplay/cplay.cc b/chromecast/media/cma/backend/cplay/cplay.cc index 2139c2c..4d40726a 100644 --- a/chromecast/media/cma/backend/cplay/cplay.cc +++ b/chromecast/media/cma/backend/cplay/cplay.cc
@@ -101,10 +101,10 @@ bool AtEnd() { return input_handler_->AtEnd(cursor_); } // MixerInput::Source implementation: - int num_channels() override { return input_handler_->num_channels(); } - int input_samples_per_second() override { - return input_handler_->sample_rate(); + size_t num_channels() const override { + return input_handler_->num_channels(); } + int sample_rate() const override { return input_handler_->sample_rate(); } bool primary() override { return true; } bool active() override { return true; } const std::string& device_id() override { return device_id_; } @@ -284,12 +284,11 @@ // Read input file. WavMixerInputSource input_source(params); if (params.output_samples_per_second <= 0) { - params.output_samples_per_second = input_source.input_samples_per_second(); + params.output_samples_per_second = input_source.sample_rate(); } - if (params.output_samples_per_second != - input_source.input_samples_per_second()) { - LOG(INFO) << "Resampling from " << input_source.input_samples_per_second() - << " to " << params.output_samples_per_second; + if (params.output_samples_per_second != input_source.sample_rate()) { + LOG(INFO) << "Resampling from " << input_source.sample_rate() << " to " + << params.output_samples_per_second; } else { LOG(INFO) << "Sample rate: " << params.output_samples_per_second; }
diff --git a/chromecast/media/cma/backend/mixer/BUILD.gn b/chromecast/media/cma/backend/mixer/BUILD.gn index 8e295a90..5f343eb 100644 --- a/chromecast/media/cma/backend/mixer/BUILD.gn +++ b/chromecast/media/cma/backend/mixer/BUILD.gn
@@ -72,9 +72,8 @@ "//chromecast/base:chromecast_switches", "//chromecast/base:thread_health_checker", "//chromecast/media/audio:audio_io_thread", - "//chromecast/media/audio:fader", - "//chromecast/media/audio:interleaved_channel_mixer", "//chromecast/media/audio:libcast_external_audio_pipeline_1.0", + "//chromecast/media/audio:processing", "//chromecast/media/audio/mixer_service:common", "//chromecast/media/audio/mixer_service:proto", "//chromecast/media/audio/mixer_service:redirected_audio_connection",
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.cc b/chromecast/media/cma/backend/mixer/mixer_input.cc index e173290..979011f 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input.cc +++ b/chromecast/media/cma/backend/mixer/mixer_input.cc
@@ -40,7 +40,7 @@ MixerInput::MixerInput(Source* source, FilterGroup* filter_group) : source_(source), num_channels_(source->num_channels()), - input_samples_per_second_(source->input_samples_per_second()), + input_samples_per_second_(source->sample_rate()), output_samples_per_second_(filter_group->input_samples_per_second()), primary_(source->primary()), device_id_(source->device_id()),
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.h b/chromecast/media/cma/backend/mixer/mixer_input.h index 928af0b..0e0556e 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input.h +++ b/chromecast/media/cma/backend/mixer/mixer_input.h
@@ -47,8 +47,8 @@ }; // TODO(b/139311908) Track channel layout. - virtual int num_channels() = 0; - virtual int input_samples_per_second() = 0; + virtual size_t num_channels() const = 0; + virtual int sample_rate() const = 0; virtual bool primary() = 0; virtual const std::string& device_id() = 0; virtual AudioContentType content_type() = 0;
diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc index 534890f..2921706f 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc +++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc
@@ -178,8 +178,6 @@ : ::media::AudioTimestampHelper::TimeToFrames( kDefaultFadeTime, input_samples_per_second_), - num_channels_, - input_samples_per_second_, 1.0 /* playback_rate */), use_start_timestamp_(params.use_start_timestamp()), playback_start_timestamp_(use_start_timestamp_ ? INT64_MAX : INT64_MIN), @@ -193,6 +191,7 @@ << ", fill size: " << fill_size_ << ", algorithm fill size: " << algorithm_fill_size_ << ", channel count: " << num_channels_ + << ", input sample rate: " << input_samples_per_second_ << ", start threshold: " << start_threshold_frames_ << ", max queue size: " << max_queued_frames_ << ", socket: " << socket_.get(); @@ -476,12 +475,14 @@ mixer_->UpdateStreamCounts(); } -int MixerInputConnection::num_channels() { +size_t MixerInputConnection::num_channels() const { return num_channels_; } -int MixerInputConnection::input_samples_per_second() { + +int MixerInputConnection::sample_rate() const { return input_samples_per_second_; } + bool MixerInputConnection::primary() { return primary_; } @@ -792,7 +793,8 @@ for (int c = 0; c < num_channels_; ++c) { channels[c] = buffer->channel(c) + write_offset; } - filled += fader_.FillFrames(num_frames, rendering_delay, channels); + filled += + fader_.FillFrames(num_frames, playback_absolute_timestamp, channels); skip_next_fill_for_rate_change_ = false; mixer_rendering_delay_ = rendering_delay; @@ -840,9 +842,9 @@ return FillRateShifted(needed_by_fader); } -int MixerInputConnection::FillFaderFrames(int num_frames, - RenderingDelay rendering_delay, - float* const* channels) { +int MixerInputConnection::FillFrames(int num_frames, + int64_t playout_timestamp, + float* const* channels) { if (zero_fader_frames_ || !started_ || paused_ || state_ == State::kRemoved || skip_next_fill_for_rate_change_ || num_frames == 0) { return 0;
diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.h b/chromecast/media/cma/backend/mixer/mixer_input_connection.h index b9c7081..2b5421a 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input_connection.h +++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.h
@@ -17,6 +17,7 @@ #include "base/thread_annotations.h" #include "base/timer/timer.h" #include "chromecast/media/audio/audio_fader.h" +#include "chromecast/media/audio/audio_provider.h" #include "chromecast/media/audio/mixer_service/mixer_service.pb.h" #include "chromecast/media/audio/mixer_service/mixer_socket.h" #include "chromecast/media/cma/backend/mixer/mixer_input.h" @@ -54,7 +55,7 @@ // externally deleted. class MixerInputConnection : public mixer_service::MixerSocket::Delegate, public MixerInput::Source, - public AudioFader::Source { + public AudioProvider { public: using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay; @@ -92,8 +93,8 @@ void SetPaused(bool paused); // MixerInput::Source implementation: - int num_channels() override; - int input_samples_per_second() override; + size_t num_channels() const override; + int sample_rate() const override; bool primary() override; const std::string& device_id() override; AudioContentType content_type() override; @@ -109,10 +110,10 @@ void OnAudioPlaybackError(MixerError error) override; void FinalizeAudioPlayback() override; - // AudioFader::Source implementation: - int FillFaderFrames(int num_frames, - RenderingDelay rendering_delay, - float* const* channels) + // AudioProvider implementation: + int FillFrames(int num_frames, + int64_t playout_timestamp, + float* const* channels) EXCLUSIVE_LOCKS_REQUIRED(lock_) override; bool PrepareDataForFill(int num_frames) EXCLUSIVE_LOCKS_REQUIRED(lock_);
diff --git a/chromecast/media/cma/backend/mixer/mock_mixer_source.h b/chromecast/media/cma/backend/mixer/mock_mixer_source.h index d534e03..830f56c0 100644 --- a/chromecast/media/cma/backend/mixer/mock_mixer_source.h +++ b/chromecast/media/cma/backend/mixer/mock_mixer_source.h
@@ -32,8 +32,8 @@ ~MockMixerSource() override; // MixerInput::Source implementation: - int num_channels() override { return 2; } - int input_samples_per_second() override { return samples_per_second_; } + size_t num_channels() const override { return 2; } + int sample_rate() const override { return samples_per_second_; } bool primary() override { return primary_; } const std::string& device_id() override { return device_id_; } AudioContentType content_type() override { return content_type_; }
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer.cc b/chromecast/media/cma/backend/mixer/stream_mixer.cc index df75674..23bb35ce5 100644 --- a/chromecast/media/cma/backend/mixer/stream_mixer.cc +++ b/chromecast/media/cma/backend/mixer/stream_mixer.cc
@@ -57,7 +57,7 @@ namespace { -const int kMinInputChannels = 2; +const size_t kMinInputChannels = 2; const int kDefaultInputChannels = 2; const int kInvalidNumChannels = 0; @@ -616,13 +616,12 @@ // We only change the output rate if it is not set to a fixed value. if (input_source->primary() || inputs_.empty()) { CheckChangeOutputParams(GetEffectiveChannelCount(input_source), - input_source->input_samples_per_second()); + input_source->sample_rate()); } if (state_ == kStateStopped) { requested_input_channels_ = GetEffectiveChannelCount(input_source); - requested_output_samples_per_second_ = - input_source->input_samples_per_second(); + requested_output_samples_per_second_ = input_source->sample_rate(); Start(); }
diff --git a/chromeos/components/tether/keep_alive_scheduler.cc b/chromeos/components/tether/keep_alive_scheduler.cc index 8a27d73..5a2b0c8 100644 --- a/chromeos/components/tether/keep_alive_scheduler.cc +++ b/chromeos/components/tether/keep_alive_scheduler.cc
@@ -15,7 +15,7 @@ namespace tether { // static -const uint32_t KeepAliveScheduler::kKeepAliveIntervalMinutes = 4; +const uint32_t KeepAliveScheduler::kKeepAliveIntervalMinutes = 3; KeepAliveScheduler::KeepAliveScheduler( device_sync::DeviceSyncClient* device_sync_client,
diff --git a/components/BUILD.gn b/components/BUILD.gn index ed207f6..02b93fb48 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -485,7 +485,7 @@ "//testing/android/native_test:native_test_java", "//ui/android:ui_full_java", ] - java_files = [ + sources = [ "test/android/browsertests_apk/src/org/chromium/components_browsertests_apk/ComponentsBrowserTestsActivity.java", "test/android/browsertests_apk/src/org/chromium/components_browsertests_apk/ComponentsBrowserTestsApplication.java", ]
diff --git a/components/OWNERS b/components/OWNERS index ab1c0411..5b9ed4a 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -34,6 +34,7 @@ per-file send_tab_to_self_strings.grdp=file://components/send_tab_to_self/OWNERS per-file ssl_errors_strings.grdp=file://components/ssl_errors/OWNERS per-file sync_ui_strings.grdp=file://components/sync/OWNERS +per-file tab_groups_strings.grdp=file://components/tab_groups/OWNERS per-file translate_strings.grdp=file://components/translate/OWNERS per-file undo_strings.grdp=file://components/undo/OWNERS per-file version_ui_strings.grdp=file://components/version_ui/OWNERS
diff --git a/components/about_ui/android/BUILD.gn b/components/about_ui/android/BUILD.gn index 031cc1b..50a9b07 100644 --- a/components/about_ui/android/BUILD.gn +++ b/components/about_ui/android/BUILD.gn
@@ -10,7 +10,9 @@ } android_library("aboutui_java") { - java_files = [ "java/src/org/chromium/components/aboutui/CreditUtils.java" ] + sources = [ + "java/src/org/chromium/components/aboutui/CreditUtils.java", + ] deps = [ "//base:base_java", "//base:jni_java",
diff --git a/components/app_modal/BUILD.gn b/components/app_modal/BUILD.gn index 27aa8e1..7f80781 100644 --- a/components/app_modal/BUILD.gn +++ b/components/app_modal/BUILD.gn
@@ -41,6 +41,18 @@ deps += [ "//ui/views" ] } + + if (is_android) { + sources += [ + "android/javascript_app_modal_dialog_android.cc", + "android/javascript_app_modal_dialog_android.h", + ] + + deps += [ + "//components/app_modal/android:jni_headers", + "//ui/android", + ] + } } source_set("unit_tests") {
diff --git a/components/app_modal/android/BUILD.gn b/components/app_modal/android/BUILD.gn new file mode 100644 index 0000000..c020261 --- /dev/null +++ b/components/app_modal/android/BUILD.gn
@@ -0,0 +1,52 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") +import("//build/config/locales.gni") +import("//ui/android/features.gni") + +android_library("java") { + java_files = [ + "java/src/org/chromium/components/app_modal/JavascriptAppModalDialog.java", + "java/src/org/chromium/components/app_modal/JavascriptDialogCustomView.java", + "java/src/org/chromium/components/app_modal/JavascriptModalDialog.java", + ] + + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + + deps = [ + ":java_resources", + ":jni_headers", + "//base:base_java", + "//base:jni_java", + "//components/browser_ui/styles/android:java", + "//components/browser_ui/widget/android:java", + "//ui/android:ui_java", + ] +} + +android_resources("java_resources") { + custom_package = "org.chromium.components.app_modal" + resource_dirs = [ "java/res" ] + + deps = [ + ":app_modal_strings_grd", + "//components/browser_ui/strings/android:browser_ui_strings_grd", + "//components/browser_ui/styles/android:java_resources", + ] +} + +generate_jni("jni_headers") { + sources = [ + "java/src/org/chromium/components/app_modal/JavascriptAppModalDialog.java", + ] +} + +java_strings_grd("app_modal_strings_grd") { + grd_file = "app_modal_android_strings.grd" + outputs = [ "values/app_modal_android_strings.xml" ] + + process_file_template( + android_bundle_locales_as_resources, + [ "values-{{source_name_part}}/app_modal_android_strings.xml" ]) +}
diff --git a/components/app_modal/android/DEPS b/components/app_modal/android/DEPS new file mode 100644 index 0000000..d21e072 --- /dev/null +++ b/components/app_modal/android/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+ui/android", +]
diff --git a/components/app_modal/android/OWNERS b/components/app_modal/android/OWNERS new file mode 100644 index 0000000..eae57e0d --- /dev/null +++ b/components/app_modal/android/OWNERS
@@ -0,0 +1 @@ +file://ui/android/java/src/org/chromium/ui/modaldialog/OWNERS
diff --git a/components/app_modal/android/app_modal_android_strings.grd b/components/app_modal/android/app_modal_android_strings.grd new file mode 100644 index 0000000..f0a145e --- /dev/null +++ b/components/app_modal/android/app_modal_android_strings.grd
@@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> + +<grit latest_public_release="0" current_release="1" + output_all_resource_defines="false" source_lang_id="en" enc_check="möl"> + <outputs> + <output filename="values-af/app_modal_android_strings.xml" lang="af" type="android" /> + <output filename="values-am/app_modal_android_strings.xml" lang="am" type="android" /> + <output filename="values-ar/app_modal_android_strings.xml" lang="ar" type="android" /> + <output filename="values-as/app_modal_android_strings.xml" lang="as" type="android" /> + <output filename="values-az/app_modal_android_strings.xml" lang="az" type="android" /> + <output filename="values-be/app_modal_android_strings.xml" lang="be" type="android" /> + <output filename="values-bg/app_modal_android_strings.xml" lang="bg" type="android" /> + <output filename="values-bn/app_modal_android_strings.xml" lang="bn" type="android" /> + <output filename="values-bs/app_modal_android_strings.xml" lang="bs" type="android" /> + <output filename="values-ca/app_modal_android_strings.xml" lang="ca" type="android" /> + <output filename="values-cs/app_modal_android_strings.xml" lang="cs" type="android" /> + <output filename="values-da/app_modal_android_strings.xml" lang="da" type="android" /> + <output filename="values-de/app_modal_android_strings.xml" lang="de" type="android" /> + <output filename="values-el/app_modal_android_strings.xml" lang="el" type="android" /> + <output filename="values/app_modal_android_strings.xml" lang="en" type="android" /> + <output filename="values-en-rGB/app_modal_android_strings.xml" lang="en-GB" type="android" /> + <output filename="values-es/app_modal_android_strings.xml" lang="es" type="android" /> + <output filename="values-es-rUS/app_modal_android_strings.xml" lang="es-419" type="android" /> + <output filename="values-et/app_modal_android_strings.xml" lang="et" type="android" /> + <output filename="values-eu/app_modal_android_strings.xml" lang="eu" type="android" /> + <output filename="values-fa/app_modal_android_strings.xml" lang="fa" type="android" /> + <output filename="values-fi/app_modal_android_strings.xml" lang="fi" type="android" /> + <output filename="values-tl/app_modal_android_strings.xml" lang="fil" type="android" /> + <output filename="values-fr/app_modal_android_strings.xml" lang="fr" type="android" /> + <output filename="values-fr-rCA/app_modal_android_strings.xml" lang="fr-CA" type="android" /> + <output filename="values-gl/app_modal_android_strings.xml" lang="gl" type="android" /> + <output filename="values-gu/app_modal_android_strings.xml" lang="gu" type="android" /> + <output filename="values-hi/app_modal_android_strings.xml" lang="hi" type="android" /> + <output filename="values-hr/app_modal_android_strings.xml" lang="hr" type="android" /> + <output filename="values-hu/app_modal_android_strings.xml" lang="hu" type="android" /> + <output filename="values-hy/app_modal_android_strings.xml" lang="hy" type="android" /> + <output filename="values-in/app_modal_android_strings.xml" lang="id" type="android" /> + <output filename="values-is/app_modal_android_strings.xml" lang="is" type="android" /> + <output filename="values-it/app_modal_android_strings.xml" lang="it" type="android" /> + <output filename="values-iw/app_modal_android_strings.xml" lang="iw" type="android" /> + <output filename="values-ja/app_modal_android_strings.xml" lang="ja" type="android" /> + <output filename="values-ka/app_modal_android_strings.xml" lang="ka" type="android" /> + <output filename="values-kk/app_modal_android_strings.xml" lang="kk" type="android" /> + <output filename="values-km/app_modal_android_strings.xml" lang="km" type="android" /> + <output filename="values-kn/app_modal_android_strings.xml" lang="kn" type="android" /> + <output filename="values-ko/app_modal_android_strings.xml" lang="ko" type="android" /> + <output filename="values-ky/app_modal_android_strings.xml" lang="ky" type="android" /> + <output filename="values-lo/app_modal_android_strings.xml" lang="lo" type="android" /> + <output filename="values-lt/app_modal_android_strings.xml" lang="lt" type="android" /> + <output filename="values-lv/app_modal_android_strings.xml" lang="lv" type="android" /> + <output filename="values-mk/app_modal_android_strings.xml" lang="mk" type="android" /> + <output filename="values-ml/app_modal_android_strings.xml" lang="ml" type="android" /> + <output filename="values-mn/app_modal_android_strings.xml" lang="mn" type="android" /> + <output filename="values-mr/app_modal_android_strings.xml" lang="mr" type="android" /> + <output filename="values-ms/app_modal_android_strings.xml" lang="ms" type="android" /> + <output filename="values-my/app_modal_android_strings.xml" lang="my" type="android" /> + <output filename="values-ne/app_modal_android_strings.xml" lang="ne" type="android" /> + <output filename="values-nl/app_modal_android_strings.xml" lang="nl" type="android" /> + <output filename="values-nb/app_modal_android_strings.xml" lang="no" type="android" /> + <output filename="values-or/app_modal_android_strings.xml" lang="or" type="android" /> + <output filename="values-pa/app_modal_android_strings.xml" lang="pa" type="android" /> + <output filename="values-pl/app_modal_android_strings.xml" lang="pl" type="android" /> + <output filename="values-pt-rBR/app_modal_android_strings.xml" lang="pt-BR" type="android" /> + <output filename="values-pt-rPT/app_modal_android_strings.xml" lang="pt-PT" type="android" /> + <output filename="values-ro/app_modal_android_strings.xml" lang="ro" type="android" /> + <output filename="values-ru/app_modal_android_strings.xml" lang="ru" type="android" /> + <output filename="values-si/app_modal_android_strings.xml" lang="si" type="android" /> + <output filename="values-sk/app_modal_android_strings.xml" lang="sk" type="android" /> + <output filename="values-sl/app_modal_android_strings.xml" lang="sl" type="android" /> + <output filename="values-sq/app_modal_android_strings.xml" lang="sq" type="android" /> + <output filename="values-sr/app_modal_android_strings.xml" lang="sr" type="android" /> + <output filename="values-sv/app_modal_android_strings.xml" lang="sv" type="android" /> + <output filename="values-sw/app_modal_android_strings.xml" lang="sw" type="android" /> + <output filename="values-ta/app_modal_android_strings.xml" lang="ta" type="android" /> + <output filename="values-te/app_modal_android_strings.xml" lang="te" type="android" /> + <output filename="values-th/app_modal_android_strings.xml" lang="th" type="android" /> + <output filename="values-tr/app_modal_android_strings.xml" lang="tr" type="android" /> + <output filename="values-uk/app_modal_android_strings.xml" lang="uk" type="android" /> + <output filename="values-ur/app_modal_android_strings.xml" lang="ur" type="android" /> + <output filename="values-uz/app_modal_android_strings.xml" lang="uz" type="android" /> + <output filename="values-vi/app_modal_android_strings.xml" lang="vi" type="android" /> + <output filename="values-zh-rCN/app_modal_android_strings.xml" lang="zh-CN" type="android" /> + <output filename="values-zh-rTW/app_modal_android_strings.xml" lang="zh-TW" type="android" /> + <output filename="values-zu/app_modal_android_strings.xml" lang="zu" type="android" /> + </outputs> + <translations> + <file lang="af" path="translations/app_modal_android_strings_af.xtb" /> + <file lang="am" path="translations/app_modal_android_strings_am.xtb" /> + <file lang="ar" path="translations/app_modal_android_strings_ar.xtb" /> + <file lang="as" path="translations/app_modal_android_strings_as.xtb" /> + <file lang="az" path="translations/app_modal_android_strings_az.xtb" /> + <file lang="be" path="translations/app_modal_android_strings_be.xtb" /> + <file lang="bg" path="translations/app_modal_android_strings_bg.xtb" /> + <file lang="bn" path="translations/app_modal_android_strings_bn.xtb" /> + <file lang="bs" path="translations/app_modal_android_strings_bs.xtb" /> + <file lang="ca" path="translations/app_modal_android_strings_ca.xtb" /> + <file lang="cs" path="translations/app_modal_android_strings_cs.xtb" /> + <file lang="da" path="translations/app_modal_android_strings_da.xtb" /> + <file lang="de" path="translations/app_modal_android_strings_de.xtb" /> + <file lang="el" path="translations/app_modal_android_strings_el.xtb" /> + <file lang="en-GB" path="translations/app_modal_android_strings_en-GB.xtb" /> + <file lang="es" path="translations/app_modal_android_strings_es.xtb" /> + <file lang="es-419" path="translations/app_modal_android_strings_es-419.xtb" /> + <file lang="et" path="translations/app_modal_android_strings_et.xtb" /> + <file lang="eu" path="translations/app_modal_android_strings_eu.xtb" /> + <file lang="fa" path="translations/app_modal_android_strings_fa.xtb" /> + <file lang="fi" path="translations/app_modal_android_strings_fi.xtb" /> + <file lang="fil" path="translations/app_modal_android_strings_fil.xtb" /> + <file lang="fr" path="translations/app_modal_android_strings_fr.xtb" /> + <file lang="fr-CA" path="translations/app_modal_android_strings_fr-CA.xtb" /> + <file lang="gl" path="translations/app_modal_android_strings_gl.xtb" /> + <file lang="gu" path="translations/app_modal_android_strings_gu.xtb" /> + <file lang="hi" path="translations/app_modal_android_strings_hi.xtb" /> + <file lang="hr" path="translations/app_modal_android_strings_hr.xtb" /> + <file lang="hu" path="translations/app_modal_android_strings_hu.xtb" /> + <file lang="hy" path="translations/app_modal_android_strings_hy.xtb" /> + <file lang="id" path="translations/app_modal_android_strings_id.xtb" /> + <file lang="is" path="translations/app_modal_android_strings_is.xtb" /> + <file lang="it" path="translations/app_modal_android_strings_it.xtb" /> + <file lang="iw" path="translations/app_modal_android_strings_iw.xtb" /> + <file lang="ja" path="translations/app_modal_android_strings_ja.xtb" /> + <file lang="ka" path="translations/app_modal_android_strings_ka.xtb" /> + <file lang="kk" path="translations/app_modal_android_strings_kk.xtb" /> + <file lang="km" path="translations/app_modal_android_strings_km.xtb" /> + <file lang="kn" path="translations/app_modal_android_strings_kn.xtb" /> + <file lang="ko" path="translations/app_modal_android_strings_ko.xtb" /> + <file lang="ky" path="translations/app_modal_android_strings_ky.xtb" /> + <file lang="lo" path="translations/app_modal_android_strings_lo.xtb" /> + <file lang="lt" path="translations/app_modal_android_strings_lt.xtb" /> + <file lang="lv" path="translations/app_modal_android_strings_lv.xtb" /> + <file lang="mk" path="translations/app_modal_android_strings_mk.xtb" /> + <file lang="ml" path="translations/app_modal_android_strings_ml.xtb" /> + <file lang="mn" path="translations/app_modal_android_strings_mn.xtb" /> + <file lang="mr" path="translations/app_modal_android_strings_mr.xtb" /> + <file lang="ms" path="translations/app_modal_android_strings_ms.xtb" /> + <file lang="my" path="translations/app_modal_android_strings_my.xtb" /> + <file lang="ne" path="translations/app_modal_android_strings_ne.xtb" /> + <file lang="nl" path="translations/app_modal_android_strings_nl.xtb" /> + <file lang="no" path="translations/app_modal_android_strings_no.xtb" /> + <file lang="or" path="translations/app_modal_android_strings_or.xtb" /> + <file lang="pa" path="translations/app_modal_android_strings_pa.xtb" /> + <file lang="pl" path="translations/app_modal_android_strings_pl.xtb" /> + <file lang="pt-BR" path="translations/app_modal_android_strings_pt-BR.xtb" /> + <file lang="pt-PT" path="translations/app_modal_android_strings_pt-PT.xtb" /> + <file lang="ro" path="translations/app_modal_android_strings_ro.xtb" /> + <file lang="ru" path="translations/app_modal_android_strings_ru.xtb" /> + <file lang="si" path="translations/app_modal_android_strings_si.xtb" /> + <file lang="sk" path="translations/app_modal_android_strings_sk.xtb" /> + <file lang="sl" path="translations/app_modal_android_strings_sl.xtb" /> + <file lang="sq" path="translations/app_modal_android_strings_sq.xtb" /> + <file lang="sr" path="translations/app_modal_android_strings_sr.xtb" /> + <file lang="sv" path="translations/app_modal_android_strings_sv.xtb" /> + <file lang="sw" path="translations/app_modal_android_strings_sw.xtb" /> + <file lang="ta" path="translations/app_modal_android_strings_ta.xtb" /> + <file lang="te" path="translations/app_modal_android_strings_te.xtb" /> + <file lang="th" path="translations/app_modal_android_strings_th.xtb" /> + <file lang="tr" path="translations/app_modal_android_strings_tr.xtb" /> + <file lang="uk" path="translations/app_modal_android_strings_uk.xtb" /> + <file lang="ur" path="translations/app_modal_android_strings_ur.xtb" /> + <file lang="uz" path="translations/app_modal_android_strings_uz.xtb" /> + <file lang="vi" path="translations/app_modal_android_strings_vi.xtb" /> + <file lang="zh-CN" path="translations/app_modal_android_strings_zh-CN.xtb" /> + <file lang="zh-HK" path="translations/app_modal_android_strings_zh-HK.xtb" /> + <file lang="zh-TW" path="translations/app_modal_android_strings_zh-TW.xtb" /> + <file lang="zu" path="translations/app_modal_android_strings_zu.xtb" /> + </translations> + <release allow_pseudo="false" seq="1"> + <messages fallback_to_english="true"> + <!-- These are copied from app_modal_strings.grdp. It would be better to share, but app_modal_strings.grdp are part of the monolithic components_strings_grd target, and depending on that pulls in lots of unnecessary strings, causing UnusedResource errors. --> + <message name="IDS_LEAVE" desc="Dialog button to leave the current page and navigate to a new page. [CHAR-LIMIT=20]"> + Leave + </message> + <message name="IDS_SUPPRESS_JS_MODAL_DIALOGS" desc="Checkbox allowing users to forgo additional prompts from a web page."> + Prevent this page from creating additional dialogs + </message> + </messages> + </release> +</grit>
diff --git a/chrome/android/java/res/layout/js_modal_dialog.xml b/components/app_modal/android/java/res/layout/js_modal_dialog.xml similarity index 85% rename from chrome/android/java/res/layout/js_modal_dialog.xml rename to components/app_modal/android/java/res/layout/js_modal_dialog.xml index 8f412ab..147c117 100644 --- a/chrome/android/java/res/layout/js_modal_dialog.xml +++ b/components/app_modal/android/java/res/layout/js_modal_dialog.xml
@@ -8,12 +8,12 @@ need (alerts, confirms and prompts). After inflating this layout, we remove the widgets that aren't needed for the current dialog type. --> -<org.chromium.chrome.browser.jsdialog.JavascriptDialogCustomView +<org.chromium.components.app_modal.JavascriptDialogCustomView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/AlertDialogContent" android:orientation="vertical"> - <org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText + <org.chromium.components.browser_ui.widget.text.AlertDialogEditText android:id="@+id/js_modal_dialog_prompt" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -30,4 +30,4 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:text="@string/suppress_js_modal_dialogs" /> -</org.chromium.chrome.browser.jsdialog.JavascriptDialogCustomView> +</org.chromium.components.app_modal.JavascriptDialogCustomView>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialog.java b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptAppModalDialog.java similarity index 91% rename from chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialog.java rename to components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptAppModalDialog.java index f3db822..b71c23da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialog.java +++ b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptAppModalDialog.java
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.jsdialog; +package org.chromium.components.app_modal; + +import android.content.Context; import androidx.annotation.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; @@ -18,6 +19,7 @@ * A dialog shown via JavaScript. This can be an alert dialog, a prompt dialog, a confirm dialog, * or an onbeforeunload dialog. */ +@JNINamespace("app_modal") public class JavascriptAppModalDialog extends JavascriptModalDialog { private long mNativeDialogPointer; @@ -62,9 +64,9 @@ @CalledByNative void showJavascriptAppModalDialog(WindowAndroid window, long nativeDialogPointer) { assert window != null; - ChromeActivity activity = (ChromeActivity) window.getActivity().get(); - // If the activity has gone away, then just clean up the native pointer. - if (activity == null) { + Context context = window.getContext().get(); + // If the context has gone away, then just clean up the native pointer. + if (context == null) { JavascriptAppModalDialogJni.get().didCancelAppModalDialog( nativeDialogPointer, JavascriptAppModalDialog.this, false); return; @@ -72,7 +74,7 @@ // Cache the native dialog pointer so that we can use it to return the response. mNativeDialogPointer = nativeDialogPointer; - show(activity, ModalDialogManager.ModalDialogType.APP); + show(context, window.getModalDialogManager(), ModalDialogManager.ModalDialogType.APP); } @CalledByNative
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptDialogCustomView.java b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptDialogCustomView.java similarity index 96% rename from chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptDialogCustomView.java rename to components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptDialogCustomView.java index 9d126f9d..a64ff43 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptDialogCustomView.java +++ b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptDialogCustomView.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.jsdialog; +package org.chromium.components.app_modal; import android.content.Context; import android.util.AttributeSet; @@ -13,8 +13,6 @@ import androidx.annotation.Nullable; -import org.chromium.chrome.R; - /** * The JavaScript dialog that is either app modal or tab modal. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptModalDialog.java similarity index 91% rename from chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java rename to components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptModalDialog.java index d3fe649..47571911 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java +++ b/components/app_modal/android/java/src/org/chromium/components/app_modal/JavascriptModalDialog.java
@@ -2,16 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.jsdialog; +package org.chromium.components.app_modal; +import android.content.Context; import android.content.res.Resources; import android.view.LayoutInflater; import androidx.annotation.StringRes; import org.chromium.base.Log; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -47,17 +46,18 @@ /** * Showing a modal dialog for a JavaScript popup with the specified dialog type. - * @param activity The {@link ChromeActivity} that this dialog is shown upon. + * @param context The {@link Context} that this dialog is shown upon. * @param dialogType The {@link ModalDialogManager.ModalDialogType} of the dialog. */ - protected void show( - ChromeActivity activity, @ModalDialogManager.ModalDialogType int dialogType) { - mDialogCustomView = (JavascriptDialogCustomView) LayoutInflater.from(activity).inflate( + protected void show(Context context, ModalDialogManager manager, + @ModalDialogManager.ModalDialogType int dialogType) { + assert manager != null; + mDialogCustomView = (JavascriptDialogCustomView) LayoutInflater.from(context).inflate( R.layout.js_modal_dialog, null); mDialogCustomView.setPromptText(mDefaultPromptText); mDialogCustomView.setSuppressCheckBoxVisibility(mShouldShowSuppressCheckBox); - Resources resources = activity.getResources(); + Resources resources = context.getResources(); mDialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) .with(ModalDialogProperties.CONTROLLER, this) @@ -71,7 +71,7 @@ .with(ModalDialogProperties.TITLE_SCROLLABLE, true) .build(); - mModalDialogManager = activity.getModalDialogManager(); + mModalDialogManager = manager; mModalDialogManager.showDialog(mDialogModel, dialogType); }
diff --git a/chrome/browser/ui/android/javascript_app_modal_dialog_android.cc b/components/app_modal/android/javascript_app_modal_dialog_android.cc similarity index 75% rename from chrome/browser/ui/android/javascript_app_modal_dialog_android.cc rename to components/app_modal/android/javascript_app_modal_dialog_android.cc index 62d6b396c..a190abe1 100644 --- a/chrome/browser/ui/android/javascript_app_modal_dialog_android.cc +++ b/components/app_modal/android/javascript_app_modal_dialog_android.cc
@@ -2,16 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/android/javascript_app_modal_dialog_android.h" +#include "components/app_modal/android/javascript_app_modal_dialog_android.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" -#include "chrome/android/chrome_jni_headers/JavascriptAppModalDialog_jni.h" -#include "chrome/browser/android/tab_android.h" -#include "chrome/browser/ui/javascript_dialogs/chrome_javascript_native_app_modal_dialog_factory.h" +#include "components/app_modal/android/jni_headers/JavascriptAppModalDialog_jni.h" #include "components/app_modal/app_modal_dialog_queue.h" #include "components/app_modal/javascript_app_modal_dialog.h" #include "components/app_modal/javascript_dialog_manager.h" @@ -28,72 +26,17 @@ using base::android::ScopedJavaGlobalRef; using base::android::ScopedJavaLocalRef; +namespace app_modal { + JavascriptAppModalDialogAndroid::JavascriptAppModalDialogAndroid( JNIEnv* env, app_modal::JavaScriptAppModalDialog* dialog, gfx::NativeWindow parent) : dialog_(dialog), - parent_jobject_weak_ref_(env, parent->GetJavaObject().obj()) { -} + parent_jobject_weak_ref_(env, parent->GetJavaObject().obj()) {} void JavascriptAppModalDialogAndroid::ShowAppModalDialog() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - JNIEnv* env = AttachCurrentThread(); - // Keep a strong ref to the parent window while we make the call to java to - // display the dialog. - ScopedJavaLocalRef<jobject> parent_jobj = parent_jobject_weak_ref_.get(env); - - TabAndroid* tab = TabAndroid::FromWebContents(dialog_->web_contents()); - if (parent_jobj.is_null() || !tab) { - CancelAppModalDialog(); - return; - } - - ScopedJavaLocalRef<jobject> dialog_object; - ScopedJavaLocalRef<jstring> title = - ConvertUTF16ToJavaString(env, dialog_->title()); - ScopedJavaLocalRef<jstring> message = - ConvertUTF16ToJavaString(env, dialog_->message_text()); - - bool foremost = tab->IsUserInteractable(); - switch (dialog_->javascript_dialog_type()) { - case content::JAVASCRIPT_DIALOG_TYPE_ALERT: { - UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Alert", foremost); - dialog_object = Java_JavascriptAppModalDialog_createAlertDialog( - env, title, message, dialog_->display_suppress_checkbox()); - break; - } - case content::JAVASCRIPT_DIALOG_TYPE_CONFIRM: { - if (dialog_->is_before_unload_dialog()) { - dialog_object = Java_JavascriptAppModalDialog_createBeforeUnloadDialog( - env, title, message, dialog_->is_reload(), - dialog_->display_suppress_checkbox()); - } else { - UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Confirm", foremost); - dialog_object = Java_JavascriptAppModalDialog_createConfirmDialog( - env, title, message, dialog_->display_suppress_checkbox()); - } - break; - } - case content::JAVASCRIPT_DIALOG_TYPE_PROMPT: { - UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Prompt", foremost); - ScopedJavaLocalRef<jstring> default_prompt_text = - ConvertUTF16ToJavaString(env, dialog_->default_prompt_text()); - dialog_object = Java_JavascriptAppModalDialog_createPromptDialog( - env, title, message, dialog_->display_suppress_checkbox(), - default_prompt_text); - break; - } - default: - NOTREACHED(); - } - - // Keep a ref to the java side object until we get a confirm or cancel. - dialog_jobject_.Reset(dialog_object); - - Java_JavascriptAppModalDialog_showJavascriptAppModalDialog( - env, dialog_object, parent_jobj, reinterpret_cast<intptr_t>(this)); + DoShowAppModalDialog(true); } void JavascriptAppModalDialogAndroid::ActivateAppModalDialog() { @@ -139,10 +82,79 @@ } const ScopedJavaGlobalRef<jobject>& - JavascriptAppModalDialogAndroid::GetDialogObject() const { +JavascriptAppModalDialogAndroid::GetDialogObject() const { return dialog_jobject_; } +void JavascriptAppModalDialogAndroid::DoShowAppModalDialog( + bool is_web_contents_foremost) { + JNIEnv* env = AttachCurrentThread(); + // Keep a strong ref to the parent window while we make the call to java to + // display the dialog. + ScopedJavaLocalRef<jobject> parent_jobj = parent_jobject_weak_ref_.get(env); + if (parent_jobj.is_null()) { + CancelAppModalDialog(); + return; + } + + ScopedJavaLocalRef<jobject> dialog_object; + ScopedJavaLocalRef<jstring> title = + ConvertUTF16ToJavaString(env, dialog_->title()); + ScopedJavaLocalRef<jstring> message = + ConvertUTF16ToJavaString(env, dialog_->message_text()); + + switch (dialog_->javascript_dialog_type()) { + case content::JAVASCRIPT_DIALOG_TYPE_ALERT: { + UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Alert", + is_web_contents_foremost); + dialog_object = Java_JavascriptAppModalDialog_createAlertDialog( + env, title, message, dialog_->display_suppress_checkbox()); + break; + } + case content::JAVASCRIPT_DIALOG_TYPE_CONFIRM: { + if (dialog_->is_before_unload_dialog()) { + dialog_object = Java_JavascriptAppModalDialog_createBeforeUnloadDialog( + env, title, message, dialog_->is_reload(), + dialog_->display_suppress_checkbox()); + } else { + UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Confirm", + is_web_contents_foremost); + dialog_object = Java_JavascriptAppModalDialog_createConfirmDialog( + env, title, message, dialog_->display_suppress_checkbox()); + } + break; + } + case content::JAVASCRIPT_DIALOG_TYPE_PROMPT: { + UMA_HISTOGRAM_BOOLEAN("JSDialogs.IsForemost.Prompt", + is_web_contents_foremost); + ScopedJavaLocalRef<jstring> default_prompt_text = + ConvertUTF16ToJavaString(env, dialog_->default_prompt_text()); + dialog_object = Java_JavascriptAppModalDialog_createPromptDialog( + env, title, message, dialog_->display_suppress_checkbox(), + default_prompt_text); + break; + } + default: + NOTREACHED(); + } + + // Keep a ref to the java side object until we get a confirm or cancel. + dialog_jobject_.Reset(dialog_object); + + Java_JavascriptAppModalDialog_showJavascriptAppModalDialog( + env, dialog_object, parent_jobj, reinterpret_cast<intptr_t>(this)); +} + +JavascriptAppModalDialogAndroid::~JavascriptAppModalDialogAndroid() { + // In case the dialog is still displaying, tell it to close itself. + // This can happen if you trigger a dialog but close the Tab before it's + // shown, and then accept the dialog. + if (!dialog_jobject_.is_null()) { + JNIEnv* env = AttachCurrentThread(); + Java_JavascriptAppModalDialog_dismiss(env, dialog_jobject_); + } +} + // static ScopedJavaLocalRef<jobject> JNI_JavascriptAppModalDialog_GetCurrentModalDialog( JNIEnv* env) { @@ -156,40 +168,4 @@ return ScopedJavaLocalRef<jobject>(js_dialog->GetDialogObject()); } -JavascriptAppModalDialogAndroid::~JavascriptAppModalDialogAndroid() { - // In case the dialog is still displaying, tell it to close itself. - // This can happen if you trigger a dialog but close the Tab before it's - // shown, and then accept the dialog. - if (!dialog_jobject_.is_null()) { - JNIEnv* env = AttachCurrentThread(); - Java_JavascriptAppModalDialog_dismiss(env, dialog_jobject_); - } -} - -namespace { - -class ChromeJavaScriptNativeDialogAndroidFactory - : public app_modal::JavaScriptNativeDialogFactory { - public: - ChromeJavaScriptNativeDialogAndroidFactory() {} - ~ChromeJavaScriptNativeDialogAndroidFactory() override {} - - private: - app_modal::NativeAppModalDialog* CreateNativeJavaScriptDialog( - app_modal::JavaScriptAppModalDialog* dialog) override { - dialog->web_contents()->GetDelegate()->ActivateContents( - dialog->web_contents()); - return new JavascriptAppModalDialogAndroid( - base::android::AttachCurrentThread(), - dialog, dialog->web_contents()->GetTopLevelNativeWindow()); - } - - DISALLOW_COPY_AND_ASSIGN(ChromeJavaScriptNativeDialogAndroidFactory); -}; - -} // namespace - -void InstallChromeJavaScriptNativeAppModalDialogFactory() { - app_modal::JavaScriptDialogManager::GetInstance()->SetNativeDialogFactory( - base::WrapUnique(new ChromeJavaScriptNativeDialogAndroidFactory)); -} +} // namespace app_modal
diff --git a/chrome/browser/ui/android/javascript_app_modal_dialog_android.h b/components/app_modal/android/javascript_app_modal_dialog_android.h similarity index 68% rename from chrome/browser/ui/android/javascript_app_modal_dialog_android.h rename to components/app_modal/android/javascript_app_modal_dialog_android.h index 82871b2..db378cb4 100644 --- a/chrome/browser/ui/android/javascript_app_modal_dialog_android.h +++ b/components/app_modal/android/javascript_app_modal_dialog_android.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ -#define CHROME_BROWSER_UI_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ +#ifndef COMPONENTS_APP_MODAL_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ +#define COMPONENTS_APP_MODAL_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ #include <memory> @@ -14,16 +14,14 @@ #include "ui/gfx/native_widget_types.h" namespace app_modal { -class JavaScriptAppModalDialog; -} -class JavascriptAppModalDialogAndroid - : public app_modal::NativeAppModalDialog { +class JavaScriptAppModalDialog; + +class JavascriptAppModalDialogAndroid : public NativeAppModalDialog { public: - JavascriptAppModalDialogAndroid( - JNIEnv* env, - app_modal::JavaScriptAppModalDialog* dialog, - gfx::NativeWindow parent); + JavascriptAppModalDialogAndroid(JNIEnv* env, + JavaScriptAppModalDialog* dialog, + gfx::NativeWindow parent); // NativeAppModalDialog: void ShowAppModalDialog() override; @@ -45,16 +43,21 @@ const base::android::ScopedJavaGlobalRef<jobject>& GetDialogObject() const; - private: - // The object deletes itself. + protected: + void DoShowAppModalDialog(bool is_web_contents_foremost); + + JavaScriptAppModalDialog* dialog() { return dialog_.get(); } + ~JavascriptAppModalDialogAndroid() override; - std::unique_ptr<app_modal::JavaScriptAppModalDialog> dialog_; + private: + std::unique_ptr<JavaScriptAppModalDialog> dialog_; base::android::ScopedJavaGlobalRef<jobject> dialog_jobject_; JavaObjectWeakGlobalRef parent_jobject_weak_ref_; DISALLOW_COPY_AND_ASSIGN(JavascriptAppModalDialogAndroid); }; +} // namespace app_modal -#endif // CHROME_BROWSER_UI_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_ +#endif // COMPONENTS_APP_MODAL_ANDROID_JAVASCRIPT_APP_MODAL_DIALOG_ANDROID_H_
diff --git a/components/app_modal/android/translations/app_modal_android_strings_af.xtb b/components/app_modal/android/translations/app_modal_android_strings_af.xtb new file mode 100644 index 0000000..0861004 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_af.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="af"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_am.xtb b/components/app_modal/android/translations/app_modal_android_strings_am.xtb new file mode 100644 index 0000000..6c985cb8 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_am.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="am"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ar.xtb b/components/app_modal/android/translations/app_modal_android_strings_ar.xtb new file mode 100644 index 0000000..e8b5562 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ar.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ar"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_as.xtb b/components/app_modal/android/translations/app_modal_android_strings_as.xtb new file mode 100644 index 0000000..3ad7206d --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_as.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="as"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_az.xtb b/components/app_modal/android/translations/app_modal_android_strings_az.xtb new file mode 100644 index 0000000..6d09f4cd --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_az.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="az"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_be.xtb b/components/app_modal/android/translations/app_modal_android_strings_be.xtb new file mode 100644 index 0000000..09e9a3ad --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_be.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="be"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_bg.xtb b/components/app_modal/android/translations/app_modal_android_strings_bg.xtb new file mode 100644 index 0000000..ebab473 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_bg.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bg"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_bn.xtb b/components/app_modal/android/translations/app_modal_android_strings_bn.xtb new file mode 100644 index 0000000..a66cc1fc --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_bn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bn"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_bs.xtb b/components/app_modal/android/translations/app_modal_android_strings_bs.xtb new file mode 100644 index 0000000..7b6fabc --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_bs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bs"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ca.xtb b/components/app_modal/android/translations/app_modal_android_strings_ca.xtb new file mode 100644 index 0000000..1438d89 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ca.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ca"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_cs.xtb b/components/app_modal/android/translations/app_modal_android_strings_cs.xtb new file mode 100644 index 0000000..2d95130 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_cs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="cs"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_da.xtb b/components/app_modal/android/translations/app_modal_android_strings_da.xtb new file mode 100644 index 0000000..751fa4a8 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_da.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="da"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_de.xtb b/components/app_modal/android/translations/app_modal_android_strings_de.xtb new file mode 100644 index 0000000..91de7f51 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_de.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="de"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_el.xtb b/components/app_modal/android/translations/app_modal_android_strings_el.xtb new file mode 100644 index 0000000..6e5e7d8 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_el.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="el"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_en-GB.xtb b/components/app_modal/android/translations/app_modal_android_strings_en-GB.xtb new file mode 100644 index 0000000..0fb2133 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_en-GB.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="en-GB"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_es-419.xtb b/components/app_modal/android/translations/app_modal_android_strings_es-419.xtb new file mode 100644 index 0000000..2fe4770 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_es-419.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es-419"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_es.xtb b/components/app_modal/android/translations/app_modal_android_strings_es.xtb new file mode 100644 index 0000000..64022ec --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_es.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_et.xtb b/components/app_modal/android/translations/app_modal_android_strings_et.xtb new file mode 100644 index 0000000..5244dfd --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_et.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="et"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_eu.xtb b/components/app_modal/android/translations/app_modal_android_strings_eu.xtb new file mode 100644 index 0000000..981c85fb --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_eu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="eu"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_fa.xtb b/components/app_modal/android/translations/app_modal_android_strings_fa.xtb new file mode 100644 index 0000000..18626f8 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_fa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fa"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_fi.xtb b/components/app_modal/android/translations/app_modal_android_strings_fi.xtb new file mode 100644 index 0000000..4691cd5 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_fi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fi"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_fil.xtb b/components/app_modal/android/translations/app_modal_android_strings_fil.xtb new file mode 100644 index 0000000..443630e7 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_fil.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fil"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_fr-CA.xtb b/components/app_modal/android/translations/app_modal_android_strings_fr-CA.xtb new file mode 100644 index 0000000..6330f524 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_fr-CA.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr-CA"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_fr.xtb b/components/app_modal/android/translations/app_modal_android_strings_fr.xtb new file mode 100644 index 0000000..63026a3 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_fr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_gl.xtb b/components/app_modal/android/translations/app_modal_android_strings_gl.xtb new file mode 100644 index 0000000..ad1197a --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_gl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gl"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_gu.xtb b/components/app_modal/android/translations/app_modal_android_strings_gu.xtb new file mode 100644 index 0000000..7d8a4df1 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_gu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gu"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_hi.xtb b/components/app_modal/android/translations/app_modal_android_strings_hi.xtb new file mode 100644 index 0000000..a6ddd5d --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_hi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hi"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_hr.xtb b/components/app_modal/android/translations/app_modal_android_strings_hr.xtb new file mode 100644 index 0000000..26f99d0 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_hr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hr"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_hu.xtb b/components/app_modal/android/translations/app_modal_android_strings_hu.xtb new file mode 100644 index 0000000..7ef9a5e0 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_hu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hu"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_hy.xtb b/components/app_modal/android/translations/app_modal_android_strings_hy.xtb new file mode 100644 index 0000000..2ae4ee1 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_hy.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hy"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_id.xtb b/components/app_modal/android/translations/app_modal_android_strings_id.xtb new file mode 100644 index 0000000..aa34783 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_id.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="id"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_is.xtb b/components/app_modal/android/translations/app_modal_android_strings_is.xtb new file mode 100644 index 0000000..b93d5071 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_is.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="is"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_it.xtb b/components/app_modal/android/translations/app_modal_android_strings_it.xtb new file mode 100644 index 0000000..a6ac8d46 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_it.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="it"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_iw.xtb b/components/app_modal/android/translations/app_modal_android_strings_iw.xtb new file mode 100644 index 0000000..86b5533 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_iw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="iw"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ja.xtb b/components/app_modal/android/translations/app_modal_android_strings_ja.xtb new file mode 100644 index 0000000..23139e6 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ja.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ja"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ka.xtb b/components/app_modal/android/translations/app_modal_android_strings_ka.xtb new file mode 100644 index 0000000..57c55dd --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ka.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ka"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_kk.xtb b/components/app_modal/android/translations/app_modal_android_strings_kk.xtb new file mode 100644 index 0000000..84420c1 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_kk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kk"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_km.xtb b/components/app_modal/android/translations/app_modal_android_strings_km.xtb new file mode 100644 index 0000000..fe55255 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_km.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="km"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_kn.xtb b/components/app_modal/android/translations/app_modal_android_strings_kn.xtb new file mode 100644 index 0000000..cc3643a2 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_kn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kn"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ko.xtb b/components/app_modal/android/translations/app_modal_android_strings_ko.xtb new file mode 100644 index 0000000..e0fc370 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ko.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ko"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ky.xtb b/components/app_modal/android/translations/app_modal_android_strings_ky.xtb new file mode 100644 index 0000000..71a0883 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ky.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ky"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_lo.xtb b/components/app_modal/android/translations/app_modal_android_strings_lo.xtb new file mode 100644 index 0000000..eb6216c --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_lo.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lo"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_lt.xtb b/components/app_modal/android/translations/app_modal_android_strings_lt.xtb new file mode 100644 index 0000000..5804ae2a --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_lt.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lt"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_lv.xtb b/components/app_modal/android/translations/app_modal_android_strings_lv.xtb new file mode 100644 index 0000000..a0a1c477 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_lv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lv"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_mk.xtb b/components/app_modal/android/translations/app_modal_android_strings_mk.xtb new file mode 100644 index 0000000..2949071 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_mk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mk"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ml.xtb b/components/app_modal/android/translations/app_modal_android_strings_ml.xtb new file mode 100644 index 0000000..f7db315 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ml.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ml"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_mn.xtb b/components/app_modal/android/translations/app_modal_android_strings_mn.xtb new file mode 100644 index 0000000..a2218675 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_mn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mn"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_mr.xtb b/components/app_modal/android/translations/app_modal_android_strings_mr.xtb new file mode 100644 index 0000000..098d29c --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_mr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mr"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ms.xtb b/components/app_modal/android/translations/app_modal_android_strings_ms.xtb new file mode 100644 index 0000000..1fb470a --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ms.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ms"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_my.xtb b/components/app_modal/android/translations/app_modal_android_strings_my.xtb new file mode 100644 index 0000000..674ca27 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_my.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="my"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ne.xtb b/components/app_modal/android/translations/app_modal_android_strings_ne.xtb new file mode 100644 index 0000000..30c7e065 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ne.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ne"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_nl.xtb b/components/app_modal/android/translations/app_modal_android_strings_nl.xtb new file mode 100644 index 0000000..e782410 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_nl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="nl"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_no.xtb b/components/app_modal/android/translations/app_modal_android_strings_no.xtb new file mode 100644 index 0000000..913638b --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_no.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="no"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_or.xtb b/components/app_modal/android/translations/app_modal_android_strings_or.xtb new file mode 100644 index 0000000..fe2ddbc9 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_or.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="or"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_pa.xtb b/components/app_modal/android/translations/app_modal_android_strings_pa.xtb new file mode 100644 index 0000000..5c7ac50 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_pa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pa"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_pl.xtb b/components/app_modal/android/translations/app_modal_android_strings_pl.xtb new file mode 100644 index 0000000..4519e3d --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_pl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pl"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_pt-BR.xtb b/components/app_modal/android/translations/app_modal_android_strings_pt-BR.xtb new file mode 100644 index 0000000..e95eb56b --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_pt-BR.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-BR"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_pt-PT.xtb b/components/app_modal/android/translations/app_modal_android_strings_pt-PT.xtb new file mode 100644 index 0000000..1dcf557a --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_pt-PT.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-PT"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ro.xtb b/components/app_modal/android/translations/app_modal_android_strings_ro.xtb new file mode 100644 index 0000000..9e43493 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ro.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ro"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ru.xtb b/components/app_modal/android/translations/app_modal_android_strings_ru.xtb new file mode 100644 index 0000000..c4a621b --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ru.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ru"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_si.xtb b/components/app_modal/android/translations/app_modal_android_strings_si.xtb new file mode 100644 index 0000000..712d890 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_si.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="si"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sk.xtb b/components/app_modal/android/translations/app_modal_android_strings_sk.xtb new file mode 100644 index 0000000..00750d31 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sk"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sl.xtb b/components/app_modal/android/translations/app_modal_android_strings_sl.xtb new file mode 100644 index 0000000..489b7e46 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sl"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sq.xtb b/components/app_modal/android/translations/app_modal_android_strings_sq.xtb new file mode 100644 index 0000000..3fecfc5 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sq.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sq"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sr.xtb b/components/app_modal/android/translations/app_modal_android_strings_sr.xtb new file mode 100644 index 0000000..38f6f35 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sr"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sv.xtb b/components/app_modal/android/translations/app_modal_android_strings_sv.xtb new file mode 100644 index 0000000..ddea3dc --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sv"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_sw.xtb b/components/app_modal/android/translations/app_modal_android_strings_sw.xtb new file mode 100644 index 0000000..b775088 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_sw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sw"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ta.xtb b/components/app_modal/android/translations/app_modal_android_strings_ta.xtb new file mode 100644 index 0000000..ef90687 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ta.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ta"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_te.xtb b/components/app_modal/android/translations/app_modal_android_strings_te.xtb new file mode 100644 index 0000000..48c714b --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_te.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="te"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_th.xtb b/components/app_modal/android/translations/app_modal_android_strings_th.xtb new file mode 100644 index 0000000..fae31966 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_th.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="th"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_tr.xtb b/components/app_modal/android/translations/app_modal_android_strings_tr.xtb new file mode 100644 index 0000000..9a29951 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_tr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="tr"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_uk.xtb b/components/app_modal/android/translations/app_modal_android_strings_uk.xtb new file mode 100644 index 0000000..f0db52c --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_uk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uk"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_ur.xtb b/components/app_modal/android/translations/app_modal_android_strings_ur.xtb new file mode 100644 index 0000000..ffd34cf8 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_ur.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ur"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_uz.xtb b/components/app_modal/android/translations/app_modal_android_strings_uz.xtb new file mode 100644 index 0000000..1d58ed4c --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_uz.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uz"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_vi.xtb b/components/app_modal/android/translations/app_modal_android_strings_vi.xtb new file mode 100644 index 0000000..b2957da --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_vi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="vi"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_zh-CN.xtb b/components/app_modal/android/translations/app_modal_android_strings_zh-CN.xtb new file mode 100644 index 0000000..26e8b40 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_zh-CN.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-CN"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_zh-HK.xtb b/components/app_modal/android/translations/app_modal_android_strings_zh-HK.xtb new file mode 100644 index 0000000..3ecd9e3 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_zh-HK.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-HK"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_zh-TW.xtb b/components/app_modal/android/translations/app_modal_android_strings_zh-TW.xtb new file mode 100644 index 0000000..935ef485 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_zh-TW.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-TW"> +</translationbundle>
diff --git a/components/app_modal/android/translations/app_modal_android_strings_zu.xtb b/components/app_modal/android/translations/app_modal_android_strings_zu.xtb new file mode 100644 index 0000000..f9c1cd3 --- /dev/null +++ b/components/app_modal/android/translations/app_modal_android_strings_zu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zu"> +</translationbundle>
diff --git a/components/arc/midis/arc_midis_bridge.cc b/components/arc/midis/arc_midis_bridge.cc index 4972701..a0edd30 100644 --- a/components/arc/midis/arc_midis_bridge.cc +++ b/components/arc/midis/arc_midis_bridge.cc
@@ -12,6 +12,7 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "components/arc/arc_browser_context_keyed_service_factory_base.h" #include "components/arc/session/arc_bridge_service.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/platform/platform_channel.h" #include "mojo/public/cpp/system/invitation.h" @@ -61,22 +62,22 @@ bool result) { if (!result) { LOG(ERROR) << "ArcMidisBridge had a failure in D-Bus with the daemon."; - midis_host_ptr_.reset(); + midis_host_remote_.reset(); return; } - if (!midis_host_ptr_) { + if (!midis_host_remote_) { VLOG(1) << "ArcMidisBridge was already lost."; return; } DVLOG(1) << "ArcMidisBridge succeeded with Mojo bootstrapping."; - midis_host_ptr_->Connect(std::move(request), std::move(client_ptr)); + midis_host_remote_->Connect(std::move(request), std::move(client_ptr)); } void ArcMidisBridge::Connect(mojom::MidisServerRequest request, mojom::MidisClientPtr client_ptr) { - if (midis_host_ptr_.is_bound()) { + if (midis_host_remote_.is_bound()) { DVLOG(1) << "Re-using bootstrap connection for MidisServer Connect."; - midis_host_ptr_->Connect(std::move(request), std::move(client_ptr)); + midis_host_remote_->Connect(std::move(request), std::move(client_ptr)); return; } DVLOG(1) << "Bootstrapping the Midis connection via D-Bus."; @@ -88,11 +89,12 @@ base::kNullProcessHandle, channel.TakeLocalEndpoint()); - midis_host_ptr_.Bind( - mojo::InterfacePtrInfo<mojom::MidisHost>(std::move(server_pipe), 0u)); + midis_host_remote_.reset(); + midis_host_remote_.Bind( + mojo::PendingRemote<mojom::MidisHost>(std::move(server_pipe), 0u)); DVLOG(1) << "Bound remote MidisHost interface to pipe."; - midis_host_ptr_.set_connection_error_handler(base::BindOnce( + midis_host_remote_.set_disconnect_handler(base::BindOnce( &ArcMidisBridge::OnMojoConnectionError, weak_factory_.GetWeakPtr())); chromeos::DBusThreadManager::Get() ->GetArcMidisClient() @@ -105,7 +107,7 @@ void ArcMidisBridge::OnMojoConnectionError() { LOG(ERROR) << "ArcMidisBridge Mojo connection lost."; - midis_host_ptr_.reset(); + midis_host_remote_.reset(); } } // namespace arc
diff --git a/components/arc/midis/arc_midis_bridge.h b/components/arc/midis/arc_midis_bridge.h index 2e49a602..6bfcf7b 100644 --- a/components/arc/midis/arc_midis_bridge.h +++ b/components/arc/midis/arc_midis_bridge.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "components/arc/mojom/midis.mojom.h" #include "components/keyed_service/core/keyed_service.h" +#include "mojo/public/cpp/bindings/remote.h" namespace content { class BrowserContext; @@ -43,7 +44,7 @@ void OnMojoConnectionError(); ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager. - mojom::MidisHostPtr midis_host_ptr_; + mojo::Remote<mojom::MidisHost> midis_host_remote_; // WeakPtrFactory to use for callbacks. base::WeakPtrFactory<ArcMidisBridge> weak_factory_{this};
diff --git a/components/arc/mojom/auth.mojom b/components/arc/mojom/auth.mojom index 2c15b142..984164a 100644 --- a/components/arc/mojom/auth.mojom +++ b/components/arc/mojom/auth.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Next MinVersion: 24 +// Next MinVersion: 23 module arc.mojom; @@ -256,7 +256,7 @@ string gaia_id; }; -// Next Method ID: 19. +// Next Method ID: 18. interface AuthHost { // Notifies Chrome that the authorization flow is completed and provides // resulting |status|. If |initial_signin| is true then this indicates that @@ -294,13 +294,6 @@ [MinVersion=13] ReportSupervisionChangeStatus@11( SupervisionChangeStatus status); - // Returns the primary account from Chrome. - // |account_name| is the email address of the primary account for consumer and - // managed Gaia accounts and empty for all other cases (like demo sessions, - // Active Directory sessions, etc). - [MinVersion=23] RequestPrimaryAccount@18() - => (string account_name, ChromeAccountType account_type); - // Requests an authorization code, as well as the account information for the // Primary/Device Account in Chrome OS Account Manager. // This is called for ARC's initial provisioning flow.
diff --git a/components/arc/session/arc_bridge_host_impl.cc b/components/arc/session/arc_bridge_host_impl.cc index 01c42b1..82097b7c 100644 --- a/components/arc/session/arc_bridge_host_impl.cc +++ b/components/arc/session/arc_bridge_host_impl.cc
@@ -67,14 +67,15 @@ namespace arc { -ArcBridgeHostImpl::ArcBridgeHostImpl(ArcBridgeService* arc_bridge_service, - mojom::ArcBridgeInstancePtr instance) +ArcBridgeHostImpl::ArcBridgeHostImpl( + ArcBridgeService* arc_bridge_service, + mojo::PendingRemote<mojom::ArcBridgeInstance> instance) : arc_bridge_service_(arc_bridge_service), receiver_(this), instance_(std::move(instance)) { DCHECK(arc_bridge_service_); DCHECK(instance_.is_bound()); - instance_.set_connection_error_handler( + instance_.set_disconnect_handler( base::BindOnce(&ArcBridgeHostImpl::OnClosed, base::Unretained(this))); mojom::ArcBridgeHostPtr host_proxy; receiver_.Bind(mojo::MakeRequest(&host_proxy)); @@ -232,7 +233,7 @@ mojom::NotificationsInstancePtr notifications_ptr) { // Forward notification instance to ash. ash::ArcNotificationsHostInitializer::Get()->SetArcNotificationsInstance( - std::move(notifications_ptr)); + notifications_ptr.PassInterface()); } void ArcBridgeHostImpl::OnObbMounterInstanceReady( @@ -382,13 +383,13 @@ // closed on ArcBridgeHost/Instance closing or the ArcBridgeHostImpl's // destruction. auto* channel = - new MojoChannel<InstanceType, HostType>(holder, std::move(ptr)); + new MojoChannel<InstanceType, HostType>(holder, ptr.PassInterface()); mojo_channels_.emplace_back(channel); // Since |channel| is managed by |mojo_channels_|, its lifetime is shorter // than |this|. Thus, the connection error handler will be invoked only // when |this| is alive and base::Unretained is safe here. - channel->set_connection_error_handler(base::BindOnce( + channel->set_disconnect_handler(base::BindOnce( &ArcBridgeHostImpl::OnChannelClosed, base::Unretained(this), channel)); // Call QueryVersion so that the version info is properly stored in the
diff --git a/components/arc/session/arc_bridge_host_impl.h b/components/arc/session/arc_bridge_host_impl.h index cf16bea..d0c78d4 100644 --- a/components/arc/session/arc_bridge_host_impl.h +++ b/components/arc/session/arc_bridge_host_impl.h
@@ -13,7 +13,9 @@ #include "components/arc/mojom/arc_bridge.mojom.h" #include "components/arc/session/connection_holder.h" #include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" namespace arc { @@ -32,7 +34,7 @@ class ArcBridgeHostImpl : public mojom::ArcBridgeHost { public: ArcBridgeHostImpl(ArcBridgeService* arc_bridge_service, - mojom::ArcBridgeInstancePtr instance); + mojo::PendingRemote<mojom::ArcBridgeInstance> instance); ~ArcBridgeHostImpl() override; // ArcBridgeHost overrides. @@ -139,7 +141,7 @@ ArcBridgeService* const arc_bridge_service_; mojo::Receiver<mojom::ArcBridgeHost> receiver_; - mojom::ArcBridgeInstancePtr instance_; + mojo::Remote<mojom::ArcBridgeInstance> instance_; // Put as a last member to ensure that any callback tied to the elements // is not invoked.
diff --git a/components/arc/session/arc_session_impl.cc b/components/arc/session/arc_session_impl.cc index 19398fd..9ed591be 100644 --- a/components/arc/session/arc_session_impl.cc +++ b/components/arc/session/arc_session_impl.cc
@@ -33,7 +33,8 @@ #include "components/arc/session/arc_bridge_host_impl.h" #include "components/user_manager/user_manager.h" #include "components/version_info/channel.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/platform/named_platform_channel.h" #include "mojo/public/cpp/platform/platform_channel.h" #include "mojo/public/cpp/platform/platform_handle.h" @@ -294,11 +295,9 @@ return; } - mojom::ArcBridgeInstancePtr instance; - instance.Bind(mojo::InterfacePtrInfo<mojom::ArcBridgeInstance>( - std::move(server_pipe), 0u)); std::move(callback).Run(std::make_unique<ArcBridgeHostImpl>( - arc_bridge_service_, std::move(instance))); + arc_bridge_service_, mojo::PendingRemote<mojom::ArcBridgeInstance>( + std::move(server_pipe), 0u))); } } // namespace
diff --git a/components/arc/session/mojo_channel.h b/components/arc/session/mojo_channel.h index 55eb8db..f8b8ce5 100644 --- a/components/arc/session/mojo_channel.h +++ b/components/arc/session/mojo_channel.h
@@ -10,10 +10,12 @@ #include "base/bind.h" #include "base/macros.h" #include "components/arc/session/connection_holder.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" namespace arc { -// Thin interface to wrap InterfacePtr<T> with type erasure. +// Thin interface to wrap Remote<T> with type erasure. class MojoChannelBase { public: virtual ~MojoChannelBase() = default; @@ -25,39 +27,39 @@ DISALLOW_COPY_AND_ASSIGN(MojoChannelBase); }; -// Thin wrapper for InterfacePtr<T>, where T is one of ARC mojo Instance class. +// Thin wrapper for Remote<T>, where T is one of ARC mojo Instance class. template <typename InstanceType, typename HostType> class MojoChannel : public MojoChannelBase { public: MojoChannel(ConnectionHolder<InstanceType, HostType>* holder, - mojo::InterfacePtr<InstanceType> ptr) - : holder_(holder), ptr_(std::move(ptr)) { + mojo::PendingRemote<InstanceType> remote) + : holder_(holder), remote_(std::move(remote)) { // Delay registration to the ConnectionHolder until the version is ready. } - ~MojoChannel() override { holder_->CloseInstance(ptr_.get()); } + ~MojoChannel() override { holder_->CloseInstance(remote_.get()); } - void set_connection_error_handler(base::OnceClosure error_handler) { - ptr_.set_connection_error_handler(std::move(error_handler)); + void set_disconnect_handler(base::OnceClosure error_handler) { + remote_.set_disconnect_handler(std::move(error_handler)); } void QueryVersion() { - // Note: the callback will not be called if |ptr_| is destroyed. - ptr_.QueryVersion( + // Note: the callback will not be called if |remote_| is destroyed. + remote_.QueryVersion( base::Bind(&MojoChannel::OnVersionReady, base::Unretained(this))); } private: void OnVersionReady(uint32_t unused_version) { - holder_->SetInstance(ptr_.get(), ptr_.version()); + holder_->SetInstance(remote_.get(), remote_.version()); } // Externally owned ConnectionHolder instance. ConnectionHolder<InstanceType, HostType>* const holder_; - // Put as a last member to ensure that any callback tied to the |ptr_| + // Put as a last member to ensure that any callback tied to the |remote_| // is not invoked. - mojo::InterfacePtr<InstanceType> ptr_; + mojo::Remote<InstanceType> remote_; DISALLOW_COPY_AND_ASSIGN(MojoChannel); };
diff --git a/components/autofill/android/BUILD.gn b/components/autofill/android/BUILD.gn index 874b0b1..9fb5251 100644 --- a/components/autofill/android/BUILD.gn +++ b/components/autofill/android/BUILD.gn
@@ -37,7 +37,7 @@ "//third_party/android_deps:android_support_v7_appcompat_java", "//ui/android:ui_java", ] - java_files = [ + sources = [ "java/src/org/chromium/components/autofill/AutofillDelegate.java", "java/src/org/chromium/components/autofill/AutofillDropdownAdapter.java", "java/src/org/chromium/components/autofill/AutofillDropdownFooter.java", @@ -56,7 +56,7 @@ "//third_party/android_deps:androidx_annotation_annotation_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/autofill/AutofillProvider.java", "java/src/org/chromium/components/autofill/FormData.java", "java/src/org/chromium/components/autofill/FormFieldData.java",
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc index 1ed6000..5badfe5 100644 --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -59,7 +59,6 @@ #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_node.h" #include "third_party/blink/public/web/web_option_element.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/base/l10n/l10n_util.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -80,7 +79,6 @@ using blink::WebNode; using blink::WebOptionElement; using blink::WebString; -using blink::WebUserGestureIndicator; using blink::WebVector; namespace autofill { @@ -232,8 +230,8 @@ was_focused_before_now_ = false; if ((IsKeyboardAccessoryEnabled() || !focus_requires_scroll_) && - WebUserGestureIndicator::IsProcessingUserGesture( - element.IsNull() ? nullptr : element.GetDocument().GetFrame())) { + !element.IsNull() && + element.GetDocument().GetFrame()->HasTransientUserActivation()) { focused_node_was_last_clicked_ = true; HandleFocusChangeComplete(); }
diff --git a/components/autofill/content/renderer/form_tracker.cc b/components/autofill/content/renderer/form_tracker.cc index 0d0011a..e077f40 100644 --- a/components/autofill/content/renderer/form_tracker.cc +++ b/components/autofill/content/renderer/form_tracker.cc
@@ -11,7 +11,6 @@ #include "third_party/blink/public/web/modules/autofill/web_form_element_observer.h" #include "third_party/blink/public/web/web_input_element.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "ui/base/page_transition_types.h" using blink::WebDocumentLoader; @@ -70,8 +69,7 @@ // that pastes aren't necessarily user gestures because Blink's conception of // user gestures is centered around creating new windows/tabs. if (user_gesture_required_ && - !blink::WebUserGestureIndicator::IsProcessingUserGesture( - render_frame()->GetWebFrame()) && + !render_frame()->GetWebFrame()->HasTransientUserActivation() && !render_frame()->IsPasting()) return;
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index d4d47ad..3dc9820 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -51,7 +51,6 @@ #include "third_party/blink/public/web/web_form_element.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_node.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/base/page_transition_types.h" #include "ui/events/keycodes/keyboard_codes.h"
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc index 98d69be2..b4e9956 100644 --- a/components/autofill/core/browser/autofill_client.cc +++ b/components/autofill/core/browser/autofill_client.cc
@@ -8,9 +8,6 @@ namespace autofill { -AutofillClient::UnmaskDetails::UnmaskDetails() {} -AutofillClient::UnmaskDetails::~UnmaskDetails() {} - version_info::Channel AutofillClient::GetChannel() const { return version_info::Channel::UNKNOWN; }
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index b4b5f67..7d75a02 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -130,23 +130,6 @@ FIDO = 2, }; - // Details for card unmasking, such as the suggested method of authentication, - // along with any information required to facilitate the authentication. - struct UnmaskDetails { - UnmaskDetails(); - ~UnmaskDetails(); - - // The type of authentication method suggested for card unmask. - UnmaskAuthMethod unmask_auth_method = UnmaskAuthMethod::UNKNOWN; - // Set to true if the user should be offered opt-in for FIDO Authentication. - bool offer_fido_opt_in = false; - // Public Key Credential Request Options required for authentication. - // https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialrequestoptions - base::Value fido_request_options; - // Set of credit cards ids that are eligible for FIDO Authentication. - std::set<std::string> fido_eligible_card_ids; - }; - // Used for explicitly requesting the user to enter/confirm cardholder name, // expiration date month and year. struct UserProvidedCardDetails {
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 12c7423f..9587580d 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -222,25 +222,21 @@ void CreditCardAccessManager::OnDidGetUnmaskDetails( AutofillClient::PaymentsRpcResult result, - AutofillClient::UnmaskDetails& unmask_details) { + payments::PaymentsClient::UnmaskDetails& unmask_details) { // Log latency for preflight call. AutofillMetrics::LogCardUnmaskPreflightDuration( AutofillTickClock::NowTicks() - preflight_call_timestamp_); unmask_details_request_in_progress_ = false; - unmask_details_.offer_fido_opt_in = unmask_details.offer_fido_opt_in && + unmask_details_ = unmask_details; + unmask_details_.offer_fido_opt_in = unmask_details_.offer_fido_opt_in && !payments_client_->is_off_the_record(); - unmask_details_.unmask_auth_method = unmask_details.unmask_auth_method; - unmask_details_.fido_request_options = - std::move(unmask_details.fido_request_options); - unmask_details_.fido_eligible_card_ids = - unmask_details.fido_eligible_card_ids; // Set delay as fido request timeout if available, otherwise set to default. int delay_ms = kDelayForGetUnmaskDetails; - if (unmask_details_.fido_request_options.is_dict()) { + if (unmask_details_.fido_request_options.has_value()) { const auto* request_timeout = - unmask_details_.fido_request_options.FindKeyOfType( + unmask_details_.fido_request_options->FindKeyOfType( "timeout_millis", base::Value::Type::INTEGER); if (request_timeout) delay_ms = request_timeout->GetInt(); @@ -401,10 +397,10 @@ if (!is_authentication_in_progress_) return; - DCHECK(unmask_details_.fido_request_options.is_dict()); + DCHECK(unmask_details_.fido_request_options.has_value()); GetOrCreateFIDOAuthenticator()->Authenticate( card_.get(), weak_ptr_factory_.GetWeakPtr(), form_parsed_timestamp_, - std::move(unmask_details_.fido_request_options)); + std::move(unmask_details_.fido_request_options.value())); #endif } else { #if !defined(OS_ANDROID) && !defined(OS_IOS) @@ -482,14 +478,14 @@ if (should_offer_fido_auth) { ShowWebauthnOfferDialog(response.card_authorization_token); } else if (should_follow_up_cvc_with_fido_auth_) { - DCHECK(unmask_details_.fido_request_options.is_dict()); + DCHECK(unmask_details_.fido_request_options.has_value()); // Save credit card for after authorization. card_ = std::make_unique<CreditCard>(*(response.card)); cvc_ = response.cvc; GetOrCreateFIDOAuthenticator()->Authorize( weak_ptr_factory_.GetWeakPtr(), response.card_authorization_token, - std::move(unmask_details_.fido_request_options)); + std::move(unmask_details_.fido_request_options.value())); } #endif }
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.h b/components/autofill/core/browser/payments/credit_card_access_manager.h index 9a259616..bcf2020b 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/components/autofill/core/browser/payments/credit_card_access_manager.h
@@ -129,8 +129,9 @@ // Sets |unmask_details_|. May be ignored if response is too late and user is // not opted-in for FIDO auth, or if user does not select a card. - void OnDidGetUnmaskDetails(AutofillClient::PaymentsRpcResult result, - AutofillClient::UnmaskDetails& unmask_details); + void OnDidGetUnmaskDetails( + AutofillClient::PaymentsRpcResult result, + payments::PaymentsClient::UnmaskDetails& unmask_details); // If OnDidGetUnmaskDetails() was invoked by PaymentsClient, then // |get_unmask_details_returned| should be set to true. Based on the @@ -225,7 +226,7 @@ // Suggested authentication method and other information to facilitate card // unmasking. - AutofillClient::UnmaskDetails unmask_details_; + payments::PaymentsClient::UnmaskDetails unmask_details_; // Resets when PrepareToFetchCreditCard() is called, if not already reset. // Signaled when OnDidGetUnmaskDetails() is called or after timeout.
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc index 8a5d06a..6dee564 100644 --- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc +++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
@@ -143,7 +143,7 @@ } void CreditCardFIDOAuthenticator::SyncUserOptIn( - AutofillClient::UnmaskDetails& unmask_details) { + payments::PaymentsClient::UnmaskDetails& unmask_details) { user_is_opted_in_ = IsUserOptedIn(); // If payments is offering to opt-in, then that means user is not opted in. @@ -322,7 +322,7 @@ request_details.fido_authenticator_response = std::move(authenticator_response); opt_change_metric = - request_details.fido_authenticator_response.FindKey( + request_details.fido_authenticator_response->FindKey( "fido_assertion_info") ? AutofillMetrics::WebauthnOptInParameters::kWithRequestChallenge : AutofillMetrics::WebauthnOptInParameters::kWithCreationChallenge;
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.h b/components/autofill/core/browser/payments/credit_card_fido_authenticator.h index 5996af0..2a7a208 100644 --- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.h +++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.h
@@ -108,7 +108,7 @@ virtual bool IsUserOptedIn(); // Ensures that local user opt-in pref is in-sync with payments server. - void SyncUserOptIn(AutofillClient::UnmaskDetails& unmask_details); + void SyncUserOptIn(payments::PaymentsClient::UnmaskDetails& unmask_details); // Cancel the ongoing verification process. Used to reset states in this class // and in the FullCardRequest if any.
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc index f0aab77..c9d32b3 100644 --- a/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc
@@ -280,7 +280,7 @@ EXPECT_TRUE(fido_authenticator_->IsUserOptedIn()); // If payments is offering to opt-in, then that means user is not opted in. - AutofillClient::UnmaskDetails unmask_details; + payments::PaymentsClient::UnmaskDetails unmask_details; unmask_details.offer_fido_opt_in = true; fido_authenticator_->SyncUserOptIn(unmask_details); EXPECT_FALSE(fido_authenticator_->IsUserOptedIn()); @@ -293,7 +293,7 @@ EXPECT_FALSE(fido_authenticator_->IsUserOptedIn()); // If payments is requesting a FIDO auth, then that means user is opted in. - AutofillClient::UnmaskDetails unmask_details; + payments::PaymentsClient::UnmaskDetails unmask_details; unmask_details.unmask_auth_method = AutofillClient::UnmaskAuthMethod::FIDO; fido_authenticator_->SyncUserOptIn(unmask_details); EXPECT_TRUE(fido_authenticator_->IsUserOptedIn());
diff --git a/components/autofill/core/browser/payments/full_card_request.cc b/components/autofill/core/browser/payments/full_card_request.cc index d03fc5f9..aa16ead7 100644 --- a/components/autofill/core/browser/payments/full_card_request.cc +++ b/components/autofill/core/browser/payments/full_card_request.cc
@@ -50,7 +50,8 @@ base::WeakPtr<ResultDelegate> result_delegate, base::WeakPtr<UIDelegate> ui_delegate) { DCHECK(ui_delegate); - GetFullCard(card, reason, result_delegate, ui_delegate, base::Value()); + GetFullCard(card, reason, result_delegate, ui_delegate, + /*fido_assertion_info=*/base::nullopt); } void FullCardRequest::GetFullCardViaFIDO( @@ -63,15 +64,16 @@ std::move(fido_assertion_info)); } -void FullCardRequest::GetFullCard(const CreditCard& card, - AutofillClient::UnmaskCardReason reason, - base::WeakPtr<ResultDelegate> result_delegate, - base::WeakPtr<UIDelegate> ui_delegate, - base::Value fido_assertion_info) { +void FullCardRequest::GetFullCard( + const CreditCard& card, + AutofillClient::UnmaskCardReason reason, + base::WeakPtr<ResultDelegate> result_delegate, + base::WeakPtr<UIDelegate> ui_delegate, + base::Optional<base::Value> fido_assertion_info) { // Retrieval of card information should happen via CVC auth or FIDO, but not // both. Use |ui_delegate|'s existence as evidence of doing CVC auth and // |fido_assertion_info| as evidence of doing FIDO auth. - DCHECK_NE(fido_assertion_info.is_dict(), !!ui_delegate); + DCHECK_NE(fido_assertion_info.has_value(), !!ui_delegate); DCHECK(result_delegate); // Only one request can be active at a time. If the member variable @@ -153,7 +155,7 @@ void FullCardRequest::OnDidGetUnmaskRiskData(const std::string& risk_data) { request_->risk_data = risk_data; if (!request_->user_response.cvc.empty() || - !request_->fido_assertion_info.is_none()) { + request_->fido_assertion_info.has_value()) { SendUnmaskCardRequest(); } } @@ -171,12 +173,12 @@ // If the CVC field is populated, that means the user performed a CVC check. // If FIDO AssertionInfo is populated, then the user must have performed FIDO // authentication. Exactly one of these fields must be populated. - DCHECK_NE(request_->user_response.cvc.empty(), - request_->fido_assertion_info.is_none()); + DCHECK_NE(!request_->user_response.cvc.empty(), + request_->fido_assertion_info.has_value()); if (!request_->user_response.cvc.empty()) { AutofillMetrics::LogRealPanDuration( AutofillTickClock::NowTicks() - real_pan_request_timestamp_, result); - } else if (!request_->fido_assertion_info.is_none()) { + } else if (request_->fido_assertion_info.has_value()) { AutofillMetrics::LogCardUnmaskDurationAfterWebauthn( AutofillTickClock::NowTicks() - real_pan_request_timestamp_, result); }
diff --git a/components/autofill/core/browser/payments/full_card_request.h b/components/autofill/core/browser/payments/full_card_request.h index bb1bc3c8..f5cfcaa 100644 --- a/components/autofill/core/browser/payments/full_card_request.h +++ b/components/autofill/core/browser/payments/full_card_request.h
@@ -128,7 +128,7 @@ AutofillClient::UnmaskCardReason reason, base::WeakPtr<ResultDelegate> result_delegate, base::WeakPtr<UIDelegate> ui_delegate, - base::Value fido_assertion_info); + base::Optional<base::Value> fido_assertion_info); // CardUnmaskDelegate: void OnUnmaskPromptAccepted(
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc index ab27666..4fefbc3 100644 --- a/components/autofill/core/browser/payments/payments_client.cc +++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -238,9 +238,11 @@ class GetUnmaskDetailsRequest : public PaymentsRequest { public: - GetUnmaskDetailsRequest(GetUnmaskDetailsCallback callback, - const std::string& app_locale, - const bool full_sync_enabled) + GetUnmaskDetailsRequest( + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> callback, + const std::string& app_locale, + const bool full_sync_enabled) : callback_(std::move(callback)), app_locale_(app_locale), full_sync_enabled_(full_sync_enabled) {} @@ -312,13 +314,15 @@ } private: - GetUnmaskDetailsCallback callback_; + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> + callback_; std::string app_locale_; const bool full_sync_enabled_; // Suggested authentication method and other information to facilitate card // unmasking. - AutofillClient::UnmaskDetails unmask_details_; + payments::PaymentsClient::UnmaskDetails unmask_details_; DISALLOW_COPY_AND_ASSIGN(GetUnmaskDetailsRequest); }; @@ -383,14 +387,15 @@ // Either FIDO assertion info is set or CVC is set, never both. bool is_cvc_auth = !request_details_.user_response.cvc.empty(); - bool is_fido_auth = request_details_.fido_assertion_info.is_dict(); + bool is_fido_auth = request_details_.fido_assertion_info.has_value(); DCHECK_NE(is_cvc_auth, is_fido_auth); if (is_cvc_auth) { request_dict.SetKey("encrypted_cvc", base::Value("__param:s7e_13_cvc")); } else { - request_dict.SetKey("fido_assertion_info", - std::move(request_details_.fido_assertion_info)); + request_dict.SetKey( + "fido_assertion_info", + std::move(request_details_.fido_assertion_info.value())); } std::string json_request; @@ -512,12 +517,12 @@ } request_dict.SetKey("reason", base::Value(reason)); - if (request_details_.fido_authenticator_response.is_dict()) { + if (request_details_.fido_authenticator_response.has_value()) { base::Value fido_authentication_info(base::Value::Type::DICTIONARY); fido_authentication_info.SetKey( "fido_authenticator_response", - std::move(request_details_.fido_authenticator_response)); + std::move(request_details_.fido_authenticator_response.value())); if (!request_details_.card_authorization_token.empty()) { fido_authentication_info.SetKey( @@ -994,7 +999,22 @@ const char PaymentsClient::kRecipientName[] = "recipient_name"; const char PaymentsClient::kPhoneNumber[] = "phone_number"; -PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails() {} +PaymentsClient::UnmaskDetails::UnmaskDetails() = default; +PaymentsClient::UnmaskDetails::~UnmaskDetails() = default; +PaymentsClient::UnmaskDetails& PaymentsClient::UnmaskDetails::operator=( + const PaymentsClient::UnmaskDetails& other) { + unmask_auth_method = other.unmask_auth_method; + offer_fido_opt_in = other.offer_fido_opt_in; + if (other.fido_request_options.has_value()) { + fido_request_options = other.fido_request_options->Clone(); + } else { + fido_request_options.reset(); + } + fido_eligible_card_ids = other.fido_eligible_card_ids; + return *this; +} + +PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails() = default; PaymentsClient::UnmaskRequestDetails::UnmaskRequestDetails( const UnmaskRequestDetails& other) { billing_customer_number = other.billing_customer_number; @@ -1002,16 +1022,20 @@ card = other.card; risk_data = other.risk_data; user_response = other.user_response; - fido_assertion_info = other.fido_assertion_info.Clone(); + if (other.fido_assertion_info.has_value()) { + fido_assertion_info = other.fido_assertion_info->Clone(); + } else { + fido_assertion_info.reset(); + } } -PaymentsClient::UnmaskRequestDetails::~UnmaskRequestDetails() {} +PaymentsClient::UnmaskRequestDetails::~UnmaskRequestDetails() = default; -PaymentsClient::UnmaskResponseDetails::UnmaskResponseDetails() {} +PaymentsClient::UnmaskResponseDetails::UnmaskResponseDetails() = default; PaymentsClient::UnmaskResponseDetails::UnmaskResponseDetails( const UnmaskResponseDetails& other) { *this = other; } -PaymentsClient::UnmaskResponseDetails::~UnmaskResponseDetails() {} +PaymentsClient::UnmaskResponseDetails::~UnmaskResponseDetails() = default; PaymentsClient::UnmaskResponseDetails& PaymentsClient::UnmaskResponseDetails:: operator=(const PaymentsClient::UnmaskResponseDetails& other) { real_pan = other.real_pan; @@ -1029,17 +1053,21 @@ return *this; } -PaymentsClient::OptChangeRequestDetails::OptChangeRequestDetails() {} +PaymentsClient::OptChangeRequestDetails::OptChangeRequestDetails() = default; PaymentsClient::OptChangeRequestDetails::OptChangeRequestDetails( const OptChangeRequestDetails& other) { app_locale = other.app_locale; reason = other.reason; - fido_authenticator_response = other.fido_authenticator_response.Clone(); + if (other.fido_authenticator_response.has_value()) { + fido_authenticator_response = other.fido_authenticator_response->Clone(); + } else { + fido_authenticator_response.reset(); + } card_authorization_token = other.card_authorization_token; } -PaymentsClient::OptChangeRequestDetails::~OptChangeRequestDetails() {} +PaymentsClient::OptChangeRequestDetails::~OptChangeRequestDetails() = default; -PaymentsClient::OptChangeResponseDetails::OptChangeResponseDetails() {} +PaymentsClient::OptChangeResponseDetails::OptChangeResponseDetails() = default; PaymentsClient::OptChangeResponseDetails::OptChangeResponseDetails( const OptChangeResponseDetails& other) { user_is_opted_in = other.user_is_opted_in; @@ -1055,17 +1083,17 @@ fido_request_options.reset(); } } -PaymentsClient::OptChangeResponseDetails::~OptChangeResponseDetails() {} +PaymentsClient::OptChangeResponseDetails::~OptChangeResponseDetails() = default; -PaymentsClient::UploadRequestDetails::UploadRequestDetails() {} +PaymentsClient::UploadRequestDetails::UploadRequestDetails() = default; PaymentsClient::UploadRequestDetails::UploadRequestDetails( const UploadRequestDetails& other) = default; -PaymentsClient::UploadRequestDetails::~UploadRequestDetails() {} +PaymentsClient::UploadRequestDetails::~UploadRequestDetails() = default; -PaymentsClient::MigrationRequestDetails::MigrationRequestDetails() {} +PaymentsClient::MigrationRequestDetails::MigrationRequestDetails() = default; PaymentsClient::MigrationRequestDetails::MigrationRequestDetails( const MigrationRequestDetails& other) = default; -PaymentsClient::MigrationRequestDetails::~MigrationRequestDetails() {} +PaymentsClient::MigrationRequestDetails::~MigrationRequestDetails() = default; PaymentsClient::PaymentsClient( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, @@ -1078,15 +1106,17 @@ is_off_the_record_(is_off_the_record), has_retried_authorization_(false) {} -PaymentsClient::~PaymentsClient() {} +PaymentsClient::~PaymentsClient() = default; void PaymentsClient::Prepare() { if (access_token_.empty()) StartTokenFetch(false); } -void PaymentsClient::GetUnmaskDetails(GetUnmaskDetailsCallback callback, - const std::string& app_locale) { +void PaymentsClient::GetUnmaskDetails( + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> callback, + const std::string& app_locale) { IssueRequest(std::make_unique<GetUnmaskDetailsRequest>( std::move(callback), app_locale, account_info_getter_->IsSyncFeatureEnabled()),
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h index 9ce00b3..dd7722d8 100644 --- a/components/autofill/core/browser/payments/payments_client.h +++ b/components/autofill/core/browser/payments/payments_client.h
@@ -48,11 +48,6 @@ const std::string& display_text)> MigrateCardsCallback; -// Callback type for GetUnmaskDetails callback. -typedef base::OnceCallback<void(AutofillClient::PaymentsRpcResult, - AutofillClient::UnmaskDetails&)> - GetUnmaskDetailsCallback; - // Billable service number is defined in Payments server to distinguish // different requests. const int kUnmaskCardBillableServiceNumber = 70154; @@ -74,6 +69,25 @@ static const char kRecipientName[]; static const char kPhoneNumber[]; + // Details for card unmasking, such as the suggested method of authentication, + // along with any information required to facilitate the authentication. + struct UnmaskDetails { + UnmaskDetails(); + ~UnmaskDetails(); + UnmaskDetails& operator=(const UnmaskDetails& other); + + // The type of authentication method suggested for card unmask. + AutofillClient::UnmaskAuthMethod unmask_auth_method = + AutofillClient::UnmaskAuthMethod::UNKNOWN; + // Set to true if the user should be offered opt-in for FIDO Authentication. + bool offer_fido_opt_in = false; + // Public Key Credential Request Options required for authentication. + // https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialrequestoptions + base::Optional<base::Value> fido_request_options = base::nullopt; + // Set of credit cards ids that are eligible for FIDO Authentication. + std::set<std::string> fido_eligible_card_ids; + }; + // A collection of the information required to make a credit card unmask // request. struct UnmaskRequestDetails { @@ -86,7 +100,7 @@ CreditCard card; std::string risk_data; CardUnmaskDelegate::UserProvidedUnmaskDetails user_response; - base::Value fido_assertion_info; + base::Optional<base::Value> fido_assertion_info = base::nullopt; }; // Information retrieved from an UnmaskRequest. @@ -145,7 +159,7 @@ Reason reason; // Signature required for enrolling user into FIDO authentication for future // card unmasking. - base::Value fido_authenticator_response; + base::Optional<base::Value> fido_authenticator_response = base::nullopt; // An opaque token used to logically chain consecutive UnmaskCard and // OptChange calls together. std::string card_authorization_token = std::string(); @@ -162,10 +176,10 @@ base::Optional<bool> user_is_opted_in; // Challenge required for enrolling user into FIDO authentication for future // card unmasking. - base::Optional<base::Value> fido_creation_options; + base::Optional<base::Value> fido_creation_options = base::nullopt; // Challenge required for authorizing user for FIDO authentication for // future card unmasking. - base::Optional<base::Value> fido_request_options; + base::Optional<base::Value> fido_request_options = base::nullopt; }; // A collection of the information required to make a credit card upload @@ -242,8 +256,10 @@ // The user has interacted with a credit card form and may attempt to unmask a // card. This request returns what method of authentication is suggested, // along with any information to facilitate the authentication. - virtual void GetUnmaskDetails(GetUnmaskDetailsCallback callback, - const std::string& app_locale); + virtual void GetUnmaskDetails( + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> callback, + const std::string& app_locale); // The user has attempted to unmask a card with the given cvc. void UnmaskCard(const UnmaskRequestDetails& request_details,
diff --git a/components/autofill/core/browser/payments/payments_client_unittest.cc b/components/autofill/core/browser/payments/payments_client_unittest.cc index c565a3d..1a704d2 100644 --- a/components/autofill/core/browser/payments/payments_client_unittest.cc +++ b/components/autofill/core/browser/payments/payments_client_unittest.cc
@@ -124,8 +124,9 @@ base::FieldTrialList::CreateFieldTrial(trial_name, group_name)->group(); } - void OnDidGetUnmaskDetails(AutofillClient::PaymentsRpcResult result, - AutofillClient::UnmaskDetails& unmask_details) { + void OnDidGetUnmaskDetails( + AutofillClient::PaymentsRpcResult result, + payments::PaymentsClient::UnmaskDetails& unmask_details) { result_ = result; unmask_details_ = &unmask_details; } @@ -294,7 +295,7 @@ } AutofillClient::PaymentsRpcResult result_; - AutofillClient::UnmaskDetails* unmask_details_; + payments::PaymentsClient::UnmaskDetails* unmask_details_; // Server ID of a saved card via credit card upload save. std::string server_id_;
diff --git a/components/autofill/core/browser/payments/test_payments_client.cc b/components/autofill/core/browser/payments/test_payments_client.cc index 55925dd..992428b8 100644 --- a/components/autofill/core/browser/payments/test_payments_client.cc +++ b/components/autofill/core/browser/payments/test_payments_client.cc
@@ -33,8 +33,10 @@ TestPaymentsClient::~TestPaymentsClient() {} -void TestPaymentsClient::GetUnmaskDetails(GetUnmaskDetailsCallback callback, - const std::string& app_locale) { +void TestPaymentsClient::GetUnmaskDetails( + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> callback, + const std::string& app_locale) { if (should_return_unmask_details_) std::move(callback).Run(AutofillClient::SUCCESS, unmask_details_); } @@ -108,12 +110,12 @@ // "credential_id": credential_id, // "authenticator_transport_support": ["INTERNAL"] // }]} - unmask_details_.fido_request_options.SetKey("challenge", - base::Value(kTestChallenge)); - unmask_details_.fido_request_options.SetKey("timeout_millis", - base::Value(kTestTimeoutSeconds)); - unmask_details_.fido_request_options.SetKey("relying_party_id", - base::Value(relying_party_id)); + unmask_details_.fido_request_options->SetKey("challenge", + base::Value(kTestChallenge)); + unmask_details_.fido_request_options->SetKey( + "timeout_millis", base::Value(kTestTimeoutSeconds)); + unmask_details_.fido_request_options->SetKey("relying_party_id", + base::Value(relying_party_id)); base::Value key_info(base::Value::Type::DICTIONARY); if (!credential_id.empty()) @@ -123,10 +125,10 @@ key_info .FindKeyOfType("authenticator_transport_support", base::Value::Type::LIST) ->Append("INTERNAL"); - unmask_details_.fido_request_options.SetKey( + unmask_details_.fido_request_options->SetKey( "key_info", base::Value(base::Value::Type::LIST)); unmask_details_.fido_request_options - .FindKeyOfType("key_info", base::Value::Type::LIST) + ->FindKeyOfType("key_info", base::Value::Type::LIST) ->Append(std::move(key_info)); }
diff --git a/components/autofill/core/browser/payments/test_payments_client.h b/components/autofill/core/browser/payments/test_payments_client.h index 03ffcc0..c6b077d 100644 --- a/components/autofill/core/browser/payments/test_payments_client.h +++ b/components/autofill/core/browser/payments/test_payments_client.h
@@ -30,8 +30,10 @@ ~TestPaymentsClient() override; - void GetUnmaskDetails(GetUnmaskDetailsCallback callback, - const std::string& app_locale) override; + void GetUnmaskDetails( + base::OnceCallback<void(AutofillClient::PaymentsRpcResult, + PaymentsClient::UnmaskDetails&)> callback, + const std::string& app_locale) override; void GetUploadDetails( const std::vector<AutofillProfile>& addresses, @@ -99,7 +101,7 @@ // Some metrics are affected by the latency of GetUnmaskDetails, so it is // useful to control whether or not GetUnmaskDetails() is responded to. bool should_return_unmask_details_ = true; - AutofillClient::UnmaskDetails unmask_details_; + payments::PaymentsClient::UnmaskDetails unmask_details_; std::vector<std::pair<int, int>> supported_card_bin_ranges_; std::vector<AutofillProfile> upload_details_addresses_; std::vector<AutofillProfile> upload_card_addresses_;
diff --git a/components/background_task_scheduler/BUILD.gn b/components/background_task_scheduler/BUILD.gn index f81c4564..552b453d 100644 --- a/components/background_task_scheduler/BUILD.gn +++ b/components/background_task_scheduler/BUILD.gn
@@ -24,11 +24,13 @@ # related permissions for WebView while still wanting to avoid collision # between WebView and Chrome. android_library("background_task_scheduler_task_ids_java") { - java_files = [ "android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java" ] + sources = [ + "android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java", + ] } android_library("background_task_scheduler_java") { - java_files = [ + sources = [ "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTask.java", "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskBroadcastReceiver.java", "android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskFactory.java", @@ -67,12 +69,12 @@ android_library("background_task_scheduler_javatests") { testonly = true - java_files = [ + sources = [ "android/javatests/src/org/chromium/components/background_task_scheduler/BackgroundTaskBroadcastReceiverTest.java", "android/javatests/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerImplWithMockTest.java", - "android/javatests/src/org/chromium/components/background_task_scheduler/MockBackgroundTaskSchedulerDelegate.java", "android/javatests/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerJobServiceTest.java", "android/javatests/src/org/chromium/components/background_task_scheduler/BundleToPersistableBundleConverterTest.java", + "android/javatests/src/org/chromium/components/background_task_scheduler/MockBackgroundTaskSchedulerDelegate.java", ] deps = [ @@ -91,11 +93,11 @@ } junit_binary("components_background_task_scheduler_junit_tests") { - java_files = [ - "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java", + sources = [ "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskGcmTaskServiceTest.java", "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskJobServiceTest.java", "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerAlarmManagerTest.java", + "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java", "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerImplTest.java", "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerPrefsTest.java", "android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUmaTest.java",
diff --git a/components/bookmarks/common/android/BUILD.gn b/components/bookmarks/common/android/BUILD.gn index 6560e9d..90ab3d01 100644 --- a/components/bookmarks/common/android/BUILD.gn +++ b/components/bookmarks/common/android/BUILD.gn
@@ -22,7 +22,9 @@ "//third_party/android_deps:androidx_annotation_annotation_java", ] srcjar_deps = [ ":bookmark_type_javagen" ] - java_files = [ "java/src/org/chromium/components/bookmarks/BookmarkId.java" ] + sources = [ + "java/src/org/chromium/components/bookmarks/BookmarkId.java", + ] } generate_jni("bookmarks_jni_headers") {
diff --git a/components/browser_ui/modaldialog/android/BUILD.gn b/components/browser_ui/modaldialog/android/BUILD.gn index 2d7274c..59cc846 100644 --- a/components/browser_ui/modaldialog/android/BUILD.gn +++ b/components/browser_ui/modaldialog/android/BUILD.gn
@@ -6,7 +6,7 @@ import("//ui/android/features.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenter.java", "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java", "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java", @@ -36,7 +36,7 @@ android_library("javatests") { testonly = true - java_files = [ + sources = [ "java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenterTest.java", "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogTestUtils.java", "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java",
diff --git a/components/browser_ui/modaldialog/android/OWNERS b/components/browser_ui/modaldialog/android/OWNERS new file mode 100644 index 0000000..eae57e0d --- /dev/null +++ b/components/browser_ui/modaldialog/android/OWNERS
@@ -0,0 +1 @@ +file://ui/android/java/src/org/chromium/ui/modaldialog/OWNERS
diff --git a/components/browser_ui/strings/android/BUILD.gn b/components/browser_ui/strings/android/BUILD.gn new file mode 100644 index 0000000..f7aca7a --- /dev/null +++ b/components/browser_ui/strings/android/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") +import("//build/config/locales.gni") + +java_strings_grd("browser_ui_strings_grd") { + grd_file = "browser_ui_strings.grd" + outputs = [ "values/browser_ui_strings.xml" ] + + process_file_template( + android_bundle_locales_as_resources, + [ "values-{{source_name_part}}/browser_ui_strings.xml" ]) +}
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd new file mode 100644 index 0000000..4518228 --- /dev/null +++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="utf-8"?> + +<grit latest_public_release="0" current_release="1" + output_all_resource_defines="false" source_lang_id="en" enc_check="möl"> + <outputs> + <output filename="values-af/browser_ui_strings.xml" lang="af" type="android" /> + <output filename="values-am/browser_ui_strings.xml" lang="am" type="android" /> + <output filename="values-ar/browser_ui_strings.xml" lang="ar" type="android" /> + <output filename="values-as/browser_ui_strings.xml" lang="as" type="android" /> + <output filename="values-az/browser_ui_strings.xml" lang="az" type="android" /> + <output filename="values-be/browser_ui_strings.xml" lang="be" type="android" /> + <output filename="values-bg/browser_ui_strings.xml" lang="bg" type="android" /> + <output filename="values-bn/browser_ui_strings.xml" lang="bn" type="android" /> + <output filename="values-bs/browser_ui_strings.xml" lang="bs" type="android" /> + <output filename="values-ca/browser_ui_strings.xml" lang="ca" type="android" /> + <output filename="values-cs/browser_ui_strings.xml" lang="cs" type="android" /> + <output filename="values-da/browser_ui_strings.xml" lang="da" type="android" /> + <output filename="values-de/browser_ui_strings.xml" lang="de" type="android" /> + <output filename="values-el/browser_ui_strings.xml" lang="el" type="android" /> + <output filename="values/browser_ui_strings.xml" lang="en" type="android" /> + <output filename="values-en-rGB/browser_ui_strings.xml" lang="en-GB" type="android" /> + <output filename="values-es/browser_ui_strings.xml" lang="es" type="android" /> + <output filename="values-es-rUS/browser_ui_strings.xml" lang="es-419" type="android" /> + <output filename="values-et/browser_ui_strings.xml" lang="et" type="android" /> + <output filename="values-eu/browser_ui_strings.xml" lang="eu" type="android" /> + <output filename="values-fa/browser_ui_strings.xml" lang="fa" type="android" /> + <output filename="values-fi/browser_ui_strings.xml" lang="fi" type="android" /> + <output filename="values-tl/browser_ui_strings.xml" lang="fil" type="android" /> + <output filename="values-fr/browser_ui_strings.xml" lang="fr" type="android" /> + <output filename="values-fr-rCA/browser_ui_strings.xml" lang="fr-CA" type="android" /> + <output filename="values-gl/browser_ui_strings.xml" lang="gl" type="android" /> + <output filename="values-gu/browser_ui_strings.xml" lang="gu" type="android" /> + <output filename="values-hi/browser_ui_strings.xml" lang="hi" type="android" /> + <output filename="values-hr/browser_ui_strings.xml" lang="hr" type="android" /> + <output filename="values-hu/browser_ui_strings.xml" lang="hu" type="android" /> + <output filename="values-hy/browser_ui_strings.xml" lang="hy" type="android" /> + <output filename="values-in/browser_ui_strings.xml" lang="id" type="android" /> + <output filename="values-is/browser_ui_strings.xml" lang="is" type="android" /> + <output filename="values-it/browser_ui_strings.xml" lang="it" type="android" /> + <output filename="values-iw/browser_ui_strings.xml" lang="iw" type="android" /> + <output filename="values-ja/browser_ui_strings.xml" lang="ja" type="android" /> + <output filename="values-ka/browser_ui_strings.xml" lang="ka" type="android" /> + <output filename="values-kk/browser_ui_strings.xml" lang="kk" type="android" /> + <output filename="values-km/browser_ui_strings.xml" lang="km" type="android" /> + <output filename="values-kn/browser_ui_strings.xml" lang="kn" type="android" /> + <output filename="values-ko/browser_ui_strings.xml" lang="ko" type="android" /> + <output filename="values-ky/browser_ui_strings.xml" lang="ky" type="android" /> + <output filename="values-lo/browser_ui_strings.xml" lang="lo" type="android" /> + <output filename="values-lt/browser_ui_strings.xml" lang="lt" type="android" /> + <output filename="values-lv/browser_ui_strings.xml" lang="lv" type="android" /> + <output filename="values-mk/browser_ui_strings.xml" lang="mk" type="android" /> + <output filename="values-ml/browser_ui_strings.xml" lang="ml" type="android" /> + <output filename="values-mn/browser_ui_strings.xml" lang="mn" type="android" /> + <output filename="values-mr/browser_ui_strings.xml" lang="mr" type="android" /> + <output filename="values-ms/browser_ui_strings.xml" lang="ms" type="android" /> + <output filename="values-my/browser_ui_strings.xml" lang="my" type="android" /> + <output filename="values-ne/browser_ui_strings.xml" lang="ne" type="android" /> + <output filename="values-nl/browser_ui_strings.xml" lang="nl" type="android" /> + <output filename="values-nb/browser_ui_strings.xml" lang="no" type="android" /> + <output filename="values-or/browser_ui_strings.xml" lang="or" type="android" /> + <output filename="values-pa/browser_ui_strings.xml" lang="pa" type="android" /> + <output filename="values-pl/browser_ui_strings.xml" lang="pl" type="android" /> + <output filename="values-pt-rBR/browser_ui_strings.xml" lang="pt-BR" type="android" /> + <output filename="values-pt-rPT/browser_ui_strings.xml" lang="pt-PT" type="android" /> + <output filename="values-ro/browser_ui_strings.xml" lang="ro" type="android" /> + <output filename="values-ru/browser_ui_strings.xml" lang="ru" type="android" /> + <output filename="values-si/browser_ui_strings.xml" lang="si" type="android" /> + <output filename="values-sk/browser_ui_strings.xml" lang="sk" type="android" /> + <output filename="values-sl/browser_ui_strings.xml" lang="sl" type="android" /> + <output filename="values-sq/browser_ui_strings.xml" lang="sq" type="android" /> + <output filename="values-sr/browser_ui_strings.xml" lang="sr" type="android" /> + <output filename="values-sv/browser_ui_strings.xml" lang="sv" type="android" /> + <output filename="values-sw/browser_ui_strings.xml" lang="sw" type="android" /> + <output filename="values-ta/browser_ui_strings.xml" lang="ta" type="android" /> + <output filename="values-te/browser_ui_strings.xml" lang="te" type="android" /> + <output filename="values-th/browser_ui_strings.xml" lang="th" type="android" /> + <output filename="values-tr/browser_ui_strings.xml" lang="tr" type="android" /> + <output filename="values-uk/browser_ui_strings.xml" lang="uk" type="android" /> + <output filename="values-ur/browser_ui_strings.xml" lang="ur" type="android" /> + <output filename="values-uz/browser_ui_strings.xml" lang="uz" type="android" /> + <output filename="values-vi/browser_ui_strings.xml" lang="vi" type="android" /> + <output filename="values-zh-rCN/browser_ui_strings.xml" lang="zh-CN" type="android" /> + <output filename="values-zh-rTW/browser_ui_strings.xml" lang="zh-TW" type="android" /> + <output filename="values-zu/browser_ui_strings.xml" lang="zu" type="android" /> + </outputs> + <translations> + <file lang="af" path="translations/browser_ui_strings_af.xtb" /> + <file lang="am" path="translations/browser_ui_strings_am.xtb" /> + <file lang="ar" path="translations/browser_ui_strings_ar.xtb" /> + <file lang="as" path="translations/browser_ui_strings_as.xtb" /> + <file lang="az" path="translations/browser_ui_strings_az.xtb" /> + <file lang="be" path="translations/browser_ui_strings_be.xtb" /> + <file lang="bg" path="translations/browser_ui_strings_bg.xtb" /> + <file lang="bn" path="translations/browser_ui_strings_bn.xtb" /> + <file lang="bs" path="translations/browser_ui_strings_bs.xtb" /> + <file lang="ca" path="translations/browser_ui_strings_ca.xtb" /> + <file lang="cs" path="translations/browser_ui_strings_cs.xtb" /> + <file lang="da" path="translations/browser_ui_strings_da.xtb" /> + <file lang="de" path="translations/browser_ui_strings_de.xtb" /> + <file lang="el" path="translations/browser_ui_strings_el.xtb" /> + <file lang="en-GB" path="translations/browser_ui_strings_en-GB.xtb" /> + <file lang="es" path="translations/browser_ui_strings_es.xtb" /> + <file lang="es-419" path="translations/browser_ui_strings_es-419.xtb" /> + <file lang="et" path="translations/browser_ui_strings_et.xtb" /> + <file lang="eu" path="translations/browser_ui_strings_eu.xtb" /> + <file lang="fa" path="translations/browser_ui_strings_fa.xtb" /> + <file lang="fi" path="translations/browser_ui_strings_fi.xtb" /> + <file lang="fil" path="translations/browser_ui_strings_fil.xtb" /> + <file lang="fr" path="translations/browser_ui_strings_fr.xtb" /> + <file lang="fr-CA" path="translations/browser_ui_strings_fr-CA.xtb" /> + <file lang="gl" path="translations/browser_ui_strings_gl.xtb" /> + <file lang="gu" path="translations/browser_ui_strings_gu.xtb" /> + <file lang="hi" path="translations/browser_ui_strings_hi.xtb" /> + <file lang="hr" path="translations/browser_ui_strings_hr.xtb" /> + <file lang="hu" path="translations/browser_ui_strings_hu.xtb" /> + <file lang="hy" path="translations/browser_ui_strings_hy.xtb" /> + <file lang="id" path="translations/browser_ui_strings_id.xtb" /> + <file lang="is" path="translations/browser_ui_strings_is.xtb" /> + <file lang="it" path="translations/browser_ui_strings_it.xtb" /> + <file lang="iw" path="translations/browser_ui_strings_iw.xtb" /> + <file lang="ja" path="translations/browser_ui_strings_ja.xtb" /> + <file lang="ka" path="translations/browser_ui_strings_ka.xtb" /> + <file lang="kk" path="translations/browser_ui_strings_kk.xtb" /> + <file lang="km" path="translations/browser_ui_strings_km.xtb" /> + <file lang="kn" path="translations/browser_ui_strings_kn.xtb" /> + <file lang="ko" path="translations/browser_ui_strings_ko.xtb" /> + <file lang="ky" path="translations/browser_ui_strings_ky.xtb" /> + <file lang="lo" path="translations/browser_ui_strings_lo.xtb" /> + <file lang="lt" path="translations/browser_ui_strings_lt.xtb" /> + <file lang="lv" path="translations/browser_ui_strings_lv.xtb" /> + <file lang="mk" path="translations/browser_ui_strings_mk.xtb" /> + <file lang="ml" path="translations/browser_ui_strings_ml.xtb" /> + <file lang="mn" path="translations/browser_ui_strings_mn.xtb" /> + <file lang="mr" path="translations/browser_ui_strings_mr.xtb" /> + <file lang="ms" path="translations/browser_ui_strings_ms.xtb" /> + <file lang="my" path="translations/browser_ui_strings_my.xtb" /> + <file lang="ne" path="translations/browser_ui_strings_ne.xtb" /> + <file lang="nl" path="translations/browser_ui_strings_nl.xtb" /> + <file lang="no" path="translations/browser_ui_strings_no.xtb" /> + <file lang="or" path="translations/browser_ui_strings_or.xtb" /> + <file lang="pa" path="translations/browser_ui_strings_pa.xtb" /> + <file lang="pl" path="translations/browser_ui_strings_pl.xtb" /> + <file lang="pt-BR" path="translations/browser_ui_strings_pt-BR.xtb" /> + <file lang="pt-PT" path="translations/browser_ui_strings_pt-PT.xtb" /> + <file lang="ro" path="translations/browser_ui_strings_ro.xtb" /> + <file lang="ru" path="translations/browser_ui_strings_ru.xtb" /> + <file lang="si" path="translations/browser_ui_strings_si.xtb" /> + <file lang="sk" path="translations/browser_ui_strings_sk.xtb" /> + <file lang="sl" path="translations/browser_ui_strings_sl.xtb" /> + <file lang="sq" path="translations/browser_ui_strings_sq.xtb" /> + <file lang="sr" path="translations/browser_ui_strings_sr.xtb" /> + <file lang="sv" path="translations/browser_ui_strings_sv.xtb" /> + <file lang="sw" path="translations/browser_ui_strings_sw.xtb" /> + <file lang="ta" path="translations/browser_ui_strings_ta.xtb" /> + <file lang="te" path="translations/browser_ui_strings_te.xtb" /> + <file lang="th" path="translations/browser_ui_strings_th.xtb" /> + <file lang="tr" path="translations/browser_ui_strings_tr.xtb" /> + <file lang="uk" path="translations/browser_ui_strings_uk.xtb" /> + <file lang="ur" path="translations/browser_ui_strings_ur.xtb" /> + <file lang="uz" path="translations/browser_ui_strings_uz.xtb" /> + <file lang="vi" path="translations/browser_ui_strings_vi.xtb" /> + <file lang="zh-CN" path="translations/browser_ui_strings_zh-CN.xtb" /> + <file lang="zh-HK" path="translations/browser_ui_strings_zh-HK.xtb" /> + <file lang="zh-TW" path="translations/browser_ui_strings_zh-TW.xtb" /> + <file lang="zu" path="translations/browser_ui_strings_zu.xtb" /> + </translations> + <release allow_pseudo="false" seq="1"> + <messages fallback_to_english="true"> + <message name="IDS_DELETED" desc='Text that announces to the user that something was deleted.'> + Deleted + </message> + <message name="IDS_OK" desc="Label for a confirm button. Used in multiple contexts. [CHAR-LIMIT=20]"> + OK + </message> + <message name="IDS_OK_GOT_IT" desc="Label of a button by which the user confirms that they read and understood the information or instructions. Used in multiple contexts. [CHAR-LIMIT=20]"> + OK, got it + </message> + <message name="IDS_CANCEL" desc="Label for a cancel button. Used in multiple contexts. [CHAR-LIMIT=20]"> + Cancel + </message> + <message name="IDS_NOT_NOW" desc="Label for a not now button. Used in multiple contexts. [CHAR-LIMIT=20]"> + Not now + </message> + <message name="IDS_SAVE" desc="Label for a button to save a change. Used in multiple contexts. [CHAR-LIMIT=20]"> + Save + </message> + <message name="IDS_DETAILS_LINK" desc="In 1) Settings > Clean up computer (desktop), a link to open details of incompatible applications. In 2) Settings > Lite mode (mobile), static title for data usage breakdown." meaning="Short for 'view details'. Link; static title."> + Details + </message> + <message name="IDS_DONE" desc="Label for a button to save a change or finish editing data. Used in multiple contexts. [CHAR-LIMIT=20]"> + Done + </message> + <message name="IDS_DELETE" desc="Label for a delete button. Used in multiple contexts. [CHAR-LIMIT=20]"> + Delete + </message> + <message name="IDS_REMOVE" desc="Label for a button to remove an item (e.g. a bookmark) from a list. [CHAR-LIMIT=20]"> + Remove + </message> + <message name="IDS_RESET" desc="Label for a button to reset information you are editing to a default."> + Reset + </message> + <message name="IDS_TITLE" desc="Text indicating the title of a button or a textfield. Ued in multiple contexts. [CHAR-LIMIT=32]"> + Title + </message> + <message name="IDS_TEXT_ON" desc="Text indicating that an option is turned on. [CHAR-LIMIT=20]"> + On + </message> + <message name="IDS_TEXT_OFF" desc="Text indicating that an option is turned off. [CHAR-LIMIT=20]"> + Off + </message> + <message name="IDS_LEARN_MORE" desc="Generic label for menu item to learn more about a feature. [CHAR-LIMIT=32]"> + Learn more + </message> + <message name="IDS_MORE" desc="Generic label for a button to show more items or options. [CHAR-LIMIT=20]"> + More + </message> + <message name="IDS_CLOSE" desc="Content description for a button to close a dialog or popup" > + Close + </message> + <message name="IDS_RELOAD" desc="Label for a button that reloads the page. Used in multiple contexts. [CHAR-LIMIT=20]"> + Reload + </message> + <message name="IDS_NO_THANKS" desc="Generic label to say no thanks for a feature. [CHAR-LIMIT=32]"> + No thanks + </message> + <message name="IDS_NEXT" desc="Generic label for a button to advance to the next item. [CHAR-LIMIT=20]"> + Next + </message> + <message name="IDS_CONTINUE_BUTTON" desc="Generic label for a button to continue to the next screen. Used in multiple contexts. [CHAR-LIMIT=20]"> + Continue + </message> + <message name="IDS_SUBMIT" desc="Generic label for a button to submit data. Used in multiple contexts. [CHAR-LIMIT=20]"> + Submit + </message> + <message name="IDS_UNDO" desc="Generic label for a button to undo the previous action."> + Undo + </message> + <message name="IDS_HELP" desc="Generic label for a button that displays help for the current screen."> + Help + </message> + <message name="IDS_TODAY" desc="Generic Label saying the date is today."> + Today + </message> + <message name="IDS_YESTERDAY" desc="Generic Label saying the date is yesterday."> + Yesterday + </message> + <message name="IDS_SELECT" desc="Prompt for user to select something. [CHAR-LIMIT=20]"> + Select + </message> + <message name="IDS_ADD" desc="Prompt for the user to add something, like a new address. [CHAR-LIMIT=20]"> + Add + </message> + <message name="IDS_SHARE" desc="Content description for a button to share item(s). [CHAR-LIMIT=20]"> + Share + </message> + <message name="IDS_SEARCH" desc="The label for a search button."> + Search + </message> + <message name="IDS_SHOW_INFO" desc="The label for a info button to show info."> + Show Info + </message> + <message name="IDS_HIDE_INFO" desc="The label for a info button to hide info."> + Hide Info + </message> + <message name="IDS_COPY_LINK" desc="The label for a menu item to copy a link. [CHAR-LIMIT=30]"> + Copy link + </message> + <message name="IDS_COPIED" desc="Notification telling the user that something has been copied to the clipboard."> + Copied + </message> + <message name="IDS_TRY_AGAIN" desc="The label for a button allowing the user to try an action again. [CHAR-LIMIT=20]"> + Try again + </message> + <message name="IDS_BACK" desc="Label for a back button to return to a previous UI state or screen. Used in multiple contexts. [CHAR-LIMIT=20]"> + Back + </message> + <message name="IDS_CONFIRM" desc="Label for a confirm button. Used in multiple contexts. [CHAR-LIMIT=20]"> + Confirm + </message> + <message name="IDS_SHOW" desc="Label for a show button. Used in multiple contexts. [CHAR-LIMIT=20]"> + Show + </message> + <message name="IDS_USER" desc="Generic label for UI elements with information about user."> + User + </message> + <message name="IDS_MENU_ITEM_MOVE_UP" desc="Option in item menu. User can click the 'Move up' option to move the item up by one position in its list. [CHAR-LIMIT=24]"> + Move up + </message> + <message name="IDS_MENU_ITEM_MOVE_DOWN" desc="Option in item menu. User can click the 'Move down' option to move the item down by one position in its list. [CHAR-LIMIT=24]"> + Move down + </message> + <message name="IDS_MENU_ITEM_MOVE_TO_TOP" desc="Option in item menu. User can click the 'Move to top' option to move the item up to the top of its list. [CHAR-LIMIT=24]"> + Move to top + </message> + </messages> + </release> +</grit>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1 rename to components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1 rename to components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1 rename to components/browser_ui/strings/android/browser_ui_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_NO_THANKS.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1 rename to components/browser_ui/strings/android/browser_ui_strings_grd/IDS_NO_THANKS.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_SHOW.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1 rename to components/browser_ui/strings/android/browser_ui_strings_grd/IDS_SHOW.png.sha1
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb new file mode 100644 index 0000000..0861004 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="af"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb new file mode 100644 index 0000000..6c985cb8 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="am"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb new file mode 100644 index 0000000..e8b5562 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ar"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb new file mode 100644 index 0000000..3ad7206d --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="as"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb new file mode 100644 index 0000000..6d09f4cd --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="az"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb new file mode 100644 index 0000000..09e9a3ad --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="be"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb new file mode 100644 index 0000000..ebab473 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bg"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb new file mode 100644 index 0000000..a66cc1fc --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bn"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb new file mode 100644 index 0000000..7b6fabc --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bs"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb new file mode 100644 index 0000000..1438d89 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ca"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb new file mode 100644 index 0000000..2d95130 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="cs"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb new file mode 100644 index 0000000..751fa4a8 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="da"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb new file mode 100644 index 0000000..91de7f51 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="de"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb new file mode 100644 index 0000000..6e5e7d8 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="el"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb new file mode 100644 index 0000000..0fb2133 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="en-GB"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb new file mode 100644 index 0000000..2fe4770 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es-419"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb new file mode 100644 index 0000000..64022ec --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb new file mode 100644 index 0000000..5244dfd --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="et"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb new file mode 100644 index 0000000..981c85fb --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="eu"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb new file mode 100644 index 0000000..18626f8 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fa"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb new file mode 100644 index 0000000..4691cd5 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fi"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb new file mode 100644 index 0000000..443630e7 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fil"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb new file mode 100644 index 0000000..6330f524 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr-CA"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb new file mode 100644 index 0000000..63026a3 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb new file mode 100644 index 0000000..ad1197a --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gl"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb new file mode 100644 index 0000000..7d8a4df1 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gu"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb new file mode 100644 index 0000000..a6ddd5d --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hi"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb new file mode 100644 index 0000000..26f99d0 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hr"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb new file mode 100644 index 0000000..7ef9a5e0 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hu"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb new file mode 100644 index 0000000..2ae4ee1 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hy"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb new file mode 100644 index 0000000..aa34783 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="id"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb new file mode 100644 index 0000000..b93d5071 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="is"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb new file mode 100644 index 0000000..a6ac8d46 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="it"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb new file mode 100644 index 0000000..86b5533 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="iw"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb new file mode 100644 index 0000000..23139e6 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ja"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb new file mode 100644 index 0000000..57c55dd --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ka"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb new file mode 100644 index 0000000..84420c1 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kk"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb new file mode 100644 index 0000000..fe55255 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="km"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb new file mode 100644 index 0000000..cc3643a2 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kn"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb new file mode 100644 index 0000000..e0fc370 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ko"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb new file mode 100644 index 0000000..71a0883 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ky"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb new file mode 100644 index 0000000..eb6216c --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lo"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb new file mode 100644 index 0000000..5804ae2a --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lt"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb new file mode 100644 index 0000000..a0a1c477 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lv"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb new file mode 100644 index 0000000..2949071 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mk"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb new file mode 100644 index 0000000..f7db315 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ml"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb new file mode 100644 index 0000000..a2218675 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mn"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb new file mode 100644 index 0000000..098d29c --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mr"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb new file mode 100644 index 0000000..1fb470a --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ms"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb new file mode 100644 index 0000000..674ca27 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="my"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb new file mode 100644 index 0000000..30c7e065 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ne"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb new file mode 100644 index 0000000..e782410 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="nl"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb new file mode 100644 index 0000000..913638b --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="no"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb new file mode 100644 index 0000000..fe2ddbc9 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="or"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb new file mode 100644 index 0000000..5c7ac50 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pa"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb new file mode 100644 index 0000000..4519e3d --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pl"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb new file mode 100644 index 0000000..e95eb56b --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-BR"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb new file mode 100644 index 0000000..1dcf557a --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-PT"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb new file mode 100644 index 0000000..9e43493 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ro"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb new file mode 100644 index 0000000..c4a621b --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ru"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb new file mode 100644 index 0000000..712d890 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="si"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb new file mode 100644 index 0000000..00750d31 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sk"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb new file mode 100644 index 0000000..489b7e46 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sl"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb new file mode 100644 index 0000000..3fecfc5 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sq"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb new file mode 100644 index 0000000..38f6f35 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sr"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb new file mode 100644 index 0000000..ddea3dc --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sv"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb new file mode 100644 index 0000000..b775088 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sw"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb new file mode 100644 index 0000000..ef90687 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ta"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb new file mode 100644 index 0000000..48c714b --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="te"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb new file mode 100644 index 0000000..fae31966 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="th"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb new file mode 100644 index 0000000..9a29951 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="tr"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb new file mode 100644 index 0000000..f0db52c --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uk"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb new file mode 100644 index 0000000..ffd34cf8 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ur"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb new file mode 100644 index 0000000..1d58ed4c --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uz"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb new file mode 100644 index 0000000..b2957da --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="vi"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb new file mode 100644 index 0000000..26e8b40 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-CN"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb new file mode 100644 index 0000000..3ecd9e3 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-HK"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb new file mode 100644 index 0000000..935ef485 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-TW"> +</translationbundle>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb new file mode 100644 index 0000000..f9c1cd3 --- /dev/null +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zu"> +</translationbundle>
diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index 7676f6c..43073181 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn
@@ -6,8 +6,9 @@ import("//ui/android/features.gni") android_library("java") { - java_files = - [ "java/src/org/chromium/components/browser_ui/styles/ChromeColors.java" ] + sources = [ + "java/src/org/chromium/components/browser_ui/styles/ChromeColors.java", + ] deps = [ ":java_resources", "//base:base_java",
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn index beec50b3..c84bfd6 100644 --- a/components/browser_ui/widget/android/BUILD.gn +++ b/components/browser_ui/widget/android/BUILD.gn
@@ -6,15 +6,17 @@ import("//ui/android/features.gni") android_library("java") { - java_files = [ + sources = [ "java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java", "java/src/org/chromium/components/browser_ui/widget/DualControlLayout.java", "java/src/org/chromium/components/browser_ui/widget/FadingEdgeScrollView.java", + "java/src/org/chromium/components/browser_ui/widget/text/AlertDialogEditText.java", ] deps = [ ":java_resources", "//base:base_java", + "//third_party/android_deps:android_support_v7_appcompat_java", "//ui/android:ui_java", ] } @@ -30,7 +32,9 @@ android_library("javatests") { testonly = true - java_files = [ "java/src/org/chromium/components/browser_ui/widget/DualControlLayoutTest.java" ] + sources = [ + "java/src/org/chromium/components/browser_ui/widget/DualControlLayoutTest.java", + ] deps = [ ":java", ":java_resources",
diff --git a/chrome/browser/ui/android/widget/java/src/org/chromium/chrome/browser/ui/widget/text/AlertDialogEditText.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/text/AlertDialogEditText.java similarity index 95% rename from chrome/browser/ui/android/widget/java/src/org/chromium/chrome/browser/ui/widget/text/AlertDialogEditText.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/text/AlertDialogEditText.java index e1bedc6c..4011b568 100644 --- a/chrome/browser/ui/android/widget/java/src/org/chromium/chrome/browser/ui/widget/text/AlertDialogEditText.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/text/AlertDialogEditText.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.ui.widget.text; +package org.chromium.components.browser_ui.widget.text; import android.content.Context; import android.graphics.PorterDuff; @@ -16,7 +16,7 @@ import android.widget.EditText; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.browser.ui.widget.R; +import org.chromium.components.browser_ui.widget.R; /** * EditText to use in AlertDialog needed due to b/20882793 and b/122113958. This class should be
diff --git a/components/component_updater/component_updater_service.h b/components/component_updater/component_updater_service.h index 16aceb7..d10071a5 100644 --- a/components/component_updater/component_updater_service.h +++ b/components/component_updater/component_updater_service.h
@@ -165,6 +165,7 @@ friend class ::ComponentsHandler; friend class ::PluginObserver; friend class SwReporterOnDemandFetcher; + friend class SODAComponentInstallerPolicy; #if defined(OS_CHROMEOS) friend class CrOSComponentInstaller; #endif // defined(OS_CHROMEOS)
diff --git a/components/components_strings.grd b/components/components_strings.grd index 34423b46..1052153 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <grit latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl"> @@ -308,6 +308,7 @@ <part file="ssl_errors_strings.grdp" /> <part file="sync_ui_strings.grdp" /> <part file="translate_strings.grdp" /> + <part file="tab_groups_strings.grdp" /> <part file="undo_strings.grdp" /> <part file="version_ui_strings.grdp" />
diff --git a/components/content_capture/android/BUILD.gn b/components/content_capture/android/BUILD.gn index 0e0b92a..c249fc2d 100644 --- a/components/content_capture/android/BUILD.gn +++ b/components/content_capture/android/BUILD.gn
@@ -26,7 +26,7 @@ "//content/public/android:content_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java", "java/src/org/chromium/components/content_capture/ContentCaptureConsumerImpl.java", "java/src/org/chromium/components/content_capture/ContentCaptureController.java",
diff --git a/components/contextual_search/core/browser/public.cc b/components/contextual_search/core/browser/public.cc index e2f2399..85be7c88 100644 --- a/components/contextual_search/core/browser/public.cc +++ b/components/contextual_search/core/browser/public.cc
@@ -8,12 +8,6 @@ const char kContextualSearchFieldTrialName[] = "ContextualSearch"; -// Longpress Resolve variations: -const char kLongpressResolveParamName[] = "longpress_resolve_variation"; -const char kLongpressResolveHideOnScroll[] = "1"; -const char kLongpressResolvePrivacyAggressive[] = "2"; -const char kLongpressResolvePreserveTap[] = "3"; - // Contextual Cards variations and integration Api settings. const char kContextualCardsVersionParamName[] = "contextual_cards_version"; // The version of the Contextual Cards API that we want to invoke.
diff --git a/components/contextual_search/core/browser/public.h b/components/contextual_search/core/browser/public.h index 5a2fcfb..d32e44d 100644 --- a/components/contextual_search/core/browser/public.h +++ b/components/contextual_search/core/browser/public.h
@@ -30,12 +30,6 @@ // Support of unlimited cards with diagnostics enabled, for development. extern const int kContextualCardsDiagnosticIntegration; -// Longpress resolve variations: -extern const char kLongpressResolveParamName[]; -extern const char kLongpressResolveHideOnScroll[]; -extern const char kLongpressResolvePrivacyAggressive[]; -extern const char kLongpressResolvePreserveTap[]; - } // namespace contextual_search #endif // COMPONENTS_CONTEXTUAL_SEARCH_CORE_BROWSER_PUBLIC_H_
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn index f7e06e5..285ad87 100644 --- a/components/crash/android/BUILD.gn +++ b/components/crash/android/BUILD.gn
@@ -27,7 +27,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] srcjar_deps = [ ":java_enums_srcjar" ] - java_files = _jni_sources + sources = _jni_sources } source_set("crash_android") { @@ -67,7 +67,7 @@ "//base:jni_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = _java_handler_jni_sources + sources = _java_handler_jni_sources } static_library("crashpad_main") {
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn index b2f2e507..1bd7dd2 100644 --- a/components/cronet/android/BUILD.gn +++ b/components/cronet/android/BUILD.gn
@@ -245,10 +245,10 @@ # cronet_api_java.jar defines Cronet API. android_library("cronet_api_java") { - java_files = [ + sources = [ "api/src/org/chromium/net/BidirectionalStream.java", - "api/src/org/chromium/net/CronetEngine.java", "api/src/org/chromium/net/CallbackException.java", + "api/src/org/chromium/net/CronetEngine.java", "api/src/org/chromium/net/CronetException.java", "api/src/org/chromium/net/CronetProvider.java", "api/src/org/chromium/net/ExperimentalBidirectionalStream.java", @@ -289,11 +289,11 @@ # cronet_impl_common_base_java.jar - common Cronet code that is shared # by all Cronet engine implementations. android_library("cronet_impl_common_base_java") { - java_files = [ + sources = [ "java/src/org/chromium/net/impl/CallbackExceptionImpl.java", - "java/src/org/chromium/net/impl/CronetExceptionImpl.java", "java/src/org/chromium/net/impl/CronetEngineBase.java", "java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java", + "java/src/org/chromium/net/impl/CronetExceptionImpl.java", "java/src/org/chromium/net/impl/NetworkExceptionImpl.java", "java/src/org/chromium/net/impl/Preconditions.java", "java/src/org/chromium/net/impl/QuicExceptionImpl.java", @@ -320,9 +320,9 @@ # cronet_impl_java_util_java.jar - Classes shared between Java Cronet implementations. android_library("cronet_impl_java_util_java") { - java_files = [ - "java/src/org/chromium/net/impl/JavaUrlRequestUtils.java", + sources = [ "java/src/org/chromium/net/impl/JavaUploadDataSinkBase.java", + "java/src/org/chromium/net/impl/JavaUrlRequestUtils.java", ] deps = [ @@ -333,7 +333,7 @@ # cronet_impl_platform_base_java.jar - Java platform based implementation of the Cronet engine. android_library("cronet_impl_platform_base_java") { - java_files = [ + sources = [ "java/src/org/chromium/net/impl/InputStreamChannel.java", "java/src/org/chromium/net/impl/JavaCronetEngine.java", "java/src/org/chromium/net/impl/JavaCronetEngineBuilderImpl.java", @@ -353,7 +353,7 @@ # cronet_impl_fake_base_java.jar - Fake implementation of Cronet. android_library("cronet_impl_fake_base_java") { - java_files = [ + sources = [ "fake/java/org/chromium/net/test/FakeCronetController.java", "fake/java/org/chromium/net/test/FakeCronetEngine.java", "fake/java/org/chromium/net/test/FakeCronetProvider.java", @@ -385,7 +385,7 @@ ] android_library("cronet_urlconnection_impl_java") { - java_files = [ + sources = [ "java/src/org/chromium/net/urlconnection/CronetBufferedOutputStream.java", "java/src/org/chromium/net/urlconnection/CronetChunkedOutputStream.java", "java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java", @@ -403,7 +403,7 @@ # cronet_impl_native_base_java.jar - native implementation of the Cronet engine. android_library("cronet_impl_native_base_java") { - java_files = [ + sources = [ "java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java", "java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java", "java/src/org/chromium/net/impl/CronetBidirectionalStream.java", @@ -450,7 +450,7 @@ } android_library("cronet_sample_apk_java") { - java_files = [ + sources = [ "sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java", "sample/src/org/chromium/cronet_sample_apk/CronetSampleApplication.java", ] @@ -795,7 +795,9 @@ apk_under_test = ":cronet_sample_apk" android_manifest = "sample/javatests/AndroidManifest.xml" min_sdk_version = _cronet_min_sdk_version - java_files = [ "sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java" ] + sources = [ + "sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java", + ] deps = [ "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", @@ -884,7 +886,7 @@ android_library("cronet_test_apk_java") { testonly = true - java_files = [ + sources = [ "test/src/org/chromium/net/CronetTestApplication.java", "test/src/org/chromium/net/CronetTestUtil.java", "test/src/org/chromium/net/Http2TestHandler.java", @@ -926,10 +928,10 @@ # cronet_common_javatests.jar - Cronet Java test common files. android_library("cronet_common_javatests") { testonly = true - java_files = [ + sources = [ + "test/javatests/src/org/chromium/net/CronetTestRule.java", "test/javatests/src/org/chromium/net/TestUploadDataProvider.java", "test/javatests/src/org/chromium/net/TestUrlRequestCallback.java", - "test/javatests/src/org/chromium/net/CronetTestRule.java", ] deps = [ ":cronet_api_java", @@ -944,12 +946,12 @@ # cronet_fake_javatests.jar - Java tests for the fake implementation of Cronet. android_library("cronet_fake_javatests") { testonly = true - java_files = [ + sources = [ + "fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java", + "fake/javatests/org/chromium/net/test/FakeCronetEngineTest.java", + "fake/javatests/org/chromium/net/test/FakeCronetProviderTest.java", "fake/javatests/org/chromium/net/test/FakeUrlRequestTest.java", "fake/javatests/org/chromium/net/test/FakeUrlResponseTest.java", - "fake/javatests/org/chromium/net/test/FakeCronetProviderTest.java", - "fake/javatests/org/chromium/net/test/FakeCronetEngineTest.java", - "fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java", "fake/javatests/org/chromium/net/test/UrlResponseMatcherTest.java", ] @@ -983,7 +985,7 @@ android_library("cronet_javatests") { testonly = true - java_files = [ + sources = [ "test/javatests/src/org/chromium/net/BidirectionalStreamQuicTest.java", "test/javatests/src/org/chromium/net/BidirectionalStreamTest.java", "test/javatests/src/org/chromium/net/BrotliTest.java", @@ -998,9 +1000,9 @@ "test/javatests/src/org/chromium/net/ExperimentalOptionsTest.java", "test/javatests/src/org/chromium/net/GetStatusTest.java", "test/javatests/src/org/chromium/net/MetricsTestUtil.java", + "test/javatests/src/org/chromium/net/NQETest.java", "test/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java", "test/javatests/src/org/chromium/net/NetworkErrorLoggingTest.java", - "test/javatests/src/org/chromium/net/NQETest.java", "test/javatests/src/org/chromium/net/PkpTest.java", "test/javatests/src/org/chromium/net/QuicTest.java", "test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java", @@ -1009,6 +1011,7 @@ "test/javatests/src/org/chromium/net/TestNetworkQualityRttListener.java", "test/javatests/src/org/chromium/net/TestNetworkQualityThroughputListener.java", "test/javatests/src/org/chromium/net/UploadDataProvidersTest.java", + "test/javatests/src/org/chromium/net/UrlResponseInfoTest.java", "test/javatests/src/org/chromium/net/urlconnection/CronetBufferedOutputStreamTest.java", "test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java", "test/javatests/src/org/chromium/net/urlconnection/CronetFixedModeOutputStreamTest.java", @@ -1018,7 +1021,6 @@ "test/javatests/src/org/chromium/net/urlconnection/MessageLoopTest.java", "test/javatests/src/org/chromium/net/urlconnection/QuicUploadTest.java", "test/javatests/src/org/chromium/net/urlconnection/TestUtil.java", - "test/javatests/src/org/chromium/net/UrlResponseInfoTest.java", ] # Adding deps here won't include those deps in the cronet_tests_java.jar. @@ -1048,10 +1050,10 @@ ] loadable_modules = [ "$root_out_dir/libnetty-tcnative.so" ] - java_files = cronet_smoketests_native_common_srcs + [ - "test/smoketests/src/org/chromium/net/smoke/Http2Test.java", - "test/smoketests/src/org/chromium/net/smoke/QuicTest.java", - ] + sources = cronet_smoketests_native_common_srcs + [ + "test/smoketests/src/org/chromium/net/smoke/Http2Test.java", + "test/smoketests/src/org/chromium/net/smoke/QuicTest.java", + ] deps = [ ":cronet_api_java", @@ -1103,10 +1105,10 @@ android_manifest = "test/javatests/AndroidManifest.xml" min_sdk_version = _cronet_min_sdk_version - java_files = cronet_smoketests_platform_only_common_srcs + [ - "test/src/org/chromium/net/CronetTestApplication.java", - "test/smoketests/src/org/chromium/net/smoke/PlatformOnlyEngineTest.java", - ] + sources = cronet_smoketests_platform_only_common_srcs + [ + "test/src/org/chromium/net/CronetTestApplication.java", + "test/smoketests/src/org/chromium/net/smoke/PlatformOnlyEngineTest.java", + ] deps = [ ":cronet_api_java", @@ -1138,7 +1140,7 @@ apk_name = "MissingNativeLibrarySmokeTestInstrumentation" android_manifest = "test/javatests/AndroidManifest.xml" - java_files = cronet_smoketests_native_common_srcs + [ "test/smoketests/src/org/chromium/net/smoke/MissingNativeLibraryTest.java" ] + sources = cronet_smoketests_native_common_srcs + [ "test/smoketests/src/org/chromium/net/smoke/MissingNativeLibraryTest.java" ] deps = [ ":cronet_api_java", ":cronet_combine_proguard_flags", @@ -1177,7 +1179,7 @@ ":cronet_tests", ] - java_files = [ + sources = [ "test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java", ]
diff --git a/components/dom_distiller/content/browser/android/BUILD.gn b/components/dom_distiller/content/browser/android/BUILD.gn index e4c7c5e..ce1bbd3 100644 --- a/components/dom_distiller/content/browser/android/BUILD.gn +++ b/components/dom_distiller/content/browser/android/BUILD.gn
@@ -12,7 +12,9 @@ "//content/public/android:content_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ "java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java" ] + sources = [ + "java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java", + ] } generate_jni("jni_headers") {
diff --git a/components/dom_distiller/content/browser/distillable_page_utils.cc b/components/dom_distiller/content/browser/distillable_page_utils.cc index 24ac793..f6d3ecdc 100644 --- a/components/dom_distiller/content/browser/distillable_page_utils.cc +++ b/components/dom_distiller/content/browser/distillable_page_utils.cc
@@ -26,20 +26,21 @@ namespace { void OnExtractFeaturesJsResult(const DistillablePageDetector* detector, - base::Callback<void(bool)> callback, + base::OnceCallback<void(bool)> callback, base::Value result) { - callback.Run(detector->Classify(CalculateDerivedFeaturesFromJSON(&result))); + std::move(callback).Run( + detector->Classify(CalculateDerivedFeaturesFromJSON(&result))); } } // namespace void IsDistillablePageForDetector(content::WebContents* web_contents, const DistillablePageDetector* detector, - base::Callback<void(bool)> callback) { + base::OnceCallback<void(bool)> callback) { content::RenderFrameHost* main_frame = web_contents->GetMainFrame(); if (!main_frame) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, false)); + FROM_HERE, base::BindOnce(std::move(callback), false)); return; } std::string extract_features_js = @@ -47,7 +48,7 @@ IDR_EXTRACT_PAGE_FEATURES_JS); RunIsolatedJavaScript( main_frame, extract_features_js, - base::BindOnce(OnExtractFeaturesJsResult, detector, callback)); + base::BindOnce(OnExtractFeaturesJsResult, detector, std::move(callback))); } std::ostream& operator<<(std::ostream& os, const DistillabilityResult& result) {
diff --git a/components/dom_distiller/content/browser/distillable_page_utils.h b/components/dom_distiller/content/browser/distillable_page_utils.h index 599a7ab..b02f7857 100644 --- a/components/dom_distiller/content/browser/distillable_page_utils.h +++ b/components/dom_distiller/content/browser/distillable_page_utils.h
@@ -26,7 +26,7 @@ // |web_contents| and |detector| must be non-null. void IsDistillablePageForDetector(content::WebContents* web_contents, const DistillablePageDetector* detector, - base::Callback<void(bool)> callback); + base::OnceCallback<void(bool)> callback); struct DistillabilityResult { bool is_distillable;
diff --git a/components/dom_distiller/content/browser/distillable_page_utils_browsertest.cc b/components/dom_distiller/content/browser/distillable_page_utils_browsertest.cc index 9da0ace..4ac99de 100644 --- a/components/dom_distiller/content/browser/distillable_page_utils_browsertest.cc +++ b/components/dom_distiller/content/browser/distillable_page_utils_browsertest.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/path_service.h" #include "base/run_loop.h" #include "build/build_config.h" @@ -48,7 +49,7 @@ embedded_test_server()->GetURL(url), content::Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); url_loaded_runner.Run(); - main_frame_loaded_callback_ = base::Closure(); + main_frame_loaded_callback_.Reset(); Observe(nullptr); } @@ -78,29 +79,29 @@ void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override { if (!render_frame_host->GetParent()) - main_frame_loaded_callback_.Run(); + std::move(main_frame_loaded_callback_).Run(); } - base::Closure main_frame_loaded_callback_; + base::OnceClosure main_frame_loaded_callback_; }; class ResultHolder { public: - ResultHolder(base::Closure callback) : callback_(callback) {} + ResultHolder(base::OnceClosure callback) : callback_(std::move(callback)) {} void OnResult(bool result) { result_ = result; - callback_.Run(); + std::move(callback_).Run(); } bool GetResult() { return result_; } - base::Callback<void(bool)> GetCallback() { - return base::Bind(&ResultHolder::OnResult, base::Unretained(this)); + base::OnceCallback<void(bool)> GetCallback() { + return base::BindOnce(&ResultHolder::OnResult, base::Unretained(this)); } private: - base::Closure callback_; + base::OnceClosure callback_; bool result_; };
diff --git a/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc b/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc index 60216f3..96c3126 100644 --- a/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc +++ b/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc
@@ -51,29 +51,29 @@ class WebContentsMainFrameHelper : public content::WebContentsObserver { public: WebContentsMainFrameHelper(content::WebContents* web_contents, - const base::Closure& callback, + base::OnceClosure callback, bool wait_for_document_loaded) : WebContentsObserver(web_contents), - callback_(callback), + callback_(std::move(callback)), wait_for_document_loaded_(wait_for_document_loaded) {} void DidFinishNavigation( content::NavigationHandle* navigation_handle) override { - if (wait_for_document_loaded_) + if (wait_for_document_loaded_ || !callback_) return; if (navigation_handle->HasCommitted() && navigation_handle->IsInMainFrame()) - callback_.Run(); + std::move(callback_).Run(); } void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override { - if (wait_for_document_loaded_) { + if (wait_for_document_loaded_ && callback_) { if (!render_frame_host->GetParent()) - callback_.Run(); + std::move(callback_).Run(); } } private: - base::Closure callback_; + base::OnceClosure callback_; bool wait_for_document_loaded_; }; @@ -92,9 +92,9 @@ web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16(script), base::BindOnce( - [](base::Closure callback, base::Value* out, base::Value result) { + [](base::OnceClosure callback, base::Value* out, base::Value result) { (*out) = std::move(result); - callback.Run(); + std::move(callback).Run(); }, run_loop.QuitClosure(), &result)); run_loop.Run(); @@ -114,20 +114,21 @@ ContentBrowserTest::SetUpOnMainThread(); } - void DistillPage(const base::Closure& quit_closure, const std::string& url) { + void DistillPage(base::OnceClosure quit_closure, const std::string& url) { distiller_page_->DistillPage( embedded_test_server()->GetURL(url), dom_distiller::proto::DomDistillerOptions(), - base::Bind(&DistillerPageWebContentsTest::OnPageDistillationFinished, - base::Unretained(this), quit_closure)); + base::BindOnce( + &DistillerPageWebContentsTest::OnPageDistillationFinished, + base::Unretained(this), std::move(quit_closure))); } void OnPageDistillationFinished( - base::Closure quit_closure, + base::OnceClosure quit_closure, std::unique_ptr<proto::DomDistillerResult> distiller_result, bool distillation_successful) { distiller_result_ = std::move(distiller_result); - quit_closure.Run(); + std::move(quit_closure).Run(); } private:
diff --git a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc index 92269c7..8620c62 100644 --- a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc +++ b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc
@@ -34,16 +34,16 @@ class WebContentsMainFrameHelper : public content::WebContentsObserver { public: WebContentsMainFrameHelper(content::WebContents* web_contents, - const base::Closure& callback) - : WebContentsObserver(web_contents), callback_(callback) {} + base::OnceClosure callback) + : WebContentsObserver(web_contents), callback_(std::move(callback)) {} void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override { - if (!render_frame_host->GetParent()) - callback_.Run(); + if (!render_frame_host->GetParent() && callback_) + std::move(callback_).Run(); } private: - base::Closure callback_; + base::OnceClosure callback_; }; } // namespace @@ -77,11 +77,11 @@ void OnJsTestExecutionDone(base::Value value) { result_ = std::move(value); - js_test_execution_done_callback_.Run(); + std::move(js_test_execution_done_callback_).Run(); } protected: - base::Closure js_test_execution_done_callback_; + base::OnceClosure js_test_execution_done_callback_; base::Value result_; private:
diff --git a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc index ca9fe626..b77f74e 100644 --- a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc +++ b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.cc
@@ -24,7 +24,7 @@ : RenderFrameObserver(render_frame), distiller_isolated_world_id_(distiller_isolated_world_id), is_distiller_page_(false) { - registry->AddInterface(base::Bind( + registry->AddInterface(base::BindRepeating( &DistillerJsRenderFrameObserver::CreateDistillerPageNotifierService, weak_factory_.GetWeakPtr())); }
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.cc b/components/dom_distiller/content/renderer/distiller_native_javascript.cc index 0c1831e..b67f7fb 100644 --- a/components/dom_distiller/content/renderer/distiller_native_javascript.cc +++ b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
@@ -43,7 +43,7 @@ // does not transfer ownership of the interface. BindFunctionToObject( isolate, distiller_obj, "openSettings", - base::Bind( + base::BindRepeating( &mojom::DistillerJavaScriptService::HandleDistillerOpenSettingsCall, base::Unretained(distiller_js_service_.get()))); } @@ -53,7 +53,7 @@ v8::Isolate* isolate, v8::Local<v8::Object> javascript_object, const std::string& name, - const base::Callback<Sig> callback) { + const base::RepeatingCallback<Sig>& callback) { v8::Local<v8::Context> context = isolate->GetCurrentContext(); // Get the isolate associated with this object. javascript_object
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.h b/components/dom_distiller/content/renderer/distiller_native_javascript.h index 6f50d7d7..ce21ee7 100644 --- a/components/dom_distiller/content/renderer/distiller_native_javascript.h +++ b/components/dom_distiller/content/renderer/distiller_native_javascript.h
@@ -31,7 +31,7 @@ void BindFunctionToObject(v8::Isolate* isolate, v8::Local<v8::Object> javascript_object, const std::string& name, - const base::Callback<Sig> callback); + const base::RepeatingCallback<Sig>& callback); // Make sure the mojo service is connected. void EnsureServiceConnected();
diff --git a/components/dom_distiller/core/android/BUILD.gn b/components/dom_distiller/core/android/BUILD.gn index e7e2d1b..36bcac6 100644 --- a/components/dom_distiller/core/android/BUILD.gn +++ b/components/dom_distiller/core/android/BUILD.gn
@@ -10,10 +10,10 @@ "//base:jni_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ + "java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java", "java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java", "java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java", - "java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java", ] srcjar_deps = [ ":jni_enums" ] }
diff --git a/components/dom_distiller/core/distilled_content_store.cc b/components/dom_distiller/core/distilled_content_store.cc index 0fbbd88..17a0240 100644 --- a/components/dom_distiller/core/distilled_content_store.cc +++ b/components/dom_distiller/core/distilled_content_store.cc
@@ -26,7 +26,7 @@ InjectContent(entry, proto); if (!callback.is_null()) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, true)); + FROM_HERE, base::BindOnce(std::move(callback), true)); } } @@ -58,8 +58,8 @@ distilled_article.reset(new DistilledArticleProto()); } base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(callback, success, std::move(distilled_article))); + FROM_HERE, base::BindOnce(std::move(callback), success, + std::move(distilled_article))); } void InMemoryContentStore::InjectContent(const ArticleEntry& entry,
diff --git a/components/dom_distiller/core/distilled_content_store.h b/components/dom_distiller/core/distilled_content_store.h index a1a8680..06ee027 100644 --- a/components/dom_distiller/core/distilled_content_store.h +++ b/components/dom_distiller/core/distilled_content_store.h
@@ -24,10 +24,10 @@ // ArticleEntry. class DistilledContentStore { public: - typedef base::Callback<void(bool /* success */, - std::unique_ptr<DistilledArticleProto>)> + typedef base::OnceCallback<void(bool /* success */, + std::unique_ptr<DistilledArticleProto>)> LoadCallback; - typedef base::Callback<void(bool /* success */)> SaveCallback; + typedef base::OnceCallback<void(bool /* success */)> SaveCallback; virtual void SaveContent(const ArticleEntry& entry, const DistilledArticleProto& proto,
diff --git a/components/dom_distiller/core/distilled_content_store_unittest.cc b/components/dom_distiller/core/distilled_content_store_unittest.cc index 7c47d09..9f77f88 100644 --- a/components/dom_distiller/core/distilled_content_store_unittest.cc +++ b/components/dom_distiller/core/distilled_content_store_unittest.cc
@@ -82,15 +82,15 @@ const DistilledArticleProto stored_proto = CreateDistilledArticleForEntry(entry); store_->SaveContent(entry, stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; store_->LoadContent(entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); EXPECT_EQ(stored_proto.SerializeAsString(), @@ -105,8 +105,8 @@ CreateEntry("bogus-id", GURL("https://url1"), GURL("https://url2"), GURL("https://url3")); store_->LoadContent(entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(load_success_); } @@ -123,8 +123,8 @@ const DistilledArticleProto first_stored_proto = CreateDistilledArticleForEntry(first_entry); store_->SaveContent(first_entry, first_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -136,16 +136,16 @@ const DistilledArticleProto second_stored_proto = CreateDistilledArticleForEntry(second_entry); store_->SaveContent(second_entry, second_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; // Load second article. store_->LoadContent(second_entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); load_success_ = false; @@ -155,8 +155,8 @@ // Load first article. store_->LoadContent(first_entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); EXPECT_EQ(first_stored_proto.SerializeAsString(), @@ -179,8 +179,8 @@ const DistilledArticleProto first_stored_proto = CreateDistilledArticleForEntry(first_entry); store_->SaveContent(first_entry, first_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -192,8 +192,8 @@ const DistilledArticleProto second_stored_proto = CreateDistilledArticleForEntry(second_entry); store_->SaveContent(second_entry, second_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -205,8 +205,8 @@ const DistilledArticleProto third_stored_proto = CreateDistilledArticleForEntry(third_entry); store_->SaveContent(third_entry, third_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -214,8 +214,8 @@ // Load first article. This will make the first article the most recent // accessed article. store_->LoadContent(first_entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); load_success_ = false; @@ -230,8 +230,8 @@ const DistilledArticleProto fourth_stored_proto = CreateDistilledArticleForEntry(fourth_entry); store_->SaveContent(fourth_entry, fourth_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -239,8 +239,8 @@ // Load second article, which by now is the oldest accessed article, since // the first article has been loaded once. store_->LoadContent(second_entry, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); // Since the store can only contain |kMaxNumArticles| entries, this load // should fail. @@ -256,8 +256,8 @@ const DistilledArticleProto stored_proto = CreateDistilledArticleForEntry(entry); store_->SaveContent(entry, stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -266,8 +266,8 @@ const ArticleEntry lookup_entry1 = CreateEntry("lookup-id", GURL("https://url1")); store_->LoadContent(lookup_entry1, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); EXPECT_EQ(stored_proto.SerializeAsString(), @@ -277,8 +277,8 @@ const ArticleEntry lookup_entry2 = CreateEntry("lookup-id", GURL("bogus"), GURL("https://url2")); store_->LoadContent(lookup_entry2, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); EXPECT_EQ(stored_proto.SerializeAsString(), @@ -301,8 +301,8 @@ const DistilledArticleProto first_stored_proto = CreateDistilledArticleForEntry(first_entry); store_->SaveContent(first_entry, first_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; @@ -312,8 +312,8 @@ const ArticleEntry first_entry_lookup = CreateEntry("lookup-id", GURL("https://url1")); store_->LoadContent(first_entry_lookup, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(load_success_); EXPECT_EQ(first_stored_proto.SerializeAsString(), @@ -326,16 +326,16 @@ const DistilledArticleProto second_stored_proto = CreateDistilledArticleForEntry(second_entry); store_->SaveContent(second_entry, second_stored_proto, - base::Bind(&InMemoryContentStoreTest::OnSaveCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnSaveCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(save_success_); save_success_ = false; // Looking up the first entry by URL should fail when it is not in the cache. store_->LoadContent(first_entry_lookup, - base::Bind(&InMemoryContentStoreTest::OnLoadCallback, - base::Unretained(this))); + base::BindOnce(&InMemoryContentStoreTest::OnLoadCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(load_success_); }
diff --git a/components/dom_distiller/core/distiller.cc b/components/dom_distiller/core/distiller.cc index 3e51669..29a1a6f 100644 --- a/components/dom_distiller/core/distiller.cc +++ b/components/dom_distiller/core/distiller.cc
@@ -112,11 +112,11 @@ void DistillerImpl::DistillPage(const GURL& url, std::unique_ptr<DistillerPage> distiller_page, - const DistillationFinishedCallback& finished_cb, + DistillationFinishedCallback finished_cb, const DistillationUpdateCallback& update_cb) { DCHECK(AreAllPagesFinished()); distiller_page_ = std::move(distiller_page); - finished_cb_ = finished_cb; + finished_cb_ = std::move(finished_cb); update_cb_ = update_cb; AddToDistillationQueue(0, url); @@ -416,8 +416,7 @@ base::AutoReset<bool> dont_delete_this_in_callback(&destruction_allowed_, false); - finished_cb_.Run(std::move(article_proto)); - finished_cb_.Reset(); + std::move(finished_cb_).Run(std::move(article_proto)); } }
diff --git a/components/dom_distiller/core/distiller.h b/components/dom_distiller/core/distiller.h index 4524b80..253ab31 100644 --- a/components/dom_distiller/core/distiller.h +++ b/components/dom_distiller/core/distiller.h
@@ -31,10 +31,10 @@ class Distiller { public: - typedef base::Callback<void(std::unique_ptr<DistilledArticleProto>)> - DistillationFinishedCallback; - typedef base::Callback<void(const ArticleDistillationUpdate&)> - DistillationUpdateCallback; + using DistillationFinishedCallback = + base::OnceCallback<void(std::unique_ptr<DistilledArticleProto>)>; + using DistillationUpdateCallback = + base::RepeatingCallback<void(const ArticleDistillationUpdate&)>; virtual ~Distiller() {} @@ -46,7 +46,7 @@ // distillation is completed. virtual void DistillPage(const GURL& url, std::unique_ptr<DistillerPage> distiller_page, - const DistillationFinishedCallback& finished_cb, + DistillationFinishedCallback finished_cb, const DistillationUpdateCallback& update_cb) = 0; }; @@ -80,7 +80,7 @@ void DistillPage(const GURL& url, std::unique_ptr<DistillerPage> distiller_page, - const DistillationFinishedCallback& finished_cb, + DistillationFinishedCallback finished_cb, const DistillationUpdateCallback& update_cb) override; void SetMaxNumPagesInArticle(size_t max_num_pages);
diff --git a/components/dom_distiller/core/distiller_page.cc b/components/dom_distiller/core/distiller_page.cc index e641bdb..e207021 100644 --- a/components/dom_distiller/core/distiller_page.cc +++ b/components/dom_distiller/core/distiller_page.cc
@@ -76,12 +76,12 @@ void DistillerPage::DistillPage( const GURL& gurl, const dom_distiller::proto::DomDistillerOptions options, - const DistillerPageCallback& callback) { + DistillerPageCallback callback) { DCHECK(ready_); // It is only possible to distill one page at a time. |ready_| is reset when // the callback to OnDistillationDone happens. ready_ = false; - distiller_page_callback_ = callback; + distiller_page_callback_ = std::move(callback); distillation_start_ = base::TimeTicks::Now(); DistillPageImpl(gurl, GetDistillerScriptWithOptions(options, StringifyOutput())); @@ -152,7 +152,7 @@ } base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(distiller_page_callback_, + FROM_HERE, base::BindOnce(std::move(distiller_page_callback_), std::move(distiller_result), found_content)); }
diff --git a/components/dom_distiller/core/distiller_page.h b/components/dom_distiller/core/distiller_page.h index 8d381e00..3a2a91f6 100644 --- a/components/dom_distiller/core/distiller_page.h +++ b/components/dom_distiller/core/distiller_page.h
@@ -30,10 +30,9 @@ // thrown away without ever being used. class DistillerPage { public: - typedef base::Callback<void( + using DistillerPageCallback = base::OnceCallback<void( std::unique_ptr<proto::DomDistillerResult> distilled_page, - bool distillation_successful)> - DistillerPageCallback; + bool distillation_successful)>; DistillerPage(); virtual ~DistillerPage(); @@ -44,7 +43,7 @@ // extract the same content. void DistillPage(const GURL& url, const proto::DomDistillerOptions options, - const DistillerPageCallback& callback); + DistillerPageCallback callback); // Called when the JavaScript execution completes. |page_url| is the url of // the distilled page. |value| contains data returned by the script.
diff --git a/components/dom_distiller/core/distiller_unittest.cc b/components/dom_distiller/core/distiller_unittest.cc index 00ca3ba..dcf475d 100644 --- a/components/dom_distiller/core/distiller_unittest.cc +++ b/components/dom_distiller/core/distiller_unittest.cc
@@ -244,11 +244,10 @@ responses_[kImageURLs[1]] = string(kImageData[1]); } - void FetchURL(const string& url, - const URLFetcherCallback& callback) override { + void FetchURL(const string& url, URLFetcherCallback callback) override { ASSERT_FALSE(callback.is_null()); url_ = url; - callback_ = callback; + callback_ = std::move(callback); if (!delay_fetch_) { PostCallbackTask(); } @@ -258,7 +257,7 @@ ASSERT_TRUE(base::MessageLoopCurrent::Get()); ASSERT_FALSE(callback_.is_null()); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback_, responses_[url_])); + FROM_HERE, base::BindOnce(std::move(callback_), responses_[url_])); } private: @@ -300,11 +299,12 @@ void DistillPage(const std::string& url, std::unique_ptr<DistillerPage> distiller_page) { - distiller_->DistillPage(GURL(url), std::move(distiller_page), - base::Bind(&DistillerTest::OnDistillArticleDone, - base::Unretained(this)), - base::Bind(&DistillerTest::OnDistillArticleUpdate, - base::Unretained(this))); + distiller_->DistillPage( + GURL(url), std::move(distiller_page), + base::BindOnce(&DistillerTest::OnDistillArticleDone, + base::Unretained(this)), + base::BindRepeating(&DistillerTest::OnDistillArticleUpdate, + base::Unretained(this))); } protected:
diff --git a/components/dom_distiller/core/distiller_url_fetcher.cc b/components/dom_distiller/core/distiller_url_fetcher.cc index ab88486..e3d230b 100644 --- a/components/dom_distiller/core/distiller_url_fetcher.cc +++ b/components/dom_distiller/core/distiller_url_fetcher.cc
@@ -30,10 +30,10 @@ DistillerURLFetcher::~DistillerURLFetcher() {} void DistillerURLFetcher::FetchURL(const std::string& url, - const URLFetcherCallback& callback) { + URLFetcherCallback callback) { // Don't allow a fetch if one is pending. DCHECK(!url_loader_); - callback_ = callback; + callback_ = std::move(callback); url_loader_ = CreateURLFetcher(url); url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( url_loader_factory_.get(), @@ -98,7 +98,7 @@ // an empty string into the proto otherwise. response = std::move(*response_body); } - callback_.Run(response); + std::move(callback_).Run(response); } } // namespace dom_distiller
diff --git a/components/dom_distiller/core/distiller_url_fetcher.h b/components/dom_distiller/core/distiller_url_fetcher.h index c883dca2..12f3545 100644 --- a/components/dom_distiller/core/distiller_url_fetcher.h +++ b/components/dom_distiller/core/distiller_url_fetcher.h
@@ -41,11 +41,10 @@ virtual ~DistillerURLFetcher(); // Indicates when a fetch is done. - typedef base::Callback<void(const std::string& data)> URLFetcherCallback; + using URLFetcherCallback = base::OnceCallback<void(const std::string& data)>; // Fetches a |url|. Notifies when the fetch is done via |callback|. - virtual void FetchURL(const std::string& url, - const URLFetcherCallback& callback); + virtual void FetchURL(const std::string& url, URLFetcherCallback callback); protected: virtual std::unique_ptr<network::SimpleURLLoader> CreateURLFetcher(
diff --git a/components/dom_distiller/core/distiller_url_fetcher_unittest.cc b/components/dom_distiller/core/distiller_url_fetcher_unittest.cc index 224c863..cb65c93 100644 --- a/components/dom_distiller/core/distiller_url_fetcher_unittest.cc +++ b/components/dom_distiller/core/distiller_url_fetcher_unittest.cc
@@ -44,9 +44,9 @@ } void Fetch(const std::string& url, const std::string& expected_response) { - url_fetcher_->FetchURL(url, - base::Bind(&DistillerURLFetcherTest::FetcherCallback, - base::Unretained(this))); + url_fetcher_->FetchURL( + url, base::BindOnce(&DistillerURLFetcherTest::FetcherCallback, + base::Unretained(this))); base::RunLoop().RunUntilIdle(); CHECK_EQ(expected_response, response_); }
diff --git a/components/dom_distiller/core/dom_distiller_service.cc b/components/dom_distiller/core/dom_distiller_service.cc index 2311459c..32bbbf20 100644 --- a/components/dom_distiller/core/dom_distiller_service.cc +++ b/components/dom_distiller/core/dom_distiller_service.cc
@@ -103,9 +103,9 @@ TaskTracker* DomDistillerService::CreateTaskTracker(const ArticleEntry& entry) { TaskTracker::CancelCallback cancel_callback = - base::Bind(&DomDistillerService::CancelTask, base::Unretained(this)); - tasks_.push_back(std::make_unique<TaskTracker>(entry, cancel_callback, - content_store_.get())); + base::BindOnce(&DomDistillerService::CancelTask, base::Unretained(this)); + tasks_.push_back(std::make_unique<TaskTracker>( + entry, std::move(cancel_callback), content_store_.get())); return tasks_.back().get(); }
diff --git a/components/dom_distiller/core/dom_distiller_service.h b/components/dom_distiller/core/dom_distiller_service.h index 2cf44ba..2a46cb7 100644 --- a/components/dom_distiller/core/dom_distiller_service.h +++ b/components/dom_distiller/core/dom_distiller_service.h
@@ -32,7 +32,6 @@ // thread. Callbacks will be called on that same thread. class DomDistillerServiceInterface { public: - typedef base::Callback<void(bool)> ArticleAvailableCallback; virtual ~DomDistillerServiceInterface() {} // Request to view an article by url.
diff --git a/components/dom_distiller/core/dom_distiller_service_unittest.cc b/components/dom_distiller/core/dom_distiller_service_unittest.cc index b2efb10..1b032c5 100644 --- a/components/dom_distiller/core/dom_distiller_service_unittest.cc +++ b/components/dom_distiller/core/dom_distiller_service_unittest.cc
@@ -35,11 +35,6 @@ void(ArticleDistillationUpdate article_update)); }; -class MockArticleAvailableCallback { - public: - MOCK_METHOD1(DistillationCompleted, void(bool)); -}; - void RunDistillerCallback(FakeDistiller* distiller, std::unique_ptr<DistilledArticleProto> proto) { distiller->RunDistillerCallback(std::move(proto));
diff --git a/components/dom_distiller/core/fake_distiller.cc b/components/dom_distiller/core/fake_distiller.cc index a86e7b5..67397610 100644 --- a/components/dom_distiller/core/fake_distiller.cc +++ b/components/dom_distiller/core/fake_distiller.cc
@@ -41,10 +41,10 @@ void FakeDistiller::DistillPage( const GURL& url, std::unique_ptr<DistillerPage> distiller_page, - const DistillationFinishedCallback& article_callback, + DistillationFinishedCallback article_callback, const DistillationUpdateCallback& page_callback) { url_ = url; - article_callback_ = article_callback; + article_callback_ = std::move(article_callback); page_callback_ = page_callback; if (distillation_initiated_callback_) { std::move(distillation_initiated_callback_).Run(); @@ -82,8 +82,7 @@ base::AutoReset<bool> dont_delete_this_in_callback(&destruction_allowed_, false); - article_callback_.Run(std::move(proto)); - article_callback_.Reset(); + std::move(article_callback_).Run(std::move(proto)); } } // namespace test
diff --git a/components/dom_distiller/core/fake_distiller.h b/components/dom_distiller/core/fake_distiller.h index 7b8d47a4..3ed67c7 100644 --- a/components/dom_distiller/core/fake_distiller.h +++ b/components/dom_distiller/core/fake_distiller.h
@@ -43,7 +43,7 @@ void DistillPage(const GURL& url, std::unique_ptr<DistillerPage> distiller_page, - const DistillationFinishedCallback& article_callback, + DistillationFinishedCallback article_callback, const DistillationUpdateCallback& page_callback) override; void RunDistillerCallback(std::unique_ptr<DistilledArticleProto> proto); @@ -51,7 +51,7 @@ GURL GetUrl() { return url_; } - DistillationFinishedCallback GetArticleCallback() { + const DistillationFinishedCallback& GetArticleCallback() const { return article_callback_; }
diff --git a/components/dom_distiller/core/task_tracker.cc b/components/dom_distiller/core/task_tracker.cc index a8f74cdd..ba7329b 100644 --- a/components/dom_distiller/core/task_tracker.cc +++ b/components/dom_distiller/core/task_tracker.cc
@@ -19,18 +19,18 @@ namespace dom_distiller { ViewerHandle::ViewerHandle(CancelCallback callback) - : cancel_callback_(callback) {} + : cancel_callback_(std::move(callback)) {} ViewerHandle::~ViewerHandle() { if (!cancel_callback_.is_null()) { - cancel_callback_.Run(); + std::move(cancel_callback_).Run(); } } TaskTracker::TaskTracker(const ArticleEntry& entry, CancelCallback callback, DistilledContentStore* content_store) - : cancel_callback_(callback), + : cancel_callback_(std::move(callback)), content_store_(content_store), blob_fetcher_running_(false), entry_(entry), @@ -56,25 +56,26 @@ DCHECK(url.is_valid()); distiller_ = factory->CreateDistillerForUrl(url); - distiller_->DistillPage(url, std::move(distiller_page), - base::Bind(&TaskTracker::OnDistillerFinished, - weak_ptr_factory_.GetWeakPtr()), - base::Bind(&TaskTracker::OnArticleDistillationUpdated, - weak_ptr_factory_.GetWeakPtr())); + distiller_->DistillPage( + url, std::move(distiller_page), + base::BindOnce(&TaskTracker::OnDistillerFinished, + weak_ptr_factory_.GetWeakPtr()), + base::BindRepeating(&TaskTracker::OnArticleDistillationUpdated, + weak_ptr_factory_.GetWeakPtr())); } void TaskTracker::StartBlobFetcher() { if (content_store_) { blob_fetcher_running_ = true; content_store_->LoadContent(entry_, - base::Bind(&TaskTracker::OnBlobFetched, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&TaskTracker::OnBlobFetched, + weak_ptr_factory_.GetWeakPtr())); } } -void TaskTracker::AddSaveCallback(const SaveCallback& callback) { +void TaskTracker::AddSaveCallback(SaveCallback callback) { DCHECK(!callback.is_null()); - save_callbacks_.push_back(callback); + save_callbacks_.push_back(std::move(callback)); if (content_ready_) { // Distillation for this task has already completed, and so it can be // immediately saved. @@ -92,8 +93,8 @@ FROM_HERE, base::BindOnce(&TaskTracker::NotifyViewer, weak_ptr_factory_.GetWeakPtr(), delegate)); } - return std::unique_ptr<ViewerHandle>(new ViewerHandle(base::Bind( - &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate))); + return std::make_unique<ViewerHandle>(base::BindOnce( + &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate)); } const std::string& TaskTracker::GetEntryId() const { @@ -130,7 +131,7 @@ base::AutoReset<bool> dont_delete_this_in_callback(&destruction_allowed_, false); - cancel_callback_.Run(this); + std::move(cancel_callback_).Run(this); } void TaskTracker::CancelSaveCallbacks() { @@ -232,11 +233,8 @@ void TaskTracker::DoSaveCallbacks(bool success) { if (!save_callbacks_.empty()) { - for (size_t i = 0; i < save_callbacks_.size(); ++i) { - DCHECK(!save_callbacks_[i].is_null()); - save_callbacks_[i].Run(entry_, distilled_article_.get(), success); - } - + for (auto& callback : save_callbacks_) + std::move(callback).Run(entry_, distilled_article_.get(), success); save_callbacks_.clear(); MaybeCancel(); }
diff --git a/components/dom_distiller/core/task_tracker.h b/components/dom_distiller/core/task_tracker.h index 6446184..ccae84a 100644 --- a/components/dom_distiller/core/task_tracker.h +++ b/components/dom_distiller/core/task_tracker.h
@@ -28,7 +28,7 @@ // be cancelled when the handle is destroyed. class ViewerHandle { public: - typedef base::Callback<void()> CancelCallback; + using CancelCallback = base::OnceCallback<void()>; explicit ViewerHandle(CancelCallback callback); ~ViewerHandle(); @@ -72,10 +72,9 @@ // and at least one of the sources should be started. class TaskTracker { public: - typedef base::Callback<void(TaskTracker*)> CancelCallback; - typedef base::Callback< - void(const ArticleEntry&, const DistilledArticleProto*, bool)> - SaveCallback; + using CancelCallback = base::OnceCallback<void(TaskTracker*)>; + using SaveCallback = base::OnceCallback< + void(const ArticleEntry&, const DistilledArticleProto*, bool)>; TaskTracker(const ArticleEntry& entry, CancelCallback callback, @@ -87,7 +86,7 @@ std::unique_ptr<DistillerPage> distiller_page); void StartBlobFetcher(); - void AddSaveCallback(const SaveCallback& callback); + void AddSaveCallback(SaveCallback callback); void CancelSaveCallbacks();
diff --git a/components/dom_distiller/core/task_tracker_unittest.cc b/components/dom_distiller/core/task_tracker_unittest.cc index 5e8f459..3c7a106 100644 --- a/components/dom_distiller/core/task_tracker_unittest.cc +++ b/components/dom_distiller/core/task_tracker_unittest.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/run_loop.h" +#include "base/test/gmock_move_support.h" #include "base/test/task_environment.h" #include "components/dom_distiller/core/article_distillation_update.h" #include "components/dom_distiller/core/article_entry.h" @@ -32,8 +33,11 @@ class MockContentStore : public DistilledContentStore { public: - MOCK_METHOD2(LoadContent, - void(const ArticleEntry& entry, LoadCallback callback)); + void LoadContent(const ArticleEntry& entry, LoadCallback callback) override { + LoadContent_(entry, callback); + } + MOCK_METHOD2(LoadContent_, + void(const ArticleEntry& entry, LoadCallback& callback)); MOCK_METHOD3(SaveContent, void(const ArticleEntry& entry, const DistilledArticleProto& proto, @@ -44,7 +48,7 @@ public: TestCancelCallback() : cancelled_(false) {} TaskTracker::CancelCallback GetCallback() { - return base::Bind(&TestCancelCallback::Cancel, base::Unretained(this)); + return base::BindOnce(&TestCancelCallback::Cancel, base::Unretained(this)); } void Cancel(TaskTracker*) { cancelled_ = true; } bool Cancelled() { return cancelled_; } @@ -133,8 +137,8 @@ EXPECT_FALSE(cancel_callback.Cancelled()); MockSaveCallback save_callback; - task_tracker.AddSaveCallback( - base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback))); + task_tracker.AddSaveCallback(base::BindOnce( + &MockSaveCallback::Save, base::Unretained(&save_callback))); handle.reset(); // Since there is a pending save request, the task shouldn't be cancelled. @@ -201,8 +205,8 @@ nullptr); MockSaveCallback save_callback; - task_tracker.AddSaveCallback( - base::Bind(&MockSaveCallback::Save, base::Unretained(&save_callback))); + task_tracker.AddSaveCallback(base::BindOnce( + &MockSaveCallback::Save, base::Unretained(&save_callback))); base::RunLoop().RunUntilIdle(); EXPECT_CALL(save_callback, Save(_, _, _)); @@ -351,8 +355,8 @@ task_tracker.AddViewer(&viewer_delegate)); DistilledContentStore::LoadCallback content_store_load_callback; - EXPECT_CALL(content_store, LoadContent(_, _)) - .WillOnce(testing::SaveArg<1>(&content_store_load_callback)); + EXPECT_CALL(content_store, LoadContent_(_, _)) + .WillOnce(MoveArg<1>(&content_store_load_callback)); task_tracker.StartDistiller(&distiller_factory, std::unique_ptr<DistillerPage>()); @@ -364,9 +368,10 @@ base::RunLoop().RunUntilIdle(); EXPECT_CALL(viewer_delegate, OnArticleReady(_)); - content_store_load_callback.Run( - true, std::unique_ptr<DistilledArticleProto>(new DistilledArticleProto( - CreateDistilledArticleForEntry(entry)))); + std::move(content_store_load_callback) + .Run(true, + std::unique_ptr<DistilledArticleProto>(new DistilledArticleProto( + CreateDistilledArticleForEntry(entry)))); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(cancel_callback.Cancelled());
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc index 44bf091..20d1d60 100644 --- a/components/dom_distiller/standalone/content_extractor_browsertest.cc +++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -223,9 +223,10 @@ public: ContentExtractionRequest(const GURL& url) : url_(url) {} - void Start(DomDistillerService* service, const gfx::Size& render_view_size, - base::Closure finished_callback) { - finished_callback_ = finished_callback; + void Start(DomDistillerService* service, + const gfx::Size& render_view_size, + base::OnceClosure finished_callback) { + finished_callback_ = std::move(finished_callback); viewer_handle_ = service->ViewUrl(this, service->CreateDefaultDistillerPage(render_view_size), @@ -294,14 +295,14 @@ void OnArticleReady(const DistilledArticleProto* article_proto) override { article_proto_ = article_proto; CHECK(article_proto->pages_size()) << "Failed extracting " << url_; - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - finished_callback_); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, std::move(finished_callback_)); } const DistilledArticleProto* article_proto_; std::unique_ptr<ViewerHandle> viewer_handle_; GURL url_; - base::Closure finished_callback_; + base::OnceClosure finished_callback_; }; class ContentExtractor : public ContentBrowserTest { @@ -348,9 +349,9 @@ void PumpQueue() { while (pending_tasks_ < max_tasks_ && next_request_ < requests_.size()) { requests_[next_request_]->Start( - service_.get(), - shell()->web_contents()->GetContainerBounds().size(), - base::Bind(&ContentExtractor::FinishRequest, base::Unretained(this))); + service_.get(), shell()->web_contents()->GetContainerBounds().size(), + base::BindOnce(&ContentExtractor::FinishRequest, + base::Unretained(this))); ++next_request_; ++pending_tasks_; }
diff --git a/components/download/internal/background_service/BUILD.gn b/components/download/internal/background_service/BUILD.gn index 6c1ade7..fba6ec0e 100644 --- a/components/download/internal/background_service/BUILD.gn +++ b/components/download/internal/background_service/BUILD.gn
@@ -112,7 +112,9 @@ if (is_android) { android_library("internal_java") { - java_files = [ "android/java/src/org/chromium/components/download/internal/BatteryStatusListenerAndroid.java" ] + sources = [ + "android/java/src/org/chromium/components/download/internal/BatteryStatusListenerAndroid.java", + ] deps = [ "//base:base_java",
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn index 4c31aa2..8854c512 100644 --- a/components/download/internal/common/BUILD.gn +++ b/components/download/internal/common/BUILD.gn
@@ -101,7 +101,9 @@ if (is_android) { android_library("internal_java") { - java_files = [ "android/java/src/org/chromium/components/download/DownloadCollectionBridge.java" ] + sources = [ + "android/java/src/org/chromium/components/download/DownloadCollectionBridge.java", + ] deps = [ "//base:base_java",
diff --git a/components/download/network/BUILD.gn b/components/download/network/BUILD.gn index 99f96d6..140005a 100644 --- a/components/download/network/BUILD.gn +++ b/components/download/network/BUILD.gn
@@ -40,7 +40,9 @@ if (is_android) { android_library("network_java") { - java_files = [ "android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java" ] + sources = [ + "android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java", + ] deps = [ "//base:base_java",
diff --git a/components/embedder_support/android/BUILD.gn b/components/embedder_support/android/BUILD.gn index 06b2a93e..ad90ef04 100644 --- a/components/embedder_support/android/BUILD.gn +++ b/components/embedder_support/android/BUILD.gn
@@ -9,7 +9,7 @@ deps = [ "//base:base_java", ] - java_files = [ + sources = [ "java/src/org/chromium/components/embedder_support/application/ClassLoaderContextWrapperFactory.java", "java/src/org/chromium/components/embedder_support/application/FontPreloadingWorkaround.java", ] @@ -38,7 +38,7 @@ "//content/public/android:content_java", "//ui/android:ui_java", ] - java_files = [ + sources = [ "java/src/org/chromium/components/embedder_support/view/ContentView.java", ] } @@ -51,7 +51,9 @@ "//ui/android:ui_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ "java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java" ] + sources = [ + "java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java", + ] } generate_jni("view_jni_headers") { @@ -107,7 +109,7 @@ "//ui/android:ui_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java", "java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvanced.java", "java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvancedComponent.java", @@ -116,8 +118,8 @@ "java/src/org/chromium/components/embedder_support/delegate/ColorPickerSimple.java", "java/src/org/chromium/components/embedder_support/delegate/ColorSuggestion.java", "java/src/org/chromium/components/embedder_support/delegate/ColorSuggestionListAdapter.java", - "java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java", "java/src/org/chromium/components/embedder_support/delegate/OnColorChangedListener.java", + "java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java", ] }
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc index e13ae84..49956cf 100644 --- a/components/exo/buffer.cc +++ b/components/exo/buffer.cc
@@ -264,7 +264,8 @@ ri->BeginQueryEXT(query_type_, query_id_); ri->CopySubTexture(mailbox_, destination->mailbox_, destination->texture_target_, 0, 0, 0, 0, size_.width(), - size_.height()); + size_.height(), /*unpack_flip_y=*/false, + /*unpack_premultiply_alpha=*/false); ri->EndQueryEXT(query_type_); // Run callback when query result is available. ReleaseWhenQueryResultIsAvailable(std::move(callback));
diff --git a/components/feature_engagement/internal/BUILD.gn b/components/feature_engagement/internal/BUILD.gn index b745d7d..b910cb8 100644 --- a/components/feature_engagement/internal/BUILD.gn +++ b/components/feature_engagement/internal/BUILD.gn
@@ -133,7 +133,9 @@ android_library("internal_java") { visibility = [ "//components/feature_engagement:feature_engagement_java" ] - java_files = [ "android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java" ] + sources = [ + "android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java", + ] deps = [ "//base:base_java",
diff --git a/components/feature_engagement/public/BUILD.gn b/components/feature_engagement/public/BUILD.gn index 117b6309..ce98550 100644 --- a/components/feature_engagement/public/BUILD.gn +++ b/components/feature_engagement/public/BUILD.gn
@@ -52,7 +52,7 @@ if (is_android) { android_library("public_java") { - java_files = [ + sources = [ "android/java/src/org/chromium/components/feature_engagement/EventConstants.java", "android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java", "android/java/src/org/chromium/components/feature_engagement/Tracker.java",
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc index c86ff9b..5156abf 100644 --- a/components/flags_ui/flags_state.cc +++ b/components/flags_ui/flags_state.cc
@@ -621,7 +621,7 @@ FlagAccess access, base::ListValue* supported_entries, base::ListValue* unsupported_entries, - base::Callback<bool(const FeatureEntry&)> skip_feature_entry) { + base::RepeatingCallback<bool(const FeatureEntry&)> skip_feature_entry) { std::set<std::string> enabled_entries; GetSanitizedEnabledFlags(flags_storage, &enabled_entries);
diff --git a/components/flags_ui/flags_state.h b/components/flags_ui/flags_state.h index 14a2ca9d..aca6222 100644 --- a/components/flags_ui/flags_state.h +++ b/components/flags_ui/flags_state.h
@@ -129,12 +129,16 @@ // Gets the list of feature entries. Entries that are available for the // current platform are appended to |supported_entries|; all other entries are // appended to |unsupported_entries|. + // + // |skip_feature_entry| is called once for each feature in |feature_entries_|, + // and entry data for a feature is only included in the output data if the + // callback returns |false| for the entry. void GetFlagFeatureEntries( FlagsStorage* flags_storage, FlagAccess access, base::ListValue* supported_entries, base::ListValue* unsupported_entries, - base::Callback<bool(const FeatureEntry&)> skip_feature_entry); + base::RepeatingCallback<bool(const FeatureEntry&)> skip_feature_entry); // Returns the value for the current platform. This is one of the values // defined by the OS enum above.
diff --git a/components/flags_ui/flags_state_unittest.cc b/components/flags_ui/flags_state_unittest.cc index e8116e8..e793a64 100644 --- a/components/flags_ui/flags_state_unittest.cc +++ b/components/flags_ui/flags_state_unittest.cc
@@ -911,7 +911,7 @@ base::ListValue unsupported_entries; flags_state_->GetFlagFeatureEntries(&flags_storage_, kGeneralAccessFlagsOnly, &supported_entries, &unsupported_entries, - base::Bind(&SkipFeatureEntry)); + base::BindRepeating(&SkipFeatureEntry)); // All |kEntries| except for |kFlags3| should be supported. EXPECT_EQ(10u, supported_entries.GetSize()); EXPECT_EQ(1u, unsupported_entries.GetSize());
diff --git a/components/gcm_driver/android/BUILD.gn b/components/gcm_driver/android/BUILD.gn index 42a6911b..f2ef980c 100644 --- a/components/gcm_driver/android/BUILD.gn +++ b/components/gcm_driver/android/BUILD.gn
@@ -20,7 +20,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/gcm_driver/GCMDriver.java", "java/src/org/chromium/components/gcm_driver/GCMMessage.java", "java/src/org/chromium/components/gcm_driver/GoogleCloudMessagingSubscriber.java", @@ -31,7 +31,7 @@ } junit_binary("components_gcm_driver_junit_tests") { - java_files = [ + sources = [ "junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java", "junit/src/org/chromium/components/gcm_driver/LazySubscriptionsManagerTest.java", ]
diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm_driver/instance_id/android/BUILD.gn index 2f17143..292349e 100644 --- a/components/gcm_driver/instance_id/android/BUILD.gn +++ b/components/gcm_driver/instance_id/android/BUILD.gn
@@ -29,7 +29,7 @@ srcjar_deps = [ "//components/gcm_driver/instance_id:instance_id_java_enums_srcjar" ] - java_files = [ + sources = [ "java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java", "java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDWithSubtype.java", ] @@ -42,5 +42,7 @@ "//base:base_java", ] - java_files = [ "javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java" ] + sources = [ + "javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java", + ] }
diff --git a/components/heap_profiling/BUILD.gn b/components/heap_profiling/BUILD.gn index 555eb84..cc8281c 100644 --- a/components/heap_profiling/BUILD.gn +++ b/components/heap_profiling/BUILD.gn
@@ -35,7 +35,9 @@ # shim to function correctly. android_library("heap_profiling_java_test_support") { testonly = true - java_files = [ "javatests/src/org/chromium/components/heap_profiling/HeapProfilingTestShim.java" ] + sources = [ + "javatests/src/org/chromium/components/heap_profiling/HeapProfilingTestShim.java", + ] deps = [ "//base:base_java", ]
diff --git a/components/invalidation/impl/BUILD.gn b/components/invalidation/impl/BUILD.gn index bafcdd96..12db09e9 100644 --- a/components/invalidation/impl/BUILD.gn +++ b/components/invalidation/impl/BUILD.gn
@@ -252,7 +252,7 @@ "//third_party/jsr-305:jsr_305_javalib", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "android/java/src/org/chromium/components/invalidation/InvalidationClientService.java", "android/java/src/org/chromium/components/invalidation/InvalidationService.java", "android/java/src/org/chromium/components/invalidation/PendingInvalidation.java", @@ -285,13 +285,15 @@ "//third_party/cacheinvalidation:cacheinvalidation_proto_java", "//third_party/junit", ] - java_files = [ + sources = [ "android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java", "android/javatests/src/org/chromium/components/invalidation/TestableInvalidationClientService.java", ] } junit_binary("components_invalidation_impl_junit_tests") { - java_files = [ "android/junit/src/org/chromium/components/invalidation/PendingInvalidationTest.java" ] + sources = [ + "android/junit/src/org/chromium/components/invalidation/PendingInvalidationTest.java", + ] deps = [ ":java", "//base:base_java",
diff --git a/components/language/android/BUILD.gn b/components/language/android/BUILD.gn index 5cf1402a..07bf91b 100644 --- a/components/language/android/BUILD.gn +++ b/components/language/android/BUILD.gn
@@ -25,7 +25,7 @@ } android_library("language_bridge_java") { - java_files = [ + sources = [ "java/src/org/chromium/components/language/AndroidLanguageMetricsBridge.java", "java/src/org/chromium/components/language/GeoLanguageProviderBridge.java", ]
diff --git a/components/location/android/BUILD.gn b/components/location/android/BUILD.gn index 79a3362..14834bd 100644 --- a/components/location/android/BUILD.gn +++ b/components/location/android/BUILD.gn
@@ -17,7 +17,8 @@ "//third_party/android_deps:androidx_annotation_annotation_java", "//ui/android:ui_java", ] - java_files = - [ "java/src/org/chromium/components/location/LocationUtils.java" ] + sources = [ + "java/src/org/chromium/components/location/LocationUtils.java", + ] srcjar_deps = [ ":location_settings_dialog_enums_java" ] }
diff --git a/components/minidump_uploader/BUILD.gn b/components/minidump_uploader/BUILD.gn index 1f0631c..cc406b20 100644 --- a/components/minidump_uploader/BUILD.gn +++ b/components/minidump_uploader/BUILD.gn
@@ -33,7 +33,7 @@ "//third_party/android_deps:androidx_annotation_annotation_java", ] - java_files = [ + sources = [ "android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java", "android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java", "android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadCallable.java", @@ -58,7 +58,7 @@ "//third_party/android_support_test_runner:runner_java", "//third_party/junit", ] - java_files = [ + sources = [ "android/javatests/src/org/chromium/components/minidump_uploader/CrashFileManagerTest.java", "android/javatests/src/org/chromium/components/minidump_uploader/CrashTestRule.java", "android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploadCallableTest.java",
diff --git a/components/module_installer/android/BUILD.gn b/components/module_installer/android/BUILD.gn index 270c761..2f91065 100644 --- a/components/module_installer/android/BUILD.gn +++ b/components/module_installer/android/BUILD.gn
@@ -6,7 +6,7 @@ import("//chrome/android/modules/buildflags.gni") android_library("module_installer_java") { - java_files = [ + sources = [ "java/src/org/chromium/components/module_installer/builder/Module.java", "java/src/org/chromium/components/module_installer/builder/ModuleDescriptor.java", "java/src/org/chromium/components/module_installer/builder/ModuleEngine.java", @@ -42,7 +42,7 @@ } junit_binary("module_installer_junit_tests") { - java_files = [ + sources = [ "junit/src/org/chromium/components/module_installer/builder/ModuleEngineTest.java", "junit/src/org/chromium/components/module_installer/builder/ModuleTest.java", "junit/src/org/chromium/components/module_installer/engine/ApkEngineTest.java", @@ -63,11 +63,15 @@ java_library("module_interface_java") { supports_android = true - java_files = [ "java/src/org/chromium/components/module_installer/builder/ModuleInterface.java" ] + sources = [ + "java/src/org/chromium/components/module_installer/builder/ModuleInterface.java", + ] } java_annotation_processor("module_interface_processor") { - java_files = [ "java/src/org/chromium/components/module_installer/builder/ModuleInterfaceProcessor.java" ] + sources = [ + "java/src/org/chromium/components/module_installer/builder/ModuleInterfaceProcessor.java", + ] main_class = "org.chromium.components.module_installer.builder.ModuleInterfaceProcessor" annotation_processor_deps = [ "//third_party/android_deps:auto_service_processor" ]
diff --git a/components/navigation_interception/android/BUILD.gn b/components/navigation_interception/android/BUILD.gn index 52a810e..577b569a 100644 --- a/components/navigation_interception/android/BUILD.gn +++ b/components/navigation_interception/android/BUILD.gn
@@ -8,7 +8,7 @@ deps = [ "//base:base_java", ] - java_files = [ + sources = [ "java/src/org/chromium/components/navigation_interception/InterceptNavigationDelegate.java", "java/src/org/chromium/components/navigation_interception/NavigationParams.java", ]
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn index 7c9e910..3487140 100644 --- a/components/offline_items_collection/core/BUILD.gn +++ b/components/offline_items_collection/core/BUILD.gn
@@ -76,10 +76,7 @@ if (is_android) { android_library("core_java") { - java_files = [ - "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java", - "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemShareInfoBridge.java", - "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java", + sources = [ "android/java/src/org/chromium/components/offline_items_collection/ContentId.java", "android/java/src/org/chromium/components/offline_items_collection/LegacyHelpers.java", "android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java", @@ -90,6 +87,9 @@ "android/java/src/org/chromium/components/offline_items_collection/ShareCallback.java", "android/java/src/org/chromium/components/offline_items_collection/UpdateDelta.java", "android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemShareInfoBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn index f9a6fd9..b9c4e01 100644 --- a/components/omnibox/browser/BUILD.gn +++ b/components/omnibox/browser/BUILD.gn
@@ -269,7 +269,7 @@ if (is_android) { android_library("browser_java") { - java_files = [ + sources = [ "android/java/src/org/chromium/components/omnibox/SuggestionAnswer.java", ]
diff --git a/components/omnibox_strings.grdp b/components/omnibox_strings.grdp index 499d693..aa2890fc 100644 --- a/components/omnibox_strings.grdp +++ b/components/omnibox_strings.grdp
@@ -231,6 +231,13 @@ <message name="IDS_ACC_TAB_SWITCH_BUTTON" desc="Announcement when tab switch button focused."> Tab switch button, press Enter to switch to this tab </message> + <!-- Accessibility suffix for suggestions when the remove button is focused.--> + <message name="IDS_ACC_REMOVE_SUGGESTION_FOCUSED_PREFIX" desc="Announcement when remove suggestion button is focused."> + Remove Suggestion button, press Enter to remove, <ph name="REMOVE_BUTTON_FOCUSED_FRIENDLY_MATCH_TEXT">$1<ex>The Chromium Projects http://www.chromium.org bookmark</ex></ph> + </message> + <message name="IDS_ACC_REMOVE_SUGGESTION_BUTTON" desc="Announcement when remove suggestion button is focused."> + Remove Suggestion button, press Enter to remove this suggestion + </message> <message name="IDS_ACC_EXIT_SEARCH_MODE" desc="Announcement when Omnibox exits keyword search mode."> Exiting search mode </message>
diff --git a/components/paint_preview/buildflags/BUILD.gn b/components/paint_preview/buildflags/BUILD.gn index c15c160..853f931 100644 --- a/components/paint_preview/buildflags/BUILD.gn +++ b/components/paint_preview/buildflags/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") -import("//components/paint_preview/buildflags/buildflags.gni") +import("//build/config/buildflags_paint_preview.gni") # This target is standalone so any targets in the build can refer to the # buildflag without bringing in any paint preview targets.
diff --git a/components/paint_preview/player/android/BUILD.gn b/components/paint_preview/player/android/BUILD.gn index e9c95843..5f88e6d 100644 --- a/components/paint_preview/player/android/BUILD.gn +++ b/components/paint_preview/player/android/BUILD.gn
@@ -49,7 +49,7 @@ android_library("java") { annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/paintpreview/player/PaintPreviewFrame.java", "java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegate.java", "java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java", @@ -72,7 +72,7 @@ } junit_binary("paint_preview_junit_tests") { - java_files = [ + sources = [ "junit/src/org/chromium/components/paintpreview/player/PlayerManagerTest.java", "junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainterTest.java", "junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java",
diff --git a/components/payments/content/android/BUILD.gn b/components/payments/content/android/BUILD.gn index 3ec052c3..a1e804d1 100644 --- a/components/payments/content/android/BUILD.gn +++ b/components/payments/content/android/BUILD.gn
@@ -49,7 +49,7 @@ android_library("java") { annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/payments/CurrencyFormatter.java", "java/src/org/chromium/components/payments/OriginSecurityChecker.java", "java/src/org/chromium/components/payments/PaymentDetailsConverter.java", @@ -57,8 +57,8 @@ "java/src/org/chromium/components/payments/PaymentManifestDownloader.java", "java/src/org/chromium/components/payments/PaymentManifestParser.java", "java/src/org/chromium/components/payments/PaymentValidator.java", - "java/src/org/chromium/components/payments/WebAppManifestSection.java", "java/src/org/chromium/components/payments/UrlUtil.java", + "java/src/org/chromium/components/payments/WebAppManifestSection.java", ] deps = [ "//base:base_java",
diff --git a/components/policy/android/BUILD.gn b/components/policy/android/BUILD.gn index 71fa3ef8..189a3b2 100644 --- a/components/policy/android/BUILD.gn +++ b/components/policy/android/BUILD.gn
@@ -16,7 +16,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = + sources = _jni_sources + [ "java/src/org/chromium/policy/AbstractAppRestrictionsProvider.java", "java/src/org/chromium/policy/AppRestrictionsProvider.java", @@ -32,9 +32,9 @@ "//base:base_java_test_support", "//third_party/junit", ] - java_files = [ - "javatests/src/org/chromium/policy/test/annotations/Policies.java", + sources = [ "javatests/src/org/chromium/policy/test/PolicyData.java", + "javatests/src/org/chromium/policy/test/annotations/Policies.java", ] } @@ -44,7 +44,7 @@ } junit_binary("components_policy_junit_tests") { - java_files = [ + sources = [ "junit/src/org/chromium/policy/AbstractAppRestrictionsProviderTest.java", "junit/src/org/chromium/policy/CombinedPolicyProviderTest.java", "junit/src/org/chromium/policy/PolicyConverterTest.java",
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index b5ab2174..25ad58c 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -947,16 +947,6 @@ Wenn diese Richtlinie nicht konfiguriert oder auf "true" eingestellt ist, können Nutzer die Funktion "Netzwerkfreigaben" verwenden. Wenn diese Richtlinie auf "false" eingestellt, können Nutzer die Funktion "Netzwerkfreigaben" nicht verwenden.</translation> -<translation id="2437706973218087361">Mit dieser Richtlinie wird eine Sicherheitsfunktion in TLS 1.3 konfiguriert, die Verbindungen gegen Downgrade-Angriffe schützt. Sie ist abwärtskompatibel und beeinträchtigt keine Verbindungen zu konformen TLS-1.2-Servern oder -Proxys. Ältere Versionen einiger Proxys, die TLS-Verbindungen abfangen, weisen jedoch einen Implementierungsfehler auf, der eine Inkompatibilität verursacht. - - Wenn diese Richtlinie auf "true" gesetzt wird, aktiviert <ph name="PRODUCT_NAME" /> diese Schutzmaßnahmen für alle Verbindungen. - - Wird sie auf "false" eingestellt oder nicht konfiguriert, deaktiviert <ph name="PRODUCT_NAME" /> die Maßnahmen für Verbindungen, die anhand von lokal installierten CA-Zertifikaten authentifiziert werden. Diese Sicherheitsmaßnahmen sind für Verbindungen, die mit öffentlich vertrauenswürdigen CA-Zertifikaten authentifiziert werden, immer aktiviert. - - Die Richtlinie kann dazu genutzt werden, betroffene Proxys zu finden, um sie zu aktualisieren. Bei diesen Proxys sollte ein Verbindungsfehler mit dem Fehlercode ERR_TLS13_DOWNGRADE_DETECTED auftreten. In einer zukünftigen Version von <ph name="PRODUCT_NAME" /> wird diese Option standardmäßig aktiviert. - - Nach der standardmäßigen Aktivierung können Administratoren, die mehr Zeit zur Aktualisierung betroffener Proxys benötigen, diese Richtlinie nutzen, um die Sicherheitsfunktion vorübergehend zu deaktivieren. Die Richtlinie wird nach Version 85 entfernt. - </translation> <translation id="2438609638493026652">Aktiviert die Meldung von wichtigen Ereignissen an Google während der Installation von Android-Apps. Ereignisse werden nur für Apps erfasst, deren Installation über die Richtlinie ausgelöst wurde. Wenn die Richtlinie auf "true" festgelegt ist, werden Ereignisse protokolliert. @@ -2416,7 +2406,7 @@ Diese Erkennung ist in einer Enterprise-Umgebung, in der die Netzwerkkonfiguration bekannt ist, möglicherweise nicht erforderlich, denn sie verursacht einen gewissen DNS- und HTTP-Datenverkehr beim Start und bei jeder Änderung der DNS-Konfiguration. - Wenn diese Richtlinie nicht konfiguriert oder aktiviert ist, werden die DNS-Abfangprüfungen durchgeführt. Nur, wenn sie ausdrücklich deaktiviert ist, finden sie nicht statt.</translation> + Wenn diese Richtlinie nicht konfiguriert oder aktiviert ist, werden die DNS-Abfangprüfungen durchgeführt. Nur wenn sie ausdrücklich deaktiviert ist, finden sie nicht statt.</translation> <translation id="4703402283970867140">Intelligentem Dimmmodell erlauben, den Zeitraum bis zum Dimmen des Bildschirms zu verlängern</translation> <translation id="4722122254122249791">Website-Isolierung für angegebene Ursprünge aktivieren</translation> <translation id="4722399051042571387">Wenn "false" eingestellt ist, können Nutzer keine schwache PIN festlegen, die leicht zu erraten ist.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 4932e7fd..052e1329 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -933,16 +933,6 @@ Cuando no se configura o se establece como verdadera, los usuarios podrán usar esta función. Cuando se establece como falsa, los usuarios no podrán usar esta función.</translation> -<translation id="2437706973218087361">Esta política controla una función de seguridad en TLS 1.3 que protege las conexiones contra ataques para cambiar a una versión anterior. Esta función es retrocompatible y no afecta las conexiones a proxies o servidores que cumplen con el protocolo TLS 1.2. Sin embargo, las versiones anteriores de algunos proxies de intercepción TLS tienen una falla en la implementación que genera la incompatibilidad. - - Si se establece esta política como verdadera, <ph name="PRODUCT_NAME" /> habilitará estas protecciones de seguridad para todas las conexiones. - - Si se establece como falsa o no se establece, <ph name="PRODUCT_NAME" /> inhabilitará estas protecciones de seguridad para las conexiones autenticadas con certificados de CA instalados de forma local. Estas protecciones están siempre habilitadas para las conexiones autenticadas con los certificados de CA con confianza pública. - - Es posible que esta política se utilice para probar proxies afectados y actualizarlos. Se espera que los proxies afectados generen un error en las conexiones (código de error: ERR_TLS13_DOWNGRADE_DETECTED). En una versión posterior de <ph name="PRODUCT_NAME" />, se habilitará esta opción de forma predeterminada. - - Una vez habilitada de forma predeterminada, es posible que los administradores que necesiten más tiempo para actualizar los proxies afectados utilicen esta política para inhabilitar de forma temporal esta función de seguridad. Después de la versión 85, se quitará esta política. - </translation> <translation id="2438609638493026652">Permite informar eventos clave durante la instalación de apps de Android en Google. Solo se capturan los eventos de las apps cuya instalación se activó a través de la política. Si la política se establece como verdadera, se registrarán los eventos.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index f461c93..d6215fd3 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -843,9 +843,9 @@ <translation id="2231817271680715693">Importar el historial de navegación desde el navegador predeterminado en la primera ejecución</translation> <translation id="2234855698900783408">Permite habilitar las mitigaciones de comprobación de <ph name="CORS" /> en la nueva implementación de <ph name="CORS" />. Así, las extensiones continúan siendo compatibles y <ph name="PRODUCT_NAME" /> puede enviar encabezados definidos sin comprobaciones de <ph name="CORS" />. - Si esta lista se deja vacía, <ph name="PRODUCT_NAME" /> intenta ejecutar las extensiones de forma compatible y no introduce cambios de <ph name="API" /> en <ph name="PRODUCT_NAME" /> 79, tal y como se explica en <ph name="WEB_REQUEST_API_MANUAL" />. + Si esta lista se deja vacía, <ph name="PRODUCT_NAME" /> intentará ejecutar las extensiones de forma compatible y no introducirá cambios de <ph name="API" /> en <ph name="PRODUCT_NAME" /> 79, tal y como se explica en <ph name="WEB_REQUEST_API_MANUAL" />. - Si la lista se configura para que tenga nombres de encabezado de solicitud <ph name="HTTP" />, la comprobación de <ph name="CORS" /> ignora los encabezados de la lista y habilita la mitigación de extensiones. + Si la lista se configura para que tenga nombres de encabezado de solicitud <ph name="HTTP" />, la comprobación de <ph name="CORS" /> ignorará los encabezados de la lista y habilitará la mitigación en el caso de las extensiones. Si no se establece esta lista, no se aplicará ninguna de las dos mitigaciones explicadas arriba. @@ -958,16 +958,6 @@ Si esta política no está configurada o tiene asignado el valor "True", los usuarios podrán usar esta función. En cambio, si tiene asignado el valor "False", no podrán usarla.</translation> -<translation id="2437706973218087361">Esta política controla una función de seguridad de TLS 1.3 que protege las conexiones frente a ataques de cambio a versión inferior. Es retrocompatible y no afectará a las conexiones de servidores y proxies que cumplan con el protocolo TLS 1.2. Sin embargo, las versiones anteriores de algunos proxies que interceptan TLS tienen un error de implementación que provoca que los proxies sean incompatibles. - - Si se le asigna el valor "True", <ph name="PRODUCT_NAME" /> habilitará estas protecciones de seguridad en todas las conexiones. - - Si no se define esta política o se le asigna el valor "False", <ph name="PRODUCT_NAME" /> inhabilitará estas protecciones de seguridad en las conexiones autenticadas con certificados de CA instalados localmente. Estas protecciones siempre están habilitadas en las conexiones autenticadas con certificados de CA en los que se confíe públicamente. - - Se puede usar esta política para probar cualquier proxy afectado y actualizarlo. Los proxies afectados deberían mostrar el código de error ERR_TLS13_DOWNGRADE_DETECTED cuando falle la conexión. En una versión posterior de <ph name="PRODUCT_NAME" /> se habilitará esta opción de forma predeterminada. - - Cuando se habilite de forma predeterminada, los administradores que necesiten más tiempo para actualizar los proxies afectados podrán usar esta política para inhabilitar temporalmente esta función de seguridad. Esta política se eliminará después de la versión 85. - </translation> <translation id="2438609638493026652">Habilita el envío de informes de eventos clave durante la instalación de aplicaciones para Android a Google. Solo se registran eventos de aplicaciones cuya instalación haya provocado la política. Si se le asigna el valor "True" a la política, se registrarán los eventos. @@ -2696,7 +2686,7 @@ Si no se establece esta política, se inhabilitará la lupa la primera vez que se muestre la pantalla de inicio de sesión. Los usuarios podrán habilitar o inhabilitar la lupa en cualquier momento, y este ajuste se quedará en la pantalla de inicio de sesión tal como lo dejen hasta que otro usuario inicie sesión. Nota: <ph name="DEVICE_LOGIN_SCREEN_SCREEN_MAGNIFIER_TYPE_POLICY_NAME" /> anula esta política si se especifica la anterior.</translation> -<translation id="5115168755602871392">Proporcionar información sobre la CPU (o las CPU) de un dispositivo. +<translation id="5115168755602871392">Proporciona información sobre la CPU (o las CPU) de un dispositivo. Si se asigna el valor "false" a esta política o no se establece, no se enviará ninguna información. Si se le asigna el valor "true", se enviará información sobre el nombre del modelo, la arquitectura y la velocidad máxima de reloj @@ -3933,7 +3923,7 @@ Para obtener más información sobre la política <ph name="IEEM_SITELIST_POLICY" /> de Internet Explorer, consulta esta página web: https://docs.microsoft.com/es-es/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7132877481099023201">URLs a las que se concederá acceso a dispositivos de captura de vídeo sin confirmación</translation> -<translation id="7134420220355750019">Cambiar el botón primario del ratón al botón derecho. +<translation id="7134420220355750019">Cambia el botón primario del ratón al botón derecho. Si se habilita esta política, el botón derecho del ratón siempre será el primario.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 131fcf13..c0e5d1f 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -358,7 +358,7 @@ <translation id="1514888685242892912">Activer <ph name="PRODUCT_NAME" /></translation> <translation id="1515824657887788963">Autoriser une page à exécuter des requêtes XHR synchrones pendant sa fermeture.</translation> <translation id="1522425503138261032">Autoriser les sites à suivre la position géographique des utilisateurs</translation> -<translation id="1523774894176285446">Navigateur secondaire à lancer pour les sites Web configurés.</translation> +<translation id="1523774894176285446">Autre navigateur à lancer pour les sites Web configurés.</translation> <translation id="152657506688053119">Liste d'URL alternatives pour le moteur de recherche par défaut</translation> <translation id="1530812829012954197">Toujours rendre les formats d'URL suivants dans le navigateur hôte</translation> <translation id="1541170838458414064">Limiter le format de la page d'impression</translation> @@ -968,16 +968,6 @@ Si cette règle n'est pas configurée ou définie sur "True", les utilisateurs peuvent utiliser la fonctionnalité Partages de fichiers en réseau. Si cette règle est définie sur "False", les utilisateurs ne peuvent pas utiliser la fonctionnalité Partages de fichiers en réseau.</translation> -<translation id="2437706973218087361">Cette règle contrôle une fonctionnalité de sécurité TLS 1.3 qui protège les connexions contre les attaques par déclassement. Elle est rétrocompatible et n'affecte pas les connexions à des serveurs ou proxys conformes aux normes TLS 1.2. Toutefois, les versions plus anciennes de certains proxys interceptant les paramètres TLS sont incompatibles en raison de défauts d'intégration. - - Si cette règle est définie sur "True", <ph name="PRODUCT_NAME" /> active ces protections de sécurité pour toutes les connexions. - - Si elle est définie sur "False" ou n'est pas définie, <ph name="PRODUCT_NAME" /> désactive ces protections de sécurité pour les connexions authentifiées par des certificats CA installés localement. Ces protections sont toujours activées pour les connexions authentifiées par des certificats CA reconnus publiquement. - - Cette règle peut être utilisée pour détecter la présence de proxys affectés et les mettre à niveau. En principe, les proxys affectés provoqueront un échec de connexion avec le code d'erreur "ERR_TLS13_DOWNGRADE_DETECTED". Une version ultérieure de <ph name="PRODUCT_NAME" /> activera cette option par défaut. - - Lorsque ce sera le cas, les administrateurs ayant besoin de plus de temps pour mettre à niveau les proxys affectés pourront utiliser cette règle pour désactiver provisoirement cette fonctionnalité de sécurité. Cette règle sera supprimée après la version 85. - </translation> <translation id="2438609638493026652">Permet de signaler des événements clés à Google pendant l'installation d'une application Android. Les événements ne sont enregistrés que pour les applications dont l'installation a été déclenchée via des règles. Si cette règle est définie sur "True", les événements sont enregistrés.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 7372dca..80412cc 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -932,16 +932,6 @@ Jika kebijakan ini tidak dikonfigurasi atau disetel ke True, pengguna dapat menggunakan fitur Berbagi File Jaringan. Jika kebijakan ini disetel ke False, pengguna tidak dapat menggunakan fitur Berbagi File Jaringan.</translation> -<translation id="2437706973218087361">Kebijakan ini mengontrol fitur keamanan di TLS 1.3 yang melindungi koneksi terhadap serangan downgrade. Kebijakan ini kompatibel dengan versi sebelumnya dan tidak akan memengaruhi koneksi ke server atau proxy TLS 1.2 yang sudah patuh. Namun, versi lama dari beberapa proxy yang menginterupsi TLS memiliki cacat dalam proses implementasi, sehingga versi tersebut menjadi tidak kompatibel. - - Jika kebijakan ini ditetapkan ke True, <ph name="PRODUCT_NAME" /> akan mengaktifkan perlindungan keamanan ini untuk semua koneksi. - - Jika kebijakan ini ditetapkan ke False atau tidak ditetapkan, <ph name="PRODUCT_NAME" /> akan menonaktifkan perlindungan keamanan ini untuk koneksi yang diautentikasi dengan sertifikat CA yang diinstal secara lokal. Perlindungan ini akan selalu diaktifkan untuk koneksi yang diautentikasi dengan sertifikat CA yang dipercaya publik. - - Kebijakan ini dapat digunakan untuk menguji proxy yang terpengaruh dan mengupgradenya. Proxy yang terpengaruh akan menyebabkan kegagalan koneksi dengan kode error ERR_TLS13_DOWNGRADE_DETECTED. Versi baru <ph name="PRODUCT_NAME" /> akan mengaktifkan opsi ini secara default. - - Setelah opsi diaktifkan secara default, administrator yang memerlukan waktu tambahan untuk mengupgrade proxy yang terpengaruh dapat menggunakan kebijakan ini untuk sementara menonaktifkan fitur keamanan ini. Kebijakan ini akan dihapus setelah versi 85. - </translation> <translation id="2438609638493026652">Mengaktifkan pelaporan peristiwa penting selama penginstalan aplikasi Android ke Google. Peristiwa direkam hanya untuk aplikasi yang penginstalannya dipicu melalui kebijakan. Jika kebijakan disetel ke true, peristiwa akan dicatat dalam log.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index c272cdf..c7a9993 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -917,16 +917,6 @@ Quando questa norma non è configurata o è impostata su True, gli utenti possono utilizzare la funzione Condivisioni file di rete. Quando questa norma è impostata su False, gli utenti non possono utilizzare la funzione Condivisioni file di rete.</translation> -<translation id="2437706973218087361">Questo criterio controlla una funzionalità di sicurezza nel protocollo TLS 1.3 che protegge le connessioni da attacchi di downgrade. È compatibile con le versioni precedenti e non interesserà le connessioni a server o proxy TLS 1.2 conformi. Tuttavia, un difetto di implementazione nelle versioni precedenti di alcuni proxy che intercettano connessioni TLS li rende incompatibili. - - Se questo criterio è impostato su True, <ph name="PRODUCT_NAME" /> attiverà queste protezioni di sicurezza per tutte le connessioni. - - Se questo criterio viene impostato su False o non viene impostato, <ph name="PRODUCT_NAME" /> disattiverà le protezioni di sicurezza per le connessioni autenticate tramite certificati CA installati localmente. Queste protezioni sono sempre attive per le connessioni autenticate con certificati CA considerati pubblicamente attendibili. - - Questo criterio potrebbe essere usato per identificare eventuali proxy interessati e aggiornarli. Il codice di errore previsto per il problema di connessione dei proxy interessati è ERR_TLS13_DOWNGRADE_DETECTED. Una versione successiva di <ph name="PRODUCT_NAME" /> attiverà questa opzione per impostazione predefinita. - - Quando verrà attivata per impostazione predefinita, gli amministratori a cui occorre più tempo per eseguire l'upgrade dei proxy interessati potrebbero usare questo criterio per disattivare temporaneamente questa funzionalità di sicurezza. Dopo la versione 85, questo criterio verrà rimosso. - </translation> <translation id="2438609638493026652">Attiva la segnalazione di eventi chiave durante l'installazione di app Android a Google. Gli eventi vengono acquisiti solo per le app la cui installazione è stata lanciata tramite norma. Se la norma viene impostata su True, gli eventi saranno registrati.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 873912e..f6c6d57 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -934,16 +934,6 @@ このポリシーが未設定または True に設定されている場合、ユーザーはネットワーク ファイル共有を使用できます。 このポリシーが False に設定されている場合、ユーザーはネットワーク ファイル共有を使用できません。</translation> -<translation id="2437706973218087361">このポリシーでは、ダウングレード攻撃から接続を保護する TLS 1.3 のセキュリティ機能を管理します。TLS 1.3 には下位互換性があり、TLS 1.2 準拠のサーバーまたはプロキシへの接続には影響しません。一部の古い TLS インターセプト プロキシには実装上の問題があり、互換性がない場合があります。 - - このポリシーを True に設定した場合、<ph name="PRODUCT_NAME" /> はすべての接続で TLS 1.3 のセキュリティ保護を有効にします。 - - このポリシーを False に設定するか、設定しない場合、<ph name="PRODUCT_NAME" /> は、ローカルにインストールされている CA 証明書によって認証された接続で、TLS 1.3 のセキュリティ保護を無効にします。公的に信頼されている CA 証明書によって認証された接続では、TLS 1.3 のセキュリティ保護は常に有効となります。 - - このポリシーは、影響を受けるプロキシのテストやアップグレードに使用できます。影響を受けるプロキシは接続に失敗し、エラーコード「ERR_TLS13_DOWNGRADE_DETECTED」が返されます。<ph name="PRODUCT_NAME" /> の今後のリリースでは、このオプションはデフォルトで有効になります。 - - デフォルトで有効になった際、影響を受けるプロキシのアップグレードに時間がかかる場合は、このポリシーを使用して一時的にこのセキュリティ機能を無効にできます。このポリシーはバージョン 85 以降では削除されます。 - </translation> <translation id="2438609638493026652">Android アプリのインストール中に発生したキーイベントが Google に報告されるようにします。取得されるイベントは、ポリシーを通じてインストールされたアプリのイベントのみです。 このポリシーが true に設定されている場合は、イベントが記録されます。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 4292e52..08298206 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -958,16 +958,6 @@ 이 정책이 구성되어 있지 않거나 True로 설정되어 있으면 사용자가 네트워크 파일 공유를 사용할 수 있습니다. 이 정책이 False로 설정되어 있으면 사용자가 네트워크 파일 공유를 사용할 수 없게 됩니다.</translation> -<translation id="2437706973218087361">이 정책은 다운그레이드 공격으로부터 연결을 보호하는 TLS 1.3의 보안 기능을 제어합니다. 이전 버전과 호환되며, 호환되는 TLS 1.2 서버 또는 프록시 연결에 영향을 미치지 않습니다. 그러나 이전 버전의 일부 TLS 가로채기 프록시는 구현 오류가 있어 호환되지 않습니다. - - 정책이 True로 설정되면 <ph name="PRODUCT_NAME" />에서 모든 연결에 이러한 보안 기능을 사용합니다. - - False로 설정되거나 설정되지 않으면 <ph name="PRODUCT_NAME" />이(가) 로컬에 설치된 CA 인증서로 인증된 연결에 이러한 보안 기능을 사용하지 않습니다. 이러한 보안 기능은 공개적으로 신뢰할 수 있는 CA 인증서로 인증된 연결에 항상 사용됩니다. - - 이 정책은 영향을 받은 모든 프록시를 테스트하고 업그레이드하는 데 사용될 수 있습니다. 영향을 받은 프록시는 연결에 실패하며 오류 코드 ERR_TLS13_DOWNGRADE_DETECTED를 표시합니다. <ph name="PRODUCT_NAME" /> 최신 버전에는 이 옵션이 기본적으로 사용 설정되어 있습니다. - - 옵션이 기본적으로 사용 설정된 후 영향을 받은 프록시를 업그레이드하는 데 시간이 더 필요한 관리자는 이 정책을 사용하여 보안 기능을 일시적으로 사용 중지할 수 있습니다. 정책은 버전 85 이후부터 삭제됩니다. - </translation> <translation id="2438609638493026652">Android 앱 설치 중 주요 이벤트를 Google에 보고할 수 있습니다. 정책을 통해 설치가 실행된 앱의 이벤트만 기록됩니다. 정책을 true로 설정하면 이벤트가 로깅됩니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 1538d8a..b60b847 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -837,7 +837,7 @@ Dit beleid is ook van toepassing op componentextensies zoals de Hangout Services-extensie.</translation> <translation id="2223598546285729819">Standaardinstelling voor meldingen</translation> <translation id="2231817271680715693">Browsegeschiedenis importeren uit standaardbrowser bij eerste uitvoering</translation> -<translation id="2234855698900783408">Schakel <ph name="CORS" />-controlebeperkingen voor de nieuwe <ph name="CORS" />-implementatie in, waardoor extensies geschikt gedrag kunnen behouden en <ph name="PRODUCT_NAME" /> toestemming heeft om opgegeven headers te versturen zonder <ph name="CORS" />-controle. +<translation id="2234855698900783408">Schakel <ph name="CORS" />-controlebeperkingen voor de nieuwe <ph name="CORS" />-implementatie in, waardoor extensies geschikt gedrag kunnen behouden en <ph name="PRODUCT_NAME" /> toestemming heeft om opgegeven headers te sturen zonder <ph name="CORS" />-controle. Als deze lijst leeg is, probeert <ph name="PRODUCT_NAME" /> extensies op geschikte manieren uit te voeren en worden er geen <ph name="API" />-wijzingen geïntroduceerd voor <ph name="PRODUCT_NAME" /> 79, zoals uitgelegd in <ph name="WEB_REQUEST_API_MANUAL" />. @@ -954,16 +954,6 @@ Wanneer dit beleid niet is geconfigureerd of is ingesteld op 'True', kunnen gebruikers Network File Shares gebruiken. Wanneer dit beleid is ingesteld op 'False', kunnen gebruikers Network File Shares niet gebruiken.</translation> -<translation id="2437706973218087361">Met dit beleid wordt een beveiligingsfunctie in TLS 1.3 beheerd waarmee verbindingen worden beschermd tegen downgrade-aanvallen. De functie is compatibel met eerdere versies en heeft geen invloed op verbindingen met servers of proxy's die voldoen aan TLS 1.2. Oudere versies van bepaalde proxy's die TLS onderscheppen, bevatten een implementatiefout waardoor ze incompatibel zijn. - - Als dit beleid is ingesteld op True, schakelt <ph name="PRODUCT_NAME" /> deze beveiligingsmaatregelen in voor alle verbindingen. - - Als dit beleid is ingesteld op False of niet is ingesteld, schakelt <ph name="PRODUCT_NAME" /> deze beveiligingsmaatregelen in voor verbindingen die zijn geverifieerd met lokaal geïnstalleerde certificaten van certificeringsinstanties. Deze beveiligingsmaatregelen zijn altijd ingeschakeld voor verbindingen die zijn geverifieerd met openbaar vertrouwde certificaten van certificeringsinstanties. - - Dit beleid kan worden gebruikt om te testen welke proxy's zijn getroffen en om deze te upgraden. Van getroffen proxy's wordt verwacht dat ze verbindingen met de foutcode ERR_TLS13_DOWNGRADE_DETECTED niet tot stand kunnen brengen. In een latere versie van <ph name="PRODUCT_NAME" /> wordt deze optie standaard ingeschakeld. - - Nadat deze optie standaard is ingeschakeld, kunnen beheerders die meer tijd nodig hebben om getroffen proxy's te upgraden dit beleid gebruiken om deze beveiligingsfunctie tijdelijk uit te schakelen. Dit beleid wordt verwijderd na versie 85. - </translation> <translation id="2438609638493026652">Hiermee schakel je de rapportage aan Google in van belangrijke gebeurtenissen tijdens de installatie van Android-apps. Gebeurtenissen worden alleen geregistreerd voor apps waarvan de installatie via beleid is geactiveerd. Als het beleid is ingesteld op 'True', worden gebeurtenissen geregistreerd. @@ -1537,11 +1527,11 @@ Als deze instelling is ingeschakeld of niet is geconfigureerd, kunnen gebruikers de proxy voor Cloudprinter inschakelen met authenticatie via hun Google-account. Als deze instelling is uitgeschakeld, kunnen gebruikers de proxy niet inschakelen en kan de computer zijn printers niet delen met <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="3295118731207421797">Via dit beleid kan een beheerder opgeven dat een pagina synchrone XHR-verzoeken mag versturen tijdens de afwijzing van de pagina. +<translation id="3295118731207421797">Via dit beleid kan een beheerder opgeven dat een pagina synchrone XHR-verzoeken mag sturen tijdens de afwijzing van de pagina. - Als het beleid is ingeschakeld, mogen pagina's synchrone XHR-verzoeken versturen tijdens de afwijzing van de pagina. + Als het beleid is ingeschakeld, mogen pagina's synchrone XHR-verzoeken sturen tijdens de afwijzing van de pagina. - Als het beleid is uitgeschakeld of niet is ingesteld, mogen pagina's geen synchrone XHR-verzoeken versturen tijdens de afwijzing van de pagina. + Als het beleid is uitgeschakeld of niet is ingesteld, mogen pagina's geen synchrone XHR-verzoeken sturen tijdens de afwijzing van de pagina. Dit beleid wordt verwijderd in Chrome 88.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 02483bb..59da0d0 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -934,16 +934,6 @@ Quando esta política não for configurada ou for definida como verdadeira, os usuários poderão usar o Compartilhamento de arquivos de rede. Quando esta política for definida como falsa, os usuários não poderão usar o Compartilhamento de arquivos de rede.</translation> -<translation id="2437706973218087361">Esta política controla um recurso de segurança no TLS 1.3 que protege conexões contra ataques de downgrade. Ela é compatível com versões anteriores e não afetará conexões para servidores e proxies em conformidade com o TLS 1.2. No entanto, versões mais antigas de alguns proxies com interceptação de TLS apresentam uma falha de implementação que causa incompatibilidade. - - Se esta política for definida como "Verdadeira", o <ph name="PRODUCT_NAME" /> ativará essas proteções de segurança para todas as conexões. - - Se esta política for definida como "Falsa" ou não for configurada, o <ph name="PRODUCT_NAME" /> desativará essas proteções de segurança para conexões autenticadas com certificados CA instalados localmente. Essas proteções estão sempre ativas para conexões autenticadas com certificados CA de confiança pública. - - Esta política pode ser usada para testar todos os proxies afetados e atualizá-los. Os proxies afetados devem causar uma falha nas conexões, apresentando o código do erro ERR_TLS13_DOWNGRADE_DETECTED. A versão mais recente do <ph name="PRODUCT_NAME" /> ativará essa opção por padrão. - - Depois de ativada por padrão, os administradores que precisarem de mais tempo para atualizar os proxies afetados poderão usar esta política para desativar temporariamente esse recurso de segurança. Esta política será removida em versões posteriores à 85. - </translation> <translation id="2438609638493026652">Ativa a geração de relatórios dos principais eventos durante a instalação do app Android no Google. Os eventos são capturados apenas para os apps cuja instalação foi acionada por meio da política. Se a política estiver definida como verdadeira, os eventos serão registrados.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index ea43c8a..fce333f 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -941,16 +941,6 @@ Когда правило не настроено или включено, пользователи могут настраивать совместный доступ. Когда правило отключено, пользователи не могут настраивать совместный доступ.</translation> -<translation id="2437706973218087361">Это правило позволяет настроить функцию протокола TLS 1.3, которая защищает соединения от атак на понижение версии протокола (downgrade attacks). Благодаря обратной совместимости правило не затрагивает подключения к серверам и прокси-серверам, соответствующим требованиям протокола TLS 1.2. Однако старые версии некоторых прокси-серверов, выполняющих перехват TLS, имеют дефекты реализации, которые негативно влияют на их совместимость. - - Если для правила задано значение True, <ph name="PRODUCT_NAME" /> включит эту функцию безопасности для всех соединений. - - Если установлено значение False или правило не настроено, <ph name="PRODUCT_NAME" /> отключит эту функцию безопасности для соединений, где для аутентификации используются локальные сертификаты ЦС. Эта функция безопасности всегда включена для соединений, в которых для аутентификации используются доверенные сертификаты ЦС. - - С помощью этого правила можно выявлять и обновлять уязвимые прокси-серверы. При попытке соединения с уязвимыми прокси-серверами будет появляться ошибка ERR_TLS13_DOWNGRADE_DETECTED. В более поздней версии <ph name="PRODUCT_NAME" /> эта функция будет включена по умолчанию. - - Если к этому моменту администраторы не успеют обновить уязвимые прокси-сервера, они смогут на время отключить функцию безопасности с помощью этого правила. Правило будет удалено после версии 85. - </translation> <translation id="2438609638493026652">Позволяет отправлять в Google сведения об основных событиях, связанных с установкой приложений на Android. События сохраняются только для приложений, установленных при помощи правила. Если правило включено, события записываются в журнал. @@ -2028,7 +2018,7 @@ <translation id="4075864623710596000">Для имен хостов, указанных в списке этого правила, не будет проверяться использование механизма HSTS (он позволяет изменить протокол, по которому осуществляются запросы, с HTTP на HTTPS). В списке правила могут быть только одноуровневые имена. Имена хостов необходимо нормализовать: доменные имена, содержащие символы национальных алфавитов, должны быть преобразованы в формат A-Label, а буквы из таблицы ASCII должны быть строчными. Это правило действует только для определенных имен хостов, указанных в списке. На субдомены оно не распространяется.</translation> <translation id="408029843066770167">Разрешить отправлять запросы в службу времени Google</translation> <translation id="408076456549153854">Включить вход в браузере</translation> -<translation id="4082498585300984671">Включение функцию вызова по нажатию</translation> +<translation id="4082498585300984671">Включение функции вызова по нажатию</translation> <translation id="40853027210512570">Переопределяет правила выбора принтера по умолчанию в сервисе "<ph name="PRODUCT_NAME" />". Это правило определяет, как выбирается принтер по умолчанию в сервисе "<ph name="PRODUCT_NAME" />", когда в профиле впервые запускается печать.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index f695cb7..d47c7dc5 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -936,16 +936,6 @@ ถ้าไม่ได้กำหนดค่านโยบายนี้หรือตั้งค่าเป็น "จริง" ผู้ใช้จะใช้ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายได้ ถ้าตั้งค่านโยบายนี้เป็น "เท็จ" ผู้ใช้จะใช้ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายไม่ได้</translation> -<translation id="2437706973218087361">นโยบายนี้ควบคุมฟีเจอร์ความปลอดภัยใน TLS 1.3 ซึ่งปกป้องการเชื่อมต่อจากการโจมตีแบบดาวน์เกรด โดยจะใช้งานย้อนหลังได้และไม่ส่งผลกระทบต่อการเชื่อมต่อกับเซิร์ฟเวอร์หรือพร็อกซี TLS 1.2 ที่เข้ากันได้ อย่างไรก็ตาม พร็อกซีสำหรับดักจับข้อมูล TLS บางตัวในเวอร์ชันเก่ามีข้อบกพร่องในการใช้งานซึ่งทำให้ใช้งานร่วมกันไม่ได้ - - หากตั้งค่านโยบายนี้เป็น "จริง" <ph name="PRODUCT_NAME" /> จะเปิดใช้การรักษาความปลอดภัยเหล่านี้สำหรับการเชื่อมต่อทั้งหมด - - หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า <ph name="PRODUCT_NAME" /> จะปิดใช้การรักษาความปลอดภัยเหล่านี้สำหรับการเชื่อมต่อที่ตรวจสอบสิทธิ์ด้วยใบรับรอง CA ที่ติดตั้งไว้ในเครื่อง การรักษาความปลอดภัยเหล่านี้จะเปิดใช้อยู่เสมอสำหรับการเชื่อมต่อที่ตรวจสอบสิทธิ์ด้วยใบรับรอง CA ที่ได้รับความเชื่อถือจากสาธารณะ - - ระบบอาจใช้นโยบายนี้เพื่อทดสอบพร็อกซีที่ได้รับผลกระทบและอัปเกรดพร็อกซีดังกล่าว คาดว่าพร็อกซีที่ได้รับผลกระทบจะทำให้การเชื่อมต่อไม่สำเร็จโดยมีรหัสข้อผิดพลาด ERR_TLS13_DOWNGRADE_DETECTED <ph name="PRODUCT_NAME" /> เวอร์ชันใหม่ๆ จะเปิดใช้ตัวเลือกนี้โดยค่าเริ่มต้น - - หลังจากเปิดใช้โดยค่าเริ่มต้นแล้ว ผู้ดูแลระบบที่ต้องการเวลามากขึ้นในการอัปเกรดพร็อกซีที่ได้รับผลกระทบอาจใช้นโยบายนี้เพื่อปิดใช้ฟีเจอร์ความปลอดภัยนี้ชั่วคราว เราจะนำนโยบายนี้ออกหลังเวอร์ชัน 85 - </translation> <translation id="2438609638493026652">เปิดใช้การรายงานเหตุการณ์สำคัญระหว่างการติดตั้งแอป Android ไปยัง Google รายงานจะบันทึกเหตุการณ์ของแอปที่มีการเรียกใช้การติดตั้งผ่านนโยบายเท่านั้น หากตั้งค่านโยบายเป็น "จริง" ระบบจะบันทึกเหตุการณ์
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 0c34a4b66..33f2a986 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -955,16 +955,6 @@ Bu politika True (Doğru) değerine yapılandırılmaz veya ayarlanmazsa, kullanıcılar Ağ Üzerinde Dosya Paylaşımı özelliğini kullanabilirler. Bu politika False (Yanlış) değerine ayarlanırsa, kullanıcılar Ağ Üzerinde Dosya Paylaşımı özelliğini kullanamazlar</translation> -<translation id="2437706973218087361">Bu politika, TLS 1.3'te yer alan ve düşürme saldırılarına karşı bağlantıları koruyan bir güvenlik özelliğini kontrol eder. Geriye dönük olarak uyumludur ve uyumlu TLS 1.2 sunucuları veya proxyleri ile kurulan bağlantıları etkilemez. Ancak TLS'ye müdahale eden bazı eski proxy sürümlerinde uyumsuz olmalarına yol açan bir uygulama hatası söz konusudur. - - Bu politika True (Doğru) değerine ayarlanırsa <ph name="PRODUCT_NAME" /> bu güvenlik korumalarını tüm bağlantılar için etkinleştirir. - - Bu politika False (Yanlış) değerine ayarlanırsa veya ayarlanmadan bırakılırsa <ph name="PRODUCT_NAME" />, yerel olarak yüklenmiş CA sertifikaları ile kimliği doğrulanan bağlantılar için bu güvenlik korumalarını devre dışı bırakır. Bu korumalar, herkes tarafından güvenilen CA sertifikaları ile kimliği doğrulanan bağlantılar için her zaman etkinleştirilir. - - Bu politika, etkilenen proxy'leri test edip yükseltmek için kullanılabilir. Etkilenen proxy'lerin ERR_TLS13_DOWNGRADE_DETECTED hata kodu göstererek bağlantı kuramaması beklenir. Sonraki <ph name="PRODUCT_NAME" /> sürümlerinden birinde bu seçenek varsayılan olarak etkinleştirilecektir. - - Bu seçenek varsayılan olarak etkinleştirildikten sonra, etkilenen proxyleri yükseltmek için daha fazla zamana ihtiyacı olan yöneticiler bu politikayı kullanarak bu güvenlik özelliğini geçici bir süreliğine devre dışı bırakabilirler. Bu politika, 85 sürümünden sonra kaldırılacaktır. - </translation> <translation id="2438609638493026652">Android uygulaması yüklemesi sırasında önemli etkinliklerin Google'a bildirilmesini sağlar. Etkinlikler yalnızca yüklemesini politikanın tetiklediği uygulamalar için yakalanır. Politika true (doğru) değerine ayarlanırsa etkinlikler günlüğe kaydedilir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index acabbd9..beebc91 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -959,16 +959,6 @@ Якщо це правило не налаштовано або для нього вибрано значення true, користувачі можуть застосовувати спільні мережеві файли. Якщо для цього правила вибрано значення false, користувачі не можуть застосовувати спільні мережеві файли.</translation> -<translation id="2437706973218087361">Це правило керує функцією безпеки в TLS 1.3, яка захищає з'єднання від атак, спрямованих на повернення до попередньої версії. Воно сумісне з попередніми версіями та не вплине на з'єднання із сумісними серверами або проксі-серверами TLS 1.2. Однак старіші версії певних проксі-серверів, що перехоплюють протокол TLS, несумісні, оскільки мають недоліки в застосуванні. - - Якщо для цього правила вибрано значення True, <ph name="PRODUCT_NAME" /> увімкне цей захист для всіх з'єднань. - - Якщо для цього правила вибрано значення False або його не налаштовано, <ph name="PRODUCT_NAME" /> вимкне цей захист для з'єднань з автентифікацією за допомогою локальних сертифікатів центру сертифікації. Цей захист завжди ввімкнено для з'єднань з автентифікацією за допомогою надійних сертифікатів ЦС. - - Це правило можна застосовувати для виявлення й оновлення вразливих проксі-серверів. Під час з'єднання з такими проксі-серверами буде з'являється повідомлення про помилку ERR_TLS13_DOWNGRADE_DETECTED. У новішій версії <ph name="PRODUCT_NAME" /> цю опцію буде ввімкнено за умовчанням. - - У такому разі адміністратори, яким потрібно більше часу для оновлення вразливих проксі-серверів, зможуть скористатися цим правилом, щоб тимчасово вимкнути цю функцію безпеки. У версії 85 і новіших це правило буде вилучено. - </translation> <translation id="2438609638493026652">Дає змогу надсилати звіти в Google про основні події під час встановлення додатків Android. Записи робляться лише для тих додатків, встановлення яких активоване цим правилом. Якщо для правила вибрано значення true, події реєструватимуться.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index ac4f5366..8433f9a 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -960,16 +960,6 @@ Khi chưa định cấu hình chính sách này hoặc khi đặt chính sách thành True, người dùng sẽ có thể sử dụng tính năng Chia sẻ tệp trong mạng. Khi đặt chính sách này thành False, người dùng sẽ không thể sử dụng tính năng Chia sẻ tệp trong mạng.</translation> -<translation id="2437706973218087361">Chính sách này kiểm soát một tính năng bảo mật trong TLS 1.3 giúp bảo vệ các đường kết nối khỏi các cuộc tấn công hạ cấp. Tính năng này có khả năng tương thích ngược và sẽ không ảnh hưởng đến các kết nối tới proxy hoặc máy chủ TLS 1.2 tuân thủ. Tuy nhiên, các phiên bản cũ của một số proxy chặn TLS hiện có một lỗi triển khai gây ra tình trạng không tương thích. - - Nếu bạn đặt chính sách này thành True, thì <ph name="PRODUCT_NAME" /> sẽ bật các biện pháp bảo vệ an ninh này cho mọi đường kết nối. - - Nếu bạn đặt thành False hoặc không đặt chính sách này, thì <ph name="PRODUCT_NAME" /> sẽ tắt các biện pháp bảo vệ an ninh này đối với những đường kết nối được xác thực bằng chứng chỉ CA đã cài đặt trên máy. Các biện pháp bảo vệ này luôn bật đối với những đường kết nối được xác thực bằng chứng chỉ CA được tin cậy công khai. - - Chính sách này có thể dùng để kiểm tra xem có proxy nào bị ảnh hưởng không và nâng cấp các proxy đó. Theo dự kiến, các proxy bị ảnh hưởng sẽ khiến kết nối không thành công với mã lỗi là ERR_TLS13_DOWNGRADE_DETECTED. Một phiên bản <ph name="PRODUCT_NAME" /> mới hơn sẽ bật tùy chọn này theo mặc định. - - Sau khi bật tùy chọn này theo mặc định, những quản trị viên cần thêm thời gian để nâng cấp các proxy bị ảnh hưởng có thể dùng chính sách này để tạm thời tắt tính năng bảo mật này. Chính sách này sẽ bị loại bỏ sau phiên bản 85. - </translation> <translation id="2438609638493026652">Bật tính năng báo cáo các sự kiện quan trọng trong quá trình cài đặt ứng dụng Android cho Google. Các sự kiện chỉ được ghi lại cho các ứng dụng có quá trình cài đặt được kích hoạt qua chính sách. Nếu bạn đặt chính sách này là true thì các sự kiện sẽ được ghi lại.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index cdefde8..118b980 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -898,16 +898,6 @@ 如果未配置此政策或将其设为“True”,用户将能够使用网络文件共享功能。 如果将此政策设为“False”,用户将无法使用网络文件共享功能。</translation> -<translation id="2437706973218087361">此政策用于控制 TLS 1.3 中的一项安全功能,该功能可为连接提供保护,使其免受降级攻击。它可向后兼容,因此不会影响与合规的 TLS 1.2 服务器或代理之间的连接。但是,某些旧版 TLS 拦截代理存在一项实施漏洞,此漏洞会导致这些代理不兼容。 - - 如果此政策设为 True,<ph name="PRODUCT_NAME" /> 会为所有连接启用此类安全保护措施。 - - 如果此政策设为 False 或未设置,那么对于使用本地安装的 CA 证书进行身份验证的连接,<ph name="PRODUCT_NAME" /> 会停用此类安全保护措施。对于使用公认可信的 CA 证书进行身份验证的连接,系统会始终启用此类保护措施。 - - 此政策可用于测试任何受影响的代理并为其升级。受影响的代理预计会无法成功连接,并会返回错误代码 ERR_TLS13_DOWNGRADE_DETECTED。后续版本的 <ph name="PRODUCT_NAME" /> 会默认启用此选项。 - - 届时,如果管理员需要更多时间来升级受影响的代理,则可以使用此政策暂时停用这项安全功能。在版本 85 后,此政策将被移除。 - </translation> <translation id="2438609638493026652">允许向 Google 报告 Android 应用安装过程中发生的重要事件。系统仅会针对通过政策触发安装的应用捕获相关事件。 如果此政策设为 true,系统将会记录相关事件。 @@ -2361,7 +2351,7 @@ <translation id="4693779768620889402">基于扩展程序的目的地</translation> <translation id="4699592681017489215">借助此政策,您可以配置一个用于停用 DNS 拦截检查功能的本地开关。该检查功能旨在尝试检测浏览器是否使用了会重定向不明主机名的代理。 - 在具有已知网络配置的企业环境中,可能没必要使用这项检测功能,因为如果在此类环境中使用该功能,那么每当该功能启动时以及每当 DNS 配置有变时,都会产生一些 DNS 和 HTTP 流量。 + 在企业环境中,其网络配置是已知的,可能没必要使用这项检测功能,因为如果在此类环境中使用该功能,那么每当该功能启动时以及每当 DNS 配置有变时,都会产生一些 DNS 和 HTTP 流量。 如果未设置或启用了此政策,系统会执行 DNS 拦截检查。如果明确停用了此政策,系统便不会执行 DNS 拦截检查。</translation> <translation id="4703402283970867140">启用智能调暗模式,以最大限度地推迟屏幕变暗时间</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 6aebfd2..767f479 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -933,16 +933,6 @@ 如果未設定這項政策,或是將這項政策設定為「True」,使用者將可以使用網路檔案共用功能。 如果將這項政策設定為「False」,則使用者將無法使用網路檔案共用功能。</translation> -<translation id="2437706973218087361">這項政策可控管傳輸層安全標準 (TLS) 1.3 中保護連線免受降級攻擊的安全性功能。這項政策與舊版相容,且不會影響與傳輸層安全標準 (TLS) 1.2 伺服器或 Proxy 相容的連線。但是,部分舊版的傳輸層安全標準 (TLS) 攔截 Proxy 具有實作瑕疵,因此會造成無法相容的情形。 - - 如果將這項政策設為 True,<ph name="PRODUCT_NAME" /> 將啟用所有連線的安全保護措施。 - - 如果不設定這項政策或設為 False,當連線使用本機安裝的 CA 憑證進行驗證時,<ph name="PRODUCT_NAME" /> 會停用這些安全保護措施。當連線使用公開信任的 CA 憑證進行驗證時,系統一律會啟用這些保護措施。 - - 這項政策可能會用於測試任何受影響的 Proxy,並進行升級。受影響的 Proxy 將無法連線,錯誤代碼為 ERR_TLS13_DOWNGRADE_DETECTED。較新版本的 <ph name="PRODUCT_NAME" /> 預設會啟用這個選項。 - - 預設啟用這個選項後,如果系統管理員需要更多時間升級受影響的 Proxy,可以使用此政策暫時停用這項安全功能。這項政策將在第 85 版後移除。 - </translation> <translation id="2438609638493026652">允許將 Android 應用程式安裝期間的重要事件回報給 Google。系統只會記錄透過政策觸發的應用程式安裝事件。 如果將這項政策設為 true,系統就會記錄事件。
diff --git a/components/safe_browsing/android/BUILD.gn b/components/safe_browsing/android/BUILD.gn index f4558a1..935edd2 100644 --- a/components/safe_browsing/android/BUILD.gn +++ b/components/safe_browsing/android/BUILD.gn
@@ -12,7 +12,7 @@ "//third_party/android_deps:androidx_annotation_annotation_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java", "java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java", ]
diff --git a/components/safe_browsing/password_protection/metrics_util.cc b/components/safe_browsing/password_protection/metrics_util.cc index c546fef..58a3cc7 100644 --- a/components/safe_browsing/password_protection/metrics_util.cc +++ b/components/safe_browsing/password_protection/metrics_util.cc
@@ -36,6 +36,10 @@ "PasswordProtection.RequestOutcome.GSuiteNonSyncPasswordEntry"; const char kSavedPasswordEntryRequestOutcomeHistogram[] = "PasswordProtection.RequestOutcome.SavedPasswordEntry"; +const char kUnknownPrimaryAccountPasswordEntryVerdictHistogram[] = + "PasswordProtection.Verdict.UnknownPrimaryPasswordEntry"; +const char kUnknownNonPrimaryAccountPasswordEntryVerdictHistogram[] = + "PasswordProtection.Verdict.UnknownNonPrimaryPasswordEntry"; const char kGSuiteSyncPasswordEntryVerdictHistogram[] = "PasswordProtection.Verdict.GSuiteSyncPasswordEntry"; const char kGSuiteNonSyncPasswordEntryVerdictHistogram[] = @@ -62,7 +66,6 @@ "PasswordProtection.InterstitialAction.NonSyncPasswordEntry"; const char kNonSyncPasswordPageInfoHistogram[] = "PasswordProtection.PageInfoAction.NonSyncPasswordEntry"; - const char kGSuiteSyncPasswordInterstitialHistogram[] = "PasswordProtection.InterstitialAction.GSuiteSyncPasswordEntry"; const char kGSuiteNonSyncPasswordInterstitialHistogram[] = @@ -197,6 +200,12 @@ kAnyPasswordEntryVerdictHistogram, verdict_type, (LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1)); if (is_account_syncing) { + if (password_account_type.account_type() == + ReusedPasswordAccountType::UNKNOWN) { + UMA_HISTOGRAM_ENUMERATION( + kUnknownPrimaryAccountPasswordEntryVerdictHistogram, verdict_type, + (LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1)); + } UMA_HISTOGRAM_ENUMERATION( kSyncPasswordEntryVerdictHistogram, verdict_type, (LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1)); @@ -235,6 +244,11 @@ UMA_HISTOGRAM_ENUMERATION( kSavedPasswordEntryVerdictHistogram, verdict_type, (LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1)); + } else { + UMA_HISTOGRAM_ENUMERATION( + kUnknownNonPrimaryAccountPasswordEntryVerdictHistogram, + verdict_type, + (LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1)); } break; default:
diff --git a/components/safe_browsing/proto/csd.proto b/components/safe_browsing/proto/csd.proto index fe2bb07..17fc9ae 100644 --- a/components/safe_browsing/proto/csd.proto +++ b/components/safe_browsing/proto/csd.proto
@@ -263,6 +263,8 @@ optional bool is_account_syncing = 1; enum AccountType { + // User reused a password that is not a signed-in account, saved + // password, or a non-GAIA enterprise account. UNKNOWN = 0; // User signed in with a dasher account.
diff --git a/components/search_engines/android/BUILD.gn b/components/search_engines/android/BUILD.gn index 0247b73..2131e7b 100644 --- a/components/search_engines/android/BUILD.gn +++ b/components/search_engines/android/BUILD.gn
@@ -12,7 +12,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/search_engines/TemplateUrl.java", "java/src/org/chromium/components/search_engines/TemplateUrlService.java", ]
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json index af61d0c5..d4679b3 100644 --- a/components/search_engines/prepopulated_engines.json +++ b/components/search_engines/prepopulated_engines.json
@@ -23,7 +23,7 @@ // When adding new engines, increment this number and use it as the new // max ID. This is used by UMA stats and must be updated to include the full // range or else not all engines will be counted in stats. - "kMaxPrepopulatedEngineID": 94, + "kMaxPrepopulatedEngineID": 100, // Increment this if you change the data in ways that mean users with // existing data should get a new version. Otherwise, existing data may @@ -156,12 +156,22 @@ "id": 94 }, - "seznam": { + "seznam_cz": { "name": "Seznam", "keyword": "seznam.cz", - "favicon_url": "https://search.seznam.cz/r/img/favicon.ico", + "favicon_url": "https://search.seznam.cz/favicon.ico", "search_url": "https://search.seznam.cz/?q={searchTerms}", - "suggest_url": "https://suggest.fulltext.seznam.cz/fulltext_ff?phrase={searchTerms}", + "suggest_url": "https://suggest.seznam.cz/fulltext_ff?phrase={searchTerms}", + "type": "SEARCH_ENGINE_SEZNAM", + "id": 25 + }, + + "seznam_sk": { + "name": "Seznam", + "keyword": "seznam.sk", + "favicon_url": "https://search.seznam.sk/favicon.ico", + "search_url": "https://search.seznam.sk/?q={searchTerms}", + "suggest_url": "https://suggest.seznam.sk/fulltext_ff?phrase={searchTerms}", "type": "SEARCH_ENGINE_SEZNAM", "id": 25 }, @@ -732,6 +742,76 @@ "id": 60 }, + "givero": { + "name": "Givero", + "keyword": "givero.com", + "favicon_url": "https://www.givero.com/favicon.ico", + "search_url": "https://www.givero.com/search?q={searchTerms}", + "suggest_url": "https://www.givero.com/suggest?q={searchTerms}", + "type": "SEARCH_ENGINE_GIVERO", + "id": 95 + }, + + "gmx": { + "name": "GMX Search", + "keyword": "search.gmx.com", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://search.gmx.com/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.com/s?q={searchTerms}&brand=gmxcom&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + + "gmx_at": { + "name": "GMX Suche", + "keyword": "suche.gmx.at", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://suche.gmx.at/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.at/s?q={searchTerms}&brand=gmxat&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + + "gmx_de": { + "name": "GMX Suche", + "keyword": "suche.gmx.net", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://suche.gmx.net/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.net/s?q={searchTerms}&brand=gmx&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + + "gmx_es": { + "name": "GMX Search", + "keyword": "search.gmx.es", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://search.gmx.es/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.es/s?q={searchTerms}&brand=gmxes&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + + "gmx_fr": { + "name": "GMX Search", + "keyword": "search.gmx.fr", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://search.gmx.fr/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.fr/s?q={searchTerms}&brand=gmxfr&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + + "gmx_gb": { + "name": "GMX Search", + "keyword": "search.gmx.co.uk", + "favicon_url": "https://dl.gmx.com/apps/favicon.ico", + "search_url": "https://search.gmx.co.uk/web/result?q={searchTerms}&sp=b", + "suggest_url": "https://suggestplugin.gmx.co.uk/s?q={searchTerms}&brand=gmxcouk&enc={inputEncoding}&sp=b", + "type": "SEARCH_ENGINE_GMX", + "id": 96 + }, + "goo": { "name": "goo", "keyword": "search.goo.ne.jp", @@ -793,6 +873,15 @@ "id": 74 }, + "info_com": { + "name": "Info.com", + "keyword": "info.com", + "favicon_url": "https://www.info.com/static/www.info.com/favicon.ico", + "search_url": "https://www.info.com/serp?q={searchTerms}&segment=info.0472", + "type": "SEARCH_ENGINE_INFO_COM", + "id": 97 + }, + "libero": { "name": "Libero", "keyword": "libero.it", @@ -803,6 +892,24 @@ "id": 63 }, + "metager_de": { + "name": "MetaGer", + "keyword": "metager.de", + "favicon_url": "https://metager.de/favicon.ico", + "search_url": "https://metager.de/meta/meta.ger3?eingabe={searchTerms}", + "type": "SEARCH_ENGINE_METAGER", + "id": 98 + }, + + "metager_gb": { + "name": "MetaGer", + "keyword": "metager.org", + "favicon_url": "https://metager.de/favicon.ico", + "search_url": "https://metager.org/meta/meta.ger3?eingabe={searchTerms}", + "type": "SEARCH_ENGINE_METAGER", + "id": 98 + }, + "neti": { "name": "NETI", "keyword": "neti.ee", @@ -828,6 +935,16 @@ "id": 43 }, + "oceanhero":{ + "name": "OceanHero", + "keyword": "oceanhero.today", + "favicon_url": "https://oceanhero.today/favicon.ico", + "search_url": "https://oceanhero.today/web?q={searchTerms}", + "suggest_url": "https://api.oceanhero.today/suggestions?q={searchTerms}", + "type": "SEARCH_ENGINE_OCEANHERO", + "id": 99 + }, + "ok": { "name": "OK.hu", "keyword": "ok.hu", @@ -838,6 +955,16 @@ "id": 6 }, + "privacywall": { + "name": "PrivacyWall", + "keyword": "privacywall.org", + "favicon_url": "https://www.privacywall.org/images/favicon32.ico", + "search_url": "https://www.privacywall.org/search/secure/?q={searchTerms}", + "suggest_url": "https://www.privacywall.org/search/suggest.php?q={searchTerms}", + "type": "SEARCH_ENGINE_PRIVACYWALL", + "id": 100 + }, + "rambler": { "name": "\u0420\u0430\u043c\u0431\u043b\u0435\u0440", "keyword": "rambler.ru",
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h index 50b5cb89..ff303b8 100644 --- a/components/search_engines/search_engine_type.h +++ b/components/search_engines/search_engine_type.h
@@ -67,6 +67,12 @@ SEARCH_ENGINE_DUCKDUCKGO, SEARCH_ENGINE_PARSIJOO, SEARCH_ENGINE_QWANT, + SEARCH_ENGINE_GIVERO, + SEARCH_ENGINE_GMX, + SEARCH_ENGINE_INFO_COM, + SEARCH_ENGINE_METAGER, + SEARCH_ENGINE_OCEANHERO, + SEARCH_ENGINE_PRIVACYWALL, SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro. };
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc index 52dd123a..afd8d81a 100644 --- a/components/search_engines/template_url_prepopulate_data.cc +++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -204,7 +204,7 @@ // Czech Republic const PrepopulatedEngine* const engines_CZ[] = { &google, - &seznam, + &seznam_cz, &bing, &yahoo, };
diff --git a/components/sessions/core/session_service_commands.cc b/components/sessions/core/session_service_commands.cc index dd51167..d9b105b6 100644 --- a/components/sessions/core/session_service_commands.cc +++ b/components/sessions/core/session_service_commands.cc
@@ -18,6 +18,7 @@ #include "components/sessions/core/base_session_service_delegate.h" #include "components/sessions/core/session_command.h" #include "components/sessions/core/session_types.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" @@ -62,6 +63,7 @@ static const SessionCommand::id_type kCommandTabNavigationPathPruned = 24; static const SessionCommand::id_type kCommandSetTabGroup = 25; static const SessionCommand::id_type kCommandSetTabGroupMetadata = 26; +static const SessionCommand::id_type kCommandSetTabGroupMetadata2 = 27; namespace { @@ -626,7 +628,8 @@ break; } - case kCommandSetTabGroupMetadata: { + case kCommandSetTabGroupMetadata: + case kCommandSetTabGroupMetadata2: { std::unique_ptr<base::Pickle> pickle = command->PayloadAsPickle(); base::PickleIterator iter(*pickle); @@ -642,10 +645,35 @@ if (!iter.ReadString16(&title)) return true; - SkColor color; - if (!iter.ReadUInt32(&color)) - return true; - group->visual_data = tab_groups::TabGroupVisualData(title, color); + if (command->id() == kCommandSetTabGroupMetadata) { + SkColor color; + if (!iter.ReadUInt32(&color)) + return true; + + // crrev.com/c/1968039 changes the color of a tab group from a SkColor + // to a TabGroupColorId. Here we ignore the old SkColor and assign the + // default TabGroupColorId because the fallback is acceptable while + // the tab groups feature isn't yet launched. Once it is, + // kCommandSetTabGroupMetadata will be deprecated in favor of + // kCommandSetTabGroupMetadata2, which properly restores + // TabGroupColorIds. + group->visual_data = tab_groups::TabGroupVisualData( + title, tab_groups::TabGroupColorId::kGrey); + } else { + uint32_t color_int; + if (!iter.ReadUInt32(&color_int)) + return true; + + // Check for the existence of the enum value in the color set, which + // is the source of truth for allowed colors in tab groups. If the + // enum value doesn't exist, fall back to kGrey per UX preference. + tab_groups::TabGroupColorId color_id = + static_cast<tab_groups::TabGroupColorId>(color_int); + group->visual_data = tab_groups::TabGroupVisualData( + title, base::Contains(tab_groups::GetTabGroupColorSet(), color_id) + ? color_id + : tab_groups::TabGroupColorId::kGrey); + } break; } @@ -870,8 +898,8 @@ base::Pickle pickle; WriteTokenToPickle(&pickle, group.token()); pickle.WriteString16(visual_data->title()); - pickle.WriteUInt32(visual_data->color()); - return std::make_unique<SessionCommand>(kCommandSetTabGroupMetadata, pickle); + pickle.WriteUInt32(static_cast<int>(visual_data->color())); + return std::make_unique<SessionCommand>(kCommandSetTabGroupMetadata2, pickle); } std::unique_ptr<SessionCommand> CreatePinnedStateCommand(
diff --git a/components/sessions/core/tab_restore_service_impl.cc b/components/sessions/core/tab_restore_service_impl.cc index 43ec3f8..94c66227 100644 --- a/components/sessions/core/tab_restore_service_impl.cc +++ b/components/sessions/core/tab_restore_service_impl.cc
@@ -26,6 +26,7 @@ #include "components/sessions/core/base_session_service_delegate.h" #include "components/sessions/core/session_command.h" #include "components/sessions/core/session_constants.h" +#include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/tab_groups/tab_group_visual_data.h" @@ -704,7 +705,7 @@ const tab_groups::TabGroupVisualData* visual_data = &tab.group_visual_data.value(); pickle.WriteString16(visual_data->title()); - pickle.WriteUInt32(visual_data->color()); + pickle.WriteUInt32(static_cast<int>(visual_data->color())); std::unique_ptr<SessionCommand> command( new SessionCommand(kCommandGroup, pickle)); base_session_service_->ScheduleCommand(std::move(command)); @@ -966,18 +967,26 @@ base::PickleIterator iter(*pickle); base::Optional<base::Token> group_token = ReadTokenFromPickle(&iter); base::string16 title; - SkColor color; + uint32_t color_int; if (!iter.ReadString16(&title)) { break; } - if (!iter.ReadUInt32(&color)) { + if (!iter.ReadUInt32(&color_int)) { break; } current_tab->group = tab_groups::TabGroupId::FromRawToken(group_token.value()); - current_tab->group_visual_data = - tab_groups::TabGroupVisualData(title, color); + + // Check for the existence of the enum value in the color set, which is + // the source of truth for allowed colors in tab groups. If the enum + // value doesn't exist, fall back to kGrey per UX preference. + tab_groups::TabGroupColorId color_id = + static_cast<tab_groups::TabGroupColorId>(color_int); + current_tab->group_visual_data = tab_groups::TabGroupVisualData( + title, base::Contains(tab_groups::GetTabGroupColorSet(), color_id) + ? color_id + : tab_groups::TabGroupColorId::kGrey); break; }
diff --git a/components/signin/core/browser/android/BUILD.gn b/components/signin/core/browser/android/BUILD.gn index 15af61d..6aeade69 100644 --- a/components/signin/core/browser/android/BUILD.gn +++ b/components/signin/core/browser/android/BUILD.gn
@@ -26,14 +26,14 @@ "//ui/android:ui_java", ] - java_files = [ + sources = [ "java/src/org/chromium/components/signin/AccountIdProvider.java", "java/src/org/chromium/components/signin/AccountManagerDelegate.java", "java/src/org/chromium/components/signin/AccountManagerDelegateException.java", "java/src/org/chromium/components/signin/AccountManagerFacade.java", "java/src/org/chromium/components/signin/AccountManagerResult.java", - "java/src/org/chromium/components/signin/AccountsChangeObserver.java", "java/src/org/chromium/components/signin/AccountTrackerService.java", + "java/src/org/chromium/components/signin/AccountsChangeObserver.java", "java/src/org/chromium/components/signin/AuthException.java", "java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java", "java/src/org/chromium/components/signin/ChildAccountStatus.java", @@ -41,22 +41,22 @@ "java/src/org/chromium/components/signin/ConsistencyCookieManager.java", "java/src/org/chromium/components/signin/GmsAvailabilityException.java", "java/src/org/chromium/components/signin/GmsJustUpdatedException.java", - "java/src/org/chromium/components/signin/util/PatternMatcher.java", "java/src/org/chromium/components/signin/MutableObservableValue.java", "java/src/org/chromium/components/signin/ObservableValue.java", "java/src/org/chromium/components/signin/ProfileDataSource.java", "java/src/org/chromium/components/signin/SigninActivityMonitor.java", "java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java", + "java/src/org/chromium/components/signin/util/PatternMatcher.java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } junit_binary("components_signin_junit_tests") { - java_files = [ + sources = [ "junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java", - "junit/src/org/chromium/components/signin/test/PatternMatcherTest.java", "junit/src/org/chromium/components/signin/test/ObservableValueTest.java", + "junit/src/org/chromium/components/signin/test/PatternMatcherTest.java", ] deps = [ ":java", @@ -83,7 +83,9 @@ "//third_party/junit", ] - java_files = [ "javatests/src/org/chromium/components/signin/test/AccountManagerFacadeTest.java" ] + sources = [ + "javatests/src/org/chromium/components/signin/test/AccountManagerFacadeTest.java", + ] } android_library("signin_java_test_support") { @@ -97,7 +99,7 @@ "//third_party/junit", ] - java_files = [ + sources = [ "javatests/src/org/chromium/components/signin/test/util/AccountHolder.java", "javatests/src/org/chromium/components/signin/test/util/AccountManagerTestRule.java", "javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java",
diff --git a/components/signin/public/android/BUILD.gn b/components/signin/public/android/BUILD.gn index fad02da..93a6fc3 100644 --- a/components/signin/public/android/BUILD.gn +++ b/components/signin/public/android/BUILD.gn
@@ -15,7 +15,7 @@ "//components/signin/public/identity_manager:identity_manager_enum_javagen", ] - java_files = [ + sources = [ "java/src/org/chromium/components/signin/base/CoreAccountId.java", "java/src/org/chromium/components/signin/base/CoreAccountInfo.java", "java/src/org/chromium/components/signin/identitymanager/IdentityManager.java",
diff --git a/components/spellcheck/browser/android/BUILD.gn b/components/spellcheck/browser/android/BUILD.gn index cd871f5..1658da7 100644 --- a/components/spellcheck/browser/android/BUILD.gn +++ b/components/spellcheck/browser/android/BUILD.gn
@@ -17,5 +17,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ "java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java" ] + sources = [ + "java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java", + ] }
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index bedeaa9..cf77ee69b 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Voer tans netwerkdiagnostiek uit<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Vertaal hierdie bladsy</translation> <translation id="2479410451996844060">Ongeldige soektog-URL.</translation> -<translation id="2482370039860827034">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chrome beveel aan dat jy gaan na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en ander werwe waarop jy hierdie wagwoord gebruik en dit nou verander.</translation> <translation id="2482878487686419369">Kennisgewings</translation> <translation id="248348093745724435">Masjienbeleide</translation> <translation id="2491120439723279231">Bediener se sertifikaat bevat foute.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Beskerm rekening</translation> <translation id="2515629240566999685">Die sein in jou omgewing nagaan</translation> <translation id="2521385132275182522">Kram regs onder</translation> -<translation id="2521483867890026383">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chromium beveel aan dat jy gaan na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en ander werwe waarop jy hierdie wagwoord gebruik en dit nou verander.</translation> <translation id="2523886232349826891">Net op hierdie toestel gestoor</translation> <translation id="2524461107774643265">Voeg meer inligting by</translation> <translation id="2535659140340599600">{COUNT,plural, =1{en nog 1}other{en nog #}}</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index db39002b..d1d9285 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />የአውታረ መረብ መመርመሪያን በማሄድ ላይ<ph name="END_LINK" /></translation> <translation id="2473195200299095979">ይህን ገጽ መተርጎም</translation> <translation id="2479410451996844060">ልክ ያልሆነ የፍለጋ ዩአርኤል።</translation> -<translation id="2482370039860827034">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chrome ወደ <ph name="WEBSITE_1" />፣ እና <ph name="WEBSITE_2" />፣ እና ይህን ይለፍ ቃል በሚጠቀሙባቸው ሌላ ጣቢያዎች መሄድን እና አሁኑኑ እንዲለውጡት ይመክራል።</translation> <translation id="2482878487686419369">ማስታወቂያዎች</translation> <translation id="248348093745724435">የማሽን መመሪያዎች</translation> <translation id="2491120439723279231">የአገልጋይ እውቅና ማረጋገጫ ስህተቶችን ይዟል።</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">መለያን ጠብቅ</translation> <translation id="2515629240566999685">በእርስዎ አካባቢ ያለውን ሲግናል መፈተሽ</translation> <translation id="2521385132275182522">ከግራጌ በቀኝ በኩል ስቴፕለር ምታ</translation> -<translation id="2521483867890026383">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chromium ወደ <ph name="WEBSITE_1" />፣ እና <ph name="WEBSITE_2" />፣ እና ይህን ይለፍ ቃል በሚጠቀሙባቸው ሌላ ጣቢያዎች መሄድን እና አሁኑኑ እንዲለውጡት ይመክራል።</translation> <translation id="2523886232349826891">በዚህ መሣሪያ ላይ ብቻ ይቀመጣል</translation> <translation id="2524461107774643265">ተጨማሪ መረጃ ያክሉ</translation> <translation id="2535659140340599600">{COUNT,plural, =1{እና 1 ተጨማሪ}one{እና # ተጨማሪ}other{እና # ተጨማሪ}}</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 895f95e..d5c24af 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -602,6 +602,7 @@ <translation id="3828924085048779000">খালী পাছফ্ৰেজৰ অনুমতি নাই।</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" />এ অতিৰিক্ত ফাংশ্বনৰ বাবে এক্সটেনশ্বন ইনষ্টল কৰিছে। এক্সটেনশ্বনসমূহে আপোনাৰ কিছুমান ডেটা এক্সেছ কৰিব পাৰে।</translation> <translation id="3832522519263485449">বাওঁফালে একাধিক পাঞ্চ কৰক</translation> +<translation id="3838154488026099170">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> আৰু <ph name="WEBSITE_3" />ৰ লগতে আপুনি এই পাছৱৰ্ডটো ব্যৱহাৰ কৰা অন্য ছাইটসমূহলৈ গৈ এইটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰে।</translation> <translation id="385051799172605136">উভতি যাওক</translation> <translation id="3858027520442213535">তাৰিখ আৰু সময় আপডে’ট কৰক</translation> <translation id="3884278016824448484">বিৰোধাত্মক ডিভাইচ চিনাক্তকাৰী</translation> @@ -638,6 +639,7 @@ <translation id="4067947977115446013">মান্য ঠিকনা দিয়ক</translation> <translation id="4075732493274867456">ক্লায়েণ্ট আৰু ছাৰ্ভাৰত এটা উমৈহতীয়া SSL প্ৰট’কল সংস্কৰণ বা চাইফাৰ ছুট সমৰ্থন নকৰে।</translation> <translation id="4075941231477579656">স্পৰ্শ আইডি</translation> +<translation id="4077092919748553596">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> আৰু <ph name="WEBSITE_3" />ৰ লগতে আপুনি এই পাছৱৰ্ডটো ব্যৱহাৰ কৰা অন্য ছাইটসমূহলৈ গৈ এইটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰে।</translation> <translation id="4079302484614802869">প্ৰক্সি কনফিগাৰেশ্বন এটা .pac স্ক্রিপ্ট URL ব্যৱহাৰ কৰিবলৈহে ছেট কৰা হয়, স্থিৰ প্ৰক্সি ছাৰ্ভাৰ ব্যৱহাৰ কৰিবলৈ নহয়।</translation> <translation id="4082393374666368382">ছেটিংসমূহ - পৰিচালনা</translation> <translation id="4098354747657067197">আগত বিভ্ৰান্তিকৰ ছাইট আছে</translation> @@ -716,6 +718,7 @@ <translation id="4356973930735388585">এই ছাইটত থকা আক্ৰমণকাৰীয়ে আপোনাৰ কম্পিউটাৰত ক্ষতিকাৰক প্র’গ্ৰেম ছেট কৰিবলৈ চেষ্টা কৰিব পাৰে যি আপোনাৰ তথ্য (উদাহৰণ স্বৰূপে, ফট’ পাছৱৰ্ড, বাৰ্তা আৰু ক্ৰেডিট কাৰ্ড) চুৰ কৰিব পাৰে।</translation> <translation id="4358059973562876591">DnsOverHttpsMode নীতিৰ লগত জড়িত কোনো আসোঁৱাহৰ বাবে আপুনি নির্দিষ্ট কৰা টেমপ্লেটসমূহ প্ৰয়োগ কৰা নহ’ব পাৰে।</translation> <translation id="4358461427845829800">পৰিশোধৰ পদ্ধতি পৰিচালনা কৰক...</translation> +<translation id="4359160567981085931">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ সহায় কৰিব পাৰে। আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ আৰু আপোনাৰ একাউণ্টটো ক্ষতি হোৱাৰ সম্ভাৱনা থকা বুলি Googleক অৱগত কৰিবলৈ একাউণ্টটো সুৰক্ষিত কৰকত ক্লিক কৰক।</translation> <translation id="4367563149485757821">নম্বৰ-১২ (লেফাফা)</translation> <translation id="437058704415269440">একাউণ্টৰ বেলেঞ্চ</translation> <translation id="4372516964750095882">ফেনফ’ল্ড-ইউএছ</translation> @@ -991,6 +994,7 @@ <translation id="5728056243719941842">C5 (লেফাফা)</translation> <translation id="5730040223043577876">আপুনি যদি নিজৰ পাছৱৰ্ডটো অন্য ছাইটত পুনৰ ব্যৱহাৰ কৰিছিল Chromeএ আপোনাৰ পাছৱর্ডটো ৰিছেট কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{আপোনাৰ Google একাউণ্টত কার্ড ছেভ কৰক}one{আপোনাৰ Google একাউণ্টত কার্ডসমূহ ছেভ কৰক}other{আপোনাৰ Google একাউণ্টত কার্ডসমূহ ছেভ কৰক}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{এই কাৰ্ডখনৰ বাবে এটা ভাৰ্চুৱেল নম্বৰ ব্যৱহাৰ কৰক}one{এখন কাৰ্ড বাছনি কৰক}other{এখন কাৰ্ড বাছনি কৰক}}</translation> <translation id="5763042198335101085">এটা মান্য ইমেইল ঠিকনা দিয়ক</translation> <translation id="5763703224595565476">আপোনাৰ প্ৰশাসকে আপোনাৰ ব্ৰাউজাৰত Chrome Enterprise User Protect সক্ষম কৰিছে। Chrome Enterprise User Protectএ আপোনাৰ কিছুমান ডেটা এক্সেছ কৰিব পাৰে।</translation> <translation id="5765072501007116331">ডেলিভাৰীৰ পদ্ধতি আৰু আৱশ্যকতা সম্পর্কে চাবলৈ কোনো ঠিকনা বাছনি কৰক</translation> @@ -1007,6 +1011,7 @@ <translation id="5804241973901381774">অনুমতি</translation> <translation id="5810442152076338065">আপোনাৰ <ph name="DOMAIN" />ৰ সৈতে থকা সংযোগ কোনো অপ্ৰচলিত চাইফাৰ ছুট ব্যৱহাৰ কৰি এনক্ৰিপ্ট কৰা হৈছে।</translation> <translation id="5813119285467412249">যোগ কৰা কার্য &ৰিডু কৰক</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{আপুনি পৰিশোধ কৰিলে এই কাৰ্ডখনৰ পৰা টকা আদায় দিয়া হ’ব কিন্তু ইয়াৰ প্ৰকৃত নম্বৰটো এই ছাইটটোৰ সৈতে শ্বেয়াৰ কৰা নহ’ব। অতিৰিক্ত সুৰক্ষাৰ বাবে এটা সাময়িক CVC সৃষ্টি কৰা হ’ব।}one{আপুনি পৰিশোধ কৰিলে আপুনি বাছনি কৰা কাৰ্ডখনৰ পৰা টকা আদায় দিয়া হ’ব কিন্তু ইয়াৰ প্ৰকৃত নম্বৰটো এই ছাইটটোৰ সৈতে শ্বেয়াৰ কৰা নহ’ব। অতিৰিক্ত সুৰক্ষাৰ বাবে এটা সাময়িক CVC সৃষ্টি কৰা হ’ব।}other{আপুনি পৰিশোধ কৰিলে আপুনি বাছনি কৰা কাৰ্ডখনৰ পৰা টকা আদায় দিয়া হ’ব কিন্তু ইয়াৰ প্ৰকৃত নম্বৰটো এই ছাইটটোৰ সৈতে শ্বেয়াৰ কৰা নহ’ব। অতিৰিক্ত সুৰক্ষাৰ বাবে এটা সাময়িক CVC সৃষ্টি কৰা হ’ব।}}</translation> <translation id="583281660410589416">অজ্ঞাত</translation> <translation id="5838278095973806738">আপুনি এই চাইটটোত কোনো সংবেদনশীল তথ্য দিয়াটো উচিত নহয় (উদাহৰণ স্বৰূপে, পাছৱৰ্ড বা ক্ৰেডিট কাৰ্ড) কাৰণ এয়া আক্ৰমণকাৰীয়ে চুৰ কৰিব পাৰে।</translation> <translation id="5851548754964597211">টেবৰ তালিকা</translation> @@ -1457,6 +1462,7 @@ <translation id="8042918947222776840">পিক্আপৰ পদ্ধতি বাছনি কৰক</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />"ক সঠিককৈ কনফিগাৰ কৰা হোৱা নাই। "<ph name="SOFTWARE_NAME" />" আনইনষ্টল কৰিলে সাধাৰণতে সমস্যাটো সমাধান কৰে। <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">দুঃখিত, কিবা ভুল হ'ল।</translation> +<translation id="8067872629359326442">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ সহায় কৰিব পাৰে। আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ আৰু আপোনাৰ একাউণ্টটো ক্ষতি হোৱাৰ সম্ভাৱনা থকা বুলি Googleক অৱগত কৰিবলৈ একাউণ্টটো সুৰক্ষিত কৰকত ক্লিক কৰক।</translation> <translation id="8074253406171541171">১০x১৩ (লেফাফা)</translation> <translation id="8078141288243656252">ঘূৰ্ণীয়মান অৱস্থাত থাকিলে এন’টে’ট কৰিব নোৱাৰে</translation> <translation id="8079031581361219619">ছাইটটো পুনৰ ল’ড কৰিবনে?</translation> @@ -1473,6 +1479,7 @@ <translation id="8105368624971345109">অফ কৰক</translation> <translation id="8118489163946903409">পৰিশোধ পদ্ধতি</translation> <translation id="8127301229239896662">আপোনাৰ কম্পিউটাৰ বা নেটৱৰ্কত "<ph name="SOFTWARE_NAME" />" ভালকৈ ইনষ্টল কৰা হোৱা নাছিল। আপোনাৰ আইটি প্ৰশাসকক এই সমস্যাটোৰ সমাধান বিচাৰক</translation> +<translation id="8128526133099929547">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ <ph name="WEBSITE_1" /> আৰু আপুনি এই পাছৱৰ্ডটো ব্যৱহাৰ কৰা অন্য ছাইটসমূহলৈ গৈ এইটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰে।</translation> <translation id="8131740175452115882">নিশ্চিত কৰক</translation> <translation id="8149426793427495338">আপোনাৰ কম্পিউটাৰটো সুপ্ত অৱস্থালৈ গৈছিল।</translation> <translation id="8150722005171944719"><ph name="URL" />ৰ ফাইলটো পঢ়িব পৰা অৱস্থাত নাই। এই ফাইলটো হয়তো আঁতৰোৱা হৈছে, ইয়াৰ পৰা লৈ যোৱা হৈছে বা ফাইলৰ অনুমতিয়ে এক্সেছ প্ৰদান কৰা নাই।</translation> @@ -1490,6 +1497,7 @@ <translation id="8218327578424803826">অভিযোজন কৰা অৱস্থান:</translation> <translation id="8220146938470311105">C7/C6 (লেফাফা)</translation> <translation id="8220639454292072926">এণ্টাৰপ্ৰাইজৰ ৰিপ’ৰ্ট বনোৱা কাৰ্য</translation> +<translation id="8221250263817408492">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ <ph name="WEBSITE_1" /> আৰু আপুনি এই পাছৱৰ্ডটো ব্যৱহাৰ কৰা অন্য ছাইটসমূহলৈ গৈ এইটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰে।</translation> <translation id="8225771182978767009">এই কম্পিউটাৰটো ছেট আপ কৰা লোকজনে এই ছাইটটো অৱৰোধ কৰিছে।</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">এটা নতুন ইনক’গনিট’ টেবত পৃষ্ঠা খোলক</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 2202a6c..33fcb54 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -603,6 +603,7 @@ <translation id="3828924085048779000">Boş parola icazə verilmir.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> domeninə əlavə funksiyalar üçün artırmalar quraşdırılıb. Artırmalar datanın bir hissəsinə daxil ola bilər.</translation> <translation id="3832522519263485449">Soldan çoxsaylı deşik açın</translation> +<translation id="3838154488026099170">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium indi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation> <translation id="385051799172605136">Geri</translation> <translation id="3858027520442213535">Tarix və saatı güncəlləşdirin</translation> <translation id="3884278016824448484">Ziddiyyətli cihaz identifikatoru</translation> @@ -640,6 +641,7 @@ <translation id="4072486802667267160">Sifariş hazırlanarkən xəta baş verdi. Yenidən cəhd edin.</translation> <translation id="4075732493274867456">Klient və server ümumi SSL protokol versiyasını və ya şifrə dəstini dəstəkləmir.</translation> <translation id="4075941231477579656">Toxunuş ID-si</translation> +<translation id="4077092919748553596">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome indi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation> <translation id="4079302484614802869">Proksi konfiqurasiyası sabit proksi serverlər deyil, .pac skript URL istifadə etmək üçün ayarlanıb.</translation> <translation id="4082393374666368382">Ayarlar - İdarəetmə</translation> <translation id="4098354747657067197">Qabaqda aldadıcı site</translation> @@ -719,6 +721,7 @@ <translation id="4356973930735388585">Saytdakı hücumçular kompüterinizə təhlükəli proqramlar yükləyərək məlumatlarınızı (məsələn, foto, parol, mesaj və kredit kart) oğurlamağa və ya silməyə cəhd edə bilər.</translation> <translation id="4358059973562876591">DnsOverHttpsMode siyasətində xəta olduğuna görə qeyd etdiyiniz şablonlar tətbiq edilməyə bilər.</translation> <translation id="4358461427845829800">Ödəniş üsullarını idarə edin...</translation> +<translation id="4359160567981085931">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome yardım edə bilər. Parolunuzu dəyişmək və Google'a hesabınızın təhlükədə ola biləcəyini bildirmək üçün "Hesabı Qoruyun" seçiminə toxunun.</translation> <translation id="4367563149485757821">Nömrə-12 (Zərf)</translation> <translation id="437058704415269440">Hesab Balansı</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -994,6 +997,7 @@ <translation id="5728056243719941842">C5 (Zərf)</translation> <translation id="5730040223043577876">Parolunuzdan digər saytlarda təkrar istifadə etmisinizsə, Chrome onu sıfırlamağınızı tövsiyə edir.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Kartı Google Hesabında yadda saxlayın}other{Kartları Google Hesabında yadda saxlayın}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Bu kart üçün virtual nömrə istifadə edin}other{Kart seçin}}</translation> <translation id="5763042198335101085">Düzgün e-poçt ünvanı daxil edin</translation> <translation id="5763703224595565476">Administratorunuz brauzerinizdə Chrome Enterprise İstifadəçi Qorumasını aktiv edib. Chrome Enterprise İstifadəçi Qoruması datanızın bir hissəsinə daxil ola biləcək.</translation> <translation id="5765072501007116331">Çatdırılma üsulları və tələblərinə baxın, ünvan seçin</translation> @@ -1010,6 +1014,7 @@ <translation id="5804241973901381774">İcazələr</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> domeninə bağlantınız köhnə şifrə paketi ilə şifrələnib.</translation> <translation id="5813119285467412249">Yenidən əlavə edin</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Ödəniş etdiyiniz zaman bu kartdan məbləğ tutulacaq, ancaq onun əsl nömrəsi bu saytla paylaşılmayacaq. Əlavə təhlükəsizlik üçün müvəqqəti CVC yaradılacaq.}other{Ödəniş etdiyiniz zaman seçdiyiniz kartdan məbləğ tutulacaq, ancaq onun əsl nömrəsi bu saytla paylaşılmayacaq. Əlavə təhlükəsizlik üçün müvəqqəti CVC yaradılacaq.}}</translation> <translation id="583281660410589416">Naməlum</translation> <translation id="5838278095973806738">Bu saytda hər hansı həssəs məlumatı (məsələn, parollar və kredit kartları) yerləşdirməməlisiniz, cünki, hücumçular tərəfindən oğurlana bilər.</translation> <translation id="5851548754964597211">Panel siyahısı</translation> @@ -1467,6 +1472,7 @@ <translation id="8042918947222776840">Götürmə Üsulu seçin</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" düzgün konfiqurasiya edilməyib. "<ph name="SOFTWARE_NAME" />" proqramının sistemdən silinməsi ilə adətən problem həll olunur. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Xəta baş verdi.</translation> +<translation id="8067872629359326442">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium yardım edə bilər. Parolunuzu dəyişmək və Google'a hesabınızın təhlükədə ola biləcəyini bildirmək üçün "Hesabı Qoruyun" seçiminə toxunun.</translation> <translation id="8074253406171541171">10x13 (Zərf)</translation> <translation id="8078141288243656252">Döndərilidikdə annotasiya mümkün deyil</translation> <translation id="8079031581361219619">Sayt yenidən yüklənsin?</translation> @@ -1483,6 +1489,7 @@ <translation id="8105368624971345109">Deaktiv Edin</translation> <translation id="8118489163946903409">Ödəniş üsulu</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" kompüter və ya şəbəkənizdə düzgün quraşdırılmayıb. IT administratorunuzdan bu problemi həll etməyi tələb edin.</translation> +<translation id="8128526133099929547">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome indi <ph name="WEBSITE_1" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation> <translation id="8131740175452115882">Təsdiq edin</translation> <translation id="8149426793427495338">Kompüteriniz yatmağa getdi.</translation> <translation id="8150722005171944719"><ph name="URL" /> linkində olan fayl oxunmur. O, silinmiş, köçürülmüş ola bilər və ya fayl icazələri girişin qarşısını alıb.</translation> @@ -1500,6 +1507,7 @@ <translation id="8218327578424803826">Ayrılmış yer:</translation> <translation id="8220146938470311105">C7/C6 (Zərf)</translation> <translation id="8220639454292072926">Korporativ hesabat</translation> +<translation id="8221250263817408492">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium indi <ph name="WEBSITE_1" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation> <translation id="8225771182978767009">Kompüteri quraşdıran şəxs bu saytı blok etməyi seçib.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Yeni Gizli tabda səhifə açın</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 2c1dc570..309d02b 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">Неабходна задаць фразу-пароль</translation> <translation id="3831915413245941253">Даменам <ph name="ENROLLMENT_DOMAIN" /> былі ўсталяваны пашырэнні для дадатковых функцый. Пашырэнні маюць доступ да некаторых вашых даных.</translation> <translation id="3832522519263485449">Некалькі дзірак злева</translation> +<translation id="3838154488026099170">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" /> і на іншых сайтах, дзе гэты пароль выкарыстоўваецца.</translation> <translation id="385051799172605136">Назад</translation> <translation id="3858027520442213535">Абнавіць дату і час</translation> <translation id="3884278016824448484">Канфлікт ідэнтыфікатара прылады</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Адбылася памылка апрацоўкi вашага заказу. Паўтарыце спробу.</translation> <translation id="4075732493274867456">Кліент і сервер не падтрымліваюць агульную версію пратакола SLL або набор шыфраў.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" /> і на іншых сайтах, дзе гэты пароль выкарыстоўваецца.</translation> <translation id="4079302484614802869">Канфігурацыяй проксі зададзена выкарыстоўваць URL-адрас сцэнарыя .pac, а не фіксаваныя проксі-серверы.</translation> <translation id="4082393374666368382">Налады – Кіраванне</translation> <translation id="4098354747657067197">Вы збіраецеся перайсці на сайт, вядомы падманнымі паводзінамі</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Зламыснікі на гэтым сайце могуць імкнуцца ўсталяваць небяспечныя праграмы на вашым камп'ютары, якія крадуць або выдаляюць вашу інфармацыю (напрыклад, фота, паролі, паведамленні, даныя крэдытных картак).</translation> <translation id="4358059973562876591">Зададзеныя вамі шаблоны могуць не прымяніцца з-за памылкі палітыкі DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Наладзіць аўтазапаўненне для спосабаў аплаты...</translation> +<translation id="4359160567981085931">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome можа дапамагчы. Націсніце "Абараніць уліковы запіс", каб змяніць пароль і апавясціць Google аб пагрозе вашаму ўліковаму запісу.</translation> <translation id="4367563149485757821">Number-12 (канверт)</translation> <translation id="437058704415269440">Баланс уліковага запісу</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (канверт)</translation> <translation id="5730040223043577876">Chrome рэкамендуе скінуць ваш пароль, калі вы карысталіся ім на іншых сайтах.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Захавайце плацежную картку ва Уліковым запісе Google}one{Захавайце плацежныя карткі ва Уліковым запісе Google}few{Захавайце плацежныя карткі ва Уліковым запісе Google}many{Захавайце плацежныя карткі ва Уліковым запісе Google}other{Захавайце плацежныя карткі ва Уліковым запісе Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Выкарыстайце віртуальны нумар для гэтай карткі}one{Выберыце картку}few{Выберыце картку}many{Выберыце картку}other{Выберыце картку}}</translation> <translation id="5763042198335101085">Увядзіце сапраўдны адрас электроннай пошты</translation> <translation id="5763703224595565476">Адміністратар уключыў у вашым браўзеры сістэму абароны карпаратыўных карыстальнікаў Chrome Enterprise. Гэта функцыя мае доступ да некаторых вашых даных.</translation> <translation id="5765072501007116331">Выберыце адрас, каб убачыць спосабы і ўмовы дастаўкі</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Дазволы</translation> <translation id="5810442152076338065">Падключэнне да дамена <ph name="DOMAIN" /> зашыфравана з дапамогай састарэлага алгарытму шыфравання.</translation> <translation id="5813119285467412249">&Узнавіць дадаванне</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Пры ажыццяўленні плацяжу сродкі спішуцца з гэтай карткі, але яе сапраўдны нумар не будзе абагулены з гэтым сайтам. У мэтах дадатковай бяспекі будзе створаны часовы код CVC.}one{Пры ажыццяўленні плацяжу сродкі спішуцца з выбранай вамі карткі, але яе сапраўдны нумар не будзе абагулены з гэтым сайтам. У мэтах дадатковай бяспекі будзе створаны часовы код CVC.}few{Пры ажыццяўленні плацяжу сродкі спішуцца з выбранай вамі карткі, але яе сапраўдны нумар не будзе абагулены з гэтым сайтам. У мэтах дадатковай бяспекі будзе створаны часовы код CVC.}many{Пры ажыццяўленні плацяжу сродкі спішуцца з выбранай вамі карткі, але яе сапраўдны нумар не будзе абагулены з гэтым сайтам. У мэтах дадатковай бяспекі будзе створаны часовы код CVC.}other{Пры ажыццяўленні плацяжу сродкі спішуцца з выбранай вамі карткі, але яе сапраўдны нумар не будзе абагулены з гэтым сайтам. У мэтах дадатковай бяспекі будзе створаны часовы код CVC.}}</translation> <translation id="583281660410589416">Невядома</translation> <translation id="5838278095973806738">Раім не ўводзіць на гэтым сайце ніякай канфідэнцыяльнай інфармацыі (пароляў, даных крэдытных картак і інш.), бо гэту інфармацыю могуць украсці зламыснікі.</translation> <translation id="5851548754964597211">Спіс укладак</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Выберыце спосаб прыняцця</translation> <translation id="8057711352706143257">Праграма "<ph name="SOFTWARE_NAME" />" наладжана няправільна. Праблема звычайна вырашаецца выдаленнем праграмы "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">На жаль, нешта пайшло не так.</translation> +<translation id="8067872629359326442">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium можа дапамагчы. Націсніце "Абараніць уліковы запіс", каб змяніць пароль і апавясціць Google аб пагрозе вашаму ўліковаму запісу.</translation> <translation id="8074253406171541171">10x13 (канверт)</translation> <translation id="8078141288243656252">Нельга дадаваць анатацыі, калі дакумент павернуты</translation> <translation id="8079031581361219619">Перазагрузіць сайт?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Выключыць</translation> <translation id="8118489163946903409">Спосаб аплаты</translation> <translation id="8127301229239896662">Праграма "<ph name="SOFTWARE_NAME" />" не была належным чынам усталявана на камп'ютар або ў сетцы: папрасіце IT-адміністратара вырашыць гэту праблему.</translation> +<translation id="8128526133099929547">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome рэкамендуе неадкладна змяніць пароль на сайце <ph name="WEBSITE_1" /> і на іншых сайтах, дзе гэты пароль выкарыстоўваецца.</translation> <translation id="8131740175452115882">Пацвердзіць</translation> <translation id="8149426793427495338">Камп'ютар перайшоў у рэжым сну.</translation> <translation id="8150722005171944719">Файл па адрасе "<ph name="URL" />" не чытаецца. Магчыма, ён быў выдалены, перамешчаны або не хапае дазволаў на доступ да яго.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Прызначанае месцазнаходжанне:</translation> <translation id="8220146938470311105">C7/C6 (канверт)</translation> <translation id="8220639454292072926">Карпаратыўныя справаздачы</translation> +<translation id="8221250263817408492">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайце <ph name="WEBSITE_1" /> і на іншых сайтах, дзе гэты пароль выкарыстоўваецца.</translation> <translation id="8225771182978767009">Карыстальнік, які наладжваў гэты камп'ютар, вырашыў заблакіраваць гэты сайт.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Адкрыйце старонку ва ўкладцы інкогніта</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index a3a98b1..4c12981 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -605,6 +605,7 @@ <translation id="3828924085048779000">Не може пропускът да не се попълни.</translation> <translation id="3831915413245941253">От <ph name="ENROLLMENT_DOMAIN" /> са инсталирани разширения за допълнителни функции. Разширенията имат достъп до част от данните ви.</translation> <translation id="3832522519263485449">Няколко перфорации отляво</translation> +<translation id="3838154488026099170">Току-що въведохте паролата си в измамнически сайт. Chromium препоръчва да посетите <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> и другите сайтове, за които я използвате, и да промените съответните пароли сега.</translation> <translation id="385051799172605136">Назад</translation> <translation id="3858027520442213535">Актуализиране на датата и часа</translation> <translation id="3884278016824448484">Идентификационният номер на устройството е несъвместим</translation> @@ -642,6 +643,7 @@ <translation id="4072486802667267160">При обработването на поръчката ви възникна грешка. Моля, опитайте отново.</translation> <translation id="4075732493274867456">Клиентът и сървърът не поддържат обща версия или пакет за шифроване за протокола SSL.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Току-що въведохте паролата си в измамнически сайт. Chrome препоръчва да посетите <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> и другите сайтове, за които я използвате, и да промените съответните пароли сега.</translation> <translation id="4079302484614802869">За конфигурацията на прокси сървъра е зададено да използва URL адрес на скрипт във формат .pac, а не фиксирани прокси сървъри.</translation> <translation id="4082393374666368382">Настройки – Управление</translation> <translation id="4098354747657067197">Внимание: измамен сайт</translation> @@ -721,6 +723,7 @@ <translation id="4356973930735388585">Извършители на атака, използващи този сайт, може да опитат да инсталират опасни програми на компютъра ви, които крадат или изтриват информацията ви (например снимки, пароли, съобщения и номера на кредитни карти).</translation> <translation id="4358059973562876591">Прилагането на посочените от вас шаблони не е възможно поради грешка в правилото DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Управление на начините на плащане...</translation> +<translation id="4359160567981085931">Току-що въведохте паролата си в измамнически сайт. Chrome може да помогне. За да промените паролата си и да уведомите Google за това, че профилът ви може да е изложен на риск, кликнете върху „Защита на профила“.</translation> <translation id="4367563149485757821">Number-12 (плик)</translation> <translation id="437058704415269440">Салдо по сметката</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -996,6 +999,7 @@ <translation id="5728056243719941842">C5 (плик)</translation> <translation id="5730040223043577876">Chrome препоръчва да зададете повторно паролата си, ако сте я използвали и на други сайтове.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Запазване на картата в профила ви в Google}other{Запазване на картите в профила ви в Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Използвайте виртуален номер за тази карта}other{Изберете карта}}</translation> <translation id="5763042198335101085">Въведете валиден имейл адрес</translation> <translation id="5763703224595565476">Администраторът ви е активирал Chrome Enterprise User Protect в браузъра ви. Функцията има достъп до някои от данните ви.</translation> <translation id="5765072501007116331">За да видите начините на бърза доставка и изискванията, изберете адрес</translation> @@ -1012,6 +1016,7 @@ <translation id="5804241973901381774">Разрешения</translation> <translation id="5810442152076338065">Връзката ви с/ъс <ph name="DOMAIN" /> е шифрована с остарял криптографски пакет.</translation> <translation id="5813119285467412249">&Възстановяване на добавянето</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Тази карта ще бъде таксувана, когато плащате, но реалният ѝ номер няма да бъде споделен с този сайт. За допълнителна сигурност ще бъде генериран временен код за проверка.}other{Избраната от вас карта ще бъде таксувана, когато плащате, но реалният ѝ номер няма да бъде споделен с този сайт. За допълнителна сигурност ще бъде генериран временен код за проверка.}}</translation> <translation id="583281660410589416">Неизвестно</translation> <translation id="5838278095973806738">Не ви препоръчваме да въвеждате поверителна информация в този сайт (например пароли или номера на кредитни карти), тъй като може да бъде открадната от извършители на атаки.</translation> <translation id="5851548754964597211">Списък с раздели</translation> @@ -1469,6 +1474,7 @@ <translation id="8042918947222776840">Избиране на начин на вземане</translation> <translation id="8057711352706143257">Софтуерът <ph name="SOFTWARE_NAME" /> не е конфигуриран правилно. Обикновено проблемът се отстранява с деинсталиране на <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">За съжаление, нещо се обърка.</translation> +<translation id="8067872629359326442">Току-що въведохте паролата си в измамнически сайт. Chromium може да помогне. За да промените паролата си и да уведомите Google за това, че профилът ви може да е изложен на риск, кликнете върху „Защита на профила“.</translation> <translation id="8074253406171541171">10 x 13 (плик)</translation> <translation id="8078141288243656252">Добавянето на пояснения не е възможно, когато документът е завъртян</translation> <translation id="8079031581361219619">Искате ли да презаредите сайта?</translation> @@ -1485,6 +1491,7 @@ <translation id="8105368624971345109">Изключване</translation> <translation id="8118489163946903409">Начин на плащане</translation> <translation id="8127301229239896662"><ph name="SOFTWARE_NAME" /> не се инсталира правилно на компютъра ви или в мрежата. Помолете системния си администратор да реши този проблем.</translation> +<translation id="8128526133099929547">Току-що въведохте паролата си в измамнически сайт. Chrome препоръчва да посетите <ph name="WEBSITE_1" /> и другите сайтове, за които я използвате, и да промените съответните пароли сега.</translation> <translation id="8131740175452115882">Потвърждаване</translation> <translation id="8149426793427495338">Компютърът ви премина в спящ режим.</translation> <translation id="8150722005171944719">Файлът на адрес <ph name="URL" /> не може да бъде прочетен. Възможно е да е премахнат, преместен или разрешенията му да предотвратяват достъпа.</translation> @@ -1502,6 +1509,7 @@ <translation id="8218327578424803826">Зададено местоположение:</translation> <translation id="8220146938470311105">C7/C6 (плик)</translation> <translation id="8220639454292072926">Корпоративно отчитане</translation> +<translation id="8221250263817408492">Току-що въведохте паролата си в измамнически сайт. Chromium препоръчва да посетите <ph name="WEBSITE_1" /> и другите сайтове, за които я използвате, и да промените съответните пароли сега.</translation> <translation id="8225771182978767009">Човекът, който е настроил компютъра, е блокирал този сайт.</translation> <translation id="822964464349305906"><ph name="TYPE_1" /> и <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Отворете страницата в нов раздел в режим „инкогнито“.</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 8b3ebe01..9df193ef 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Pokrenuti dijagnostiku mreže<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Prevedi ovu stranicu</translation> <translation id="2479410451996844060">Nevažeći URL za pretraživanje.</translation> -<translation id="2482370039860827034">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> <translation id="2482878487686419369">Obavještenja</translation> <translation id="248348093745724435">Pravila uređaja</translation> <translation id="2491120439723279231">Potvrda servera sadrži greške.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Zaštitite račun</translation> <translation id="2515629240566999685">Provjeriti signal u svojoj oblasti</translation> <translation id="2521385132275182522">Spajanje u donjem desnom uglu</translation> -<translation id="2521483867890026383">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> <translation id="2523886232349826891">Sačuvano isključivo na ovom uređaju</translation> <translation id="2524461107774643265">Dodajte više informacija</translation> <translation id="2535659140340599600">{COUNT,plural, =1{i još 1}one{i još #}few{i još #}other{i još #}}</translation> @@ -609,7 +607,7 @@ <translation id="3828924085048779000">Polje za pristupni izraz ne može biti prazno.</translation> <translation id="3831915413245941253">Domena <ph name="ENROLLMENT_DOMAIN" /> je instalirala ekstenzije zbog dodatnih funkcija. Ekstenzije imaju pristup samo nekim vašim podacima.</translation> <translation id="3832522519263485449">Višestruko bušenje na lijevoj strani</translation> -<translation id="3838154488026099170">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> +<translation id="3838154488026099170">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium preporučuje da odete na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> te na druge web lokacije na kojima koristite ovu lozinku i odmah je promijenite.</translation> <translation id="385051799172605136">Nazad</translation> <translation id="3858027520442213535">Ažuriraj datum i vrijeme</translation> <translation id="3884278016824448484">Identifikator uređaja koji je u konfliktu</translation> @@ -647,7 +645,7 @@ <translation id="4072486802667267160">Došlo je do greške prilikom obrade vaše narudžbe. Pokušajte ponovo.</translation> <translation id="4075732493274867456">Klijent i server ne podržavaju verziju zajedničkog SSL protokola ili paket za šifriranje.</translation> <translation id="4075941231477579656">Touch ID</translation> -<translation id="4077092919748553596">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> +<translation id="4077092919748553596">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome preporučuje da odete na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> te na druge web lokacije na kojima ste koristili ovu lozinku i odmah je promijenite.</translation> <translation id="4079302484614802869">Konfiguracija proxy poslužitelja postavljena je za upotrebu URL-a .pac skripte, a ne fiksnih proxy poslužitelja.</translation> <translation id="4082393374666368382">Postavke – Upravljanje</translation> <translation id="4098354747657067197">Pred vama je obmanjujuća web lokacija</translation> @@ -727,7 +725,7 @@ <translation id="4356973930735388585">Napadači ove web lokacije mogu pokušati instalirati opasne programe na vaš računar koji kradu ili brišu informacije (npr., fotografije, lozinke, poruke i podatke s kreditnih kartica).</translation> <translation id="4358059973562876591">Šabloni koje ste naveli ne mogu se primijeniti zbog greške s pravilom DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Upravljajte načinima plaćanja…</translation> -<translation id="4359160567981085931">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome može pomoći. Da biste promijenili zaporku i obavijestili Google da je vaš račun možda ugrožen, kliknite Zaštitite račun.</translation> +<translation id="4359160567981085931">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome vam može pomoći. Da promijenite lozinku i obavijestite Google da vam je račun možda ugrožen, kliknite Zaštiti račun.</translation> <translation id="4367563149485757821">Broj 12 (koverta)</translation> <translation id="437058704415269440">Sredstva na računu</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -1003,7 +1001,7 @@ <translation id="5728056243719941842">C5 (koverta)</translation> <translation id="5730040223043577876">Chrome preporučuje da ponovo postavite lozinku ako ste je koristili više puta na drugim web lokacijama.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Sačuvajte karticu na Google računu}one{Sačuvajte kartice na Google računu}few{Sačuvajte kartice na Google računu}other{Sačuvajte kartice na Google računu}}</translation> -<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Upotrijebite virtualni broj za ovu karticu}one{Odaberite karticu}few{Odaberite karticu}other{Odaberite karticu}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Koristite virtuelni broj za ovu karticu}one{Odaberite karticu}few{Odaberite karticu}other{Odaberite karticu}}</translation> <translation id="5763042198335101085">Upišite važeću adresu e-pošte</translation> <translation id="5763703224595565476">Administrator je na vašem pregledniku omogućio Chrome zaštitu poslovnih korisnika. Chrome zaštita poslovnih korisnika ima pristup nekim vašim podacima.</translation> <translation id="5765072501007116331">Za prikaz načina i uslova isporuke, izaberite adresu</translation> @@ -1020,7 +1018,7 @@ <translation id="5804241973901381774">Odobrenja</translation> <translation id="5810442152076338065">Veza s domenom <ph name="DOMAIN" /> je šifrirana pomoću zastarjelog paketa šifriranja.</translation> <translation id="5813119285467412249">&Ponovi dodavanje</translation> -<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Kad platite, ova će se kartica teretiti, no njezin se stvarni broj neće dijeliti s ovom web-lokacijom. Radi dodatne sigurnosti generirat će se privremeni CVC.}one{Kad platite, teretit će se kartica koju odaberete, no njezin se stvarni broj neće dijeliti s ovom web-lokacijom. Radi dodatne sigurnosti generirat će se privremeni CVC.}few{Kad platite, teretit će se kartica koju odaberete, no njezin se stvarni broj neće dijeliti s ovom web-lokacijom. Radi dodatne sigurnosti generirat će se privremeni CVC.}other{Kad platite, teretit će se kartica koju odaberete, no njezin se stvarni broj neće dijeliti s ovom web-lokacijom. Radi dodatne sigurnosti generirat će se privremeni CVC.}}</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Ova kartica će se teretiti prilikom plaćanja, ali se njen stvarni broj neće dijeliti s ovom web lokacijom. Za dodatnu sigurnost će se generirati privremeni CVC.}one{Kartica koju odaberete će se teretiti prilikom plaćanja, ali se njen stvarni broj neće dijeliti s ovom web lokacijom. Za dodatnu sigurnost će se generirati privremeni CVC.}few{Kartica koju odaberete će se teretiti prilikom plaćanja, ali se njen stvarni broj neće dijeliti s ovom web lokacijom. Za dodatnu sigurnost će se generirati privremeni CVC.}other{Kartica koju odaberete će se teretiti prilikom plaćanja, ali se njen stvarni broj neće dijeliti s ovom web lokacijom. Za dodatnu sigurnost će se generirati privremeni CVC.}}</translation> <translation id="583281660410589416">Nepoznato</translation> <translation id="5838278095973806738">Na ovoj stranici ne trebate unositi nikakve osjetljive informacije (naprimjer, lozinke ili kreditne kartice) jer ih napadači mogu ukrasti.</translation> <translation id="5851548754964597211">Lista kartica</translation> @@ -1478,7 +1476,7 @@ <translation id="8042918947222776840">Odaberite način preuzimanja</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" nije ispravno konfiguriran. Problem se obično riješi deinstalacijom softvera "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Nažalost, nešto nije uredu.</translation> -<translation id="8067872629359326442">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium može pomoći. Da biste promijenili zaporku i obavijestili Google da je vaš račun možda ugrožen, kliknite Zaštitite račun.</translation> +<translation id="8067872629359326442">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium vam može pomoći. Da promijenite lozinku i obavijestite Google da vam je račun možda ugrožen, kliknite Zaštiti račun.</translation> <translation id="8074253406171541171">10x13 (koverta)</translation> <translation id="8078141288243656252">Ne mogu se praviti bilješke kada je dokument rotiran</translation> <translation id="8079031581361219619">Ponovo učitati web lokaciju?</translation> @@ -1495,7 +1493,7 @@ <translation id="8105368624971345109">Isključi</translation> <translation id="8118489163946903409">Način plaćanja</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" nije pravilno instaliran na vaš računar ili mrežu. Zamolite IT administratora da riješi taj problem.</translation> -<translation id="8128526133099929547">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> +<translation id="8128526133099929547">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome preporučuje da odete na <ph name="WEBSITE_1" /> te na druge web lokacije na kojima ste koristili ovu lozinku i odmah je promijenite.</translation> <translation id="8131740175452115882">Potvrdi</translation> <translation id="8149426793427495338">Računar je u stanju mirovanja.</translation> <translation id="8150722005171944719">Fajl na URL-u <ph name="URL" /> nije čitljiv. Možda je uklonjen, premješten ili odobrenja fajla sprečavaju pristup.</translation> @@ -1513,7 +1511,7 @@ <translation id="8218327578424803826">Dodijeljena lokacija:</translation> <translation id="8220146938470311105">C7/C6 (koverta)</translation> <translation id="8220639454292072926">Izvještavanje za preduzeća</translation> -<translation id="8221250263817408492">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> +<translation id="8221250263817408492">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium preporučuje da odete na <ph name="WEBSITE_1" /> te na druge web lokacije na kojima ste koristili ovu lozinku i odmah je promijenite.</translation> <translation id="8225771182978767009">Osoba koja je postavila računalo blokirala je tu web-lokaciju.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Otvorite stranicu u novoj anonimnoj kartici</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 15e3811..69b5e9d2 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -5,7 +5,7 @@ <translation id="1010200102790553230">Carrega la pàgina més tard</translation> <translation id="1015730422737071372">Proporcioneu més informació</translation> <translation id="1021110881106174305">Targetes acceptades</translation> -<translation id="1021753677514347426">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chromium no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chromium vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis aturar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> +<translation id="1021753677514347426">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chromium no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chromium vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis evitar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> <translation id="1032854598605920125">Gira en sentit horari</translation> <translation id="1036348656032585052">Desactiva</translation> <translation id="1038842779957582377">nom desconegut</translation> @@ -592,6 +592,7 @@ <translation id="3828924085048779000">Les frases de contrasenya no poder estar buides.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ha instal·lat extensions per obtenir funcions addicionals. Les extensions tenen accés a algunes de les teves dades.</translation> <translation id="3832522519263485449">Encunyació múltiple a l'esquerra</translation> +<translation id="3838154488026099170">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium et recomana que vagis a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> i a altres llocs web en què utilitzes aquesta contrasenya i que la canviïs ara.</translation> <translation id="385051799172605136">Enrere</translation> <translation id="3858027520442213535">Actualitza la data i l'hora</translation> <translation id="3884278016824448484">L'identificador del dispositiu ja s'està utilitzant</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">S’ha produït un error en processar la comanda. Torna-ho a provar.</translation> <translation id="4075732493274867456">El client i el servidor no admeten cap versió de protocol SSL ni cap sistema de xifratge comuns.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que vagis a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> i a altres llocs web en què utilitzes aquesta contrasenya i que la canviïs ara.</translation> <translation id="4079302484614802869">La configuració del servidor intermediari s'ha definit perquè utilitzi un URL d'script .pac, en lloc de servidors intermedis fixos.</translation> <translation id="4082393374666368382">Configuració - Gestió</translation> <translation id="4098354747657067197">Aquest lloc web és enganyós</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">Els atacants d'aquest lloc poden provar d'instal·lar programes perillosos a l'ordinador per robar o suprimir la teva informació (per exemple, les fotos, les contrasenyes, els missatges i les targetes de crèdit).</translation> <translation id="4358059973562876591">Pot ser que les plantilles que has especificat no s'apliquin a causa d'un error amb la política DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Gestiona les formes de pagament...</translation> +<translation id="4359160567981085931">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome pot ajudar-te. Per canviar la contrasenya i notificar a Google que el compte pot estar en perill, fes clic a Protegeix el compte.</translation> <translation id="4367563149485757821">Number-12 (sobre)</translation> <translation id="437058704415269440">Saldo del compte</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -982,6 +985,7 @@ <translation id="5728056243719941842">C5 (sobre)</translation> <translation id="5730040223043577876">Chrome et recomana que restableixis la contrasenya si l'has fet servir en altres llocs web.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Desa la targeta al Compte de Google}other{Desa targetes al Compte de Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Utilitza un número virtual per a aquesta targeta}other{Selecciona una targeta}}</translation> <translation id="5763042198335101085">Introdueix una adreça electrònica vàlida</translation> <translation id="5763703224595565476">L'administrador ha activat la protecció de l'usuari de Chrome Enterprise al navegador. La protecció de l'usuari de Chrome Enterprise té accés a algunes de les teves dades.</translation> <translation id="5765072501007116331">Per veure els mètodes i els requisits d'entrega, selecciona una adreça</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">Permisos</translation> <translation id="5810442152076338065">La connexió a <ph name="DOMAIN" /> s'ha encriptat amb un sistema de xifratge obsolet.</translation> <translation id="5813119285467412249">&Refés l'addició</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Es farà un càrrec a aquesta targeta quan paguis, però el número real de la targeta no es compartirà amb aquest lloc web. Per a més seguretat, es generarà un CVC temporal.}other{Es farà un càrrec a la targeta que hagis seleccionat quan paguis, però el número real de la targeta no es compartirà amb aquest lloc web. Per a més seguretat, es generarà un CVC temporal.}}</translation> <translation id="583281660410589416">Desconegut</translation> <translation id="5838278095973806738">No introdueixis informació sensible en aquest lloc web (com ara contrasenyes o targetes de crèdit), ja que alguns atacants podrien robar-la.</translation> <translation id="5851548754964597211">Llista de pestanyes</translation> @@ -1063,7 +1068,7 @@ <translation id="6094273045989040137">Anota</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">A <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> trobaràs altres maneres d'explorar l'historial de navegació del teu Compte de Google</translation> -<translation id="6120179357481664955">Recordes l'identificador del teu IUP?</translation> +<translation id="6120179357481664955">Recordes el teu identificador d'UPI?</translation> <translation id="6132597952260690497">Informació sobre les extensions i els connectors instal·lats</translation> <translation id="6146055958333702838">Reviseu els cables i reinicieu els encaminadors, els mòdems o altres dispositius de xarxa que feu servir.</translation> @@ -1302,7 +1307,7 @@ <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Línia d'ordres</translation> <translation id="7372973238305370288">resultat de la cerca</translation> -<translation id="7374733840632556089">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chrome no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chrome vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis aturar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> +<translation id="7374733840632556089">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chrome no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chrome vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis evitar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Controls multimèdia</translation> <translation id="7378627244592794276">No</translation> @@ -1455,6 +1460,7 @@ <translation id="8042918947222776840">Tria un mètode de recollida</translation> <translation id="8057711352706143257"><ph name="SOFTWARE_NAME" /> no s'ha configurat correctament. Normalment el problema se soluciona desinstal·lant <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">S'ha produït un error.</translation> +<translation id="8067872629359326442">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium pot ajudar-te. Per canviar la contrasenya i notificar a Google que el compte pot estar en perill, fes clic a Protegeix el compte.</translation> <translation id="8074253406171541171">10x13 (sobre)</translation> <translation id="8078141288243656252">No es poden fer anotacions en un document girat</translation> <translation id="8079031581361219619">Vols tornar a carregar el lloc web?</translation> @@ -1471,6 +1477,7 @@ <translation id="8105368624971345109">Desactiva</translation> <translation id="8118489163946903409">Mètode de pagament</translation> <translation id="8127301229239896662"><ph name="SOFTWARE_NAME" /> no s'ha instal·lat correctament a l'ordinador o a la xarxa. Demana a l'administrador de TI que resolgui aquest problema.</translation> +<translation id="8128526133099929547">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que vagis a <ph name="WEBSITE_1" /> i a altres llocs web en què utilitzes aquesta contrasenya i que la canviïs ara.</translation> <translation id="8131740175452115882">Confirma</translation> <translation id="8149426793427495338">L'ordinador ha entrat en mode de repòs.</translation> <translation id="8150722005171944719">El fitxer de <ph name="URL" /> no es pot llegir. Pot ser que s'hagi eliminat, que s'hagi traslladat o que els permisos del fitxer n'impedeixin l'accés.</translation> @@ -1488,6 +1495,7 @@ <translation id="8218327578424803826">Ubicació assignada:</translation> <translation id="8220146938470311105">C7/C6 (sobre)</translation> <translation id="8220639454292072926">Informes d'empresa</translation> +<translation id="8221250263817408492">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium et recomana que vagis a <ph name="WEBSITE_1" /> i a altres llocs web en què utilitzes aquesta contrasenya i que la canviïs ara.</translation> <translation id="8225771182978767009">La persona que ha configurat l'ordinador ha bloquejat aquest lloc.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Obre la pàgina en una pestanya d'incògnit nova</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index c3c1bca5..c477f3a 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -588,6 +588,7 @@ <translation id="3828924085048779000">Prázdná heslová fráze není povolena.</translation> <translation id="3831915413245941253">Z domény <ph name="ENROLLMENT_DOMAIN" />do tohoto zařízení byla nainstalována rozšíření pro dodatečné funkce. Rozšíření mají přístup k některým vašim datům.</translation> <translation id="3832522519263485449">Několik děr vlevo</translation> +<translation id="3838154488026099170">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje navštívit weby <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a další weby, kde toto heslo používáte, a okamžitě jej změnit.</translation> <translation id="385051799172605136">Zpět</translation> <translation id="3858027520442213535">Aktualizovat datum a čas</translation> <translation id="3884278016824448484">Konfliktní identifikátor zařízení</translation> @@ -625,6 +626,7 @@ <translation id="4072486802667267160">Při zpracování objednávky došlo k chybě. Zkuste to prosím znovu.</translation> <translation id="4075732493274867456">Klient a server nepodporují společnou verzi protokolu SSL nebo šifrovací sadu.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Právě jste své heslo zadali na klamavém webu. Chrome doporučuje navštívit weby <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a další weby, kde toto heslo používáte, a okamžitě jej změnit.</translation> <translation id="4079302484614802869">Proxy je nastaveno na používání adresy URL skriptu PAC, nikoliv pevně daných serverů proxy.</translation> <translation id="4082393374666368382">Nastavení – správa</translation> <translation id="4098354747657067197">Chystáte se navštívit podvodné webové stránky</translation> @@ -704,6 +706,7 @@ <translation id="4356973930735388585">Útočníci, kteří se aktuálně nacházejí na tomto webu, se mohou pokusit nainstalovat vám do počítače nebezpečné programy, které mohou ukrást nebo smazat vaše informace (například fotky, hesla, zprávy nebo platební karty).</translation> <translation id="4358059973562876591">Zadané šablony kvůli chybě v zásadě DnsOverHttpsMode nelze použít.</translation> <translation id="4358461427845829800">Spravovat platební metody...</translation> +<translation id="4359160567981085931">Právě jste své heslo zadali na klamavém webu. Chrome vám může pomoci. Chcete-li změnit heslo a oznámit Googlu, že váš účet může být ohrožen, klikněte na Ochránit účet.</translation> <translation id="4367563149485757821">Number-12 (obálka)</translation> <translation id="437058704415269440">Zůstatek na účtu</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -735,7 +738,7 @@ <translation id="4515275063822566619">Karty a adresy pocházejí z Chromu a z vašeho účtu Google (<ph name="ACCOUNT_EMAIL" />). Můžete je spravovat v <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (obálka)</translation> <translation id="4522570452068850558">Podrobnosti</translation> -<translation id="4524138615196389145">Od teď karty potvrzujte rychleji pomocí technologie WebAuthn</translation> +<translation id="4524138615196389145">Od teď karty potvrzujte rychleji díky využití standardu WebAuthn</translation> <translation id="4524805452350978254">Spravovat karty</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -978,6 +981,7 @@ <translation id="5728056243719941842">C5 (obálka)</translation> <translation id="5730040223043577876">Pokud jste heslo použili na jiném webu, doporučujeme vám ho resetovat.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Uložit kartu do účtu Google}few{Uložit karty do účtu Google}many{Uložit karty do účtu Google}other{Uložit karty do účtu Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Použijte pro tuto kartu virtuální číslo}few{Vyberte kartu}many{Vyberte kartu}other{Vyberte kartu}}</translation> <translation id="5763042198335101085">Zadejte platnou e-mailovou adresu</translation> <translation id="5763703224595565476">Administrátor ve vašem prohlížeči zapnul ochranu uživatelů Chrome Enterprise. Ochrana uživatelů Chrome Enterprise má přístup k některým vašim datům.</translation> <translation id="5765072501007116331">Chcete-li zobrazit způsoby doručení a požadavky, vyberte adresu</translation> @@ -994,6 +998,7 @@ <translation id="5804241973901381774">Oprávnění</translation> <translation id="5810442152076338065">Vaše připojení k doméně <ph name="DOMAIN" /> je šifrováno za použití zastaralé šifrovací sady.</translation> <translation id="5813119285467412249">&Opakovat přidání</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Při placení budou z této karty strženy peníze, ale její skutečné číslo nebude s tímto webem sdíleno. Kvůli většímu zabezpečení bude vygenerován dočasný kód CVC.}few{Při placení budou z vybrané karty strženy peníze, ale její skutečné číslo nebude s tímto webem sdíleno. Kvůli většímu zabezpečení bude vygenerován dočasný kód CVC.}many{Při placení budou z vybrané karty strženy peníze, ale její skutečné číslo nebude s tímto webem sdíleno. Kvůli většímu zabezpečení bude vygenerován dočasný kód CVC.}other{Při placení budou z vybrané karty strženy peníze, ale její skutečné číslo nebude s tímto webem sdíleno. Kvůli většímu zabezpečení bude vygenerován dočasný kód CVC.}}</translation> <translation id="583281660410589416">Neznámé</translation> <translation id="5838278095973806738">Na tento web byste neměli zadávat citlivé údaje (například hesla nebo čísla platebních karet), protože by je mohli odcizit útočníci.</translation> <translation id="5851548754964597211">Seznam karet</translation> @@ -1325,7 +1330,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /> o tomto problému.</translation> <translation id="7455133967321480974">Použít výchozí globální hodnotu (Blokovat)</translation> <translation id="7460618730930299168">Přehrává se jiný obsah, než jste vybrali. Pokračovat?</translation> -<translation id="7464821087936825778">Existující režim vyhledávání</translation> +<translation id="7464821087936825778">Ukončování režimu vyhledávání</translation> <translation id="7473891865547856676">Ne, děkuji</translation> <translation id="7481312909269577407">Vpřed</translation> <translation id="7485870689360869515">Nebyla nalezena žádná data.</translation> @@ -1449,6 +1454,7 @@ <translation id="8042918947222776840">Vybrat způsob vyzvednutí</translation> <translation id="8057711352706143257">Software <ph name="SOFTWARE_NAME" /> není nakonfigurován správně. Tento problém lze obvykle vyřešit odinstalováním softwaru <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Lituji, něco se pokazilo.</translation> +<translation id="8067872629359326442">Právě jste své heslo zadali na klamavém webu. Chromium vám může pomoci. Chcete-li změnit heslo a oznámit Googlu, že váš účet může být ohrožen, klikněte na Ochránit účet.</translation> <translation id="8074253406171541171">10x13 (obálka)</translation> <translation id="8078141288243656252">Když je dokument otočený, nelze do něj přidávat značky a poznámky</translation> <translation id="8079031581361219619">Načíst web znovu?</translation> @@ -1465,6 +1471,7 @@ <translation id="8105368624971345109">Vypnout</translation> <translation id="8118489163946903409">Platební metoda</translation> <translation id="8127301229239896662">Software <ph name="SOFTWARE_NAME" /> na počítači nebo v síti nebyl nainstalován správně. Požádejte administrátora IT o vyřešení tohoto problému.</translation> +<translation id="8128526133099929547">Právě jste své heslo zadali na klamavém webu. Chrome doporučuje navštívit web <ph name="WEBSITE_1" /> a další weby, kde toto heslo používáte, a okamžitě jej změnit.</translation> <translation id="8131740175452115882">Potvrdit</translation> <translation id="8149426793427495338">Počítač přešel do režimu spánku.</translation> <translation id="8150722005171944719">Soubor na adrese <ph name="URL" /> nelze načíst. Možná byl odstraněn, přesunut nebo mohou přístupu bránit oprávnění souboru.</translation> @@ -1482,6 +1489,7 @@ <translation id="8218327578424803826">Přiřazené místo:</translation> <translation id="8220146938470311105">C7/C6 (obálka)</translation> <translation id="8220639454292072926">Přehledy pro podniky</translation> +<translation id="8221250263817408492">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje navštívit web <ph name="WEBSITE_1" /> a další weby, kde toto heslo používáte, a okamžitě jej změnit.</translation> <translation id="8225771182978767009">Uživatel, který tento počítač nastavoval, se rozhodl tento web blokovat.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Otevřete stránku na nové anonymní kartě</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index a551b8f..a261b807 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -607,6 +607,7 @@ <translation id="3828924085048779000">Tomme adgangssætninger er ikke tilladt.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> har installeret udvidelser til yderligere funktioner. Udvidelser har adgang til nogle af dine data.</translation> <translation id="3832522519263485449">Flere huller i venstre side</translation> +<translation id="3838154488026099170">Du har lige angivet din adgangskode på et vildledende website. Chromium anbefaler, at du straks går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> samt eventuelle andre websites, hvor du har brugt denne adgangskode, og ændrer adgangskoden.</translation> <translation id="385051799172605136">Tilbage</translation> <translation id="3858027520442213535">Opdater dato og tid</translation> <translation id="3884278016824448484">Modstridende enheds-id</translation> @@ -644,6 +645,7 @@ <translation id="4072486802667267160">Der opstod en fejl under behandlingen af din ordre. Prøv igen.</translation> <translation id="4075732493274867456">Klienten og serveren understøtter ikke en fælles SSL-protokolversion eller et fælles krypteringsprogram.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Du har lige angivet din adgangskode på et vildledende website. Chrome anbefaler, at du straks går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> samt eventuelle andre websites, hvor du har brugt denne adgangskode, og ændrer adgangskoden.</translation> <translation id="4079302484614802869">Proxykonfiguration er angivet til at anvende en webadresse for .pac-script, ikke faste proxyservere.</translation> <translation id="4082393374666368382">Indstillinger – administration</translation> <translation id="4098354747657067197">Vildledende website forude</translation> @@ -723,6 +725,7 @@ <translation id="4356973930735388585">Hackere på dette website vil muligvis forsøge at installere skadelige programmer på din computer, som stjæler eller sletter dine oplysninger (f.eks. billeder, adgangskoder, beskeder og kreditkortoplysninger).</translation> <translation id="4358059973562876591">De skabeloner, du har angivet, anvendes muligvis ikke på grund af en fejl med politikken DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Administrer betalingsmetoder...</translation> +<translation id="4359160567981085931">Du har lige angivet din adgangskode på et vildledende website. Chrome kan hjælpe. Klik på Beskyt konto for at ændre din adgangskode og underrette Google om, at din konto muligvis er kompromitteret.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Kontosaldo</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -998,6 +1001,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Chrome anbefaler, at du nulstiller din adgangskode, hvis du har brugt den på andre websites.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Gem kortet på din Google-konto}one{Gem kortet på din Google-konto}other{Gem kortene på din Google-konto}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Brug et virtuelt nummer for dette kort}one{Vælg et kort}other{Vælg kort}}</translation> <translation id="5763042198335101085">Angiv en gyldig mailadresse</translation> <translation id="5763703224595565476">Din administrator har aktiveret Chrome Enterprise User Protect i din browser. Chrome Enterprise User Protect har adgang til nogle af dine data.</translation> <translation id="5765072501007116331">Vælg en adresse for at se leveringsmetoder og -krav</translation> @@ -1014,6 +1018,7 @@ <translation id="5804241973901381774">Tilladelser</translation> <translation id="5810442152076338065">Din forbindelse til <ph name="DOMAIN" /> er krypteret ved hjælp af en forældet krypteringspakke.</translation> <translation id="5813119285467412249">&Annuller fortryd tilføjelse</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Dette kort debiteres, når du betaler, men kortets faktiske nummer deles ikke med dette website. Som ekstra beskyttelse genereres der en midlertidig kontrolkode.}one{Det kort, du vælger, debiteres, når du betaler, men kortets faktiske nummer deles ikke med dette website. Som ekstra beskyttelse genereres der en midlertidig kontrolkode.}other{De kort, du vælger, debiteres, når du betaler, men kortenes faktiske numre deles ikke med dette website. Som ekstra beskyttelse genereres der en midlertidig kontrolkode.}}</translation> <translation id="583281660410589416">Ukendt</translation> <translation id="5838278095973806738">Du bør ikke indtaste følsomme oplysninger på dette website (f.eks. adgangskoder eller kreditkortoplysninger), da de kan blive stjålet af hackere.</translation> <translation id="5851548754964597211">Faneliste</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Vælg afhentningsmetode</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" er ikke konfigureret korrekt. Problemet kan normalt løses ved at afinstallere "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Der opstod en fejl.</translation> +<translation id="8067872629359326442">Du har lige angivet din adgangskode på et vildledende website. Chromium kan hjælpe. Klik på Beskyt konto for at ændre din adgangskode og underrette Google om, at din konto muligvis er kompromitteret.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">Der kan ikke annoteres ved rotering</translation> <translation id="8079031581361219619">Vil du genindlæse websitet?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Deaktiver</translation> <translation id="8118489163946903409">Betalingsmetode</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" blev ikke korrekt installeret på computeren eller netværket. Bed din IT-administrator om at løse problemet.</translation> +<translation id="8128526133099929547">Du har lige angivet din adgangskode på et vildledende website. Chrome anbefaler, at du straks går til <ph name="WEBSITE_1" /> og eventuelle andre websites, hvor du har brugt denne adgangskode, og ændrer adgangskoden.</translation> <translation id="8131740175452115882">Bekræft</translation> <translation id="8149426793427495338">Din computer gik i dvale.</translation> <translation id="8150722005171944719">Filen i <ph name="URL" /> kan ikke læses. Den kan være blevet fjernet, flyttet, eller også forhindrer filtilladelser muligvis adgangen.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Tildelt placering:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">Rapportering til arbejdsbrug</translation> +<translation id="8221250263817408492">Du har lige angivet din adgangskode på et vildledende website. Chromium anbefaler, at du straks går til <ph name="WEBSITE_1" /> og eventuelle andre websites, hvor du har brugt denne adgangskode, og ændrer adgangskoden.</translation> <translation id="8225771182978767009">Den person, der har konfigureret denne computer, har valgt at blokere dette website.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Åbn siden på en ny inkognitofane</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 771f5a0..6fd28a2 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -596,6 +596,7 @@ <translation id="3828924085048779000">Eine leere Passphrase ist nicht zulässig.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> hat Erweiterungen für zusätzliche Funktionen installiert. Diese Erweiterungen können auf einige Ihrer Daten zugreifen.</translation> <translation id="3832522519263485449">Mehrfache Lochung links</translation> +<translation id="3838154488026099170">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chromium empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> und allen anderen Websites, auf denen Sie es verwendet haben, zu ändern.</translation> <translation id="385051799172605136">Zurück</translation> <translation id="3858027520442213535">Datum und Uhrzeit aktualisieren</translation> <translation id="3884278016824448484">In Konflikt stehende Gerätekennung</translation> @@ -633,6 +634,7 @@ <translation id="4072486802667267160">Bei der Verarbeitung Ihrer Bestellung ist ein Fehler aufgetreten. Bitte versuchen Sie es noch einmal.</translation> <translation id="4075732493274867456">Client und Server unterstützen keine gemeinsame SSL-Protokollversion oder Verschlüsselungssammlung.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chrome empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> und allen anderen Websites, auf denen Sie es verwendet haben, zu ändern.</translation> <translation id="4079302484614802869">Die Proxy-Konfiguration ist auf die Verwendung einer PAC-Skript-URL und nicht die von festen Proxyservern eingestellt.</translation> <translation id="4082393374666368382">Einstellungen – Verwaltung</translation> <translation id="4098354747657067197">Bei der aufgerufenen Website besteht Phishing-Verdacht!</translation> @@ -712,6 +714,7 @@ <translation id="4356973930735388585">Unbefugte Dritte auf dieser Website versuchen unter Umständen, gefährliche Programme auf Ihrem Computer zu installieren, um Ihre Daten zu stehlen oder zu löschen, zum Beispiel Fotos, Passwörter, Nachrichten und Kreditkartendaten.</translation> <translation id="4358059973562876591">Die von Ihnen angegebenen Vorlagen können wegen eines Fehlers bei der Richtlinie "DnsOverHttpsMode" nicht angewendet werden.</translation> <translation id="4358461427845829800">Zahlungsmethoden verwalten…</translation> +<translation id="4359160567981085931">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chrome kann Ihnen helfen. Wenn Sie Ihr Passwort ändern und Google darüber informieren möchten, dass Ihr Konto gefährdet sein könnte, klicken Sie auf "Konto schützen".</translation> <translation id="4367563149485757821">Number-12 (Umschlag)</translation> <translation id="437058704415269440">Guthaben</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -987,6 +990,7 @@ <translation id="5728056243719941842">C5 (Umschlag)</translation> <translation id="5730040223043577876">Chrome empfiehlt, Ihr Passwort zurückzusetzen, wenn Sie es auf anderen Websites verwendet haben.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Karte in Ihrem Google-Konto speichern}other{Karten in Ihrem Google-Konto speichern}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Für diese Karte eine virtuelle Nummer verwenden}other{Karte auswählen}}</translation> <translation id="5763042198335101085">Geben Sie eine gültige E-Mail-Adresse ein</translation> <translation id="5763703224595565476">Ihr Administrator hat Chrome Enterprise User Protect für Ihren Browser aktiviert. Chrome Enterprise User Protect kann auf manche Ihrer Daten zugreifen.</translation> <translation id="5765072501007116331">Wählen Sie eine Adresse aus, um Lieferoptionen und -anforderungen zu sehen</translation> @@ -1003,6 +1007,7 @@ <translation id="5804241973901381774">Berechtigungen</translation> <translation id="5810442152076338065">Ihre Verbindung zu <ph name="DOMAIN" /> ist mit einer veralteten Codier-Suite verschlüsselt.</translation> <translation id="5813119285467412249">&Hinzufügen wiederholen</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Diese Karte wird beim Bezahlen zwar belastet, doch die echte Kreditkartennummer wird nicht an diese Website weitergegeben. Für zusätzliche Sicherheit wird ein temporärer CVC generiert.}other{Die ausgewählte Karte wird beim Bezahlen zwar belastet, doch die echte Kreditkartennummer wird nicht an diese Website weitergegeben. Für zusätzliche Sicherheit wird ein temporärer CVC generiert.}}</translation> <translation id="583281660410589416">Unbekannt</translation> <translation id="5838278095973806738">Sie sollten keine vertraulichen Informationen wie Passwörter oder Kreditkartennummern auf dieser Website eingeben, da sie von Angreifern gestohlen werden könnten.</translation> <translation id="5851548754964597211">Tab-Liste</translation> @@ -1460,6 +1465,7 @@ <translation id="8042918947222776840">Abholoption auswählen</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" ist nicht ordnungsgemäß konfiguriert. Durch die Deinstallation von "<ph name="SOFTWARE_NAME" />" sollte das Problem behoben werden. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Ein Fehler ist aufgetreten.</translation> +<translation id="8067872629359326442">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chromium kann Ihnen helfen. Wenn Sie Ihr Passwort ändern und Google darüber informieren möchten, dass Ihr Konto gefährdet sein könnte, klicken Sie auf "Konto schützen".</translation> <translation id="8074253406171541171">10x13 (Umschlag)</translation> <translation id="8078141288243656252">Anmerkungen bei gedrehtem Dokument nicht möglich</translation> <translation id="8079031581361219619">Website neu laden?</translation> @@ -1476,6 +1482,7 @@ <translation id="8105368624971345109">Deaktivieren</translation> <translation id="8118489163946903409">Zahlungsmethode</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" war nicht ordnungsgemäß auf Ihrem Computer oder im Netzwerk installiert. Bitten Sie Ihren IT-Administrator, das Problem zu lösen.</translation> +<translation id="8128526133099929547">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chrome empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" /> und allen anderen Websites, auf denen Sie es verwendet haben, zu ändern.</translation> <translation id="8131740175452115882">Bestätigen</translation> <translation id="8149426793427495338">Ihr Computer ist im Ruhemodus.</translation> <translation id="8150722005171944719">Die Datei unter <ph name="URL" /> kann nicht gelesen werden. Sie wurde möglicherweise entfernt oder verschoben oder die Dateiberechtigungen verhindern den Zugriff.</translation> @@ -1493,6 +1500,7 @@ <translation id="8218327578424803826">Zugewiesener Standort: </translation> <translation id="8220146938470311105">C7/C6 (Umschlag)</translation> <translation id="8220639454292072926">Unternehmensberichte</translation> +<translation id="8221250263817408492">Sie haben Ihr Passwort gerade auf einer verdächtigen Website eingegeben. Chromium empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" /> und allen anderen Websites, auf denen Sie es verwendet haben, zu ändern.</translation> <translation id="8225771182978767009">Die Person, die diesen Computer eingerichtet hat, hat diese Website gesperrt.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Seite in einem neuen Inkognito-Tab öffnen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 4710dea..3da2f5a 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Να εκτελέσετε τον Διαγνωστικό έλεγχο δικτύου<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Μετάφραση αυτής της σελίδας</translation> <translation id="2479410451996844060">Μη έγκυρη διεύθυνση URL αναζήτησης.</translation> -<translation id="2482370039860827034">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chrome συνιστά να μεταβείτε στους ιστοτόπους <ph name="WEBSITE_1" /> και <ph name="WEBSITE_2" /> και σε άλλους ιστοτόπους όπου μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό πρόσβασης και να τον αλλάξετε τώρα.</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> <translation id="248348093745724435">Πολιτικές συσκευής</translation> <translation id="2491120439723279231">Το πιστοποιητικό του διακομιστή περιέχει σφάλματα.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Προστασία λογαριασμού</translation> <translation id="2515629240566999685">Ελέγξτε το σήμα στην περιοχή σας.</translation> <translation id="2521385132275182522">Συρραφή κάτω δεξιά</translation> -<translation id="2521483867890026383">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chromium συνιστά να μεταβείτε στους ιστοτόπους <ph name="WEBSITE_1" /> και <ph name="WEBSITE_2" /> και σε άλλους ιστοτόπους όπου μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό πρόσβασης και να τον αλλάξετε τώρα.</translation> <translation id="2523886232349826891">Αποθηκεύτηκε μόνο σε αυτήν τη συσκευή</translation> <translation id="2524461107774643265">Προσθήκη περισσότερων πληροφοριών</translation> <translation id="2535659140340599600">{COUNT,plural, =1{και 1 ακόμα}other{και # ακόμα}}</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 4e7edca..304cdb94 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Running Network Diagnostics<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Translate this page</translation> <translation id="2479410451996844060">Invalid search URL.</translation> -<translation id="2482370039860827034">You just entered your password on a deceptive site. Chrome recommends going to <ph name="WEBSITE_1" /> and <ph name="WEBSITE_2" />, and other sites where you use this password, and changing it now.</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="248348093745724435">Machine policies</translation> <translation id="2491120439723279231">Server's certificate contains errors.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Protect Account</translation> <translation id="2515629240566999685">Checking the signal in your area</translation> <translation id="2521385132275182522">Staple bottom right</translation> -<translation id="2521483867890026383">You just entered your password on a deceptive site. Chromium recommends going to <ph name="WEBSITE_1" /> and <ph name="WEBSITE_2" />, and other sites where you use this password, and changing it now.</translation> <translation id="2523886232349826891">Saved on this device only</translation> <translation id="2524461107774643265">Add More Information</translation> <translation id="2535659140340599600">{COUNT,plural, =1{and 1 more}other{and # more}}</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index ca4e0b24..4bb2a87 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">No se permite una frase de contraseña vacía.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> instaló extensiones para funciones adicionales. Las extensiones tienen acceso a algunos de tus datos.</translation> <translation id="3832522519263485449">Perforaciones múltiples a la izquierda</translation> +<translation id="3838154488026099170">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda que la cambies ahora en <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> y otros sitios donde la uses.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3858027520442213535">Actualizar fecha y hora</translation> <translation id="3884278016824448484">Hay un identificador de dispositivo en conflicto.</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Se produjo un error al procesar tu pedido. Vuelve a intentarlo.</translation> <translation id="4075732493274867456">El cliente y el servidor no admiten un conjunto de cifrado o una versión de protocolo SSL en común.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Ingresaste tu contraseña en un sitio engañoso. Chrome te recomienda que la cambies ahora en <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> y otros sitios donde la uses.</translation> <translation id="4079302484614802869">El proxy está configurado para usar una URL de script .pac, no servidores proxy fijos.</translation> <translation id="4082393374666368382">Configuración - Administración</translation> <translation id="4098354747657067197">Sitio engañoso</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Es posible que los atacantes que se encuentren en este sitio intenten instalar programas peligrosos en tu computadora con el fin de robarte información o borrarla (p. ej., fotos, contraseñas, mensajes y tarjetas de crédito).</translation> <translation id="4358059973562876591">Debido a un error relacionado con la política DnsOverHttpsMode, es posible que no se apliquen las plantillas que especificaste.</translation> <translation id="4358461427845829800">Administrar formas de pago…</translation> +<translation id="4359160567981085931">Ingresaste tu contraseña en un sitio engañoso. Chrome puede ayudarte. Para cambiar la contraseña y notificar a Google que tu cuenta podría estar en riesgo, haz clic en Proteger cuenta.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Saldo de cuenta</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Chrome te recomienda que restablezcas tu contraseña si la volviste a usar en otros sitios.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Guarda la tarjeta en tu Cuenta de Google}other{Guarda las tarjetas en tu Cuenta de Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Usa un número virtual para esta tarjeta}other{Selecciona una tarjeta}}</translation> <translation id="5763042198335101085">Escribe una dirección de correo electrónico válida</translation> <translation id="5763703224595565476">El administrador habilitó la Protección para usuarios de Chrome Enterprise en el navegador. La Protección para usuarios de Chrome Enterprise tiene acceso a algunos de tus datos.</translation> <translation id="5765072501007116331">Para ver los requisitos y métodos de entrega, selecciona una dirección</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Permisos</translation> <translation id="5810442152076338065">Tu conexión a <ph name="DOMAIN" /> está encriptada con un conjunto de cifrado obsoleto.</translation> <translation id="5813119285467412249">&Rehacer Agregar</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Cuando realices un pago, se cargará esta tarjeta, pero el sitio no tendrá acceso a su número real. Para reforzar la seguridad, se generará un CVC temporal.}other{Cuando realices un pago, se cargará la tarjeta que selecciones, pero el sitio no tendrá acceso a su número real. Para reforzar la seguridad, se generará un CVC temporal.}}</translation> <translation id="583281660410589416">Desconocido</translation> <translation id="5838278095973806738">No debes ingresar información confidencial en este sitio (p. ej., contraseñas o tarjetas de crédito), ya que los atacantes podrían robarla.</translation> <translation id="5851548754964597211">Lista de pestañas</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">Elegir método de retiro</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" no se configuró correctamente. Prueba desinstalar "<ph name="SOFTWARE_NAME" />" para corregir el problema. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Se produjo un error.</translation> +<translation id="8067872629359326442">Ingresaste tu contraseña en un sitio engañoso. Chromium puede ayudarte. Para cambiar la contraseña y notificar a Google que tu cuenta podría estar en riesgo, haz clic en Proteger cuenta.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">No se pueden realizar anotaciones cuando el documento está rotado</translation> <translation id="8079031581361219619">¿Deseas volver a cargar el sitio?</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">Desactivar</translation> <translation id="8118489163946903409">Forma de pago</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" no se instaló correctamente en tu computadora o red. Solicita al administrador de IT que corrija este problema.</translation> +<translation id="8128526133099929547">Ingresaste tu contraseña en un sitio engañoso. Chrome te recomienda que la cambies ahora en <ph name="WEBSITE_1" /> y otros sitios donde la uses.</translation> <translation id="8131740175452115882">Confirmar</translation> <translation id="8149426793427495338">La computadora se suspendió.</translation> <translation id="8150722005171944719">El archivo de <ph name="URL" /> no se puede leer. Es posible que se haya eliminado o movido o que se impida el acceso a los permisos del archivo.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">Ubicación asignada:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">Informes empresariales</translation> +<translation id="8221250263817408492">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda que la cambies ahora en <ph name="WEBSITE_1" /> y otros sitios donde la uses.</translation> <translation id="8225771182978767009">La persona que configuró esta computadora decidió bloquear este sitio.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Abre la página en una nueva pestaña de incógnito.</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 0458cea..d2dc8a3 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -607,6 +607,7 @@ <translation id="3828924085048779000">La frase de contraseña no puede estar vacía.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ha instalado extensiones que aportan funciones adicionales. Las extensiones tienen acceso a algunos de tus datos.</translation> <translation id="3832522519263485449">Perforado múltiple en la parte izquierda</translation> +<translation id="3838154488026099170">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium te recomienda que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> y a otros sitios web en los que uses esta contraseña y que la cambies ahora.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3858027520442213535">Actualizar fecha y hora</translation> <translation id="3884278016824448484">Identificador de dispositivo en conflicto</translation> @@ -644,6 +645,7 @@ <translation id="4072486802667267160">Se ha producido un error al procesar el pedido. Vuelve a intentarlo.</translation> <translation id="4075732493274867456">El cliente y el servidor no son compatibles con la misma versión de protocolo SSL o de cifrado.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome te recomienda que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> y a otros sitios web en los que uses esta contraseña y que la cambies ahora.</translation> <translation id="4079302484614802869">Se ha configurado el proxy para que use una URL de secuencia de comandos .pac, en lugar de servidores proxy fijos.</translation> <translation id="4082393374666368382">Configuración - Administración</translation> <translation id="4098354747657067197">El sitio web al que vas a acceder es engañoso</translation> @@ -723,6 +725,7 @@ <translation id="4356973930735388585">Es posible que los atacantes que se encuentren en este sitio web intenten instalar programas peligrosos en tu ordenador para robar o eliminar tu información (por ejemplo, fotos, contraseñas, mensajes y tarjetas de crédito).</translation> <translation id="4358059973562876591">Es posible que las plantillas que has especificado no se apliquen debido a un error con la política DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Gestiona tus métodos de pago...</translation> +<translation id="4359160567981085931">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome puede ayudarte. Para cambiar tu contraseña y notificar a Google de que tu cuenta podría estar en peligro, haz clic en Proteger cuenta.</translation> <translation id="4367563149485757821">Number-12 (sobre)</translation> <translation id="437058704415269440">Saldo de cuenta</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -998,6 +1001,7 @@ <translation id="5728056243719941842">C5 (sobre)</translation> <translation id="5730040223043577876">Chrome te recomienda que cambies tu contraseña si la has vuelto a utilizar en otros sitios web.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Guarda la tarjeta en tu cuenta de Google}other{Guarda las tarjetas en tu cuenta de Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Usar un número virtual para esta tarjeta}other{Seleccionar tarjetas}}</translation> <translation id="5763042198335101085">Introduce una dirección de correo electrónico válida</translation> <translation id="5763703224595565476">El administrador ha habilitado Chrome Enterprise User Protect en tu navegador. Chrome Enterprise User Protect puede acceder a algunos de tus datos.</translation> <translation id="5765072501007116331">Selecciona una dirección para ver los métodos de entrega y los requisitos</translation> @@ -1014,6 +1018,7 @@ <translation id="5804241973901381774">Permisos</translation> <translation id="5810442152076338065">Tu conexión con <ph name="DOMAIN" /> está cifrada con un conjunto de cifrado obsoleto.</translation> <translation id="5813119285467412249">&Rehacer acción de añadir</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Cuando pagues, se aplicarán cargos en esta tarjeta, pero el número real no se compartirá con este sitio web. Para una mayor seguridad, se generará un CVC temporal.}other{Cuando pagues, se aplicarán cargos en la tarjeta que selecciones, pero el número real no se compartirá con este sitio web. Para una mayor seguridad, se generará un CVC temporal.}}</translation> <translation id="583281660410589416">Desconocido</translation> <translation id="5838278095973806738">No deberías introducir información confidencial en este sitio web (por ejemplo, contraseñas o tarjetas de crédito) porque los atacantes podrían robarla.</translation> <translation id="5851548754964597211">Lista de pestañas</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Seleccionar método de recogida</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" no se ha configurado correctamente. Normalmente, el problema se soluciona al desinstalar "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Se ha producido un error.</translation> +<translation id="8067872629359326442">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium puede ayudarte. Para cambiar tu contraseña y notificar a Google de que tu cuenta podría estar en peligro, haz clic en Proteger cuenta.</translation> <translation id="8074253406171541171">10x13 (sobre)</translation> <translation id="8078141288243656252">No se pueden añadir anotaciones a los documentos girados</translation> <translation id="8079031581361219619">¿Quieres volver a cargar el sitio web?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Desactivar</translation> <translation id="8118489163946903409">Método de pago</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" no se ha instalado correctamente en tu ordenador o red. Ponte en contacto con el administrador de TI para resolver el problema.</translation> +<translation id="8128526133099929547">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome te recomienda que accedas a <ph name="WEBSITE_1" /> y a otros sitios web en los que uses esta contraseña y que la cambies ahora.</translation> <translation id="8131740175452115882">Confirmar</translation> <translation id="8149426793427495338">El ordenador se ha suspendido.</translation> <translation id="8150722005171944719">El archivo que se encuentra en <ph name="URL" /> no se puede leer. Puede que se haya eliminado o movido o que los permisos del archivo impidan acceder a él.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Ubicación asignada:</translation> <translation id="8220146938470311105">C7/C6 (sobre)</translation> <translation id="8220639454292072926">Informes de empresa</translation> +<translation id="8221250263817408492">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium te recomienda que accedas a <ph name="WEBSITE_1" /> y a otros sitios web en los que uses esta contraseña y la cambies ahora.</translation> <translation id="8225771182978767009">La persona que ha configurado este ordenador ha elegido bloquear este sitio web.</translation> <translation id="822964464349305906"><ph name="TYPE_1" /> o <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Abre una página en una nueva pestaña de incógnito</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 9d3f107..ea5e6249 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -607,6 +607,7 @@ <translation id="3828924085048779000">Tühi parool ei ole lubatud.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> on installinud laiendused, et pakkuda lisafunktsioone. Laiendustel on juurdepääs teie mõningatele andmetele.</translation> <translation id="3832522519263485449">Mitu auku vasakul</translation> +<translation id="3838154488026099170">Sisestasite äsja oma parooli petturlikule saidile. Chromium soovitab teil minna veebisaitidele <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ja muudele saitidele, kus seda parooli kasutate, ning kohe oma parooli muuta.</translation> <translation id="385051799172605136">Tagasi</translation> <translation id="3858027520442213535">Värskenda kuupäeva ja kellaaega</translation> <translation id="3884278016824448484">Seadme identifikaator on konfliktne</translation> @@ -644,6 +645,7 @@ <translation id="4072486802667267160">Teie tellimuse töötlemisel ilmnes viga. Proovige uuesti.</translation> <translation id="4075732493274867456">Klient ja server ei toeta tavapärast SSL-protokolli versiooni ega šifreerimiskomplekti.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Sisestasite äsja oma parooli petturlikule saidile. Chrome soovitab teil minna veebisaitidele <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ja muudele saitidele, kus seda parooli kasutate, ning kohe oma parooli muuta.</translation> <translation id="4079302484614802869">Puhverserveri konfigureerimine on määratud kasutama pac-skripti URL-i, mitte fikseeritud puhverservereid.</translation> <translation id="4082393374666368382">Seaded – haldus</translation> <translation id="4098354747657067197">Avatav sait on petturlik</translation> @@ -723,6 +725,7 @@ <translation id="4356973930735388585">Saidil olevad ründajad võivad proovida installida teie arvutisse ohtlikke programme, mis varastavad teie teavet või kustutavad selle (nt fotod, paroolid, sõnumid ja krediitkaardiandmed).</translation> <translation id="4358059973562876591">Teie määratud malle ei pruugita rakendada, kuna reeglis DnsOverHttpsMode on viga.</translation> <translation id="4358461427845829800">Halda makseviise …</translation> +<translation id="4359160567981085931">Sisestasite äsja oma parooli petturlikule saidile. Chrome saab teid aidata. Oma parooli muutmiseks ja Google'i teavitamiseks sellest, et teie konto võib olla ohus, klõpsake valikul Konto kaitsmine.</translation> <translation id="4367563149485757821">Number-12 (ümbrik)</translation> <translation id="437058704415269440">Konto saldo</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -998,6 +1001,7 @@ <translation id="5728056243719941842">C5 (ümbrik)</translation> <translation id="5730040223043577876">Chrome soovitab teil parooli lähtestada, kui kasutasite seda ka muudel saitidel.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salvestage kaart oma Google'i kontole}other{Salvestage kaardid oma Google'i kontole}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Kasutage selle kaardi puhul virtuaalset numbrit}other{Valige kaart}}</translation> <translation id="5763042198335101085">Sisestage kehtiv e-posti aadress</translation> <translation id="5763703224595565476">Administraator lubas teie brauseris Chrome'i ettevõtte tooteversiooni kasutaja kaitse. Chrome'i ettevõtte tooteversiooni kasutaja kaitsel on juurdepääs osadele teie andmetele.</translation> <translation id="5765072501007116331">Kohaletoimetamisviiside ja nõuete nägemiseks valige aadress</translation> @@ -1014,6 +1018,7 @@ <translation id="5804241973901381774">Load</translation> <translation id="5810442152076338065">Teie ühendus domeeniga <ph name="DOMAIN" /> on krüpteeritud aegunud šifreerimiskomplektiga.</translation> <translation id="5813119285467412249">&Lisa uuesti</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Sellelt kaardilt võetakse tasu siis, kui maksate, kuid selle päris numbrit selle saidiga ei jagata. Lisaturvalisuse pakkumiseks luuakse ajutine CVC.}other{Teie valitud kaardilt võetakse tasu siis, kui maksate, kuid selle päris numbrit selle saidiga ei jagata. Lisaturvalisuse pakkumiseks luuakse ajutine CVC.}}</translation> <translation id="583281660410589416">Tundmatu</translation> <translation id="5838278095973806738">Te ei tohiks sellele saidile sisestada tundlikku teavet (nt paroolid või krediitkaardid), kuna ründajad võivad selle varastada.</translation> <translation id="5851548754964597211">Vahelehtede loend</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Valige kättesaamisviis</translation> <translation id="8057711352706143257">Tarkvara „<ph name="SOFTWARE_NAME" />” ei ole õigesti seadistatud. Tarkvara „<ph name="SOFTWARE_NAME" />” desinstallimine lahendab tavaliselt probleemi. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Kahjuks läks midagi valesti</translation> +<translation id="8067872629359326442">Sisestasite äsja oma parooli petturlikule saidile. Chromium saab teid aidata. Oma parooli muutmiseks ja Google'i teavitamiseks sellest, et teie konto võib olla ohus, klõpsake valikul Konto kaitsmine.</translation> <translation id="8074253406171541171">10x13 (ümbrik)</translation> <translation id="8078141288243656252">Pööramisel ei saa märkusi lisada</translation> <translation id="8079031581361219619">Kas laadida sait uuesti?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Lülita välja</translation> <translation id="8118489163946903409">Makseviis</translation> <translation id="8127301229239896662">Tarkvara „<ph name="SOFTWARE_NAME" />” ei installitud teie arvutisse või võrku korralikult. Paluge IT-administraatoril see probleem lahendada.</translation> +<translation id="8128526133099929547">Sisestasite äsja oma parooli petturlikule saidile. Chrome soovitab teil minna veebisaidile <ph name="WEBSITE_1" /> ja muudele saitidele, kus seda parooli kasutate, ning kohe oma parooli muuta.</translation> <translation id="8131740175452115882">Kinnita</translation> <translation id="8149426793427495338">Teie arvuti lülitus unerežiimile.</translation> <translation id="8150722005171944719">Fail <ph name="URL" /> ei ole loetav. Võimalik, et see on eemaldatud, teisaldatud või faili load takistavad juurdepääsu.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Määratud asukoht:</translation> <translation id="8220146938470311105">C7/C6 (ümbrik)</translation> <translation id="8220639454292072926">Ettevõtte teavitamine</translation> +<translation id="8221250263817408492">Sisestasite äsja oma parooli petturlikule saidile. Chromium soovitab teil minna veebisaidile <ph name="WEBSITE_1" /> ja muudele saitidele, kus seda parooli kasutate, ning kohe oma parooli muuta.</translation> <translation id="8225771182978767009">Arvuti seadistanud inimene blokeeris selle saidi.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Avage leht uuel inkognito vahekaardil</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 773adbc..bc776bc 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">عبارت عبور خالی مجاز نیست.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> افزونههایی را برای عملکردهای اضافی نصب کرده است. افزونهها به برخی از دادههای شما دسترسی دارند.</translation> <translation id="3832522519263485449">چندین سوراخ در چپ</translation> +<translation id="3838154488026099170">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium توصیه میکند همین حالا به <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، و<ph name="WEBSITE_3" />، و سایتهای دیگری که در آنها از این گذرواژه استفاده کردهاید، بروید و گذرواژه را تغییر دهید.</translation> <translation id="385051799172605136">بازگشت</translation> <translation id="3858027520442213535">بهروزرسانی تاریخ و زمان</translation> <translation id="3884278016824448484">شناسه دستگاه یکسان نیست</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">هنگام پردازش سفارش شما خطایی روی داد. لطفاً دوباره امتحان کنید.</translation> <translation id="4075732493274867456">کلاینت و سرور از مجموعه رمزگذاری یا نسخه پروتکل SSL مشترکی استفاده نمیکنند.</translation> <translation id="4075941231477579656">شناسه لمسی</translation> +<translation id="4077092919748553596">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome توصیه میکند همین حالا به <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، و<ph name="WEBSITE_3" />، و سایتهای دیگری که در آنها از این گذرواژه استفاده کردهاید، بروید و گذرواژه را تغییر دهید.</translation> <translation id="4079302484614802869">تنظیمات پروکسی، برای استفاده از آدرس اسکریپت pac. تنظیم شده است و از سرورهای ثابت نمیتواند استفاده کند.</translation> <translation id="4082393374666368382">تنظیمات - مدیریت</translation> <translation id="4098354747657067197">احتیاط، سایت گولزننده</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">مهاجمها در این سایت ممکن است تلاش کنند برنامههای خطرناکی در رایانه شما نصب کنند که اطلاعات شما (مانند عکسها، گذرواژهها، پیامها و کارتهای اعتباری) را به سرقت میبرند یا حذف میکنند.</translation> <translation id="4358059973562876591">ممکن است الگوهایی که مشخص کردید بهدلیل خطای خطمشی DnsOverHttpsMode اعمال نشوند.</translation> <translation id="4358461427845829800">مدیریت روشهای پرداخت…</translation> +<translation id="4359160567981085931">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome میتواند کمک کند. برای اینکه گذرواژهتان را تغییر دهید و به Google اطلاع دهید که شاید حسابتان درمعرض خطر باشد، روی «محافظت از حساب» کلیک کنید.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">موجودی حساب</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Chrome توصیه میکند اگر از گذرواژهتان در سایتهای دیگری استفاده کردید آن را بازنشانی کنید.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{ذخیره کردن کارت در حساب Google شما}one{ذخیره کردن کارتها در حساب Google}other{ذخیره کردن کارتها در حساب Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{استفاده از شماره مجازی برای این کارت}one{انتخاب کارت}other{انتخاب کارت}}</translation> <translation id="5763042198335101085">نشانی ایمیل معتبری وارد کنید</translation> <translation id="5763703224595565476">سرپرستتان «محافظت از کاربر سازمانی در Chrome» را در مرورگر فعال کرده است. «محافظت از کاربر سازمانی در Chrome» به برخی از دادههایتان دسترسی دارد.</translation> <translation id="5765072501007116331">برای دیدن روشهای تحویل و شرایط موردنیاز، یک نشانی انتخاب کنید</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">مجوزها</translation> <translation id="5810442152076338065">اتصال شما به <ph name="DOMAIN" /> با استفاده از یک مجموعه رمز منسوخ، رمزگذاری شده است.</translation> <translation id="5813119285467412249">&انجام مجدد افزودن</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{هنگام پرداخت کردن، هزینه از این کارت کسر خواهد شد، اما شماره واقعی آن در اختیار این سایت قرار نخواهد گرفت. برای امنیت بیشتر، یک CVC موقت ایجاد خواهد شد.}one{هنگام پرداخت کردن، هزینه از کارتی که انتخاب میکنید کسر خواهد شد، اما شماره واقعی آن در اختیار این سایت قرار نخواهد گرفت. برای امنیت بیشتر، یک CVC موقت ایجاد خواهد شد.}other{هنگام پرداخت کردن، هزینه از کارتی که انتخاب میکنید کسر خواهد شد، اما شماره واقعی آن در اختیار این سایت قرار نخواهد گرفت. برای امنیت بیشتر، یک CVC موقت ایجاد خواهد شد.}}</translation> <translation id="583281660410589416">ناشناس</translation> <translation id="5838278095973806738">نباید هیچ اطلاعات حساسی (مثل گذرواژه یا کارت اعتباری) را در این سایت وارد کنید، زیرا ممکن است مهاجمین آنها را سرقت کنند.</translation> <translation id="5851548754964597211">فهرست برگه</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">انتخاب روش تحویل گرفتن</translation> <translation id="8057711352706143257">«<ph name="SOFTWARE_NAME" />» درست پیکربندی نمیشود. معمولاً حذف نصب «<ph name="SOFTWARE_NAME" />» مشکل را برطرف میکند. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">متأسفیم، مشکلی پیش آمد</translation> +<translation id="8067872629359326442">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium میتواند کمک کند. برای اینکه گذرواژهتان را تغییر دهید و به Google اطلاع دهید که شاید حسابتان درمعرض خطر باشد، روی «محافظت از حساب» کلیک کنید.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">در حالت چرخش نمیتوان حاشیهنویسی کرد</translation> <translation id="8079031581361219619">سایت تازهسازی شود؟</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">خاموش کردن</translation> <translation id="8118489163946903409">روش پرداخت</translation> <translation id="8127301229239896662">«<ph name="SOFTWARE_NAME" />» بهدرستی در رایانه یا شبکهتان پیکربندی نشد. از سرپرست فناوری اطلاعات خود بخواهید این مشکل را حل کند.</translation> +<translation id="8128526133099929547">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome توصیه میکند همین حالا به <ph name="WEBSITE_1" />، و سایتهای دیگری که در آنها از این گذرواژه استفاده کردهاید، بروید و گذرواژه را تغییر دهید.</translation> <translation id="8131740175452115882">تأیید</translation> <translation id="8149426793427495338">رایانهتان به خواب رفته است.</translation> <translation id="8150722005171944719">این فایل در <ph name="URL" /> قابل خواندن نیست. ممکن است حذف شده، جابجا شده باشد و یا مجوزهای فایل از دسترسی جلوگیری میکنند.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">مکان اختصاص یافته:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">گزارش خطای شرکتی</translation> +<translation id="8221250263817408492">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium توصیه میکند همین حالا به <ph name="WEBSITE_1" /> و سایتهای دیگری که در آنها از این گذرواژه استفاده کردهاید، بروید و گذرواژه را تغییر دهید.</translation> <translation id="8225771182978767009">شخصی که این رایانه را راهاندازی کرده این سایت را مسدود کرده است.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />، <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">صفحه را در برگه «ناشناس» جدیدی باز کنید</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index a9b2d53..f2bfbcb 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />verkon diagnostiikkaa<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Käännä tämä sivu</translation> <translation id="2479410451996844060">Virheellinen hakukoneen URL-osoite.</translation> -<translation id="2482370039860827034">Lisäsit juuri salasanasi petolliselle sivustolle. Chrome suosittelee vaihtamaan salasanan heti kaikilla sivustoilla, joilla käytät sitä (esim. <ph name="WEBSITE_1" /> ja <ph name="WEBSITE_2" />).</translation> <translation id="2482878487686419369">Ilmoitukset</translation> <translation id="248348093745724435">Laitteen käytännöt</translation> <translation id="2491120439723279231">Palvelimen varmenteessa on virheitä.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Suojaa tili</translation> <translation id="2515629240566999685">Tarkista alueesi mobiilisignaali.</translation> <translation id="2521385132275182522">Niitti oikeassa alareunassa</translation> -<translation id="2521483867890026383">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee vaihtamaan salasanan heti kaikilla sivustoilla, joilla käytät sitä (esim. <ph name="WEBSITE_1" /> ja <ph name="WEBSITE_2" />).</translation> <translation id="2523886232349826891">Tallennetaan vain tälle laitteelle</translation> <translation id="2524461107774643265">Lisää tietoja</translation> <translation id="2535659140340599600">{COUNT,plural, =1{ja 1 muu}other{ja # muuta}}</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 6c10f1cf..5974526 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -594,6 +594,7 @@ <translation id="3828924085048779000">Hindi pinapayagan ang walang laman na passphrase.</translation> <translation id="3831915413245941253">Nag-install ang <ph name="ENROLLMENT_DOMAIN" /> ng mga extension para sa mga karagdagang function. May access ang mga extension sa ilan sa iyong data.</translation> <translation id="3832522519263485449">Multiple punch left</translation> +<translation id="3838154488026099170">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta sa <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, at <ph name="WEBSITE_3" />, at sa iba pang site kung saan mo ginamit ang password na ito at baguhin ito ngayon.</translation> <translation id="385051799172605136">Bumalik</translation> <translation id="3858027520442213535">I-update ang petsa at oras</translation> <translation id="3884278016824448484">Sumasalungat na tagatukoy ng device</translation> @@ -631,6 +632,7 @@ <translation id="4072486802667267160">Nagkaroon ng error sa pagproseso ng iyong order. Pakisubukang muli.</translation> <translation id="4075732493274867456">Hindi sinusuportahan ng client at server ang isang karaniwang bersyon o cipher suite ng SSL protocol.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chrome na pumunta sa <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, at <ph name="WEBSITE_3" />, at sa iba pang site kung saan mo ginamit ang password na ito at baguhin ito ngayon.</translation> <translation id="4079302484614802869">Nakatakda ang configuration ng proxy upang gumamit ng isang .pac script URL, hindi ng mga hindi nababagong proxy server.</translation> <translation id="4082393374666368382">Mga Setting - Pamamahala</translation> <translation id="4098354747657067197">Mapupunta sa nakakapanlinlang na site</translation> @@ -710,6 +712,7 @@ <translation id="4356973930735388585">Maaaring subukan ng mga attacker sa site na ito na mag-install ng mga mapanganib na program sa iyong computer na magnanakaw o magde-delete ng impormasyon mo (halimbawa, mga larawan, password, mensahe at credit card).</translation> <translation id="4358059973562876591">Posibleng hindi mailapat ang mga template na tinukoy mo dahil sa error sa patakarang DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Pamahalaan ang mga paraan ng pagbabayad...</translation> +<translation id="4359160567981085931">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Makakatulong ang Chrome. Para palitan ang iyong password at abisuhan ang Google na posibleng nasa panganib ang iyong account, i-click ang Protektahan ang Account.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Balanse sa Account</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -984,6 +987,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Inirerekomenda ng Chrome na i-reset ang iyong password kung ginamit mo ito sa iba pang site.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{I-save ang card sa iyong Google Account}one{I-save ang mga card sa iyong Google Account}other{I-save ang mga card sa iyong Google Account}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Gumamit ng virtual na numero para sa card na ito}one{Pumili ng card}other{Pumili ng card}}</translation> <translation id="5763042198335101085">Maglagay ng wastong email address</translation> <translation id="5763703224595565476">Na-enable ng iyong administrator ang Proteksyon sa User ng Chrome Enterprise sa browser mo. May access ang Proteksyon sa User ng Chrome Enterprise sa ilan sa iyong data.</translation> <translation id="5765072501007116331">Upang makita ang mga pamamaraan at kinakailangan sa paghahatid, pumili ng address</translation> @@ -1000,6 +1004,7 @@ <translation id="5804241973901381774">Mga Pahintulot</translation> <translation id="5810442152076338065">Naka-encrypt ang iyong koneksyon sa <ph name="DOMAIN" /> gamit ang isang hindi na ginagamit na cipher suite.</translation> <translation id="5813119285467412249">&Gawing Muli ang Pagdagdag</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Sisingilin ang card na ito kapag nagbayad ka, pero hindi ibabahagi sa site na ito ang totoong numero nito. Para sa karagdagang seguridad, bubuo ng pansamantalang CVC.}one{Sisingilin ang card na iyong pipiliin kapag nagbayad ka, pero hindi ibabahagi sa site na ito ang totoong numero nito. Para sa karagdagang seguridad, bubuo ng pansamantalang CVC.}other{Sisingilin ang card na iyong pipiliin kapag nagbayad ka, pero hindi ibabahagi sa site na ito ang totoong numero nito. Para sa karagdagang seguridad, bubuo ng pansamantalang CVC.}}</translation> <translation id="583281660410589416">Hindi-alam</translation> <translation id="5838278095973806738">Hindi ka dapat maglagay ng anumang sensitibong impormasyon sa site na ito (halimbawa, mga password o credit card), dahil maaari itong nakawin ng mga umaatake.</translation> <translation id="5851548754964597211">Listahan ng tab</translation> @@ -1457,6 +1462,7 @@ <translation id="8042918947222776840">Pumili ng Paraan ng Pag-pick up</translation> <translation id="8057711352706143257">Hindi maayos na naka-configure ang "<ph name="SOFTWARE_NAME" />." Kadalasang naaayos ang problema kapag in-uninstall ang "<ph name="SOFTWARE_NAME" />." <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Paumanhin, nagkaproblema.</translation> +<translation id="8067872629359326442">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Makakatulong ang Chromium. Para palitan ang iyong password at abisuhan ang Google na posibleng nasa panganib ang iyong account, i-click ang Protektahan ang Account.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">Hindi maaaring i-annotate kapag naka-rotate</translation> <translation id="8079031581361219619">I-reload ang site?</translation> @@ -1473,6 +1479,7 @@ <translation id="8105368624971345109">I-off</translation> <translation id="8118489163946903409">Paraan ng pagbabayad</translation> <translation id="8127301229239896662">Hindi na-install nang maayos ang "<ph name="SOFTWARE_NAME" />" sa iyong computer o network. Magtanong sa IT administrator mo upang malutas ang isyung ito.</translation> +<translation id="8128526133099929547">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chrome na pumunta sa <ph name="WEBSITE_1" /> at sa iba pang site kung saan mo ginamit ang password na ito at baguhin ito ngayon.</translation> <translation id="8131740175452115882">Kumpirmahin</translation> <translation id="8149426793427495338">Nag-sleep ang iyong computer.</translation> <translation id="8150722005171944719">Hindi nababasa ang file sa <ph name="URL" />. Maaaring ito ay naalis, nalipat, o maaaring pinipigilan ng mga pagpapahintulot ng file ang access.</translation> @@ -1490,6 +1497,7 @@ <translation id="8218327578424803826">Itinakdang Lokasyon:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">Pag-uulat ng Enterprise</translation> +<translation id="8221250263817408492">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta sa <ph name="WEBSITE_1" /> at sa iba pang site kung saan mo ginamit ang password na ito at baguhin ito ngayon.</translation> <translation id="8225771182978767009">Pinili ng taong nag-set up ng computer na ito na i-block ang site na ito.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Buksan ang page sa bagong Incognito tab</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index d22aa96..3510e3af 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -592,6 +592,7 @@ <translation id="3828924085048779000">La phrase de passe est obligatoire.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> a installé des extensions offrant des fonctions supplémentaires. Les extensions ont accès à certaines de vos données.</translation> <translation id="3832522519263485449">Perforation multiple à gauche</translation> +<translation id="3838154488026099170">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium vous recommande de visiter <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" />, ainsi que tout autre site sur lesquels vous avez utilisé ce mot de passe, puis de le changer maintenant.</translation> <translation id="385051799172605136">Retour</translation> <translation id="3858027520442213535">Mettre à jour la date et l'heure</translation> <translation id="3884278016824448484">Identifiant de périphérique en conflit</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">Une erreur s'est produite lors du traitement de votre commande. Veuillez réessayer.</translation> <translation id="4075732493274867456">Le client et le serveur ne prennent pas en charge une version habituelle du protocole SSL et de la suite de chiffrement.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome vous recommande de visiter <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" />, ainsi que tout autre site sur lesquels vous avez utilisé ce mot de passe, puis de le changer maintenant.</translation> <translation id="4079302484614802869">La configuration du mandataire est réglée à l'utilisation d'une adresse URL de script .pac, et non des serveurs mandataires fixes.</translation> <translation id="4082393374666368382">Paramètres - Gestion</translation> <translation id="4098354747657067197">Vous naviguez vers un site Web trompeur</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">Les cyberpirates sur le site pourraient tenter d'installer des programmes dangereux sur votre ordinateur afin de voler ou de supprimer vos données (par exemple des photos, des mots de passe, des messages et des données de carte de crédit).</translation> <translation id="4358059973562876591">Les modèles que vous avez indiqués pourraient ne pas être appliqués en raison d'une erreur avec la politique DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Gérer les modes de paiement</translation> +<translation id="4359160567981085931">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome peut vous aider. Pour modifier votre mot de passe et avertir Google que votre compte pourrait être en danger, cliquez sur Protéger le compte.</translation> <translation id="4367563149485757821">Enveloppe n° 12</translation> <translation id="437058704415269440">Solde du compte</translation> <translation id="4372516964750095882">Pli en éventail, É-U</translation> @@ -982,6 +985,7 @@ <translation id="5728056243719941842">Enveloppe C5</translation> <translation id="5730040223043577876">Chrome recommande de réinitialiser votre mot de passe si vous l'avez réutilisé sur d'autres sites.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Enregistrer la carte dans votre compte Google}one{Enregistrer la carte dans votre compte Google}other{Enregistrer les cartes dans votre compte Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Utiliser un numéro virtuel pour cette carte}one{Sélectionnez une carte}other{Sélectionnez des cartes}}</translation> <translation id="5763042198335101085">Entrez une adresse de courriel valide</translation> <translation id="5763703224595565476">Votre administrateur a activé la protection pour les utilisateurs de Chrome Enterprise pour votre navigateur. La protection pour les utilisateurs de Chrome Enterprise a accès à certaines de vos données.</translation> <translation id="5765072501007116331">Pour voir les exigences et les modes de livraison, sélectionnez une adresse</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">Autorisations</translation> <translation id="5810442152076338065">Votre connexion au domaine <ph name="DOMAIN" /> est protégée par une suite de chiffrement obsolète.</translation> <translation id="5813119285467412249">&Rétablir l'ajout</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Cette carte sera débitée lorsque vous payerez, mais son véritable numéro ne sera pas partagé avec ce site. Pour accroître la sécurité, un code CVC sera généré.}one{La carte que vous avez sélectionnée sera débitée lorsque vous payerez, mais son véritable numéro ne sera pas partagé avec ce site. Pour accroître la sécurité, un code CVC sera généré.}other{Les cartes que vous avez sélectionnées seront débitées lorsque vous payerez, mais leur véritable numéro ne sera pas partagé avec ce site. Pour accroître la sécurité, un code CVC sera généré.}}</translation> <translation id="583281660410589416">Inconnu</translation> <translation id="5838278095973806738">Nous vous déconseillons d'entrer des données sensibles sur ce site (par exemple, des mots de passe ou des cartes de crédit), car elles pourraient être volées par des pirates.</translation> <translation id="5851548754964597211">Liste d'onglets</translation> @@ -1455,6 +1460,7 @@ <translation id="8042918947222776840">Choisir un mode de ramassage</translation> <translation id="8057711352706143257">« <ph name="SOFTWARE_NAME" /> » n'est pas correctement configuré. La désinstallation de « <ph name="SOFTWARE_NAME" /> » résout généralement le problème. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Désolés, une erreur s'est produite.</translation> +<translation id="8067872629359326442">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium peut vous aider. Pour modifier votre mot de passe et avertir Google que votre compte pourrait être en danger, cliquez sur Protéger le compte.</translation> <translation id="8074253406171541171">Enveloppe 10 po x 13 po</translation> <translation id="8078141288243656252">Impossible d'annoter lorsque le document est pivoté</translation> <translation id="8079031581361219619">Actualiser le site?</translation> @@ -1471,6 +1477,7 @@ <translation id="8105368624971345109">Désactiver</translation> <translation id="8118489163946903409">Mode de paiement</translation> <translation id="8127301229239896662">« <ph name="SOFTWARE_NAME" /> » n'a pas été correctement installé sur votre ordinateur ou votre réseau. Demandez à votre administrateur informatique de résoudre ce problème.</translation> +<translation id="8128526133099929547">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome vous recommande de visiter <ph name="WEBSITE_1" />, ainsi que tout autre site sur lesquels vous avez utilisé ce mot de passe, puis de le changer maintenant.</translation> <translation id="8131740175452115882">Confirmer</translation> <translation id="8149426793427495338">Votre ordinateur s'est mis en veille.</translation> <translation id="8150722005171944719">Le fichier à l'adresse <ph name="URL" /> n'est pas lisible. Il est possible qu'il ait été supprimé ou déplacé, ou que les autorisations associées à ce fichier empêchent d'y accéder.</translation> @@ -1488,6 +1495,7 @@ <translation id="8218327578424803826">Emplacement attribué :</translation> <translation id="8220146938470311105">Enveloppe C7/C6</translation> <translation id="8220639454292072926">Rapports d'entreprise</translation> +<translation id="8221250263817408492">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium vous recommande de visiter <ph name="WEBSITE_1" />, ainsi que tout autre site sur lesquels vous avez utilisé ce mot de passe, puis de le changer maintenant.</translation> <translation id="8225771182978767009">La personne qui a configuré cet ordinateur a choisi de bloquer ce site.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Ouvrir la page dans un nouvel onglet de navigation privée</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 1770650..70a6e207 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Exécuter les diagnostics du réseau<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Traduire cette page</translation> <translation id="2479410451996844060">URL de recherche incorrecte</translation> -<translation id="2482370039860827034">Vous venez de saisir votre mot de passe sur un site trompeur. Nous vous recommandons d'accéder à <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ainsi qu'à d'autres sites sur lesquels vous utilisez ce mot de passe pour le modifier immédiatement.</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="248348093745724435">Règles associées à la machine</translation> <translation id="2491120439723279231">Le certificat du serveur contient des erreurs.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Protéger le compte</translation> <translation id="2515629240566999685">Vérifiez le signal dans votre zone.</translation> <translation id="2521385132275182522">Agrafe en bas à droite</translation> -<translation id="2521483867890026383">Vous venez de saisir votre mot de passe sur un site trompeur. Nous vous recommandons d'accéder à <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ainsi qu'à d'autres sites sur lesquels vous utilisez ce mot de passe pour le modifier immédiatement.</translation> <translation id="2523886232349826891">Enregistrée sur cet appareil uniquement</translation> <translation id="2524461107774643265">Ajouter des informations</translation> <translation id="2535659140340599600">{COUNT,plural, =1{et 1 autre}one{et # autre}other{et # autres}}</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index b381c93a..941f955 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -68,7 +68,7 @@ <translation id="1264126396475825575">Informe de fallos capturado o <ph name="CRASH_TIME" /> (aínda non se cargou nin se ignorou)</translation> <translation id="1270502636509132238">Método de recollida</translation> <translation id="1285320974508926690">Non traducir nunca este sitio</translation> -<translation id="1285400217480592994">Analiza os contidos dos ficheiros que descargas ou cargas en Chrome.</translation> +<translation id="1285400217480592994">Analiza o contido dos ficheiros que descargas ou cargas en Chrome.</translation> <translation id="1292701964462482250">"Hai software no teu ordenador que está evitando que Chrome se conecte de forma segura á web" (só para ordenadores con Windows)</translation> <translation id="1294154142200295408">Variacións da liña de comandos</translation> <translation id="129553762522093515">Pechado recentemente</translation> @@ -437,7 +437,7 @@ <translation id="2989742184762224133">Dúas grampas na parte superior</translation> <translation id="2991174974383378012">Compartindo con sitios web</translation> <translation id="2991571918955627853">Non podes visitar <ph name="SITE" /> neste momento porque o sitio web utiliza HSTS. Normalmente, os erros de rede e os ataques son temporais, polo que é posible que esta páxina funcione máis tarde.</translation> -<translation id="2996674880327704673">Suxestións feitas por Google</translation> +<translation id="2996674880327704673">Suxestións de Google</translation> <translation id="3005723025932146533">Mostrar copia gardada</translation> <translation id="3008447029300691911">Introduce o código CVC da tarxeta <ph name="CREDIT_CARD" />. Unha vez que confirmes os datos, os detalles da tarxeta compartiranse con este sitio.</translation> <translation id="3010559122411665027">Entrada da lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -605,6 +605,7 @@ <translation id="3828924085048779000">A frase de acceso non pode estar baleira.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> instalou extensións para poder utilizar funcións adicionais. As extensións teñen acceso a algúns dos teus datos.</translation> <translation id="3832522519263485449">Varias perforacións na parte esquerda</translation> +<translation id="3838154488026099170">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium recoméndache que vaias a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e outros sitios nos que utilices este contrasinal para cambialo agora.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3858027520442213535">Actualizar data e hora</translation> <translation id="3884278016824448484">Identificador de dispositivos en conflito</translation> @@ -642,6 +643,7 @@ <translation id="4072486802667267160">Produciuse un erro ao procesar a túa solicitude. Téntao de novo.</translation> <translation id="4075732493274867456">O cliente e o servidor non admiten unha versión do protocolo SSL ou o conxunto de cifrado comúns.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome recoméndache que vaias a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e outros sitios nos que utilices este contrasinal para cambialo agora.</translation> <translation id="4079302484614802869">A configuración do proxy está establecida para utilizar un URL de script .pac, non servidores proxy fixos.</translation> <translation id="4082393374666368382">Configuración - Xestión</translation> <translation id="4098354747657067197">O sitio ao que te dirixes é enganoso</translation> @@ -721,6 +723,7 @@ <translation id="4356973930735388585">Os atacantes deste sitio poden tentar instalar programas perigosos no teu ordenador e roubar ou eliminar os teus datos (por exemplo, fotos, contrasinais, mensaxes e información das túas tarxetas de crédito).</translation> <translation id="4358059973562876591">Os modelos que especificaches poden non aplicarse debido a un erro coa política DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Xestiona os métodos de pago…</translation> +<translation id="4359160567981085931">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome pode axudarche. Para cambiar o teu contrasinal e notificarlle a Google que a túa conta pode estar en risco, fai clic en Protexer conta.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Saldo da conta</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -996,6 +999,7 @@ <translation id="5728056243719941842">C5 (sobre)</translation> <translation id="5730040223043577876">Chrome recoméndache que restablezas o contrasinal se o reutilizaches noutros sitios.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Garda a tarxeta na túa Conta de Google}other{Garda tarxetas na túa Conta de Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Utilizar un número virtual para esta tarxeta}other{Seleccionar unha tarxeta}}</translation> <translation id="5763042198335101085">Introduce un enderezo de correo electrónico válido</translation> <translation id="5763703224595565476">O teu administrador activou Chrome Enterprise User Protect no navegador. Esta función ten acceso a algúns dos teus datos.</translation> <translation id="5765072501007116331">Para consultar os requisitos e métodos de entrega, selecciona un enderezo</translation> @@ -1012,6 +1016,7 @@ <translation id="5804241973901381774">Permisos</translation> <translation id="5810442152076338065">A túa conexión a <ph name="DOMAIN" /> está encriptada cun conxunto de cifrado obsoleto.</translation> <translation id="5813119285467412249">&Refacer adición</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Cando pagues, cobrarase o importe correspondente utilizando esta tarxeta, pero o seu número real non se compartirá con este sitio. Para máis seguranza, xerarase un CVC temporal.}other{Cando pagues, cobrarase o importe correspondente utilizando a tarxeta que selecciones, pero o seu número real non se compartirá con este sitio. Para máis seguranza, xerarase un CVC temporal.}}</translation> <translation id="583281660410589416">Descoñecido</translation> <translation id="5838278095973806738">Non debes introducir información confidencial neste sitio (por exemplo, contrasinais ou tarxetas de crédito), xa que os atacantes poden roubala.</translation> <translation id="5851548754964597211">Lista de pestanas</translation> @@ -1077,7 +1082,7 @@ <translation id="6094273045989040137">Anotar</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">É posible que a túa conta de Google teña outras formas do historial de navegación en <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /></translation> -<translation id="6120179357481664955">Queres lembrar o teu código de identificación de UPI?</translation> +<translation id="6120179357481664955">Queres lembrar o teu código da UPI?</translation> <translation id="6132597952260690497">Información sobre as extensións e os complementos instalados</translation> <translation id="6146055958333702838">Comproba os cables e reinicia os routers, módems e demais dispositivos de rede que utilices.</translation> @@ -1312,7 +1317,7 @@ <translation id="733923710415886693">O certificado do servidor non se indicou mediante Certificate Transparency.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">É colaborador:</translation> -<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> activou no navegador Chrome Enterprise User Protect. Esta función ten acceso a algúns dos teus datos.</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> activou Chrome Enterprise User Protect no navegador. Esta función ten acceso a algúns dos teus datos.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Liña de comandos</translation> <translation id="7372973238305370288">resultado da busca</translation> @@ -1469,6 +1474,7 @@ <translation id="8042918947222776840">Escoller método de recollida</translation> <translation id="8057711352706143257"><ph name="SOFTWARE_NAME" /> non está configurado correctamente. Ao desinstalar <ph name="SOFTWARE_NAME" /> adoita solucionarse o problema. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Produciuse un erro.</translation> +<translation id="8067872629359326442">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium pode axudarche. Para cambiar o teu contrasinal e notificarlle a Google que a túa conta pode estar en risco, fai clic en Protexer conta.</translation> <translation id="8074253406171541171">10x13 (sobre)</translation> <translation id="8078141288243656252">Non se poden realizar anotacións ao xirar o documento</translation> <translation id="8079031581361219619">Queres volver cargar o sitio?</translation> @@ -1485,6 +1491,7 @@ <translation id="8105368624971345109">Desactivar</translation> <translation id="8118489163946903409">Método de pago</translation> <translation id="8127301229239896662"><ph name="SOFTWARE_NAME" /> non se instalou correctamente no teu ordenador ou na rede. Pídelle ao administrador de TI que solucione este problema.</translation> +<translation id="8128526133099929547">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome recoméndache que vaias a <ph name="WEBSITE_1" /> e outros sitios nos que utilices este contrasinal para cambialo agora.</translation> <translation id="8131740175452115882">Confirmar</translation> <translation id="8149426793427495338">O teu ordenador entrou no modo de suspensión.</translation> <translation id="8150722005171944719">Non se pode ler o ficheiro que se encontra en <ph name="URL" />. É posible que se eliminase, movese ou que os permisos do ficheiro estean impedindo o acceso.</translation> @@ -1502,6 +1509,7 @@ <translation id="8218327578424803826">Localización asignada:</translation> <translation id="8220146938470311105">C7/C6 (sobre)</translation> <translation id="8220639454292072926">Informes de empresas</translation> +<translation id="8221250263817408492">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium recoméndache que vaias a <ph name="WEBSITE_1" /> e outros sitios nos que utilices este contrasinal para cambialo agora.</translation> <translation id="8225771182978767009">A persoa que configurou este ordenador optou por bloquear este sitio.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Abre a páxina nunha nova pestana do modo de incógnito</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 33068d501..992c80f 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -604,6 +604,7 @@ <translation id="3828924085048779000">ખાલી પાસફ્રેઝને અનુમતિ નથી. </translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" />એ વધારાના કાર્યો માટે એક્સ્ટેંશન ઇન્સ્ટૉલ કર્યા છે. એક્સ્ટેંશન પાસે તમારા કેટલાક ડેટાનો ઍક્સેસ છે.</translation> <translation id="3832522519263485449">ડાબી બાજુએ એકથી વધુ કાણાં પાડો</translation> +<translation id="3838154488026099170">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> તેમજ તમે આ પાસવર્ડનો જ્યાં ઉપયોગ કરતા હોય તેના પર જઈને તેને હમણાં જ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="385051799172605136">પાછળ</translation> <translation id="3858027520442213535">તારીખ અને સમય અપડેટ કરો</translation> <translation id="3884278016824448484">વિરોધાભાસી ઉપકરણ ઓળખકર્તા</translation> @@ -641,6 +642,7 @@ <translation id="4072486802667267160">તમારા ઑર્ડરની પ્રક્રિયા કરતી વખતે એક ભૂલ આવી હતી. કૃપા કરીને ફરીથી પ્રયાસ કરો.</translation> <translation id="4075732493274867456">ક્લાઇન્ટ અને સર્વર સામાન્ય SSL પ્રોટોકોલ વર્ઝન અથવા સાઇફર સ્યૂટની સહાય કરતા નથી.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> તેમજ તમે આ પાસવર્ડનો જ્યાં ઉપયોગ કરતા હોય તે અન્ય સાઇટ પર જઈને તેને હમણાં જ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="4079302484614802869">પ્રૉક્સી ગોઠવણી .pac સ્ક્રિપ્ટ URLનો ઉપયોગ કરવા માટે સેટ છે, ફિક્સ્ડ પ્રૉક્સી સર્વર માટે નહીંં.</translation> <translation id="4082393374666368382">સેટિંગ - મેનેજમેન્ટ</translation> <translation id="4098354747657067197">આગળ છેતરામણી સાઇટ છે</translation> @@ -720,6 +722,7 @@ <translation id="4356973930735388585">આ સાઇટ પરના હુમલાખોરો તમારા કમ્પ્યુટર પર તમારી માહિતી (ઉદાહરણ તરીકે, ફોટો, પાસવર્ડ, સંદેશા અને ક્રેડિટ કાર્ડ)ને ચોરી શકે કે કાઢી નાખે એવા જોખમી પ્રોગ્રામને ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરી શકે છે.</translation> <translation id="4358059973562876591">DnsOverHttpsMode નીતિમાં ભૂલના કારણે તમે ઉલ્લેખ કરેલા નમૂનાઓને કદાચ લાગુ કરવામાં આવશે નહીં.</translation> <translation id="4358461427845829800">ચુકવણી પદ્ધતિઓ મેનેજ કરો…</translation> +<translation id="4359160567981085931">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chrome સહાય કરી શકે છે. તમારો પાસવર્ડ બદલવા માટે અને Googleને એ જાણ કરવા માટે કે તમારું એકાઉન્ટ જોખમમાં હોઈ શકે છે, એકાઉન્ટ સુરક્ષિત કરો પર ક્લિક કરો.</translation> <translation id="4367563149485757821">નંબર-12 (એન્વલપ)</translation> <translation id="437058704415269440">એકાઉન્ટ બૅલેન્સ</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -994,6 +997,7 @@ <translation id="5728056243719941842">C5 (એન્વલપ)</translation> <translation id="5730040223043577876">જો તમે અન્ય સાઇટ પર તમારા પાસવર્ડનો ફરી ઉપયોગ કર્યો હોય, તો Chrome તેને રીસેટ કરવાનો સુઝાવ આપે છે.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{તમારા Google એકાઉન્ટમાં કાર્ડ સાચવો}one{તમારા Google એકાઉન્ટમાં કાર્ડ સાચવો}other{તમારા Google એકાઉન્ટમાં કાર્ડ સાચવો}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{આ કાર્ડ માટે વર્ચ્યુઅલ નંબરનો ઉપયોગ કરો}one{કાર્ડ પસંદ કરો}other{કાર્ડ પસંદ કરો}}</translation> <translation id="5763042198335101085">એક માન્ય ઇમેઇલ ઍડ્રેસ ઉમેરો</translation> <translation id="5763703224595565476">તમારા વ્યવસ્થાપક દ્વારા તમારા બ્રાઉઝર પર Chrome એન્ટરપ્રાઇઝ વપરાશકર્તા સંરક્ષણ સેવા ચાલુ કરવામાં આવી છે. Chrome એન્ટરપ્રાઇઝ વપરાશકર્તા સંરક્ષણ સેવાને તમારા અમુક ડેટાનો ઍક્સેસ છે.</translation> <translation id="5765072501007116331">વિતરણ પદ્ધતિઓ અને આવશ્યકતાઓ જોવા માટે, એક સરનામું પસંદ કરો</translation> @@ -1010,6 +1014,7 @@ <translation id="5804241973901381774">પરવાનગીઓ</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> સાથેના તમારા કનેક્શનને ઑબ્સોલિટ સાઇફર સ્યૂટનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરાયું છે.</translation> <translation id="5813119285467412249">&ઉમેરવું ફરી કરો</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{તમે ચુકવણી કરશો ત્યારે આ કાર્ડથી શુલ્ક લેવામાં આવશે, પણ તેનો વાસ્તવિક નંબર આ સાઇટ સાથે શેર કરવામાં આવશે નહીં. વધારાની સુવિધા માટે, કામ ચલાઉ CVC જનરેટ કરવામાં આવશે.}one{તમે ચુકવણી કરશો ત્યારે તમે પસંદ કરશો તે કાર્ડથી શુલ્ક લેવામાં આવશે, પણ તેનો વાસ્તવિક નંબર આ સાઇટ સાથે શેર કરવામાં આવશે નહીં. વધારાની સુવિધા માટે, કામ ચલાઉ CVC જનરેટ કરવામાં આવશે.}other{તમે ચુકવણી કરશો ત્યારે તમે પસંદ કરશો તે કાર્ડથી શુલ્ક લેવામાં આવશે, પણ તેનો વાસ્તવિક નંબર આ સાઇટ સાથે શેર કરવામાં આવશે નહીં. વધારાની સુવિધા માટે, કામ ચલાઉ CVC જનરેટ કરવામાં આવશે.}}</translation> <translation id="583281660410589416">અજ્ઞાત</translation> <translation id="5838278095973806738">તમારે આ સાઇટ પર કોઈપણ સંવેદનશીલ માહિતી (ઉદાહરણ તરીકે, પાસવર્ડ્સ અથવા ક્રેડિટ કાર્ડ્સ) દાખલ કરવી જોઈએ નહીં, કારણ કે તે હુમલાખોર દ્વારા ચોરવામાં આવી શકે છે.</translation> <translation id="5851548754964597211">ટેબ સૂચિ</translation> @@ -1467,6 +1472,7 @@ <translation id="8042918947222776840">પિકઅપ પદ્ધતિ પસંદ કરો</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />"ની ગોઠવણી યોગ્ય રીતે કરવામાં આવી નથી. સામાન્ય રીતે "<ph name="SOFTWARE_NAME" />"ને અનઇન્સ્ટૉલ કરવાથી સમસ્યા હલ થઈ જાય છે. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">માફ કરશો, કંઈક ખોટું થયું.</translation> +<translation id="8067872629359326442">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chromium સહાય કરી શકે છે. તમારો પાસવર્ડ બદલવા માટે અને Googleને એ જાણ કરવા માટે કે તમારું એકાઉન્ટ જોખમમાં હોઈ શકે છે, એકાઉન્ટ સુરક્ષિત કરો પર ક્લિક કરો.</translation> <translation id="8074253406171541171">10x13 (એન્વલપ)</translation> <translation id="8078141288243656252">ફેરવેલ હોય ત્યારે એનોટેટ કરી શકતા નથી</translation> <translation id="8079031581361219619">સાઇટ ફરીથી લોડ કરીએ?</translation> @@ -1483,6 +1489,7 @@ <translation id="8105368624971345109">બંધ કરો</translation> <translation id="8118489163946903409">ચુકવણી પદ્ધતિ</translation> <translation id="8127301229239896662">તમારા કમ્પ્યુટરમાં અથવા નેટવર્ક પર "<ph name="SOFTWARE_NAME" />" યોગ્ય રીતે ઇન્સ્ટૉલ થયું નથી. તમારા IT વ્યવસ્થાપકને આ સમસ્યા હલ કરવાનું કહો.</translation> +<translation id="8128526133099929547">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chrome <ph name="WEBSITE_1" /> તેમજ તમે આ પાસવર્ડનો જ્યાં ઉપયોગ કરતા હોય તે અન્ય સાઇટ પર જઈને તેને હમણાં જ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="8131740175452115882">પુષ્ટિ કરો</translation> <translation id="8149426793427495338">તમારું કમ્પ્યુટર નિષ્ક્રિય થઈ ગયું હતું.</translation> <translation id="8150722005171944719"><ph name="URL" /> પરની ફાઇલ વાંચનયોગ્ય નથી. તે દૂર કરવામાં, ખસેડવામાં આવી હોઈ શકે છે અથવા ફાઇલ પરવાનગીઓ ઍક્સેસ કરવાથી અટકાવતી હોઈ શકે છે.</translation> @@ -1500,6 +1507,7 @@ <translation id="8218327578424803826">સોંપાયેલ સ્થાન:</translation> <translation id="8220146938470311105">C7/C6 (એન્વલપ)</translation> <translation id="8220639454292072926">એન્ટરપ્રાઇઝ રિપોર્ટિંગ</translation> +<translation id="8221250263817408492">હમણાં જ કોઈ છેતરામણી સાઇટ પર તમે તમારો પાસવર્ડ દાખલ કર્યો. Chromium <ph name="WEBSITE_1" /> તેમજ તમે આ પાસવર્ડનો જ્યાં ઉપયોગ કરતા હોય તે અન્ય સાઇટ પર જઈને તેને હમણાં જ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="8225771182978767009">આ કમ્પ્યુટરને સેટ કરનાર વ્યક્તિએ આ સાઇટને અવરોધિત કરવાનું પસંદ કર્યું છે.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">એક નવી છુપી વિંડોમાં પેજ ખોલો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 35c2dc0..4efbcb9 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -604,6 +604,7 @@ <translation id="3828924085048779000">खाली 'पासफ़्रेज़' की अनुमति नहीं है.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ने और सुविधाओं के लिए एक्सटेंशन इंस्टॉल किया है. एक्सटेंशन आपका कुछ डेटा ऐक्सेस कर सकते हैं.</translation> <translation id="3832522519263485449">बाईं ओर एक से ज़्यादा पंच</translation> +<translation id="3838154488026099170">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. क्रोमियम, <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, और <ph name="WEBSITE_3" /> पर जाकर तुरंत पासवर्ड बदलने का सुझाव देता है. साथ ही, उन साइटों पर जाकर इसे बदलने का सुझाव भी देता है जिन पर आपने यह पासवर्ड इस्तेमाल किया था.</translation> <translation id="385051799172605136">वापस</translation> <translation id="3858027520442213535">तारीख और समय अपडेट करें</translation> <translation id="3884278016824448484">विरोधाभासी डिवाइस पहचानकर्ता</translation> @@ -641,6 +642,7 @@ <translation id="4072486802667267160">आपका आदेश संसाधित करते समय गड़बड़ी हुई. कृपया फिर से कोशिश करें.</translation> <translation id="4075732493274867456">क्लाइंट और सर्वर, सामान्य SSL प्रोटोकॉल वर्शन या सिफ़र सुइट का समर्थन नहीं करते हैं.</translation> <translation id="4075941231477579656">टच आईडी</translation> +<translation id="4077092919748553596">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. Chrome, <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, और <ph name="WEBSITE_3" /> पर जाकर तुरंत पासवर्ड बदलने का सुझाव देता है. साथ ही, उन साइटों पर भी पासवर्ड बदलने का सुझाव देता है जिन पर आपने इसे इस्तेमाल किया था.</translation> <translation id="4079302484614802869">प्रॉक्सी कॉन्फ़िगरेशन को .pac स्क्रिप्ट यूआरएल का उपयोग करने के लिए सेट किया जाता है, फ़िक्स्ड प्रॉक्सी सर्वर के लिए नहीं.</translation> <translation id="4082393374666368382">सेटिंग - प्रबंधन</translation> <translation id="4098354747657067197">आगे भ्रामक साइट है</translation> @@ -720,6 +722,7 @@ <translation id="4356973930735388585">इस साइट पर मौजूद हमलावर आपके कंप्यूटर पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने की कोशिश कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुरा लेते हैं या उसे मिटा देते हैं.</translation> <translation id="4358059973562876591">आपकी ओर से तय किए गए टेम्प्लेट, DnsOverHttpsMode नीति की गड़बड़ी की वजह से लागू नहीं हो सकते.</translation> <translation id="4358461427845829800">भुगतान विधियां प्रबंधित करें...</translation> +<translation id="4359160567981085931">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. Chrome इसमें आपकी मदद कर सकता है. अपना पासवर्ड बदलने और Google को यह बताने के लिए कि आपका खाता सुरक्षित नहीं है, 'खाता सुरक्षित करें' पर क्लिक करें.</translation> <translation id="4367563149485757821">संख्या-12 (एन्वेलप)</translation> <translation id="437058704415269440">खाते में बाकी बैलेंस</translation> <translation id="4372516964750095882">फ़ैनफ़ोल्ड-यूएस</translation> @@ -995,6 +998,7 @@ <translation id="5728056243719941842">सी5 (एन्वेलॉप)</translation> <translation id="5730040223043577876">अगर आपने अपने पासवर्ड का दूसरी साइटों पर दोबारा इस्तेमाल किया है, तो Chrome आपको उसे रीसेट करने का सुझाव देता है.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{अपने Google खाते में कार्ड सेव करें}one{अपने Google खाते में कार्ड सेव करें}other{अपने Google खाते में कार्ड सेव करें}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{इस कार्ड के लिए वर्चुअल नंबर इस्तेमाल करें}one{कोई कार्ड चुनें}other{कोई कार्ड चुनें}}</translation> <translation id="5763042198335101085">मान्य ईमेल पता डालें</translation> <translation id="5763703224595565476">आपके एडमिन ने ब्राउज़र पर 'Chrome Enterprise की उपयोगकर्ता के लिए सुरक्षा' सुविधा को चालू किया है. 'Chrome Enterprise की उपयोगकर्ता के लिए सुरक्षा' सुविधा आपका कुछ डेटा ऐक्सेस कर सकती है.</translation> <translation id="5765072501007116331">वितरण के तरीके और ज़रूरतें देखने के लिए, कोई पता चुनें</translation> @@ -1011,6 +1015,7 @@ <translation id="5804241973901381774">अनुमतियां</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> से आपके कनेक्शन को किसी पुराने सिफ़र सुइट का उपयोग करके सुरक्षित किया गया है.</translation> <translation id="5813119285467412249">&जोड़ना फिर से करें</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{जब आप पैसे चुकाएंगे, तब इस कार्ड से पैसे लिए जाएंगे. हालांकि, इसके सही नंबर को इस साइट के साथ शेयर नहीं किया जाएगा. ज़्यादा सुरक्षा के लिए, कुछ समय तक मान्य रहने वाला कार्ड वेरीफ़िकेशन कोड (सीवीसी) जनरेट किया जाएगा.}one{जब आप पैसे चुकाएंगे, तब आपके चुने हुए कार्ड से पैसे लिए जाएंगे. हालांकि, इसके सही नंबर को इस साइट के साथ शेयर नहीं किया जाएगा. ज़्यादा सुरक्षा के लिए, कुछ समय तक मान्य रहने वाला कार्ड वेरीफ़िकेशन कोड (सीवीसी) जनरेट किया जाएगा.}other{जब आप पैसे चुकाएंगे, तब आपके चुने हुए कार्ड से पैसे लिए जाएंगे. हालांकि, इसके सही नंबर को इस साइट के साथ शेयर नहीं किया जाएगा. ज़्यादा सुरक्षा के लिए, कुछ समय तक मान्य रहने वाला कार्ड वेरीफ़िकेशन कोड (सीवीसी) जनरेट किया जाएगा.}}</translation> <translation id="583281660410589416">अज्ञात</translation> <translation id="5838278095973806738">आपको इस साइट पर कोई भी संवेदनशील जानकारी (उदाहरण के लिए, पासवर्ड या क्रेडिट कार्ड) नहीं डालनी चाहिए, क्योंकि उसे हमलावर चुरा सकते हैं.</translation> <translation id="5851548754964597211">टैब सूची</translation> @@ -1468,6 +1473,7 @@ <translation id="8042918947222776840">पिकअप का तरीका चुनें</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" सही तरीके से कॉन्फ़िगर नहीं किया गया है. आमतौर पर "<ph name="SOFTWARE_NAME" />" को अनइंस्टॉल करने से समस्या ठीक हो जाती है. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">माफ़ करें, कोई गड़बड़ी हुई.</translation> +<translation id="8067872629359326442">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. क्रोमियम इसमें आपकी मदद कर सकता है. अपना पासवर्ड बदलने और Google को यह बताने के लिए कि आपका खाता सुरक्षित नहीं है, 'खाता सुरक्षित करें' पर क्लिक करें.</translation> <translation id="8074253406171541171">10x13 (एन्वेलप)</translation> <translation id="8078141288243656252">घुमाने पर एनोटेट नहीं कर सकते</translation> <translation id="8079031581361219619">साइट को फिर लोड करें?</translation> @@ -1484,6 +1490,7 @@ <translation id="8105368624971345109">बंद करें</translation> <translation id="8118489163946903409">भुगतान का तरीका</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" आपके कंप्यूटर या नेटवर्क पर ठीक से इंस्टॉल नहीं हुआ था. अपने आईटी व्यवस्थापक से इस समस्या को ठीक करने के लिए कहें.</translation> +<translation id="8128526133099929547">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. Chrome, <ph name="WEBSITE_1" /> और उन साइटों पर जाकर पासवर्ड बदलने का सुझाव देता है जिन पर आपने इसे इस्तेमाल किया था.</translation> <translation id="8131740175452115882">दुबारा पूछें</translation> <translation id="8149426793427495338">आपका कंप्यूटर निष्क्रिय हो गया है.</translation> <translation id="8150722005171944719"><ph name="URL" /> पर मौजूद फ़ाइल पढ़ने के लायक नहीं है. हो सकता है कि इसे हटा दिया गया हो, कहीं ले जाया गया हो, या फ़ाइल की अनुमतियां एक्सेस को रोक रही हों.</translation> @@ -1501,6 +1508,7 @@ <translation id="8218327578424803826">सौंपा गया स्थान:</translation> <translation id="8220146938470311105">सी7/सी6 (एन्वेलप)</translation> <translation id="8220639454292072926">एंटरप्राइज़ रिपोर्टिंग</translation> +<translation id="8221250263817408492">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. क्रोमियम, <ph name="WEBSITE_1" /> और उन साइटों पर जाकर पासवर्ड बदलने का सुझाव देता है जिन पर आपने इसे इस्तेमाल किया था.</translation> <translation id="8225771182978767009">जिस व्यक्ति ने इस कंप्यूटर को सेट किया है, उसने इस साइट को ब्लॉक करना चुना है.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">पेज को नए गुप्त टैब में खोलें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 50bfe50..fb468fd 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />pokrenuti Mrežnu dijagnostiku<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Prevedi ovu stranicu</translation> <translation id="2479410451996844060">Nevažeći URL pretraživanja.</translation> -<translation id="2482370039860827034">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> <translation id="2482878487686419369">Obavijesti</translation> <translation id="248348093745724435">Pravila uređaja</translation> <translation id="2491120439723279231">Certifikat poslužitelja sadrži pogreške.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Zaštitite račun</translation> <translation id="2515629240566999685">provjerite jačinu signala na svom području</translation> <translation id="2521385132275182522">Spajanje pri dnu desno</translation> -<translation id="2521483867890026383">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i druge web-lokacije na kojima koristite tu zaporku i odmah je promijenite.</translation> <translation id="2523886232349826891">Sprema se samo na ovom uređaju</translation> <translation id="2524461107774643265">Dodajte još podataka</translation> <translation id="2535659140340599600">{COUNT,plural, =1{i još jedan sudionik}one{i još #}few{i još #}other{i još #}}</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index c00777b..f661160 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -603,6 +603,7 @@ <translation id="3828924085048779000">Az üres összetett jelszó nem engedélyezett.</translation> <translation id="3831915413245941253">A(z) <ph name="ENROLLMENT_DOMAIN" /> bővítményeket telepített további funkciók használata céljából. A bővítmények hozzáférhetnek az Ön bizonyos adataihoz.</translation> <translation id="3832522519263485449">Több lyuk a bal oldalon</translation> +<translation id="3838154488026099170">Megtévesztő webhelyen adta meg jelszavát. A Chromium azt javasolja, hogy keresse fel azokat a webhelyeket (pl. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> és <ph name="WEBSITE_3" />), amelyeken ezt a jelszót használja, és módosítsa most a jelszót.</translation> <translation id="385051799172605136">Vissza</translation> <translation id="3858027520442213535">Dátum és idő frissítése</translation> <translation id="3884278016824448484">Eszközazonosító-ütközés</translation> @@ -640,6 +641,7 @@ <translation id="4072486802667267160">Hiba történt a rendelés feldolgozása közben. Kérjük, próbálja újra.</translation> <translation id="4075732493274867456">Az ügyfél és a szerver nem támogat ugyanolyan SSL-protokollverziót vagy rejtjelezési csomagot.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Megtévesztő webhelyen adta meg jelszavát. A Chrome azt javasolja, hogy keresse fel azokat a webhelyeket (pl. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> és <ph name="WEBSITE_3" />), amelyeken ezt a jelszót használja, és módosítsa most a jelszót.</translation> <translation id="4079302484614802869">A proxykonfiguráció a .pac típusú szkript URL-cím, nem pedig a fix proxyszerverek használatára van beállítva.</translation> <translation id="4082393374666368382">Beállítások – kezelés</translation> <translation id="4098354747657067197">Megtévesztő webhely megnyitására készül</translation> @@ -719,6 +721,7 @@ <translation id="4356973930735388585">Előfordulhat, hogy a támadók ezen a webhelyen olyan veszélyes programokat próbálnak telepíteni számítógépére, amelyek ellopják vagy törlik adatait (például fotóit, jelszavait, üzeneteit vagy bankkártyájának adatait).</translation> <translation id="4358059973562876591">A DnsOverHttpsMode házirenddel kapcsolatos hiba miatt előfordulhat, hogy a megadott sablonok nem alkalmazhatók.</translation> <translation id="4358461427845829800">Fizetési módok kezelése…</translation> +<translation id="4359160567981085931">Megtévesztő webhelyen adta meg jelszavát. A Chrome segíthet. Ha módosítani szeretné jelszavát, és értesíteni szeretné a Google-t arról, hogy fiókja veszélyben lehet, kattintson a Fiók védelme gombra.</translation> <translation id="4367563149485757821">Number-12 (boríték)</translation> <translation id="437058704415269440">Számlaegyenleg</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -994,6 +997,7 @@ <translation id="5728056243719941842">C5 (boríték)</translation> <translation id="5730040223043577876">A Chrome azt javasolja, hogy adjon meg új jelszót a régi helyett, ha azt más webhelyeken is használta.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Kártya mentése a Google-fiókba}other{Kártyák mentése a Google-fiókba}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Virtuális szám használata ehhez a kártyához}other{Kártya kiválasztása}}</translation> <translation id="5763042198335101085">Érvényes e-mail-címet adjon meg</translation> <translation id="5763703224595565476">Az adminisztrátor engedélyezte a Chrome Enterprise felhasználóvédelmi funkcióját a böngészőben. A Chrome Enterprise felhasználóvédelmi funkciója hozzáfér az Ön bizonyos adataihoz.</translation> <translation id="5765072501007116331">A kézbesítési módok és követelmények megtekintéséhez válassza ki a címet</translation> @@ -1010,6 +1014,7 @@ <translation id="5804241973901381774">Engedélyek</translation> <translation id="5810442152076338065">A(z) <ph name="DOMAIN" /> domainnel való kapcsolata elavult kriptográfiával van titkosítva.</translation> <translation id="5813119285467412249">&Hozzáadás újra</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{A rendszer fizetéskor ezt a kártyát terheli meg, de a kártya valódi számát nem osztja meg ezzel a webhellyel. A további védelem érdekében ideiglenes CVC-t is generál.}other{A rendszer fizetéskor az Ön által kiválasztott kártyát terheli meg, de a kártya valódi számát nem osztja meg ezzel a webhellyel. A további védelem érdekében ideiglenes CVC-t is generál.}}</translation> <translation id="583281660410589416">Ismeretlen</translation> <translation id="5838278095973806738">Ne írjon be semmilyen bizalmas adatot (például jelszót vagy hitelkártyaadatot) a webhelyen, mivel a támadók ellophatják.</translation> <translation id="5851548754964597211">Laplista</translation> @@ -1467,6 +1472,7 @@ <translation id="8042918947222776840">Átvételi mód kiválasztása</translation> <translation id="8057711352706143257">A(z) „<ph name="SOFTWARE_NAME" />” nincs megfelelően beállítva. A(z) „<ph name="SOFTWARE_NAME" />” eltávolítása általában megoldja a problémát. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Sajnos hiba történt.</translation> +<translation id="8067872629359326442">Megtévesztő webhelyen adta meg jelszavát. A Chromium segíthet. Ha módosítani szeretné jelszavát, és értesíteni szeretné a Google-t arról, hogy fiókja veszélyben lehet, kattintson a Fiók védelme gombra.</translation> <translation id="8074253406171541171">10x13 (boríték)</translation> <translation id="8078141288243656252">Elforgatott állapotban nem lehetséges a jegyzetelés</translation> <translation id="8079031581361219619">Újratölti a webhelyet?</translation> @@ -1483,6 +1489,7 @@ <translation id="8105368624971345109">Kikapcsolás</translation> <translation id="8118489163946903409">Fizetési mód</translation> <translation id="8127301229239896662">A(z) „<ph name="SOFTWARE_NAME" />” nem megfelelően lett telepítve a számítógépre vagy a hálózatra. A probléma elhárítása érdekében forduljon rendszergazdájához.</translation> +<translation id="8128526133099929547">Megtévesztő webhelyen adta meg jelszavát. A Chrome azt javasolja, hogy keresse fel azokat a webhelyeket (pl. <ph name="WEBSITE_1" />), amelyeken ezt a jelszót használja, és módosítsa most a jelszót.</translation> <translation id="8131740175452115882">Megerősítés</translation> <translation id="8149426793427495338">Számítógépe alvó üzemmódba váltott.</translation> <translation id="8150722005171944719">A fájl (<ph name="URL" />) nem olvasható. Lehet, hogy eltávolították, áthelyezték, vagy a fájlengedélyek megakadályozzák a hozzáférést.</translation> @@ -1500,6 +1507,7 @@ <translation id="8218327578424803826">Hozzárendelt helyszín:</translation> <translation id="8220146938470311105">C7/C6 (boríték)</translation> <translation id="8220639454292072926">Vállalati jelentéskészítés</translation> +<translation id="8221250263817408492">Megtévesztő webhelyen adta meg jelszavát. A Chromium azt javasolja, hogy keresse fel azokat a webhelyeket (pl. <ph name="WEBSITE_1" />), amelyeken ezt a jelszót használja, és módosítsa most a jelszót.</translation> <translation id="8225771182978767009">A számítógépet beállító személy a webhely letiltása mellett döntött.</translation> <translation id="822964464349305906"><ph name="TYPE_1" /> és <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Oldal megnyitása új inkognitóablakban</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 2154c91..ec063233 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">Անցաբառի դաշտը չի կարող դատարկ լինել:</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> կայքը լրացուցիչ գործառույթների համար ընդլայնումներ է տեղադրել: Ձեր տվյալների մի մասը հասանելի է այդ ընդլայնումներին:</translation> <translation id="3832522519263485449">Մի քանի անցք ձախ կողմում</translation> +<translation id="3838154488026099170">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> և այլ կայքերում։</translation> <translation id="385051799172605136">Հետ</translation> <translation id="3858027520442213535">Թարմացնել ամսաթիվը և ժամը</translation> <translation id="3884278016824448484">Սարքերի նույնացուցիչների ընդհարում</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Վճարումը մշակելու ընթացքում սխալ առաջացավ: Նորից փորձեք:</translation> <translation id="4075732493274867456">Սպասառուն և սերվերը չեն աջակցում SSL հաղորդակարգի միևնույն տարբերակը կամ ծածկագրման լրակազմը:</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> և այլ կայքերում։</translation> <translation id="4079302484614802869">Պրոքսի-սերվերի կազմաձևումը նախատեսում է PAC սկրիպտների URL-ների օգտագործում՝ ֆիքսված պրոքսի-սերվերների փոխարեն:</translation> <translation id="4082393374666368382">Կարգավորումներ – Կառավարում</translation> <translation id="4098354747657067197">Դուք պատրաստվում եք խաբուսիկ կայք այցելել</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Այս կայքում գտնվող հարձակվողները կարող են վտանգավոր ծրագրեր տեղադրել ձեր համակարգչում, որոնք կարող են գողանալ կամ ջնջել ձեր տեղեկությունները (օրինակ՝ լուսանկարները, գաղտնաբառերը, նամակները և վարկային քարտերը):</translation> <translation id="4358059973562876591">Ձեր նշած ձևանմուշները չեն կարող կիրառվել DnsOverHttpsMode կանոնի հետ կապված սխալի պատճառով:</translation> <translation id="4358461427845829800">Վճարման եղանակների կառավարում...</translation> +<translation id="4359160567981085931">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Chrome-ը կարող է օգնել։ Որպեսզի գաղտնաբառը փոխեք և Google-ին տեղեկացնեք, որ ձեր հաշիվը վտանգված է, սեղմեք «Պաշտպանել հաշիվը»։</translation> <translation id="4367563149485757821">Number-12 (ծրար)</translation> <translation id="437058704415269440">Հաշվի մնացորդը</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (ծրար)</translation> <translation id="5730040223043577876">Խորհուրդ ենք տալիս վերակայել ձեր գաղտնաբառը, եթե այն օգտագործել եք այլ կայքերում:</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Պահեք քարտը Google հաշվում}one{Պահեք քարտը Google հաշվում}other{Պահեք քարտերը Google հաշվում}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Այս քարտի համար օգտագործեք վիրտուալ համար}one{Ընտրեք քարտը}other{Ընտրեք քարտը}}</translation> <translation id="5763042198335101085">Մուտքագրեք վավեր էլ․ հասցե</translation> <translation id="5763703224595565476">Ադմինիստրատորը միացրել է Chrome Enterprise օգտատերերի պաշտպանության համակարգը ձեր դիտարկիչում։ Chrome Enterprise օգտատերերի պաշտպանության համակարգին հասանելի են ձեր որոշակի տվյալները։</translation> <translation id="5765072501007116331">Առաքման եղանակներն ու պայմանները տեսնելու համար ընտրեք հասցե</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Թույլտվություններ</translation> <translation id="5810442152076338065">Կապակցումը <ph name="DOMAIN" />-ի հետ օգտագործում է հնացած գաղտնագրում:</translation> <translation id="5813119285467412249">&Վերարկել հավելումը</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Երբ վճարում կատարեք, գումարը կգանձվի այս քարտից, սակայն քարտի իրական համարը չի տրամադրվի այս կայքին։ Անվտանգության նկատառումներով կստեղծվի ժամանակավոր CVC։}one{Երբ վճարում կատարեք, գումարը կգանձվի ձեր ընտրած քարտից, սակայն քարտի իրական համարը չի տրամադրվի այս կայքին։ Անվտանգության նկատառումներով կստեղծվի ժամանակավոր CVC։}other{Երբ վճարում կատարեք, գումարը կգանձվի ձեր ընտրած քարտից, սակայն քարտի իրական համարը չի տրամադրվի այս կայքին։ Անվտանգության նկատառումներով կստեղծվի ժամանակավոր CVC։}}</translation> <translation id="583281660410589416">Անհայտ</translation> <translation id="5838278095973806738">Մի մուտքագրեք գաղտնի տվյալներ այս կայքում (օր.` գաղտնաբառերը կամ վարկային քարտի տվյալները), քանի որ դրանք կարող են հայտնի դառնալ հարձակվողներին։</translation> <translation id="5851548754964597211">Ներդիրների ցանկ</translation> @@ -1094,7 +1099,7 @@ <translation id="6221345481584921695">Վերջերս Google Safe Browsing-ը <ph name="BEGIN_LINK" />վնասագիր է հայտնաբերել<ph name="END_LINK" /> <ph name="SITE" /> կայքում: Նույնիսկ ապահով վեբկայքերը երբեմն վնասվում են վնասագրերով: Այս վնասարար բովանդակությունը գալիս է <ph name="SUBRESOURCE_HOST" /> կայքից, որը վնասագրերի հայտնի տարածող է:</translation> <translation id="6234122620015464377">Կտրել յուրաքանչյուր փաստաթղթից հետո</translation> <translation id="6240447795304464094">Google Pay-ի լոգո</translation> -<translation id="6241121617266208201">Թաքցել հուշումները</translation> +<translation id="6241121617266208201">Թաքցնել հուշումները</translation> <translation id="6251924700383757765">Գաղտնիության քաղաքականություն</translation> <translation id="6254436959401408446">Այս էջը բացելու համար բավարար տարածք չկա</translation> <translation id="625755898061068298">Զգուշացումներն անջատված են այս կայքի համար:</translation> @@ -1313,7 +1318,7 @@ <translation id="733923710415886693">Սերվերի վկայագիրը չի բացահայտվել «Վկայագրերի թափանցիկություն» կանոնի միջոցով:</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Փոխկապակցված է՝</translation> -<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> տիրույթի ադմինիստրատորը միացրել է Chrome Enterprise օգտատերերի պաշտպանության համակարգը ձեր դիտարկիչում։ Chrome Enterprise օգտատերերի պաշտպանության համակարգին հասանելի են ձեր որոշակի տվյալները։</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> տիրույթի ադմինիստրատորը միացրել է Chrome Enterprise օգտատերերի պաշտպանության համակարգը ձեր դիտարկիչում։ Chrome Enterprise օգտատերերի պաշտպանության համակարգին հասանելի են ձեր տվյալներից որոշները։</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Հրամանատող</translation> <translation id="7372973238305370288">որոնման արդյունք</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">Ընտրեք ստացման եղանակը</translation> <translation id="8057711352706143257">«<ph name="SOFTWARE_NAME" />» ծրագիրը սխալ է կազմաձևված: Ապատեղադրեք «<ph name="SOFTWARE_NAME" />» ծրագիրը: Դրանով սովորաբար խնդիրը լուծվում է: <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Սխալ առաջացավ:</translation> +<translation id="8067872629359326442">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Chromium-ը կարող է օգնել։ Որպեսզի գաղտնաբառը փոխեք և Google-ին տեղեկացնեք, որ ձեր հաշիվը վտանգված է, սեղմեք «Պաշտպանել հաշիվը»։</translation> <translation id="8074253406171541171">10x13 (ծրար)</translation> <translation id="8078141288243656252">Հնարավոր չէ ծանոթագրություն ավելացնել, երբ փաստաթուղթը պտտված է</translation> <translation id="8079031581361219619">Վերաբեռնե՞լ կայքը</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">Անջատել</translation> <translation id="8118489163946903409">Վճարման եղանակ</translation> <translation id="8127301229239896662">«<ph name="SOFTWARE_NAME" />» ծրագիրը ձեր համակարգչում կամ ցանցում ճիշտ չէ տեղադրվել: Հարցրեք ձեր ՏՏ ադմինիստրատորին կամ ինքներդ լուծեք այս խնդիրը:</translation> +<translation id="8128526133099929547">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> և այլ կայքերում։</translation> <translation id="8131740175452115882">Հաստատել</translation> <translation id="8149426793427495338">Ձեր համակարգիչը մտել է քնի ռեժիմ:</translation> <translation id="8150722005171944719"><ph name="URL" />-ում գտնվող ֆայլը ընթեռնելի չէ: Հնարավոր է, այն հեռացվել է, տեղափոխվել կամ ֆայլի թույլտվությունները կանխում են մուտքը:</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">Նշանակված տեղադրություն՝</translation> <translation id="8220146938470311105">C7/C6 (ծրար)</translation> <translation id="8220639454292072926">Enterprise հաշվետվություններ</translation> +<translation id="8221250263817408492">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> և այլ կայքերում։</translation> <translation id="8225771182978767009">Անձն, ով կարգավորել է այս համակարգիչը, նշել է, որպեսզի այս կայքն արգելափակվի:</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Բացել էջը նոր ինկոգնիտո ներդիրում</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index a3a16b0..22ccd7bf 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">Frasa sandi kosong tidak dibolehkan.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> telah menginstal ekstensi untuk fungsi tambahan. Ekstensi memiliki akses ke sebagian data Anda.</translation> <translation id="3832522519263485449">Beberapa lubang di kiri</translation> +<translation id="3838154488026099170">Anda baru saja memasukkan sandi ke situs penipuan. Chromium merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" />, serta situs lain tempat Anda menggunakan sandi ini dan mengubahnya sekarang.</translation> <translation id="385051799172605136">Mundur</translation> <translation id="3858027520442213535">Perbarui tanggal dan waktu</translation> <translation id="3884278016824448484">Pengenal perangkat bertentangan</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Terjadi error saat memproses pesanan Anda. Harap coba lagi.</translation> <translation id="4075732493274867456">Klien dan server tidak mendukung versi protokol SSL umum atau cipher suite.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Anda baru saja memasukkan sandi ke situs penipuan. Chrome merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" />, serta situs lain tempat Anda menggunakan sandi ini dan mengubahnya sekarang.</translation> <translation id="4079302484614802869">Konfigurasi proxy disetel untuk menggunakan URL skrip .pac, bukan server proxy yang tetap.</translation> <translation id="4082393374666368382">Setelan - Pengelolaan</translation> <translation id="4098354747657067197">Situs yang akan dibuka berisi penipuan</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Penyerang di situs ini mungkin berusaha memasang program berbahaya di komputer Anda yang dapat mencuri atau menghapus informasi (misalnya, foto, sandi, pesan, dan kartu kredit).</translation> <translation id="4358059973562876591">Template yang telah Anda tentukan mungkin tidak diterapkan karena terjadi error dengan kebijakan DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Kelola metode pembayaran...</translation> +<translation id="4359160567981085931">Anda baru saja memasukkan sandi ke situs penipuan. Chrome dapat membantu. Untuk mengubah sandi dan memberi tahu Google bahwa akun Anda mungkin berisiko, klik Lindungi Akun.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Saldo Rekening</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Chrome menyarankan untuk menyetel ulang sandi jika Anda juga menggunakannya di situs lain.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Simpan kartu di Akun Google Anda}other{Simpan kartu di Akun Google Anda}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Gunakan nomor virtual untuk kartu ini}other{Pilih kartu}}</translation> <translation id="5763042198335101085">Masukkan alamat email yang valid</translation> <translation id="5763703224595565476">Administrator Anda telah mengaktifkan Perlindungan Pengguna Chrome Enterprise di browser Anda. Perlindungan Pengguna Chrome Enterprise memiliki akses ke beberapa data Anda.</translation> <translation id="5765072501007116331">Untuk melihat persyaratan dan metode pengiriman, pilih alamat</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Izin</translation> <translation id="5810442152076338065">Sambungan Anda ke <ph name="DOMAIN" /> dienkripsi menggunakan cipher suite yang sudah usang.</translation> <translation id="5813119285467412249">&Ulangi Penambahan</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Kartu ini akan ditagih saat Anda membayar, tetapi nomor yang sebenarnya tidak akan dibagikan ke situs ini. Sebagai keamanan tambahan, CVC sementara akan diberikan.}other{Kartu yang Anda pilih akan ditagih saat Anda membayar, tetapi nomor yang sebenarnya tidak akan dibagikan ke situs ini. Sebagai keamanan tambahan, CVC sementara akan diberikan.}}</translation> <translation id="583281660410589416">Tidak dikenal</translation> <translation id="5838278095973806738">Jangan masukkan informasi sensitif apa pun di situs ini (misalnya, sandi atau kartu kredit), karena penyerang dapat mencurinya.</translation> <translation id="5851548754964597211">Daftar tab</translation> @@ -1468,6 +1473,7 @@ <translation id="8042918947222776840">Pilih Metode Pengambilan</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" tidak dikonfigurasi dengan benar. Biasanya masalah akan terselesaikan dengan meng-uninstal "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Maaf, terjadi error.</translation> +<translation id="8067872629359326442">Anda baru saja memasukkan sandi ke situs penipuan. Chromium dapat membantu. Untuk mengubah sandi dan memberi tahu Google bahwa akun Anda mungkin berisiko, klik Lindungi Akun.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">Tidak dapat menambahkan anotasi saat diputar</translation> <translation id="8079031581361219619">Muat ulang situs?</translation> @@ -1484,6 +1490,7 @@ <translation id="8105368624971345109">Nonaktifkan</translation> <translation id="8118489163946903409">Metode pembayaran</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" tidak diinstal dengan benar di komputer atau jaringan Anda. Mintalah administrator IT untuk menyelesaikan masalah ini.</translation> +<translation id="8128526133099929547">Anda baru saja memasukkan sandi ke situs penipuan. Chrome merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> serta situs lain tempat Anda menggunakan sandi ini dan mengubahnya sekarang.</translation> <translation id="8131740175452115882">Konfirmasi</translation> <translation id="8149426793427495338">Komputer Anda sedang dalam mode tidur.</translation> <translation id="8150722005171944719">File pada <ph name="URL" /> tidak dapat dibaca. File mungkin telah dihapus, dipindahkan, atau izin file mungkin mencegah akses.</translation> @@ -1501,6 +1508,7 @@ <translation id="8218327578424803826">Lokasi yang Ditetapkan:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">Pelaporan Perusahaan</translation> +<translation id="8221250263817408492">Anda baru saja memasukkan sandi ke situs penipuan. Chromium merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> serta situs lain tempat Anda menggunakan sandi ini dan mengubahnya sekarang.</translation> <translation id="8225771182978767009">Orang yang menyiapkan komputer ini telah memilih untuk memblokir situs ini.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Buka halaman dalam tab Samaran baru</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index a42da78..c4ab8e0b 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -327,7 +327,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Keyrir netgreiningu<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Þýða þessa síðu</translation> <translation id="2479410451996844060">Ógild leitarvefslóð.</translation> -<translation id="2482370039860827034">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chrome mælir með því að þú farir á <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og önnur vefsvæði þar sem þú notar þetta aðgangsorð og breytir því núna.</translation> <translation id="2482878487686419369">Tilkynningar</translation> <translation id="248348093745724435">Vélareglur</translation> <translation id="2491120439723279231">Vottorð þjónsins inniheldur villur.</translation> @@ -340,7 +339,6 @@ <translation id="2505268675989099013">Vernda reikning</translation> <translation id="2515629240566999685">Athuga merkið á þínu svæði</translation> <translation id="2521385132275182522">Hefti neðst til hægri</translation> -<translation id="2521483867890026383">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chromium mælir með því að þú farir á <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og önnur vefsvæði þar sem þú notar þetta aðgangsorð og breytir því núna.</translation> <translation id="2523886232349826891">Aðeins vistað í þessu tæki</translation> <translation id="2524461107774643265">Bæta við fleiri upplýsingum</translation> <translation id="2535659140340599600">{COUNT,plural, =1{og 1 í viðbót}one{og # í viðbót}other{og # í viðbót}}</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 16e40d5..6c78971 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Eseguire lo strumento Diagnostica di rete<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Traduci questa pagina</translation> <translation id="2479410451996844060">URL ricerca non valido.</translation> -<translation id="2482370039860827034">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di visitare i siti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e altri siti in cui utilizzi questa password e di cambiarla subito.</translation> <translation id="2482878487686419369">Notifiche</translation> <translation id="248348093745724435">Norme macchina</translation> <translation id="2491120439723279231">Il certificato del server contiene degli errori.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Proteggi account</translation> <translation id="2515629240566999685">Controllare il segnale nella tua area</translation> <translation id="2521385132275182522">Pinzatura in basso a destra</translation> -<translation id="2521483867890026383">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di visitare i siti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e altri siti in cui utilizzi questa password e di cambiarla subito.</translation> <translation id="2523886232349826891">Salvataggio effettuato solo su questo dispositivo</translation> <translation id="2524461107774643265">Aggiungi altre informazioni</translation> <translation id="2535659140340599600">{COUNT,plural, =1{e 1 altro}other{e altro #}}</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 5740f30..fa26b7a 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -592,6 +592,7 @@ <translation id="3828924085048779000">パスフレーズは必ず指定してください。</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> によって、機能を追加する拡張機能がインストールされました。この拡張機能では、ユーザーデータの一部にアクセスする場合があります。</translation> <translation id="3832522519263485449">多穴パンチ(左)</translation> +<translation id="3838154488026099170">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> のほか、このパスワードを使用しているサイトで、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="385051799172605136">戻る</translation> <translation id="3858027520442213535">日時を更新</translation> <translation id="3884278016824448484">競合するデバイス識別子です</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">ご注文の処理中にエラーが発生しました。もう一度お試しください。</translation> <translation id="4075732493274867456">クライアントとサーバーで、共通の SSL プロトコル バージョンまたは暗号スイートがサポートされていません。</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> のほか、このパスワードを使用しているサイトで、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="4079302484614802869">プロキシは固定プロキシ サーバーではなく .pac スクリプト URL を使用するように設定されています。</translation> <translation id="4082393374666368382">設定 - 管理</translation> <translation id="4098354747657067197">偽のサイトにアクセスしようとしています</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">このサイトを利用すると、悪意のあるユーザーによって、危険なプログラム(写真、パスワード、メッセージ、クレジット カード番号などの情報を盗み取るか削除するプログラム)がお使いのパソコンにインストールされる可能性があります。</translation> <translation id="4358059973562876591">DnsOverHttpsMode ポリシーに問題があるため、指定したテンプレートを適用できない可能性があります。</translation> <translation id="4358461427845829800">お支払い方法を管理...</translation> +<translation id="4359160567981085931">偽のサイトでパスワードを入力しました。Chrome を使って不正利用への対策ができます。パスワードを変更し、Google にアカウントの状況を通知するには、[アカウントを保護] をクリックしてください。</translation> <translation id="4367563149485757821">Number-12(封筒)</translation> <translation id="437058704415269440">アカウント残高</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -982,6 +985,7 @@ <translation id="5728056243719941842">C5(封筒)</translation> <translation id="5730040223043577876">パスワードを他のサイトで再使用した場合、Chrome ではパスワードの再設定を促すメッセージが表示されます。</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Google アカウントにカードを保存}other{Google アカウントにカードを保存}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{このカードの仮想番号を使用}other{カードを選択してください}}</translation> <translation id="5763042198335101085">有効なメールアドレスを入力してください</translation> <translation id="5763703224595565476">管理者により、お使いのブラウザで Chrome Enterprise User Protect が有効化されています。Chrome Enterprise User Protect には、一部のユーザーデータへのアクセスが許可されます。</translation> <translation id="5765072501007116331">配達方法と要件を確認するには、住所を選択してください</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">権限</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> への接続は古い暗号スイートにより暗号化されています。</translation> <translation id="5813119285467412249">追加のやり直し(&R)</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{お支払いの際はこのカードに請求が行われますが、カード番号はこのサイトと共有されません。追加のセキュリティとして、一時 CVC コードが生成されます。}other{お支払いの際は選択したカードに請求が行われますが、カード番号はこのサイトと共有されません。追加のセキュリティとして、一時 CVC コードが生成されます。}}</translation> <translation id="583281660410589416">不明</translation> <translation id="5838278095973806738">このサイトでは機密情報(パスワード、クレジット カードなど)を入力しないでください。悪意のあるユーザーに情報が盗まれる恐れがあります。</translation> <translation id="5851548754964597211">タブ リスト</translation> @@ -1455,6 +1460,7 @@ <translation id="8042918947222776840">集荷方法を選択</translation> <translation id="8057711352706143257">「<ph name="SOFTWARE_NAME" />」が正しく設定されていません。通常、この問題は「<ph name="SOFTWARE_NAME" />」をアンインストールすることで解決します。<ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">エラーが発生しました。</translation> +<translation id="8067872629359326442">偽のサイトでパスワードを入力しました。Chromium を使って不正利用への対策ができます。パスワードを変更し、Google にアカウントの状況を通知するには、[アカウントを保護] をクリックしてください。</translation> <translation id="8074253406171541171">10x13(封筒)</translation> <translation id="8078141288243656252">回転時に注釈を追加することはできません</translation> <translation id="8079031581361219619">このサイトを再読み込みしますか?</translation> @@ -1471,6 +1477,7 @@ <translation id="8105368624971345109">オフにする</translation> <translation id="8118489163946903409">お支払い方法</translation> <translation id="8127301229239896662">「<ph name="SOFTWARE_NAME" />」がパソコンまたはネットワークに正しくインストールされていません。管理者にこの問題を解決するよう依頼してください。</translation> +<translation id="8128526133099929547">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> のほか、このパスワードを使用しているサイトで、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="8131740175452115882">確認</translation> <translation id="8149426793427495338">パソコンがスリープ状態です。</translation> <translation id="8150722005171944719"><ph name="URL" /> のファイルを読むことができません。削除されたか移動された可能性があります。ファイルに対するアクセス権がない場合もあります。</translation> @@ -1488,6 +1495,7 @@ <translation id="8218327578424803826">割り当てられた場所:</translation> <translation id="8220146938470311105">C7 / C6(封筒)</translation> <translation id="8220639454292072926">企業レポート</translation> +<translation id="8221250263817408492">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> のほか、このパスワードを使用しているサイトで、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="8225771182978767009">このサイトは、このパソコンを設定したユーザーによってブロックされています。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">ページを新しいシークレット タブで開く</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 97d52c0..112eb94 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -592,6 +592,7 @@ <translation id="3828924085048779000">ცარიელი პაროლი ნებადართული არ არის.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" />-მა დააინსტალირა დამატებითი ფუნქციების გაფართოებები. აღნიშნულ გაფართოებებს აქვს წვდომა თქვენს ზოგიერთ მონაცემზე.</translation> <translation id="3832522519263485449">მრავალად გახვრეტა მარცხნივ</translation> +<translation id="3838154488026099170">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium გირჩევთ, ახლავე გადახვიდეთ <ph name="WEBSITE_1" />-ზე, <ph name="WEBSITE_2" />-ზე, <ph name="WEBSITE_3" />-სა და სხვა საიტებზე, სადაც ამ პაროლს იყენებთ, შემდეგ კი შეცვალოთ ის.</translation> <translation id="385051799172605136">უკან</translation> <translation id="3858027520442213535">განახლების თარიღი და დრო</translation> <translation id="3884278016824448484">კონფლიქტური მოწყობილობის იდენტიფიკატორი</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">თქვენი შეკვეთის დამუშავება ვერ მოხერხდა. გთხოვთ, ცადოთ ხელახლა.</translation> <translation id="4075732493274867456">კლიენტისა და სერვერის მიერ არ არის მხარდაჭერილი SSL პროტოკოლის საერთო ვერსია ან შიფრატორების ნაკრები.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome გირჩევთ, ახლავე გადახვიდეთ <ph name="WEBSITE_1" />-ზე, <ph name="WEBSITE_2" />-ზე, <ph name="WEBSITE_3" />-სა და სხვა საიტებზე, სადაც ამ პაროლს იყენებთ, შემდეგ კი შეცვალოთ ის.</translation> <translation id="4079302484614802869">პროქსის კონფიგურაცია დაყენებულია .pac სკრიპტის URL-ის გამოსაყენებლად, ფიქსირებული პროქსი სერვერების ნაცვლად.</translation> <translation id="4082393374666368382">პარამეტრები — მართვა</translation> <translation id="4098354747657067197">მოერიდეთ შეცდომაში შემყვან საიტს</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">თავდამსხმელებმა ამ საიტზე შეიძლება ცადონ თქვენს კომპიუტერში ისეთი სახიფათო პროგრამების დაინსტალირება, რომლებიც წაშლის ან მოიპარავს თქვენს ინფორმაციას (მაგალითად, ფოტოებს, პაროლებს, შეტყობინებებს და საკრედიტო ბარათების მონაცემებს).</translation> <translation id="4358059973562876591">თქვენ მიერ მითითებული შაბლონების მისადაგება შეიძლება ვერ მოხერხდეს „DnsOverHttpsMode“ წესებთან დაკავშირებული პრობლემის გამო.</translation> <translation id="4358461427845829800">გადახდის მეთოდების მართვა…</translation> +<translation id="4359160567981085931">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome-ს შეუძლია თქვენი დახმარება. პაროლის შესაცვლელად და თქვენი ანგარიშის საფრთხეში ყოფნის შესახებ Google-ის საქმის კურსში ჩასაყენებლად, დაწკაპუნებით აირჩიეთ „ანგარიშის დაცვა“.</translation> <translation id="4367563149485757821">Number-12 (კონვერტი)</translation> <translation id="437058704415269440">ანგარიშის ბალანსი</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -982,8 +985,9 @@ <translation id="5728056243719941842">C5 (კონვერტი)</translation> <translation id="5730040223043577876">Chrome გირჩევთ, გადააყენოთ თქვენი პაროლი, თუ მას სხვა საიტებზეც იყენებთ.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{შეინახეთ ბარათი თქვენს Google ანგარიშში}other{შეინახეთ ბარათები თქვენს Google ანგარიშში}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{გამოიყენეთ ვირტუალური ნომერი ამ ბარათისთვის}other{აირჩიეთ ბარათი}}</translation> <translation id="5763042198335101085">შეიყვანეთ ელფოსტის სწორი მისამართი</translation> -<translation id="5763703224595565476">თქვენმა ადმინისტრატორმა თქვენი ბრაუზერისთვის ჩართო Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქცია. Chrome Enterprise-ის მომხმარებლების დავის ფუნქციას წვდომა აქვს თქვენს გარკვეულ მონაცემებზე.</translation> +<translation id="5763703224595565476">თქვენმა ადმინისტრატორმა თქვენი ბრაუზერისთვის ჩართო Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქცია. Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქციას წვდომა აქვს თქვენს გარკვეულ მონაცემებზე.</translation> <translation id="5765072501007116331">მიწოდების მეთოდებისა და მოთხოვნების სანახავად აირჩიეთ მისამართი</translation> <translation id="5778550464785688721">MIDI მოწყობილობების სრული კონტროლი</translation> <translation id="5781136890105823427">ექსპერიმენტი ჩართულია</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">ნებართვები</translation> <translation id="5810442152076338065">თქვენი კავშირი <ph name="DOMAIN" />-თან დაშიფრულია შიფრთა მოძველებული ნაკრებით.</translation> <translation id="5813119285467412249">დამატების &გამეორება</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{გადახდისას ამ ბარათიდან თანხა ჩამოიჭრება, თუმცა მისი ნამდვილი ნომერი არ გაზიარდება ამ საიტთან. დამატებითი უსაფრთხოებისთვის შეიქმნება დროებითი CVC.}other{გადახდისას თქვენ მიერ არჩეული ბარათიდან თანხა ჩამოიჭრება, თუმცა მისი ნამდვილი ნომერი არ გაზიარდება ამ საიტთან. დამატებითი უსაფრთხოებისთვის შეიქმნება დროებითი CVC.}}</translation> <translation id="583281660410589416">უცნობი</translation> <translation id="5838278095973806738">გირჩევთ, არ შეიყვანოთ კონფიდენციალური ინფორმაცია (მაგალითად, პაროლები ან საკრედიტო ბარათების მონაცემები) ამ საიტზე, რადგან თავდამსხმელებს მისი მოპარვა შეუძლიათ.</translation> <translation id="5851548754964597211">ჩანართების სია</translation> @@ -1298,7 +1303,7 @@ <translation id="733923710415886693">სერვერის სერტიფიკატის გამოქვეყნება სერტიფიკატთა გამჭვირვალობის შესახებ წესების შესაბამისად არ მომხდარა.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">აფილირებულობა:</translation> -<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" />-მა თქვენი ბრაუზერისთვის ჩართო Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქცია. Chrome Enterprise-ის მომხმარებლების დავის ფუნქციას წვდომა აქვს თქვენს გარკვეულ მონაცემებზე.</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" />-მა თქვენი ბრაუზერისთვის ჩართო Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქცია. Chrome Enterprise-ის მომხმარებლების დაცვის ფუნქციას წვდომა აქვს თქვენს გარკვეულ მონაცემებზე.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">ბრძანების სტრიქონი</translation> <translation id="7372973238305370288">ძიების შედეგი</translation> @@ -1455,6 +1460,7 @@ <translation id="8042918947222776840">წამოღების მეთოდის არჩევა</translation> <translation id="8057711352706143257">„<ph name="SOFTWARE_NAME" />“ არასწორად არის კონფიგურირებული. როგორც წესი, პრობლემის მოგვარებაში უნდა დაგეხმაროთ „<ph name="SOFTWARE_NAME" />“-ის დეინსტალაცია. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">სამწუხაროდ, წარმოიქმნა შეფერხება.</translation> +<translation id="8067872629359326442">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium-ს შეუძლია თქვენი დახმარება. პაროლის შესაცვლელად და თქვენი ანგარიშის საფრთხეში ყოფნის შესახებ Google-ის საქმის კურსში ჩასაყენებლად, დაწკაპუნებით აირჩიეთ „ანგარიშის დაცვა“.</translation> <translation id="8074253406171541171">10x13 (კონვერტი)</translation> <translation id="8078141288243656252">შეტრიალებულ მდგომარეობაში ანოტირება ვერ მოხერხდება</translation> <translation id="8079031581361219619">გსურთ საიტის ხელახლა ჩატვირთვა?</translation> @@ -1471,6 +1477,7 @@ <translation id="8105368624971345109">გამორთვა</translation> <translation id="8118489163946903409">გადახდის მეთოდი</translation> <translation id="8127301229239896662">„<ph name="SOFTWARE_NAME" />“ არასათანადოდ დაინსტალირდა თქვენს კომპიუტერზე ან ქსელში. სთხოვეთ თქვენს IT ადმინისტრატორს ამ პრობლემის მოგვარება.</translation> +<translation id="8128526133099929547">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome გირჩევთ, ახლავე გადახვიდეთ <ph name="WEBSITE_1" />-ზე და სხვა საიტებზე, სადაც ამ პაროლს იყენებთ, შემდეგ კი შეცვალოთ ის.</translation> <translation id="8131740175452115882">დაადასტურება</translation> <translation id="8149426793427495338">თქვენი კომპიუტერი ძილის რეჟიმზე გადავიდა.</translation> <translation id="8150722005171944719">ფაილი <ph name="URL" />-ზე არაწაკითხვადია. შესაძლოა, იგი წაშლილი ან გადატანილი იქნა, ან წვდომა აკრძალულია ნებართვების გამო.</translation> @@ -1488,6 +1495,7 @@ <translation id="8218327578424803826">მიმაგრებული მდებარეობა:</translation> <translation id="8220146938470311105">C7/C6 (კონვერტი)</translation> <translation id="8220639454292072926">კორპორაციული ანგარიშგება</translation> +<translation id="8221250263817408492">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium გირჩევთ, ახლავე გადახვიდეთ <ph name="WEBSITE_1" />-ზე და სხვა საიტებზე, სადაც ამ პაროლს იყენებთ, შემდეგ კი შეცვალოთ ის.</translation> <translation id="8225771182978767009">პიროვნებამ, რომელმაც ეს კომპიუტერი გამართა, ამ საიტის დაბლოკვა აირჩია.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">გვერდის ახალ ინკოგნიტო ჩანართში გახსნა</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index d96e01f..8d5c9f8 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">Құпия фраза бос болмауы керек.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> қосымша функцияларға кеңейтімдер орнатты. Кеңейтімдер кейбір деректерді пайдалана алады.</translation> <translation id="3832522519263485449">Сол жағын бірнеше рет тесу</translation> +<translation id="3838154488026099170">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chromium осы құпия сөз енгізілген <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> және тағы басқа сайттарға кіріп, оны дереу өзгертуге кеңес береді.</translation> <translation id="385051799172605136">Артқа</translation> <translation id="3858027520442213535">Күні мен уақытын жаңарту</translation> <translation id="3884278016824448484">Мұндай құрылғы идентификаторы бұрыннан бар</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Төлем жасау кезінде қате кетті. Әрекетті қайталаңыз.</translation> <translation id="4075732493274867456">Клиент пен сервер ортақ SSL протоколының нұсқасын немесе шифрлар жиынтығын қолдамайды.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chrome осы құпия сөз енгізілген <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> және тағы басқа сайттарға кіріп, оны дереу өзгертуге кеңес береді.</translation> <translation id="4079302484614802869">Прокси конфигурациясы бекітілген прокси серверлерді емес, .pac сценарий URL мекенжайын пайдалануға орнатылған.</translation> <translation id="4082393374666368382">Параметрлер − Басқару</translation> <translation id="4098354747657067197">Жалған сайт</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Бұл сайттағы шабуылшылар ақпаратыңызды (мысалы, фотосуреттер, құпия сөздер, хабарлар және несие карталары) ұрлайтын не жоятын қауіпті бағдарламаларды компьютеріңізге орнатуға тырысуы мүмкін.</translation> <translation id="4358059973562876591">Сіз көрсеткен үлгілер DnsOverHttpsMode саясатындағы қатеге байланысты қолданылмауы мүмкін.</translation> <translation id="4358461427845829800">Төлем әдістерін басқару...</translation> +<translation id="4359160567981085931">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chrome көмектесе алады. Құпия сөзді өзгертіп, Google-ға есептік жазбаға төніп тұрған қауіп туралы хабарлау үшін "Есептік жазбаны қорғау" түймесін басыңыз.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">Есептік жазба балансы</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">Chrome басқа сайттарда пайдаланылған құпия сөзіңізді қайта орнатуды ұсынады.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Картаны Google есептік жазбасында сақтау}other{Карталарды Google есептік жазбасында сақтау}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Осы карта үшін виртуалды нөмірді пайдаланыңыз}other{Картаны таңдаңыз}}</translation> <translation id="5763042198335101085">Дұрыс электрондық пошта мекенжайын енгізіңіз</translation> <translation id="5763703224595565476">Әкімшіңіз браузерде Chrome корпоративтік пайдаланушыны қорғау функциясын іске қосты. Chrome корпоративтік пайдаланушыны қорғау функциясы деректеріңізді пайдалана алады.</translation> <translation id="5765072501007116331">Жеткізу әдістері мен талаптарын көру үшін мекенжайды таңдаңыз</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Рұқсаттар</translation> <translation id="5810442152076338065">Сіздің <ph name="DOMAIN" /> доменіне қосылуыңыз ескірген шифр жиынтығы арқылы шифрланған.</translation> <translation id="5813119285467412249">&Қосуды қайта орындау</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Төлем осы картадан алынады, бірақ оның нөмірі сайтқа белгісіз болады. Қосымша қауіпсіздік үшін уақытша CVC коды жасалады.}other{Төлем сіз таңдаған картадан алынады, бірақ оның нөмірі сайтқа белгісіз болады. Қосымша қауіпсіздік үшін уақытша CVC коды жасалады.}}</translation> <translation id="583281660410589416">Белгісіз</translation> <translation id="5838278095973806738">Шабуылдаушылар ұрлауы мүмкін болғандықтан, бұл сайтқа ешқандай маңызды ақпаратты (мысалы, құпия сөздер не несиелік карталар) енгізбеңіз.</translation> <translation id="5851548754964597211">Қойындылар тізімі</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">Алып кету әдісін таңдау</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" дұрыс конфигурацияланған. Әдетте "<ph name="SOFTWARE_NAME" />" жойылғанда, мәселе шешіледі. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Кешіріңіз, бірдеңе дұрыс болмады.</translation> +<translation id="8067872629359326442">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chromium көмектесе алады. Құпия сөзді өзгертіп, Google-ға есептік жазбаға төніп тұрған қауіп туралы хабарлау үшін "Есептік жазбаны қорғау" түймесін басыңыз.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">Құжат бұрылып тұрғанда, аннотация қосу мүмкін емес.</translation> <translation id="8079031581361219619">Сайтты қайта жүктегіңіз келе ме?</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">Өшіру</translation> <translation id="8118489163946903409">Төлем әдісі</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" компьютеріңізде не желіңізде дұрыс орнатылмаған. АТ әкімшіңізден мәселені шешуін сұраңыз.</translation> +<translation id="8128526133099929547">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chrome осы құпия сөз енгізілген <ph name="WEBSITE_1" /> және тағы басқа сайттарға кіріп, оны дереу өзгертуге кеңес береді.</translation> <translation id="8131740175452115882">Растау</translation> <translation id="8149426793427495338">Компьютеріңіз ұйқы күйіне өтті.</translation> <translation id="8150722005171944719"><ph name="URL" /> сілтемесіндегі файл оқылмайды. Ол жойылған, көшірілген болуы немесе файл рұқсаттары кедергі болуы мүмкін.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">Тағайындалған орын:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">Компания есебі</translation> +<translation id="8221250263817408492">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chromium осы құпия сөз енгізілген <ph name="WEBSITE_1" /> және тағы басқа сайттарға кіріп, оны дереу өзгертуге кеңес береді.</translation> <translation id="8225771182978767009">Бұл компьютерді орнатқан адам осы сайтты бөгеуді ұйғарды.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Бетті жаңа инкогнито қойындысында ашу</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index e12c00b..88456ae0 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -610,6 +610,7 @@ <translation id="3828924085048779000">ឃ្លាសម្ងាត់ទទេមិនត្រូវបានអនុញ្ញាតទេ។</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> បានដំឡើងកម្មវិធីបន្ថែមសម្រាប់មុខងារបន្ថែម។ កម្មវិធីបន្ថែមមានសិទ្ធិចូលប្រើទិន្នន័យមួយចំនួនរបស់អ្នក។</translation> <translation id="3832522519263485449">ចោះច្រើនរន្ធខាងឆ្វេង</translation> +<translation id="3838154488026099170">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> និងគេហទំព័រផ្សេងទៀត ដែលអ្នកប្រើពាក្យសម្ងាត់នេះ រួចប្ដូរពាក្យសម្ងាត់ឥឡូវនេះ។</translation> <translation id="385051799172605136">ថយក្រោយ</translation> <translation id="3858027520442213535">ធ្វើបច្ចុប្បន្នភាពកាលបរិច្ឆេទ និងម៉ោង</translation> <translation id="3884278016824448484">មានបញ្ហាជាមួយឧបករណ៍សម្គាល់ឧបករណ៍</translation> @@ -647,6 +648,7 @@ <translation id="4072486802667267160">មានបញ្ហាក្នុងការដំណើរការការបញ្ជាទិញរបស់អ្នក។ សូមព្យាយាមម្ដងទៀត។</translation> <translation id="4075732493274867456">ម៉ាស៊ីនកូន និងម៉ាស៊ីនមេមិនគាំទ្រកំណែប្រូតូកូល SSL ទូទៅ ឬសៃភ័រស៊ូត (cipher suite) ទេ។</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chrome សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, និង <ph name="WEBSITE_3" /> និងគេហទំព័រផ្សេងទៀត ដែលអ្នកប្រើពាក្យសម្ងាត់នេះ រួចប្ដូរពាក្យសម្ងាត់ឥឡូវនេះ។</translation> <translation id="4079302484614802869">ការតំឡើងប្រូកស៊ីត្រូវបានកំណត់ឲ្យប្រើ URL ស្គ្រីបផេក មិនមែនម៉ាស៊ីនមេប្រូកស៊ីដែលថេរទេ។</translation> <translation id="4082393374666368382">ការកំណត់៖ ការគ្រប់គ្រង</translation> <translation id="4098354747657067197">មានគេហទំព័រឆបោកនៅខាងមុខ</translation> @@ -726,6 +728,7 @@ <translation id="4356973930735388585">អ្នកវាយប្រហារនៅលើទំព័រនេះអាចនឹងព្យាយាមលួចដំឡើងកម្មវិធីដែលបង្កគ្រោះថ្នាក់នៅលើកុំព្យូទ័ររបស់អ្នក ដែលកម្មវិធីនេះអាចនឹងលួច ឬលុបព័ត៌មានរបស់អ្នក (ឧទាហរណ៍៖ រូបថត ពាក្យសម្ងាត់ សារ និងកាតឥណទាន)។</translation> <translation id="4358059973562876591">ទម្រង់គំរូដែលអ្នកបានបញ្ជាក់ប្រហែលជាមិនអាចប្រើបានទេ ដោយសារមានបញ្ហាពាក់ព័ន្ធនឹងគោលការណ៍ DnsOverHttpsMode។</translation> <translation id="4358461427845829800">គ្រប់គ្រងវិធីបង់ប្រាក់...</translation> +<translation id="4359160567981085931">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chrome អាចជួយបាន។ ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នក និងជូនដំណឹងដល់ Google ថាគណនីរបស់អ្នកអាចប្រឈមនឹងហានិភ័យ សូមចុច "ការពារគណនី"។</translation> <translation id="4367563149485757821">Number-12 (ស្រោមសំបុត្រ)</translation> <translation id="437058704415269440">សមតុល្យគណនី</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -1002,6 +1005,7 @@ <translation id="5728056243719941842">C5 (ស្រោមសំបុត្រ)</translation> <translation id="5730040223043577876">Chrome ណែនាំឱ្យកំណត់ពាក្យសម្ងាត់របស់អ្នកឡើងវិញ ប្រសិនបើអ្នកបានប្រើវាម្តងទៀតនៅលើទំព័រផ្សេង។</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{រក្សាទុកបណ្ណនៅក្នុងគណនី Google របស់អ្នក}other{រក្សាទុកបណ្ណនៅក្នុងគណនី Google របស់អ្នក}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{ប្រើលេខនិម្មិតសម្រាប់បណ្ណឥណទាននេះ}other{ជ្រើសរើសបណ្ណឥណទាន}}</translation> <translation id="5763042198335101085">បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលត្រឹមត្រូវ</translation> <translation id="5763703224595565476">អ្នកគ្រប់គ្រងរបស់អ្នកបានបើក Chrome Enterprise User Protect នៅលើកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នក។ Chrome Enterprise User Protect មានសិទ្ធិចូលប្រើទិន្នន័យមួយចំនួនរបស់អ្នក។</translation> <translation id="5765072501007116331">ដើម្បីមើលមធ្យោបាយ និងលក្ខខណ្ឌតម្រូវនៃការដឹកជញ្ជូនផ្ទាល់ សូមជ្រើសរើសអាសយដ្ឋាន</translation> @@ -1018,6 +1022,7 @@ <translation id="5804241973901381774">ការអនុញ្ញាត</translation> <translation id="5810442152076338065">ការតភ្ជាប់របស់អ្នកទៅ <ph name="DOMAIN" /> ត្រូវបានអ៊ីនគ្រីបដោយប្រើឈុតសរសេរសម្ងាត់ដែលគេលែងប្រើ។</translation> <translation id="5813119285467412249">ធ្វើការបន្ថែមឡើងវិញ</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{នឹងគិតប្រាក់ពីបណ្ណឥណទាននេះ នៅពេលអ្នកបង់ប្រាក់ ប៉ុន្តែលេខពិតប្រាកដរបស់វានឹងមិនត្រូវបានចែករំលែកជាមួយគេហទំព័រនេះទេ។ CVC បណ្តោះអាសន្ននឹងត្រូវបានបង្កើត សម្រាប់ការការពារសុវត្ថិភាពបន្ថែម។}other{នឹងគិតប្រាក់ពីបណ្ណឥណទានដែលអ្នកជ្រើសរើស នៅពេលអ្នកបង់ប្រាក់ ប៉ុន្តែលេខពិតប្រាកដរបស់វានឹងមិនត្រូវបានចែករំលែកជាមួយគេហទំព័រនេះទេ។ CVC បណ្តោះអាសន្ននឹងត្រូវបានបង្កើត សម្រាប់ការការពារសុវត្ថិភាពបន្ថែម។}}</translation> <translation id="583281660410589416">មិនស្គាល់</translation> <translation id="5838278095973806738">អ្នកមិនគួរបញ្ចូលព័ត៌មានសំខាន់ៗនៅលើគេហទំព័រនេះទេ (ឧទាហរណ៍៖ ពាក្យសម្ងាត់ ឬកាតឥណទាន) ពីព្រោះអ្នកវាយប្រហារអាចនឹងលួចវា។</translation> <translation id="5851548754964597211">បញ្ជីផ្ទាំង</translation> @@ -1476,6 +1481,7 @@ <translation id="8042918947222776840">ជ្រើសរើសមធ្យោបាយទៅយក</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" មិនបានកំណត់រចនាសម្ព័ន្ធត្រឹមត្រូវទេ។ ជាធម្មតាការលុប "<ph name="SOFTWARE_NAME" />" អាចដោះស្រាយបញ្ហានេះបាន។ <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">សូមអភ័យទោស មានអ្វីមួយខុសប្រក្រតី។</translation> +<translation id="8067872629359326442">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chromium អាចជួយបាន។ ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នក និងជូនដំណឹងដល់ Google ថាគណនីរបស់អ្នកអាចប្រឈមនឹងហានិភ័យ សូមចុច "ការពារគណនី"។</translation> <translation id="8074253406171541171">10x13 (ស្រោមសំបុត្រ)</translation> <translation id="8078141288243656252">មិនអាចដាក់ចំណារបានទេ នៅពេលបង្វិល</translation> <translation id="8079031581361219619">ផ្ទុកទំព័រឡើងវិញ?</translation> @@ -1492,6 +1498,7 @@ <translation id="8105368624971345109">បិទ</translation> <translation id="8118489163946903409">វិធីបង់ប្រាក់</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" មិនបានដំឡើងត្រឹមត្រូវនៅលើកុំព្យូទ័រ ឬបណ្តាញរបស់អ្នកទេ។ សូមស្នើឱ្យអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកដោះស្រោយបញ្ហានេះ។</translation> +<translation id="8128526133099929547">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chrome សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> និងគេហទំព័រផ្សេងទៀត ដែលអ្នកប្រើពាក្យសម្ងាត់នេះ រួចប្ដូរពាក្យសម្ងាត់ឥឡូវនេះ។</translation> <translation id="8131740175452115882">អះអាង</translation> <translation id="8149426793427495338">កុំព្យូទ័ររបស់អ្នកបានដេកហើយ</translation> <translation id="8150722005171944719">ឯកសារនៅ <ph name="URL" /> មិនអាចអានបានទេ។ អ្នកត្រូវបានយកចេញ ឬផ្លាស់ទី ឬការអនុញ្ញាតឯកសារអាចបង្ការការពីការចូលប្រើ។</translation> @@ -1509,6 +1516,7 @@ <translation id="8218327578424803826">ទីតាំងដែលបានកំណត់៖</translation> <translation id="8220146938470311105">C7/C6 (ស្រោមសំបុត្រ)</translation> <translation id="8220639454292072926">ការរាយការណ៍អំពីសហគ្រាស</translation> +<translation id="8221250263817408492">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើគេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> និងគេហទំព័រផ្សេងទៀត ដែលអ្នកប្រើពាក្យសម្ងាត់នេះ រួចប្ដូរពាក្យសម្ងាត់ឥឡូវនេះ។</translation> <translation id="8225771182978767009">អ្នកដែលដំឡើងកុំព្យូទ័រនេះបានជ្រើសយកការរារាំងគេហទំព័រនេះ</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">បើកទំព័រនៅក្នុងផ្ទាំងឯកជនថ្មី</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index e1b93f8..c496c9c 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -605,6 +605,7 @@ <translation id="3828924085048779000">암호를 빈 칸으로 두어서는 안 됩니다.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" />에서 추가 기능을 위한 확장 프로그램을 설치했습니다. 확장 프로그램에는 내 데이터 중 일부에 액세스할 권한이 있습니다.</translation> <translation id="3832522519263485449">왼쪽 다공 펀칭</translation> +<translation id="3838154488026099170">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> 등 동일한 비밀번호를 사용한 사이트로 이동하여 비밀번호를 변경하시기 바랍니다.</translation> <translation id="385051799172605136">뒤로</translation> <translation id="3858027520442213535">시간과 날짜 업데이트</translation> <translation id="3884278016824448484">기기 식별자 충돌</translation> @@ -642,6 +643,7 @@ <translation id="4072486802667267160">주문을 처리하는 중에 오류가 발생했습니다. 다시 시도하세요.</translation> <translation id="4075732493274867456">클라이언트와 서버가 일반적인 SSL 프로토콜 버전 또는 암호화 제품군을 지원하지 않습니다.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> 등 동일한 비밀번호를 사용한 사이트로 이동하여 비밀번호를 변경하시기 바랍니다.</translation> <translation id="4079302484614802869">프록시 설정이 고정 프록시 서버가 아닌 .pac 스크립트 URL을 사용하도록 설정됩니다.</translation> <translation id="4082393374666368382">설정 - 관리</translation> <translation id="4098354747657067197">사기성 사이트 주의</translation> @@ -721,6 +723,7 @@ <translation id="4356973930735388585">이 사이트의 공격자가 사용자 정보(예: 사진, 비밀번호, 메시지, 신용카드)를 도용하거나 삭제하는 위험한 프로그램을 컴퓨터에 설치하려고 시도할 수 있습니다.</translation> <translation id="4358059973562876591">지정한 템플릿이 DnsOverHttpsMode 정책 오류로 인해 적용되지 않을 수 있습니다.</translation> <translation id="4358461427845829800">결제 수단 관리...</translation> +<translation id="4359160567981085931">사기성 사이트에 비밀번호를 입력했습니다. Chrome이 계정 보호를 도와드립니다. 비밀번호를 변경하고 계정 보안 위험에 관해 Google에 알리려면 계정 보호를 클릭하세요.</translation> <translation id="4367563149485757821">Number-12(봉투)</translation> <translation id="437058704415269440">계정 잔액</translation> <translation id="4372516964750095882">Fanfold-미국</translation> @@ -996,6 +999,7 @@ <translation id="5728056243719941842">C5(봉투)</translation> <translation id="5730040223043577876">다른 사이트에서 비밀번호를 재사용했다면 비밀번호를 재설정하는 것이 좋습니다.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Google 계정에 카드 저장}other{Google 계정에 카드 저장}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{이 카드의 가상 번호 사용}other{카드 선택}}</translation> <translation id="5763042198335101085">올바른 이메일 주소를 입력하세요.</translation> <translation id="5763703224595565476">관리자가 브라우저의 Chrome Enterprise User Protect를 사용 설정했습니다. Chrome Enterprise User Protect는 내 데이터 중 일부에 액세스할 권한이 있습니다.</translation> <translation id="5765072501007116331">배달 방법과 요구사항을 확인하려면 주소를 선택하세요.</translation> @@ -1012,6 +1016,7 @@ <translation id="5804241973901381774">권한</translation> <translation id="5810442152076338065"><ph name="DOMAIN" />에 대한 연결이 더 이상 사용되지 않는 암호화 기술을 사용하여 암호화됩니다.</translation> <translation id="5813119285467412249">추가 다시 실행(&R)</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{결제하면 이 카드로 청구되지만 실제 카드 번호는 사이트와 공유되지 않습니다. 보안 강화를 위해 임시 CVC가 생성됩니다.}other{결제하면 선택한 카드로 청구되지만 실제 카드 번호는 사이트와 공유되지 않습니다. 보안 강화를 위해 임시 CVC가 생성됩니다.}}</translation> <translation id="583281660410589416">알 수 없음</translation> <translation id="5838278095973806738">이 사이트에 입력하는 비밀번호나 신용카드 번호 등의 정보가 공격자에 의해 도용될 수 있습니다.</translation> <translation id="5851548754964597211">탭 목록</translation> @@ -1468,6 +1473,7 @@ <translation id="8042918947222776840">수령 방법 선택</translation> <translation id="8057711352706143257">'<ph name="SOFTWARE_NAME" />이(가) 올바르게 설정되지 않았습니다. 일반적으로 '<ph name="SOFTWARE_NAME" />'을(를) 제거하면 문제가 해결됩니다. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">문제 발생</translation> +<translation id="8067872629359326442">사기성 사이트에 비밀번호를 입력했습니다. Chromium이 계정 보호를 도와드립니다. 비밀번호를 변경하고 계정 보안 위험에 관해 Google에 알리려면 계정 보호를 클릭하세요.</translation> <translation id="8074253406171541171">10x13(봉투)</translation> <translation id="8078141288243656252">회전 시 주석을 달 수 없습니다.</translation> <translation id="8079031581361219619">사이트를 새로고침하시겠습니까?</translation> @@ -1484,6 +1490,7 @@ <translation id="8105368624971345109">사용 중지</translation> <translation id="8118489163946903409">결제 수단</translation> <translation id="8127301229239896662">'<ph name="SOFTWARE_NAME" />'이(가) 컴퓨터 또는 네트워크에 제대로 설치되지 않았습니다. IT 관리자에게 문제 해결을 요청해 보세요.</translation> +<translation id="8128526133099929547">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" /> 등 동일한 비밀번호를 사용한 사이트로 이동하여 비밀번호를 변경하시기 바랍니다.</translation> <translation id="8131740175452115882">확인</translation> <translation id="8149426793427495338">컴퓨터가 절전 모드 상태입니다.</translation> <translation id="8150722005171944719"><ph name="URL" />의 파일을 읽을 수 없습니다. 삭제 또는 이동되었거나 파일 사용 권한이 액세스를 차단할 수도 있습니다.</translation> @@ -1501,6 +1508,7 @@ <translation id="8218327578424803826">지정된 위치:</translation> <translation id="8220146938470311105">C7/C6(봉투)</translation> <translation id="8220639454292072926">엔터프라이즈 보고</translation> +<translation id="8221250263817408492">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" /> 등 동일한 비밀번호를 사용한 사이트로 이동하여 비밀번호를 변경하시기 바랍니다.</translation> <translation id="8225771182978767009">컴퓨터를 설정한 사용자가 이 사이트를 차단했습니다.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">새 시크릿 창에서 페이지 열기</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 0e2156b..0e4bdef 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">Купуя сөз айкашын бош калтырууга болбойт.</translation> <translation id="3831915413245941253">Кошумча функцияларды иштетүү үчүн <ph name="ENROLLMENT_DOMAIN" /> домени керектүү кеңейтүүлөрдү орнотту. Кеңейтүүлөрдүн айрым дайындарыңызга кирүү мүмкүнчүлүгү бар.</translation> <translation id="3832522519263485449">Сол жагын бир нече жолу тешүү</translation> +<translation id="3838154488026099170">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium ушул сырсөздү колдонгон <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> жана башка сайттарга өтүп, аны азыр өзгөртүүнү сунуштайт.</translation> <translation id="385051799172605136">Артка</translation> <translation id="3858027520442213535">Күн менен убакытты жаңыртуу</translation> <translation id="3884278016824448484">Түзмөктүн далдаштыргычтары дал келбей кагылышууда</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">Буйрутмаңызды иштетүү учурунда ката кетти. Кайра аракет кылыңыз.</translation> <translation id="4075732493274867456">Кардар менен серверде ар кандай SSL протоколунун версиялары же шифрлер топтому колдоого алынат.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome ушул сырсөздү колдонгон <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> жана башка сайттарга өтүп, аны азыр өзгөртүүнү сунуштайт.</translation> <translation id="4079302484614802869">Прокси конфигурациясы боюнча бекитилген прокси серверлери эмес, .pac скрипт URL'и колдонулат.</translation> <translation id="4082393374666368382">Жөндөөлөр – Башкаруу</translation> <translation id="4098354747657067197">Алдыда жалган сайт</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">Бул сайттагы бүлдүргүчтөр түзмөгүңүздөгү маалыматыңызды (мисалы, сүрөттөр, сырсөздөр, билдирүүлөр жана насыя карталары) уурдап же жок кыла турган коркунучтуу программаларды орнотууга аракет кылышы мүмкүн.</translation> <translation id="4358059973562876591">Сиз көрсөткөн үлгүлөрдү колдонууга болбойт, анткени DnsOverHttpsMode саясатында ката кетти.</translation> <translation id="4358461427845829800">Төлөм ыкмаларын башкаруу...</translation> +<translation id="4359160567981085931">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome жардам берет. Сырсөзүңүздү өзгөртүү жана аккаунтуңуздун коопсуздугу коркунучта экенин Google'га кабарлоо үчүн "Аккаунттун коопсуздугун коргоо" баскычын басыңыз.</translation> <translation id="4367563149485757821">Number-12 (Конверт)</translation> <translation id="437058704415269440">Аккаунттун балансы</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Конверт)</translation> <translation id="5730040223043577876">Сырсөзүңүздү башка сайттарда колдонгон болсоңуз, Chrome аны өзгөртүүнү сунуштайт.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Картаны Google аккаунтуңузга сактап коюңуз}other{Карталарды Google аккаунтуңузга сактап коюңуз}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Бул картанын виртуалдык номерин колдонуңуз}other{Карта тандоо}}</translation> <translation id="5763042198335101085">Жарактуу электрондук почта дарегин киргизиңиз</translation> <translation id="5763703224595565476">Администраторуңуз Chrome Enterprise User Protect кызматын серепчиңизден иштетти. Chrome Enterprise User Protect кызматынын айрым дайындарыңызга кирүүгө мүмкүнчүлүгү бар.</translation> <translation id="5765072501007116331">Жеткирүү ыкмаларын жана талаптарын көрүү үчүн дарегин тандаңыз</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">Уруксаттар</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> менен туташууңуз эскирген шифр топтому менен шифрленген.</translation> <translation id="5813119285467412249">Кошууну &кайталоо</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Төлөм ушул картадан өндүрүлөт, бирок анын номери бул сайт менен бөлүшүлбөйт. Кошумча коопсуздук үчүн убактылуу CVC түзүлөт.}other{Төлөм сиз тандаган картадан өндүрүлөт, бирок анын номери бул сайт менен бөлүшүлбөйт. Кошумча коопсуздук үчүн убактылуу CVC түзүлөт.}}</translation> <translation id="583281660410589416">Белгисиз</translation> <translation id="5838278095973806738">Бул сайтка эч кандай жеке маалымат киргизилбеши керек (мисалы, сырсөздөр же насыя карточкаларынын номерлери), себеби аны чабуулчулар уурдап алышы мүмкүн.</translation> <translation id="5851548754964597211">Өтмөк тизмеси</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">Алып кетүү ыкмасын тандоо</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" программасы туура конфигурацияланган эмес. Адатта, мындай көйгөй "<ph name="SOFTWARE_NAME" />" программасын чыгарып салуу менен чечилет. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Кечиресиз, бир жерден ката кетти.</translation> +<translation id="8067872629359326442">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium жардам берет. Сырсөзүңүздү өзгөртүү жана аккаунтуңуздун коопсуздугу коркунучта экенин Google'га кабарлоо үчүн "Аккаунттун коопсуздугун коргоо" баскычын басыңыз.</translation> <translation id="8074253406171541171">10x13 (Конверт)</translation> <translation id="8078141288243656252">Документ бурулуп турганда, Аннотация режимин колдонууга болбойт</translation> <translation id="8079031581361219619">Сайт кайрадан жүктөлсүнбү?</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">Өчүрүү</translation> <translation id="8118489163946903409">Төлөм ыкмасы</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" программасы компьютериңизге же тармагыңызга туура орнотулган эмес. Бул маселени чечүү үчүн IT администраторуңузга кайрылыңыз.</translation> +<translation id="8128526133099929547">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome ушул сырсөздү колдонгон <ph name="WEBSITE_1" /> жана башка сайттарга өтүп, аны азыр өзгөртүүнү сунуштайт.</translation> <translation id="8131740175452115882">Ырастоо</translation> <translation id="8149426793427495338">Компьютериңиз уктап калды.</translation> <translation id="8150722005171944719"><ph name="URL" /> дарегиндеги файл окулбайт. Ал чыгарылып салынган, жылдырылган же файл уруксаттарынан улам аны окуу мүмкүн эмес.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">Дайындалган жайгашкан жер:</translation> <translation id="8220146938470311105">C7/C6 (Конверт)</translation> <translation id="8220639454292072926">Ишканалык кабарлоо</translation> +<translation id="8221250263817408492">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium ушул сырсөздү колдонгон <ph name="WEBSITE_1" /> жана башка сайттарга өтүп, аны азыр өзгөртүүнү сунуштайт.</translation> <translation id="8225771182978767009">Бул компьютерди жөндөгөн адам ушул сайтты бөгөттөп салган.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Баракчаны жаңы жашыруун өтмөктө ачуу</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 7feba47..8eb2237 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">ບໍ່ອະນຸຍາດໃຫ້ວະລີຜ່ານຫວ່າງເປົ່າໄດ້.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ໄດ້ຕິດຕັ້ງສ່ວນຂະຫຍາຍສຳລັບຟັງຊັນເພີ່ມເຕີມແລ້ວ. ສ່ວນຂະຫຍາຍມີສິດເຂົ້າເຖິງບາງຂໍ້ມູນຂອງທ່ານ.</translation> <translation id="3832522519263485449">ເຈາະຮູຢູ່ເບື້ອງຊ້າຍຫຼາຍຮູ</translation> +<translation id="3838154488026099170">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ແລະ ເວັບໄຊອື່ນໆທີ່ທ່ານໃຊ້ລະຫັດຜ່ານນີ້ ແລ້ວປ່ຽນມັນຕອນນີ້ເລີຍ.</translation> <translation id="385051799172605136">ກັບຄືນ</translation> <translation id="3858027520442213535">ອັບເດດວັນທີ ແລະເວລາ</translation> <translation id="3884278016824448484">ຕົວລະບຸອຸປະກອນທີ່ຂັດກັນ</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">ມີຄວາມຜິດພາດໃນການດຳເນີນຄຳສັ່ງຊື້ຂອງທ່ານ, ກະລຸນາລອງອີກຄັ້ງ.</translation> <translation id="4075732493274867456">ລູກຂ່າຍ ແລະ ເຊີບເວີບໍ່ຮອງຮັບເວີຊັນໂປຣໂຕຄໍ ຫຼື ຊຸດລະຫັດລັບ SSL ທົ່ວໄປ.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ແລະ ເວັບໄຊອື່ນໆທີ່ທ່ານໃຊ້ລະຫັດຜ່ານນີ້ ແລ້ວປ່ຽນມັນຕອນນີ້ເລີຍ.</translation> <translation id="4079302484614802869">ການປັບຕັ້ງຄ່າພຣັອກຊີຕັ້ງຂຶ້ນເພື່ອໃຊ້ URL ຕົວຂຽນ .pac, ບໍ່ແມ່ນເຊີບເວີພຣັອກຊີທີ່ກໍານົດໄວ້.</translation> <translation id="4082393374666368382">ການຕັ້ງຄ່າ - ການຈັດການ</translation> <translation id="4098354747657067197">ເວັບໄຊທ໌ຫຼອກລວງຢູ່ຂ້າງໜ້າ</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">ຜູ້ໂຈມຕີຢູ່ໃນເວັບໄຊນີ້ອາດຈະພະຍາຍາມຕິດຕັ້ງໂປຣແກຣມອັນຕະລາຍຢູ່ໃນຄອມພິວເຕີຂອງທ່ານທີ່ລັກເອົາ ຫຼື ລຶບຂໍ້ມູນຂອງທ່ານຖິ້ມ (ຕົວຢ່າງ: ຮູບພາບ, ລະຫັດຜ່ານ, ຂໍ້ຄວາມ ແລະ ບັດເຄຣດິດ).</translation> <translation id="4358059973562876591">ແມ່ແບບທີ່ທ່ານລະບຸອາດຈະນຳໃຊ້ບໍ່ໄດ້ຍ້ອນມີຂໍ້ຜິດພາດກັບນະໂຍບາຍ DnsOverHttpsMode.</translation> <translation id="4358461427845829800">ຈັດການວິທີການຈ່າຍເງິນ...</translation> +<translation id="4359160567981085931">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ສາມາດຊ່ວຍໄດ້. ເພື່ອປ່ຽນລະຫັດຜ່ານຂອງທ່ານ ແລະ ແຈ້ງບອກ Google ວ່າບັນຊີຂອງທ່ານອາດຈະມີຄວາມສ່ຽງ, ກະລຸນາຄລິກປົກປ້ອງບັນຊີ.</translation> <translation id="4367563149485757821">Number-12 (ຊອງຈົດໝາຍ)</translation> <translation id="437058704415269440">ຍອດເງິນໃນບັນຊີ</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (ຊອງຈົດໝາຍ)</translation> <translation id="5730040223043577876">Chrome ແນະນຳໃຫ້ຣີເຊັດລະຫັດຜ່ານຂອງທ່ານ ຖ້າທ່ານນຳມັນມາໃຊ້ໃໝ່ໃນເວັບໄຊອື່ນ.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{ບັນທຶກບັດໄວ້ໃນບັນຊີ Google ຂອງທ່ານ}other{ບັນທຶກບັດໄວ້ໃນບັນຊີ Google ຂອງທ່ານ}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{ໃຊ້ໝາຍເລກສະເໝືອນຈິງສຳລັບບັດນີ້}other{ເລືອກບັດ}}</translation> <translation id="5763042198335101085">ປ້ອນທີ່ຢູ່ອີເມວທີ່ຖືກຕ້ອງ</translation> <translation id="5763703224595565476">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານໄດ້ເປີດການນຳໃຊ້ຄຸນສົມບັດການປົກປ້ອງຜູ້ໃຊ້ຂອງ Chrome Enterprise ແລ້ວ. ຄຸນສົມບັດການປົກປ້ອງຜູ້ໃຊ້ຂອງ Chrome Enterprise ມີສິດເຂົ້າເຖິງຂໍ້ມູນບາງສ່ວນຂອງທ່ານ.</translation> <translation id="5765072501007116331">ເພື່ອເບິ່ງວິທີ ແລະ ຂໍ້ກຳນົດການສົ່ງ, ກະລຸນາເລືອກທີ່ຢູ່</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">ການອະນຸຍາດ</translation> <translation id="5810442152076338065">ການເຊື່ອມຕໍ່ຂອງທ່ານກັບ <ph name="DOMAIN" /> ຖືກເຂົ້າລະຫັດດ້ວຍການໃສ່ຊຸດລະຫັດລັບຫຼ້າສະໄໝ.</translation> <translation id="5813119285467412249">ເຮັດຄືນຄຳສັ່ງເພີ່ມ</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{ລະບົບຈະຮຽກເກັບເງິນນຳບັດນີ້ໃນເວລາທີ່ທ່ານຈ່າຍ, ແຕ່ຈະບໍ່ແບ່ງປັນໝາຍເລກຈິງຂອງບັດກັບເວັບໄຊນີ້. ລະບົບຈະສ້າງ CVC ຊົ່ວຄາວຂຶ້ນມາເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ.}other{ລະບົບຈະຮຽກເກັບເງິນນຳບັດທີ່ທ່ານເລືອກໃນເວລາທີ່ທ່ານຈ່າຍ, ແຕ່ຈະບໍ່ແບ່ງປັນໝາຍເລກຈິງຂອງບັດກັບເວັບໄຊນີ້. ລະບົບຈະສ້າງ CVC ຊົ່ວຄາວຂຶ້ນມາເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ.}}</translation> <translation id="583281660410589416">ບໍ່ຮູ້ຈັກ</translation> <translation id="5838278095973806738">ທ່ານບໍ່ຄວນປ້ອນຂໍ້ມູນທີ່ອ່ອນໄຫວໃດໆໃສ່ເວັບໄຊນີ້ (ຕົວຢ່າງ: ລະຫັດຜ່ານ ຫຼື ເລກບັດເຄຣດິດ), ເພາະວ່າມັນອາດຈະຖືກລັກໂດຍຜູ້ໂຈມຕີໄດ້.</translation> <translation id="5851548754964597211">ລາຍການແຖບ</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">ເລືອກວິທີການຮັບເຄື່ອງ</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" ບໍ່ຖືກກຳນົດຄ່າຢ່າງຖືກຕ້ອງ. ໂດຍປົກກະຕິແລ້ວການຖອນຕິດຕັ້ງ "<ph name="SOFTWARE_NAME" />" ຈະແກ້ໄຂບັນຫາໄດ້. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">ຂໍອະໄພ, ມີບາງຢ່າງຜິດພາດ.</translation> +<translation id="8067872629359326442">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ສາມາດຊ່ວຍໄດ້. ເພື່ອປ່ຽນລະຫັດຜ່ານຂອງທ່ານ ແລະ ແຈ້ງບອກ Google ວ່າບັນຊີຂອງທ່ານອາດຈະມີຄວາມສ່ຽງ, ກະລຸນາຄລິກປົກປ້ອງບັນຊີ.</translation> <translation id="8074253406171541171">10x13 (ຊອງຈົດໝາຍ)</translation> <translation id="8078141288243656252">ບໍ່ສາມາດຂຽນອະທິບາຍຄວາມເຫັນໃນເວລາໝຸນໄດ້</translation> <translation id="8079031581361219619">ໂຫຼດເວັບໄຊຄືນໃໝ່ບໍ?</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">ປິດ</translation> <translation id="8118489163946903409">ວິທີການຈ່າຍເງິນ</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" ບໍ່ໄດ້ຖືກຕິດຕັ້ງຢ່າງຖືກຕ້ອງໃນຄອມພິວເຕີ ຫຼື ເຄືອຂ່າຍຂອງທ່ານ. ກະລຸນາຮ້ອງຂໍໃຫ້ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານແກ້ໄຂບັນຫານີ້.</translation> +<translation id="8128526133099929547">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລະ ເວັບໄຊອື່ນໆທີ່ທ່ານໃຊ້ລະຫັດຜ່ານນີ້ ແລ້ວປ່ຽນມັນຕອນນີ້ເລີຍ.</translation> <translation id="8131740175452115882">ຢືນຢັນ</translation> <translation id="8149426793427495338">ຄອມພິວເຕີຂອງທ່ານໄດ້ເຂົ້າສູ່ໂໝດນອນຫຼັບແລ້ວ.</translation> <translation id="8150722005171944719">ໄຟລ໌ຢູ່ທີ່ <ph name="URL" /> ບໍ່ສາມາດອ່ານໄດ້. ມັນອາດຈະຖືກເອົາອອກໄປ, ຍ້າຍໜີ,ຫຼື ການອະນຸຍາດໄຟລ໌ອາດຈະກໍາລັງປ້ອງກັນການການເຂົ້າຫາ.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">ທີ່ຕັ້ງທີ່ກຳນົດໃຫ້</translation> <translation id="8220146938470311105">C7/C6 (ຊອງຈົດໝາຍ)</translation> <translation id="8220639454292072926">ການລາຍງານລະດັບວິສາຫະກິດ</translation> +<translation id="8221250263817408492">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລະ ເວັບໄຊອື່ນໆທີ່ທ່ານໃຊ້ລະຫັດຜ່ານນີ້ ແລ້ວປ່ຽນມັນຕອນນີ້ເລີຍ.</translation> <translation id="8225771182978767009">ບຸກຄົນຜູ້ທີ່ຕັ້ງຄ່າຄອມພິວເຕີນີ້ໄດ້ເລືອກບລັອກເວັບໄຊນີ້ໄວ້.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">ເປີດໜ້າເວັບໃນແຖບບໍ່ເປີດເຜີຍຕົວຕົນໃໝ່</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 349b87d..1b0c056 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -604,6 +604,7 @@ <translation id="3828924085048779000">Tukša ieejas frāze nav atļauta.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> instalēja paplašinājumus papildu funkcijām. Paplašinājumiem ir piekļuve dažiem jūsu datiem.</translation> <translation id="3832522519263485449">Vairāki caurumi kreisajā pusē</translation> +<translation id="3838154488026099170">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> un <ph name="WEBSITE_3" />, kā arī citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation> <translation id="385051799172605136">Atpakaļ</translation> <translation id="3858027520442213535">Atjaunināt datumu un laiku</translation> <translation id="3884278016824448484">Ierīces identifikators rada konfliktu.</translation> @@ -641,6 +642,7 @@ <translation id="4072486802667267160">Apstrādājot pasūtījumu, radās kļūda. Lūdzu, mēģiniet vēlreiz.</translation> <translation id="4075732493274867456">Klients un serveris neatbalsta bieži lietoto SSL protokola versiju vai šifra komplektu.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> un <ph name="WEBSITE_3" />, kā arī citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation> <translation id="4079302484614802869">Starpniekserveris ir iestatīts, lai tas lietotu .pac skripta URL, nevis fiksētus starpniekserverus.</translation> <translation id="4082393374666368382">Iestatījumi — pārvaldība</translation> <translation id="4098354747657067197">Maldinoša vietne</translation> @@ -720,6 +722,7 @@ <translation id="4356973930735388585">Šajā vietnē esošie uzbrucēji jūsu datorā var mēģināt instalēt bīstamas programmas, kuras var nozagt vai dzēst jūsu informāciju (piemēram, fotoattēlus, paroles, ziņojumus un informāciju par kredītkartēm).</translation> <translation id="4358059973562876591">Norādītās veidnes, iespējams, netiks lietotas, jo ir radusies kļūda ar politiku DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Pārvaldīt maksājumu veidus...</translation> +<translation id="4359160567981085931">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome var palīdzēt. Lai mainītu paroli un paziņotu uzņēmumam Google, ka jūsu konts, iespējams, ir apdraudēts, noklikšķiniet uz pogas Aizsargāt kontu.</translation> <translation id="4367563149485757821">Number-12 (aploksne)</translation> <translation id="437058704415269440">Konta atlikums</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -995,6 +998,7 @@ <translation id="5728056243719941842">C5 (aploksne)</translation> <translation id="5730040223043577876">Chrome iesaka atiestatīt jūsu paroli, ja izmantojāt to citās vietnēs.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Kartes datu saglabāšana Google kontā}zero{Karšu datu saglabāšana Google kontā}one{Karšu datu saglabāšana Google kontā}other{Karšu datu saglabāšana Google kontā}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Izmantojiet šai kartei virtuālu numuru}zero{Atlasiet karti}one{Atlasiet karti}other{Atlasiet karti}}</translation> <translation id="5763042198335101085">Ievadiet derīgu e-pasta adresi</translation> <translation id="5763703224595565476">Jūsu administrators pārlūkā ir iespējojis funkciju “Chrome aizsardzība uzņēmuma versijas lietotājiem”. Funkcijai “Chrome aizsardzība uzņēmuma versijas lietotājiem” ir piekļuve daļai jūsu datu.</translation> <translation id="5765072501007116331">Lai skatītu piegādes veidus un prasības, atlasiet adresi.</translation> @@ -1011,6 +1015,7 @@ <translation id="5804241973901381774">Atļaujas</translation> <translation id="5810442152076338065">Savienojums ar domēnu <ph name="DOMAIN" /> ir šifrēts, izmantojot novecojušu šifra komplektu.</translation> <translation id="5813119285467412249">&Pievienošanas atsaukuma atcelšana</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Kad veiksiet maksājumus, no šīs kartes tiks iekasēta maksa, taču kartes patiesais numurs netiks kopīgots ar šo vietni. Papildu drošībai tiks ģenerēts pagaidu CVC.}zero{Kad veiksiet maksājumus, no atlasītās kartes tiks iekasēta maksa, taču kartes patiesais numurs netiks kopīgots ar šo vietni. Papildu drošībai tiks ģenerēts pagaidu CVC.}one{Kad veiksiet maksājumus, no atlasītās kartes tiks iekasēta maksa, taču kartes patiesais numurs netiks kopīgots ar šo vietni. Papildu drošībai tiks ģenerēts pagaidu CVC.}other{Kad veiksiet maksājumus, no atlasītās kartes tiks iekasēta maksa, taču kartes patiesais numurs netiks kopīgots ar šo vietni. Papildu drošībai tiks ģenerēts pagaidu CVC.}}</translation> <translation id="583281660410589416">Nezināms</translation> <translation id="5838278095973806738">Neievadiet šajā vietnē sensitīvu informāciju (piemēram, paroles vai kredītkartes), jo to var nozagt uzbrucēji.</translation> <translation id="5851548754964597211">Ciļņu saraksts</translation> @@ -1468,6 +1473,7 @@ <translation id="8042918947222776840">Izvēlēties saņemšanas veidu</translation> <translation id="8057711352706143257">Programmatūra <ph name="SOFTWARE_NAME" /> nav pareizi konfigurēta. Atinstalējot programmatūru <ph name="SOFTWARE_NAME" />, parasti problēma tiek novērsta. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Diemžēl radās problēma.</translation> +<translation id="8067872629359326442">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium var palīdzēt. Lai mainītu paroli un paziņotu uzņēmumam Google, ka jūsu konts, iespējams, ir apdraudēts, noklikšķiniet uz pogas Aizsargāt kontu.</translation> <translation id="8074253406171541171">10x13 (aploksne)</translation> <translation id="8078141288243656252">Pagrieztiem dokumentiem nevar pievienot piezīmes</translation> <translation id="8079031581361219619">Vai atkārtoti ielādēt vietni?</translation> @@ -1484,6 +1490,7 @@ <translation id="8105368624971345109">Izslēgt</translation> <translation id="8118489163946903409">Maksājuma veids</translation> <translation id="8127301229239896662">Programmatūra <ph name="SOFTWARE_NAME" /> netika pareizi instalēta datorā vai tīklā. Lūdziet IT administratoram atrisināt šo problēmu.</translation> +<translation id="8128526133099929547">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" /> un citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation> <translation id="8131740175452115882">Apstiprināt</translation> <translation id="8149426793427495338">Dators tika pārslēgts miega režīmā.</translation> <translation id="8150722005171944719">Vietnē <ph name="URL" /> esošo failu nevar nolasīt. Iespējams, tas ir noņemts vai pārvietots vai piekļuvei nepieciešamas atļaujas.</translation> @@ -1501,6 +1508,7 @@ <translation id="8218327578424803826">Piešķirtā atrašanās vieta:</translation> <translation id="8220146938470311105">C7/C6 (aploksne)</translation> <translation id="8220639454292072926">Enterprise pārskati</translation> +<translation id="8221250263817408492">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" /> un citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation> <translation id="8225771182978767009">Persona, kura iestatīja šo datoru, izvēlējās bloķēt šo vietni.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Atvērt lapu jaunā inkognito režīma cilnē</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index faac577..d0648735 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />да извршите дијагностика на мрежата<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Преведи ја страницата</translation> <translation id="2479410451996844060">Невалидна URL-адреса за пребарување.</translation> -<translation id="2482370039860827034">Тукушто ја внесовте својата лозинка на измамнички сајт. Chrome препорачува да одите на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и на други сајтови каде што ја користите лозинката и да ја промените веднаш.</translation> <translation id="2482878487686419369">Известувања</translation> <translation id="248348093745724435">Правила на уредот</translation> <translation id="2491120439723279231">Сертификатот на серверот содржи грешки.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Заштити ја сметката</translation> <translation id="2515629240566999685">Да го проверите сигналот во вашата област</translation> <translation id="2521385132275182522">Спојување долу десно</translation> -<translation id="2521483867890026383">Тукушто ја внесовте својата лозинка на измамнички сајт. Chromium препорачува да одите на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и на други сајтови каде што ја користите лозинката и да ја промените веднаш.</translation> <translation id="2523886232349826891">Зачувано само на овој уред</translation> <translation id="2524461107774643265">Додајте повеќе информации</translation> <translation id="2535659140340599600">{COUNT,plural, =1{и уште 1}one{и уште #}other{и уште #}}</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 9b71e020..918f1e66 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -591,6 +591,7 @@ <translation id="3828924085048779000">പാസ്ഫ്രെയ്സ് പൂരിപ്പിക്കാതിരിക്കാനാവില്ല.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" />അധിക ഫംഗ്ഷനുകൾക്കുള്ള വിപുലീകരണങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. വിപുലീകരണങ്ങൾക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസ് ഉണ്ട്.</translation> <translation id="3832522519263485449">ഇടതുവശത്ത് ഒന്നിലധികം പഞ്ച് ചെയ്യുക</translation> +<translation id="3838154488026099170">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നിവയിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> <translation id="3858027520442213535">തീയതിയും സമയവും അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="3884278016824448484">വിരുദ്ധ ഉപകരണ ഐഡന്റിഫയർ</translation> @@ -628,6 +629,7 @@ <translation id="4072486802667267160">നിങ്ങളുടെ ഓർഡർ പ്രോസസ് ചെയ്യുന്നതിൽ ഒരു പിശകുണ്ടായി. വീണ്ടും ശ്രമിച്ചുനോക്കൂ.</translation> <translation id="4075732493274867456">ഒരു സാധാരണ SSL പ്രോട്ടോക്കോൾ പതിപ്പിനെയോ സൈഫർ സ്യൂട്ടിനെയോ ക്ലയന്റും സെർവറും പിന്തുണയ്ക്കില്ല.</translation> <translation id="4075941231477579656">ടച്ച് ഐഡി</translation> +<translation id="4077092919748553596">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നിവയിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="4079302484614802869">പ്രോക്സി കോൺഫിഗറേഷൻ .pac സ്ക്രിപ്റ്റ് URL ഉപയോഗിക്കുന്നതിനായി സജ്ജീകരിച്ചിരിക്കുന്നു, സ്ഥിരമായ പ്രോക്സി സെർവറുകൾ ഉപയോഗിക്കുന്നതിനായല്ല.</translation> <translation id="4082393374666368382">ക്രമീകരണം - മാനേജ്മെൻ്റ്</translation> <translation id="4098354747657067197">വഞ്ചനാപരമായ സൈറ്റ് ഉണ്ട്</translation> @@ -707,6 +709,7 @@ <translation id="4356973930735388585">ഈ സൈറ്റിലെ ആക്രമണകാരികൾ നിങ്ങളുടെ വിവരങ്ങൾ മോഷ്ടിക്കാനോ ഇല്ലാതാക്കാനോ ഇടയുള്ള (ഉദാഹരണത്തിന്, ഫോട്ടോകൾ, പാസ്വേഡുകൾ, സന്ദേശങ്ങൾ, ക്രെഡിറ്റ് കാർഡുകൾ എന്നിവ) അപകടകരമായ പ്രോഗ്രാമുകൾ കമ്പ്യൂട്ടറിൽ ഇൻസ്റ്റാൾ ചെയ്യാൻ ശ്രമിച്ചേക്കാം.</translation> <translation id="4358059973562876591">നിങ്ങൾ വ്യക്തമാക്കിയ ടെംപ്ലേറ്റുകൾ DnsOverHttpsMode നയത്തിലെ പിശക് കാരണം ബാധകമാക്കാനായേക്കില്ല.</translation> <translation id="4358461427845829800">പേയ്മെന്റ് രീതികൾ മാനേജ് ചെയ്യുക...</translation> +<translation id="4359160567981085931">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. Chrome-ന് സഹായിക്കാനാവും. നിങ്ങളുടെ പാസ്വേഡ് മാറ്റാനും നിങ്ങളുടെ അക്കൗണ്ട് അപകടത്തിലായിരിക്കാമെന്ന് Google-നെ അറിയിക്കാനും 'അക്കൗണ്ട് പരിരക്ഷിക്കുക' ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="4367563149485757821">നമ്പർ-12 (എൻവലപ്പ്)</translation> <translation id="437058704415269440">അക്കൗണ്ട് ബാലൻസ്</translation> <translation id="4372516964750095882">ഫാൻഫോൾഡ്-Us</translation> @@ -981,6 +984,7 @@ <translation id="5728056243719941842">C5 (എൻവലപ്പ്)</translation> <translation id="5730040223043577876">മറ്റ് സൈറ്റുകളിൽ നിങ്ങളുടെ പാസ്വേഡ് പുനരുപയോഗിച്ചിട്ടുണ്ടെങ്കിൽ, അത് പുനഃസജ്ജീകരിക്കാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡ് സംരക്ഷിക്കുക}other{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡുകൾ സംരക്ഷിക്കുക}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{ഈ കാർഡിന് വെർച്വൽ നമ്പർ ഉപയോഗിക്കുക}other{ഒരു കാർഡ് തിരഞ്ഞെടുക്കുക}}</translation> <translation id="5763042198335101085">ശരിയായ ഇമെയിൽ വിലാസം നൽകുക</translation> <translation id="5763703224595565476">നിങ്ങളുടെ ബ്രൗസറിൽ Chrome എന്റർപ്രൈസ് ഉപയോക്തൃ പരിരക്ഷ അഡ്മിൻ പ്രവർത്തനക്ഷമമാക്കി. Chrome എന്റർപ്രൈസ് ഉപയോക്തൃ പരിരക്ഷയ്ക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസുണ്ട്.</translation> <translation id="5765072501007116331">ഡെലിവറി രീതികളും ആവശ്യകതകളും കാണാൻ ഒരു വിലാസം തിരഞ്ഞെടുക്കുക</translation> @@ -997,6 +1001,7 @@ <translation id="5804241973901381774">അനുമതികൾ</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> എന്നതിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷൻ കാലഹരണപ്പെട്ട സൈഫർ സ്യൂട്ട് ഉപയോഗിച്ച് എൻക്രിപ്റ്റുചെയ്തിരിക്കുന്നു.</translation> <translation id="5813119285467412249">&ചേർത്തത് വീണ്ടും ചെയ്യുക</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{നിങ്ങൾ പണമടയ്ക്കുമ്പോൾ ഈ കാർഡിന് നിരക്ക് ഈടാക്കും, എന്നാൽ ഈ സൈറ്റുമായി അതിന്റെ യഥാർത്ഥ നമ്പർ പങ്കിടില്ല. അധിക സുരക്ഷയ്ക്ക് താൽക്കാലികമായ ഒരു CVC സൃഷ്ടിക്കും.}other{നിങ്ങൾ പണമടയ്ക്കുമ്പോൾ, നിങ്ങൾ തിരഞ്ഞെടുത്ത കാർഡിന് നിരക്ക് ഈടാക്കും, എന്നാൽ ഈ സൈറ്റുമായി അതിന്റെ യഥാർത്ഥ നമ്പർ പങ്കിടില്ല. അധിക സുരക്ഷയ്ക്ക് താൽക്കാലികമായ ഒരു CVC സൃഷ്ടിക്കും.}}</translation> <translation id="583281660410589416">അജ്ഞാതം</translation> <translation id="5838278095973806738">അക്രമകാരികൾ മോഷ്ടിക്കാൻ സാധ്യതയുള്ളതിനാൽ ഈ സൈറ്റിൽ നിങ്ങളുടെ രഹസ്യ വിവരങ്ങളൊന്നും (ഉദാഹരണത്തിന്, പാസ്വേഡുകളോ ക്രെഡിറ്റ് കാർഡുകളോ പോലുള്ളവ) നൽകരുത്.</translation> <translation id="5851548754964597211">ടാബ് ലിസ്റ്റ്</translation> @@ -1452,6 +1457,7 @@ <translation id="8042918947222776840">പിക്കപ്പ് രീതി തിരഞ്ഞെടുക്കുക</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" ശരിയായി കോൺഫിഗർ ചെയ്തിട്ടില്ല. സാധാരണഗതിയിൽ "<ph name="SOFTWARE_NAME" />" അൺഇൻസ്റ്റാൾ ചെയ്യുന്നതിലൂടെ ഈ പ്രശ്നം പരിഹരിക്കാം. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">ക്ഷമിക്കണം, എന്തോ കുഴപ്പമുണ്ടായി.</translation> +<translation id="8067872629359326442">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. Chromium-ന് സഹായിക്കാനാവും. നിങ്ങളുടെ പാസ്വേഡ് മാറ്റാനും നിങ്ങളുടെ അക്കൗണ്ട് അപകടത്തിലായിരിക്കാമെന്ന് Google-നെ അറിയിക്കാനും 'അക്കൗണ്ട് പരിരക്ഷിക്കുക' ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="8074253406171541171">10x13 (എൻവലപ്പ്)</translation> <translation id="8078141288243656252">തിരിക്കുമ്പോൾ അനോട്ടേറ്റ് ചെയ്യാനാവില്ല</translation> <translation id="8079031581361219619">സൈറ്റ് റീലോഡ് ചെയ്യണോ?</translation> @@ -1468,6 +1474,7 @@ <translation id="8105368624971345109">ഓഫാക്കുക</translation> <translation id="8118489163946903409">പേയ്മെന്റ് രീതി</translation> <translation id="8127301229239896662">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അല്ലെങ്കിൽ നെറ്റ്വര്ക്കിൽ "<ph name="SOFTWARE_NAME" />" ശരിയായി ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. ഈ പ്രശ്നം പരിഹരിക്കാൻ നിങ്ങളുടെ ഐടി അഡ്മിനോട് ആവശ്യപ്പെടുക.</translation> +<translation id="8128526133099929547">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" /> എന്നതിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="8131740175452115882">സ്ഥിരീകരിക്കുക</translation> <translation id="8149426793427495338">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സ്ലീപ് മോഡിലാണ്.</translation> <translation id="8150722005171944719"><ph name="URL" /> എന്നതിലെ ഫയൽ റീഡ് ചെയ്യാനാവുന്നില്ല. അത് നീക്കംചെയ്തിരിക്കുകയോ, നീക്കിയിരിക്കുകയോ ഫയൽ അനുമതികൾ ആക്സസ് തടയുകയോ ചെയ്യുന്നുണ്ടാകാം.</translation> @@ -1485,6 +1492,7 @@ <translation id="8218327578424803826">നൽകിയിരിക്കുന്ന ലൊക്കേഷൻ:</translation> <translation id="8220146938470311105">C7/C6 (എൻവലപ്പ്)</translation> <translation id="8220639454292072926">എന്റർപ്രൈസ് റിപ്പോർട്ടിംഗ്</translation> +<translation id="8221250263817408492">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" /> എന്നതിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="8225771182978767009">ഈ കമ്പ്യൂട്ടർ സജ്ജമാക്കിയ വ്യക്തി, ഈ സൈറ്റ് ബ്ലോക്ക് ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">പുതിയൊരു അദൃശ്യ ടാബിൽ പേജ് തുറക്കുക</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 922c69a..c2d56f4 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -608,6 +608,7 @@ <translation id="3828924085048779000">Хоосон нууц үгийг зөвшөөрөхгүй.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> нэмэлт функцийн өргөтгөлүүдийг суулгасан байна. Өргөтгөлүүд нь таны зарим өгөгдөлд хандах эрхтэй.</translation> <translation id="3832522519263485449">Зүүн ирмэг дагуу олон нүх цоолох</translation> +<translation id="3838154488026099170">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Таны энэ нууц үгийг ашигладаг <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> болон бусад сайт руу очиж, түүнийг одоо өөрчлөхийг Chromium зөвлөж байна.</translation> <translation id="385051799172605136">Буцах</translation> <translation id="3858027520442213535">Огноо болон цагийг шинэчлэх</translation> <translation id="3884278016824448484">Зөрчилдөөнтэй төхөөрөмж танигч</translation> @@ -645,6 +646,7 @@ <translation id="4072486802667267160">Таны захиалгыг боловсруулахад алдаа гарлаa. Дахин оролдоно уу.</translation> <translation id="4075732493274867456">Үйлчлүүлэгч болон сервер нь SSL протоколын нийтлэг хувилбар, эсвэл шифрийн бүрдлийг дэмждэггүй.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Таны энэ нууц үгийг ашигладаг <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> болон бусад сайт руу очиж, түүнийг одоо өөрчлөхийг Chrome зөвлөж байна.</translation> <translation id="4079302484614802869">Прокси нь .pac бичвэрийн холбоосыг ашиглахаар тохируулагдсан ба прокси серверүүд нь тогтмол бус.</translation> <translation id="4082393374666368382">Тохиргоо - Удирдлага</translation> <translation id="4098354747657067197">Сэжиг бүхий сайт байна</translation> @@ -724,6 +726,7 @@ <translation id="4356973930735388585">Энэ сайтад байгаа халдагч таны мэдээллийг (жишээ нь: зураг, нууц үг, зурвас, кредит карт) хулгайлах, эсвэл устгах боломжтой аюултай программыг компьютерт суулгахаар оролдож болзошгүй.</translation> <translation id="4358059973562876591">Таны тодорхойлсон загваруудыг DnsOverHttpsMode удирдамжийн алдааны улмаас хэрэгжүүлэхгүй байж болзошгүй.</translation> <translation id="4358461427845829800">Төлбөрийн хэрэгслийг удирдах...</translation> +<translation id="4359160567981085931">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Chrome туслах боломжтой. Нууц үгээ өөрчилж, таны бүртгэл эрсдэлд oрсон байж болзошгүй тухай Google-д мэдэгдэхийн тулд Бүртгэлийг хамгаалах гэснийг товшино уу.</translation> <translation id="4367563149485757821">Дугаар-12 (Дугтуй)</translation> <translation id="437058704415269440">Дансны үлдэгдэл</translation> <translation id="4372516964750095882">Фанфолд-Us</translation> @@ -999,6 +1002,7 @@ <translation id="5728056243719941842">C5 (Дугтуй)</translation> <translation id="5730040223043577876">Хэрэв та нууц үгээ бусад сайтад дахин ашигласан бол Chrome-с үүнийг шинэчлэхийг зөвлөж байна.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Google Бүртгэлдээ карт хадгалах}other{Google Бүртгэлдээ карт хадгалах}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Энэ картад зориулан виртуал дугаарыг ашиглах}other{Картыг сонгоно уу}}</translation> <translation id="5763042198335101085">Зөв имэйл хаяг оруулна уу</translation> <translation id="5763703224595565476">Таны администратор таны хөтөч дээр Chrome байгууллагын хэрэглэгчийн хамгаалалтыг идэвхжүүлсэн байна. Chrome байгууллагын хэрэглэгчийн хамгаалалт нь таны зарим өгөгдөлд хандах эрхтэй.</translation> <translation id="5765072501007116331">Хүргэлтийн арга болон шаардлагыг харахын тулд хаяг сонгоно уу</translation> @@ -1015,6 +1019,7 @@ <translation id="5804241973901381774">Зөвшөөрлүүд</translation> <translation id="5810442152076338065">Таны <ph name="DOMAIN" />-тай холбогдох холболтыг хоцрогдсон шифр ашиглан шифрлэсэн байна.</translation> <translation id="5813119285467412249">& Нэмэх үйлдлийг дахин хийх</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Таныг төлбөр төлөх үед төлбөрийг энэ картаас суутгах боловч жинхэнэ дугаарыг нь энэ сайттай хуваалцахгүй. Нэмэлт хамгаалалтын үүднээс карт баталгаажуулалтын түр зуурын код үүcгэх болно.}other{Таныг төлбөр төлөх үед таны сонгох картаас төлбөрийг суутгах боловч жинхэнэ дугаарыг нь энэ сайттай хуваалцахгүй. Нэмэлт хамгаалалтын үүднээс карт баталгаажуулалтын түр зуурын код үүcгэх болно.}}</translation> <translation id="583281660410589416">Үл мэдэгдэх</translation> <translation id="5838278095973806738">Энэ сайтын мэдээллийг халдагч этгээд хулгайлж болзошгүй тул чухал мэдээллээ бүү оруулна уу (жишээ нь нууц үг, кредит карт зэрэг).</translation> <translation id="5851548754964597211">Цонхны жагсаалт</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Авах арга сонгох</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />"-г зөв тохируулаагүй байна. "<ph name="SOFTWARE_NAME" />"-г устгаснаар асуудлыг шийдвэрлэх боломжтой. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Уучлаарай, ямар нэг алдаа гарлаа.</translation> +<translation id="8067872629359326442">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Chromium туслах боломжтой. Нууц үгээ өөрчилж, таны бүртгэл эрсдэлд oрсон байж болзошгүй тухай Google-д мэдэгдэхийн тулд Бүртгэлийг хамгаалах гэснийг товшино уу.</translation> <translation id="8074253406171541171">10x13 (Дугтуй)</translation> <translation id="8078141288243656252">Эргүүлсэн үед тэмдэглэгээ хийх боломжгүй</translation> <translation id="8079031581361219619">Сайтыг дахин ачааллах уу?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Унтраах</translation> <translation id="8118489163946903409">Төлбөрийн арга</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />"-г таны компьютер эсвэл сүлжээнд зөв суулгаагүй байна. Энэ асуудлыг шийдвэрлэхийн тулд админтайгаа холбогдоно уу.</translation> +<translation id="8128526133099929547">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Таны энэ нууц үгийг ашигладаг <ph name="WEBSITE_1" /> болон бусад сайт руу очиж, түүнийг одоо өөрчлөхийг Chrome зөвлөж байна.</translation> <translation id="8131740175452115882">Батлах</translation> <translation id="8149426793427495338">Таны компьютер идэвхгүй болсон байна.</translation> <translation id="8150722005171944719"><ph name="URL" /> дахь файлыг унших боломжгүй байна. Энэ файл нь устгагдсан, шилжигдсэн, эсвэл хандалтыг хазгаарласан байж болно.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Заасан байршил:</translation> <translation id="8220146938470311105">C7/C6 (Дугтуй)</translation> <translation id="8220639454292072926">Байгууллагын мэдээлэл</translation> +<translation id="8221250263817408492">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. Таны энэ нууц үгийг ашигладаг <ph name="WEBSITE_1" /> болон бусад сайт руу очиж, түүнийг одоо өөрчлөхийг Chromium зөвлөж байна.</translation> <translation id="8225771182978767009">Энэ компьютерийг тохиуулсан хүн энэ сайтыг блоклосон байна.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Хуудсыг шинэ Нууцлалтай цонхонд нээх</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 7c8b247..4c712cd 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -606,6 +606,7 @@ <translation id="3828924085048779000">रिक्त सांकेतिक पासफ्रेझाची परवानगी नाही.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ने अतिरिक्त फंक्शनसाठी एक्स्टेंशन इंस्टॉल केले आहे. एक्स्टेंशनकडे तुमच्या काही डेटाचा अॅक्सेस आहे.</translation> <translation id="3832522519263485449">मल्टिपल पंच लेफ्ट</translation> +<translation id="3838154488026099170">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> आणि <ph name="WEBSITE_3" /> तसेच इतर साइटवर जाण्याची शिफारस करतो जेथे तुम्ही हा पासवर्ड वापरू शकता आणि तो आता बदलू शकता.</translation> <translation id="385051799172605136">मागील</translation> <translation id="3858027520442213535">तारीख आणि वेळ अपडेट करा</translation> <translation id="3884278016824448484">संघर्ष करणारा डिव्हाइस अभिज्ञापक</translation> @@ -643,6 +644,7 @@ <translation id="4072486802667267160">तुमच्या मागणीवर प्रक्रिया करताना एरर आली, कृपया पुन्हा प्रयत्न करा.</translation> <translation id="4075732493274867456">क्लायंट आणि सर्व्हर एक सामान्य SSL प्रोटोकॉल आवृत्ती किंवा सायफर संचाला सपोर्ट करीत नाही.</translation> <translation id="4075941231477579656">टच आयडी</translation> +<translation id="4077092919748553596">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> आणि <ph name="WEBSITE_3" /> तसेच इतर साइटवर जाण्याची शिफारस करतो जेथे तुम्ही हा पासवर्ड वापरू शकता आणि तो आता बदलू शकता.</translation> <translation id="4079302484614802869">प्रॉक्सी कॉन्फिगरेशन .pac स्क्रिप्ट URL वापरण्यास सेट करण्यात आले आहे, निश्चित प्रॉक्सी सर्व्हर नव्हे.</translation> <translation id="4082393374666368382">सेटिंग्ज - व्यवस्थापक</translation> <translation id="4098354747657067197">भ्रामक साइट पुढे आहे</translation> @@ -722,6 +724,7 @@ <translation id="4356973930735388585">या साइट वरील आक्रमणकर्ते तुमची माहिती (उदाहरणार्थ, फोटो, पासवर्ड, मेसेज आणि क्रेडिट कार्ड) चोरणारे किंवा हटविणारे धोकादायक प्रोग्राम तुमच्या कॉंप्युटरवर इंस्टॉल करण्याचा प्रयत्न करू शकतात.</translation> <translation id="4358059973562876591">DnsOverHttpsMode धोरणामधील एररमुळे तुम्ही नमूद केलेली टेम्पलेट कदाचित लागू केली जाऊ शकत नाहीत.</translation> <translation id="4358461427845829800">पेमेंट पद्धती व्यवस्थापित करा</translation> +<translation id="4359160567981085931">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chrome मदत करू शकते. तुमचा पासवर्ड बदलण्यासाठी आणि तुमच्या खात्याला धोका असल्याचे Google ला सूचित करण्यासाठी, खाते संरक्षित करावर क्लिक करा.</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">खाते शिल्लक</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -997,6 +1000,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">तुम्ही तुमच्या पासवर्डचा इतर साइटवर पुन्हा वापर केला असेल तर Chrome तुम्हाला तो रीसेट करण्याची शिफारस करत आहे.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{तुमच्या Google खात्यामध्ये कार्ड सेव्ह करा}other{तुमच्या Google खात्यामध्ये कार्डे सेव्ह करा}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{या कार्डसाठी आभासी नंबर वापरा}other{कार्ड वापरा}}</translation> <translation id="5763042198335101085">वैध ईमेल ॲड्रेस एंटर करा</translation> <translation id="5763703224595565476">तुमच्या अॅडमिनिस्ट्रेटरने तुमच्या ब्राउझरवर Chrome एंटरप्राइझ वापरकर्ता सुरक्षितता सुरू केली आहे. Chrome एंटरप्राइझ वापरकर्ता सुरक्षितता ला तुमच्या काही डेटाचा ॲक्सेस आहे.</translation> <translation id="5765072501007116331">वितरण पद्धती आणि आवश्यकता पाहण्यासाठी, एक पत्ता निवडा</translation> @@ -1013,6 +1017,7 @@ <translation id="5804241973901381774">परवानग्या</translation> <translation id="5810442152076338065">तुमचे <ph name="DOMAIN" /> वरील कनेक्शन ऑब्सोलीट सायफर सूट वापरून एंक्रिप्ट केलेले आहे.</translation> <translation id="5813119285467412249">&जोडा पुन्हा करा</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{तुम्ही पेमेंट केल्यावर या कार्डवर शुल्क आकारले जाईल पण त्याचा वास्तविक नंबर या साइटशी शेअर केला जाणार नाही. अतिरिक्त सुरक्षेसाठी, CVC जनरेट केले जाईल.}other{तुम्ही पेमेंट केल्यावर निवडलेल्या कार्डवर शुल्क आकारले जाईल पण त्याचा वास्तविक नंबर या साइटशी शेअर केला जाणार नाही. अतिरिक्त सुरक्षेसाठी, CVC जनरेट केले जाईल.}}</translation> <translation id="583281660410589416">अज्ञात</translation> <translation id="5838278095973806738">या साइटवर कोणतीही संवेदनशील माहिती (उदाहरणार्थ, पासवर्ड किंवा क्रेडिट कार्ड) एंटर करू नका, कारण आक्रमणकर्ते ती चोरू शकतात.</translation> <translation id="5851548754964597211">टॅब सूची</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">पिकअप पद्धत निवडा</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" योग्य रीतीने कॉन्फिगर केलेले नाही. "<ph name="SOFTWARE_NAME" />" अनइंस्टॉल केल्याने सहसा समस्या सुटते. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">सॉरी, काहीतरी चूक झाली.</translation> +<translation id="8067872629359326442">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chromium मदत करू शकते. तुमचा पासवर्ड बदलण्यासाठी आणि तुमच्या खात्याला धोका असल्याचे Google ला सूचित करण्यासाठी, खाते संरक्षित करावर क्लिक करा.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">फिरवल्यावर भाष्य करू शकत नाही</translation> <translation id="8079031581361219619">साइट रीलोड करायची?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">बंद करा</translation> <translation id="8118489163946903409">पेमेंट पद्धत</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" तुमच्या काँप्युटरवर किंवा नेटवर्कवर योग्य रीतीने इंस्टॉल केले नव्हते. तुमच्या अॅडमिनिस्ट्रेटरला ही समस्या सोडवण्यास सांगा.</translation> +<translation id="8128526133099929547">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chrome <ph name="WEBSITE_1" /> आणि इतर साइटवर जाण्याची शिफारस करतो जेथे तुम्ही हा पासवर्ड वापरू शकता आणि तो आता बदलू शकता.</translation> <translation id="8131740175452115882">पुष्टी करा</translation> <translation id="8149426793427495338">तुमचा कॉंप्युटर निष्क्रीय झाला.</translation> <translation id="8150722005171944719"><ph name="URL" /> येथील फाइल वाचनीय नाही. ती काढून टाकलेली, हलविलेली असू शकते किंवा फाइल परवानग्या ॲक्सेस प्रतिबंधित करत असू शकतात.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">नियुक्त केलेले स्थान:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">एंटरप्राइझ रिपोर्टिंग</translation> +<translation id="8221250263817408492">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. Chromium <ph name="WEBSITE_1" /> आणि इतर साइटवर जाण्याची शिफारस करतो जेथे तुम्ही हा पासवर्ड वापरू शकता आणि तो आता बदलू शकता.</translation> <translation id="8225771182978767009">ज्या व्यक्तीने हा कॉंप्युटर सेट केला त्या व्यक्तीने ही साइट ब्लॉक करण्याचे निवडले आहे.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">पेज नवीन गुप्त टॅबमध्ये उघडा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 45b3cdf..1ffef8bd 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Jalankan Diagnostik Rangkaian<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Terjemahkan halaman ini</translation> <translation id="2479410451996844060">URL carian tidak sah.</translation> -<translation id="2482370039860827034">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chrome mengesyorkan supaya anda pergi ke <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta tapak lain yang anda gunakan kata laluan ini dan menukarnya sekarang.</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="248348093745724435">Dasar mesin</translation> <translation id="2491120439723279231">Sijil pelayan mengandungi ralat.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Lindungi Akaun</translation> <translation id="2515629240566999685">Semak isyarat di kawasan anda</translation> <translation id="2521385132275182522">Kokot bawah sebelah kanan</translation> -<translation id="2521483867890026383">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chromium mengesyorkan supaya anda pergi ke <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta tapak lain yang anda gunakan kata laluan ini dan menukarnya sekarang.</translation> <translation id="2523886232349826891">Disimpan pada peranti ini sahaja</translation> <translation id="2524461107774643265">Tambahkan Maklumat Lanjut</translation> <translation id="2535659140340599600">{COUNT,plural, =1{dan 1 lagi}other{dan # lagi}}</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 3c87f2f..50e3f3b 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -328,7 +328,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />ကွန်ရက်ပြဿနာရှာဖွေမှု ပြုလုပ်ပါ<ph name="END_LINK" /></translation> <translation id="2473195200299095979">ဒီစာမျက်နှာကို ဘာသာပြန်ပေးရန်</translation> <translation id="2479410451996844060">URL ရှာဖွေမှု မမှန်။</translation> -<translation id="2482370039860827034">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် ဤစကားဝှက်အသုံးပြုသည့် အခြားဝဘ်ဆိုက်များသို့သွားပြီး ၎င်းကိုပြောင်းရန် Chrome က အကြံပြုပါသည်။</translation> <translation id="2482878487686419369">အကြောင်းကြားချက်များ</translation> <translation id="248348093745724435">စက်ပစ္စည်း မူဝါဒများ</translation> <translation id="2491120439723279231">ဆာဗာ၏ အသိမှတ်ပြုလက်မှ</translation> @@ -341,7 +340,6 @@ <translation id="2505268675989099013">အကောင့်ကို ကာကွယ်ပါ</translation> <translation id="2515629240566999685">သင့်နေရာဒေသရှိ လှိုင်းဆွဲအားကို စစ်ဆေးနေသည်</translation> <translation id="2521385132275182522">ညာဘက်အောက်ခြေတွင် ချုပ်စက်ဖြင့် ချုပ်ရန်</translation> -<translation id="2521483867890026383">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် ဤစကားဝှက်အသုံးပြုသည့် အခြားဝဘ်ဆိုက်များသို့သွားပြီး ၎င်းကိုပြောင်းရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="2523886232349826891">ဤစက်တွင်သာ သိမ်းထားသည်</translation> <translation id="2524461107774643265">နောက်ထပ် အချက်အလက်များကို ထည့်ခြင်း</translation> <translation id="2535659140340599600">{COUNT,plural, =1{နှင့် နောက်ထပ် ၁ ခု}other{နှင့် နောက်ထပ် # ခု}}</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index c9d9452d..b7fae60 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Netwerkcontrole uitvoeren<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Deze pagina vertalen</translation> <translation id="2479410451996844060">Ongeldige zoek-URL.</translation> -<translation id="2482370039860827034">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chrome raadt je aan naar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en andere sites te gaan waarop je dit wachtwoord hebt gebruikt en je wachtwoord nu te wijzigen.</translation> <translation id="2482878487686419369">Meldingen</translation> <translation id="248348093745724435">Apparaatbeleid</translation> <translation id="2491120439723279231">Het servercertificaat bevat fouten.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Account beschermen</translation> <translation id="2515629240566999685">Check of je bereik hebt in je omgeving</translation> <translation id="2521385132275182522">Nietje rechtsonder</translation> -<translation id="2521483867890026383">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chromium raadt je aan naar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en andere sites te gaan waarop je dit wachtwoord hebt gebruikt en je wachtwoord nu te wijzigen.</translation> <translation id="2523886232349826891">Alleen opgeslagen op dit apparaat</translation> <translation id="2524461107774643265">Meer informatie toevoegen</translation> <translation id="2535659140340599600">{COUNT,plural, =1{en nog 1}other{en nog #}}</translation> @@ -850,7 +848,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64-bits)</translation> -<translation id="5121469660360593280">Deel gegevens over beveiligingsgebeurtenissen die zijn gemarkeerd door Chrome Enterprise User Protect met je beheerder. Deze gegevens zijn bijvoorbeeld URL's van pagina's die je hebt bezocht, bestandsnamen of metadata en de gebruikersnaam die je gebruikt om in te loggen op je apparaat en bij Chrome.</translation> +<translation id="5121469660360593280">Deel gegevens over beveiligingsgebeurtenissen die zijn gemarkeerd door Chrome Enterprise User Protect met je beheerder. Deze gegevens zijn bijvoorbeeld URL's van pagina's die je hebt bezocht, bestandsnamen of metadata, en de gebruikersnaam die je gebruikt om in te loggen op je apparaat en bij Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Je kaart verifiëren</translation> <translation id="5135404736266831032">Adressen beheren...</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 4eae302c..1fb984f 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -607,6 +607,7 @@ <translation id="3828924085048779000">Tom passordfrase er ikke tillatt.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> har installert utvidelser for tilleggsfunksjoner. Utvidelsene har tilgang til noen av dataene dine.</translation> <translation id="3832522519263485449">Flere hull venstre</translation> +<translation id="3838154488026099170">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" />, samt andre nettsteder der du bruker dette passordet, og bytter det nå.</translation> <translation id="385051799172605136">Tilbake</translation> <translation id="3858027520442213535">Oppdater dato og klokkeslett</translation> <translation id="3884278016824448484">Motstridende enhetsidentifikator</translation> @@ -644,6 +645,7 @@ <translation id="4072486802667267160">Det oppsto en feil under behandlingen av bestillingen din. Prøv på nytt.</translation> <translation id="4075732493274867456">Klienten og tjeneren støtter ingen felles SSL-protokollversjon eller -chifferserie.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome anbefaler at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" />, samt andre nettsteder der du bruker dette passordet, og bytter det nå.</translation> <translation id="4079302484614802869">Konfigurasjonen av proxytjeneren er angitt til å bruke en nettadresse med .pac-skript, ikke statiske proxytjenere.</translation> <translation id="4082393374666368382">Innstillinger – Administrasjon</translation> <translation id="4098354747657067197">Villedende nettsted i sikte</translation> @@ -723,6 +725,7 @@ <translation id="4356973930735388585">Angripere på dette nettstedet kan prøve å installere farlige programmer på datamaskinen din. Disse kan stjele eller slette informasjonen din (for eksempel bilder, passord, e-post og kredittkortinformasjon).</translation> <translation id="4358059973562876591">Malene du har angitt, kan ikke tas i bruk på grunn av en feil med DnsOverHttpsMode-regelen.</translation> <translation id="4358461427845829800">Administrer betalingsmåter…</translation> +<translation id="4359160567981085931">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome kan hjelpe deg. For å bytte passord og varsle Google om at kontoen din kanskje er i fare, klikk på Beskytt konto.</translation> <translation id="4367563149485757821">Number-12 (konvolutt)</translation> <translation id="437058704415269440">Kontosaldo</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -998,6 +1001,7 @@ <translation id="5728056243719941842">C5 (konvolutt)</translation> <translation id="5730040223043577876">Chrome anbefaler at du tilbakestiller passordet ditt hvis du også har brukt det på andre nettsteder.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Lagre kort i Google-kontoen din}other{Lagre kort i Google-kontoen din}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Bruk et virtuelt nummer for dette kortet}other{Velg et kort}}</translation> <translation id="5763042198335101085">Angi en gyldig e-postadresse</translation> <translation id="5763703224595565476">Administratoren har slått på Chrome Enterprise User Protect i nettleseren din. Chrome Enterprise User Protect har tilgang til noen av dataene dine.</translation> <translation id="5765072501007116331">For å se leveringsmetoder og -krav, velg en adresse</translation> @@ -1014,6 +1018,7 @@ <translation id="5804241973901381774">Tillatelser</translation> <translation id="5810442152076338065">Tilkoblingen til <ph name="DOMAIN" /> er kryptert med en foreldet chifferserie.</translation> <translation id="5813119285467412249">&Legg til likevel</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Dette kortet blir belastet når du betaler, men det egentlige kortnummeret deles ikke med dette nettstedet. En midlertidig CVC-kode blir generert for ekstra sikkerhet.}other{Kortet du velger, blir belastet når du betaler, men det egentlige kortnummeret deles ikke med dette nettstedet. En midlertidig CVC-kode blir generert for ekstra sikkerhet.}}</translation> <translation id="583281660410589416">Ukjent</translation> <translation id="5838278095973806738">Du bør ikke oppgi sensitiv informasjon på dette nettstedet (for eksempel passord eller kredittkort) fordi den kan bli stjålet av angripere.</translation> <translation id="5851548754964597211">Faneliste</translation> @@ -1470,6 +1475,7 @@ <translation id="8042918947222776840">Velg hentemåte</translation> <translation id="8057711352706143257">«<ph name="SOFTWARE_NAME" />» er ikke riktig konfigurert. Avinstallering av «<ph name="SOFTWARE_NAME" />» løser vanligvis problemet. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Beklager, noe gikk galt.</translation> +<translation id="8067872629359326442">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium kan hjelpe deg. For å bytte passord og varsle Google om at kontoen din kanskje er i fare, klikk på Beskytt konto.</translation> <translation id="8074253406171541171">10x13 (konvolutt)</translation> <translation id="8078141288243656252">Kan ikke legge til annoteringer når dokumentet er rotert</translation> <translation id="8079031581361219619">Vil du laste inn nettstedet på nytt?</translation> @@ -1486,6 +1492,7 @@ <translation id="8105368624971345109">Slå av</translation> <translation id="8118489163946903409">Betalingsmåte</translation> <translation id="8127301229239896662">«<ph name="SOFTWARE_NAME" />» er ikke riktig installert på datamaskinen eller på nettverket. Be IT-administratoren din om å løse problemet.</translation> +<translation id="8128526133099929547">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome anbefaler at du går til <ph name="WEBSITE_1" />, samt andre nettsteder der du bruker dette passordet, og bytter det nå.</translation> <translation id="8131740175452115882">Bekreft</translation> <translation id="8149426793427495338">Datamaskinen din gikk inn i hvilemodus.</translation> <translation id="8150722005171944719">Kunne ikke lese filen på <ph name="URL" /> Den kan ha blitt fjernet eller flyttet. Det kan også være filtillatelser som forhindrer tilgang.</translation> @@ -1503,6 +1510,7 @@ <translation id="8218327578424803826">Tilordnet posisjon:</translation> <translation id="8220146938470311105">C7/C6 (konvolutt)</translation> <translation id="8220639454292072926">Bedriftsrapportering</translation> +<translation id="8221250263817408492">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" />, samt andre nettsteder der du bruker dette passordet, og bytter det nå.</translation> <translation id="8225771182978767009">Personen som konfigurerte denne datamaskinen, har valgt å blokkere dette nettstedet.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Åpne siden i et nytt inkognitovindu</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 2a3fdf7a..4ddeda5 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -603,6 +603,7 @@ <translation id="3828924085048779000">ਖਾਲੀ ਪਾਸਫਰੇਜ਼ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ਨੇ ਵਧੀਕ ਫੰਕਸ਼ਨਾਂ ਲਈ ਐਕਸਟੈਂਸ਼ਨਾਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਹਨ। ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਤੁਹਾਡੇ ਕੁਝ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਹੈ।</translation> <translation id="3832522519263485449">ਖੱਬੇ ਪਾਸੇ ਇੱਕ ਤੋਂ ਵੱਧ ਮੋਰੀਆਂ</translation> +<translation id="3838154488026099170">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ਅਤੇ ਉਹਨਾਂ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਜਾ ਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਵਰਤਿਆ ਹੈ।</translation> <translation id="385051799172605136">ਪਿੱਛੇ</translation> <translation id="3858027520442213535">ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="3884278016824448484">ਵਿਪਰੀਤ ਡੀਵਾਈਸ ਪਛਾਣਕਰਤਾ</translation> @@ -640,6 +641,7 @@ <translation id="4072486802667267160">ਤੁਹਾਡੇ ਆਰਡਰ 'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੌਰਾਨ ਗੜਬੜ ਹੋਈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="4075732493274867456">ਗਾਹਕ ਅਤੇ ਸਰਵਰ ਇੱਕ ਆਮ SSL ਪ੍ਰੋਟੋਕੋਲ ਵਰਜਨ ਜਾਂ ਸਿਫ਼ਰ ਸੁਈਟ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ ਹਨ।</translation> <translation id="4075941231477579656">ਸਪਰਸ਼ ਆਈਡੀ</translation> +<translation id="4077092919748553596">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਵੱਲੋਂ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ਅਤੇ ਉਹਨਾਂ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਜਾ ਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਵਰਤਿਆ ਹੈ।</translation> <translation id="4079302484614802869">ਪ੍ਰੌਕਸੀ ਸੰਰੂਪਿਤ ਇੱਕ .pac ਸਕ੍ਰਿਪਟ URL ਵਰਤਣ ਲਈ ਸੈੱਟ ਹੈ, ਸਥਿਰ ਪ੍ਰੌਕਸੀ ਸਰਵਰਾਂ ਨੂੰ ਨਹੀਂ।</translation> <translation id="4082393374666368382">ਸੈਟਿੰਗਾਂ - ਪ੍ਰਬੰਧਨ</translation> <translation id="4098354747657067197">ਅੱਗੇ ਧੋਖੇਬਾਜ਼ ਸਾਈਟ ਹੈ</translation> @@ -719,6 +721,7 @@ <translation id="4356973930735388585">ਇਸ ਸਾਈਟ 'ਤੇ ਹਮਲਾਵਰ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ 'ਤੇ ਖਤਰਨਾਕ ਪ੍ਰੋਗਰਾਮ ਸਥਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਨ ਜੋ ਕਿ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ (ਉਦਾਹਰਨ ਲਈ ਫ਼ੋਟੋਆਂ, ਪਾਸਵਰਡ, ਸੁਨੇਹੇ, ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ) ਨੂੰ ਚੋਰੀ ਕਰ ਸਕਦੇ ਹਨ ਜਾਂ ਮਿਟਾ ਸਕਦੇ ਹਨ।</translation> <translation id="4358059973562876591">ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਟੈਮਪਲੇਟ DnsOverHttpsMode ਨੀਤੀ ਵਿੱਚ ਕਿਸੇ ਗੜਬੜ ਕਾਰਨ ਸ਼ਾਇਦ ਲਾਗੂ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ।</translation> <translation id="4358461427845829800">ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation> +<translation id="4359160567981085931">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ। ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਅਤੇ ਆਪਣੇ ਖਾਤੇ ਦੇ ਜੋਖਮ ਵਿੱਚ ਹੋਣ ਬਾਰੇ Google ਨੂੰ ਸੂਚਿਤ ਕਰਨ ਲਈ, 'ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰੋ' 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="4367563149485757821">ਨੰਬਰ-12 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="437058704415269440">ਖਾਤਾ ਬਕਾਇਆ</translation> <translation id="4372516964750095882">ਫੈਨਫੋਲਡ-ਅਮਰੀਕਾ</translation> @@ -994,6 +997,7 @@ <translation id="5728056243719941842">C5 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="5730040223043577876">ਜੇਕਰ ਤੁਸੀਂ ਆਪਣੇ ਪਾਸਵਰਡ ਨੂੰ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਮੁੜ ਵਰਤਿਆ ਹੈ, ਤਾਂ Chrome ਵੱਲੋਂ ਇਸਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਕਾਰਡ ਰੱਖਿਅਤ ਕਰੋ}one{ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਕਾਰਡ ਰੱਖਿਅਤ ਕਰੋ}other{ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਕਾਰਡਾਂ ਨੂੰ ਰੱਖਿਅਤ ਕਰੋ}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{ਇਸ ਕਾਰਡ ਲਈ ਕੋਈ ਆਭਾਸੀ ਨੰਬਰ ਵਰਤੋ}one{ਕਾਰਡ ਚੁਣੋ}other{ਕਾਰਡ ਚੁਣੋ}}</translation> <translation id="5763042198335101085">ਕੋਈ ਵੈਧ ਈਮੇਲ ਪਤਾ ਦਾਖਲ ਕਰੋ</translation> <translation id="5763703224595565476">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ Chrome ਐਂਟਰਪ੍ਰਾਈਜ਼ ਵਰਤੋਂਕਾਰ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ। Chrome ਐਂਟਰਪ੍ਰਾਈਜ਼ ਵਰਤੋਂਕਾਰ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਦੀ ਤੁਹਾਡੇ ਕੁਝ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਹੈ।</translation> <translation id="5765072501007116331">ਅਦਾਇਗੀ ਵਿਧੀਆਂ ਅਤੇ ਲੋੜਾਂ ਨੂੰ ਦੇਖਣ ਲਈ, ਇੱਕ ਪਤਾ ਚੁਣੋ</translation> @@ -1010,6 +1014,7 @@ <translation id="5804241973901381774">ਅਨੁਮਤੀਆਂ</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> ਵਿੱਚ ਤੁਹਾਡਾ ਕਨੈਕਸ਼ਨ ਕਿਸੇ ਪੁਰਾਣਾ ਸਿਫ਼ਰ ਸੂਟ ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਏਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> <translation id="5813119285467412249">&ਜੋੜੋ ਨੂੰ ਰੀਡੂ ਕਰੋ</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{ਤੁਹਾਡੇ ਵੱਲੋਂ ਭੁਗਤਾਨ ਕਰਨ 'ਤੇ ਇਸ ਕਾਰਡ ਤੋਂ ਖਰਚਾ ਲਿਆ ਜਾਵੇਗਾ, ਪਰ ਇਸਦਾ ਅਸਲੀ ਨੰਬਰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, ਅਸਥਾਈ CVC ਸਿਰਜਿਆ ਜਾਵੇਗਾ।}one{ਤੁਹਾਡੇ ਵੱਲੋਂ ਭੁਗਤਾਨ ਕਰਨ 'ਤੇ ਚੁਣੇ ਹੋਏ ਕਾਰਡ ਤੋਂ ਖਰਚਾ ਲਿਆ ਜਾਵੇਗਾ, ਪਰ ਇਸਦਾ ਅਸਲੀ ਨੰਬਰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, ਅਸਥਾਈ CVC ਸਿਰਜਿਆ ਜਾਵੇਗਾ।}other{ਤੁਹਾਡੇ ਵੱਲੋਂ ਭੁਗਤਾਨ ਕਰਨ 'ਤੇ ਚੁਣੇ ਹੋਏ ਕਾਰਡਾਂ ਤੋਂ ਖਰਚਾ ਲਿਆ ਜਾਵੇਗਾ, ਪਰ ਇਹਨਾਂ ਦਾ ਅਸਲੀ ਨੰਬਰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, ਅਸਥਾਈ CVC ਸਿਰਜਿਆ ਜਾਵੇਗਾ।}}</translation> <translation id="583281660410589416">ਅਗਿਆਤ</translation> <translation id="5838278095973806738">ਤੁਹਾਨੂੰ ਇਸ ਸਾਈਟ 'ਤੇ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ (ਉਦਾਹਰਨ ਲਈ, ਪਾਸਵਰਡਾਂ ਜਾਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡਾਂ) ਨੂੰ ਦਾਖਲ ਨਹੀਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਕਿਉਂਕਿ ਹਮਲਾਵਰ ਉਸਨੂੰ ਚੋਰੀ ਕਰ ਸਕਦੇ ਹਨ।</translation> <translation id="5851548754964597211">ਟੈਬ ਸੂਚੀ</translation> @@ -1466,6 +1471,7 @@ <translation id="8042918947222776840">ਪਿਕਅੱਪ ਵਿਧੀ ਚੁਣੋ</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" ਦੀ ਸਹੀ ਢੰਗ ਨਾਲ ਰੂਪ-ਰੇਖਾ ਬਦਲੀ ਨਹੀਂ ਗਈ ਹੈ। ਆਮ ਤੌਰ 'ਤੇ "<ph name="SOFTWARE_NAME" />" ਨੂੰ ਅਣਸਥਾਪਤ ਕਰਨ 'ਤੇ ਸਮੱਸਿਆ ਠੀਕ ਹੋ ਜਾਂਦੀ ਹੈ। <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">ਮਾਫ਼ ਕਰਨਾ, ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ।</translation> +<translation id="8067872629359326442">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ। ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਅਤੇ ਆਪਣੇ ਖਾਤੇ ਦੇ ਜੋਖਮ ਵਿੱਚ ਹੋਣ ਬਾਰੇ Google ਨੂੰ ਸੂਚਿਤ ਕਰਨ ਲਈ, 'ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰੋ' 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="8074253406171541171">10x13 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="8078141288243656252">ਘੁਮਾਉਣ 'ਤੇ ਐਨੋਟੇਟ ਨਹੀਂ ਕਰ ਸਕਦੇ</translation> <translation id="8079031581361219619">ਕੀ ਸਾਈਟ ਰੀਲੋਡ ਕਰਨੀ ਹੈ?</translation> @@ -1482,6 +1488,7 @@ <translation id="8105368624971345109">ਬੰਦ ਕਰੋ</translation> <translation id="8118489163946903409">ਭੁਗਤਾਨ ਵਿਧੀ</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਜਾਂ ਨੈੱਟਵਰਕ 'ਤੇ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸਥਾਪਤ ਨਹੀਂ ਹੋਇਆ। ਆਪਣੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਇਸ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਕਹੋ।</translation> +<translation id="8128526133099929547">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਵੱਲੋਂ <ph name="WEBSITE_1" /> ਅਤੇ ਉਹਨਾਂ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਜਾ ਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਵਰਤਿਆ ਹੈ।</translation> <translation id="8131740175452115882">ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="8149426793427495338">ਤੁਹਾਡਾ ਕੰਪਿਊਟਰ ਸਲੀਪ ਮੋਡ ਵਿੱਚ ਚਲਾ ਗਿਆ।</translation> <translation id="8150722005171944719"><ph name="URL" /> ਤੇ ਫਾਈਲ ਪੜ੍ਹਨਯੋਗ ਨਹੀਂ ਹੈ। ਇਹ ਹਟਾਈ ਗਈ, ਮੂਵ ਕੀਤੀ ਗਈ ਹੋ ਸਕਦੀ ਹੈ ਜਾਂ ਸ਼ਾਇਦ ਫਾਈਲ ਅਨੁਮਤੀਆਂ ਪਹੁੰਚ ਰੋਕ ਰਹੀਆਂ ਹਨ।</translation> @@ -1499,6 +1506,7 @@ <translation id="8218327578424803826">ਅਸਾਈਨ ਕੀਤਾ ਗਿਆ ਨਿਰਧਾਰਿਤ ਸਥਾਨ:</translation> <translation id="8220146938470311105">C7/C6 (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="8220639454292072926">ਐਂਟਰਪ੍ਰਾਈਜ਼ ਰਿਪੋਰਟਿੰਗ</translation> +<translation id="8221250263817408492">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" /> ਅਤੇ ਉਹਨਾਂ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਜਾ ਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਵਰਡ ਵਰਤਿਆ ਹੈ।</translation> <translation id="8225771182978767009">ਜਿਸ ਵਿਅਕਤੀ ਨੇ ਇਸ ਕੰਪਿਊਟਰ ਦਾ ਸੈੱਟ ਅੱਪ ਕੀਤਾ ਹੈ ਉਸ ਵੱਲੋਂ ਇਸ ਸਾਈਟ ਨੂੰ ਬਲਾਕ ਕਰਨਾ ਚੁਣਿਆ ਗਿਆ ਹੈ।</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">ਕਿਸੇ ਨਵੀਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬ ਵਿੱਚ ਪੰਨਾ ਖੋਲ੍ਹੋ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 9b6dcdd..d346130 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Uruchom diagnostykę sieci<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Przetłumacz tę stronę</translation> <translation id="2479410451996844060">Nieprawidłowy URL wyszukiwania</translation> -<translation id="2482370039860827034">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca, by natychmiast zmienić je na <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> oraz na innych stronach, na których używasz tego hasła.</translation> <translation id="2482878487686419369">Powiadomienia</translation> <translation id="248348093745724435">Zasady dotyczące komputera</translation> <translation id="2491120439723279231">Certyfikat serwera zawiera błędy.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Chroń konto</translation> <translation id="2515629240566999685">Sprawdź sygnał w swojej okolicy</translation> <translation id="2521385132275182522">Zszywka w prawym dolnym rogu</translation> -<translation id="2521483867890026383">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca, by natychmiast zmienić je na <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> oraz na innych stronach, na których używasz tego hasła.</translation> <translation id="2523886232349826891">Zapisana tylko na tym urządzeniu</translation> <translation id="2524461107774643265">Dodaj więcej informacji</translation> <translation id="2535659140340599600">{COUNT,plural, =1{i jeszcze 1}few{i jeszcze #}many{i jeszcze #}other{i jeszcze #}}</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 250d4b7..c1c6b44 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -68,7 +68,7 @@ <translation id="1264126396475825575">Relatório de erros registrado em <ph name="CRASH_TIME" /> (ainda não enviado ou ignorado)</translation> <translation id="1270502636509132238">Método de Retirada</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> -<translation id="1285400217480592994">Verifica o conteúdo dos arquivos de que você faz o download ou upload no Chrome.</translation> +<translation id="1285400217480592994">Verifica o conteúdo dos arquivos que você transfere por download ou upload no Chrome.</translation> <translation id="1292701964462482250">"Algum software no seu computador está impedindo o Google Chrome de se conectar com segurança à Web" (somente computadores Windows)</translation> <translation id="1294154142200295408">Variações de linha de comando</translation> <translation id="129553762522093515">Recentemente fechadas</translation> @@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Executar o Diagnóstico de Rede<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Traduzir esta página</translation> <translation id="2479410451996844060">URL de pesquisa inválido.</translation> -<translation id="2482370039860827034">Você acabou de digitar sua senha em um site suspeito. O Chrome recomenda acessar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que você usa essa senha para mudá-la agora mesmo.</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="248348093745724435">Políticas do computador</translation> <translation id="2491120439723279231">O certificado do servidor contém erros.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Proteger conta</translation> <translation id="2515629240566999685">Verificar o sinal na sua área</translation> <translation id="2521385132275182522">Grampo na parte inferior direita</translation> -<translation id="2521483867890026383">Você acabou de digitar sua senha em um site suspeito. O Chromium recomenda acessar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que você usa essa senha para mudá-la agora mesmo.</translation> <translation id="2523886232349826891">Salvo apenas neste dispositivo</translation> <translation id="2524461107774643265">Adicione Mais Informações</translation> <translation id="2535659140340599600">{COUNT,plural, =1{e mais 1}one{e mais #}other{e mais #}}</translation> @@ -497,7 +495,7 @@ <translation id="3369192424181595722">Erro do relógio</translation> <translation id="337363190475750230">Desprovisionado</translation> <translation id="3377188786107721145">Erro de análise da política</translation> -<translation id="3377736046129930310">Use o bloqueio de tela para confirmar seus cartões rapidamente</translation> +<translation id="3377736046129930310">Use o bloqueio de tela para confirmar seus cartões mais rapidamente</translation> <translation id="3380365263193509176">Erro desconhecido</translation> <translation id="3380864720620200369">ID do cliente:</translation> <translation id="3387261909427947069">Formas de pagamento</translation> @@ -744,7 +742,7 @@ <translation id="4515275063822566619">Os cartões e os endereços vieram do Chrome e da sua Conta do Google (<ph name="ACCOUNT_EMAIL" />). É possível gerenciar essas opções em <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm 10 (Envelope)</translation> <translation id="4522570452068850558">Saiba mais</translation> -<translation id="4524138615196389145">Confirme seus cartões rapidamente usando WebAuthn de agora em diante</translation> +<translation id="4524138615196389145">Confirme seus cartões mais rapidamente usando o WebAuthn de agora em diante</translation> <translation id="4524805452350978254">Gerenciar cartões</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -1133,7 +1131,7 @@ <translation id="6409754798200046165">Você acabou de digitar sua senha em um site suspeito. O Chrome recomenda que você a mude agora.</translation> <translation id="6410264514553301377">Digite a data de validade e o CVC do <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">No Chromium, você pode receber ajuda para proteger sua Conta do Google e alterar sua senha.</translation> -<translation id="6423385022588644828">Confirme seus cartões rapidamente usando Touch ID de agora em diante</translation> +<translation id="6423385022588644828">Confirme seus cartões mais rapidamente usando o Touch ID de agora em diante</translation> <translation id="6427730057873428458">Dobra janela</translation> <translation id="6433490469411711332">Editar informações de contato</translation> <translation id="6433595998831338502">A conexão com <ph name="HOST_NAME" /> foi recusada.</translation> @@ -1204,7 +1202,7 @@ <translation id="6786747875388722282">Extensões</translation> <translation id="6790428901817661496">Reproduzir</translation> <translation id="679355240208270552">Ignorado porque a pesquisa padrão não foi ativada pela política.</translation> -<translation id="6794951432696553238">Confirme seus cartões rapidamente usando o Windows Hello de agora em diante</translation> +<translation id="6794951432696553238">Confirme seus cartões mais rapidamente usando o Windows Hello de agora em diante</translation> <translation id="681021252041861472">Campo obrigatório</translation> <translation id="6810899417690483278">Código de personalização</translation> <translation id="6825578344716086703">Você tentou acessar <ph name="DOMAIN" />, mas o servidor apresentou um certificado assinado com um algoritmo de assinatura fraco (como SHA-1). Isso significa que as credenciais de segurança apresentadas pelo servidor podem ter sido forjadas, e talvez o servidor não seja o esperado (talvez você esteja se comunicando com um invasor).</translation> @@ -1240,7 +1238,7 @@ <translation id="6989763994942163495">Mostrar configurações avançadas...</translation> <translation id="6993898126790112050">6x9 (Envelope)</translation> <translation id="6996312675313362352">Sempre traduzir <ph name="ORIGINAL_LANGUAGE" /></translation> -<translation id="7004583254764674281">Use o Windows Hello para confirmar o uso de cartões rapidamente</translation> +<translation id="7004583254764674281">Use o Windows Hello para confirmar o uso de cartões mais rapidamente</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Essas cobranças podem ser únicas ou recorrentes e talvez não sejam óbvias.</translation> <translation id="7029809446516969842">Senhas</translation> @@ -1338,7 +1336,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Saber mais<ph name="END_LINK" /> sobre esse problema.</translation> <translation id="7455133967321480974">Usar padrão global (Bloquear)</translation> <translation id="7460618730930299168">A exibição na tela está diferente da que você selecionou. Continuar?</translation> -<translation id="7464821087936825778">Sair do modo de pesquisa</translation> +<translation id="7464821087936825778">Saindo do modo de pesquisa</translation> <translation id="7473891865547856676">Não, obrigado</translation> <translation id="7481312909269577407">Avançar</translation> <translation id="7485870689360869515">Nenhum dado encontrado</translation> @@ -1563,7 +1561,7 @@ <translation id="8559762987265718583">Não é possível estabelecer uma conexão privada com <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />, porque a data e a hora do seu dispositivo (<ph name="DATE_AND_TIME" />) estão incorretas.</translation> <translation id="8564985650692024650">O Chromium recomenda redefinir sua senha de <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> se você a reutilizou em outros sites.</translation> <translation id="8571890674111243710">Traduzindo página para <ph name="LANGUAGE" />...</translation> -<translation id="8574899947864779331">Use o Touch ID para confirmar seus cartões rapidamente</translation> +<translation id="8574899947864779331">Use o Touch ID para confirmar seus cartões mais rapidamente</translation> <translation id="858637041960032120">Ad. nº. telefone </translation> <translation id="860043288473659153">Nome do titular do cartão</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 9305c2b..cd7a13f 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Executar o Diagnóstico de rede<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Traduzir esta página</translation> <translation id="2479410451996844060">URL de pesquisa inválido.</translation> -<translation id="2482370039860827034">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chrome recomenda que aceda a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que utilize esta palavra-passe e que a altere agora.</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="248348093745724435">Políticas do computador</translation> <translation id="2491120439723279231">O certificado do servidor contém erros.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Proteger conta</translation> <translation id="2515629240566999685">Verificar o sinal na área</translation> <translation id="2521385132275182522">Agrafar parte inferior direita</translation> -<translation id="2521483867890026383">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chromium recomenda que aceda a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que utilize esta palavra-passe e que a altere agora.</translation> <translation id="2523886232349826891">Guardado apenas neste dispositivo.</translation> <translation id="2524461107774643265">Adicionar mais informações</translation> <translation id="2535659140340599600">{COUNT,plural, =1{e mais 1}other{e mais #}}</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index e739ca7..f27efa83 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -605,6 +605,7 @@ <translation id="3828924085048779000">Trebuie să fie introdusă expresia de acces.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> a instalat extensii pentru funcții suplimentare. Extensiile au acces la unele dintre datele tale.</translation> <translation id="3832522519263485449">Perforare multiplă în stânga</translation> +<translation id="3838154488026099170">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /> și alte site-uri pe care folosești această parolă și să o schimbi acum.</translation> <translation id="385051799172605136">Înapoi</translation> <translation id="3858027520442213535">Actualizează data și ora</translation> <translation id="3884278016824448484">Identificator de gadget în conflict</translation> @@ -642,6 +643,7 @@ <translation id="4072486802667267160">A apărut o eroare la procesarea comenzii. Încearcă din nou.</translation> <translation id="4075732493274867456">Clientul și serverul nu acceptă o versiune a protocolului SSL sau o suită de codificare obișnuită.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Ai introdus parola pe un site înșelător. Chrome recomandă să accesezi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /> și alte site-uri pe care folosești această parolă și să o schimbi acum.</translation> <translation id="4079302484614802869">Configurația pentru proxy este setată să utilizeze o adresă URL pentru scripturi .pac, și nu servere proxy fixe.</translation> <translation id="4082393374666368382">Setări – Administrator</translation> <translation id="4098354747657067197">Urmează un site înșelător</translation> @@ -721,6 +723,7 @@ <translation id="4356973930735388585">Atacatorii de pe acest site pot încerca să instaleze programe periculoase pe computerul tău, care să îți fure sau să îți șteargă informațiile (de exemplu, fotografiile, parolele, mesajele sau informațiile despre cardurile de credit).</translation> <translation id="4358059973562876591">Șabloanele specificate nu pot fi aplicate din cauza unei erori legate de politica DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Gestionează metodele de plată...</translation> +<translation id="4359160567981085931">Ai introdus parola pe un site înșelător. Chrome te poate ajuta. Ca să schimbi parola și să anunți Google că respectivul cont poate fi în pericol, dă clic pe Protejează contul.</translation> <translation id="4367563149485757821">Number-12 (Plic)</translation> <translation id="437058704415269440">Soldul contului</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -864,7 +867,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64 de biți)</translation> -<translation id="5121469660360593280">Permite-i administratorului accesul la datele despre evenimentele de securitate semnalate de Protecția Chrome pentru utilizatorii din întreprinderi. Aici pot fi incluse adresele URL ale paginilor pe care le accesezi, numele de fișiere sau metadate și numele de utilizator cu care te conectezi pe dispozitiv și la Chrome.</translation> +<translation id="5121469660360593280">Permite-i administratorului accesul la datele despre evenimentele de securitate semnalate de Protecția utilizatorilor Chrome Enterprise. Aici pot fi incluse adresele URL ale paginilor pe care le accesezi, numele de fișiere sau metadate și numele de utilizator cu care te conectezi pe dispozitiv și la Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Confirmă cardul</translation> <translation id="5135404736266831032">Gestionează adresele...</translation> @@ -876,7 +879,7 @@ <translation id="5159010409087891077">Deschide pagina într-o fereastră incognito nouă (⇧⌘N)</translation> <translation id="516920405563544094">Introdu codul CVC pentru <ph name="CREDIT_CARD" />. După ce confirmi, acest site va avea acces la detaliile cardului tău din Contul Google.</translation> <translation id="5169827969064885044">Este posibil să pierzi accesul la contul organizației sau să fii victima unui furt de identitate. Chrome îți recomandă să îți schimbi acum parola.</translation> -<translation id="5170017743895942767">Protecție Chrome pentru utilizatorii din întreprinderi</translation> +<translation id="5170017743895942767">Protecția utilizatorilor Chrome Enterprise</translation> <translation id="5171045022955879922">Caută sau introdu adresa URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Computer</translation> @@ -996,8 +999,9 @@ <translation id="5728056243719941842">C5 (Plic)</translation> <translation id="5730040223043577876">Chrome îți recomandă să resetezi parola dacă ai folosit-o și pe alte site-uri.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salvează cardul în Contul Google}few{Salvează cardurile în Contul Google}other{Salvează cardurile în Contul Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Folosește un număr virtual pentru acest card}few{Selectează un card}other{Selectează un card}}</translation> <translation id="5763042198335101085">Introdu o adresă de e-mail validă</translation> -<translation id="5763703224595565476">Administratorul a activat în browser Protecția Chrome pentru utilizatorii din întreprinderi. Protecția Chrome pentru utilizatorii din întreprinderi are acces la o parte din datele tale.</translation> +<translation id="5763703224595565476">Administratorul a activat în browser Protecția utilizatorilor Chrome Enterprise. Protecția utilizatorilor Chrome Enterprise are acces la o parte din datele tale.</translation> <translation id="5765072501007116331">Pentru a vedea metodele de livrare și cerințele, selectează o adresă</translation> <translation id="5778550464785688721">Control complet asupra dispozitivelor MIDI</translation> <translation id="5781136890105823427">Experimentul a fost activat</translation> @@ -1012,6 +1016,7 @@ <translation id="5804241973901381774">Permisiuni</translation> <translation id="5810442152076338065">Conexiunea la <ph name="DOMAIN" /> este criptată folosind o suită de codificare învechită.</translation> <translation id="5813119285467412249">&Repetați adăugarea</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Cardul va fi debitat când plătești, dar numărul său real nu va fi trimis acestui site. Pentru un plus de securitate, va fi generat un cod CVC temporar.}few{Cardul pe care îl selectezi va fi debitat când plătești, dar numărul său real nu va fi trimis acestui site. Pentru un plus de securitate, va fi generat un cod CVC temporar.}other{Cardul pe care îl selectezi va fi debitat când plătești, dar numărul său real nu va fi trimis acestui site. Pentru un plus de securitate, va fi generat un cod CVC temporar.}}</translation> <translation id="583281660410589416">Necunoscut</translation> <translation id="5838278095973806738">Nu ar trebui să introduci informații sensibile pe acest site (de exemplu, parole sau carduri de credit), deoarece ar putea fi furate de atacatori.</translation> <translation id="5851548754964597211">Listă de file</translation> @@ -1077,7 +1082,7 @@ <translation id="6094273045989040137">Adnotează</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> -<translation id="6120179357481664955">Mai știi contul UPI?</translation> +<translation id="6120179357481664955">Îți amintești ID-ul UPI?</translation> <translation id="6132597952260690497">Informații despre extensiile și pluginurile instalate</translation> <translation id="6146055958333702838">Verifică toate cablurile și repornește routerele, modemurile sau alte dispozitive de rețea pe care le folosești.</translation> @@ -1312,7 +1317,7 @@ <translation id="733923710415886693">Certificatul serverului nu a fost dezvăluit folosind Transparența certificatului.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Este afiliat:</translation> -<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> a activat în browser Protecția Chrome pentru utilizatorii din întreprinderi. Protecția Chrome pentru utilizatorii din întreprinderi are acces la o parte din datele tale.</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> a activat în browser Protecția utilizatorilor Chrome Enterprise. Protecția utilizatorilor Chrome Enterprise are acces la o parte din datele tale.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Linie de comandă</translation> <translation id="7372973238305370288">rezultat al căutării</translation> @@ -1469,6 +1474,7 @@ <translation id="8042918947222776840">Alege metoda de preluare</translation> <translation id="8057711352706143257">„<ph name="SOFTWARE_NAME" />” nu este configurat corect. De obicei, problema se remediază dezinstalând „<ph name="SOFTWARE_NAME" />” <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">A apărut o eroare.</translation> +<translation id="8067872629359326442">Ai introdus parola pe un site înșelător. Chromium te poate ajuta. Ca să schimbi parola și să anunți Google că respectivul cont poate fi în pericol, dă clic pe Protejează contul.</translation> <translation id="8074253406171541171">10x13 (Plic)</translation> <translation id="8078141288243656252">Nu se poate adnota când este rotit</translation> <translation id="8079031581361219619">Reîncarci site-ul?</translation> @@ -1485,6 +1491,7 @@ <translation id="8105368624971345109">Dezactivează</translation> <translation id="8118489163946903409">Metodă de plată</translation> <translation id="8127301229239896662">„<ph name="SOFTWARE_NAME" />” nu a fost instalat corect pe computer sau în rețea. Contactează administratorul IT pentru a remedia această problemă.</translation> +<translation id="8128526133099929547">Ai introdus parola pe un site înșelător. Chrome recomandă să accesezi <ph name="WEBSITE_1" /> și alte site-uri pe care folosești această parolă și să o schimbi acum.</translation> <translation id="8131740175452115882">Confirmați</translation> <translation id="8149426793427495338">Computerul este inactiv.</translation> <translation id="8150722005171944719">Fișierul de la <ph name="URL" /> nu poate fi citit. Este posibil să fi fost eliminat ori mutat sau ca permisiunile pentru fișiere să împiedice accesarea acestuia.</translation> @@ -1502,6 +1509,7 @@ <translation id="8218327578424803826">Locație atribuită:</translation> <translation id="8220146938470311105">C7/C6 (Plic)</translation> <translation id="8220639454292072926">Raportare la nivel de întreprindere</translation> +<translation id="8221250263817408492">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" /> și alte site-uri pe care folosești această parolă și să o schimbi acum.</translation> <translation id="8225771182978767009">Persoana care a configurat computerul a ales să blocheze acest site.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Deschide pagina într-o filă incognito nouă</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index ee277e1..53adfde1 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -591,6 +591,7 @@ <translation id="3828924085048779000">Пустые кодовые фразы запрещены.</translation> <translation id="3831915413245941253">Администратор <ph name="ENROLLMENT_DOMAIN" /> установил расширения с дополнительными функциями для браузера. У расширений есть доступ к некоторым вашим данным.</translation> <translation id="3832522519263485449">Несколько отверстий слева</translation> +<translation id="3838154488026099170">Вы только что ввели пароль на поддельном сайте. Рекомендуем немедленно сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> и других сайтов, на которых вы используете введенный пароль.</translation> <translation id="385051799172605136">Назад</translation> <translation id="3858027520442213535">Обновить дату и время</translation> <translation id="3884278016824448484">Конфликт идентификаторов устройств</translation> @@ -628,6 +629,7 @@ <translation id="4072486802667267160">При обработке заказа произошла ошибка. Повторите попытку.</translation> <translation id="4075732493274867456">Клиент и сервер поддерживают разные версии протокола SSL или набора шифров.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Вы только что ввели пароль на поддельном сайте. Рекомендуем немедленно сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> и других сайтов, на которых вы используете введенный пароль.</translation> <translation id="4079302484614802869">Конфигурация прокси-сервера предусматривает использование URL PAC-скриптов вместо фиксированных прокси-серверов.</translation> <translation id="4082393374666368382">Настройки – Управление</translation> <translation id="4098354747657067197">Осторожно, поддельный сайт!</translation> @@ -707,6 +709,7 @@ <translation id="4356973930735388585">Злоумышленники могут использовать этот сайт, чтобы установить на ваш компьютер вредоносное ПО, которое крадет или удаляет личную информацию (например, фотографии, пароли, сообщения и реквизиты банковских карт).</translation> <translation id="4358059973562876591">Указанные вами шаблоны нельзя применить из-за ошибки в настройке правила DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Управление способами оплаты…</translation> +<translation id="4359160567981085931">Вы только что ввели пароль на поддельном сайте. Чтобы изменить пароль и сообщить Google о возможной угрозе безопасности, нажмите "Защитить аккаунт".</translation> <translation id="4367563149485757821">Number-12 (конверт)</translation> <translation id="437058704415269440">Баланс</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -981,6 +984,7 @@ <translation id="5728056243719941842">C5 (конверт)</translation> <translation id="5730040223043577876">Chrome рекомендует сбросить пароль, если вы использовали его на других сайтах.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Сохраните карту в аккаунте Google}one{Сохраните карты в аккаунте Google}few{Сохраните карты в аккаунте Google}many{Сохраните карты в аккаунте Google}other{Сохраните карты в аккаунте Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Используйте для карты виртуальный номер}one{Выберите карту}few{Выберите карту}many{Выберите карту}other{Выберите карту}}</translation> <translation id="5763042198335101085">Укажите действительный адрес электронной почты.</translation> <translation id="5763703224595565476">Администратор включил в браузере систему защиты пользователей Chrome Enterprise, у которой есть доступ к некоторым вашим данным.</translation> <translation id="5765072501007116331">Выберите адрес, чтобы посмотреть способы и условия доставки.</translation> @@ -997,6 +1001,7 @@ <translation id="5804241973901381774">Разрешения</translation> <translation id="5810442152076338065">Соединение с <ph name="DOMAIN" /> зашифровано с помощью устаревшего набора шифров.</translation> <translation id="5813119285467412249">&Повторить добавление</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{При оплате средства будут списаны с этой карты, но ее настоящий номер не станет известен этому сайту. Для обеспечения дополнительной безопасности будет создан временный CVC-код.}one{При оплате средства будут списаны с выбранной карты, но ее настоящий номер не станет известен этому сайту. Для обеспечения дополнительной безопасности будет создан временный CVC-код.}few{При оплате средства будут списаны с выбранной карты, но ее настоящий номер не станет известен этому сайту. Для обеспечения дополнительной безопасности будет создан временный CVC-код.}many{При оплате средства будут списаны с выбранной карты, но ее настоящий номер не станет известен этому сайту. Для обеспечения дополнительной безопасности будет создан временный CVC-код.}other{При оплате средства будут списаны с выбранной карты, но ее настоящий номер не станет известен этому сайту. Для обеспечения дополнительной безопасности будет создан временный CVC-код.}}</translation> <translation id="583281660410589416">Неизвестно</translation> <translation id="5838278095973806738">Не сообщайте этому сайту конфиденциальную информацию (например, пароли и номера банковских карт). К ней могут получить доступ злоумышленники.</translation> <translation id="5851548754964597211">Список вкладок</translation> @@ -1454,6 +1459,7 @@ <translation id="8042918947222776840">Выбрать способ получения</translation> <translation id="8057711352706143257">Программа "<ph name="SOFTWARE_NAME" />" настроена неправильно. Чтобы устранить проблему, удалите программу "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Произошла ошибка.</translation> +<translation id="8067872629359326442">Вы только что ввели пароль на поддельном сайте. Чтобы изменить пароль и сообщить Google о возможной угрозе безопасности, нажмите "Защитить аккаунт".</translation> <translation id="8074253406171541171">10x13 (конверт)</translation> <translation id="8078141288243656252">Недоступно, когда документ повернут</translation> <translation id="8079031581361219619">Перезагрузить сайт?</translation> @@ -1470,6 +1476,7 @@ <translation id="8105368624971345109">Отключить</translation> <translation id="8118489163946903409">Способ оплаты</translation> <translation id="8127301229239896662">Программа "<ph name="SOFTWARE_NAME" />" была установлена неправильно. Обратитесь за помощью к системному администратору.</translation> +<translation id="8128526133099929547">Вы только что ввели пароль на поддельном сайте. Рекомендуем немедленно сменить пароль для ресурса <ph name="WEBSITE_1" /> и других сайтов, на которых вы используете введенный пароль.</translation> <translation id="8131740175452115882">Подтвердить</translation> <translation id="8149426793427495338">Ваш компьютер перешел в спящий режим.</translation> <translation id="8150722005171944719">Файл по адресу <ph name="URL" /> недоступен. Возможно, он был удален или перемещен либо права доступа к нему ограничены.</translation> @@ -1487,6 +1494,7 @@ <translation id="8218327578424803826">Назначенное местоположение:</translation> <translation id="8220146938470311105">C7/C6 (конверт)</translation> <translation id="8220639454292072926">Отчеты Enterprise</translation> +<translation id="8221250263817408492">Вы только что ввели пароль на поддельном сайте. Рекомендуем немедленно сменить пароль для ресурса <ph name="WEBSITE_1" /> и других сайтов, на которых вы используете введенный пароль.</translation> <translation id="8225771182978767009">Тот, кто настраивал компьютер, заблокировал этот сайт.</translation> <translation id="822964464349305906"><ph name="TYPE_1" /> и <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Открыть страницу в новой вкладке инкогнито</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 16b8402a..e48a002c 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />ජාල දෝෂහරණ ධාවනය කරමින්<ph name="END_LINK" /></translation> <translation id="2473195200299095979">මෙම පිටුව පරිවර්තනය කරන්න</translation> <translation id="2479410451996844060">වැරදි සෙවුම් URL.</translation> -<translation id="2482370039860827034">ඔබ මේ දැන් වංචනික වෙබ් අඩවියක් මත ඔබේ මුරපදය ඇතුළත් කළා. Chrome <ph name="WEBSITE_1" /> සහ <ph name="WEBSITE_2" />, සහ ඔබ මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවිවලට ගොස් එය දැන් වෙනස් කිරීම නිර්දේශ කරයි.</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="248348093745724435">යන්ත්ර ප්රතිපත්ති</translation> <translation id="2491120439723279231">සේවාදායකයෙහි සහතිකයේ දෝෂ අඩංගුයි.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">ගිණුම ආරක්ෂා කරන්න</translation> <translation id="2515629240566999685">ඔබේ ප්රදේශයේ සංඥා පරීක්ෂා කරමින්</translation> <translation id="2521385132275182522">පහළ දකුණ ස්ටේපල් කරන්න</translation> -<translation id="2521483867890026383">ඔබ මේ දැන් වංචනික වෙබ් අඩවියක් මත ඔබේ මුරපදය ඇතුළත් කළා. Chromium <ph name="WEBSITE_1" /> සහ <ph name="WEBSITE_2" />, සහ ඔබ මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවිවලට ගොස් එය දැන් වෙනස් කිරීම නිර්දේශ කරයි.</translation> <translation id="2523886232349826891">මෙම උපාංගයෙහි පමණක් සුරැකිණි</translation> <translation id="2524461107774643265">වැඩිදුර තොරතුරු එක් කරන්න</translation> <translation id="2535659140340599600">{COUNT,plural, =1{සහ තව 1 ක්}one{සහ තව #ක්}other{සහ තව #ක්}}</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 57f37ffa..ba792878 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -588,6 +588,7 @@ <translation id="3828924085048779000">Prístupová fráza nemôže byť prázdna.</translation> <translation id="3831915413245941253">Doména <ph name="ENROLLMENT_DOMAIN" /> nainštalovala rozšírenia pre ďalšie funkcie. Rozšírenia majú prístup k niektorým vašim údajom.</translation> <translation id="3832522519263485449">Viacero dierok vľavo</translation> +<translation id="3838154488026099170">Práve ste zadali svoje heslo na podvodnom webe. Chromium odporúča, aby ste prešli na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a ďalšie weby, kde používate toto heslo, a ihneď ho zmenili.</translation> <translation id="385051799172605136">Naspäť</translation> <translation id="3858027520442213535">Aktualizovať dátum a čas</translation> <translation id="3884278016824448484">Kolidujúci identifikátor zariadenia</translation> @@ -625,6 +626,7 @@ <translation id="4072486802667267160">Pri spracovaní vašej objednávky sa vyskytla chyba. Skúste to znova.</translation> <translation id="4075732493274867456">Klient a server nepodporujú spoločnú verziu protokolu SSL ani šifrovaciu súpravu.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste prešli na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a ďalšie weby, kde používate toto heslo, a ihneď ho zmenili.</translation> <translation id="4079302484614802869">Konfigurácia proxy je nastavená na použitie skriptu PAC webovej adresy, nie pevne daných serverov proxy.</translation> <translation id="4082393374666368382">Nastavenia – správa</translation> <translation id="4098354747657067197">Podvodné webové stránky</translation> @@ -704,6 +706,7 @@ <translation id="4356973930735388585">Útočníci na tomto webe sa možno pokúsia nainštalovať na váš počítač nebezpečné programy, ktoré ukradnú alebo odstránia vaše informácie, napríklad fotky, heslá, správy alebo kreditné karty.</translation> <translation id="4358059973562876591">Špecifikované šablóny nemusia byť uplatnené pre chybu, ku ktorej došlo v súvislosti s pravidlom DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Spravovať spôsoby platby…</translation> +<translation id="4359160567981085931">Práve ste zadali svoje heslo na podvodnom webe. Chrome vám s tým pomôže. Ak chcete zmeniť heslo a upozorniť Google, že váš účet môže byť ohrozený, kliknite na Ochrániť účet.</translation> <translation id="4367563149485757821">Number-12 (obálka)</translation> <translation id="437058704415269440">Zostatok na účte</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -978,6 +981,7 @@ <translation id="5728056243719941842">C5 (obálka)</translation> <translation id="5730040223043577876">Ak ste heslo použili aj na iných weboch, Chrome ho odporúča obnoviť.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Uloženie karty do účtu Google}few{Uloženie kariet do účtu Google}many{Save cards in your Google Account}other{Uloženie kariet do účtu Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Používanie virtuálneho čísla pre túto kartu}few{Výber karty}many{Výber karty}other{Výber karty}}</translation> <translation id="5763042198335101085">Zadajte platnú e-mailovú adresu</translation> <translation id="5763703224595565476">Správca vo vašom prehliadači aktivoval ochranu používateľa Chrome Enterprise. Ochrana používateľa Chrome Enterprise má prístup k niektorým vašim údajom.</translation> <translation id="5765072501007116331">Ak chcete zobraziť spôsoby a požiadavky doručenia, vyberte adresu</translation> @@ -994,6 +998,7 @@ <translation id="5804241973901381774">Povolenia</translation> <translation id="5810442152076338065">Vaše pripojenie k doméne <ph name="DOMAIN" /> je šifrované pomocou zastaranej šifrovacej súpravy.</translation> <translation id="5813119285467412249">&Znova pridať</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Na túto kartu sa pri platbe zaúčtuje poplatok, ale jej skutočné číslo sa nebude s týmto webom zdieľať. Na zaistenie dodatočného zabezpečenia bude vygenerovaný dočasný overovací kód karty.}few{Na kartu, ktorú vyberiete, sa pri platbe zaúčtuje poplatok, ale jej skutočné číslo sa nebude s týmto webom zdieľať. Na zaistenie dodatočného zabezpečenia bude vygenerovaný dočasný overovací kód karty.}many{Na kartu, ktorú vyberiete, sa pri platbe zaúčtuje poplatok, ale jej skutočné číslo sa nebude s týmto webom zdieľať. Na zaistenie dodatočného zabezpečenia bude vygenerovaný dočasný overovací kód karty.}other{Na kartu, ktorú vyberiete, sa pri platbe zaúčtuje poplatok, ale jej skutočné číslo sa nebude s týmto webom zdieľať. Na zaistenie dodatočného zabezpečenia bude vygenerovaný dočasný overovací kód karty.}}</translation> <translation id="583281660410589416">Neznáme</translation> <translation id="5838278095973806738">Na tomto webe by ste nemali zadávať citlivé údaje, napríklad heslá alebo kreditné karty, pretože by ich mohli ukradnúť útočníci.</translation> <translation id="5851548754964597211">Zoznam kariet</translation> @@ -1450,6 +1455,7 @@ <translation id="8042918947222776840">Zvoliť spôsob vyzdvihnutia</translation> <translation id="8057711352706143257">Softvér <ph name="SOFTWARE_NAME" /> nie je správne nakonfigurovaný. Tento problém sa zvyčajne odstráni odinštalovaním softvéru <ph name="SOFTWARE_NAME" />. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Je nám to ľúto, ale vyskytol sa problém.</translation> +<translation id="8067872629359326442">Práve ste zadali svoje heslo na podvodnom webe. Chromium vám s tým pomôže. Ak chcete zmeniť heslo a upozorniť Google, že váš účet môže byť ohrozený, kliknite na Ochrániť účet.</translation> <translation id="8074253406171541171">10x13 (obálka)</translation> <translation id="8078141288243656252">Po otočení dokumentu nie je anotácia možná</translation> <translation id="8079031581361219619">Znova načítať web?</translation> @@ -1466,6 +1472,7 @@ <translation id="8105368624971345109">Vypnúť</translation> <translation id="8118489163946903409">Spôsob platby</translation> <translation id="8127301229239896662">Softvér <ph name="SOFTWARE_NAME" /> nebol v počítači alebo sieti riadne nainštalovaný. Požiadajte správcu IT, aby tento problém vyriešil.</translation> +<translation id="8128526133099929547">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste prešli na <ph name="WEBSITE_1" /> a ďalšie weby, kde používate toto heslo, a ihneď ho zmenili.</translation> <translation id="8131740175452115882">Potvrdiť</translation> <translation id="8149426793427495338">Váš počítač prešiel do režimu spánku.</translation> <translation id="8150722005171944719">Súbor na adrese <ph name="URL" /> nie je možné prečítať. Je možné, že bol odstránený, presunutý alebo môžu v prístupe brániť povolenia súboru.</translation> @@ -1483,6 +1490,7 @@ <translation id="8218327578424803826">Pridelená poloha:</translation> <translation id="8220146938470311105">C7/C6 (obálka)</translation> <translation id="8220639454292072926">Prehľady podniku</translation> +<translation id="8221250263817408492">Práve ste zadali svoje heslo na podvodnom webe. Chromium odporúča, aby ste prešli na <ph name="WEBSITE_1" /> a ďalšie weby, kde používate toto heslo, a ihneď ho zmenili.</translation> <translation id="8225771182978767009">Osoba, ktorá nastavila tento počítač, sa rozhodla daný web blokovať.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Otvorte stránku na novej karte inkognito</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 3b708c6..7023b75 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Izvajanje orodja za omrežno diagnostiko<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Prevede to stran</translation> <translation id="2479410451996844060">Neveljaven URL iskanja.</translation> -<translation id="2482370039860827034">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chrome priporoča, da obiščete <ph name="WEBSITE_1" /> in <ph name="WEBSITE_2" /> ter druga spletna mesta, na katerih uporabljate to geslo, in ga takoj spremenite.</translation> <translation id="2482878487686419369">Obvestila</translation> <translation id="248348093745724435">Pravilniki naprave</translation> <translation id="2491120439723279231">V potrdilu strežnika so napake.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Zaščita računa</translation> <translation id="2515629240566999685">preveriti signal na svojem območju</translation> <translation id="2521385132275182522">Spenjanje spodaj desno</translation> -<translation id="2521483867890026383">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chromium priporoča, da obiščete <ph name="WEBSITE_1" /> in <ph name="WEBSITE_2" /> ter druga spletna mesta, na katerih uporabljate to geslo, in ga takoj spremenite.</translation> <translation id="2523886232349826891">Shranjena samo v tej napravi</translation> <translation id="2524461107774643265">Dodajanje več podatkov</translation> <translation id="2535659140340599600">{COUNT,plural, =1{in še 1}one{in še #}two{in še #}few{in še #}other{in še #}}</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 4b1d498..458f090 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -592,6 +592,7 @@ <translation id="3828924085048779000">Lënia bosh e frazës së kalimit nuk lejohet.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ka instaluar shtesa për funksione shtesë. Shtesat kanë qasje te disa prej të dhënave të tua.</translation> <translation id="3832522519263485449">Shumë shpime majtas</translation> +<translation id="3838154488026099170">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dhe <ph name="WEBSITE_3" />, si dhe sajte të tjera ku e përdor këtë fjalëkalim dhe ta ndryshosh atë.</translation> <translation id="385051799172605136">Prapa</translation> <translation id="3858027520442213535">Përditëso datën dhe kohën</translation> <translation id="3884278016824448484">Identifikuesi i pajisjes bie në konflikt</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">Ndodhi një gabim gjatë përpunimit të porosisë. Provo përsëri.</translation> <translation id="4075732493274867456">Klienti dhe serveri nuk mbështesin një version të zakonshëm të protokollit SSL ose një paketë të shifrimit.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome rekomandon që të shkosh te <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dhe <ph name="WEBSITE_3" />, si dhe sajte të tjera ku e përdor këtë fjalëkalim dhe ta ndryshosh atë.</translation> <translation id="4079302484614802869">Konfigurimi i përfaqësuesit është caktuar të përdorë një shkrim URL-je .pac, jo serverë të fiksuar përfaqësues.</translation> <translation id="4082393374666368382">Cilësimet - Menaxhimi</translation> <translation id="4098354747657067197">Sajt mashtrues përpara</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">Sulmuesit në këtë sajt mund të përpiqen të instalojnë programe të rrezikshme në kompjuterin tënd që vjedhin ose fshijnë informacionet e tua (për shembull, fotografi, fjalëkalime, mesazhe dhe karta krediti).</translation> <translation id="4358059973562876591">Shabllonet që ke specifikuar mund të mos zbatohen për shkak të një gabimi me politikën DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Menaxho mënyrat e pagesës...</translation> +<translation id="4359160567981085931">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome mund të të ndihmojë. Për të ndryshuar fjalëkalimin dhe për të njoftuar Google se llogaria jote mund të jetë në rrezik, kliko te "Mbroje llogarinë".</translation> <translation id="4367563149485757821">Number-12 (Zarf)</translation> <translation id="437058704415269440">Balanca e llogarisë</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -982,6 +985,7 @@ <translation id="5728056243719941842">C5 (Zarf)</translation> <translation id="5730040223043577876">Chrome rekomandon rivendosjen e fjalëkalimit tënd nëse e ke ripërdorur në sajte të tjera.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Ruaje kartën në "Llogarinë tënde të Google"}other{Ruaji kartat në "Llogarinë tënde të Google"}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Përdor një numër virtual për këtë kartë}other{Zgjidh një kartë}}</translation> <translation id="5763042198335101085">Fut një adresë të vlefshme email-i</translation> <translation id="5763703224595565476">Administratori yt ka aktivizuar "Mbrojtjen e përdoruesit" të Chrome Enterprise në shfletuesin tënd. "Mbrojtja e përdoruesit" të Chrome Enterprise ka qasje te disa nga të dhënat e tua.</translation> <translation id="5765072501007116331">Për të parë mënyrat dhe kërkesat e dorëzimit, zgjidh një adresë</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">Lejet</translation> <translation id="5810442152076338065">Lidhja jote me <ph name="DOMAIN" /> është enkriptuar duke përdorur një paketë të vjetër shifrimi.</translation> <translation id="5813119285467412249">&Ribëje shtimin</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Kjo kartë do të tarifohet kur të paguash, por numri i saj i vërtetë nuk do të ndahet me këtë sajt. Për më shumë siguri, do të krijohet një kod CVC i përkohshëm.}other{Karta që zgjedh do të tarifohet kur të paguash, por numri i saj i vërtetë nuk do të ndahet me këtë sajt. Për më shumë siguri, do të krijohet një kod CVC i përkohshëm.}}</translation> <translation id="583281660410589416">E panjohur</translation> <translation id="5838278095973806738">Nuk duhet të futësh asnjë informacion delikat në këtë sajt (p.sh. fjalëkalimet ose karta krediti) pasi mund të vidhet nga sulmuesit.</translation> <translation id="5851548754964597211">Lista e skedave</translation> @@ -1454,6 +1459,7 @@ <translation id="8042918947222776840">Zgjidh mënyrën e marrjes</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" nuk është konfiguruar mirë. Zakonisht këtë problem e zgjidh çinstalimi i "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Na vjen keq! Diçka shkoi keq.</translation> +<translation id="8067872629359326442">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium mund të të ndihmojë. Për të ndryshuar fjalëkalimin dhe për të njoftuar Google se llogaria jote mund të jetë në rrezik, kliko te "Mbroje llogarinë".</translation> <translation id="8074253406171541171">10x13 (Zarf)</translation> <translation id="8078141288243656252">Nuk mund të shënosh kur rrotullohet</translation> <translation id="8079031581361219619">Dëshiron të ngarkosh përsëri sajtin?</translation> @@ -1470,6 +1476,7 @@ <translation id="8105368624971345109">Çaktivizo</translation> <translation id="8118489163946903409">Mënyra e pagesës</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" nuk është instaluar mirë në kompjuter ose në rrjet. Kërkoji administratorit të TI-së që të zgjidhë këtë problem.</translation> +<translation id="8128526133099929547">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe sajte të tjera ku e përdor këtë fjalëkalim dhe ta ndryshosh atë.</translation> <translation id="8131740175452115882">Konfirmo</translation> <translation id="8149426793427495338">Kompjuteri yt kaloi në gjumë.</translation> <translation id="8150722005171944719">Skedari në <ph name="URL" /> nuk është i lexueshëm: mund të jetë hequr, lëvizur ose lejet e tij mund të pengojnë qasjen.</translation> @@ -1487,6 +1494,7 @@ <translation id="8218327578424803826">Vendndodhja e caktuar:</translation> <translation id="8220146938470311105">C7/C6 (Zarf)</translation> <translation id="8220639454292072926">Raportimi i ndërmarrjes</translation> +<translation id="8221250263817408492">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe sajte të tjera ku e përdor këtë fjalëkalim dhe ta ndryshosh atë.</translation> <translation id="8225771182978767009">Personi që ka konfiguruar këtë kompjuter ka zgjedhur ta bllokojë këtë sajt.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Hape faqen në një skedë të re "të fshehtë"</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 380e329..caa1868 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />да покренете дијагностику мреже<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Преведите ову страницу</translation> <translation id="2479410451996844060">Неважећа URL адреса претраге.</translation> -<translation id="2482370039860827034">Управо сте унели лозинку на обмањујућем сајту. Chrome вам препоручује да одете на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" />, као и на друге сајтове где користите ову лозинку, и да је одмах промените.</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="248348093745724435">Смернице за уређаје</translation> <translation id="2491120439723279231">Сертификат сервера садржи грешке.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Заштити налог</translation> <translation id="2515629240566999685">да проверите сигнал у својој области</translation> <translation id="2521385132275182522">Спајање у доњем десном углу</translation> -<translation id="2521483867890026383">Управо сте унели лозинку на обмањујућем сајту. Chromium вам препоручује да одете на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" />, као и на друге сајтове где користите ову лозинку, и да је одмах промените.</translation> <translation id="2523886232349826891">Сачувано је само на овом уређају</translation> <translation id="2524461107774643265">Додајте још информација</translation> <translation id="2535659140340599600">{COUNT,plural, =1{и још 1}one{и још #}few{и још #}other{и још #}}</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index fccfb7f..cff0fc1 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />att köra nätverksdiagnostik<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Översätt den här sidan</translation> <translation id="2479410451996844060">Ogiltig sökadress.</translation> -<translation id="2482370039860827034">Du angav just ditt lösenord på en bedräglig webbplats. Chrome rekommenderar att du besöker <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> och andra sidor där du använder lösenordet och ändrar det nu.</translation> <translation id="2482878487686419369">Aviseringar</translation> <translation id="248348093745724435">Datorprinciper</translation> <translation id="2491120439723279231">Servercertifikatet innehåller fel.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Skydda kontot</translation> <translation id="2515629240566999685">kontrollera mottagningen i området</translation> <translation id="2521385132275182522">Häfta nere till höger</translation> -<translation id="2521483867890026383">Du angav just ditt lösenord på en bedräglig webbplats. Chromium rekommenderar att du besöker <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> och andra sidor där du använder lösenordet och ändrar det nu.</translation> <translation id="2523886232349826891">Endast sparat på den här enheten</translation> <translation id="2524461107774643265">Lägg till mer information</translation> <translation id="2535659140340599600">{COUNT,plural, =1{och 1 till}other{och # till}}</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 53277902..3ca486f 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -602,6 +602,7 @@ <translation id="3828924085048779000">Kaulisiri tupu hairuhusiwi.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> imesakinisha viendelezi kwa ajili ya majukumu ya ziada. Viendelezi vina idhini ya kufikia baadhi ya data yako.</translation> <translation id="3832522519263485449">Toboa mara kadhaa kushoto</translation> +<translation id="3838154488026099170">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inapendekeza uende kwenye <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> na <ph name="WEBSITE_3" /> na tovuti zingine unakotumia nenosiri hili na ulibadilishe sasa.</translation> <translation id="385051799172605136">Rudi nyuma</translation> <translation id="3858027520442213535">Sasisha tarehe na saa</translation> <translation id="3884278016824448484">Kitambulisho cha kifaa kinachokinzana</translation> @@ -639,6 +640,7 @@ <translation id="4072486802667267160">Hitilafu imetokea wakati wa kushughulikia agizo lako. Tafadhali jaribu tena.</translation> <translation id="4075732493274867456">Mteja na seva hazitumii toleo la kawaida la itifaki ya SSL au mipangilio ya kriptografia.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza uende kwenye <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> na <ph name="WEBSITE_3" /> na tovuti zingine unakotumia nenosiri hili na ulibadilishe sasa.</translation> <translation id="4079302484614802869">Usanidi wa proksi umewekwa kutumia URL hati ya .pac, siyo seva proksi za kudumu.</translation> <translation id="4082393374666368382">Mipangilio - Usimamizi</translation> <translation id="4098354747657067197">Kuna tovuti danganyifu mbele</translation> @@ -718,6 +720,7 @@ <translation id="4356973930735388585">Huenda wavamizi walio kwenye tovuti hii wakajaribu kusakinisha programu hatari inayoiba au kufuta maelezo yako yaliyo kwenye kompyuta yako (kwa mfano, picha, manenosiri, ujumbe, na kadi za mikopo).</translation> <translation id="4358059973562876591">Huenda violezo ulivyobainisha visitumike kwa sababu ya hitilafu katika sera ya DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Dhibiti njia za kulipa...</translation> +<translation id="4359160567981085931">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inaweza kukusaidia. Ili ubadilishe nenosiri lako na uarifu Google kwamba huenda akaunti yako imo hatarini, bofya Linda Akaunti.</translation> <translation id="4367563149485757821">Number-12 (Bahasha)</translation> <translation id="437058704415269440">Salio la Akaunti</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -992,6 +995,7 @@ <translation id="5728056243719941842">C5 (Bahasha)</translation> <translation id="5730040223043577876">Chrome inapendekeza ubadilishe nenosiri lako ikiwa ulilitumia tena kwenye tovuti zingine.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Hifadhi kadi katika Akaunti yako ya Google}other{Hifadhi kadi katika Akaunti yako ya Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Tumia nambari pepe ya kadi hii}other{Chagua kadi}}</translation> <translation id="5763042198335101085">Andika anwani sahihi ya barua pepe</translation> <translation id="5763703224595565476">Msimamizi wako amewasha kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kwenye kivinjari chako. Kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kinafikia baadhi ya data yako.</translation> <translation id="5765072501007116331">Chagua mahali ili uone njia za kusafirisha na mahitaji</translation> @@ -1008,6 +1012,7 @@ <translation id="5804241973901381774">Idhini</translation> <translation id="5810442152076338065">Muunganisho wako kwenye <ph name="DOMAIN" /> umesimbwa kwa njia fiche kwa kutumia mipangilio ya kriptografia ya zamani.</translation> <translation id="5813119285467412249">Rudia Kuongeza</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Kadi hii itatozwa utakapolipa, lakini nambari yake halisi haitashirikiwa na tovuti hii. Kwa usalama zaidi, tutatengeneza CVC ya muda mfupi.}other{Kadi unayochagua itatozwa utakapolipa lakini, nambari yake halisi haitashirikiwa na tovuti hii. Kwa usalama zaidi, tutatengeneza CVC ya muda mfupi.}}</translation> <translation id="583281660410589416">Haijulikani</translation> <translation id="5838278095973806738">Hupaswi kuweka maelezo nyeti kwenye tovuti hii (kwa mfano, manenosiri au kadi za mikopo), kwa sababu wavamizi wanaweza kuyaiba.</translation> <translation id="5851548754964597211">Orodha ya vichupo</translation> @@ -1463,6 +1468,7 @@ <translation id="8042918947222776840">Chagua Mbinu ya Kuchukua Bidhaa</translation> <translation id="8057711352706143257">Haikuweka mipangilio ya "<ph name="SOFTWARE_NAME" />" kwa njia sahihi. Kwa kawaida, kuondoa "<ph name="SOFTWARE_NAME" />" hurekebisha tatizo hili. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Samahani, hitilafu fulani imetokea.</translation> +<translation id="8067872629359326442">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inaweza kukusaidia. Ili ubadilishe nenosiri lako na uarifu Google kwamba huenda akaunti yako imo hatarini, bofya Linda Akaunti.</translation> <translation id="8074253406171541171">10x13 (Bahasha)</translation> <translation id="8078141288243656252">Huwezi kuweka vidokezo ikiwa imezungushwa</translation> <translation id="8079031581361219619">Ungependa kupakia upya tovuti?</translation> @@ -1479,6 +1485,7 @@ <translation id="8105368624971345109">Zima</translation> <translation id="8118489163946903409">Njia ya kulipa</translation> <translation id="8127301229239896662">Haikusakinisha "<ph name="SOFTWARE_NAME" />" kwa njia sahihi kwenye mtandao au kompyuta yako. Mweleze msimamizi wako wa TEHAMA asuluhishe tatizo hili.</translation> +<translation id="8128526133099929547">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza uende kwenye <ph name="WEBSITE_1" /> na tovuti zingine unakotumia nenosiri hili na ulibadilishe sasa.</translation> <translation id="8131740175452115882">Thibitisha</translation> <translation id="8149426793427495338">Kompyuta yako iko katika hali tuli.</translation> <translation id="8150722005171944719">Faili katika <ph name="URL" /> haisomeki. Huenda imeondolewa, kusogezwa, au idhini za faili huenda zinazuia ufikiaji.</translation> @@ -1496,6 +1503,7 @@ <translation id="8218327578424803826">Mahali Palipohawilishwa:</translation> <translation id="8220146938470311105">C7/C6 (Bahasha)</translation> <translation id="8220639454292072926">Kuripoti katika Shirika</translation> +<translation id="8221250263817408492">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inapendekeza uende kwenye <ph name="WEBSITE_1" /> na tovuti zingine unakotumia nenosiri hili na ulibadilishe sasa.</translation> <translation id="8225771182978767009">Mtu ambaye aliweka mipangilio ya kompyuta hii ameamua kuzuia tovuti hii.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Fungua ukurasa kwenye kichupo fiche kipya</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index f9aab9d..71376cc 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -591,6 +591,7 @@ <translation id="3828924085048779000">ข้อความรหัสผ่านต้องไม่เว้นว่างไว้</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> ได้ติดตั้งส่วนขยายสำหรับฟังก์ชันเพิ่มเติม ส่วนขยายเข้าถึงข้อมูลบางส่วนของคุณได้</translation> <translation id="3832522519263485449">เจาะรูด้านซ้ายหลายรู</translation> +<translation id="3838154488026099170">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium แนะนำให้ไปที่ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> และ <ph name="WEBSITE_3" /> และเว็บไซต์อื่นๆ ที่คุณใช้รหัสผ่านนี้ และเปลี่ยนรหัสผ่านโดยทันที</translation> <translation id="385051799172605136">กลับ</translation> <translation id="3858027520442213535">อัปเดตวันที่และเวลา</translation> <translation id="3884278016824448484">ตัวชี้อุปกรณ์ขัดแย้งกัน</translation> @@ -628,6 +629,7 @@ <translation id="4072486802667267160">เกิดข้อผิดพลาดในการประมวลผลคำสั่งซื้อของคุณ โปรดลองอีกครั้ง</translation> <translation id="4075732493274867456">ไคลเอ็นต์และเซิร์ฟเวอร์ไม่รองรับโปรโตคอล SSL เวอร์ชันทั่วไปหรือชุดการเข้ารหัส</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome แนะนำให้ไปที่ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> และ <ph name="WEBSITE_3" /> และเว็บไซต์อื่นๆ ที่คุณใช้รหัสผ่านนี้ และเปลี่ยนรหัสผ่านโดยทันที</translation> <translation id="4079302484614802869">การกำหนดค่าพร็อกซีมีการตั้งค่าให้ใช้ URL สคริปต์ .pac ไม่ใช่พร็อกซีเซิร์ฟเวอร์แบบคงที่</translation> <translation id="4082393374666368382">การตั้งค่า - การจัดการ</translation> <translation id="4098354747657067197">เว็บไซต์ข้างหน้ามีการหลอกลวง</translation> @@ -707,6 +709,7 @@ <translation id="4356973930735388585">ผู้โจมตีในเว็บไซต์นี้อาจพยายามติดตั้งโปรแกรมอันตรายซึ่งจะขโมยหรือลบข้อมูล (ตัวอย่างเช่น รูปภาพ รหัสผ่าน ข้อความ และบัตรเครดิต) ลงในคอมพิวเตอร์ของคุณ</translation> <translation id="4358059973562876591">เทมเพลตที่คุณระบุอาจใช้ไม่ได้เนื่องจากมีข้อผิดพลาดกับนโยบาย DnsOverHttpsMode</translation> <translation id="4358461427845829800">จัดการวิธีการชำระเงิน...</translation> +<translation id="4359160567981085931">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome ช่วยได้ หากต้องการเปลี่ยนรหัสผ่านและแจ้งให้ Google ทราบว่าบัญชีของคุณอาจมีความเสี่ยง ให้คลิก "ปกป้องบัญชี"</translation> <translation id="4367563149485757821">Number-12 (ซองจดหมาย)</translation> <translation id="437058704415269440">เงินคงเหลือ</translation> <translation id="4372516964750095882">กระดาษต่อเนื่องแบบสหรัฐฯ</translation> @@ -981,6 +984,7 @@ <translation id="5728056243719941842">C5 (ซองจดหมาย)</translation> <translation id="5730040223043577876">Chrome ขอแนะนำให้รีเซ็ตรหัสผ่านหากคุณใช้รหัสผ่านนี้ซ้ำในเว็บไซต์อื่น</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{บันทึกบัตรลงในบัญชี Google ของคุณ}other{บันทึกบัตรลงในบัญชี Google ของคุณ}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{ใช้หมายเลขเสมือนสำหรับบัตรนี้}other{เลือกบัตร}}</translation> <translation id="5763042198335101085">ป้อนที่อยู่อีเมลที่ถูกต้อง</translation> <translation id="5763703224595565476">ผู้ดูแลระบบได้เปิดใช้ฟีเจอร์ปกป้องผู้ใช้ของ Chrome Enterprise ในเบราว์เซอร์ ฟีเจอร์ปกป้องผู้ใช้ของ Chrome Enterprise มีสิทธิ์เข้าถึงข้อมูลบางอย่างของคุณได้</translation> <translation id="5765072501007116331">หากต้องการดูวิธีการนำส่งสินค้าและข้อกำหนด โปรดเลือกที่อยู่</translation> @@ -997,6 +1001,7 @@ <translation id="5804241973901381774">การอนุญาต</translation> <translation id="5810442152076338065">มีการเข้ารหัสการเชื่อมต่อของคุณกับ <ph name="DOMAIN" /> ด้วยชุดการเข้ารหัสที่ล้าสมัยแล้ว</translation> <translation id="5813119285467412249">&ทำซ้ำการเพิ่ม</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{ระบบจะเรียกเก็บเงินจากบัตรนี้เมื่อคุณชำระเงิน แต่จะไม่แชร์หมายเลขบัตรจริงกับเว็บไซต์นี้ เพื่อความปลอดภัยมากขึ้น ระบบจะสร้างรหัส CVC ชั่วคราวขึ้นมา}other{ระบบจะเรียกเก็บเงินจากบัตรที่เลือกเมื่อคุณชำระเงิน แต่จะไม่แชร์หมายเลขบัตรจริงกับเว็บไซต์นี้ เพื่อความปลอดภัยมากขึ้น ระบบจะสร้างรหัส CVC ชั่วคราวขึ้นมา}}</translation> <translation id="583281660410589416">ไม่รู้จัก</translation> <translation id="5838278095973806738">คุณไม่ควรป้อนข้อมูลที่ละเอียดอ่อนบนเว็บไซต์นี้ (ตัวอย่างเช่น รหัสผ่านหรือบัตรเครดิต) เนื่องจากผู้โจมตีอาจขโมยข้อมูลดังกล่าวไปได้</translation> <translation id="5851548754964597211">รายการแท็บ</translation> @@ -1454,6 +1459,7 @@ <translation id="8042918947222776840">เลือกวิธีรับสินค้า</translation> <translation id="8057711352706143257">กำหนดค่า "<ph name="SOFTWARE_NAME" />" ไม่ถูกต้อง การถอนการติดตั้ง "<ph name="SOFTWARE_NAME" />" มักแก้ไขปัญหานี้ได้ <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">ขออภัย มีบางอย่างผิดพลาด</translation> +<translation id="8067872629359326442">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium ช่วยคุณได้ หากต้องการเปลี่ยนรหัสผ่านและแจ้งให้ Google ทราบว่าบัญชีของคุณอาจมีความเสี่ยง ให้คลิก "ปกป้องบัญชี"</translation> <translation id="8074253406171541171">10x13 (ซองจดหมาย)</translation> <translation id="8078141288243656252">เมื่อหมุนแล้วจะใส่หมายเหตุไม่ได้</translation> <translation id="8079031581361219619">โหลดเว็บไซต์ซ้ำไหม</translation> @@ -1470,6 +1476,7 @@ <translation id="8105368624971345109">ปิด</translation> <translation id="8118489163946903409">วิธีการชำระเงิน</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" ไม่ได้ติดตั้งในคอมพิวเตอร์หรือเครือข่ายอย่างถูกต้อง โปรดขอให้ผู้ดูแลระบบ IT แก้ไขปัญหานี้</translation> +<translation id="8128526133099929547">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome แนะนำให้ไปที่ <ph name="WEBSITE_1" /> และเว็บไซต์อื่นๆ ที่คุณใช้รหัสผ่านนี้ และเปลี่ยนรหัสผ่านโดยทันที</translation> <translation id="8131740175452115882">ยืนยัน</translation> <translation id="8149426793427495338">คอมพิวเตอร์ของคุณเข้าสู่โหมดสลีปแล้ว</translation> <translation id="8150722005171944719">ไฟล์ที่ <ph name="URL" /> ไม่สามารถอ่านได้ เนื่องจากอาจถูกลบ ย้ายไปแล้ว หรือการอนุญาตของไฟล์อาจป้องกันการเข้าถึง</translation> @@ -1487,6 +1494,7 @@ <translation id="8218327578424803826">ตำแหน่งที่มอบหมาย:</translation> <translation id="8220146938470311105">C7/C6 (ซองจดหมาย)</translation> <translation id="8220639454292072926">การรายงานระดับองค์กร</translation> +<translation id="8221250263817408492">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium แนะนำให้ไปที่ <ph name="WEBSITE_1" /> และเว็บไซต์อื่นๆ ที่คุณใช้รหัสผ่านนี้ และเปลี่ยนรหัสผ่านโดยทันที</translation> <translation id="8225771182978767009">ผู้ที่ตั้งค่าคอมพิวเตอร์เครื่องนี้เลือกบล็อกเว็บไซต์นี้</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">เปิดหน้าเว็บในแท็บไม่ระบุตัวตนใหม่</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 0b1ed10..b62582fd 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -602,6 +602,7 @@ <translation id="3828924085048779000">Boş parolaya izin verilmez.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> diğer işlevler için uzantılar yüklemiş. Söz konusu uzantıların bazı verilerinize erişimi bulunuyor.</translation> <translation id="3832522519263485449">Solda çoklu delik</translation> +<translation id="3838154488026099170">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium, bu şifreyi kullandığınız <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ve diğer sitelere giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="385051799172605136">Geri</translation> <translation id="3858027520442213535">Tarih ve saati güncelle</translation> <translation id="3884278016824448484">Çakışan cihaz tanımlayıcısı</translation> @@ -639,6 +640,7 @@ <translation id="4072486802667267160">Ödemeniz işlenirken bir hata oluştu. Lütfen tekrar deneyin.</translation> <translation id="4075732493274867456">İstemci ve sunucu, ortak bir SSL protokolü sürümünü veya şifre setini desteklemiyor.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome, bu şifreyi kullandığınız <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ve <ph name="WEBSITE_3" /> sitesine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="4079302484614802869">Proxy yapılandırması sabit proxy sunucuları değil, bir .pac komut dosyası URL'sini kullanmak üzere ayarlandı.</translation> <translation id="4082393374666368382">Ayarlar - Yönetim</translation> <translation id="4098354747657067197">Yanıltıcı bir siteye girmek üzeresiniz</translation> @@ -718,6 +720,7 @@ <translation id="4356973930735388585">Bu sitedeki saldırganlar, bilgilerinizi (örneğin fotoğraflar, şifreler, mesajlar ve kredi kartları) çalacak veya silecek tehlikeli programları bilgisayarınıza yüklemeyi deneyebilir.</translation> <translation id="4358059973562876591">Belirttiğiniz şablonlar, DnsOverHttpsMode politikasındaki bir hata nedeniyle uygulanamayabilir.</translation> <translation id="4358461427845829800">Ödeme yöntemlerini yönet...</translation> +<translation id="4359160567981085931">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome yardım edebilir. Şifrenizi değiştirmek ve hesabınızın risk altında olabileceğini Google'a bildirmek için Hesabı Koru'yu tıklayın.</translation> <translation id="4367563149485757821">Number-12 (Zarf)</translation> <translation id="437058704415269440">Hesap Bakiyesi</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -993,6 +996,7 @@ <translation id="5728056243719941842">C5 (Zarf)</translation> <translation id="5730040223043577876">Chrome, şifrenizi başka sitelerde kullandıysanız sıfırlamanızı önerir.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Kartı Google Hesabınıza kaydedin}other{Kartları Google Hesabınıza kaydedin}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Bu kart için sanal bir numara kullanın}other{Kart seçin}}</translation> <translation id="5763042198335101085">Geçerli bir e-posta adresi girin</translation> <translation id="5763703224595565476">Yöneticiniz, Chrome'da Enterprise User Protect özelliğini etkinleştirdi. Chrome Enterprise User Protect özelliğinin verilerinizin bir kısmına erişimi vardır.</translation> <translation id="5765072501007116331">Teslimat yöntemlerini ve gereksinimleri görmek için bir adres seçin</translation> @@ -1009,6 +1013,7 @@ <translation id="5804241973901381774">İzinler</translation> <translation id="5810442152076338065"><ph name="DOMAIN" /> ile olan bağlantınız eski bir şifre seti kullanılarak şifrelendi.</translation> <translation id="5813119285467412249">Eklemeyi &Yeniden Yap</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Ödeme yaptığınızda ücret bu karttan alınır ancak kartın gerçek numarası bu site ile paylaşılmaz. Ek güvenlik için geçici bir CVC oluşturulur.}other{Ödeme yaptığınızda ücret, seçtiğiniz karttan alınır ancak kartın gerçek numarası bu site ile paylaşılmaz. Ek güvenlik için geçici bir CVC oluşturulur.}}</translation> <translation id="583281660410589416">Bilinmiyor</translation> <translation id="5838278095973806738">Bu sitede hiçbir hassas bilginizi (örneğin şifrelerinizi veya kredi kartı bilgilerinizi) girmemelisiniz. Aksi takdirde bu bilgiler saldırganlar tarafından çalınabilir.</translation> <translation id="5851548754964597211">Sekme listesi</translation> @@ -1466,6 +1471,7 @@ <translation id="8042918947222776840">Alma Yöntemi Seç</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" doğru şekilde yapılandırılmamış. Genellikle "<ph name="SOFTWARE_NAME" />" kaldırıldığında sorun çözülür. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Maalesef bir hata oluştu.</translation> +<translation id="8067872629359326442">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium yardım edebilir. Şifrenizi değiştirmek ve hesabınızın risk altında olabileceğini Google'a bildirmek için Hesabı Koru'yu tıklayın.</translation> <translation id="8074253406171541171">10x13 (Zarf)</translation> <translation id="8078141288243656252">Doküman döndürüldüğünde ek açıklama özelliği kullanılamaz</translation> <translation id="8079031581361219619">Site yeniden yüklensin mi?</translation> @@ -1482,6 +1488,7 @@ <translation id="8105368624971345109">Kapat</translation> <translation id="8118489163946903409">Ödeme yöntemi</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" yazılımı bilgisayarınıza veya ağa düzgün şekilde yüklenmemiş. BT yöneticinizden sorunu çözmesini isteyin.</translation> +<translation id="8128526133099929547">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome, bu şifreyi kullandığınız <ph name="WEBSITE_1" /> ve diğer sitelere giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="8131740175452115882">Onayla</translation> <translation id="8149426793427495338">Bilgisayarınız uyku moduna geçti.</translation> <translation id="8150722005171944719"><ph name="URL" /> konumundaki dosya okunamıyor. Kaldırılmış ya da taşınmış olabilir veya dosya izinleri erişimi önlüyordur.</translation> @@ -1499,6 +1506,7 @@ <translation id="8218327578424803826">Atanan Konum:</translation> <translation id="8220146938470311105">C7/C6 (Zarf)</translation> <translation id="8220639454292072926">Kurumsal Raporlama</translation> +<translation id="8221250263817408492">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium, bu şifreyi kullandığınız <ph name="WEBSITE_1" /> ve diğer sitelere giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="8225771182978767009">Bu bilgisayarı kuran kişi bu siteyi engellemeyi seçmiş.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Sayfayı yeni bir Gizli sekmede aç</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 121b460..727c1d7 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -599,6 +599,7 @@ <translation id="3828924085048779000">خالی پاس فریز کی اجازت نہیں ہے۔</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> نے اضافی فنکشنز کیلئے ایکسٹینشنز انسٹال کی ہیں۔ ایکسٹینشنز کو آپ کے کچھ ڈیٹا تک رسائی حاصل ہوتی ہے۔</translation> <translation id="3832522519263485449">بائیں طرف متعدد سوراخ</translation> +<translation id="3838154488026099170">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium آپ کو <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" /> اور <ph name="WEBSITE_3" /> اور دیگر ایسی سائٹس پر جا کر ابھی پاس ورڈ بدلنے کی تجویز کرتا ہے جہاں آپ اسے استعمال کرتے ہیں۔</translation> <translation id="385051799172605136">پیچھے</translation> <translation id="3858027520442213535">تاریخ اور وقت اپ ڈیٹ کریں</translation> <translation id="3884278016824448484">متنازع آلہ شناخت کنندہ</translation> @@ -636,6 +637,7 @@ <translation id="4072486802667267160">آپ کے آرڈر پر کارروائی کرنے میں ایک خرابی پیش آگئی۔ براہ کرم دوبارہ کوشش کریں۔</translation> <translation id="4075732493274867456">کلائنٹ اور سرور عام SSL پروٹوکول ورژن یا سائفر سوئٹ کا تعاون نہیں کرتے ہیں۔</translation> <translation id="4075941231477579656">ٹچ ID</translation> +<translation id="4077092919748553596">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome ابھی آپ کو <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" /> اور <ph name="WEBSITE_3" /> اور دیگر ایسی سائٹس پر جا کر ابھی پاس ورڈ بدلنے کی تجویز کرتا ہے جہاں آپ اسے استعمال کرتے ہیں۔</translation> <translation id="4079302484614802869">پراکسی کنفیگریشن مقررہ پراکسی سرورز نہیں بلکہ ایک .pac اسکرپٹ URL استعمال کرنے کیلئے سیٹ ہے۔</translation> <translation id="4082393374666368382">ترتیبات، نظم و نسق</translation> <translation id="4098354747657067197">آگے پرفریب سائٹ ہے</translation> @@ -715,6 +717,7 @@ <translation id="4356973930735388585">اس سائٹ پر موجود حملہ آور آپ کے کمپیوٹر پر ایسے خطرناک پروگرامز انسٹال کرنے کی کوشش کر سکتے ہیں جو آپ کی معلومات (مثلاً، تصاویر، پاس ورڈز، پیغامات اور کریڈٹ کارڈز) چوری کر لیتے یا حذف کر دیتے ہیں۔</translation> <translation id="4358059973562876591">ہو سکتا ہے کہ آپ کے ذریعے متعینہ تمثیلات DnsOverHttpsMode پالیسی میں ایک خرابی کی وجہ سے لاگو نہ ہو۔</translation> <translation id="4358461427845829800">ادائیگیوں کے طریقوں کا نظم کریں...</translation> +<translation id="4359160567981085931">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome مدد کر سکتا ہے۔ اپنا پاس ورڈ تبدیل کرنے اور Google کو یہ مطلع کرنے کے لیے کہ آپ کا اکاؤنٹ خطرے میں ہو سکتا ہے، 'اکاؤنٹ کا تحفظ کریں' پر کلک کریں۔</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">اکاؤنٹ بیلنس</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -989,6 +992,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">اگر آپ نے اپنا پاس ورڈ دیگر سائٹس پر دوبارہ استعمال کیا ہے تو Chrome آپ کو اپنا پاس ورڈ ری سیٹ کرنے کی تجویز کرتا ہے۔</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{اپنے Google اکاؤنٹ میں کارڈ کو محفوظ کریں}other{اپنے Google اکاؤنٹ میں کارڈز کو محفوظ کریں}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{اس کارڈ کے لیے ورچوئل نمبر کا استعمال کریں}other{کارڈ منتخب کریں}}</translation> <translation id="5763042198335101085">ایک درست ای میل پتہ درج کریں</translation> <translation id="5763703224595565476">آپ کے منتظم نے آپ کے براؤزر پر Chrome انٹرپرائز صارف برائے تحفظ کو فعال کر دیا ہے۔ Chrome انٹرپرائز صارف کا تحفظ کو آپ کے کچھ ڈیٹا تک رسائی حاصل ہے۔</translation> <translation id="5765072501007116331">ڈیلیوری کے طریقے اور ضروریات دیکھنے کیلئے، ایک پتہ منتخب کریں</translation> @@ -1005,6 +1009,7 @@ <translation id="5804241973901381774">اجازتیں</translation> <translation id="5810442152076338065">ایک فرسودہ سائفر سوئٹ کا استعمال کر کے <ph name="DOMAIN" /> کا آپ کا کنکشن مرموز کیا گیا ہے۔</translation> <translation id="5813119285467412249">&دوبارہ شامل کریں</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{ادائیگی کرتے وقت اس کارڈ کو چارج کیا جائے گا، تاہم اس کے اصل نمبر کا اشتراک اس سائٹ کے ساتھ نہیں کیا جائے گا۔ اضافی سیکیورٹی کے لیے، عارضی CVC تخلیق کیا جائے گا۔}other{ادائیگی کرتے وقت آپ کے منتخب کردہ کارڈ کو چارج کیا جائے گا، تاہم اس کے اصل نمبر کا اشتراک اس سائٹ کے ساتھ نہیں کیا جائے گا۔ اضافی سیکیورٹی کے لیے، عارضی CVC تخلیق کیا جائے گا۔}}</translation> <translation id="583281660410589416">نامعلوم</translation> <translation id="5838278095973806738">اس سائٹ پر آپ کو کوئی حساس معلومات (مثلاً، پاس ورڈز یا کریڈٹ کارڈز) درج نہیں کرنا چاہیے، کیوںکہ اسے حملہ آور چوری کر سکتے ہیں۔</translation> <translation id="5851548754964597211">ٹیب کی فہرست</translation> @@ -1463,6 +1468,7 @@ <translation id="8042918947222776840">پِک اپ کا طریقہ منتخب کریں</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" صحیح طور پر کنفیگر کردہ نہیں ہے۔ عام طور سے "<ph name="SOFTWARE_NAME" />" کو ان انسٹال کرنے سے یہ مسئلہ حل ہو جاتا ہے۔ <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">معذرت، کچھ غلط ہو گیا۔</translation> +<translation id="8067872629359326442">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium مدد کر سکتا ہے۔ اپنا پاس ورڈ تبدیل کرنے اور Google کو یہ مطلع کرنے کے لیے کہ آپ کا اکاؤنٹ خطرے میں ہو سکتا ہے، 'اکاؤنٹ کا تحفظ کریں' پر کلک کریں۔</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">گھماتے وقت تشریح نہیں کی جا سکتی</translation> <translation id="8079031581361219619">سائٹ دوبارہ لوڈ کریں؟</translation> @@ -1479,6 +1485,7 @@ <translation id="8105368624971345109">آف کریں</translation> <translation id="8118489163946903409">ادائیگی کا طریقہ</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" آپ کے کمپیوٹر یا نیٹ ورک پر مناسب طریقے سے انسٹال نہیں ہوا تھا۔ اس مسئلے کو حل کرنے کے لیے اپنے IT منتظم سے کہیں۔</translation> +<translation id="8128526133099929547">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome <ph name="WEBSITE_1" /> اور دیگر ایسی سائٹس پر جا کر ابھی پاس ورڈ بدلنے کی تجویز کرتا ہے جہاں آپ اسے استعمال کرتے ہیں۔</translation> <translation id="8131740175452115882">توثیق کریں</translation> <translation id="8149426793427495338">آپ کا کمپیوٹر سلیپ وضع میں چلا گیا۔</translation> <translation id="8150722005171944719"><ph name="URL" /> پر موجود فائل پڑھنے لائق نہیں ہے۔ ممکن ہے اسے ہٹا دیا گیا ہو، منتقل کر دیا گیا ہو یا ممکن ہے فائل کی اجازتیں رسائی روک رہی ہوں۔</translation> @@ -1496,6 +1503,7 @@ <translation id="8218327578424803826">تفویض کردہ مقام</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">انٹرپرائز رپورٹنگ</translation> +<translation id="8221250263817408492">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium <ph name="WEBSITE_1" /> اور دیگر ایسی سائٹس پر جا کر ابھی پاس ورڈ بدلنے کی تجویز کرتا ہے جہاں آپ اسے استعمال کرتے ہیں۔</translation> <translation id="8225771182978767009">اس کمپیوٹر کو ترتیب دینے والے شخص نے اس سائٹ کو مسدود کرنے کا انتخاب کیا ہے۔</translation> <translation id="822964464349305906"><ph name="TYPE_1" />، <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">صفحے کو نئے پوشیدگی ٹیب میں کھولیں</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index a3023fb..adccacf6 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -325,7 +325,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Tarmoq diagnostikasini ishga tushiring<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Bu sahifani tarjima qilish</translation> <translation id="2479410451996844060">Qidiruv tizimi URL manzili noto‘g‘ri.</translation> -<translation id="2482370039860827034">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va boshqa saytlardagi shu parolingizni yangilashni tavsiya qiladi.</translation> <translation id="2482878487686419369">Bildirishnomalar</translation> <translation id="248348093745724435">Kompyuter parametrlari</translation> <translation id="2491120439723279231">Server sertifikatida xatoliklar mavjud.</translation> @@ -338,7 +337,6 @@ <translation id="2505268675989099013">Hisobni himoyalash</translation> <translation id="2515629240566999685">Mobil aloqa signalini tekshirish</translation> <translation id="2521385132275182522">Quyi oʻngdan steplerlash</translation> -<translation id="2521483867890026383">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va boshqa saytlardagi shu parolingizni yangilashni tavsiya qiladi.</translation> <translation id="2523886232349826891">Faqat shu qurilmada saqlanadi</translation> <translation id="2524461107774643265">Qo‘shimcha axborot qo‘shish</translation> <translation id="2535659140340599600">{COUNT,plural, =1{va yana 1 ta}other{va yana # ta}}</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 704742f..12674fa 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -607,6 +607,7 @@ <translation id="3828924085048779000">Không cho phép cụm mật khẩu trống.</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> đã cài đặt các tiện ích để bổ sung thêm chức năng. Các tiện ích có quyền truy cập vào một số dữ liệu của bạn.</translation> <translation id="3832522519263485449">Đục nhiều lỗ bên trái</translation> +<translation id="3838154488026099170">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chromium khuyên bạn nên truy cập vào <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> và <ph name="WEBSITE_3" /> cũng như các trang web khác mà bạn dùng mật khẩu này rồi đổi mật khẩu ngay bây giờ.</translation> <translation id="385051799172605136">Quay lại</translation> <translation id="3858027520442213535">Cập nhật ngày và giờ</translation> <translation id="3884278016824448484">Số nhận dạng thiết bị xung đột</translation> @@ -644,6 +645,7 @@ <translation id="4072486802667267160">Đã xảy ra lỗi khi xử lý đơn đặt hàng của bạn. Vui lòng thử lại.</translation> <translation id="4075732493274867456">Ứng dụng và máy chủ không hỗ trợ bộ mã hóa hoặc phiên bản giao thức SSL thông thường.</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome khuyên bạn nên truy cập vào <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> và <ph name="WEBSITE_3" /> cũng như các trang web khác mà bạn dùng mật khẩu này rồi đổi mật khẩu ngay bây giờ.</translation> <translation id="4079302484614802869">Cấu hình proxy được đặt để sử dụng URL tập lệnh .pac chứ không phải máy chủ proxy cố định.</translation> <translation id="4082393374666368382">Cài đặt – Quản lý</translation> <translation id="4098354747657067197">Bạn sắp truy cập trang web lừa đảo</translation> @@ -723,6 +725,7 @@ <translation id="4356973930735388585">Những kẻ tấn công trên trang web này có thể tìm cách cài đặt các chương trình nguy hiểm vào máy tính của bạn. Các chương trình này sẽ đánh cắp hoặc xóa thông tin của bạn (ví dụ: ảnh, mật khẩu, thư và thẻ tín dụng).</translation> <translation id="4358059973562876591">Các mẫu bạn đã chỉ định có thể không được áp dụng do lỗi liên quan đến chính sách DnsOverHttpsMode.</translation> <translation id="4358461427845829800">Quản lý phương thức thanh toán...</translation> +<translation id="4359160567981085931">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome có thể trợ giúp bạn. Để đổi mật khẩu và thông báo cho Google biết rằng tài khoản của bạn có thể gặp nguy hiểm, hãy nhấp vào Bảo vệ tài khoản.</translation> <translation id="4367563149485757821">Number-12 (Phong bì)</translation> <translation id="437058704415269440">Số dư tài khoản</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -998,6 +1001,7 @@ <translation id="5728056243719941842">C5 (Phong bì)</translation> <translation id="5730040223043577876">Chrome khuyên bạn nên đặt lại mật khẩu của mình nếu đã sử dụng lại mật khẩu này trên các trang web khác.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Lưu thẻ vào Tài khoản Google}other{Lưu các thẻ vào Tài khoản Google}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{Dùng số ảo cho thẻ này}other{Chọn một thẻ}}</translation> <translation id="5763042198335101085">Nhập địa chỉ email hợp lệ</translation> <translation id="5763703224595565476">Quản trị viên đã bật tính năng Bảo vệ người dùng của Chrome Enterprise trên trình duyệt của bạn. Tính năng này có quyền sử dụng một số dữ liệu mà bạn sở hữu.</translation> <translation id="5765072501007116331">Để xem các yêu cầu và phương thức phân phối, hãy chọn một địa chỉ</translation> @@ -1014,6 +1018,7 @@ <translation id="5804241973901381774">Quyền</translation> <translation id="5810442152076338065">Kết nối của bạn tới <ph name="DOMAIN" /> được mã hóa bằng bộ số 0 đã lỗi thời.</translation> <translation id="5813119285467412249">&Làm lại thêm</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{Thẻ này sẽ bị trừ tiền khi bạn thanh toán, nhưng số thẻ thật sẽ không được chia sẻ với trang web này. Để tăng cường tính bảo mật, hệ thống sẽ tạo một Mã xác minh thẻ (CVC) tạm thời.}other{Thẻ bạn chọn sẽ bị trừ tiền khi bạn thanh toán, nhưng số thẻ thật sẽ không được chia sẻ với trang web này. Để tăng cường tính bảo mật, hệ thống sẽ tạo một Mã xác minh thẻ (CVC) tạm thời.}}</translation> <translation id="583281660410589416">Không xác định</translation> <translation id="5838278095973806738">Bạn không nên nhập bất kỳ thông tin nhạy cảm nào trên trang web này (ví dụ: mật khẩu hoặc thẻ tín dụng), vì những kẻ tấn công có thể đánh cắp thông tin đó.</translation> <translation id="5851548754964597211">Danh sách tab</translation> @@ -1471,6 +1476,7 @@ <translation id="8042918947222776840">Chọn phương thức nhận hàng</translation> <translation id="8057711352706143257">Cấu hình của "<ph name="SOFTWARE_NAME" />" không chính xác. Việc gỡ cài đặt "<ph name="SOFTWARE_NAME" />" thường sẽ khắc phục được sự cố này. <ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">Rất tiếc, đã xảy ra lỗi.</translation> +<translation id="8067872629359326442">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chromium có thể trợ giúp bạn. Để đổi mật khẩu và thông báo cho Google biết rằng tài khoản của bạn có thể gặp nguy hiểm, hãy nhấp vào Bảo vệ tài khoản.</translation> <translation id="8074253406171541171">10x13 (Phong bì)</translation> <translation id="8078141288243656252">Không thể chú thích khi xoay</translation> <translation id="8079031581361219619">Tải lại trang web?</translation> @@ -1487,6 +1493,7 @@ <translation id="8105368624971345109">Tắt</translation> <translation id="8118489163946903409">Phương thức thanh toán</translation> <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" đã được cài đặt không đúng trên máy tính hoặc mạng của bạn. Hãy yêu cầu quản trị viên CNTT của bạn giải quyết vấn đề này.</translation> +<translation id="8128526133099929547">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome khuyên bạn nên truy cập vào <ph name="WEBSITE_1" /> và các trang web khác mà bạn dùng mật khẩu này rồi đổi mật khẩu ngay bây giờ.</translation> <translation id="8131740175452115882">Xác nhận</translation> <translation id="8149426793427495338">Máy tính của bạn đã chuyển sang chế độ ngủ.</translation> <translation id="8150722005171944719">Không thể đọc được tệp tại <ph name="URL" />. Tệp này có thể đã bị xóa, di chuyển hoặc quyền tệp có thể đang chặn truy cập.</translation> @@ -1504,6 +1511,7 @@ <translation id="8218327578424803826">Vị trí được gán:</translation> <translation id="8220146938470311105">C7/C6 (Phong bì)</translation> <translation id="8220639454292072926">Báo cáo của Enterprise</translation> +<translation id="8221250263817408492">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chromium khuyên bạn nên truy cập vào <ph name="WEBSITE_1" /> và các trang web khác mà bạn dùng mật khẩu này rồi đổi mật khẩu ngay bây giờ.</translation> <translation id="8225771182978767009">Người thiết lập máy tính này đã chọn chặn trang web này.</translation> <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation> <translation id="8238581221633243064">Mở trang trong tab Ẩn danh mới</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index e30c8da..05a43c6 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -588,6 +588,7 @@ <translation id="3828924085048779000">密码输入字段不能留空。</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> 已安装了一些扩展程序来提供更多功能。这些扩展程序有权访问您的部分数据。</translation> <translation id="3832522519263485449">多孔(左侧)</translation> +<translation id="3838154488026099170">您刚刚在一个诈骗网站中输入了密码。Chromium 建议您立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> 以及使用此密码的其他网站更改密码。</translation> <translation id="385051799172605136">后退</translation> <translation id="3858027520442213535">更新日期和时间</translation> <translation id="3884278016824448484">设备标识符存在冲突</translation> @@ -625,6 +626,7 @@ <translation id="4072486802667267160">处理您的订单时出错。请重试。</translation> <translation id="4075732493274867456">客户端和服务器不支持一般 SSL 协议版本或加密套件。</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">您刚刚在一个诈骗网站中输入了密码。Chrome 建议您立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> 以及使用此密码的其他网站更改密码。</translation> <translation id="4079302484614802869">代理配置已设置为使用 .pac 脚本网址,而不是固定的代理服务器。</translation> <translation id="4082393374666368382">设置 - 管理</translation> <translation id="4098354747657067197">您要访问的是诈骗网站</translation> @@ -704,6 +706,7 @@ <translation id="4356973930735388585">此网站上的攻击者可能会试图在您的计算机上安装危险程序,以窃取或删除您的信息(例如:照片、密码、通讯内容和信用卡信息)。</translation> <translation id="4358059973562876591">您指定的模板未必会被应用,因为 DnsOverHttpsMode 政策出错了。</translation> <translation id="4358461427845829800">管理付款方式…</translation> +<translation id="4359160567981085931">您刚刚在一个诈骗网站中输入了密码。Chrome 可以帮助您消除潜在威胁。若要更改密码并让 Google 知晓您的帐号可能处于危险状态,请点击“保护帐号”。</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">帐号余额</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -978,6 +981,7 @@ <translation id="5728056243719941842">C5 (Envelope)</translation> <translation id="5730040223043577876">如果您在其他网站上重复使用了您的密码,Chrome 建议您重置该密码。</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{将这张卡保存在您的 Google 帐号中}other{将这些卡保存在您的 Google 帐号中}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{使用这张卡的虚拟卡号}other{选择一张卡}}</translation> <translation id="5763042198335101085">请输入有效的电子邮件地址</translation> <translation id="5763703224595565476">您的管理员已在您的浏览器中启用了“Chrome 企业级用户保护”功能。“Chrome 企业级用户保护”功能可以访问您的部分数据。</translation> <translation id="5765072501007116331">要查看递送方式和要求,请选择相应地址</translation> @@ -994,6 +998,7 @@ <translation id="5804241973901381774">权限</translation> <translation id="5810442152076338065">您与 <ph name="DOMAIN" /> 之间的连接采用过时的加密套件进行了加密。</translation> <translation id="5813119285467412249">恢复添加(&R)</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{当您付款时,系统会从这张卡中扣款,但不会将其真实卡号分享给此网站。为进一步增强安全保障,系统会生成一个临时的银行卡验证码 (CVC)。}other{当您付款时,系统会从您所选的卡中扣款,但不会将其真实卡号分享给此网站。为进一步增强安全保障,系统会生成一个临时的银行卡验证码 (CVC)。}}</translation> <translation id="583281660410589416">未知</translation> <translation id="5838278095973806738">请勿在此网站上输入任何敏感信息(例如密码或信用卡信息),因为攻击者可能会盗取这些信息。</translation> <translation id="5851548754964597211">标签列表</translation> @@ -1450,6 +1455,7 @@ <translation id="8042918947222776840">选择取货方式</translation> <translation id="8057711352706143257">“<ph name="SOFTWARE_NAME" />”的配置有误。卸载“<ph name="SOFTWARE_NAME" />”通常可解决此问题。<ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">抱歉,出了点问题。</translation> +<translation id="8067872629359326442">您刚刚在一个诈骗网站中输入了密码。Chromium 可以帮助您消除潜在威胁。若要更改密码并让 Google 知晓您的帐号可能处于危险状态,请点击“保护帐号”。</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">无法在旋转后添加注释</translation> <translation id="8079031581361219619">重新加载此网站?</translation> @@ -1466,6 +1472,7 @@ <translation id="8105368624971345109">关闭</translation> <translation id="8118489163946903409">付款方式</translation> <translation id="8127301229239896662">“<ph name="SOFTWARE_NAME" />”没有正确地安装到您的计算机或网络上。请让您的 IT 管理员解决此问题。</translation> +<translation id="8128526133099929547">您刚刚在一个诈骗网站中输入了密码。Chrome 建议您立即前往 <ph name="WEBSITE_1" /> 以及使用此密码的其他网站更改密码。</translation> <translation id="8131740175452115882">确认</translation> <translation id="8149426793427495338">您的计算机已进入休眠模式。</translation> <translation id="8150722005171944719">无法读取 <ph name="URL" /> 上的文件。该文件可能已遭到删除、移动,或者文件权限不允许进行访问。</translation> @@ -1483,6 +1490,7 @@ <translation id="8218327578424803826">分配的位置:</translation> <translation id="8220146938470311105">C7/C6 (Envelope)</translation> <translation id="8220639454292072926">企业版报告</translation> +<translation id="8221250263817408492">您刚刚在一个诈骗网站中输入了密码。Chromium 建议您立即前往 <ph name="WEBSITE_1" /> 以及使用此密码的其他网站更改密码。</translation> <translation id="8225771182978767009">设置此计算机的用户已选择屏蔽此网站。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">在新的无痕式标签页中打开网页</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 5b06108..34c8f8f 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -591,6 +591,7 @@ <translation id="3828924085048779000">複雜密碼欄位不得留空。</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> 的管理員已安裝支援額外功能的擴充程式。擴充程式可存取您的部分資料。</translation> <translation id="3832522519263485449">多孔 (左側)</translation> +<translation id="3838154488026099170">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" />,以及使用這個密碼的其他網站變更密碼。</translation> <translation id="385051799172605136">返回</translation> <translation id="3858027520442213535">更新日期和時間</translation> <translation id="3884278016824448484">裝置識別碼發生衝突</translation> @@ -628,6 +629,7 @@ <translation id="4072486802667267160">處理您的訂單時發生錯誤,請再試一次。</translation> <translation id="4075732493274867456">用戶端和伺服器不支援共通 SSL 通訊協定版本或加密套件。</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" />,以及使用這個密碼的其他網站變更密碼。</translation> <translation id="4079302484614802869">Proxy 設定已設為使用 .pac 指令碼網址,而非固定的 Proxy 伺服器。</translation> <translation id="4082393374666368382">設定 - 管理</translation> <translation id="4098354747657067197">前往的是欺詐網站</translation> @@ -707,6 +709,7 @@ <translation id="4356973930735388585">攻擊者可能會透過此網站試圖在您的電腦上安裝危險程式,藉此竊取或刪除您的資料 (例如相片、密碼、訊息或信用卡資料)。</translation> <translation id="4358059973562876591">DnsOverHttpsMode 政策發生錯誤,因此系統無法套用您指定的範本。</translation> <translation id="4358461427845829800">管理付款方法…</translation> +<translation id="4359160567981085931">你剛才在詐騙網站上輸入了密碼。Chrome 能夠幫助你。如要變更密碼並通知 Google 你的帳戶可能面臨風險,請按一下 [保護帳戶]。</translation> <translation id="4367563149485757821">Number-12 (信封)</translation> <translation id="437058704415269440">帳戶餘額</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -981,6 +984,7 @@ <translation id="5728056243719941842">C5 (信封)</translation> <translation id="5730040223043577876">如果您已在其他網站上重用密碼,Chrome 建議您重設密碼。</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{將卡儲存至您的 Google 帳戶}other{將卡儲存至您的 Google 帳戶}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{使用這張卡片的虛擬卡號}other{請選取卡片}}</translation> <translation id="5763042198335101085">請輸入有效的電郵地址</translation> <translation id="5763703224595565476">管理員已在瀏覽器上啟用了「Chrome Enterprise 使用者防護」功能。此功能可以存取您的資料。</translation> <translation id="5765072501007116331">如要查看送貨方式和要求,請選取一個地址</translation> @@ -997,6 +1001,7 @@ <translation id="5804241973901381774">權限</translation> <translation id="5810442152076338065">您與 <ph name="DOMAIN" /> 之間的連線透過過時的加密套件加密處理。</translation> <translation id="5813119285467412249">重做新增(&R)</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{當你付款時,系統會向這張卡片收取費用。別擔心,我們不會將卡片的實際卡號提供給這個網站。為了加強安全性,系統會產生暫時性的信用卡安全碼。}other{當你付款時,系統會向你選取的卡片收取費用。別擔心,我們不會將卡片的實際卡號提供給這個網站。為了加強安全性,系統會產生暫時性的信用卡安全碼。}}</translation> <translation id="583281660410589416">不明</translation> <translation id="5838278095973806738">您不應在此網站上輸入任何敏感資料 (例如密碼或信用卡資料),因為攻擊者可能會竊取這些資料。</translation> <translation id="5851548754964597211">分頁清單</translation> @@ -1454,6 +1459,7 @@ <translation id="8042918947222776840">選擇取貨方式</translation> <translation id="8057711352706143257">無法正確安裝「<ph name="SOFTWARE_NAME" />」,解除安裝「<ph name="SOFTWARE_NAME" />」通常能修正相關問題。<ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">很抱歉,系統發生錯誤。</translation> +<translation id="8067872629359326442">你剛才在詐騙網站上輸入了密碼。Chromium 能夠幫助你。如要變更密碼並通知 Google 你的帳戶可能面臨風險,請按一下 [保護帳戶]。</translation> <translation id="8074253406171541171">10x13 (信封)</translation> <translation id="8078141288243656252">文件旋轉後無法加入註釋</translation> <translation id="8079031581361219619">要重新載入網站嗎?</translation> @@ -1470,6 +1476,7 @@ <translation id="8105368624971345109">關閉</translation> <translation id="8118489163946903409">付款方式</translation> <translation id="8127301229239896662">無法在您的電腦或網絡上正確安裝「<ph name="SOFTWARE_NAME" />」。請要求您的 IT 管理員解決此問題。</translation> +<translation id="8128526133099929547">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" /> 和使用這個密碼的其他網站變更密碼。</translation> <translation id="8131740175452115882">確定</translation> <translation id="8149426793427495338">您的電腦已進入休眠狀態。</translation> <translation id="8150722005171944719">無法讀取位於 <ph name="URL" /> 的檔案。這個檔案可能已被移除或移動位置,或者檔案權限為禁止存取。</translation> @@ -1487,6 +1494,7 @@ <translation id="8218327578424803826">已指派的位置:</translation> <translation id="8220146938470311105">C7/C6 (信封)</translation> <translation id="8220639454292072926">企業報告</translation> +<translation id="8221250263817408492">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" /> 和使用這個密碼的其他網站變更密碼。</translation> <translation id="8225771182978767009">設定此電腦的用戶已封鎖此網站。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">在新無痕式分頁中開啟網頁</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index c2da8e6..07f1f3c 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -592,6 +592,7 @@ <translation id="3828924085048779000">通關密語欄位不得留空。</translation> <translation id="3831915413245941253"><ph name="ENROLLMENT_DOMAIN" /> 的管理員已安裝支援額外功能的擴充功能。這些擴充功能可存取你的部分資料。</translation> <translation id="3832522519263485449">多孔 (左側)</translation> +<translation id="3838154488026099170">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" />,以及使用這個密碼的其他網站變更密碼。</translation> <translation id="385051799172605136">返回</translation> <translation id="3858027520442213535">更新日期和時間</translation> <translation id="3884278016824448484">裝置識別碼發生衝突</translation> @@ -629,6 +630,7 @@ <translation id="4072486802667267160">處理你的訂單時發生錯誤,請再試一次。</translation> <translation id="4075732493274867456">用戶端和伺服器不支援一般 SSL 通訊協定版本或加密套件。</translation> <translation id="4075941231477579656">Touch ID</translation> +<translation id="4077092919748553596">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" />,以及使用這個密碼的其他網站變更密碼。</translation> <translation id="4079302484614802869">Proxy 設定已設為使用 .pac 指令碼網址,而非固定的 Proxy 伺服器。</translation> <translation id="4082393374666368382">設定 - 管理</translation> <translation id="4098354747657067197">你要瀏覽的是詐騙網站</translation> @@ -708,6 +710,7 @@ <translation id="4356973930735388585">攻擊者可能會試圖透過這個網站在你的電腦上安裝危險程式,藉此竊取或刪除你的資訊 (例如相片、密碼、郵件和信用卡資料)。</translation> <translation id="4358059973562876591">DnsOverHttpsMode 政策發生錯誤,因此系統無法套用你指定的範本。</translation> <translation id="4358461427845829800">管理付款方式...</translation> +<translation id="4359160567981085931">你剛才在詐騙網站上輸入了密碼。Chrome 能夠幫助你。如要變更密碼並通知 Google 你的帳戶可能面臨風險,請按一下 [保護帳戶]。</translation> <translation id="4367563149485757821">Number-12 (Envelope)</translation> <translation id="437058704415269440">帳戶餘額</translation> <translation id="4372516964750095882">Fanfold-Us</translation> @@ -982,6 +985,7 @@ <translation id="5728056243719941842">C5 (信封)</translation> <translation id="5730040223043577876">如果你在其他網站上重複使用過你的密碼,Chrome 會建議你重設密碼。</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{將卡片儲存到你的 Google 帳戶}other{將卡片儲存到你的 Google 帳戶}}</translation> +<translation id="5745980000221562234">{NUM_CARDS,plural, =1{使用這張卡片的虛擬卡號}other{請選取卡片}}</translation> <translation id="5763042198335101085">請輸入有效的電子郵件地址</translation> <translation id="5763703224595565476">你的系統管理員已為你的瀏覽器啟用 Chrome Enterprise 使用者防護功能。Chrome Enterprise 使用者保護功能可以存取你的部分資料。</translation> <translation id="5765072501007116331">如要查看快遞方式和相關規定,請選取一個地址</translation> @@ -998,6 +1002,7 @@ <translation id="5804241973901381774">權限</translation> <translation id="5810442152076338065">您的 <ph name="DOMAIN" /> 連線使用過舊的加密套件進行加密。</translation> <translation id="5813119285467412249">重做新增(&R)</translation> +<translation id="5824687817967109979">{NUM_CARDS,plural, =1{當你付款時,系統會向這張卡片收取費用。別擔心,我們不會將卡片的實際卡號提供給這個網站。為了加強安全性,系統會產生暫時性的信用卡安全碼。}other{當你付款時,系統會向你選取的卡片收取費用。別擔心,我們不會將卡片的實際卡號提供給這個網站。為了加強安全性,系統會產生暫時性的信用卡安全碼。}}</translation> <translation id="583281660410589416">未知</translation> <translation id="5838278095973806738">請勿在這個網站上輸入任何機密資訊 (例如密碼或信用卡號碼),以免遭到攻擊者竊取。</translation> <translation id="5851548754964597211">分頁清單</translation> @@ -1455,6 +1460,7 @@ <translation id="8042918947222776840">選擇取件方式</translation> <translation id="8057711352706143257">「<ph name="SOFTWARE_NAME" />」的設定不正確。通常解除安裝「<ph name="SOFTWARE_NAME" />」即可修正這個問題。<ph name="FURTHER_EXPLANATION" /></translation> <translation id="8066955247577885446">抱歉,系統發生錯誤。</translation> +<translation id="8067872629359326442">你剛才在詐騙網站上輸入了密碼。Chromium 能夠幫助你。如要變更密碼並通知 Google 你的帳戶可能面臨風險,請按一下 [保護帳戶]。</translation> <translation id="8074253406171541171">10x13 (信封)</translation> <translation id="8078141288243656252">文件旋轉後無法加註</translation> <translation id="8079031581361219619">要重新載入網站嗎?</translation> @@ -1471,6 +1477,7 @@ <translation id="8105368624971345109">關閉</translation> <translation id="8118489163946903409">付款方式</translation> <translation id="8127301229239896662">「<ph name="SOFTWARE_NAME" />」未正確安裝在電腦或網路上。請通知 IT 管理員解決這個問題。</translation> +<translation id="8128526133099929547">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" /> 和使用這個密碼的其他網站變更密碼。</translation> <translation id="8131740175452115882">確認</translation> <translation id="8149426793427495338">您的電腦已進入睡眠模式。</translation> <translation id="8150722005171944719">無法讀取位於 <ph name="URL" /> 的檔案。這個檔案可能已遭移除或移動位置,或者檔案權限為禁止存取。</translation> @@ -1488,6 +1495,7 @@ <translation id="8218327578424803826">指派的位置:</translation> <translation id="8220146938470311105">C7/C6 (信封)</translation> <translation id="8220639454292072926">企業報告</translation> +<translation id="8221250263817408492">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" /> 和使用這個密碼的其他網站變更密碼。</translation> <translation id="8225771182978767009">設定這部電腦的使用者選擇封鎖這個網站。</translation> <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation> <translation id="8238581221633243064">在新的無痕式分頁中開啟網頁</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 1c58e9a..ef6852497 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -326,7 +326,6 @@ <translation id="2467694685043708798"><ph name="BEGIN_LINK" />Iqalisa ukuxilongwa kwenethiwekhi<ph name="END_LINK" /></translation> <translation id="2473195200299095979">Humusha leli khasi</translation> <translation id="2479410451996844060">I-URL yokusesha engavumelekile.</translation> -<translation id="2482370039860827034">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chrome incoma ukuya ku-<ph name="WEBSITE_1" /> naku-<ph name="WEBSITE_2" />, namanye amasayithi lapho usebenzisa khona le phasiwedi nokuyishintsha manje.</translation> <translation id="2482878487686419369">Izaziso</translation> <translation id="248348093745724435">Izinqubomgomo zomshini</translation> <translation id="2491120439723279231">Isitifiketi seseva siqukethe amaphutha.</translation> @@ -339,7 +338,6 @@ <translation id="2505268675989099013">Vikela i-akhawunti</translation> <translation id="2515629240566999685">Ukuhlola isignali endaweni yakho</translation> <translation id="2521385132275182522">Namathisela phansi kwesokudla</translation> -<translation id="2521483867890026383">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chromium incoma ukuya ku-<ph name="WEBSITE_1" /> naku-<ph name="WEBSITE_2" />, namanye amasayithi lapho usebenzisa khona le phasiwedi nokuyishintsha manje.</translation> <translation id="2523886232349826891">Kulondolozwe kule divayisi kuphela</translation> <translation id="2524461107774643265">Engeza ulwazi olungeziwe</translation> <translation id="2535659140340599600">{COUNT,plural, =1{nokungu-1 ngaphezulu}one{nokungu-# ngaphezulu}other{nokungu-# ngaphezulu}}</translation>
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index a3f6ca3d..93f5b6ea 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -742,6 +742,8 @@ "//base:base_java", "//third_party/junit", ] - java_files = [ "test/android/javatests/src/org/chromium/components/sync/test/util/MockSyncContentResolverDelegate.java" ] + sources = [ + "test/android/javatests/src/org/chromium/components/sync/test/util/MockSyncContentResolverDelegate.java", + ] } }
diff --git a/components/sync/android/BUILD.gn b/components/sync/android/BUILD.gn index 8482acd..dd9ceaa 100644 --- a/components/sync/android/BUILD.gn +++ b/components/sync/android/BUILD.gn
@@ -19,7 +19,7 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] srcjar_deps = [ ":java_enums" ] - java_files = [ + sources = [ "java/src/org/chromium/components/sync/AndroidSyncSettings.java", "java/src/org/chromium/components/sync/ModelTypeHelper.java", "java/src/org/chromium/components/sync/Passphrase.java", @@ -49,7 +49,7 @@ "//third_party/jsr-305:jsr_305_javalib", "//third_party/junit", ] - java_files = [ + sources = [ "javatests/src/org/chromium/components/sync/AndroidSyncSettingsTest.java", "javatests/src/org/chromium/components/sync/notifier/InvalidationClientNameProviderTest.java", "javatests/src/org/chromium/components/sync/notifier/InvalidationPreferencesTest.java",
diff --git a/components/tab_groups/BUILD.gn b/components/tab_groups/BUILD.gn index 211e29e..316f14f 100644 --- a/components/tab_groups/BUILD.gn +++ b/components/tab_groups/BUILD.gn
@@ -4,6 +4,8 @@ component("tab_groups") { sources = [ + "tab_group_color.cc", + "tab_group_color.h", "tab_group_id.cc", "tab_group_id.h", "tab_group_visual_data.cc", @@ -14,6 +16,7 @@ deps = [ "//base", + "//components/strings", "//skia", "//ui/base", "//ui/gfx",
diff --git a/components/tab_groups/DEPS b/components/tab_groups/DEPS index 41cd997..7d55fbf 100644 --- a/components/tab_groups/DEPS +++ b/components/tab_groups/DEPS
@@ -1,3 +1,6 @@ include_rules = [ + "+components/strings", "+third_party/skia/include", + "+ui/base", + "+ui/gfx", ]
diff --git a/components/tab_groups/tab_group_color.cc b/components/tab_groups/tab_group_color.cc new file mode 100644 index 0000000..ff2b37ad --- /dev/null +++ b/components/tab_groups/tab_group_color.cc
@@ -0,0 +1,52 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/tab_groups/tab_group_color.h" + +#include "base/containers/flat_map.h" +#include "base/no_destructor.h" +#include "base/strings/utf_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#include "third_party/skia/include/utils/SkRandom.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/color_palette.h" + +namespace tab_groups { + +const base::flat_map<TabGroupColorId, TabGroupColor>& GetTabGroupColorSet() { + static const base::NoDestructor< + base::flat_map<TabGroupColorId, TabGroupColor>> + kTabGroupColors( + {{TabGroupColorId::kGrey, + TabGroupColor{gfx::kGoogleGrey700, gfx::kGoogleGrey400, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_GREY)}}, + {TabGroupColorId::kBlue, + TabGroupColor{gfx::kGoogleBlue600, gfx::kGoogleBlue300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_BLUE)}}, + {TabGroupColorId::kRed, + TabGroupColor{gfx::kGoogleRed600, gfx::kGoogleRed300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_RED)}}, + {TabGroupColorId::kYellow, + TabGroupColor{ + gfx::kGoogleYellow900, gfx::kGoogleYellow300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_YELLOW)}}, + {TabGroupColorId::kGreen, + TabGroupColor{ + gfx::kGoogleGreen600, gfx::kGoogleGreen300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_GREEN)}}, + {TabGroupColorId::kPink, + TabGroupColor{gfx::kGooglePink700, gfx::kGooglePink300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_PINK)}}, + {TabGroupColorId::kPurple, + TabGroupColor{ + gfx::kGooglePurple600, gfx::kGooglePurple200, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_PURPLE)}}, + {TabGroupColorId::kCyan, + TabGroupColor{ + gfx::kGoogleCyan900, gfx::kGoogleCyan300, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_COLOR_CYAN)}}}); + return *kTabGroupColors; +} + +} // namespace tab_groups
diff --git a/components/tab_groups/tab_group_color.h b/components/tab_groups/tab_group_color.h new file mode 100644 index 0000000..5adf93aa --- /dev/null +++ b/components/tab_groups/tab_group_color.h
@@ -0,0 +1,56 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_TAB_GROUPS_TAB_GROUP_COLOR_H_ +#define COMPONENTS_TAB_GROUPS_TAB_GROUP_COLOR_H_ + +#include <stddef.h> +#include <map> + +#include "base/component_export.h" +#include "base/containers/flat_map.h" +#include "base/macros.h" +#include "base/strings/string16.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace tab_groups { + +// IMPORTANT: Do not change or reuse the values of any item in this enum. +// These values are written to and read from disk for session and tab restore. +// +// Any changes to the tab group color set should be made in the map returned by +// GetColorSet(). The set of valid colors is contained in the keys of that map. +// Do not add or delete items in this enum without also reflecting that change +// in the map. +// +// Any code that reads an enum value from disk should check it against the map +// from GetColorSet(). If the value is not contained in the map's keys, default +// to kGrey. +enum class TabGroupColorId { + kGrey = 0, + kBlue = 1, + kRed = 2, + kYellow = 3, + kGreen = 4, + kPink = 5, + kPurple = 6, + kCyan = 7, + // Next value: 8 +}; + +struct COMPONENT_EXPORT(TAB_GROUPS) TabGroupColor { + SkColor light_theme_color; + SkColor dark_theme_color; + base::string16 label; +}; + +// Returns the source of truth for what colors tab groups can currently have. +// When reading color IDs from disk, always verify against the keys in this +// map for valid values, and fall back to kGrey if it doesn't exist. +COMPONENT_EXPORT(TAB_GROUPS) +const base::flat_map<TabGroupColorId, TabGroupColor>& GetTabGroupColorSet(); + +} // namespace tab_groups + +#endif // COMPONENTS_TAB_GROUPS_TAB_GROUP_COLOR_H_
diff --git a/components/tab_groups/tab_group_visual_data.cc b/components/tab_groups/tab_group_visual_data.cc index ab4179e6..7444ac7d 100644 --- a/components/tab_groups/tab_group_visual_data.cc +++ b/components/tab_groups/tab_group_visual_data.cc
@@ -4,20 +4,19 @@ #include "components/tab_groups/tab_group_visual_data.h" -#include "base/strings/string_number_conversions.h" +#include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" -#include "third_party/skia/include/utils/SkRandom.h" +#include "components/tab_groups/tab_group_color.h" namespace tab_groups { TabGroupVisualData::TabGroupVisualData() { title_ = base::ASCIIToUTF16(""); - - static SkRandom rand; - color_ = rand.nextU() | 0xff000000; + color_ = tab_groups::TabGroupColorId::kGrey; } -TabGroupVisualData::TabGroupVisualData(base::string16 title, SkColor color) +TabGroupVisualData::TabGroupVisualData(base::string16 title, + tab_groups::TabGroupColorId color) : title_(title), color_(color) {} } // namespace tab_groups
diff --git a/components/tab_groups/tab_group_visual_data.h b/components/tab_groups/tab_group_visual_data.h index 2ae27db..2e2bc7b 100644 --- a/components/tab_groups/tab_group_visual_data.h +++ b/components/tab_groups/tab_group_visual_data.h
@@ -10,6 +10,7 @@ #include "base/component_export.h" #include "base/macros.h" #include "base/strings/string16.h" +#include "components/tab_groups/tab_group_color.h" #include "third_party/skia/include/core/SkColor.h" namespace tab_groups { @@ -19,7 +20,7 @@ // Construct a TabGroupVisualData with placeholder name and random color. TabGroupVisualData(); - TabGroupVisualData(base::string16 title, SkColor color); + TabGroupVisualData(base::string16 title, tab_groups::TabGroupColorId color); TabGroupVisualData(const TabGroupVisualData& other) = default; TabGroupVisualData(TabGroupVisualData&& other) = default; @@ -28,7 +29,7 @@ TabGroupVisualData& operator=(TabGroupVisualData&& other) = default; base::string16 title() const { return title_; } - SkColor color() const { return color_; } + tab_groups::TabGroupColorId color() const { return color_; } // Checks whether two instances are visually equivalent. bool operator==(const TabGroupVisualData& other) const { @@ -40,7 +41,7 @@ private: base::string16 title_; - SkColor color_; + tab_groups::TabGroupColorId color_; }; } // namespace tab_groups
diff --git a/components/tab_groups_strings.grdp b/components/tab_groups_strings.grdp new file mode 100644 index 0000000..3eb78c50 --- /dev/null +++ b/components/tab_groups_strings.grdp
@@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + + <!-- Tab Group Header Colors --> + <message name="IDS_TAB_GROUP_COLOR_GREY" desc="The accessibility label for a button in a color picker that is used to choose the color grey."> + Grey + </message> + <message name="IDS_TAB_GROUP_COLOR_BLUE" desc="The accessibility label for a button in a color picker that is used to choose the color blue."> + Blue + </message> + <message name="IDS_TAB_GROUP_COLOR_RED" desc="The accessibility label for a button in a color picker that is used to choose the color red."> + Red + </message> + <message name="IDS_TAB_GROUP_COLOR_YELLOW" desc="The accessibility label for a button in a color picker that is used to choose the color yellow."> + Yellow + </message> + <message name="IDS_TAB_GROUP_COLOR_GREEN" desc="The accessibility label for a button in a color picker that is used to choose the color green."> + Green + </message> + <message name="IDS_TAB_GROUP_COLOR_PINK" desc="The accessibility label for a button in a color picker that is used to choose the color pink."> + Pink + </message> + <message name="IDS_TAB_GROUP_COLOR_PURPLE" desc="The accessibility label for a button in a color picker that is used to choose the color purple."> + Purple + </message> + <message name="IDS_TAB_GROUP_COLOR_CYAN" desc="The accessibility label for a button in a color picker that is used to choose the color cyan."> + Cyan + </message> + +</grit-part>
diff --git a/components/tab_groups_strings_grdp/OWNERS b/components/tab_groups_strings_grdp/OWNERS new file mode 100644 index 0000000..d8ec83f --- /dev/null +++ b/components/tab_groups_strings_grdp/OWNERS
@@ -0,0 +1,4 @@ +# COMPONENT: UI>Browser>TabStrip +# Use the above COMPONENT in crbugs to to file bugs against issues in this folder + +file://components/tab_groups/OWNERS
diff --git a/components/tab_groups_strings_grdp/README.md b/components/tab_groups_strings_grdp/README.md new file mode 100644 index 0000000..119d8b9 --- /dev/null +++ b/components/tab_groups_strings_grdp/README.md
@@ -0,0 +1,5 @@ +This directory of image SHA-1 hashes is used to improve translations of UI +strings through context images for translators. + +See also: [Chrome Translation Screenshots - Instructions & FAQ +](https://docs.google.com/document/d/1nwYWDny20icMSpLUuV_LgrlbWKrYpbXOERUIZNH636o/edit#heading=h.2t7lc4cxo2au)
diff --git a/components/test/data/dom_distiller/pinch_tester.js b/components/test/data/dom_distiller/pinch_tester.js index 6e36646..6eea62f 100644 --- a/components/test/data/dom_distiller/pinch_tester.js +++ b/components/test/data/dom_distiller/pinch_tester.js
@@ -2,10 +2,51 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -const pinchtest = (function() { - 'use strict'; +class Touch { + constructor() { + this.points = {}; + } - function assertTrue(condition, message) { + /** @private */ + lowestID_() { + let ans = -1; + for (const key in this.points) { + ans = Math.max(ans, key); + } + return ans + 1; + } + + updateTouchPoint(key, x, y, offsetX, offsetY) { + const e = {clientX: x, clientY: y, pageX: x, pageY: y}; + if (typeof (offsetX) === 'number') { + e.clientX += offsetX; + } + if (typeof (offsetY) === 'number') { + e.clientY += offsetY; + } + this.points[key] = e; + } + + addTouchPoint(x, y, offsetX, offsetY) { + this.updateTouchPoint(this.lowestID_(), x, y, offsetX, offsetY); + } + + releaseTouchPoint(key) { + delete this.points[key]; + } + + events() { + const arr = []; + for (const key in this.points) { + arr.push(this.points[key]); + } + return {touches: arr, preventDefault: function() {}}; + } +} + +class PinchTest { + /** @private */ + assertTrue_(condition, message) { if (!condition) { message = message || 'Assertion failed'; console.trace(); @@ -13,7 +54,8 @@ } } - function assertClose(a, b, message) { + /** @private */ + assertClose_(a, b, message) { if (Math.abs(a - b) > 1e-5) { message = message || 'Assertion failed'; console.log('"', a, '" and "', b, '" are not close.'); @@ -22,7 +64,8 @@ } } - function isEquivalent(a, b) { + /** @private */ + isEquivalent_(a, b) { // Create arrays of property names const aProps = Object.getOwnPropertyNames(a); const bProps = Object.getOwnPropertyNames(b); @@ -48,8 +91,9 @@ return true; } - function assertEqual(a, b, message) { - if (!isEquivalent(a, b)) { + /** @private */ + assertEqual_(a, b, message) { + if (!this.isEquivalent_(a, b)) { message = message || 'Assertion failed'; console.log('"', a, '" and "', b, '" are not equal'); console.trace(); @@ -57,105 +101,67 @@ } } - const touch = (function() { - 'use strict'; - const points = {}; - function lowestID() { - let ans = -1; - for (const key in points) { - ans = Math.max(ans, key); - } - return ans + 1; - } - function changeTouchPoint(key, x, y, offsetX, offsetY) { - const e = {clientX: x, clientY: y, pageX: x, pageY: y}; - if (typeof (offsetX) === 'number') { - e.clientX += offsetX; - } - if (typeof (offsetY) === 'number') { - e.clientY += offsetY; - } - points[key] = e; - } - return { - addTouchPoint: function(x, y, offsetX, offsetY) { - changeTouchPoint(lowestID(), x, y, offsetX, offsetY); - }, - updateTouchPoint: changeTouchPoint, - releaseTouchPoint: function(key) { - delete points[key]; - }, - events: function() { - const arr = []; - for (const key in points) { - arr.push(points[key]); - } - return {touches: arr, preventDefault: function() {}}; - } - }; - }); - - function testZoomOut() { + testZoomOut() { pincher.reset(); - const t = new touch(); + const t = new Touch(); // Make sure start event doesn't change state let oldState = pincher.status(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(300, 300); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); // Make sure extra move event doesn't change state pincher.handleTouchMove(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.updateTouchPoint(0, 150, 150); t.updateTouchPoint(1, 250, 250); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale < 0.9); + this.assertTrue_(pincher.status().clampedScale < 0.9); // Make sure end event doesn't change state oldState = pincher.status(); t.releaseTouchPoint(1); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); } - function testZoomIn() { + testZoomIn() { pincher.reset(); - const t = new touch(); + const t = new Touch(); let oldState = pincher.status(); t.addTouchPoint(150, 150); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(250, 250); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.updateTouchPoint(0, 100, 100); t.updateTouchPoint(1, 300, 300); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale > 1.1); + this.assertTrue_(pincher.status().clampedScale > 1.1); oldState = pincher.status(); t.releaseTouchPoint(1); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); } - function testZoomOutAndPan() { + testZoomOutAndPan() { pincher.reset(); - const t = new touch(); + const t = new Touch(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); t.addTouchPoint(300, 300); @@ -171,14 +177,14 @@ t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertClose(pincher.status().shiftX, 10); - assertClose(pincher.status().shiftY, -5); - assertTrue(pincher.status().clampedScale < 0.9); + this.assertClose_(pincher.status().shiftX, 10); + this.assertClose_(pincher.status().shiftY, -5); + this.assertTrue_(pincher.status().clampedScale < 0.9); } - function testReversible() { + testReversible() { pincher.reset(); - const t = new touch(); + const t = new Touch(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); t.addTouchPoint(300, 300); @@ -201,26 +207,26 @@ pincher.handleTouchEnd(t.events()); t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertClose(pincher.status().clampedScale, 1); + this.assertClose_(pincher.status().clampedScale, 1); } - function testMultitouchZoomOut() { + testMultitouchZoomOut() { pincher.reset(); - const t = new touch(); + const t = new Touch(); let oldState = pincher.status(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(300, 300); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(100, 300); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(300, 100); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); // Multi-touch zoom out. t.updateTouchPoint(0, 150, 150); @@ -232,60 +238,60 @@ oldState = pincher.status(); t.releaseTouchPoint(3); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(2); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(1); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); - assertTrue(pincher.status().clampedScale < 0.9); + this.assertTrue_(pincher.status().clampedScale < 0.9); } - function testZoomOutThenMulti() { + testZoomOutThenMulti() { pincher.reset(); - const t = new touch(); + const t = new Touch(); let oldState = pincher.status(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(300, 300); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); // Zoom out. t.updateTouchPoint(0, 150, 150); t.updateTouchPoint(1, 250, 250); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale < 0.9); + this.assertTrue_(pincher.status().clampedScale < 0.9); // Make sure adding and removing more point doesn't change state oldState = pincher.status(); t.addTouchPoint(600, 600); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.releaseTouchPoint(2); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); // More than two fingers. t.addTouchPoint(150, 250); pincher.handleTouchStart(t.events()); t.addTouchPoint(250, 150); pincher.handleTouchStart(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.updateTouchPoint(0, 100, 100); t.updateTouchPoint(1, 300, 300); t.updateTouchPoint(2, 100, 300); t.updateTouchPoint(3, 300, 100); pincher.handleTouchMove(t.events()); - assertClose(pincher.status().scale, 1); + this.assertClose_(pincher.status().scale, 1); oldState = pincher.status(); t.releaseTouchPoint(3); @@ -293,12 +299,12 @@ t.releaseTouchPoint(1); t.releaseTouchPoint(0); pincher.handleTouchEnd(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); } - function testCancel() { + testCancel() { pincher.reset(); - const t = new touch(); + const t = new Touch(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); @@ -307,13 +313,13 @@ t.updateTouchPoint(0, 150, 150); t.updateTouchPoint(1, 250, 250); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale < 0.9); + this.assertTrue_(pincher.status().clampedScale < 0.9); const oldState = pincher.status(); t.releaseTouchPoint(1); t.releaseTouchPoint(0); pincher.handleTouchCancel(t.events()); - assertEqual(oldState, pincher.status()); + this.assertEqual_(oldState, pincher.status()); t.addTouchPoint(150, 150); pincher.handleTouchStart(t.events()); @@ -322,12 +328,12 @@ t.updateTouchPoint(0, 100, 100); t.updateTouchPoint(1, 300, 300); pincher.handleTouchMove(t.events()); - assertClose(pincher.status().clampedScale, 1); + this.assertClose_(pincher.status().clampedScale, 1); } - function testSingularity() { + testSingularity() { pincher.reset(); - const t = new touch(); + const t = new Touch(); t.addTouchPoint(100, 100); pincher.handleTouchStart(t.events()); @@ -336,16 +342,16 @@ t.updateTouchPoint(0, 150, 150); t.updateTouchPoint(1, 50, 50); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale > 1.1); - assertTrue(pincher.status().clampedScale < 100); - assertTrue(pincher.status().scale < 100); + this.assertTrue_(pincher.status().clampedScale > 1.1); + this.assertTrue_(pincher.status().clampedScale < 100); + this.assertTrue_(pincher.status().scale < 100); pincher.handleTouchCancel(); } - function testMinSpan() { + testMinSpan() { pincher.reset(); - const t = new touch(); + const t = new Touch(); t.addTouchPoint(50, 50); pincher.handleTouchStart(t.events()); @@ -354,19 +360,19 @@ t.updateTouchPoint(0, 100, 100); t.updateTouchPoint(1, 100, 100); pincher.handleTouchMove(t.events()); - assertTrue(pincher.status().clampedScale < 0.9); - assertTrue(pincher.status().clampedScale > 0); - assertTrue(pincher.status().scale > 0); + this.assertTrue_(pincher.status().clampedScale < 0.9); + this.assertTrue_(pincher.status().clampedScale > 0); + this.assertTrue_(pincher.status().scale > 0); pincher.handleTouchCancel(); } - function testFontScaling() { + testFontScaling() { pincher.reset(); useFontScaling(1.5); - assertClose(pincher.status().clampedScale, 1.5); + this.assertClose_(pincher.status().clampedScale, 1.5); - let t = new touch(); + let t = new Touch(); // Start touch. let oldState = pincher.status(); @@ -381,14 +387,15 @@ pincher.handleTouchMove(t.events()); // Verify scale is smaller. - assertTrue(pincher.status().clampedScale < 0.9 * oldState.clampedScale); + this.assertTrue_( + pincher.status().clampedScale < 0.9 * oldState.clampedScale); pincher.handleTouchCancel(); useFontScaling(0.8); - assertClose(pincher.status().clampedScale, 0.8); + this.assertClose_(pincher.status().clampedScale, 0.8); // Start touch. - t = new touch(); + t = new Touch(); oldState = pincher.status(); t.addTouchPoint(150, 150); pincher.handleTouchStart(t.events()); @@ -401,25 +408,25 @@ pincher.handleTouchMove(t.events()); // Verify scale is larger. - assertTrue(pincher.status().clampedScale > 1.1 * oldState.clampedScale); + this.assertTrue_( + pincher.status().clampedScale > 1.1 * oldState.clampedScale); pincher.handleTouchCancel(); } - return { - run: function() { - testZoomOut(); - testZoomIn(); - testZoomOutAndPan(); - testReversible(); - testMultitouchZoomOut(); - testZoomOutThenMulti(); - testCancel(); - testSingularity(); - testMinSpan(); - testFontScaling(); - pincher.reset(); + run() { + this.testZoomOut(); + this.testZoomIn(); + this.testZoomOutAndPan(); + this.testReversible(); + this.testMultitouchZoomOut(); + this.testZoomOutThenMulti(); + this.testCancel(); + this.testSingularity(); + this.testMinSpan(); + this.testFontScaling(); + pincher.reset(); - return true; - } - }; -}()); + return true; + } +} +const pinchtest = new PinchTest;
diff --git a/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-25.png.sha1 index 9335464..89db85f 100644 --- a/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-25.png.sha1 +++ b/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-25.png.sha1
@@ -1 +1 @@ -94d51539dee684b7ed109c145f738e5b03c972f5 \ No newline at end of file +87ad2701c29781d34ee6b7accca1782dd3471677 \ No newline at end of file
diff --git a/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-26.png.sha1 b/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-26.png.sha1 index f40d33b..6ae3521 100644 --- a/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-26.png.sha1 +++ b/components/test/data/vr_browser_video/render_tests/VrBrowserWebInputEditingTest.fullscreen_video_paused_browser_content.Pixel_XL-26.png.sha1
@@ -1 +1 @@ -834d01dbb54a5f90ac36adbe0fe878cf147cd90a \ No newline at end of file +d1b893dfb80d7a816d77ea23902e0fe7cbda2bf1 \ No newline at end of file
diff --git a/components/url_formatter/android/BUILD.gn b/components/url_formatter/android/BUILD.gn index a664229..523bd8c 100644 --- a/components/url_formatter/android/BUILD.gn +++ b/components/url_formatter/android/BUILD.gn
@@ -11,8 +11,9 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = - [ "java/src/org/chromium/components/url_formatter/UrlFormatter.java" ] + sources = [ + "java/src/org/chromium/components/url_formatter/UrlFormatter.java", + ] } generate_jni("jni_headers") {
diff --git a/components/variations/android/BUILD.gn b/components/variations/android/BUILD.gn index 7340c2b53..488a6f5a 100644 --- a/components/variations/android/BUILD.gn +++ b/components/variations/android/BUILD.gn
@@ -11,7 +11,7 @@ "//third_party/android_deps:com_android_support_support_core_utils_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ + sources = [ "java/src/org/chromium/components/variations/VariationsAssociatedData.java", "java/src/org/chromium/components/variations/firstrun/VariationsSeedBridge.java", "java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java", @@ -19,7 +19,9 @@ } junit_binary("components_variations_junit_tests") { - java_files = [ "junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java" ] + sources = [ + "junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java", + ] deps = [ ":variations_java", "//base:base_java",
diff --git a/components/version_info/android/BUILD.gn b/components/version_info/android/BUILD.gn index 25baa6e..9b84617 100644 --- a/components/version_info/android/BUILD.gn +++ b/components/version_info/android/BUILD.gn
@@ -11,7 +11,7 @@ # Depend on this on the Java side to get org.components.version_info.Channel and # org.components.version_info.VersionConstants. android_library("version_constants_java") { - java_files = [ + sources = [ "java/src/org/chromium/components/version_info/VersionConstantsBridge.java", _version_constants_java_file, ]
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn index c7031ab..863a3320 100644 --- a/components/viz/common/BUILD.gn +++ b/components/viz/common/BUILD.gn
@@ -440,9 +440,9 @@ deps = [ "//base:base_java", ] - java_files = [ - "java/src/org/chromium/components/viz/common/display/DeJellyUtils.java", + sources = [ "java/src/org/chromium/components/viz/common/VizSwitches.java", + "java/src/org/chromium/components/viz/common/display/DeJellyUtils.java", ] }
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index aff2f51..9188155 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -594,9 +594,9 @@ "//ui/android:ui_full_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - java_files = [ - "java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java", + sources = [ "java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java", + "java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java", ] }
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h index 7c5b9dd..ab94f84d 100644 --- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h +++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
@@ -40,8 +40,6 @@ ~GLOutputSurfaceBufferQueue() override; - // TODO(rjkroege): Implement the equivalent of Reflector. - protected: // OutputSurface implementation. void SetDisplayTransformHint(gfx::OverlayTransform transform) override;
diff --git a/components/webdata/common/web_data_service_base.cc b/components/webdata/common/web_data_service_base.cc index ed00e69e8..0385df7 100644 --- a/components/webdata/common/web_data_service_base.cc +++ b/components/webdata/common/web_data_service_base.cc
@@ -4,21 +4,10 @@ #include "components/webdata/common/web_data_service_base.h" -#include "base/bind.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/threading/thread.h" #include "components/webdata/common/web_database_service.h" -//////////////////////////////////////////////////////////////////////////////// -// -// WebDataServiceBase implementation. -// -//////////////////////////////////////////////////////////////////////////////// - -using base::Bind; -using base::Time; - WebDataServiceBase::WebDataServiceBase( scoped_refptr<WebDatabaseService> wdbs, const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) @@ -34,34 +23,17 @@ } void WebDataServiceBase::ShutdownDatabase() { - if (!wdbs_) - return; - wdbs_->ShutdownDatabase(); + if (wdbs_) + wdbs_->ShutdownDatabase(); } void WebDataServiceBase::CancelRequest(Handle h) { - if (!wdbs_) - return; - wdbs_->CancelRequest(h); -} - -bool WebDataServiceBase::IsDatabaseLoaded() { - if (!wdbs_) - return false; - return wdbs_->db_loaded(); -} - -void WebDataServiceBase::RegisterDBLoadedCallback(DBLoadedCallback callback) { - if (!wdbs_) - return; - wdbs_->RegisterDBLoadedCallback(std::move(callback)); + if (wdbs_) + wdbs_->CancelRequest(h); } WebDatabase* WebDataServiceBase::GetDatabase() { - if (!wdbs_) - return nullptr; - return wdbs_->GetDatabaseOnDB(); + return wdbs_ ? wdbs_->GetDatabaseOnDB() : nullptr; } -WebDataServiceBase::~WebDataServiceBase() { -} +WebDataServiceBase::~WebDataServiceBase() = default;
diff --git a/components/webdata/common/web_data_service_base.h b/components/webdata/common/web_data_service_base.h index a9f5c638..6c340d3 100644 --- a/components/webdata/common/web_data_service_base.h +++ b/components/webdata/common/web_data_service_base.h
@@ -36,8 +36,6 @@ using ProfileErrorCallback = base::OnceCallback<void(sql::InitStatus, const std::string&)>; - using DBLoadedCallback = base::OnceClosure; - // |callback| will only be invoked on error, and only if // |callback.is_null()| evaluates to false. // @@ -65,20 +63,8 @@ // Unloads the database and shuts down service. void ShutdownDatabase(); - // Register a callback to be notified that the database has loaded. Multiple - // callbacks may be registered, and each will be called at most once - // (following a successful database load), then cleared. - // Note: if the database load is already complete, then the callback will NOT - // be stored or called. - virtual void RegisterDBLoadedCallback(DBLoadedCallback callback); - - // Returns true if the database load has completetd successfully, and - // ShutdownOnUISequence() has not yet been called. - virtual bool IsDatabaseLoaded(); - // Returns a pointer to the DB (used by SyncableServices). May return NULL if - // the database is not loaded or otherwise unavailable. Must be called on DB - // sequence. + // the database is unavailable. Must be called on DB sequence. virtual WebDatabase* GetDatabase(); protected:
diff --git a/components/webdata/common/web_database_backend.cc b/components/webdata/common/web_database_backend.cc index 53cb0ecc..8ceca83 100644 --- a/components/webdata/common/web_database_backend.cc +++ b/components/webdata/common/web_database_backend.cc
@@ -14,20 +14,13 @@ #include "components/webdata/common/web_database_table.h" #include "sql/error_delegate_util.h" -using base::Bind; -using base::FilePath; - WebDatabaseBackend::WebDatabaseBackend( - const FilePath& path, - Delegate* delegate, + const base::FilePath& path, + std::unique_ptr<Delegate> delegate, const scoped_refptr<base::SingleThreadTaskRunner>& db_thread) : base::RefCountedDeleteOnSequence<WebDatabaseBackend>(db_thread), db_path_(path), - request_manager_(new WebDataRequestManager()), - init_status_(sql::INIT_FAILURE), - init_complete_(false), - catastrophic_error_occurred_(false), - delegate_(delegate) {} + delegate_(std::move(delegate)) {} void WebDatabaseBackend::AddTable(std::unique_ptr<WebDatabaseTable> table) { DCHECK(!db_); @@ -36,15 +29,14 @@ void WebDatabaseBackend::InitDatabase() { LoadDatabaseIfNecessary(); - if (delegate_) { + if (delegate_) delegate_->DBLoaded(init_status_, diagnostics_); - } } void WebDatabaseBackend::ShutdownDatabase() { if (db_ && init_status_ == sql::INIT_OK) db_->CommitTransaction(); - db_.reset(nullptr); + db_.reset(); init_complete_ = true; // Ensures the init sequence is not re-run. init_status_ = sql::INIT_FAILURE; } @@ -81,10 +73,8 @@ std::unique_ptr<WDTypedResult> WebDatabaseBackend::ExecuteReadTask( WebDatabaseService::ReadTask task) { LoadDatabaseIfNecessary(); - if (db_ && init_status_ == sql::INIT_OK) { - return std::move(task).Run(db_.get()); - } - return nullptr; + return (db_ && init_status_ == sql::INIT_OK) ? std::move(task).Run(db_.get()) + : nullptr; } WebDatabaseBackend::~WebDatabaseBackend() { @@ -96,7 +86,7 @@ return; init_complete_ = true; - db_.reset(new WebDatabase()); + db_ = std::make_unique<WebDatabase>(); for (const auto& table : tables_) db_->AddTable(table.get()); @@ -109,17 +99,13 @@ init_status_ = db_->Init(db_path_); if (init_status_ != sql::INIT_OK) { - LOG(ERROR) << "Cannot initialize the web database: " << init_status_; db_.reset(); return; } // A catastrophic error might have happened and recovered. - if (catastrophic_error_occurred_) { + if (catastrophic_error_occurred_) init_status_ = sql::INIT_OK_WITH_DATA_LOSS; - LOG(WARNING) - << "Webdata recovered from a catastrophic error. Data loss possible."; - } db_->BeginTransaction(); }
diff --git a/components/webdata/common/web_database_backend.h b/components/webdata/common/web_database_backend.h index bedaba7..57c3503 100644 --- a/components/webdata/common/web_database_backend.h +++ b/components/webdata/common/web_database_backend.h
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_delete_on_sequence.h" #include "base/single_thread_task_runner.h" +#include "components/webdata/common/web_data_request_manager.h" #include "components/webdata/common/web_database_service.h" #include "components/webdata/common/webdata_export.h" @@ -44,7 +45,7 @@ WebDatabaseBackend( const base::FilePath& path, - Delegate* delegate, + std::unique_ptr<Delegate> delegate, const scoped_refptr<base::SingleThreadTaskRunner>& db_thread); // Must call only before InitDatabaseWithCallback. @@ -111,19 +112,20 @@ std::unique_ptr<WebDatabase> db_; // Keeps track of all pending requests made to the db. - scoped_refptr<WebDataRequestManager> request_manager_; + scoped_refptr<WebDataRequestManager> request_manager_ = + base::MakeRefCounted<WebDataRequestManager>(); // State of database initialization. Used to prevent the executing of tasks // before the db is ready. - sql::InitStatus init_status_; + sql::InitStatus init_status_ = sql::INIT_FAILURE; // True if an attempt has been made to load the database (even if the attempt // fails), used to avoid continually trying to reinit if the db init fails. - bool init_complete_; + bool init_complete_ = false; // True if a catastrophic database error occurs and further error callbacks // from the database should be ignored. - bool catastrophic_error_occurred_; + bool catastrophic_error_occurred_ = false; // If a catastrophic database error has occurred, this contains any available // diagnostic information.
diff --git a/components/webdata/common/web_database_service.cc b/components/webdata/common/web_database_service.cc index 8bb61eb1..337b9261 100644 --- a/components/webdata/common/web_database_service.cc +++ b/components/webdata/common/web_database_service.cc
@@ -15,9 +15,6 @@ #include "components/webdata/common/web_data_service_consumer.h" #include "components/webdata/common/web_database_backend.h" -using base::Bind; -using base::FilePath; - // Receives messages from the backend on the DB sequence, posts them to // WebDatabaseService on the UI sequence. class WebDatabaseService::BackendDelegate @@ -44,19 +41,18 @@ scoped_refptr<base::SingleThreadTaskRunner> db_task_runner) : base::RefCountedDeleteOnSequence<WebDatabaseService>(ui_task_runner), path_(path), - db_loaded_(false), db_task_runner_(db_task_runner) { DCHECK(ui_task_runner->RunsTasksInCurrentSequence()); DCHECK(db_task_runner_); } -WebDatabaseService::~WebDatabaseService() { -} +WebDatabaseService::~WebDatabaseService() = default; void WebDatabaseService::AddTable(std::unique_ptr<WebDatabaseTable> table) { if (!web_db_backend_) { - web_db_backend_ = new WebDatabaseBackend( - path_, new BackendDelegate(weak_ptr_factory_.GetWeakPtr()), + web_db_backend_ = base::MakeRefCounted<WebDatabaseBackend>( + path_, + std::make_unique<BackendDelegate>(weak_ptr_factory_.GetWeakPtr()), db_task_runner_); } web_db_backend_->AddTable(std::move(table)); @@ -69,8 +65,6 @@ } void WebDatabaseService::ShutdownDatabase() { - db_loaded_ = false; - loaded_callbacks_.clear(); error_callbacks_.clear(); weak_ptr_factory_.InvalidateWeakPtrs(); if (!web_db_backend_) @@ -117,13 +111,8 @@ } void WebDatabaseService::CancelRequest(WebDataServiceBase::Handle h) { - if (!web_db_backend_) - return; - web_db_backend_->request_manager()->CancelRequest(h); -} - -void WebDatabaseService::RegisterDBLoadedCallback(DBLoadedCallback callback) { - loaded_callbacks_.push_back(std::move(callback)); + if (web_db_backend_) + web_db_backend_->request_manager()->CancelRequest(h); } void WebDatabaseService::RegisterDBErrorCallback(DBLoadErrorCallback callback) { @@ -134,29 +123,19 @@ const std::string& diagnostics) { // The INIT_OK_WITH_DATA_LOSS status is an initialization success but with // suspected data loss, so we also run the error callbacks. - if (status != sql::INIT_OK) { - // Notify that the database load failed. - while (!error_callbacks_.empty()) { - // The profile error callback is a message box that runs in a nested run - // loop. While it's being displayed, other OnDatabaseLoadDone() will run - // (posted from WebDatabaseBackend::Delegate::DBLoaded()). We need to make - // sure that after the callback running the message box returns, it checks - // |error_callbacks_| before it accesses it. - DBLoadErrorCallback error_callback = std::move(error_callbacks_.back()); - error_callbacks_.pop_back(); - if (error_callback) - std::move(error_callback).Run(status, diagnostics); - } - } + if (status == sql::INIT_OK) + return; - if (status == sql::INIT_OK || status == sql::INIT_OK_WITH_DATA_LOSS) { - db_loaded_ = true; - - while (!loaded_callbacks_.empty()) { - DBLoadedCallback loaded_callback = std::move(loaded_callbacks_.back()); - loaded_callbacks_.pop_back(); - if (loaded_callback) - std::move(loaded_callback).Run(); - } + // Notify that the database load failed. + while (!error_callbacks_.empty()) { + // The profile error callback is a message box that runs in a nested run + // loop. While it's being displayed, other OnDatabaseLoadDone() will run + // (posted from WebDatabaseBackend::Delegate::DBLoaded()). We need to make + // sure that after the callback running the message box returns, it checks + // |error_callbacks_| before it accesses it. + DBLoadErrorCallback error_callback = std::move(error_callbacks_.back()); + error_callbacks_.pop_back(); + if (!error_callback.is_null()) + std::move(error_callback).Run(status, diagnostics); } }
diff --git a/components/webdata/common/web_database_service.h b/components/webdata/common/web_database_service.h index c3d895f..092df83 100644 --- a/components/webdata/common/web_database_service.h +++ b/components/webdata/common/web_database_service.h
@@ -50,7 +50,6 @@ using WriteTask = base::OnceCallback<WebDatabase::State(WebDatabase*)>; // Types for managing DB loading callbacks. - using DBLoadedCallback = base::OnceClosure; using DBLoadErrorCallback = base::OnceCallback<void(sql::InitStatus, const std::string&)>; @@ -93,13 +92,6 @@ // somewhere else. virtual void CancelRequest(WebDataServiceBase::Handle h); - // Register a callback to be notified that the database has loaded. Multiple - // callbacks may be registered, and each will be called at most once - // (following a successful database load), then cleared. - // Note: if the database load is already complete, then the callback will NOT - // be stored or called. - void RegisterDBLoadedCallback(DBLoadedCallback callback); - // Register a callback to be notified that the database has failed to load. // Multiple callbacks may be registered, and each will be called at most once // (following a database load failure), then cleared. @@ -107,15 +99,12 @@ // be stored or called. void RegisterDBErrorCallback(DBLoadErrorCallback callback); - bool db_loaded() const { return db_loaded_; } - private: class BackendDelegate; friend class BackendDelegate; friend class base::RefCountedDeleteOnSequence<WebDatabaseService>; friend class base::DeleteHelper<WebDatabaseService>; - using LoadedCallbacks = std::vector<DBLoadedCallback>; using ErrorCallbacks = std::vector<DBLoadErrorCallback>; virtual ~WebDatabaseService(); @@ -129,15 +118,9 @@ // PostTask on DB sequence may outlive us. scoped_refptr<WebDatabaseBackend> web_db_backend_; - // Callbacks to be called once the DB has loaded. - LoadedCallbacks loaded_callbacks_; - // Callbacks to be called if the DB has failed to load. ErrorCallbacks error_callbacks_; - // True if the WebDatabase has loaded. - bool db_loaded_; - scoped_refptr<base::SingleThreadTaskRunner> db_task_runner_; // All vended weak pointers are invalidated in ShutdownDatabase().
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 6448dce8..2906bd8d 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1808,6 +1808,17 @@ RunHtmlTest(FILE_PATH_LITERAL("list-item-level.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + AccessibilityListItemAriaSetsizeUnknown) { + RunHtmlTest(FILE_PATH_LITERAL("list-item-aria-setsize-unknown.html")); +} + +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + AccessibilityListItemAriaSetsizeUnknownFlattened) { + RunHtmlTest( + FILE_PATH_LITERAL("list-item-aria-setsize-unknown-flattened.html")); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityListMarkers) { RunHtmlTest(FILE_PATH_LITERAL("list-markers.html")); }
diff --git a/content/browser/compositor/test/test_image_transport_factory.cc b/content/browser/compositor/test/test_image_transport_factory.cc index 277ad86..33f50ec 100644 --- a/content/browser/compositor/test/test_image_transport_factory.cc +++ b/content/browser/compositor/test/test_image_transport_factory.cc
@@ -14,7 +14,6 @@ #include "content/browser/compositor/surface_utils.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" -#include "ui/compositor/reflector.h" #include "ui/compositor/test/in_process_context_provider.h" namespace content { @@ -23,16 +22,6 @@ // TODO(kylechar): Use the same client id for the browser everywhere. constexpr uint32_t kDefaultClientId = std::numeric_limits<uint32_t>::max(); -class FakeReflector : public ui::Reflector { - public: - FakeReflector() = default; - ~FakeReflector() override = default; - - void OnMirroringCompositorResized() override {} - void AddMirroringLayer(ui::Layer* layer) override {} - void RemoveMirroringLayer(ui::Layer* layer) override {} -}; - } // namespace TestImageTransportFactory::TestImageTransportFactory() @@ -124,17 +113,6 @@ observer_list_.RemoveObserver(observer); } -std::unique_ptr<ui::Reflector> TestImageTransportFactory::CreateReflector( - ui::Compositor* source, - ui::Layer* target) { - if (!enable_viz_) - return std::make_unique<FakeReflector>(); - - // TODO(crbug.com/601869): Reflector needs to be rewritten for viz. - NOTIMPLEMENTED(); - return nullptr; -} - viz::FrameSinkId TestImageTransportFactory::AllocateFrameSinkId() { return frame_sink_id_allocator_.NextFrameSinkId(); }
diff --git a/content/browser/compositor/test/test_image_transport_factory.h b/content/browser/compositor/test/test_image_transport_factory.h index b1bb9cfd..14b8119 100644 --- a/content/browser/compositor/test/test_image_transport_factory.h +++ b/content/browser/compositor/test/test_image_transport_factory.h
@@ -55,9 +55,6 @@ void RemoveObserver(ui::ContextFactoryObserver* observer) override; // ui::ContextFactoryPrivate implementation. - std::unique_ptr<ui::Reflector> CreateReflector(ui::Compositor* source, - ui::Layer* target) override; - void RemoveReflector(ui::Reflector* reflector) override {} viz::FrameSinkId AllocateFrameSinkId() override; viz::HostFrameSinkManager* GetHostFrameSinkManager() override; void SetDisplayVisible(ui::Compositor* compositor, bool visible) override {}
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc index a89c8df..073e2aa 100644 --- a/content/browser/compositor/viz_process_transport_factory.cc +++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -37,7 +37,6 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/viz/public/cpp/gpu/context_provider_command_buffer.h" #include "ui/base/ui_base_features.h" -#include "ui/compositor/reflector.h" #if defined(OS_WIN) #include "ui/gfx/win/rendering_window_manager.h"
diff --git a/content/browser/frame_host/frame_tree_browsertest.cc b/content/browser/frame_host/frame_tree_browsertest.cc index e1c81ce..3feccf79 100644 --- a/content/browser/frame_host/frame_tree_browsertest.cc +++ b/content/browser/frame_host/frame_tree_browsertest.cc
@@ -763,13 +763,13 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Set the user activation bits. root->UpdateUserActivationState( blink::UserActivationUpdateType::kNotifyActivation); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); // Install a new same-site document to check the clearing of user activation @@ -777,7 +777,7 @@ GURL url(embedded_test_server()->GetURL("/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), url)); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); } @@ -1194,13 +1194,13 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Set the user activation bits. root->UpdateUserActivationState( blink::UserActivationUpdateType::kNotifyActivation); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); // Install a new cross-site document to check the clearing of user activation @@ -1209,7 +1209,7 @@ embedded_test_server()->GetURL("foo.com", "/title2.html")); EXPECT_TRUE(NavigateToURL(shell(), cross_site_url)); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); } @@ -1317,20 +1317,20 @@ FrameTreeNode* root = contents->GetFrameTree()->root(); FrameTreeNode* child1 = root->child_at(0); FrameTreeNode* child2 = root->child_at(1); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_FALSE(child1->HasBeenActivated()); + EXPECT_FALSE(child1->HasStickyUserActivation()); EXPECT_FALSE(child1->HasTransientUserActivation()); - EXPECT_FALSE(child2->HasBeenActivated()); + EXPECT_FALSE(child2->HasStickyUserActivation()); EXPECT_FALSE(child2->HasTransientUserActivation()); // Activate the root frame. EXPECT_TRUE(ExecuteScript(shell(), "")); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); - EXPECT_FALSE(child1->HasBeenActivated()); + EXPECT_FALSE(child1->HasStickyUserActivation()); EXPECT_FALSE(child1->HasTransientUserActivation()); - EXPECT_FALSE(child2->HasBeenActivated()); + EXPECT_FALSE(child2->HasStickyUserActivation()); EXPECT_FALSE(child2->HasTransientUserActivation()); // Post a message from the root frame to the child frame with @@ -1352,11 +1352,11 @@ if (actual_test_reply == "\"done-Hello\"") break; } - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_TRUE(child1->HasBeenActivated()); + EXPECT_TRUE(child1->HasStickyUserActivation()); EXPECT_TRUE(child1->HasTransientUserActivation()); - EXPECT_FALSE(child2->HasBeenActivated()); + EXPECT_FALSE(child2->HasStickyUserActivation()); EXPECT_FALSE(child2->HasTransientUserActivation()); // Post a message from one child to another child in a different origin with @@ -1376,11 +1376,11 @@ if (actual_test_reply == "\"done-Hey\"") break; } - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_FALSE(child1->HasBeenActivated()); + EXPECT_FALSE(child1->HasStickyUserActivation()); EXPECT_FALSE(child1->HasTransientUserActivation()); - EXPECT_TRUE(child2->HasBeenActivated()); + EXPECT_TRUE(child2->HasStickyUserActivation()); EXPECT_TRUE(child2->HasTransientUserActivation()); } @@ -1395,11 +1395,11 @@ FrameTreeNode* root = contents->GetFrameTree()->root(); FrameTreeNode* child1 = root->child_at(0); FrameTreeNode* child2 = child1->child_at(0); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_FALSE(child1->HasBeenActivated()); + EXPECT_FALSE(child1->HasStickyUserActivation()); EXPECT_FALSE(child1->HasTransientUserActivation()); - EXPECT_FALSE(child2->HasBeenActivated()); + EXPECT_FALSE(child2->HasStickyUserActivation()); EXPECT_FALSE(child2->HasTransientUserActivation()); // Activate the root frame and transfer the user activation state from root @@ -1421,11 +1421,11 @@ if (actual_test_reply == "\"done-Hello\"") break; } - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_TRUE(child1->HasBeenActivated()); + EXPECT_TRUE(child1->HasStickyUserActivation()); EXPECT_TRUE(child1->HasTransientUserActivation()); - EXPECT_FALSE(child2->HasBeenActivated()); + EXPECT_FALSE(child2->HasStickyUserActivation()); EXPECT_FALSE(child2->HasTransientUserActivation()); // Post a message from child1 to its child child2 in the same origin with @@ -1441,11 +1441,11 @@ if (actual_test_reply == "\"done-Hey\"") break; } - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); - EXPECT_FALSE(child1->HasBeenActivated()); + EXPECT_FALSE(child1->HasStickyUserActivation()); EXPECT_FALSE(child1->HasTransientUserActivation()); - EXPECT_TRUE(child2->HasBeenActivated()); + EXPECT_TRUE(child2->HasStickyUserActivation()); EXPECT_TRUE(child2->HasTransientUserActivation()); } #endif
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h index b5f142329..f657a80 100644 --- a/content/browser/frame_host/frame_tree_node.h +++ b/content/browser/frame_host/frame_tree_node.h
@@ -376,7 +376,7 @@ // Returns the sticky bit of the User Activation v2 state of the // |FrameTreeNode|. - bool HasBeenActivated() const { + bool HasStickyUserActivation() const { return user_activation_state_.HasBeenActive(); }
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index 93fab192..197ed434 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -8783,7 +8783,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -8838,7 +8838,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new cross-site document from the renderer with a user @@ -8892,7 +8892,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -8943,7 +8943,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9000,7 +9000,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9057,7 +9057,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9107,7 +9107,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( @@ -9227,7 +9227,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9272,7 +9272,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer. @@ -9320,7 +9320,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); GURL url(embedded_test_server()->GetURL("/title1.html")); @@ -9365,7 +9365,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9415,7 +9415,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9473,7 +9473,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9529,7 +9529,7 @@ ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Navigate to a new same-site document from the renderer without a user @@ -9575,7 +9575,7 @@ embedded_test_server()->GetURL("/frame_tree/page_with_one_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), skippable_url)); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Invoke pushstate from a subframe. @@ -9614,7 +9614,7 @@ // entries to be marked as non-skippable. root->UpdateUserActivationState( blink::UserActivationUpdateType::kNotifyActivation); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); EXPECT_FALSE(controller.GetEntryAtIndex(0)->should_skip_on_back_forward_ui()); EXPECT_FALSE(controller.GetEntryAtIndex(1)->should_skip_on_back_forward_ui()); @@ -9641,7 +9641,7 @@ embedded_test_server()->GetURL("/frame_tree/page_with_one_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), url_with_frames)); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); // Simulate user gesture in the main frame. Subframes creating entries without @@ -9649,7 +9649,7 @@ // skippable. root->UpdateUserActivationState( blink::UserActivationUpdateType::kNotifyActivation); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); // Invoke pushstate from a subframe. @@ -9693,7 +9693,7 @@ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) ->GetFrameTree() ->root(); - EXPECT_FALSE(root->HasBeenActivated()); + EXPECT_FALSE(root->HasStickyUserActivation()); EXPECT_FALSE(root->HasTransientUserActivation()); NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( @@ -9714,7 +9714,7 @@ script = "history.pushState('', '','" + a4_url.spec() + "');"; ASSERT_TRUE(ExecJs(shell()->web_contents(), script)); - EXPECT_TRUE(root->HasBeenActivated()); + EXPECT_TRUE(root->HasStickyUserActivation()); EXPECT_TRUE(root->HasTransientUserActivation()); // None of the entries should be skippable.
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc index fcf781d..374aebb 100644 --- a/content/browser/frame_host/navigator_impl.cc +++ b/content/browser/frame_host/navigator_impl.cc
@@ -191,7 +191,8 @@ // Save the activation status of the previous page here before it gets reset // in FrameTreeNode::ResetForNavigation. - bool previous_document_was_activated = frame_tree->root()->HasBeenActivated(); + bool previous_document_was_activated = + frame_tree->root()->HasStickyUserActivation(); // Navigating to a new location means a new, fresh set of http headers and/or // <meta> elements - we need to reset CSP and Feature Policy.
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index bcb2aa62..0cc2f9c 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -879,7 +879,15 @@ bool GpuDataManagerImplPrivate::UpdateActiveGpu(uint32_t vendor_id, uint32_t device_id) { // Heuristics for dual-GPU detection. +#if defined(OS_WIN) + // On Windows, "Microsoft Basic Render Driver" now shows up as a + // secondary GPU. + bool is_dual_gpu = gpu_info_.secondary_gpus.size() == 2; +#else bool is_dual_gpu = gpu_info_.secondary_gpus.size() == 1; +#endif + // TODO(kbr/zmo): on Windows, at least, it's now possible to have a + // system with both low-power and high-performance GPUs from AMD. const uint32_t kIntelID = 0x8086; bool saw_intel_gpu = false; bool saw_non_intel_gpu = false;
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 454d4a8..daf115a 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -730,7 +730,7 @@ *(gpu_info_val.get())); } -void GpuMessageHandler::OnGpuSwitched(gl::GpuPreference active_gpu_heuristic_) { +void GpuMessageHandler::OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) { // Currently, about:gpu page does not update GPU info after the GPU switch. // If there is something to be updated, the code should be added here. }
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index 0dbe164..76bd34c1 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -439,7 +439,6 @@ // Hide the LayerTreeHost and release its frame sink. host_->SetVisible(false); host_->ReleaseLayerTreeFrameSink(); - has_layer_tree_frame_sink_ = false; pending_frames_ = 0; // Notify CompositorDependenciesAndroid of visibility changes last, to @@ -484,6 +483,9 @@ frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kNo); GetHostFrameSinkManager()->SetFrameSinkDebugLabel(frame_sink_id_, "CompositorImpl"); + for (auto& frame_sink_id : pending_child_frame_sink_ids_) + AddChildFrameSink(frame_sink_id); + pending_child_frame_sink_ids_.clear(); } void CompositorImpl::SetWindowBounds(const gfx::Size& size) { @@ -547,11 +549,6 @@ void CompositorImpl::DidInitializeLayerTreeFrameSink() { layer_tree_frame_sink_request_pending_ = false; - has_layer_tree_frame_sink_ = true; - for (auto& frame_sink_id : pending_child_frame_sink_ids_) - AddChildFrameSink(frame_sink_id); - - pending_child_frame_sink_ids_.clear(); } void CompositorImpl::DidFailToInitializeLayerTreeFrameSink() { @@ -675,7 +672,6 @@ void CompositorImpl::DidLoseLayerTreeFrameSink() { TRACE_EVENT0("compositor", "CompositorImpl::DidLoseLayerTreeFrameSink"); - has_layer_tree_frame_sink_ = false; client_->DidSwapFrame(0); } @@ -711,11 +707,10 @@ } void CompositorImpl::AddChildFrameSink(const viz::FrameSinkId& frame_sink_id) { - if (has_layer_tree_frame_sink_) { + if (GetHostFrameSinkManager()->IsFrameSinkIdRegistered(frame_sink_id_)) { bool result = GetHostFrameSinkManager()->RegisterFrameSinkHierarchy( frame_sink_id_, frame_sink_id); - // TODO(samans): Delete this once https://crbug.com/1030618 is resolved. - CHECK(result); + DCHECK(result); } else { pending_child_frame_sink_ids_.insert(frame_sink_id); }
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h index 83e3fcd..510ca6b 100644 --- a/content/browser/renderer_host/compositor_impl_android.h +++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -247,7 +247,6 @@ bool layer_tree_frame_sink_request_pending_; gpu::Capabilities gpu_capabilities_; - bool has_layer_tree_frame_sink_ = false; std::unordered_set<viz::FrameSinkId, viz::FrameSinkIdHash> pending_child_frame_sink_ids_; bool has_submitted_frame_since_became_visible_ = false;
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 0a30e988..ec216c3 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -556,19 +556,17 @@ // and re-layout in the same way since children might be in a different origin. void LayoutNonRecursiveForTestingViewportIntersection( WebContents* web_contents) { - static const char* script = R"( - function relayoutNonRecursiveForTestingViewportIntersection() { - var width = window.innerWidth; - var height = window.innerHeight * 0.75; - for (var i = 0; i < window.frames.length; i++) { - child = document.getElementById("child-" + i); - child.width = width; - child.height = height; - } + static const char kRafScript[] = R"( + let width = window.innerWidth; + let height = window.innerHeight * 0.75; + for (let i = 0; i < window.frames.length; i++) { + let child = document.getElementById("child-" + i); + child.width = width; + child.height = height; } - relayoutNonRecursiveForTestingViewportIntersection(); )"; - EXPECT_TRUE(ExecuteScript(web_contents, script)); + ASSERT_TRUE( + EvalJsAfterLifecycleUpdate(web_contents, kRafScript, "").error.empty()); } void GenerateTapDownGesture(RenderWidgetHost* rwh) { @@ -12136,48 +12134,43 @@ EXPECT_TRUE(NavigateToURL(shell(), main_url)); FrameTreeNode* root = web_contents()->GetFrameTree()->root(); - scoped_refptr<UpdateViewportIntersectionMessageFilter> root_filter = - new UpdateViewportIntersectionMessageFilter(); - root->current_frame_host()->GetProcess()->AddFilter(root_filter.get()); - - scoped_refptr<UpdateViewportIntersectionMessageFilter> child0_filter = - new UpdateViewportIntersectionMessageFilter(); - root->child_at(0)->current_frame_host()->GetProcess()->AddFilter( - child0_filter.get()); - scoped_refptr<UpdateViewportIntersectionMessageFilter> child2_filter = new UpdateViewportIntersectionMessageFilter(); root->child_at(2)->current_frame_host()->GetProcess()->AddFilter( child2_filter.get()); - // Each immediate child is sized to 100% width and 75% height. + // Force lifecycle update in root and child2 to make sure child2 has sent + // viewport intersection into to grand child before child2 becomes throttled. + ASSERT_TRUE(EvalJsAfterLifecycleUpdate(root->current_frame_host(), "", "") + .error.empty()); + ASSERT_TRUE(EvalJsAfterLifecycleUpdate( + root->child_at(2)->current_frame_host(), "", "") + .error.empty()); + child2_filter->Clear(); + LayoutNonRecursiveForTestingViewportIntersection(shell()->web_contents()); - while (true) { - base::RunLoop run_loop; - root_filter->set_run_loop(&run_loop); - child0_filter->set_run_loop(&run_loop); - child2_filter->set_run_loop(&run_loop); - run_loop.Run(); - root_filter->set_run_loop(nullptr); - child0_filter->set_run_loop(nullptr); - child2_filter->set_run_loop(nullptr); - - if ( // Root should always intersect. - CheckIntersectsViewport(true, root) && - // Child 0 should be entirely in viewport. - CheckIntersectsViewport(true, root->child_at(0)) && - // Grand child should match parent. - CheckIntersectsViewport(true, root->child_at(0)->child_at(0)) && - // Child 1 should be partially in viewport. - CheckIntersectsViewport(true, root->child_at(1)) && - // Child 2 should be not be in viewport. - CheckIntersectsViewport(false, root->child_at(2)) && - // Grand child should match parent. - CheckIntersectsViewport(false, root->child_at(2)->child_at(0))) { - break; - } - } + // Root should always intersect. + EXPECT_TRUE(CheckIntersectsViewport(true, root)); + // Child 0 should be entirely in viewport. + EXPECT_TRUE(CheckIntersectsViewport(true, root->child_at(0))); + // Make sure child0 has has a chance to propagate viewport intersection to + // grand child. + ASSERT_TRUE(EvalJsAfterLifecycleUpdate( + root->child_at(0)->current_frame_host(), "", "") + .error.empty()); + // Grand child should match parent. + EXPECT_TRUE(CheckIntersectsViewport(true, root->child_at(0)->child_at(0))); + // Child 1 should be partially in viewport. + EXPECT_TRUE(CheckIntersectsViewport(true, root->child_at(1))); + // Child 2 should be not be in viewport. + EXPECT_TRUE(CheckIntersectsViewport(false, root->child_at(2))); + // Can't use EvalJsAfterLifecycleUpdate on child2, because it's + // render-throttled. But it should still have propagated state down to the + // grandchild. + child2_filter->Wait(); + // Grand child should match parent. + EXPECT_TRUE(CheckIntersectsViewport(false, root->child_at(2)->child_at(0))); } IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, @@ -12193,43 +12186,33 @@ root->child_at(0)->current_frame_host()->GetProcess()->AddFilter( filter.get()); - // Force animation frames in `a` and `b` to ensure that viewport intersection - // for initial layout state has been propagated. The rAF+setTimeout construct - // guarantees that the IPC's have been sent before EvalJs returns. The layout - // of `a` will not change again, so we can read back layout info now. The - // layout of `b` will change, so we don't read back the layout yet. + // Use EvalJsAfterLifecycleUpdate to force animation frames in `a` and `b` to + // ensure that the viewport intersection for initial layout state has been + // propagated. The layout of `a` will not change again, so we can read back + // its layout info after the animation frame. The layout of `b` will change, + // so we don't read back its layout yet. std::string script(R"( - new Promise((resolve, reject) => { - requestAnimationFrame(() => { setTimeout(() => { - let iframe = document.querySelector("iframe"); - resolve([iframe.offsetLeft, iframe.offsetTop]); - }) }) - }); + let iframe = document.querySelector("iframe"); + [iframe.offsetLeft, iframe.offsetTop]; )"); - EvalJsResult iframe_b_result = EvalJs(root->current_frame_host(), script); + EvalJsResult iframe_b_result = + EvalJsAfterLifecycleUpdate(root->current_frame_host(), "", script); base::ListValue iframe_b_offset = iframe_b_result.ExtractList(); int iframe_b_offset_left = iframe_b_offset.GetList()[0].GetInt(); int iframe_b_offset_top = iframe_b_offset.GetList()[1].GetInt(); - ASSERT_TRUE(ExecJs(root->child_at(0)->current_frame_host(), script)); - // Make sure a new IPC is sent after dirty-ing layout. filter->Clear(); // Dirty layout in `b` to generate a new IPC to `c`. This will be the final // layout state for `b`, so read back layout info here. - script = R"( + std::string raf_script(R"( let iframe = document.querySelector("iframe"); let margin = getComputedStyle(iframe).marginTop.replace("px", ""); iframe.style.margin = String(parseInt(margin) + 1) + "px"; - new Promise((resolve, reject) => { - requestAnimationFrame(() => { setTimeout(() => { - resolve([iframe.offsetLeft, iframe.offsetTop]); - }) }) - }); - )"; - EvalJsResult iframe_c_result = - EvalJs(root->child_at(0)->current_frame_host(), script); + )"); + EvalJsResult iframe_c_result = EvalJsAfterLifecycleUpdate( + root->child_at(0)->current_frame_host(), raf_script, script); base::ListValue iframe_c_offset = iframe_c_result.ExtractList(); int iframe_c_offset_left = iframe_c_offset.GetList()[0].GetInt(); int iframe_c_offset_top = iframe_c_offset.GetList()[1].GetInt(); @@ -12256,41 +12239,25 @@ "a.com", "/cross_site_iframe_factory.html?a(b,c,a,b)")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); - FrameTreeNode* root = web_contents()->GetFrameTree()->root(); - scoped_refptr<UpdateViewportIntersectionMessageFilter> filter = - new UpdateViewportIntersectionMessageFilter(); - root->current_frame_host()->GetProcess()->AddFilter(filter.get()); - // Each immediate child is sized to 100% width and 75% height. LayoutNonRecursiveForTestingViewportIntersection(shell()->web_contents()); - while (true) { - filter->Wait(); + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); - bool pass = true; - { - // Child 2 does not intersect, but shares widget with the main frame. - FrameTreeNode* node = root->child_at(2); - RenderProcessHost::Priority priority = - node->current_frame_host()->GetRenderWidgetHost()->GetPriority(); - pass = pass && priority.intersects_viewport; - pass = pass && - node->current_frame_host()->GetProcess()->GetIntersectsViewport(); - } + // Child 2 does not intersect, but shares widget with the main frame. + FrameTreeNode* node = root->child_at(2); + RenderProcessHost::Priority priority = + node->current_frame_host()->GetRenderWidgetHost()->GetPriority(); + EXPECT_TRUE(priority.intersects_viewport); + EXPECT_TRUE( + node->current_frame_host()->GetProcess()->GetIntersectsViewport()); - { - // Child 3 does not intersect, but shares a process with child 0. - FrameTreeNode* node = root->child_at(3); - RenderProcessHost::Priority priority = - node->current_frame_host()->GetRenderWidgetHost()->GetPriority(); - pass = pass && !priority.intersects_viewport; - pass = pass && - node->current_frame_host()->GetProcess()->GetIntersectsViewport(); - } - - if (pass) - break; - } + // Child 3 does not intersect, but shares a process with child 0. + node = root->child_at(3); + priority = node->current_frame_host()->GetRenderWidgetHost()->GetPriority(); + EXPECT_FALSE(priority.intersects_viewport); + EXPECT_TRUE( + node->current_frame_host()->GetProcess()->GetIntersectsViewport()); } // Check that when a postMessage is called on a remote frame, it waits for the @@ -12592,16 +12559,8 @@ // Test to verify that viewport intersection is propagated to nested OOPIFs // even when a parent OOPIF has been throttled. -// TODO(crbug.com/869758) The test is flaky on android and Linux. -#if defined(OS_ANDROID) || defined(OS_LINUX) -#define MAYBE_NestedFrameViewportIntersectionUpdated \ - DISABLED_NestedFrameViewportIntersectionUpdated -#else -#define MAYBE_NestedFrameViewportIntersectionUpdated \ - NestedFrameViewportIntersectionUpdated -#endif IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, - MAYBE_NestedFrameViewportIntersectionUpdated) { + NestedFrameViewportIntersectionUpdated) { GURL main_url(embedded_test_server()->GetURL( "foo.com", "/frame_tree/scrollable_page_with_positioned_frame.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -12621,25 +12580,30 @@ " C = http://baz.com/", DepictFrameTree(root)); + // This will intercept messages sent from B to C, describing C's viewport + // intersection. scoped_refptr<UpdateViewportIntersectionMessageFilter> filter = new UpdateViewportIntersectionMessageFilter(); child_node->current_frame_host()->GetProcess()->AddFilter(filter.get()); + // Run requestAnimationFrame in A and B to make sure initial layout has + // completed and initial IPCs sent. + ASSERT_TRUE(EvalJsAfterLifecycleUpdate(root->current_frame_host(), "", "") + .error.empty()); + ASSERT_TRUE( + EvalJsAfterLifecycleUpdate(child_node->current_frame_host(), "", "") + .error.empty()); + filter->Clear(); + // Scroll the child frame out of view, causing it to become throttled. - EXPECT_TRUE(ExecuteScript(root, "window.scrollTo(0, 5000);")); - while (true) { - filter->Wait(); - if (filter->GetIntersectionState().viewport_intersection.IsEmpty()) - break; - } + ASSERT_TRUE(ExecJs(root->current_frame_host(), "window.scrollTo(0, 5000)")); + filter->Wait(); + EXPECT_TRUE(filter->GetIntersectionState().viewport_intersection.IsEmpty()); // Scroll the frame back into view. - EXPECT_TRUE(ExecuteScript(root, "window.scrollTo(0, 0);")); - while (true) { - filter->Wait(); - if (!filter->GetIntersectionState().viewport_intersection.IsEmpty()) - break; - } + ASSERT_TRUE(ExecJs(root->current_frame_host(), "window.scrollTo(0, 0)")); + filter->Wait(); + EXPECT_FALSE(filter->GetIntersectionState().viewport_intersection.IsEmpty()); } namespace {
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index e0056c78..835505c1 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -1517,6 +1517,88 @@ return annotated_error.str(); } +EvalJsResult EvalRunnerScript(const ToRenderFrameHost& execution_target, + const std::string& script, + int options, + int32_t world_id, + const std::string& token) { + const char* kSourceURL = "__const_std::string&_script__"; + bool use_automatic_reply = !(options & EXECUTE_SCRIPT_USE_MANUAL_REPLY); + bool user_gesture = !(options & EXECUTE_SCRIPT_NO_USER_GESTURE); + std::ostringstream error_stream; + std::unique_ptr<base::Value> response; + if (!execution_target.render_frame_host()->IsRenderFrameLive()) { + error_stream << "Error: EvalJs won't work on an already-crashed frame."; + } else if (!ExecuteScriptHelper(execution_target.render_frame_host(), script, + user_gesture, world_id, &response)) { + error_stream << "Internal Error: ExecuteScriptHelper failed"; + } else if (!response) { + error_stream << "Internal Error: no value"; + } else { + bool is_reply_from_script = response->is_list() && + response->GetList().size() == 2 && + response->GetList()[0].is_string() && + response->GetList()[0].GetString() == token; + + bool is_error = is_reply_from_script && response->GetList()[1].is_string(); + bool is_automatic_success_reply = + is_reply_from_script && response->GetList()[1].is_list() && + response->GetList()[1].GetList().size() == 1; + + if (is_error) { + // This is a response generated by the error handler in our runner + // script. This occurs when the script throws an exception, or when + // eval throws a SyntaxError. + // + // Parse the stack trace here, and interleave lines of source code from + // |script| to aid debugging. + std::string error_text = response->GetList()[1].GetString(); + + if (base::StartsWith(error_text, + "a JavaScript error:\nEvalError: Refused", + base::CompareCase::SENSITIVE)) { + error_text = + "EvalJs encountered an EvalError, because eval() is blocked by the " + "document's CSP on this page. To test content that is protected by " + "CSP, consider using EvalJs with an isolated world. Details: " + + error_text; + } + + CHECK(!error_text.empty()); + error_stream << AnnotateAndAdjustJsStackTraces(error_text, kSourceURL, + script, 0); + } else if (!use_automatic_reply) { + // When |script| itself calls domAutomationController.send() on success, + // |response| could be anything; so there's no more checking we can do: + // return |response| as success, with an empty error. + return EvalJsResult(std::move(*response), std::string()); + } else if (is_automatic_success_reply) { + // Got a response from the runner script that indicates success (of the + // form [token, [completion_value]]. Return the completion value, with an + // empty error. + return EvalJsResult(std::move(response->GetList()[1].GetList()[0]), + std::string()); + } else { + // The response was not well-formed (it failed the token match), so it's + // not from our runner script. Fail with an explanation of the raw + // message. This allows us to reject other calls + // domAutomationController.send(). + error_stream + << "Internal Error: expected a 2-element list of the form " + << "['" << token << "', [result]]; but got instead: " << *response + << " ... This is potentially because a script tried to call " + "domAutomationController.send itself -- that is only allowed " + "when using EvalJsWithManualReply(). When using EvalJs(), result " + "values are just the result of calling eval() on the script -- " + "the completion value is the value of the last executed " + "statement. When using ExecJs(), there is no result value."; + } + } + + // Something went wrong. Return an empty value and a non-empty error. + return EvalJsResult(base::Value(), error_stream.str()); +} + } // namespace testing::AssertionResult ExecJs(const ToRenderFrameHost& execution_target, @@ -1603,81 +1685,8 @@ //# sourceURL=EvalJs-runner.js)", modified_script, resolve_promises, use_automatic_reply, token); - bool user_gesture = !(options & EXECUTE_SCRIPT_NO_USER_GESTURE); - std::ostringstream error_stream; - std::unique_ptr<base::Value> response; - if (!execution_target.render_frame_host()->IsRenderFrameLive()) { - error_stream << "Error: EvalJs won't work on an already-crashed frame."; - } else if (!ExecuteScriptHelper(execution_target.render_frame_host(), - runner_script, user_gesture, world_id, - &response)) { - error_stream << "Internal Error: ExecuteScriptHelper failed"; - } else if (!response) { - error_stream << "Internal Error: no value"; - } else { - bool is_reply_from_runner_script = - response->is_list() && response->GetList().size() == 2 && - response->GetList()[0].is_string() && - response->GetList()[0].GetString() == token; - - bool is_error = - is_reply_from_runner_script && response->GetList()[1].is_string(); - bool is_automatic_success_reply = - is_reply_from_runner_script && response->GetList()[1].is_list() && - response->GetList()[1].GetList().size() == 1; - - if (is_error) { - // This is a response generated by the error handler in our runner - // script. This occurs when the script throws an exception, or when - // eval throws a SyntaxError. - // - // Parse the stack trace here, and interleave lines of source code from - // |script| to aid debugging. - std::string error_text = response->GetList()[1].GetString(); - - if (base::StartsWith(error_text, - "a JavaScript error:\nEvalError: Refused", - base::CompareCase::SENSITIVE)) { - error_text = - "EvalJs encountered an EvalError, because eval() is blocked by the " - "document's CSP on this page. To test content that is protected by " - "CSP, consider using EvalJs with an isolated world. Details: " + - error_text; - } - - CHECK(!error_text.empty()); - error_stream << AnnotateAndAdjustJsStackTraces(error_text, kSourceURL, - script, 0); - } else if (!use_automatic_reply) { - // When |script| itself calls domAutomationController.send() on success, - // |response| could be anything; so there's no more checking we can do: - // return |response| as success, with an empty error. - return EvalJsResult(std::move(*response), std::string()); - } else if (is_automatic_success_reply) { - // Got a response from the runner script that indicates success (of the - // form [token, [completion_value]]. Return the completion value, with an - // empty error. - return EvalJsResult(std::move(response->GetList()[1].GetList()[0]), - std::string()); - } else { - // The response was not well-formed (it failed the token match), so it's - // not from our runner script. Fail with an explanation of the raw - // message. This allows us to reject other calls - // domAutomationController.send(). - error_stream - << "Internal Error: expected a 2-element list of the form " - << "['" << token << "', [result]]; but got instead: " << *response - << " ... This is potentially because a script tried to call " - "domAutomationController.send itself -- that is only allowed " - "when using EvalJsWithManualReply(). When using EvalJs(), result " - "values are just the result of calling eval() on the script -- " - "the completion value is the value of the last executed " - "statement. When using ExecJs(), there is no result value."; - } - } - - // Something went wrong. Return an empty value and a non-empty error. - return EvalJsResult(base::Value(), error_stream.str()); + return EvalRunnerScript(execution_target, runner_script, options, world_id, + token); } EvalJsResult EvalJsWithManualReply(const ToRenderFrameHost& execution_target, @@ -1688,6 +1697,49 @@ options | EXECUTE_SCRIPT_USE_MANUAL_REPLY, world_id); } +EvalJsResult EvalJsAfterLifecycleUpdate( + const ToRenderFrameHost& execution_target, + const std::string& raf_script, + const std::string& script, + int options, + int32_t world_id) { + bool use_automatic_reply = !(options & EXECUTE_SCRIPT_USE_MANUAL_REPLY); + bool resolve_promises = !(options & EXECUTE_SCRIPT_NO_RESOLVE_PROMISES); + std::string token = "EvalJs-" + base::GenerateGUID(); + const char* kSourceURL = "__const_std::string&_script__"; + std::string modified_raf_script; + if (raf_script.length()) { + modified_raf_script = base::StringPrintf("%s;\n//# sourceURL=%s", + raf_script.c_str(), kSourceURL); + } + std::string modified_script = + base::StringPrintf("%s;\n//# sourceURL=%s", script.c_str(), kSourceURL); + + // This runner_script is very similar to that used by EvalJs, except that + // this one delays running the argument script until just before + // (|raf_script|) and after (|script|) a rendering update. + std::string runner_script = JsReplace( + R"(Promise.all([$1, $2]) + .then(scripts => new Promise((resolve, reject) => { + requestAnimationFrame(() => { + window.eval(scripts[0]); + setTimeout(() => { + resolve([window.eval(scripts[1])]) + }) }) }) ) + .then((result) => $3 ? Promise.all(result) : result ) + .then((result) => $4 ? result : Promise.reject(), + (error) => 'a JavaScript error:' + + (error && error.stack ? '\n' + error.stack + : ' "' + error + '"')) + .then((reply) => window.domAutomationController.send([$5, reply])); + //# sourceURL=EvalJs-runner.js)", + modified_raf_script, modified_script, resolve_promises, + use_automatic_reply, token); + + return EvalRunnerScript(execution_target, runner_script, options, world_id, + token); +} + namespace { void AddToSetIfFrameMatchesPredicate( std::set<RenderFrameHost*>* frame_set,
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 6726c76..4b4ada81 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -781,6 +781,18 @@ int32_t world_id = ISOLATED_WORLD_ID_GLOBAL) WARN_UNUSED_RESULT; +// Like EvalJs(), but runs |raf_script| inside a requestAnimationFrame handler, +// and runs |script| after the rendering update has completed. By the time +// this method returns, any IPCs sent from the renderer process to the browser +// process during the lifecycle update should already have been received and +// processed by the browser. +EvalJsResult EvalJsAfterLifecycleUpdate( + const ToRenderFrameHost& execution_target, + const std::string& raf_script, + const std::string& script, + int options = EXECUTE_SCRIPT_DEFAULT_OPTIONS, + int32_t world_id = ISOLATED_WORLD_ID_GLOBAL) WARN_UNUSED_RESULT; + // Run a script exactly the same as EvalJs(), but ignore the resulting value. // // Returns AssertionSuccess() if |script| ran successfully, and @@ -1053,7 +1065,7 @@ RenderProcessHostWatcher(RenderProcessHost* render_process_host, WatchType type); - // Waits for the render process that contains the specified web contents. + // Waits for the renderer process that contains the specified web contents. RenderProcessHostWatcher(WebContents* web_contents, WatchType type); ~RenderProcessHostWatcher() override;
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc index b0e3160..4ddc89e 100644 --- a/content/renderer/accessibility/render_accessibility_impl.cc +++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -36,7 +36,6 @@ #include "third_party/blink/public/web/web_input_element.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_settings.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/accessibility/ax_enum_util.h"
diff --git a/content/renderer/media/media_permission_dispatcher.cc b/content/renderer/media/media_permission_dispatcher.cc index cc75adba..f4757ac 100644 --- a/content/renderer/media/media_permission_dispatcher.cc +++ b/content/renderer/media/media_permission_dispatcher.cc
@@ -9,7 +9,7 @@ #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "media/base/bind_to_current_loop.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "url/gurl.h" namespace { @@ -106,8 +106,7 @@ GetPermissionService()->RequestPermission( MediaPermissionTypeToPermissionDescriptor(type), - blink::WebUserGestureIndicator::IsProcessingUserGesture( - render_frame_->GetWebFrame()), + render_frame_->GetWebFrame()->HasTransientUserActivation(), base::BindOnce(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_, request_id)); }
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc index 2e1635ee..cbeb280 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.cc +++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -18,7 +18,7 @@ #include "content/public/renderer/render_thread.h" #include "third_party/blink/public/platform/web_fullscreen_video_status.h" #include "third_party/blink/public/platform/web_size.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "ui/gfx/geometry/size.h" #if defined(OS_ANDROID) @@ -274,13 +274,10 @@ Observer* observer = id_map_.Lookup(player_id); if (observer) { - if (triggered_by_user) { + if (triggered_by_user && render_frame()) { // TODO(avayvod): remove when default play/pause is handled via // the MediaSession code path. - std::unique_ptr<blink::WebScopedUserGesture> gesture( - render_frame() - ? new blink::WebScopedUserGesture(render_frame()->GetWebFrame()) - : nullptr); + render_frame()->GetWebFrame()->NotifyUserActivation(); } observer->OnPause(); } @@ -293,10 +290,8 @@ if (observer) { // TODO(avayvod): remove when default play/pause is handled via // the MediaSession code path. - std::unique_ptr<blink::WebScopedUserGesture> gesture( - render_frame() - ? new blink::WebScopedUserGesture(render_frame()->GetWebFrame()) - : nullptr); + if (render_frame()) + render_frame()->GetWebFrame()->NotifyUserActivation(); observer->OnPlay(); } }
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 9efd2e5b..33dbeb24 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -118,7 +118,6 @@ #include "third_party/blink/public/web/web_print_preset_options.h" #include "third_party/blink/public/web/web_print_scaling_option.h" #include "third_party/blink/public/web/web_script_source.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/khronos/GLES2/gl2.h" #include "ui/events/blink/blink_event_util.h" @@ -181,7 +180,6 @@ using blink::WebAssociatedURLLoaderClient; using blink::WebURLRequest; using blink::WebURLResponse; -using blink::WebUserGestureIndicator; using blink::WebView; using blink::WebWidget; @@ -2275,8 +2273,7 @@ } bool PepperPluginInstanceImpl::HasTransientUserActivation() const { - return WebUserGestureIndicator::IsProcessingUserGesture( - render_frame_->GetWebFrame()); + return render_frame_->GetWebFrame()->HasTransientUserActivation(); } void PepperPluginInstanceImpl::OnLockMouseACK(bool succeeded) {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 087234b..cc106fa 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -214,13 +214,11 @@ #include "third_party/blink/public/web/web_plugin_document.h" #include "third_party/blink/public/web/web_plugin_params.h" #include "third_party/blink/public/web/web_range.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" #include "third_party/blink/public/web/web_script_source.h" #include "third_party/blink/public/web/web_searchable_form_data.h" #include "third_party/blink/public/web/web_security_policy.h" #include "third_party/blink/public/web/web_serialized_script_value.h" #include "third_party/blink/public/web/web_settings.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" #include "ui/events/base_event_utils.h" @@ -296,7 +294,6 @@ using blink::WebURLError; using blink::WebURLRequest; using blink::WebURLResponse; -using blink::WebUserGestureIndicator; using blink::WebVector; using blink::WebView; using blink::mojom::SelectionMenuBehavior; @@ -2558,9 +2555,8 @@ // A bunch of tests expect to run code in the context of a user gesture, which // can grant additional privileges (e.g. the ability to create popups). - base::Optional<blink::WebScopedUserGesture> gesture; if (has_user_gesture) - gesture.emplace(frame_); + frame_->NotifyUserActivation(); v8::HandleScope handle_scope(blink::MainThreadIsolate()); v8::Local<v8::Value> result; @@ -2856,7 +2852,7 @@ const base::string16& default_value, base::string16* result) { int32_t message_length = static_cast<int32_t>(message.length()); - if (WebUserGestureIndicator::ProcessedUserGestureSinceLoad(frame_)) { + if (frame_->HasStickyUserActivation()) { UMA_HISTOGRAM_COUNTS_1M("JSDialogs.CharacterCount.UserGestureSinceLoad", message_length); } else { @@ -3119,7 +3115,7 @@ // This is always initiated from browser side (which should require the user // interacting with ui) which suffices for a user gesture even though there // will have been no input to the frame at this point. - blink::WebScopedUserGesture gesture(frame_); + frame_->NotifyUserActivation(); video_element.RequestFullscreen(); } @@ -5041,8 +5037,7 @@ // don't register this id on the browser side, since the download manager // expects to find a RenderViewHost based off the id. request.SetRequestorID(render_view_->GetRoutingID()); - request.SetHasUserGesture( - WebUserGestureIndicator::IsProcessingUserGesture(frame_)); + request.SetHasUserGesture(frame_->HasTransientUserActivation()); if (!render_view_->renderer_preferences_.enable_referrers) { request.SetReferrerString(WebString()); @@ -6256,7 +6251,8 @@ if (external_popup_menu_ == NULL) return; - blink::WebScopedUserGesture gesture(frame_); + if (frame_) + frame_->NotifyUserActivation(); // We need to reset |external_popup_menu_| before calling DidSelectItem(), // which might delete |this|. // See ExternalPopupMenuRemoveTest.RemoveFrameOnChange @@ -6275,7 +6271,8 @@ if (!external_popup_menu_) return; - blink::WebScopedUserGesture gesture(frame_); + if (frame_) + frame_->NotifyUserActivation(); // We need to reset |external_popup_menu_| before calling DidSelectItems(), // which might delete |this|. // See ExternalPopupMenuRemoveTest.RemoveFrameOnChange @@ -6319,7 +6316,7 @@ policy == blink::kWebNavigationPolicyNewForegroundTab || policy == blink::kWebNavigationPolicyNewWindow || policy == blink::kWebNavigationPolicyNewPopup) { - WebUserGestureIndicator::ConsumeUserGesture(frame_); + frame_->ConsumeTransientUserActivation(); } params.href_translate = info->href_translate.Latin1();
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index ed402242..814c6b06 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -46,7 +46,6 @@ #include "third_party/blink/public/platform/web_resource_timing_info.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/gfx/geometry/size_conversions.h"
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 3eb8fe9..a75e7d9 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -143,7 +143,6 @@ #include "third_party/blink/public/web/web_searchable_form_data.h" #include "third_party/blink/public/web/web_security_policy.h" #include "third_party/blink/public/web/web_settings.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_window_features.h" #include "third_party/icu/source/common/unicode/uchar.h" @@ -216,7 +215,6 @@ using blink::WebURLError; using blink::WebURLRequest; using blink::WebURLResponse; -using blink::WebUserGestureIndicator; using blink::WebVector; using blink::WebView; using blink::WebWidget; @@ -1355,8 +1353,8 @@ // The browser allowed creation of a new window and consumed the user // activation. - bool was_consumed = WebUserGestureIndicator::ConsumeUserGesture( - creator, blink::UserActivationUpdateSource::kBrowser); + bool was_consumed = creator->ConsumeTransientUserActivation( + blink::UserActivationUpdateSource::kBrowser); // While this view may be a background extension page, it can spawn a visible // render view. So we just assume that the new one is not another background @@ -2037,7 +2035,7 @@ // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed // we won't have to test for user gesture anymore and we can // move that code back to render_widget.cc - if (WebUserGestureIndicator::IsProcessingUserGesture(calling_frame) && + if (calling_frame && calling_frame->HasTransientUserActivation() && !RenderThreadImpl::current()->web_test_mode()) { Send(new ViewHostMsg_Focus(GetRoutingID()));
diff --git a/content/renderer/render_widget_mouse_lock_dispatcher.cc b/content/renderer/render_widget_mouse_lock_dispatcher.cc index 1c774fb..af673bb 100644 --- a/content/renderer/render_widget_mouse_lock_dispatcher.cc +++ b/content/renderer/render_widget_mouse_lock_dispatcher.cc
@@ -8,7 +8,7 @@ #include "content/renderer/render_view_impl.h" #include "ipc/ipc_message.h" #include "third_party/blink/public/web/web_frame.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" @@ -23,11 +23,11 @@ void RenderWidgetMouseLockDispatcher::SendLockMouseRequest( blink::WebLocalFrame* requester_frame, bool request_unadjusted_movement) { - bool user_gesture = - blink::WebUserGestureIndicator::IsProcessingUserGesture(requester_frame); - render_widget_->Send( - new WidgetHostMsg_LockMouse(render_widget_->routing_id(), user_gesture, - false, request_unadjusted_movement)); + bool has_transient_user_activation = + requester_frame ? requester_frame->HasTransientUserActivation() : false; + render_widget_->Send(new WidgetHostMsg_LockMouse( + render_widget_->routing_id(), has_transient_user_activation, false, + request_unadjusted_movement)); } void RenderWidgetMouseLockDispatcher::SendUnlockMouseRequest() {
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc index a020b6d..059911a 100644 --- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc +++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -77,6 +77,9 @@ void ReadSideData(ReadSideDataCallback callback) override { std::move(callback).Run(side_data_); } + void CaptureSnapshot(CaptureSnapshotCallback callback) override { + std::move(callback).Run(body_.size(), base::nullopt); + } void GetInternalUUID(GetInternalUUIDCallback callback) override { NOTREACHED(); }
diff --git a/content/shell/test_runner/event_sender.cc b/content/shell/test_runner/event_sender.cc index 3af14150..e05faee 100644 --- a/content/shell/test_runner/event_sender.cc +++ b/content/shell/test_runner/event_sender.cc
@@ -47,7 +47,6 @@ #include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_page_popup.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/events/blink/blink_event_util.h" #include "ui/events/keycodes/dom/keycode_converter.h" @@ -2231,8 +2230,7 @@ } void EventSender::ConsumeUserActivation() { - blink::WebUserGestureIndicator::ConsumeUserGesture( - view()->MainFrame()->ToWebLocalFrame()); + view()->MainFrame()->ToWebLocalFrame()->ConsumeTransientUserActivation(); } base::TimeTicks EventSender::GetCurrentEventTime() const {
diff --git a/content/shell/test_runner/test_plugin.cc b/content/shell/test_runner/test_plugin.cc index 79258a58..e26697fa 100644 --- a/content/shell/test_runner/test_plugin.cc +++ b/content/shell/test_runner/test_plugin.cc
@@ -34,8 +34,8 @@ #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/web/blink.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_plugin_params.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" @@ -583,11 +583,10 @@ PrintEventDetails(delegate_, event); if (print_user_gesture_status_) { - bool has_user_gesture = - blink::WebUserGestureIndicator::IsProcessingUserGesture( - web_local_frame_); + bool has_transient_user_activation = + web_local_frame_->HasTransientUserActivation(); delegate_->PrintMessage(std::string("* ") + - (has_user_gesture ? "" : "not ") + + (has_transient_user_activation ? "" : "not ") + "handling user gesture\n"); }
diff --git a/content/shell/test_runner/web_frame_test_client.cc b/content/shell/test_runner/web_frame_test_client.cc index 21367dd..383816e 100644 --- a/content/shell/test_runner/web_frame_test_client.cc +++ b/content/shell/test_runner/web_frame_test_client.cc
@@ -34,7 +34,6 @@ #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_navigation_policy.h" #include "third_party/blink/public/web/web_plugin_params.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "ui/accessibility/ax_enums.mojom.h" #include "url/gurl.h"
diff --git a/content/shell/test_runner/web_frame_test_proxy.cc b/content/shell/test_runner/web_frame_test_proxy.cc index 9c1b70f4..1fdf77c 100644 --- a/content/shell/test_runner/web_frame_test_proxy.cc +++ b/content/shell/test_runner/web_frame_test_proxy.cc
@@ -11,7 +11,7 @@ #include "content/shell/test_runner/web_test_delegate.h" #include "content/shell/test_runner/web_test_interfaces.h" #include "content/shell/test_runner/web_view_test_proxy.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" +#include "third_party/blink/public/web/web_local_frame.h" namespace test_runner { @@ -20,8 +20,7 @@ void PrintFrameUserGestureStatus(WebTestDelegate* delegate, blink::WebLocalFrame* frame, const char* msg) { - bool is_user_gesture = - blink::WebUserGestureIndicator::IsProcessingUserGesture(frame); + bool is_user_gesture = frame->HasTransientUserActivation(); delegate->PrintMessage(std::string("Frame with user gesture \"") + (is_user_gesture ? "true" : "false") + "\"" + msg); }
diff --git a/content/test/data/accessibility/html/ins-expected-android.txt b/content/test/data/accessibility/html/ins-expected-android.txt index f23842a..a9bb3ad18 100644 --- a/content/test/data/accessibility/html/ins-expected-android.txt +++ b/content/test/data/accessibility/html/ins-expected-android.txt
@@ -1,3 +1,7 @@ -#<skip -- crbug.com/413531> android.webkit.WebView focusable focused scrollable -++android.view.View clickable name='My favorite browser isABCChrome!' +++android.view.View +++++android.view.View name='My favorite browser is ' +++++android.view.View role_description='deletion' name='ABC' +++++android.view.View name=' ' +++++android.view.View role_description='insertion' name='Chrome' +++++android.view.View name='!'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-blink.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-blink.txt new file mode 100644 index 0000000..8957720 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-blink.txt
@@ -0,0 +1,22 @@ +rootWebArea +++genericContainer ignored +++++list setSize=8 +++++++listItem hierarchicalLevel=1 setSize=-1 posInSet=5 +++++++++staticText name='Level 1, item 5 of set size unknown' +++++++++++inlineTextBox name='Level 1, item 5 of set size unknown' +++++++listItem hierarchicalLevel=1 setSize=-1 posInSet=6 +++++++++staticText name='Level 1, item 6 of set size unknown' +++++++++++inlineTextBox name='Level 1, item 6 of set size unknown' +++++++++list setSize=7 +++++++++++listItem hierarchicalLevel=2 setSize=-1 posInSet=6 +++++++++++++staticText name='Level 2, item 6 of set size unknown' +++++++++++++++inlineTextBox name='Level 2, item 6 of set size unknown' +++++++++++listItem hierarchicalLevel=2 setSize=-1 posInSet=7 +++++++++++++staticText name='Level 2, item 7 of set size unknown' +++++++++++++++inlineTextBox name='Level 2, item 7 of set size unknown' +++++++listItem hierarchicalLevel=1 setSize=2 posInSet=7 +++++++++staticText name='Level 1, item 7 of set size 2' +++++++++++inlineTextBox name='Level 1, item 7 of set size 2' +++++++listItem hierarchicalLevel=1 setSize=3 posInSet=8 +++++++++staticText name='Level 1, item 8 of set size 3' +++++++++++inlineTextBox name='Level 1, item 8 of set size 3'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win.txt new file mode 100644 index 0000000..5765c174 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win.txt
@@ -0,0 +1,15 @@ +document PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=8 Level=0 +++++listitem PositionInSet=5 SizeOfSet=0 Level=1 +++++++description Name='Level 1, item 5 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++++listitem PositionInSet=6 SizeOfSet=0 Level=1 +++++++description Name='Level 1, item 6 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++++++list PositionInSet=0 SizeOfSet=7 Level=0 +++++++++listitem PositionInSet=6 SizeOfSet=0 Level=2 +++++++++++description Name='Level 2, item 6 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++++++++listitem PositionInSet=7 SizeOfSet=0 Level=2 +++++++++++description Name='Level 2, item 7 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++++listitem PositionInSet=7 SizeOfSet=2 Level=1 +++++++description Name='Level 1, item 7 of set size 2' PositionInSet=0 SizeOfSet=0 Level=0 +++++listitem PositionInSet=8 SizeOfSet=3 Level=1 +++++++description Name='Level 1, item 8 of set size 3' PositionInSet=0 SizeOfSet=0 Level=0
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win7.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win7.txt new file mode 100644 index 0000000..abfa92d --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-uia-win7.txt
@@ -0,0 +1,15 @@ +document +++list +++++listitem +++++++description Name='Level 1, item 5 of set size unknown' +++++listitem +++++++description Name='Level 1, item 6 of set size unknown' +++++++list +++++++++listitem +++++++++++description Name='Level 2, item 6 of set size unknown' +++++++++listitem +++++++++++description Name='Level 2, item 7 of set size unknown' +++++listitem +++++++description Name='Level 1, item 7 of set size 2' +++++listitem +++++++description Name='Level 1, item 8 of set size 3'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-win.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-win.txt new file mode 100644 index 0000000..0b034ae1 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-expected-win.txt
@@ -0,0 +1,15 @@ +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=8 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=0 position_in_group=5 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 5 of set size unknown' +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=0 position_in_group=6 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 6 of set size unknown' +++++++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=7 position_in_group=0 +++++++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=0 position_in_group=6 +++++++++++ROLE_SYSTEM_STATICTEXT name='Level 2, item 6 of set size unknown' +++++++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=0 position_in_group=7 +++++++++++ROLE_SYSTEM_STATICTEXT name='Level 2, item 7 of set size unknown' +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=2 position_in_group=7 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 7 of set size 2' +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=3 position_in_group=8 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 8 of set size 3'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-blink.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-blink.txt new file mode 100644 index 0000000..bc2016e --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-blink.txt
@@ -0,0 +1,43 @@ +rootWebArea +++genericContainer ignored +++++list setSize=1 +++++++listItem hierarchicalLevel=1 setSize=-1 posInSet=1 +++++++++staticText name='Level 1, item 1 of set size unknown' +++++++++++inlineTextBox name='Level 1, item 1 of set size unknown' +++++list setSize=1 +++++++listItem hierarchicalLevel=2 setSize=-1 posInSet=1 +++++++++staticText name='++Level 2, item 1 of set size unknown' +++++++++++inlineTextBox name='++Level 2, item 1 of set size unknown' +++++list setSize=2 +++++++listItem hierarchicalLevel=2 setSize=-1 posInSet=2 +++++++++staticText name='++Level 2, item 2 of set size unknown' +++++++++++inlineTextBox name='++Level 2, item 2 of set size unknown' +++++list setSize=3 +++++++listItem hierarchicalLevel=2 setSize=-1 posInSet=3 +++++++++staticText name='++Level 2, item 3 of set size unknown' +++++++++++inlineTextBox name='++Level 2, item 3 of set size unknown' +++++list setSize=1 +++++++listItem hierarchicalLevel=3 setSize=-1 posInSet=1 +++++++++staticText name='++++Level 3, item 1 of set size unknown' +++++++++++inlineTextBox name='++++Level 3, item 1 of set size unknown' +++++list setSize=2 +++++++listItem hierarchicalLevel=3 setSize=-1 posInSet=2 +++++++++staticText name='++++Level 3, item 2 of set size unknown' +++++++++++inlineTextBox name='++++Level 3, item 2 of set size unknown' +++++list setSize=2 +++++++listItem hierarchicalLevel=1 setSize=-1 posInSet=2 +++++++++staticText name='Level 1, item 2 of set size unknown' +++++++++++inlineTextBox name='Level 1, item 2 of set size unknown' +++++list setSize=3 +++++++listItem hierarchicalLevel=1 setSize=-1 posInSet=3 +++++++++staticText name='Level 1, item 3 of set size unknown' +++++++++++inlineTextBox name='Level 1, item 3 of set size unknown' +++++list setSize=0 +++++++list setSize=4 +++++++++listItem hierarchicalLevel=2 setSize=4 posInSet=4 +++++++++++staticText name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' +++++++++++++inlineTextBox name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' +++++++list setSize=5 +++++++++listItem hierarchicalLevel=2 setSize=5 posInSet=5 +++++++++++staticText name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5' +++++++++++++inlineTextBox name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win.txt new file mode 100644 index 0000000..e616d5d --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win.txt
@@ -0,0 +1,32 @@ +document PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=1 Level=0 +++++listitem PositionInSet=1 SizeOfSet=0 Level=1 +++++++description Name='Level 1, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=1 Level=0 +++++listitem PositionInSet=1 SizeOfSet=0 Level=2 +++++++description Name='++Level 2, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=2 Level=0 +++++listitem PositionInSet=2 SizeOfSet=0 Level=2 +++++++description Name='++Level 2, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=3 Level=0 +++++listitem PositionInSet=3 SizeOfSet=0 Level=2 +++++++description Name='++Level 2, item 3 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=1 Level=0 +++++listitem PositionInSet=1 SizeOfSet=0 Level=3 +++++++description Name='++++Level 3, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=2 Level=0 +++++listitem PositionInSet=2 SizeOfSet=0 Level=3 +++++++description Name='++++Level 3, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=2 Level=0 +++++listitem PositionInSet=2 SizeOfSet=0 Level=1 +++++++description Name='Level 1, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=3 Level=0 +++++listitem PositionInSet=3 SizeOfSet=0 Level=1 +++++++description Name='Level 1, item 3 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0 +++list PositionInSet=0 SizeOfSet=0 Level=0 +++++list PositionInSet=0 SizeOfSet=4 Level=0 +++++++listitem PositionInSet=4 SizeOfSet=4 Level=2 +++++++++description Name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' PositionInSet=0 SizeOfSet=0 Level=0 +++++list PositionInSet=0 SizeOfSet=5 Level=0 +++++++listitem PositionInSet=5 SizeOfSet=5 Level=2 +++++++++description Name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5' PositionInSet=0 SizeOfSet=0 Level=0
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win7.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win7.txt new file mode 100644 index 0000000..c6330429 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-uia-win7.txt
@@ -0,0 +1,32 @@ +document +++list +++++listitem +++++++description Name='Level 1, item 1 of set size unknown' +++list +++++listitem +++++++description Name='++Level 2, item 1 of set size unknown' +++list +++++listitem +++++++description Name='++Level 2, item 2 of set size unknown' +++list +++++listitem +++++++description Name='++Level 2, item 3 of set size unknown' +++list +++++listitem +++++++description Name='++++Level 3, item 1 of set size unknown' +++list +++++listitem +++++++description Name='++++Level 3, item 2 of set size unknown' +++list +++++listitem +++++++description Name='Level 1, item 2 of set size unknown' +++list +++++listitem +++++++description Name='Level 1, item 3 of set size unknown' +++list +++++list +++++++listitem +++++++++description Name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' +++++list +++++++listitem +++++++++description Name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-win.txt b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-win.txt new file mode 100644 index 0000000..245ece7d --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened-expected-win.txt
@@ -0,0 +1,32 @@ +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=1 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=0 position_in_group=1 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 1 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=1 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=0 position_in_group=1 +++++++ROLE_SYSTEM_STATICTEXT name='++Level 2, item 1 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=2 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=0 position_in_group=2 +++++++ROLE_SYSTEM_STATICTEXT name='++Level 2, item 2 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=3 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=0 position_in_group=3 +++++++ROLE_SYSTEM_STATICTEXT name='++Level 2, item 3 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=1 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=3 similar_items_in_group=0 position_in_group=1 +++++++ROLE_SYSTEM_STATICTEXT name='++++Level 3, item 1 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=2 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=3 similar_items_in_group=0 position_in_group=2 +++++++ROLE_SYSTEM_STATICTEXT name='++++Level 3, item 2 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=2 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=0 position_in_group=2 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 2 of set size unknown' +++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=3 position_in_group=0 +++++ROLE_SYSTEM_LISTITEM READONLY group_level=1 similar_items_in_group=0 position_in_group=3 +++++++ROLE_SYSTEM_STATICTEXT name='Level 1, item 3 of set size unknown' +++ROLE_SYSTEM_LIST READONLY +++++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=4 position_in_group=0 +++++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=4 position_in_group=4 +++++++++ROLE_SYSTEM_STATICTEXT name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' +++++ROLE_SYSTEM_LIST READONLY group_level=0 similar_items_in_group=5 position_in_group=0 +++++++ROLE_SYSTEM_LISTITEM READONLY group_level=2 similar_items_in_group=5 position_in_group=5 +++++++++ROLE_SYSTEM_STATICTEXT name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5'
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened.html b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened.html new file mode 100644 index 0000000..33f1a5c1 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown-flattened.html
@@ -0,0 +1,56 @@ +<!-- +@BLINK-ALLOW:hierarchicalLevel* +@BLINK-ALLOW:posInSet* +@BLINK-ALLOW:setSize* +@WIN-ALLOW:group_level* +@WIN-ALLOW:similar_items_in_group* +@WIN-ALLOW:position_in_group* +@UIA-WIN-ALLOW:Level* +@UIA-WIN-ALLOW:PositionInSet* +@UIA-WIN-ALLOW:SizeOfSet* +@UIA-WIN-DENY:IsControlElement* +--> +<html> +<body> + <!-- Nested list items in flattened structure. --> + <ol role="list" start="1"> + <li aria-setsize="-1" aria-posinset="1" role="listitem" aria-level="1">Level 1, item 1 of set size unknown</li> + </ol> + <ol role="list" start="1"> + <li aria-setsize="-1" aria-posinset="1" role="listitem" aria-level="2">++Level 2, item 1 of set size unknown</li> + </ol> + <ol role="list" start="2"> + <li aria-setsize="-1" aria-posinset="2" role="listitem" aria-level="2">++Level 2, item 2 of set size unknown</li> + </ol> + <ol role="list" start="3"> + <li aria-setsize="-1" aria-posinset="3" role="listitem" aria-level="2">++Level 2, item 3 of set size unknown</li> + </ol> + <ol role="list" start="1"> + <li aria-setsize="-1" aria-posinset="1" role="listitem" aria-level="3">++++Level 3, item 1 of set size unknown</li> + </ol> + <ol role="list" start="2"> + <li aria-setsize="-1" aria-posinset="2" role="listitem" aria-level="3">++++Level 3, item 2 of set size unknown</li> + </ol> + <ol role="list" start="2"> + <li aria-setsize="-1" aria-posinset="2" role="listitem" aria-level="1">Level 1, item 2 of set size unknown</li> + </ol> + <ol role="list" start="3"> + <li aria-setsize="-1" aria-posinset="3" role="listitem" aria-level="1">Level 1, item 3 of set size unknown</li> + </ol> + <div role="list"> + <ol role="list" start="4"> + <li aria-posinset="4" role="listitem">Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4</li> + </ol> + <ol role="list" start="5"> + <li aria-posinset="5" role="listitem">Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5</li> + </ol> + </div> + + <style> + li { + list-style-type: none; + } + </style> +</body> + +</html>
diff --git a/content/test/data/accessibility/html/list-item-aria-setsize-unknown.html b/content/test/data/accessibility/html/list-item-aria-setsize-unknown.html new file mode 100644 index 0000000..c7e25a3 --- /dev/null +++ b/content/test/data/accessibility/html/list-item-aria-setsize-unknown.html
@@ -0,0 +1,33 @@ +<!-- +@BLINK-ALLOW:hierarchicalLevel* +@BLINK-ALLOW:posInSet* +@BLINK-ALLOW:setSize* +@WIN-ALLOW:group_level* +@WIN-ALLOW:similar_items_in_group* +@WIN-ALLOW:position_in_group* +@UIA-WIN-ALLOW:Level* +@UIA-WIN-ALLOW:PositionInSet* +@UIA-WIN-ALLOW:SizeOfSet* +@UIA-WIN-DENY:IsControlElement* +--> +<html> +<body> + <ul> + <li aria-setsize="-1" aria-posinset="5">Level 1, item 5 of set size unknown</li> + <li aria-setsize="-1" aria-posinset="6">Level 1, item 6 of set size unknown + <ul> + <li aria-setsize="-1" aria-posinset="6">Level 2, item 6 of set size unknown</li> + <li aria-setsize="-1" aria-posinset="7">Level 2, item 7 of set size unknown</li> + </ul> + </li> + <li aria-setsize="2" aria-posinset="7">Level 1, item 7 of set size 2</li> + <li aria-setsize="3" aria-posinset="8">Level 1, item 8 of set size 3</li> + </ul> + + <style> + li { + list-style-type: none; + } + </style> +</body> +</html>
diff --git a/content/test/data/accessibility/html/mark-expected-android.txt b/content/test/data/accessibility/html/mark-expected-android.txt index 02b5b2fd..e2783cf3 100644 --- a/content/test/data/accessibility/html/mark-expected-android.txt +++ b/content/test/data/accessibility/html/mark-expected-android.txt
@@ -1,3 +1,5 @@ -#<skip -- crbug.com/413531> android.webkit.WebView focusable focused scrollable -++android.view.View clickable name='This test is to checkmark tag.' +++android.view.View +++++android.view.View name='This test is to check ' +++++android.view.View role_description='highlight' name='mark tag' +++++android.view.View name='.'
diff --git a/device/vr/oculus/oculus_render_loop.h b/device/vr/oculus/oculus_render_loop.h index 0430c05..95df7a4 100644 --- a/device/vr/oculus/oculus_render_loop.h +++ b/device/vr/oculus/oculus_render_loop.h
@@ -11,7 +11,6 @@ #include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/vr_device.h" #include "device/vr/windows/compositor_base.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/platform_handle.h" #include "third_party/libovr/src/Include/OVR_CAPI.h" #include "ui/gfx/geometry/rect_f.h"
diff --git a/device/vr/openvr/openvr_render_loop.h b/device/vr/openvr/openvr_render_loop.h index 36099fa..327532d 100644 --- a/device/vr/openvr/openvr_render_loop.h +++ b/device/vr/openvr/openvr_render_loop.h
@@ -15,7 +15,6 @@ #include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/vr_device.h" #include "device/vr/windows/compositor_base.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/platform_handle.h" #include "third_party/openvr/src/headers/openvr.h" #include "ui/gfx/geometry/rect_f.h"
diff --git a/device/vr/windows_mixed_reality/mixed_reality_renderloop.h b/device/vr/windows_mixed_reality/mixed_reality_renderloop.h index ca76cb53..512478b 100644 --- a/device/vr/windows_mixed_reality/mixed_reality_renderloop.h +++ b/device/vr/windows_mixed_reality/mixed_reality_renderloop.h
@@ -20,7 +20,6 @@ #include "device/vr/windows/compositor_base.h" #include "device/vr/windows/d3d11_texture_helper.h" #include "device/vr/windows_mixed_reality/mixed_reality_input_helper.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/platform_handle.h" #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/win/window_impl.h"
diff --git a/docs/README.md b/docs/README.md index 764812c3..0fe3984 100644 --- a/docs/README.md +++ b/docs/README.md
@@ -71,7 +71,7 @@ * [Atom](atom.md) - Atom multi-platform code editor * [CLion](clion.md) - CLion IDE, supports GUI debugging. * [Eclipse for Android](eclipse.md) - Eclipse for Android -* [Eclipse for Linux](linux_eclipse_dev.md) - Eclipse for other platforms +* [Eclipse for Linux](linux/eclipse_dev.md) - Eclipse for other platforms (This guide was written for Linux, but is probably usable on Windows/MacOS as well) * [EMACS Notes](emacs.md) - EMACS commands/styles/tool integrations
diff --git a/docs/speed/perf_lab_platforms.md b/docs/speed/perf_lab_platforms.md index 33cc8b3..4ad82355 100644 --- a/docs/speed/perf_lab_platforms.md +++ b/docs/speed/perf_lab_platforms.md
@@ -28,6 +28,7 @@ ## Win * [win-10-perf](https://ci.chromium.org/p/chrome/builders/ci/win-10-perf): Windows Intel HD 630 towers, Core i7-7700 3.6 GHz, 16GB RAM, Intel Kaby Lake HD Graphics 630. + * [win-10_laptop_low_end-perf](https://ci.chromium.org/p/chrome/builders/ci/win-10_laptop_low_end-perf): Low end windows 10 HP laptops. HD Graphics 5500, x86-64-i3-5005U, SSD, 4GB RAM.. * [Win 7 Nvidia GPU Perf](https://ci.chromium.org/p/chrome/builders/ci/Win%207%20Nvidia%20GPU%20Perf): N/A. * [Win 7 Perf](https://ci.chromium.org/p/chrome/builders/ci/Win%207%20Perf): N/A.
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 1e464d9..9d5229f 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1488,6 +1488,7 @@ PRINTING_GETPRINTERS = 1425, WEBCAMPRIVATE_SET_HOME = 1426, INPUTMETHODPRIVATE_RESET = 1427, + PRINTING_GETPRINTERINFO = 1428, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/renderer/bindings/api_binding.cc b/extensions/renderer/bindings/api_binding.cc index 42fee0a..92793da 100644 --- a/extensions/renderer/bindings/api_binding.cc +++ b/extensions/renderer/bindings/api_binding.cc
@@ -24,7 +24,6 @@ #include "gin/arguments.h" #include "gin/handle.h" #include "gin/per_context_data.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" namespace extensions {
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index f4c7df77..82e432e 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -1033,10 +1033,6 @@ content::RenderFrame* background_frame = ExtensionFrameHelper::GetBackgroundPageFrame(params.extension_id); - // Required for |web_user_gesture|. - std::unique_ptr<HandleScopeHelper> v8_handle_scope; - - std::unique_ptr<InteractionProvider::Scope> web_user_gesture; // Synthesize a user gesture if this was in response to user action; this is // necessary if the gesture was e.g. by clicking on the extension toolbar // icon, context menu entry, etc. @@ -1051,9 +1047,7 @@ ScriptContextSet::GetMainWorldContextForFrame(background_frame); if (background_context && bindings_system_->HasEventListenerInContext( params.event_name, background_context)) { - v8_handle_scope = std::make_unique<HandleScopeHelper>(background_context); - web_user_gesture = ExtensionInteractionProvider::Scope::ForFrame( - background_frame->GetWebFrame()); + background_frame->GetWebFrame()->NotifyUserActivation(); } }
diff --git a/extensions/renderer/extension_interaction_provider.cc b/extensions/renderer/extension_interaction_provider.cc index cd41850..80b6cf8 100644 --- a/extensions/renderer/extension_interaction_provider.cc +++ b/extensions/renderer/extension_interaction_provider.cc
@@ -12,8 +12,6 @@ #include "extensions/renderer/script_context.h" #include "extensions/renderer/worker_thread_util.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" namespace extensions { @@ -50,14 +48,6 @@ // static. std::unique_ptr<ExtensionInteractionProvider::Scope> -ExtensionInteractionProvider::Scope::ForFrame(blink::WebLocalFrame* web_frame) { - auto scope = base::WrapUnique(new Scope()); - blink::WebScopedUserGesture gesture(web_frame); - return scope; -} - -// static. -std::unique_ptr<ExtensionInteractionProvider::Scope> ExtensionInteractionProvider::Scope::ForToken( v8::Local<v8::Context> v8_context, std::unique_ptr<InteractionProvider::Token> token) { @@ -128,8 +118,9 @@ // RenderFrame based context: ScriptContext* script_context = GetScriptContextFromV8ContextChecked(v8_context); - return blink::WebUserGestureIndicator::IsProcessingUserGesture( - script_context->web_frame()); + if (!script_context->web_frame()) + return false; + return script_context->web_frame()->HasTransientUserActivation(); } std::unique_ptr<InteractionProvider::Token>
diff --git a/extensions/renderer/extension_interaction_provider.h b/extensions/renderer/extension_interaction_provider.h index 7b72b17..2e408da 100644 --- a/extensions/renderer/extension_interaction_provider.h +++ b/extensions/renderer/extension_interaction_provider.h
@@ -10,10 +10,6 @@ #include "base/optional.h" #include "v8/include/v8.h" -namespace blink { -class WebLocalFrame; -} // namespace blink - namespace extensions { // Provides user interaction related utilities specific to extensions system, @@ -47,8 +43,6 @@ // Creates a Scope for a Service Worker context, without token. static std::unique_ptr<Scope> ForWorker(v8::Local<v8::Context> v8_context); - // Creates a scope for a RenderFrame, without token. - static std::unique_ptr<Scope> ForFrame(blink::WebLocalFrame* web_frame); // Creates a scope from a |token|. static std::unique_ptr<Scope> ForToken(
diff --git a/extensions/renderer/gin_port_unittest.cc b/extensions/renderer/gin_port_unittest.cc index 1479a6d..98b31a4 100644 --- a/extensions/renderer/gin_port_unittest.cc +++ b/extensions/renderer/gin_port_unittest.cc
@@ -20,7 +20,6 @@ #include "gin/data_object_builder.h" #include "gin/handle.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" namespace extensions {
diff --git a/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc b/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc index dd1e2a16..3c220e4 100644 --- a/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc +++ b/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc
@@ -28,7 +28,6 @@ #include "third_party/blink/public/web/web_frame.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_remote_frame.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" #include "third_party/blink/public/web/web_view.h" #include "v8/include/v8.h" @@ -342,7 +341,8 @@ // TODO(devlin): All this needs to do is enter fullscreen. We should make this // EnterFullscreen() and do it directly rather than having a generic "run with // user gesture" function. - blink::WebScopedUserGesture user_gesture(context()->web_frame()); + if (context()->web_frame()) + context()->web_frame()->NotifyUserActivation(); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsFunction()); context()->SafeCallFunction(
diff --git a/extensions/renderer/messaging_util.cc b/extensions/renderer/messaging_util.cc index 467ee88..4025b09b 100644 --- a/extensions/renderer/messaging_util.cc +++ b/extensions/renderer/messaging_util.cc
@@ -18,7 +18,7 @@ #include "extensions/renderer/script_context.h" #include "gin/converter.h" #include "gin/dictionary.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" +#include "third_party/blink/public/web/web_local_frame.h" namespace extensions { namespace messaging_util { @@ -119,9 +119,9 @@ return nullptr; } - return std::make_unique<Message>( - message, - blink::WebUserGestureIndicator::IsProcessingUserGesture(web_frame)); + bool has_transient_user_activation = + web_frame ? web_frame->HasTransientUserActivation() : false; + return std::make_unique<Message>(message, has_transient_user_activation); } v8::Local<v8::Value> MessageToV8(v8::Local<v8::Context> context,
diff --git a/extensions/renderer/native_renderer_messaging_service.cc b/extensions/renderer/native_renderer_messaging_service.cc index 87af2b2..e0a88d88 100644 --- a/extensions/renderer/native_renderer_messaging_service.cc +++ b/extensions/renderer/native_renderer_messaging_service.cc
@@ -37,9 +37,7 @@ #include "gin/per_context_data.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" #include "third_party/blink/public/web/web_scoped_window_focus_allowed_indicator.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "v8/include/v8.h" namespace extensions { @@ -319,19 +317,14 @@ if (!ContextHasMessagePort(script_context, target_port_id)) return; - std::unique_ptr<blink::WebScopedUserGesture> web_user_gesture; std::unique_ptr<blink::WebScopedWindowFocusAllowedIndicator> allow_window_focus; - if (message.user_gesture) { - web_user_gesture = std::make_unique<blink::WebScopedUserGesture>( - script_context->web_frame()); - - if (script_context->web_frame()) { - blink::WebDocument document = script_context->web_frame()->GetDocument(); - allow_window_focus = - std::make_unique<blink::WebScopedWindowFocusAllowedIndicator>( - &document); - } + if (message.user_gesture && script_context->web_frame()) { + script_context->web_frame()->NotifyUserActivation(); + blink::WebDocument document = script_context->web_frame()->GetDocument(); + allow_window_focus = + std::make_unique<blink::WebScopedWindowFocusAllowedIndicator>( + &document); } DispatchOnMessageToListeners(script_context, message, target_port_id);
diff --git a/extensions/renderer/user_gestures_native_handler.cc b/extensions/renderer/user_gestures_native_handler.cc index 9fd3fd4..bd57e67 100644 --- a/extensions/renderer/user_gestures_native_handler.cc +++ b/extensions/renderer/user_gestures_native_handler.cc
@@ -7,7 +7,7 @@ #include "base/bind.h" #include "extensions/renderer/extension_interaction_provider.h" #include "extensions/renderer/script_context.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" +#include "third_party/blink/public/web/web_local_frame.h" namespace extensions { @@ -37,7 +37,8 @@ const v8::FunctionCallbackInfo<v8::Value>& args) { // TODO(lazyboy): This won't work for Service Workers. Address this once we're // certain that we need this for workers. - blink::WebScopedUserGesture user_gesture(context()->web_frame()); + if (context()->web_frame()) + context()->web_frame()->NotifyUserActivation(); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsFunction()); context()->SafeCallFunction(v8::Local<v8::Function>::Cast(args[0]), 0,
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index d36a740..04bf17c 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -185,6 +185,8 @@ "command_buffer/service/mocks.h", "command_buffer/service/test_helper.cc", "command_buffer/service/test_helper.h", + "command_buffer/service/test_shared_image_backing.cc", + "command_buffer/service/test_shared_image_backing.h", "ipc/raster_in_process_context.cc", "ipc/raster_in_process_context.h", "ipc/service/gpu_memory_buffer_factory_test_template.h",
diff --git a/gpu/command_buffer/client/raster_cmd_helper_autogen.h b/gpu/command_buffer/client/raster_cmd_helper_autogen.h index efc7328e..42ee264 100644 --- a/gpu/command_buffer/client/raster_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/raster_cmd_helper_autogen.h
@@ -190,6 +190,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const GLbyte* mailboxes) { const uint32_t size = raster::cmds::CopySubTextureINTERNALImmediate::ComputeSize(); @@ -197,7 +199,8 @@ GetImmediateCmdSpaceTotalSize< raster::cmds::CopySubTextureINTERNALImmediate>(size); if (c) { - c->Init(xoffset, yoffset, x, y, width, height, mailboxes); + c->Init(xoffset, yoffset, x, y, width, height, unpack_flip_y, + unpack_premultiply_alpha, mailboxes); } }
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc index 87e03d9..dd4ae95 100644 --- a/gpu/command_buffer/client/raster_implementation.cc +++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -1045,7 +1045,9 @@ GLint x, GLint y, GLsizei width, - GLsizei height) { + GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopySubTexture(" << source_mailbox.ToDebugString() << ", " @@ -1065,7 +1067,8 @@ memcpy(mailboxes + sizeof(source_mailbox.name), dest_mailbox.name, sizeof(dest_mailbox.name)); helper_->CopySubTextureINTERNALImmediate(xoffset, yoffset, x, y, width, - height, mailboxes); + height, unpack_flip_y, + unpack_premultiply_alpha, mailboxes); CheckGLError(); }
diff --git a/gpu/command_buffer/client/raster_implementation.h b/gpu/command_buffer/client/raster_implementation.h index 4661b207..f52fb7f 100644 --- a/gpu/command_buffer/client/raster_implementation.h +++ b/gpu/command_buffer/client/raster_implementation.h
@@ -119,7 +119,9 @@ GLint x, GLint y, GLsizei width, - GLsizei height) override; + GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha) override; void BeginRasterCHROMIUM(GLuint sk_color, GLuint msaa_sample_count,
diff --git a/gpu/command_buffer/client/raster_implementation_gles.cc b/gpu/command_buffer/client/raster_implementation_gles.cc index bf10d7a..b22ceb7 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.cc +++ b/gpu/command_buffer/client/raster_implementation_gles.cc
@@ -105,17 +105,28 @@ GLint x, GLint y, GLsizei width, - GLsizei height) { + GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha) { GLuint texture_ids[2] = { - gl_->CreateAndConsumeTextureCHROMIUM(source_mailbox.name), - gl_->CreateAndConsumeTextureCHROMIUM(dest_mailbox.name), + CreateAndConsumeForGpuRaster(source_mailbox), + CreateAndConsumeForGpuRaster(dest_mailbox), }; DCHECK(texture_ids[0]); DCHECK(texture_ids[1]); + BeginSharedImageAccessDirectCHROMIUM( + texture_ids[0], GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); + BeginSharedImageAccessDirectCHROMIUM( + texture_ids[1], GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); + gl_->CopySubTextureCHROMIUM(texture_ids[0], 0, dest_target, texture_ids[1], 0, - xoffset, yoffset, x, y, width, height, false, - false, false); + xoffset, yoffset, x, y, width, height, + unpack_flip_y, unpack_premultiply_alpha, + false /* upack_unmultiply_alpha */); + + EndSharedImageAccessDirectCHROMIUM(texture_ids[0]); + EndSharedImageAccessDirectCHROMIUM(texture_ids[1]); gl_->DeleteTextures(2, texture_ids); }
diff --git a/gpu/command_buffer/client/raster_implementation_gles.h b/gpu/command_buffer/client/raster_implementation_gles.h index 5d932044..8653efc3 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.h +++ b/gpu/command_buffer/client/raster_implementation_gles.h
@@ -61,7 +61,9 @@ GLint x, GLint y, GLsizei width, - GLsizei height) override; + GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha) override; // OOP-Raster void BeginRasterCHROMIUM(GLuint sk_color,
diff --git a/gpu/command_buffer/client/raster_interface.h b/gpu/command_buffer/client/raster_interface.h index 250272d..82aace77 100644 --- a/gpu/command_buffer/client/raster_interface.h +++ b/gpu/command_buffer/client/raster_interface.h
@@ -49,7 +49,9 @@ GLint x, GLint y, GLsizei width, - GLsizei height) = 0; + GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha) = 0; // OOP-Raster virtual void BeginRasterCHROMIUM(GLuint sk_color, GLuint msaa_sample_count,
diff --git a/gpu/command_buffer/common/raster_cmd_format_autogen.h b/gpu/command_buffer/common/raster_cmd_format_autogen.h index efef0464..dc1ae62 100644 --- a/gpu/command_buffer/common/raster_cmd_format_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_autogen.h
@@ -816,6 +816,8 @@ GLint _y, GLsizei _width, GLsizei _height, + GLboolean _unpack_flip_y, + GLboolean _unpack_premultiply_alpha, const GLbyte* _mailboxes) { SetHeader(); xoffset = _xoffset; @@ -824,6 +826,8 @@ y = _y; width = _width; height = _height; + unpack_flip_y = _unpack_flip_y; + unpack_premultiply_alpha = _unpack_premultiply_alpha; memcpy(ImmediateDataAddress(this), _mailboxes, ComputeDataSize()); } @@ -834,9 +838,12 @@ GLint _y, GLsizei _width, GLsizei _height, + GLboolean _unpack_flip_y, + GLboolean _unpack_premultiply_alpha, const GLbyte* _mailboxes) { static_cast<ValueType*>(cmd)->Init(_xoffset, _yoffset, _x, _y, _width, - _height, _mailboxes); + _height, _unpack_flip_y, + _unpack_premultiply_alpha, _mailboxes); const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } @@ -848,10 +855,12 @@ int32_t y; int32_t width; int32_t height; + uint32_t unpack_flip_y; + uint32_t unpack_premultiply_alpha; }; -static_assert(sizeof(CopySubTextureINTERNALImmediate) == 28, - "size of CopySubTextureINTERNALImmediate should be 28"); +static_assert(sizeof(CopySubTextureINTERNALImmediate) == 36, + "size of CopySubTextureINTERNALImmediate should be 36"); static_assert(offsetof(CopySubTextureINTERNALImmediate, header) == 0, "offset of CopySubTextureINTERNALImmediate header should be 0"); static_assert(offsetof(CopySubTextureINTERNALImmediate, xoffset) == 4, @@ -866,6 +875,13 @@ "offset of CopySubTextureINTERNALImmediate width should be 20"); static_assert(offsetof(CopySubTextureINTERNALImmediate, height) == 24, "offset of CopySubTextureINTERNALImmediate height should be 24"); +static_assert( + offsetof(CopySubTextureINTERNALImmediate, unpack_flip_y) == 28, + "offset of CopySubTextureINTERNALImmediate unpack_flip_y should be 28"); +static_assert(offsetof(CopySubTextureINTERNALImmediate, + unpack_premultiply_alpha) == 32, + "offset of CopySubTextureINTERNALImmediate " + "unpack_premultiply_alpha should be 32"); struct TraceBeginCHROMIUM { typedef TraceBeginCHROMIUM ValueType;
diff --git a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h index 68675bc..d665f87 100644 --- a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
@@ -341,7 +341,8 @@ void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLint>(12), static_cast<GLint>(13), static_cast<GLint>(14), - static_cast<GLsizei>(15), static_cast<GLsizei>(16), data); + static_cast<GLsizei>(15), static_cast<GLsizei>(16), + static_cast<GLboolean>(17), static_cast<GLboolean>(18), data); EXPECT_EQ( static_cast<uint32_t>(cmds::CopySubTextureINTERNALImmediate::kCmdId), cmd.header.command); @@ -353,6 +354,8 @@ EXPECT_EQ(static_cast<GLint>(14), cmd.y); EXPECT_EQ(static_cast<GLsizei>(15), cmd.width); EXPECT_EQ(static_cast<GLsizei>(16), cmd.height); + EXPECT_EQ(static_cast<GLboolean>(17), cmd.unpack_flip_y); + EXPECT_EQ(static_cast<GLboolean>(18), cmd.unpack_premultiply_alpha); CheckBytesWrittenMatchesExpectedSize( next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); }
diff --git a/gpu/command_buffer/raster_cmd_buffer_functions.txt b/gpu/command_buffer/raster_cmd_buffer_functions.txt index 64893624e..39a67517 100644 --- a/gpu/command_buffer/raster_cmd_buffer_functions.txt +++ b/gpu/command_buffer/raster_cmd_buffer_functions.txt
@@ -36,7 +36,7 @@ // TOOD(backer): Remove GL encoding. These are not GL functions. // |mailboxes| argument is the concatenation of the source mailbox and the destination mailbox (32 bytes total) -GL_APICALL void GL_APIENTRY glCopySubTextureINTERNAL (GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, const GLbyte* mailboxes); +GL_APICALL void GL_APIENTRY glCopySubTextureINTERNAL (GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, GLboolean unpack_flip_y, GLboolean unpack_premultiply_alpha, const GLbyte* mailboxes); GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* category_name, const char* trace_name); GL_APICALL void GL_APIENTRY glTraceEndCHROMIUM (void); GL_APICALL void GL_APIENTRY glSetActiveURLCHROMIUM (const char* url);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc index 807b68e..9069424 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc
@@ -8,97 +8,37 @@ #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" #include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/test_shared_image_backing.h" namespace gpu { namespace gles2 { namespace { - -class TestSharedImageBackingPassthrough - : public ClearTrackingSharedImageBacking { - public: - class TestSharedImageRepresentationPassthrough - : public SharedImageRepresentationGLTexturePassthrough { - public: - TestSharedImageRepresentationPassthrough( - SharedImageManager* manager, - SharedImageBacking* backing, - MemoryTypeTracker* tracker, - scoped_refptr<TexturePassthrough>& texture_passthrough) - : SharedImageRepresentationGLTexturePassthrough(manager, - backing, - tracker), - texture_passthrough_(texture_passthrough) {} - - const scoped_refptr<TexturePassthrough>& GetTexturePassthrough() override { - return texture_passthrough_; - } - - void set_can_access(bool can_access) { can_access_ = can_access; } - bool BeginAccess(GLenum mode) override { return can_access_; } - - private: - const scoped_refptr<TexturePassthrough>& texture_passthrough_; - bool can_access_ = true; - }; - - TestSharedImageBackingPassthrough(const Mailbox& mailbox, - viz::ResourceFormat format, - const gfx::Size& size, - const gfx::ColorSpace& color_space, - uint32_t usage) - : ClearTrackingSharedImageBacking(mailbox, - format, - size, - color_space, - usage, - 0 /* estimated_size */, - false /* is_thread_safe */) { - GLuint service_id; - glGenTextures(1, &service_id); - glBindTexture(GL_TEXTURE_2D, service_id); - glTexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat(format), size.width(), - size.height(), 0, GLDataFormat(format), GLDataType(format), - nullptr /* data */); - texture_passthrough_ = - base::MakeRefCounted<TexturePassthrough>(service_id, GL_TEXTURE_2D); - } - - void Update(std::unique_ptr<gfx::GpuFence> in_fence) override { - DCHECK(!in_fence); - } - - bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override { - return false; - } - - void OnMemoryDump(const std::string& dump_name, - base::trace_event::MemoryAllocatorDump* dump, - base::trace_event::ProcessMemoryDump* pmd, - uint64_t client_tracing_id) override {} - - GLuint ServiceID() const { return texture_passthrough_->service_id(); } - - protected: - std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> - ProduceGLTexturePassthrough(SharedImageManager* manager, - MemoryTypeTracker* tracker) override { - return std::make_unique<TestSharedImageRepresentationPassthrough>( - manager, this, tracker, texture_passthrough_); - } - - private: - scoped_refptr<TexturePassthrough> texture_passthrough_; -}; +std::unique_ptr<TestSharedImageBacking> AllocateTextureAndCreateSharedImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage) { + GLuint service_id; + glGenTextures(1, &service_id); + glBindTexture(GL_TEXTURE_2D, service_id); + glTexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat(format), size.width(), + size.height(), 0, GLDataFormat(format), GLDataType(format), + nullptr /* data */); + return std::make_unique<TestSharedImageBacking>( + mailbox, format, size, color_space, usage, 0 /* estimated_size */, + service_id); +} } // namespace TEST_F(GLES2DecoderPassthroughTest, CreateAndTexStorage2DSharedImageCHROMIUM) { MemoryTypeTracker memory_tracker(nullptr); Mailbox mailbox = Mailbox::GenerateForSharedImage(); - auto backing = std::make_unique<TestSharedImageBackingPassthrough>( + auto backing = AllocateTextureAndCreateSharedImage( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), gfx::ColorSpace(), 0); - GLuint service_id = backing->ServiceID(); + GLuint service_id = backing->service_id(); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = GetSharedImageManager()->Register(std::move(backing), &memory_tracker); @@ -160,7 +100,7 @@ Mailbox mailbox = Mailbox::GenerateForSharedImage(); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = GetSharedImageManager()->Register( - std::make_unique<TestSharedImageBackingPassthrough>( + AllocateTextureAndCreateSharedImage( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), gfx::ColorSpace(), 0), &memory_tracker); @@ -195,7 +135,7 @@ Mailbox mailbox = Mailbox::GenerateForSharedImage(); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = GetSharedImageManager()->Register( - std::make_unique<TestSharedImageBackingPassthrough>( + AllocateTextureAndCreateSharedImage( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), gfx::ColorSpace(), 0), &memory_tracker); @@ -267,12 +207,14 @@ // Create a shared image. MemoryTypeTracker memory_tracker(nullptr); Mailbox mailbox = Mailbox::GenerateForSharedImage(); + auto shared_image_backing = AllocateTextureAndCreateSharedImage( + mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), + gfx::ColorSpace(), 0); + // Set the shared image to fail BeginAccess. + shared_image_backing->set_can_access(false); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - GetSharedImageManager()->Register( - std::make_unique<TestSharedImageBackingPassthrough>( - mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), - gfx::ColorSpace(), 0), - &memory_tracker); + GetSharedImageManager()->Register(std::move(shared_image_backing), + &memory_tracker); auto& cmd = *GetImmediateAs< cmds::CreateAndTexStorage2DSharedImageINTERNALImmediate>(); @@ -282,14 +224,6 @@ // Try to begin access with a shared image representation that fails // BeginAccess. - auto found = - GetPassthroughResources()->texture_shared_image_map.find(kNewClientId); - ASSERT_TRUE(found != - GetPassthroughResources()->texture_shared_image_map.end()); - static_cast<TestSharedImageBackingPassthrough:: - TestSharedImageRepresentationPassthrough*>( - found->second.representation()) - ->set_can_access(false); cmds::BeginSharedImageAccessDirectCHROMIUM read_access_cmd; read_access_cmd.Init(kNewClientId, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); EXPECT_EQ(error::kNoError, ExecuteCmd(read_access_cmd)); @@ -316,7 +250,7 @@ Mailbox mailbox = Mailbox::GenerateForSharedImage(); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = GetSharedImageManager()->Register( - std::make_unique<TestSharedImageBackingPassthrough>( + AllocateTextureAndCreateSharedImage( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), gfx::ColorSpace(), 0), &memory_tracker);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc index 268c77c..1bf121b 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
@@ -25,6 +25,7 @@ #include "gpu/command_buffer/service/service_discardable_manager.h" #include "gpu/command_buffer/service/shared_image_representation.h" #include "gpu/command_buffer/service/test_helper.h" +#include "gpu/command_buffer/service/test_shared_image_backing.h" #include "gpu/config/gpu_switches.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_image_stub.h" @@ -3112,93 +3113,6 @@ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); } -class TestSharedImageBacking : public SharedImageBacking { - public: - class TestSharedImageRepresentation - : public SharedImageRepresentationGLTexture { - public: - TestSharedImageRepresentation(SharedImageManager* manager, - SharedImageBacking* backing, - MemoryTypeTracker* tracker, - gles2::Texture* texture) - : SharedImageRepresentationGLTexture(manager, backing, tracker), - texture_(texture) {} - - gles2::Texture* GetTexture() override { return texture_; } - - void set_can_access(bool can_access) { can_access_ = can_access; } - bool BeginAccess(GLenum mode) override { return can_access_; } - - private: - gles2::Texture* texture_; - bool can_access_ = true; - }; - - TestSharedImageBacking(const Mailbox& mailbox, - viz::ResourceFormat format, - const gfx::Size& size, - const gfx::ColorSpace& color_space, - uint32_t usage, - MemoryTypeTracker* memory_tracker, - GLuint texture_id) - : SharedImageBacking(mailbox, - format, - size, - color_space, - usage, - 0 /* estimated_size */, - false /* is_thread_safe */) { - texture_ = new gles2::Texture(texture_id); - texture_->SetLightweightRef(); - texture_->SetTarget(GL_TEXTURE_2D, 1); - texture_->sampler_state_.min_filter = GL_LINEAR; - texture_->sampler_state_.mag_filter = GL_LINEAR; - texture_->sampler_state_.wrap_s = GL_CLAMP_TO_EDGE; - texture_->sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; - texture_->SetLevelInfo( - GL_TEXTURE_2D, 0, GLInternalFormat(format), size.width(), size.height(), - 1, 0, GLDataFormat(format), GLDataType(format), gfx::Rect()); - texture_->SetImmutable(true, true); - } - - ~TestSharedImageBacking() override { - texture_->RemoveLightweightRef(have_context()); - texture_ = nullptr; - } - - gfx::Rect ClearedRect() const override { - return texture_->GetLevelClearedRect(texture_->target(), 0); - } - - void SetClearedRect(const gfx::Rect& cleared_rect) override { - texture_->SetLevelClearedRect(texture_->target(), 0, cleared_rect); - } - - void Update(std::unique_ptr<gfx::GpuFence> in_fence) override { - DCHECK(!in_fence); - } - - bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override { - return false; - } - - void OnMemoryDump(const std::string& dump_name, - base::trace_event::MemoryAllocatorDump* dump, - base::trace_event::ProcessMemoryDump* pmd, - uint64_t client_tracing_id) override {} - - protected: - std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( - SharedImageManager* manager, - MemoryTypeTracker* tracker) override { - return std::make_unique<TestSharedImageRepresentation>(manager, this, - tracker, texture_); - } - - private: - gles2::Texture* texture_; -}; - TEST_P(GLES2DecoderTest, CreateAndTexStorage2DSharedImageCHROMIUM) { MemoryTypeTracker memory_tracker(memory_tracker_.get()); Mailbox mailbox = Mailbox::GenerateForSharedImage(); @@ -3206,7 +3120,7 @@ GetSharedImageManager()->Register( std::make_unique<TestSharedImageBacking>( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), - gfx::ColorSpace(), 0, &memory_tracker, kNewServiceId), + gfx::ColorSpace(), 0, 0, kNewServiceId), &memory_tracker); auto& cmd = *GetImmediateAs< @@ -3267,7 +3181,7 @@ GetSharedImageManager()->Register( std::make_unique<TestSharedImageBacking>( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), - gfx::ColorSpace(), 0, &memory_tracker, kNewServiceId), + gfx::ColorSpace(), 0, 0, kNewServiceId), &memory_tracker); auto& cmd = *GetImmediateAs< @@ -3290,7 +3204,7 @@ GetSharedImageManager()->Register( std::make_unique<TestSharedImageBacking>( mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), - gfx::ColorSpace(), 0, &memory_tracker, kNewServiceId), + gfx::ColorSpace(), 0, 0, kNewServiceId), &memory_tracker); auto& cmd = *GetImmediateAs< @@ -3346,12 +3260,14 @@ // Create a shared image. MemoryTypeTracker memory_tracker(memory_tracker_.get()); Mailbox mailbox = Mailbox::GenerateForSharedImage(); + auto shared_image_backing = std::make_unique<TestSharedImageBacking>( + mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), + gfx::ColorSpace(), 0, 0, kNewServiceId); + // Set the shared image to fail BeginAccess. + shared_image_backing->set_can_access(false); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - GetSharedImageManager()->Register( - std::make_unique<TestSharedImageBacking>( - mailbox, viz::ResourceFormat::RGBA_8888, gfx::Size(10, 10), - gfx::ColorSpace(), 0, &memory_tracker, kNewServiceId), - &memory_tracker); + GetSharedImageManager()->Register(std::move(shared_image_backing), + &memory_tracker); auto& cmd = *GetImmediateAs< cmds::CreateAndTexStorage2DSharedImageINTERNALImmediate>(); @@ -3361,12 +3277,6 @@ // Try to begin access with a shared image representation that fails // BeginAccess. - auto* texture_ref = group().texture_manager()->GetTexture(kNewClientId); - ASSERT_NE(texture_ref, nullptr); - ASSERT_NE(texture_ref->shared_image(), nullptr); - static_cast<TestSharedImageBacking::TestSharedImageRepresentation*>( - texture_ref->shared_image()) - ->set_can_access(false); cmds::BeginSharedImageAccessDirectCHROMIUM read_access_cmd; read_access_cmd.Init(kNewClientId, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); EXPECT_EQ(error::kNoError, ExecuteCmd(read_access_cmd));
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index bad24eca..6ab2f00 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -429,6 +429,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const volatile GLbyte* mailboxes); void DoCopySubTextureINTERNALGLPassthrough(GLint xoffset, GLint yoffset, @@ -436,6 +438,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox); void DoCopySubTextureINTERNALGL(GLint xoffset, @@ -444,6 +448,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox); void DoCopySubTextureINTERNALSkia(GLint xoffset, @@ -452,6 +458,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox); void DoLoseContextCHROMIUM(GLenum current, GLenum other) { NOTIMPLEMENTED(); } @@ -1725,6 +1733,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const volatile GLbyte* mailboxes) { Mailbox source_mailbox = Mailbox::FromVolatile( reinterpret_cast<const volatile Mailbox*>(mailboxes)[0]); @@ -1744,12 +1754,15 @@ if (!shared_context_state_->GrContextIsGL()) { // Use Skia to copy texture if raster's gr_context() is not using GL. DoCopySubTextureINTERNALSkia(xoffset, yoffset, x, y, width, height, + unpack_flip_y, unpack_premultiply_alpha, source_mailbox, dest_mailbox); } else if (use_passthrough_) { - DoCopySubTextureINTERNALGLPassthrough(xoffset, yoffset, x, y, width, height, - source_mailbox, dest_mailbox); + DoCopySubTextureINTERNALGLPassthrough( + xoffset, yoffset, x, y, width, height, unpack_flip_y, + unpack_premultiply_alpha, source_mailbox, dest_mailbox); } else { DoCopySubTextureINTERNALGL(xoffset, yoffset, x, y, width, height, + unpack_flip_y, unpack_premultiply_alpha, source_mailbox, dest_mailbox); } } @@ -1761,6 +1774,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox) { DCHECK(source_mailbox != dest_mailbox); @@ -1822,8 +1837,8 @@ api()->glCopySubTextureCHROMIUMFn( source_texture->service_id(), /*source_level=*/0, dest_texture->target(), dest_texture->service_id(), - /*dest_level=*/0, xoffset, yoffset, x, y, width, height, - /*unpack_flip_y=*/false, /*unpack_premultiply_alpha=*/false, + /*dest_level=*/0, xoffset, yoffset, x, y, width, height, unpack_flip_y, + unpack_premultiply_alpha, /*unpack_unmultiply_alpha=*/false); LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTexture"); @@ -1839,6 +1854,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox) { DCHECK(source_mailbox != dest_mailbox); @@ -2003,8 +2020,7 @@ source_internal_format, dest_target, dest_texture->service_id(), dest_level, dest_internal_format, xoffset, yoffset, x, y, width, height, dest_size.width(), dest_size.height(), source_size.width(), - source_size.height(), false /* unpack_flip_y */, - false /* unpack_premultiply_alpha */, + source_size.height(), unpack_flip_y, unpack_premultiply_alpha, false /* unpack_unmultiply_alpha */, false /* dither */, transform_matrix, copy_tex_image_blit_.get()); dest_texture->SetLevelClearedRect(dest_target, dest_level, @@ -2015,9 +2031,9 @@ gles2::CopyTextureMethod method = GetCopyTextureCHROMIUMMethod( GetFeatureInfo(), source_target, source_level, source_internal_format, - source_type, dest_target, dest_level, dest_internal_format, - false /* unpack_flip_y */, false /* unpack_premultiply_alpha */, - false /* unpack_unmultiply_alpha */, false /* dither */); + source_type, dest_target, dest_level, dest_internal_format, unpack_flip_y, + unpack_premultiply_alpha, false /* unpack_unmultiply_alpha */, + false /* dither */); #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, // although opposite in Android. @@ -2037,9 +2053,9 @@ source_internal_format, dest_target, dest_texture->service_id(), dest_level, dest_internal_format, xoffset, yoffset, x, y, width, height, dest_size.width(), dest_size.height(), source_size.width(), - source_size.height(), false /* unpack_flip_y */, - false /* unpack_premultiply_alpha */, false /* unpack_unmultiply_alpha */, - false /* dither */, method, copy_tex_image_blit_.get()); + source_size.height(), unpack_flip_y, unpack_premultiply_alpha, + false /* unpack_unmultiply_alpha */, false /* dither */, method, + copy_tex_image_blit_.get()); dest_texture->SetLevelClearedRect(dest_target, dest_level, new_cleared_rect); in_copy_sub_texture_ = false; if (reset_texture_state_) { @@ -2065,6 +2081,8 @@ GLint y, GLsizei width, GLsizei height, + GLboolean unpack_flip_y, + GLboolean unpack_premultiply_alpha, const Mailbox& source_mailbox, const Mailbox& dest_mailbox) { DCHECK(source_mailbox != dest_mailbox); @@ -2143,14 +2161,24 @@ } else { auto color_type = viz::ResourceFormatToClosestSkColorType( true /* gpu_compositing */, source_shared_image->format()); + + // TODO(http://crbug.com/1034086): We should initialize alpha_type and + // origin using metadata stored with the shared image. + SkAlphaType alpha_type = kPremul_SkAlphaType; + if (unpack_premultiply_alpha) + alpha_type = kUnpremul_SkAlphaType; auto source_image = SkImage::MakeFromTexture( shared_context_state_->gr_context(), source_scoped_access->promise_image_texture()->backendTexture(), - kTopLeft_GrSurfaceOrigin, color_type, kUnpremul_SkAlphaType, + kTopLeft_GrSurfaceOrigin, color_type, alpha_type, nullptr /* colorSpace */); auto* canvas = dest_scoped_access->surface()->getCanvas(); SkPaint paint; + if (unpack_flip_y) { + canvas->scale(1, -1); + canvas->translate(0, -height); + } paint.setBlendMode(SkBlendMode::kSrc); canvas->drawImageRect(source_image, gfx::RectToSkRect(source_rect), gfx::RectToSkRect(dest_rect), &paint);
diff --git a/gpu/command_buffer/service/raster_decoder_autogen.h b/gpu/command_buffer/service/raster_decoder_autogen.h index 1a0c03a2..ea83f08 100644 --- a/gpu/command_buffer/service/raster_decoder_autogen.h +++ b/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -268,6 +268,9 @@ GLint y = static_cast<GLint>(c.y); GLsizei width = static_cast<GLsizei>(c.width); GLsizei height = static_cast<GLsizei>(c.height); + GLboolean unpack_flip_y = static_cast<GLboolean>(c.unpack_flip_y); + GLboolean unpack_premultiply_alpha = + static_cast<GLboolean>(c.unpack_premultiply_alpha); uint32_t mailboxes_size; if (!gles2::GLES2Util::ComputeDataSize<GLbyte, 32>(1, &mailboxes_size)) { return error::kOutOfBounds; @@ -291,7 +294,8 @@ if (mailboxes == nullptr) { return error::kOutOfBounds; } - DoCopySubTextureINTERNAL(xoffset, yoffset, x, y, width, height, mailboxes); + DoCopySubTextureINTERNAL(xoffset, yoffset, x, y, width, height, unpack_flip_y, + unpack_premultiply_alpha, mailboxes); return error::kNoError; }
diff --git a/gpu/command_buffer/service/raster_decoder_unittest.cc b/gpu/command_buffer/service/raster_decoder_unittest.cc index 16c3191..425b7f6 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest.cc
@@ -187,7 +187,7 @@ // This will initialize the bottom right corner of destination. SetScopedTextureBinderExpectations(GL_TEXTURE_2D); auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(1, 1, 0, 0, 1, 1, mailboxes); + cmd.Init(1, 1, 0, 0, 1, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_EQ(dest_texture->GetLevelClearedRect(GL_TEXTURE_2D, 0), @@ -197,7 +197,7 @@ { // Dest rect outside of dest bounds auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(2, 2, 0, 0, 1, 1, mailboxes); + cmd.Init(2, 2, 0, 0, 1, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); EXPECT_EQ(dest_texture->GetLevelClearedRect(GL_TEXTURE_2D, 0), @@ -207,7 +207,7 @@ { // Source rect outside of source bounds auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(0, 0, 0, 0, 2, 2, mailboxes); + cmd.Init(0, 0, 0, 0, 2, 2, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); EXPECT_EQ(dest_texture->GetLevelClearedRect(GL_TEXTURE_2D, 0), @@ -234,7 +234,7 @@ { SetScopedTextureBinderExpectations(GL_TEXTURE_2D); auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(0, 0, 0, 0, 2, 1, mailboxes); + cmd.Init(0, 0, 0, 0, 2, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); } EXPECT_EQ(gfx::Rect(0, 0, 2, 1), representation->ClearedRect()); @@ -244,7 +244,7 @@ { SetScopedTextureBinderExpectations(GL_TEXTURE_2D); auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(0, 1, 0, 0, 2, 1, mailboxes); + cmd.Init(0, 1, 0, 0, 2, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); } EXPECT_TRUE(representation->IsCleared()); @@ -272,7 +272,7 @@ { SetScopedTextureBinderExpectations(GL_TEXTURE_2D); auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(0, 0, 0, 0, 2, 1, mailboxes); + cmd.Init(0, 0, 0, 0, 2, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); } EXPECT_EQ(gfx::Rect(0, 0, 2, 1), representation->ClearedRect()); @@ -283,7 +283,7 @@ // this will fail. { auto& cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); - cmd.Init(1, 1, 0, 0, 1, 1, mailboxes); + cmd.Init(1, 1, 0, 0, 1, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(mailboxes))); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } @@ -305,7 +305,7 @@ auto& copy_cmd = *GetImmediateAs<cmds::CopySubTextureINTERNALImmediate>(); GLbyte mailboxes[sizeof(gpu::Mailbox) * 2]; CopyMailboxes(mailboxes, client_texture_mailbox_, dest_texture_mailbox); - copy_cmd.Init(0, 0, 0, 0, 2, 1, mailboxes); + copy_cmd.Init(0, 0, 0, 0, 2, 1, false, false, mailboxes); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(copy_cmd, sizeof(mailboxes))); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); }
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc index 2ce7098..6e7db40 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -475,7 +475,7 @@ return; GlLegacySharedImage gl_legacy_shared_image{ - backing_factory_.get(), true /* is_thread_safe */, + backing_factory_.get(), false /* is_thread_safe */, &mailbox_manager_, &shared_image_manager_, memory_type_tracker_.get(), shared_image_representation_factory_.get()}; @@ -552,24 +552,31 @@ EXPECT_TRUE(backing_->IsCleared()); } - // First, validate via a legacy mailbox. GLenum expected_target = GL_TEXTURE_2D; - EXPECT_TRUE(backing_->ProduceLegacyMailbox(mailbox_manager_)); - TextureBase* texture_base = mailbox_manager_->ConsumeTexture(mailbox_); + // First, validate via a legacy mailbox (only available when not + // |is_thread_safe|). + if (!is_thread_safe) { + EXPECT_TRUE(backing_->ProduceLegacyMailbox(mailbox_manager_)); - // Currently there is no support for passthrough texture on android and hence - // in AHB backing. So the TextureBase* should be pointing to a Texture object. - auto* texture = gles2::Texture::CheckedCast(texture_base); - EXPECT_TRUE(texture); - EXPECT_EQ(texture->target(), expected_target); - EXPECT_TRUE(texture->IsImmutable()); - int width, height, depth; - bool has_level = - texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height, &depth); - EXPECT_TRUE(has_level); - EXPECT_EQ(width, size_.width()); - EXPECT_EQ(height, size_.height()); + TextureBase* texture_base = mailbox_manager_->ConsumeTexture(mailbox_); + + // Currently there is no support for passthrough texture on android and + // hence in AHB backing. So the TextureBase* should be pointing to a Texture + // object. + auto* texture = gles2::Texture::CheckedCast(texture_base); + EXPECT_TRUE(texture); + EXPECT_EQ(texture->target(), expected_target); + EXPECT_TRUE(texture->IsImmutable()); + int width, height, depth; + bool has_level = + texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height, &depth); + EXPECT_TRUE(has_level); + EXPECT_EQ(width, size_.width()); + EXPECT_EQ(height, size_.height()); + } else { + EXPECT_FALSE(backing_->ProduceLegacyMailbox(mailbox_manager_)); + } shared_image_ = shared_image_manager->Register(std::move(backing_), memory_type_tracker);
diff --git a/gpu/command_buffer/service/shared_image_manager_unittest.cc b/gpu/command_buffer/service/shared_image_manager_unittest.cc index cd10ac8..e068fe28 100644 --- a/gpu/command_buffer/service/shared_image_manager_unittest.cc +++ b/gpu/command_buffer/service/shared_image_manager_unittest.cc
@@ -11,6 +11,7 @@ #include "gpu/command_buffer/service/service_utils.h" #include "gpu/command_buffer/service/shared_image_backing.h" #include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/test_shared_image_backing.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/command_buffer/tests/texture_image_factory.h" #include "gpu/config/gpu_driver_bug_workarounds.h" @@ -24,53 +25,9 @@ #include "ui/gl/gl_surface.h" #include "ui/gl/init/gl_factory.h" -using ::testing::Return; -using ::testing::StrictMock; - namespace gpu { namespace { -class MockSharedImageRepresentationGLTexture - : public SharedImageRepresentationGLTexture { - public: - MockSharedImageRepresentationGLTexture(SharedImageManager* manager, - SharedImageBacking* backing, - MemoryTypeTracker* tracker) - : SharedImageRepresentationGLTexture(manager, backing, tracker) {} - - MOCK_METHOD0(GetTexture, gles2::Texture*()); -}; - -class MockSharedImageBacking : public SharedImageBacking { - public: - MockSharedImageBacking(const Mailbox& mailbox, - viz::ResourceFormat format, - const gfx::Size& size, - const gfx::ColorSpace& color_space, - uint32_t usage, - size_t estimated_size) - : SharedImageBacking(mailbox, - format, - size, - color_space, - usage, - estimated_size, - false /* is_thread_safe */) {} - - MOCK_CONST_METHOD0(ClearedRect, gfx::Rect()); - MOCK_METHOD1(SetClearedRect, void(const gfx::Rect&)); - MOCK_METHOD1(Update, void(std::unique_ptr<gfx::GpuFence>)); - MOCK_METHOD1(ProduceLegacyMailbox, bool(MailboxManager*)); - - private: - std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( - SharedImageManager* manager, - MemoryTypeTracker* tracker) { - return std::make_unique<StrictMock<MockSharedImageRepresentationGLTexture>>( - manager, this, tracker); - } -}; - TEST(SharedImageManagerTest, BasicRefCounting) { const size_t kSizeBytes = 1024; SharedImageManager manager; @@ -82,10 +39,10 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); uint32_t usage = SHARED_IMAGE_USAGE_GLES2; - auto mock_backing = std::make_unique<StrictMock<MockSharedImageBacking>>( + auto backing = std::make_unique<TestSharedImageBacking>( mailbox, format, size, color_space, usage, kSizeBytes); - auto factory_ref = manager.Register(std::move(mock_backing), tracker.get()); + auto factory_ref = manager.Register(std::move(backing), tracker.get()); EXPECT_EQ(kSizeBytes, tracker->GetMemRepresented()); // Taking/releasing an additional ref/representation with the same tracker @@ -119,10 +76,10 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); uint32_t usage = SHARED_IMAGE_USAGE_GLES2; - auto mock_backing = std::make_unique<StrictMock<MockSharedImageBacking>>( + auto backing = std::make_unique<TestSharedImageBacking>( mailbox, format, size, color_space, usage, kSizeBytes); - auto factory_ref = manager.Register(std::move(mock_backing), tracker.get()); + auto factory_ref = manager.Register(std::move(backing), tracker.get()); EXPECT_EQ(kSizeBytes, tracker->GetMemRepresented()); // Take an additional ref/representation. @@ -148,10 +105,10 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); uint32_t usage = SHARED_IMAGE_USAGE_GLES2; - auto mock_backing = std::make_unique<StrictMock<MockSharedImageBacking>>( + auto backing = std::make_unique<TestSharedImageBacking>( mailbox, format, size, color_space, usage, kSizeBytes); - auto factory_ref = manager.Register(std::move(mock_backing), tracker.get()); + auto factory_ref = manager.Register(std::move(backing), tracker.get()); EXPECT_EQ(kSizeBytes, tracker->GetMemRepresented()); // Take an additional ref/representation with a new tracker. Memory should
diff --git a/gpu/command_buffer/service/test_shared_image_backing.cc b/gpu/command_buffer/service/test_shared_image_backing.cc new file mode 100644 index 0000000..62fac229 --- /dev/null +++ b/gpu/command_buffer/service/test_shared_image_backing.cc
@@ -0,0 +1,149 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/test_shared_image_backing.h" +#include "components/viz/common/resources/resource_format_utils.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "third_party/skia/include/gpu/GrBackendSurface.h" +#include "third_party/skia/include/gpu/mock/GrMockTypes.h" + +namespace gpu { +namespace { +class TestSharedImageRepresentationGLTexture + : public SharedImageRepresentationGLTexture { + public: + TestSharedImageRepresentationGLTexture(SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + gles2::Texture* texture) + : SharedImageRepresentationGLTexture(manager, backing, tracker), + texture_(texture) {} + + gles2::Texture* GetTexture() override { return texture_; } + bool BeginAccess(GLenum mode) override { + return static_cast<TestSharedImageBacking*>(backing())->can_access(); + } + + private: + gles2::Texture* const texture_; +}; + +class TestSharedImageRepresentationGLTexturePassthrough + : public SharedImageRepresentationGLTexturePassthrough { + public: + TestSharedImageRepresentationGLTexturePassthrough( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + scoped_refptr<gles2::TexturePassthrough> texture) + : SharedImageRepresentationGLTexturePassthrough(manager, + backing, + tracker), + texture_(std::move(texture)) {} + + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() + override { + return texture_; + } + bool BeginAccess(GLenum mode) override { + return static_cast<TestSharedImageBacking*>(backing())->can_access(); + } + + private: + const scoped_refptr<gles2::TexturePassthrough> texture_; +}; + +} // namespace + +TestSharedImageBacking::TestSharedImageBacking( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size, + GLuint texture_id) + : SharedImageBacking(mailbox, + format, + size, + color_space, + usage, + estimated_size, + false /* is_thread_safe */), + service_id_(texture_id) { + texture_ = new gles2::Texture(service_id_); + texture_->SetLightweightRef(); + texture_->SetTarget(GL_TEXTURE_2D, 1); + texture_->sampler_state_.min_filter = GL_LINEAR; + texture_->sampler_state_.mag_filter = GL_LINEAR; + texture_->sampler_state_.wrap_s = GL_CLAMP_TO_EDGE; + texture_->sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; + texture_->SetLevelInfo(GL_TEXTURE_2D, 0, GLInternalFormat(format), + size.width(), size.height(), 1, 0, + GLDataFormat(format), GLDataType(format), gfx::Rect()); + texture_->SetImmutable(true, true); + texture_passthrough_ = base::MakeRefCounted<gles2::TexturePassthrough>( + service_id_, GL_TEXTURE_2D); +} + +TestSharedImageBacking::TestSharedImageBacking( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size) + : TestSharedImageBacking(mailbox, + format, + size, + color_space, + usage, + estimated_size, + 203 /* texture_id */) { + // Using a dummy |texture_id|, so lose our context so we don't do anything + // real with it. + OnContextLost(); +} + +TestSharedImageBacking::~TestSharedImageBacking() { + // Pretend our context is lost to avoid actual cleanup in |texture_| or + // |passthrough_texture_|. + texture_->RemoveLightweightRef(false /* have_context */); + texture_passthrough_->MarkContextLost(); + texture_passthrough_.reset(); + + if (have_context()) + glDeleteTextures(1, &service_id_); +} + +gfx::Rect TestSharedImageBacking::ClearedRect() const { + return texture_->GetLevelClearedRect(texture_->target(), 0); +} + +void TestSharedImageBacking::SetClearedRect(const gfx::Rect& cleared_rect) { + texture_->SetLevelClearedRect(texture_->target(), 0, cleared_rect); +} + +bool TestSharedImageBacking::ProduceLegacyMailbox( + MailboxManager* mailbox_manager) { + return false; +} + +std::unique_ptr<SharedImageRepresentationGLTexture> +TestSharedImageBacking::ProduceGLTexture(SharedImageManager* manager, + MemoryTypeTracker* tracker) { + return std::make_unique<TestSharedImageRepresentationGLTexture>( + manager, this, tracker, texture_); +} + +std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> +TestSharedImageBacking::ProduceGLTexturePassthrough( + SharedImageManager* manager, + MemoryTypeTracker* tracker) { + return std::make_unique<TestSharedImageRepresentationGLTexturePassthrough>( + manager, this, tracker, texture_passthrough_); +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/test_shared_image_backing.h b/gpu/command_buffer/service/test_shared_image_backing.h new file mode 100644 index 0000000..93540b8 --- /dev/null +++ b/gpu/command_buffer/service/test_shared_image_backing.h
@@ -0,0 +1,64 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_TEST_SHARED_IMAGE_BACKING_H_ +#define GPU_COMMAND_BUFFER_SERVICE_TEST_SHARED_IMAGE_BACKING_H_ + +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/command_buffer/service/texture_manager.h" + +namespace gpu { + +// Test implementation of a gles2::Texture backed backing. +class TestSharedImageBacking : public SharedImageBacking { + public: + // Constructor which uses a dummy GL texture ID for the backing. + TestSharedImageBacking(const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size); + // Constructor which uses a provided GL texture ID for the backing. + TestSharedImageBacking(const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size, + GLuint texture_id); + ~TestSharedImageBacking() override; + + gfx::Rect ClearedRect() const override; + void SetClearedRect(const gfx::Rect& cleared_rect) override; + void Update(std::unique_ptr<gfx::GpuFence> in_fence) override {} + bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override; + void OnMemoryDump(const std::string& dump_name, + base::trace_event::MemoryAllocatorDump* dump, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override {} + + // Helper functions + GLuint service_id() const { return service_id_; } + void set_can_access(bool can_access) { can_access_ = can_access; } + bool can_access() const { return can_access_; } + + protected: + std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( + SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> + ProduceGLTexturePassthrough(SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + + private: + const GLuint service_id_ = 0; + gles2::Texture* texture_ = nullptr; + scoped_refptr<gles2::TexturePassthrough> texture_passthrough_; + bool can_access_ = true; +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_TEST_SHARED_IMAGE_BACKING_H_
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index 47302b6..aaf1090 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h
@@ -53,6 +53,7 @@ class SharedImageVideo; class StreamTexture; class SharedImageBackingFactoryD3D; +class TestSharedImageBacking; namespace gles2 { class GLStreamTextureImage; @@ -448,12 +449,12 @@ friend class gpu::SharedImageRepresentationGLTextureIOSurface; friend class gpu::SharedImageRepresentationSkiaIOSurface; friend class gpu::StreamTexture; + friend class gpu::TestSharedImageBacking; friend class AbstractTextureImplOnSharedContext; friend class TextureDefinition; friend class TextureManager; friend class TextureRef; friend class TextureTestHelper; - friend class TestSharedImageBacking; FRIEND_TEST_ALL_PREFIXES(TextureMemoryTrackerTest, LightweightRef); ~Texture() override;
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn index d954e1a..d30bf86 100644 --- a/gpu/config/BUILD.gn +++ b/gpu/config/BUILD.gn
@@ -186,6 +186,7 @@ ":process_json", "//base", "//build:branding_buildflags", + "//build:chromecast_buildflags", "//gpu/ipc/common:gpu_preferences_interface", "//gpu/vulkan:buildflags", "//media:media_buildflags",
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index f6c6032..14156bee 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -3490,6 +3490,22 @@ "features": [ "force_low_power_gpu" ] + }, + { + "id": 327, + "cr_bugs": [1027981], + "description": "Disable dual source blending support", + "os": { + "type": "macosx", + "version": { + "op": "<", + "value": "10.14" + } + }, + "gl_vendor": "Intel.*", + "features": [ + "disable_dual_source_blending_support" + ] } ] }
diff --git a/gpu/config/gpu_info_collector_linux.cc b/gpu/config/gpu_info_collector_linux.cc index 2ecc1922..86b76f97 100644 --- a/gpu/config/gpu_info_collector_linux.cc +++ b/gpu/config/gpu_info_collector_linux.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "base/trace_event/trace_event.h" +#include "build/build_config.h" +#include "build/chromecast_buildflags.h" #include "gpu/config/gpu_info_collector.h" #include "third_party/angle/src/gpu_info_util/SystemInfo.h" @@ -13,6 +15,13 @@ TRACE_EVENT0("gpu", "gpu_info_collector::CollectGraphicsInfo"); +#if BUILDFLAG(IS_CHROMECAST) + // Chromecast doesn't go through CollectBasicGraphicsInfo() step, so + // this is the only place we need to set machine model. + // TODO(zmo): maybe distinguish different Chromecast products. + gpu_info->machine_model_name = "Chromecast"; +#endif // IS_CHROMECAST + return CollectGraphicsInfoGL(gpu_info); }
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt index 5721bed..a164fe5 100644 --- a/gpu/config/gpu_workaround_list.txt +++ b/gpu/config/gpu_workaround_list.txt
@@ -118,3 +118,4 @@ prefer_draw_to_copy remove_dynamic_indexing_of_swizzled_vector do_extra_flush_around_bindframebuffer +disable_dual_source_blending_support
diff --git a/gpu/config/process_json.py b/gpu/config/process_json.py index 1c52768..755ecc19 100755 --- a/gpu/config/process_json.py +++ b/gpu/config/process_json.py
@@ -265,6 +265,7 @@ data_file, data_helper_file): model_name_var_name = None if machine_model_name: + assert isinstance(machine_model_name, list) model_name_var_name = 'kMachineModelNameForEntry' + str(entry_id) if is_exception: model_name_var_name += 'Exception' + str(exception_id)
diff --git a/gpu/config/software_rendering_list.json b/gpu/config/software_rendering_list.json index 837bb8dd..e75c66b7 100644 --- a/gpu/config/software_rendering_list.json +++ b/gpu/config/software_rendering_list.json
@@ -335,10 +335,15 @@ { "id": 48, "description": "Accelerated video decode is unavailable on Linux", - "cr_bugs": [137247], + "cr_bugs": [137247, 1032907], "os": { "type": "linux" }, + "exceptions": [ + { + "machine_model_name": ["Chromecast"] + } + ], "features": [ "accelerated_video_decode" ]
diff --git a/gpu/ipc/service/gpu_watchdog_thread.cc b/gpu/ipc/service/gpu_watchdog_thread.cc index 675e43dc..a007fe4a 100644 --- a/gpu/ipc/service/gpu_watchdog_thread.cc +++ b/gpu/ipc/service/gpu_watchdog_thread.cc
@@ -401,6 +401,7 @@ // Don't crash if we're not on the TTY of our host X11 server. int active_tty = GetActiveTTY(); if (host_tty_ != -1 && active_tty != -1 && host_tty_ != active_tty) { + OnAcknowledge(); return; } #endif
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star index 32b44479..a6dc301 100644 --- a/infra/config/buckets/ci.star +++ b/infra/config/buckets/ci.star
@@ -1453,6 +1453,10 @@ name = 'Linux FYI GPU TSAN Release', ) +# Builder + tester. +gpu_fyi_linux_builder( + name = 'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)', +) # Many of the GPU testers are thin testers, they use linux VMS regardless of the # actual OS that the tests are built for
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star index f2c8c1fc..dbe211a 100644 --- a/infra/config/buckets/try.star +++ b/infra/config/buckets/try.star
@@ -742,6 +742,10 @@ ) gpu_linux_builder( + name = 'gpu-fyi-try-linux-intel-sk-dawn-rel', +) + +gpu_linux_builder( name = 'gpu-fyi-try-linux-intel-skv', )
diff --git a/infra/config/consoles/chromium.gpu.fyi.star b/infra/config/consoles/chromium.gpu.fyi.star index 67e1af9..1ae9f9d 100644 --- a/infra/config/consoles/chromium.gpu.fyi.star +++ b/infra/config/consoles/chromium.gpu.fyi.star
@@ -304,6 +304,11 @@ short_name = 'dqp', ), luci.console_view_entry( + builder = 'ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)', + category = 'Linux|Intel', + short_name = 'skd', + ), + luci.console_view_entry( builder = 'ci/Linux FYI SkiaRenderer Vulkan (Intel HD 630)', category = 'Linux|Intel', short_name = 'skv',
diff --git a/infra/config/consoles/tryserver.chromium.linux.star b/infra/config/consoles/tryserver.chromium.linux.star index bb543d9..dea824cea 100644 --- a/infra/config/consoles/tryserver.chromium.linux.star +++ b/infra/config/consoles/tryserver.chromium.linux.star
@@ -16,6 +16,7 @@ 'try/gpu-fyi-try-linux-intel-dqp', 'try/gpu-fyi-try-linux-intel-exp', 'try/gpu-fyi-try-linux-intel-rel', + 'try/gpu-fyi-try-linux-intel-sk-dawn-rel', 'try/gpu-fyi-try-linux-intel-skv', 'try/gpu-fyi-try-linux-nvidia-dbg', 'try/gpu-fyi-try-linux-nvidia-dqp',
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 4681ae2..08872a2 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -406,6 +406,10 @@ includable_only: true > builders: < + name: "chromium/try/gpu-fyi-try-linux-intel-sk-dawn-rel" + includable_only: true + > + builders: < name: "chromium/try/gpu-fyi-try-linux-intel-skv" includable_only: true >
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 61be274..dd51f79 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -2878,6 +2878,27 @@ service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" > builders: < + name: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu.fyi\"" + > + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < name: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -13576,6 +13597,34 @@ > > builders: < + name: "gpu-fyi-try-linux-intel-sk-dawn-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:gpu-fyi-try-linux-intel-sk-dawn-rel" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < name: "gpu-fyi-try-linux-intel-skv" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index 4f44eb17..43fdfde 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -6432,6 +6432,11 @@ short_name: "dqp" > builders: < + name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + category: "Linux|Intel" + short_name: "skd" + > + builders: < name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Vulkan (Intel HD 630)" category: "Linux|Intel" short_name: "skv" @@ -12406,6 +12411,9 @@ name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-rel" > builders: < + name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-sk-dawn-rel" + > + builders: < name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-skv" > builders: <
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index e3fa5a6..ec2fc20 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -202,6 +202,7 @@ triggers: "Linux ChromiumOS Full" triggers: "Linux ChromiumOS MSan Builder" triggers: "Linux FYI GPU TSAN Release" + triggers: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" triggers: "Linux MSan Builder" triggers: "Linux TSan Builder" triggers: "Linux Viz" @@ -2768,6 +2769,17 @@ } } +# Builder + tester +job { + id: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + acl_sets: "default" + buildbucket: { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + } +} + job { id: "Linux TSan Builder" acl_sets: "default"
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg index e3fa5a6..ec2fc20 100644 --- a/infra/config/luci-scheduler.cfg +++ b/infra/config/luci-scheduler.cfg
@@ -202,6 +202,7 @@ triggers: "Linux ChromiumOS Full" triggers: "Linux ChromiumOS MSan Builder" triggers: "Linux FYI GPU TSAN Release" + triggers: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" triggers: "Linux MSan Builder" triggers: "Linux TSan Builder" triggers: "Linux Viz" @@ -2768,6 +2769,17 @@ } } +# Builder + tester +job { + id: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + acl_sets: "default" + buildbucket: { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" + } +} + job { id: "Linux TSan Builder" acl_sets: "default"
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 7fcec59..92ac711 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -63,7 +63,7 @@ <translation id="1674504678466460478"><ph name="SOURCE_LANGUAGE" /> kwenda <ph name="TARGET_LANGUAGE" /></translation> <translation id="168715261339224929">Ili upate alamisho kwenye vifaa vyako vyote, washa usawazishaji.</translation> <translation id="1687475363370981210">Tia Alama kuwa Umesoma Zote</translation> -<translation id="1690731385917361335">Hakuna vipengee</translation> +<translation id="1690731385917361335">Hakuna chochote</translation> <translation id="1692118695553449118">Usawazishajii umewashwa</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> vimechaguliwa</translation> <translation id="1740468249224277719">Gusa mara mbili ili usakinishe.</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 20393573..5048761 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -498,9 +498,6 @@ flag_descriptions::kAutofillPruneSuggestionsName, flag_descriptions::kAutofillPruneSuggestionsDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(autofill::features::kAutofillPruneSuggestions)}, - {"language-settings", flag_descriptions::kLanguageSettingsName, - flag_descriptions::kLanguageSettingsDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kLanguageSettings)}, {"toolbar-new-tab-button", flag_descriptions::kToolbarNewTabButtonName, flag_descriptions::kToolbarNewTabButtonDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kToolbarNewTabButton)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index adc09925..a787fbf 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -248,11 +248,6 @@ "an individual promotion causes that promotion but no other promotions to " "occur."; -const char kLanguageSettingsName[] = "Language Settings"; -const char kLanguageSettingsDescription[] = - "Enables the Language Settings page allowing modifications to user " - "preferred languages and translate preferences."; - const char kLockBottomToolbarName[] = "Lock bottom toolbar"; const char kLockBottomToolbarDescription[] = "When enabled, the bottom toolbar will not get collapsed when scrolling "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index a9b8912..87cdc63 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -213,10 +213,6 @@ extern const char kInProductHelpDemoModeName[]; extern const char kInProductHelpDemoModeDescription[]; -// Title and description for the flag to enable the language settings page. -extern const char kLanguageSettingsName[]; -extern const char kLanguageSettingsDescription[]; - // Title and description for the flag to lock the bottom toolbar into place. extern const char kLockBottomToolbarName[]; extern const char kLockBottomToolbarDescription[];
diff --git a/ios/chrome/browser/infobars/BUILD.gn b/ios/chrome/browser/infobars/BUILD.gn index 7d02be3..decc46d 100644 --- a/ios/chrome/browser/infobars/BUILD.gn +++ b/ios/chrome/browser/infobars/BUILD.gn
@@ -50,6 +50,8 @@ source_set("badge") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ + "infobar_badge_browser_agent.h", + "infobar_badge_browser_agent.mm", "infobar_badge_tab_helper.h", "infobar_badge_tab_helper.mm", "infobar_badge_tab_helper_delegate.h", @@ -58,9 +60,13 @@ ":badge_public", ":infobars", ":public", + "//ios/chrome/browser/main:public", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/common/infobars", "//ios/chrome/browser/ui/badges:public", "//ios/chrome/browser/ui/infobars:feature_flags", "//ios/chrome/browser/ui/infobars:infobars_ui", + "//ios/chrome/browser/web_state_list", "//ios/web", ] } @@ -84,6 +90,7 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ + "infobar_badge_browser_agent_unittest.mm", "infobar_badge_tab_helper_unittest.mm", ] deps = [ @@ -92,14 +99,23 @@ "//base/test:test_support", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/infobars:public", + "//ios/chrome/browser/infobars/overlays:test_support", + "//ios/chrome/browser/infobars/test", + "//ios/chrome/browser/main", + "//ios/chrome/browser/main:test_support", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/common/infobars", + "//ios/chrome/browser/overlays/test", "//ios/chrome/browser/ui/badges:public", "//ios/chrome/browser/ui/infobars:feature_flags", "//ios/chrome/browser/ui/infobars:infobars_ui", "//ios/chrome/browser/ui/infobars:test_support", - "//ios/chrome/browser/ui/infobars:test_support", "//ios/chrome/browser/ui/infobars/coordinators", "//ios/chrome/browser/ui/infobars/test", + "//ios/chrome/browser/web_state_list", + "//ios/chrome/browser/web_state_list:test_support", "//ios/chrome/test:test_support", + "//ios/web/public/test", "//ios/web/public/test/fakes", "//testing/gtest", ]
diff --git a/ios/chrome/browser/infobars/infobar_badge_browser_agent.h b/ios/chrome/browser/infobars/infobar_badge_browser_agent.h new file mode 100644 index 0000000..8295a3f6 --- /dev/null +++ b/ios/chrome/browser/infobars/infobar_badge_browser_agent.h
@@ -0,0 +1,62 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_BADGE_BROWSER_AGENT_H_ +#define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_BADGE_BROWSER_AGENT_H_ + +#include "base/scoped_observer.h" +#import "ios/chrome/browser/infobars/infobar_type.h" +#include "ios/chrome/browser/main/browser_user_data.h" +#include "ios/chrome/browser/overlays/public/overlay_presenter.h" +#include "ios/chrome/browser/overlays/public/overlay_presenter_observer.h" + +class InfobarBadgeTabHelper; +namespace web { +class WebState; +} + +// Browser agent that updates InfobarTabHelpers for observed infobar overlay +// events. +class InfobarBadgeBrowserAgent + : public BrowserUserData<InfobarBadgeBrowserAgent> { + public: + ~InfobarBadgeBrowserAgent() override; + + private: + BROWSER_USER_DATA_KEY_DECL(); + friend class BrowserUserData<InfobarBadgeBrowserAgent>; + explicit InfobarBadgeBrowserAgent(Browser* browser); + + // Returns the badge tab helper for the active WebState. + InfobarBadgeTabHelper* GetBadgeCurrentTabHelper() const; + + // Called when the banner UI for |request| was presented or dismissed. + void OnInfobarBannerPresented(OverlayRequest* request); + void OnInfobarBannerDismissed(OverlayRequest* request); + + // Helper object that observes the presentation of infobar overlays. + class InfobarOverlayObserver : public OverlayPresenterObserver { + public: + InfobarOverlayObserver(InfobarBadgeBrowserAgent* browser_agent, + Browser* browser); + ~InfobarOverlayObserver() override; + + private: + // OverlayPresenterObserver: + void DidShowOverlay(OverlayPresenter* presenter, + OverlayRequest* request) override; + void DidHideOverlay(OverlayPresenter* presenter, + OverlayRequest* request) override; + void OverlayPresenterDestroyed(OverlayPresenter* presenter) override; + + private: + ScopedObserver<OverlayPresenter, OverlayPresenterObserver> scoped_observer_; + InfobarBadgeBrowserAgent* browser_agent_; + }; + + InfobarOverlayObserver infobar_overlay_observer_; + WebStateList* web_state_list_ = nullptr; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_BADGE_BROWSER_AGENT_H_
diff --git a/ios/chrome/browser/infobars/infobar_badge_browser_agent.mm b/ios/chrome/browser/infobars/infobar_badge_browser_agent.mm new file mode 100644 index 0000000..ef302b7 --- /dev/null +++ b/ios/chrome/browser/infobars/infobar_badge_browser_agent.mm
@@ -0,0 +1,92 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/infobar_badge_browser_agent.h" + +#include "base/logging.h" +#include "ios/chrome/browser/infobars/infobar_badge_tab_helper.h" +#import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h" +#include "ios/chrome/browser/overlays/public/overlay_callback_manager.h" +#include "ios/chrome/browser/overlays/public/overlay_presenter.h" +#include "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { +// Returns the InfobarType used to configure |request|. |request| must be +// configured with an InfobarOverlayRequestConfig. +InfobarType GetInfobarType(OverlayRequest* request) { + return request->GetConfig<InfobarOverlayRequestConfig>()->infobar_type(); +} +} // namespace + +#pragma mark - InfobarBadgeBrowserAgent + +BROWSER_USER_DATA_KEY_IMPL(InfobarBadgeBrowserAgent) + +InfobarBadgeBrowserAgent::InfobarBadgeBrowserAgent(Browser* browser) + : infobar_overlay_observer_(this, browser), + web_state_list_(browser->GetWebStateList()) { + DCHECK(web_state_list_); +} + +InfobarBadgeBrowserAgent::~InfobarBadgeBrowserAgent() = default; + +InfobarBadgeTabHelper* InfobarBadgeBrowserAgent::GetBadgeCurrentTabHelper() + const { + if (web_state_list_->active_index() == WebStateList::kInvalidIndex) + return nullptr; + return InfobarBadgeTabHelper::FromWebState( + web_state_list_->GetActiveWebState()); +} + +void InfobarBadgeBrowserAgent::OnInfobarBannerPresented( + OverlayRequest* request) { + InfobarBadgeTabHelper* tab_helper = GetBadgeCurrentTabHelper(); + if (tab_helper) + tab_helper->UpdateBadgeForInfobarBannerPresented(GetInfobarType(request)); +} + +void InfobarBadgeBrowserAgent::OnInfobarBannerDismissed( + OverlayRequest* request) { + InfobarBadgeTabHelper* tab_helper = GetBadgeCurrentTabHelper(); + if (tab_helper) + tab_helper->UpdateBadgeForInfobarBannerDismissed(GetInfobarType(request)); +} + +#pragma mark - InfobarBadgeBrowserAgent::InfobarOverlayObserver + +InfobarBadgeBrowserAgent::InfobarOverlayObserver::InfobarOverlayObserver( + InfobarBadgeBrowserAgent* browser_agent, + Browser* browser) + : scoped_observer_(this), browser_agent_(browser_agent) { + DCHECK(browser_agent_); + scoped_observer_.Add( + OverlayPresenter::FromBrowser(browser, OverlayModality::kInfobarBanner)); + scoped_observer_.Add( + OverlayPresenter::FromBrowser(browser, OverlayModality::kInfobarModal)); +} + +InfobarBadgeBrowserAgent::InfobarOverlayObserver::~InfobarOverlayObserver() = + default; + +void InfobarBadgeBrowserAgent::InfobarOverlayObserver::DidShowOverlay( + OverlayPresenter* presenter, + OverlayRequest* request) { + browser_agent_->OnInfobarBannerPresented(request); +} + +void InfobarBadgeBrowserAgent::InfobarOverlayObserver::DidHideOverlay( + OverlayPresenter* presenter, + OverlayRequest* request) { + browser_agent_->OnInfobarBannerDismissed(request); +} + +void InfobarBadgeBrowserAgent::InfobarOverlayObserver:: + OverlayPresenterDestroyed(OverlayPresenter* presenter) { + scoped_observer_.Remove(presenter); +}
diff --git a/ios/chrome/browser/infobars/infobar_badge_browser_agent_unittest.mm b/ios/chrome/browser/infobars/infobar_badge_browser_agent_unittest.mm new file mode 100644 index 0000000..0e72d99 --- /dev/null +++ b/ios/chrome/browser/infobars/infobar_badge_browser_agent_unittest.mm
@@ -0,0 +1,189 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/infobar_badge_browser_agent.h" + +#import <Foundation/Foundation.h> +#include <map> + +#include "base/test/scoped_feature_list.h" +#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#include "ios/chrome/browser/infobars/infobar_badge_tab_helper.h" +#include "ios/chrome/browser/infobars/infobar_badge_tab_helper_delegate.h" +#include "ios/chrome/browser/infobars/infobar_manager_impl.h" +#import "ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h" +#import "ios/chrome/browser/infobars/test/fake_infobar_ios.h" +#import "ios/chrome/browser/main/test_browser.h" +#include "ios/chrome/browser/overlays/public/overlay_callback_manager.h" +#include "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_request_queue.h" +#include "ios/chrome/browser/overlays/public/overlay_response.h" +#include "ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h" +#import "ios/chrome/browser/ui/badges/badge_item.h" +#import "ios/chrome/browser/ui/badges/badge_type.h" +#import "ios/chrome/browser/ui/infobars/infobar_feature.h" +#import "ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h" +#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/chrome/browser/web_state_list/web_state_opener.h" +#import "ios/web/public/test/fakes/test_navigation_manager.h" +#import "ios/web/public/test/fakes/test_web_state.h" +#include "ios/web/public/test/web_task_environment.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using infobars::InfoBar; + +namespace { +// The InfobarType to use for the test. +const InfobarType kInfobarType = InfobarType::kInfobarTypePasswordSave; +// The BadgeType used for the test. +const BadgeType kBadgeType = BadgeType::kBadgeTypePasswordSave; +} // namespace + +#pragma mark - FakeInfobarTabHelperDelegate + +// Fake version of InfobarTabHelperDelegate to use in tests. +@interface FakeInfobarTabHelperDelegate + : NSObject <InfobarBadgeTabHelperDelegate> { + std::map<BadgeType, id<BadgeItem>> _badgeItems; +} +- (id<BadgeItem>)itemForBadgeType:(BadgeType)type; +@end + +@implementation FakeInfobarTabHelperDelegate + +- (void)addInfobarBadge:(id<BadgeItem>)badgeItem { + _badgeItems[badgeItem.badgeType] = badgeItem; +} + +- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem { + _badgeItems[badgeItem.badgeType] = nil; +} + +- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem { +} + +- (id<BadgeItem>)itemForBadgeType:(BadgeType)type { + return _badgeItems[type]; +} + +@end + +#pragma mark - InfobarBadgeBrowserAgentTest + +// Test fixture for InfobarBadgeBrowserAgent. +class InfobarBadgeBrowserAgentTest : public PlatformTest { + public: + InfobarBadgeBrowserAgentTest() + : web_state_list_(&web_state_list_delegate_), + tab_helper_delegate_([[FakeInfobarTabHelperDelegate alloc] init]) { + // Enable the UI reboot feature. + feature_list_.InitAndEnableFeature(kInfobarUIReboot); + // Create the Browser and set up the browser agent. + TestChromeBrowserState::Builder builder; + browser_state_ = builder.Build(); + browser_ = + std::make_unique<TestBrowser>(browser_state_.get(), &web_state_list_); + InfobarBadgeBrowserAgent::CreateForBrowser(browser_.get()); + // Create a WebState and add it to the Browser. + std::unique_ptr<web::TestWebState> passed_web_state = + std::make_unique<web::TestWebState>(); + passed_web_state->SetNavigationManager( + std::make_unique<web::TestNavigationManager>()); + web_state_ = passed_web_state.get(); + web_state_list_.InsertWebState(0, std::move(passed_web_state), + WebStateList::INSERT_ACTIVATE, + WebStateOpener()); + // Set up the WebState's InfoBarManager and InfobarBadgeTabHelper. + InfoBarManagerImpl::CreateForWebState(web_state_); + InfobarBadgeTabHelper::CreateForWebState(web_state_); + InfobarBadgeTabHelper::FromWebState(web_state_) + ->SetDelegate(tab_helper_delegate_); + // Set up the OverlayPresenter for OverlayModality::kInfobarBanner. + presenter()->SetPresentationContext(&presentation_context_); + } + + ~InfobarBadgeBrowserAgentTest() override { + presenter()->SetPresentationContext(nullptr); + } + + // Adds an InfoBar with |type| to the manager and returns the added infobar. + InfoBar* AddInfobar() { + std::unique_ptr<FakeInfobarIOS> passed_infobar = + std::make_unique<FakeInfobarIOS>(); + InfoBar* infobar = passed_infobar.get(); + passed_infobar->fake_ui_delegate().infobarType = kInfobarType; + passed_infobar->fake_ui_delegate().hasBadge = YES; + InfoBarManagerImpl::FromWebState(web_state_) + ->AddInfoBar(std::move(passed_infobar)); + return infobar; + } + + // Adds a fake banner OverlayRequest for |infobar|, adds it to queue(), and + // returns the added request. + OverlayRequest* AddOverlayRequest(InfoBar* infobar) { + FakeInfobarOverlayRequestFactory factory; + std::unique_ptr<OverlayRequest> passed_request = + factory.CreateInfobarRequest(infobar, InfobarOverlayType::kBanner); + OverlayRequest* request = passed_request.get(); + queue()->AddRequest(std::move(passed_request)); + return request; + } + + OverlayPresenter* presenter() const { + return OverlayPresenter::FromBrowser(browser_.get(), + OverlayModality::kInfobarBanner); + } + OverlayRequestQueue* queue() const { + return OverlayRequestQueue::FromWebState(web_state_, + OverlayModality::kInfobarBanner); + } + + protected: + base::test::ScopedFeatureList feature_list_; + web::WebTaskEnvironment task_environment_; + std::unique_ptr<ios::ChromeBrowserState> browser_state_; + FakeWebStateListDelegate web_state_list_delegate_; + WebStateList web_state_list_; + web::WebState* web_state_ = nullptr; + std::unique_ptr<Browser> browser_; + FakeOverlayPresentationContext presentation_context_; + FakeInfobarTabHelperDelegate* tab_helper_delegate_ = nil; +}; + +// Tests that the browser agent correctly updates the badge state to presented. +TEST_F(InfobarBadgeBrowserAgentTest, InfobarPresented) { + // Simulate the presentation of an infobar banner overlay and verify that the + // badge state gets updated to presented. + InfoBar* infobar = AddInfobar(); + OverlayRequest* request = AddOverlayRequest(infobar); + id<BadgeItem> badge = [tab_helper_delegate_ itemForBadgeType:kBadgeType]; + ASSERT_TRUE(badge); + ASSERT_EQ(FakeOverlayPresentationContext::PresentationState::kPresented, + presentation_context_.GetPresentationState(request)); + EXPECT_TRUE(badge.badgeState & BadgeStatePresented); +} + +// Tests that the browser agent correctly updates the badge state to dismissed. +TEST_F(InfobarBadgeBrowserAgentTest, InfobarDismissed) { + InfoBar* infobar = AddInfobar(); + OverlayRequest* request = AddOverlayRequest(infobar); + id<BadgeItem> badge = [tab_helper_delegate_ itemForBadgeType:kBadgeType]; + ASSERT_TRUE(badge); + ASSERT_EQ(FakeOverlayPresentationContext::PresentationState::kPresented, + presentation_context_.GetPresentationState(request)); + ASSERT_TRUE(badge.badgeState & BadgeStatePresented); + + // Simulate the dismissal of the infobar banner overlay and verify that the + // badge state gets updated to dismissed. + presentation_context_.SimulateDismissalForRequest( + request, OverlayDismissalReason::kUserInteraction); + EXPECT_FALSE(badge.badgeState & BadgeStatePresented); +} + +// TODO(crbug.com/1030357): Add tests for non-banners.
diff --git a/ios/chrome/browser/infobars/test/BUILD.gn b/ios/chrome/browser/infobars/test/BUILD.gn index 47b95f9..4567841 100644 --- a/ios/chrome/browser/infobars/test/BUILD.gn +++ b/ios/chrome/browser/infobars/test/BUILD.gn
@@ -17,6 +17,7 @@ "//base", "//components/infobars/core", "//ios/chrome/browser/infobars", + "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/ui/infobars/test", ] }
diff --git a/ios/chrome/browser/infobars/test/fake_infobar_ios.h b/ios/chrome/browser/infobars/test/fake_infobar_ios.h index 9103c68..d3b838e 100644 --- a/ios/chrome/browser/infobars/test/fake_infobar_ios.h +++ b/ios/chrome/browser/infobars/test/fake_infobar_ios.h
@@ -5,7 +5,10 @@ #ifndef IOS_CHROME_BROWSER_INFOBARS_TEST_FAKE_INFOBAR_IOS_H_ #define IOS_CHROME_BROWSER_INFOBARS_TEST_FAKE_INFOBAR_IOS_H_ +#include <memory> + #include "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/infobars/infobar_type.h" @class FakeInfobarUIDelegate; class FakeInfobarDelegate; @@ -16,6 +19,11 @@ FakeInfobarIOS(); ~FakeInfobarIOS() override; + // Creates a FakeInfobarIOS whose FakeInfobarUIDelegate's infobar type is + // |type|, optionally with badge support. + static std::unique_ptr<FakeInfobarIOS> Create(InfobarType type, + bool has_badge = false); + // The fake UI delegate. FakeInfobarUIDelegate* fake_ui_delegate() const { return fake_ui_delegate_; } // The fake InfoBarDelegate.
diff --git a/ios/chrome/browser/infobars/test/fake_infobar_ios.mm b/ios/chrome/browser/infobars/test/fake_infobar_ios.mm index a0bdc446..e77a377 100644 --- a/ios/chrome/browser/infobars/test/fake_infobar_ios.mm +++ b/ios/chrome/browser/infobars/test/fake_infobar_ios.mm
@@ -23,3 +23,12 @@ } FakeInfobarIOS::~FakeInfobarIOS() = default; + +// static +std::unique_ptr<FakeInfobarIOS> FakeInfobarIOS::Create(InfobarType type, + bool has_badge) { + std::unique_ptr<FakeInfobarIOS> infobar = std::make_unique<FakeInfobarIOS>(); + infobar->fake_ui_delegate().infobarType = type; + infobar->fake_ui_delegate().hasBadge = has_badge; + return infobar; +}
diff --git a/ios/chrome/browser/main/BUILD.gn b/ios/chrome/browser/main/BUILD.gn index f935638..be534e6 100644 --- a/ios/chrome/browser/main/BUILD.gn +++ b/ios/chrome/browser/main/BUILD.gn
@@ -36,6 +36,7 @@ "//ios/chrome/browser/sessions:session_service", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/infobars:feature_flags", "//ios/chrome/browser/web_state_list", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/main/browser_agent_util.mm b/ios/chrome/browser/main/browser_agent_util.mm index b997fb1e..88167d2 100644 --- a/ios/chrome/browser/main/browser_agent_util.mm +++ b/ios/chrome/browser/main/browser_agent_util.mm
@@ -4,6 +4,9 @@ #import "ios/chrome/browser/main/browser_agent_util.h" +#include "base/feature_list.h" +#import "ios/chrome/browser/infobars/infobar_badge_browser_agent.h" +#import "ios/chrome/browser/ui/infobars/infobar_feature.h" #import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -12,4 +15,8 @@ void AttachBrowserAgents(Browser* browser) { TabInsertionBrowserAgent::CreateForBrowser(browser); + + if (base::FeatureList::IsEnabled(kInfobarOverlayUI)) { + InfobarBadgeBrowserAgent::CreateForBrowser(browser); + } }
diff --git a/ios/chrome/browser/overlays/public/common/infobars/BUILD.gn b/ios/chrome/browser/overlays/public/common/infobars/BUILD.gn index bd27ef3e..7c62994 100644 --- a/ios/chrome/browser/overlays/public/common/infobars/BUILD.gn +++ b/ios/chrome/browser/overlays/public/common/infobars/BUILD.gn
@@ -16,8 +16,6 @@ "//base", "//components/infobars/core", "//ios/chrome/browser/infobars", - "//ios/chrome/browser/infobars", - "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/overlays", "//ios/chrome/browser/ui/infobars:infobars_ui",
diff --git a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.cc b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.cc index c2ae57e8..0e3f1ba 100644 --- a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.cc +++ b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.cc
@@ -85,8 +85,8 @@ OverlayDismissalCallback dismissal_callback) { FakeUIState& state = states_[request]; state.presentation_state = PresentationState::kPresented; - state.presentation_callback = std::move(presentation_callback); state.dismissal_callback = std::move(dismissal_callback); + std::move(presentation_callback).Run(); } void FakeOverlayPresentationContext::HideOverlayUI(OverlayPresenter* presenter,
diff --git a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h index d6dd7770..b8a00374 100644 --- a/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h +++ b/ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h
@@ -63,7 +63,6 @@ ~FakeUIState(); PresentationState presentation_state = PresentationState::kNotPresented; - OverlayPresentationCallback presentation_callback; OverlayDismissalCallback dismissal_callback; };
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index 817b66f..21d7518 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -389,7 +389,6 @@ "settings_accessibility_egtest.mm", "settings_egtest.mm", "signin_settings_egtest.mm", - "translate_ui_egtest.mm", ] deps = [ @@ -502,7 +501,6 @@ "settings_accessibility_egtest.mm", "settings_egtest.mm", "signin_settings_egtest.mm", - "translate_ui_egtest.mm", ] deps = [ ":eg_test_support+eg2",
diff --git a/ios/chrome/browser/ui/settings/content_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/content_settings_table_view_controller.mm index bc986dfd..60a9d7e 100644 --- a/ios/chrome/browser/ui/settings/content_settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/content_settings_table_view_controller.mm
@@ -9,16 +9,11 @@ #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" -#import "components/prefs/ios/pref_observer_bridge.h" -#include "components/prefs/pref_change_registrar.h" -#include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" -#include "components/translate/core/browser/translate_pref_names.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #import "ios/chrome/browser/ui/settings/block_popups_table_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" -#import "ios/chrome/browser/ui/settings/translate_table_view_controller.h" #import "ios/chrome/browser/ui/settings/utils/content_setting_backed_boolean.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" @@ -40,25 +35,17 @@ typedef NS_ENUM(NSInteger, ItemType) { ItemTypeSettingsBlockPopups = kItemTypeEnumZero, - ItemTypeSettingsTranslate, ItemTypeSettingsComposeEmail, }; } // namespace -@interface ContentSettingsTableViewController ()<PrefObserverDelegate, - BooleanObserver> { - // Pref observer to track changes to prefs. - std::unique_ptr<PrefObserverBridge> _prefObserverBridge; - // Registrar for pref changes notifications. - PrefChangeRegistrar _prefChangeRegistrar; - +@interface ContentSettingsTableViewController () <BooleanObserver> { // The observable boolean that binds to the "Disable Popups" setting state. ContentSettingBackedBoolean* _disablePopupsSetting; // Updatable Items TableViewDetailIconItem* _blockPopupsDetailItem; - TableViewDetailIconItem* _translateDetailItem; TableViewDetailIconItem* _composeEmailDetailItem; } @@ -67,7 +54,6 @@ // Helpers to create collection view items. - (id)blockPopupsItem; -- (id)translateItem; - (id)composeEmailItem; @end @@ -87,13 +73,6 @@ _browserState = browserState; self.title = l10n_util::GetNSString(IDS_IOS_CONTENT_SETTINGS_TITLE); - _prefChangeRegistrar.Init(browserState->GetPrefs()); - _prefObserverBridge.reset(new PrefObserverBridge(self)); - // Register to observe any changes on Perf backed values displayed by the - // screen. - _prefObserverBridge->ObserveChangesForPreference( - prefs::kOfferTranslateEnabled, &_prefChangeRegistrar); - HostContentSettingsMap* settingsMap = ios::HostContentSettingsMapFactory::GetForBrowserState(browserState); _disablePopupsSetting = [[ContentSettingBackedBoolean alloc] @@ -123,10 +102,6 @@ [model addSectionWithIdentifier:SectionIdentifierSettings]; [model addItem:[self blockPopupsItem] toSectionWithIdentifier:SectionIdentifierSettings]; - if (!base::FeatureList::IsEnabled(kLanguageSettings)) { - [model addItem:[self translateItem] - toSectionWithIdentifier:SectionIdentifierSettings]; - } MailtoHandlerProvider* provider = ios::GetChromeBrowserProvider()->GetMailtoHandlerProvider(); NSString* settingsTitle = provider->MailtoHandlerSettingsTitle(); @@ -152,21 +127,6 @@ return _blockPopupsDetailItem; } -- (TableViewItem*)translateItem { - _translateDetailItem = - [[TableViewDetailIconItem alloc] initWithType:ItemTypeSettingsTranslate]; - BOOL enabled = - _browserState->GetPrefs()->GetBoolean(prefs::kOfferTranslateEnabled); - NSString* subtitle = enabled ? l10n_util::GetNSString(IDS_IOS_SETTING_ON) - : l10n_util::GetNSString(IDS_IOS_SETTING_OFF); - _translateDetailItem.text = l10n_util::GetNSString(IDS_IOS_TRANSLATE_SETTING); - _translateDetailItem.detailText = subtitle; - _translateDetailItem.accessoryType = - UITableViewCellAccessoryDisclosureIndicator; - _translateDetailItem.accessibilityTraits |= UIAccessibilityTraitButton; - return _translateDetailItem; -} - - (TableViewItem*)composeEmailItem { _composeEmailDetailItem = [[TableViewDetailIconItem alloc] initWithType:ItemTypeSettingsComposeEmail]; @@ -203,14 +163,6 @@ [self.navigationController pushViewController:controller animated:YES]; break; } - case ItemTypeSettingsTranslate: { - TranslateTableViewController* controller = - [[TranslateTableViewController alloc] - initWithPrefs:_browserState->GetPrefs()]; - controller.dispatcher = self.dispatcher; - [self.navigationController pushViewController:controller animated:YES]; - break; - } case ItemTypeSettingsComposeEmail: { MailtoHandlerProvider* provider = ios::GetChromeBrowserProvider()->GetMailtoHandlerProvider(); @@ -224,23 +176,6 @@ [tableView deselectRowAtIndexPath:indexPath animated:YES]; } -#pragma mark - PrefObserverDelegate - -- (void)onPreferenceChanged:(const std::string&)preferenceName { - // _translateDetailItem is lazily initialized when -translateItem is called. - // TODO(crbug.com/1008433): If kLanguageSettings feature is enabled, - // -translateItem is not called, leaving _translateDetailItem uninitialized. - // This logic can be simplified when kLanguageSettings feature flag is - // removed (when feature is fully enabled). - if (_translateDetailItem && preferenceName == prefs::kOfferTranslateEnabled) { - BOOL enabled = _browserState->GetPrefs()->GetBoolean(preferenceName); - NSString* subtitle = enabled ? l10n_util::GetNSString(IDS_IOS_SETTING_ON) - : l10n_util::GetNSString(IDS_IOS_SETTING_OFF); - _translateDetailItem.detailText = subtitle; - [self reconfigureCellsForItems:@[ _translateDetailItem ]]; - } -} - #pragma mark - BooleanObserver - (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean {
diff --git a/ios/chrome/browser/ui/settings/content_settings_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/content_settings_table_view_controller_unittest.mm index 443bc666..a830c61 100644 --- a/ios/chrome/browser/ui/settings/content_settings_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/content_settings_table_view_controller_unittest.mm
@@ -4,12 +4,8 @@ #import "ios/chrome/browser/ui/settings/content_settings_table_view_controller.h" -#include "base/test/scoped_feature_list.h" -#include "components/prefs/pref_service.h" -#include "components/translate/core/browser/translate_pref_names.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h" -#include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/grit/ios_strings.h" #include "ios/web/public/test/web_task_environment.h" #include "testing/gtest_mac.h" @@ -35,40 +31,14 @@ initWithBrowserState:chrome_browser_state_.get()]; } - PrefService* GetPrefs() { return chrome_browser_state_->GetPrefs(); } - private: web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; }; -// Tests that there are 3 items in Content Settings if kLanguageSettings feature -// is disabled. -TEST_F(ContentSettingsTableViewControllerTest, - TestModelWithoutLanguageSettingsUI) { - // Disable the Language Settings UI. - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({}, {kLanguageSettings}); - - CreateController(); - CheckController(); - CheckTitleWithId(IDS_IOS_CONTENT_SETTINGS_TITLE); - - ASSERT_EQ(1, NumberOfSections()); - ASSERT_EQ(3, NumberOfItemsInSection(0)); - CheckDetailItemTextWithIds(IDS_IOS_BLOCK_POPUPS, IDS_IOS_SETTING_ON, 0, 0); - CheckDetailItemTextWithIds(IDS_IOS_TRANSLATE_SETTING, IDS_IOS_SETTING_ON, 0, - 1); -} - -// Tests that there are 2 items in Content Settings if kLanguageSettings feature -// is enabled. +// Tests that there are 2 items in Content Settings. TEST_F(ContentSettingsTableViewControllerTest, TestModelWithLanguageSettingsUI) { - // Enable the Language Settings UI. - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({kLanguageSettings}, {}); - CreateController(); CheckController(); CheckTitleWithId(IDS_IOS_CONTENT_SETTINGS_TITLE); @@ -78,20 +48,4 @@ CheckDetailItemTextWithIds(IDS_IOS_BLOCK_POPUPS, IDS_IOS_SETTING_ON, 0, 0); } -TEST_F(ContentSettingsTableViewControllerTest, TestOnPreferenceChanged) { - // Enable the Language Settings UI. - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({kLanguageSettings}, {}); - - CreateController(); - CheckController(); - CheckTitleWithId(IDS_IOS_CONTENT_SETTINGS_TITLE); - - // TODO(crbug.com/1008433): This test can be improved by checking the state - // to verify that -onPreferenceChanged: is indeed called. However, this - // test will become irrelevant once kLanguageSettings feature flag is removed. - GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled, true); - GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled, false); -} - } // namespace
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm b/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm index dd7910e..a6310e4 100644 --- a/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm
@@ -7,7 +7,6 @@ #include <memory> -#include "base/test/scoped_feature_list.h" #include "components/language/core/browser/pref_names.h" #include "components/translate/core/browser/translate_pref_names.h" #include "components/translate/core/browser/translate_prefs.h" @@ -153,17 +152,12 @@ @end @implementation LanguageSettingsTestCase { - base::test::ScopedFeatureList _featureList; - std::unique_ptr<translate::TranslatePrefs> _translatePrefs; } - (void)setUp { [super setUp]; - // Enable the Language Settings UI. - _featureList.InitAndEnableFeature(kLanguageSettings); - // Create TranslatePrefs. ios::ChromeBrowserState* browserState = GetOriginalBrowserState(); _translatePrefs =
diff --git a/ios/chrome/browser/ui/settings/search_engine_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/search_engine_table_view_controller_unittest.mm index 04437ee..0cfe966 100644 --- a/ios/chrome/browser/ui/settings/search_engine_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/search_engine_table_view_controller_unittest.mm
@@ -346,7 +346,12 @@ // Tests that when user change default search engine, all items can be displayed // correctly and the change can be synced to the prefs. -TEST_F(SearchEngineTableViewControllerTest, TestChangeProvider) { +// TODO(crbug.com/1036445): When selecting prepopulated search engines the test +// relies on the assumption that setting search engine as default will leave it +// intact. The actual behavior is that if search engine's prepopulated id +// matches the one from the record in search engines table then the later one +// will be used. +TEST_F(SearchEngineTableViewControllerTest, DISABLED_TestChangeProvider) { // This test also needs to test the UMA, so load some real prepopulated search // engines to ensure the SearchEngineType is logged correctly. Don't use any // literal symbol(e.g. "google" or "AOL") from
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm index 8cb94655..0b2f23ed 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -414,10 +414,8 @@ _articlesForYouItem = [self articlesForYouSwitchItem]; [model addItem:_articlesForYouItem toSectionWithIdentifier:SectionIdentifierAdvanced]; - if (base::FeatureList::IsEnabled(kLanguageSettings)) { - [model addItem:[self languageSettingsDetailItem] - toSectionWithIdentifier:SectionIdentifierAdvanced]; - } + [model addItem:[self languageSettingsDetailItem] + toSectionWithIdentifier:SectionIdentifierAdvanced]; [model addItem:[self contentSettingsDetailItem] toSectionWithIdentifier:SectionIdentifierAdvanced]; [model addItem:[self bandwidthManagementDetailItem]
diff --git a/ios/chrome/browser/ui/settings/translate_ui_egtest.mm b/ios/chrome/browser/ui/settings/translate_ui_egtest.mm deleted file mode 100644 index 16e6b490..0000000 --- a/ios/chrome/browser/ui/settings/translate_ui_egtest.mm +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <XCTest/XCTest.h> - -#include "base/test/scoped_feature_list.h" -#include "ios/chrome/browser/ui/ui_feature_flags.h" -#include "ios/chrome/grit/ios_strings.h" -#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_matchers.h" -#import "ios/chrome/test/earl_grey/chrome_test_case.h" -#import "ios/testing/earl_grey/app_launch_manager.h" -#import "ios/testing/earl_grey/earl_grey_test.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -using chrome_test_util::ContentSettingsButton; -using chrome_test_util::SettingsDoneButton; -using chrome_test_util::SettingsMenuBackButton; - -@interface TranslateUITestCase : ChromeTestCase -@end - -@implementation TranslateUITestCase - -- (void)launchAppForTestMethod { - [[AppLaunchManager sharedManager] - ensureAppLaunchedWithFeaturesEnabled:{} - disabled:{kLanguageSettings} - relaunchPolicy:NoForceRelaunchAndResetState]; -} - -// Opens the translate settings page and verifies that accessibility is set up -// properly. -- (void)testAccessibilityOfTranslateSettings { -#if defined(CHROME_EARL_GREY_1) - // Disable the Language Settings UI for EG1. EG2 will relaunch the app. - base::test::ScopedFeatureList featureList; - featureList.InitWithFeatures({}, {kLanguageSettings}); -#endif - - // Open translate settings. - // TODO(crbug.com/606815): This and close settings is mostly shared with block - // popups settings tests, and others. See if this can move to shared code. - [ChromeEarlGreyUI openSettingsMenu]; - [ChromeEarlGreyUI tapSettingsMenuButton:ContentSettingsButton()]; - - [[EarlGrey - selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( - IDS_IOS_TRANSLATE_SETTING)] - performAction:grey_tap()]; - - // Assert title and accessibility. - [[EarlGrey - selectElementWithMatcher:grey_accessibilityID( - @"translate_settings_view_controller")] - assertWithMatcher:grey_notNil()]; - [ChromeEarlGrey verifyAccessibilityForCurrentScreen]; - - // Close settings. - [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] - performAction:grey_tap()]; -} - -@end
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc index 900feecd..75bfa971 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.cc +++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -25,9 +25,6 @@ const base::Feature kOmniboxUseDefaultSearchEngineFavicon{ "OmniboxUseDefaultSearchEngineFavicon", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kLanguageSettings{"LanguageSettings", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kEmbedderBlockRestoreUrl{"EmbedderBlockRestoreUrl", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h index e05a0fe..9b4f410 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.h +++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -28,9 +28,6 @@ // in the omnibox. extern const base::Feature kOmniboxUseDefaultSearchEngineFavicon; -// Feature flag for the language settings page. -extern const base::Feature kLanguageSettings; - // Feature flag for embedders to block restore urls. extern const base::Feature kEmbedderBlockRestoreUrl;
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn index c550190..73e04a3 100644 --- a/ios/third_party/material_components_ios/BUILD.gn +++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -65,8 +65,6 @@ "src/components/BottomNavigation/src/MaterialBottomNavigationBeta.h", "src/components/BottomNavigation/src/Theming/MDCBottomNavigationBar+MaterialTheming.h", "src/components/BottomNavigation/src/Theming/MaterialBottomNavigation+Theming.h", - "src/components/BottomNavigation/src/TypographyThemer/MDCBottomNavigationBarTypographyThemer.h", - "src/components/BottomNavigation/src/TypographyThemer/MaterialBottomNavigation+TypographyThemer.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationBar+Private.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationItemBadge.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationItemView.h", @@ -795,9 +793,6 @@ "src/components/BottomNavigation/src/Theming/MDCBottomNavigationBar+MaterialTheming.h", "src/components/BottomNavigation/src/Theming/MDCBottomNavigationBar+MaterialTheming.m", "src/components/BottomNavigation/src/Theming/MaterialBottomNavigation+Theming.h", - "src/components/BottomNavigation/src/TypographyThemer/MDCBottomNavigationBarTypographyThemer.h", - "src/components/BottomNavigation/src/TypographyThemer/MDCBottomNavigationBarTypographyThemer.m", - "src/components/BottomNavigation/src/TypographyThemer/MaterialBottomNavigation+TypographyThemer.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationBar+Private.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationItemBadge.h", "src/components/BottomNavigation/src/private/MDCBottomNavigationItemBadge.m",
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index d089b39..b3ec59ab 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -403,6 +403,10 @@ const base::Feature kExternalClearKeyForTesting{ "ExternalClearKeyForTesting", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables the LiveCaption feature. +const base::Feature kLiveCaption{"LiveCaption", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Prevents UrlProvisionFetcher from making a provisioning request. If // specified, any provisioning request made will not be sent to the provisioning // server, and the response will indicate a failure to communicate with the
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 62de414..cec6c128 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -124,6 +124,7 @@ MEDIA_EXPORT extern const base::Feature kHardwareMediaKeyHandling; MEDIA_EXPORT extern const base::Feature kHardwareSecureDecryption; MEDIA_EXPORT extern const base::Feature kInternalMediaSession; +MEDIA_EXPORT extern const base::Feature kLiveCaption; MEDIA_EXPORT extern const base::Feature kLowDelayVideoRenderingOnLiveStream; MEDIA_EXPORT extern const base::Feature kMediaCapabilitiesWithParameters; MEDIA_EXPORT extern const base::Feature kMediaCastOverlayButton;
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 93bdd93..80b6112 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -73,7 +73,6 @@ #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_frame.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #if defined(OS_ANDROID) @@ -739,7 +738,7 @@ DCHECK(main_task_runner_->BelongsToCurrentThread()); // User initiated play unlocks background video playback. - if (blink::WebUserGestureIndicator::IsProcessingUserGesture(frame_)) + if (frame_->HasTransientUserActivation()) video_locked_when_paused_when_hidden_ = false; // TODO(sandersd): Do we want to reset the idle timer here? @@ -788,7 +787,7 @@ paused_when_hidden_ = false; // User initiated pause locks background videos. - if (blink::WebUserGestureIndicator::IsProcessingUserGesture(frame_)) + if (frame_->HasTransientUserActivation()) video_locked_when_paused_when_hidden_ = true; pipeline_controller_->SetPlaybackRate(0.0);
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index cd825ae..85b8e51 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -63,8 +63,6 @@ #include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_local_frame_client.h" -#include "third_party/blink/public/web/web_scoped_user_gesture.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" #include "url/gurl.h" @@ -1880,17 +1878,17 @@ EXPECT_TRUE(IsVideoLockedWhenPausedWhenHidden()); // With a user gesture it does unlock the player. - blink::WebScopedUserGesture user_gesture1(GetWebLocalFrame()); + GetWebLocalFrame()->NotifyUserActivation(); Play(); EXPECT_FALSE(IsVideoLockedWhenPausedWhenHidden()); // Pause without a user gesture doesn't lock the player. - blink::WebUserGestureIndicator::ConsumeUserGesture(GetWebLocalFrame()); + GetWebLocalFrame()->ConsumeTransientUserActivation(); Pause(); EXPECT_FALSE(IsVideoLockedWhenPausedWhenHidden()); // With a user gesture, pause does lock the player. - blink::WebScopedUserGesture user_gesture2(GetWebLocalFrame()); + GetWebLocalFrame()->NotifyUserActivation(); Pause(); EXPECT_TRUE(IsVideoLockedWhenPausedWhenHidden());
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java index 593682b1..7a1ad8d 100644 --- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java +++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -1472,9 +1472,29 @@ final StreamConfigurationMap streamMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + mCameraNativeOrientation = + cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + + // Update the capture width and height based on the camera orientation. + // With device's native orientation being Portrait for Android devices, + // for cameras that are mounted 0 or 180 degrees in respect to device's + // native orientation, we will need to swap the width and height in + // order to capture upright frames in respect to device's current + // orientation. + int capture_width = width; + int capture_height = height; + if (mCameraNativeOrientation == 0 || mCameraNativeOrientation == 180) { + Log.d(TAG, + "Flipping capture width and height to match device's " + + "natural orientation"); + capture_width = height; + capture_height = width; + } + // Find closest supported size. final Size[] supportedSizes = streamMap.getOutputSizes(ImageFormat.YUV_420_888); - final Size closestSupportedSize = findClosestSizeInArray(supportedSizes, width, height); + final Size closestSupportedSize = + findClosestSizeInArray(supportedSizes, capture_width, capture_height); if (closestSupportedSize == null) { Log.e(TAG, "No supported resolutions."); return false; @@ -1505,8 +1525,7 @@ // |mCaptureFormat| is also used to configure the ImageReader. mCaptureFormat = new VideoCaptureFormat(closestSupportedSize.getWidth(), closestSupportedSize.getHeight(), frameRate, ImageFormat.YUV_420_888); - mCameraNativeOrientation = - cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + // TODO(mcasas): The following line is correct for N5 with prerelease Build, // but NOT for N7 with a dev Build. Figure out which one to support. mInvertDeviceOrientationReadings =
diff --git a/media/test/data/README.md b/media/test/data/README.md index 64c4f07..f3ba0f0f 100644 --- a/media/test/data/README.md +++ b/media/test/data/README.md
@@ -730,45 +730,58 @@ ### ImageProcessor Test Files -#### bear\_320x192.i420.yuv +#### bear\_320x192.i420.yuv.webm First frame of bear\_320x192\_40frames.yuv for image\_processor_test. +To get the uncompressed yuv, execute the following command. +`vpxdec bear_320x192.i420.yuv.webm --rawvideo -o bear_320x192.i420.yuv` #### bear\_320x192.i420.yuv.json Metadata describing bear\_320x192.i420.yuv. #### bear\_320x192.nv12.yuv -First frame of bear\_320x192\_40frames.nv12.yuv for image\_processor_test. +First frame of bear\_320x192\_40frames.yuv for image\_processor_test and +formatted nv12. +To get the uncompressed yuv, execute the following command. +`ffmpeg -s:v 320x192 -pix_fmt yuv420p -i bear_320x192.i420.yuv -c:v rawvideo -pix_fmt nv12 bear_320x192.nv12.yuv` #### bear\_320x192.nv12.yuv.json Metadata describing bear\_320x192.nv12.yuv. #### bear\_320x192.yv12.yuv -First frame of bear\_320x192\_40frames.yv12.yuv for image\_processor_test. +First frame of bear\_320x192\_40frames.yv12.yuv for image\_processor_test and +formatted yv12. +To get the uncompressed yuv, execute the following command. +`ffmpeg -s:v 320x192 -pix_fmt yuv420p -i bear_320x192.i420.yuv -c:v rawvideo -pix_fmt yuv420p -vf shuffleplanes=0:2:1 bear_320x192.yv12.2.yuv` #### bear\_320x192.rgba -RAW RGBA format data. This data is created from bear\_320x192.i420.yuv by the -following command. Alpha channel is always 0xFF because of that. +RAW RGBA format data. This data is created from bear\_320x192.i420.yuv. +Alpha channel is always 0xFF. +To get the uncompressed yuv, execute the following command. `ffmpeg -s 320x192 -pix_fmt yuv420p -i bear_320x192.i420.yuv -vcodec rawvideo -f image2 -pix_fmt rgba bear_320x192.rgba` #### bear\_320x192.bgra -RAW BGRA format data. This data is created from bear\_320x192.i420.yuv by the -following command. Alpha channel is always 0xFF because of that. +RAW BGRA format data. This data is created from bear\_320x192.i420.yuv. +Alpha channel is always 0xFF. +To get the uncompressed yuv, execute the following command. `ffmpeg -s 320x192 -pix_fmt yuv420p -i bear_320x192.i420.yuv -vcodec rawvideo -f image2 -pix_fmt rgba bear_320x192.bgra` - #### puppets-1280x720.nv12.yuv RAW NV12 format data. The width and height are 1280 and 720, respectively. This data is created from peach\_pi-1280x720.jpg by the following command. `ffmpeg -i peach_pi-1280x720.jpg -s 1280x720 -pix_fmt nv12 puppets-1280x720.nv12.yuv` +To get the uncompressed yuv, execute the following commands. +`vpxdec puppets-1280x720.i420.yuv.webm --rawvideo -o puppets-1280x720.i420.yuv` +`ffmpeg -s:v 1280x720 -pix_fmt yuv420p -i puppets-1280x720.i420.yuv -c:v rawvideo -pix_fmt nv12 puppets-1280x720.nv12.yuv` + #### puppets-640x360.nv12.yuv RAW NV12 format data. The width and height are 640 and 360, respectively. -This data is created from puppets-1280x720.nv12.yuv by the following command. +To get the uncompressed yuv, execute the following command. `ffmpeg -s:v 1280x720 -pix_fmt nv12 -i puppets-1280x720.nv12.yuv -vf scale=640x360 -c:v rawvideo -pix_fmt nv12 puppets-640x360.nv12.yuv` #### puppets-320x180.nv12.yuv RAW NV12 format data. The width and height are 320 and 180, respectively. -This data is created from puppets-1280x720.nv12.yuv by the following command. +To get the uncompressed yuv, execute the following command. `ffmpeg -s:v 1280x720 -pix_fmt nv12 -i puppets-1280x720.nv12.yuv -vf scale=320x180 -c:v rawvideo -pix_fmt nv12 puppets-320x180.nv12.yuv` ### VP9 parser test files:
diff --git a/media/test/data/bear_320x192.bgra b/media/test/data/bear_320x192.bgra deleted file mode 100644 index e35e345e..0000000 --- a/media/test/data/bear_320x192.bgra +++ /dev/null Binary files differ
diff --git a/media/test/data/bear_320x192.i420.yuv.webm b/media/test/data/bear_320x192.i420.yuv.webm new file mode 100644 index 0000000..25ba8f5 --- /dev/null +++ b/media/test/data/bear_320x192.i420.yuv.webm Binary files differ
diff --git a/media/test/data/bear_320x192.nv12.yuv b/media/test/data/bear_320x192.nv12.yuv deleted file mode 100644 index 54ed44be..0000000 --- a/media/test/data/bear_320x192.nv12.yuv +++ /dev/null Binary files differ
diff --git a/media/test/data/bear_320x192.rgba b/media/test/data/bear_320x192.rgba deleted file mode 100644 index f0e5293..0000000 --- a/media/test/data/bear_320x192.rgba +++ /dev/null Binary files differ
diff --git a/media/test/data/bear_320x192.yv12.yuv b/media/test/data/bear_320x192.yv12.yuv deleted file mode 100644 index f9ac99a..0000000 --- a/media/test/data/bear_320x192.yv12.yuv +++ /dev/null Binary files differ
diff --git a/media/test/data/puppets-1280x720.i420.yuv.webm b/media/test/data/puppets-1280x720.i420.yuv.webm new file mode 100644 index 0000000..9219ead --- /dev/null +++ b/media/test/data/puppets-1280x720.i420.yuv.webm Binary files differ
diff --git a/media/test/data/puppets-1280x720.nv12.yuv b/media/test/data/puppets-1280x720.nv12.yuv deleted file mode 100644 index b7034cb..0000000 --- a/media/test/data/puppets-1280x720.nv12.yuv +++ /dev/null
@@ -1 +0,0 @@ -BDEFFFFFDEEEDEGIIGEEFGFEFEEFFFGIIHHGGFFEEEEEFGGFHHIHGEDDEEFGGFEEFFEEEDDEGGGGFEEEEEFFFFEEFFFGGGFFGFFEEFGGHHHHGGFFHGFFGHGFHHHHHGFEFFEEFGHHGGGGFFGGHHGGFFFFFFFGGGGGHGFGHHGEGGHIJIHHHGFFFFDDDEEFGHIJHHHHHHGGFFFFFFFFFFFFEEGHGHHIIHHGGGHHGGGGEFHHFEFGHHHGGGGGGFEDEFGGGGFFFFEDFGIIIHHHIHHHJJIGIGEEGIIHGGGGGGHHHIIHGGGHHHHHHHHHFFFFFFFFFGGHHHGGHHHHHIIIIIIIIIJJJJIHHHIJIJJJIIIIIIHIIIIHJJJIGGGHIIJJJKKLKJJJJJJJJJJJIHHIIJJJJJJJJKKKKJJJJJIIIIIIJJJJJJJJJJKKJJJJKKKKKKJJKKKKKKJJLLLKKKKKJKLMMMLKLLKKKKLLKKJIIIJJJJJKKKLLLLMMMLLKKJJKMMLKKKKLLLMMMLJJJKLLJJKKLKKKKLLLLLLLLMMMMLMNMLLLLMLLKKJJJKLMKLLLKJKKLLKKKJKKKKLLKKMNNOOOMMMNMMMMLLLLKKKKLLLLMMMMLLLLJJJJJKKKMMLLLLLMJKKLLLLLLLLLLLMMLLLLLLLLKKKJJJJKMMMMMMMMLMMLLLMNNNLKKKLLOONNMMMMNMMMNONMNMKJJKLMNNMMLLKKMLLLLLLMJKKKJJJKLLLMNNMLKLMMMLMMPONMLMNOOMKKLMMLMMMNNNNNMMNMMLKKMMNNONLKMMMMMMMMMMMMMMMMMLLLLMMMLMMMNNNNOONNNMMMNNNNNNNNOOOONMMMMMMMMMMMNNMMMMMMNNNMMLLLLMNNMMLMMMMMMMMMNMLLMMMLNNNNNNNNMNOONNNNLMNMMLLMNNNNNNNNNMLLMNNNNNMMMMMNNNMNOOONNNMMMMMMMNNNMLKKLMNNMMNNNNMMLLLMLLKLLMNNMMMMMMLLLLLMMMNNNMMMMMLLNNMLLLMMNMLLMNNOMLKLMNONNNOOONNNPOONMLJJJJJLMMKJMMLLLLMNLMMMLLNPOONMMLKKLLLLLLLLKKKLMLKJKKLMMNNNPNMNNMMNONLLMNONNNNNNNNNMMLKKKKKMNONMLLMOOOOOOOOONMMNPPQPNLKKMNNLMMMMNOPPPPPPPPOMOPPNLKLLMOPPPOMLNPOMLMNPONNNONNOPPPPONMPONOOONMNNNNNNOOPPOPPPPNNNOOPPPPOMMNPPPNDDFFFFGGDDEEDDFHIHFFGHGGGFEFEEFIHGFFEEEEFFEFFFFEFGHGFEDDEEEEEEEDEEEDDEEEFGGFEDDDEFFGGFEEFFFFFFFEGGFFEFFGHHHGGGGGGGGGGGGGHGGHHHFEDDDDEFFGGGGGFFGHIIHHGHHHHHHHHIIHGEDDFFFEGHIJIIGFGFFFFFEDDDEFGHIIIHHHHHGFEEEDEFGGHHGFEEEFGGHHHHGFFGHIHHHHHIIHGFGHHHHHGGGGFFEEFGHHIHGGHHGGGHIIHHHHIGFGHIHGIHFGHIIHGGGGFFEEHHIIHHHIIIIHHIIIGGGGGGFFFFGHHHGGHHHIIIIIIIHHIIIJJJIIIIJJIIJJIIJJJIIIJJJJJJJHGGHIJJJJJJJKJJJJIIIJJJJJIHHHJJJJJJJJJJJJJJJJJJJIIIIJJJJJIIIIJKLKKJJJKKKKKJJJJJJKKKKKKKKKKKJJKKLMNMMLLKKJJKKLJJJJJJJJJJKKKLLLLLMMNMMLLLKLLLKJJKKKLLLMMLJJJKKKJJKLLLKKKLLLLLLLLMMMMLMNKKJKKLLKKJJJJKKLKLLLKKKKLKKKKKKKKKKKKKLMMNONMMMMLLLLLLLLKKKLLLLLLLLLLLKKKKKKKLLLLLLLLLLLKKKLLLLLNNMLLLLLLLLLLLLLKKKJKKKLMMMMMMMMLLLLLLNOMMLKKKLLNNNMMMLLMMLMNNNMLKKKKLMNNMMMLLLLMLLLLLLMKLLLKKKLLLLMNNMMLMMMMLMNONMLLMNOOMKKLMMLLMMMNNNMMMNNMMLKMMMNONMLLMMMMMMLLLLMMMMMLLLLLLMMMMMMNNNNNNNNNNNNNNNNNNNNMNNNMMMMLLLMMNNNMMLLLLLLMMMMMMMMNNNMLLMNLLLLMMMMMLLLLLLLMMMMMMMMMMNNMLLLMNNNMMMMOONNNMMMMLLLMNNNONMMLLMMNNNNOONNLLMMNOOONNNNNMMMMNNMMMNOOONNMMMMLLLLMMNOMMNNMMMLLLLLMMMMMMMLLLMMONMMMMMNPOMMMNNNLLKKMMNMMNNNOONNPPOONMLKKKKLMMLJMMMLLLLLKLMMLLMONNMMMMMLMMMMMMMMLLLMMMLKKKLMNNNNPONOONNNONMMNOPPOOONNNMMLLKKJKKLLLMMLKLLNNNOOOOOONNNOOONOMLKLMMMMMMMNNOOPPPPPONMLMONLKKKNNNOPPONMNOONMNNONMMNNNNMOPPONOPOONOOONMNNNNOOPPPPNOPPPONNNNNOPPPNMMOONMDDDDDDDDDDEEDDFGHGFFGHHHGFEEDDFHFFEDDEEFHGFFFFEDEEFFEEDEGFEEDDEEEDDDDEFFGGGFEDDEEEEEEEDDFFFFFEEDGGFFFFFFIHHGGGGGFGHHFFGHHGFGHHGEDDDDDEFGGGGFFFGHIIHHHIIJJJIHHHIJFDDDDFFFFGIJIHFEFFEFFFEEDDEFGHIIHHGGHGFFDDDDDEGHIIHGFEDDGGGHHGFFEFHIIIIIJJJIGGHIHHHHGGGGFEFFHIIIHGGGHHGGHIIIHGGGHGFFHHHHIIIIIHHHHGGGFFFEHHIIIIJJIIIIIIIIHHHHHGGFGGHHHHHGHHIIIIIHIHHHHIIIIIIIJJJJJJJJIIIJIIIJJJJJJJIGGGIJJJJJJJJJJJIIHHHHJJJJIHHIJJJJJJJKKKKJJJJJJJJJJJJJJJJJIHHIKKLKJJJJJKKKKJJJJJJJKKKLJKKKKJJJKKLMMMLLLKKJJJKKIJJJJJJJKKKKLLLLKLMMNNNNMMLLKKJJJJKKKLLLMLKKKKKJJKKLLLKKKKLLLLLLLMMLLLLMKJJKKLKKKJJJJJKKLLLLKKKLKKKKKKLLKKKKJJKLLMNNMLLLKKLLLLMMLLLLLLLLLKKKKKKKJKKKLLLLKKKLLLLLKKLLLLLLMMLLLLLLLLLLLLLLKKKKKLMMMMMMMMMMLLLLLMNOLLKJJKLLNNMMLLLLLLLLMNNMKKKKLLMMMMMMMLLLMMLLLLMMLLLLKKKLLLMNNMMNMMMMLLMNNMLLLMNNNMLLMNMLLLMMMMMMLMNNNMLKLLMNNNMLLMMMMMMLLLLLLMMMLLLLLLMMMMMMNNNNMNNNNOOOMMMMMMMNLMNMMMMMLLMMMNNNLLLKKKKLLLMNNOONOOMLKKMNLLMMMMMMMLLLLLLLMMMMMMMMMNNMLKKKNNOONMMNOOONNMMMLLLMNOONONMMLLMMONNNNNNNKLLMNOOONNNNNNNNNNNMLMNOOONMMMMMKLLMMNOOMMNNNMMMKLLLLLLLMMLLLLMNNNMMMMNNPOMMNNOOMLLLMMMMLMMNNNOOPPOONMMLLLLMNNMLMLKLMMLKKLMMLKLMLLMMMNNNNNNNNMMMNMMNNNMLKLLMNNOOONMMNMMMNMMMNOOOPOONNMMMLLKKKKKLKLLLLLLLMNNOOONNMMNOOONMMMLLLMMMMLLMNOOOOOOOOONMMNNNLLLMONMMNOONNNMMMMNNONMMNNNMMOPPNMNPOONOOONMNNMNNOPPPOMMOPPPONMMMNOPONMLMNMLEEDDCCCCDDFFEEEFFFEEFGHHHFEEDDFIFFEEDEFGHGFFFFEDEEFEEDDEHGGFFEEEDDDDDEFGGHHGFFGGFFFFEEDDFFFFFEDDFFFFFFFFHHGFFFGGFGGGGGGHHGFGHIGEDEEDDEFGGGGFEFGHHHGGGHIJJIHGFGHIGFEEFGGFEGHIIHFEEEFFFFFFDEEFGHIIGGFFFFEEDDDDEFGHIIIHGFFEGGHHHGGFEGHJIIIHIIIIGGHHIHHHGGGGFFGHIIIHFFFGGGGGHIIIHHHHIHGGHIIIIJJJIHHHHHHHHHHHIIIJJJJJHHHHHHHHIIIIIHGFIIIJJIIIHHIJJIIHHHHHHHIIIIIJJJJJJJJJIHHIIHHIIJJIJJIHHHIIIIIJJJJJIIIIHHHHJJJJJIIJJJJJJJJKLLKKJKKKJJJJJJJJJJJJIIIJKKKKJIIIKKKKKKKJJJJJKKKKJJJKJJJIJJKLLLLKLLKKJJJKJJJJJJJJKKKKKKLLKKLMNNNNMMLLKJJJJJJKKKLLKKKKKKKJKKLLLLKKKKLLLLLLLLLLKKLLLLKLLLLKKKJJJJKKLLMLLLLLLLKKKKKKKKKKKKKKLLNNNMLKJJKKLLMMMMMMLLLLLLLLKKKKKKKKKKKKKKLLMMLLKKKKKLKKJJJKKLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMLLMNLKKKKLLMNNMMMLLLLLLMMNNNKKLLLKKKLLLMMMMMMMLLLLMMLLLKKKKKKMNNMMNNNMMLKLMMMLLKLLMNNMMMNNMLLLMMMLLLLMNNNMLLLLLMNNMMMMMMMMMMLLLLLLLLLLLLLLLLMNNNNNNNMMNNNOOOMMMMMMMMLMNNMLLMNNNNMMLLLLLLKLLLKLMNNNNNOONLKKMNMMMNNNNNMMMLLLMMMMMMMMMMNOONMMMMNNOONMMMNNNNMMMMLLMNOONNNNNMMNNNOONNNNNMMMMMMMMMMMMMMNNOOONMLLNONMMLLKKKKKLMNNOOMMMMMMMLKLLLLLKKLLKKKLMNMMMMMMMMNMLLNOPPNNNMNNMMLMMMNNNNOONNNMMMMMMNNNNNLKJKMNMKKLNNLKKKLLMMNNNONNNNMMMMNMMNOOONLLMMNOOOOMLMMMLMMMMMMMNNNNNNNNNMMLLLKKLLLMMNNNNOOOOONNMLKLMNOPONLLMMNNMMNMLMOPPNMNNOOPPPNNNMMMNOONNNNONNNMLLMMNMNNNNNNNNOPPPNLMONNNONNNMMMMMNOPPONMMNOPPOONNNNOOMLKKLMMMIHGFEDDDCDFFEDDEFFFFFFGHHFEEEEGJGGGFEEGIGFFFFFFEFFFFEDDEGGGGGFDDDDDDEFFGGGGGGGHIHHHHHGGGGGGGFEEDEEEFFFFFGGFFEFFFFFEFGHHGGFFGHHGEFFFEEEFGGGGFEFGHGGGGGHIJIIHFEEGHIIHIIIHFEFHIIHGFEFFGGGGGFFFGHIIIGGFFFFFEEEFFGGGGGGHHHHHHGHHIIIHHFGIIIHHGGHIIIHHHIHHGGGGGGGGHIIHHFGGGGGHHGHIIHHIIIHGGGHIIIJJJIHHIHIIIIIIIJJJJJJJJIIIIIIIIIIIIIHGGJJJJJJJIHIJJJJIHHHIIHHHHIIIJJIIIJJJJIIJJIHHHIIIHIIIIIIHGHIIIJJJJJJJJJIIIJJJJJJJJJJJJJJJKLLKJJJKKJJJJJJKKJJJJJJJJJKKJJIIIKKKLLKKKJJJJJJJJJJJJJJJIJJKKLLKKLLLKKKKKKKJJJJJJKKKKKKKKJKKLMMMNLLLKKJJJJJJKKKKKJKKKLKKKKLLLLKKJJKKLLMMMNMMLLLLLNMLLMMLKKKKKKKKKLLMMLLLMMMLLKKKJLLLLLKKKLLMNNMLKJJKKLLMMMMMMMLLLMMLLLLLLLLLLLKJJKLLMMMMMKKKKKKKKJJKKLLLLLLLLLLLLMLLLLLLLMMMMMMMMNNNMLLLMLLKLLMMNNNNNMMLLLMMMMMNNKKLLLKJJLLLMMMMMMMMLLMMMLLLLLLKKLMNNMMNOMMLKKKLLLLLLLLMMMMNNNNMLLLMMMLLLLMMNNMLLLLLMNNNMMMNNNNMMMMLLLKKKKLLLLLLLNNNNNNNNMMMMMNNNMMMMMMMMNNONMLLLNNNNNMMLMMMLLMMMKLLMMMMMNNNMLLLMMMMNNNNNMMMLLLLMNNNNNNNNNOOONNNONNONMMMMLLLMMMMMNMNNOONMNNNNNOOPOONMNNNNNNNMMLLLMMLLMNNOOONMLLNOMMLKKKKKKLLMNNNNKLLLLLLLLLLLLKKKLKKKKLMMLMMMMMMMMLLLMNOONNNNNMMMMMMMMMMMMMMMMMMMMMNNOOPPMLLMNNMKLMONMKKKMMMMNNNNNNNNNNMMMMLMNOPPMMMNNOOOPONNONNNNNNMMLLLLLMMNNOONNMMLLLLMMNNOOPPOOOONNMMMMMMOOOOLMNOONNMNMMNPPPONOOPPPPPNMMMMNOONNOOPPNMNMLLMNNMNOOONNNNOOONNNNMNNNONNNNNNNNNNOOMMMNOOOOOPPPPONNMLKKKLLLJIHGGFDDCDEEDDDEGGHGFFHIGFEFEEGJGGGFEEFHFFEFGGGFGGGFEEEFFFGGGEDDDDDEFFFFEFFFFFGHHHHHHHGGGGGGGFEEDEEFFFFFFFFFFFEEFEEEGHGFFFFGHHGFGGGFDDEFFGGFFFFGHHHHHIIJHIHGEEGHJJJJJJHFEFGHIIHGGGHHHGHHGGGHHIIIHGGGGGGGFFGHHHGGGFFGHIIIHHIJJJJIGHIIHGGGGHIJJJIHHHGGGGGGHHHHIIHGFFFFFFGGGHIIHHIJHHGGGGHHIJJJIIIIJJIIIHHHJJIJJJJIJJJJJJJJIIIIHHHHIIIIIIIIIIJJJJIIIIIIIIHHIIIIIIIIJJJJJJKLJIIIIIIHIIIJJIHFHHIIJJJJKKKKJJJJIJJJIIIJJJJJJJJKJJJJJJJJJJJJJJKKJJKJJJJKJKKKJJJJKKKLLLKKKJJJJJJJKJJJJJJJJKKLLLLLLLLKKKKKLKJJIJJJJJJKKKKKKKKLLLLLKKKKJJKKJJKKKKKKJKKKKKKLKLLLLKJJJJKLMMMMONMMMNNNMMLLLLKKLLLLLLLLKLMLLLLMMMMLLKJJLLLLLLKKLLLMNMLKJJKKLMMMMMMMLLLLMMMMLLLLMNNNMLLKLLMMMMMMLLKKKKKKMMMMMLLLLLLLLLLLMLLLLLLLMMMMMMMMOOONLLLLLLLLMMNNOONNNMMMMMMMMMMNJJKLLLLLLLLLMMMMMMMLLMMMNMMMMMMLLMMMMMNNMLKKKLLLLLLLLMMMMMNNNMMLLLMMMMMMMMMMMLLLLLLMNNMMMMNNNNMMMMMLLKKKLLLLLLLLNNNNNNMMNNNMMMMMLMMMMMNNNOONMLLLMMNOOOONMMMMMMNNLLLLLLLLMNNNMLLLLLMMMMMMLLLLKKKLNNNNNNNNNNNNMMNOMNNNMLLLKLLLLLMMNNNNNNNMNNNOOPPPONMMNNNNOONNNNNNNMMMNNOONNNMLLMNMMLLLLLLLLMNNMMLKKLLLLLLMMMMLLKJKKKKKLLLMMNNOONNNMLLLMMMNNNNMMMMMMLLLLLLMMLLLLMMMMNNOOPPPONNNNLKLNONMLKLNNNNNNNMNNNNNNNNMLLMNOPPNNNNNOOOPNMNNNMNNOONMLKKKKLMMNOONNNMMMLLMMMMNOPPNNNMNNOOPONMNNNNMNOOONNNNMMNPPPOPPPPPPPPONMNOPPPMNOPPPNMNMMMNOONNOOONNNNMMMNPPONMNONNNNNOOOPPPPPLMMNNNNNPPPPPONMMMLKKJJJHGGGGFEDDEFFDDDEGHHGFFGIGFFFEEFHFGGFDDDEFFEFGGGGFGFFEEFGFGGFFEDDDDEFGFFEEFFEEEFGFFFFFFFFGGGGGFFEEFGGGFFEEEFFFFEEGFFFFFEEEFGGGGGGIIIGDDDEEFGGFFFFHHHIIIIIHHIGFFGIIHHHIIGFFFGHHHHHHIJIIHHHHHHHHHHHGGFFGGGGFFGGGGGGGFFFGHHHHHIJJJJJHIIIHGHHHIJJJJIIGGFFFGGHHGGGHHHGEFGFFFFGHIIIHHIIHHHHHGGGHIIIIIIJJJIIIHHHIIHIJJJJJJJJJJJJJJIHHHIIJJJIIIIIJJJJJIIIIIIIIIHHIIIIIJJJJJJJJJKLIIHIIJIIIHHIJJIHIIIIJJJJJJJJJJJJIJJJJIJJJJJJKKJJJJJJJIIIIIIJJJJKJJKJJJJJJJKKJJJJJJKKKKKKJJJJJJJJLKJJJJJJJKKKLLLLKKKKKKKKKKJJJJJJJJKKKLLLLLLLKKKKKKKKJJKLKKKKKKKKKLLKJJKKKLLLKKJJJJKLMMMMNMLLMNNNLLKLLLLKKKLLLLLLKLLLLLLMMMMLLKKJLLLLMMLKLKKLMMLKJJKKLMMMMMMLLLLLLLLLLLLLMNNNNNMLMMLLLMMMMLLKKKKKNNNNMMLLLLLLLLLLLKKKKKLLMMMMMMMMOOONMLLLLLLMMMNNOONNNMMMMMNMLLLMKKLMMMMMLLLLMMMMMMMMMMMMNMMMMNMLMLLLMNNMLKKKLLLKMMMMMMMMMMMMMMMMLMMMNNNMNMLLKKLLLLLMMNMMMMMMMMMMLLLLLLLLLLLMMMMLOONNNNMMNNNMMMMMLMMMMNNNNNONMMMMMMNOPPPOMMMMMMNNMMLLLLMMMMNNMLLLLLLLMMMMLLLLKKKLMMMMMMMMMNNMLLMMMNNNMLLLLLLLLLLLNMMMMNNMOOOOOOOOONMMNNOONNNNNNNNMMNNNNNMMMMMLLMNMMLLLLMMMNNNNMLKLLLMMMMLMNNNMLKJJJKKKKKKLMNOOOONOMLKLLMMMNONMMMMLLLKKLLLMMMMMMMMNNONNNOPOONMMMLLLNONLKLLNNNNNNNNMNNNNNOONMLMNOPPOONNNNOOOMLMMLLMNNOOMLKKLLLLLMMMMMMMMMMMMLLMNOOONMMLLNOPPONNNNMMMNOOONMMMMNNOOOOPPQPPOOOPONOPQPPMMNPPPNMMMMNNNNNNNOONNNNKLMOPPONMNONNMNNNOPPPPPPNNMMMMMNPPPPONMLLLLLKJIIFFFGHHFEFGGGEEFGGHHGEDFGGFFFEDEGDEFEDCCDFFEFGGGGFFFEEFGHHHGFFFFFDEFGGFEDFFFEDDEFFFFFFFFFGGGGGFFEGGHHGFEEEEFGGFEEGGHFEDDDDFGHGFGHJJJHEDDEEFGGGFFFGHHIIHHGGHHGFFGHHFEEFGFEGGHHHHHHIJJJIHHIHHHHHHHGFEEEFFGFFFFFFGHHHGEEFGGFHHIJJJJJIIIHHHIJJIIIIIIHGFFFFGGHHGFGGHHGGHIHGGHHIIJIHHHIIIJIIHHHHHHHIIJJIIIIJJJJHHHHJJJJJJJJJJJJJJIHHIJJJJJJJJJJJJJJIIJJIIJJIIHHIIIIJJJKMLLJJJJJHHHHIJJIIHGHIJJIJJJJIIIIJJJJJIHHJJJJJJJJIJJKKKJJJJJJJJIIIIIIJJJKJKKJIHHIIJJJJJJJJJJJKKJJJJJJJKKKLLKJJJKKJJJJKKKKKKKKKKKKJJJJJJJJJJKKLLLMMMLLKKJJKKLKJJJKKKKKKKKKLMLKJJJKKLLLKJJJJJKLMMMNMKJJKLLLLKKLMMMMKKKLLLLMKLLLLLLMLLLLLLKKLLKLMMLKLKJKLLLKJKKLLMMMLLLLLLLLLLKKKKKKLLMNNNMMMMLLLLLMNMLLKKKLLLMMMMMMLLLLLLLLKKJKKLLLMMMMMMMMNNONMLLLLLLMMMNNOONNNMMMLMMMLKLLMMMNMMMMLLLMMMMMMMMMMMMMMMLLMMLLMLKLMNNMLKKLMMLKMNNNMMMMMMMMMMMMMMMNNNNNNMLKJKKLMLLLMMMLLLMMMMLLLLLLLMMMLLMMMMMLOOONNNMMNNNNNNNNMMMMMNNNMMNNMMMMNOOPPPONMLLLLMMNNMLLLMMNMMNMMLMMMMMMMMMMLMMLKKLMLLLLLLLLNNNMLKLLNNONMLLLMMMLLLLLMLKLMMNNOOOOOONNONMMNOOONNMMLLLLLMMMMMLLLLMMLLMNLLLLLLMMNOOOOMLKLMMMNNMMNNNNMLKJJJKLLKKJKLMNONNNMLKKLMNNNOPONNNNKKKKKLMMNNMMMMNNOOONMMNOLLLKKLMMLNNNLKLMNNNNNNNNLLLMMNNNONMMNOOOPOONNNOOONMNNMMMLMNNMKKKMMMLLKKKLLLMMNNNMMLLNOOOONLKKLNONNNNNNNMMNOONMMMLMNNNNOOOPPPPOOOONMNPPPOMMNOPPNMKKLMMMMMMNOONMMNKMOPONNMMNONNMNNLMOPPPPPONMMLLMNPPONMMLLJKLLKJJJEEFHIJIHIIHGFFHIIHGFFFEEFFFFGGGFEDDDEEEDFGGFEEFGGGFFFFFFHGFEEEFFGHIIHFEEFFFFEEFGHGFEFGGFHGGHHHFDFGIIHGGGGGGGFFFFIIHGFEDDDEFFEEGHIIHFEEEEFFGFFFGHIIHHHGGGGGGGFGHIHFEEFFFEGGGGGGGGIIIJJJIHHHHGGFEEEEDEGHGEEEFGHHGGFFFFFFFFGHIJJJIHGHIIIHHHJIHHIIHHIFDDEGHHHHHHGFGGGHIIHHHHIIHHHHIIIJJJJIHHGGGGHJJKJJHIJKJJIHGGHIJJJJJJJJJJJJHHIJJJKJJJJJIIJIJJJJJJHHGGIJJJJJJJJJJJKKKKJIIJJJIIIIIIJJJJJJJKJJJJJJIIJJJJJJJIJJJJJJKKKKLLLLKKKJJJJJJJJJJJJJJKKKKKJJJIKKJJJJJJJKKKJJKLJKKLLLLKLKKKKKKKJJJKLKJJJKKLMLKJJJJJJJJJKKKKKKLLKKKKKKKKKKKKLLLKJKKKKKMMONLLLLLLLKJJJJJKJJKLLMNNMLLLLLLMLLLLLLLLNMLLKLLMLLLLLLLLLLLLLLLLLLKKKLMMMMLLKKJJLKJKMNMKLLLLLKKKLLKKKKLLLLLLNNNNMMLMNNMLNNNMMMMMMLLLLLLLMMMMMMLLLKJJKLNONNMLLLLLMMMMMLLLLLMMMNOONNNNMMLLLLMLLLMNMNPONMMNMMMMMMNNMMLMNNNNNMMLLMMNMMMMMMMMKLMMMMMNNNNNNNMMLMMMMMNNONMMMMNONNNNMMMMMMMMMNNNLKKLLLLKKLMNOONNMMMMLLMNOOOOOONNNOOPPPNLNNNNNMMMMMNNMMMNOOPPPONMMNNMLLMMMMMMMMMMNONMLLLMLKKKKKLMMMMLLLLLKKLLMMMMNNNNNMMMNOONLKLMNNMMMMNNNMLKKLMNOONNOONMMLLMMNNNPNMMNNLKLMMMLLMNNONLLMNMMMMMMMMNMLMNMLKLLLLLMMNNOOPOOMLJKKKKKKKKLLLLLMMMLMMMMMNNMNPPONNONLKLNONLNOONMMMNOOONNMMMNNNNLLLLONNOOOMLMMLMNNNMNNNNNMMLMMNNNNNOPONNNOOOMLMNNMLMNNMMLLLLMMNNNNNMMMLKMOPOONMMMMMMNNOONNMLKLMNNMLLLMNOOONMOOOOOOOOPPPPONOOONNOQQPOPOMMNNNNOOPPPPPPPPPPPPPONNOPPOMLNPPPPNMMMNNOPPPPOOONLLMNPOOOPPPQPONMLLLLEDDEGHHHIIIHHHIJIHGFGGGFGFFFGGGFHGGGGFEDDEFFEEFGHGGGGGGGGGFEEEFFDEFGGGGGGGHGGFGHGFFFFGFFGGGGHHGFFGHHHGGGHHGGGGFFHHGGFFEEEGHGFEFHHGFEEEEEFGGGFFFGGGGGGGGGFEDDFGGGGGFFFFFEFFGGGGGGGGHHIIHGHHHGGFFEEEEFHHGFFEFFGHHGHHHGGGGGGHIJJIIHGHHIHHHIJJIIIJIIHGEFGIIHGHHGGGHIGHIIHHHHHHGGGGHHIJJJJIHHFGGHIJJJJJIIJKJJJIHGHIJJJIIIIJJJJIHHIJJJJJJJJJJJIIIIJJJJHHGGHIJJIIIIIIIIJKKJJIIJJJJJJJJJJJJJJJJJJJJJJJIIJJJJJJJJJJJJJJJKLLLLKKKJKJJJJJJJJJJJJJJJJJKKJJJJLLLKKKKKJJKKJJKLJKLLLLLKKKKKKKKJKKKLMLKJKKKLMLKJJJJJJJJJLLKKKKLLKKKKKKKKLLLLMMLKJKKKKKLMMLKKLLLLKKJJJJKLKKKLLMNNMMLLLLMMMMMMMMMMNMMLLLMMLLLLLKKKLLLLLLLLLLLLLMMMMMMLLKKKLKKLNNNLLLLLLLLLLLLMMLLLLLLLNNNNMLLMNNNMNNNNMMMMMMMMMMMMMMMMLLLLLLKKKLMMNMMLLLLLMMMMMLLLLLMMNNNNMNNNMMLLLLMLLLMNLNONMLMNNMMMMMNNNNMMNNMLLLLMMNNNMMMMMMMMLMMMMMMNNNNNNMMLLLLLMMNNNNMMMMNNNNNNNMMMMMMMMNNNMLLMMMMLKLMNNNNNMMMMMMNNOOOOOONNNNNOPPNMNNNNNNNNMNNNMMMNNOPPPPOOMNNMMLMNNMMMMMMMNNNMLLLMMLLLLLMMMMMMLLLLKLLLLMMMNNNNNNMMMNNMKKLMMMMMMMNNNMLKLLMNPONOOOONMMMMMMNNONMMNNNLLLMLLLMMNONMMNNNNMLLLMNNNMMNNLLLMMMMMMMMNOOONNMMMMMLLLLKMMLLKKKKMMMMMMMMMOPPONNOONMMNONMNOOONNNNOONNNMMMLLMNMNNOMMMNOONMKKJKLMLLMMNOONMMLMMNNNOOONNNOOOOMLLMNMLMNMMLLKKKOOOOONNNNNMMNPPPNMLLLLLMOOPPOONMMNNOONNMMMNOOONNPPPPPPPPPPQPPOOOPOOPQQPPONMMNNOOPPPPPPPPPPOPPPPPPPPPONNNMOPPPONNLLMNNOONPPONLLMNPPPQQRRRPOONMMLLHGFEEFGHHIIIIIIIHGGFGGGGGFEEFGGGHHHHHGFEDDFFGGGGGGGGGGGGGGGFFFEEEFGGGFFFHIIIHGHHFFFFFGFEFFEFGGGGGHIIIHHHGGGGGFFFFFGGGGFFGHHGFEEFFFEDDEEEFGHHGFFFEEEFFGGGFDDDFHGFGGFGGGFEFFGGGGGGGGGHHIHGHHHGGFFFEEEGIIHFGFFFGHHHIIIHHHGGFGHIIIHHFGGGGGHIJIIIJJIIGGGHJJIHGHHGGGIJGHIIHHHHHGGGGGHHIIIIIIHHEFHIJIIHIIHIIJJJJIHHHIIIIIIIIIIJJIHIIJJKJJJJJJLLJIIIJJKJIHGGHIIIIIIIIIIIJJJJJIIJIJJJJJJJIIIIIJJJJJJJJJIIIIJJJJJJKKJJJJJJLLKKKJJJJJJJJJJJJJJJJJJJJJJJKKKKLLMMMLLKJJKKJJKKKKLLLLKKKKKKKJJJLKLLMMLKKKKLMLKJJJJJJJJKLLKKKKKKJJKKKLLLMLLLMLKKJKKKKKKLLKKKKLLLKKJJJKLLMLLLLMMNMMMLLMMMMMMMMMMMNNMMMMMMMMLLKKKKLLLLLLLLMMMMNNMMMMMLLLKKLKKLNNMLMMMLLLLLKLMMMMLKLLLLNNNNMLLMNNNMNNNNNMMLMMMNNNNNMMMLLLLKLLLLLLLKMMLLLMMMMMMMLLLLLLMNNNNNMNNNMMMLLMMLLLMNLMNMLKLMONNNNNNNOONNNMLKKLLMNOOOMMMMMMMMMNNNMMNNOOONNMMLLLLLMMMNNNNNNNNNNNNNNNNNNMMMMMNNNMMMNNMMKLMNOONNNMLMNNNMNNNNNNNNNNMNOOONNNNNNNNNNNNNNNNNNNOPPPOONNNMMMMNNMMMMMMMMMMLLKLMMLLLLLMMMMMMMMMMLLLLLMMMNNNNNNNMLMMLKKLMMMLMMMMNMMLLLMNNONNNOOOONNNMMMMNMLLLNNNMLLLLLLMMNNNMMNONNMLKKLNOONNNMLLMMNNNNNMMNNONMLLMNNNMMMLLMMLLLLLLNNNNNMMMNOPONMNONNNOOOOOOOPOONOOOONNNMMMKLMMNOPPLLMNOOONJJJJKKKKLMNOPONNKLMMMNOPNNNNOOONLKKLMLMNMMLLLLLLPOONNNNNNOONOPPPMMLLLLLMOOPPPONNOOOOONNNNNNNOOOOPPPOOOOOOPPPPONNNNOPPPOOMNNNNNOOPPPOPPPPPOOPPPPPPPPONMNOLNPPPPPPNNOPPOONPPONLLMNOOPQRRRQPPOONMMMKJIGFGGGGGHIIHHGFFFFFGGGGFEEFGGGEEFGGGFEDEGHHHHGFGGGFFFFGGHHGGFFGHHHGFFFHIJIHHGGEEFFGFFEEEDEEFFGHHIIIHHHFFFFFEEEEFFGGGGFFGGGEEEEEDDDDEEEFGHHGFEEEFFFFHHHGFEFHIIHGGGGGGFFFFGGGGGGGGGHHIIHHHGGFFFFEEFHIIHGHGGGHIIIIIIHHGGFFFGHIIHHFGFFFFHIIIIIIIIHHGHIJJJIHHHGGGIJHIIIHHIIIHHGHHIIIIIIHIIIFGHIIIHGGGHHHHIJIIHHHIJJIIIIIIIJJJIJJJKKKJJJJJLLKJJJKMMMJJHHHIIIJJJJJJJJJJJIIIIJIIJJJJJIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJKLLKJJJKKJJJJKKJJJJJJKJJJJJJJKKKKKLMMMMLKJJKKKKKKKKLLLLKKKKJJJJJJKKKKLLKJKKKKLLKJJJJJKKKKLKKJJJJJJJJKKLLLLKKKLLKJJKKKJJKLLLKKKLLLLKKJKKLLMLKKKLNNMMMMMMMMMMMMMMMMMMMMMMMMMMMLLLLKLLLLLLLLMMMNNNMMMMLLLLLLKJJKLMLKLLLLLLLLKKLLLLKKLLLMMNNNLLLMNONNMMNONNMLMMMMNNNNMMMMLLLKKLLMMLKKLLLLMMMMNMMMLLLLLMMNNNNMMMMMMMMMMMMMMMMNMMMMLLMNOOONNNNNOOONNMKJKLMNOOOOMMMMMMMMNNNNNNOOOOONNMLLMLLLMMMMMNNNNNNMNNNNNNNNNNMMMMMNNNNNNNNMKLMOOOONOMLLNOMLLLLMMMMMNNMMNOONLMMMMNNNNNMNNNNMMMNOOONNMMMMMMMMNMMMMMMMLMMMLLLMLLKKKLLMNNNMMMMMLLLLLLLMNNNNNNNNMMMMLLLMLLMMMMMNMMMMMMMMNNNNNNNNOONNMMMNLKKKMMMLKKKLLLMMMMMLMNONNNMLLMNOPNMNMLLMNNOONNMLNNNLJJJKMMMMMMMMMMMMMMNONNNNNNNNNONMLLMNMNOOOOPPOPPPOOPPOOONNNMMLMMMNNNOLMMNNONNJJJKKLLLMMNNONNNLLMMMNNONMMNNNMLKJKLLLMOMMMMMNNOONNMMMMNMOONOPPNNNMMLLMNNNOOONNMOOONNNMMNNMNNOPPOOOONNNNMNOPOMLLKLMNMLLMMNOONNNOOOPPPPPPPPPPPPPPPPPOMLMOLNPPPPPPPPPPPPONOOONMMMMNNOPPPQQPPPOONNMJJIHGGGGFGHIIHGFFFGGGGGGGFEEFGGGDDEFFEEDFFGHHHGFFGGGFEEEGHJJIGGGEFGGGHIIGHIIHGFFEFFGFFFEFFEEEEFFGGGHHHGGFFFFFFFFFFGGGGFFFGGGFFFGEDDDEFFEFGHHGFEEGHHGHIIHGHHHIIJJGGHGGFFFGGGGGGGGGGFGHHHHHGGGFFGGFFGIJJIHIHHHIJIIIIIIHGFFFFGHIIIIHHGGGGIJIIIIJJIIHHGGHIJJIIIHGGHIIJJJIIJJIIHHHHIIIIIHIIIIGGGHHHHHGGHHHHIJHGGGIJJJIIIIIIJJJJJJJKKLMLKJJJKKLLKLMNNNKJJIIJIIJJJJJJJJJIIIIJJJJJJJJJIHIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJKKKKJJJKKLJJJJKKJJIIJKKKJJKKJJJJJJJKLLLLKJKKKKKKKKKKLLLLKKJJJJJJKKKJJJKKKJJJJKKKJJJJKKKLLLLLKKJJJJJJJKKLLLKJJKLLKKJKKKKJKKNMLKLLLLMLLKKKLLLKKJKLNOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLLLLLLLLLMMMMLLLLLLLLLLJJJKLLLKLLLLLLLLLLKKKKLLLLMMMMNNLLLMNONNLMNNNMMLLLLLMMMMNNMMMLLLKKLMMMLKLLLMMMMMMMMMLLLLMMNNNNMMMMMMMNNNMMMMMMNNNNNMMMNOOOONNNNNNNNNNMLLLMNNOOONMMMMMMMMMNNNNNOPOOONMMMLMLLLMNNMNNOOOONNMMMMNNNNNNMMMMMNNNMNNNMLLMNOPPOOOMLLNNLKKLLLMNNNONMMMMNMMMMMNNNNNMMMNNNMMNNNNMMLMLLLLLMMMMMMMMMMMMNMMLMMLLKKKLMMNNNNNNNNMMLLLLLLNNNNNNNNNONNMLMMMMMMMMMMMMMMMMMLNNNNNNNOOOONLLMNMLKKLMLKKKKKLMMMMNNMNOOONNNNNNNNONMMMLLMNNNNNMLLNNMLKJKLMMMMNNNNMMMMMMNONNNNNNNONNMLKKLMMNOONNOPOOPPOOOPPPOONNNNMMMMMNNNNNNNNNNNLLLMMMNNNNNMMMMNMMNNMMNNNNMMMMKJJJKLLKMONNNNNNOONNMMMNOONOPOOOONMNNMLLMNMMNOONNMOOONNMMMMMMMNOPPPOOOONNNNOPPONMMKLMNLLLMNOPONNNONOPPPPOOPPPPPPPPNOOONNNONOPPPPOPOOPPPONMNNOOOONMOOOOOPPPOOOPOONNEFGGFFFGGGHIJIGEFGIIIHGGFFEFFGFFEEFFEEEEGFFFGFEDFGHHGEEFGIJJIGGGFFGFFFGHGGHGGFFFFFGGFEEFGGGFEEFGIHHHIIHHFFGGGGGGGGGGFFFFGGGHHHHIFFEEGGGFFGHHGFFFHIJHHJJHGHIIHIJJGHGGFFFGGGGGHHHHGFFFGGGGHGGFFGGGGGHIJJIIIIIIJJJIIIJIIHGFFFGHIIJJIIIIHHJJJIJJJJJIHHGFGHIIJJJIHHHIJJJJJJJJIIHGGGHHHHIIIIIIHHGGGGHIHHHHHIIIGFFGHJJJJJIIIJJJJKKKKKKLMMLKKKJJLKKKMMNMLKJJJJJIJJJJJJJJJIIIJJJJKKJJJJIIIIJJJJJIJJJKKKKKKKJJJJJJIIJJJJKLKKKKKKKKJJJJJJJJIIJJKJJJKKJJJJJJJJKKKKJJKKKKLLLKKKLLLLKKJJJKKKKKLKKKLLKKKJJKKKKJKKKKLLLLLMMLLLKKKKKKKKLLKKKLLMLLJKKKKKKLNMLLLMMLNMMLLLLLKKKKKLNNLMMMMMMLNNNNNNNNLLMMMMMMMMMMNNNNLLLLLLLLLLLLLLKKKKKKLLLLLLLLMLLLLLLLLLLLMMLKKLMMLMMMMMMNLLLMNNNMLMMMMMLLLLLLLMMMNNNMMLLLKLMNNMLLLLMMMMMLMMMMMLLLNNMMMMMMMMMMMNNNNMMMMNNNNNNNNNNOONNNNNNNMNNNMMMMMNNNNONNNNNNNNNNMNNNNNOPOONNMMMMMLLLMNNMNNNOONNNMMMMMNNNNMMMMMNNNMMMNMMLLMNOPPOONNMMNNLKMMMNNOOOONMLMMMMNNNNOOOONMLMNNMMNNNNNMMMLLKKLLLLMMMMMMMMMNNNMMMMMMLLLMMNNNNNOOOOMMLLLLLLMNNNNNNNOONNMMMMMMMMMMMMMMNNNMMLNOOONNOONNNMLLMOONMMMNMKKKKKLMNNNOONOPPPMNNNONNNNMMMMLLMMMMMLLLLMMMMMNNNMMNNNOOONNMLLLLMMMNNNNOOMMLLKKLLNOOOMMMNNOOONNNOPOOONNNNLLLMNNNNOOOONMMNMNNNNNNNONNMMMMMNNONMMMNOONMMLKJJKLMLKLNNNNMMMMMNNNOOPPPOPPONOOOMMMLKJKMMNNOOOONPPPPOONNLLLMNOPPPPPPPPPPPQRQPPOOLNOOONNOOOOONNNONOPPPPONPPPPPPPPNNOOPPPPOPPPPONNNNOOOONNNNOPPPONNNMMMMNONNOPPPOODEFFEEFGHHIIJIGEFHJJJIGFEEEFGGFEEFFFEEFGGGFFFEEDFGIHFEEFFHIIGFFGGGGFEDDEGGGGFFGGGGGGEEEFFGGFFEFFIHHHHIHHFFFGGHHHHGGFFFFFGGGHIIIIHGFGHIHGFGGGFFFGGIIGHJJHGGGHHIIHHHGFEEFGHHHHHHHHHGFFFGGGGGFFFGGHIIIIIIIJHHIJJJIHIIIIHHGFFGHHIJJJIIIIHHIJIIIJJJJIHHGFFGHHIIJJIIIIJJJJJJJJJIHGGGGGHHIJJJJIHHGGGHIIIHGGHIIHGFFGHIIIJJIIIJJJJKLLKKKKLLLLLLLKKJJKLLLKKJJIIIIIJJJJJJJJJJIIJKKKKJJJIIJJJJJJJJJJJJJJKKKKKKJJJJJJJJJJJJKKLLLLKKJJKJJJJJJJJJJJJJJJKJJJJJJJJJJJKKKKLKKKLMLLKLLLLLKJJKKKKKKKLKKKLLLKKKKKLLKJKKKKKKLLLMMMMMMLLKKKKKKKLKKLLLLKJJKLLKLLNMLLLMMMNNMMMMMNLLLLLLMMLLMMMMLLNNNNNNNNLMMNNNMMNNNNNMMMLLLLLLLLLLKKKKKKKKLLLLLLMNNNMMLLLLLLMMMMMLLLLLLMMMNMMLMMLLLLMNMLLLLLLLLLMMMMMMMMNNNMLLKKMMNNNMLKMMMMMLLLLLLMMMMMNNMMMMMNMMMMMNOONMMMNNNNMMMNNNNNNMMMMMNNNNNMLLMNNNNNNOOONNNNNNNNNNNMMMNOOONNMMMMNMLLNONMNNNNNNNNMMNNNNNNMMMMMNNNNMMMMMLKLLNOOOONMMNNNNNMOOOOOOOONMLLMMMMNNNNNOOONMLLNNMLMMNNNMMMLLKKLMMLLLMMMMMMNNONMMLMMMLLLMMNOOOOOOOONMLLKKLLMMNNNNNNNNMMMMMMMMMMMMLLKLMNONMMNNONMMNNMNNMLLNPONMMNNMLKKKKMNNNNOOOOPPOMMMMNNNNMLLNNLLMLKKKKKLLNMLMOPPONNNNNNNNNMLLKLLMNNNNNNNNMLLLLLLLNNNNNMMMNNONMMMNOOONNMMMLLLMNOOOOOPONMNNNNNNMLLMMMNNNNMMNNONNNNOPONMMLLKJKMNMKKMMMMMMMMMOOOPPPPPOPPNMNNNMNNLJJKLMNOOPPOOPPPPPPONLLMMNOPPPPPPPPPPQRRQPPOOMNOPPPPPONNNOOPPPOOOOOOOPPPPPPPPPNMNOPPPPPPPONMMNNNNOPPPONNNOOONMMMLLKKKMNPPPPPPGHHGFEFGHHHIIHFDEGJKJHFEEEFFGGFEDEEEEFHJHGFFFFEEEGHGFDDEEGHHFEEFFFFFEEFGGGGGFFGHHHHFEEEFDEFFEEEFFEEEFFFEEEFFGGHHHGFEEFFGGGGHHIIIJHGHIJHGFFGFFFGHEHHFGJJHHGFGIIHGHHGFEEFHHHHHHHIIIHGFGHHHGGFFFGGHJIIIIIJJHHIJJJHGGHHHGGFEFGHIJJJJHHIHGGGHGGHIIIHGHGGGFFGGHIJJJJIJJJJJIIJJJJIHGGGGHHIJJJJIHHHHHHIIIGFFGHGFGGFGHHHHIIIIIJJJJKLLKJJKJKLMMMMMJJJKLLKJJJIHHHHHJJJJJJJJJJIIJKLLJJIHHIIJJJJJJJJJJJJJKKKKKJJJJJJJJJJJJJKKMMMMLJJJKJJJJJJJKJJJJJJIJJJJJJJJKJJJJKKKLLKLMMMLKLLLLKKJKKKKKKKLLKJKKLKKLLKLLLLKKKKKKKKKKLLMMMMMLLLKKKJJKKKKKKJJJJLLLLLMMLKKLNNNNMMNNNOOMMMMMLLMLLLMMLLLMMMMMMMMLMNNONNMNNNNMMMLLLLLLLLLLLKKJKKKLLLLLMMMNNNNMLLLLLMMMMMMKKLLLLKKMNNNLLLMLLLLMMLLLLLLLLLLNNNNNNMMNNMMLKKKNNNNNMLKMMNMMLKKLLLMMMMMONMLLMMNMMMMMNOONMMMNNNNLLMMNNMLMMMMMMNNNNNMLLMONNMNNOPPNNNNNNNNOONMLLMMONNMMMMNNMLLNOONMMMMMMMMNNNNNNNNMMMMMNNNNMMMMMLKKLMNOONNLMNOOOOOPPPONNMMMLLLMMMMMMMMMMMMNLKLMNMLLLLLMMMMMLKKLMMLLLMMNNNMNNONMLLLMLLKLLMMOOOOOOPPNMLLKKLLMMMNNNNNMMLLMMMMMMMMMLKKJKMNOONNLMMMLKLMLMMLKLNPNMLMNNMLLKKKMNONMNNNNOONNMMLLMNNMLMNNMLMKJJJJKLMOMLMOPOMNMMMMMMLMMLLLMNONNNNNMMMLLLMMMMLLLMMNOOONNNNMLLMONNNMMMLMMLMNOONOOPONNNOMNNMKKKKKMOPPONMMNNONNOPPPNMMMMLJLNOMKKLKKLLMNOPOOOPPOONNOOMKLMMNOOMKJKMMMNOOOOOOPPPPPNMLLMNOPPPPPPPPPPPPPPPOMMMMMNOOOOOOMLMOPPPPPNMMNPPPPPPPPPQPNLKNPPPPPPPOMMMMMMMNOPPONLLLMNMNNNNNMKKMNPPQQQPJIHFEEDDHIJJHGGGGHIJJHFEFFFFFFFFHGFEFGHIHGGGGGGFHHHHGFEDGGGFFEEEEEFFGGHHHIHFEGHHIHHGGGFFEGHGDDEGGGFEEDDDFGIJJIIIIHHGGGGHGGGGHIJJJJJJJJIHGGGFEEFGGGGGGGGGGGHHHHGGGGFFFGHHHHHHGFGGFEEGHHHHGGGFFGHJIIIIIIIIGFFHJIHHIHGGFGGHFGIIHHIJJIHGGIJJJJIHGGFFFGGGGGGFGHJJJIHGIIJIIJJKJJJIHHHHIIIJJJJIJIIHHIIJJJHHIIHFHHHIJJKLKKJJJKLLKKKKKKKLJJJJKJJJJJJJJJJJIIIIIIGFIIJKLKJIMLKKKKJJIIIIIJJJJJIJJJJIJJIJJKKJKKJJJJKKJJJKKKKKLLKKJJJJKKJJJJJJKKJJJJKLLLLLKKKKLKJJJJKKKLLLLLLLLLLLLLLLMMLLLLLLJJKKKKKKLKJJKLLKLKKJJKKLLLMNNMMMLLLLKKKJMMLLLLLLJJKKKLLLLLLLLMOOOOONNOOONNNNNMMMMLLLMMLLLLLLLMMMNNNNMMNNNNNNMMLLLMMLKKLNMMMLKKLMMLLKKLMNMMMMLLLLOOONNNNNLLLLLLLLNNMLLMMNNMLLLLLLMMMMMMMMONMMNONMOONMMLKKMMLLLMMMNNNNMMLLNNNMMLLKMMMMMNNNNNNNNOOPOONMMLLLLLLMMMMMONNNMMMNONMMMMMNNNLKKLNONNNNNNNNNOPONMMMNNMMMMMMNNNOOOOONNNNNNOONMMLLMMNMMMLLMNNNOOONNMMNNNNNOOOQOPPNNPPPPNMMNOPNMLKKLLMMMMNNNNNMMMMMMMMNMLMNNNMMMMLLLMNONNNNNNNNNOOONMMNMLMMNNMNNNOOOOONMMMNOOONNNNNNNNMMMMMMNNONLMNNLKLMMNNNNMMNNMLKLLNNMLLMNPNNNNMMMMLLMMNNOOONNNOONNONMLKLMNLMMMMMMMKKJJKKLMNNOOOOPPNNOONMLLMLKKLMOPOONNMMMMNNNOOOONNNNNNMMMOOONNMLLNNMMMMMMMNONMMNPONNNOONMMMLLLLLLMNPPPONOPPPONOPPQOMLMMLKKLMMLLLMMMMMNNOOOPPPOOONPPONLLMNPPONMLLKMNNOPPPOOPQQQPONNNOPPPPPPPOPPPPPOPPONMMNMMMNPPPPOOOOOOPPPPPPPPPOOPPPPPQRPOMMOPPPOOOOONMMNNNMNNOOPONOOONMLMNMLKKKNNOPRRQPJJIHGFGGGHIIHGGGHIIJJIHGHHHHIIIHEEDDEFGGHGGHIIIHGGGGGGFFFFFFFGFFGGGGHHHHHIHGFHIIJJIHHGGFFGHGEDEFGFFFFEEEGHJJJIIHGGGGGGHHHHHIIJJJJJJJJIHHGFEEEEFFFFFFGGGGHHHGGHHHGGGGGGHHHHHHGGGGGEEGHHGGFGGGGGGHIIJJIIIIHGGIIHHIHHGGGGGHGHHIHIIJIIIHGHJJJJIHHGGHIIIIIHHHHIJJJHGGGHIIIHIIJJIIIIIIIIIJJJJIIIIHIIJJJIHIJKJJIIIJJKLLLKJJJJKLKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJIHIIJJKKKJLKJJJJJIIIIIIIJJJIIIJJIIIIIJKKKKKKKJJKKKKKKKKLLLLLLKKJJJLLKKKKJJJJJJJJKLKKLKKJKKKJJJJJJJJKKLLLLLLLLLLKKKLLLLKKKKJJKKKKKKMLKLLMMMLKKJJKKLLLMMNMMMLLLLLLLLLLLLLLLLKKKKKKKKLLMMMMMMNNNNNNNNNNNNMMMMMLLLMMMLLLLLMMMMMNNNMMMNNNNNNNMMMMMLLLMNMMMLKKLMMMLLLLMNLLLLMMMMNNNNMMMMLLLLLLLLNNMMMMNNNMLLLMMLMMNNNNNNONMMOONMMMMLLLLLMMMMMMMMNNNNNNMMMMMMMLLLNNMMMMNNNNNNNNOONNNMMMMMMMMMMLLLNNNNNNNMNNNNNNMMNNMLLLMNNNNNNNNNNOOONMMMNNNMMMMMNNNOOOPPNNNNNNNNONMLKKLLMMMMMNNNOOOONNMMNNNNNNOOOMOPPPQPPOMLMMNONNMLLLLLMMNNNOOOMMMMMMNNNMMMNNNMNNNMLMNOOONNNMMMLLMMNOOOONMNNOOONNOOONNNNNMNOPPPNNNNNNNNMMMMMMNNNMLMNNNLNMMLMMNNOOOONMMMNNNMMMNONNNNNNMMNNNNNOOONNMNNNNMMMKKKKMMNNNMMMMMKKKKKLLMNNNNNNNNNMKKLMNNMLLLMNOPPPOONNNNNNMNOONNNNNNOONNNONNNMMLMMNNNNNNNNONLLMNNMLMMNMLMMMLLLLMMNOPONNNOPPONOPPPNMMMMMLLMMMMLLMNNNNNOOOPPPOONNMNNNMLMNONNNNNNMNNNOOOPPPPPPPPOOOOOOOOOOONMMNOPPPPPPONMNNOOOPPPPPOOOONNOOPPPPPPPOOOPPPQRSPPOPPQPPOOPOONMLNNNNOOPPPOOPPONNMNOONNNOPOPPQPOMHIHGFEFGGHIIHHGGIIIHHHIIHHHGGFFFFFFFFGHHHHHHIIIIFFFFGGHHFFFFGGGHHHHHHHHHHIHGGHIJJJJIHGGGHHHGFEEEHHGGGGFFHIJJJIHHFFFGGHHHGHHIIJJJJJIIHHHHHFEEFGFFEFFFFGGGHHGGGGHHHHHHHHGGGHIIIHHHHFFGHGFFFGHHGFFFIIIIIHHHHGGHHHHIHHGGGGGHIHHHHIIIHIIHHHIJJIHHGHHHJJJJJIIIIIIIHGGGGHIIHHHHIIIJJJJJIIIIJJIIIIIHIIJJHHGIJKJJIJJJKKLLLLKJJJJKJJJJJJJJJJIIIIIIJJJIIIIIJJJJJJJIJIJJKKKKLKJJJIIHIIHHHHIIIIHHIIIIHIIJKLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJKLJJKKJJKKJJJJJJJJJJJKLLMMLLMMLKKJKKKKKKKKJJKKKKKKLKJKLLLLKKKJJKKKLLMMMMMLLLLLLLLLKKKKLLLLKKKKKKKKLLMNNMLLMMMMMMMMMMMMMMMMMMLMMMMLMMMMMMMMMNNONMMNNNNNNMMMMMLLLLLMMMMLKKLMMMLLLLMMLLLLMMMMMMMMMMMLLLLLLLLLNNMMNNOONMMMMMMMLMNOOONNNMMMOOONLLLLMMMMNMMMMMMNNNNOONNNLLLLLLMMONNNMMMMNNNNNNNNMMMMMNNONNNMLLLKNNNONNMMMMNOONNMNNMMMMMMMMMNNNNNNNNNMMMNNNNMMMMNMMNNNNNONNNNNNMMNMMLKKKKMMMNNNNNOOOONNNMNNNNNNNOOMNPOOPOPNMLMMNNNNNMLLKKMMMNNNOOMMMMMNNOONNNNNNNNNNMMMNNOOOONMMLKKLLMNOONNNNNOOONNONNNMMMMMNOPPPNNNNNNNNMMMLMMMMNMLMOOONONMKKLNOOPPONNNNNOONNNNONNNNNNNNOOOOONNNNMMMNNMMLLKJKLMNOONNNMMMLLLKLLMMNMMMMMMMMKJJMNNMMMMMNOPPPPOONNNNNMMMNNNNMNNOOPPPNNNNNMMLMMMNNOOONOONLKLMNMLLLMMMNMMMMMMMMNNONNNNNPPONOONNNNNNMMLMMNMMLLLOONMMNOOPPPOONMMLMMLLMNPNNNNNNONOONNOPPPPPPONNNOOONNNMMMLKLMOPPPPPPOMMNOPPPPPPPNOPOONMMNPPPPPPOOMNOPPPQRPPPPQQPOPPPOOMLLNNOOOOOOOPPPPOOOKLNOOPPPPPPPPOMJGGHFEDEFFGHHIHHHHGGGHHHHHHGFDDDDGHHHHHHIIIHHHHHGGFFFFGHHFFFFFFFFGGGGGGGGGHHGFGHHIIIHHGGGHGGGGFFFIJJIHHHHHIJJIHGGEFFGGGGGFGHHIIIIIIHGGGHHIGFFHHHFEEFFFGGHHHGGGGHHHIIIIHGGGIJJJIIIIGFGHFFFGGGGFEEFGHHHHHHHHHHGGGHIHHGGGGHHIHFFHIIIHHHHHHHHHHGFFGHHIIIIIIIIIIIGFFGHHIIIHGHHHHIJJJJJIIIIJJJIJJIIHIIIHGGGHIIHIIJJJJJJMLKJJJJJIIIJJJKLJJIHHHIIIIIIIIIIIIIJJJJJJJJJJKKKKKJJJJIIHHHHHHHHIHHIIJIIHIJKLLLKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJKKJJJJJJKKJJKLKKKKJJJJJJJKLLLLLLMMMLKKLKKKKKKKKKKKKKJJKJJJKLLLKKKKKKKKLLMMMMLLKKKKKKJJJJJKKLLLKKKKKKKKLLMMMMLLMMLLLLMMLLMMMMMMMMMMMMMMMMMMMMMMMNOOONMMMMMMMMLLLLKKKKLLLLLLLLLMMLLLLLLLMMMMLLLLMMMMMLLLLLLLLLLLNNNNNOOONNMMNNMMKLMNONNMNMMMNONNLLMMNNNONNNMMMNNMMNNNNNNMMMLLMMMNNNNNNNNNNNNNNNNLMMMNOOPNNMMLKKKMMNOONMMMMNNNNNNNNNNNMMLMMMNNNNOOONNMNNONNMMMMMNMMMMLLLLNNNNNMMMLLLLLLLLLMNNOOONNOOOONNNNNNNMMNOPMOPPRSQQPNMNNNMNNNMMLKKLLLMMNNNNMMNNNOOOOONNNNNMMMMLLMNNOOPONMMNMMLMMNNNNMMMMMMMNNNNMMMLKKLNOOONNNNNNNNMMLLLMMMNMMNOOOOPOMLLMNOOOONNNNNOOPOONNONNNNNNNOOOOONNNNNMMMNNMMLLKKKMNOOONNNMMMMMMMMMNNNNNMMMMLKKLMOOMKLMNOOPPPOOONNNNNNMLLMNNNMNNOOOOONNNNNMMMMMNNNNOONONMLLLMNNMLLMNNNNMMMMMMMMNNNNNNNPPONNMLMNOONMLLLMMMMMLLNMLLLMNNPPOOONNMLLLLLMNOPOOOONNMOOOOOPPPPPPONNNONNMLLLLMKKLMOPPPPPPNMMNPOOOPPPONOOOONMMNPPPPPPOOLMNOOOPPOOOPPPONOOOOONMLMMNOOOONPPQQPOOOJKMOPPPPPPPPPNMKIIIHFEEFFFGHIIIIGGGHHHHHHHHGEEEFGHHHGFGGIIIIHHHHGGGFFGGHGGFEEDDDFFFFGGGGGHHFEEFEFFFGGGGFGGFGGHGGIJJJJJJJIJJJJIHGGGGGGFFFFGHHIIHHHGGFFGIIIGFFHIHFEFGGGGHHIHGGGGHIIIIIIHGGGHIJJIIIIGFGGFFFGGGFEEFGGGHHIIIIHIHHGHIIHHHGGHHHHGEFGHIHIHFGIIHFGGGGGGHHGGHHHIIIJJIHHHIJIIHGFGHIHIJJJKKJJIIIJJJJJJJIHHHHHHHHHIHHJJJJJJJJLKKJJJJJIIJJJKLLJJIIIIIJHIIJJJIIIIIJJKJJKJJJJJJJJJJJJJJJIIIIIIHHIIHIJJJJJJKKLKKKKKJJJJKKKKJJJJJJJJJJJJJKLLKKKKJJJJKKJJJJJJKKKKLLMMMLLKKJJJJKKKKKKLLMMMLLLLLLLLLLLLLLKKJJLKJKLLLLKKKKKKKKLLLMMLLKLLKKKJJJJJJJKKLLJJKKKLLLMLLLLMNNMMMMMMMMLLLLLMMMMMMMMMMMMMMMMMMMMNOOONNNLLMMMMMMLLKKLLLLLLLLLLLLMMMMMLLLMMMMLLLLMMMMMMMMLLLLLLLLMNNNOOOOONNNNNNMKLMOOONMMMMMNNNMMMMMNNNNONNNMMNNMMNNNNNNNNMMMMMMNNNNNOOOOOOONNNNLLLMNOOPMMLLLKLLLMNNNNMLMMMMMMNNNOOOONMMMMMNNNNOOONNNOOPNNNNNNNONNMMLLKKMNNNNMMMLLLLLLLLMMNOOONNNNOOOOONNMNNNMNPPNPSVZ\ZTRPNNNNMMMMMMMLLLLMMMNNNNNNNNNOOOOOONNNNMMNMMMMNNOPPPPONOONMMMMMNNNMMLLLLLMMMMMMLKKLMNOONNNNNNNNMMMLLLMMONNNOOONPOONNNNNNNNNNNNNNOPPONNNNNNNNNNONNNNNNNNNNMMNNNMLLKKLMNNMMMMNNNNNNNNNNNONNNNMMMMLMOOONLKLMNOPPPOOOOOONNNNMMMMNNNNNNNNNMMMMNNNMMMOOOOOOOONNNNMMMNNNMMMMNONNMMMMMMMMMNNNMMNOPNMLLKMNPONLLLLLLMMMMMLLLKLMNNOOOOOOOOLMMLLLMNPPOOOONMOPPPPPPPPPPPONNONNMMMMNNLLMNPPPPPPPNMNOPNNOPPPONNOOOONOOPPOOPPONMNOOONOOPOOOOOONNNOOONMMLMNOOOOOPPQPPOOOLMNOPPPPOOOOPPONJJIHGGFFEFFHIJIIHHHHHHIHHHIHGGIJHHIHFFGHHIIIIIJJHHGGFFFFHGFEDDDDGGGGHHHHGHHEDDDDDDEFFFFFFFFFGHHHGHJJJJKLJJKLKJIIHHGGFFEEHHHIIIIIHGGFGHIIGFEFGGGFFGHHGGHIIHHHHHHIIIIIIHHGFGHHHHHHHGFGGGFGHHGFEFGHHHIIJJJJIIIHIJJIHHHHHHHHGFFFFGHHIGFFHIHFHHHHHHHHGGGHHIJJJJJJJJJKJIGFEFHJIIJJJJJJJJIIJJJJJJJIHHHHIIJJJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJIIJJJJJIIIIJJKKKLKJJJJJJIJJJJIJJJJJJJJJJIIIIJJJJJKKLKKJJKKJJJJKKLKKJJJJJJJJJKKKKKKKKJJJJJJKJJJJJJJKKKKKLMMMLLLLKKKKKKKKJKKKLLLMMLMMMMMMMLLLLKKJJLKJJKLLKKKKLLKKKKLLMLLKKMMLLLKKKJJJJKKKKJJKKKLLLMMLLLMNONMMMMMMNLLLLLLLLLMMMMLMMNNMMMMMMMMNNNMMMMMMNNNNNNMMMMMMMMLLLLMLLMMNNNNMMLLLLMMMMMMMMMNNNLLLLLLLLMMNNOONNNNNNNNNMMMNOOOONMMMMMMMMMMMMMMMMONNMMMMMMNNOOOONONNMMMMMNNNOOOOOOOOOONNNLLLMMNNOMMLLLLLMLMMNNNMMNMLLLMMNNOOPOONMMMMNNNNNOONOOPPPOOOOOOPPOONNMMLLMNNNNNMMNNNNMMLKNNNNNNNNMNNOOOOOONNOOMOQQPSW[_a]WTPONONMNNNNMMMMNNNNOOOONNNNNNOONOOONNNONOOONNNOOOPPPPPPNNNNNNNNOOONMLLLLLMMMMMMNMMMNOOOMMMMMMMMMMMMLMMMOOOOONNNOPPPOONNONNNOOONNOOONNNNONNMMNNNMMMMMNNNNNMNNNNNLKKKKLMMMMMMMMMNNNNNNNNONNNNMMMMNOOOMLLMLLMNOOOOPPPPPPOONNMMNOONONNNMMLLMMMMNMMMOOOOOOOONNNNNNOONNNMMMMNNNMMMMMMLLMNNNMLMOOMLLKJMNOOMLLLLLLMNNNNLLMMMNOOOOOOPPOOMNNMLLMNONNNOPONPPPQQQPPPPPOONOOOOOOOPPPMMMNOPPPPPONNNOPNNNOPPPPNNOOOOPPPPOOOOONOPPPPOOOPPPOOOOOMNNOONNMMNNOOPPPPPPPONOOMMMMNOOONNOOPPPPJHGGHHFEDDEGIIIHIHHGGHIIGHIHGGIJHIIHGGIJHIIIIIJJGHGGGFFFGGFEEFFFHHHHHHHHGHHFDEEDDDEFFFFFFFGGGGGHFHIJIIJKIJKKKJJJIHGFEEFFHHHHHIIIIHGGGGHIFFFFFGGFGHIIHHIJIIIIIIIIIIIHHHHHGGHHGGGHGFEGGGGHHHHHGHIIIIIJJIIIIIHHJKJHGHHHHHHHGGGGFFFGHHGGFGGGHIIJIIGGGGGHHIJJJKKKKJJJIIHGFGHJIIIIIIJJJIIHIJJJJJIIHHIIJJJJJKKLKKJJJJJJJJJJJJJJJJJJIIIIJJJJJJJJIJJJJIHHIIIJJKKKKJJJJJJJJJJJJIJJJJJJJJJIIIIIJJJJJKLKKJKKKKKJJKKKKKJJJJJJJJJJKKKKJJJJJJJJJJJJJJJKJJKKJJKLLLKKKKKKKKKKKKKKKKJJJKKLLLLLLMMMKKKLLLKKLKJJKKKKKKLLLLKKKLLLLLKKLLLLLLLLKKKKKKKKKKKKKKLLNMMMMMNNNNMMMMNNLLLLLLLLLMMMLLLMNNMMMMMMLMMMLLLMMMNNNNNNNNMNNNNMMMLLMMLKLMNNNNMMLLLLMMMMMMMNNNNNLLLLLLLLMMNNNNMMNNNNNNMMNNNOOOOONNNNNMMMMMMMMMMMONNMMMMMMNNNNNNNNNMMMMNNNNOOOOONNNNOONNNMMMMMMMMNMMLLLMMMMNNNNNNMMMMMMMMNNOOONNNNNNNNNNNONNOPPPOOOOOOPPPNNNNNNNNMMNOONNMOOOOONMLNNNNNNNNMMNOOPPPPOOPPNPTUUY^bed_ZVQOPPPOPPONNNNNOOOOOOOONNNNNNNNNNOONNNOOOPOOOOPPPPPPPPPMNNNOOONNOOONMMNMMNNNNNMPONNOOONMMMMMMMMNNMMMMMMOOOONNNNOOPPOONNONNNOOOOMNNNMMNOPONNNNNONNNNNNNNNNMNNNNMMLLKKLLMMMMMMMMMNNNNNNNNMMMMMLLLMMMMNMMLKLMNNOOOPPPPPPOOONNOOPONOOOONMMLLMMMMMMMMMMNNNNNNNNNNNOOOOOONMMNNNMMMMMMLLMNOOMKLMMLKLLLMNNNNMLLMMMMNONNMMNNOOOOOOOOOOONNNNNMMMNNMLMOPONPPPPPPPPPOONMNOPPPPPPPPPOONOOOONNOOONNOPONNNOPPPNNOPOOOPPPONOOONOPPPPPPPPPPOOOOONNNONNMMNNNNOPPPONMMNOPPMLKKLMNNNOOPPPPQJHGGIIHFDDDFHIIHIHFEEFHIIJJHGFGIHHHGFGIKHIIIHGHHGGGHGGFFFFFFFGHIIHHHHGGGGHHFEFFFDEFFGFFEFGGGFFFGHIJIHGHIHIJJJJIIIHGFEFFGHGGGGHHIJIHHGGGHFGGGGGGHHIJJHHIJIIIIIIIIIIHHHHHIHHHHGGHIGEEFHHHIGHIJJIJJIIIIIHGGHGGGJKJFGHHHHHHHGHIHFEEFGHIGEDGIHHIJIHFEHHGGHHIIJJKKJJIIIJIIHHIJJIIHHHHIJIHHIJJJJIIHIIJJIJJJJJJJKJJJIIIIIIIIJJJJIIIIIIIIIJJJJJJJJJJJJHGGHHHHJJJJJJIIJJJJKKLKJJJJHIIIIIIHIHHIJJJJKKLKJJKLKKKKKKKKJJJJIJJJJJJJJJJJKKKKKJJJJJJJJJKLJJJJJJJKKKJJJJJKJKKKLKKKKJJJJJJKKKKLLLLLJJKKLLMMNMLLLMLLKKLMMLKKKLLLLLKJJJKKLLLMKKKKKJJJKKKKKKKKNNNONNMLNNMMMMNNLLLLKKKKLLMMLLLMMMMMMMMMLLLLKKLLLLMMNNNNNMMMNNNMNMLLMMLKKLLMMMLLMMMMLLLLMMMNNNNNLLLLLLLLLMNNNMMLNNNNNNMLMNNNNNNNOOOONNNNNNNNNNNNONNMMMMMMMMMMMMMMMLLLMNOOOOOOONNMNNNNNNMNMMLLLLLONMMLLMMNNNNNOOOMMNNNMMLMNNNNNNNNNNNNNNNNNNOPPPONNNNNOOOMMMNNOOOMMNOOONNNOOPPOONOONMMMNNLMNOPPPPPPPQPPQUVW]dhljd\WSPPQRQQQPONNOOOOOOOOOONNNMMNNNMNONNNNONOOOONOOPPPOOOOONNOOONNMMNOONNNNOOOOONNMPONNNONNMMMMMMMMNNMMMMMMNNOONNOOOOOOOOONNMMNOOONMMNMMMNOPPONNNNOOOOOONNNNNMMNNNMNNMMLLMMNNNNMMMLMMNNNMMMLLLLLLKKJJKNPPMJKLLMNNNOOOOPPOOOONOOPPONPPOOONNMLLMMMNMMKKKKLLLLONNNNNNNPPPPONNNNMMMMMMMLLMOPOMKKLLKJLMMMMMMNNMMNNNNOONNMNOOOONNOOOOONNMNNONMMNNNLLLNONMONNNNNOOPONLLMOPPPPPPPPOPPPPPOONMNOONNOPONMMNOOONOOPOOOOPPONOOONNOPPPPPPPPPPONNNNNOONMMLMMMMNOPPNMKKMOPPNMKKMNOOOOOPPPPPIHHHIHGEFFGGGGGGEDEFFFHJJIHHIJJIIGFFFEHJHHHHHGGGHHHHGEDDEFFGGGGGIHGHIJJJJIHGGFGGFFFFFFFFDFIJIHGGHHIIIHGGJIIIIIHGIHGFFFGHGGGHIJIIIIHGGGHHGGGGGGHHIIIHGGHIJJJJJIHGIIHGGHIJIIJJIIIIGFFFGHIJHIJJIHHHJIHHIJIHHGGHIIIHHIJJJJIHGGHIIIHGGHIHGFGGGHHHHHGGHHHHHHIIIJJJIHHHIHHHHHIJJJHGHIIIJIIHHIIJJJJJJJJJJJJJJJJJJJJIIIIIJJJJIHHIIIIIHIIIIJJJKJJJJJJJJIGFIIIIIJJJJJJJJJKKKKKJJJKKJJKJJIIIIJJJJJJJKLLJJKLLNLJJLMLKJJJJJJJJKJJJJJJJLMNNMKJJJJJKLMLKKKLLKKKLKJJJJKLKLLLLLLLKKJJJKKKJLLLLKKJJJJKLMMNNNNNMMLLLMMMMLLLLLLLLLLKKLLKLMNNMLLLKKKLLLLLLLLLLNMMLLLLLMNNOONNMMLLKKKKKLLLLLLLLNNMMMMMMLLLMMMMMNNNNNNNNNMMMMMMLMMLLKKKKMMNNNMMLMMMMMLLLNNNMMMMMLMMMMMLLNNNNNMMMNMMMMMMNNMMMNMLLMNNOONNNNNNNNMMMOOONMMNONNNNNOOONNNNNNNNPPONNNNNNNNNNNOONNNNNOOOMNOOPONNNNNNOOPPONNNMMMMLLMOOOMKPPOOONNNOONNNNNNONNMMNOOOONNNNOONNNOOOONOOOOOPPPOOONMMNOOMLOPOOPPSRQSV]ffhkottoifb\VUVXXUSQPPPPPPPPPONNNMNOOONNNMMMMMNNNMNNOPPOOPPPPPOONPOMMNONMOOOOOOPPPONOPPONOOOONNOOMMLLMMOOONMMNNNMMMMNNNNNNMLLMNNNNNNNNNNNNNNNOOPPPPPOOOOOOOOOOOOONNNOPPONONMMLMMMNMMNNMLKNMMNOPNMMMMNNNMMLLMNNNNNMNOPPPONONNOOOPPPPOOOOOOPPOMMNNMNMMMNOOONMLLLLMNOONNNNNNNPPPNNOPNMLLMMMMMMOPPPOMNNMLKKLMLLLMNNNMNMKJKLNOONNPPONNPNNNONOPPPPOONNMNMMLLMMNOONNNNOOOONNNOPPPOOPPNNPOOOOOOOONOPPOOPRPONMMNPRPPPPQQQQPPPPPOOPPPQSSRQPPPONNNNNNNOONNOOOOOPPQQQPNMNPRQPPOMLMNOPOOOPQQPPHHHIIIGFHHHHHGFFDDDFFFHJJIHHIIIIIGFFFEFIHHGGGGHHHIIIHGEEEFFFGGGFFEFGHJJJJIIHHGGGFFFFFFFFFGHIHHGGGGGFFFFGHHGHHIIHJIHFFFFGHHGHIIHHIHHHHHHHHHGGGGHHHHIHGGHHIIJJJJIHHHGGGGGHJJJJIHHHGGGGHIJJHIIIHGGHIGFFGHHHHGGGGHGFGHIJJIHGGGGHIIIHHHGGGGGGGGHHHHHHHIIIIIIIIJJJIIIIIHHHHHIIJIHHHIHHIIHHHHIIIJJJJJJIIIIIIIJJIHHGHHIIJJJJIHHIHHHHHIIIIJJJKKJJJJKJJJIHJJJJJJJJJJJJJJJKKKJJJJJJJJJJJIIJIJJJJJJKJKLJJKLLMLJJLMLKJJJJJJJJKJJJJJJJKLMMMLKKJJJJKLKKJJKJJJJKKJJJKKKKLLLLMMLKKJJJKKKKKLLLLKKKKKLLMMMMNNNMMMMMMLLLLLLLLLLLLKKKLLKLMNNMMLLLLLLLLLLLMMMNNMMLLLLLNNNNMMMLMMMLLLKKLLLMMLLLMMLLLLLLMMMMMMMMNNNNNNNNNMMMMMMLLLKKKKLLMMMMMMLLNNNNNNMMNNNMMMMMKLLLMMMLMMMMMMMMMMMMMMMMNMMMNNMLNNNNNNNNNNNNNMMMNNNNMMMNOONNNNNNMMMMNNNNOOONNOOONMMMMNNNNNNNNNNNMMMNNNNNNNNNNOOOPOOONNMMMMMNOOMLNNNNNNNNNNMMNNNONNMMMNNOOONNNNOPOOOOONNMNOOOOOOOOOONMMMNNNOPPOPPQTSSZbhnnpstvuqmjhc`_`_]\YVSRQQQPPPPONMMMNOONNMNMMMMMNNONNOOOOONOOOOPPPPPOMMNONMNNNNOOPPPPOPPPONOOOOOOOONMMMMNOOONNNNNNNMMMMMMNNNMLLMNNNONNMMMNNOONNOOPPPPOOOOOONOOOOOOOOONOPPPOPPPPONMMMMMMNMLKMLLNPPONMMNOONNMLLMMNNNNNOOPPPOONMNOONNOOONNNNOOOOOMMNNMNNMNOOOONNMMMMNNOOONMLNONOONMMNOPPONOOOONNOPPPNMLLLKJKKLMLLLMNNMMMLLKLLMNMNPPPPPPOOOONNOPPPOONNNPONMLMMNOONNNNNNOOOPPPPOPOOPPOOPMMNNNNOOOPPPOOPQQPPOOOPRPPQQQQQQPPPPOOPPQRSSSRRQPPPOONNONOPPOOOOOPPPRRQPNNMNPPQPRQPPPPPPQQPQQQPOGHIJJJHGIIJIHGEDEDEFFGHJIIHHIIIIIHHHGEFGHGFFFGHIGGGGGFEEEEFFFFFEDDEFHIIIHHHHHGGGFFFEEFFFGGHGGGGHHGGFFGHHGFFFGHIIJIGFFFGHIIHIIIHGHHHIIIHHHHHGGGGGGHHHHGGHIIIJJJJIIHGGGGGGJJJJIHHHHHIIJJJJIIIHGFGGHGEFGIIIHHGGGGFFGHIJJIHGFFFGHIIIIHFFGHHGGGGGHHIIHHIIIJJJIIJJJJJJIIHHHHHIIIHHIHHGHHHIIIHHGIJJJJIGHHHHIIJJGGGGGHIJJJJJIIIIHHHHIIJJIJJJKKKKLLKKJJJJJJJJJJJJIIJJJJJKKKJJJJJJIIJJIIJJJJJJIJJKJKKKKLMMMLJJKLLKKJJJJJJKJJJJJJJJJKLMLKKKJJJJJKJJJKKKJJJKKKJKKKKJLLLLMMMLKJJJKKKKKLMMLKLLKLLMMMMMNNNNNNNNLLLLLLLLKKKLKKKKLKKLMMMMMMMMMMMMMMMMMNOONMMMLLLLNNMMLLKKLLMMMLKKKLMMMMLKLLLLLLLMMNNMMMMMMNNNOONNNNMMMMLLKKKKKLLLLLMMMLLLNNOOOONMNNMMMMLLKKKLLMMMLLLLLMMMLMMNNMMLMMMMNNNMNNNNMNNNNNNNNNMMNNOONMMNOOONNNNNLMMMNNNNNNOOPPPPNNMMNNNNOOONNNMMMMMMMNNONNNNNNNOOOOOONMLNMMNNNMMMNNNNNNNMMMMNNOONNNNNNOOONNNNOOPPPOONNMLNNNNNNNNNNOONMMMLOPPOPPPPUVZfquvvxzzxvtstrnkihfdgc]XUSSSRQPPONMLLMNNNMMMNMMMMNOOPOONNNNNNNNNOPPPPONMNONMMMNNOOPPPPPPPPONNOOOOOONONNNNOOPPONNNONNMMMMMMMMMLLLMNNNPONMMMNNOOOOOOOOOONNNNNOOOOPPPPPOONNNOOOPPQQPPMLLLLMMMLKLLLNPPPOMNOOONMMLLLMMNOOOOOPPPPPONOPPNMNNNMMMNNNNOONNOOMNNNNOOONNNOOOONNOOONLKMPNNNMMMNOPPOOOOOOOOOOOONMKKKKKKLMMLLLMNNNLMMMMLLKMMMPPPPPPOOPPNMNPPOONNNNPPNMLLLMOOOONNMMOPPQPPONONOPPPPPMMMNNNOOPPPPOOPPRRQPPPPQQQQQQQQPQPPOOOPQRSSRPPPPPPPOONNNNOPPPOOOOPPQRRPPMMNNOPPQRQQPPPPPQQQQQPPOFGIJJJHGHHIIHGEDFFFGGGGHIIIIIIIHIIJIHGFGGFFFGHIIGGGFFEEDFFFFFFEEEEFFGGFFGGHHHGGFGFEEEEFGGGHGGGGHHGGGGGHHGFFFFGHIIHGFFGHIIIIIIIHHGHHIIIIHHHHGGGGGGGHIHGGGIIIIJJIIIHHHIIIHIIJJIHHHHIIJJJJJIIHGFFFGGGGHIJJJIHGGHHGGHIJJJJIHFFFFHIIIIHGFGHHHHHGGGHIIHHHIIIJJIJJJJJJJIIHHHHHHIIIIIHHGHHIJJIIHGHJJJJHGHHHIIJJJIIHHIJJJJJJJJIIJJJJJJJJJIJJJKKKKLLKKJJJKJJJJJJJJJJJJJJKKKKJJJJJJIIIIIJJJJJIHHIJJJKLKKLMMLKJJKLLKKJJJJJJKJJJJJJJJJKLLLKKKJJJJJJJJKKKKJJJKJJKKLLKKLKKLMMMLKKJJKKKLLMNMLKKLKKLLLMLLMMNNNNNNLLLLLLLLKKKLLKKKKKLLMMMMNNNMNNNNNNMMMNNONNMMMMMMMMNMMKJJKKLLLLKJKLMMMMLKMMMMMMNNMNNMMMMMMNNNOONNONMMMMLKKKKKLLLLLLLLLLLLMMNOOONMMMMMLLLLKKLLLLLLLLLMMMMMLMMNNMMLMMMMNONNONNMMMNNNNNNNNMMNOPPONNNOOONNNNMMMMMMNNNNOPPPPPPNNNNNOOOPPPPONNMNNNNOOPPONNNMNNNNNOOONMLNNMMMMNNNNNNNNNNNNNNNOOOOOOOOOPPNNNNNNOOPOOONMMMMMMMMMMMMNOOONMMLOPOOPPPRZ_es}~{{||{zzyz}{wsqrqpqmf^YVUTUSRPPONMLMNNMMMMNNMMMNOPOONMMMMNONNMMMNOPONNNNNMMMNNNOOOPOOOPPONNNNOOONMOOOOPPPPPONNNOOOMMMMMLLLMMLMMNOOPONMMMNNOOOOOOOONNNNNNNNPPPPPPOOONMMMMNNPPQQPPNLLLLMMNMLLLMNPPPOLMNONMMLMMMMMNNOPOOOOOPPPOPQQPOONNMMMMMMNOPOOPPNMNNOOONNNOOPPOONOONMLLNPOONNNNOPPPONNOOOPPONNNNMLMMLLLMNNMLLMMNNMMNNNNMMNMMOPPPPPPOPONNPPOONNNNNPOMLLLLLNNOPPONMOPQQQPPONOOPPOOONNNNOOOOPPPPPPPPQRRQPPPPQQQQPPPPQQPONOPRSTUSPONOOOOONNMMLNOPPONNOOPPQQPPNNNNNOPPPPQQPPONPPPPPPPPFGIJJIHGFGHIIHGGHIHHHGGFHHIIIIHHHJJJIGGFFFGHHHHHIIHHGFFFFFFFFFEEFFGGFFEEGGHHIHHHGFEEEEFGFGHHHGGGFFGGGGFFHGGFFGHIIHGFFFGHHIIIIIIIGHHIIIHHHGGFFFFFFGHHHGGGIIIIIIIIHHHIJJJIGGHHHHHIHIIIIIIIIIHGFFFGFGHJJJJJIHGGHHHHHIIJJIIHGGFGGHHHHHHGFGHIIHHGGHHIHHIIJJJJJJJJJJJIIIIHHHHHHIIIIHHGHIJJJJJIIIIIIIIIIIIJJJKKJJJJJJJJJJJJJIJJJJJJJJJJIJJJJKKKLKJJJJJJIIJJJJJJJJJJKKKKKJJJJIIIIIIIJJJJKJJHHIJJJLLKKLLLLKJJKKKKKKJJJJKKJJJJJJJIKLLLKJJJJJJJJJJJJJJJJJJJJJKKLLLLKKKLMMMLKKKKKKLLMNNNLKKKKKLLMMMMMMMMNNNNMMMMLLLLKKLLLLLKKKLLLMMMNNNNNNOOOONMMMMMNNNNNMMMMMNONLJJKKLMMLKJKLMMMMLKMMMNNNNNMMNMLLLMMNNNONNNONMMMMLKLLLLLLLLLLLLLLLLMNNOONNMMMMLLLLKMMMMMLLLMMMMMMMMLMNNNNMLMMMMNOONOONMMMNNNNNNNNMMNOPPONNNOOONNNMMNNNNMMMMOOPPPPPONNNNOOOOPPPPONNMMNOPPPPOONNMMMMNMNOOOONNOONMMMNNOOOONNNNOOOOOOOOOOOOOOOPMMMMMNNOOONNNNMMLLLLMMMMMNOPONNMNPPOOPRRZcjp|}}}}~~}zz}~xunf^[WUVTRPPONMMNNNNMMNNNMMNNOPNNMMMMNNPONMMMMNPONNNNNNNNNNNNNNNNOOPPPPONNOPPONNOOPPQQQPONNNOOONNMMMLLLMMMNNNOPPPNNMMNNOOOOOONNNMMMNNNOPPPPPONNONMMLLMNNOOOONNMMMMMNNNMMMNOOPONMNOONMMMONNMMMMMONNNNNOOPPPQQPOPNNNMMLLLMNOOOPONMMNNNMMMNNOPPONNOMLLMOOOOONNOOPPPPPPPPPQPPNNMNMMNNNNMMMNNMLLMNNNNNNNOOPPONNOPPPPPPOONMOQPPONNNOOONMLLLMNMNPPPPONOPPPPPPQOPPPPOONOOOOONNNOPPPPPPQPQQQQPPQQQQPPPPPPPPNNOPQRTVURPPPOOOOONNMLMOPPOOOOOOOPQQQQPOOPPPPQQRRQPOOOOOPPQPPFHIJJHHGFGHIJJJJJJIHHHGEGHIIIHHHGIJIHGGFFGHIIIHGHHHHGGFFFGGGGFFFFGGGFFFFHHIIIIIIGFEDDEFGFGHIHHHHHHHIHGFFHHHGGGHHJIHGFFFFHHIJIIJJGHHHHHHHGGFFFFFFFGHHGGGHIIHHHHHHGGGHIJIHEFGHHHHIHHHHHHHHIIIHGFGGFGIJJJJIHGFFGHHHHHHHHHHHHGGGHHGGGHIHGGHJIIHHHHHHIIJJJJJJJJIIJJIIIIIIIIIIIIJJIHHHIIJJJJJJJJIIIIJJJJJJJKKLKKJJIIJJJJJJJJJJJJJJIIIIIIJJJJKKKJJJIIIIIIJJJJJJJJJKKKKLJJJJJIIJIIJJJJJJLKJJJJJJKLMLKLLKKKJJJKKKKKJJJJKKJJJJJJJJLLMLKJJJJJJJJJJJJKKJJJJJJJJKKKLMKKKLMMLLKKLKKKLMNNNMMLKKKLLMNNNNLLMMMMMMMMMMMLLLKKLLLLLLKKLLLLMMNNNNNNOOOOMLLLLLNNNNNNNNMNOOOMKJLMMMMMMLLLLMMLLLMMMMMMMMLMNMLLLMNNNNNNNNNNMMMMLLMMMMMMLLLLLLLLMMNNOOONNNMMMMLLLLMMMMMLLKLLLLLLLLMMNNNNMMMMLMNNNNOONNNNNNMNNNNNNMNNOONMMNNNNNNNMMOONNNMMMOPPPPOONMMMMNNMMOOOOONMMLMNOPOONONNNMMNNMNOOPPPOOONNMMNNPPPOONNNOOPPOOOONNNNNNNNMMMMNNNNNNNNNNNNLLLLLMMMNOPPOONNPPPPPRVZhouz }}~|ztlc^ZVUSPPOONMMNONNMNNONNNNOOOMMMMMMNNPOONNNOOOOOOOOONOOOONNMMNOOPPPPPPOOOPPPONNOPPPQQPONNNOOONNNMMMMLMNNNNOOPPOONNNNNOOOOOONNMMMNNNOOPPPPOONNOOONMMMNMMMMNNNNMMMMNNNMMNNOOONNNOPONMNOOONMMLLLMMMMMNOOOOPPPPOOOOONNMMLLMNMMNNMMMNNMLLMMNOOOONMNMKLNPONNMMMOPPOPPPPPPQRPPNMMNNNNNNNMMMNNMMMNNNMOONNOPPPPNNOPPPRPPONMMPRPPONNOPPOONMMNOOMNPPPPPOOPPPPPPRPPPPOPONOOONNNNNOPPPPPQQPPQQQPQQQQQPPPPPPPOONOPPPQSSRQPPPPPPPPONMNOPPPPPPPOPPQRSSQPPPQPPPPQPPOOOPPPPPPPOHIJJIHGGFGGHIIJJIJIHHIGEFGHIHGGGFHIHGHGFHHHIIHHGEFGGHGFFFFGGGFFFFGGGFFGHHHHHIIJJGFEDDEFGGGHHHHIJJJJJIHGGGHHHGGHHHHHHGGFFHIJJIIJJHHHGGGHHGFFFFFFFFFFFFFGGHHGGGHHIHGGHIIGFFGHHHHHHHHGGGGHHHIIIHGGHHHIJJJJJIHGGGHHGHHGFFGHHHGHHIHHGGHHHHHHIHHHIIIHHIIIJJJJJJIHIIJJIIIIIJJJJIJJJIHHIHIIJJJJJJJJIIJJJJJJJJJKKKKJJIIIIIJJJJJJJJJJIIIIIIJJJJJJJJJJIIHHHJJJJJJJJJJJKKKKKJJJJJJJJJJJKKKJJKJJJJJKKJLMLKLLLKKJJJJKKKKKJJKKKKKKKJJJJKLLLKJJKJKKJJJJJKLLKJJJKJJKKJJKLKKKKLLLKKLLLKKLMNMLMMMLKKLLMMMMMLLLLLLLLMMMLLLLLKKKLLLLLJKLLLLMMNMMNNNOOONMLKKLLNNNOONNNMNNNNMMLMMMMMMMMMLLLLLLMMMMMMMMLLMNNLLMNNNOONNMMNMMMMMMLMMNNNMMMMMMLMMMNONNNMMNNNNNMMMMLMMMMMLLKKLLLLLMMNNNNNNNNMMLLMNNNOOOOONNNMNNNNNNMNNNNMMMNNNNNNNNNOONNNNNNNNOOONNMLLMMMMMMNOOOONMMLLMNNOOOONNNNNNNNNNNOOOOOOONMMMNOOOOOOOOOOOOPOOONNNMMMMMMMMNNOOOONNNMMNNLLLLMMMMNOPPOOOOPOOPPQZcrx|~ ~yogb]ZUSPOOOONNNNNNMNNOOOOOONNLLMMMMMMOOOOOOOONOOOOOOOOOOOONNMOOPPPPPPPONNOPPOMNOPPPPOPONMNOOONNNNNNMMMNOONNOOOOOOONNNOOOOOOONNNNNNOPPOPPPOONNOOOOMMMMMMNNNNNNNMMMNNNMMMNOONNNOOONMLMONNNNMMLLLLMMNNOOPOOPPNMNNOOOOONNLMMLMNNNNNNMLLLMNNNOONNNNMLMNNNMMMLNOPPNOOOONOPPPONMMNNNMNNNNNNONNNNOONMNNNNOOPPPNNOPPPPPPOOMMORPONMMMNOPONNNNOPNOPPPPOOOPPPOOPQPPPNNOONNNNNOOOOPPPPPPQQPPPPPPPQQQPPPPOOMNOOONOONOPPPPPOPPPQPPONNOPPOOOPPPPPPQRQQPPOOPPPPPPOMMMNPPPPPPONIJJJIHHHFFFFGGHIHIIHHIHEEFHHHFFFFHIHHIHGIIHHHHHHEFHIJIIHFFFFFFFFHHHGFEFGGGGGGHIJHGEDDEGHHHGGGHJKKJJHGGGGFGHHHGHHEFGHHHHHHIJJIIIJHHGGGGGHGGFFFFGGEFFEEEFGGGFFGHIIIHGHIIGEGGHHHGHHIHGFFGGHHIJJIHHHJJJIIJJKJJIHHHHHIHGFFGHIGGHIIIHGHGGHIIHGGGHIIIIIHHHHIIIIIHHHIJJJIIJJJJJJJJJJIHIJHHHIIIIIJJJJJJJJKJJJJJJJLKJJIIIIHIJJJJJJJJJJJJJJIJJJJJJJJJJIHHGGJJJJJJJJJJJKKKKKJJJJJJJJJJKLLLJIIHHIJJKKJKLLLMMMKKJJJJKKKKKJJKKKKKKKKKKKKLLLKKKLKKKJJJJKJKKJJJJJKKKJJJJKKKKKLLKJKLLLKKLMMLKLNOMKKKKLLKKKLLLLLLLLLLLLLLLLJKKKLLKKJKLLLLMNMMMMNNOONNMLKLLMNNOOOONNNNMMMMNNMMMMMMMMMMLKKLMMMNNNNMMMLMNNMLMOOOOONNMMNMMMMMMLMMMNNNMMMMMMMMNNNNMLLLLMOONNNNMMKLLLLLLLLLLMMNNNNNNNNNNNNMLLMNNMOOPPOONMMMNNNNNNOOONMMNONNNNNNNNNNNNNNOOMMMMMMMMMMMNNNNMNOOPPONNMMMMNOOPNNNNNNNNMMMMMMMMOOONMMMNOOOOOOOOMNOOPPPONNNNMMMLMMNNOOOOOONNMMMMLLLMMMMMOOPPOOOPOMOPOP\juz zqhd`\VSPPPPPOMNNNMMNNOOOPOONMLMMMMMLLOOOOOONNNNOOOOOONNOOOONNNOPPPPPPPNLLNOONMNNOONNMPONMNNOOOOONNNNNMNOONNNONNOOOONMNOOOOOONNNNNOOPPNOOOOOOONNONMLLLMNOOOONNNMLMMNMMLMNNNNNNNNNLKKLNNNNNNMLLLLMMNNOOPPPPPNMMNNOOPPPONNNMMOOONONMLLMNNNNNNNNNMNNNNMMMMMMNPPPNOOOONNOPPOMMNNNNMNOOOOPPNNNOPONMNNNNONNNPOMNNMMNPPPPNMNPNMLKKKMNPONNMNNONOPPPPONNPPPONOPOONLLNONNNOOPPPPPPPPPPPPOOPONNOPQQPPPOONLMOOONNNPPPPPPOOPPPPPPONOOOONNNNOOPPPQPPOPPNMMOPPPONMMNOOOOOPPONGHIIIIHHGGGFFFFGHHGHIIHGHHGGGHHGHGHJJFFHIHFFHIIIGGGIJJJJGGGFFGHHIIIHFEFGHHHHGGHHHGGEDEFHHIIHFFHJJJIHFEDEFGIIGFGHEFFFGGGGHHHHIJIHJJIIIHGGHHGGFFFFIHHGGFFEEFFFFFGGHIJJIIIIJIHGGGGHIHGGHHHGIIIJJJHGHHGHIJJJJJJGFGHHIHHGHHGFHHHHHHHHHHIIIHHGHHHHIIJJHGGHHHGFIIJJIHIIJJJJJJJHJIIJJIJJJJIHHIIIJJKKKJKKJJJJJJJJKLLKJIHHIIIIJJJJJJJJJJJJJJJJKJJIIJJJIHGGJJKLLKJIJJJJJJJJJJJJJJJJJJKKJJJJJJJJJJJKKJJJJKLMJJJJKLLLKKJJJJJJJJKKKKKJLLKKKLLMKKKKKJJJLKKJJJJKKKKKKKKKLLLKKKKKMMLLLKKKKKKLMMMLLLKKKJJJLKKKKLLLMMMMMMLLKKKKKKKKKKLLKKLLNMMMNOOOONMMMNMMLMOPPPOOONMMMMNNNLLLNNNLLLKKKKKKOONNNNNNOOOOOONNOOONMMMNMMMMMMMMNMMMNNMLMMMMMMMMNNMLLLLLNNOPPOMLLMMMMLLMLKKKLMMMNMMMMMNNNNMLLMMMNNNNNNMMMMMMNNNNPPPPPOONONMNOONNNNOONNNMNNNNMMMMLMOOONNOOOOOOOOOLMMMNNOOMMNNNOOOOOOONMMNPPPPOOOONNNNNMMMMMMNNOPPNNONMMNOOOOOOOOONNMMLMMMMNNMLLNOPPOOPPPPPNQQLSfrv{ ~wsnjc]YTQPOPPOOONMLMMNOOOOPONMNNNMMNPPOOONMLLMLMNONNOPPPPOONMMPOOOOPPPPOMMNNNNNNNNNNNNOOONNNNNOOPPPOONPONNNNOOOONNMLLLNOPPPPOONNNNNOOPMMNNPPOOOPPONMLMMNNNNNOOOPPPONNNMMMNNNMMMMNNNMMLMMMNOOONNNOPPPONOOOPPPOOPOOOOOOPPONMLMMNOONMMMMNPPONMMOPONMMNNMLLLNPQQQPPNMMLKLMNNNNNNNONNOOPPPPOONNNNNNNNMMMMNNNOONLKLNOOONNNNNOLJJMOOOONNNOPPPPPPPOOPPPPPPONMLLMNOONMLKMOPQQQQRQPPPPOOOOPONNPPQPOOOOONOONNNNNNPPOOOOMLNOPPPPONONNMMNOPPPQRRQPPNOPOOOOORPPOOONMOPPPPPQRBDGIIHGFIHHHHHHHHHGGHHHGHHGGGGGGGFGIHEEGHGFFGHHHHHHIJJJIGGFFFFFGGHGGFFFGJJJIHHIIJIHGFGHIIIIHGGHJJIIGFEFFHIJIHGHIIIHHGHHHHHHIJJIIIIHHHHHGGGGGGGHHJJIHHGFFFFGGGGGHHIIIHHHIIHHGGHHIIHGGHHHGHHHIJJIHHHGHIJJJJJJHHHHGHHGHHHHGFFFGGGHHJJJJIIHGHHHIIIIIHGGHIIIHIJJIHHHHJJJJJJIHIHHIIIIJJJJJJJJJJJJJJJJJJJJJJJJJKKKJIHHHIIIIJJJJHHHIJJJKJJJJJJIIJJJJIHHHJJKKKKJJIJJJJJJJJJJJJJJJKKKKJJJJJJJJKKJJJJJJJJKLJJJJJJKKJJJJJJJJJJJKKKLLLLKKKKKKJJJJJJJKJJJJJJJKKKKKKKKKKKKKKKKKLLLLKKKKKKKKLMLLMLLLKKKKLLLLLLLLMMMMMMLLLLLLLLLLLMMMLLLMNNNNOOONMLKKLMMLMMNOOOOONMMLLLMMMLKLNONMLKKKKKLLMMMMMMMMNNNNNNNMNNNMLLMMMMMMMMMMNMMMMMMLMMMMMMMMMMLKKKKKNNNPPPNMLLMLLLLMNMLLLLLLMMMMMMNNMMMMMMMNNNNNNNNNNNNNNOOOOOOPPOOONNMNOOONOOOOONNNNNNMMMLLMMNNNNNOOOOOONNNMMMMNNNNMMMNNNNOOOPONNNOPPPOONNNOOONNNNNNNNNNOOONNNNMMNOOOOOOOOOONNNMMNNMNNMMMMNPPOOPPPPRPQSVbqxw| ~~}} zvtpjeYSPPOOPMONNMMNNOOONOOONNOOONNNOPOOONMLLMLMNONNOOPPPPOONNOOOOOOPPPPONOONNNNNNNNNONNNMMMMNNNOPPPQQPPPPOOPPPOONNMMMNNOPPPPONNNNNNNNMLMNOOONOOOONMMMOOOOONNNOPPPONNNMMMMNNNMMNNNNNMMMMMNOOONMNNOPPOMNNOPPPOOPPPPPPPPNMMLLMMMMMMLLMMMNNNMMNOPONMMMMMLLLMOPPPONLLLLLLNNNNNOOOONNNNNNNNNNNNNMMMNNNMMMMMLMNMLLMNMMMNNNOOMJJJMOOOOONNOOOOPPPPPPPPNOOOOOONNOPPPONMLMNPPPPPQQPOOOOPPPPONMNOPPOOPPPPNNNNOOPPPPOOOOMLOPPQRQPPOOOOOPPPPPPQQQPPPPPPPPPPRQPPPPOOPPPPOOPPBEJLKJJJIIIIHIIIHHHGGGHIIIIHHHHHHGGIHEEGHHGHHHHHIIIJJJIHGGGFFFFFFEEEFGGGJJJJIHIIJJJHGHIJIIIHGGHJIIHFEEGHHIIIHHIJJJJIIIIIIHHIJJJIGGGGHHHHFFGGHIJJJJJIHGFFGHIIIIIIIIIHGGHIHHGGGHIJIHHHHIIIHGGHIIIIHGGGHIJIIJIIJJJGGGGHIIIHEEFFGGHHJJJJJIHGHHIIIIIIHGGHIJJJJJIHGGHHJJJJJJJIIHHIIIIJJJJJJJJJIJJJIIIIJJJJJJJJJKJJIHHIHHIIJJJJHHHIJJKKJJJIJJJIJJJJIIIJJJJJJIIHIIJJJJJJJJJJJJJJKKKKJJJJIJJKLKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKLLMLLLLKKJJHIIJJKKLJJJJKKKKLLLLLLLLKKKKKJJJKKKKKKKKKKKKLLLKLLLLLLKKLLMMMMMLLLLLLLLLKLMMMMLKMMMMLLLLMMMNOONMLKKKLLMLMMMNNOOOMMMLLLLLMLLLNONMKKKKLLMMLLMMMMMLMNNNNNNNNNNMMLMMMMLLMMMNNNMMMMLLMMMMMMMMMLLKKKKKMMMNOONMLLLLKKLMONMLLLKKMMMNNNNNMMMMNNNNOONNNNNNNOOOOPPPOOPPPOOONNNNOOONOOOOOONNNNNMMMLLMNNNNNOOOOOOONNMMMMMMMMMMMMMNNNNNOOONNOOPPPONNMMOONNNNNNOOONNNOONNNNNNNOOONNNNOOOOOOOONNMNNNNMMNNNOOOPPQRUVUVdtyz} ||||~~{ytnhXSPPNNNLOONNNOOOONMNNOONOPPONNNNOOPONMMMLMNNNNOOOOOOOONNNNNNNNOOPPPPPONMNNNNOOOONNMMMMMMMNNOPQRRPPPOOOOPOOONNMMMMMNNOOPPOONNMMMMMMMNOOOOOOONMMMMOOOONNNNOPPPOOOOMMMMMMNNNNOOONNMMMMNOOONNNOOPPONMNOPPPOOOPPPPPPOMMMMMMMMKLLLMMMMNOOONOOPPOMMMMMMMMMNOONMMLLMMLLMMMNOOPPOOOOONMMLMMNNNMMLNNNMMLLKKLMMMLMNMMNNNOOOKJJJMOPOPONNNONNOPPPPPPPOOOOOOOOPPPPPONNMNNOOOONPPONNOPPPPPONMMNPOPPPQPPOOOOPPPPPONNNNMLMOPQRQPPOOOOPPPQPPPPPPPQPPPPOPPQRQPPPPPPPPPPOOOPEHKMLKKKIIIIHIIIHIHGFGHJJJJJIIIJJIIJIFFGIIIIJIIIJJJJJJIHHGGGGGFFEDDEGHHGHHIHHHHIJJIHGGIJIIIHGGHIHHHFFFFGGHIIHGHHIIIIIIIIHHHHIJIIFFFFHHHHGGGHIJJJJJJIGFFFHIJJJJJJJIIGGGHIHHGGGHIJJJIIJJJJHGGGHHIIGGGGHIIIIIIJKLJHGGHIIIIHFGGHHHIIJJJJJIHGHHIIJIIHHHGHIJJJJIHHGGHIJJJJJJJJIHHIIHHIHIJJJJIIJJJJIIHHJJJJKJJJJJKJJIIIIIIIJJJJJJJJJJKKKJJJJJJJJKJJJJJJJJJIHGHHJJJJJIIIJJJJJJJJLLKKJJJJJJJKKKJJKKKKKJJJJJJJJJJJJJJJJKKKJJJJJKLMLMMMLKJJIIJJKKLLJJKKLKKKMMMMMMMMKKKKKKKJKKKKKLLLLLLLLKKKLLKKKKKKKLMNNNMLKKKKKKJJJKLMMMLKMMMMLKKLLLMMNMLKKKLLLMMMMMMMMNNOMMMMMMLLNNMMNNNMLLLLLLMMLMMNNNMMMNNNNNNONNNNMMNNLLLLMMMNNNMMMLLKMMMMMMMMNMMMLLLLLLKLMMMLMMLLKKMNONMMMMLLLMNNNNNNMMNNNNMMOONMMNNNOOOOOPPPPPPPPPOONNNNOOOOOOOOOOOOOONNMMMLNNNNNNOPOPPPPONMNNNMMMMMMMNNNNNNMNNNNMNOOOONNMMMNNNNNNNNOOOONOOOOOOONNOONNNNNNNNNNOOPOONNNOOOONNNOPPPPQSTZ[VXfsw|{{{}~~xpkZURRNMNNOOOOOOOONMMMNOOOOPPPONNNNOPPONMMMMNNOOOONNOOONNNNNNNMMMNOPPPPPONNNNNOPPOOONNNNNNONNNOPPPPPOOOOPPNNNNMMMMNMMMNNOOOONNNNNNNNNOPPPPOPONMLLMMMMNNNNNOOPPOOOOMMMMMMNNNNOOONNMMMMNOPONOOOPPPOOMNOPPPPOOPPPPPPOMMNNNNNNLLMMNNMMOOOOOOOOPPNMLMMMNNNONNMMONNOOMLMLMNOOPPOPPPPONMMMMNNNNMLNNNNMMLKLMNNMLLMOOOOOOOOKKKLNOPOPONNOOONNOPPPPPPQPPONNNNOOOOONNNNNNNNNNNOOOOOOPPPPPONNOOOOPPQQPPPPPPPPPPONMMMMMLLMOPQQPPNNOOPPPPQPPOOPQQQPPPOPPRQPPPOOOOPPPPPPPPGHIIHGHJIIIIIIIJIIIHGGIJKKJJIIIJKJJJIGFGIIJJJIIIIIIJJJIHFFEFGGGFEDDEHIIGFFGGGGHHIIIHGGHIIIIHGGGHGHHHGFFFEGHIIHGGGHJJJIHGHGGGHIIHFEEFHHIHHHHHIJJJIJJIHGGHIJKKKKJJJJIHGGHJIHHGGHHIJJJJJJJJIHGGGHHHGGFGHHIHIIJJLMKIIHHIIIHGHIIIHHHIIIJJJIHHHIIIIIHHIHHHIJJJIHHGHIJJIJJKKKKJJIIJIHHIHJJJJJJJJJJJJJIIJJJJKJJJJKLMLJJJJJJJIIIIJJJJJKKKKJJJJJJJJKJJJJJKKKKJIIIJJJJJJJJJJJJJJJJJLLKJJJJJJJJJJJJKKKKKJJJJJJKJJJJJJJJJKKLLKKJJJKKLMMMMLKJJJJJJJKKLLLLMMLKKMMMMMMMMLLLLKKKKKKKLLLLLMMMLLKJJLLLLLLKKKLMNNNMLJJJJJJKKJJKMMMMMMNNMLKKLLLMNNNMKKLLLMMMMMMMLMMNONNNNNNMMPOONNNNMNMMMLMMMNNNNNNMMMNNNNMNNNNMMMNNNLLLLLMMNNNMMLLLLMMMMMMMMNNNNMMMMMLKKLLLKMMMLLLMNNMMMNNNNLMNNOONNOOOONMMLNNMMMMMNNNOOOOPPOOOOOPPPOOOONNNOOOOPPOOOPOOONNNMOOOONOPPPPPPPONNNNNNMMMMNNNNNOOOMMNNMMNOMMMMMNNNOOOOOOOOOOONOOOOOOOOOOOONNNMMNNNNNOOOOOOOOOPPPONOPPRPPSVZ]]^huzw~}{{{|~~ |tn]XVTNKMOPPPPOONNNMLMNNOOOOPPPONNNOPPONNMMMNNOOONNNOOOOOONNNNMMMMMNOPPPOONNNNPPPPOONNNNNNPOOOOOPPPPPPPPQQNNNNNNNMONNMMMNNOONNOOOOOONOPPPPPPONLKLLMMMNNNNOOOOOPPOOMMMMMNNNNNNONNMMMMMNPPOOOOOOOPONMNOPPPPOOPPPPPPOMNNONNMMMMMNNNMMMMMNNOOOPPOMMMMNNNNNMMMMONOPPNMMLLMNOOOOPPPPPOONMNNOOONMMNNNNNMMOOPONMLLOOOOOONNMMMNOPPPOONOPPOONNOPPQPPRQPONNMMNNNNNOOONNNNNOOONOPPPPPPNNNNNOPPOOPPPPPPQPPPPPPPONMMMNMMMNPQRRQQNNOPPPPPQPPPPPQRRRQPPPRSRQPPPOOPPPPPPQPPIIHGFFGHJJJJJJJJJJIHHHJJJJJIGGHIJJJIHFFFHHHHHHHIIIIJJJIHEEDEGGFEFEEFHJIHEFGHGHHIHIHHGHIJIIIHGGGHFGHHGFEEFGHIJIHGIJJJJIGEGGFFGHHHFFFGHHHHHHHIIJJJJJJJIIIJIJKKKJJKJJJHGHIJIIHGGGHHIJJIIIJJIHGGGHHGGGFGHHHHIJJJJLKJJIHHHHGGHIIIGFGHHHIJJJJIIIIIIHHHIHHHIJJJIHHHIJJJIJJKJJJJJIIJJIHIJJKKJJJJJJJJJJJJJJJJJJJJJKMMLKJJJJJJIIHHHIIJJKKLKJJJJJJIJJJJJJJKKLKJIIJJJJJJJJJJJJJJJJJJKKKJJJJJJJJJJJJKJJJJJJIIJJJJJIJJJJJKKKLLLKKKJJJJMMMMLKJJJJJJJJJJMMMMLLLKNNNNNNNNLLLLLLLLKKLLLLLLMNNMLLKKMMMMMLLLKLMNNMLLLLKKKLLLKKLMNNNONNONMLLMNNNOOONNKLMMLLLLMMMMMMNNOONNNNNNPPOONNNMNNNMMMMMNNNNNNNNNOPONMMMMLLLMMMMLLLLLMMMMNNMLLLLMMMMMMMMMMMMMMMLNMLMMMLKMNMMLLMNMMLMNOOOMMNNNOOOPPOONMLLNNMMMMMMNNNNOOOOLLMNOPPPOOOONNNNOOOOPOOOPPOOOOONOOPPOPPPPPPPOOONNNNNNNNNOOOOOOOOMNOONNOOLLLMMNNOPPPPPPPPOONNNOOOOOOOPPOONNMMMMNNNNNOOOOOPOOPPPPONOQSRQUZ[aeku||{~}{zzzz{|||~ }upf]XUOKMOPPPPONMMNMMMNOONNOPPOOOOOPPPONNNNNNNOONNNOOPPPPPOONNNMMMLMOOPOOONNMNPPPPNNNNMMNNOOOPPPPPPOOOPPPQOOOOOOOOOONNMMNNNNNNOPPPPOOOPPPPPPONLKKLPPOOOONNONNOOOONMNNNNNNNMNNNNNMMMMNOPPPOONNNNNNNNNOPPPPOOOPPPPOOMMMNMMLLMMMMMMMMNNNOPPQQPPPNMLMMMMMMLLLMMLNOPNNNMMMMNNNNOOOOOOOONNOOOOONNNNOONNNPPPONMLLMMNNNNNONOOOOOPPOOOOPPPONNNOPPPPPPPPOOOONNOOPPPPNNOOOOOOMOPQPOOOLLLLMOOPPOOPPPPOPPPPPPPPPONMNOOOMNOPPQQPOOPPPQPPQQPPPQQQQQPPOPPRRRRQPPPPPPOPQQPPHHHHHHHGJJIIIJJJJIHHHIIIJJJIFFGIGHHGGFGGGGGGFFHIIIIIJIHGGFEFGHFEGFFGIIHGFGHHHGHHGGHGGHIJJJIIHHHHFGGGGFFGGHHHIIIIJJJJIHFFGFFFGHHHHGGGHHHGIHHIIJJJJKKJIHIJIIJJJJJJJJJIHHIIIIHGGGHIIJJIIIIJGGGGHHHHHGGGHHHHIJIHIJJJJIHGGGGGHIIHGFFGHHIJJJJJJJIHHHHIHHHIJJJJJIIIJJJJJJJJJIIIIHIJJIIJJKLKJJJJJJIJJKKJKKJJJJJJJKLLKKKKJJJJIIIIIIJJKKKKKJJJJJJIIJJJJJJJJKKJIIJJJJJJJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJKJJJJKKKKKKKKKKKKKKJJJLLLLLKJJJJJJJJJJLLLKKLLLNNNNNNNNMMLLLLLLKKKLLLLLMNNNMMMMNNMMMLLLKKLMMLLLLLLLLLMMLLLMMNNONNONMMMMOOOOPPPPMMNNMLLLMMMMMMNNONNMMMNNOOONNNNNNNNMMNNNOONNOPPPRSSQOMLMMLKLMNNMLLLLLLMMMNNNMLMMMMMMMMMMMMMMMMLLMMMMNMMLMMMMMLMMNNMMMNNMMMMNNOOOPPONNMMMMNNNNMMMMNNNNOOOMMMNNOPPPPPONMNNNOOOOOOOOOOOOOOONOPPPPPPPOONNNOOMNNNNOOOOOONNNNNNNONNNNOLLLMMNNNPPPPPPPPOOONNNNNONNOOOONNNNMMNNNNNNNOOPPPOOOOPPOOPTVVV[a_fkszzy~|zyyxyzzzz~~ zvqe[VQNNMOOPPONMLNMMNOONNOOPPONOOOPPOONNONNMNOONNNNOOPPPPOOOOONMMMNOOOOOPONMNPQPPOONNNNNNOOPPPPPPOONNNOOPPPPPPPPPOOONNNNNNNNNOOPPPPPPPPPPOOOMLLLMPPPOOOOOONNNOONMMNOOPONNMNNNNNMMMMNOPPPPPONNNONNOOOOOPPPOOOOOOOOMMMMMMMMNMMMNNNOPONOPQQQPPPNLKLLLMMLLLMNMMNOPONONNNMMMNNNOOOOOOONOOOOOOOOOONNNNNPPOONNNNNNNNNNNNNOOONNPPOOOOPOONNNNNPPPPPPPPPPOOOOPPPPPPNOPPPOONNPPPONMNNMLLMNOOPOOOPPPPPOOOOPPPPOMMNOOONNOOPPPPPPPQQQQPPQQRRRQQPPONNNPPQRQQPPQRPONOPPPNDDEGHHFDIHHHIIIJJIHHIIIHJJJIGFGIEFGGFGHHFGGFFFHIJIIIIIHGIHGGIIGEGGGHHHHGGHIHHGGGFFFFFGHIJJJIIIHHFFFFFFHIHHGGGHIJIIHGGGGGGFFFGHHHIHHHHHHGHHHIIJJJJKKJIGHIHIIIHIJJJJJIHHHIIHHGGHIIJJJJIIIJFFFGHIIHHGGGHHHHIJIGGHJJJIGFGGHHHIJIGFGHIIJJKKKKJJIHGHHIHHHIJJJJJJJJJKJJJJKJIHGGHGHJJJJJJJKKJIJJJIIIJKKKLKJJIJJJKKJJJJKLJJJJIIIIJJKKKKKJKKKKKKJJIJJJJJJJKLMLJJJKJJJJJJJJJJJJJJJJJJJJJJJJIJJKLKJJKKJJJJJJJKLKJJKLKKKKKKKKKKKKKKJJLLLKKKKJJJJKKKKKKKJJJKLLNNNNNNNNMMLLLLLLKKKKKKKKLMNNNNOOMMMLLLKKKKLLLLLKLLLLLLMMMMLLLLMMMNNMLLLMOONOPPPPNOPONMLMMMMNNNMMNNMLLMMNMMNNNNNONNNNNNOOPOOOPQRSVVVTPNMMMMLLNONNMMLLLLLLMNNNMLMNMMMMMMMMMMNNNMMMKKLMMMMLLMMMMLLMPONMMMLLNMMMNNOPPPONNNNNMNNNNNMMMNNNNOOOPPPOOOOPPPPPNMMNNNOOOOOOOOOOOOOONOPPPPPPPONMMNOOMMNNOOOPNNNNNNNNMMNNMMMNMMMMMMNNOOOOOPPPPPONNMMMNNNNOONMNNNMMNNNNNNNOPPPPONNOOOORUY\\\bijhhr~}z~~{yyxxxxyzz{zz|~~~ zj]XTPOLNNOOONMMNMNNOONMPPPONNNOOPPONNNONNMNOONMLMNNOOOOPPPPOONMNOOOONOPONMNPQQPPPOOOOOOOOPPPPOOPPOOOOOOOOOOPPPPNNOOOOOONNNNNOOPRQPPPPPPNNNMLLMNNNNOOOOOONNNOONMMNOPPPNNMNNNNNMMMNNPPPPPPPOOOPOOOOOOOOPPOONNNNOOMMMMNNOONNNNOPPPPOMMMNNNOPONLKKKLMMMMMNPPOOPPONOPONMMMNNOOOPPOOOOONNOOOPPPONNMNNONNNNOPPPPPPOONNNNONMNOPPOOOOONMONMNOPPPPPPPPPOOOOPPPPOOOOPPPONMPPPPNLMMPONMNOONPOOOPPPPPPPONNNNONLLMNNNPPPPPPQROPPQQQPPPQRSSSRQPPPOOOPPPPPPPPQSPONNPPNLDEFFFFFEGHJJJIIIJJJIIIHHJJJIHGHIHFDDEGIJIHGEEEGIIJLJIGHIJJIHHHHHJHFFFGHIIHHHIIIHHHHHGGHIJHHIHHIJGGFFGHHIJJJHGGIJJIHGGGFEFFGGHJJHJIHGGHGGGIJIHGGHJJJIGGHIIIHGGHHIIIIIHHHHHGFFGHIJJJIIIIJJHHHHHIIJIHGFFFGHIIIIGFGGHHHHHHGFJIIJIHIKLKKLMLKJJJJJJJJJJJJJIIHHJJJJJJKKJJJJIHHGIJJJJIJJJJKLLLJJJJJIIJJJJJJJJJJJJJJIJLLJJJJKJJJJJJJKKLLLKKLLLKJIJJJJJIIIKKKJJIJJJJJJJKKKJJJJJJKKKJJIHHIIJJJJKKKKKKJJJJJJLLLLLLLLLLKJJJJJLKKLMMMLLMMLKJKKKKLKKKKLLKKKKKLLMMNNNNMMLLKKLLKKKKKKKKKKMMNNNNNNMLKKKKKJLMMNNMMLNMKKLMNNONNMLLMNPOMMLKKLPOOOPPPOPOLLMNNMMMMLLLLLLLKLMNNNMMNNNNNNPONMMMNNPPPQSVXZY]_ZROOPNMLMOPOMNMLLLMMLPONNNNMLMMMMMMMNNMMMMMNNMMMMMMMMKKLLMMNNNNONNMMLMNNNNMNOPPPNMLMNNNNNNNNNOOOOOOPPPPPONMMMMNOONNNNOPPPPNNNMNOOOOPPPPPPOOOONMLLLMMMOMLLNOOOPOOOPPPOOOOONNNNMMNNNNNNOONNNOPQPPPPONOOPOONNNOONOOONNNOPPPPPPPPPNMOPQQQW]bcefglqqruz|}|}}~~|zzzyyyyyxwwwxyyxxzz|u\UWQOPMNOOPOONPPOOOPPONNNMMMMMOOOOOONNNOPOONOOMNPPPPPPPOONNNNONOOOOOOOPPOOOPQROOOOOOOPPPPPPOOOQPOOPPPOOONNNNOOPOOPPPONOOOOOOOOPPPPPPPPPOONNMMMNNNNOOOONNNNNMMMNMMNPPPONMMNOONLPPPPPPPPOOOOOOOOPPONNNOOOONNOONMMNNNOOPPNNNNPRRPPONNOONLMNOONLKKNNNNNNNNPPPPPOOONNMMNOPPPPPPRRRQMOPONMNOQPNLKLNONOONNOPQPPPPOONNOONNNNNNOOOOOOONNMNOPPOMPPPPPPPPQPNMNOOOPOPPPPONNOOOONLLMMMMLLMNPPPOPPQRQPNMNONMMNNNNNPPPPPQPPPPPPPPRSSRRRRRRQPPPPPPPPPPQQQQRRPPPPOPPQPOFFFFGGHHIJJJIIIJJJIHGGGGIIJJIJJJJHFEFHIJJIHFEFGHJJKJGFGHIIHHGGGFIHFEFGHHHGGGHIIIHHHHGGGHHGGHGEEFGGGHHIJJKKKJIHJJJJJHGFGHIIIIJKKJJJIHHHHHGHIHGFGHJJJJIHHIIIHHHIIJIHHGHHIJJHGGHIIIIHHGGHHIIIHHHIIJIIHHGGGGGHHGFFFFHHIIJJJJJJJJJHIJKKKKLKJJJJJJKKKJJJJJJJJIJJJJJJJJJJJIIIHHIJJJJJJJKKKLLLKJJJJIIIJJJJJJJJJJJJJIJKKJJJJJJJJJJJKKKKKKKLLLLKJJJJJJJJJJJJJJIHIIJJJJJJJJKJJJJJKKKJJIIIJJJJJJKKJJJJJJJJJJMLLLKKKKKKKJJJJJLKKLMMMLLLLLKJJKJKLLKKKKLKKJJJJJMMNNNNMMMLKLLLKKKKKLLKKKLMMMMMMMMLKKKLKKMNNNNNNMMKJJJKLMNNNMMMNOPNMMMKKMOONOOPPOOMKKLMMLNMMMLLLLNMMMNNNMLLMMMMMMNMMMNOPPPPSVWY\\abdc\TOOPONNNONNNNMMMNMMONMMMMMLMMMNNNNNNNMMMMNNMMMMMMMMLLLMMMMMNNNNNMMMNNONMMMNPPPONMNNNNNNNNNNPPPPPPPPPPPPPONMNNOONNNOPPPPPONNNNOONNOPOOOONNNNNMMMNOONOMLMNPPOOONOOPOOOOOONNNNNNNNNNNOPPPOOOPPPPPOOOOPPOONNNNNOOPONNNOPPOOOOPPPPPPRSUV[adgiijnrstxz|}~~}}|{yyyyyyyyyyxvwwvutuw{v^XZSPPNNOOPOOOPOOOPPPONNNNNMMMOOPPPPOOMNOOONNONOPPOOOPOONNNOOPOOOOOONNOOPPPPPPPOOOOOPPOOPPOOOPPPPPPPOONNNOOOOOOOOPPPPOOOOOOOOOPPPPOOPPOONMMMMMNNNNNNNNNNNNNNNNNNNOPPONMMMNOOMLOOOOOOPPOOOPPPPPPOONMMMNOONOOONMNNNOPPPPNONNPQQPPPOOPPONMNONMLKKMMNNNNNOOPPPONNNONNMMNOPPPPPQQPPOPPPOOOPONMKKLMNOPPOOOPPPPPOONNNPOOONNOOOOOONNNNNMNNOPONPPPPPPPPPOONOOOOPPPPPPPOMNOPPPPONNNNMMMNPPOOPPPPPOMLMNMLMNNNNOPQPPPPPPPPPPPQRSSSRRQQQPPPPPPPPPPPQQQQRQPPPONOPPPOHGGGGHIJKKJJIIJJKJJHGGFFGHIJJJJKJIGFFGHIJJIGFFGGIJJHFEFGGHHHHGFEHGFEFFGGFFFFGHHHGGHHGFGGGFFGGDDDHHIJJJKKLLLKJIIJIJIGEEGJJJJIJKKJJJIHHHHHJJJIHGHIJJJJJJIIJIIIIJJJIHGGHIJJJJHHHIIIIHGGGGHIJJIIIIIIIJJJJIGGGGGGFFFGGGHHIIJJJJJJJIIJJJJJJJJIJJJJKKKKJJJJJJIHJJJJJIIIIIIIIIIIIJJJJJJKLLLLLLKKJJJIIIIIIIJJJJJJJJJIJJJJJJIIIJJJKKKKKKKKKLLLLKJJJJJJJJJJJJJJIHIIJJJJJJJJJJJJJJKKKKJJJJJKKJJJJJJJJJJJJJKKLLLKKJJJJJJKKKJJLKKLLMMLLLLKKJJJJLMMLKKJLKKJJJJJLMMMMMMLMLLLLLLKLLLLLLLLLLLMMMMLLLKKLLLLNNMMMMNNMKJIJJLLMNNNNMNOONMNNLLMNNMNOOOONLKKLMMMNNMMMMMMOOOOOOMLKLLLLLLLMMNOPQRSQSVX[^acihjnh\QNPPNNNMMNNNMNNNMLMMLLMMMLMMNNONNNNNMMMMNNNNNNMMMMMMMMMMMMONNMMNNOPPONMMMMPPPPONNNNNNNOOOOPPPPPPPPNOPPPPONNOONNNNOPPPPPONNNOOONNNONNNNMMMMMMMNOOOOMLKLNOOOONNNOOOOOOOONNNNNNNOOOOOPPPPPOOPOPPPOOPPPPONMMMNOOONMNNOPOOOOOOPPPQSUVZ^dhjlnnnortvxz{}~~|{{zyxxwwxxyyyywxwutstt{u_[\TQPOOOPPPPPOOOOPPPOOOONNNMMNOOOPPPPMNNNNNNNOOPPONNNOONNNOPPOOOOONNMNNPPPPPPOOOONOOONOOOOOOOPPPPPPONMNNOOOONOOOPPPPPOOOOOOOOOOOONNNOOONNMMMMNNNNNNNOMMNNNNOOOOOPPOMLMMMNNNMMMNNNOOOONNOOPPPPPPOONMMMNNOOPONMMMNOPPPPOPONPPPONNMNOPPONNOONMMMMMNNNOOOOOPPONNNOOONMMNPPPPPPPPPMOPPONMNMLLKLLMNOOPOOOOPPPPOONNNPOOOOOOOOOONNNMMNNNNOOOOPPPPPPPPOOOPPPPOPOOPPPPPNOOPPPPPOOOONNNOOOOPPPPPPNMMMNMLNNNNOPPQPPPPPPPOPPPQQQRSQQPPPPPPPPPPPPPPRQQQQQPONNMNPPPPIIHHIIJJMLKJIIJJJJJIHGFFFHIJJJJJJIGFFGHHIIIHGFGGHHGFEEGHGHIIIHGFGGEEFFFFFFEFFGGGGHHHHGFGHGGHHFEFJJJKLLKKKLLKJHGGHHGEDDGIJJJHHJJJIIHGGHHHKKJJHHIJJJJJJJJJJJJJJJJJJIHHIJJJJIIHIIIIJJIHHIJJJJJJIIIIIJJJJJIHHHHHHHHHGGGGGHHIJJJKJIIIIIIIIIHHIIHIJJJJJJJJJJIHIIIIIIIIIIIIIIJJIJJJJJKKMLLLLLLKJJJJJIIIIIJJJKKKJJJJJJJIIIIHIIJJKKKKKKKKKKLLKKJJKKKKKKKKKJJJIIIJJJKKKJJJJJJJJKKKLLKJJJJKJJJJJJJJJJJJJKKLLLKKKKKJJJKKKJJJKKKKLLLLLLLLKKKKLMNNMLKKKKKJJJJJKKLLLLKKMLLLLMLLLLMMMMLLKKLLLLLLLKKKLMMLMLLLLLLMMLKKKLLMLMNNNNNNNMMNNMMMMMMMNOOONMLLMNNNNNNMMMMNOOOPPOMLLLLLLLLLMNOPQSUVWXZ\]bfinmospeWPPONNNMMNMMMMNNLKLLLLMMMMMNNOOONNNNNMMMNNOONNNMMMMMMMMMMMONMMMNOPPPPONNNNOPPPPONNMNNOOOOOPPOOOOOONNOOOOOONONNMMNOPPPPONNNNNONNNNONNNNMMMMMMMNOONMLKJKLNNNNNNNOOOOOOOOOOOOOOOOOOOOPPPPPONNOPPPPPPQPPONNMMMNMMLLMNOOOOOOOPPQPRVY\afnpqrtropqrtvyz{||zxxxwvwuuuvvvwwxxwvtttu|r^ZZSQPPPPPPPPPOOOPPPOOOOOOOONNNNNNNOOOMMNNNNNNOOPPOONNONNNNNOPOOOOONNNMNOPPPPPNNNNNNNNNOOONNNNOPPPPPNNMMNOPOONOOOOPPPPOOOOOOOOOOOONMNOPPOONNNNOOOOOOOOMMMMMMMMNOPPPOMLMMMNNNMMNNNNNNOONNNOOPPPQPPPOONNNNOOPONMLLMOOPOOPPPOOPOMMLLMOPPOOPPOONOONNNNNOOOOPPPPOOOOPPNLKMOPPPPPOOPLMOONMLLLLLLMMMMNNNOONNNPOOOOOONOOOOOOOPPOONNNMMOOOOOOOPPPPPPPPPOOOOPPPPOONNOPPPPPPPPPPPPPPPONOOOOPPPPPPPONNOOOONNNOOPPQQPPPPPPPOPPPPPPRQQPPPPPQPPPPPPPPQQQQQQPPONNOPPPPJJJJJJJJLLLKJJJJHIIJIHGFFGIJJJJJIIHGGHIIHHHHGGGHGGFFGHJJIIJJJIGFGFEEFFFEFFFEEEFFHIIIHGGGIGFHIIIJJKKLLKKKJKKJJHGFHGEDDFGHJJJHHIJIIIHHGGHHJJJHHHIJJJIHIJJJKJJJJJJJJJIJJJJJIIHIIJJIJJJIIJJJJJJJJIIIIIIJJJJJHHHHHIHHHHHHHIJJJJJKJIHIIIJIIIIIHHHIJJJJJJKKKJJIHHHHIIJJJIIIIIJJJJJJJJKKMLLLLLLKJJJJJJJJJJJJKKKKKJJJJJJJJIIIIIJJJJKKKLLLKKKKKJJJKKKKKKLLKJJIIIIJKKKKKKJJJJJKLMMMMMLKJJJJJJJJKKKJJJJJKKKLKKKKKLLLKKKKKJJJKKKKKLLLMMLLLLLKMMMLKKKLKKKKKLLLLLKKKKLLMLLLMMLLLLMMMMLLKKKLLLLKLKKKLMMMLLLKKLLLMMNNNMMMKMNNNMMMMLMNOMMMMMMMNOONNMLMMNOONNNMMMNNNNNOOOMLMMMMMMMMMOPRTVY\`abbcfiloqrssnbVQPOPONNOMMMMNNMLKLLLLMMMNNNOOONNONNNMMNNOOONNNNMMMMMNNNNONMMMNPPPOONNNNNNNOOOONMMNNOOOOOOOOOOOOOOONMMNNONNNMMMMNOOPONNNNMNNNNNOONNNNNNNNNNNOPONMLKKKLNNOOOOOOOOPOOOPPPPPOOOOOOOOPPPPPONNOOOOOOPPQPPONNNNMLLLMNOPPPOOPPPPRPRX_bhlstttvtooppqtwyzzzwuuvuuuttttttttvvvvuuvv{~n[XVQQPPPPPPPPPOPPPPONNNOOOOOOONNNNNNNNMMMNNONNOOOPPPPOONNMMMNNNNNNNOOONNNOOPPPOOOONNNNOOOONMMMOOPPPONNMMNOPOONOOOONNNNNNNNNNNNOOOONNNOPPOONNNNOOOOOOOOMMMMMMMMMNPPPOMLMMNNMMMMOOONNNNNNNOOOOOOPPPPPONNMNOOOONNLMNNOOOOPPPOOOOMMMMNOPPPOOOONOOPOOOOOOOOOOPPPPPOOOONLKMNOPPPNNNONNOPONNMNNNNNNNNMMMNOOOOOOOOOPPPOOOOOPPPPPONNNNNOPPPONOPPPPPPPPPPOONNOPQOONNOPQRQQPPPPPPPQPPOOOPNOOPPPOOONNOPPPPOONOOPPPQQQPPPPPOPPPPPPQQQPPPPQRPPPPPPPPPPPPQQQPPPPPPPPPJJJKKJJJJKLLKJJIIJJJJJIHGHIJJJKLJJIIIIJJHHHGGGGHGGFGHJKLIJJJJIGGFFFFGGFEFFFEEEEEIIJIHHHHHFEGIIJJKKKKKJJJJJKJJIHGIHFFGHHHJJJIIJJJJJIHHHHIJJIIHIJJJIHGHIJKJJJJJJIIJJJJKKJIIIIIJJJIJJIIIIJJJJJJJJJIHHGGHIJJHHGHHHHHGGHHIJJJKJJJJIHIJJJJJJJJIIIIJJJJJJJJJIHHGGHHIJJJJJJJJJJJJKKKJJJKLLLLLLKKJJJJJJJJJJJKKKKKKJJJKJJJJJJJJJJJJJJKKLLLKKJJJJJJKKKKKKKKJJIHHIIIKKKKKKKKKKLMMNNNMMLKKJJJJJJJKLKKJJJKKKKKJJJKKLLLLKKKJJJJJKKKKKLLMMLLLLLLLLKKJJKKKKKKLLMMMLLLLLLMLLKLLMLLLLLMMLLLKKLLLLLLLKKKLMMMMMMLLMMMLMNONMLLLMMNMMMMLLLNNMMNNMMNNOONMMLLMMMNNMMMMMMNMMMNOONMMMMMNNNOMOQTV[_bhknnmkkkpstsssjaVSPPPOOPNNNNNNNMLLMMMMMNNNNNNNNNOONNMMNNOOONNNNNMMMNNNNONNMMMNPPNNMMNNMMMMMNONMLMMNOOONNOOOOOPPPPOMLLMNONNNNMMMNNNOONMNNMNNNNNOPOOONNNNNPPPPPPONMMMMNOPPOOPPOOPPOOOPPPPPPPPOOOOOPPQQPPPPNNONNNOPPPPONNNONMMNOPPPPPOPPPPPSRV_gjmprtttusononnqtwwvxvuuuuuvttttttttvwwwwwwxvzyhXWUPRPPPPPPPPPPPPPONNNNOOOOOOPOOONNNNNMMNNOPOOOOOOPPPPONNMMMMMNNNNNOOPONNMNOPPPPPPPOOOOOPONMMMOOPPONNNMNNOOOONOOONMMMNNNNNNNNNOOOOOOOPPPONNNNNONNNNNNNOONNNNMMLNOPOONNMMNMMMMMOOOONNMMOOOOOOOOOPPPPONMNNOOONOONNOOOOOOPPPOOPONMMMNNNNNMMNNMNNOOOOOOOOOOOOOPPPOOOOMLLMNOOONMMMMNNOOOONNPPPPOOONNNNNOPPPPPPPPPPPOOOOPPPQPPONNNNOOPPPONNPPPPPPPOOOONMMNPPOOOOPPRTRQPPPPQRQQQPPOOPNNOOOONNNNNOPPPPPOOOOPPPPPPPPPPPPPPPPPPQQQPPPPQRPPPPPPPPPPPPQRQQPPPPPPPPHIIIJJJJJJKLKJJJJJJJJJJJHIIJJJJKJJJJIIJJIIIGGFGHHGFGHIJJIIJIHGFEEFFGHHGFFFFFEEEFJJJIHHHHHFEGHHHHJJJJJJJJJJJJJIIHHHIIIIHHHJJJIJJJJJJIHGHIJJIIJJJKIHGGHJJJIIIIIIIIJIIJJKJJJJJJJJJIIIIIIIIIIIJJJJJJHHHHHIJJHHGGHHHGFFGHIIJJKJIJJIIIJJJJJIJJJIIJJKKJIIHGGGGGHHHIIJJJJJJJJJKKLLLKJJJJKKKLLLKJJJJJJJJIJKKKKJJJJIIJKJJJJJJJJJJJJJJJKKKKKKJJJJJKJJKKKKKKKJIHIIIIKKJJJKKLLLLMMMMMKKKKKKKKKJJJKLKKJKKKKKJJJJJJKKKLKKKJJJJJJJKKKKKLLLKKLLKKJKLKKJKKKKKKKLLLMLLKKLLMLKKKLLLLLLLLLLLLKKLLLLLLLKKKLMMMMMNNNNMMLMNNMLLLMMNMMLMMLKLMMLMNNNNNOOOOMMMMLLLMMMMLLMMMMMMMNNNMMMMMNNOOOPSVY^chnqtusponrttttsok^WRPPNNOONNNNNNNMMNNMMMNNMMMMMNNOONNNMNNNNNNNNNNNNNNNNNNNNNMNOPPNMMNNNMLMLLMNNMLMMNNNNNMNNNOOOPPONMMMMNONOOONMMNNNONNNNONOOONNOONNNNNNNNPPPPPPPONNNNNOPPOPPPOOPPOOPPPPPPPPPOOOOOPPQPPPPPOPPONNOPPPOONOOOONNOPPPPOOOOOPPPSV]ioppsrttttrnnmmnoqsttuttttrstttsssssswwxxxxwvtw| scVVSPROPPQQQPPOPPPONNNOOOOOOOOOOONNNNNONNNOPPPOONNOPPPONNMMMMNNNNNNNNOONNMMMNPPPPPPPOONNOPPONNOOOPONNNNNNNOOOOONOONMMMNNNNNNNNNOOOOOOPPPPOONNNNNNNNNNNNNNNNNNNNLNOOONNOMMNMMLMNOONNNNNNOOOONNNNMNOOOONMNNONNNOPPPONNNNNOPPOOPPOMMMMLLKKKLMMMMNNNNNOOPPPOOOOPPPPOONMMMNOPONMMMMMMMMMMNNNPPPPOOOOONNNOPPPPPPPOONNMNNNOPPPPOONNNNOOPQPNMMNPPOOONNNNNNMMMOPMNOOPPSTRQPPPQRSQQQPOOOOOOOOOOOOOOOOPPPPPPONOPPPPPOOOPPPPPPPPQPPPPPPPQQRPPPPPPPPPPPPQQQQPPPPPPPPFFFFGHIJIJJKKJJJJIHGFGGHJJJIHHIJJJJJHHIJJJIHFFGHHGEEFGGFIIHHGFEDEEFGHHGFEFFFEEFGJJJIHGHIGFEGHGFEJJJIIJJJIIIIIIIHFIJJIHHHFHIHHIJIJJIHGFGHHHHHIJJJHHGHIJJJHHHIIJJJJHGHJKKJJJJJJJIHHIIIIIIHIIJJJJJJIIJJJJJJIHHHHIHGGHHIIIHHKJHIJIIIIJJJIHIJJIIJJJJJJIHGGGGHIIIIJJJJJJJJJKLLLMMLJJJJJJKLLLJJIIIJJJIIKKKKJJJJJHIJKJJJJKKKKKJJJJJJJJJJKKKJJJKKJJJJJJJJKJIIIJJJKJJJJJKLLLLLKKJJJJJJKKLLLKKKKKKJKKKKKKJJJJJJJJJJKKJJJJKKJJKKKJKLKKJJKKKJJKMMMLKKKKKKKKKKLKJJJJKLLKKKLLLLKKLLLLKKLLLLMMLLLLKKLMMMMMNNNNMMLMNMLLLLNNNNMLMMLKKMMLLNONNNOOOONNNMMLLMMLLLLLMMNMMMMNNNLLLMMNOORSUW[`fjpsvwuttttssttrqqc[RONLLNONMLMMMMMNONMMMNNMLLLMNOOONNNMNNNNNNNNNNOONNNNMMNNNNNOOPOOOOPOMLMLLLMNMLMMNNNNMMMMMNNOOONNMMNNOONOPPONNNMNONNNOPOPPONNNOMMMMNNNNOOOOPPPONNNNNOPPOOPPOOPPPPPOOOOOPPPOOOOOPPPPPPPPPQPPPOPPPOONNOOOONNOPPPOOOOOOPPPSXcputrttuuttqmmklmnnopqppppnmnosrrrrrssuvvwvutswz~n_TVSOQNOPQRQPPNOOOONNOPPPPOONNMMMMMMNNNONNOPPPPONNOPPONNMMMMNOOONNNNNNNNNMMNOOPOOOOONNMNOOPOOPPOOPONMNOOONNNNOONNONMMNONNNNNNNNNOOOOOPPPPPOOOOOOOOONNNNMMMNNNNNMNOONNNOMMNMLLMNNNNNNNNNMMMMMMMMMMOOPONMNOONMNOPPPNMLLMMOPPOOPPPOOONMLKKKLMNNNNOMMNOPPPPPPPPQQPPPONNNOOOPPNNOOONMMLLMNNOPPPOOOPPPOMMNOOOPPPONMMLLLLMNOOPOONMMNNONPQPNLLMOONNMMMLLMNNMMNNLMNNOPRSRQPPPPQRQQQPOOOOPPPPPPPPPPPPPPOOPPNNOOOONNNNNOOOPPOPPPPPPPPPPQQRPPPPPPPPPPPPPQQPNOOPPPPPEEFFGHIIHIJKLKJIIHGFFGFDHHIIIIJJIIHHIJJHJJIIJJHGGGHHGGHHGFFFFFEDDEFGHIIIGGGGGGGGKJJIHHIJGFFFHHGEIHHHHIIJIIIIHHHIIJJKJJIIJJJJIIJKJJIHHHGFGGGHJJJJIHGHIJJJIIIHHIJJJIHHIJJIKKKJIGHHIJJJJJIIHIIJJJKKJJJJJJJJIJJJJJJIIIJJJJIIJJIHHHHHHIJJIIIIJJJJJJJJJIGFFGGFIJJJJJJJMLKJJJKLLLKKJJKKLLMMLLKJJJJJIIIJJJJJJJJKJJJJJJJKLKJKKKJJJJJJJJKKKKKKJJJJJJJJJJJKKJJJJJJKLKJJJJJJLLKKKLKJKKKLLKKKLKKKLLLKJKLLKKKKJKLLKKKLLLKKKKJJJJJKKJJJJJJJJKLLKLMMMMLLJKLLKKKKLLKKKKKKJJKKKLLLLLLLLKJJKLLNOOMLLMMMMMMMMNOONNOOLLLKKKMNOOPPONOOMMMLMMNNONMMNNNMNNNNNNNOMMMMMMMMMMLLLLMMMMMMNOOOPQUVbkiktuwxxvutttssstx{wgVINNPJOOMLMNOOOONMLLMNMNNMMMMNOOOPPOOONNNNNNNNOPPONMMNOOOONOOONOPPONMMMMMMNNNNMMNNNNNONMMMOPPPPONPQQQQPONOPOMMNNOPPPPPPPPPPPONNNNNNMNNOPPPOOOOPQPPQPPSPPPPPPPPQPOOONOPRPPPOLMPPQPOPTURUVXWVVTRQOPPOPPNNNOPPNNPPQOOQPPR\clqtuuttuutronmlklmnnmmnmmmmkjjmnnpqstttqonoortt} xh\XVRPNOOOPPPOOOOONNNOOPPPPPPONNLMNOOOOONOOPPPOONOPPPONMMMNNNNMMNOOONNMLNNNMMMNNPONNNNNMNOOPOOOOOONNMMLLLMOONNNNOOPPPONNNNNNNNNNNOPPPPPPPPPONNNOPOONMMMMMMNNNNNNNNNNMMMMNNMMMNOONNNNNNNNONNMMNNONNNOOONMNNNMLLMNPPOONNNNQOMLNPRRPONMMMMLMNNOONNMOONNNOPPPPPPPOPPONNNOPPPOPPPPONMNLJKLMNMOOOONMNNNOONNOONOPPOMLMNNNNNNNNNMNOONOOPPOPQPNNONNOOOOONNMLLMNNNNMLMPPPPQQQPPPQRRPPPPNNOPPPPPPPPPPOOPPPPPPPPQPPPOONMLLNOPPPPOOPQPQPPPPQSRSSRPPPROPPPPPQRNOOPOPPPFFFFGGGHJJKLLKJJIIHFFFFDHHHIJJJJIIHHIJJGJIHIJJJHIIIIHGGHHHHHHGFFEFFGHHIIGGGHIJJJJJIHGGHJHGEFGGGFGGGHIIJJGGGGGGHIHIJJIHHHJJJIIIJJJIHHHHGGGGGGIJJJIHHHIJJJJJIIIIJJIHHHIJJJJJJIGGGGIIJJJJIIHIIIJJJJJJJJJJJJJJJJJJJJIJJJJJJJKJJIIHHGGGHIIIJJJJIJJJJJIHGGHHIIIJJJJJJJLKKJJKKLKKJJJJJJKLLMLLKKJJJIHHIJJKKJJJJKJJJJJJJKKKJKKLKJKKKKJJJJJJJJJJJJKKKJJJJJKKJJJJJJKKJJJJJJLKKKKLKJJKKLLLLKLLKKLLLKKKLLKKKLJKLKKKLLLLKKLKKJKKKLLKKKJJJJJKLMLLKKKKKKKLMMLLLLKKKKKKKKKKKKKKKKLLLLLKKKKKLMNONMKLLLMMNNMNNNNMNOMMMLKKMNNOOONNNNMMMLLMMMMLLLMNMMMNNNNNNNNNNNNNNNMMMMMMMMNNOOOPPPOQVYbmnptuwwvuutttstttx{}tgTPMPNNNMMMNOOOOOMLLMMNNNNMMNOOOOOOOOONNNNNOOOOOOONMNNNNNMMMNNMNOONNNNNNNNNNNONNOONNNOONMNOPPPOOPQRRRRPONOPOMMNOOPPPPPQQPPPPPONNNNNNNOOOPPPPQQOPPOPPPUVVVVUSRQPOOPONNPPPQRQPPQNPQSUVURWZ\\\ZYWVSRQNOPNOOOPPOOPQRPPRRSWagnrtttttttsqonnnllmnlklkkkkihhhjkmnprstronnnoqsw~vmdYVSPPOPPPPPPPOONNNNNNNNPPPPOMLKMMNOOOOOOOOPPOOONOPPPOONMNNNNNMMOOOPONNMMMMMLLMMONMMNNMMMNOOOOPPPPONMLLLMNNNNNNNOOPPPPOONNNNNNNNNOPPPPPPPPOOOOONOOOONNMMLMMNNOOOOOONNNMMNMMNNOOOOOOOONNNPOOOOOOPNNNOOONMMMMMLLMNPPPPPPPPPOMMOPQQPPNMMNMMNNNNNNNNOONNNOPPPPPPPOPPONNNOPPPOOOOOOPPOMKKMNNNNOONMMMMOPPOOPPOOPPOMLMNNNOOOOOONNOOOOOPPPPQPONPOOOOOOONNMMMNOOONMMNPPQQQQQPPPPQPNNOPOOPOPPPPPPPPPONOPPPOPPPPPPOOOONMMMNOPPPPPPQQQQPPPQRSSSQPPQRPPRRRQPPMNOOOOPPFFFFFGGGJJJJKKKKIIHFFGFDHGFHJJJHIIHHIJIGHHHIJJJJJJJJHGGGHIJJHGGGFFGGGHHIGGGGHJJKIIHFFFHJIGEEFGHGFGHHIIIHEFGGGGHIIIIIHHHIJJJIIIJJIHHHIIHHHGGGHIJJJJIIJJJJJJJIIIIIIHGHIJJJIIHHGGGHHIIJJJJJIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJIHHGGHHHHIJIIIJJJJIHHHHHHJJJJJJJJJJJIIIJJJJKJJJJJJJKKLLLLLKKJJHHIJKKKKKJJJKKKKJJJJKKJJKKLLLKKKKKJJJJJJJJJJKKKJJJJJJKKJJJJJJJJJJJJJKKKKKLLLKJKKLLLLLLLKLLMLLKLLLLKKLKKKKKKMNLLLLLLKJLLLLLLLLKKKKKLMMLLKJJJJKLMMMMLLMLLLLLLLLLLLKKKJJLLLKKLLLJKLMNONMJKKLMMNNMNNNMMMNLLKKJJJKMNNNMMMMNMMMLLLLLKKKLMMMMMMNNNNNNNNOONNNNNMMMMNNNNOOONNNPSXZcnpuuvvuuttuttttttx{~xdVMOOMMMNNNNNOOONLLLMNNNNMMNOOONNNNOOOOOONNNNNNNNNMNNNNMMMMMMMNONNNNOOOOOOOOOOPPONNNNOONNOOOONPRUWYYXQPOPQPNNNOOPPPPPQQQQPPPOMNNNOPPPQQPPPPPPQTSRSRU[ZZZZXVSQQQRRQPPQPQRQQQQPRSVZ\\\]\^bb`][XZWVSONONNNOOONNPPRQQRSV]fkpstttssssrqpppnmlmlkiihhihgddffhilnoqrponnooqsw|~}zqgbVTQOPNPPPPPPPPONNNNNNNNPPPONMLKMNNOOOONOOOOOOOOOOOPPPOOOOONNNNNOPPPPOONMMNNMLLMNMMMNNMMLMNOOPPPPPPONLLKMNNNMNNOOOOPPPPPNNNNNNNNNOOPPPPOPOOOPPPNNNOPONMLLMMNOOOOPPPOONNNMMNOOOPOOOOOOOOOOPPPPPPONNNOOONNNNNMMMNOPPPQQQPPPONNPPPPPOMMMNNNOONMMNOONNNNNOOPPPPPPPPPOONOPPPPOONMNOPPONLLMOONNNNNMMMMOPPPPPPOOOPONMNNOOOOOOOONOPPOOPPPPPPPOPPPPPPPOONNMNOPPPONNOOPPQRQQQPPPPPONNOPOPPPPPPPPPPPONNOOOOOOONNNNNOPPONMMMNOPQQPQQQQQQPPPPSSRQPPQSQRRRQPPPMNNNNNOPEEEFFGHIHHHIJKKLIJIGGHGFHFEFHHHFIIHHHIIGHGGHJJJJJJJJIHHIIJJIGFGIGGGGGGHHGGFFFGIIIIHFFGIJIGFFGHHGGHIJIHGGGHIIIIJJIIIHHIJJIIJIIIIJIIIIIIIIIHHIJJJIJJJJJKKKKJJJJIIIHHHHHIJJJIIHGGHHHHIIJJJJJJIIIIHHIIIJJJJJKJJJJJJJIIJJJJJJJJJJJIHHHIIHHHIJIIJJJJJIIIHGGGHJJJJJJJJKHHHIIJJJKJJJJJKKJJKLLLLLKKJJJJKLKKKKKKKLKKJJJJJKKKKKKKLLLLKKKKJJJJJJJJJJJJJJJJJJJJJJJIIIJJJJKKKKKKKKLLLLKKKLLLLLMLLLLMLLKLLLLLLLKKKKKLMNMMLLMLKJLLLLLLLLLLKKLLMNLLKKKKKLLMMMLLLLMLLLLLLLLLLKKKJJLLKKKLMMLLLMNONMJKKLLMMMNNNMMMMMLLKKJJJJLMNNMLLMMMMMLLMMLKKKLLLLMMMMMMNNNNNNNNNNNNMMMMNNMNOONMLLPSWYcnpuvvuttttutttttuy|{ubRNOPONOONMNNNONMMMNNNNNMMNOOONNNNOONNNNNNNMMMNNNNNOOONNNNNNOOOOOOOPOOPPPPPPPPPPONNNOOOOOPPPPQTY`eebVSRSSRPPNNOPPPRSSSTSQPPPOPPPQSSRUTSRQQPPRUUTTTW^bbb`]ZVUSQQQPOOPRUVUUVVSTSUY\^bglnqrpmgb^\[XRPPNMNOPOOOOPSSSUV\dhmqrssssrrrrrrrrnmlkkihhhgggebbcbdgilnooooopppqtuyzzzxqh_VTQOOMOPPPPPPOOOOOPOONNNOOOPOOONNNOONNNOOOONNNNOOOOOPPPPPPOOOOPOOPPPOONMNOONNNNNNNNNNNNMNOOOPPQPPPONMMLNNNMMNOOOOOPPPPPOOOOOOOOOOPPPPOOPOOPQQPONNOOONMLMMNNOOOOPPOOOOOOMNOPPPOOOOOONNNNNNOOOONNONNOOPONOOOONNOPOPPPPPPPONNOPPPOONMLMNNNOONNNNOONNNNNOOOPPPPPPPPOOOOPPPPPONMMNOPONMMNOONNNONNMMNNPPPPPPNOOPOONOOOOONNNOOOPPPPPPPPPPPOOPPPPPPPOONNOOPPPPONOPPPPQRQQQPPPPPPPPPPPPPPPQQPPONOONNNOOOPPONMMMNPPPPOOOOPPQQPPPQPPQQPPPPRRRRQPQRRQPONNOPMNNONOOPHHHHHIJJHHGHIJJJHIIHHIIIHHGFEEFGIIIHHIIGHHGHHIHHHIIJIJJJJJJHFEGJHGGGGGHHGGFEEEFGIIHHGHJKIHGHIIHGGIJJJIGGJJJJJJJJHHGHHIJJHIJJIIIIJJJJJJIJJJJJKJJIIJJJJJKKKKJJJJJJIIHHHHIJJJIHHGGGHHHIIJJJJJJJIHHHIIJJJJJJKJJJJJJJIJJJJJJJJJJJIHGFHIIIIIIJJJJJKKJJIIHHGHIJJJJJJJKKIIJJJJJKJJJJJJJKJJJKKLLLKKKKLLLLJJJJKLLMJJJJJJKLLLKKJJKKLLLKKKKJJJJJJJJJIIJJJJJJJJJJJJJJJJJKKKKKKKKKLLLMMLLLLLLLMLLLLMLLLLLLLLLKKKKKKLMNNNMMLLJJKKLLLLKKLLLKLLMMLLLMMMMLLMNMMLLLMMMLLLKKKKKKKKKKLKKKKLMNMMMNNNMMKKLLLLMMNNMMMMMMNNMMMMLLLMNMMLLLLLLMMMMMMMMLLLLLNNMMMMMMNNNNNNNNMMMMMMMMNOOONMMMPRVXcnquwwutsttutttuuvy||q^STRPNOPOOPMNNNNNNNMNNNMMNNONNMMNNONNNNNMMMMMNNNNNOPOOONNNNPPPPOOPPPPPPPPPPPPPOONNMNNOOOPPPRRT[fpoj[WUUVTRQONOPPPRUXXXVTQPQPPQQTVXWWXXXWVVVW[[[\\ahqpnjfb]\XVSRSRRRVY]^``\WY[_fikotz{}~~zrjccc`WRPMNPQQQQPPRVVVXZ`hjnprrstsrrrrrsstnljjihghhecddba``bdhjlmnnnnoooqstwyxxwrk[TTRPPNOPPPOOOOOOOPPOONMMNNOPPPPNNNNNNMMNNNNNNNNPOOOOPPPPPPOOOPPNNOOOONNNOPPONNNNNOOOONNOOPPPPPPPPPOONNNONNMNNOOOPPPPOOOOOOOOOOOPPPPPPOOPOOPQQPOOONNNNNNNNOOOOONOOOOOOPPNOPPPPNMNNNNNMMMMMNNNNMMONNOPPOOOPPONOOPOOPPPPONNNOPPPOOPONMNOOONNOOOONNNNNOOOOOPPPPPOOONNOOPPPPONNNNNOOONMMNNNNOOPOONOOOPPPPPPOOOPPOOPPOONNNNNNOPPPPPPQPPPNNNPPPPPPPOONPPPPPOOONOPPPPPQQQQQQPPPPPPPPPPOPPPPPPNNOOONNNOOPPOONNNNPPPPOPPQQRQPPPPPPPPPPPPPPQRRRQPPQPPNMMOPNNOOOOPPKKJJIIJJJIHIJJIHHIJHHJJJJIIGFFGIIJIHHIIGHHHGGGGGGHIIJJJKKJJHFFHJHGGGGGGGGGFEFFGHHIIIIJKLIHHIJJIGFHJJJJIJJJKJJJJJHGGGHIIIHIJJIIIIJKKJJJJJJJJKKJJIHIIIIJJJJJJJJJJJIIIHHHIJJJHGGGGGHHHHHIJJKJJJIIHHIJJJKJJJJJJJJJJJJJJJKKKKJJJIHGEEGHIJJJJKJJJJKKJJJIHHIJJKJJJJJKKLJJJJJJJKJJIIIIJJJJJJJKKKJJJKLLKJJJJJKLMMJJJJJJKKLLKJJJJKLLLLKKKKKKJJJJJJIJJJJJJJJJKKKKKJJJJJKKKKKKLLLLLMNMMLLLLLLLKLLMLLLKKLLLLKKKKKKKMNNMLLLKJJKKKKKKKKLLKKKLMMLLMNNNMLMNONMMMMMMMLLKKKKKKKKKLLKKKLLMMMNNMNNNMLLLLLMMMMNNMMMMMMMMMNNNMLMMNNMMMMKLLMNNNNNNNMMLMMNNNNNMMMONNNNNNOMMMMMMMMMNNNMLLMPRVYdpswxwvuttttttuvvwz|yl`^VPMMOOOPMNOOONNOMNNMMMMNNNNNNNNNOOOONNNNNNNNNMNNOOONNMMMPPPPPOPPOOOOPPPPPPOOONNMLMNOOPPPSST\kwvnb]YXWVTSQPPPPPSWbba\VRPPOPPPUZ\\^`ba^\[[bdefhhmt{zwsnhca]ZWVVVVVX]dijf\UW]horrrtzz{}~{tmmnni_VROPQRQQRSSUWXY\^bjknpqrtttrrqrrssrmjhhhgfgfb`aba^\^`behhiihhjllmnqtwzzzztnVPSRPPPPPPOOOOOOOOOONNMMMNNOOPPPOOOONNMMNNNNNNOOOOOOOOPPOOOOOOOONOOOONNMNNOONMNNOOPPPOOOPPPPOOOPPPPPPOOOONNNNOOOOOPPPONMNNNNNNNNPPPPPPPPPOOPPPPOOONNMNNNOOOOOOONNNOOOPPPOPPPPONMMMMMMMMMNNNNNNNNOONOPPPOOOONMMNOPPPPPPOOOOOPPPOOPPOPPPPPNNOPPONNNOOPPPPPPOOOOONMMMNOPPPOLMMNOOOOONNNNNNNOPPPOOOPPPQPPQPPPPPPPPPPOONNMNNNPPPPPPPQPPPNMNOOOOOOOONNPPPPOONNOPPPPPPPPPPQQQPPNOOOOPPOPPPPPPPOOOOOOOOOPPPOOOOOPPPPOPQRRRQPPOOPPPPPPPPPPPQRRQPPPPQPPONNMNOOOOPPLKJIIIIIIHHJJJIGHIJHHIJJJIIIIIIHIJJIHIIHIHHGGGGGHIJJJJJJJJJIHGHHGGGGHGGGGGGGGGGHGHIJJJKLJIIIJJJIFHJJJJJJJJJJJIIIIHGGHHHGHIJJJIIIJJKJJJJJKJJJJJIIIIJJIHIIJJJJJJJJHHHHHHIJJIGGGGHGHHHHHIJJKJJJIIHHIJJKKJJJIIJJJJJJJJJJKKLLKJJIHHGGFHJJJJJKJJJJJJJJJIGHJKKJJJJJKKKKJJJIIJJJJJIIIIIIIIJJJJKKKJJJKKKJJJIJJKLLJJKKJJJJKKKJJJJKLLLLLLLLKKJJJJJKJJJJJJJJJJKKLLLKKJJJJKKLKKLLLKLMMMMLLLLLLLKKLLLKLKKKLLKKJKLKKKLLLLKKLKJJKKLLLLKKLLKKKKLLMMMMLLLKMNONMMMMLLLLLLLLKKKKKKKKKKLLMMMMMMMMMMMLLLMMMNNNNMLLMMMMKKLMNNMLMNOONMMNLMMNNNNNNOONMMNNNNNNNNNMNNNNNNNNLMMMMMMLLMMLKKLNQTY[epsxxxwvttttttuvwwz}||zok_VONOPPPNOPPONNNNNNNMMNNNNNOONNNOOOONNNNOOOONMNNOONNMMMMNOPPOOOONNOOOOOOOONNNNNMLMNOOOPPRSV_o~}thc]\ZXVVTQQRSTX]ppmf\VQQPPQSYaddgjmlhb``knnnoosy~}{ytpkhcb`\YVVW]birslaYaju|~|zy{}}~~|yuvwxsf\WSSTTRRUVWY[[\abejlnppqrrrqqppqqpoljhggeeeb`]^_][YZ\^abccbbcfhijnqtwz{|zrjTORPOPPPPPPOOOOPPPONNMMMNNNNOOOPPPPONNNMONNOOOPPOOOOOOOONOOOPPPPOOPPPONMNNNNMMMNOPPPPOOOPPPPONNOPPPPPPPPNNNNOOONMNPPPPNMNNNNNNNNOOOOOOPPPOONNNNNNNNNNNNNOOOOOOOOOOOOOOOOOPPPPONMMMMNNNNNOONNNNOOOONOPPPPOOONMMMNPPPPPPPPPPPOOOPPPPPPQQPPOOOOOOOOOOPPPPPPOONNNNMLLMNOPPPOMMMNNOOOOONNNNNNOOPPOOOPPPPPPPPPPPPPQQQQPOONNNNNPPPPPPPQPQPOMNNNNNOOONNNPPPONNNOPPPPPOONOOPPQQQPMNOOOPPPPPPPPPPPOPPPOOOPOOOPPOOOOOPPPPPPPPPPPPPPPPPPPQPPPPPPPPQQPQRRQPONLMNNNNOOJJIHGHHIFFGIJJIGHIJHHHIIIHHJKKJGIJJIHIIHIIHGGGGGJJJJJIJJJJIIIHGEFGGHHHGGHHHGGGFFFHIJJJKKKJIHJJJJGIJJJIIJJJJJJIHHJJIIIIHFHIJJJIIIJJJJJJJJLJIHHIIIJJJJIHIIIIIIJJJJGHHHHHJJJIGGHIIIIHHGHHIJKJJJIHHGIJJKKJJIHIJJJJJJJJJJJKKKJJIIIIJJGIJJJJJJJIIIJJJJLJGGJJJHIJJJKKKKLKJJJJJKJJJIIIJJIIIJJJJJLKJJJKKKJJIJJKKJJJKKJJJJJJJJJJKLLLLLLLLLJJJJJJKLLLLKKJJJHIJKKKKKKKJJJKKLKLLLLKLMMMLLLLMMLKKKLLLKKKKKLLKJJKLLKKKLKKJKKLKJLLLLLLLLLKKJKKLLNMLKJJJJMMNMLLLLKKKLLLLMKKKKKKKKKKLMMMMLLLLLMMMLLLMMNOOOMLKKLMMMKKLMOONMNOOONNNNMMNNNNNMNOONNNNOONNNNNNNMMMMMMMMMMMMMMMMMNNMLLNPRV\\enrxxxxwutttttuwwxz}~} |uj_UQRRPPOPPPONNMNNNNMMNONNOOOONNONNNNMMMOPPONMMNPOONNMMMKMNOONNONNNNNNOOONMMNNNMLMNOOOPPPTXbtznhb^\[YXUSRTVW]c}ypd[VUTVVX_hnnlquupkiixzyxyxz|ytrqqpkc^]`benx{umghqz~~~}{~}}|{|~xka\XXXVTUX\]^__bghimlnoooppoppooponnlihgfddd`]\\\ZXWVXZ\^^^]_`behinqxyz{{ui^TOQPLONPPPPPOPPPPPPONNNNNNNOOPPPPPPPONNNOOOOPPPQOOOPOONNOOPPPPPPPPPPPOONNONNMMNOOPPPPONOPPPONMNNPPPPPPPPNNNOPPONKMOPPPNMPPPPPPPPOOOOOOOOOONMMLMMMNOOONMMNNOOPPPPPPPPOOOOOOPPPOONMNNNOOOOOONNNNOOOOOOPPPPPPPNMMNNOOOOPPPPPPPOOOPPOOPPPPPNPOONNOOPOPPPQPPPONMMMMLKKLMOPPPOONNMMMNNOOONNNNNNOOONNOOPPPOOPPPPPPPQRRRPPONNNNOPPPPPPPQQRQOMNNMMNNNNNNNOPPONNOPPPOOPONLNNOPQQQPNOPOPQQPQQPPPPPPOPPPPOPPNNOOPPOONOPPPOOONOPQQPPPRQPPPQPPQPPOPPQRSSRQPOOOKLMMMMNNLJJHHIJKIHHHHIHHJJIHHIJJIIIJJKKJJJJJHHHJJJIHHHIJIIJJJJIIGHIJJIGFGHIIIHHHIIHGGGGHIIJJJJJJKIGGIJJJJJJHGGHIJJJJJIIIJJIIIIHGIIJJIIIHJJJJJJJJKJIIIIJJJJJIIIIIHHIIJJJJGGGGGHHIJJJJJJJIIHHIJKJIJJJJIHHIJKKKJJJIJJIIIJJIIIHIJJKJIIHIIJJIJJJJJJJJJJJJJKLLLKJJJKKKKJJJKLJJKKKKKKJJJJJJJJJJJJKKKJJJJJJJJJJJJJJJKLLKLKKJJJJKIIIIJJJKJJKLLLLLJKKKKKLMKKJJKKKJJKKLKKLMLLKJJJJJLKKLMMMMMMLLKLLLMLKKLLMMKKLLMLLKKKKKKKKKLMMNNMMLLLLLLLLLLLLLLLKKKLLLKJJKNNNMMLLLMMMMMMMMLLKLMMMLNMLMMMLKLLLLLMNNMNNNNNOONNMMMMMNLLLLLMNONNNMMNNNNNNNNOOONNNNNNMMNNNNMMMNNNOONNMMMMLLLMNNONMMMMOQVX\bfqrxxxwvuttttuvvvwz{q_SQRRQPPOOMKLNNNMLLLMMNOPONMNPNNONNMMMNNNNOOOOOOOOONNMOPPPOOONNNNNNNNNPPOPOMMNOOOOOOPPRT\fwyma\]__\WW[XU]luhb^YWZXWdw{z|{usr{{|~~}|{tspmhgffjow||ytqtw{~~|wohedc_ZWZ_bcefghhiijlllmnnnlkmnnmkkkhhhhgfcb_^]\[YVUVVWWVWY[]_acgjnptvzwmc\VSQPNNOPPQPPPOOPPPPPOOOOPOOOOOOPPPPPONNMMNOOPPPPPPPPPPOOOOOOOPPPPPPPPPONNPONNOOOOPPPPPPONPPPOMLLLPPPPPONNOPPPPPNMOOPPPONNPPPPPPPPPOONNNOOPOMLLLMNNOOOONNMOOPPQQQPPPPPPOONPOOOPPPPONNNNONMNNNOOOPPPPPPPPPPPPNNNNOOPOOOOPPPPPOPPPPPPPPPPOOOQPOOPPPNPPPPQQQQPPONNNNNNNOOPPPPONLKLMNOPPPOOOOPPPPPOOOOPPQPPPQRQPPPPPPPOOOOOOOOQQPPPPPQSRPNMMNMONLMNONMPPNNMNNORQPPPONNNNOPPPPPOOPPPPPPRRQQQQPPPPPPPPOOPPNMOPPOOOOPPPNLNOPPOOPPSQONOPPPQQPOOPRTRRRRQPONNNNNNNNNJIHGGHJJIIHHHHIIIIHHHHIIIHHHIJIIJJJJIHJJJIHGGGGHIIIIIIIIHIIJJIHHGHIHGGGHJJJIIIIIIJJJJJJJJJHGIJJJIJJIHGHHJJJJJJJIIHGGHGGFJJJJJIIIHIJJKJJJJJHHHIIIJJJJIIIIHIIJJJJJHHHHHIIIJJJJJJJJIHHIJKJIJJJJJIJJJJJJJJJIJJJJJKKKJJIIJJJJJIIIJJJJJJJJJJJJJJIJJKLLLLLLLLKJJIIJKKJJKKKKKJJJKKKJJJJJJJKKKJJJJJJJJJJJJJJJKLLLMLLKJJJJJJJJJJKKKKLLLLLLKKKKJJKKJJJJJKKJJKKKKKLLLLKKKKKKKJJKLLLKJJJJJKKKKKJJKLKKKKLLLKKJKKJJJKKKLMMMMMMLMMLLKKKKKKLMMLLKKLLLKKKKMMMMNNNNLLMMMMMMMLLMMNMLLLLLMMLKLLLLLLLLMMMMMMMMMMLMMMNNKLLLLLMNNNNMMMNNOOOOONNNMNNOONMLMMNNMMMNNNNNNNNMMMLLLMNNONMNMNPRUY\dgqsxxxwutsttuvwwwxz{~~lZQQQPPNMMMLLMMMMLLMMNNOPPNNOPMNNNMMMMNNNNOOOOOOOOONNNPPPPPPOOMMNNOPPPPOOPONNONOOPPPPPTWaiw}shbcfghb`ba]bm~|rhb_]]\]jz{|}~zyy ~|zwuttutruz}}zxuwz}~}ztonmhc]\`hnokkkjjjjjjiijlljihiiiihhhhhhhgfdba_]\YWUSTTUUUVWY\^`cfjnputtnd\XSRQPNNOPPPPONNNOOPPOONOOONNNNOOPPPPOONNMMNNNOPPPPPPPPOOOOPPPPPPQQPPPPPOONPONNOOOOPPPPPPOOPPPPONNNPPPPOONNOPPPPPOOOOOPPOONPPPPPPPPOONNNOOOONMLLMNNOOOPPPOOOOPPPPPPPPPPPPPPPPOPPPPPONNNNNNMOOOOOOOOPPPPPPPPPPONOOOOPPOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPOOPPPPPOOOOOPPPOOPPPPPPPONMNOPPPPOOOOOOOOOOOOOOPPQPPPQRPPPPPPPPONNNNOPQPPPPPPQQQQPNMNOOONMMOPONPONMMNNOPPPPPPONNNOPPPPPQPPPQQRSQQPPQQQPPPPPPPPPPPPPPQPOPPPPPPOOOOPOONOPPPNMNOPPPPPPPPQRQPOPQQQPPONNNNMLIIIIIJJJIIHHGHIIHHHHHHHHHGGGHHGGIJJJIJJKJIHGFFGGHHHIIHHHIIIHHHHHHIIHGFGIJJJJJJJIIIJJJJJJJJHHIJJJHIIIHGGGIIJJJJJJIHGGGFEEJJJJJJIIGHJLMMKJJIHHHIJJJJJJIIHHIIIJJJJJIIIJJJIIJJJJJJJJJIIIJJJIJJJJJJJJJJJJIIJJJJJJKKKJJJJJJJIIJIIJJJJJIJJJJJJIJJJJJKKKLLMMMLJIIHHIJKKJJJKKJJJJKKKKKKJJJJJKKKJJJJJKKKKKJJJJLMMLMMMLKJJJJJJJJKLLLLLLLLMMKKKKJJJJIIIJJKKKJKKKKKKLLKKJJJJJKJJJKLKJJJJJJKKKJJJJKKJJJKKKKJJJKKJJJKLLLMMMMMMLNNMLKKKKJKLMMMLKKLLLLLLLLLMMNNOOLLMMMMMMLLLMMMMLKKLMMMMLLMMMLLLLMMMMLLLLKLLMMMMMLLMMLLMNNNNNMMMNOOONNNMMMNOOONMLLMMMMMMNNNNNNNMMMMMLLMMNONMNNNPRUZ]ghpswxxwusrstvwxxxxz{}wbUSSQPNMMMLLLMMMMNNNNOPPPONOPMNNNMMMMNNNNOOOOOOOOOONNPPPPPOOONNMNPQRRPPOPOOOPPPPPPPPPRXfox zqllmmmhefecgl{}|pjkhc`cp}~ ~zxwz{||z{}~~|{{{}~}~~|ywwxzumhjnppponkjihhhhghhhhfdeeeeeefgfffffdcba^\YWUTSTTTTUWY\]`bfjnotspi^YVSRPONNOPPOONNNNOOPPOONNOONNNNNOOOOONNNNNNMMNNOOPPPPPPOOOOOOPPPPPQPPPPPPOOONNOOOONPPPPPPPPPPPPPOOPPPOONNOOPPPOOOPPNOOPPPOOOOOPPPPPNMMNOOONNNMMMMNONNOPPPPPPPPPPPPPPPPPPPPPPOOPPPPONNNNNNNMPPPPPOONNNNOOOOPPONNNOPOPPOOOOPPPPPPPPPPOPPPPPPPOPPPPPQRPPOPPPPPOOOOPPQRPPPPPPPOPPOOPPPPOOOONNOONNNNNOOPPPPPPPPQPONNOPPPONMLMNPQPPPPPPQQPPPNNPPPONMNOPPOOONMMNNOOOPPQPPNNNOPPPPPQPPPPQRSPPPPPQQQPQQQPPPPPPQQRSQPPPPPOOPPOOOONNNNNNMLLMOPOPPPPPPPPNLNPSRQQPOOPPONHIIJJJKKIIHGGGIJIIIIIIIIHGGGHHHGHHIIIJJLJJIHGGGGHHHIIHHHIHGGGGHHIJJIGFHJJJKKKKKJGHIIIIJJJJIHIJJJIIIHHGGGHIJJJJIHIHHGGFFEJIIIJJIIIIJLOOMKJIIIJJJJJJJJIIHGIIIIIIIIIIJJJIIHIJJJJIIJJJJJJJJJJJJJIIIIJIIIIIJJJJJJJJJIJJJJJJJIIIIIJJJJJJJJJJJJJJJJJKJJJKKLMKJHIIIJJKKKJJJJJJJJJJJJJJJJKJJJJJJJJJKLLKKJJJJKLMMMMMMMLKJJJJJKKLLLLLKKKLLMKKKJJIHIIIIJJJJJJKKKJJKKJJJJJJJJKJIJKLKJJJJKKKKKJJJJKKJJJJJKKJJJKKJJJKLMLMMNNMMLNMMLLKKKKKLLMLLLKLLMLLLMNNNMMMMMMMMMMMLLKKKLLLLKLMMNNNMMMMNNNMMMMMMMMLLLLLMMNMMMMMNMMMMNNNNNNMMMNNNMMMLLNNNONNMLLMMMLLLMMMMMMMMMNMMLLMMNONNNNOPRU\^ikosvwxxvsrrttvwxxyz|~{m^VTSRPPPNLLMMNNNONNNOPPPOOOPNNOONNNNNNNNOOOOOOOOOONNOOOOOONNONMNPQRRRQPPPPPPQQRRSTTUT\mu{~zxvspronnnoqs}} yuxtmghr| }{{}~}}~~~}}}}}~~}|{|~{vttwvtrpnkihgggfefffecbbbbbbcddddddccbb`^\YWVUTTTTSUWZ\]`bfilnonng]YVSQPONOOPPOOOOOOPPPPOOOOOONNNNOOOOOOONNNNNMMNNOOOPPPPOOOOONNOOOPPPPPPPPOOOMNNNONNMPOOOOOPPPPPPOOOOPPONNNOOPPPPOOOONOOPPPPPOOPPPPPPMMMNPPONMMMMNNOONNNOOOOPPPPOOOPPPPPPPPOOOOOPPPONNNNNNNNNPPPPPPONNNNNOOOOONMMNOOOPPPPPPPPPOOOOPOOOOPPPPPPOOPPPPPQPPPPPPPPPPPPPPQQQQQQPPOOOOOOPPPPOONNNNNNNNOOOOPPPPPPPPQQPONNOOPPONMLLMNOOOOOPPQQPPPOOPPPONNNOOONONNMMNNOPPPPPPONNOOPPPPPPPPOPPQQPPPPPQQQPQRQPPPRPQQRSTRPPPOONNOPNNNNNMMMNNNMLLNPOOPPPPPPOMLMPQRQPPPPQRRQGHIJJJJJIIHGGGIJIIIJJIIIIHHHIJJIGHHIIJJKJJJIHHHHIIIIIIIIIIHGGGHHIJJIGFHIJJKLMMMMGHHIHIIJJJIIIJJJJIHGGGHHHIJJJIHGHHHHGGGGIHHHIIIHJJJKMNMLJJJJJKKKJJJJJIIIIIHHHHHHIJJJJIIHIJJJJIIJJJJJJJJJJJJJIIIHIIIHIIJJJJJJJJJIIIJJJJJJIIIJJKJJJJJJJJJJJJJJJJJJJJJKKKJJJIIJJJJJJJJJJJJJJJJJJJJJKJJJJJJJJKKLKKJJJJJKLMMMLLLMLLKKJJKKKLLLLLKKKKKLKKKJJIHHJJJJJJJJJKKKJJKKJJJJJJJJLKJJLLKJKKKLLKKJJJJKLLKJJJJKKKKKKKJJJKLMMMNNNNMMMMLLLLLLMMLKKKLLKLMMLLLMNMMMLLLKNNMMMLKKKKLLLLLLMNNNNMMMMMMNNNNNLLLMMMMMMMNNNMMLLMMMMLLMNNNNNNMMMMMMMMMMONNMMMNNNNNMLLLLLLLLLLMMNMMLLMMNONNNOOPRV]_lmostvwxwtsrrstvxyz{}}}tgZTSSRRPNLMONOOOONMMOPPPOOOPNNOONNNOOOOONNNNOOOOOONNOOOOOOONONMMPQSTVUSPPPPPQQRTVY[\[ar{ zvuuuvvwyz}~~{toot{ ~~~}|{|}~~}}~}{zyzzxutqnljihhfeddddcbaa``abbbbbbbbaaa_^\[XVUTSTTSSTVY\^acfhkmkkjcZWVRQPOOOPPOOOOOOPPPPPPPPPPPOOOOOOOOPPOONNNMNNNNOOOPPOOOOOOONNOOPPPPPPPPOOONNOOOONNMOONNNOPPPPPPONNOPPONNNOOPPPPPONMOOOPPPPPPPPPPPOONMMNPPONMMMMNNOONNNNNNNNPPPPOOPPPPPPPOONPPOPPPONNNNNNNNNOPPPPPPOOOOOONNNONMMNOOOOPPQQPPPOONNOONNPPPPPPPPPOOPPQPPQPPPPPPPPPOOPPPQRQQQPPOONNOOPPPONNNNNNNNOOOONNOPOOOPPPQQPPONOOPPONNNNNNOOOOOPPQQPPPPPPPOOOOOOONNONNNNNOOPPPPPPPOOOPPPPPPPPPQQQQRQPPPPPPPQQRRQQQRPQQQQSSQPONMNOOOMMMNNNNNOOONMMNOPPPPPPPPNNOOOOPPOPQQPPQSIIJJJJJJHIIHGGIJIIIIIIIIJIIJJJJJHHHHIJJJJIIHHHHHJIIIIIIJJJIIIIIIHIIHGGGHIIJJJJJKHHIIIIJJJJJIIJJJJJHFFGHIHIIIIHGFGGHHGGGHIHGGHIHHJJJJJKKKKJJJJKKKKJJJJJJJIIHHHHHHJJJJJJJIJKLKJJJJJJJJJIJJKJJJJJIHHIIIIJJJJJJJKKKJHIIIJJJKJJJKLLLKJJJJJJJJJJJJJJJJKJJJKKKJIIIIIJJJJJKKJJJJJJJJJJKKLJJJJKKJJKKKKJJJJJJJLMMLKKKLLLLKJKKKKKKKLLKKKKKKJKKKJJJJJJJJJJJJJKKKKKKLKKKKKKKKLLKKLLKKKKKKKKKJLKKLLMLKJJJKKKKLKKJJJKLLMMNNNNMMLLLLLMMMNMLKJKLMLLMMLLLLLLLLLLLLNNMMLLKKKLMMMLMMNNNMLLLMMMMMMMNNLLLLMMMMNNNNMMLLLLMMLKKLMNNNNNNNNNNNNNOOONMLLMOPOOONMLLLMLLLLMMMNMMLLMMMONNNNNPRV]]mnottuvwxvtsrqtvxyz{}}{vl_XXUTRQONOQOOOOONMLOOOOOOOOLMNNNMMNOOOONNNNNNOOOONNOPPPPPPPMMMNPSVXYXVRQQRRTTUVY\^`_bt|~ }xxyzyyz||~~zxxz} ~~~}{{|~~~~{zzxusqnmljihfeccccba`_^^_```aa`_^]\]]]\[XVUUTUUTTUWY\^bdghjklkh`WUVRPPOOPPPOOOOOOOOPPPPPPPPPOOOOOOOOPPPOONNMNNNOOOPPOOOOOOOOOOPPPPPPPPPPOOOOPPPPOOOOOONNNOOPPQQPPOOOPPOONOOOPPPPPONMOOPPPPPPPPPPPOOOOOOOOOOONNMMMNOOPPOONNNNPPPPPPPPPPPPPOONPPPPPPPONNNNNNNOOOOOOPPPPPPOOOONOONNOPPPOPPQQPPPPPOOOOONPPPPPPPPQPOPQSQPQPPPPPPONNNOOPPQQQQPPPPONNNOPPPONNNNNNNMNOONMMNOOOOOPQQQQPPOPPPONNOOPPPPOOOOOPPQPQQPPPPNOOOOOONNOONNNNOOOOOOPPPPPPPPPPPPPPPQRRQQQPPPPPPPQQQQQQRRQQQPPRRRQPOOPPONMMMNNOOOOOONNNNOPPPPPQQQOPPPNMMNNPQPNMOQJJKKKJJIHIIIGGHJJJIIIIJJJJJJJJJJIIIIIIJJIHHHHHHHIIHHHHIIIJJJJJIIIIHIIIHHHHHHHHHHHHIHHHIJJJJJIJJJJJHGGHHHHHIIHHHGFGGHGHIIIGFGHIHGIJJJJIJJJJJJJJJJJJJIIIJJIIHHHGHHJJJJJJJJJKLKJIIJIJJJIHJJKJJJJJJIHHIJJJJJJJJJJKKKIIIIHIJKJJJKMMLLJJJJJJJJJJJJJKLLLKKKKKJJIIIIIJJJKKKKKJJJJJJJJKLLMKJJJKKKKKKKJJJJJJJJKLLLKKJJKKKLKKKKKKJJLLLLKKJJJKLLKJJJJJJJJJJJJKKKKKLLLLLKKLLLLLLLKKKKKKKKKKLLLLKKLLLLKKKKKKKKKKJJJKKKLMMNNMMLLLLLLMMNMLLKKKLMLMMMLKKKKKKKLLLLMMMMMLLKLLMMMLMMNNMMLLMONNMLLMMNMMMMMMMMNNMMMMMMLMMMLKKKMMNNNNNNOOOOOOOONMMMMNOPOOOOMLLMMMMMMMNNNNMLLLMMONNNNNPQV]\mpputuuvvvutrqtvxyz{}}~zvphb`ZVSQPPPPOOONNNMMNNNNNNNNLMNNMMMNOOOONNNNNNNNNNNNOOPPPPPPOOPPQUY\]\ZVUVVVXZ\^acfghhw}}~~}~~~}}~ ~~}}}}}~~|zz|}~}||{zsqnmlkhhgfddddcb__^^^_^]^^]\YWWWXYZZXWVVUVVUUVWY\_behiklllh_VUVRPPPPPPPPOOOOOOOOPPPPPPPPOOOOOOONOOOONNNNNNNOOOOOOOOOOOOOOOPPPPPPQPPPOOOOPPPPONNOOONOOOOOPPPPPOPPPPPOOOOOPPPPPOOOPPPPPPPPPPPPPPPPPPPPONOPPONMMMNOPPOOOOOOPPPPPPOONNNNNNNNPPOOOPPPNNOONNOOOONNNOOPOOOOOOOOPOOOOPPOPPPPPPPPPPOOPPONPPPPPOOOPPPPQRRQRQPPPPPOOONNOPPPPPPPPPPPNNNNOPPONNNNNNNMNOPOMMNOPPOOPPPPPPPPPPPPOOOOOPPQPPOOOPPPPPQPPPONOOPPPPPPPOOOOOOOOOOPPPPPPPPPPPPPPPPPPPQQPPPPQPPOPPPPQRQPQQQPPQRQPPPPPPONNMMNOPPOONNNNONNOOPPQRQQPPPOMMMNOPQPONOPJJJJJIHGGIJIHGHIJJJJJJJJJJJJJJIIJJIIIIIIHHHHHIIIHHHGGHHHHIJJJJIHJIIJJJJIJJIHHHHHGHHGGGHIJJJJIJJJJJHHIIHGHHHHHIIIFGHHHIJJIGFFHIIHIJLKJIIJJIIHIIHHIIGGGHIJJIIHHHHHIIIHHIIIIJKJIHHHHIJJHHIJJIIIJJJIHHIJJJJJKJJJJJJJJJJHGGIJJJJKLMLKJJJJJJJJJIIJJLMMKKKKKJJIJJJJJJKKKKKKKKJJJJJIJJLMNLJJKLLLJJJJKKKLJJJJKLLKKKJJJJKKKKKKKJJJLLLLLKJJJKLLLLKLJJJJJJJJJKKLKKLMLKKKKKLLKLMLJJJKLLKKLLMNLKKKKLLLLKKKJJJJKKKKKKKKLLMMMMLLLLLLLMMMKKKLLLLMMMNMLKJJLLLLLLKKLLLMMMLLKLMMLLLMNNNMLMOPPPNMLMNNOONNNNNMMMLLLMMMMNONMLLLLMMNNNNNOOOONNNMLMMMNNOOOOOONMMNNNNMNNOONNMLLLMMONNNNNOPU\[mqqvtuttuvvtsrtvxyz{|~~ytqkea[USRQPOONNNNNNNNNNNNNNNMMNNNNNNOOOONNNNMNNNNNNNNOOPPPPPPQRRSVZ]a`]YXYZZ\^bgloqstt} ~~~~~~~}}|||{{{|}|{zz{|}}~~{zxvtronmlighgffffdc`_^^__^]\\ZXVTSSQSUVVVVVSTUTTTVV\^behikliih_VTTPPPPPPPPPOPPPPPPPOPPPPPPPNNOOOONNNNNNNNNNNNNNOOOOOOOOOOOONOPPPPPPQQPPPOOOPPPOMMMNNNOOOONNOPPPPOPPOPPPPPOOPPOOOOPPPPPPPPPPPPPPPPPPPQQPNNOPPPNMLMNOPOONNNOOOPPPPOONKKLLMMMMPONMNOOONOOONNOPOONMMNOOOOOOOPPPOONNOOOOPPOOOPPPPPOOOOONPPPPOONNNOPPPQRSSRQQQPPPPPOONNOOOOPPPPPPMMMMNOOONNOOONNMNOPPNNOPPPOOPPPOPPPPPPPPPPNMMNPPPPPOOPPPOPPPPPONOOPPPPPQPPPOOOOOOOPPQPONQPPPPPPPPPPPPPQRPPPQQQPOPONOPQPPPQQPPQQPOPQQPONMONNNOPPONMMMNOONNOOPRRQPQPNMMNNNPPQQPPQRKJIIJJJIJJJJJJJJJJJJJJKLMJIHIIIHIIIJJJJIIIIHIJIHJJJJIIHGHIJJJJIHIIJJJIHGJJJHHHJJIIIHHHHIJJJJJJJJJJIHHIJJGHHHIIIIHHHIIJJJJIIJJIIJJJIHHIJJJIHHHHIJJJJIGGJKJJHGGHHIJIGGGHJJJJJJJJJJJJJJJIIIHHIJJJKKJJJJJJKKMLKJJJJKIIHHHIJJJKLLKJJJKKLKJJJJKLLLLLLKMLLLKKKKJJKJJJJJJJKLLKKKKKLKKKKKLKKKLMLKLLLMLLLKJJJJJJJJLKJJJJJJJKKKKJJJKKLKKJJKKLMMMMLLLLLKKKJJLLMMMMMNNNNMMMMMLMMMLKKKLKKKKLMMLLLKKJJJJJJJJJJJKKLLLLKKLLLLLLLLMMMMMMMMNNMMMNNONNNNMMLLLLLLMMMLKLLMMMMMMLLMMMMNMMMMNOPPPPONNMMNNNNNNOOPMLLLMMMMNNNNNMLKLLMNNNNNOOOOONNMMMMNNOOOONLLMNNMNNMNOPPOPONMNNMMLLMMNOPPU]Znsqtwuuuvwwvutttxzzz}~|wtrqpnf[SQQPPONMOOOOOONMMMMNNNOOONNNOPONNMMMNNNOONOOPOPPQRRSSTVWVVX\`ebabb`bdaeilnqtwyy{ }|zxz~ ~}}~~|{{{||}}}}|{zz{}|}~}|~~}{|ysrtpkihhhfhjmmba^^^\]^[\YVSRQPPQQSTUUUUTTTTSUVY_bfhhikljd_ZTRSQPPPPPPPPOOPPPPPPPPPPPPPPOOOONNNNOOOPPOOOPPONNOPPOOOOPPONNOOPPPPPPPOOPPPPRPPNNNOPOPPPPPPPPPPPPPPPPPONNOPPPPOOOPPPPPPPPPQQRPPOPPPPPPPPPPPOPPPPPPPOPPPPPPPPPPPOOOOONMLLMOPPPONNOPOOPPNNNOPPPOONNOOPPPOOOOOOPPPPPPPPPOOOPPPOPPPOOONNPPPPPOOOPPPPPPPPQQQPPPPPPOOOPPPPPPPPQQQQNNNOOPPPOOOOPONMPONNPPPPPPPPONNOOOOPPPPPPONNOOOOPPPPPPPPPPPPPPOOPPQPPPQQPPPQPONOMOPPPONMPPPPPPPPQPOOPPQQQPPPPPPONNNOPPPPPPPPPOOOPPQQPPPPPPPPPPOOOOOOOONMNOPPPPPPOONMLMOPPPQQQRRSKJIIJJJIJJJJJJKLKJJJIJJJLJHHHIHGIIJJIIIIJIHHJLKJJJJJJIHHHHIJJJIIIJJJJIHGIIIIHHJJHHIIIIHGJJJJJJJJJJIHHHIJJJJJIHHGFGGHIIJJJJIJJIIJJIHHHIJJJJIHHIIJJJJIHHJKKJIHGHHIIIHHHIJJJJJJJJJJKJJJJJIIHHHIJJJJJJJJJJJJJJJJJJIIJJIIIJJJJJKKJJJJJJKKJJJKJJKKKKKKMLLLLKKKJJJJJJJJJJJKKKKKKKLLKKKKKJJKLLLKLLLKKKKKJJJJJJJJKKJJJJJJKKKKKKJJKKLKKJKKKLMMMMMLMMLLLKKKLMMMLLLMMMMMMLLLLLMMLKKKKKKKKLLMLLLLLKJJJJKKKKKLKKKKKKLLMMMLLLKKLLLLLLLMNNNNNNMMMMNNNMMMLLLLMMMLLLLMLLLLMLLMNMMNNMMMNNOOPONNMMNNOONNNNNOMLLLMMMLMMNNNMMMMMNNNNNNOOOOONNNNMMMMMMMMLKLMMMMNMMNOOOOONMMNNNMLLMMNOPPU\Znutvwuuuuvvuttttxzyz||}yuttsqj_VPPPPPONOOONOONNNNNOOPPPONNOPPPPOOONNNOPPPPPPSVWXVVVWVWXXWX\]deffdcegjnpqpruxzz} |zzxvx{}|} }||}~~}~}|{zzz||}}~}|||}}}~~||}~}|}{xvupljjhihlnqpfa^^^[[\ZYWTRQQPOPPRSTTSRRRRRRTVY`bfhiiklh`[WTSSPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOONOOPPPPOOPPOOOOOPOOOPPPONOPPPPPPPPPOOPPPPPPONNNOPOPPPPOOPPPPPPPPPPPONNOOPPPPOOOOOOOPPPQQQPPONOPPOPPPPOOPPPPPQQQPPPPPPPPPPNOPPPPONNNMMNOPPONNNOOOOPOMLMNOPPPOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOONNNOPPPPOOPPPPPPPPQQQQQPPPPPOOOPPPOPPPPPQQPNNNNNNNOOOOOPPPPOPPPPPPPQQQPPOOOOPPQRQQPPPPOPPPOOPPPPPPPPPPPPPPOPPPPPPPPPOPPPPPPNOPPONNNPPPQQQQPPPNNOPPPQPPQQPPOMNOPOOPPPPPPPPOONOPPPPPPQPPPPPOOPPOOPPPPOPPPPPPPQQPNMNOPOPPPPPQRKJIHIJIIJJJJJJLLKKJJIIIIKJHGGGFFGHIJIIIJKJHHJMLJIJJJJJIIGHIJJJIIIIIIIHGGGHIIIIIJGHJJJJHGJJJJJJJJJJJIIIIJJKKJJIHGGHHIJJKKKJJJJIIJIIHHIIIIJJJIIIJJJJJJIIJKKJJHHHIIIIIIIJJJJJJKKKKKKKJJJJIIHHHIIIJJJJJJJIIHJJJJJIHHJJJJJJJKJJKJJJJJJJJJJJKLJJJJKKJJKKKKKJJJJJJJJJJJJJJJJJJJKKKLLKKJJJKLLLLKLKKJJJJJJJJJJJJJJJJJJJJKKKKKKJJJKKLKKKKLLLMMNMMMMMMLLLLLMMMMLKLLLLLMMLLKLLMLLKKKKKJJJKLLLLLLLKKJJJKKKKLMKKJKKLLMNNMLLKJJLLKJJKLLMNNNNMLLMMMNNNNMLLLMMMMLMLLLKKKKLKLMNMNONNNMMMNNNNMMMMNNOOOONNNMMMLMMMMLMMMMMNNONNNNNNNMNNOOOONNNNMMMLLLKKKLMMMMONNOPPPPONMNNOOOMMMMNOPPTYYmwwxwwwvvvvvuuttwxwxz{~{xvvvuri`VQPQQPOOOONONNOOOOOPOOONNNOPPPPOOONNNOPQRQRRTX\\YWXZaaa`____chmmkklmsvxvttwy{| }zwwuttwyzz|~ }{|}~~}||zyzxxz||}~~~~~~}}~~~~}{xsnmlillpsttib`_^ZYZYVURQQPPOMOPQRQPOPPPPPSWZ_beghhhidZUUTSRPPPPPPPPPQQPPOOOOPPPPPPPPPOOOOOOOOPPPPPPOPPPPOOOONOPPOOOOPPPPPPPPPONNOOPOOOOOOOOONOPPOOOOPPPPPPPPPPOOONNOPPPPOONNOOOPPQQRPPOOOOOOPPOOOOPPPPPQQQQQPPPPPPPPOPPPPOONONNOPPPPONNNOPPPPNLKLNOPPPPPPPPPPPPPPPPPQQQPPPPPPPOPPPPOOOOONNNNOPPPPPPPPPPPPPPPPPPPPONNOOOPPPPOPOOPPPPPNNMMMMMMOONOPPPPNPPPONOPQQQPPONOOPQRSRQPQPPPPPPOOOPPPPPPPPPPPPPPOPPPPPOPOOPPPPPPNOPOMMMOPPPPQQQQPONNOPPOPPQQQPPNKNPPONOPPONOPPPONOPPPPPPPPPPPOOOPPNNOPQRPPPPPPPPRQPOOOOOOOPPOOPPJIHHHIHHIJJJJJJJKKJJJJJJJIHGGGFEEGIIIIJKKKJIJJJHIIJJJJJIHHIIIIIHHHHHHHHHGHIJJJIHHIJKKJIGHIIIIIJJJJJJJJJJJJJJJJJIHIIJJKKLLJJJJIIIIIIIIIIIJJJJJJJJJKKKJJJKKJJIIIJJIIIIIJJJJJJJJJJJJJJJJIIHHIIIIIJJJJJJJJIIJJJJJJIIJJJJJJJJJJJJJJJJKKKJJJJKJJJJJJJJJJJJJJJJIJJJJJJJJJJJJJJKKKKLLLKJJJKLMMLKKLLKKJJJJJJJKKJJJJJJJJKKJKKKJJJJKKLKKKLMMMMMMNMMMMMLLLLLMMLLLKKKKKLMMLKKLLLLLKKKJJJJJKKKKKKKKKJJJJKKKKLLKKKKKLMNNNMMLKKKLKJJJKLLLMMMMMLLMMNNNNMMLLMMMMMMMLKKKKKLLLLNNMMNNNMMMMMMNNMMMMMNNNOOONNMNMMMMMMLLLLLMNOPOOOONNNMNNOOOONNMMNMLLLMLMMNNNNMNNNOPPPPOONNOPPOMMNNNOPPSWYiuvwvyxxwwwwwvuuvwvwx{}|zyxxvskaYUSSQPPPOOOOOOOOOOPNNNMNOPPPPPPOONNOPRTVVVVY^cfffghhgfecb_]cjqrrttsvz{zwwyz{|~ }~}yttsrrtuwyz|~~~}|}}~}{{zzwxwxyz{~ ~~~zwtonmnosuwvlea_]ZYYWTSRRQQPOMNNOONMMMNOOPSW[]_bdddde_VQTTRRQPPPPPPPPPPPONNOOPPPPPPPPPPPPOOOOPPPPPPPPPPPPPOONNOPPOOOPQPPPOOPPONMMNNNNOOOOOOOONOPPOOOOOOOOOPPPPPPPOONNOOPPPONNOOPPPPQQPPPPPPPPPPONNOPPOPPPPPPPOPPPPQQRQPPNMNOOOOOPPPPPOOOOPPPPPOLKLNPPQPPPPPPPOOOPPPPPRQQQPPPPOONOOOONOOOOOOOOOOPPPPPPPPPPPPPPOPPPPONMOOOPPPPOOOOOPPPPNNNMMMMNPONNNOOONOONNMNOPPPPONNOPPPQQQPPPPPPPPPPOPPPPPPPPPPPPPPPNOPPPONNOOPQQPNNNPPPNMMOOOPPPPPPPOOOPPPOPPPQQPONLMOPOOOOPPOOPPPPPPPPPOOOOOPPOOOOPNMMNPPPPPPPPPPPPONNOPPOOPPONNNOJJIHIIIIIJJKKJIHJJJJJJJJJJJIHHGGFHIIIIJJJLMKJIHGHHIJJJIIHHIIIHGGHHHIIIJJHIJJJJIGIJJJJJIHHHIIIIJJJKKKKJJJIIJJJJJJHHIIJJJKLKJKJIIJIIJJJIIIJJJJJJKLJKKKKKKKJJJIJJJKJJJJJJIIJJJJJJJJJJJJJJIIIIJJJJJJJJJKKJJJKJJJJJJJJJJJJJJJKJJJJJJJKKKJJJKLKKKKJJJJJJJJJJJJJJJJJJJJKJJJJJKKKKKLLLKJJJKKLKKKKLMMMKJJJJJKKKKKJJJJKKKLKKKKKKJJKKLKKKLMMLLLMNMMLLLLLLLLLLLLLLLLKLLMMMLKKKLLLLKKJJJJJKKKKKKLKKKKKLLKJJKLLLLKLMNONNMMLLLLMLJJKLLLLKKKLLMMMNNNNMLLLMMMMMMMLLKKKLLMMLMNNMLMMMMMNNNNNNNMMMMMMMNOOONNNMMMMMMLLLMLLMOPPOOONNNNNNOOOONNMMNNMMMNNNOOONMMMMMMNOOOPONNOOONNNNNNOOPSV\hssuwyxxwvvwwvuuvvvvwz} }zywvtqjc^[YVUSRPOOOPPPOOPPPPPPPPPPPPPPPPPPPRVX[\^`aekptwxyvutsrolihnsuwzxuwz}|zzz{{z{~~}~~}||}ytpoooqrtvyz~}}}~||~~}{{{zxvvwxyz~}~zsoorruxyynha\\ZYXUTSSSSRQPONLKJKKLKLNOPSVY\]_aba``\TRTRPQQPPPPPPPPPPONNOPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPONOPPPOOOPPPPOOOOPPONMNOOOOPPPPOONOOPPPOOPNNOOPPPQPPPPPONNNOOPPPPOPPPPPPPPPPPPPPPPPPONNOPPPPPPPOOOPPPPPPPPPPONMNOPPPPPPPPOOOPPPPPQQPMLMOPQPPPPPPPPOOOPPPPPQQQQPPPPOONOOOONPPPPPPPPOOOPPPPPPPPPPPPOOOPPPPONOOOPPPPOOONOPPPPOONNOOOOPONNNOOOPNMMNOOONOOOOOOPPPPPPPOOPPOPPQPPPPPPPPPPOPPPPPPPNOPPONNMMNPRRPNMNPPPONNOPPPPPPPPPOOOOPOOOPPPPONMMMMOPPONPPQPPPQSQQQPPPOONOPPPOPPPOOOPPPOPPPPOPPPONNOPPPONOOONNOPKJJJJJJJIJKLKJIHIIIIJJJJKKKJJJIIIIIIIIHHILNMJIIIGHIJJJIIHHHHHHGGHIJJJJJJIIJJJJIHIIIIIIHHHIJJJJJKJJJJJJJJJJIIIIIIHIIJJKKLLJJKKJJJJJJJJIIIJJJJJKKLJJJJJKKKJJJJJJKKLLKKJJJJJJJKKKKKJJJKKJJJJJJJJJJJJJJKKKKKKKJJJJJJLLLKKKKKKJJJJJJJJJJJJJLMLLLKKJJJJJJJJJJJJJJJJJJJKJJJJKKKKKKLLLKJIJJJJJJJKLMMMLJJJJJKLLLKKKKKKKKKKKLLLLLLKKKKJKLLMLKKLMMLKKKLLLLLLLKLLLLLLLMMMLLLKKKKLLKKKKKKKKKKLLLLLLLLMMMLKKLMMMMLMMNNNMMLLLMMMLKKLMLKKKJJKLMNNNNNNMLKLLMMMMMMLLLLLLMMNMMNNLLLLLMNNNOONNNNNMMMMMNNNNNNNMMMMNMMMMMMLMNPOOONNNNNNNOOOONNMNNNMMMNNOONNMMMONNOPPPPONMMMNMMOONNOOOPTW^fqqtvvvvvvuvwwvvvvvvwz{~}zxwtsromkea\WTPPPPPPPPPQRTTSSRRQPQQQQQQRRTVY]aeilnosx|~{zzzzwtqprtwz{zwz|~}}|||{{|||~~}}}||}}~|zywy{~~|ysommnnortwy}~}}}~||~~|ztuvxy{ ~}~ ~tsrttyz||rg^ZZYXWTTTTTTSSRPOKIHJKLJMOPRTVX\\^__^\\XTSSPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOPPPPPPOPPPPPPOOOPPPPOPPPPPOOOOPPPOOOPPPPPPPPOONOPPPPOPPNNOOPPQQQQPPPONNNNOOPPPPPPPPPPPPOPPPPPOOPONNNOOPPQQQPOOPPPPPPOOOMNOOPPPPPPOPPPPOPPPPPPQQQPNMNPPQPPPPPPPPPPPPQQQQQQPPPPPPPPOPPPPOPPPPPPPPPPOOPPPPPPPPPPOOOPPPPPPPOOOPPPPOONNOPPPPPPOOPPPPOONOPPPPPONNOPPPNOPPPPPPQQPPOOOOPPPPQRRQPPPPPPPPPPPPPPPOOPPPONMMLLOQQPOONPPPPPOOPPQQQQQPOONNNONNOPPPONNNOMMNPPPNPQQPOOPSPPPPPQPPOPQQPPPPPPQRRRPPPPPPPPPOOPPPPPPOMMNOOPQRKKJJJJJJJJKLLKJJJJJJJJIIJJJJJJIIJIIIJJIHIKMKJJIIGHJJJJIIGGGHHHHHHIJJJJJJIIIIJJIIIIIIIIHHHIJJJJJKJJIIIIIIJJIHGGHHHIIJKLMNKJJKKJJJJJIIIIIIJJJJJJKKJJJJJJJJJJJJJJJKLLKJJJJJJJJKKKKJIIJJKKJJIIIIJJJJJJJJJJKKKKKKJJKKMMLLLKKKKJJJJJJJIJJJJKLMKLLLKKJJJJJJKKKKJJJJJJJJJJJKKKKKKKKLMLKJJJJJIIIJKKKKKKJJJJKLLKKKKKKKKKJJJJKLLLLLKLKKJJKLMKJJKLLLKKKLLLLLMLLLLLLKMMLLLLLLKKKKLLKJKKKKKKKKKLLLMMLLLLLKKKLMNNMMMMMMNMLLKKLLMLKLMMLKKKKKLLMMMMNONNMLKLMMMLMMLMMMMMMMMLMNNMLMLMMNNOOOMMNNNNNNNNNNNNNNNMMMNNNMMNNNLLMONNNNNNOOOOOOONNNMNONMLMNNNNNMMMNPOOPPPPPNMMMNNNNOOOOOOOPTV`eqpqttuuvuuvvwwvvvvwwz{~}{yvuvxxwtmc[UPPPPQQQQRUVXXXXXWVUTTSSTUVVXZ]bhnty|}~ ~|xwxz}}{{}~~~~~~~~}|}~~{zyyyyzzz|~}|zwutrtz~}}|zuqnmllmptuw{~}|}~~}~ {uuvy| }}}~ ~tutvw{|}|rf]YYXWVUUUUUTTSSRPKIHIJLLORUVVVW\\]^]\ZYVTSRPPQOPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOPPPPOOPPPPPPPPPOOOOPOOOOPPPPPPPPOOPPPPOOPPPOOOOPPPPOPPOOOPPPPQQQPPOONNNNNNOPPPPPPPPPPPOPPPPOOOONNNNOOOPQRQPPPPPPPPPOOOMNOPPPOOPPOOOPPOPPQQPPPQPPNMNOPPPPPPPPPPPPQQQPPPPPPPPPPPPPPPPPPPPPPPPPPQPPOOPPPOPPPPPPPPPPPPPPPPPOOOPPPOOONOPPPPPPPPPPPPOOOOPPPPPPPPPPPONOPPPPPPPPPPPOOOPPPPQRQQPPPPPPPPPPPPPPPOPPPPNNNNMMNOPPPPPPPPPPPOPPQQQRRRPONMNNONPPPPNNNOONMNOPPPPPPONNPQOOOPPQQQPQSRPPPPQQQRSRQPPPPPPPPOOPQQQPOOMNNOPPRTJJJJIIJJLLLLLLLMKKJJJIIIIJJJJIHHIHGIJKJIJJKJIIHGHIJJJJJIFFGGHHHIHHIJJIHGIHGHIJJJIJJJJJIHGHIIJJJKJIIIHIIIJIHGFGHIFFHIJLMNJJJLLJJKJIIHHHIIJJJJJJJJJJIIIJJJJJJJJJJJKJJIIIIJIIJJJJJJFGHJJJJJHHHIIIJJJJJJJJJJKLLMLLKKMLLLKKJJKJJJJJJJJJKKJJKKKKKKKKKKJJJJJKKKKJJJJKJJJJJKKKJJKKKLMMKJJJJJIIJJLKJJJJJKKKLLLKJJKKKKJJJJJJJJKKKKLLKJJJKLMKJJKLLKKKKLLLMMNMLLLLKJMMLLKKKKKKJKLLKJLLLLLLLLKKKLLLLLJKKJJKLMNNNMMMLLNMLKKKKKMLKLNNLJKLLMMMLLLMNNONMMKLMMLLLMMMNNNMLLLLMNNMMMMMNNOONNLLMMNNNOOONMMMNNMMMMNNNMMOONLKLNNNMNNNOOOOOOONNMNOONLKLMNNONMMNPNMMNOPOONNMNOOPOOOOOOOOPRT_cpooqttvvvvvwwwvvvwwxz|~|zwvxzzzuh]UPPQQRRRRTWZ\\]^_^]\XXWWXY[\\]aflt{ }}zz~~~}}~}}|~}zwvtuvwwwz|~}{zzxutrmnv}}}|{xsonlklostvz}}||}~~~ |xvw{ }}} {rvtxy}}|znd\YYWVWVVVUUTTSSRPLIHIJLOQVXYXXX[\\]\[XVTSRPOQQMOPPPPPPOPPPPPPPPPPPPPPPPPPOOOOOOOOOPPOOOPPPPPPPPPNNNOOONOOPPPPPPPPONOOOONNOOOOOOOPPPPOOPPPPPPPPPRQPPONNNNNNNNOPPPPPPPPPPOPPPPPOONNNNOOOOPPQQPPPPOOPPPPPPPPOONNNNPPONNOOOPPQQPPPPPONMNOOOPPPPPPPPPPPPPPPPPPPPPPPOPOOOPPPOPPPPPPQQQPPOPPPOPOOOOPPPOOONNNNNPOOOPPPPOOOOPPPPPPPPOOOOOOOOPONMNPQQPONMNOOOOOOPNNOPPOONPOPPPPPPPPPPPPPPPPPPPPPOPPPPNNNNPOMNNNPQPONOPPPPOPPPQRRRPPNNNOOPPPPONNNOOOONNOPPPPONMMOPONNOPPPPQRSRPOOOPPPQRQQPPPPPQQPOMOQRQPOOOOOOPPQRLKJJIIHHKKLLKJJJKJJJIIIJJJJJJIHHGGHHJJLMKLLJJJJIIJJJHGGHFGHHHHIJJJJJJJJIIIHHHIIJJIIJKKJHHIIIIIIIHHGGHHHHJIGFGHJJIHGGIJLMJJJJJJKKJJJJJJJJKJJJJKLLJJIHHIJKKKKKKJJJLKJJJJJJJJJJKKJJJJJJKLKJJJJJJJJIJJJJJJJJJKLLKKLMLLKKKKKJJJJJJJKKIIJJJKMNKKKKLLKKKKKKKKLLKKKKKJJJKKKKJJJJKKLMLLLLLKJIHIJLMLJJJJKLKKKLMLKJKKKKLLKJJJJJKMMLLMLKJJKLKKKKKKKKLKKLLKKLMMMLLLKKKLLLLKJJJKLLKKLMNNNMLKJJLLLKJJJKJKLMLLMNMMMLLLLLMLLKJIKNNMLLLMMMLLMMMMMMMMNNNMLLLMNMMLMNPOONNNOOOONNMMMMNNOOONMMMMMMMMMMNMMMMMMNMMMMMNNOOONNNMMMNNNMMMMMOOOONNNOOOOOONNMONMMNOOOMMMMNNNNNNNOOOONOOOOOOOORU[bhlossstuwxxxxwwvuvwxxz}}zxxz~}wc\VSQTSUWZ[]aegebbehiebabca__bhihnz ~{xustuvvvy{||zyxwtrpopuxyz}}|zvrnnnoqsuy~}zyz| {{| ~~ ~zzz|}}~|uma\\]ZXYZYYWVUTRPPOJJKJIKQW\\\\\[\\\[ZXVTRRQPPPQQPPPPPOOOPPPPPPPPQPPPPPPPPPPPPPPPPPPPOONNPPOOOOPPPPONNOPPPPPPPPPPQPPOOOOOPPOOPPONPPPPPPPPQPPPPPPPQPPPPPPPONNNNOOOPPOOPPQQOPPPPPPONNOOONOOQPPPPPPQQPPPPQPPOPQPONNONOONNNOPQQQQPPOOPPPNLLMOOPPPPPQRRQPPPPPOPPPPPPOOPPPPPPNMOPPPPQQQRQPPPPPONNNNOPPQPPONOONNNNNOPPPPPPPPPPPPRQPPOOPPOPPPPONNNPQQPOPPPPOPPPPPPPPPOOOPPOOPPOOPPPPPQQPOPPPPOOPPOPPPOOPPPPQQQPPPRPNNPPPPRQPPPPPQPPPOOPPPPPPPPPPQPPNOPPPPPOONOOONPONNOPPPPQSSQPOOPQRRRQPPPPOOPPQQPPPPPPPPPPPPQRSSJJJJIIHHJJKKLKJJJJJJJJJJJJJIHGGHGGHHIJJKJKJJIJIHGHIIHHHHHHHGGGIJJJJJJKJIIIHHHIJJIIIJJJJIIIJJIIIIIHGGHIIHIIHGGHJJIHHHJKLMKKJJJJJJJJJJJJJJJJJKKLMMJJJJIIJKLKKKKKKKKJJJJJJJJJJJKKKJJJJJKKJJJJJJJIIIJJJJJJJJJKKKKJKLJJJJJJJJJJJJJJJJIJJJJJKKKKKKKKKKJJJKKKKKJJJJJJJJKKKKJJJJKKJKLMLKJJJIIJKLLLKKJJJJJJKLMMLKKKKLMLLKKJJJKLLLLLLKJJJKLLLLLLLLLLLMMLLLLLLLLKKKKKKKKJJJJKLLKKLLNMMMLKKJKKKKJJJKLMNNMMMNKKKKKKKKLLKLKJKNNMLLMMMLLLMMMMMLMMMMMLLLLLMMMMNNOONNNNOOONNNNNNONNNNNMMLMMMMNNNNNNNNNNNNNNMMMNNNOOOONNNNMMMMMMMMNOOONNNNOOOOOONNOONNOOONMMMMNNNNNNNNOOONNNOOOOOOPTVY_gnoqstvvvvwxxxwwwxyzz|~}{zz~qcVPQVVX\]`dhqtvttuvupmjlnpppostru~ }zyuttuttvz{|{zywussqqtwxz}}}{ytqoorstwz~|zyz} ~~~~yqfb`_\[\[\ZVUUSQPOOKJKKOU[`ddba^\[ZYWVTSSRQQPPPPPPPPPPOOOPPPPPPPQQPPPPPPPPPPPPPPPNNNNNOOOPPOOOOPPPONNMNOOPPPPPPPPPPPPPPPPPPOPPPONPPPPPPPPPPOOOOPPPPPPPPPPONNNOOOOPPOOPPQQPPPPPPPOOOOOPPPPPPPPPPPPPPOOPPPPNPPPONNOOPPONNOOPPPPOOONMNONLLNOOPPPPPQRRQPPPPPOPPOOOOPPPPPPPPONOPPPQQRRQPPPPPPPNNNNOPPPQPPPPPPOONOOPQPPPPPPPPOOPPPOOOOPPPPOOOOOOPPPPOPPPPPPPPPPPPPPPOPPPPOPPOOOPPPPQPPOOOPPONOOOPPPOOOPPPQPPPPPPPNNPPPPQPPPPPPPPPPPPPPPOOOOPPQRPPOPPQPPOOOPPPPPNNNOPPPOPRSTRQPOPPQRSRQQPONNOPQQPPPPPPPOPPPPQQRSGHIJJIHGGHJKLLKKJJJJJJJJKJJHFFFGFGGHIIIIJJJHHHHGFGHIIHHHJIHGFFHIJJJJJKJIIIHGGIJJIIIJJJIIJJJJJIIIIHHHIIIIIIHHIIJJJIIJJKLLKKKJJJJJJJJJIIJJJJJKKLLLKKKJJJJJKKKKKKKKJJJJJJJJJIIJJKKKKKJJJJJIJJJIIHHHJJJJJJJJJJJJJJJJJJJJKKKKJJJJJJJJJJKKKJJJJJJJJJJJJJJKKKKKJJJJJJJJKKKKJJJJLJJJLMLKJJJJJJJKKKLLKJJIJJJKMMMLKKKLLLKJKJJJJKKLLLLKJJJKLLLMMMMMMLLNNLLMLKKKKKKKKKJJJJJJKKLKKKKLLLMMLLLKJJKJJJKLMNNNMMMMLLLLLLLLLKKLLLLNMMLMMMLKLLMMMLLLMLLKKLLLKLMMMMNOOONNNNOONNNNOOPPNNNMMMMMMMNNNNNNNNNMMNNNONNNNNNNOOOOOOOOLLLLMMNNMNOONMMMOOOOOONNOONOOONMMMMMMNNNNNNOPPPONNNOOOPPPSSQVahjnruwwvwxyzzzyyyyzzz{~}{{}~}qeWTVY\^bdhnsx}~}|xtqpu{~}}~}|| }|xutssstvz{|{zzxvusrtvvy{|}}zvsqqrtuwz}~~|zyz} |xmjhgdeebb]YXVTPPLPPNPRZchnqpmhb]\\[XVTSSQQQPPPPPPPPPPPPOPPPPPPPQPPPPPPPPPPPOOOPPMMMMNNOPPPPPPPPPNNNNNNOOPPPPPOPPPPPPPQQQPPPPPPONPPPPPPPPOOONNOOPPPPPPPPPPPOOPOONOOPPPPQQPPPPPPPPPPOPPPPPPPPPPPPPPPOOPPPPMOPPPPPPPPPPOONNONNNNNOOMNOONNNOOOPPPPQQRQPPPPPPOONNOOPPQPPPPPPOPPPQQRRRPPPPPPPPNNNNOOPPQPPPPPPPONNOPPPPPPPPPPONOPPPOOOPPPONNNOOOPPPONOPPPPPPPPPPPPPPOOPPPOPPNNOPPPPPPPONOPPONNNNOPPONOPPPPONNNOOOOOPPPPPPPPPPPPQPPPPPPPONNOOPPQOOOPPQPPOOPPQQPPMNNOPPPOPQSTSQPONOPQRRRQPPOOOPPOPPPPPPPOOOOPPPQQEGHJJJIHFGIJLLKKIJJJKKJJKKJIGFGGEFGHHIHHJIIHGHHGGHIIIIIIJJIHGGGHJJJJJKJJJIHGGIJKJJJJIIIIJJJJJIIIIHHHIIIIIIIJJJJJIIIJKKKKJJJJJJJJIJJIHHHHHIJJJJJJJJJJJJJJJJJJJJKKHIJJJJJJIIHIJKKLLLKKJJJIJJJIIIIIJJJJJJJKIJJJJJJJKJKKKLLLJJJJJJJJKKLLKJJJJJJJJJJJJJKLLKJJIIJJJJJJKKKKJJJJLKJJJKKJKKKJJIIJJKKKKJJIJJJJLLLKJJJKKKJJJJIIJKLMMMLKKJKKLLLMMMMMLKLMMLKLKKKKKKKKKKJJJJJJKKLKKKKKKLLLMMMMKKKKKKLLLMMMLLLLMMMMMMMMMLLMNMLMMMMMMMLKLLLLLLLLMLLLLLLLLLMMMMNNNNNMMNNONNNNNOOPPONMMMNNMMMMNNNNMMMLLMMMNNNNNNNNMNNNNNNNMMMMMMNNLMNONMMMNNNNNNNNONNOOONMMMMMMNNNNNNOPPPPNNOOOOOOOQQQU\bflotuvwyzzz{{zzzz{zzz{}~|{{|{{rneaa]afhjntyy}}}}}{zusv} zvsrrstuxz}}}}|{zwuvwwxzz|~|xtrqrtuxz|}}zzyz~ }ttuututnjd_\WRPPKTYYY\eouxzzwrha\[YVUSQPQQQQQPPPPPPPPPPOPPPPPPPQPPPPPPPPPPONNNNONMMMMNOPPPPPPPPPOOOOPPPPPPPPPOOOPPQQRRRQPPPPPPONPPPPPPPOPOOOOOPPPPPPPPPPQQPPPONLNOPPPPQQQPPPPPPPPPOPPQPPPPPPPPPPPPPPPPPQOPQQQPPPOOPPPOONPOOOOOPPOPQQPONNNOPPPPQQRQPPPPPPPPONNOPPQPPPPPPPPPQQRRRRPPPPPPPONNNNOOPPPPOOOOOONNNNNOOOOPPPPOOOOPPPPOOOPPOONNOONOONMMOPPPPPPPPPPPPPOOOOPNNOONNOPPPPPPPPOOPPPOONNOOONNNONNNNMMNONPPPPPPQQPPPPPPQQQQPPPOOPOOOOOOOONNOPPPPOPPPQQPPONNOPPPOPPRSRQPNNOPRRRRQQQQPPOMLONNOPPONOOOOPPPPFGHJJJIIGHIJKKKJJJJJJJJJJJJJHGGGEEFHHIIIJIIHHHIIJJJJJJIIJJIIIHGGJJJJJKJJJIHHHIJKJJJJIIIIJJJJJIIIIHHIIJIIIJJJJJJJIIIJJKJJJJJJJJJJHIIIHGGHHHJJJJIHJJJJJJJJJJJJJJJJHIIJJJJIHHGHJJKKLLLKKJJJJJJJJJJJJJKKJJJKIIIJJJKKJJKJJJJKJJJJJJKKKLKKJJJKJJJJIIJJKLLMLKJJIIJJJJJKKKKKJJJJLLLJJIJJJJKKJJIIJJJJJJJJJJJKLLLLKJJKKKJJJJJJJKLMMMLKKKKKKKLLLLLLKKKLLKKKLLLLLLLLLKJJJJJJKLLLLKKJKKLLMMMMMMLLLLLLKKKLLLKKLLLLMMMMNMMNOMLLMMMMMMLKKKLLLLLLLMMNNMMLMMMMMMMMNMMMMNNOONNNNNOOPPNMMMNNMMMMMMMNMMLLLLMMMMNNNOOOMMMMNNNNNNMMMNNNLMNNNMMMNNNNNNNNNNNOPPONMMMMMNNNNNNOPPPOOOOOOONNPOPSVY_eknqrtwyyz{}~~}}}}~~}{{}~}|{{~ |}yyofabhmnoquzz}}}~}zz {vttttuz|~~}{zzzzzzz{~}zusrrtvz|~~zyyz~ {vph`WQQUWdnnnnt{{}}}}yndb]XVVVTRPPPPPPPPPPQPPPPOOPPPOOPPPPPPPPPPPPOONOOOOONMNNOPPPPQQPPPOOPPPPPPPPPPPOOOPPPQQQQPPPPPPPPOPPPPPPPOPOOOOOOPOOPPPPPPQQPPPPONNOPPPPQQQPPPPPPPPONOPQPOPPPPPPPPPPPPPPPPPPQQQPPPOOPPPPPPPPPOOPPPPPQQQPOOOPPPPPPPQPPPPPPPQPPONOPPQPPPPPQPRRRRQQPPPPPPPOONOOOOOOPPOOOOOOOPONNMMNNONOOOOPOOOPPPPONNOOOOOONNOOONNNOPPPPPPPPPPPPPPPOONMMOONOPPPPPPPPPOOPPPOONNNNNNNNNMMMMMMNPOPQRQQQRQQQPPQQRQQQPPPOOPOOOOOOOPONNOPQQPPPPPQSSPPONOOOOPPQRRPPNPPRSSSRRPQSSQPMLNNNOPPPOPPPPPPPPGHIJJJJJHIIJJJJJJJJJJJJJIJJIHGFFFFGHHIIIJIIIIIJJLKJJJJIIIIIJJIHGIJJJJKJJJJIIIJJKKKJJJJJJJJJJJIIIIIIIJJJIJJJKKJJIHHHIJJJJJJJJJIHHHIJIHHHHHIJJJJIHJJJJKLKKJJJJJJKKIIIJJIIIHHGHJJJJKKKKJJKKJJJJJJKKJJKKJJJKIIIJJKKKKKLKKKKKJJKKKKKKKKKJIIJJJJJJIIJKLLLLLKJJJJJJJJKKKKKKJJJJKMMKJHIJHIJJJJJKJJJJJKKKLLKLLMMMLLKLLLKJKLLKKKLLLKJJJKKJJKKLLLLKKJJKKJJKLLLLLLLKLLKKKKKKLLLLLLKJKKLLMMMMNMLLMMMLJJJKLLLKMMMMNNNNNMNONMLLNMMMMMLKKKLLLLLLLMNOONMLNMMMMMMLMMMLMMNNOOONNNNNPONMLLMMMMMMMMMMMMMMMMMMMMMNNOOOMMNNNNNNNNNNNNNNMNNNNMNONNNNNNNNNNNNOPONMMMMMMMMMMMNNONNPPOOONNNOLMQTV]fmorrtwyx{}}{|~}}~~||~|yxphehnrtstvy{} ~}}~~}}~ |zzxxx}~}{zzzyyz|~~{wtrqsvz}}~zyy{ tg\X\``nyzxvwz~~~~zrif_XUVWVTRQPPPPPPPQQQPPPPOOPOOOPPPPQQPPPPPPPPPPPPPPOOOOOPPPPQQPPPOOOPPPOOOPPPPOOOPPPPPPPPPPPPPPPOPPPPPPPPOOOOOOOOOOPPPPPPPPPPPQPPOOOPQQQPPPPPPPPPPONOPPPOPPPPPPPPOOOOOOPPPPPPPOOOPPPPQQQPPPPPPPPPOOPPPPPPOPPPPPPPPPOOOPPPQPPOOOPPPPPPQQQQRRRQQPPPPPPPOONNOOOOOOOPOOPOOOPPPPONMNOPNOOOOOPPOOPONMMMNNOPPONNPPPPPPPPPQQQQPPPQPPPPPPPNMMOOOOPPPPPPPPPOOOOOOONNOOONNNOMNNNNOOPPPRRQQQRQQQPPQQRQQPPPPOOOOOOOOPPPPOOPPQRPPPPQSVVRPONNOPPPPPQQQPOPPQRRQPPOPRSSQPPOOOPPQPPSSSSSSRRJIIIIIJJIIIJJJJKJJJJJJJJJJJIGFFFHHHHHIIJJIHIIIJLMKJIIIIIHHHIIJIIIIIIJJJIJJJJJJJJKJIIJJJJJJKJJIIJJJJJJJJJJKKKKJJIGGGHJJJJJJJIIHHHHIIIHHHHHIJJKJJJJJJJJKKKJJJJJJJJJJJIIIIIHHHIJJJJJJJJJJJKJJJJJJJJJJLLJJJKJJJJJKJJKKLLLLLMLLLKKKKKLLLKJJJJJJKJIIJKKKKKJJJJJJJJJKKKKKKKJJJJKLLKJIIJGIJJJKKLKKKKKKKLMLKKLMMMLLLLLLKJKLLLLKKLLKJJJKKKKKLLLLKKKJJJJJJKLLLKKKKKLLLLLKKJLLLLMMLJKKLLMMMMMLKKLMMLJJJKLLKKMMNNNOOOMMNONLLNNNMLLLLKLLLLLLLKLLMMMMMMNMLMMMMLMLLLLMNNOOONNNOOOONMMLLLMMMMMMNNMMMLLMMMMMMNNNNNMMMMMNNNMMMMNNNONNNNNNOPOOONNNNNONNNOOONMMMMMMMMMMMNNONMOOOOOONNNMNPQU[akosstvxxz|~~}~~~~~}}~yxutsnsvvuwyz{{|~ ~}|{|||{zzz{|~ ~}|{~ ~{zzzzzz|~~|ytrqsvz}|}~zyz} ~ ~qhgkns }{vpgb\[\\YVVUSQPPPPPPPQQPPPPPPPPPPPPQQQPPPPQQQRRQQPPPPPPPPPPPPPPPPPPOOOOOOOOPPPPOOOOOOOOOPPPPPPPPPOPPPPPPPPPPPPOOOOOOPPQPPPPOOOPPPPPONOQRQPOOOPPPPPOOOOOPPPPPOOOOPPOOOONNOPPPOOOOOOPPOPPPPPOOOPPPPPOOOOOPPPPPPPOOPPPPNNOPPPPPPOOOPPPPPPQRRQRRQQPPPOPPPPONOOPPPPPPPOOOPPOPPQPPONMMOPPPOOOOOONOOONMMMNNOOOOONPPPPPPPPPPQPPPPPQPPPPPPOONNPPPPPPPPPPPPPPONNOOOOPPOPPPPPOPPPPPPPPPQQQQPQPPPPPPQQQQPPOOOPOOOPPPPPOOPPPPPPPQQRRSUVRPPOPPPPPPPPPPPPPPPQQPPOOPQRRRRSPPPPPQPPSSSSRRQQJJIHHIJJJJIIJJKKKJJJJJKKLLJIGFFGIIIHHIIJJHGHIIJLMKIHHIIIHGGGHJJJHIIIJJJIJJJJJJJJJIGHJKKJJJKKJJJJJJJJKKJJKKKKKJJIGGGHIJJJJJIHHHIIGGHHHGGHGHIJJKKJJJIIJJJJJJJJJJJJJJJIIIIIHHIJJKJJIJJIIHIJJJJKJJJJJJLLJJKLKJJJJJJJIJJKJJKLMMLLLKKKMMNMKJJJJKKJIIJLJJJJJJJJJJJKKKKKKKKKJJJJLKKKKJJIHIJJJJKKLLMMMLKKKKJJKLMMLKKLLKJJIJKLKKKLMKJJKLLLKLMMMLLKKJIJJIJKLLKKKJJJLLLLLKKJLLLMMMLKKLLLMMMLKJJJLLLLJJJJKKJJLLLMMNNNLLNOMLMOONMLLLLLMMMMLKKJLLLLLLMMMLLLMNNMMLLLLMNNOOOOOOOPPOONNMMMMMMNNNNNLLLLLLLLMMNNNMMMLLLLLLLLLLLMMNOOOOONMNPPPPOOONOOPONNNNNNNMMMMMMMNNNNOOONOOOOOOOOMPQPPTWZfmrrrtvvyz|~~}yzywtsvyxwyz{{zzz|~ ~}|{z{{{zyxww{|~~~}{z{||z{|}|ytqsty}~}~zzz~ || wqrttw }{yvonlmmid_ZXVSQPPPOOPPQQPPPPPPPPQQPQRRQPPQPPQRRRQPOOPPPPPPPPPPPPPPPPPOOOOPNOPPPPOOOOOOOPPPPPPPPPPOPPPPPPPPQQPPPPPOOPPQQPPPPPOOOOOOPONOQRQPMNNOPPOOOOOOOOOPPPONNOPPOPPPOOPPPPONOOPPPPNNOPPONNOPPPPPQPONNOPPPPPOONOPPONNNOPPOOOOOPPPPPPQRRRQQQQPPPPOOPPONNOPPPPPPPPPNOPOOOPPPPOMLLNOPPPOONNNNOOONNNOOONNNNOOOOPPPPOOOOPPONNOPPOOPPONPOOPPPPPPPPPOOPPQPOOOPPPPPPPPPPPPQRRQPPPPPPPPPPPPPPOPPPPQPPOOOPPPPPPPOOOLNPPPPOOQRSSRRRSPPPPPPPPPONOPPPOPQRSSRQPPPPPPQSTPPPPPPPOQQQPPPOOJHHIJKKLKJJJJJKKJJJJKKLLLLKJJJJIJJIHIJJJJJJIJJKLLKJJJJJIGHIJJJJJJJHHJJJIFGHJKKJJJJJJLLKJKJJJJIHIJJJJJKKLLLKJIIJJHIIIJKKJJJIIIJIIHIJJJJJJJJJJJJIIJJJIIIJJJJKKJIIIJJKKKJJIKKJJKJJIJKKJJJKLKKKKKKKKJKMLKKKLKKKKLLKJKKJKLMLLMLLLLLKJMMMMLJJIJJJJJKKLKJJJKKKJKJIIJKLLKKKKKJJJLLLLLKKJJKLMMMLKMMMMMMMLKKJJKLLLMLKLLLLKJJLMLLLLMMMMLLLMMMMMLLLKLLLKJJJKLLLKKJKKLMMNMMLKLLLLLKKJLLMMMMMLMKJJLMMMKKKKKLLMNMLLLMNONNMMMLLLMMNMLLLLMMNNMLKKJKLMMMMMMNNNMMNNNNNNMMNNOOOOOPPPPONNNNMLNOONNNNMNMLLMMMLNNNNNNNNNNNNNNNNKLMMNNNNOOPPPPOOPPPPPPPOOPOOONNNNNNNMMNNNNMMMNNNPONMMMNOPONOPRRR[fsusvyuxz{} |zzzxz{}|z{}|{zz{} ~}~}|{{||zzxwvvwx{ ~|}|}}~|yvvy|~{{ }|}~ |xx| |z{ywutsplig`YUTRQRRQPQQPPPRRQQQPPPQRRQPPPPSRRQPPPPPPPPPPPPPPPPPPPPPPPPPONMPPPOOPPPPPOOOPPQQPPPPPPPPPPPPPPPQQQQPPPOOPQQQPPQPPPPPPOOONOPQQPNMMMMNNNNMOPPPOOPPPQQPOOPPPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPOOOPPPPOOPPPPPPPPPPNOPPOOOPPPQQQQPPPQQRQPPOPPPPPOPPQPPONOOPOOOPQQPOONMMNOPPTRPPPPPPPPPPOOOOOMMMNNPQPPPPQQPPPPPPPPOOPPQPOOPPPPOOPPPPQPPPPOOOQPPPQPOOOOPPPQQQRRQPPPPQSRRRSSQPPPOOOOOOQQQQQQPOPPPQPPNNNOPPOOPPPQRRQQQQPPPPPPOOPPOOPPQPQRTUTSSRSRQPPPPPRQPQRRPOQQPPPONMKJJJJJJKJJJJJJKLKLLMNNNNLLKJIJJIIIHHIJJIJJJJJJKKLKJJJJJJHIIJJKKKKJIJJKJJHGGHIJJIKJJKLLKJKJJJJIIJJJJJJKKKKKJJIHIIIIJJJKKJJJIIJJJJIJJJJJJKJJJIHHHHJJIIIJJKKKKKJJIJIJJJJJJJKKJJKKJJKKKJJJKLKKKKKJJJJKLLLLLLLKKKKKJJKKJKLLLLMLLLLLLKKLLLLKJJKKJJJKKKKJJJKLLLLKJJJKKJLLLLLLLLKKLLKKKKLLLLLLLLMMLLLLMMLKKKKKKKMMLLLLLKJKLMLLLMLLLLKKLLMMNMMMLLMMMLKJKKLLKKKKKLLMMMMLLKLLLLLKKKKLMMMMLLMKJJLMMLLLKKKLLLNMLLLMNONMMMMMMMNOOONMNNMMNNMMLKKKLLMMMMMNNNMMMNNNNMMMMNNNNNNNNOPONMNNMMNOONOOONNMLLMMMMNNNNNNNNNNNNNNNNMMMNNNNNOOOPPOOOPPPQQPPPOOOOONNMNNONNMNNONNNNNNNOONNMNNNOOOPPQRSYcotsvxuxyz{} }|{|zz}~|}~|{{} }{|}~~~}||||{zxwvuwz ~~~~~|zz{}|~ ~{zzz} || }|}}{xwwwwvkf_\YVVVTUUSQPQSQQQPPPPPQQQQPPPPQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPPOOPPPPPPPPPPQQPPQQQPQPPPPPPPPQPPPPPPPPPQQQPPQPPPPPPPOOOOPQQPNMNNNNNNNNPPPPOOPPPQPPOPPQPPPPPQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPPPOPPQPPPPPPPPOPPPPPPPPQQQQQPPPPQQPPPPQQQPPOPPPPOONNNOOOOPPPPPPONNOPPPRQPPPPPPPPPPOOOOPOOONMNPPPPPPPPPPPPPOOOOPQQQPPPQPPOPPPQQPPPPPPPPQPPPPPOOOOPPPQRRQQPPPPPPPPPPQQPPPPPPPOPPQQPQQQPPPPQQQPPOOPPPPOOPPQRRRQQQQQQQQPPPPONNOPPPPPQRSSSTRRPPPPPPQQPPPQPPQQPPPPONMLKKJJJKJIIIIJJJJKMNNMMLLLJIHIJIHGHHIIIIJJJJJJKKKJJJJJJJIIIJJKKLLKJJKKJJIHGGHIJJKKKLLLKJKJJJJIJJJJJJJJJKJJJJIHHIJJKKKLLJJJJJJJJJJJKKJJJKJJIHGGGHIIHHIJKMLLLKJJJJJJJJJJJKKKJKKKKJKKKJJJKLLLKJJJJJJJKKLMMLLKJJJKJJKKKKLLLLLKKKLLLKJJKLLLLLLLKKKKKKKJJJKLMMMLKKKJJJKKKLLLLLKKKKKKKLMLLKKLLLMMLKKLMNKLLLJJJKNMMLLLKKKLLLLLMMLLLLKKKLMMNMMMLLMMMMLKLLKKKKKLLLLLLLLLLLMMLLLLLLKLLMMMLLMLKKLMMLMLLLLLLLMMLLLLMNMMLKLLMNNOONNMMNMMMNMMLLLLLLLMMMMNNMMLMMNNNMMMMNMMMMMMNNONMMMMMMNOPOOPPONMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOPPPQPPPOOOOONNMNOOOONNNOONNNNNNNNNNNNNNNOPPPPRTW^jrsuwuxxyz{}}|}}{|}}} ~{zzzzz}}~|}}}|zwvvw{ ~~{zyyz| ~ ~~~{zz|~~qmgb^\Z[\[XUQPPPQQQPPPPPPQQQPPPQPPPPPPPPPPPPPPPOPPPPPPPPOOOOPPPPPPPPPPPPPPPPPPQQQPPQQQQQPPPPPPPPPPPPPPPPPPQQQQPQPPPPPPPOPOOOPPPPNNNNNOOONPPPPOOPPPPPPPPRPPPPPQQQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQPPPPPPQQQPPPQQQQPPPPPPPPPPPPRQQPOOPPPPOONNNNOOPPPPPPPPOOPPPPPPPPPPPOPPOOOOONPPPPNLMPRQQPPPPPPPOOOOOOPQRQPPPQPPPPPQQQPPPPPPQQRPPPPOOOPPPPPQQQQQPPPPPPQPPQRRSRRRQPPPPPPPPPPQQPPQQRQQPPPPPPPPOPPQRSRQQPQQQQQQQQPONNOPPPPPQQRRSTQPPPPPPPPPPPPPQRPPQQPPPPMLLLJIJKJJIIHHHIJJKLKKKKLLJHHIJIGGHIJJIIHIIJJJJJJJJJJJIIHHHHIJKKLKKKLKJJJIHHIJJJJJKKLLKKLKJJJJJJIJJJJJJJKKKKJIIIKLLLLMLJKKJJJJJJJKKJJJJJJJIGGGHIIIIJJKLLKKKJJJJKKKJJJJKKKKKKKKKKJJJJJJKKMLKJJJJJKJJKMNNMMLJJJJJJKKKKLLLLKKJJKKKJJJJKLLLLKLLKKKKLKJJJJKLLMLLLLKJJJJJKKLLLKJJJJKLLMLLLLLLLLLKKKLLMJLMLJJKLMMLLLKKJLLLLKLLMMMMLKKLLMMMMLLLKJKLLLLMNLKKKKKKLLLLLLLLMNMLLKLLLKKLMMLLLLKKKLMNMMLLLLLLLMMLLLLMMMLKJJKLMNOOONMMNMMMNNMMMMLLLLMMNMNNNMLMMNNONMMMNNNNMMNNNNMMMMMMMNPPPPPPPNNMMNOONNNNNNNNNNNNNNNNNNNNMMNNOOOOOOOOOOOPPPPPONNNONNNNNOPPPNNMNNNNNNNNNNNOONNMNOPPPPRTVZdnrtvuxxxyz|~~|||}|}~~}zzxwwzz|~}~~~}{ywxy| ~zywwy{ |}~} ~~~~~xtnhdbcdea[VTSQORRQPPPPQQQQQPPPPPPPPPQQQPPPPPPOOPPPPPPPPOOOOOPPQQPPPPPPQPPPPPPPQPOOPPPPPPPPPPPPPPPPOPPPQPPQRQQQPPPPPPPOOPONNPPPPOOOOOOOONOPPPOPPPPPPOPQRPPPPPPPQQQPPPPPPOOPPPPPPQPPPOOOPOOPPPPPPRQQPPPPPPQQQQPPPPPQQQQPPPPPPPPPPPPPPPPPPQPPONOOPOOPOOONNPPPPPPPPOOOOPPPOPPPOOONNOOOOOONNOOPPNMPSTSQPPPPPPPONNNOOPQRRQPPQPPPPPQQQPPPPPPQQRPPPPOOPQQQQPPPPPPPPPPPPQQQQRSTUSRQPPPPQPPOOOPPPPPQQQQPPQQQQPPPOPPRSRQPPQQQQQQQQPPPPPPPPRSSSRRRRPPPPPPPPPPPPPPQQPPQQQQQQLKKKJIJKJJIHHHHHKKLKJJKMKKJHHIIIGHIJJJJJGHHIIIIIIJJKJJIHHGHHIJJKLKKKKJJIHHHIJJJJJJKLLLLLLLKJIIIIIIJJJJJJKLLKJJJJKKKJKLKJLLLKKJJJJJJJJIIJJJHHHIJJJJJJKKJJJJJJJJKLKJJJJJJJKKKKKKLLJJJJJJJKMMLKKKKKKJJKMNNNMLJJJJJJKKKKLLLLLLKKKKJJJJJKKKKKKKLKKKLMMLJJJKKKLLLMLKKJJJJKKLLLKKJJJKKLKLLMMLKKJKKLLLKKJKLLJJKMLLLKKJJJLLKKKLLMNNNMLLLMMMMMLLLKJKLLLMNNLLKKKJKKMLLLLLMMNMLLKLLLKKLLLLLKKJJKMNNOLLLLLLMMMMLLLLLMOMLKJKLMPPPPOOOOMMMNNNNMNMMMMMNNMNNNMMMNOOOONNNNNNNNNNNNMMMMMMMNOPPPPPPOONMNNOOONNNNNNNNNNNNNNNNNMMMMNNOOOONNOOOPPPPPONNNNNNONNNNOPPPNNMLLMMMNNNMNNOONNMOONOPQRRVV_insuuxxxyz|~~~}{{{||}~}~~|zyxyzz|}~~~~}{zzz|~~ ~}zwuuxz~~~{~ }wpmnpsnle\WUTSSRQPPPPPRRRQPPPPPPPPPPQQOOOOOPPPPPPPPPPPPPPPPPQRQQPPPPQQPPPPPPPPPPPPPOOPPPPPPPPPQPPPOPPPPQQQRQPPPPPPOOONONNNOPPPPPPPPPPPNOOOOPPPQPPPOPPRPPPPPPPPQQPPPPPPOOPPPPPPPPPOOOOPOOPPPPQQQQPPPPPPQQQQQQPPPPQRRRQPPPPPPPOOPPPPPPPQPPOOOPPPOPPPPPOOPPPPPPPPOOOPPPPOQPONNOOOPPPPPPOOPPPONNQUUTRPPOPPPPONNNOOPQRRQQPPPPPPPQQQQPPPPPPPRPPPPOOPQQQQQQQQPOOOOOOOPPPPPQSSRQPPPPQQPPPOOOPPPPQQQQQQQQQQPPPPPPRRRQQPQQRRRQQQPPPPPPPPSSTTSQPPQQPPPQQRQPPPRRQPPPQQQQRRJJJJJJJKJIIIIIJJLLLKJJKMKKJIHIIHHIJJJJJJHHHHIIIJHJJKJJIHHHIIJJJKLKKJJIIHFFGIJJJJJKLLLLLLKKKJJJIHHIJJJJJJKKJJIHIJJJJHIJJHLLLLKJJJJJJJIHHIJIIIIJJKJJKKJJJIIJJJJJKLLKKJJJJJKKKKKKKLJJJJJJJJMLLLKKKKKKKKLMMMLKJJJKJJJKLLKKLMNMLKKKJJJJJJJJJJJKLKKKLNNMLLLLKKKLLLLKKKKKLLLLMMKKKKKKKKKLLMMLKJJJKLLLKJJKLLKKKLKKKKJJKKLKKKKLLLNNNMLLLMMMNMMMLLLMNNMMMMMLLKKJJJMMMMMMMLMMLLLLLLJKLLLLKKJJKLMNOOKKKKLLMMMLLLLLMMPOMLKLMNOOPONNNNNNNNNNNNNNMMMMMMMNNNMMNNOPPPONNNNNMMMMMMMMMMLMMNOPPPPPPOONNNNOONNNNNNNNNNNNNNNNNMMMMMNNOOONNNNOOPPPPPOONMNNOOOOONOPPPNMMLLMMNNNNMNNOONNNPNNNPQQQUTZbhotuxxyz{}~~|}}}~~|{z{{|| ~}}|{zzzz{|}~~}}~~|{{{|~~}|} }~|zxuuwz}~|~ }wtw{}z{uhZSTVTSRPPPPPRRRQPPPPPPPPPPPPNNOOOOPPPPPPPPPPQRSRQPQRQQPPPPQQPPPPPPPPPPPPPOOPPPPPPPPPPPPPPPPPQPQQQQPPOOOOOONNONNNOPPPPPPPPPPPOOOOOPPPRQPPPPPQQQPPPPQQQPPPPPPPOPPPPPPPPPPPPPPPOPPPPQQQPOOPPQRRQQQQQQQPQQQRRRRQPPPPPOPPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPONNOPQQPPPPPPPPQPPONNPTSRQPOOPPPPONNNOOPQRRRQPPPPPPPQQQPPPPPPPPQPPPPOOPPPPQQQRRPPPPPPPPOPPPPPQQPPPPPPPPPPPPOPPQQQQQQQRRQQQQQQPPPPQRQQQQRRRRRRQQPPPPPPPPQRSSRPPPRRRRRRRSQPPQSSQPPPRRQQRSJIIJJJJKJJIIIJJJKLLKJJJLJKKJIJIHHIJJIIIJIIIIIJJJIJJJJJIJIIJJJJJJLKJJIHHHFFGHIJIIJKLLKJJJJJKJJJJHHHJJKKKKKKJIHGHJIIHFGHIHJKLKKJJKJJJJIIIIIIIJJJKKLKJJIIIIIJJJJJKKLLKKKJJJKKKKJJKLKJJJJKKKKLLLLKKJJKKKKKLLLKKKKKJJJKLLKKLMMLKKKKJJKJJJJJJJJKLKJJLMNMMMMMLKKLLLKKLLLLLLLLLLLLLLKKJJKKLLLLLLJJJKKKKKJKKLKKKKJJKKKKKLLKKKLMMLMMMLKKKLMMNMMMLLMNNNMLLLMLLLKKLLMMNNNMLLLLLLLKKKJKKLLLKKKKLLMMNNLKKKKLLMLLLLLMMMONMLLLMNNNNNMMMMNNNNNNNNMMMMMMLLLMNNMMNNOPPPONNNNMMMMMMMMNNMMLMNNOPOOPPOONNNNNNNNNNNNNNNMMMMMMMMNNNNNNNNOONNNNOOPPPPPPONMNNOOOOOOOPPONMMMNNNNNNMNNNNNNNNOONOOPPQSSV\bkstwxz{}~~}~zzzzzzzzz{{{zzzz{|~ ~}|zzxwwyz{|{z{||zzzzz{{zz||{}}|{zwtuwy{ ~~~ |{~}n]VVWVVTSRQRRRRRQPPPPPPPPPPPOOOOOOOOOPPPPPPPPQRSRQPQRPPPPPPPPPPPPPOOOPPPPPOOPPPPPPPPPPPPPPPPQQPPQQQPPOOOOOONNOOOOOPPQQQQPPPPPPPPOOOOPQQPPPPPPQQQPPPPPPPPPOOOOPPPPPPPOOOOPPPPPPPPPPQQQPOOOPQRRQQQQQQQQQPPPQQQQPPPPPPPPPPPPPPPPPPPPQQPPPOOPPPQQQQPPOOPPQPPPPPPOONNNPPQQPPPPPPPPQPPPOOPRPPOOOOPPPPOOOOONQQRSSRQPPPOPPPQQPPPPPPPPPPPQPOOPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPOOOOOPPOPPQRRQQQQQRQPPPQQQPPPQQPPQRSSRRRQPPPPQPPPPPPQRRQPPORRQQQQQRQPPPQQPPPQRRQQRSJIHIJJJJKJJJJJJJKLMMKJKLJKKJJJIHHHIIHHIIJJIIJJKKJJJJIIJJIIJJJJJJLKJJHHGHHGGHHIIIJJKJJIIIHJJJJJJHHHJJKKKKLKJIGGIJJIGFFHIHIJKKJJJKJJJJJIIJIIJJJJKKMKJHGGHIIJKKJJJJJJJJJJJJKKKKJJKLLJJJJKKKJKLLLLKJJJKJJJJLKKKKLLKJJKLLKKLMKJJJJJJJJJJJJJJJKLLLJJKLMLLMMMLKKLLLKKKLLLLLKKKKMMMLLKJJLLKKLLLMJJJJJJKKLKKKLKJJJJKKKKLMKKKLMNMMLMLLJJJKMMMMLLLKKLMMLLLLMLLLLLMMMNNNNMLLLLLLLKKJJKKLLLKKKLLMMMMMLLLKKKKLLLLLMMMNMLLKLLMMNOOONMNNONNNNNNNLMMMMLLKLLMMMMNNOOPONNMMNNNMMMMMMNNMMLMNMNONOPPPOONNNNNNNNNNNNNNMMMMMMMMNOOOONMMONNMMNNONOOPPONNNNNOOOPOOOPPNNMMOOOOONMMNNNNNNOONOOONOPQRQTW]hqsvxz|~~}}|~~~~yxwvvvvwwxyzyyyz{{~ ~~~~~~||zyvttuwyyxxyzzywuuvwvvwy~~}}~~|z{}zzzyvsrsty ~~ yla\[YYWVUTTTTQQRQPPPPQQQQQPPPOOOONNNNPPPPPPPPPPRRPPPPPPPOOPPPPPPPOONNOOOPPOOPPPPPPPPPOPPPQQQQQPPQQQPOPPPPOONNOOOPPPQQQQQQQPPPRQPONNNNQPPPPPPQQQPPPPPPPPPOOOOOPPPPPPOONNOPPPPPPPPPPQQQQPPPPPQPQQQQRQQQPPOOPPPPPPPPPPPPOPPPPPPOPPPPPPPOOOOOPPQRQQQPOOPPQPPOONNMNMMNOPPOOOOOOOOOPOOPPPPPMMMNNOPPPPPPOOONQRSTTSQPPPOOPPPPPPPPPPQQPPPQPOOPRQQPPONNOOOOOOOOOPPPPONOOOPPONMMLMNONOPPQQPPPPPQPPPPQRQPPPPPPPQRRRRQQPPPPQQQPPPPRRRQPOOPPPPPPPPPQQQPPPPQPQRRQPQRJJJJJKKJJJIJJJKKJKLMLKKLKKLKJJJJHIIIHHJJJJJJJJJJJJJIIIJJJJJIIJJJLLKJJJJIJJKKKJKLMMMKJIJKJJJJJJJJIJJKKKJJJJHGGGHIIIJJJJJJJJJJJJJLIJJJJJJJJJJJKKKJJJJIHGHIIIJJJJKKKLLLKJJKKKJJJKLMLKJJKKKKKKKJJJJJLKKMMLKKLLKJJKKLJKKLLKJJJJJKJJJKKKKJJKKKKKLKKKJJMLKKLLLLKKLMLKKLKMNMLMMMMLLKKKKLJKKLLLLLLKJJJJJJKKKKKJJJKJJKLLLKLLLLLLLLLLKJJKKLNMMMLLLKMMMMMMLLMMMMMLLLMMMNNNNNONMLLKKLMMLLMMMLNMMMNONNNMKKLLLKLMMMMMMMMMLLLMMNOOPPPMNPPONNMMLLLLLLLLLLMMNNNNMMPPPONNMMNNOOONNMMNNONNMMNNNOOPPPOONNMNOPNNMMNOOOPONNNNMMPPPPPOOOOPPPONMMOOPPPONNNNOOOPPPPPPOOPPPPPOOOOPPPPOOOOOOOONNNOPPQRPQYbjryz{|~}~~~~~}}|xwvtttttuvvvwxyz|||~ ~}|{{{z|zxwxyz{zyvtsqqqsstuvwwvttuutuvx|~|{{zz}~{zz{}zxvvusposs zrhcce`\YWVUTTTSSTTSQQQQQPPPPOOONMMNOOPPPPPPPPPPPPPPPPOOPPPPPPQPPPPPONPPPPPPQQPPPPPPPPPPOPPQQQSQPPQRRQQPONOPPPPPPPPPPQPPPPPQQQQPPOOPPPQPPPPPPPRQQPPOPQPOMLMNNMPPQQQQPPQQPPPPPPPPPQQQRRPOOPPPPPPQRRRRQQPPPPPPPPQQPPPPPPPPPPONNMPPPPQQPPPPPOOPPPQQPPPPPPRPPOOPOOPOOOPPPPPPONNOPPQPPPPPPPPONMLMNOOOPOOPPPQQQQRRQPPPPPQQPPPPQSRPPPOOOPPPPPQPPOPPPPOPPPOOOOPPPOMLLMNPQPOMLMKLMMMMOPPPPPPOOOOPQQQQRRPQRQPPQSQQRRRRRQSSSRQPPQTTTTSRQPQQQPOOPPPPPPPPPPPQQPPQRRJJIJJJJJJJJJIIIJHIJKKKKLKLLKJJJJJJJJIJJJKKKKJJJJJJJJJJJJIJJIIJJJKJJJJJIILLLLKJKKKLMLKJJKJJJJJKJJJJJJJJJIIIHGGHIJIIJJJJJJJJKKJJJJIIJJJJJJJJJJKKKJJJJIHHIIIIIIIJJJKKKJJJJJLKJJJKLLLKJJJKJJKJJJJKKKLKKLMLKLKKLLLLLKJJJJJJJJJKKKJJJJLKKKKLLLMMMMMMLLLKJJJKJJKKLMLJJLKMNMLMMMKKKKLLLMKKLLLLLLLKKJJJKLLLKKKKKKKKKKLLLKLLLLLLLLMLKKKLMMMMMLLLLLLMMMMLLLLLLLMMMMMMMNNNNNNMMLLLLLLLKKLLLKNNMNOOONNMLKLLLKMMMMMMMMNMMLLMMNNNPPPMMOONNMMMMMLLLMMLLLMMMNNNNNNNNOOOOONOOOONMMMNNOONNMNNNNNOOOPOOMMMNOMMLMNOOOPONNNNNMOOOOOOONOPPPONNMNOOPPPOONOOOOOPPPPPPPPPPPOOOOOPPPOOOOOOONNNNOOPPPQPPW^ektwz}~~}|{wvtsrrrsuuvvwwyz}}~ ~|zyxwvtttvxyzzxwutrqpppppqsssrrsttuvyz }|zzyyz|~~|zzzz|{xuttrnnqq} ~~ }} |tposvqh_\[WVWVUTUVVTRQQPPPPPPPPOOOOPPPPPPPPPPPPOOPPPPOPPPPPPPPPPPPPPOPPPPQQQQQPPPPPPPPPOPPQQQRQPPQRQQQPONOPPPPPPPPPPPPPPPPPQQQPPOOPPPPPPPPPPPPPPPPPPQPPNNOPPOPPPQQPPPQQQQQQQQPPPPPPQQPPPPPPPPPPQQQQPPPPPPPPPPQPPPPPPPPPPPPOOONNOPQQQPPPPPPPPPPPPPPPPPPOOOOPOOOONOPPPPPPPOOPPPQQPPPPPPPONMMNOOOPPPOOPPPPPPQQQPPPPPPPPPQPQQPOOPONOPPQQQQPPPPPPPPPPPPPPPQQQPONOONPPPOMMNMNONMMNPQPPPPOONPPQQQQQQPPPPPQQQQRRRRSRRRRRQPPQQTTTTSRQPPPPPOPPQPQQQPPPPOPPPOPQQIIIJJJJJJJJJIHIIIIJJKLLKKKLKJJJJJIIIJJJJLKJJJJJJJJJJJJJIIJKJIJJKJJJJJJJJMMMLKJJJJKMMKJJJJJJJJKJJJJJJIIIIIHHGHIJJIIJJJJJJIJKKJJHHIIIIIJJJKKKKKKKJJJJIIIIJJJIIJJJKLLKJJJKLLKJJJJKKKJJJKJJJJJJJJKKLLJJKLKKLJKLMMMLLJKJJJJJJKLLLKJJJKKKKLLLLKKKLLLLKLKJJJJJJLKLLLJJKLMNMLMMLJJKLMMNNMLLLLLMMLKJJJKLMMLLKKKKKLKKLLMLKLLLLLLLLLLKKKLMMLLLLLLLLLLLMLLLKKKLLMMNNMMMMNNNNLLLLLLMMMLLLMMMLNNMNNONNMMLLLLLLMMMMMMNNONNMMMMNMNPPOMMNNNMMMMMMLMMMMMMLMMMMNNOONNNOOOOOOOOONNMLMNNOOONNMMNNNNNNPPOMLLMNMLLMNOPOPONNNNNMNNNNOONNOPPPPONNMNOPPPPPOOOOOOOOOOPPPPPOOOONOOPPPOOOOOOONNNOOPPPOPPPVZ^dotz~ ~}{zxvtsrrstvwxyyyzz ~~~|zwusqnnmlmnnnttttsqppnnnnooppqrttvx{~ ~}|zxxwwxzz{||}}}|{zyyz{}ytttsonpoz ~ {z{~ zutwz}wh]\\XX\```_`_YRTSQQQPPPPPPPPPPPPPPPPPPPPPOOPPPOPPOOOOPPPOOPPPPPPPPPQQQQQPPPPPPPPPPPPPQPQPPPPQQQPPOOOPPPPPPPPPPPPPPPPPPQPPPPPPPPPOOPPPPPPOPPPPPPPONOPPPPPPPQQPPPPQQQQRRRPPPPPPPPQPPPPPPPPPPPPPPPOOOOOOOOPPPPPPPPPPPOOPPPOOOPQQQPPPPPPPPPPPPPPPPPNNOPPPPONNNNOPOOPPPPPPPPPPPPPPOOOOOOOOOOPPPPPPPPPPPPPPPPPPOOPPPOQPPPPNNOPPOPPQQQPPPPPPPPPQRQQPPPQQQQPPQQPPPPONNOOPPPMLMOQQPPPONNPPQQPPPQPPOPQRQPRRRQRRRRRRRQPPQQSSSSRRQQOOOOOPPQQQQQPPPONPPPOOPPHIJJJJJIHJKKJIJJKJJKLLKJJKKJJJJJJJIJKKKJJJIHIJJJIJJJJJIIJKLJJJJKJJJJJKKKLMLKJJIJJJKKJJIIIIIJJJJJKKJJJIIJJJIIHIIIIJJJJJJIJJJKKJJIIIIIIJJJKKKKKKKKJJJJIIJJJJJIJJKLLLKJJJLMLKJJJJJKKJJKKKJIKKKJJKKKKJJJKKLLKKLMMMMLLLLKJJJJKLLLKKKKKKKKKKKKJJJJJJJJKKJJJKJJKKKLKJKLMNNMLLLKJJLMNNNNMMLLLLLMKJJJJKMNMMLKKKKKLLLLMMLKLLLLLLLLLKKJJKKLLLLLLLLLLLLLLLKKKKLLMMMNMMMMMNNNLLLLLLLLMMMMNNMMMMMMMMMMMMMLLLLLNNMMMNNOOONNMMNNMNPPONNNNNMMMMMMMMMNNMMMNMMMNNOPPPOOONNNOOOONNMMNNNOOOONNNNNNNNNPONMKLMNNNMNOPPPOONNNNNMMMMNNNNNNOPPPONNNNOPPPPOOOOOONNNOOPPPPOOOONNNOOPPPOOOOOOOOOPPPPPPQPPTW[`lsz ~|zyxvttuwxzz|}}}}} ~}}~~~}{ytpncccdgilmoprssrqqnnnnnnopprttvz} ~|zyywuvvvwxyz{||{zzyzz}{wuuuroonv~ zxz} ~{wka_aachjlnnmi_UZWTSRQPPPQQQQQQPPPPPPPPPPPOOPPOOPOONNOPPOOOPPQQPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPQQPQPPPPPPPPPPPPPPPOOPPPPPPPPPPPPPPPPPPPQPPPPPPPONOOONOPPPOPPPQQQQPPPPPPPPPPPPPPQQQRQPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPQPPOOOOPPPPPQQPPOPPPPPPOPPPPPPPPMNPPQPPONMMNOOONNOOOOOONOPPPPONNNNOPPPPOPPPPPPQQRQPPPPPPONMMNOPOQPPPPNNPQPPPPPPPPPPPQPPPPQRQQPPQQQQQRRSSQQQPPOOOPQRPNLMOPPPPPPOOPPPQPPQRRQPPQRRQRQQPPPQQSRRPPPPQRRRQQQQQOOOOOPPQRRQQPPOOPQRPOOPPHIJJJJJJIJKKJJJKLKJJKKJJJJJJJJJKKJKLNOONJJHHIJJJIIJJJIIHJKLJIIIJJJJJJKKKKLLKJJJJKKKJJIHHIIIJJJJJJJJJJIJJJJJJJJJJJJJKKJJJKKKKKLLLJJIIJJJJJJJJJKKKJJJJJJJJJJIHIJJKJJJJIJLMLLKJJJJKKKKKKKJJLKKJJJJJJJJJLLLMLLLKLLMMKLLLJJJJJKLLLKKLLLLLKJJJJJKKKLLKJJJJKKLKJJKLKJKMNNNMLMLJKLMNNNNNMMLLKLLLKKJJJLMNMLLKJJKKLLLLMMLKMMMMMMMMMLLKKKKKLLLLLMMMLLLLLLKKLLLLLLLLLLMMMMMMMMMNMMMLLKLLMMLLLMMMLLLLMMMMMMLMNNNNNNOOOONMMNNNNOPPOOONONNMLLLLMMNNNNMMNMMMNNOPPPPOONNNNNNNNNNNNNNOOOOOOOOOOOONNNMLLLNOOONNOOOONNNMMMMMMMMNNNNNNOPPPONNOOOPPOOOOOOOONNNNNOPPPOOOONNNOOPPPPPOOPPPPPPPPPPPRQPTVZ_hpz~ ~|zzyyzz|} ~}}}~~}{wrnbceghiihjlnoqrrrponnnnnnoqstwz~ |zzxvtuutttuvyz{zzyyyyz}zwwvsoons{}~ {yz} ~yuqjghlprsuwxwsh_a\XVSQPPQQRRRRQQQQQPPPPPPPPPPPPPOONNOPPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPPPPPQQQQQPPPPQQQQQPPPPPOOOPPPPPPPPPPPPPPPPPQQPPPOPPPONNOOOPPPONPPPQQPPPOPPPPOOOOOPPPQRRSRQPPQPPPPPPPPPPPPPPPPPPPPPPPPPPQPPOOOPPQQPQQQQPOPPPPPPOPPPPPPPPNOPQQPOONNMNOOOONOOPPOONMMNNOONNNOPPPPPPPPPPPQRRSRQPPPPPNMMMOPPPQPPPPOPPQPPOPPPOOOPPPPPPPPQQPPPPPPPPQRSSSRQPPPOOPPQPNMNOOPPPPPPPOPPQQQRSTSQPPPRSRRQPPPPPSRQPPOPPQQQPPPPPPOOOOPPPQQQQPPPOPSTRPPPPIJJJJJJJJJKJJIIJJJJJJJIIIJJJJJKKJJKMOOOOMKJIJJJJIJJJJIIIIJKJHHHHJJJJJJJJKLLKJJJKNMLJJIIJJJJJKKJJIJJJIIJJJJJKKKKKJJJKKKKKKJJJJKLLJJJJJJJJIJJJJJJKJJJJJJJJJJJJJJKLKKJJJJLMLLKJJJJKLLKKLKJJLLKJJJJJJIJKLLLMMLKKKKKLJKLLKJJJJJKKKKKLMMMMLKKJJJKKLLLLJJJJJKLLJJJKKJKMNNNMMNMKLLMMMNNMMMLLLLLLLLLLLMMNLLLKKJJJLLLLMMLLMMMMMMMMNMMLLLLLMMMMLLLLLLLMLLLKMLLLLLLLLLLLLLLLMNNOONMMLLLMNNMLMMMMLLLMLMNNMMMMNNNNNNNNNMMMMNNOOPPOOOONOONMMLLLMMNNNNMMMMMMNNOOOOOOOOOOMNNNNOOONNNNNNNNOOPPPONNLMMMMMNOONMMNNNMMNNMLLMMMMNNNNNNMNPPPONNPPPPOONNOOOOOONNNNOOOOOOOOONOOPPPPPOOOPPPPPPPPPPQTSRUW[`dmv{} |}}~ ~}|}~zvsnkgcbbccghjmnqrsrrqonnnnprtvy{ }||wuuvvtssrtvxyyyxxxxy{~|zywsooopy}|yy{|{{|~ ~|} zuvtrty|}ztphb\XUQOOQQRRRRQQRRQQQQQQQPPPQQPPOOOOPPPQPPPPPPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPQQQQQQQPPQRRRQQPPPPOOOPPPPPPPPPPPPPQPPQQQPPONOPQPPPPPPPPPPPPPPPPPPPPPPPPPONNNOPPPQQRQQQQQQPPPOONOOOPPPPPPPPPPPPPPPPPPPPPPPQPPPPQRRQPPPPPPPPPPPPPOOOOPPPPONNONNOOPPOPPPPPPPPLLMMNNNNNOPQQPPPPPPPPPQRQQPPQQQPONNOPPPPPPPPPPPQPPOOPPPPOOPPPPPPPPPPPPPPPOOPQRSSSRPPPPPOOPPPONOONOPPPPPPOPPPQRSTSRQPOPPQRRQQPPPPQQQPPPPPPPPPPPPPPPOOOPPPPPPQPPPPQRSRQPPOIJJJJJJKKKJJJJJJKKKJJIIIJJJJJJJKHJKLLLLLMKJJJJJJJJJJJJJJIJJJIJIHJJJJJJJJKKLKJJJKNMLJJJJJJJJKKKJJHJJJJIJJJKLLMLLKJJJJJKKKJJIIJJJJJJJJJIIHIJJJIJJJJJJJKKKJJJJJKLMMMLLKJJKLLLKJJJKKMLKKKKKJKKJJJJJJIIJLMMLMMLLKJJJJJKMMLJJJJJKKKJJKLMMMLLKKJJJKKKKKJJJJKLLLKKKKKJJLLMMMNOOMLLLLLMMMLMMMMLLLLMMMMMMLLLLLKJJJLKKLMMLLLLLLLLLLMMMMMMMMNNMMLKKKLMMMMLLLLLLLLLLLLLLLKKJJKLMNNNMMMMMNOONMLMMMLLLMLMNNMMMMLMMNNNMMLLLLMNOOOPONNOPOOONMMMMMMMNNNNMMMMMNNNNNNNNOOPPPNNNNNNNNNNNNNNNNOOOPONNMLMNNNNNONNMMNNNNMNNMLLMNMNNNNMMMMNOPOONNPPPPOONNOOOPPOONNNNNOOOPPOOOOOPPPPOOOOOOPPPPPQRRSVVVWY\bairwz} ~{zrnhcbdhifghjmprttuutttttvxzz{} zyyyxvttsttuwwxxyyzz{}}|{wtqqpx{{}}xttwxyyyzz|~ {{}}~oh`[WRPPQQQQQQQQRQQQQQRRQQPQRRQPPPPPPPPPQPPPPPPPPPPPPOOOPPPPOOPPPQQPPPPPPQQQQQQQPPQQPPQRRRRQPPPOOOPPPPPPPPPPPPPPPPPPQQPPPOOPQQPPPPPPPPPPPPPQPPPPPPPPPPPOOOOPPPPPPPPQRRQPPPONNNOOPPPPPPPPPPPPPPPQPPPPPQQRPPPPPQQPPPPPPPPPPPPPPPPOPPPPNNNOPOOPPPPPPPPPPPPPNMNNNOOOOPPQQQPPPPPPOOPPPPPPQQPPONNOOOONOOPPPOOPPPPPPPPPPPPPOOPPPPPPPPPPPOOPQRRRQPPPQRQPOOPPOOONNOPPPPPPPPPPPQRSRQPPPPPPPPPQQQPPOPPPPPPPPQQQQPPPPPOOOPPPPPPPQQQQPQRRRSQPIJJJJJJKKJJJKLLLOOOMJIIIJJJJJJJJHJKLLKKKKJIJJKKJJJJJJJJJJJJJJKKJJJJJJJJJJKKJJJJJLLKJJJJJJJJJKJJIIJLLJJJJLMMNMLKJJJJJJJKLLKJJKKKJJJJJJIHGJJJJIIJJJJJJKKKJIIJJKLLMMLLJJIJJLLKJJJKLMLKJKKJJJJJJJJJJIIJLNMMMLLLLKJIIJLNOMKKKJKKKJJJJKKKLLLKKJKKKLKKKLKKKLMMLLKKKJJJKKLLMNPPOLKKKKLMMLMMNNMMLLLMMMLKKLLLLLKJIKKKLMMMLLLLLLLLLLLLLMMMNNNMLLKJJMMMMMMLLLLLLLLLLLLLKKJJJJJKLMMLLKKLMNNMLKLMLKKKLLMNNMMMNKLMMNMLLKKKLMNOPPPOMMOPONNNMMMMNMMMNNMMMMMNNNNMMNNNOOPPPOONNNNNNNNNNNMMMNNOONNMLLMNONNNNNNMMNOOOMNNMMLMNNNNNMMLLLMOOONNNOOPPOOOONOPPPPONNNNNNOPPPPOOOOPPOOONNNNOOOOOPQSTUXYY[\^b`hpuxz~~ ywtqnlihgghjmpstwxyzzz|}|~ ~|{zwutttttuvxyzz{|}~}zttqy{z|zuqqtvwwxxxyz|~ }{} tlc^YURRQQQQQQQQQQQQQQRRQPQQRRQQPPPPPPPPPPPPPPPPPOOONNNNPPPPPPPPPQQPPPPPQQQQQQQQPPQPPPQQSRRQPPPOPPPPPPPPPPPPPPPPPPPPQQPPQPPPQPPPPPPPPPQQQRRRRQPPOOPPPPPPPPPPPPPPPPPQRRQPPPPOOOOPPPPOOOOOPPPPPPQQQQQQQQQQPPOOPPOOPPPOOPPPPPPPQPPPPPPPNNOPPPPPPPPPPPPPPPPPOOONOOPPPPPQQQPPPPPONNNOPPPPPPONNNNNNMLKNNOPPONOPPPPPPPOPPPPNNOOPPQPPPPPPOOPQRRRPPOPRSRPOOOOPONNOOPPPPPPPPPPPPQRRPOPRSPNNOPPPQPPMOPPPPQQQQQRQPPOPPOOPPPPOOPPQQRRPQQRTUTQKKKJJIJJJJJKLLLKNMLKJJJILLLKJIIIIJJJKKJJLKKJJJJLLJJIJKLLJKKLKKJJJJJJJJJJJKKKJJJJJJIIIIJJJJJJJJKLKJJJJKKJNNMLKJJIJJJJJKKKJJJKKKKKKJJJJJJIKKKKKJJJKKJKLLLKJJKKKLNOLLLKKJJJLLKKJKKKMMLKJJJKMLKJJJLLJJJKLLKJLLLKJJJKKLLMLLKJKKKKJJJJLLLMMMMLLLLLLLKKJKKKKKLMNMLJJKLLNMLMNOONLKJJJKLLMMMMMMMLLLMMMLLKKKLLLLJJLKKKKKLMLLLLLLLMMNNNMMMNONMLLLLLMMNNMMMMLMNNNMMMLLLLLKKKJJKKKKKKJJKKLMMMMMLLKJKKMMMMNNNNMMLLLLLMJJJKLMNNNNMLLLMMNNNNNMMMONNNNNNNNNNNNMMMNNOOOONNNNOOONMLNNNNNNNNONNNNONNNNNNMMMMNMMMNNNMNNNOOOOONOOONMLMMMMNNOOOPPPPPPPPPPOOPPPOOOOOOPPPPPPONNOOONNONMOQOPQPQSVVY[]abbcegkptvyz{ ~zyxuplijkmpty|}~ |zxwvuttuwzz}z{{{}}z}|wuz}|}|wroqtuuxxxxyy{~~}}~ zrle\VVVRSSQQRPPPPQQPPOPPPQQQPPPPPPPPPPPPPPPPPPPPOONNOOPQQQQQPPRQPPPPPPRQPPPQRRRQPPPPQRRQPPQQPOPPPPPPQQQPPOOPPPOPPPPPPQQQQQQQPPOOOPPPPPQQQQRQPPPOOOPPPPPPPPPPQQSQPPPPPPPPPPPPPOPPPOOOOPPPQPPPPPQQQQPPPPOONNOOPPPPPPPPPPPPPPQRQQQQPPPPPPQQQPPPPRPPPPQQQPPPPPQQPPPPPQQPPPPPPOOOOPPOOPPPPPOPPONNNOPPPPNNOPPPPQRRRQQPOMMNPPPOOOPPPNPPOPPPPPPPPQRRQPRRQQQPPOPPPQQQQQRPPPPPQPPOPRSPNMNOPPPPPQPPPPPPPQPQQRRQPPQPPPPPPPOPPQQRQQRRQPPQRSJJJJIIJJKJJJKLLLLKKJJJJJJKKJJJJJJJJJKJJJJJJJJKLNLKJJJKKLJKKKKKJJJJJJJJJJJJJJJJJJIIJJJJJJJJJJJJJKLKJJJKKJMMMLLKJJJJJJJKKKKKKJJJJJJJJJJJJJKKKKKJJJKJJJKLKKKKLLKLMOLKKKJJJJKKKKKKKLLLLJJJJJLKJJJJJJJJJKLLKJJKKKJJJJKKLLLKKJJKKJJJJJKKLLLLLLLMMMMLKKJJKKKKLLMLKJJKLLMLLLMNNNLKJJKLLLLLMMLLLLLLMMMLLKLLLMMLKJKKKKKKKKKKKLLMMMNNNNMLLMNNMMLLLLMNNNMMMMMMNNMMNOMMLKKKKKKKKKKKKKKKKLLLMMMMMLLLLMNNNNNNNNMMMLLLMMKKKLLMMNMMLLLMMNNNMMMMMMONNNNNNNNNNNNNNNNNNNNNMMNNNOONNMMMMMMMMNNNNNOONNNNNNNNMMNMMMNNNNMMNNNNNNOPPONMLLMMMNNNOOMNOOOOOPPPPPPPONMMMNNOOOPPPPONOOONNNNNOPPPQSVY\^abceeefhknruwy{|~~ zzyxyz} }{zzzyxwwyz{zxwyz~zz~ }|~xqnptvxxwxyyxz{|||~ {ulaZYVSSTRRRQPPPPPPONPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOPPPPPQQQPPQQQQQQPPQPPPPQQQQQPPPPQQSQPQRRQPPPPPPPPQPPPPPPPPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPOOPPQQPQPPPPPPPPPOOPPPPOOPPPPPPONNNOPPPPPPPPOOPPPPPPPPPOOOOOPPPPPOOPPPPPPPPQQQPPPPPPPPPQQQPPPPPPPPPQQPPPPPPQQPPPPQQQQPPPPPPPPPPPPOPPPPPOOONMMNNPPPPPPPPPPQRRRRRQPNMLMOPPOOOPPPNOOPPPPPPPPPPPPPPPPPOOOPPOOPQQQQQPPOPPPPPPPQSSQOMOPQQQPPPPPPPQPPPPQQRRQPPPPPPPPPPPPQRRRRRQQPPPQSSKJJJIJJLLKJJJLMMJJJJJJJJJJJJIJKLKJJJJJJIJJJJKKMNLKJJKKKJJJKKKKJJKKKJJJJJIJJJJIIJIIJJJJJJJJKKKJJJKJJJJJJJKKLLLLLKJJJJJKKKLLKJJJJJKJJJKKLKKKKKJJJJKJJJKKKKKLLKKKLMLLKKJJJJJJJKKKLLLLLJJJJJKKKKKJJIJJJJKKJJJJKKJJJJJJKKKKJJJJKJJJJJKKKKKKKKLLMMLLKJJJJJJJJKLKJJJKLMLLKLLMMMLKJJKLLLKLMLKJKKLLMMMLLKLLLLMLKJJJKLKKJJJJKMMNNNNNNMLKKKMMMMMMMLMMNMLLKLLMMLLMNONMLKJJKKLLLKKKKKLLLLLLLLLMMMLLMNNNNMMMMMMMNNNMMMLLLLMMNNMLLLMNNONNMLLLMNNNMMMMMMMMMMMNNNNNNNMMLLNNNNNNNNLLLLLMMMMMNNOONNNNNNNNNNNNMNNONNMMNNOOOOPPPPNMMMMMMMNNNOLMNOOOPPQPPPPPONMMMNNNOOPPPPONNOOOONOPPPSQQVY\_chhhjjklnqsuwyz|~~~ }|{{|{zzz{|}zutuy~zx{ ~ztqruxzxwwxxwxy||}~ ~}|}zpc]\YUSTSRRPPPPPOOONPPPPPPPPPPPPPPPPPPPPPPPPPPPOOPPPPPPPPPPQPQQRQQPPPPPPPQPPQPPPPPPQRQPPQRQPPPPPPPPPPPPQQQPPPQQQPPPPPPOOOPPPQQQPPPPPPPOOOPPPOOOPPQQQQQPPOOPPOONNNOOOOOOPPPPPNNNNOPPPPPPPPPPPOOPPPPPPOOOOPPPPQPPPPPPPPPPPPPPPPPPQQQQPRRRQPPPPPPPPPQPPPPPPPPPPPQQQQQQPPPPPPPPPPPPPPPPPOOONNMNNOOPPQQPPPPQQRRQQRPOMMNPQPPOPPPPNNOPPPPPPPPPPPPPONNMMMOPPPPPQQQQQPOPPPPPOQPQSSPONOPRRRPPPOPQRRQPPPPPQQPPPPPQQQPPOPPPQRRRRPPPPQQRSLLKJJJLMLKJJKLLMJJJJJJJKJJIIIJKLKKJJJJJJJKKKKKKLLLKKLKJJJJJKKKKJKKKJJJJJIIJIIHIIHIJJJJJIJKLLLKKKJIHHIJJJKKKLLLLLJJJJJKKKLKJJJJJKLKJKLLLLKKKJJJJJKKKKKKKKKKKJJKLLMMLLLKKKJJKKLKKKMMLKJJJKLLMMLKJIJJJKKKJJJJKLKKJKJJJKKKKJJJKKJJKKKKKKLLLLJKLLKJJJIJJJJIJJKKJJKKLMLLLLLMMMLKJJJKKKJLMMKJJLLLLMMLLLJJJKLLKJKKKKKKJJJJLMNNNNMMMLKJJJLMMNNMMMLMMLKJJJKKLKKKMMNMLKKKKKLLLLLLLLLLMLLKKLLLMLLLLMLLLLLLLLMNNONNMLMMMMNNNONNNNNOOPOOMLLLMNMMLLLLLLLLMMMMMMOOONNMLLMMMMMNOOLLLLLMMMLLMNOPOONNNNNOOONNNNOOONNNOOPPPPPPPPONNNMMMMNNOOMNOPPPPPPPPPPPONNNNOOOOOOPPPOONNNOONOPQPSQSX\_dkponpqqsuvwzz|} ~|{z{|{{|}~{urtx~zvz}zz{||{zxwwwvwy|}~ ~~}}}~}{zzzyxy{~wlgg`YVVUSSQPPPOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOPPPPPPPPPQPPPPPPPPQPPPQPPPPPPPPPPPPPPPPPPPPPPPOOPPOPPPQPPPPQQPPPPPPPPOPPQQRQQQQPPPPPNMNNOOOOPPPQQQPPPOOOOPOONNNOOOOOPPPPPPPPOOOOOOQQQPPPPPNOOPPPPPOPPPPPPPQPPPPQPPPPPPPPPPOPPQRRQQQQQQPPPOPPPPPPPPOOOOOOOOPPPPPPPPPOOOOPPPPPPPPQPPPPPPOOOOOOPPPPPPPPPQQQPPRQPPPPQQQPPPPPOMMOPPPPPPPPPPPPOOMMNNOPPRRRRRQQPPPPPPPPPPPPPQQPOOOPQQQPPPPQRRRQPOOOPPPPONPPQRQPPOOPPPQQQQPPPPPQQRMLLKJJLMKKJJKLLLJJJJJJJJJJJIIJKLKJJJJJJJKKKKJJJJLKKLLKJJJJJJKKKKKKKJJJJJHIIIHHIIHIJJJJJIJJKLKKJJJIHHJJKKLLLLLLLLJJJJJKKKLKJJJJJKMLKKLLLLJJJJJJJJLLLLLLLLLKKJKKLLLLLLLLKKJKKLKKKJMMLKJJJKKLMMLKJHJJKKKKKKJKLLKKKKJJJKKKKKJKKKKKKLLLLLLLMMJKLKJJJJJJJJJJJJKKKKKLMMLLLMLLMMLKJJJJJJKLNMKJKLLLLLMLLLJJJJKLLKLLLKKKKLKKLMNNMMMMMMLKKKLLMMNNMMLMMMKJJJJKLLLKKKLLLMMLLKMMMMLLLLLLMLKKLLLMMMLKKLKLLLLLLLMNNOONMLLLMNNOOOOOONNNOOPONMLLMMMMMLLLLMMMMMMNNNOONNMMLLMMMMMNOPMMMMMMMNLLLNOPPPNNNOOOOOONNNOOONNOOPPPPPPPPPPOOPNNNNNOOOOPPPPPPPPOOOPPPOPPOOOOONOPPPOONNNOONOQRRSTX_cfnvyxvwwvwyyz|~ ~}~ ~|{zz{{|}~|vstyzxz~{ywwvwxz~ |zzzyyyzz{} |zywvuttuwz~ {tpoi`ZYVUTQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOPPPPPPPPPQPPPPPQRRQQQQPPOPPPPPPPPPOOOPPPPPPPONNOOOOPPPPPPPPPPPOOPPPPPPPQRQQQQQQQQPPNMMNNNNOPPPPPPPPOOOOPPPPPOOOOPPPPPPPPPPPPPPOOOQQPPPPPPOOPPPPPPPPPQQQQQPPOOPPPOPPPPPOOOOPPQRRQQPPPQQPPPPPOPPPPPPPOONNOOPPPPPPPPPOOOOPPPPPPPPQPPPPPPPPPOOPPPOPPRPPQQQQQPQQQQQQQQRRQQPPNMMNPPPPPPPPPPOONNNOPPPQRSTSSSRQPPPPOOOPPPOOOPPPPPPPQQPPPQSSRQPPPPOOPPPPONPPPQPPONOOPPPPQQPPPPPQQQKKKKJJKLLKKKKLKKJJJJIIIHJJJJIJJKJJJJKKJJJJJJIIJJKKKKLLJJJJJJJJJJJJJJJJJJIIJIIIIJJJJJJJJJIJJJJJJJJJIIJKLLMMMMMLLLJJJJJKKKMMLKJJJJMLLLLMLLJJJJJKKKLMMMLLLLMLKKLLLLKKKKKKKKKKLLKKKKKKKJJJJKKKLLKJJIJJKLLKKLJKKKJJJKKKKKKKKKKKLLKKLLLLLLLMMMLLMKJJJKKKLKJJJKLLLLLLLLLMMMMLMMLKJJJJJJKLMMLLLMLLLLLLLLKJJKLMMLMMLKKLLMLLLMMMLLMMNMLLLMLLLMMMMMMNNMLKKKKLMMLLKKKLMNNMLLMMMMMMMMLLMLKKKLMNNNLLLLLLLMMMNNMMNNNMMLKLMMNOOOOONNNMMMPONMMMMMNNNNMMNNNNNNOOOONNMMLLLLMMMMMNOONNNNNNOOMLLMOPPPOOOOOOOOONNNOOONNOOOOOOOOPPPPPPPOONNNOOPPPPPPOOOONNOOPPOOOOONNNNOOPPONNOONOPPQTVX\bgilszzzyzzz{||} ~}||}~~|zzzz{} ~}|||}}~~|wuwz{zz| |zwwwxz{ ~zyxwwvvwyz~ ~zxvtsrrrtw{~{z{qe\ZVTRPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQPPPPPRSRQPPPPPPPPPPPPPPPPPPPPPPPPONNNOOPPPOOPPPPPPPOOOPPPPPPPQQPPPPPPQQPPOOOONNOOPPPPPPOOOOOPPPPPPPOPPPQQPPPPPPPPPPPPPPPPPPPPOOPPPPPPPPQQQQQQQQPPOOPPPPPPPPPOOPOPPQQQQQPPPPQQQPPPPPPPPPQPPPOOPPQQQQQQQQPPPPPPPPPPPPPPPPPPPPPPONPPQPOOPSQQRRRRQQPPPQQPPPRRRQPPNMMNPPOOPPPQQQPPPPOPRRRRRSSSRRRRQQOONNMNPPOOPPPPPRQRRQQQRSUTRPPPPPPPPQPPOOOOPPPONMPPPPPQQQQPPPPQQQJJKKKLLMMLKJJKKKJJJJJIIIJJJJJJJKKJJKKKJJIIIHHHIJJJJKKLKJJJJJJJJJJJJJJJJJJJJJIJJJKKKKJJJJIJJJJJKLLJJIJJKKLLLLLKKJJJJJJKKKMMLLKKJJLLKKLMMMIJJJJKLLLMMMLKLLNMLKKKKJJJJKKLLLLKKKKLLLKKKJJJKKKKKKJJJJJKLLLKKLLLKKJJKKKKKKKKKKKKLLKKKLLLLLLLLMMMMKJJJLLLLLKJJKLLLLLKKKLMMMMLLMLKKKLLLLLLMMMMMMLLLLLLMMLKJJKLLKLLLLLLMMLLLLLLLLLMMLKKKLLLLLLLMMMMNMLKKKKLLLLLLLMMNNNMMMMMMMMNNNLMNMKJJKLMMMLLLLMMMMMMMMMMMMMMLLKLMMNNNNNNNNNMMMNMMMMMNNOONNNNNNOOOOOONNMMLLLLLLLLMMNNOOOOOOOOOOONMMNOOOPPOOOOOONNNNOOONOOOOOOOONOPOONOOOONNNNOOPPPPOONNONNNOOONNNNNNNNNOOPONNOOPNOQRRV\aejmnptxzzz| ~|zzyxyzyxvwxyzz| }~~~~~|zyz{{zxy} |zwwxzz|~ |{zyyywvxz| {yusqqrsuy{~ xj_\XVTRQQPPPPPPPPPQQPPPOOOOOOOOPPPPPPPPPPPPPPPOPPQQQQPPPPPPPPQRQPPPPPPPPPPPPPPPQQQQQQRRPPPONNOPQQPPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPOPOOOOOPPPPPPPPPPQQQPPPPPPPPPPPPPPPPOOPPONPPPQQRRRRRQPPPQQQPPPPPPPPPPPPOPPPPPPPPQQPPPPQQQPPPPPPQQQRRQPPPPQQQQQQQQQPPPPPPPPPPOPPPPPPPOPPPONPQQQPPQQQQRRRQQPPPPPPPPPQQRQQPONMNPPOOPPQRSRQQQQPQRRPPQSRRQQQQPPNNNNNNOPPPPPPPQSRRSRQQQQSRQPOOPPQQQQQPPOPPPPPOONPPPPPQQQQQPPPQRSIJKLMMNOOMJJJJKLJJJJJJJJJJJJJJKKKKKKKJJIIIHGFGHIJJJJKLKKKJJJJJJJJJJJJKKKJJJJJJJKLLLKKKKKJJJKKKLMLJIHIIJJJJJJJJJJJJJJJKKKKLLLLLLKKKJKLMMMIIJJJKLLLLMLKKKLOMKJJJIIJJKKLLMMKKKKKLMMKKKKJKLMLKKKKKKKJJLLKKKLMMLKJJKMKKKJJJJJKKLKKKKLKKKKKKLLLMLJIIJKKLLKJJJJLLLLKKJJKLMMLLLLLKKLMNNNLLLMNNNMLLLLLLMMLKJJJJJJKLLMMMLLLKKKLLMMKKKKJJJJLLKKKLMMLLLLKJJJKKKJJKLMONNMMMMMMMMNNNNNMNNMKJJKJKLLLKKLNMMMMMLLMMMMLLLLLLMMNNMMOOOOONNNKLLMMNNONNMMMMMMNNNNNMMMMMMMMMMNLLMMNNNNOOOOPPPPPPNMMMNNPPPPOOOONNMNOOONPPPPPPOONNOONMMMONNMMNOOPPPPPONOOONNNNNMNNNNOOOOOOOONNOPQNPSSRW_ejoqsuxy~}~ ~~ }{zxwstvvuuvwxwwz}} }~~~|||{}}yzvuz {yxxzz{}} }zyzz{{zy{~ }zvsqrrtvz|~~~ pd`\ZXVQQQPPPOOOPPQQPPPOOOOOOOOOOPPPPQQPPPPOOONPPQRRQPPNNOOPPPPPOOOPPQRQQQPPQQQRRRRRRRRQPPOOOPPRRRRQQQQQQQQPPPQPPPPQPPPPPPPPPPPOPPQRRPOPPQQPPOOPPOOOPPPPPPPPPQRQPPPPPQQPPPPPPPPPPPPPPPOPPPQRSSSSRQPPPPPPPPPPPPPOPPPPOPPPPPPPPPPPPPPPQQPPPPPPQQQRRQPPPPQQQQQQQQQPPPOOOOPPOOPPPPPPPPPPPONRQRRRRQPPPQQQPPPQPONNPPQPPQQQPPOMNOONNPPPPQQPPPPQQQPOOPRRRQPPPOOMNOPOOOPPPPPPPPSQRSSRPPPQQPPOOOPQQQQQPONPPPPPPPPOOOPPPPQQQPPQRSTHIJKLLLKNMKJJJJJJJJJKKJJKKJJJKMOOMKJJJJJJJIHHIJJKLLLKJJJJJJJJKJJJJJKJKKLJJJJJJKLLLMLLKKKJJJJKLNNMLJJJJJJKKJJJJKLJJJJJJJKMLJJJKKKKKKKKLMMJJJJJJKLLLLLLKKLJJJKKKKKKKJJKKKKJJKKLLMMKKLLLKKKKKLLLLKKKKKKKKJJJKLLLKJJKKKJJJJJLLLLLLLLLLLLMLKJKMNMJIIJMMMLLKKJMMMMLKJJLMMMLKKLLNNMLMMMNMMNOPNMNMMMMMNNKJJJJKJJLKKKMNMKLLMMLLMNNMLLLLLLMMLLLLMMNMLKJJJJLLLKKKLLNNNNNMMMLMNNMLLMMMLLLLLLMNNMKJJKKLMNMMMNNNMMLKKKLLMNNNMMOOOOPPOONNNMMMMMOONNMMMMMNNNMMMNNNNNNNNNONMMOPPPPOOOOOOOOOOOOOOONOOONNNOPPPPOONNOOOOPPONMNONLLLMNNNNNNNNPPOONNOOPPPPPOOOOOOOOOPPQOOQRQQRSPRVWZahptyzzz} }}~~ ~{zyxvssssttuvutuwz|}}~~}{|{zwuwtqqyzxuwyz|} }} zwwwwxz} zpgfe\\TTRPOQQOPPQQPPPQPPPPPPPOPPPPPPPPPPPPPPPPPQRRRQPPPPPPPPPQPPPPPQRQQQQQQQPPRSSRQQQQPPPPOPPRRSSTSRQPPPPPQQQQPPQRQQPPPPPPPOOOQQQRSSRQOPPPPPPPPPPPPPPPPPPPPQPPQPPPPQQPRRQPPOOPPPPRRRPPPPQRRSSSTSQPPPPPQRRRPPPPPPPONNOOOOOOPQQPQPPQRRRQQQPPPPQQSRQPPPPPRRRQQQQPPPPPNMNOPPPPPPPPQQPOOOOOQQQQQQRRPPPPPPPPQPPONOOPPQRQPPPQPPPPPPPPPPPPPPPPSRQPPPPQSRQQPPPQPPPPPPPPQPPPPPPPSSSSRQPPPPOOOPPPRQQRSSRPPPRSRQQPSQPPPPPPPQRQPPQRJJKKKKKKLKJJJJIHJJJKKLKJKKKKKKMNNMKJJJJJJIIIIIIJJKKKJJJJJIIJJKKKJJKKKKLLKLLKJJJJLMMMLKKKLKKKLMNNLKJJJJJJKKKJJJJJKKKKKLLMMLKJKKJJKKKKKLMMJJIIIJKLLLLLLKKKJJJJJKKKKJJJJKJJJJJJJJKKLLMNNMMLKLLLLLLKKKKKKJJJMMLLKJIHIIJJJJKLNMMMMMMMKKKLMLKJJLNNKJKLLLLLLKKKLMMMLLKJJKMMLLKKLMNMLMNMNMMNOONLNNNOONNNLKJJKKKKKJJKMNMLLMMMMLMMNNMMLLLLLLLLLLLLNMMLKKKKLMMLLLMNNNNNMMNNLMMMLKKKLLLLLLMMMNNMLKLLLMMMMMMNNNMMLLKKLMMNNMMMNNNOPOONNNMMMMMMONNNMMMMLMMMLLMNOOOPPPPPNMMNOPOONNNNNNNONNNNNNNNNNONNMNNOOOOONNNOOOOPPONMMNNMMMMNNOOOOOOONNMMMMNPPPPPOOONOOOOOPPPPPPRRSTUTUXZ]gqvxz{{| ~}~ }{zywusrqqrttutttuyz||~~~~|zzzxvuttqqw~xutvyz|~ ~ }{{{{|~}} }zvwq`XXWTQPPPOPPQPPPPPPPQQRQQQPPPPPPPPPPQQPPPQQQRRQQPPOOOPPPQQQPPPPQQQPQQQQQPPQQQRRRRQPPPPPPRTRRSSSRQPPPPPQQQQPQQQQPPOPPPPPPPPQPPQRRQPPPQQPPPPPQRRQQQQPPPPPQQQQPPOPPPPPQQPPOOOPPQRRRQPPPPQRRRRSRQPPPPPRSSSQPPPQQPPOOOPOPOOPQQPPPPPPQPPQPPPPPPQRRQQPPPPPPPQQQQQPPPPOOOPPPPPPPPQQQPPPPPPQQQQQQQQPPPPPPQRPPOONOPPPPQPPPPPQPPPPPPPOOPPPPPPSRRQPPPPSRRQQPPPPPPPPPPPQPPPPPQPQRRRQQPPOOOOPPPPQQQRSRRQPQRSRQPPRSSRPPPQPPPQQRSTJJJJIIJJKKKKKJJHJJJKLLKJJKLLLLLMMLKKKJJJIJJJJJJIIIJJJJJKIIIJJKKKJJKKKKLLLLLKJJIJKLMLLKKKLLLKLLMMLKJJJJJJKKKJJIIJJJJJJKLLLLKKKKJJKKKKKLLMKJJJJJLMKKKKKKKKIIJJJKKKKKJJKKKJJJJJJJJILMNOONNMLLLLLLLLLLLLKKJJMMLKJJIHHHIIJJLMNNMMMMMMJJKLMLKJJLNNLKLMKKLLLLKKLLMMMMLLJKLMLLKKLMNMLMNMNMLMNNMLLMNNNNLLLKKJKKLLJJJJKMMMMMNMMLMMNNNMMLLLKKLLLLLLMMMMLLLKMMMMMMNNNMMMMMNNMMMMLKKKLLLLLMNNMMNNMMMMMMMMLLMNNMMMMLLLMMMNNMMLMMNOOONLNNMMMMMNNNNMMNNNLLLLKLMNOOOOOPPPMNNOPONMNMMMNNNONNNNNNNNNOOONNNNOOOOONNNOOOOPPONLLMNOONMNNNOOOPPNMMLLMMMNOOPPPOONOOOOOPPPPQQTWZZWVX[\`kv||||}~ ~~~~~ }{zxvtsqnnqtttutttwyzz|||||~ |zxwvuustsqu} }xtssvy{~ }zyz} ~{h_]YUSQPPPPQQQPPPPOPPPPPPPPPPPPPPPPQRRPPPRQQQQQPPPOOOPPQQRQPPPPQQPPPPPQPPPPPPQSSRPPPPPPPRSRRRRRQPPPPPPQQQQQQQQPPOOPPPPPPPPQQQQRQPPPQQQQPPPQRSRRQRRPPPPQQRRQPPPPPPPPPQQPPPPPPPQQQPPPPPQQQRRRQQPPPPPRSSRQQPQRRRPPOOOOPOOPPPPPPPPPPPPQPPPPPPPRRQQQPPPPPPPPQQQQQQPPPPPPPPPPPPQPPQQQQQQQQQQPPPPOPPPPPQRPPPOOPPPPPPQPPPPQQQPPPOPPPPPPPPPQRRRQPOOQQQQPPPPPPPPPPPPPOOOPPPPPQQQQPPPNNOPPPPPPQRRRRRRRRRRQPPPRUVVSPQSQPPPPQQQIIJIHIJLKKKKKJJJJJJJKKKJJKLMLLKKMLLKJJIHIJJKKJJIHHHHHHJJJJJJJJJJJKKKKKKLJKKJJJJJKKLLKJJJKKKKKLLLLKKJJJJJKKLKJJJJJJJJJJJKJKKKKKJJKKKKLLLLNMKJJJKKKJJJKKKKJJJJKKLLMLLLMMLKKKJJJJJJJKMNNNMLMLLKKLLMMMMMLLLLLKKJJJJJJJJJJJKLMMLLLLLLKKLMMLKJKLMMLKKLLLLLLLLKLLMMMMMMKLLLLKKKLMMMMNNNNMLLMMMLLLMNMMLKLKJJJKKKJJJJKLMMMNNNMMMMMMMNMMLLKKLLLKKJJKLLMLLLLMNNMMNONNMMMMMNMMMMMLLLLLLLMMMNLMMNNNNNMMMMLLMNMMMMMMMMMMNNNMLLLMNOPOMLNMMMMMNNNNMMMNNNMMLKKKMNMMNNNNNNNOOOOONNOOOOOOOOOOOOOOOOOPPPONOOOOOOOONNOONOOOONMMMOPPNLMMMNNOOONNNMMNNONOOPPPPOOOOOOOPPOQRTY_bb\[\]^blt~~~~~ ~~ ~}~}{zxvusqnnpsuvxwvvwxyzzzzyyz }zywuttstsrt| ~ytrrtwz~ }zz| |nhb\VUSPPQRRRRPPPPOOOPPPPPPPPPPPPPPQRQPPPQQQPPPPPPPPPPPPQQQPPPPPPPPPPPPPPPPPPQSSRPPPPOOPPQQQQQQQPPPPPPQQQQRQQPPPOOPPPPPPPPQQRRRRQPPQRRQQPQQRRRQQQQPPPPPQRRRQPPPPPPPPQQQPPPPPPPPPPOPPPPQQQQQQQPPPPPPQQQPPPPQQQPPOOOPPPOPPPPPPPPPPPPQQPPPPPPQQRRQPPPPPPPPQQQPQRRPPPRPPPPOOPPPPQQQQQPPPPPPPPPNOOPPPPQPPPPPPPPPPQRRQQQQRRQPOOPQQQPPPPPPQRRQPPPOPPPPPPOPPPPPPPPONNNNOPPQQQQQPPONOOPPPPPPQSSRQRSRRRQPPPPSVXWURRSRQPPPPPPJJJJIJKMKJJJJJJJJJJKLLLKJLMNMLLKLLLKJJJJJJKLLKJJJJIHHHJJJJJJJJJJKKKKJJJKJJJJJJJJKLMMLKJJJJJKLLLLMLLKJJJJJKKKKJJJKKKJJJJJJJJKKKKJKKKLLLLLMLJJJJJJKJJJKLLKLLLLLLLLMMMMMMLLKKKKKKKKJKLMMMLKLLKKKKLLLLLLMMMMKKJJJKKLLLLKJKLLLLLLLLLLMMNNMLJJKLMMMMMLMMMMMLLKLLMMNNNNNMLKJKKKLMMMMOONNMLLLLLLNNNNNMMMLLKKKKLLLKKKLLMMMNNNMMMMKLLMMMMLLLLLKKJJJJKLMMMMMNOONNOPOONMMMMMMLLLMMMMMMMMMMMMLLMMNNNNMMMMLLMNMMMMMMMMMMNNNMLLLMNOPONLMMMMMNNNNMMMNNNONNMLKKLMNNNNNOOOPPOONNOOPPPOOONNOOOOOOOOOPPPONOOOOOOOOOOOONNOOONNNNOPPNLMMMNNOOOOONNOOPPOOPPPPPPOPPPOOPPPQSV\cgfcbbbdgms{}~~ ~~ ~|{{|}~~{zxwwtsrpqsvy{zywwwwwyyywvx} }|zwttstssv} {uqpqtz} }} }qoic]YVRQSRRRRPPPPPPQPPPPPPPPPPQQQRQPPQQPPPPPPPPQQPPPPPPPPQPPPPPPPPPPPPPPPPPPQSSQPPPOOOPPPQQPPPPPPPPPPQQQQQPPPPPPPPPPPPPPPQQRRQQPPPPQRQQQQQQRQPPQQPPPPPPQQQQPPPPPPPPQRQPPPPPPPPPPOPPPPPPPQRRQQPPPPPPPPPPPPPPQPPOOPPPPOOPPPPPPPPPPPQQQQQQPPQQRRQPPPPPPPPPQQPRTSPPQSPPPPOOPPQQRRQQPPPPPPPPPPOOPPPPPPQQQPPPPPPPQRRRQPQQRQPPPPRQQQQQQRRRRPPOOPNOPPPPPPPPPPPPPPPOOONOOPRRRRQPPOOOPPPPPOQRSSRQRSSSSRQQRRSUVVVTSRQPPQRSSSMLJJIIJJKKKJJJJKKKJKLMMMLMNNNMMMKKLKKKLLKKKKKKKKKKKJIIJJJIJJKLLKLLLLJJJJJJJJJIIJLMNNMLLKJJKLLMMMLMLLKJJJJKKKKKKLLKKJJJJJJJJJJJKLLLLLLKKKJJJJJKKLKJJJKLLLMMMMMMMMMLLMMMKJKKKLLLMMKKLLMLLLLLKKKKLLKKKKLLMMLLKKKKKKLLLLKLMNLLLLLMMNNNNNLKJJKLMNOOOONNNNMLLKLLMMMNNNOMKJJJKLLMMMNPPONMLLLLLMNNNMMMMMMMMLLLMMNNNNNNMMMMNMMLMMKKLLMMMMMMLLKKJJKKLMNNNONOPPPOPPOOONMMLLLKKKLLLLMMMMMLLLLLLMNNNMMMMMLLMNMMMMMMMMMMMNNMMLMMNOPONMMMMMMNNONMMMNNNOOONMLLMNPPPPPPPPPPPONNOPOOOOONNMNNNNNNNNNOOONNNNNOOOPPPOOONNOOONOOOPPOMLNNNOOOPPOONNOOPPPPPPPPPPOPPPOOPPQRTV\bhikjiklmpsz|~~ ~ ~|zzzzz{~|zyyxtuutttx{}|zywvvuwxwutvz~~ }zwvttttz}zuqqsw{ {tohaZTRSQQRQPPOORQQQPPPPPPPPQQQQSQPPQQPNPPPPPPQQQQPPPPPPQPPPPPPPPPPPPPPPQPPQRRPPPPOPPQRRQPPPPPPPPPPPQQQQPPPPPPPPOPPPPPPPPPPQPPPPOPQQQQQQRRRQPPQQPPPPPPPQPPPPOOPPPQQQPPPPPPPQQQPPPPPPPPQQQRRQQPPOOPPPOPPPPQQQPPPPPPPOOPPOPPQPPPPPQQRRQQPPQQQQPPPPPPPPPPPPPRTSPPQSPPPPOPPQRRRRRQPPPPPPPPPPPPPPPQPPQQQQQQPPPPPRRQPPPPQQPPQQPPPPQRRSSSRPNMNOOPPPPPPPPPPPPPPPPPPPOOPPRRRRQPPOOPPPPPPPRRRRRRRRSSSSRRSSSSTUUUSQRQQQQRRRMKIIIIIHKLLLKKKLLKJJKMNNMMMMLLLMKKKKJJLMKKJJJJKKLLLKJJJJJJJJKLLLNNNLKJJJJKKJJJJJLMNNMLLKJKKLLLLLKKLLKJKKJKKJJJKLKKJJJJJJJJJIIJKMMMLLLKJJJJKKLLLLKJJJKMMLLLLLLLLLLLLLLLKJJJKKLLLMLLLLLLLLKKKKKKKKKJJKKLLLMMMLLLLLLLLLKLMNLLLLMNNONONMKKKKLLMNPPPOMMNMMMLLMMMMMMMNNLJJJKLLMNNNOPPPNNMLKLLMMMNNNMLKMMMLLLMNNNOONNMMLMMMMLMMMMLLLLMMMMLLKKLLMMMMMMNNNOPPOOOOOOOOONMLLKKKLLLLMMMMMMLLLLMMNNMLLMMMMMMNMMMMLLLLLMMNNMMMMMNNOONMMMMMMNNONNMMMNNNOOOONNOPPPPPPOOOPPPPONOONNNOONNNNNNNNNNNNNONNMNNNNOOOPOOOONNNOOOOPPPONNNNNOOOOOONNNNOOPPPPPOOOOONOOPPPPQTUVX[`hpuuuttstwz|~ ~~ |zzywwxz|}}|zzywwwwwxz{}}{zywuuvvvttuy{~}}~|zzyzzz }zvssuz ~ ~}||~ ~{th]WTSQRRRQPPPPPPPPPPPPPPPPPPPRQPPPPPOOPPPPPPPQPPPPPPPPPPPPPPPPPPPPPPPPPPQQQPPPPOPPRRRPPPOOOPPPPPPQQQQPPPPPPPPOOOPPPPPOPPPPPPPPPQQPPPPRRRQPPPQQQQPPPPPPPPPOOPPQQQPPOOPPPQRRRPPPPPPPPQQPQQQQPPPOOOOOOPPPQRRQPPQPPPOOPPOPPPPPPPPQQRRQQPPPPPPPPPPPPPPPPPPQRSRQPQQPPPPOPPQRRRQQPPPPPPPPPPPPPPPQQQPPPPQQQQQPPQRRRPOPPPPQRRRRQQPPQRRRRRPNNOPPPPPPPPPPPPPPPPPPPPPOPPQPPQQQPPPOOOPPPQQRRQQQQQPQRRRQQQQSRRSSSRQRRQPPPPPMJIIJJJIJKLLKJJJKJJJJLMMLLKKJJKLLLKJIIJJKJJIIJJKKKKKJJJJKJJJKKKKOOOMLJJJJJKKJJJKKLMMMKKKJJKLLKJJJJKKKKKLKKKJJJKLLLKKKKKKLKJHGIKMMMMLLKJJJJJKKKJJKJJJKMMLJJJKKKLLLLLLMLKJJJJJKKLLLLLKKLLLJKKKKKKJLKKKKLLLMMMMMMMMLLLKKKKLKKKLMMNONNMLKJKLMMMNOONMLMMMMMLLMMMMMMMMLJJJJLLLMNNNOPPPONMLKKLMMNOPPNMKLMMLKKLMLMNNNMLLLLMMLLMNNNMLLLLMMMLKKLMNNNMLLLLLMNOONMMNNNOPOOMMNMLLLMLLMMMMMMMLMMMNONMLKLMNMMMNMMMLLLLLLLMNNNMMNMMNOONMLLLMMNOONNNMMNNNNOOOOOPPOONNNMMMNOPPONNNMMNOOOOOOOOOOOOONOOONNNOMNNOOOOOOONNNOOOOPPPONNONNNNNNNNONNNOPPPQPPONNNOMNOOPPQRVVY[[_lx}zxz|}}} }~~ ~|{yvuvwz|~}{zyyxxxyzz{~~}{zxvvvvuttuwz}||}~~}}} }zxttx| ~}||~ }|{zz| zl`YVTRSSSRQQRPPPPPPPPPPQPPPPOQRQQPPPPPPPPPPPPPPPPPPQQPPPPPPPPPPPQPPPPPPPPPPPQPPPPPPPPPPONNOPPPPPPQQQQPPPPPPPPOOOOOOOOOPPPPPPPPPQQPPOOQQQPPPPPRRRQPPPPPPPPPPPQQQQPONNOPPQRRQPOPPPPPQQRPPQQQQPPNNNNNOPPQQRRQPPPPPPOOPPOOPPPPPPPPQQRQPPPPPOONOOOPPPPPPPPRQQQRRQPPPOONOPQQQPPPPPPPPPPPPPPPPPPQQPPOOPPQRRRPQRSSRPOPOOPRSSSUTSQPPPPPPPPOOPQPPPONNNOPPPPPPPPOOPOOOPQOPPPPPPPOOOOPQRSRQPPQQPPPPQPPPOORQQQRRRRPQQQPPQSJKKLKKKLMMNMLLLMJJJJJJKLKKKKKKKKLMLJIIJKJJJJIIJJKKLKJJJJKLLMMLKJJLMNMLJJJJKLLLLLMMMMMLLLJKKKKKLLKKLLLKJJIJKKKKKLMLKKKKKLLKKJJJKKMMMLLKJJLLLLLLKJKKKLLLKKKKJJKKKLMMLJIHJKLKKKKJJJLLLLLKKKLLKKJJJJJKKKKKKLKLLLLLMNLKJJKKJJLLKLNNNNNNNLKKMNNNMMMMMMLLLLLMMNNMMMLMMMJJIIJKLLMMMOPPONNMMLLLLLMMNOONLKLMMMMMLLKKLMMMLLLLMNNNMLMMMMMMMNNNMMMMNNNOOOONMLMNOPPONMNOOONMLLLLLLLMMNOONNNMMMNNNNNMLLNMMLMNOPPOONMMNPOOONNMNNNNNMMMMMLLLMMMMMNNMMMNNNOOOOOOOOPOOOONMMNNOOOOOOPPPQQPPPOOOOOONNPPPPONNMMNOOOOOPNNOPPPOOPPPPPONMLMNOONMMOONNOPPPPPPPONNNNOQTVVX[_behlotw~{{|~ ~ }zwvutx{~~}||{zyyzzzyzzzzyyyyxvtsrsuy}}}|{z{|} ~|zzz{| ~}|{zzyxz|~~}}}}~~|xwuuvux zpcYVXVVVUTRQQPPPQQQPPQPPPPPPPPQRQPPPPPPPPPPPPPPQQQQQQQPPPPPPQQPPPPPPOPPPPPPPPPQQQQPPPPPPPPPPPPPPQRSRQQPPOPPPPPPPPOOPQPPQQPPPPSRRQQPPPQQQQQPPPQQRRRRQQPPPPPPPPPPPPPPPPPPQRSRRQRQQPPPPPPPPPPPPPOOOOOPPPRRRQQPPPPPOOPPPOPPQQPPPPPQQQQPPPOPPPPPPOQQPPPPPQRQQPPPOONOPONNOPQQQQQQQQQQPPPPPOPPQQPQQPPPPPPPPQSSSSRRQPOOPQSTTTTTSSRQPPQPPOPPPPPPPPPPPPQQRRQQQQOOOOPPPPPPPPPPPPPPPPOPPQQQQPPPPPPPPPPPPPQRTSRRRSRQQRQPPPKLLLKKKLLMNNMLLMKJIIJJKKKJJJJJJJJJJIGGHJJJJIHHIJJJJKJJJJKKLLLLKKKLMMMKJJJJKLLLLLLLLLLLLKKLMLLKLLKKLLLKJJJJJKJJJKJJJKKLLMLLLLLLLLLLLLKKJJJJKKLKKJKKKLLLKKKKKKKKKKMMMKJJJLLLLLLLLLLLLLLKKKKJJJJJJJJKKKKKKLLLMMMMMNLKKKLLLKLLLLNNNNNNMLKKMNNMMMLMMMMMMMMMNNMMLLLLLLLKJJKLMMMMMMNONNMMMLLLLLLMMNNMLKLLMNNMMMLLMMMLLLLLMNNNMMMMMMMMLLNMMLLLMMNOOPPPOONOOOONMMLMNNMMLMLLLLLMMMOOOONNNNNNNNNMLLNMMMMNOOONNMLLNONOONMMMNNNNNMMMMKLLLMMLLNNNNNNOOOOOOOOOOPONNNNMMNNOOONNNOPPPPPPPOOOOOOOOPPPPPONNLMNOOOOPNNOOOOOOOOOOPPONNNNNNNNNONNNOPPPPPPPOOOPPRVXZ[^behnqtwz{~ ~zwtux{~}{zyyyxwyyyyyyyyvtsrqrtxzz{{{{{{|~ ~|{{{ }{zzyxwwwyzzzzxwwxzzxwttssutv} zoc[VUWVVTRQPQQQQQQQQQPPPPPPPOPPQQPPPQPPPPPPPPPQQQQQQQPPPPPPPPQPPPPPPOPPPPPPPQQQQQQPPPPPPPPQPPQPQRSSSSRQPPPPPPPPPPOOPPPPPPPPPPQQQQQQQQQQQQQQPPPPPPPPPPPPPQQQRRPPPPPPPPOPPQRRRRRQQPPPPPPPPPPPPPPPPPOPPPQRRRQPPPPONOPQPPQQRRQPPPQQQQPPPOPPPPPPPPQQQPPPPQQQQQQQPPPPPPONPPQQRRRRRRQPPPPPPOOPPPPPPPPPPPPPQRSSRRQPPPPPPQSTTSSSRRRRQQQPPPPPPPPPPPPPQQSSRQQPQRPOOPPPPPPPPPPPPPPPPPOOPQRRQQPPPPPPPPPPPQSRQPPQSUSRQRRPQRKLLKJJKLLMNNNMMMLJHHJKJJKJJIIIJJJJJJHHIJJJJJIHIIHIJJJJJJKKKKKKKKLLLLKJJJJJKLLLLLKKKLLKKKLLMMLKKKKKLMMLKKJKKKKKKKJJJKKLLLLLLLMLLLLLLKKKKKJJKLLKKJKKLLLKKKLKKKKKKKLMMLKJKLKLLLMMNNMLLKKLLLKKKKKJJJKKLLKKKLLMNMMMNNLKKLMMMLLLLLMNNNMMMLKLMMMMLLLLLLLLLMMMMMLLLKKLLLMLKKLLMMMLLLMNNMLLMMMMLLLLMLLKKKLLMNNNNNNMMLLLLLLLLMMMNNNMMMLLLKLLLKKLLMMNOPPPPPOOONNMLLJKLMMMMNMLLLLLMMOOONNNNNNNNNMMLLMMMMNNNNNNNMLLMNNNNMMLMMNNNNNMMLKLLLLLLLMMMMNNOONNNNOOOOPONMNNNMNOOONNMMNOOPPPPPPOONNOOOOPPPPONNLMNOOOPPONNNNNNNNNOOPPONOONNNNOOONNNOPPOOOPOOPPPTV\`cfjnuy} ~}||}~ ~zvvwz|}zyyxwvwwwxyyyzutqpoortvwxz{|||| }||}} }{yxwvvttuuutttssrsttsrppoqtuw| ~}}~~ ~}}}~ xmc_\Z^\YVTSSSQQQQPPPPPPPPPPOOPPPQPPPPPPPPPPPPQQQQRRQQPPPPPPPPPPPPPPPPPPPPPPPQQQQQQPPPPPPPQQPPQPPQRSSSRQPPPQQPQQPPPOPPPPPPOOOPPPQQRRRQQQQQRRQQPPPPPPPPPQQQQQQQPPPPPPPPOPPPPQQQRRQQQQQQPPPPPPPPQQPPPOOOPQRRRQPPONNOPPPPQRRQQPPPRQQPPPPPQQQQQQQQQQQPPPPPPQQQRRSSRRRQPPPPQQQRRRSSQQPPPPONOPPONOOOPPPQQQSTSSSRQPPPPPPQRSSRRQQQRRSSQQQQQQPPPPPPPPRRTTSQPPQRPPPPPPPPPPQQPPPQQQPONOPQSSRQPPPOPPPPPPQQRQPPQRSSRQPPPPPQJJJJJJKLNNNNMMMNLKJIJJKKLLKKJJJJKKKJJJJKKKKJJIJJIIIIIJJJKKJJKKKLLKJJJJJIJJKKLMLLJJJKKKKKKLLLKJJJKKLMMMLKLLMMMMMMJKKLKKJJJKKLLLKKMMLKKKKKJKLMMLKKKLLLLKLLLLKKKKKKLMMMLKLLKKKLLMMMMMLLLLMMMMNNNMLKKKLLKKKLMMNMMMMNLLLLMMMLKKLLMNNNNNMLLLLMLLLLLLLLJKKLLLLLLLKKKLLLNMLLLLLLLLLMMMMLLLMNNNMLLLLKKJJKKLLNOONMNMMLLLMMMMMLLMMNMMMMLLLLLLKKKLLLLMMNOOOONNNMMLLLJKLMMMNOMMMLLLLMONNMMLLKNNNNMMMLLMMNNNNMNNNNMMNONNNNMLMNNNOOONMLLLLLLLLLLLMMNNNNNNNNNOOOPOMMMMNNNNOOONNMOONNOPPPPOONNOOOOPPPPONMLMNOOOPPOONNNNNNOOOPPPOOOONNNNNNONNOOOOONOOOOPQRVZbjptx{| }{zzz{}~~~ ~~{xwxz|zzyxwvvvwyzzzwtqnnmnptuvy|~ }{{|}~ }|}|{zxvuttqqqqrqononnnnnnnnnnqwyz~ ~~~}~ ~}|{{z{ zoikmmkf_ZWVUTQPPPPPPPPPQQQPPPQQQQPPPPPPPOOPPPQQQRRRQQPPQQPPPOPPOPPPPPPPPPPPQQRRQQQPPPQPPQQQPPPPPPPQQQQPPPPPPPPPPPPPPPPPPONNOPPQRRRRQPPPPQQQRRPPPPPPPPQQPPPPPPQQQQQQQQQPPPPPPPRRRQQQQQQQQQQQPPQQPPPPOOPPQRRQPPPPOOPPPOPPPPPPPPRRQPPPPPQQQQQQQQQQQQPPPPPPQQRSSTSTTRQPPPPPPPPQQQRQQQPPNNPPPONOPPPPQQQRSTTTTSQPPPPPPPRRRRQQQQQRSTQQQRRRQPPPPPPPRRSSSRPPQRQQPPPPPPPQRQPPQRQQPONNPQTSSRPPPOOOOOPPQQPPPSUTRPPPPPPPPPJJJIIJKLNMLKKLLMKLLKJJKMLLMMLKJJJJJJJJJJJKKJJJJKKJIHHIJKKJJJKKKKLJJIJJJJKJJKLMLLJJJKKKKJJKLLLKKKJKLMMMLKLMMNOONNJKLLLKJJJJKKLKKKNMMLKJJJJKMMMLKKLLMLLKLMLLLKKKKLMMMMLLKKKKLLLLLLMMMLLMMNMNNOONMLKLLLKKKLLMMMLLLMMLLLLLLKKKLLMMNNOONMMLLLLLLLLLLLJKKLLLLLLLLLLLLLNNMLLLLLKLMNNMLLLMNOONNMLMLKJJJKKKLMNOMLMMLKLLMNNNMLLLMMMMMMMMMMLLLLLLMMMMMNNNNNNNNMMMMMLMMMMMNONMMLLLLLMMMLLLLLNNNMMMMMLMMNNNMMNNONNNNOOOONMMNNOOPPPONMMMLLLLLLLLMNNNNNMMNNNOOOPOMMMNNNNNOOPOONPONNNNOOOOONNOOPPPPPPNMLLMNOOOOPPOONNNOOPPPPPPONNNNNNNMMOOOOOOOONOOPPPRSX]gsz ~|zxvwwz|~}{{|}~~~~}} {zxz~|{zyxvvvwyzzzyvromkklttux{ ~|zz{}~ ~|zzzzxvttssqomnoomjjihhhjklnnosz|} ~~~~}|zzzyy{ zvy}vnc\YWURQPPPPPPPPQQQQPPPQQQQPPPPPPPOOPPPPQQQRQQQPPPPPPPOPOOPPPPPPPPPPPPQRQQQQPPPRRQQRQPPPPOPPPPPPPPPPPPPPPPPPPPPPPPPOPPQRSSSRQPPPPPPPQQQQPPPPPPPPPPPPPQQRRRRRRRRQQPPPPPPRRRRRRQQQQQQQQQQPPPPPPPOPPQRRQPPPPOOPPPPOOOOPPPPRRQQQRRSPPPPPPPPQQQQPPPPPPPQQRRSTTTSQQPPPPPPPPPPPQQQPPPOOPPONPPPPQRRRRRSSSSSQQQQQPPPQRRQRQQQQQRRPQRRRQQPPPPPPPQQPRSRQPQRRRQPPPPOPPQQQQRSQQQPNNPQTSSRQPPPOONOPQQPPOPUVUQOPPQRRQPPIJJJJJKLMLJJJJKKJLNMKKLMKKLLKKJJJJJJJJJKJJKJJJJKLKIHHIJKKKKKKKKKKJJJJKLKKKJKLMMLJJJKKKJJJLMMMLKKJKLMMMLKKLMNOONNJJKLMMLLKKLLLLLKNNMLKJJIJKLMLKKLLMMMKKLMLLLLLLLLMMMMMLLLMMMMMMMLMMMMMMMMLLMMMMLLLLLLKKKLLMMMLKLLMLKKLLKJKKLLLMNNOONNNMLKLMMMMLLLKLLLMMMMMMMLLLLLNNNMLLLMKLNNNMLLMMNNONNNMMMLKJKKLLLMNNMKLLKKKLMNNNMMLLMMLLMMMMMMLLLLMMMMNNNNNMMMNNOOOOOONNNNMMMNNMMMLLMMLLLMMNNNNNNMMMMMMMMNNMMMMNNNNNNNPPPONNOOOOPPOONNMMMLLLLMMMNOOOONMMNNNOOOONMMNNNNMNOPPPOOPOONNMNNOOOOOOOOPPPOONMMMNOOOOOPPPOOOOOOPPPPPPONMMNNNMMLOOPPOOOOOOPPPRTU[bmy ~}~~~~}zxvvwz{~}{z{}}~~}|{|~}zz~|zyxwwvwyzzyzvsonllmttvxz }{zz{~ }|{zywvvvvvttsssommnnlhgeccdgjlnpru{}~~~~~}||{{{}}{zxxxwx{ ~}uja\XURQQPPPPPPPPPPPPPPPPPPQQPPPPPPPPPPPPQQQQQQPPPPPPPPPPOPPPPPPPPPPPPPQQPPPPPPRRRRRRQPQQPPPQPPPPPPPQPPPPPPQQQPQQQPPPQRSSSSRQPPPPPPPPPPPPPPOOOOOPPPQRSSRRRRRRRRPPPPPQRRRRRRRRQQPQQQQQQQPPPPPPPPOPPQRQPPOOOOPPPQPOOPPPPPQQQRRRSSPPPPPPPPQQQQQPPPPPPPPQQQSSSRRQQQRRQQQPPPOPQQQQQQOPPOOPPPPQRRQQRRRRSRPPPQQQPPQRRQRRQQQPPPPPQQQPPPQQQQPPPPOPRQPPPQRQPPPPPPPPPPQQQQPQQPNNPPSRRRRQQQPPPPQRQQQPPSUSQPPPPRRQPPJJJJJJJJKJJJKLKKJKMMLLLLJJJJJJJJJJJJJKKKKKLKKJJKKJIIIJJJKKKLLKKJJIHIJLLLLKJKMMMLKKKKKKKJKLMMLKKKKLMMMMLLLLLNOONLKKLMMMMMLLLLKLLLMMMMLKJIJKLLLLMNLMMMKKLNLLLLLLLMNMMMMMMMMMMMMMMMLMMMMLLKKLLLLLMMLLMLKKKLLMMMLKKLLKKKKLKKJKLLLMMNNNMNNNMLMMMMMMLLLLLLLMMMNMMLLLLLMMMMLKLMLMMMLLLMMMMNNNNNMNONLKKLMMMNONLJLLLKKLLLMMMMMMMNMMMLLLLLLLMMMMNNOONNNMMMNNOPPPOOONNMLLLMMMMMMMMMLLMMMNNNNNMMMMMMMMMMMMMMMNOONNNOPPPPOOOPOOOOONNNMMLLLLLLMMNOOONNMMNNOOOOONNNNONNMNOPPONNOOONNMMMNNOOPOOOOONNNNNNMNOOONOOOOOPPPOOOOOOPPONMMMMMMNNOPPPPOOPOPPQRTVX^fs} ~||~ ~{zzz{}~~|zyyzz{~~|{{}}}~}zz{ }|~~{zzyxwxzzzyyurpoooptvyz| }{zzz} ~~~|z{zzxutssstuvvutttrooonkhdba`bfjnpstw{}|~~~}|} ~}zyyyxxyzzywvvuux| ~~~ypg^XUTQQPPPPQQPQPPPOPPPPPPQQPPPPPPPPPPPPPQQQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQRRQPRRQQRQPPPPPPPPPPPPPPQQPPPPPPPPQQRRQQQQQQPPPPPPPPOOOPPOOOPPPPQRSSQRRRRRRQPPPPQQRRRRRRRQQPPPPPPPPPPPPPPPPPOPPQQQQQOOPPPPQQPPPPPPPPQQQRRRRRPPPPPPPPQQQQQPPPOPPPPPPPQQRRRRRRSSSRRRRROPQRRQQQPQQPPPPPPPQQQQQRRSSRPPPQRQPQQRRRQQRQQPOOOPPPPPPPPPQRQQPPOPQPNNOPPPPPQQQPQPPPPQPPPQQPONOPQQRRRSSSQPPPQRQPQPOQRPPQPOPPPPPQIJJJIHHIJJKMNNMKJJKMMMKJJJIHHIJJJJJJJJKKMMMMLKKKJJIIJJJJKKLLLKJJIHGHJLLKLKJKMNMLKKKKKKKJKLMMLJJJLLMNNMLLMMMNOOMLMMMMMMLLMLKKKKKLLLMMMKJIJKLMLMOPLMNMKKLNLLLLLLMMNMMMNNOOLLMMMMMMLLMMMLKJLLLMMNNNLLMLKKKLMMMMLKKLKKJKLLLKJKLLLLMNMLLMNNMLMMNNNMMLLLKKKLMMNMMLLKKKKKLKKJKLMMLKJKMNMMMMMMMMMOPOMKKLNMMNOOLJLLLLKKKKKLLMMNNNMMMLLKKKLLMMMMNNNNNMMMMMMNOPPONMNNMLKKLMMMMMMMMMNNNMMLLLNNMMMMMNMMMMMMMMNOPPPOOPPPPPOOOPOONNNNNNMMLLKKLLLLMNNNMLMMNNOOOPONNOOONMNNOOONMLOOOONNMMMNOPPPONNNMMMNOONNOOONNONOOPPPOOMMNOPPOONMMLLMNOOPPPPOOPOPPRTVXZ_hv ~}|zyyz{ ~{ywwyzz|}}{zz{z{~|z{|||}}~~{zy{ }|}~~~}~~}|{zyxyzzzxvtqqqrsttx{}~ {zzz{~ |zzzxwyzyurppqqsvxxxwwttrrpnjhba^]_dinruwy||{}|||||} ~|{ywvvuuvwwutttttx} {zti_WUTPPPPPPPQRRQPPPPQQQPPQPPOPPPPPPPPPPPPQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQPPPPQRQQRRRRRQPOPOOOPPPPPPPQQQPOMNOOOPPPPPPPQQRRPPPPOOOPNOOPPPPPPPPPPPPPQQQRRQQQQQQQQQQQRRRRRQPPPPPPPPPPQQQQQPPPOPPPQQQQPPPPPPPPPPOOPPPPPPQQQQPPQPPPPPPQQQQQQPPPOOOPPPPPPQQRSSSRSSSSSSSSPQSSRQPPQSSRQPPOOPQQQQQRTTTSPPPQRQQQQRRRQQQQQPONOOPPPOPPPPQRRQPPPPPOLLNPPOOPQRRRRPPPPPPNOPRQONOPPQQRSSTTRPPPPQPPPOOQRPOPRPPPPPRTLJKLIGIIJJKLNONMLLLLLKJJJJJJKKKJJJJJJJKLLLMMMMLKJKKKJJJJJJLMMKJJJJJJKKLMKJJKMMLKMMMLKJKLLLLLLMMMNNOOONMLLLLKJKLMMMNNNNMMNMLKKKKKNLLLMMLJJKLMMNNNNNMLKJJKLLMMMMLKMMNPPPOMMMMLLLMMLLLLLLKKKKLMMNNOLLLMMMMMMMMMMMLLKKKKKLLLMLLLLLLMMMMMMNNNMMMMMMMMKLLKKLMNONMLLLLLLKKKKLLMLLLLMMMLNNNMMLKJMNNMMLMNONNOPPONOMLKKLKKLLLMMNNONNMMMLLLMMMMLMMNOOONNMLLLLLMMNNNOOOOONNNNNMMMMMNNNMMMLLLMMMMMMMMNNMLLMMNNNOONNOOQPOOONMMMMMNNNNNLLLMMMMMMMMLLLLLMMMNNOOPPPOONNOOOOOOOONNNNNNNMMMNNNNOOOONNNNNNNNOOOOONNNONNOPPPOOONNMMMMNMMMMMNNPPPOPPPPPTUSW`dbmrz {{{zzyxx{~~}} ~|zwvvwxyz{{|~~|||{|~}{|~}|z{zzz|}~|{zzzzywwutttuwx{}}~ ~~ }zvtssswwvtpljinruwxyxvtssttpicb`^^bhpuxy{|}|{z{zyz|~ zuttstuvwuspqsuxz{}}~zytpk`WTRRQQPPPPPRSSRQQRTRQPPPPPPPPPPPPPPPPPQQQQPPPOOPPPPSQPPPQPPPPPPPPPOPPPPQPPPQQQQQQRRQQQRRQQQQPOOOPPOPPQRRQPOOPPPPPPPQQRRRRRRQQQQPPPPPPPPQRRQQPOPPQQPPPPQQRSSRQQQQQQRSRPPQQQQPPPPPPPPRQPOOPPPQQQQQQRRQPPPPPPOPPQPPOOOPPPQQQPPPQQQPPQRPQRQPPPPOOPPQQPPPPQRSTTTRSRQQRRPRRSSSRRRQRSSQPONPPPPQRRQTTSRPPQRQRSSRRRSRRQQQQQQNNOPPQPPQQQQQQQRPPPPOOOOPPPPPQRRQPPPPNOPQPPPPNOQPPQRSSSSTSQPPPQQQPPPQQPOPPPQQSSTPKKKIIJJJJKMNNMLKKKKKKKKJJJKKLKKKKJJJJKKLLLLLKKKJKKKJJKLLKKLLJJKKKKKKLMMLKJJLMLKKKLLKKLMLLLMMMMMOOOPOONNLLLKKKLMMMNNNNMMNMLKLLKKNMLMNMLJKLLMMNNNNMLKKJKKLLMMMLKKLMNOPPONNNMLLLLLLLLLLLKKLLMMNNOOMMMMMNNNLLLMLLLKJKKLLMNNMMMMMMMMLMMMMMMMMMMMMMLLKLLLKLMMMLLLKKKKKKKKLLKKLKKKLMMLONNNMMLLMNNNMLMMNNNNOPONOMLLLMMLLLMMNNOOONNMMMMMMNNMMLMNONNNNMMMMMMNNOOOOOOOOONNNOOOOONNMMMMMMMMMMMMNNNNONMMMMMNMNOONNOPQPOPPNMNMMMMLLLLMMMMMMMMMMMMMNNNNNNOOOOOPPONNNOOOOOOONNNNNNNNNNMNNNNOOOOOOOOOOOOOOOOOONNONNNOPPOOONNMMMMNMMMMNNNPPOOOPPPTUVY_fln{|} ~}|zzzzzyxxz{}~}} ~}}{yvttttxz|}~}|||{|~}~~~~}{| ~}zzwwwxz|~~}|{zxwuuuvxyyy~ ~|yusrrrtttqnjhhmqtuvwvttttutqkfccbdgmsvyz{}}|{zywxz|~ |xwxvttuuspoqsuwyz{||~~zxurokbZWTRRQPPPPQQRSRQQRSRQPPPPPPPPPPPPPPPPPPQQPPPPOOPPPPRPPPPQQPPPPPPPPPPPPQQQPPRRRRRRRRQQQRRRQQQPPPPPPPPPPQQPPOPPPPPPPQPPQQQQRRQQQPPPPPPPPPQRQQQPPPPQPPPPPPPPPPQQQQQQQQQQPPPPQQPPPPPPPPRQPOOPPPQRRRRQPPPPPPPPPPPPQPPPPPPQQRRQQPRRRQPPQSRRSRQPPPPPPPPPPPPQRSSSSSSSRQQRRPQQRSSRRQRRRQPPPPQQQQRSSSSSSRQQRSQRSSRRRRQQQQQQQQPPPPQQQPQQQRRRRRSRPPOOPPPPPPPQQRRQPPPNOPPPPPONOQQQRRRRRRTSSRRQQPRQPQRQPOPPPPPPQQRMKKJJKJKKKMMMLLKKKKKKKKJJJKLLLLLLKKKKLLKKKJJJJKJKKKKKLMMKJKKJKLMMMLMMMMLKJJKLKKJKLLLLLLLLMMNNMMNNNMMMMMKLLLKKLLMMMMMMMMMLLLMLLKMMLMNMKJLLLMMMLLMLKKKKKKLLLLLLKKLLMNOPOOONMLLKKKKKLLLLLLLLMMMMNNMMMMMNNNLLLLLLKKLLLLMMNNMMMMMMMMLLLLLMMMMMMMLLLLKLLMLLMMLLLLLLLLLLMMNMMLKJJJKLMMONNNMMMMMMNNNMMMMMMNOPOONMLLMMMMMMMNNNOOMMLLLLMMNNNNMMMNNNNNMMMMNNNNNNNNOOOOOOOONOPPPONMLLLLMMMMLMMNNOOOOONNMMMNNNOOOOPPQPOPPONONNMMLLKKMMMMMMMMMMMNNOOOOOOOOOOOPOOOOOOPOOOONNNNMMMNNNNNNNNNOOOOOOOOOOOOPPPOOONNNNNNOPOONNNMMMMMNNMMNNNNOOOOPPQRWUWahnt| ~~~}|zzyzz{zzzzyzz}}||}}||zxusrrrvz~ ~|{z{{{{}{|}~~}|{}~~|} |zxttttxz~}zyxvwy{||zy} }{wtqqqqstsolhhhlorttttsttuvurmihhhknsvxzz|}}|zywvxz} ~zvwuropprtvwyzzz{|~ }zxusqpkb]ZUSRQQPQQQQRRRQPQRRQPPPPPPPPPPPPPPPPPPPPPPPPOOPPPPPPPPPQQQRQPPPQQPPPPPPPPPRRRRRRRRPQQQRRRQPPPPPPPOPPPPPPPPPPPPPPPQPPPPPPQQRRQQQPPPPPPPQQQQRQPPPPPPPPPQQPPPPPQRRQPPPPPPPPPQPPPPPPPPPPPOOPPPRSSSRPPOPPPPPPPPQQQPPPPPQQRRRRQQTSRQPPRSSSSRQPPQPPPPPPPPPQRSSRRQRRRQQRRQPQRRSRQQRQQPPPPQRRRSSTTSRRRRQQRSQRSSRRRRQQQQQPPPQQQRRRQPQQQRRRSSTSQPOPPPPPPPPPPPPPPPPOOPOOPPONPQRRRRRRQQTTTTTRQPRQQRSRPOPPPPPPPPPMLLJKLJKKKLMMLKMMLKJJJJJJJKLMMLLKJJJKKKKKKJJJKKLLLLKLMNMKKKKKLMNNNMMMMMMKJJJKKKLLMMMLKKLMNNONNNKKKJJJKKKLLLLKKLMMMMMMMMLLLMNNMLMLKLLMLKMMMLLLKKLLKKKKLLLLLLLLKKMMMMNNOONNMLLKKKKKLLLLLLLLLLLLLLLLLMMMMMLLLLLLLLNNMMMLLLMLLLLLLMLLLLLLLLMMLLLLLLKLMNMMMMMMMNNMMLMMNNNNMMKJJJKMMNNMMMLMMMMNNONNMLLLMNOOPOMMLLLLLLMNNNNNNNLKKKKMNOOOONMMMNMMMMMMNNMMMMMMMMNNNNNNOONNOOOONMLLLLLLLLKKLMNOOPPPOONNNNOOPPOOPPPPPPPOOPOONNMMLLMMMMMMMMLMMMNNOONNNNNNNNPOOOPPPPNNNNNNNNMMMMNNNNNNNNOOOOPPPPPPPPPPPPOOONONNOOPPONNNMMMNNNNNNNNNNNOPPPPRUWW]isx} ~}}}}|{zyxxz{|||{{zzz|~}|{}~zzxusrrruz }{zyxyzyzz{|}~~|zyz{}~|zxttttx{~}||z|~~{yz{zzzy{ ~~ }{wtrqqrttsokhhjkmoqrrqqstvwurnlllnptvyyzz|}|{ywuuxz}~~yyvqorpqstvwxyzzz| {zxvtsqjb^ZSSSRQQQQQQRRRQQQRQQPPPPPPPPPPPPPOPPPPPPPPPPOOOPPPPPPPPPQQSRPPPPPPPPPPPPPPQQQQQQQQQQQRRQQQPPPPPPOOQPPPPPPQPPPPPPPPPPPPPPPPRRRRRRRRQPPPPQQQRQPPPQPPPPQRRRRQQQQQQPPPPPQPPPPQQQQQQQQQPPOOOPPPSSSRQPPOPPPPPPPPQQPPPPPQQQRRRQQPSSRQQQRRSSSRPPQQRQPPPPPPPPRRSRQQQQQPQSSRPQRSSSRRQQPPPPQSRRRSSSSSRRRQQQRRQRRRRRRRPPPPPPPPPPQQRQQPRRRRRRRRSRQPPPPPPPPPPPPPOONOOOOPOOPPPPPQSSRRRQQQSSTTSRQPQQQRSRPOPPPQQQQRLKLLJJMKKKKLMMLLMLKKJJKKJJJKLMMLKJIIJJJJKKKKJJKLMMMMLLLMLKKMMLLMNNMMMMMLMLJJJJKKLMMNNMLLMMNOOOONKKJJJJJKKKLLKKKKMLLLLLLMLLMMNNNMMLKKLMNOONNMMLLLLLKKLLMNMLLLLLLLNNMMLMMMMLLLLLLLLLLLLLLMLLLLLLLLLLLMMMMMMMMMMMMMOONNMMMLMLLLLLLMLLLLLLLLMMLLLLLLLMNONNNNNNNNNMLLLMMMMLLLKJJJKMNNMMMMMMMMMNNOONMLKLMNNOOONNMMLLLLMNNNNNMMLLLLMOPPPPPONMMNMMMMMMNNMMMMLLLLMMMMMMNNOONNNNNNMMMLLLLLKKLMNOOPPPPOOONNPPPPPOPPPPPPPOOPOONNNNMMMMMMMMMMMMNNNNNNMMMNNNNNOPPPPPPPNNNNNNNNMMMMMNNNNNNNOOOOPPPPPPPPPPPPOOONOOOOPPPPNNNNNNNNNNNNNNOOOOPQQPRVX]gs} ~}|{zz{{{{zyxwxz{|}}}}}||}~}|~zzyvtsrruz |zwvvvvvwx|}~~}{yxyzz|~~~~ ~|{zyxxz} zwwwuttru} ~}|} }zvttttttrnkhhhhjlnooqrstwwvtqpopqsuwyzzzz{{zxvttwz|}~~|{| zzwroqqrstvwwxyyz|{zxwutrkc`[TUTSRQQQQRRRRRQQRQPPPPPPPPPPPPPPOPPPPPPPPPPOOOPPOPPPPPPPPQPPPPQQQPPPPPPPPQQQQQQQQRRRRQQPPPPPPPPPOQPPPPPPQPPPPPPPPQQPPPPPPQQRRRRRSQPPPPPQQQPPPQQQQPPQRSSRRSRQPPPPPPQRRQPQRQQQQQQQQPPPOPPPPRRQPPPPPQQQQPPPPPPPPPPPQPQQQQPPPQQRRSRRQSSSRQQQRRQPPPPQQPPQRRRRQPPPPRTTSQRSSTTSSPQQQQQQRQRRRRRRRRQQQQQPPPQQQQQQPPPPPPPPPPPQQRRQQRRRRQQQQQQPQRRQPPPPPPOONPPOOOOOOOPPPPQRSRRRRQQQQRRRRQQQQPPPQSRPPPPPQQRRRJJLKJJMLKKKLLMLKJJJJKLLMJJJKLMLLLJJJJKJJKLLLKKLMMNNMLKKKKKLMNMLMMMMMMLLLLLKJJKKKLLMNOONNMMMNNNNNNMLLLLLLJKKKKJKKLLLLLLLLMMMMNONNNMLLLNOPPOONMMMMLLLLLMNNMMLLKLLLNNMMLKLLLLLLLLMMMLLLLMMMMMMMMLLLMMMMMNNNMMMMMMMMOOOOOOOOMMMMMMMMMMMLLLLLMMMMLLLLMMNNNNNONNNMMLLKMMNNNMMLLKKKLMNNNNNNNNNMMMMNNNMLKLMMNNNOOOONMMMMNNNNNMMLKKLMNOPPOOONMMMNMMMLMMNNNNNMMMMMMMLLLMMNOOONNNOONMMMLLLKLLMMNOPPPPPOOONNPPPPPOOPPOPPONNPNNNNNMMMMMMMMMNNOOOOOONNNNNNNOOOOPPPPPPPMMNNNNNNMMMMMMMMNNNNOOOOOOOOOOOOPPPPOOOOPOOOPPPPOOONNNNNNNNOOOOOPPQRRQUY^foy ~~}|{zyxzzzzyxxxxzz||}}~~~~~~}}{yusrrvz} }zwvuuutuw|}}}|{zyxxyz{{{{ ~}}~ zwutpnnknu }}{zz| ~{zyyyvtrnljhhhhhjlmorrtuvvtttsttttvxzzzyyzywuuuwz{|~|z{} ||{wttttttuwwwxxz~ {zywwtsohd_XWVUTRQQQRRRRRQQQPPPPPPPPPPPPPPPPPPPPPPPPQPPOOPOOPPPPPPPPPOPPQRSRQQQQQQQQRRRQQQQQRRRRQQPPQQQQPPPPPPPOOPPPQQPQQQQQRRQPPPPPPPPQQQQRPPPPPPPQQPPPQQRRPQQRRQQPTSQPPPPQQRSSRQQQPPPPPPPPPPPPPPPPQPPPPPQRRRRQPPPPPPPPPPPPPPQQQPPPPPQRSSQPSSSRRRRSRQPPQQRRPQQQRRRRPPPPRTTSRRSSSSSSQRRRRQQQQRSSRRQQRQQQRQPPPPPPPPPPPPPPPPPPPPQRRRRSRRRQQQQQPPPQRRQPOOOOOONNRRPPOONMPPQQQSTSRRRQQQQQQQPPPPPPOOOPRRPPOOPPPPQQJJJJIKNLLLKLLLKJHIJJKLLLKJJKLLLKLKJJKLLKJKLLKJKLLMMMKJJJJJKMMLLMKLLLLLLLKKKKKKKKLLLMOOONMLLLLMNNNNNMMLLLKKKJJJKKLLLKKLLLMMLLMNNNMMMMMNNOONNMLLLLLLKKLMMNMLLKKKLLLMMLLKLLKKKKLLMMNMMMMMMMMMMMMMMMMMMMMNNNLLLLLLMMNNNNNNNNMMMMMMMMMMMMMMMLMMMMMMLLMMNNMNNONMMLLLLLMNPPPONLLKKLLMMLNNOOONMMMLLLMMLKKLMMMMMNNOOOMMMNNOOONNMLKKLLMMMMNNNMLLLMMMLLLMNNNNNNNMMMNMMLLLMMNNNNNNNMMMMMMLLLLLMMNNOOONNNNNNNNOPPOOPPOOOPOMMONNNMMMMMLLMMMNNNOOOOOOOONNNNNNNNOOPPPPPOMMMMNNNNMMMMMMMMMNNNOOOPOOOOOOOOPPPPOOOOOOOOPPPPPPOONNNNNNOOOOOOPPQSTV\cmqw} }{zyzzzzyxyzzz{{|}~~|yvttwz|}~ |zwuuttvw|||||{{zyxxxyzzy}~ |ytqmkjhiq {zywwyzzz{||~ ~}}zxusqpnmjhhhhhknnprttuvvuvvuttwzzxwwwwvuvuvwxxz}~~~}||}~ |zxvuuuvwwvvz |zyxyuuuoic]ZYWVTRQQRRRRRQQPPPPPOOPPPPPPPPPPPPPPPPPPQPPOPPPOPOOPPQQPPPPQRSSRQQPPPQQQRRRQQQQQQQQRRQQQQRRQPPPQPPPOPPPPQQPQQRRQRQPPPPQQPPPPPPPPPPPPPPPQQQQQQQQRQQQQQQQQRQQPPQQRRRRRSRQPPPPPPPPPPPPPPPPPPPPPPPQQQQQPPOOOPPPPPQPPQQQRQQPPPPPQRRQPPQRRQQQRQPPPQRRRRRQQQQRRQQQPQSSRSRRQQRRSRSSRQPPPPQRRQQPQQQQRRRQPPPPPQQPPPPPPPQQQPQRSRRRSQQQQRRRRRQQQRRQPPOOONNNNRRQPPPOMPPQQQSTSSRRQQQQQRQQPPPPPOOOPQQPPOOPPPPPPKJJIILOKMLLLLKJJHHJJJKKKKJJKLLLKKJIIJKJJIJLLKJJKJKLLKJJJJJJLLLLMKKLLLMLLKKLLLKKKNMMMNNNMLLKJKLMMNMMMLKKJKKJJJJJKLLKKKKLLMLLLLMMMKLMMMLLKMLLKKKKKLKKKKLMNLLKJJKKLKLMLLKLMLLLKLLLMNNMMMMMMLLLLLLLLLLLMMMMMLKKKKLLMNNMMLLLLMLLLLLLMNNNMMMMMMMMMMMMMMMMMMMNOMMLLLLMMKMPQQPLJLLKLMMLKMMNOONLKMLKKKLKKLMMMMLMMMMNNMMMNOOPOONMLMMNNNMMLLMMLKKKLMMLLLMNNNNNNNMMMNNMLLLMMLMMNNMLKMMMMMMMMLLLLMMMNMMMMMMMMMNNOOOPPOOOONLMNOONNNMMMLLMMNNNOMMMNNNNNNNNNMMMMNOPPPPONMMMMNNNNMMMMMMMMMMNNOOOPNNNNNNNNPOOOOOOOOONOPPPPPPPOONNNNNOOOOOOPPPTV[dn||} }{zzzzzyzz{z{|||}} ~{yxyxzz{} ~{ywvuuvy{{{{{||}zyxwxxxx{|~~~~zsplklijq| {xvuuvvutwyz{{} }zxxvtrnkhgedfilmnpstvwwxxvttvzywuuvvutttsrqqsuz|}~~~~~ ~zywuuvvvtuz }{zyzwxztmf`\[XVUSRQRQQQQQPPPPPOOOPPPPPPPPPPQPPPPPPPRQPPPPPOPONPQSRQQQQRSRQPPPPPPPPPQQQQPPPPPPQQRRRRQQQPPPPQPPPPPPPQQPPPQQQPQPPPPQQRRQQQPPPPPPPPOPPQRRRQQPQQPPPQQRSSPPQQQRRRRRQRRRPOPPQQQQPPPPPPPPPPNOOPPPPPPQQPOOOOPOPPQQPPRRRRRQPPQQPPQQPPOPPPPPPPPPPPQRRRTSRQPQQRRRQPQSRQRRQPPQQRSSSRPPPPPQRRPPPPQQQRSSRQRQQQRRRQPPPPQQQQPQRSRQQRQQQRRSSSTSQQRRPPPPONNNOOPPPOPPPNPPQPQSTRSSRQPPPPRRRQPPOOPOOPPPPOPPPQQPPPJJJJJJJKNLJJKLKJJJKKLLLLJJKKJIKNLKKKKKJJJJKKKJJKKKKKKKKKLLKLMMMLKKKKLLLKKLMMNMMLMLLMNNMMMLKJJKNONMMLKKKLKKJJJKKLKKLLLLLLMMMLKKLNMMMMLLLMONLKJJKKLLLLLMNNMMMLLMMMLLKJJKLLKLLLKLMNMMMLLLMNMLKKKKLMMNNNMLLMLLMMLLMNNNNMLLLLKKLLMNNOPONMNNMMKMNNLKLNLLLMMMMMNNMMMMMMOOOPPOMKLLLLLLMMNNNNNNNNNMMMMLLLLLLMMMMMMMMMMMNNPOOOONNMMMMLLKLMMNNNLKJJMLLLMMNONNNMMMMMNMMMMMMNNNNNNNMMNNNMMMMMMMLLLLMMNNNMMMNNNNOOPPPPNOONNMMNNNNMMMMMLKKKMNNMMMMMMNNOONMLLMMNOOOOONNMMMNNNNMMNMMMMNNOMMMMNOPPNNOOONNMOOOOOOOOOOOOOPPPPPPOONNMNMNPPPPPPRUVX]hr| ~}}}}}~}~ ~|}|||~ }{zxwxyz|}}||}}{zzyyyyzz{|~~~||~ {tsnllikp} }zwuttsponrtuxz~}|~ }zxuurplfcedfehossuz{{zxvuvvrttqrtuttrppoopqv{}}~}~~~ ~|xtuwxvuuv{ }{{|{zyxxwuth`YYWSQTRQQQQQPPPPONNOPPPPPPPPPPQQQPPPPPPPPPPPPPPPPPPPQQRRRRQQPPQQPPPPQSSRRRRRRQQQRSSSRRRQPPPPOOPPPPQQQQPPPPRRRPQPPOOPQQRPPPPPPPPPPPQQQQSSQPPPPQPPPQQQPPPQQQQQRSQRSUSPPRQRRRQQQQPPQQPPPPPQRRQPPPPQRQPOPPQQRSSRQQRQPPQQQPQQQRRQPPPPPPPPPPPPPQQRRSSSSRQQPPQQQRRRRRSRPPQQQQRRSSRPPPPQRRQPQRQQQRRSSSRRRRRRPOPPPQQQPPQRSRQQQRSTTUVWWVTTTSRRQQPPPPPPOOSRPPPPPNQQRRRRRSSSSRRRQRTSQPPPPOPPQRRRQPQQQQRRQQJKKJJJJJKJJJKLLKKKLLLLLLJJJLLKKLLKKKLLKJIJKLMMMMLLKKKKKKMLLLMMMMLKKKLLLKKLLMMMMMMMMNNNLKJKKKKLMNNMLLKKLLLLKKKLLMLLLLLLLLLLLKKKKLMMNNMMNOMMLKKJKKKKKKLMNNMMLLLLMMLLKKKKLLKKLLKLLMMMMLKKLMMLKLLLMNMNNNMLLMKLMMLLMNNNMMMMLLKKKLMMNNONNNNNNMLMNNMLLMLLLLMMMMNNNMMMMNONOOPOMLLLLLLKKKLMMNNNMMMMMMLLLLMMMMMMMMNNNMMMMMOOONNMMMLMMMLLMNNNONMLKKLLLLLMMNONNMMMMMMMLLLLMMNNNNNNMMNNNNMMMMLLLMMNOONNNNNNNONNOOOOOONNNNMLMMMMMMMMMMMLLLNNONNNMMMNNNNMMLLLMMOOOOONNMMMNNNNNMNNMMMNOOOONNNNNNOOONNNNNNNNNNNNNNNNOOOPPOOOOOOOONMNPQQQRPRV[ahpv ~ ~}|{zzzz}}}{|}|zzzzzzzzz{|~~}|{{|}~ |vtpnnjko~ }zxusrpnnnqstwz} }||~ }zyrhcdcdcfmrsv{|{zxvttsonnorrrronnnnnnotz~~~}}~~}|~ ~zwttvvvvwz~ }}}|{{{|||{ne]ZVRQTRQQQQQPPPPPPOPPPPPPPPPPPPQQPPOOOQQQQPPPPQRRQPPPQRRRRRRRRRRQPPPQRRRRRRRQQRSSTTSSRSRQQQQPPPPPQQPPPPPPPPPPPPPPOPPPQQPPPPQQPPPPPPPPPRQQQQQQRQQQRRRQPQRRQQQRSRRTUSQQRTTTSRQQQPPPPPPPQSSTSRQQQPQQPPOPPQQRRSRRRQPPPPPPPPPPQQQPPPPPPPPPPPPPPQQRRQQQQQQQQRRRSSSRRSRQPQQQQRRSSQPPPOPPPOOPPPPQQQRQQRRRRSRQPPPPQQQQQPQRRQPPQPRTUVWVTSSSRRQQQQQQPPPPPRRQPPPPPPQQQQQRSSSSRRRQQRQPPPPPOPPQRRQQPQQQRSSRRKKKKJJJJJIIIJLLLLLMMMLLKKJJLMLKKJJJJKKKJIJLMNMMMLLLLLLKKLLLLLLMNLKKKKKKJKLLMMMMMMMNOONKJIJKMMMMMMMLKKKLLMLLKKLMNMMLLLLLLJKKKJJKKLMNNNNNOLLLKKKKKJJJKLMMNLLLLLLLLLLLLLLLLKKLLKKKLMMMLKKKLNLLMMMNPNNNNMLLLLLMNNMMNONMMNNMLLLLMNNOOMMMNOONMNNNNMMLLMLLLLLMMMMMMMMMNNNNOONMLLMMMLKKJLLMNONNNNNMMMMMMNMMMMMLLNNMMMMMLNNNNMMLLLLMMLMNOOOONMLLLLLMMMMMMONNMMLLLLLLLLLLLNNMMMNNNNNNNNMMMMMNOOOOOMMMMMNNNNOOPOONMMMMMLLLLLLMMMMNNMMMMNNONONNNNNNNMMMMMMMLOOOONNMMMNNOOONNNNNNNOOPOOOOONNNPOONNOPPOONNNNNNMNNOOOOOPPPOOOOONNOPQQRSTW\bjt{} ~~ ~~}||}}|{{{zzxyz{zz{{|}~~}|{zzz{} ~zxtqpmlo~ }{xurponnnqrtvz} }||} }uibbbcbelrtwz|zywvtpnmiinsqppnmlmnnnpvz}~~}|{{{} zwutuvwxz~ ~~|||}~~qjb[VTSSRQPPPQQPPPPPPPPPPPPPPPPPPPPPONNNPPPPQQQQRRRRQQQRRRQQQRRSRRRRQQQQRRRRQQQQSSTTSSRQRRQRRRRQPQQQQPPOPPPPPPPPPPPPPPPPQPPPPQQPPPPPPPPPPPPPQQQQRRRRSRQPRRRQPQRSRRSTRQQRUUUTRQQQRQPPOPQRSSSRPPPPPPPPPPPQRRRRRRSSPPPPPPPPOPPQQQQQPPPPPPPPPPPPQRRRQQQQRRRRQQRRRRRRSRQQQQQQRSSRQPPQQQQPPOPPPQQQQQQPQQRRSRQPPPPQQQQQPQRRQQPPPPRRSUTRRRRQQQQQQQPPPPPPPQPPPPPPPPQQPPQRRRRRQQPPPPPPPPPPPPQQQQQQPQRRSRRRKKLLLKKJJJIJJLLLLMMNNMLLLKKLLKJJJJJJKKKKJKMNNLKJLLLLLLKKKLLKJJLMLKJJKKJJKLLMMMMMLMNOONKJJKLMMMMMMMLLLLLMMLKKKLMMNMLLLLLMJJKKKKKKJKMMNMMMKLLLLLKKJJJKKLLMLLLLKKKKKLMMMMLKKLMMLKKKLMMLKKLMNMMNMMNPONNMMLLLMNOPPPOOONLMNONLMMNNOOOONMMMNNNNNMMNNNMLMMLKKLMMLLLLLLMMMMNNNNNMMMNNNMLKLMOPPOONONNNNNNNMMMMMMMMMMMMMMMMNNNNNMLLKLLLLLMNOOONMLMMMMNNNNNMNNMMMMMMLLLLLLLLNMMMMMNONNMMMMMMOOPPPPONLLMMMMNNOOPPONMMMMMMLLLLMMMMMMMMLLLLMMMMNNNNNNNNNNNOONNMNOOONNMMMNNOOOOONNNNNOOPNNOOPOOOOOOOOPPPOOOOOONNMNNOOOOOPPPPOONNPPPPQRSTW]bdku|~ ~~}}}{zzzywtvzz{{||~~~}|zzz{{}}{vsrnnp{|~|xurqonnnprtvz~ ~~~ }|ujddcdcgmsvxyzzxwvtokkikorrqponmmnnpsz}}~~{z{|}~}~ }zxwwwyz| }||}}~}}qlb[XWVSSQPPPQQQPPPOOOPPPPPPPPPPPPPPPOOOPPPPPPPPQQRRQRRSSRQQQQRRQRRRRRRQQQRRQQQRRRRRQQPPQQQQRRRQQQQQQPPOPPQQPPPPPPPPPPPPQQPPPPPPPPPPPPPPOPPPPPPPRRRRRRQPQQQPPPQRQQRRQPPQRSSRRQQRRRQPPPRSSRQPPOPPPPPPPPPQSRRRRRRSQQPPQQPPOOPPPPQRQQQPPPPPPPQQRRSSRSSSRRRRPPPQQQPPRRQQQQQRRRRQPPQQTTSRQPQRRRRRRQQPPQQRRRQPPPPPPPPPQQRSSRQQPPPOPQRRQQQQQQQQQPPOOOPPPPPPONOPPPPPPPPQQQQQPPPOPPPQQQPPQQQQQQQQPPQQQQQQLLLMMMLLLKKJKKKKLLMMNNMMMNMKJJJKLLLLMMMNLLMNNLJIKKKKKKKKKLLLKKLMLLKKLLKKKKLLMMMMLLMNONLKLMMNMMMNNMMLLLMMMMLLLLMNMMLLLMMNKKKLLLLLKKLMMMLKLLLLMLLLKKKKKKKLLLLLLKKKLLMNNMLLLMMMLKKKKLLLLLMNONNNMLMNONNMMMMMNOPPPPPOONLMOONLMNNOOONNONLLLMMNLMMNNNNMMMLKKLLMLLLLLMMNMMMMMMMNLMMNNNMLMNOPPONMNNNNNNNNLLMMNNOOMNNNNNNNOOOOONMLLLMLLLMNOOONMLMMMNNNNNMMMMMNNNNNMMMMMMMMMMMMMMNNMMMMMMMMOOPPPPONMMMNNNNNPPPPONNMMNNMMLLMNMMMMMMMLLMMMMMMMMNNNOOONNOOPOONOOOONNNMNNOOPPOONNNNNOOONNOOPOOOMNOPPPPPOOOOOOOONNOPPPOOPPPPOONNPPPQSVY[ahopry~}~ ~ ~}~~~~||zyxxwustxz{|}~~|zz|}}} }xsrpnrwz~}|wussrpooqtuwz ~{ytlhhfefiouxyxzxwwvsnihjlmnrrpnmklnotv~~||}~|{|}~}{{| ~{zzz{} ~}tmbZXXVSSRQPPQQQQPPNNOPPPPPPPPPPPQQQPPPQPPPPPPPPPQQQQQRSSRQPPPPQPQRRSSRRQQRRQQQRRRRQPPONPPQQRRRRQQQQQPPPPQQQPPPQPPPQQQQPQQQPPPOOPPPPPPPPPPPPQQPPSSRRRRQPQQQPPPPQPQQQPPQQQRRQQPPQRRRRQQRSRRQPPPPPPPPPPPQRTSSRRRRRRQQQQPPPOOONNOQSQQQPPPPQQQQQRRRRRRSSSRRRPPPPPPPPQQQQQQQRRRRQPPPQSSSRQQQRRRRRQQPPPQRSRRQQQQQQPPPPQQRRSRQQQQPPPQRRRRQQQQQQQPPPPPQRPPPPONOOPPPPPPPPQQRQQPPONOPPPPPPQQQPQQQRNOPQQQRSMMMMMMMLMMLKKKKKKLLLMMNNMONKIJKLLLLLLLMMLLMNNNLJJJJKKKKKLMMMMMMNMMLLMMMLKKLLLLMMLLLMNNMMNNNNMMNONMMLLLMMMNNNNNNNLLMMMMNNLLLLLMLLLLLMMMLLLLLLLMMMLLLKKKKKLLLLLLKKMMNNNNMMMMMMLKKKJKLLLMNOOOOOMKLNONMMMMMMNNOOPPPOONMMNNMLMMMNMMLLONLLLMMMKLMNNNNMMMLLKLLLLLLLMMNNMMMLLLMNLLMMMMMLMMNNNNMLNNNNNNNNLLMMNOOPOOOOOOOOOOPPPONMMNNNMMNOOONMLLMNMMMMMMLLMMNNNOOOMMNNNNMMMMMMMMMNMMMMMMMMMNOPPPOONOOOOPOOPPOONNNNNNONMMMMNNNNMMMMMNNNNMMNMMMNNOOOMNNOOONNOOOOONNNNNOPPPOONNNNOOOOOOOOONNNMMOPPPPPNNNNNNNNOPPPPPPOOOOOPPPPPQRTX_ehkt|~}~}|~ ~~}{zz{| }}~~~||zxwwvtstwz|}~~~~{{|}}} ~xtsrqsty~~}|{xuttsqpqrtvx{ |yvsnlkhhjnrwzzywvuuurlhfhjhjorpnlkmosw{}{yxz}}}}~~~}{zy{ ~~} ypc[WXVTTSQQQQQQRQPPOPPQQPPPPPPPPQQQQQRRQQQQPPPPQQQPPPPPSRQPPPPPPPQRSSRRPQRRQQRSRRRRQPOOPPRRRRSSQQPPPPPQPPPPPPPPPPQQQQQQQQQQPOOOQQQQQQPPQQQQQRRRTTSSSRQPRRSRQQQQPQRQQQQPRRRQPPPPQRSSSRRRRQQPOOPPPPPPPQRRSSSRRRQQRQPPPPPOQQQPPPRTPPPPPPPQQQQQQQQQPPQRRRRRPPPPPPPPPPQQPPQQRRRQPPPPRRRRRRRRQRQQQPPPQRSTSSRRSRRRQQPPQPPQQRQPQSTSSSSRRRRRRRQQPPPPPQRRQQQPPOPPPPPPPPPPRRSSRQPPMNOOOOPPQQQQQQQQNOPPQRTVONMMMMLKLLKJJJKKLKKKLMNOMNNLJKLLKKKKJJJKLLLMNNMKJJJJKKLLMMNNOONMMLLLMMMLKKLLLLMMMMLLMNNNMNOONNOONMLLKKLLMNNOOONNLMMNNNMMMLKKKLLLLKKLMNMMMLLLLLMMMMLLLLLLMMMMMLLKMNNNNNNMMMMLKKKLJKLLLLMNOOOOMLLNONMMMNNNNNMNOOONONNNMMMMMMMMLKJJLLLMNNMLKLNNMMMMLLLLLLLLLLLLLMMMMMMLKKMNMMMMMMMMMMMNNNMMNNNNNNNNLMMNNOOPPPOOONNNOOPPPOMMMNNNNNOPOONMLLMNNMMLLLLLNNOOOONNNNNNNNNNMMMMMMMMNNNMMMMMMMNNNNNNOOOPPPOOOONMMMNONOONNMMNNNNNNNNNNOOONNNNMMMNNNNNMNNNNNNNOOOOOONNNOOPPOONNNOOOOPPOONNNNNNNOOOOONNNNNNNNOOPPPPOOOONNNOOPPPPQSV]hptrw}~~}|} |{{zyyz{ ~~|{zxvwvtttvy{}|{|}~}{z{{{} ~}}}|}zvvututx|~~}|yvtsrqqqsuwx| xttropqpnqtuxzzyvvwyyvrnljhhjnpqnnnorty|~zwuuvz}}~~~~~}}|zywvy} ~~~{th`[WVUTSRRRRQPQQPPPPPPQQPPPPPPQQRRQQQRQQQQPPPPPPPPPOPPRRRQQPPPPPPQRRRQPRSRQQRSSSSSRPPOPQRSSRSSQQPPPPPPPPPPPPPPQQPPQQQQPQRQPPPPQQQQQQRRRRQQQRRSUTSRRRQPQRSSRQPPPQRQQRQPQQQQPPPPQRSSSRRRRRQPPOOPPPPPPQQRQRRRRRRQQQPQQQPPRSTSRQRSPPPPPQQQQQQPPPPPPPQRRRRQPPPPPPPPPPQPPPPQQRQQPPPPPQRSSTSSRRRRQQPPQRSTSRRRRRQQQQQQQQPPQRQQQTUUTTSRRRRRQQQQPPPPQQQQRQPPPPPPPPQPPPPQRSSSSQPONOOOOOPPPPQQQQQQPPQPPPRTPOMLLLKJJJJJJJKLLLKJKLMOMNMLMNNLLLLKJJJKLLLLMMLJJJJJKLLLMMMNOONLKJJKKLKKKKKLLLMMOMLKLMNNLMNOOOOOMMLKKKKKLMNOONMMMMNONMLLMLJJKKKKKJJKLMNMMLKKKLLMLLLLLMMMMMNNMMLLNNNNNNNNMMLKJJKLJKLLLLLMOOOPNLMOONMLMNNNNNMMNOOONNNNMLLMMMNMLKJJJKLNOOMKJMOOMLLMLLLLLLKKKKKKKKLLMMMKKKLNOONNMMMMMMMNNNOOOOOOOPPPMMMNNOOOOOONMLLLNOOPONMLLLMMMNOPOONMLLMNONMMLLLMOOOOONNMNNNOONNNMMNNNMLLNNNNNNNNNNNMMMLLNNOOOONNONLLLMNONOONNMMNMNNNNNOONOPONMMNMMNNNMMMNNNNNNOOPPPPOONNNOOPOONNOOOOPPPPMMMMNOPPPPONMMMMNNNOOOPPPPPOOOOOOOOOOOOOPQTW`lvz||~}~}{| ||{zzz|} ~ ~|{{}} ~||zxvwvttttwz|{zz|}~~{yyzz{}~|{{{|{}|yzywwvxz}~~zwtrqpprtvwx| |trssrtxyvyzyyzzzyz|~~{ytnjkmnoronnpstwzztportx{||}~~~|||zzwutw{ ~}}}ztng`YVVTTSSRRQPPPPQQPPOQQQPPPPPQQRQQPQQQQPPPPPOOPPPPPPQQRRRQQQPQPPPQRQPPRSSQQRSTTSSRQPPPPRRRRRSRQPONOPPQPOPPPPPQPPPPQQQPQRRQPPQQQRRRRRRQQPPPQRSTSRRQQPPQRSSRQPPOPQPQQPOOPPPPPPPRRSRRRRRUUTSQPPPPPPPPQQQPPQRSSRRQQQRRSRQPRTTRPPPQQQQQRRRRRRQQPPPRRRSRRQPPPPPPPPPPPPPPPPQQQQQPOOOOPPRSSSRRSSRRRQQPQSSRQPQPPPPPPQQSQPPQRRRSTTSRRSSRRRQQQQQRRRRSRRRQPPPPQPPPQQQPPPQQRSSRPPNOPPPOOPQPPQQQQQQSSRPNNOPNNMLLKKKNMLLLLLKLLLLLLLLMLLLMNMLKKLMMLLKLLLNNONMJJJJJKKKLMMNOPMJKLLLJJJJKKKKJKLNMLLLMMMMMMMNOONNMLLKKKKKMNOOONNOOOPSSPOONLKKLMMLMLKKKKLLKLLLLLMMNMMNNONMOONNMMMMMNOONNNNNMLLMMMLLLKKLLLMMMNNOONNMMLLLLMNOONNOPOONMMLLLLLMLKKLLLLMMMMOOOMMMLLLMMNMMLLMNMMKKKKKLLLNMLLLLLMOOPPONNNNMLLMNNNPPPPOOPPOOOOOOONNNNNMMLLNOOOONMMLMNOONOPPONNMMMNOOPOOOOPPPOONNNNNOOOOONMMMNNNNNNNOONNNOOPPNMMMNOONNMMNOOONMLMNNNOOOOONNNOOOPOONNNNNNNNNONOOOONNMNNOOOOPPOPPPONPPPPOOOONNNOPONMOPNNMMNOPPPPPOMMNONNNNOOPPPPPOOOPPNOONMNPRRUWZ`m{ ~}||}~ ~~ }{{} ~|{{zywxz| {wuvvuuvwzz{{|||}|{zxwvuu~{zzzz|}~}{zz|zz{|}~~~~~zvpnmnouvxz} ztrqtx| ~||}}} {wropqrqssstttuutqnnptz}}|zz{~~}~~|zzzxtty~ ~}|{|}~ypjhd]WXVVSQSTPPPPPOOOPQQQQQQPPQQQPPPQQPPQQPPPPQPOPPRRQSSRRRRRRPPQQPPPQRRSSSRRRRSSRQPPPQQQPPQQRQPPOPPPOPPPPPPPPRQPPPQQQQQRRRRSSQRRRQQQQQQRQPPPPSSSRQQQRRRRRQPPOPPPQQQQQRQPPQRRQSSRRRRSSRRRQQQPPPQQPPPPPPPQRSSRRSSRRQQPPQRSRPPPQPPQRSSQPRPPOPPQQSRRRRSRRPPPPPPPPPOOPQQPPPPPPOOOOPPPPPQQRQRSSRRRRSRQQQQQQQPPPPPQQQQRRRRRRRQQRSRRSRRQQRRPPRSTTSRRQPQRRRRRRRPPPQSTTSRQQQQQPPPPPOOOOPPPPPPQQRRQPPRY]LKKKKLLMMLLLLMMLMLLLLLLKLLLMNNMLLLLLLLKKKKLMNNNMLKKJJKKLNNMMNONKMMMMLLLMNNNMLMNOLLLMNNNMMMMNNNMLLKKKKKKKMNOOONNNNNPRRPPPOMLLMNMLMMLLLLLMLLLLKKKLMMMMNONNNNNMMMMMMNOONNNNNMLLMMMMKKKKKKLLLMMNOOOOMMLLLMNNONNOOPOONNMMLLLLLKKKLLMMMMMNOONNNNMMMMNNMLLLMMMLLLLLMMNNNMMLLLMMNOPPOOOONMLLMNNNPPPONNOONNNNNNNMNNNNMMMMOOOONNMMNNOPPOOPOONNNNNNOPPPOOPPPPPPOONNOOOPOONMNNNNNNOONOONNNNOPONNMNNONNMMNNOOPONNNOONNOOOOONNNNOOOONNOONNNNOONNNNNNNMMNNNOOOOOPPPOOPQPPOOOOONNOPONNOPONNMNNOPPPPONNNOOOONNOOOPPPOOPPPPPPONPQSVXZ\bmz }|}~ }zzxwx{~|zzywwwxz| ~zyyxuuvwyzzz{zz|}~~{zxvttssz |zzzz}~~}|||}}}}}}}}ysnknpuvxz} ~zvttuy} ~}~ |ywuttuttsrqpponnnpuz}{zxvwz|}~}}~~}{zzwttvz}~ }zzzy||~~zutsoe\YWVUQQQOPQQPPOOOPPPQQQQQPPPPPPPPRRRRRQQQRPPPQRRQRRRRRRRRPQQQQQQQRSSSRRRQQRRRPPPPQQPPPQQRQPPOPPPPQQPPPPQQQPPPPQQQRRRSSSSSRRRRRQQQQRRQPPPPQRSSRQQQSSRRQPPPPPPQQRRRRQQQRRRRRRRRQRRRSRRQQQQQQQQPPPPPPPQRSSSSRRRQQPPPPQRQPPPPPPQRSRQPPPPPPPPPPPRRQQQRRQPPPPPPPPPQRPPQPPPPPPPOPPPPQQRRQRSSRRRSRRQQQQRRSRRQQQQRQQQQRQQQRQQRRQPQRRRRSSRQSSSSQQPPQRSSRRRSRQPQRSSSRQQQQQQPPPPPOOOOPPPPQQQQRRRQQSVZKKKLLMMMLLLLMNMMMMLLLKKKKLMNOOMLMLLKKKKKJJJKMMMLNMKJJJKLMMLKLNMLMMNMMNOPONNLKKLMJKLMOONMMMMMMMLKJKKLLLKKLNOOONNNMMOPPPPPONMMNNMLMMMMMMMMLMMLKJJKLLLMNONNNMMMMMMMMNOONNNNMMLLMNNNLKKKKKKKLLMNNOOOLLLLLMMNONOOPPONNMMMLLLMLKJKLLMMMMNNNNNOOOONNNNNLLLLMMMLLLLLMNOONNMMLMMMNOPPOOOPNNMMMNNNOOOONMNNNNNNNNMMNNNNNMMMPPOONMMMOOOPONNONNNNOOONOPPPOOOPPPPOOONNOPPPONNMNNMMMNNOOOONNMNNOONNNNNOMMNNNOOOPPOOOONNNOOOOOOOONNNNNOOOONNNNNONNNMMMNNLMMMNNNONOPPOOPQPPPOPPOONOPONNOPPONMMNNOOPPPOOOOPPOONNNNPPPPPPPPPPPPOPRTVZ_bhqz ~ {yvusrruy|~}||}}~~~}}|zywwwvxz{} ~|zwwwxzzzzzzz{}}}}zywusrppw ~{zz{ ~}|||{{|{|~}vnknqtvxz} }zxwwy{~ }zxxwusqonlkklmnquz~}{xtuy{}|||}~{zxwutvy~|{|~~zywvvxyz|~~{yyzwlbZWWWTSTTRRRRPPOOPPPQQQQQPPPPPPPPRRRRRRQQQQPQRRQPQQQRRRRRQQQQRRRRSSRRRRQQPQQQPPPQQQPPPQQRPPPPPPPPQQPPPPQQPPPPQQQPQRRSSSSRRRRRRRQQQQQQPPPPPQSSSRRRRRRQQPPPPPPQQRSSSRRRSSSSQQQQQQQQRRQPPQQRQQQPPPPPPPPQRSSSRRQPPPPPPPQPPOPPPPPQRRQPPPPQQQPONPQQPPPRSRPPPPPPOOPQQPPPOPPPPPPPPPPPQQRRQRSSRRRSQQQQQRSTTSSRQQRRQRRRRRQQRQQRQPPPQPQQRRRRSSRQPPPPQRSSRRRRRRRRRSRRQPPQQQPPOOOPPPOOPPPPQQRRRSSRRRSTMMMMMMMMLLLMMNMLLLLLKKKKLLMNNNNMNMKJJJJKJJJJKKKKNMLKKKKKLLLKLNNLLLLLLMOPMMLKJJKLKKLMMNMMNNNNNMLJJKLMMMLKMNOPONNNNNNOOOOONMMNNNMLMMMNNNNNMMMLKKKKLLMMNNNNMMMMMMMMMNNNNMNNLLLLMMNNLLLKKKKKLMMNNOOOKKKKLLMMNNOOPPONMMMLLLLLMLKKKLLLMNOONNNOOOONNMMMLLLLLMLLLLKLLMNOONNMMMNNNOPPOOOPONNMMMNNNOOONNNOOOOOONNNNNNNNNNNPPONNNNNONNONMLMMNNOOONNNNOONNNOOOOONNMMOPPONMMMNMLLLLMNOOPONNNNNNNNNNNNNNNNNNNNOOOOONNNOOOOOOOOOONMMNNONNNNNNNNNNMMMMNNLLMMNNNONOPOOOPPPPPOOOOOOOOONNOPPONMMMNNOPPPPPOOPPOOONNNPPPPPPPPQQQRQQSUU]gntz~ ~}|{zzzzzwtvutttuxz{{zzzz{|{{|||{zz{{{zxwwwwxyz{~ |zzzzzzzz{{|}}~~}zzxvsqootz ~}~ }|{zzzzz{zsoptvxyz} |yyy{~ ~{{{xuspnmkiiknpsw{~~{wssw{}}}}~~zxvvwyz|}{zz{~~{yvtttuwy{}}zyzwoh]WVVSRSSRRRRQPPOPPQQQQPPPPPPPPPPPQQQQPPPPPPPQQPPQQQRRRRRSRQRSSSRSRRRRRQPPPPPPPQQQPPPPQQRQPPPPPPQPPPPPPPPPPPQQQQPPPPQRRQQRRRRRRQPPPPPPPPPPQRRRRRRQQQQPPPPPPPPQRSSSSRSSTTSQQQRRRQPQPPPPPQRQQQQPPPPPPPQRRRSRQPPPPPPPPPPPPPPPPPQRRQQQQQRSRQPPPQQPPQRRQPPPPPPOOPRTRPOPPQQRQQPPPPQQRRRQRRRRRRSQPPQRSTUSSRQQQRRSSSSSRRRRRRSRPPPPPPQQQQQRRRPOOPPQQRRQQQRSSSSSRRQPPPQRQPPOOPPQPPOPPPPPQQRSSRRQPPOMMMMMMLLMMLMMMLKKKKKLLLLMMMMMMNNNMKJJJKKKJJJKKKJLMMLLKJJKLMMNOOMLLLKKKMNMMMLKKLMLLLLKLLMOONNNNLKJKMNNNMLMNOPONNNNONNNNNMLLLMNNNMLLMMNNNNMMMMLLLMMNNNNMMMMMMMMMMMMNNNNMMNLLLLLMMNMMMLLLLLMNNNNNNNLLLLMMMNNNNOPPONMLLLLLLLNMLKLLLLMNOONNNONNNNMMMMLMMMLLLMMLLLLMMNOOONNNNNOOPOOOOPOONMMLMMNOOOOOOPOOOOOOOOMMMMNNNNOOONNOOPPNNNNLLMNNNONNMMMNNNNMNNNOOONNMMNOOOMLLMNMLLLLMMOPPPONNOMMNNOONNOOOONNMMNNNOOOOOOOOOOPPPPPNMMMNNOOOONNNNNNMMMMNNMMMMNNOOOPPPOOOOOOOOOOOOOOOONNOPOONMMNNOOPPQQPPOOOOOOOOOPPPPPPPQRRTVVUVY\epz ~|ywuuuttsssqqrsttvwwwvvwyz{zzzzzxwvxxyxvuuvuvvvwy} }}||{{zy{|}~~~~~{{zxtqnnqu{ }{z~ ~}{{zzzzz{ |xuvwz|}~ ~ zyxxyz} |zzz~ }{zzzzzz{xvspnmkijloruxz||ztpptz|~~~~~}zvtuxz~}zxxz{~~~|zyvttssuwz||zzxtpia[YVUUSRRRRQPPPPPQQQQQPRRRRRRRRPPPPPPPOOOPPQRQQQQRRRRRRSRQRSSSRSRQQRRQPPPPPQQRRQPPPPPQQRRQQPPPPQPPPPPPPPPQQQQPPPPPPQQQPQQQQRRQPPPPPPQQQRRRQQQRSRRQQQPPPQQPPPQQRTSSSTTTSRRRRSSRQPPPPPPQRRRQQQQPPPPPPPQQQRQQPPPPPPPPPPPPPQPPQRRRQQQQQRRRQRQPPPPQQRQPPPPPPQPQVWVRPQRRSSRQQPPPQQRRRQRRRQQQRQPPQRSTURRQQQRRSTTTSSRRQRRRSSQQRRRRRQQQRQQQPOOPQQRRRQQQRSSSSSRQQPPQQRRQPPPPQRRQPPPPQQRRRTSRQPPONJKKLMMMMNMLLLLKKKKKLLLMMMMMLLMNOMLKJJKLLNMLKLLLLLLMMMKJIJKLLMNMLMMMLKKLMMMMLLLMNNMLKKKLMOOOOONMLKLMNONMMNOOONNNNNOONMNMLKKLMMNNNLLLMMNNNMMNNMMMNNNONNMMMNMMMMMMMMNNNNMMNLLMMLLMNNNNMMMNNNNNONNNNNNNNNNNNNNNNOOONMLLLLLLLNMLLLLLLNNOONNNNMMMNMMMMMNNMMLLMNMMLLMNOPOOOOOOOOPPONNNOOONMLLMMNOPPOOPPNNNNNNNNLLMMNNNNOOOOOPPPPONNNMMMNNNNNMMMNNOONNNOOOPPPONNNOONMLLMNNMMMMMNOOPPONNOMMNNNNNNOOONNMMMNNOOOOPPPPOOOPPPPPONMMNNPPPPPOOONNNNNNNONNNNNOOOPPPPOOONOOOOONOOOOOONOOOONMMMNOOOOPQQQPONNOOOOOOPPPPPPQQQRVZ\\]ahox~ ~}|zwtrrqpnnnnnnpqqqrrrrrstvxyzyywvuttttuuttssqqqpqtx{ ~|{yx{|~~~~~|||zvqnmnqz |ywvy} ~}||{{zzyy{ }|||~|z|} }wtttuwz}~}}|zz| }||{zzxvvwxxxxvtqnlkjlnptvxyyywsootz}}|{yustwz~~~~~|zyyz|~~~}}{zxxwutrrrruwz|~}}}{zzxuqh`\ZYXUSRQQQQPPPPPQRRRRSSSSSRRRPPPPPPPPPPPQRRRSQQRRRRRQRRRRSSSRSQPPQRQPQPPPQRSSQQPPPPPQRRRRQPPQQQQPPPPPPPQQQPPQQPPPQRQPQPPPRRQPPPPPQRRQRRQQPQRSSSRRRRRRRQPPPPQRSSSSTTTSSRQRSSRQQQQQQRSSRRRRRRQPQPPPPPPPRRQQPPPPPPPPPQQQQQPQRRRRQPPPPQQQRQPPPPPPSRQQQQQQRQRVXVSPSSSSSRRQPPPPQQRRRRRRQPQRQQQQQRSTRQQQQRSSSSSSRQPPPQRRRQRTRRRQPPPQPRRQPPPRSSSSRRRSRSSSRQQQQQQRRRQPPPPRSSRPQQQRRSSSTTRQQPPPJJJLMMNNNMLKKKKKKLLLLLLMMMNMLLMMLLKJKKLMNMLLLMMMMMMMMKJJKLMLLMMLMNNMLLLMMMMLKLMNNNNMLKLMNNNNNNMLLLMNNNMMNONMMMNNNOONNNNLLLLLMMNNLLLLMNOOMNNNMMNNNNOONNNNNNNMMMMMMMNNMMMNMMNMMMMNONNNNNOONNOOOOONNNNNNNNNONMMMNNNMMMLLMMMNMLLMMNNNNNOOONNMMNNNNNNOOONMLMMMMLLLMNOPPPPPOOOPPPOMMMMMMMMLLMNNOPOONNNNNNMMMMMKLLMMNNOOOOPPPPPPNMNNMMMMMMMMMMNNNONNMNNOOPPPPONMNONMLMNNNNNMMMMNNOONNNNNNNNNNNNOONNMNNNNOONNNOPPPPOOPPPOOONNNOOPPPPOONNNNOOOOOONNNNNOOOPPPPPPOOOOPOOOOPOOONOOOOONMMMMNONNOPPPPONNOOOOOOPPPPPQQRRTZbfhjntx} ~{zwtsponmkjihmnoooooommmnqsttuttrqppprrsttrpnmnnmmpuz~}|} ~|zxz|~~~}}xsnmmnw |yusrsx~ }}}}||zzzz{ ~{zyxwvxz~ {trrsuvy{~}{{||z|~ ~{zzzxyxwwwvututtpmkklmnpsvwwvvuroptz~~}{{yuttxz}~}}~|zyz{}}|{{zwttsrpoopptvy{}~}}|||{||zwpib][[YTTSQQPPPPPPPQRRSSSSSSRRQQPPPPPPPPPPPPQRRSQQRRRRQPQRRRRRRSRQPPQRRQQPPPQRSSQQPPPPPPRRSRQQQRRQQPPPPPPPQQPPQQRPPPQRRQQPPPRSRQPPPPQQQQPQQQQQRSSSRRRRRSRQPPPPRSSSSSTTTSSQPQRRRQQQRRSSSSSRRRRRQPPPPOOPPPRRSRRQPPPPPPQQQQRQQQRRSRRQPPPPPPPQQQQQQQSSRRRRQPQQRUUTRRSSSSRRRRPPPPQQRRSSSRQQQRRRQQQQRRQQPPPQRRTTSSRQPPPPPPPPQSQQQPPPPPQSTSQPPRSSSSRRSSRRSRRQQRSRRRRRRQPPPQSSRPQQQRRRSSSSSRQQQQJJKLMNNNNMKJJKLLLLLLLLLLLMNNMLLLLKKKKLMNNLKKLMMMNNMMLLKKPPPNMNONMMNNMMMMOONMLLMOMNNNMLMMMMMMNMLKLLMMNMMMNNMLLLMNMOONNONLMMMLLMNNMMLLMNOPNNNNMMMNMNOONNOOOONNMMMMMMNNMMMNNNONMMNOONNNNOOONNNOOOOONNNNMMMMONLLMNNNMMMMMMMNMLLLMNOOONNNOONMMMNOOPPPOPPONMMMLKKKKMNOPPPPPPPOPPPOMLLMKLLLLMNONOOONMLMNNNNMMMMKKLLMNNNOOPPPPOOOMLMMMMMLLLLLMNNMMNMMMMNNOOPPONNMOONMLMNMMMMMMLLMNOONNNNNNNMMNNNONMMMNOPNNNMLMNOPPPPOOPPNNNOOOOPOOOONNMMNNOPPPOOOOOONNNNPPPPPPPOOPPPOOPPOOONOOOOOONMMMNNNNNOPPPNOOOOOOONPPPPPQRRVYajqtw{z ~zwtssnmkjihebbbdefghiiijlnpqqqpnmlllmrrsttrnllllklpuz|}|zz{ ~zy{}ztpnnmt{z} }zwtqontz}}}~}|{zzz{ |zurqqqrtuz {trstvwy{}~{yz{{z ~{zzzxxyzzxvtsrsrolklmnnosvwutttqnotz~~|{zxutvy{}~}}}{yxy{}~{{{zvsrqonnnnntvy{}~}}~}{{|}{xxsngaa^WVTRQPPPPQQQRRRRRRRRRQPPPPPPPPPPPPPPPPPQRQQRRRQPPQRRRQQRSRPPPQRRQQPPPQRRRRQPPPPPPQRSRRQRSQQPPPPPPPPQQPPQRRPOPPRRQQPPQRSSQPPPPQQQPPPQQRRSSRRQQQQRRRQPPPQSTSSSSTTSSRQPPQRQPPQRRSSRRSRRRSRQPPPOOOPPPRSSTSRQPPPPPPQQQRQQQRSSSSRRQQPPOPQTTSRRSSSRRRQPORSTUSRSVSSRRRRRRPPPPPQQRTTTSRQQRSRQQQQQQPPPPPPPPUTTSRQPPONOONNPRRRRQPPQRRTVURPPQSSSRQQRSQRRRQQRRTSRRRSRRPPPPRRQPPPQQQQQQPQRRRQRRKJKLMMMLLKKKKKLLNMKKKLLLLLMLKKKLLNOONNOPNNNMLLNPPPOONNMMOOOOONNMMMMMNNNNNPPPOOPPONNMLLLLKKLNNLKLLLLMNNMMNNMLKLMONOONMLMMNNNMMLLLKJJKMPPPOOONNNNNMNOOOOPPPPONNNMMKKLLMNOPOOOONNMMOOONNNPPPOONNOOPMNNNMMMNMNNNNNNNMLLMMNNMNMMMNOOONNMMNNNMLLMOPPQRPPPPPPOOMMMMMNOOPPONNOPPQPPNLKLMNOONNMMNNNNMNOPPNNNNNNNNLLLMMNOOOOPPPPOOONNNNONMMMMMMNNNNOOOOONNLMNOOPPPMNNNNNNNMMMMMMMMMNNNNNNMMMMNNNNNNNNNOOOOOOOPPOOOOOPPPPOOOONNOOPPOOOOONNMNOOPPPPPOONOPPPONNNOOPPPOOOOPPPPPONNOPONNOPPOOOOOOOPPPONMNNNNOOOPPPQPPSVZcnuz} |zyvsponkhgda_]\\]_acegggfhikkonnlkjklqpqrqonnnnnnorv{~}{zyyyz| ~unolmpuz|~ |zwronnotz~~}z{yxz |yxvtqonmmqrtx|{xuvvyz{||}~~{zzz{|~~~}zxvutsrqollmnoppqrrpnnnnptvx|~~||{zxvuvxyz|}}|{zyxyz|~}|ytoonnlklnpsuy|}|zzz|}}}}|{{~xlddb\WTUUPOPPQRSSRQQQPQRRPPPPQQPPPPQQRQPPPPPPQRRRQPPPQRRSSRRQQPPPQRQQRQPPQRSSTTSRRQPPTSSRRQQQPPPPPPPPRRQQPPPPRQQPPPQRPQQRRRSTSRQRSSRPPPQRRRQQQQRSSSSSQQQQRRRRRRRRSSSSSRRRQPPRSSTSRQRSSRRRRQPPPPPPPQRSTSSSRQPOPQRRRRRSQQQQRRQQPQRRQQQQQQRSSSRPRSSRRQQRRRSSSSRRSSSSSRQQPQQQQRRRTTSTTSQPQPPPQRRQSRPPQQPPQRSSSQPPTQPOPPPPRRRRQQQQRSSRPQSURSSSRRSTTSRQPOPRRSSSSRRQPPPQQQQPOOPPPPPPRSTTSSSTKKKKLLLKLLLLLMMMMLKKLLLLLLLKKKKLNOPONMNOMNMLKKMNOONNNMMMOOONNMLLLLLKKKKLMOPOOPPOONNMLLKKJJKNNMMMMMMNOONMNNMMLLNOOPPOMLLMNNMMMMLLKKLMOPPPONNNMMMMMNOONNOPNNNNNNLKJJKMMNNNNNNNNNNNOOONNNOPOONNNNOONONNLLLMNNNNMMMMMMMMNOONNMMMNOOONNMMNNNMMNNOOPPPPPPPPPOONNMMMMNNOONNNOPPPPOMLKLMNNONMMMMONNMNNOONNNNNNNNMMMNNOOPNNOPPPOOPONNOOONMMLLMMNNNOOOOOOOMNNOOOOOOOOOOOONMMMMNNNNNNNNNNNNMMMNNNNNNNNOOOOOOOOOOOOOOOPPPPOOPOOOOOOONNNNNNOONOOPPPPPOONOPPPONNNNNNOOPPPPPPPPPOMMNOONPPPPPOOOOOOPPPPONNNNNNNOOOPPPQTV[fsz{} ~{zyvsqmkihfb^\[YWWXY\_cdeedejolmnnmmnnqsuwwwvutssstty}~~~~|{zyxz{~ voolmpty{} ~{zvronnnpu{{yzywy~ zxutronmmmqqrtx{~}zyyz|}~}||{||zyyyz|~ ~{zyttsromlmmnnoponnnnnopsvx{}~}{{zzwuuvwxz{}}|{zyxxz{~~|ysonnmllmoqstvxzzzzz{||}~~}|~{trqh]\WVVRPPPQRRRQQQQPRSRQPPQQQQQQQRRRQPPPPPPQRSRRQQQRRRRRRRQQQPQQRQQRQPPQRRRSSSRRQQQRRRRRQQQQQQQQPPPQQPPPPQQRQQQQRRSRSSSRRSTSRQRSSRPPPQQQQQQPQQRRSSSRRRQRRRRRRRRRRRRRQPPPOPQRRSRQQQRRRRRRRPPPPPPPQRRTSSSRRQPQRRRQPPPQQQRSSSRQRSSRQQQQQRSTTSRRSSRQQQRSRRRRRRSRRRRRQQPPPQQQQRRTUUTSRRQQPPPPQQQSRPPQRQPPPPPPPPPSQPPPRQQPQQRRRRQSSSRRRSTQRRRQQQRSRRQPPPRSSSSRRQQQQQRRRRRPPPPPPPQRQQRTUUTMLKJKKKKLLLLLMMMLLKKLMLLLLKKJKLMNOONMMNOLMNMKKLMNNNNNNNNOOONMLKKMLKJJJJJLNPOOPPOOOONMLKJIJKNONMMLMMNOOMLMMMLLLNOPPPOMLLLMMMMMMMMMNPPPPPOONNMMMMMMNNNNNNOLMMNONLKJJLNNONNNNMMMNOOOOONMMNOOONNNNOOPONMLLLMONNNMMMMNMMMNONNNNNNOPOOONMNNNMMNNNOOOPPOPPPPPOOONNMMMNNNNNNNOPPOONMLLLMNNNNMLMMNNNMMNNONNNNNNNNNNNNNNOONNOOPPPOONNNNNNMMMLLLMNNNOOOPPPONNOOONNNPPPPPOOONNNNNNNNNNNNNNNNNNNNNMMMNNOOOOOOOOOOOOOOOOPPPPOOPPPOOOOONNMMMMNNNNOPPPPPOOOOOPOONNNMMMMNPPOOOPPQPONNOOONPPPPOOOPPOOPPPPPNNNOOOOONNOPQSVZ_kx}|| }}}}~~~}|{zxusnmkhgb^[WVSQPQUY]_bcdglrprstsrqqrvzz{|{zyxwwwwz}~~~}|{zyz{} xpplmptxz}||{zurppnmmotx||xttttuz}}|}}~|xvtronmmnorqqrtvyz~|{{|~}{{{{zyxxy| }zzyvsnlllklnnlkllmnoprtwz{|{zzzyvuuvvwyz|}|{zyxxyz}}ysnllkkknprrrsttwyzz{||}}~}{~}qc`XUURPPOQQRQQPQQQRRQPPPQQQRRSSSSRQPPPPPPPQRRRQRRSRRRQQQRRQQQQRQPQQPQRRRRRRRRRRRRQQRRRRSSRRQQQQQRPPPPPQQQQQQQQRSSSTSSRQQRRQQQRSRQQQPPPQQQQQQQRSSTSRQQQQRSRRRRRQQQRQPPPOPRQQQQQQQQQQRRRRPPPQQQQRRRSSSSRRQQQQRQPPPPQQQRSSSSRSSSRQQQQQQSTTSRRRSRQQQRSRRRRRRSRRRQQPPPPPPQQQQQSTUTRQRSQPPPPQQQRQPPQRRQPPPPPPQQSRPQRRRQPPQRRSRRSRRRSSRRPQRRQPPPRQQQQPPQSSRQQPPPRSSSSSSSPPPPPPQQQPOPSVUTOMLJJJKLKKKKKKKLKKKLMMLLLLKKJKLNMMMMLLNOLMONMLMMNNNNOOPPOONNMMLLMMKJJJKLLNOOPPPONOOOOMLKKKMOOMKKLLMNONMKKKKKKLMMPPOONMLLLMMMMMMNOPRRQPPPONNMMMMNMMMMMMMMLMMNOOMLKLMNOOOONNMMMNOOPPPONMNNOONNNNOOPONMLLMNOOONNNMMNNMMNNMMNNNOPPONONNNNNMMMMNNOPPPOOOPPPPOONNMMNNOONNNNOOOMNNMLLMNMNNMMLLMMMMMNNNONNNNNNNNMMMMMMNNNNOOPPPPOOOOOONNNMLLLMNOOOOOOOOONNNNNNNNPPPPOONNNNNNOOOONNNOONNNNNNNNNMMNNNNNNNNNOOOOOOOOOOPPOOOPPPPOOOOPONLLLLMNNOOPPPPONNNNOOONNNNMMNNOONNNOPPPPOOOPPOOOOOOOPPPPOOPPPPNOOOPPPPOOPQTV[^foz}|} ~~~|||||}}}~~}}}}{ywrpmjgc`\ZVTSRSVXZ_cfjqttz{}~|zzz~~|z{zzzyyz|}}}}}|{{}~ yqomnptx{}zzzzvrqrspnnnrx}wqonmnsx{{z{z{|~zwvsronnpstttrqqsuwz|~~|{{{~~~~~}~~{zzyyz~ztnkjihillhhjjmnooortyz{zzzzyvuuvvvxz|||zzxxxwz|{tmiihhjmoqqppprtwyz{{z{}~}~~|{wmbYTUSRSRQQQQQQQQRRRQPPPQQQRTTTTSRQPPPPPPPPPPPPQQRRQQQQRRQQQQQQPPPPQQRRQQRRRRRRRRRRRRSSSSRRQPPQRRPPPPQQQQQQPPQQQRSSSRPPPQQQQQRSRRRQQPPPQQRQQRRSTUSRQPPQRRTTTSSRQQRQPPPPPSQQQRQQQQQQRRRRPPPPQQRRRRRRRRQPPQPPQQQQRRPPQQRRRRQQRRRQQQPPQQRSRQRRRRQQQRSRQQQQRSSRQQPPPQPPPPQQQQRRRRRRRSQPPPPQQQQPPPQRQQRQQRRSSTTSRRRRQPPPQRSSRRQQRRRQQPPQRRRQQPQPPQQPPQRRQPPPPPSTTTSSSSPPPPPPQRQPOPRTUTPNMKJJKLKKKJJJJJKKKLMMMLLLLKKLMNNNNMMMMNKMOONMMNMMMNNOPPNNNMMMMMMLKKKKMMLNOOOPPNNOPPPONMMMNPPMLLMMNOOONLKKKLLMMMOOOOOONMLMMMMMMNPPQPPOOONMLLLLMMMMMMLLLLMMMMNNNMLLMMNOOONNMMMMNOPPPONNNOOONNNNOOPOMMMMNOOOOOOOOOPPOOONMMNNNOPPONONMNNNNMNNNNOOOPNOOOPPPONNNMNNOPPOONNNNNMMNMMMMNMNNNMLLMLLMNNOOOOOOOOOOONNMMMMMMMMNNOOOOPPPPPOOPONMLLMNOOOOOONNMNNNNNNNNPPPPOONNNNNNOOOONNOOOONNOOONNNNNMMMMMMMMNNOOOOOOOOOOOOOOOOOPPPPPPONLLLLMNNOOPPPPNNNNMMNNNNNNNNOOOONNNOPPPOONOOONOOOOOOPPPPOOOOOONOOPPQQQPPPSVY]bmtz~ ~|{{{{{{{{{{~~~~}}~~~|zytrnlhd_\XURRSSTU[elmq{~ ~{|{zzzzz||||}}~~~ xpnmnptw{}}~}}zzzyvsstvtqnnouz~~~skjhhlrxzzzyxyz}|ywvttrqstwyxvtrqrtuxz|}|zzz||}}~~}}||~ ztoljihikjhhiilnnnnoryzzyxyyxvuuvvvy{||{zyxxxwy|~tlhhgghjmnnnnnpsuwxyyyz{||}}|z{|zuk`ZYVUUURQQPQQQRRRRQPPPQPQRTTTTSRQPPPPQPOPPPPPPQQQQQQRSSQPPQQQPPPPQQQQQPRRRRRQQQRRRRRRRRQQPPPPQRQQQQQQQQRQQQQPQQQRRQPPQQQQQQRSSRSRQPPPQRSSSSSTUVTSRQQQRSTTTTSRQQRPPPPPQSRRRRSSRRPQRRRQQPPPPQRRSSSSSQPPPQPQQRRRSTQQRRQQQQQQRRSSRRRQQQRRQPQRRRQQQRSRQPPQRSSSRQQQQQPPPPQQQQSQPQSTTSRQPPPQQQQQPPQRRQQRRSTTTTTTSRRRQQPQRSSRRQPRSSQPPQPPQRSSRQQPPQQPPQQQPPPPQQSTTTRQQRPPPPPPQRQPPPQRSSOOMKJJLMLLKKKKKKLKKKLMMLLLMLLLMMPPPONMMMJLNNMLLMLLLLMNOPMMLLLLMMLLKKKLMNMNNNOPPNNNOPPPONLLNPPNNNNNNOPPOOMMMMNNNMOOOPPPOOMMMMMMMMNNNNMMNNMLKKKKLMNMMMMMLLMLLLMMMMMLLLLMNNNNMMMMNNPPPPONOOPOONNOOPONMMNOPPOOOOPPPPQPPPPPONNNNNOONNNNMMNNNMPPOOONNNOOOPPPPONNNNNOPPPPPONNMMMNNNNMMNNNONMMMMLLMNOOOOOOOOOOOOOONNNNNNLLMMMNNNNOOONNNNONMMMNNOOOOOONNMNNNNNNNNPPPPPOOOMMMNNOOOOOOOOOOONNNNNNNNMMMMMMMMNNNOOOOOOOOOOOOONOOOPPPPNNMMMMNNNNOOPPPPNNNMMMNNONNNNOOOOOOOOOPPNNNMMMMMPPPPOOPPPPOOOOONOOPPPQRRRQRUX\bfrw} ~|{{zzzzzzzz||}}}|{zz{{{{zyxsqonje`\^\[\\\\]anwuv }{|zzzzzz|||}~ xpnnnprvzzz|||~{zyxusstwutpnntz~~oghggkqvxwvuyzz}~||zxwwvuttuvxzywusrrttwy|}|{zz{{|} }zvtqmmmkihhhikmmlmnowyywvwwwutttuvy||{zxvvwxwy|ulihffghjkijkmoqsttuvwxz||{~~|z{{ztica[VTSSRQQQRRSSSRRQQQQPQRSSSSSRQPPQRRRPPPPPPPQQQQQQRRSPPPQQQPPPPQQQPPPRRRQQQQQRQQQQQQQQPPPPPQQRRRRQQPPSRRRQQQQQRRQQQRSRQQRRSSSSSRQPQQQSSSSTTUUTSRRRRSSSSSSRQQPPPPPPPPRSSSSTSRRQQRRQQQRPPPQRRSSTTSRPPPRRSSRQQRRRRSSRQQQRRSSTTSSSRQQRRQQQRRRQQQRRRQPPQRRSSRRQQQQPPPQQQQQTRPRUVUSRQPPQQQQRRQQQRRRPPQQRRRQRRRRRRSSSSRRRQPPPRTTRPQSPPPQRSRRQPPPQPPQQQQQQQRRRSTSRQQRPPPPPPPQQQPPQRRSNNMKJJLMLKKKKLLLLLKKLLMMLLMMLLLLPPPPONMMKLMMKJJKLLKLLMNOMMMLLLLLLKKKLLMMMNMLMOOMNNOOONNMLLMOOOOPNNNNOPPPNMMNOONMNNNOOONMNNMMMMLLLLLLMNNNNMLLLLMNONNNNNMMLLLMNNMMLLMMMMLLLMMMNNNOOOPPOOOPPPOOOOPPOONNOPPPPPPOOOOOPPPPPPPONNMMNNNMNMMMNONNPPPOONNMOOOPPPPOOONNNOOPPPPOONNNNOOONNMNOOOONMNNMMNOOONNOOOOOOOOPOONNMMMMMMMMMNNMNNNMLMMNNNMMNNNNOOOOOOOOONNMMMNOOOOOOONLMMMNNNOOOOOOOOOMNNNNNNNMMMMMMLLNNNOOOOOOOOOOOOOOOOOPOOONNNNNNOONNNOOPPPOOONMMNOONNNNNNNNNOOOPOONNNNMMMMOPPPPOOPPOOOPPPOOPPPPQQQSSTY_fmqx{ ~}}zzyyyyzzyzzzzyxxyyyyxwvuqomjhda^[\\]^_bdox}~|{{{{|~ ~}~ zrqppqruxywz{|}~|zwutrrtwvuqnnsz~~megffjptvvvvz{|~}zzywvvvvuuuuuuuutsrrstux{}}|||{z{|~ |xstrmihhhhikklmnnuwvuttuutssstty}{zxuttuwxz}~vnkigffghhhhjmnprsstuvxz{{{}~}|{||xpljbXTSTRQQRSSSRRRRQQPPPPQQRRRRQQPPQRRRQQQPPPPQQQQRRQQQPPQQRRQPPPQQPPPQQQQQQQQQQQRRRRRRQQQQQQQQRRRRQQPPRRRRRQQQQQQQQQRSRRRRRSSSTSRRQQQQSSSSTTTTRRQQQRRRQRRRRQPPPPPQQPPRSSSSTSRQQQQQPQRSRRQQQRSSSSSQPPQSSSSRPPPPQRSSRQRRTTTTUTSRRRQQQRRQQQRRQQQRRQPPPPQRSSSRRQQQPPQQQQRRSRRSTUSQQPPQQQPPRRQQPPPQPPPPPPPPRRQQQRSTSSRQPPPPQRSSRRRSQQPQRSRRRPOPPPPQPPPQPPPPQRTSRRRSRRQQPPPPQPPPSTTSMMMKJJLMJJJKKLMMMLKKKLMMKLMMLKKKLLMOOONMLMNMKJJJMLLLMMNOOONMMMMMLLLLLLMMMMLKLNNMMNNNNMLLMLMNONNOMLLMNOOONMMNOOMLMLLMNMLKNNNMMLLLLLLMOPONPONNNNOPPONNOONNLMNOPONLLMNNNMLKKLLMNOOONNOOOOOPPPOOOOPPPOOOPPPOPPPOOONNONNOPPPPNMLLMMMMMMMMNOONPPOOOOOOOOPPPPOOPOONNNOOPPPOOOONOOPPONNNOOPONNNNNNOOOONMOOOOOOOOOONMMLLLNNNNNNNNOOPONNNONNNMMMMMNNOOPPPPPONNMMMMMNNNNNNNLLLMMNNNOOOPPOOOMMMMMMNNMMMMMMMMMNNOOOOOOOOOOOOOOOOPOONNOOOOONNMNNNOOPPPOOONMMNOONNMMLLLMMNOOONNNNONNNNNMNOPOOPPOOOPPPPPPPPPPPPPTTV]env|} ~~{zzyyyzzxyyzyyxwwwwvutttpmhcbaa`bdhijkqv~ |{{|~ |utrsssuxxvzz{|}~~|yvtsqqrxwuqmlqx}}kcfehlruwyzz}}~|yxwvuuvvuutsrqsssrqqsttwz}~}}~zzz{~ ¢¢¢£¡ yxzvniihfhhijlmnotuutssttsrqqrty}zzwtsstvxz}}vonkhffggghhjmnqrsttvvxzzz||{{|||{ztrqh]XWTSQQRSTTQQQQPPOOPPPPQQQQPPPPPQRRQQQPPPPPRRRRRQPPQQQRSSRQPQQPPPPQPPPPQQRRRRRSSSSSQQRRRRRRQQQQQQPPQQQQQQQQPQQPPPQRSSRRRRSTTSSRRQQQRRSSSSRRPPPPPPPPQQRRRRQPPPQRRQQSSRRSSSQPQQQPPPRTTSRQQRRSQRRPPPQSSSRQPPPPPQRRQQQRUTTTTTRQQPPPPQQQQQRRQQQRQQPPPPQQRRRRRQPPPQQQQRRRRRRSSRQPPPPQQQPPQQPPPOPPQPPOOPPQSRQPPQRSTSQPPPOPRQQQRRRRSRQRRSSRRPOPPPPQPPPPPOONPRTTSSTUSSSRPPONPONPUVVSMMLLLMOOMLLLNNNMNMMMMMMMMMMNMMLLKNMMNMLNMNNMLKKLLLMMMMLLKLMNNNMMONNNOONMOOOONNNMNOPPOOOOMMMMMMNNLLLMNOONNNOOONMMMMMLKKKLLMNNNMLLLLMMNNOONNMLLMNOOOOOOOOONMLMNOOONNNNNMLLLKJLNPPPOONNNNOOPPPOOOOOOONNNNOOPPPPOOOONONNNPQRQPONOPOMMMNPPPNKOPPONNNOPPPPONNOOONNNOOPPPPOONNMOOOONNNNPPPOOOONOOPPPQPNNNNNNNNNOONNNNNNMNOOOONMPOONNNOOOONNOOOPNNNNNNPPPONNMNNOOPPPPONNMLLMNOOONNNNNMLLMMMMMMMMNNNNMMMMNNOPPONNOONNNNOPONNNNONMOOOONNNNOOONNNOOOOOOONMMONNMMMNNMOONNOPONNNNNNNNNNPPPPONOOOOOOOORPOPRRRSTW_glt~ }{z{{zzzzzzzzyxwxxwutronihda__`aclsror{~{z{} |ywvutuuvvzzz{~~|zwtqpqsuuutposx~tjfhhmsvxyz||yxvttttttronnopppqqqrstuwz}~~¡¢£¤¥¤¤¥¥¥¥¤£¢ zyrkhiifhikmnnnosstsrrrsqpprsstvxvttsrrry{~|xtsqlfcdffjkmoprrstttvwxzzz{{{zzz{zzxvtncZVUTSSSRQPQRRRQPQQRRRRRSSRRQQQQRRSRQPPQPPPQSSRQPPPPPQRRSSTSQPPPQQPPPPPQRSRRQQRRRRSRQRSSSRQPQRQPPPQQPQQQQPPPQQQPPPQQRRRRRRRSSSRRRRSSSSSRPOPPPPPPPPQQQQQQQQRRRRRRRRTTSRQQRSQQQQQQRRQRRRRQPPRQPPPQQQRQPPPPPOPPQQQQQRSTTTSRRRPPPPPPPPSRQPPQRSQPPRSQPPRSTTRQQQPQSSRRQQRRRSUUSQQQQQQQPPQQRQPPPQQQRQPPPPRQQQQQRRTRQPPPPPSPPPRRRRPQRTTSSURSSRQPQRQQRRQPPOOPRSSSSSSSRQQPPPRPOPQRQPMLKKKLMNLLKLMNNNOONNNMMMMNNNNNMMLONMOMLNMMNMLKKLNNNNNMLLLMNNNNMMNNNNOONMOOOONMMLNOPPOOPPMMMMMMMMMLLMNNMMLMMNNNOONNNMLLLLLMNNNMLKLLMMNNOONNMMMMMNLMNNOONNMLKLMMMMNNONNNMMMMMNPPONMMMLMNNOOOOOOPPPONNNNNNOOOPONNOONNNNNPQSRPOOOPNMNNOPQPOMNNOONNNOPPPPPOOPONNNNOOOPPPOONMMOOOOOOOOPPOOOOOOPPPPPQPOOOOOOONNNNOOOONNMNNOONNNOONNNNNNNNNOOOOOOOONNNOPPPOOOOOPOPPPPPOOMMMMNNNNNNNONNMLNNNNNNNNNNNNNNMMOOOPPOOOOOONNOOOPONOPPPOOOONNNNNNNNNNNOOOPPPOONNOOONNNNONOONOPPOONNNNNNNNNOPPPOOOOOOOPPPPOOPPPRTX\entz }{zzzzzzzzz{{zyxyxwutpmkbb`_^_bcis} ¡¢ ¡ ~}}}|zz|~~zyxwvvvvvyxxz|~~~}zwspooqvvwvsqtxwmikkntwyz{|~zwutrppppponmnnsrrsssssttux| £¥¥¦§§¦¦¦¦¥¥¤££££¢¡wsnjhhhhilnoonopqrssrqrrnopprsttutsrpppqz{~}zwwtoifghhkmortttttsstuvwxzzzzzzzz|{zxvqh`\ZVUUTRPPQRRRRRRRRQQQQQRSRRRRRSSRQPPPPPPPQRSRQQQQQQQQQRRSRQPPPQQPPPPQRRSRQPPQRQQQQQQRSSSQQRRQPPQQPPPQQQPQQQQQQPPRRSSSSSRRSTSSRRRSSSSSSRQPPPPPPPPQQQQQQQQRRRRRRRRSSSSRRSTSRRRRRRRQQRQQQPPPPPPPQQQRQPOOPPPPQRRQQQQRRSTSRRRQQQQQQRRRRQQQQRRRPPQRQPQPQSSRPPPPQSSSRRRRQRSUTRQQQQQQQQQPQQQQPQRPQQQPPPPQQQQQQQRRQPPPQPPRQPQRRRRTTTTSQQRSSSRQQQRQRRRQQPPPPQRRRRSQQQRRRRRSQPPQQPPLKKJJKKLLKLLMNNNOOONNMLLMNNNNNNNMPONOMLNMMMMLKKLNNNNNMLKLMMNNMMMMMNOOOONMMNNNMLLMNNONNNOLMMMMMLLMLLMMMLLLLLMMNOOOOONMLLMMNNNNMLKLMMMNOOONNNMMMLLJLMOOONNNMMMMNNMNNNNNMMMONNOPOMKMMLMMNOOONNOOOPPNNNNNNNNNNNNMMNOMMMNNPQSRPPOOONMMMMNOOMLLMOOONNOOPPPOOOPNNNNNNOOPPPOONMMOOOOOOOOOOOOOOOOPPPPPPPPPPPPPOOONNOPPOONNNNNOOOOOONNNMMMNNOOOONNOOONMMNNOOOOOOOOOOPPPOOONMMMNNMMNNOOONNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOPPPPNNNNNNNNNNNNOOPPOOOOOOOOOOOOOOOONOOOOPPPOONNNNNNNOOPPPPPPPPPPPPPPPQRRRVYadmv{ ~~}}~~~}{zyyyyzzz{|}}}{zzzzywtombbb__bhmx ¡¢£¤¤¤£¥¥¥¥¥¥¥¥£¤£ ¡ ~}{{{{{{}~~~}|zzxxwwvvvvwz|}~|zwspopqvxzzwtux zqnnnquwxyz{}~}ytrpnnnnoppppqrvuuuvvttsrru{ ¢¦©©ªª¨¨©ª««««ªªª©¨¦¤¢zsmijjhhkmorssrrrpqrsrqqqnoonpstsssrpooqsz|~}{z|zwronnnoptvxxwwtttttttuvwxyxwwwzzzxvrlf`\XVVTRPPQRRRRSTSRQQPQQRSRQQQRSTRQPPPQQPPQRSRRQQQQQQQQQQRRQQPQQQQQQQQQRRQPPPPPPPPPQQQRSSRRRSRQQRQPPPQQQQQQQQQQQQSSSSSSRRRSTTSSSSSRQQRSSSQQQQQQQQQQQQQQQQRRRRRRRRQRRRRSSTSSRQQQRRRQQQPPPPPPOPPRRRRQPNOPPPQQRSRQQQPQRSRRRRPQQRRRRRQQQQQQQQRPPQQQQQPQRRQPPPPQSSSRRRQQRSTTRQQQQQQQQQPQRRRQQQPPQQRQPPQQQQQQQRQPPPQQPPQQRSRQQRUTTTRPPQSSSSRRRRRRRRRQQQPPQQPPQQPPQQQRRSQQQQQPPPLKKJJKLLMMMMMNNNNNNNMLLLMMMMMMMNMPONONMONNNMMMLMLLMLLLKKKKLLMMLLMNNOOONMKKMMNMMLLLMMLKLLMMMNMMLLLLLLMMMLMMLLLMMNPPPNMLMMNNNNNMLLLLMMNNOOOOONNMLLLMNPPPOOOOOOOONNMMMMMMMMONNNNMLJMMMMMNNOPOOOONNNMNNOONNMOONMMMNNMNNNNOPQPPOOOOONMLLLMMMLMNOPOONNNNOONNNONNNNOOOOPPPOONMMOOOOOOPPOOOOOOOOOPPONNOOPPPPPPPONOPPPONMOOOOOOPPOONNNMMMNNOPPONNNNNMLLLMMNNNNNMMOOOOONMMNMMMNNNMNNOOOOOONNNNNNNNNNNNNNNNOONNNNOOOOPPPOOONNNNNOONMMMMMNNNOOOOOPPPMMNNNNNNONNNNNNNOPPOOPPPOOONNNNNOOOOPPPPPPPPPPPPOOPPQSVZjmt| ~zzz{|||{zxvvwwxzz{}}|}}}|{xtpgeb_`gs{¢¤¥¦§¨¨©©©ªª««ª©¨¨¦¦¥¤£¤£¡ ~|}|zzzz{|}}}~~}{zyxwvvuuvyz|}{zwtrqstwz|}zyxy} }trsrtvwwwxz|~|xrnmmnoprsttuvxzyyzzyvttsqtz ¥©«««¬¬¬®°±±±±±¯®¬ª¦¥¡¡|unkjmnnnprsuwxwutrsttsrppnnnmnrsrpqqpoqtw}~~{{||}}|zyvtuwyz{zywwvuutsststtuttttuwwwutpnhfb]YVSQRRRRRSTTTSRQQRRSRQPPPPRSQPPPPQQQQQRSSRRRRRRRRRRRRRQQQQQQPPPPQQRRPPPPPPPPPPQQQQRSSRSSSQRSQQPPQRQQQPPPPQRRRRRRRQQQRSSTSSSTRQPPPQRSRRRRRRRRQQQQQQQRRRRRRRRRPQQRRRRRRRQPPQRRRQQPPPPPPPPPQRSRRQPPPPPPPQRSRQQQPQRRQQQQPPPQQQQPPPQQQQPPRPPPPPQQQQQQQPQQQQRSSRRRQQRSTSRQRRQQQQQQRSSSSRQQQPPPRRRQQQQQQRRRQQQQQQPOPQRSRPPRRQRRRPPRTSSSRRRRRRQQQRRRPPPPPPPPPQQQPPPPPPQRQPPQLLLLLLMMNNNNMMMMLMNNNMMNMMMLMMNNMOONPNMPOONNNNNMKKKKKKKKJJKLLMMMNNOOONMLKLMMMMLKJKKKKKLLMMNNNMMLLLLMNNNMMMLLLMMNPPONMLLMNNNNMMLLLLLMNNNOPPOONNMLOOOOOOOOOOOONNNNMMMMMMMNONMLLMLLMMMMMMMMPPPOOONNNNOOOONNPONMMMMNNONNMNOPONNNNOOOPOOOOOOONOPPPONNMNONNNNOOOOOOOOOPPPOONNNOOOOOOPPOOOOOOOOOPPONNOOPPPPPPOOOPPPPONMONNNNOOOOOONNNNMNOOPPONNMMNMMLMNMNNNNMLLOOOONMMLMLLMNOONNNOOOOOONNNNNNNNMMMNNNNNOOOOOOOOOOOOOOONOONNNMMMLLMMMMMMOOOOOOOOMMMMNNNNNOOOOOOOOPPOPPPPOOOONNNNOOOOPPPPPPPPPPPPQPPRUX\`nrz }{zxxxxyzyywutttuvwyz|~~}}}}~}ztqeb_^bn}§¨©ª«¬®®¯¯®««««ª¨§¦¥¥ ~|zzzywwxzz}||}~~}{zzxwvvuuvwyz{zywtsstuy{~~|zz| zvvuvwvvvxy}~~~{upmlmorssttuvxyzz{||{yvwtrty ¥ª¬®±±±±±²²²³²±¯®««¥¥¢~xmmmnptttwwxz}|zwuuutsqonmnmkmqrqopqqrtx{~{zz{z{}~~|zyz{|~~}zyyxxwtrqrpqrrrrrrsuwwwxwuxwsjaXUTSSRRRSSTSSRQQRSTQPPOOPQRRQPPQRRRRRRRSSSSRRRSSSSSQQQQQQQQPPPQQRRSPPPOPPPOPQRRQQRSSSSSSQRSRRQQQRRQPPPPPQQRQQQQQQQQRRSSSSSSRRQPPQRSRRRRRRRRQQQQQRRRRRRRRRRRQQQQRRQQQQPPQQRSRQQPPPPPPPPPQQQQQQQQRRQPPQRRQQQQQQRRQPPPPPPPPPPPPPQQQQPPQPPPPPQPRRQPPQQRQQRRSRRRQQRSSSRQSRRRQQPPRSSSTTSSSQPPQRSRRRRRRRRRQPPQQQPPPQRSQOPQPPPRRQRTTSSRRRRRRQQQQQRRQQQPPPPPQQQQPPPPPQRRQPPQNMMMMNNNOOONMLLLLMOOONOPNNMMMNNOLONMONMPONNNNNNMKKKLLLLLKKLLMNNNNOONMLLLMMMMLLKKJKLLLMNONNMMMMMMLLLMNONNLLLMMNOOOOONMLLMONNNMMMMLLMMNNOOPOOONNNMOOONNNNNOPPPOOOOONNNOOOPPONMMNNOPPPPOOOOOOOPPPPPOOOOOOOOPONNNNNNOOONMLMNMMMMNOOPPPPPPPPPPPPPPOOOOPPOONOOOOOPPPPOPOOOONNNOOOOOOOOOOOOOOOOPPPPOOOOOOPPPOONPPPPPONMMMMMMMMMNNOONNNNNOOOOONNMNNNNNOONOOOONMMPPPOONNMLLLMNOOONOOOOOOOOOOOOOOONNMMMMMMPPPPPPPPOOONNNNNOPOONMMMLMMMMMMMNNNMMMNNNNNNNNNNOOPPPPPPOPPPPPPPOOOOONNNOOOOPPPPPPPPPPPPSRRV[`fjru~ {ywututttuvvutsrstttuwxz}~}~~~|ytpgdbckw¥ª®±««®¯°±±²²²²²±°°¯®¬««©¨¥¢ ~|zyxxwvvwxz{{z{}~}|{zzyxwvvvvwyzzzzxuttuw{~~|~ ~zzxxwvvwyz~~}}ytonnortttttttuuwz|~}{zzwtty¢§«®¯°±±±²²²³´µ´³±±°¯®®¨¦¤¡zoonnquxx{z{~~{yxvuspnllkklnpqqpqrstwz}~~~}ywxz{zz{{{{{|||}~}{zyxwtpopopppoppqrtvwyzzz|}zqe[VVSSRRRSSSRRQQQRSSRQPPPPQRRQPPQRRRRQQRSSSSSSSSTTTTQQQQQPPPPPQRSSTTQPPPPPPPQRRRRRRRSRRSRQRSSRQQQQQQPPPPPPQQRRQQQQQQRRSSRRRRRSRRQRRSRRRRRRRRQQQQRRRRRRRRRRRRSRRRRRRQQQQQRSSTRQQQPPPPPOPPPPPPQQQRSSQPQQRQQPQRRRRRQPPPQQQQPPPPPPQQQQPPQQPPPQQPRQPPPQQQQQQRRRRQQRRSSSRRSSRRQQPPRRRSTUUTSRQPQRRSRRRRRQQQPPPPQRRQPQRRPOOQQQRSSRSUSSRRRRRQQQQQQQQQRRRRQPPPPQRQPPQRQRRRPPPPOONNNMMMNNNNLLLLKMOOONOPONMMMMNOLONMOMLNNMMMMNMLLLLLLLLLLLLMMMMNNNNMLLLMNMMMLLLLLMMMMMNONMMLLMNNLLLMNNNMLMMNNNOONONNLLLMONNMMMMNMMMNNOOOONNMMNNNNOOOONNNPPPPPPPPOOOOOPPPPPOOOOOPPPPPPPPPOPPPPPPPPPPPPPPPONNNOOONOOONLLLMMNNNNOOPPPPPPPPPPPPPPPPPPPPPONOOOOOPPPOOOOOOOOOOOOOOOOOOOOOONNNNOPPOPPOMOOPPPOONOOOOOOONMNNNNMLLMNNNNNNNNNNNNNNNNOOOONOOOOOOOOOOPPOOOOONMMMNOPPPOOOOOOOOOOOOOOOONNNNNMMMOPPPPPPOOONMMMMMOOPONMNNMMNNNNNNNNMMMNNNOONNMMMNOOPPPPPPOPPOPPPPOOOOOONNOOPPPPPPPPPPPPPPPQSX]dmsz{ zwtsqqtsrrrssstrqrsssttuxz}~~}~}|||ytplhgjt£¥§ª±±²³´´³³µ¶¶¶µ´´³±±±°¯««¨¥¡ }zywutuuuuvwxxxxyz|}~~}||}~}|{zzzyxxwwxxyzz{zzywvwyz~}zxwvuvxz{}||xtqqrstuwvtsrqqqsv{~~{yxz ¤©¬¯±±³²²³´´µ¶·¶µ´³²±±¯¬©¦¥¤¡~vrnnpswz~{zxutqnljikpsssttttuwy{}~}}}}~zvtuwzyyzzz{}|{z{}~~}zzywsonnnnnnmnnpqsuvyz{zxzzrg\WVRQQQRSSRRRRQRRRRSRRQQQQRRQPPQRRRQPPPRSSSTTTTTTTTRQQPPPPPPQQRSSSSQQPPPPPPQQQQRSSRRQQRQPQSSRQPPPPPPPPQQQQQRQQQQQRRRRSRQPPQQRSSSRSSQQQQQQQQQQQQRRRRRRRRRRRRTSRQRRRRQQRRRSSSQQRQQQPPOOPPQQPPQQQRSSRQSSRQPPQRQRRRQPQQRQQQPPPPQQQQQQQQQRRQQSRPPPQRSRQPQQPQRRQQQRSSSSSRRRRRQQQQSRQRSSTSRSSSRQQRRRRRQQPPPPPPQRRRQQQQPOPPSRRSSRSUSRQQQRQQRRRRRQPPQQRRQPPPPPRRQPRSRRRQPPPPPPONMMLLMMNMLKLLKMOONNNOONMLLLMNLONMNMKMMLKLLMLKLLLLLKKKMMLLLLLLMMMLLLMNLLLLLMNOOOONMLLMMMLLLMNNMMMMNNMLNNOOONMMNNNNMLMMONNMMMNNMNNNOOPPNNMLMMNOMNOPPPNNNOPPOOOOOOOOOPPPOOPPPOOOOOPPPPPPPPQQPPPPPPPPPPPPNMMNOPPOOOONLLLMNNNNNNOOOPPPPPPPPPPPPPPQPPPPONNNNNOOOOOONOOOOOOOOOOONNNNOOOONNNNNOOOOPOLOOPPPOONNNNOOOOPNOOOONMLLMMNNNNNNNNMMMMMNOOONNNONNNOOPPPNNNNNOOOMMMNOPPOOOOOOOOONNNNNNNNOONNNNMMNOOPPOONONMLLLMMNNOONMNNNNNNNNNNNNNNNOOPONNMLLLLNOOPPPOOOPPOPPPPOOOOOOONOPPPPPPPOOOPPPPPUV[`emw ~{xtsrqpsqpppqqqsqqrsrrsstvy{}}|{zzzzxtpkgejv ¢§«¬°³´´¶····¶·····¶¶¶µ´³³±°¬¨¥¡ ~{yvttpqstttuvtttuxzzz~}|{zzz{{|~|zzzzzzyxxyzzz{|}zzzyyz|~ }zvuttuxz}~}|{xuttuuuvxvspnnnnotz|{} ¡¥©¯±²´····¶¶··µµµµµ´³²¯«¨¨§¤ |tmnopu}~|zwtronjhltxutvxwwxyz|||{{|}~}yuttvuuvyzzz||zzz{}}|zzzwsonnmllkklnnrtuwz||{zzzti^XVQPPQSSSRSSSSSRRRSRRQQQQQRQPPQQQQPPPPQRRRTTTTSSSSRRQPPPPPPQQRRRRRRQPPPPPPQPPQRSSSQQQQQPQSSRPPPPPPPPQQQQQQQQPPPQQRRRSRQPPPPQSSSRRRQQQQQQQQQQQRRRRRRRRRRRRRSRPPQRRRPQQRRRQQQRRRRQPPPPPQRRQPRQQQRRRRUUSQPPPQQRRRQQRRQQPPPQQQQQQQQQQQQRSRRTSPPQSUVTQPQPPQRRQPRRSSSSSSQQQQRRRRVTRQQQQQQSTTSQPPRRRQQPPOQPPPPQQQSQQQPPPQRQRSSRSUSRQPQQQPRSSSRQPPPPQQPOOOPPQQPPQRRQPPPPPPOPPPPPONLKJKMONLLMMMMMNOPPONNMLLMNOOONMNLLLMOONMMNMMLMNONOOONMMNONNMMMNNMNNOOONNMNNMMMNORSPLJLMLKLNNNNNNPPPPOMLLNNMLLLMMNMLMNPPPPOOPPQPOONNNNNNNNOONOPOMOOPPPPOOPOOOPPPPPPOOPPPPPPPPOOOOQPOOPPQQPPPPPPPOOOOPPPOOOONNNNNOPPPQQPPPOOOPPPPPOPPPPPPPPPPPOONNOOOOOOOOOOONNNPPPPPPPPPPOOONNNNNMNOPPONMNNNNNNNNPOOOOOOOOOOOPPONMMNOOONNMNOOOONMONNNNNOOOOOPQQPONNMNOONNONNOOPONOOOOONNNOONNNNOOPPPOONOONNOOOOOOOPOMMMNNNNNNNNNNPPPOMMMNOOPPONOPOOOOOOOOONNOPPPOPONNOPPPQPPNNNNOPPPPPPOONPPPPQRQVZ_ekt} ~}}} }zwtrrstttsqooopsttuvvvvvwyyz|}|zzywtromjjmt¥©«®±³¶¸·¶·¹¹¼ººº¹¸····¸¸·¶³±¯ª¨¥£¢ |wtsrqpnnnprrqssrqsvww{}~|zyxxxx{|~~}|{{{zzzz{{z{{zz{{z|zxxz} ztrrtux{~}~}~~}}|upoonllpty ¡¥«®°²³³·¶¶····¶·¶µµµµ´³°®«¨¥¥¥¥¢¤£wpllnr{|yvtrpkqy}{ywwyyxxz|{y|{z{~|yutttuvwwwxxvywvvwxzz{zyxvsnlljijkkmnqrtuxz{||{zth\WTQQQRSSSSRRQQQRRRSQPPRRQPQQQQQQQQQPPRSSSTUTRRRRRRSSRQPPQRQRRSRRSSSRRQQQQQPQRSSRSSRRRQQRRRURPPPQQQRQQRSSTSTTTSRRRSSSRQQPPPPQRRQQRSQQRRRQQQQQQQQQRSSRQQRRRRSSSRRRRRQRSTTTTSRRSSSSRQQPPPQRQQTRPPQRRQSSRQPPPQPQQRRRQPPQQRRSSTSRQPQQQQSSSSTTSRQRUVVTRPPPPPPQRSTSSSTTSRQQRRSSRRSSSSRRQQSSTSQPPPQQPPPQRRQQQPQQRRRRRRQQPPQPPQRSSSRSSRQQPQRRRRRQQPPPOPPPPOPPQQQQPPRQPPPQPPOPPPPONMLKKLMNNMLLLLLLMNOONNNNNNMOPPONNNLLLMNNMLMNNNMMNNNOOONNNOONNMMMNNNNNNNNNNOONMMMOPSUSNJKLLLMMMMMNOPPPPONMMMMMMLLLLNMMNNOONOONOPPPOOOOONNNNNOONNOOMOOPPPPPPPOOOPPPPPONOPPPPPPONNNNOOONOPPQQPPPPPPPOOOOPPPPPOOOOOOOPPPPPPPPONNNOOOOOOPPPPOOPPPPOOONNOOOOOOOOOOONNNOPPPPPPPPPOOOOOOOONNOOOONNNNNNNNNNNNNOOOOOPOOOPPONNNNONNNNOOPPPOONONNNNNNNOOOPPPPOONNNNONMNNMNOONMNNNNNOOOPONMMMNOPPOOOOOOOOPPPPPPOPOMMMNNPPPPPPPPOOOONNNONOOONNOOPOOOOOOPOOOOPPPPONNNOOONPOONNNOOPPPPPONNNOPQSSSRX_hnsx }|~~~|{{|} ~zxvvwxxxxxxxyz~}|||{z{|{|~}|yxvtqnlkjlpx¡¦ª¬°³µ¶¸··¸¹¹»»»»»º¹¸¸¸¸¸·¶³±¯««§¥¤¡zwtrnljiihijklmnnnnqttz|~}{zxwutvwz|~~~|{{zzzz{{||z|{z{||{|zxxz} zpoprtx{ztqqpqstwz ¥«®±²´´¶µ¶·······¶¶¶µ´³²°ª§¦¦¦¥¥¤¢ |tmknrz ~zwttttx~~zyx{{zyz|}}{{{}~}zxtsrsstvwwwvutttsstvxzzyywtomkihijkmnqrtuwzz{{zzth\WURRRRSSSSRQQQQRRRSQPPRRRQQQQQQQPPQPPRSSSTTSRQRRSRSSRQQQQRPQQQQQRSRRQQQQQQQRRRQQQQSSSRRSSSUSPPQRRRRQQQRSSSSSTSRRRSSRRQQQQQSSTSSRRSQRRQQPPPQQQQRRSSSRQPQRRRRRQQQRSSRRRSSSSSSTUUUTSRQPPPPQQPRQPPQRQQRRRQPPPQPQQRQQPPQRRRRRRRRQPPQRRRRRRRSSSRRSTUUTSRQQQPPQQRRRRSTTSSRRSSSRRQSSSSSSSSTSRRQPPOPPPPPPPQQQQQQQRRTSSRRQQPPPPQSTUURRSRQQQQRRRRQQQQPPOOPPOOPPPQQQQQQQPPQQPPNOOOONMLLLLMMMNNKLLLKLLMNNNNNNNNNNOOONNNLLLMMMLLMNOONMMNNOONMMNOOONMMNNNOONNOOOOPPOMMNPQTVUPKKLLNNMMLLNOPPPPONNNMMMMMMLLNMNNNNMMONNOPPPOOOOOOOOOOOONOPOMNOPPPPPPPPOOPPPPNNNOPQQQPPNMMMNNNNNNPPPPPOOOPPPOOOPPPPPPPPPPPPPPQQQPPPPONNNNOOOOOPPPPOOOPPPOOONNOOOOOPPPNOOONNNOPPPPPPPPPPPPPPPPNNNNNNNNNNNNNMMMMNNNOOOPPPOOOONMNOOOMMNOPPPPPPOOOONNNNNNONNNOOONOONNNNNMMMMMNNMMMMNNNNOOPPNMMMNOPPOOOOOONNNOOOOPOPOMMMNNPPPPPPPPNOOOOOOONOOONNNOPPOOOOPPPOOOOPPPOONNOONMNNNOOOOOOOOOOONNPNNQTVY\]fqxz| }|{|}{zyz{ ~ywtpmkjijnv ¤¨«®²µµ¶¹¸·¹ºº»¼¼¼»»º¹¹¸¸··µ³±°¬ª§¥¢~zwtqkgdddbbbdfehiijmprvy{~~}{zwtrrsuwz{}~~}|{{zzzzz{|}}||{z|}}{|zwwz} zpoprtwz~ yvutvyzz} ¥ª±³µµµµ¶··¸¸¸¸···¶¶´³³±¯«ªªª©¨¦¦¦¤wminrz zwuwxz|~}zyxwyzyyzzzz{|~zzywtsrqrtxyzzxuqrqonosvxyzzyvqnkihiijmorrstvxzzzyxsg]XUTSSSSTSSRQQQQRRRSQPQRRRQRQQQQPPPQPPQSSSTSRQQRSSSRRRRRQQQPPQPPQRSSRRRQQQQSSSRQPQQSRRQQRRSTSRRSSSRRQQQRRRRRRSRRRRSRRRRRRRRTUUUTSRRSSRRQPPPQQQRRSSSSRPPPQRRPPPPQRSTSSSRRRRSSTTUTSRRQPPOPPPPQPPPQRQPQQRRQQQQPQQQQPPPQQQRRRSSRQPPQRSRRRQQRRRRSRRRRRSSRRQQPPPPPPPRSTTTSSSSRRQQRRRSSSTTUSQQQQPOOPPPPPPPQQQQQQQQTSRQQQQQPPPPRSSSRRRQQQQRSRRQQQQQPOOOOOONNOPQRRQQRQQRRQPPMNNONNMMMMNMLLMMLLMLLLLMOOOONMMMMMNNNMMMLLMMMMMMNOONNMNNOOONMLMNOONNMNNNPOOOOPPPQPPNNOQSSTSPMLMLNNNMLLMNPPPPPOOOMNNNNNMMMMMMMNMMONNOPPPOOOOOOPPPPPPOOPPNNNOPPPQQPPOOPPPONNOOPPQQPPONNNNNNNNOOONMONNOOPPOOPPPPPPPPPPPPQQQQQQPPPPPOOOOOOOOOPPPPOPPPPPOOOONOOOOOPPPNOPPONNNOOOPPPPPPPPPPOOONNNMMNNNOOONNNMMNNNOOOOPPPOOOONNOPPNMLNPPPPOOOONOONNMMMMNNMMNNOOOOONNNMMLLMMMMMMMMMMNNNNPOOOOOOOPPOOOOOOMMMMNNNOOPOMMMNNOOOOOOOOOOPPPPPOOOOOOOOOOOOOOOOOPONNOOOOPPPPPPPONOOPPPPOOOPOOOOOQPPUVX^eipy }{{{{zz{| zxtnjiijms|¥§ª¬°³µµ¶¹¹¸»»º»»»»»º¹¹¸¹¸··µ²±°¬ª§¥¢|yvtojfbba`_`ababefhknptvy{|}~}|zvtrstuwz{|~}}|{{{zyyzz{|}~}{zz{}}{{zwwy| {tttuwxz|}~ }{zzz|}}~~ ¥ª±³µ¶µ¶¶··¸¸¸¸·····¶µ²±°¯®®®¬«ªªª¦|nhnsz~yutvyzzzzzzyyyzzzzz{{{|~~zzywttsttw{~~{xrqonmnqtuwzzzwsnlkiijknprrrstuwxxutpf\XUUTTTTTSRQQQQRRRRRQQQRRRRRRQQPPPPPPPQSRSSSRQRRSSSRRRRRRQPQQQQQRSTSSSSRRRRTTTSQQRRSRQQQQRSTSSSTTTSSRQQRRRRQQQQQQQRRRRRRSSSSTTTTSRRTSSRRRQPPPQRSSSRRQPPPQQRQQPPQRSTUUTSRRSSSTTUTSRQQPPPPPQQPPPQRRQQPPQRRQQQPPPQQPPPPPQQRSTUSRQQRSSSRRQQQRSSSRQPPQQRQQQPPPPOPPPRTUUUSSSSRRRQQQRRRSSSTSQPPPPPOPPQQQPPPQQRRQQPQQPPPPQQQQPPPPPPRRRQPQRSSRQPPQQRPPOOPPONNOPQRRQQRRSSSSQPMMNNNNNNNNONLKKLMMNMMLMMNNOONMMNNNMMMMMMLLMMNNNNOONMLMNOPPPOMMMNOONMMNNNOOOOOPPPQQPOOPQSQQPONNNMMNONNMMMPPPPPPPPOOPPPOONNMMLLMOPOOOOPPPPPPPPPPPPPPPOOPPNNNOPPPQQPPOOPPPOOOPPPPPPPPPPPPPNNNNOOONMNNNNOPPOOPPPPPPPPPPPQQQQQQPPPPQQOOOOOOOOOOPPPPPPPPOOOOOOOOOOOOPPNOPPOONNNOOOPPOOPPPPOOOOOONNNNOOPPOOONNNNNNNNNNNOOOOOOOOOPPNMLNPPOOOOOOOOONNMMMMMMMMNOPPOOONNMMMLMMNNMMMNNNMMMMMMMOOPPOOPPPPOOOONNMMNNOOOPOMMMNNOOOOOOOOPPPPPPPOOOOOOOOOOONNNNOOPONNNOOOPPPPQQPPPPPPPPPOOOOOOOOPPQV[\[ahy{ |{{{}~}} {ytnihikov¢¦¨«±´¶µ·ºº¹»»º»»»»»º¹¹¸¹¸·¶´²±±¬ª§¥£|zxtpmigcb``aaa`__acgjmntuxzz{|}}{yvttttvxz{||{{zzzzzzzz{|}~{ywwz{{z{zxwy| ~zxxyzzz|}~ ~~}~~~~~ ¥ª°³µ¶¶······¸········³²±°°°°°¯¯®¬«§¡tlnsz~|zvtstuwvvwxyyyzzxwy|~~}zzywuuvwvz~{trnllnopsuyzyxtpmljjjjmpqqqqrttutrrnd\XUVUTTTTSRQQQRRRRRRRQQQRRRRQQQPPPPPPPQRRRSSSRRRSRRRQQRSRQPQRRRRRSTSSSRRRQQSSSRRRSSTSSRRSSTTTSTTTTTTSQQRRRRQQQQQQQQRRRRRSSTRSSSSSSRSRRRSSRRPPQRRRRRRQPPQQQQRRRRRSSTUTSRQRRRTTUVVTSRRQQPPPQRQQQRRSRRPPQQRRQQPPPPQQQRPPQQRSTUTSRRRRSRRRRRRRSSSSRRQQQPPPPPPPPPPPQRTVVVRRRRRRRRRRRRRRRRRSSQPNOPOPQRRRPPQQQRQQPPPPPPPQRSRRQPOOOORRRQPQRSRRQPPQQRPPPPPPPOPPPQQQPPRRRSSSQPMMMNNNNNNNNNLKKLMNNNMMMMKMNONNOPPONMMMMMLLMMMNNOOONLLLNPQQQPONNNONNMMMNNNNNNNOOPPPPPPPQRPONMNOONMNOOONMMOPPPOPPQPPPPPOOONMMLLNPQPPPPPPPPPPPPPPOOOOONNPPNOOPPPPPQPPPPPPPOPPPPPOOOPPPQRRPOMMNOPPOONNNNOPPOOOPPPPPPPPPPPPPPPPPPPQQQOOOOOOOOOPPPPPPPPOOOOOOPOOOOOOOOOPPPPOOONOOPPPPOPPPPPPOOPPPOOPPPPPPOOOOONNNNMMMMNOOONNOPPPPOMMNOPOOOOOPPOOONMMMMMNNNNOPPOOOONMMMMNNNNMNNNNNMMMMMKLMOOOONPPPPPOONMMMMMMNNOPOMMMNNOOOOOOOOPPPPPPPOPOOOOPOOONNNNNNOOONNOOONOOOPPPPPPPQQPPPONNNNNOOOPRW\]bkt ~}~ zxsnihjlrz ¢¥¦©«¯²¶···»º¹»¼º¼»»»»»ºº¹¹¸··µ²±°®«§¥£|zwrnjhhgecceedbbaacgilnstwxxxyz~~~{ywttstuwz{{{zzzzzzzzzzz{|}zwtuxzzzzzzzz|~ ~{zz{{{{}}~ ~}}~~~~ ¥ª°²µµ·············¸···´²±±±±°°±±¯¬©¥ {qnov zyvsrqqrttttvxxxvy|~|zzyxwwyzy||wsnjjlmnqtwxxxtqnmlkjjmoppppqqrssonkc\XUVUTTTSRQQQRRRRRRRRQQQQQQQQQPPPPPPPPQRRRRSSRRRSRRRQQRSSRPQQRRQQRSQRRQQQPPQQRRQQRSSSSRRSSSTTSSSTSSTSRQRRSSQQQQQQQPRRRRRSSSSRRSSTTSRQPQRSRRPQQQRRRRRQQQRRRQRRSSSSSSSRQPPPQQRSTUUTRRRRRQQQQRRRRRRSSSPPPQQRQQPPPPPQRRQQQRRRSSTSRQRRRRSSSSRRSSSSTTSRQQPPQQQQQQPPQRTUUUQQQQQRRRSSSSRRRRQSTRPNOPPPPQRRRQQQQQQPPPPPPPQRSTQQPPPPPQRRRQQQQRRQQPPQQRPPPPPPPPPPPPPPPPQQQQQQPPMMNNNNMMMMMMLLLLMMNNMLLLKLNOONOPPONMMMMLLLMMMMNNNNNMLMNOPPQQPOOONNMMMMMNMNNOOOOOPPQQPPPQPPNNNNOONOOONNNOOOPOOPPRPPPOONNNNNNMMOPQPPPPPPPPPPPPPOOOOOONOPPOPPPPPPQQPPPPPPPPPPQPPOOOPOOPQQPOONNOPPPPONNNOPOOOOOPPPPPOOPPPPPPOPPPPPPPPPPOOOOOOPPPPPPPOOONOOPPPPPOOOOOOPPPPPPPOPPPPPPPOOOOOPPPPPPPPPPPOOOOOOOONNNNNNNNOOOONNNOPOOONNNOOONNNOPPOOONNNNNNOOOOOOPOOOONMMNNOOONMMNMMMMMMMMMMMNNOOOQQPPPPONNMLLLLMMOPOMMMNNOOOOOOOOOONOPPPPOONOOPONOONNNNOOONOPPPPOONNNOOOOPPPPPPPONNNNNOPPRV[`fny ~~}~~~~}{{zz{} ~zxtnjiknu~£¦¨«¯±´····»º¹»»»¼¼¼¼»»ººº¸¸··µ³±°¯®«§¥¢ }zvqnljjlkkkllkjhgghhjmpstvvttuwz{}}zxttttuwyzz{{zzzyxvwwxyzz{yuttwxz{{{{{||}}~}}}||}}||}|} |{{}~}~~~¡¥ª¬¯±´´¶········¶¶·····¸¶³±±²²±±²±°®¬¨¥yqmsy{ytrqppprrstvwxxz~}|{z{zzzz{||~~zvqlklmnqtvvvwusponnlkmoppppppppqnmjb\YVUTTSSSRQQQRRRRRRRRQQPPPPQQPPPPPPPPPQRQQRRRRRSSSRRQQQRSRQPQRRRQQQQQRRQQPPPQRRRRRSRRRRRRRRTTSSRRSSSRQQQRSSSRRRSRRQRRRRRRRSSRQRSTTTRQPPRSRRRRQQQQRRRRRSSSRQQQRSSSRQQQPPPPPPPQRSTSQPPQRRQPPQRRQQQQRSQPPPQQQQQQPPPPQQQRRRRRRRSRQPQRRQRSTSRRRRRSSTTSRRQQPPQQRRQQQRSSSRPPPPPQQRSSSSRRRRRSTRPOOPOPPPPQRRRRQQPPPPPPQQRSSTPPPPPPQSRRSRQQQQQQQQQQQQPPPPPQPPQPPPPPPPQPPPPPPPNNNNMMLLLLLLMMMMLMMMLKKKLMOONNNOPOMLLLKKLMMMLLMNMMNMMMNONPPPPOONNNMLLMMMNNOPPPPPOPQRQPPPQPPOMMOPOOONNNOPOOOOOPQRPPONNMMNMNOOOOPPPPPPOOPPPPPPOOONPPPOPQQPQQQQQQQQPPPPPPPPPPQPPONOONNOPPPOPPPOPPPOONNNOPOOOOOPPPOOOOOOOOONOOPPPPONPPPPPPPPPPPPPOOOOONNOPPPPPPOOONNPPPPPPPPPPPQQPPPMMMNOOPPOOOOOOOOOOOOOOOONNOOOPPPOPPOMMNOPOOOOOONMMMLMNOOOOONNNNNNOPPONNONOOONMMNNOOONMMMMMMMNNNNPONNNOPPQQQPPPONOONMMMNNOPOMMMNNOOOOOOOONMMMOPPPONNNOOONOOONNOOONOOPPPPOPONMNNONPPOOOOOOOOOOOPPPT[dltz}~ }{zz{{{{{{{{}~}zyxwwvwz} ~~|zzxtokkmnx¤§«®±³µ¶·¶¸»º¹»»»¼»»»»»º¹¹¸¸¸·µ³±°¯®«¦¤¡~zurpnnmpqrrrqqqnnmmllottuwvtttuux{|zvuttuvxy{{{zzywvtttuvwxyxtstvxz|{|}~}}}|}}}~~}}~~|~~~~~|{|{|~ }{z{||{}||}}} ~~ ¡¥ª¬¯±³³¶··············¶¸¶³²²´´´´³±°¯ª¥uotsz~ztrqqpoqrtvxyzz }{zzz{|}}}|}}~ztollnpqtvuvwvtrqqonmnpppppppoopmlib\YVUTSSSRRQQQRRRRRRRRQQPPPPPPPPPPPPPPPPRQQRRQQRSTSSSQPQRSRQPRSSRQQQRRSSRRQQPQRSSRRSRSSTTSSRTTSRQQRSSRQPQRSSTSSSTSRQSSRRRRRRSRQPQRSSSRPQRSSRSRRQQQRRRRSTTTRQPPRSSSQQPPPPPPPQPQSTTTRQPPRRQPPPRRQPPPQRQPPPPQQQRQPPPPPPPQQRRSSTQPPPPQRQRSTTRQQQQQRSSSRRQQPPPPQRQQPQQQQPPPPPPPPQQRRRRRRRRSSRQPOOOOOOPQRSRRQPPPPPPQQRRSSSPPPPOPQRRSSRQQPQPQQQQQQQPPPPPQQPQPPOPPQQQQPPPPPPPOONNNMMMLLLMMMMOONNMMLLONNNPPONOOMLKKLLNNMMMNNNPOONNOOONOPPPPPPOONNMNNNPPPPQRQPPOOOPPPPQRQPNNPQQPPOOPPPQQQPPPQSPPPNNOPPNMMNPPPPRQPPPPQPPPPPPPPOPPPPPPQQPQRQPOPQPPPPPPQRPPQQPPPQPPPPOOPPQQPPPOONOMPQPQQOOOOPPPPNPONNOPPPQQPONNOPPPPPPPPPPQQQPPPPOOPPQQQPPPPPOOOPPPPPPPPOPPOOPPPONOPPPONNPPPPPOONPONNOPPPPPPOOPPPQPONNNNNNOPPPONNOONNNNOOPPPNMMOPPPPOOOOOOOONNNNNNNNNNMMMOONNOOONOOOOOOOOPPPQQPPONNMMMNNNNOONMMOPPOONOOONNMLLMNOONNOOOONNOONNNNNNNPPPPOPPNNMMMNOOPONOOPPOOPQMPURUXaltz~ ~||{zxxzzzzyyzzz{}~}{ywwuttux| }zyyyxuusonlkn|£§«¯±µ·¸¸¸ºººº»»»»¼¼¼¼»»ºº¸¸··¶³±¯¯¬¨¥¤ ~{yvuuvvzz{{zyzzvuvwzzywzywvutrpsux{}}zyxwutuvwwzzzzzxwvtttuuvvvvuttuwyz|}}~~}{z||||~~}||{||}}}~~~|| {yyzz{||}}}~~ }{}||}}}¢¨¨«®±´¶¹¹·¸··¸··········¶´´´µ¶´µ´±±±¬§¡ osqty{||}|xtsqqrqsuwvw|~|{zzz||zz|}ytrpppssttuuuuuvutttrprpoopponnmjhd_ZVTSSSSSSRRRQRRRRQSRRQQPPPPPPQQRRRQQQQQQQRRRQQRRSSRQPPPRSSRQQRSSQPQQRRRRSSRRRRRRSSQQRRSSSTTSRRSTSSRRRRRRRSSRQRSSQPSRQRSTSRSRQQRSTTTRPQSTSRSRRQQRRSSSSTTSSSSRRRSSSRPPPPPPPPQRRRSSSSQQQQQQQQQQQRRRRRQQQQQQQQQQQPPPQSRRRSSSRQQPPPPQQQSRQRSTSRRRRRRRRSRRRQQPPPPQRRQPPPPPPPPPPQSSSRSSRRSRQQQQPOPPPPPQRRQQQPPPPQQQQRRRSSPPPPPPPQRRRRRRQQSRRSTTRPQQQRRRQQPPQQPPPQRRQPPPPPMMMMNOONMLKLLMMMNNNNNMMLNOOOOONONNMMLLLKMMMMMMNNPPOOOOOPOOPPPPPPOONMMMNNONOPPPPPPPOONNMMPPPPNNPPQQPPPPPPQRRQPPPQRRQPNNNLNNNOPPQRQPPPPPONPPPPPONMPPPPPQQRRSRRQPPQNOPPPPQRRRRRQPPQSSRQPPPPPPPPPPPPONPRQRRPOPPQQPPPPPONOOPQPPPPONOPOOOOOOOOPQQQPPPQOPPPPPPPPPPPPPPPPPPPPPPPQQQQPPONOPPPPPPPPPPPPPPPPONNOPPPPPOOOOPPPPPONNNNPPPPPPPPNNNNNNOOPPPONNOPPPPOONNOPPONNNNNOOONNNNMNNNNOPOOPPPPOOOOPPPQPPPONNMMMNNNOOONMMNPPONNOOONNMLLMNOOOOOPOOOOOOOOOOOONPPPONNONNNNNNNNONNNOPPPPPPNPSRXWboz }{zzzzzzzywvuvvxyz|{zxvutttvx|~|{zywtssrqqqnmmmns¡¥©«°±²µ·¸¸¸ººººº»»»»»»»»º¹¹···¶µ³±¯«¨¦¤¡}{zyzzz~ |{ywuspnqsuxzzzxwvutuvwwyyyywutsssrsttuvvuttuwzz||}~~~|{xyyyz}}{}}}}}}~~}||~}zxxzz{||||||}}}}zyyyxwxz{~¡§¦ª««±´¶¹¹¸¹¹¸º·¸¸····¶··¶µ´µµµ´µ³±±±¨£ rsrtwzzyz}}{yvttttsstvwz |zzzz|~|zz}|zvtqppqrstuvvvxywuttttsqqqqonnmjhfb\YVVUUTTSRRRQRRSRRRQQQQQQQQQQQQRRRRRRRRRRRRRRQQRRRRQPPQRRQRQQRSSRPPPPPPQQRSRRRRRRRQQRRRSSSTSSSSSSSSSRRRRRRSRQQRRQPSRQRTTTSRRQQRSSSSRQRSSSRSRRRRRRSSSSTTSSSSSRRSSSSPPPPQQQQQQRRSSSSRRQQQQQRRRRRRRRRRQQPPPQQQQQQRRRRRRSSTTRQQRRQPPRSTTSSSSRQPQRRSSSSQQQQQPPPPQRRQQQQPQRSRQQRSSRRRRRRSRRRRQPPPPPPQRRRQQPPPPQQRRSTTTSSPPPPPPQQQQRRRQQQSSSTUURPQQQQQQPPPPQQPPQRRRRQQQQQKKLMNOPOLKKKLMMMMMNNNNMMNOPPNMNOMMNNNMLKMMLLMMMMPPOOOPPPOOPPPPOOONNMMMNNNNNNPPPPPPOONMLLOOOOOOPPPOOPQRPOQRSTSSRRPRRQPPPNNOPPOOPQQQQRRRPPQRSSRQPPPPPPPPQQQPPPPPONPPQRRSTURSTSSRRRSSSRQPPPTSRQPOONPOPSQRRPOPQQPPPPPPQPPPPQQRSRQPPPRRRRRRQQPQQQQQQRRRRRQQPPOPPPPPPPPPPPPPPPPPQQQPPPOOPPPQPPPPPPPPPPOPPOOPPPPPPOOOOPPPPPOOONPPPOOOOONNNNNOOPOPPPOOOPPOOOOOOOPPONNMMMOOOONNNNMMMNOOOOOOOPPOONPPPPPPPONNNMMMNNOPPNMLMOPONNOOONONMLMNNNNOOOOOOONNNOOPPPOPPOMLLMMNNNNNMMNMMNOPPPPNPPTUV_bly ~{zzzz{}|{zywvvvwxzzzywvuuuwyz} ~|zyuutpnnmljkiilmot¢¦«¬±²´µ··¸¸ºººº»»»»»»»ºº¹¹¸··¶µ´±¯«©¦¥£ ~|{|}~~ ~{yvtpnoprtvwwwutttuvvvuvvutsqpqpooprtuuuttuxz{|||}}}{zwvtux{|{}}}}}}}}~~~}{{| {yxyzz{}}|{zzzzz|}}zwtuvttstux| £¥¨««°²µ¹º¹º¹¸¹·¸¸····¶··¶¶µµµµ´´³±±±®ª¥¢ttrstvuuwz|{zywwvvvvwy{ ~}zyyz{~{zz~{vqnmnorttvwwzzywvvvuttssrpnnmkigc_\YXWVVUSRSRRRSSSRQQQQQQRRRRRRRRRRSSSRRRRRRRRRQQRRRQRRRRQPQQQRSSRQPPPPPQRRSSRRRRRRRRRRRRRRSSSSRRSSTSSRRRRRRQQQRRQPRQQQSSSRRQQQRSRRSSRRRRRSRRSSSSRRSSTSSSSRSRRRSTSSPPPPQRQQQQQRSSSSSRRRRRRRRRQQQQQQQQPPPPPPQPQSTTRPRRRSTTSRQSSRPPQSTTUTSRRQPQRSTSRQPPQQQQPPPPQRQQQQQRTUTSRQRRRRRRRRQRRRRQRRQPOPQRRQQQPPPPQQRRSTTSSRPPPPPQQQPQQQQQQQTTUVVURPQQQQQQPPPPPPPPRSRRQQQQQQMLLMNNNNLKKKLMMMLLNOOONMNOPONNNNMNNOONMLLLLLMMMMNOOPPPPPOOPPPPOONNMMMMNNPOOOOPPQNOOONNOOOOOOOPPONMNPSTRPPPPQRRRQQSUUTTSPPQQQPPPPQPQQRRQQQRSTTRQPQQQQRRRSSSSSTTSRPQQQQQRRRTUUUVUTSSTTSSSSPPPPPPQQRPRSRSSPPPPPPPPQRTVUSQQRQRSRQPQRSSRRQQQQQRRQQQQRRSSRQPPPQQQRQPPOPPPPPPPPPPPQRRQPPPPQQQQPPPOOPPPPOPPPPPPQPPPPPPPPPPPPPPOOONNMMNNNOONNOOOPPPPPPPOOOOOOOOOOPPONNMNNOOONNNNNMMMMNOOONNNOONMMOPPPPPOONNNMMMMMOOONMMMNONNNOOOOONMMMNNMMMMMMNNNMNNNOOOOOOPOMLLMMNNNNNNNNNMNNOPPPPTTV[^iqx ~}|{z{{|}~|{z{zzzzzywvvvxz{|~{zyttromkjhfgghlnrx£§«¬±²´µ¶··¸ºº»»»»¼¼ºººº¹¹¸¸·¶µ´²°¬«¨¥¤¡~~ ~{yusqonnprsstssstttttrssttsqpnnnnnpstuuvuvyz{{{{||{zyttqpruyz|||{zz{{||}~~~}}{{|~yxxz|}~}|{zyxxxyzzxuttttsrstwz}¢§«ª°´¹º¹º¹·¸·¸¸·¶··¶¶···¶¶µµ´´²±±±®«¦£xtrrrsstvz}}}|{zzy{{|}{zzz||zyz} ~woklmnprtuvxzzzxxwvvuttttrqpomkhd_\ZZYYYWVSSSRRSSSRRRQQQRRRRSSRRRRRSSSSRRRRQRRRRRRSRRRSRRQPQQQQRSRQQQQQRSTUSSRRRRRRRRRRRRRRRRRRQQQRSSSRRRRRRRQQRRQPQPPPQRQQQQRRRRRQSSSSRQRSRRRRRRRRSSSSRRRRRQQRSSSSPPPPPQPPPQQRRSSSRRRRQRRRRRRQQQQQQPPOOPPPQQRSTTRQPPPRSSSRRSSQPOPQRSUUTSSSRRSTTRPOPPPQQQQQPPQQQQQQQRSTSRQPRRRRRQQQPQRRRRSTRPOPQSRPQQPPPPQRQQRRRQQPPPPPQQQQQQQRRRRRUUUUUUSQRRRRRRRRQQQPPPQRQQQPPPPQPONMMMLKLKKKLMMMLLNOOONNNNNNOOONMMMNMMMMMMMMMMMMMNOPPPPPOOOPPPPPNNNMMNNOPPPOOPPQNOOOOOPQPPPOOPOOPPPSVVUSRRQQRSSTUVWWVVTRSSSUVVTSUTTTUVVVWWXWVUSQQSUVWVVUPRSTTTUUVVUTSRSSSUVVVVVTVVVVVVVUVUTSSRSSPOPRQRTQRQQQSTTTVWXVTSTVVWWVUUVWTSRRRSTUSSSRRRTUVVVUTSSSSTTUTSRQPQRRRQPPTRPPRSRQSRRRSSRRPPPPPPPPNOPPPPPPPPPPPPOOPPPPPPPOPPOONOOPPPPOOOOOPPPPPPNNOOOOPPPPOONNNNOOOONNMMNNNMMMNNNNMNNNNNMMOOPPPPOOONNMMMMMNNNNNNNOONMNNOOOONNMNNNMLLMMMMMMOOOOOOOOOOOONNNNNMMMMNOONNNNNNOPPSVRV`hsx{ ~~}}||~~}~~~}|zywuwxz{}} ~{zxwssqmjhfddedfkpw¥¨¬¬±³µ¶··¸¹»»»»¼¼¼¼ºººº¹¹¸··¶´²°¬©§¦¤ }{ywuqnmmnnopqqrsttsrppqrrrqommmmnopqtvwvvyzzzzzzzzxwrpmjjntyzzzzyxyyyyz{}~~~}||}}zwwy{~~}zzyxxxyyyywvttssttvxz ¢¦¨¦««²·¸¸º¹¸¹¸¹¸··········¶µµ´³²±±°«¦£|urqqrstx{}{{~ }{{|~}{zz|}~xqnnnpqqrttxyyyzzxuvvuuuutttsqnje_[[[[\]\YVUTSSSSSRSSRRRRRRRSSSRQRRSSRRRRRRQRSSRSSTSSRRQQQRRQQQRRRRRRRRSTUURRRRRSSSRRRRRRRRQQQPPPPPRRRRRSSSRRRRRRRQPPPPQQQQQRRRRRQQRSSSQQRSSRQPPQRSRRRRQQQQRRRSTTTSRQPPPPPPPPQRRRRRRQQQQQRRSSSSRRRRRQPPPPQQRRSRQQQROPPQSTSRSSQQPPPPRSTTSSSTRRSTTSPOPPPQQQQQQQRQQPPQQQQQQQPPQRSRRQQQPPRRRRSURPOPQRQPQPPPPPQQQQPPPPPPPPQQQQQRRRRSSSSSUTSSSSSRQQQRRRSSRQQPPPPQQQQPPPPRPPONMLKJLKKKLMMMLMNOOONNNMMNOPONMMMMMMLLMNNNNNNNMNOPPQPPOOOOPPPPONNMNNOOPPPPOPPQPPPPOPQSSSSRRQPPTSTVWYWVVUSRRSTTVWXXXXWVVVVX[\[YTTTUWY[\\\[ZXVTRRUX\\ZWVVWYZYYYYXWVUTTVVVYZYYYWTXXXXXWVUYXVUSSSSRPPRQTVUVUTUVYYY[\\ZXWZ\_^]ZWVVVVVUUVWYZVVVVVVWYWWWVUTTUTTUUVVUUTUUUUTSRSQPPRTTTTSSSTTSRRRRSRRRRNPPQQPPPPPPPPPONPPPQQPPPPPPPOPPPPPPPPOOPPPPPPPNMOOOPPPPPONNMNOOPOONMMMMNNNMNNNNMNNNNNNNNNOOOOOOOONNMMLLLMMNNNNOONNMNNOOOONNNNNNMMMMMNNNOPPPPOOOOOOONNOOONNMLMNOPNNNMMMOPPSTPVenx} ~~~~|zxwyyz{||} |zxvttsrolhgecbbabjr{¥©¬²´¶··¸¹º»»»»¼¼¼¼ºººº¹¸··¶µ³±ª¦¤¤¡ }|zytomlkjlnpqrstsqonnnnoonnkllmnnnnsuwwwxyyxxxxxwutpnkhfhpwyzzxvuvwtuvy|~~~}}}~}~}zywxz~~}||{{|}~}{ywutuvvwy|}} £¥¥¥ª«°µ··¹º¹»¸¹¸··¸¹¸·····¶µ´´³²±°¯¬«¦£xttsttvz~~ }~}|z{}zwtrsssrrstxyyz{|zvwvuuttttvutqmg`[ZZ[]__][VVUTSSRRSSRRRRRRRSTSRQRSRRRRRQQQPQSSRRSTTSRQPQRSRRQQQQRRRRRRRRSSRRRRRSSTSSRRRRRRQPPPPPPPQQQRRSSSRRRRRRRQQQQRRRSSRRSRQQQRRRRRQQRSSRPPPPRSRQQQPPQQRSSTUVUUTSRRRQPPPQQQRRRRPPPPQQRRUUTTTTSSSSRQQQRSQRRQPPQRPPQSTTTSTSRQQQQQTTTSRRRRRQQRTSRQQQQQQQQQQRRQPPPQRQPPPPPPQRSSRQQRPPPQQRSTRPPPPQPPPPPPPQQRRQPOOPPQPPQQQRQQSSSSSSSSTSRQQQRSPPPQQQRRQRQQPPPQRRRQPPQRONMMMLLKLKKKMNNNNNNNNNNNNNNNOONNMMNOONMLNOOOOOOOOPPQQQPPPOOOOOPPONNNNOOPPPPPPPRSTTSQPQTVVWYYXVUUVVVWZ\\\ZXVVVWXY\^^^^__^^^_`bbcc[[[\\]^^]]^^^]]\bbcdcb`_YYZ[[ZXWWVVUUVY\`bcccdb^`````_]\VVVWY\^_^\\\[\_]]\\\\]__acfgfeefddca][YY[[[\\\\\\\\[Z[\\XYXVTSSTVVVVWWWXZYYXWWWWUVVVUUVWVUTUVVVUUVVVVUTSPQRSTTRQPQQQQPPOPPQQQQQQPPPPPPPPPPPPPPPPPPPPPPONNOOPPPPPONNMNOPPOONMMMNNNMMNNOONONNMMMNNNNOOOOOOONNMLLLLMMMNNNNNNMMMNOOONNNNOONMNNNNNOOPPPPPOOOONNNNNNOOONNMMMNNNNNMMMOPQQTVcpu} }{zzzz{{z{~|||}~}zzywutssssrokhgfdbccgnu~¦¨¬®²´····¸¹ºº»»»»¼¼ºº¹¹¸···µ³±¯¬¨¥¢ }|zuqmljijmopqssqnmkjiikllkkkllllllptwvvwwvvuuuttsromigfhntwwwvtsstsstwz|}|z{{|}}}|z{{|{zzzzz} |zyyxyz{zzz ¢££©¬¯³µµ·¸·¹·····¸¹¸·····¶µ´´³²±°«ª¥£ {xvuuvx{ ||zz{~}{zvwwutsstwxzz{|zxvutrqqqrttsqnh`\YXX[]__]YXVUTTSRRRRQRRRRRSTSRQRSSRRRRQQQPRSSRQRSRRRQPQSTSRRQQQQRRRSSSRQQSSRRRSSSSSSSSSSSSQPPQRPPQQQRRRRRQRRRRRRQRRRSSSSTSSSRQQRRQQQQQQRRRQPPPPQRQQQPPPQQRRSTVVVUTSRRRRQQQQQQQQQQPPPPQQRRUTTTTSSSSSRRRRRRQQPPPPQRRRSTUTSRSSRRQQRRTSRQQRRRRQPQSTSRRRRRQQQPQQQQPPQQRQPPPPPPQRSSRQQRPPPPQRSSQPPPPPPPQQQRRRRRRQPPPPQRPPQQQRQQSSSSSSRRRRQPPQRRQQQPPQQQQQRRQQRRRSRQPPQRLLLLMMMLLKKLMNNNONNNNNNNNOPONMMNNOPQQPNLOOPPPPPPPPQRRQPPPPOONNOOOONNNOOPPQRRRSTUVVUSRTVZX\^`^[YYWXXZ\_bbhfeeghijijihghgfiiiihilnrqpnmjhfhiknprttwusonmmnnmlmmlif^^]]_bfhjmooprplkkklmlkilkjijklmoljighihggfdbbcehlswwtqonoppnnmniiiihgfecba_]\]^bbb_\[[\ZZZZZZ[[^]\ZZZ\\]_`]YVVXYXWXZ[ZYVVWWWVTSSTUVVVUSRRSSRQPPQQQQQQQQPPPPPPPPPPPPPPPPPOOOPPPPNNOOPOOOOONMMNOPPONNMNNNMMMNOOOONMLLLLMMNNNOOOOOOONMLLLLMMMNNNNNNMMMNOPONNNNOONMNNNNNOOPOOOOOOOONMMMMNNNOOONNMLLMMMMMNPPTQWct~~ }{{{zz{~|yxyyz|~~{wtrrpppprrrqnjhgfecgjov{¥§«®±³¶·····ºººº»»»»¹¹¹¸¸··¶³²±®«§¤¡~|{vqmljhilnnpqqoljgeefhjkjkkkkkkkkotwvuvvtttttsrqpmjhffhlqtuutrpqrtttvyzzzxyzzzzzzyyyxxyzz}~|{zzz|zxw{ §ª¯³´³µµµ¶µ¶¶µµ·¸·¸¸···¶µ´´³²±°«©¥¤~{ywwwx{~ ~z{zyz~|{|}~~}}}}zzzxutttuxzz{{zzutronmnnqqqpmh`\XVVW[]^^[ZWVUTSRQQQQQRRSQSTSRQRSSSRRRQQQQRSSQPPQQQQQPQSTSSRQPQQRTTUUTSRQTSSSRRRRSSSSSSSSTRPPRSQPQQRRRQQQQQRRRQQQRRRSSSSSTTSRQQRSQQPPQQRRQQPPPPQQQQQPPQQQQQRSUUUTSRRRRRQQQQQQQQQPPPPPQRRSSSSSRRRRRRQQQQQQPPPPQRRQTTTTTSRQQRSQPPQSSQPPQSTTTRPPRSSRRRRRRQPPPQQQQQQRQPPPPPPOPRTTRQQRPPOPQRRRQPPPPPPPQRRSSSSSQQPPPPQQPPQQQQQQRRRSRRRQQQQQQQQRSRRQQPQQPQRRRSSTRRRPOOPQLLLKKKLMNNMMMMNNMLKLNOONOPOMLMNNOPPPPPOPQQQQPPPPPPPQQQPPPOONOPQRPQQPQPPTTSSUWYYXZ[\^abccdefffghikkmoonnnrpnopponqqrrqqrssttwz|}|zyz{z|~ z{zyxwwwwwutstuwyzxvwy{{{{zxwxxwv{{|{yusqnqttttwzzzyvsrstz||zzzwwwwwvvvttssttttssttsqpomosuvusqrrqppqqqonkgcdhlgcaaa^\\\[Z[\]\\[Z\_`]\\ZYXWVTRPQSTTSRRRUSQQPPPPPPRRRQPPPOOPONNOMNOOPPPPNNNNNOOOOONNNOOPPPPPOOOONNMMMMMMONMNOOOOPOOOONMKNNNNNNNNOONNNNOOONNNOONNNNNNOOPPOOPPOONMNNOOPPPPNNNNNNNNOMLLNPPPVU_q} }||~~|zzyxvvwvtsqonnoqrrttpmkigdgjsx¢¨««±²´¶······¶¶··¸¸º¹····´²±±¯¬ª¦¡ ~}}}{zxtqnljiimppnlhdfbbbbcfhjiiiihhjjnqtwvuttsrqqqpnnligfefkqrtttqoooqrtxxusrwvvwxxwuvvvvwyz| ~}}}xtvyz}¢¥°±±°±±±®°±³µ¶¶¶···¶µ´µ³³²±¯¬ª©¤¡~zvvwxz{} ~~z{zz{{yxyzz~~~~~~~}|zyxxxyz|{{{{{zyxvtpliilnqspke^XWVVWYY[\`^\[YWTQTRQRSRQRRSSRQQRSRRRRRRQQQPQRSTSRRRRRRRSTSRQQRRRQSTTTTTSRTTTTTSRRSSRRRRRSSSRQQRSSRRRSTSRQPQQRQQRSRSTSSRSTSSRRQQSTSRPPPPPPPPPPQQQQTSQPPPQQQQQSUVTRSRRRRRRQQQRQQQQRQQQPQRSTTTSSSSSSRRRQQPQQPPQQPPPQRSSSRQPPSRQQSSQPQPPPPPQRSRQQQQQQPQRRRRQQQQQPPPQQSRQPPPPPQRRRQQQRRQPPPPPQRPPOPPPPSRRSTTSSPQQRRRRSQQQQQQQQUUTSQPQQQQQQQQRRSRRRRPPPQQQQSTTSRQQQQPPSMMMMLMNOPPOOOOOOMLLMOPPOOPPNMOPPOPPPPPPPQQQPPPPPNNOPPPPPNOOPPPOOSUUUVSTXXXYZ\\\\\^`bcdefjlnoqtwz|{zzyxz}~|{|~ ~~~~~}}}}~}{ywwz|xvtvwwvvsqonnnnnkiiihd`]ZZ[\\[ZXVVVURQSTRPPQSSUVVUSQQQPPONNOOMMNNOOPPPPPOONNNOOOONNNOOOOOOONNNNNONNMMNNNONMNOOOOOONOOONMNNNNNNNOONNMMNNONNMMNNNNOOOOOPPPOOOOOONNOOPPPPPPPPOOONNNMMMMOPRTVXdt~ ~~~~~ ~}~|{zywvuutrrqpprsttvvtqnljhknx} ¥ª«°±²³³²²³´´´µ¶········¶´²°¯«©¥ ~|zwtsqnljjlnpomjebdbbbbbcfghhhhhhjkmotuuttsrqppponmkhfdbbflpqrrqonnnptvvtqqttuvvvuuuvwxyz} zusstuwz¤¦¨©§¥¥¦¦¥§ª®±µ····¸·¶µ´´²²±°®«ª©£ ~zvvwwy{~ {z|~~~{|{{|zwvy{}}}~~~}||zyxxyz{{}}|{{zyxxusokhhjnpsqnh`YVSSVX[\]_]\[[ZWVURQQRQQRSSSSRQRSRRRRRRRRRQQRSSRRRRRRRSSSSRRRRSRQRSTSRSRPRSSTTSRRRRRRRRRRRRRQQRRSRRRSTSRQPQRRQQRSSSSSRRRSSSSRQQRSRQPPPPPPPPPQQRSSTSRQPPQQRQQSUUTSRQPPQQQQRRRQPPQQRQPPPQRSRRSSSSSRRRRRQQQQRRRQPPPPRRRQQQQQRQPQRSQPPPPPPPPPRQQQQRQQPQQRRQQPPPPQQQQQQQQQQQRRRRRRQPPQQQPPPPPPPPOPPRRSSRRRSSRQPPQQQQRRQQQQQRRRTTSRQPPQQQQQQRRRSRRSRQPQQQPQRSSRRQQQPOPPLLMMMMOPPPPPOOOOMLLMOPPPNPPOOPPPOPPPPPPPPQQPPOOPMMNOPPPPQRSTTTTTTVWYZXZ`cbbabcgijlnopruxvwz{}~}{zywwuttqlgbbcddba_ZZYVTRSTXVTTUTUVYWTRQQPPNMNOOMLMOOPPPPPOPOOOOOOONNNOOOOOONNMMMMMNNMMMNNOONMNOOOOOONOOONNNNNNNNOONMMMMMMNMMLMNNNMOONOOOPPOONNNNNOOPPPPPPPPPPOONNNKMNNOPSVX]kw~}}~ ~{{|} ~{zxwvvutvuvvxyyzzzzuronlmpy¡¥§©«¬®®¯¯±±³´µ¶¶¶µ´´´µ´³±¬ª¨¨¥ ~{wtpppnljknnpnlifdfeddcddefghhhhhjklnrttsrrppooonnljheca`chnnnpqpnmnptutqopqstutttuuvxz|~ |xuuvvwyx| ¢¥©±³µ¶···¶µ³²²±±°¯«©¨¢zvvwwy| ~{ywwyz{{{|}}~}}~zwwz|~~~~~}{zzvvvxz|}}}||{zzxvvtrniffhloqrpkbZVTRUY\\]\\[[\\\[WUSRQQQRSSTSSRRRQQQQRRRRRRQQRRRRSSSSSSSSSRRSSSRQRTTSRRQPQRRSSSRRRRQQQQRRRRRRRRRRQRSTTTRQQRRRQQRRSSSSRQQRSSSSRQQQRRRSSSRPQQQQQRSSSSRRQQQQRQQRTUTSQPPPPQQRSSRRPPPQRQPPPQRSPQRSSSRRQRSSRQQQQRRQPPPPRQPPPQQRQPPQRSRQPPPPPPPPPPPQRRRQPPPQPPPPOPPQQPPPPPPQRSSSRSRQPPPPPPQQQPPPPPPPQRSSSRQQQQPPPPQQQQQRRRRRRRRRSSRQPPPPQQQQQRRRRQQRRQPQQQPQQQQQQQQRPONOKKLKKLMNPPPOOOOPMLLMNOOONPPPPPPPMNOPPPPPPPPPPOOPNOOPQRRPPQQRSUVXRUWZ[X[bghhhilorqrstuz~ ££ ¡£¢~}~ztwwxxwtqoklmmkhfcXVTUVVXYWVVTSQPPONNOONMMOPPPPPPPPPPOOOOONNNOOONNONMMMMMMNMLLLMNOONMNOOOOOOONNNNMNNNNNOOONMMMMMMNMLLMNNNNNNNNNNNNONNNNNOOOOOOOONNOOONNNMMMMNOOPSU[cr|}||} }|zz{} }{zzzzzz}}~||{yutqonpw} £¤¥§¨©ª««°±³´´µ²²²²²±°¯«¦¤¤ ~|zuronnnljkmlnmkljjliihhhhhhhhihhhjklnqssrqpooooonmkhgedbbdhijknqqomnpttrnnopstvvvvvuwz| zwuuvvwxxz¢¥©°±³³´´´´³²±±±±¯«ª¨§¡{wwwxz| }zzyvtuvxyzzzz{}~}}}~~{zzz{{||||zvttrttwz|}|zzzzyxwvtrplhdehjnpqokc\YVTUVXZ\[ZZZ\\\\ZXVTRRSTSTTTSSRRPPQQRRRSRRQQQRRRSSSTTTSRRRSSSRRQSTTTSTSQQRRRRRRQQQQPQQQQRRRRRRQQQRRTUTSQSSSRRRRRSSSRRRRRRSSSSRRRSSSTTTSRSSRQPPPQRRSSRQPPRQQRSSSSQPPPPQRRRRRQPPPQRQPPPPRSQQRRRRRRQRSSSRQQPPPPPPPPQPPPQQRSQQPQRRRQPPPQPPPPPPPQRSRQPPPPPPOOPPPPPPONPPPRRSSSSSSRPPPPPPQRRQPPPPPPQQQQRQQPQPPPPQQQQQRSRRRRRRSSRRRPPPPQQQQQRRRRPPPQQPPQQQPPPPPPPQRRQPPPMMMLLLMNOOOOOPPPNNMMNNONOPPPPPPOMNPQRQPPPPQPPPPPQRQQTVVTWXZ[\]`behjkkijqnswz{z{{¡¤¥¤¢ ¡¢¡ ¢¢£¢¡ ¡¡¢£¤¥¥¥¥¥¤¤¢¡¡¡¡¢ {{|~}yttnhc_[XVZZZWURQQQPPPPPNNPPPPPPPPPPPPOOPPMNNNNNNNPONNNNNNMMMLMNOOONMNOOOOOOONNMMMNNNNOOOONNNMMNNNMMMMNONNMMNNNNNNONNMMNNOOOOOOONNNNNNNNNNPONNPQRS^hv ~}} ~}}{|}~ ~~~~|zzyvsqsx{ ¡¡¢£¥§ª¬®°±±²²±±°¯¬«©¥¢¡ ~~}}}}~~~}|{yutpnmmmkiijlkknnnqnnnnnmlklllkjjklnprtsrponnnnnnljhgfdcbeggghmqsqnnprrolmoqsuy{|{zxz| |{z{|{{|{} £¨¬°±³´²±±±²±±¯±¯¬«©¦¥ }zyzz{~ |yvwvttvwxyyxxyzz|~|{{|~~{yyyyxyxxwtnllpsuwz||zyxxwvuttrqolgcehjnqomic^ZWUTSTVZ[[ZZ[[\\[ZWUTSTTSSSTTSRQPPPQQRRRQQQQQRSTTSSTUUSRQRRRRRQQRTTTTUTSRRRRRQQQPPPPPQQQRRSSRRRQQQRSTTSRTTSSSRRRSRRRSSSRQRTTTSSSRRQRRSRRSRQPPPPPQRSSRQPPRQQRRSRRQPOOPQRRQQRQQQQRRQPPPQRSSRRQQQRRQRSSSRQQQQQQPPPPPPQRRRRRSRRRRRRQQQRRRQQPPPPRSSRRQQPPPPPPRQPPPPPPQQRRRRRRSSSRPPPPPQRSSRQPPPPPPPPPQQQQQQPPPQQQQQRRRRRRRRSSRRQPPPPQQQQRRRRRPOPPPPPPQQQPPPPPQRSSRRQQPPPONMNOOOOPPPQQPPOOOOOOPPPPPPPOOPQSTTSRQRRRRRSTUUTUW\\[WZ\^__`alqssttuz ¡£¤££¢¢¥¥¦¦¦¥£¢ ¡¡¢£¤¥¥¥¥¥¤¤¥¥¦¦¥¥¥¥¥¤£¢¢££¤¥¥¥¥¥¥¦§§¦¥¥¥¦§¦¥¤£¤¤¤¤¥¥¥¦££¤¤¤££¢¥¤£¢¡¡ ¡¢¡¤¢¡£zurpnnnhfb^ZWVVVSRRSQPPPPPPPPPPPPPPPPPPNNMMMNNNPPPOOOONNNNNNOOOONMNOOOOPPPOMMMMNNNOOOOONNNNNNNNNMMNNOONNNOOOOONNNNMMNNNPPPPPOOONNNOOOOPPONNPRRRbjy ~}~~{xwxz{¡¤¦©«¯°°°¯«ª¨¥¡ ~}|{zzzz{}}|{zyxvrommmkihhjijnpqtuttttsqoppoonnoorstttrpnnnnnnmjhhgebbbbdffhkpsronopomkmpstx||~ £¦«®±±³´±±°±±±°®®««ª§¥¢ }}~}~ ~xutttstwyyywvvxzz||||}~{wttuuttttsnjhhntxyz{{zwvutrqpqqpnkfcehjnpnlhd`ZWUSQRVZ\[[ZZZZYYZXVTTTSSRRSSSRRPPPQQQQRQQRRRRSTTTSTUUTSRRRRQQQRQSTSTTTSSSSRRQQQQPPPQQRRSSSRRRRRRRRSTTTSUTTTTSSRRRRRSSSSRSTTTTTTSSRRRSRRPPPPPPPPPRSSQPPPRRRRSRRRPPOOPQQQPQQQQQRSQQQQRRSSTSRQQQRSQRSSRQQRSTTSQPPPPPQRSSRRSSRRRRRRRRRSRRRRQQQQRSRRRRQQQQQRRRQPQQSSSSSSRRRQRSRQQPQRQRRRRRQQPPPPPPPPQQRRSRQPPPQQPPQQRRRRRRRRQQPPOPPQQRRRRRRRPPPPPPOPQQQQQPQQQRSRQRSSPPPONNOOPPPPPPQQPPPPPPPPPPPPPRQPQQRSUVVUSTTUUVVVWWWX]cfeehjlllmnt{~} ¡¢¤£¡ ¡¢£¤¡¡¡¡££¤££¤¥¥¤£¡ ¡¢££££¢¥¥¥¥¥¥¥¥¥¥¦§§§§¨¦¦§¨¨¨¦¥¥¥¦¦¦§§§¨©©©¨¨©©¦¦¦§¨©©¨¦¦¦¦§§§§§§§§§§§§¨©ªªª©§¦§§¦¦¥¥¥¥¥¦§©©©¨¨§§¦¥¥¤¤¤¢£¢ ¢£¢£¡ }zywwxtnieb][YVTTTSRRSRQPPPPPPPPPPPPPNNMLMMNOOPPPPONNNNNOOOOOONMNOOOOPPPONMNONNOOOOOONNNNNNNNNNMNNONNNOOOOOONNNNNNMMMOOPPPOOOOOOOOOOOPOOOPRTUdjy }{|~|¡¥¨««««ª©§¥¥~~}||zzxwvvwz|~}}}~~}{zzyxwronnmkjjjkklqttvzzyyywtrrrsssstuuvvutronmnnnnligedb`__abffgkorqponnnllnrvy} £¨«®±±±±²±°¯°±±¯¬««ª©¨¦£ }uttsstuwzzxvuvxzz|}{|}~|xurppqpoonnnkgfhntzzzzzxttronnnooonidabfimnmkid_YVRPPQUXZZZYXXWWXZZWVUTSRRQQRRRRQQQQQQQQQRSSSRSTUTSSUVUTRSRRQQRSRSTSSTTRSSSRRRRRRQQQRRSSSSRRQQRRRRRRSTUTVUTTTTTSSRRRRSRQRSTTSSTTTTTTTSRQPPQQQQQPPQSRQPPQRSSTTSRRQPPPQRRRPQQQQQRSPQRSSTTTSSRRRRSSQQRRQQQRTTTSQPPPPQQQRRRRRRRRRRRRRRRRRRSSRQQQQRQQQQQPQQRSRQQQQRSSRRQQQQQQQQQQPQRSRRQQQQQQPPPOOOPQSSTTUTQPPPQPPPPQQQQQQRRRPPPONOPQRRRRRRRRQPPQQPOPQQRRQQRRQRQPPQSTOOONMMNOPPPPPPPPOOOOOPPPPPPPQSSQRRQRTVVVTUVVVWXYYZZ[binmqrtttvxzz¡¡¤£¢£¤¤£¢¥£¢¢£¤¥¥¥¥¥¥¥¥¥¤¥¤££¤¥¦§¥¥¥¥¥¥¥¤¥¥¥¥¥¥¦§¥§¨©©¨§§©¨¨©««©§§§¨¨©ªªª¨ª«¬««ª©©ª«««ªªª««««««««ª««ª©©«¬««¬¬¬¬«ª¨§ª«««««ª©¨©ªªªªª«¨©¨¥¥§¨¨§¦¥¥¤£¢¢§¤¡¡ ~xtpkc][XVUUTSSTSQPOOPPPPPPPPPPNNMLLMNOOOPPPONMMMNNONNMONMNOOOOPPPOONOPNOOOOOOONNNNNNNNNNMMNNNMNNNOONNNNNNNNMLLNNOOOONNOONNNNNNNOPPPRUWfjx ~¢¥¥¦¦¦¥¤£¢ }||{{zywvttstvz{{z{|||{zzyxwrpnnmllnlmmntwxz{zzzzwtqssttuvxzxxwvtrnmmmmnmkhfcb`^]^`affhknqpoonnmlmqty| ¢¦¨«®°°±±²±¯®®°¯«©¨¨¨¨¦£ }tttsrtuvzzyvuvz||}~{{}|~}yvponnonljihhigccfltzzyxxwrqonllnonnlhb^`chjlkkic]WSNLMOQUWWXXWVVVXZ[YWVUSRQPPQRRRQQQQPPPPQRTTSRRSUTSSUVVUSSSRQQRTSTUTTTSRSSRRSSSSRRRRSSTTSSRQQQQRSRQRSTUUVUUUUUTSSRRRRRQPSSTSSRSTSSSTTSPPQRRSRQPPPQRRPPPQSSUUUTSRRRRRSSSSPQQQQQRSPQRSTTTTRRSSSSSSQQRQQQQRRRRRQPPQQQPPPQRRQQQQQRRSRRQQQRSSSRPPPQQQPPPPPQRRQQQQQQQPPPPPPPQQPPPPPQSTSRQPPPQQPPPONOPQTTUVVTQPPQQQQPQRQQQQQQQQPPONNOPQRRRRRRRRSRRRRPPPQRSRRRSTQQPNNPRSPPNMLMOPPQQPPQQPPOOPPQPPPPPPQRRRSTUVVWXYXY[\[Y[]\`cfiouxzyy ¡¡¡¡£¥¥¦§¨§§¦¦¦¥¦¨ª««©¨¨¨¨©ªª¨¦¦§¨¨¨©©©©ª«ª©§¦¦§§¨¨¨¨ªªªª«««««¬¬¬«ª««¬¬««ª««¬¬¬¬«®¯°°°°±±°®®°°¯°°¯¬¯±°°¯¯¯®®®®®®®««¬¬¬¬¬««¬¬¬««««««ª©§¨©©¨©¨§§¨¨§¥§¥¤¤¥¥¤¢ztmh_a^YXVVWZXUPNNPQPPPPPQQQOOMMLMNNOOOOOONMMNNOOOOOMMNNONNNQPPQPONOOONOOOONNNNNNNNNNNMMNNMMNNNNNNMMNOONNMLKNOOONNOPPONMMMNOLPPPRUX\gnz ~|} ¡¥¤¢¡ ~}|zzzywutsssrsvyzz{|z||{zzwutsqpqrtuutrtvyzz|{zxxvuttvxyz{||{zzyxuqnnmlkihebaa`__`bcghjmnnooomkkmnruz} |{|~ ¥¦ª®®¯°°¯®¬«ª©©©§¨¨¥¤£¡wutsttuvyyxwvwz{}}~~|}}xtttmlef]abfefebachnuxvwywurqmlieijkkfa`^_bgedgheb`TOKKJGJOSTUUUUVVVVWWWVUSSQPPRSSRSSRRRRRSSSTTTTTTVVVVUUVVVUSSTUUUTSSTUUSRSTUVUUUUUTSSTUTTTTUUUUTTSRRSTTUUVUTSSTUVVUTSSSTTSRSUVUSSSSTTSRRQQQRSSSRQQPPPQRRQSSSSSSRRRRSTTUUUSTTSRRSTUUUUTTTTSSSSSTTTQRRQPPPQRSSRRRSTSRQQRSSSSRQQQPQRSRPPQSTTQQPPQQRSSRPPPQRRQQQQRRRRQRRSSSRRQPOOPQRSTSQQQQQPRQPONOPPTUUTRRRRQQQPPPPRQQQQQQQQPPPPPPRTUTSSTTSSSTTTSRRRRSSRQQRSQQPPPPQSPPPNMNOPPPPPPPPPPOOPPQPPPPPPPRSTUUUVX[\\a`behhhhqqnlnv¡¡¢¤£¢¢¤¦§¨©©¨§§§§§©ª«««ªªªªªªªª©§§¨ªªª«««««¬¬«ª¨¨©©©ªªª««««¬¬¬«¬®¬«¬®®¬¬¬®®®®¬¯°±±±±²²±¯¯±±²±±±°°°°°°±°°¯¯¯¯¯±±±±±¯®®®¬®¬¬««««¬«««¬«««ª¨©ªª©§ª§¦¦§§¥¤£¢¡ {urtqha__`bYWVUUSPLPPPPPPQQPOONNNNNNNNNOONNOOOOOONNMMNNNNNNPOOPPONOOOOOPPOONNNNNNNNNNNNOOOONNNNNNNNOONNNMLLNOOONNNONMMMMMNNPQPORV\bhp{ }|{zxvxz~ ~|zzxwutrqppprtxz{|}~|{zwusqrstwz{zzz{||}zywvuttsruxzz}~}}|{zzvrnmljihfdba`__`bdehhiklmmmkihjmotwz} }{zxxz{| ¢£¦ª«¬®¯¯®«ª¨§¦¦¤¥¤¢ utrrrttuyxwuuuwyzz{}xttqmi``\_]``aa`_bemtxvwywvsrljf`bchifb`^^befghhe`\SMIIHGILMNPRSUVWVVWWWVTSSRRRSSRRSSRRRRRRSSTUUVVVWWXXXWWVVVTTTUUTTTTTTTUVSTUUUTUUVUUUVVVVUUUVVVUUVTSUUUUUVUUUUUVVWVVUUUVVVTSSTSTTUUUUTTTSRSSTTSRQQQQRSSSRTTTTSRQPRRRSSSSTSTTSRRSSSSSSSSSSSSSSTTTTRRRQPPPQRRRRQQRTTRQQRSSSSRQRRPPRPPPPQRSTRQQRRRSSSSRQQQQRRRRRRRRRRRRSSSSRRQPPQRSTTSRQRRQPPPPPPPQQRTTRQQQQPQQQPPQRQQQPPPPPPPPPPQRSTSSSTTSSRSTTSRSSSSSRQQRRRRQPPPPRPPPONOPPPPPOOPPPPPPPPQPPPPPPQTVWZXXZ\__^abgloqqqy} ¡¡¢¢¢¢¢£¤¥¦¥¤¤¥©©ªªªª©¨¨¨ª«¬¬¬««««««««««©©««««¬¬¬¬¬««««««««««««¬¬®¯®®¯¯¯®®®¯°®¯¯¯¯¯®®®¯±±±²³´³²±±²´µµ³²±²³³²±²±±±±±±±³³³²±°°°°¯®®¯¯¯¯°¯¯®¬¬«¬¬¬®«¬««««««ª«ª¨¨©©§¥¥¥¥¤¢¡{zqjhfbbc_YTQPQQPPOOOOPPPPPPOONNMLMMOOONOOOONNMMMMMNNNNMOOOPPOOOONNOPPOONNNNNNOONNNNOPPPOOOOOOOOONNNMMMMOOOONNNNLLMMMMMMPPPQVY_hnw }zxvuttuxz} }{zyxvtsqpppqtwz{~}{ytsrstw{~}||xvuttsrrqtxz{||{|zzzyvrnkigedccba__`bfhhiiiijjjkhhhknqtwz} ~|vvuuvwyz ¡¥§©««««ª¨¦¥¤£¢¡¢¡xvtttvwxvutrqqstuvy}zvtrng\[Z[V[\^_^^bdmtwvxywwsrlic\\]bedb`]\_beggge_YRLGGHHIKMOPRSTUVUVVWWVTSSTTTTSRRRRSSTTTTUVVVWYYZY[\\\\[ZZYXWWWWVUVVUTVXZXXXXXXXYXWWWWWWWXXYYYYYYXVVVVUUUWXXXXXWWYXWVVVWWWVTTTSSTUUUTTTUUSTTTTTSRQRSTSSSSTTTTSRQPSSSSRRRRTTTSRRRSRRRQRQQQRRRSSSTTRQQPPPPQQQQQQQRSTSRRRSTTSRRSSQPQPPQQRRRSQQRRRRRRTTSSRRQQRRRRRRSSRRRRRRSSRRQQRSSSSSRSSRRQPPPPPQQRQRRQPQQPRRSSRQQRQPPPPPPPPPQRRQQRRRRRSSSRRRRRRSSTRSRQPPPQSRQPPPPPNNNNNOPQPPPOOPPPQQQQQPPPQRSTUVY\^_`bcccbhnw||}¡ ¡¡ ¡¤¥¥¥¥¥¥¥¥¦§¨¦¥¥¨««««««ªª¨ª«®®¬«¬¬¬¬¬««¬¬¬¬«¬¬¬¬«««««¬¬¬®®®®®®®®®¯¯°°¯¯¯°±±±±±°°°°°°±²³´µµ´³±±³´µ¶´³³´µµµ´´´³³³³³³³³³±°°±²²±±°°±±±±±°¯®®¬«¬®¯®¬¬¬¬¬¬«ªª«ª©¨¨§§¥¥£¡ }zvqnmnkd\VUVSRPPPPPPPPPPPONNMMMMOOOONNNNNMMLMMNNNNNNPPPPPPOPMMMNOOONMMNNNOOONNNNOPOOOOOOOOPPOONMMNNNNOOOOOOOMMMMMMNNOPRVZ\bnx ~ }zywutttvyz} ~}{|||}}~~}{zzxvtsrqrrtvyz|zutsstx|~{zwvutsrrrruxzzzywwutuutpnhfcbabbba``bfiklkkihhhhhhhknqtvwz} |zvvvvwwyz ¡£¥¥¥¥¥¤¢ xvttttuutsponnnpstvz~}yvrmd[XXWTXZ\]]^bdmtwvxywwsqljcZ[\]ab`^[Y\adfeee`ZQKGGGGIKOPRSTSSSSUVWVVTSTUVVTSTUTTUVXYYYZZZZ[\\]]^`aaa`_]]\\\\\\YYYXXY\\]]]]\\]^\\[ZZZZY\]]]]\\\ZXWXXWVV\\\]]\\[[ZZYYYYZWVVWWVTTVUUUUUUVUUUVVVVURSTTSSSUTSRRRRRRTTSSSSSSTTSSRRRSQQQQQQQQQQQRRRSSQQPPPQRRRRRQQQRRTSRRRRSSSSSTSQPPQSTTSRQRPQQRRRQQSTTTSRRQQQQRRSSTSRRRRRSSRRQRRSSRRSSSSSRQQQQQPPQQRRRQQRRQTTUTSRQQQQPPPOOOPQRSSRQPQQQQQQQQQQQRRSTURRQPPOPPQQPPPPPPNOOOOOPQPPPPPPPPRRRRRQQPRTVVWY\]_bfghhjlow ¢¤¥¥¥¤£¢ ¡£¤¤£¡ ¡£££¢¡¡¡£¤¦§¨©¨§§¨©¨¨§¦¥§ª¬¬¬«««««©«®¯®¬¬®®®®®®¬¬®®«¬«¬®¬«««««¬®¯¯¯¯¯®®¯¯¯¯¯°°±±±±±±²²±±±±±±±±±±²³µµ¶µ´³²³´µ¶µ¶¶¶µµ¶¶µµ´´´´´´´´³²±²´µµ´²±±±±±±±±°¯®¯°¯°±±±®®®®¬««¬¬¬«¬«©¨¦¦¥££¡ }zxvwttph`ZXZUTRRRRQPPPPPPONNNNNNOOONNNNNNNNNNNNNNNNNPPPOOOONMMMNNONNMMMNNOOOOONOOOONOOOOOOPPOONNNNNONNNOOPPPPOMLLMNOOQTX\_ht |zwtsttuxz} ~}|||}~ ~|{zzz{|}~~}{{zywutttstvx{ ~|wutttw{}zxxvtsrrrtvzzzywttrqqrpnjfca__abbbbbeimnnlkihggghiknqtwxy|~ |yxvwxyyyzz ¡ {zxwvutttqnmmlmnpqtz}~|ytmc^YVTUVX[\[\_blsuvxxvwsrnmeZZ[Z^_]\YVX_cfeed`YNJFDDCEIMOPQRQQQRTVWVVVVVVWVUUVYYZ[\^^^]\\\\\]_``aabbbbb____^^^^]\\\]]]]^^^]]]^_^^^^^^^_```__^^]\[Z[[[Z[]^_``_^]]]]\\\\\ZYZ[[YXXYYXXXXXXXXXXXXXWVVVUTTVWVTSQQRSTTTSSSSSSSSSRRSSSRRQQRSRQQRRRRSSSQQPQQRSSTSRRQRRRSSRQQQRSSSSTTQPPRSUTSRQRPQQRRRQQRSTTSSRRRRQQQRRRSRRRRRSSRRRRSSSRRSSSSRRQSRQPPPPQQRRQQRSRSSSSSSRQQQPPPPPPQQRSSRQPPQQQQQQRQQQQRSTURRRQPPPPPPPPQQRRPPPPOOPQQPPPPPPQSSTTSRRSSVXZZ\^a`eikknty ¡£¤¥¥¥¥¥£¡ ¢£¤¥¥¤¢¡¢¢¢¢¡ ¡¤¦¦¦¥¤¤¥§¨ª««ª©©©«©§§¦¦¨«««««««««««®¯¯®¬®®¯¯¯¯®¯¯¬«¬®®®®®¯®®¬¬««®¯°°°¯°¯°°°±±±±±±²²²²³´³³²²²²²³²²²³´µ¶¶¶µ´´´µ¶¶····µ´µ¶µ´´³³³³³´³²±²³µ¶·µ³²²²²²²±±±°¯®®®°±±±±²²®®®¯¯¯¯¯¯¯®¯¯°¯¯¯®««ªªª§¦¥¤¢¡¡ ~|ulebba_VURQQQQPPPPPPONNOONNNOONNNOOPPPPONNNNNNNPPPNNNNMNNNNOOONMMMNNOOOPPOPPPPOOOOOOOOOOOONNNNONNNOPPPPQPNMMMOPPSVY`fp| {ytsrsuwyz }{zyzzz{} ~||zzz{{}~~~~|{zxxtttvx{ ~zxvvvwz {yxwutsstuxzzyxwtsqpoonjhcb`^_abcdegilnnnlkhgfffgjmqtxz{{}~ {xvuvxyzyzz{ ~|{zwusnkjjiiknosx| }|tjeZUPTVXZZY[^`iostvvuwttonfYXXX[\[[XVV\adeeb\VLIECAADGMNOPPPPPRTVWXXXYZZZYXX[\``abbb_]ZZZ[\^`aaaaaabbcaaaa``ab`_^___]\\]]\\\\]]^_`abbcbbbba``__]\^^^^_^^__`___aaa``___^]\\\\\^]]]\\\\[[[ZZZYYYYYXXWXY[YWVTSSUVTSSRRRRSSRRRSSSSSRRRSTSRSSSSSSSSQQQRSSSSTSRQRRRRSSRQPPQRSSSTSQPQQQRRRRRRRRRRRRRRQRSSRRRSSSRQPPPPRRRRRRSSSRRRSTTTSSSSRRQRRQPPPPQRQQPPPRSRPPPQRRRRQQPPPPPPQQQRRRQPQRRRRRRRRQQRSTTTRRRRQPQQPPPQRSSSPPPOOPQRRPPPPPPRRSTUUUUVVY\]^`dhipvyyz ¢¢¢¢¢¢££££¤¥¥£¢¡ ¢¢¢£££¢¢£¤¥¥¥¥£¢££¤¤¥¤¢¡¢¢¢¡ ¡¤¥¨¨¨§¦¦§©©«««ª©ªª«©§§§§¨ª««««««««¬®¯®®®®®®®®®¯¯®¯¯®¬¬¬®¯¯¯¯°®®®¯¯®®¯°±±°°°°±±±±±²²±²³´´´´µ´´³³²³³´´³³´µ¶¶¶¶µ´´´µ¶······¶¶µµ´´³²²±±´²±±±³³³¶µ´³³³³²²²±±°¯¯®¬¯±±±±±±¯¯°°°°±±±±±±±±±±¯®®¬«««©¨¨§¥¥¤£ }xvvsle\ZVRQPPPPPPPOOOOONMMNONNNOOPPPPPONNNMMNNOPOMMNNMONNOOOONMMNNNOOOPOOOPPPONNNNNNNNOOOOOONNNNNOPPPPPPONNOPPRUV\fpz }zwutqqsvyz|} ~~}|zywvwxyz|~ ~~~}||{|}~}|{xvuvwz}}zyxwwx{}zyyxvutuvvxyxwwutqonmmkheba``abdefhjlnnnnlkihgghhmptx{~~~~~~ |yvvvyzzzzyz{~~ |ywtnjjjhhhlmqvz}|~zneVSPSVXZYX[^`ekoqtttvutpofXVVVXWVXVUVWZ^aa]WTNJECBBDEJLMNNOPPSUWYYZ\]^^^]\]^_bbbbba]\YYYY[\^``````abbbbba``ab`__^]\\[\\\\\[[\\]^_`abdbbbbbbba`^^_`__`_____`aabbbbba`_`_^^]]^`]]]]\\ZZYYYYYYZZ[[[\\\\\[ZYWVVWWUTSRRRRRRRQRSSTSTSRSTUTSSSSSSSSSQQRSSSRQQPPPQRRRSSRQPPQRSRRSSQQQQQPPPQRRRRRRRRRRRSSQPPQSSRRQPPPQRRRSSSSRRRQRSTTTTTTSRQRRPPPPPPQQPPPPPRSRPPOPPQQQQPPPPPQRRQPPPQQPQRSRQQRRRRRSTTSSQRRRQQRSQPPQRRQPNNNNNPRTRPPPPPPRQRTUVVVW[]`abejnx ¡¤¤¢¤¥£¤££££¤¥¥¦¥¥¤£¢¢¡¡¤¤¥¥¥¥¥¤¤¥¥¦¦¥¤£¤¤¥¥¦¦¥¤¦¦¦¥¤¥¦©¨©©¨§§¨©ª«¬««©ªª«©§§¨¨¨©ªªªªª«««®¯®®®®¯¯¯®®®®®¯°¯¬®¯®¯°°®¯°±±°°®¯±±±±±±±°±±±²²²±²³´´´µµµ´´³³³´´¶µ´´µ¶¶¶µ´³³³´µ·µµ¶·¹¸·µµµ´³²²±±µ²±±²³³²¶µ´³³´³³²²±±±°¯¯¬¯±²²²±±°°±±±±±±²²±±±±±±®¯¯¯¯®¬«§¨¨¨§¥¥¤¤¢ |yvrofb[VSRQPPPPPOOOONMMMNNONNNNOOOONNNNMMMMMOPONNOPONNNNOONMMNNNNOOONNNNOPPONNNNNNMMOOOPOONMNNNNPPPOPOOOOPPPRVX_my }{zxvtrqoorvyz{z}~~ |zzy{zzzxwuutuvyz|~~{zzy{{{|}~~}|zywwvwz}~~}{zyxxwx{~{zzzyxwwxywxywuttsnmkjjigdba`abdefgilnnnnmmljihhiiptxz~~}}{xwxy|}}|zyzz|}~ wqmllihijloty{}~}|~~{xuuj`PRQTUWYWWZ]_bhlnrssuutqqgYVVTUSSVUTUSUW[\XUSOJDBBBCDDFIJMPQSTVXZ[\^aaabaa``a````a_\Y[ZYYZ\]^__``aaaba`_^]]^_^^^]\ZZ[Z[\\[ZZZ\\]]]^`a`aaaaaaa`^^____`aa```abcbbbbba`_^^_`_]\][[\[ZXVVUUVVWYZ[\\\]__]\\[[[ZZZZVVUTSRRRRQQQSTTTTSRSTUTSSSRRRRRQRRRSSRPOPOOOPRRRSSRQPPPRSRRSSQQRTRPPPPQQRRQQQQQRSSRPOOPRQQPPQQRSQRRSSSRRQQPPQSSTUUUSRRRSPPPPPPPPQQPPQSTRRQPPPQPPPPPPPQRRRQPPPPQQQQRQPPPQSRRSTTSRPQQQPQRRQPPPQPPNMMNNOPSVSRPPPPQRTSSVWXY[]cdhnmnz ¡ ¡££¤¥¥¤£¤¤¤¤¤¤¤¥¥§¥¥¥¤££¥¥§¦¥¥¥¦§¨¥¥¦¨¨¨¥¤¥¦¦§§¦¦¦¨¨¨¨©©©©ªªªªªªªª««««ª©ªªªªª©¨¨©ªª««ªªª«¬®®®®®®¯¯®®¯¯¯¯®®®®°±±°°°°±±±±±°±±±±±±²±±²²²±±±´²²´µµµ¶¶µµ´´µµ¶¶¶¶¶¶µµµ´´´´µ¶··µµµ¶¸¹¸···¶´³²³´´³²±±°°°³³³²²±±±²²±±±°¯®¯®¯±³³²±²²±±±±±±³²±±±²³³²±±²±®¯¯®¬««¨¥£ {ztncYTSSQSPNNOONMNNLLLMNOOOOOOOOOONMMMNMLNNNNNNOONNNNNNNNMNOONNOPOOOOOPPPOOONMLLLMNNONNNNOOONOOPPPPONNOPQVVXgr zzytrpnnnnosvxyz{} ~zywvvttuuuuttuvwyz|~ ~{zyyzz{||{|~ywutstwy}|{zzzzzyzzzyz{}~|{zzzzzyzz{{zxwutqonlmmlmkgbbbbdghilkklmmnqqpoonnmlvy}~}|{}|{ywxz|}}|{zz{~~~ ~tnhhihjkmptwyz{zzywtrojh_SMPRRVWXXXZ\]bbdhjmpstrpsrfYUUTSTUUSPPPPQSTSPKJEA?ADDDBDJPQUZXZ\]]]^_bba`____``_\\\\[XVVVWXZ\\\\^`a`^__^\\\^_\\\\\[YWWYZZZZ[\]]\\\\]]^_``_^^^]^^`abbaaaaa`abbbbbba`__^___^\ZYXXWUUURNMNPTVVWYYXXY[\\[\\\\\\\\[XVUTSSUSSSSSSSSTSSSSTSRSRQRRSRQSSSSRRQQQQPPQRSSRRPPPQSTSSRQQRSTUTSRQPPSRRQPPPQRUTSRQQPPSRQQQRRQSSSSRQPPPPPQQRRRRQRRSSSRRRRRRRQQQQRQQQRSSSSSRQPPPPPPPQRSSRQPPPPQQRRRQPPPRRSSTTSRSSSRPPQRPRSRQRPONMMMNPRTTTSRRSTTUVVVVWZ]bghlttv ¢£¢¢££¤¥¥¤¤¤¤¤¥¥¥¤¥¥¦¥¥¥¤££¥¥§¦¥¥¦§§§§§¨©©¨§¥§§§§§§§§¨¨¨¨¨©©©ªªªªªªªªª«««ªªª«ªªªª©©©ªªª«««««¬¬¬¬¬¬¬¬®®¯¯¯¯¯®¯¯¯¯¯®®®®®¯°±±°°°°°±±±±°±±±±±±±±²²³³³³²³±±³´´´µµµµ´´µµµ¶¶¶¶¶¶µµµµµµµµ¶¶´´´µ···¶µ¶µ´³³´´³³²±±±±±²²²²±±±²²±±±±°¯¯¯¯¯±²³±±±±±±±±²²³²±±±²³³´±±±±¯®°¯®¬«¨¦¤¢¡|vlbYSQQQPPPPPOOONNMMNOOPPPPPPPPPONNOONNNNNOOOOONNNNNNNNNOOONNNOOOOOOOOONONNMLLLMMNNNMMNOOONNOOPPPONNNPPTVXhs ~ywvsqommllnpsuuwz}~}~~ }|zxutrqnnnopqrruvwyz{~ }zyxwwvxzz{}}|vutrppqrqqqrstvwxxxxyyzz~|zzzzzzzzz|}}{zwurpnnnopooniggffghiilkjlmnruvuttsrrrxz}}}||~~|{zyz{~~~~}}}}~~}}~}}}}}}}}} ~zqkjiijlosuvwwvutspnkec]VQQRQVXYXXZ[\^_acfhlpttrsupcZVUUVVUQNOPPQSSPNLJHDCBBBEDFNVXYY\]___^_`ba`_^]\\^^^\[[YXVTRSSTUVWWXZ\]]\]]\\[[\]\]]\[ZZZXYZYXYZ\]\\\\\\\^___^^^____abbbaabba``abbbbba``_^^]\[YXWUVTQPQOJLMPTVVWXWVVWY[[[\\[[\\[ZVTRSUVVVTTTSSRRRSRRSTTSRTSRRSSRQSSSSRRQQRRRRRRSSSRRRRSTUSSRQQRSTUTSSRQRTSRQPPQRSTSRQQQRRSRQQRSSRSSSSRRQQRRQQPPPPPPQRSSSSRRRRRQQQQQRRRSSTUUUTSRQQPPPOPPQRSRRQQQQQRSSSRQQQSSSSSSRQQRSRPPQRSTTSTUSPPONNOPRSTTUUVVVWY[\]]_ekntuw ¡ ¢¤¤££££¤¥¥¥¤¤¤¥¥¥¥¥¥¥¦¥¥¥¤¤¤¥¥§§§¨©©¨§¨©©©©¨¨¨¨¨¨§§¨¨¨§¨¨¨¨¨©©ªªªªªªªª©ªªªªªª«©ª««ª©©ªªª«««««¬¬¬¬«««¬¬¬¯°°°¯®¯¯¯°¯¯®®¯¯¯°±±°¯¯°°°°±±±±±²²±±±±±²²³³³³³²±²³´´³³´´µµµµ´´¶¶··¶¶¶¶µµµµµ´´´´³´µ··¶µ´´´´³³´µ³²²±±±±±±±²±±±²²±±°°°°°¯¯¯¯±±²±°°±±±±²²³²±±±±²³³¶²±±±°°±°¯¬ª¨¦¥¥£¡zsj^SPSPQRQPPOOOONNOOOPPPPPPPPPPOOOOOOOOOOOOOOOONNNNNNNOOPONNNNOOOONNNNNNNNMLLLMMNNMMMMOONNNNNOOOOONNOPSVZit~}~ |wutrponmmmmnprstw{~|zyxyz|~ ~{xxwutpnmhhhikmoquvwxz{} ~|zz|~~~}{zxwvvxz{{|~}}|~}zyutspnlkkghhjmorswwvvxyyy}}}{zzyzzzz{|}~|ytqnnnotuttqliihhhijklklnpsx{zzzxvuuwz|~~{||}}|{zzzz|~~}|{z||{{z{{|~}} ymihijlnrtttttsrpnljda\VTSSSVWXVVVVVWXZ\]_dinrqnrqg\[YWWWVQMNPRSTSPLHEDEEDEHGMUY[[]`_aba`_``a`_]\\[[\]]\ZXVTTQPPPPPQSSTVY[\[\\[ZYZ[\\]]\ZY[\ZZZYXXZ[\\\\\\\[^^^^^^^_aaabbbbaaaba```abbaa``__^]\ZXVVUQQPLKLJHJJNQSTUVVVVVY[\\\ZXWXXWVSPOPTVVVSSSRRRRRSSTUVVUTTSSRRRQPQRRRRQQPRSSTTSSRRRSSSTUUTSRRRRSSUSSSRQSUSRQPPQRSQQPPQRSTSRRRSTTSSSSRRRSSSRQPPPPPPPPQSTTSSSRRRRRRPRSTTTTUUTTSRQQQQPPPPPQQRRRRRRRRRSSSRRRRSSSSRRPPQRSSRQQRSSSSTTRPRQPPRSSSTUVVWYZ[[\_bbfntrz ¡¢¡¢¢¤¤¤¤¤¤¥¥¥¥¥¤¤¥¥¦§¦¦¦¦¦¦¦¥¥¥¥¦§§©ª«ª©§©©ª©¨¨¨©©¨¨§§§¨¨¨¨¨¨©©©©ªªªªªªªª©©©©©©©ª©ª«««ªªª©««««««¬¬¬««««¬¬«¯±±°®¯¯¯¯¯¯®®®®°±±±°¯°°°°°±±±±±²²±±±±±±²²²³³³³³³´µ´³³´´µ¶¶µ´´¶¶¶¶¶¶¶µµµµµµ´³²µµµ¶···¶´´´´´´´´³²±±±±±±°±±±±±²²±±°°°°¯¯®®®°±±±±±±±±±±²²²±±±±²³³¶³±²²±±±°¯®®¬«ª©§¥£¡}xrgZVZSTTRPPOONNOOOOOOOOOOOOOOOONNOOOOOOOOPPPPOOONNNNNOOPONNNOOOOOONNNNOONMMMMMNNNMMMMONNMNNOOOOPOONOORVZhs ~}|wvurqrpoooppqsttvz}zxwuuvz{~~{xttttrpmkiggffhknqtuvwxz{}~~|{z{|}}}}}|{ywxz{|{|~~~~}|{zz|zwttrpnkihhffghjmoqvvvvwxxyzzzzyyyz{{|~ztpnnnqwzwusniiiiihikjlnruz}~~{yxzz~~~}{yz|~~~{{zzzzz{}}~~~|{zzzzzyyyz{~ ~~~{nhiikmorsssttssrpnnib[VTSUXVWWUSRRRRSVVVW\afnqnppkgd`[XWVTQPRTTTSPLJEBCA?AEPXa`]\_b_`aa```a`_^\\[ZZ\\[YXVURRPNNOOPPSSTVY[\\[[[ZYYZ[[\]\\\\]\\\[ZZ[\]]^^^]\\]]^__```bbbbbba`````````aa`_^^]]\\ZXVTRQONLJIIIHIIKNPPQSTTUVXYZZXVTSRRPPPNLMPPPPOPPPQRRRRSUVVVUUSRRRQQQPPQQRRQPPRSTUUTSRQQRSTTTTTTSSRSSSTSRRQPRTSRQPPQRRPPPPPRSTSSSSTTTSSSRRRSSTRRQPPQRRQPQRSTTSSRRRQRRSQSTTTTSSSSRQQQQQSSRQQQQRRRRRRRRRRRSRRQQRSRRRRQPPQRSTSRRRRQQRSSPLQQQRTTSRVVVVWY[\`beimqw} ££¢¢££¤¤¥¥¥¥¥¥¥¤¥¦§§§§§§¨¨§¦¦¥¦§§¨ª«««©¨ªªªª¨¨©ªª©©¨¨¨¨©¨©©©©ªªª««««««««««ªªªª©©©««««««ªª««¬«««¬¬¬«««¬¬«¯±±°¯®¯¯¯¯¯®®¬®¯±±±±°°°°±±±±±±±²±±±±±²²²²²²²²´´´µ¶¶´³´µ¶¶¶¶µ´¶¶¶¶¶¶µµ´´´µ´´³³µµ¶····¶µµµ´´´³²³²²±±°°°°°±±±±²²²±±°°¯¯®®¯±±±±±±±±±±±±±±±±±²³²´³³³´²±°°¯®®®®®«««ª¨¥¤ {rgbbXWUQPQPPOPPPPPOOOOOOOOOOOOOONOOOOOOOPPPPOOOOONNNNOOOOOOPOOOOOOOOOOPONNMNNOONNMNNNNNMNNOPOPPPOOOPQUWclz ~}ywwtstttttttuvwwy{~{yvuuuvxz{~~zusponnljhgfgfffgimotttuvxzz|~ ~|{|}|{}}~~|zyz{||}~~}{zzz|}}}|{{}~ztrponkhhgghggghilnotuvvuuvxxxyyyyz{|}~ztonnorx{yvsmihhhhfgijnsw{~|~~~zxwz|~}|||{{zzyyzz{{{|~~}|zzzzzzyxxyz| {{|~ {olkklnprssrtsrrqponkbZVUUX\YZYVSRQQPRTUTSVZ\bfimmmoid^[ZYVURSTSRRPNDBCJNQV\\]^]^`_[\]]^^_``__^\\[[[[ZXVUUTRQPOPPPPQTTUVXZ[[Z[[ZYYZ[\\]^_____^]\[[\\]^_```_^]^`bccbbbbaaba`__^^^^^^^_^]\\[[[YXXVURPNMMKIHIJJKJKLMNPRQQSUVVVVUSQPNMKJLJJJJJJKKLMOPPPPQRTUUUTTRRRRRRRRQRRRRQPPRSTUVUTSPQRSTTSSTTSSSSSSTSRRQPQSSQPPPQRRQQPQQRSTSTTTTSRRRRRRRSTTRRQQQRSTQQQRSSSRRQQPPQQRSTTTSRRQRRRRSSSSTTTSRRRSRRRRRRRRRRSRRQRRRRQQRQQPRSTTTSRRQPQSUTPMOOPQRSRRVWWWWY\]ehnu{ ¡¤¤£¢¢¤¥¥¥¥¥¥¥¥¥¥¥¦§§¨¨¨¨©©©¨§§§¨¨©ª«««ª¨«««ªªªª«««ªªªªªª©©©©ªªªª««««««««¬««««««ªª««¬««««ª««««««¬¬¬¬¬«««¬®¯°°¯®®¯¯°°¯¯®¬®¯°±±±±°°°±±±±±±±±±±±±±³³³²²²²²´µµµ¶¶¶´µµ¶¶¶¶µµ¶¶¶¶¶µµµ³´´´´´´´µ¶¶···¶¶¶¶µµµ´²±³³²±±°¯¯°±±±±±±²³²±°°¯¯®®®¯°±±±²²±±±±±±±±±±±±²²²³³´´³±±°°¯¯¯¯¯®®¬«««¬«¨¥¢yqkh\[VQPQQPQQQQPPPPPPPPPPPPOOOOOOOPOOOOOOOOOOOOOOOONOOOOOPPOOOOOPPPOPPPONNNOOOONNOOOONNNOPPOPPPPPPPRVV`gv{ zzzwvwwzzzzzz{{}}~~yvtuvxyz|}ztqookjigfddcdeeeegjlqrrstuwx{~ }~~~}}}|{zzzyxwuuxz|}}|||~}xrnlliheccdeffffghjmnrtuttttvvwxyzz{}}}~~ztpnnqsxzxvrlihhhfefhnsx{~}}|yvvz}~}{{{|}||{yxxyyyyyz{|}}{zzyxxxxxyyyyz{~ ~{{|}~|}zsonnnoqrssronnlkjhgc]XVUVZ^\\[VRQQPPPRSQPQTXWY`ghhkhfb`]\XVRRRQQQQPSRTX[\^a_`_]]^^\[[[\\]^__^]\\\[[YXVTTUTSQPPRRRRRSSTUVWXYYZZZYYZ[]^^`bba`^^]\\\\]_`abbbaa_`bdffdcaaaaa`_^]\\\\\\\[ZYXWVVWVVVVTRPNMMLJIJKMPNMMMNPSRRTUVUUTSRQOLJJIGFFGHGHJIJJKLMMMPRSTUUUUTTTTTTTTTTTTSSRRRSSTTTSSQRSTTTTTTTTTTSSSUTSSQQRTSQPPPQRQSRRRRRSSSSTTSRQQQQQQRSSSSSRRRRSSQPPQRRRQRRRRRRSSSTTTSRRRRRSSTTTUUUUTSRSTSSRRQQRRSSSSRRSSRRQQRRQQRSTTTTSSPPPTVTQPNOPPQRSTY[\]^`begkt~ ¡¢¢¢¤¥¤££¥¥¤¥¥¥¥¦¦¥¥¥¥¦§¨¨©ª©©©©§§§¨©©©ª««ª©««ªªª«ªª«««««ªªª©©©©ªªªª««««««««¬««««««««««¬««««««««««««¬¬¬¬««¬¬®¯¯¯¯®¯°°°°°°®¯°°°°±±°°°°±±±±°±±±±±±±³²²²²²³³´µµ´µ¶¶´µµ¶¶¶¶µµ¶¶¶¶¶¶µµ´´´´´´´´µ¶····¶¶·¶¶¶µµ³±³³²±±±°°±±±±±±±±³±±°°°¯¯±±±±±±²²²²±±±°°°±±°±±²²²²´µ´²±±±°°°°±°¯®¬¬¬¬ª§¤ {ytmbb]VRRRQRRQQPPPPPPPPPPPPOOOONNNONNNOOOOONOOOOOPPOOPOOOOPOOOOOOOOOOPPONNNOOOONNOPPPOOOOOPOPPPOPPQSVV^csy} ~~~zz{z~~|zxvuwz{|}~{vrnnmhhgedcbbbceffghjnopqrstvz ~{yvttttsstvy{}}}}}~{uokjjfdbabbddeeefhknnstttttttuwxzz{|}~zwtrrstwywvsmihghhgimwz}~}}||zyvwz~~|zzz|}||zwuvwwuuuwxzzzyxwvvvvvwyzzz{~ ~}~~~{yxyz|vrqruz {wurpppqrrqpmkhfca^\XVTRSVZ]]]ZUPPPPOOPPOMOPXVV[bcchgfecb]YVRSSRRUVVSTVY\_ab_bba^\]_[[[[\\]^^^]\\[ZZYXVTUVVVTSSUUTRRSSSSTVVWYZ[[[[\\^__``___^^]]]^^^aabbbbbb`abcedcba```a`_^\[YXXYYYVUTSRSTTUUUTRQPOMMLJJJKNPONMMNPRTTSSSSRSPQRPMJJJGFEFGFFFEFGIJJJJNPQRRSTUUVVVUTUUVVUTSSSSTSSSRRRRRRSTTTTTSSTTTTTSUTSSRRSUSQPPQRRRRRSSRRQPQRSSRQPPPPPQRRRRTSSSRRRRQPQQSSSRSSSTTTTSSSTTTTTURSTUVVUUUVVVUTUVUTSRQQRRRSSRRRSSSRRRRRRQQQRSTTTTRQQSTSRROPPQQSVW]`cghknoou¡¢¢¢¤¥¥¥¥¥¥¤¥¥¥¥¦¦¥¥¥¥¦§§©ª«©ª©©¨§§¨©©©ª««ªª«ª©©ªª©¨ª««««ª©©©©©©©ªªª«««««««««««««««««««««««¬«««««««««¬¬««¬¬®®¯¯¯¯°±±±±±¯°±±°°±±¯°°°°±±±¯°±±±±±±±±±±±²²³³´´³´¶¶´µµµµµµµµ¶¶¶·¶¶¶µµ´´³³´´´¶·······¶¶¶¶¶µ³²³²²²²±±±±±±±±±±±²±±°°°°°²²±±±±²²²±±±±°°°±°°±±²²²²´µ³±°±±±±±±±±¯®®®®¯®¬©¦¥¡}ukkg^WVUTSRQPPPPPPPPPPPPPNNONMLMNNNNNNNOONNOOOPPPOPPPONOOOOOONNNNNOPPONNNNOOONNOPQPPPOOOOOOOOOPPRSVV\apvz ~}~~ }zxywwz|~|yvsoljfeecbba``beghhikmnnoprttz }zwttspqqrsuyz~}{wqmjiecbabcddfffhilnptttttuttvwyz{|}~|yvutttvxwvsmhgghiins ~||||{zywy||zyz{|{{yuttvussstuvvvxwvuuuuuwyz{{| |zz{| |yxwtstvz~}~~zqjhllmnrw{~}{vrrqqqppoljgb_[XVQQPNOSX[_^[UPOOOPOOONMOQPRSUY\_egggeb_\YSTUTVXZ[\\\[\_aaca`ab`]\\\\\\\]]^]\\[ZYYYYWVWYYXVVVWWURRSSSSTVVWZ[\\\\\]^__^\\]^^^^^__`_bbbbbbbbaaabbba`````a`_^\ZWVVVVVQPPPPPQRQQPPOONNMMLKJIKMNMLLLLNPSRQPOOPPOQRPMJJKKHEFGFDCBCDFHJJJJKMNOPRSVVVVUTTUVVUSSRRSUTSRQQQQRRRSSSSSSSTTTTTTTSSSRRTVTRPPQRRRPQQRQPPOPQRSRQPPPPPQRRRQRRSSSRRRQQQSTUUTPQRRRRRQRSTTUVVWUVWXXXWVVWWWVVVWVUSRQQRSRRRQQQRSTSRRRRRQPPQRSTUUVUSSSRRTTSRRSTVW^bdiqtv{|} ¡¡¢£££¢¤¤£¤¤¥¥¥¥¥¦§§¦¥¥¥¥¥¥¨ª«««ª©¨¨¨¨¨©©ªªª««««ª©¨©©ªªªªªªª©©©ªªªª©ª«««««««ªª©ªª«««««««««¬¬«ª««««ªª«««¬¬«ª¬««ª«®°°¯¯¯¯¯°±±°±±²±±±±°°°¯¯°°°±±±±±±±±²²³²²²³´²³´´´³²±³³´´´´´´¶µµµ¶¶µ´´´³³´´µµ····¸¸·µ¸····¶´³µ´³³³³±±±±±²²²³³´³±±²³²±²±±±²²±±±±±±°°°±°°°°±±±²±²²±±°°°±±±±±°¯¯®®¯¯ª¨¨¦£~yqic_\\YWUTRQPQPQPNNPPPOOOOOONNNNNNNNNNNNOOOONNPPPOOOOOOONNMNNNOOOOONNMNOPPPPPOOPPQPPPPPPPPPPQRVSX]fotz{~~}~ }}~ ~|zxzyy{}zutqnkigfdcccbbcehiikmnooooprsty |zwutsrrrsty}{wtsplhgdaabddcfffhhjmprstttttuuvxyz{}~}{zxvxxvwvrljhinpqv} }{||}}zyy{|~|{{{zyxtrtrooqpqrsrtuuututtuwyyzzz{~ |tqrvz{}}~ztonnnnmnprutrrpjc]abehloqsz~|{|utsrqonljheb`[UPPNMOPQV[[[XTPNOOOPPPOOOPQQRRTW[]eddddb_\[\^`````aa_]]`bbccb`^^^_\]^^]\\\_][ZZZXVXVTVXYYYYZZYWVVSUTSRRTVXZ\\\[[\]aa`_^]^^____````_````bcdba```````____`__^\ZYZXVRQPOOPRRRRPNMMMLKKKJJJJJJLKJJJKLLNNNNONLJMNNNMLJJJHGFGGEDCDDEFFGHIIIJLNPQXYZZXVUUUUUTTTTUUUTRPPPPRQQSSSSTRRSSSTTTTTUUUTTTSRRQRRSTSSRQQPONQQRRQPPPPQQRRRRRRRSSSSRQSTTTUVVVUUUUUUVVVWVUUWYZZZ[\]_`a_][XVVVVWVUTSSSTSRRSRPQTSRQQQRRRTTTTVVVVTTSRRSUVVUUVVW\aacfmw~ ¡¡¡¢¢££££¥¥¥¥¥¥¥¥¥¥¥¥§§¦¥¥¥¥¥§ª««««««ªªªªªªªª««««««©©©ªªª««««ªª©©ª«««ªª«««««««ªª©ªª«««««««««¬¬«ª©ª««ªªªª«««¬¬««««¬««¬®¯¯®®®¯¯°°°¯°±±±±±±°°°°°°°°±±±±±±²²±±²²±±²³²²³³´³³²²³³´´´´´µ´³²³³³³´´³³´´µµ¶¶··¸¸··¶¶¶··¶µ´µµ´³³³±±±±±²²²³³µ³²²³³²±²²±±±±±±±±±±°¯°°°°°°°±±±±±±±°°°°±±±±±°¯¯®®®¯®«©§¦£|xtokhb\VUUSPOPPQPPPPOOOOOOONNOOOOOOOONNNOONNNPPPPPPPOPPPOOOOOPPPPPOOONOOPPPOOOPPPPPOOPPPPPPQQUSY_irtzz|~|{{} ~|}~ ~}{zxzzz}~}~~|xtqnkhhedcccdddhilnnnopoooopqstz }zxvttssttvz~|zxusqnlhfcbcdddfeeghhknpqrrrsttuvxyz{|~~|zzwwwvvtplkklpsuz~}|||{zzzz{|{z|~ ~||zxvvsprqnnnnopqqrtuttuttuwxyzzz{} ~~~~~}~~~}|ytpqtvy ztnjiijjjklnnnnnlhb_abbcdfhhqtz}}{zyutsrpnkhhfdba\VQNKJLMNPTVVUPMLMNOPPPPPPPPPQRTVVV_`bdggdbabcccbbbbba_`bbbbba`__^^\\[\\]]]\[YXXWVUVTSVXYYY\\[ZZZWVUUVVVVWYYZ\\\\^`bba`_^^____``aaa_````abbba______^__abbbb`^\ZYWURONMNPQQPQOKJIIIHHHGHHIHHJJJJJJJJKJJJKKKJLLMMMLLKJJHHHHGFEFGGGFGGGGHIJMOPWXYZYXWWXWVVVUTSSSSSQPPPQPQSTTTUSSSSSSTTTTUUUTTTSRRRRSTTSSSRQPPPPQQQQPPPQQRRRQQQQRSSSSSRTTUUVXXWXXXXWWXX[[YWWY[[]]]_bbbab`\[ZYWVXWVVUUUVTSSTSRSUSRQQRSSSVUUUVVVUPQQQRSVVVVWXVV\bhknv ¡££¢¢¢¢£¤¥¥¦¦¦¥¤¤¤¥¤£¥§¨§¥¥¥¥¥§©ª«ª««««ªª«««««««««ªª©©ªªªª««ªªª©©¨ª««««««««««««ªª©ªªª«««««¬«¬¬¬«ª¨©©ªª©©©ª««««««¬¬«¬¬¬¯®®¯¯¯¯®®¯±±±±°°±°°°°°°±±±±±±±±±±±±±±²³³²³³³³´´´³³´´´´´´µ´²²²³´´³³³´´µµ¶µ¶¶·¸¸··¶¶····¶µ¶µ´´³²±±±±±²²²³³µ³²²³³³²²²±±±±±°±±±°¯¯¯°°°°°°°±±°°±°°¯°°±±±±±°¯¯¯¯®®®««§§¥¡{topib]ZVTRPQQPPPOMOOOOOOOOPPOOOOONNNNNNNNNPPPOOOONPPPPPPOOPPPPPPOONOOPPONNOPPPOONNPOOOPPPQTRY`jttwyz{}~~}}~~}|{zzzz} |z{~ ~}~~~~~~~}|}~}{{zzyzz}|yxz{{zzupnjhffdddeghiimnqrrrrrpqqqqrtt| }{ywuttvwz||{{zzxvtqpojhfddeeegfegghjlnnnnoprstvwxyz{|}}}}~}|zxwxwtpnmnpsuz }{yutvxyyzzz{||~ ~|ytsspnpommlmnopqrtutttttuwyyyzzz|}~|{zzzywwwwwwwusppsx|~ukfgefhhhhhihhihgdb`__^^_abcilptxxwvutsrpmhedcbba\WTPLJKLLNPRRPMKKMMOPPQQQQQPQRSTTSRX[_cfgfedeeedcbbbbbabccb_^]]]]\ZVUTUY\]][YWVVVTRSQQTVWWX[ZXXYZXVVVXYYYZZZ[\\\]`bbbbba`__`````aaa``aa``aaa`_^^__^^^`bcddcb`\ZWTQPNMMNPQQPPMJFEEFEFEEEFGFFFGHHHHGGGFEEGHIJIIJJKKKJKJJIJJJIHIIIGGFFEFGHJKLMRTUVVVWWXWVVVVUSRSTTSRQQQQRTUTTUTTTTSSSSSSSTTTSSRRRRSSTUSSSRPPPQPPQQQPQQRRRQQQQQQRRSSTTTTUVVWYZYZ[\\[[[[\\\[\_abbbbcghfcca__``]\YYXWVVVVUTTTTSTURRQRSTTTUUTTTTSRPPPQRSUV[[\]\Y\botz¡¡¢££¤¤£££¤¥¥¦§¨§¥¤£¤¥¥¤¥¦§§¦¥¥¥¦§¨©ª©ª«ª©©ª«««««««««©©©©ªªªªªªª©©¨¨§ªª«««««ªª««««ªª©©ªª«««««««««««©§¨¨©©©©©©««««¬¬¬¬«¬®¯®«¬®®¯®®®°±°°°°°°°°°°°°°°±°°°°±±±±²²³³´´´´´´´´´´´µµµ¶µµµ´³³³´´³³³³´´µ¶¶µµ¶·····¸¸¸¸¸·¶µ¶¶µ´³²±±±±±²²³³³µ´³³³´³³²±±±±±±±±±±°¯¯¯°°°¯¯¯°°°¯¯°°¯¯°°±±±±±°¯¯¯¯®®¬¬«ª¨¦¤¡|xtnf]URTUSQPOOOOOOOOOOOOOOOONNNMNNNMNNOONNNNNNNNNOOOOONNOOOOONNNNOOOOONNNOPPONNNOOOOOPPPSRX]goqtxyzz{zzyzzzzyyyzzzzz} ~zvux} }|{{||}}|||||}~ ~|zzzzzzz{}}||ytssttturnkhfdedefhikmnoqttttsrqrssstuw| }||}}}}} |zxvwyz|}{zzxwvutsqqnligffghhggghhikllkklnprtuvwwxyz{{|||}}zz{zurrostuy~ }zvrqsvyyzzz{{{}~{wsprqpqnkkklnoqstuvutuuuwyzzywwxz|}}~~|zzxwvtsrrsttttsrrwsfbgefhhhhhgghgecba_]\\\\^`afefhmqrrrqponjfb``___]ZWSOLLMMNOOONKKLMMOPQQQPPPQQRRQQSTVZ_bddcccccbbaaa````bba^[YWWXWTQNLLOUY[[YXVUTSRPPNNPRSSSTTTSTVVUVXZ[[\\\^]]\\\_aabbbb```````````abbbaa`a`_^^_```___abbcba_\WTPNMMMMNOPOONKHEDEEEFEEEFFEDDDEFFEDDBBBCDEGHFGGHIIJJKJJJJJJJJJJJHGFFEFGIJJKLMNOPPQRRSSSUVVVUSTUVUSRQRRTVVTSTUUTTTSSSRRRRRRRQRRSSSTTURSSQPPPRQRRRQQQRSRQQPPQQQRSSSSTTUVVVWYZYYZ\\\\]^`bbaacfhggghjjihfeddedb`\\[ZYYXXVVUUUTTTSRRRSTTTTTSRRQQQPQQRQRST]\]_`adiw~ ¢£¤£££¤¤¤££¤¥§¦¨©¨¥¤¤¤¥¥¦¦¦¦§§¦¦¦¦§¨©©¨¨¨§§§©««««««ªªª©©©ªªªª««ªª©©¨¨¨©ª««««ªªª««««ªª©©©ªª««««««««««©¨¨¨¨¨©©©©ª««¬¬«¬®®«¬¬®®®¬®¯°°°¯°°°°°°°°°°±±°°¯¯°±±²³´´µµ¶¶µµ´´´´´µµµµµµµ³²³³´´³²³³´´µµ¶¶¶¶······¸¸¹¸¸····¶µ´³²±±±±²²²³³³µ´³³´´´³²±±±²³²±±±±±°¯¯°°¯¯¯¯¯¯¯®¯¯¯¯¯°°±±±±±°¯¯¯¯®¬¬«ª§¥£ zrg\VVVURQQQQQOOONNOOOPPOONNNMNNNNNNOONNNNNNOOMNNOONNNOOONNNNNNOOOONNMMNOOONOOONNNOOPPQPVYakouwxyzyxwvvvvutuwyzzz|~ zwspptz~|zzzzzzz{||yzzz{}~~||zzyyzzz{{|||{zzzwrnkjlmonljhedeefghjlmnprtuutsrrstttuxz}~|{zzzzyyz~ |zyz{}}ywwwwvvutttttrqomkihiiihghhhhihhhhiknptttuuuvwzz{{{|~}|}|xvwtxzz{ ~ytqorvyz||{zz{|}~~|zvspttttqkjkmoqtuwxwvvvvwy{|zxutuxzyyzzz{}}~~~}{zyytspopqsttuvvx} ugchefhhiihhihfcbb`\\\ZYXY[\`^\^bhjkjjjjigc`^]\\\\\[VRNMMNNONNMKKMMMMNPPONNNMNNLKMQVY\`bcbbbaa``````______\ZWVSSSQNJJIJNTVWVVUTRQPOMJIHJJJKKLOPOOPRTWXYZ[\\]``_]\]^_`abba`______````bbccbbaa_^^_`aa``^]]]^^^\\ZVSPOONMLLKJIHHGEDDEEEFEDDDDCAABDDDDCB>?ABDDEFFFGGGHHHIIHHHIIJIJJJIHHGFGIJJJKMKKKKLMMNOOPRUVVURTVVVUTTUVVWVTSSUUUTTSSSRRQRSSRQRSSSTTTTRSSRPPRTTTTSRRRRSRRQQQQRRSSSSSTUUVVVVXXXVX[\]^abhjkhddfhjjkkklmmllkjhecb``__^^]]\ZXVVVVTTSRRSSSRTTSRRRRRRRSSRRRRccdfksy| ¢¤¥¥¥¤£¤¥¥¤£¤¥§§¨©¨¦¥¤¥¥¦§§¦¦§¨§§§§§§¨©¨§¦¥¦§©ªªªªªªª©©ªªªªªª«««««ªªªªª©©ª««««ª««««««©©©©ªª«««««««««ª©¨©¨¨¨©©©©ª«¬¬¬«¬¬¬®«¬¬®¬¯¯¯®®®®®¯¯¯¯®®°±±±°¯°±²²²³´µµµ¶¶¶µµ´´´´´´´´´³³²²³´µµ³²³³´µµµµ¶····¶¶·········¸·¶¶´³²²²±±²²³³³³´´´³³´´´³²±±³³²±±±±±±°°°°¯¯®®®®®®®¯¯¯¯¯°±±±±°°¯¯¯¯®¬¬«ª§¦¤¡}th^ZUSSTTSQPOONNNOOPPPPPOONNNNNNNOOONNMMMMNNNNNNOONNPOOONNNNNNOOOONNMNOOOOOPONNNNOPPPPUV\hnuuvxxvuuutttsstvxz{} |ysqnklouyyyywtssstuuuuvvwuwxyz|~|zzzyyyzzzz|{zzzywvvtoidbdfihhhfdefhijklmnoqrttttsqrsstuxzz~~|{zzxwxwy|~{zzz|}~zvqnoqqptrrstuttttrqpnmkihgggggheeefgimnrsttssttxzz{{{|}~~~~}{z{{}~ xtqoquxz|{zxxzz{}|{zzz|}}~~{ywutsvxxytnmmortvxzzyxwxxxz|~|xtssuxwwwxxzz{}}~~}|||xvtsstuuvyz|~zmhkhhijklllljgbaa^[ZYXXWXYY[ZY[^bddeeefgfcb^]\[\\\\YVSPPPPPNNMLLMLJHIJIIHHIHIIIILQVY[^`aaaaa`__`aaa_`_]]\ZWWURPPOLJKLORUVUSSRQPNLJJFDCDDDDEHKNMKMPRVVXXYZ\\__^^^^^^^_```_^^\\]^_aabccddbbbb___```_^]\YXWXXYXXWVTSRRPOMJHFDCCCCCDDDDEDDCB@>>>>>???>>>>ACDDDDDDDDDDDDEDDDDEFFGHJJIIHHGHIIIJKLMLKKKKLLLMOPQRSSQRTUUUUVVWWXVTSTUUTTTTTTTSSSTTSRRSSTTTTTSTTSRSTUUUUTSRRSSSRRRRRRRSTSSSTVVVVVUVVUTVY\]`cfknomhghimnnnnnoqnoonkihifffeeeffca]ZYYWVTTSSSSRQRRRQQQQRQRSSSRQRosuw~ ¢¢¤¥¥¥¥¥¤¤¥¥¥¤¤¥§¨¨§§¦¥¥¥¥¥¦§§§§¨§¨¨¨§§¨©§¦¥¥¦¨©¨©©©©©©©¨©ªª©¨©ª«««««««««©©ª«««««««¬¬««©¨©©ªª«««««««««ª©§©¨¨¨©ªªª««««¬¬¬¬¬¬¬«¬¬¬¬¬¬¬¬¬¬«¬®®¯±±±°°±±²²²³´µµ´µµ¶¶µµ´³´´´´³³²²²²²³´µ´´³´´µµµµµµ¶¶¶µ¶····¶µµ¶·¸¶¶¶µ³²²³±²²²³³³³´´´³³³´´µ´²²´´²±±²²²±±±±°¯¯®®®®®®®®¯°±±±°°°¯®®®¬¬¬«©©¦¤ ¡¢¤£¡~thdXVTUURPOOONNNOOPPPPPOOOONNOOOOOOONMMLLLLNNNNNNOOPPOONNNONNOOOOONNOOOOOOPNNNNNOPPPPTU\gkqrtvvtttutttstvxz{} }zyvsnljhhjnqttutsqrsqrrqqpqrrtvwz}{ywwwxxyzz{{z{zyxxvtrpnhc`_`bccddccehlmnnnnoprrtttsqpqqqsvyzz}}~~~}||{zywxxyzz{}~}|zyxxyzzz{}~yupnmnnnmnnprtttwwxzyuplihffgffgdeefhjmoqrrrqqqqwyz{zzz{|}~~~~~~~}~~~ yuqoptxzzzwttuvvwvuuuwyz{|{yutttuzz{|xrqrtwxz{||zzyyyyz|}zusrtttuuuvwyyz{}}~~|{zyyzzz{|xrpnlkkkmnnnnic_^\YVWXYZZ[[YZZ[\^`abbbceffea_]\\\\\\[XVSRPPOONMMMJHDDDDDDDEGHJNPTVX[\\^__```_^]^_``]^]\\\[YXVSQQPPOMPTVVVTSRRPPMKJJFDBAAABDFJKJJKMOSUVWWXZZ\\]^^^^]]^^^^]]]\\]^_`abccccbbbb````_][YWVUTTTUUVUUTTSRQPOLJFDCBBBCCDDDEDDCB@>=;:::::;;;<>?AAAABAA@????@AA@@@ABCDEGGGGFFFGHGGHJKMLJJJJKKJLMNNOPQRRRRRRTUVVVVVTTVTTTTUUUUUTSTUVUSRSTTTTSSSSSSTTTUTTTSRRRSTTTTSRRRRSTSSSUVVWWUSSRRQTVY[^behknnmmnnnoppqrrsqqppooppnmlkkkkljgb\[[YVUTSSSSRRQQQPPPPQPQSSRQPPry} ¡£¤¥¥¥¥¥¥¥¤¥¥¥¤¤¥§¨§¦¦¦¦¦¥¥¥¥§¨©¨§¨©©¨§§¨©¦¥¤¥§¨¨¦¨¨¨¨¨¨¨¨©©¨§§§©«««««ªª««ª©©ª«¬«««¬¬¬««©¨©©©ª««««¬««««ª¨§©©¨¨©ªªª«««««««¬¬¬«««¬¬«««««¬¬««¬¬¬¬¬¬¬¬¬®¯±±°°±²±±±²´´´³´´µµµµ´³µµµ´´³²²±±±±²³³³´´µµµµµµ³´´´´´¶····µ´µ·¸¶¶¶µ³²³³±²²²³³³³´´´³³³´´·µ³³´´²±±²²²±±±±°¯¯®¬®®®®°°±±°°°¯®®®¬¬¬¬«««ª¥¢¡ ¡£¤¤£¢~wu_\WVURPPOONNNOPPPOOOONNNNNOPPPPOQPPNMMMMNMMMMMNOPOONNNNNNNOOPOOOOOPOOOOPONNNNOPPQPSU\ehknrttsrtvutttvxz{}zvusnjihffhjllnoonnoprrrqpoopqtvwz}yuttuwwyz{|{zzxvvvtqnjgb^]^_`aaabbbfilmnnnnoprrsssrpnpooquyzz|{z{|}}}|||||{zyyyyyxwy{|{zzzxvuuuvwwxyzrokhfefghilnoqsuxz|zrljhfggfffeffhhknppqqppoopuxz{zzzz{|}}}|}}}~~~zvrnosxzyxtqoqqqnoprtuvvz{zvrqstx{|}}zutvyz{|~~}|{zzyxz{~zwtrrsrrrsttuvyz{|}~}|{|}}} zvpnkiijkkpqme^\ZWVWYZ[[ZZZ[[ZYZ\]```bdfgfbb`^]\\[\\[XURPOPPONNMJFDDDDDDEFJKPV\^]\_^^^_____]\\\\\\Z\\[[\\\XVTRRSSSMQVWVUTUTSRQOMKJGDBBABCDFHJIIJJKQSUVWWXX[\\^_^]\\\]]\\\]]]^^__``bbcbbbbbbba`^\WURRQQRSSSSSRRQPPNKJIFDDCCDDDDDEFFEDDCA?=<;::99:;;;<>>>>>?@?>>>>>>>>>>>>?@BCDDDDDDEFFEEEHJKJHHHJJJIJLLKLNPTSRPPPPRRSTUTSTVTTTTUUUUUTSTUVUSRSTTTSSRQQRSTTTSSSSRRQRSUUUUTSQQQRSSSTVWWXWURQPPPQTVW[_bgikmnppnooprtttsutrrrssstrpnnmmnnjd^\\ZWUTTTTTSRRRRQPPQRPQRRQPOO ¡¢¢¡¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¨¨§¥¥¥¥¥¥¥¥¦§¨©¨ªªª©¨¨¨¨¨¥¥¦¨§¦¥¥¨«««©©ª«©¨¨¨©©©««««««ªª©ª««¬¬««¬¬¬«««««ª«««««ªª««««ª©ªªª©¨¨©ªª«¬¬¬¬¬®¬«ª««¬¬¬¬¬¬¬¬¬¬«««««¬¬¬¬¬¬¯¯¯¯°±±±±±²²³³³³´³²³´µµµ¶´³´´³³µ³±°°±²³²µ´´µ¶·¶µµ´³²³´¶·¶¶¶¶µµµ¶¶¶µµ´´´´³³³³²²²²µµ´´´´´´µµ´´³±±±³²±±±±°¯¯¯¯®¬¬¬®®®®®¯¯¯¯¯°±®®®®®®¬««««§¤¢ ¢¤¤¥¥£¢¢ ~h\]\SQQQPOPPMNPPPPPPOOOOOOPPPPPQRQPPONNNNOOONMMNNNNMLLNONNOPPONNOOOOOPPPPPPPPPPPPQSVX]emnprsrssssstuwy{} {xvtqnjhffegjnmmmmmmnnpoonnnnnrruz}yvtrrsvxz{|||}{zxuttqnhd_\Z[\\_abccdgimnnnmlmnoopoooopnoprtuwxxxwwwwwwzzz{|}}|{zyxxwutttsrrrrrstttuvvvqmhdbabcgklloqsvz~{mljgddddddhhhjknopnooonnnnuxzzz{{zzz{zzyyzz{}~ }}zyvsoptxzvqnnnnlkllnorttwwwuttvxyz|}|{{|{~|}{zzzxwx~}ytrrrooopqrrrruy{} ~vskfic]mnrsk_ZYUVWY[\]_aa_][YZ\]``abceghfecb_^]]]\[[XTRRPPPPPLHDDAADDDDEPRVZ\^_`b^\]_^__a][\]\YWWVZ][\_[^\XTRSUVVVY\]\ZWTTVVQPPNKHDDDDDFEDEHIHIJORVXYXYY\\]^^^]]\\\\\]^^^]^__^_abbbbbbbbaa`][XWVSSSSRRSSQPMKKKJJJIGFEEEDDDDEDDDDDB@@AA?==>>>>>=<<;:;<=>>>>>==>>=@?>?@ABB@BCDEEFFGFEDEFGHIHFDEHIHJJJIIJKLRPOMLLLLOPPOOPRSSTUUVVVVVVVUUVVTTTTSSSSRRRRQQPPPRRRRRRSSTTSTUUTSSTUUVVVVXWVTRPOMPQQPVahjjlnoqqrrqqrttvvutttssrrrtssttrqqrnjfb`]\WXYYWUSTSRRQQQRRRQQQQPPP ¡¢£££¢¤¥¥¥¤¤¤¥¥¥¥¥¥¥¥¥¦§§¦¥¥¥¥¤¤¥¥§¨¨¨©©ªªª©©©©§¦§¨§§§§©««ª©¨©©©¨¨¨©©©«««««ªª©ªª««««««¬«««««««ªªªªª«««««««ªªª«ªª©©ªª«««¬¬¬®««««««¬¬¬¬¬««««««««¬¬¬¬¬¬®®®¯¯°±±±²±±±±±±²³³²²³´´³´³²³³²³´²±°°±²³³´´´µ¶¶µµ´´³³³´µ¶´µµµµµ¶··¶¶µ´´´´³³³³³³²²³³´´´µµµ´´´³³²±±³²±±±±°¯¯¯¯®¬¬®®®¯¯¯¯¯°¯¯¯¯¯¯®®¬«¬¬«§¤¢¡£¥¦¥¥¦¦¥¤¡ qed_USRQQOPQPPQNOOOOOONNPPPPPPQQQPPOONNONOOONMMNNNNMMMNONNOOOONNNNOOOPPPPPPPPPPPPQRTVYagjnprrssrrsttvy{} zwtsolhgfffgimnnnnnmmmnnnnnnnortx~{wtrqqswyz|||{|{zxutrnkeb]ZYY[\]`bcdehikkllllmmnnnnnnnnnnnoqstuutsrrsttwxyz|~}|{zywttponnmmmmmnnoonnmigdba__adhiknptz} nlhebbbbcdhhijlmnnnnnnnnnotxz{{{zyzzyxwwwwyz|~ }}~~}{{zyvrnosvxtplkkjhgghiknoqtuvuuuvxzz|{zzz{|~}|{zwwy}xtqponnnoppqqqtvxz} zukdf`[irrsnbYWWWX[]`bdefeb_]\]^aabbceghhhgebbaaa`_^[VSRQPPPOLHDDDDA<>IUVWZ\]^___^^__]]^\\\]]ZVSXVWXVY\\\\]]^^][YZ\_bb`^]^bb\XVQURPKFCCDHHIIIHJKPSVXXXY[\\]^____]]]]^^__^^^__^_baaaa`__^\\]\ZWVUTTSRQPPOKJIGFEEEFFDDDDDDDDDDDDCCBA@@@@@???>>>=<<;::;;<;;;===>ABBDDDFGGFEDDDEFGGGGGFFFFFFDDDDDFGFGGGGGHJJMMLKJJKKKMNNPQTTRRSTTUTTTVVVVWWVVVUTTTTTSSRRQQQQQQRRSSSRTTTTTTSSTUUUUVVVUTSQPONMOQTV]hmlmnoqrssrqqqrttttttttsssstttttsstusomkige^\\[YVSRUUTSRRRRPPPPPQQQ ¡¡¡¡¢£¤¤£¢¥¥¥¥¤¤¤¤¥¥¥¥¥¥¥¥¥¦§¦¦¦¥¤¥¤¥¥§¨¨¨©©ª««««ªª©§§§§¨©©ª««©¨¨©©©¨©©ªª©«««««ª©©ª«««««««««««¬¬««ªª©©©ªª««««««ª«««ªªªªª««««¬¬®¬¬¬¬«««¬¬¬«««ª««««¬¬¬¬¬¬®®®¯¯°±±±²²±±±±±±²²±²²²²²µ³³´´³´µ²±°°±²³³´³´´µµµ´´´´³³´´´³³´´´µ¶···¶µ´´³³³³³³³³³³²²³³´´³³²²²³³³²²³²²±±±°¯¯¯¯®¬®¬¬¬¯¯¯¯¯¯¯¯¯¯¯¯¯®¬¬«¬¬«¨¥¤££¥¨§§§¨§¦¤¢xnjaVVUSSPPPPQPMOOONNNNNOOPPPPPPPPOONOOPNOONNMNNNNNNNNNNNNNNNNNNNNNOPPPPPPPPPPPPPPQSTV\bfjnqrssrrrstuwz{~ zvtpnkhhhhhilnoprrqnmllkllmnnosuz}ytqpoprxyz||{zzzzwtrnjfa^[XWY[\^aceffhhhhijkllklmmmlllmmmmnnprsrpnllmnpttvy{~}{xuspnljjiihghhhhebaba```^]^bdgjnpu~smgca`abbdhhiklmmmmmmmmnoptxz||{zxyxvuuuuuvxz|~}{z{z{|{yyzzywsonrutsnkihgdcdegilnnqstuuvwxyzzzyyz{~|yuwz~~|xtqnnmnnnnnnooprtvx} |~yncb\YhurspcWVZVX\_behijihdb``abbbcdfhhkkjhgedcba``\XTRPPOOMJECD@>?BIV`\\]^]]]^]]__]\\]a^\YVTTUQPPSU[bbbcegjmnlkjiihgdbbdhifb_\^``\SJGHHJJIIKNPRVXYXX[]\]]^__``^___````^^^^^^_a`_^^]\\\]^__][YWVSPONLKJGGFDB@@ABBBBBCCDDDCBAAAA>>?>>?ACBA?>=<<<<<<<<;:99:<>@DFGHIJKLLJJHGFFGHHGGGGFEDDDABBBDEEDEEEEEFGHIIIIIIJJKMNNNPPPPPQQRRQQQTVVVVWWVVVUTTTTSSRRRQQQPQRSSSRRTSSTTTTSUTTTTUUUQQPOMLMNQUZ_hoqnooqrsssstsrsttttssrrqqqqsrstttttutsrqpnleb_][WTSUUTSRQPPPPPPPPPQ ¡¡¢¢¤¤¤£¢¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¥¥¥¥¥¦¨©©©ª««¬¬««ª©¨¨¨§¨©ªª«ª©¨©©©ªªª««««««««ªª©©««ªªªª««©ª««¬¬«««ª©©¨©ªªªªªªªª««ªªªª©©ªª«««¬®®¬«««««««««ª««««¬¬¬¬¬¬®®¯¯¯°°±±±³²±±°±±±±±±²²³³²µ´´µµ´´¶³²±±±²²²³³³´´´´´³³´´³³²²³³³³´µ¶¶··¶µ´´´´´³³³³³³³³³³³²±±°±±²²²³²²³²²±±±°¯¯®®¬¬®¬««¬¬®¯¯¯®®®®¯¯¯®®®¬««««©§¦ ££¤¨¨§¦¥¥¥¥¥¤£|tpd[\XVUPPPPPQOOOOOOOOOOOOOOOPPPPOOOOPPNNNNNNNNMNOOOONNONNNNNOONNOOOPPPPPPPPPPPPPQSUV\adhnqrssrqrssttvxy{zuspnkihiklmnpstvwuspnmmnnnpqrtv|{wronnoqwxz{{zyxxwurokfb\[YWXZ\]abfggfghggghklkjklllkkllmmllmnpqpnjhhilnrstwz{~{xurpmjihhgcddcb_\\]]^``^^^bbeinnt ypgc```aceghikllkjllllmnpqtwz{zzzyzwtttttttuwz{~}{zyxwwwuuvxxwtonqtrplhffeccdfhjmnoqrsttuwxwwxxxz|~~~xuwz|}{wtronllllmmmmnmorssx |trv}}thb[YhuttpcXX\VY\adhkmmmljhfeeeeddeghhjkkjhgfebba`]ZVTQPONKIDCB>?IS[^`]]]]\\\\\]]\\[\\[\\\WSPQOPSX^gnqwy{}|yussqroieb_Z_cc\RMKKNNMMPTVWZ\[YZ]`_^]\]^_``aaaa`__^^]]\\^_^]\\\\\\\\]\[XVUTPLIIIIHFEDC@>>>??@@ABCCCA?>>>>><=>>?@BDCB?>==>>????>>>==>@ADGJJKKKLMNNMJIGGHIHGIIHGEDDCBCCBCDEEEEEDDDEFFFFFGHIJKMNLLLLLNOOPPPPOOQTUUUVVVVVVUTTTSSRRRQQQPQRSSSRQRSSTTUUUUSRSTTTTPPPOLLNQVZ`ekppnopqrssssttrrrsttpoonnnnnnoqsssstsrrstronigca\XVUTTTSSRQPRRRQQPPP ¢¢£¤¥¥£¢¤¤£¤¤¥¥¥¥¥¥¥¥¥¥¥¦¥¥¥¦¦¦¦¥¥¥¥¦¨©©ª««¬««ª©ªªª¨¨©ªªªª©©ª«©ªªªª««««««ªª©©©«ªª©©ª««©©ª«««««««©¨¨¨¨©©©©©ªªªª©ª««ª©ªª«««¬®®®®«««««««««««««¬¬¬¬¬¬®®®¯¯¯°±±±±±±°°°°±±±±²²³³´´³²³´´³³´³²±±±±±±²²³³³³³³³³³´³²±±³³³³´µµµ¶¶µµµµµµ´³³³³³³³³³³²±±°¯±±±²²²²²²²²±±°°¯®®¬¬¬®®¬««¬«¬®¯¯®®®®®®®®®°®¬«««««¨£ ¢¢¤§¦¥¥¥¥¥¥¥¥¤¡zndb[VTPPQPPQPPPPPPPPPOOOOOOOOPPPPOOOONNNNNNNNMNNOOOONOONNNOOPOOOOOOOOPPPPPPPPPPQSUW\`dhnqstsrqrrrqrstttwz~~}~{xtrpnmjijlnoqsuxzzzwtrqqqrrtttvy}zupnllnptuxyzywuttrnlhc_\[YXXY[\`bdffffgfffhjkkjkklkkkklmlkkkmnnnlhgfhjlqrtwy{~~{ztpmihgecbba`^\\[\\]_`__`bbchjjq| vjgdbbbcdghijkkjillllmnprtvxyxxyzzwtsssssstvxz|~~|{xutttrrsuvvsnnospnidbbbbdfhjmnoptttttuvxwwwxyz} zwx{||zwtspnkkkkkkkklknqpotz xpnt{ {nbZXdwyzqb[[[Y\_cgknpqrrqomkjhhfffhhhijjjihggfecb`^[XTSQPNKIFCFOW\\]`^^^\\[[\\\\\\\\\ZZYYXY^bdhnt||qjfbhillga\\]_a`^^^^]^_^\\_bb`][Z[\^bbbba`^^]^]\\\\]\\[[\\\]\\[YVUSRPMJHHIHGEDCA@?>=>>>?ABBB@>=<<===>>>@ABAA@?><;=>?@@AABCDDFHIIJKMNNNNOPPPPNLJJJKJJJJIGDDDDDDDCCDEEDEDDDCDDEEEFGIKLJLMLKLLLLMMNNNNMNPRSRRSUVVWWVUTTTTTTSSSRQRSTSRQPQRSTTUVVVSRSUUTTPPPPNNPUY]bfimnmnopqrssssqonooppnnnmlkkklnqstssrrrstttqomkie_XVVUTTUUUTSSSSRRRQQ ¡¡¡¡££¤¥¥¥¥¤£¢¢¢£¤¥¥¥¥¥¥¥¥¥¥§¥¥¥¦§§§¥¥¥¥¦¨©ª«««¬¬««««««ª©©ªªªªªª««©©©©¨©ª«««««ªª©©ªª©©©ªª«ªªªªªª««««ª©¨¨¨¨©©¨©©ªª©ª««««ª«««««¬¬¬®¯®¬««««««««««««¬¬¬¬¬®®®¯¯¯°°±±±°¯¯®®¯°±¯±±³³´´´´³´µµ´³´³²±±±±±±±²³³³³³³²³³³³²±±³³²³´´µµµµµ´´µµµ³³³³³³³³³³²²±±±±±±±²±±±±²²²±±°°°®®¬®¬««¬¬¬¬®¯®®¯¯®®®®¯¯±°®©¥£¡¡¥¨¥¥¥¦§¦¥¤¤¤£ zoh]YSPPRPOOOPPPPPPPPPPPOOOOOPPPPPOONNNMNNOONNNNOOOONOONNNOPPPOOOOOOOPPPPPPPPPPQSUV[^dhnprsssqqqpooopqpruyzzyxwusrpoonmnortvxyz||{ywvttttttuuz|}xtomkkmorstvwvtrponkhgb_]\[ZXXYZ]^abcdefeffhijkkjkkkkjkkkkkjjkklkihgghikoqtwz|~|tqmjhfcba`^]\\[\\\\^```babbcfglu} {oligeccdfghiijiiklmmnnprtttuttuxxvtrqrrrttvxyz|}}~~||vtrrqppquwwtnlnoomhb_`bcghknpsttwvuttuwxyyzzz|}{zz{|{yvtrpmkkkjjjiiijmnnnquy{ |{|~ |vsqtzrd\Xazsb^^\\]`chkoqtvwvtqnmljhgghhhhhijiihijigdba][VVUSPOMLJOV\]\]aa`_]\ZZZZ\\]]^\[XURRXcq{z ¤¦¦§©«¬¬««««««ª¦£{vpkiiefggeb^]aaa_]]_aa_\ZXY[\bba`_^]\\]]\ZZ[ZZYWWXZ[[\ZWVUTSRMLKKKJIHGFDDDC@>?>>?ABA?>=;;<=>>CCBCCB@>=<;::<>>>?ABDGJKLNONMNOOPPQSTTRQPPOOOONNJJIFDBBCEFDCBCDDDDDCCBCDDDEGIKMONOOMKKKJKKLMMMMLNOPQQPQSVWYYWVVVVVVVVVVURSSSSRRQRRSTUUVWWTRUVUTTPPPQPPTX]aeghlnnnoopqrrrponmmmnmnmllkjjjlnrssssrrrrtttrpponjb[WXUTTTUUTSRRRRSSSS ¡¢¢¢¢¢£££¤¥¥¥¤¤£¢¢£¤¤¤¥¥¥¥¥¥¥¥§¥¥¦¨§§§¥¥¤¤¥§©©«ªª«®¬¬«ª«««ªª««««««««©©©¨§¨©«««««ªª©©©©©©ªªªª««ªª©ªªªªªª©©©©©©©¨©©ª©©©««¬«««««««¬¬¬¬¬«®®®¬¬¬¬««««¬¬««¬¬¬¬¬®®®®®®¯°°°°°¯¯®®®¯¯¯®°±²³³³³µ´µ¶¶µ´µ²±±±±±±±±²³³³²³³²²²²²±±±²±±²³µµµµµ´´´´´´³³³³³³²²²²±±±±±²±±±±±±±±±²²±±°°±¯®®®¬¬¬¬¬¬¬®¯®®¯®®¯°°¯®®®®ª¦¥£ ¥§¥¥¥§¨¨¦¥¤¥¥¤¢¡ }the\VRRPNNMOOOPPPPPPPPPOOOOPPPPPPNNNMMNOOONNMMNOOONNNNNOOOOOOOOOOOOPPPPPPPPPPPRTVZ^chlnoqssqqponnnnpnnqtttuttttsrrrsqqsvy{~|}~}|zzzwvvvvvww|~zurnkkkmnpqsttspnmligfeca_^]\ZYZ[\\]_abdfffgghijlkllllkllkkkkkkkkihhhhijjnqtxz|}|vsnligdb_^\[ZZZ[[[\^``ababaacfipx}qomligfffgghhijjklmmnnpqsssrportvtsqoopqttuwwyzzzz{{{{zztspppoopuwwslhhjjhc^\^bdhjnqtwxyzzyxwwwwzz{|}|{{z{zvtsrpnlkkjjiihhikmmnoqtuvxz| }wklmnnnopxvttsty}~}~wmgbh}ueab_]_bdhlpswyzzyuronlihhhhgfghiiijkkkigec`\YXWVUSSRTTV\^^_```_][YYYX[\[[\]]UW_ju¡§¨§ª¨¨¦¦§«®¯©¨©ª«««ª§¥¥¥¢¢£¡~xutytqpnhfhbba_]\\\^]\ZYYZ[_^]\\\\[Z\\YWWVVWVSRSUVVSRPPPPQQPPOMLJJIJIHHGFDDCA?ADDA>>=<<>@AADDDCA@?><<;;;<=>>?BDFHJLMPQPPPPPPPPRSSRQPPPPPPPPKKJIFDDDEFECBCDDCCCCCCDDDDFIJLMMPPOLJJJIJJKLMMMLNMMOPPPRVWXXWWXYYYXXWWWWRRSSSSSSSTTUUUVVWTRUVTQPONOQRRV[`cfhjmnnnnnooooonnlkkkkkjjiiiiiiknooopppnnnprsrqrqqnha\\VVTSTTSQQQQRRSSS ¡¢¢¢¢¢¢¢¢£¤¤¤¤¥¤££¤¥¥¥¥¥¥¥¥¥¥¥§¥¥§©¨§¦¥¤££¥¦¨©ª©©«®®«©©ªª©©««««««««ªª©¨§§©«««««ªª©©¨¨©©ªªªª¬««ª©©ªª©©©©ªª©©ª©©©ªª©©¨ª«««ª««««¬¬¬¬¬««¬®®¬®¬«««¬¬««¬¬¬¬®®®®®®¯¯¯¯¯¯¯¯¯¯¯¯¯®°±²²±±²´³´µµ´³³±±±±±±±±±²³³³²³´²²²²²±±±±±±±³µµµ¶µµ´³³³³³³³³²²²²±±±°°°±±±±±±±±±±±±²±±±±±°¯®®®®®¬¬¬¬¬«¬®¯¯®¯®¬««®°®®®®®¬««©§¥¤¥¦¦¥¥¦¨¨¨¥§§¥£¡utj`WTPPPPOOOOOOOOOOOOOONNNOPPPPNMNMMNOOONNMMMOOOOMMNNOOOONOOOOPPPPPPPPPPPPOPQTV[_bfilnprrppponnnnpnnoonprsttttttttsrtwz~~}{{{zzzzzzz{}zwtpmkkkmooprssqnkjigedecb___]\\\]\\]]_aceffggghjlmmnnmmmnllllllkkhhijjkkknptwyz|~}{zwtomjhca]\\ZZYYZZZ\_aaab`ba`cfins~}ponnljhifffghhjkklmnnnoprrrqnmnqttrpnnnpsttuvvxxxxxyxxwwtqoooooptutohbbcbb^ZY\acginrvyz{{{zzzyxwzz|~}||{yywtrrrpnllkjjihhghjjknoosrpnoqtw} ~wikljhhlottttsty~}|{{{|}~}xurt}wgbccabcfinruy{~}zvtomjhhhhgefhhijklkkjihgc^\\[ZXXWXVWZ]]\]`\\\\ZXWWXZYVUX]`lr¤§©ª¬©¦ª¨¦ª©ªª¬°±±®¬¬¯±±¯®«ª¨¥¦©§©§¥¢zplhbbfba_^\[ZY[[[ZZZZZ\[ZYYYYYWYYWVUTRVSPOOPPPQPPPRTUUTRPLJJJKJJJJHFFFGDBCEFC>>>=>@CDDBCDB?>?@===<<==>?ADEGHIJMPRRQQQQOONNOPPPOPPPPPPPNOPNJHGGDEEDCCDCBCCDDDDEDFHJKKJJMNMJJJJJJJKLMMMMMKKMNOPQVWWVVVX[YYYYXXWWRRRSSTTTUUVUTUVVWSQTURONMLMPRSV\abehkmmkmmnnnnmmlkjiiihhggfggghhilmlklnnlllnprrqrqqpmgb`ZXVUUTRQQQQQQQQQ¡ ¢¤¥¤£¤¤¤¤¥¥¥¥¦¤£¢££¤¤£¥¥¥¥¥¥¦§¦§©©©¨§§§¥¤¤¥¦¥¥©©ª«¬®¬«ª©ªª««««««««©©©©©©©©««««©¨©ª¨©ªªª««¬«««ª©©©©ª©©©©ªªªª©¨¨¨¨©©ª©©ª««««¬¬¬¬«««¬«¬®®®¬¬®®¬¬¬¬¬®¯®®¯¯¯°°¯¯¯°®¯°°°¯°°±±±²²²³³²³³´´´³³³²²±±±±²²³´³³³³´³³²²±±±±±±°±±²³´´´´´´´³³²²²²²²±±±±±±±±²²²±±±±±±²±±±±±±±±°°°¯¯¯¯¯®®®®®¬®®®®¯®¬¬¬®®®®®¬¬«ª¨¥£ ¡¥¥¦§¨¨©©ªª©§¦¥£xt\[STRNPPPPPPPPQPPONMMMMNOPPOOPPONNNOPOOMMLMNPPPPNMNOPPPONNPPNOPOPPPPQQPPQQQRV[^dhlmnorssrpnnnnnnmmnnprrtuuvwxyywutw{~~~~}|}~~zsponmlmmnppppponljihgeeefdcba`^\\\\]^_acdfeefhknnnnnnnoonnnnmlllmkihikmnnoqsuxz{|}{zzxtomjfb_\\\\ZXZ\\\]^abbbaaaabdhjrz~tqpqrpnkihffhiiillllmnnonnmljjlmonnnllmnprtuutttvvvvuuuuqpopppqrvutpg\Z\]ZWVVW\`fintxyz{|}}}{yxwyyyz|~~~~~~zwtttrpnnnllmmljhfhhhjlnorrpnieejqvz|~~xiiijjjmpstuuuxzz}~}|~~~~~~~~unjiiiiihimqtz}~zwqonkihfeefghijkklmmmjhfeb`^]\\\]][[\\\[\Y\\[[[YVWYZ\alz¢¥§¨¨¨§§¨©«®¯¯®®¯°¯®¯±±°¯¯®¯±³³²°®±±±±®ª¥¤~wpgbb]WVVXWXZWSTWZZYXXWXXVVVUTSRPRRQPQRRPPPQSUVUSTSPKJJKKLJIGGGHHGEDDFGEDDDDEFFEDDCA@@@AA?>=>>>?@BBBBDFIJPPPPPQQQONLLMNPPPOOPPPONNNMNONLJHGEDCCBCBBCCCCCCEFHJJJHGHJJJJIIIHJKLLKKLMLLLLMNOSSSSRRSSUWZ[[ZXWTTSSUVVVVVVVVUTSVUTTSROMMNOPRUX\bcfhijklllkkkkihihhgffedbbceedegfghgffghjkmnpqqqtsqqokfb]^^\XUSSQQQQRSTT¡¢¡¡£¥¥¥¥¥¤¥¥¥¥¦¦¦¤£¢¢£££¢¥¥¥¥¥¥¦§¦§©©¨¨§§§¥¥¥¥¦¦¥©©«¬®®®¬«ª©©ªªª««««««ªªªªªªªªª«ª©¨¨¨©©©©ª««««««ªª©©©©©©©©©©ªªª©¨¨¨¨¨©©©©©ª«««¬¬¬¬¬¬«««¬«¬¬¬¬«¬¬¯¯®®¯®®¯®¯¯¯®®¯¯°°°°°°±±±±±±²²³³³³´µµ´´´³³²±±±²²²³³³³³³´³³²²²±±±±±±±±²³´³³³³³³³³²²²²²²²²±±±±±±±²±±±±±±±±±±±±±°°±±°°¯¯¯¯¯®®®®®¯®¬®®®®®®¬¬®®¬¬««©¦¤¡¢¦¦¦§§©ªª««ª§¦¥¤¡£¡|c`XYVPPPPOOOPPPPPONMMNNNOPPPPPQPOOOPPPONMMNOPPPPONNOPPPOOOOOPPOOPPPPPPPPQRTUW[]eimnoqsssrponnnnnmmnnprsuvwxyzzzzxxz}~}~ztsrqonnooqqqqqpnmjihhfffffecba`^]\\]]^`bbeddfhkmnoooopqponnmmmmnnjjiikmnopqrtuwxy}}}|zxvusnkhgb_]\[\\\Z[]^^^_`bbabbbbbdghox}~tqopqpnmjhgghijjkklllmmmmmlkjijkmmmlkklmoprsssssttttttttqonoppqsuutndYVWVTRRSUX\dglqtuxz|||{zyyyxxxyzzzzvwwwxzz{~{wtsrqponnnmmnnmlihgggijlnqqplgbbeiqtvxz}ztkkklllnqtuuuuxz{yrnnmlllklnru{}{xtspnkihfeeghikkllnnnljhheba`^]^`]\\\\[Z[\VTVYXUSNU_ly«¬¬«¨¦¦¦ªªªªª«¬°±±±±±±²°°°±±±±±±±±²³²±°¬¬¬¬¬¬«««¬© {uqh^WRVWWVUVY[ZZZYXVVUUUUTSRQQOPQPPRSSUTUVWWVVSQOJJJLLKJIIIIHHGFEFHHGFHHHIIIGECCBA@@@@@>>?@@@A??@BDGJJOOOOPQQQNNMMNOPPOOOPPPONNNNNPOMKIIHGFDBA@ABCCDDEGHIIIIIHEGHIJJJJJJJJJJJJKKKKKJKKMNPPPPPPUVYZ[ZYYVVUVVVVVXWVVTRQPSSSRPOMKJMPRUWZ\bcfhijjkkjiihhgfffffffffa``aabceccccccdehhkmnpqrqqrssqnkba^\XVTSSRQQRSTT¡¢¢¢££££¤¦§¦¦§¥¥¥¥¦¦¦¦¥¤££££¢¢¤¥¥¥¥¥¦§¨¨©©¨§§§¦¥¥¥¥¦¦¦¨ª«¬®®®¬«ª©©ªªªª«««««««ªªªªªª©©©¨¨§¨¨ª©¨©««««««ªª©©©©©©©©©©ªªªª©¨¨¨¨¨ª©©ª««««¬¬¬¬«¬¬¬¬««¬¬¬¬¬«¬¬¬¬¯¯®®®®®¯®®¯®¯¯¯®®¯¯°°°¯¯°±²±±±±²³³³³³´´´´´´³³²²²²³³²²³³³³³´³³²²²±±±±±±±±²³³²²²²³³³³±²²²³³³³±±±±±±±±±±±±±±±±±±±±°°°°±°°°¯¯¯¯®®¯¯¯®®¯¬®®®¬ª¨¥£¢¡¤¥¥¥¥¦¨ª«««ª¨§¦¥¤¤££¢ibWXVQPOONNOOPPONNMMNNNNNNOPQQQPOOOOPOONNNOPPPPPPOOOOOOOPPOOPPPOPPPPQQPSTUVWY\_fjnqrssssrqponnnnnmnnqstwxyz{{|||||}~~zuutsrqqqqssssrpnnkkjihhhghfecba_^]^^^_`bbddegjmnopqrrstsqnnnnnnnolkkjkmoqrrrrssttxxwwutqomifec`]\[[\]]]]^`___`aaacccccdfgmuz}tqooponnljhhhijkkkkllkkjjjjihhhhhijjjjkknnooppqrrrrqqqpponnnpqtvxyvn`UPRPOPPQSVX^afjmotxyyzyxwvwtttuuuttrrrrtuwx~ytqonmllmnnnnnnnnljfffghhlnppleabcdjmoqtvurmmnnnoqtuwwuuwz{~ {vsrqnnnnmnqt{~~zyvsoljhgefghikllnnonnkihfca`^]^`^]]]\ZYZYZ[ZVV\c\gw¤¨§§§¦¥¥§¨««¬¬®¯°²³´´³³´µ²±±³³²²´´³²²²²²±¯®®®°±²«¬®«§¢zpdWX\\WVVVS[[\\ZXVUUTTSRRQRSVVVTTVVTSSTUUSRRPMJJLLKIIIJJJHGFFGHHHHHIIIJIGDCAAA@@@??>>>@A@@@>?ACEGJJLLLMNPPPMMMMNNOOOOOPPPOOONNOPPPNLLKJHFDC?ACDCDFHIIHHHHIIHIJKLMMLLLKJIHIJJJJJJJIIJJMNOOPPQSTVVVWXVVVVWWVVWVVTRPONOOOMJHGHHJNPSVZ\bcfhhhhiihgfedcbabccbbbc^\\\\]`bbb``abbbeghknoqqqrstsrpnhe`\ZXVUUTRRRSST ¢££££¤¥¤¥¦§§©ª§§§§¦¦¦¦¥¥¤¤¤¤¤¤¤¥¥¥¥¥§¨ªªª©¨§¨¨¦¥¥¥¦¦¦¦¨©ª«¬®««ªªª««««««¬¬ªªªª©©©©©©©¨¨¨¨©«©¨©««««««ªª©©©©©©©©©©©ªªªª©¨¨¨¨«ªª««««««««««¬¬¬¬«««««¬«¬®®®®¯¯®®®®¯¯®®¯¯¯°°¯¯¯°¯°°¯¯°±±±±±±²³³³²²³³³³³³³³³²²²³³±²²²²³³³³²²²²±±±±±±±±²²³³³³³³³²²±²²²²²²²±±±±±±±±±±²²²²±±±±±±°¯¯°±±°°°¯°°®¯°°¯¯®®®®®®¬¬¬®®¬«©¦¥¤¤¡££££¤¥¦§¨ª©¨§¦¦¦¥¥££¤¡ujXWXVSPONNOOPPMMMMMNNNONNOPPPPOOONNNNMNNNPPPPPPPPOOOOOOOPPOOPRRRRRSUVVZZYYZ]behlqttttsrrqponnmmnnnpsuwyz{|~~~~}~}}~{xuttsstttttttsqonnmmmlkjihgedbb`_```aabcdefhimnqrrttuwxvtrrqoooopnnmllmpsttsrqqqrrqppqomjjgdbb_\\[[\]^___`_^^_`aaccddddfgkqu|zsqnnonnonlihhikklkkjjjiihhhhhgfffghhhhhiklnnooqqqqqponnnnnnoqsvzz|xkZNKMMOQSUUVVXZ^bdhnrssttsrqpnoopppoopppqtvyz }vqnljhhhijklmnoponmhgeeefilmnkdbcdbhilnpsrpmnnprtwyzzzwuvxz} |xutspponnnpqz||zxtolihgffghiklmoooonkihfca_^]]_^^^]\ZYYU[]WQVdq~¤¤¤¤©©©©©ª¬®®¯°±±³´´´´´µµ´³³´´´µ··¶´´´´³³³³³³³²±±±°®««¬¯±¯¬¨ unh\QNQW[\\\\\ZWVUTSSSRSTSVWVUTTSVVVVVVUTRPNLLLJHFFHIIIGEDFHHGGGIGHIHFDA?>??@@@??>>?AB@??AACDFHIIIIJJJLLMKLMMMMMMOOPPPPPOOOPPQQQPRPOLJHGFDEFFEEGJKJJJJJKKNMNOPPONMLJHFEFGGHIJJIHGHIJLLMNONOPPQSTVUUVVVVVVTSRQPONNLKJHDCCDIJLNPTX\abeggggggedba`_^]_a`^\\][YXXYZ\_b`_^]^_adfhjmnpqstttronnlhb^\ZXWVVSRRSSS ££¤¤¤¤¤¥¥¤¤¥§¨«¬©©¨¨§¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¨©«««ª©¨¨©¦¥¥¥¦¦¦¦¨¨¨©ª«¬®®««ªª««««««¬¬ªªªªª©©©©©©©©©ªª«©¨©««««««ªª©©©©©©©ªªªªªªªª©¨§¨¨«ªª«««««ªª«««¬®¬¬«««««««®¯®®®®¯¯¯¯¯¯®®¯¯¯®®®®®¯¯°°¯¯¯°®¯°±±±±±±±±±²³³³²²³³³³³³³³²²²²²²±±±²²³³³²²²²²±±±±±±±±²²²³³³²²²±±²²²²²±±±±±±±±±±±±±²²²²±±±±±±±°°°±±±°°°°°°°±±°¯®®®®®®®®®®®¬¬®®¬«©§¦¥¥¥£¢ ¡¢¤¥¥¥¦¦¥¥¥¥¦§§¥¤¥¤|d_]\VQPOOOPPONNNNNNOOPONOPPPOOOONNMMMNNOPPPPPPPPPOOOOPNOQOLPWWVVVWY\^baaabdhjlnsvwvttrrqonnmmmnoqsuyzz{}}~~~ ~{zvuttvwwwxxxwutrqpoonnnlkhhgedcbaaabbbcdeghjmnqsttvxyz{zyvutrpooonnnmmosuutsqppopnmlllkhfgdb`_\[[[[[\\^_______`abbcddefghinotvvwtrpnnnmmnnmjiijklmkjiiihhgggggfdcdeeeeefghjmnoopqrrrrqppqrqqstuy|{|veRIIKMPVYZ[ZYWX[\^bgklnnnnljihijlmmnnnnoruz|}~wqnmjheccehijknqstrqkheddehljkicacdbhikmnppomnpsvz}zwvwx|~~{yvtsssrpoopqvz~~}|zwtoljhhhhhhjklmoooonljhgdba_^_a_`_^\[ZYZUSV[cp|¤§¦¥¥¦¨©©©©ª««¯¯¯°±±±±´´µµµµµ¶µ´µµµµ¶···¶¶¶µµ´³³´µµ´²±±°®¬¬¯®«¥ rbVRV^f^]\[[YWVUTSTTSTUTVVWWVVSUUUUUTSRRQPONLHDDDEGGFDDDFHHGFGHHIIHECA@??@A@?>>>>?AA?>>ABDEFGGGGHHHIJJJJLNNNMMMNOPPPPPPPPPQQRRRTSQOMKJJJKLJIHIJMMMMNNOOOOOPPPNMLKIGEDEFGGIIIGFEFGGHHIJKMNOOPPRSRRSTUUUTPPPPONNNLJHECBBBHJLNPTY]_acefdccbba_]\\[\]^][YYYVVVWYZ[\_^]\YX\`dfhklnopssttrponkhd`\[ZZXVTSRRRR ¢¥¥¥¥¥¥¥¥¥¤¤¥§©«ªª©¨§§¦¦¥¥¥¥¥¥¥¥¥¦¦¦¦§¨ª««««ª©©©¦¦¦¦¦¦¦¦§§¨¨©«¬®®®¬«««ªªªªª«««ªªªªªªªªª©©©ª««««ª¨©ª««««««ª©©©©ªªªª««ªªª««ª¨§§¨ªª©ªª«ª©©©ª««®¯¬¬««««««¬®¯¯°°°°°°¯¯¯®®®®®®¯¯¯®®¯¯®°±±±±±±±±±²²²³³³³³³´´´´³³²²²±±±±±±±²³³²²²²²²±±±²²²²±±±²²²²±±±±±²²²²±±±±±±±±±±±±±±²²²²±±²²²±±±±±±±±°°°°°°±±±¯¯®¯®¯¯®®®®®®®®®®®¬¬«ª©¨§§§¥¤¢ ¢££££££¤¤¤¥¦¨¥¥¥¥¢qh^ZTTRPPPPPOOOOOOPPPPPPPPPPPOOOONNNNNNNOPPPPPPPPONNNPOPRQPV^\[Z[\^bdhhijlmnoqrtxzxutsrponmmlmnqtux{~|}~ }zzxwvxz{|||||{zxvvsrqqppnmkjhhgfecbbbccdefhilnqstuwyz{}~}zxvtqpoonnnnpsvxvutrponnnljihgdbb`^\\ZYYZ[\\\^__``aaabcdcdeefghhjmlnpnqnonnnmklmnmkjjklmmkjijihhffeeedcbbbbbbbcdghknnppqsttttttuwwvwwwz}{|taQLNPQUZ]_``^]\\]^_bfhijkihfedfhijlnoooqtz}|vpmkjhfca`behiknsvxxwpkebbdhjjjhdbbcbghlnnnnnnorty~zxww|~ }zyxutttsrqppqqtx|}|{zywuromkjiiiiijklmnnnnnmjhebaa`_`aaa`^]\ZWVMPaov¡¥¦¥¥§ª¨ª«¯±±²±±±±±²³²µ¶¶¶¶¶··¶¶¶·¶¶·¸¸·····¶µ¶µµµ¶¶µ´µ´³³³±¯®««ª¦¥ tlgdfiba]\ZYWVTRRTTSSVVVVUTTRPMMNNNNMMQQQPNKFBCCDEEDCBDGIIHGGIIIIGDBAABBBB@?>===>?>>=>?@BDEFFFGHHHHIJJLNOPOMMMNOPPPPPPQPPQQQQRRRRQPNLJOPPOLJJKLMMNNOOONNNNNNMKLLJIHHIJKKJJIHFEGGFFFFHIKLLMMNOPOOPPQRRRNNOONNMMKIEB@?@@DGKOQTX\_bcedb`_^^]\[YXXYZ[ZXWVWSSUWYZZ[]\[YVVZ`dfhjkmnorrrrrpnnihd`\[Z[XWUSSRRQ £¥¥¥¥¥¥¥¥¥¤¥§©©ª«ª©©¨¨§§§§¦¥¥¦¦¦¥¦§§§§§¨ª««««ª©©©§§§§§¦¦¦¦§¨ª«««¬®®®¬««ª©©©©©©ªª©©ªªªªªª©¨¨©ª««««ª©©ª««««««ªª©©©ª«««««««ª««ª¨§§¨ª©©ªªª©©©©ª«¬®¯®¬«««¬««¬¬¬¯¯°±±±±±°¯¯®®®®®®¯¯¯®®¯¯¯°±±±±±²±±±²²²²²³³³³³³´´³³³²²±±±±±±±²³³²²²²²²²±±²²²²²±±±±±±±±±±±±±²²²±±±²±±±±±²²²²²±±²²²²²²²±±±±±±±°°°°°°°°°¯¯¯°¯°°¯®®®®®®®®®®®¬¬¬««ª©©¨¥¥£ ¡ ¡££¢£¥¥¥¥¤¤£|r`YVVURQQQPOPPPPPOOOOOPPPPPPNOOONMNNNNMNOPPOPPPPONNNPQSSV]dhecbdegilnoprstttvuwz{zwwtrqonmmmnosuwz|~|zzzyyz|~|zzzvutssrpomlkjihhgeffffghhilnqtuvwyz|}{zxutsrrppopsuwyxwutrpnnnlihgecb`]\[ZXXX[\^^^`abbcddddefgggggghhjlilliljkklmlkklnmllllmnmmlmmmjheddccbbaaa```abchhknoqstwxyywwxyzyyyxxz}}{qaVVYXX\^`bccccbaaaabdefggfedddeghjmoqttvz}|yuqnljheca]\^bgiknswz|}zsjedehiiihda`abfhlnonnmmorty~ }zxwz| ~}}~}}}yvuvutttsrppqrstvzzzzvssronmlkjkkjjjklmnnnnmkhfb`___^_`a`^\\[WTJPat¡¤¥¥¥¥¦¨«««¬®¯¯¯³²±±³´µµ¶·········¸¸···º¹¸······¹¸··¸¸·¶¶´²±±±±±¯«««¨§¥¢}vrpoba][ZWVTQPPRSQRTSROJHHGGKKLMMMNNPPPOLJFCDDDDDDCBDFHIHHHIIIHDA??AAAA@?>=<<<=>>=>?>?ACDEFFFGHIIJJKMOPPOMMMMNPPPPPPQQPPPPPPPPQQQPNMOPPPPNMMLLLLLMMNMNNNMLKKJJJJJJJKNMLKJIHHHHHGFFGHHIJJJJKKLKKLMNNNKLNOONMMJHD@==>@DGKOPSX\abdeb`\[Z[[ZYWVVVVVUTSSSPPSVYZZZ\ZWVUUY_cfhijkmnpoppqomkkhb^\\[[XWVTSRQQ£¢£¥¥¦¥¥¤¤¥¦©ª©¨¨©©©¨¨¨¨¨©¨§§§§§¦§§§§§§¨©«««««©©©¨¨¨¨§§§§¥§©«¬¬««®®®¬«ªª©©©©©©ªª¨¨¨©©©ªª¨¨§¨©ªªªªªª©©ª«¬««««ªªªª««««««««ª«««¨§§¨ªªªª««ª©ªªª«¬®¯®¯««¬¬«¬¬¬¬¬®®®¯°±±±±°¯¯®®®®®¯¯°°¯¯¯°¯°°°°±±²²²²²²²²²²²²²²³³³´³³³²±±±±±°±²³²²²²²²²²²²²²²²²±±±±±±±±²²²±±±²²²²²²²±±±±²³²²±±±±²²²³³²²±±²±±±±°°°°¯¯°¯¯¯°±°°°¯®®®¯¯¯®®®®®¬®®¬¬««ªª§¦¥££¢ ¡¢¢¡¢¤£¥¥¤££¡ |f`bXVTRRQPOOOOOONNNLMOONNOPMNNNMLMNNNMMNOOOOPPPNNNNOTUS[irrnmmnopqtttttuwxyyxy{|zyxtsqonmmmnptwyz|~ ~}{z{zz{~~|{{zxvuutsqnmlkkjihijjjiijkknqtuwxyz{}~|{ywuttutsrrtvwxzyxvtqonmkihfedc_]\[ZYYZ\_bbbbccefgggghhiihhgghhhighhegehikmljjlmmmmmmnnnnnpqomjdcbbbba`__^^^_abhjlnortvz{|{yxyzxxyyyxz}}zna\_a^_abbbdeegdccccdeddddccddfghiknpsyyz|~}{trqqpnkhba_[Y[aehjmqw{}rkhhijgfdb_\^behloonmmmnqsw{}zxvwz~{z{|{zzvssttttutsrrstttvwyzytnpnnmmlkkmlkjjklmponmkheb`_^____a`_\ZZYUPMby¢¥¥¥¥¦¨ª««¬¬®¯±±±³²±±³µ¶¶·······¸¸¸ºº¹·¸ºº¹···¸¸¸···¹ºº¸·¸··´²±²²´®¯±¨¨ª©¥vm_\ZXWVSPOMNQRPPRRQNHDDGIJJJKLMNNNPPNKJGDEDDDDDDCDEGHHHIJJJHD?>>@>>>>>>==>>>>??AD?@BCDEEFEFHHIJJLMOPPNLLLLMOPPOPPQQPPOOOPPPPPPPPPNOPPPPOONMMLLMNNMNONLJJJFGHIIIJJLKJIHHHHGGHHGFFFEGIJJJJJJIIIJJJJJJLNOOONIHEA=<>BHJMOPSY]bdeeb^[XWXYYWVVUTSQPPONNOPQVYZZZYVSSRSW\bdhhijlnmmnprqommhb^]]\[XWVTSRQP ¡£¥¥¥¦§¦¥¥¦§§§§§§§¨¨¨¨¨¨¨¨©©¨¨§¨¨©¨¨©¨§§¨¨ªªªªªª©¨©©©©¨§¦¦¨§§¨ª«¬¬®««©©ª¨©ªª©¨©ª©©©©©©©©¨¨¨¨©©©©©©ªªªªªª¬««ªªªª©««ªª««¬«««««ªª©«ª©¨©««««ª©ª«¯¯¯¯®¬«¬«««¬¯¯¯°°±±±±±±±¯®®®¯¯¯¯®¯°±±±±±±²²²³±±±³³²²³²³µµ³²³³³³²±±±±²²±±²²²±²±±±±±²²²³³²²²²±±±°±±²²²±±±±±²²³±²²±±±³´´³²²³²±±´³²²±±²²²±±°±±±°±±°±±±±±±±±°°¯¯¯¯®®¯°°¯®¯¯¯¯®®®®¬««««ªª©§§§¥£ £¢¡ ¡¢£¢¤¥¤¤¢zmd]UVUQPOQPPOOOOOONMMMMNNOONNNOOONOONNNOOPOOOOMMMNQPU[[gvqtrrttvyz{zzz{|}}}}}}|{zzvspoonnnrvz{{} ~~~}{{|~}}}zzzzywutpnnnnoonnnlkklnnopswzz{|~}{zzzyxwwutvz||||zwutqnnmjihgdba`^]]]__cdefghijiijjijlmonmllkihhhgecbbbgikllmlkkmnnnnoqsrtuwxsigca``___`^]^^^`bfhlnrtxyz{zzyyvtuuuvvwxx{vnhdfjnedddbacfhhhgfeffedcdeeghijlnortuzzzz{{xsklmnnmihd`]\ZZ_eiklmqy}vojijgb]\\\_bahnppnnllkknquz}{wvvuxz|||}~|zyyyxwvtrrstutvuuuuutttttuvurnnmmlmnnnmmlmnnnnnonlhfc`_```__^^[[\XYZSTmz¢¤¢¢¥¦¨ªª«««¬¬¬¯°±±³³³³³µ¶········¸¹¹¹¸¸¸¸¸ºº¹¹¹¹ºº¹¸¸¸¹¹¸¸·····¶´³²²±°®¬«ª««¨}jbZ_XXVQOMMMOOPPRPOLJJIHGHJMNNMMMLJLMJJHDEDCDDEDDDFHJJJJJJGDBA@><>>?AAA@@AA@@@CEGEDDDEDDEGHIIIJJKLMNNMLLMMMOPPOOPPPONOPONPOOPPOOQOPQQPPOONOONMKJJNMKJJHGFCDDDEHHGIHGGHHHGHHGGGGHHFGHIIIIIIHHHIJHGJJJLOPPMHFFD@=@GJLPPQTY]bbbb_ZVVSTUUUTRQSOJJJJKMPQSSSSTUVQOQTUX\abeghilnnnnnoonmjhc_\\[[WXWVTRRR¡¢¤¤¥¥§§§¦¥¦¦§§§§§¨©©©©©©¨©©¨¨¨§§§§¨¨¨¨¨©ª«««ªª©©¨©©©©¨¨§§¨¨¨©ª«««««ª©ª¨©©©©©ª«©©©©©©©©©©©©©©©©ªªªªªªªª««««««ª©«ªªª«««¬«««««ªªª«ª©©ª«««««««¬®®¯®®¬«¬¬¬«««¬®®¯¯°°±±±±±°¯®®¯®¯¯®®®¯°±±±±±²²²²±±±²±±²´³´µ´²±²³³²²±±±±²±±±²²²²²²±±±±±±²³³²²²²±±±°°±±²²²²²²²²²³²²²²±²³´³³²²³²±±³³³²²²²²±±°°±±±±±±±±±²±±±±°°¯¯¯¯¯¯¯¯°°¯®®¯¯¯®®¯¯¬««««ªªª©¨§§¥¤ ¡¥¤£¢¢¢¢¢£¤¤£¢¢ vlfXTRRSQRPPPOONNNMMMLMMNOOONOOPOOOONNNOOOOOOONMNOSRUZZgxtvvvxzz|~~}}~~~~~~~}|{zzutqqpooquy|~ ~}}~~}}}~~~}||{zyvtrqpppqqqqponnnppqruy|~ }}}}~~}||~~~~|zwusppomkjhfdccbbbbbcdeghhiklnnmmllnnonmmmlkjggfeccbcehijkllknpqqqqrtutvxz{xohda`_^^^a_^^^_bdgimpsvyz|{{zywuuuuuuuuvvwtoliiklihgfcbdghiihhhhhgedeffhinnprtuwxzywwwvrnkjklmljhdb_]\\`fijkmpv| {tmhhb`^]\\]`ejorqpnmmkkmoruyzwttuwyzyxwx|zxxyyxwutsstuvvvvuuvuututttutqnnnnnnnnnnnmmnnnnnnnjheb`]^^^^^^]_UV\ZQUjz¤¥£¤¥¥¨©ªª««¬®°±±²³³³³´´µ¶······¸¸¹¹¹¸¸¸¸¸ºººººººº¹¹¸¸¹¹¸··¸¸¸··¶¶µµ´²°®¬«« rb]e^\WTQPNLKKKMOPOMLLLKKKLMNOOMMMJKKIIHEFEDDDEDDDFHJJJKKHGDCA@?>AABBBBBBAAAACDHJFEEFFEFHJJIHGIKNOOMJIJLLLLMOPPRTQQPMLOPQOPRTTQPQVSPONMMLLMOONLKKJJIIHGFEDDDDEGHGGFEEEFEEFFFFEEEEEFHIIIJJJJIIJJJILKJJKLJIHGFDA>AFJLOPQU[_bbbb^XTRNOPQRRPPMIDBCDHLOPRRQPPQPOPSVVX\bdghiknoppppponmheb^\\\\ZYXVUSTT¡¢£££¤¤¥¥§§§§¥¥¦¦§§¨¨¨©©©©©©¨©©©©¨§§¦§§¨¨©©««««««ª©¨¨©©©©©©¨¨©©©ªªªªª«¬¬¬«ªª©©¨¨¨©ª««©©©©©©©©©©©©©©©©ªªªªª©©©©©ª«««ª©ªªª««««««««ªªª««««ªª«««««««««¬®®®®¬¬¬¬¬¬¬¬¬®®®¯¯°°°±±±°¯¯¯°¯¯¯¯®®¯°±°°±±²±±±±±²±±±³µ´µµ´²±±²²²²²±±±±±±±²³²²²²²±±±±±±³³²²³²±±±±±±±±±³³²²²²²²²²²²±²³´³³³³³²²±³³³³³³³²±±°°°±±±±±±±²²²±±±±°°¯¯¯°¯¯°°°¯¯®®¯¯¯¯¯°®¬«««««««©©©§¥¤£ ¡¤¥¥¥¥¤£¢¢¤¤£¡¡¢¡ wn^VQQTRRQPPPOONNNNMMMNOOOOOOPPPPNNNNNOOONOONNNOOSSVYYevtzyz}~~|{zyutssrrsuwz~ ~~~ ~}{zwuttsrssttrrqpppqqstvz} |zxusqpnmjhgeeeefffgghhjklmnnqqppoopqoonnnmlljihhfdddhknnoqqppqsssttuwwyz{}{theb_^]]^ba``abehhjnprtvxzzzzwtsttttttttttrqonnnonmjgdbcfhhiiiijjkihiijlnrstuvwyyxwttsrnjjihhijihfdba``chlklnosz zslha`_^]\_bknrttrpnnlklnortz}{xtsttuuttssxwvwxyxxutttuwwwxxwwwwvuutsstsqnnnnnooooonnmnnnnnnlheca_\\\\\\\[YXZVVZg} ¤££¥¦¨ª««¬¬®¯°±²³³³³³³³´´´¶¶¶···¸¸¹¹¹¹¹¹¹¹ºº»»»»ººº¹¸¸¹¸¸·¸¸¸¸¸¸¸¸··¶´²±¯®®£slk^VQSTRNJHFFIJMLLLMMMMONMNPPONPLLLJJJHHFDDDEEDFGIJJJKKHHFDB@@ACCBBBBCCBBCCDFIJHHHGFFGIGIJJJIIJJLMMNPOLJKNQUUVVTUTQPRUVVWWVUTSSRPMLLLKJJKMMMLJJIIIIIIGFDDDDEFFEEDDDDDCCDDDDDDDCDDEFGGGHJJIIJKKKMJHFFEDC@BBA??CFJKNOQUZ^``aa\VPNJJJLMLJJFC>;<@GMPPQQPNMMJJMRVW\_cdghjknopppqponndb^\\\]^\[YVUUUV ¡£¥¥¥¥¥¥¥¥¥¦¦¦¦¦¦¦¦§§§§¨©©ªª©©¨©©ªª©©¨§§§¨¨©ª«««««ª©©©ªªªª©©©©©©©ªªªªª©ª««««ªªªª©§§©ª««©©©©©©©©ªªª©©©©©©©©©¨¨¨¨©©©ª«««ªªª«««««««««ªªª««««««««««««««««¬¬®®®®¬®®®®¯¯¯°°°¯¯¯¯¯°°°°¯¯°°°¯¯¯°±±±°±±²³²±²µµµµµ´²±±±±±±²²²±±±±±²²²±²²²²±±±±²³³³³´³²³²±±±²²²³³³³²²²²²²²±±²³´´´´´´³³²³³´´´´³³±±±°°±±±±±±±±±±±²²±±°°¯¯°¯¯¯°°¯¯®¯°°¯¯°±¯°¯®¬¬¬¬«««ª¨¨¥£ £¥¦§§§¥¥¤£¤¤£¢¢£¢ se]VQSQRQPPPOOOPPPOOOOOPPOOPPPPPNNNNNOOOOOONNNOPQTW[Xbstzz|~}{zyvuutttuyz} ~|zywvuttttttsssrrrssuuwz} }zwtsrqnljiihhhhhijjlmnppqrssssssrrrppoonnnmmmlkihhhjmoprstsrstttuvwxxz{zzytheb_^]]^bbccdfhjklmnnopruuwxuqprrstuutttsrppqstutqmhebbbdfhijklmnmmnnnpsttvwwwxxwusrrqnmkigfghhhhfeeeehlonnooowzsnhfcccdgjqstuvtrpnllmnnpsuy|~}zutsrqqrrssuuuvwxxxwwvvxyyyzzzzzyxwutrrrqpnnnnnppppponnnoooonjgcb_^\\\[ZZYYU^^RXp £¤¤§¨ª«¬®®¯®¯°±²³´´³³³³³³²²¶¶·····¸¸¸¹¹¹¹ººº»»¼¼»»º»º¹¹¹¹¸·¹¸¸¸¸¹¹¹¸··¶´³²±¯®®§¤¤zp]TNRSQMIEDDEGJJJKLMNNPONOPPPPPMMNLLMKIGEEEFFFIIJJJJJJJHECAABCCCCCCCCCDDCCCDFGHHHGFEGHLMLKJJNQPPOONJFD>?ADIMPPNPPPPPOMTTQMNRTSPMJHIJJJJKLKJJJJIIIJJJIGDEEDDEEDDDCBBBAACCDDDDCBBBCCCCCDHGHIKLLKLIFDCA>>:<=<<>BDFHKMPTX\\^`_[TNJGFFGGECAA><:;AIPPPPPOLKKKKMPUZ_bbdfhhjlnnnopponnb_\[[\]^\[YWVUUV£¤¥¦¦¦¦¥¦¦¦¦¥¥¥¥§§§§§§§§¨©©©©©©¨©©ªªªªª©¨¨¨¨©©ªªªªªª©©ª««««ªª©©©¨©ªªªªªª©ª«««ªªª«©¨§¨ªªªª©©©©©©ªªªªªªª©©¨¨¨¨©©©©©¨¨©ª«««ªª««««««««ªªª««¬«««««««««««««¬®®®®®®®®®®®®®®®®®®®®®¯¯®®®®¯¯¯¯°¯¯¯°°°°¯®®¯°±°°±±³³±±²µµ´´µ´²±±±±±±²²²±²²±±±²±±²²²±±°°±²´´³´µµ³³²±±±±±±³³³³²²²±±±±±±±²³´´µµµµ´´³´´µµ´´³³³±±±±±±±±±±²²²±³²±±°¯®®¯¯¯¯¯¯¯¯°°±°°°°°°±±¯®¯®¬®®¬«««ª¨¦¤¡¢¥¥¦¨¨§¦¥¥¤¥¤¤¤¤¢ zlbWSUSRPPPPPPPPQPPOOOOOPOOPPPPPNNNOOOOOOOONNNOPQVYZW_otyz{}{zywvuuttwz~ ~|zyyxwutttttttttttuxxz} }zwvutsqpoonmlllnnooqsttuuvuvvvutrppppoonnnnooooopqqtvwxyyxwwwwwxxwzy{{xvtngdb`_^^`beghjkklnlkkkklnpruxvropprtvwvtsponosuxzxupkgcb`bcfhjlnnnnnnopsuuvwxxwwxvtsrqqpomkhfeeeeggghhimospoonms{zvmjhhjlmnvuvwxvtqonmnnnoqqty{{yvtrponoqrsttuvvwxyzzzzzzzz{zzzzzyxutrppponnnopqrqqponnopppnlhdb`^]\\\[[ZZZ\\ZVg ¡¥¦¦¨©ª«¬®¯¯°±±³³´´´´´´³³³²········¸¸¸¹¹ººº»»¼¼¼¼»»¼»ºººº¹¸º¹¹¸¸¸¸¸··¶¶¶µ´³±¯¯««¥ xh_VVPPLHEDDDEIJJKLMNOPPPONMNPMKMNMNNKIHGFFGHIIIIJJJKKLIDA@BCCCDDDDDDDDDCBABCDGHHHGHIJJMPOMLMOOIEHJJNSVVVW\ckonoooonjf\[XVY]^\\VPJHIKMMMLJIJJJGGGHJJHFDEFDDEEDCCBA@@@@ABCDDDCCBBBA@???EFGJMNMKLJGFD@=<;<<::=>?DFJMPSVXZ\__[TMHECBBA><;;;<<>DKPPOOONKJJMMNPV\acdefhhjklnnnonmlka^[Z[\]][ZYWVVTT¤¥¥¥¦¦¦¦¦¦¦¦¥¦§§©¨¨¨§§§§©©©©©©©©©ªªª««««©©¨¨©©©©©©ª©¨©ª«¬«««ª©©©¨©ªªªªª«©ª««ªªªªªª¨¨©©ªªª©©©©©©ªªªªªªªªª©©©ªªªªªª©¨¨©««««««««««««««ªª««¬¬¬¬««««¬««««¬®¯®®®®¯¯¯¯®®¯¯®®®¯®®®®®®®®®¯¯®®®®®®¯¯¯¯°¯¯¯°±±±±±±²±°±´´³´µµ³±²±±±±²³²±³²±±±±±±²²²±°°±±³´µ´´µµ´²±±±±±±±³³³³³²²±±±±±±±²³´µ¶·¶¶¶¶´´µµµ´´´µ´³±±±±²²²²²³³³²³²±°¯®¯¯°¯¯¯¯°°±±±°°°±±±±¯®¯®¬®®¬«««ª§¥¤¢¡¢¤¥¨©¨§§§¥¥¥¥¥¥¢ rcWSVTPPPPPPPPQPPPNNMNNPOOOPPPONOOOOOOOPPOONOPPRVVXX_otzz|~|zzxwuuuvxz }{zzyxvuuuuuutuuvvxy{ }{zyxwvuuusrpooqrsstvxyyyyzzzxvtrppqqrqrrsvvvvuttuz}}|{zzzxwzyzzvsojgecbbaabcgkmnnnlniffghiklptwwtqonquxywtrkklnswyz{ytokhcabbehiknnnnnoopsuwwxxxwxxutrrqppqpomigdddefghilnqtrqnlkpw{{ywz||zzyxxyyvtrqononnnooqtvwusqponnnoqrttuvvvxy{{|||||{{{{{{zzyvtrpooonppqrstsrponoppppmieba^\\\\\\\\\\]\\_u¢¡¢¥§§¨««¬®®¯°¯°±±²²³³³³³³³³³³··········¸¸¹ºº»»»¼¼¼¼»»½¼»»»»»º»ººº¹¹¸¸··¶¶··¶µµ°®«®¯¨¥tl^\QPLHFEDEFHIJJJKMNPPPMKJKLKJMONOOKIIHHHIIJGHHJKLLLKGA>?ACCCCDDDDDDDDCBAACDEFGHIJJJIKNMJHIKIFJT^gqz}|zzzwrljfa[VRPPQQNIFGIIEDDEHHGEDEFEDDDDCCBA?>>?@ABCCCCCDDDBA@@AEFILOONLNLJJID@?>=:9:;=>CEILPRUVW[__[TLGC><<<9888:>?CGKNOMLMLJIJGJNRX_cdghhhijkkmnnnlihg]\YY[\]]ZYXWVVTS¤¥¥¦§§§§¦¦¦¦¦¦§©©©¨¨¨¨¨©«ªªªªªª««ªªªªª««ªª©©©ª©©©©ª©¨¨ª«¬«««ªªªª©©ªª©©ª«©ªªªª©ªª©©©©©©ªªªª©©©©ªªªªªª««««ªªªªªªªª©©¨¨©ª«««««««««««««ª«««¬¬¬¬«««¬¬¬¬¬¬¬®¯®®®®®®®¯¯¯¯®®¯¯¯®®®®¯°°®®¯°¯¯°¯®®¯±±±±±±±±±±³´³´µµ³²²±±±±³³²±²±±±±±±±±²±±°°±³³µµ´´µµ´²±±±±±±±³³³³³³²²±±±±±±²³³´¶··¶¶·¶µµµ´´´µ´´³²±±²³³²²²³³³³²²±°°¯®®¯°°°¯¯°°°°±±±±±±±±±¯¯¯®¬®®«««ª§¦¥¤£¡ £¥§©¨¨¨©¦§§¦¥¥£ {n^UVSQQPPOOPPPPPONNNNNPOOOOOONOOOPPPOOPPPPPPQSTWW\ahtv|{|~}{zzxvwxy{} }|zzzywvvwuuuuuvwxzz} ~}{zzzzzxwvutuuvwxz||||}~|zwutsrsttuvwyz~}|{{{ ~~{zzxxxtqnihgeedbbcdhmoppnmle__abeghnrtttplmpuzzxtphhimrwz{|zwsolgbbbdfhikmnmnnnnqttuuutttutrqrqpqsttrnifdeefghjmprttrnklotz }{z{|{zy{zzzyurqrppppopqqqqqqpnmnnoonoprttuuuvxz{|}~~~}}|||}}|{zwusqppooqqrstttspppppponkgba_]\\\\\\\\\\X]em¢££¦¨§©¬®¯¯¯°°°°°±±±²²±±±±±±±²µµ¶¶·¶¶¶···¸¹ºº»¼¼»»»»¼¼½½¼¼½½¼»»¼¼»»º¹¸¹····¸··¶°¯®®§¥¢tcaVQNJHGFFFGGHHIJKMNNLKJJJJKJMONNNKJJJIIIIJHHIJKKKJGD@>>@BCDDDDDDDDEEDDCCDEDEEEGHGDCCA>?EPYcjt~¥©ªª©¨¦ª©§¥¥¥¢~ysle^YZXSJFEFECBBDFGFEDEFEDDDDDDCB@???BBBCCDDDFFEDDDDEGHJLOOMLNLLNMJGHD?<<<<>@ACEILPQRTY]]YSJD?:6676679>CEILNNOLKKJIIJGNUX\bfghhhhiiiijkkjhfdcXVVVZ\\\[ZXVVVUT¤¥¦§¨©©©§§§¦¦¦§©©©©©©©ªª««ªªªª««««ªªªªªª«ª©©ªªª©©ªª¨§§©«««««««««ªªª©©©ª«ªªªª©©ªª§¨©©©©ª«ªª©¨¨©ªªªªª«««««ªªªªªª©©©¨¨©ªªª©«««««««««««««««¬¬«««¬¬¬¬««®®®®®®®®®¯¯®®¯¯¯¯®®¬¬®°±°®¬®®°°°°°¯®°±±±±±±±±±³´³´µ´³±²±±±±³³±±±±±±±²±±±±±±¯°±´³µµ´´µµ´³²±±²²³³³´´´´³³³±±²±±±²³²´¶·····¶¶µµ´´µµ´´³±±±²´²²±²²³²²²²±±±±°°°°±°¯¯°±¯°±±±±±²±±±°¯°¯®¯¯¬««ª©¨¦¥¤¢ £¥§¨¨¨¨©¨¨¨¦¥¥£¡~kYTSUQQPOOOPPPOONNOOOPOONOONMOOPPPPPOOPPPPQSUVZ[dmtzz~}|}~~~|{|zxyz|~ |{zzzxwvwxxwwwwyzz|} ~~}||{{zzzzz{~~{xutttttvxzz|~ yvvvspnjhhhgfddeeinpqqomjaYY\^`bfkooprnilpvzzwrnihhkpvz}{zxtrnhcbbcdeghjkkkkjkmpqqqpppqrqppqrqstuvvsmhfffghhknprttsnlmpst| }}~|zzzytqoqpqrrrsttronnmkjkmoqppqssttttuy{{|}~~}}~~~}{wvtrqpppqqrsttsrqqpqqpnniea`^\[[]]\[ZYYYT\l| £¥¥¨©©««¬®®®¯°°°°°±±²¯¯®®®¯°±´´µµ¶¶¶¶···¸¹ºº»¼¼»»»»¼¼½½½½½½½½¼¼½½¼»º¹º¹··¸¹¸·¸²±¯¯®§¦zfcWTPKIHGFGGGHHHJKMKJIIJJJJJJKMLLLJJJJJJIIIJJJJKJJHDB@>>?BDGGEDDEEFHHGEDDEFDDDCDDB>HPZbhpz¡¦¬¬§¦ª¬«ª«¬«¬¬¬««ª§§¥¥¦¥£¤§ztmhcbZPIFDC@?>ADFEDDEFEDDEDDEDCA@@@DDDDDDDDGGGFFGHJIIJKNNMKLJKOPNMOLEA@?=>@>?ADHKMORV\\WPHA>8323336>CHKOQQPPLJKJIIJRZ``_bgihhhhhhhgfghhecbaSQQTW[\\\[XVVVUU©¨¦¦§¨©©©©¨§§§¨©©©©©ªª««¬¬¬«««««ª«««ª©©©©ªª«««««¬«©¨§§¨©ªªªª«««««ª©©©ª«««««ªªªª««««««ªªªªªªªªªªª«¬¬««¬«¨ª©©©«««ª«ª««¬¬«««««ªª««««ªªª«¬¬¬¬¬¬¬««¬¬®¯¯±±¯®®°°®®¯®®®®°±±®®¯¯¯¯®®°±±°±°¯¯°±±±°°°¯¯¯°±±²³³²±±±²±±²²²±±±²³´³³±±²±±±±±²²³³³´´´´´³²±±±²²²³³²³³³³²´³²±±²³³³´¶·········¶´³´´³²²³´´´³²²²³³³²³±±±±°°±±±±±°¯°±±°°°±±±±±±±°°¯®®¬««©©ª¨¥¤¢¡¤¥¦¦¦©ª«¨ª«ª§¤£¢ thYOUSPPPNPQOPPPOOONNOPPPPOOONOOPPPOOQPPQQSVY]^ivyz~~~~}}}}|{{|} ~|zzxxyyyyyyyyyz{} ~{zxvuuuvy|{zzvsokkjjkjhhhhinrnjfbaYRQTW[^bfilljjjlotvwvsojfhiox{}{xuttojccbcdefghhihhimponmllmnoprttsrtuxyxvrnjhijjklnqttttqnmnptw~~}{{{zwroooqrrppqttronmkiikmquwvuuvvwwvwz}~}}~~{xvtrpppqpqrssssstutspnnmfb]\]\\\\\[XYVUVVg} ¢£¥¦§©«¬¬¬¬®®¯®®®°±¯°««¬«««®±°±´¶¶¶···¸¹ºº¹¸½¼»¼¼»¼½½½¾¾¾½½½½½½½¼»»¼»»º¹¸¸¹¹··´²±¯¬«¦£rbZVNMJGIHHFFEFHJKLKJJIIIJJJIHJKJJJKHFGHHHIIIIJJJJJHDA?>?ADGHGDDFGFGJKFFHEIHFJPRPU\nv«««ªª«¬¬ª«««««¬®¬«««««¬««¬®®§¤¢zrkgb[TPQI@CFFIIIGCEFBHHHGGEDDEFFFEDDEFFFGHIJJKKJJJJJJJMMNOOPPPMID?>??>??@DEFJPRVYYUJ@9:731128<>ELOPQQPPOOPPQV\fhjjihhiigghkihfcbba`_ZUQPOQSUX[]\YVVVVU§¦¥¥¦§¨¨©©¨¨§¨©«ªªªªª«««¬¬««««««ªª««ª©©©©ªª«««««««©¨§¨©©ªªª«««««ªª©©©ªª«ªªªªª«««ªªªªªªª©ªªªªªªªª«««««¬«ª««ªªªª©©ªªªª«««ª««««ªªª««ªªª«¬¬¬¬««««¬¬¬¬®¯¯°±±¯®®¯®¬¯¯®¯¯¯¯±²±¯®¯¯¯¯®®®®¯°°°¯°¯¯¯°°°°°°°¯¯¯°±°±²²²±±±±±±²²³²²²²³³³²±±±±±±±±²²³³³³´´´´³²±±±²²±´³³³³³³³³²²²²³³³´´¶·····¸···¶µµ·¶µ´³³´³³³³²³³³³²³²±²±±±±±±±±°°°±±°¯°±±±±°°°°°¯®®®®®¬««ªªª¨¦¤££¢¥¦¦§©ªªªª«ªª¨¦¥¢|rbUTSPPPOPPNPPPOOOOOOPPPOOOPNNOPPPPOPPPQQRVX\bnz||~~}}~ ~~}}~ ~}{zzzzzzzzzzz{|~ }|{yxxyz{~ }ytqnmkjkjhgghhmolhc][VQPPRUX\`ehhhhhjlnquvsnkgghoy||xtsrnjeedcccddgghhhikmnnlkklnopstttstuwxyxuronllmnoqstuutqonoqrtz ~}}|{ytpnnnpqpnoqttsqonlihilpuwwwxxyzzzz}~}||}~~~|xvtrpooopqrrsttttuuspnlkda]\]]\][]\WVUVXbs¢£¤¥¦§©««¬¬¬®®¯¯°°¬¬¯±¯¬««««ª««²µµµµ·¸¹º¹¹¹º¼»»¼¼¼¼½½½¾¾¾½½½½½½½¼»»¼»»ºº¹¹¹¹¸·¶´²±®¬«¦xdYSJJIHJGHEEDEFHJJIGEEFHHIIGGJKJJJHEDDEEEFFFEEFGHIGDB@>>>@@DFFFGHHJHGEJNMRPS[chnz ¥¨¬¯±±±¯¬¬««¯¯°°°°±±±°¯®®®®¯®®®®¯®¬«ª§©¬¬«¨£zurgd\ROMKJHFFDFIFJEEEFEDDDEEDDCCDEFFGHIJKLKKLMNNMMMNOPPPONMJECBAAA?>>BDEILRUXXTKA:852237<@EJNPPRSSUVXZYX]cijkljihgiijkkgca__]\ZWTPPOOPSUWZ\[XVVVVV§¦¦¦§©©ª¨¨¨¨¨©«««««««««««««««««ª©ªªªª©ªª©©©©ª««¬««ª©¨¨©ª©ªª««««««««ªªªªªªª©©ªªª«¨©ªªªª©©ªªªªªªªª«««««¬¬«««ªªªª©¨ªª©ªª«««««««ªªªª«ªªª«¬¬¬««««««¬¬¬®¯°±±±°¯®®¬¬¬¯°¯®¯¯¯¯±±±°®®¯¯°°¯¯¯¯°°¯®°¯¯°°±°¯°°°¯¯¯¯°¯°±²²±±±±±±±²³³³²³³²²²±±±±±±±²²²³³³³³´´´³²±±±²²²´³³³´´³³²²³³³³³³µµ¶···¸¸¹¸···¶¶··¶´´³´³³³³²²³³³²´²²²²±±±±±±±°°±±±°¯°°±±±°°°°°¯¯®¯¯®¬¬¬««ª¨¦¥¤¤ £¥§¨ªªªª©¨©ª©¨¦¤¡ zl\TSPPPOOOMOOOOPPPPOOPOOOPPNOOPPPPPOOPQQSVZblv|}}}}~ ~}|{{{{{{{|}}~ {|zxxz| |xtronmllihhihkmjgb[SRPPOPRVX[_bdeefhghkqusokfghnz}}wrponkhgfedcddiijlnooonnlklnoqqstutttuuwzzyvtsoooqstuuvutrqqqqoqtz}|{}}{wrnlnnoonnnprttttrnjghkotuvwzzz{|}~|||}~~~ywtrponnpqqrsttttuuspnkhb_]]^^^^\]ZVVVWZn¢¤¥¦§¨©««¬¬®®®®®®®«¨¥¨¦¥¥¥¥¥¤¨ª°²³´¶¶·¹º¸¸¹»»»»½½¼¼½½½¾¾¾½½½½½½½¼»»»»ºººº¹¹¸¹¸·¶´²°®ª¦¢naVJGGGHFHEDDDDDFGEDBBDFGGGFGIJJIICA@BDDDDEEEFGHIJIGDB@>>>?DGHFFFGHJLJIKP\X\dq«««««®°±°°¯®¯¯±±²²²²²²³²²±±±±±±±²²±±¯°¯±³±±±®¥¢yrjb[VSPOJJFDFDCFEFFFDDEDDB@@ACDEFFGIJKKLMNPPPPNMNPPPNLKJJGEDCCC@>>ADFIKPSVVRJB<74348=CGMNPSSSVXZ^ceb`cikkkkkigedefgea^\Z[ZWURPMNNOPSUXZ\ZWVUUUU§¦¦§¨©ªª§¨¨©©ª««««««««««««««ªªªª©ªªªª©©©¨¨§§¨ª«¬«««ª©©©©©ª««¬¬««««««««««««ªª©©©©¨©ªª«ªª©ªªªªªªªª«««««¬¬««ªªªªªªª««ªªª«««««««ªªªªªªªª««¬®¬«««««««¬¯¯°°°°°°®««¬®°°°¯¯¯¯¯°±±°®®®®®¯°°¯¯¯°°°¯¯°°°±±±°¯¯¯°¯¯®¯¯¯°±±±±°¯°¯¯°±²³³³³²²±±±±±±²²²²²±³³³³³³´´²±±±±²³²³³³³´´´³²²²³³³³³µ¶¶···¸¹¸¸¸¸·¶¶·µ´³³³´´³³²²²²³³²³²²²²±±±±±±±±±±±±°¯¯°°°°°°°°¯¯¯¯°°®¬¬¬¬««ª¨¦¥¥¥¡ ¡¥§©ª«ª©©¨¨¨¨§¦¥¢¡seXUQQRPPPMOOOOPPPPPPPONNOPOOPPPPOOOOPQRU[`mx||~}}} ~}}|||||||}~ ~{|zxy{}ytspnnnlkjihikjhc\QQPPOPRUXZ\_abccedcgmrrnifgflw||upnnmkjihhgfghijlnrtsoonnnnqttstuuttttuwyzzyvtrrrtuwvuvutttssroorw{~~|zzz{|zvqmlmnoonmmnosuwxvsmhiknqrsuxzz{}~}}~~ zxusqooopppqrstuuvuspmjga_]^_``_][WY[XY_y ¤¥¦¨©ª«««¬¬¬¬««¬«ª¦¤¦ª«±´·µ··¸··¹ººº»½½½¼½½½¾¾¾½½½½½½¼¼»»»»»º»»º¹¸¸¸··¶³±¯«¨¦¤zmdSKHFGFIFEDCBBCCCA@ADFGGGGHJJJHF?>?ACDDDEFHJJJJJJIFDA?>>CDFFEDEEDCD>>BMaow¢±±««©§¨«¬¬°²²±±±³³³²³³µ´´³³³³³µ´´³³³³³°¯±±°°±±®«ª«®«¢{qkhcZSTOIJJGDDCDCBBCBA@>>@BDDDEFHIJJMMNOPPONMNOONLJJHIIHFEDEA??ADEIMNPRSPIB>9768=BHKPPRVWW[``chjhdfiiiiiiheca_^^][YYVVVSQPNLLMOPSVXZ\ZWUTSRR¦¥¥¦§¨©¨¨¨©©©©ª««««««««««««ªªªªªªª«ª©©¨©©¨§§¨©«¬¬¬««ª©©©ªª«¬¬¬¬¬¬¬¬¬¬««««««ª©©©©¨©ª«««««««««««««¬«««««««««««ªªªª««ªªª««¬¬«««ªªª©ªªªª««¬¬¬««««««¬®®¯¯¯¯°°°¯®««¬®°°°°¯¯¯¯°°°±°¯®®®®¯¯¯¯°°°°°°°°°±±±°¯¯¯°°¯®®¯¯°±±±°®¯¯¯°±²³´³³²±±±±±±±²³³²²±³³³³³³³³²±±±²³³³³³²³³´´³³³²²²³´µµ¶¶¶··¸¹¸¸¹º¸¶µ¶µ´³³³´´³³²±±²²²²³²±±±±±±±±²±±±±±°°¯¯¯°°¯°¯¯¯¯¯¯¯°°®¬¬¬¬««©¨¦¥¥¥£¡¤¦¨ª«ª«««ª©¨¨¨¦¤¢ zn`ZUSTRQQPOOOPPPPPPPPONNOPPPPPPOOOOOPPRW`hu}~| }}}}}}}}}}~ ¡¡¢¡|~|{| ¢¡ |uspnnnmllkjkljie^USQPQSUV]\\]_abbcccdhmnnheeaeqzztnllllllkjiijklnruyzxtponpsuwxttuttttttuxzzzwvutuvxxwvvutttttrppruyz{|}}|zzyxxyzyuqnmmnooonlklqtxzyvpkijlnnortxz{| zywtrqppqpppqstuuutromifa`__```_^YX\[TYi¡¡ ¥¥§©ª««¬««±«¦¡}rqqtw}£¦ª®²µµµ¶·¸¹¹¹ºº»½½½¼½½½¾¾¾½½½½¼¼¼¼¼¼»»»º»»»¹¸¸¸¸¸·µ²±°«ª¡vs`UMHHFIFFECA@@ABABDFHHGIJJJJIGEAABBDDDDEFHJJJIIJIFCA???CCDEFEDDF>::EVgz¡§§©¬°ª«ªª«®°°°°°°±²²±²³´µµµ¶¶¶¶µµµµµµµµµµµµµµ²±±²°±²±¯°±®«©©ª¥zsi`[PFHHFFEDDDDDEAA?>>@CDDDEEFHIIKKKLMNNNMMMLLJJJHJJJJIIIDCBBBBGLMOPPNJD@?=<=?DILPPSZ\\`efhjkhffhfgggecba`\ZYYWUTRRPOONLIJKNPRVXZ\ZWVUTSR¦¦¦§¨¨¨¨§¨©©©©©ª«««««««««««ªªªªªª««ª©¨¨¨©©¨§¨ª«¬¬¬«««ª©©ª««¬¬¬««««««««««ªªªªªª¨©ª«««««««««««««¬«««¬«««¬¬¬««ªªªªªª©©ª««¬«««ªªªªªªªªª«««¬¬¬¬««««¬®®®®¯¯®¯¯°°¯¯®¬¬¯°°°°°¯¯°±°±±°°¯¯®®®®¯°°°°°°±°°¯°°°¯¯¯¯°°¯®®®¯¯°°°¯®¯¯¯±±³´´³²²²±±±±±²²³³³²²³³³³³³³³²±±±²³³³³²²²³´³³´³²²²³´µµµµ¶··¸¸¹¹ºº¹·¶··¶µ´´´³³²±±±±²²²²±±±±°°±±±²±±±±±°°¯¯¯¯¯®¯¯¯¯¯¯¯°°¯¯®¬¬««©¨§¦¥¥£¡£¥¦©ª©ª«««©¨¨©§¤£¡ zj^VSTSRRPOOPPPPPPPPPPOOOPPPPPPOOOPPPQTZenw{}} ~~~ ¡¢¢¡ ¡ ¡ xsommmmllnnnnjif`YWVVX\__cb__`bbbcdccdhiigb`Z^lv|wqnlkkknnnmllnntw{~}yqpqsvyzzvutttssrrtuwyzzyxxxxyxwwuuuvvutsrqrtvvwwyyyxwvvvuvvtpnnmnoponkiimrvyzxtnihhiklnrvyz{}~ }{yvtrqqqqqqrstttttpnkhd_`___`_^\[\]WP^v¢££¥¦¨©ªª««©«¬®¯±²¦}l^POJIOXdpx¥©®±±µµ¶·¹ºº¹ºº»½½½¼½½½½½½½½½½¼¼¼¼½¼¼¼»ºº»»º¸¹¹¹¸¸¶´²±««wg\PHFDDFFEDA@@ABCDFHIHGJJJJIIGEEFEDDDDDGFFFGHHIJIGDCCCBBBDGIGDC77>H[o¢¨¬«§¥¦©ª««¬°°¯±²²±±²²±´µ¶····¸········¶·¹º¹·¶µ·µµ´±±±°²²±±««««¨¦¢ zwlaQIJHGJIIJJJJJBBBAAACDDDDEEFGGGGHIJKLLKKJJJJJJGHJJJJJKJHHFDBFKNOPPNJFDEDBBCEJMQRV]abdhjjjihfddbbbb_]\\ZWUVVVSQQPPNMLJGIKMOQUXZ[ZXVVVVU¨¨¨¨©©¨§¦§¨¨¨¨©©ª««««««««««ªªªªª©ªªª©¨¨©©©¨¨¨ª«««««««««ªªª«««¬¬«««««¬¬««««ªªªª¨¨©©ª««¬«««««««««««¬¬«««¬¬¬««ªª«ªª«ªªª««««««ªªªªªª««ªª««««¬¬¬¬«««¬®®®¯°®°±±¯®®¯®®®¯¯°°°°¯¯°°¯°±°°°¯¯®®®¯°°°¯¯¯¯±°¯¯°°°¯¯°°°°¯®®®®®®¯¯®®®¯±±²³²²²²²²±±±²²²²³³³³³³³³³³³³³²±±±²²²²²±²³³³³³³³³³³³´´´µ¶····¹¸¸¹¸··¸··µ´´´³³³²±±±²²²²±±±±°°±±±±±±±±±°°¯®¯¯®®¯¯¯¯¯¯°°°¯¯¯®®¬«ª©¨¨§¦¥¤¢ ££¥¦¨¨¨¨©©©¨¨¨§¥¤¢tdZTTSSROPPPPPPPPOPPPPPPPPPPPPPPPPQRTV^itzz}~ ¡¡ ¡£¤£¢ ¡¢£¤¤¤¤¢ ztpnmnnmmpqspkihb]]\\afiihfdcdefedcbbbdeeb][V\jsyxtomljjknnoooprtw|zvtttwz|}|xvtsrrqqqqstwyzzyyyyxwvvvvwxwvttqppsttttuvvuttttttspooonnoonljihjotwzzwrmihhhilntvyz|~}}~~~ ~zxuttrrrrssttttqnkhda]^_^_`_]\\^_\\i¡¢¤¥¦¨©©©©ª©ª««¬¯±¥oT@6,+)+18BMVn¥¬°±²´·¸¹¹¹¹»º»½½¼¼½½½½½½½½¼½¼¼¼½½½¼½»ºº»»º¹¹¹¸¸··´³°¬©«zl`PEDBCDEDDA@ABCDFGGGGGIJJIIJIGHHGEDEEDGFFEFGIJIJIGFFEDCDFJKJIIDOao¥ª¨§©¬®¯¯®¯°¯¯±±±±²³³²³µµµ¶¶···¸¹·········¹¼½¼¹··²±´µ³´¶µµ²±²µ³¯¬®°©¦{na_aYVJJKMMJHGDDDDDCCCDDDDDDDDDDDFGHHGFFHIIIIIFGHIJKKLMLKKIFHKOPPPNKIGHHGGHJOTVW\acdfghhhfcb`_]\\ZYXVVSPOPPPPPPPPNMKJGJLOPQVZ\[ZXWVVVV§§§§¨¨§¦¥¦§¨¨¨©©ª««««¬¬«¬««ªªªªª©©ªª©©©©¨¨§§§¨ª«««««««««ªªª«««¬¬¬«««¬¬««ª©©¨¨¨¨©ª«¬«««««««««©ª¬«««««¬¬«««¬ª««««««¬««««ªªªªª«««ªªª«««¬¬¬¬««ª«¬®®¯°¯±±±¯®®¯¯¯¯¯¯¯°°¯®®¯¯®¯±°°¯¯¯¯®®¯°±°¯®®®±±°°°°°°¯°±±°¯®®¬¬®¯®®®°±±±±±±²²²±±±²²²²²³³³³³³³³³³³´³²±±±±±²±±²³³³³³³³´´³³³³´µ¶····¸····¶·¹¶µ´³³´´³³²±±±²²²²±±±±°°±±±±±±±°±°°¯®®¯®®¯¯®®¯¯°°¯°°°¯®««©©¨¨¦¥¥¤¢ ¢£££¥¦¦§¦§¨ª«ª©§¥¥¤zj^VVVUTPPPPPPOOONOPPPPPQPPPPPPPPRSVWZamv}z~}~~ ¡££¢£¤¥¤¢ ¡¢¢£££¢ ¡¢£¥¥££¤£¡}wsonoonnqturljjfccbbchjjkihhhihhdcb`abbb\XXV^korurnmlkjknnpqrtwz}{wvvwz}~yvtrqqqpqpprtvxxxyyxvutuvwxyxwutpooprrsttttsrqqqtsqnnoonnnnmkjihhntwz|zuolhghhikqtwxz~}}}~~~{yvusssssttttsplhfb^\]^^^`^\\]^bfku £¦§¨¨¨¨§¨©ª««ª«¬®{dM1"%&'+1546>IXl¨°±±³·¸¸¸¸¹»»»¼½¼¼½½½½½½½¼¼½¼¼¼½½½¼½¼ºº»»º¹¸¸···¶´²´¯«®¢rdPDDDDCDDCBABDDEFFEEFGGIIIIJJIHHGDDEFFDEEFGHHHGIIHGFECBDGKMOQTdm|¥¦ªª¨©«¬««°±±¯¯±²³²µ·¶µ¶·¸······¸¹·¸¸¸····¸¹»»º¹¹¹¶¶¸¸´³µ´·´³²±±²µ²µ°ª«ª¢sqm\UQQSUTPKIFGGFEDCBCCBBBAABCCDDDDCAACDFGGGFGGHJKLNNLKLMKIHJOOPOMKIHHIJKLPV\Y\_bdeeecdcb_\\[YWUTUUTRSPMKJJMPLNPNKJJIKOPQSW\]\ZXVVVUU¨¨§¦§©©¦¥¥¦§¨¨¨¨ªªª«««««¬«««««««ª©ª««««©ª«««ªªª««««««¬«««ª««¬¯°¬««««««ª©¨©ª«¬¬®¬«¬«ª««««¬¬¬¬¬««¬¬¬««««««««««««««««ª©ª««ªª©ª««¬¬¬¬««¬«¬®¯¯°±±±±±°¯®®®®®®¯±±±°°°°±°¯°°°°°°°°¯°°±±°°¯²±°¯°°°¯°°°¯®®¯¯¯°°°¯¯¯°¯®®°±±±²²²±±±±²²²²²²²²²³´´³³´´³´³±±°±±²²±±³³³³´´´³³´´´µ³³µ¶····¸·¶·¶¶·¸·¶µ´³³²²²²²²²³²²±²²±±±²³²±±±²±±±±°°¯®®¯®¯°±°¯°±±±±±°¯®««ª©©¨§¦¥¥£¡ ¡¢£¤¥¥¥¦¨ª««««ª§¥¤£ zo`WWVRPQPPOONNNPPQQPPPQQPPPQQSTSVW\diqy~~~}|} ¡¢£££¥¥¦¦¥¤££ £¤¥¦¥¤£¢¡ ¡¢££¥¥¥¥¥¥¤¢|vtusrttwwusqomihhgghjnorqponnmkgedb_\\^XVUW_hmmoonmllmnoqsttx~ ~zwvx{{yxutqpooonnpsuwwzyxwvuttyzzzzzxussrqppqrssrqnnoqrqpppponnnmkkjihjmqvzzywumfghhjmprtwz{}~}}~~~||zzywvutttsokhdb`^]\]__]\^W^_lz ¡¢¥¦§¨¨§¨¨©ª©«©¨¯«VG3+;AJJI<<8DSVYv¥®±±´···¸º»»»¼¼¼¼¼¼¼¼½½½½½½½½¼¼½½½¼½¼¼¼½½¼»»¹¸¸¸·¶´²²²®¥¡xkPOMHJGDCBBDDDDBADEFGIJJJKLLJJJIHHHHGFFEEFGHHGJHJHGGDGFJMLHMW]w¢¥¦¤©«¬¯¯¯¯¯±³´³³´µ´········¹¸···¹¹¹·¸¹¸····¹º»»¼¼»»¸¸¸¸¸·····µ´³´µµµ²¯®®«¨©¤sg_d]XWVPLKIGEDDCBCCCA>>ACAEDDDDDB@BCDDEFGHFDDGJMKIJJJKLMMMNNNMMLKKJLMNPV\`aaabdecaa]]]ZWVTUSPPQSSSPOLKKKKKJKJIGFGILPSUVY\\\[ZWVUTT§§¦¥§©¨¦¥¥¦§¨¨¨¨¨©ªª©©ª«¬¬««««««¬«ª«««««©ª««««««««««««¬¬««««¬¬¬®®®¬««««ªªªªª©©ª«««®®®¬«««¬¬¬¬««««««««««««««««««««ª©ªª««ªª©ª««««««««««¬®¯®¯±¯¯°°°°¯¯®®®®¯¯°±±±°°±±°¯°°°°°°°°°±±±°°¯¯±°¯¯¯°°°°°°¯®®®¯¯°°°°°¯°¯¯¯±±±±²±±±±±±±²²²²²±±±²³´³³³³²³³²±±±±±²±²³³²³´³³³²²³³³²²³´µ¶¶¶·······¸··¶µ´³³²±²²³²²²²±±²±±±²³³²²±²²±±±±±°¯®®®¯®®¯¯¯¯°±±±±±±¯®¬««ªª©¨§¦¥£¡ ¡¢£¤¤¥¦©««««««©¦¥£¡td[VUTSQPPPOONNOPPPPPPQPPQSSRSVX\_enruz}~~}|{} ¡£¤¥¥¥¦¦¥££¢ ¢¥¥¦§¦¥¤¤¢¡¡£¤¤¥¥¥¥¦¥¥¤ywxvuvvzzyvtspmmkhimrtvsrrrrpmjfcb`^[YYWVUW_gkknnmlklmnprtvx| |yvxz~~zyxvtrpononnortuvxxwwvuutz{{zzzxussrqpoopppponnnpqqqrssrqonmlkjihilpuyzywtlghiijmprtwz{}}}~~~ ~}}|{zzxwvusnjfca`]\[\\\[Z\Y`bq ¢¤¦¦§§§§¨©ª©«ª¨« iL2&675`hh\ILPVURLi £¬°±µ···¸¹ºº»»¼¼¼¼¼¼¼¼½½½½½½¼¼¼½½½¼½½¼¼½½¼»»º¹¹¹¸¶´³²³°©¥ |ta]WPKIGDCDDDDA@?BDEFIJJJKMMLKJIHHHGFEEEEFHHHGDEJHGHDEDFNRQVft §¦¥««¬¯°±±±±±³´´´µµµ¸····¸¸¸º¹¸¸¹¹¹¹ºº¹¸····¹¹ºººººº¹¹¸····¸¸¸····¶¶µ³±°°¯«¨©¨¥xfTNPSRQLJHHHGEDCCA>>>@@DCDDDDDCBBBCDDDDDDDFJKJIJJJKMNNMMNPPOMLLNPSTV[`cdcb`aa_\[XYZVTTRPOMMOPPPPOMLLKJJCB@>>@BCKPSVX[\\\[ZWVUUT§§¦¦§©¨§¥¦¦§¨¨©©¨ª«ª¨§¨ª««¬¬¬¬¬¬«««««««ªª«««««¬««««««¬¬®¬¬¬¬¬®°°¯®¬¬«««««ªªªªª©©ªªªª®®®®®®¬¬¬¬°®¬««¬¬¬««««««««««¬¬««ª©«««««ªª©ªª«««««««««®®®°®¯¯°°°°¯®¯¯°°±±°°±±°°±±°°°°°°±±±±°¯¯®°¯®®¯°°°°°°°¯®¯¯°°°°°°°¯¯¯±±²²±±±±±±±±³²²²±±±±²³´³³³²±²²³³²²±±²±±³³³³µ³³³²²²²²²²³³´µµ¶¶¶·¸¸·····¶µ´³³²±²³³²±±²±²²²²²³´´³²±²²²²±±±±°¯®®¯®°±±±±±±°¯®¬«««ª©¨§¥¤¢¡ ¡¢££¥¦¨ª«««««ª¨¥¥¢xph\TSQQQPPPOONNOPPPPQRQSVWXX[]ehjowzz}}}}~ ¡£¥¦¥¥¦¥¥¤£¢¡£¥¦¨§¨¨¦¥¥¤¢ ¢£¥¥¦¦¦¦¦¦¥¥ |z{yyzz||{zwuspqnmouz|{vuuvwtnheb`_\YVTUUUX`gjklllkklnosuxz} {ywz} }zzywusqononnnprttwwvvuuvv|}}|{zyvttsqonnnnnoonnnorrtuuutsponmmlkjiknrtutrqkhhjjlnqstwz{}}~~~}|{ywtqlhdb`_\[YXXXXWW[bbv ¡£¥¦§§§¨¨©ª¨©©¨¥uU4,/;8;tqkXGR\\SPB_¡«°²µ···¸¹¹ºº»»»»»»¼¼¼½½½½½¼¼¼¼½½½½½½½½½¼»º¼»ººº¹·µ´²³±«§¢|te\VRLKIFDDDDD@??ADEGIJJJKLLKKHGFFFEDDDDEGIIGEDCECCECDIEK[hq~£©¦£¥©«®¯±±±±²²²´µµµ¶··¹¸···¸¹¹º¹¹¹ºº¹¹ºº¹¸··¸¹ºº¹¹¹¹¹¹¹¹¸···¸¸¸¹¹¹¹¸·¶¶µ´³²±°¯«««©¥uaXZ\XTNJIJJJGECA?>;:;>@AAAA@AA@@@@AA?>BBCEHJJIHIJKMNNMMPPPOLLLQUXY\_bddb_\\\YVTQTURPPPKJJJLMNMONNMKIFDA?>>>ADFJOTWZ\\\[ZYWVVUU©¨§§¨©¨¨¦§§¨¨©ªªª«««ª©©ª«««¬¬¬¬¬¬««««ªªªªª««««¬««««««¬¬®¯±±°¯¬¬¬¬«««ªªªª©ªªªª®¯®®®®®°®¬««¬¬¬«««««««««¬¬¬¬««ª««¬¬««ªª««««««««¬««®®®¯°°°°°¯®®®¯¯°°±°°°±±±±±±°°°°°°±±±°°¯¯¯¯®®®¯¯¯¯¯°°°¯®®¯¯°°°°°¯¯¯¯°±±±±±±°°°°±²²²²±±±±±³´´³³²±²²³³³²±±±±±³´´´¶µ´´´³³³³³³³³´´µ¶¶¶¶·······¶µ´³³²±²´´²±±²²²³³³´´µµ³²±²²²²±±±±°¯®®®¬®¯±°°°°°°¯¯®¬¬««ªª©§¥¤¢¢¢¢ ¡¢£¤¤¥¥§©ª««««ª©§¥¤¡}}u_SSRRQQPPPOOOPPPPQRSVVX\_bfirttvz|~ £¥§¥¦¦¥¥¤£¢ ¢¤¥¦¨©¨©©¨§¦¥£¢¡ ¡¢¤¥¥§§¦¦¦¦¥¥}|}{|~}~}zxvtqsrsw|}{zyz{xpidb`^\WSQSTV[bhlllllklnoqwy{~}{zz}}zzyxvtqonnnnnoqstwwwvvvwx}~}|zxtttronmmnnopppqqttvxxvtsrqoonnnmlmnoppnlmihiklmostvxz|}~ ~}|zwtrojfb`^]\[XVUUVVW]dg|¡¢£¥¦§§¨¨©©ª¦¥¦¦ gK%3=46@eocPJV\XVM>\ ¢«±²µ···¸¹¹ººº»»»»»»¼¼¼½½½½¼¼¼½½½½½½½½½¼¼»º»»»»»º·¶µ³³±«§£uj\WVOKIFEDDDDA@@BDEGIJJJJJIIHEEDCCCDDEEEGHHECD@B?>>;>=<E\u¤¥¤¤¨«°±±±±±²³³´µ¶····º¸···¸¹º¹¹¹ºº¹¸¸¹¹¹¸¸¹ºº»»º¹¹¹¹º¸¸¹ººº¸·¸¹¹º¹¸·····¶µ³²²³±®ª¥¢~toi`YTPNMKJGEB@>=978;>>>=:9:;=>>>>=<;?@BDFHIJGGHIJKLLNPPOLJLOSW[\]_ab`_\YYXVSPMNPPPPNKJJKLMMLLMMLIEA>>>>>?BDGINTX[\\\ZYWVVVUUª©¨¨¨¨¨§¨¨¨¨©©ª«¬««««««©©ª«««««¬¬««««©©ªªªª«««¬««««¬¬¬¬¯°°°°¯®®¬¬¬««««ª©©ªªªª««¯¯¯¬®®®®®®««««««¬¬«««««««¬¬¬««¬¬¬««««««¬¬¬¬¬¬¬¬®®®®¯±±°°¯¯®®®®¯¯°°°°°±±±±±°°°¯°°°±±±°°°¯¯¯®®®¯¯¯®¯¯¯¯¯®®®¯¯°°°°°°°°°°°±±±±°°°°±±±±±±²²²²³´´´´³±³³³³²²²±±±±²³³³´µ´´´´³³³³³³³³´µµ·¶¶··µµ¶¶¶µµ´³²²±²³³²±±²²²²³´´´´µ³²±²²²²±±±°¯®¬¬¬®°¯¯¯¯°¯¯®¬¬«««ª©¨¦¥££££¡¡¡¢¢£¤¥¥¥§©ªª«ªªª©¨¦¥£¡ycXXVSSRQQPPPPPPQQSVWXX[bhmopx{{z|} £¥§¦¦¦¥¥¥¤£ ¡¢¤¥¦¨©«ª«ª©¨§¥¤££¢¢£¥¦¦§§¦¦¦¥¥¤ ~}~}{yvtsuvy|}{||yqkcb`]YURSTVZ^djmnmmlllnpsz{}}|{{{}|zywvtrponnnnoqtuyyyxwwxy}~|zvvtspnnmnoqrsstttvyzzxutsrqpppononnnnmkhhfgiklnqtuwy{}~ }{zzwtpomheb_]\\[XUSSTUX_jp¡£¤¥¦§¨¨¨©©¨¥¥¦¦z[>+676;7HVM?=@=8<?=a ¥¯±±´¶¶·¹º¹ºº»»»»»»»»»¼¼½½½¼¼¼½½½½½½½½½¼»»»ººº»¼»¸·¶µµ±«§¥ztc\WLJIFEEDDDCBAACDFFIIHHGFFFDDBA@ACDFFGGGEDB@>CB;66AYblz ¤¦§©¬¯°±±±±±±²³µµ¶··¸¸¹º¹¸·¸¹ºº¹ºº»ºº¹¹¸¹¹º»»ºº»»º¹¹¹¹º¹¹º»¼»¹¸¹¹¹¹¸···¸¹¸·¶µ´´³³²±¯«§¤¢vkbZVSOJGFGC@>>:67:<<;964469<>=;99:=>@BDFHJGGFGHJKKMNNKJJOSVZ]^]^__\\ZXXXVSPKJLNPPNNNNNNNMLKKKJFB=:=?BCBBEHIOUY[\[ZWVVUUUUTª¨¨¨¨§§§©©¨¨¨©ª«¬«ª«¬¬«©©ª«««««¬¬¬¬¬«ªª«©ªª««««¬«««¬¬¬¬¬¬®®®¯¯®®®¯¬««««ªªª©©©©©ª«¬®¯°¯®®®«««¬¬¬¬¬¬«««¬¬¬¬¬¬«««¬¬¬¬¬¬®®®®¯¯¯°°°°°°®®®®®¯¯°°°¯°±±±±°°¯¯¯¯¯°°°±±±°¯¯®®®®®¯®®¯¯®¯¯¯®¯¯¯°°°°°±±±±±°±±±±±±±±±±±±±±±²²²²³´´´´³²³³³²²²²²³²²²²±±²³³³³³³³³²²²³³³´´·¶¶¶¶µ´µµµµµ´³³²±²³²±±±²±±±²³³³³´³²²²³²²±±±°¯®¬¬¬¬¯®®¯®®®¬¬«««ª©¨¦¥¤¤¤¤¢¢¢¢¢£¤¥¦§¨©ªªªª©©¨¨¦¥¤¢|pg_VUTSRQQQQPQRSVY]`bbdlsvvuy~~ £¥¦¥¥¥¥¥¥¥¤¡ £¤¥¦¨©«««««©¨¨§¥¤£££¥¥¦¦§§¦¦¦¥¤¢{xvutyz|~}}{wqlba^[VSSUW[_bglnonnnmmnqsz{}~|{{{|~}|yxvutrqpnnnnortvzzzzzyzz~~|xxvtqooopqrttuuuvxz{zyxwtsrrqqpponmllkihdegikmorvwxz|~ ~zwuutpnmjhdb_]\\[XURRTUW]n{¢¤¤¥¦§¨¨¨¨¨¦¥¥§¥pQ..711715AB:62/(,3Bk£ª°°±³µ¶·¹º¹ºº»»»»»»»»»»¼¼¼¼½¼½½½½½½¼½½½¼¼»¼»ºº»¼»¹··¶¶²«©¦¢zvc\WJKJHFFFEDCCBABDDDFFFEDDEEDDB@@BDEGGHGFDDCCAD@88DYhu~¥¦¥¢¦«««¬¯±±±±±±±²³¶µ¶·¸¸¹¹º¹¹¹¹ºººº»¼¼»»º»ºº»»¼»¹¸ººº¹¹¹¹º¼»ºº»»»»»ºº¹¸¸¸¸¹¹¹¹··¶µ´´³²±®«¨¨¥xjYVQLGDEGEDA><99;9:9853458:=<878:;<>?ACEGGFEFHJJKKLLJJKQVX[]]\\]][ZXWWWUQOJIKNPPOOPPPOMKJJJJHD?<9=BGIGFIKKPVYZZYWVUTSTUUT©¨¨¨¨§§©ª©¨¨¨¨©ª««««¬¬«ª««««ªª«¬¬¬¬«ªª«©ªª«ªª«««««¬®®¬¬¬¬®®®¯®®®¬¬«ªªªª«©©©¨¨©«¬®®¯®®¬¬¬®®®¬¬¬¬¬¬¬¬¬¬«¬¬¬®®®®¯¯¯¯°°±±±°¯®®¯°±°°°±±°°°°¯®®¯¯¯°±±±±°®®¬®¯®®¯®®®¯¯®°°°°°°°°±±±±±°±±²±±±±±±±±±±±±±²²±³³³³´´³³³³³³²²²²±±²²±±²²²³³³´³³²³³³´´´´¶µ¶··µ´µµµµµµ´´³²²±±±±²²²²²²³´³²´´³³³³³²²±±°¯®««««««¬¬®®¬¬¬««ª©¨§¥¥¤¤¤£¢¢¢£¤¥¥§¨¨©©©©©¨©¨¨¦¥£¢ ¡{tfXVVTRQRSSSTUX\cinrpquz{{zz ¡¡¡¡¡£¤¥¥¥¥¥¥¥¥¤¢¡ ¤¥¦¨©««¬¬«ª©©¨§¥¤¤¤¥¦¦¦§§§§¦¥£¡~{xutttz{}~zvqnc`\XVUVXY]bfjnrsrqpnnortxz{|||}}}}}|{|}~}|{xwutsrrqpppoprtvz{||{zz{}zywtrqqrsttuvwxxz{||{zyyuttttssrqonllkjifgilnnqtwxyz|~ {wsqrqnljhda_]\\[ZWTQQSUV[q¡¤¤¥¥¦§§§§§¥¥¥¥¢jN'+51)+-.295510)+;T|§«¯±²´µ¶·¹¹¸ºº»»»ºººº»»»»»»»¼¼¼½½½½¼»¼½½¼¼¼½½¼»»»º¸··µµ²®«¨£}wc]\POLJIIIHGDDCBBDDDDDDDBBCDBBBAABDEFGHGEDFGIED>?Ocw¡©¥£¨¨ª¬¯°°°±²³³³³´µ¶µ¶·¹¸¸¹ºº¹ºº»ººº»¼¼»»»¼¼»»»¼»º¹ºººº»»»º½»º¹»¼¼¼»»º¹¹¹¹¹¹¹¹¹¹¸··º¸¶³±°®®««¦ yeaYRLHGHHGD@><<:899876668:<;888::;;<>>ABDDDFHIJJJJKKJLORTVXVVVWXXVTRRRPMJGHLMPPOOPPPNKJHGGGEB><;:@FJIIJLOSWYYYWVUTRRTUUT©¨¨©©¨©«ª©¨§§¨©©ª««¬¬««««¬¬«ªª«¬¬¬¬«ªª«©©ª«ªª©ª«««¬®®®¯®¬«¬®¯°°¯®®««ªª««ªª©§§¨«¬¬¬««ª««¬¬¬¬««««¬¬¬¬¬¬«®®®®®¬®®®¯¯¯°°±±±±±°®®¯°±±°°°°¯®°¯¯®®®¯¯°±±±±°®¬«««¬®¯¯®¯®®¯¯¯°±±±±±°°¯°±±°°±±²²²±±±±²±±±±±±±±±²³²²´´³²³³³³³²²±°±±²±²³±²³³´´´´³´´µµµ´´´´¶··¶µ´µµµµµµ´´²²±±±±²²³³³³´µ´³µ´´´´´³²³²±±°¯®®««ªªª«¬««¬¬¬¬««ª¨¨§¦¥¥¤¤¤£££¤¤¥¥§¨¨¨¨¨¨§¨©©¨¦¤¢¡¡¡ |vkbWVTRQRSTVVX\bkty~{zzz|}~ ¡¢£¢ ¡£¤¤¥¤¤¤¥¥¤¤¢¡ ¡ ¢¥¥§©ª«®¬ª©©©¨¥¤¤¥¥¦¦¦§§§¨§¥¢ ~zzxtrrstxz}{vqne`ZVVVXZX]bhlquwttsqpqtuwyzzzyzz{{|||}}{zwvttrrrrrqqpprtvyz}}|{{|}zzxusrstuuuvxyzz~~~|zzywvuuuuttutqonnmlhjmooqtwwxyz|~ |ytonnonkheb^\\\\ZYWTPPRUV[t¡££¤¥¦§¦¦¦¦¥¥¤¢hN+/,+,(&+*-)/-+ $Lhª«®±²´µ¶·¸¹¸ºººººº¹¹ººº»»»»»¼¼¼½½½¼»»¼½½¼¼½½½½¼»»º¸·µ³³²°ª£~xe_\QQPMKKJJIFGEDDFGFDDCA@??@@AABBBDDEGHGEEHKJEDCPj{ ¢¥¥ª§©«®®°±³´´µµµµ¶·µ¶·¹¸¸¹ºººº»»»ºº»»»ºº»¼¼»ºº»¼¼»ºº»¼¼¼¼¼¼»º»¼½»º»»ºº¹¹¸¸¹¹¹¹º¹¸···¶µµ´³²±²¯ª¨§wmbYQLJJJF@>><9999887779:;:888::99:;<>>ABDEHIIHIJLLKJKLNPPONOQRTROLLMKIEDIMMNPPOOPOMJHGDDDB?><<=BHLNNOPQUXYYXVVUSRRTUUT¨¨¨¨¨¨©ª«ª¨©ª«ª¨©¨©ª««««««««««¬«¬¬¬«ª©ªªª©©©ªª«¬¯®¬¬¬®®®®¯®®®¬«««¬¬«ª©©ª««¬¬«¬®®®®¯¯®«¬««¬®®®®®®¯¯®¬®¯¯®¬¬®¯®¯¯¯®®®®¯¯®®®®®¯°±±±±²°°¯¯®®¯¯±±°°¯¯¯¯¯¯°°°¯¯®°±±²²±°®®®®®¯¯®®®®®¯°¯¯°±±±°°°±±±¯¯®¯°°²³´´³²²²±±±±±±±±²²²³´´³³²³³´³³±±±±±±±±²²±±±±±±²²²³³³³³´´´´µµµ´´´³´µµ´´µµ³±°±²³²±²²²³³³´´¶µµµ´³²²´³³²±°®®¬««¬¬¬«¬¬¬««««¬¬¬¬«««©©§¦¥¥¤¤¥¤££¤¤¥¥¦§§§§¦¥¥¦¦¦¥¥¥¥¥£¢ |qhbYTUVSUX\_dhkqy~~~~~ ¡¢¡ ¢£¤¤£¢¢£££¢¢¢¡ ¡¢¤¥§¨©««¬«©§¦¦¥¥¥¥¥¦§§§¦¦¦¥£ }{zwuspoptv||vpmhb\ZYX[_abfjotuuuuutrsuwxz{{z{||{{{}||}~~}{zvuttttsrssrstttuxz}~~~~ ~{xvwxxwyzz{{|}~~}|{zzyyxwvvvutsqponmnpsstwzzzz{}~ ~}zysoonnlgca^\\\ZYXWUSRRQQ^ax¡££¢¥¥¥¥¦¦¥¥¥£¢¤hN0//-)%%()')-+0^w¢ª¬¯²´µµ¶··¸¹¸¹¹¹¸¸¸¹»»ºººº»»º»¼¼¼»¼¼¼¼¼¼¼¼½½¼¼»»»º¸··³²±¯©¢veaXTQPPPPOLIJJJJIIIGFHFCACCACBABCDDCDEDEGGHLJJRSjt¢££¤¦§«««¬®°±±³³´´´µ¶·¶····¸¸¸ºººººººº¼º¹ºººº¼¼¼»»»»»»¹»½½¼»»¼¼¼¼¼»º»»ººº¹¹¹¹¹º¹¸¸¹º¹·¸···µ´²±²°¬ªª©¥ xrh`SSLDB>D>@><::::;;<<======::::::::>?BDEFGHJIGGIJLMKJJJHECA@BDHJJJJFHJLLLMNQNOPKHFCDBA?>;;<?CHMPPPQUVXYYYWVVTRSUTSS¨©©©©©ª««ª©ªª«ª©ª©©ª«ª««©©©ªª«««¬¬®¬««ªªª©©©©©ª«¬¬¬¬¬¬¬¬¬®®®®¯®¬«««¬¬««©©©ªªª¬¬¬®¯¯®®®®®®¬¬¬«¬®®¬®®®®¯¯®¬¯¯¯®®®®¯¯®¬®®®¯±±±±±±°°¯¯¯¯¯¯°°¯¯®®®®¯°°°°¯¯¯¯°±²²±°¯®®®®¯¯®®®®¯°°¯¯¯°°°°°±±±°¯®®¯¯°²²³³³²²²±±±±±±±±³²²³´´³³²³³³³²²±±±²²²²²²±±±±±±±±²²²²³³³³³´´µµµ´´³´µ´´´µµ´³±±²³²±²²²²³³³³µµµµ´´³³³³²±±¯®¬«««««««¬¬¬¬««¬¬¬¬¬««ª©¨§¦¥¥¥¤¥£££££¥¦§§§§§¦¥¥¥¥¥¥¦¦¦¦£¢ vne\VVVTW]intwz} ¡¡ ¡¢£¢¢¢££¢¢¡ ¡¢£¤¦§©««¬¬«©§¦¦§¦¦¦¦¦¦§¦¦¥¥¤¡~|zyyvtrqoosw|xspfa\[[[]adehmruwxvvutstuwz{|||~~~}||}}|~}|{xvuttttsttttuvwwy{~ |yxxyzzyzz{|}~}}||zzyyyyyyyywvttrrrrsuwwxyz{{|~ ~||~{yytqpnmjea_]\\\[YWVUSSSTTci~ ¢¤¤¤¦¦¦¦¥¥¤¤¤¢¡¡iO221-*(&%#+#& >Uk¥ª¬¯²¶¶¶··¸¸¸¸¹¹¹¸¸¹¹»ººººº»»¹ºººººº»»»»»»¼¼¼»»ººº¹··¶³²±¯ª¤yhbWRPONNNMJHJKKJJJJJIIGDDDDBCCBCDDDDEEDEGJLNOVbby £¤¦©ª««¬¯°±±³³´´´µ¶·····¸¸¸¹ºººººººº»ºº¼¼»»¼¼»»ºººººº»½½»»»¼»¼¼»ºººº¹¹¹¸¸¸¹¹¹¸··¹¹¹·¸¸¸·¶´³²±°®¬¬«©¥¢~of[PG@;:?>ABA?>>>>===>>???><<;:::::>>@BBCDDEEDEGIJJJIFDCBA@?@BEHIIHGHJJKLLMKHIJGEECBA?>=;<=AEKPRSUVVXYXXYXVVTTUUTTU§¨©©©©©ªªªªªªªªªª©©««ªª«ªª©ª«««««¬®¬«ªªª©©©©ªª««««¬¬¬««¬¬¬¬¬®®¬¬¬«««««ªªªªª©¬¬¬¯¯°¯¯¯®®®®®®¬¬«¬¬®®®®¯¯®®¬¯¯¯¯®®®®®¯¯¯®¬¬¬¬¬¬¬¬®¯±±±±±±°°¯¯¯¯¯°°°¯¯¯¯¯¯°°¯¯¯¯¯¯¯°±±±±±±¯®®®®®®®®¯°°°¯¯¯°°°°±±°°¯®®¯¯°±±²³²²²²±±±±±±±±´³²³³´´³³³³²²²²²³³³³²²²²±±±±±±±±±±±²²²²²²³´µµµ´³³´µ´´´´µµµ´³³²²²²²²²²²²²´µµµµµ´´³³²±±¯®¬¬¬«««««¬¬¬¬««¬¬«ªª¨¨§¦¥¥¥¥££££¢¢¥¦§§§§§¦¦¥¥¥¥¦§§§§¤£¡zsh`YWWY`huy} ¡¡¡¢¢££¢¡ ¡£¤¦§¨ª«¬¬¬«©§§§¨§§¦¦¦¦¦¥¥¥¤¢}zxwwvtrqonsx|wroda^]^^achhkotwyzxxwuttvxz{{{}~~~~}|zywuuttttuuvxyzz{}~{zz{}}~~~~~~~}}{{{zz{{|||{zywvuvuvy{|zz{||~ ~|{z{}{yzutrnkhc^]\\\\\[VVTRQQRSit ¢¤¥¥¦¦¦¥¥¤£¢£¢ nR1/+((*&"$%+Ui¥©ª¬°³¶¶····¸¸¸¸¹¹¹¹¹º»ººº»»»»¹ºº¹¹¹º»»ºººº»»»º¹¹¹¹¸··´²²±®«¦}ncXPPNLKLLJIKLKJJKLKJIGDEFDACCCCDEEEDDEFGLOKVanp £¥¦¨©©«¬®¯±±²³³´´´µ¶·····¸¸¹¹¹¹ººººº¹¹¹º¼¼»»»»»»ºººººº»¼¼»ºº»º»»ºº¹¹º¸¸¸··¸¸¸····¸¸¸··¸¸·¶´³³±±±°¯®«ª§¢{ph[PLEFFDEEDDCB@>>==>?ABAA@?><;;<<>>?@@@@A@@@BDEFGHFC@?>=<==>BEGFEEEEFGIIIFBCDBCDDA?>><;<>DIOSUVWXWXXWVWWVTTUUUTTV¨©ªª©¨¨¨©ª«ª©©ªª«ªª««ªª«««««««««««¬¬¬««ªªªªª««««««««¬¬««««¬¬¬¬¬¬¬¬¬«««««««««ª¬®¯°°°°¯¯®®®®®¬««¯®®®¯¯¯®®®¯¯®®®®®®®®°°°¯®®¬¬¬¬¬®°±±±±±°°°°°°°°°°°¯¯¯°°°°¯¯¯¯¯°¯°°°±±±±¯®®®®®®®®¯°°°¯°°±°°°°±°¯®®®®¯¯°±²²²±±²±±±±±±±±´´³²³³´³³³²²±²²²´³³³³²²²²±±±±±±±±±±²²²²²²³´µµ´³²´´µ´´´´µµµµ´³²³³³³³³³³²²´´´µµµµµ³³²±±°¯®¬¬«««¬«¬¬««¬¬«««©¨¨§¦¥¥¥£¢¢¢¢¢¤§¨¨§§§¦¦¦¦¦§§§§§¦¥¤¢ ~wlc[Y\blv{|~~ ¡¢£¢¡ ¡ ¡££¦§©««¬¬««ª©¨§§§§§¦¦¥¥¥¥¥¤¢ |ywwwwtrrpnsz{uokdbabbbdgiknqtxzzzyxvuuwxzzzz}~|zywvvuuuvxyz{|}~ }}~~}}}~~~}{zyxywx{~~~}}}~ |{zzz|~{zwvsmhfb^]\\]]\[XVTQPPPRl{ ¡£¤¤¥¥¥¥¥¤¤£¢£sX81)')+(%&5Qh{¤¬««®±³µµµ¶·····¸¹¹¹¹¹ººººº»»»»»»º¹¹¹º¼ºººººººº¹¹¹¹¸¸··´³³±®¬§qdXPOLJJJKKJKLKJIJJJHHFDDEDACCCDDDEEDEHJKPPIbkz¡¤¥¦§©ª©¨¬®¯°±²²³³´µµµ¶·····¸¸¸¹¹¹ºººº¹¹¸¸¹ººººº¼»»»ººººº»¼¼»ººººººº¹¹¹º······¸¸··¶····¶····µ´³´²²²±°¯¬ª¦¢ ¡}wm^WJLIFDFEDDCA>====?BDCBDB@>=<<=>>>>??@@>>>@BDFGFDB@><8799<@DFEDCA@@BCCCA>>?>?BBB@>><;<>EINRUVVVWWWVVVVUSTTTSRRS««««ª©©©¨©ªª©¨©ª««ª««ªª«ª«««©¨©ª«««¬¬¬««ªª««««««««««««¬«««¬¬¬¬¬¬¬¬«¬¬¬«««««¬¬¬«ª¬®¯¯°°°°°¯¯®®®®®««¬¯¯®®¯¯¯®®®®®®®®®®¯¯®®¯¯¯¯®®®®¬®¬¬¬¬¯°±±±±¯°°°°°°°°°¯¯¯°°°°°¯¯¯¯¯°°°°°°°°°¯¯®®®®®®®¯°±°°±±±±°°°°¯¯®®®®¯¯°±±²±±±±±±±±±±²²´³²²³³³³³³²±±±²²³³³³²²²²²²±±±±±°±±±²²²²²²³´´´³²±´´´´´³´´³´µµ³³³´µ´´´³³³³³´´µµµµµ´³³±±°¯¯®®®««¬«¬¬««¬¬¬¬¬¬«««ª©¨§¥¥¤¤£¢¢¢¢¤¦§§§§§§§§§§¨¨§§§§¥¤¢¡}ukb_bjt}~}}}}~ ¡¢¢¡ ¡ ¡£¤§¨©«««««««ª©¨§§§§§§¦¦¦¥¥¤£¢¡ {xvvwwtrqoot|~{wrlhdcdeffghlnqtvyz{{zywvvxyzzz{~~|zyxxwwwyz|}~ ~|{zzzz|}~ }{zyyzz|}zwvrjfc`]\\\\\[ZWVSRQQTVm ¡¢£££¤¤¥¥¤¤£¡¢zbK<.+,(&(6HXo¤«®«±±³´´µ¶···¸·¸¸¹¸¸¹ºº¹¹º»»»º»»º¹¹¹º»ºººº¹¹¹¹¹¹¹¹¸¸··µ³³²®«¦qbWNKJIIJJKKKKJHGGGFEEEDCBBACDDDDDDEFIKNQVVQgt§¤¥¦©«¬¬«®¯°±±²²³³´µµµ¶·······¸¸¸¹¹ººº¹¹¹¹¹¸¹º»»»»ººº¹¹¹º»»»ºººººººº¹¹ºº······¸¸·····¶¶µ¶···¶µ´µ´³²±±±®«¨¤¥¨¥l\JJGFFGFEDDA>=>==?BDDCDDA?=<;;:;;=>>??>>>?ADFIIFDA><8678;>CDCA@>==>??>=9:=<>@@CA?><:;=DGKPSVVTVWWVVUTRUTSSRRQP««««ª¨¨¨¨©ª©©¨©ª«ªª«««««ª««ª§¦¨«««¬¬¬¬¬¬«««««¬¬¬««««««««««¬¬¬¬®¬««««««¬¬¬¬««««¬¬««ª¬®¯¯¯¯¯°°¯¯®®®««¬®°¯®®¯¯¯¯¯®¯®®¯¯®®®®®¬®®¬®¯°°±±¯°°°°°¯¯¯¯¯¯¯¯°°°°¯¯¯¯¯¯°°°¯¯¯¯°°¯®®®®®®®®®¯°±±°±±±±°°°°¯¯®®®¯¯¯°±±±±±±±±±±±±²²²³³²²³³³³³³²²±±²²²²²±±±±±²²²±±±±°±±±±²²±±²²²³³²±±´´´´³³³´²³´´´³´µµµµ´´³³³³´´µµµµµ´´³±±°°°°¯®¬¬¬«¬¬¬¬««««¬¬¬«««ª¨¦¥¥¥£¢¢¢¢¤¥¦§§¨¨¨¨§§§¨¨¨¨¨§¦¥£¡ ulilpw|~~}}|||zz{|~ ¡££§¨©ª««««ª©¨§§§¦¦§§§¦¦¥¥¥£¢ }zxwwwwtpnnpv{}|ztqnkhhefghhhijoqtwzz|||{zxwxyz{|}} ~|{zzzzz{} }|||}~~~ }zyxwwwwxz}~xutphba]]\[ZZZYWSQPPQSW\n ¡¡¢£¤¤¤¤¤£¢¡ oWD410)(.;BPhy «¯®¬°±±³´´µ¶··¸¸·¸¸¸¸¸¸¹¹¹¸¹»»»ºººº¹¸¸¹ºººº¹¹¹¸¸¸¸¸¸····µ³³±®ª¥{paWNJJIIIJJJJJJHFFDDDDDCAAABDDEEEEEEFKLNV\^am ¢¥¥¦ª«¬¬¬®¯¯±±±²²²³µµµµ¶·¶¶······¸¸¹¹¹¹¹ºººº¹¹»¼¼ººº¹¹¸¸·ººººººººººººº¹ºº········¸···¶¶µ´µ¶¶··¶¶µµ´³²³³±¨ª««¤ziXROKJJJIGEDA@?>>?BDDDDCA?=;986789<=>=<<<<>@DFJHDA?>;988:=>>>==<;<>>>=;89<=>AAB@?>=;<=AEJNRVVTVWWVVUSQUUSRRSRQªªª©¨§§¨©©©©©©ªªª©©««ª«««««©§§ª«««¬¬¬¬¬«««««««««ªª««ª««««««««««¬««««««««¬¬¬¬¬¬«¬¬¬««¬®¯®®®®°°°¯¯®¬®««¬®®°¯¯¯¯°¯¯¯®®®®®¯®®¯°®®®®®¬¬¬®®®®®®®®¯¯°±¯°°°°¯¯®®®®®¯¯°°¯°°°°¯¯¯®¯¯¯¯°°°°¯®®¯¯¯®®®®¯°±±°±±±±°°°°¯¯®®¯¯¯¯°±±±±±±±°±±±±²²²²²²²³³³²³²²²²±±±±±±±±±°°±±±±±±°°°°±±±±±±±±±±±²²²´´´´³³³´³³´´´´´´µµ´´´³³³³´´´µµ´´´³²±±°°°±°®¬¬¬¬¬¬¬¬«««¬¬¬¬««©¨¦¦§¤¡¡¢¢£¤¥¦§©©©¨¨¨¨¨¨¨§§¦¦¥£¡ }wttux{||~~~|{zzzzyyzz}~}}}}~ ¡¢£¦§¨©ªªªª©§¦¥¦¦¦¥¦¦¦¥¥¥¤£¡ |zyyxwvtnjkqwz|{z{||zxtpjgeeffhhjkklmnqtwz||}}|{zxxyzz{} ~}}|{|~ ~}~~ {zxvvvutstvz|~}|wtsngb`]\[YXXXWVRPOPQSY_p ¡¢£¤¤¤¤£¢¡ ~gWJIGCDJYbk~¨«¯¯®¯±±±³´´µ¶···¸··¸¸··¸¸¹¸¸¹»»º¹¹¹¹¹¸¸¸¹¹¹¹¹¸¸······¶¶¶·´±±±®¬©¢zpaYPNNMLLKJJIJJHGGFDDDCBBBBCCDEEEEEFEMMO[`cn|¢£¢¦¦¨««««¬®¯°±±²²²²³µµµ¶¶·¶¶······¹¸¸¸¸¹ºº¹»»¹º»»ººººº¹¹¸·º¹¹¹ºººº¹ººº¹¹ºº········¶¶µµ´³³³´´´µ··¶µ¶¶µ³³³²±±«®¬«ª{naZONONKIGEDCA@??ACDEDCCA>;864578;<<;9:;;<>ACIFDBBA?=;;:98777889<>>><;89;;=??>>>>>==>AGLOQTVTVVWVVUSQRSSRRTUUªªª©¨¨©ª©©©©ªªªª©¨¨ª«ª«««ª©§§¨ª««««¬¬¬¬¬¬¬¬¬««ªªª©©««©©ª««¬««ªª«¬««««««««««¬¬¬¬¬¬«¬®¯®®¯°°°¯®¬«®««¬®¯°¯¯¯¯°°¯¯®®¯¯¯¯®®®°°®¯¯¯®¬¬¬¬®®®®®¯®¯¯®®®¯±¯°°°¯¯®®¯¯¯¯°°±±¯¯°°°¯¯®®®¯°°°°°¯®®¯¯¯¯®®®¯°±±°±±±±°°°°¯¯¯¯¯¯¯°°±±²±±±±°±±±±²²³±±±²³³³²²²²²²±±±°°°°°°°°±±±±±±°°¯°±±±±±±°°±±±²³³´´´´³³³´´´´´´´´³´´´´³³³³´´´´´´´´´³²±±°°¯±°®¬¬¬¬¬¬¬¬¬«««¬¬¬¬¬««ª©¨§¨¥¡¡¢£££¥¥§©ª©©¨ªª©©§¦¥¥§¥£¡ }|zzz{}}}}~~~}}|{zzyxxwxyz|~~}||z{} ¢£¥¥¦¨©©ªª¨¦¥¥¥¥¥¥¥¥¥¥¤¢¡ |zzzyxusmhipwywuttuusqmiebbdefikmnnopprty{}}}}|{zxxyzz{} ~}~ }|}~ ~||{zywvvvtsqrtwz|{{wtrngba^\ZXWWWVVVRQRRSY_r ¡¢££¤££¢¡ uliihjotz¯¥¬°¯®±³°¯³´´µµ¶¶····¸¸···¸¹¸·¹º»º¹¸¹º¹¹¸¸¸¸¸¸¸¸······¶µ´µµ³±±°®¬¨ zrb\RTSRQPNLKHJJIIIHFFDBBDDDDBCDDDDEFEPPSacgu£¢¦¥¦©«¬«¬®¯¯°±±²²²²´µµ¶¶¶·¶·······¹¸¸·¸¹º»¸º»ºº»º¸»¼»»»º¹¸¹¹¹¹ºººº¹¹ºº¹¹¹º········²²²²±±±±²±±³µ¶µ³¶·¶´²²²²²±¬«¥¥¡~kcVVQPLJGEDDA@???ADEDDDC@<86568:<=<;:;=>>?ACDDCDDDA>>=:72112358:<=<<;87888;;<<=>>>>@BIOPPQSSUVVUTTRPPRSQQSVX¨©©©¨¨©ª¨§§§©ª©¨©©©©ªª««««ª©¨©««¬¬¬¬¬¬¬¬¬«¬««ª«««««««¬®¬«ª«ª¨«ª©©ª«««¬®®®¯®®®¬®®®¬«¯¯¯¯®®®¬¬¬¯°±±±±°°¯®®®°°±°®¯¯°°¯¯®°°°¯¬¬®¯¯¯¯®¯¯°®¯¯¯¯¯±±±±°°¯®®®®®¯¯¯¯¯¯±±±±±±²²°®®¯°±°®±¯®¯¯°¯¯¯®®¯±±±±±±±±±±±±¯¯®®®¯°°±±²²²±±²±°¯°²³²±²±±²³´´´³³²±±±±¯°¯¯°°±±°±±±±±°¯¯°±±±±±°¯°°°±±±±±³³´³²²²³´´´µ¶¶µ´¶µ´´´´³²³´µµ´³´´´³²±±±±±±°¯®®¬¬«««««¬®®®®®¬«©©©¦¤¢¢£¤¥¥¦ª¬¬«ª«ª¨¨¨¨§¦¦¥£¢¡ ~}|}}||}{zyxxxwwyyyz}|||{{{|~ ~|} £¤¥¦¦¦¥¥¤£¢¡¢£¤¥¦¥¤¢¢¡ }{z|}zvnihimqqpnnnnnliedcbbcdemosttttttvy{}~~~|zwwwxyz|} }|{{~ ~|{{zzxxxwvtsqqqrtxzzyvtplhda^\[YVVUTTPOQRQWT`t ¢¢££¢¢¢¢££ ¦©«±±±±±±²³´´µµµµµµ¶µ´´µµ´´¶µ¶···········¸¹¹¸··¶µµµ¶µ´´µµ´´²²±±¬§§¡{pe`XZVQONMKJJJJJJIGFDC@@ACDDB@BACCCLSVWZ[ctz¢¢£¦§¨ª««¬®®¯°±²²±±³´µµµµ¶··¶¶¶·¸¸¸¹¹¹¹¸¸¸¸¹ººººººº»»»»»ººº¹¹¹¹¹¹ºº¹º¹····¶··µ³³´³²¯°°¯¯¯¯®²±°°±´´±¶µµ¶µ³²³³±°¯¯®«ª¥xmbYSNIFHGACA?ADDDDDDDCCBA@<=>==?AA>?@???ACDDDDDBAA?<961,.35689<>>=<:998755:<>>?@CDFJPQQQQQTTTTSRQPRRRQQSVW©©©¨¨¨©ª§§§¨¨©©¨¨¨¨¨©ªª«««ªª©©««¬¬¬««¬¬«««««««««¬¬««««©««ªª«««««¬®®®®®®®®®¯¯¯®®®¯¯¯¯®®®®¬¬®®¯°±°°¯¯®®®¯°°°¯¯°°°°¯¯¯°°¯¬®¯¯¯¯¯¯¯°¯¯°¯¯¯°±±±°°¯®®®®®¯¯¯¯¯±±±±±±²²¯®®®°±°¯°°¯¯¯¯¯¯¯¯¯°±±±±±±±±±±±±±°°¯¯¯°°±±²³²²²²±°¯°±²²±²±±±²³³³²²²±±±±¯®®®®¯°°¯¯¯°°°°°°±±±±±±°¯°°°±±±±±±²²²²²³³´´´µ¶¶µ´¶µ´´´´´³³´µµ´³´´³²²±²²²±±±±°¯¯¯¯¬«««««¬®®®®®®®«ª©©§¤¢¢¤¥¥§¨«¬¬«¬ª¨§¨¨§¦¥¤£¢¢¡ ~}|||{{zzyxxwwwvxyyz~|{zzzz||~ |{{ ¢£¤¥¥¥¤¤£¢¡ ¡¢¤¥¥¥£¢¡ }ztmihhknnnmklllihcbbbbcdflnrtuuuvvwy{|}}}|zwwxxyz}~ ~|{{~ ~|{zzzyyxvtsrqopqtvyyytrnjfb_^\ZXVUTSSQOPRPVRbu ¡¢£¢¢¢¢¢¢¢¡ ¢¤©©«®¬±±±±±±²³´´´´µµµµµµ´´µµ´´¶µ¶··¶¶········¸¹¸··¶¶µµµµ´´µµ´´²²°±¬§¦ }pg]VWTOLKKKJJJJJJIGFDBABCDDDDCDBABDPUWX\am¡¡£§§¨ª««¬®®¯°±±²±±²³´´´µµ¶·¶¶··¸¸¸¹¹¹¹¸¸¸¸·¸¹ºº»»»ºººººººº¹¹¹¹¹¹ºº¹º¹···¶µ´´³±°°¯®««««®®¯±³µ³±³²²´´²²³³²±°°¯¬«ª¥¢zm^UOONLIDFDAABBDEEEDDCCBABCCA@AAAAA@>>>ACCBBAAAAA?=;961124688:;;;:99885448:<=>?CEIMQRRRSSSSSSSRRRRRRQQRUV©¨§§¨¨©©§¨¨¨¨¨¨©§¨¨©©ªªªª«««ªª««¬¬¬¬¬««¬¬««¬ª«««««¬«¬«««««ª««ªª«««««««¯°¯®®®®®®®®®®¯¯¯¯®®¯¯°°°®®®®®®¯±±¯®¯¯®®¯°°¯°°°°°°°°¯¯¯®¬®¯¯®®¯¯¯¯°°°°¯¯¯¯±°°°¯¯®®®®¯¯¯¯°±±±±±±²°¯®®°±±±°°°¯®®®¯¯¯¯°±±±±±±±±±±±±±±±°°°°±±²³³³²²³±°¯¯±±±±²±±±²³³³²²²±±±±¯®®¯°¯¯®®®¯¯¯°°²²²±±±°¯°°°°±±±±±±±²²²³´µµ´µµµµ´µµ´´µµµ´´´µµ´³³´²²²²³³²±²²±±±°°¯®¬««««¬®®®®®®¯¯®«ªª©§¤¢£¤¥¦©«¬®¯®®«¨§¨©§¦¥¤¢¢¢¢ ~||{{zzyxwwwwvuuwxy{~}{zzzzz}~ ¡~~|zz} ¡¡¡¡¡¡¢¡¡£¤¤¤¢¡ {smjjikmllkiijjhfbbbabcfgknqtuvwxxyzz{|||{ywwxyz{~ ~||} }|{zzzyxurpoonoqtuwxysqmhb_^^\ZWVUTSRSOOPPSPcz ¡¡¡¢¢¢¡¡¡¡¡ ¡¤¦§§¬««¬¬«««±±±±±±²²´´´´´´µµ´´´´µµ´´µ´´¶¶µµ¶¶····¶·····¶µµ´´´´´´´µ´´³±®¯«§¦phXPTQOMLLLLJKKKJIGFCBBCDEEEEDDA@AFTW\^ely ¡¢¤§§¨©ª««®¯¯¯°±±±±±²³³´´µ¶··¶··¸¸¸¹¹¹¸¸¸····¸ººººº¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹º¸¹¸·¶¶µ³µµ³°®¬«©«°¯«¨¦ªª««®±²²±±±²²²³´³²±±±°®¬ª§§¦{r_RPNKJJJFCA@@BDFFDDCBBBDDEDCDDDCB@>>>@AA@???@AB@><<:745778876446677532389;<=?DGKOQRQRSSQQPPQQQQSSRQQRTV¨§¥¥§¨¨§§¨©©¨¨¨©¨©©ªªªª©©ª«««««««««¬¬¬¬«««««««««©«««««¬¬«««ª«««««««««¬«««««¬¯°¯®®®®®®®®®®®®®¬®¯¯°°°®®®®®¯®®°±±°¯°¯®®¯¯¯¯±±°°°°±±°°°¯®®®®®¯¯¯¯±±±°¯¯®®°°°°¯¯¯®®®®®®®®¯°±±±±±²±°¯¯°±±±°±±°®®®¯°°°±±±±±±±±±±±±±±±±°°°±±±²³´³³³³²±°¯°±±±²±±±²²²²²³²±±±±¯®®®¯°°¯°°¯¯¯¯¯°±²²²±±±°°°°°±±±±°±±²²²³´µµµµµµµ´µ´´µ¶¶µµ´´´´´´³³²²²³³³²²±±±±±°¯¯¯®¬«««¬®®®®¯¯¯®¬¬«©¨¦¤¢£¤¦§««®¯°°¯¯®«¨§¨©¨¦¥¤£¢£¢¡~|{{zzywwwvvvtttuwy{~}{zyxyy}~ }{{} ¢¤¤£¢¡ztnmnmmnlmkjijihgccbbbdghlnqtuwxyzzzz{{{{zywxxyz|~ ~ ~~||zzxtommnmnpstvxysojd`]]^\[XVVUTSSOMPPPNe~ ¡¡¡¢¢¡¡ ¡¢¢¢¡¡¢£¤¤£¥¥§ª«®¯°±±±±±²²³³³´´´´´´³³³´µ´´´³³´´´´µ´µ¶¶µ´´´µµµ´´³³²³³³´´´´´³±®«§¦rjTJOOOONMLKJJLLKIGFBAACEHHHFDDA@CGUYaitz £¤¤¦§¨¨©ª«¬®¯¯¯°±±±±²²³³´´µµ¶¶····¸¸¸¸¸·····¸¸¹ººº¸¸¸¸¸¸¸¸¹¹¹¹¹¹¹¹¹¹¸¹¸·¶µ´±±±°«««ª±®«©¦¥¦©¢¥§ª¬®°±±±±²²³´µ³²±±±±¯®ª¨©¦n\UPMNNJGDB@?ACFEDCBBBCCDDDCDDCAA@@??>>A@@@@ABCDA?>>;:;;98751.,/02311138:=>?BGJNPRQPQRSQPPPPPQQTSSRRTVV§¦¥¥¥§§§¨©ªª©¨©ª©©ªªª©¨¨§¨ª««««««««¬¬¬«««««««©©ª©ª«¬¬«¬¬««ªª««««««««¬¬¬¬¬««¯°®®®®®®®®®®®®®®®®¯¯¯¯¯®®®®®®®®¯¯¯°±±±°°¯¯¯¯¯¯¯±±°°°°±±±±°¯®®®®¯°¯¯±±±°°¯®®°°°¯¯¯¯¯¯¯®®®®®¯°±±±±±²²±±°°±±±±±±°¯®¯°±°±±±²±±±±±±±°°°°°¯¯°°±±±²³´³³³³²±±°°±±±²±±±±²²±²²²±±±±¯®®®®¯°°¯±±°°°°°±±±±²±±±±°°°°±±±±±±²²²²³³µµµµ´´´µµ´´µ¶¶¶µµ´´´´´´´²²²³´´³²±±²±±±°¯¯¯®¬¬¬¬®®®¯¯¯¬¬¬«¨§¥¤¢£¥¥¦ª«®°±°¯¯®«©§¨©¨§¦¥£££¢¡ }|{zyxxwwvvutsttvy{~|zxxxx} ~~¢£¢¢¢ ztpoqoopnnmkkkjiheeeddeghnortuwxyzzz{{{zzzyxxxyz}}~ ~~}|zuomllklnprtuvrmf`]\\\\\YWVUSRROLNOPLf ¡¡¡¡¢¡¡ ¡¢¢¢¢¤¤¤¤¥¦§§©ª«¬®¯¯°±±±±±±²³³³³´´´´³³³³´´´³³²²³³³³µ³´µµ´³³³´´´´³³²±²²³³³³³³²±®«§¥skREJKLLKJIIJKNNLIFDAAACFJKKIFECDEHSVdt ¥¥¥¦§§¨©ª«¬¯®®¯±±±±²²³³´µµµµ¶¶·············¸¹ºººº¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸·¶µ´²°«¬¬ª¨¥¢ ¥°¯¬²²²²²³´´³²²±±±°°®««ª¥ {nc\VQJHGEDB@@AEDDCBBCDDDDDBBBAAABBAA@@DDDEEEEEIHGEDA@@>97861+**+./.-/258>ACFJMPRSRQRTTTSSRRRRSSRRRSUVV¨¦¥¥¥¦§¨©©ªªªªª«©©©©¨¨§§¦¨©ª«««««««¬¬¬««««ª©©©ª«««««¬¬«ª«««««««««¬¬¬®¯¬®¯¯¯®®®®®®®®¯¯®®¯¯¯®®®®®®®®®®¯¯°°±±±°°¯¯¯°°¯±±±°°±±±±±°¯¯®®®®®¯°¯®°°°±±°¯®°¯¯¯¯¯¯¯°¯¯®®®®®¯°±±°±±²³²±±±±±±±±±±°¯°°±±±±²²±±±±±±±°°°¯¯¯¯¯°±±±²³³³²²³²±±±±±±±²±±±±±±±±±±°°±°®®®®¯¯¯®°°°°±±±±±±±±±±±±°°°°°±±±±±²²²²²³´´´´´´´µµµµµ¶¶µ´µ´³³´´´´³²²³´´³³³³³²²±±°°¯®®®®®®®®¬«¬¬«§§¥¤££¥¥¦©«®°°¯®®®¬ª©©©¨§¦¥¤££¢ ~|{zyxxwwvvttrttvz|~|zxwwx|~ {vrrtrrropnmlkkjighhgffhinprtuwxxzzz{{{zz{zyxxyz}}~ ~~~}}~ ~}}|}~~{wsnmmjklnopppnha\Z[[Z\[ZXVTQPPOLLNOKf ¡¡¡¡¡ ¡¡¡¡¡¢£¤£¤¦¨¨ª«¬¬®¬¯°±±±±±±²²²³³´´´³³²³³´³³³²±²²²³´´´µ´³³³³³³´´´³²±±±²³²²²²±±¯«¦¥~sjVIMLJIHGHIJLNNJGDCBBBDHKNOMIHFHIHPUfy ¡¥¥¥¦¦§¨©ª«¬®®®¯±±±±²²²³´µµµ´µ¶¶¶···¶········¸¹ºººº¹¸¸¸¸¸¸¸¸¸¸¸¸¸¸··¸··µ´²°¯®«¦tokhb`go~¥¨«±±±±±³³³³³²²²±±±±¬®®«¥tg^REGFEDDA@@DDDDCBDDCDDCBCDCDDDCCCDFHIJKKKJJLLMLJFDB@;8982-,)*,-,,.128>CFIMPQRSQQRTTUUTSSRRRQQQRTUUU©¨§§¦§©ª©©©©ª««ª©¨¨¨¨¨¨¨¦§©ªªªª«ª««¬¬¬««««««ªª«ª«««««¬«©ª«ªªªªª«¬®®¬®®®¬®®¯¯¯®®®®®®®®¯¯®®®®®®®®®®®®¯±±±±±²°°¯¯°°°°°°±±±±°°±°°¯¯¯¯¯®®°°¯®¯¯°±±±°¯¯¯¯¯¯¯¯¯°¯¯¯¯¯¯°°°°°°°±²²²²²±±±±±±°°°°°°±±±±²²±±±±±±±±±±°°¯¯°°±±±±²³²²²²±±±±±±±±²±±±±±±±°±°°°°¯®¯¯®¯¯¯¯¯°°±±±±±±°±±±±±±°°°°°°°°°±±±±±±²³³³´³³³´µµµµµ¶µ´³´´³³´µµ´´³²²³´³³³³³²²±±±°¯¯®®®®®®®®®¬¬¬«§¦¥¥¤¥¥¥¥©«®¯®®®®¬«ª©¨¨¨¦¥£££¢ }{zyxwwvuuttsstvz|~~{ywvwxz~ ¡¡ |yututssqrqnnmlkjijkjiijkoprtvwxyyzz{|{{z{zyyxxz}}~ ~}}}|}~ ~{zyyz{}~|yuqnmkkklmmlkid]XWXZ[\[ZYWTPNMOMKNOJe} ¡¡¡ ¡£¥¥¥¥§¨©ª«¬®°°¯¯°±±±±±±²²²³³³´´³³²²³³³²´³²²±±²³³³³³±±±²±²³³³²±±±±²²±±±±±±®°«¦¥}rh\QRPLJHHHIIJJJGDCCDCDFJMOPNJJIJJIP\jz¡¡¤¤¤¦¦§©ª««¬®®°±±±°±±±±³´´³³´µ¶µµ¶·¶¶¶·······¸¹¹¹¹¹¹¸¸¸··············¶´²±ª«§vf[GA;724AP]fs¢«®°±±±³³³´´´³³²±±±®®°®¬§ tgVEJFDDCBAAACDDCCDDABCBBCDDDEFFDDGJJKMNOONMNNNNMKHEFA>>:1,,+++--.136;BGIKORQRRQQSTTTTTSSRQQPPQSTUTSªª©¨§¨ª«©¨¨©ª««ª©¨¨¨¨©©ª§¨©©©©©ª©ª««¬¬««««««««««ª«««««¬¬ª¨©ª©¨¨ªª«¬®®®¬®®®®¯¯¯¯®¬®®¬®®®®®®®®®®¯±²²±±²´°°¯¯°±±°°°±±±±°°¯¯¯¯¯¯¯¯®®°°¯®®®¯±±±±°¯¯¯¯¯¯°°¯¯¯¯¯°±±±±°¯¯°±²±²²²²±±±±°¯¯°±°¯±±±²²²±±°°±±±±±±±±°°°±±±±±²²²±±²±±±±±±±±²±±±±±±±±±±°°±°®±°°°°°°¯±±±±±°¯®±±±±±°°¯°°°°°°°°°°±±±±²³²³³³³³´µ¶µµµ¶µ³²´³³³´µµµ´³²²³³´³³³²²±±±±°¯¯®®®®®®®®®¯®¬«§¦¥¥¥¥¥¥¥ª«¯¬¬¬«©¨¨¨¥¥£££¢¡ }|zyxwvutttttstuz}~}|zxvvwyz} ¡¢¢¡ |{wvwtttrtspnnmllkmnnllmnoprtvxyyxyz|||{z|zzyxxz}~~~}}||~~ ~|||{ywwwyz}}|{yvsommlkklkihfb\WVWZ\\\[ZXTPNKPMKNPJd{ ¢¡ ¢ £¥¥¥§¨¨«««««®¬®¯°±±°±±±²²²³³´´³³²²³³²²¶´²²±±±²²²²±°°±±°±±²±±°°°±²²±±±±°±¯±«¥¥ |qhbYSQNKJIHGFFFECBCDDDFILOPOKIJIJJJQdo{¢¥¥¤¦¥§©ª««¬¬®°±±°¯±°°±²³³²²³µµµµµ¶¶¶····¸¸¸¸¸¸¸¸¸¸¹¸¸···············µ³±°¬¨whXG<&4>GWhw ¬®°±±´µ´´´´´³²²²±±±°«¨ª©¨¤r]JKHDBBBBC?ABCBBCDBCC@?@AABEIIFEGIKLMOPPPOPOMMPPNKLHEC:.)+++,./137<AGJKMPSRSSSSTVUUUUUTSRQQQSTVUTR««««ª©ª¬ªªªªª«««ª©¨¨©ªª©©¨§¨ª«ª©¨©ª««¬¬¬¬«««««ª¨««««¬¬«¬«ªªªªª©ª««¬®¯¯¯¯¯®®¯¯¯®¯¯®®¬¯®®®®®¯¯°°°¯®¬¬¯±²²±±±²±°°±±±°°°°¯°±±°¯±°°°°°°°®¯°°¯±±±±±±°¯®°±°°±°°°°°±±±²±±°°±²²²²²²³²±±±±±°¯¯¯°±±²³³³³³³±±±±±±²²±±±°±±±°±±±±±±¯°°±±±±±±±±±±±±±±°°±°¯®®¯°¯®¯¯°°°±±±±°°°°°±±±±±±°¯°°°¯®®®¯¯°±±±²³³³²²³´´´´³³³´´²±³³²²²²³´²²²²²³´´³²²²²²±±±±°°¯¯®®®®¬®®¬«««ª¨¦¥¥¥¥¥ª«¬¬¬®®®®®¬«ª¨¨¥¥¤££¢¡¡ ~{yyywwxxwvwtttwz~~{zxvuwz|~ ¢£¢ ¡ ~{zywutttttutrponnmnqstrpopqrtvxxxz{|}~}||zzzyyzz{}~ |{||} }}}|xtttuz}}zvtttsqpnmkhhhda^ZXWXZ[\\[ZXUOKMINNRRNcz¡¡¢¤¥§¨¨¨§ªª««¬®¯¯°±±±±±±±²²²²²³±±±²³²±²²±±±±±±³²±°°°°±°±±±±±±°±±±±°°°°²°°®ª¦¤ {thdRSPOMKIGGGB?ACCDFGGHJNPNKKJKOPPPQgly¡¤¥¦¦¦§©ª««¬¬®¯®®®®¯¯°±±°±±²³´´´³³³········¶·······¸···¸¸·¶·¶¶···¶µ´µ¶¯±®¬¥ tdP730153,&(-06+CPek¡ª¯±³·²µ´´´³³³³²³³±°¯«ª¥¢l`[MLDHHECCDCA@?@@BCDDBA??CEHHGGIKMPONPPQVURPOPPPNOKIHD>725422128=AEJMNPQRSTTSRRTVUSSTSQQQSRRRRRUX¬«««ª¨©«ªªªª««««««ªªªª©¨©¨§¨ª«ª©¨©ª«««¬¬¬¬««ª©©ªªª««¬««««ªªªªª©ª««¬®®¯¯¯¯®®°°¯¯¯®®®®¬«¬®®¯¯®®®¯°¯¯®®®¯±²³²²²³±±±±±±°¯¯¯¯°°±°¯°°°°¯¯¯¯®®®®¯°°°±±±±±±°¯®®°°¯¯±°°°°°±±±³²±±±±±±²²²²³³²±±±±±°¯°°±±±²³³²²²±±²²±±±²²±±±±±±±±±±±±±°±±±±±±±±±±±±±±±±±±±°¯¯¯°°¯¯¯¯°°°±±±°°°°°°±±±±°°°¯°°°¯®®®¯°±±±±²³²±±²³³³³³³²²±±²³³²²²³³´³³²²³³³³³²²²²²±±°°°°°¯¯®¯®®®®®®®®¬««ª©¨¦¥¥¥¥¥ª«¬¬¬®®¬«ª¨¨¥¥¤££¢¡¡ {zzyxxyywvvtttvz}~|zywuvxz} ¡¢£¡¡ ~|{|{{zyxvuttttuutrrqpnprtttrqrrtuxyyxz{}~~~}}{zzyyzz{|~ }|}~ }~|wrrqruyzz{zxttttttqonkfedb\ZXVWXZ[[[ZYWSOKOJNNPQQbz ¡£¤¥¦§¨¨¨©ªª««¬¯¯°°±±±±±±±±²²²±²±±±±²±±±±±±±±±±±±°¯¯¯¯°°°±±±±±±±±±±°°°°±¯¯©¥£|sgdVSPNMLJJJJFDDDBCDEEFJMOMKMMOQRQRSglu¡¢£¤¤¥¦§¨©«««¬®®®®®®®®¯°°°°±±²³³²²²³¶¶¶¶····¶···¶¶··¸···¹¹¸········¶·µ´®°«¨xhV=#(1701.6?7388BSTfs¥«¯±µ´µµ´´´´´³²³³±±°®¬«©¥¢|oh]ZKJHGE@AA@????@ABBAAAADFHIHHJLMPONPPRVUSPPQQPNPOOQPJD?874336:?CGLNPQRSRSSRRRSUTSRSSQQRSRRRRRTW¬«««ª©©«©ªª««««¬¬««ªª©¨¨©¨¨¨ª«ª©©©ª««««¬«ª©©«ªªª««««««ªª««««ªª««¬®®®®¯¯®®¯¯°¯®®°±¯®®®««®¯¯¯®®®®°¯®®®¯¯±²³³³³´³²±±±±¯®®®¯¯°°°°¯¯¯¯¯¯¯¯°¯®®¯°°°±±±±±±°¯®®®¯¯¯¯¯¯¯°°°±±±³³²±±±±±²²²³³³²²±±±±°°°±±±±²³³²²²±²´³²±±²²±±±±±±±²²±±±±¯±±±±±±±±°°°°±±±±±±±°¯¯¯°°°¯¯¯°¯¯°°°°°°°°°°°°°°¯¯¯¯°¯®®®®®¯°°°±±±²±±±±±±±±²²±±°±²³³³²³³³´³³³³³³²²³²²²²²±±°°°°°°¯¯¯¯®®¯¯®®¯¯¯®««ª©¨¦¥¥¦¦¦ª«¬¬¬®®¬«ª¨¨¥¥¤¤££¢¡¡ ~{zxwwxxvtttttuy{}~~|zzwuuwx} ¢£¢¡¢ |zzzzzyxxwvuttuvvtttsrpqstuttssttvxzzy|}~|{zxxyzz|~ ~~~ ~wnnnnqtuvwxvsqrtvxtrqleba^XWWWXYYY[[[ZWTPMPMMNNOVbw £¤¥¥¦§¨¨©ªª««¬®¯¯¯°°°°±±±±±±±±±±°°±±±°±±±±±±±±±°¯®®¯¯°¯°°±±±±±°°°°¯¯¯¯°¬¨¥£~rgh]VRONMLLMKJHFB>>ABCDHKMLJMNPRRQRSflq ¡¢££¥¥¦¨©ª«««¬®®®®®°°¯°±±±±±±²²³µµµµ¶¶¶¶µ¶¶¶¶¶¶·····¸¹··¶¶¶······³³®±© jZD1#-6%,GSbiSIJNOb\int ©±²´´´´´´´´²³³±±°¯¬«¨¥¡vh^MJIHF????>>??CCCBA@@ADFHIHIKNNPPPQRSVTSRRSRPONNOQPLFC><86569<DIMPPRSTRRRRRRRSSRRRRRRTSSRRQQSV««««««««©ª««¬¬¬¬«ªª©©©¨¨©¨¨©ªªªªªªª«««¬¬¬«©©ª««««««««««««¬¬«««ª««¬®®®®®¯®¬®¯¯®¯±²±°¯¯®¬¬¬®¯¯¯®®®±°®®¯®°±³³³³´³³²±±±°¯®®¯°°±±°¯¯¯¯¯¯¯¯±°¯®¯¯¯¯±±±±±±±°¯¯¯¯¯®®®¯¯¯°±±±±³²²²±±±°²²²³´´³²±±±±°°±±±±²³³³³³²²²³³²±²²²±±±±±±±²²±°±°¯°°±±±±±±±±±°±±±±±±°¯®®¯¯°¯¯¯¯¯¯®°°°°°¯¯¯°°°°°¯¯¯®¯¯¯®®®®¯¯°°°±±±±±±±±±±±±±±°°±²³³³³³³³³±²³³³²²²³²²²²²±±°°°°°¯¯®¯¯®®¯¯®®®®®®¬«ªª©§§§§§§©«¯¯¯¯®¬«ª©§¦¥¥¤¤£¢¢¢¡|yvuuutsstttuwz{||{zzxvuvy ¡¢¡ ££¡ ~~ }}|{zyyyxxxwwvutvwwuttsqqrsttttttttvxyzz}~~}|zyxyzz|~ ~~}}}~ ujmllnqstuvtqoptwzvtsngca\WWXYZZYXZ[[ZXUPOOMKLJNZat¢££¤¥¦§¨©ª««¬¬®®®®®®°±±±±±±°±°°°±±°°°°°±±±±±°¯¯¯¯¯°°°°°°°°°°®¯¯¯®®®«««§¥£~phh`YUPMMLLMKJIE?;;>BCDHJLKJLNPQQPQReln¡£¤¥¦§¨©ª«««¬¬®®®°°°±²±±±±±²³´´´´µµµµµµµµµµµµ¶¶¶¶····¶µµµµ¶¶¶¶¶²²±²§u]I1+1714Nntqob[dbbg^Tci¦¬®±±²²³³³³³²³³±±±°®¬¬©¥¢ q]MNIGFB@?>>>@AEEEDDBAADEHHHIKNNPPOQQQTSRQQRRPPQQQQPMJGDDA>;:<>FJNPQSTTSSSSTTSRRRRRRRSUSSSRQQRT««««««««©©ª«««««««ªª©¨¨¨¨¨¨©ªªªª««««««¬¬«ª©ªª«ª««««««««¬¬¬¬¬«««ª««¬®®®®¯¯®¬¬®¯®®°±±°¯¯®¬«¬¬¯¯¯®¯¯±±¯®®®®°±²³³´´³²²±±±°¯®®¯°°±±±¯¯¯¯¯¯¯¯±±¯®®¯¯¯°°°±±±±°°°°¯¯¯¯®®¯¯°±±±±±±±±±±±±²²²³´´³²±±±±±°±±±±²³³³³³³²±²²±²³²²±±±±±±±²±°°°¯®¯°°±±±±±±±±°°°±±°±°¯®®¯¯¯¯®®¯¯®°°°°¯¯®®¯¯°°°¯¯¯®¯¯¯®®®¯®¯¯¯¯¯°°±±°±±±±°±±°°±±±±²²²³³³³³°±²³²²²³³²±±²²²±±±°°¯®®¯®®®®®®®®¬««ª©¨¨¨¨¨¨©«®¯±±±¯®¬¬«ª©§¦¦¥¥¥¤£¢¢¡~zwtssrrrsttuvxz{{{{{zxxy|¡ ¡ ¡££¢ ~}}~|zxxxzz{}|||zzxxxwwxxwwvuwxwvuttrsstttuuuuuuvwz|~~~}{zzzz{|} ~|||||| ~~~ uimlmnpqrttrnnnrvywtrnifb\WXY[\\ZYYYYXVTPNNMJKJN[bq¡¡¡¢¤¥¦§¨©ª«««®¬¬¬¬¯¯°±±±°°°°°°±°°¯°°°°°°°°¯®®®®¯°°°°°°¯¯®®¬¬¬¬«©©©¥¤¢zmfd\XSMJJJJJLKID>;=@DDGIJLLKLNPPPPPQdmo £¥¦¦§¨ª««««««¬®®°°°±²±±±±±±³´´´´´´´´´´´´´µµµµ¶¶¶¶·¶µ´´´´´µ¶µµ¶²²¯±¥ sWC,.8;2@^mkb^`Va]]QD6R_z««°±±²³³´´´²³³²±±±¯®«¥¢¢~eVTGEHEB>>=>@CDDFGFDDCDFHIHIKMLNMLNNMPQQPPQQQQSSTSRQOMHJJHDDEGHKOPRSTTSSSTTSRQRRRSSRSUTUTSSSSS¬¬¬««««©¨©©ª««««¬¬««©¨§§¨¨¨©©©ªª«««««««¬¬«©©ª««ªª«««««««¬¬¬¬««ª««««¬®®®®¯¯¯¬®¯¯®®°±¯®¯®¬««®¯®®¯¯±±°¯®®¯°±²³´´´²²±±±±°¯®¯°°°±±±¯¯°°°°°°±°¯¯¯¯¯¯°°°±±±°°°°°¯¯¯¯¯®¯°°±±±±±±±±±±±±²²²³´´³²±±±±±°±±±±±²²²³³³²±²²±²´²±±±±±±±±±±°¯°¯®¯°°±±±±±±±¯®®¯¯°±±±±°¯¯°¯®®®¯¯®°°°°¯¯®¯¯¯°°¯¯¯®¯¯®®®¯¯®¯¯¯¯¯¯°±°°±±±±°±°¯¯±±±±±±²²²²²²°±±²±±²´³²±±²²²±±±±°¯®®®®®¬¬¬«ª©©©©¨¨©«®¯°±±±¯®¬«««©§§¦¥¥¥¥¤£¢ |xtrqqpqprtuvxz{}|}~}{{}¡ ¢£¢ ~}}|zz{|{zxvtrsttttvyz} ~}zywvvwwwxxxxwwwxxwwwuttttttuvwwwwxy{~~~~~~}{zzz{|} |zz{{{{}}~ |{} vnpopqrppproljlosttpnkhfb\WXZ\\\\[ZYYXWUPNMKKJKOWbn| ¡¢¤¥¦¥§¨©©ª«¬¬¬¬¬¬¬®®¯°°°°¯¯¯¯°°°¯¯°°°°°°°¯®®¯¯¯¯¯®¬¬¬¬¬«««««¨¦§§¤¢¡zuhb_VSMGDEFGHIHEB><>BEFHJJKLMJKLLNOPPcnt¡¢£¦§§¨©«««««««¬¬¬¬®¯¯¯¯±°°°°°±²³³³³³³³³³´´³´´µ´´¶¶···¶µµµ´³´µµµµ·³±«¤sTE548=?DUPNKFD/')+*)5LTo§««®±±²³´µµµ³´´²±±±°®«¦££¢ rb[GEJID>=<=@DDFHIHEDCEGIIIJJLLMJJKKJMPPPPPQRSQSTTRPNLJMNLJHHIJLPQSTTTRRSSRQQQRRSTSQRTUVVUTUTT¬¬««¬«¨ªªªª«««««¬««©¨§§§¨¨¨©©©ª««««««««¬««ªªªªª«««««««««¬¬«««««««¬®®®®¯¯¯¯®®®®®®®¯¯±¯¯¯¯¬¬®®¯®®®®¯¯°°±°¯¬®¯±±³³³³²±±±±±¯®®¯°°°°±±°°°±±±±±±°°°°°°¯¯¯°°±±°¯¯°°®®¯°¯®¯°±±±±±±±±±±±±±³²²³´³²±±±±±°°±±±±±±²²³³³²²³³²³´²²²±±±±±±²±°¯°°¯°°±±±±±°±°¯®®¯°±°±±±°¯¯¯¯®®¯¯°¯®¯°°°°¯®®®¯¯¯°°°°®¯¯¯®®¯°®¯¯¯¯¯¯°°°°°±±±°°°°°±±±±±±±²²±±±±±²²±±²´³²±±²²²²±±±±°¯®®®®®®¬¬¬¬¬«ªª©©©¨§©«®®¯±±°¯®¬«««©§§¦¥¥¥¤££¡ ¡¡ }xtqqonnmosuwy{} ¡¡¡¡ ~||{zyyyzywusqnnnoonnqtvy{ }|zyxwwwwwwxxxxxxyyxxxvtttsstuvwyyzzz|~~}}}~}|{{{{{|} }zyyzzzz{{|~~ }||~ |zz{~ zvvvvvtpnmnlhhimnonjhebb`\ZZ\\]]\\\ZYXXVQMLJLJLPQajx ¢£¥¥¤¥§¨¨¨ª«¬««««¬¬¬¬®¯°°¯¯®®¯¯¯¯®®®¯¯°°°°°®®®®®®¬««««««ª©©©§¥¥¥¢ vqb]ZSOHB@BDDDDCA>==?ADEFGHIKLJJJJLOPNcnz ¢¢¥¦¦§¨©ª«««««¬¬¬¬®°°¯¯°°°±±°±±²²²²²²²²²´³³³´µ´´µµ¶¶¶¶µµ´´³³´´´´µ´±©ª£oOC6677:5804:<=10++.-;:5g¥ª«°±²³µ¶¶¶´µ´²±±±°®«¨¦¤£¢meOKKJD?>==@DHIJJIFDCDFHIIHIIJJHFHHIKMOPPPQRSTVVTQPOMMNNLJJIGJMPQSTTSQRSRPPPQRRSTRPPRSTTSTTTR«¬¬«¬«ª«««««¬¬ªª«ª©¨¨¨§§¨¨¨©©©«ªªªª«««¬¬¬«ª©©«««¬««««¬¬¬¬«««¬««¬®®¯¯¯¯°¯®¬¬®¯°°°±°°°±¯¯°¯®®®¯°±±¯¬®°±²²²²²±±±±°¯¯°°°¯°±±±±±±±±±±°°°±±°°¯¯¯°±±°¯®¯¯®¯°¯¯¯°±±±±±³²²±±±±±³³³³³³²±±±±±°°±±²²²²³³³´²²³´´³³³²²²²²±±±±²±°°°°¯±±±±±±°¯±°¯®®°±±¯°±±°¯®®¯¯¯¯°°°¯¯¯°°°°¯®®®¯°°°°°®¯¯¯®¯°°®¯¯¯¯¯¯°¯¯¯°±±±°®¯±±°°°±°±±±±±±±±²²²±±²´²²±±²²²²±±±±±°¯¯¯®®®®®®®®¬¬«««««ª©©©¨§¦©«®®¯¯®¯®¬«««©§¦¥¥¥¥¤£¢¡ ¡¢ |wsqpnmljnruxz}¡ }|{zzvvvxywtrpnlklllkmosuvy| ~}zzzzzzyxwwwwxxyyzzyxxwtsssrrstvwyz{{||}~~}||}~~~}|{zz{{|~ {ywxyzzzzz{}~{|~}} }{zyz~yvwz}~|{{zvpljmiffhkmmifc`\\^\]]]^^]\\\YWWWUPKJHKHLOK_hu{ ¢£¥¥¤¥§§§¨ª«««««««««¬®¯°°¯¯®¯®®®®¯°°°°®®®®®®¯¯¬¬¬¬¬¬«««««ª©¨¨¨¦¥¥¥ sn\WUPMF@>@BCC@?>==>?@BCDDEFIJKJJJMPQPcn}¢£¥¥¥¦§¨©ª««ª«¬¬¬¬¬¯±±¯¯°°±±±±±²²±±±±±±±±´³³³´µ´³³´µµµµµµ³³²²²³³²²³²¨©¤tQD59=3,,,1685233+342400]z¤«¬°¯°±³´µ¶¶´µµ³²±±°±®««©¥¢¡uo[RJJE@>>>ADIJJJJHGGDEGHGFFGFGDBDDEHJLOPPPQQRTRPNNOOOONMNPMJJLOPRSSQQSSRPPPQQRTTRPPPPRRQRSRP®®®®®««««¬¬¬««©¨ª¨¦¨¨¨©©©©ªª¨©ª«ªª««¬«ªª«««¬«ª«¬¬¬««¬®®®®®®®®®¯°¯®®¯°°±°±±±±°°°°²±°®®®°±®¯¯°¯®®®¯°±±²²²²±±°¯¯¯°¯®®°±±°²±±±±²±±°°°±±±±±±±°°±±°°¯¯°°¯¯¯°®¯¯¯¯¯¯¯±±²²²²²²±±±±°°°±±±°¯¯¯°°±±²³³´´´²³³´´´´³´³³²³²²±±±±±±±°°±±±±±±±±°¯¯¯¯°±±²±±±®®°¯¯¯°°°°°°°±±±°¯¯¯¯¯¯¯¯°±±¯°±°®®¯±¯¯®®®¯¯®¯°°°¯°°°°°°°°±°°°±±±±±±±±±±²²±±±±±±±±²±±±±±¯®®¬¬¬¬¬¬««««««ª©¨¨¨©ª«®¯®®¯°®®®¬«¨¦§¦¥¥¥¤£¡£¢¡¡¡¡ {xttllkljntvwz ~zyxvvwvvtspmmmlkklmnortvxzz{|}~ }|||{{|||{||zyyxwwxzzzyyyywuttssssstwyz{||}~~~~||{{|~~}|||zzzzzzzz~ |xvuuxz{{|{{}~}||zzzzzz}~|zyxyzz{{} {zuuww{ |ztge\b\\fhilfb^XTTW[\\^__^\\\\[YVTQOLKIJLJJQ\ety¡¤¥¤¥¥¦§§§§«««ª©ª«««®®¬¯««««¬®®®®®¬®®¬«««««ª©ªªª¨¦¥¦¦¥¤¤¢si_XVSNC;=@>>>=>>>>>??>>?DGIJJJIJLPPPOjn¡¤¤¥¥¥¥¦§§ªªªª««¬¬®°°¯®¯°¯¯°°°°°¯°°°°±±±²³³³´µµ´³³²±±²²²²¶³±±±¯®¯¯®¯¬©¤tWC/>5+,(()**((*+'+,."33Yy¦§«±±²³´µ´³´´³³²±±±¯¯¯¬ª¦¥¤§¢t\VJLEAA@>@EHKNKIHIJGFEEDDFJGGEDDDFGHKNOPQRRRSTRPNMNMMLMMMMLMLNQSSRRRRQQQRRRSSRRPOPRQRRQPPPP®®®®®««««««««««©©ª§¦©ªªªªªªªªªªªª««««¬¬««ª©ª««¬¬«ª«¬¬¬¬««¬¬®¯¯®®®®°±±±±±±±°°°°°°¯®®¯°±¯¯°°°¯®®®¯°±±±²²±±±°¯¯¯¯®®®¯±±±²±±±±±±±°°±±±±±±±±±±±±°¯®®¯¯¯¯¯°®®¯¯¯°°°±±±±±±±±±±±±°°±±±±°°¯°°±±±±±²²³³³³³³³³³³´´³³³²±±±±±±±±±°±±±±±±±±°°°°°±±±±±±±®¯°¯±°°°°°°°°±±±°¯¯¯°°¯¯°°°±¯¯°¯®®°°¯¯®®®®®®®®¯°°°°°°°°°°°°±°°°±±±±±±±±±±±±±±±°°±±±±±°°±±¯¬««««««««««ª©©©©©«¬®¯¯¯°±¯®¬«¨¦¦¥¥¥¥¥¤£¤£¢¢¢¡¡ {vvnlkjjmrux{ }zxwvwxywtpnmmmllllmopstuvwwyzzz|~ }~~~}}~}{zzzzz{|~~~|zzyxyzzzzzzywvttssrrsuxz{||}~~~}}{zzyxz|~~}|{zzzxwvvvwy{}~|zvttuxz{{{zz{{{zzxvvwyzz{~}}}~~~~{|||{zyxwwxxxz zwutw }zuuhXSJMJP_fgic^\WSRVZ\]^_^]\\\[YWVSPNLKIIJJJPVbqv ¢¤¢£¤¥¦¦§§ªªª©¨¨©ª«¬®®¬®¬««¬¬¬«¬¬¬«¬¬¬¬¬¬¬¬¬¬«««ªªª©¨©¨§¦¦¥¥¥£¡ tkb[VQSH><=<<=>??>=<;;<=@DGGIJIIJLOPPPnp ¡¢£¤¥¥¦¨©ªªª««¬¬¬¯¯¯®®¯¯¯¯°°°°°°°°°±±±±³³³³´´´³´³²±²²±±²±±±±¯®®®®®¬©¤x_L8<.('%%%&&%$$$"%&+'0BWu¨¨¬«°±±³³´³³µµ´³²²±±±±°®«©¨§¨¢ |l_SPIDB@>?CDHJJHHIJGFEDDCDGGHHGFFFGIKNPPRSSTTSRQPNMJJIIJKLLNMOQSSRSRRRRRRRRSRRRPPPSSTSRQQRS¬¬¬¬«««««ªªªª«ª©©§¦ª««««ªªªª¬«ªª«¬«««««««ªªª««««««¬¬®®¬««¬¬®¯¯®®°±±±±°°°°°°°¯¯¯¯¯°°±¯¯°±±°¯¯®®¯¯°±±±±±±°¯¯¯¯®®®¯±±±±±±±±±±±°±±±±±±±°±±±±°¯¯®®¯®®¯°®®®¯¯°°°±±±²±±°¯±±±±±±±²±±°°°°±±±±±±±±²³³³³²²²³³´´´´³²±°±±±±±±±±°°°°°°°°¯°°±±±±±±±±±¯¯±¯±±±±°°°¯°±±±°¯¯¯°°°°°°°°¯°°¯®®¯°°¯¯¯®®®®®®¯°°°°°°°°°°°±±°±±±±±°±±±±±±±±°°°°°°±°¯¯¯°°¯««««««««ªªªªªªªª«¬®¯¯¯°±°¯¬««©¨¦¥¥¥¥¥¥¤¤££¢¢¢¡¡zxnmjijmotx{} ~{zyxyyxurnmmmnnmmnnprtttuuuxxyzzz|}~z{||||}~|{zzyzyy||{zzzzzzzzzywvttrrrrsuxz||}~~~}|{zyxvux{~~}|{zzzwusrrmnqstuvx{|}|yvtrqtxzzzyxyzzzyzwutvyzzz}~||{{zz{|}}{zxyz{{zyyvvuutvz zwtv ~}ysn`OE=DDK`jihcYXVRQUZ]^^^]\[[[ZYVUSPNMKJHHJKOQ^mt ¡¢ ¡¢¤¥¥¦¦¨¨¨¨§§§¨©«¬¬¬«¬¬¬««««««ª«««««««««¬¬«««««««ªª©§¦§¥¤¤¥¥£¡¡xphb_[ULE>::<=>???>;988:<@DEFGIJJKMNOPSrs} ¡¢££¤¥§©©©ª««««««¬®¯®®®®®®®®®®¯¯¯¯¯¯°°±±³²²³³³³²³³²±±±±±¯¯°±²°®®¬«©¥lV>3!&%$"!#%%#""!#(((GZt¦§«¬®°±²²²²³µ´´³²²±±±±±¯¬««§¦r\VPICA@?@CDEGGFGGGEDDDCBDFHJJJHGHIJMPPRTUUTSRQRQOMJIGFHJKLLLNPQQQQRRSSSRRRRRSSQPRTTTTSSSTU««««¬«««¬««««ªª©ª««©©§¦ª««««««««¬««««««««¬¬¬««ªªª«««««¬¬®®®®«¬¬¬¬®®®®®®®¯¯®®®¯°±±±±°°¯°°±°¯°°°°±±±¯°±±±±°°®®®¯°±±±±±±°°¯¯¯¯®®®¯°±±±±±±±±±±±±±±±±±±°±±±°¯¯°®¯¯¯®®¯¯®®®¯¯°±±±±²²²±°¯²³³²²²³´±±°°±±±±±±°°±±²²³³²²²³³´´´´´´³±°°±±±±±±±±±±±±±±±¯°±±±±±±±°±±¯¯±¯±±±±±°°°±±±±°¯¯¯°°°°°°°°°°±°¯¯°°¯¯¯®®®®®®®®¯°°¯°°±±°°°°±±°±±±±±°°°°±±±±±±°°°°±±¯¯®®¯¯®¬¬¬¬««««««««©ªªªªªªª««®¯¯¯°°°¯¬««ª©¦¦¦¥¥¥¥¥¤¤££££¢¡ ~ynmkikmnrw{| ~}|{zywtpnnmnnonnnortuuuuuvxyyyyyxxuuvxz|}|z{{{{{|}|{zzzzzz~~}}||{z{zyxwvutrrrqrtwy|}~~}{zzzywutx{~~~}||{{zxtrppnopqqrrsuvyzzyusronquyxvvvxzzzyywuuxzzzz{}}{zyxwvvwxyzyxwxyzzzzzxxwvttuy{} }zuw~}ysm`PC;AAH]igd`VVURRVZ\\\\[ZZZZYWVTQOMKJJHHJLOOWhu ¡ ¡¢£¤¥¥¦¦§§¦¥¦¦¦¨ª«ªªªª«ªªª««««©ªª««««ª©ª««««««««ªª©¨¦¥¥¤££¤¤¡ypf^[UL@?=;<>?>???><;:::=?BDEFGIIJJJKPVst| ¢¢££££¤¥§¨¨©ªª«ªª««®®¬®®®®®¯¯°°±²±±²²²²²²±±±±±±±®®¯±²±®«¬«©¦ybJ3'%%#""$$$#$ #&*%,Jbv¢¥«°±²±±²³´³³²±±±±±±°¯¬««§¨£a\WPIEDDDFEEFFFFEDBBBCDDGIJJJIGGJLLOPRSUVUSRQQRQPOLJGEFHJJJKMOPPPPSSTTTRRRSSTSRRRSSSSSSTUVª«««««««««««««««ª««ª©§¦«ªª«««««¬¬¬¬««««««¬¬¬¬«ª©ªª«««««¬¯®®®®®«¬¬¬®®¯®®®®®®®¯¯®¯°±±±±°¯¯°°±°°°°±°°¯¯¯°±±±±±±®®®®¯°±±±±±±°°°°°°°¯¯°°±²±±±±±±±±±±±±±±±±±±±¯¯°±°°°°¯®®¯¯¯¯¯¯°±±±±²³³²±±³³³²²²³´±±°°±±±±±±°°°°±±²²²²²³µ¶´´´´´³±°°±±±±±±±±±±±±±±±¯°±±±±±±±°±±¯°±¯±±±±±±±±±±±±°°°°°°°°°°°°°±±±°°°°¯¯¯¯¯¯¯¯¯®®®¯¯¯®°±±±±°°±±±°±±±±°°°°°°°°°°°°¯¯°°°¯¯®®®¬¬¬¬¬¬¬¬««««ªª©©©©ªªªªªª««¯°°°°°¯¬««ªª¨§§¦¥¥¥¥¤£££££¢¡¡ znnnkmnnqv{} }|zuqopnopqqppqtuvvuuvwyyyyxvtspnnpuyz{||{{zz{|||||||}}~~~}|{zzxvvuttrrqqqtvx{|~~~|zzzzzxuux{~~~}}}}}||{zusqqqqqqppppqstvwvtrpnmotvutttwz{zzzxxyzzzzzz{zxvttrrrrstwxxxyyzzzzzzzzyvsrsstuuuuvxz{~ }xw| ~}ytmbRB;>>CVdcbaWVUSUXZZZZYYXXXXVVTQOLJHGIIHJMPPSew~ ¡ ¡¡¢¢££¥¥¦¦¥¥¥¥¥¦§¨©©©©©©¨©ªªª©¨¨©©©©¨¨§¨©ªªª««ªª©¨¨¦¥¤¤¤££¢¡ wrld\XPG<>>>>@A?ABBA@>>>>>>?BDEEDDDEFIR\qt} £¢££¢¢£¥¥§§¨©ªªª©««¬¬¬¬¬¬®¯¯¯¯¯¯°°±±±±±±±±±±°°±±±±±¯®®°°®«««©§ raE,+! !""##$## ')'?Yk{ ¤«®°±±±±²³´³²²±±±±±±°®«««ª¤xlf^TNKKJJHGFFFFDDCCDDDFHIHIIHGHJMOPRSTUUTSSSRRQPPMJGEDFGHJKNOPPQRSSTVURQRSTTSRRRRQQQRSUVV««¬¬¬¬««««««««««ª«ª©ª¨§«©ªª««««¬«¬¬«««¬««¬¬¬«ª©©ª«««««¬®®®¯¯¯¬¬«¬®®®®®®®°¯¯¯°±±±±°¯®¯°°°°°°°¯®®°°±±±±±°®®¯°±±±±±±°°°°±±±°¯¯°°²²±±²²±±±±±±²²±±±±±°¯¯±±±±±±¯¯®¯°°¯¯¯¯°°±±±²³³²²²²²±±±²³±±°±±²±±°°°¯¯°°±²±±²³´µ¶´´´´´³±±±±±±±±±±±±±±±±±±°°±±±±±±±¯°±¯°±°±±±±±±±±±±±±±°°°°°°±±°°°°°°°°°¯¯°°±±±°°°°¯¯¯¯¯¯®¯±±±±°°±±±°±±±±°°°°°¯¯¯¯¯¯®®®®¯¯¯¯®®¬¬¬¬¬¬««¬«««ª©¨¨¨©©©©ªªª«¬¯°±±±°®¬«««ª¨¨¨§¥¥¤¤¤£¢¢££¢¡¡ |qpomnnnpu| ztqrpqrrrrrsuvwwuvwy{{{zyvspomknrvz{||{{zz{||}}}~~ ||||}}|{ywutttssrrqpqsvx{|}~~|zzzzyxvuxz~~}}}}~~|||zvsrsqqqpoonnooqrstssqonosttstux{|||}}}~~||}||zwtsqopoprtxzzzzz{{{{{|{{zxtpoopqqpppporvz~ } }|ytlcT@;AA@O_bbbZYXWXZZXXXWWWWWVVVTQPLIFEGIIJLPRUcx} ¡ ¡¡¡¢¤¥¥¥¥¥¥¥¥¦§¨©©©©¨¨¨¨§¦¦¥¥¥¦¦¦¦¥¦§¨¨¨©©ª©¨§¦¦¥¥¤¤£¢¡ ~zxcaa_ZVOF>>>>?ABBDEEDDCBBA?>>?BDDAABDEJVbot ¡¢¢££¤¥¥¦§§¨©©©©ª«««««««®®¯¯¯¯¯¯°°±°°°°¯¯°°¯¯¯°±±±±°¬¬¬«««««««©§¤t[B7) !#$%%$)$Lfr ¤§¬®¯°±±±±²³´´³²±±±±²±°¯®¬«ªª£ |kbWPNONKIGFFGFFFFGFDDEFFEFHIJJJKPQRSTUTRTTTSRPPOLJIGGHHIGJMNNPQRSSUVUQPRRSSRRRQPQQRSUVVV«¬¬¬¬««««««¬¬¬¬««©©ª¨§ª©©ªªª«««¬¬¬¬««¬¬¬¬¬««©©©««««««®¯°°¯®¬«¬®®®®®®¯¯®¯°±±±²±®®¯°°°¯¯¯¯®®®°°±±±±°°®®¯°±±±±°°°°°±±±°¯¯¯°²²±±²²±±±±±²²²²²±°°°°±±±±±±±°¯¯¯±±°¯¯¯¯°±±±±²²²²±±±±±±²²²±±±²³²±±±±±±±±±±±±²³´´µµ´´´´³²±±±±±±±±±±±±±±±±±°°°°°°°±±¯°±°±±°±±±±±±±±±±±±±°°°¯°°±±±±±°°°°°°°¯±±±±±±±±¯¯¯¯¯°¯¯¯±±±±°°±±±±±±±±°°°°°¯¯¯®®®®®®®®®¯¯®®¬¬¬««««««ªª©¨¨¨¨¨¨¨¨©ª««¬®¯°°°¯®¬¬««©¨¨¨§¥¥¤¥¤£££££¢¢¢¡ utpnmnoqu~ }ursrrssssstuvxxxy|~|xtpkihjlnruzz|}}||}}~~~|zxxyzzzzywtrqqrqqqqppqtwz{|}~}|{zzzyyxwxz}}}~~~~~}}}zvtttvutttssrnnnnoqsttrpqtuuuyyz}~~~|{yurqpnnnoruy{||}}||{{{yurpqqqrqomkiknqv} {wutlfYD?DD?IY^`_^__]]\[YWWVWWVVUVVUTQNJHEEFHJKPSV^qw ¢¤¥¥¤¤¤¥¥¥¦§¨©ª©¨§§¦¥¥¤££££¤¥¥¥¥¦§§¦¦¦§§¦¥¤¤¤¤£¥¢ wsq]Z[ZUNGAA@@@AABCFFFFDDDDBB?>>@BBA@BDFKXent ¡££¤¤¥¥¥¥¥¦¦§¨©ªª©©©©ªª««¬¬®®®¯¯¯¯®®®¯®®®¯°±°¯°«««ªª««ª«ª§§¥¢m[H=$#!"$$%$$#-Pjz¨§«®®°±±±²³³³´´³²±±±²²±±°¯«ª©¥¥¥iaUNMPOKIGEEFEFHHHGEDFFEFFGIJJJJOPQRSUTRRRQQQPONLKJJJJIHEILLMOQRSSUVUQPRRSTSSSSQRRSTVVUS«¬¬¬¬¬««¬¬¬¬¬¬¬¬««©©«©§ª©©©ªªªªª¬¬®®¬«®¬««©©«¬«ªª«¬¬®°±°°«««®®¬®¯¯°°®®®¯±±±±²±®®¯°°¯°°¯¯¯¯¯®¯°±±±±°°®¯°±±±°°°°°°±±±°¯®¯°²²±±²²±±±±²²²²²²°°¯°±±±°°±±±°¯¯°±±°¯¯¯¯¯±±±±±±±±²²²±±±²³³²±²³´³²±±±²±±±±±±±²²³³´µ´³³³³²±±±±±±±±±±±±±±±±±±°°¯¯¯°°±¯°±°±±°±±±±±±±±±±±±±°°°¯°°±±±±±±±±±±±°°°°±±±±±°¯¯®¯°°°°¯±±±±°°±±±±±±±±°±±°°¯¯®®¯¯®®®®¯¯®®®®®®¯¬««««««ªª©©©¨¨¨§§§¨©©©ª«¬®¯¯®®¬¬«ª©¨¨¨§¥¥¥¥¤££££££¢¢¢¢¡ yupnmnpqt {trtrssssssttvxyz}}ytpkkllkkotxz|~~}zxvtrttuwxyxwtspooppoqqpprtxz{|}~~}|{{zzzyxyz|}~~~}~~{wuuvvuttsrqqnmllnptuutrstvxx}}}~}zyvronnlklnqtxzz~~{zz{zwtsrrssrokhhggjpx~ zpopkh^JFGICJ[bcbbdeca^\\WWWWWVUSUUUTQNJHEDDGJKORSVho¡£¤¤¤££¥¥¥¥¦§¨©¨§§¦¦¥¤£¡¡¡¢£¤¥¥¦¦§¦¥¥¥¥¥¥£¢££££¥¢|rnmZVVVRMJGHFDEDA@ADEEEDDCCBCA>=>@A@?ADEJVbou ¢£¤¤¤¥¥¤¤¤¤¥¥§§ª©¨§§¨©©ªª««««««««««««¬¬®¯¯®®®®®¯°°¯®°«««ªª«ª©ªª¦¦§¥¡}nWM82)0JWp¬¨¬¯®±±±²³´´´³³²±±±±±²±±°¯«ª«¥¦¨¤mdWONPOKJGEEDDEHFFFDEGHGIHFGIJKKOPPQSTTQPNMOPQPMJJJJJIFEEJMMNPRSSSUWVQPQSTUTUVUSSSTUVUSQ¬¬«¬¬¬¬««¬¬¬¬¬««¬««ª©©¨¨©©©©¨©««««¬®¬«®¬««¯®¬«ªªªª©«¬¯¯°°°®¯¯°¯®®¯±±±±°¯¯°±±±±±°¯¯¯¯¯±°¯¯¯¯®®±±°°¯¯¯¯®®¯¯°°°°°°±±°±±±°°°±±±±±±²²²±±±±²³³³±±±±±²²²±±±°°°°°±±±°°°¯¯±±±±±²±±²²²±±±±±±±±²³´³²³³²±±±²³±±±±±²³³´´´³²±²²³²²²²²²±±±¯¯°±±±±±±±°¯¯®°°±±°°°±±±±±±±±±±±±±±²²²°°±±±±°°±±±±±±±±±±°°°°±±±°¯¯°°°°±±±±±±±±±±°°°°±±±±±±±°°°®¬¬®®®¬¬«««««««««ªªªª©¨¨§¦¦§§¨ª«ª«¬¬¬¬«««¬«ªª©¨¦¥¤£¢¡¢¢££££¤¤£££¢ yoonoqsz ~xsstvwvtttvvz~ }xtpnlkjjlnotz~}zywuttrqrrqrtuvvtrpnnoooqpqstvz}~~~}}~}{zyyzz{}~~}zywvvutsrqqpoooooswyyyxvvwz{| zsommnlihiilquwyz~ }~|{zyvttvvuvyytnfgfehpvz slgjlhf`PLKLT`ihdhkhdca\ZXWWWWVURTSRPPLHECCDGJMNNPS]lz ¡¡ ¡¡¢¢£¤¥¥¦¦¦¥¤££¢¡¡ ¡¡¢¢£¤¤¥¥¥£££¤¥¥¤££¢¢¢ {tmff\XTQOJJLJJJFA>>?BBBAA@@@?@A@>>>@BFEFFFQ^nw ¡¢¢¢¢¢££¤¤¥¥¥¥¨¨§¥¥§¨§©©©©©©¨¦©ª««««««¬¬«««««««««¬¬««¬¬«ª¨§¨¨¨¨¨§¦¥¥¢¢zneUMDA=5-*,.6CP\kx¡©««®²²²²³´µ´³µ´²±±±±±±±°¯®¬«©¨§¨§¡|i\PKNLLJIHGEDEHFFFFEEGHJIHHJLMNNPQSSSRQPONNNONMJJJJJIGFGHJLOPRSTTTTRPPSUTTUVVUUSSSSSSSS«ªª««¬¬«¬¬¬¬«««ªªª©©ªªª©©ª«¬«««¬®®««¬®¬««ªª«««¬®¯°°°®®¯®®¯°°°±°¯¯°±±±±±¯®®®¯¯±±°°¯¯¯¯°°°°¯¯¯¯®®¯¯°°°°°°°±°±±±°°°±±±±±±²²²±±±±²²²²±±±±±±±±±±±°°°°°±±°°°°°¯°¯¯°±²²±³³³³²²²²±±±²³³³²´³³²²²³³²±±±±²²³´´´³²²³´³²²²²²²±±±°°°±±±±±±±°¯¯®¯°°±°°±±±±±±±±±±±±±±±²²²°°°±±°°°±±±±±±±±±±±°°±±±°°¯¯¯°°¯°°±±±±±±±±°°°°±±°°±±°°¯¯®®®¬¬««««««««««««««©¨§¦¦¦¦¦¨©ªª«¬¬¬¬¬««¬¬«ª©¨¦¥¤£¢¡¡¢¢¢¢£££¢¢¢¢¡zpqnoqt~ }xuvwwvvuust{ {wtqpnljjkmntx}~|zwuttsssrsrrrstvxwusrqqqqqpqstwz~~~~~}|{{|}~~|zxwvsrpppqqqqstux{}||{zyz{}} xnkijlljijjmquwxz~ }|}}{xutwyz|}znkhfhlpry ~|ricglkmhZONPWbhihiliecb]\WWWXYXVSSRPNLIFDDDEHJLMMJK]orx ¡¢£££££¡ ¡¡¢£¢¢¢£££££££¢¢¡ zmha[ZVTQPNJIJJJHD?<;<>>??????>?@?>>?@DFDDEDMamu ¡¡¡¡¡¡¡¢¢£¤¥¥¦¦¦¥¥¦§§¨¨§§¨¨¨¨¨¨©©©©©ª«««ªªªª««««««««««««««ª©¨¨¨¨¨§¦¥¥¦¡£ }oh]SI@>?=AJXcnz¥ª«¬®±²²²³µµ´³³³²±±±±±±±°¯®¬«©¨¦§§£sdONMPOLKJJIGGIHGFEFGHIJJJJIJKMQQPPPQQQPONNNNMMJIIJJIHGHIJLOPQRSSUVTRRSTSSTTUTSSSSSSSSR©¨©ª«¬¬¬¬¬¬¬«««ªªª««««««««¬««««¬®®®®¯®¬«¬¬¬«««««¬¬®¯°°°®®®®¯°°°°¯¯°±±±±±¯®¯±±±°¯®®¯¯¯¯¯¯¯¯¯®®®®®®¯¯±±°°°°°°°±±±±°°°±±±±²²³³²±±±²²±±²²²²±±±±±±°°°°°°°°°°°°°°¯¯®¯±±²²²²²±±±±±±±±±²³³³³³³³³³³²²²²±±±²²²³³³²²³³³²²²²²²±±±°°±±°¯°°°°°¯¯¯®¯°°°±±±±±±±±±±±±±±±±²²²°°°°°°°°±±±±±±±±±±±°°±±±°¯®®¯¯¯¯¯°±±±±±±°°°¯¯°°°¯°°°¯¯®®®®®¬¬¬¬¬¬¬««««««««««««««©©§¦¥¥¥¥§¨©©ª«¬¬®®¬«¬¬«ª©¨¦¥¤¢¢ ¡¢¡¡¡¢¢¡¡¢¢¢¡ttqpsw¡ ~}{{|}|zzzzzzzzyz|zwtssqnlklmnsw{~|zxwttsssssrssrqqsvzzxvttssrrqrtux{~~~~~}}~}{yvuqpnnoqstuxz|}~||}~ }ukhhilmkjjjlortuvz~}}~~{xuutx|{tkgghikow{|~~~~zyxyzukb^cklnkcURSZbfhjikgb`_\[VVWYZXVTRQPMIFDDEDEFHJJJJATlqx} ¡¡¡ ¡¡ ¢££¢¡¡¡ pb]XSQQPPPLIGIJIGDA><;;<=>>>>>>>??>>@AGDDBECGbkt ¢£¤¥¤¥¤¤¤¥¦¦¥¥¥¥¥¦§§¦¦¦¦¦¦§¨¨¨¨¨¨©©ª««ªª««ªªªªªªªªª©©©¨§¦¦¦¥¦¤¤¡ xmbZXZWZbmw ¤©«®¯±²²³´µµµ´²²²±±±±±°°¯®¬«ª©¦§§¤¡|mVWOPQNMMMKIHIIGEEFHHHIKLJHHJLPONNOQSUPOONMLLLHHHIIIHGHHJKMOPRSSUVVUTTSSRSSSRRTSSSSSSS©©©ª««¬««««¬¬««««ªª«««««««¬®¬«««¬®®®¬¬¬¬««¬®®¯¯¯¯®®®®¯¯°°°°¯¯°±±±±±¯®¯¯±±°®¯®¯¯¯¯¯¯¯®®®®®¯¯¯±±°°°°°°°±±±±°°¯®¯°±±²³´±±±±±²±±³²²²±±±±°°°¯¯¯¯°°°°¯¯°°°°¯®®°±²³±±±±±±±±±±±±±²³´²²³³³²²±²²²²±±±±³³³³²²³³³²²²²²±±±±±±±±¯®°°°°°¯¯¯¯¯°°°°±±±±±±±±±±±±±±±²²²±°°¯¯°°±±±±±±±±±±±±±±±±±°¯®®¯¯¯¯¯¯°±±±±±°°¯¯¯¯°°¯¯¯¯®®®®®®¬¬¬¬¬¬¬«««««««««ªªªª©¨§¥¥¥¥¥¦§¨©ª«¬®°°««««ª©¨¦¥¤¢¢¡¡¡¡ ¡¢¡¡¡¢¢¡}xtsv{¢¡¡ {yvutuwy{~}{zyxvutsqppppsvz}~zyvututtttssstsrqprvz{zyxvutttsstvxz}~~~~}|~~~~~~~~|zxutqonnnqtuy{~~~}yqjhhjnnkiiijloqssty}~~~~~~zwutsvz~ }rheghiltxyzzvutstuttnb[[bjkjjh]XW\`bcghid]\[YYVVWWXWUTSSQNJFDDDDDEFGGGJ?Kerx~ ¡¡ {m_XSPNNMMLIDCDFFFEDB?=:;<>>>>><=>>>>@AGCD@ECBbjs ¢£¤£££££¥¥¥£¢¢¢¤¥¥¥¦¥¥¥¥¥¦§§§§§§¨¨¨ªª©ªªªª©©¨¨¨©©©©©©¨§§¦§§¥¥¥¤£¨§ zuxz£¬ªª«°±±±±²³´µµµ´±²²²²±±±¯¯®®¬«ªª§§¦¤¢tfcWQVPNMLKIHHJIGFEFGGJKLJHFHJMMMNPQTUPPPNLJJJHHGGHHGFGGGHJNPRTTUVVVUTSSSRRRRRSSSSSSSS««ª««««««««¬®®««««ªª««¬¬¬¬¬®¯¬¬«¬¬¬¬¬®®®®¬¬®®®®®®®®®®®®®¯¯¯°±±°¯¯¯°°±±²±°®®®¯¯°±°®¯®®¯¯°°¯¯¯¯¯¯¯¯°°±°°°°°°°°°±±±±°¯¯¯°±±±²²±±±±±²²±³²²²±±±±°°¯¯¯¯¯¯°°¯¯¯¯°°±°¯¯°±±²²²±±±±±±¯¯¯°±±³´²³³³³³²²²³³³²±±±´µµ´³³³³³²²²²²±±±±±±±±¯®¯¯¯°¯¯¯¯¯°°°°°°±±±±±±±±±±±±±±²²²±±°°°°±±±±±±±±±±±±±°°±±±°¯®®¯¯¯¯¯°°±±±°°¯¯¯®®¯¯¯®®®®®®¬¬¬¬¬¬¬««««««ªª©©¨¨©¨§¦¥¥¥¥¦¦§¨ª«¬¯±°«««ª©¨§¦¥¤£¢¡¢¡¡ ¡¡¡¡¡¡ ztuz¡¡¡¡ |xutrpqrtwz~ ~|zzz{{{zzyywvtttvy{|}}}~}zxvutuuuutttttsrrqppuz}}}|zzyxwuuwxyz|{{|||||{~~}}|}|||}~~}}|{{zxutrqonoqtvz|~~~~~}}|||zytniijmoplhhhiknqrssvzzyyz{~|yusttw| {oijkimtwxywronnprpnf\UU\ejkkkh`\\^]_bhhb\ZYXXWWVVVVUTSTSPJGEDEEEFGHHGGEL^not zrh\SNLKJJIGDA@@CCDFGD@>;;<====<;;<=>?@ADAB@FC@_hq~ ¡¢¢¢¢¢¢££££¡¡¡¢£¤£¢¦¥¥¥¥¥¦§§§¦¦¦§§§¨§§¨¨©©¨¨¨§¨©©©¨©¨¨§§§§¨¦¥¦§¦¦¥£¡¡ ¤¥¨«°¬¬®±³²±±²´´µ´´³²²²²²±±°¯®®®¬«ªª§§§¤¢yncbWYPNKJJHGGJJJHEDEGIJJIFEFGLMOPPQQQPQPOLJIJIHGFFFEDGFFFIMQTVUUUUUTTRRRRRQRRSSSSSSSS««ªª««ªª««¬®®¯¯«¬¬««ª««¬®¯¬¬¬¬¬¬«¬¬®®¯®®®®®®®®®®®®®®®®®¯¯°°°±±¯¯¯¯¯°±±±±°¯®®¯¯°±±±¯®¯¯®¯¯°°°¯¯°°¯¯¯¯°°°°¯¯¯¯¯°°°°±±±°°±±±±±±±°±°°±±²²²²²²²±±±±°°°¯¯¯¯¯°°¯®®®¯°±°¯¯°±±±²±±±±±±±®¯¯¯°±²³³´´´´´³³²³´´²±±±³³´³²±±±³²²±²±±±±±±±±±¯®¯¯¯¯¯¯¯®¯°°°°¯°°±±±±±±±±±±±±±²²²±±±±±±±±±±±±±±±±±±°°°°±±°¯®®¯¯¯¯¯°°±±°°¯¯¯®®®®¯¯®®®®®¬¬¬®®®¬¬¬¬¬¬¬««««ªªª©¨§§¦¨¨§§¦¥¥¥¦¥¦¨ª«¬°°°««ª©¨¨§¦¥¤£¢¢¢¡ ¡ ¡¡¡}ww} ¡¡ {toooonnoruz~}|zwxz}~{ywvvwyzyyzzzxwuuuvtuuuttttrqqqpoty|}~~}|{zzyyz{zz{zzzzz{{z~~~}|{zzzz{{{zzzyzzywuttrqqrtvz|}}~}|zzzzzzyywttvutrmhijnqrnhghilostttvxvttuw{~zuqsrtzyromjlrtuvtnljijjgc]UMKMWdlmkmga_^\\^ff`YWWVVXXWVVVVURRQOJGEDGGHIJJJIEHIUgknz}}~~pic[QLKJIHGEDBAAABDFGEA><<<<<;;;;;<=>?@ABAA@FDCZdn{ ¡ ¡¡¡¡¡ ¡¡¢£££¢¦¥¥¤¥¥¥¦¦¦¦¥¥¦¦¦¥¥¥¦§§§§©¨¨¨©©¨§§§§¦¦¦¦¦¨¦¦¨§¥¥¦¦¦§¨©ªªª©«®¯°¬¬¯²´³±²³´µ´³²²²²²²±±°°¯®®®¬«ªª§§§¥£¡|jVb[UQMJIIGFFHJJIFEFIHGFEEEEEKLOQRRQPQQPOLJJIIHFEEDDDFFEFIMQTVVVTTTTSQRRQQQQRSSSSSSSS««««««««¬¬®®®®«¬¬««ª«¬¬®¯¬«««¬¬®¯¯¯¯®®®®®®®¯¯¯®®®®®®®®®¯¯¯¯°±¯¯°¯¯°±±±±°°¯¯¯¯°°°°°¯¯¯¯¯°°°°¯¯°¯¯¯¯¯¯¯¯¯¯¯¯¯¯°°°°°±±±°±±±±±±±±±±°±±±±±±±±±±±±±±±°°°°°°°¯®®¯±°¯¯°±±±²±±±±±±±¯¯°°°±±²´´´´´´³³²³µµ³²±²²²³³²±±±³²²±²±±±±±±°±±°¯¯¯¯¯¯¯®®¯¯°°°°°±±±±±±±±±±±±±±²²²±±±±±±±±±±±±±±±±°°°°°°°°¯®®®®¯¯®®¯°°°°°¯¯¯®®®®¯¯®®®®®®®¬««««««««ªªª©©¨¨§§¦§§¨¨§§¦¦¦¥¥¨©ª«¯¯®¬««ª¨¨§¦¥¥¤££¢¡¡ ¡ |z ~toiefhijlnpty} ~y{xttw|~|ywvwwuvwvwxwvvvvuvvvtssrqooqporvz{}~~}}}|{|~}||{zzzzzzz|}~~~}{zzyyyzzxwwvvwyzxwwwvuuuvw{||}~~~~~~}{zxxwwutpnlilpqsrnkkknrtokhkmotxzyzzyuroqsvyz{{zuqpory ypmmkpsrtsnkjhge`[VNDCBHWdjmljfb_]]]ab\VVVUVWVVVVVVUQQPLIFDDHHIJKJJHEEDJXenxzz| {vumfb\QLKJHGEDDDBA?@BDDDB?>==<;;;;<<=>>@AA@B@@DDGSblz} ¡¢££¢¥¥££¤¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¦¦¦¦©¨¨¨©¨¦¥¦¥¥¥¥¥¤¤¥¥¤¥¦¥¥§§¨©©¨©««¬«©ª°°¯®®¯±²²²²³µµ´²±±±±±±±°°°¯¯®®¬«ªª§§§¥¤¢ pW^[PPLIIIGEDDFHHGGHJGGFEEEGHJLNPRSSSQPPONLKJIGFDDDDCDEEGJMPQUVVUSSSRRRRRQQRSTTSSRQQQ««««®®®¬¬¬¬¬«¬¬¬«««¬¬®¯®¬«««¬®®®¬¬®¯¯°¯®®®®®¬¬®¯°°±°¯¯®®¬®¯®®¯°¯¯°¯¯¯±±±°°°°¯¯¯¯¯¯¯°¯¯®¯¯°°°°¯¯¯¯¯®®®¯¯¯®®®®¯¯¯°°¯°±±±±±±±±±±±±±±±±±±±±±±±±±²²²±±±±±±±±°¯®¬®¯¯¯®¯°°±±³³³³³²²²¯°±±°°±±´´³³³³³³²´µµ³²²²³´µµ´´´´³²²±±±±±±±°°°±°°¯¯¯¯¯®®®®¯°°°°±±±±±±±±±±±±±±±²²²±±²²²²±±±±±±±±±±°°°¯¯°°°¯®®®®®®¯°°°°°¯¯®®®®¯¯®®®®®®®®®¬¬«««««««ªª©©©¨¨¨§§§¦§¨¨¨¨§¦¥¥¥§©©«¬®®¬««««©§§¦¥¥¤¤£¡¡ ¡ } ztokgccgjlkmpty} ~zzvrptz zxvvuttuuvxxwvvvxxxwtrqppnoqqoqtz{~~}~}}|{zzzzzz{|}~}|{zzyxyyxvttttuxyyxzzzzyxyz|}}}~~}zzzz{||{zzywtqkeacbflpssonnmnrtqlmosuz{wroprssttuwuroorx} {olomrssttomkhhe^XRJ?A?@L\hohjid`^]]^`[VVVUVUUVVVUUTQPMJGEDDFGIJJJHFCDFEFWnzyyz} zzytpnld`[PJJFFDDDDC@><=>?AA@?>>=<;;;<===>?@AB@D@@CDJP`kz| ¡¢£¤£¢¢£¤£££££¤¤¥¥¦§§¦¦§§¦¦¨§§§¨§¥¢¥¥¥¥¤¢¡¡¡¡¢¥¦¥¥§¨©ª««ªª«¬¬«°¯¬±°¯°±±±²²´µµ³±±±±±°°°°°°¯¯®®®¬«ªª§¦¦¤£¢e^\SNJHHHFDBABDFGHIJHHHGFGIJOOPPPQQRPPOOONLKHGEDDDDCCDEGJKMOSVWVTSSRRSSSRRSUUUTSQPPP««««¬¬¬««««¬¬¬««««¬¬¬¬¬¬®¯®««««¬¬¬¬¬¬®°±¯®®®®¬¬««®®¯±±°¯°¯®¯®®®¯°°¯®®®¯±±°¯¯¯¯°¯¯°°°®®¯¯¯°°±°¯®¯¯®®®¯¯®¯®®¯®®°°°¯°°±±±°¯°±±²³±°¯±±±±±²²±±±±±±±±°°°°°¯°¯®®¯°°°°°¯°±²´³´´²±±´µ²±±±±²´³³³³³³²²³´´µµ´´´²³´µ³±±²³´´³²±±±±±°°°°°±¯¯¯¯¯®®®®®®®¯°±±³±±±²±±²³³³³³³³³²²²²³²±±°±±±±±±±±°°°¯¯¯¯®®®®®®®®®®®¯°°°°¯®®®¯®®®®®®®¬¬««ªª««««««ª©©¨¨¨¨§¦§§§§¨©©¨§§§§¨ª«¬®¬««ªªª§§§§¦¥¤£¢¡ ¡ ~ {uqnhgebbfjmpruy} ~|zzztqloy| zxutsrqquuvvvvwxzywutqonoqstsstuyz}~~}{zzzzzz|}}||zyywvvvtrrprtvwxzz||{zz{{z{yyyz|ztutttx|}{{{yqida`bcglprstrronqpnpswz{~ xvtnssrrrrsrrlmnqx}vploprtttrqomnkbWQMGB>>@FVelkhea^^_`[VSSSTUVVVVUTRPPNJHEDDDFFGHGFDDB>>9?Ibuttty}~~}zunhfgfc_[VPKJGDD@AD><===>?A@?A>=>=;;>>>>?@AAABA@?AEKPbhox ¡¡¡¢£¤£¢¢¢¢¡¡¡¢¢¢£¥¥¥¥¥¦§¥§¨¦¥¥£¤££¤¤£¢ ¢¢¢¢£¥¦§¥¦§¨©ªª«¬¬««¬¯¯±°°±±²²²±±±±±±±°¯±±±°¯¯°°®«©©«©§¦¥¤¡u\WVPJKJIIC>@>?DHHIJLJIGFFJNPNOPPPQOPOMLMNMJHFDDDDDDDDFHJJLNSVXVUTUUTTRQPQSUVUTTUUSR««««¬¬¬««¬¬¬¬¬«««««««««¬®¯¬««««¬¬¬®¯®®®®«««®®¯±±°¯¯¯®¯®®®¯¯¯®®®±±°¯¯¯¯¯¯¯¯°¯¯®®¯°±°¯®¯¯¯®®®®®¯¯®¯¯¯¯°°±±±¯¯±±±²³±°¯°±±±±²²²±±±±²±±°°°°°¯¯¯®®®°°°°°°±²³³³³²±±´µ³±±±±±³³³³³³³³³³´µµµµ´´³³´´²±±±³³´´³²²²±±±°°°°°°°°°¯¯¯¯¯®®®¯°±±²±±±²±±²´³³³³³³³³³³³³²±°°±±±±°°°±±°°¯¯®®®®®®®®®®®®®®¯°°¯°¯®®®¯®®®®®¬¬¬««ªªª«««ªªª©©¨¨©¨§¦§§§¨©©©¨§¦¦§¨©«¬¬««ªª©©§§§§¦¥¤£¢¡ ¡¡¡ }uqnlhgedehjmquz ~}}{zz{qh`bnt}}zwtrqqpprstttuvwwvtttsqprtuvvuvvxz|~}{zzzzzz|}}|{zxxvuutronnpsttvyz|}}|||zwtqppqttoqqsvz{}}~}xpidb_`bejnqstttrpqqpsrw{{}ywvqvuttsrqpokjknt{|xrnnoqsttsrqopnc[VQJEA@@DLUcfgeba^\[WTSSSSTUTSSSRPPOMKIGEEEFFGGFEDCC>>;>BXlptuuyz} }|zuphcbbgc_[VOF@DBDA@A==<;;;<>>>>=<=<<<=>>?@AAAAABBBBDHKbhnt~ ¡¢¡¡¡¡¡¡¡¡¡¢££££££¤¥¥¤¥¦¥¥¥££¢¢¢£¢¡ ¡¡¢¢£¥¥¦¥¦¦§¨©ª«««««¬®¯±°¯°±±±±±±±±±±±°°±±±¯®®¯¯¬¬«ªªª¨¦¥¥¤¢ yb\RPIJIGGB?@?@DGIJJJHEDCDHMNLNPNNOKLLJJJLKJIGEDCDDDDDDGHIKMUVXVUTUVSSRQPQRSVVVUTSSSªª«¬¬¬«ªª««¬¬¬««««««««¬®®®¬¬«««¬¬¬®®®¬¬®®®«««®¯°±±°¯¯®®¯®®®¯®®®¯°°°°¯¯¯¯¯®¯¯®®®®¯°±°¯®¯¯®¬¬®¯¯¯®¯¯¯°°°°¯®¯±²²±²²±¯¯°°°±²²²³²²²²±±°°°±°°¯¯¯®®®®®¯°°°°±±±²²³³±±±³µ³³³²±±²²²³³³³´´´´µµµµµ´³³³³±°°±²²³³³²³³±±±±±°°°°°°°°¯¯¯¯¯®¯¯°±±²±±±²²²³´´´´´³³³³³²³³²±±±±±±±°°°±±°°¯®®®®¯°°¯¯°¯®®¯¯¯®®®¬¬¬®¬¬¬¬««ªªªª©©©©ªªª©©ª©§¦§§§¨¨©¨§¦¥¥¦§©ª«¬«««««ª©©¨¨§§¦¥¥¤¡ ¡¡¡ ysponjhfghilnrx ~~}||{{{||nbY[dnz~|ywtpooooopqsstttssrstttttwzzzyxxwyz|}~ ~}{zzzzzz{}}|{zwvuttsoljknoqrtx{}}xsmhhhhkmjjknsuuvxzytnigecddfimnqttwtrrqqttz~xvvtxzxvtsqonjhhiow{|{{zzzxtpnopqsstttstpf]YUMHCBCDEGX_ccba]XRPNNPPQSTSRRRQOMJJHFEDDDDEEFFEDDE@A>>:K\itvtwyyz~~~ xvtrnnorrld_\VOHIFIECA>@:::;<<;;=>>>>>?>>?@AAA@@>@BBCCDE_glr{ ¡¢¢¡¡ ¡¢££¢¤¥££¥¢¢¢¡¡¡¡¡ ¡¡¢££¤¥¥¥¥¥¥¦§©©«««¬®®°°¯¯¯¯¯¯±°°°°°¯®¯°°¯®¬¬¬«¬¬«ªª©¨¦¥¥¤¢ }kbPPIIGDDA@@AABEHIHIHGEDDHLNNPQOMLIHHHGGIIIHFDBBAAABBCEGIKNTVVUSSSTSSSRQQRSVVVUSRST¨ª«¬«ª«««¬¬¬¬¬«««««¬¬®¬¬¬««¬¬¬¬¬¬®¯¯®¬¬¬®®¯¯¯®®¯°±°°°¯®®®¯¯¯®®®¯¯®®®¯°¯¯°°°¯¯¯¯¯¯¯®¬®®¯°±±¯®®¯¯¯¬¬®®®®®®¯°°°¯¯¯®®°±±±±²±°¯¯¯°±²²³³³²²²±±±±±±±±°°°°¯¯®®¯¯°±±±±±²²²²±±±²´³³³³²²²³³³³³³´´´´´µµµµ´´³³²±°°±±±²²²²²²±±±±±±°¯°°°¯¯¯¯¯¯¯¯¯°±±±±±±²²²³´´´´´³³³³±±²²³³²±±±±±±°¯¯±°°¯®®®¯°°¯®¯¯®®¯¯¯®®®®¬¬¬¬¬¬¬«««ªªªª©©©ªª««ª©ª©§§§¦¦§§§§¥¥¥¥¥§¨ª«««««««ª©¨©¨§¦¥¥¥¤¡ ¡¡¡ ~ }wtssrkhhkllnsv{ ~~}{zz{||{{{|}}}xja\\bhszz}}{zwspnnoonoqqqqqrppprstttvy{||{zxwxzz{|}~|{zyxyyyy{}}|{yvutttqlhghilnnrw{|upkfcddfhfihinqonqrqnkjmnoonllklnqtxxttqpssx}~}~||wtvuz{zywvtrqmjhgkrwyxuttvvusooopqstvvuvqh`\WPLGDDDDBPY``^][VKIFHJMQTTRRRRPMJGFEDDCBBDDDEFGHHIDD?>8AJcqtruwuv{{} ukhd^XHBB@ABAE@;646:>@>@A@ACCA??@AAA@?>?ABBCDFZbjp{ ¡¢ ¢£¡¢¤¢¢¢¡¡¡¡¡¡¡¡¢£¤¤¤¤¥¥¤¤¥¥§¨ªª«¬¯¯®®®®®®¯¯¯¯®®®®®¬¬¬¬«««««ª©©¨¦¥¥¤¢ mfSQJJGDDCDCDCACFHFHJJJJIJKPQUVPMKHGHHFEFGGFDDCBA@?@@ADGILPRUVUSRRQSTTTSSSSTUTSRRSS§©«¬««¬¬««««¬¬¬¬«¬®®¯®®®¬¬¬««¬¬¬¬«®¯¯®¬¬¬®®¯¯¯±±¯¬®¯°±±°¯¯¯°¯¯®®¯¯¯®®®¯¯°¯¯¯°°°¯¯°¯°°¯¬®¯¯¯°±°¯®®¯¯®®®®®®®®¯°±±°°¯°®®¯°°°±²±±¯¯¯±±±²²²³²²±±±±±±±±±±±±±°°¯®¯¯°°±±±±±²²±±±±±²³³³³³³²´´´³³³³³´³³´µµµ´´´³±±±±±±±±²²±±±±±±±±±°°°°°°¯¯¯¯¯¯¯°°±±±±±±²³²³µ³³³³³³³³±±±²³³²±±±±±±°¯¯°°¯¯®¬¬¬¬®¯°°¯®¯¯®®¯¯¯¯®®®®¬¬¬¬¬««««««ªªªªªªªª«««ª©ª©§§§¦¦¦¦§¦¥¤¤¥¥§¨ª«««««««ª©©©©¨¦¥¥¤£¡ ¡ ¡¢¢¢~~zvtsrpmlmooptx }||||}~}|xxxxxyz||||}~~|oeb``bcltvz|~~|{zwtqpooooppponnnoooqstttvz|}||zywxyzz|}~~}zyxwvwxxy{}}|{yvuttsoiedegiknrw{ztomfcdcddbb^]bdcbeikllmqwzzwrnkjlntzzxvspomosvyzywwtusqtvzzyyyyxwvsojhjptvtrnnqtttrqpooqtvvvuqhdb\XTNHDDB@HT]]ZXVQHEDEHKORRRRSRPJGGFEEDDCBCDDFGHIIHEE>=9>>Whqqqstxyz}¢¥ |zzuo\OF@@C@B94138<>>@BCAADC@>?@AAA@@>?@ACEJLW`hnz ¡¡¢¡¢¤¢¢¢¢¢¢¢¢¢¡¢¢£¤¤¤¤¥¥¤¤¥¥§¨©ª««¬¬¬¬®®¯¯¯¯¯®®¬¬¬¬««ªªª©¨ª¨¦¥¤£ jhZULJHEEDFDEDABFIHHIJLMNOOSTWWQMJHHJJHFEEEDDDDDCA?>>?CEIMPQUWWVUTRSTUUTSSRTSRRSTTS§ª¬¬¬¬¬««««¬¬¬®¯°°¯°¯¯««¬¬¬¬««¬®¯®¬®®®¯°±±¯««¬°±±°¯¯°°¯¯®®¯¯¯®®®¯¯¯¯¯¯¯¯°°°°°°¯¬®°°°°±°¯®®®¯¯¯¯®®®®®®®¯°±±±°°±¯®®¯¯°±±²±°¯°±±±±±²²²²²±²±±±±±±°°°°°¯¯¯°°¯°±±±±±²²±±²±±±²³³³´´³´´´´³³³³´³³³µ¶µ´´´³²±±±±²²²²²²±±±±±±±±±±±±±±°°°°¯°°°±±±±±±±³³²³µ³³³³³³³³³²²²²²±°±±±±±°°°°¯¯®®¬¬¬¬¬¬¬®¯°°¯¯¯®®®¯¯¯¯®®®®®¬¬¬¬¬««««««ªªªªªªª«««ª©©ª©§¦§§§§§§¥¥££¤¥§©ª««««««ªª©©©©¨§¥¤£¢ ¡¢¡¡¡¢£££¢¢ }||}}~||zvtrpnnpqrsuz| ~|{zzzzzz{|{zywuvwxyz{}~~~|xkcbbcdciorvz{{{{ywusrqpoooonnmmmoooqrsttvz{{{}{zwwxyz{~}|zyvvuttuwxyz||{zyvutsplgcbbdhjnsx{}zvsofbccb`]YUQTWY[\ehjkmrx|{vqmjlntz{zzwqnkjjlnoonkehhhmptrstvxzzzwsnijotuspnmnrtutttrpqstttqlhhhd_[UOIDBBANY[VROLEDDDFGJKPQRRQNJFHGFEDDCCDDEFGHHHDDC;=<>9BQepqpsvvy{||} ¤¥¦¥¦§¨¤zhXLJKGF8415:===@AA?>>><==>>????>???BEJOX^cjv~ ¢ ¡£¡¡¢¢¢¢¢¢£¡¡¢¢£¤¤¤¥¥¥¥¥¦§§©©ª«««««¬¬¬®¯¯¯°¯¯®®®®®«««©©©¨§ª¨¥¤£¢ hj`XNKIFGEHDDCACFIJHIIJNSVVTTVVPLJHHIJHFDDCCCCDDB@?>=>ADGKPQUWYXWUSSTUUTSRRTSRSUVUT¨«¬¬««¬®¬¬«««¬¬®¬®¯°°±±°¯®«¬¬¬¬¬«««¬®®¬¬«¬®¯°°®¬¬®¯±±°®¯°°¯¯®®®®¯°¯¯®®®¯¯¯®®¯¯°°±°°°¯¬¯¯¯°±°¯®¯¯®¯°°®®¯¯®®®®¯¯°°±±°°±¯®°±°±±±²²°°±±±±±±±±²²²²²²±±±±±±±°°°°°°±°¯¯°±±±±²²±±²²±²³³²²³³²´´´´´³³³´³²³µ¶µ´´µ´²²²²±²±±²²²±±±±±±±±±±±±±±±°°°°°°±±±±±±±±²²±³µ³³³³³´´´³²²²²±±°°±±±±°°°¯¯®®«««¬¬¬¬®®®®¯°°¯¯®®®¯¯¯¯®®®®®®¬¬¬«««««ªªª©ªªªªªªª©¨¨©¨§¦§§§¦¦¦¥¤¢£¤¥§©ª««««ªª©©¨¨©©¨§¥¤¢ ¡¢¢¢¢£££¢££¡ ~~{zz{{|}}}{wtrqprsssw| ~}|{||}|{zzxxwwvvuuuwyz{|~xqidfefhfjmotwyzzzyxvutsqooonnnnnnpppqrrrrtwyxy{{yxxxxxyz|{|}|zvuuttttttvxxz{zzzxvtspnhdaabcfjotxz}{ywrgabb`]ZXVRRVZ^`bfhjnsy{|xtpmnptz{{}ztnljhhhhhgaY[\\behijmptxzzvrmhinrssqnnortuxyzxusrrsnjcbgkhc_[WPHCC?IRVSOJIDBBCCDEGPQRRPMJIIHGEDCCBDDFHIIHHEBB<>;=:78Kbjnrpvxz{|} ¢¤ ª¬¯¯®¯°°¯®«¥¡xi]\`^^XNC=;=@DA@>>;8778889;<=>>>>>@DILV[`htz|~ ¡ ¡ ¢¢¢¡¡¢¡ ¡¢£¤¤¥¥¥¥¥¥¥¦©©©ªª«««««¬¬¬¬®®®¯¯®®¬¬¬¬¬««ª¨¨©¨¦©¦¥£¢¡kmbYMJHFFEGEDDEEFGIJIHJPVYXUSUSOMLJGIJIHGEDDDCCCBA@>>>@CEJNQUWYYXVUSTUUTSRRSSTTUUUT©«¬«««¬®«¬¬¬¬¬¬¬®¬¬®¯°¯±°¯®¬¬¬¬¬¬¬««««¬¬¬¬¬«¬¬¬®¯¯®¯¯®®±±¯®¯°°¯¯®®®¯°°°°¯®®®¯¯¯¯®®®¯°±±°°°¯¬¬®®®°±±°¯±¯®¯°°®«¬¯¯®®¯¯¯¯¯°°°°°°¯¯±±±±±±²²±°±±±²²±±±²²³²²²±±±±²±±±±±±±±±°¯¯°±±±±²²±±³²±²´³²²³³±³³³³´´´´µ³³´µ¶¶µ´µ´³²³³±±±±±±²±±±±±°±±±±±±°°°°¯¯°°°±±±±±±±±²±±²´³³³³´´´´±±±±²²±±°±±±±±±±®®®®«««¬¬¬¬®®®¯°°°¯®®®¯¯¯¯®®®®®®®¬®®¬««««««ªªª¨©©ªª©©¨©¨¨¨¨§¦§¦¦¥¥¥¥£¡£¤¥¨ª«««««ª©¨¨¨¨©©¨§¥£¡ ¡¡¡¢££¢¡££¡ ~~}{|}}~~~|wsrsstutty ~|zzzz{~~|zywvttttuvvxz}~}tlhehghihjknruwxxyxwwvutqooonnnnpqqppqrrrqsuvuwzzxyxwvuuvxzzzxusrsrsssstvxxzzzzyxutrnkgb``bbfkpuyz}~|{ztg`bb_\YVUSQSX]`cfhlqw{}}|zwsooqtxzz~}tnijjkihed^TVVU[^_bdhlqtwxsojghloqtsqpqrtt{}}zvsrpkc\[cihhca_WJB@@ELPPLJIDBA@ACFJPQRQPMLLJJHFDDCCDDGIJJJJHCB>?9;<<*0J\ktppqtvyz}~ ¥©¦¤¥¥¥¨«®®®°±±±³²¯¬©¥rnrqqph`WOEAAC@>=:5343445789;>?@@ADGJRV]htzz{ ¡¡¡¡¡¡ ¡¢£¤£££¤¤¤¤¥©©©©©ªªª««¬«««¬¬¬¬¬¬¬«««««««ªª«©§¨©¨§§¥¤£¢¡ npaYMIGEFDEIHHJJHHJIHGJPVWVVSTSONOLJKLLLKJGHFEDDDDDA@?ACEJMSVYZ[[YWUUVVUTSSQSUUTSST«ªª«««¬®¯®¬¬¬°®¯±±±°°®¬«¬¬®®®®®®®®®®¯¯°°°°°°°°°°¯¬¯±°°°°¯¯®®¬®®¯°°±±±±±°®®®®®®®®®°¯®®¯¯®®¯¯¯¯¯¯¯¯°¯¯¯¯°±±±°¯±±±±²³³²²±±±±²³³³²²³µ³³²±±±±±±±±±±±°¯±±°°°±±²±±±±±±±±±²²³³²²²³³³´´²²³¶¶¶µ´´´µ´´´´´´³³±±²²²²±±±°°°±±±±±°¯¯¯¯¯°±±²²³³³³³²²±±±³´µ´³³³³³´²²²²²²²²²²³²²±°¯®®®¯¯¯¯¯¬¬¬¬¬¬¬¬®®®®®®¯¯¯¯®®¯®®®®®®®®®¬¬««««««««ªª©©¨©©ª©¨§§¦¦¥¥¥¥£££¤¤¤¥¥¦§©ª«««¬¬ª¨¨¨§©¨¦¥¤¢ ¡¡¢¢¢£¢£¢¢ ~~}~~|}~~}}~}zxvuutwxy{ }{zzywxz{~{xyvttttvy}zsmijkmnoooopqtuwwwxxwvttsrpoopqrssttsrrssrrrstsstvttttrrqrvvtspopqqstuuuwxzzyxwutsrolifb``cfhjoqrtxz}~~|{{xkcdb_\\XZ[\_aceihjmov}}~{ywustuvyzz||vonijmlifb_WRTVSPPRXennsvtlfbbcdjsstutsttt{~zwtspg^WV\dhfegb^[LBDEIJIJHC@?>>@CFHMPPPOOOOPMJHFEEDEFHJJJJJIFDA?>;9;9:BRgnhjprqtxy{~~ ¥©««ªª©§«®±±±²´¶¶´±°¯°±±§ }o`YHILIC>;:8656547847@CBBBDEHJNU\cmsw| ¡¡¡ ¡ ¡¡¢¢¡ ¡¤¥¦¨©©©¨§¨¨ªªª««««¬ª««««««««««««ªª©©¨§§¨¨¨§§¦¥¢ {maYPJGDCDDHIJKJJJKMKJKORTUTSRQPONOLLMMMKJJIGEDDDDDBBCDDGJLSVY\\\[XVUTTTTTTSSSSRQTXªªª«««¬®¬¯¬¬¬¯®®®®®¯±±±°°®¬¬¬«¬¬¬®¯¯®®¯¯¯®¬«®®¯¯¯¯¯¯¯¯¯¯¯°°¯¯°°°°°°¯®¬¬®®¯¯¯°°°±±°®¯¯¯¯¯¯°°°¯®®¯¯¯®¯¯¯¯¯¯¯¯°¯¯¯¯¯°±±¯¯°±±±±³³³³²²²±±³³³²²´µ³³²±±±±±±±±±±±±°±±±±±±±±±±±±±±±±±±²²³³³³³³´´³±±³¶¶¶¶µ´´´´´´´´´³³±²²²²²²±±°°°±±±±±±°°°°°±±±±±²²²²²²²±±±³´´³³³³³³³²²±±±±²²²²³³²±¯®¯¯®®®®®®¬¬¬¬¬¬¬¬®®®®¯¯¯¯®®¯®®®®¯®®®®®¬¬««««ªª««©©©©¨¨©©©¨§¦¦¦¥¥¥¥¥¤£¢£¤¥¥¦¨ª««««««©§§§§§¦¥¥¤¢ ¡¡¢¢¢¢£¢¢¡~}}~~}~~~~}zyxwvvxz| ~{ywwxyz| |zwutvxzz|}xpljlnprtttsssstuvvwwvuttsrqppqstuuyzzyxxvtttsrqpqssrrponooqrrpnnoqqstuvwyzzyxwvutsqnkheb``bdfhmnoruwz||{{{|qjhebbbddfhloqromnnotz||zxvtstuwyzyyytnjhknmkigfaYROPRUTW_fkproic__`bhpstvwutssz}|ytqlf\TRW^cdbdehdO>DDGHGIGC@?=<>@DFMOPOOPQRSQPMKJIHFFGIJKKJIFDA?=:87578>Nakhpttuvvy{{} ¦ª¬¬¬¬«««±µ¶¶µµ´²±¯®¬®¨zjbOLNFFEC>8666899:<>CDDCCDFHJMSZbjotz ¡££¢¢££¤¤¥¥¨©©©¨§¨¨¨¨©ªªªªªªª«««««««ªªªª©©©©¨¨¨¨¨§§§¦¥£¢ }n`VOJGCCDCDEGHIJLMNLKLOQSSRQPOOOONMMNNONLJHGEDDDDDCCCDDGJLQUX[\\[YUTSUUTTTSSTTSRUW©©««««««®¬¬«®®®¯¯¯¯°°±°±±¯¬®¬«¬¬¬¯¯¯¯®¯¯°¯¬«¬®®¯¯¯¯®¯¯¯¯¯¯®°¯¯®®¯°¯°°±°¯¬¬¬®®®®®¯¯°°°°¯¯¯¯¯°°°°°¯®®¯¯¯¯¯¯¯®®®®®°¯¯¯¯¯°°±°¯±±±±±´´´´³³²±±²³³³³´µ´³±±±±±±±±±±±±±°°°±±±±±±±±±±±±±±±±²²³³³´³´µµ³±±³µ¶¶¶µ´´´´´´´´´³³²²²²²²²²±°°°±±±°±±±°°°±±±±±±±±±±±±²²±²³³²²³³³²²²±±±±±±±±±²³³²±®®®®®®®®®®¯¯®®®®®®®®¯®®®®®¬¬«««ªªªªª¨©©©¨¨¨¨¨§§¦§¦¥¥¤¥¥¤¢¡£¥¥¥¦¨ª««¬«««©§§§¦¦¥¥¥¤£¡ ¡¡¢¢¢¢¢¡¡~}}}}}}}~~~|zzyxxy{ ~|zwuvy{ |zwwxz~ }ztnkmnqtwyzzywutttuuvuuuttssrqqrtvxy}~|zwtqponnooonmkklmmnnnmlnnrstvwxz|zyxwvtsqnligca__`cdfilmprtwyzz{}~xsnihllnnnquyzzvqoporx{{zywttuyzzzxvtqmlmqtsrsqhgd_WPPTSVX^ioonic]]_bhnqqsttpprxz|}{wqlhdXOOQV_`_dhnmYJFEFHHHGD@>;:;?DGLNOOOPRSTSQPNLJIHGGIKMLJHFDA?=98734408Obbjnnnosxwxz{}~~~ §©«®®®¬¯°±²´µ¶·µ´²±°®¬«®©¡¡¥ªxrc^WNJEDB@>=8<=;>DIHFEDCDEGHKOU^gjpz} ¢£¤¢¤¥¥¥¥¥¥§¨¨¨§§§§§¨¨©©©¨¨ª©©©ªª««©©©¨¨§§§¨§§§¨§¦¥¦¥¥¤¢¡ ~n_TPNJDDECCCDDFJMPNMLLNPQQQOMMOPONNMMNOOLJFEDDDDCCBAAABEIKPSWZ\\\ZVTSTTSSTSSTUSSTV¨©«««««¬«¬¬¬«®¯°°¯¯¯°±±±±°¬¬«¬¬®¯¯®®®®¯¯®®¯°°®¬¬®¯¯¯¯®®¯°°°°¯¯¯¯¯®®®®¯¯°±±°¯¬«¬®®°°°±°¯®®®®¯°°°°¯¯¯¯°¯¯¯®®®®®®®¯¯®®¯¯°°±°°±²±±²´´µµ´³²±±±²³³³³³³³±±±±±²±±±±±±±±±±±±±±±±±±±±±±±²²²²³³³³³³´µµ²±±³´µ¶¶µ³³³³³´´´³³³²²²²²²²²±±°°±±±°°°°°¯°°°±±±²²²²²±±²²²²²³²²²³³²²±±±±±±±±±±²³³²°®¬®®®®®®®®¬®¯¯¯®®®®®®®¯®®®®®¬¬««ªªªªªª¨©©©©¨¨§¨§§§§§¦¥¥¥¥¤¢¢£¤¤¥¥§©««««««©§§¦¥¥¥¥¥¤¤¢¡ ¡¡¡¡¡¡ ~}||{zzz{|~}|{zzzz}~}}{zyz |zxvvy}~|{z|~ ~zvrnnprtx{}~~|zwuuutvvuuttsrrqprtxz{|wtonnnnnmljhhhijkllkjijkstuvwyz{{zyxwtroligdb_^_`cdeikmprtuwxz{}}zwsnqtttrqruxzzzrpqopvzzzzyvvz|}~|xtronmnsvuuutljmohZQPTWW\hnmoid`_bdhijhhihfhnstvvvtnhfcVKMNPY[^finphbKGGHHIHDA>;9;?EIKNOOOPQQSRPOMKIHIHHIKLKJGECB@>;8944512>JR\cfhkotrtwyz{~~~~}|}|||}~ ¢¡¢¥««¬¬«¯°±²´µ¶·²±°®®®«««««ª©©«ª|pePOIC@??=;=>>>@GKIGEDBABDDGINXbhny{ ¡ ¡¢££¡¤¦¦¥¥¥¦¦§§§§¦¦¦¨¨¨¨¨¨¨¨©©¨¨¨©ª«©©¨§¦¥¥¥¦¦¦¦¦¦¥¤¥¥¤¢¡|m`SRQMGGGDDCBBDHLPMLLLMNOPPOMMNOONLKJLMMJHDDCCBBA@?>>>@DILPTWZ\]\[XVSRRQRSRRTTSSST¨ª«««««¬«¬«¬«®¯°°¯¯¯°±±²²±««¬¬®¯¯¯®®®®¯°¯¯®®¯°°¯¬®¯¯¯¯¯¯¯°±±±°°¯¯¯®®®®®°°±±±¯¬«¬¬¯°°°¯®¬®®¯¯°°°¯¯¯¯°°¯¯¯¯®®®®®®®®®¯°°±²±±²³³²³µµµµµ´²²°±±²²²²²³²±±±±±²±±°±±±±±±±±°°±±±±±±±±±±²³³³³³³³³³´¶µ²°±³³´µµ´²²²³³³³³³³³²²²±±²²²±±°°±±°¯°°¯¯¯¯°°±±±±²²²²±±²²²²²²±²²³³²²²²±±±±±±²±²³³²°®®®®¯¯¯®¬®¯¯¯®®®®®®¯®®®®®¬¬««ªª©©©©©©©©©¨¨§§§§§§§¦¥¦¥¥¤¤¤¤¤¤¥¦¨ª«¬¬¬¬«¨§¦¥¥¥¥¤¤¤£¢¢ }|{zzxxyz{~~~~}|{{{} ~{yxutsv| ~zwtvy} ~}| }xtqqruwz||ywuttwwvvutsssrrsuz|~|wsonnmlkihgdcdfgjjkjhhhittvxz{|~~}{zxuqnkheca__abefhkmnrttuuvwz||zzxtwzwwvtttwz|{trsppuyzzzxwy||wrpootsvyyzytsqpqph]VW\\`ghhmhgcbdgfda]\]\\`gnnopqqnkebTJKKLTV\gikonoPJFGHIIGC@=:<@EIJMPPPPPPSQOMKJJIIIJJJJJJEDCBA?>;:5354454?KXbikkmosvxyyz|~}}~~|||zzzz{|~~ ¤§§§©«¬¬««««¨¬²µµ²°¯¨¦¥¥¥§¨©«ªª«¬«ª¨®ªnRIJJF@<;;>;>ABDHFEDB@>>?@CCFQ^emw~ ¡¡ ¡¢¢ £¥¥¥¥¥§¦¦§§§§§¦©¨§¦¦§¨¨©¨¨§¨©ªª©©¨§¦¦¦¦¦¥¥¥¥¥¥¤¤£¢¡ |mbTSROJIIFGEB@AEILKLLLMNOPPPONMMNNKJIJKJHEDDCBA@?>>>>?BFJNPTWZ\\\ZWVTSSRQRRSTTTTSS©ª««««¬¬«¬««¬«¯¯¯¯®®¯¯²±±±°««®¯¯®®®¯°±°¯¯¯°°¯®¬®®®¯¯¯¯¯°±±±±±±°¯®®®¯¯®°°±±°¯¬«¬¬¬®®®¯°¯®¬««®®®¯¯°°±°°¯¯°°°°¯¯¯¯®®®®®®®¯¯°±±²±±³´³³´µµµµ´³²²±±±±±±±±²²²±±±±±±±°°±±±±±±±°°±±²±±±±±±±±´´´³³³³³´´µµ³±±²²³´³²±±±²²³³³³³³²²±±±±²²±±°°°°°¯°°°°°°°°°°±±±±±±±±²²±±²²±²²²²²²²²²±±±±²²²²²²±±¯®®®®¯¯¯°°®®¬¬®®®®®®®®®®®®®®®®®®®®®¬¬««ªªª©©©©©©©©¨¨§§§§¨¨¨§¦§¥¥¤¥¥¤¤¥¥§©«¬¬¬«¨§¦¥¤¥¤££££¢¡ }{zzyxxxy{}~}|{|~~~}||}|zvsqpoptz {xvtx}~}~ {wttvx{|~|ywvuuyyxwvutttttux{~ vsonnkihfecb`abdhiihhhijstwz}}|zwsokheba`abehhjnpqtvvutstvy{z{{zzzxzzxvvy||wuusrtvvwwuuy}}ytonop{z{~|wtvtptwm\[^bdhhimkmljklhc\\[[YX\akmnmmmljebVKJIINTYdhlnjiVLFGHIJJCA><=@DFJMPPQQQQRPMKJJJJHJJJJHHHDCBBBA@>;743122/6@JU^bcgnrvxwwyz|{{|}|{{zzyyzz{||~ ¤©«««¬¬«««©¨¨¦¨©©¦£ ¡£¥¦§¨¨¨©ª¬°¬¤}fIHDBBDDD=7<DDDFEDCA?>>>>AADLXais ¡¡ ¡¡¡£££¤¥¦¦¦§§¨¨§¦§§¦¥¥¦§§¨¨§§§¨©©¨¨§§§§¨¨¦¥¥¥¥¥¥¤£¢ }ofYTRPMKKJJFB??CEHJKMMMNOPOPPONMMNMKJIJIGEEDCBAA@?>>@ADGJMPSVY[\[YUTTVVTRRTTUUUUTS©««««¬¬«¬«ª¬¬«¯¯¯®®¯±±±±¯¬«¬¬®®®®°±±°¯¯¯¯¯¯¯®®®®®®®¯°°¯¯°°°±±±°¯®®¯¯¯¯¯°°¯®¬¬«¬¬®¯®¯°¯®¬¬®¯¯¯°°±±°°¯¯°±±°¯¯¯¯¯®®®¯¯¯¯°°°°±°±²³³³´µµµ´³³²²±±±±±±±±±±²²²²±±±°°°°±±±±±±±±±±±±±±±±±±±´´³³³³³´´´´´³±±²³³³³²±±±²²³³³³³³²²²±±²²²±±°°°°¯¯°°°°±±±±¯¯°±±±±±±²²²±±±²±±±±±±²²²²±±±±²²²²²²±±°¯°°°¯¯¯¯¯®®¬¬¬®®®®¯¯¯®®¯¯¯®®®®®®®®¬¬«««ªª©©©ª©©¨¨¨§§§§§¨©©¨§¦¦¥¥¥¥¥¥¥¦¨ª«¬®¬«©¨¨§¥¥¥¤¤££¢¡ ~}{zzyyyyzz|||{zyyz|~~}}~ ~zwtqnnmmnsx}|ywvvz {xwy|~ {xwwwxzzyyxwvuvvvwz} |tqonnkhhdcb`__abhhhgfgikrtx{~|ztqigcb`_abhiilqttuvutpnortxwz|zzzyzywvwy{}{yyxttutstsrtx|~}ztomlnq{z{}}~ztptuuz}tfbaeikmopptutttnh^_^\XXZ]dhkkihhggbZPHEGJTWaglnhf\OFEDEGFA?>>>ADFKNPPPPQPOMKJIJJJHIIJJHFEDCAABBA@<853112249>DKQW]djopqsuxzyyz{zzzyyxxxyzz{|}~~~~~ ¢¤£¢£¥¨ªª««¬«««©¥¢ £¥§ª«®«®¯ªtmbVSX_`\F>@FCCFEDCBAAAAACDEJRZcmy} ¡¢£££¤¥¥¥¦§§¦¥¥¥¥¦¦¦¦¦§¦¦¦§§¨¨§¦¦¥¥¥¥¦¥¥¤¤¤¥¥¥¢ sg\SPPNLLKJGC?@BEGIJLMLLMOMMMNOONNNLJIHGFEEDCBAAAA@ACDEGIJPSVX[\[YVUUVVUSSUUUTUVUSª««ª«¬«¬ª©«««¯¯®®¯°¯¯°®¬«¬¬«««®¯¯®®¯°±°¯®®®®¯¯¯°°¯®®®¯°±¯¯¯¯¯°°±±¯®®¯¯¯¯¯¯¯®®¬¬««¬¯°®¯°°¯®®®®®¯¯¯°°°°°¯¯°±±°°°¯¯¯®®®°°°°°°¯¯°¯°±³³²³µµ´³³²²²²±±±±±±±±±²³³²±±±°¯¯°±±±±±±±±±±±±±±±±±²²´³³³³´´´´³³´³²±²³³³²±±±²²²²³³³³³²²²²²²²²±±°°°°¯®¯°°°°°°°¯°±±±²²²²²²±±±±²±±±±±±±²²²±±±±²²³³²²±±°°±±±°°¯¯¯®¬¬¬®®¯¯¯¯¯¯¯¯°®®®®®®®¬¬«««ªªª©©ª©¨§§§§§§§¨¨©©¨§¥¦§¥¤¤¥¦¥¦§©«¬®««ª«ª¨§¦¥¥¤¤¢¡¢¡ ~~}{zzzzyyzzzzzzywwx{~~~~~}zvspnnmlmnrw|}zvttvx~ ~{zz} {xwxzzzzzzyxxwwvvxz}}wrponnnkihcbb`__abhhhfefhjstx|~{vsheb`^^`bhjjmsutuvtrnllnqtty|zxzzzwutvxyxyyzxuvvspqqpsw{|{wrnklor}|~|vqptz~ztrkginnqtqtxzxxxsk`a_YVVWZ[aghhggghd^SGDGJTV`einjj_PDB@?@?>>>>ADFHMPPPOOOONLJJJJJJHGGIJIFDDBAABBBA=6441012169<BFLSY_dghlqtxwwyzzyyvvuuuvwxwwxz||{z~~~}||| ¤ ¢¥¨§¦§©««««®«««§¡ ¢§ª«¬©«¬¯¨ ykbbb`[XMJG?>DACCCDDDDDDHIINV_hqu{ ¢££¢¡¤¤¤¥¥¥¥¤¥¥¦§§¦¥¥¦¦¦¦¦¦§§¦¦¥¤£¢¢¢¥¤£¢££¤¤ ue\PJMLJJJJGC@ADFHHJKLKJKLJJKMPPONOMKIGFFEDCAAAABBDEFGHHIJPSVY[\\[ZVTSSSTVUUTSTVTR¨¨©ª««««««««««««®®®®®®®®°®®®®®¬¬¬¬¬®°¯°°°°°¯¯¯®®®¯¯°°¯®®¯¯®®¯°®®°±±°°¯¯®®®®¯°±°®®¯°®®®®¯¯¯®¯°°±°°¯¯¯¯¯¯¯°±±±°¯¯°±±°±±±±°¯®®®®®®®®¯¯±±°±±²²²´´²²±²²³±±±±±²³´³²²²²³²±±±±±±¯°±±²³²±°±±²±±²³´´³¶µ´³²²²²³³³²±±±±±±²²²²²±²²³³²±±³´²±±±±±±±±±±±°°°°°°°±±±±±±±±²²³³²³²±±²²±±±°±±²±±±±±±±±±²²±±±±¯¯¯¯°°°°°°±®®®®®®¯¯¯®®¯¯¯®®®¬®®®®®¬¬«««ªª©©©¨¨¨¨¨©©©¨¨¨©ª©©¨¨§§¦¦¥¥¦§¨ª«¯¯¬¬««ª©¨§§¦¥¤¢¡ ~|z} ~}{zzzzzzzzzzzzyxxy{}~~~ {xuusnlmlnqtxzzzzvtrqpu{ ~~ }zyyzzz{z{zxxxuvvwxyz{{{|{zztlkijlnmkiigebbbccdhhhfefhkrvz{|~{unhc\Z\[^behjjknqonmkiimqttvxxvwxutrrstuvuvrttrtrnnprttvxvolmnmpv|~}ytnotz~|zztsqrtvwxyyz{zvqnhkgeb[ZYYXY\acddfhfbE?DBPYbfhjll\UG??>;:;>ACEEGMPPPPPPPPMKJIIIIIEFGGGFEEDCAABBA@<841121145668986FPV[hmlqtuuuvxxvuutttttttuvwwwwxz{zy|uzz}ª¨§§©«¬¬««««¬®«®«§¤¢ ¥©«¨®¬ ~zsmke_YRKIJEFGFEDDDEFIKNS[alswz ¡ ¡¡¡ ¡¡¢£¤¥¥¥¥¥¦¦¦¦¥¥¥¥¥¥¥¦¦¦¤¤££¢¡ ¡£¤£££¢ tcWJKLGJKJKJHEEGHGJHGHJJKLPMLPSTRQPMJHGGFFFEDA@@ABFGIJJKKLNPTX[\\\YWVVUTTUVUTSSSSS¨©©ªª««««¬¬«««««®®®®®®®¯¯®¬¬¬¬¬¬®¯¯°±±±°¯¯¯¯¯¯¯¯¯¯¯®®¯¯®®¯¯®®°±±±±±°°¯®®®®¯°¯®®¯®®®®¯¯¯®¯¯°°°°°¯°°¯¯¯°±±²±±±±±±±±±±°°¯¯®¯¯¯¯°°°°±±±±±±±±³³³³³²²²±±±±²²³³³³²²³³²²±±±±±°±±±²³²±±±±²²±²³´´³³³³³²²²±³³³²±±±±°±±²²²²±²²²³³±²³²²±±±±±°°±±±±°°°°°°°°±±±°°±±±±²²²²²±±±±±±±°±²²²±²±±±±±±²³±±±±¯®¯®®¯¯®®¯°¯¯¯®®®®®¬®®®®®®®®®®®¬¬®®®®¬««««ªª©©¨¨¨¨¨¨¨¨©¨§¨¨©¨§¨§§§¦¦¦§§¨ª«®¯°®®¬««ªª¨§§¦¥¤£¢¡ |zz{ ~~}|{{|||{zz{{{{zzzz|~~~~~ zyusrpmlmnnpsuwwvtqoooqv} |{|}~~~}{{zuttpsssrrstttusrpibaccfhhhghfdcbcdeehhgffgilruz{{}{vpid[VVUYVXYXXY\^`abeginrtttttsrrrqppqrssttoonmnlllnrttuvspnmnsvz~~}zvrnosy{zz{xwvwyzzz{z{{zuqolpoojb`ZVUUX\`behhhgKCFDLVbikmno_VF<;;:;;>@CEFHMPPPPPPPPMLJJJJJIGHHHGFFEDCAAAA@?>:64454356557988=CDIYchnrrrrtuuttuutspnmnnnqtuttwzxuzu{|}£¤««ªª«¬®¬¬¬¬ª¥¦£ ¢ª««®®§¥¡wof\UROJFDCDDCFIKNPS[ahntz| ¡¡ ¡¢¢¢££¥¥¥¥¥¤¤¤¤¤¤¥¥¥¥¥¤¤£££¢¡¡¡¢£¢¢¢¡ rbXKLKFJJJMLKIHIIIHFFHJJJKOMMPQRQPPNKIHGFFEDDBAABCGHIJJJKKLORVZ\\\YWVUTSSUVUSSSSSS©©©©ªª««¬®¬«ª«¬¯¯®¬¬¬¬««¬¯¯±±±°¯®®®¯¯¯¯®®¯®®¯¯®®°®¬®°°°±±±±°¯®®¯¯®®®®®¯°°¯®¯¯°±±±°°±°°¯¯°°±²²±±²²²²±±±°¯¯¯¯¯¯¯°°°°±±±±±±±±±²³´´´³²±±±²²³³³²³³²²³³²²±±±±±°±±²²³²±±±±²²²²³´´³±²²³³²±±²³³²±°°°°°±±±²±±±±²³³²²³²²²²²±±¯¯°±±±±°±°°¯°°°±±°°±±±±²²±²²±±±±±±°°±²²²±²²±±±±±²³±±±°¯®®®®®®®¯¯°¯¯®®®®®¬¬¬®®®¬««««ªª©©¨¨¨¨§¨¨¨¨¨§§§§§¦§§¦¦¦¦§§¨©«¬®¯¯¬««ªª¨§¦¥¥¥¤¤¢¡~{yxz}~ }}|||}~~~}}~~~}||}~~}||{} zvspponnorqqsttsqnlkmnrx~~{z{ }{{} |zwrpnkjhhggghhhihggb\\]^`bddegedddefgghhhghilnquyz{|~~}~}|{{xtqicZSQPUTUSOLLLLPTZafinrqonnnnmnoooopqqqppkkifhehhmruuttoonnqx|}~~}{zxtqpoquxyz|{{{{}~}|}||{ytrqptuunjh\USSUX\adgghhPEGEIR_hkjln_VE:8878:=>BFIJNOPPPQPPPNLKJJJJJJIHGFEEEDBAAAA@?><888875654458878869IU[bjklllljhlnppnkihhfcejnppqtsornwz ¡§©¬®°¯¬®«¨¡ ¥§©«¨¬««¬««ª¡znebTOJGGEB>BEJNPRX^`bhrxz} ¤££¢¡¡¡¡¢¢¢££¤¤¤¢¢££¢¢¡¡ ¡¢¡¡ naUJJHDHJJMOOLJJJJFFFHJJKLPNNOONNOOMJIGEDDBBBA@@BCFGHHIJJKJMQVY[\\YWVVTSSUUTSSSSSSªª©©©ª««¬«ª«¬«««¬®¯¯¬¬¬¬«««««®¯±°¯¬®¯¯¯®®®®®¯¯®¯°¯®¬¬¬¬°°±°°®¬®®®®®®¯¯°±±¯®¯¯°±±±±±±°°¯°±±±²²²²²²²²²±±°¯¯¯°¯¯¯¯¯¯¯¯±±±±±±±²²³´µ´³²±±±²²²²³³³³²²²²²²±±±±±±±±±²²±±±±±²²²²³³³³±²²²²²±±²²³²²±±°°°±±±±±±±±±³³²²´²³³´´³±°¯°±±±±°°¯¯¯¯¯°°°±±±±²²³³²³²±±²±±±±±±±²²±±±±±±±±±±±±±°¯®¯®®¯¯¯¯¯°¯®®¬¬¬¬¬¬¬¬¬®®¬««««ªª©©¨¨¨¨¨¨¨¨¨§§§§§§¦§¦¦¥¥¥¦¦§©«¬®¬¬¬««ªª©¨¨¦¥¥¥¥¥¢¡}zxwy|~ }||||~~|{zzz|}~}}}}~} {xtqoprstvutstttqnjiilosx|{zzz }}~~}}|zuomkh`]\\\\^a`bbbb`\]\\^abbcfeeffgghhiiiijloqrtxzz{{zz{zxvtronf`WQPPUVWVQMKJGKPZbhlnpnifegikmnnoqqqpplmhgebdbcejquvtrmnnnsy~}|{zywusrpqtvxz|}~~~~}{||{zwtrrsuvunnn`WVTTVZ`dfdefTEFDDIS\`^^`YRE<9878:=>BHJLPPPPQRRPPMLKJJJJJJJHFDDDDCBAAA@@?>=:99876543346655525@GJNOTZ_cfhihkmliecbda^^bghilnnlmgt~ ££©«¬®®®®°¯®®ª¥ ¦«¬«ªª«°±±±¬¥~wng`XNGFFHLPQUXZX\htzzx¡ ¡¡¡¡¢¢¢¢ ¡¡¡ ¡¡¡ zi`UMLHDHJKLOPOKJJJHHHJJJLNQPNNNMNONLIFDB@@?@@@@ACDDDEFGHJLKNRVZ\\\[YWVUSSUTSRRSTSSªª©©©ª««¬¬««««ªª««®®¯¬«¬«¬¬«««««¬¯°°¯¬«¬®¯¯¯®®®¯¯¯®®°¯®¬¬¬¬¬°°°°¯®¬®®®®®®®®¯¯°°±±°¯¯°±±²²²²±°¯¯±±±±³³³³³³³³²±±°°°°°°¯¯¯¯¯¯¯°±±±±±²³´´´´´³³²²±±±±²²³²²²²²²²²±±±±±±±±±±±±±±±±²²²²²²³³³³²²±±²²²²²³³²±±±±±²±±±±±±±²³²²³²³´´µ³±°°±±±±±°¯¯¯¯¯¯¯°°±±±±²²³³²´´³³³²±±±±±±±±±±±±±±±±±±°°±°¯¯°¯¯°¯¯¯¯°®®®¬¬¬¬¬®®®¬¬«««««ªª©©©©©¨¨¨¨¨§§§§§§§¨¨§¦¥¥¥¥¦§©«¬¬¬¬¬««ªª©¨¨§¦¥¥¥¥£¢ ~zyxz} }|{{|}{zzyy{zzz{{zzzyz| ztpqportwz{ywuuutpmiijlortvtwzzzz{} }}}} {volid\VSTVVX\\___`^\\\]^`_`bdefghhhijkkklmnprrtwxyzyxxxwtqmigf]XRPPPVVWVRNKJJLR\flnnomf_\^bgijlnpqponjjdcb`ccbdhottqpmlmqtxz~}{zzyxwvutttvxz{}~~}}}|zzyywusrtwwwtnoqbZXVVW[afhedcVFFD?@EMQQPQPKC<;:89;>?CILNPPPQSTSQPLLKJJJJJKJHFEDCCCB@@???>>=;:9875543455421236:==>LPUVVV[_fghfb][ZVVVVVWXX`abdd\n£¥¥«¬¬¯¯®®®¯®¬ª£ ¦ªª«ª«¬®¯«ª¤zuoieXQJKNPRTVVYbozzv| ¡ vhbZUSKGIHJJMPNKJJJJJJJJJLPQNKKMNOPOLIDA>>>>?@@ACDEEFHHIJKNOQUX\\]][YWVTRSUSSRSSTTT©©©©ªª««¬¬¬¬«ªªªª«®®¯¬¬¬««««¬¬¬««ªª®¯°°¯¬««¬®¯¯¯®®¯°¯®°®®¬¬¯¯°°¯¯®®®®®®®®¯°¯¯°°±°¯°°±±²²²²±°¯¯±±²±³´´´´³´´±±±±±±°°±±±°°°°°¯°±±±²³´µ´´³³³³³²²±±±±²³²²²²±±±²²±±²²±±±±±±±±±°±±²²²²²²³´³²±±±²³²²±²²³²²±±²²²±±±±±±²³²²²³²³³³²±°±±±±±±°®¯¯¯¯¯¯¯°°°±±±±²²³´µ´´´³±±±±±±±°°±±±±±±°°°¯¯°°°°±¯¯°¯®®®¯¯¯®®®®®®®¬¬¬¬¬¬¬««««ªªª©©©©©©©¨¨¨¦§§§§§¨¨©¨§¦¦¦¦¦¨ª«¬¬¬®¬¬¬««ªª©¨§¦¥¥¥¥£¢ {zz| }|{{} }|{zyxxxxywutuutttvy} |wtqnppqtwz|}zzyxwtpmjiiknopprtuwxz~ }{{}}}~xpkhb\TNOPPRUW[\\^]\\]]^^]]_beghhhhjllmmnnopqrttuwxxvwvurnhb][SPMLOPX\\\VOHILLR\gmnnnmd\WW[_behkmnmlkih`\\\cfffhknnllmknruvxz{zzzyxxxyxwxyzzzz{{zz{{zvutttsstwwtrmnm`[YXYZ\aegdb^VGFCCAAEKOOOIF?::99;=@ADJMNPPPQSTSPOKKKJJJJKLJIGFEDB@?>====>><;98865545786433346656768<<:=DKQSUVUTTTVURONPTWVVVWXRj¥¦¦®®¯®®®®®®¬ª¦¡||~|||}~~¥«°««¬®°°¯««ª§¤£¥¦¨¤|vj]PKJLPSRW\_fntvz{ qf_SQPJEGDGGJMMKJKKKKKJJJLONJFGJKMOPMJEB>>><=>>@CDFKLNNLMNPSUWZ\\\\ZXWVSQQSSRRSTUTT¨©©ªª«««¬®®¬«««ª««®«¬¬¬¬««««¬««««®®¯¯®¬««¬®¯¯¯¯°°®¯®¬¬¬®®®®®®®®®®®®®®®®¯¯®®¯°°¯¯°±±²²²²±°¯°±±±±³´´´´³³´±±²²±±±°±±±±±±±±°°°±²³´´µ´´´´³³³²²±±±²²²²²³²±±±²²±±²²±±±±±±±±±±±±±²²±±²²²²²²²²²³²±±±±±±±±±²²²±±±±°±±²²±²´³²²²²±±±±±±²±°¯°¯¯¯¯¯¯°°°±±±±²²²´´´´´³±±±±±°°°°±±±±±±°°°¯¯°°¯¯°¯°°¯®®®®¯¯®®®®®®®®¬¬®®¬«««¬¬«««««ªªª©©©©©©¨¨§§¦§¨§§¦§¨¨¨¦¦¥¥¦§¨ª««««¬®¬¬¬¬««ªª©¨¨§¦¥¤¤¢¡}||~ ~||{|~ }zyxwvuvwxvtrpnnoosuz xrpqqqttvy{}~}}}}|zvqnkiiilnonttvxz} ~yyz zrmhc]RJKMLMPQVYZ]^^_]]^_]\^adfhhhhknnopqqqqppqrsuxxvwvtrme]XPLMKKNS]hhhcVIGMNS\fkkjihbZVVW[]bdhklkjihcXTSXdikihhgeefiknqtvvuutuwxwxyzzzzzzxvtuuttxyxtsrststtttnjihg]YXXY[\]`a`^ZVIIDFDBCIPRQJIC>=;9;>BCDILNPPPQSTRPMJJJJJJJKKJIHHFCA><:8889::98876545448885562231134;;;8537<>@DGJKLMJFB>>CINPPNMRUq¥§©¯¯®®®¬¬¬«©¤}yvz}|zzzz{||}~~~~ ¥§ª¯±±±±¬«©§¦¦¦¦§§¤ym_UMIKPPUZ[[^hswy{~ h\QFHJDCDBDDGJJJJKKJKLMKJLOMJFEEGJLMLJFC?==;<=>@CFHOPRQPPPRTVWZ\\[[ZXWVRPPSRRRSTUUU¨¨©ª«««««¯°«««««««¬««««¬«««¬¬«««®¬¬¬¬¬¬®¯¯¯°°®¬¯®¬«««««¬¬¬¬®®®®®®®®¯®®¯¯¯¯°±±±±±±²±°°±±±±²³´´³²²³±²²²²±±°°°°±±±±±±°°±²´´´´´´µ´´³³±²²²³²²²²²³³²±²²²±±²³²±±±±±±±±±±±±²±±±±²±±±²³³³²²±°°°±±±±±±²²²±±±°°±²±±±µ´²²²²²±°±±±²²±°°°¯¯¯¯¯°±±±±²²³³²³´³³³²±°°°°°°±±±±±±±±°°°¯¯°°¯¯°°±±°¯®®®¯¯®®®®®¬¬¬¬¬®««««¬««««««ªªª©©¨¨¨¨¨¨§§§§¨§¦¦¦§¦¦¥¥¥¥¦¦§©ª«ª«««««««ªª©©©¨§¦¥££ }}} ~||{|~ ~{yvvtttuwxvusollnoruzzvroprrpxz{}~|wsoljhhknoouvxz} ~|{yy|{tnke_RJJMKKNQVZ[^___]^``_^`bceghghloqrsttsrpnopqtwxwwvtsmd[UKILLLPVcnnro_LHOPU]eihfec_ZWWX[\`chjkkjie_RMNVemolheb_`aejnorwvrnnqtvvwyyzzzzxusnppnptvutrqsttttrrhdfec_XWXYZYZ[\\\WWLNGDB?>DKPPPPKFD>;;>CDDIKMOOPPRSQNKIJJJJJJKJIIHHEB?;986567887655443423788661.-//145789;988;>?BDFFEDA@?@ADGIDEB@JVv¥¨ª¯¯®¬¬¬¬«ªª©¥zwxzyyzzz{||}~~|}}~~ ¥¨¬®®®¯±°°°°°¯®¬««««§~rdUIHLQRVWUU`muvyzz}{`QBBFJDCDACBDFGHJKKJKNOMKLOQNJGEEHKJJIFC><:=>>?BEIKOQSSQQRTTUWYZZZYZYXVSPQSRRRSUUUU¨©ªª«««¬¬¯¯®¬¬®¬¬¬¬¬«««¬¬¬««®®®¬¬««¬®¯¯¯°°¯®®®¬««««¬«««¬®®¯®®®®®®°°¯°±±±±±±±±±±°°±±±±²´µ³±²´³³²²²²²²²²±±±±±±±°°±±±²³²³³´´´³³²²±±±²²³±±²²²²³³³²²³³²±±±±±±±±±±±±²±±±±²±±±±±²²²²±¯°±²±°±±±±±±±±±±±±±±±²±±²²²±±°±±±²²²±°°°°°±±±°°°°±±²³´²³³²²±±°¯°°±°°±±±±°°°°°°°¯¯¯¯¯¯¯¯¯¯®®®®®®®¬®¬¬®¬¬¬¬««««««««ªª©¨©©ª©¨§¨¨§§§¦¦¦¥¥¥¥¥¤¤¥¥¥¨¨©ª««««¬¬«ªªª««©¨§¦¥¤££~~ ~}|||~}|wusrsuxzzuqnlijmty}}{usqqtvxy{||yurmhgijjntz{|}~ }{{|}yvsnhaZRLKLNOPRVZ\^`abba``_``cdefgilnoqstttsqnmkknruvvuusmg^TPMKJNQVeqrqtiSLPRV^dfdbbb_\YXX\adhkkkkkkeYJKHEhnonje`\[[_elqttsronnpstttvwvuuusokkihkswwtsppstutsnigfeb^VQSVWXYW\ZVTUUPJFC=;@JRVUVRMH@<==@DGHJMOPOOPPPNLLMLKJKJIKJHHGD@=:985321111125654011147630.,+,/1356788889<>?@AAA@=;9;>ACCDDE8H`£¦¨©«®¯¯®¬ª¨§¦§¨¤~zzyxxxwwyz{||{{{|}}~~~ ¥ªª«¯±®°±±±°°°°®¬«§¦¥¢na]YVUYWWVVgnsttx}r]NDJHGEDDB@DBBDHIIHMJJOPNNQPPKGCDGJIIGDA???>?ACEHJLNORUVUVWVVVVXXXXYXWVVVTRRRRTVVWW¨©ªªª«««¬®¯®®®®¬««««««¬¬®®®¬¬««¬®®®¯¯°°¯®®¬«««««««««¬¬®®®®®¯±°¯¯°±±±±±±±±°°°±±±²²³³±±±³³³³²²²²±²±±±±±±±±±±±±±²³´´³³³²²²±±±±±±±±±±±±²³³³³²²²³³²±±±±±±±±±±±±±±±±±±±±±²²²²²±°°±±±±±±±±±±±±±±±±±±±±±²²²²±±°±±±²²²±±°°¯°±±±±°°±±±±²³²²²²²±±°¯°°°°°°±°°°°°°°°°°°°°°°¯¯®®®®®®®®®®®®®®®¬¬¬¬««««««««ª©©¨©©©©¨§¨¨¨§§¦¦¥¥¥¥¥¤¤¤¥¥¥§¨¨©ª««««««««ªªª¨§§¥¥££¢ }}~ ~{zzz{|}vonmkjkty}}{zxwvuuwz}}wrnjhhjntz{}~~ ~} |z| {xusnif^TNMNOOQSVZ\^`accbba`aaccdefhijoqsstttsnlklnrtuuttrmh`VOLJIMPTcrvw{t`UQQW`efebbb`]\[\`bhijjjifc_TGGDCdnqolf`\[[`fmqssrqnmmnqstsrssssspnjjihiotttpllnrtsrnjhgda]TPOPRUXZXWUTVYWSNF?>AHPVXYVQME>>>ADGIJMNPPOPPPOMNOOLJJJIHGEEDC?=:986421111146764011113311/.,-/1256899:;<9:<>>>>=:878:=>>BB?9Nj£¦§©«®°°¯ª¨¦¦¥¥zxyxwxxwxyzz{{zzz{|}}~~~ ¢§¨ª¯¯°±±±±±±¯®¬««««©«¦xnc[XVSSUV^elopuyz{~~ zn\OIIHFEDCB@@?@DIJJJLKLPPPPQPPPNJHGHHHGEDCDDBCDDFHIJOPSVWVWXXXXXYZZZXXVVVVVUSSSTVVVV¨©ªªªª«««¬®®®¬¬¬¬¬«¬¬®®¯¯¬®¯¯®¬¬«««¬®®¯°°¯®®®®¬¬«««««««¬®®®®®¬®®°±°®®¯°±±±±±±±°°°±±²³²²²±°±³²³³³³²²±±±±±±±±±³²±±±±²³´³³³²²²²±±°°°°°°°±±±²³³³³²²²²²²²±±±±±±±±±±±±±±±±±±±²²³²±±±±°°±±±±±±±±±±±±±±±±±±±²²²²±±°°±±±²³²±±°¯¯°±±±±±±±±±±±±±²²²²±±±°°±°¯¯¯°¯¯¯°°°°°±°°°°¯¯¯®®®®®®¯¯®®®®®®®®®¬¬®®®¬®®¬¬¬««««««««ªªª©¨¨©©©©¨¨¨¨¨§§§¦¥¥¥¤¤¤¤¤¥¥¥¦¦§¨©ªªªªª«««ª©¨§¦¥¥¤£¡¡ }|||}~ yollkjiquzzxwxyzz| yqmjhhlsz~~}}~||||}~}{{~|zyz~ }|zwtrnijbVPPPPPSUX[]_`adddcbbcceeefghhhmopqrttsnmmnortttttrnibXMJIGKNQaqz{|n_RS[beeffefeca`abbeeefhgb\SLCDCBakqpmg`\[\_eloqqponnnnoqqqnnooppnljihhhjlnjfbbglprpnjhgd`\QNKKORVWTSQPUZ\YRIA?@AGORUURPI@>>?BFJLNOPPOPPPPNOPPLIHHHGEDCB@><;:875321113588641110/011110/-.012478::;;88:;<<;;98668:<=?>8@Zy£¥§¨«°¯®¬©¦¥¥¤¢zwwvuvwvwxyzzzzzz{z{|}}}~~£¥¦ª««¯°±²³³²²¯¯«¬®®ª¦ xjgd]WRSZ[\djnsuvw{|} vl\OLGFDDCBAA>>@EJKKKJJLMNOPPOQTTPLIGHHGFEEFGDEEFGHIINOQUVVVVXWWXYZZYWWVVVVVVTTTTUUUT§¨©©©ª««¬¬¬¬¬®¬¬¬¬««¬¬®¯°®®¯¯¯¯®®¬¬«««¬®¬¯°°°¯®¯¯¯¯¯®¬¬®¯®®¯¯¯®¬¬®¯°±¯®¯¯°°±±±²²±±°°±±±²²²²²±²´²²³´³³²±±±±±±±±±³²±°°±²²³³²²²³³³²±±±°°±±±±±±²³³³´³²±²²²²±±±±±°±±±±±±±±±±±±±²³³²±°±±°¯¯±±±±±±±±±±±±±±±±±±²²²±±±±±±±±²³²±±¯¯¯¯±±±±±±±±±°±±±±²²²²±±±±±°¯¯¯¯¯¯°°±±±±°°¯¯¯®®®®®®®®®¯¯®®®®®®®®®®®®¬¬««««««««ªªª©©©©©©¨¨¨¨¨¨¨§§¦¥¥¥¥¤¤¤¤¥¥¥¥¦§¨©ªªª©ª«««©¨§¦¥¥¤£¢¡ }{{||} tmkjjknquvwz|~ xojihjqz~{zzzyz{|~}|{yyxxyzzz|zz|~~~~zyxxz{zxutpmjibZUSTTSVWZ\^`abceeeeefggghhjjjimnpqrtttpooqrttttssqnjbXKJHFJMP_q}xhWX`fffhjknpokebaa`_^_a_YSHDBEFD]fppnhb\\]_elpqrqpsqqqpnmmmmllmnnnmkjjihed`]\\_cinnljhfb^\QOJJNPPPPNJJPVZXTME@=;>BDJMPPKC><=?EKOPQQPPPPPPPPPOLIHGFGFDB?><;::98643223578853111/./011121//012478:::98889;<=>:87789<=>:6Mi£¥¦¨ª«¬¬«ª§¥£¢¤zwutttutuvxyzzzzz{zz{{{{||~~~~~ £¦©ª¯°±³µµ³²±±¯®«¥¢xtjbSLVUW^djrttuxyz|pfSEDDCBBABBBBBCFJJJJJKKIJMPPPQSSQOLKJIHFEEEEFFFGHJJKNNPSTSSTUUUVWXXXWVVUUUVVTTSSSRRR¦§¨©©ª««¬¬«¬¬¬¬«««««««««¬¬¯°¯®®®®®¯¬«««¬¬¬®°°°¯¯¯¯¯¯¯¯®®®¯¯®®®¯®®®¯¯¯®¯±±±°¯¯¯°°±±²²²²±±°°±±±±±³²±±³²²³³³³²±±±±±±±±±±±°¯°±±²³³³³³³³´³²±±±±±±±±±²²²³³µ´²±±±±±°±±±±°±±±±±±±±±±±±±²³³²±°±±±°°±²±±±±±±±±±±±±±±±±²²±±±±±±±±±²³²±±°¯¯¯°±±±±±±±°°°°±±±²²²±±±±±±°¯¯¯¯¯°°±±±°°¯¯¯®®¯¯®®®®®®®®®®®¯¯®®®®¬¬®¬¬«««««««««ªªª©©¨¨¨¨¨¨¨¨¨¨§§¦¥¥¥¥¥¥¤¤¤¤¤¥¦§©ªªªªªªªª©©¨¨¦¥¤££¢ }||||}~ zpjhknoqstx{ |tnhhinx}zxwvwwxyywutsrrsuwyyzxvvvuuuvvvy| {zwtrnljhe_[XWVVXZ\^`abbdfghgghiijkmnnnnprttuvwwttttuutttrqpmibVKIHGLNQ`qr_]dkkjlnpwzztkb___^\[ZVPIDCCFJFYannnhb^^_bhnstuttttttqmiilkjjjlnpronnnkd^]\\\[\bgkjhfc`]\WULFJKJIKHDELVXVWTK@::;:<CHLPMD?;;>EKPQRRQPPPPPPQPOLJJIFGEC@>=;;888765444578874210...//012442123689;<;:988789<?A=<:989;<?6:Yt £¥§¨©«ªªª¨¦¤£¢£yuutstttttvwxxxyzzyzz{{{{|}|||}}}} ¤§©®°±³µµ´³´´²±±±®««¨¥¥¤¢¢xfW[XVY\cloprstvy{} m`MAAAAABBCDDGFEHJJJJMMKGGLPQQQRQPPNNJJHFEDDDGFFGIJMOPPPQRQQRSRRUWYYXWWVUTTUUUUUTSSSR¦§¨©©ª«¬®¬¬®®¬¬«ª««««¬®¯¯®¬¬®®¬««««¬¬®¯°°°¯®®®®®®®®¯°°¯®®¯®®®¬®®°±³²±±°°°°±±²²²²±±±±°°°°±²²±±±²²²³³²²±±±±±±±±±°°¯¯°±±²´´´´³³²²³²±±±±±±±²²²²²³³´³²²²²±±±±²±±±±²±±±±±±±±±±±²²³²±°±²²±±±²±±±±±±±±±±±²²±±±±±±±±±±±±±±±²²±±±°¯¯°°°°±±±±°°°°±±±²²²±±±±±±°¯¯¯®®¯°°°¯¯°°¯¯¯®®®¯¯®®®®®®®®®®¯¯®®®®¬¬¯®¬¬¬¬®¯¬¬«««««««««ªªªªª¨¨¨¨¨¨¨§¨¨§§¦¥¥¥¥¥¥¥¤¤¤£¥¦¨©ª««««ªª©©©©©¦¥¤££¢ }|{{z{{{{|~ ulhjnoqsuy~ {vplihlt~}{zxwwuuuutspnnnnqtwyzvsponnnoqrty} {yvtoljjihea][YY[\^`abcdfhiiiijlnnpqqrsstvxxxyzywwxxwuttsponlh_TKJJJOQTbnwgahptsrrt{}|qd^_^^]\ZULEDCDFJHU\ijjhdaaaeiosvwustsssoiggghhhghnrwutttrh_\[\[YY^eihfb`]]]a^PDDFDEDC@BJUXWYWNA99:88?DFJHB><;>ELOPQTSRQQQQQQPONNNKHEDA?>=<;76654455689:98421/-----.0257766799;<=<;987668;>AAA?>;:;<>4Ebz¡£¥§¨©©¨©©¨¦¥£££ yuusrsttsttttuuvwxzzzzzz{|zzz{{|}}}~¢¦©¯±³´´´´´´´´´´±¯¬«©©¥¤¥yn_YUTUVZbfhmnqtwyz|} gWJDD@ABDDEFGIGGHJJJKMMJFEJNPQQQPPONLJIGEEDDDHHHHJMPQQPPPPPPPSRSUX[[[YXWVUUUUVVVVVUUV¦§¨©©ª««¬«¬®®®®®¬ª«««¬¬®¯¯®®®®¬¬«««¬¬®¯¯°°°®®®®®®°±±°¯®®¯¯®®®®¯®¯±²±±±±°°°±±±±±±±±±±±°±±±±±±±±²²²²²²²²±±±±±±°°¯¯¯°°±±±³³´´´³²±²²±±±±±±±±±²²³³³³²²²³²²±±±²²±±²³±±±±±±±±±±±±²²²²°±±²²²±±±±±±±±±±±±±²²±±±±±²²²±±°°°±±²²±±±±¯¯¯°¯¯±±±±±°°±±±±²²²±±±±±±¯®®¯®¯¯°°¯¯¯¯¯¯¯¯®®®®®®®®®®¯®®®®®®¯¯¯¯®®®®¬¬®¬¬««««««««ªªªªªª¨¨§§¨¨¨§¨¨§§¦¥¥¥¥¥¥¤¤¤¤¤¥¦¨©ª«««««ªª©©©©§¥¥¤¤£¡ ~~~}}||{zzyyyyyyz|~ ¡¢¢¢¢¢£ ¡¡ tnnonqtwz |vqnkkjnx~}zyxvvvttssrqonmmnosuvvomkkkklnnptx||{zzyyzz}~}zxtrnjikkigca]\[\]_abbdefhkllmnpstuuttuwxz||{zzzzzzywtsrqnnnkh]QMKLLRUXgm~ {nejszzvtw|{vf_`_`aba[PHDCDGOLTYacefeeeehjnrtusonmlkgb_`_acdcdkqxzxvxxoe\YWWWY_ehfc_\[]_beYKHD?A>>>?FOTTVTND<8866;<<??=;<;>ELOPRUTTSRQQRQQQPPPMJFDA?>><;7654456788:;:86410/.-++-.037898899:<==<:98888;>?BBB?=;;<84Vk¡£¦¨©¨¨¨©©¨¦¥££¡|wutqpqssssrrssttuvyzyyyyz{yyzzz{||{|}}~¤§«®±³³³´¶µ¶µµ¶¶³±®¯¬«¦¢¢xsi\YUTSUY\ahknquwyzz~ vWG@AA@ACDEFGHHFGIJJJKKKJHGHJLONMLLLJJHFDDDDDDGGIJMPRSSPOPPPPQTSSVY\\\YYXWVUTUUVVVVVVV§¨©©©ª««««««¬««««¬«««ª««¬¬®®¯¯¯¯¯¯®®¬«««¬¬®®¯¯°°¯®®®®®¯¯±±±±¯®¯°°¯®®®¯¯¯®¬°±±°±±°°°±±±±°±±²²±±±³±±±±°±±²±±±±±²²±±±±±±°°¯°°°°±±±±²³´´³²±²²±±±±±±°±±±²³³³²±²²³³²±±²³³±±²³²±±±±²±±±±±±±²²²¯°±²²²±°±±±±±±±±±±±²²²±±±²²³²±°¯°°±±²²±±±±°¯¯¯¯¯±±±±±±±±±±²²²²±±±±±±¯®®®¯°°±±°¯¯®®®®®®®®®®®¯¯¯®®®®®®¯°°¯®¬«««««««ªª©©©©ª¨¨§§¨©¨§¨¨§§¦¥¥¥¤¤¤¤¤¤¤¤¥¦¨©««««««««ªª©¨¨¦¥¤¤£¡ }||||{zytuvxyzz{||}~~|zzzzzzzyywwwwwxyz ¡£¤¤¤¤£¤¥£¢¢£££¢¡£¢ wttptwz{ ysomkljoy~|zwuttttsrrqqonnnmnpqpojhhijkmnoqtx{}|{zywuuuvvz|~|zwtpliikkhfcb`]\\]_abcdeehkmnostwyzywvwy{~~}}|zzzyvtrpommmjg\PMLMOTW[in~vhlt||xwz|z|yh_`bcehgaUJCBDJTPUXZ\adghiijmorttqlgecb]WVWX\ababhpwzzvxztja\WVVX^efeb\ZZ]`_hbUOE<<8;<=AHLNQPMIA95537648::;::>ELOQTUUTSRRRRPQRQPOMKIFB@@>=:8865567889;<;9752111-*+,+-169:989:;<>>>=<;;::<=>>??>;9:;15br ¡¤¦¨©¨§¨¨¨§¥¤¢¢xttqonoqrrrqrrssttvxxwwvwyzyyzzzzzz{|}||~¢¥ª±²²²µ·¸¸·¶¶¶´±°±®¨£¢wqjZYVVTTVV\ggjnstvwwz{|~~ zmM><@??ACDEEFGFEFIJJJJJJKLJIIJJIGGHIIHFDCBBCBBDFJLPRTUVSPPQRSUTSSVY\\[WXXWVTTTRSTTTTUV¨©ª©©©ª«¬««««¬¬¬®®¯¯¬«««««««¬ª«¬¬®®¯¯¯¯®®®¬¬«««¬¬¬¬®°±¯®¯®¯°±±±±±±±±±±°¯¯¯°°°®®¯°±±±±²±°¯°±±±±±±²³³³´³²±±²²±±±±±±±±²²³²±±±°¯¯±±°°°°±±²²³³³³³²²²±±±±±±±±±±±±±±±±²²²²±±³²²±±±±±±±±±±±±±²±±±±±²²±±±±±±±±±±±±±±±±±±±±±±±±²³³³±±±±°±±±±±±±²²±®®¯°°°°°°°°°°³´´³±±±±²±±±±°¯®®®¯¯¯¯¯¯¯¯®®®®®®¯¯®®®®®¯®®®®®¯¯¯¯¯®®®®¬¬¬¬¬¬¬¬¬¬¬«¬¬¬«««««ª©¨¨§§§¨©©©¨¨¨¨¨©¨§§¦¥¥¤££££¢¢£¤¥¥¦¨ª««ª«««««««ª©§¥¤¤£¡}wwqnnmmprssttttvwxz{|{zzywwxyxvvxzwuuvuvx{||} £¥¥¥¤¤¥¥¥¥¦¥¤¤¥¤¤¥¤£¢¡ ||}|~ zvsnnpsw{~~~|ytrrpnprsssromlnnmnnmijhilmmosxz|~}yxvtttvx}~|zrpnmjhhilkjhfdbba`__abdehhknntz}}}}{zzz{~{xxxwvtrponliijg\QOPQSV\dioz ypotzzzyvz{zyvnc`gkquthXNJILMT\[\[\^bfimnmoqrrqonhca^\[YVVX\^`bhmuxyvtttql_UTVW[`db_^\XZbdgb\SE?=<::<>BFJPNJGB=851126878:;=BHMPRUUUTTSRQQRQPPNMLLHFDCB@>;985589;;:;;<;:8866520-,,,.135677::;;<===>>>>>>;:<9=B;7=8,Kl} ¡¤¨ª¨§§¥¥¥¥¤ ~ztsnnnnooooooppqrstttttuuwxzzyxxxyzzzzzz|}~}¢¤««¯±²²´·º¸··¶µ´³²³³±«¥ zrnie[VUVUVYZbeinqttuuxz|}}~}~ x]F?BCCCDDDDDEFGGGGIIHGJLPQOJIJGHIJJIIIFCAA@>>AEJINSSUTVUUVWWVVVVWY[\]\[YVVUTTVTTSRRRSS«««««««¬¬««««¬¬«¬¬¬«««««««¬¬««¬¬¬¬¬®®¯¯¯¯¯¬¬¬«««««««¬®°°°¯®®¯°°°±±±±±°±°°°°±±°®¯°±±±±±°¯¯°±±±°±±²²³³³³²±±²²±±±±±±±±±±°±±°¯¯¯°±±°°°°±±±±±²²²²²²²±±±±±±±±±±±±±±±±±±±±±±²²±±±±±²±±±±±±±±±±±±±±±²±±±±±±±±±±±±±±±±±±±²²²³³²³³³²±±±±±±±±±²³²²±¯®¯°°°°°°°°°°²³³³±±±²²±±°°°¯¯®¯¯¯°°°¯¯¯®®®®®®®®¯®®®¯¯¯¯¯®¬¬¬¬¬«¬¬¬¬¬¬««««ª©©¨§§§¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¥¥¤££££¢¢£¤¥¥¥§©ª«ª««««¬«ª©ª§¥¥¥¤¡{tmgfgegjknoooopqrtvxxxwvurqppqrtwwutuutuwwxxy| ¢¤¥§¦¦¦¦§¦¦§¥¥¥¥¥¥¥¥¥¤£¢¡ }xvtstwy|~zwusonoppqqsspmmljhijihhhknqtwzz|~|wwwvuvwx}{wtlkihhhillllkjhgeba___bdfhhmprw~}||}~}|yutttttronljhhig]UQRTV\agjqy {srv{zzwttvuttnhhmpvyul`WPMOPWabeaabcgjlmnppqqqnlgba`\[ZVVWZ]`bgknqsqprsrnbVTVX\`cdcb`\\bcfdc[MF@<:89<?DILKIFB>861013569>>@DJNOPQTTTTSSRRPPPNLKJJHFDCA?=;:8889;;;<<<<;:98887520..-/123567889;=>>>>>>>??>=:87:99:13Vt¡¡¤§©¨¦¦¥¤££¡}ysrnnnnnnoopnooppqqqqrttuvxyxxwwwxxyxxxyz||}¡¥ª«®±²³¶¸º¹¸···¶µ³²±¯«¦£¡ |sh]WVVSRUV[^dinpqrttvyz||}||}~~ |gLADD@>BCDDDDDEEFFGIIIIJLPQOKJJIIJJJJIHDA?@?>>AEJJNQQVWVVXXWVVVWWWY[\\\\YWVUTTVTTSSSTUU««««««««««««¬¬¬«¬«¬¬¬««««««««¬¬¬¬¬«««¬¬¬®®¯¯¯¬¬¬«««««««ª«¬®°°®®®®®®®®¯°°°±±°°°°°°±±°°®®°±±±±±°¯¯°°±±°±±±²²²³±±±±±±±±±±±±±±±±¯°±±®®°±°°°°°°±¯°±±²²²²²²±±±±²²±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±²²³³´´²³´³³³³³±±±±±±²´±±±°¯°°°°°°°°°°°±²²²±±²³±±°°°°°¯¯¯¯°°°¯¯®®®®®¯®®®¬¬®¯¯¯¯¯¬¬«««««¬¬¬¬¬«««ª©©©¨§§§¨¨¨¨¨¨¨¨¨¨§§¦¦¦¥¥¤£££¢¢¢£¤¥¥¥¦¨ªª«¬««¬¬«ª©ª§¥¥¥¤¡zskededfjlklmmmmnnqrttttsrmkjklnrvwwwvtsttvvwxz ¡£¤¥¦¨¨¨¨©©¨¨©§§¨¨¦¥¥§§¦¥¥¤££¢¡ ~zwvvwz~}yvvsnlonnoprqmhhfeeefghhjnrvz~}}yzzzzzzz||wrmihgffgjmmmnnonmkiheb``befhnsuz~~}zyvrqppqrqnmhhgggd^XUUVY^dilqx zutwzzxuqoqpopoptuxzzwqjfVRRR[fjnjhhhjmnmpqppqrnlfbbb___\[YZ\_bfihkmllnqqpg[UUX\]aegggdbdfefh\PI>=9779>CGHGEDA=86211125;AFHJMNMNORRRRRRRRQPPOMKJJHFDB?><;:989:;;:;;::9888888642111123456878;>?@AA???@@@@?>=78:83&Ae¢¢¤¦¨§¥¥¤£¡ {xqqnmmmmmnnonnnnooopoprstuwxuuuuuutttuvxyz{| ¥©«°±²µ·¹¸¸····¶´²°®¬ª¨¦¦ ~n_WTSQPRRQU[`eimnoprtwyzzzz{||}~k\IACB?A@ACDDDDDDEFFGGHIJLOPOLJJJJJJJJHFB?>??>>@DKJMPPV[WZ\\XVVXYYZ[\\\\\YVVUTUVUTTTTUUV¬¬«««ªªª««««¬¬««¬«««¬¬¬«««««¬¬¬«««««««¬¬®®®¬¬««««««¬«ªª«¬®®®®®®®®®¯¯°°°±±±¯¯¯°°°¯¯®®¯°±±±±±±°¯¯°±±°°±±±±²²±±±±±±±±±±±±±±±±±±±±¯®®¯°°°¯¯¯°°°°±±²²²²±±±±²²²²±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°°°±±±±±±±±°°±±±±±±±±±±±±±±±±²²²³³³³´´´´´´±±±±±±±²±±±°°±±°°°°°°°°°±±²²±±±²±±¯¯¯°°¯¯¯¯¯¯¯¯®®®¬¬¬®®®¯®®¬¬¬¬®¯¯¯¯®¬¬«««««¬¬«««««««©©¨§§§§§¨§§§§¨¨¨¨§¦¥¥¥¥¥¤£¢¢¢¡¢¢£¥¥¥¥§©ªª«««¬¬««©©§¥¤¤£¡ ztjdbbbchjlmnnnmnnnpqrsrrqkjjkmnqtyz{zxvvwyzz{} ¡¤¥¦§§©©©ªªª©¨ª©©ª«©¨¨ªª©©¨¦¥¥¦¥¤¥¥¤¢ }| }zwwyz~~~~{ywurnmnlnnnnid_^]_ceegijotuy~~~|zxsnikhgffgimnnpsttrqonjebacfikrxz}}zxvtpnnnorqnlhggfdb]ZXXY\_dilqu|vtrtwwvtonnlloru{}}{ywutq_WTS\insqpnnprrqrssrssrogbbbcgihfb]\_bgihkkjiknoojaXUW[\bhlkljgfgdfgYNJ>=:879<@DDCA?>;87643335=DPPONMMOPPPPPPPPPRQPONLJJFEC@><;;:98899989988888888765555566778899;>@AAAAAA@@@@@@;<6660+$Qv¡££¤¥¦¦¤££¡ {woomlkjjjklmmmnnnoooopqqrstusttttssrstuvwyz{¡¦©«¯¯±²´·······¶µ²°¯®««ª¥odYRPPOONLORV[ahkilorttvwxyzzz{|}}~~~~ x_YK?>?@A@ABBBBBBDDEEDDEFJLNONLJJIHHHIHECA@?@@?@ADJJMPQW\Z\^]ZWWXZ[\\\\\[[YVUTTUVVUUTTTTT¯¯¬«««ª««««¬¬«««««««¬¬¬¬««««¬¬¬¬«««««««««««¬¬¬¬«««««««««ª««¬¬¬®¯¯¯¯¯¯°°°°±±±¯¯¯°°°°¯°¯¯°±±±°²±±°¯¯°°°°°±±±±±°±±±±±±±±±±±±±±±±±±°°¯®®°°¯¯¯¯¯¯¯°±±±±±±±±±±²²²²±±±±±±±±±±±±±±±±²±±±±°°°±±±°°°°°°°±±±±±±°¯¯°±±±±±±±±±±±±²²²²²²²²³³³´µµµµ°±±±±±±±±±±°°±±°°°°°°±±±±±²±±±±±±°¯¯¯°°¯®¯¯¯®®®®¬¬¬¬¬®®®®®®¯¯®¬¬¬®®®¯¯®®®®¬¬¬¬¬¬¬««««¬¬¬«¬««©¨§§¦§§§§§§§§§¨¨¦¥¥¥¥¥¤£¢¢¡¡¡¢¢£¥¥¥¥§©ªª««««¬««ª§¥¤£¢¡ {vjc``_bgjmnnoonnonoprsssrnnmnnortz}~}}~}~ £¥¦¨©©ªªª«««ª©«ªª«¬««««««««ª©¨«ª¨¨©¨¦¥¤¢ |{zz}|{zz{}~}{{{zzysoonnlnmhc^ZVWX\beginptyz| ~zusnkhihggggilnosvyyyxsrolhhjmstz~|{yutsqonnnorqnlhhgeb_\ZZ\`bcfilpty|~|troqstttponjkptw}|zz{yvh\TQ\krxuuttvyywtvwutttticabfnrqtlc`adhjlmlihhjlmnh^WX[\elnlmlhffcdeXNKB>:889;>@A?=;9888765557>EQQPONNPQPPONNNNNPPONLJJIDCA>=;:;;987788888888899:887778889:;;;;<;>@BBA@@BBBA@?>>99441,4>b¢¤££¤¥¥£¡ }wnnlkjihhhijjkllmnnoqqpooprsrssssrrqstuvvxz{¢¥©«®¯°±²³¶¶¶····¶µ³±±±°®¬©¥ tn_TQPOMJKMOPTY_cbhnppoqtuvwxyyz{z{||||{{|}~ u]Q@9>B@>AAA@@@@ACDDDDDEFKLNNMLJIGEDDEDB@A@@AA@ABFKJNRSXZZ\\\[YXXYZ[\\[ZYYXVTSTUVUUUTSSSS°¯¬¬««ª««««¬¬¬««ª©ª««««¬««««¬¬¬«««««««««««««««««««««««©ª««¬®®¯¯°°°°°°°°±±¯¯¯°±±°°°°°°°±°°²²±°¯¯°°°°°°°°±±°±±±±±±±±±±±±±±±±°¯¯°°¯®¯¯¯¯®®®®®¯¯°°°¯¯±±±±²²²²±±±±±±±±±±±²²±±±²²±±°°°°±°°°°°°°°±±±±±±±¯¯¯°±±±±±±±±±±±±³³³³²²²²³³³´µµµ´±±³³²±±±°±±°°±±°°°°±±±±±²±±±±±°°±°°°°°¯¯®®¯®®®¬¬¬¬¬¯¯®®®®®®¯¯®®¬¬®®¯¯¯®®®®®¬¬¬«««¬¬««¬¬«©¨§§¦¦¦¦§§§§§§§§¥¥¥¥¥¥¤£¡¡ ¡¢££¥¥¥¥§©ªªªª«««««ª¦¥¤£¡ }xldaa`bhllmoppooonoqstttttrpopqtx ¢¥¦¨©ª«««««¬¬«««««¬¬®®®¬«¬¬««««ª¨¥¥¥¢{zyyzxyzz|~~~~|zxyzzwomoomnmhaYUTSUW\aehmqtxz}}vqnkhheefghhiknqvz|~~|zwuvwzz~yvtqqqpopoopqpnlihgea\ZZZ`gjkklnpsx{|~|vrnnnostpnmiiotw{}~{vpaVPYis|xyywy|}|yzzxutuungbbfnuuzrhdehknnonjgfgilnmd\[\\bghilliiecbaVMJA>;889:;<><977788655668>EJMPPOPPQRPPNNMNNPPONLJIHDCA?><;::987677866778889:87666788:;<<<<<<>ACDCCCBCBA?>>==:55/1I`q¡££¢¢£¤¢~xnljkjihhhhihhijklmmqpponnoqqqrrrrqqrsttuwyz}¡¥¥©¬¯±±³µµµµ¶····¶¶´³³³±¯¬ª¤ |tdWURPNJJLNOPQUX\bjmkjmqrstuvvwxxyz{{{{zyz{|}~ xjVE68@?>A?@@????@ABCDDEGHJKLLLLJIEDCBBA?>???@@ABCHKJNSTVWXWWXYYXWZ[\\\[YYWWVTSTUUTTTTTTTT¯¬¬¬¬««¬««««¬¬«««ªª«««ª«««««¬¬¬««««««ª«««««««««««««ª««ªª««¬®®®®®®¯¯¯°°¯¯¯°°°°¯¯¯°±±°°°¯°°±±°²±±°¯¯¯°°°¯¯¯°°°°±²²±±±±±±±°°¯¯¯¯¯°¯¯®®®¯¯¯®®®®®¯¯¯¯¯°°±±±±±±±±±±±±±±±±±²²±±±²±±±±°°°°°°°°±±±±±±±±±±±°¯¯°±±±±±±±±±±±±³³³³³³³³´³³´µµ´³±²³²±±±±°±±¯¯±±°°±±±±±±±±±±±±±°°±°°°±°¯®¯¯¯¯®¬®¬¬¬¬¬®®®®®®®¯¯¯®®®¯¯®®®®¬¬¬¬¬¬«««¬««««««©¨§¦¦¦¦¦§§§§¦¦¦¦¥¥¥¥¥¤£¢¡ ¡¢££¤¤¥¦¨©©©ªªª«««©¨¦¥¤£¢ }xkdba`bfhjlnpppoopprtvwwwwvuvwy{ ¤¥§¨©««¬¬¬¬¬¬¬««¬®¯¯±±±°¯®®®®¬¬¬¬«¨§¦£{zy{utvxz{~}{{z{{zwvwyvqkijlkljd\VSSSSX^cglprtvy} }wpmkhgfefhjjhhikpw{~~}wtqoopqqrrqqpomkihgea\ZZZ`hnooppqsvyy{{vtolkkoqnlkhinsw}~~{{|zvvi_X\is|z{zxx{~z{zxuuvutlgddkstysljlnpqttrnhefhknmg`\\\\`bdhjhjdaZWSJGA@=:9:99::8655688866788>DGJNOOPPPRQPNNNNOPPPONLJJFDCA@>=;9887666645567788876555557888889::=@BCCCDABBB@>>>=:992:Yo{ £¢¡ ¡¢ ynljjiihhhhhgghhijjknnoonnnonnnnooopooprtvwx|¤§§ª®±²³µ¶¶´µ¶·¸¸·¶¶µµµ´²±¯®«¥xh]YTOKJFHJJJJMPV\cfefjnnpqrsttuvwyzzzzyxyzz{|~ |tdTF<58=99A<>>???>?@@@BDEFGJJJJKLKIFDCA?>>>>>>?@BDDGJHKPQTTUUUVWYYY\\]]\[YXVWVTSTUTSSSSSSSS¯®®¯®®¬««««¬¬¬¬«««««ªª««««««¬¬«««««ª©««««««¬¬««««ªªªª««««¬¬®®®®®¯°¯¯¯¯¯¯¯¯®®®¯°°°°¯¯¯°±±±±±±°¯®°±°°¯¯¯¯°°±±²²±±±±±±±°¯®°±±°®¬®¯¯®®®®®¯°°°°°°±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°°°±±±±±±±±±±±±°°°°±±±±±±±±±±±±²²²³³³³³´³³´´´´³²²²±±°°±°±°¯¯°±±±±±±±±±±±±±±±±±°°°±±±°¯®¯¯¯¯®®®¬¬¬¬®®¯¯°¯¯®®¬®®¯¯®®®®¬¬¬¬««««««««¬¬«ªª««ª©©¨¦¦¥¥¥§§§¦¦¦¦¦¥¥¥¥¥¤£¢ ¡£££¤¤¥¦¨©©©«ªª««ª¨§¦¥¥£¢ |voiffccghjlnpqqpprrtuxzzyyy{~¡¤¦§©ªª«¬¬««¬¬¬¬®¬®°±±²²±±°°±±¯®¬¬«©¦¤¤ {zysrtvwz{{zxuxwxyxvvwwrkhffgihgb\WUTSPXafjnrqtsuz~}vpkiihfeijmnmigfhnv{~ ~~}~}|{xtqopqrstssqpnljihfeb][[[_ekoqstrsuuuwxtuokhhlnlijijnsy}}{vuxyw{rkddls{|}{vuz~zzywvwwvxqkfchorurnorttuzyvqjffhklkgb]\\\^_bffdfb]QOPKJFB>;:::::76445678:88888>CHKNMLNPPRPPNMNNOPPPPNMKJHFDCB@>;7777654456678888666677654555567879=???@A?ABBA??>??CF@Kiy¢¡ ¡znljhhhhhhhhgghhhiijkmnoonnnkkklmmnnnnnpsuww}¦«ª«¯²³´µµ´³´µ····µ¶¶µµ´³±°°©¥£|nd]TJECBDDDDFJMTX^abdhmmnopqqrsuvxyyxwvwxzzz{|}~ }thTC:84588688;>?@?>>???@CDDDIJJJKMKJGFDA?>>>>>>?ADEFEIFIMMPRSSTVWY[[\\^]\YWVVWVTTUUTSSRRQQPP´±¯®¯¯®¬¯¬«¬¬¬¬¬««««««««««««¬¬¬¬¬¬«««««««««««¬¬¬¬¬¬««ªª««««««®¯¯®¯¯¯¯¯¯°±°±±±°¯®®°¯®¯±±°¯±±±°¯¯°±¯°±±¯®®¯¯°±±±±±±±±°¯®®°°°¯¬¯¯¯¯®®®®®¯°°°¯®¯¯¯°±±±±°¯°±²±±²±±±±±±±²²²±±±±°¯°±±±±±±±±±±±±±±±±°°°±±±²±°±³³²²³³´´³³´µµ´²²³³²²²²²±±±±±±±±°°¯°±±±±±±±±±±±±±±±±±°°°°°°°°¯¯®®®¬¬¬¬«««¬¬®®®®¯¯®®¬®®®¬¬¬«ª«««««ª«««ªª©©©¨¨¨¨¦¥¦¦§§§§¦¥¥§¦¥¥¥¤£££¢¡ ¡¢£¤¤¥¥¥¦§¨©ª«ª©©©¨¨§¥¥¥¥¤£¡¡|wnjhdee`ddhmprsttuuvwxyzz{{|}¡¥¨©ª«««¬¬¬®®®®®¯¯¯¯¯¯¯¯®°±±³´µµµ²²±±°¯¯®®«¨§¦¥£ |~{xtstsrspopqqqqrssstvutskcbddcddb_ZVTVWZ^dimopqrstw|}ztonkhedefntwtnhdgintz ~~}|{zyxwvtsstuvutspnljihjihe`\^\aehmrsqrstttttturmhghhhg^]einx|zvroptxxvsmilsz~{vqmnt|{yvvvwy{~tljhgjpqonoswz|{|ztmhhhlmkihb^`_`bcefeeb^OPPILED?;:;<:87644689:;9888:>CEGJKLMOPQPPPPPONPPPPPOLJJHEDDB>;89<><844688988888877898755555678889<?@?>?@AA@@@ACBILJDiv ¢ }tlhhhhhhhhhfeeefghhjkklkkjjihiijjkklmonptw¥©«®°²³´´³³²³µ··¶¶µ·¶µµ¶¶µµ²±¬§¥£~pi\EG@B@?@BCDGJJMQV\^_hhiknqpnqsuvvvvvwwwxyz{{~~}~ ||zpVB)1136645778;>??>>>>=>CEEDHIJLLKJHIFC@>=<==>@ABCEGIHHHHJMOQRSTTVVX\\[\\[YXVVVUTTUVUTSRRQPP³±°¯¯¯¯®¯¬«¬¬¬¬««««««ª««««««««««««¬¬¬¬¬««««««««¬¬¬«««ªª««««««¬®¬¬¬¬¬¯¯¯¯¯¯°±°±±±°¯°°±°¯°±±±°°±±°¯¯¯°¯°±°®®®¯°±±±±±±°°¯¯¯¯¯¯¯°°¯¬®¯®®®®®®®®¯°°°¯¯¯¯°°±±±²±°±±²±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°±±²²²±°±³³²²²³´´³´´µ´³²²²²²±²²±±±±°°±±±°°°°±±±±±±±±±±±±±°°°°°°°°°°°°°¯®®®®¬¬¬¬¬«««¬®®®®®¬¬¬®¬¬¬¬«««««««ª«««ªªª©©¨¨¨¨¦¦¦¦¦¥¦¦¥¥¥§¥¥¥¤¤£££¢¢¡¡¢£££¥¥¥¦¨©ª«ª©©©©©¨§¨¨§§¥¥£¢ }xpihcbb^__bhmorstttvwyzzz ¡¡¡¢£¡¡ £§©ª«¬®®¯®®¯¯®®¯°°¯¯°°°¯°±²´µ¶¶¶´³²±±°°°¯¬ª©¨§¤¢ }zyurppppnljjkkkkmmmnprqnke__aabbb`][WVY\]aekorssttux||ytomlifdcefnuyungcfhlqw|~}|zzyxxxxwwwwwwvtromkkjkmkigb]^`chjkmnnoooqsttssqmhffed_\Z\^_cknnnkilrwzyvrnpuz{xtnklqwywwxyz{}~xpifgjmnlkmpuz}|}{vnihiknoonha`bbbdefedc_PPOILFDA><==:8876679:;<;:99;?DDFIJJLNOQPPPPPPPPPOPPOMJJHFEDC?=::<>=977789:999989999;:96655789:;;;=>?>==>??@@ABFEJKPSx¡xojhhfeddcccbaabefffgggfeeeddefghijmknmosu ¥ª®°±²³²²²²´¶···¶¶·¶¶¶¶¶µ´³²®©¥£~raIGDA>=>?BDHGHJNQV[]hhffimnnoprstttuvwxyzzzy{||}~ ~ssvkL8&4323444578;=>?>><;:=ADFFIIIJKKJIFC?=;:9::<>ABDFHJIIHHIKLPQRSTUVX[[[[[ZXWVVUTSSTUUTSRRRRQ³²±°¯¯°°¯®¬¬¬¬¬¬««««««ª«ªª««««««««««¬«««««««ª¬¬¬¬««««ª«««««¬¬®®®¯°°¯¯°°°°±°°°±±±°¯¯°±±°°°±±°°°°¯°±°®®¯¯±±²²±±°°¯¯¯®®¯®¯°¯®®®®®®®®®¯¯¯¯¯°°°°°°°°±±±±±°±±±±±±±±±±±±±±±±±±±±±²±±±±±±±±±±±±±±±°°°°±±²³±°°±³³²²²³³´´´µµ³³²²²²²²²²±±±°¯¯°°±°°°±±±±±±±±±±±±±±°°¯¯°°°°°°°°¯®®®®®¬¬¬¬¬«««¬¬¬¬¬¬¬¬¬¬¬¬««««««««««««ªªª©¨¨¨§¦¦¦¦¥¥¥¥¥¥¥¦¥¥¥¤££££¢¢¡ ¡¡¢¢¤¥¥¦¨©ªª©©©©©©¨¨¨¨¨§¥¥£¢ }xqge`Z[YVSV]djptuuvwxzz{|~ ¢£££££¥¥¥¥¥¤£¢£££¢¡¢¤¦©««¬¯±±±±¯¯¯®®®¯°±±°°±±±±±²³µ¶···µ´³±±±±±¯««ª©¥¤¤xvspnnnnigddddefgffhkmkhc_\\]^_aa^\\YVY^dfintvvuvvvx{ }}~ }zwtpjihgdcdegnvzwqiehikotx|~{ywvvwwxyzzyxwutpnlklmopmjhc_`dhlnkhhklkknrtsqqqnhebb`ZZVTUPPVehkighovyzyvtsuyzuqmjjnsvvwzz|~~uidfihiiijnsy}}}{vokjknqsttnebddefffdcc_RQPMPKHEBAA?=998888:;<=<:::<@DDFHIJJLNPPPOPPPPPPOOONMKJIHGFDB@>>===;::889988888:;::;<;87568:<<?>=>>>>==>?@ABCDFFGGVbzpijihhgfdbdbabceffeeedcbbbeeedcdefjhkmoqt¡¥ª¯°±±±±±±³´¶···¶¶·¶¶¶¶¶´³³²°«§£yiUJHDA>>?ACDDDFHJOTX^_`acfhhkmnoqrtttuvxxyyyyz{||}~~~~~|z|~tohW><86312456788:<>>>>;99;?DFHIHGHIJIHC?<9878879<?ADFHJJIHGHIJNOOPPSUVYYZZZZXVUTTSRRSTTSRRSSSS³³²±°°±²¯¯¬¬¬¬¬«««¬¬«ªª««««««««««««¬«««««««©¬¬««ª««¬«««¬®®®®®®®®®¯°°°¯°°°°±±±±±²±°®®¯°°°°±±±±±°±¯°°°®®¯±±²²±±±±°°®®¯°¯®®®¯¯®®¯¯°¯¯®¯¯°°°°°°°±±±±°¯°±±±±±±±±±²²²±±±±±±±²²²±±±±±²±±±±±±±±¯¯¯°°±±±±°°±²²²²²³´´´´´´´´³³³³³³²²±±°°¯¯¯°±±°°±±±±±±±±±±±±±±°°¯¯¯¯¯¯¯¯®®¯®®¬¬¬¬¬¬¬¬««¬¬¬¬¬¬¬¬¬¬¬¬«««««««««««ªªªª¨¨¨§§¦¦¦¥¥¥¥¥¥¥¥¥¥¤¤££££¡¡ ¡¡¢££¥¥§¨©©¨©©©©©¨§¦¦¥¥¤£¢¡ |xsfc[PQRPJNU]emrttttuvxz{ ¡£¤¥¦¦¦¦§©¨¨¨¨©¨¨§§§§¦¥£¢ ¢¥¦©«¬«¬®°±±±±°°°¯®¯°°±±±±±±±±²³µ¶····µ´²±±°±±¯¬««ª§¥¤¢{vqponlkeb`_`abcbccdghfc`]\\]]^`a]\]\Z]bknrvz{{zxxwxz}~~|yvwz}~zxtpnhgfdcdefhltzzvolnnnortx~ {xutuvvvxxxwuttsomlmnptsnkiebbhkpsnhgihhhkoqqoqqnida_^\[SQRJGPbehhghouwyzzwttuwtplijntvuwz{|znffgfhhjkmqvz{zxsnkkmqttuvphfffgghgecdaWVVUWTNKHFDC><:9999;<<=<;;;=ADFGIIIJLNPPONOOPPPONOONLJIIHGFFEEC@>==<<<;;:9877668899;;;87668:<=?>=<==>>ABCDCCDDDEDCYlvonlhdccccbbbbbcddeeedbbbbbbcdefhjihjlnmp¡¥©¬®®¯°°±±²³´µ¶¶¶¶¶·¶¶µ¶¶µµ³²°«¨¤ {thUPJEBAAAABBCCCDHKNNSZ]^``aehlnoprsrrrstuwywyzzyyz{}~~|}~~~}|{~~}}}~}|}~~~}}}}}}}zurslfYI9=86533468889:<=>>>=;9:>AEGIHFFGGFE@>;9877868<>ADFGIIIIHHIJLLLMOQSUVXYZZZXVUTSRQQRRRRRSSTUU³´³²±±±³°¯®¬¬¬«¬¬«ª«««««««««««««¬¬¬¬«¬««¬¬«ª¬¬¬¬«ª««¬«««¬¬¬¬®¯°°°¯¯¯¯°±±±±±±±°¯¯¯°±±°±±±±°°°¯°°°¯®®®®¯±±²²±±°±±°®®¯¯®¬¬®®®¯¯¯¯®®®¯°°°¯¯°°°±°¯¯°±±±±±±±±±²²²²±±±±±±±±±±±±±²³±±±±±±±±°°°°°±±±±°°±²±±²²³´µ´´³³³³´´³³³³²²±±±°¯¯¯°±±°±±±±±±±±±±±°±±±±±°°¯¯¯¯¯®®®®¬¬¬¬¬¬¬¬¬¬¬¬¬¬®®®®®®®¬¬¬¬«««««««««««ªªªª¨¨¨§§¦¦¥¦¥¥¦¥¥¥¥¥¥¤££¢¢¢ ¡¡¢¢£¤¥¦§¨¨¨©©©¨§¦¦¥¥¥¤¤££¢¡¡|wthbVIJMMKNTZbhnruuvwy| ¢¤¥¥¥¦¨¨¨¨¨©««¬«««««ªª©©©©©©¨¨¦¥¤¡£¥¨ª«®¯±±±±°°°°°¯¯°±±±±±±²²²´´µ¶····µ´²±±±±±¯®¬«©§¤£¢xpopmhea^\\]^abbcddeecb_^^___ab`^_bcdhnrv{{zyzz|{{ywttuy|~~zxtnljgeddddefghotxzwuwutsstvz ~yvttuuuuuttsrsqnnnortwtnkifcflntwskfeeegilnnnpqojeba``ZPPQHDPZ]bdfiotwy{{zwuttspmijpvwvwxyz||tkfefhknooqsuwvsnkjlntvvvwrkhfghhhhfedb\\\\\ZSPMJGD?<::::::;;=<<<=>ADHIJJJJKMPPOOOOOOOOOOONKIHFDDDFHIEC?=<==<==;:88765678:<<:887789;;<;:9:<=>BCDDDDCDDED?\q|vngcbccbcddddefdedcbabcdeffefhhjhlkjjq ¢¤§ª«¬®¯±²³³´µ¶¶¶¶··¶µ´µ¶··´²¯¬¨¥¢¡¡~t^YPJECCBBCDBAABCDDBJRVWY\^`ejnnnnonoopqstvvwyxwwxyz{|}}~~~|}~~~}|{}}|||}~}{zzz{|||{z{{{|}~~~~~~~~}}}}~~}vmq`QGC<<0356656789::;<=>>><::=@DEIIHGGEDB@><;:8888:=?ADEFFGIJJJKKMMMNPQTUUWYZZ[YWVUSRQPPPRRRSSTUV´µµ³²±±²°°¯®®®¬¬«ªª««««««««««ª««¬¬«««««¬¬«««««««««ª«««««¬¬¬¬¯°°°¯¯¯¯¯°±±±±°°±±±°±±±±°°±°¯¯¯¯¯°°°°¯¯¯¯¯±±²²±±¯°°°¯®®¯®®¯®¬¬«¬¬¬®®®¯®®®¯°°°°¯¯°°°°°°±±±²²±±±±±±²²²²±±±±±±±±±±±±²²±±±±±±±±±±±±±±±±±±±±±±±±²³´µµ´³³²³³³³²²³²²±±±°°¯¯°±±±±±±±±°°±±±°°±±±±±±°°°°°°¯¯¯®¬¬¬¬¬¬¬¬¬¬®®¬®®®¯¯®¬¬¬¬««««¬¬«««««ªªª©©¨§§§§¦¥§¥¥¦¦¥¥¥¥¥¤£¢¢¡¡ ¢££¤¥¦§¨¨¨¨¨¨§¦¥¥¥¥¥¥¥¥¤¤¤¢¡ {wsh`PDEIKLOSX^emqtvy{ £¥¦¨ª««««¬««ªªª««¬¬««¬¬¬«««««««¬««©¥¢¡¥§©«¬®¯°°±±±±°±±±°°°±±±±±±±²²²´µ¶¶····µµ´³²±±±¯¯®¬«ª¦¥¥ |trohb`]\\\^_abcegeddcb``abbcdeccehknsvz~ ~|{|{zytsrtvy{|wtrnhggedddeedccbfjowzz|zxvttuy||yvuutttsrqqqqpooprtuvtokigehnqvzvngcceghhjlnoqpmhgedd\SPOFEPX[^bfkqtvyz{zwttssqnkkqwwwwwwwy{}{wohfhimqttsrrtromjjlmrvxwwskhfghiiihfdca^^^^]WVRNJD?<;<<;;:::>>>>>>ADFHIIIJKLOPPPPOOPOOOOOMJHEDA@BDGIFDB>=>>=;;:988757778;=<98888889998889;=>@BCCCCBCEEC@bu |wrlfbdeedccefefecaabdgghhhhiillonot| ¢¤¥¨©ª«¬®±²´´µ¶¶¶¶···¶µµµ¶··µ²¯ª¥¤¤¢xb`ZSJDCCCCDB@???>=>DHJJOV\]bfijjiikmoqrssttuwwwwxyyzz{|}}}}}~~~}{{||{zzz{|~}|{zyxzzzzzzzyyyzz{||{||}}~~|||||}}}~}zzzrhjSB=;25/-15778:<;;;<<====<;;<>BDHIIIGDCB@>=<;999::<>?@BCEGIKLMMNNNMNPRTTTWZZ[\ZXWVTRQQPPQRRSSSUU¶¶µµ³²±±°°¯®®¯¯¬ªªª««««««««««ª«¬¬«««««««««««««««««««««¬®®®®®®°°°°¯®¯¯®¯°±±°±±±±±±±±±±°±°°®®®¯°°°°±±°°¯°±±±±±±®°±°¯®®¯®®®®®¬«¬««¬®¯¯¯¯¯°°°°°°°°°±±±±±±±²±±±±±±±±±±±±±±±°±±±±±±±±±±±±±±±±±±±±±²²²±±±±±±±±±²´µµµ´´²³´³³²³³²±±±±°°°¯°±±±°±±±°°°±±±°±±±±±±±°±±±±°°°°®®®¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬®®®®®¬¬¬¬¬«¬¬¬¬««««ªªª©©©¨§§§§¦¥¦¥¥¦¦¥¥¥¥¥¤£¢¡¡¡ ¡¢£¤¥¦§§§§§§¦¥¥¥¥¥¥¥¥¤¤¤¤¤ |xrh\MEGHJLOSV\blrruz ¤¦¨«¬¬¯¯¯¯°°¯¯°¯¯¯°±®¯°°¯¬¬¬¬¬«©¥£¢¢¢¤§©ª«¯°°°°°°±±±±±±°°±±±±±±±³³³µµ¶¶¶¶¶¶µµµ´³²±±¯®®¬««©¥¤¢|wnc^`]]^`bbceghhgffeccccdefffhjlnqw{} }|{yvrqqsuxyxsnmjffgeeeeedb_]]]]cowz||zwutux{ {yvusrqqppppoppqsttuttpmkhfimsy{yskfcdefhilnorsronljjf_XPKMRY\^bfkrvwyzzzwutvutsposwwwwwvtuwzzzwpihiimrvwutsqponlkllotvuuqjhgghijihgcba^]`__]\ZVPIB===>=<:::>>>>>=>@CDFGGHJKMOPPPPOPPOOONLJHDA>>@DFGFFDA?>>>;;::987568889;:878::98899::;<>?@@ACDCCBBDCCGn~}tnmjgdccddhhhebbcebdglruwxru|~¢£¥¦¦§ª«°±³³´´µµµ¶···¶¶¶¶¶µ´±®®¬¨¥¥¢ya^ZRIDCB@?A@>=<;:9=>@@CHORVVX\`ccbdhknopqrsttvwwxxxyzzz{zz{||||{zzzzzzyyzz|{{zzyyyzyyyyyxwwwxyzzzzzz{{||}}|||||{{{{yxwtlaXOB<92&+(+/479<>><<<===<<<<;;;=@BDFHGECCCC@><;:;<;;;<=>>?EGJMNOOOPOOPQRSTVY\\\\[XWVTSRRQPQRRRRRST¶¶¶¶µ³±±°°°¯®®¯°¯®¬¬«ª©ªª«««««««««ª«¬¬««ªª«¬««««««««««««««®«¬¬±±°¯®®®¯®¯¯¯¯°±±°±±±±±±±±±±°¯®¯¯°°°±±±±±¯°±±±±±±°±±±®®®¬¬®¬¬®®°°°¯°°±±°°°°°°±±±±±±±±±±±±±±±±°±±±±±±°±±±±±±°°±±±±±±±±°°±±±²²²±±±±±°°±°±³µµµµµ²³´´´³³´±±±±±°°°¯°±±±°°±±±±±±±±±±±²²±±°¯±±°°°°¯¯®®®®®®«¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬««¬¬¬¬¬¬¬¬¬¬¬««««ªª©©©©¨§§§§¦¥¥¥¥¥¦¥¥¥¥¥¤£¢¡ ¡ ¡¢£¥¥¦¦¦¦¦¦¥¥¤¤¥¦¤¤££¢¢¢¢ }zsi\NJKJMQSVX[bkrz~ £¨«®¯¯°°±°°±±¯°°°°¯¯°±±°°±°¯®¯¯¯®¬¬«¬¬«§¥¥¥¥¦©««¬®¯¯¯¯¯¯°°±±±±±±±±²²±±±²³´´µµµ¶¶¶¶µµµµ´³²±±®¬¬«««««¥¢¡|n`\b``bceeghiihghhgdggfffggfinprw ~|zvtrqqrtuutqmjhghhgfffec`\YZWTZhtxz|zwvuuxz ~zxvpoonnnooopqsttttrtqnmhgilt{|zvpkdddegilnptuvutqnppmbVSVVVY\`djrwzz{{zzyxzzyxuttwwwxxvtstxyxtokjjhlrvywutppponmlknstrrnihghhjjjhgbaa\\`abbba]VMD?>>>>=;::>>>>=;;=>ADEFGIJKMOPPOOOPPNMMLJHDA>>ADEEEGFC@@@?>>>=<:865788887668;<:889<=>>?@ABCDDDDCCCBAEO{zsnnnmliihfbbceklnsx{|{| ¡£¥¥¦©«¬¯±²²²³³³³´µ·····¶´³±®¯¯ª¦¦¢z_XMHCABA>===<:8788<=>?CGIJLJHLU[\Z\_cfhknpssttvvvvwxyyzyyxzzzzzyyxxyyyzzz{zzzzyyyzzyxxxwvuuvvwyzyyyyzzzz{{zzzzzzyxxttun\MFJ@7-)&1+/268;=>=<====<<;;<<;:;>?@CEECACDEB><;;<>>=<<=>??FIKNPPPPQPPQSTUUV[]\\\[WXVUSSSRRQRRRQQRS······¶µ²±°¯®®®¯¬¬¬¬«ª«««««ªª©««¬¬¬«¬««ª«¬¬¬¬«««««««¬«««¬®®®¬¬¬««¬®¯°°°±°¯¯®°¯¬«¬®±±°°±±±±±±±°°¯®®¯°°±±±±±°°°°±±±²±°¯¯¯¯®®®®®®®®¯¯®®¯¯°°°°°°±±±±±±±±±±±±±±±±±±±±±±±±±°°°±±±±±±±±±°°±±±±±±±±°°±±±²²²²±±±±±±±±±±²³´³³´¶´´³²²³´´³²±±±°°°±°°°°°°°±±±±±±°°°±±±±±±±°¯¯¯®®®®®®®®®®®®««¬¬¬¬¬«««««««««¬¬«¬¬®¬«««¬¬¬¬¬¬¬«¬¬¬««¬¬¬««««ª©©¨¨¨¨§§¦¦¦¥¥¥¥¥¤¤¤¥¤£¡ ¡¢¤¤¥¥¥¥¥¦¦¦¥¤¤¤¥¥¤¤£¢¢¡ {xsk^QKKNPRV[]admw¢¤©ª«°±²³²²²³´µ´³³²±±±±±±±±±±±°°°°±±±±°¯¯¯®««©¨¨©©ª««¬®¯¯¯¯¯°±±²±±±±±±±²±±±²²³´´´´µµµµµ´´³³³³²²±°®¬¬«««ª§¥¢m`\babdfhijjijjjkljhigffedhlmov~ }yuqppqrrpnlkihhijjjhgfb\Z[XWUXcqyz~|yvuwz{~~{wtnonlmmnqqstwwuttsrttnkjgnsy{{yurhfddfhjnqsuy{zxtttska\[WVVX[aiu~{}||}zz|}}|zxxz|zwvvusrrvvvuqmlmlnruwwvvrrqqpnlimqtspmjhihhikjhf_Z]]\a`bebcfbVLIFEDDB?><>>>><878;<?DFGIKNOPPPPOOONMMMMMLGB?ACCDFHGFFEDCB>=<:9999:::99888889;<<;<>>>ADDDDDDDDCCBBBD>\y {xtqstttsrstwx{ ¢¢¦©ª«¬®®¯°±²³³³²µµ¶¶¶´²±±°¯®«¨¦¦£uaVE?C@=@?<>=<;:988;;<<=>ACDEFJPTSTXZ\^afmrqprtuttuuttwyxwwvttttvvvxxwwwyzzzzzzzyyyxwustuvtuuuvwxxxwwwwwxzz{|{yvwxwzu{sYI;/971-+,-/24678;==>>>>><:8<;;;<;:89;>CDDDDD@<:<>><??@??ADFIJKLMNPPRRSSSTVWZ\__\XVVVVUUTTSSSSSSSSSS···¶¶¶µµ´³±°¯¯¯¯¬«ª««««ªª©©ª«««««¬¬¬«««¬¬««¬¬«««««««¬®®¬¬¬¬®¯¯¯°°°°¯¯¯®¬¬¬°°¯°±±±±°°°¯¯®®°°°±±°°°±°°°±±²³±°¯¯¯¯®®®¯¯¯®®®®®¯°°°°°±±±±±±±±±±±±±±±±±±°°°¯¯¯°°°°±±±±±±±±±±°°°±±±±±±±±°±±±±²²±±²±±±±±±±±²´´³³´µ´´³²²³´´´³²±±±±±°°¯°°°±±°°°±±±°°±±±±±±°°¯¯¯¯¯®®®®®®®®¬¬¬¬¬«««««««««««¬¬¬¬¬«««¬¬¬¬«¬¬¬¬«¬¬««««¬¬«««ªª©©©¨¨¨§§¦¦¦¥¥¥¥¥¥¤¤££¢¡¡ ¡£¤¤¤¥¥¥¥¥¦¥¥¤££££¤££¢¢¡ }zwti\UQOOQW[\]dnx¡£¥©«®¯±±²³´µ´µµ¶¶µ´³²²²²²±±±±±±±±±±°°°°°°¯¯®®¬¬¬¬«««¬®¯¯°¯¯¯°±±±±±±±±±±±²±±±²²³´´´´µµµµµ´´´´³³³³±°®¬¬¬«¨¥£ rhbcdeghjkklmnopqrpnjhfgfehlpu} |wsqpppqqomkkjjjkjjihgea\ZYVUSWcrz{~|zz{|~~~||z{}ztnmonmnnnrtuxywtrrttvuoljhlqwz}}zxnlihhhknqsuz|{yvvutohc_XXWWY]frzz{z{}{z~~|zzzzzxvuutssttuurnmmmnqsttturrqqonlilosronljihhikkig`Y[\\_`cdfhih`TJLLKJGD?====<96578:>CFGJLMNOOOONNMLKLLMMMHDBCDDEGFEEDDDBA;;;:9888::;;<<;;;;<>>>>?@@@ACDDDCBA?>???A>D\t |}~ £¦©ª«¬®®¯°±±²²²²´µµ¶µ³±±°¯®®ª§§£p\OD<>>=?><<<===<;;99989:<>=??ADFFINPRV[ahljlnoppsuttuwwuttutttuvwwwwvvvwxyzzyyxwwwutspqssqtttuvwwvvxyyvuvwxxvtrqrrsgbP<:9241/-,-01344468998:<<<;;;;;:;<<9888<?ABCEFB>;<>>=?AABBDFHIIJJJKMNQSTTTUVXY\]]ZVTTUUTTTTTSSSSSRRRRµ¶·¶µ´µ¶´´³±±°¯®®¬«««««ªª©©¨©ª««««¬¬¬¬¬¬¬¬¬¬«¬¬¬«««««««¬¬®®®®®¯°°±±°°®¬¬¬¬¯®®°±±±±®¯¯°°¯®®°°°°°¯¯¯±°°°°±²³±°¯¯¯¯¯®¯¯°¯®®®®¯°°°°°±±±±±±±±±±±±±±°°°°¯¯¯®®®®®°°±±±±±±±±±±°°°±±±±±±±±±±±±²²²²±²±±±±±±±±²³³²²³´´³³³³³³´³³²±±±±±¯¯¯¯°°±±¯¯°°±±±±±±±±±°°¯®®®¯¯¯¯¯®®®®¬¬«««««««««««¬¬¬¬®¬««««¬¬¬¬¬««¬¬¬¬¬¬««««««««ªªªª©©¨¨¨§§¦¦¥¥¥¥¤¤¤¤¥¢¢¢¢¡¢¢¢¡¡ ¡£¥¤¤¥¥¦¦¥¥¥¥¤¤£¢¢¤£¢¢¡ }zwth\WTPQV\^]^hu§ªª«¯²±±²³´´µµ¶¶···¶µ´³²²²³³³²²²±±±±±±°°°¯¯¯¯¯®®®®¯¯°°¯¯¯¯¯°±±±±²²²±±±²²±±²²³´´´´µµµµµµµµ´´´´´±°¯®¬¬«©¦¥¢ytmghijlmnnnpstvxxvtihggffimv| }zuqppppponlkkkkllkkhihea_\\WVVYdqz|~}|||||~~}|zxuttttttsomknnnnnotxyzzvsstvvywpmljkntx|~~|vspnlklnqsvz||zxwvutold[WVVX\bltvxyz}}}}{zzzzxuuuuttutuvtronnnoonortsrqonmkijmoonnmlkjjklljhaVVXY\^ddiljjh\OOPPPMIC?=<:8533468>BEGJMLMMNNNMMJJJJLMMMIFDEEDFIIHGEDB?>::986678;<=>>>>>>==>??@ABA???@ABA?><;<=>=9K^nx ¡¢ ~ ¤¥§¨ª«¬¬¯¯°±±±²²´´µµ´²±¯¯®«©¨¡znaTPB@?<=<:9:<=>=<;7887789;<>>>>>>BDDFIMRVYdhlmlmnpopsttttuttttttuvvuuuuvvvxxxwvuuttsqpqssrssttuvvvuvvvutsrrrssqnmlgYO<.4820/../023554334543578779;;::<>=:8679<>>ADEC?=<==>?ABCDEHJIIJJIJJKPRTUTUWYZ\]\YUSQSSSTTTTSRSSSQQQR´¶·¶´³´¶´´³²±°¯®®®¬«¬««ªª©©ª©ª«««¬¬¬¬¬¬¬«««««¬¬«««¬««¬¬¬®¯®®®®®¯°°°±°¯¬¬¬®°±²±±¯°±±±±¯¯¯¯¯¯¯¯¯®°°¯®¯°±³±±°°°°¯¯®¯¯¯®®®®®®®®¯¯¯°°°°°±±±±±±±±±°°°°°°¯¯¯¯¯¯¯®®®°°±±±±±±±±±±°°°±°±±±±±±±±±²²³³³²²²±±±±±±±±²±±±²³³³³³³³³³³²±±°°°°°¯¯¯¯°°±°°°±±±±±°±±±°°°¯¯¯¯¯¯¯¯¯®®¬«««««««««««¬¬¬««««¬¬¬«¬«««¬¬¬¬¬«««««««ªªªªªªªª§§§§§¦¦¥¥¥¤££££¤¢¢¢¢¢¢¢¢¢¡ ¢£¥¤¤¥¦§§¦¥¥¥¥¥¤£¢££¢¢¡ }zvrg\VRPSY]adju¡§¬¯±´²²³´µ¶¶·¶¶···¶µ³³³³³´´´´²²²²²²²±±°°¯¯¯¯°¯¯®®¯¯¯¯¯¯¯¯¯®®®®¯¯°±±²²²²±±²²²²²³³´³´´µµµµµµµµµµ´´´²±°¯®«««©§¥¤¡~zphmmnnooppqtwyzzwtihgffhlpz ~~~~~{zwtpooppponmmlkklllkikjgddcbeghjpy|ywwwwxwxxxvtrprnkhhjklimnoqstx||zyutwzz{}zsnnmmnrvz~~}{yuspnoorsvz{{ywwuvvtrkaVVVZ]bhntvvy}~zyxyzzwuuvwwwvuvwvsonmnnmllnqsrqonljihjmmmmmnnmllnnlicWVWX[\cfjkhhh`VRRSSPLFB>;85211248=BDGJNMMMNNNNMJJJJJKLKGFEFEEGJLJJHFDB@>=:7569<>>?@@??>>>=>>>?AAA@?>>??@?><<=>?>@Sblw ¢¡¡¡¡¢¢¢¢ ¢¢¡¡ £¤¥¦©ª««®®¯°°±²³´µ¶¶´²°®®®®ª¨ |urjhRIC=;9:889999885666789;8;:8888;>>?@BDEGNU\`chjklmnqqqrsstttsrsttttuuuuvvvvuutttponmmnnnrrsttuuuvtqrtttqqqsspkfdXKD8144.-./001239;;8665556655589:99<>>;8679;<<>BCB@>==>>?@BDDFHJJKKJJJJKMPSTTUWZ[\^]ZVTSRRRSTTSRRSSRQQQS³µ··´³µ·²³³²±±°¯¯®®¬««««ªªª««©©ª««¬¬¬¬¬««««¬¬¬«««¬¬«¬¬¬¬®¯®®®®®°±°°±°®¬¬®®¬®¯±²²±±±²²±±°¯®®¯¯¯¯¯°°¯®®¯±²±±±°°°°¯®¯¯¯¯¯¯¯®®®®®¯¯¯¯¯°°¯¯°°°°°°°°°°¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®°°°±±±±±±±°°°°°°°°±±±±±±±±²²²²²²²²²±±±±±±±±±±±±²³³³³³³³³³²±±°°°°±°°°¯¯°°±±±°°°°°¯¯°°°°°°¯¯¯¯®®®®®®¬¬¬¬¬¬««««««««««¬¬««¬¬¬¬¬¬¬«««¬¬¬¬««««««««ªªª©©©©©§§§§§¦¦¥¥¤££¢££¤¢££££££¢£¢¡ ¢¤¥¥¥¦§¨¨§¥¥¦¥¥¥¤£££¢¢¡ ~}{xtrh\UQRTT\dq©©«®®±²³´´µµ¶¶··¶····¶µ´´³³´µµµµ³³³²²²²²±±°¯¯°°°±±±°¯¯¯¯°°°°°¯¯¯¯¯®®®¯¯¯±±²²²²±±²²²²³³³´³´´´µµµµ¶µµµµ´´´²±±°¯®¬««ª§¦¥¢{pipppqqqqqrtwxxwtrihgghkqv} ~|zz|~zvttrpppqqqpoonnlkkllljlkihikmknrstx~ ztrqqrtrsttsqonnkhfeeeehkmouyz~~~|zwvz}tppoppsvz~~|zvtsssstvyzxvtttvvttph\YX[^bhmrtux~{xvvwxwvvwxyxvuvxwsnllmmlkkmntsrpnmlljjklllnnonnnnnljfYWYZ[\aghihfc`\YXWVSNGC>:730./148=ADHKNNMMNOOONJJJJJJJJFFFFFGJLJJIIHHGFDC@=<=?ABBCCB@>>@>>>>>>@BCDCBA@@AA@??ABCDLYhnz ¡¡¢¢¢¢£££ ££¤¥§©ªª®°±±²´µµ¶¶¶´²°¯¯¯®¯°®«¨¡ |t\OG?=;<9876544434445688787576689;=>=>@BJNTY^cghhhknqpnnqrssqppprrrsstttttttttssspnlllllppprstttutsqrsttuqjaXPJEH:62/0-,,.011245>CDB>:99;;;<<;:9:99;>>=:9:<>><=?@AAA@??@ABDEFHJJMMNNMMNOMOQSSUWZ[\^]\XVVSRRSSSRQQRRRQQRT³µ··µ´µ·³³³²²±°¯¯®®¬«««««««««©©ª««¬¬¬®¬¬¬¬¬¬¬««««¬¬¬¬¬®®®®¯±±°°°¯¬¬¬®®®®¯±²²±±±²±±°¯®®®¯¯¯¯¯°±°°¯¯±²±±°°°°°¯®¯°°°°°±®®®®¯¯°¯¯®®¯®®®®®®®®¯®®®®®®®®®®®®®®®°°°°°±±±°¯¯®¯¯®®°°°±±±±±±±±±±±±±²²²±±±±±²²±±±±²³³³³´´³³³´³²±±±±±±±±°°¯¯°°°°¯¯¯¯¯®¯¯°°°°°°°¯¯®®®®®¬¬¬¬¬¬¬«««««««««¬¬¬¬¬«¬¬¬¬¬¬¬¬«««¬¬¬«««««««««ªªª©©©©©§§§§§¦¥¥¥¥¤¤¤¤¤¤££££££££££¢¡ ¡£¤¥¦§¨¨©©©¦¦¦¦¥¥¤¤¤£¢¢¡ }|zxttj]USTRO_l}¢®®°°°±³´´····¶¶·······¶¶µ´´´´µ¶¶¶´´´³³²²²±±±±±±±±±±°°°¯°°±±±°°°°°°°¯¯¯¯¯¯±±±²²³²²³³³³³´´´³³´´µµµµ¶¶¶µµµµ´±±±±±°®«ª¨¦¥£ vstsssrqqqrtvutsqnhhggiow} |wtx~~|zuqprrqstttsqqqpnmkklllkkjjiknstz}~xqnmmnoopqqpnmkjhebaa``dfglu{}}}~}zz{vrrpppruz||zwwvvuvwxxusqqrttstuqhb\\]bhpqttw~}zwutuwxwwwwvvuvxwsomjkkkkklmstsrqppponmlkjlnnnnnnnlidZY[\\[\cceec_]][ZXWTOHD;841/-.048=AEJMNONNNPPPOLKJJIIIHEFGGGIJLJHGGGHHHHGGFEDDDDEEEDA?>?>====>?BDFFDCBBCCCCDDEFHNYio~¡¡¡¡¢¡¢¢£¥¦§©ª¬®±²³³µ¶µµµ´²±¯®°°±±±¯¬©¤oZPJDB>>:863112355555678::88::898:<<;;>@CCEINQUX\_dkppnnnnopoonnnnnnnoppqqqrqqppomjiklnnmmnnpqqqqstqlhhkb^THCDGF8--0/.+--/14579;@DHFB?>>?@BDDB><<;;<=>>=>>@AA?>>?ACCCCCDEEFGHJJKMNOPPPPQOPQRSTVXY[\\[YWVSSRRRRRQRQQQRRSS²´¶¶µµµ¶´´´³²±±°¯®¬««««««««ª©©©««¬¬«¬®¬¬¬¬«««««¬¬¬¬®®«¬®®±±°°±¯¬¬®®®®®¯®®°±±±±±±±°¯®®®®¯¯¯¯¯¯°±±°¯¯°±±±°¯°°¯¯¯¯°°°¯¯°¬®¯®®¯¯¯¯®®®®®®®®®¯¯®®¯¯¯°°°°°°¯®®¯¯®®°°°±±±±±°°°±±±±±±²²±±±±±±±±±±±²²²³´´´´³²´´²±±±±±±±±°°°°°°¯¯¯¯¯¯¯¯¯¯°°°°°¯¯¯¯¯®®®®¬¬«¬¬¬««««««««««¬¬«««««¬¬¬««¬¬«««¬¬««««««««««ªªª©©¨¨¨§§§§¦¦¥¥¥¥¥¥¤¤¤¤¢££¤¤¤¤£¤¤££¢¢¤¥¥§©ª©©ª«©©¨§¦¥¥¤¤££¢¢¡ ~|{zxusj_VOMPThx¢¦«°²´µµ¶¶µ········¸¸¸·¶µµµµ´´µ¶¶¶¶¶¶µ´³³²²±±±±±±±±°°°¯¯¯¯¯°°°°°°°°°°°°°¯¯¯°±±±²³³´´´´´´´´´³³´´µµµ´·¶¶¶¶µµµ²±±±±±°¯««¨¦¥¤¢ }wwutsqpoprsqonljgfefjs|~}|wolpxzxtrnmnsuvwxywtrqqonnmmmmmkhghhhmttz~}} {tnllkklnnnnnljiigb`^^__a`_fs{|}{{|}|{|~wssqppruy{|zzzxwxyywtrpnpsssvzwvmc`_biqqttv}}zwutqoqtwvtsrqqqrttpmliiijklllpqrssstttrnlihhjlkkmnnkhb[]`ab^\__`a`^]]\[ZXVPID9621/./058=AGLOOPNMNPPPPMKJJIIHGEFFFGIJKIGEDDDEEGGGHIHFDDDEEDC@?>=<===>?CEHHECBCDDDDEFGHPJ\nt ¡¢¤¥¥§ª«±²³²²³³³²±°¯®®°±±°¯«©¥¢ ¢|lZRMGFA=8742123567777889;<98:9788899889;<:>CFHLROQV^dgikhhjlnnnmlkjjjkllnnnnnmllfbabdgilkklmnooonoomf]UPLJ>/+/101+.//.+..1368:>@@DGFEDDCDFGGFDCAA@>>>>@ACBCDDCAA@ABDDEFFGGGGHIJJJKNPPQQRQPPPQRTUVXZZYWVVSRQPQQQQRQPPQRRR²´µ¶µµµ¶¶¶µ´³±±±¯®¬««««««ªª©©©©ª«««««¬¬¬¬¬««ª««¬¬¬¬®®®®«¬¬¬¬®®±±°°±°¬®®®®®¯®¬¯±±±±±±±°¯¯¯¯¯°°°¯¯¯¯°±°®®¯°±°¯¯¯¯®®®¯¯¯®®®®®®¯¯¯®¯¯¯¯¬¬¬¬¬¬¬¬®®®®¯¯¯¯¯¯¯¯¯°°°°±°¯¯°°¯¯¯°°°±±°°°°±±±±±±±²²±±°±±±°°°°±±±²³´´´´³²´³²±±±±±±±±°°±±±°¯¯¯¯°±±¯¯°°°¯¯¯®®®¯¯¯¯¯®¬««¬®®®¬«««««««¬¬¬¬¬¬««««««¬«««¬¬¬«««¬««««««««««««ª©©¨§§§§§§¦¦¥¥¤¤¤¤¤¤££¢¢£¤¤¤¤¤¤¤¤¤££¤¥¥¨ª«ªª««««ª¨§¥¥¥¤¤£¢¢¡ }}|zzywtoibVIDO_q«®°³·····¶·¶¶···¸¸¸¸¸·µ´´´µµ´µ¶¶¶¶··¶µ´³²²±±±²²²±±²±±°°¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®°±±±²³´µ´´´´´´´´³³´´´µ´´····¶¶¶¶³³³³²±°¯¬«¨§¥¥£¡zyxusqoonoomjihgedcdis~ {|}{z|vofbhpsplkjjnuz{{||zurqpnnnnnnnmjfdeedisxz~}~ yrmllkjjlmmmlkihgfedbb`_`]\cs|}|zzz{{|~}vtsqrrtwz{~{{zyxyzywtqonnrrsx|ztidbchoqttu}|vollmkhnrutqnmlijlnnkihhhhhklllmnprstuuwtokheeghhiknmjhd_bfhid`__^]_abaa`^\XPHB8521101158<AHNPPONMMOPPPMLJJIHGFEEEEFHIIFDCBBDDEEDDEGGEDABDDDCA@?>>>??@BDGIIFDCDEEDDDEGH\Meuz¡£¥¥¤£¢¡¡£££¥©©¬°²±±°°²±±¯®¬««®°°®«¨¤¥ zp^VPIG@;75322356567788:;?@>==;8:88878888><>B@:;@FGJOSW]bbcehkmmlkjihhhhillllkjihhdaacehkkkkmnoonplhheYE6795++4720--*(**--0257:>@BDFHIJIGKKJGDDEGEDC@?@BDEDDEFEDDAABBDEGHGGFEFFGGGILOPPQQRQPOPPQRVVXYXWVURQPPPQRRSQPPQRRP³´µ¶¶µ´´µµ¶¶¶µ³²±¯¬¬«««ª¨§¨ªª©©©ª«¬ªª««¯¯¬¬¬¬«««¬®¬¬¬¬¬«««««¬®«¬®®¯°®®¯®¬®®®®®®¯¯®®¯¯°°±±°¯¯¯¯¯°°¯¯¯¯¯¯°¯¯¯¯®®®¯®®®®¯®¬¬¬®¯¯®¯°¯¯®®®®¬«¬¬¬«««¬®®®®««®®®¯¯®®®®®®®®®°°°¯®®¯°¯¯®¯°°°¯°°±°°°±±±²²²±±±±±±±±°°±±²³´´´³³²²²²±±±±±°°±±±±°°°°°±±°°°°°°¯¯¯¯¯¯¯¯¯¯¯®®®¬¬¬®¯¯®¬««¬«««¬¬¬¬¬¬¬«««««««¬¬««««««ªªªªª««ª««««ªªªª©©©¨¨§§¦¦¥¥¥¥¥¥¥¤¤¥¥¥¤¤¤¥¥¥¥¥¤¥¥¤££¤¥©ª«««¬«««©¨¦¥¤¥¤¤£¡¡ }|{zyxvtpkcZNKZl|¥«±±±µ¶····¸¸·····¸··¹¸·····¶¶¶¶¶····¸··¶µ´´´³³³²²±±±²±±°±±°°°°°¯¯¯¯¯°¯¯¯¯°°¯°±²²³³´µµµµµµ´´´´´´´´µµµ¶µ¶·¶µ¶·µµ´³³´²°®¬ª§¦¥¢ {zyusqnmnmlkihfda__aflrtssrponnmhgddhlnnihhiox}~~{wrnlnnnortqmhcbbbbhox} ztpnnmkjiklmmnljkhhggdb`__bhouwwxxyyz{~{vsqpqstuwz }zxwvuvusponnpsuxz{zviefejnoonosx|}sqnljihhinsspmigfeeeeeedhhhjlnnnjhlqrtuttuphebbegeefhiklhfhkkjg`a`^_abcbcca][VMD<732214779:?IOPPPOLLMOPPNMJJJIIHEDDDFHJJGEDDEGHGFEDDDDDDA@?>>?@A@?>>=?BDHGGGGFDCDDDEEEFF]Vkt ¡£¤¤£¤£¡¡¡ ¡¢¤¥§¨«¯¯®¬¬«ª©©ª«¬ª¨¦¥¤¥zqgXPME=:6668998688888899<>>>;98876556777889;843747>GMPV\^aehheb_\YVY_dggloplhf_WSPPNMS\`dgijjifc_TQRE2+.33211123/.-,+,,-/0258:=@BCEGHIJJKLKJGEFHHIHFDDFHGGHIHFDEEFHJJJKKJJHFDCCCBHIKKJNLPMJJLPTVWWWWWVUTRRRRRRRRPPOPRSRP±²´µµ´´´¶¶¶··¶³²±¯«««««©§¦¨©©¨©©ª«¬«©©«ª«¬¬¬¬««¬¬¬¬¬¬¬¬«««««¬¬¬¯®¯¯®®®®®¯®®®®¯°°±±°¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®¯®®®®®®¬¬¬¬®¯®®®¯°¯¯®®®®¬¬¬¬¬««¬¬®¬¬®®®®®®®®¯¯¯¯®®¯°¯¯®¯¯°¯¯¯°±±±°±±²²²²±±±±±±±±±±±±³³´´´³²±±±±±±±±±°°°°°°°°¯¯¯¯¯¯°°°°°°¯¯¯¯®®®¯°°¯®®¬¬¬®®®¬¬««««««¬««¬¬¬«««««««¬¬¬¬«««««ªªªªª««ª««««ªªªª©©©¨¨§§¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¥¥¥¥¥¥¤¥¥¤£¤¥¥¨ª««««¬¬ªª©¨§¦¥¥¥¥¤£¢¡¡ ~|{zzyxvuqlf^VVev¢ª®±³²¶············¸········¶µ¶¶¶¶·······¶µµµµ³³³²²±±±²±±±±±°°¯¯¯¯¯¯°°°¯¯¯¯°°¯±±³³´´µ¶¶¶¶¶µµµ´´´´´´µµµµµµ¶¶µµ·µµ´²²²±°±®«©§¥¢ {zxtqonkhhhgeca_\ZYZ]bgighjjhgffdcbbfiihhhhkszzvrnmnnprttpleb`_^`hr{ zvrponmlmnoopqpnnkihgda``bfkptvvxxyzz|~~zwsportvwwz }zvtsrqpnonnortvxywtjgefmnlkhghlnnqomjhhgfgjnnmkhedddeeedcdfhknnnmhfgkmosrsrkc`__bdddehikkhgillkhba`_`bddddcb`\WPI:634435878:>HNOOPONMMNOONMKJJJIHFEEEGIJJIGEEGHIIGEDBBAA@>><;;<>>@@@??@CDGGGGGFDDEEEEEFFGXWow ¢¢¡ ¢¤¥§¨ª«¬¬«««ª©¨¨¨©ª«««ª©§¦¥¥ zn_TNF>;77678887778889::;:::98875444443243478668459@EHKPRSUVTQOMJJJNSXZY_dgeca\UPKFA>DPVYWVVXXSND<<?8,*,11110011..-,+,.0/01468<@DDFFGGHIJKJIFFGIJJKKKJJJKJJKLJIHIJKLLLLLJJHEDCDDDIHJIINMOMKKMPSUVVVVUTRQQRSTTSRQQPPPRSRQ±²´µµµµµ¶¶¶··¶´²±°¬««««¨¦¦§¨¨¨¨©©ª«ª¨¨ª§©««««¬¬¬««¬¬¬¬¬¬¬¬««««««¬®®®®®®®¯®®¯¯¯±±°°¯¯®¯®®¯°°°°¯¯¯®®®®®®®®¯®¬¬¬¬¬¬¬¬«®¯¯®®¯¯¯¯®®®®¬««««¬««®®¬¬«¬««¬¬®®®®®®¯¯¯®®¯¯¯¯®®¯¯¯®®¯°±°°°°²²³²±±±±±±±±±±±±´´´´³²±±±±±±±±±±°°°°°°°°®®®®®¯°°°°°°¯¯¯¯®®®¯°°¯®¬¬¬¬¬¬¬«««««««ª««««««««««¬¬¬¬««««««ªªªªªªªª««ªªªªª©©¨¨¨§¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤¥¥¤¤¤¥¥§¨©ªªªªª©¨¨§§¦¥¥¥¥¤¤£¢¢¡ ~}zzyxxwutqmhb_ct «°±²´µ¶············¸····¶¶··¶µ¶¶¶········¶¶¶¶¶´´³³²²±±²±±±±±±°¯¯¯¯¯°°°¯¯¯¯¯°°°±²³´´µ¶¶¶···¶¶µµ´´´´´´´´´´´µµ´µ·¶µ´²±²±±±°¬ª§¥¢~{uplkhgcbbba^\ZVUTSTW\_]befdbbb`abdgihfgghmu}|ytqonprtvvtojca]\\anz zxutsponprsttutspnjhgdbbbdhmoqrtvwyz{|~~|ytqnrtvvvx|{xtqnnmllnnnoprtuwurlifjsoonjggjmmonlihfeddfhhhhgeeefghgfebdhloonkhdehjnponlc\[[\_bcceghiigfhkkjhba``bceeecbba]XSP97567668788=GMOPPPONMMMNNMLKJJJIHHGGIJJJJHGGHIIIHFDB@@??=;9889<>@@ABBBCDDDEFGGFEFFEEEFGGSXry ¡¡ ¡ ¢¥¦©ªªª©¨¨¨¥¥¥¥¦§©ª©¨¦¥¥¥£¢ weWKA:88767888888889:;;:9889998;:::986430/133334349=?ADA@>=9866789>DILMVXVPG>5,#(178:>@C@<:;<84-)+0-)+,,-/00///.-,++-02113456:>@@@@@BDDJJJIGFHJJKLNONMKMKJKMMKJJLMMKJKLJJGDCCDEEJHIIIMMMMNNOPSUUUTTSRPOQSTVVUSQRQPPRSSR±³µ·¶¶¶·µ¶¶··¶³²²±¯¬¬¬«¨¦¦§¨¨¨©©©ªª©¨¨©§¨ª«««¬¬¬¬¬«¬¬¬¬¬¬««¬«««¬¬®®®®®®®®®¯¯¯°°±°¯®®®®¯°°°¯®®®®®®¯¯¬««¬¬¬«««¬¯¯¯¯¯¯¯¯®®®®®¬««©©ª«««¬®®¬«¬««¬«««®®®®®¯¯¯¯¯°°¯¯¯¯¯®®®¯¯¯¯¯°°³³²²±±±±±±±±±±±±³³³³²²±±±±±±±±±±±°°¯¯°°±°¯¯®®¯°±¯¯¯¯¯¯¯¯¯®¯¯°°¯®¬¬¬¬¬¬¬¬¬««ªª««ªª««««««««««««««««««««ªªªªªªªªªªªªªªª©©¨¨¨§¦¦¦¥¥¥¥¥¥¥¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¤¥¥¥¦¦§©©©©©©©©¨§¦¥¤¤¥¥¥¤¤££¢ }|zywvvutspmieen¡¨¯±±²´µ¶············¸····¶····¶¶¶··¶¶········¶¶´´´³³²²²²±±±±±±°¯¯¯¯¯¯¯°¯¯¯¯¯°°°±±³´´µµ¶······¶µ´´´´´´´´´³´µµ´µ¶¶µ³²±²²²±¯«ª§¥¢zpgccb`^^^^]\YWSRQPPTX[\`cedccdcehjlmjghhhmt|~|{zyurpppuwzzytnica^]`hw~|zzyvsqqstuvxyxupmjhgeddehmnnnprtuwyyzz|}~~zvqnqtwwvwz~|ytrnljjijllmnopqsttqnlgnytqokhghklnmkihfedcddeghhhhhiklljiddfjoqnjhcdhjlmjhf]VUVZ_bdeefggedbehhgea``abcddcbbaa]XVV=:888778787:DKOPPPPOMLLLLLLLKKJJJJJJJJJJHGGGGHHGGEDBBA@@<;989<>?@ABBCCDDCCDFHIHHGFEDDEFGKPju £¥§§§¦¥¥¥¥£££¤¥¥§¨¨¦¥¥¥¥¤¢ £ziZK@:798889999999::;<<<;;;<<<;>>=<;8753/-.0111311489<>762/,+++%(+19AHKFGFC@=71&%%%%+6:6630--./*')+))+,*+.01000.-,,.1225577547:98889<>AHIJIHGHJJJKKLLMMMLKLMMMMLNNLJHIJJIFDBBDDCHHJJJNLNPPPPQTVUUTSSQPOQRTUUTSRTRQQRTSS±³¶·¶¶¶·µµ¶¶¶µ³²²±¯®¬««¨§§¨¨¨¨©©ªª©©©©©¨©ª«««¬¬«¬¬¬¬¬¬¬¬¬«««¬««¬¬«¬¯¯®¬¬®®®®®®®®®®¯°±°¯®®®®¯°°°¯®®®¬¬¬®¯¯¬««¬¬¬««««¬®¯¯¯¯¯¯¯®®®®®««©©ª«««¬®®¬««ª«¬¬««¬®¯°°¯¯¯°°¯¯¯¯¯¯®¯¯®®®°±²²²²²±±±±±±±±±±±²²²²²²²±±±±±±±±±±±°°°°±±±±°¯®®¯¯¯®®®®®®®¯¯¯¯°¯®®®¬¬¬¬¬¬¬¬«««««««ª«««««««««««««««««««««ªªª©©©©©©©ªªª©©©¨¨¨§¦¦¦¥¥¥¥¥¥¦¦§¦¦¦¦¦¦¥¥¥¥¥¥¥¤¤¥¥¥¦§¨©©©©©©¨¨§¦¥¥¥¤¥¥¥¥¥¤££ ~|{zywvutsronkhkw¦ª®±±³´´µ¶······¸········¶¶¶···¶¶···¶¶··¹¹¸¸···¶µµ´´³³²²³²±±±±±±°°°°¯¯¯¯¯¯¯¯¯°°±±±³´´µ¶·¸··¸¸··µ³³³³³³³³´³´µµ´´¶´³²±±±±²±®«ª¨¥¢yh\Z\\[\\\\\YVUQQPPPSW[^`abbcdejmoqrqmijiilsyzyxwvtqprsz|~}zsmiddfhnw~}}}|ytqpttuwzzzwpmihgefglnqqnnpsrttutuwy{}~{vqnrtxzyz|~|{zwtqnlkjjjknorrqppqrpnkfnzwttojhgggnljhhgeedddfiklllmnnoonnhecflomieaadeggdbaZRPQV\cegffecabacfddc````aaaaaa``_]ZXXA>:876677758BJNPPPPOMLKLKKLLLLKKLKKKKKJJGFFFGFEEDDCBBA@?====>?ABCCCCDDEEDDDFHHHGGFEEDEEFDEYjz}¢¤¥¥¥¤¢¡ ¢¢¢£¤¥¥¦§¦¥¦§§¥£¢vk`RGA<;;;;;;::;;;;;;;;;<>>>===@>=;987620./011210012479541/-,-.44321123;95111-(((++***(/0.+)+-/,*+*'(+*)+-011110.-035547888745777788;>AFHJJJIIIJJKKJJKMOPPONOPPNOOLIFGIHGDBAABCBGGJJKONPQSSRRUVVUTSSRQPQQRRSSTTTSRRSSSR°±´µµ´µ¶¶¶µµµµ³²±°¯®««©©¨§¨©¨¨©©ªª©©ª©¨ªªª«««¬¬«¬¬¬¬®¬¬¬«««««¬¬¬¬¬««¯¯¬¬®®®®®®¬®®®®®°±±¯®®®®¯°°°¯®¬¬¬¬¬®¯®¬«¬¬¬¬«««««¯¯¯¯¯¯¯®®¯¯®®®®««ª««¬«««««««¬¬««¬¬¬¬®¯°°°¯¯¯°¯¯¯°°¯¯°¯®¬®°±²±±±²²²±²²±±±±±±±±²²²²²±±±°°°°°±±±°°°°±±±°¯®®®®®®®®°¯¯¯¯¯¬¬¬¬¬«««««««««««««««««««¬«««««««««««««ªªª©©©©¨¨©©ªª©©¨¨¨¨§§§¦¦¦¥¥¦¦¦¦¦¦¦¦¦¦¦¥¥¥¥¥¥¤¤¤¤¥¥¥¥¦¦¦¦¦§¨§§¦¦¦¦¦¦¥¥¥¥¥¤££~{zzywvutsrponnu¥©«°²´µµµ¶··············µ´´µ¶¶¶¶¶···¶¶¶·¹¹¹¸¸···µµµ´´³³³³²±±±±±±±°°°¯¯®®¯¯¯¯¯¯°±±²³µµ¶··¸··¸¹¸¶´³³³³³²²²´³´µ´³´µ±±±±°¯°±±¯¬ª¨¥¡wfXVX[[[[[ZYWUSQPPPQTX[aabbcefgknruwwtpmlkmquwvwvtrpqtw~~yrnlhmsy~~~ztpnqrtvy{zxpmihffhiprsqonoqpqrqqrtwz|~|ytqortxz{|}~}{zyxusromlkkkltvyyvsqqqpmjflzzyxuqnljhljhfeeddccehmnpqppoppponlgbbhjigd_^_`ab`^]WQNMPVadgfedb_babdbbb___^^]]\\^___^]ZVB?;876777868BJMPOOOOMMLLJKKKKKLLLKKKKKJIFFFGFEDDA@????>>?@ABCDDDEDDDEFGHFFFGGGEDFFEEDDDDD@K\orx}~~¢¤£¤¤£¡ ¡¢¢££¤¥¥¥¥¥¦¦¥¤¢|qibTJD><<<<<;:9:::::::98:=>><<<?>;9887732100001...../12110.--./.013334430+*+.,)'$$%%')()'%%&)*)+))(%'*)++-./00111138:98889:8667999:;=@BEGIJJJJJJLOOMLLMPQRQPPPQOOMJFDDEFEDCBABCEIGJJLQPQRSSSTVWVUTSSRQQPPPPQRTUUTSSSSRQ¬¯²³³³´¶·¶µµµµ´³±°¯¯«ª¨©¨¨©¨§¨©¨©ªªª«ª¨«««««¬¬¬««¯¬¬«««««««¬¬¬¬¬«¬¬¬¬®®®®¬¬®®®¯±±¯®®®®®¯¯¯¯®®¬¬¬¬¬®®®¬¬¬¬«««««ª«®®®¯¯¯¯®®¯¯®®®®¬«««««««¬¬¬««¬¬¬¬««««¬¬¬¬¬®¯°°°¯®®¯¯®¯¯°¯¯¯¯®®°±±±±±²²²±²±±±±±±±²²±±±±±±±±°°°°°°°°°°°°°°¯¯¯®®®®®®®¯¯®¯¯®¬¬¬¬¬¬¬¬««««««««««««««««««¬¬¬«««««««««««««ªªª¨©©¨¨¨¨©ª©©©¨¨¨¨§§§§¦¦¦¦¦¦¦¦¦¦¦¦¦¥¥¥¥¤¤¤¤£¢¢£¤¤¤¥¥¥¤¤¥¥§§§¦¦¦¦¦¦¥¥¥¥¥¤££ }zyyxvuttrrppqw ¨«¬¯±²³µ¶¶··············¶´´´´¶¶¶¶¶···¶µ¶·¸¸¸¸¸···¶¶µµ´´³³³²±±±±±±°°°°¯¯¯®¯¯°¯¯¯¯°±²³´µ¶·····¸¸·µ³²²²²²²²²´³³´³²²´°°°°¯¯°®«©§¥¡ {k^XZ\^^]\\ZXVTRQPQTX\^ceghiijklotwz{zwqqpoqttstspnmpvz~ysqrrx{tnkmnpswzzxpmihghjnsssrponnooonnptx}~~zvsrsrtwz|}}}{zzxwwusrnljjiikuy}}ztrqnnhgehsxvwwuromkjhecbbaaabekoqsutrpnnnmllhdcdfedc_^_^^_]\[VQOLMQ\befeeb_b`aa^^`^]]\[ZZZZZ\^^``YQA>;8889:9;:=FLMNONNNNNNMKKKKJJKKKJJKJJHGEEFGFDDC?>>=>?@ADDDEEEEEFEEFGHHHHHGHGFEDDDDDCCBAD?DPeisw}||~ ¢£££¢ ¡¡¢¢££¤¤¤¤¥¥¥¥¤£¢~zyjaXJDB=<;:9887788888888789;<<<;;97554446532110/....////--,+++,-.012221131.++*(%(%%%#%'&((''())')%&&%(++,,+++,-/11369<==<;;;:8889:;<=>@BEFHJJKLLMNPPPPPPQSSQPPPPPNLIEDDDDDEEDDDEHKJKMMQPPPRTTUVWWVUTSRQQOOOOPRTUTTTSSRQPª±²²³´¶··µµµµµ´±°°°¯¬ª¨©¨¨©¨§§©§©ªªª«ª¨«ªª««¬®®®««¯¬¬««««««©«¬¬¬¬«¬¬«¬®®®¬¬¬®¯±±¯®®®®®®¯¯¯¯¯¬¬¬¬®®¬¬««««ªªª«¬®®¯°¯¯®®¯¯®®¬«««««ªª«¬¬«¬¬««««ª««¬¬¬¯°°°®®¯®®®¯¯¯¯®®®®®®¯±±±±±²²²±±±±±±²²²²²²±±±±±±±±±°°°°¯°°°°°°¯¯¯¯¯¯®®®®®®®®®®®®®®¯¯®¬¬«««¬¬¬«««ªª««««««««¬¬¬¬¬¬¬¬««««««««««««««ªª¨©©¨§§¨©ª©©©¨¨¨§§§§§§§¦¦§¦¦¥¥¥¥¦¥¥¥¥¤£££¤¢¡¡¢££¢¥¥¥¥¥¥§¨¨¨§¦¦¦¦¦¥¥¥¥¥¤£¢ }zxwvttssrqppt}¥¨¬®±²²²´¶¶·····¶¶·······¶µ´´µ¶···¶···¶µ¶····¸¸···¶¶µµ´´³³³²±±±±±±°°¯¯¯¯¯¯¯°°¯¯®¯°±±²´´µ¶·····¸·µ²²²²²±±±±³³³´³±²³±°°°¯¬¬¬«©¨¦¤¡te]\_bbb`^\ZWVTSRTX\abdhmnnnnnosvz{|{yuutsssrppoliinw}~yuux{ {tmihilpuzzxnlihhjnqttttsqonnnnnnpuz~ztstvstx{}zzzyyxvtqnihgghiquz|ytpnhicbbbltxz{zvsomigca_^^^]`ekpstwvtpnlkkjljhecbbbb_`b_]\[[YTQPNMPX^cdefda`]^^[\\\\\[YXXXYV[\]abXL>>;9:<===>>BJONNNMLMNOONLLLJJIJKJJJJJIGEDEFFEDCB>><<>ADEGGGGFFFFEEEFHIHHGGGHHGFDBBBBA@?>?>?J`hty~|{~ ¡¢¡ ¡¡¢£££¤¥¦§§¦¦¦¦¤ yvdVL?>B?:9864333455666667789<==<=;9888886555776410/0121/0/.,++-./...----)**)'&%$#"$$"$&%&*,+'%&&'$%&&(,--,+)()+,11468;>A@>==<:8889;=>?ABDEGHJKNOPPOOPQRRSTTSRSRPQPMJGEDDDDFGGFGGIMMOPNPMMOQSUVVWXWVUTSRQNNNOPRSUTTTTSRPO«¬¯±±±³¶¶¶µµ´´´´±±¯¬«««ªªªªªª©¨§¨©©ªªªª««ª©ª«¬®®®®¬««®«ªª«««««¬««¬¬«¬¬¬«««¬¬¬®¬¬¬¬®®®®¯¯®¬«««««¬¬¬¬««««««ª©««¬®¯¯®®®¯¯¯®®¬¬««¬¬««¬¬¬«¬¬«¬¬««««¬¬¬¬¬¬¬««®¯¯¯®®®¯¯¯¯¯®®®¯¯°°±°±±±°±±±±±±±±±°°²±±±±±±°²²±±±°°°°°°±°°°¯°°¯¯¯®®®¯¯¯®®®®¯¯¯®®®¬¬«««¬¬¬¬««««¬¬¬«««ªª««««¬¬¬««««««««««««ªªª©©©©©©¨¨¨¨©¨¨¨¨¨¨§¨¨§§§§§¦¦¦¦¥¥¥¥¥¥¥¤¤¤£¢¡¢¡¡ ¡¢¢¢¢£¥¥¥¦§¨¨¨§§§¦¦§§§¥¥¤£¢ }zwwxywtsssstotªª¯°±±²³µ¶¶¶····¶¶······¶¶µµµµµµµµ···¶¶·············¶µµµµ¶²²²²±±±±±°¯¯¯°¯¯°°°°°°°°±±²³µ¶······¶µ³²²±±°°°±±±²³³²±±²°¯®¯®¬«ª©¨¥¤¢ xpighhhgda\ZXWVVVZ^cfhilnqrqpnrtwz}}|zzwvutsrrrhfdbhtzzxwy}|vngfefiqxyvpnmjikoswvvvusponppnnszztvvvwxz}~}{zzzyvsnhhhgffinvzwvrke\[^]fhzvwyzxsonmgb`]^_^_`dkptvyxwtqnjihjmkhgebb`bbb`]\\\\\XROOPW]cfhhhgbb^ZVVY\^\\ZVVWVVVWZZSH>>=;:;>@AABDFIKNOMMMLNPPNNMLKJJKKMLJJHFDCBBDEFFDA@?>?@BBADFJJJHFFFFFFFEEDGGGGGFDDA?>>>>>>>==BJSbrwwv ¡¢¡¢£¥¦¥««««©¦¥¥¥¡}yd\T8A?>;86532112234579;;:9999;>>>==<;987777776652112310/.-+**+------,+++*)))(%$#""$%%')*+..-+)(''')+.010/-*&&*--1236<@A@?>>?>>==>>@BCDDDDFJMPPORPOOQSSQSSRQQQPPPNMMKJJMJIHIIHHHLOPPNLLMOPPQRTVXWVTRQQQRPPPPPQRSTTTSRQPQ®°±±°±³µµµµ´´´´±°¯¬«««««ªªªª©¨¨©©©ªªª©«««ªª«««¬««®¬«ªª«««¬¬«««¬«¬¬¬«««¬¬¬¬¬¬¬¬¬¬®¯®¬¬««««««¬¬¬¬¬¬¬¬¬¬««ªª««¬®¯®®®®®®®¬¬«««««¬¬«««¬«««««««¬¬¬¬¬¬«««®®¯¯®®®¯¯¯¯¯¯¯¯°°°±±±±±±±²²±±±±°°±±°°±±±°±±±±±±±°°°°°°°¯¯¯¯¯¯®®®¯¯®®®®®¯®®®¯¬¬¬¬¬¬¬««««¬«««««««««««¬¬«««««««««««««ªªªªªªª©©¨¨¨¨¨¨¨¨§§§§§§¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¤££££¢¡¡¡¡ ¡¡¢£¢£¥¥¥¥¦¨¨¨¨¨§§¦¦¦¦¥¥£¢¡~|zxwvwvtsttsppy «¬°°±²²³´¶¶¶···¶¶µ··¶¶¶¶¶¶µµµµµµµµ¶¶¶¶¶¶¶¶···········¶µµµµ´³³²²±±±±°¯¯°°°¯°°°°°°°°±±²³´µ¶·····¶µ³²±±°¯¯¯°±±²³²²±±²±¯®®«««©¨§¥£¡}xspqpnlhd`]\[\[\^djnpoqrttttstux{}~}||yvutsqpjb``_dntzzwuwz}|vmeeedglsvvrpnkjmptwwxyxutrprrpqwwtxwy~~~~~||{zxtttrmhefhkrvttqmeZZ\Zfhqrtvywsppnhca^^``dehknquzzwtronkijljhihcbbceca^]^]__\VSQRW\befgggdb]ZWWYZ_]^[URSRPPPQOIA:=>>@ABCCFGHJKLNONNNNPQPOLLJJJJKLKKJJHFDB@ACEGHFDDDCCCCCBDFIJHFDDEEEDDDDCGGGFEDCB@?>>>==<>=:;?GWhntw £¤¦ª©««««ª§¥¥¦ thY;D>:86444323223357:=?>>>><=>>>=<;98776788988862110/.+++*)*++++++++++*)((('%$$##$%%%'*+.//-++''(*,/12210+('*+-1557;>>>>>>?@??@ABCDDDDDDFILNNNPNMNQTTSSRPPPPONPOONMKKMMJIIIJJKLNPPMKLMNPRSSTUVVUTSRQQPQPPPQQRRRRRQPPQQ®¯±°°±²´µµµµ´´³°¯®««««««ªª©©©¨©©©©©©©©««««««««««¬¬«««®¬«ª©«««««««««¬¬¬««««®®®¬¬¬¬«««««¬¬¬¬¬¬¬¬¬¬¬®®®¬¬«««««««¬¬¬««ªª«¬¬¬®®®®®®®®¬«««««¬¬«««««««««««¬¬¬«««¬®®®®®®®¯¯®®®®®¯°±±±±±±²±±±±±°°±°°°°±±±±±±²±±±°°°°°°¯¯¯¯¯¯®®®®®®®®®®®®¯¬¬¬«««««««««««««««««««««««««««¬¬««ªªªªªª«ªª©©¨§§¨¨¨§§¦¦¦¦¦¥¦¦¥¥¤¤¤¤¥¥¥¥¥¤£££££¢¢¡¡ ¡¡£¢£¥¥¥¥¦¨¨©©¨¨§§¥¥¥¥¥£¡ ~}|zxwtttssttsrz£«°±±²³³´µ¶¶¶¶¶¶µµ¶¶¶¶¶µµµµµµµµµµµ¶µµµµµµ¶¶··········¶¶µµ¶µµ´³²²±±±±°°°°°°±±±°°°°°±±²³´µ¶·····¶µ³²±°¯®®®¯°±±±±±±±±±¯®«ª©ª¨§¥¤¢ yvusrniea_^]babejptuwvvvvwwxxxz{}~~}|yvttojg\VVWX]fjmooqw| ~wngeeccflrutrnlkmqtvwyzyxvustsrtz}ttvtz~}{zzzxz}|vnihghmrqqrpbVVVVikmnptutqppnhb^]]`bhhjklnsxyvtsrolhiljikiecefgeb``aabca\XVUX\`bceeeb`\YXXXX_`a]UPPPQQPNJE@><>ADDEFGJJLMMMMNOPPPQRQOKJJIIJJKJJIIGEC@ABDFIJIHHGFDCA@@BDFFDCAA???@ABDDFFGEDBAA@?>>><;:;;8558FVdqy }} ¡¤¥¨««««««©¦¥¥¡yo\>C;564345445333348;>ABCDC@??>>=<;:8878889988851-+**)('''()))))******)'&&'&%%%%$%%%%&*+.//-++(()*+.12331-+)*+.25558;<===>@ABBDDEFFFEDDEGJJKLMLJIJNPQPPOMLLLLLMOONMMLKLJJJJJJKLMNMLJKLNPTVUTTTTTTSRQPOPPQQQQQQPPPPPPQS««°±±±³³´´µµ´³³¯¯¬««««««ª©©©©©©©©©©©©©ª««««¬¬¬«««««ªª«¬®®«ª©ª«««««««¬¬¬¬««««¬®¯¯®®¬¬«««««««¬¬¬¬««¬¬¬®¬®®¬¬««««««¬¬¬¬¬¬¬««ªª««¬¬¬®®®®®®®®®®««ª««««««««««««««««¬¬«ª«¬¬®®®®®®®¯°®®®®®¯°±±±±±±±±±±±±°°°°°°±±±±±±±±±°°°°°°°°°¯¯¯¯¯®®®®®®®®®®®®®®®¬¬««««««««««««««««««««««««««««««ªªª©©©ªªªªª©©¨¨¨§§§§¦¥¥¥¥¥¥¥¥¥¤£¤¤¤¤¤¤¤¤£££££££¢¡ £¢£¥¥¥¥¦¨©©©©¨§§¤¥¥¥¤¢ ~|{zxvttsrstttv ¤¤«®±±²³³³´´µµµµµµµµµµµµµµµµµµµµµµµµµ´´´´´´µ¶¶¶·····¸···¶¶¶¶µµµ´³³²²±±°°±±±°±±±±°°°°±±±²´µ¶¶¶¶··¶µ´³°¯®®¯¯±±±±±±±±±¯¬«ª©©§¦¥¤¡ |yvssnidbbbcgghlptvwzyxwxxyzyyxyzzzzywvtph^YQOOPQV]dhkmpx~~zqifdbbdiottqnjilpstvyyyyyyxwutu{ ~qpqq}}zzzzz|}|}zpiheinopstaSRQRlplnopqqonnmg^ZZ\_emllkkmpstsssqnifgkkjkhdceghgdbbcdefc`\YXZ\^_`aa`]\ZXXXYZ`ac`VPPONNMJFB>=>@DEGJMPMNPPPOPPPPPPQQOLJJIHHIIJJJJJIGDBDEFHJJJIIIGDA>>>?@BB@?>>::;<>?BCBCDCA?@A@?>>=<:87863216>[my} }|} ¡ ¡¢££¤¤¥¥¥£¤¥¥©¬««ª©©§¥¥¥¡ytcHG=954456666444468;=>@DFFDCB?>>>>=<:;;::987631/,*((('&&'))('))*****+*)(((('''&%&&&&'*+-.-+)'()))*,01110.+++,/2443589::<>?BDDFGHIHGEDDEIJIIJLKIFFILMMKJIIIJJJJMNLLMLJJJJLMKJJKKLKJJJKPRVVVTSSSSRRQPOOPPPPPPPPPPPPPPRTªª¬¯±±²´²³´´´³³²¯®¬«««««ª©©ªªªª¨¨©©©ªªªªª«««¬¬¬««¬¬«©©«««®¬«ª©ª«««««¬¬¬««ªªª¬®¯¯¯¯®¬««««¬««¬¬¬¬««¬¬¬®®¬¬¬«««««¬¬¬¬¬¬«««««¬«¬®®¬®®®®®««««««««««ª««¬««««««¬«ªª«¬¬¬®¯¯®®®¯°¯¯¯¯¯¯¯°¯°±±±±±±±±±±±±°°°°±±±±±±²²±°¯®¯°±±±°°°°°°°¯¯®®®®®®®®®®®®®®®¬¬¬¬«««««««««««««««««««¬¬«««««««ªªªª©©©©©ª©©©©¨¨¨¨§§§¦¦¥¥¥¥¥¥¥¥¥¤£££¤¤¤¤¤¤££££££££¡ ¢¡¢¤¥¥¦§¨¨¨©¨¨§¦£¤¥¥£¢ }|zzxvttsrsttut ¤¥«°±±²³³³³´³³´´µµ¶¶µµµµµµµµ´´´´´´´´´´´³³´´´µµ¶¶¶·········¶¶µµµ´´´³³²±±±±±±±±±±±°°°°±±±²³´µ¶¶¶··¶µ´³°¯®®¯¯°°°°±±±±°¯¬««ª¨¦¦¥£¡|zwtpjgfhjlnnnptxz{{zxxxyyyxwttssrqsrroh_VRNNNMNPXbfjlpy }}}}|~zrkgdbbfjnorolhhjnqsvxyyz|||zxvy~ ~ojin }|}~{xuwz{~}}tkhehmnnrsaTQNOkqnnnmmnnnmmg\VWY^hrqonnnnmkmopnidacilkjfbbdghhecdfgggdb^\\\]]\\\[YUVVVVW[\`bdaWPPNJJJHFD@>ADGJMPTWRSUUSRRRPPPPPOLIHHHHHHIIJKKLKJHEGGGHIIIHHHFD@>==>?@@?>>>>=<;;;==<>>>==>??>>>=;98564351--Obt{ ~|{zz{~ ¢¢¤¥¦¦§¨©¨¦§¨§ª¬««¨¦¥¥¤£¤zyiQH;<644666664567789;;>BDEEDCBA@??>><>=<;98651211/.--++++++*)*+++*)*+++++++**(&&'((()++--,+(&'&&&(+/1//.-,,+,.25667889:;=?BDDHHIJIFDCBEHHGFHJKIEDEIJLJJHGGHHGILMLMONKIIKMMKJJLKKJJKLMQSUUTSRRRRQPOOOOPOOOOPQRPPPPPPRT««¬¯°±±³²³³³³²²±¯¯¬«««««ª©ªª««ª¨¨¨©©ª««««««««««¬¬¬¬«©©««««¬¬«ª©ª«««««¬¬¬¬««ªªª®¯¯¯¯¯®¬«««¬¬¬¬¬¬¬¬¬¬¬¬¬®®¬¬¬¬¬¬¬¬¬¬®®¬««¬¬««¬¬«««¬®®®¬««««««««««««¬¬««««««¬««ª««««¬®¯¯¯®®¯®®®®®®¯¯¯°±±±±±±±±±±±±±°°±±±±±±²´³²±¯®°±±±±°°°°±±°°¯¯®®®®®®®®®®¯®®®®®¯®®¬¬¬¬¬¬¬¬¬¬¬¬¬«««««ª«««««¬¬¬¬¬«««««ªªª©©©©©©¨¨¨¨¨¨¨§¦¦¦¦¦¥¥¤¦¥¥¥¥¥¤££¤¤¤¤¤¤¤££££¢¢¢¢ ¡¡¢¤¥¥¦¨§§¨¨¨§¦¥££¤¤£¡ ~{zzxuttssstuxy¥¥«¯±±²³³³³³²³³³´µµ¶´´µµµµµµ´´´´´´´´´´´³³´´´µµµµ¶¶··········µµµµµ´´´²²±±±±±±±±±±°°°°°±±²³´µµ¶¶¶¶¶´³²°¯®®¯¯°°¯¯°°°°¯®¬¬«ª¨¦¥¥£¡~{wtpmklnrssqprvz~|zxwwwwwxvsomkjhggfc]VRQMNMKLNT^chkoz}{zzz{|zrjheceilmlnmigfhknotxzz}}zxwzwh_^ev~vqorooswz~{xqlhfhkjkml^SQOPiprnmkklnonnh[TVW\hvutrqnkgdgklje`\_hlkiebbcfhhfddfhhfdb`_^\\\ZYXVSOQSUVX\_bbc`WQPMKJIIIHDBDGKPSVXYWWVVUTRQPPPPOMJFFFGHIIIIIIJJJJHGFFFFFGGGFECA>>>>@AABBBBBB@>=<;;;88999:;=>>=<<;98873264-)>Phu~} ~} |{{{|}¢¤¦¨©ª«¬«©ª«ª«¬«¨¥¢¡¡ {jUG786434433335788888:=@BCDDCDCB@?>>==;:887653567654300000/-,++++*)*+,,,,++*)'%%(****,--..-+*%%$%(+0100/..-,+.17:<;;:;<=>?ADDHIJJHEB@ADFFDDDFIGEDDEIJLKJIIHGFJJKLNPPNKJKMMLMNMLKKLMOOQRSSQPPQRQPNMMNOPPOOOPRSPPPPPPRS¬«¬¯°°±±²²²²²±±±°¯®¬««ªª«ªªª««ª©©©©©©ªªª««««««««¬¬«ªª«««««¬««ª©ª«««««««««««ª««®®¯¯¯¯¯¯®®¬«««¬¬¬¬¬®®¬¬¬®¬«¬®¬««¬®®®®®¬¬¬¬««¬¬¬¬¬«««¬®®®¬««¬¬««¬¬¬¬««¬«««««««««««®¯¯¯®®¯¯®®®®®®®¯°±±°°±±°±±±±±±±°±±±°°±±³³²±¯¯°±±±°°°°°±±±°¯¯®®®®®®®®®®¯®®®¯®®®®¬¬¬¬¬¬¬¬¬¬¬¬¬«««««««««««¬«««««««««ªª©©©¨¨¨¨¨§§§¦¦¦¥¦¦¦¦¥¥¥¦¥¥¥¥¥¥¤£££££££££¤¤£¢¡¡¡ ¡ ¡£¥¥¥¦¥¦§§§¦¥¥££££¢ ~{zzxuttssstw{ ¦¨«¬°±²³³³³³³³³³³´´´´´´´´´´´³³³³³³³³´´´³³´´´µµµµµ¶¶¶········¶¶¶µµ´´´³²±±²²²±±±±±±°°°°°±±³´µµµµ¶¶µ´²±°¯®®¯¯°¯®®¯¯¯¯®®¬¬¬ª¦¥¥¤¢¡|ztqonnqttttssuz}~{xuuuutvtojgca_ZXXWUQPPKMKKPQV`bgjo{|{zywvxy{}{sljhgimmlkkhfccehijqxz|}{xx|vm]SRWdzre^\abflptz}ytolihiihgfbYQPOObemklmkknnonh[TVVYftttspmhcbcfhgb^[]ejkkgbbbehhfcdfgfdbb`_^\[YWVVSPMOPSVY]`baa_XTQNJIGFFGFEGJOTWYZZ[YWVVTRPQQPPOMJFFGHIJIGFEEFGHIHGGFEEEEFFDC@?>?@ACCCCDDDDDCA?>==<888888::=<;:::998852540-0<Wit{z{}~~ ~~ }zz|}¢¥§¨©«¬«ª«¬ª©ª§¤¡}ygYM9752111001246787789<>>>@AACBAA@?>>=<:88888889:9875334310//,--,+++,////-+*)(&&)++++.--...-,'%$%(,01211000/.-15:=>>=>??@@ACDFGIIHEC@@CEEDCDDFFFDCDFILKKJJJHGIHHJLMOPLLMNNNOPNMKKLOPPQRSRQPPQQPOMMMMNPPOOPPQQOPPPPQST¬¬¬¯°°°±³²²±±±±±°¯®¬««ªª««««««©¨ª©©©©©©ªªªªª««¬¬¬¬¬««¬¬««««««ªª««««ªª«ª«««««««°°¯¯®®®®®¬««««¬®®®®®¬¬®««®®®®®¬«««¬®®®®¬«««¬¬««®¯®®®®¯¬¬®®¬«¬¬¬¬¬«««¬¬¬«««««¬®°°¯®®¯¯¯¯¯±±±°¯¯¯¯¯°°°°°±±°°±±±±±±°±±±°°±±±²²±°¯°±±±°°°°°°±±°¯¯®®®®®®®®®®®®¯¯¯®®¬¬¬¬¬¬¬¬¬¬¬¬¬¬««¬«««««««««««««««ªª©©¨¨¨¨¨¨§§¦¥¥¥¥¥¦¦¦¥¥¥¦¥¥¥¥¥¥¥££££££¢¢£¤¤£¡ ¡ ¡£¤¤¥¥¥¥¦¦¦¥¥¤£££¢¡ ~{zzxutttssty ¨ª¬«°±²³³²³³´³³³³³³³³³³³´´´´³³³³³³³³´´´´´´´´µµµµµµ¶¶······¸¸··¶µµ´³³³²²±²²²²±±±±±°°°°°±±²´´µµµµµ´³±±°¯®®¯¯°¯®®¯¯¯®®®®¬¬«©¥¥¥£¢ }ztppprtvutttwz~{wtstssroje`\YVRPPRRPONKMKNVX\dchkp{ ~|xyxvttuwz}~unmkjmnnmlhebaabegenw{~}zzsfWLKOVemqj\QPRRV]ehmt|~~}zyupkjklifeb[WQPNJVU`imnmklnnni\TVTVboqrpnjfbbbbdeb]Z\diklhcbbfiifccedcbba_]\ZYWVUUQNNOPRV[^`b__^ZWVQNLJGGIJKLORVZ\\\\ZXVWVURRRQPONJGHIJJJGEDDEEGHIIHIHGEDDEEEDA@ACDDDCCCDDDEEDCA>>=<9888899:;:9999998:834411'.J^jvyz} ~} }zzz|}~~ ¢¤¥§©««««¨¦¥¢ |voon\WO9131//.--.124667778:::;>@@BA@AAAAAA?><<===;;;;;975345410//-./.,,-/23321/,+)''*,-,-.-,,--,++(%%)-/032112211./169=>@AABBABDDCDGIIFDCACEEDCDDFHJHEDEHJJJJKKJIGDDGJJLOKLNPPOOPNLJJLOPQQSSSQPQQPPOMMLMMOOOOPPPPOPPQRSTU¬®¯¯®®¯°±±±±±°°°«ª¨§«©ª«««©ª««ª¨§¨ª©©««¬¬¬¬¬«««¬ª©ª««««¬««««««ª«««¬¬°¯®®®®®®¯®¬ª««¯°°¯¯¯®®®®®¬«¬®®¯°°°°®¬®®®®®®®®¬¬¬¬¬¯¯®®®®®®¯¯¯¯°¯®¬¬««««««««®®®®®®®®®®®¯¯¯¯¯°°¯®®®¯°®¯±±±°°°°±±±±°±±±±°±±±±±±±±±±±±±±±±±°°°¯±°°°¯¬¯®®¯¯¯¯®®¯¯®®®®®®®®®®®®®®¬¬««¬¬¬¬««««¬¬««ªªª««¬««««ª©ª«ªª©©©©©©§¦¥¥¥¥¥¥¥¥¥¦¥¥¥¥¥¥¥¤¥¤££¢¢£££¢¢¢¢¡¡ ¡¢¢¢¢£¤¤¥¥¦¦¥¥¥¥¥¤£¢¡ }{zxwuursutx ¤§«««¯°±±²³³³³³³²²²³³´³²³³´³³²²²²³´´³³³³´´´´µ´´´´µµ¶¶······¶¶·¶¶µµµ´³³³³²²²²²²±°°±±¯®°¯¯°±³´´´³³²²±±±°¯®¬®®®®®®®®®®°®¬¬««¨§¥¥£¡ zxutsstuwwwvvy}zvttqnmle]ZVRPPRQQQQPNLKKNSY\`bfgjp{ ~|zyxwusppqstz||upnpoptslhdb__abdfgqy{~} }pbJFJNO]\\YPDCHJJS]fhkwzzz{zuqmnnnlgaZVTPOPPPRVdnpnmnnnmhbYTUY^nnpokebbaabba_\Y\afihgedefghfdbbb`_a`]\\ZVVWWTQQPRSTVZ\]`][YZ[[[LKJHIJKKMRX[[\]^^\YXYXVTVTRRQMIGIJLNKGDDDDDEHJIGJIHGFFEEEEEEFFFFFEDCCDEGEEDA>>>?>><99;<;988889:998841112++>Verzx||~}} |}||x¥¥¥¦ {zxz| ¥¨¦§¨¨¦¥¤£zpgfe_OTT;741/-,,/1556777768:;<;;;<=<;=>@@?B@???@ABDC@>:88899852111/001122376543211...///.-0*.+*/,-)('(+.12:::8423511138<>>>@BBBBCDDEFHHGEDBCDDDCEHIJMNMKIHJKMNOMJGEDEGJJLNKOQQQRRRPMKLNOQUUUTTSRQPOPPNKKNPPNMMNOONRSTTSRRS®¯¯®®®¯±±±±±¯¯¯¬«©¨«©¨©«¬««ª««ª©¨©ª§¨©ª««««««««««««ª««ªª«««««««««««««¬«««®®¯®¬«««¯¯¯¯¯¯®®®®¯¯¯¯®®®®®®®¯°°°¯¬¬®®®®®®®®®¬®®®®®®®®°¯¯°°°®¬¬¬¬¬¬¬¬¬¬¬®®®®®¯®®¯¯¯¯¯¯°°¯®®¯¯¯°±±±±±±±±±±±±±±±±±°±±±±±±±±±±°°°±±±±°°°¯±°°°¯¯®®®¯¯¯¯®¯¯¯¯®®®®®®®®®®®®¬¬¬¬¬¬¬«««««¬«««ªªª««««««ª©ªªªª©©©©©©§¦¥¥¥¥¥¥¥¥¦¦¥¥¥¥¥¥¤¤¤£¢¡¢¢¢¢¢¢¡¡¢¡¡ ¡¡¢¢¢£¤¥¥¥¦¦¦¥¥¥¥¤£¢¡¡ ~}{zyxuvssuuz ¢¤¨«««®¯°±²²²²³³²²²²³³³³²²²³²±²²²²³³³³³³³´´´´´´´´´´µ¶¶········¶µµµµµ´´³³³³²²²²²±°°±±¯®¯¯¯°±³³³³³²²±±±±¯®¬¬¬®¬««ª¨§¥¥£¡ zxuttuwxxvuttv{~zurqpnlha[WVRQQQQQQQQPNNORW\`bdhjmrzzutrqpjkllmosvz}|wtsuttwtlhdb`__acfmrx|zl^JGIJJNMOPMHILHGMU\bguyzz{zwspoppnha\[VSRSTSUX]glkmnnnihf`ZWX[jlnolfba``aa`]ZX[_dhgfedefgfdba``__`_]\\ZXXYXVUTQTVX[]^]\[YYXXXWLJGDDHMQVZ^`abbba^\Z[[XVVTRSQNJIJJKKHDBCDDEGHIIIJIIHGFFEFFFEEEDDDDDDCCCCDCB@??@AA@>;:;;::988899998730../.,;Sbksuz{~}z|zzzª¨§«¥¡ }{{{ ¡¢£¤¤£¢¡¡ }vcb^OPP:3/-,-/02588888777788889:;98877877768<ADDD>??>><;;<;:853331346788885323311//0112110+.+*,*+++,-0256;;:6213765568:;;:<>?@ABCBBCDFFED@@@ABBDGJLNPPNKJKLNPPOKIHGFGHIJLLOPQRSSRPONOPPRUVUSQPPPPNOOMLLOPPONOPPPOPPQRTTTT®¯¯®®®¯°±±±±¯®¬«ª©¨§§©«¬«ª©ª««©©©ª¨©©ª«««¬«ªªª««¬®®¬««ª©ª««««««¬«««««««ªª«¬¬¬¬¬¬¬«®®¬«¬®¬®®®¯¯¯¯¯¯¯¯°°°¯¯®®¯®®®®®¯¯°¯®«¬®¯¯¯¯¯®®®®®®®®®®®®®®®®®®°°°°°°¯®®®®¬¬¬¬¬¬®®®¯¯¯¯¯¯¯¯¯¯¯°°¯¯¯¯¯¯°±±±±±²³±±±±±²²²±±°±±±±±±±±±±°¯¯±±±±°°°¯°°°°¯®¯¯®®®¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®®®¬¬¬¬¬¬¬¬¬«««««««ªªªª««««««ªªª©©©©©©¨¨§¦¦¦¦¦¥¥¥¥¦¦¥¥¥¥¥¥¤££¢¡ ¡¢¢¢¢¡¡¡¡¡ ¡¢¢¢£¤¥¥¦§§¦¦¥¥¥¥¤£¢¡¡ ~~}|{zzyuvttvw}¤¥¨«««®¯±±±²²²²²²²²²³³²²²²±±±³²²²²³²²²²³´´´´´´´´´´µµ¶¶¶······µµµµ¶¶µ´³³³³²²²²±±°°°°¯®¯¯¯±±²²²²²±±±±±°®®¬¬¬¬¬¬¬¬«««««««©¨§§¥¤¢¡ zyvuvxzzxtrqqtz}ywtonnkhb\VTSQPQRRRSSSRQRSV\abcdegimrwz{ywtstvy{wsnjjjihehjklnsv{{xwxzyyzulfcb``_aehorv|rcXJJIIJNMMLJHGGKJMQX`izwxzzzwtqqqrqkb^_\ZXYWVUVZchhjjhhdghe_[ZZhimnke`]\^`_\ZWVZ]beeddddffeb``_^_^^]]\YVWXXYYXVTVZ\_aa_[YVUUSRPLGDEJPUZachjmnnmb^\Z[ZXVTRQRQPMLNLKIEBAAADEEEEGIJJIHGGGFHGFEDDDCDDDCBA?>????@AAA@?=:9::9:98888888862.,+,/.:Pblt|wvvvx{~~zy{wz§®««®«©§¢ ~ £¢ ¡¡¡ pibOHG81/-.0246788888888777778:;99853223320) !-047888888865444345677776422331////011111+.+)+)),.013567;<:72158::988877578;>@BBBBBDEFFFAAACDDDEHJKNONKIJKNPPPNMNLJJJJLNMNPQRSRPQPPPQQSTUSPOMMNOMMMMMNPPPPOPQRQPRQQQSSQP®¯¯®®®¯®¯°±°¯®¬««ª©¨¨©««ª¨¨©ªªª©©©ªªªª««¬«ªª«««¬®¬¬«ª©ª¬«««««¬««¬««¬««««««¬¬¬¬¬«¬¬¬¬¬®®¯¯¯¯®®®¯¯¯¯¯®¯¯¯®®®®®¯°°¯®®¬®®¯¯¯¯¯¯¯®®®®®®¯°¯¯®®®®®®±°°°°°°°¯¯¯¯¯®®®®®®¯¯¯¯¯¯¯¯¯¯°°°°°¯¯¯¯¯°±±±±±²³²±°°±²²²±±°±±±±±²±±±±±±±±±±±°°°¯°°°°¯¯¯°¯¯®®®¯°°¯¯¯¯¯¯¯¯®®®®®¬¬««¬¬¬«««ªªªªªª«««««««««««©©©©©¨¨¨§§§§§¦¥¥¥¥¥¥¥¥¥¥¥¥¤££¢¢¡¢¢¢¢¢¡¡¡ ¡¢¢¢£¤¥¦¦§§§¦¦¥¥¥¤££¢¢ }}|{zzyyuuuuvz ¥¥¨ª««¯°±±±±²²²²²²²²±±±±²±±±³³²²²²²±±²³³´´³³³³³´´µµµ¶¶¶·····¶µµ¶¶¶µµ³³³³³²²²±±°°°°¯®¯¯°±±²²±±±±±±±±°®®¬¬¬¬««««««ª««ª¨¦¦¦¥¤¢¡ {yvvxzzyuqnnnty}|zyrsqnlkgb]XTRQQQRUUUUVVVVUVZ^aaaacfilnqtuwuqmklllihfeffedgilnnpsuz{zyz||}}vkebaaaabhnqsvz}{xrneXRIJIIJMNNLLMMLLKNPU]hzvvwwvtrqqoqrmdabba``^\ZY[beegfbbbceca^]^ghjkhb\ZX\]\YVUUX\`bbbbcbdfdbaaa^__]\][WRVYY[\[XWY[^abbb[WSQQQPNHDEP^fijknpsvxtpc_[ZYXVTPPPPPPPOOMJFC@@A?ACDDEGHJIGFEFGGHHGFEDDCDCCCB@>===>@BCA?=<:99:::998777887641.,+++/7FWcnyutrswz||zzzu¬±¬¬°¬«©£|vx ¥¥¢ ¡ |wi`QD@81101367778887789:88889:;<<<;85457454-%!&-+-14789922333344654444564334541/0/..////1--+*+-,/13554447:<:7678;;;:87554458=@BCDEFFFGJKEEFHIGEEFFGJKKJGIJKMOPPPPPOOONOPNOPPQQPNPPPQQRRRRPOMMMNOMLLLLMNNPPPQRSRQTSRQQPOM¬®®®®®¯¯°°¯®¬¬¬«««©©¨©ªª¨§©©ª«ªªªªª©©ªª««¬«««¬¬¬¬¬¬«««ª«¬«««««««¬««¬¬««¬«¬¬¬¬«««¬¬¬¬®®¯¯¯¯®®®®®¯¯¯¯¯¯¯¯¯¯¯®¯°°¯®®®®®®®¯¯¯¯¯¯¯¯¯¯¯¯¯¯°°°°¯®®®®®®®¯¯±±±°°±±±±±±±±±°°®®®®®®®®®®¯¯¯°¯¯¯¯¯¯°°°°°°°°°°°°°±±±±±²³²±°°±²²²±±°±±±±±±±±±±±±±±±±±°°°¯°±±±°°°°¯¯®®®¯°°¯¯¯¯¯¯®®®®®¬¬¬¬«««¬¬¬««ªªªªªªª«««««««««««©©©©¨¨¨§¨§§§¨§¦¥¥¥¥¥¥¥¥¥¥¤£££££¢¢¢¢¢¢¢¡¡ ¡¡¢¢£¤¥¥¦§§¦¦¦¥¥¥¤££¢¢ ¡ ~}|{zyxwttuuv|¡¥¥¨©ª«®°±±±±±±±±±±±±±±±²²²²²´³³³³³²±±±²³³³³³³³³³´´µµ¶¶····¶¶·¶¶¶·¶µµ´´´´³³²²±±°°±±°®¯¯°±²²²±±±±±±±°°®®®««««««ªªª««©§¥¥¥¤£¢ |zxxyyyvsnmkotyzvttnomjhhc^[WTTUUVVWWVVVVWXXY\^_^]]acfhhiloxtngcccbeffdcbcdghkmortty}zzzz}~wkebbbbbdkqtuvv|zwtphc[QPJLIIKJMOOORUVXX[Z]bkzvvutsqpoonoroieffeeffecb\abaccbb`__`bbbbghhhc\XVVY\[VSRSVY\__^^__bcbabba^__]\]ZVPUY\]_]ZVWZ^bcddYUPPRRPLAFTfu}~~zqgb\[ZWUTPQQPPPPPNLIDA@@@@AACEGHHGFDBBDEGGGGFFEEDDDCBBA@>=>?BDDA>;:9:;;<<888777886531.++*).03>KYcjllpxywzz|{xu¬±®¯°®¯°¬®¤|qnt£¥¥£ |tl[SMB;7400035677888888:<;;;<=>=;<=<:88:=>;88741/00011223566654447666677855543322210001111/,,+.447888521159<<9888889987666558;?CDHJKJHHJNKJJKKJIIIGGHJJJIIIIJJLNONOPRSRRSPPPQQPNMMOPQQRRQPPONMMMMMMLLKKKLOPPQRSRRPQQQPOOP¬®®®®®¬®¯¯¯®¬¬¬¬««««©¨¨©ªª©¨ªª««««ªªªªª««««¬«««¬¬««¬««««««¬¬««««««««««««««¬¬¬®®®¬«««««¬®®®¯¯¯¯¯®®®®¯¯°±¯¯¯¯¯°¯¯¯°°°¯¯¯¯¯¯¯¯¯¯¯°¯¯¯¯¯¯°°±±±±±°°¯¯¯¯¯¯¯¯¯°°°°°±±²²²²²²±±±¯¯¯¯¯¯¯¯¯¯°°°°°¯¯¯°°°°°°±±±±±±°°±±±²±²²³±±±±±±±±±±°±±±±±°°°±±±±±±±±±°°°¯°±±±°°°°¯¯¯®®¯¯¯®®®®®®®®®®¬¬¬¬¬¬¬¬««««««««ªª««ªªªª©©©©©ªª«ªª©©¨¨¨¨¨¨©¨§§§§¦¥¥¥¥¥¥¥¥¥¤¤££¤¤££¢¢¢¢¢¢¡¡ ¡¡¢¢£¤¥¥¥¦¦¦¥¥¥¥¤¤£¢¢¢¡¡ ~~}|zyxvvttutu¡¥¥¨©©«®¯°°°°°°±±±±±±±±²³³³³´´´³³³³²±±±±±²²³³³³³³³´µµ¶···¶¶¶µ··¶¶·¶µµ´µµµ´³²²±±°°±±°¯°°°±±²²±±±±±±°°°®®®®¬««««ªª©©©©©¨¦¥¤¤¤£¡ ~|zyyxvsomllpuxuqoponjhgeb`[YWX[\]\[ZXVVVXZ]]]^^\\\_`bb``cgljd]\^bbbccbabfhjkmnprssx|~zzz{}wlgcdddcdjprtrqx ztpnlgcZSUOPMLNOQTTTVZ\\]`]\_bmtttrpnnnmmorrnkjhhhijjhhbdb_abaa]\\^beedfggd_XUTUX[ZVRQRRVY[[ZZ[\^```aa_\\\\]\ZVPRV[^_\XRSW\aba`VSPPPPMJFVk{thc][ZVUTTUTQPOOOMLIECCCBA??ADGGFDC@>?ADEGGGGGHHHFEDCCCBA>?BDED@=:889:::;888888887631.+)(),,)-=MUY`chrttwvz|yx«¯¯±±¯±°®°¬°¦mdhu ¤¥¤¢ yohSFB:33531123346;;:989;===>?@@><<<==<=?A?=<=>=<;;:888899===<9866345677655420./132100123431-.-19:<=<841128:<:8887455677888878;?CDHJMKIHJNNLJJJJJLKJHGHJJJJJIGGHJKLNQVVUUVTRRRQPNNMOPQRSRQPPOOMLKKOPPONMMNOOPPQRRRPPQPOOOP®®®¯¯®®®®®®®¯®¬¬¬¬¬«««ªª©©©©ªª©ªªªªªªªªªª««««««¬«««¬«««««««««««««ªª««««««««««««¬¬¬¬®®¬«¬¬¬¯¯¯¯¯¯¯®®®®®®¯°±±±°¯¯°°¯®±±±°¯¯¯°®®®®¯¯°°¯¯¯°°°°±±±±±±°±±°°°°°°°°¯°°°°±²³²²²²²²±±¯¯°°°±±±°°±±±°°¯°°°°°°°°±±±±±±±°°±±²±±±²±±±±±±±±±±°±±±±±°°±±±±±±±±±±°°°¯°±±°°°°¯¯¯¯¯¯®®®®®®®®¬¬¬¬¬««««¬¬««««««««ªªªªª©©©©¨¨¨©ªªªª©¨§§§¨¨©¨§¦§¦¦¥¥¥¥¥¥¥¥¥¥¤££¤££¢¡¢¢¢¢¡¡¡ ¡¢¢£¤¥¥¥¥¥¥¥¥¥¤¤£¢¢¡¡¡¡ ~}}{zywvuututt¡¤¥¨©©«¬®®¯¯¯®¯¯°°±±±°±±³³³³³´´³³²³³²±±±±±±²³³³³³³³´´µ¶¶¶¶¶¶¶µ¶¶µ¶¶¶¶µµµµµµ´³²±±°°±±±¯°°°°±±±±±±±°°¯¯¯¬¬«««ªª©¨¨¨§§¦¥¥¤££¢¡ ~}zxwvsomkjnpttrnmnomkkieba\\\\`bbb]\ZWVX[]a`_^]\\]bbb`]\`dhhd][\_`_`bcdhlopqstssttx{|zz{}~~}ukhgggfeejoonlmt|}trnljhec\WZVYXWWUVXZ\^bgghhcbaahnoponljihmqstspnmlklmnmkjjd```^_\\[\`bcccdeb\VRSTVYXUQPPPSVYXXXXZ]^^_a_\XWX\]\ZXQQTY\\XVQPSVZYXWRQPPOPQRZluib\[YVTTVVVQONNNMMKHFFEDA??@DEEDBA?>?ADEGGHHIJJJHFEDEDDBAACDDB><8878:::;9:;;988886420-+*++,++7DGFVahsutytx}}}¥¬¯°´³±´±°°®®©{b\i¢¤£¢¡xohUC<734342110026;;<;9:<>>>>ACC@>=>>>?@BDDDC?;8;?;:99::;:@ABA?>=<:9886543421.-.0110//124554/101<;==;84368<>=:898521124678889:<>BDGIKKJJKNOMLKJIJMKJIHGGHHJJIHGGHJJLQVVVVVUTSSQONOMPQQRSRPOONMLKJJNPPPONOPOPPPPQRSQQPPOONN°°¯¯¯®®¯®®®®®¬«¬¬¬«««ªª«ª©©©©©©ª©¨¨¨¨©©¨¨©ªªªªª¬«©ª«««¬¬«ª«¬««ª«ª©ª««««¬««««ªª«¬¬«¬¬®®¯¬¬¬¬®°¯°°¯¯¯®®®®®¯°±±±°°°¯®±±±°¯¯°°®®¯¯°±¯¯°°°±±±²±±±°±±±±±±°°°°°¯¯°°°±²´²²²²²±±±°°±±±±±²°±±±±±°¯°°°°°°°°±±±²²±±±¯°±±±±±±±±²²±°±±±±°±±±±±±±±±±±±±±±±±°°°¯¯±±°¯°¯®¯¯¯¯¯®®®®¬¬¬¬¬««««¬¬¬«««ªª««©©©ªªªªªª©¨¨©ª«ªª©¨§¦§¨©©¨¦¦¦¦¥¥¥¥¥¤¤¤¥¥¥¤££££¢¡¡¡¡¡¡¡¡ ¡¡¢£¤¤¤¥¥¥¥¥¥¤¤££¢¢¡¡ ~}|{zywvuvtvtt¡¤¥©©©«¬®®®®®¯¯°°°°°±²³´³²³³³³²²²²²±±±±±±²³´³³³³³´´µµ¶¶¶¶¶¶¶µ´´µ¶¶¶µµ¶¶¶µ´³²²±°±±±±°±°¯¯°±±±±±±°¯®®®¬¬««««ª©¨¨§§¦¥¥¥¥¤¢£¢¡ }|yuutqmjhhppqqommnnlmpnga`^^^_bddb`^\YXZ]`cb`^\\]_a_]\YX\``bb^\]^^`behknqsrtvvutvxy{~}zzz}}|zsjhhhhhggkopmjmqspnklljhda_^Z^[bcba`^^```bfhijdba_ehjlmkhgfdlrttttqnnmnqssrnlfaa`^_]\ZZ\^ab`bdb\URSRUWVSPOONRVXXWWX[]^^_a^YUSUZ]\[ZURTY\[WVSPOPQPPPOPPOPU]cm|{ib\[ZVUVTVUPNNNNLMKIGGFDCAABDDDDBAAABCDFGHHIJJJKIHFFFFDBBBBBA?=<888:;;<=;===;988875310.-+(+-)-42/J_lvuoqsu}£©¯°±µ´²´°´°±«§pY\o¡¡¡£¤¢¡ ~zzxp\RD?><82/..--/389:;:::<>???BDDB?>>?@@BCDCCCDCAAB>>>>??>=@BDDDDDDJGB=87785421111110//1245771211<:;;:868=A?A?=;:7210/0257778:;=>ACFHJKLMMNOOPOLJIJLKJIGFFGIJJIHHIJHJOSTSSUUTSRPNNPNPQQQRQPMMLLKKKKJLNNLLNPPPPPPQRSPPOOPPON¬«¬¯°±°°¯®®¯°°¯®®®¬¬«««««ª©©ª«ª©¨¨©©¨§©©ªªªªª©«««««««¬¬¬««««««««««««««®¬¬««««¬«¬¬®¬¯°°°°°¯¯®®¯®®®¯¯±±°°°°±±¯±²±±¯¯¯®¯¯®®®°±°°±°¯¯°±±±±±°°±±±°±²²±±±±°°°±²²²³³³³³²²±±±±±±±²²²²±±²³³²²²²±±±±²²±±±±±±°±°°°±±±±²²±±±±±±²±±±±°±±°±±±±±°¯±°¯¯°°°°¯±±°®®¯¯¯¯¯®®®¯¯®®¯¯®««««¬¬¬¬««««««««««ªªªª©¨©©©©©©©¨©©©©¨§¨¨§§§§¦¦¦¦¥¥¤£¤¤¥¥¤¤¤¤££££££¢¡ ¡¡¢£¥¥¥¤££¢¢¡£¢££££¡ ~}}}{zywvuttrtuw|££¤¦¨©«««¬«««¬®®¯¯¯°±³³³³´´´µ³³²²±±±±±±±±°±±±²²²²³³³³µµ¶¶¶¶µ´µµµµµµµµ¶¶¶µµ´³³±±²²±±±±²±±±²²±±°±±°¯¬¬««««««ªªª©§¦¥¥¤£££££¢¡|wvwtmhhhhopponmmnqqqrqnieeefghhfdba_\\\_afdb_^_bed`]ZVW\]`bb``^_bdiosttvxzzyywtuv||}|zz|}}~yojkjmkhgeehhhhhgegjgggeb`\[\Y^_`deghgffecehkkjhebcdghhhhhhhhmtvtsropnnnqstuokgca^^`]\ZXWZ]`abbb]VTTTUVUSPONPRVWYZZYZ[\]__\ZSQQV\_\YVUVWYXVSQPNPQQPOPLOQPYju|qkbY\VVSTUUTQOMMMKJJIJJIHGFEDBCDDEEFGHJKKJJLMLKLJHFFFEDBBBAA@>>=86579;<>=>>=:8654566541.++)*,/11-E`g_^dhuy}«±²³´³³´³±±³°°®m]j «¤¦¥¥¤¢ }zz~|~zy}s_TICA>9520,+.168::::999:;=>?@ACDDCCDHJKJKLPQKDCHFDDDDDCCEDDDDEGHGGEC@>;866789875320/14535211479;>=;889>BABA>;87731003677;:::<>?@BGMONMOQQPOUQFFIJKLLLKJGJJJIHHHIIILPPOPRTTTTRPPRSSSRRQPQONMMNNLJLKLOPNMOPPOPPQRSRSRQONNN¬««¬®®®±±±°¯¯¯¯¯¯®¬¬¬«««ª©©ª«ª©¨©ªªª©©©ªªªªª©©ªªªªª««¬¬¬«««««««¬««««¬¬¬¬¬««««¬«««¬®®®¯¯®¯°±°°°¯¯¯®®¯¯®®®¯¯°¯¯°°°±±±±±±±±±°¯®®®®¯°±°±±°¯¯°±±±±±°°±±±±±±±±°±±°°±±²³²´´´´´³³²±±±±±±²²²²±²²³³³³³³²²²³´³²²±²±±±±°°°±±±±±±±±±±±±²±±±±±±±°±±±±±°°±°¯¯°±°°¯±±°¯®®¯¯¯¯®®®¬®®®®¯¯¬¬¬««««««¬¬««««««««ªª©ªª«ªª©©©©©©¨¨©©©©¨§§¨§§§¦¦¦¦¦¥¥¤¤¤¤¥¥¤¤¤¤££££¡¡ ¡¡¡¢£¥¤££¢¡¡ ¡¡¡¡¢¡ ~~~{zzxwuuustux£££¦§¨ª«««««««¬¬®®¯¯°±²²³³³´´´³³³³²²²±±±±°°±±±±²²²²²²³µµ¶¶¶µµ´µµ´´´´µµµµµ´´³³²±±²±±±±±²²±±²²±±±±±°¯®¬¬««««ªª«ª©©¨§¦¥¤¤£¢¡ ¡ }wutoiffhhooonmmnpsssssqnklkkllkihedb`__abedba`bcff]VSQU[\bcb`a`bhmrwzzz|}||{xttvx|}}|{z||{|wnjlnomhebbfhhhhebbdbbcba^\Z\Y\]_fhlhhhhfeghjkkhcbcffhhgggecbfhihimqnnnnnqstojea_]^``_\ZXY\]_acb\VSSVVVUSQPPPRUVY[[ZZYZ\]]\XQPPTZ]\YTTTUVTQPLMOPPMMNPKMUanzxjbXZVTPUVVURPONKJJJJJJJIGGFDCDDEFHIIJJJJJJKLLKJHFDDDDCBAA@?>><<97678:;<===<98655676531-,+++-0118BOSTX\\kpzz°´³µµµµµ´³³±°²¬ kdt¥«¦«ª«©§¥¢{{xzzwvtrqjZRJFC>9521.-.146899988889;<==>?AFFFIKMMMNNPPNJJLJHFFEDCCBBBAACDFDDDCDDB>888:;;:8653135532112358;====<=?BBB@>;98887655788::;<=>>>ADILMOPQQPNQK@ADGJKLLLKJNMKJJJJJHHJNONORRRRRPPPSUUVUTRQQPONOOONMLLMNONNOONNOPPPQPPPONMML¬«¬¬®®¯®±±±±¯®®°¯¯®¬¬«««ªª©¨¨ª«©©¨©«««ª©©ª««ªªª¨¨©©©ª««¬¬¬¬«««ª«««««««««¬¬¬¬«¬««««¬®®®¯¯¯°°°°¯®®¯¯¯¯¯®®®®¯¯®¯°±±±°±±°°±±°¯®®¯¯¯°±±±±±°°°°±±±±±±±±±²²±±±±±±±±±±²³³³´´´µ´´³²²²²²²²³³³³²²³´´´´´´³²²³´³²²²²²±±±°°°±±±±±±±±±±±±²±±±±±±±°±±±±±±±±°°°°±°°°°±°¯®®¯¯¯¯®¬¬¬«¬®®®®¬««¬«««««««««««««««««ªªª««ªª©©©©©¨¨¨¨©©¨§¦§§¦¦¦¦¦¥¥¥¥¥¥¥¥¤¤¤¤¤¤£££££ ¡¡¡¢£¤¥¤¤£¢¡ }}zzyxwvutttty£££¥¦¦¨ªª«««ª«««¬®®¯°±²²²³³´´´³³³³²²±±±±±°°±±±±²²²±±²³µµµµµµµµ´´´´´´´´´´´´´³³²±²±±±±±²³²²²²²±±±±±°¯®«««««ªªª«©¨§¦¥¥¤£¢¡ ~xtoieddginnnlkmpsuvvvuutttsrqonlkhhfcbbcdedbbbdhifZQOPU\`cbaabaentx|~~~{uqrvy{}~}|}|zzunlnqrmfb`adgghgb^\]]^`a`][Y[Y\[^dfikjihgefhhihe`_bfeggggfb_\_\[\\akmmnmmortpib^\\^``_\[YYZ\]adc^WUTVVVUSRQQPRTVY\\\YWVX[[YVQPPTY\\ZTSSRPOMLKKKKKLOQNQVcvnfZXXVSUTSRQPNLJIIIJKKKJHGGEDDEEGIJJIHHHJJJKMJGEDBAABCBA@?>=<;;:8789:;<;;:8754334666531-,++,.//21127@FDV_rz¡¯µµ¶·····µ´±²³¦zkp¦«©®®«©¥¡ ~zuytrolfbZNJNJGEC>;811.-.023567888889:;;;<>?DFHJKLLLNNNNOOONLJGFDBAA@ABAABDGFEDDFGD?:::;==;:875445420012358=>>@@@@@A@?><;9888887789;<<=>??>>BDFJNQSSRQMNF;=?@DHJMOPPPOLKKKKJIIJLMLOQPPPPPPQTVVWVUSQPPOOOOOOONNNMMMMLPNNOOOPQRQPPOOOO«««®¯°°°±±±°¯¯°¯¯®¬«ª©«ª©¨§¨ª«©¨¨©«««ª©ªª«««ªª¨©ªªªª«««««««««««««««««««««¬¬¬¬¬«««««¬¬®®¯¯¯¯°°¯®®®®¯°®®®®®®¯¯°°°°±±°°°±±°°±±±±±±²±±±±°°°±±±±±±±±±²²²±±±±²³²²²³³´´³´´´´³³²³³³²³³³³µ´´´´´´³³³³³²²²³²²±±±±±±±°°°±±±±±±±±±±±²²±±±±±±±°±±±±±±±±°°°±±±°°°°°¯®¯¯¯¯¯®¬¬¬¬««¬¬¬®®¬«««¬«««««««««««««««««««ªªª©¨©©©©¨¨¨¨¨¨¨¨§¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¤¤£¤¤¤££££¢¢¢¢¡ ¡¢£¤¥¥¤£¢¡ ~|{yyxwvutttuuz£¤£¥¥¥¨©©ªªªªªªª«¬®¯°±±±²²³³³³²²²²±±±±±±±°°±±±±²³²±±±²µµµµµµµµ´³³³³³³³´´µµµ´´³²²±±±±±²´³³³³²±±±±±°¯®¬¬««««ªª©¨¦¥¥¤££¢¡ xskdcddgjnmljkntvxyzzzzz{yxutqonmmkheccdegecbcgikaVPPPV`gecbbcbgpxz~~~yqnquw{~}zytonqrqkc`^`eghhfb]ZY[\^``^\ZYXYVY]\^ddeeccdeffc_[[^bcdfggfb]Z]YWYVXfklmlmortpia\\\^``_]\\\\\_befb]YWVVVVTSRQQRSVZ^_^YVTVXXVTSSSVX[[ZTTRPLJIILJIJLNPPM[gsohYUVTTTRQPPPMJIIIJJKKKJHGGEDDEDFHHGFEDFJJJKMICCA@?@AAA@@?><:::989;=>>>::98643335666642-,+++++++(&%%.8:?Jh|¢«³¶····¸··³µ·±pn}§®¬°¯°¯®«§¢{rmrlkhg^XL86><99865410////0112467889:;<<<<>?CDGIIHHHLMMLMPPMMJGEC?>>@BCCBBEHHGFEFEB>=<;;<<:887434431//0136:>?@@@@???>>>==;9856678;>?>>?@ABA@DDEINRTTRRMLE<=>=@DGJMOOLLLLLLLKKJJLLLOQPOOOOPQTUVWWURPPOONMLMMNMNNLLNNLPPPPPPQTPPOOQUWY«««¬®¯°±±±±±±°¯°°¯¬«©©«ª¨§§¨©ª©¨¨¨ª«ª©©ª«««««ªªª««ª©ªª©ªª«««««««««««««««ªª««¬¬«««««¬¬®¯¯°±±±°¯¯®®®¯°®®®®®®®¯°°°±±°¯°±±±²²±±±±±±±±±±±±°±±±±±±±±±²²±±±³´µµ´´´´´´´´´µ´´³²³³³³³³´´¶¶µµµ´´³²³³²²±²³²²±±±±±°±°°°±±±±±±±±±±±²²²±±±±±±±±±±±±±±±°°°±±±°°°°°¯¯¯¯¯¯¯®¬¬¬¬«¬¬««¬¬¬«««¬¬¬««««««««««««««««ªªªª©¨©©©¨¨¨¨¨§¨¨§¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¤¤£¤¤££££¢¢£££¢ ¡£¤¤¤¤£¢¡ |zyyxwvuttuwwz¤¤£¥¥¥§©©©ªªªª©ª««¬®¯°±±±²³³³³²²²±±±±±±±±±±±±±±±²²±°±²´´µµµµµµ³³²²²²²²³³´µµ´´³²²²±±±²³´µµ´³²±±±±°°¯®¬«««««ª©©§¥¥¤£££¢¡ xphbbefhjllkjmrwyz{}}||}~{zwtronnpnieccefgecccdddWQOPPVdnkhdcechsz|~~~|unnqtu{|zwtqqtsqib^^afhhhfb][YXZ\]]\[YWVUOPSORTVY\]_bcdb]YVVY[^`bceda\X\ZY\WXdjkkkmoponha]\^`aaa`____`bcfhhd`\YYYYWVTRRRSVZ^``[VSTUUSRVVWXYZZYTTRNJGFFHIKMMLKLQbq{ £¡vsb[YVWVTRQRPOLJJJKLLKJIHFFEDDEDEFFDDDCFJKKKKF?@@??@@@@??>=;9999:<>@A@?<<;986666886421/-,+*))('''((&+4818]~¨«µ¶·¸·¸¸··´ºº¨gr¦¬®°²±±±°¬©¥ ymehbbbc\YO==>842223333211///01246788:;===>>@DEHIHFFFJLMLNPPNOLIGDA?>@BCCAADFGHGFFEB?>=<<<<;985224443311158;>@?>==>>????AA?:7668:>@CDA@?@ACCCCDEHKOQRSRMLIBB?>@BCDFGFEHKMMLMMONMMMMOPPONOOPRUTVWVURPPNNMLKKLMLMNMNPPPPPQTTSSUUUUVVXYZ®®®®®¯²±±±±±°®±°°¯¬«ª«ª¨§¨¨©©©¨§¨©ª©¨ªª«««««ªª««ª©¨¨¨©©©ªª«««««««««««¬««««®¬¬«««¬¬¬®®¯°°°¯¯®®®®®¯¯¯®®®®®®®¯°°¯°±±¯¯±²²²²±±°°±±±±±±±±°±±±±±±±±±²³²²²´´µµµµ´´´µµµ¶¶µµ´´³³³³³´´´·¶¶µµµ´³³³³³²²²³³²±±±±±±±°°°±±±±±±±±±±±²²²±±±±±±±±±±±±±±±°°±±±±°°°°°¯¯¯¯¯¯¯®¬¬¬¬¬«¬¬«««¬¬«««¬¬¬¬¬¬«««««««««««©©©ª««ª©©©¨¨¨¨¨¨§§¨§¦¦¦§¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤£££££¢¢¢££¡ ¢¤¥¥¥¥¤£¢ }{zzyxwvvuuxyz¤¤£¤¤¥§©©©©ªª©©©ª««¬®¯°±±²²²²²³³²²²±±±±±±±±±±±±±²±±±±²³´´µµµ´´²²±±±±±±±²³´´´³³²²²²±²³³µ¶¶µ´²±±±±°°¯®¬««««ª¨§§¥¤£¢¢¢¡ yngbcghhjkmmlouzz{|}}|{{{zyvtqoppsojfddefdcbba^ZWROONOYjuplecdektzz{{{|}~ztpqtuv{ ~{xvtttttph_]^afhhgd`]\ZWXYZZZYXWVPFHKHLLPSVX\^`b^ZVTTVVX[]_aa^[X[ZXYVW^hijjmnmikfa__abccbbbbbbaeghikjfa^^^]\ZVUTUUVZ^`_\VSSSRRSXZ\\[ZXXUTRNJGFFHKNNKKPV\jz¡¢¥¤ pf_\ZVTRRRQOMMMMNNMKJIFEEEDDDEEEEDDDDFJKJJHD>?????>>>>>>=:888;=?@AA@>==<:98887885310..-,+*('&$#&)(+12,-V~£°¶¶······¶¶ºµwbx¡¨®¯°²³±±²±®«¨¡}~wndd]^^_[VQHFB=86789:888631/.112345678:<>>>?@DFHHGFFFFJLLNPPPPNLKJFDDCDDDCCDEHIIHFEC?>===>>=;75357877964578:<><98:>@A??ADDA:488:>ACDDBA??@ACDDDFIKNPPQRMLJGHDAA@?@BB@ADIJKKMPQPPOOOOPPNNOOPRTUVWVTQPPONMMLMMMPOPPQQRSRUX\\ZYZ^adghhgf¬¬±±±±±°¯®°°°¯¯®¬¬«ª©¨¨¨¨¨¨§¦§©©©¨ªª««««««ªª«ª©¨¨¨ªª©©ªª««««««¬¬¬«®¬¬¬¬®¬¬¬¬¬¬¬¬®¯¯®®®®®®®®®®®®®®¬¬®¯°°°°°°°±±±²²²²±±±±±±±±±±±°°±±±±±±±±³´³²³´´´µµ´´´´µµ¶¶¶¶µ´´³³³³³´´µ¶¶¶¶¶µ´³²³³³²²²³²²±±±±±°±°°°±±±±±±±±±±±±²²²±±±±°±±±±±±±±±±°±±±±°°°¯¯¯¯¯¯®¯®¬«¬¬««¬«««¬¬¬«««¬¬¬¬««««««««ªª«««©©©ª«««ª©¨¨¨¨¨¨¨§§§§§¦§§¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤££££¢¢¢¡¢¢¡ ¢¤¥¥¥¥¥¥£¡ }{{zzxwwvvvyz{ £¤¢£¤¤¦©¨¨¨©©©©©ª«««¬¯°±±²²²²³³²²²±±±±±±±±±±±±±±±±±±²²³´µ¶µ´³±±±±±±±±±±²³´´³³²³³³²²³´¶··¶´²±±±±°°°¯®««««©¨¦¥¤£¢¡¡ znhcdhjkklnoorwzz{{{zyxwvvtsonnnprnjgedddb`^]\XSOPOOOR_nupnhehimruvvvvvxzzvttttvx|~{xvvvutrnc\\^afggd`]\\ZXXXXYYZZXVNCEIEKMPTVWZ\\]\YURRSUVY\]^^\[Z\]\\[\]gjllllheecbbbcdfgfedeeedijklnnjfcbba_\ZXVWWXZ\]]\WSSRQRU[]``^[YXWVSPMJIHKMPSV\dkov ¢¢¤¤¢¡sh\ZVUSRQPPNMOOOONLJIHFDEEDDEEFFFEDDEGHHHFDA@?>>>====>>?><:99<>??@@?><<<;:88878863210--,+*)('&$&*+,//+1_¦²µµ······µ¶´¥ld«¬±²±³³³³´³±¯¬¥}zzz| wshc]__]\WURKA>:::::;;;;86311122223468:=?@@ABEEFFFFFGGIJLMOOOPNNNMJIHGGGFEDEEIIHGGFC>=<<=>><:867:=<;:;98999:<=:88;>@A@@BDEA8168<?ACDDCA?>?@ABDDGJMPPPPQLJJIKHEC@?ADCA@BDDFIMPPPPPPPONNMLNOPRTVWWURPPPPNMNOPPOOMPUWVX\abehhhhjjov{~©ª««ªª««¯±±°¯¯¯®®¯¯¯®«ª©¨©©¨§§¦¦§©ª©¨ªª««««««ª«««ª©¨¨««ª©©ª«««ªª««¬¬«¬¬««««««¬¬¬¬®¯°°¯®®®®®®®®¬¬¬««¬®¯°°°°¯¯°±±±°²³³³²±±±±±±±²²±°°±±±±±±±±´µ´²³³³³´´´³´µ¶µµµµµµ´³²²²³³´´µ¶µµ¶¶¶µ´²²³³²±²²±±±±±±°¯±°°°±±±±±±±±±±±±²²²²±±±°±±±±±±±°±±°±±±±°°°¯¯¯¯¯¯®®®¬««¬¬««¬¬¬¬¬«««««««««««««««ªª«««ªªª«««ª©¨¨¨¨¨¨¨¨¦§§§§§§¨¦¦¥¥¥¥¥¥¥¥¤¤¤¥¥¥£££££¢¢¢¡¢£¡ ¢£££¥¥¥¤¢ |z{zyxwvvvwzz|££¢££¤¦©¨§§¨©©©ªª««««¬¯°±±²²²²²²²±±±±±±±±±±±±±±±±±±²²±²³´¶¶µ´³±±±±±°°±±²³´µµ´´²³³´³³³´¶···µ³±±²±±±±°¯««««ª¨¦¥£¢¢¡ zmhddhkllmoqqtyzz{zywuttsqpnljjmnpnjhedbba^ZXVUQNMMNPVbnponkimooqstsrrrtuxttvwtuz| ~{xvxywtoj`Y[]aefeb]ZZ[ZYYYYZ[\\XXPDGJDJLPTVWZ\\[ZXUQPRUX[\]]]\\]`dfegheglonljgbbabceefhjihhijjilnnnoomjgfcb`^\ZXYZYY[\\[VTSRPSV\`cca\ZYYWURPMKJJKR^ktwy ¢¢¤¢¤¥¤¤¡ti\[WTTRQPPNMNNNNMKIGGEDEEEDEEFFGFEEEGFFEC@@A?>><;;;<>?@@>;::<>>>>??>==>=<;::;<;8421/,,,++*)((%'*)*-.+;n¨±«³µ·····¶´µ«zhh¬±²±³´¶¶··´²±«¤}zyy| yvia[VYVYWVYLEDCBA><;;;;97533111113568;>ACCDDFEEEFGHHKJJLNNNNMLLMMKIIIIHGFEEEFEDEHHD@<;;;<;98879>@?><::<=<;;==;99<>@@CBCEFB9116<@BDEGDB@???@@BCDIMPPNNPKIHHKJKHDBCDDAA@??BFKOPPPPPPOMLKKMOPQSVWVTPNOPONMNPQPPIGLV\^bhppqrstx|¨©©ªªª««¬®¯°°°¯¯¯¯¯¯¯®¬«©¨©ª©§§§¦¦¦¨©©¨ªªª«««««ª««ª©©ª«««ª©©««©«««««««ª««««««¬¬¬¬¬¬®®¯¯¯¯®®®®®¬¬¬¬®¯°±±°¯¯¯°±±±±±±±±²²²±²²²±±±±±²³²±±±±²³³²±±±±³´´´´³´´¶µ´´µµ³±²²²³´´´³µ´µ¶¶µ´µ³³³³³³²²±°°°°°°°°°°°¯°±±±°°°±±±°±±±±±±±±±±±±°°±±±±°±±±°®°¯®¯¯¯¯®®®®¬«««¬¬¬¬¬¬¬«««¬¬¬«««««««««ªªªªªªª©©©ª©§§§§§¦¦¦§§§¨¨¨¦¦¦¦¦¥¥¥¤¥¥¥¥¤¤¤¤¤¤£££¢¢¢¡¡ ¡¢¢¢¥¤£¢¡ ~}{{zzzywwwxyz} ¡£¥¥§§¨¨©©©©©©©ª««¬®®¯±±±±±±±±±°¯¯°°±±²²²²²±°¯±±±±²³²²³´´³²±±±±±°°°±±±²³³³³´´³³´´´³····¶µ´³³²±±±°¯®¯¬««ª¦¥¥¤¤¢uhgihjnkortuwyyxzywvtqqsnmjhghknmmjhffee`^ZTPOONNOOPXclnrnmnpppqqqommptuvwyyvtw{zxz|~zsld\ZZ\`cbcb]YXZ[\\[[[\\\]\ZUOJJJMPVZ\\\\^][WTSTTVZ^`_]\]`hlnppnmnnpomigebcefghhijiijkllknqpoqqnnlifcba]\\]\[Y[\\\YURQSUV\`cdb_\XXVWTPPKMNQXft~ ¡££¤¤¥¥¤ wg\VSRSSQONNONNNMLJJIIIIHHHHHHFEDEGHHHFDCBBBB?=:98778;=>?>=;;=>>@AA?><>>=<<>ABA?=841//.,+)((('''(((*-)Ix°®±µ··¶µµµµ·¢qqy «°±´¶¶¶····¶¶³±±¨~{zyzzx| yutsofaYXVVWVSPFDFFDBA=:<>>;86552101367:;=?CEFFIFEFGGIKLLKJJKMNMMMMMMMMKJIHGFDBDCCDDCCD?><<=<:889;>@A@><===>@?>>=;:<>ABDDDCD>61138=@BDFEC@>>?@AA@AFLPPNNLJGDDGKKKJHGFEDDCBCEHJJLMOOONNNPLKMPPQRXVTSRPPOQPPNKOTUU\ekot| ¦§¨©ª««¬®®¬¬®®®®¯®¬«ª©ªª©¨¨§¦¦¦§¨¨¨ªªª««¬«««¬«««ª«««««ªª««ª«««««««ª««««««¬¬¬¬¬¬®®®®®®®¯¯®®¬¬¬®¯°±±±°°°±±±±±±±±±±±±±±±±±±±±±²²±±±±±±²²²±±±²³´´µ´´´µµ´³³´´³±²²²³´´´³µ´´¶µ´´´³³³³²²²²±±±±±±±±°°±°°°±±±°¯°±±±°±±±±±±±±±±±±±±±±±°°°±±°¯¯¯®¯¯°¯¯¯¯¯®¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬««««««««ªªªªªªªª©©©©¨§§¨¨§§§§§§§§§§¦¦¦¦¦¥¥¥¥¤¤¤¤¤££¤¤¤££¢¢¢¢¡¡¡¡ ¡¢¢¢£¢¢¡ }|{zzzywvwwxz| ¡£¥¥¦¦§¨¨¨¨¨¨¨¨©ª««¬®¯°±±±±±±±°¯¯¯°±±±²²²±±³±±±±±±²²±±²²²²±±±±°°°°°±±±²²²²²´´³´´´´³····¶µ´´³²±±±±°¯««««¨§¦¢¢ xnjkiknnpsuvvwvuzwutspnomljhghjmoonkihge`\UPOOOPTVXX\cjlpoonoooomljilqttuwyzwuwz }yyz}|tib\YXY\_`a`\XWXY[\\\\\\]_`^ZTPMMORV[]]]]^^]]\\[ZY[^aa_]\_glnqrpopqrqnkhfhhijjjkljjijklmminpnmllnmkheb_]\\\]^^\[[ZXVSSTVV[_bcba][ZVWSQQOQZ^cmz ¢£££¤£ vf[URQRRQPPPPOONMLJJIKKJJJIHHGEDDDFFGEDCBAAAA><9875569<>>>>==>>?ABB@?==<<<=>>?@?>:7430/,+('&%%&&'()*+1P|²°®±³´µ¶´²±°²}nq§°µ·¸¹¸····¸·¸µ²°¦ |zzwwvsmmigaTPQSWVYZYVRPOONFDEFDCB><=>><:98874334689:;>ADEEGFFHIIIJKKJJJKMONNNNNNNNMKIHFEDB@@@ABAAC>=;<>>>=<<=>@?><:;;<>BCB@>=<=>@AAB?>?=87668;=>@CFDA??@AAA@@DJNPOLJIFDCDHJJJHGHGFGEDDEHJKMNNMMMNOONMOPQRTTUUSOMPTSOMLOYcgpu| ¥¦¨©ª««¬¬¬¬«««®®®¬¬«ªª«ª©¨§¦¦¦§¨¨¨©©©ª««««¬¬¬««««««««ªª««ª«««««ª««««««««¬¬¬¬¬¬¬¬¬¬®®®¬¬¬¬¬¬¬¬¯¯¯®®®¬®¯°±±±±°°±±±±²±±±±±±±°±±±±±±±²±±±±±²²±²²²²±²³³´µµµµµ¶´³³³´´³²±±±²³´´³µ´´´´³³´³³²²²²²³²±±±±±±±°±±±±°±±±°°°±±±°°°±±±±°°±±±±±±±±±°¯¯°±°¯¯¯®¯¯¯¯¯¯¯¯®¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬«¬¬¬¬««««««ªªªªªªªªªª©©¨¨§§¨¨¨¨§§§§¦¦¦¦¥¥¦¦¦¥¥¥¥¥¤¤£££££¤¤£££¢¢¢¢¢¡¡¡ ¡¢¢¡ ~|{zzzyvuvvxz{ ¡¢¤¥¥¦¦§§§§§§§§¨©ª««®¯°±±±±±±°¯®®¯°±±±±±±±±³±±±±±±±±±±±±±±±±±°¯¯¯°°±±±±±±±±´´³³´´´´·····¶µ´´³²±±±±°¬«¬«ª©¨¤£ |upnnnoqruxxwvututttrnljkjihfgilprroljhg`YQNMLMOVZ^^`dhknqqooponhgefkqttvxyyvuy| |zz|}|vhb\ZXWX\]__\ZXWWX[]]\\]__``]XTPPQUX\^_```_`bdeedb`_`aa_]ahnotutttuvtrnkijkkkjjjjjjiiklmmjnmihghklkie`\[[\\]`a^\\ZYWVWWXX[^bccb_\ZVVTQQOSZdnx ¡¡¡¢¡ve[VSPPPQRRPPONLKKJJIMMMMLJJIGFDDDEEEDDCCBBBB><:864348:=>???@>>>?@@???><<>>=<:<=<976631/,*'%%$%&%'))&0R~³±¯±¶µµ·¶³²³¯omuª¯³µ·¸¸¸¸¹¸¹·¹·²¯¤}||xywihVQ<345699<FKOOKIGFDBCDBBC@;:::;<<<<;97546889;>ADFGHIJLLKJJJJJIIJLNPOOOOOOPPMJHFDCA>>>?@@@A>=;<>@@@>>>>?><:7768=CDDCA>=<==>=>><=<:<8889:<?CFEDA@@ABCAACHLNOJIGEB?ACDEFEFHHHJJHFFGJKLMNONNNOOOPPQQTVVUSSQPOOQV^ejrz}¦§¨©ªª««¬¬¬¬¬®¬®®®¬«««««ª©¨§§§§¨¨¨¨¨¨©ª«««««««««««ªªª©ª«ª©«««ªªªª«««««««««¬¬¬¬¬¬¬¬¬¬¬¬««¯¯¯®®®®®®®¯°°±±±°±±±±±±±±±±±±±°±±±±±²²²±°°±²²²±²²²±±²²³³µµµµ¶¶´³³³´´³³±±±³´µ´´´³²³³²²³³³²±±±²³±±±°°±±±°±±±±±±±±±°±±±±°°°±±±±°°°±±±±±±±±°¯¯°°°°°¯¯¯¯¯®®®®¬¬¬«¬¬¬¬¬¬¬¬«¬¬¬¬««««««««««ªªªªªªªªªª©©©¨§§¨¨¨¨§¦§§¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤£¢¢¢££¤¤££¢¢¢¢¢¢¡¡¡ ¡¡¡ }{{zzzxvuuwyz{ ¡¢¤¥¥¥¦¦§§§§§§§§¨©ª«®°°±±±±±°¯®¯¯°±±±±±±±±±±°°°¯¯°±±±±±±°°°°¯¯¯¯°°±±±±±±±±³³³³´´´´·····¶¶µ´´³³²²±±°¯®®«©¨¦¥¢ }ztqrpnpquyywuttprsrnjgehhhfeehjpssqnmkh]WQNKJMR[_ccbehjnqrqqsojedceiotuxyxutu{ ~|{}~}~|wle][YXXZ\^_^\[YXY[]^^^^^]^_][VTRTV[]`bbbcbbdfimonha^_abafnrtwxwwwxxwuspoqqrqonllkjiiikkklkfbbcehijhc\WVX[]`aaa`^]\[[[\\\]acedb`\XUVURPMQWft~ ¡ te[VTPOPQSSQPLKJIJJIHLMMNMLKJHGFEDDDDDDEDDCCCA?>=964458=@@@AB?>>>>>>>>>=>>>;989;:86677520,)'%$&&%%(&!-V~«¯±³°¯°±±¯±µ«ho¡©«±³µ··¸¹º·¸·¸·² ~yvvjdHI926633003<FJJFB>>=>??AB@97668;=>>>=9646889<?CFJKKLOPPOMLJJJIIJLNPPPPPPQQPOLJHFCA>>>?@@?@?>=>@AA@@?>>>><;6536;ADCB@>;9888;>>==<<?=<;;;<?CEFFDA@BDEDDDHJMNJIFD@>=>>@BCDGIIJJJIGGIJJMPRRPPOPPPPQSTUVSQQPLJJM[nzzz|} ¨©ªªª©©ª««««¬®¯¬¬®®®¬¬«««««ª©¨¨¨¨¨¨¨©©©©ªªª«««ªªª«««ªª©ª«ªªªªª«ª©©ª«¬««««««««««««««¬«¬¬®¬¬«««®®®®®®®®®®®¯¯°°±±°°°±±±±±±±±±±±±°±±±±±±²²±°°±²²²²²³²±±±±²³´µµµ¶¶´³³´´´´³²²²³µµµµ´²±±±±±²³²±±±±²²±±±°°±±±±±²²±±±±±±±±±±±±°±±±±±±°°±±±±±±±±±°¯°°°°°°¯¯®¬¬¬««¬¬¬««««««¬¬¬¬«««««««««ªª©©©ªªªªªª©©¨¨¨¨¨¨¨§¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤£¢¢¢££££¢¢¡¡¡¡¢¡¡ ¡ ¡¢¡¡¡¡¡¡¡¡¡ }{{zzyxvuuxyzz¡¡¢£¤¥¥¥¦¦§§§§§§§¨©ª«¬®¯°±±±±±°¯¯¯°°¯¯°°±±±±°¯¯¯¯®¯°°±±±°°°°°¯¯¯¯¯°°±±±±±±±±³²²³´´´´······¶µ´´´´³²²²±±±°®«©§¦£~}xttqmknswywutsoqplebbcgggecdgiorsqoomiYUPMKNV_ikkihghhmoqprsnhdccehnrvwxwtsv|~{{z}~|}{wog^\[ZYY[]^^^^]\\\]^``^\\\]\\ZXWVX\_abdefeffgiouund^^`abjrvwyywwwxyxwvuuvwwutqonmljiiiiijha[YZ^ehihbYTSUX_cbbeebb`^]^^__acfggfb`ZTUTSQPVcpz ¡ sdZUQPPPQSSQOKJIIIJJILLMMLKJJHHGEDDDCFGGGEDDDDDDB>96559>BBAAA?>====>=;<>??><:;;<:86677631-*'&$&%$%'% *Ut¨ª««¯±±°²·£hr¦«¯µ·¸¸···¸·¸¶·¶²« }~ ~}} {ttl_:C>67658786<CGGEB?;9;=<>@>86337:=>>>><8789;=?BDGJLLMOPPPPONMLKJKMNPPPPQRSSQPOMLIECA?@ABA???>>?BCA@>=<=>>=<;977:>?><:864334<?>;98;@CBA?>=>ADGIFB@BEGGGHIKMNLJHEA>=><>ABCEGGFHJJIIJKKNQTTSRQRQPQSUUSQSVTPNV_gq©ª«ªª©¨¨«««««¬¬«¬®¬¬««««ª©©©©¨§¨¨©ªªªªª«««ªªª«««««ªª«««««©ªªª©©ª«¬««««ªªª««««««««««¬®®®®®¬¬««®®®®®®®®®®¯¯°°°±°¯¯°±±±±±±±±±±±±°°°°°°±±²±±±±²²²²³³²±±±±²³´´´µµ¶´´´´´´´´³³³´µ¶¶µ´²±±°°°±²²±±±±±±±±±±±±²²±±²²±±±²²±±±±±±±±±±±±±±±°±±±±±±±±±°°°°°°¯¯¯®¬¬¬¬¬¬¬««««««««¬¬¬¬¬¬¬¬«««««««««ªª©©©ªª©©ª©©©¨¨¨¨¨¨§¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤££¢¢¢£££¢¢¡¡ ¡¡¡ ¡¢¢¢¢¢¡¡¡¡¢ ~|{zzyxvuuwxxz¡¡¢£¤¥¥¥¦¦¦¦¦§¦¦§§¨ªª¬®¯°°°°±°°¯°°°¯®®¯¯°°±±¯®®¯¯®¯±°°±°°¯¯¯®®¯¯¯¯¯¯±±±±±±±±²²²³´´´´······¶¶´µµ´´³³³²²²±±°«©¨¥£ }xtqmhlqvxxvtsnolc[Y]beeecbbfhnpqpoolfUSPMPZgqtspnkiiilmnnnnjebcehjnqttuvttuz~|zxwwzzzzzwph`\\\[[[\\]^`a`_^]^``^\\[[ZZYXWVX\_bdefgghhhhnuvqic`_`amtxxxwttwxxwwxyzz{{zywutponljihggg`VOLQ[ded^WRRSU\cegiheeca__`abbehijjhd^VTSRSV^q|¡¡ se\UQRQQRTSQOKKKKJJKKLLLKJIGFGGFEDCCCGHIHFDDDEEFEB<888=BDCA@@=<:99:::9<?AA@@?>=;97656331/,*'%%%%$%('$%Jat¡§®³³²²´zlu©®²··¹¹¸··¸¸¹·¸·³ª~}}|{{}wvp_=A:2333778<?DFHGC>;9:<;=>=8622489;=>>>;:;=>@CDDFHJIJKMOPQPQPPONNOPPPQQRRSSQQPPPMJFDCCDDCA@?>?ADDCA<;:;=>>>@>;89:9744211135>@=7449@DDDCA?@CDGIGCACFFGHIJJLNNMKJEA>>=?AA@BCCADHJJKLMOPQRRSSTTSRSUVVSQQRTV]kxz{ ¨©ªª©©©©«««««««««¬¬¬¬¬«««««©ªª©§§§¨¨©©©©©«««ª©©ª««ª«ªª«««ª«©ªªª©©ª«««««ª««««««««««««¬¬®®®¯¯¯¯¯°°°°°¯¯¯°±±±±±±±±±±±°±±°°°°±±±²²²²²³²²³²±±±²±²³´´´´µ³´´´´´³³´³´´¶¶¶µ´²±°¯®¯±±±±±±±±±±±²²²²²²±²²²±±²³²²±±±±±±±±±±±±±±°±±±±±±±±±±°°¯¯®®®®®¬¬««««««««¬¬¬¬¬¬¬¬¬«««««««ªª©©©©©ª©©©©©©¨¨¨¨¨§¦¦¦§¦¦¦¥¥¥¥¥¥¥¥¥¤¤££¢¢¢¢¢¢££¢¢¡ ¡¢¢¢¢¡¡¡ ¡ ~}{zzzxvuvvwwx¡¡¢££¥¥¥¥¦¦¦¦¦¦¦¦§¨©ª«¬®¯¯¯¯°¯¯°°°¯®®®®®¯¯¯¯®®®®®°®¯¯¯®®¬®¯¯¯¯®°°°°±±±±³²²³´µµµ¶·····¶¶´µµµ´³´´²³³²²±°«ª¨¥¤¢ ynklgjotwwusohhe\VV\adddb`aehknonnng_SRPR[itzvtrnlkklkjjhgeccbcgloqrtrtutrtwz}zwttttuvuwwtpjdb`^]_]]\\^abaa`____^]ZYXWVVUSVX\`bdfghghhhhmttsnhcabcltxwwusrtttsstvw~~}|tromjhecb`YPJFGN\\\XTQQSUV]ejjhhfdbbbbbbbehiklig`VSRRTXct ¢¡ qe]WRRQQRRRPONOPOMLLMJJJIHFEDEEFEDDDDGIIHFDDEFFGFC>;;>ADDB?>><:9888888:=>?@AA><975444110.,*('&&%%'((('<AVbmvz£¤ uoy¯±³µ·····¹·¹·¹¹³§}vyzz|{|z{zyzzz|~~~~~}}}{{zzzzz{}~{}zvl^I?:5765878<?CFIGB=:89;;=>=>:745688:<>>>>>@?BDEDDEGGIJKMPQPRRRQPPPPPQQRRQQQPPPPPNKJIGGHIFDCA@?ADDDB=<;<>?@@A@>:997432111479@A=6338@BCDDBACEFGHGEDDDFGHGFGIJMMMMJDA@>ACBAABA@CFIKLNOPPPPPQRSSTTTUVVUPNPXbku~¦§©©©©©©ªªª««««««¬¬««¬¬«««««©ªª¨§¦§¨¦§¨¨¨¨ª««ª©©©ª©©ª©©««ªªª©ªª©¨¨ª««ªªª««««««««««««¬¬¬¬®®®¯®®¯¯¯¯°°°°°°¯¯¯¯°°¯±±±°°°°°±±±±°°±±±²³³²±²³±²²²±±²²±²³³³³´´³³´´³³³³´´´µµ¶µµ´±°¯®®¯±±±±±±±±±±±²²²²²±±²²±±²³´±±±±±±±±±±±±±±±±±±²²±±±±°±±±°¯®¬®¬¬¬¬¬¬¬¬¬¬««««««««¬¬«««¬¬¬¬¬«««««ªª©©¨©©ª©©©©©©¨¨§§§§¦¦§¨§§¦¦¥¥¤¤¤¤¤¤¤££¢¡¡¢¢¢¢¢¢¢¡¡ ¡¢¢¡¡¡ ~~~}|{zzzywvvvwwx¡¡¢££¥¥¥¥¥¦¦¦¦¦¦¦¦§¨©««¬®®®®¯¯¯¯°°¯®®®®®®®®®¬«¬®®®®¬¬«¬®¯¯¯®¯¯¯°°±±±³³³´µ¶¶µ¶¶····¶¶´µ¶µ´´´µ´µµ³²²°««©§¥£uechdhlqttsnk`b`[VX\`cdca_`dhhlnnnkbXTTSWetzyxvtpljjljihea]_bbbhotuttsttqoqvy}}|zwsqpsrssrttppmigcaabba^\]`a`ba`_^]^_[YWVVTRPUW\`befghfeffhmsttrlebehktxwwtrqonmllmoqyz|}}|{{tspnjgba[VPLMJGIQRRRPPRSVRVbjhgjgedccddcbdghjkhf`VSRRSVbs ¡ |mc]WSPPPQQPPOPPQPNLLMIIHGFFEEDEFFEDEEHIJHFEEFFFGFD?>>ADED@>>>><;:99987889;<=>?<865544100/-+*)*(&'('(****8DT^hs zpo{²°±³´¶·¶¶···¹¸»º³¥xtwwvxwyxzyxzzz|{{{|||||zzzyxwxxz|}}}|~vf]T>:453179=?@BCDDA>878;;>?>DA=9889:89<>>?@B?CEFDDDFHJLLNPPPRRSRQPPPQQRRQPPOONNNNNLJLJJKKJGECB@ACDDC?>=>?ABBAA?=<;975543479<@B>8658?DDDCA?ADGGFGGGEDHHHFDCEGJKNOLGB@ADEDDDDDCDFIJLNNOPPPPPPPQSUTTVVVSV`lruz ©©ª©©¨¨¨©ª««««««¬¬««««¬¬®®¬«««ªªªªª©©©§¨¨¨©©©ª©©¨¨¨¨¨¨©©¨¨¨©ª««««ª©©ª««ª©©ªªªªª«««««¬¬««¬¬®®®®¬«¬¬¬¬®®¯°°°°°¯¯®¯¯°°¯±°¯°±±°°±±°°°±±±²³³³³²³³²³³²±±±²±±±²³´´³µµ´´´´´´´´µ¶¶¶µµ´³±±°¯°±±±±²²²±±±±±²²²±±²²²²²²²³³³²²±±±±°°±±±±±±±±±±±±°°±°¯¯¯°¯¯«®®¬¬¬««««¬««««««««««««««««¬¬««««««ªª©¨¨¨¨©©©ªªªª©©¨¨¨§§§§§§¦¦¥¥¥¥¥¥¤¤££¢¢¢¢¢¡¡¡¡¡¡ ¡ ¡~~}|zzzyxwvuuvyy{ ¡¢¤¥¥¥¥¥¥¥¦¥¥¦§§§¨««¬¬¬®®®®¯®¬¬¬¬¬¬««««¬¬¬«ª«¬¬®¯¯¯¯¯¯¯¯°°±±³³´´µµµµ¶¶········¶¶¶¶µµ¶¶¶¶µ´²±¯¬ª©§¥¢ tgZ_bdjnpsog``_\YXZ^bedbaabegkkkljd[SWOQ]jx{z{tnponprhb`\Z\]adrzwtttsqponmpu|}{upnmmnooonnpqoonlhffhfb^\\^`b`````___\XVVUQPPTW\^bdfffggffimosrpnhegjotuuurnnnnkhffdblostwxwvurpomibYSPNLJJJJMOMKNPPRRQT\flkheba`aa`_`bffgfda[VPTUQZar ¡¡ zgc\USRQPPQRRQQPONMLKJJJJIGFEDFFFEEEFGIHHHHHGGFGHFDBCDDDDDDB@?>>=;;::::99:;;<<=;98998753321.,,-+*+*))+,+)%&.8>DGP_lrrpeZn|«¨±±°´¸·µ¶·µ´··³¯vopnnrrsttuuvyzzxxyzzzzzzyxvuttsvwz{{}|yvurrhSN-5544469=@@ABBA>;889:<>@BFDB?>>?A?>>==>@ABDGHGFFFJKNNNOPQSTSQQRRQQRSQPOONPMJJJJJKJJJJKJJIHDBBCDDD@?>???>>?@@?>;:99::878;<ABDE@;:=DGJJGDCCEDEGGEFGJJKJFCDHMMMNNKHEDDGJKJIGGHJLNOQTQPOPPPQRQSVXYVVV[ekrww~¨¨©©¨§§¨¨©««««««¬«««««¬¬¬¬¬¬««««ª©©©©©¨¨¨¨¨¨¨¨¨¨¨¨¨©©©ª©¨¨¨¨©©©ªªª©©ª«ª©©©©ª©©««¬¬¬¬¬«¬¬¬¬¬¬¬«¬¬®¯°°°°°°¯°°±°°±°°°°°°¯°°¯¯¯°±±±²³³³²³³²²²²±±²³³³²³³´³³´´´´´´´´´´µµµµ´´´²±±°¯°±±±±²²±±±±±±±±±±±±±±²²²²²²²²²±±±±°°°±±±±°±±±±±±°¯°¯¯¯¯¯¯®®®¬¬¬¬««««¬««««««««««««««««¬¬««««««ªª©¨¨¨©©©©©©©¨¨¨¨¨§§¦¦¦§§¦¦¥¥¥¥¥¤¤¤££¢¡¡ ¡ ~}{zyyxwvuttvyx{ ¡£¤¤¥¥¥¥¥¥¥¥§¨¨¨¨««««««¬¬®®¯¯®¬¬¬¬¬«¬¬««ªª«««¬¬«««¬¬®¯¯¯¯¯¯¯°°±±±±³³´´µµµµ¶¶¶¶··········¶¶·····µ³²±®¬«ª§¤¡ sfZ^`bhlmmib^_]\\]adgfecbbdghjihhe`YUVQWcnz{zzrlnnnrscXVVXZX^epxvssrqqponlosxzyslhhijlmmmmnpqqpnkhhhfb^\\]`b``aa`_^]ZVSSQPOPTW\^acedcdddehklnnonkhjnnsuuvsnnllieba_^aejnruutrqqplhb[SPLJIHHIJMMKLNORRRTX]aa_`^]]^__^^`bbbb_]YVQUTR[br¤¢£¡ ¡vb^XSRQPPPQRQPPPNMMLKJIIHHGGFEFFFFGGGGHGGGGGGGEFFEDDDDFEEDDCBABA@>=;:9::99:;<=><:9::8864321/..,+*+*(()(*+*+,--%',5<>>>@A_v«³±±´µ´²°²³¶´«¥|tpronqpsqsuwyzzxtuvxyyxwxwutsqportwyxxvrrsrteWJ-234558:=@AAAA?=;89:<=?BDEDCA@ACDDB><;<>>ACEFFFFGHJLMMNOPRSTSSTSQRSSQOMKKHGFFFEEFHIJJJJJJFB?@CDDD?>>>>?>=@@@?><;:;>@BDEEDDFIJJIHIDFJJIGFFEEEGGFFGJLMKIGHJKKLMNMJHFFHJMMJHIJKNOPQSRPNNNNNOQSVYYVVVblotww~¦§¨¨§§§¨¨ª«««ªª«««««««¬¬¬¬¬¬«««ªª©©ªªª©©©¨¨¨¨§§¨¨©©ª«ª©©¨¨¨¨¨¨¨©ªªªª«ª©©©ªª©¨ª«««««¬¬¬¬¬««¬¬¬¬¬¬¬®¯°°°±°°°±±°°±°°°°°¯¯°°¯®¯¯°±±±²³²²³³±²²²²²³³´³²²²³³²´´´´´´´³´´µµµ´´´³²±±°¯°±±±²²±±±±±±±±±±±±±±±±²²²²²²²±±±±±°°°±±±±°±±±±±°°¯¯®®¯°¯®®®®¬¬¬¬¬«««««««««««««««««««««««««««ªªª©©¨¨©©©¨¨¨§§§§§¨§§¦¦¦¦¦¦¦¦¦¥¥¤¤¤¤¤££¢¡ ¡ ~|zzxxwvutttuxy|¢£££¤¤¤¤¥¤¥§¨¨¨©ªª««««««¬®¯¯®¬¬¬««««««««ª©¨¨©ª««««««¬®¯°°°¯¯°±±±±±±³³³´´´´´µµµµ¶¶¶·····¸¸·······¶´³²±®¬ª§¥se[]_biljhd`__]]`dhjkhhfeeghiiheb_\XVSV_kt{~zzvnhilnrrbVUVY\ZZbjnonnnopqpnmnpsvuogbceehjkjkmoqqqomihgeb^[[]`babbbb`_]YUPPOMNPRVZ\_bbbbbbcehihfgilnnnnmpqqqnhhiihb^\[ZY]cinrtsonnlgca\TPLJHGHJIMMJJJKOPPQSTVVVYYYYZ\]]Z[\[[[ZYVXUVVV^dr¥¥¤¢ }s^ZURSQPQRTTRQONMLLLKKIIIJJIIIGGFGHIHGGFFFGGGFDDDDDDDCEDCBAAABBBA@><:9;;:::;<=><:9999853110/./-++*)'&&'''(*+*(0012211230BYht§°·¹¸³µ²¬{njhjfdffimortvwurtttuvutsttttspnlhhlnpuzzsog`LK@.0124568:?@ABA?>><=>>>@BDDCBAABDEGD@=::<=@ADDDEFHGIJLMNPQPRTTTTRPSTSQNKJJIHHFEEFEFGIJJJJJE@=>ACCC@>==>?>=@@@?>=<;=>ADGHECDEFHJKJHHJLMMLLLHGGGGEEEGKMKJJJJIIJKLLJIHHIKOPMKKKMOPPQRSPNMLLMORTWZZXWYkstwzz ¥¦§§§§§§©ª«««ªª«««««««¬¬®®¬«««««««ªªªªª©©©¨¨¨¨¨¨©ªª«©©©¨¨¨¨¨¨¨©ªªªªªªªª««ª©©¨©ª««««««¬¬¬«¬¬¬®¬¬¬¬¬®®¯¯¯¯°¯¯¯°°¯®°¯¯¯°°°¯°°¯¯¯°°±°±±²²²³³²²²²²²³³³²±±±²²²´´´´³³³³³³³´´´´´²±±±°¯°±±±²²±±±±±±±±±±±±±±²²²²²±±±±±±±±±±°°±±±°°±±±±±°¯¯®®®¯°°®®¬¬¬¬¬¬««««««««««««««««««««««««««ªªª©©©¨¨©©©¨¨§§¦¦§§§§¦¦¦¦¦¦¦¦§§¦¥¤£¢££££¢¡ ¡¡¡ ~|{zyxxwvuttuxy}¡¢¢¢££££¤£¤¥§¨©ª«««««««¬¬¬®¯¯¬««««««««ªªª©¨§§¦§©ª«««««®¯°°°°°°°±±²²±±³³³³³³³³´´´´µµ¶¶¶¶··¸¸¸······¶´²²±°®«©¦¤ ~sf^`bejkhfb`a``bdhlmmlkhhghikkhb_\ZWVQ[hpv{|zuphceimoh]VVTUXZX`b`dggjlnqqnmnnprqjb__abehiiiknmnonlhc_b_\ZZ]accdedccbaZVQPNMNPPSWZ\^^^abbcfhhg^^afmppnpqonnjhhfec_\YWWX\bgkoqpplhc^]^\UQLJIHJKKPOMMLJLPPQRRSSSTUVVWY[\VVVUUVVVVYWYYZber¤¥£¡zo\YVUVQQSUVVSQONMLLMMLJJJJJJJJHGFGIJHFEEFGHHGFDEDDCBBACA>=<=>?>>>>>=;;<=======<;988888410/-,-..-++)&%%('%%(+,+....--.0.+3GSYcmu¢«±³±³¤m_WX\[]bbgjnrttvutttstssqpsssqpnnmnlllilook`UA1860.0111246:=@BA@@AAAA@@@ABBBBA@ACDFDA>==>>?@BCDDFGGIJLNPQRPPRRRPOMRRSQOLKLLKIECDDCDDDFGHGFD@<<>@BCB?>>?@?>>>?>>>>>FGGGHIHFHIIIJMKGJKNOONMMKJIHGDCBDIKJJMMJHGGHJJHGEEGJLNNMLLNPPPQRQOMMNOPSVWZ\[[]`outy}~¥¥¦§§¦§§©ª«««ª««««««««¬¬®®¬«ªª««««««ªªªªªªªªª©©©¨©©©©¨¨¨©©©©©©©ªª«ªª©ªª««ªª©©§¨ªª«««¬««¬¬¬¬¬¬®¬¬¬¬¬¬¬¬¬¬¬¬®®®®®®®®¯¯¯¯¯¯®®¯¯¯¯°°°°°¯¯¯°°±°±±±±²²³³²²²²²²²²±±±²²³³³³³³³³³³²²²²³´´´²±±±°¯¯±±±²²±±±±±±±²²±±±²²²²²²²±±±±±±±±±±°°°±±°°±±±±°°¯¯®®®¯°°®¬¬¬«¬¬¬¬¬«««««««««««««««««««««««ªªª©©©©©©©©©©©¨§§¦¦§§§¦¦¦¥¥¥¥¦¦§§¦¥¤£¡¢¢££¢¢¡¢¡ ~}}}|zxxwvuuttuyz~¡¡¡¢¢¢¢¢¤£¢¤¥§¨ªª«««««««®¬««««««ªªª©©¨¨§¦¦¥¦§©«««¬¬®¯°°±±±±°±±²²²²±²³³³³³²²³²²³³´´µµµ¶·¸¸¸·¸····¶´³²±°¯®¬ª¨¥¡ |tgcdegihedb_`abfhkmnnonkhhhjklhb^\ZVTTbntxzzyqjebchjkb[WWUTWZY_\Y\^_bhmqqoonnnnke`]]\_bfhhhijjlnnmh`X\ZXXZ]beeggeefec\XTQPNOOOQUXZ\\\`abcgihf]ZX]horpqqnljebc_^\[ZXVVY\`chlnopib^ZZ\ZVQMJIJKNPRRRUURRRSTVVVVUSTUVVWXYVUSRSSUVVYX[\\cdp¢¢¢wmZYWVVRRSUVUSPONMMNNONKKKJJJJJIHGHIIGFEFHJJJIGFFFD@>>?@><:9:<=>>======>>@@?>>>;:988888520/-,-/0/-+)&%$%&(()**()*++-02351.126DINZeo¡ rVD8=DIU]\acjqssttrqpoooonnnkhdbbbbgfhf_ZWTTKJ5.331111111247:>AA@@@CCCBA@AACCBAAACDDDBA@@@@@@ABCDEFFGIJLNPQPPPPOMKJOOPQOMMPQROJGFD@A??ADFEDDA>==>@DDA?>?@?><=>?@ACDJKKJJKMNJKLKLONJHJLMLJJILKJIGEDACHKLORQOFEDEFFEDCDFIJJLMMLMOPPPRPOMNOPTVYZ[\\\bhquty ¦¦§§§§§§¨©ª««ª««««««««««®¬««««ª¨ª««««««ªªªªªªª««ªª©¨¨¨¨¨§¨¨©©©©©ª©©ªªªª©ªªªª©¨¨¨¨©ª««««¬««««««¬««¬¬««««¬¬¬««¬¬¬¯¯®®®®®®¯¯¯°°°¯®®®¯¯¯¯°°¯¯¯¯¯¯¯°¯°±±±±²²³²²±±²±±²±±²³´´´³³³³³²²²²±±±²³´´²±±±°®¯±°±±±±±±±±±²³³²±±²²²³³²²±±±±±±±±±±°°°±±±°±±°°°¯¯¯¯®®¯¯¯®¬««¬¬¬¬¬¬««««««««««««««««««««««««ªª©©©©©©©©©©©¨¨§§§§§§¦¦¦¥¥¥¥¦¦§§¦¥¤£¢¢¢¢¢¢¢¢¢¡ |{|}{zwvvuttttuyz~ ¡¡¢¢¢¢¤£¢¤¥¦¨©©©ªª««««¬««¬¬««««««ªª©©¨§§¦¦¦¥¥¦§©«¬®¯¯°±±±±±±±±²²²²²²²³³²²±±±±±±±²³³´´µ¶····¸····¶µ³±±°¯®«ª¨¥¡ zthgggghfcdb`abdhjmnoppnjhghikkhb_\ZVSWhtvyzywngcddhige\VXYY[[[\ZVWWVXcjpqqqpnomhb^\\Z]`cfggghhkmnmh_VVVVVX\adeggffgfd\ZVRPNNNNPSVYZ\\^`bcfhgda[VWakqrturnh^WWVUTVVVVVY[^aejnnme`]ZZZWVQLJIJKNPTVX^`^]VVVXYXVUUVVWXXWWWUTSRRSUVXVY[[bcrzsiWXWVUTTTUVUSQONMMNOPPNMMLLKKKKJJJJJHGFGJKMMKJHIHD?=>?@?><;;<<>>>>>>>>>?AA@>>><<;;::9885210/0111/+('%$$%'&&'))++++,./.+++.,)$&-;TenuxbD-/6=DT^\^`irttsollkjjkkkkgdb_\XTPDDFE@=<;D@G8554144543356:=@BA@??ABBBAABCBBA@?@ACBCCCBAA@@@AABDDEDEFHJKLMPOOOMKJJLMOPNKLOSVUPOMG??>>@EIIIEDCA??BDFDB@?>=<:;>?BEHJJKLJJJKLJKKKKLKIHJLLJIHIIIHHHHFDBEJMPTSPEDDDEDDBDEGIJKMONMLNOPPQPNMNOPTWZZ[ZZ\dkrutz §¨¨¨§§§§§¨©ªªªª««««««««««ª©©ª©¨ªªªªªª««©©ªªªªªªªª©¨¨§§§§¨¨©©©¨¨©©¨©ªªªªªªªª¨¨¨©ªª««««««ª«««ªª««©««««««¬¬¬¬¬¬¬¬¬®®®¯¯¯°°°¯®®¯¯¯®®¯¯¯¯¯¯¯¯°°¯°±±±±±²²±±±±²±±±±²³´µ´³³³³²²²²²²²±±±²²³²±±±°®®°¯°±±±°±±±±±²²²²±±²²³²²±±±±±±±±±±±°°±±±±±°°¯¯¯®®®¯®®®®®®¬¬®®¬¬¬¬¬««««««««««««««««««««««««ªªª©©©©©©¨¨¨¨¨¨¨§¦¦§§¦¦¥¥¥¥¦¦¦¦¦¥¤¤¤£¢¢¡¢¢¢¡ }{{{zxuuuttttttyz~ ¡¡¡¡¡¤££¥¦¦¦§©©©©ªª««¬««ª«««««««ªª©©©§¦¥¥¥¥¥¥¥¦¨ª«®¯¯°±±±±±±±±±²²²²³²²²²²±±±±±±±±±±²³³´µ¶···¸···¶¶´³±±±°¯®¬«ª¨¥¥¡ ztghgffgdcdbabcdfimnnnnlhfefhjihfb]ZWVZmwwyzutldcefhhdaXUX[\^]]YWVTSTT`hoqrttqqnha]\[Y]_bfhhgfhiklli_VTTUVW[_bdghgggeb[XTPMLLKNOQUWY[]]_acegfd`\XV\djluvtneXPPONOQTTUVY\]`bgiif_\\ZYXVVQMJIIJLPUX\bdcc\\[ZZXVVWWXYZYWVVTRRQQQSTVTWXYbhzuoiXXWVUUTSTTSQPONMMNOPPOONNNOOOPOMLKJJIHIJLNNMLKJHD@>?AAA@?>>==>>>>>=<<=>>><;;<>>>>>=;;9753212432/+('%%%%%$%'+++,+)'''%)%%&+.)#6?BI]ijpeV@-+024CMJO[ensttpjgghhhhgeb]YVSNGB><<93278<<>60..03467788:>?AA@????@@AABCDCB@>==>?@@ABBA@@?@@ACDDEDDDFGIJJNMMNNLKLMMOOLHIKMPQPPPH>>>?ADIKMJIHIHFFGJHEC?=:9;<>@CEIJLNONNNMKOMLMMLJJIJLJFDDFDDDDFHFDACGLPSRPGFEEEDB@BBCEJMOPPNLMNNOPONMNOPSVZZZYX\ckrvu{ ¨©©©¨§§§¦§¨©©ªªª«««««««««©¨©ªª©«ª©¨¨©ª«©©©©©©©©ª©©¨¨§§§¨¨©©©¨§¦¨¨§¨©ª«««««ª©¨©ªª«««ª©©©ªªªª©©ª«©ª«¬««¬®¬¬¬¬¬¬¬¬®®®®¯°°¯®¯°°¯®®®°°°°°°°±¯°±±±±±±±±±±±²²±±±²³´´³²³²²²²²²²³²²±±±±²²±±±¯®®¯®°±±±°±±±±±±±±²²±²²²²±±±±±±±±±°°±°°±±±±±¯¯¯®®¯®®®®®¬¬¬¬¬¬«««««««««««««««««««¬¬««««««ª©©©©¨¨¨¨¨¨¨¨§¦¦§§¦¦¥¥¥¥¦¦¦¦¥¥¥¤¥¤£¢¡¡¡¢ |zzxwuuuttttttxz} ££¤¦§§¦¦©©©ªªª«««ª©©ª««««««ªª©©©§¥¥¤¥¥¥¥¥¥¦©«¬®®¯°±±±²±±±±±±²²³³²²²²²±±±±±°°°±±±³³³´¶·····¶¶µ´³²²²±±±¯®¬ª¨§§¥¡ysehedcecbba`bdcdgknmknkgdcehjhihd^ZYZ[nxvxxtpkcbfeggb^YZ`bcffaXVVRSWW]goqsuurtpib]\[Z]_bfhihgghhijh_VSTTUVY\_cgihhgd`YVQMJJJJLMPTVWZ\]_bcegfd[\[YZ^bdhhfaYMFIJJMPRRUXZ\]^`bbb`ZXXVVWVWRMJIHJKOUY\abbbaa`]\ZYYXXY[\[WURPPPPPPRRSRVWXensojZYWVVRQPPPPNLNMLMNOPPMMMNOPPPRQPOLKKKJJJLNOOOMJHDBABBAAAA@>=<=>>>><:9:::87789>?@@?>=<87443235430+'&%%%'''())((*)&%%%%%$*)(+**++#$5ACKHD<1+-)%2>>FJS\djnmgffghgebaVMA966531010+),/3621%&%*02689:;<>>>>>>>>>?@@ABCDDDA><;;<>>?@@@@@??@BCDEEEEEFHIJJJJKNNMLMPPPPKFEIMPPPRUND<=>@BEJMLLMOOMJJLKJE@<98=>?@BDFHLMMNPPPMLIHJMKJJGHHD><=??@ABDFECBCFLQRQPJJHGED@>;:;?GMONPOLLMMNPNMMNOPSVYZZYW[bjqww|ªª©¨§§¨¨¨§§§¨©©¨ª««ª©©ª«««ª©©ª««««««««««ª©©©©¨¨©©ªªª¨§§§¨©©©©¨§§§§¨¨©©ªª««««ª©©ª©©©©©©ªª«««ª©©ª«ª«««««¬¬¬¬¬¬¬¯¯°°°°¯®¯°°°¯¯°±±±°°°°°°°°¯°°°°¯°±±±±±±±±±²±±±²³³³³³²±±±±²²²±±±±°±±±¯®°±±±²±°°±±±±³³³²²²²²³²²±±±±°°°¯°±±°°¯¯®®®®¬¬¬®¬¬¬¬¬«««««ªªª«««««©©ªª«ªªª««ªªªªªª©©©©©©¨¨§§§§§¦¦¥¦¦¦¥¥¥¥¥¥¥¥¦¥¥¤¤¥¤£¢¡¡¡¡ {zzzyxwutttsttwuxz ¢¢£¥¥¥¥¥¥¨¨©©©©©ª«ª©©©ªªª«ª©©©¨¨§¦¤£¢¢¢£¥¦§©ª««®°±±±±²²±±²²²²²±²³±²²²²±±°°°±±°°±²³³´µ¶¶·······¶µ´²±±±±°®¬«ª¨¥£ ~shdefedcccbbbfahkjnliliebbdhlojih`Z\^arvsxyrnigedffdb^]^cjnnmf\VUUV[]`floruuttpjd`^]]_`ejjlmjhhillg^WVTUX[\]``hkkgef\\QOIDJJJJNLPUW\^]^`aehhfeb^\[Z\^c`[VPMJHHGHJMPVZ\]^]]^][YYYXXWVVVTQOKIJKPU[_abbdfdcb_[YYZZ\^`_[VRPNNOPPOPOQRR[irsigZXXWTURPPOMLLMNNNNNOOOOOPPPPPPPPOMLMONLKKKKMONLJHHGFDDDCBA?>>?>>>>>=<=<:87789=>??><<=98865444421.+*(''())))('(&%#""""$$%&(('&&(+,,-.031/.//.-+**+/2469AJPTVXXVY]`_\ZYPI=3..011220-+,-../,($#$&+1688879::::<;9@BDDDDEFD@>>=;;<==>>????ABDEEEFGHHHIIJJJKMMLONMOPQRPKHGGJMOPPPNKDDDDDHLOOPRSQNLLOLJGB=;=@BA@AADINOPRQPNLJIHHJJJIGGEA>;:;>?@ACEFEEEGKPRRRPNLJIID;<=;>FKLONNMKKLNOPPONOPSVYZY[WWemsuy}©©©¨¨¨¨¨§§¦§¨¨¨§©ª«ª©¨©«««ªªªª«««««««««««©©©©¨¨©©©ª©¨¨¨¨©©©©©©¨§§¨¨¨¨©©©©ª««ªªªª©©¨¨¨©ª««««ª©©©ªª«««««¬¬¬®®¯¯°°¯¯°°°°¯¯¯°°°¯¯¯¯¯¯±°°±±±±°°°°±±±±±°±±±±±²²³³³³²±²²²²³²±°°°¯°°°®®®®®¯°±±°±±±±±±±±²²²²²²²²³²²±±±±°±±°±±±±°¯®®®®¬¬¬¬¬¬¬¬¬«««««ªª««««««ªªªª«ªªªªªªªªªªª©©©©©©¨§§§§§§¦¦¥¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¤¤¤£¢¢¡¡¡ |zzzywwutttsstutwz¡¢¢£¤¤¤¥¥¥§¨¨¨¨©©©ª©¨¨©©ªª«ª©©©¨§¦¤¢ ¡£¥§¨«««¯±±±±±²²±±±²²²±±²²±±±±±±±°°±±±°°±±²³´µ¶¶¶······¶´³³²±±°¯¬«ª¨¦¤¡ tkgggeefebbaadbikimljjgcabehjnmnja[\_brutxvomihffggec__bhnrstf\VVVW\]bhnptvwutpkea_^^_aglmnnkjijljd\UVVW\^^^`ahkkhgh_[OLIDGHHILKOQV^^]^`behjjjgb_\YXZYVSPMKJIIHHJKOUZZ\\\\\[YXXWVVVUUUSQOLJJLQV[_abbceghfb\ZYYZ\_a`][WTQPOONNMLNOPYitsgcXXWVTSPOOOMMMNNOOONOOOOPPPPPPPPPONNOPNKIIIJJKNLJJIIGEDDCBA@?>AA@@@???>>=:8788=>>><;<=;::988886531.+*)***)((''&%$#"!!!##$%%%%%&()*))*+)'%%%&%%'''),/1149>?>=;9CDFHHHFE<830--../110,***+**)&#"#'+022234678:;=>@DDEDDCDDDA>>>=<=<==>>?@@BDEGGGGGHHHIIJJKJNNMNMMPRRRQOLJHJLNOPPPNJIGEEHJMOOPRQOMMNMKHB>>@CDDCCACHMNPQQPMKJHGGHIIHFED@=988>?ACDGIHGGILNNNNLJKKLNLD<<:=DIJMONMLKLNOPPOOOQTVXZYZW\insuwz¨¨¨¨¨¨¨¨§§§§¨¨¨¨¨©ªª©¨©©««ªªªª««ªª«««««««ª©©©¨¨©©©©¨¨¨©ª©©©ªª©©¨¨¨¨¨¨¨¨©¨©ªªªªªª©¨¨§¨©ª«ª«««ª©©©ªª««««¬¬««¬®®®®®®¯¯°°°°°¯®®®¯°°¯¯¯¯¯¯±±°±±±±°¯¯°°±±±±°°±±²²²²²²²²±±²³³³³²±¯¯¯®¯¯¯®¯°°¯°°±±°±±±±±²±±²²²²²±±±²²±±±±±°±°°°°°¯¯®®®¬¬¬¬¬««¬¬««««««ª«««««««ªª«««ªªªªªªªªªª©©©©©©©¨§§§§§§¦¦¥¥¥¥¥¥¥¥¥¦¦¦¥¥¥¥¥££££¢¡ ~|||{yvxwuttrrrssvy¡£¡¢¢£££¥¥¦¦§§¨¨¨©©¨§§¨©©©ª©§§¨§¥£ £¥§©«¬¯°°°±±²²±±±±²²²±±±±±±±±±±±°±±±°°±±²³´µµ¶¶¶····¶¶´³´³±±°®«¬«©§¥¢ ¡ vnhhhghihebaabbjjhlkjjgdcfiklnopj_[_bfqttvtmkhhfgggeccdhnrttuh^YYWY\]diortvwvtplgca```bhnoppmnlkkhbZVVX\`bba`ahjkihiaWIGFBCDEGIJMNVb`_^^`bfilnjfb\XUTQPNMMLLKJJJJJMSXZZZYXXWVWVVUSRRRRQPNLKLNQV[^``abchlid`\YX[]`ba`_][WTQPONKJJJJVhusc^VVUTRPONNNMLLNOPOONNNOOPPPPPPPPONOOPPNJGFGHIIMLKJJJGEDDDCBAAAAAA@????==<:8878<=>><;::::::999877630,+*++)(&&%&%%%$#"!!##$$$###$%&''()**)(((('&%%%&)+,,,158:<;:741/,+(%*++++*))+-/.,*(('%%%%$$%),01002578:>>?CGFGGFDDDDC@>>>>>><<==>?ABBDFHHGFFGGGHIJKLJNNMMLMPTSSSSPLIMNOOPPPPPNKIGHJKPPPRRQPPLLKHC?ADFHGEDABFLNPRRPNLIGFEFGGGFEDB?=:9=?ACEHIIGHJLLJJJIIJKKNMH@?=>DHJNNNMLKKMNPPPPPRTVWYWXV\jotwyz¦¦§¨¨¨§§¨¨¨¨©ª©©¨©ªª©¨¨©««ªª©ªª««««««««««ª©ªª©©ªª©¨¨¨¨©ª¨©©ªª©©¨¨¨¨¨¨¨¨¨¨¨©ªªªªª©¨§§¨©ª««««««ªªª©ªª««««¬«««¬¬®®®®®¯¯®®¯¯°¯°°¯®®¯¯±±°°°°°°°°°°±±°°°°°°±±±±°°°±²²±±±±±±±±³´³³³±°¯¯¯¯°°¯®¯°±°°°±±±±±±±²²²±±²²²²²±±±²²±±²±±°±°°¯¯¯®®®®®®®®®¬¬¬¬¬«¬¬««««««««««««««««««ªªªªªªªª©©©©©©¨¨¨¨¨§§§§§¦¦¦¦¥¥¥¥¥¥¥¥¦¥¥¥¥¤¤¤££££¢¡ ~|||{ywyxvtsrqqqruw ¢¡¡¡¡¡¢¤¥¥¦¦§§¨¨¨¨§¦¦§¨¨§§¦¥¥¥¤¡¡£¥¦¨«¬®¯°±±²³³±±±±²³²±±±²²³³²²±±±±±±±±±±²³³´µ¶¶¶·····¶µ³´³±±°®«¬«©§¥¤¢¢¡ ~wojhhjllkgca`_bhgfjhhihhhknooppng]]cgiorstpjjhgeefgfefhkpttttic`]ZX\]hlprstttrpmhebbbcekppqpmnlkjg`ZVVZ`dgfcaafhkiiiaQA@C@?@DEGJMLVfdb`]^acgjmjgb]XTQPONNOOPONNMLKKPUYXWVUUUVVVVSQPPPONNMMMOPRVZ\]]^^bhmjgd`\YZ\_aba``^\WVSQOKIIGGQgu r`ZTVRPPONNNMKJKNNOONMMMNOPPPPPPOMKKMNMMNJIHHGGHJJJJJIGEEEDDCCDDBBA?>=<<899::::::<>>=:887888888856641-++-,+)'&%%%%%%%$###$$#"!!""#%%'()*))))**)(%%%%'(*+,-,+*'$ "%(++()*)'%%%')+++*)(%%$$$%&)-024468<<;=BCBDHFFFDCBBCB?>>?@?>>==<=>?ACDFGHHHHHGGHJJKLJMMLMLLPSRSTURNJPPOOOPPPSQOLJJKLQPOPQPONJJJGDBDGIJIGEBADJKOQQPMLHGEDDEEEEEEDCA?>>@BDEGGGFGIKLJJJIIKJIJIEDDBBEHJMMLLKJKLMPPPPQSUVWVUVTVemtxz{~§§¨¨©¨¨¨©¨¨©©ªª©©ªªªª©©©«ªª©©©ªª«««««¬¬¬«ªª««««««ª©¨§¨©ª¨¨©©©©©¨¨¨¨¨¨§§§©©©ªªª©¨¨¨§§§©ª«««««ªªª«©©©ª«««««««¬®®®®®¯¯¯®®®®®®¯¯®¯¯¯¯¯¯°±±°°°°°°±°°±±±±°±±±±°°°°°°°±²²±°±²±±±²³´²²²±°°¯°°±±¯®®¯°°°°±±±±±±²³³²±±²²²²²²²²±±±±±±±±±±±±°¯¯¯®®®®®®®®¬¬¬¬«««««««««««««««««««ªªªªªª©©©©©©©©©©¨¨¨¨¨§§§§¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¤¤£££¢¢¢¢¢¡ ~|zzzyxyxvtsrqpqquv} ¡ ¡£¥¥¥¦¦§§¨¨§¦¦¥¦¦¦¥¥¤¢¢¡¡¤¥¦©«®¯±±±²³³²±±²³³²²²²´´´³³²±±±±±±±±±±²³³´µ¶¶¶······¶µ´²±°¯®¬¬«ª©¨¦¥£¢¡ ~wpliimmljhc_\\^bachefhjlnnoqrromgbcijkmnppnjjhfeefgggfhmruutukhgc\Y\_knoppqrrpomjgeeeijnqppomlihgb\VVU\chhhfc`dfihhg]K::>>=>DFGKOLVghhc_^`bfhjhfb^YTPONMNOPQQRRRPNLNPVUTSRRUVYYXVSPPOOOPOOPQRUVZ\\\\\bgihhhd_ZYY\^_^\\\\ZWVSPMJJGEOeun\XSVRQPPPOOLJJKLMNNLKKKMNOPPPPOMKJJJKKJLKKJIFFHHIIJIHFDFFEDDDDDDDB?=:88788:<===:;<<;87655678887566520-,--,+*(&%%%%%%%$$###" !##$%&&&&&&'())('('&%%')+()))*+(%%&&&%%%%)**(&%$$%&''''((%%%%%%*-3479<>@A?=?DGEEGFFEC@??@A@??ABA@?>=<<=>>CDEGHJJJJIIJJLLLJKJJLLKMPQSTTRPNPOMMMNOPSRPNLLMOPNLMNLJIIIHGFFHIJLJIHDCEFJMPPNLKHGDDDDDEDEFFEDBACCDEGGHIGFHKMMKJJJLKHIJGGIGEGGGJKKKKJKLMPPQRSTVWWUSWSQampuxz|~©©©ªª©©©¨¨¨¨©ª©©ªªªªªª©©««ªª©©ªª«««««¬¬¬«««««««¬«ª©¨¨©©©¨©©©©©¨¨§§§§§§§§©©©ªª©¨§¨§§§¨©©ª««ª©¨¨©ª¨¨©ª«««««¬¬®®®®®®®¯¯¯¯¯¯¯¯¯¯®®®¯¯¯¯¯°±°°¯¯¯¯¯¯±±±±±±±±±±±±±°°°±±±±±±±±²³³²²²´´²²²±±°°±°±±¯¬®°¯°±±²²²±²³³³²±±²²²²²²²²±±±±±±±°±±±±°¯¯¯¯®®®®¯¯®¬¬¬¬««««««««««««««««ªªªªªªªªª©©©©©¨¨¨©¨§§¨¨¨§§§¦¦¦¦¦¦¦¦¦¦¥¥¥¥¥¥¥¤¤£¢¢¢¢¢¢¡¡ ¡ ~{zzzyyxxvtsrqpqruu| ¡£¤¥¥¥¦¦¦§§¦¦¥¥¥¥¤££¢ ¢¤¦¨ª¬®®¯¯°±±±²³³³²²²³²²²²³´³³²±±±±±±±±±±±±²³´µµ¶¶¶·······¶´²±°¯®¬««©¨§¦¥¤£¡ }xrnmnqpnkhb\YYY\[`dchlnrtsrssqmkjikmkllmnnmkjhgffghhhhinsuuttlkkh_\_ajkmmlmnonnmjhhhipoqronnkhecb\UQQU^giihheabbfedcZJ88<;<>BGIKPNTdjigb^_beghhgc`[UPNMMNPQSSUUUUROOPQPPPPPTW[\\[WTQPRSSRSTUUXYZ[ZZZ[]abcdec`\YWWYZXVVYZZYXUQOLKJFPew}hZXTVSSSQPPOKIIJKLMMLJJJLMNOOOONLJIIJJJJJKLKIFFHGGHHHGFEFFEEDDDDDDC@<865788:<<<;;;:988774455666677775310,,-,+(%$$%%%%%$$""! ##$&()('()**++++*)(&%&()**))))'% #%&&&&(%&'('&%%%%$#$%%%%%&&%'+178:=?BCBA?AFJJJJIHFD@>>>@AABCDDC@?><<<=>@ABDGIJKKJJKMMMLJJIHKLJLOPRRQPPPLKJJKLMOPPPONOPPPNLLKIFDHHHHHJKKLLJJJHEGHJNPPNMLIGDCCCDEFHJJIFEEEDEFGHHJIHIKONLJNLMKGGIHJLJIIGFIJKKLLLNOPPRTUVVWWUSWSQalmtwy{} ««ªª©©©©©¨¨©©ªª©ªªªªªªªª«««ªªªªª««««««««¬««««««¬«©¨¨©©ª©©©ªªª©¨¨§§§§§§§§¨¨¨©ª©¨§§§§¨¨¨©©©ªª©¨¨¨¨¨¨¨©«««««¬¬®®®®®¯¯¯¯¯°°°°°¯¯¯¯°¯¯¯°±°°¯¯¯¯¯¯±±±±±±±±±±±±±±°°°±±±±±±²²³³³²²²³²²²±±°°±°±±°®®°°°±±²²²²³³³²±±²²²²²±±±±±±°±±±±°±±±°¯®®®¯®®¯°®¬«¬¬¬««««««««««««««««ªªªª©©©ªªª©©©¨¨¨¨¨¨§§§§¨¨¨§§¦¦¥¥¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤£¢¢¢¡¡¡ ¡ }{zyyxxwwvtrsrqqrutz ¡¡¡¡£¤¥¥¥¥¥¥¦¦¦¥¤¤£¢¡ ¤¦§©«¯¯¯±±²±±²²³³²²²²±±±²³³²²±±±±±±±±±²²±±²³´µ¶¶¶········¶´³±°¯¬««ª¨§¦¥¥¤£¡ |wspprttqmf_ZVUUVW]bblsuxzxvtsnhhklmmkllnnnnlhhhhhhhgfghlqtttsonnkb_`aefffghknmmmkjjlnsrssnmlhdb`_ZRPQVaijhhhgbb`ba``WL<9<:;<?DHJPPRalklha]addggfc`\VPONMNPRTUVVVVURQQQPONNOSW[]__\WTRTUVUVXXX[[[ZXXYYZ\^`a`__\ZVUTSQPPTVVVVTPNLMLJRh{ucXZTURRRPPOMIFGJKLMMLKJJKLMNNNNMKJIIJJJJKKKKJGGHHHHHGGHHHHGGFEDDDDDB>9769899::8899:::9886666677788777521---,*'%"$$%%%%%$"! !!"#%'++*)'(())******('&''&'''(('% !"$%&'%%&'('&%%#!!!#$$&&&'(*.28:<>@ACCCCDEHJJJIHFB>==>>@BCCDED@?>=<=>>>>@CFIJJLKKLMMKJIJIHJJJLMNOOOOPPJJJJKJKMMMNOOPPQQPNMKGDCEGIIIKMMKJHIKJHIJLPPPNLLIGDBABDDILOOMKKLJHHHHGHJJIJMONMMNKKJEEGGJLKJHFEHJJKLLMOPOPSUVVWXVVSTRTbhjsxz{}«ªª©¨¨¨©ª©©©ª««ª«ª©©©©ªª«««««ªªª«««««««««««««««ª©¨¨©ªªªªªªªª©©¨§§§§§§§§§§¨©©©¨¦§§¨¨¨¨¨¨¨©««ª¨¨§¨§¨©«««««««¬¬¬¬¬®®®¯¯¯¯°°±±°°¯°°°°¯¯°°±±°°°°°°±±±±±±±°±±±±±±±±¯°±±±±²³±²²²±±±±³³³±±°°±°±±±°¯¯¯°°°±±±±±³³´³²±±²±±±±±±±±°°°±±±±°±±±±°¯¯°¯®¬¬¯°®¬¬¬«¬¬¬¬¬««««««««««««««««ªªª©©©©©©ªª©¨¨¨¨¨¨¨¨§¦§§¨¨¨§§¦¦¥¥¥¦¥¥¥¥¥¥¥¥¥¥¦¦¥¥£¢¢¢¡ ¡ ~~}{zzyxwvwvtrssqrsttz ¡¡¡¢£¤¥¥¥¥¥¥¥¥¥¥£¢¡ ¡¥¨ªª«®¯¯±±²±±±²²³²²²±±±±²³²²²±±±±±±±±±²³²±³³´µ¶¶··¶¶·····¶µ´±°®««ª©¨§¦¥¥¤¢ zvsqrtttrlc\VTRRTV\_bpwyz{zxtqmechijkkllnonnmggghhhgecabgnsttttqpmea`_`aaabdhllmmkklnqsrsrnkifb`__ZSQTVblkhhhheb^^]]^VP?<<9:;>BFHOQQ_nnrnd^`cddedb`]WQPOMMOQSUVUUVVUTSTQPOMNQVZ\``]XURSTVVW[\[\[ZXWVWXY[^``^^_\ZWSPOMMKOQPQRPNLKNNLVl¡ paX[TSPPOONMJGDEHKMMMLKJJJKLMNNMLJJIIJJKLMKJJJIHIIIHHHHIJIIIIHFEDEFGDA=:9<;:::98778;>>=:8::99999:87666520100.+(%$$$%%%%%%#! """$$%'*)'%'((())*+*+++)'&&()('''%##" #%'')(''('%%$" "$%%'&%'*,138;>??ACDCDDBCDFFDDB><::;=?BBCDDD?>>==>>?>?BEIJKJKKKLLKJGHJIHJJJMKKKKLMNOLJJLLJJLKLNOPPPQPONMJECACFIIIJMNJIEGKKIJJLOOMKJJIGDBAACDILPPONOPPMKJJHIJIJKNNNNPLIIHDEIIGJJGECCFHIJKLMOPOPSUVVWXVVSPPVbbhqwy{| ¨¨©©©¨©ªªª©©©©ªª««©©©¨©ª«««««ª©¨«««««««¬¬««««««ª«ªªª©¨¨¨©©©©©©¨¨¨§¦§§§§§§¦¦¦¨¨¨§§§¨¨¨¨§§¨©ªª©©©ªª©©©ª«««¬¬««¬¬¬¬¬®¯¯°°°±±°°°°±±±±±±±±±±±±±°°°±±±±±±±±±°°°±±±±°±²²±²³µ³³³³´´³²²±±±±±±²³²±±±±±°°±±±±±±±±±±±±±±±±±±±±±±±±±°°°±±±±°°°°®®¯®®®®®®®®®®®®¬¬¬¬¬¬¬¬¬¬¬««ªªª««ªªªªªªª©©©©©¨§¦§¨¨§§§§¨§¦§¨¨¨§§¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¥¥¥¤¤¢¡¡¡¢¢¢¡¡ ~|{{zzywwvwvtttsrqrqtsw ¡¡¡¢£¤¤¥¥¥¥¥¤¤¥¤¡£¦ª«¬®¯¯¯°±±²²²²²³³³²²±±²³´²²²²±±²²²³µ´³²²³³³´µ¶¶¶¶¶··¸¸····µ±°¯«©¨¨§§¦¥¤¤¡}zurqrruulb[VRUSTWY]htyxxzzytph`^bbhliknponligghiihfcbb`afntttttrme_^_\\]]`dhjnmllnorsutspmjfb`]\[YVUU\elkhgggdb_\\\ZWPJB>====@DINPRZgqqnic`bec`aa]^\UTQOMNPQRTUVUTTTUVSPONOQUZ\_``\VPQRTWZ\\\\\[YWVUUY[\\\]]\\XWVPMMKJIHIJKKJKLMMLUj¡¡yl]\XTPOOPONJGFHIGNOPONNNOMMNNNMMLMMMMMMLLNMLJJIHHIIJJJJJJJIHIHGHJIHGFD?===<<==:748:>@A@>>;<;99;:88887531/1..0,*'$%%&(('&&%# !"&)+,+)&%&&''())*+++**)'&(''''&%$%$##$$$$&&'''&&%%$###$$%%&'()+.08:=>?@BCDDDDDCCBDCB><:;<?@ABBBBBA@>>>?ACCCDHJKKLKKJJJJIGGHHHHHIJJIHIJJJLLLMLLKKJJJKMOPQROOMJGDDCDEGGIJJJIFFJMNMLKNPMJJIIJJFCAADEIKMNPQQQQPNMKJJJJJKLNPPPMHGGEGJKMKIECCEGHIJKKLLMRPQTVVVWSONMJNYbdovwz~ ¨©ªªª©ªªªª©©©©ªªª©¨©©¨©ª««««ªªª©««««««««¬««««««ª««ªª©©¨¨¨¨¨©©©©©¨§§§¨¨©¨§¦¦¦§¨¨¨§§¨¨¨¨§§©©ªªª©ªªªª©©©ª««¬«««¬¬¬¬¬®®®®¯¯°¯¯¯¯°±±±±±±±±±±±°°°°°°°°°°°°°±°°°±±±±¯±±±±±²´³³³³´´³²±±±±±±±±²±±±±±±°°±±±±±±±±±²²±±±±±±±±±±±±±±°°±±±±±°°°°®®¯®®®®®®®®®®®®¬¬¬¬¬¬¬¬¬¬¬«««ªª©©©©©©ªª©©¨§§§§¦¦¦§§§§§§§§¦¦§§§¦¥¥¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¦¥¥¥¥¤¤£¢¢¢£££¢ ~|zzzxwwvvwvutttsrrprqu ¡¢£¤¤¥¥¥¥¥¥¤¤¤¡£§ª«®¯¯¯°°±±²²²²²³³³²²²²²³³³²²²±²²²±²´´³²³´³´´µ¶¶¶¶···¸¸¸···µ²°®¬ª¨¨§§¦¥¥¤¤¡ }ytrqpqsoe\VUSSTVY\airxxxzzwoic][\]adgkmnnmkhdeghhheba_^_emtutttsne_]^YZ[\`eijkkkmnpqrsspnjhda^\\[ZXVW]chgeffebb`^]\ZWSOIDB@ACBEIMPRXcikmlhffgd`_`^`_WURPOOPPQRSTTSRRRURPONNPTX[_aa]VPOOPSVXYY\\\ZWVUUX[]^__^\\XVUPNMJGFFFFFFEDFJMPWj|xk\ZWSPOOONMJHHJJJPPPPPOOOMNNNNNNNNMLKKKLMLLLKKKJJKKKKKJJJJHHIIHIJJIHFD@>?>>>>><97<>?AA?>=;<;::;:8887765312../,++('()*+**)&%! "$%(*+,+*(&''''()++-,+++*)''&&%%%%$#""#$%%%&&&&&%%%$$$$$$$$$%&(*+/178:=?ACDDDDDDDDDDB@><<<=>??@@@??>>==>@CDFFHKLMMNJJJJJIHGEFGHHHIJIHIIGFHKPONLKKKKLLNOPPOOMLKJGDDDDEGGGIJJKJJLOONMMOOLJJJKJIFDCDEFIKMNOPQQSQPNMJJJKKLMNOPQNJIIGHKLLKIFDDFHFHJJJKLMRRSTROLKLJIHFJQV^hnnsy~ §¨ªªªªªªª©©©©©©ª¨§§©©¨¨ªªªªªªªªª«««¬«««««««««««ª««ªª©©¨¨¨¨¨¨¨¨¨¨¨§¦¦§¨©©§§¦¦¦§¨¨§§§§§§§§©ª««ª©ªª««ªª©©ªª««««¬¬¬«®®®®®¯°±±±±±±±°°°°°°°°°°°°°°°°±°°°±±±±°±±±±±²³³³³³³³³´±±±±±±±±±±±±±±±°°°±±±±±±²²²²²±±±±±±±±±±±±±±±±±±°±°¯°¯®®®®®®®®®®®®®¬¬¬¬¬¬¬¬¬¬¬¬«««««¨¨¨¨¨©©©©¨§¦¦¦¦¥¦¦§¦¦¦§§§¦¦¦¦¦¥¥¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤££££¢¢¢¢£¢¢~ }{zzxwvvvvvvutttsrroqpt} ¡¢¢£¤¥¥¥¥¥¥¤¤£ ¡¥§ª¬®¯°°°°±±±²²²²²³³³³³³³³³³³³²²²²²²±±³³³³´µ´µµ¶¶¶····¸¸¸¸···µ²°®«ª¨§§¦¦¥¥¤£¡ }wspnjhhd\USSTTVZ\`ejnqqsttof_]ZVVXW\djkkkjhebcdfhgeba^]^cinoonpokd_\\YYZ\`ehifhjmnpppppnigdb_\\\\[ZYZ\^___bba`aa`_][XVSPKGEFHDGIMQSWacfjmmlihe^ZXX[[VTSRQPPPOQRSSSRRRTRPONNPSVZ^ab^XSMMMOQTVW[[ZXVUTTX\abcba^\XVUPMKHEEEDDCBBJJKMPWhv yrd\ZWURQPONMJIJLNNPPPQQPPONNMMMLLLNMLKJJKKIJKLMMMLMMMMLLKJIHHIIIIJJIGECAAB@?>???>=BBBA@>=<;<=<;:98887776543/--++,+**++,,,,)&%##%&'*+,,+*((('&&(*+-.-,+++*)&%%%%$$#""#$%%%%&&%%%%%%$$%%%%%%%%(*+.12678<>ACCCBBDEFEDA?>=<==>>>???>=<;;;<>@CDFGIJKKJKIHHHHHGGEFGGGHIIGIJIFDGJQPMKJJKLMOPPPNLKJJJIGFDDCDFEEHJKMKKNPPPOOONJIJKMLJIGFGGHHJMNNPPPQPPOMKJJLMMMMMNPMJJJGHJJJIGFEEFFEGIJJKMORRSSPLHGEDDDCFJIR_inrvz~ ¦§©ªª©©¨ª©©©©©©ª¨§¨©ª©¨©ªª©©ªª««ª««¬««««««ª««««««««ªª©©¨ª©¨§¦¦¦¦¨§¦¦¦§¨¨§¦¥¥¥¦§¨¨§§¦¦§§¨©ª«ªª©©©«««ª©©ªª««««¬¬¬¬®®®®®®¯¯°±±°°±±°°°°±±±°±°°°°°°°°°°°±±±±±±²²²²²³³´´³²²³µ±±±±±±±±±±±±±±±±±±±±±±±±²²²²²²±±±±±±²²²²²±±±±±±°±¯¯°¯®®®®®®®®®®®¬®¬¬««¬¬¬¬¬¬¬¬««««««©©©©©©©©©¨§¦¦¦¦¦§§§¦¥¥¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¤¤¤¥¥¥¥¥£££¢¢¢¢¢£¢¢¢¢¢¢¡~}{zzzz{|}}zzywvuuvwvuutttsrrpsqt| ¡¢£¤¥¥¥¥¥¥¤¤£ ¡¥¦¨«¬¯¯°°°°°±±²²²²²³³³³³´´´³³³³²²²²²²±±³³³³´µµ¶¶··¶····¸¸¸¸···µ²°®¬«©§§¦¥¥¤££¡¡ }upmhb\\ZVQPRTV[^acfhfeghihb[VXWTSURVbghhhgebabceffecba__`bccbcegeb^]]\\\\`dffbehmnoononkgdba_]\\\\ZZ[YZYXY\]]^`bba_\XVTQNJHIJHJJMQSXabehknnljh`VPOPRQRSSSRQPNPPRSUVVUURPPOOPSVZ]`a_[VONLKMPSUVVVUSSSSW\bdeca^ZVVTNIFDCDDDA@@AEGILPZjwure\ZWVTRPONLJJKNPPQPPQQQPNMMLJJJJJJKLLKJIHGHJLMMLLMNNNMMLKHGGHHGGHHGFDDCDDA@@@BCDDFEDB@?>=<>>>;9878777776551.-++-+++++,---+*(&&'()*+++*)(('&%%'*+--,++++**&&%$$$$$$%%%%%$#%%%%%%%%%%&&&%&&()+-/112678;>ABBCA@BDFED>=;;=>>>????>><;99:;=?ACDDFIJHHIHHHHHGGFGGHHHHHHHJKJHGILPNLJJJKLOPPPOMKJIJJJIHGFCDDDDHKLNLKMOPQROOMJHIKMPNKIIIIIIJKLNPPNONNNNLKKMNONKJKMLJJJHIJJIGFEFEDDEGIJJKMPUTRPOLIG@ACBBEHDKYelqsuz} ¦§¨©ªª©¨ª©©©©©©ª©©©««©©©ªª©©©ª««ª««¬««««ªªªª«««««««ªª©©©ª©¨§¦¦¦¦©¨§¦¦§§¦¦¦¥¥¥¥¦§¨§§¦¦§§¨¨©ª©©¨¨¨©ªªª©©ª««««¬¬¬¬¬®®®¯¯®®®®®¯®¯¯¯¯¯°±±°°°±±±±±±±±±°°°°°°°°°±±±±²²²²²³³´´³²²³µ±±±±±±±±±±±²²±±±±±±°°±±±²²²²²²±±±±²²³³´´²±±±±±±°°¯¯°¯®®¯®®®®®®¬¬««««««¬¬¬««««««««ªª©©¨¨¨¨©¨§¦§§§§¦¦¦¦¥¦§¨§§§§§§§§¥¥¥¥¥¤¤¤£££¤¤¤¤¤££££¢¢¢¢¤£¢¢¢¢¢¡{wywvuuvxyz{}}{zyxwvvwwvvuuttsrrptst{ ¡¢£¤¥¥¥¥¥¥¤¤¢ ¤§©ª«¯¯°°¯¯°±±²²²²²³³³³´´´´´³³³³²²²²³±²³³³³´´µ¶···¶···¸¸¹¸··¶µ´±°¯««¨§§¦¥¥¤£¢¡ |tnjd_WVURPORUZ_bcefda^`a_ZVSSTUSSTQVbddddcbaaabceeedcba_]\ZXWY\^__^_`_^]]`bcbadhmnnnnnnjfcbba_^]]\[YYWWVVVX[\]`bbb_\YUQOMKJJJJMMNPQV`cdgjmnljkcWOLLMOPRTVUTRQOPQTWYZYVSPPOPQTWZ]_`_\YSQNLLNPRRRQQQRTVV[`bcb]ZTRSPHB?>>@A@>==>>AFJOYhs|sqe[XVTRPOMLJJJKNPPPPPPPPNMKJJJIIIJJJJJJIHGHJKLLLLLNNOOOONNIGFGGFEEEFFFEEEFCCCDEGHHIGDCBA@?>@A?<865666788777321//0-,,++,,-..,+*)))*++++*)))'&%%')++++*+++++('&%%$$%&&''&%$$$##$$%%%''''&'(*+,-/0111568;>BCCCBABDEDB=;:;>@@@??>>>=;:99:;=?ACDDFHIHIJJJJJIHGFJJJJJIHGIJKKJJKLMLKJJKKLOPPONNMLJJJJJJIIEDBBEJMMOLKKMOQSPOMJIIJLPNKJJJJJJJJLPRPMMMMNNMLLNOONLJKMNMONKKLJIHGGHGEDEGHIJJMPXVSPOKFB>?BBAEHENV\bhls{}}~ §§¨©ª«ª©ªªª©©ªªªªªª««©©©ªªªªªªªª©ª«««««««ªª««¬¬¬««««ªª©©©¨¨¨§§¨¨ª©¨§§§§¦¦¦¥¥¥¥¦§§§§§§§§§§¨©©¨¨¨¨¨©ªª©©ª«««¬¬¬¬¬¬®®®¯¯¯°®®¯®®®®¯®¯¯¯¯°±±°°°±±±°±±±±±°°°°°°°°°°±±±±±±²²²²³³²²²³³±±±±±°°°°±±²²±±±±±±°°±±±²²²²²±±±±±²²³³´´±±±±±±±°°¯¯°°®®¯®®®®®®¬¬¬««««««««««««««ªªªª©©¨¨¨¨¨¨¨§¨©©©¨¦§¨¨©ª««««««ª©©©§§¦¥¤¤¤¤££¤¤¤¥¥¥¤£££¢¢¢¢£¢¡¡¡¡ xssrqpqstvyz|~ ~{zzyxwwwxwwvvutsrqossty} ¡¢£¤¥¥¥¥¤¤££¢ ¥¨ª«¯¯¯°°°°°±±²²²²²³³³³´´´´´´´³³³²³³³³³³³´´´´µ····¶··¸¸¹¹¸·¶µ³²±°¯¬¬©©¨§¦¥¤£¢¡ ztmgb^YVSPNNSY^bdeffc`^`_ZSPPSSUUTSSYbcbaa````_`abccccba_\YVTSUVY[\^`a^^^^`bbabeilmmmnmmifcbbbb_]]]\YXUUUTTVX[]accb_\ZUQNLLKKKMPPPPQU\abfjnnmjibWOMKJLOQUWXXXWQQRUY\\\WTPOOPRUY\]___][VVSPONOPNNNOPSVYY\_aa^YTNKKIA<;9<>>><::;=>@CJWhtvy vpmbYXVSPOMKJHHJKLNOPPOONNMLIIIJJJKKJJIHHHIIJJLLKKLLNOPPPPPPJHFFFEDDEGHHGGGGFFGGHIJJIHEDDDDCCDDC>8676678998886664651.-,++,-./.-+*)*+,,-,+***'&&')*+++*++,,,+)))'&%%%''((''&&####$%%&'(((()+,///01111458:>ADDDCBCDDCB>==>ACCB>>====;:8889;>?ABCEGHHIKKKLLKJIHKKKLLKJIIJJKLMMLLLKKKKKLNPPNMOPPKJJJJJJJHDAAEKNMPMKJJLORONLJJIJLNLKJJJJJKKKNQTROOOOPPNMNMNNMLLMNMMPPMLMJJJJJJIGEDEGHJKNPXVTQPKD?<=?@?CGGNQV\dhoy||}¨§¨©ª«ª©ªªªªªªªª«ªªªª©©ªªªªªª©©©©ª««««¬¬««««««««««««ªª©©¨¨©©©¨¨¨©©¨¨¨¨§¦¦¦¦¦¥¥¦§§§¨¨¨¨§§§¨¨¨¨§¨¨§©ª©¨¨©ªª«¬¬¬¬®®®¯¯¯¯¯®¯®®®¯¯¯°±±°°°±±±¯±±±±°°°°¯°±°°°°±°±±±±²²²±±±±²²±±±±°°°¯¯¯®°±±±±±±²±±°°±±±±±²²±±±±±±±±²²²²±±±±±±±°±°¯°°¯®¯¯®®®®¬¬««««««««««««ªªª©©©©©©©©©©©©©ª«¬¬¬««¬®®¯°°°°°®¬«««ªª¨¦¥¥¥¦¥¥¦¦§§§¨¦¥¥¥¤¤¤¤¤£¢¢¢¢¡ ~|zvsqnnllnpstwy{}}}~|zzzyxxxxyxxwvutrrnrqruz ¡¢£¤¤¥¥¤£££¢¡¡£¦©«¯°¯°°°°°±±±²²²²²³³³³´´´´´´´³³³³³³³³³³´´µµµµ¶···¶··¹¹¹¹··µ´²±±¯®¬¬««ª¨§¥¤¤£¢ }xri`ZYURPNLMU]ceghgeba`a_YQOPTVVVURV^cc_\\]]]\\\]_`bbcbb`]YUSRRTVWY\^`^___`bbbbehjjjklkkhebbccb_\^_^[XVVVVVWYZ^bdca_\[WSOMLLLMOQQRUUV\`beinonlf^PIJJGJMPTX[\]]VVUVZ\\\XTOMMOSVZ\_``_][YZYWUQONKKKLOSY\\]]]\ZSMJFDA=:;9=>><:888678:DTeohjow| ~yupk`XWVROLJJGFGJKLMNOONMLKKKIIJJKKLLJJHGGHJJJKKKJJLMOOPPQPPPLJGFFEDDGIJHGHGFGHIJJJJJJHGGHHGFFGHE@:89889:;:98868888840.,+++,-..-,+**+-..-++++)()*+,+***++--,++++*'&%%&&''&&&&$##"#$%%%&()*+-/21123443568;>?BDDCCCCCBA>>?ACCCB>=;;<=<<9888:<>?AACDEFHJLNOPNLKJJJKMNNMLJKMMNPONMLLKJJJJKNOLLOPPLKJJJJJJIEA?CHKLMKJJIJLPNKJIHHJLLLMLKJJJJKMOQSRPPOOPPOOPMMLLKKKKJKOOKKKHHIJJJHGFEEEHJNPPUUSPKGC><:=>>@DFJLQ[cfiouwz~§§§§©ªª©«ªªªªªª«ª©©ªª©©ªªª««ª©¨¨©ªª«««¬¬««««««««««ªª©©ªªªª©¨§§§§§¨¨§¦¥¦¦§§¦¥¦§§§¨¨¨¨§§§§¨¨¨¨¨¨§©ª©¨§¨ªª«¬¬¬¯¯¯¯®®®®«®®®¬¬®®¯¯¯°±±±°¯°±±°¯±±±°°°¯¯¯°±°°°°±±±±±²³³³±±±±²²±°°°°¯¯¯®®¯±±±±±±²±±°°±±²±±±±±±±±±±±±±±±±±±±±±±±°±°¯°°¯¯°¯¯®®®¬¬¬««««««««ªªªªªª©©©¨ª©ªªª«««««¬®¯°°¯±²³³³³²³³³²±¯¬¬¬«ª¨§¦¨©©©©ªª««««ª©¨¨¨§¨¦¦¥¥¥¥¤£ ~|xrmjkmnlkiiknqtvwz||| ~|zzzzyxxwzzyxwvtssoqpptz ¡¢£¤¤¥¤¤£¢¢¢ ¥¥¦¨«¬®°°¯°±±±±±±±²²²²²³³³³³³³´´´´´³³³³³³³³³´µµ¶¶µ¶···¶·¸¹¹¹¸·¶´³±±±¯¬«««««©§¥¥¤£¢ ~wpeXQRMKKLKNV`hhhihdbb__]XROPTYXYVRYbdc\VW[\[YZ[[\]_abccb]XTQPPQRTVZ\__aaaabbbbdghhhhjjjhdbbccb_\^a`\YYXXZ[\\\_bdca^\\XUPNLKLNNPRUYYY\bbdhlnnnf\JBGHFIKNSX\^`a\ZXX[\\[YTNKKNRVZ\`a`_\Z[\^]ZUPMJJJJNSY]]\ZYWTMFJC>=;<=<==<;86435678?IPRV\htz{ }zzz{~wpqnf[VVTPLIHHGFGJLMNONNNLJJJKJJJKKKJJIIIIIJJJJJJJIJLNNOPPPPPOMJGFGFFFIJJGFFFEEGIJJJJJJIHIJJIHIIJHB<:<;<<=<:86768878830/,+*++,..-,+*++-..-,++++*+,..,+)*++,,++++++)&%%%%&%%%%%%$#"##$%"%'*+,.06545788878:;<>?ABBBBBAA@?@ABCCBA><;;<>>=>=<;;=>?@ABDDDHJMOPQPOMLIJKMPPPNLOPPPQQPNMKJIHHHHKMKJNPPMKJIJJJIGD@>?DHJIHHHHIJNLJGFFFILLNPPNKJIIKNPPQRQONNPPPPRNLKJJIHGHJNNJJJGDFHIHFFFEEEHLPRSSTQJD@><>:;>>?DEIIKV_abhkpv{~§§§§¨©©¨©ªª©ª««¨©¨¨©ª««ª«ª©©ª©¨§©©ªª««««««««««ªª««ª««©©ªª««ªª©©§¨§§¨¨¨§¦§§§§§¨¨¨§§¨¨¨§§§§§¨¨¨©©©¨©ª©©©©ª««¬¬¬««¬®¯¯¯®®®¬¬®¯¯¯®¯¯®®®¯°¯°±°¯®¯°°°°¯¯¯°±±±±²±±²³±°¯¯°°¯®®¯°°¯®®®®¯±±±±±±±°°°±±±±±±±±±±±±±±±±±±±±±±±±±°°¯¯®®¯¯°¯®®¬¬¬¬¬«««««««ªª««««««««««®¯°°°®¯°±³µ¶·¶·····µ´¶··µ´²±±±¯¬««««®¯°¯¬«¬¬¬¬«««¬««©¨¨¨¥¢¢£¤¢ zwrjb]_cecdjkkppuwyyz} ~|{zzyyyyyzzzywvttrpoqqry¡¢¡ ¤£££££¢¡ £¦¨ª¬®°°°±²²²±°°°²²²²³³³´´´µµµ´³³³³³³´´³²´´´´µµµµ·¶¶·¸¹¹¸º¹¸··µ´´²±°¯««¬¬¬«ª¨¦¥¥¥£ ~upbQPOKJIJJOYbhhihhecba_\VPPUXYZYWW[_bd[RRVWWWWXYYY[^bceeb\VTSRRSTVXZ[]]^`bbbacdedefhhhgggfeegid`_`_^^\\\]`bbbbbcba]ZXZWTQPPPPNQVZ]^`adegilnprpaPGCEIILPUX\`bb_]\[]^\ZXUPMLNRW\]`bba^\_chhaWSSQPKLMR\\]WRPPOKIDB><<==<===;8434678<@DDCEJ`rru}zz{zzyywuzy}z upnh^URQOLJGDBDGJJKMPPPNMLKJJJMOPNJHIJKKKKKKKLLKJJJKLLNOPPPPONNJGHJJHGGGGHGEFGFGHJJJJJJJJIHIKMMMKGDDCA@>=;9888887788772.,-,*+0-0-*+-++.//,++,++,...-,,+,,++*++-..+)&%%%%%%%%%%&%%%%%%%&&'(+.0/9>@>>@BB@;88:<>>>BDCCCB@>>>?ACDD@>==>>>>>==>?AAACDDDEHKNPQRRSROKKKKMOPPPOPQPPRQOPMJIHHGFIIJLMLLMNJIJKJJJFC>>@BDFKIHHIJKOMJGDDHLPPPPPPPLJKLNNNOPPFDGNQPPROLIHFDCCEGJJHFEDDGIIJIHJIHFHNTWWVSPJD@>=<<=>?@CFIIIJPX^ahlrwz{|}§¦¦§¨©©©§¨¨§¨©©§¨¨¨©ª««««««ª©¨¨§¨©©ª««««¬««««««ª«ªª««ªª««««ªªª©¨§§§¨¨©¨§§§§§§¨¨¨©¨§§§§§§§§§§¨¨¨¨¨©ªª©©ªªªª«««««¬¬¬¬®¬¬®®®®®®¯¯¯°±°¯®¯°°°¯¯¯°°°±±±±±±±²°°¯¯°°°¯°°°¯®®¯°®°°°¯°°°°°±±±±±±±±±±±±±°°°±±±±±±±±±°¯¯¯®®®®¯¯¬««¬¬¬¬¬«««««««««««««««¬®¯¯¯®®¯°±±±±²³´¶··¸···········¶µ³²²²±°¯¯¯¯¯±±²³²±±°¯®®¯°°¯®®®®¬«««ª¨¦¥¥¥£¢ xtndYQPR[\ahjlpotvxyz} ~}||{zzzzzz{zzywutsspoqqsy ¡¡ £¢¢¢£¢¡ ¤§¨ª¬®°°°±±²±±±±±²²²³³³³´´´´µµ´´³³²²³³³³²³´µµ´´´µ¶¶··¹¹¹¹¸¸··¶µ´³±±°¯«¬¬¬««ª¨¦¥¥¥£ |tqbPMLJHHJKNV]eeffecba_]ZURRVYZZYVVZ]_]VPPRSTVUVVUVY^beedb^YURSSSSTVWX[\\^`bbabbcccegghhghhghiid``a````_^_abccedcb_\ZXXWVUTTTSPRV[^bcdfghjmnpqoeZQJHJJMPVZ]`bc`^\\_`^[VVVVWWXZ\^abbaaadfhhc^\\a`[XTT[XVRNLLJHEA><::<<<=<<;8433478:<>>>>=Nbis{zuttwxutustzz~|zogb\UOOMKIGECACGJLMNONNMLLKJJLMNOMIGHJJJJKLMNNLJJIJKLMOOPQQPPOPNKLMKJIIHHIHGGHGHIIIIJJIIJJIJJLMMKIHHFDDD?97776788986320-,--,,.+/.++*+...-*()**++-..-,,,,-+**++000-*'%%$%%%%%&'(('''''()*)*+011=@CBACDDA=8889:<>ACCBB@><<<>@CDEDCA@?@@@>>@BDEDCCDDEGIJLMOPPPOMKLKKLNOOONNNLMOPPPNJHGGGGHIJLLKKLKIHJLKJJFC@@BDFHMKJJIHJLONKIHJLOPQSSSQOKEEFGIJIIDDEJNNOPKIHGFDDDEGHGEDCCCGJJJHGJHIJKPUVVVRMGB><::;=>?@BEGIJKOUZ\bgmrvyz{} ¦¦¦§¨©©©¨©¨§¨©¨§¨§¨¨ªª«ªª«¬«ª¨§¨§¨¨©ª«««¬««««««ª«ªª««««««««ª©ªª©§§§¨©©©¨¨¨¨§§§§§©¨§¦¦¦§§¦¦¦¦§§§§¨©ªªªªªª©©ªªª««¬««««¬¬««¬®®®¬¬¬¬¬®®®¯°°®®¯°°¯¯¯°°°°°°±±°°°±¯¯¯¯°°°¯°°¯®®®°±®®¯®®®®¯°°±±±±±±±±±±±°°°°°±±±±±±±±±°¯¯¯¯¯¯¯¯¯¬««««¬¬¬««««««««««¬¬¬¬®¯¯°±±±±±±°°°±±²³³µ¶···¸¹¹º¹¸··¸¹º¸¸¸·¶µ´´²±±±±±²²²²³´´³²²°°°±±±±±°±±±¯®¬¬«ª¨¦¥¥¤¡}zwodXPMNQU\bfknnstwxz} ~}}}||{{zzzz{{zzxvttsronppry ¢¢¢££¢ ¢¥§¨«¬®¯°°±±±±±±±±²³³³³³³´³´´µµµ´´²²²³³´³³³µ¶µ³²³µ´µ¶·¸¹¹¸···¶µ´³³±°¯¯®®¬««©¨§¦¥¢{trbMIJHGGJKNSX``aaa`_^][WUSUWZZZXVVXZZVRPOPPQTRRQQRV]bfecb`\VRTSSSSUVVZ[\]_aaabdedeghhhghhhhiljeaabbbccbbbbeghhfc`][ZYXXXXXXWVTTVZ_cghhhjkmnnolf`YOJJJNPU\`abdba__ab_[VVZ_ba_]]_aa`_`beeffecbciifb[VWSOKIHHEDC=;989:;;;:985111369:;===;7F_ltwrrnkjjiknrquvxzy{zth^VPONLJIGEDDCDGJLMNNMNMLLLJKLLMMKHFGIJJJLMNOOLJIIKMNNNOPPPPPOPONOONKJIHGGFDEGFGHHHHHHHIJJJIHHJIGFGIJJCB=74565;;:9877610....,++./-,**/..+(&&(*+,.//.--,..,*)+,00.+(%#####$$%'))))('')+)*+,17:;@DFEDEFED?;88789<>@@?><:::;=?CEGEEDCAABCBBCEGGFDDEFHIJJIIKMLKLLLMLLMNNNNMKKKKLNPRPKHFFGGHIJLMKKMJIIKMLJJGDBBDEGJNLKJJHIJNNMKIHJKLPTVVURPIHEDDDDBDEFILOPOJIGFECBBDDDDB@@@BGJJJHFIFIKMPRTTRNGC?=:88:<>?ACEFIKMORUV[_elrvyzz¥¥¥¦¨©©©©©¨§§¨¨¨¨¨¨¨©©©©©ª««ª©¨¨¦§§¨©ª««««ªª««ªª«ªª««««««««©©ªª©©¨¨¨©ª©©¨¨¨§§§§§§§§¦¦¦§§¦¦¦¦¦¦¦¦¨©ªªªª©©©©©©©ª«««««««¬««¬¬®®®®®®®¬¬¬¬¬®¯¯¯®®®¯¯¯¯¯°°°°¯°°°¯¯¯°¯®®®¯¯®®®®®®®¯°¯®®®®®®®¯¯°°°°±±±±±±±±°°°°°±±±±±±±±±°°¯¯¯°°¯¯¯¬¬¬¬¬¬¬¬¬¬¬®®®¯°±³´´´³²±±°°±±²³´µ¶···¸¹¹ºº¹¹¸¸¹º»¹¹¹¸·¶¶¶´³²²³´´´³³´´´´³²±±±±±±±±±²²±±¯¯¯®®®«ª¨§¥¤¡{yxtrpld[PKJKKP\`bimnqtwyz~ ~}}}~||{{zzzzzzywvttsronoory ¢¢££¤¢ ¤¦¨©«¬®¯°±±±±°±±²³³³³³³´´³´´µµµµ´³³³³´µ´´´µµ´³²³³²³µ··¸····¶µ´´´³±°°°¯®®¯®««ª©¦¥¢ztsbKFHFFGJLORV[\\\\\\\\YVTTVXYXWVTTVVUSPOPPPPRPPPPQV\`db`^\YUQSSSSTVWX[[\]^_``eghhhijigghiiiknkfbbccdfedcdfhijigb_\[[ZYYYZZZZZVVVX]dhhjjkklllmiea\TPNLLMS\``adcbbbbc`\WWZ`deb`_`a`_^^^abcdddefhjhhaZYQIGEEDBA@<;9999998642/,,-1378;>>>=9Iakmkf`\WTU\fmpnpsstssniaVNJMQLKIGFFFFFIKKKMNOPMLLKJJJKKKJHGHILKKLMMMMLJIJLNOOMMNOOONNMLNPPNMMIHGFDCCDDEFFFFGFHIJJJJIHHGFGFDBAC>83138=B@>=<<;:8621363.00./1.-0/.,*()+,-/110/..-//.++,///-*%"! !!""#%&((((''(*+*,/17=ACBEGFFFFEEB>;878:9;==<9869:;<?DFGDDDCABCDEDDDEFFEGHIJLLJIHJJJJKLLLLMMNOOOMKKLLKMPSQNJGFFFHIKNNMMOJJJKLLJJJGEEFFHJKLLKJJJLLMMJHFGHJNSUVUUSRPLIEDDDFHJJNQRPKHDDDDCBABCBA@??AGJJJHFIFJMOPQQQJF@=<;9889=?ABDEGJLNOPRSVY_flpstx~¥¥¥¦¨©©©¨§§¦¦¦§§©©©¨¨¨¨¨©©©ª««©§¦¦§¨©©ªªªª©ªª«ªª««««««««««ª¨©ªª©«ª©©ªª©©¨¨¨¨§§§¦¥¥¦§§§§§¦¦¦¦§§§§¨¨©©ª©©©©©©©©©ª««ªªª«««««¬®®¬¬««««¬¬¬®®®®®®®®¯®®¯°°°¯¯¯°¯¯¯¯°¯¯®®®®®®®¯¯¯¯°¯¯®¯¯®®®®¯¯°°¯¯±±±±±±±±±±±±±°°°°°°°±±°°®¯¯¯¯¯¯®®¯¯¯¯¯¯¯¯¯°°±±±±±±´µµµ³²±±°°±±²³´µ¶¶··¸¸¹º¹¹¹¹ºº»»ººº¹······¶¶···¶··¶¶¶¶´³²²²²±±±±²³³²±°°°¯¯®®®«ª©§¥¢}wrnifc_VLDCDFFN]abiknqtwy{ ~~~~}|{zzyyxwvuttsrpnoorx~ ¡¢¢¢££¢ £¥§©ª«¬¬¯°±±±±°°±±²³³³³´´´´´´µµµµµ³³²³´´´´¶µ³³³³²±±±´¶······¶µ´´´´²±°±°¯®¯®®®¬««ª§¥¢zttbKFHFGILOQUWYYZ[[[ZZYWTSUVXXWVTRRTSQQPOPPPPPOOOOPTY]_][WTQPPTTTUVWXYZ[\\^_abghiijllkhijlkkmolgbbcdfhgffghijkhfb^\\[ZZZYYYZ\\ZXVV\dhhlllllllkjfcb^\XRMMQZ^_`ceedccb`\YXY_dfdbb`\[[\\\]_aaabdfghhie^ZPDCBB@>>>=<;:9887630-+))++-027;;:54?OTSTTNGDEEHVfhhlttpkb\YTMGEJPMLJIGGHIHJLLLMNNOMKKKJJJJJJIHHIJMLKKLLLKKJIJKMNMLLMNNNNNKLMPPONNMKJHECBCCDFFFGGFGGHJLMLKJGDCBBDG71,/17@JHEBBDC?<53018AA><6.-24120/-,,-/001321/.../10.-/100.+&#""!"###%%'''('(*+./148;?ABDEGGFFEEEC?=:89<;<<<:8548:;<>CEEDDDCBBDDFEDDFGFFGHIKNOMLKKJJJKJJJJJLMNOONLKKJJMQSSQNJGEEHJLOOMNOLKKKLLMLNLJJIHIJJLNLJJKLKLLJIHHIJNRSSSTTSSQNJGGGGJJKORROJEABFHGFACDDCB@?AFJJJIGJJMPPQRQPC?:8888669<>@BDDGIKMNNPRSV\afikltz||¦¥¥¦§¨¨¨¨§§¨§¦§¨¨©©¨§§§§¨§§©ª«©§§§§¨¨©©©ª©©ª«««««ªª««ªª«««ª¨©««©«ª©©©©©¨¨¨¨¨§§§§¥¥¦§¨§§¦¦¦§§§§§§¨¨§¨¨©¨¨©©©©©©©ª©©¨¨©ª«ª«¬¬¬«««¬¬¬¬«««««¬¬¬®®®®¯°¯®®¯¯¯¯®¯¯°¯¯¯¯¯®®®®®¯°°¯¯°°¯¯¯¯¯®¯¯¯¯°¯¯¯°±±±±±±±±±±±±°°°®®®¯°°¯¯®®®®®®®®¬®¯¯±±±±±±±±±²²²±±²²³´´´³²±±°±±±²³´µµ¶··¸¹ºº¸¸¹º»»ºº»»»¹¸··········¶¸··¶·¶µ³´´µ´³²²²³³³²±±±±°¯®¯°¯«¬«¨¥¤ {vqmgbb]SIBADEBH\bdkinptwy{~|zzywwvuttsssqooorw{ ¡¡¡ ¢¤¦¨ª««¬¬®°±±±±°°±±²²²³³´´´´´´µµµµµ³²±²³³³³¶´²²³³±°±±³µ¶¶¶··¶µµ´´´´³±±±±°¯°®®®¬««ª¨§¥¢ |utbLIJJKNPRUX[Z[[\[[YYWVTTUWXXWVUSRSRPPONPQQPONNNNPSWZ\[WRNLNPTUUVVVWWYZ[\^acdghikmoonlmnnnmnpngbabcfhiihhhijiifb]\ZYYXXWVVY\^]\XW\dijmmmnmmllkgfhihbZUUV\_`bdeffecba^[Y[_dfdba\UQRUXZZ\\\\^bcddbc_YTI@>>>><<=>>=<:87562/,*((*)*+,155357@JKJLNA67@=3@Zddhpomi\MKIFBAFMMLJIGGHIILOPOONLMKJJKJJJIIIIIJJKKJJJKKKJIIIJJKKKMMMNNNNNMMMOPONOPNLJGDBBCFHHIJJHHGGIJKJJGEDB>85787:ACADHGA<;?B@>-++.8DJJH@3.386531./011213541/../011111110.+'%%%%%&''&''&&'(*,.0148:=?A@EFGGFEEEDB?>=<=>?>>=:8678:=>?CDDEDDCBBCDDDDFGGEDDDFJLNOOONMLKJHEEFGHIJJKMLJIGIMRRSSPLHFEHJLNMKLMKLLKKNPPQPNNLJJKLOPMJIJJJJJJJIJJMPPPOPQQPSTRNJIIJKLLOQQOLFACGJIGDEFFEDA@@EGIJJIKMOPQRSPN>;87654358;>>ACDEFIJKLNPPSW\adhkntxz} ¦¦¦¦§§§§§§¨©¨§§©§¨¨¨§§§¨§§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨©ª«««ªªª««ª««««ª©ª««©ª©¨¨©©©¨¨¨¨§§§§§¥¥¦§§¦¦¦¦¦§§§¨¨¨¨§¦¦§¨¨¨§¨©©©©©ª©©¨¨©ª««««««««¬¬««««¬¬««««««¬¬¬¬¬¯°¯®®®®®®¯¯®®®¯¯¯®¯®®®¯°¯¯°¯®®¯¯¯¯°°¯¯°°°°°°±±±±±±°°±±±°°°¯®®¯¯¯¯®®®®®®®¬®®®®¯°±±±±±±±±²²³³³²³³³³´³³²³³±±²²²³µ¶¶¶··¸¹¹º¸¹¹ººººº½½¼º¹··¸·······¶·µ´´µ´³²³´´´³²²²³³³²±°°±°°°°°°¯¯¬«©¨¦¤ |yutng`]YPGA@BBBDV^ckhnptwy{~}{zywvutssrrrponnptx ¢¤¥§©ª«¬¬«¬®°°°±±±±±±±±²²³´´´µµµµµµµµ³²±±²²²²´²±±±±°¯°±²³´´µ¶¶µ´³³³³³³±±±²±±±¯¯¯®¬««©¨¦£¡ }wsbOLLNQUVWX[\]^^^]\ZYVUTUVWXY[ZXUTTSRPPPRTTSRPONOPSWZ[YUPKJMPSSTUVUUTUVXY\^abcfhjnpqpnoppnmnpoha_`behljihhijjkga\YWVVUUTTUX\`_]ZX\djlmmnnnmmlkhhjlmib_^]]_abceghfcbba_\\_bba_]XQMLORUVWWWX[\]]\XXSNJA>=<<=<=>???>=:87631/,*)*()))+./.,07=>=:9/)-82+<Y_`bihij[FDCDCCGKLLJJHHIJJMPQPPNMMJJJJJJJIIJJJJKKJJIIJJJIFGIJJJKKMMMMNNOOMKKMNOOOPOMKHDAADGJJJLJHJIIJLMJIB:1.1;N]mrwytlc]RLFDGJHE=;9:?GNRQPF=<>=;83002333256520//0112221100.+(&&'*+,--,++)()+/133158;>@CCEEFFEDEECA@@@@@AC@><97788<?@BDDDDCBAABCCCBCCDCA>@ACDFIKMMOONLJGDCCDDDDEFIJJHFIMPPRSPMIGGIJLNLJJKKLLKLNPQQPPPOMLMOQQMIGHIHHIJJJJIMNNLKMNOOPRQPMLLONLLNPPOMIDEHIGEEFFFEDBA@DDFJJJMOOPRTTPJ9:98633258;<>@BCDDEIJKLNMPSVX\bhentuyz|§¦¦¦§§¦¦¥¥¦¨§¥¦§¦§¨¨§§¨©¦§¨¨§¦§¨¨¨¨¨¨¨§§§§§¨©ª«ª©©©««««««««ª«««©©¨§§¨©©¨¨¨¨§§§§§§§¦¦¥¥¦¦¦¦¦§§¨¨¨¨¦¥¥¦§§§¦§¨©©©©ªª©©©ª«««««««««««¬«¬¬¬««««««¬¬¬¬¬¬¬¬¯°¯¬®®®®®¯¬««¬®®®¯®¬®¯¯¯®®®¯¯¯°°¯¯°°±±°°±±±±±±¯¯°°°°°°°°¯°°°¯®°¯¯®®¯¯°®¯¯®¯°±±±±±±±²²²²³³³³³´´´´³³²³´±²³³³´µ·¶····¸¸¹¹¹¹¹ººº»½½½»¹¸¸¸¸¸¸¸¹¸··µ´²²³´³±±±²²±±±±²²²±°¯¯°¯±±±°¯°±«ª¨§¦¥£ ~yutncZURLD@@@@DAQYajhnptwy{~ }{yxwvutsrqqponnmnrt}¡¡ ¤¥¦¨ª««¬¬«¬®¯®¯±±±±±±±±±²³´´´µµµµ´´´´´³²²²³³²²²±±°¯¯¯¯°±²²³´µµ´³²²²²²²±±²³²±²°°°¯®¬«¨¨¦£ ~wraPNNPUZ[[Z\]`aaa_\[YVUUUVXYZ]\[WUUTSPRTUVWWVPPOOPTX\XVRMIIKMPQSTTTSRPQRTVWZ\_bdhlopopqqqnmmopha^_behljhhhiklnha[VUTSRRRRUY]b_^[X\dkmklmmnmmlljjjjllhdb`\\_a`dghgdcccc`]^__]\\XSOLMOQTUVWZ\[XXVRPLHHA>=<=>>?@@AAA?=:96421/+*)&(('(*++./02551,++-,%%:TSY_gefgUDBACDEIMLLLJJJJKMOPPOOOONKJJJJIIJJJJKKKJJJHHIIHFEGJKKKKLLLMMMNNOJIHJLNNOPPOMJECBDHKKKLKHIIJNQSQOKHGJMSanz|uromlke\V[YUQNOTYY_[PIGDC=7113444368731111123331111/,*()*-/1221.----15899479;>ADDEEDDDDDECBACDCCDD@>;85688>BCDGFDA?>>@ABBDB?>>=<:?@@ABDGJJMPOMJGDBBCCBABCCHKJIJMMOPRPMJIIJKNNLIHJKMNLLNPPPPPPONMNPRRMHFGHGHIKMMJIJJJJJKLLJKLMNPQSQNKKKLMNJHFGIIHGDDDDDDCB?BCDIJKNPPQTWVPJ79:9633468<=>@BCDCDHJJKMNOPNNPW\]hpstvy}¨¨§¥¥¦¦¥§§¨¨¨§¦¥§¦¦¦¦¦§§¦¦¦¦¦¦¦¥¨¨¨¨¨¨¨¨¨¨¨©ª«ª©©©©ªªª««ª«««««««ª¨ªª¨¨©¦©¨§¦§§§§§¦¦¦¦§¦¦§§§¦§§§¨¦¦¥¥¥¥¦§§§¨¨©©©©ªªªª©ª««««««««¬¬¬¬««««««ª««©ª«¬¬¬¬¬¬¬««««¬¬¯¬¬®®®®®®¯°°¯¯¯®¯¯¯°°¯°±±°¯®®¯¯¯¯°±°¯¯®®¯¯°¯¯®¯°±°°°¯¯®¯°±±²²±±±²³´³´µ¶¶µ´´´³²±±²³´µµ´³´µ¶····¸¸¹¹º¹¹º»»¼¼¼½¼»º¹¹¹¹¹¸¸··¶¶µµ´´³²±±°±±°°°°±±²±±±±±±°°°±±±±°°¬««ª«©¦¥¥¢ zrldZUNF<9><=BBO[]ennotwyz|~ ~}~~~~|zyxuttssrqppnnnnnoqw ¢¥§©«¬¬¬¬®®¯¯¯°±±²²³±±±²²³³´µµ¶¶¶¶µµµ´´³²²±±³²±°¯¯¯¯®®°±³³³¶´³²±±²²³³´³²±±²±±±°¯®¬«©§¥¢ |qfOKKSVZZXX\^_bcba`\WVUUUVY[\]\ZXWVTSPTVXYYXVSSQQUXZZXUQJ@>CFJKNPPNMLIHFEEJPUWX]fmonmrstrnmmnljc]^bdhmpolkjjmong\VUUSPLKRSWceba\Z^hljmmljjkjiijklklmnnnkfba``abcccdcb_]\\]\[ZWVROLKNPTSSTVVVVVSOLJIFDCB@?@ABBDDEEDC?>98641-++**))))**,---0221.**%'#8PPPSYabUE?ABCEJLLLLKJJJLMQPPPPPOMLKJJJJJJJJJJJJIIFHJJJIHHFIMPPMKLLNKJOPKHIHGHKPRRSPNJEDDCJOUWUQPPNLLOQRST^afnx|vzz{{tqnhbaba\YVVWXZZWSPPPNMG>88887865542233444444442/,++,.568873/,.-1469=<99:=@DEFGFFFEDDFCACDCDFFC@><889=?ADEFFDC><:9=ADDDB><:988<>?@@BDFIKNOMLJHFEDCBCDFGIJIGGJKLNOOMJJIJLPPOLJHJLMKKNONNNOOPOOORRRPNLKJJKMOPOMLJJJJJJIHIJJJKMPRPNJHGIJJHIJJIFDCB@ADEIHBBCABFHJPPVVX\\YM7,28::6:9;===>BDEFGHHIJJNNNOPQUV_flnnrx|}} ¨¨¨¦¥¦§¦¥¥¦§§§¦¦¦¦¥¥¦¦¦¦§§§§§§¦¥§§¨¨¨¨§§©©©ª««««««ªªªªªªª«««ªª««ª¨ª«¨©ª¨¨§¦¦§§§§¦¦¥¦¦§¦¦§§¦¦¦§§§§¦¦¦¦¦§§§§¨¨©©©©©©©©©©ªªªªªªªª«¬¬«««ªª©©ª©ª««©ª¬««¬¬¬¬¬¬¬¬««¬¬¬¬«¬«¬¬®®®®®¯¯¯¯®®®®¯¯°°°°±±°¯®¯¯¯¯¯¯°°°°°°°±±±±°±±±±±±±°°°±±±²²²²²³´´³´´´´´´´´³²±±²´µµµ´´´µ·····¸¸¹¹ºººº»»»»»¼¼»º¹¹¹¹¹¸¸···¶¶µµ´³²±±±±°°°°°±±²±±±±±±±±±±±±°¯¯¬«««ª¨¦¥£~wpkcZTLE;898:=@P]_dlknquwz| ~}}}}}|zzyuttsrqpoponnnnnpv ¢¤¦¨ª«¬¬¬®®®¯¯°°±±±²²±±±²²³³´µµ¶¶¶¶¶µµ´´³²²±±²²±±°¯¯¯¯±²³³µ´³³²²²±²²³²²±²²²²±±°®¬«©¦¥¤¢}sfMIJNQSSQSW[_bba`_\WVUUUVXZ[\[YXWVUSTW[\\\[YVVUUW[\\VQKD=<>@DEGIJIHGAA@@ADJNQSZcikmnrtupifhknme_`bfiotsnmkjlooj`WUSRQMLPQWegfd`]`gmnnnljijjhhhjkmnopnonhb]\\_abaaba`\[Z[[ZXXVTQNLLNPSRRSTUTRRPMJIGFFEDCBCDDDFFGGFDA>;98741../..-++*)++,,-//.+%%"%"3GJJKQWWL@>>@BEJLKNLKKLNOOPPPPPPNLKJJJJJJKKLLKKJJJHIJJJIHHFKPPNKJKLPNIGEDGEGHIKMLJNQXZWX]`^`a^\[]ahdbbfjot| ~yz{~zspnhecb`][XXXY[ZXUSRRPSOIDBA>;86555457666544454321//01578984.*+,157;>>;<>@CDEEFFFGEDDEDBDGFEDA>=;988:=@CEFFFED><88;@CCCB?<:8779;>@ACEGJLMLKJHFFEDCCDHJJKKJGEFGKLMMLJIIJLNOMJHFGJJHHJKJKLMNNOONPPPPNLKKLNPPPOLJKJIHIIJIJJJJJJMOKJFDCDDDDFGHGDB@>>ADFIJEBBABEHJPQVW\bhjdG639<9578:=?ACDDDEFGGHIJMNNNOPRTRUXZ_gnty} §¨§¦¥§§¦¥¦¦§§§§§¥¦¦¦¦¦¦¦¨§§§§§¦¥¦§§¨¨§§¦¨©ªªªª«««ªªªªª«««««ªªªª««©ªª¨©ª¨¨§¦¥¦¦¦¦¦¥¥¥¦§¦¦¦¦¦¦¦§§§¦¦¦¦§§§§§§¨¨©©©©¨¨©©¨¨©ª¨©©©¨©ª«¬««©©¨©©ª©©ª©¨©«¬¬¬¬¬¬¬¬«««¬¬««««¬¬¬¬¬¬¬¬««¬«««¬¬¬¬®®®®®®®®¯®®®®®¯¯°°°°°°°¯¯°°°¯¯°°±±±±²²²±²²±²²³²²±±±±±±±±²²²³³´´´´³³³³³´´³³²±²³´µµµµµ¶···¸¸¸¸¸¹¹ººº»»»»ºº¼»ºº¹¹¹¹¸¸····¶¶µ´³²±±±±°°°¯°°±±±±±±±±±±±±°°¯¯®®®¬««««ª¨¦¥¡{tnkd\TIB:77488?P\^bhimptvy| ~}||{{zzyyttssrqpoonnnnmnnt£¤¦¨ª«¬®®®¯¯°°°±±±±²±±±²²³´´µµ¶¶¶¶¶¶´´´³²²±±±±±°¯¯®®¬¬¬®°±²³³´´´³²²±±²³³³³³´³³²±°¯«ª§¦¥¤ ~tgLGIJJKKKNSX^aa`_^[VUUTUVWXXXWWWWVUTV[_`_^\[YYXWZ\]\WPD>::;:==>@BBA?;;;;=@EIJMV`ddhnruunb[\aba\Y\`cgsvuroliklnlcZTRRQOLOPYhihgcaaekoonmkjkjhiiilnqqqnoolbZWZ\]^^]]]\[YXYZYWVTSPNLMOPRQQQRRPPNMJIHHIIIHGFFGGGHHHHGDB@><;:85332110.,*)*+----,++%"!%#.<BBDILJC<=>?CGKLLLJIJLOONPOOPPOMKJJJJJJKMMLLKKJJJIJJJIHHHJNPOLLLLIIGGIFCD=>@CHOTVUYbilrz|ztopuzzwttw||}~ }wronjhhba_]\\[[\[XVVVVTVSOKIEA=9876778:9997545778987556888873-)++157:????@BDDEFEEEFEDDEFDEGFDB<:88888;>ADFEDDDC>;879>@ABA?>;9888:=?BDFHKLMKJHGEDCA@@DHJJJJGDAABHIJJJJJJKLMLJHEDDFFDDFGFIJKLMNNNNNNMKJJJMOPQPNKJJIGEFGHIHIIHGGIJHECA@@@@ACEFEC?=<>BEFIJFAB@ADFIOSWYbmuiUEFC88:99;>@BBADEEFGHIJMMMMNNPPPQTX_gkmszz}} ~|~¥¦¦¥¥¦§¦¨¨¨§§§§§¦§§¨¨¨§§§¦¦¦¦¦¥¥¥¦§¨¨§¦¥¦¨©©©©ª«©©©ª«««¬«««ªªª«««¨©©§§©§§¦¥¥¥¥¥¥¥¥¥¥¦§¦¦¦¦¦¦¦¦¦§¥¥¦¦¦¦¦¦§§§¨¨©©©¨¨©©¨¨©©¨¨©©¨©ªª««ª©©©©ªª©©©©¨©«««««««««ªª«««¬¬¬«««««¬¬¬««¬¬¬¬«««¬¬¬¬¬¬¬®®®®®®®¯¯¯¯¯¯¯¯°°°°°°°¯°°±±±±±±²²³³³³³³³³²³³´´³²²³³³²²±±²³³³³³³³³²²²³³³²²²²³´µµµ¶······¸¸¸¸¸¹¹¹ººº»»ººº»ºº¹¹¹¹¹¸···¶µµ´´³±±°°°°°°¯¯°°±±±±°°±±°°°°¯¯®®®®®¬««««ª©§¦¢ztomg_TF>986289@NY\ahimptuw{ ~~}{{zzyxxxuttssrqpnmmmmkklt ¤¥§©««®®®®¯¯¯¯°°±±±±±±±±±²²³´´µµ¶¶¶¶¶¶´´´³²²±±¯¯¯®®¬««¬¯±±²³´´´³²²²³³´´´´µµ´´³±±¯®¬«©§¥¤ }tgLGJHGGGHKRX]__^]]ZVUTSSUVUUTSSTUVVVV\`a`^\[ZZYZ\^_^[P@89:98888:==<:8878:>DFHJR\_^bjnong\UUVVWVV\adhsxxtqlhhfhhc\URQONLOP\lmjhgeddhnnnnmmnljjhhkorrpponlbXUWXZ\\[[\\[YXZ[ZXXTSPONOOPPPOPPPOMKJHHIKLMLKJIIHHHHHIIHECB?>>><98865420.-,,.00/.-++%""%$)3>>?CDB>=>>AEJMMLIHGIKMNMNNOOONKJHIJJIJKNMLKJJJIIHHIIIHHHJMMJJMMKMIBAC?=>?GR\djllnlow{xx| zvrpnmkkdba_^^^]][YXXYYWVUROKHD?>=:9:;=>>>=96578:=>><988:8751/+**+/238=>A@>>>@CDDDDDDDEGGDDC@?>9755689=@BDFDCA@?><988:>AAA@>>>>>;<=>@CFIJKLJIHFDB@><=@EIHGEB?>>>CDGJJKKKJKKKJGDBBDDBBDEEHIJKLLMMKKKJJIIIJLNPPOLJIHFDDEFFEFGFEDEGFEDCBBAA@BDDDB>=>>BDDFGDBDCCEEGLPSVcozs^YI59>=<;;=>>?DEFFGHJKLMMMNNNNPQTY_egenttxzz|{~¥¥¥¥¥¦¦¦¨¨¨¨§§§§§§¨¨¨¨¨§§¦¦¦¦¦¥¥¥¦§¨¨§¦¥¦¨©©©©ª«©©©ª«««¬«««ªªªªª«©©©§§©§¦¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¦¥¥¥¥¦¦¦¥¥¦¦§¦¦¥§§§§¨¨¨©¨©©©©©©ª¨©©©©©ªª«ªª©©©ª«ª©©©©¨ª«««««««««ªª««««¬¬¬¬«««««««««¬¬¬¬¬¬¬®®®®®®®¯¯¯¯¯°°°¯°°°°°¯¯¯°±±±±²³²³´´´´³³²²²³´´´´²³³³³³²±±²²³³³²²±²²³³³²²²²²²³´µ¶···¸¹¹¹¸¸¸¸¸¸¸¹¹¹¹ºººººº¹¹¹¸¸¸¸¸¸··¶µ´³³³²±°°¯°°°°°¯°°±±±±±°°°¯®¯®®®®®¯¯®««««««¨¦£ ztpjbVD;88516:BMV\bgilostwz ~~}}||zzyxwwutttssrqnmllkjiiq|¡£¥§©ª«¬®®®¯¯¯°°±±±±±±±±±²²²²³´´µµµ¶¶¶¶¶´´³³²±±±®®®®¬¬«««¬¯±²´´´³²²³´´´´´´µ´´´´³²±°®¬¬«¨¥£¡¡ |sgLGIGEDEGKSY\\]\\\XTSRPPQRQPPOOPRUVWX\aba`]\ZZ[\^ab`]Q>48:8776679:9876569>CEJJPX[Y\bbbb_[VTSQQPQY^bgrxzvrlecbbba\VQPKKLPR^nonljihhikkmnnpqnlgefinrsqrnmibYVVWXZ[[[\]\ZY[\[ZZVTQPPPPOMLKKLMLKKIFGJNPPNMLJIHGGGHIJIGEDB@@@?>==<:863222124321/-)'""#"$+::<>>>>??@CGKMLKHHJJKLMNLLMMMLJIGHIIHIJMMKJIIHHGFGGHIJJJIIHHJLJFEB;88=EQadhmqw|~|wv| }yvtrqnmmheb`____]\ZZ[\[ZYYWSPMJHEDB??@AAAA?<878::=??>;:99872.+++**-005;>?>;8779<?@BDDBAAA@?=999665578;>BDFGEB@>===<988=BBBA@?@BDA?=<=@DHGIJJIIFDB@=;<?DIHFD@>>>?CDFJKLKKIJJKKIDABCDCCDEEGIJKKKKLJJJIHHHIIJMOPOMLJIIHGFFFFGHGEDDDFEDDDDDDBCDDDB@?A@BCCEFCDGGGHFGKTVZiv}tnZA>>=====>?@DDEFGIJKLLMNNOONOPQSW]`ahnnsww}}|wx ¥¦¦¥¥§§¦¥¦¦§§¨¨¨§§§§¨¨§§¨§§§¨¨§¦¦¦§§§§¦¦§¨©ªªªª««ªªªªª««««ªªª©©¨«©ªª¨¨ª¨§¦¥¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¥¥¥¥¦¦¥¦¦§§§¦¦¦¦¦¦§§¨¨¨©ªª©©©ª¨©©©©©©ª¨¨¨¨¨©©©©©©¨¨©©ª««««««««ª««««¬¬¬¬«««««««««¬¬¬¬¬¬®®®®®®®®®¯¯¯°°°°°¯¯°°°¯¯°¯°±±±²³´´´´´´´´³²²²²´´´´³³³³³³²²²²²²²±±±±±±²²²±±±²²³´µ¶¶·¸¹¹ºº¹¹¸¸¸¸¸¸¹¹¹¹¹ººººº¸¸¸¸·······¶µ´³²³²±±°°°°°°°°°±±±²±±±±°¯®®®®®¯¯®®¬¬««««¨¦¤¢¡{unfXF:66403;DPX_cfhknrtw{ ~}}||}|{zzxxwuttttsrqonmlkihiny¡£¤¥§©ª«¬®®¯¯°°±±±±±²²²²²²²²²³³´´µµµ¶¶¶¶¶´´³³²±±±¯¯¯®¬¬««««¬®°±³´´³²²³´´´³³´´³³´³³²±°®®¬¬«¨¥£¢£}sgNGEECCEHLRX[\\\\[VPPNLLNNNMKKLNQTVWY\`bba_\Z[\]accb]Q=27856655689999889>BEGLLOTVVWZ\ZYYXVSPKJGJQY^dnuywskb_`^]\ZSNKHHJPT^oqponmkjihikmorspldcdhnstrpmigb\YYYYZ\^^_`\[Z\\\ZZVURQQPOMIHFFHIIIJGDEHLNONNLJIGFFGIJJJHFFDCBCB@@@@>;876777775431.))$$!"")56889:<>?@DHJJJJHJKLLLKLJJJKKKJJIIIHGHJKLKJJJIHGGGHIJJJJGFEFIJIH<;9>JWcnv{ {z||zyywutrpnnigcba``_^\\\]\\\\\[WTRQPMLJHGHGEDDD@=;;<;=>?>>==8873/,+++*+./4;=>=:7211258<?>:6488;:788486689;>ADFHFDB@>=>><98<ACCCBAACDDA>;<>CEDEFGHHGDB?<:;>DIJIFDDCCDEFGIJJJJGGIKLJEBCDDDDDEEFHJJJJJJJJJJIIJJKLNOONMKJKKKJJIIJJKJHEDDEDDDDDDDCCCCCCBBA@ACCEGDDHIIIFGK[^cs~qZH::<>???@ACDEFGIJKLLLMOOOONPSTVWYXcjjotv{~{zzwz¥¦¦¥¥§§¦¥¥¦¨¨¨¨§§§§§§¨¨¨¨¨¨¨©©©¨§§§§§§§§¨¨¨©ª«ªª««ªªªªªª«ªªªª©¨§©§©ª©©«©¨§¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¥¥¦¦¦¦¦¦¦¦¦¦¦§§¨§¨©©©¨¨©¨¨©©¨¨¨©§§¨¨¨¨¨¨¨¨¨¨¨¨¨¨ªªªªªªªªªª««««««««««««««««¬¬¬«¬¬¬¬¬¬«¬®®®®¯®¯¯°°°°°¯¯°°¯¯¯°°±±²²³´µµµ´´´´´´´³³³´´³³³³³³³³³³³²²²±±±±±±±±±±±±±±²³µ¶¶·¸¸¹¹º¹¹¹¸¸¸¸¸¸¹¹¹¹ºººº¹¹········¶¶µ´´³²²²²±±±°°°°°°°°±±²±±±°°°¯®®®®¯®®®®¬«««ª¨§¥¤£¢ |tlXH=64315<GRZ`cgikostwz ~}||||{{zzyxwwttsssrqponlkjhhhkt~£¥¥¦¨ª««¬®®¯¯°±±±±±²²³³³²²²²²³³´´µµµµµµµµ´´³³²±±±°°¯®¬¬¬«««««¬¯±±³´´²²³´´³³³³´³²³³²±±¯®®¬««©¦¥££tkSJDDCCFJMSX[\\[[YSMJIGGJKKJJJKNQSUVVY\]__\ZWY[]accb\S>38847555689;<>==?DGIJKLNPRUUUWVUTTROLKIFIPV[aenttrjb]^[YYUNIGEEHPT]nrrsqnlljhhjlnqrnkeccfknnlihfdbb`_]\\_bbbb_]\\\\ZYVTRQQPNLGECCDFFFGFDCDFJLMMLJIGFFGIJJIGFFDCCDDBABA@><;;;<<;86541.*+$$!%$)034348:;@ADIJIIJJJKMMLJHFGHIJJKKKJJIHHJJKJJJJJJHHIIJJJIGEDCBACJRRSS\kvzz}}|zyyyxvtrpookhfdcbb`_^_``^]]\]^\XVUSRRPPPPNKHHGDB?>>>>>>>???<96310/.-+.016;;<<950--..16:951.35899=>998789;>?@CEEEDB?=>>><:<?BCDDCCCDDB?>?ADEBDDEFHGFC@=::>CGKJJJJJHGHFEDEFGGFFGJKJFCDDEFEDDDDFIJIIIJJJJJJJKMMNOONMLKJJLLKJJJLMNMJHGGEDDCBBA@AAABBBBA@ADDDFHFEIJIIHJO[ahvtZD>>?@AAA@BDEGHJJKLKLMNOONLPSTTSRP\ehnttz}}~ ¥¥¥¥¥¦¦¥¦§¨©©¨§§©¨¨¨¨¨©©¨¨¨©©ª©¨§§§§§§§§¨§§¨ªªª©©©©ªªª«««««««ª¨§¦¥¨ª©ª«©©¨¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦§§¦§¨¨¨§¨¨§§¨¨§§¨¨¨¨¨©©¨§§¦§§§§¨§§©©©©©©©©©©ªªªªªª«««ª«««««¬¬«««¬«¬¬«««¬®¬®¯¯®®¯¯°°°¯®¯°°¯¯¯°±²³´´´µ¶¶µ´´³³´´µµ´´´´³²´´³³³³´´³³²²±±±±±°¯¯¯°±±±±²´µ¶··¹¹¹¹¹¹¹¹¸¸¸¸¸¸¹¹ººººº¹¹¸········³³³²²²±±±±±±±°¯¯±°°°±±±²±°¯¯°¯¯®®¯¯¯®¬¬¬««ª©©©¨¦¥¤£¢ yqWJ?74428=JU[`chmmptuwz} ~~}|{{{zzzyxwvutssrrqpponkjhgghir{ ¡¥§§¨ª«««¬®®¯°°±±±±±²³³³³³²²²²³³´µµµµµµµµ´´´³²²±±±°¯®¬¬¬¬««««««®°±²´´³²²³´³³³´´´³³²²±±¯®®¬«ª©¨¦¤¡woYNDDCDILPTY\\\[ZWQJFDCDGIJJHJKOQSTSRTVX[\YVVVY[^aa_\UB7:95845678:=>>>@DGJJJJKMNPSTSRRRQPNMMJIFIOQRV\gnrqjb^[XVVQJEEEDFPS\nstwupmnmjijlnopnifcbbdecbbcdcceffa^^addddb_^^]\ZYUSQQQPNKFDBBCDEFEEDA?@DIKLKJIGGGGHJIHFEDCCCCCBABAA@@@@AA@>97651-*+## %%).1212898@BEIJIIJKKLNOMJFDDFHJJLMMLJIIIIJIIIJKKJJIIJJJIFDC@>:7:K\inqt} ~zzz{zyvtqpppljhggecb``abb_]^\`b_\YWVUVUTUUSPJJJHEC@?@>=<>>>>@;5113211/1237:9:961+*+.-04885213479=BD?;8889:<><>ADDDC?>>>>><<>@CEEDDDDBBBBCDEFCDDDFHIHEC?<;>BEJJKLNMKJGDB@ACEFEEEHJJFCDDFFEDCCCDGIHHHIJJJJJJLNNNNNMLKJHIJJJJJKLNONLJIIFEDBA@>>>??@AA@@@BFGDFIHGJKJKJNU]fo{t`HECBCCB@BDFHJJKLLKKLMNNMNPPPQSVVWbhnssx|z~ ¥¦¦¦¦¨©¨§§§¨©©§¦¨¨¨¨¨¨©©¨§¦¦§©ªªª©¨§§§§§§§§¨¨©©©©¨¨ªª©ª«««««ªª©©¨¨¨¨©©ªª©¨¨§¦¦¦¦¦¥¥¥¥¥¥¤¥¥¥¥¥¥¥¥¦¥¥¥¥¥¥¥¥¥¥¥¥¥¦§¥¥¦¦¦¦¦¦§¨¨¨¨¨§§¨§§§¨¨§¦¦¦¨¨§§§§©§§¨©¨¨¨©©©ªªªª«ªª«««««««««««ªªª««««««««¬¬¬®®®®®®®®¯¯¯¯¯¯°°°°±±²³´´´µ··¶µµ´´´µµµµµµ´³³³³´´³³´´³²±±±±±±¯°¯®¯¯±²´¶¶¶······¸¸·µ···¸¸¸¹»ºººº¹¹¸¸·····¶¶¶µ´³³³³²±±±±±±±±±²²²±±±°°¯¯¯¯®®®®®®®®¬¬«ª©©©¨§¨§¦¥¥¥¤£zsYGD.236:<IZa`chjortvxz} }|{{zzyxxxwwvvutsrqqrrpnmljjihghhqt¡£¦©©©ª««¬¬¬®®¯°°±±±²²²²²²²²´³²²³³³³´´´µµ´³³²±±±±±±°¯¯¯®¬«««««««¬®±±²³´´´³´´´´´´´´²²±±±°®¬«ª¨§¦¤¢¡ ~sbQEFEFJNQUWZ\\ZWTPKGEDDEHIHHIKNPQPPPPQSUUUVTVWY[\\[XPJ?::665348<>?BDDGIJLNOLNOOPTVWWVSOLKJIIHGIKOPQZ^eknhaZWVTTPIDDDCHJP[fsxvttsrpnmjhhkljhgfdba__`_`behjihbbbbccbbbbb`^\YWTSRRRPLIGGFEEEFHEDA>>@DGJJJJJIIHHHGFDDDEDDCCCCCCBAABDDEEDB>;83-*)'%$#$&*-/0148<>BDGIIIJKKLLLKJIHFGGGJMONNMLKJJIIHHHJKMMLJMHJJABB<8>Qds|~ }zzzyzywvtrpnnmihhfcabcdedcb`aaa_\ZZZ[ZYY[\XTOMKJIGDCC@=;=@CDGB;656773113578:7872.---.1577555876<DJGAB><<==<=>>?BDEDA?>>>>>>=?ADFGFDCCBCDDEEECCCDDFHJGEB>=?CDHLKKNNLLJD?>@BDFEEEFGGEDDDEGGDDDCDDFHIIIJKKKKLNPPMLLLKKLGHIIIIJJLJJJJIJKIIGDCAAABBAA@@??DJOLJIJIJKKNPMTcdittp[NB>HFDFDDGKMLKLKJKMMMLKPPPSTRQ\dnttuz~ §¨¨§§¨¨§¨§§¨©©¨§¦¦¦¦¦¦¦¥¨§¦¦§©©ªª©¨§§§§§§§§¨¨¨¨¨¨§¨©ª©©««««««ªª©©©©©©©©©§§¦¦¥¥¦¦§¦¥¥¥¥¤¤¥¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¥¦¦§§¨¨¨¨§§¨§¦¦§§¦¥¦§§§§§§¨©§¦¨¨¨§¨©©©ªªªªªªª««««««««««ªªªª««««««««¬««¬®®¯¯°°°±±±±±´´µµµ¶···¶µµµµ¶¶µ´³´´µ´³³´´³³´µ³³±±±±±±°±¯®®¯¯¯±²´µµµ¶··¶µ¶···¶···¸¸¸¸¹ºººº¹¹¸¸······¶¶µ´³³³²±±²²±±±±±±±±±±°°°°¯¯¯¯®®®®®®¯¯¯®®¬«ª©©©¨¨©¨§¦¦¥¥¤ zr\J@,-559;K\cdehlprtwyz} ~}|{zzyxyxwwwvutsrqqrqpomkjihffffns¡¤¦¨©ª«««¬¬¬®®¯°±±±±²²²²²²²²³³²²³³³³³´µµµ´³²±±±±±±±±®®¬¬«««««««¬®°±±±²²²²³´´´´´´³±±±±±°®¬«©¨§¦¥£ tcRFGFGJNQTVY[[XVRNJGEDEGIJJHJKNPPPOMLMPPPPRSTVVWYYWVPJ@;:677679=?BDHJKLMMNNLOPQTVYYYWSNJJJILKJJLOPQVW\aec^YVSRQOIDBEDHJPYcpvvuttrppljgefghhhgeb_\\\\\`dhihhddddcba`abbb_\XVUTSRRPMJIHGHIJIIFDA>=>BDIIJJJIGFDDDDDCDDDDCCCCCBA@@ACEEEDB>;83.+'%$##%(+./1258<>ADGJJKLMMMMMLJJIGHHHJMONONNNMLKJGGHJJKKKKLHNOD>9@EWnz~~ ~zzzzzzwutsqpnmkigecbbcdeedbbbbb`]\\\\\\\\\\YSRPMJGEDBA@??BDFFB<8678842134689899632212478887788:>DIHEEA>===>>>>>@CDCA@?>==<;:9:>ADEEDBAAAABAAABBCDDEGGGECACDDGJJJLMKKGC?ADEFGEEEFIIHGFEEFFDDDABDEGHIIMNOPOOOONKJJIHHIFEEEFGHIJIJJJIHIJJIGDCBABBBBBCDDILPPNKJLHKMMMNWckpytbM@EGGDEIJIHJNLLLMMMLKNMLPRPS[gnwxttz§¨©¨¨©¨§¨§§§¨¨¨¨§§§§§¦¥¥§§¦¦§¨©©©©¨§§§§§§§§§§¨¨¨¨§§¨©¨©ª«««««ªª©©©©©©¨¨¨¦¦¥¥¥¥¦¦¦¥¥¥¥¥¤¤££¤¤¥¥¥¤¥¤¥¦¥¥£¤¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¦¦¦§§§§§§¨§¦¦¦¦¥¥¦§§§¦§§¨¨§¦§¨§§§©©©©©ªªªªªª««««ª««««ª©©ª««ª«««¬¬««¬¬¬®®¯¯±±±±²²³³¶¶·¶¶¶····¶¶µ¶¶¶¶´²²´µ´³³´´³´µµ´³²±±±±±±±°®®®¯¯°±²³´´´µ·µ´´´¶··¶···¹¹¸·¸ººººº¹¸¸¸¸¸·····¶µ´³³²±±²²²²±±±±°°°°°°°°°¯¯¯¯®®®®®¯¯®®®¬«ª©©©©©©©§§¦¦¥¥zq`SG71823?Q_dgghnpsuwy{~ ~|{zzyxxxwwvvttrrrqqppoljihhededlp|¢¥¦§ªª««««¬¬®®¯°±±±±±±²³³²±±³²²²³³³³³´µ¶µ´³²±±°°±±±°¬¬¬¬¬«««««¬¯°°°±±²²³³´´´´³³±±±±±°®«ª¨§§§¥¥ tdSHHGHKOQSUWYYVTPMJHGFGIJKJJJLOPPOMLKKMNNOPQSSTVVVVSOKB;:7899:;>CFGKLNONMMLLPSUWZ[[[YTNJJKMQPONOPQRVVVZ^`]ZWTQQPJECDBFHLU]inqtvtrpokiheddghhihd_\[ZY[^chihgfeedcb`^`abb`\XVTSRQPNKIIIIJMNLJHEB>=>@CFHIJJIHGDDDDCCCDDDDDDDCC?>>?BDDDB@>:72.+&%##$%)-/01369<>?CFIJKLMNNNMLKJJIIHHJLNNOOOPONLJGGIIJJJKLMJLJDHO\bs {z{||zxutsqqnnmjheddcdeefeeddcb`_^]]^``_^___VVTPLJHHCCCBABDFDA>:8889754567898:;9877688:;;:997:>ADGIHEA>;;;=>??>?ABCC?>=;:988557;@DDD@?>>>==<>?ABCDEFIJJJHGFEHJJIJJHIECBDHIHGFDDFIJJIGGGHGDCC@BDEGIJJLMPPPOMMKJHHHFFFFDDCDEFGJJJKJFDCEFGGFDDDBBBBCEGHKKNQPKJMJJMNNVbiuzs\IIIEGFGGHHJKLMNNNLKKNMLPTV\hswzzwx~¥§¨§¨©©§§§¦¦¦§§¨¨¨¨¨¨§§¦§§¦¦§¨¨¨©©¨§§§§§§§§§¨¨¨¨§§§¨¨¨©©ªª««ªªª©ªªª©©¨§§§¦¦¦¦¦¦¦¥¤¤¤¥¥¤¤££¤¥¥¥¤¤£¤¥¦¦¤££¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦§§§§§¦¦¦¥¥¥¥§§§¦¦¦§¨¨¦¦§¨§§§¨¨¨©©©©©©©ªª««ªª««««ªªªª««ª«««¬¬¬¬®®¯°±±±±²³´´µ··········¶¶¶¶¶¶¶´²²³´´´³´´´´´µ´³²±±±±±±±°®®¯¯¯±²³³²³´¶¶µ´´µ¶····¸ºº¸·¸ººººº¹¸¸¸¸¸¸·····¶µµ´´³²²²²±±±±±°°°°°±±±±±°°¯®®®®®¬«©¨©©ªªª©¨§§¦¥¥ {snaQ;388;K[bbghhqqsuxz| ~|{zzyxwvvuuttsrrrqpooolkiihedddjnx ¢¤¥§©ªª««¬¬¬®¯°±±±±±±²³²²±±²²²³³³³³³´¶¶¶´³±±±°°°°¯¯¬¬¬¬¬««¬¬¬®°¯¯°±±²²³³´´´´³³±±±±°¯®¬«©¨§§¦¥¥ ufUJJIJMPQRTVWWVROLJJJJJJKLLJKNPPPNLLKKLMNOPQRSTVWWVSPNC;:8:;>>>AHKLMNOONLKJKPTWZ\\[ZYUPMNPSVUTSSTUVZXXZ\^]\ZWUSPLHGDBEFJPVadhotusonhhhgfefgghifa]\\Z[]adfedcccbba_]^__^\YVTSSRQPLIFHHJLOPNLJHD?=>?@DEFGHHHHEDDBAABCDDCDDDCB?>>>?AA@>=:851-+(&$$%&*-11358:=>@CEHJJJKMMMLLLKKJJIIJKMNNNNNNMKJHIIJJJJJJNNJDE[tzz }{|}|zwtrqpponmkhgeddeeeffffdb`___^^`bbbbccb\\ZWSPMLGFEDCBCDCB@>;9:<;:99:;<=9::987769:;;:9998=@BCDFFC>;889;>B@?>>@AB?>><;:988668=@A@>=;::::::>@CDFHIJLNMLJIGJLJHHFDDEEFHIIGFGEDEHJJIGIJKJGDBCDDGHJJJIJLNNMKJJHGIJIHHGFFDDDEGHGGHFDA@@BDDDDEFDCBABDFHIIKOOLKMNJLPR]lr}xd[O?GEEFHIJJKMOONMLLKPPPWbinvvvx{ ¥¦§§§©©§§§¦¦¦¦§¨¦¦§§§§¦¦§§¦§¨¨¨§¨¨¨§§§§§¦§§¨¨©©©¨¨¨¨¨©©©ªªªªªª©©©ªªª©¨§¦§§¦¦¥¥¥¥¥¤¤£¤¤£¢£¤¥¥¥¥¤££¤¥¦¥£¢¢¤££££¤¥¥¤¥¥¥¥¥¥¥¥¥¥¥¥¦¦§¥¥¥¥¥¥¦¦¦¦¦¦¥¦§¨§¦¦§§¦¦§¨¨¨¨¨©©©©©ªªªªªª«««««ª««««««««¬¬¬¬¬¬®¯°±±±²²³´µ¶¶·¸¸·······¶¶¶µµ¶µµ´³±±³´´³´´´´´´³²±°°±±±°¯®¯¯±±²²±²³µ·¶µ´µ¶····¸ºº¹¸¹ºººº¹¹¸¸¸¸¸······¶µµµµ´³²±±±±±°°°±±±±±±²²±±±¯®®¬«©©©ªªª©¨§§§¦¥¥ yvnhRKDIJVbcbhjjqrtvxz} ~|zzyxwvuuuuttsrrqqoonomkjihfdedhmt¡¢¢£¥¨¨©ª««¬®®°±±±±±±²²²±±±²²²³³³³³³´¶¶¶µ³²±±°°°¯®¬«««««¬¬¬®®®®¯¯¯¯°±±²³³³³³³³³²±±±°¯««ª¨§¦¥¥¥ wgVKMLMPQRRSTUUTPNKJLLLLLLLMLMOPQPOMLJJLMMOPRRSSUWXWUSPD;;:=>?AADKPQPPPPNLJJKPUX[\\ZXWVSQRUW[[ZYWWXY\\\]]]]\]\ZVQMJJGDGGJOS\]agmppnkgffffeedchjgb_]]\[[\^_`_^^^^_^]\\\[YWVTSTTTSQMHDEGJMOPOOLJEA>>??AAABCDDEDCA?>>?A@@@ABA@??>>====<:98520-,+(&&')+.11368:<=@BDFHIJJJJJJJKKKJJJIJJLNNMKKJJJIIIIIHHHIJKMJHPg ~}{zwtsqppopnljihfdddcccdeedb`_```_bccefhfdfeb`\WSPPMJHFDDDCDCA>;<=>>=>>?>>:986555578;:8778:=???ABB?<8778;>A?><;<>>AA@?>>>>=;9:=>>><;999:;;:>CDFIJJJKLMLJJJJLJGFDACEGJJHGGGHFEEFGGFHJLMLJFDDEFHIJJJGHIJJJIHEDEIKKJJHIJIEDDE@>>>@@@BACDDDDFHGECAABDDFILMOQPOQKNRR[kv~}p]D=BFHFFILJKNONNNNLPRV`jnorstz ¦§¨§§¨¨§¨¨§§§§¨©¦¦¦¦¦¦¦¦§§¦§§¨§¦¨¨¨§§§§¦§§§¨¨©©©¨©©¨¨©©©©©©ª©©©©¨©ªª©¨§¦§¦¦¥¥¥¥¥¥¥¤¤££¢¡¤¤¥¥¤¤¤¤¤¤¥¥¥£¢£¤£¢¢¢£¥¥¤¤¥¤¤¤¥¥¤¤¤¥¥¥¥¦¥¥¥¥¥¥¦¦¥¦¦¦¥¥¦§¦¦¦§§¥¦§§§§¨¨¨¨¨¨©©ªªªªªª««««««««««««««¬««««¬¬¬«¬¬¬®°±±²²³´µ¶¶···········¶¶¶µµµ´µµ³±±²´´³³´´³³´²±±±°°°°°®¬®®°±±²±±²´·¶µµµ¶····¸ºº¹¸¹¹¹¹¹¸¸··¸·······¶µ´´´´³²±±±°°°¯¯±±±±±²²²²²±±°¯®®®®®®««ª©ªªª©©¨§¦¦¦¥¥¡¡zz~nhUUQ^effknnpstvy{~ }|{zzyxwvvuuuuttrqqpoonnmljjhfeeegko}¢£¢¢¥¨¨©ª««¬¬®¯°°±±±±±±±±°°±±±²²²²³³³µµµ´³²±±°°¯®¬¬««ªªªª¬¬®¯¯¯¯¯¯¯¯°°±±³³³³³³³³³²±±°¯««ª¨§¥¥¥¤¡xhVMPOOPRRRSRRRRPLKKOOPONNNOPPPQQPOMLKKMNOPRSSSSTVWVVVSE==<>?ACEINRTUUSPMKJJMPVY[[ZXVVUUTTVX^_`_\\\]^`bbb```__]YTOMMJGJJKOPW\\_chihgcbbbbbbbagkhc`_^^\ZYZ[[[YXWXXXWVZYXWVVUTUUUUSOIDCEILMNOPLJFC@????>>>?@AB@?>>=>>?>>>?@@>>>>=;988887531/-,+('(*+.011368:<<=>?BDFGHGHIJJJKKKJJIIIJMNLJIIIJJIHGGFFEEJEDESco}} ~}~ }zutsrqqppomjihhebbba``bbcdcbbbbbbcdfgijhfihgfda\ZYUPMJGDDDDDC?=<=>>>>??>=9743445679<<:888<==<=>>><:86568<?>=;99;=@@@@@@AB@>==>?>><:99:;<=>CFGGHHFGGHIIHIJJJIFEB@CDGIHFFFGHHGFEEEEIJKKKKJHFFGHHHHHGFEEEDDDAABFJJJJIJLJGDCD=9889;=>ACEFGHJMJHDB@@BCEJLMPSSPPORUSWhv}{cBCDEFHHGIJKMNOPPSUYblnnqotz~}¦¦¦¥¦§¨¨§¨¨¨§§¨©§§¦¦¦¦¦§¦¦¦¦§§¦¥¨¨§§§§§¦¨¨¨¨¨¨¨¨¨©©¨¨©©¨¨¨©©©©©¨§¨©ª©¨§¦¦¦¦¥¥¥¥¥¦¥¥¤¤¤£¢£¤¤¤££¤¤¥¥¥¥¤¢¢¤£££¢¢¢££££¤¤¤¤¥¥¤¤¤¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¦¥¥¥¦¦¥¥¦§§§§§¨¨¨¨¨©©ªªªª©ª«««««¬«««««««¬«««««¬¬«¯°±²³³³´µ¶¶·····¶¶·····¶¶µµµ´µ´³²²³´´³³´´²²³±±±±°°°°°®¬¬®®®°±²±±²³µµµµµ¶·····¹¹¸·¸¸¸¸¸¸·······¶¶¶¶´³²²±±°¯¯¯¯¯¯®®®°°°±±±±±±±±°°¯¯®¯®®®««ªªªª©©¨¨§¦¦¦¥¥£¡}sj[\\ehkjlnoottwy| ~{zzzzyxvuuuuuuutsqpooonnlkjjhfdeeehky¢£¢£¥¨©ªª««¬¬¬¬¬®¯¯°°±°°¯¯¯¯¯¯°±±±±±±²²³´´³³²±±°°°¯¬¬¬««ªªªª«¬®¯°°°¯°°°±±±±²³³³³³³²²²±±±¯¬«ª¨§¥¥¤¤¢yhWNQPOPPPPQQQRRPMMNPQQPPPPQRRRQQPNLLKLOPPRTUUTTVXYYWWUH?@>@BCEILOQUVUROKJJJMQVWXYWVTSSUVVWY]`bbbabbdeffedcbaba^YUQONJMNOPPUYZ[\^^^^Z\]^\[ZZ[bhgb__^_\YWWXXXUTRQPPPOSUVVVVUTSRRSSPIDABDHJLMMKIECA@>>>>>=====<<===<;;;;<>>>=<999843456531/-++*(')+,/112479<<<::<>@CEGHIJKLLLLLJIIHHJLMKJHIJJJJIFEFEDBD?BJbwz} |zz|~|ytsssrqpoljhgfdbaa`_^_abddddccccdceghhiihhhhhhhggc^ZVPHDCDEEC?=;;;=>>>>;8621146899;=>?><:;<;::<==<;985479>=<:88:<>>??>?@AA@?>?@??=;:9:<==AFJIFEDABBBDDDFIIJGED@>BDFGFEEEDFFGEDCDDGIJJKLKJGGHHHHHGFEDDDDCCA??CGJJJJKKJHEDB>;88999:>ADGHJMOJHDB@@ABEHKMPPPPOQSV\cnz t_VKEGJIDJJJKMPQRV\emqootty~{ywv¤¥¥¤¥§¨©§§¨§§§¨¨¨§¦¥¥¥¥¦¥¥¥¦¦¦¥¥§§§§§§¦¦¨¨¨¨§§§§§©©§¨©©¨¨¨¨©©¨¨¨§¨©ªª©§¦§¦¦¦¦¦¦¦¥¥¤¥¥¥¥¥¢£££££¤¥¥¥¥¥£¢£¥£££££¢¡¡¢£££¤¤¥¥£££££¤¥¥¥¥¥¥¤¤¤¥¤¥¥¦¥¥¥¥¥¥¥¦¥¤¥¦¦§§§§§¨¨¨¨©©ªªªª¨©ªªª««¬««««¬¬¬¬««««¬¬®®®°±²´³³´´µ¶¶¶¶···¶¶······¶¶µµ´´³³³´´´µ³³´³²±³±±±±°°¯¯°®¬¬®®¯±²±±²²³³´µµ¶¶·¸··¸¸···¸¸¸········¶¶µµµ³²±°°®¬®®®®®®®®¯¯¯°°±±±°°°¯¯¯¯¯®®¬¬¬¬«««««ª©¨¨§§¦¦¦¥¥¤¡~{shfhjlnmjmpotuwz| |zzzzzywvttttuuttsqonoonmkjiihfddecghv¡¢£¥¦§ªª««««««¬¬®®¯¯¯°°¯®®®®¯¯°°°°°±±±²³³³²²±±°°°¯®¬««««««««®¯°°°°±±±±±±±²²³³³³²²²±±±±°®«ª¨¦¥¥¤¥¢ zhWNPONNOOOPQQRSQOOPQRSRPPRTTTRQPOMKKJLOPQRTVVVVW[\\WWVJBB@ACCFKNOQUUSPKIIJJMPTVVVVTSQQTVWY[\_ceeefhihhggfdccddb_ZUQQOQRSTRVVXZ[YVUUPTXZVRPPT\dc_\\\][WVVVVVTQOMKJJILNRUVTRPPONOPNHC??@DHJJJJHECA@>>=<<;:88889;<:8657789;:9845641/124310-+***(()+,./3468;=>=;;<>@DEGJKMNOOONLJIIHGIKKJIHIJJJLIFEFFDA9>LZq |zyz|~{xttttsqnnihhfca``a_^^_aceddeedcdebeggghiiijkkklmnlhc]TJDCEEEC?=;::<===<852/.1589;::<?BA=8:;:99;>>?>=:8579:::8778:>>>>>>?@A@@@@@@@>=;::;<=BGJIEC@=>>>?ABDHIJGDC>=@FFFDEEDACDEDCABDDGJKLMLJHHIIIIHHGFEEEFEDC@?BEIJLLKJJIGDB><:;<<<<=@DFFGIJIGDB@ABCHHJOPNNPNQQWiw|{o\LEGJKJIIJLPQRRbnnnprtz{~~{xuts££¤¥¦§¦¦§§§¦¦¦¦¦§¦¥¥¦§¥¥¥¥¥¥¥¥¦§¦¨©ª¨§§¨©¨§¨¨¨§¦§¨©©¨¨©ª©©©©¨¨¨¨§§§§§§¨¨§¨©¨¦¥¥§¦¦¥¥¤¤¤¤££££¤¤¥¥¥¥¥¤¢¡¢££££¢¡¡¢£¤£¢£¥¥¥¥¥¤££££¢¡£¥¥¥¥¥¤¤¥¥¤¤¤¥¥¥¤¥¥¥¥¥¥¥¦¦¦¥¦¦¦¦§¨¨§¦§©ª©ªª«ªª««¬¬«««««««ª««¬¬®®¯°±²²´µµµµ´´µµ¶········¶¶¶µµµµµ´´³³³³´³²²²±±±±±±±±°°°°¯¬¬¬®¯°±±²³²²³µµµµ¶·µµ¶····¶····¶µµµ¶¶µ³´µµ³°°¯®¬«ª©««ª««¬¬«®®¯±±¯°¯¯¯¯®®¬¬¬¬¬«««ªª©©©¨©©¨¦¥¥¥¢¢¡ zuqpooooprsvwy{~ ~{z{{zzyxwvttttuutttrqonnmkjihhfeddbehen{¡¢£¥¦§©ª««««¬¬¬¬««®¯¯¯®®¯¯¯®¯¯¯¯°°°±±±²²²²²°°¯¯®®¬¬««««®¯¯¯°°°°±±±±±±²²²²±±±±³²±±°¯««ª¨¦¥¥¤£¢ xn_NPPNMMKLPRRRRQPRUVWVUTUTSTSRPNKJLKLMOPSVVVUTV[__\ZZVOHDCCDFILOQQPQOLJHHJMPQSTUUVVTRQRTWY[\`cfghiljjihgeeegeigf_\VVVVXYXYZYXYYVSQRRRRQPOOOOV\_^[Z[[[XTQRRRQPOJE@<:@DHLNONNJJJJJHFD>>=>BEGGGGEB>>=<;8665434788888300013564110.-,,--.01-*)))))()+.113479=>>>>???@DGJJLMNOQQPOLJGGHIIJIHJJJJKILFDJIDFWaltx{~ }}|z|}zywvtsrspmjgddcbabcbbaabegdeggfeeedcdeefjnnpqrqpopqumnh[XMPLGA=>?<@?>==;5/-+./7EE@=>@BB@><;=><=>ABAC?87;>=;<:88898;<=>>><<<=>??@@@<<<;;;=>ACEFDA>==>>>>@CEIGDA>>ADGFEFEB>;>EHEDCDGFFGIKLMMMMLKJJIIGGHIJIHFFEDDEGJKLKJJIGDCB?=>ADDBBCCDFGHHIEDDDCDGHJLNNNOPNPV\wnYPNJMLHIPJPV\einpqsux}{zvvuqt¤¤¤¥¦§§¦§§§§§§§§§¦¥¥¦¦¥¥¤¥¥¥¤¥¥¦§©ª©¨§§¨¦¦¦¦§¦¦¥§¨©©©©ªª©©©©¨¨¨¨§§§§§§¨¨§§¨§¥¥¦§¥¥¥¥¥¥¥¥¤¤¤¤¤¥¥¥¥¥¥¤£¢¢££¤¤£¢¢££¥£¢£¤¥¥¤¤££££££¢£¤¥¥¤££¤¤¤¤££¤¤¤£¤¥¥¥¥¥¦¦¦¦¥¥¦¦¦§§¨¨§§©ª©ªªªªª««¬«««««««««ª««¬®¯°±±²²µµ¶¶µµ¶¶¶···¶¶··¶¶¶¶¶µµµµ´´´³³³³µ´³³³²±±±±±±±°°°¯¯®¬®¯°±±²³²²³´´´´µ¶µµµ¶···¶¸···¶µ´´²³²±±²±±¯®¬«ª©¨¨©¨¨©ª««ª«¬¬«®®¬««¬¬¬¬¬¬¬¬«««ªª©©©¨¨¨§¦¥¥¥££¡ ~ztsqqrtvxyz{} ~|zy{{zzyxwvutttutttsrponnlkjihgedcb`abbjv~ ¢¤¥¦¨§¨©««®¬«««¬®®®®®¯¯¯¯¯¯¯¯°°°±±±±±²±±°¯¯®®¬¬««««¬®®®¯¯°°±±±±±±±²²²±±±±±³±±°¯®¬««©¨¦¦¥¥¤¢ zqbPMNMMMKKOPPQQPPRVVWWVVWWWVTQOKJJJJKMOPRTUUVVW[_a`\\XPJGFFFIJLOPPOMKJHGHJMPQRTUVVVTSSSUWY[^adfghjlmljhggghmlpmldb\YYZ\^]]][XVVURQRPQPPOMMMNSY\ZWVWZZXTQPOMKKJGD@><<>BDGHIIIHHGGEDB>>=>@DEEEED?<;:9754554344688862.+**+./-+++)(''((+-.,+*++++++,.01568:=>>>>?@@CFIIJKKLNPPNNLJHHHIIJHHJJJKKILJGFGRcsvzz{~ }}{zxwvtttrnlhbbbbbdcbbbcdfffghgecbbabdghilnprttqpqssxruqgf]UOJGEED>CEGFA:1+1++.8CA<>>?A@><9<>??@CDE@A>;:>AB??>;:;==;;;;;;;<:;<<=>>><<<;;;=>?BDDC@?>?@AABCEGFEDA>>?BDDDDC><;>DGFDDDFHGGIJKLLMNOPPOLJIHHHJJJJHGFEFFGHHHIIHHGGEC@@CDDCEEDDEFHHIFDDDBCEGIKMMMNOPPU^u~ ~oaPFEQLKOLQX\lmnnnry~~|}ywsrmba¥¥¥¥¦§§§§§§§§§§§§¦¥¥¦¦¥¥¤¥¥¥¤¥¥¥¨©©¨¦¥¦¦¥¦¦§§§§§¨¨¨©©ªªª©©©¨¨¨¨§§§§§§§¨¨¦¦¦¦¥¥¦¨¥¥¥¥¥¥¥¥¤¤¤¤¤¥¥¥¥¥¥¥¥¤£¢££¤¤££££¥£¢£¤¤¤£££¢£££££¢¢£¢¢¢¢¢££¢¢¢¢££¢£¤¥¥¥¦§¦¦¦¥¥¦¦¦§§¨¨§§©ª©ªªªªª««««««««««¬««««®®®¯°±±²²²µµµµµ¶······¶¶¶¶¶¶¶µµµµµ´´´³³´´´¶´³´³²±±±±±±±°°°¯¯®®¯°°±²²²²³³³³³³´´´´µ¶¶¶µ··¶µ´³²²°°°¯¯¯¯¬«©¨§§§¨¨¨©ª««ªª««ª«««««««¬¬¬¬¬¬«««¬«««ªª©©©§§§¦¥¥¤¤¤£¢¡ }yuuwyz||~ ~|{zz{{zzyxwwvvuuuttsrqonnmlkiihfecbaa_`ahqx ¢¤¥§¨©©ª«««¬¬¬««««¬¬¬®¬®®®¯¯¯¯¯°°°°°±±±±±±¯¯¯®®¬¬¬¬¬¬¬®®®®¯°±±±±±±±±²±±±±±±±²±°¯®¬«ª©§¦¦¥¥¥¡ {tdSJLLLMJJLNNPPPPRVVXXXY[\[XSMIEDEGHJMPPPQQSTVX\_bb^]YRLJJJJKKLMNMKJIHHIIKNPPQSUVVVVVVVVXZ\^adffghjlkigffghnosondb]]]_bccbb^ZUSSSSSPPPONLLLMPUVTRRSVXXUPLIGFFEC@><;:;=?ACDEEEDDDCB@>><<>ABCCB?;887633478766346663/+('%&)*)(%%$#""##&)++++++++++-/126689<=>>??@BDHHGJJJJLNNLLKJIIIHHHGHJKKJKJJKLJN]pxyxvw{ ~|{{xxwwxwtqnhdbcefgecbbegfefggfdb`__adimnoprtutqpsuwzttndb\\WVUPJE>DDDBA>:5/&+19BCD@@AA@>;9:=>@BDFF?>>=>@DGFFD@==>?=<;999:;9999:;;<<<<;::;<>?ABA@@ABCDEEEGIFGFDBABCCDDDA><<@FIHGDDEIIJJKLKKJKMOPPNLJHFFGIJJHGFFGHHGHIJJHHIJIFDDDDDDHGFEFGIJJGEEDCDEGIKMMLLMPNTat{eVMEHNKJPbkonnmnsz~|z{utqph\Y¦¦¥¥¦¦§§¦¦¦¦¦¦¦¦§¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥§§§¦¥¥¥¥¥¦¨¨§§¨©©¨¨¨©ª©¨©©©¨¨¨§§§§§§§§§¨¦¦¦¥¥¥§©¦¦¦§¦¦¥¥¥¥¥¤¤¤¤¤¥¥¤¥¥¥¤¢¡¢££££¢¢¤£¢¢£¤££££¢¢¢¢¢¢¡¡¡¡ ¡¢¢¢¢¢¡¢¢¢¢£¤¤¥¥¥¦¦¦¥¥¥¥¦¦§§¨¨§¨©ª©ªªªª«««««ª«««««®®¯¯°°±±³³´´³´´´´´µ··¸···¶¶¶¶¶¶¶µµµµµ´´´´´´µµµ³²³³±±±±±±±±°°°¯¯®®¬¬®¯°°°±²±²²²²±²²³³³³³´µ´´³³³²±±±°®¯¯®®®«¬««©¨§§§§§¨¨©ªªªªªª©ª«ª©«««¬¬««¬¬¬««««««««ªªªª©©§§§¦¥¥¥¥£¢¡¡¡ {zzzz~~}|{{z{{zzzxwwwvvuuttsrqonnmlkihhgecbab_`bflq £¥¥¦§©ªª«««««¬«««««««¬¬¬®®®¯¯¯¯¯¯°°¯¯°°±±±±¯¯¯®®®¬¬¬¬¬®®®®¯¯±±±±±±±²±±±±±±±±±±°®¬««ª©§§¦¦¥¥¢ {tgVGJJJKJHJKLNONNPTWYZZ\]]\XQIC@@BDFILOONMMPQTV[_bb^\XRMKKMNNNLLLJIHGHIJJLNPPQRTUVVVWWWXY[\^abddeghiihfeefhnosonb_^`abeggedb\TPQSTTRQQPNMMMLNPPOOOPQUWTMGDC@?>>=<;;:;=>>@BCBBBBBAA@>=;;<>?@>>;74332358:<<;:655542/+)'%%%&&&!! !!!$&)****)()*+-0356678:<=>?ABCDEEDHGFGJLLKKJJJJIHGGGHJKJJJKJLMKQanuvwwz }|||zyyyzxtqnlhhhjjigecceffeeeffecbaabfkorsstttsrrtuz~z{xrrnnmqupjhe\UJFIJFA;37;;<=BDCCB@><:8;>ADEEE@>>?@ADIIJIEA@@A@?=;9899888889;<=<;:889:>>@AAABCCDFFFFGHIJJJIGFFEEEDB>=>DJLKJGDFHIKMONLKIHHIJLLKIGEDEGIJEDDEGIIIKKJJIHHIIGFFEDEFIIHHHIJKJHGGFEFHIJMNMLLLPQYft}|n\OHGGWdonnoqrtx|~~{xsnmig_TU§§¦¦¦¦§§¦¦¦¦¦¦§§§§¦¦§§¦¦§§§§§§§¦¦¦¦¦¥¥¥¦¥¦§§§§¨©ª©¨¨©©¨¦©©¨¨¨¨§§§§§§§§§§§¦¦¥¥¦¨©§§§§§¦¥¥¦¥¥¤££¢¢¥¤£¤¥¥¤¢¢¢¢£££¢¢££¢¢£¤¤¤££¢¢¡¡¡¡¡¡¡ ¡¢¢¢¢¡¡¡¡¢¢££¤¤¤¥¥¥¥¥¥¥¦¦¦§§¨¨¨©©ªªªªª«««««ªª«««««®®¯°±±±±±±²³´´´´´´µµµµ··¸¸··¶¶···¶¶µµ´´³´´´´´µµ¶µ³²³³±±±±±±±±±°°¯¯®®¬¬®¯¯¯¯±±±±±±±±±±±±±±±²²²²±±±°°°°¯®¯®®¬«««ª©¨§¦¦¥¦¦§§§¨¨ªªª©©ªª¨©©ª«««««««««««««ªªªªªªªª§§§§¦¦¥¥£¢¡¡¢ ~~}| ~}||||{{zzzyxwwvuuuutsrqoonnmljihgfebba]_adgkz¡£¥¥¦¦§§©ª«¬¬«««««««¬¬«¬®¯¯¯¯¯¯¯®¯¯°°°°°¯¯¯¯®®®®®¬®¯±±±±±±±²±±±±±±±°±±¯¬«««ª©¨§¦¦¥¤¢ {viZGJJIJIHJJKLMLLNPVWXZ\]]\XPGA??BDEHKLLJJJOPRV[_`_][WRNLMOQQPNMLJHFEFIJKMOPPQRTUUUUVVVWY[\^`bbbcefhhhhgghhnpsoob^_`bdghhhgc\UPPRSRSRQPNMMMLMMMMMMNNRVQI@=>776789:;:;==>>>>????>>>><:988:;<;:732221468<>?>=8632110/)'$####" !!$&()**(&%&)+-1367789;<>>ADDDDCBADCBDGIJJJJKKJIHGGGHJJJJJJLMJITht|}~~ ~}}~}{zzzyurpnlkkllkhhfeddefdefggffeefginrttttsrttuvtwwyxvxwnknqomki_XPLNOJD@8<@ACDJDCBA?><:9;>CEFEEC@@BCBDIHJJHEDDDBA?=;887777789;<;;:989:<>?ABBBBCCDFGFEEFJKMNMKJJIGEDB?>>FLNNMJGHGHJLMMMMJJGGGHIHGFDDFGIIEDCCDFGGJHGFFFEDEEEFEEFIJJKJJJJJJIHIIIIJJLNONMMMU[downh^WTensmnquz}|{|zuonld\RJM§§§§¦¦¦¦§§§¨¨¨¨¨§§§§§¨¨¨¨¨§¨¨¨§¦¦¦§§§§§§¨¨¨¨¨¨©ªª©¨¨¨§§¦¨¨¨¨¨¨¨¨§§¨¨¨§§§§§¦¦¦§¨©§§§¦¦¦¥¥¦¥¥¤£¢¢¢¥¤£¤¥¥¥£££££¤¤£¢¢¢¢¢££¤¤¢¢¢¢¡ ¡¡ ¡£¢¢¡¡¡¡¡¡¢££¢££¤¥¥¥¥¥¦¦§§§§¨¨©ªªªªªª«««ªªªª««¬¬«®°±±±±±±²³³´´´´µµ¶¶¶¶····¶µµ¶¶¶·¶¶µ´´³³´´´´´µ¶¶¶´³´³²±±±±±±±±±±°¯®¬¬¬®®®¯°¯°°°°±±±°°°¯¯°°±°¯¯¯¯¯¯¯¯¬««¬«ª¨¨¨¨§¦¥¥¥¥¦¦¦¦§§©©¨¨¨©©§§§©«««««««ªªªª««©©©©©ªªª§§¦§§§¦¥££¢¢¢ ~}|{{{{{{zzzyxwvvuuuuttrqponnmmkjhhgeba^\^`behv} ¢¤¥¦¦§¨©ª«««¬¬¬««¬¬««¬«««¬¬®®®®®®®®®®¯¯¯¯¯¯¯¯¯¯¯®®®®®¬¬®°±±²±±±²±±±±±±°°°°¯««««ª©¨§§¦¥¤£¡|wk\FJJHIIIJJJKLJJKNPSVX[\\YUNE@>?BDFIJJIHGHNOQV[^^\\YVRPMNPQQPNMKIFEEFJKMNPPOPQSTTSQPPRUWYZ^_``aabcceghhhhhmnpnn`Z\]bfhiihhfaYSQRSSSRPOMLLMMLKKKLLLKOPMD;881100134589;<<;::<<;:98888876667777522443557:?BB?830---./)&%"!! $%'())(%%&)+-03689:<=>@BDFGEDCBBBA@BDEGIIJKKJIGGHGHIIIJKJMLMVdqx} ~||{yutsqolkklliihgeddeeefghhhhhhhhkosttsrtvxxxzzzzzyyyxstttql^\YVVY[[TJIGEEA@CB@>=<:9:<?DFFDDDBBDDDEHIKLJFDCBBA@>=986777889;<:::::<>?ABCCAAABBDEFEDDDJKMOPOMLJGDCA??@EKNMNLIIGGGGGIKMKJJHFDDCCCCDEGGGFDCA@AABBA@@BCCBDCDEFEGJKMNNLJIIIIIIIIJJKLNONMNOWbn{utoinnpqpty}}zyzvqkli\PG?C§¨¨§¦¥¥¦¨¨¨¨¨¨¨¨§§§¨¨¨©©¨§§§§§¦¥§§§¨¨¨¨§ª©¨¨©©©©©©©¨¨§§¨¨¨¨¨¨¨¨¨§¨¨¨¨§§§¨§§§§§§§¥¥¥¥¥¥¦¦¥¥¥¤¤£££¤¤££¤¥¥¤¤¤£££££¢¢¢¢¢¢¢¢£¡¢¢¢¡ ¡ ¡ ¡£¢¢¡¡¡¡¡ ¡¡¢¡¢¢£¥¥¥¥¥¦§§§§§¨©ªªª«ªªª«««ªªªª««¬¬¬®¯±±±±²³³³´´µµµ¶µ¶···¶¶¶¶´³²³´µµ¶¶µµ´´³³³³³³´´µµµ´³³³²±±±±±±±±±±°¯®¬¬¬¬¬¬®®®®¯°±°¯¯®®®®®®®®®®«««ª©ªª¨¨§§¦¥¥¥¥¥¦¦¦¦¥¦§¦¦¦¥¦§¦¥§§¨«««««ªª©©©©ªª©©©©©©©©§§¦¦¦¦¥¤£¢¢¡ }||{zzz{{{zzzyxxwvuuuttsqpoonnnmljhhgdb_^\__acht{ ¡¤¦§¨©©ªª««««¬¬««¬¬««««««¬¬¬¬®®®®®®®®®®¯¯¯¯¯®®®®®®®®¯¯®¬¬¬¬®¯±²²±±±²±±±±±±±°°°¯®¬«ªª©¨¨§§¦¥¥£¡}xk[DIIHJJJKJJJJJHJKMPRVYZWUPKDA??BDIJKJGFFHLOSVZ\[YZWURPNNPPPPONLJGFEEHJJJKKKLOQRQPMLKNRVXY\\]]]^_``acefgggjllik[SVW^fiiiihhd^WTTTTSRPNLKKLMLKJJJJIJJIF?86610-+,-..46888776777644456555444455435787767:AGHF<71.,+,-*(&%$#"!!!!!! "$%&(('%%&*,.1479:=>?ACDFGGEDEDDDCBBBCDGIJKLJIHGHGGGHHJMPQQXhstv{ |{zxuttttpnllljiihhfeddccdfgggiihhjnpqrrtuyzzzxxyzz|{{|wtttvtoa`\WVX\^XTTNJMJGDC@>=;:9:;>DFEDDBBCDDEGHIJJHEDB@?@@?><9888889:;<;;;<=>ACDDDB?>?@ACDDDBBBHJLNPPONKIFDA@CEFKMMNLIIEEEDDEGIIJJIFDBAAABCDDEDDDDB?>>?>>??ABBBDBCEFFGJLNOOLJIIIIHGGFFFJJLMMNOPVbtwvzzrptwz{vuvsl`a\J@<78§¨¨¨¦¥¥¥§§§¨¨¨¨¨§§¨¨¨©©ª§¦¦¦¦¦¥¥¦§§¨¨¨§¦©¨¦¦§§§¦¨©©©¨¨¨©§§§¨¨¨¨¨§¨¨¨¨§§¦¨§§§§§§¦¤¤¤¤¥¥¦¦¥¥¥¤¤¤¤¤¤£££¤¤¥¥¤£¢¡¢¢¢¢££¢¢¡¡¡¢¡¡¢¢¡ ¡¢ ¡¡ ¢¢¢¡¡¡¡¡ ¡¡¡¢£¤¤¥¥¥¦§¨§§§¨©ªªª«ªªª«««ªªªª««¬¬¬°±±±²²´µµµµµ¶¶··´µ··¶µµµ´²±±±³³´µµµµ´´´´³³³³³´´µ´³²²²±±±±±±±±±±±±°®¬¬¬«¬¬««®««¬®°°¯®¬«¬¬¬¬«««ª¨¨©¨§¨§¦¥¥¥¥¥¤¥¥¥¥¤¥¥¥¥¥¤¤¥¥£¦¦§©©¨§¨©©©©©©©ªªª©©¨¨¨§¨§¦¥¥¥¤£¢¢¡ ~}||{{zzzz{{zzzyxxwvvuutsrqpoonnnmmkhhfc`]^]_]^afrz¡¤¦¨©¦§¨ª««¬¬¬¬««¬¬¬«««««¬¬¬«®®¯¯¯¯¯®®®®®®®®¯¯®®«¬¬¬¯±²³²±±±±±±±±±±±¯°°®¬«ªª¨¨§§§§¦¥¤¢}wiYCHIIJKJLIJJJIGIJKNQUVWTPOJECABDFKLKJGEGHJOSVXYXWYVTRPNNPRSRQPOLJEDCDEDDDFGIKOPOMKJIKQVXY[[[[[\\]^`bcefghkllhkZQUR\eijiihgfaZUSSSSRPNLKKLMLJJJJHGGDCA>8660-+**+,,012333221222223555554444444479:9988<EMOLD>720--.+*('&%$#$$$$#"! !#$&'&$%'+-02689;>?ACDEGFEDEGFEGEDDBBDGIJKLJIHGHFFFGHKNV[\bnqqz{ ~}~{zzwuttxyvrnmkjiiijhebbaabceffijjiknooprtwzz{|}z{z{}zz|~|wutoba^\]``__`bVKLKJFDB?>=<;;<?DGFDD>@BBDFHIDEEDDDDB>?@@?>=;::::;;;<>>>>>@BDGED@>=>?@BCCB@@AEGJLNONNMKIEBBEJIMNMNKHGDDEEDDDDGIJHEDDDDDCDDDDDBDDCA?@AABCCBBBCDCCFGFHJLNONLJJJHHGFDDCBGIJKLMPQYbv }svxz~~~}ytrrng_]T@8968«««ª©¨©©§§¨¨¨¨¨¨¨©©©©©ªª©¨¨¨¨¨§¦¨¨¨©¨¨¨§§§¦§§§§¦§§¨¨¨¨¨¨¨§¦¦§¨¨¨ª©¨§§¨¨§©¨§§§¨¨§¨§§§¦¦¦¦¥¥¤¥¥¥¥¤¤¤¤¤¤¥¥¥¤¤¤£¢¡¡¢£¢¡¡¡¢¢¢¡¢¢¢¢¡¡¡¡ ¡¡¢¢¡¡¤¤¤¤¤¥¥§¦§¨§§©©§©ªªª©©ª«ªª©ª««¬°±²²±²µ·µµ¶¶¶¶¶¶µ´´´µµ´´µ³±±±²´µ´´³³³³³³³³³²²³³³´´´²±±²³²±°±±±°±®®¬««««ªªª«««««¬¬¬¬«««¬¬¬¬¬¬¬¬«««««ª©¨§§§§¨§¦¥¥¥¥¥¥¥¥¥¤¤¤¤¤££¢¢¢¢¢£¢£¤¥¦¦¦¦¨¨¨¨©©©©¨§¦¦§§§¦¥¥¥¥¤£¡¢ ¡¢ }{zzzzzzzzzzzzyxwvwuttttrppponnmllmjhecb`__^]]]_dht ¡¢£¥¦¥§§¨ªª«««««««««««««««¬¬¬«¬¬¬¬®®®®®®®®®®®¯°°¯¯®®«««¬¬¬¬¬®¯±±±±²³³²±±±±±±±±°®¬«ª©¨¨¨¨¨§¥¤¢ xnSDILLKLLLJJJJJJIHMPRSTRPMJGDDDGJJMMNMJEDDHLSXXVVWWXVQPMLORSSTRPNMID@BCAABCCDFJKLKJJKLOQSUTUUUUVWYZZ\_bbcejmjkm_PQSZgnkhhfgb_]ZURRQOMMLKKLKLKIHHGDA?>;9753.,++**+,/11/-/.,/0123322422444587658;>?>>=<>HQUSKE>8369871,*&&)*+*(&%$#! "#"! $(-14589;=@CDEEFIHGGGHHHFDDDDEHKOONNLJIHIHFHHCHX__cnvuu{ ~}~{ywutuwyyvronnljklkhdcbceghgfjklllnorruwxy{~~~}|||{{~~~~|zzytidacgbceeaZVTQNLHGEC@>::=?CEFDCB@?ADFDCB@>>>@BDCA???><:;=>>=;::==>?>>@CCCB@>>>@AAAABDDDGHIHHIKNLJHFFHIJKKJJJJHFFDFJHB?ABDEEDDDDEDDEFEDEIIGDA@ADDDBBCDDDEFGIHGIJKMNMJHHIFFEEDDDEEJKJMORXaoz ~}wvnmhd`QIC?:765ªªªª©©ª«¨¨¨¨¨¨¨¨¨©©©©©©ª©©¨¨¨¨§¦¨¨¨¨¨¨§§¨§§§¨¨¨¨§§§§¨¨¨¨¨§¦¦¦§¨§©¨¨¨¨¨§¦§§¦¦§§§§§§§§§§¦¦¥¥¤¤¥¥¥¤¤¤¤£¤¤¤¥¤¤¤£¢¡¡¢¢¢¢¡¡¡ ¡¡¢¢¢¡¡¡¡¡ ¡ ¡¡¢¢¡¡¤¤¤¤¤¤¥¦¦§¨§§¨¨§§©©©¨¨©«ª©©ª«¬®¯°±²±²´¶····¶¶¶µ´´³´´µ´´´³±±±³´´´´´´³³³³³³³²²³³³³´´³²±²²³±±±±°¯°®®««ªªªªªªª««««««¬¬¬¬«««««««««««««ªª©©©©¨¨§¦¦§§§¦¥¥¥¥¥¥¥¤¤¤¤££££¢¢¡¡¡¢¢££¤¥¥¥¥¥§§¨¨¨¨¨§©¨§§§§¦¦¥¥¥¤¤£¢ ¡¡¡ }|{zzzzzzyzzzyxwvuvutttsrpponnmlkkjhfdba_^]\\\\_chs~ ¡¡£¥¥¥¦§¨©ªª«ªªªªªªª««««««¬¬««¬¬¬¬¬¬¬¬®®®®®®®¯¯°¯¯®®®«««¬¬®¯±±±±²³´³²²±±±±±°¯®¬«ª©¨¨¨¨¨§¥¤¡wnTFIJJKLLKJJKKKJJJMOPPPPOMJHDDEHJKOOOMIDBBFIOTVVUVVVSPPNLNPQRSSRPOMFBABA@AAACEIJJJKJJJJJKLPPRRSSTUVVXZ\^bghmnnhVJOJSbjjihdea]\XSQQPNLLLKKMMMKIGFDA><:87521-++,--.0..-+*+,,./01345622355456988;?B@>BBBDKRUSHC><<AEE>2++**.1111.+)&%$###" #'-14689<>@CDEFGHHGGHHHGGFFFGHJMSSQOKIHHIHEDGMWcdfiqyyy} ~}zyxwvwxxwutsonllmmkihggghhhikmnnnnprtwyzz{}}~~~~~{z{snjjlggcc`\YZXVOKJE@>>:<>?BDDDD?AA@ABA>?>==>>ADDCA@@>=<:<>>=<;<=>?A@??ABA@?>>?@BBCDDFHIGHHGFGIJJJJHFGHIKJJJJJHGGGIKJEBAACDDDCCCCAADEFGIJJJGEDDEDDCCDDDDFFHJIIJLJLLKHEEFFFFEDDDEFJLKMPV^gt| ~}wtyri`WR>8785455©©ªªªª««©©©©©¨¨¨¨©ª©©©©ª©©¨©©¨§¦¨¨¨§§§§§§§§§¨¨¨§¦¦§§§¨¨¨§§¦¦¦§§§§§§¨¨¨¦¥¦¦¥¥¦§§¦§§¨¨¨§¦¦¦¥¥¤¥¥¥¥¥¤¤¤¤¤¤¤££££¢¡¢£¢£££¢¡ ¡¡¡¡¡¡¡¡¡ ¡¡ ¡¡¢¢¡¡¡£¤¤¤¤¤¥¥¥¦§§§§§§§¨©©¨§¨©¨©©ª«¬®¯¯±±²³³µ¶·····¶µµ´´³³´´´³´³²±²³³³´´´³³³³³³³²²²²³³³´´³²²²²²±±±±°®®®¬«ª©¨¨©©©ªª«««ª««««««ªªªª©ªªª«ªª©©¨¨§§¨¨§¦¦¦¦¦§¦¥¥¥¥¤¤¤¤££££¢¢¢¢¡ ¡¡££££¤¥¥¥¥¦§§§§¦¦¨§§¦¦¦¦¥¥¤££££¢¡¡ ¡ ~~~|{{zzzzzyxyyyxwvutvtssssrqoonnmlkkhhfdba_^\[[\\^bfo{ ¢¤¥¥¦¦§¨©ªªª©©©©©©©ª«ª««««««¬««««««¬¬¬®®¯¯¯¯¯¯®®®««««¬®®¯°°±±±²³´´³²±±±±°¯®««ª©¨¨¨¨§¦¥£¡wnVIJJJJKKJIJJKKKJJMNNMMMMLJHDDDHJKPPPNIDABDFJORSSSTUSQRPLLMOPSTTTSSKDAAA@AAACEIJJJJJIHGHIJLNPQRRQQRSTUUX`ghhhhaMCJDM[behhb\[ZZWRPPNLJJJJJKJJHDCA>=98643110++-0123420-*(&(*++,.1478;9743369888>CGHGMOPPTWXVJGEEGLPOD714437:88851-++*('%""'-2578:<>@CDEGGHHGHHHHGHGGHIJLNQRQOKJJJKJGDJZhmmqty~~~ ~}}} ~~|{zvvuuuvuuponmmmmmllkhhhjllnpqqpqruxzzzz{{}}~~~{{usnmnjkhhebbb`\UTQKDDD@>>@ABCDD@BA>>>><><;<>>ADEDCA?>>>:<==;::::;>??>=>>>>>>????@ADEGJJJJJHGGHJIJJIGFGIJJJJJJIHIJKLLJEBABDDCBBCB@?ADGJLKKKJJHGGEDDDDEEEDDEGFFHJJJJIFDDDFGFFEDDEFJLLNRYbnz}zvttm_ZPJ>:::8676¨©ªª©ªª«ª©©©©©©©¨©ª©¨¨©ª©©¨©©¨§¦¨¨§§§§§§§§¦¦§§¦¦¦¦¦§§¨¨©¨§¦¦§¨¨§§§§§§§¦¥¥¥¥¥¦¦¦¦¦§¨©©¨§¦¦¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤££££¢¢£££¤¤£¢¡ ¡¡¡¡¡ ¡¡¡¢¢¡¡ ¢£¤¤¤¤¤¤¥¥¦¦¦§§§¨©ªª¨§§¨§¨ª««®¯°±³´´µ¶¶····¶¶µ´´³³³´´³³³²²²³³³²³³³³³³³³²²²²²²²²²³³³²²±±±±±±±°®¬¬«ª©¨§§¨¨¨©©ªªª©©ªªªª©©©©¨¨¨©©ªªª©©¨§§§§§¦¦¥¥¥¥¥¥¥¥¥¥¤¤£¢¢¢¢¡¡¡¡ ¢¡¡¡¢£¥¥¥¥¦§§§¦¥¦¦¥¥¦¦¥¥¥¤£¢¢¢¡ ~}|{zzzzzzyyxyxxwvuttutsrrrqppponnmllihgecb_^[ZZ[\]bdkw~ ¢¤¥¤¥¥¦§¨¨¨¨¨¨¨¨¨¨¨©©©ªª««ªª««««««¬¬®®¯¯®®®®®®®¬¬¬««¬®®¯°°±±±²´³³³²±±°±¯¯®««ª©¨¨¨¨§¦¥£¡vp[JJJIIHGFFGIJJJJJLMLKJKKJJGDCDGJKPOPNJECCDDHKNNPPSVTSSPLMKMPSVVWWWOFBCCCCBCDGJKKKJJIHHIJJLNPRSRQQPPQRRU\bda[YVJCEDJQV]ghbUVWZXRONMKIHHHHGDB@>=<;:8742110/-.1466672/,+'$$&+,.138;>?=95113689=BIPUXY\]]]^][ROOPQUVQLFDEB>>?>><974110-+(%! "&-2689:<>@BDEFGHHHHIIHGGFFGIJKMLNPNKJJLLJKMTftty~ |{| }{z{}~~~}}xvtttuuttrpnmlmnnnnkhhjmmortssssvy{{zzzzz{|}~~~~~zvupnnknnnmkkifbbb]SIEA9BCDEFEFGGB><<<<=><<=>@BDEDDA>==><<<;887788:=><;<<<=?AA@>=>@CDEGIKKKJHHHHIIIHGFHIHHIIJJJJJKLKLMJDBBCDDDDDCB@ACFJMKKKKKJHGGGFFFEEECBBBBCDGHIIHEDDDFFGFEDEEFJLNQT[bs} }{ztrmf_RSGA?<<;7443¨©©©©¨©©ªªª©©©©©¨©ª©¨¨¨ª¨¨¨¨©¨§¦¨¨¨§§§§§¨§¦¦¦¦¥¥§§§§§¨©©©¨¨¨¨©¨¨§§¦¦¥¥¥¦¥¥¥¥¦§¦¦¦§¨©©¨§¦§¦¥¥¥¥¥¥¤¤¤¥¥¥¥¥¢£¤¤£££¤£¤£¢¡¡¡¢ ¡¡¢¢¢¡¡¡¡¢¤¤¤££¤£¤¥¥¦¦§¨¨©ª©¨¦¦§§©ª«¬¯°±±³´µµ¶¶¶¶¶¶¶µµ´´³³³³³³²²²²³³³²±²²²²²²²²²²²²²²²²²²²²²±±±°±±±°¯®««ª©©¨¨¨§§§¨¨©©©¨¨©©©©¨¨¨¨¨¨¨¨©©©©©¨¨§§§§§¦¦¥¥¥¥¥¤¤¤¥¥¤£¡¡¡¡ ¡£¤¥¥¥¦§§§¦¥¥¥¥¥¦¦¦¦¥¥¤££¢¡¡ ~}|zzzzzzyyyyxxwvutttttrrqqqppponnmlkjihfdb_][ZZ\\^adht{ ¡¤¤¤¥¥¥¦§§§§§§§§§¨¨¨¨¨©©ªªªªªªª««¬®®®¬®®®®®®®®®®®¬¬¬««¬¯°°°±±²³³³³²±°°±¯¯®««ªª©©¨¨§¦¥¤¡ ~ws`EGIHFDDDDEFHIIIIJKLKKKJIHFDCDHJLNNNMJECCBDFHIIKNQUVSQNJLJLPSVXYYYQIEEFFEDDDFIJLLKJJHGGGGLMOPRSSRQQQRSTW[\YRMKIDBBBDHP\`ZPQTVTOKKLJHFFEDB><98889:9865321111488888989;:7784579<?DFCEFEC?=<DGKORW^b^beeddbab`bcdfc]ZZ[VMHFCDCBBB?:640,+(%#"$'-268:;=>@BDEGHHHHHIIHGFFFGHJJKKLLJHHJMMMSZbo{{ ~|{z{~~|{|~~}}||ywuuuuuuwuspmjkmnoonjilnnptuvuuuyz|}|zzzyz|~~~}}~}~yutoopqrssqlhcdd_\][SGGJLMLKLOA88;9:>>==>>@BDDDCA>=<=<<;98766889<====<=>BDDB?>>@CDDDFIJJIHGFFHFEDEFHIGGHIJJKLKKJJKNLHEEDDEDDDDDBBCGJMKKKLLKJIJIIHGFEEDA@??@CEEGHHFEEEGGHGGFFGGJMQVZ]cu {yxrieb^RPA885552355¨©©©¨¨¨¨ªªª©©©©©¨©ªª¨§¨ª§§§¨¨¨§¦¨¨¨¨¨¨§§©¨§§§¦¥¥§§¦¦§§¨©©©¨¨©©¨¨§§¦¥¥¥¥¥¥¥¥¥¦¦¦¥¦¦§¨¨¨§§§¦¥¥¥¥¥¥££¤¤¤¤¤¤¢£¤¤£££¤¢¢¢¡ ¡£ ¡¡¢¢¢¢¡¡¡¢££££££¢£¥¥¥¥¥§§¨©¨§¦¦§¨ª«®°±±±²³´´µµµµµµµµµ´´´³³³³³²²²²²³³±±²²²²±±±±±²²²²²²±²±±±±±±°¯°±°¯®®ªª©©¨¨¨¨¦§§§§§¨¨§§¨¨¨¨§§¨¨¨¨¨¨¨¨§§§§§¦¦¦¦¦¦¥¥¥¥¥££££¤¤£¢ ¢£¤¤¥¥¥¦¦¥¥¥¥¥¦§§§¦¥¥¥¤¤£¢¡ }|{zzzzzyyyyxxwvutttssrrqqppoonnmlkkihgeba^\\[[\^_bcgqw ¡£¤£¤¥¥¥¦¦¦¦§§§§§§§¨§¨©©©©©ª©©ª««¬®®®®®®®®®®®®®®®®®®¬¬¬¬«¬¬¬¯¯°°°±±²³³´³±±±±°¯®¬««ªªª©©¨§¦¥£¢ ~wtdBDEFDAACBDEGHIHHHJKKKKJHGEDDFJLMNMMLIDAA@BDEDDHKOSTQOJIKJLPSVWXYXRKIIJJHDDDDEGJKJJJIHHHHKKLNPQRSSRRTTTTTSURJEEC?<:9;?HJDFFGJIGHJJIGEDC?<86323589=<:98754568:<;::9:>ABA@@>>@ACEIKPSVVVTSRTW\\\\^abfiiijihnnopoolf`cd\QOOJJJLOPJB;51..-+'%&).379;=>?ADDFIJIIHHIHGFFGGGHJJJIHGEEHMQTXahmt} }|}~}}|||~}{{{{wvutuuuuwutrnihimnnnnmnonqtwxxyz{|~~{zzz|{|}}}}vttvz{zxsnhhfb__\UOMNQQPNNQB77989=>>==>>>@ABBA>=;;:9988899988:<<<==>AEHHEC@?@A@>?AEFHIJIGFFDCCDEGHGHHIJJKLJJJIJNMJIHGFFFEDDDDDEHKMLLLKKJJKKKKJHGEEDA???@BDEFHIHGFFHIIIIHIIJKNT\_bhz|ytoc``ZOI=862111377¨©©©©¨¨¨©©©©©©©ª¨©ªª¨§¨ª¥¥¦§¨¨¦¥§¨¨©©¨§§¨§¦¦§§¦¥§¦¦¦¦¦§¨¨¨§§¨¨§§¦¦¦¥¥¤¤¥¥¥¥¥¦¦¥¥¦¦§§§§§§§¦¦¦¦¦¥¤¤¤¤¤¤¤££¢¢£££¢££¡¢£¢ ¢ ¡¡¢¢¢¢¡¡¢££¢¢¢££¤¥¥¥¤¤¦¥¦§§¦§¨©ª«®¯¯°±±²²²²³´´µµ¶¶¶¶µµµµ´³³´´³²²±±²²²±±²²²²±±±±±±²²²²±±³²±±±±±°¯°°®¬©©©¨¨§§¨¦¦¦¦¦¦¦§§§¨¨¨¨§§§§¨¨¨¨¨§¥¥¥¦¦¦¦¦¥¥¥¥¥¥¥¤¢¢¢¢¢¢ ¡¢¢££¤¤¥¥¥¥¥¥¥¥¦¦¥¥¤¤¤¤¤¤¢¡ ~}{{zzzzzyxxxxwvuttttrssrrqpooonnmlkjhhecb`]\\\\]_`bcgns| ¢£££¤¥¥¥¥¥¥¦¦¦¦¦¦§§¦§¨©©¨©ª©©ªª«««¬®®®®®®®®®®®®®®®¬«¬¬¬¬¬¬¬¬®¯°°°±±±²³³³±°±±¯¯¬«ªª©ª©¨¨§¥¤£¡ ~wvgDDDDDA@A@ADEFGFFEHJJJJIGEDDDGJLMNMMKIDA@??ACDDHKNPPNMJHJJLOQTVVVVRNLLMKIEDA?@BEHHHIIJJJJJJJLOQSSUSSTSRRRQRQKDB@=:8876896:9:==>AEDDDDCA<731/1258:?>>>=<:899;>>>>>?BEGIJJJHHHHHJNPVY[ZY[\]]`bba``aeilklnnmnmnonmjeedb\VUVSPQSUTND=742320,+)+048:=>>@BDEGIJJJIHHHGFFGGGHJIHDDCBDHNQ\gqtvy} {|~||||}}|~~}|{{xwvtttvwxvutpjhhhijlmnnnnqtwxz{|~{z{z}|{zz{~~{xwz~{ysonjgggc]XVUTPOOPG>99:;>?><<<;;=>>??><9877788;=><;:<=<;:>?BFIJIHC@>><9;>BDGJKJJHEEDDDEGHIJJIIJJKJJIIJLLKIHFGHIHHEGGGGJKKKKJIHIJLLMMLJHGGDCBCDDDFGIJKJIGFHIJJJJJJKMOT\`em~yqmbVQHA:6530...155¨©©ª©©©©©©©©©©ªª§©«ª§¦¨ª¥¥¥¦§§¦¥§¨©ª©¨§¦¦¥¥¥¦¦¦¥¦¦¥¥¥¥¦§¨§§§§§¦¦¥¦§¦¥¤££¥¥¥¥¦¥¥¥¦¦¦¦§§§¨¦¦¦§§¦¥¤¥¥¥¥¥¤¤£¡¢££¢¢¢¢¡£¤£¡ ¡ ¡¡¢¢¢¢¢¢¢¢¢¢¢¢£¤¤¥¥¥¢£¥¥¦§§§¨ª««°±°±±²³³³³³´µµ····¶¶µµµ´´³´´³²²±±±²±±±²²²²²²±±±±²²²²±±³²±±±±±±¯±±®¬¬¬«©©¨¨§§§§¦¦¦¦¦¦¦¦¦§§¨¨§§¦¦¦§¨¨¨§¦¥¥¥¥¦¦¦§¥¥¥¥¥¤¤¤¢¢¢¢¡ ¡¡¢¢¢£££¤¤¥¥¥¥¥¥¤£¡¡¢¢££¢¡ ~}{zzzzzzzxwwxwwutttssrrssrqpoponnmllkhgdbb`^\]\\^_`bchnpy ¢£¢£¤¤¥¥¥¥¥¦¦¥¥¥¦¦¦¦§¨©¨¨©ªªªªªª«««®®®®®®®®®¬®®®®®®¬««««¬¬¬¬¬®°°°°±±±±²²±°°±¯®««ª©©ª©¨§¦¥¤£¡~wvhJGEDDA@@>?BDEEDDDFIIJJIGDCCDGJLMNMMLJECB>>?BDGJLMPNLLJHJJKNPRSTTTRPNNNKJFD@==?CEFGHHIHHGJJJMPRTTUTSRQPQSUPMJDA?;<:;:66897668879>?@AAA?941//258:=@@@@@>=<;;=>@@@A@DGHJMONRRPONPTWX\__]]]\`abbcdefhkmllnnnonpqpqqmmfb_\ZYVTTUTQJC<87787310+-158;>?>@BDDGIJKJIHHGGFFGGFGIHFCCCCDGJK\n{|~ ~}{} ~}~~~|{|}~}|{zyvtuwyzxxxtnkkedehkmnmnpsuwz{}~zzzz|~zxxz~}ztx~yskhihle]ZVRPPNLF>;=>>?><<:99:;<>>>;8644568;>?@>>>?>;:>>BEHJJJEB>=989>?BFJLKJIEGHHFFHIJJJJIIJJJIIJKKJJGEEFIKKJGIJIIJJJJJHFDEHJMNNMKJHHFEFIJIIJJKMNMJHFGHIIIIJJMNORX\cnxnkgRI>>8750-,.17;:¦§¨©©ª©©©©©¨¨¨§§§¨¨¨§¦¦§¦§§§§§§¨¦¦¦¦§§§§¥¥¥¦¦¦¦¦§¦¥¥¥¥¦¦¦§¨¨©¨§§¥¥¥¥¥¥¤£¥¦§§¦¥¥¥¥¦¦§§§§§¦¦¦¦¥¥£¢¤¤£¤¥¥¤£¢¢¢¡¡¡¡¡ ¡ ¡¡¢££££££££¢¢¢¢¢¤¤¤£££¤¥¦¥¥¥¦©«¬±±²²±±²³´´´µµµµµµµ¶¶µ´´³³³²²²±±±³³²²±±±±±±²²²²²²²²±±±±±±²±²²³²±°±°¯®¬««ª©©¨¨§¦¦¦¦¥¥¥¥¥¥¦¦¥¦§§¦¥¥¥¥¦§§¦¥§¥¤¤¥¦¥¥¦¥£¢£££¢£¡ ¡£¤¤¥¤£¢¢££¢¡¡¢¢££¢¢¡ ~|{{{{zzzzywvvvvvvuuttrttssrqppponmlkjihgfcb_]\\\\^`abbfhnx~ £££¢¢£¤¥¥¦¦¦¦¥¥¥¥¥¦§§§§¨¨©©ªªªªªª¬®®¬®®¯¯®®®¬¬¬¬¬¬¬«««¬¬¬¯¯¯¯¯°±±±±±±±±±±¯®¬««««¬«ª©§¦¥¤£¡ |{vjQEEECCA??@BDDDDDEEFHHHHGEDDEIKMMPNKIGEDCCBCEFGIJLLKJJJJJJKLNPRQPPNLKLLJIGC>==<>?DDFFEFHJKKLNPRSSSRQQRSSSSQOMLLLLGFDB;5365555578:<=>>><8512248;>?B@AC@>>==;=@CCDGJJKMOQSTVXYXXY\__abbbabb``bcfghghjnooopprrrrrqonkheb_][ZVVTPLG?8:999:98611258:=>@ACEGJJKJIIIIIIIJIHIJJGDDB?BACJMkuzy{ ~~~}|~~zz|}| ~}|yuuy|}|{zzztldbbfjlkjlnrtwyzz~|}~}}{{{| |zz} zuutsihd_[YVTQPPHB>;?>@@><9889;;;;:86523468;>ADCCCA>=>>@DEFGGHFEEDA<;>@EKOPPMJIKLJHGILLJJHGFGIIJIHHJLLKHDDHJJIHHGHIJIHHJJHDCDEJLMMLJJJHHJLNOQTPMLNMJIJHJLLKJKKLOOSW]joyihNI85775211137<@¥¥¦§§¨¨¨©©¨¨¨¨§§¦§¨¨§§¦¦§§¨¨§§¨¨§§¦¦§§¦¦¥¥¥¦¦¦¦¥¦¥¥¥¥¥¦¦¦§§¨§¦¥¥¥¥¥¥¥¥¤¤¥¦§§¦¥¥¥¦¦§§§§§§¥¦¦¦¥¥¤¤¤¤££££¢¡¡¢¢¡ ¡¡ ¡¡¢££££¢¢¢¢¢¢¢¢¤¤¥¤££¤¥¥¥¥¦§ª«±²³³²²²³´´´µµµµµµµµµ´´³³²²²²²²²²²²²±±±±°±±±±±±±±±±±±±±²²²²²²²±±°°°¯¯®¬¬©©¨¨§§¦¦¥¥¥¥¥¥¦¦¦¦¥¥¦¦¥¥¥¥¥¥¦¦¥¥¥¥¥¥¥¥¥¥¥¥¤£¢¢¢¢¢ ¡¢££££¢¢££¢¡¢¢£££¢¢¡ }|||{{zzzyxvwwwvuuuutttttsrqppnnmlkjihhgfcb_^\[[\^`abdghnu{¡¢¢¢¢£¤¥¥¥¥¦¥¥¥¥¥¥¥¦¦¦§§¨©©©©©ªªª¬®®®®®®®®¬¬¬¬¬««««««««««¬¬®®¯¯¯°°±±±°±±±±°®®¬««««¬««©¨§¥¤£¡ {zuiSGGGDDA@@ADEFFEDEFHIJIHHEEEGJMNNMKJIHGFEEDDFGHIJLLKJJJJJJJKMPPPPOLJIIJIHFC>=<<>?BDEEDDFIKLMOQSTTSRQQRSSSSQPOOPPPPNKH@8334555556789;<;9755578;>?ADBCDB@><<=>ADDFHLMOQUWYZZ[\\\\^`abbbbbbcbbbdfghgiknpppqrssrrrpnnkifb`\ZYVQMKJFA<==<<;:8755578:<>BCDFHJJJJIHHIIIIJIGHIIGDACABDL[fsxzz~ ~~|{|~{{|}} }zxy{~ztid`bfjmnooptwzz{|~~|{|}~~~~ ~~~}~vkf`\\ZVSOPJEA>A?BA?><::9;<<;:86534568;>@DCCCA>=>>ADEEEFGGFFGEA>?CGKMNOPOOPPNJIJLKJJJHGGIIJJJJKMMNJEDEHJJHGEFGGFEFGHGFDDDEFHIIIJJJIJKMNPSQQPONNMLJKLLLKLMLPPRTYhr~yjND2185010148<>@¤¤¥¥¥¦¦§¨¨§§§§§§¥§¨©¨§¦¦§§¨¨§§§¨¨§¦¦¦¦¥¥¥¥¥¥¦¦¥¥¥¥¥¥¥¥¥¥¥¦§§¦¦¥¥¥¥¤¤¤¤¤¤¤¥¥¦¦¥¥¦¥¦¦¦¦¦¦¦¥¥¥¦¥¥¥¥¥¤££¢¡ ¢¢¡ ¡ ¡¡¢¢¢¢¢¢¢¢¢¢¢¢¤¤¥¥¥¤¤¥¥¥¥¦¨«¬±²²³²²²²´´´´´´´´´´³³³²²²±²²³³³²²²²±±±±±°±±±±±±±±±±±±±²²²²²±±±±±°¯¯®®¬©¨¨§§¦¦¥¥¥¥¥¥¥¥¦¦¥¥¥¥¥¥¥¦¥¥¥¥¥¥¥¤¥¥¥¥¥¥¦¥¤¤¢¡ ¡ ¡¢¢¢¢¢¢¢¢¢¢¡¢££££¢¢¡~}||{{zzzyxwwwwvuuuvuutttsrqponmlkjihhgfdb`^]\[[\_abcehhmsx ¡¡¡¢¢£££¥¥¥¥¥¥¥¥¤¥¥¥¥¦§¨¨¨¨©©©ªª«®®¬¬«¬¬¬«««««««««««¬¬®®®¯¯¯¯¯°°°°±±°¯®¬«««««ª©©§¦¤¢ zzujUIIIDDBAABDFGFEDFGIJJIGFDDDGJLMMJIHHHHHHHGFGGHIJKKKKJJJJJJKLOPPOLJGEFGGGFC><;<=>BDDDDDEGLMOPSTUUTRQQRSTTQPPPPRSSURPNH@;:889886656899987688:<>?@ADCCDCA>=BDGIJMOOTUVY[\]^^^^^__``bbbceffffeefghhhjlnppqrsttssrpnnkifb`\YWTLFFHGC@AA@?=:88767888;>CDEHIJJJIIHHIIIIJHGGHHFEADB>DQcuz|{} ~~~{z{zz}}}~~~ |zz{} |unfdhloqtsrsvzz{z{~~|{z}}~~ wje_\]]ZWTRJD?>DDDB@?><;:===<:86544578:=>@???>;::>ADEDDEFGEFIJFB@DGJLMPQRSTSPKIIJJJKKJGGHIJKKKLMMOKGDEFHIHFDDDEEDEFGGGFDDDDEEEEEFHHHIJKMPPRRONPPMOOOOOPPPPSSVV[mzq^U?21361//39>AD£££¤¤¥¥¦¦¦¦¦¦¦¦¦¦§©©¨§¦¥¦¦§¦¦¦¦§§§¦¦¦¦¥¥¦¥¥¦¦¦¥¥¥¥¥¤££¤¤¤¥¦¦¦¦¦¦¥¥¤££££££¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¥¥¥¥¥¤£¢¢¡ ¡¢ ¡ ¡¡¡¡¢¢¡¡¡¡¢¢¢¢£¤¥¥¥¥¤¤¥¥¦§ª«®±±±²²²²²³³³²²²²²²³³³³²±±±±²³³³³²²²±±±±±±±²²²²²²±±±±±±±±±±±±±±±±±®¬¬«««¨¨¨§¦¦¥¥¥¥¤¤¥¥¥¥¥¥¥¥¥¥¥¥¦¥¥¤¥¥¥¥¤¥¥¥¥¥¥¥£££¢ ¡¢¢££¢¢¢¡¡¡¡¡££££¢¢¡¡ ~}}|{{{zzyxxwwwwvutuuuutttsqpoomlkjjihhfdb`^\\\\[\_abceghlqu} ¡¡¡¡¡£¤¤¤¤¤¥¥¤¥¥¥¥¥¦§§¨¨¨©©ªªª««««¬¬«¬¬¬«««¬«««««««««««¬¬¬¬®®¯®®®®®¯°°°¯®¬¬««««ªª©¨§¥¤¢ {zukVJJJFFDCBDDEFFEDFGHIHFDCAACEHJJJIIHGHIJJJIHHGGHJKKKLLLLLLKKLNOONJIFEEGGFEB><;;=>BDEEDDEGMNPRUVVVVUSRRSSSOOOOPRTTTRPPNJEDA@@><:8778998888:;=>>?@@@BBBBAACINPPQTVV\\^`aaaa``_`aaa`aabcfhjkjiihhiijlnopqrssttsrrpnnjhfca]ZXTKEGJIFEFFDA>:88778889=@CDFHJJJJJIHHIIIIHHHHIHFEDFA<GWfz~} }~{zz{{}}|~}{{{{ ~ysprtttywuuwyzzz{}~}|{{~~}|||{z| ~}} wkga^^^\[VTJFCBHIFEDA>=<<===<:876566789:;<<<;:888=?CDCCDFFEFJKIEDBDHJMPPPPPPMJGFFJKLMJHFGJLMMLLLLMLJIHGHIIFDDDFEDFGIIHEDCDDDDDCCCEEEGHJLOPRRPPPPPPPONOPPQRTSWX[kx wq\B2197447:>CG££££¤¥¥¦¦¦¦¦¦¦§§§¨ªª¨§¥¥¥¦¦¦¥¥¥¦¦¦¥¥¦¦¦¥¦¦¥¥¦¦¥¥¥¥¥£¢¡¢¢£¤¥¥¥¥¥¥¥¥¤£¢¢¢¢¢¢££¤¤¤¤¤¤¥¥¥¥¥¥§§¦¥¥¥¥¥¤£££¢¢ ¡¡¡¡¡¡¡¡¡¡¡¡¡££¤¤¥¥¤¤¤¥¦©«¬®¯°±±²³³³³´³³²²²²²²³´µµ³±±±±²³³³²²²²²±±±±±±²²²²²²±±±²²±±±±±±±±°°°°¬¬««ªª¨¨§§¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤¤¤¥¥¤¤¤¥¥¥¥¤££¤¤¢¡¡¡¡ ¡¢£££¢¢¢¡¡ ¢¢¢¢¢¢¡¡¢¢¡¡ }}}|{{{{zyyxxwwvwvttttttttsrqpoonmlkjihhecb_]\\\\\]`bbceggkot| ¡¡¡¡¡¢¢££££¤¤¥¥¥¥¥¥¥¦§§§¨©©ªª©ª«««««««¬¬¬«««¬««««««««««««««««««¬¬¬¬¬®¯¯¬¬¬¬«««ªª©©¨¨¦¥£¡ {yulVKKKGGEDDDDDDEEEFGHGDB@?>?ADEGGFHHFFGIKMMKJJIHIJKLMNOOPPMLKLMNNMIGFFFGGFEC?=<=>>CDEEDDFHMOQTVWWXYWVUTSSROONOPRSTUSPPOLJIGFDB><98888888:;=>???>??CIJJMORXY]`__abbbbdeffffbbaabb`_]^_bfilnnnmlkkklnoqrrssssrqponnmhhfdb`^\ZRLMNLLNLJGC>;::::;<<=@DDEGJKKKKJJIIIJJIGHIIIHFEFDABTfn ~|z|~~|}{} ~~~~ ~{z{|zyyzzyyyzz||{{||||}~}{zzzyyz~~zy} {qnjgdba`VWSSPLMKHHFC><;<:;::9876667788889:;:9999<>ABBBDEFGIJKJIIDDDGJNMKKKJJHGFEHIJLKHFFKNPOMLLKKKKJHGHHJHFEFGFEEHJJHEDDCCBBCCBBDDDFHJMPUTTUSPPQSSRQQRTUVVUZ\`nww`F53679>??DI¢¢¢£¤¥¥¥¦¦§§§§§§§¨©©¨¦¥¥¥¦¦¦¥¥¥¦¥¥¥¥¦¦¦¦¦¥¥¥¥¥¥¤¥¥¤£¡ ¡£¤¥¤¢¡¡¢¥¤¤£¢¡¡¡¢¢¢¢££££¤¤¥¥¥¥¥¥§¦¥¥¥¤¤¤££¢¢¢¢¡ ¡¡¡ ¡¡¡¡¡¡££££¤¤¤£¤¥¨«¬®¯¯±±±³´µµ´µ´³³²³³³³´µ¶¶´²±±±²²²²²±²²²±±±±±±±±±±±±±²²²²²±±±²²±±°®®®®¬««ª©¨§§§¦¥¥¥¥¥¥¥¥¥¥¥¥¤¤¤£¢¢££££££¤¥¥¥¥£¡ ¡¡¡¡¢¢¡¢¢¢¢¡ £¢¢¢¢¢¢¡££¢¡ ~}}}|{{{{zyyyxxwvuuttttsssrrqponnnmlkjihgeca_]\\]]]^abbcdggjosz ¡¡¡¡¡ ¡¢¢¢¢¢£¤¥¥¥¥¥¥¥¦¦§§¨©©ª©««««««««««««««¬««««ªª««««««««ªª«««««««««««¬«««««ªª©©¨¨§¦¥¥¢¡ zxtlVJKKGFEDEEDDDDEEEEFDA>=<=>@CDFFFGFFFGJNPOMLKJJJLMMOPPQQQNLKKLMLKHGFFGGGGFEB?>???CDFFEEFHNPRUVXYZ\[YWVUSQPPOOPQSTTRONMLJJIGDB?<8766778:=>BBBA@?@AAKPRVX\eknnnnnnnkkkkjihhedbbba_^[\^achlnqponmlmmpprrsrrqpnmkjiiheeddddcbb]WVUTTVOMID@>==>>>>??ADFGIJLMMMKJJJJJJJGHIIHFDDD?ENbsu ~~~}z|} }}{zxz||{z|}}{zzz{||}}|zzzxwz{~~}}~~ |z{ }wvtronmmcb]\XRRPJJHD?;8867777665777788878::::;;;<>?@ABCDEGIJJJJJHFDDGJIGHGGGHHGFEEGJJIGFJMPONMMLKKJIGFFGJIIHHHGGEHJJGEEFCCCCCCBABBDFIJMPVTTURNMPUUVUTTUVVWV\ahv~{`F>/18?CBDH ¡¡££¤¥¥¥¥¥¦¦¦§§¦§¨¨§¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¦¦¦¦¥¥¤¥¥¥¤¢£¤£¢ ¡¢£¤£¡ ¡£££££¢¡¡¢¢¡¡¢¢¢¡£¤¤¥¥¥¥¥¦¥¥¤££££¢¡¡¡¡¡ ¡¡ ££¢£¤¤¤¤¥¦©¬®°°±±±²³µ¶µ´´´³²²²³³´´´´´³²²±±±±±±±±²²±±±±±±±±±±±±±±²²²³²²±±°±±±¯®®®¬««ª©¨§¦¦¦¥¥¥¤¤¥¤¤¤¤¤¤¤¢¢¢¡ ¡¢¢¢¢£¤¤¤££¡ ¡¡¡¡¡¡¢¡¡¡¡¢££££££££££¢¡ }|||{zzzzyxxxxwvtttttttsrqqpponnnnmkjihgfdba^\\]^^]^abbceggknry ¡¡¡¡¡¢¢£¤¤¤¥¥¥¥¥¥¦§¨¨©ª««««««««««««««««««ªªªªª««««««ªªªªªªªªªªªª««¬¬««««ªª©©¨¨¨§¦¥¥¤¢¡ {xtmUJJJEDDCDDCCCCCCBCB@=:88:;>@CDFFFFGHIJNPPNMMLKKLOPPRRRRQOMKKKLKKIHGGGIIJIHFCBCCBCEGGFFHJNPRUVY[\^]\ZXVSQPOMLNPQRQPMLKKJJHGEDA>976557:>BDGFEDAABDN\cfllltpooppoopqqpnmkjihgeca_]\\]_abfknqqponmmmnopqqonnmjhdcbbbaaabdfghheb`^\YWPNJGDB@????AAABDHIJKLMMMLKJJJJJJIIIGDCBB@>O]mxx ~}}~}~ }{zzzz}~~}~~}{yyz|}}}~~|zzyxzz{}|{|~}}{{{zzxvurnfb^Y[ZONLJE@:623455666667888888:;:9;<;<=>?@ABCDFHJJJJJIIHFFGFEGFEFHHGEDCDFIHFDGJMMLLMNLLKJGEDCDEHIIIJJFHHHFDDEEEEFFFDDDDFIJLNPUVVVSPPQSUVVSRSUV[Y\`j| yc\<88>CDDF¡¢£¤¤¤¤¤¥¥¥¥¥¥¥¦¦§¦¦¦¦¤¥¥¥¤¤¤¤¥¥¥¥¥¦¦¥¥¤£¤¥¤£¡¢¢£¡ ¢¡¢££¡ ¡¢¢¢££££¢¢£¢¡¡¢¢¡¡¢¢£¤¥¥¥¥¥¤£¢¢¢¢£¡¡ ¡¡ ¤£¢¢£¤¥¤¥§«°±±±±±±³µµ´³³²²±±±²²³³²±±±±±²²±±±±±±±±±±±±±±²²²²²²±±±²²³³²²±¬®¯°¯¯¯¯«««ª©¨§¦¦¥¥¥¥¤££¢¢¢¢¢£££ ¡ ¢¡¡¡¢££¢¡¡ ¡¡¡¡¡ ¡¡¡¡¢££££££££¤¢¢¡¡ ~}{||zyxwwxwvvvutsssstttsrppoonnnnnlkihhfecb`]\\]^]]^abcdfhhknqw ¡¡ ¡¡¡¢£¤¤¥¥¦¤¥¥¥¦§¨¨©««ªª««ªª««ªªª«««««ªª©©©¨¨©©ªª©©©©©¨¨©©ªªªª««««««ª©©¨¨¨¨©§¦¥¥¤¢¡ |yunUJJIDDBABBBAAA@@>?>=976678;>ADEFFGIIJJLNOMMMMKKLPQRSSRRQPNLKLLLKJJHGHJJKJJIFEEEDDFHIHHJJNPRUVY\]_^\\ZWTRNLJJJMOPPOMKJJHGHGGFD@<86558=CHJJIGDBBCEQaimrokorooqqooqrqponnmmjhfc`\[Z]`bbcfjnppponllmmnnnnmkijhc`^^]^\\]_bfhhhhhgeb[TPMJIGECAA@ACDDDEHIJJKKLLMLKKKKJJJJHDB@@A>>Xjt{{ ~}|}~ ~ ~}}|||}~~~|zyz{}~~~}|zyzyzz{{|~ }~~~~~}{wttrlkhcdcVUSQOI?81124567756789:989;<;:<=<==>>@AAAEGIJKKJIGJKJIGFEFEDFGGEDEDBDGFDBCFJJJKMNMMMLJEA>>AFIJJLMIHGFDDDCEFGJKLKJIJKMOOPSW[\ZXZZXY\_^[YZ\bhfbcn|tYK?>CDDE ¡¢££££¤¤¤£¤¥¥¥¥¥¤¤¥¥¥¤¥¥¥¥¥¤£¥¥¥¥¥¥¥¤£¡¡£¢ ¡¢¡ ¡¡ ¡¡£¡ ¡¢¢¢£¢¡ ¡¢¢¡¢¢¢¢£££¤¤¤£¢¢¡¡¡¢¡¡ ¡ ¢¡¡¢£¥¥¦««¯±±±±²±±±³´´´´´³²±±²³²±±±±±±±±±±±±±°°±±±±±±±±±±±±±±±±³³´³³³²²¯¯¯®¬«««ª©§¥¥¥¥¦¥¥¥¤£¢¢¡¡¡ ¡¢¢¡¡¡ ¡¢¢£¤¥¥¤£££££¢¡¡¡ ~}|{zxvvvwwwvuttsrssssssrrqponnmlkkkihhigbca_^]\]^__``abdfjhlnry{ ¡¡¢¢¢¢¢£££¥¥¥¥¦¦¦¦©ª««««ª©ªª©©©©ªªªª©©©©¨¨©©©©¨§§¦§§§§§§§§©©©©©©ªª«ª©¨©©¨§¦¥¤££¢¡¡~xumVJJIDDDDDB?>??>>?>=:877789<>@CEGIJLMLLLMNNNMMMNPSRRSTTSRPONMMMMMJJHHJLLLKJIHIIGEEHJLLKKLPQSUVX\^_^^]\ZWUPPPONNOPMOONKIHIKKLJHC>:89?FHFINKJHEDDIM`fmponprqqqqpopponnllkkklihgb\\_dffeehknnnnmkjihjiiijkjieba`^]\\Z[\^acfhhihghgaZVRJHEDF>@??ADFGGJJJJIHIJKJJJJJJJJGFD@@A@AG[lv| } }~~~~}|{|}}}}~~~~~~~}zzyyz{}~~~~~{z|}|zwttpomkjifc_^XPNMF=:8568::9855778989:;;;;<<>?@@@@BCDGHHHGEBFJJJKJHHJIHGGFDCDDDEFECA@CFJKLKJJJLOMHDD@>@DIJKKJIGFFEDDEEEHJLMNLMPSVVWXbdhmqssqpnnrsqrvyyyyz~rhVSMGKI ¡¢¢¢££££¢££¤¥¥¥¥¥¥¤¤¡¢£¤¤¤£££¢¢¢££¢ ¡ ¡¡ ¡¡¡¡ ¡ ¡ ¡¡ ¡¡¢¢¢¡ ¡ ¡¡¢£¤¥§¨¬®°±±²²³²²²³³³³³³³²±±±±±±±±±±±±±±±±±±°°±±±±±±±±±±±±±±±±²²²²²²±±¯¯®¬¬«««ª©§¦¥¥¥¥¥¥¤£¢¢¢¡¡ ¡¢££££¤¥¥¤££££¢¢¡¡ }}{zzywvvvvvuutttsssssrrrqonnnmmlkkjhhhigcb`^^]]]__`aabdfhkimmqxz ¡¡¡¢¢¢¢££££¤¥¥¥¥¦©ªªªªªª©©©¨¨¨¨©©ª©¨¨©©¨§¨¨¨¨¨§§§§§§§§§§§§§§§¨¨©©«ª©¨¨¨§¦¥¥£¢¢¡ |wunWJIHDDDDCBA?>===>=<:8778789<>ADEJLNONMMNNNNNNOPQTTTUVUTSPPONOOOOKJIJKMNNNNMKLLJIIJNOONMNPQSUVX[]]]\\\[YWTSRQPPPPNOOMKJKLKKKJGD?=;BIKJKMOOMKLMPV[gjnqrrrsrqqppoonjjihijlmjhhgc`adfhhgghkmlkkihhgghgghiihhb`^]\[Z[[\\^`bdfghihhhd_\YRPKHHA@?@BEHIIJJJIHGHHIHGGHHIIHFEDB@?=GReov} |~ ~~~~~~~}zzyzz|~~~~}|}~~|||zyqqrrqpooonnllljhfgc\URNIJC>=>=;::766447789::::;<?@AAAABBDFHHGFDADJKJJJIKJJIHGFEDFHJJIGEDABDGIJJJJJKMMJHFCAADHJJKKJJJJHFDDEFIKMMMJNRVWZ_cemyve`WKLO ¡¢¢£££¢¢¢¢¢£¤¥¥¥¥£¢¡¢¢£¤¥¥¥£¢ ¡¢¢¡ ¡¢¢ ¡ ¡£¤¥¦©«®¯°±±²²³²±²²³³³²²²±±±±±°°°±±±±±°±±±±±°¯°°°±±±±±°°°°±±±²²²²²±±±±°¯®¬««««ª¨§¥¥¥¥¤££¢¡ ¢£¤¥¤¤¥¥¥¥¤¤¤£¢¡¡ }|zzzyxvuuttttttttssssrqqpnnmmmmlkjihhhhgc_^]^^]^_``abceghmjmmpvx| ¡¡¡¡¢¢¢¢£¤¥¥¥¥¦¨©©©©©©©©¨¨§§§§¨¨©¨§§¨¨§§¦§§§§§§¦¦¦¦¦¦¦¦¦¥¥¥¥¦§¨©ªª©¨§§¦¥¥¤¢¡ {wvn[KHGDDDCABA?=;;<<<;:8889889:=?DEJMOPONNNMNNNOPQSUUVVVVUTPPOOOOOOLKKKNOPPPPPPPPNLKNPPPPOOPRTVVWY[ZZZZ[[ZYVVUSQPONKLLLKJLMKKJIFC@??JQPMOPOPNOTX\agmmnpsssrqpooonmkfeeegilnkihhecdhikkjijklihhfeeddddeghhge_]\\[ZYZ\\]_abbcdghhhhgdb_YXQJIC@@ADFIJIJJJIHGGGFEDDEFGGGEDDC?>>Vctuw~ ~ }{ ~~ }|{yyzz{}~}{zyz{}~~|zyxvtnnmlkkkkkkkklnmkjmle\WVVSJB@A?==;8762134678899:;>>@AABCCDFHGFDB?BIKJJIJNKKJJIHHHKNPPNJJJDDDEFHIJKKKKMMKIFEEHJKKKKLMMMKIGDEGHJKLMMPTVX\cknwwocMDG¡¢££££¢¢¡¡¡¢£¤¥¥¤¢¡¢¢£¤¤¥¥¥¤¢¡¡¢¢ ¡¢¡ ¡ ¢¤¥¥§ª«®¯°±²³±±±±±²²²±±²±±°°°¯°°±±±±±°°±±±±°¯°°°±±±±±±±°±±±±±±²²²±±±±°¯¬««««©©§¦¥¤¤¤£¢¡ ¢£¤¥¥¥¥¥¥¥¥¥¥¤¢¡ ~}|zzyxwvuuttttttttsssrrqppnnnnnmlljihhhhec^]]^^]]_`abbceghmknmouw{~ ¡¡¡¢¢¢¢¤¥¥¥¥§©©¨¨¨¨¨¨©§§§§§§¨¨¨§¦¦§§¦¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¤¥¥¥¥¦§¨©©¨§¦¥¥¤¤£¡ zwwp^LGGDECC@@@>=;;;;<<;;:;<;;;;=@DFJLOPONMMLMMNOPSTUVVVWVUTQPPPPPPOMLLMOPQQPRRRRRPOMOPQQPPPRTVVWWXYWWWWXXYYXWVTQNLJIJKKKJJJKJIECAAAGPUROPQPRPT\bdgknnnoqrpopnnnnmjhedccfhmnonljhfgjmnnmlllkihfedcccddeghhec]\[[ZYZ[\\]_abbbceffghhfb_[[SJHD?@ADFHIIJJJJIHGGFEEEFFFEDDCDB>>Dfp{yx}}~ ~~ ~ }} ~|zzxyzz{}~~{zwutuwyvwwutsqonmkjjjjjijjkmnnnlmmib]]`YNDDDB@@=8773111235789:;<=>@ACDDDDFFEDA?@GJJJIILKLLKJJJLNPSSRPPPIHHGHIJKLMLJKNNKIIJLNONLLMNNMLJJFFGGGIKNQRUVX]gopx~t\JI¡£¤£££££¢¢¡¢¢£££¢¢¡¡¡¡¢¢£££¢¡ ¡¡ ¡ ¡ ¡£¥¦¦§ª«®¯±±²³²±±±±±±±±±±±±°°°°°±±±±°°¯°±±±±°¯°°±±±±±±±±±±±±±±±±±±±±°°¯®«««««©¨§¥¥¤¤¤£¢¡ ¡£¥¥¥¥¥¥¥¥¥¥¤£¡ ~|{{zywuuuuttttttttsssrrqpoonnnmmlkkjhhhfdb^]]^^]]^bbcddfhhmknnpuvz~ ¡¡¢¢¡¢¤¤£¤¥§¨§§§§§§¨§§§§§§¨¨§¦¥¦¦¦¦¥¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¦¦§¨¨§¦¥¤£££¢ {xyraMGFDECB?>>>>=<;;<=====>>===>?CEJLOPOMLLLMNOPQTUVVVWWWVUTSRRRQPPLLKLNPQRQSUTTTSQPPRSSSSSUVVWXXXXVVVVVVWXYXVTQNKJIIJIHGFFHGDB@ACDQUVVSQRSVV\fllkmnnnooonnnnlllkhfddcdgknqsqonljkmnnnnnnmkjhfeddccdcdeeeba\[ZZZYZ\\\]_abbbdccdfgec_\XXQIGC@ABDFGHHJJJJJJIHGGGHHFDDCCAA?;@Mnrzxwzy{}~ }} }} ~|zzzzz{{{|~}}|zwtrqqqknoopponiihijklmmnnnprrppnmlhdbb_VMKJGEEB:76311001589;=>=>>@BCDDBCDDDB@?AGJJKJIJJJJJJJLMNNOPRSSRLLKKKKLLJMNKKNPOKKJKNPPPPPPOLJJJHIJJJJKMQRTX^grzw yd`¡¢£££¢£££¢¡¢¢¢¡¡¡¡¡ ¡¡¡¡¡¡ ¡¤¥¦§¨©ª«®¯°±²³³³²±±±°°¯°±±±±°°°°±±±±°°¯°°±±±±°°±±±±±±±±±±±±°°±±°°°°°¯¯®®¬««ªªª©¨§¥¥¤¤¤£¢¡~}}~~~ ¢¤¥¥¥¥¥¥¤¤¤¤¢¡ ~|z{zxvutuuttttsssssrrrqpoonnmmmlkjkjhhhebb_^]^^]^_cdeffhhjmknnqvvz~ ¡¡¡¡¢£££¤¥¦¦¦¦¦¦¦¦¦¦¦¦¦§§§§¦¥¥¥¦¦¥¥¥¥¥¥¤¤££¤¤¤¤¤¤¤¤¥¥¥¥¥¥¥¦¥¦¦¥¥£¢¢¢ |yzsaLFFDDBA>>=>>>=<;<=>>>>>>>>>>?BDJLOPONMMMNOPPRTVVVVWWWVVUUTSRPONJJJJLNPRSUVVUVVUSSUVVVVVVWWXYYYYXWVUTUVWZYWUQNKJIGDB@?@@A@>>>@DHXVVWUQSW\^dlqqonnooonnnmnmlkkihfddegimprttsrpoopnnnmnnnmkihgggfedcbaba`_\[[[[Z\]^]]_abbabaabcca^[YVVPIHCABCDEGHHJJJKKKJJIIIIHFDCAA?>>9ASoouwwyx||}~~~ ~ ~ ~}||||{zz{}~|{|~{zwtrqonjmnoooonmmnnnnopsttssttrtqnnmjfbb\VSPMJJI>8621110269<>@ABAAACDDDBBBCCA@@DIJKMLIHGHIIJJKKJIIJORSROOONNMLLJLMLKLOPLJHFILPQSSQOKJJJIJMNONMMLPW_hr ¡ xt ¡¡¡¡¢¢£¢¡¡¡¡¡¡¡ ¡¡¢¢¡ ¢¤¥¦§¨ª««¬®®°±±±±±±±°¯¯¯¯®¯°°°°°°°°±±±±±°°±±±±±±±±±±±±°°°¯±±°°°°°°¯¯¯¯¯¯®®¬¬««ªª©©¨§¦¥¤¤££ ~|zzzzxwyyyzz{{{~~¢¤¤¤¤¤££¢¢¢¢¡ }{zzzxvuttttttsssssqqqqpoonnnmmmmlkkihhgdbb`^]^^^_acdfghhjkmkoorwvz| ¡¡¡££££¤¥¥¦¥¥¦¦¦¦¥¥¥¥¥¥¥¦¦¦¥¥¥¥¥¦¥¥¥¥¤¤££££¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¤¥¥¥£¢¢¡ }zzs`KEEDC@?>>>>>>>>=>>?>>>>>>??@ACDJLNONMMNNOOPPRTVVVVVVWWVVUTRQOMKIHHHILOQRUVUTUVVUUVVWWWWWWXXYYYYYXVTSTVWXWURPLJIEC?;888988878>DHVVVWVSV\bfjnqsroqonmmmlklkjihhgfdefhjmoprstttssrnnlkmoonlkjjkkjifda__```_____^`bb`__```_^_`bba^\YYVUPKJB@ABCDFHHJJJKLLJJJJIHGFDDBB???9AVnovwxzy{z| |}~ }{z|}|zz|~}{zxvtsrpooqrqqsttxxxutstuwxwvtttsttsrrqmidda[UPMJJ@:84111137:=?BCEDCBCDDDDDCDDBBCEJJJLKIIGGHIJJJJIFDEJPQRPPPONMLLLKKJIHHJIGDCDJMOQQQNJIJJLLNPPQPPMWdmqy£¥¢¢¢¡¡ ¡¢¢¡¡ ¡¡¡ ¡¡¡ ¡£¥§¦§§©«¬¬¬®®°±±±°°®®¯¯¯®¯¯¯¯¯°±°°±±±±±°±±±±±±±±±±±±°¯¯®¯¯¯¯¯°°°°°°°¯¯®®¬«««ª©¨¨¦¥¥¤£¢¢¢|{|{zxvvwwvuvuuvxyxxyzz|} ¢¤¤£££¢¡ }{zyyxwvutttttsssssppppoonnnnnnnnmmjhhhgdbb`^]^^^`bbcefhhjlmlppswvy{ ¡¡¢¡¡¡¢£¤¥¥¥¦¦¦¦¥¥¤¤¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤¤£££££¤££££££££¢¢¢££¤¥¥¢¤¤¤£¢¡¡}zzr_JDDCB>>=>??>>>>>?@@@????@ACCDEFJKMNMLMNNNOOPQSTUUTUVVVVWVUSQOLJHGFFGJNPPRTSRRTUUUVVVVVVXXXXYYYYYWVSQRUVVURPLJHGCA>:8644332249@EQUWXVV\bhlnnossqsoljjkjiiihhfeeeffhhjlmmprttttsrnmjiloponmlmnonmhfb_`abcdcccccdgdb`___^]]`bdcb_^XYVVPMJ@>?@BCEGHJJJLMLJJLJIGFFEEDD@AB;AVlowwwzwyy{ ~ |} ~|{}|zyz{{z{yvtrqonopqqswz|}~}zvtvyz{zywvttsuwwwxvsmomcZSMIF?==8211137:=?ACEDBABCDDHFEEEDDEEJJJJJIJIHIJKKJIHECDHMPRQPPPNMMLNJIIGCABDDDCDHJJNOOMJJJLOMLMPRSTUctzy{ ¤¥£¤¤¤¤£¡ ¡¡ ¡¢¢¥¨«¬««««®®¯¯¯°±°¯®¬¬¬®°°¯¯¯¯¯°°°±±²±±¯¯°±±±±±±°±±±°¯¯¯¯®®®®¯¯°®¯¯®®®¬««ª©¨¨¨©¨¥¥¤ |}{yxxwvtsrpooppqtronnqrrttwww|¡¡¢£££££¡¡ |zzzxxwvuuttsttttsrqqqpoonnnnnnnnmlkkjhhhfca__^^_`abdefhhjlmmnpstwyzz}¢¡ ¡£¤¤£¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤¤¥¥¤£¤£¢¢¢¢¢¡¤¤¤£££££¢¢¢¢¢£¤¤¢££¢¡ |zuq]EJA?@==>>>?AA?>??@@?@AABBBBBCDEJJLMMMNNPOONOPRTRSTVWXWWWVTSQOMKIGFFGILPPQSRRRSRUUVVVUTTUUTTVWXXXWUSQPPPQPNKJGDA?=:88521.,/138?ALQUUV_inoopqqqppqnjhgghiihgcbdfffgggghjknpstttttnmihjnponnnnopponkgcbdghjihhhhjkifba_]^`^beedcb`]][YWTNIDCAADFHIKKLMMLJJIIJJIGEDEDFAAEJZosvwvuwyz{ }{ ~~ ~} ~}~}|{{zzyyzyussoklkpqw~}zywxxyzzxxyxvuttuwwtsoomhc]TJF<:844247889;=>@DBABBBDFIJJJJIGGJIIKLKJJJJIIJJJIIC>AFJLOPONMNMMLNOKFCCB?ABBCDEHJKKJKMOQSSRPPTW\bchsy|}¤§¨¨¨§¥¥¥¥£ ¤¥¥§«¯®®¯¯¯°¯¯¯¯¯®¬¬¬¬®®°°°°°°°°°°°±±±°¯¯°±±±±±±±±±±°¯°°¯¯®®®®®®®¯¯®®««ªª©¨¨¨¨§¥¤£ }||{zyztsrstvvunkgb^\_cljhgfehjpqtuuz~ ¡¡¢£¢¢¢¡ ~{zyyxwwvuttttttttsrrqppoonnnnnnnmmlkkihhgeca``__`abbdefghikmnnqstvxz{} ¡¡ ¡¢£¤£¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¥¥¥¤¤¥¥¤¤¤£¢¢¢¢¢¡£££££¢¢¢¢¢¡¡¡¢¢¢¢¢¢¡|ytq]EH@>>;<==>?@A@???@@@ABCDDDDDDDEIJKLLMNOPPOOOPRSQQSUVWWWVVSQPOMLJIGGGHJMOQRRRRRRSSSSRQQPPPPQSVWXXWVTQPONPMJIFDA?><:8741..-014;BDJNQV^hottttsrpnnmjhfedfhhhgddfhhgggffgijmnqsttsrnmjhkoqpnmmmnopprpnlmnopnnnmmmmmlhdb`^^_bcdedcb`]\ZXVVQNIGEDFIJJKKKLLKJJJJKJJIGFFDEBDGM`qstuuuvwxz}}| ~} ~ }~~~~}|{zz{zxvtqmnmpqv}}}zwuuuwxwuuutsppppqqqqqokfb]ULJ=888855788;>>>>BAABCCDFJLNNNLKJJJJJLLLMMLKKJJJIJEABEILNKKLLMMMMOPMIFED@BCDFHIJJJJJJLNPRRSSUY\_eimuz¤¦¨¨ªª©¨¨©§¥¥¢ ¢¥¨ª«¬®±±°°±°°¯¯¯®®¬¬¬¬®®¯°°°°°°°°°¯¯¯¯¯®®¯°±±±±±±±±±°°°°¯¯®®®®¬¬«©©©©¨¨§§¦¤£¡ ~}xvttrpqsmkigc_ZVQKDA>;>CJKPTW[bilnqttvz ¡¡¡¡ }zyxxwwvvuttttttttsrrppponnnnmnnnmlkjjihgfebaaa``abcddeghhjlmnprtuvxz{} ¡ ¡¢£££¤¤£££¢¢¢££££££££¥¤¤¤¤¤¤££¢¢¢¢¢¢¡££¢¢¢¢¡¡¡¡¡ ¡¡¡|vrp\EC>><9;;;=>@@@@>>?>?@BDDEFEEEEFIJJJKMOPQPPPPPQRQQRUVXXXVTRPONMMLJIHGFIJOPRSRSRQRQPPONNMLKKMPRUVTTSRPOMLMJHEDA>=;988630---014=DFJJNYfpuwwvutqnljhgedcbehhhhffghhhhgeefhhkmpstsrrpnkiknoonmkklnoprrrtuvvuttsrqonnnjfdcbbbefedccb_\[XVUUSPLJHGGIJJKKKJJJJJKKLKJIHFEDCADFOfsstuvvvuxz|~~}}|~ }} }|~ ~}~~~ ~|{{z{{ywurnonqptzz|{zywuttuuvvttsrqqqqpoprspnieb_YRM>87:>=>9:;=?@?>AABDDDFHJMOPPONMLJIJJKMONNNLKJIIJIDCDHKLIIJIHIJLNONKJIEBCDGJLMMLMLKJJKMNPTVZ_achqsx| £¥¨©ªªªª««ª§¦£ ¡¡¡¤§ª«¬¯±±±±±°¯®¯®¬¬¯¯¯°¯¯®¯¯®®®®¯¯®¯°°¯¯¯¯¯°°°¯¯¯°®®®¬¬¬¬«««ª©©©¨¨§¦¥¥¡ |zyywtqpnkiijigbYM@8,""! !*;IQX]bhknqtuy}~ ~|zywwwvvutttsttttssrrppoonnnnmmmmlkjjihgfecbaaa`abbcdfghijkmnopstuwyz|~ ¡¢¢¢£££¢¢¢¢¡¢¢¢¢¢¢£££¢¢¢££¢¢¢¢¢¡¡¢¢¢¢¢¢¢¢¡¡¡¡ ~|upo[F>==98;:;<>?@@@>>>>>?ACEEFGFFGGJJJJKMPQSRQQQPPPPPQSUVVVUSPNMLLLMKJJGFGJOQSTTTRPPPPPONMLJIHIKOQRPPPOONMLLJIFDA>;8875421/./258@HIJIM\jsvwvutrnlihffeeddfijihhghhhihhfeefgikostsssspmjjkllnljiiknopqtvxyxwuutsqpoonlhhhiihijhebb`^\ZVSQQPMLJHGGHHHKKJJJJJKJKKJJIGFDDAAEEPittuvwwwwyz}~}||||}}}|} ~|} ~~ ~~} ~|zzzzzzywvtqrpsrtxwywvuutuvvvwwvutttsrpnnnnonnlihheb[KD>;>>A>>>?@AABBCDEFGHIIJNPPONMLJHHHIKNNOOMKJJJKKHDDGJKJJGDABFJKKKJJJGDDFILOPPOONMKJJKKOSW\bcfkqrw{£¥¨ªª««««¬«¨§¤¢¢¢ ¡¥§©««¬®°°°°°±°¯®®¬¬®®®®¯°°¯¯®¬®®®¯°®¯¯¯®®®®¯¬¬«««ª¨¨¨¨§¦¥¥¤¢~{xuttskc`^ZWVWWWTLA5-*!"'&%&'17>KW^ehjntuw{~ }{zxwvvvutttsssssrrqqqppoonnnmlmmlljiihhfecbba````abdefhhjklnnpqstvyz|| ¡¡¡¡¢¢¢¢¢¢¡¢¢¢¢¢¢¢¢¢¡¡¢¢¢¡¢¢¢¡¡¡¡¢¢¢¢¢¡¡¡¡ ¡ ~|upo[I9<=9:;;;=>>??@?>>==>?ADDEFFGHHLLLLLNPQRRRRRRPPOOOPRSTTTRPMKJKLLLKJIGHJPRTTUTRPNOOPONLKGFEFIKNPONNMMNNNMLJIFC>:87543322138=@GLMNLQ^ksuvutromjhhggfggghkkjihhhiikkjhgeeeginrtstuusoljijknnljjknoqrtvxxwvutsqpppponllmnnnnnmhca_^ZYVRPOMJKJIGGGGGJJJJJJJKJJJJJHGFEFCDFETkstvwwwxyzz{}}}||zzz{|}||}~ ~}} ~ }}~~~~}zyz{zzzxxxwutsutuwtvuttttttuwxyyxxxyxvtrqqonnoqrsttspd]PC<:>?@BCCDDEBDEFFGGGFIKMNMMLMJIHGHJLNOOMKJIJLLJDDGJJKJHC>>CFIHHHJJIFGHJLNPPPNNMMMMNNOSW\behnsx¢¥©«««ªª¨¥¥£ £©ª«««¯±°°°°±°¯¯¬¬¬®®®®±°°°¯®¬®¯®®¬«««««««««¬¬¬¬«¬«ª©©¨§§§¦¥¥¤£¢ ~}|z{zwtttsrgZTQNKLMLKHB:3/)%#%%$%(*+)%(7JVaghjrtty~ }{zxwvuutttsrrrrrqqppppoonnnmmllllkjihhgedbbaa```abcdeghiklmnoqrtuwz{}} ¡ ¡¡¢¢¢¢¡¡¡¡¡¢¢¢¢¢¡¢¢£¢¢¢¢¢¡¡ ¡¡¢¢¢¡¡¡¡ ¡ ~~|vqn[M8;<9;::;==>>>>?>>=<=>?BCDDEFGHLMMMMNPPPPPRSSQPNNOPQRSSSQPMJJKLLLMLJJJLQRTTTTRPKLMMMLKKFEDEGJLMOONNNNNOMLJIFC>:8754456656>GJMPQTTXbkruwvtqnkjiiihhhihikkihhhhjmmnmligecdgkprrtvxtqnljlnponmmnpqtttuuttssrponoppoonnnppopqokfb^\WWURPPMJIHFEDDDDIJJJJJJKJJJJJIHGDEDEDEYmrtwxxwxyyyyzzzzzxxyz|}}{~ ~ ~|}~~~~}zzz{xwvuvwxxusvuttqrppopqsttwwyzyxyz|zwvutspnqtwzz{{yqnbQGBDBCDEEEEEBDDDDEEEFGJJKLLMMLJJIHIJLLLKJIHHKKJFEFHJJJJFA?ADFEEEGIJJIJJKLNPPPPOONNNOPTV[bfiov£¦ª¬¬®¬¬«ªª¨¦¦¥¢ ¢¥ªª««¬®¯±±±°°±°°¯®®®««¬¬¬¬¬®¯¯°°¯¯®®®®¬¬¬¬¬¬¬¬¬¬««««ªª«ªªª«¬««¬¬¬¬«««©¨¨§¦¦¥¥£¢¡ |zxwvqtqjhihdZPFA=721752/+'%$%%$#"!"% #%&%)6C\gihosty} ¡ }{zxwuutttsrrrrqqqpppopoonnnmmlllkjihhgfecbaa`aaabbdeghiklnnopstuvxz|~~ ¡ ¡¡ ¡¡¡¡¡¡¡¢¡¡¡¢£¢¢¢¢¢¡ ¡¡¡¡¡ ~|zxrnZP5898:7889:::;<==<;:;=>@ABBCDFGKKMMNNOOOOPQSRPNMMMOPRRRRQPMKKLMLMOOMKLOQRSRSRPNJJJJJJJJFEDEFHIJKLLMMMMMJJGEDA=:8877778889DRVUVWZ[]bhptuutpmkjkkljijkkkkjheeefilnopomhebcejoqpsvzvsoljknpppoopstutttsrpnnmmlllmnmnnmmnonoonkgb\WTTRPONKJEDCB@@@@FHJKJJJJJJJJJJIHDDDFBF`otuwyzyxxxwwxyzz{zyz{~~} ~ ~||~~}~~~}{zyytsstuvwwvtvttsnpnnnoqtuuvvxxwuvxvutssrqqrstx{{zzunmh_XRSJHEDDDDCADDDDDDDEEFGHIJKLKKKJIIJJJJJJJJJKJHGGFGIIJJGC?@BDDDDEGIJJKLLKLOPRQPPONMMRSTX`einu ¤§«¬«¬¬««««©©¦¥¥¦¥£¢¤¦©ª««¬®¯°±±±°°°¯¯®®®««««««¬®¯°°¯®®®®®¬¬¬««««««««««««©ªª©©ª«««««¬¬¬¬««««©§§§¥¥¥¤¢ zywtronlhkf\VVRKJD?>8.%"! !# !"!$&!+>Yhkhnrtz} ¡¡ ¡¡ }{zywuttttsrrqrqqppppoooonnnmmkkkkjihhgfdba```bbbbceghikmnopqrttvwyz|}~ ¡¡¡¡ ¡¡¢¡¡¢¢¢¡ ¡¡¡ }{zxsnXQ36768245677788:::999;<?@@AACDFJJLMNNNNOOPQRQNKJJJLNPPPQQPNLLMOMNPPOMNPQQQQQQOMJJHHHIJJHGFEEFFFFHIJKLKKHFDB@><:88888888=>J\`\\]]__`fnrrtrnkjkmnnljkmmkkifbbbbfioqsrniebdeinppsw{xtpliiloppqqrtuvvutsqnmhhhiiiiiilmkkmnnnmkihb[TPPPMLJIGDCB@>>>>DGJKKJJJJJJJJJIIEEDHAIgtvvwz{zyvxxwxyz}~{{{| ~~ }~~ ~}{|}}}}~}}}|{ywurrstvwxxzvxvtsortsrstuvvvvwwussuttssrstuxvvy||yvujhgca[YUMD@@AA@BDDDDDEDDDDDDFHJJJKLKIIJIIJLNPOOJHGHHFGIJJIEA>?ABBCDDEGIJLMMKKNPPPPPPOOORRRV^chmx£££¡ ¡¤§ª««¬¬««««ª«§¤¥¥¥¡ ¢¥¥ªªª«¬¬¬¬®®¯°¯¯¬®®«««««««°±°¯¯®®®®¬«««««««««««««ª«««ª©©««¬«««««««ª¨§¦¥¢ ~{ywrppmifb[WRKD=9:<<:72+$"! "!%%%/;Rnfhotvv| ¡¡¡¡¡ }{zzxvuuttsrrqqppppppppponnnnmklkjjiihggdba`aa`bbcdefhhklnnoprsttvxy{}~ ¡ ¡¡¡¢¢¢¢¢¢££¢¢¡ {yywpZS..310+//01456688888:;<@@@@ACDFIJKLLLMMJLNPQPNKJJJKMPPQQPPONMMMOPQPPNNNPPPPOLJJGFFGHHIJJJIGDDDFDFIJJGFFDB>==<:8:98889;<>FPX\\]_^]]^achmonnnpqqpppppponmhb___^afnrttpmifhhkopprvyyxtnjhhknqsrrtuuutttqnlhhhhgfeeghijjijjjhhhfd]TPPGDCDFCA??ACA?>AFJLKJJJJJJIIIIIIFEEIWlyvwyzzyxwxxyz{}~ ~~}|{|} ~~~~ yyz}~}~~xsusrrsuxyyzzxvtrtvuuuuuttrutssttttvutsstuvxyyzywutqqnlni_YWL>DE>@ADFFEEDBDCCCDFGGFIIJJKKJIJJLMNPRTNLJHGGGGFFFDCAA@BDEEEGGGJLNNNOOOPQQQPPPQRQPVY^ijz¡¡£¤£¢¤§ª«««¬¬««ªªª§¥¤¥¥£ £¥¥«««¬®®®¯®¬®««««ª«¬®®®¯¬¬««¬¬¬¬¬««««««««««««««ª«««ªª©ª«««««««««ª¨¦¤£ ~|{yusronkhg_SPG;0& "%'('%#""#%-6Edemqpsz| ¡¡ }zzywutttrrqqppppppooooponnnnmkkjiihhgffdb`````bbcdeghikmnnpqrttuwxyz|~ ¢¢¢¢¢¢¢¢¢¡¡ {xxvo\Q1,1.,*+,-/1121333468:;>>>??ACDEGIJJJJKLLLMOONMJJJKNPQQRRQPPOOOOOPPOONNONNNMJIIHGEFGHJKPONKGDDDDDDEDA@A=<:99:<=>=;99:;<>GQY\]^^^\\]^bgllmnoqrrrrrrrqpnlic`__]aekorsqnljiilopoqtuwwuqlhfiloqqrtuuttsrpnmkjjihhgffghhggghfcdfffaYWSGA?@C?>>>@BA@@CGJKKJJJIHHHHHIIHIFDL_owwwxxxxwwwxyz{}~ ~~~ ~~~}|}~ ~~~ |zz{~}}~yttrssttwyzxxwwuttuutttttttttssssttutsrrtuvyyyxwusrprqopld_VN>;?ADFIJGDDDCDDEGIJJJIHIJKKKJJJLNOOPSURPLJJJHFGFEDDB@>>ADEEEFGIKNMLMOPQQQQPPPQQQQVW\jnz¢£££¤¦¨¨ª«¬¬««««ª§¥¤¥¤¢¡ ¡¤¥¦«««¬®®¬¬®¬«¬¬¬«ª««ª««¬««¬®«««««««¬«¬¬¬««««««««««««««««««ªª¨©««««ªªªª«ª§¥¢|zyxtolgc]VVYP@J@3+('&%"$%$! !$*/;Xanrnq{| }zyxvttsrqppponoooooooooonnnmlklkjjihgfdca`````bcdefhijlmnoprstuvxyz{|~ ¡¡¡¡¡¢¢¢¡¡ ~{xwtn^K2'-+(*))*+-/..--./1478:;<=>>@ACDGIJJJJKKKLMNOOLKLMOQRSRRRRQPPPNMMMNNMMNMLLKIGGIFEEFGIKPQPNJGEDA@>><888555568>AA?=:9:;<=GRWZ]]\\\[[\^chiknrstttttttspnlida`_]`chlopponmlkmnonortuvvtnhegimnoprtsrponnmlkkjihhgfddeeeeffa^^acfd^_WJB?>@>=<=?ABBBDHJKJJJIGGGGHHIIHKFDRhtuwwwwwwwwwxyz|~ }|}~~~~~ ~~~~~~|{z{}~}}~|xurqrssstvxzzzzyvuuutttttttttttttttsrrrstvwyxxwvttsuyzz{zxwsjVA@ECDJHDDDDDDGIKMMLLLJJLLLLMNMOPPPPRUSQOOPQPNKJIIIHDB>>ADDDDGGJLKIIKLNPQQQPPOPPQVV[ipz ¢¤££¥¦§¨ª««««««©¨¦¥¤££¢ ¡ ¡£¥¦§ªª«¬¬¬¬¬¬«««««ªª««ª««««««¬«««««««¬««««««««««««««««««««««ªª§¨©ªªªª©§¨©¨¦£ {yvusnif`[TNMPF791)%&%#! ! $')8P[ipprz| |yxwuttsrqppponoooooonnonnnmmlkmlkjihgfdbb```aabcefghjkmnopqrttvwxzz{} ¡¡¡¡¡ ~{xvrl_D0!+*&*(()+,,,,*)*+,.1246889;>?@BDEGHJJJJKMNOOOLLMNPQRRRRRRRQPPMLLLMMLKLKJJIFEEGFEEFFIJLNONLJGEA><:731000125:@DC@>;:;<=>JSVW\\ZZYYZ\]achlqtuutuvuttsqnnjfccb``bhjlmmmmlkklnnnnputttrnjgegiklmoponmlkjjjjjihhgfffggggfee_ZY\`deab[PGD>?=<<=>ACDEGJJJJJIHGGHHIJJJJLIJ[nuvyxwvvvwxwxz{|}~~|~} ~~~}||}}|}|}}xuuqqqqpooqrvuuwwuttttsssrqqqstuutssqppqrtvwuvvvvvww|}tbGDI@AE@>@CEGFIKMNMLNPNPPOMNPRPQSQPNOPPPPPTVVUVVUVVURPD@?BCBDGGJJJGGGFILPTTROMOPQUUYhnz ¡¡¡£¥§§¨©ªªªª©©¨§¥¤£££¡¡ £¥¦¨¨ªª««¬¬¬¬¬¬¬¬¬««ª««ªªªª«««ªª««««««««««««««««ª©©ª««ªªªªªªªª««ªªªª§¨¨©©©¨¨¥¥¦¦¥¡ xtrqnieb\VRPMG;--)%%&$!"$$0JXdkrty{~zxwvuttsrqpppoooooooonnnnnnmllkkjihhgedccbbabbbdefghikmnnoqrstuvwyz{} ~}{wtqjaC0 *,')''()*+**('''()++,.12368;<<>>@CEGGHIJLMNOLLMNOPPQQRRSSRRQONMMNNLKJIGFDCBBFEGHHHIJJLNNMLIEB?<961-,,,-18>CEDA><<=>>CLTUVZ[XWWY]abcckntvwvuvvttsrqppmjiihecdhijiijjiiijlmnoqtsqponjgefhhiiklkkkjihhhiiihhhggiijjjhgeb[WY]bebb\WPM>?;<=>>@CDFIJJIIJIIIJJJKKKLLKLUcqwyzyxwwwxxxyz{{|}~}~}} ~~}}|wwupqtpqonmmmmlkjkmnnopopqpomkiiknrssrqppppqrttrstttuwx{~|{ }r_YYPPD<8<>DJIJKLKJKNPRRRPNNPSRTUSPMLLNNOPQRTUWWXXXWWVLE??@ADHHJJIIHFDFJPSTRPOPPQVV[hmz¤§§§¨©ªª©¨¨¨§¥¤£¤¤££¢ ¢¤¥§©©«ªª««¬¬¬«««¬¬««ª©©©©©ª«««ªª«««ªªªªªªªªª««««©¨¨©ªª©©©©©©©ªªªª©©©¨¨¨¨©¨¦¥¤¤¥¤¢zyzyuspnlgee^TLIB8.&%#"##" !"#DYcgqsxz}zxwvuttsrqpppoooooonnnnnnnmlkkkkjihhgedcccbbbcdefghijlnnnpqrttuwxyz{} ~|{wtqkeJ7)+0*)'&&&''''''&&%%%%%'*+,.1577788<?ACCDDEHJLKLMMMNNOOPPPQQQQPPPPPONMJHEDB@@BDEHJJIJJLNOMMKHD?<862/+)**-4>DGFDB>>>?AADLSTUVWVVX]chjjioruwwvvvvtrppqstqpppoljjijjhhijihhijlnoqqonnnmigghhhhhhiijkjjihhhhhhhggffghjlmlkg]WX\becd`^YVA@<;===>ADEIIIHHJJJKLLLLLLLMIP_jsz{zzzyxxxxwyzzz{}~~~}| ~|} ~ ~~}~ytplhknnpnlkkkjiihhiiiiklmnnmigedfinqrrqqpoonooppqrrrrtuvyyzynd\TRJ=89:AIIIIIGFHLPQRQPMLMPQSTSPMJJJLMNOPRUTUUTTSTUQJA>?BEJJJJJKLJFGIKMNNOOPPQVX]jn| ¥§§¨©ªª©¨¨§¦¥¥¤¥¥¤¤£¡ £¥¥¨ªª«ª©©««¬¬«««««««ª©¨¨¨¨©ªª««ªª««««ªªªªª©©©ªª«ª©¨¨©©©¨¨¨¨¨¨¨©ªª©¨¨©¨¨¨¨¨§¥¤¤¤£¢ |zytrrpnlihebbdeVIA81-*(%#" !#?Zegprx{|zxwwutsrqpoooonnnnnnnnnnnnmkkkkkjihhgedccccbcdefghijkmnnopqrttvxyz{|~|{zwurmgVD813/,)'&%%&&&''&&%%$##%%%%(+.11111368;;<=>ADFHHIIIHIJIJJJKLMNOPPQPPONKHDCA?@BDDGJJIJJLMMKJJFA;721/,*(*+19CIIGDB??@BCCEKSVVVVVY]dknoopstvvvvvwvtpnnqtvuututrqpnnmjijjihhhiknopnnmmnnkiiiihhghhiijjihhihhhhhgffbcdgillli^VVZaeef``[YCA=:<=<=@DEGGFFIKMMNNMMMLKKJDQdlt{yzzzzzyxwvwyyzz}}{{|}~||~ }||~~xtlddfhjlkjiijjknmmmkiijmnoonkihhghknqqpppoooopprsssqqrstxyzzwh^^YOA;;9>EDDDDBBDILMOPOLJJJLNPQPNJIIJJKNPSUVVTRQRRSOJD@@DHKKKKKLMLJHIIJJJKLNPPVW^mr} ¥¥¦¨©ª©¨¨§¦¥¥¥¥¥¥¤£¡ ¡¢¢¡ ~~~~}}}~ ¡¤¥¦¨ª«ª©¨¨©««¬«ªª««««ª©¨§¨¨©ªª©«««ªªª«ªªªªªª©©©©ª©©¨©©¨¨¨§§§§¨¨©ª©¨¨¨©©¨¨¨§¦¥£¤£¢ }yutqnnkba_^[XZ^bTG>61.*# "%>Xfhrrw} ~}zxxwtsrqpoooonnnnnnnnnnnnnmkjkkihhggfdcccccbcdfghhijkmnnopqsttvyzz{|} {zzxusoh_OD5621+*(&&'''&''&%%#"#$%$#$'++++++,.0358:;=>@ABCCBABCDDDDEGHIMOPPPONNJGC@>>?ABDFHIHIJIJJIIIEA:50.-,++,/6>GJJGDB@?ACCCGMVZZXWW\bioqpqsuuuuuvwwwtomnquxxwwwvttttroljjjiiiiiknoponllmnnnlkjihhhhhiiihhhikjjjihhgedddegggi]UUX`efe]\VWAA=:<=<=@DFEEDEIMPPNNNMLKJJFAQejt|vzzz{zyxvuvxxyz~}zzz|~~~}}}}}|{| ~|{{|~wujabbcghhhhhikmlmnnmkkmpqssqonnlihhlnonooopqrssttutsrstuyyy|~|j_d\PB>>:=B>AA?>?BEIJLNNLJGFGJLPPOKIIHHIKOPQUQNKKLKKJJFBAEJMMNMKKLLLJJKJJJJJKMOTV]nu| ¤¤¥¦¨©¨¨¨¦¥¥¥¥¥¥¤¤¢ ¡¡ ¡ ~}{zyyyyzxvvx| ¡¤¥¥§ª«ª©¨§§¨©ª««««««ª©¨¨¨¨¨§¨©ªª««ªªªª«©¨¨ª©§¨ª«««ª¨§§§§§¦§¨¨§¦§§§§§§¦¦§§¦¥¥¥¤¤¢¢ zz|yttkcghid]VPMJIGGD=72,'" "$"6`cdury}{zyxxusqqqqonnnnnnmmlmmnmnnmljihhhhhhfdcbccddefgghikklnnppqstvvvxz{}~ }zzyvroih[J>5151+*++*++)('&%%$#%%%$$%')(((()*,.1235689;<=>>===>>=;;=?ABJLOPOMLKJHDCA?>>@@BCDDDDEFFDCA><3.+++*+-37;?DHJJECBCDEEEENXb\]\\einpoptyzywvvwxxvsmkntxxyxvtrqrssronlkjjjihhjmoqpnmllmnpqnlihhhhiihhhiijkkklmlkjjgfeccedc]VUY`bab^[ZPCA><<=>>?BDDCCEJNPPQPNLLLIDD?Mfmzyx{|}}|zywvvwxz{|}~}||}~~~~~}{zz{~ ~}|||~}|{zzzzz{~ ~~~}~{{{{|~|{{|}~~~zshcbeeehhhhhhikkmnnnnnnrtttttsrnmkjklmmnkmnostqttssrrrrtwvyz{znhd\PPC9=><AC@>>>AEJJMPPNJFDDEIMPQNKKJIJJKORUSPLJIJJKJIHIJLMMPPPPPPPLLKJIIJKNLMQXYmq}¢¢¤¥§¨§¥§¦¥¥¥¥¥¤¦£¡ ¡ }zywvvvuusttttuz~} ¢¤¥¦§©ª¨¨§¦§¨©©©©©©©©©¨¨§¨©©¨¨¨©©ªªª©©ªª©¨©©©§¨©ªªª©§¦¦¦¦¦¦¦§¨§¦¦§§§§§¦¦¦¥¥¥¤¤££¡¡ ~yy|}vvutgXVTONLJGD@>@A?:3,&# "%$/\hipwz~|zxwvtsqppponnnnnmmmmmmmlmmllkjihhhhgedcbcdddefghijkllmnppqstvvvxz{~ }zzywtqmj^PE9011.-.--.,+)&%%%%%&&%%%%'((((''(*+-./0123589:;::99:8889<>>FHJKKJJJIGDCA@??>??@@@??>>><;:86,)'(*+-169>BEHIIFDDFGHHIHOYeabbdlottstvzzzxwvvwwurmlouxwxvsonnnpqpnmmlkjhhgghjmnonmllmnoonkihhgghhhgffgghiklmnnnolkhdbbb_\VUX^aa^\[\QEB>===>>?ACCCDFILOPPPNLLKJFGAOgo{zz}}~~~|zyvvwxyz|}}|{z{|}}|||{{|~~|{{{~}|{{zyzzz{~ ~~~|{|~}{|}||||{|}~}~~~~ztlhghhhffffedgiklmnnnpqtuvvwwtqqonlkjjiljmnnqtrrrqppoooqtrttt| slg^RN>6<?>ACBAABDHJKMPPPLHFDEHKPPOMLKKKKKMPQPNJHFFFHIJJJJLMOPQPPPONMLJJKMOPTRVXaev{¡¡ ¢¥¦§§§¦¥¥¥¥¥¥¤¤ }zyvtqppponnnnoprtwwz~ £¥¦§§¨¨§¦¦¦¦§¨¨§§§§§§¨¨¨¦¨©ª©¨§§§¨©©©©©©§§§¨§¦¦§¨©¨§¦¥¥¦¥¥¥¦§¨§§¦¦¦§§§¦¦¥¥¥¤¤££¢ ¡ w}|zz{szzxs`JB;:<>?@?=;89:80&!!$',Zlpm{{~|zwuttsrooonnnnnmmmmmmmlkkkkkkkkihhgfdccccdddeghijklllmnpqrstvvvxz|~ ~|zyxwusrnd[P@1-1011/01-+*'%%&'(((('&&&'((((''((+,---./03456765454335789>@BDEFGHEDCA@??>>>=<;:9998644420&%%&(,268<ADGJIHFEGJKKLMLPZhfgglqtxxwvy{{zyxwvvvtqmlptwwvsnjhikmnmlkkkjiffeefhikmlkkkmnnnljhhgedgfedcbbbehilmoqtsrqnhbaa[YVVW[\]\ZXYPDC?>>>>>>?ABDEGIJNPPPNLKKJHIDRhs}{|}}~~}{zxxxxyzz{{zzyz{|||{{|~~|{zz~}|||}~~~}|||{zzzzz{~~~~~ ~}{zz|~}|}~}{{{{{}~}~~~~zuolllljkkjhfehmnnnnnorsvvvwyzvronnnnnnmmlnpoptsqqponnnnnqnonnuxvojcbV@4:?@BBDFEFJKJLLNPPOKIEEGJNPPONNNNLJLNPPOLJGFFEHJLKKLNOPQQPPPOMKJJMPQQSQWYcnz £££¡ ¢¤¥¥¥¤¤¤¤¤¤¤££ |z{zxuttpmlnnnnmkilorrquy} ¡¤¥¦§¨¨¨§¦¦¦§¨¨§¦§§§§§¨©©¦§¨¨§¦¥¥¦§¨©¨¨¨¨§§§§¦¥¥¦§§§¦¥¥¥¦¥¥¦¦§§§§¦¦¦§§§§¦¥¥¥¥¤££¢ ¢¡ ssrqmcW\bhmbPD8../01111/011+# #*5Xnvo{} ~|zvtttsrpooonnnnmmnnnmllkkjjjkkkihhfedcccddeefghijkllmmnqqrtuvwwxz| }zywwvutrnie\L=42353122.,+(&&')*)))(''''))***))*,,-,,,,-...0122110//012378;>@BCDA@?>>=<;;:974322431111/+%%%$'.58:>CGJKJIFGILNNOPPR[jhhinrtxyxxz|{{zyxwvvtpmmptuutpkhfghjihhhiihhddddeghiiiijjklmlljihfdcddbbaaaacfhklnsutttrng`^XVUTUVVVWVRPF>@?====>>>?ABDFHJLNNOOLKJJIIJZmv}|}||}}}|{{zzzyyyyzzzxxyz{{|||}~ ~}||{zzzzz|}~~}}}}|{{zz|}{|~~ ~}|{z{|~~}{{{{{{|~~~}}~~zwsppppoqomjhgjnssrrrrstwwwxz|zwqrstttttpnorqrtsssrqponnmpnoontu}vqnklgWG>98;AGJIIKMLKKKMPPOKIHHIKNOONOPPMKKMPPPNLJJJHJLMMLLLMNPPPPQROKIJMPPPUSZ[fu¡£¤¤£ ¡¡¡¢¢£¢¢¡£ ¡ ~~zwvvtrqkhcbcfffffghjlnnwz|}}} ¢£¤¥¥§¨¨§§§§§¨¨¨§¦¨¨§§§§¨¨¦¦¦¦¥¥¥¥¥¦¨¨¨§§§¦§§§¦¥¦¦¥¦¦¥¥¥¥¦¦§§§§§§§¦¦¦¦§¨§¦¥¥¥¥¥¤££ ¡ {qhb\YTGE@=887561)'%$##""&%&(%"&CXjvuz ~zywuttsqppoooooomnnnnmllkkjjijjkihhfddccddeeffhhijklmmnnqrstuvwxxz|~ |zyxwvutqonmeYLC77874540,+)(()**)**)(((()*++++++,,-,++++,+++-.///.-,,,--1269<>>>>=<;:9876631-+++--,,--+&$#!!%-58;?DHJLLJHIKOQQQRRT\kjkkpsuyzyyz|{{zzzxwwspmmorssqmhffghhhgfghhgfbccdeghhhhhiijkkllkihfcbbbbaaabbcfhjkmqtuwuvuj\WTQOOPQPOQQNJ>5:<<<<<=>>>??@CFIJJKMNLKLKJJQfry{|~||||||{{{{zzyyzzzyxxyz{{||}||} {zyyyz|~~~~~~~}}{z|~{z| ~}||||{||~{z{}}}}}~}|{|~~|zvttttuvttttrqrvwwxxwvvyzz{}|}}}|zyxtooqrttstttsqpoonqorrqvw~zvsqquuaMB?CIMJIKMMKJJJNPPOLKJIJKLLMOPPNLLLNNNMLLLMMLLMMMKJJJKLLNPSRPMMOPPPUTX\hy ¢¤¥¥£ ¡¡¡¡¡¡£ ¢ }z|zvsrqnkc`[XXXXW[`ddbbhnvyzzzz} £¥¥¥¥¥§¨§§¨§§§§¨¨§¦§§§¦¦¦¦¦¥¥¥¥¤¤¥¥¥¦§§¦¦¦¦¥¥¥¥¤¥¥¥¥¥¥¥¤¥¥¥§§§§¦¦§¨§¦¥¦§§§¥¥¥¥¥¥¤£¢ }vkfUMA<%$%(+#%%#""!! $!J^htzz }zxvuutrpqpooopoonnnnmmlllkjjiiiihhgfeddddeeffghhijlmnnnoqrttuvwxyz|~ }{zyxwvuuttqibWL9888653/++))**++*++*)))))++,,,,,,---,,,,-++**+++.-,++**+-/26898898887532110-*'&&&'''((%"" $+4:=@DGJLLKJJMQUVVUTU\jjnnsvxz{zzz{zz{zzzxxtomlnopplifefggfgedeghgfbcdefggghhhhijjkkkkihecbbbbbbbcdfhjjjknqvxvxzmYPNJIJKMMMOPNJ=388999:;<<<<;<>DGIIJKMMMMMKL[rvz{|}||||{{{zzzzzzzzyyxyz{{{z{|{z| }|zzz{}~~~~}|}|{~ ~~~~{z|~}{zz}}{zxutuvwzz|zyxy{~~|zz|~~yrorsttstttsrpooorqttuz{|yyvtutzyhRCFJKIGJLMKLJIJNPPOMKJJJJJKMOONMLJKLLLLMOPPNLKLLJIIIIJIJMPUSQQQQQPQQQ\iy¡¢¥¥¥£ ¡¡¡¡¡¢¡ zvyyuqonibXVUTSSSSUZ^^\]elrtvwwxz{~~||} ¢¥¥¥¦¥¥§§¦¦§§¦¦¦§§¦¥¦¦¦¦¦¥¥¥¥¥¥¤££¤¥¥¦¦¦¥¥¥¥£¤¥£££¤£££¤££¤¥¥¦¦§§¦¦§¨¦¥¥¥§§¦¥¥¥¥¥¤¢¡ {tlhWVDL85)'#$$%'! "& Nljt{ ~|yxvuttrpponnoonnnnnmmlllkkjjiiiihhgffedddefffghijkmnnnopqrtuuvxyz{|~ |{zzyxwvzyxskh_Q<878641-+*))*++,,+++*)**++,,++++,-...--.--,+***+--,+*))*+,.12321211110-,--+)%#"#!"#"##!!'2=?BDGIKKJLKMSWYXXVW\hhortwyz{{zzzzzz{zzxwtplllmmnifcdfhgfedbcfhgfefghhhhggggghhijjjjhfcbbbbbbcefgijllkklnrutw{nXOJGEFHJLOOPNJ>5868888999899:=AEIJJLMMMMKIPczwzz}~}}|{{{{{zzzyyyzzyyyz{|{{z{{zz{} ~}|}~~~~~ ~~ }}~~{zz|~|zzyxvvxyxz}{zz{}zuuttttutttsqpoosqtxz {xzxuwzww}zgTJHEDDFIJLLJFDINPNMLKJJIIJKLLMMKIIJJKLNPPPNLLKKJIHHIJHGJLQRRQPPPQQRNbt £¥¥¥£¡¢¢¡¡¡¡ ¡¡ ¡¢¡ ~yttwupnld[CDFJLOPQUVXY[^dhmortvwxy{|}|zyxxyyz £¥¥¥¨¦¦§¦¥¥§§¦¥¥¥¥¥¥¥¦¦¦¦¥¥¥¥¥¥¤¤¤¤¥¥¥¥¥¤¤¥¥¤¥¥¤¤¥¥¥¢¢£¢¢£¤¥¥¦¦¦¦¦§©¦¥¥¥¦¦¥¤¤¤¤£¢¡zsnjZT-9/0&(%$! $)#Nxpuz~|ywuttsqpponnnnnnnnnmlllmjjjjiiihggggffeeeeffgghiklnnnoppqstuuvxy{|}~ zzzyyxwvwvwrmngW>889841-*)(()+----,+*)*+,--,++++++,----.,,-,+*++--,+*))***++-..-++++++(''('%""/<ADEFHJJJLJLRX[ZYXY\fgortvxzzzzzzzzzzzyxwtplkkkkmhebcghhgdbabeggfhhiiihhheeeefghhiiihebaabbbcdfhhlmmmkkklmqqu{oZQJHFFGHLPPOJG=5747778887688;>AEJLNOONMLIEQh}vxz||}|{zzzzz|{zyxxxxxxyz|||{|{zzzzzz{}~ ~~~~~~ ~ ~}{zz|~|{||{zzz{|}~}}{} }zvtttvvuutsrqprquzzuyxuy{z|~ztkaMF@>BDEGKLJDADJNMLLLKJIHIJJJLLJGEGIJKLNONNNMLKKKGHJJIGHJKNPOMLNPOPJdz ¡¤¥¥¤£¥£¢¡¡¡ ¢£ }{ywwtmkhd_SDDEGJNPPPQRUZ`ehhnpqswwt{zzwsttputx ¢¥¥¥¥¥¥¦¦¦¦¦¦¦¦¦¥¥¥¥¤¥¥¥¥¥¥¥¤¤¤¤¤¤¥¥¥¥¥¥¤¤¤¥¥¥¤¤¤¤¤¤¤¢ ¢£¥¥¥¥¥¥¦¦¦¦¥¥¥¥¤£££¢£¢¡vvtndV&//+%# #-3Zuwx }zvvttsqppnnonnmlklllmmmmmlkjijjihggffffeeffggghikmnnoopqqrstuwxyyz{}}~ ~~~~~ ~|zyzzyx{wvvqkfaP?;561/+('&')+,--+++++++-..-+*++)+++*+-011/...----,++**)''''''''''('%$###"""!#"48ACDDEIJKLKJPY]]]\]aeinrvuzzz|zvuzz{{{{zxtpnkikliidaachhccba__`behhhhhhgeedccdddchgecbba```abdfhinprpnnmlmmnpsnbVJFFGHLPQPJD@;6576667887789:<>CHLMNLOKIK?Plyyz{}z|{zzzzzz|||{zyxwxyzzzzz{~|zzyyzyz| }||{zz{~ } ~|zwzz{}~|||z|~~}|{{|}~ {utsruuvwvtsrrqsw}}zzz|yzzx{zrdW@7BB;FIKJD@DGIKLLJJJJHIJKMMLKJIGHKPPPPPPPPQQPONKJJLLJHMKJKKLOPRCXny ¡¡ ¥¤¡ ¡ ~|zxvuskhgc^PHGGGHHGGFINT[afhhkpsqnptnmmlhhmqtvz ¢¤¥¥¥¥¥¥¥¥¦¦¦¦¦¥¥¥¥¥£¤¥¥¥¤¤¤¤¤¤¤¤¤¥¥¥¥¥¥¤¤¤¤¤££££¤¤¥£¢ ¢£¤¥¤¤¥¥¥¥¥¥¥¥¥¤££¢¢¢¢¡{trl^\P,**$"! $/>axyy ¡ ~{zuutsrqqqonnnmllklllmmmmmlkjiiiihhgfffffeffgghhjkmnnoopqrsstuwxyyz{|}~ ~}|||} ~|zzzzzyzwwvsojc\=9510/+((()++,,+**+++++-/0/,)&%%&(((*,00.------/.-,++**&&&&&&%%%&%%#"!! $$6;?ABBDGJJKLKPX\\]^^aehlptuz{zzxttwyz{||zxuoljhijhe_]_bffb^\\\]]`beefhhhhgedccccbbbbbbbba`aaabcgikorsronnmkjiknkbYPNNPPRTROF>;;9887776678888::<?DIKLJLJHI>Qnzz{|~z{{z{{{{z}||{zzyxxyyzyyzz|~~|zzxwxwwz~ ~|{{zxwz}~ |zwzzz||zzz{||}}~~}}~ } zussrstuwwutsrqry|xxxx}peJ49B@AGIG@>AFHJJKJJJJHGIJLMMKJJIILPPQQRRRSUUUTSQPONNLKMLKLMMMNQK_nz ¢¢¡ ¡ }{zxwsqjhec\LEDDDCB@?>DNW]_^\\binnmmnb^^bddiopuz~ ¢¤¥¥¥¥¥¥¥¥¥¥¦¦¥¥¥¥¤¤¢£¤¥¥¤¤££¤¤¤¤¤¥¥¥¥¥¥¥¤¤¤¢¢¢££¤¤¤¡¡ ¡¢££¤¤¤¥¥¥¥¥¥¥¤¤£¢¢¡¡¡ zunbHC6("'!!# 1Kfz{|¡¢¡¡¡¡ ¡¡ }zyuttrqqqqpnmlmmlllllmmmmmkkjiiihhhgfffffefghhhikllmnopqrssttvwxyz{|}~ }||{{}~ ~|{zzzzzyywxwttngb851,,+'%%&())('(''*++++,-.-*&$#!#%%%'+-,+++,.../.-,+*))%%%%%$##%$$" "$3;>@ABCFJJLMMPX\]^__adgjnruz{zyuqqtvz{}~|zwokjiijhb[Y\^__\WVVZ\\]`bbceghhgfedccccb``abbbbaba`acgkmpstsponligeeggb]][[\ZYVPIB;888888875446878998;@DGIHIGGH>Vp||}~|{{{||||{}||{zzzyyzzzyyyzz|}|zyxuvuux}~~ ~~~}|zwvy{~~}~ ~|zwyzz|{zz{|{z{} zu zutttuuuuuttstux~zxvtz{zgI8;ABDGEA>BEFHIJJJJJIGIKMNNLKLJJMOPQRRQQRSTUUUVVURPOOOMMOPONMPPbnz ¡ ~|{zyxqrlhdb\LBA?>=<<;?DKRUUTRW^a^]\UJFDGR_ehjfnuy{¡¢£¤¤¥¥¥¥¥¥¥¥¦¥¥¥¥¤££¢¢¤¤¤¤£¢£¤¤¤¤¤¥¥¥¥¥¥¥¥¤£¢¢¢¢££££ ¡¢¢££¥¥¥¥¥¥¥¥¤¤££¢¡¡ |wd]>2%"##!6Vhw| ¡£¤¥¤£££¢¡¡~|zzvutrqqqqqonmnnmlkllmmmmmkjiihhhhhgfeefffghhhijlmmnnopqrsttuwxyzz}~ ~}}||}~ ~}zzyyzzzyyxywvvrhb:3+)+&%""#%%%$#$$%')))***)'%$$$ !###%')))*+,.//..,++*))%&&%%%$$%$#! ! "#%+7>ADEEFIJKLPPSZ]_aa`bdgjnruz|zxsopptwz}~}wnijihhf[UUZ[ZXVTQSX\\\^^^`bdefefeeeeeffcbbbbbbabbbbehlnqstsqomkhebabcbaa^__\WPH@>=:867988741112588878>BBEFFFIID\t~{{{|}}|{||{{zzzzzzzzzyzzz{|{zyxvuuux|~~|}~~zxwy{~~~|{{| ~}zxxyz|{zz}|{zz{} ~yt{ ~yvvxz}zxutstttz~vrqtz~z~{iK=BCCGJHFHGEFGIJJKKJHJKLLKJIJKKLKLPRQPPPPPPQSUWWVSQPPPPRRQPPQP_nz}{zxwqsojeb]PCA>;8778:988:>DIQVXVTSLDHLOSZZVT[dntz ~~ ¡¢¢£¤¥¥¥¥¥¥¥¥¥¥¥¥¤£££¡¡¢¢¢¢¡¡¢£¤¤¤¤¤¥¥¥¥¥¥¥¤£££££¢¢¢¡ ¡¡¡¢¢£¥¥¥¥¥¥¤¤£££¢¡¡ vtnP;+'" %@bmv|¡£¤¥¥¥¥¤¤££¡ }{zyvutrqpqqqonoponlkklllllljjihhhghgfedefffhhijjkmnnnoppqrstuwxyzz{~ ~~~~}~~~~}zzyyzzzzzyzxvvricH8%()#$""""##""""$%&&'(('%$##%%"###"#$%&&')+-//--,++***)***)(((&%%$""!!""!! !#%$$#"! "#$%(18?EIJKJKKKLQTV[^`bbbbehjnruz{zwrnppsvxz||{rjfhhgd`RNQY[YWVQPPV[\]]]]]_abbcdddefhhjgeccddcbdddfhknpsttsqonkdb`_`bcdcbcda\UKEC@=989;88851.,,258878<@ADFEFIJJbx~{{{|}}}||{zzzzzzzz{zzzzz{|{zzzywvwxz{}}}|}~ ~zyxz|~~|{{zz{}~~~~{yyz{|zzz|||{zyz} |yxz|}zyy{}~{xvvvwv|snortyz{jVN>CJOONMKHFFGIJJJKIJJKJIFDFIJIFGKOQPPPPPQQTTUVVTRQRQRRQPPSRS`oz|zwvrtpmfb^TDA>9655631,*+08>MKJG>3028DIGGEEJXcntzxvz~ ¡¢¢¢£¥¥¥¦¦¦¥¥¥¥¥¥¥¤£££ ¢£¤¤¤£¤¤¥¥¥¥¥¥¥¤¤¤¤£¢¢¡ ¡¡¡¡¢£¤¤¤¤¤£££££¢¡¡ ytje\<#!#$&Mqtx|¡¢£¤¤¤¤¤¤¤¢ }{zxwuttrqppqppopponmkkllkkkkiiihgggggedcdfgghijklmnnoopqqrsttvxyzz{} ~~~~~~ }|zzzzzzzzzzzyvvslgW@%%$!#"! !!!!!#%%%&''&&%%%$%$$%$#"##%%&(+,--+++*****++,,+++++*(''&%%%%%%$$%'('&%%$$$##$%(49AJLONLKKKLSWX\^`bbbdgiknruyzzvpmnortuvwwvnhfghfaYPNQXZXVTPOORY^`_^]\\^`abbcdeghklkjhhjkjihhhiknprtuutrpnmb`^^^_bdghijhgbYWOD><;:889862.+*.15668;>ACFEFHHPhz~{{{{|}}||{zzyyyyzzzzzzzz|}|{{{zyxyzz{|}~}}~~ ~~}~ |{z|}~~}|{{zz{}{{}}}~~|zzz{{zxxz|}|zxy| {zzz{} }|{{}~}||{}rjmoquz}tdU4BJPPPPOMIHHHIIJJJKLLKJGECFGDBCFJNNOOOPQRVTQQRRQPQPONMLNPOTanx}zywtsnmgb`WCA=85233210.-037<9:<4++49DD<84;JZfptv|}xrsx}~ ¢¢¢¢¤¥¥¥¦¦¦¥¥¥¥¥¥¤¤¤££¡ ¢£¤¤££¤¤¥¤¤¥¥¥¥¥¥¥¥¤£¢¡ ¡¡¡¡¢¤¤¤¤¤¤££¢¢¢¡¡ |pnbUM5'%'"! 6[vyz~ ¡¢¢£££££¢ ~|zxvussrqqpppppoonnnnllllkkjjiihhgffffeccdfhhhiklmnnoopqrrsttuwyzz{|~ ~~~~~ ~|{zzzzzzzzzyzzwutpkbK2'%! !#$$%'''&&%%$#$$%%$$%%%%&(*+,-****+++,./0/-,,-.-,+++)(')**('((**)(''''()+,-=@JLOPNKJKKNW\\^_`bddfhjlnquxyxunjlmorsssqolhghhg^QPPSVVVVQOONPWbda`_\\\^`bddefhikmonnorsqolkjjlnpsuuusrqona`^\[Z\`efhhfeb\`VH?=<:888863/+*+-14579<AAEEFFGVkz}~~|{zz{||||{zyyyyyzzzzzz{{}~~}~~|zzzzzz{||}}~~}{{|~}}~~~~}|{zz{~|z{}~~|{{zz{zzyz}~}{zz|~~{z|~}~~}~znnnott|}~ri`?>HPPOPQPNLJJIHIJJKMNNLJJDFECBCDEFGHIJKMNQPNMNNNMMJGGIJJKLN]ox|zzurmlhb`YDB>830/.,+*('),/2222/*)+272-,-:Q[gponrttvvtqty|{ ¢£¢£¤¥¥¥¦¦¦¥¥¥¥¥¥¤¤¤£££¡¢¢£¤£££¤¥¤¤¤¥¥¥¥¥¥¥¤¤¢¢¡ ¡¡¡ ¡£¤¥¥¥¤¤¤££¡¡¡ zlm_KF7*! "%Dety{¡¢¢£¢¡¡¡ }zxutqqqqqqppooonmmnnmmmllkjjhihhfefffecceghhhjklmnnonpqrsttuvxzzz{}~ ~~} ~|zzzzzzzzzzxz{xvutnfU@,* ""#%''&%%%%$$"#$%%%&&&&')+,--,,,,-.0012321//010//.-+*)+..,+*)++*))))*(),..>COOPPMJJKKP[`_`aaceegiklnpuxxwtnhihloqqpnmihggge[LOOQSTVVSOPNNWchcb`]\\_abfgghhilnppqtuvtqnljijmprtutrqpnmba^\WUW\gghebb_YYRI@=<<<776520-+(+/24689?>DDFDG[lz{|~|{zzz{|||{zyyxyyzz{{{{|}}~}zzzxyz{{z{{|} }}|zzz}}}~~~~~}|zz{}~|z{~~~~~~~}|{zzz{||{|~}|{{|}~~~~}{~}{}~|} ~usqqux|{|za;EOPPPQQSPMLJHIJGIKMNNLKHHEDDDDC@ACDDFGIJJJKLKJHHDACGJJJLGXtz~}|zxtsnnjb`\KF>6451+*'%##%&'****)('&+.00/5ET\hmjkkiknsnqou{~ ¡ ¡¢¢¢¢£¤¤£¢¢£¥¤¤¤¥¥¥¤£¤£¢¢¡ ¡£££¤¤££££££¤¥¥¤¢¤££¢£¢¡¡ ¡¢¢££¢¡ ¢ vrnWS;9+$5[px{ ¡¡¡ ~}|zzwtsrqppoooonnnnnnnnmmmmlkjhhhhgffeeffefghhiijlmnnopqqrstuvvwxzz|~ }zxwzzzzzz{||{{zywtsoodJ8$$##"!""""!!"$%%%%%'(('&&&'&&&')*)(***+-...0//0122144554345554210/.,.00/,++,,++++++.+.038DYQPNMJIHJSbdcdbddeejlhjnmvvwvqiecffhkmmllihhfb\VQPOMRUVZTTRONVcihheedabcbhikkjknprstuutrqnkiiknpstttspnnofc]YWUV[bcfd_ZVUSNFA?><:862110,*''*.3788<ACDDGEars~}~}|zzz{|||{zzyyyyxzzz{|}|{~zyxyz{{z{|~ ~~|{zyz{}~|}}~~~~~~}|zzz|~~||z{||~ ~}}~~~~~}}}|{{}~~~}|||{|}~~~}}~}~~~ }~~ }|zz| kLIRPPSSPPPOMJHFGIJLLLLKHGFEFGGGDDBBDEGGEEFHJJJIGEEFHHIIHC`tz~}zxutonkcb]PH>741.+'%" !#$%%%%%%$$'*+,-4COKQUTW\behnkpov{} ¡¡¡¡¡¢¢¢¡ ¡£¥¤¤¤¤¥¥¤£¤£¢¢¢ ¡£¤¤¤¤¤¤££££¤¥¥¤£¤£¢¡¢¢¢¡¡¡ tqmVP96+%&Hfpy| }{zywusqqqpoonoonnnnnnnnnnmmlkjhhhgffeeeeeefghijklmmnnopqqrstuvvyzz{|~ }zxwxxxyzzz{{{zzzxutqpgP>*&'$####$$#"#$%%%%&)))(((()++++,-,,,,-.011121123444556655677664321111110.,,,,,-----0-0148BUQOLJFDDGVcfegefdfbbefinotuvungba\[\`dffeffeb^YURPPOTVX\XXUQRZdiihfhhffhfiknnnnpstttttsqpmkhhhimosssrqonnhd]YVTTX]_a_\VRPNJDA?=;98520/,)&$$%*/478<?ACDFEbtt}}||}zzyyz||{|{zzzzzyxxyz{||{}~~}}{zyyzzzzz{|||}~~~{zzzzzzz{|}~~~}{zyyz|~}{}~|zzz||~~}~ ~~~~~~~~|{zzz||}~~~~~||}}~{|{{~~~||~~}}dWVSUPJMLKKLLKJIJJJJKLLIHGGHIJJHGFFFGGGEDDEGHIIJHGIJIIIHEdvy ~zwvqpldb_SG<63.*(%# ""#$$$$#$%'),3>FDCDHKS\`^fdklt{~ ¡ ¡¡ ¢¥¤¤££¤¤¤¤¥£££¢ ¡¤¤¤¥¥¤¤¤££¢£¤¤¤¤¤£¡¡¡¢¢¢¢¡¡ uqlVN70)&"4Zqvz} |zywutrpqponnnnnnnnnnnnnnnmmlkjihgfeedddddefghijlmnnnnnoqrsttuvwzz{||~ ~|yxwvvwxyzzz{zzzzywusrlZG1)+%%$$%%%%%%%%&'''***))*++.-..///.--.0133444456777677888888877655544431/....//0001201248=LJJHFDBDFS_bcecb_^\Y\`bgntuvtmd`^\ZY\abbabcb_[VTROPPUVX^\]YUV^fjkgfhkklmklnpqqrsttttsqponihgffhkorqponnljhb][XUUWXYZYVQLIFDB@><:8752/+(%" !%*047;=>BDDC`utzz|}z|yxxyz{{z{{zzzzzywwwxzz{{~~~}||zzyxxyyzzzzzzz{|~|{~}|zzxwxzz|}~~}}}~}{ywwyz|~|{z{|{zz{}}~}}~}{} ~~~}|zxzz{{|~||{|~~}}}||}~ {zyy{~|z|}|yzme]XYSNOMKJJKKKJIHGHIJKJJIIJJJKLKJJJJIHIHGGHJJKJIHIJHFEDDdxw }xxsqlec_SG;42.)&%#! !"#$$$##$&+18=714<?ELNW_^egrz~ ¡¡¡ ¢¤¤¤££££¤¤¥£££¢¡ ¡¤¥¥¥¥¥¥¤¤££¢¢££££¢¢¢¢¢¢¢¢¡¡ vsmZR<0'&#'Gevz~ |zxvttrqpponnnnnnnnnnnnnmmlllkjiggfeddddeeefhhijlmnnnnnorsttuvwxyzz{|} ~}~ }{ywwuuwxyzzz{zzzzywvtsqbM5'+'&%%&''''&%&()*)++++++-.00001110./01245666667888888888998888877766531000111122233122468CBBBBBBDDNW[^a_]VIOPT\cjsstsojc_][XVY\\\\`aa]YVTSPRTWWYbbb]Y\bgijdchmnpqnnprsrqrsrrponmllhhhgedgkqqpnmjhgb\ZZXVVVTTTTRNHDAA@?=;98863/*%"!%,27;<=@A@>[ttvy|{z|xxyzz{{z{zzzzzyxwwwxyzz{}~~~|{zzxxwvvvwxyyxwwxzz||{zxx|~}|{zyxyz|}~~}}{||~~|zwwxz{~}|{zzz||||}~|||zz| ~}}}~~~zxyzzzzz|~zzyz~~}||||~|||~~|}zyz~ ~xvyzzxqqnc[VPQQPOMJJJKJJHGHIJJKJJJJJJJMLKKJJJJKJJJJKMMKJIJJGDBA>]ww~}zztrnhfaVL>200,&%#! !"""#""%)-122,2>CFJJQ[\cfqz| ¡¡¢££¡¡¢£¤££¢¢££¤¤££££¡ ¡¥¥¥¥¥¥¥¥¥¤£¢¡¡¢¢¢¢¢£¤£¢¡¡¡¡ ~vrm_WD2'%""$>^nw}{zwutsrqponnmmmmmmmmmmmmlkkkkkjihgfeddddeffghhiiklmnnnopqrtttuvxyzz{|} }{{| ~}zxvvtuwxzzzz{zzzzywvtsthP8%)*)'''()))(((*+++,----.01222223331234568877888889:99999988888888877642112333444445242455=>>>>?ACCMSV[\\ZQELNR`jnrqnkhdb^\VUUWXXXX[]]\XWVVVXY\Z\ghhb_bgjjjbbflostqpqrqonnnnnmlkjjijhhgb]^alnrqmhdbYTTVUTURQPPOMJD@>>>><:88873/)$! $+38;<<>><9Unstw}{z{zzzz{{{z{zzzzzyxyxxxyyzz{{{zzxwwuuuuuvwxxwvvwxyzzyxvtuz~|{{{{{zyyz{}~~}}}}}~}{zyz{|~}|{zzzz|~~~}|{zz|~ ~~}|~~~~}}}zyyyyxxz{zxwy|~}|}||{{{||~|{{|}}||zy~zz|~ttuuvywuqe]XPRPQQOKJJLLKJJKKKJKJJJJJJKLKJIHIJJJJJJKKLLKJIJJIEDA:Usx} ~}|uspkhb[RC4..,(%$! !!!!!!!"%)++,)-8>@CDKX]gjtz{ ¡¡¢£¥¤£¢¢£££££¢¢£¤¤£¢££¡ ¡¤¥¥¥¥¥¥¤¥¤¤¢¡ ¡¡¢£¤¤£¡ ysl_VD/+&!.Rouyyxvttsqpponnmmmmmmmmmmmmkjjjjjiihgfeddddfffghhhijkmmnnopprstttvwyz{|}~ ~{{{||~ }|zvuutuvxyzzz{zzzzyxwtttjVA)*,+*)))**++++,---//00112333444456556667888888899:;::999989999::::88764445665555446564565<<<=>@DHIORTXYXWOLNOVepqnnjeaaa^\WVVVVUSSSWZYZ[[ZZ\\^\]inlighlnmjbbekotvtssqnljiijjjjiihhgedc^XWZaglmhb\ZRLOSPQSPOLJIGD@>>>=<:988751,($!#*29;<<<<<8Rjsru|zzzzzz{{{{z|{zzzzyyyyyyyyyzzzzyxvuuuuvvwxyyxwvvwxyzywutttwz{zzzzzzywyz|}~~}~}}}~~}|{zzz|~~~}|{z{} ~~~}~}zyxwvvxzzywxz{{zzzz{{|}}}~~}|||}~{zyw|{zz trrprwtuulbYPRPQQOJGGIJJJKLMKJJJJIIJJKJJHFFFHIIJKLLLMMJIHJKJGDD=Plv{}utrnkc\VK>2,+*(%#! !!! #&''*+-4<>>CGV]hmw|| ¡¢£¥¤£££¤¢£¤¤£££££¢¢££¡¡¡¤¤¤¥¥¤¤¤¤¤¤¢¡ ¢¢¢££¢ xnaUE00( &Dcty| ~}||xwuttsqpqponnmmmmmmmmmllkkjiiihhhgfdddddeefghhiiklmnnnopqrttttvxzz{|}~ }|{zz{|}~ ~{zxuttttuvwyzzzzzzzzyxwttl\M1.0.+**++++,--../00111122323444567777766888888889:;:9:::99::::::::99886677666655556685686=;?DFILPRSSTWUUVLHEM^mttrkgb]\^]\WTQPPOMLOSWY\^^\]`^_\_lpnnlmpsojdbdintxvvtqnjhhhhhijjihheb``\VUXY]bb^WRPLEIMJMQPLJFDB@>;;;;;:87541-)%" &/68==;<>;Shtrtzyyyzzzzz{{{|{zyyyyyxyyyxxxyyyyxwuuuvvvxzzzyxwwwxyyywuttttvxzzyyyzzzwxz{|}}}~~~~}|{{{}~}}~~~||{{ ~~{zwwwwwyzxvvxyyyxyzz|}}~~~zzzwy||z~ ytqpqttvzsh`TORQPLHDCCDEFIKLKJJJJHGGHIHIHGGGIJJKMOOPPPOKJKKJFDDDOdrz}tssnkb]ZTJ;.+-+)%#"! "%'''+-3=??DDT\hlx~ ¢£¤£££¤¥¢£¤¤££££¢¡¢££¡¡¡¤¤¤¤¤¤¤¤¢£££¡ ¡¢¢¡¡¢¡ tfZN84*! $:\rty¢¡ ~{zzwwutttrqqponnmmmmmmmmmlllkjiiihhhgedccdddefghijjlmnnnnoprtuuuvxzzz{||}~ }|yzz{|}~~~~ ~|zzxutttttuvwyzzzzz{{zzytsmaW8110-++++++-////01/112111233455688998877888888889:;:9::;::99999999::987678666665556685687=>GORRSUVVVUWTSUKJHUionnngd_[Y[\ZXTPPPPONMRVZ]a`]abaa]antoponrtpiebchmtywxurnjhhhhhjkkjhhhc`^ZUTVYZ[YUPMJE>BFDHONJHD@>=<:99:::8531/+&$!#+17<=;=B>Vhwsrxwxwyyzzzz{|{zyxxxyyvxyyxwwxwwwvttttvvvxzzyxyxwxyyyxutstttuvzyxwxzzzzzz{{|||{{||~~}||}~~}|~~}{{~~~~~~~~~zyxyxxzxwutuvwwvwxz{|}}zyzww}}~|~|tqrrrxttoprfWRPMJGDCABCDHKMLKJJIGEDDDGHIJJJLMKMOPPQRSUQNNMJEBDHN]my{wutqlhbaXVB1+/-*'$!$$!! !"""#%'**-38;>?BJVWctx} ¤¤££££¤¤¤¤¥¥¥¤££¢¢¡¡ ¡¡¡¢£¥¥£¡¡¡¡¡ ¡¢¡wfR?9)"!<Rcowz ¡ ~|{zywvutttrqpponnnmmnnmmlllkkjjjjihggfdeffeddeghhijklmnnnopqstttuvxzzz{|} ~zxwxwuw{||}~}|~ ~|{zzywvuttttttuvxxyzzzzzzzxtskj\H853.+,,+----/01002222334433456889999999998889:;;;<;;;<<<;<<<;;:99:::999::88876678777778=BNZX]^\b\\ZXVVSPNDSbilnmhea\YXYYYWSPOONNOJOV^bbbbfa``Zbvvvtrsutqnggfgmuzyzvqliiiihilnonkihd^YWVTQUUVWRJHIA>>=>DIJJC?@><<::::;;962.+)&%# "',6>>>ABGRpssrvzyxyyyzz{zz{zxwxxwvvvwxxxwvwvutttuvvwyz{{zzyyxxxwwvttttttuuxwvvwyz{yxyzz{{{zzzz{||}~~~}|~~}~~}}}~~~~}}}~ }|}~zwxywwywwvuwyyxvvuuvz} }zyxz}~ wonnppsrprtof]JKNHFBCBEHJLNOOJGEFGEDDHHGHIJNPPPPRSRTVUSPNKIGFEJF\iy }zwurnjc]Y\J6110,*)&&&$##""!!!!"##$$%'(+-18;>@CJSUaqu| ¡¤¤¤¤¤¥¥¥£¤¤¤¤¤££¢¢¡¡ ¡¢¤¥¤¢¡ ¡ ymbWJ8%%!" E\ipw~¡¡ }|zyxwvuttsrpoonnnmmlllllllllkjiihhgffeddeedbefghhijklmnnnoqqrsttuvxyzzz{}~ |zwvtpqsstwyzz}~ ~~}{zzyxwvuututttuvwxzzzzzzzzyutnnaP;441..../../0111122334444556678899988999:899:;;<<>===>>>>======<<;<<;::;<:998888888888:>CP^]acae_^\XVTQPNMZgjiiihc`\XWWWWURPNOPOMIQ\cffghhb__[ewutttwyvqlhhhhnuzzwurnkjklnnnnonnmlf_ZWVSQSTVUPHFH?=<::@GHG@>>=;;9:::;;:63+)%$#" !%)6=?ADCHTnrrquxvvxxyz{{{zzxwwwwwvvvvwxxwuvuuttttuvwyz{{zzzzyxxwvuttttttttvvvvwxzzyxxyzzzzzzzzzz{{{}~~~~~~~~~}||{|~~}{{}~}yvwxvuwvwwvwyzyuuttux{~}{zz|~|}xrlhnoonqtrl`TRLHJFDGIJJLNONLJIHHGIJJIHHJKLLMMOPPPQSRPOMKJIGHFCZl||ywtpniabeU><82...*(((%$##""""$%%%&&'(--1689=BKPS`nt| ¡£¢¢¢£££¤¤¢££¤££¢¢¢¡¡¡ £¤¥¤¢ zuqkWKE>%#+Wkssv~ ¢¡¡ }|zyxwvttsrqonnnnmmllkkkklllmkjihhhfeedccddcbeghhijkklmnnopqrrstuvwxyzzz{}~~zxuqljkimopsw{|}~ ~~ ~}||{zzxwwvvuuuvvuuuvwxzzzzzzzzzwtqpe[>1331/00000112221344555556667788888889::;;;;<==>>?>>>????>>>>>>>>==>=<<==;;:9889:999::;?CObabhefb`]YUQPPPWbkjedefb`\YWVVUSRPNOPPMR\ghgghiib]\\iyttuwzzwqlklkkntxyutromlnorqqrrrqpog^ZWURPOPRQKDCD>;:88>FHD>;;:9989999:963*'$"!!! #%6<?BDCGTjopptutuuvwyz{zzxwwvvvvvuuvxxxvuuuutttuuvwyz{{zzzzzzyxvtttuuutttttuvwxyyyyyyzzzzzzzyzzzzz{~|}}~~~~~}|{zz{}~|{|}~~~}~~~{xvwwutuuwwwwyyyvutttvz{ }{|}~|~~~ umlkjlosttbPHGHGDIIJJJLNONMLLKJJLONLKLNONLJJLNONNOMMLKKJJIJDCUi} ~zwtrpnhnl\FG?200-)()'%%$###$$&&&''()*.-0577=DLPSbot~ ¡¢ ¡¢¢¢¢¢¡¢¢¢¢¢¡¡ ¡¡¡¡¡¡¡¢£££¢ zxtlVNLB%!1Hgtwwz ¡¢¢¡¡¡ ~|{zxwvutssrponnnnmmllkkkklllllkjhhgfeddcdeeedfghiijklmnnnopqrrtuvwxyyzz{|~ |xupkhgfhhgjrxyz{}~ ||||~ }}|{zzyxvvvuuuuuxxwwwxyyzzzzzzzzyxtsphcE025311101112333355677766777888998889:;<<==>>>>>>?>>?????>>>>>>>>>>>>===><<;:989:99:;;<>BOccbhfdba^ZUQPSU`fjgb`bdb`\ZXVUTTRPPPPRT`hlifhihgb[[`n{twwwxyvrnnoonotvwuspnmmoqqrtvwuspog]YVSPOKLMMIC?>:8855<EIC<88788788888863,)%#"""!! !"$1:?@DDJUdjnnqssuttvxyzyxwxxxwvvwuuwxyxwuttuuvvvvwxzzzzzzzzzzzywuuvwwwvttstuwxxxxzzzzzzzzzzzzyzzzz|~}|{{{|~~~~~}~}||{{|~~}}}~|}}~}}}~~~~~}|}|{zyxyywuuuvxwwwwxwvuuuwyz}~|{|~ |}~||~~tpmnqstut_KFHFEKIKLKJKLLJKLMMLMMJJJKMMLKJJKMMLKJJIIJJJJIIEENby {xutrrloi^RTD531,(*+''&%%%%&&('&'(*+,,-1568AJKPUdqv ¡¡¡ ¡¢¢¢¢¢¢ ¡¡¡¡ ¡¢¢¢¢ ¡¢¢¡ xuqj^QF=0## 2Oaltuz ¡¢¢¤££¢¢¡~|zzyvuttsrrqponnnnmmllkkkkkkkkkjhhgfedcbcdefffghhijjklmnnoooqqrtuvwxyyzz{}~ }zvrlhedgfbelqqwyz}~ ~}{{{|}~}}}}|zywvvttuuuvvvyyxxxxyzzzzzzzzzxyusphiP33661241122344557788888788899:;<999:;=>>>>>>>>>>????????@@@?>>>>=>>>==>><<;:999::9:;;<>BQdeaedbc`_\WTUY]cffc_^acb`][XVTSUPPRSSX_hkjhgjjhc`Z]es|vxxwwwuropqrqrtvwvqmklmoqrtvyyvspmf]XVSPNJJJJHC=864433;DHB<876787887888750,(%$$#"! !!"#*8@ADHLSbhkmnopsttuwxyxwyyzyyxwwvvwyzyxvtuuvwxyyyzzzzzyxzzzzzzxwvwxyxvutstwxyxyyzzzzzzzzzzzzzzzz{|}}|{zz|}~~}~~~~}|~~~~~~~~~~~||{z{}~~{zz{~~}}|}~~|}}|{{zzzzzzzxvvuvxxvuuuwvvuvwyyzz|~}||} zz{}}{|~ }vuvtssvnXB<AEEFJLJGFGHJJJJKLKJHIJJJJJJIJKLLKJHGFFGIIHFEEDG`y }zwuttnkfbbaOB<61,./+++*)()*+*)'()+,--/246:CLKQXgry ¡¡ ¡¡¡ ¡¢¢¢¢ xvwumbXOC0!+Khontv~ ¡¡¥¤¤££¡}{zzywutsrqqqponnnnmlllllkkjiiiihgffedcbbbcdeffghiijjklmnnnoopqrstuvwxyyzz|}~~~ ~zwsnhdcddbcghhstx{}}~ }|{z{{{|~}}|||~}|zxutttttuvvvvyxxwxxyzzzzzzzzzxzxtrllZ93583352444445788999998888889:;;;;;<=>>?>>>>>>>>@@AA@@AADCBA?>>>=>>>>>>>==<;:9:;;;;;<=?BP]`]bcabaa_\Z\aeedcb`_aca`]ZWUSRSPPSVYajkkihikhda_\clu}xwwxxxuropqsttvxxuoihjlnpvwwxwurpjf]VSRPNJIHIHD<642333:BD@:765786876677761.+('&%$#! """#%'8ACEFHMbhjkmllosttuwwwwyyzzzyxxwwxyzzyxuvvwyzz{{{|{{zyxzyzzzzyxwxyyywuttvxyyyzzzzzzyyyzzzzzzzzzz{{{zzz{{|~~~~~}~~}}~}~~}{{{{{}~|}}|zzzzzz{{{{}}|}}|{{{z{z{{zywwwwxywuttvuuuvxxyxvvy|}~}~ ywy{}~~~~}{z{}zyzyvusp_G2+15>CFEDCDEJIGGHJJHFGHHGFFFGHJJJJIGFDDDFFDDAB>Dczz |zywttmiehh]XJ>:511110.,++,-,+++,.//.1348?IOPV\hrz ¡ ¡¡¡ {{~~rlnbP>&!!"<\ttsz{ ¡¢¢¢¢¢¡~|zzyxvtsrqqqponnnnmllkkkkjjihhhhgfeedccbccdeeffghijjjklmnnnnopqrsttuvxyyz{|~~~~~ {yupjecccccddenoty{||~~}{zyyzzz|~}|{{{|}}{zvtsssttuvvwwyxxxxyzz{{{{zzzzyyztuokaC77;76857665578::::::::988899::;===>>?@@@@@@@@??ABCCBBCCEDDB@?>>>>????@@>>><;;;<=;;;<=?BIPUY`ecdeb`_acghfecbb`bca_\ZVTSRQQPQVaimmljjkifcabbktx}zwxyyxuspqrtuwxwwrmhhijmpwwvvtsqohf]ROQQNJIGFEA;5211228=>:6444662321122320.,+++)(&%%%%%%'+7>CEDFPbghikjjnqqqstuvvwwwyzzywxwxxyzyywwwxyz{|}}}}|{zzzzzzzzyyyyzzzywvwyzzzz{}||{zyxxyzzzzzz{{zzzzxxyzzz|}}}}~~~~~~~~}~}~}|{{{{{|||zzzzyyyzyzzzz{|}~}}}|{||||{zyxxwxzywttuuuuwyyyvtstwz||~~~}yuwz|~~}}{zyz|zxz{{|yodG.14>ADDDDFGIIHFFHHFCBA@@???CDFGIJIFEDBBDDCA>@9Dgt}x|~~ }zytyrodeghjUEB<213531/---.0/./0110-136=IRVU\ajr{ ¡£¢¡ ~zwmsj[VC+!3Neust ~}zyxwvutstsrqponnnnmmlkjjjjjihhhhhgfeeedcdeeeeffgghiijjklmmnnnoppstttuvxzyz{}~~ ~{zwsmhfdbbccdfjmqwzz{}~~~~~~~~~}|zyyxzzz{}~~}{zz{|}|{yvtsrsttuvvwwzyyxyzz{{{{{zzzzyxztwridK<9?<:<9888768:<<;;:::::<<<;<<<<>>>>?@@ACCCCBBBBBCDDCCCDEDDBA??>>?@AAABB??>=<<<==;::;=?BBDMVaihhhdabfiiihfeecabda`]ZVUSRQTRPVemkljjkjhggbdgqxy|{yyyywvtstttwxwvtokhhiilptttttrongf\OJOPMJIFDB>950.///3754112243/.----../.-,-..-+*)(('&(*-3:CGEM^bfhhjjjnnnnprttuuuuwzzywxxwxyzzyyyxxyz{|}~~~}|{{zzzzzzyyzz{{{zyxyzzzzz|~~~}{yxxyyyyyzzz{{{zxvuvxyz|~~~~}~~~~~~~~~~}{{{{{{zzzyyxwwxxxyzz{{|}~~~}}~~}|{zzyxxzzyvuuuuvxzzzvtsrtwz}|~~}~~}|zxttvy|~~}{zxy||xy{~|{{zeSSLHIIHHIIHFIJIHGFEEDA@BBB@?ACDFIHFECA@BBA?>@8Fflzzzzyz}}~ ~xvtpnmigc[Y^XD4084231001111/1442/58=K\hntwwux ¡ ¡ zyzumd^UK5)' )0Gbwx {zzywvvutrrqqpponmmlkkkkjikkkjihgghgfeddddeeeefggghijjjjklnoooooqqttttuvwxzzz|}~~{xsnkhfcbbcdehknrtwyz||}}|~~~~}}|{zzyyxxxyz{||~}}}|{z{zzzzzzywtssrrsttuvvzyyyyzz{{{{zzzyyzzyxwskdT@;?><>:<<99=><=<=>><<=>=>>?>?@ABCCCCDFGFFFGGGGGFFGGGGHIIHFEDDCBBCDEEEDDDBA@@ACDB?=<>?@@CDJWdjjhhffhjjklkihhggggea[XYYVRSUUV\djlllmmjgfhgkrx{|{zzzyxxvtqrttuywoliiiiiknosqrronmica\PJNMMLIDCA>951/--/123/./1431.,++,,++,//01123400/--..-130;V_ntutsojjlkmmnoqssstttvxyyxwvvwyzyxxxwwy|}|~~~}|z{~zz||{zzy{{{||}|{}}~~~|zyxwwyyzz{|}~~}zyxz{{}~}}~~}~~~~}~~~}~~}|||{}||{{zzzzyxwwxxxzzzz{|}~~}|{{{|||~~~|{zz{{{zxwwwxz{{{zywtttvy{||}}||}}~zwvvvwxz|}{zz|zvy||~}lWPSPQNIIOQPLLLLJIFDCDFHIJJJLKIGHJIGEB@ABBA@CB>GXitttwvuy{~zzwtsrolkcbfbSE@D:1/12331138;8428<AJ^nqptwyz|¡¡ ¡ }yxtnhc[SE>=,$+;Xnzz {zzxvuutsqqpooonnmmlkkjjihjjiihhhgggfddccceeeeffgghijjjkklnnoooopqrsttuwwxyyz{|}~~|ytolhfdbbcddghlortwxz~~}}}{}}}}}~~~~~~~~}||{zzzyxxxxyzz{|~~}}}||{{{zzyyzyvttssstttvwwyyyyzz{{{{{{zzzzzzyywtmfVGBDA@C@>?>>AB@BAA@?>>?ACCDDEFFFFFHHIJJKLKKKJJJJJJJJJJJKLLKJJIGEBDGIHHHIFEDCCCDDA?>>>@@@DDKWbhihhhhjllklkjihhhhhf`YVWXVUWWWW[`egllmmjhhikoty{{zyyyxxvutrqsrrtngcefghilnopnpoljjhb_[PJMLMKHDBA>;841/./0/.,,.1420-++++,+,-/1245566554357643,(Dfw~}zvtqlnoppoopqsstvxyyxvuuvxyxwwwvvy|}|{{||{z{~|~~|zz||{|}~}}~~~~~|zzyxxyyyzz|}~}~}{z{}}~~~~~}~~}|}||~}|{zzyxwwwxxxzzzz{{{|}}}}|{||||}~}|||{{{zyxxxzz|||{zxvttvyz||||{z{{|~|yuttuvwz{~~|zzz} ~zz{{}vdQDOPPPRTPKMMNOONLKIIIHHJJLMNMKJJIHGEDCB@@ABFHNWbqvttrrwz{~ ~|zxvuspnhgih_VPLHDA=8558215403;EQ[aiptuwz}¡ ¡¡ }ytqpmheQA8(%$%%,Jcsttt ¡ ¡¡¡ zyxvuttsrpponnnnnmnmlkjihghhhhhhhhggfeedddffffffgghijjjklmnnoonopqqrttvwwxyyzz{}}~|zvqmhgeccdddegilnqtux|}|}|z|{{{|}}~~}}~~~~}}|{{zzyxxwwxxyzzz|}~~}||}||{{zzywxxxvutttttttuwxxxxyzz{{{{|{{{zzzzzyxtnhXMIIDDGFFFDCEEDDBBBA@BDGHGGGHHFDJKMNOOPPPPPPPQQRSTTTSRQQPPPPPNLKIKNOLJKLJJIHHHHHDDDCCDDDDEJR[adfhhjmnmllkkkklkjhg^VUVVVX[YXXZ\_blmnmjhjmrtwzzzyxwwwvtsssrtrqpia^bbdgjmnoonnnihhe`[WOJKJMIFC@>><:962110-+++/231.,,++,-./1136789:;<;::=>=:8**Uv|rrssrpoprrstuwxwwvuuvwwwvvuuuwz{{zzz{zz{~~}|}|||}~~}~~|zzzzzyyyzz{|}}}}}|}~~~~~}||}}}}}}}~|zzzyxxxxyyyyzz{{{zz{||||||}}}}~~~}|{zzyxyz|~~|{zyvuuwyz|}}|{zzz{|}{xttttuvyz}~|zzz} ~{xz|{dJJMPPOOQTNOPQSSQPNLJGFGJKKNPOLJIHIHHFDBBDDIKSW[dhmnnotvwz|}~ }zyxuspnmmlhc_WUPJA;:>>:8623@Qcpyxvv{ ¡ {wvvuvxbF7,+#%Gh~|tv{¡¢¢¡¡¡¡¡¡¡}yxvuttsrqpqonnnnnnnmkjjihghhhhhhhgggggggfffggfffgghiijjklnnnnnnopqqrtuvwwwzzz{|}~ ~|{xrmhgfeeefffghjlnqstyzz||z{|{{{|}}~}}}~~~}}{{zzzyxxwwwwwxxy{|}}}|||{{{{zzywvvwwvvutttssttvwvvwxyzzz{|||||{{zzzzyuoiZSOLIJLJMNKJKJIJLLLKLNPRQQRRRQPNPQSTUVVWXXWWWXYYXXYXVUTSSRRSSRQPPRTTRPPPPPONNNNNJJJIGGHIIHILRW]adgknnmmmlmnnnnkhg\TTTRUYZWWYZ[]blnnmjjnrwxzzyxwvwvutrpppqssqoh`^__adhlnookjiggeb]WTNJJILIGD@>===<:7410.-,.0220.-0//011357888:<?BDCBAAA?=:+7ezzxusqppqrttvwwvwwvwxxwwutttuxyzzzz{{{|~~}||}~~~}}|{z{{{zzzzz{{|}~~}|}~ ~}|{|||}||~}}}~~~|zzzzzzzzzzzzz|}}|zzzz{|{{||}}}}~~}}|zyyz{~~|zyxvtuuvw{}~~}{zzzzzwutttuvxz|}zxyz}|~ ~yz{|fFHLPOLLOMMOPPPPNOMJFDDEGHKNMLJJIIIJJHEEGGJJMMLU[chmnqprvz{}}~ ~}|zxwyxutrpookgeb\XVVX\]^bmwz ~{{zxz~v`XPJ8( .>bt|uu}~¡¡¢¡¡ ¡¡ |xwvuttsrpoponnnnnnmlkjjjihihhhggffeffghhhhffgffefghiijjkmnnnoooopqsttvwwwwzzzz|}~ ¡¢¢¡¡ ~|{yrmhhedefggghhijlnootwxzzzz||{{{{|}|||}}}||{{zzzyxxwwwwwwxxzz|||{{{{zzzzzxvvvvwwvvuttssttuvuuvxyzzz{|}}}}||{|{zyuoj_YTRPRSQQSPPSSRTVVVUUUUVVY\\\\\\YYZZ[\^`cbb`_^]]]]^^]\\[ZYWWWWVVVVVWXXWVUTTTSSSSPPOMJJKLNLLNPTY]aejmmllmnoqqqolhf\TTSPRXXVVY[\`dlnnmkmquyyzywvvvwuspnlkkmooome_^\\]afjnonheeddb][TQLIIHLJHEB>>>>=<951--../12211142234568:;<=>@DGJJJGEDCA8+Eo}zxupmnpqtuvxxyyyzzzzywutttvxy{zz{{{|~~|||}}}~~~||{{{|}}}|{zzz{{~~~}}}}~~}{{}}}}{{}~~~|{{{|{{{{zzzz{}~~|{zz{{z{{||}}}~~~{yzz|~}{zwvtttttty|}zxxxwvvuuvwwyz|~~{ywvxz{}}{|z`TIHKMKJLLLMMKJHLKJGEEEFIJKLMMJHGGGIIGEEEIHE><KX]acgklmqxz||} }|~~{yxxwstwxtlfefjotz}~ ¡¡ ~zz{}rnebV@*&$ 0J^ttwtyz ¡¡¡¡ }~{xwvuttrqponnnmnnmmkkjjjjiiihhgffeeddeefghhefffeefghijjjkmnnnooopqrttuvwwwwzzzz{|}~ ¡¢¢¢¢¢¡¡ }|ysniheddefgghhhijkmlqttwxxy{{{{zz{{{{{{{{zz{zzzzyxxxxxwwxxxyzz{{zzz{zzzzyxwvuuvwwvvutttttuuuuwxyzzz{|}~~~}}|}|zyupkc^XVXXWXVXVVXXWYYYYYYYXXY\_`^^_`_```abdfhgfedccbdefgfffgcb`^^]]]]\[\\\\ZZYYXXXXXWWVSQQSTQPPRSTVZ^djljjkmorttsqnid\TTRPQVXWXY\^bgnoonmotxxxxvutttvtqlheeelnnnkc\\[\]`ejnplfbbbba\YSPJGIHKIHEC@>??>>;71.--000122357556778:<>@BCDGJLNMJHGFF=5Uw |unmnortvyzz{{{{{{{zxuuuvxz{zz{{{|} }|||}}}~~}}{{{{{}~~|zzz{|~~~~}}}}~}}~~~~~|{}~~}||||{{{zzyz{|~~}|z{zzzz{}||}}}~~~|zzz|}~|zxvuttuuttwz~{wvutuvwxyyyyz{|}|{zwvuwx{|~ }~~o\OJJORPOOONLJGJJIIHIJJLMMNOOLHFDCDEDB@@DCC?>HNQPOU_dgjuwyyxy{ ~|{zzz|}{toszwyz} }{z|ured\G-3*#!!!5Lcttqwy}{ ¡¢¡¡¡ ~{|zwwuutsrpoonmmmmmlkjjiijjiihhgfeeddddddeefgfghgffhhiijjjkmnnnoppqstuuvwxxyyzzzz{|}~ ¢¢¢¢¢¢¢¢¢¡}ytnljgdcdfgghhhiijkkoqqtuuwzz{{zz{{zzzzzzzzzzzzyxxxwwvvvvwwwxzzzyyyzyyxxxwvuuuuvvvuuttttttttuvxyzzz{|}~~~~}|}}{zwrnfa\[\\[]\^\[\\[]``aabbbabceecbbcdeffghijhhiijjjjhhhhhhhiihgfeedccbb```__``_^]]]^^]\\\\]^WVVUUUVX]djjhhjmptuuttokc\USQPSWYZ[[\bgjoqpnnptwvvutsrrstsoib^_blmmmkb\\\\^adhknhb_^]^^ZWROHFIHJJIHFDDDDDC@=96213213456787889:;<>@DEFHJLNONKJJJIDFc¢¡zsnnoprtxz{{||||||zywvvwy{{zzz{{|} ~}}~~}}}~~}}|}{zz{|}~|zzz|~~~~~}}|{{zz|~~~~~|}~~~~}~~}{||||||zzzz{||||{{zzzzz|~|}~~~~~}}~~|z{|}}{ywwvuvwxvuxz}}|wvttuxzz{zzzzz{{zzxwwwww{|}~~|o^SPQRRRRRPOMJJIHHJLNNOOPPPLHDA??@@>>>?>BDDD>DCCISW[`hknnlkmosy~{} ~~~ ¡ }yw|pi^P@8*!>^ip}zvzy¡¢¢¡¡¡ |zzyuvuutsqponnmmmmmkjjiiiiiihggfeddddeddcdeffghihhhikiijjjkmnnnopqrttuuvwxyzz{zz{|}~ ¢¢¢¡¡¢¢¢£¡ ~ztpolhedefgghiijjklknoorstvyz{|{{{|{{{{{zzzzzzyxxwwuuuttuuuvwyyyxxxxwvvvvvuuutuvvutttttsssrttvwxyyy{{}~~~}|}}{zxsohc^^`]]b`ba`bbbdeedddccbefgghggghikllmmnlmnnoonnnnnlkjjkjiiiiihheeedccefedcbbabb`aabbcdd`\YVUUWZ^ejjhhjlptvvuuqlc\VRQQTXY\\[]djmqrqnnqtvuutsqpqrproh]Y\`kllmjb[[[\_abcfhb]\ZXXZWWROFDJIJMLLLKKKKIGEDC?:686567667888;<<=>ACEFGILPPPOMLMLJFQm ¥¥¢¢ {sppppqsux{{||||||zxvvvwz|{zz{||}~~~~~}|{||zzz{|}~{zzz}~~~}|{zzywwz|~~||{{{{}~}|{{||||}~~~|z}}}}~}|{zzzzzzzzzzzyzz}|}~~~~~}|}~{{|||zywxwwxzzxwz|}|~}ywutvz|}|{zzzzzzzzxxyyyx}}}~o_VRQRSTTSRPLJIFFHKNLNPPPPKGC@==>>>?>B???>?;>BEIKKOVV[`bbabegjouz{{|| ¡ ~{volk^LD, !!@Xlzxyz} ¡£¢¡¡ |zxvutttsrqpqqnnnnmmkjjjiijjjihgfeeeedbbbcdeffhhiiiiiiijjkjkklnoprstttuuvwxyzz}|{{|}~ ¡¢£££¢¢£¤¢¡ {xutojgfeghhijkkkjjlmnnopqrwxzzzzzz{{{zzzz{zzzzyxxwvtrsrqrtvvvvvvvvvuttuuuuvvvvvwwwvvuttssrttuvxyyyz{|}~~~~}|{{{ytqhfbbbceedeffffghijjjiiiijklmnnmmmnoopppqstttsqqqqrrrrrrrsqonnnnnkkkklljiihhhhhfefffffghjhbZWVVY]bdfffhmpqtvvvusqh_VUTSUX^^`]_hlputtrqqrsqrrrpooopnid\X\bilmjd_\\]]^abccc`\YWXYYWURNJIIJKOOPPPNMLKJJIHD@=;;::99::;99=??@BBDFHIJLNQQNSRUMJJ\z¡¤¥££¤¢~vuqnooquxz{zz{{z{zzxwwyzzzzz{|}}}~~~}}|{{z{{{|}|z{|}}|}}~~}}{{}}}}}}}}}~~}{z{|~~|{}}|||}~~}|}}}}~~||||||{{|}}}|{zxvxz}}||{zzzzzz{}~}{z|~}|}}||}}|z{|~~|{{{}~~~~~{xuvxz{~||{zyyyyxvvyzxy{||}~ unWSTRRRRRSTROJHGGGGIKMMMMKIDB@>>==>??@A?=;<=AFGDBEJJNTXXVWYX[hrqrwy{ ¡ {wroogYUA*!!#!&7Weozv|yz} ~|zxvuttrrqpoooonnnmmmkjjiiijjiigfedddccccccddeeghhhhhiihijkkklmnopqsttttuvwxyzz{zzz{|}~ ¡¡¢£££££¤¢¢¡ {xvtoigffgghhijkkkklmnnnnopttvxzzzz{{{{zzzzzzyxwvvutsrqqpqsttttuuuvvuttuuuuvvvvvvwwvvvuutttsttuwxyzz{|}~~~~}|{zxtpjheefgggghhhhiijmnnnmmnnlmnnoooouvwxxxxyvwvuuuvvyyzzzyyyttrqqppooonnnnmlkkjjjjhhiiiiijklje`\YVX\abdfhlorsttuvvtpjaWUTTV[`_bacjnsvutrppppooppnnnnnlgaZV[bhkkhc_\\^^`abbbb_\WVWXWVTROLJJJJNNOOONMLKJGFFFEDDCA?><<;=<<>@BDEDFHJJMPQRUSSSVTQWh¡¤¥¤£¤£ytonnnqtuxzzzz{z{{{zzzzzzzzz{|||~~~~~~}}||{{||||}{z|}~~}}~~~~~~||}}}~~~~~}|{|}~~~~}|||{||}~~}}}~|{|}}}~~~|{zzzz{{|}}||{zxwx{}}|{zzzyyyyz{}|zzz|~}}~}}~~~}~~~~|}~~~}~~|yvvxz{}}}|{zywwutuyzyz||||}~ ~zwtttzrmWQQPPPPPRTUSPLIFEEFFFEEFFFBA?>=<<<==>@@>===?BB@@DIHIJMOPRU\YYWVbsyz~ ¡ ~zwtusmhcRDA2"$#!CVqssywz{~ ¡ ~{zzxvutttqpoonnnonnmmmmkjjihhiihhgfedddcccccccdddfghhhhiihijkkklmnopqstttttuwxyzzyyyzz{|| ¡¡¢£¤¤££¤¡¡ ~{yxuohggggfhiijklmmlmnnnnnoqrsuwxzzzzzzzzyxzzyxwuutsqppoooqrsstttuuutttuvvuvvvvvvvwwwwvvvvvssttvxzzz{|}~~~~~|{zwsokjhhiiiikklllmnnopqqppqruuwxyyzzvwxxxxxyzzyxxyz|zzzzyyxxxwvvuttttsrqpoonnnnmnnmmmnnnnnnnnlif`ZX[\\^bhlnortuwzxsmh`XVVWY\b`dehmntxvtronnnmnnnnnnnnid^XV\bhjjhb_]]_`bbbbbb^[VVVVUSSRQPNMLKLMMNNLKJGECBDDEFFFDDCBBBAA?>@DFHGIJKMORUSWYTX_fflw ¤¤¤¤¤£ ~sopnnqrrtvwxyzyz{||{zzzzzz{{|{{}}~~~~~~}}}}}||||}}||}{z}~~~~~}|{{|}}}~~~~~}~~}}}}~}~~~~}{{{{{{||}~}|{|}}|zz{}~~~~}|zzzzzzz{||||{{zyxy{}}|{zzzyxxwyz{zyxyz|}~~}~}}~||}}}}}}|zxxyzz{~}}|zxutttuyzzz|{||}~ ~xtrdYVVZSSNLKLNOPSSSRPLIGGFEDBBDDDCA@>=;;;:;=?@?>=>>>>=>BFFDDEHJNQVY[VXfqry~ ~{zyyzzuuj^WJ3#,J_m{xtyz} ¡¢ |zzywuttssqpoonnnonnmmmlkjiihhhhhhgfddddcccccccddefghhhhijijkkkklmnnpqrstttuuvwxxywwxyzz{| ££¤¥¥¤££ |zzupjggffgijjkklmnnnnnnnnnppqstuvwyyyzyxwwxxwuttsronnnnnoprrsttttuutttuvvvvvvvvvwwwwwwwwvvttttuwyzz{|}~~~~~}{{zwrnmljjkklknnnnnoqrrsttttturstuvwwxzz{{{{{|}}}||}~~~~~}|{{||{{zzxxwvttsrrrsrqpqrrqqrrsrqqqrrqnh`\\Z[]bhmnonptwxtld`\YZ[\\^caegimntywtronnmnnnnnnnnkga\Y[agijifb_^_bcedcccb^ZVUUUSRPPQQPONMLLKKKJIHCBABBCCBDDEFGHHHCDA>AFKKLMOPPRVXXZ^Yaguz¤¢¢£¤¤¢wtvnloooqstuvvvzz{|{zzzyzz{||{{}}~~}~~~}}}}}}|||}}}}}|z|}~~~}~}{zzzz|~}}}~~~}{zy{{{{{{{{~}|{{{zyz{|~~~~{zzyzzzzzz{{{{{zzzzz{|}||{{zzyxwyzzzxwxxz|~}|}~}zz{{{||{{|||zyxyzzz|||{zwtsuvxzzzz|{|} ytobVMPUPNJIIJKMPRPQQPOLJJIIHGFFEDDDB?><;:;;;>>>>=>====>ADDCDEGJMPSWXVZhrsz~ {{{yxz{vttpmngWE6+,28701-)%!5JYhptyxx{~ |zyxwutssrpponnnnnnmllllkjihhhhhgfedbbbbbbbbbcddeffghhhhijjkllkkllnnnpqrrsuuvvwwwwvwxyzz{| ¥¥¥¥¥¥£¡ ~{zztpkhfefhkkkklmmnnnnnnmnnoopqstttuvwwwvuuttsrponnmmmmnnoprrstttttuttuvwwvvvvvwwwwwwwwvvvvuuttuvxyzz|}}}}}~|{{zxtpnmlklmnnnooppqsttuvwwxyyzzz|}~~~~}|{zzzywvvvwuutttuuutuvvuuttuuutohb_WY\`eiklnruwuphb[[[\]^_`ebfginotwusponnmnnnnoonngb][[_flkjheb_`bdghgdddd_ZVUUSRQNOPPPPOOLKJIHGEDBBBCCCAACDGIJJJJDEDBDKQSSTUUVWZ\_^ccjlz£ ¡¢££¡ }|qlnlmmnprtttxyzzzzzzxzz|}}}}~~~~~~~||}}}|||{}~}}}}{|}~~}|||~~}{{{{|~}}}}~~}|{z|||{{zzz}|{{zzzyzz|~~~|{zzzzzzzzz{{zzzzzzz{|||||{{zyxxz{{{zxxyzz}~}}~|{|}|zzzzz{zzz{{{zyxxyzyzz{zyvtsvxz{{{|}}}~vqle]QPTPKIHHIKMPSSSRRQOLJLKKJIFDDDDA?>=<<==<<=>=<<=>?>=>B@ADEFGKOTVUU\hpuz}}~ }~~{z{{}y{ztwtg]VUXWTMF98730+%!)6DYjt{vtty} |{yxvutsrroonnmmnnnmlkkkjihhhgggfeedbbbbbabbbcdeffgghhhhijkkllkklmlmnnppqqtuuvvvvvvwxyyz{} ¥¥¦¦¦¥¢ }{zxtplhfdfhllllmmmnnnnnmllmnnpqsttttttttttsqqponmmlklmmnopoqrstttttuuuvwwwwwwwwwwwwwwwvvvuuwvuuuvwxzz{|}}}}}|{{{yuronnmmnopopqrssttuvwxxyzzzzz{}~~ ~}}}{{zzyyzzyxxxyyyyxyzzyyyyxwwwupjg\\]adhiighhheb\XXZ\\\^`bedgehoqutronnnnmnnlmnnljb_[Z\bhmkjhdaabdhklhffffa[VSRPPPMNNNOPPPLJHFEDCBAAAAABBBCDGJLMNNKKJJKPTVVWYYY[\^bbhnuu~ ¢££¡vonmjjjmoqrtvwxxxxyywyz|}~~~~}~~}||}}}|||{}~~}~}|||}||{{|}~~~}||{|}|}~||{|}~~~~~~~~}|zzz{zzzzzzzz{|}~~~}{zzzzzzz{{zzzzzzzzz{{||{{zzyyx|}}|{zyyyz{||||}~~}||}~|zyyzzzzzzzzzzzxxyzzzzzzxvttwyz||}~wqnh_PHMJJIGGIKMPRUTTUUSPNOMKJHEDDBA?>===>>>>====;:<>?>=>?@ACDEGKPTVW\ekotz{{{~~} |zxwxz~~ztjWICAIJKJGCA@GP\gszzvwwx} }{zwvutsrrqonnmmmmmmlkjjjiihhgggfededbbbbbbbbbcdeffgghhhhhijkllllmnmnnopqqqttuvvvvvvxyyyz{} ¥¥¥¦¦¥¢ }zwtpkhfeghkklmnnnnnnnnmllmnoprttttsssrqqpppponnmmlkmnmnopoqrstuuuuvvvwwxwwwwwwxxxxvvvvvvvvwvvuvvwwzzz{|||||{zzzytqnnnnnnopqrttttuuvwxyyzz{zz{|~ }}}|{z{{zzzz{{{zzz{{{{{|zzzzywspnjhhkmljdba__^ZVQV[\[\_abbc`cnqtrpnmnnnnmkihihgd_\Z[^dilkifcbbehknnjgghhb[TQPMKKKJJIJKNPKIECCBA@@@@@@ABBCDEHJMPPRQPPQRUWZ\\]]^abeeitz ¢£¡~xtrkiijmnoprstuuuuuvwyzz{}~~}|}}}~~~~||}}|||{|~~}~}|}}}|{{{|~~~}}{zzzz{}~}~~|zzyzz{}~~|{z{zzzzzzz{|}}~~~}{z{{{{||{{{zzzyzzzzzzz|{zzzzzz~~~|zzzzzzz{{{{||}}}}}}}}}}|{zyyyyyyyzzzzzxxzzzzzzyxwvvyz|||}~ zsnkgbURDDFEFHJKMPQRTVVURQPMKJHEDEA?><;<==>?@>>>=<:::<>>>?BCDGIJNRVXVXckouwzzz{{z}|}~ }|{zv{ytrohcdecb_YUUZ_nrwyvxzyy|}~|zyxuuttsrqqponnmmmmmlkjjjiihhggffeddbbaaaa`bbbcdeefgggggghhijkllmnnnnopqrsssttuvwwvwxxxxy{~ ¤¤¥¦¦¥¢ {xtojhggghjklnnnnnnnnnnmmnoprsttttsrqpoonnnnnnmllklnnnnopnrstuvwwwvvvwxxxwwwxxxxxxvvvwwwxxvvuuvvwwyzz{||||zzyyywsomnnnnnnnrtuvvvvvxyzzz{|}{|}~ ~}}~|||}}}|{zz{{{{|}}}}||zywwqkikkhdVTQQRSOJJRZ\[\]^^^_Z^kpsqonmnnnnjhfefeb`_\[\`fijjhebbcgimppkhhijc[TPMJHIHFDBCEIJJHDAAAA@?@ABBAAADDDDGJMPRPRUVVX\^_abbcegghhrw¡¢¡zxnkiijklnnorsssrrtuwxxyz{~|{|~{{|}}|}}}||{{|}}}|~~}|{{|}~}}|zzzz{||{{|}{{{zxwvvyyz{|}~~~}|}}|{zzz{{|}}}~|{zz|}~~}}||{zzzxyzzyyyz|{zzzzzz~}{zzzzzzz{{{{{|}}}||||}}~}|zyyyyxxyzzzzxxz{z|{zyxxxxz|}|{|}wpnkioaYDEDDDFHIJMOQUVURPPMKJJIEDDB@><::;<<?A@?>><;889=>?@CDFJMOPQTYY\hprtuzzzzzz}{|~ zwzwtonnortwy{{zyzz}~}{zzxuutttsrrqponnnmmlkkkkjihhgffffedbba`abbbabcddeeghhhgggghhkkkllmnnopqqqrstttuvvwxyyyz{{{}¡££¤¥¦¥¤¢ ¡ zvtpkihhhjlmnnnnopqponnnnoqqqstttsqqqppooonnonnnnmnnnprsrqttuvvvwxxxxyzzzyyxxwwwxxwwxxyyxxwwvuutuuyyzz|||{{zxwvtqnnnnnnopqsttuvvwxxyyz{|}~~~ ~~~}}~~~~}~{urj`UPSROMIHLORTVWZ\YWZYZmptrnmnnqqnhb^^_]]^^]\]bhjihgebbeghnonjghmrjTPNDDDDDB@>=>GPNMJD@???@ACDFFEDDDDDDHLPVTVZ\]`dgghhhijkoqz {xnmhgjknopqrqrrrstuvvwyz|{{zz{{|{||}}}}}{{zz{|}}~}~~|}~~}|}}~~~}{|~~}}~~|{zzyxvutttwz~~~~~|}}}~~~}}|{z|||~}zwwxyxwvvvvwzzzzyxyyz|~zyzzzz{{{{z|||}~~~}||}}}}|{{zxxxyzzzzzzz{{{|{{|zyz{|||~~}|~ ~xvvsrshlbNHHFDDHJJJJLNPPOMJHGGFDDCBB@>;<>A@?>>>>>>=>>==>@CDEFJPQQTW\\`lpqywyzzzzz|{|~~|~ ¡ ~~{z{}wxzzzzz{ |zzyvttttssrqqonnmmmlkkkjjihhgffffeecbba``abbbbcdddefghgggghhhjjjklmnnopqqqrsssttuuvwxyyz{{{} ¡££¤¥¦¥¤¢ {wuqlihhhilmnnnoopponnnnooqqrsttssrrrqqqppnnnnnnnnnopqrrssttuvvwxyyyyzzzzzzyyxxxyywwxyyyyyxxwvuuuuwxxzz{{zzyxwutpnmmmnnpqqsttuuvwxzzz{|}~ ~ysgZPMRQONJIHKNPPPQSVRVYXlrttonooqrn`[WWXWVX[[\_dhjihgecbdghmnnjhjnpdPKI?>>=>>==<>GPPPLFCAAABBDEFGFEEEEDFIMPSTW[^acfhhjjklnnnpzwskghhjopqqqqrsttvvvwxzzzzyyzzzz{{||||{{{zzz{|}~~~~~~~~~~~~}}~}|}~}~~|zzzyxwvvvux{~}|{zz|}|}~~}zxwvvvvuuvvwxyyyxwxxz{}~|ywxzzzzzzzz{{{|}~~}}}~~~~}|{zxxxyzzzz{||}~~~}}|{|~~~}}}}||{|} |yxwttoihh]QOJGFGGEHHHIJKKJIFEEDCBCABA@>>?A??>>????>>>>>?BDEHIMSTUW[_^bnppvvxzzyyz{{z{||||~ ¡ }|zzyyyyzz|} ~zyxwtsttssrqqqnnmmmllkjjihhhhgfeeeedcbb`__`bbbccddddeefgghhhhhiijjkmnnppqqqrrsttuvvwxyyzz||| ¢£¤¥¦¥¤¢¡}zvrmjhhhimnnoooppoonnnooprrsttttsssrrrrrrnnnoonnnoqrsrrsttuvvwxyzzzzzzzzzzzzzzzzzwxxyzzzzyyxwwvvuvvwxzzzzyxwutrnlllmnnpqrrstttvxyzzz{|~ }vj]WVZUOPKHIIHFEFJLSPUXVlvutpopoppm\WTTUTTUXY\bgijjhgedddgknlhefimnYGDC<;;::::;;>ELPOKFCBA@BBBDDEEEDEEEFJNPRVZ\`dghilnnnoqtsu zphhghmnnnnoqrtuwwvvwyyxxxxxxyzzzzzzzz{zzzzz{|}~~~}}|}}|}~~~}|zzzyxwwwvy{}~~~|{}}{zzz|}|}}}~~}{zwvuuuvwwxxwwxxxxxxzz|}{xvwyyzzzzzzzzzz{}~~}~~}}{zyxxyzzz{}~~~}}~~||{{{{{{}|zzzwwlg[\[QNIFGIIGIHGGHIJJHEDCBAAA?ABCA@??>>>>?@@@>?@??@CDDHJNSTVY[_`dnpotuwxyxxyz{zyz{{||} ~|{{|~ |ywvutrssrrqqppnnnmmmlkjihhhgggfeeeddbbb`^^`abbbccdddeefghhhhhhiiijkmnnpqqqqqrstuvwwxyzzz{}}~ ¡¤¤¥¥¥¤£¡ {wsmjiiijmnoooopqponnnnopssttuuttssssssssppppppppqrsttttuuvwwwwxyzzzzzz{{zzzzzzzzxxyzzz{{zzyyxxwvuuuwxyxxwvutromjllmnopqrsstttvyzzzz{|} |umjij_TSNJJJGDCDHKRQVVRlztsooqqolg\XVVVUUVVX^fkkjjifeffehlkiebbfgeQCB@:;:999:<<>BGJJHECBAABBABCDDEEFGHJLPSW\_abhiimorsrsuw{~vnkhhiikmnnpruwxwvvvwxxxwwxxxzzzzzzzyzzzzzz{|~~~}}}}||~}}}~|{zzyxxyyz{}~}}|{|~~~}{yyz{|}~~~~}{ywwwwxyyyywxxxxyyyzz{|zxwwyyyyzzyyyxxxz|}~~~~}|{zzyxxxyz{|~}}}}}{zzzz{|||} ~}zzxnfSLOJHDDEIJKLKJJJJKLJGDBA??@?ADEDDA?>>=>>???>>@@@BDEEIKNQRUZZ]_enpptuvwxxxyy{zzzz{|}|~~~~~ }zxvttsrrrqqppoonnmlllkjjihhggggffeddcbba_]]_abbbbbcdeeeghhhhhhhiijjlmnnpqqqqqrstuvwwxyzzz|~¡£¤¥¥¥¤£¢¡ }xsnkkkklnnopppqqrqonnnoprsstuvvutttttttsqqqqqqrrttstuvvuwwxxwwwxzzzzzz{{zz{{{zzzyyzzz{{|{zzzzyxvuuuvwwwvuttronkimmnnopqqstttuwyzzzz{|}~ {yyzl]ZSNHIIHHHJKPSVTPl}tsprtsoh`[XVVUTTUV[bjnmkkhgfghghlggda`_ZUNCA>::88::;==>ADGFEEDDDDDCBBDEFFGHJKMPTV]bdegknnpsuvuuwz upjhhhjmnprtvwxxwvvwxxxwwxxxzyyyyyyyzzyyzz|}}}}}}}~}}~}||||||}||}~~~~}}}~~~~{zyzzz{}~~}|zyyxyzzzywwxxxyyyyyzzzxwxxxyyyyyyxwvwy{}~~~~|zzzzzyxwxyz|}~}}}{zz{||}~}|~y{vtiZKNHFDDCDGJLLMMMNNOMJFDB@??@BDFGECA>>==>>>>>>ABCDEGILMOQRV\\]agnqstuuvwwxxyzzzzzz{~}~~}}~ ~{zwttsrqqqppoonnllkkkjihihhhggggffeddcbba_]]_`aaaabcdeeegghhhhhhiijjkmnnppqqqrrstuvvwwxyz{}~ ££¤¤¤£¢¡ ~xsnllllmnnppppqrsqponopprrstuvvuttuuutttqqqqqrrrttttvwwvxyyxxwwxzzzzzz{|{{{zzzzzzzzzz{{|{zzzzzywvuuvvvuttsqonkjilmnnoppqsttuvwyzz{{|}~ vf^VPJJIHHIKMNSRSPi{ttrttqkd\YXVUTSSTX^glnnmkhhhhiihhfd^VTSPLG??=:;89;<=>?@ACDDDFGFFFDDCCDEFGHJKMOQTV^begimqstuxyxxzz}wlghghkmnqtvxyxwvvwwwwwwwwwzyyyyyzzzyyyzz|}~~~~~}|~~~~}}}|zzz{~~~~~|{zzzzzz}~}zzyyzzyxwwwwxxxwwwwxxwvwwxxxyxxxxwvvxz|}}~~{zyyzyyxwxyz}~~~~}||||}~~|}~ xulbPLHFEDCBDGJKNPPPPPNKIFDB@@?@BDEDB@?>>>>>>>>@CDEFHJLOOPQRV\^^bhmprrtuvwwxxxxyzzyxz}}~~}}~ ~}zxutrrqqqqpoonnnlkjjjihhhhhhgffffedccbba`_]^_``_aabcdeedffgghhhhiiijklmmopqqqrssttvvwwxyz{|~ ¡¡¢¢¢¡ ~ztnlmmmmnopqqqrrsrpoopqrssttvvvvuvvvvuttrrrrrrsstttuvwxxyyzyyxyyzz{{{{{||{{zzz{{{zzzzz{{{zz{{{ywvvvvuutssromkjiiklmnoppqsttuvwyzzz{{|}~ ziaYVVVTRPPPPPTQVVgvusstrib^ZYYXVVVVVXahlnonkijjiklhc_\TJGJKJC>><<>=>>?@ACDDDDDDGHHGGEDCCDEGGJLNPPRTV\_chknruuwyzzz{||rjkhghijnsvxyywvvwxxxxxxxxyyyyyzzzzzzzzz{|~}}~~~~}}}}~~~}}~}}~ ~{zzyywvvvwyz{{{|~~|||z{{zz|}|~~{zyyzzyxxwvvwwvvwvvwwuuvwwwxxxwwxwvwyz||}|zzzyyyxwwxy|}~~}}~~}~~~~~~~~~~~~~}~ yshTEDBBBCCEHJKNPPONNLJIHFDBA???@BCA??>>>>>>=ACEGHHJJMPPQSSU[^^binoqottuvwwwwxxyzzyz{|}}}} ~~~}|xwtsrqqqqpponnnmlkkjjjhhgggggfeefedcbbba`^]^_`_^aabbdedddeefghhhiiijjklmopqqqrsttuvwwxyzzz|~ ¡¡¡ ~ztommmllnopqqqrrrqpooprsttuvwwwvvwwwwvutttssssttttuvvvxzyzzzzyzzz{|||{||||{zzz{{{{{zzzz{{zz{|{zwwvvuutsrrqnljiiiijlnnppqrstuvwxyzzzz{|}~ zjc_`behhe^VRUVR\\eswqrsmb[YXYZZYWWYYWbiklookkmljlmh_PQNGDFGED?@=>?>@CDDDEFEDFEFIJIHHGFEDFGIINPQRSTVV\_eknotxvxyz{|}}~ xookhhhhntvxyyxwwwxyyyyyyxyyyyyzzz{zzzzzz{|||}~}{zz|~~~~}}~ ~{yyxwwwvuttwz{{{|}~}}}z{{zz{{zz|~|zyyzzzzxxwwwwvuxvvwvuuuvvwwwwwwxwvwyz{|}}{{{yyyxwwxyz{||{{}}~}|}}}~~|}}z}}}|||}~~o\D@>>@BDEGJKMMLJJIJIHHGECBB@?@BCCA?>>=>>>=BDFHHIJJNPRSVUV[^^elorrptttuvwwwyxxzzzzz|}}|} }{zwutsrrrrrqponnlkllllkihghgfeeeeeffdcba`_`_^]^^^^_`bcdeeeeeefffgghhhijklmooppqqrruvwwwxyyz{|} |wronmmmnopqrrssqqqpoprtvvwxxyyyxxxxwvuuuuuttttuyxwvvxyzz{{{{{{|{{|}}}}}}}}}}}}}||{{{zzz{{{|||zzzzyxvtrqqnkihghjijlmnnpqrrstvxxxzzz{{|~ wrrtuuuutmd]ZZ[^acgjmlkaYYVXY\][Z\\Y_bgknnnnknlimndVNMKIGEDDCBA@ABDFIJJJJJIHGHIIJJKLLLKIGKPNRRUX[\^bdgjnosvyzz{||}}~~wuojgdhrttvwwvwyxxxyyyyyzyyyyzzzzzzzyzz|z{}~}{{{|}}~{{} |{zz{zyyyyyyyxyzz{|||~}}}~~|zz|{zxz|~~}zzzyyyyxxxwxxwvuwvvvvvvwvvvuuuuvxvuuxyyy|||~~|zzyyzzyy{z{{{||}|||{{|||}~~||~~|z|~~~|{}||}waN>=?@;GJJJKKJIHGGJIFDDDB>><:<>?@A?>>>>>>?ACFIIIJNPRRSUTV[]bhmnoqsttuvvwxxxyyyyyz{|~~}} ~|zyvtsrrrrqrqpoonnmllmlkjihhhfeedeeedcbba`__^]]^____`bbccdeeeeffggghhijkmnnooppqrssuvwxxxyzz{{| {wsonmmnooprrrrrrrqqpqstvvwxxyyyyyyxxwvvvvuuttuvyxxwxyzzz{{{{{{|{{|}}}}}~~~~~}}}||{{{{{{||||||{zzzzyvtrpnlihgfghhijlmnopqqrsuvwwyzz{||~~ |zzzzzzzytnhca`bdddc_^_YUVVZ^]]^^]\\^bgknnoomjhhheZOGFEDDDDDCCBBCDFHIJKLMLKKJKLMNOPQQQQPOSWVXX[^abdghjmosuxyz{|}}~{xplhddirtwwvuuuwwxxyyzzzzyyyzzzzzzzyzz{z{}}|{||}~}|| ~|{{|||{{{||}}{||}}}}|}}}|||||{zyz{{zy{|~~|{zyyxxxxxyxxxxxwvwwwwwwvvuuuuuvvvxwvvwxyz{{|~}{zzzzzzzzzzzz{{||}||{{||}}~~}||{{z{|}}}}}{zz}{k[C=>>;DGHKLLKIFDDDDDBABA??=<>?@ABCB@??@BCEEGHHHJNRTTTVUV\^cinoprttuvvwwxywxxxxxzz{}~}} ~~}{yxttsrrrqpqponnnmmlllkjiihhhgfedddbbbba`__]\\\^_``_`abbbcdeefffggghhijlnnonooprsstuvwxxyyzz{{{~~ |xtqpnnnpprsssrqrrrqqrttvwxyyzzzzzzyyxxwwwwvuuvwyyyyzzzz{{||{{||{||}}}}}~~~~~~}}}|{{{|}}~}||||{{zzzzwtromjhfeefhhhjkmnopppqstuvwxz{||}}~ }zvsojgffb\XUSVTSVV\a^^bb]\]\_eimoppha\]\VLGBA@ABDDDDDDEEGIJKLNOPPPPPPQQQRSTSSTTTY^^^_bdghjmooqtvyzz{|}~~ zvolkgcdjqvwuvvvvvwxyzzzzzzyyyyyyzzzzzzzz{|~~~}}~}|||}~~~~ ~}}}}~~}}}}}~~~}|{zzz{{zzywvwz{{z||}}|{zzyyxwwwxxzyyyyxwvvwwxxwwwtttuuvwwwwwvvwyzzz|~}zzzzz{{{{zzzzz{{{||zzzz||{{{{{{}~|~~|zyz{zz|~~|{zyy{|tcF;=<<?EHJJKJGDB@@A@>>>@AA@?@@@ABDDCCCCDDGHIIHHJMQTTTVVW\`djnoqstttuvvwxxwwwwwxyz{|}}}~ ~}|zywttsrrrqponnmmlkjjjiihhhhhgfedccbbbaa`_^^\\\\]__`aabbbbceeeffggghhhijlmnnoopqrrsstuwxxyzzz{zz}~ ¡¡ |yusqooopqstttsrsrrrrstuwxxyzzzzzzzzzyyxxxxwvwwxzzz{{{zz{||||{|}|||}}}~~~~~~~}|{{|}~~}|}}||{{zzxtqolifeedeghhjlmnoqppqstuvwxy{|}}}~~ |zwvqljhbXRTPRSSVW]__ab`[XXZ]behiih^VOPOJFECA@ACDDDFGHIJJKLNOPRSTTTTTTTUVYZZYZZY^bbcdgikmoqttvxz{}}}}~~~~|ztonhdfdmtttuvuuvwxyzzzzzzzyyxxyzzzzzzzyz{|}}||||||||~ ~~~}}}}~~|{zxwxyzxvvutvyz{{{{{zzzyxyyyxxxyzzzyyyxwvvvwxxxxwuuuvvwxxxwwvwxzzzzz|~~|||||||||{{{zz{{{{zwvvwz{zzzyxyz{z{{zxwxz{|}}{zzxxz~}xdJ;>=>=DIGHHHFDBA@?>=<>?ADDDCA@@ABCDDDDDDIJLMLLLNPRSTVW[`bfknoprssttttuvwwwwxxyzzz{|}~~~~ ~}{zywvttsssrqqnnmlkjihhhhhggffffedcbbabbba`_^]\\\\]^__abbbbbdeeeeffgghhijklmmnoopqqrrstuvxxyyzzzzz|} ¡¢¡ |yusqoopqrttuuttsrrrsttuwwxyyzzzzzzzzzyyxyyxwxyz{||||{{z||}}||}}|||}}~~~~~~}|{|}}~}}}}}}{{zzyurokhedddefghiklnopppqrtuvwxyz|}}~~ }zyyuqnibZUSOPQSVX^_bb\VTRPZ\____][VQKIIHFEEDDDEFFFIJJKKKLMOPRUVXZZXXXY[^bfhffebehghilnprttwyz{|}~~~ vohdfcjqrrstsvvwxyyzz{zzzzyxxyyzzzyyyxyzz{|||{|||||~ ~}}}~}{zyxvvwwvtuttvxzzzzzzyyyxxxyyyxxyzzzyxxxwvuuvwxxxxwwwwwwxxxwuvxyzyzyyz|~~~~}}|||||{{{{{{ywtrrtwyzzzyxxyzxyyxwwyz}|zyyyxy{~~}||gJ;?@A=BFEFGFEDDDB@>==>>?EEEDBBBCBBCDDEFGJMOPPPQQQSTVY[^dfimnopqrrsttttuvxxwxyzzzzz{}~~}} }|{zywutttsrrqqponmlkjihhhhhgfeedddcba`_abaa`_^^\\\\\^^^aabbbbceddeefgggiijklmmnooppqqrrstvxxyyzyzzz|} ¡¢¢¡ |zuspnoprstuvvuutsrsttttvvwxyyyyzzzzzzzzyzzyyyzz||}}}|{z}}~~}}~~}}}}~~~}||||}~~}~~~~}|{zzyvspjgdcccdefhhjkmnoopqrstvwxyz||}~ }||zvrjb\YVQRQTYZ__a\TMLMLWZ\[ZYWUPOLJIIFDFFFGHIJJJKLLLMNNPQSVZ]_aa`__`chjljkkijmlnortuxzzz{~~~~{ridfcgknprstwwwxxyyyzzzzzzyyxyzzyyyywxxyz{||}~~~}|}~ ~~}||}~~~~|{zzywwwwvuuuuwyzzzwxxxxxxxwxyyxxxyzyxwwwvvuuuvwwwxwwwwwwwxxvuvxzyxzxwwz}~}}}}||{{{zzxvtrrtvxyyyyxwwxxxxwwxyz{yxxyyz}}{z}~mJ:<@@>?BDEFFEEEFDA?>?>??DDEDCDDEEDDCDGJKLMNNNPRSRTUVY\_ejlnpppqrsstttuvwwwwwxzzz{zz|}}}~ |{zyxvtttsqpppponnmlkjihhhhhgfdcbbbba`^]_____^]]\\[\\^^^_`aabbbcdddeffgghhiklmmnnoopqqrrstvxyyzzyzzz{|} ¡¢££¢¡ ~zwtqopqttuvvvvvttstttuuwwxyyzzzzz{{{{{{zzzzzzz{||}}}}||}~~~~~~~~~~~}}}|||||}}}~~~}|{zzxtrkhdcdddefhhiklnnopqrstvxxyz{|}~ }zunhcbb\ZUVZZ\YWRMJJJKSVXVVVTPKJJJIHFDFHJJJJKLLMNNOOPQRSVY\`bcffedehjmlknonnqpqtvxz|}}}~ypigdcejnqtvwwwxxyyyzzzzzzzzxyyyxwxxxxwxyz{|}~~}|}~ ~~}}}}}}~}|zzyxxxxxwwxyyyyxvvwxxxxxvwyzyxxyyxvvvvvuvvuuuuvvvvvvvvwwvvvwxyxwywuvy{}}~}~~}}|{zzzzxwvuuvwxvwxyxxwwxxxwwwyz}zyyyz{~~||yz||{|zs[E<>;>=>ABDEEEEFCBBBB@ABDDDCCEGGGFFFGIKMKLMLLOPPQSTVY\`glnoppqrsstttuuvwwwvwyzzz|zz|}}}~~ ~}|zyxvtttrponnnnnmlkkjihgghgfecbaaba`_]\\\\]]\\\\[[\\^__]^``aabbcddeffgggghjklmmnnnopqrsttwxyzzzzzzz{z| ¡¢£¤£¢¡¡¡¡ }yurpqtuvvvvvvvuttttuuuxyyzzz{{{{{||||{z{{zzz{|{{||}}}}~~~~~~~~~||||||||||}~~~|{zzyutlhedeeffghijklnnpqrstuwyyzz{{}~ ~}~~}{yuqprnhbYVYVVQLJJKJJKPTURPPMIIGFHIHHJGJLMLLMNNOPPPQSTUVX[]abdgghhjmortsuvttutsvxzz~xnihcbhnnqtvwwxxyyyzzz{{zzzxxxxwvwwyxwwxz{|{|~~}|}~}}||} }}}}~~~~{{zyxyzzyyzzzyxwuvwxxxxxvxzzzyyzxwvuuvuuwvuttttuuutuuuvvtuwxxwxxxvuvxzz{~~}||{zzzzxyyzzyyxvwzzzzyywxxwuuwy~{zyz|~y{|zyvvtWA>8>:<<>ADDEEECCDEDBCEDDDBCEGGFGIJJKKKKMONNOONQSTV[^cjlmoppprsstttuuvwxwwxyzzz|zz{}}}}~ ¡ ~~}zzxwwvtsrqpoonnonmlkjjihggffedcb`__^_^]\\\ZZZZZY[Z[\\]\\\]_abbcdddddeeffhhhijkllnnnopqrstuvwxyyxzzzzzz} ¡¡¡¡¡¡¢¢¢¢¢ }zwutuvxxxxxwwwvuttvvw{zzz{|}}}~~}}}}}|{{|~||}}}}}~~~~}}|||}}~~~~~~~~}|||{zwtqkfeeddffhiijknprrstuwxxzzz{} ~|zzzzxtlb\YVSPMKJIJKLLPQQPOMKJHHIJJIIJJLNPPPPPQSTUTTUVYYZ\_bfhjklnpstutvwwwwxzzz|~ }wsmjgehmqsxvvyywxzz{{{{zzzwwxxwwxxyxxxxyyzzz{{||~|z|~~ ~~||~~~~|||{zzz{{{zzxwvvuuuvwwvtuwyzzzyyyxvttuvwwvuutuvvvvuuuuuutuvwwvvuvvwxzzzz}~~}}}~}{zz|~||||||{zzzyzz{{zzywvvvy|~||}}}{|{zz|zmfY@7>A@>=?BCCCDDDDEHJLNMJGDDDFHJLMMLKJKNQQPPPRSUTV\adhmnoppppqrstttuvwxyyzzzz{{z{{{{|~~ ¡¢¡¡ ~}}zywvuttrrrqponnnnmkjjihhfeeddcba`_^^^]\[ZYXXXYYY[[[\\]\\\]^``abbccccddeehhhijkllnnnopqrrtuvwxxxxyzzzz{~ ¢£¢£££££¢¢¢¡~zxvuvwxxxxxwwwvwvvxvvzz{}~~}}}~~~}~~~}~~~~}}~~~~}||}}}~~~~~~~~||{{{zxvqlheedegfhhijlnorrstuvwxzzz{} |tne^YVSQMLKKKMNOPPPPNMLKKJJJJJLNLNPQQRRSUVVVVVVWZXXY\bhmnnoqtuwxz{||{{|~}}~|yomhfglqtwvvwxxyzz{{{zzzzwxxxwwwxyxxxxxyyzz{{||~~~~ ~||}~}}}~~}}{{{{zzzzyxwvutuuvvvuuwyzyxwwxwuttuwxvutttttuuuutttttuuvvwvvvuvvxzzzz{|}}}|}}|{z{}~}}}|{z{zzz{{{{|zxxwxz}}|{||{{}zzzhMAC@A>>?ABBBBCDEGJKMRPNJHGGGLMNNLKJJOPSTTSSSRTTV]bfjnopqqqqqqrstttvvwxyyzzz{{{{|||} ¢££¢¡~}|zxutttsqrrrqpnnnnlkjihhgeddccba`^]]]\\ZXWVVVWXXXZZZZ[\\\\]^__`bbbbbccdeeghhhjkklllnopqqqttuvvwxxwxzzzz} ¡£££¤¤¤££¢¢¢¢¡ |ywwwxyyyyyyyxwxwwyyy} ~~~~~~~~}}|}}~~~~~~~~~|{{zzzzytrmhddeegghijmnorrstuvwxzzz{}~ |tng`ZVTRQQPPPQRSRQPPONNNONNNNNPQPQSUVVVWWXXYZZ[[]\\]agnrrtuvwyz|}~~~ pnjgehnruvvvwyzzzzzzzyyyxxxxwwwwyyxwwxxyyzzzz{|}~ ~}~~~~~~}|{|zzzzzzxwuttuuuuuuvxxwuttvvuuuvwxxvutttuvuuttttttuuvvvwwwuvwxzzzzzz||||||{{z{}~~~~~}}|{z||{{{{{{|zyxxyz}}{{||{{|p_SKEDA?@AA@@@CEHJMPPRQPONMMLOONMKKKLPQRSTTSSQSTV^chknnooooooqrstttuvwwxyyyzz|{{}}}~~}~ ¡£££££ ~}|zwtssrrqrrqqponnmlkihgedcbbbba`^\\\\[ZXVVVVVVWWXYYXYYZ[\^^___`abbbbccdeegghhijjkjkmopqqqttttuvwwuwxxxyz|¢£¢£££££¢¢¢£¢¡ }zyxyyzzzzzzzzyzxy~ ~}~~}}}}}~~~~~~~~~||{zzzzzxwsjeefegghhkmnnrrstuvwwzz{|}~ ~vqib\ZWVWVVUTUVWVUSQPPPPPPQSSQRSUVVXY[\\[[[\^`abdefhknrtvxzzz{~ pnkhddhlstutuxywxyzzyyxywxxxwwwxyyxwwwxxyyyyyyzz} ~~~~~~}|{{{zz{||zxvvuttttttuvvutssttuuvvwwxwutttuvuuuuttttuuuuvvwxvwwyzzzyzz{|||{{zzzz|}||{{z{{{zz|||{||||zzyxxy{~}|zzzz{{|zuql\MIGDBBBA@@BDGJMPSTRPPPQQPOMMMLLLNOPPPPPRSURTTW^dgjlmnnnnnnpqssttuvvwxxxyyz{z{|}}~~}~ ¢£¤¤¤¤¡ ~|{yvtrrrqqpppponnnmljhgebaaa``_^]\[ZZZZYXVWWVVVVVWXXXXYYZ[^^^^^_`abbbbcdeeffghhiijikmnpqqpttttttuutuvvvvxz ¡¢¡¢¢¢£££¤¤¢¢¢¢ }zzzzzzz{{{{{{{}}~~}}}~~}}|zzzzzwxtlgghhgghhjmnnrrstuvwxyz{|}~ ztkdb`_][[YXXYZ\ZXVUTSSRRRTUUTTUWXY[]_`a__`bcfghilorttvw{} tplgb_benqqqsutruvxxxxxyvwxxwwxyyyxwwwxxyyyyxxyz~~ ~}|}}||~~~~|{zz|{{|~}{zxwvttstttuuuttttttuuvvvvutsqqqstuuuttttttttuvwwxxxxyzzywyzz{{zzyxxyzzzzzxxxyzzzz{{{{{||}zzzzz{~ ~|zxxyzzwzxurbQMFDCCDCBBCDFIKOQTQPPPQQPMKLMMNOPPOPPOOPUYUVVY`dgimnnoopqqqrstttuvvvwxxxyzzzz{||~ £¤¤¤¥£¡ ~|{xusrqrqqoonnnnmmlkihfca_``__^]\[YYXXXXWVVVVUUUVVXYYYYZ[\\]]]]]^_```abbcdeefghhhhikmnopppssssttttttuttuwy~ ¡¢¡¡¢¢£¤¥¥¥££¢¢¡ |zzzzzzz{{||||} ~}}~~~~}|{zzzzyxtnhffgfghhjlnnqrstuvwxyz{||~ ztmhggfebbbbbcdc^\ZYXWVVVVUVVVVYZ[\^acddeefhikmnoqtuvxzz wqib\XX[fhlnrtspttvwwxxyvvwxwxyyyyxwwxxyzzzzyyzz ~}|||}~~}}~~~}|{{{}}|}~~|{zywtssttuuuutttuttuvvuuutsqpppqrtttttttttttuvwxxyyyzzyxvxxyyzyxwwwxxyyzzvvvwyzz{zz{{{{|}}}}|}~~}zwwxxwvxoggdWOEDCDDDDDCDDEGJLNLLMOPQPOMNOPPPPQOPONNPV[XYX[bfhjnnopqqrsrsttttuuvwwxxxyzzzz{{|} ¢¥¥¥¥¥¡ }{zvtrqqqqpnnnmmllljihhfca_^^]]]\[ZXWVVVUUTQRRRRSTVXYZZZZ[[\\]]]]]^__``bbcddeefgghhijlnnoooqrrssssrssssstwy}~ ¡ ¡¡¢£¤¥¥¥¥¤£¢¢¡ ~{zz{{{{{||}}}}~~}~~~~~~~~~~}}}|zzz{|zuoidcdefhhikmnpqrtuvxxxz{||~ {xsonnnnoooqrromgeba`][X[ZYZYY[]]^acghiiijlnnpstvxyzz{~ ¡¢¢¡¡ yph`YQMLVY`ipssrstuvvwwxvwwxwwxyyxxxxxyyzzzzzz{}~~~~~~|{{||~~~}||}~~}}}}|{zywtsstvvvvvuuvwvvvvvuttssrrqrrrttttttttttuvxxyyyyyzzzxvwwwxxxxwwwwxxyyzwwwxyzzzz{{{zz{|~}~ ~}}}|zwwxvtsl[OQWSKFDDDDDDEDDDDDEGIFGJMPRRROPPPPPPQOOONOQVZYZY\chilnnoppqrsstttttuuvwxxxyzzzzz|||~ £¥¥¥¦¦ |zztsqqqqpoonnlkkjjihhgfca_[[ZZZYWVVUSRRQQPMNOPPQTUWXYZZZZ[\\]^^^^^__`abbddddeefgghijkmnnoopqrssrrqqqqpqsvy}~ ¡¡¢££¤¤¦¥¤£¢¢¡ }zzz{|{|}}~ ~~~~~}}}}}}}}|}}|{z{||xtqkfdfdfhhhjmnpqrtuvxyxz{||~ ~}zxwvwxzyz{}zvronkhfb^[\\]__]^_abdhknnnkmoqrtxz}~~~ ¢££¢¡ yqhb[PGCFJTbmprtstuvvvvwwwxxwwxxyxxxxyyzyyyyzz|~~~~~~~}~|{zz{z{}~~}~~~~}||||zywtttuwxxwwvvwxwwwwvuttsrrrrrrrttttttttttvwyyyyxxyzzzxwwwwwxyyxwxxxxyzzyxxxyyyy{{|{zz{|}~|| }}{{zxxxvsrh[PKJMPJHFFEDDDFFFEDDEEEGILOPQQPPPOOOPQPPPPQTWYXYY\dhjmoppqqqrsttuuttuuvwxyyyzz{{{|}}~ ¢¤¥¥¥¥¥¢ }{xvttsqonnnmmlkjihhgggec`]\ZYXWVVVUTRPNMLKKJLNPPRSTWWWWWWYZ\]]]\\]]]]]]^_abcccdefffhhijjkklnnoqqqponnonnqtt{ ¡¡¡¡¡£¤¤¥¥¥¥¥¤¤£ ~}~~|||~~ ~}}}}~}|||||{~}{{{{zz{zxtnheffgghikmnqrttvwxyzz{|~ ~~|}zvtqkd^\_chlnnnppqsuwxx{zxwwz|~ }¡££¡ zqmeYQ=B=8GZ\kqtruvuvyyvxwwxyywvyyzzzyyyzzzzz{||||{{{|~~~~~~~~~}||{{zz{|~~}|zzyxwvuuuvvxxwvuuvvwwvvuttttttttttstuuttstttvwwxyxwxxxyyyxwwvvvxxxwvxxxyz{z{zzzzzzz||}}~}|z}}}|{|~ ~{|{zzxvvtk`VPDFDDEGGFFFFHFEEFGGFEFIKMOPPPOOOOPPPPPRUVWVUXY\`fknnpqrrrsstuutttuvvxxwwxyz{~~}}~ ¢¥¦¦¦¥¥£ ~|zwusrqpnnmmllkjihhhfeeca^\ZVVVTSQQQOMKJJJIHJKNPPRSTVWWWWWXY[\\]\\\]\\\\]_`accccddddghhiijkkmmnnnmmlkklmnpsu{ ¡¢£¤¥¥¥¥¥¤££ |zz{|~ ~~~}}}|{{||||||{z{{zz{zxtnheffghhjmnopqstuvwxzz{|~ ~|{{zusqsuwxwvustuvvwyz{{{{} {|} ¡¢ ¡ ztne\Q5441<HJWgtoruwwvwyxxxxyyxxxyzzzzzzyyzzz{|||||{{{}~~}~~~~~~}}}}}|{{{{|}~~}{zxwvxxwvvvuuwwwvvuvvwvvutttstttuuttttuutsstttvwwxyxwwwwxxxwvwwwwwvutvwxxyz{{||{{zzzz{|}}|{{z{|||{{~ }}|{zzyvneZO@C@@BDFGFEEGGFGGGFFFGIJLNNOPPQQQPPPPPSVWWVTWZ]bgjnoppqrrstttttttuvwxxwxxzz{}}}}~ ¢¥¦¦¥¥¤¢ ~~}|zxutrqpnnmlkkjjihggfdcba^\YWTTSQPNMNKJIGGGFFHJLOPQRRUVVWWWWXXZ[[[[\\\\[\]_``bbbbbbbbdegghhhillllkjihhghjmnru| ¡¢£¥¦§§¥¤£¢~}~ ~~~~{{z{||}|{zzz{{zzzzxtnhffgghilnpqrstvvwyz{{|}~ |~~~ }zyvx ¡ wwqh]M--,+7;>G\ttonrtttvxxyxxxxywxyzzzzzyyyzzz{{{{|{{{|}~}|}~~~~~~||}}}}||}|}~~}~~~}}|zywvuuxxxxwvuuvvwwvvvvvvuuttttttuvvvuuttttrrstuvwwxxxvuuuvwxwvvwwvuttsuwxxz{||}}|{zzzzzz{{zzzzzz{{{|} }|}|zyql`N<?=<>@CDDDEGHHHGGGGIIJJKMMNPPRSSQPPPQTVWWVUX\`dhjnooppqqrttsttttvwxxwwxyz{|||}}~ ¡¤¥¥¤£¢¡ ~}}|{zxvtsqpnnmlkjihhhggffdcb_\ZWVRRQOLJJJJGEDCCCCEGJMNOPPSTVVVVVVVVWWWXYZ[ZYZ\]^^``aa```abcddeefgiijjhgfedbchkmqv| ¡¢¥¦¨¨¦¤¢¢|{} ~~~|{z{||}|zzz{{{zzzzyuoiggghhjlnprstvwxxzz|}~ }~ |zvqs{ zznf]H(++*1/58Mhtrpqqqsuvwxxwvvwwwxyzzyyzzzzzzzzz{{|{{||~}}}|}~~~~~}|}}}~~~}}|}~~}~~~~~~~}}zywvuuuvwwxxxwvuvvwwvvuuuuvvvvvvtuuvwwvvuutsqqrstvwwwwvusttuwxxxvvvutsttuvxxz|}||{zzxwwwwxyzxxy{zzzzz{} ~}zztrfQ<>=<<<=>@DFGHIHGGHJKKLLLMNNNOPQRQPPRSUVVVVVZ]bgilnooooppqrtsstttvwwwwwxyz{|||}}~ ¤¥¤¢¡¡ }|zzzxutsrponnmljihhgggfffdba^\ZVUPPOLJHFEDA><<>?@CEIKLMNPQRUVVVVVTTSSSUVXYXWXZ\\\]^__^^_`abbbbbbcceggeba_a^_chmrw} ¡¡ ¡¡¤¥§¨¦¤¡ ~ ~~~}|{{||||zzz{||{zzzyvpjhhhhhiknoqrtuwwxzz|}~ {ytnox¡¡ |kg^D$'+&&%%2JYbloopststvvvuuvvvwwxxwwzzzyyyyyzz{|||}}~~}|}}||||~~~~~~}}}}}}~~}||~~~~}}}}|||||}yxwvvvvwuvxyyxwvvwxwvuttwvvvvvvvuuvwwwwvuutsppqrtuvvuvutqrsuxyzyxwvtsstuuwxxz{}|zzywvuttttuwwwz}~}|{zz|}}}zy|~ ~yvtkYBB?=<;:;>BEGHHHGHJMNNMMMNNNLMOPPQQQTUVUUUVW\_chknnnppppppqrsttttuvvvvwxyz{|}}}}~~~~ ¡¤¥¤¢¡¡ ~~~~~}|zzxvtrqqonmmlkihgfffeeddba^\[YVTPOLJIFDA=;878:=>@CFIJJLNPPRSSSRRPPPPPQTVVVVWXY[\[\\\\\\]]^^^^^__`bbb`]\[\[\^emty ¡¤¥¥¦¥¤¡~~~}||{|||{{{{{|||{{zyvpkhhhhhijmnprtvxxyz|{} zwslkq¡¡skW9"+($"!(5DVepxxtrstuuuuvvvvvvvwwzzyyxxxxyz{{||}~|}~}|{|}|{{{|~~~~~~~}}}}~~~}|}~}}||{|{zzzz{|zyxxwwwwvwxyyyxwwxxwutttxxwwvuutvvwwwwvvuutsqpqstuvuuutspqstwyzzzyvtssttvwxxyz{{zyxvutttsrsuwx{}zzzzz{||{zxwy| zxvoeLFC=>>>>?ACGHHHHILNNNNNNNNNMNOPPQRSTVVVUUWY^adhlnnnqqrrqqqrttttttuuvvwxyz{{}}}}}~~ ¡¤¤¢ ¡ ~}}}|{zywtrpopnmlkkjhgfeedcbbb`^\ZXVUSOKHFEC?<875468:;=?CDEFIJMNOONMLLKKLLMNOPQRSSSUVXWXYXWVWXXXYYYYZ[]^_][XVVVVWYamvz~ ¡££¤¥¥£ ~~}|{{{|{{|{{{|||||{zvpkhihhhhjlnpstwyyz{~|~ zurjfhru{ ytyndK2%.%#"##"%/>N]horwvutttuuvuuuuvwxyyxxxxyyzzz{{{|}|}~}{z{||{{{{}~~}|}}~~~|{|~~|{z{{zzzzzzzzzzzzzyyyyxyyzzyxwwwwvuttuyxxwwvvuwwxxwwvutuutsrsttuvutttroprtvxxxyxvutttsvxxwxyzyxxwuttttsqrtxz}|zyxwxxyyxvux{ {zuspWJF?@BCCCBBGHIJJJLMMNNOONNNOPPPPQQQRTVVVVXZ_bfilmnopqrsrrrrssttttuuvvwxyz{{||||}~ ££¡ ~}}|{zzzxtqonnmljjjiheeedbb`__^\YWVVSQJGCA@>:6543346789<?ABDFHJKKJJHGFGHJJJJKKJLMMMNPSTUVUSRRTRSTTTUVW[\[XURQRRTUV^mwz} ¡£¢¢¤¥£ ~|{zz{|{{|{zz{||||{zvpkhigghhjmnpqtvxxyz}~ zvqibb\[_nuki[SC6+*%!% $$.23<Qf|zwtttttvuutuwyzwwxxxyzzzzzzzz|}~~|{{|{{{{{||}~}|{|}~~}{z{}}zyyzz{xyzzzzyyyyzzz{{{zzzzzyxwwwvuutuvxxxxxxxxxxxxxwvuttuutttutuvutttropqsuvwvvuuuvutsvwxwwxxwwwvtttsstqquyz~|zxvvvvvuttvz~ |}utw^LHBDDEEDDDFHJJKKKKMNOPPPONPPQQQPPPPSVWWWY[_bhjklnpoprrrrrrrssttuuuwwxxzz{{{{{|} ~~~}}|||}zzvqnmlklkjihhfedccb`\ZZYWVUSPKGDB?<97431000011278:;=>@CEGHGEDDDDDDDDDDCDEFFGIKNPPPONMMNONNOPSTTRQPPPPPPRTWYX]n} ¡¢¢££¡~~|||{{{{{{{{{{{{{{|{wpjhhhhhjjlrxz| |thbc_VTZpteaJ?@:3)%# !!#""%+3?JVbgormuqtttttuvwyyxxxyzzzzzzzz{||}}}}|{z||{{{{{{|}|{zyz|~~}zyz{}~}ywzzzyyyxxwwwxzz{{zzz{zzzzyyzwwuuuvwxxyzyxvvvxwwxxvuvwvvvvvvuwwxwvtsropqstuvwwwvuttttvvwwwwvvtttttssrtqrx{{}}zxvvwvvuttsrtz {tln]KJEDDFHIIGGHIJJKLLMMNOPPPOPPQRRQQPQRTVXY\^bdhkmnnnpqssrrrrtuuutuvxyxxy{}}}}}~~~~~~}}|{zzzyuqnmljiihhhgfecbaa_\XVUTSRPLGCA><86310.--,-./03689:<=>?@@?>>>?@??@A@?>?@AABDHJLKJJJJJJIIJJMOOONMMMNNOPTUWYX]lz ¡ ¡¡ ~~|||{{{{{{{{{{|||{zzytlijiilnqu|}tib_\[VUfvq]VA9;83-+(%#""! !#$&+19PQ`nnitqrttuvvvxyyzzzzzzzzzzzz{{||}|{zzzzzzzzzzz{{zyxyz|~~~~~|zyyz|}~~zyz{zyyxxwvvuxz{{{zzzzyxyxwwxvvuuvwxxxyzywvuuuuvwwvvvwwvvwwxwxxxxwusropqrttvvvvwvuttuvvvvvvutttttsssstqrvz{|~~~}{yvtttttttrpnqv| sbbYLJDDDDGIJIGHIJKKKKLLMNPPPPPPQQQQQQQRTVXZ\_bfjmnnnnqrsttstttuuutuvwyxxz{|~~ ~~}}}|{zywwvtpnlkihhgggfedca__]ZURONNMLHC?<:8420.,,+++++-.1257889:9998789;<<<===<;;<<=>@DFGECDEFFEDDFHJKKKJKLMNOOPTUWXX\iw¢ ~~~~}||{{{{{zzz{{{||zyyysjgijnu}}vmd^Z_\Wagt r\P<57531-+(&%#!!"#%%%%&&,BPnssnnprtuuttvxzz{zzyyyzzzzzzzzz{{{zzxyyzzzzyyzzywvwxz|~}}}}}|zyxyz{|}~~{z{|{{zzyxwvvxyzzzzyyywwwwvvwtuuuvwxxyzzywvuuttuwxwvwxwuuvxyyyyyxvtsrppqrttuvuvwwvuuvvvvvuttttttssssstssuy||{{{zywuttttuutqnnnty} |lQPPJEDCBDEHIJGIJLMLLKLLLMOPPPQQPPPQRRPQSVX[]`bfknopppqrstttttuuuuuuwxxyzz{|~ ~~}|}}|zxvtttrnmkihhggffedca_\[XUQPKIGGGD?;75310.,+,++*++-./135567887765678::;<<<<;::::<>ADCA@@BDDDDDFHJJKLLMNOPPQQSUVXZ_kw ~~~|||{{{{{zzzz{{||{yxxqhhmt| {vngYZ\\^\en\K847532.,+*)'%# !"$%%%&>Sunlqqqrtuvvtvwyzyxwxxyzzzzzxyzzzzyyvvxyyyxxwxyxwvvvwz{||}}|{zyyyz{|{}}{z{|{}|{zzxwwwxyzzyxwxwwwwvuvtttuvwwxzzyxwvvuttvxyxxyxwutuwxyyyxvutrqqrrstuuvuvwwvuuuuuvvutttuttsrsstttttx||zyyyxvuuvuvvvtrpoosw| ~ueHEHFCBBBCEGHHHJKNOONMMMMNOPQRSRPPPPRSPPRVX[]adhlnpqrsrstuuuvvvvvvvwxxyz{{{{} ~}|||{yvtrrrpnlkihhhffecba]\ZVRNLLJEA@A?:5110/.-,+,,+++,../11223577776667789:;;<<<::::;=?A@?@@ACDEFEFHJJJMNPPQQQRSTUW[]doz ~||{{{{{{zzzzz{|||zzztnr| {teY\a_]bnviYE858743/.---+*'%%#"#$%%)'*C\hyrpnnnprtttuvwwwwwwxyzzyywwxyyyxxuuwxxxwwxxyyxwvvvyzz{|}|zzzzz{||{||{z{{{|{zzyxwwwxyzzyxwxwvwwvvvtuvwxxyyxxwvvvvuwvwyzyyzyxvuuwxxyyxvutrrstttuvvwuvvvuttttuvvutttuttrrrsttuttwzzwwwvvutuuvvvtsqqqqtwz~}~|qcLIGEDDDDFGGGGGILOPPONOOOOPQSTTSPPOPQRPPSVY\_biknoprsttuvwxxxywwwwwxyyz{}|{{} ~~}|{zxvtqpppomkkjhhgedba_][ZXUOJIJHB<:;:4/.-,,--,,,,,,--../111124666676666789::::;::::;<>>>?@ABCEFGEFHIIJMOPQQQQSTUVY\ahqz~~~|{{{zzzzzzzzzz{|zzz{yy{t_]b`bbb\bn{ kWD;8883210///.+*++*('&&%#)%=Kkwtqonoppstttuvvwwwwxyyyywxxyyxxwuuvwxxwwyyyyxwwvvxyyz{{zzzzz{|||{||{zzz{{zzzzyyxxyzzzzyxwwwxwvvwwwxyzzzzwvutuuuuxwxyyyyzzxwwwxxxyyxwvttsttuuvvwwuvuttssstvwvuttuuttsrssttttstwwuvuutsrsstttrppprstvyz{}~}|}|{mcTPJHFGHIJJIHGFIKNPPONOPPQQRRSSRPPPPQRSSUW[]adopqrqrsttuwwwwxxyxwxxyzz{|}}||} ~}}}}zzwtrpnnnnmkiihhedba_]\ZYWVRNIEEB>98862.,,,,---,,--.....0133334655667777889:999:;;<<=>>>??@BDEFGHGHKKKLPQRSTTUWYYZ\_cjsz }~~}}{{{zzzzzzzzzzz{{zz} }ufa_^`\\SPPV`ddbfhnx }xbTD@<8844431111/.,-,*('&%(#.'$(=Pmmnorrqoqrsttuuuwvvvxyyxyyzzzyxwvvwwwxxxyyyxxwwwuwwwxzzyyyyz{|{{|{{zyyzzzzzzzzzzyyzz{{zyyxxyyxwxyyyzzzzzxwutuuutwvuvwvwyxxxxyyxxwxxxwutsuuuuuvvvuuttsrrsuvwwuttttttssssssssstttttttrqpqrttsrpoqsttuwxxz}}|||}|zxtf`VSMJIJJJJJJIIGIKNOONMOPQRRQQQQQPPPQRSUUVY\^bepqssrrsttvwwwwwwyxwxyzzz{|}}}}~ ~|{z{{zxuronmmlljhghgfbb`^][YWUSQPLFB@<:877521-,,-...-,-.////.13565556666688898:;;:99:==>>?@@@@@@CFHHGJIKOPOPSSUVWXZ\__`achmtz ¢ ~|~~}}|{{zzzzzzzzzzzzz{}~tpkefc[]\\[WQORWWRPVev}znhd_ML?@<787887544543121-+++**'#'-)&>NRYbhkjhoprsttttwvuvwxyxzzzzzyxwwwwwwxxyzyxxxwwwuvvuvxyxxxyzz{{z{zzyxwxywxxxxxyyyyyz{{zyzyzzzyyzzzyyyzzzzxwvvvvuutttttvxvvwxyyxwvvwwvutsttuuuuuuuutsrrstvwxwuttttttssssststttstuttsqpqrstttsqqrtttuwwwz}||||{yvtn`\SSPMKLKKJJJJJIJLOPONMNPQRRQPPPPPPQRSTUUVY\^benprsssstwxyzyyyyyxwxyzzz{{|}~ ~{zzxvvutsqonlmljhfeddba_\[YWVSPKIFB>=976653220011011100023211346887666788889::;<;;;;<?>>?@ABCCDDEFHJJMNOPRTVWZYZ[\adchkklorv| ¢£¤¥¤¡ ¡¡¡ ~}~}||{{|||{zzzzzzzzzzzz{|}vnkfa^_\[Y[\[Z[[XTQOOf~{tgNRRDHD@>><;;88548877655310.-,)'')+,.89?HSbihmmqpqtrtuuvwxxxxzzzzzyyyxxxyxxxxyyzzyxxxvuuvwxxxywxz{zz{zzzyxwwwxwvwxyyywxyxxxzzzzz{zyyzyyyyyyyyzywvvvutttttvwvuvuuvwwwvvvvwxxvuuuuuuvvwuttttsstvwxwvttsutttvvuttttuttsssrqqqrrrttttrqstuuvwwxyyz{{zxwvti_VVQLMJKKKJJJJJKLNPPPPOPQSSRQQQQQPNOQSSVXY[]accpqstttttyyzzyxxyyyzz{|}}}}~ ~|zzyvtsqponmljjhgfddcb`][YVVTPLIFC?<:753321010111112310124334457888777888899:<=>>=>>>??@ACDDEEFHIJKMNOPSUVXYZXZ_bcgjhmooosvz ¡¤¤¥¥¥¤£¢ ¡¡¢¢¢¢¡¡ ~}||{{{{{{{}|{zzzzz|}}}|{|}}vnhb__`]\\\ZZ\YXVVPHN_mnqx~ zn]FKNGGFC>>?>;8:889867766653320,****++-.49>J^joopmptrssstttvxzzzzzzzyyxxyyyyxxyyzyxxxxvuuvwwwvwvvyzzzzzyyxxwvvuuuuvwxxxxyyxxyyzzz{zyyzyyyxxxxxyxwvvvutttttvvvuvvvwyyxwvvvwxxwvuutttuvvuttttsstuvwwvutttttuwxwvuuuutttssrqpqqqqstttsrstuuvwwxyyzzzxwwutg\SSKEJIJJKKKLLLMMNOOPPOPQRSRRRRSSQPPRTTTVZ\`eknqstuvvvvxyyyyyyyyzz{|}~~||} ~~~|{zyvtromlkkkhgfdbba`^\ZXVURQLJGD@;876422111111222356211355665788888888999:;;=>>???@AABCDEFGGFHJJLNOPPSWZ\\]]\^ehhlooosrrux{ ¤£¥¦¦¦¥¦¦¥¥¥£ ¡¢£¤¤¤¤¤¡¢¢¡ ~}}~|{{zzzzzzzzzzzzzzzzxz} zsmjgdca_`^\Z\VVUVUOMTehkkkmpsyxwyzysnnndWFJJGBDC?@DD@<>>==9898888887741.-+*)*++./+1DTcnuoopmprsttttwyxxyyyyyyxyyyyyyyyyyyxwwwuuuuvvutvuvxyyyyxxyxxwvutttuuvwxxyzzyxxxzzzzyxxzzyxxwwxxxxwvvvvuutttvvvuvvwyzyxwwwwwxxxxvutttuvwuttttsstttvvvutttttvyyxwwvvutttsrqpppqqqsttttssstuuvwxyyzzyvuvuth\VUF=CBHIJKLMMNNNNNNOPPPQRSSSSTSRQPOPRRTW[\_emqrsuvwwwxwxyyyyzzzz{|}~~|} }}}~}{zzxvtrnjhhhhedba_]\ZXVVUTSPOJHEC>865421111233333346743356778789:::::9:;;;<==>>??@ABCDDDEFHHIHJKMNOPQSVZ\^`aaefikjnrrrtttwy{ ¢§¨¨¨§§§¨¦¦¥£¡ ¡¢¤¥¥¥¥¤¥¥¥¤£¢£ |zz}}{{{zzzzzzzzxyzz{zzzy| ~{|zxrkhdbcb_\\^\YXXVUVV\][Y\_aehjjfa\[\`YSJJGFDEDDEIJICDB@?=:<<;::99887421.+++-+./++04M`nmpsnppqrrstttvvvwwwwwyyzzzzyyxyxxwvuutttuttttuuvxyyyyxyyyxwutttuvuuwxxyyzyyxwxwwxwvvxzyxxwxyyyxwvvwxxxwvvwwwwwwxxyyxxxxwwwxxywvtttvwxvutuuttuttuvutttuvvxyxwuwvuttssrrqppqqqqsttutssstttuwyyzyywuuuutnb[YH;?=DEGIKLMNONMMNOPQQQRSSTTTRRPONOPQVZ\^aflorsuvvvvwwxyzzzz{z{{|}~~ ~}~~~||{zyxvtsplhgfffcba`^\YWTSRRRPMJHFDA<84410/0112355555567655688889:;;;;<<<=>>>>>>>?@AABCDDDDEGIJKLMOPPRSTVY\_abdfnlmnmptrtwvvzz|¡¢££¢¥¥¥¥¥¥¥§§§¨§§¨©©§¥¤£¡ ¡¢¤¥¥¥¥¥¥¤¤¤¤£¢¡¡|zz}}{{{zz{{{zzzzzzz{}~~ ~~zqphcddb__^^_^\YWVZ\[UPNMKLPQOKJMPVYQLHJFHHEDFGGHJKJHGGB>>?>=<<;:8876531/0--/0010+8DPUcrpnpponprrqttuuvvvvyyzzzzzyxxxwvutttttttsssuvwxyyyyyyzyxwutuvwwvvvwwxyyzyyxwvvwvtuvzyxxxyzzzzxvvxz{zzyxxyxxyyxxxxyyxxwwwxxywvttuvwwuttuuttuttuuttttvvwxxwutvvttsrqqrqqqrrrrsttuttssssstwxyyxxvuuvvtrf\XJ?B?CDEHJLMNNMMMNPQRQQQQRRSSTSRPPPQSX[^bglpqrtuvvvvvwxzzz{{|{{|}~~ ~~~}}||{zwvutqomigeddca`_^]\XVQPOONLJFDB?=:64310/112346777766787789889;;<===>>>>????@AABCCDDDEDDDFHJMOOPPQRTUVZ\`bcehjpoprrtvsvyxx{|} ¡£¤¥¥¥¥¦¥¤¤¤¤¥¥¦§§§§¨¨¨¦¥£¡ ¡¢¤¥¥¥¥¥¤££¤£¢¡¡ }zz}}|{{{{{{zzzzzyyz }~ zphggdbd^^bb]\\YTUUUUUUTQQQQRSTUSTNMJMIKLJKPRPRVWVTSQJCCBA?>>>>=:999876744410461:=DDPfqtttrnnqqptttuuvvvxxyzzzyyxxwvvttsrssrrrstuwxxxyyxyyyyxwvvvvwwwvvwxxxyzzyxwvwwvuuvxxxxyyzzzzxvwy{}{{zzyyyyzzyxwwyzxxxwwwwxvutttvvvuttttttuuutttttuuuvvvvvuuuttsrqpqqqrsssssttutttsrrrtuwwwwwvuvwwuwl\RHADCDDFHJLNONMMMNPQRQPPPPQQQUTRQPQTVY\`dinoptuvwwwvvxyzz{{|}|||}~ ~~~~}}|||{xusrpnljhecba`]\\[ZXURNLJHHGEC@>;9864432134556678888888889;:::<=>>>>>?@@AAAABBCDDEEEFGGGGHJLOPPPQRSUVX\`ceghjmpptttvxvwzzz|}}¤¤¥¥¥¥¥¥¥¦§©««©¨¦¦§§¦¦¥¥¤£¢ ¡¢££¤£££¤¤£¢¡¡¡ }{|~}|{zzzzzzzzzzz{ }z{zsqnhfghddc]\^\[XVVVTRQRRRSTSPNPPORNPNPSUZ`dfghcb^[VNHIEDBBBB@?===>=<<>><;8447654;75GYaknonnoqprsttuuvvvwxyyyxxxxvvutsrqqqppqttwyzzyzyxxxxxxxxxwwwxxxxwyyxxyyxxwwwxwvuvwwwxxxxxxxxwwyz}|{zzyyyyzzywvvwxwxxwvvvwvtttuvvuuttuutuvuuttstuvuuuuuuuvtttttsrqqqqrstttttttttttsrrstuttvvuuwxxuunZKFACDFGHIJLNONNNOOPPPRQPPPQQQVTRQPQUY^bfhjlnntuwxxxxxyzz{{{||}}}~ ~}~~~~~~~~}}}}|zwtqpnmkigdb`]\[YXWVSPLJGDBCCBA>;8887665335655657899888888;<<<<=>>>>>?@AABBBBCCDDEFEFGGJJJKLMNOQQRSTVY[^aehhilnprtutvzyy{z{~ ¡¢£¥¦§¨©¨¨§§¨¨§¥¦¦¦¦¥¤¢¡¡¢¢ ¡¢¢¡¡ ¢£¢ ||}}{zzzzzyyzzz|}{}}|vlghf`bdbbeb^ZWXYWVVTTSRQRSTRQPSMPQTQV^chlljjhb\ULILHFDCCCA@???@?>?A@=>@<88884;81@MOV^gijnopqqrstttuuvwxxxwwxwvuutsqpppooqtuxz|zzzzywwwwxxyyxwwyzzzyzzxxxyxwvvwyxvuvvvwwwwvuvwwwxyz{|{zyxxxxxxxwuttuwwxwvuuvvuttvwwvvuuvvvvwuutsstvxvuuuttuuttuuttrrqpqrtttttttttttttsrrttsrtuuuwyxunlVHFDDGHHHIJLNONNOPPPPOSQPPRSSSVTRRQRV\finnnoqrtuwxyxxyyzz{{{{|}~~ }}}~~~~~~}}}~~~}|{z{yvtrnljidcd`\ZWWVUTPJHJDDBA?>>>;987777677788888::::;<==<==<<<=>>>?@@AA@BCDDDDDDFGHIIIIIKKKLNOPPQRSTUV[]adghjmnnqrtuuvwxzz{}} ¡¢££££¥¦§¨¨¨¨§§§¦¦¥¥¤¢¡¡ ¡ }|}|zzyyzyxxyzz{ |{ }yxwstsqnifdb`]\\\\Z[[ZXVUTSSSSTSU[abinonoppqngbdb[VOKJKKGDBB?BDBABBCCB@>>=<;::996,$6HScltopnnosuvtqutvutywuxwvvtsporpnopqstzzzzzzzzxwvvwxwuuvxyzzzzzzyxxxxywvvwyywuvvvvutttvvwwxxyyzzzzywvuvuuuttuuuvwwuuvwvvutttvxxxwvvwvvuuutttvwzxwxwvvxwwwvuttsssssstttvvuuttttttutsstutuwxyyxvrlTGKIEHJJJJKMOPPQQPPQPNOPPQRSTTVTSSRT\ejlnoprstuvwxxxyzyz{{{{|} ~}}}~~~~~~}}}~}}|{zyxxywtrolhggb`_\YWUVSQOJDCDAA?>=<<<9887787788888889;;;<<==><===<==>>??@AABBCDDDDDDDEFHHHIIJLLLMNPPQRTUVWZ]`bdghjmnnqsttuuvwyz{}~~ ¡£¥¦¦§§¦¥¥¥¥¥¤££¢ }|}|zyyyxwwxxx{} ~|~~ yohgkigecb`_`_][YWWVUVVUV\cglptuuuwwuvtqpja[ZUPPPNKJFCCDCDFFHGFDCA@?<<;9971,18<ESbgijkmnmmptutwwuxyyxwvvtsqponnnpqstyzzzzyzzxwuuwwwvvvxxyxxwyyxxxwwwvutuwyxxuuuuttttuvvwwxxxxxxxxwuuuttttttuuvwvutuwvvutttvxyxxxxyxxzzyxwxz{}{zzzzyyxxyyxwvuutttttttuvvvuutttuuttstutwyzzzywtiVJLKHLMNONMNPRQQQPPPPNOOPPQRRRPPRTUY`fiknoqrstuvxxxxyyxz{{{{} ~}}}||{{{|||}~}}||}}|{zvutuvtspmifcb_]\XWVPPNKJE@>@>=<;:99988778888998889:;===>>>>>>>>>>>>>??@AABCDDDDDDDDEFGHHIJKLMMMMOPQRSTVX[]`abeghjmnorsttuuvwyz{} ~}~¡£¤¥¥¥¥¤¤¤¤£¢¢¡¡}|{}{zyyywvwyww} ~~}}~}z{||{z{~ }zssnnmjhedcdcb`^\[ZW[ZVW_ghorw{|zz{}~zvtnhfd]VSQOLKNJIIHIKJKJIHFDCC@?=;998642208H^ijhinpopsrsttttuwxwvutsqnkjjmortuxyzzyyyyxvuuvwwwvwwwwvuuuvwxxwututttvxzzuutttttttuvvwvvvvvwwwvvuttttttuuuvwwvuvwwvuutuwxzyyyzzzzzyyxwxzz~}{zzzz{zzyyxwvtttttuuuuuuuutuvutttuuxzz{{zxvdWMMPKQPPQPMMPRRRQPPPPNNOOPPPPPOQTVX\bejlnqrsttvwxxxxyyyzz{{} ~}|{zzyyxxxzz{|||{{|{{zwtrrsrqpnjgca^\\YVUPIHFEDA><<;;:98888778889::;;:::;<=>>>>>>>>?@AAAAAA@@@ABCDDDDDDDDEGGHIJJKMOOOOOPQSTUUVY\_`acfhhjmoprstuuvwxzz|~~}~ ¢¢£¤¤££¢££¢¡ ~}{z{}{yyyywvxywx ~|z{}~}~~}} }{{zzxzzzz}~utspnjhhggfeca]\]bb__fmptv|ztspnnoha]\XVTUQPPNNNKMLKJIGFEEDA>=<:9:6801;QZZ[bmrqopstqtutuvvvuttrnkgfgjnqtuwxyyyxxxxvuuuwwwwwwwvvuttuvwwvutttstuxzzvutttttuttvvwvutuuvwwwvvtttttuuvwwxxwwxxwwwvwwxyzzyzzzzz{{{{{{||~}|}}||{{{{zxvttsstttttuttttuvvuuuuvxzzzzzyv_ZRORMRPQPPNNOPRRRQQQPOOOOOOOOOPVYY[afhmnqsttttvwxyyyzzz{{||~ ~~~}{zywvvtttvyz{{{{{{yywtpnnommligca_\[XUPMI@@???><:899888888888::;<==<<<<=>>>>>??>>>ABCCCBBBBBBBCDDEDDEEEEGHHIJJKMOPPPQQQRUVWWY\^abbeghiknppsttuvxyz{|} ~}}} ¡¢¢¡¡¢¡ |{zzz}{yxxxxvwxwz~zyzvy|~ }zvsqnljhgca^`bfhhjqxwz}zzxsqsnkhhfba[VUSPPPLPONMLKJJJHEDCA><<5869:@:BJV`bcirsunottuttuuttrmhcbchmpsuwxyyyxxxxwvuvwwxxxwwwvvvuuvvvuuuttttvwyywvutttttuuvwwvuttuuvvwwwuuuuvvwwwxxxxxyyxxxxyzzzzzyyyzyyzz{|||zz|~~~|zzz{|zywutttttttttttttuvvvuuuvxyxyzzzu^\VQSMQPPONNOPPPQRRRRQOOOOOOOOOQX^`bfkmnprtttttuwxyyzz{|}}}} ~~}}}{zxvtssqoptvxzzzzzzwwurnlkkiihgca_]^YUOHDA=>>=>><98888889998:;<==>>>>>>>>>?>???????ABCCBBBCDDDDDDEEEFFGGGIJIJJKLNOPQRSSSTVWZ[\_abcdehijlnpqstuvwyz{|}~ }z{}~ |zyy{{yxxwwvvwx| }{{|~~|||}~{ytqnmjihimoppuz} ~ywtrpnnkhe`\YUQRSPQQPPONMMLJJJIFCA?<=;:87289>ADJS[ownnrptrstttsqlfa`aekosuwxyzyxxxyxwwvwwxxxxwwwwwvvvuuuuuuuuuvwxxyxvuttuuvwwwwvuuttttuvvwxwwwwwxxwxxxxxyyyyyzz{{{zyxxxxxwwwxzzywuy}~~~}{zyzz{zzywvuttuuuuuutttuuuuuuuwxyxxyyxs`\WSRNONLKKMOOOPQQQRRQONNOOOPPPSYaegikmnprsttttuwxyzz{{}}}~~ ~}||{zwtspnnmknqstvxxxxyvtsolhgfffeb_\[[ZTOJB>=;=<::;;:88889:;;<:<=>>>>>>>??????@@@@@@AABBCBBBCCEEEEEEEEFGHIIJJJJJLMNOPPRTVVVVWXZ\]_abcefhjlnoqqttuvwyz{|}~{z{}~ }{yy{ |ywwvuvvwz }{zz{}}}} |zzz{|~~|{zwtpnlgca\WWXUSRQPPONNMLLMKIGGDGD@:7472/*)-366Vlkmpnsqprrpqpkfa__djosuwxzzyyxxzyyxxwxxxxwwwwwwwvvvuuuuvvvvvwxyyxwvvvvvxxxwwvvuvutttuwxzyyxxxxxxxxxyyyyyyzz{||{zyxxxxwwxxyyzyxwvz|}|}|{{zzyxyyz{zzxvutttttuuuuutttttuuuwxyxwwutnbYVRPMKJJJJKLNOPQPPPQPPNNNOPPQQUV\bfhjlnpqrsttuvwyzzzz{}}}~~ }|{zzxuspmkkihkooqtuvvvvtrolheb`bb`]ZWVVQLIF?:9998768998889:<==>;=>>>>>?>?@@A@@@AAAAABBCCCCCBCDDFFGGGFEEGHJJJKKLJKMOOPPPSUVVVVWYXZ\^^`befhkmnpqqtuvwwyz{|} |z|}} ~{zz| |ywvvuwwy~zzzz{}}}|~}zwttsmkie^\[WUUTRQPPONMNNKHHJFJCD@</.111-,.-*.P[bhellnonnnnkfa__cjosuwyzzzyxxzzzyxxxxxxwvvvvvvvvvvuttwvvvvwyzyxxwwwwxxxxwwvvvxwuttvxyzzzyyxxxyyyyzzzzyyzz|}|{yxxwxxxwvuuuuuuttwxyz{zxyyyyyxxxzzzxvtsrsstttuuuttttttuuuwxxvtrokbVSPMLJJJKKKLOPRQPNNPPPMMNOPPQRSQSZbgknopqrttvwwxyzzzz{{||}~ ¢ }||{vronkjighkkiknqsttsrmhhhc_^]]\XTPPPKID?<988875689889:;=>>>>>>>>?????BCBAABBAAABCDDDDDDDDDDDFFGGGGHIIJJJKMMMNOPPPQQPTUVWWXXYZZ\^`abehilmnprrttuvwxz{~}~|{|~ |{zy~{wvvvwyzz~}zz{{}}zz}~~~~{ytqomhfda\ZXWVSRSSRQQPNLJJJHGFD@>630/011068>FLT`lrtpklnh\]a`clnpvuwyzzyyzxzzxwxyywwwvwwxxwxxwwvvvxwvvvwxxyxwwxyxwxwvuuuvwxxxxxwxyyzzzyxyzzzzzyyyzywwxz|zzxwvvvuutttssstttuvwxxwwwxwvvwxyyzzzyxvtststtuvvuvuttttuvzvxuwut\\VTQNKJIIIIJKMOPQPONMMOPPONOPPQSQPMKSbllnnoqtvwwyyyzz{zz~~ ~}||zwqmlihhdfhghhhknonnlheb`\YWVVUROKJJGEA>:888766789:9<=>?AABB@@@@@AAAADDDBCCCDDDDDDDDEEEDDDDDFGHHHIIJJJKLNOPPOPQRRRRRTUVVWXZ[[[\_abcfhjmnoqsstuvwxyz{~~~ }{}~{{zz{xxwuwyz{~~{yz|}zyz}~zzwusnljgda][VSRRTSRRPPMLMKJJJHDB=8411111-(#!$+7@Vgrj\WXYZX^fiswptvxzzyyzxyywwxyyxxxwwwxxxxxxwwvvxwwvvwwxxxxxyzyyxxwvvvwxxyyyxxxyzzzzyyyzzzzzzyzzywvwyzyxwwvuuuttttsrrstttuwwwvvvuutuvxyyzyyxxvuttttttuuuvutttuvvutwuxur]\VTRNLJHHIIJKMOPQPNMNNNMOMNONMLMLMJHN[glnnoqstwxyyyzz||{~~~ ~~~}}}{zywpihffebbdbdbbdhjihfeb]ZWVUNONLJHGGCA>;988877889;<=>?@ABCCCBBBBBBBBBDEDCDDDEEEEEEEEEEEEEDDDFGHHHIJJKLMNPPQRPQRTTTTSUUVVWX[\[[\_abdghkmnoqssuvwxyz{|~~ }|}}{zzzz zyyxvwyz{~|zz{ zyz}~{zwspnkifb^ZWVVWVUTRPOMNMLLKJHFD@<86421310010/-8JYYRPRTSKQeqsrrrstvvvvuwxxwvwxxyyyyxxxwxxxxxxwwwwwwwwwwwxxyyyzzyxwwvwxxyyzyxxxyyzzzyxyzzzzzzzzzyxvvwwwwwvuuutttsrrqqqrsttuvuuuussstuwxxyxwvvvuttttttuttuutttuuvtvwvwsn][VSQMJJHIJJKMNPPPOLMOPNKONMMLJJJHJJJJR^hmnoprtwzyyyzz|}}}~ ££¡ ~}~~~}||zvutnggccbaab_^]]`cfffcdb[VTSRHIHGEDDD?><:9888889:;<>?ABBBBBBCBBBBBCCCBDDDCCDCDDDDDDDDDDDDDDDDEFGGGHIIKLMOPPRSQRSTTUUUVVVWXYZ[[[\_abdghkmnnqrruvwxyz{|~~ }|} }{zzzyz~zyyxwwyzz~}{z} {zz|}}|zutrnlieb_\[\ZYWVURPPOONMMLJIHFDA>:620/-,/0-)"(/6=B@<<92Eiofmrsttuvwvvwvvvwwxxxyyyyxxyyyyyyyxwwxwwvvvvwyyxxyzxxwwvwwxyyzyyxxxxxyyxxxyzzzzzzyyxxwvvvwwwvuuuttspqqppppqrsttttttssttuvwxwvuuuuuuuttttuttttttttttuwuttpk]ZURPLJJIJLNOPPPPPONOQSRPRPLJGEDDEGHHGLZfkmpqrtwzzyyyz{}~}~ ¥¤¢ ~}}|ytsrngebaa_``\XY[\^`ab]^\UPNLJEDDC@?>>=<;:99:::<=>>>?ADDDDCCCDDDCCCCCCCDDCCCCBCDDDCCDEEEEDDDDDFGGGGGHIKLMOOPQSRRRRSUVVVVWXYZZZ[[\^abdghkmnnqrrtvwxyzz{~~ ~}~ ~}||{zzyyyz~|zxwwxwxyz}~|||~{zz{}}{zyuromifb_^\[YWVUTSSRQPPOMLJJHFD@<941-+,00.+,.14741,0 #Khgeoqqqqsttutttuuvwvwxyyyyyyyzzzzzywxxxwvvvvxyyxwyzyxxwwwxxxyyyyxxxwxxxxxyyyzzzzzyyyxwvvwwxxwvuuttspqrqpppqrsttttttttuuvvwwwvtttuuuvutuuuutttttttttststpni]YTPOKJLLMOPQQQQQQQRSUWZ[TQMHDA?>DDDFEJVbimpstuxzzzyyzz|}~¦¥¤¢¡ ~~}}{xspokgb^\\\\\XTVVWVVXYSRPLJIHFDCB@><::;;::;;<=>?@AAACDDDDDDDDEEEEDDDDDDDDDDDDCCDDDCDDFFFFEEEEEGHIIIIJJLMOOPPQSRRRRSTVVUUVXZ[[[\\\_abehilmnnqsstuwxxyzz}~ ~}{{zzzzxxyz}~|zxvuvxwwxz|~~|{{{} {z{z~}~{wutrnife^\\ZYXWVVUTSRPPPNLJHGEDC8633441/./000.--.-(#+F]cnqqonnnntsrstttuuvvwxyyyyyyzzzzzxxyxvvvwxyzzxxyzzyyyyyyywxyyyxxxxyyyzzzzzzyyzzzyyxwwxyyxxwvuuttsrsttsrrrrsttttttvvwwwvvvuttttuuuvuuuuvutuuvvvutstttxjgeZUPNLIJKLNPQRRRRSRTVWY\`cffca]\ZYSVZ]\X[`imqttuwyzzzzzz{}¦¥¥¤¤¤¢¡ ~}~}|{{yurnkhf_ZWVVVVQPPONMMNOJHFFFEDDA@?>><;:;;<=>?@ACDDDDEFFDEFEDDEGFFFEEDDDDEEDDDDDDDDDDDEGFFFFFEEEGHIJJJKKLNPPPPQRQRRSTUVVUUVWYZ[[[[\_abehikmnnqrstuvxxyzz|}~ }|{{zzyxwwxz}~~~|zwvuttvwvwz|}|{zzz| |{|z}}zzxwtpnmeca_]\[ZVVUTSRQQPPNLKKJJH@9898771/.01/./.(,,"&>Qejnnnoqprpoqrrstuuuvwwxxwxxyyyyyyyyxvuvxxyzzyyyzzzzyyyyywxyzyyyyyyyzzzzzzzyyzzzzzyxxzzyxwvuuttsrrtuutsrsrstttttuwwxxwuuuttttuvvvvuuuuvutuvwwvtsrsqst\X\RPMLKIIKKOPRTTTUVVY\^`bfiklkjijjimptvrkggknqsttvxyzzzzz|}¥¤¤¤¥¥£¡¡ ~~}||||{zyvtqmhdc\VTRQQPLLJHFFGHHJDBDDB?>=<<<====<<>>ACDEEEEFGHIIIJJHFFGIGGFEEDDDEEEDDEDDDDEDDDEFEEEEEEEEFGIJJJLMMNPPOOPQPQSUVVVUVVUVWYYYZZ\^`bdghklmnpqrtuwxxyzz{}~ ~~~}}||{zxvwwxz}~~~{xututttvvwz{|{zzzz{zz{z~|}{zwspomjgca^\[VVVUTTSSRRQQPPONTJDDD@;8:731/++,*+*-/*,9LU^cglpqpnnoqqqruuuuuvwwvwwxxxxxyzzxvuwxwxxyyyyzyyyyyyyywxzzzzzzyxyyzzzz{zyyzzzz{zxyzzywwvutttsrrtuutrrrrstttttuwxxxwuttssstuvwvuutuuuutuvwwvtrpnilkKJTOPLMMKJLLOQSUUVWX]`cfhjmnoonkknoottrnifgimnqrstuvyzzzz{}~¥¥¥¥¥¥£¢¡¢¡ ~~}~~}||{zzxwxsrpibaa[VROLIGHGEDDDDCBBAAA?=;;;;<=>>>=>AFJJJJJJJJJJJJJJIHHHHIIJIHHGFEDDEEFFFEEDDEFGGFEGHHHHGGGJJJKMMNOOPPPQQQRTTUVVVVVWWWWXXYZY[\_`acgklmnoprstuvvwxzz|}~~~|{{{zwvwxz|~zxvtttttvuvxz|{zyxyz}~{{|~||{zwsponjea]\\\XVVVTSUTSRRRRQQPLIGGFDC>:7641.--+*)))'%/6CQZ\_bknoonnprotsttquyyxwvwxxxxzzzxwvwxyyyyyzzzzyyxxxxyxxxyyyyzyxwwy{}}zz{|||{zzzzzywwwwuttssqrsttttstsstttttuvwvutttrrsttuuuwvutuvvvwwvvvtqnmlhaQFJKJIJNMJLQUTUVVX_eiikmnoopqpppqqqqsrnhghmnpqrsttuuyzzz{|}~ ¥¥¥¥¥¥¥£¤¤£¡¡¡ ~~~}}~~}||zzxuttnfba_UPLJFDDDCAABCBAA>>>><::;<>>@AAAABEJLMLLLLLMMMLKJJJIIHIIIIHHHIHGFEEFGGGFEEEFGIIHGHHHHIIJJJJKLMNOORSSSTTSSVVVVVVVVVVWWXYZ[[\]`abdhjkmnoprstuvwwxzz|} }~}~ ~}~}|{{{ywvvxz~~ywuttttsutuxz{{zxwwy{} ~{{||| }{{zvtssokea__^[YYXVUVTSRQQQQPOLJIJJIGE@:85210.,+**+*)(-487;JWginrtrolqrmnttwvtuutttsswxxxxxxxxyzzyyyzzyyxwwwxxxxyzzyxxyxxxyz{~|zz{|{{{zzzzzzxxxxxvutsrstttttttttttttsrssssrrstttttuuuwvuuuuutuututspnh`VSNILJJJLNMLORTTVY\]bennnopqrrssrssttssqmhghlnppqstttuxyz{{||} ¦¦¦¦§¦¥¥¥¥¥¤££¡ ¡ ~~}~}~~}}}|{zzzxwpnolbXTROKGDCA@A>==>>>>>=<;;:9:=>?BDDDDEGJMOONNONOPPPNLKKJJJJIIIIIIJJJIHFGHHHGFFFGGIJJJJJJJJJJKKKKLMNOPPSSTTUUUUVVVVVVVWVVWXYZ[\\\^abcfhjkmnpqstuvwxxyz{|} ~~~~|{|~ }|||{z{zxvuvy|}xwutttssttuwzzzzwuuvxz| ~|{|{{~}|zxwwvqjebb`][\ZWVVUTRRQQPPONMMMMLKMID@>;870.+++++++/1+" +8DHOV\bfikrnnnnrsstttttuvvvvvwwwvwxyyyxxyyyxwwwwwxyyzzzzywxyyyyzz|{{zzzzzzzyzzzzyxxyyyvtssstttttttttttsrqopqqqqrrttttttttuuttuuttttsssqnmaVJJJJKGIJKKKMPSUVY^beghpqqrrsssttttttttqolhgilnopqrttuuwyz{|||} ¨¨¨¨¨¨§§¦¥¥¥¤£¢ ¢¡ ~~}}}}}}||{{}}~~}|{z{zyxwvttqkmneVPNJGDB@>>><::;;::;=<<<<<>A@BDEFGIJKMOPPOOOOOPPPOMLLLLKKJJIJJJJJJIHGHIIIHGGHHIJJKKLLKJJJJKKMMMNOPPQRRSTUVVVWWVVVVVVWWWXYZ[\]]^abdgikmnpqstuuvxxyz{|}~ ~~~~~|{|~|{{{zzzyvuuxz~}{wvtttttstttvxyyyvtttuvy{ ~{z{|| |zyyxtojgfc_\\[XWWVUSRRQPPPPPPONNNOMKJHD@>54110/.-++,+'%'+$,8?DJT\\jmkigjkqqpooqtuuttuvvtsuvxxxxxxyyxwwwwxxxyyzzzywxyyyyyzzzzzzzyzxxxxyyyxxxyyxwttsttttttttsrrrqpooopppqqrsrrrrrsttsrrsttttsrrqomk_WNLHDGDDFHHIMQTWZ_dhklmrrsttttttttttttspnkhhjmnopqrttuuxyz{||}~ «««ª©©©©§¦¥¥¥¤¢¢¢¡ ~~~~~}|zzzzzz{{||{zzyzzxwvtsqgbbb\UNGDCA?>=;99889999;====>?CFEFGHIJMOPPQQQQPQPPPPPPPPONNMLKJJKKLKJJIHHIJJIHHIJJJJJJKLMLKKKKLLNOOOPQRRRSTUVVVWWWWVVVVVXXXYZ[[\^]_bcegimnoqrsttvwxyzz|}} ~~~{|}|} ~}{zzzzzzxutuz|{ywvtttttttttuvwwwutttttvy}~~~~~ }zz{~~ }zzxwtqmjjea^\YXXVVTSRQPPRRRRPPOOMNNMLID@?>=:8631,*()+,,+)($#1>N\bhmmnmponmnopqssttutsrttvwwwxxyyxwwwwxwvvvwxxxwxxxxxyzzzzzyxxxwwwwxxxwxxwwwwutttttttttsrrqqpnnnnnnnoopqqqqqqrrspnmmnpqtrqponkid^VPG?A?@CDEGMRUZ]chjmopsstuvwxxuuuuuutsomjiikmnoopqsttuxxyzz{} ¬¬««ª©ªª©¨§§¦¥¤¤¢¢¢¡ ~~~~}}}}~~{zywvvvwxxyyxwvuvvuttronhd]VTWRF@@?>=<;88889::<>>>>?@BGKLLLLNPQRSTTUUUUTRRRRRRRRPPPONMLLKLLLKJJJJJJJIIJJJJJJJJKLLLLLLMNNPPPPQRSTTTTUUUUUXXXXXWWWXXYYZ[\\^^`befhjlnoqrsttvwyzz{|}~ ~}zz}~~|} }}|zzzzzyyvttw{}|ywuutttttttttuuuuuutttsrtvz{|||} ~{zz|}{zzxtprmgda][ZYWVUTSQPRSSRQQPPOOOMKJGDFEDB?<8710-+*))*++)'%".<GPV_dcehjmnoppppqrrrqsttttuvwwwwwwwwvwvuuvwwxwwwwvwyzyyyxxwwvwwwwwwwvwvvvvvtsttttttssqqpponnmmlkklmnnppppppppomigghikonnmmljhjbXRG>?<<>@CEJPU\`dhknprsstuwxxyxxxxwvtsnliiklnnnnopqrttvwwxyz|~ ¬¬««ªªª««©¨¨¨¦¥¥¤¤£¢¢ ~~~~}}|{zzzzzvtsqonnnnnnnnmmllllmljhfaXNFDIG>>>=;;=<;989;<<>@@@ACDFKPRQQRTVUUUUVVVVVVSTTUTTSRRQPPONNNLMMLLKLMKKKJJJKMKKKJJJLNNNNNOOOPQPPQRSTUTTUUUUUUXXYYYYXWXXYZ[\\\``beghiklnoqrsttvwyzz{|} ~|yz{|||}~~|{~ }{{{zzzzyywutuxz|~~|ywutttttttttttttuuuutttrqrtwyzz{|~ }zyz~ ~|yvvqljhb_^\\ZXWVUTTTSSSRRRQQPNMMLJIIGED@>=5662.,-0-+***(%"'2440+4;KPX^behlmmlkklnoppqqqqstuuvwvvutvuttuvvvvvvvvwxzyxwwwwvuvvvvvuuuttttutrpqqqqqqppmmlllkjihhgghiklnnnnmlkkigcaabdeihhijkjike\WKBA><=?DFJPU]aehlprrtttvvwwxyyxxwutrnjhikmnnnnopqrsttuvwxz{} ««««ªª«««©¨©¨¦¥¥¥¥¤£¢¡ ~~~~~~}||{{zyxvuuuonmjhgedbbbbbaa`abbccb_]\LAAA?>>=<;89<=<;;<===>ACCDFGJOTUTUVXXVUTUVVWWVVTUVVVTSQSRQPOOOONNNMLLMNLMLJJJMOLLKJJKMOPPPPPPOOQQQQRSTUUUVVWWWWWXYZZYXWWXXZ[\]]aabfhijllnorstuvvwyzz{|} }{yzz{zz|}~{z| }{zzzzyzyyxwttuyz{||zxuutssstttttttttuuvutttrpqstvyzz{}~~ }zx{ }{zvqnnlhcb`_]\[YXWVVTSSSRRQRRPPPPMJJJHFDDCBB>81.13/.,)'&()./)(*+3:@GPVY]djkjhfefilnnnnmnnottuvvutssrrstttstuvvwwxyzxvvwwvtuuuuttttppqstromnnnnnnnmhhggggfecbbbceghjkkjihfecb_]^`bbdddfhjjjhhb^QDD@??BGJKQX`behnrtrvwwxxxxxxwwwutqomighkmmnooppqstttuwxyz{|~~««««ªª««¬«©¨¨¨§¦§§¦¥¤£¢¡ }}~~|zzzzywxwutqopslihgb^\XTUVYZYY[`^\[[[ZYSJB@?=<>=<;;<=<<?>>?BDDDEGJLNPTVXXXYZZZYXVVXXVVVVVVVUTTSSRQPPPPQPPONMMMMMLLMNOPPNNMMNOPPQQQQPPQRQSTTSTVXWWWWXXXXXXYZZZZYYXYZ[\]`cdfghjlmnoqrttvwxyzz{} |zzxxyyyzz{|{|{zz~ }|{zzzzz{zwutrtvy{}zxvutsssttttuuuuuvvutttttsrrrstwyzyz}|}}}}}~ ~~|}{zzwwz ~zwuutpnfdb`]\ZXWVSSTTSQSRQRSTRPMLKJJJHGHGEB>:98731/.-++-+*+-./0)%'1>HPWacecbceghlnmkjlnllmnqrpnsqqstrqqsuvuuvwwuuwxvrsvtssspljlkjiihgghfeddddba^`aabcb__\[\]^`bbbbdeedcb`^_abccdcdgjllknkihRIDFCGGJQTV]egilnprstvxzzyxxwxxwurmiikmnnnnnppppqrstuvxyzz{|~¬¬¬««ª«««ª¨¨©©¨§¨§§¦¥¤££¡ ~~~~}{yxxwtstqnnkiijhddb]YUPPPPQRPPOJKLNPPNLID?>>=;;<;;<=>>>@ABDEGIJMOQRSUVXYYYZ[\[[ZYYZZXVVVVVVVUUTSRQPPPPQPPPONNMMONMNOPPPONNNNPPRRRSRRRRRRSTTTTVWWWWXXXYYYYZZZZZZYYY[\\^`deghjkmnnoqrstuwxyzz|} ~}{zywxyyyyzzzz||zz| }|{{{{zzyvtssuy{}~{xuttssstttuuuuuvvvutttttsrrsstuxxxz|{||{{{|} ~~~|{yxwvv{}zxxvspjheb_\ZXXVVUVVTSSSRRSSQPNMMMMMMLKJIFCA??<976531120....-.3-)*)%""+6CIKPV\ejmlklljjihgghjlimnnnprrrstrrstsusrtttrrnlkjheeheb_\[YZ\`_____^\[[[ZZ\\\[XWXYZ\]^_abbbbbba``bbdedehknnnnlklhWMJIINOPVZ\afhjmnqsttvxzzyyyzyxuqnjhiknnooooppppqrsstuvwxzz{¬¬««««ª©§¨©ªª©¨¨§¦¥¥¤¤¢¡ ~|}~~}|{{|zwuttqolhecba^]^\\ZVRMHIFEHJJIGDDEHJIGE@>=<<<:9;;;=>@ABCDGIJKNPRTVVWWXZ[Z[[\\\\\ZZ[ZXVVVVVVVVVVSRRQQQQQPPPPOONMOONNOOOONOOOOPQSRSSTSRRSSTUTTTVVVWWXXYZZZZYYYYYZYYZ[\\^aeghjkmnnnoqsttvwxyz{|} }|zyxwvwyyyxxxz{}}zzz} }|zzzzzzywvtstx|~|xutrsstttuuvvvvwwvtttttttsssrrtvwwyzzzzzyzz{~~}~}|zwttuw|{zzxtrqnieb_\YXXXWVVUUUUTSSRRQPPPPPPPPNMKJIGFEA>=<;98896321100,++14324'-10+,16>EMSY`b_abeffgjmjjgflttnooonoqrropoooomjgdbba_accb^\[[\_\\\\\\\\XXXVVXZ[ZXVWXXY[\]__``bbddddefhihjnprrrrqrthXLLLMSUVZ]_bghjmnqstuvxzzzzz{zvqlhhhjlnpppppqppqqrstuvwxxyzz~¬¬¬¬««««ª©¨©ª«««§§§¦¦¥¥¤¢¡¡ ~~~~~~~}|}{zyxxxxxutrqonljhdba^\ZVRQPMKID@>>@DDDBBAAAAA@?=>=::;;:<<=>ACDEGIJLNPQSTUWXYYZ[[[[[\\\\[ZZZZXWVVVVVVVVVTTSSRRRRPPPPPONNOOOOOOOOOPPPOPQTQRTTSSRRTUUUTUVVVWWXXYYYZZYXWXYYYYZ\\]_begiklnnnoprttuwxyzz{|~ ~}}|{zywutuwxyxxyz|~~{zz{ {zyxxxxxxwutstz}xusrsssttuvvwwwwwvtsqsttuttsrrstuvwzzzyxwxzz}~~}}~~}{zvstux} ~}{zxuurmhfc`]Z[[ZXWVVWVVUSRRSRRRQQQQPPNLKKKJIEC@?>>==>:88765520011//01.*%%(+-05=DIKMMPTX[\^behd__fnqnllkiiijjiornjhfcb`^^^^_b___^^]^_\\\[[\\][\\\[[\\\[ZZZZZ\^_aa`abehijkjknonpstutttstucTGLOQVWWZ^bcghkmnpstuwxzzzzzzwqlhghilnoqqpoorqqqrsttvwxxxxyz|}~«««¬¬¬¬¬««ªª««««¨¨¨§§¦¥¥¡¢£¤£¢ ~~~~~~}|{{|zxvutsrqpnmmljigfc`]\YVQMJGDDC@<::<<<;;>=<<<===;=><;<=<>?@BDFHILLNPSUVVWXZ\\\\\\[[\\\\\ZZYYZYXWWWWVVVVVVVUUTTSSQQQQPPONOOPPPPPPPQRQPPRTRSTUTSSSUUVUUUVVWWWWXXXXZYWVVWXYZYZ\]^`begikmnnooqstuvwxyz{|}~ ~|zzzyxxwutuwxxxyz}~{zz{ ~~{zyyyyyyywutstz}xutrsssttuvvwwwwwusqnpstvutsrrsttuvxyyxxwxyz|}~~~~~~~~~~~~}}||}}|{zvrstw| ~|zytomlifc^__^\YXYXXWVTSSSUTTSSRRQPPNNNMLKJGDCBBBC?=:::988533443460-++0331--176104555569=@IJMNORX^ghhfdceghnpkeca^_^^^__`a]^_^]\\[\\]\\\]_````^^_``^]\\[[\bbccbcehlnoooorttttvxxwvuvuhbXZ[WWWWY^cehilnoqtuvwxzzzzyvrlhghjknoqrqponqqqqqrstttuvvwxy{}~ «««¬¬¬««««««ªªª©¨§§¦££¤¥¥¤¡ }~~~}}~}}}|{zzzzxvutsommljiihhgbb_\XVSPNJEA=<=;88888788<<====<;8;>?????CDEFHJKMPPQTWZ[[\\\]]\\\\\\\]]]\Z[[Z[\[YYXXWWVVVWWVVVUTSRRRQQPPPPQQQQQQRRSTTSSTUTUVVUUUUUUVVVVVVWWWWWXXXYXWVVWYY[Z[\^_bdfhiklnnopqstuvxxzz{|} ~}{}||||zxvttttuvvuuwxyyz}~{zz{ ~~}{zyxxyyyzwttstz~|xutttttttuvvwwwwvtpnlnpsuutstsstttuwxxxxxxyz|||||||||||}}~~~}}|{{{|||{ytqqsuz~{xtrrpmiccb`][ZZYXWVVUTTVVVUUTTTSRQPPPOOLJGFEDEGC?>==;::887886568863111./-/31,-22100011278<??>?DKPUXY\bhegea_`^Z]]^`aa`_bbba```__aaa__`aba``__abcb`_]\\]effffghjnoqrrrtvwvuvyzzyzzwtwphd]WVVV\behjnoqrtvvwxzzzxvplhfhlnnoprrqpoopooopqqrrstuwxzz{}~ ¬««¬®¬¬¬«««««««ªª©¨§¦¥¥¥¥¥¤¢ ~~~~}|{{zzzzzxvvvtsqpqoliihgfedcbb_\XVTOJFCA>8887767876899:;;;:98:;>ACBBDFHIJLNPQSTVWZ\]]^]]]\\\\]\\]]^]\\\\[\\\[ZYYXXXXXXXXWVVTTSSSRQQQQRSSSRRRRSTVVVVVUUVVVUUUVUUUVVVVVWWWWXXXYYXXWXYZ[\\\^`acfghjkmnoqqstvwxyzzz|}~ }}|zyyxvutsommlkmpsuvuwyzz{~{{{z~ ~{zzxwwxxxyvtssuy|}~zvtttttttuvvwwwwvtrnlklnpsttttsrstttvwxxyyyzzzzz{{{||{{||}~~~~~~~}}|{{zzz{||{{wtqqrtz {xwxvrnhhfca^\\[ZYYYXVVVVVVVUVVTTTSQQQQMKJJIHHIGDCBA@>>=<;<<;:98875457722110..02344421/*((*,,'"'/9?ADOYY[\[\\\[^_abbba`bbbbbbccbdedbabcbaabbbbceca_]\\^hhhhijlmpqsttuwxxwwxzz{z{{vyztihbVSVVX`dginpqrtvvwyzzyvtjhghjnopqrrrqpppooooopqqrstvwyz{{|~¬¬®®¬¬¬«««««««ª©¨§¦¦¨§¥¥¤£¢¢ ~~~~~~}}}~}|}~}}||{zyywwwvtssspnkjkljhfecb`^]\\YTPPMG@><=<87867556555799:;<<<=?=>BCBDHIJKMOPSTVWYZ[[\]^^]]]\\\\\\]]]]\\\\\\]\[ZZYYYYYZYYYXWVTSUTSRRRRRSSTTRQQQSTUVWWVUUUVUUUUVUUUVVWWWVWWXXYYZYYXYYZ\\\\]_abdghijlmnprstvxyzz{z{|}~ }|{zxvtrpnkgcgedfjptvuwzzz{}}|{z| }{{zxwwxyyyurrsuy{{||yutttuuuuvvwwwwwvtqmjkklnqtuvtsrssstuvwxyyyzzzzzz{{||||||}~~}}~~}~}|}}||{{zzzzz{{{{zvsqqrtz ~zz{zuqnnjheba`]\[[\\YWVWWVVUUUTTTSRQQRNMMNMKJJLJGGFDDCA>==>>>>;;98986246512662211.,+,-*,+))+'!&0423=GNSZ\\[\_abbcddcacefeeeedcegebabbbbbfhfeddb`][Z[\iiijlmnnsttvwxzzyzzzzzzz~y{wrjqgXSWVX_cehmoprtuvwyzzyusgghiknpqqrsrrqqrpppopqqrrstuuvxyz{}~~~ ¬¬¬®®¬«¬¬««««««ª¨§¦¦§¦¥¤¤¥£ ¡¡ ~}~~~~}}~}||~~}||||}}~}|||}~|zzyxvvtuuttrqpokijigefbba^\[[[\XSMHD@?::888888875556788:<=>>>>>@BDEHJJLOQRRSVWY[\\\\\]`__^\\]^^^^^^^^]\\\\\\\\[[ZZZZ[[ZZZYXWVVVVVVWWVVTTTTTSSSVVVVVVVUUVVVVVVUUVXXWVWXWWXXYYYXXYYXXY[\]]^`bdfhijlmnopruuvwyzzz}}}~ ~|zwtspnkhgedbcbbgntvxwxz{~~}~{z{} ~}|{zxxwwvwtqquz|{}zxxwuuvvvvwwxxxzxvurmjjjiijnrttvwwvutttvvwyzzzyzzyzz{{z|{{{{z|~~}||}}~~~~~~}|{{{zzzzz{{zz{}{yvsqstw{ }zxutrpolfbb^]\\\\\\XYXWVVVVRRSRRQQPQRRRPPPPPNJJJJHFEC@?AA@?@>;:::988999986455531.-,++*)****+.11.-028I]YXZ_aabdfhhhhihhjlligihhhhhhhijlmllkjmigbXTSS_fjloqsuuvwxxxyz|||}~~~|{yvthZSVY[`dehknpsuvwwwwusomkihimoppsstsrqrrqqqqqqqqqrtttuvwz{}~ ¬¬¬¬««««««ªª¨§¦¦¥¥¤££ ¡¡ ~~~~~~~~~}||}}||}||{|}||{zzz{{{||{zzz{zzzxvuuutttsponnjhhhhda`_`^ZVVVVVRMHD@=:888766777777778889;<=>??ABDEGJKLOPSTTUWYZ\\\\]]^``_^]\\]\]]^^^^^\\\\\\\\\[[[[[[[[[[ZZYXXYXXWWWVVUUUUUVVVVVVVVVUUWWWWVVVUTVVVVVVWVWWWWWWWVWXXYZ\\^_`bceghjkmnoprsttuvwyzz~~}{yvtnmjhedbbaaabfkquvwyzz|~|zzz|}}}~ ~~}|{zxwwvvtsprv{}||zxwvuuuwwxxxyyyxvutrnihhhhhlpttvvwwvttsstvxxxxyyyyzz{{z{zzzzzz|~}}||||}}|||}}|{zzzzzzzzzzzzz{zxsqqtvy~ ~{xuttrmjjhgeba_]\[[ZYXXYYVVVUUTUUSSTSRQPQTQOMMMKJJHEDEDCAA@?>==<;;;:9988888885311.-,+++++)+++))*+!5SY^^__bbdfhhhimlklmmljkkjjkkkjlmnnnonnonkcZRRVZcknqstuwxyzzz{||xtk`Z\\]`bbeimortvwwwvtplijiijmoqqqrssrrssqqqqqqqqqrtttuvxzz|~~ ®®®®¬¬«¬¬¬«ªª«««©§¦¥¥¥¤¢¤¢££ ~~~~~~~~~~~|{|}|{{||{zzzzzzyyzzzzzzzyxxxwwwvtsstsrqnmkkkheefea\\\\YTPNNNKGC?>>;8766555556788988889:<>?BCDDFHJKMOQSUVVVY[\\]]^^^____^]\\\\]]^____^^^^]]\\\\\\\\\\\\\\\\\[\[ZYXWVVVVVVWWWXYXWVVVVVWWVVVVUUTUVVUUVVWWWWWVVVVWXYZ[\\^_abdfghklnnpqsttttuwxyz~|zxutmkhfdbba__`cehntuwyzzz~~zxxyz~~||} ~~~~~|zyxwvutrqpsx}~}zywvuttuwwxxxyyyyxwuqlgeefgginsuuvwwvtrppsvwwvxyyxxyzzzzzzzzzyz{||||||||{{{{||{zyyyyyzzzzzzzzzxvrqqtux~{zyywsppqomjgda__]\[YYYZYXWVVVVWVVVVUTTTURPOOOMLLJJIIHECBCDCA?>>>>=<<;:::;:98655210///...--,++++,HR\]_bcdeghjklonnnnnnnnnnnnnnnnnnnoqqrrqmki_TRVbmqtttvxyz|||}}zvnhdcbab``dimortwwwvtqnjhiijlnpqqpqqrrsstrrrrrrrrrssttuwxyz|}~~~ ®®®®®¬¬¬¬««ªªª««¨§¥¥¥¤£¢¥£¤¥¢¡¡ }}~}~~~~~~~~~}{{|||{{{{{zzzzzyyyyzzxxxxwvuuttutrqqsqpnlihiigca`_\[ZYVRMJHGEB?<:998855555555789:::98:;<=>@DEFGIJLNPPRTVVVWZ\\]^^________^]]]^^_````````__^]]]]^^^^]]^^^^^^^]]\ZYXXWWWWWXXXYYZYXWVVWWVVVVVVVVVVVVVVVWWWWXXXXXYZ[[[[\\^_bcfhhhklnnpqrstuvwxyzz}~~{zwtsmkhfdbba_^`cdejquwyzzz}{xwxz}~}|} }}|}}}{zyxwuttppqty~~|zwuuuttuvvwwwwwwwwwtnhecdfgfhlqtttuvvtropsuwwwwxxxxxyzzzzyzzzyz{{{|||||{|||||{{zzzzzzzzzzzzzzyvtrqrttx~~{wtttsqnljhfdb_]\ZYZ[ZYXWWWWWWWWVVVVTRPPPPONMLLMMKIFDEFFDCA@>?@@?><;;;;:988875422111..-,++++*.@JX\_cghhhjlnnppppooqrppopqrrronnoprttuwtuzlYUVepsttuxz{}~ zvsnmkhgfcbgloqsvyxwusomkjjjkmopqpoppqrrsssssssssssssttuwxzz{|}}~®®®®®®®®¬®®¬¬¬¬«««ªªª¦§¦¥¥¤¤¤¥£¤¥££¢ ~~ ~}}~}}}}}}}}}}}|zz{{z{{{{{zzyzzyyxxxxwwvvuuttrstrpoopnnljhgghda^\[YWVUQKGDDB>>>;8644466666666889:;;;:<==>?ADEHJKLNPQSUVVWWY[\^^^_````^_``___````aa```aaaa`_^^]]^____^_______^\\ZYYYXXXXXXXXXXYYXWWWXXXWWVVWWXVVVVVVWXWWWXXYYY[\\\\\\\_abfhijklmnopqstuvxyyz{|}~{ywtrljgebb`__^_bbbflvwxzz{|~~~}zxxyz|~~~~ ~|{{{{zzyxwvttsppruz}}{xvtuuttuuuvvvvvvsttpiedddfgfgjnpstttttrprrtuwxwvwwwxxxyyyxyyyxyzz{||}|||}}}|{{zzzzzzzzzzzzzzzxutrrsux} ~{zwvtsqomkjgdba^]]\\\\[ZYYXXWWVVVVUTSSTTSRPPPQQPMJHHHIIHDCABBBA?>=>>=<;;:::8866544010/,+*+)+>J\bcciijklnnoprssssttrrqrsttttsrstvwwy~}{zl\ZZhtttux{} ~zvusrolllihknqstvyywtpnllmllmnpppppppqqrrrrrrrrssssssstvwxz{|||} ®¯®««¬¬««ªª§¨¨§¥¥¥¥¤¢£¤¢¢¢ ~~~~~~~~~}}}}}}}}|}|{{||{{zzzzzzyyyxwwvuuuuuuttsrpqqpnnnnkkjhfeddb`]\ZWTQMJEA@?>:;:974356778888889::<<===<=>?ACDFJKMOPRTUWXXYY[]____`aaa`_`aaaabbbbbaa``_aaaaa``_]^^_____^____^^^\\[ZZZZYZZYYYXXXXWWVVWXXYXXWVVVVVVVVVWWXWWWWXYYZ[[\\]^_`bcehjlmnnnprrsttvwyzzz|} ~{yvtqkhfdba`_^]^```bgstvxzz{|~~~~~~|{zywxyz{} ~}zzzzzyyxwvutsqprtvz}|zwutuuttuvvvvvuutuuskc`abbdfffhkmqrtttsrqqqqtvwvtvwwwwwwxwwwxxwwyzz{|||||||||{zzzzzzzzzzz{{{{zvtstttwz}|zyvtrpnkiihebb`__^]\[ZYXWVVVVVVVUVVVVUTTSSRPNLLKJKMLJGGFDBAAAB@?>>===<=;98888777741.,,*.>I\hkijjlmnnoooqsttttuttttuuuuvvvwyzzzz~}|{n\P[juuuwz~~ zxxtsroopnmnqrstuwyvrnlkllmnnoppppqqpqqrqqppqqqqqrrrrstvwwzz{|}~ ¬¬¬¬®®°¯««¬¬¬¬««ª©©©¨¦¥¥¥¤¢£¤¢¢¢~~~~~}}}~~~~~~~~~}}}}}}}}|}|||~}{zzyyyyyxwwwvuutttttttsrpoonnmlkkhhhgdba`_^\ZWTOJDD@=;;988765567878899999:;<>>>>><>@CDFHIKMOPRTVWZZZZ[\_````abbbabbbbbbbdbbbbbbaabbbbbbbba``````````__^^^]\\\\\[Z[[ZZZYYYXXWWWWXXXWWWVVVVVVWWXXXWWWWXXYYZZ[\]^_bbefhilmnnoprsttttvxzzzz|~}{yuroihecbba`]]]]^_bcnptwxyz|}||{{{zzywvxzz|} ~}|zyyyyxwwvvuttrpqstwz|{ywutuuuuvvvvvuuttvslb\[\]^bcefhiinqtttqppppqstvvvvwwwvuvvwvwxwvwxzzzzz{{{{|||{zz{zzzzzzzz|{{{yutsttvz} ~|zxvspnpokhgccba_^\\[ZXWWWVVVVVVVVVUUTSRQPONPOOOONMLKJGDCCDDCA@>>>>>>=<;:::9998751.+02:9K_kmjknoqqqqrsttuuvvyxwwxxxxxxyz|}|{}}}zbMWhtwxz} }ztttrqrrqqrrsttuwsnllllknnnppqqqrqqqrrrqppqqqqrrrrrstvvvxz{|}~~~®¬¬«««¬®°¯««¬¬«««««««©§§§¦¥¤¥££¤¢¢£ ~~}||}~}|{xyz|~~~}~~~~~}}|}~}}}}}}}}z{{{|}|zzyxwxxxxwvvvuuttssrssrqonnnmlkihfggeb`]\\[XVRNIE>>>:877887545677888::::9:<>????>=>BEHJKLMNPRTVWY[[[[\]_aaaabbbbbccbbbbcddddddccbccccdccccbbbaabbaaaa``_^^]]]]\\[[[[[[[ZZYYYYYXXXWWXXXXWWWWXXYYXXYYXXYYYZ[\\\^`bcfghjkmnnoqrsttttwxzzz{}}zyuqngecbaa``]^]\]abbhntvvwz|~|{zzzzzywvxz{} }{zywwxywvvuuttsqpqstwz|zywutuvuuvuvvuutssojbYUVYZ\^bdfhhhnquvtqooopqstuwxvwwvuuuvwwxxxwwyyyyyzzzzz{|||{||zzzzzz{{}{{zytssstw} }{yutvuokjhhfcbaaa\\ZYYYXWVVVVVVUTTSRRQQPPPPPPOOOOLKJHFEEEEDBAAA@?>>=<<<;;>=;;;840/01(7Pbhjlnrtttsvvvwxyyy{zzzzzzzzz{}~o\Setwz| zttutrsstsrrtttttpmlmnnlnnoppqrrsrqrsssrqqrrrsssqqrstvvuuxz}~}}|}~¬¬¬¬«««¬¬¬®¬«ª¬¬««ªª«ª©¨©¨¦¥¦¤¤£££¢¡ ~~~}|{zyzz{|}}}~}}~~~~~~~~~~}||{}|||||||{zzzzzzywxxxwvwwyvttttroooprsromjihhhgedcba`_]ZVWWUPLIEB>=:87778666678889:;<<<<;=>?@@@AACDDFHJKMNPQTVXZ\\\]]\]_abbbbbcddccccddddffghgfedefffffeedddcccbbcccbbbbb`a`_^]\]_]\\\\[[\\\[[[[[XXYZZZXVYYXXXYZZ[ZYZZZZZ\\^_abdfghjklnnoqrstttvwzzz{|~ ~zwvtolhdb```_`_^^]^_abdhmruxzz}|||}|zxyyxxz{} }{yyxxxxwvvttttsrssxz{}zxyvutttuuutttssrrrhZURRUUXZ]acfhiknqttsrqpnorttuvwwvttuuutvvwxxxxxwwxyyzzyzz{||||{|zzzz{{{|zz{xsqrsv{ }zwtttonjhgfffbba_]\[[[[ZXVVUUVVVSRSTTSQRPLMPQPOLJJJIGIIHEDBBBAA??>>>>@?=<;97533227CS_gkrrrutuxyyzzzyy{zz}~|{{| ~riht~ ~yvutttssttstuutrnkjlnmloooopqrrrrssssssrrrrssssttuuvvvwwyz{||||«««««««¬¬¬®®¬«¬«««««©¨§¨§¥¥¦¥¤£££¢¡ ~~}}|zzyzz{||||{{|~~~~~~~~~~~}}~~~~~~}}|{{{{{{{{{zzzzyxwxxxxwvvwwuttttroooopqomjhhgffdcb^\\\\\\ZVURMIEB?=;9766677777889::;;<<===>?@AABCCDEGHJKMOOPRUVXZ\\^__^_abbbbbbbccddddeeeeefghhgfegggggfffeeeeeeeecccbbbbbaa`_^]]]_^]\\\\\\\\\[[[[YYXYZZYYZZYYXYYY[ZZ[[ZZ[\]_`bbdfhiklmnopqsttuvxy{|~ }zwusnjhdbaa`____^^^_`acehmrwzz}||{{|}~~}|||~ |zyxwwwwvvutstsrrsu|{vuttsstttttrpoopppWLJJLQSV[]adfhikmpttttttoprsttvvvvutuuuuuuvvvwwwwwxyyyyyzzzz{{zz{zzzzz{z|zzzxsqrqtz ~|zxwvttsqnkhhhheb`_^]\\[ZXWVVVVVVUVUTVTUTPPRQQPPOMLLKLLJIGFEEDDDCA@@AA?>=<;9865325=KVahsutuw{zzz||}}}}|}~zuqy {ywtttssttttttspnkkmnnnpppppqqrrrssssssssstttttuuuuuvvwwyz{{||} ©ª«««««¬««¬¬¬««««ªª©¨§§§¥¥¥¥¥¤£££¢¡}}}}zyyzzzzzzzzz{~~~~}~~~~}~~}}|}}}}}}}}}|zzzzzzzzzzyxxwvvwxxwvuuvtttssrponnnnnlhgdddcba``b_\[ZYVUTROJEB@>;:87566788889:<=<<<<<>>>??@AABDDFGIKLNPPQSUVWY[\]_`aabcdccddcccbeeefffffefghhhhghhhgggffffffffffccccccbbbba`^^^___^^^^]\\\\\\\[[[ZYXYZ[[ZZZYYYXXZYYZZYZ[^_`bbcegijlmnnoprstuwxzz} }zwurnigdbba`^^________bbchpuyz{||||~ ~~|{zxxwwwwvvttstsssty|wvsssstttsrrrqnjd`JACDGLPTZ\`ceghjlnrtvxxwssrqrtuvvuuuvvvvuuuuvvvwwxxyyyyyzzzzzzzzzzyyzzzz{zzzwsqrtvz}|zxyzwsonnnmigdcbba`^]\\ZXXYYXXXWVVTTSPQRPPQQPNNOPPONLKJJIGHHGDCDEDB?>>>=;:86537AL]dntutwzzz{}|uy zxwtstrstvvutsqmmllnopqrqqqqqqqsstttttsttttttttwvvuuvvwyzz{|}~ ©ªªªª««¬«««««¬®¬««««ªª©©¨¨¨§¦¦¦¥¥¤£££¢¢ ~}}|zyzzzzzzzzzz{}~~~~~~}}}||||||||||{{{zzzzzzzzyxxwwvvuvvvvuuuusssrqonnlkkjjhfdbaa_^]\\XWVVWVTQPNJFB?>=;9876778899:;=>?>>===>@A@ABBCDEFGIKMOPQRUVWXYZ\\^_abbcdeeeffeeddfffgggggfghhihhhhhgggffeffffffffddccddccccba``ab``````^]]\\\\\\\\[ZYYZ[[ZZZZZYYXZYYZZZ[\_`bbdeghkkmnopqqstuvwyz{|}zxurmigdbba_^^^^___^^^_`bhntxzz{~ ~}{{zzzyyxxwxwwvutttttvy~ }wvsrrsssrqorrnf\TPG@CDDJLQVY]acfhijmosvzzyvtrpqstuuuvvwwwwxwwwwwxxxxxyyyyyzzzzzzzzyyyyyzzzzzzzvrqstvz }|{yvtturqomlkjigedcbb_^^]\\[[ZYZWWVTUWVRRQPPPQSSRPPOOMKJKKJIHIJHFCAA@?>>:8864<F\_douvyzz{} ~ztw |wvvtttttuwwwurnklmmnoqsrrrrrrrrtttuuuttttttttttxwvuuvwxzz{{|~ ««««ªª«««««««¬®¬¬««««ª©¨¨¨§¦¦¦¥¥¥¤¤¤£¢¢ |zzzzzzzzzyyzzzz|~~~~~}}}~}}||{|||||{{{zzzzyyyyyyyywwwwvvvvttttttttrssqonnmiihhhged`_]\\ZYWXVTTTSQOJHEB?<:::988788889:;<=>@?>>>?@BDDDDEFGHJHJLOPQSTWXXYYZ\\^_abccddeeffgfffggggghhhhhiiiihhhhhgggffhggggfffedddeeddccbbaabbaaaaaa`_^]]]]]\\\\\[[ZZZYZZZZZZY\\\\\\^`abcdfhiknnnprstttuwxyzz||}zwtqlhfcbba_]^]^^_^^]\^`bfjqy~|}~ ~|zzyyyyyyxxxxxwvuuuuuvy} }trqqppponmlnkbVMJLHBDDCGJOSV[_behijlnrvzzzyvsppqtuuvwxxxxxzyyyyyzzyyxxyyyyzyyyyyzzyyzzzzzzzzzyurrtsu{ ~|{|||xwvuutrpmljihhfddcbba_]\XXZZVWYYVUSRRSUVVUSRRQPOONMMNNNMJHEDDDCB@=;<97<DX\`mtt|}|~ }xux}zwvvttvuvvwwxvqlkmnnnortssstttttuuvvvvvuuuuuuuuuyxwvvwxyzzz{|} «««««ª«««««««¬®¬«««««©¨¨§¦¥¥¥¤¥¤¤£££¢¡ }{{|zzzzzyyyzzyyz|~~~}}}|}~~~~~}}}}}~}}~}~~~~~~~}~~~~||{{{{{{{{{{{zzyywwwwwwwwuvvvuuuvtssssssrrrqonmllhggfedcb_\ZXXVTRWSNKJJJIEDA?=:99888888888:;<<=?AAAAABDDEEFGHHIJKJKNPQSUVXYYZZ[\]`abbcdddeeefffffggghhhhhiiijiihhihhhhhhhhhhhhhggfeeeffedccbbaabbbbbbba``_^]]^^]\\\\\[ZYYYYZZZZ[[\\\]]]_bbceghilmppqstuvvwxyzz{|}} |yvsokhecbb`^]^]^^^^]\\^`abdlw||}~ }{zyyyzzzyyxxxxwvvvvuuvz}soponnmljihhdZOGEGD?CCAEIMPTX]adhijmnrvz{zzxtqopsuvwxyyyyyzzzzzzzzyyyxxxyyxxwwwwxyyzzzzzzzzzzwtrtux{ ~}|{zyvtrrqpnnlkjihiheb_YZ]`]\\ZZXVVVVVWVUTTSRQPPONNPPPOKJHGGGGFB?>?>=?DR]blmlx{}~ }ywx~}{xwxuuwvxxxwwupklnoppprtttttuuuuuvwwxwwvwwwwwwwwyyxxxyzzzzz{{}¬¬¬««ªª«««««««¬¬¬««««ª©¨¨¨¦¥¥¥££££££¢ ~|||zzzzyyyxzzzyz||{~~~~~~~~~~~~~}}}}~~}}~}}}}||||}|{}}}}}}}}||}~}}}}{{zzzzzzzzzzzzyyxvvvvvvvvttuttttttsrrrqpponmlkjiiedcba__^\XUSSQNJEB>>?CDEDA>=:8898888899::;===>@BBCDDEFGGGHIJJJJKMNPRTVWYYYZ[\]_abbccdeeefffffggghhhhhhhhiijjjiihiihhhhhhhhhhhhhhhfeeffedcddcbbbccbbaaaa`_^]]^^]\\\\\[ZZZZZZYZZ[\\\\]]]_bdeghikmnppqtuwwwxyzz{|~ |yurnjhdbaa_]]^^^^^^^]]]__^_eowvxz|~ }{zzzz{||zzyyyyyxxxwvuuz{rqnnljihhgc`ZRKFCAA=BBADGJNQV\_bfhjlnqtyzzzyvsopsuvxzzzzzzzzzzzzzzyyyxxxxyxwvvvvwxyz{{zzzzzzzvsstw}¡¡¢¢ ~|zwvwxwtsrsronnmjhgecfhhhgb\\\\ZXXYWWWVUTSSSRPPQQQPOMKKKKKJEDCCCCDEJ[aihfrt|~ }zzy|~|zyzwwyxyzzxvtolnnprrsttttuuvvvvvwxyzzyyyyyyyyyyyyyyzzz{{{||}~ ¬¬¬««ªª«««««««««¬«ª«««©§©ª©¦¥¥¥¤¢¢¢¢¢¡ ~}|zzzzyyxxzzzzz||z||||}~~~~~~}}~~~}}|||}~~}|{}~~~}}|||||{{|~~~}}}|||{|}||||z{zzzzzzzyyyyyxxxwwvvvvvvttttsrsstsqqqponmkihhhhgcba_\[ZZYUPNNMIEDB>>?ACCC?<986789999::;;<=>>>?BDCDEFHHHHIJKLLLMMOPQSUWZ\Z[\\^`bdddddefffhggggghhhhhhhhiiiiijjjiihhhhhhhhhhhhhhhhhgefggeddeeedddddcbaaaa`_]\]^^]\\\\\[ZZ[[ZZYYZ[\\\]^]^`cfghijlnnopqstvwvwxzz{|~ }zurnjhcba`_]]_^^__^^^]\^^]\`gmnsx{|~ }|{{{|}~~|{zzzzzzzzywuuzvopkjhgfedcaXLEDDC@@>CCBDEHLPUZ]adghknptwzzyywtposuwxzzzzzzz{{{{{zzzyyxxxxxyxwvvwxxzz{|{zz{zzyursuy{ ¡¡ }{z{|{ywwwxtonnmmnkgfhhkie^abb^\[\[[\[YWWWVVVUTTTTSQPOOONLJHFEFGGFDV\gihsp} }~~} {{|zz||yz{ytqonnoqstttuuuvvwwvvxyz{{{{zzzzzzzyyxxyzzz{{|}~~~ ¬¬¬««««ª«««¬««ªª©ª«««ª¨§¨§¦¦¥¥¥¥£¢ ¡¡¡¡ ~~}}{zzzzzzyxyzz{{{||}}~~~~~~~~}}}}~~}||||||}}|{{{||{|||zzzz{z{|}}}|}}}|{z{{zz{{zzzzyyyzzzxwvvwwxxwvuvvutuutttttrqqrsrqponmlmjhhfbbc`]ZXVURPMLJIHECAA@>====<<;99::;;;::;<>>>>?@ABCDEFFGIJKJJJLNONOPPSTVVXZ\^___`aceggghhhhhhiihhhijjiiiijjjjjjkkkjiiiiiiijjjjjjjjjjjiihhggggggggggffedcbbbbba`____^^^^^^]\\\\\[\\\\[]]]_abbbfhjkklnpqrtuwxxwwz{|{|~ ~zwtplhfcaa`_^^_`aa`_^]\\\\\\]^iiq{v ~|{{|~~}}~~~}}|{{{zxwz~ }qiihhfdcb_[PLFCCB@>@ACDEFHIKPQV\`bghknorvzzyzwttrtyzz{{{zzy{zzzz{||z{{zyxyzzyxxyyyyz{||{zzz|zxvttx{~ ~}}}zyyzzxwxyvtrponnqonnliebabbbcdfgZVVZYVUWWVUSQPPPPOMMNNLJMQ\hmmpv| {uqppqstuttvwvxwvwwxxwyz|||{|}}|{zzz|}|||{zz{| ¬¬¬««««««««««««ªª©©ª©¨§§§¦¥¤¤££¤£¢¡¡¡ ~}}~}}|zzzzzzyyyzzzzzz{{{{||{{{||}|{{{|||}}}}|{{{||{{{{zzz{{zzzzyyzzzzz{|}}|{{{zzzzzzzzzzzzzyyyyyywvuuuutttusttrrssrrssrpooorqonnmkjhfcb`]]]\YVUSPMKBAABCCBB?>=<<<<;;:99::;:<<<=>?@@?@BCDDEFJJJJKLLKKMOPPPQRUVVXY[\]```bceghhhhhhhhhhhiijjjjjjjjkkkkkkkkkkkkjjjjjjkkkkjjjjjkiihhhhhhggggggggfeddcbbbbbbbbba```aa``_^]\\\\]]]___abdddghkllnortuvxyyyyz{~~~ {xtplhfcbaa`____``_^]\\\[[[\\]]_bmrw ~}||||}~~~~~~~}||{{zxwzynhgeca_^\WRLJFDBB@?@BDDEGHJKOQU[_bfhjmnqtxyxyvttstyz{||{zzzzzyyzzzzz{{zxwxyyxwwxyyyz{|||{{{zywutuy} ~~}zyyxwvutttsrqqqqomjihhghhhgb_]^\YXYZZYXXWWWWTPOPQPOPPQ[htxwx{ {tpqttuwxxyzzzzzzzzzzyxz|}||}~}||{{|}}~~~}||}~ ¬«««««ªª««««««ª©¨§¨¨¨¨§¦¥¥¤¤££¤¤£¢¡ }}}~~}|{zzzzzzzzzzzzzzzzzzzzzyzzzzzyzz{{|{{{|{zzz{{{zzzzzzzzzywwwxyyyyyzz{{zz{{zzzzzzzzzyyxxxxwwwvuttttsrqstssrqqrrrrrrqponnonljjihffdb^]\\ZVTRPNJGD>>=>>>>>>=<;;;;;::::;<<<>>?@BCDDBCDFFGGHKKKKKKLMNOPPQRSUVWYZ[\]]__abdfhhhhhhhhhhhijkkkiikkkkkkkklkkkkkllkkjjkkkllkjjjjjkiiiihhhhgghhhhhggffeddddcbbbbbbb`aaaa```^]\\]^_`aabbdfgghjmnoprtuvwxyyzzz| }yuqmifcbaa_^^_____^]\\\[Z[[\\\^[`mx~ ~||{|||}~~}|~}|||{zxx|qjeb\ZVSQPKHIHFDCAABBCDEFGIJLPQUZ^aegikmosuvwxvttsty||}}|{{{zzyyzzzzzzzzxwxyyxwwxyyyz{|}}|||zxuttuz }{zzzzyywutttttttsrpnkjkkihkifb_\[Z\\\\]]^^^[VUVVUSSSOLVhuy{~}urtvxxyzz{}~}||||||{zyz|~~~~~~~~~®¬««ª««©©ª««ª©©ª©§§§¨¨¨¥¥¥¤¤¤¤¤££¢¡ ~~}|{zzzzzzzz{{zzzzzzzzzzzzyyyxxwzzzz{zzzzzzyzzzzxyyyyxwwxwuuwxxwwwwxyyyxzzzzzyzzxxyxxwwwwvvuttsrsttspoprsrpoopqqqqpponnmligfffdb`_\XWWUQQPMJHEB??>>=<;;;==<<<<<<<<<=>>>>AACDEFFGEFHIJJJJKLMMLLNOOPPQRSUVWY[\]^^_`abceghhiiiiihhhjklllkihkkkkkkkjkkkkkkllkjjjjkkklkjiijjkjjjjihhhgghhhhhhgggffeeebbbbbbbbaa`___``^]]]^`aaabbdfhhikmoqrrtuuuvxyz{{{} zwtnlhebba_^^````_^]]\\\[[[\\_b\]kuy{ ~~~}}||{{|}~~}|{~~~~}}|zzxy}~lf_YWTPMKKJJIHFDCBCCCDDEFHIJMPRTZ]`dghjmortuvwvtuttz}}}}||||{zzzzzzzzzzyxwxyyxxxyyzz{{|}}}||zwtstv{ ~}|zzxzzyyyxwvtsqpqqpnkmkiimnmedcbbbbba`^\[YWVTVSKM[iq|~ ywxxxzzz{}~~~~}|{|~ ®¬«ªªªª©ª«««ª¨§¨¨¨¨¨¨§¦¤£££££££¡¡¡¡ ~~~}|{{{{zz{{{zzzzzzzzzzz{zywwwwwxxyyyyyxyyxxxxyywwxxwvutuutuvwvuuuuuvvvuvwwwwwwxwwwwvvuuvvutsrqqqstrpnnopnlllmnnnnmmlkihhebbcdb_ZZWTRROJLJHEC@>=<<;::::;<<<<====>>>?@AAACDDEFGHHIJJKLLLKKLOPPPPPPPQRSTVWY[\^`aabcdeghhiiiiijjjjikkkkkkkklllllkkkkklmmmllkkkkkkllmlkkjkkkkkkjihhghhhhhhhhggggfffeccbbccbbbb`^^^_`^^_`bbbbbceghiklnoqrsstuwwxzz|}}}~ {ytqnifccba````__^^]]\\\[[[[\\^\]hmnz ~|||||||{{{{}}}|{z|}}~~~~|zzyz}iaVPMLKJJJLOLJHEDDDDDEFFGHJJNPQSX\^bfgilnqsuuwututuz}}~}}|}}{{zzzzzzzzzzyyyzzyyyzzzz||}}}|{{zwtstw| }|{zzzyyxxyzyzvqnnmjtrnljihhdeeb_\\\XXVUX]aant| }z{ {z{zy}}}~ ®¬««ªªªªª«««ª¨§¨¨¨¨¨§¦¥¥¥¤¤£¢¢¢ ¡¡¡ ~~}||{||z{{{zzzzyyyyyyyyyxvuvwwwuuuvvvvvwwwvuvvwxxxxwvutssstttsrtttttttsttuuuuuvttttttttuutsqpppopqpnmllmjhhiiijjihhhhecca^_aa^[TSQOMLIFFEC@>=;;9:::::;<;<=>>>>>???ABCDDDEEFFGHIKKLMNNNMJLNPPPQQPQRSUVWXZ\^`bbcdefghhhiiiijjkkkkjjjjklnnmmmmmmmmllmnnnmlllllllmmnnmmlllllkkjihhhhhhhhhhhgggggffffeddeeddbb`_^^_```bceffefghjkmnopqrssttuyyzz{|||~ {yurohecbbbaa__^^]]\\\\[[[[[[Z[\^eegw}~~~~ ~|||||||{zzz{||{{zz{{|}~~~}{zyz| i\JFBDILNNOPQOKIGFFFFGGHHIJKNPPQVY\`dehknpstuvutttvz|}~~~}~~|{zzzzzyzzzzzzzzzzzzzzzz|||}}|{zyvsrtw| ¡¡ ~~~}|||}wyxuuvvuvtqoooonklkhdbced`\]_^\[bkx xtty}}}~~~ ¬¬«««««ªªªªª©©¨¨¨§§§§¦¥¤¥¥¤£¢¢¡¡ ¡¡ ~}}||||z{zzyyyzxxxxwwwwvuuuvvuuttttttuuuuuttttuxwwvuttsoooonnnnpppqqrqqrsttttttrrssssssssrpnnnnmmmljihhjhfghhghfeccdc`]\ZWX[[VSJHFEDA@AA@?><;:9:;;;;;;<<=>>??@@BBBCDEFFHHHHHHJJMMMNOOONKLMOPQQQRSTVWYZZ\]`abcefffghhiijjjkkkkkkjjjjklnnmmmmmnnnlmmmmmllmmllmmmmnnnmmllkllkjjjiiiiiiihhhgggggggfgfeefeedbbbbbaa`abbdfhhhhjlmnoqsrssttuwxyz{|}}}} |zwspigdcbb``__^]]\\\\\[[[[[\\[^]aabr{}~}}~~ ~~~~|{zzzz{{zzzz{{|}~~~~~|{zz||kZDCDGMTXYXWTSQNJHHIHIIJJJKMOPPQVX[_cdhlnpsuuvutttv{|}~~~|{zzzzzyzzzzzz{{zzyyzzzz{{{|||{zwtrqtw} ¡¡ }|wuttuuuttsqonmmnnkhc`]]^afoy yttuww ~ ªª««««ªª©©¨§§§¨©¨§¦¦¦¥¥¤¡ ~~}|||}zzzzxxxyyxxwwvvvuuuvvutrttssttuvtttsrrsttttrqponnnmljjkmmmmnnoonopqrrrrspqqqrrrqpponlkklljihhggghecefeeeb`___^\XVTQRUTPKHDCCA>?B>>>><;988:;<;;<<=>@AAABBDDDDEGHIJJJJIJKMONNNOPOOONNOQRSSTUVXZ[\\]_abbdeghhhhijklkkllkkjjlkkkklllmmmmmmmmmllkkkklllllllmmlmmmllkjllkjjkkkjjjjiihhggghhgggfeededdccdfgfecbbbbcfhhijkmnoqstttttvxzzzz} ~{xtqnkhgebaa`_^^]]]]\\\\\\\\\X\Y\_anz{||}}~ ~|zyzzzzzzzz{|}~~~~~}|zz|zo\DGHIMV\]\[UVVQLIIJJJJJJKMNPRQRVY\`cdhloqtwvwttttv|{}}|{{{zzyzzzzz{{|zzyyyzzzzzz{||{zvspqtw} ~~~}{yxwvvvusqnnnjheb]bbcit~zwwxwvz} ©©©ª««ª©«©§§¨©¨§¨§¥¥¤¤¤¤¢¡ ~~~}}|{{zxxyyyyyyyyyxwuvvutrrrsrstsrqporqppqrrrtsrqpponlkjihijjnlkmmkjlmoonmoonnrnjnporpnjhhhhhhfcbbcbabba```aa_\YXYXVUQPMIEDDDCB@>>>>>?><;;;<<>>?>>?>>?@BDDBDGJIIHIJJKLKKLLLMPOPPQQPPPPPPQSTUUVVWZ\_``bbbcdfhiiijjjkkkmlllllkkkkkkkkkjnnnmmmmnnnmmllmmllmmlllkklmlkjjjkklllkjjjklllkihfghhhhgghggffffgeffffeddbdfghhiklnoqrstuvwxxyzzz{}~ {wtrmjhecdbcba`_]]_^^^]]]]\\[Z[\]bfv~}|~~|} ~}||zzzzzzzz}}}~~~}|~zzuhaY[[YY\__\\ZWTPNMMLKKMNNPQTUVVVX[]bfjnpsuwvvvutvyz}~}|{{||||{{{{{zzzzzzzzzzzzz{|{zzztqqtvv| zzzzzyyxvtssrokhedfhjq~~}}~~~ ©©©ª««ª©ª¨§§¨¨¨§¥¥¥¥¦¥¥£¡¡ ~~~}|{zzzyxxyyyyxyyxwututtrqqrsrqqponmonnnoppoqponnmlkjihfeeeefefhiikmgikjikkigkjinpnoihecdddcb`\\\\\[\\\\\\\]ZXUTTSPNNLJGDBBB@?>>=<<<>>>>==>>>???@AA@DDEGGFHJJJJJJJKKLLLNNMOPQQPPQQRRQQQRSUUUVVWY\]^^abbcdfhijjjjkkkkllllllllkllllkkknnnnnnnnnnnmmmmmmmmmmmllllmmlkkklllllkjijklllkihhhhhhhhhhhggffffefffffffffghjkllmnprsttuwxyyz{{z~ |xutonlheecbb``_^_`]^^^^]^_^]\]]_belw|~~~ }}}}}}}}{{zzz{{{||}}~~}|~{{wmg_a`_^_a`]\\YVRPPPNMMOPPRTTUVVVY\_ehknpsuwxxwvuvyz}~~}||{||||||{{{zzzzzzyzzzzz{||zzxxspqttv~ |z{zxwvuspffhhhhov ©©©©©ª©©¨§¦§¨¨§¦¥¤¥¥¥¥¤¢¡¡¡ ~}{zzzywwxzyyxxxxvuttttsrqqspnnnnkikjijkmmlkjjjjihfgfdcbbbbZ\`abdeebdggghgedeehmkhifdbbbba`][XWXXWVUUUUUVVVUSPPOMJHHHFDB@@@>>>=<<;:<>>>>>>>?@AABDDDFEFGHIJJJKKKLLLLMMNOOOPQQPPPPPRRSSSTUVVVXXYZ\]]^`bbdeghijjjjjkkkllllllllklmmlkklnnnnnnnnnnnnnmnnnnnnnnmmlmnnmlllmmllkjjjjkkllkjihhiiiihhhhhhhhggfghhhhhiiiikmnnnoprsttvwyz{{|~~} |zytsqlihgecbba``a_`````aba``aabcehq} ||}}~~~~~}}|||||||}~~}||~~|yrnfcccbbba^]\[XUSRRQPPQSUVXWWXXY[^aghknptvyzzxvtvy{}~~}}|||||{|||{{zzzzzyyyzzzz|}|zyvurqsuvx ~|||}}}trolf_]_mt{~~ ©¨¨¨¨¨©©§§¦§§§¦¥¥¤¢¡¡¡¡¡ ¡¡}|zzzyxxyzyyxxxwvvuuuttsrqqomlkjhhhgfghiihcdefgfdcbba`_]\\QVZYX[[YW[\\]^]\b`bfhfcdb`_^]\\ZRPPOPONLNNNNMMLLOMLKJHEDCCCA@?>>>========>??>>?ABCCCDFGGGFEFHJJJKLLMMMMMNOPPPPPQPPPPPPRSUUUVVWWXZ[[\]^__`bcefghiiiijjjjjkkllllmmlmnnlklmmmnnnnnnnnnnnnnnnnnnnnnmlmnnmmmmnmlkkjkkkkkkkkjjjjjjjjiijjjjiihhhhiiiikmlklnopporstuuvxyz|~ |ywvrnnkihedcbabbbbcdeeeeefggggginz~~}}}}~~~}|{{~ |zurjddeeedbba`^\YWVVVVUVWX[\]]\\\]`bghjnptxzzzwutuy|~~}}}||||{{||{{{zzzzzzyxxyzzz||{ywusstxz} ¡¡ zwsmf^ZY]djmkiknx ¨¨§§¦§§¨§¦¦¦¦¦¥¥¥¤¡ ¡ ~}zzyyzzzzyyyxwwvvuuuttsqpnnmkihhhffefhhgf`abcccb`_^][XTPONRTPPSUSXZ\\\]^^\[_eea^^VVVUTSQPPPPPPPMKHHHHGGFFFFFFDDB@@@A@????>>>>>>@ABCCBAADEEFFEFHJJJJIIJLMLLMMNNNNNNPPQPPPPQQQRSSTTUVVVVWXY[\\]^_`aabcefhhjjjjjjjjjkkkllmmmlnnnmlmnmmnnnnnnnnnnnnnmmnnnnnnnmmnnmmmmmmlkkkklkkkkkkkkkkkkkjjjjjkkjiihijkkjjlnmnoppqrstuwwxyzzz} {zzvtromjhhgeddeddgillklmnnmljihet~~~~~~}||{{~ }zutmfffggfeedcb`]\\\\[Z[\\^`aa`__`beghjnqtyzzywttv{~~}||||{{zzzzzzzzzzzzywwxyzz|}{yvuttwz~ ¡ ¡¢¡¡ ~{xtqpjjhe`^_`hmu ~ ¦¦¦¦¥¥¦§¥¥¥¥¥¥¥¤£¢¡¡¡¡ ~|{zz{|{zyyyxwwvwvuttsrpommlkhhggeeefffcb_____^\\ZYXUQMJHKMLJJORRPPPQRTVWYZ`d_XVTNNNNMLKJHIIJJIFDDDDDDDDDBCCCCBAA@AAA@@ABA@??@ACDDDDDDDFHHIIHHJKJMLLLNPPONNNOOPPPOPRRQQPPPQSTUUUTUUVVVWXY\\]^_`abbbdeghijkkllllllkkllllmmmnnnmmmnnnnnnnnnnnnnnnnnmmnnnnnnmnnnmlmmmllkkklllkkkkkkkllkkkkkjjjjjjiiijlmmkkmnnorrrstuwxyzzz{}|~zxvtonkkkjjjhhhkorrrstttsqnlgan}}}~}|||{{}~zvuphgfffeddedcba___a`_```bbbbbbbcfhijlnruyz{zwttx~~~}|{{{{zzyyyzzzzzyzyxwvwy{|}}zxutuvx{ ¡¢¡¡¡¡¡¡ }zwvrlfbbcfdekuzvtvtxvtx|{|~ ¥¥¦¥¥¥¥¥¤¤££££¤¤£¢¡¡ ~~}||{{{yyyywwwwwvtsrqpomlkjihfebbbccb^\\\[ZZYWVVTQNJGEDEFFEGJLMJKLNPRUVY[a`VNMKKKKKJJIHIIIIIHGECCBBBCCDABCCCBCCBBCBBCDDDDDDDDEFEEEFFHIJJKKJJLMLMOOOPQQPPPPPPQQRPSTTSSQPQQSTUUUUVVVWWXZ[^_```abbccefghjkllllllllkllllllmnnnnnnmmnnnnnnnnnnoonnnnmmnnnnnnnnnnmlmmmmlllkkklkkjjkllmmlllkkkkkjjjjjklnoonnopqrttuvwxyzzz{|} }{zuspqqqppopqstuwxxzzzzzwtokr|~~}{z{}~~}}}|{|~|wxvlheeedccdeedcbccdccddddfcdeedehiklnptwz{{zwtty~~||{{{zzyxxxxxxxywxyxwwxz|}}|zvtsuwz{ ¡¡¢¡ ¡¡ {vpkhffggjnnha]SPMUeoty~zwwxwxyzzz{|~~ ¥¥¥¥¥¤¥¥¢¢¢¡¢¢¤¥¥£ ~|z{{yzzywwwxywutsrqonljjiheb```aa^ZWXWVUUUUTTQMHDA?>?ACDFFDDDEHJLOQTXY]ZMHJJJJJIGFEDFEEDDDDDDDCBBBBCABCCCBCDDDDDDDEFGGHHHHGGFGGIJKLLKLLLLNNNNPPPPRSRRQQQQRSTQTVUTTRPSSTUVVVVVWXYYZ\\`abbbbbcddefghjlllllllllllllllllnnnnnnmmnnnnmnnnooooonnnmnnnnnnnnnnnmmmmmmmllkjjllkjjkllmmmmllllllkkkllmmoqrpprstttvxzzyzz{{|} }zxuuvuttuwyyxwyz|~~zz{~}|zzyy{~~~|z{}~~|yzznjffffeefggggghhfeegggghfghhgghiklnquy|~{zvttx~~~|{{{zzyxxxxxwwwwvwxwwwyz{||{yvtsux{|~ ¡¡¢¢¡ xsonnnnnmjheb]_b]anz}ytrrrsttvwz{¥¥¥¥¥¤££¡¡¡¢¢£££¤¢ ~|{zzyzzzwuuuwwvtsqonmlkjhgcb_^b\ZWOSRQPNMMNNLJD;78;;<>>>?ABBADGIJNPRZ\YPJJJGIHGFEDDDFDDCDDCBCCCCCDDDDDDDEEEEEFFEEFGHIIIIJJJJMKJKMOONOOOOPPPOPQSSSSRQSSRSTTTSSSTUUUTSUVVVVVXY[[[\]^_aaaaabcefggghiklmmllmnnnmmmmmmlllmmmmmmmmnnnnnnnnooooonnnnnonnnnooooooonnonnmmmlkllkjjklnnnnnnnmmnnmllmmnpqrrrstuwwxyz{}}~~~}||}~|{|||}~ ~{{zzz|~~~~~}|}|}~}}~olihgfghijkkmnnlljhhijihiiijjjjjmnoruz|}}zvtux}|{{zzyyxxwvvvwwvwwxyywy{||{zvtsrvx{ ¡ ¡¡ ¡¡¡¡¡ ~zvsqpopqtrpoonnmty}ztmiihmqttstt¢£££¢¡ ¡¡¡¡¡¢¢¢¢¡}|{zyyyywvvvutttsqpomkjihfca_[c`OJNOLKJIHHHHGFB;7899:<===>??ACDGJMRVZZVOJIIHGFEDDDDCEDDDDDDCDDDDDDEEEEEFFFFFGHIIIIIJJJJJKLLMNNMMLMMNPPPPPPPOPQRSSTSSTTSSTTTSTUUVVVVVUVVVVVXY[Z[\]]_abbbbceghhhhhhjlmmllmmnnmmmmmmmmmllmmmnnnnnnnnnnnnnonnnnnnnoonnnonnnnnnnnonnnnnmllllkkklmllmmnnnnnnooppppqstuuvwxzzzz|} ~~~}~~ ~||{z{|~~~~~~~~~qnlkjjklnoonoqpoonlllmlkllllmmmmnoqsv{}~~zvttx}~~{zzzyyxxxwvvwwwwwwxzyxz|{{{yusssvx{ ¡¡¡¡¡¡¡ ¡¡¡¡ ¡¡¡ z{}}} ¡¡¢¢¡¡ ~}{zyyxwwwwvtttsrpoomkihgeb`_\YSHEJGFFDDCCCCAA>:88879;<<<>>>@ACEHMU[YVQLIGHIFFEEDDDDEDDDEEDDDDDDEEFFFFGGGGGGHIJKKKKKLLLLMNOONPPOLLNPQPPPQQPPPPQRSTTTUUTTTTTSUUVVVVWWVVVVVWXY[Z[\]^_abbbdeghhhhhhhikmnmllmnnnnnmmmmmmllmmnnnnnnnnnnnnnnnnnnnmnnoooooonnnmmmnnonnnnnnmllmlllmmllmnnnnoopqsttttrtwyyzz{|||}~ ~}|||}~~}~~~~rommmnnorssqqqrrrqonoonnoooopppppqrtx{~~}yuttw|~}}~{zzzyyxxxwvvwwxxxxyzzyz|{{zwsqrtvxz~ ¡¡¢¢¢¢¡ ¡¡¡ ¡¡ ¡¡¡¡ ~|{zywvwwwutttrpnnmmkifca`_`eM>DDC@BBA@?>>?>>=988879;<<=>@@BDDDJS[]XRMJIFGIHHHGGGGHFFFFFFEDEFFFGGGHGGHHGGGHIJJKKKLLMMNNOOPPOPQPNNPRQQQQRSRQRQQSSSSTVUUUUUUUUUUUVVWXWWXXXXZ[\[\]_``bbbcdfghhhijihhknonnmmmmmnnmmlmmnmmmmnnnnnnnnnnnnnnnnnnnnmnoooooonnmllmnnnnnnnnnnlmnnmmmnnooooooopqrttuuutuxzzz|}~~ ~}~~~}}~~tqooppqrtttsrrstsrqpqqqpssssssssqrstw{||zvsrtw{~|||}||{zzyxxxwwwwwxxxyzzzz{|}|zvqpqtuxz} ¡¡¡¢¡ ¡¡ ¡¡ ¡¢¢¡ |{zywvwwutttsrpnmljjhda_`acbE8>;:=====;;;<=<:888889;=>>BDDEJJHP\b^VPKJIGGJHHHHHIIIHHHHGGGFIIIJJJJJIJJJIIIJJJKKKLMOOOOPPPQQQQQQPPQSQQQRSTTSUSRSSRRSUUUUUVVVUUUVVWXYXXXXXYZ[\\\_aabbbbceghhhikkkjkmoponmlllmnmmmlmmmnnnnnmmmnnnnnnnnnnnnnnnnmnnnnnnnnnmmmmnnnnnnnoonmnnnnnnnpqqqpppqsssttuwwvxzzz{} ~}~~~yvttttuuuuuuttuvssrrrsssttttttttrsstwz{zxtrrtx|~}|{||}|{zzyxwxxwwwwxyyzzzz{{|}|zuqoqttxz|{z|~~ ¢¡ ¡ ¡ ¢¡¢ ¡¡¡ ¡ ¡¢ ¡¡¡ |zzywvwvttsrrponmljjigcbcfaJ:<:7:89:;;:99:<:87889::=>>ADFGHLMMVabZSOKJJHHJGGGGHHIIJJJJIIIJKLLMMMMMKLMLKJKLMNNMNNPPQQQQQRRRTTSSSRRQQQQRTTTTUSSTTQQSUUUUUVVWVVVVWXYZXYYYXYZ[\\\`bbbbcdeghhijklmmmmnooonnllllmmmmmmmmnnnnnmmmnnnnnnnnnnnnnnnnmnnnnnnnnnnnnnnnonnoppppnooooooopqrrrrstuuuuvxyzz|}}}~ ~~~~}}~|{}zwwwwwwvvvvvuvwttttttuuuuuuuttttttuxzzyusqsvy|~~~}|{|||{zzyxwwxxxwwwxyyzzzz{{z{zxtrqstuxzzxwz{z{}}}~ ¡¢¡ ¡¡£¤¤£¡¢¢££¤¥¥¡¡ ¡¡¢¡¡¤££¢¢¢¢¡ |zzyxwwvtsqpponnmljjihgeddL65<998689::999;;9889;=>>?AABEGHIKOS[`]VPPMKJJJJHHHIIJJKKKKJJJKMNNOOPPPPMNONMLMNPPPPPPQRRQQQQRRRTTUUUTSRRRRSTTTSTRRUURRTUVVUUVVWVVWWXYZZZZZZZZ\\]\]acccceefghijklmmnnnnnmnnmlkklmmnnnmmlnnnnnnnnnnnnnnnnmmmmnnnnnnnnnnnonnnnnnnooonopqqpoppppppqqstttttvvvwxyz{{~ }}~~}}~~~}zz~ {xxyxwwwuuwwuuuuutttuvvvvvuuuuuuutuxzywtrqsvy{}}~~~}|||zzzzyyyxxyyxwwxyxyzyzzzywvttsttuxwvuuuvwxxxyzz{|}}~ ¡¡¢¡ £¢¡ ¤¤¤£¤¥¤¢£££¤¤¥¥¥¤¤¤¥¥£¡¢¢¢¢¢¢¢£ |zyxxwwuttpponnmlkihhggda_15=987186899889:;989;>?@ACDCDEGHKLQZ`_ZVPPOLJJJJJJJKLMNOKKKJJKNONNOPPPPPMOOOMLMOPQRRRRRRQQQQQQQQRTUVVUUUSRRSSSSRRPQUVTTVVVVVUUVWVVWXYYZZ\\\\\\\]^^_beeddfffghijkllmmmmlkklmmlkklmnnnnnmlmmnnnnnnnnnnnnnnmmmmmnnnoonnnnnonnnoooonnnnooppppqqpppqrttvvutvwuvxz{||| ~}|}~~~}}}~~~~~}|}~~}}}}}}zxz|yyzzyxywvxxwuuvuuutuuvvvvvvvvuvuttwyxusppruxzz}~~~}}||zzzzzzzzyyyxwwxywyyxyzzxtsrrtuwwzwtsttttuuuvwxyyzzz||{{}~ ¡ ¡¡ ¡¡¢¡ ¡¢ ¡¢££¢¡¤¥¤¡¢£¤£££¤¥¥¤¢¤¥¥£ £¥£¥¥¥¤£¢¢£££¢¡ ~}|{xwvuutssqonmlllllihhdh]87:<;73465677678::;<=>@ABBDFHIJJJJPYab\VSPONNMMLLLLLMNOOONNMMMNPPPPOPPPPPRQPPPPPPSSTTTTSSSRRRSSTUTTUUVVVUVUUUUUTTTTUUVVVVVVVVVVVWXYZZZZYXZ\]]\\^_bbbdfgffhhhhhjklnnnnnnmljkmmlklmnnnnnnmlnnnnoooonnmmnnnnoonnnnnnnnnnnnnnnnnnnnnnnoopppppqqqrsttsuutuvwxxzzzz|~~ ~|}~~}}}~~}}}}}}|||}{{{|}}}}~}}{zywv|~}|zyxyxxxxxxxwwvvwwwxxwvwxxxxwwwwxwwvttsstuy{~}}}}}}}{zzzzzzzzzyyxxxxxwxyzzzyssssttvwxvtrpqrssttuuuutvxyyxxyz|} ¡¡ ¡ ¡ ¡¡ ¢¢¡¢¡ ¡¡¡ ¡¢£¢¡¡ ¡ ¡¢£¢¡¤¥¤¢¢££¢¢¢££¤¤¤¤¢£¤¤£¢¢¢¥¥¥¥¤¤¤¤£¢¡¡¡~|{xwuttsrqpnmlkjiikhelidT::::864455788778::;<>@BDEFGIJKLMNPV]b_ZURPPNNNNMMNNMNOOOOONNNOPPPPPOOONNOQQQQQQRRQRRSSTTTSSSSTTTUSTTTTUUUVVVVUUVVVVVVVVVVVVWWWWWWZZZ[ZZYYZ\]]]]_`bbbeghhhiiijklnnnnnnnnnmkmnnmlmnnnnnnnmmpoooopoonmmnnonnooonnnoonnnnnnnnoooooooonooppppppppqstssttuvwxyz{{{|} ~{z|~~}}}~~}}|||{zzz{{zz{||||}}}|{zyx|~}|{zxyyxxxxxxwwwwwwwxwwvwxxxxwwwwwwwwuttttwz}~~}}}}}}{zzzzzzzzzzzzzyyxxyzzzyxsssttuvvxvtqpppqqrsstssrtuwxwvwxyz|} ¡¡¡¡¡¡¡¡ ¡¡ ¡¡¡¡ ¡ ¡ ¡¢¢¢¡£¤£¢¡££¢¢¢¢£££¤¤££¤£¢¢¢£££££££££¢ ¡ ~|zxusqppoonnmkjihggich^YH8<:8667776788889:;<>?BEGIJJKLLNPPU\b`\WURPPPOPPPOPOOOPPPPPPPPPQQQQPPPOMMOPQQRSSSSRRRRSTTTTTTUUUUUTTSSTUVVXWVVVVVWXXWWVVVVWXYYYYYY\[[[[[[[[\]^_`abbbcfhikkkkkklmnnnmmnnnnnmnnnnmnnnnnnnnnnppooooonmmmnooonnnnnooooooooooooooooooopopppqqqqppqrstttuvwxzz{{}~~~}zwwy{~}}}}}}|{{{{zzzz{zz{||||||}}|{zz{~}|{zyzyyxxxxxxxwwwwwxwwwxyyxwwxxwvvwxwvtttwz}~~}}}|||zzzzzzzyzzzzzzzyxyzzzxwvsstttuvvvuspnnooppqqqqppqstvuuuuwxzz| ¡¡¡¡¡¡¡¡ ¡¡ ¡¡¡¡ ¡¡ ¡¢¡¡¡¢¢£¢¡¡¢£¢¡¡¢¢¢£££¤££¢¡¡¢£¢¢¢¢££££ ¡ }|zywtqnnmmlmmlkkihggihnVND=;97689:;89;<<=>>??ACDGJJJJKLMOPRV]a\WUTSQPPPPQPPPPOPPQSSSSSSSRRRSRQPPOOPQQRSSSRQTTSSSSTTUUVVVVVUUUTTUVVWXXXWVVWXWWWXXXYYZZ[[[[[[\\\\\\\\\^_aabbccdeghjlmnmmlllmmmmlmnnnmmnnnnmmnnnnnnnnnoonnoonnmmnnoonnlmmnnnnnnnnoooooppppppppqqqrssrrrrstttuuvxzz{|}}~}~}{xttwz}~}||}}|{z{{zzzzz|{{|}}}|||}~~|{zz~~~}}|zzzzyxxwwwxxwwwwwwwwxyyyxxxxywuuwyxwuttvz|~}}}||||zzzzzzzyzzzzzzzyyzzzxvutsttuuvvvttqonnnopqqqqpppprstttuuwxzz{~ ¡ ¡¡ ¡¡ ¡¡ ¡ ¡¢£¡¡¡£¢¢¢¢¢¢¢¢¡¡¢¢¢¢£££££¢¢¢¢¢¡¢¢¢££££ ¡¡ }|{zxvsnkjiihiiijjihhechrOA??98888:;=;<>?ABCCDDEFHIJJJJKLNPQSU[]XSRSRQQPPPQQPPPPQQSTUVVVUTTSSTSRRQPQSSTTTTSQQUTSSSSTUVVVWWVVVVVUUUVWWWXYXXWWXWWXYYZ[[\\[ZZ[\\\\\\]^_``abbccdeefghiklmnnmllllmnmmmnnnnnnonnnmnmnnnnnnnnnnnooonnnnooonmklmnnnnnnnnnnnoooppppppprqqrstsstttuuuvvxz{||}~ }zxuuvy{}~}|||||{{zzzzzzzz|{{{|}||{|}~~}{zz}~~}}|{zzzyxxwwwxwwwwwwwwxyzzzyyyyyxvuwyyxvttvz|}}}|||||zzzzzzzyzzzzzzzyyzzyvtttsttuvvvurqpnnnoppqqqpoppqqrrstuvwxzz| ¡ ¡¢¡¡¡¡ ¡¡ ¡££¢¡¢££¢¢¢¢¢¡¡¡¡¢¢¢¢¢££££££¢¢¡¡¡¡¡¢¢¢¢¡ ¡¡~|{zzxtqlhgfedeefghhhggif\;9?889::99;<<=>@BCDDHIJJJJJJKLNOPPQRTWYVRQRQRQPPPPPPQRSSSSTUWVVVUUTTTTSSRQRUVVVVVUSSTSSSSTVVWWWWWWVVVVVVVVVWWXYYXWXXYYZZZ[[[\\[Z[\\\]]]^_`abccdeeffffghijklmmmmmmnnnnnnnoooopppoonnnnnnnnnoonnnoppponnnooonmmmnnnnnnnnnnnnoopppppqqqqqqrtttsuuvvvwxxz{}~~{yywxyzz{}}~}|{{||{{zzzzzzzzzzzzz{zzz{|}}}|{{~~~}}}|{zzzyxxwwwwwwvvwwwwxyzzyyzyzyxvuvwxwuttvz{||||||||{zzzzzzzzzz{{zzzzywutsttttuvvuttponnnnopopqpooopqqqqstvwwyz|~ ¡ ¡¡¡ ¢¢¡ ¢¢¢¡¡¡ ¡££¢¡¢£¢¢¢££¡¡¢¡¡¢¢¢¢¢¢¢¢¢££¢¡ ¡ {|{zzzywsniedcbabbbcefggnq^E7>A9:;<<<<<==>>@BDEFJJLMMLJJMNPPQPPQSTUUTSSSSRQQQQPPRSTUUUUVVVUUTUUVVUUTRRSVVVVVVVVVVUTTUVVWXXXWWWWWWWWWWWWWXYYYXWXZ[[[\\\\\\\\\\]\\^^^_`abbddefggggghjkklmnmmmmnnnoponoopppqppponnnnnnnnnoooooppponnnnnoonnnnnnnnnnnnnnnoooppqqqqrrrqqstuttvvwxxyz{|~ zz{z|{zzz{|}}||||||{z{{{zzzzzyyyzzzyzz{|||||}~}}}}|{zzyyxxwwwwwwwwwwxwxyyyyyzzyyxvuuttttstvyz|||||||||zzyzzzzzzzzzzzzzxtsrsttttuutsqpnnnnnnopopqponoprrrstvxyz{~ ¡¡ ¡¢¡¡¢¢¢¢¡ ¢¢¢¡¡¡¡ ¡¢£¢¡£¡¡¡¡¡¡¡¡¢¡¡¡¡¡¡ ~xyzzzzxuqmhcba`^``abceffldJ>D=8><<<=>>??AABCDFHIJKMNNMKJNPQRRPPPQQRUVVUUVTSSRRQQQSUVVVVWVUTTTUVVWVVUTRTVVVVVWXXXXWVVVVWXYYXWWWWWXXYYYXXXYYYXWWY[[\\\\\]]]]]_`_^\^_``abbbdeefghhhghjlmmnnnnnmmnnnponnopppppoonnmmnnnnnnooonoooonnnnnnooonoonnnnnnnnnnooooqqqqrrrrsrrtuwvuwxyzz{|~ ||}{zzz{}}|||}}}||}}|{zzzyyxyyzyyyyz{||}}}}||}|{{zyyxxwwwwwwwwxxxwxxxxxyzzyxwvuttpqqqsuxz{{{||||||{zyyzzzzyyyyyzzzwspprttuuuutqnnnnnnnnnoopqponoqsstuwxyz|~ ¡¡ ¡¡ ¢¡ ¡¢¢¡¡ ¢£¢¢£ ¡¡¡¡¡¡¢¡ ¡¡ }zyz{zyxusnhdb`__]``]^`bgglC?D>@<<<==>>?@AEFGGGHJKONMMOPPOPQRSRQPPRSUVVVUUTUVVVUSQSTVVWWWWXWVVWWWVXWVVVWWWYXY[ZXXZYXVVWYYYXYYXXWWXZYXXXXYZYZ[ZYY[\\\\]]]]_^]^`bbb``abbbcccgghhhijjjklmmmnnonnnnooonnnnnnnnnnnnnnnnnnooooppoonnnnnnnnnnnnnnnnoonnnoppppooopssrrqrttttttuwxxxz{||} ~{zz{|{|}|{zzz{{{{zzxxwxyyzyyxz{||||}~~}}|||}}||{zyxwwwwwwwwwxxyyyyyxxxxvvvuuutqqonnqtwxzz{{{|||}zzzzzy{zzyyywvttrqqqrrtttsqnmmmlllmnnnnnnpqrsstuvxz{~ ¡ ¢¢ ¡¡¡ ¡¡ ¢ ¡¡ |zxzzyxwtrlhec_\\\][Z^__elfD@D@B>???@ABCDDHJLMLMNONOOPPPQQRSTTSRRRTTVVVWVVUVVWWVVUVWXYXXWXYXWWXXWWWVVVWXYYYXXYXWX[[YWWYZZZYYYXWWWWXYZ[[ZYXZ[[[ZZ\\]\]^^\\^_^]]_ababbbcdddeghhhijkkjkmmmnnnonnnnooooooooooonnnnnnnnnnnoooooooooonnnnnnnnnnnnoopooopopppoopqrrrrrrttuttuwyyyyz{{|~{zyz{z{|{zzzzzzzzzyxwwxyyzzyyzz{|}}}|~~}|||}}|{zzyxwwxxwwwwwwwwyxxxxxxxwwvtttspnnnnosvxyzzz{|}}}{zz{{{z{zzzyxvutrqpqrrrsssronmlmlkklmnnoopqrsttwy{|}~ ¡¡ ¡¡ ¢¡ ¡¢ ¡¡¡ ~{zwxywvusqifeb\YYXXWY\]_chV@?BAC>AABCDDEFFIKNOOOOOPPRRQQRTTUUUTTTTVVWWXXXXVWWXXXXXXYZZYXXXYXXXXXXWVVWWXYZ[[YXWWXZ\\ZYYZ[[[ZZZYXWWXYZ[\\[ZYZ[\[[[\^^^_`_]]^b`__`bbbbcdeffgghhijklllklmnnnnoonnnnooooooooooonnnnnnnnnnnnnoooooppponnnnnnnnnnnnooooopoppppqrsqrsssttuvvwxzzzz{|||} |zyyzzzzzzzzzzzzyxwvvwxyyzzzzzz{|~~|zz|~}|||||{zzzyxxxxxvvvvvvvvwwwwwwxxwwvtttrpnoqppruyyzzz{|}}}{zzz{zzzzzyxvtsqpoopqrrrrqpnmmmllllmnnoqqrrstuvz| ¡ ¡¡ ¡ ¡¡ ¢¡ }{ywwwvtsqphcb_ZVVTTW[Y]d`XE=>@CD?BCDDFHIJJKMOPPPPPQRSTSSSTUVVVUUUVYYYYYXXXXXWXXYYZYYYYYYXWXXWWWWWWYYYZZZ[\\ZYXXZ\]\[ZZ[[[[[[\[ZYYZ\\[[[[\\[[\\[\]^^_abb`_`cbbcdeeddefghhhhijkllllllmnnnnopponnnooonnnnnnnnnnnnnnnnnnnnnnoooppqqponooonnnnnnnnnooooqrrrrrttstttttuvwxyz{{|{~|zyyzzzzzyyyzyyxxwvutwxxyyzzz{{|}}|zzx{~{{{{{{zzzzyxxwwwuuttttuuvuuuuvwwwvutttrooqrqqrtwyyzzzzzz{zzzzzzzzzyxvtqopooopqqqqqponmnnmmmmnoprrrsttvxzz~ ¡¡ ¡¡ ¡ }{yvuuutsqonga]ZVTSQRU[ZafWI@?ABDEDEEFHJLNOPQRRSSRSSSSSTUVUTUVVVVVVVYZZZZZZZZYYXYYZ[ZXWX[\ZXYYYYXXXX\\\\\[\\\[ZZZ\\\\[[Z[[ZZ[[\\[[[[\\\\\\\\[[[\\\]^]_bcbbbbcccdeffffghhijjjkkllmlllmnnnnopqqponopponnnnnnnnnnnnnnnnnnnnnoooopqqqponpppooonnnnnnoppprssssstttuvvutuwyzz{|}}} }{zyzzzzzzyxyyxxwwvuttwwxyyyz{{}~~|zyyx|~}zzz{{{{{zzzyxwvutsstttttttttttuvuvutuuspoopppqssvwwxxxxxxxxyzzzzyyxwtqnmpoopqrqqpponmmnnnnnnnnpqttvxy{}~ ¡¢¡ ¡ ¡ ¡ ~{zvssrrrpnkke]YVRQQOSPZ_cbNDDDDCDFHHGHJLOPQRTTTTTTUUUTSTVWWVVVWXWXXXYZZ[\\\\\\[[[[\\\[YZ\^\[[[\[[Z[[]^_^\\\]\\\[\\\\\\\\\[[Z[\\\[[\\\\^__^\\\\\\\]^_]_bccbbcbbbbbdfghhijkllmmmmmmmmmnnnnoopqqpoooppoooooooooooooooooooooopppppqqqqpppppppooonnnopqrrsstttttuuvwvuuvxz{|}~ ~}}{zzz{{{{zzyyyxxwvvuttvwxxxxz{z}}zxxyz~|zyzzzzzz{zzzyxwutrrrrrsstrrrrsttutuuuvusoonnoqrrqtttvwwwwxxxxxxwwwvutqnmloopqrrrqnnnmlmnnnoonnnpqwz{~ ¡¡¢¡ ¡ ¡¡ ¡¡¡ {zxtpnnnnmigfa[VTPOPOSR`b`[JHFEEGFHLJIJLNPRSSTTTTUUVVWVVVVWXYVXZ[[[[\[\\]]]]\]]\\\\]^`^]]^^^]\]]]\\\]]^__]]^_^^]\]^^]]]]]]\\\\\]\\\\\\]_``_]\^]]]^_`a`bcecbbdbccceghiijklmnnnmmmmmmnnnnnoooprponnooooooooooooooooopppppppqqqqqqqrrqqqpppppppponnoqrrrtttttuvwwxyxvvyz}~~~~}|{{|z{|{zzzzxxwvvuttvwxxwxz{z{|{yxxx}}zzyzzzzzzzzzzyxwuurrrqqqqqppppqrtttvvwwvrnnnnoqrqpooqrsststtttttssrrpnlkkkmmnpqrqpnnnnnnnopqrrrstw{~ ¡¡¡ ¡ ¡¡ ¡¡ ~~}zzwtokkkljfcb^YVTNMOOQYibZWJKEEHLJLPJKMOPRTUUVVVVWXXXZZYXVVXYXZ\\]]]]]^___^\\]]\\]^^_bba`^]^^]^^^]\]^\]__^^_aaa_]^`a_____^]]\^__^]]]]____________`abbcdffdbbdceghjkkkjklmnnoonmmmmnopnnnoooqrponnnnnnnnnnnnnnoooppppppqqqqrrrrrrrrrrrooooopppnnnnprrrttuvvwyzxzzyxy{} ~}|||z{||{zzzyxxwvuutvwxwwwyzzzzzyxxx~|zyyzzzzyyzyyyyxwvusrrqppppooooprstuvwxwvrnjjlnoppojkllmmllmnoqrsssnnlihhhjijlnopoooooooopqqrtuvy{~~ ¡¡ ¡ ¡¡¡ ¡ ¡¡ ¡¡¡ ~}~}z{{zwttrjihhhhe^ZVTPMMPPOZbg`VPMJJJJJLNPPRTVUUVWWYXXZZZ[]\\\\ZY]c_``aaaa``aaa`_^^_^^_abddeeddcdefedbbbbaaba`````abbbbbaaabb`_____`abba_`a````aabbbbaabcdffggggfffhhhiijklllmnnooooonnnnnnpppppppprqqqqpppooooooooooppqqqrrrqqqrrsrsttssssrqqpppqqrrstsrstxwvvwy{|z|}}}} ~}}~zzzz{{zzyxwuttuuuuvvvvvwwxyyxxyz~|zwxyzzzyyyyyxwvutttrpqqpoponnnoqrstuwyyvrngggilnnmjihhhhhhfc``bfhhhhhgedeggghjnrsssrqqqqrrvwwwy~ ¡¡ ¡¡ ¡¡¡ ¡ }}}|zxvutppnhhfedca\XTPNMLLPT^cd]UQOMMNNNNOPRSVWWXY[[\\\^^]^aa`aa_]`d`abbbbbbabbbbbbbccbcdfggefffefghhhgfffeddddecbcebbbbbbbbba``abbbabccbbbb```aaabbbbbccdefghhhhhhhiijjklllllmnnnoonnooooopoooopppprrrqqqqqooooooooqqqrrsssrrqqqrrrsstttsttsrrrrrstttuuutuxwwwwxyzz|} zzzzzzzyxxvutttttuuutttuvwwwvwy{~zxxyzzyxxyyyxwvuttsqpqqpopponnoprstuwxwtpn`_^`cfhhhhgggfec`_^_```__bdecb``_bgknqstttttttttvwyz~ ¡¡¡¡ }{||{vrpomljfeca_][WUQNLMKJPZab_WRQPOPPPPNNPSVX\\\]^^aabccbcdcceecabfddeeeeeefgggedccfgghhhiiiijjiijjkkjjjihhhhjkhgghfeeeeeeefdbbbbbbabdedcccbbbbbbccdeeffggghijjjjjkjkklmmmmmmnnnnoonooppqqrpppppppprrrrrrrrqqqqppppqqqrrsssrrrssrrrstttttttsrrrssttuuvwvuwzyyzzzz{{ {zyyzzyxvvuutttttttttttttuuttuz~{xxyyyxxxxxxxwvuttsrqqqqpqqponoprstvxxwtrqgda_`abbfcbbbbb`]\\\\]^_[]accb`_`chlnptvuwzzyyz| ¡¡¡¡ ~{zzzztnkigeebb`]ZWURQOMLKKNV]a_ZTPQQPQRRQPQSUX\_abbbceefgggghffhhgefhhhhhhhggjjjjhhgghiklllmmnooonmmmmmmnnnlkllnnnkjkkkjihhhghhgfeedcceghggggeeddeffggghhhhhhjkklkkllklmnnnmmnnoooooppppqqrrsqqqqqqqqrrrrrrrrsssrrrqqqqqrrssssstttssrrstttttttttstttuvvwwwwyzz{}~~~~ {xvwwwvtttttttsstttssttttsrsu{{xyyxxwwxxxxxwvvutttssttssrrppprtustvwvtttmiea_^^^\YVSSTTSVVWWXZ\_abcdeefgkmoqqtwzz|~ ¡ ¡¡ ¡¡¡ |ywwvupieb_]^]\\YVSPNMLLKJOV]`a]XTSTTTVVVVWY[\]`cffefhijkjjjjkjjkkjijlkkkjjiiijkllllmnnnopppppqrrrqooooopqrqpoonopqonmnnnmlkjjhhiijihhhhjjjjjjhgggghhihhhhhhiilmmmlllmmnnooonnopqppppqqrrrrsssrrrrrrrrrrrrrrrrssssssrrssstttttrsttttsrrsttttttvvuuuuvvyyyyyyz}{|~ ~zvutttssttttttttttsrrsrrrrsw|~zxyxxxxxxxxxxxwwvvvuutuvvuttsstuwyyz{|{{{||zywvwxxzwtsrrpoiknnoprtutsrrsuvxxxyz|~ ¡¡¡ ~|yuttqnieb]XWYXVVUROLKLJLLMU_cb_\WVUVVVZZ[\^abbdfhjiikmnoonnnooonnmmlmmmllllmnnnnoooppqtssstsrqqrssssssrrsttttstqprsrpnpooonnnnmmmmmlkijjkkkkllihhhhijkjiihiijknnnnmmnnoppqrrrqqrrrqpqrssssssssrrrrrrrrrrrrrrrrrrstttssttttttttrstttttsttuuuuuvwwvvuvvvzzzzzz|}~ }yutsrrstttttttttsqpoppqqtvz~}|zwyxxxyyxxxxxyxxxxwwwwwyyxxwwwyz{}zz|||||| }{z|~|zzzz{ ¡ ¡¡¡¡ {xtstqke`_^YTTUQQQQOLKLNOOPT\deb][XXWWX[]_abcefgklnonmossttrqrssrqqpooooppoopqrsstttssttvutuvwvttuvvvvwwwvvwwwvvvtttttssssrrqqpprqonnnmlmllkkllmkjjjjklmllmmmmnnnooonnopqqrrssttrssrqpqsssstttttssssrrrrsssrrrrrrstttttttttttttttttuuuuuvwxxxxxyyxxxxxyy}|||{{~ }xtrqrrrrrrrqqrqponnnqrtw{|zzzxxxxyzzyxyyyyzyyyzzzyz{{z||||~ ¡¢¡¡ ~}xurrsph_XZ[VPPPLOPPNKKOQURT[bfec_\[[ZZ\_acfgghhjpprrporvuvusrttttttttttttttttttuttuvvvxxxvuwz|{zzzzzzzz{|{{z{zzyywvvutuvvuuttsrrsqonooppponnnnnnmlkklmnnnnopqqppopppppqrqqrrstttrssrqpqsssstttttttttsssstssssrrrsttuvvvvvvvvvuuuuvvwwwxxxyzzzzzz{{{{{|}}~~ zurppppoonnnnnnnnnnnstv{~zyzzyxxxzzzzyyyzzzzzz{|{{|~~} ¡¢¢¡ ~~~}|zvsnnnje_VSPPPNLKKMKJNPPQUX_fihb^]\\\\]`bgikmnrttwwvvuvvvzzzyxwwwxxyzzzzzxwvvxyyxyzzzzzz{zz{|}}|}~~~~}}}}}~}zxz~{zyyxvuvvtsrsttsttssrrrrtsrqrrqppqrssttttsrrrstttsstuvvuttttsrstuuvvvvvvuuuuuuvvuvwwwvvuuuvwxxyyxxwvvwyzyzzzzzzzzz{|~~~}~~~~ xtstsqponmlmmmnooonsv{~|zyyyyxyyyyyyyzzzzzz{{|} ¡ ¡¡¡¡ ¡¢¡ ¡¡¡ ¡ ¡ ¡¡¡ }{zzzzwtolihhd_ZTPNNNMLLNOMMPPPSTYagihb^^^_abbdfilnprtvwyyyxxxyy|||{zzzzyyyzzzzzzzzzzzz{||}}||}}}}}~~|z||zzzzxxyywvuvvvuuuttssrqtsrsssrqrssttttuvuttttuuuuttuuttttuvuttvwwwwwwwwuvvvvvvvvwwxxxwwxxyyyxxxxxxwwwyzzzzzzzzz|||}~~ ~zwvvuttttrqppqtvyzz|~|zzyyzyyyyyyyyzzzzzz{{||| ¡¡¡¡ ¡ ¡¡¡ ¡ ¡ ~{zwuvxvrmhfecb]XUPMKKLLMOPRPPRSTVV\ejjgb`^_begghinruvwyzz{{{{{{{{~}}|{{|}{{zzzzz{{|}|{{|}~ ~~}|||{zz{zzzyyyyyxwwvuttttttttttsttttttuvxwuuuvvvwwvvvvvuvvwyxwwxxxxxwwwwvwwxxxwwxxxxyyyyzzzzzzyyzzzzyzz{~}||||}}~~}~ |{{~~~zzz{~}|zyyyzzzyyyyyyzzz{{{{||}}| ¡¡¡¡ ¡¡ ~zxwutttrlgbbba]YUQNLJJKLOPRTSSVVW\\bjmjfbaabehklmntx{}}~~}~~~~~}}}~}}}}~~~~~ ~~}|{{|{{{zzzzzyxxxxwwwuuuvvuutuuvuuvwyxwvuvvvvwwwxxyyyxwyzzxyzxxxxxxxwxxyzzzyxzyyzzz{{zzz{{|||||}}||}~~~~ ~~~|zzxxyyzzzyzzyyzzzz{{{||}~~~ ¡¡ ¡ ¡¡ ¡ |{{zwutsrqokfb^__\YUQPNLKKKLOQTVVVWX[bdhnnjebbbdhloqtvz} ~}}~|}||{zzzzzzzzzzywxxxwvvuvwwwwxzzxwvvwwwwxxxyyzzzzyyzzyz{yyyyzzzzzzz{{{zzzzzz|}}}z{{|}~~~~ ~~~}|{zzxyyzzyyyzzzzzzzz{{||}~~ ¡ ¡¡ }zxxvtsqponkgb^YYYWTPOOOONONOPSVWXY[[_gkmnmieddefinruz} ~}}|||}||{zzzzyzzyxwwwxxyyyzzzyyxxxyyyyzzzyyyyzzzzzzz|z{{{{|||||}}}}}||||}~~}}}~~ }}~|{zzzzyyzzzyyyzzzzzz{{|||}}~ ¡¡ ~~~|zvttspnnljihd_[VVVTRPPQRRSTSRTVZ\\]^^clppnlihhiklnsvz~ ~~~~}}||{{zzzzyxxyzyzzzzzzzzyyyzzzzz{{zzyyy{{{|{z{|}}}}}}}}~~~~~~~~ }||{|}}||}~~~}}|{{{zzyyxxyzzzzyzzzzzzzz{{||}}~ ¡¡ ¡ {}{zywtrponkhjhdccb\WVVVTSSTUUVWXWVWZ^`abbbgptrnlkkmnttvy{~ }}}}||||zzzyxyzzzz{|{zzyzyyyzzzz{||{zzzz{{|~}{{|~~~}}}}} |{}z{{{z{|}|{zzz{{{zzzzzzzyzzzzzzz{zzzzz{{|}}}~ ¡¡¡¡¡ ¡~|z~}||{zxvuqonlkiefdb`]ZWXTVWXWWYZ\[\^\Z[]bbcdgkrvxtnnostsxy| |{{zzzzzzzz{{{{{{{z|||}}~~~}}~}|||}}~~ ~}|zzzzzzzz||{zzyyzyxxyzzzzzzzzzzzzzzzzzz{|}|| ¡¡¡ ¡ ¡ ~}{zy|||zyvttpmkihgfb_\[[ZWVUVWYZZ[\]^_ab`_acachlnprsutrqstvw|~ ~}|||}}}}}}~~~~~~~~~ }}zzzzzzzzzzzyyyyyyxxyzzzzzyyyyyyyzzzzzz{||{| ¡}|zzxxwwxyyvspoomhgfccc`][Z[\ZXVVWZ[\\^`_aba_acelov{~}{wxyyxyz} ~ ~}zzzzzzyyyyyyyyyyyyxyzzzyxxwwwwwwxxxxyzz{zz{ zywttttuttspnlkjifdb```]ZXWXYYXXY[\]_`bbcffegknnprvz}~}|~~ ~}{zzzzzzzzzzzzzzzyyyyyyyyywwwwwwwwxxxxxyyzyyz} ~|ywtrpqsttpmjihgeea`_\\\YYXYYYZ\^_`abcdfgfhhiovzz}} ~}{zyyyyzzzz{{{{{zzzyyyyyyyyxxxwwxxxxxxxwwxxxxz} }|zxutqnnnpqplhfedb_a^]][Z[XYZ\]]^beccdefhhiiijnsy|| ~}{zyxxxyzzzzzzzzzzyyyyzyxxxyyyxxxyyyyyxxxwwwxxz} ~{zwtqonlkkkkkgecbb`][^\\]\\\YZ[\_`acefffghijkpqswz| }{zyxwxxxyyzzzzzzyyyzyzzyxxxxyyyyyyzzyyyxxxxxzz{~ }zxuqmjihghhhge]^___\[Y\Z\]\\\Z``bfhhhhhhhiklnnpqv{}~ ~|{zyywwxxxxyyzyyyyzzzyzzyxwxxyyyyyyzzxyyyyyyx{{} xvtttoiddcbbbcbb]^\[\][WY[\^___`effgikjglmnnnptvwz~ ~|zxwwwwwwxxxxyyyyyyyyyyyyyyyyzzzz{{{z{zzyyyzz||}}~}}|zzyyxtqnnlhea`_____^\\[[\^]\^_bbcddehhijmnnknpqrsuz||~}{zxwvvvvwwxxxyyyyyyyyyyyyyzzzzzzzz{zzzzyxxyyzzz} ~}}}|zzzzywvtttqlihgec^]\\\\\\[YY[]_`abcfghhhijlnnoqqpsstuwz~ ~|zzxwvuuvvwxxxzyyyyyyyyyzzzzzzzzzzzzzzzzyxxyyzxz ~}{zyxwwwwvutsqnligeca^\\[[[[\\\Z[_abcfghijkkllnoqrsttuwxxyz~ ~|{zywvtuuvwxxxzzyyyyyyyyyyzzzzzzzzzzzzzzyyyyzzz} {zzywutttutsrqonhgecb_\[[[[Z[\\]_^aegfhjlmnnooopqrtuvvxz|}}~ }{zywutuuvwxxyzzzyyyyyyyyyyyyzzzzzzzzzzzyyyyzz{}|zyxwvuttstspnnlidba^\\\\[[[[\\_`bcehhhiknopqqrrsstuwxyz} |zzxvtuuvwwxyyzzzzyyyyyyyyyyyyzzzzzzzzzzyyyzzz| ~~}|{{|{zyvutsrqpnnpnkiihea`^\\\\]]]]^^`bdehiiijklnoqrsttuwwxz|} ~|zzywuvvwwxyyzzzzzzyyyyyyyyyzzzzzzz{zzzzzzzzz{~~~{zzz{zyyzyxvpnlkjihfijifdedb^^^]]]^_aabbbcehilnlkmnnnprstuvw|{| |{zzxwvwwxxyzzzzzzzzyyyyyzzzzzzzzz{{{z|{{{|||| ~~}|zyxwvtttuuspnkhgfdcdddcbbba_]\\^_acgcccdegijoponnqrqsttuuwz|}|{zxyyyzzzzyzzzzzzzzzzzzzzzzzz{{zz|~~zzzywutsqonoppnljheedcccbba_`a`_^`a`adgghhijkmnnppooqtttuwyzz{~ }{{zzzzzzzzzzzzzzzz{{{{|||zz{}~~ xwvutrponmllmmkhecbbbaaa__^]^``_^bcbbhihjkmnoooorrrstwyx{|~ ~}}~~zzzzzzzz{{||}}}|}} ttsrpnlklkjjjjhfba__^\\\\]^^_aa`adffgjlkmnopqqqqtuvwxz{| ~}}}}~~~~}}|{|}}~~~} nnnljhgfgfedddba_^]]\[[\\^abbddbeehkmmnqqrsttuuvxz{{zz}jjihgecb``____^\\\\\\\\^_bdefhhghfhnonotttttuwyy{}~~ggfecb`_\\\]]^]]\\\]^_acbeghhjkkkjloppqtuuvwyz{| cbbb`^]\[[\\]^_^^^^_`acfeghhhkmnnpqqrtuuzz{} ba_^]\[ZZ[\\^bbb`bdeefghklmnnnnnoruxxvwy|}^]\\]]]]\^^_acdcdeghijkknoppqqqqrsuyzzz{ ]\\\\]^^abbbdfgfhhikmnnnopqrssttvuwz} ]\\\]^``cddfhhihjjkmnppooprttuxyzz{~ [\\]_bceeefhjkkknnnorsssstvwwy{}~ ¢¤£¡}{xsmhcbfghjlmoqt| \^_abcfggghkmnnnppqrtuuvxyzzz{~ }wqhb]VSOJFCA@BBDEDBAAGLU]fnv{abdeghhjkjknppqrsttuvxyz{}~~~ ¡¡~tkd[TKA5.++-/1468346899:;:88>DGKO]grwzacfhkmnpnmnqssstvxyzz{}~~ vfTH;2*(+./0346874103223568;821784/,+-5DT`hnz iijlnpqqportvvvx{{|~ th^PD@?8878<;8566567752434676784358;;;;=:635;BHWbnwnopppqststvxyxz}}}~¢}o^RC4)'-01224554321012111111221131112456889:851115:CO_rtuvvttvxwyz{{{ ¡uiYB8::50362011/-++,+((++**,---./...+,/2344627:;8788879AFKU^o~vwxyyyz}|}~~} mN=86/373/00+//.+'%%%)))('&&&)))+++**,,./.++,1466558;31155127D[ir|zyz{}~ m\M:026:752-,+)*)'%$#"#!%&%%'&$&&()++++''')*+.1.012223354468;=>88ESao~~|| }\MA968813.-/,*)'%$#"! #%&%#! $&&%&&')(&&&+,.012345667:>><<:<18Q^h| ~xtnligeefggdbade^UE30991114.+*&&'&$$$"! "! $%%%')**))+,,/137987968=<:=DVey ¢|tqpkc\XUOIBA?>>>ABDA><;<>?(*14100*,++,**)%$%%%#! $"+=IJOVVVSOKHC>2,% &***+,,-.014687><>;4;:8DUfvjojnjmjljkkkkkkkjljkjkjjjjjjjjjkjijijikikikikikililikikikjkjjjjjljljljkjkjkjkjkjkkkkkljljljljkjkkjkjkjkjkjkkkkkkjijijjjjjjjkjkjkjljlklkllklkkkkkjkjkjkjkikikikikililjkjkkkklkmkmkmjljkijijjjjkkkiljkjkjjkjkjljlklllkljlilikikikikikijijiiijijijikikikikikjkjkjkjlhlhkhkhkhkijijikjjjjjijijikikjkjjjjkjkjkjkjjijijkjkjkijijjjkjkjjijijhjhjhjhihihjhjhjhjijijijijijhjhjijjjkikikikjkjkjjjjjjjijijihjhjhkhkhkhkhjhjijiiiiiiihihjhjgjgjgjgjgjgjhjhihiiiiiihihhhhhhhhigigigigigigigigigigigihihihihihjgjgjgigigighghghghghghghghghghghghghghghghghghgigigifieieiehfhfgfggggggggggggghgfhfhfififhfhfgfjgigigigighghghgghghghgighghhghgigihihihigjgjgjfifififighghghghggfgfgfgfgfgfgfgfhfifjfjfjfjfjfifigighghggghghghgigigighghghfhfhfhghghghgigigigigififhfhfhfhfhfhfigigigigigigigigigighghhhhhhghghhghghgggggggfgfggigighghghghghghgghhhhhihihihhihhghghghghggggggghhhhhhhhhhhhihihghghghghhhhihihiihihihigigihhhhiiiiihihihihihihihihihihihihihihihjhjhjhkhkijjjjijjjjjiiiiihjhkhkglgkhkhkhkhkikijijijijijijijijijikikhkgkgkgkhkhkhjhjhjiiiiihihihiiiiiiijijikikjkkjjjjjijiijijikijijjjjjjjkjkjljljkikikijijjjjikiljljljljkjjjijhjikikikjkjjkjljljkkkkkkjljlimimhmikikijijijikikilililjljkjkkjkjkjmklklkkljlimhmhmjnjnjmjljkjkjkjkjkjkjkjljlimimimjkjkikikikjkjkkkjkjkijhjgjgjgkgkgkhkhjhjhjijikikglglhkhkhkhlhmhmgmgmglhkhkikjlklinjmjljkjjjjjjkjjkjkjjjjjjjjjjjkjjjjjjjjjjkjkjkjkjkjkjkjkikikikiljljljkjkjkjkjkjkkkkkljljljljkjkjjjjjjjjjjjjjjjjjjjjjjjjjjjkjkjkjkjkkklklklkkkkkjkjkjkjkikikikikilikjkjkjkkkklkmkmjmjlikikjkjkkkjljkjkjjkjkjkjkklklkljlikikikjkjkjkjjjjjijjjjjjjjjjjjjjjjijijijikhkhkhkikikikikikjjjjjikikikikjkjjjjkjkjkjkjjjjjjkjkikijijjjkjkjjjjjjijijijiiiiiiiiiiiiiiiiiiiiiiiijijikikilhkhkjjjjjjjjjijijhjhiiiiijikikijijijiiiiiiihihihjgjgjgjgjgjgjgihihihiiiiiiihihihhhhhigigigigigigigigigigigigihihihihjgjgjgigigighghghghghghghghghghghghghghghghghghgigigififieifhfhfgggggggggggggggghfhfififififhfhfigigigigighghghgggghghghghghhghgigigihihigigifjfifififhghghghghggggfgfgfgfgfgfgfhfififjfjfjfjfififighggfgggghghghghghghfhghghghghghghghghgigigighghghghghghggggghghghghghghghghghghghghhhhhhhhhhhhhhhhghghghghghghghghghghghgggggghhhhhihihhhhighghghghghggggggggggghghghghghghgghghhhhihihihihihihihhhhhhhhhhhihihihihihihigigihihihihihihihihihihigjgjhjijijjijjjjjiiiiiijijhkhlhkhkhkhkhkhkhjhjhjhjijijijijijikikhkhjhjhjhjijijijijijiiiiiiiiiiiiiiijijjjjkjkjiiiiiiiijijijjjjjjjjjjjjkjkjkjkjkikikijijijjjjjljljljljkjjjijhjikjkjkkkkkkjkjkjkkkkjljlilimhmhmilikikijijikikiljljljkjkjkkjkjkjlkkkkkkkjkilililjmjmjljkjkjkjkjkjkjkjljlilimimimililililililjlklkkjkijhjhjgjhkhkhjhjhjhjhjhjhjhjhkhkhkhkhkikikilhkgkgkgjhjijjjjkhmhmilikjjjjjjjjijijijiiijijikikjjjjjjjjjjjjjjjjkjkjkjkjkikikikiljljljkjkjkjkjkjkkkkkljljljljkjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjkjljlklklkkkkkjkjkjkjkikikikikikikijjjjkjkjlklkmjmjmimiljljkkkjljkjkkjkjkjkjkkkkkjkjkikikjkjkjkjkjjjjjijjjjjjjjjjjjjjjjijijijikikikikikikikikjkjjjjjijijijijjjikjkjkkjkjjjjjijikikhkijijjjkjkjjjjkjjjjjjjjijijiiiiiiiiiiiiiiiiijijikikikikhjhjijiiiiiiihihihigigihiiijijijijijiiiiihihihigjgjgjgjgjgigigihihihjhjhjhjhjhihigigigigigigigigigigigigigigigigihihjgjgjgigigighghghghghghghghghghghghghghghghghghgigigififififhghggggggggggggggggghfhfififififhfhfhfhfhfhfhfhfhfhfggggghghghgghghgjgigigigigigifiehfhfhfhghghggggggggggggggggfgfgfhfhfifjfjfjfifififhfhfgggfgggghghggghgggggghghghgggghghghghghghghghghghgggghghghhghghghghghghghghghghghhhhhhhhhhhhhhghghghghghghghghghghggggggggghhhhhhhhhhghgighfhghghghgggghghgggggggghghghghghihihihihihigigjgjgjgighhhhhhhhhhihihihigigigigihihihihhhhhhhhhhhhhigigjgjhjhjiiijiiiiiiiiiiijijhlhkhkhkhkhkhkhjgigihihihiiiiijiikikhjhjhjijijjijjjjjjijijijijijiiiiiijijijjjjjjjiiiiiiiijijijijjjjjjjjkjkjkjkjkjjijijhjhjijijjjljljljljkjjjijhjjjkjkjlklkkkjkjkklkljljlimhmhmhmimililikikikikikjkjkjkjkjkjkjkjkkjjjjjjjjjjkjkjkjljkjkkkkkkkklkljljljlilimhmhmhnhmhmhmhmimimjmkmkkjkjjijhjhjhkhkhjhjhkhjgjgkgjgjhjhkhkikikijijijhjgjgjgjgjhjijijgnhnhlhkikjjjjjjijijiiiiiiijikikijijjjjjjjjjjjjjjkjjkjkjkikililhljljljkjkjkjkjkjkkkkkljljljljkjkjkjkjkjjjjjjjjjjjjjjjjjjjjjjjjjjljljljmjlklkkkkkjljljljlililililhkikijijjjjkjljlkmjmjmininjmjlkkklkkkkkjkjkjjjjkjjjjjjkikikjkjlkkjkjjjjjijjjjjjjjkjkjjjjjijijijhjijikikikikjljljkhjhjhiiiiiiiijiikjkjkjkjkjjjjijhkhkhkhjijjjkjkjjkjkjkjkjkjkijijjijijijijijhjhjhjjjjjjijjjijiiiiiiiiihihihigigigigigihiiijijijijiiihihihigigjgjgjgigigigigihihihkhjhjhjhjhjgjgjgigigigigigigigigjgjgjgjgjgjgjgjgjgjgjgigigighghghghghghghghghghgififififififigigigigifififighghgghgggggggggggggfhfififjfjfififhfgfgfhfhfhfhfhfifggggggghgggghghgjgjgjgigigififiehfhfhfhghgggggggggghghgggggggfgfhfhfififififififhfhfgfgfgggggggfggggggggggfhfhfhgggggggghghghghghhhhghghghghghghhhhhhhhghghghghggggghghhhhhhihihghghghghghghghghghghghgggggghghgghhhhhhhhhhghfifhghghfhghgghghghghghghghghghhhhhhihihihigigjgjgjfkfjfighghhhhhhhhhhhhhghghghghghhihihihhhhhghghghghhgigigjgjhjhjiiiiihihihiiijijilikhkhkhkhkhkhjgigigihihiiiiijiikikhjhjhjiijijijjjjjjjjijijijijiiiijijijijijijijhjijiiiijjjjjkkjkjkjkjkjkjkjkjkjjijijhjhjhjhjijlilililikijiiihijjkjljmjlkkkjkikkljljlimimhnhngnhnhmhlhkhkhkhkhkjkjkjkjkjkjkjkjkjjjjjjjjjjjjjjjjkkkkkkkkkkkkklkmjljljlimhmhmhngnhmhmgmhmhmimjmkmkkkkjjijhjhjhkhkhkhkhlglglglgkgkhjhjikikikijiiiihjgjgkglglhlhkikhnhmimimimilililhjhjhjhihiijijijikikjjjjjjjjjjjjjjjjjjkikikhkhkhkkkkkkkkkkkkkkkkklklkmjmjmjmjmjljkjkjljljljkijijililililjljljljlmkmklklklklkkjkjkjkjjjjkjkikikikhjijijijjjjjjkkkjljljmjmjmjlklkkkkkkkkkkkjjjjjjjjkjjjijijikikikjkikijjijijikjkjkjkjkjjjjjijiiiiiihiijijjjjjijijhihihihihihihihihjkjkjkjjjjkjkjkjijijiiiiiiiiijijilikikikikijijijiiiiiiiiiiiiihihjijijijhihigihigihihigigigigihihihihihihihihihihihihihigigigigifigigigigigihihihihihihjhjhkgkgkgjgjgjgjgjgigigighghgigigigigigigigigighghghghghgifififififhfhfhfhfhfhfhfhfhfhghghghgifififighghghhhghghghggfggggifififjfififhfhfgfgfgfgfgfgfgfhfgggggggghghghgigigififififififiehfhfhfhfhfhfhfhfghghghghgggggfgfgfhghfhfhfhfhgifhfhfhfhfggggggggggggfgggggghghfhggggggggghhhhhhhgigigjgjgighghgghhhhghggggggggggggggggggghghhhhhhhhhhhhhhhhhhhhhhjhihhhghgigigighhihihihighghghfifighghghgghghghghghghgigigigigjhihihigjgjgjgjgjfigigigigihihhhhhhhhhhhhhhhghghgjhihihihihigigigihiihihigjgjgjgkhihiihjhjhjhiiiiikikikijijijijijhjhjhjiiiiihjhjhjijiiihihihihihijjjjjjjjijijijijhjhjijijjjjjkjkjiiiijijikikikikihkhkhkhkhkhkhkhlhjhjhjhjhjhjijijkjkjkjjjjjjjijijkkkkkkkkkkkklklkkljljljmjmimininimimimhlikikjjjjljljkkkkjkjljljlilikjjjjjijijijjjkjkjkililimhmhmimimimimhmhmhmhmhmgmgmgmhmimiljljljlilhlhlglglglgmgmhmgmglgkgkgkikikjkjkkjkjkilhjjikhlgmgnfngmgmhmhmhmilililililhjhjhiiiiiiiijijijijjjjijijijijjjjjjjjjjjijijijijkjkjkjkjkjkjkjkklkmkmjnjmjmjljljkjkjkjkjkjkjjjjilililjljljljljlmlmlmkmkmklklklkkjkjjjjkjkikikikhkikikikjkjkjkkkjljljljljkkkkkkkkkkkkkkkjkjjjjjjjkjjjjjijijikjkjkjjjjjijikikjkjkjjjjjjjjjijijijhjhiiiijjjjjijijhiiiiiiiiiiiiiiiijjjjjjjjjjkjkjkjjjjjjijijijjjjjjhlhlhkikijijijiiiiiiiiiiiiihihihjijijhjhjhigigigigigigigihihihihiiiiihihihihihihihihihigigigigigigigigigigihihihihihihjhjgjgjgkgjgjgjgigigigigighghghgigigigigigigigighghghghghgifififififhfhfhfhfhfhfhfhfgfgggghghghgigigighghghghghfhghggfgfgfififififififhfgfgfgfgfgfgfgfgfgfgggggggghghghgigigififififififiehfhfhfhfhfhfhfhfghgggggggggggggggghfhfhehehfhfigififhfhfhfggggggggggggggfgghghghggghghghghhhhhhihihihihihihhhghghghfgfgggfgfgfgfggggggggggghghghhhhhhhhhhhhhhhhhiiiiihigigigigighhhhihihighghgggggggghgghhhhhhhhhhhhghgigigigigihihihihigigjgjgjgigihigihihhhhhhhhhhhhhhhhhghghgihihihihhhhhhhhhiihihihihjhjgjgjhihiihjhjhjhiiiiikikijijijijijijijiiiijijhjhjhjhjijiiihihihihihiijijijijhjhjhjhjhjhjijijjjjjkjkjijijjjjjjjkjkjkjhjhjhjhkhkhkhkhkhjhjhjijijijjjjjkjkjkjjjjjjjijijjkjkkkjkkkkkkkkkkkkkkkjkjlililimililhkhkijijjjkjkjkkkkkkjljljlimililjkjjjjjjjjjjjkjkjliliminhnhnimimimhmhmhmhmhmhmgmgmgmglhlililhlhlhlglglglflflgnfngmgmglglhkhkikikjkkklkmjminijjjjikhlhmgmglglhlhlhlhlhkikikikijijijiiiiijijjjijijjjjijijijijjjjjjjjjjjjjjjjjjjjjkjkjkjkjljljlkmkmknknkmkmklkkkjkjkjjjjjjjjkjkjljljljljljljljllllllllllklklklkkjkjjjjkjkikikikhkikikikjkjkjkkkjkjkjkkjkjkjkjkjkjkjkjjkjkikikikikikijjjjijjkjkjjkjjikikikikikjkjjjjjjjijijhjhjhjhiiiihjijiijikhiiiiiiiiiiiiiiiijjjjjjjjjjkikikijjjjjijijjjjjkjkhlhlikijijjijijhjijijijhjhjhjhjhkhjhjhjhjgjgjgjgigigihihihihihihijiiiiiiihihihihhhihihigigjgjgjgjgjgigigighhhhhhhhhhigigjgjgjgjgigigigighghghghghghghghghgigigigigigighghghghghgifififififhfhfhfhfhfhfhfhfgfgggggggghghgigighghghfhghghfhfgfgfgfhfhfifififhfhfgfgfgfgfgfgfgfgfgfgggggggghghghgigigififififififiehfhfhfhfhfhfhfhfgfgggggfgfgfgfgfgfhfhehehehehfifjfjfififhfgfgfgfggggggggggghfhghggggggghghhhhhhhhghhhhhhhghghfhfhfhfgfgfgfgfgfgfgfgggfggggggghghhhhhhhhhhhhhhhhhjhjgjgjgjfifigighhhhhhihhhhhghghghghghghghhhhhhhhhhhhhhhghghghghhhhhhhhhhihihihihihihihhhhhhhhhhhhhhhhhhhhhghghghhhhhhhhhhgigihihihihihihjhjhjhjhihiihjhjhjhiiiihjhjhjhihiiiiiiiiiiijhjhjhjhjhjhjiiiiihigigihihihihihihiiiiiiiiihjhjijijjjjkkkkkijijjjjjjjjjjjjjhjhjhjhjhjhkhkhkhjhjijijjjjjkjkjkjkjkjjkjkjkikikjkjkjkjkjkjkjkjkjkjkjkjkilililililhkhkhkikjjkjkjkkkkkljljmjmimimimiljljkjjjjjkjkjmjmjmimimilhmhmhmhmhmhmhmhmhmhmhmgmglglglglhlilglglglglgmfmfmfmfnfnfmgmgmhlhlhljkjkjkkllkljmjmjkjjjjjjkikhkgkgkglglhkhkhkhkhkhkikikikijijikjkjkikikjkjjjjjjjjjkjjjjjjjjjjijijijjjjjjkjkjljljljljmkmkmkmkmkllllkkjkjkjkikjjjjkjljmjmjmjmjmkmkmkmjljlklklklkllklkkjkjjjjkjkikikikhjijijijjjjjjjkjkkkjkjkikikikjljkjkjkjjjikikhkhkhkhkhjijjjjjkjkjjkjkikhkhkhkikikijijjijijhjhjhjhjhiihihjhjiijikhiiiiiiiiiiiiiiiijjjjjjjjjikikikijjjjjijijjjkjljlililjkjjjikikhkhjhjhjhjhjhjhjhjhkgkgkgjgjgjgjgjgjhjhjhjhjhjhjijiijijijiiiiihihihhhhhhhigigjgjgjgjgjgigigighhhhhhhghghgihigjgjgjghghghghghghggggghghfhghghghfhfhfigigighghghghghgifififififhfhfhfhfhfhfhfhfgfgggggggggghhhghghghghghghghfhfgfgfgfhfhfhfifhfhfgfgfgggggggggggggggggggggggghghghgighghfhfhfhfhfhfhehehehehehehehehegfgfgfgfgfgfgfgfgfhfhehehehehfifjejejfifhfhfgfgfhgggggggggghghghgggggggfgghghghghfhghghghghfhfhehfhfgfgfgggggggggfgfgggggggggggghghghghghghghghgkgkgkfjfjfjgigigghhhhhhhhhhhghghhhghghghghghfhfhhihhhhhhhhghgggghhhhhhhhhhihihihhhhhhhhhhhhhhhhhhhhhhhhhhhhghghghhhhhhghgigigigihjhjhjhjiiiiiiiihihiihjhjhjhiiiigigigihihiihihihihihihihihihihihjiiihigigigigihiiiiiiiiijijijijihihiijijjjjkkkkkjjjjijijijijijijhjhjhjhjhjhjhkhkhjijijjjjjkjkjljkjkjkjjkjkjlililikikikikikjkjkjkikikikhlhlgmgmgmhlhlhlhliljkkkkkklkljljmjmimininimimjljkjkjkjkjkjnjnjmilikikhjhjglgmgmgmhmhmhnhnhlhlglglglglglhkglglglgmgmgmgngnfnfngngmgmhmhmimjkjkjljljljkjjjjkjkjkjjjjjijgjgjgngmglhjhjhjhlhmikikikikhkhkhkhkikikikijijijhjhkikikikikikilililjjjjjkjkjljlililimjljlkkkkkjkjkjliljkjkkkkjljljmjmjljkjkjkjkjkjlhkhkikjkjkkkkklkkkjkjkijijjjjikikjkikikikikikjkkkkkjkjkjkikikilhjjjjjjjjjjikikikhkikikikikikjkjkikikikikikijijijjijijijijiiiiiiijiiihihihihiiijiiiiiijijijijjjjjkjjjjjjjjijiiiiijjjjkjkjkjkjjjjjjkjjjjkjkjkjlilililikikhkhkhkhkhihjhjhjhjhjhjhjhjijijijijjjjjjjjijijhjhihihhhhhghhhhhhihihjgjgjgjgjgigigighghghghhhhhhhhhgigigiggggggggggggggggghghghghfhfhfhfhfjgjgjgigigigigighfhfhfhfhfhfhfhfhfhfhfhfhfhggggghhhhhhghgggggggghghghghfhfhfhfhfhfhfhfhfgfgfgfgfggggfggfgfgfhfhfhghghghghghghghggggggggfgfhfheheiehegehegfhfgfhfgfgfgfgfgfgfgfgfgegegfhfhfhfhfhfififhfhfhfhfhfhfhghghhghghghggghgfgfgggfhfhfieieieifjfjfjfifhfhfgggggggggggggggghggggggggggggghghghghghghghghghgigigjgjgjgighghggghgggghghghhhhhhhgigigifjfjfjfjgigigighghghgggghhhhhhihihihihihiiiiiiiihihihigihhhhhhhhhhhhhhhhhhhhhhghghgigifihhhhhhhhhhhhhhhhhihihihihihihihighghghhhhhhhhhhhhhhhhhhhhhhihihihihihihihihihihiiiiiiiiiihihihihhjijjjkjkjljljkjkkjkjkikikikikikijijijijikikikikhkhkikikjjjjjjjjkkkkkkjkjkikikikhihihjijikilililhlhlhlhlglgmgngnhmhmhmhmhmilililkmkmjmjmjmjmjmimjljljljljljljmjmjnjnjnjmilikijijgjhkhlimimhmhmgmilhlhlhlhmhmgmhlhkhkhlglgmgmgmgnfngmgmhmhmimimjljjjjjjjjijikikikjjjjjjjjijhigigigngmgkhjhjhjilililililhlhlhlhlhlijijijijijhjhjhjikikikikililililjjjjjkjkjljlililjljlkkkkkkkjkjjikikjkjkkjkjljlimjlilikikijikikikikikikjkjkkkkkkkjkjkjkijijjjjijikjkjkikijijjjjjkjkjjjjkjkikikikhjjjjjjjjjjjjjjjjijijijijijijjjjjjkjkjkjjjjjjjjjjjijijijiiiijijijiiiiiiiiiiiiiiiiijijiiiiiiiijijijijijijijjjjijijjjjjkjkjkjkjjjjjijjjjjjjjjjikikikikikikhkhkhjhjhiiiiiijijijhjhjhjijijijijjijijijhjhjhjhihhihigigihihihihjgjgjgjgjgjgigigighghghghhhhhhhghgigigighhhhhhhhhhhhhhhhhghghghghghghghgjgigigigigigigighfhfhfhghghghghgifififhfhfhfhghghhhhhhgggggggggghghghghghghfhfhfhfhfhfgfgfgfgfgfggfggggfgfhfhfhfhfhfhfhfhfhfhfhfgggfgfgfgfgfhehehehegegfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfhfhfhfhfhfhfhfhghghfgfgfhghgggghghgggggggggggfgghfhfifieieifjfjfjfifhfhggggggggggggggggghggggggggggggghghghghghghghghghghgigigigigighgggggggggghghhhhihihhgigjgkflfkgkgjhjhjhihihihhhhhhhhhhhhihihihihihihihihhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhghghgigigighhhhhhhhhihihihiiiiiihihihihihigigigihihihihihihhhhhhhhhhhihihihihihihihihihihiiiiiiiiiiiihihihhjijjjjjkjkjkjjjjjijijhkgkgkhlhlijijijikikikikikhkhkikikikjjjjjjkkkkjkjkjkikikikhihjhjijikikililhmhlhlhlhlhmhnhnhnhninimimimimjljmjmjmjmjmimimiljmjljljljljmjmjnjmjmjljlikikijijikikjljljmjlilikhjhjhkhkhkhlhlhlhkhkhkgkglglglglgmgmgmhlhlililjljjjjjjjjijikikikjjjjjjjjijhjgjgjglgkgkhjijikjkjlhlhlhlhlhlhlglgliiijijhjhkhkhkhkhlhlhlilililililjjjjjkjkjljlililkkkkkkljljkikijhjijjjjjkikililimhlhkhkhjijijikikikikjkjkjkjkjkjkjkjkikijijijjijijjjjjjjijjjjjkjkjkjjjjjjjikikikhkikikikjkjkjkjkjjjjjjjjjjjjjijijjjjjjjjjjjjjjjjjjiiiiiijijijikhkiiiiiiiiiiiiiiiiijijiiiiiiiijhjhiiiiiiiiijijjjjjijjjjjkjkjjjjjijijijijiiiiiiiiiijijijijhjhjhjhjhiiiiiiiiiijhjhjhkhjhjhjiiiijhjhjhjhjhihiihigigigjgjgjgjgjgjgjgjgigigigigigigigighghghghghgigigighhhhhhhhhhhhhhhhhghghghhhhhhhhhhigigigigighghghghghghghghghfhfhfififieieifhfhghghghghggggggfgfgfgfgfgfgggggggggghfhfgfgfgfgfgfgfgggggggfhfhfhfifhfhfhfhfhfhfhfhfhfhfgfgfgfgfgfgfhfgfgfffgfffgfgfgggggggggggggggggfgfgfgfgfgghghghfhghghggggggggfgfggggggggggggffgggggggghfhfififieifjfjfjfifhfhggggggggggggggggghggggggggggggghghghghghghghghghghhhhhhihhhhhghghggfgggghhihihjijhjglgngngngmgjgihjhjhjhjhihihihihhhhhhihigigigigihihhhhhhhghghghhhhhhhhhhhhhhhhhhhhhghghghgigigighghhhhhihihjhjhiiiiiiiiiihihihigigigihihihihihihhhhhhhhhhhihihihihihihihihihihiiiiiiiiiiiiiiiiiijijijjjjjijijijijhjgjgkgkglglglhkhkhkhkhkhkhkhkhjhjhjikikikikikjkjkjkikikikikikhjhjhjijikikikikililikikikililimjljljljljljljljlinimimimimilililjmjmjljljljmjmjnimimililjljljkjkikjljlklkljkjkijhjhjhjikikilililhkhkhkgkglglglglglglglhlhkikikjkijijijijjjjkjkjkjkjkjkikhkhkhkhkgkgkhkhjijjkjkjkhkhkhkhkhkgkgkgkhkhkhkhkhlhlhlhlhmhmhmhlililililjjjjjkjkjljlililkklkljljlikhkhjhjijjjjikikhlhlhmilikikijijjjjjjkjkjkjkjkjjjkjkjkjkikikhjhjijiijijkjjjjjjjjjjjkjkjkjjjjjjjijikikhkikikikililjljljkjjjjjjjjjjjijijjjjjjjjjjjjjjijiiiiiiiijijhkhkhkhihiiijijiiihihiijijiiiiihihjhjhhhiiiiiiijijjjjkiijijijijijijiiihjhihihihihihihijijijiihihihihihiiiiihihigigigjgkgjhjhihiihjhjgjgigihihhihigigjgjgjgjgjgjgjgjgjhigigigigififififhfhfhfhfhgigigighghghghghghghghghghghghhhhhhhihiigigighghghghghghfhfhfhfhfhfhfhfififieieieifhfhghghghfhghfgfgfgfgfgfgfgfgfgggggggfgfgfgfgfgfgfgfgggggghfhfhfififhfhfhfhfhfhfhfhfhehehegegfgfgfgfhfgfgfgfgfggfgggggggggggggggggggffffgfgggggggggghghggggggggggggghfggggggggfgggggggggghgghghfififieifjfjfjfifhfhggggggggggggggggfhggggggggggggghghghghghghghghghgghghhhhhhhghghfhfhggghghhihjijikhrgtgvgvgugrgohmhkhkhkhjhjhjhihihhhhhhigigigigifihhhhhhhghghghghghghghghghghghghghghghghghgigigighghhhihihjhjhjhiiiiiiiiiiiihihigigigihihihihihighghghghghgigigiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijijijijijhjhjgjiiijhjgkgkglglgmglglglglgkgkgkgkhjhjhjhjhkhkhkhkikikikikikikikikhjhjhjikikikikikikikijijjjjkjkjkjkjkjkjkjkjkjkjkhmhnhmhmhmilililimimimimimimininimimimimjmjmjmjmililjljljljkijiihjhjhkikilimimimhlhlhlglglglglglglglgkhkhkikikjkijijijijjjjkjkjkkkjkikhkhlhlhlhlgkgkhjhjhjijikikijijijhjhjgjgjgjgkhkhlilimiminhnhmhmhlilikjkjjkjjjjjijikikiljljmkkkkkjkikijijjjjjijjjjjkikililimililikijijijikjkjljljkjjjjjjikikhjhjhjhjhihihihijkjjjjjjijijikikjjjjijikikijjjjjkikikikikikhkhkhkjkjkjkjkjkjkjkjjkjjjjjjjjjjjijiijijijijhjhkhjhjiijjjjkjkjjjjjijiiiiiiihihihihihiiiiiijjjjkjkjkjkikikijijijijijihihjgjgkgkgjgjgiijiiihihihjhjhjhijiiihigigigififihihihihhihigigighghhhhhihjgjgjgkfjgjgjgigigigihhghgigigjfjfkekeieifififhghghghgigigigigigigigigighghghghhhihihjhhhghghghghghghghfhfhfhfhfhfhfhfhehehfhfhfhfhghghghghgigifhfhfhfhehehehfhfhghghghfhfhfhfhfgfgfgfgggggghfgfgfhghghfhfhfhfhfhehehehfhfhfhfhfgfgfgfhfhfgfgfggggggggggggggggggggggggffgffggggggggghggfgfgfgfgfgfgfgfhfggggggggggghfhghghghgggghghfhfifififhfhfhfhfhgghgggggggggggggfggggggggggggggggghghghhhhhhhhhhhhghghgggghghghghgighgghgiiimiqisixiyizizhyhxgvgtiqiphohmglgkhkhjghghghhghghghfhfhgggggggggggggggghghghghghghghghghghghgigigigjgjhihigjhjhjhjhiiiiiiiiiihihihihihgigjgjgjgjgjgjgjgigigigigigigigihjhjhjhjhjhjhjhjiiiiijijijijijijijijijijhjhjhjhjiiiihjhkhkhlhmhmgmgmglhkhkhkgkgkhjhjhjikikikikikilililililililililhlhmhmimjljkjkjljljkjkkjkjljlikjkkkkjkjkikikilgmhmimjmjmilhlglhmimjlklkljmjminininjnjnjnjnininimimjljkjkjkjkikhkhlhlhmhnhnhnhnhngngngngngngngngmgmgmgmhlikikikikikikikikjkkjljlmkmkmjmimhmhmhmgkgkgjhjhjhjikikijijijhjhjhjgjgjgkhkhkililimimhmhlhlhlikikjjjjkjjijiijijijikjkjkjkjkjjjjjijjjjjjjjjjjjjkikilililililikijijjjjkjkjljkjkjjjjjjjkjkijijijijiiiiiiiiijijijijjjjjjjjijjjjikikikikjjjjkjkjkjkikikikikijijijijijijikikijjjjjjjjjjjjjijiijijijijijhjhjhjiijijikjkjjjjjijiiiiiiihihihihihiiiiiijijjjjkjkjkikijijijijijijihihjgjgjgjgjgjgiijiiihihihihihjhiiiiihigigigigigihihihihhhhigigihhhhhhhhihjhjhjhjgjgjgjgigigighghghgigigjfjfkekeifififhghghghghgigigigigigigigighghghghghhhhhihihhhghghghghghghghfhfhfhfhfhfhfgfhfhfhfhghghghghghghgigigigifhfhfhehehehfhfhfhfhfhghghghggggggggggggggfgggggfgfgfhfhfhfhehehehehehfhfhfhfhfgggggghfhfhfhfhghghghgggggggggggggfgfgfggggggggggggghggfgfgfgfgfgfgfgfgfggggggggggggggfhghghgggggghghghghghfhfhfhghghgghgggggggggggggfggggggggggggggggghghghhhhhhhhhhhhghghghghggggghggggghihjinjrjwkylylzl{k}j}j|izizjvjuirgpgmgkgjhighghhhhghghghghggggggggggggggggghhhhhhhhhhhhhhhhghghghgigigigjgjhigigjgjgjgjgjhihihihihhhhhhhhhhhihigigjgjgjgjgjgigigigigigigigihjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjijijijhjhjhjhjhjjiiiijijikililhlhmhlikikjjijijikhjijijikikikikjkjkjkjkjkjkjkjkjkhmhmgmgmhmhmiljkiljkjkjkkkkjkjkjkjkkjkjkjkikikilgnhmimjmjmilhlhlgmhmiljlklklkmjmininjnjnjnjnininhnimiljkjkjkjkjkililhlhmhmhnininhmhmhngngngngngnenfngngmhmjljljkjljliljljlkllkllkmkmkmjmimhmhmgmglgkgkgjhjhkhkhlhkhkhkhkhkhjhjhjgkhkhkikikikilhlhkhkhkikikjjjjkjjjjjijijijikjkjkjljkjjjjjjjjjjjjjjjjjjjkikikililililikjjjjjjjkjkjkjkjkjjjjjjjjjjjjjjjjjjjijijijiiiiiiiiijjjjjjjjjjijikhkhkikijjjjkjkjjjjjjjjjjjjjijijijijijijijijijijijijijijjjjijijijijijiiiiiiiijijikikijjjjijiiiiiiihihihihihihiiiiiiiijijijjjijijiiiiiiiiiiihihigjgjgjgjgigihjhihhihihihihihhhhhhghghghghghgigigihihhhhhghghhhhhhhihihiiiijijgjgjgigighghghghghgigigifjfjejehfhfhfhghghggfgfhghghghghghghghghghghgigigihihihhhhghghghghghghgifhfhfhfgfgfgggghghghghghghghghghghgigigigifhfhfhfhfhfhfhfhfhfhfhghggggggggggggggfgggggfgfgfgfgfhehehehehehehdhdhfhfhfhfhfgggggghehfhfhfigifigighghgggggggggfgfgfggggggggggggghggfgfgfgfgfgfgfgfgggggggggfgggggggggggggggfgggggggggggfgfhfhghghgghgggggggggggggfgggggggggggggggggggggghghghghghgigigigighghghghghfhhhkinjskwmzn|n{n|n|m}m~m}m}m}l{kzivgsgoglgjgihhhhhghghgigigiggggggggggggggggghghghghghghghghghhhhhhgigigigjgjgigigjfjfkgkgkgjhihihihhhhhhhhhhhihihigigigjgjgjgjgjgjgjgjgjgjgjhjhjhjhjhjhjhjhjgjgjgjgjgjgkgkgkhjhjhjhjhjijijijjiiiijijikikikhkhlilikjjjjjjijijijijijikjkjkjkjkjjjjjjjjjjjjjjjjhlhlgmgmgmglhkhkikikjkjkjkkkkkkkjjjkjkikikikikilhninjnjnkmjmjlilgmhmiljlkkklkljlininjnjnjnjnininhmimjlkkkkkkkkkkjljlimhmhminjnjnjljljmimhngngngnenfngmgmhljljkkkkkkkjljljmkmlmlmknknjmimimhmglglglglgkgkgkgkglglhlhlhlhkhkhjhjhjhjhjhkikikikikhkhkhkhkikijjjjjkjjkjkikikikikjkjkilikikjjjjjjjkjkjkjkjkjkikikikikiljljkjjjjjjjkjkikikjjjjjijjjjjjjjjjjjjjjijijijihkikikikjkjkjkkjijikhkhlhlhkikijikikikijijijijijjijijijijijijijijhjijijijijijjjjikijijijiiiiihihiijijikikijijiijiiiiiiihihihihihihihihiiiiiiiiiiihihihihihhhhhhhhhhigigjgjgigighhjhihhhhhhihihihhhhghghghghghghgigigigihhhhhhhghhhhhihihiiiiiiiijhjgigighghghghghghghgigififieiehghghghggggggggghghghghghghghghghfhfhgigigigigjghhhghghghghghghgififhfhfggggggggghghghghgggggggggggghghghghfgfgfhfhfhfhfhfhfhfhfgggggggggggggggggggfgfgfgfgfgfgfhehehehehehdhdhdhfhfhfhfhfgfggggheheififififjfjfhghggfgfgffffffffggggggggggggghggegegegegegegegegggggggggggfhfhfhghggfgggggggggggggggfgfgfhghghgghhggggggggggggfgggggggggggggggggggggghghghghghgjgigigigihihihihighihmirjulxnzp{m|m|n|n}n}o}o}p}m~l|iygufqfmfjgjhghghhhhigigigiggggggggggggggggghghghghghghghghhhhhhhhhigigigjgjgigigjgkfkgkgkgkhihihihhhhhhhhhhhihihigigigififigjgjgjgjhjgjgjgjhjhjhjhjhjhjhjhjgjgjgjgkgkgkgkgkhjhjhjhjijijijijiiiihjhjhjhkhkhkhlhlikjjjjjjijijijijijjkjkjkjkjkjjjjjjjjjjjjjjjjikikhlhlgkhkhkijikikikjkjkjkkkklijikikikikikikilimjmkmlnmnlmknknhmimjlkkkkjkjlilimimjmjmjmjmimimjmjlkllklkmkmlllkmjmimhmhmimjmkmllllkljmjmhnhngnfmfmglglhkikjjjjljkjkkkkklkmlmmnknjnjnimhmgmglglhlglglglglglhlhlglhlhlhkikijijijjkjkikikikhlhlhlhlhlhlhkhkikikjkjkikikilililililikikikikikjkjkjkikikjjjjjjijhkhkililikikjjjjjijiiiiijijijijjjjjkjljkjjjjjjjjjjjkilililjljkjkjkjjikikikikikikikikikikikikikhjhjhjjjjjjjjijijijijijijijiiiijijijijikikikijijiiiijiihihihihihiihihiihihihihhhhhhhhhihihihhhhhhhhhhhjhjhigigighghghghihihihihihhhhhhihihihihihigigigigigigighghgggggjhjhjhihihihihihihihjhjhjhjhjijiihihihhghghghghgigigighghfhfhfhfhghggggggggghghghghghghghghghghgififififigigigigighghggggghghgigifififhghfgggggghggggggggggggggggggggggggggfgggggggfhfhfieiehfhfgfgfgfgfgfgggggghghfhfhfhfgfgfgehehehehehehehehegfgfgfgfgfgfgfgfhehehfhfhfhfhfhfhghghfhfhfgffffffggggggggggggggggfgfgfgfgfgfgfgfgggggghghghfififhghggggfgfggggggfggggfgfgfgggghghghggggggggggggfgggggggggggggggghghghghghghghghghghghghghghhhhhigigmirjvlxmzm{n{l|m|m|n|n|o|p|p|o}m~j}gyfrflfjgigigihihihhhhhghgggggggghghghghghhhigigjgjgihihhiihihhhhhghgigifigigjgjfjgjgjgighhhhhhhgigigjgjgjhihihigigigigigigigihihiiihihihihihihhhhhihiijijhkhkglglglgkhjhjhkhjhjhjhjhjhjhkhjhjhjhjhkgkglglhlglhlglhlhkhjiihjhjijiijjjjkkkkkjkjlililikijijjijhjhjhjgjhjhkikhlhlhmimiljkjjjjijijijiiijjjjkjkjkjlkmlmlmlmlmlmjmjmjmjmjmjmjmjmjmimimimimimjmjmjmklkllklkllkmkmlllljkikikikiljlklklkljmimhmhnhnglglglglhlhkhkhkijijjkklklkmkmknimimhnhngmgmhlhkimhlglglgkgkgkhkglglhkhkhkijijijjkjkikikikhlhlhlhlhlhlhlhkikjkjkjkjkjkikilililililililhlhlhlhlhlikikjjjjjjjjikikililikikjjjjjijiijiijijijjjjjkjkjljkjkjjjjjjjkjkilililikjkjkjjjjijijijijijijijijjkikikijijijijhjjjjijijijijijijijiiiiiiiijijijijikijijijijjijijiihihiiiiiihihihiiiiiiihihihihihiiiiiiihihihihihijhjhigigighghghghhhhhhhhhhhghghgihihihihigigigigigigigighghgggggjhihihihihihihihkgkgjhjhjhjhjhjhihihihhghghghghgifififhghggggggghghggggggghghgighghghghghghghghgifififigifigigigighghghghghghgigififhfhghggggggggggggggggggggggggggggfgfgfgggggggghfhfifififhfhfgfgfgfgfgfgfhghghghfhfhfhfgfgfgehehehehehehehehegegegegfgfgfgfgfhfhfhfhfhfhfhfhfhghghfhfhfgfgfgfgggggggggggggggggggggggggggghghghghggggghghghghggggfgfgfgfgfgfggggfggggggggggggggggggggggggggggggggggggggggggggghghghghghghghghghghghghfggghgigjfngqhvjykzlzl{l|k}k}l}m}n}o}p}p}p~n~k~izgufofkfigigihihihhhhhgggggggggghghghghghihigjgjgjgjhihiiihhhhhhhghgifigifigjgjgjgjgigighhhhhgigigjgjgjgjhihihigigigigigigigihihihihihigihjgihihhiihihjhjhkhkgkgkgkgkhjhjhjhjhihihihiijijhjhjhjhjhjhkgkgkhkgkglglglhkhjijhkhjijijjjjjjkklkkkjkjkikikijijjiihihigjgjhjijijililimimjljljkjjikijijijijijikjkjkjlkllmlmllllkkjljljljljljmjmjmjnininimimjmjmkmjmklklklllllllklmklkkkjjjkikililjlilililhlhmgmgmglglhlhlhlhlhlhlhkikjkklklkmjmjmimimhmgmgmhlhkhkililhlgkgkgkgjhjgkgkgkhkhkhkikikikikikikikililililhlhlhlililjkkkjkjkjkjkjkikikikikikikikhlhlhlhmilikjkjjkjjkjkjlililikikjjjjjijiijijjjjjjjjkjljlililikikijikikikhlilikikijijijjjijijijijijijijijjjjjjjjjijijijijiiiiiiiijijhjhjhiiiiiiiiijhjhjhjijijijjjjijijhjhiiiiiihjhjhjhjhjhjhjhjhjhjijijijiiiiiihihihihihiihihigigigigigigihigigigigigigigihihigigigigigigigigigighghgggggigigigigigigigjgkgkgjgjgjhjhihihihihihhghghghghgifififhghggggggghggggggggghgigighghghghghghghghghfhghghfhghghghghghghgigighghghghghghghggggggggggggggggggggggggghfhfhfhfhfhghghghgigigififighghhgggggggggghghghghghfhfhfhfgfgfgehfhfhfhfhfhfhfhfgegegegegegfgfgfhfhfhfhfhfhghghghghghfhfhfgfgfgfgggggggggggggggggggggggggghghghghghghgggggggfgfggggggfgfgfgfggggggggggfgggggggggffgfgfgfgfgfgfgfgggggggggggggggghghghghghghghghghhhgggghgigkgmgogthvizj|k|l|l}l~kk~l~m~n}n}o}p}qom~j|iygtfmfhgigihihihhhhhggghghghghhhhhhhhhhihigjgjgjgjhihiihhhhhhghghgigigigigigjgjgjgihhhhgigigigjgjgjgjfkgjgjgjgjfjgjgjgjgjgjgjhjhjgjgjgjgjgjhiiiihiihihjhjgjgkgkgkgjgjhihjhihihhihiiiijjijijijhjhjhjhjhjhjgjgkglglhlhkikikikikijjkjkjljljkjkjjjijijiiiiihjhjgjgjhjhjijjjjljljmjmjmjljljkhlhkhkijijijikikikjkjlkllllkkkkjjkjkjkjkjljljljlinininimjmjmkmlmkmkmkmklklkllklkmjmjljkjkjjkilhlhkhkhkhlhlhlhlhlhkhlhlhlhlhmgmgmhlhliljljmjmjmjmhmhmhmgmgmhlilikjkikikhkgkgkgkhkgkgkgkgkhkhkhkikikikikikikilililimimhlhliljljlkljljkjkjkjkjkjjijjjjjjjjjikikhlhlililjkjkkkkkjljlililikikjjjjjijiikikjjjjjkjkjljmhmhlhkhkhkhkhkhlhlhkhkikijijijijjjjjjjjjjjjjjjjjjjjjjjjjjjijiiiihihihiihihjhjhjhiiiiiihihjhjhjhjijjjjjjijijhjhjhhjhjhjhjhjhjhjhkhjhjhjhjijijijijijijijhjhjhjhjhjihihigigigigigigihihihihihigigigjgjgjgjgjgjgjgjgigigigighghgggggifififififjfjfjfjgjgigigighghhhhihihihhghghghghgieififhfhfgfgggggfgfgggggghgifjfhfhfhfhfhfhfhfhfhghghghghghghghggghghgigifhfhggggggggggggggggggggggggggfhfhfhfhfifififififigigigigigjgjgigihhhhifkfkgjgighhghghghfhfhfhfhfgegfgegfgfgfgfgfgfgfgfhegegegegegegfgfgfgfgfgggggggggghghghfhfhfgfgfgfggggggggggggggggghghghghghhhhhhhighghgggggfgfgfgffffffffgfgfgfgffgggggggggggggggffffgfgfgfgfgfgfhghghgggghggggghhghghghghghghghgghggghgigkgngqgsiwiyj|k}l~m~mmnnnn~n~n}o}o}qpo~l~j|hwgofhgigihihihhhhhggghghghghhhhhhhhhhghhghgigighhhhhihhhhhhghghgigigihigigigigihihhhhgigigigjfjgkgkgkfjfjfjfjgjgjgkgkgjgjgjhjgjgjfjfjgjgjhiiijhihhigihjgjgkgkgkgjgigihihihhihihjhjijiijijijijhjhjhjhjhigjgkglglhlhlilililikikjkjljmjmiljkjjjijiihihhhhjgkgkgkhkhkikjkjljljmjmjmjmjljlhlhlhkhkhjijikikikikjkkkkkkkkjkjjjjjjjjkjkjljljlininimimjmkmlmmmllkmkmjmkmkllkmjmjmjmjljkjjkhlhlhkhkhkhkikikikikhkhlhlhlhmgmgmgnglhmhmimimimimimhnhngngngnhnimilhjhjhjhjgjgjgkgkgkgkgkhkhkhkhkhkhjhjhkhkikikikikiljljlkmklkljkjkjkjkjkjjjjjjjijikjjjjjjjijikikhkjljljmimimimimilhlhkhkhjhjhkhkhlililililililimimhmhmhmhmhlglglglhlhlhlhlhlhlhkhkikikikikijijijijililikikjjjijijiiiiiiiiijijhjhjhiiiiiihjhjhjhjhjiiiiiiiiihihihihjijiijijijikikikhkhkhkhkhkhkhkhkgjhjhjhjijijijiiiiihjhjgjgjhihiihihihihihhhhhhhhhgigigjgjgigighgigigigigighghghgigifififjfjfjfjgigighghggggghghgjhigighghghghghghfhfhfhfhfgfgfgfgfgfgfgfhfhfhfifhfhfhfhfhfgfgfgfgggggghghghghghghghghghfhfgfgggggggggggggggggggggggggghfififjfjfjfjfifhfhfhgigigifififhghigkflfnesfrgphlhhififhhhdhdhdhdhdgdgegehfhfhfgfgfgfgfgfhegegegegegegegegfgfgggggggggggghghghghfhfgfggfggggggggggggggggggggggggggghghghgigighgggggfggggggegegegegegegegegggggggggggggggggfgfgfgfgfgfgfgfhghghgggghghghgihghghggggggggghgghghgiglgqhtivivlylzl|l}l~m~m~mo~n~n~n}n}n~n~nqqqok}hxgqflghghghghghghgggggggghgigigighhhighhhhghghghghgihhihihihhhhghghghhhghgigigigighhhgjgjgjgjfjgkgkgkfjgjgjgjgjgjgkgkgjgjgjgjgjgjfjfjhihiiiihihihhhhhhihjgjgjgjgjgjgjgihiihjhjhjhjhjijiiiijijijijijijhkhjhjhkhkhlhmhmimimhmhmhmimiljlikikikikijhjhjhjgkglglhlhlhlikikilililililhmhmhmhlhlhkhjhjhjhkhkjkjkjkjkjkjkjjjjjjjjjjjjjkikhkhkhmhnhmhmilklllmlmlllklklklklllmlnknkmkmklkkljljlkkkjkjjjjjjjjjjkjljkjkikilhlhmgnhnininimimjmjljlhohogogogngnhnhnhihihjgjgkgkgkgkgkgkgkhkhkhkhkhkhjhjhjhjhjijijijikiljlklklkkjkjjjjjkjjjjjijijijikjkjkjkjjjjjjjjjjlimimininininimilikikijijikikilikikililililililhmhmhmhlhlhlglglhlhlhlhlhkhkhkhkhkhkhkhkhkhjhjhjilikikijjjjijijijijijijiiiiiiiiiiiiiiiiiiiijijhjjijijijhjhjhjhjhjjijijijijikikikgkhkhkhkhkhkhkhkhjhjhjhjijiijijiiijijhjhjhjhiiiihjhjhjhihihihihiigigjgjgjgjgigigigigigigighghghgigigififjfjfjgjgigighghghghgigigjgjgighghghghfhghfhfhfhfhfgfgfgfgfgfgfhfhfhfififhfhfhfhfhfhfhfhfgggghghghghghghghghghghfhfhfgggggggggggggggggggggggghghfififjfjfjfififhfhfhghgigihighgghfkfoeseugvhvhtipjkigififhdhdhdhehehegegehfhfhfgfgfgggggggfgfgfgfgfgfffgfgfggggfgfggggggghghghghghggfgffffgggggggggfggggggggggggggghghghgighggggggggggggggegehehehehehehehfhfgfggggggggghggggggggfgggggfggfgfgfggggggggghhghgggggggggggggfgfjgnhsivjwkwkvlzm{m|m|m}m}m}m~n~n}n}n}n}n~n~npqqnk}gxgqglhihigighghghghghghgghgigigighhhhghhhhhhhhghghgighhhhhhhghgggggggghghgigigigihhhhgjgjgjgjgjgkgkfjgigigihjhjhjhjhjhihigigigigigigihihiiiihihihhhhhhihihihjgjgjgjgjhihiihihjhjijiijjijijjijijijijijhjhjhjhjhkhkhlhmilimhmhmhmimiljkikikikikikikikikglhlhlhmilikikjjikikikikilhlhlhlhlhkhkijijijikikjkjljljljljljkjkjjjjjjjkjkikikhkhmhmhmhliljklklkmlllllllllllllmlmkmkmklkkkkljljlkkkkjjjjjjjjjkjkjljljkikhlhlgmgmgngngnhmhmimimimhohogogogngngngnhhhigjgkglflglflgkgkgjhjhjhjhkhkgjgjhjhjhjhjhjhjikikjljljljkjjjjjjjjjijijikhkhkhkikikikjkjkjkjkjikikiliminhnhnhnilikikijijikikilikikikikilililililililhlhlhlhkhkhlhlhkhkhkhkhkhkhjhjhjhkhkhkhkhkikikijijjijijhjhjijijijiiiijijijiiiiiiiiiiihihihjhjhjhjhjhjijijiijijijijijhjhjhjgjgjgjgjgjhjhjhjhjhjhjiiiijijijijijijhjhjhihiihihjhjhjhihihihihiigjgjgjgjgjgjgigigigigigighghghgihigigigjgjgjhjhjgigigigigigjgjgkgjgigighfhghgighfhfhfhfhfgfgfgfgegeheheheieieiehfhfhfhfhfifififhfhghghghgigigigigigighfhfhfhghggggggggggggggggghghghghfififififififhfhfgfhghghgihhigkfnfrfvfxfzjyjzkykvjpjjjgifieieiehehfhfhfhfhfhfhfgfgfgggggggfgfgfgfffgfgfgfgffgfgfgfgfgfggggfgghghfgfgffffffgfgfggggggggggggfgfgggggghghghghghggggggggggghggfgfhfhfhfhfhfhfhfhfhfggggggggghggggggfgggfgfgfgggggggggggggggggggggggggggggggfggjgoiujyjylxmymzl|m|n|n{n|n|n|m|l}m}m}n}n}n~nnoppnj|gwgpgkhihihigigighghghghghhgigigighghhghhhhhhhhhhhhgighhhhhhhghgggggggggghghgigihiiiiihjhjgkgkgkgjgjgihhhhhihihihiiiiihihihihigigigigihihiiiihihihhhhhhihihihihihjgjgjhihiihihiiiiijhkjijijjjjjjijijijhjhjhjhjhjhjhkhkililhmhmhmilikjkijijikikikjkjljlhlhlimimjljkjjjjijijijikikhkhkhkhkhkijijijjjjjjjikilililililikikikjkjkjkjljlililhlhlhlikikjkkjljmkmkmkmkmkmkmkmklklkkkkkkkjljljljkjkjjijijijikikjljlilikhkglglgmfmfnfngngmhmhninhohogogogngngngnhghihjglgmgmflflglgkgjhihihjhkhlgkgkgkhkhkhkhjhjhkikikjljkjkjjijiiiijijhjhkhkhkgjijijijijjjjjjjjijijikhlhmhmhmhmilikikijijikikilikikikikikilililililililhkhkhkhkhkhkhkhkhkhkhjhjhjhjhjhjhkhkhkhkikikijijjijijhjhkijijijiijijijhjihihihihihjhjgjgjhjhjhjhjijijijiijijijhjhjhjhjhjfjfjgjgjgjgjhjhjhjhiiiiiiijijijijjjijijhjhiihihjhihihihihhhhhhhhihjgjgkgkgjgjgigigigigigighghghgihihihigjgjgjhjhjgigigigigjgjgkgkgjgjgighghfififhfhfhfhfhfgfgfgfgeheheheieieiejehfhfhfhfififififhfhfhghgigigihihigifififhfhfhghggggggggggggggggghghghghfhfifififififhfhfgfgfhfhfhfhjgogugyhzizjzk{k|l|lyktkmjhjfififififhfhfhghfhfhfhfgfgfggggggggggggggggggggfgffggfgfgfgfgggfggggggggfgffffffffgfgfggggggfgggfgggggfgfgfhfhfhghfhfgggggggghghggggggggghfhghghghghghgggggggggggghghggggfgfgfgfgfifififhghghghhhggggggggggfgfhghhoitjylzlymxm|mm}m}n|o{o{o{n{n|k|l|m|n}n}n~nnnoom~j|gvfogjhihihigigigighghgighhgigigighghghihihhhhhhhhhhihhihihihhhhghghghggggghgigihiiijihihjhkglglgjgighhhhhhhihihiiiiiihjhjhjhjhjgjgjgjhihiiiihihihhhhhiiiihihihihihihjhihhihihiiijhjhkjijijjjjjjjjjjijijijiiiiiiijijikililhmhmhmilikjkijijikikjljljljmimimimjmjljkkjkiijijijijijhkhkhkhkhkijijjijjjjjjikikikikikikijijililjljljljmimimililhkikijjjkjljmjmjnjnjnjnjmjmjkkkkkkjkjkjljlililikikijijhkhkhlimililhkhkglglgmfmfnfngnhninininhohogogogngngngnkgjhijhkglglfkgkgkhkhkhkhkhkhkikhlhlhkhkhkhkhkhkhkhkhkikikikikikjjjjjjjijikhkhkhihiiiiiijijijijjijijijikjkjkjljljjjjjjjkjkjkjkjkikikikikikikikikikikikikhkhkhkhlikikikijijijijijhjhjhjhkhkhlglglililikikijiiiiiiijijijijijijijijihihihjhjhjhjgjgjgjgjhjhjijiiiijhkhkhkhkhkhkhkhkfigjgjgjhjhjhkikijijijijiiiiiiiijijijijijijijijihhhhhhhhhhhhhhhhihigigjgjgkgkgkgjgjgjgihihihihihjiiiiihihhhhhhihjgjgkgkgkgkgjgjgihihighghghfhfhehfhfhfgfgfgfgfgfgfgfhfhfieiejdjdififjfjfjfifhfhfhfhfhghghgigigigififififhfhfggggggggggggggggggggighghggggghghghghfhfgfhfhfhfhfhfhfhkiqjvkykzl|l|k|k|l|l{lxjsilhhhghfhfhghhhihghfhghghghfhfggggggggggggggggggggfggfggfgfgfgfgggghgggggggggffffffffgfgfgggggggghghgighgggfgfgfgfhfhfhgghghgggfgffgggggggggggghghgihkhkgjgighghghghgigigififiejekdkfofofofnflgkgigifggghfgffgfhfjgkkslvmyn{nzn{l}k~l~m~n}o}o|o{n|n{m|m|m|n}n}n~n~npqpm}jzgtfmghhjgjgjgigigigigighghhhhgigigigigihihihiiiiiiiiiihihigigigigigigighghghgihiiiiiiihjhkhkhkhjgigighhhhhhhhhhihihihihjhjhjhjhjhjhjhjhihihihihihihihijijiiihihjhjijijhihjhjhjhjhjhjhiijijijijijjkjkjkijijjijhjhiiijhkilhmhmhmhmililjkkkkkkkkkkkkkkkkkikililjljlklkkkjkjjjjjjjijikikikhkhkhkikijijijijhkhkhkhlhkhkhjijijikilimimimimilhlhkhkijijjjjjkklkmknjnininimjljjkjkililhmhmhmgmglgkgkhkgkhkhkhkhlhlhlglglglgmgmemfngnhnininioiohphpgogngngnhnhnkijjikhlglglgkgkgkhkhkhkhkhkhkikhkhkhkhkhjhkhjhjhjhjhjijijijijijjjjjjjjijijijijhiiiiiiijjjjjjjjjjjjjjjjjikijikikjjjjjjjjjjjkjkjkikikikikikikikikijijijhkhkhkhkhkijijijijijijijijijijijikhkhkhlhlilililikijijijijijijijijijijijijiiiiiiiijhjhjhjhjgjgjhjhjhjhiiiiijijijijhjhjhjhjgihihihjhjijijijijijijijiiiiiiiiiiiiiiiiiiiiiiiihihihhhhhhhhhghgigigigjgjgjgjfkgjgigigihihihihihijijhihihihihihijgjgjgkgkgjgjgjgihigighghghfhfhfhghghghggggggggggggghfhfieiejdjdieiejejejeiehehehfhfhgigigigigififififighghggggggggggfgggggfgfgfifhfhfgfgfgfgfhfgfgfgfgfhfhfhfhfghhljrkwlyl{l|l}k~k}l}m|l{kwjrjnhihhhghghhhhhghfhghghghghggfgfgfgfgggggggggggggfgggfggggggggggggfgfgfgfgfgfgfgffgggggfggghgjglgmfmfkfifggfgfgfhfggghgighgfgfgggiejejejejfkfmfmgngqgpgofnfmfkfififkekekeleneoeqergugvgvgvfsfoekehfgggggggfifjgmimmtnwoyo{o{o|n|m}n~n}n}n}n}n|n|n|n|n|n|n}n}n~n~nqqqn|kwhqgkhhgjgigigigigigigihhhhhhhgigigigigihihihihihihiiiihihigigigigigigighghghgihihiiiiihjhjhkhkhjgjgigihhhhhhhihihihihihjhjhjhjhjhjhjhjiiiiiiiiiiiiiiiijiiiiihihjhjhjijhihjhjhkhkhjhjhiijijijijijikikjkjjjjkikhkijjikikhlhmhmhmhmhlilikjkjkkkkkkkkklklkilililjmjljljkjkjjjjjjjjijikikhkhkhkhkikikijijijgkhkhlhlhlhkhjijijikilimimimimilhlikikijjjjjjjkklkmknjninimiljljjkjkililhmgmgngnglglglglgkgkgkhkhkhkhlglglglglglgngnhninjnjnjoiohohngmglglglhlhmjlililhlglgkgkgkgkhkhkhkhkhkhkikijijijijijijijijhihihiijijijijijjijijijijijijijiijijijijjkjjjkjkjijijijjijijijijjjjjjjjjjjjjjjjjikikikikikhkhkhkhjhjhjhjhjhkgkgkhjhjhjijijijjjjjjkjkjkikikikikikililililikikikikijijijijijijijijhjijijiiiiiiiijijijijijijijiiiiijjjjjjijijiiiiiiiiiiiiiiiiiiiiiijijiiiiiijhjhjhjiiiiiiiiiiiiiiiihihihihhhhhghghghghgigigjfjgjgjgigigigihihhhhhhhiiiihigigigihhhhigigjgjgjgjgigigigigighghghfhfhfhghghghghghggggghghghfhfieieididididjdjdjdidhdhdieififigigififjfifififighghggggggfgggggfgfgfgfgfhfhfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgjhnjtlxmzm{l|l|k~l}m}n}n}m|lykvgngkgjgihihihghfhfhghghfhfgfgfgfgfgfgfgggggfgfgfgggggggfggggggggfhfhfgfgfgfgfgfggggfgfgfgigngrgufrfqenekeifigjhjgngngmgkfifjflfndrdqdqerfrgthuiujxiwhwgvftfqfpfnfpfpeqfrftgvixjykykzj{j{hyfueqdnejfjgjfkflfnhqjrnvoyo{o|o|o|o|n}n}n}n}n|m|n}n|n|n|n|n|n}n}n~o~oq~qq~nzkshmgjhifigigigigighhhhhhhhhhhhghgigigighghghghghhhhhhhhhhhigigigigjgjgjghghghgihihihiiihjhjhjhkhjgjgigihihihihihihihihihjhjhjhjhjhjhjhjijijijiiiiiiiiihiiiihihigjhjhjhjhjhjhkhkhkhkhjhjhjhjhjijijikikikjkjjkikikijjikilhlhmgmgmgmglhlikjkjkjkkkkklklklkjljljmimimililikjjjjjjijijhkhkhkhlhlhkikikikikikgkhlhlhlhlhkhkijijikilimimimimililjkjkjjjjkjkjkklkmknjninimiljkjjkjkililhmgmgngngmgmhmhlhlhkhkhkhkhkhkgkglglglglglhlhlimiminininhngmglglgkgkgkhljninhmhlhlgkhkhjhkhkhkhkhkhkhkikijijijiiiiiiiiiihhhhhhiiiiijijijkijijijijijikijiijijikikjkjkjkjkkijijijiiiiiiihiiiiiijijijijijijikikikikhkhkhkgkhjhjhjhjhjgjgkgkhjhjhjijijikjkjkjkjkjkjkjkikikikhmhmhlhlhlhlhlhlhjhjhjhjhjhjhjhjhjhjhjijijiiiiiijjjjjjjjjjjjijijjjjjjjjijiihihihjijijiihihihihihjijiiiiiijhjhjhjhihihihihihihihihjhihihhhhhhhghghghghfigigjgjgjfigigighhhhhhhhhhihhhhhhhghgghghgigigjgjgjgjgigigigigifhghghghghfigighghghghghghghghghfhfheieididididjdjdjdidhdhdieififififjfjfjfifififighghggggggggggggfgfgfgfgfhfhfgfgfgfgfgfgfhfgfgfgfgfgfgfgfglhpjulyn{m|m|l}l~m}n}n}n~n~m|lzgsgpgmgkgjhihghfhghghghfhfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgffffffgfgehehehfgfgfgfgfggfgegegggjgphvhzgwfufrdodndneofpiuhtgsfpfoepereufxexexfxgxjykzmznzn{l{j{hzgxfwfuhwhwhwhwjxkymzn{n{n{n{l{kzhzeydyepepfpfpeqfsitkunwnyn|n|n|o|o|n}n}n}m}l|l|l|m}m}m|m}n}n}n}o~o~oo|p~o~myjphjghhigigigighghhhhhhhihihhhhghghghghghghghghghghghghghhhhghgigigjgjgjghghghhihihihihihihjhjhjhkgjgjgihihihihihihihihihjhjhjhjhjhjhjhjhjhjhjhihihhhhhhiiiihigigjgjhjhjhjhjhkhkhkhkhjhjhjhjhjhjhjikikikikijjjjiiiijikhlglgmfmfmfmglglhkiljljlklklllllmljljmjmimimhmhlhkjjjjijijhjhkhkhkhlhlhlilikikikikglhlhlhmhlhlhkikijikilimimimimilklkkkkkjkjkjkjkkmkmkmjmimimikjjjjkjkililhmgmgngnininimimiljkjkjkhkhkhkgkgkglglglgkhkhkhkhlhlhlglgngmgmglfkgkglglininhmhlhkhjhjiiijijijijijijijijhihiiijijhjhjhjhiiiiiiijijijijijkjjijijijijjjkikjljljlilililimimijijijijiiiiiiiihjijijjjjijijiiiijjjjkjkikikhjgjhjhjhjhjhjgjgjgihihiiiijjjjkkkkljljljlililikikikiljljljlililhlglhjhjhjhjhjhihihiijijijijijijiiiiikikijjijijjjjjjjjjjjjiiiiiiihihiiihihihihihigighhhhhihihjhjhjhjhhhhhhhhhhhhhhhhijijijiiihihigighghghghghgigigjfjgigigigighhhhhhigigigighghghghgigigigigigihihihigigigigigighghgigigigigigigigighghghfhfheieidididididieheheheheiejejejejfjfjfifhfhfhfhghghghghghghghghfhfheheheififhfhfhfhfhfhfifhfhehegegfgggffkhpkvmzn|n|m|l}l~m~n}n}o}o}o}o|kxjuhpfkfhgghgjfhghghghfhfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgffffgegeffhfhfgfgfgfgfgfggfgefffigoitkwlxjxhwfvcuctdtftfunylyixgwfwfwhxhyj|i|i|j|k|l|m|n|o|o}n}m}k}j|i{h{k{l{l{m{m{n{o{o{n|o|o{o|n|l|j}i}ewewfwfvhviwkwlxnynynzn{n|n|n|n{n|n|m}m|m|m|l|k|l~m~n~n~n~onnp|m}j{huhniihhhigighghgggghhhhhihhhhhhhhhhhghghghghghggggggggggghghhhhhihihihihhhhhhhihihihihihihkhjhjhjhjhjhjhjjijijijijiiiijhjikikhjhjhjhihihihjhihhhhhhhhhhhhhihigjgjgkgjhjhjijhjhkhkhkikijjjjjijijhjhjhjhjijijijijijhjhjhkhkgmfmfmfmfmgmgmgmimimimiljljlklklkljmjmimhmhmhmhlikijijijijikhkhlhkhkhkhjhjhkhlhlgmhmhmhmilikikjkjkjkjljmjmjmjljlljljljljljljljljljljlilikikijiiiikhkhlhlgmgngngnhniniminjmjmkmklikikikhkhkgkgkgkglgkgkhkhlimimimgngmgmglglglgmgmhlhlgkgkgjhihhihhihihihihihjhjhjhjhjijjjjijijijiijijijijijijijijjkjjjjjjjjijikikjkikililililililijijijijiiiiiiiiiijijijijijijijijjjjjkjkjkikhjhjhjhjhjhjhjgigigihihiijijjkjkklklilililililikikikjkjkjkjkjkikhkhkhjhjhjhjhjhjhjhjijijijijijijijijikikijiijijijjjjhjhjhjhihiiiihihihihihihihihihihhhhhhihihihjhjhjhhhhhhhhhhhhhhhhiiiiiiihigigigigighghghghghgigigifigigigighghhhhigigighghghghghghghghghghghghhhhigigigigighghghghghghghghghghghghghfhfhfheieididididieheheheheheieiejejejfjfifighghghghghghghghghghghghfhfhehehehfhfhfhfhfifififififhehehegfgfggglipkvn{o|n|m|l}l~m}n}n}o}o|o|o|mykwisgnfkfhggighghghghggggfgfgfgfgfgfgfgfgfgfgfgfgfgfgffffgegegfffffgfhehehehehghfhdidmfrivmyoynylyiygyfyfzgzhzm{lzjziyhzhzjzk{m|m|m|n|n|o|o|p|o|o|o|n}n}m|m|l|n{n{n{n{n{n{n{n{n|n|n|o|o}n}m}m}j{i{iziyjyjykylymzmzm{m|m|m|n{n{m|n|n|n|n|m}l}l}l~m~n~n~n~n~n~nn}k{hxfrglgighfigighghgggghhhhhihhhhhhhhhhhghghghghgggggggggggfghghhhhhihihihihhhhhhhhhihihihihihjhjhjhjhjhihihiiiiijijijiiiijhjhkhkhjhjhjhigigihihihhhhhhhhhihigigigjgjgkgjhjhjhjhjhkhkhkhkijijijijhjhjhjhjhjhjijijijhjhjhkhkhkglglflflglglglhlhlilililjljljljlkljlimhmhmhmhlhlikijijjjjjijikhkijikijhjhjhkhlhlhmhmhmhlilikikikjkjkjljmjmjmjljlkjkjkjkjkjkjkjkjkikiljkjkjjjijijhkhkglglgmgnhnhnininininjmjmjmjmikikhkhkhkgkgkgkglglgkhkhkilimimimimimilhlhlhmhmgkgkfjgjgighhhhhhhhhhhhihjhjhjhjhjhjikjkjjjjjjjjikikikikikikikikjljljkikijijijikikikikikilhlhlhlhkhjhjhjhiiiihihjhjhkhkhkhkhjhjhjjjjjkjkjkikijhjhjhjhjhihigigigihihjijijikjljljlhmimililikikikijjjjjjjkjjjijijhjhjhjhjhjhjhjhjhjhkhkhkhjhjhjhjhjhkikijiiiiihiijihjhjhjhiiiiiihihihihihhihihihihihhhhhhhihihihihihhhhhhhhhhhhhhhhihihihihihigigigighghggggghghghghghghghghghghghghghghghghghggggghfhghghghghghghgigigighghghghghggggggggggggggggghfhfhfhfheieieiehehehehehehfgfgfheheieieififhfhggggghghghgigigighghghghfhfheheheheheheheieieieieieieiehehehegfgfhmiqlwn{o}o|n|m}l}m}n}o}o}p}p}p}o{myjvgrfnfkfhgggggggggggggfgfgfgfgfgfgfgfgfgfgfgfgfgfgfffffefefffegeiejdkdldldlenemenfqiulyozqzo{n{l|j|i|i}i}j|k|k|k|j|k|k|l|l}n|o|o|p|p|p|p|p|o|o}o|n}n}n}n|n|o|o|o|n|n|n|m|m|m}m}n}n}o}n}n}n}m}l}l|k|k{k{l{l|l|l|l|m|m|m|m{m{m{n|n|n}n|m}m}m}lm~m~n~n~m~m~m~l}jyfsfnfkgifhfgghghgggggghghhhhghghghghghggggggghghghghghghghghggghghgigigigighhhhhhhhhhhhihihihihihihihihihhhhhiiiiijijiiiijijhkhkhjhjgjgigigihihihhhhhhhhhihigjgjgjgkgjgjhihihihjgjgkgkhjijiiiiiihigjgjgjhjhkhjhjhjhkhkhkhkhkhlglglgkgkgkhkikhkhkhkikiljljljljlilhlhmgmglhlhlhkikijjjjijjijijijijijijijhkhlhlhlhlhlhlhkikikikikilimimimimimiljkjkjkjkjkjkjkjkkikikjkjjjijhkhkgkgkglglglhmimimjnjninininimimimhlhlhlhlgkgkgkgkglglgkhkhkikililkmkmkljljljmjmjngkfkfjfjgigihihhhhhihihjhjhkhkhkhkhkikjkjkjljljlililililikikikikjmimilikijijijijikikikhkhkhlhlhlgkgkgjhjhiiiihihkgkglglglhkhjhjhjjkjkkkkjkjkijhjhjhihihihihihihihjhjhjikikililimhmhmhmhlhkikijijjjkjkjkjjjjjijhjhjhjhjhkhkhkhkhkhkhkhkhkhkhjhjhjhkhkhjiiihihihihhjhjijiijijijhjhihihihhihihigigjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiihihihighghggggggggghghghghghghghghgighghghghghggfgfgfhghghghghghghghghghghghghghghgggggghgggggggggggghfhfhfhfhfieieiehehehehfhfgfgfgfgeheheieifhfhfgggggggghghgifififhfhfhfhfhfhehehegegeheheieieiejejeieieidhehehfgfhmjrmwo|p|o|o|n|m}n}n}o}p}p}p}p}q}n|kyhufqemeifggggggggggggfgfgfgfgfgfgfgfgfgfgfgfgfffffffffegegehejekdndocpcpcpbsdrgskunxozpzpyn|n|m}k}k}k|k|k|j|k}k}l}m}n|n|n|o|o|o|o|o|o|n|n|n|n|n|m}m}l}l}l}n}n}n}n}n}m}m}m}m}m}m}m}m}m~m~n~n}n}m}l|l|l}m}m~l}l}l}l}l|l|m{m{m{m{m|n|n|n}n}m~mmmn~n~m~m~l~l}iwgpfkfjgighfgghghgggggghghghhghghghghghggggggghghghghghghghhhggghghgigigigighhhhhhhhhhhhhhhhhhihihihhhhhhhhhhhihiiiiiiiiiijijhkhkhjgjgjgigigighghghghghghgigjgjgjgjgkgjgjhihihigjgjgjgjhjhjiiiihihigjgjgkgkhkgkgkgkhkhkhkhkhlhlhlhkhkhjhjijijhkhkhkhkikiljljlikilhlgmgmglhlhkhkikijjijijijjjjiiiiiiiiijikhlhlilikhkhkhkhkhkhkhlhlhmhmhnhmhmhmjljljljljljljljljijijjjjjkikhkgkgkgkfkglhlhlimjmjmjmimimhmhnhngngmgmglglhlhkhkhkglglhkhkhkikikillmlmllklklkmkmkngkgkgkgjgjgigjgjgkgkgjgjgjgkhlhlilhlhlhlhlhlhlhlimilikiiiiijikililililikjkjjjjjjilikikikikhkhkhkgkgkgkhjijiijijhkgkgkgkhkhjhjijijjjjjjjkikikikikikikikikijijijiijjjjjjjkjkilililhmhmhnhmimililikjkjkjjijijijijijiihihjhjhkhkhkhkhkhkhkhkhkhjhjhjhkhjijiiiiihihihiiiiiiiijijijijiihihihhhhihihihiihihihhhhhhhhhhhhhhhhhhhhhghghghhihihihihihhhhhhhhghghgggggggggghghghghghgigigighghghghghghfhfhfigigighhhhhhhghghghgigigigighghgghghgggggggggggggfhfhfififhfhfgehfhfhfhfhfhfhfhfgfgfgfgfgfhfhfhghghghghghghfhfhfhfhfhfhfhehehehegegegegfhfhfhfhfifififhfhfgfgfgefmhrkyn}o|p|o|o}o}o}o~o~o~o~o~o~o}n|lzjyhvfrendjghghgggggggfgfgfgfgfgfgffffgfgfghfgfegdgfifjeldmendodpcqcsdtdueugxixlxnxpzq{r{r|n|n}m}m}m}m}m|m|l|l|m|m|n|n|n|n|p|o|n|n|n|n|n|n|n|n|n|m}l}l}l}l}o}o}n}n}n}m~m~l~m~m~m~m~m~m}m}m}l}m}m|m|m}m}l~l~ll~m~m}m|l|k{k{l|l{m|n|n|n|n}n}mm~m~n~nmm~m}kyjtingjgigighghfhghghghghgggghhghghghghghgggggggigighghghghhhhhhgggggghghghghghghghghhhhghghghgihihhhhhghhhhhiihhhihihihjhjhjhkhkhkhjgjgigighghhghhhhgigigjgjgkgkgkgkgjgjgjgigigjgjgkgkhkhkhjijhihihjgjgkglglglglglglhlhlhlikikhlhlhkhjiiiiijijjjikikikikikikilhlgmgmgmgmglhkhjiijijikhkikikjjjijijijikikhkhkhlikilililhlhlgmgmgmgmgmgmgmhmhmhmjmjljkjkjkikikiljkjjjjjjijhkgkglgkgkhkhkikjljljlkmjljlilhlhlgmgngngnhnimilikikijikikijiiiiijhkhkililjkjkjkjlimimgmglgkgjgjgjgkgkgkgkgjgjgjgkhkhlilhlhlhlhlhlhlglikikijiiiiijijikikikikikjkjjjjjjikikikikikhkhkhkgkhkhjijiijijhjhkhkhkhjijijijjjjiiijijikililimhmililikikikijijijjjjjjjjkikilililhmhmhnhnhmimilikjkikikijijijijijhihihjhjhjhjhjhjijijhjhjhjhjhjhjikijijjijijhjhjhihihihihihjhjhjhihihihhhhhhihihiihihihhhhhhhhhhhhhhhhhhhhhghghghhihihihihihihihighghghgggggggggghfhfhfhghgigigighghghghghghfhfhfhghghgghghghgggghgigigjgjgigighghghghghghghghghghghfififififhfhehfhfhfhfhfhfhfhfgfgfgfgfgfgghghfhfhfhfhfhfhfhfhfgfhfhfhfhfhehehegegegegfgfgfgfgfigifhfhfhfgfgfgednftizl}n}o|p|p}o}o}o}o~o~o~o~o~n~n|m{kzjzhxftfqgkfjfhffgfgfgfggfffffffgfgfgfgfggheicjcmeperetcuevdvdvewfxgxgyhyi{jzlznzozq{q|q|n}n}n~m~m~m~m}m}m}m}m}m|n|n}n|n|n}n}m}m}m}n}o}o}m}n}n}n}m}m}m}l}o}o}n}n~n~m~m~m~m~m~m~m~m~m}m}m}m}m}m}n}n}m}m~m~nn~n~m}m}l|k|k|l}l|m|m|n|n|n}n}m~n}n}n~nml}l{juiqhmgifhghggggghghghghghfhghghfhfhfhghghggggggghfhghghghhhhghghgggggggghghghghghghghgghghghghghghhhhghghhhhhiihhhihihihjhjhjhkgkgkgjgjgigighghhhhhgigigjgjgjgkgkgkgkgjgjgjgjgjgjgjgkgkhkhkhjijhihjhjgjgkgkglglglglgkgkhkhkhkikhkhkhjhjhjijijijijikikikhkhkhkhlglglgmgmgmglhkhkiiihjhkhkhkijijjikikikikikikikikililililhlhlglglgmgmgmgmgmhmhmhmjljljkjkjjjkikikjkjjjjjjijhkgkglhjhjikikjkjkjkjkkkkkjkikikhlglglgnhnimimjljkjkikjijijijijjhjgkglilikjkjkjkjkilimgngmgkgjgjgjgkglglgkgkgjgjgjhkhkikhkhkhkhkhkhkgkijijijiijijijijijjjjjjjjijijijijijijijikikhkhkhlhkhkijijjikhkhkhjijijijjjjjjjkjkijijhkhkhlhmhnhnhmhlhlilikikjkjkjjijijikikililhlglgmhmhnhmhmhlhlikikikikikhjhjhjhihihiiiiiiiijijjjijijijhjhjhjhjikijijjijijhjhjhihihihihihihihihiiiiiihhhhhhhhhhihihihhhhhhhhhhhhhhhhhhhhhghghghhihihihihihihihighghghgggggggggghfhfhfhfhgigigigigigigigigifififhghghgghghghggggigigjgjfjfjfififhghghghghghghghghghfififififhfhehfhfhfhfhfhfhfhfffgfgfgggggfgggghfhfhfhfgfgfgfgfgfgfgfgfgfhfhfhfgegegegfgfgfgfgfhghfhfhfgfgfgfgeemfshyk}m|o|p|p}o}o}o}o}n}n~n~n~n~n}m|l|k}j|iyiwhqgngkghfffgfhejdjdjejejejejejejemcnbqcufwgygzgzh{h{h{h{i{j{k{l{l}l|m|n{n{o|o|o}n~n~nmmmm~m~n}n}n}n}n}n|n}n}n~m~m~m~m~m~n~n~m}m}n}o}o}o~n~n~o~o~n~n~n~n~n~nn~n~n~n~n~n}n}n}n~m}n}n}n}n~o~oq~q~o~n~m~l~k~k~l|m}n|n|n|n|n}n}nn~n}n~m~l}kzkwhrgofkfhfhfhggfgggghfhghghgigigifhfhfhfhghggggggghghghghhghghgighgggggggggggghghgggggggggggghghgggghghghghhhhhiiihiiiihihjhjgjgkgkgkgjgjgigighghgigigigjgjgjgjfjgjgjgjgjgjgjgjgjgjgjgkgkhkhkhjijhjhjhjgjgkgkgkgkgkfkgkgjgjhjhjhjhjhjhjhjhjhjhjhjhjhkhkhkhkgkgkhlglglglgmgmglhlhkhiiiiijhjijiijijililililikikikikililililhlhlglglgmgmgmgmgmhmhmhmjljkkkkjkjjjjkikikijjjjjijikhkglikjkjkjkjkjkjkkkkkkkjkjlilhlhlglhnimjmjmjljljkjkkhkikikjjkikikhkhkikijjjjkikilhlgmglgkgigigjgkglglglgkgjgjgjhkhkijhjhjhjhjhjhjgjhiiiiiiijijikikhjjjjjjjjijijijijiiijijijikhkhlhlikijijjijikhkhlhjjjjjjjjjkjkikikhkhlhlhlgmgmgmgmhmhmhmilililjkjkijijijikikhlhlhlglglgmgmhmhmhmhlilikikhkhkhkhkhkhihihiiiiiiiiijijijijiijijhjhjhjhkhjijiiiiihihihihihihihihhhhhhhiiiiiihihhhhhhhhihihihhhhhhhhhhhhhhhhhhhhhghghghghghghgigigigigighghghgggggggggghehehfhfhfigigigififififififififigigighhhhhhhghgjfjgjgkfkfjejejehfhfhfhfhghghghghfififififififhehfhfhfhfhfhfhfhfggggfggggggggggghehehegfgfgfgfgfffffgggfgfgfhfhfhegegegfgfgfgfgfgfgfgfgfgfgfgfgegjhqjxk{n|n{o|p~o}o}o}n}n}n}n}n}nn}n}m}l}k}k|jzjwithogkeidjclbncpcpdpdpdpdpepepdscucxfzi{k{lzlzl|l|l|l|l|m|n|n|n|n}n|n}n}n}n~nnnnmmmmmm}m}n}m}n}n}n}n}mmmllllml}m}n}o}p~o~o~n~o~o~n~n~o~nnnn~n~n~n~n~n}n}n}n~n~n}m}n}n~ops~r~p~n~m~lkkm}m}n}n|n}n}n~m~nnn~m~m}l{kwjtgqfnfkfifififhggggggghfhgififjfjehehfhfhfhggggggghghhghghghgigighfgfggfgfgfgggggggggggggggggggggggghghghghhhhhiiihiiiihihjgjgjgkfkfkgjfjgigighhhgjgjgjgjfjgjgjgjgjgjgjfjgjgjgjgjgjgjgkgkhkhkhjijhjhjhjgkgkgkgkgkgjgjgjgjgjhjhjhjhhhihjhkhkgkgkgkhjhkgkgkgkgkgkglgkglglgmgmglhlhlgjhjijijijijikhkhlhlhlililikikikimimililhlhlglgkgmgmgmgmgmhmhmhmjlkklkljljkjjjikikijijijijikhkhljmjmjljljlklklkklkklkljmimhmhmhlimjmjmkmklkljljljjjkkkklklkljkjkhkhkijijijikhlhlikijhihigigjgkglhmglglgkgjhihiiijijjjjikikhjhjhiijjjjjjijijijijiijijikikikikijijhjhjhjhjhkhkhkhkhjijjjjjjijijiiijjjjijijhjhjijijikikhlhlhlglglglililikikikjjjjjjijijjjjjikhkhlglhlhlglglglhlililikikikhkhkgjgjgjijijijijijijiijijijijiiiijhjhjhjhkhkhjhjhihhhhhhhhhhhhhhhhhhhhihihihihihihihihihigighgghghghhhhhihihihihihhhhihiihihhhhhhhghghghghghghgggggggggghehehfhfhfhghghghfhfhfhfhfhfhfhfhghghghghgigigigigigigigifieieidifififififigigighfhfhfhfhfhfhfhfhfhfhfhfhfgfgfgfffffgfgggggggggghfhfhfgfgfgfgfgfffgfgfgfhfieiejehehehegegfgfgfgfgfgfgfgggfgfgfgfgghmjumyn{o{o|o~o}n}n}n}n}n}n}n}n}n}n}m|m}l}l|k{mylvisgqdpcqcsbuewewfwewdwdwfwhwfzgzi{l{n{o{ozozo{o{o{o|n|n|o|n|n|n}n}n}n~m~n~nnnnmmllkl~l~l~m~n~n~n~n~m~m~m~m~m~m~m~m~mm~n~n}n}n}n~n~o~o~o~o~o~n~n~m~n}n}n}n~n~n~n~n~n~n~nmnnnorq~o~nllkklm~m}n}n}mllonm~l}k|jyjtjphmhmhlgkgjghggggggggghghfifififjfhfhghggfggggggggggghghgigjfjfjfgfgfgffgfgfgggghggggggghghhhhhhhghghghghghghgihjhihihihhhigigjgjgkgkgkgjgjgjgjgjgjgjgjgjgjgjgjgjfjgjgjgjgjgjgjgjhjhjhjhjhihihihigigigjgkgkgkgjgjgjgjgjgjhjhihihiiiijijhkhlglglgkgjgjgjgjgjgkglglhlhlhlhlhlhlhlhlhkhkhkhkhkhkhkhkgkhkhkikjkjkjkjkkmjmilhlhlhkhkhkgkglhlhmhmhlhlhkjkjkkkkkkkkjjjjjjjjjijikikililjmjnjnjmkmklklkkkkllllkmjmjmimhlhkhkhkikikikilimhmilimimjmjmklkkkkikikijijhkhlhmgmikhkhjhihihjhkglhlglglgkgjhjhiiijijijijjijiihihiiiiiiijijhjhjhjhijijikikikikikijhjhjhjhkhkhkhkhkijijijjjjjjjjjijjjjjijijhjijijjjikikikikhkhkhlhlikikijikijijijjjijijjjjjjjikhkhkgkglglglglglhlhlikikhkhkhkgjgjgjhjhjhjhjijijiiiijiiiiiiihihjhjhjhjhjhjhihihhhhhhghhhhhhhhihihiiiiiiiiiiiiiihihihigighgghghghhhhhigigihihihhhhhhhhhhhhhhhghghghghghghgggggggggfgfhehfhfhfhfhghghghfhfhfhfhfhfhfhfhghghgigigigigigihigigihigifieiehfhfhfhfhfhfhfhfieieififififififhfhfhfhfhfgfgfgfgfgfgfgfgfgghghghfhfhfgfgfgfgfgfgfgfgfgfhfheieiehehegegfgfgfgfgfgfgfgfgfgfgggggggehijplvnyn{o|o~o}n}n}n}n}n}n}n}n}n}n}n|m|l|l|l|nylxjvhufufvfxfyjzkzjzizgzgzizkzkzl{m{o|o|p{o{ozo{o{o{o|n|n}n}n}n}n}n}n}n~n~n~n~nnnnmllll~l~l~m~m~m~n~n~n~n~n~n~n~nnnmm~m~n}n}o}o}o~o}o}o}o}n}n}n}m}m}m~m~m~m~m~m~mn~n~nmnnnoqponmmllkkllllllnnl}j}jziwiqhmhkhkhjhihhhghghghghggghgghghfhfhghghghgggggggggggggggghgigifjfjfhgggggfgfgfgfgggggggggghghhhhhhhghghghghghghgigjhihihihhghgigjgjfkfkfjgjgjgjfjfjgkgjgjgjgjgigigigjgjgjhjhjhjhjhjhihihihihjhjhjhjgigjgjgkhkhkhjhjhjhjhjhjhjhjhjhjijijikhlhlglglgkgjgjgjgjgjgjgkglhkhkhkhkhkhkhlhlhkhkhkhkhkhkhkhkhkhkikjkjkjkjkjkjmjlilhlhkikikijhjhkhkililikikijjljkjkkkkkkkjkjkjkjkikhkhlhlimimjnjnjmjmkljkkkkklkkkkljlililhlhlfkgkhkikikilimimilimimjmjmjmklkljkjkjkjkililimimhlhkhjhjhjhjhkhlhlglgkgkgjhjhjiikijijhjhjhihiiiiijijiiiiiijijijijjjjikililhlhkhkhkhkhkhkhkhkhkhkjjijijijijijikikjjijijhjijijjjjjijijijijijikikikjjijijijijiiiiiiijijjjjjjjjjijijhkhkgkgkglglglglhkhkhkhkgkgjgjgjgjgjgjhjhjhjhihihihihihihihigigihjhihihihhhhhhhhghhihihihjhjhjijijijijiiiiiiihihigighgghghghhhhhigigigigihhhhhhhhhghghghghghghghhghghghghfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfifigigigigigigjgihihihihihigifiehfhfhfhfhfheheheidieieieififififhfhfhfhfhfgfgfgfgfgfgfgfhfhfhfhfhfhfhfgfgfgfgfgfgfgfgfgfgfhehehegfgfgfgfgfgehehegfgfgfgfgfgfgfgfgehgikkqlwm{n}n|o}n}n}n}n}n}n}n}n}n}n}n|m|m|m}m}n{mzkzjyiyizj{k|m|n|m|l|j|k|l|n|o{p|p|p|p|p|p{p{p|p|o|o|n}n}n}n}m}n}n}n}n}n~n~n~nnnnmmmml~l~m~m~n~n~o~o~n~n~n~nnnnnmnn~o}o}p}p}q}o|o|n|n|n|m|n|n|m~m~m~m~mmmmm~n~nnnnnnoooo~oonnkkkllllmon~l}j|i{hxgsgohmhkhjhihhhhhhhhhghghghghghghhhhghghgggggggggggggggggghghghgigighgggggggggggggggggggggghghhhhhhhghghghghghghgigjhihighghghghgigifjfjfjgigigigigigjgjgjgigighghghhihihihihihiiiiiiiiiiihihjhjgjgjgjgjgkhkhkhkikikijijijijijijijijikikilhlhlglgkgkgjgjgjgihjhjhjhkhjhjhjhjhkhkhkhkhkhkhkhkhkhkhkhkhkikjkjkjkjkjkjkjlililikikjjjjjjjjjkjkililikikijililjljlklkljljljljlilhmhmhmhmhmimimimjljljkjjjjkjkjjjjkikhlhmgmflglgkhkikililimilimimimimjmjmjlkkkkjljljmimimimhmhlhkhjijijikilhkgkgkgkgjhjhjijkjkjkijhjhiiijijikijijijijijijjjjjjjikililhlhlhlhlhlhlhlhkhkhkhkjjjjijhjhjhkhkikiiiihihiiiiijijijjjjjjjjjjjjjjjjjijijiiiiiiiiiiiijijjjjjjjjjjjijijijhkgkgkglhlhlgkgkgkgkgkgjgjgjgjgjgjgjgjhjhihihigigigigighghghiiiiiiihihihihihgihihihjhjhjhkikijijijijiiiiihihigighgghghghhhhhigigigigighhhhhhghghghghghghghghhghghghghghfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfififigigigjgjhjhhhhihihhhhhghfhfhfhfhfhfheheheheidididieieifififhfhfhfhfhfgfgfgfgegegfhfhfhfhfhfhfhfhfgfgfgfgfgfgfgfgfgfgfgegegegfgfgfgfgehehehegegegfgfgfgfgfgfhghgiijokvl|n|n{o|n|n|n|n|n|n|o|n|n|n}n}n}n}n|n|m|m|l|k{k{l{m{n{m|m|n|m|k|l|n|p|p|p|p}p}p}p}p|p|p|p}o}o}n}n}m~m~m~m~m}n}n}n}n}o}n~n~n~n~n~n~n~n~n}n}n}n}o}p}p}p}m~m~m~mmmmmnno~o}p}p|q|q|o}n}n}m}m}m}n}n}m~m~m~mmmmmm~m~nnnnnnooop~p~p~o~olllllmnno}n}m}k~j~h|hwgugpgoglgjhihihihihhhhhhhhhhhhhhhhggggggggggggghgggggggggghghhhhhhhhhhghggggggggggggggggghghhhhhhhghghghghghghhigjgjgighghghghfhfheifififigighhhhhghghghghghghghghhihhhhihihihihihihiiiihihjgjgjgkgjgjgkhlhlilikikjjjjjjjkikikikikikililhlhlglgkgkgkgjgjhihihihjhjiiiiiiijijikikikikikikikikikikikikikjkkkkkjjjjjjililikikikjjkjkjjkjljljmjmililikhlililjlkmkmjmjmkmjmimhmhmgngnhnhmimililikikijjjkikijiiiijhlgmgnglglhlhkhkhkhlhlilimimininininimjkjljmimimimhmhlgngmgmglhlhkhkhkikhkhlglglhlhkikkjjjjijijijiijijhkhkhjhjhjhihihihkhkhkhkhkglglglhkhlhlhlhlhkhkhjijhjhjgkgkgkgkhkijijhjhjhjijjijijjjjjjjjjijijijikjkjjjijhihihigihjhjijiiiihihihihihihihjhkgkhlglglglglgkgkgjgjgjgjgjgkhkhkhjhjhiihhhhhhhhhhhhhgijhihihihihihihihhjhjhjhjhjhjhjhkijijijiiiihhhhhhighghhhhghghghghhghghghghhghghghghghghghghghghghggggggggggggggggigigigigigigigighfhfhfhfififififjfjfjgjgigigihihhhhhhhhghghghfhfhfhfhehehegegfgfheieiejeififhfhfgfgfgfgegegegegfgegegegegegegegegfgfgfgfgfgfgfgegfgfgfgggfgfffffgggfgfgfgegehehdhfhfhfhfhfhfhfhfhfgfhhhmhsjyn{q|o|n|n|n|n}n}n|o|n|n}n}n}n}n}n|n|m}l|l|k{k{l{m{m{n|m|n|m|l|m|m|n|n|n}o|o}o}o}p}p}o}o}o}n}n}m~m~l~l}l}m~n~n~n~n~o~n~n~n~n~n~n~n}n}n}n}n~n~o~ooom~m~mllmmmnno~p~q}p|p|p|o}n}k}j}l}m}n}n}m~m~m~m~m~m~m~m~mmn~n~n~o~oooooooooommmmmmmm~n~nml~k~j}j|i{eydwdseoglhkgjfjgigigihhhhhhhghghghgghghghghghggggggggghghhhhhihihhhhhhgggggggggggggggghghghghhhgigigihihihihjgjhjhihhhhggggfgfhfhfhfhghghhhhhhhhhhhhihigigjgjgjhkhjgihhhhihjhjhiiiihihihihihihigjgjgjgjgjhkikjkjjikikikhkhkhkglhkhkhlhlhlglgkgkhjhjhjijijijijijjjjjijikhkhkhkhkhkikijjjjjkikikilklkkkkkkjjjjjjjjjjjjjjkikikililimjmjmjmimimimhmhmimjmkmkmkmkmjmjmjmimhmhmhmhnhnhnhmhmhlhlilililklkkkjjjijikhmhnhlhlhlhlilikikikjljmiminhnhnhnhmhmhmhmgmgmgmglglgngngngmgmglhlhkikhlhlglglhlhlikjjjjjjjijijjijijikikikijijhjhjhihkhkhkhkgkglglglgkhlhlhlhlhkhkhjijhjhjgjgjgkgkhkijijijijijijijjjjijijijijjjjjjjjkjjjjjijhihigigihjhihiiihihigigihihihihjgjgkgkgkglglgkgkgkgjgjgjgjgjgkhkhkhjhjhiighhhhhhhhhhhhgiiiiiiiiihihihihihihihihihihihihiijiiiiiiihhhhhhhihihhhhhhhgigigighghghghghghghghgigigighghghghghgggggggggggggggghghghghghghghghgififififififjfjfifigigigigigighhhghghghghghghghghfhfhehehegegfgfhfhfifififififhfgggfgfgegegegegfgegegegegegegegegggfgfgfgfgfgfgegfgfgfgfgfggfgfgffffffgfgegegegehfhfhfhfhfhfhfhfgegegfgkgqiwmzp{n|n|n|n}n}n}n}n|n|n}n}n}n}n}n|n|n|n|n|m{m{m{m|n|n}n}n}m|m|m}m|n|l|l|m|n}n}o}o}p}n}n}n}n}m}m~m~l~m}m}m}n~n~n~n~n~n~n~n~n~n~n}n}n}n}n}n~n~n~nnnnmm~m~m~m~m~n~nnoop~p~p~p~o~m~k~j~l~m~m~m~n~n~n~m~m~m~m~m~mmn~n~n~o~oooooooooooooooo~o~o~mmmmll~l}l}h~e}c|cyevgqgnglgjgigihhhhhghghghghgghghghggggggggggggfhfhghghhhhghghgggggggggggggfgghghghghghghgigigihihihigjgjgjgihhhhggggggfhfhghghghghhhhhhghhhhhihihihjgjgjgkgjgighghhhhhihhihihihihihigigigjgjgjgjhjhkikjkijikikikhkhkhkhlhkhkhlhlhlhlgkgkhjijijijijijijjjjjjjjjijijhjhjhjhkhjijijjjkililikkkjkjkjjjjjjjijjijjjjjkikilimimimimhmhmhmhmhmhmimimjmkmkmklklkljljmimhmhmhmhmhmhmhmhlhlhlhlhlhmmllkljkjjjjkjmimjljljljlilikikikimiminhnhnhngmgmgmgmgmgmgmfmflflgngngmgmglglhkhkilhlhlgmgmhlhlilikikikijijikjkjkjljljkikikikhjhjgkgkgkgkgkglglglgkglglglhlhkhkijijhjhjgjgjgjgjhjikikikijijijijhjjijijijijjjjjjjjjkijijijhigighghgigihihihighghfhgigigigjgjgjgjgjgkgkgkgkgkgkgkgkgjgjgkhkhkhjhjhiighhhhhhhhhhhhgihihihihihigigigigigihihihhihihihiiiiihihihhhhhhhihihihhihihigigigigigighghghghghgigigigigighghghggggggggghghghghhhhhhhhghghghghghfhfifififififififighghghghghghhgggggggggggggggghfhfhehehegegfgfgggfhfifififiehegggfgfgegegegegfgfgfgfgfgfgfgfgfgggfgfgfgfgfgfgegfgfgfgfgfgfffffffffffffffgegegehfhfhfhfhfhfhfhfgegdgdghgnislwoyn|n|n}m}m}n}n}n}n|n}n}n}n}n}o|o|o|o|o|o|n|n|n}m}m}n}n}n}n}n|n}n}l|l|m|n}n}n}o}o}n}n}m}m}m}m~m~m~m}m}m}n}n}n~n~n~n~n~n~n}n}n}n}n}n}n}n~n~n~nnnnnn~n~n~n~n}n}nnnn~n~o~o~o~p~n~l~l~m~n~m~l~n~n~n~m~m~m~m~m~nn~n~n}n}n~n~oooonnnnnpppp~p~p~p~p~mmnnnnn~n}l~j~g~f}gzgvfrfofkfjfjfjfifighghghghfhfhghggggggggfgfgfhfhfhfhfhggggggggggggfgggghghghfhghgigigigigihihihigigjgjfjgighghhghgggghfighghghgghghghgihihiihihihjhjhjgjgjgifhfhghghhihihihihigigigigigjgjgjhjhjhkhkhkijikikhkhkhkhkhlikikilhlhlhlhkhkijijijikjkjkjkjkjjjjjjjjijijijhjhjijijjjjjkjkjkjjkjkjkjjijijijijijijikikjljljmjmimhmhmfmgmgmgmhmimjmjlkllllkkkkkjljlilhlhmhmhmhmhmhlhlhlglglgmgmklklkkjkjkjlilililjljlililikikjkhmhmhnhngngngmgmfmfmfmgmgmgmglglgmgmglglgkgkhjhjilhlhmgmgmhmhlilhlikikikikikjkjljmjljljlikikhkhjgkgkgkgkgkglglglgkglglglhlhkikijiihihjgjgjgjgjhjikikjkjkikijhjgjihiiiiiiijijijikikikhjhjhigighghgigigighghghfhfhgigigigigjgjgjgjgkgkgkgkgkgkgkgkgjgjgkhkhkhjhjhiighhhhhhhhhhhhgihihigigigigigigigjgjgjhihiiiiiiiihihihihihhhhhhhjhihiiiihihihigigigigigighghghghgigigigigigighghhghghghhghghghghhihhhhhhhghghghggggggghghghghghghfhghghgggggggghggggggggggghghghhfhfhehehegegfgffggghghfififiehegggfgfgegegefeffgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgegegegfgffffffffffefefeffffffgfgfhfhfhfhfhfhfhfhfgggegdgfgjhpltnvn|n}n}m}m~n}n}n}m}n}n}n}n}n}o}o|n|n|o}o|n}n}m}l~m}m}n}o}o}o|n|n|n|n|n|n}n}n}n}n}m}m}m}m}m}m~m~m~n}m}n}m}m}m}n}n}n}n}n}n}n}n}n}n}m}m}m~n~n~mnnnno~o~o}n}n}n}m}m}m}m}n~n~o~o~q~o~n~n~n~o~n~m~m~n~n~m~m~m~m~m~n~n~n}n}n}n}n~n~nnnnnnnnpp~p~p~p~p~p~p~o~o~oooo~o~o}pnnm~m|jzfycwdndmdldkdjejeieififjfififighghggghggfgfhehehfhfhggggggggggggggggfhghghghgifigigihihihihihigigjgjfjfighghhghghghhfigighghgghghghgihihiiiihihjhjhjhjhigighghghgihihihigigigigigigigjgjhjhjijhkhkhkhjhkhkhkhkhkikilikikililhlhlhkhkijijijjkjkjljljlkjjjjjjjijiiiiiijjjjjjjjjjjjjjjjjljlilikikhkhkhkililililjljljkjkjmimhmgmgmgmhmimimjlklkllklkljkjjljlilhlhlhmhmhmhlhlhlglglgmgmgnilililhlhlhlglglglglhlhlilikjkjkhnhngngngngmgmglfmgmgmgmgmhmhlhlgmgmglhkhjhjhjhjhlhlhkhkhkhlhlhmilhlhmhmhmhmhliljlklkljljkikhjgjhjhjhjhkgkgkgkgkglglglhlhlikijijhihihihjhjhjhjhkjkjkikikijhjhjhjijiiiiiiiiijhkhkhkhkhkhjhjhihihihihihihigigigigififigigigigigigihjhjhjhkgkgkgkgkgkgkhkhjhjhjhihihhhhhhhghgghghgigigigigigigigigigjgjhjhihihiiiiihhhiiiiiiiihihigihihjhjhiiiihihigjgjgjgihihihihigigigighghghghghhghghghgghghghgighghghggggggggggghghggggggggggggggggggggggggggggggggghghghghghhggfgfgfgfgfgfgfgfgggggggggfgfgfgfgggfgfgfgfgffefegfgfgfgegegegegegfgfhfhehegegegegegegegfffffffffffffffffffffffffgfgfgggfgfgfgfgfhfgfgegegghljrkwo}n}n~m~mn~n~o}m}m}m}m}m}m}n}n}m~m~m~m~m~m~m~m~m~m~n~o}o}o|o|n|o|o|o|n|n}n|n}n}n}n}n}m}m}m}m}n}n}n}n}m}m}m~m~n~n}n}o}o}o}n}n}n}m}m}m~n~n~n~n~n~o~o~ooon~n}n}m|m|m}m}n}n}o~o~p~pooo~o}n}n}mnnno~n~n~n}n~n~n~n~n~n~n~n~lmmnnnnoppoooopp~p~oonnnno~oppp~o}l}i|g{ductbrbpcnenemdnfmfkfifhfigjgighgighfhfhfhfhfhfggggghghghghgggggfhghghghghghgifiihihihihhihihihjghghghghghghghhhghghghghgggghghgihihihiiiiiihjhjijiiiihhghgigjgjfjgjgigihhgigigihihihjhjhjhjhjhkijijijijijijjjjkijijijikikikikikikikikikikikililililikikijiiiiiiihiijijjjjjkikilikikililililililhmilililjkjkjkjjhkhkhkgkhkhkikikklkljljkjkkkkkkkjlimimhmhmhmhmhmilhlhkgkgkhlhlimikikilimhmhmglglflflgmgmgmhmhmimhngnhnhmhmhmhlhlgmgmhmglglhlhlhlglglgkhjhjhjhjhjikikijijijikikikilhlhmgmgmhmhliljljljljkjkikhkhjhjhjhjhjhjhjgjgjgkgkhkhkhkijijiiiiiiiiijijikikikjkjkikikikhjhjhjikikjjjjjjikhkhlhkhkhkhjhjhjhjhjhjhjhjhjhihihihigigigigigigihihihjhjhjhjhkhkgkgkhkhkhkhjhjijiiiihihihhhhhhghghgihihihihihihihihihjhihihihihihihighgigigihihihhhhhhihihihihihhhhhgigihihihihihihigigigighghghghghggggggggggghghghghghghggggggggggggggggggggggggggggggggggggggggggggggghghghgggghggfgfgfgfgfgfgfgfgggggfgfgfgfffgfgggggggfgfgfgfgegegegegegegegegdgegehehehegegegdgegegeffgfffffffffffffffffffffffgegfgfgggggggfgfhfgfgfgegfhiipito|n}n}n~n~n~n}o}m}m}l}l~l~l~l~m~lmmmmm~m~m~m~n~n~n}n}n}n}n}p}p}o|o|o|o}o}o~n~m~m~m~m~n}n}n}n}n~m~m~m~m~m~n~n~n~o~o}o}n}n}n}m}m}m}n~n~n~n~n~oooonnnn~m}m}m}m}n}n}o}o}p~p~ooo~n~n}n}n~n~o~o~p}p}o}o}n~n~n~n~m~m~m~m~lmmnnnnopooooo~o~p~ponmmnnoppqpo~n}k|j|gzfzdxdvfufueucufqfngjgigigighgggighghghghghghgggggghghghghgggggggggghghghghghghigigihhhhhhihihihhhhhhhhghghghghghghghghghghhghgihihihiiiiiihjhjijijhihigigigigjgjgjgihhhhgigigihihihjhjhjhjhjhjiiiiiiiiiiiiiijiijijijijijijijijijijikijikikikikikikikijijiiiiiiihiijijijjjkjkjkikikikikililililililikjkjkjkjjkjijijhkhkhkikjkjkkljljlikikjkjkjkjljlilhlhlhmhmhmilhlhkgkgkhlhlimjkikilhmhmhlhlhlhkhlhmhmhmhmimjlhmhmhlilikikikikhlhlhlhlikikikikgkgjgjhjhihihjhjijijiiiiiiijijikilhmhmgngnhmhmiljkjkjkjkjkikikhkijijijhjhjhjhjhjhihihjhjijijjijiiiiiiiijikikililililikikikikikikiljkjkjjjjijikhkhjhjhjhkhkhkhkhkhkhkhkhkhjijiiiigigigigihihihihiiiiiiihjhjhkhkhkhkhkhkijijijiiiihjhjhihhhhghghghhhhhhhhhhhhhhhhhhihihihihihhhhhhfhfhgigjgjgjgigigihhhhihihihhghghhhihihihihigigigigigighghghghghfgfffggggggggghggggggggggfgggggggfggggggggggggggggggggggggggggggggggghghghgggghghfhfhfhfhfhfhfhfhfhfhfgfgfgfgfgfgfgfgfgfgfgfgfgfhehehehehdhdhdhdgegehehehdgdgdgdgegegegfffgfgfffgfgfgfgfgfgegegegegegfgggggggfgfhfhfgfgfgfgigogsnzn{n|o|o}n}n}n}m}m}l~l~k~klllllmm~m~m~n}n}n}n}n}n}n}n}n}p}p}o|o|o|o}o~o~mmmlmnn~n~n~m~m~m~m~m~n~n~n~n~o~o~o~n}n}n}m}m}n}n}n}n~o~o~o~nnnnnnnm}m}m}m}n}n}o}p}p}p~o~o~o~n~n}n}m~n~o}o}p}p}p|o|n~n~n~m~m~m~l~l~lmmnnnnooonn~n~n~o~o~oonmmmnnp~p~ppon~m~l}k}i}h|i|j{i{gzfzfwfsgmgjgigighghgighghghghghfhgggggghghghghgggggggggggggghghghghhghghghhhhhhhihiihihhhhhhhghghghggggghghghghhhhhihihihiiiiiihjhjijhjhjhjgigighghgihihhhhhhhhgigihjhjhihihihihihihghghhihihihihihijijijijijijijijijijijijijijijijijijijijijiiiiiihiiiiijikjkjkjkjjkjkjkjkikikililikikjkjjjjkjkjkijijiijijijjjjjjkklkljlikikikikjkkkjkikikhlhlhlililhlhkgkgkhlhlimjljlilhmhmhlikjkjkjkjlimimjmjlkljljljlikikikijijhkhkhkikikijijijgjgjgihihihihihjhjhjhjhihjhjhkhkimhmhmgngnhmhmimikjkjkjkjkjkikikijijijijhjhihihihhhhhiiiiiiijhjhiiiiiiijikilimimililililikikikikikjjjjjijijiijhjhjhjhjhkhkhlhlhlhlhlhlhkijijiiiigigigihihihihihiihihiiiihjhkhkhkhkhkikijijijiiiihkhjhihhhhghghghhhhhhhhhhhhhhhhhiiiihihhhhhhhhhhghghgigjgjgjgjgigigihhhhigighghghhhhhhhhghgigigigigigighghghghghgggggggghghgigiggfgfgfgggggggggfgfgfggggggggggggggggggggggggggggghggghfhfhgggghghghghghghghghghgifhfhfhfgfgfgfgfgfgfgfgfgfgfhfhfhehehehdhdhdhdhdgegehehdhdgdgdgdgegegegfgfgfgfgfgggfgfgfgegegdgdgdgegfgghggggggghfhfhgggghflfpftmynzn{o|o|n|m|m|n}m}m~l~lllllllm~m}m}n|n|n}m}m}m}m}m}n}n}o}o}o}n}n}n}n~n~mlllmmmnnmmm~m~n~n~o~n~n~o~o~o~n~n}n}n}n}n}n}n}n}o}o}n}o}n~nnnn~n~n~n~n}n}n}n}o|p|p}p}o~o~o~n~n~n~lm~m~n~o}o}o}o|o}o}n}n}m}m}l}l}l~m~m~n~nnnooo~n~o~n~n~o~o~o~nnmmmnn~o}o~o~oonm~m~m}l}k}l}m}m}k|j|f|fxgqfmfjgigihihighghghghghghgggggghghghghgggggggggggggggggghghgggggghghhhhhhhiihihihhhhhghghghggggggghfhghhhhhihihihiiiiiihjhjhihjhjhjhjgighghhhhhhhihhhhhgifjgjgjgigigigigighhhhhhhhhhhiiiiiiijijijijijiiiiiiiiiiiiiiiiijijijijijijijiiiiiiiihihiiikikilililikjkjjkjkikikikhkikikjjjjkjkikikijhjhjiiijjjjkjkjllllkljkjkjkjkjkkkjkjkikhkhkilililhlhkgkgkhlhlimkljlimhmhmiljkkkkkkkkljmjmjmklkljmjljljljkikikijhkhkhkhkhjhjijijgngmgkhjhihigjgkglgkgjhihiijikilimililhlhlhlhlhmilililililhlhlhlgmhlhlhkhkhjhjhiijiiiijijhjhjhjgjhjijiijikikilililililikikijijijjijijijiiiiiiiiiiiijijijhkhkhlhlgmglglglhkhkhkijhihihjhjhjhihhhhihihihiiijhjhkhkikijijijijijjijiikhkhjgigighghhhhghhhhhhiiiiiiiiijiiiiiiihihihigghghghghghgigigihhhhhghghghghghghhhhhhhhgigigigigigighghghgggggghghggggghggfhfhfhghghfhghghghghfgggggggggggggggghghgggggggggggggghfgggfgfhgggggghghghghghghfhfhfififieiehehegfffffffgfgfgfhehehehehehdhdhdhdhehegegegegegegegegegegegegehehehehegggfgfgfgegegdgdgegfgfgghghfhfhfhfghgkgngogrhuhwmznzn{n|n|m|l|j|m~m~m~m~m~m~m~m~m~m~n~n}n}n|m|m|n}m}m}m}m}m}n}n}n}n}n}n~n~n~n~n}lmmmmmmmnmnnn~o~o~o~oo~n~o~o}n}n}n}n|n|n|n}o}o}p}p}p|p}o}n}n}n}n}n~n~n~n}n}n|n|o|p|p}p}q}p}p}o~n~nkllm~n}n}o}o|o}o}n}n}n}m}n}m}m}n~m~n~nnnnnn~n~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~oonnnmmn~n~n}n}n}k|i|fzetdmeighhigigighhgggggghfhgggggghghghghghgghghghghghghghghhhhhhhhhhhghgigjhiiiiiihhhghghghghghfhfhghhhihihjiiiiiiihihihigjhjgjgjgigighghghhhhhhhhhgigigigigigigigigighghghihihihjijijiiiiiijijjjjjjiiiiihijjjijijhjhjiiihjhiiiiijiiiiihihjhihjijijjjkjlimiljkjjjjjijijikikikjkjkkjljljkikilikijiijijjkkllllllllllklkljljljkjjjjjijikjkjkkkjkikikhlhmhmhminimhmhmhliljklkmkmjmkllllkmkmkmjmjmjnjmimilhlhlhkhkikikjkikilhmgmfognglhkhjhjgjgkgkgkgjhjhjijikikilikikijijhkhkhlhlhlhlhlhlglglglgmglglgkhkijijjijijiiiiiihihihihjiijijijijikikikhkhkhkhkhkhjhjhjiiiiiiiiiiiiiiiiijijijhjhkhkhkhkglglgkgkhkhkhjijhihihjhjhjhjhihiihihihiiiihjhjhjijijijijijijjijiijijhjgigighhhhhhhhhhhhhhihihihiiiiiiiiiihihihihhhhhhhhhghgigigihhhhhghghghghghghhhhhhhhhhhigigighghghghghgghghgighghggfgggghghghghghghghfhghghggggghghghghghghghfhfhfhgggggggggggggfgfgfgfggfgghghghghfhfhfhfhfhfieieididhegegfgfgfgfgfgfhehehehfhehehdhdhehehfgfgfgfgfgfgfgfgfgegegegegegegegegfgfgfgfgfgegegegfgfgfgfgfhfhfhffgfkfqguhviwjwjxnzn{n|n|n}m}l}k}m~m~m~m~m~m~m~m~n~n~n~n}n}n}m}m}n|m|m|m}m}n}n}o}o}o~o~nnnnn~mmmmmmnnnnnno~o~o~o~p~p~p~o}o}o}n}n|n}n}n}n}o}o}o}o}p|p}o}o}n}n}n}n~n~n~m~m}n}n}o|o|q~q}q}q}q}p}o~n~lmmn~n}n}o}o|o}o}n}n}n}n~n~n~n~n~n~n~nmnnnnnn~o~o~o~o~o~o~ooooo~o~o~o~o~o~oonnnnnnn~n~n}n}kj~h|gwfrfmfkfjgggggghghgggghghgggghghghghghghgggghghghghghghghhhhhhhhhghghgigjhihihihihigigighghghghghhhhhihihiiiiiihihihjgjgjgjfjfjfifififighhhhhhhgigigigigigigigigigigigigihhiiiijijiiiiihjijijjjjjjjijhjhjijijjijijiiiiihjhihiiiiiiijjijjjiiijijikikjjkjkjkjjjijhjhjhkhkhkikikjkkkkjkjkjkilikjjjijikjkkllllllllklklkljljljjjjjjjikikjkjkjkkjkkjkilhmhnhnhnimimhmhliljkkkljnjnkmkllkmjmjmilhmhmhmhlhlhlhlhkjkjkjkjkikhlhmgmgnfngmglgkgjgjhjgkgkgjhjhjijikikjkijijijijijijikhkhkgkgkgkgkgkgkgmglglgkhkijijjijjjjijijijijhjhjijijijijijhjhjhjhjhjhjhjhjhkhkhkhjhjhjhjhjhjhjhjhjhjhjhkhkhkhkhkgkgkgkgjhjhjhjiihihihjhjhjhjhjhjihihihihiihihihjiiiiiiiiiiiijjjjijijhjhihihihihhihhhhhhhhhhigigihihihiihihihjhjhihihhhhhhhgigigihhhhhghghghghghgghghhhhhhhhhhhhhgggggggghghghghgigighgggggghghhhhghghghghghghfhghfhfhfhfifififjfhfhfhfhfhfhfgfgfgggggggggfgggggggfgfgfgfgfgfgfgfhehehdididhdhegegfgfgfgfgfgehehegfgfgegegegegfgfgfgfgfgfgfgfgfgfgegegegegegegegegfgfgfgfgfgfgfgfgfgfgegegfggghgienfrgwizkzlymynyozo{o|n|n}n}m}m}n}n}n}n}n}n}n}n}n}n}n}n}n}n}m}m}m|m|m|m}m}n}o}o}o}o~o~onnnn~m~m~n~n~nnnnnnnoo~o~p~p~p~p~p}o}o}n}n|n|n}n}n}n}n}o~o~o~o|o}o}o}o}n}n}n~n~m~m~m}m}n}n}o}q~q}q}q|q|p}o}o}n~n~n~n~n~n~o~o~o}o}n}n~o~o~n~n~o~o~o~n~nnnnnnnnno~n~o~n~nnooopp~o~o~o~o~oonnnoonnn~n~n~ll~l}k|iygufpdlfggggggghghgghghhghghghghgifififggggggggghghghgihhhhghghghghgigjgigihihihigigigigigigihiiiiiiiiiiiiihihjhjgjgjgjfigififififigifihihihigigigigigigigigigigigjgjgjhihiiiiiijijhjhjhjijijijijijhkgkhkhjijiiiiiihihjhihihiijijjjkjkjkijjjjjkikjkjkjkjkjkikhkgkgkglglhliljkjkkkkjkjjjkjjjjkikikjkjkkllklklklklklklklkjkjkikikikikjljlkkkkjljmiminjnjnjmimhlhlhkjkkjljojnknknlllklilhkglglhlhlhlililillkkkkkjkikilimimhngmgmflfjgighhhgjgkgkhkhkikikijjjjjjiiiiiiiijijhkhkhkhkhkgkgkhkgmhlhlhkhkhjhjhijkjkikikhkhkhkhkikikikhjhjhjhjhjhihihihjhjhkhkhkgkgkgkgkhkhkhkhkgkgkgkhkhkhjhjhjgkgjgjgjhihihiiihihihjhjhkhkhjhjihihihihihhihihiihiiiiiiiiiijjjjjjiiiihihihihiiiiiiihhhhhhghghghhhhhhhihihihjijiihihihhhhhgigigihhhhhghghghghghgghghghhhhghghghggfgfgfhfhfhghghgjgighgggggghghghhhhghhhghghghghghfhfhfififjfjfjfieiehehfhfhfhfhfhggggfgfgfhfgfhfgfgfgfgfgfgfgegegehehdididhdhehegfgfgfgfgfgegegegfgfgegegegegfgfgegegegegegegegegegegegehehehehehfgfgfgfgfgfgfgfgfgfgegefffiflfneufwhykzmyoyqzq{p{p{o|n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}m}m}m|m|m|m}n}o}o}p}p}p}o}o~n~n~n~n}n}n}n}n}n~o~n~o~nnnoo~p~p~p~p~p}o}o}n|n}m}m|n}m}n}n}o~n~o~o~o}o}o}p}o}n}n}n~m~m~m~m~m}n}n}o}o~o}p}p}p|o|o|n}o~o~o~o~o~o~o~o~n}n}o~o~o~o~o~o~oooon~n~n~n~nnnnnnnn~n~nnooppp~o~o~o~o~oonnooonno~o~o~nn~o~n~l~izftdofigighhghghghhgihghghghfififififggggggggghghgigighghghghghghfifjfigigigigigjgjgjgigihiiiiiiiiiiiiihjhjhjgjgjgjgkgifififififififihihihigigigigigigigigigigjgjgjgjhihiiiijijijhjhjhjhjijijikhkhkgkglgkhjhjiihihihihihjhjhjijkjljmkmilikjkkjljljkjkkkjkililhlhlhlhlhlililjkkkkjjjjjkkjkikhkhkikjkkklklklklklklklklkjkikikhkhlililjljmjmjmjmjmkmkmkmjmimhlhlhkijkjljmjmknknlmllljkikgkgkhkililjljljllkkkjkjkjkjljmjmikhkgkfjfjfigigigigjgjgjgkhkhkhlhkhjijjijijiiiiigkhkhkhkhkhjhjijikikhkhkgkhkhkhkikikhkhkhlglglglhmhmhlhjhjiiiiiihhihihiiiihjhkglhkgkglgmgmgmhlhlhjhjhjhjhjhjhjhjgigigigigihhhhhhgigjgjgjgjgjgjgihihihihihihiiiiiiijijijijjijhjhjijhjhihhhhihihjhjijiiihihigigifigihiiiiijijijijihjhjhjhjhihihihihihhigigigifhfhghghghghghghghghggggggfgggghghgigififhgggggghghghghghghhghghghghghfhfhfhfhfifieiehfhfhehfhfgfgfgfgfgggghfhfhfhfhfhfhfgfgfgfgfgehehehehdhdhdgdgehegfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgegegdgdgdhehehehehehehehehfgfgfgfgfgfgfgfgeggghfifjfmfqftfyhzjymznzo{p{p{n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}n}m}m}n|n|n|n}n}n}n}n}q~p~o}n}n}n}n}n}n}n}n}n}o}o}o}o}n}n}n}o}o}o}o}o}q}p}o}n}n~m~l~l~l~m~n~n~o~o}o}n}o}o}o}p}o}o~n~n~l~l~m~m~n~n~n~o~o~o~o~o}o}n|n|n|o}o}o~o~o~ooon~n~o~n}n}n}n}o}o}o}o~o~n~n~n~n~nnnm~m~m~n~n~n~nnnooopoooooooonnnnno~o~o~nnopp~l{gycwdqemfihghgghgjgjgihhhghfifififjfggggggggghghgigihihigigigififififjfjgigigigjgjgkgigigihihihihihihjgjgjgjgjgjgjgkgifififififjfjfjhihihihigjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjhjgjhjhjiiijhkhkhlhlhlhlglglgkgkgkhkhkhkhjhjhjhjijjjkjlkmimimiljljkjkkkkjmimhmhmgmgmhmhmhlilililjkjkjkjkkjkjjkjkjkjkkjkjljmjmjmjljkjkjjjhlhlhlhlglhlglhlhmhmimjmkmklklklkljljkikikjjjjjjkjkklkmlmllljlikilililililimimimjljkikikikjkjkkkijhjgifjfjfjgkgkgjgjgjgkgkgkglglgkgkhjijiiiihihjgkhkhkhkhkhjhjijikikhkgkgkgkhkhkhkhkhkhkgkgkglglgmglgkhjhjiiiiijjijijijijijjikikhkhkglglgmglhlhkhjhjhjhjhjhjhjhjgjgjgjgigihihihigigjgjgkgkgjgjgigigihihihihihihiiijijijijjijhjgjhkhjhihihhhhihiiiiiiiihihigigigigigihihiiiiiiihihjhjhjhjhihihihihihhihigigighghghghghghghghghghggggggggggghgigigigighgggggghghghgggggghghghghfhggggghghghfhfhfhfhfhfhfhfhfhggggggggggghfhfhfhfhfhfgfgfgfgfgfhfifhfhehehdhdgegegfgfgfgfgfgfgfgfgfgfgfgfgfgfgfhfhfhfhfgfgfgegegegdhehehehehehehehegfgfgfgfgfgfgfgfgfgiflfnepesfvfyhzj{j{l{m|m|m|m|n}n}n}n}n}n}n}n}n|n|n|n}n}n}n}n}n}n}n}n}n}n}n}n}n|n|n|n|n|m}m}m}o}o}n}n}m}m}n}n}n}n}n}o}o}o}o}o}o}o}o}o}n}n}n}n}p}o}o}n}n~m~lll~m~m~n~n~m~m~m~n}n}o}o}o}o~n~n~m~m~n~n~n~o~o~o~ooo~n~n}n}n}n|o|o}o}o~oooon~n~n~n}n}n}n}n}o}o}o}n~n~n~n~n~nn~n~m~m~m~n~n~n~n~nooooooooonnnonnnnnnnnn~nopq~n}j|g{cvdrfmgighgigigigigihhhghfififigggggggggghghghgigigigigigigigigigigigigigigigjgkgigihihihihihihigigigigigigjgjgjgigigigifigigifihihihigigjgjgjgjfkfkfkgkgkgkgkgkgkgkgkfkgkgkhkhkhihjhkhkhlhkgkgkhkgkgkhkhkhkhjhjijijijijjjkjljljliljljkjkjkjjkjkjlilhlhlglhlhlhlimimimjljljljlklljljkkkkkkkjljljkkkklklklkkkjkjkhlhlhlhlhlhlhlhlhmimiljlklkkkkjkjkjkjkijijjjjikikjkklkllllkljljkililililililililililililililjlkkgigigjgjgkgkglglgkgkgkgkglglglglglglhkijijijhjhjgkhkhkhkhkhjhjijikhkhkgkgjgjgjhjhjgjgjgkgkgkgkgkglglgkhjhjijijijjjkikikikijjjjikikhkhlglglhkhkijhjhjhjhjhjhkhkhkgkgkgjgjgjhjhjhjgjgjgkgkgkgkgjgjgjgjgjgjhjhjhjhjiijijijijjijhjgjhkhjgjgigihiiiiihihihihigigigigigigihihihihigigihjhihihihihihihhgihhhhigighghgghghghghghghghghghfgfggggggghgigjgigighgggggggghghgfgfgfhfhfhghghggggggggggggfgfgfgggghghghghghghggggggghfhfhfhfhfhfgfgfgfgfhfififhfhfhehehegegfgfgfgfgfgfgfgfgfgfgfgfgfgfgfhfhfifhfhfhfgfgfgfgegehehehehehehehehegfgfgfgfggggggggfiflfpfsftgvhwhyk|k|k|l|m|m}m}m}n}n}n}n}n}n}n}n}m|m|n|n}n}n}n}n}n~n~n~n}n}n}n}n|n|n|n|n|n|n}n}n}o}n}n}n}n}n|n|n|o|o|o|o|o|o|p|p|o}o}o}o}n}n}n}n}o}o}o}n~n~mmlm~m~m~n~n~m~m~l~m}n}n}n}o}n~n~n~nnnnnooonnnnn~n}n}n}o}o}o~o~o~oooo~o~o~n}n}n}n}n}n}n}n}n}n}n~n~n~n~n~n~m~m~m~n~no~o~oooooooooonnnnnnnnmmmmnnnpqq~o~l~e|ewfqgmgjgjgjgigjgighhhhghgigigggghghghghghghghgigigigigigigigihihhhhhhhhhigigjhihihihihihigigigigigigigigjgjgihihihihihigigighhhhhgigigjfjgjfkfkfkgkgkgkhkhkhkgkgkgkgkgkgkhkhkhjhjhkhkgkgkgjgjhjhjhjhjijijijijiiiiiiiijijikilikjkjkjjjjjjkikikjlilhlhlhlhlililililjljljlkmkmkmkklklkljljljljkjjljlklklklkljljlililililililililimimjljlkljkjkjkjkjkikijijjjkikikjkkkkklkljljljkjljljljlikikikikilhmhmhnhnimiljkgjgjfjgkgkgkglglflflglglglglglglhmhlikjkjjjjikikhkhkhkhkhkhjhjijhkhkgkgjgjgjgigigjgjgjgjgkgkgkgkglglgkhjhjijijijjjjijikijijiijijikhlhlglglhkhjijhihihjhjhjhkhkhkgkgkgkgjgjhjhjhjhjhjhkhkhkhkhjhjgjgjgjgjgjgjhjhjiijijijijjijhjgjhkgkgjgigihihiiihjhjgjgjgjgjgjgjhjhjijijijhjhjgjhihihihihihhhhhhgighhhhhhhhgghghghghghghghghghghgggggggggghgigjgigighggggggggggggegegfhfhfhfhfhfggggggggggfgfgfggggggggghghghghfgggghghfhfhfhfhfhehegfgfhfififjfhfhfhehehehehfhfgfgfgfgfgfgfgfgfffgfgfgfhfhfififhfhfhfgfgfgfffffhfhfhfhfhfhfhfhfgfgggfhgggghgihidoesfwgyhyjylylyl{l{m|m|m|n|n|n}n|n|n|n|n|n|n|n|n}n}n}n}n}n}n}n}nnn~n~n}n}n|n}o|o|o|o|o|o}o}o}o}o}n}n|n|o|o|p|o|o|o|o|o|p|p|p|p|p|o|o|n|n|n|n|p}p}p~o~o~nnnn}o}o}o~n~n~m~l~l}m}m}m}n}n~n~n~mmnnnnnnnnnnn~n~o}o}ooo~o~o~o~o~o~o~o~o~n}o}n}n}n}n}n}n}m}m}m}m}n}n~n~m~m~m~mmmp}p~p~ooooo~ppoonn~n~n~nnnmmlllmlmnqr~q~o~hhzhtgoglgkgjhjgjgjgighhghghgigghghghghghghghghfhfhfhghghghhhhhihihighghghhhihihihihihigigigigigjgjgjgjgjgjgkgkiiiiiiihhhhhhhhhghghgigigjgjfkfkfjgjgjhjhjijijijhjhjhjgjgjgjhjhjhjhjgjgkgkgjgjgiiiiiiiiiiiijijjjiiiihihiiiiijijijkjkjkikikikhkhkililhlhlhlililjlikikjkjkklklklkljmkllkljljljkjjjiljljlklkljljljlililililjljljljlimimjmjmkmjljljlililikikikjjkjljkjkkkkjljljljljkklkljljkikikikhkhkhlhmgnhmhlikijfkgkgkglfmfmemdmfmfmgmgmglglglglhlhkhkikikjkjkjkiiiiiiiiiiiihihihkhkhjhjgjgigigihihihihihigjgkgkgjhjhjhjhjijijijhjhjhjhjijiiiiiihlhkhkhkhjhjijijhkhkhkhkhkhkhkhkhlhkhkhkhkhjhjhjhjhkhkhkhkhkhkhlgjgjgjgjgkgkgkgkhjhjhiiiiiiihjhjgkgkgkgjgjhihihigigigigigigigigihihiiiiiihihhhhhhhhhhigigigighghghgigigigighghggggggggggggggggggghgggggghghghghghhhhghgggggggggggfhfhfhfhfhfhfifggggggggfgggggfggggggggghghgigifhghghggfhfhfieieieiehehehfhfifififififififieieiegfgfgfffgfffffffffgfgfgfhfhfhfhfgegfgfgfgfgfgfgfgfgfhehehehegfgfghgggeheggglgqgtbydzh{k{n{ozoyoyn{n{n{n|n|o}o|o|p|p|o|o|o|n|n|n|n}n}n}n}n}n}n}n}n}n~n}n}n}n}n}n}n|o|o|o|o|o|o|o|o|o|n|o|o|o|o|o|p}p|p|p|p|p|p{p{q|p|p|o|o|n}n}n}qp~p~o}o}n~n~nn~o}o}o}n}n}m~m~m~l~llmnn~o~n~m~n~m~m~m~m~n~nnnn~o~o}p}p}n~n~n~n}n}n}n}n}o~o~o~o~o~n~n~n~o}n}n}m}m}m~m~m~n}m}m~lllm~m~q}q}q}p~p~oooppoonnmnnnmmlkkklklnpqp~o~l~j|iygvfrfngkhigjgighgggghghghgghghghggggggggggfhfhfigigighhgigjgjgjgighghhghghhhhhhigigigigigigigigjgjfkfkfkfkhjhjhjhjgihihihigjgjgjgjgjgjfjgjekfkfkgkgjhjiihiikijijhjhihihhhhhkgkgkfkfkfjgjgjijijiiiiiiiiijijhihiiiijijijijijilhlhlgkgkhkhkikhlhlhlililililikhkhkikjkjkjkilhlhlhlhkijijijijijilililililhlhmhmililililjljljlkljmjmjmjmjmjmjmjmimimimiljljkjkjkjkjkikililimimjmimililikikikijikijhkhlhmhmhlikijfifjgjgkflfmendnfmfmgmgmglglglglhkhkhkhkikijijjjjijijijiiiiiiiiihkhjhjhjhjhigigihihihihihigjgjgkhjhjhjhjhjhjhjhjhkhkhkhjhjijijijhlhlhkhkhjhjhjhjhkhkhkhkhkhkhkhkhkhkhkhkhkhkhkhkgjgkgkgkgkgkgkglgkgkgkgkgkgkhkhkgjhjiiiiiiiiijhjgkgjgjgjgjgihihihigigigigigigihihihiiiihihihhhhhhhhhhigigigighghghgigigigighghggfggggggggggggggghghghghghghghghhgighghghgggggggggghfhfhfhfhfhfifhghggggggggggggggggggfgggghghgighfhfgggggfhfieidididhehehfhfifighfhfhfhfhfhehehegfgfgfgfffffffffffffgfgfhfhfgfgfgfgfgfgfgfgfgfgfgfgehehehegegfgfgegegffhflfqgvgyg{i{k{n{p{qzqyqxo{o{o|o|o|o|o|o|p|p|o|o|o|n|n|n|o}o}o}n}n}n}n}n}n}n}n}n}n}n}n}n}n|n|n|n}n|n|n|n|n}n}n}n}o}o}o}o}p}p}p}p|p|p|p|p|p|p|p|o|n}n}n}n}p~p~p}o}o}n}n~n~n}n}n}n}n}m~mlk~l~lmnno~p~n~n~n~m~m~m~m~n~nnnn~o~o~o~o}n~n~n~n~n~n}n}n}o~o~o~o~n~n~n~n~n}n}n}m}m}m~m~l~m~m~mllmm~m~p}p}p}p}o}o~o~o~oonnnmlllllllllllllmpqq~o~nm~k|hyfveqemelgjgighgghghghghgghghghggggggggggghfhfhgighghhgigjgjgigighgghghghhhhhhhgigigigigigigigjfjgjfkfkfkgjgjgjgjgigihihigjgjgjgjgjgjgjgjfkfkfkgjgjgjhihihjhjhjhjhjhihihihkgkgkgkgkgjgjgjhjhjhihihihihjhjhjhjijijijijijijhlglglglglglglhlgmgmglhlhlhlhlhlgkhkikjkjlilhlglgmglgkhkhjhjhkhkjkjkjlilililhlhlhlilililjljljljljljljljljljljljlinimimjmjljljljlililhlgmgmgmgmhnhmhmhmhlhlhlhkhkikhkhlgmgmglhkhkghghhihjgkfkflemfmfmgmgmglglglglgkgkhkhjhjhjhjhjjijijiiiiiiiiiiiijijijhjhjhjhjhjhjhjhihihigigjgjhjhjhjhkgkgkgkgkglglhlhkhkikikikhlhlhlhkhkhkhjhjhkhkhkhkhkhkhkhkhkhkhkhkhlhlhlhlgjgkgkgkgkgkgkglglglgkgkgkhkhjhjhjhiiijhjhjiiiijhjhjgjgjgigighghhihigigigigihihihhhhihihihihhghghhhhhigigigighghghgigigigighghgggggggggggggghghgigigifhghghghhhhgigighghghgggggggghghghghghfhfififhfhfgfgfgfgfgfgggggggggggfhghghfgfgfgfgfheheididhdhdgegfhfhgighfhfhfhfhfhehehehfhfgfgfgfgfffffeefegegegegegegegfgfgfgegegegegehehdhdhdhdgegfffgdffeiemfrgwizj|l{m{n{p|q{qzqyqyp|p|p|p|p|p|o|o|p|p|o|o|o|n|n|n|o}o}o}n}n}n}n}n}n}n}n}n}n}n}n}n}m}m}m}m|m}m|m|m|m}m}n}n}n}o}o}o}o}o}o}o}o}o|o|o|o|o|o}o|n}n}n}n~p}p}o}o|o|o}n}n}n}n}n}n}n~mlkllm~n~n~n~oonnnm~m~m~m~n}n~n~n~n~n~o~o~o~nn~n~n~n~n~n~n~o~n~n~n~n~n~n~n~m}m}n}m}m}m~l~k~klmmnn~n~n}o}o}o}o|o}n}n}n}nnnmmmllkkllmmnnmllnprq~p~q~p~m~k}hyevcqbnfifigghghggfggghghghghggggggggggggfhfhghghgghgigigighghghgghghghhhhhhhghghgigigigigigjgjfjgjgjfjfjgigigigigigighgjgjgjgjhjhjhjhjgjgjgjgjgjgjgihigjgjgjgjhjhjhjhjgkgkhkhkhkhjhjhjhkhjhjhjhjhjhjhkhjhjijijijijijijhlglglglglglglhlgmgmgmgmglglglhlglhlilililhmgmfmgngmglgkhkikikilkkkkjkjkililhlhlhlhlhlililjljljljljljljljlilililjljljljljljljljlhmhmgmfmfmfmfmfmgmgmgngngngmgmglhkhlglglglglglgkihihiiiiijhjhjgkfmfmgmgmglhlglglgkgkgjgjgjgjgjgjiihihihihihihihiijijijijhjhjhjhjhjhjhihihigigjgjhjhkhkgkglglglgmgmgmgmglhlhlililililhlhlhkhkgkhjgkgkgkgkgkgkgkgkgkgkgkglglglglglhjhkhkhkhkhkhkhlfmflglglgkhkhjhjhiiiihjhjhjhiiiihjhjhjgigighghghhhhhghghghghhhhhhhhhihihigighghghhhhhigigigighghghgigigigighghgggggggggggghghghgigififighghghhhihigigighghghgggggghhhghghghfhfifififhfhfgfgfgfgfgfggggggggggggghgfgfgfgfgfgehdhdhchdgdgegfgghghghfhfhfhfhfhehehehehehegegegegegeeefegegegegegegegfgfgfgegegegdgdhdhdhdhdhdgefffgfefhemergvjym{p{pzpzp{q|q{q|q{q{q|q|q|p|p|p|p|p|p}p}o}o}o}o}n}o}o}n}n}n}n}n}n}n}n}n}n}n}n}n}n}m}m}m}m}m|l|l|l|l}m}m}n}n}o}o}o}o}o}o}o}o}o|o}o|o|n|n|n|n}n}n}n~o~o}o}o|o|o|o}o}o}n}n}n}n}m~lkkmnn~n~o~n~nnnmnm~m~m}m}m}n~n~n~n~n~n~n~n~nnnn~n~n~n~n~n~n~n~n~n~n~m~m~m}m}n}n}m}l~k~k~jkmnoo~o}n}n}n}n}n}n}n}n}n}o~onnnmmmllllllmmmlmnqrq~p~q~p~nl~i|fwcsaoeifhgghghgggghfhghghghggggggggggggfgfhghghgghfifhghghghgggghghghhghghhghghghghghgjgjgihigigigigigigigifigighghghgjgjgjhjhjhjhjhjhihihihigigigjgjgjgjgjgjgjhjhjhjgkgkhkikikijijhjhkhkhjhjhjhjhkhkhkhkikikikijijijijhkhkgkgkhlhlilgmgmhmhmhmhmhlhlglhmhmimhmgmfmemgngmhmhliljljljlkkkkjkjkikilhlhlhlhlhlhlililjljlkljljljlililhlhljkjkjkjkjkkkkkkkilhlglglflflflflgmgmgngogogngngmhlhlglgkfkflflflilikiiihhhhihjhkfmfmgmglglhkhkhkgkgkgjgjgjgkglflgkhjhjhihihihiijjjijikhlhlhlililhmhlhlgkhjhjhjhiglglglglglglglglgkgkfkgkgkgkhkhkilhkgkhkgkhkgkhkgkgkgkgjgjgjgjgjgjgkgkglglgkgkgkhihjhjhjhjhjhjhkflflgkgkgkhjhjhjiiiiiiiiiiiiiiiihjhjhihihihihihiihhhhigigigighhhhiihihihigighghgghghgigigjgjgigigigigigighghghghghghghgggggggggghfhghghghghgigihihhhghggggghggggghghgggghghfififjeifhfgfgfgfgfffhfggggghghghghghgggggfgfgfgegegegegegegfgfgggggghfgfgggfgfgfgfgfgfgegegegegfgfgfgegegegfgfgfgfgfgfgfgfgfgegegegdhchdhehegdgefffgdjdndsfwiymyqztzrzrzqzp{o{o|o|n|p|p|p|o|o|o|o|o}p}p}o}n}n}o}o}p}o}n}n}m}m}m}m}m}n}n}n}o|o|o|n|n|l}l}l}l|l|m|m|n|m}n}n}o}o}n}n}n}n}n}n}n}n}n|n|n|n|n|n|n}n}n}o}o}p}p}o}o}o}n~n~m~n}n~n~n~mmlln~n~o~o~o~o~n~n~m}m}n}n}n}n}n}n}o}n}n~nnnn~o}n~n~n~n~n~n~n~nn~n~n~m~l~l~kkm~m}n|n|m|m}l~ljlnpq~q}o}n|n~n~n~n~n}n}n}n}nnnnnnnnmlkkjjkkllmnoopppponk~gzdubqflfigggghhgifieigigighgghgggghghgggggghghghghfhfigighghgggggggggggggghghgigigigihihihihihihihihigigigigifighghghhihihigigjgjgjhjijijijhjgjgjgjfjfifjgkgkgkgkgkgjgkhkikijjjijiihihihihihihjgjgjgjikikikikijijijijjiijhjgkgkhlglhmgmgmhmhmhmimililhlhlhlhlhlhmhmhmhmhmimimjmjmjmjmjljljljljkjkjkjkikikjljljljljkjkkjkjjkjkililililkjkjkjkjkkkkkkkkhkhkhkgkgkgkflglhlhmhngngngngngmgmglglglglglflglhmhlhjgigigjgkglflglglglglglhkhkgkgkgkhjhkhkglglgkhjhjhihihihiijijhjhkglglglglhlglglglgkgkhjhjhjgmgmgmgmglglhlhlgkgkgkgkgkgkgkhkhkhkgkgkgkgjgjgjgkgkgjgjgjgjgjgjgjgkgkgkgkgkgkgjgigigihjhjhjhjhjgkgkgkgkgjhjhjhihihihihihihihihihjhjhihihihihihiihhihigjgjgigihhhihhihihigigighgghghgigigigigighgigigighghghghghghghghgggggggggggggghghghghghghghhhhggggggfgggggghghgggggghghfifieifhfgfgfffgfgggfggggghghghghghgggggggggfgehehegegegegfgfgfgfgfgfgfgfgfgfgfffgfgegegegegegegfgfgegegegfgfgfgfgfgggfgfgfgegegegehchehehdgdgdfgfibpcsdwgzkzozrzs{rzq{q{p{o|n|n|n|o}o|o|o|o|n|n}n}o}n}n}n}n}n}o}o}n}n}m}m}l}l}l}m}m|m|n|o}o|p|p|p|m|m|l|l}l}m}n}n}n}n}n|n|n|n|n}n}l}l}l}m}m}m}m}n}m|m|n}n}n}n}o}o}q}p}p}o}n}m~l~l~n~n~n~n~mmmmn}n}n}n}n}n}n}n}n}n}n}o}o}o|o|o|o|o}n~nnn~o}o}o}o}o}o}n~n~n~n~m~m~m~l~l~k~kkm~m~n}n}n}m}m~lkmopq~p}o}n}m~m~m~m~m}m}n}n}m~m~m~n~n~n~n~n~nnmlkkkklllmnnnoooonli|fwdtfmgkgighgigjfjeigighgghghghgggghghghgghghghfhghfighghghgggggghghghghghgigigigigihihihihihihihihigigigigigighghghhihigigigjgjgjgjiihihigigifigififigjgkgkgkgkgkgjgkhkhkikijijijhjhihihihihjgjgjgjhjhjhjhjhjhjhjhjijijhjhjgkgkglglgngngmhmhmimimimikikikikililililhlhlilimimjmjmjmjljljkjkjkjkjkjkikikjljljljkjjjkkjkjjkjkjljljljlkkjkjkjkjkjkjkjkjjijijijhjhjhkglhlhmgngngngngngmglglgmgmhmhmhmhmfkgkgjgigigjgjgjgkgkgkgkglglglglglglhkhkikikhlhlgkhjhjhihihihiijhjhjgkglglglglglflflflglgkgkgkgkgmgmglglgkhkhjhjhkgkgkgkgkgkgkgkhkgkgkfjgjfjgjgjgjgjgjgjgjgjgjgjgigjgjgjgjgjgjgigigigihihihjhjhjgjgjgjgjgigihihigigigigigigigigihjhjhihihihihihiiihihjgjgjgjgihigihhihihjgjgigighhhhhihihihhhhhgghghghghghghghghghghghgggggggggggggggggghghghghghggggggggggggggfggggggggfggggfhfiehfgfgfgfgfgfggggggggghghghgggggggggggghfhehehegfgfgfgfgfgfgfgfgfgfgfgfffgegegegegegdgdgdgegfgfgegegegfgfgfgfgfgfgggfgfgfgfgegegdgegegdgdggfjfncvexizl{o{qzqzq{q{p{p|o|o|n|m}m}n|n}n|n|m|n|m}m}n}n}o}o}p}p}o}o}n}n}m}m}l}l}l}m}m}m}n}o|p}p|p|p|n|n|m|m}m}m}m~m~m}n}n|n|n|n|n}m}k~k~l~l}m}m}m}n}m}m}m}n}n}n}n}n}q}p}o}n}n}m~l~l~m~m~n~n~n~n~n~n~nnn~m~m~n}n}n}n}n}o}o}o}o|o|o|o|o}o~nno~o}o|p}p}p}o}n}n}n}n}m~m~l~l~l~k~kkmmn~n~n~n~n~m~mno~p~q~p~n~n~l~l~m~m~m~m~m~m~l~l~m~m~n~n~n~n~o}o~onnmlkllmmnnnnnnnmlj~hzgwfogmfkgjgjfjfifhgggghfhfhfhghgggghghghhghghghghghghghghghghhhhghgigigigigigigigigigigigigigigigigigigigigighghghgigigigigjgjgjfjgigigigigifififigigjgkgkgkgkhkhjhkhkhkhkhkhkhjikhjhjhjhjhigigigigigigigigigigigihjhjhjhjhjgkgkgkgmgmglhlhliljljlijijijikikikikikhkhkhlililimimimhkhkikikikijijjjikikjkjljkjjjjjjjjkjkkkkklklklklkljlilhlhkhkikikjjjiiiiiijhkhkhlglgmgngngngnhnhmhlhlhmhmhmhminimgjgjgigihihihihigjgjgjgkglglglgmgmgmhlikikikililgkhjhjhihihihiijijhjhkglglglhlhlflflflflglglgkgkglglgkgkgjhjhihihkhkgkgkgkgkgkgjhkgkgjgjfjfjfjgjgigigigigjgjgjgjhihigjgjgjgjgigigigigihihihihihjgjgjgjgigighghghgjgjgjgjgjgjgjgjhjhjhihihihihihiiihihjgjgjgjgihigihhhhihjgjgigighhhhhihihhhhhghghgggggggghghghghghghghggggggggggghgggggghghghghfgggggggggfgggghggggggggggggggfgfhehfgfgfgfgfgfhfggggghghghgggghggggggghfhfhehehegfgfgfgfgfgfgfgfgfgfgfgfgefegefegegegdgdgdgegegfgegegegfgfffgfgfgggggggggfgfgfgegegegegegffjfofsgxiym{q{rzrzp{n|p|p|o|n|n|m}m}m}m}n|m}m|m}m}m}m~n}o}p}q}q}q}q}p}o}n}n}m}m}m}m}m}n}o}o}p}p}p|o|o}o}n}n}m}m}m~m~m~m}m}n}n}n}m}n}m}k~k~l~l~m}m}m}n}m}m}m}m}n}n}n}n}o}o}n}n}n}m~m~m~m~m~n~n~n~n~o~o~nnmllm~n~n~n}n}n}n}n}o}o}o}p}o}o~n~n~o}o|p|q|p|p}o|o|n}n}n}m~m~m~m~m~m~llmmnnnn~m~n~n}o~p~p~p~o~n~n~m~m~m~m~n~m~m~n~l~l~l~m~m~n~n~n~n~o~oooonmm~m~nmnnnonnmmlkj|izgsgpfmfkfjfifhfggghfhfhfifhghghgghghghhhhghghghghghghghghghhhhhhgigigigigigigigigigigigigigigigigigigigigighghghgigigigigjgjgjgjgigifigififififihigjgkgkgkhkhkhjhkgkgkgkgkhkhkikhjhjhjhjhigigigihhhhhhhhhihihihihjhjijijhjgjgkgkgkgkgkhkhkikjjjjjjjjjjjjjkjkjkjkhkhkhkhlhlhmhmhmgkhkhkhkhjijijijikikjkjkjkjjjijijjjjkkkkllllmlmlkmjmhmglglglhkhkijijijhjhkhlgmgmglgmgnhngnhnhnhmililimimhmhnhnhngjgjgjgjhjhihihighgigjgkglglglglgmgmgmhlhlhkhkhkgjgjgihihihihjhjhjhjhjgkgkglhlhlflflflfkgkgkgkhkhlhkhkhjhjhjhjhkgkglglglglgkgkgjhjgjgjfjfjfjgifihigigigigigigihiiiiihihihihihihihhhhhhhhhhghgigjhjhjhjgjgjgjgjgjgkgkgjgjgjgigigigjgjgjgjgjgjhihiiiiiihhhhhhhgihihhhhhhhhhhhhhhhhihihihihhhhghghgighghggggggggghghghghghghghghghggggghghgighghghggggggggfgggggggghfhfgggggggghfhfhfhfhfgfgfgfgfhfgggggggggggggghggggggghfhehehdhdhehehehehehehehehegegegegegegefefefefefegegegegehegegegfgfgfgfgfhghfhfgfgfgfgfgfgegegdffejeofthxmxnypyqzq{p{n|m|n|n|n}n|m|m}m}m}m}m|m|m|m|m}m}m}n}o}o}p}o}p}p}p}o}n}n}n}n}m}n}n}o}o}o}o}o}o|o|o|n}n}n}n}n}n}m}m}n}n}n}o}n}n}n}m}m~m~m~m~m}m}m}m}m~m}m}m}n}m}n}n}n}n}n}n}n}n~m~m~m}m}n}n}n}n}o}n}nnmlkll~m}n}n}n}n}n}n}o}o}p~p}o}n}n}n}o}o|o}o}o}n}n}n}n}n}n}n}m}n}n}n}n}n}onnmmmmno}o~o~o~nnnnklmn~nnmmkkllmmnnn~n~n~o~noooonnmmnoponnmml~l}k}gwgtfnfjfifififhigifhghghggghggggggggghghghghggggggghgigigighhhhgigigigigigigigjgigigigigigigigifjfjgigigighghghgihihihihjhjgjgkgigigigifigigigigjgjgkglglglgkgkglgkgkgkgkgkglgmgkhjhjijijijhihiihhhhhghghgihjhkhkhkhkhkhkhkhkhkgkgkgkgkhjijjijijkjkjkjkjkjkjkjkikikikhkhlhlglglhkhkhkhkhkikjkjkinimjmjljkjjjijiijijjkkklkmlnlolmmkmimglflflgkhkjkjkijijhkhlglgmgmgmgnhnhnhnimimhmimimimimhmhmgmgkgkgkgjgjhihihighgigjgkglgmgmgmgmgmgmglglglgkgkgjgjgjhihihjhjhjhjhjgkgkgkglglglflflflfkgkfkgkhkglhkhkhjhjhjhjhkgkglhlhlhlhkhkhjijijhjgjgjgjgifigigigigigigigigihihihihihihigigihhhhhhhhhhghgigjhjhjhjgjgjgjgjgjgkgkgjgjgjgigigigjgjgjfjfjgjgjhjhihihhhhhhhhhihihhhhhhhhhhhhhhhhjhjhihihihihigigihihhhghghghhhhhhghghghghghghggggggghghghghghggggggggfgggggggggfhfhfgggggggghfhfhfhfgfgfgfgfgfgfgggggggggggggggggggggggfhfhehehehfhfhfhfhfhfhfhfgfgfgfgfgfgfgfgfgegegegegegegegegegegegegegegehehfhfgfgfgfgfgfgffeffghfleqeugyj|pypyqzqzp{o|m|m|m|n|n|n|n|m}n}n}n|n|n|n|n|n}n}n}n}n}n}o}o}o}o}o}n}n}n}n}n}n}n}n}o}o}o}o}o}o|o|o|n}n}n}n}n}n}n}n}o}o}p}p}p}o}n}n}n~n~n~n}n}n}n}n}m~m}m}m}n|n|n|n|n}n}o}n}n}n}n}n}n}n}n}n}n}n}n}n}p~nmlkkl~l~n}n}n}n}n}n}o}o}p~p}o}o}o}n}o}o|o}o}o}n}n}n}n}n}n~n~n}n}n}n}n}o}p~o~onmnnno~o~n~nnmmlklmnn~n~n~m}l~l~m~m~n~n~n~n~n~n~n~n~noooonnmmnooonnnmm~l~l}hzhvgqfmfjfjfighighghghggggggggggggggghghghggggggggghghgighghhhhghgifigigifjfjfjgigigigigigigigifjfjgigigighghghhhhihiiihjhjgjgjgjfjgjgjgigigigifjfjfkflflflfkfkfkfkfkfjfkfkflflflglgkhkijiiiiihjhihihihiiiiijikhkhkhkhkhkhkhkhkhkhkgkhjhjijjikijjjjjjjjjjjjijijjkijikikikikhkhkikikhkhkikjkjkkkjnjnjmjljkjjjjjjijikjkjkklllmlnlmmlljlhlglgkhkhkijijijhjhjhkhlglfngngngngmhmhmhlhlilililililhlhlglglgkgjgihihhhgghgigjglgmgmgmgmgmgmgmgmgmglglglgkgkgkhjhjhkhkhkgkgkgkgkglglglflglglflfkfkgkgkgkglgkgkgjhjhjhjikhkhlhlhlilikikjjjjjjijhjgjgjgigigjgjfjfjfjfjgjgjhjhjhjhjgjgjgjgjhhhhhhhhhhghgigjhihihigjgjgjgjgkgkgkgjgjgjgigigigjgjgjfjfjfjgjgjgjgihihhhhihihihihihihihihihihihiiiiiiihihihjhjhihihhhhhhhhhhhhhighghghgggghghghghghghhhhhghghghgggggggggggfgfgfhfgfgggggggggfhfggggggggggggggfggggggggggggggggggfgggggfgfgfhfhfhfhfhfhfhfhfhfhfgfgfgfgfgfgfgfgfhehehegegegegegegegefegdgdgdhdhdgegegegfgfgfgffffffignfsexg{j|m|pzqzq{q{p{o|n}m|m}m}n}n|n|n|n|n|o|o|o|o|n|n}n}m}n}n}n}n}n}n}n}n}n}m}m}m}n}n}o|o|o|o|o|o|n|n|n|n|n|n|n|n|n|o|o|o|o}o}p}p}p}o}o}n}n}n}n}n}n}n~n~n~m~m}m}n}n|n|o|o|o}o}o}o}o}p}p}p}n}n}n}n}n}n}n}n}o}n~nllll~m~n}n}n}n}n}n}o}o}o~o}o}o}o}o}n}o|o}o}o}n}n}n}n}n}nn~m~m~n}n}n}o}p~p~onmmmmo~o~nnmmllklmoo~n}n}m}n~n~n~n~n~n~n~n~m~m~n~n~nnoonnn~n~n~n~nno~nnnnmm~m~j}iygtfofmfkghhghghghgggggggfgggfggggggghhghghghghgggghghghhhhgifhghghfififjfjfjfjfjfjfjfjfjfjfjfjfjgigigighghghhhhhihiiiihjhjgjgkgkgjgjgihihihhgjgjgkglglglgkgkfkfkfjfjfjfkfkflfngmgmhlikijijijiiiijijijijijjjkikikikikikikikikhkhjhjhjijjikikikjkjkjjjjjijijijjjjjjjjjjjjjjjjkjkikililjljlkmkmjmjmjmjljkjkjjjjikikikiljlklkmlmklkljkhkgkgkhkhkhkhjhjhjhjhkhlhmgngngmglhlhlililhlhliljljljlililgmgmglgkgihhhghghhhigjglgmgngngnhmgmgmgmgmgmfmfmglgkgkhjhjhkhkhlglglglglflflflflglglglfkfkgkfkgkglgkgkgjhjhjijikhkhlhlililjkjkjjkjjjijhjhjgjgihigjgjgjfjfjgjfjgjhjhjgjgjgjgjgjgjhhhhhhhhhhghgigjhihihigjgjgjgkgkgkgkgjgjgjgigigigigigjfjfjfjfjfjgjgjgihhhgigjhjhihihihihihihihiihihihihiihihihihjhihihhhhhhhhhihigighghgghghghghghghghhhghghfhfhfggggggggggfgfgfgfgfggfggggggfgfggggggggfgggggggggggggggggggggggfgfggggggggfgfgfgggggggggggfgfgfgfgfgfgfgfgfgfhfhdhdhdhdgdgdgdgdgegdgdgdgdgchcicgdgdgegegfgfgfggfigmfsfxg{i|m{qzp{p{p|p|p|p}o}o}m}m}n}n}n}o|o|o|p|p|o|o|o|o}o}n}n|n|n|n|n|n|m|m|m}m}m}m|n|n|o|p{o|o|o|n|n}n}m}m}n}n}n|n|o|o|o|o|o}o}o}o}o}o}n}n}n}n}n}n}n~n~n~n~m~m}m}n}n}o}o}o|o}o}p}p|p|p|q|q|o}n}n}n}n}m}m}m}n}n}mllmn~o~n}n}n}n}n}n}o}o~o~o}p}p}p}o}n}n|o}o}o}n}n}n}n}n}mmmm~n~n}o}o}ponnmlllm~m~mmmmmllmnno~n~n~n~p~p~o~o~o~n~n~n~m~m~n~n~nnnnnn~o~o}o}n~n~nn~n~nnmnn~m~kj{hvfrfnfkghhghghgggggggfgggghfgggggghghghghghghghgghhhghhghgighghghfififjfkfkfjfjfjfjfjfjfjfjfjfjgigifighghghhhihihihiihihjgjglgkgkgjhjhihiihhjhjhkhlhlhlhkhkgkgjgjgjgjgjgkglgmhmhlililikhkhkhjijiijijijjjjikililililililililhjhjhjhjiijikikhljkjkjjjjjijhjhjjijijijjjjjjjjjjjkjljljljmkmlnlnjmjmjmjljkjkikijikikilhlilimjmjmjkjkikhkgkgkgkgkglgkgkhlhlhlhmhnhnhmhmilikikjkjkhlhliljljljljlilglglgmgmglgjgighhihjglgmgngngogogmgmgnhmhmhmglglgkhkhjijijhkhlhlgmgmgmfmgmfmfmfmgmgmgmglglgkgkgkgjgkgkhkhkikikjlhlhmhmhmhmhmimilikikhkhjhjhjhjhjhjhjgjgjgjgjgjgjgkhkglglgkgkgjgjhihihihihigigigiiiiiijhjhjgjgjgjhkhjhjhjhihihihighghgififjfjfkekgkfjgighhghgihihijiiiihihihjhkhlglglhkhjhihihjhjhjhjhjhihihihhhhhghghhhhhhghghggghggghghghghfhfhfhghgggggggfgfgfgfgfggggfgfggfgfggggggfgghghghghggggggghghghghghghghfggggggggggghghghghfhfhfhfhfhfgfgfgfgfgfgfgfgegegehegdgdgdgdhdgdgdgdgdgdgchcgfgegegegegfggghemfqgwizk|m{n{p{p|o|o|o}o~o~n~n}m}n}n}o}o}o|o|o|o|o|p|p|p|p}o|o|n|n|n|n|n|m|m|m|k}l}m|m|n|n|n{o{o|o|n|n}n}m}m}m}n}n}n}n|n|n|n{n{o}o}o}n}n}n}n}n}n}n}n}n}n~n}m}m}l~l~m~n}n}o}n}o}o|n}o}p}r|s|r|q{p}o}n~l~k~k~l~l}m}n}m}m}n~n~n~n~n}n}n}n}n~n~nnooo~o~o}o}o|o|o|o}n}n}n~n}n}n}m~m~m~n}n}o}o~o~poonnmmml~lmmmmmmonmlln~o}p}q~p~o~n~n~nnonmnnn~n~o~o~o~o}p}p}p}o}o}n}o~nmllm~m~n}mk~izfueqemfighhghgggggggghghgifhghghghghggggggggghggghghghgigigigigigifjfjfjfjfjfjfjfjfjfjejejfjfigifigigigigighhhhhhhhhhhhihjfkfkgkgjgjhihihihjhkhkhlhlhlhlhkhjhjijikikhkhlglgmhlhkhkhkhkgkgkhkhkijiiiijijjjjjkikililikijjjjijiiiiihihiiiiijikikikikikjjjijhjiiiijijjjjjjjjjkjkjlililimimjnjnjmimilhlhlglhlhkhlhlglhlhlilililjkjkilhlglglglglfmfmfmfmgmgnhnhnhmhmhliljkjkjjkjjkjlimimimjmlmlmgkgkglglglgkgjgifjfjflfmfnfnfofogngngnhmhmhlhlglhkhkhjijijhkhlglgmgmfmfmgmgmgmgmgmgmgmglglglgkgkgjgkgkgkhkhkikilglgmhmhmhmhmhlhlhkhkhkhjhjhjgjgjgjgjgjgjgjgjgjgjgjgkgkflflgkgjgjhihihihihihigigiijijijhjhjgjgjgjhjhjhjhjhihihihhghghgigigjfjfkfkgkgjgighhhhhihihiiiihihjhjgjgkgkgkgkgjgjgigigjgjhjhjhjhihihhhhghhghhhhhhghghgggghghgggggghfhghfhghghggfggggggggggfgfggggggggggffggggggggggghghghggggggggghghghghfhghgggggggggggghehehehehehehehegfgfgfgfgfgfffgfgegegegegdgdhdhdhegegegdgdgdgdhdgdgdgdgdgegggjgjcrfuiym{o{p{o{n{p|o|o|o}n}n}n}n}n}n}n}o}o}o|o}n}n|o|o|p|p|o|o|o|n|n|m|m|l|l}k}k}k}l}m}n}n|n|n|n{o}o}n}n}n}n}n}n}n~n~n}n}n|n|n{o{n|o|o|n|n|n|n|n|n}n}n}n}n}n}m}m}m}m}m}n}n}n}n}n}n}n}n}o}r}s|r|q{o|n}m}l~k~k~k~l}n|n|n|n}n}m}m}m}m~m}m}m}m}m~mmn~n~n~n}o}o|o|o|o|n|o}o}o}o}n}n}o~o~o}p}p}p}p~p~pppoonnnm~n~m~n~n~nnnlkjjkmo~p}p~p~o~o~n~n~n~omnnno~o~o~o~o}o}o}o}o}o}n}n}nmlkklm~m}n}m}k}h{fweremdjfififhfgfgfhfifigigigighghghggggggggggggghghghgigigigigigigigififjfjfjfjfjfjfjfjfjgjgjgigigigigigigighghhhhhhihigjgjgjgjgjhihihigjgkgkglglglglgkhjhjhjikhkhlglglgmglhkhkhkgkgkgkgkhkhjhjiiijijjjikikhkhkhkijjijijiiiiihihiiiiijikikikikjkjjjijhjjijjijijijikikikjkjlilililimjmjmilhlhlglglglglglglglhlhlhlililikjkjkikikhlglglglfmfmfmfmfnfngngngmhmhmililjkjkkjjkilimhminknlmmmgigjgkglglglgkgkfkfkflflfmfnfnfogmgmhmhmilhlhlhlhkikijijijhkglglfmfmgmgmgmhnhnhngmgmgmgmglglglglgjgkfkgkgkgkgkhlglgmgmgmhmhlhkhkhkhkhkhkgkgkgkgkgkgkgkgkgkgjgjgjgjfjfkflflfkfkgjgjgjhjhjhjhjhjhjijijijhjhjgjgjgjgjgjgjgigighghghfhfhgigigjfjfkfkgkgkgjgjhihiihihhihjhjhjgjgjgjfjgjgjgigigigigigjhjhjhigighghghghghghghghghghgggghfhghgggggghghghghfhgggggggggggghehfgfgfgggfgfgfgfgfgfggggggggggggggggggggggghfhghghgggggggghghghehehehehehehehegfgfgfgfffgfgfgfgegegegegdhdhdhdhfgfgegegegegehegdgdgdgfghglgofrevhyl{p|q{qzp{n|p|o}o|o}n}n}n|n|n}n}n}o|o|o}n|n|n|n|o|o|p|o|o|o|n|n|m|m|l}l}k}k}k~l~m}m}n}n|n|m|n}n}n}n}o}o~o~o~nnn~n~o}o}o|o|n|n|n|n|n|n|n|n|n|n|n|n|n|n|m|m|m}m}m}n}n}n}n}n}n}n}m}o}r}r|r|q|n|n|m}m}l~l~l~l}n}n}n}m}m}m}m|l|mm~m}m}m}n}n}n~o}o}n}n}n}n}n}n}n|n|o|p}p}o}o~np~p~p}p}p}p}p~p~qqppoonnn~n~nnnnoojjiijlnp~oo~o~o~o~n~n~n~mnoop~o~o~n~n}o}o}o~o~n~m~l~lkjjjkl~m}n|n}m~k~i{gwercpelfkfjfhghghgigjgjgjgjgigighghghhfhfhghghghhhhhhhhhhghghghghghghgigigififjfjfjfjgjgjgjgjgjgihihigjgjgighghgihihigigigigigigjhjhjgjgkgkglglglglgkgjhkhkhkhlglglfmfmflgkgkhkgkgkgkglfkgjgjhjhjhjhjhjhkhkhkhjijjikhjiiiiihihjijijjjkjkjkjkjkjjjijhjjjjjikikikikhlhlililhlhlhliljljlilhlhlglglglglglhlhlhlhlikikjkjkjkjkikikhkhkhlhlhlglfmfmfnfnfnfngngngnhmiljlkkkkjkilhmhminjnkmlmghgigjglgmgmglglflflflflglgmgngogmgmhmimililhkhkikikijijhjhkglflfmfmfmgmgnhniningngngngmgmglglglfjfkfkfkfkgkgkglgmgmgmgmglhlhkhjhjhkgkgkgkgkglglflflflfkfkfjgjgjfjgjfkfkflflgkfkgkgjgjgjhjhjhjhjijijijhjhjgjgigigjgjgigighghghghghghgigigjgjgkgkfkfkgkgkhjhiiiihhihjgjgkfkgjfifihihihhhhhhhhhihihihigigighfhfgfgghghgigighgggggghfhfhghgggghghghghghgggggggggghghehfhfgfgfgfgfgfgfgfgfgfgfgfgfgfhfhfggggggggfgfgghghgggggghghfhfhehehehehfhfhfhfgfgfgfgfgfgfgffffegegegegdhdhdhdhfgfgfgfgfgegehegfgfgfghglgqgvgxjykzm|o|p{q{p|p}p|o|o|o}n}n|n|n|n|n|n|n|n|n|n|m|m|n|n|o|o|o|o|o|o|n|n}m}l}l}k~k~k~l~m~m}n}m}m|m}n}n}n}o}o~o~p~p~onno~o}o}o}o}n}n}m}n}n}n}n}n}n|n|n|n|n|n|m|m|m|m|n|n|n|n}n}n}o}n}n~o~q}q|p|o|n{n{n|n}n~m~m~m~n~m~m~m~m}l}l}l}mm~n}n}n|n|o|o|p|p|o|n|n}m}l~l~n}n|o|p|q|p}o~op~p~p}p}p}p}p~p~q~q~q~ppooommnnnnnnkjjijlnonnno~o~n~n~m~mmopp~p~o~n~o}n}o}n~n~m~l~lkjjijjl~m}m}m}n}m|k{iyewcvfnflfjghhhhhhjijfkfkfjfjfighghghhghghghghghghhhhhhhhhhhhhgggggggghghghgigifjfjfjgkgjgjgjgjhjhjhigjgjgigighgigigighghghgigigjgjgjfjgkgkglglglglfkgkgkgkglglglfmfmemflfkgkgkgkgkgkflfkfkgjgjgjgkgkhjgjgkhkhjiijikhjhiiiihihjijikjkkjkjkjkjkjjkikhkjjjkikikhlhlhlhmhlhlhlhlhlikjkjkjkililhlglglhmhmhlhlhlikikikjjjjjjjjikikikhkhkhkililhmgmgngngngnfnfngnhmimjlklklkkjlimhmhminjmjmglgjgigigkglglgkflfkfkgjgjgkglhmgmgmhmhlhlhkhkhkililhmhmgmglgkgkflglglglgmgmhmhmgngngngmgmgmgmgmfkfkfkfkgkgkgkhkglglglhmhlilikijglgkgkgkgkgkgkgkfkfkfjfjfjfififigjgjgjgjgjgkgkgkglgkgkgkhkikikjjijijijhjhjhjgjgjgkgjgjgigighghghghgigigigjgjgjgkgkgkgkgkgjhjhihiijhjgififigigihiihigigigigigigigihihhhggfgfgggggghghghghghgggghghfhfhggggggggggggggggggggggghghgifhfhfhfgfgfgfgfgfgfgfgfgfhfhfhfhghggfggggfgggggggghgggggggghfhfiehegegegfgfgfgfhfhfhfgfgfgegegegegegehehehehegegegegegdgegegfhfhggfggflfsgwiyjxl{l{m|m|n|n|o|o}o}o}o}o|o|o|o|o|n|n|n|n|n|n|n|m|m|n|n|o|p|p|p|o|o|n|m}l}k}k~k~k~mm~m}m}m}l}l~l~mmnoopqqp~o~o~o~o~o}o}n}n~n~n}n}n}n}n}n}o|o|n|n|n|n|m|m|n|n|n|n|o|n}n}n}n|n}n}o}o}o|o|o|o{o{p{p|o|o}n~n~n}m~lm~m}n|m}mm~n~n}o|o|o|o|o|p|o|n|m}k~kjjnn~o}p}p}p}p}p~pp~o~o~o~oppqqqqppppmmmmmmlljjjkllmmno~p~q~p~n~m~l~lmopq~p~p~o~p~p~o~nmllkkkjjjj~k~k}l}m}n}o|n|k{gzeyfreoekghihiihjgjfjfjfjfifighghghghghghgggggggggghghgigigighgggggggggghgififjejejgkgkgkgkgjgjgihigjgjgjgjgjgjgigigjgigigigjgjgkglfkgkgkhkhlhlglglflflflfmfmfmfmgmflflflglglglglglfkfkfkgkgkgkgkgkhlhkhkhjhjhihihihhihihjijijjjjjkklkkkkjjijijhjhkjkjkjkjkililhmgmgmglhkikjkkklkllkljljlililililjlililililikikikikikikikhkhkhkhkhkimhmhmhmgmgngngnfngngmhlililjljmililhlglhmgmhnhngnglgjgjgkgmgmglglgkgkgjgjgkglgmgmgmgmglhlhlhkhkilhlhlgmglglgkgkglglglglgmgmgmgmgmgmgmgmgmgmgmglfkfkfkfjgjfjgjhjgkglglhlhlhlikikgkgkgkgkgkgjgjgjfjfjfjfjfififhfhgjgjgjgjgjgjgjgjglgkgkgkhkhkikijijijhjhjhjgjgjgjgkgkgjgjgighghghghgigigigjgjgjgkgkgkgjgjhjhjhihihjhjgigifigigihihhhhhhhhhghghghgighgggggggggggggghghghghgghghghghghghggggggggggggggggggggggghghgighghghfgfgfgfgfgfgfgfgfgfhfhehehfhfgfgggggfgggghghggggggggfhfhfhehegeffgfgfgfgfhfhfgfgegegegegegegegehehehegegefefefegdgefegfgfggghfkfpguiykzlzo|o|o|o|o|n}n}o}n}n}n}n}o}o}n}o}n}n}n}n|n|n}n|n|m|m|n|n|o|o|o|o|o|o}n|m}m}m}m~m~n}n}n}m~llkkmnmnooppo~o~o~o~o~n}n}n}n}n}n}n}n}n}n}n}o|o|n|n|n|n|n|n|n|o|o|o|o}o|o|n|n|n|n|o}o}o|o|n|o|o|p|p|q|p}p}o~n}m~lm~n|o|n~lmn~n}o|o|o|n|n|o|n}m}l}k~j~jjn~n~o~o~p}p}p}q}qp~p~o~o~ppqrrrrqqppnnmmllkkjkkllmmnnopq~p~n~m~l~lmnop~p~p~o~p~p~o~nnmmlkkjjjkk~l~l}n}o}p}p}n|l{jzfuerdmejgihigififjfifififhghghfhghghghgggggggggghghghgighghgghghggggghfhfififjejfkfkfkgjgjfjgigigjgjgjgjgjgjgigigigigigigigjgkgkgkgkhkhkikhkhkhkglflflflflglglglgkglglglglglflflfmfmflflglglglglglglgkgkgjgjgigiihihjhjijjjjjkikjljkjkjjijijhjhkjkjkjkjlilhlhlglglglhkikjjkkkklkkljljlililililjlililililililikikililililhlhlhmhmhmhmhmgmgmgmgmgmgngmgmhlhliljmjmjmimhlglgmgmgngngogmgkgjglgmgmglglgkgkgjgjfkflfmgmgmgmgmgmglglhlhkhlglglglgkgkgjglglglglgmgmgmgmfmfmgmgmglglglglgkfkfjfjfjgjgjgigkgkglglhlhlhlhkgkgkgkgjgjgjgjgjgjgigigighghghgggigigigjgjgjgjgjglgkgkgkgkhkhkhjhkhkhkhkgkgkgkfkfkgkgjgjgigihhhhhhhihihihjhjhjhkhjhjhjhjhjhjhihigjgjgigigigigigihihihhhhhhhhhhhhhhhhgggggggggghfghhhhgigigighghghghghggggggggggggggggggggggghghgighghghfgfgfgfgfgfgfgfgfgehehehdifhfhfgfgfgggghfigifhfgfgfgfhfhfhfhfgfgfffffffgfgegegegegegehdhdfegegegehegegegefefefefdfegegfgfgiflfrgvhxkzn{o|p|p|p|o}o}n}n}n}m~m~n~n~n}n}n}n}n}n}n}n}n}n|n}n}m|m|m|m|m|n|n|n|o|o|o|n}n}n}n}m~n}n~nmmmmmooooooooo~o~o~o~n~n}n}n}n}n}n}n}n}n|n|n|o|o|n|n|n|o|n|n|o|o|o|p}o|o}n}n}n|n|n|o}o}o|n|n|n}o|p|p|q|q|p}p}o}n~mm~n}n}m~lmm~n~n}n}n|n|m}n|m}m}l}k~k~lln~n~noo~p~q}q}qq~p~p~p~pqquuuuutrrqponnmlllllmmnnnnoopon~n~m~lmmno~o~p~p~p~o~o~oonnnkkkkklmn~m}n~o~p~p}o|n|n{izgveqemfkgjfjfifififhghghfhghghghghghgggggggggggghghghghhghghghfgfhfhfhfhfifififjfjfjfjfjgjgifigjgjgjgjgjgjgigigigigigigigjgjgkgkgkhkhkikhjhjhjgkgkfkgkgkgkhkijikhkhkgkglglflflemfmfmfmgmflglglflglglgkgjgjhjhiihjhjijijjjjikikilikikijhjhjhjhkikikilililhlhlglglgkhkhjjjjjkkkkkkjkjkikikikikjkililililililililjljlilimhmhmgmgmgmgmgmgmgmgmfmgmgngmgmgmhmhmimininhnhmgmflglgmgmgnglgjgjgkglglgkflfkfkfjfjfkflfmfmfmfmfmfmgmgmgmgkgkglglflgkgkgjhlglglglgmgmgmfmgmgmgmglglglglglgkgkgjfjfjgigigigjgkglglgmglglglgkgkgjgjgjgjgjgjgigighghghgggggggigigigigjgjgjgjglgkgkgkgkgkgkgjglglglglflglflflgkfkgkgjhjhiiihhhhhihihihjhjhjhkiiiiiihihihihjgjgjgjgigigigigigihihihihihihhhhhhhhghghgggggghghggghgigigjgigighghghghgggggghghghgggggggggggghghgighghghfgfgfgfgfgfgfgfgegehdhdhdifhfhfgfgfgghghgififhfhfgfgfhfhfhfgfgfgffffgffgfgegegegegehdhdhdfefegegegegegefefefefefdfefefffffkfpfwgzizlzo{q|o|o|o|n|n}n}n}m}lm~m~m~n~n~n~n~n}n}n}n}n}n}n|n|n|m|m|l|l|m|n|n}n|n|n}n|n}n}m~m}mnmnooppppppppppo~n~n~n~n~n}n}n}n}n}n}n|n|n|m|m|n}n}o}o}o}o}o}o}o}o|o|o|n|m}m}m}n|n|n|n}n}n|n|m|m}n}n}o|p|p|p|p|o}n~mm~m}m}mkmmm~m}m}m}m}l}n}n}m}m}m~m~n~n~o~n~nnop~q}r}qq~p~p~p~pqquww~x~xwvuttsqpponmmmnnooonoooonnn~mmmnn~o~o~p~o~o~o~oooookkkklmno~m~m~m~m~m~n}m}m}m~kzgtepenflekeighghghghghghghhhghghghggggggfgfggggghghhhhghghghfhfhfhfhfhfhfhfhfififififigigjgjgjgjgjgjgjgjgigigighghghgigigjgkfkgkgkhkhjhjgjgjgkhjgjgjhjhjijiiijijhkgkgkflflflemelflflflglflfkgmglglhkhkijijijjhjijijjjjikikhkhlhkhkhjhjhjhjhkhlhlilililhlhlglglgkgkhjijjjkjkkkkjkjkikikikikjkhlhlhlhlhmhmhmhmjkjlililhlhlglgmgngngngngngngmgmgngmgmgmgmhmhnhngngngmfmglglhlhlgjgjgjgkgkglglglfkfkfkfkfkfkflflflfmfmfmgmfmfmflglgkgkgkfkgkgkgjgkgkglglglglglhlikikhkhkgkgkgkgkgjgjgigighghgigigjgjgkglglgkgkgjgigjgjfkgkgkgjhjhjhjgigighgggggghhhhhihihjhkhkhkgjgjgjgjgjgjgjgjgkgkgkgkgkglglglflglgkhjijjjjikihihihihjhjhjhjhjhihihihihigigigigigigigigigigigigigigifigigighghhhghghghgggggghggghghghghghghghghghghgggggghghghgggggggggggggggghghghggfgfgfgfgfgegegegegegdgdgdhfhfgfgfgfgghghghfhfhfhfhfhfhfhfhfhfgfgfffffffffgfgegegegegegdgdfegegegegegegegefffffffdfdfefhejarcvfyi{k{l{m{m|n{n|n|n|n}n}n~m~m~m~m~m~n}n}n}n}o}n}n}n|n|n|n|n|m|m|m|l|l|m}m|n}n|n|n}n~nmllmmmnoqrss~s~t~s~tsrqp~p~nmm~m~n}n}n}n}n|n|n|n|m|m|m}n}o}o}o}o}o}o}o|n|n|n|n|m}m}m}n|n|n|n|n|n|n|m|m}m}n}n}o|p|q|q|o~n~n~m~m~m~m~m~m~m~m}m}m}m}m}m}m}m}m}m}n}n~o~p~n~n~n~o~o~o~p~p~qpoopru~v~w~y~{~{~z~zz{xxvurponlmnooooommnnnnnnmm~m~n~n~nnno~p~p~p~pppomlklmnnmkkkll~m~m}m}n~m|jygwducqelfighghghghhhhhihihggggggggggfgfgfgghghghghghgigigififhfhfhfhfhghggfififififigigjgjgjgjgjgkgkgjgjgjgjgighghghgigjgkglglgkfkfkgkgjgjhjhjhjhjhihihihihjhjgjfjfjfjfkfkflflflfkfkgkgkgkhkhkhkhkhkijijijjijijjikikhkhjhjhjhjhjhjhjhjhjhjhlhlhlgmhlglgkgkgkgkgkgkhkiljljljlilhlhkhkhkhkikhkhkhkhlhlhlhlhlhlhlikikikikhlhlgngngogngngngngngngmgmgmgmgngnfnfnfnfngmgmgmhmgmgjgjgjgkgkgkglglfkfkfkfkflflflflflfmfmgngngmgmglglgkgkgkgkgkgkfjfjgjgkhkikikjkjjijhjhjhjhjhjgjgjgjgjgigigigigjgjgjgjgjhkhkhjhjhjhihjgjgkgkgkgjgjhjhjhihighghghghgihihihjhjhkhkhkgjgjgjgjgjgjgjgjhjhjhjhjgjgkgkgjgkgkgjhjiiiijhjhhihihihihjhjhjhjhihihihihihigigigigigigigigigigifigigigigighghghhhghghghghghgghghhhhhghghgigigighghghggggggggggggggggggggggggggghfhghggfgfgfgfgfgegegegegegegdgdhfhfgfgggggghghghfhfhfhfhfhfhfhfhfhfgfffgegegegegegegegegegegdgdgegegehehegegegeffffgfgegefgekeobvdyg{j|l|m{n{m|n|n|n|n|n}n}n}m~m~m~m~n}n}n}n}n}n|n|n|n|n|n{m|m|m|m|l|l|l|l|m|m|m|m|n}n~mmlkkmnqsu~w~y~y}y}y}y}y}x~w~v~s}q~o~m~l~m~n}n}o|o|n|n|n|n|m|m|m|m|n|n|o|o|o|n|o|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|m}m}n}n}o}p}q}q}p~o~n~n~m~m~m~m~m~m}m}m|m|m|m}m}l}l~l~m~n~o~p~q~n~o~o~o~o~p~p~p~o~o~o~p~q~t~wyy~{~}}~}}}}~~~~}{xurpolmmmnnnnmnnnnnnmmmn~n~n~n~nno~o~p~q~qqqqonmnoponllllmm~m~m~nn~l|j{fyeuepglgigigigihihihiiiggggggggfgfgfgfgghghghgigigigigigighghghghghghgggigigigigigigjgjgjgjgkgkgkgkgjgjgjgigifhfigigjgkgkgkfkfkfkfkgkgkhjhjhjhjhjhihihigjgjgjfjfjfkfkfkfkfkfkgkgkgkgjgjgkgkhkhkhkhjhjhjiiijijikhkhkhjhjhjhjhjhjhjijijijhkhlhlhlglgkgkgjhkhkgkgkgkhlililililhlhkhkhkhkhkhkhkhlhlhlhlhlhlhlhkikikikikikilhlhmhngogogogngnhnhnhngngngngnfnenenfngngnhnhninflfkfkfjfkgkglgmflflflflflfmfmfmglgmgmgngnhmhmhlhlhkgkgkgkgkgkgjgjgjgkhkikijjjjihjhjhjhjhjhihihigjgjgigigigjgjgkhjhjiiiiiiiiiiiiiiijhjgkgkgkgjgjiiiiiihihigigigigjgjgjgjgkhkhkhkgjgjgjgjgjgjgjfjgjgjgjgjhjhjhjhjhjgjhjhjhihiiiiihhhihihihihihihjiiiiiihihihhhhhhgigigigigigigifigigigighghghhhhhhgggghghghghghhhhhhhhhigigigigighghghggggggggggggggggggggggggggghghghfgggggfgfgfgfgfgfgegegegegehfhfgfgggggghghghfhfhfhfhfhfhfhfhfhfgegegdgdgchdgdgdgdgdgdgdgegegegehehehehegegegfgfgfgfggfkepdtfxgzj|l|m|n{m|m}n|n|n}n|n|n}n}m}n}n}n}n}n}n}n}n}n|n|m|m|m|m|m|m|m}l}l}l}l|l|l}m}m|m|m}m~mlkkknqv}z|}|||{{{{~{}|||||v}u}q}n~m~m~n}p}o|o|o|n|n|n|n|n|m|m|n|n|n|o|n|n|n|n|n|n|n|o|o|o|n|n|n|n|n|n|n|n|m}m}n}n}n}o}p}p}q~p~o~n}n}m}n}n}n~n}n}n|n|n|n}n}l~l~l~m~m~n~p~q~o}o}o}p}p}p~p~p~o}o}o~q~s~v~y{{}}}}|||}}~}zvsqopponnnnnoooonnmmlmn~o~o~o~onn~o~p~q~qqqqqonopponnnnmmmmmnnon~j}gyfugpgihihihihihihihighghfhghfhfhfhehgigigigigigigigjgighghghghghghgggigigigigigigjgjfjfjfkgkgkgkgjgjhjgigigjgjgjgjhjhkhkgkfkfkfkgkgkgjgjgjgjgjgjgjgjgjgjfjfkfkfkfkgkgkgkgkgkgkgkgkgkgkgkgkgkgkgjgjgjhjhjhkgkgkgkgkgkhjhjhjijijijijijhkhkhlhlhlhkhjhjikikhkgkgkglhlhlhlhlhlikikikikhkhlhlhlhlhlhlhkhkhkhkhkhlhlikikjkikiliniohphphohnioiohnhngngnfnfnenenfogngnhnininfmelekfjfjfkglgmflfmfmfmfmfmfmfnglgmgmgmhmhmhmhlhlhkhkgkgkgkgkgjgkgkgkhlhkhkhjhjhkhkhjhjijijijijgjgjgigigigjgkgkijiiihihjgjgjhjhjiijhjgkgkgkgjgjjhjiiihihigjgjgjfjfjfjgkgkgkhkhkhjhjgjgjgjgjfjfjgkgkgkgkgkgjgjgjhkhjhjhkhjgjgjgjhhhhhhhihihihihiiiiiiiiihhhhhhhhhhhhghghfhghfhfhghghghghghhhhhhghgggggggghghhhhhhhhhihigigigigighhhghggggfgggfgfgfgfgfgfgfgggggghghghggggggfgggggfgfgfgfgfgegefehfhfgfgfgfgfhfhfhfhfhfhfhfhfhfhfhfgfgegegdgchchcgcgcgdgdgdgdgegegegehehehehegegefegfgegfgifnetdxiwjyk{m|n{n{m|l~n}n}n|m}m}m}m}m}n}n}n}n}n}n|n|n|m|m}m}m}m}m}m~l~mll~k~k~l~l}m}m|m|m}m~mlkknqv~{|{z{{zzzzz{{{z|x|t}p}o~o~p}q}o|o|o|n|n|n}n|n|m{m{m{n{n{n{n{n{m|m|n|n|o|o|o|p|n|n|n|n|n|n|n|n|m|m|m|n}n}o}o}o}q~p~o~o}n}n}n}n}n~n~n}n}n}m}m}m}lllm~m~n~n~o~p}p|p}p}p}p~p~p~p}p}p}q}t~v~y{}}||| { |||| }}~{xvtutsqpooopppoonmmmnoq~q~q~p~po~o~o~p~poonqonopponoonnnmmmnoqpmi|gwgshjhjhjhjhjhjhjhjfifififififieieigigigigigigjgjgjgighghghghghghgggigigigigigifjfjfjfkfkflflgkgkgjhihigjhjhjgjhjhjjjijhkgkgkgkglglgkgkgkgjgjgjgjgjgkgkfkfkfkgkgkglgkglhlglglglgmgmhkhkgkgkgkfjfjfjfjgjgkglglglgkgkhjhjijijijijijijgkhkhkhlhkikijijjkjkikgkgkglflglglhlhlikikikikhkilililililikikikhkhkhlhlhliljkjkjjjkjmioiphphohojoioiohngngmfnfngngngngngnhnhnhndndmdlekfkfkglgmflflfmfmfmfnfnfngngmgmglglglglglglglglglglglglglgmglhlhlhlhmgmgmglhlhlimjlilikikgkgjhjhjhjhjgjgkijijjijhjhjhjhjhjjijhjgjgjgjgjgjhjhjhjhihjgjgkgkfkgkgkfkgkgkgkgkgkhkgjgjgjgjfjfjgkgkgkgkgkgjgjgjgkgkgkgkgkgjgjgjgihihihihihihiiihihihihihighghghhhhhghghgifififigighghghghghghgghggggggggghgigjgihihihigigigigigigighggggggggfgfgfgfgfgfgfgggggghghghghghghfgfgfgfgfgfgfgfgfgfffgfgfgfhfhfhfhfhfhfhfhfhfhfhfhfhfhfgfgfgfgfgegehehdhdhdgegegegegegfgfgfgfgegegegefggegehihogugxfxlymzn{n|n|n}m}m}n|n|n|m}l}l~l~l~m~m~m~n}n}n|n|n|k|k}k}l}l~l~mmkkk~k~k~k~k~k~m{m|l}kkkklqty}|{ z y y y y xxxyzz~|{|x}u}r}q}q}q}o|o|o|o}n}n}n}n}n{n{n{n{n{m{m{m{m|m|m|m|m|m|m|m|n|n|n|n|m|m|m|m|m|m|m|n|n}n}n}n}p}p}o}o}n}n}n~n~nn~n~n~m~m}m}m}ll~m~m}m}n~n~no~o}o}o|o}o}o~o~p|p}p}q}s}u}x}y}~||||{ {{{|| |}}~~|~z~|~{yuqoops~r~p~n~nmnmn~n~o~p~q~q~q~p~p}p~o~o~oooooponllnooonnnmmmnnopnk}gxeuglglgkgjgjgjgjgjfjfjfjfjfifififigigigigigigigigigighghghghghghgggigigigjgjfkfkfkelelflflflglglglhkhkhkhjhjhjhjhjiihihjgjgkgkgkgkglgkgkhjhjhihhhhgigigjgjgkgkglhlgmglhlhlhlgmgmgmhlhkhjhjhjhjhjhkgkgkgkgkhlhlhlhljjijhjhkgkhkhkhkglglglhlhlikjkjkjlililhlhlglglglhkhkhkikililililhmhmimimilililikililhlhlhlhkhkikjjjkilimhnhogogoiohnhngngngmgmgmhlhlglgmgmgngngndldkekekfkflgmgmglglglglgmgmgngmgngngmgmglglglgmglglglglglglglglgmglglhlhlgmgmgngmgngnhnhnimhmhlglgkhkhkhkhkgkglikikijijiijijijjikikhkgkgkgkgkgkhkhjhjhjhjgjgkgkgkgkgkgkgkgkgkgkgkgkgkgjgjgjgjgjgjgjgjgjgjgjgjgjfkgkgkgjgjgjgjgjgihihihihihihiiihjhihihigigigighhhhhhhghghgigigigighghghghghghgghghghghghgigigjgihihigigigigigigighghggggggggggggfgfgfgfgfgggggfgghghghghghfgfgfgfgfffgfgfgfgfgfgfgfgfgfhfhfhfhfhghghghghghghghggfgfgfgfgfgegegehdhdgegegegegegegfgfgfgfgfgfgfgfgffheleqfvgyjykymzmzn{n|n|n}n}n}o|n|n|m}l}l~l~l~l~l~l~l}l}l}l}m}k}k}l}l}l}m~m~m~m~m~m~m~m}m}m}m}n|m|k~jjkmntw~|}|{ zy yyyyy yyzz{~|{|w}t}r}q|q|o}o}o}o}n}n}n~o~o|o|n|n|n|m|l|l|m|m|l|l|l|l|l|l|l|l|l|m|m|m|m|m|m|m|m}n|n|n|n|n|o}o}o}n}n}n}m}m}n~n~m~m~m~m}m}m}l~l~m}m}n}n}n~n~o~o}o}o}o}o}o}o}p|p|p|q}r}u}w}x}~||||| |||||| ||}}~~}~~zuqqqs}r~p~n~mmmnn~o~o~p~p~p~p~p~o~o~o~o~oonnooonlklnnnnmmmmmnoponj}fxdtglglgkgjgjgjgjgjgigigigigigigighghghghgigigifigigighghghghghghgggigigifjfjfjfjfkekekekfkfkfkgkgkgkhkhkhjhjhjhjhjiiiihjhjgjgkfkgkgkgkgkhjhjhihihiiiiiijijikikhlhlglglhlhkhkglglgmgkgjgjhjhiijijjjhkhkhkhkhkikikikjjijhjhjhkgkgkgkglglglhlhlikjkjkjlililhlhlhlhlglgkgkgkhlhlhlhmhmhnhnhnimimilililililhlhlhlilikjkjkjkilimhnhnhngnhngngngmgmglglhlhkhkhkhlhmhmgmgnekekfjfkfkgkgkglgkgkgkglglglgmgmgmgmglgkgkgkgkgkgkgkglglglglgmgmfmglglglglgmgmfnfnfnfofogognhnhngmgmhlhlhlhlgmgmhmhlhkhkhkhkhkikhlhlglglglglglglhkhkhjgjgjgkgkglgkgkgkgkgkgkgkgkgkgkgkgkgkgjgjgjgigigigigigigigigjgjgjgjgjgjhjhjgihihihihihihiiihjhjgjgjgigigigihghghhhhhhhhhhghgighghghghghghgghghgigigigigigighghghghghghghghfhgggggfgfggggggggfgfgfgggggfgggggggghghghghfhfgfggggggggggfggggggfgfgfgfgfgfgfgfhghghghghghghghggfgffffffffegegegegegegegegfgffffefefffffffffffffifnetfygzjzmzozn{n|n|n}n}n|o|o|o|o|n|m}l}l~k~k~k}k}k}l}l}l}l}l}l~l}l}m}m}m}n}n}n}n}n}n|n|n|n|n|n|m}kjknqry~|}|{ zzyyzyyy yzz{zz}{y|u}r|p|o|n}n~m~m~m~m~n~o~o~o~n~n}n}m}l}l|m|m|m|l|l|l|l|l|l|l|l|l|m|m|m|m|m|m|n|n|n|n}n|n|n|n|n|n}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}n|n|n}o}o}o}o}o}o}o}o|o|o|q|q|p|p}q}s}u}v}~||||| {{{{{|| ||||||}~~yurrs}r}p}n~m~mmmnoo~p~p~p}o}o}n~n~o~n~n~n~n~n~noonljklnnnnmmmmnoppok{gvergmglgkgjgjgigigjhihihhhhhhhhhhhhhghghhghghgigigjgighghghghghghggfhfhfififjfjfjfjdkdkekekekekfkfkgkgkgkgjgjhjhjhjiiiiiihjhjgjgjfkgjgjgjhjhjhjhihiiijijjkjjkikhlhlglglhkhkhjgkgkgkfjgjgihiiiiijijijjjjjjjjjjijijijiiijijijhkhkglglglglglhlhlikikikilililililhlhlhlglglglhlhmhmhnhmhmhmhlhlhlikikikikikhlhlililjlkljkjliminininhnhnhmgngmgmglgkgkhjhjijikikjlilhmgmfkfkfkfkfkfjgjgjgjgkgkgkglglglglglglgkgkgjgjgjgkhkgkgkglglgmgmgmgmglglglglgmgmgmfofneoeofofngngngngnhnhmhmhngngngngngmglhlhlhlhlhlglglflflflflglfkfkfjfjfkfkflflfkfkfkfkfkgkgkgkglgkgkgkgkgkfkfkgigihihihihihigihjgjgjgjgjhjhihigihihihihihihiiigjgjgjgjgigififihghghghghhhhhhhhgighghghghghghgghgigigjgjgighghggggggggggfggggggggggggfgfggggggggfgggggggggggggggggghghghghfhfhffggggggggggggghggfgfgfgfgfgfgfgfhghghghghghghfhfgfffgfffffgegegegegegegeffgfgfgffefefffffffffgfhcoesgxj{mznyozo|o|n|n}n}n}n}o|o|p|o|n|m}l}k~k~k~k}k}l}l}l}l}l}l}m~m~m}n}n}n|n|n|n|n|n|n|n|n|n|n|o|n}lklptw~}}}|{zzyyzzyy yz{{yz~{z|u|r|o}m}m~l~k~k~klmnmmn~n~n~n}n}n}n|n|n|m|m|l|l}l}l|m|m|m|m|n|n|n|n}n|n|n|n|n|n|n|n|m|m|m|m|m}m}m}m|m|m}m}m}m}m}m~m}m}n|n|n|n|o}o}o}o}o}o}o}o}o|o{q}q}p}p}q}r}s}t}~{{{{z zzz { {{{| | | |{{|}{~wtsr~q}o}n}m~m~mmnoo~o~o~o}n}n}n~n~n~n~m~m~n~n~n~n~onljjknnoooooonoqqp}mzjtgqfmfmflfjhjhigigihhhhhhhhhghghghgighghghhghgigigjgighghghghghghggfhfhfhfififjejejdkdkdkekekekekekfkfkfkgjgjgjhjhjjhiiiihihjhjhjgjgjgjgjhjhjhjhjhjiiiijjkjjkikglglglglhkhjhjgjgkgkhjhihihhihihjhjikjkjkjjjjjjijijihiiiijijikhlglglhlhlhlhlhlikikikililililililililhlhlhmimininininhlhlhkhkhkhjhjhjikhkhkhliljljlkljljlimininininiminhnhmglgkgkgjgjhjijjjkkjkilhlgmhjgkfkfkfkfjgjhigigjgjgkgkglglglgmglgkgjgjhjhjhjhkgkgkglglgmgmgmgmfmglglglglfmgmfnfnfnenfnfngmgmgmhmhmhnhnhngngngngngnhmhmimimhlgmgmgmgmgmglglglfjfkfkfkelelememflgkgkgkgkgkhkhkhlhlhlhlhlhlglglhkhkhjhjhihjhjgjijijhkgkgkgkhjhjgkgkgkgjgjgjhjijijhjgjgjfjfigigihhhhhghghghhhhhighghhhhhhhhhhhhiigigigighhhhhhghgggggggggggggggfgggggggggggggggggfgggggggggggggggggggghggggfgfhfggggfgggfggghghghehehegfgfgfgfffgfgggggggggggfgefefegegehegegegegegegefegegegegefffffefdfdfffjfmbwfxlypzp{ozo{n{o}o}o}o}o}o}o}o}n|n|n|m}m}m}m}m}m}m}l}k}k}k}k}k~m}m}n}o}p}o|n|n|o}o|n|n|n|n|m}m}n~nmlmqx~|}|||{ { {zzzzzzz zzz yy~zy{t|q|n}m}mlk~k~k~k~l}m}m}m}n}n}n}n}n}o}n|n|n|n|n|n|m}m}n|m|m|m|m|m|n|n|n}n|n|n|n|n|n|n|n{n|m|n}m}n|m}l}l|l|m|m|m}m}l~l~m|m|m|n|n}o}p}p~p~p~p~p~p}p}p}p}o}o}o~o~p~r}t}u}~{{{{ {{{{{{| | | | | | {{|}~{urqpo~n~m~mmmnnnn~n~n}n}n|nnmmmmmmnnn~n~mkjimnppq~q~p}o}rs~u}x|{{ywsrnojmhmflgkijjjhifiiiiiihigigigjhjhhhhhhhghgigigjgjfjfjfjfifififhfhfififieiejejejejejejekekekejejeififiejfjfjgjgihiihihihihihiihihihkhkhkhjhjgjgjgjhjhjijijhkhlgmgmglgkgkgjgjgjhkhkhihihiiiijijijijjkjkjkijijhjhjhjgihihjijijijhjhkikikililimimimimjkjkjkjljljljljlimimimimininininimimilijijhihihihkgkgkglhlhmimjmimimhnhnhnininjmjninhmglgkgkglgliljlkklklkklilhmhkgkgkfkfjgjgihhgjgjgjgkfkglglfmglgkgjgjgjgjhjhjgkgkglglglflgmgmglglglhkhlglgmgmfmfnfnfnfnfngmgmilimimiminhmhmgmfnfnfnfnfngmgmgmhnhmgmgmgmgmgmgmflflflflflflfmfmgkgkglhlhlhlhmhmimimimimhmhmhmhmhlhlgkgjgjgjfkgkhjhkhlglgmhlhlhlhkgkgkgjgjgjhjijikhkgkgjfjfjfigihihihhhihhhhhihigjgjhjhjhjhjhjhjiiiihihihighghghgighghghggggggggfgggggggggggggfggggggggggggfggggggfggggggggggggggfgfgfgfgfgfhfhfhfhfhfhfhfgegegehfhfgggggggggfgfgfgfgfhfhfgfgfgfgfgfgfgfgfgfgfgfgdfegefeefeidndrfxjxnyqzq{p{p|p{o|o|o|o}o|o}o}o}m|m|m|m}m}m}m}m}n|m}l}k}k}k}k}k~m}n}n}o}p}o|n|n|o}o}n}n|n}m}l}l~mlllmrz~}{{{{ zzzyzzzzz zzzyz|zw{r|o|m}l}n~n~m~m}m}m}n}n|n|n|n|o|o}o|o|o|n}n|n|n|n|m}m}m}m}l}l}l}l}l}m}n}n|n|n|n|n|n|n|n|m|m|n}n}n}n}m|l}n|n|n|n|n|m|k}k}k}l|l}m}n}n}o~o~p}p}o}o}o~n~n~n~n}n~n~n~o~q~s}t}~{{{{ {{z z{{|| | | | | |||}~{vrpoon~n~noonnnnn~n~n}n}nnmlllmmmmm~n~nmkknnnno~q}s}t}x|y||{{yvqm{lvlnlilgkgkgjhjgigighhhhgihihihhhhhhigigigigjgjfjfjfjfifififhfhgigifieiejejejejejejekekfkfjfififififjfjfjgjgihiihihihiiiihihihihjhjhjhjhjhjhjhjhjhjhjhjhjgkglfmglgkgkgjgjhjhjijiiiiiiijijijijijikikikhjhjgjgjgjgjgjhjijijijhjhjijijikikililililikikikilililililimimimimimimimimjljkjkjjjjjijijihkhkglglhlhlimjmilimhmhnhninjnjmjnjnimhmhlhlhlhljlkllkmkmklljljmgjfjgjfjfjgjfighgjgjgkfkglflfmfmfkgkgjgjgjgjgjgkelflflflglglglglglhlhlhlhlhlhmgmgngnfofpfpgpgphogohohpiqiqiqhphpiqiqiqiqirjrjrjrjrjririrhrhrgrgrhqhqhqhqiqipiqiqioioipipiqhqhrhrjsjrjririririqiqjqjpjpjoioioiohphqhqiqiqjrjqjqjpjojoiohohninininhmhmgmglflfkgkgkhkhkhlhkhkhkhjhjglglgkgkhkhkhjhjikikikikhjhjhjgjfjfjgjgigighghfggggggghghggggggggggggfggggggggggggggggfggggggggghfgfgfgfgfhfhfifififififieiehehehfhfhghggggggfgfgfhfhfhfhfhfgfgfgfgfgfgfgfgfgfgfgdgefffgeiemdsdwkxnypzq{q|p|p|p|p|p|p|p|p}p|p|p|m|m|m|n}n}n}n}n}n|n}m}l}k}k}k}k~m}n}n}o}p}o|n|n|o~o}n}n}m}m~l~lllllns~{}|{{zz yyyyzzzz zzzz}z{{x{t|q|n|m}l}n}n}n}o}o}n|n|n|n}n|n|o|o|o|o|o|n|n|n}n}n}m}m}m}k}k}k}k}k}k}l}l}n|n|n|n|n|n|n|n|l|l}m}m}n}m}m|m|n|n|n|n|m|l|k|j|j|j}k}k}l}m~m~n~o}o}o}n}n~n~m~m~n~n~mnnp~q}r}{{}{{{ zzz yz{{|| | | { }}|}}|wsppoo~o~oopoooooooonnmmllmmmmm~m~n~nmmnnoq~t~x}{|}|zzzz yuplgh~jtklkgkfkfkfjfifighghghhhhigigigigifigigjgjfjfjfjfigigighghgigififiejejejfjejejfjfjfjgjgigihhgigifjfjgigighiiiiiihihihihihjhjhjhjhjhjiiiiiihihihihihjgjgkflglglgkgjhjijijijiiiiiiijijikikikhkhkgkhjgjgjgjgjgjgjhjijijijhjhjijijijijikikikikikikikililililililililililililikjkjkjkkkkjkjkjkjilhlhlglglhlililjliliminininjnjnkmjnjninhmhmimilklllmkmkmkmllllmfhfifigjgjgjgjfjgjgkgkgkflfmfmfmflflfkfkgkgkglglelelelflglglhlhlhlhlilimiminhohogpgqgrfsgtgththtjtjtlulumununununvnvowowowowoxoxqwqwpxpxoxnxnxnxoxoxowowpwpvpvpvotououovnwnwnxnxpxpxpxowowowovovowovnvnumumumulvnynyoypxqwqwquqtquptptototototptmumultktktkskskslslsltltlslslrlqlqlqlqlpmpmomomoknjnjmjmimililhlgkgkfkfjfifighghghghhhhghghggggggggggggggggggggffgggggggggfggggghfhfgfgfgfhfhfifigifififieieieidhehfhghghggggggghfhfhfifhfhfgfffgfgfgfgfgfgfgfgfgfhfghgigkgogufymyoyq{q|p|o|o|p|p|p|p|p|p|p|p|p|n|n|o|o}o}o}o}o}n}n}m}l}l}k}k}l~m}m}n}o}p}o}n}n}m~m~m~m~m}m~mmmmllns~z||zzz yyyxxz z z zzzzzx{w{t|r|p|o|n}n}n|n|n|o|o|n|n|n|n}n|n|n|n{n|n{n{o|n|o}n~n~m}l}l}k~j~j~j~j~k~k~l~n|n|n|n|n}n}n}m}k}l}m}m~m}m}m|m|l}m}m}m}l}k}j}j}i}i~j}j}k~l~m~mm~m~m~m~n}n}m}n}o~n~nmmn~o~p~w{y{~{zzyy yz{{|| | { {}}||}|~wtrqpo~o~o~opooooooooonnnnnnnnmn~n~m~m~mnmoty~~}|||z zz{zvplbceh|ipkikfkhjhjhighghghgigifjfjfjgjgjfjgigigjgjgjhihiiiihihgigigififjfjfjfjeiejfjfjgjgihihhihhhhigigigighfhhihihihihihjhjhjhjhjhjhjiiiiiiiighghhhhhgigjgkfkfmglgkgjhjiijijjiiiiiiijikhkhlhlhkhkhkhjhjhjhjhjgjgjhjijijijhihiiiiiiiiiijijijijikikikilililililililililikikikikjkjkjljljlklklkkilhlhlglglhlhliljkilimininjnjnknkmknjnininimimilklkllklkmkmlmllmfgfhfigjgkgkgkgkglglglglflfmgngnfnfmfmflflfmfmfmfnfmflgkgkgkhlhmhlhmhohpisishthuhvhwhyhzj{k{m{nzo{p{q{rzsztzuzvzu{u{v{v{v|v|u|u|v|v|v|u|v|u|u|u|x|x|x|x|x|x|x{x{wzw{v{u{u{u|u|v|v|v|v|v|v|u{u{u{u{u{u{t{t{s{s{s{t~v~x}y|y{y{xzwzxzwzwzw{v{v{u{u{t{t{s{r{r{rzszszs{s{szszszszsysyryrxrxrwrwrvruquptotntmtlskrkqkpkojohnfmflgkhkijhkhjhihghghghhihhghghghghghghghgfggggggggggggggghfgfgfgfgfhfififigigififififififhfhfhfhfhfhfgfgfhfhfhfhfhggggggggggggggggggggfgfhfhfggfjeogtjwmwpxpyo{o|n}n}o|o|q|p|o|o|o|o|o|o|o|o}o|o}o}o~o~o~n~n}m}m}m}m}l}l~l}m}n}o}o~o~n~n~kkllm~n~n~n}mlkl~o~t}y|}|zzz y yxxxx xyyyz~zxzt{t{s|r|q|p|o}o}n|n|n|n|n|n|n|n|n}n|n|n|n{n{n{nzo|o|o}o}n}m~k~j~iihh~i~j~k~k~m}m}n}n}n}n}n}m}l}l}l~m~m~m}m|n|l}l}l}l}l}l}l~l~jjkklllmm~m~m~m}n}n}n|n|n}n}n}n~nnnnsv~z|~{zzz{| ||{ {|| |}}}}}}~w~srqponnnnp}p}p}p~o~o~nnonnnnnnnolm}q~qmlp~t~w~|}| |{{{{{|||yspecabehtjkkkjjjijgjgjfifjfjfjfifighghghghghhhgigihihiiiihjhhhgigifjekekejejfjfjfjgjgjhjijijiiiihigigigigigjgjgjgkgkhkhkhjhjgjhjhjhjhihihihigigigigigjgjgjfjgkgkhjhjijiiiiiijiijhjhjhjhjhjikhjhjhjhiiiihihihhjhjhjhjhkhkhkhlijijijiiiiijijijhjhjhkhkhkikjkjkikikikikikikikikjljljljljlklklklkljkikhkhkikjkjkkkjljmininininjnjmjmjnjnjnjmikikkkkkkkkkkkklklklfifjfjgkglglglglglglflglgmfmfnfofofnfnfmfmfmfmfmgmgmglglgmgogpgqititjvkwkylymzmzl{m|m}o~q~r~u~v~x}x}y}y}y}z|z|z|z}z}z}{}{}z}z}z}{}{}{}{}{}{}{}{}|}|~|~}}~|~|}|}|}}}|}|}|}|}|}|}{~z~z~z}z}z}z}z}|}{}{}{}{}{}{}z}z|}~~~}}}}}|||}|}|}|}|}|}{}{}{~{~z~z}y}z}z}z}{|z|z|y|y|y|y|y|x|x|x|y{xzxyxyxywxwxvxuwuvtvtutursqsorlqkqjpjokokmkljjjijhjhjijiihihhghghghggggggggggggggggggggghfhfgfgfgfhfhfififigigififififififififhfhfhfhfhfhfhfhfhfhfgfgfgfgggggggfgfgfgfgfgfgfghflfrhvlxpxpzp{o|o}n}o~o}p}p}p}o}n}n}n}n}n}o}n}n~n~n~n~nnn~n}n}n|n|m}m}l~m}m}n}n}o}n~n~m~kll~m~m~n}n}n}llkk~m}q}u|w|zzzyyyyy yyyzzzz{u{r|r|r|q|p|p|o|o|n|n|n|n|n|n|m|m|n|n|n|n|n|n{n{n{o}o}o}n}m}m~l~k~jjjjj~j~k~k~l}l}m}m}n}n}n}n}l}l}l}m~m~m}m}m|l}l}l}l}l}l}l~l~kkklll~m~m~m~n~n}n}n|n|n|n|n}n}n}n~n~nnnrsu~w}y|y|y|y}}}} ||{ {{{}}}}}{~vroonmmmmm~o}o}o~o~n~o~noo~o~n~n~n~n~n~o~omm~q~pmp}w|z{{{{{{{|||}}zurgda`ce g~gmkkjikijijijfidigighghgggghgghhhhigjgjgjgihiihihghgigjfjekekekfjfjfjgjhjijjjjjjjiiiihigigifjgjgjgjgjgkgkhkgkgjhjgjgjgjgjgigigigigifififjfjfjfjfjgkgkhjhjijijijiijiiihihihihjhjhjhjhjhjhjhjiiiiiihjhjhjhjhkhkhlhlhkhkhkhjhjhkhkhkikhkhkhkhkikiljljkjkjkikikhkhkhkjljljljljkkkkkkkkkkjjjijiiijjkjkjljlimimimimimjmjljmjmjnjnjmjkjkjkjkjkjkjkjljljlfkfkflfmfmgmgmgmflglglflfmfnfnfoepepepfofofnfnfnhohpiqiritjvjxjxn{n|o}q}r~t~u~u~tuvwyz|}||||~|~|~|~|~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}~~~~}~}~}~~~~~~~~~~~~~~}~}~~~~~}~~~~~~~~~~~}~}}}~~}~}~}~~~~~~~~~}~}~}~}~|~|~|~|~|}|}||||||||}{}{~z}z}y}y|y|yzwywxwvvtvruqupuornqnomlljkjjiiiihihihhghggggggggfgfgfgfgfgfgfgfhfhfhfhfhfhfgfgfigigifigigififififififififhfhfhfhehehehfhfgfgfgfgfgfgfgfgfgfgfgfgegfgifnfuixnyryp|o|o}o}o}o~p~q~p}p}o}n}n}n}n}n}n~n~n~n~n~n~m~m~n}n}n|n}n}n|m}m}n}n}n}n}m}n}m}m}l}m}m}m}n}n}n}n}ll~k~k~l}n}p}q}x|x|y|z{|{}{~zzyyz~{|{x|t|q}n|o|p|p|p|o|o|n|n|n|n|n|n|m|m|m|n|n|n|n|m|m|m|m|n~m~m~m~m~m~m~m~lmm~m~m~m~m~m~l}m}m}n}n}n}n}m}m|m}m}l~l~l}l}k}l}l}l}l}l~l}l}l}m~m~m~m~m~m~m}m}m~n}n}n}n}n|n}n|n}n}n}n}n~n~n~nqppp~q~t}u}w}{}}||{{{{}}}}}~ysnnmmmmmnn~o~n~m~m~m~n~noq~p~o~o~n~n~o~o~on~o~rqp~y{xvxyz{|||}}}}}zvrjgc`abcbzhshljijjjjjhieihihhhhhhhhhhhihihjgjgkgjgjgihhiggigifjfkfkfkfkfkgihiiijikikikijijijiiihjhjgjhjhjijijikhkhkhkhjhjiiiihigigjfjfjfjfjfjfjfjfjfjfjgjgkgkhkhjijijijijjiiihjgjgjgjgjhjhjhjhjhjhjhjhjhjhjhjhkhkhkhlhlhlgmglhkhkhjikikikjkikikhkhlililjlkjkjjjjkikhkhlhljljljljkjkkkkjkjkjkjjjjijijjjkjkjljmimhmhmhlilikjkjljmjmjmjmjljkjkjkjkjkjkjljljlflflfmgmgngngnfnfmfmfmfmfmfnfnfoepeqeqfrfrfrgqgqiujvkwlym{n}o~pt~u~vwxz{~{~|~|~}~}~}~~~~~~~~~~~~~~~~}~~~~~~}}}}}}}~~~~~~~~~~~}}}}}~~~~~}}}}}}||||{zzzzzzzy~y|xzxxxvxwxvvusspqmnkljkijhihihhghggggfgfgfgfgfgfgfgfgfgfhfhfhfifhfhfhfgfhghghghghfhfhghfieieieieieiehehehehehehehfgfgfgfgfgfgfgfgfgfgegehdhfgjfpgwizn{qzp|o|o|o}o}p}q}q~p~o~o~o~n~n~n~n~n}n}n}n}n}n}n}n}n}n}n|n|n|n|n|n}n}n}n}m}m}m|m|m|m|m|m|m|n|m|m|n|m}m}l}l}l}m}n}n}q~q~q~r}t}v}x|y|{z|z}{{{v|r}o}n}l}m}n}o}o}o}n|m|n|n|n|m|m|m}m}m}n|n|n|m|m}m|m|m|m~m~l~l~l~m~n~n~o}o}p}p}p|p|o|n|o}o}o}o}n}n}n}m}m|m}m~l~l~k~k}k}l}m}m}m~m~m~m}m}n~n~n~n}n}n}n}n}m}m}m}n}n}n|n|n|n}n}n}n}n}n~n~n~onnm~o~s~w}z}|{{{{||}}}}}|}z~vpkmmmmmmnonnmlmmn~o~q~q~p~o~o~o~o~o~o~o~p~rrt}xuuvx{}}}}}||||yvrmiea `a``d~fpgiiijkjjihihihihihihihjijijhkhkgkgkfjgighhhfifjejfkelelekfkgihijilililikikilikjjjijijijijijjjjjjkikikikijijjiiiiihigjgjfjfjfjfjfjgjgjgkgkgkgkgkhkhkikikikikjjijhkgkgkgkgkgkhkhkhkhkgkgkgkgkhjhkhkhkhlhlhlhlhlhlhkijijjjjjjjjkjkilililililjljjjjjjjkikilililjljljljkjkkjkjkjkjkjkjkjjkjkjljmjmimimhmhmhlikijijikjljmjmjmjljkjkjkjkjkjkjljljlfmgmhmimingnfnfnfnfnfmfmfmfnfofpfqereseufugviwjwk}m}n~q~s~uww|||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~}}}||||||||{{{{{{zyxwx}y}y{y|x{wzuxrtpqnollllkjjiihggggggggfgfgfgfgfgfhfhfhfifjekekejfifhfgghghgigifhfhfgehfhfhfieieieieiehfhfhfhegegegegegfgfgfgfgfheheheiegfdjdrgyk|n|oyo{o{p|p|q}p}p}o}o}o}p}p}p}o}n}n}n}n}n}n}n}n}n}n}o~o}n|n|n{n|m}m~m~m~m~m}m}m|m|m|l|l|m|m|m|m|m|m|n}n}n}n}m}n}n}n}o~o~n~o~o}q~r~s~t|u|v|t|q}o|n}n}m~m}n}o}n}n}m}m|m|m|l|l|k|k}k}l}m~m~m}m}m}m|m}m|l}l~mm~n}o|o}p}p|p|p|p|p}p|p|p|q|q|p|o|n|n|m|m|l~l~lkkk~k~k}j}k}l~l~m}m}l|l|n|n|n|n}n}n}m}m}l}l|m|n|n|n|n|o|o}o}n~n~n~n~n}n}o}o}n}m~n~s}y}|}zz{{|}}}}~}~z~wtpnmmmmmmnnoonmmmno~p~r~r~q~p~p~o~nnpoopt}}wrvxz|}}}}|{z{zyurjhf d a```ceugkijkkkjjhjhjhjijijjjjjkjkjlklklklkljljlilikhkhkikjkkkkjkjkmjmjmjmininininiokojojojojojnjnkojnjmkkljljljkjkijijhjhjhjhjhjgjfjgjgkgjhjgkgkgkflflglhkikikikikjjjjikikhlglgmfmhlhlhkhkgkgkglglhkhkhkikikikikikjjjjjijijijjkjkkjljlimimhmhmgmgmililhlhlhlgmhmhmimimjmjlklkkkjkjjjjjjkjkjlimhmhmhnhmhmhlhkhkhjhjhjhkhmhnhmhmhlhkhmhlikjkjjkjkkjkgmgmhmhmhnhngnfnfnfnfmgmgmgogpgqcudvdxfyi{k}m}o~qrtvyz{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}}}}}}}}||||||||{zyxyyzzyyw~v{tyrwquornnmjkgighgghfhfhfhfhfhfhghghghfifjejejejfighghghgigigigifhfhfhfhfhfhfhfhfieiehfhfhfgfgfgegegegfgfgfgfgfhehehehffienftizm|o{pyo{o{p|p}p}p}p}p}n|n|o|o|o|n|n|n|n}n}n}n}n}n}m}m}o}o|n|m|m|l}k~km~m~m~m}m}m|m|m|l|l|l|l|m|m|m|m|m|m|m|m}m|m}m}m}n|n}n}n}n}n~o~oo}p}q}p|n|m}m}n~m~n}n}n}n}n}m}m|m|l|k|k|j|j}j}k}m~m}m}m}l|l}l|l|l}m~m~n}o|p{q|r}n|n}n}o}o}o}p}p|q|q|p|o|n|n}m}l}l~l~l~l~l}l|l|l{k}k}l}m}m}m|m|m|n|n|n|n|m|m|m|m|m}m}m}n}n}n|n|o|o}n}n~n~m~n~n}n}n|o}n}n}n~q}u}y}}{}{~|~|}}}}{~z~x~w~v~trpoonmmmmnnnmmmmnopqr~r~q~p~p~o~oopnmpw{vrvwy|}}}}|{yyxvspig f¡c¢b aaace{goikkmknknjmknkpksjujwiyizi{i{i{h|h|h{h{h{h{gzhzhzizizizhzhzhzhzh{i{i{i{i{i|j|i|i|h|h|i|i{jzjxkvktlqlplnlmklklklklklklklkljljljlklkkkilhlflglglhlikjkkklklkjjjjjjikikhlhlhlikikikikhkhkhkhkhkikikikikikikjkjijijijijikikjkjjljljlilimhmhmhmililhlhlgmhmhmhmininjmjmjljkkjkjjjjkjkjkjlilimhmimhmhlhlhkhkhjgjgkglgmgmgngmgmglhmhmiljkjkjkjkjkgmgmgmhmhnhnhnhngngngngogqgsgufwfzg{i}l~oruvxyz|}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}|||||{{zzzzzzzyy~w|v{v|syruppnlljiighfififififhfhghghghfhfieieieifhghghfhfigigigifhfhfhfhfgfgfgfgggggggggggggfgfgfgfgfgfgfgfgfgfheheheghfmfshxk{o{q{qzq{p|p}o}o}o~p~p}o|o|o|p|o|o|n|n|n}n}n}n}n}m}m}m}o|n|m|k|j}j~kkl~l~l~l}l}l|l|l|l|l|l|l|l|l|m|m|m|m|m|m|m}m|m|m|l|m|m|n}n}n~n~m~m}n}o|n|m|l}l~m~l~m}m}m}n}n}m}m|m}l}k|k|j|j}j}k}m}m}m}m}m}l|l|l|m|m}n~n}o{pzq{r|m|m|n}n}n}o}o|o|p}p}o}o}n~n~m~m~m~m~m}m|m|m|m|m|k}l}m}m|n|n|m|m|n|n|m|m|m|m|m|m|m~m~m}n}n}n}n}n}n}n}n~m~m~m~n}n}m}n}o}o}n}n}p~r~t}u}v}v}v~u~u~tqqqqppoonnnmmnnnmmmnnopqq~q~p~p~p~p~ppnlkpz| wsqvwy{|}}}}{yxvtqnihf¡d¢c¡cdddefyhuhvixhzh}j~ihg ffedeeefffffffgggffeeeffghiihhgggghhjjjkkk}k|jzjzj{j{j{i{i{i{iygyhyixjukqkmlkmililhlhkhkikjkkkkjkjjjjkjkjkjkjkjkjjjjjjjjijijikikikikikjkjkjkjkjjjjjikikikjkjkkjljljljljlilimimjlimimhmhmhmhmimininjnjmjljkjkjkkkkkkkkljljlilhlikikhkhkgkgkgkgkgkglflgmgngngnhnhnimimjljkjkjljlgmgmgmgmgnhnhnhngngngpgrfufyf|g~l~npsvy{|{|}~~~~~~~~~~}}}}}}}}~~~}}}}}}}}}}}|||{{yzzzzz~y}y~v}u{swqsnokkhhfjfjfififififhfhfhfhfhehehehfhghghgigigigjgigighgggggggggggggggggfgfgfggggggggggfgfgfgfgfgfhehehefifogwi{m|pzqzq{q{q|p|o}o~o~o~p~p|p|q|q|q|p|o|o|o|o|o|n|n|n|m|m|m|l|k}j}i~j~k~k~k~k~k~k}k}k|l|l|k}l}l}l}l|l|l|l|m|m|m|m|m|m|m}m|k}l}m}m}n}n}n}n}m}o}p}o}m}l}l~m~l~l}m}n}n}n}m}m|n}m|l|l|k|l|l|l|n}n}n|n|n|n{n|m|n|n|n}n|n{ozo{o|n}m}n}n}m}m}m}m}n~n~n~n~n~n~nnn~n~n}n}n}n}n}n~l~m}m|n|n|n{n|n|n|n|m|m|m|m}m}m}n~n~n~n~n~n}n}n}n}n}n~m~m~m~m}m}m}n|o|o|m}m}m~nn}o}p~q~q~ppooonnnnnnonnnnmnnmnnnnooop~p~p~p~p~p~ppq~nntyspouvxz|}}~~|ywvspnjig f fffgefffffeegfedca``bcccddeeffffeddcabccefgghhgggghhhiijjjiihhggffffdefgij{kxkplolmlkkjkikjkjkkjkjkjkjkkkkkkkkkjkjkijijijijjjjikikikikjkjkjkjkkkkkkjkjkjkkkklljkjljljljljljljljmjmimhmhmhmininjnjninimimilikikkkkkkkklkljlililikikhkhkhkgkgkfkflglglgmhmhnininininjmjmjljlilimgngngngogogogogogqfreueye}gijrvz|}}~~~~~}}}}}}}~~~~~~~}}}}}}}}|||{{{{{{{~{~z}z~x~w~u~t{svpokjhkgjgigjfjfjfhfffgfgfgfgfgfgfgggghghghghghghghggghghghgggggggggggfgfggggggggggggggfgfgfgfgfgfgfgffkfqhwl{o{rzr{q|p|p|p|p}p}p}p}p}q}q}p}o}o}o}o}p}p}p}o}n}n}m}m}l}m}l}k}j~i~jklk~k~l}l}l}l}l}l|j}j}k}k}k}l|l|m|l|l|l|l|l|l|k}k~l~k~k}l}l}m}n}n~n~n~m~m}m}m}l}l}l~m~n}n}o}n|n|n|o}n|k}k|m|m|n|m|o}o|o|o{o{o{o|o|o|o|n|n|n|n|n|n|n}n}n}n}m}m}m}m}m~m~n~n~o~n~o~n~nnn~n}n}n~m~m~m}n}o|o{o{o{n|n|n|n|m|m|m|m}m}m}o}o}n}n}n}n}n}n}n|n|m}m~m~m~m~l~o}n|n}n}m~m~llm~m~n~n~o~n~n~n~n~n~n~n~n~n~n~n~n~nnmmmn~m~o~o~o~p~o~onnoooopppqsqq~y{vrnlstvyz|}~ ~~|yuponkji ggghhgfdbaabccccbbaaabbcdddddeeeeeeeeccddefffgggggghhhhgghgggffffeeeeccdefghhi~ixjsjojnjljjjjjjjjkjjjjkkkkkkjijikikikikijijihjhjhkhlhmhmimjmililjljlkllkljmilkkkjkikilimimimininimimimimimimimimimimililhlhljljljljljljljljlililikikikhkglflflflhmimimjnjnjnhnininjnjmimimhmgngngofoepeqererevexezg}ilopvy}~~~~}}}}}}~~~~~~}}}}}}}}}|||{||{{{~{~{~{yxwv~uzstopklijhihihjgjfhfgfgfgfgfgggggggggghghghghggggggggghghggggggggfggfggggggggggggghghggfgfgfgfgfgfgfgffkgphwl{pzrzr{q}p}p}p|p}p}p}p}p}o}o}n}n}n}n}n}o}p}o}o}n}n}m}m}m}m}m}k}k}k~k~l~ll~l~l~k~j~j~j~j~j}k}k}k}l}l}k}k}k~k}k}k}k~k~jjkjjjk~l~m~m~n~n~m~m~m}m}m}m}m~n}n}o}o}o}o}o|o|m|k|k|m|n|n|m|n}n}n|n|n|n|n|n|o|o|o|n}n}n}m}n}n}n}n}n}n}n}n}m}n~n~n~o~o~n~n~n~mmm~m~m}m~m~m~n|n|n|o{o{n|n|n|o|n|n|m|m|m}m}n}o|o|n|n}n}n}m}m}m|m}m}n~m~n~n~n~o|n}n}n}n}m~m~m~n~n~o~o~o~n~n~n~n~n~n~n~n~n~n~n~n~nnmmm~n~n}o}o}p}p}p~onnooopppqqsrs}z{wrnkpqsvxz{|}}}yupnnkjiggghhedba``abccbbbbbbbbcdddcceeeeeeeedddeeffffffgggggggggffffffeeeeedcccddeffeeffg|gvhrhoioiniljljljlklkjjjjkjkjkjkjjjjjijijhkhlhmhmimimhlimimjlkllkljlilkljjjijhkhlhlhmhmhmhmhmhmhmhmhmjljljljljmjmjmjmkljljljlililililkljljkjkikhkglglglglhmimjmjmjmjminininjmjmjmjmimgogpfpeqeseuewfxe|f}h~lortv{}~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~}}}}}}}}}}|||||||{{{{{zyyx}vztwqpmnllkjjjijhhggggggggggggggggggggggggggggggggggggfgfgfgfgggggggggggggggghghghghghfhfhfhfhfhfhfhffjgphvlzpzszs{r|p|p|p}p|p|p}p}p}n}n}m}m}m}n}n}n}p}o}o}o}n}n}n}n}m}m}m}m}m}m}n~n~m~m~l~k~j~i~i~h~k}k}l}l}l}k~j~j~jj~j~j~j~jjjjjjjkl~m}m}n~n~n}n}n}n}n}n}n}n}n}n}n}n}n}n}m}l}k|k|m}n}m}l}mm~m~m}m}m}m}m~o}o}o}o}n}n}n~n~n}n}n}n}n}n}n}m}n~n~n~o~n~m~l~l~lll~l}m}m}m}m}n|n|n|n|n|n|n{n{o|o|n|m|m|m}m}m}n|n|n|n}n}m}m}m}m}m}m~n~n~n~n}o}n}n}n}n}n}n}n}n}n}o}o}o}o}n}n}n}n~n~n~n~n~n~n~n~nnnnn~n~n}o|o|p|p|p}p}ponoopppqqqrs~v~{|xsnjjlnruvxxz{{xtpmlkjhgfffgddbbaabbbbbbccccccddddcceeeeeeeeeeeffffgffffeeeeeeeeeeddddddddddddcdddccbcccdeeef|fxgthoimjkkjkklkkkkkkkkjkjjikijijhkhlhmhmimimhmhmimjljlkjlilhkjkjjjijhjhkhkhlglglhlhlhmimimimklklklklkmkmkmkmjmjmjmkmjmkmkmkmmllmkmkmimhmhmhlfmgmhmimjljlkljlimimimimjmjmklklgpfqfqesevfyg{h}m~n~quwz{|}~~~~~~~~~~~~~~~~~~~~}}|}}}}}~~~}}}}}}}}}}}}}|||||{{{}~|~zzzy}x{vurrqopmmlljihhfgghggghgggggggggggggggggggggfgfgfgegfgfgfgggggggggggggghghghghghghghghghghghghghgfigohvlzpzszs{s|p|p|p|p|p|p}p|p|n}n}n}n}n}n}o}o}o}o}o}o}n}o}n}n}n}n}n}n}n}n}n}o}n|m}m}l}k}j}j~j~k}l}m}m}m~k~i~h~j~j~i~i~i~iiikkjkkl}m|n{n|n|n|n|n|n|o{o{n}n}m}l}l~m~m~n~m}l}k~l~m~m~mklll~l~l}l~l~l~p}p}o}o~o~n~n~n~o}n}n}n}n}n}m}m}n~n~n~m~m~k~k~j~l~m~m}m|m|m{n{n|n|n|n}m}m}n|n{n{p|o|n|n|m|m}m}m}n|n|n|m}m}m}m}m}m}m}n~n~n~n~n}n}n}n}n}n}n}o}o}o}o}o}o}o}o}n}n}n}o~n~n~n~n~n~n~n~nnnnn~o}o}o|p}p}p}q}p}p}o~o~o~p~p~p~q~q~q~q~p~r~v~||xsnjgiknqtvwxyywsokjihgedddeddccbbbbabbbccddddeeeeddfffffffffffffgggfeeeedddddddddccddddddddeedddccccccddddddefgyisjnkllkmkmkmklkljkikikjjijhkhlhmhmhmhmhmhmimimjkkjkilhjjijijhihjhjijikhlhlhlilimjmjmjmlkkklllllmlmmmmnmmnmomqmrmtmumumonnnlojpiphohohngngmhmimjlklkkkkjmimimimimjlklllereseudyd}fjnt~v~x{}~~~~~~~~~~~~~~~~~~}}}}}}}}~~~}}}}}~}}}}}}|}||||{{~z~}~|~||{~z~y}xzwxvutsrqqnnikfhgigighgggggggfgggggggggggghfhfhfhfhfgfgfgfgfgfgggggggggggghghghggggggggfgfgfgfgffignhtjymzo{p{q|p|p|o|o|o}n}n}m}n~m}n}n}n|o|p}p}p}p}o}o}n}n}n}n}n}n}n~m~m}n}n}n|n|n|l|k}j}j}k}l}m}m|m|n|l}j}h~giiijjjjjjjklm~n}n|o{n|n{n|n|n|n|n{o{n}m}l}k}k~l}m~n~m~m}m}m}m}m}m~mmmmm~m~m~m~m~q~q~q~q}p}o}n}n}o}n}n}n}n}m}m}m}m}m~m~mml~l~l}n{n{n{n|n|n{n|n|o|o|o|o|n|n|n|n|o}o|n|m|m|l}k}k}m~m~m~m~m~l~l~l~n}n~n~n~n~n}n}n}n}n}n}n}n|o|o}o}pppo~o~o~o~o~poo~n~n~nnnnnnnooo~p~ppqq~q~q}q}q}q~q~r~s~s~r~q~q~qqu~{| xrmigeehkprtuuutqnjhgffeddccdddccbbbbcccdddeeeeffffeggfffffffffggggfeefffeddddddddddccddddddddddddccddddddddeeeefhziujpkolmmlmjmjljkjjjjjjikhlhlhlilhlhlhlilikjkjjjjjjhkhjijjjjjjjjjjkjmilhlikjlklkmjmkkmlplrlsmumwmynylym{m~mm mm mozoqpkqhrgrhrhrgpfognimkmlmjmimimimjmjmjmkmklkldydydzd}ejqu{~|~}~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}}}}}|}}|||{{{~}~}~}}|{{z~z|xzvyvvusrnoklhjhjhhgggggghghggggggggggghfhfhfhfhfhfhfhfhfhfhfgfgfgfgfhfhfhfhfgggggggfgfgfgfgffigmhsjxmzn{p{p|p|o|o|n}n}n}n}n}n~n}n}o}o}o}o~o~o~o~o~n~n~m~m~m~n~m~m~m~m~m}m|n|n|m|l}k}k~k~l}l}m}m}m}l}k~j~i~hj~k~l~l~l~l~l~k~kklm~n}n|n|o{n|n|n}m}m}m}n|n|m|m|l|l|l}l}m}m}l}l}l}l}l}m}n~n~n~n~n~n~n~m~m~m~p~p~p~p}p}o}n}n}n}n}n}m}m}m}m}m}l}l}l~m~m~m~m}m}n{o{n{n|n|n|n}n|n|n|o|n|n|n|n|n|n|n|n|m}m}l}l}k~m~m~m~m~m~n~n~n~n}n~n~n~n~n}n}n|n}n}n|n|n|o}o}o~pppoooo~o~o~o}o}n}n~nnnnnnooooopppp~q~r~r~r}r~r~s~s~s~s~r~r~stw~}|wrlhfdcdgjkkoppomkhgfffeeddcdddddccccccccdddeeeeffffgggffffeffffgfggffffffeeddddddddddeeeef fffeeeedddddddddddddddeeegh}ixjtjqjojminimjljkkkkjljkjkhlhlgkhkhkijijijhkikijjjkjkjjkjkimjlklkkkkjkjlilplvk~k jjiijjkllmnoppqqwrqsmtkthtgsfrgqipkolnknjnhnhnhnimimjmjljlbdfhjouy}~}~~~~~~~~~~~~~~~~~~~~~}}}}}}|}}}}||{{~}~}~}~}}||||zy~y}xzvusrpkljkjihggggfhghhgggggggggghfhfhfhfhfhfhfifieieiehdhehehehfhfhfhfgggggggfgfgfgfgffgglirkwmynzo{o|o|o|n}m~m~m~n}n}o}o}p}p}o~n~mlnnnmmlllmmlll~l}m|m|m}m}m}l~l~l~m}m}m}l}k~jjjjjl~m~n~n}n}n}n}n|m~m~m~n~n}n}n|n|n|n}n}m}m}m}m}m|l|l|l|l|l|l}l}l}j}k~k~k~l~m}n}n}n}n~n~n~n~n~n~n~n~o~o~o}o}n}n}m}m}m}m}m}m}m}m}m}l}l}l~m~m~m~m}m}n{n{n{n|n|o|o|o|n}n}m}m}m}m}m}m}n}n}n}m}m}m}m}m}m~m~n~n~n~n~o~o~o}n~n~m~l~m}m}n|n}n}n|n|n|o}o~o~pppooo~o~o~n}n}n}n}n~oooooooooooo~o~o~o~q~r~t~u~t~t~t~t}t}t}t}t}v~v~w}}{wrljigffhiihijjjihffeeeeedddcccccccccccdddddddeefffggfgffeeeefffggggffeeeeeeeeee e e¡e e f¡f¡f¡g¡g¡h¡h¢h¡h¡h¡h¡g¡g fffeeeedddddddddcccdeefff}g{gwhvhtiqjnjmkkkkkkkjkjkikhkhkhkikhkikjjkjkjkjkkkkhmklllkkjkjkmkpkzkjhffghinnoprrttstuv|vwwswpwjyiwgugthqjpiohogogognhnhmimilileinsuwz|~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~}}||||{|~|~}~}~}}}|}|zzzx{uxronmlkjiggfggghghgggggggggghfhfhfhghfififieiejdjdidididhehehfhfgfgggggfgfgfgfgfgffggkirlvnynzn{n{o|n|n}m~mm~n}o}o}p}p}p}o~nlknmmmllkkmllll~l}l}m|l}l}m~m~m~m~m}n}m}l~jiiijkmnno~o~n}n}n}n}n}n}n}n}n}n}n|n}n}n~m~m~l~m~m}l}l}l}l}l}l}l}l|i}j~j~j~k~m}m}n|n}n}o}n}m}m~m~n~n~n~n~n}n}n}m}m}l}l}l}l}l}l}l}l}m}m}m}m~m~l}l}l|n{m{n{n|n|o|o|o|m}m}m}m}l}l~l~l~onn~o}o}o}o}o}o}o}o}o}n}n}n}n}o}n~n~l~l~l}m}n}n|n}n}n|n|o}o~o~p~p~p~o}o}o}o}o}m~m~n}n}n}o~o~ppppopooon~n~n~n~p~s~t~v~v~v~u~u}u}u|v|v|w{v|w||{ wrnkjhffghgfffggffffdddeeeddeeeffeeeeeeeeeeeddeeffggggfffeeeeeffghgheeddddddffff f f f¡f¡f¡g¡g¡h¢h¢i¢i¢j£j£i£i£h¢h¡h¡g g g g g f feeedeeffedddddddeeegg hi|jxjujtjqkpkmkkkikikikikilikjkkjkjkkkkklimkmllikhjkjsj{kihfeegjluuvvvwwxxxyzz yyxs|pzlyjvjtjriphpgogognhninimjljlrtwz|~}~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}|||||||~}}|}}~}}}|||{zyw~vyqtonkiiggggghgighgggggggggfgfhggggghfhfhfhfieieifhfhfhfhfhfhfgfhghfhfgfgfgggggggggjinksmxnzn|n|o|o|n}n}n}o}p|p|p|p}p}o}n~nllmmmmmmmmmmm~m}m}m}m}m~l~l}m}m}n}n}n}m}kkkkkkk~k~m~m~n~n~n~n}m}l}n}n}n}n}n}n}n}n}n}n}n}n}n}m}l~l~k~k~k}k}k}k}k}k}j}i~j~jkl~m~n}m}n|o{n|m~ll~l}n|n|n}n}n}m~m~lk}k}l}l}l}l}m}m}n~m~m~m~m}l}l}l}l|l|m|m|n|n|n|n|m}m|l}l}k}l~lmoo~o~o~o~o}o}o}o|o|o|o}n}n~n~n~p~o~n~l~l~l~m~n~n}n}n}n}o|o|p|p|q|q}p|p}p}o}o}o}n}n}n}n}n}o}o}p}ppprs~s~qpo~o~n~o~prtux~w~w}v}w|w|x|x|y}x|x{{zxsmijjihgggggffeeeeeefgijkklmmmmlkkkiihggffeeefffgggggfffeeeffffggghgfeddd e e f f f f f f¡f¡f¢g¡g¡g¡h¡h¢i¢i£j¤i¤i¤i£i£i¢i¢i¢i¢h¡h¡h¡h hggggfgfggggfffeeeedfgijjj iij~j{jtkmkikilkllkkkijijjjkjjkjkiljljljllksj}ihhgfehlqtyyyyy{|||||||{{{~{}r{m{lzmwjtgqhqgogngmgnhnjljk{~|~}~}~~~~~~~~~~~~~~~}}}}}}}}}}}}|||||||~}~}~}}}|}||zyxw}tyrrnmkkiihggfgghgggggggggggggggggggggghfhfhfififhfhfhfhfhfhfgfhfhfhfgfgfgfggggffgihmjqlvmynzo{p|p|p|o}o}p|p|q|p}p}p}p}p~onmmmmmmmmmmmm~m}m}m}m~mlmm~n}n}m}l~l~iijkklllkk~l~l~l~l~l~l}m~m~m~m~m~m~m~m~m~m~n~n}m}m}l}k}k}k}k}k}k}l~l~l~j~j~j~jjklmn}o|p{n|m~kk~k}n|o}o}o}n}n~m~mm}m}m}m}m}m}n}n}n~n~m~m}m}l}l}l}k|k|l|m|m|n|n|n|m}m}m|l|l}l}l~m~n~n~n~n~n~n}n}n}o|o|o|o}n}n~n~n~q~p~o~m~m~m~m~n~o~o~o}o}p}p}p|p|q|p|p|p|o|o}o}o}n~n}n}n}n}o}o}p}oooqstsrq~q~p~q~q~suvy~x~y~x}x}y}y|y|z|y|x{yzyuokkjigfeeeeeeeeefgmnprsuvvvvvututtponljigffffgggggggggfffeeefggfgfffeddd e e¢f¡f¡f¡f¡f¡g¢g£g¢g¢g¡g¡h¡h¢i£i£j£j£j£j£i£i£i¢i¢i¡h¡g¡g¡g ggggggghhiiihhhggfffffghhhggggg h|itjnkkljkikikjklkmklkjknlkliknkxjihgfffhlrwz{{{{|}~~~~~~}}}} ~}{|s|l{jxivgrfpfnfmfngninjl~~~}~~~~~~~~~~~~~~~~~~~~}}}|}|||||||~}~}~}||}|{zyxv}uxrtoplmjihfgghgggggggggggggggghghghghghfhfhfifhfhfhfhfhfhfgfhfhfhegegfgfggggffghglipkumxnzo{q|p|p}o}o}p}p|p|o}p}p}q}q}q~q~p~o~o}o}o}n}n~nnnnn~n}n}n~nnmmmm~m~l~kkiijkklllkkkkk~l~l~l~m~m~m~m~m~m~m~m~m~m~n~n~m}m}l}l}k}k}k}k}k~k~k~k~j~j~i~j~jkllm}n|o|n|m~kkk~m}n}n}o~n~n~n~m~n}n}n}n}n}n}m}m}o}n}n}n}m}l}l}l}j}j}k}l}m}n}n}n}l~m}m}m|m|m|m}m}m}m}m}m}m}m}m}m}n|n|n|n}o}o~o~o~r}q}p}o}n}n~n~n~oo~o~o~p}p}p}p}q|p|o|o}n~o~oonmmmnn~o~p~onnpsttssrrr~s~t~v}w}y~z~z~z}{}z}z}z}||z|w|x||{vpljigedddeeefhjkmnrsuwxzz{zzzzyyyywvutqonmkkjiiggggggfeedddefggfedeeedd d e¡e¢f¡f¡f¡f¡g¢g¢g£h¢g¢g¢g¢h¢h¢i£i£j£j£j£i¢i¢i¢h¢h¢h¡f¡g g f f fffggghijjjjiihgggffgfgfffedddef h{jujollljmjmjmkmkljlnlmlpjyjihggefhkpv{~}}}}}~~~~}}|~r~k}h{fufsfpfngnhojojn~~~~~~~~~~~~~~~~~~~~}}}|}|{{|||~}~}}}}}|||{zywv|txrtnpkkigghhgghggfgfgfgggghghghghghghghghgighghghghghghggghfhfhegegegfgfggfffiglhpjumxo{p|p}p|o}n}n}n}o}o}o}p}q}q}r}r}r}r}r|r|q|q|q|p}p~p~nn~n}n}n~nnnnnnmmkjjkkkkkkkkkkkkkl~m~m~l~l~l~l~l~l~l~l~nn~n~n~n}n}n}n|m|m|m}l}k~j~j~ijj~i~i~j~jkll}m}n|n|mllm~l~l~m~m~n~m~m~l~n}m}m}m}m}m}m}l}o}o}n}n}m}l}l}k}i}j}j}k~l~m~n~n~l~l~m}n|n|n|n|m|n}n}n}n}n}n}n}n~n|n}n}n}o}o~o~o~r|r|q}p}o}o~n~n~oooo~o~o}o~o~q}p}o~n~nnnolllllmnnpoopr~s~srutts~t}v}w|x|z~{~|~|~}}|}|}{}}}z}x~x}}{wpkigedccdefgilpsvwvwxz{{{||||{{{{{{{zywwvurqoljgfeffeeddccdefgfedcdddee e d¡d¡f¡f¡f¡f¡g¡g¢h¢h£f¢g¢g¢h¢h£i£i¤j¤i¤i£h£h¢g¡f¡f f¡f f¡f¡f e e eeffgh i j¡k¡k¡j i i h ggffggggffeedcccdegh~lxmqnkojolnmmnllmtljhggggfgimrw{}~~~~~~~~}}}rg~fyfufrgogninjnln~~}}~~~~~~~~~~~~~~~~~~}}}|||{{|||}~~~~}|{{{{zyw~uzqsnmjiiihhghggfgfgfgggghghghghghghghghgighghghfgfgfgfgfhfgfgegdgdgeggghgfgigmhrjvmyozq{q|o}n}m}m~m}n}o}o}p}r}t}u}t}t}s|r|r|r|q|p|p}p}o}o}o}o}o}o~oooonnmmmllllkjjjkkjjkkll~m~m~mmlll~l~m~m~n~n~n~o}o}o}o}o}n}n}m}k}j}i~h~h~i~i~j~j~klllnn}n|n|n~nn~n}l~l~l~m~m~m~m~m~kk~k~k~k~k~l~l~p}o}n}m}l}k~k~k~k~j~j~kmmmlll~m}n}n|n|n|m|o}o}o|o}o}o}p}p}o}o}n~n~n~o~p}p}r}r}r}q~p~o~n~n~nnnnnmmmp~p~o~n~n~nnnnmmmm~m~n~nono~o}p}r}s}s~vv~v~w}w|v|v{v{y~y{|}~}}}}}}}{{}y{}yrmjgfeccdeflnpsuwyyyzz{||||}}}| | }}}|}||{{{z|yurolgeeeffedcb f f ffedccdddddd d d¡d¡e e f g g g h¡g¡g¡g¡g¢g¢h£i£j¤i¥h¦g¦e¥d¤e¢e¡f¡e¡f¢f¢f¡f¡f e ddefgh i¡i¡j¡i¡i¡h¡h¡g¡g¡f¡f¡g¡g¡g f f f f e dddddeeehikvmpnomrmulwm|ifdegijhgimsx|~~~~~~~}}} ~{~ri|hziviripknknln~~~}}}~~~~~~~~~~~~~~~~~}}}}||||||||}~~~~~~}||{{{zzyw|supomkkhhhhgggggfgfhghghghghghghghghghgififhfhfhfgfgfgfhehegegfgggigjfjgkgmhqiukxnypzrzq|p|n|m}l}m}n}o}q}r}t}v}w}w|v}u}r|r|r|q|p|p}o}o}o}o}o}p}p~ppqpppoonnmlkkjjjkkjkklmn~n~o~n~m~m~l~lmmno~o~o~n~o~n~n~n}n~m~l~k~j~i~i~i~j~j~j~k~lllmnn}n|n|n~nnn~l~l~l~m~m~m~n~n~jjjj~j~j~k~k~o}n}n}m}l}k~k~k~k~j~j~k~n~nljmmnn~n~m~l~km}m}m}m}m}m}n}n}o}o}n~n~o~o~o}p}q~q~q~p~o~o~o~n~nnnnnooop~p~o~n~nnnnonnnn~n~n~n~nnn~o~p}q}r}s}w~x}x}x|x|v|u{u{x~x~y~{~|~}}~}~|}|||{}zuoljigdbcglorsuvxyyyzz{{|||||||| | | | | } }}||||{|{zzxtnjgggfe d c bdeeeedccdddddd d¡d d d¡e f f g g g¡g¡g¡g¢g¢g£h£i£j¥i¦h§g§f§e¥e¤e£e£e£f£f£f£f¢f¡e¡dcddef f g g¡h¡h¡g¡g¡g f f f¡f¡f¡f¡f¡f¡e¢e¢e¢d dddeeeeefgi jkkkkhdcegiihhjouz~~~~~~~~~~~}||}~~u}o{hxfujrmpmokn~~}}~~~~~~~~~~~~~~~~~~}}}}}}}}|||||}}~~~~~}}|||{zyvyrsoonjiiihhgggggghghghghghghfhfhfhfhfieieiehfhfhfgfgfhehghihkhnhohpgqiqjsjvlxmyozqzqzrzp{n|l|k}m}n}p|r}t}v}x|y|y}x|w|s|s|r|q|p|o}o}o}o}o}p}p}q}q}r~rr~r~r~r~qpppmmnmmmllmmnnoo~p~p~p~o~m~m~mmopp~o~o~n~n~n~m~m~mlkkjj~j~j~l~l~l~l~mmmmmm~m|m}m~mmm~lllmmmnnjjiiij~j~k~m}m}m}m}l}k~k~j~k~k~k}l}n~nkilmno~n~mkikkkkkklln~n~n}o}o}o}o~o~o~o~o~o~o~o~o~o~ooonno~p~p~p~p~onnnnn~o}o~p~p~p~p~o~o}o~o~o~p~q~r~s}t}x}y}y}z}z|x|w{v{w}x}x~y~{~|}}}~|}|~|z upmkkigedglrvvwxyyzzz{{{|||||}}} } } } } } } } } } }}}}}}}~~{vrjjhgedccddeeeddc ccddee f¡f¡e¡e¡e f g h h i¡h¡h¡h¢h£h£h¤i¤j¤i¥h¥g¦f¦e¦e¥d¤c£e£f£f£f£f¢f¡e¡d c d dd e e¡e¡e f f f f f e e e e e¡e¡e¢e¢e£e£e¢d¡e e e¡e¡e eecddefhjjifdcehjjijmrx|~~~~~~}}}}}}}~}}}}}}}}|}{tymvktkrlpko~}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}|||}}}~~~~}}|~}|{zw|twrtpkjkjiihhghghghghhghghghfhfhfhfhfieieieiehfhfhfgfhghjhmipjtjvkvkvlvlwmynzo{o{pzpyrypzn{k|k|m|o|p|s|u|v|x|y|y|x|w|s|s|r|q|p|o}n}n}o}o|p}q}q|r}s}s~t}t}s}s}r~r~q~qppqqqpoopppppp~p~p~q}o~n~m~mnoqp~p~o~n~n~mllllkkjjkk~mmmmm~m~n~n~mm~m}l}l~mmm~lllmmmnmkjjjjjkk~l}m}m}m}m}l~j~j~l~k~l}m}n}mjhjlm~o~o~m~kjjjkkkkkkn~n~n}o}o}o}n~n~n~n~n~o~o~o}p}p}ponmm~m~n~o~p~p~onnn~n}n}o|p|p}q}q~p~p}o}p}p}q~qrs~t~u}y~z~{~}~}}{}z}y}x|x}x}y~y~{}|}}|~|{wrmjjkhhghlpuwxxyz{{{{|||||||| } } } } } }}}~~ ~ ~ ~ ~ ~ ~}|}~}|zmkigedccddeff f e e¡c¡c dde f¡f¢g f g g g h i j j¡i¡h¢h¢h£h£h¤i¤j£h¤h¤g¥f¥f¥e¥c¥c¢e¢f£f£f¢e¢e¡e d¡d d d d e e¡e¡e e e e e eeeedd d e¡e¢e£e£e¡e ee e¢e¢f¡f ffeeefgijigeegi j kklpuz}}}~~~~~}||||||}~|}}}}}}}yx xzvmugshqlo~~~}}~~~~~~~~~~~~~~~~~}}}}}}|||}}}~~~~~~~}}}~}|{z~x|u{spomlijghfifjfjfihhgggggfgfhfhfhfhfhfhehehehfhfhfghgmgriulwnwnxnyozozozpzpzqzqzqzrzpzm{l|l}m}q}r|u|v|w|x|y|y|x|x|u|u|t|s|r|p}p}o}p}p}p}p}p}q~r~s~t}t}s}s}r}r}r}q}p~q~r~r~s~sssttt~s~r}r~q~q~q~p~o~ooopqq~q~q~p~p~o~o~o~nnmllllmmmmnnnnnnmmkklmmnmmnoonmlll~l~l~k~kjl~l~m}m}l}k}j~j~kk~m~m}n}m~l~kjk~l~m~n~n}n}n}llllmmmmn~n~n~n~n~n~n~n~n}n}o}p~p~o}o}n}r}p~mkjjlmqqonmmm~m~o|o}p}p}q}q}q}p}p~r~s~s~t~u~v~y~{}|}}}~~~}}}|}|}z|z|y}y}y}z}{}||}}y snkihgihhlrwxx{{{|||| ||||||||| } } } } } ~ ~ ~ ~ ~ ~~~~~~}}}}}}}}upjgggfdffgggfff¡d¡d¡d¡d¢e£f£g£g¡g¡g¡g¡g¡g¡h¡i¡i¢i¢i¢i£i£h£h£h¤h£g£g£g£f¤f¤e¤e¤d¢e¢e¢e¢e¢f¡f ggffffff f f g f feedeeeee f¡f¡f¡f¡e¡f¡f¡e¢e¢e¢f¡g¡g¡g¡g¡f¡e¡f¡g h i i¡i¡h¡h¡i i j kkouyyz}~~~}}||z{||}~~~||}}}}}|xvuurujtismq~~~~~~~~~~~~~~~~~~~~}}}}}}}}|||}}~~~~~~}}|}||{{zw~uuqqnkkgififjgifighgggggggfgfhfhghfhfhehehfhfhghgfjfmfshwlynxnynzo{o{p{p{p{q{q{q{q{o{m|l}l}n}p}q}t|u|v|v}w|w|w|v|t|t|s|r|r}q}p}p}q}p}p}p}p}q~r~r~s}s}s}s}r}r}r}r}r~r~s~t~t~t~t~tsss~s}r}r}q~q~q~q~p~p~q~rstu~u~u~t~t~s~s~r~qponnmmmnnnooooonnmnnnopqpopqpnmlll~m~l~l~kkl~l~l}l}l}l}k~k~k~k~m}n}n}n}n~m~k~l~m~n~n~o}o}o}m~m~m~m~m~m~n~n~n~n~n~n~n~n~n~n~n~n~o}o}o}o}n~m~r}p~nljjklp~o~n~m~m~l~lln~n~o~p~pppppqssstv~x~|}}}}}~}~}}|}}|}||{|z}y}y}y}z}{|{|wqljhgfgilrwyy y}}}}}}} }||||}||| } } } } } ~ ~ ~~~~~~~~~~~~~~~~~|vnhffg¡ggggggfff e d¡d¡d¡e¢e¢f£g¡f¡f¡f¡g¡g¡h¡i¡j¢i¢i¢i£h£h£h£h£h¡h¡h¡h¢g£f£f£f£f£g¢g¢i¡jlmooppppooonlljhfd c¡be f f g¡g¡g¡f¡f g¡g¡g¢g¢g¢g¢h¡h¡h¡g¢g¢g¢g¢h¢h¡i i i i¡i¡j¡j k llpvxyz}}||{{{|}~~||}}}}}|xvt txunumsor~~~~~~~~~~~~~}}}}}}}}}}}}}~}~~~}}||}|||}|yw|twpnliigififififhgggggggfgfgfgghfhfhfhfhfhfhghgfmepgvjymzozo{n|p|p|p|p|p|p|p|p|p|o|m}l}m~n}p}q}r}r}s}t|t}t|t|t|s|s|r}r|q}q}p}p~q}q}p}p}p}q~q~r~r~r~r~r}s}s}s}s}s}s}t}t~u~u~t~t~rs~s~t}s}r}r}q~q~q~q~r~t~u}x}y}z|z|y|y|y|x|x|x|v}u}t}s}r~p~o~n~p}p}p~q~q~q~q~qpppq~r~s~t~t}u}t}r~q~r~q~n~lllm~m}m}m}m~l~m}m}l~l~l~l~l}l}m}m}m}n~n~n}n}n}m}n}n}o}o}p}o}o}n~n~n~n~n~n~n~n~n~n~n~n~n~n~o~o~oo~p}q}p}o}n~mr|q}p~nnmmln}o}n~n~n~m~llm~mnooooooqrrrs~v~x~{}{}|}}|}|||{|{|{|z|y}y}x}y}y}z}~xtnjhggfhlrvyz z | }}}}}}}}}}}}}}||}}}}}~~~~~~~~~~~~~~~~~~~|vnif h¡jhhgffffffee e e¡e¡e¡f¡f¡f¡f¡f¡g¡h¡i¡j¢h¢h¢h¢h¢h¢h¢g¢g¢g¢g¢g£g¢i¡j¡k lopqsuvwxzzzyyyyywvtqnk¡h¡g i i i i i¡i¡h¡g h¡h¡h¢h¢h¢h¢h¢g¡h¢g£h£h¤h¤h£h£h h h i¡i j k l mlpuxy{ }|{zz||~~~||}}}}}}wurrzspsmrnq~~~~~~~~~~~~~~}}}~~}}}}}}}}~}~}~}}||||||}}{yvzrrmjifheieifhghgggggggfgfgfgggfgggfgfgegfggghepfshxk{o|p{p{n{p|p|p|p|p|p|p|p|q}p}o}n~n~o~q}r}q}q}r}r}r}r}r|q}r|r}r}q}q}q}q~q~q}q}q}p}p}p~q~q~q~q~r~r}s}s|t}t|r}s}s}t}t}t~s~s~q~r~s}t}t}s}r}q}q~q}r}t}v}y}{|}|~|~|}|}|||||{|{|yzy{y{x{v|s|r|q|q}q}r}r}r~r~r~r~rssu~v}w}x|x|x|v}t}s}s}q~n~l~lmm~n}n}n}m}m}m}m}l~l~l~l~m}m}o}o}o}n~m~m}m}n}n|n|o}p}p}p}p}o~o~n~o~n~o~o~o~o~n~n~n~n~n~o~o~o~pq~r}r|q|p}o~nq{q{q|q}q}p~o~o}n}o}o}o}o~n~mll~m~m~nnnnnopq~r~r~s}u}w}y|z|{}{|{}{|z|y|y|x}x}w}w}x}y}z|tpkhhghhmquww y|} }}}}}}}}}}}|||}}}}}}~~~~~~~~ ~ ~ ~~ ~ ~ ~~~~~~~{un i¡hi¡i¡h¡g g ffffffee d d¡e¡e¡e¡e¡e¡f¡f¡h¡i¢j£h¢h¢h¢h¢h¢g¡g¡g¡i¡j kmpsvxzzz{{|||}}}~~~~{xurqnnnlkjh g h h¡h¢h¢h¢g¢g¢g¢g¢g£g¤g¤g¤g¤f¤g¢g¢g¡g h i klmkotwy|}{zzz{|}}|||}}}}}}uspp~psqnqop~~~~~~~~~~~~~~~~~~}}}}}}~~|}}~}}}}||||||||{w}uvqomhjfhgghggggggggggggggggggggggfgfgdgfgifkcvgwlxozq{p{p{p{p|p|p|p|p|q|q|q|p|p}p}p}p}p}p}p}p~p~p}p}p}p}p}p}p}p}p}p}p}p}p}p}q}q}q}p}p}o}o~op~p}q}q}q}q}r}r|q}r}t}t}u}t~t~s~qqr~r~s~s}t}t}r~s}t}w}z|}||{||{{{{~z}z{{{{z{x{v{t|r|p|o~q~r~t~t~u~t~t~uv~w~x}y}y|z|z|z|y|x|w}t}r~pommm~m~m~m~l~l~m~lllm~m}m}n|m}o|p|o}k~ik~m}o|o|p}q~q~qq~q~qpoooooo~n~n~n~o~o~p}q}q}r~r~r}r}q}p}o~n~p|p|o|p|p|p|q|q|o|o|o}o~o~oo~o~m~nonn~n}p}r|p~p~p~q~r}t}u}v}w}x}x}y~y~y~yxxt~t}x~xu~v|zz smjkifhlqtwxyz | ~ }} }}}}}||}||zz|}}}}}}}}}}~ ~ ~ ~~~}~{s k hg¡h¡h¡h¡h¡h h g g g f f d d¡c¢d£c¢d¢d¡d¡e¡f¢g¢h£i¤h£h¢g¢h£h¢h¡iipqsvxz||}}}}}}}}}}}~~~}|ywurpmif i h¡h¡h¢g¢g£g£g£f£f¤f¤e¥e¤f¤f¤f£f£f¢f¡f g hjkloswz~ |zyzz||}}}}}|}}|}~~|zpommnspmqmp~~~~~~~~~~~~~~~~~~~~~~~}}}}}||}}~}}}||||||||yw{stomkijhhighghfggggggggfggggggggggfgfghglfofxixnypzq{q{q{r{p|p|p|p|p|q|q|q|p|p|p|p}p}p}p}p}o}o}o}o}o}o}o}o}p}p}p}p}p}p}p}p}q}q|q|p|p}p}o~op~p}p}p}q}q}q}q|q}q}s}t}t}t~s~r~qqr~s~t}u}u}u}s}t}v}y}{|~|{{{{{{{{{~{}{|{{{x{v|t|q|p|q}r}s}u}v}v}u}u}w~x~y}z}z|{|{|{|{{{{{zy{w{u|s~r~nnm~m~l~l~l~l~mmmnnn~n}n}n}p|q|o|k~ik~m}p|p}q}q~rrr~r~qqpooo~o~o~o~o~o~p~p~p~q~q~r~r~r}r}q}q}p~o~p}o}o}o}o}o}p}q}o|o}o}o~ooo~o~o~p~q~p~o~o~p}r}p}q}q}r}s}t}u|u|v}v}w}w~w~w~vvws~t}w~vt}x{yrkijiginsuwyyz | } | | }||}}}}~}|yy{}}}}}}}}}}~~ ~ ~~~}~|vpjh¡g¡h¡h¡h¡i¡h¡h¡h f f¡e¡e¡d¡d¢d£d£e£e¢e¡e¡f¡g¡h¡h£i¢h¡g¡f¢g¡jnqvvxz{||}}}}~~~~~~~ }{xsn¡j¡i¡i¡i¡h¢h£g£g£f£f£f¤e¤e¥e¤e¤f¤f¤f¤e£e¢d¡e fhilotx{~ }{z{|{||}}}}}}~~|wsommm~orqmqmp~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||}~~~~~}}}}}}}}zy}uxqrnlkhighhghghgggggfhfhfhggggggggghgkfpftiykznzpzp{p{q|r|p|p|p|p|p|q|q|q|q|q|q|p}p}p}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}o}p}p|p|p|p}p}p~pp~p}p}p}p}p}p}p|p}p}q}r}s}r~r~q~p~q~s~u}v}w}w}w|u}v}x|z|}|{{{{{{{{{{{}{}{z|x|u|t|r|r|r}s}u}v}w}w}v}v}z}z|{|||||||||||}{|{}z|yzyx{u|t}pon~m~l~l~l~l~mnoopo~n}n}m~p}q|o}ljln~p}q}r~rssr~r~r~r~q~p~p~p~p~p~p~p~p~p~q~q~q~q~q~r~r}r}r}q}q~p~o~n~n~n~n~o~o~p~p}p}p~pppp~p~q~r~r~r~p~o~opp~q~r~s}t}u}v}v}u~u~u~u~u~u~t~t~t~r~s~u~s~s|{yvojfiigjqtvx yzz |} | | } } ~ |yxz|}}}}}}}}}~~ ~ ~~~}~~~{uni¡h¡h¢i¢i¢i¢h¡h h¡f f e e e¡e¢e¢f£f£f¢e¡e f f g¡g¡i h h ilpux{{|}~~~~~ ~ zuqmml k¡j¢i£h£g£f£f¤e¤e¥e¤e¤f¤f£f£e£e£d£d¡e fginsx{~}||||{||}}}}}}}}}{xsoonmo{qorlrmr~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|||}~~~~~}}}}}}}}{zw}sxoqlljiiighghgghghghfhfiggghghghgigmgtfxj{l{nznzn{n{o|q|p|p|p|p|p|q|q|q|q|q|q|p}p}o}o}o}n}n}n}n}n}n}n~n~o}o}o}o}o}o}o}o}p}p}p}p}p}p}p~pp~p}o}o}o}o}o}o}o}o}q}r}r}r~q~q~p~q~t~u}w}x|x|x|v}w}y|{|}|{{zzz~{~{}{}{~|~|}|||z|x|v|u|t|t}t|u|w|w|x|x|w|v|{|{|||||||||||{{|||{}z}y|yy{v|t}qqo~n~m~m~n~n~nnopp~p}o}n|l~n}q}o}mlnq~q~q~r~ssss~s~s}r}q}q}p}p~p~q~q}q}q~q~q~q~q~q~q~r~r}r}r}r}q~q~n~n~n~n~n~n~o~o~q~q~q~qqqq~q~q}r}s}r}p}n~nnpqstv~v~v~v~u~u~u~u~u~t~t~t~s~r~r~s~r~r|~xtnheghhlsuwyzz{ |} } } } ~zxyz}}}}}}}} } ~ ~ ~~ ~ ~~}~yq j¡j¡j¢j£j£i¢h g f e eeee e f f¢g¡f¡f f f¡f¡f¢f g hknrvy{|}}~ |tsqol j¢i¢h£g£g¤f¤f¥f¤f¤f¤g¡g¢f£e¤d¤d£e¢f¡fgkrwz|}|{{||}}~}}}|}{xwvusqpooqxsntltns~~~~~~~~~~~~~~}}}}~~~}}}}}}|||}}}}~~~~~~~|~|~y~w}swoplijkfifggghhhhhghfhhigifjflfohsjwlyozozn{n{n|o|o|o}o|o|o|o|p|p|q|q|q|q|q|p}p}o}o}n}n}n}n}n}n}n~n~n~o}o}o}o}p}p~p~p~p}p}p}p}p}p~ppooo~o~o}o}o}o}o~p~q~q~q~q~q~q~o~p~s~u}w}x|w|w|v}w}y|{|}||{{{{}{}{}{}{}{|{z{z{x|w|v|u|u}u}w|x|y|x|v|v|v|w|||||||||||||||||||}|}{}{|{y{v|t|qqppoo~o}o}nn~n~n}n}m}m|m|m}n}m}n~n~n~o~p~rrqqr~r}s}s|s|s|r}q}q}q}q}q}p~p~ppppq~q~r}s}t}t}t}s}q}p}n~n~n~n~n~o~p~p~sssttsssq~s~s}q}n}lklrsuwx~v}u}t}u}u}u}u}t}t}t}t}q~r}r}q~sz{toihffglpt x y z { | | | }}{z{}~{z{~zww}}}}~ ~}~~{to¡j¡k¢j¢j¢i¡h f fee e e e e e e g g g g¡g¡f¡g¢f¢finrtwz}~~~ ~{xsn¡k¢i¡i¢g£g¥g¦g¦h¥h¤h¢h£h£h¤g¤g¤f¤f£f£e¡gjnswyz{~}}}||||}}~}}|{zvusrrqqqnoqsvtnsmrmr~~~~~~~~~~~~~}}}}~~~}}}}}}||||||}~~~~~~~~~}}}{}y}uzqsmmllgjggggggghhgifjfkfmfpgthvkxnxoxpzp{p|o|n}n}n}n|n|n|n|o|o|p|p|q|q|q}p|p}o}o}n}n~n}n}n}n~n~n~n~n~o}o}o~o~p~p~p~p~q~p~p}p}p~poooooo~o~o}o}o}o~o~p~q~q~q~p~p~o~p~s~v}w}x|x|x|v}w}y|{|}||{{{{}{|{|{}{|{z{w{v|v|u|u}u}u}u}v|x|y|x|v}v|x|y|}|}|||||||||||||}|}|}{}{{{y|v|t|q~q~q~q~q~p}p|o|n~n~n}n}n|n|m|m|l~l~m~n~n~p~q~r~r~r~q~q~q~r}r|r|s|r}r}q~q~q}q}q|p~p~ppppp~p~r}s}s}s}s}r}q}p}o~o~n~o~o~p~q~r~s~s~t~t~t~t~s~s~r~s~s}r}o~mmmtuwx~x~v}u}t}u}u}t}t}s}s}s}s}r~r~q~p~t}~xrmihffimruyyz||}||||x ty~zyy~~{yy||}}~ ~}~|uo¡k¡k¡k¡j¡j i h g e e¡e¡f¡f¡g¡g¡g¡g¡g¡g¢g¢h¡h¡i¡ikmquvx{ ~~ ~yt¡n¢i¡g¡h¢i¤i¥i¥j¥j£j¢j¤j¤j¥i¥i¥h¥g¤g¤g¤f¢hknqrttyzz{{{{|{zzyxwvvrrqppooomnprtsnslslr~~~~~~~~~~}}}}~~~}}}}}}||||||}~~~~~~~}}}}}}}~|y}uwrronikiihghhihkhngogrgthviykzmzoypyp{p{p|o}o|o|n|n|n|n|n|o|o|o|p|p|p|p|p|o|n}n}n~n~l~m~m~m~m~n~n~no~o~n~nnnnnpp~o~o~nnnnmnnnn~n~o~o}o~o~o~p~p~p~p~o~n~p~s~v}x}y|y|y}v}w}x|z|||~|{{{~{|{{{|{{{y{x{t|t|s|s}s}t}t~u~u}u}v}v|u|v|x|z|||||}|}|||||||||}|}|||{{y|v|t}r}p}p}q}q|q|p}o}n}o}o}o|o|n|n|n|n}l~l~m~n~n~p~r~r~r}q}q~p~p}q}q|q|r}r}q~q~q~q~r}r}p~p~ppppp~p~s}s}s}r}r}q}q}q}p~p~p~p~q~q~r~s~s~t~t~t~t~t~t~s~s~s~t~r~o~nopuv~w~x~w}v}u}t}t}s}s}s}r}r}r}r}r}rqt}zysomihggjpuyyz{|}||| z }~tsz}||}{zz||}} ~ ~}|vp l k¡j¡j¡i¡i h h¡g¡g¡g¡h¡h¡h¡h¡h¡h¡h¢g¢h¢i¡j klqsvxy{} }vpkk k¢k¤l¤l¤l£m¢m¤k¥k¥k¥k¥j¥j¥i¤i¥g¥g£h¡i jklmqrtuvvvvutsrqpppnoonnnmmmnpwrpslrkrkq~~~~~~~~~~}}}}~~~}}}}}}}}}}}}}~~~~~}}}}}|}}}~}|~yzuvsqkmjjjijimjpitivkxkykykzlzm{n{o{o{o{o|o|o|p|p|p|n}n}n}n}o|o|o|o|p|o|o|o}n}m~m~m~l~l~l~m~m~nnnmmmmllllonnmllkkkkllm~m~n~n~n~n~o~o~o~o~o~o~o~p~t~v}x}y|y|y|v}w}x|z|{|||~{~{|}|{|{|{|z|x|v|t}s}s}r}r}r~r~s~r}s}t}s}s}u|w|z|}|}|||||||||||||||||{|y|w|t}q}p~p~q~q}q}p}n}l~ko}o|o|o|o|o|o|o}m~m~m~n~n~p~q}r}q}q}p}p}p}p}p|p|r}r}q~q~q~q~r}r}q~q~ppppo~o~s}s}r}r}q}q}q}q}q~q~q~q~q~r~s~t~t~t~t~u~u~t~t~t~s~t~t~rpoqrt~u~u~v}v}u}t}t}s}s}r}r}r}q}q}q}q}qsz}vpllihhhlqwz z { { | | | | | {~}vv~ }{zz}}}} ~ ~~}vq k j i h h¡h h h j¡j j i i¡h¡h¡h¡h¡h¢h¢h¡j knouwz{{|~ ~xtnn¡m£m¤n¤n£n¢n¤m¤m¤m¥l¥k¤k¤k¤j¥i¥i¤h¤g£h¢i¢i¡i jkmoppponml lkkklmmnnnmmmno{qqrlrkqkpjo~~~~~~~~~~}}}}}}}}~~~~~}}}}}}}}}}}~}}}}}}}~}}~}}}}{|y{vrqnqkqiqjskulxmyoznzmzm{m{m{n|o|o|o|o|o|o|o|o}o}n}o}o}p}p}o|o|n|o}o|o|o}n~mkjjjkllllllkjiiijjllkjhgeefgikkllllnn~o~n~n}o}p}p~r~t}v}y}z|{|{{x}w}w}x|z|{|z|y|{}y}x}y}z}y}x}v}s|s}r}r}r}q}r}r~r}q}p}q}r}u|x|{|~|||z|z|{|||||{|||{|y|v|s}q~o~op}q}q}p}o~n~m~l~o}o}o|o|o|o|o|o|llmnnoo~p}q}r}r}r}r}q}q|p|q}q}r}r}r}r}r~r~r~q~q~q~q~q~q~q~r~r~r~rq~q~p}p}p}p}o}o}p}r}s}u}s}s}t}t}u}u}u}u}u}u}u}t~s~r~r~r~t~t~t~t~t~t~s~r~q~q~q~p~p~o~o~o~nq~v|~ytolijihkotxz{{{|||||{~{sv~~}|zz}}~ ~|vq l k i g g¡f g g¡i i jjj i i¡i¥i¡ihh¡jnqszz{|}~ ~xt¡n£l¤m£n£n£m£m¤l£l£k£k£k¢k¢k¤i¤i¥i¥i¤i£i¢i¢i¡ijkkl l ll¡l¡k¢j¡j¡i¡j klmmnnnnnn r~ruqnqkpjoiojo~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~}}}}}}|~}|~|~}}||z|xuvqvmvlvlvmxmynzoznznzm{m{n|n|o|o}o|o|o|o|o}n}n}n}o}o}p}p}o}o}n}n}o}o~n~mkjhgghijjjjkihfffffffedca ``cefhjjiikmnonm~m~n~p~r}t}v}x|y|z|z|w}v}u}v}x}y|y|x|x|w|w|w|y|x|w|u|r|r}q}q}q}q}q}r~r}q}p}q}r}v|x|z|}|z|x|y|y|{|z|z|||y|u|q|n}o}p~q~p|p|p}p}o~n~n~m~o}o}o|o|n|n|n}n}mmmnnn~n~o}q}r}r}r}r}r|q|q|q}q}r}r}r}r}r}r}r~r~r~q~q~q~q~q~r~r~r~q~q~q~p}p}p}o}o}o}p}q}r}s}r}r}s}s}t}t}t}t}v|u|u}t}s}r}r}r}r~r~s~s~s~r~r~q~q~q~q~p~p~p~o~o~pr}yzvrnkiihhkpvyz{{|||||}{ }ww} ~}|{{}~~ ~}vqlki g g¡f f¡f¡g¡h hhh h¡h¡g¤g¡g g¡jmquw}}}}}~ |t¢n£l£l£l£m¢l¢k¢k¢j¢j¢j¢j¢j¤j¥j¥j¥j¥j¤j¤j¤j jjklm¡m¡m m¡l¡l¡k¢j¢j¡k¡l¡mmmnnopqqxsurqqnploknimhm~~~~~~~~~~~~}}}}}}}}~}}}}}}|}}|}~~}}}{}yxyuyryoyoypzoznzozn{n{n{n|n|n|o|o|o|o}o}o}o}n}n}n}o}o}p}p}o~o~n~n~nnmkjgfddeffggfgfdb` `_``_____^^a cdfgfdchkmnnmmno}p}r}u|v|w}x|x|u}t}s}t}v}w}w}u}v}u}t}u}v}w}u}s}r|q}p}p}p}p}p}q~q}p}p}q}s}u|w|y|z|x|v|v|x|y|y|y|y|v|r|o|m}n}p}r}p|p|o}o}o~o~o~o~o}o}n}n}m}m}l~l~nnnnno~o}o}q}q}r}r}r}r|r|q|r|r|r|r}r}s}s}s}r}r}r}r}r}q}q}q}q}q}q~q~q~p}p}p|p}o}o}o}o}p}q}q}r}q}r}r}r}s}s}s}t|t|s|r|r|q|q}q}q}q}q}r}r}r}q}q}p~p~p~p~p~p~p~p~q~u|}xsokihgggkqvy{||||}}}} |}}z~ ~}|||}}~ }wrmkig f¡f¡f¡f¢f¡g g gg g g¡f£e¢f hkpuy|~~~ }u¡o¡k¢l¢m¢k¢j¢i¢h¢g¢h¢i¢j¤j¥j¥j¦j¦j¦j¥j¥j¢i jklm n nn¡m¡l¡l¢k¢k¡l¡n¡nmnnopqrxrornqmqlolnkmilgl~~~~~~~~~~~}}}}}}}}~}}}}}}}}}}}~~~~}|}z{yxyuyszrzqzpzozn{n{n{n|n|n|n}n|o|o}o}o~o~o}n}n}n}o}o}p}p~o~o~n~nnmljhfd a a b c d d ddcb ` ^\[Z[WWXYZ[[[`b dedb ` _ ehkmmmnnm}o}q}r}t}u|u}u}s~r~q}s}t}u}u}t}t}s}r}s}u}u}t}r}q}p}o}o}o}o}o}p~p}p}p}q}s}u|w|x|x|v|u|u}v}w|x|w|u|t|r|q}p}p|p|p}o|o|o}n}n~o~p~p~o~o}n~m}l~k~kjm~mnno~p~p}q|p}q}q}r}r}r|r|q|r}r}r}s|s|s}s}s}r}r}r}r}r}r}q}q}p}p}p}p~p}p}p|p}o}o}o}o}o}o}o}o}q}q}q}q}r}r}r}r}r}r}r}q}q}p}o}o}o}o}p}q}q}q}p}p}p~p~p~p~p~p~p~p~r~w{vqmjhhgfglrvz{|||}|}}}}|}~}|{|}}~~ }wrmlig f f¡e¡f£g¢g¡g g g g¡g¡f¤e¢fimrw{}~~ |tn l l¢k¢i£g£f£f£g¤h¤i¤j¥j¦j§j§j§j§j§j¥g¢hiklmnnn m¡l¡l¡l¡n¡n o nnnoppzqpqopmojojnjnjmimhl~~~~~~~~~~~~~~}}}}~~}}}}}}}}~}}}~}~}}|}|z{y{xzu{s{q{o|o|n|n|n|n|n|n|n|o|o}o}n}n}n}n~n~n~n~o~o~n~nmmlllkige ca^_``a``__^]ZXWVVNRVYZYXY^b ec^[\^ceiklmn~o}o~p}o}p}p}q}r}r}o}p}p}p}q}q}r~r~q}q}q}q}q}q}q}q}p~o~n~n~n~n~o~o~o}p}q}r}r}s|t|u|w|u|t}u}v}w}v|v|s|r|q|p}o}o}o}p}o|o|o}o}n~noop~o~nlkjjjm~m~n~n}o}o}p}p|q|q|q|q}q}p|p|p|q}q}q}q|r|r|r}r}r}r}q}q}q}q}p}p}p}p}p}p}o}o}o}o~p}o}o}o}o}o}o}p}p}p}q}q}r}r}r}r}s}r}q~p~o~n~n~n}o}o}o}o}o}o}o~o~o~ooopqr~r~u~{z tpmkiggfhlrwz {||| | | } } }}|}} ~~||{{{|} }}~~ |vqkjhgf f¡f¡f¢h¢h¡h¡g¡g¡g¡g¡g¤c¡hntwz|}~~ }wo j l¡k£h¤g¦f¦f¦g¦h¦i¦i¥i¥i¥i¦i§h¨h¦h¥h¢h¡h jln o¡o o o¡o¢o¡o op¡ooooootololnknjninhnhminjm~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}}}}~}~}~}||{{y{w{t{q|o}n}m}m}m}m}n}n}o}o}o}o}n}n}n}n~n~n~n}n}n~nmkjijihgeb``\]^__^]]\[YXVTSSMPTWWVVW^a c_ YVX\a dhjkmn~p}n}n}n}n}n}n}o}o}n~n~o~o}o}p}p}p}p}p}p}p}p}p}p}p}o~o~n~n~m~n~n~n~o}o}p}q}q}r|r|s|s}s|r}t}v}w}v|t}q|p|o|n}n}n}n}o}n|n|n}n}n~nnnq~p~onmlkkn~n~n~n}o}o|p|p|q|q|p}p|p|p}p}p}p}p}p}q|q|q|r|r|r}r}q}q}p}p}p}o}p|p}o}o}o}o}o}o~o}o}n}n}n}n}o}o}p}p}p}q}q}q}q}q}r}q~p~o~o~n~n}n}o}o}o}o}o}o}o}o}o~o~ooppq~r~v}}ysnkjhgggimswz z | | |||}}}}}}|||| |||{{||}}}~~ ~ |wsjihf e e¡f¡f¢h¢h¢g¢g¢g¡g¡f¡g¡fjpuxz|}~~ wpmk¢i¤g¥f¦f¦f¦g§g¦g¥g¤g¤h¤h¤h¥i¦h¥h¤h¢h¡i k l¡m¡ooqq r rrroooootonololnknjnjnininjnkm~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}}~~~~~}}|}{|y|v|s|q}o}n~n~m~m~n~n~o~o~o}o}n}n}n}n~n~n~n~n~mlifcab b b``^\\XZ\]]\[YYXWUSQONLORTTTUW]_`[USW[beij~l~mn~p}n}n}m}m~l~m~m~m~n~n~n~n~n}n}n}n}o}o}o}o}o}o}o}o}o~n~n~m~m~m~m~n~m}m}n}o}o}p|q|q|p|p}q}s~v~v}t}r|o|o|n|n}n}n}m}n}n|n|n|n}o~o~o~oq~q~qpoonmn~n~n~n}o}o|p|p|p}p}p|p}o}o}o}o}n}o}o}p|p|q|r|r|q}q}q}p}o}o}n}n}o|o}o}n}o}n}n}n~n}m}m}m}m}m}m}n}o~o~o~p~p~p~p~p~q~p~oon~n~n}n}o|o|o|o}o}o}o}o}o}o}o~oopq~q~v|wqljihgghjntxzz | | |||}}}}}}}}|||}||||}}~~~~ ~ }yujih f e¡e¡f¢f¢h£g£g£f£f¢g¡g gjnswyz|}~~ ~~}~ zpo l¢i¤g¥f¦f¦f¦f¦f¥g¤g¤g¤h¤h¤h¥h¤h¤h¢h¡i¡j j jmortvutsppooxonnmnnnknknknknjnknknkm~~~~~~~~~~~~~~}}}}~~~~~~~~~~}}}~~~~|}|}|}z|x|u|r}q}q~p~o~n~n~o~n~o~o}o}n}n}n}n~n~n~onmjfa \ZZZZZZZYXVXZ\\[YWWWVTROMLMOQRRSUW]^]XSRW\egkl~m}m~n}o|n}n}m}m~l~l~l~mnn~n~n~n}n}m}m|n}n}n}n}n}n}n}n}n}n}m}m}m}m}m}m}m}m}m}n}n}n|o|o|n|o}p}s~u~t}q}o}n}n}n|n}n}n}n}n}o|o|o}p}p}p}p~p~q~q~rrqpoon~n~n~n}o}o|p|p|o}o}o}o}o}n}n}n}n}n}n}o}p}q}q}r}q}q}p}p}o}n}n}m}n}n}n}n}n}n}n}n~m}m}m}l}l}m}m}m}o~o~o~o~o~o~o~o~p~onnn~n}n}n|o|n}n}n}n}n}n}n}o|o}o}o~oop~p~w{vpkhhgghhkouy zz||| | } } } }}}}}}}}}}}}}}}~~~~~ ~ ~~~~ }yvkj h g¡f¡f¢f¢g¢g£g¤f¤e£e¢f¡g hmquxy{|}~~ ~}|}~ uso¢l¤j¥h¥h¦h¦h¦h¦h¥h¥h¥h¤h¤h¤g£h£h¢h¡h¡h hhjmquwwuspppyoroonnnmnknknkmlmlmlmlmkm~~~~~~~~~~~~}}}~~~~~~~~~~~~~~}}}}}~~~~~|}}}}}|}{|x|v|u|r}q}o}o~p~p~o}n}o|o|o}o~n~nmlmmkgc ^ZWVUTUVWVUUUVYZYWUUUUROLLMLNQQPQUX\]ZUPQW]gjmn}m}m}m}n|n}n}m}l}l}l}l}l~l~m~n~n}n}n}n}n}n}n}n}n}n}n}n}n}o}o}n}n}n}n}m}m}m}m|m|n|n|n|n|n|n|n|n|o}o}o}n}n}n}n}m}m|m}n}n}n}p|o|n}n}n~o}p}q}r~s~t~t~s~rqpn~n~n~n}o}o|o|o|o}o}o}o}n}n}n}n}n}n}n}o}o}p}p}p}q}p}o}n}m}m}m}m}n}n}n}n}n}n}o}o}m}m}m}m}m}m}m}m}o}o}o}o~n~n~n~nnnn~n~n}n}n|n|o|n}n}m~m~n~n}n}n}o}p}o}n}n~p}q}y{vpkihhgijmqw{{{|||| }}~~}}}}}~~~ ~ ~~~~~~~~~ ~ ~ ~ ~~~~~~~~~ ~~}yvm l j g g¡g¢g¢h£g£g¤f¤e£e¢f¡g inqvy{|}~~~ {z} }z{}~ xp¡m¢m¢m¢j£g¥i¥i¦i¦i¥h¥g¤g£f£f¢f¢f¢g¡g¡g¡g gijloqsssq qzpqpooononnnmnmmmmllllllllll~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~}}}}}}~~~~~~~~}~}}}|}z|y|w|s|q}n}n~o~p~o~o~o}o}o}o~nmkjiihe a]YVUSQQSTTSSTUXZYXURSSQMKKKNPRQPQUZ\]ZUPPW]gjmn}n}m}n}n|n|n|m|l}l}l}l}m}m}m}n}n}n}n}n}n}n}n}n}n}n}n}n}n}p|o|o|o|o|n|n|n|m}m}m}n}n}n|n|n|m}m}n}n}n}n}m}m}m}m}m}m}m}m|n|n|o|o}n}m~m~n~o}p}t~t~u~u~t~s~r~qo~o~o~o}o}o|o|o|o}o}o}o}n}n}n}n}n}n}n}o}o}o}p}p}p}o}n}m}m}m}m}m}m}m}n}n|n|n|o|o|n|n|n|n}n}n}n}n}o}o}o}n~n~n~n~n~nn~n~n~n}n}n}n}n}n}n~n~n~n~n~n}n~o~p}o}o}o}q}s}}yuojhhgfhilqvz{{|||} }}}~ } } } } } ~ ~ ~ ~ ~ ~ ~~~~~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~~~~|xtmk i g g¡g¡h¡i¢h£g¤f¤e£e¢g hinqvz||}~~~ yx| yy|~}vr p¡o¢l¤j¥h¥i¥i¥i¤h¤g£g£f£f£f£f£f¢f¢f¡f¡f¡ghilnpqrqqvpopmomnmnmnlmlmlllllkllllll ~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~}}}}}}}}~~~~~~~~~~~}}}}}||z}z|u|r}o}m~noooo~o}o}o~nljihh gfc_\ZTQNMNPQQQRTVYYWTPQRQMJJJOPQONQV[\\ZUPQW^gjno}n}n}n}n|n|n|m|m|m|m|m|m|n}n}n}o}n}n}n}n}n}n}n}n}n}n}n}n}o|o|o|n|n|n|n|m|l~l~l}m}m}n}n}n}m~m~l~l~l}l}m}m}m}m}l}l}l}m}n}n}o}n}m~m~m~n~o~o~t}u}u}u~u~t~r~q~p~p~p~p}p}p|o|o|o|o|o|o|n|n|n|n|o}o}o}o}o}o}o}o}n}n}m}m}l}l}l}m}m}m}m}n|n|n|n|n|o|n|n|n}n}n}n}n}n}n}n}n}n}n}n}n}n~n~n}n}n}n~n~n~n}n}o~onnn~n~m~n~o~o}o}p|r}u|xtnkihgfhhkouy {{}}}} }}}} } } } } } ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~~ ~ ~ ~ ~ ~ ~ ~ ~ ~~}}}zvrkj i¡g¢g¡h¡i¡j¡h¢g¤f¤f£f¡ghimqw{}}}~~~ |xx|uxz} }ys p¢m¤k¥h¤h¤h£h£h¢h¢g¢g¢f£f£f¤f¤f£f¢f¢f¡f ggikmnoqqupnpkolnlnknkmklklkkkkkkklkl~~}~~~~~~~~~~~~~~~}}}~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~}~}}|}|}||{|y}u}p~mlmnno~o~o}o~nkigdddca^[ZTPLKLNPQRQSVXWUSPQRQNKJIOPPNMPV[Z[YTPQY`hkno}n}n}n~n}n}n}m}m}m}m|n|n|n|o|o|o|n|n}n}n}n}n}m}m}m}n}n}n}n|n|n|n|m|m}m}m}l~l~l~l~m~n}n}o}mlk~k~k~k~l}m}m~m~l}l}l}m}m}n}n}n}m~l~mm~n~o~s}t}t}u}t}s~r~q~q~q~q~p}p}p|p|p}o}o}o}o}n}n}n}n}o|o|o|o|o|o|o|o|n}n}m}l}l}l}l}l}m}m}m}m}m}n}n}n}n|n|n|n}n}n}o}n}n~n}m}m}m}n}n|n|m}m}m}n}n~n~n~n~n}n~o~oonn~n~ln~p~o}p}q|t|v|xtoljigfggjnty {|}}}} }}}} } } } } } ~ ~ ~ ~ ~~~~~ ~ ~ ~ ~~~~~ ~ ~ ~ ~ ~ ~ ~ ~ ~~}}|ytqk j¡h£h£h£h¢i¢k¡h¢g£g¤f£f¡ghimqw|}}}}~~ {vv|tvy} |u p£m¥l¥g¤h£h¢h¡h¡h¡g¡g¢g£g¤f¥f¥f¤f£f¢f¡h hhhjklmqqvpoplolnlnknililikjkjkjkjljl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}|~~~~~~~~~~~~~~}|~|}|}||~|x|q~nmnnmoon~n~nlhfeb`^]\ZXRPLJIKNPQQRSSTTTPPOPPNKHLMNNNPUXWXWSQT]dklmn~n}n~nnn}n}m}m}m}n|n|n|o|o|o|o|n|n}n}n}n}n}m}m}m}n}n}n}n|n|m|m|l|l}l~mllmmmn~n~n~lllll~m~m~m}m~m~m~m~m~m~m}n}n~n~n~n}n}n}o}o|r|s|t}t}t}s}r}q}q~q}q}p}p}o|o}o}o}o}o}n}n}n}m}m}l~m~n}o}p|o|n|n|m}m}m}m}m}m}m}l}m~l~l~l}l}l}m}n}m|n|n|n}n}n}o}o}m~m~l~k}l}m}n}o}l|m|m|n|n}n}nnoooo~n~nnnkos}r}p~q~u|z{vsnjihgfgghmt{ ||~}}|| | | } } } } } } } ~ ~~~~~~~~~~~~~ ~}|zwrn¡k¡k¢j¢j£j¢j¢k¢k¡j¢h¢g¢f¡f gijmqw{}}~ |sqy}suz~ {¡u£o¤k¥h¥h¤h£g¢g¢g¢g¢g¢g£g¤g¥f¥f¥f¤f£e¡f¡h iihikmpovorooninhningmhmhlikjkjkjlil~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~}~}~|}|}}|y|u}p~onnmonmllkh fb`\ZYXVUSQMJIIJLLMNPQRRRPOOPQPMJKLLMMNQTTTTSSXagklmn~n}n}n~n~n}n}n}n}n}n|n|n|o}o}n}n|n|n|n|n|n}n}m}m}m}n}n}n}o}o}n|m|m|m}m~m~mnnnn~n~o~o~mmmlm~m~m~n~m~m~n~n~n~n}n}n}n}n}n|n}n|n|o|o{r|r|s|t}t}s}r}q~q~q}p}p|o|n|n}n}n}n}m}m}l}l}k}k}kl~m~n~n~n~n}m}m~m~m~m~m~l~l~l~l~k~k~k}k}k}l}m}m|m|m|m|n|n|n|n|l~l~k~k~l~l~m~n~l}m}m|n|n|n}o~oppp~o~n~nnnlos~s}q~r~x|~ztplihggfgfgmuz ||~}}}}} } } } } } } } } } }~~~~~~~~~~~~ ~}{zxtol¡j¡j¢j¢i¢i¢j¢j¢j¡i¡h¢g¢g¡g hjknrw{}}~ ~vsx~ }tvz~ }w¡q¢l¥h¥h¤h£h£h¢g¢g¢g¢f£g¤f¥f¥f¤f¤e£e¡d¡f ghghjmppwprpnphogoiogmhlilikjkjkilil~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~}~~~~~}~}~}}}}}|||y}u}pnnnnlkjjjg e`]YVUTSRSQNKIHHHIJLOQQQQQPPQRQNKIJKKKLNQQPPQV]ejllmm~n}m}m}m}m}m}m}m}m}m|m|m|n}n}n}n}n|n|n|n|n}n}m}m}m}n}n}n}o}o}o|n|n|n}o}o~pp~p~p~p~p~p~p}o~n~n~n~n~n~nnn~n~n~n}n}n}n}n}n|n|n|n|n|n|o|o|q|q}s|t}t}s}r~q~p}p}o|o|n|m}m}l~m~m~m~m~l~k~k~k~k~l~l~m~m~m~m~m~m~m~m~m~m~m~m~m~l~k~k~k}k}k}l}m}m}m}m}m}m}m}m}m}l}l}l}l~l~lmmlm~m}n|n|o|p}p}q~q~p}p}o~nnnlpt~t}r}u||zypmigfggfgfgltz||}~~~~}}} | | | } } } } }~~~~ ~~~}|ywupkg i i¡i¡i¡i¡i¡i¡i¡i¡h¢h¢h¡i jkknrx|}~ |xy{~uwz} y¡r¤n¤i¤i¤i¤i£h¢h¢h¡h¢g¢f¤f¤f¥e¤e£e£e¡d¡f g gghjmp pyprpmpgpepgphnhmimililililhm~~~~~~~~~~~~~~~~~~~~~~}~~~~~}}}}}}~}~}~}~}}}~~~~~~}~}~}}|{}|||w|q~mmnkjhghg f d`]YVUTRQRQOLJHGFIKNPRRQQSRQRRQNKHIJKKLNPPNNQX`gk llmmm~m~m~l~l}l}l}l}l}l}l}l}n~n~n}n}n}n|n|m|m}n}m}m}m}n}o}n}p}o}o}o}o}o|p}p}q~q~q~q~q~p}p}p}p|o}o}n}n~n~nno}o}o}o}n}n}o}o}n}n}n}n}n}n}o}o}p}q}r}s}t}s~r~r~p}o}o}n}m}l}l}k~n~n~m~m~l~l~k~k~m}m}m}m~m~n~n~o~o~o~o~o~n~n~n~n~m~l~l~l}l}l}m}m}m}m}m}m}m}l}l}l}m}m}m}m~mmmmlmm~n}n|o|p|q|q}q}q}p}o~nmmmpt}t|t|w{x wnjgeefgfgfglsz||}~~~~}}|||||}}}~~~~ ~}}}}{wtqmie g g h¡i¡i¡h g g¡i¡h¢i¢i¡j kklnrx|}~ ~{{}~ wx{} {s£n¤j¤i¤i¤i¤i£i¡i¡i¡g¢f£f¤f¤e¤e£e¢e¢d¢f¢g¡g¡hikmoozorplofodogohoioininininhnhn~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~}~}~}~||}{}zy|rnmmgdb aaaa`^]ZWVTTSRQPNLIHGFJOSSRQQPQRRQPNMJJJJKKLLNMNSZbg jlllll~l~l}l}l}l}k}k}k}k}l}l}n}n}n}n}n}n|n|m|m}m}n}n}n}n}o}o}o}o}o}o}o}o|o}o}q}q}q}q}q}p}o|o|o|o|n}n}n~nnnq~p~o~o}n}n}o}o}m~m~m~n~n~n~n~n~q}q}r}r}s~r~r~r~q}p}n}l}k}k}l}m~n~n~m~m}l}l}m}m}n}m}m}m}n}n}o~p~q}q}p}p}o}o}o}o}n|n|m}m}m}n}m~n~m~m~m~m~m}m}m}m}n}n}n}n}n}n~nnnnnnn|n{o{p|o}q}r|r|o}n}mmlor~s~u}z{wumkhfefggghilpvz}}~~~~}|||}}}} ~ ~ ~ ~~ ~~}}}}zvro l h¡e f g¡g¡g¡h¡i¡j¡i¡i¡i¢j¢j¡j kkknrx|}~ }}}{|} w¢p£j£i¤h£i£k¢k¡j¡h¡g¡g¢g¢g£g¢g¢f¢f¢g¢g¢h¡h¡i jkknopqqjqgpfogoiohohohohnhohoin~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~}~}~}~}~}}}{}zz{u~plj b _\ZZ[ZY[ZYXVUTSRRPNLJIHGIMQSTRQOOPPONMMKJJJJJKKLLNT\chjlllll~l~l}l}l~l~k~k~k~l}l}m}n}n}n}n}n}n|n|m|m|m|m|n|n|n|n|n|o}o}o}o}o}o|o}o}p|q|q|q}p|p|o|n|n|n}m|m}m~m~nnp~p~o~n~n~n~n~o}m~m~m~n~n~n~n~n~p}p}q}q}q}r~q~q~q|p}n}l}k}l}l}m~m~m~l~k~k~k~l~l}n~n~n~n}o}p}p}p}q}q}q}p}o}o}n}n}m|m}n}n}n}n}n}n~lll~l~l~l~l~l~n}n}o~o}n}o}p|p|oonnn}n{o|o|n~p}q}q}o}n}n~o~moq~r~u~z{wsljgfeegghghkntx |}~~~~|}}}}~~ ~ ~ ~~~ ~}}|{zws p¡n¢l£j£h¢f¢g¢g¢h¢i¢j£k£k¡j¢j¢j¢j¡k kkknsx|~ ~~ |v¢m¢k¢j£j¢k¢k¡j h h¡h¡g¢g¢g¢g¡g¡g¡h¡h¡i¡i j j kklmozppqiqgpgoiohohngngnhnhnin~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~}~}~}~}~|~}~}|}z|{y~sk f`]ZWWWVUVVWWVUTSRQPNLJIHHGIMRUTQNNMLLLLLKJJJIJJJJKPW_f jkmmlll~l~k~k~lllk~l~l~m}m}n}n}n}n}n}n|n|m|m|m|m|m|m|m|m|m|n}n}n}n|o|o}o|o|p}p|p|p{p{o{n{n|m}m}m}m}m}n}o~p~p~o~o~n~m~m~n~n~m~m~n~n~n~n~n~n~n}n}o}p}p}q}p}p}p|o}n}m}m}m}m}m~l~l~k~j~j~j~k~k~m~n~n~o~o}p}p}p}q}q}p}o}n}m}m}m|l}m}m}m}m}n}n}n}l~l~l~l~l~l~lln~n~nnn~o}p|q{q|p~oon~n}n|n}noqqp~p}q}r|p~r~r~r~u}{z tpkifedefghggilqv y|}~~~~~}}}~~ ~~~~ }|{zyyuq¢m£l£k£j£i¢h¢h¢i¢j¢j£k£l£l¢k¢k¡k¡k¡k kkknrx|~~ | p n¡k¡k¡k¡j¡i h h¡h¡h¢h¢g¢g¡g¡g i i¡i¡i i j jjikmpxqnrjqipinhnhngngmhmhmim~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~}~}~|~}~}~}~}}}z}{|~uj b^[WTSSQPRSTUUTRQQPPNLJIIIGFKRVTQNMKJIJJKKJJJJJJJILRZcilm}mmmll~k~k~k~lllll~m~n}n}n}n}n}n}n}n}n}m}m}m}m}m|m|l|l|l|n|n|n|n|n|o|o|o|p|p|p{pzpzozn{n{n}n}n}n}o}p|q|r|o~n~n~m~m~mmmn~n~n~n~n~n~m~m~l}m}n}o}o}o|o|o|o|o}o}n}n}m}m}m~k~k~j~j~i~jjjlm~n~o~o}o}o}o|p}o}n}n}m}l}k}j}ll~l~m~m}m~n}n}n}m}n}n}n~n~n~n~n~n~mmmnp~q}q{q}pon~n}n}n~npqrr~r~t|v{s{t|s|s}v}}xrmihfddefghgggjotw{{|}}}}}}~~~ ~~~~ }|zyyyvp¡l¢j¢j¢j¢i¡j¡j¡j¢k¢k¢k¢k¢k¢k¢k¡k¡k k kkkmqw{}}~ ~sq m¡k¡k¡j i¡h¡h¡h¢h¢h£h¢g¢g¢g h h¡h¡h¡h h hhgiloqrrlqkqinhnhmgmgmhmhmim~~~~~~~~~~~~~~~~~~}~}~}~}~|~}~}~}~}}}~}~}}~|||vkc\[XURPNMOOPPQQQQQPONLJJIIHHJNQRRQNJIIJJJJJJJJJJJJMV`hmml~n}n~m~mllkkmll~l~m~n}o}p}n}n~n~nnn~n~m}l}l}l}l|l}m|m|m|n|n|n|o|o|p|p|p|p{o|o{o|o|n|n|m|pn~m~m}p|q|r|r|p~n~m~m~m~n~mmnnn~n~n~n~n~n~m~m~n~n}n}o}o|o|p|p|p|o}o}o}o}n}m~l~j~i~hijkmm~n~o}o}o}m}m}nn~n~n}m~l~jjkkklmmnnn~n}o|o|p|p}o}o~nnmmmno~p~p~o~o~o~n~n~n~n~n~oprsss~s}t|u|u{t|w}ysnihgffffgggggilqv zz{|}}}}~~~~ ~~~~~~ ~}{{z{xtol¡k¢k¢j¡j¡j¡k¡k¡j¡j¡j¢j¢i¢j¡j¡j j j j jmqw{|}~ wt¡o¢l¡k k¡j¡j¡j¡j¢i£i£h¢g¡g¡g¢h¢g¢g¡g¡g g gggghlp{qoqlphogngmglgkhlimjm~~~~~~~~~~~~~~~~~~~}~}~||}||}}~}~~~~~~}||yog]\YVRPONNMMMNNNNONNMLKJJJIGILORRQOKIJJJIJJJJJJKKJQZcikllm}m~m~m~mmllmmm~m~n~n}o}o}n}n~n~nnn~n~n}m}l}l|l|l|m|n|n|n|n|n|o|o|o|o|p|o|o|o|n|n|n|n|n|nljknp~q}q}o~n~l~l~n~n~nmmmn~n~n~o~o~o~m~m~n~n}n}n}n}n}o}o}o}o}o}o}n}n}n}l~k~iijkln~n~n}n}n}l}k~j~kklllllllllmmn~n~no~o}o}o|o|o}o}o~n~n~nnnoopooooonnnopqrrrrru}u|vzv{y{xqljiiggggggggghkptyy{|}~~}~~~~ ~}||||{xup¡m¡j¡m¡m¡l¡k¡j¡j¡j¡j¡i¡i¡j¡j¡j¡j i imqvy{|~ xt¡o¢k¡j j¡j¡j j¡j¢i¢i¢h¡h¡h h¡h¡g¢g¡g¡g g gh gghjn~poqjphnhngmglgkhlhlhm~~~~}~~~~~~~~~~~~~~~~~}}||||}}}~~~~~~~~}}zph_\YVSQQPNMMLKKLLMMMLLLLLMJFFIMQRQOLJJJJIIIIJJKKKLT_gijkll~l~m~m~mnnnn~n~o~o~o~o~n~n~o}n~n~nnn~n~n}m}m}l}l}m|n|n|n|n}n}n}n}n}n}n}n}n}n}n}n}n}o}o}o}mkijlno~o}n~m~k~l~n~n~nmmmn~n~n~n~n~n~n~n~n~n~n~m~n~n~n~n~n~n}n}n}n}n}n}m}k~jjkklm}n}n}n}m}k~jijjjjklmnmnnnnn~o~o~oonnnnmmnno~oppooooooooooopqqrrrruu|vzv{z{xrmkkjihggggggggjorwxz}~~~}~~~~ ~}ytqrqo m k k kk j¡j¡j¡j¡j¡jihlotxy|~ yu n¢j¢i¡i j¡i¡i i i i i iii¡h¡h¡g¡g¡g¡g h hihhjnppqhqhohnhmhlglglfmfm~~~~}}}~~~~~~~~~~}~~~~~}}|{||}}}~~~~~~}~~~}~}xnf _]ZVSRRRQONLKKLLKKKLLLMMNJFEGLPRQPMKKJIHIIJJJKKLMVbijijlk~k~l~m~n~n~o~o~o~o~p~p~p~o~n~n~o}o~o~nnn~n~n}m~m~m~m~m}m}n}n}m}n}n}n}n}n}n~m}n~n~n~o}o}o}o}p}nljjlmm~m}m~l~k~k~m~n~nmoon~n~n~m~m~m~n~m~m~m~m~m~m~m~m~m~m~m~n~n}n}n}n|n}ljjklm~m}m}n|n|m}l~kjjjijjkmmn~n~onoo~o}o}onmlkkkkmnop~p~p~pop~o~o~o~o~p~p~p~nnp~q~r~rrrtu~u|v|y}{vqmlkihhgghggggimquwz|~~~}~~~~ |{vuromlll k k¡k¡k¡k¡jiiknsvy{} yun¢j¢h¡i¡i¡i¡h¡i i iijjj h¡h¡h¡h¡h¡h¡h h¡jjiknqvrlrhqhphnhngmfnfneo~~}}}~~~~~~~~~}}}||||||}}~~~~~~~~~}}{}sib^]YVTSSSQQPOMKKJIIJJKLMMNMJGFINRQOMKJIIIIIKJJJKLQYch jjklk~k~l~m~n~n~o~o~o~o~o~o~n~nnmn}n~o~nnn~n~m}m}m~l~k}k~k~l~m~n}n}n}o}o}n}n~m~p~p}p}p|p|o}o}n~kklll~llklllll~m~n~n~o~o}n}n}n}m}m~n~mmmmm~m~m~m~m~m~mmnm~n}n}n}m}l~kjjjk~k}l}m}n|n}l}j~ijkmml~k~kmm~n~n~n~o~o~n~n~mmmmljiiklnpq~q~q~p~q}q}o}p~q}q}p|o|nopqr}s}s~sstt~u}y}{xunmkjhhhhihgfgilmruyz {|}~}}~~ z||wp k mo¡n¡n¢m¡l¡k¡j iijlpux|}~ {un¢k£k¢k¢j£h g h i j j j i i¡i i i i i¡i¡i¡ik¡j jlnormslskpinhnfneoeoeo~~}~~~~~~~~~~}}||||||||}}~~~~~~}|}wmc\ ZYVTRRRRQQONMKJJIJJJJKKKNMLIHIMPPNLJHGGGIJKKJJKMU[di jjklk~l~l~m~n~n~o~o~n~n~n~n~m~m~m~mn~n~mmmmn~m~n~m~l~kkl~n~n~o}o}o|o|o|o}n}n~o~o}p|p|o|n|n}n~l~m~m}n}n}n}n~n~m~m~m~m~m~n~n~n}o|o|n|n|n}n~mmmmmmmm~m~m~m~m~m~m~n~n}n}n|l~l~k~k~kk~k~k~k}l}m}m}m}l}k~j~l}n}o}n}m}k~l~lmmnn~o~o~o}n}nn~nnmkjjjklnpp~ppp}o~n~n~p~p~o}n}nopqr}s|s}sstuu~y}{wtmlkihghhihgggiklorvxyz |~}}~~ |upnn¡o¢n¢m¡l¡k¡j ijikoswz|} |un¡k¢k¢l£j£i¡g¡g¡g h¡h h h h h h ii j j¡j¡k¡l¡kklmo qtrnslqjohngogpgogn~~~~~~~~~~~~~~~~~~}}||||{{{||}}}~~}~|~wof_[YVSQPPPPPONLKJJKJJHHHIIKKKKIJLNONLJHGGGIJKLKKMNY_fjjjkmllm~m~n~n}n}o}m}m}m}m~m~m~m~m~m~mlkllmn~n~l~kkln~p}r|o|o|o|o|n}n}n}n}n}n}n|o}n}n|m}n}n}n|n|o|p|p|p}p}n~o~o}o}o}o}o}o}o|o|n|n|m}m~llmmmmmmmmnn~n~n}n}n}n}n}k~k~l~l}l}l}l~l~k}l}m}m~m}l}k}k}l|n|o|n|m|l}l~m~mmnn~n~n~n~m~n~n~n~n~nnmmkklmn~o~p~p~o~n~mmoo~n~m}n~opqr}s|s|s}tuuvy~{uqlkjhggghhhgghijjmpsvwxz{ }}}~~ ~yurqonk jihh¡ijnqvy|} {uo l¡l¢l£k¤j¢g¢f¡g¡g g g g g hhiijk k l¡l¡lllmnpxqosmqkpiogphpiojn}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||||zz{||||}}}}~~~{~voje c_ZWTSSPONMLKJJLKJHGGGGGHJJJJKMPOLJIHHHIJLLKLMO]bgjjikmllm~m~m~n}n}n}l}l}l}m}m}m~m~m~m~lkkklmn~m}l~k~k~l~o|r{szo{o|n|n}m}n|n|n|m|m|n|n|n|n|n|n|m|n|o|o|p|p|p}p}o}p}p}q}q}p|o}o}o|o|n|m|m}l}l~lmmmmmmmmpp~o}n}m|m|m|l}ll~m}m}m}l}k}k~k~l~l~l~m~l}l}l|k}l}n|m|m|l|l}m}o}o}o~n~m~llkmnn~o}p}p}p~p~nnnn~n}n}o}o}ommnppo~n~n~opqr}s|s|s|tuvvy~ztokjigggghgggghhiimortuvwx||}}~ |ywvspmkkj¢h jmpux{} {uo l¡l¡m£l¤j¢g¢g¢g¡g¡g¡g h hiijjjj k kk k klmoqvrnsmrjphpgqhpiojm~~~~~~~~~~~~~~~~~}}}}~||||{{{|||||||~|~}}|}{~yxsp jd_\ZZWTQONMLJJKIIHGFFGFEGJLLLNNMLJIHHHJKJILRWbdfiklmmmmml~l~m~m}n}m~m~m}m}m}m}m~m~llmmmnool~jijm}p|q|q|n}n}n|n|m{n{n|n|n|n|n|m}n}n|n|n|o{o|o|n|o}o|p}p}q}p}p|o}o}o}o~o~o}o}n}m}l}k~k~j~n~n~n~n~n~n~n~n~o~o}n}n}m}l|l|k}nn~n~n~mmlklll~l~lll~l}l~l~l~l~l~m~m~n~n~o~o~n~l~k~k~l~nnnn~o~o}p}q}p}o}o}o|o}o}o}o}m}n}p~qrqqqp~pqrss}t|tzt~u~wx{~ztokjigffgggggghijjlmoqrsssyz||{{|}~~~~~~~~ ~~~~ ~|yvromklmorvy{ {tm i i¡k¡k¢j£h£g£g¢g¢g¡g¡g¡ghhij j j j jl kjkmorwtntlshqgohoinjnjn~~~~~~~~~~~~~~~~~}}}|~||||{{||||||{{|~|~|~|~{~{{xrk e b ``][XVTROLKJJIHGFFFEEGJMNNONMLKJIIGIJIJMU[e f hjlmmmlll~l~l}l}l}m}l~l}m}m|m|m}l}l~klmmnnool~jijl~m|n|n}n}n}n|n|n|n|n|n|n|n}n}m}n}n}n}o|o|o|n|n|n|o}o|p|q|p|o}n}n~m~m~n~nnnn~m~m~m~m~o}o}o}p}p}o}o}o}n}n}m}m}l~l~k~k~nnnnnmlllll~l~llkk~m~l~l~l~l~l~mmm~n~o~n~m~l~m~n~n~n~n~n}n}o}p|q|q|p|p|o|n|n|n|m|n}o}p~q~rrrr~r~q~rrss~t|t{uvwx{ztokjigggggggggghijkkmnpqqquwyyxxy{}}}}}}}} ~}}}}}~ }zwuqpppqtwy~ ysk h¡h i¡i¡h¢g¢g¢f¢f¡f¡g¡g¡h i i j¡j¡j¡j¡j¡jj iijlpswvnvluirhpinjmkmjm~~~~~~~~~~}~~~~~~}}}|~||||||||||{{{{{||~|~}}}}~}zslgcaa_^\[ZWRPLLKKJIHGFEDFJMOONNMLJJIHFHIIJPZag hjkmmlljjkkll~k~k~kl~m~m}m}m~l~kklmnnnnnl~kjjlm}m~k~m~m}m}m|m|m|m|m|m|l|l}l}l}m}m|n|n~n}n}n}n|n|o|o|q{p|o}n~nnnn~nnnnn~n~o~o~p}q}q}q}q}q}q}p}m}m}m~m~llkknnooonnmmmm}l}l~kkjm~m~lllllmlmnn~m~m~n~o}n}n}n}n}n}o}p}p}p}p}o}o}n}n}m}m}n}n}p~q~r~r~s~s}s|s}rrstu~u}tvwx{{uplkihggghgggghijjkllnnpqrrtvvuuuwzzzzzzzz{||}~ ~}|||||}} ~|yusrsuw{|~ xrk¡g h i¡h¡g¡g¡g¡g g g h i j¡k¡k¡k¡k¡k¡k¡j¡jhggilosxvmvluisipjnkmlmkm~~~~~~~~~~~}}}~~~~~}}}}~|||||||||{{{|~|||||~}}}}|{~tmgc a`\\[[[XTRNMMLKKJIGEDEHLNNMMLKJHHGFGHHKS]ehh jkllkjiijkkkkkkkmmmmkkmnn~o~n~n~lllkjkmn~m~lm~m~m}m}m|m|m}m}k}k}k}j}j}k}l}l}n~n~n}m}m|n|n|n{p{o|o}ooppqoo~o~o~o}o}o}o|q}q}r}r|r|r|q|q|n}n}n~m~mmmmnnpp~o~nnnnnm}m}l}kjjn~m~mlllllmnon~n~m~n}o}m~n~m~n~n~n~o~p~o~o~n~n~n~n~n~n~n}n}n~o~q~q~s}s}t{t|s~rstu~u}r}t}v~x{~{tplkjhhhhhgghhijklnnnnoqrsrtuutrstwwwwwwwwxxy|~ ~}|}}}}}}}}~ |wuuvxy{} wrl¡h¡i¡i¡h¢g g g g h ijkl l l l l l k¡j¡igghhkorxunvlujsjpkolnlnln~~~~}}}~~~~~~~}}~||{{{{{{{{{{||~|~|~|~}~|~}~~|z~slf b_^][YYYWURNNMMLKJJHHGFFHLPNMKJIHGGHHHJOW_egghi jjjjkjjkmljhjklmnnmmnnn~n~n}n}n~n~lmmn~o}n}n}n}m}m~m}l}l}l}l}l}l}l}k}j}j}k}l~m~o}n}n}m}m|m|m|m{n|n|o}o~p~qr~r~p~o~o}n}n}o|o|p|o}o}p}q|q|q|p|p|n~n~m}n}n~nmmmoqqo}n}mmnmm~l~l}l~lmnm~m~llmnn~q}p}o~nnnn~n~mmmnnoppmml~llmno~o|o}n~opq~s}t|s|s|s}s}t~tttt|t|u}w~|}ysokkjjijjjiijkllmnooopqqrrsttttssstttsssssuvy| }||}}}}}}~~~~~ |xxyz{|} ~urm¡k¡j¡i¡h¡g f h iiijknmm l k k j i ihikllnpysnultjsirjqlololn~~~~}}}~~~~~~~}}~||{{zzzzzzzz{{||~|~|~|~|~|~xqjd `]\ZYWWWWTRQPONNMLLIIIGFHKNNMLJIHGGGGHKPX_ddefgii j j jjjlmmkjjklmnno~o~nnn~n~n}n~m~nmno~p}q|p|o}n~m~m~m~m~l~l~l~l~k~k~k~j~k~l~n}o}n|n|n|m}m}m}m}m~n}n~o~o~p~q~q}q}q|p|o}n}n}n}n~o~o}o}p}p|q|p|p|p|n~n}n}n}n~n~mmmnppn}m}mmmml~l}l}m~mnlll~lmnpp~q}p~o~nnmm~m~mmmmnnnomml~k~llmmo}o}o~oqr~t}u}u|u|u|u|t}t~ttu}u}v}x~|} ysnkkjiiiijjjkkmmnnnoopqrsstttttsrrrrrrqqqqtvy| ~}}~~}}}}~~~~~ |{{zz{|~ ~sql j¡i¡h¡g¡f h i i ihhjkll k k¡j i i h jkmmmnqzsotmsjrjqkplololo~~~~}}}~~~~~~~}}~||{{zzzzzzzz{{{{{{~|~|~z~wqjd_\ZWVUUWWUSSSRQPONNLLKIGHJMLLKJJIHGGHJMSZ`dcdefghi i iiilnomkkklmm~n~o~p~nn~n~n}m~m~mmlno~q|q|p|o~nmmmmmmmlk~j~jkln~p}q}n|n|m}m}m}m~m~n~o~o~o~p~p~p}p|p|q|p|o|n|n}n}n~o~o}o}o}o|o|p|p}p}p}p}o}o}n}n~nnmoqpn~m}m}m~n~n~n}n|n}n}nnkllmnopq~o~o~nnmm~m~m}mmmmnnnnmm}m}l~llmmo~n~o~p~r~t~v~w~v|v|v|v|v|v}u~uv}v}w}y~}|yrnlkihghiijjkkmmnnnnnoprtuttttsrqpqqqppoootvy~ ~~~~~ ~~~}}}}~~~~~ }{{{||~ }qo j¡h¡g¢g¡f¡e h i i h g g h j k j¡j¡j¡i¡h¡g g jkmnnor|sqtnskrkpkomomolo~~~~~~}}}~~~~~~~~~}}~||{{yyyyyyyyzzz{{{{{~{~x~smfa] [[ZZ[\\[YVUTSQPONMMLJHHJKIJJKKJJIHIKOU\addefggh g g h hilnonmmmlmmno~o~n~n~n~m}m~l~llkmo}q|q|p}n~mnmmmmmmmjjjkmo~q}r|n}n}m}m~m~m~n~n~p}p}p~p~p~o~o}o}p|o|o}o}n}o}o~p}o}o}o}o|o|o|p|q|q}p}p}o}n}n~m~mn~pqqp~n|n|n|p}q|q|q|p}n}n~mklmmnopp~m~m~mmmn~n}o}nnnnnnnon}n}n|n}nnmmnn~o~p~r~u~w~xv}v}v|w{w{w|w~xw}w}x~y~~|xrnlkhgfghiiijklmmnmmmmoqsttttsrqoopoonnmmmtw{~ ~ ~}}}~~ ~|}}}~~~~~ }||||~ {pm i¡g¢g¢g¢f¢d g h h h¡g¡g¡h¡i j¡j¡i¢i¢h¡g¡f¡fhjlmnor{uquotlrkplomnmnmn~~~~~~}}}}}}}~~~~~}|||{{yyyxxxxxzzzzz{{{yywslfba cbb c fffe[YWUTSPNOMLLMMLJIIJKKJHHGHKQY_cefghii i h hhhiklmnnnnnnnnoonnn~m}m}k~kklmn~o}o}o~nmmmnn~n~m~mljjkmn~o}o|p|n~n~mllm~n}n}o~o~o~oo~n~o}o}p}p}p~p~p~o~o~o}p}p}p|p|p|p|p{p{p}p}o}o}n}n~m~m~n~opppo}o|n{p|p|p|p}o}n~m~l~nm~m~nnnoo}j~k~l~m~n~n~n~o~n~ooonmnoo|o|p|q}q~pono~p~q~r~s~t~u~u~v~v}v|v|w{w|x|x|y}x~x~z}{wrokjhggfghhiijkllmmmllmopqrrrqpooomnnmlloqux} ~~}}}}}}~~~ ~~~~~ ~|{{|~ }tnmki g¡f£f¤e¡g g g h h i i jk¡l¢l£l£k¢h¡f¡djlmnnor{tountmslqlpkokoko~~~~~~}}}|}|}}}~~~~}}||{{yyyxxxxxyyyzzz{{zzzwrmighhhjmnnmec`_]\YWUTQQPPNLJJJJIGFEEFKS[adefghijjihi ijkmnooqqpponnmnn~n}m}m}l~lllmn~o}o}n~nnnnnnmmllllmn~o}o|o|o|n}n}n~m~m~m~m~m~m~n~n~n~o~p~q}q|p~p~p~p~p~p}p|p|p|p|p|p|p|p|p|p|p}p}o}o}n}n~m~m~n~o~oooo~o}n|p}p}o}o}n~l~l~l~n~n}n}n~noop}l~l~m~n~o~n~n~n~noponmmno}o}q}r}r}q~qpq~q~q~r~r~r~s~s~u~u}v}v|w|x|x|x|{}z~y~{|ytpmihgfgghiiijjkllmmmllmnopppoonmmlkllkkmqswz~ ~~~}||}}~~ ~ ~~~~~ }zyz{}~~ zrmlki g¡f£f¤e£f¢f¡g hijkkl¡l¡m¢m£k¢i¡g fjlnonoqxsnsmslrkqjpjpipip~~~~~~~}}}}}|||}}}}~~~}|||{yyyxxxxxxxyyzz{{z|}{wrnmkkkmpqqpmkihgfda`][YXWTRMMLJHFDCCFMU]cedfghjjjjijj k lnopprrrrqonmnnll~l~l~m~m~m~m~n~n~n~n~n~o~o~nmlllmn~n}n}o}o|o|o|n|n|m|n|o|o|o}n}m~lm~m~n~o~p~q}q|r|o~p~p~p~p}q}q|q|o|o|o|o|o|o|o|o}p}o}o}n}n}n~n~m~n}n~o~o~o~o~n~n~onml~k~k~l~l~o}o|n|n}oopq}n}n~n~n~n~nnonoponmmnn~o}q}r}s}r}r~rq}q}q}q}r}r}r}r}u~u~u~v~w~x}y}y}y}x~w}y|}x tnkhgfffghiijjkllmmnnmmmnnnnnmmlkkkjkjjjnruy| ~}}}|}}~ ~~~~ ~~zxxxy{|~ ~v pmlk j¡i¢g£f¤e£f¢f¡g h ikll l m¡m¡m¡l k jiikmnnoqsslskrjqiphpgogogp~~~~~~~}}}}}}}}||||}}}}~}}|||yyyxxxxxxxxyzz{{z|}~|~xspnnnnorrrppnll l k iggeba`^\YQOMJHFDCCGNW_cdcfghjkkjjkkl mnoqqrrssrqonmlkkkkmnm~m~m~m~n~n~n~o~o}n~lklmop~o}o}o}n}n}m}l|l|m{n{o{p|p}n}l~kn~n~n~o~p}q}q|r{o|o|p}p}q}q}q}r|o|o|o|o|o|o|o}o}o}o}o}o}n}n~n~n~n~o}o}o}o~n~nnmljijk~m~n}o|o|o|o}opq~q}p}o}o~n~n~nnoopp~o}n}l}m~m~n~o}q}r|s}s}s}s}q}q}q}q}r}r}r}r}u~u~uvw~x~y}y}y}x}w}y|}y tomhggfffggijjklmmnnnnnnnnm n mnmlkkjjkjjjmquz} ~|||}}~ ~~~~ ~~{xvwwy{| zs o m m m¡l¡j¢i£h¤f£g¢g¡h h i j k k m¡m¡m m m lkk iklmmn|qpsitishrgpgogngngn~~}}}}}}|||||||}}}~~~~}}||xxxxxxxxwxxyyzz{z{|{~y~v~sqooorssqopomkjihhggffdca`[VPMKIEB@GQZ`bbcffhhijj j jklmnopqrrrrqponlkjjjklmmmmmmm~m~m~n~nmmmnopo~o}n}n}n}m}m}m}l|m|m}n}n~mmlpp~n~nnoq}q{o{p|p}p}q}q}q}r}o}o}o}n}n|o|p}p}p}p}p}p}o}o~o~o~no~p}o~mlmn~mljijk~n~p~p}p}p}p}p}q}r}r}q}p~onnno~p}q~p~o~nnm~n~n}n|o|p}q~r~r~r~r~o~q~s~s~r~q~r~s~u}t~t~uwyx~w~yw~v}w||{ vqliihgffgghhhijklmmmmmmmn m n n nmmmkkjkkjjmqu{ ~ |||}~ ~~~~ xuuxvy{|}} }v r q¢o¡n¡m l¡l¢k¤i¥g¢g¡g¡h i k l m¡m¢m¡m¡m mmlllkjjkmpysnthtgsgqgognhmimim~}}}}}||||||}}}}}~~~~}|||yxxxxxwwwwxxxyyyyz{{~y~vsqnnoqrrpnlljihgfgfgffedcba^ZXUNF?BIS[`bbcffghijjjjjklmoppqqqqqponlkjiijlmmmllllmmllmnoppq~o~o}n}n}n}m}m~ml}l~m~m~m~mmlqp~o}o~ooop}o|o|p|p|p|q}q}q}p|p|o|o|o|o|o|o|p}p}o}o}o}o~o~o~mn~o}n~lklmnlkk~k~m~o~p~q~q~p~p}p}q}r}r}ponmnno}o|q}p~p~onnn~o~o}o}p~q~rrq~q~p~q~s~r~r~q~r~s~t}t}t~uxyx~w~yw~v}x|}{wrmjihggffghhhhijkklllmmmmnmnnnnmlkkkkjknsw}~}}}~|||}} ~~~~ ytsttvyzz{|~ zu r p¢o¡n¡m¡m¡n¢m¤k¤i¢g¡h i j k m¡n¡n¡n¡n¡m mmlllkjjlnqytovjsiriphnhmimimjm~~}}}}}|||}}}}}}}}}~~}}}|{yyxxwwwvvwwwwxxxxyzzyvtrnnnoqqomk jiihhiihhgfeedddcaa^WMEGMV\`abbeffghhhhijjlmnooppqqpponnljhhjlmmlkjjklmkln~p~q}p}p}p}o}o}n}n}n}m~mmkklmmmmloo~p}p}ppoo~o}o}o|p|p|p}q}q}p|p|p|p|o|n}n}m}o}o}o}o}o}o~o~o~m~n}o|n}ljklnmm~n~n~o~ppqppp~p}p}q}q}oonmmmn~o}q}p}o~onnoo~o~p~qqrrqq~pqr~q~q~p}r}s}s}s}t~v~x~y~y~w}y~w}w}y||xrnkjiggffegggghiijkkkllmmmmmnnnmllkkkjkouy ~~}|||}~ ~~~~~{tppqsuwwxy{}}~~ {w¡t¡qn¡o¡n¡m¡n¡n¢o¢m£k¢i¡i¡j k l m¡m¡n¡n¡n n n mmlllllmorzupwkrkqjojniljljlkl~~~}}}}}|||}}}}}}~~}}}}}||{yyxxwvvvvvvvvwwwwxyzyvtronmmoon mlkkkllmmkjhgeedddcccc^VPLQX^````efgggggghi j kmmnooppppponpnkiikmnmljjjklmlmo~q|q|p|o|n|o|o|n}n}m~mmmjkllmmmmlmo}q}q}q~p~p~o}o}o}o}p}p}p}q}p|q|q}p}o~n~m~ln}n~n}n}o}o~o~o~n}o|o|n}lkklnno~o}p}p~pppoon~n}o}o}o|o~nmmlmnn~o}o}n~nnnnnppqqqqqq~pqr~q~p~p}r}t}s|s}t}v~y~z~y}w}x~x}x}z}|xsolkiggfeegggggghhjjkkllmmmmnnmmmlllkklpw{~||}~}|||}}~ ~~~}}~~|tnloqsuuvwy{{|}}~ {v t¢s pn¡n¡m¡l¡m¡n¡o¡n¡l¢k¡l¡k l l l l¡l¡n n m n mmmmnnnnorxtovmrlqkokmklkkklkl~~~~~~~~~~~}}|||}}}}}}~}}}|||{{zyxwvvuvvvvvwwwwwxxwwx}w~uso m kkmn o on n opp o o n nligdcbbcccba_]\WWYZ]_`bdegfeefgjjk l mnnonnoooonnonlkklmnlllmmmmmlmo}p|p|o|n|m}n}n}n~m~mmmnlllmmnnnmnp~q}q|q}p~o~o}o}o}o}o}o~o~o~q}q~p~onnmm~ooo~o~o~p~ppn}o}o|o|n}m~kjmnp}p|p|p}onpnmmn}p|o|n}onnmmmnnn~n~n~mnnnnpppqq~q~r~r}s~s~r~q~qqrrt}u}u}v}w}x}y}y}w}x}y}{}|zuqmkhgggfdggggggghijklllllllllllkklkklnsy| ~}}}}||}}~ ~~~~~~~~~~vq opqqrstuvwxy{}}~~} }yurp o¡o¡n¡n¡n¡n¡n¡o¡o¡o¡n¡n¡n m mmmm m¡m l kklmnoonnoqwsptmslqlolmlmlllllj~~~~~~}}}}||||}}}}}~~~||||{zzzyxvuuuuvvvvvwwwwwwvw~y|x}vtmlkln ppopqqqppp p n m kheccbcccca_]]YYYZ\_`adegffefhjj k lmnooooooonnmnnmmlmmmmmmnnoooo~o~o}o|n|m|l}l}m~m~m~m~mmnnmmmnnn~o~o~o~p~q}q|q|q|q|q}o}o~o~o~n~n~n~n~ooonnooop~p~p}p}q}q}q~q~o~o}p|p|o|m}ljmn~n}p}p}q}p~pommmo}q|q{p|o~o~n~n~nmnno~n~n~nnnnopppqqq~r~r~s~r~r~q~qrrrt}t}u}u}v}w}x}x}w~x}y}{}|ytpljhgggfegffgggggiijkkkkjjjjjkjjjkjjknty| }}||}}}}}~~~~~~~~~yspppppqrsttuvxyyyy{} }{zyurpon n¡m¡n¡n¡o¡o¡o¡o¡p n n¡m¡m l l mm¡k¡k j jjklmoonopqtrosmrmpmnlmknjmjlij~~~~~~}}}}}}}}}}}~~~~~}|||{{zzyxvutttuvvvvvvvwvvvx~y}x~usllln qsrqsrrqppppon l jgeccccccb`^][[ZZ\^`acdeeeefhj k l mnnopqqpponmmnnnnnmlkllmnnoppq|p|o|n}l}l~l~lklllm~n~o~p~n~n~o~o~p~p~p}p}r|q|q|p|p|p|q|q|n~n~n~n~n~n~m~m~nnnnnooop}p}p|q|q}q}q~q~op~p|q|p{o|m~lm~m~n~o~p~q~q~q~onmno}q|q|p}p}o~nnnnnn~o~o~n~nnnooqqqqqqqqr~r~q~q~qrrsr~s~t~u}u}v}w}w|xy~z}|}|xsokjggghgfgggggggghhiijjjiiiiiiihhiiijnuz~}|{{}}}}}~~~~~~}}~~~ ~vqqppoppqqqqrtttutxz|}}~ }zxwvus qnmll k l m o o o o o¡m¡l¡l¡k j j k k¡j¡j i iiklmnnnop|qprmslqlolmlmkminhlgk~~~~~~~~~~~~~~}}~~~~~~~~}}}||{xwuussstuuuvvvvvvvwxy~wtpllnqtutstsrpooooonmk hfdcccccb`_^]\[Z[]_`acddcdegk k lmnoopqqqponmlmmnnnljjjklmnopp~q|p|n}l~lllmkkkln~o~p}q~o~o~p~p}p}q}q}q}r|q|p|n|n|n|o|p|nnmm~n~m~m~m~nnnnnnno~p}p}p}p}p}p~qqppq}q|q{o{o|n}n}n}o~oop~p}q}q~omno~p}p~op~oonmmnoo~o~n~nnnooqqqqqqqqr~r~q~q~qrssrrs~t~u}u}v|w|z{~{}}}|wrmkihghhhghhhhhhhigghhhhhgiiiihhhhhghjnu{~ ~}|||||||}~~}}}}}}~~~~~}}}}~~~yrrqqpooppopqqrrqrvxz{{|~ {xwvwut¡r¡p nlk j i j k m n n m m k k j j i i i¡j j jiijkmmlmnoqwsmsltkpknllllkmingmfl~~~~~~~~~~~~~~~~~~~}}~~}}}|||xwvuttttuuuuvvvvwutvywq kmp rssstussrqqpoommlk i gedbcccca__^]\[\\^^`bbbbcehj jklmnooppqqpnmlmmnnnljiijkmnoooq~o~mjiiijkklm}n}o}o~onp~q}p~onopp|p}n|n|m|n|n|o|nnn~n}n}n}n}n~n}n~nnnmmmo}o~oo~o}o}o~oooo~p}p|p{p{p{q}q}p~popp~q~oonnooomonmllmnooonnoopqpppp~p~pppqqrrrrqqqrss~s~t}w|y||~|~|}}}|wqmjjihgggggghghhiiggghhhhhiiihhggghhijmt|~~~~}|||||||}~~~~~~~}||}||~~}||{{|}}~|vqqp o n nnnnnnoopqrstvxy{||}~~~zwuuuutsr¡p¡n m l k h i j kkkkk i i h h h h i iijkmmmmmmmor~touithrkoknlnlmkninhmgn~~~~~~~~~~~~~~~~~~~}}}}}}}||||yywvuuuuuuuuuuuuvutuvtn jor tutsstrrrqpooonmmk i gdcbcccba`_^^\\\\]]_`aaabegi j jklmnnppqqpnmlklnnnmkjllmnnopppnmkjjjjllm~n}n}o}n~nop~p~omlmnp|p|n|n|n|n|n|n|o~o~o}o|o|n|n|n|n|n}n}n~nnn~n~n~nnn~n}n|n~nooo~o}p}p}p}p|o~onnnooponnnppnmnmlklmnopppoooppnnooooppppqqqqpppqr~s~s}u}w|z|||~|~}}|wqmjihgfffffffgggghgghhijjjiihhhggggghims|~~~~~}||||||||}~~~~~~~}}}}||~}}||{zz|}~~}vpp o n n n nnmnmnnpqqrstvxyyy|}}~}{|}~~{zxvutttssr q¡p¡o¡n¡n j j k k jjji iihhhhiiklnooonnnopsyvmvhuhsknknlnlnkmjminhn~~~~~~~~}~~~~~~~~~~~}}}}}}}}|||||zyxvvuuuttuuuuuutuuusqm lrsuusrrrqppponnnnnmk i fdcbbbba```__]\[\\\]^___adfh h i jklmnnooonmkkjklnnnmlnnnnnoooponmllllnnn~o~n~n~nmo~p~p~nmlnp~p|p|n|n}n}n}n}n}p}o}o}o}o}o|n|n{n|n|n}n~o~o~o~p~mmmnn}n|n~nooo~o}o}o}p}p}nnnnmnoo~n~n~nnppnmnmlklnpqqqqqpo~o~o~nnnooppppoooooopq~r~r~s}s}t}w}y|zz{|~|wqmjjhgfffeffffgggghhhhiijjhhhhgggggghilrz ~ }||||||}~~~~~~}||}}||{{zz}~~~~~|vppo n n n n nnnmmnnopqrsuvvwwyz{{||||}~~~|{zz{|||{{zwwvutsrrqqqq p¡p¡p¢o¡k¡k k j jjjjjiihhiijmnnooonmoop stuivgtjrjnknlnmmlmlmjmjn ~~~~~~~~}}}~~~~~~~~}}}}}}||||||||||zywvuttttttuuuttsuvuspoortutrpppooonnnnnmmlk i gedbbaa```a`_^\[[[\\]^__`cfg g h i kllmlmmmmkjihjlnnoonponmmnnoqpoonnn~n~o~o~o~o~n~nmmo~o~o~nnnp}r{p|p|n|m}m}m}n}n}o}o}o~o~n}n}n|n|n|n}n~o~ppp~q~nnnnn}o}o~on~n}o}o|o}o}o}o}n~n~mmno~o}p}onnnpponmmllmoqrqq~r~q~q~o~o~n~n}n~oppqqqqpoooopqr~s}s}s}r}s}v~x}xyy{~|wqmlkjhgfffffgggghhhhhhhhggggggggggiihhkqx} ~}|}}}}~~~~~~~}||~}}||{{z~~~~}~~ {vqqpon n n n nnmmnnoorrsuuuuuxyyzzzzyz{{||{{zzz{{{yxwvvvutsqpoooo o p¡p¡p¡k¡k¡j j ijjkjjiiiijjlmnnnmlknoprqthuhslqjnknlmmmmmmmkmkm~}}}}}}}}~~~~|||||||||||||||}|{xvutttssttttssstusqoo p sssrqpooonnnnmmmmlk j ihgfdc`_^^`a``^]\\\\\]___`cfg g h j jkkkkkkkjihgg hjlnoppsqnmlmopooooo~p}q}q}r}q}p}o~nmmmooono~p}q|r{p|o|m}l}l}m}n}n}o~o}p}nmlm~n|n|m}n}o~q~s~r~p}nnnn}n}o}n~n~nn~n|n|n}n}o}o}p}o}n~m~n~o~q}r}poonoooommmnnpqr~r}r~s~s~rqo~n~n~o~ppqqqpqqqq~q~qqqss~s~s}t}u~wxwzy~x}~|wrmlkjhggfghhhhhghhghhhhhgghhhhggggiiijlpw| ~ ~}~}|}~~~~~~}~}}}}}|}|||||~~~~~~~~~~|xrrrq p p o o¡m mmmnnoprrrstuvuxyyzzyyyyyyyyyzyxyyyxwwvuuuutsqpooo n n n n n¡k¡kkkjj j jjihhhhiiikmmmlllnop|qrrmrlrlqknknkmkmkmkmkmkm~~~~~}}}}~~~~}||||||||}|||||||{zxvutttssttttssrssrp op qsrrqqpooonnmmll k l k k j ihggec`]\\]_``_^]\\[\^```acfffg h i i j j j j j j i h g f ef hjmoqrrqonmnpq~p~o~o~n~n}o}p}p}q}p~o~nmmmmnnnn~o}o|p{q{o|n}m}l~l~m~n}n}o|p|p}o~mlmn~n}m}m~o~q~r~q~p}noo~o~n~nmmn}m|m{m|m}m~n}n|p}o}n~n~o~p~q~r}ooonnnnnnnnopqqrsssss~q}p}p|p}p}q~q~r~rrqqqqq~q~qqqttss~t~u~v~wvzz~y}{vqljjhggghihhhhhggggghhhhhgiiiiiijjjjkklpuz| ~~}}~~~~~~}}}}}}}}~~~~~~zssrr p p o¡o m mllmmnnopqqstuuwwxyyyyxxxxxxxyyxxxxxwvvuuuutrqqooo n n n mm j jjjjj j j j ihggghijlnonmnnoppxpqqnpmplolmlmlmlmlmlmlmlm~~~}}}}~~~}|||||||||}}}||||||zyxwuutsssttttssrrrqoop rrqqqppoonnnml k k j kjjiihhhgd`]Z[\]____^]\\]_abbbdffffffggh gghhgffedeg iknqrr~qpoop~q}r}p|o|n}n}n~n~nnnnmmmmnnlmnn~n|o|o{o{n}n}m~mmmn~n~p|q|q|o~mlmn~n~m~mnpq~p}n}ooo~o~nmllm~m}l|l}lllm}n}n}n~n~oopp~nonnnnnnmnnopqqqrrqqqp~p}o|p}p}q~r~r~rrrrrr~q~q~qqpttsstu~v~w~uz~{}z|yuojihgfgghihhhhhggggghhhhhhijjjjkkkjkllmosvy| ~~~~~~~~~~~~~~{utsrq o¡n n¡m mlllmmnnnopqrstttuvvvvvvvvwwwxxvwwwwwvvtttts rqqooo n nmmljjjjjkkk j jiiiiiijmpqpppqqrxqrqpqponnlnmmmmmmmmmmmmmmmm~~~~~}}}}}}}||{{{|||}}}}}}|||||yyxwvutsssttttssqrqp noqsqqqpppponnmm l k j j iiiihhhhifb]ZZ[\]]^___^^^`bcccdeffeddefffffffeedeeg hkmoqrqpppp~q}r}p|o|n}n~mmmmlmllmnnollnn}n}n|n}n}n~m~m~mmnnn~q}r|q|o~nlmn~m~mmmop~o}n}p~p~p~o~nmlk mmlkkkkl~l|l}n~nnnnnnnnonnnmmnno~p~p~pooonnnmmm~o~p~qqqqqqr~r~r~q~q~pppsssstuw~x}uz~{}{{ytnjihgggghhhhhhhgggggghiihhiijjjkkkklnnnoqtw{~ ~ ~~~~~~~~~~~ {uutrq o¡n¡n¡n¡n mmmmmmnnoopqrrqrrsttttttuuvvwwvvvwwvvutttts r qqooonnmlllllkkkkk jjjjjjjjknpqqqrst|trsnroqqponknnmnmnmnmnmnmmnmn~~~~~~~~}}}}}}|||{{{|||}}~~~}|||{{yxwvvtssrrstttssrqon no qrqpppppppo n l j ihhihhhhgggghgfc`^\Z]^__`___aabcddddddddcddcedddddeeffgh jmnpp~oopp~p~p}p}p}p}o~nmlllkllmnnoommmm~n}n}n~nmmmmmmnnr}r|q|p}p}o~nnmmmmnoo}o|o}o}o~nmmmm nmmlklllk}l}m~n~nnnnmmnnnnnmnnmnp~p~onmmmmmmmm~q~q~q~ppppop~ppqqqqqrrstuwxyxz}}zvrnljihggfghhhhhhhhhhhgghhhihhhhijkklmnnnnqsxz}~~~~~ ~}}~~~yvus q p o o¡o¡o¡n¡n n nmm mnoppqqqqqqqrrrrrrrssttuuvwwwwvvurrrqqppppon n mmmmnnm l lkjj i jjkkkllnnopprst{wtvmulsnqqoqnonpmpmpmomonnnnnnn~~~~~~}}}}||||||{{||}|}}}~~}|||{{yyxvutssrrssssssqpo nno pqp pppooon n m k ihggggggggggfgggedb`_^^_```__`abccddccccccbbbcccccdeeeffg jlmnpppppp~q~q}p}p~onnnnnnononnnnmmmmmllllllllmnns|r|r|r|q|q}p~pnnnmnn~n}o}o}n~m~mmmmnnnmmlllll~m~m~n~nnoomnnnnnnnnnmnp~p~onmmmmmmmn~pppppppppppqqqqqrrrsvy}~}{wrnljihgggghhhhhhhhhhgggghhihhhhijkk klnnnpruxz} |||} ~}}~~ }xvu s¡q o n n¡o o o¡o o n n n nooppppppqqqqqrqqrqrsstttvvvvuttsqqqqqppppon m m lllmmmlkkjj jjjkklmmnnnoqrtuvvqvmulsnqqpqopnpnqnqnqnqnpooooo~~~~~}}}}}}||||||{|||||}}}}}}|}||{zyywutsrqrrsssrrqon mmn oqo o ooonm l k kjigffedddeefffffggfedd````__````abcccccccbbaaaaaabbcdeefghj kmnppppppp~p~oonnnnooppoonnnnmmmmlllllkkllmnor}r}r|r|q}q}q~q~ponnnn~n~o}n}m~lklmnonnnnnmmmmllmm~n~o~o~oooonnmmonnnp~p~nmmmnnnnnooooopppppppqqqqqqrtw{~|xsnljihgggghhhhhhhhhgggggghhiiiiijkl¡klnnnptvxy|~}z{|z} ~~}}~~ {vus¡r¡p on n n¡n¡n¡n¡n¡m¡m¡m¡mooppqpppnnnnopppqqrrrsstutssrrqq ppppp qqqqpn m¡l kjjkkkkjjj i jjkklmnnpppqqstuqupuntmsmrnpoopopnpnqoqoqpqppqoq~~~}}}}}}}}}}}||||{||||||||}}||||||{zywvtsrqqrsssrrpon mm nopn n o o n m l k jjihgfddbccdeeffgggggfeedcb`_^^^_`aabbbbcbbaa``_````bcdef ggij lnopooooonn~mmmmnnoooooonnnnnnnmmmmlllllmnop~q~q~q~q}q~q~qqpp~o~n~m~n~n~n~m}m~kkkmnpnnoonmlllkkkl~m~n}n}p~p~p~oonmmonnnp~p~nmnnnnoooooooooppppppqqqqqpsx}~}xtoljihgggghiiiiiihhggfffghhiiiijkll lmnnnpsuvxz}~ ~{z{|z~{z ~~~ ~~~}~~~ ztts q¡o nn n n m m m¡m¡l¡l¡k¡kjjkllmmmkkklmmnnppqqrrsstsrq p ppp¡o oopp qqqq p¡n¡m¡kjiiiiiihh h hjjklmnnorrqqrrsysouptptosmrlqmpopnoooppqpqppqornr~~~~}}}}}}}}}|||||||||||||}}|||{{{{zyxvuttrrrsrrqqqp nnoon mmmmmllkjjihgfeedcccdddeegggfffeeec`^]\]^_`bcdccbcba`_`__```abdeff g h h i jnponmmnonmmmmnnoppoooonnnnnnnmmmmmmnno~o}p}q}q}ppp~q}q~q~r~r~q}o}m~lmnn~m~m~mmlmmnn~n~n~o}o}n}l~jikkjjkk~l~m~n}o}o}o~o~onnnnooooo~o~ooooopppppooopqqqqqqqqqqqv|~~~|wpkjjihgggghhhgggfffffefggghhijklmmmmnnopqquuwy{}} ~|zz{zy|} wuz|} ~ ~~~~ ~~}}~ |wstts r p o n nn m m m¡l k jjfghjjkkkkjjjjjklooppqqqrsrqpon n o¡o oooqr q¡o¡o¡n¡n¡l¡kihhhiiiji h gjiijkmnprrqqrsytstototosornrnqmpmompnpnpoqoqornrnr~~~~}|||}}}}}}|||||||||||||||||{{{{zyxvuttrrrsrrqqqo nnoon llllkkjjiihhgfedddddccccceeeeeeffdca_^]^^`bceeedccba`____```acefgfgiii knppomnopooooopp~p~p~p~oooonnnnooooonnno~o~o}o|o|o}o~opp~p~p}q}q}r}r~q}n}m~mnnn~m~mmmlmmnnnn~n~n~m~lkjkkkkklmmm}n}n~o~onnnoooooop~p~qqqqqqqqppooopqqrqqqqqqrty ~~~xqljjihgggggggfffffffffgghiiiijklllllmnoopqtuvxz|}~}zyyzzz{~}vvz{| ~~~}~ }}~ zvtuts r r¡q p p¡o¡o¡n¡m k jiiffgiijjijjjijjjklmmnopqqrqponnnn¡o n noq q¡p¢n¡n¡n¡m¡m kjiijklmmlkjjjjjkmnoqqqrrsutquntnsmrmqmqmpmpmpmqnqoqprqsqsptpt~~~~}|||}}}|||||{{|||||||||||||{{{zzyxvuutrsssrqqpqo nnnnl kkkjjiiihggffedcccccccbbbcccddddddca`____abdfggfedccaa```bbbbcdeffgiii jmppnmmoppop}p}p}p}p}p}p~p~o~n~n~n~o~o~o~o~opppponmo}o}o|n|n|n}nnoo~p}p}p|q|q|q|p}n}m~mnnn~l~mmmlmmnnnnnmllkjkkllmmmmn~m~n~mnnnoooooppp~p~r~r~q~qqqqqppooopqqqqqqqrst{ {uokjihhhhheeffgggggggggijjjjjjkkllkllmnooptuvwy{|}{yvvxz{zz ~xwxyz| ~~~~~}|}|xutssrr r q¡q¡p¡o¡o¡n¡m¡k jiigghhhhggiiiijjjikklmnnoppponnnnn nnnoq p¡n¢l l l m m lkjjklmnnnmlkkjjklmnopqrs|truquotosnrnqnrnrosptquqvqvrxryryrzr{~~~~~}}}}}}}}}||{{{|||||||||||||{{{zyywvvuussssrqpp qo nmnml jkjihggghffeedcccbbbbbbbbccccbcccccba`___`bdfggfeeedcbbbbdcccccddfghhh iknnmllnoonq}p}p~p~p~o~o~o~n~n~o~o~o~o~o~o~oop~p}p}o~nmnn~n}n}n}n~ooo~o~o}p|p|q|q{q|o}n}n~nnnm~l~mmml~m~mmmnnmllkkkklmmnmnmn~n~m~mmnooooopppp~p~r~q~q~q~qqppppooopqqpoopqsvw ~xskjiihhhhdeefgghhggghhikkkkkkkkkkkklmmnoouvvwxyzzwvttwz{{ {|vx{zy{ ~}}}} |xvtrqqqq q¡q¡p¢p n¡n¡m¡m¡l¡k j jhhihhggfghiiiiihll l m¡m¡n n n o n n m m mmnmmmopp¡n¡k jk l m mlkjkklmmmllllkjklmmnoprtytququqtptpspspuqwsxsyu|u}u~ttttt~~~~~~~~~~}}}}}}}}~}}||{{z{{{{||||||||||{zxxxxwvuutssrrrrsrpn m m m kijjihggggffeedba``aaabbbbccbbaaabbbbbaaa`ccdeffffffedddccfeddcccdefghhi kmnmmmmmnnoooonnnnmn~p}p}n}n~nooopp~p~p~onmmmn~n~n~o~o~n~n}n}o|p|q|q{r{p}o}o~nnmllmmmmmmmmnnmlkkkkkklmnnnoo~o~o~nnnooppppppppq~q~p~o~o~o~onmmmnopqroooprv|yskighhihgefffgghhhhhhijklmmkjjjkkkkkklmnostvwxyxxusrtx{{z{wwy|{|~~~~~}~~~~~}}} ~zxvtrppoo o¡o¡o¡o¡o¢n¢n¡m¡k¡k¡j¡j¡jjiihgggggghijkkkk l l m m¡m¡m¡m n¡n¡m¡l¡l¡l¡m nllmnn m m lklmn m ljiklmmmlkklkkkkklmoopqrwsststqsrtswtzu|uuuwwvv uutu~~~~~~~~~~}}}}}}}}}}}||{{{{{|||||||||}}||{yyxxwvuutssrrrrsronm l kigiihgggggedddca`_````aaaabbaaaabbccccddccddddddefggghhhhhggfedccddegggh jlnnmmmmmnmmmmmmmmm}n}o}o}n~nnpppppp~o~n~n~nooo~p~o~o~o~nnn~o}p|q|q{r{q}p~o~nnmmmnnmmmmmmmlllllmmllmmnooo~p}q}q~q~q~qqqppppppppqponnnn~o~mmnnopqrooprv{xrjhgghiihffffgghhhhhhijjknmljjjjkkkjkklmnqrtvxyyyuttuxz{{ }ywxz|{|~}~~}|}}~~~~~~ }{yvutrqopo n¢n£n£n¢n¢n¡n¡m¡l¡j j i i iiihhggggfghijjkjkll m m m l l m m¡m¡m¡m¡m n nmmmnm m m mlmnn n mkjklmmmmlkllkkklmmnnoqrxsutuuwwwyw|wwwvvvvvvuuuu~~~~~~~~~~~}}}}}}}}}}||||{{|||||||}||}}}}||zyxwvvuutssrrrrsqomlkjgefffgffeedccba``____```aaaaaaabccefgghijjigfddefgjj k lmm l l jjhfeddccegffg jlnnnmmmmmmmmmmmmmm}n}o}o~n~nnpqqponnnnoopp~p~o~o~n~nnn~o}p}q|q|r|q}p~onmmmmnnnnmmmmmlllmmn~n~nnnnoop~p~p~q~q~r~r~r~r~q~o~o~pppqqqponmmno~p~nnopqqqqqpqu|~~~~~~ xrjhgghiihggfggghhgggghijjlkjiiijkkkkkllmnpqtvwyyyvwxyyz|~zxwyz{{| |{}~~|||}}~ {wtsrrrrpnoo¡n¢n£m£m¢m¢m¡m¡l¡k j i h h hhhhggggggghijjjjlllmllkkll m m n nnnnmlll k l lkllmmllkkkmnn m mlmmlllmmnopqs|uxwxxyxz}yyx wwvvuuuuuuuu~~~~~~~~~~~~~~~~}}}}}}}}}|}|||||||||}|||||}}}}||{zxwvuuutssrrrrsqomkjifddefffeddcca`_```````aaabbbbbcddehhjklnno mkifefhjm nopponnl kigfedcdfggghj monnmmmmmmmmmmmmmn~nonm~n~o~q~r}q}p~onmlloopp~p~o~m~l~n~n~o~o~p~q~q~r~p~o~nlkkllnnmnnnnnmmmmmmm~n}n~oooopp~p~nopqrqqpoooppqqqommllmo~p~o~o~p~q~q~q~q~q~sqrx~~}}}}}} }~~xqkighhihghhgggghhggggghiiihgghijkmmllmmnnpqtuwxxxwy||z{~yvwz{{z|~zz}~~}}||}~~ ~{wtpppqrrp noon m¡m¡l lm¡l¡k j¡i h g g g g g ggggffffgiijjjlllllkkjklm no ooomlkjj j k kjkkkkkkkkkmnn n mmnmmmmmnnrrtvzxy{{}|~zyxwvvvvuuuuvvvv~~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||||||||}}}||}}}}||{zzywvvuuttrrq q q oonmjhfeeeeeedcccb`___`aaaaaaaaabbbcdfghjjkln oopo n k iii k l qqrrrqqpn l jiiifdfffgi j l lonnmlmmmmmnnnnmmnnllmnp}q|q~q~p~omljinnoo~o~n~m~m~o~opppqqq~p~p~nmllkkklmnnnnnmnmmkklmn}o~oooo~nnmlllmnopnmlmnpponmlkkmnooopqqqqqqqsx~}~~}}} }~~ ~vojjihhggghhgggghhggghhhhhhhhiijjjkllmmnnnoprsuvwxzz{|}{xxzzzx}|yz|~~~~~~ {xurnnnnnnn mmmmm l l k¡k j j i i h g g g¢g¢g¢f¡e e effffgghijjmmnmmlkjllnno o n n k k j jjjjkkkkkkkkkllmmn mmmnmmmmnnotuxzyzz{}|{{ zxwvvwxvvvvvvvv~~~~~~~~~~~~~}}}}}}}}|}}||||||{{||||||||||||||{zzzyxxwvvuutrrq q q oonmkhffeeeeedcccba````aaaaaaaaabbcceghikklmn noopn l kkk m nqqrrrrrrpnm lmmljggggh j k k nnnmmmmmnnoooon~n~nmlklmo}p|ooponlkiklmmnnnno~oopppqq~q~p~onnmmmllmmnnnnmnnmkjkmn~nnonnmmjjjjkmopolihknpqoonmmmnnnnoppppoppsy~~~~}} }}~~}tnjihhgggggggffggggggghhhhhhiijjjjkkllmmnnopqrtvwxzzz{|~~}~~~}{{ ||} ~|}~ |yvrqmmmlllllmmlllkkk k j j i h g g g¡g¡g¡f¡f e fffgghijjjj m mmmmmlll m m m m l¡j¡j j j iiiijjkkkkkkkkllmmm mllllllmmnntvyz{z|||zzyxvvvwwuuuuuuuu~~~~~~~~~~~~~}}}}}}||}||||||{{{{|{{{{{{{z{{{{zzyzyyxxwwvuutrrq q q ponmkigfddeedccbbaaaaaaaaaaaaaaaccefhijkllm m nnnoonm l l m noqrrssssrqnmlm m mlj i i i i j j k nnnnnmmmnoooooo~n~o~nlkkmm~o}mmnnomlkjklmnnnnnooopppqq~p~oonnnnllllmmmmoppnkkkmmmnnnmmljjijkmnonkhhjnpqppppponmnnnoonnnoory~ ~ }}~~ zqkiihgfffggffeeffggggggghhiiijjjjkkkkllmmnoppqsuvxyyyyz{|}||}}} ~ }}|zxurpnnmlkkllmmmllkkk k k j i i h g gfg f f f fggggijkkk k k kkkklmm¡m¡m¡m¡m¡l j h¡g i hhiijkkllllkkkknnnnm¡m llllllmnopux~{z}{|{x wwvvvvvvuuuuuuuu~~~~~~~~~~}}}|||||||||||{{{{{{{{{{zzzzzz{zzyyyyyxxwwwuutrrq q q ponmkigfdddddccbaaaabaaaaaaaaaaadegikll m m m nnnnnnnnmm m nnoqrsttttttqonnnnmllk k k k kknnnoonmmnnnoonnnq~onllmn~o~klmmnnmlllmnnnnnnnooopppp~o~nnmmnnmmlllmmnrrqpmllmmmmmmmllkkjjkmmnkjikmoooq~qrrqpnmnooooonnnnry ~~~~xpjihgffffffeeeeeefffggggggiiijjkkkjkkllmmmoooprtvxyyxxyyyz|{z{}~} {{{zxusrp o m l kllmnnnmmmllkkjjihhhggf f fgggghiklmm ljjiijklm m m m m l j hg i iiijklmmmlllkkkpppo o¡n¡m lmmmnnopqvy}|y{{zwuvuvuuuuuuuuuuuu~~~~~~~~}}}}||||||||||{{{||{{{{{{{z{{{{zzyyyxxxxxwwuuuttrq q qonnmkgeeeedccbbbbbbbbccbaaaabcdiijkl m mmmmlllmnnmmmnnnooqrrstutttsqpnnnnmmllll k k noooonnmmmnnnnnnr~qponnnnmmlllmnnnnnnooopn~nnnop~p~q}o}n~mllmnnmlkklnpqtsqonlllmlllllmmlllllllljjjklmnnpqqqqponoooooooonptz~}}}~~~~~~ }voihhggffeefeeedddeggfggggghhhiijjjllllmmmmmnoooquwwwwwxxyy{{{{|||||}~~~}~~~|{{{{yxusrqp n m llllnooonnm m m l k jiiiiihffefggghhikklljhggghj l m mmllkjikkkklmnnmlllllkkmnopp onnopponnpry{~}{{zxwuuutttutuuuuuttt~~}}|||||||||}}||{{{||||{{{{zz{{zzzzyyyyxxwwvvtuuttsr q qonnmkgeeeedccbbbbbbcccccbaaacefkkkl m m l lk k kjkkllllmmnnooopqrtuuutsqpnnmmmmlllll l oooonnmmmmmnnnnnq~qponnnnmmlllmnnoonnoooo~l~mmnoo~o~o}n~n~mmmnoonmllmprsssqonmlkkkkkklmmnnnnnnnnkkkllmnoqqqqppoooooooooonqu{~~~~~~~~~ }vniiiihgffffffeddeegggggggggghhijjjlllllmmmmnoooqsuvvwwxxxxzzzzzzzzz{{||||{|||}}~~~}|{zyzzzxwtrqqpnlkkkklmmnnon n l l k jiiiihhgfffgggghhijjjihgfghi j¡kklllkjjkkkklllmkkkkkkkklmnooonnooponnqsz||zzzxwuttsssstttttttuu~~}}||||||||}}||{{{{{|||||{{zzzzzzzzyyyyxwvuuttttttsr q q pnnnkheeeedccbbbbcccccccb``adhjl l l l l k k j i i h h hiijkklmmnnomnoqrsttsrqonmmmllmmmmmmo ooonmmlllmmnoooq~ponmmmmmmlllmnn~o~o~onnnnml~mnooo~o~o}n~n~nnopqqmmmmnqsu~srqpnmkjkkkkllmnoooonnnnmmmmnnooqpppooooooooooooorv|~ ~ ~ ~~~~~~ }wojkjjjihggggfeeeeeggggggggggghiijjkkllllll mnooooqstuvwxxxxzzyyyyyyyyyyyyzzyzzz{{||{zzyyyyyyyywurpoonmkkkkkklmmnn n n l k jiiiiihhgggffffggghhiihhhhiih h jjkkkkjjlllllkjjjjjjjjjjllmmmnnnnopooort~z|}yxyyxwuutsssssssstttuu~~~~}}||||||||}}}||{{z{{{}}||{{zzyyyyyyyzyyxwvutstttttsr r r ponmlhfeeedccbbcccccccddb``bfjm l l l k k i i h g g f f f gghjjklmmnnmnoqrrsssrqonmmmllmmmmmno oonnmlkkklmno~p}p|p~onmmmmmmmlllmn~n}p}o~onnmmml~moppp~o~o}n~n~oopqqrlll~mnqtu}rrqp~n~m~kjllllmnoop~o~o~onnnnnnnnnnopqpoonnooooooooooprw}~~~ ~~}}}~}wplllkjjihhggffeeefggggggggggghhiii k k k k l l l l lmoonnpqstuwxxwwzzzzzyyyyxxxxxyzyyyzzz{{yyxxyyzzyxxvtq onmlkjkklm k l mmmm m l l k jihhhihhhhggggffghiijjiijkjji hijjkkkkklmmlljiiiiiiijjjklllmnnnmoooopsu{yy|wwxyx wwvutttttssssttuu~~~~~~}||||||||||||||{{{{{}}||{zyxxxxyyyzzyyxwvutsssssss s s rqpnligfffffedccbccccccdda_bhmml l l k j i g ggfffeff g g hijlmnnnnoopqrrsrqponmmmlkkkkmnnp pnnmllllllmn~o}q}q|pnlklnmmnnmlllmnp~onmlkkklmopqponnopppoonlllln~p~s~u~srpomllmmllmoppoooo~o~n~nnnnnnnnnoop~onnnnnopononoppprw|~ ~ ~ } ~ ~ {tolnmjjjjigggffffgfggggggggfggghhhhjj j j k k l lkllmnnoorsuvwwwvzzyyyxxxxxwwwwwwyyyyyyyyyyyyyyyzyyxvtqomlllkllmm¡m¡m¡m m m m m m l ljiihhhiiiiiiiihhiiiijjjjjkkjjijjiijjklkkll k j iijjihhhiiklmmnnnnmoqqpqt|xvzv|v~wxyyz yxwuuuuutttttttt~~~~}}}~~~~~}}|||||||||||||||{{{{}||{zyyxxxxxyyyzyxxxwvutssssssr r srpmkiggffffedccbccccccdcbcgloo mlkj i h g g g gfffff f g ghjlmnoonoopqqrrrqponnnml kjjklmnonmlkkkklllllmnnmljkmoonoonlllllnmlkjjjkmnopqponoppppomlmmlmn~p~s~t~srpnmmmmmllmpqqpoooo~o~o~oonnnmnnnopooonnnnnnoopqrrqsw}~ ~ ~ }~~ ztnmnljijjiggggggggggggggggggggghhhhiihhhijjjkklmnooqrsuvvvvyyxxxxwwwwwwwvvvxxxxxyyyyyyyyyyxxwvusqonlllkllmm m m m m m m m m l lkjiiijiiiiiiiiiijjjiiiiijjjjjiiiiiijjkjjkkkjjjjiihhiiillmnooooooqqrt|vsytzt|u~wyyz {{yxvuuuvuuuutttt~~~~~~~~~~~}}}}}}}}||||||||||||{{{zyyxxwwxxxyyyxxxxxwvvttttsssst spmjhggfffffedcbccccccdcfjnp ponlkjhh g h h h h h h h h g g g h jlnnopoooppqqqqqqponnmk k j j jlmnonljjjjknmlkkkkklkjknoonoonmllkklkkjjjjkkmnpppnnoopponmlmmnno~p~r~s~rqommmmmnmmnprrq~ooo~o~o~o~oonnmmmmnnooooonnmnopqrrsstux|~}}}}}}~ ysnmmkiijjigggggggggffffffffhhhhhhhhgggffgghhijklnoopqqstuvvwwwwvvvvvvvvvvvvwwwwwxxxyyyxxxxwuutsrqonlllkllmmlll l l¡l¡l¡l j kjjiijjjjiiihhhjjkkkjihhiijjjj iihhhhijj i iijjkkkjjjjjjjkmmnoppppqppquxuzpztzu|w}yz{{{| {ywuuuuuuuutttt~~~~~~~~~}}}|||||||||}||{zzyyxxxwwwxxyyyxxxyxxwwvvvvuuttuspmjhggfgfffedcbccccccdeios spnmmljihii j ijj j j j i hi j k lmnnoooooppppqqqqpnnmkkj j j lmmpolj i j k kpomlkjjjlkklnoonnnnnmllklkkkkkllkkmnonmlnoooonnmnnnoo~p~r~r~rqonmmmnnnnnqrr~q}o}o}o}o}o~ooonnmmmnnnnoooo~n~mmpprrssssuvx{~||{{{||} ysnmmkihijiggggggfffffffffffhhhhhhhhgfgffffggghjlmnooopqstuuuuuuvvvvvvvvuuuuvuvvwwwwyxxxwwwvssssrponlllkllmmllll l¡l¡l¡l i i hhhiijjjiiihhhjkllkjhghhiijj j jhhhghi i j¡h¡h hiiklm kkkkkllmnnopqqqqrporwv{p|p|wzx{y}{|| |{|{yvutttuuuutttt~~~~~~~~~~~~~~}||||||}~}{x x x x xxxxvvwwxyyyyxxxxxxxxwwvvuuuut pmjhggfffeeeddcdedccefimrutqnmmlkkkkkkjkkkjj i i h i j lmmmnnnmmmnoooppppoonl k jjj klmqomkjk mnoomlkkklkllmnnooonmmlkkklllllllllllllmmnpoonnnnoonnnnprsq~q~o~nnmnnnnnnopqq~q~q~q~q~p~pppoooonnnnnoo~o~o~n~n~mqqsttuu~t~vv~wxz|~{ zyyz{|} ~wrnmkkkjiihhgggfffffeeeeffffggggghhhhhggfgfffgghikmnnnopqsuvuuuuuuuuuuuuuuuuuuwxxxwwxxyyxvutrpmmnon m mmmmmmmmkll l l k j i h g g f gghihhiiihhgkklmlkjihhhijjkkihhgh h i¡j¡h hijklmmllkklmopppqrrrrrqqru}xs{q{rzvxwzy}{{{{{zzywvuutuuuttuuu~~~~~~~~~~~~~~~~~}}||{||~~|yww w wxxyyvwwwxxyyxxxxxxwwxwwvvuuuus pmjhggfffeedddddedccefnqtuspnnmlkkkkkkkkllkk j j i j k lmmmmmlkk k lmnoopppoonl l k j j k lmqpnlkl mnonmkjkkklllmnnnonnmlkkkkllllllllllllmmnnpoonnnoo~o~n~nnopq~r~q}p}p~o~n~n~n~m~mmmnnopq~q~q~q~p~p~pppoooonnnnnnoo~p~p~p~p~sstuvvwwww~w~wxz|}xxxyz|}~ {tnlkjjjjiihhggggggffeeeffffffffggggghhhhhggggghiiklmmmnoqrtuvvvvvvvvtttttttttuvxyyxxxxxxwusrnmjjkll k llmnnmmlkkkkkkjjihg f f ghhiijjjihhkkllkkihhhhiijjjhhhhhi i ihhijkkklmmllmnopqqrrrrqqpqsvvzp{q{tyvwwzy}zzzzyyyyxwvuuvuuutuuu~~~~~~~~~~~}}~~~~~~~~|||~}{xwww wxxyywwwwxxxyxxxxwwwwxwwvvuuuts qnkigggfffeddcdddcccfhrt utqonn m l k k k k k k kkllkk j j i j j k llllkk j j j j k lnoooooonml k j j k llqqon m mnonnlkjjkkllmmnnnnmmlkkkkkllllllllmmmnnnnnppoonoo~o~oooooo~p~p}p}p}p~o~o~n~m~m~mmmmnnppp~p~p~p}p}p~ppppoonnnnmnnopq~r~s~u~u~u~u~vwxxyy~x~xxy{{xxyz{}~}vokjkiiiihhhhhhhhhgggfffffffffffgggggiiiiiiiiijjkllmmmmnnoqrsuuuuuuuussssssssttvwxxxwwwwut r¡o nkigghij iklmnnnmlllkkkkkkkji h gghijjjkjjjijkkkkjhggg h h h hhhhhhiiiiihhiijjjjlkkklmnpppqqqqppoqu|zs}p}r{uxvxvzx~yyyyxxxxxwwwwwwvuuuuu~~~~~~~}}}}}}}}~~~~~~~~~~~~~}}}~{xxxx xxxxxwwwxxxxxxxwwwwwwxwwvvuuuts qnljhgggffedccccdccdhktu uspnnn m l k k k k k k jkkkjj i i h h i j j j jjj j ihhij k nnnooooomlk j j j k lrqpo n nnonmlkjjjklmmmnnnnnmmlllllmmmmmmmmmmnoooonqpopoo~o~p~ooppooo~o~p~p~p~ponmllllmmoopo~o~o}o}p}p}p~p~ppoonnnnm~mnnprt~u}u}u}u}u~u~wxy{z~z}y~yyz{yyz|} ~{sljjlhhhhhhhhhhhhhhhhgggfffffggghhhhhiiiijjjjllmnnnnnnnnnnoppssssssssssssssssstuvvvuuuutsq o ljjhffghhhjkmnonmlnmmllmmnml k iiiijkkklkkjjjkkkjigghh g g g ggfghhiiihhhhhiiiiijiiijklmmnooppooprx|}urt}vyvyv|wxxxwwwwwxxxxxxwvvuuuv~~~~~~~~~~~}}}}}}}}|}}}~~~~~~~~~~~~~~~~~~}|{yy yxxxxxxxxxxxyyyxxxwwwwxxwwvuuusr pnljiiiigfedbbbdedcekouutrqonn m m l k j j j j jj j i i i h hh h h h h h i j jiiii i jkmnnopqqplkj j j k l msqon m m nonmkjjjkkkkmmnooonnnnnnoooopppoonmmmnpqonnopqq}p}o~opqrqonnoooooonnmkmmoppponnop~p~q~ppppponnnnnnnno~q~r~s}u}u}t}t~uvwy{~{{{{zzz{{{|~ztolkjiiihggghhggggggggggffffggjjkkkjjjllllmmnnoooooppppooononnpppqqrrrqqqqqqqqsrssssssutrpnljjiihhgghhjl m l kjklnmmlmmno n m l¡j iijjmmmlllkkkjjihhiijjiihhgghhiiiihhiiijjjjjiiiijklmmmmnnopqruy}spsw|v{w}xyxwvvvvuuvvyzyyxwvvxz~~~~~~~~~~~~~~}}}}}}}}}~~~~~~~~~~~~~~~~~|{yy yyxxxxwwxxxxxxyyxxxwwwxwwvvuuusr pnlkjjihggedcbccdcdglpt ssrqpoo n m l k j j j j jj j j i i h hhgggghijjiiii j jkmnnoppppmlkk k lmnsron mm mnnmlkkkklklmnnooooonnopqrrrrrrqqpnmlmnonllmnpp}p|o}onprqpoopooooonmmklnnooonnnop~p~p~ppqpppoonnoonop~q~r~s}t}t}s}s~s~tuvx~x~yyzzzz{|}}|{vpljjjjiihggghhhhhhhhhhfggghijjkllmmmmmooooopppooopqrrrqqqppooooopppqqqooppppqqppppqrttutqomlkjjjjiiijjlm n¡m kijkmmmlmmmmm m k j jijjmmllkkkjkkjjiijjjjjjjihhhiiiiihhiiijjkkkkkkkklmmmmmnnpqruw{|t qqsvwxyyxwvvuuuuvyzxxyyxz}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~}~}{ww xyyyyyxxxxxxyyyyyxxxwwwwwvvuuusr pnmlkkhhggedccdcbcfknpq q qqppo o n n m l k j j j kk k j i i h hggggghiiiiiii j kkmnnooooonmlllmnosromllm m nmmlllmmlmmnoooooonnoqsttttttsrrpnllmnlkklnop~p|o}o~noqqpopqo~o~o~oonmljkmnnnmmnnop~p~p~poqqqpppppooopq~r~s~t}t}t}s}s}s~s~s~su}u}v~w~x~xyyz||zyxsnjiijiiihggghhhhhhhhhhhijklnnnmnopppppqqqrrqqqppqrrsttrrrrqpppppppppppnnnnoooonnmmoqrtusqonnnnnnmllllmnn o¡n¡k jjkllll l l kklkkjjjjjmllk jjjikjjjijjjjkkkkkiiijjjiihhhhijkllmlmmnnnnnllmnoqrsyy||wtqpuvwxxxwvvuuuuvyzy{ {|| ~ ~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~}}~}{uv xyzzyyyyyyyyzzyyyyxxxwwwvvuuuusrponmmmhhgfedccfb`bhmopo o ooooo o n n m l k k k k ll k j j i h hhgggghhihhhii j klmnnoooonnnmmmnnosromlllm nnnnnnnnmmnnooooonmmnqtuvuuuutsrqommmmlklmnppp~o~oopqqooopo~o~o~onmlljklmmmllooop~p~p~ooq~q~qqqpppooppq~r~t~t}t}t}t}t}t}t~s~s~t}t}u}u}v}v}w~w~z}}{zxwsmihiiiiihggghhhhhhhhhhlmnopqqqnoprrrssrrrrrrrrrrrssttuttssrqqpqqqqqqqqoonmmmllmmllmoqstsqppqqsrrqponnnmn n¡n¡k jklklll l k k jkkkjjjiimll kjiihjiiiiijjjklmmlkjjjjjjihghhijkmmnnnooooonllmnoqstz{}|ywsottvwwvvuwvuuuvyz} ~~~~ ~~~~~~~~~~}}}~~}|}{vv w yyzyyyyyyzzzz{zzyyxxxvvvvvuuttsqpnnmmjihgfedcdbacgmprq p n n m m n n n n m l k k k k ml l k j i h hhgggghiihhii j lmmmnnnnnnnmmmm m nnosrpn l l l llmnnooooonnnnnonnmkkloruuuttsrrqppnnmmmmnmmmnoopopppppono~o~onmljikkkllmmmp~o~o~o~o~o~o~o~ppp~q~q~q}p}p}ppqrsstt~u~u~u~t~t~s}s}s}r~t}u|u|u|v}w~xy}~}{yxwrpnkihhihhhhhhhhhhhghijjnoqrrrrqqqrtttttttttttttttssssttttttssrqqrrrrqqpqpnmlkjjlkkkkmnorqoooopqqq q q omkjllm¡m¡m mllmmlll l l l j kkklkkjlmmlljiijjiiihhhjjlmmlkkiiijjiihjjklmmnnnopqqqponnmnoqtuy}{xvurrrsuvwwwxvuuwy|~~~~~~~~~~~}~~~~ }}}}x xxyyzyyyyyyzzzzzzzyyxxwvvvvvuutts qonmllkjjigfedcb`bgkopp o n n m m n n n m l l k k k k lk k j i h g gffeeefggghhi j k mnn nnnnnnnnmm n n n optsqnm k kkklnnopppooonnnnnnmkklortttssrqqqponnmlllmmmmnnopoppppponnnnnmljjkklllmmmnnnnnmmmnno~p~p~p}p}p}qqrrss~t~t~t~t~t~t~s~s}s}s}r~t}u}u|u}u}w~xz~}|zxwvrpnkjiiihhhhhhhhhhhijkkloprrssrrsstuuvvvuuuuuuuuttsssstttttttsrrqrrrrrqqqponmlkkkkjjjklmonnnnnopppp o n mkjllm m¡m mllmmllllllkkkllkkjlllllkjjjjjjiiiijjkkkkkjhiijjjiijkklmnoooopqqpoonnnnqsuw||yxwutrrsstuvwvvvwz}~~~~~~~~~~~~~~~~~~~}}~{{zzzyzzyyyyzzzzzzyyxxwwvvwwvuuut s q omllkkkkjhgecca`bfjlnonnn n n nmn m l k j j j k kj j i h g g ffedddddeffghi k m n n nnnnnnnnn n nnn o ptsqonlkjllnopppqpoonnnnmnmkjknqsssrrqppoponmlkkklllmmnopoppppponmmmmlkjjmmmmmmmmnnmmmmmmmno~p~p~q}q}q}r~r~r~r~s~t~t~t~t~t~t~t~t~t}t}t}s}t}v}w}v~v~x~y~{~ |zyvutrpomkjjjiiihhhggghijlmnnpqrtuuttuuuuvvvwvvuuuuvvttssssttttuuuttsqrrssrrrqponnmmmnmljjkllmmmmnnoomnm m m l l klm m n n mmlmmllllllkllllkkjkkkklllmkkkkjjjijjjjjjjihijjjkjjjklmnoppppppppoonnopruxz|yxwxwvttssstuuuvx{} ~~~~~~~~~~~~~~~~~~~}}~}}|zzyzzyyyyzzzzzzyyxwwwvvwwvvvut s q o nlkkkkkjhfdcbaabfikkmmmn n nmmmmlkjjjjjj i h g f f ffeedddddeffgik l m m m nnnnnnmm m mmm n orrqpnmlkmnnopppppponnnnmnmkjkmpssrqqpoooponmkjjjkkllmnopoppppponkllllkkjmmmmmnnnmmmnmmmmmno~p~q~r}s}s}r}r}s}s}s~t~t~t~v~v~v~v~v~v}v}v}u}v}x~x~x~x~y~{~{~}|ywutsqponlkkjiiihhgggfhjlnoopqrsuvvvuvuuuuvvvvvvvvuuuttsssstttuuuuuttqrrssssrqqpoonooqpommlmmlmmnoppp l l l l l lllm m m n n nmmmmllllllllmmlkkjkkkklmmnllkkkjjjjiiiiihhhijjkkkjjklmnopqqpppoooonoopswz |}{xwxxwwwvutttuuvwz} ~ ~~ ~~~~~~~~~~~~~~~~~~~~~~~~}}}~||zzzzyzz{{{zz{zyxwwwwxxxxwvuur r r qomlkllkjhfecbbcdfhijkklmmm m m kkjjjiii hhhhggffdddccddddeefghii l l mnnnnnll l kll m moppomll m mnnooonnnooonnlkmlkklnprsrqooooponnmlkjjlllmmmmmn~n~ooooonmmlllllllllmmmmmmmnooooooop~q~r~t}u}v}s}s}s~s~tuv~w~x~x~x~x~x~x~x~x~y~z~z~z~z{{{{~}{yvuttqponmlkjjjjiihhhfimppqrsssttuvvuvuuuuuvvvvvvvvuuuttssttuuuuuuuttqqqqrrrrrqqpppqqqqrsrqpoklmoqqomhijkllkkm m l l l l l l m mmmmmllmmmmllllkkjjjjkkjjjkkkkkkjihgghhhiijjjjjjkklmnnopoonnnooopqqsw|z zyyxyyyxwwvuuttvy~ }| {{~~~~~~~~}}|{{{zz{{{zzyzyyxwwwxwwxwwvuus s s r qomlllkihfedbccdfghijjklll l l jjjjiihhgggggfedcccbbccdddeffghhj k k l mmlllk k kkl m mopqpnll m mmnnnnnmooponnlklkkklnprrqponooponnnmlkklllklllmn~n~ooooon~onmllkkkkkkllmmmoppqqqqqqqq~r~r}t}u}v}u}u}u~u~v~w~x~y}y}y}y}y}y}y}y}y}z~{~{~{~{{{{}~}{xvusspoonmllkkkkjihhhhknpqqrssttuuuuuuuuuuuuuvuuuuuuuuttttttuuuuuuuttqqqqrrrrrqqqqrrsrrsssrqqmllmnnljghjkkkjjkk k j¡k j j j k klmnnnnnnnnmmmlkkjjjjkkjjjjjjjjjjiihhhhhhhiijjjlllmmnmnonnnooopoprsuy~zzyxxxyywwwvvuuuw{ ~ |zyx~~~~}}||}}}}}|||z{{{{zyyyxxwwwwxwwwwvvuuttss qpnnmljigfedcccdffhiijjkll k k jiiihhhgffffeddccbbaabbcccdefgggi j j k k k kkkj j kkl m mopqqnml m m mnnmmlloopponlklkkklnoooooooooonnnnnmmmmlkjjjkloopppoon~onnmllllllkllmoottuuuutt~s~s~s~s}t}u}v}w|w}w}w~w~w~x}y}y}z|z|z}z}z}{~{~{~|~|~|~|~||||} |zxutsroonnnmllkkkkjjjikmpqrrsttutuuuuuvvvvvvvvuuuuttttuuttttuuuuuuvuutrrrrrrrrqqqqqrstssssssrrqomlmljhijjkkjiijj j j i i i i i jkmnnnnnnnnmmmlk k j j jjkkjjjjiiiijjjjjjiiiiiiikklnnnnmmmmnnoppqqqoqsux{~zzyxxxxxwwwwwwwvx| |yxwv~~~~~}|||{|||||{{{{{{{zyxyxxwwwwxwwwwvuutsssrqpnnmljhgfeeccddfgghiijkkk k k iihhhhggeeeedcbbbaa``aabcccdefgghhi j j j j j jj j jkl m noprrom l m m m m m mllknnopponmmmllllmmnnnnoooonnnnnnnnmlkjijkloppppoonn~nmmmmmmnmmmmoqrvwwxwwv~v~v~v~v~v}v}w|x|x|w}w}w~w~w}x}y|y|y}y}y~z~z~{{{}~}~}~}~||||}|ywusrrnnnnmmmmjjkkkkkkmoqrrrtuuuuuuuuuvvvvvvvvuuttttttuuuttuuuuvvvuvutsssrrrrrpppqrsttttttttttvspnmljhkkkllkjijjj j j i ii jjkmmm n nnmmmllll k k j j j jkkkjjiihhgjjkkkjjijjjjjlmnpponnmmlmnopqrrqoqtwy }| {zyxwwwwwwwwwwwxx{~ }{ywvv~~~~~~~}}||{||||{{{|{{{zyyyy y x xx w wwwwvvvuuussssr ponnmkhfeddccdefggghhijjjjiiiihhgfeeedccbaaa```_```aaabcegghhhhhhhii i i j j k l morttq nl kk l l l mmmlnnnooonnonmkkjklmmmnnoppnooppoonnmmllllmppppppppmmmllmnnnnnoprstyyyyyyyyyxx~w}w}w|x|x|w}w}w~w~w~w}w|w|w~v~vwwyz~|~{}|}}}}}|}|~}~}{xvsrqqnnnnmmlljjiijkmnppqrstuuuuuuuuuuvvvvvvvvuutuutuuuuuttuuuvvvvuuuuuttsrrrrrqqqrrstuuuuuuuuvutrpnllmmmlk j i hjj k k l kkk j j k k llmmnmmmmmmm k k k j j j j jkkjihhhhjjklllkklkkjjkllnnnmmmmmmnoqqrqqpqtx|}y zzyyyxxxxwwvvwwxyz{|}~}zwvvwx~~~~~~}}}||||||{{{{{{zyyyyy x xxww w vwwvvuuuttttsr qponnkigedcccdefggggghhhhhhhhhhgfddddccbaa```______``abcefggggggggfihii j k l m oqstq nm lllllmmmmnnnoonnnonmlkkklmmmnnoppoppqqppoonnmmlmmpppppqqqmmlllmnnoopqrstuyyyyyyyyyx~x~w}w}w|w|w}w}w}v}v~u}u}u|t|v}u~u~uvw~y~z}y|z|||||{|{}|~~~|zxurqppnnnmmllljjjjlmopqqqrstuuuuuuuuuuuuvvvvvvvuuuuuuvuuuuuuuuvvvuuuuuvutsrrrsrrrrrsstuuuuuuuuuutsrqppnnmlji¡h gkl l m¡m mll j j jkllmmnnnmmmlkkkkkkjjjjjiiiijjjjklllkklkkjjjkkllllllllmnopqqppoquy~| zzzyyyxxxxxwwwxxyyz{{|}}~zywvvvxy~~~}}}~~~~~~~~}}}}}|||{{{zzzzyyxxx xxxwwwv vvvvvvutssssrr q ponnljhfdcccdefgggggggfggggggfedccccbba`____^^^__```abcdfffffffeeeggghij l m n pstr po onmmmmmnoponnnnnnoonmmlllmmmnnoppqqqrrqqqppnnmmmmnoopqrrrpoonnnooqrsstuuuwwwwwwwwww~w}w|v|v|u|u|u|t|t}s}s}s}s|s|t}s}s}s~s~u}v}w}w|y|z|z|z|z||}}~|zwtqonnnnnmmllklllmnoppqrrstuuvuuuuuuuuuuuuvvvvvvvuuuvvuuvvvvvvvvvuuuuuuuttssssssssssssuuuuuuuuuuuttsssqpomkihgmmn n n mmlkkkllmmnnnnnnlkjkklllkjjjiiiijjkjjklllkklkkjjjjjjjkkklllnnoppponnqu{| zzzyyyxxxxxxxxyyzzzzz{{{{uuuvwxyz~~~}}}}~~~~~~~~~}}}}}||||{{zzzzyyxxw w xxwwwvv v uuvvvutrqqqqqp oonnmkifdcccdefggghggfffggfffedcbabbaa`___^^^^^__````acdfffffffeeeggghijl l m ostr qp p nnmmmnooppnnnnnnooonnmllmmmnnoppqrrrrrrqqponnmmmnnopqsttutsrqqpptuuuuutsuuuuutttu~u~u}u|u|t|r|r|r|r|q|r}r}r}s}s}s|r|r}r}r}s}t|u|u}w}x}y|y}z}|~}~zyvspnmmnmmmllkknnooopporrsttuvvuuuuuuuuuuuuuuvvvvuvuvvvvvuuuuuuvvvuuuuuuvutsssssttuutssuuuuuuuuutuutttttsqnljihmmm m m mllmmmnnooonnonmljijklmmljikkjiiijjjjklllkklkkjiiijjjkkllmmmnooonmmlou{ | { zzyyyxxxxxxxyyz{zzzzzyyyrsuwyz{|~~~~~~~~~~~~~~~~~}}}|||{zyyxyxxxww w w x x wwvvv v t u vvvtrpqppp o oonqpnkifdcddeeffggggffffeeeedcba``aa```___^]]]^^___`abceffffffffffhhhhijkklo q rpo o ooonnnnoooooonnnnooooonmmmmnnooppqrrrrrrspponnmnnnnnoprssvvuttsssuvvuutssssss~s~r~r~q~s}s}t}t|s|r|r|q|q|q|q|q|r|r}r}r}s}r}r~q~q~r~r}r}r~s~t~u}w}y}{}|}yxuspnmmmmlllllmoopqrrqqrrsstuvvvvvvvvvvuuuuuuuuvvuuvvvvwvuuuuuuvvvuuuuuuuuuttttttttttttttttttttttuuttssssrqomlkmml kklmm m m noooo onnnnmllkjkkkkkjikkjjjjjjkkjkkklllkkkkkkllllllllllnonnmmnnqv|| |{{zzzyyyzzz{{{{{{zxyzywvpqswz|~~~~~~~~~~~~~~}}}|||{zyxxyxxxww w w w w wvvuu u u u v v u t r q q q q p p poorrpmkhedddeefffggfffeeddddccba``a```__^^^]]]]^____`acdeeeeeeeeeeffgghijkknq qpn n onnnnnnnnpppoonnnooppoonnnnnnooppqqqrrrrrpoonnnnnonnopqrruuuuuuuuuuuuutssrs~s~s}s}s}r~r~r}s}s}s}s}r}q}q}q}q}q}q}q}q}q}q}r}q~q~qqq~r~s}s~s~t~u~v}y}z}{}{ywsqonnllllllmmopqrsssrrsstuuuuvvvvvvvvuuuuuuuuuuvvvvvvwvuuuuuuuuuuuuuuuuuuuttttttttttttttttttttuuuuttstssrqpnmmmkkkkl m n n ooppppnnnnnmlkjjjjjiihlkkjjjiikj j j j jjjkjjjjjkklllllllllmpponoppsw|~| |{{{zzyyyzzzzz{{{{yyyzzxvoprux|~~~~~~~~~~~~~~}}}||{zyyxxyxxxww w w w v vvvuu u u u u u tsrqrrrqqpppssrpmjhfeeeeffffgffeddccccbba``_```__^^]^]]]]]^^^^_`bcddddddddddddeefhijjmo p onn n o nnnnnno qqpppoooppppponnnnnnooooppqqqqqqonnnnnnnooooopqqrsstuvvvuuuuut~s~s~r}s}s|t|t|s}s}s}r}r}r}r}r~q~q~p~q~q~q~q~q}p}p}p}p~p~ppqqr~s~ttu~v~v}x}y}z|ywsomkkkkkkklmnnqqstuuuuttttuuuuvvvvvvvvvvvvvvvvvvvvvvvwwvuuuuuuvvvvvvvvvvuuuuttuuuuuuuuuuuuuuuuuuvvvuttttttssrqonmlllmnoppqppponnnnnmlljjiihhiikkkjjjjj k k j¡i i i i i j j iiiijjkkkkkkkkmorrrrsutvy}}|||{{zyyxxyyzzzzzz{yyyzzywqqqsuy|~ ~~}~~~~~~~~~~~~~~}}}||{zyxxwyxxxww w w v v vvvvv v u u uttsrqrrrqqqqpu utroligeeefffffffeedcbbbbaa``______^^]]^^]\\]]^]]^_abccccccccccccddfghiiln p onnn p poooopp qqqpppooppppponnnnnnoooopppppqqqnnnnnmnnpooooopppqrstuvv~uu~u~u~u~t~s~s}r|s|s|t|t|t}t}s}q}r}r~r~q~q~ppppp~p~p~p~o}o}o~o~oopqr~s~tuu~u~v}w}y}y}ywrnkjjjkkkklmnoqstvvwvvuuuuuuuuvvvvvvvvvvvvvvvvvvvvvwwwwvuuuuuuvvvvvvvvvvvvuuuuuuuuuuuuvvvvvvvvvvvvvvuuuuuuuutsrqponooprrr qpoonnnnnn m l l kjjiiijjjjjjjkkkll k j i iii¡i i h hhhiikkkkkkkkortuuuwyxy|| {{||{zyyxxyyyzzzzzzyyy{{ywutrrsvx{ ~~~~~}~~~~~~~~~}}}}||{yxxwwwwvvv v v vvvvvvvv v uuutsrrqrrqpppqqt t tsqnjiggffeeeefeedccbbba``______^^]]\\^^]]\]]]]]^^_`aaaaaaaabbcccdffhiklnp q pnmopqrrrrrsrrqppoooooooonnnnnnooooooopppppnnnnnmmmnnnoppppopqrstt~t}t~t~t~t}t}t}t}t}s|s|r|r}r~r~qqp~p~p~p~p~q~q~p~ooooo~o~o~p~pon~n~o~q~r~t~t}t}t}u}v}w}x}y}yupljjjjkllkklorttuvwwwwvvvvvuuuvvvvvwwwwwvvvvvuuuuuuuuuvvuuuuuuwwwvvvvvwvvvvuuuuuuuuuuuuuuuuuuuvvwwwwvvuuuuuuvuttssrrrrtsrqpppqooo n n m ml j jkkjjihiiijjjkkkkjji h h h i iiiiiijmlkjklmnuvwyz{|||}~ |z{zzyyyyzzzzzzzzzzzzzyyyyxwtrqrtu ~~~~~}}}~~~~~~~~~}}}}|{yyxxxwwvv v u uuuuuuuuu u uuutsrqqrqqpppqqs t u uspmkihgffeeefeeedcccbba``__`___^]]\\^^]]\]]]^^^^^_`aa````aabcccdfghijlnp q ponqqrssssssrrqppoooonnnnnnmmnnnnnnoooooooonnnnmmmmmnnoppqpopqqrrr~q}r~r~r~r~r~r~r~r~q~q~q~qppoon~n~n~o~o~o~o~o~nnnoo~o~o~o~ppp~p~q~r~s~t~t~t~t~t~u~v~w~x~yuokjjkkllllkmpruuvwwwwwwvvvvvvvvvvvvvvwwwvvvvuuuuuuuuuuuuuuuuuuwvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuvvwwwwvvuuuuuuuutttsssrrsrqooopppoon mlll j kkkjiihhhhiiijjkkjiihhgiiiiijjjlllmnpqryy{}~~ } {yzzyyyyyzzzzzzzzzzzzzyyyyyxvtssst ~~~~~~}}}}~~~~~~~~~~~~}}}||{zyyyywwv v v uuuuuuuuuu u vuutsrqqqpppppqqs tvw v somjihgfffffffeeeddccba`````___^^]]^^]]\]]]_^^^^^______``abcccdfghijkmo p ppprrsttttssrrqppoonnnnmmmmmmmnmmnnnnnnnnnnmmmmmmmmmnnpqqqqqqqqqpoop~p~p~ppppppooonnnnm~m~m~n~n~n~n~n~n~n~n~n~nooopqq~r~r~s~t~t~t~t~t~t~u~u~v~w~zuokjklllmmllmpsvwxxxxxxwwwwvvvvuuvvvvvvvvvvvvvvuuuuuuuuvvvvvvvvvvvvvvuuvvvuuuuuuuuuuuuuuuuuuuuuvvvwwvvvsstttuuuututtssstrpnnopqpon l kkkk k k kkjihhhhhiiijjkkkjjiiiiiijjjjjklnpruwx}~ } {yyyyxxyyzzzzzzzzzzzzzzzzzyyxwvuts ~~~~~~~}}}}}}~~~~~~~~~~~}}}}~~~~}}|||{zyyyyww v v vuuuuuuuuuu u uutsrqqpppooopqqs uwxxuqokjhgfffeffffffeeccbaa``a```__^^^^^]]\]]]__^^]^^^_____`aacccdfghijkmo p pqqrrsttssssrrqppoonnnmmmmmnnnnnnnnnnnmmmmmmmmmmmmmmnnpqrrrrrrrqonno~oooooooooonnnnnn~n~n~n~n~n~n~n~n~n~n~n~nnnoqqr~s~s~t~t~u~u~u~u~u~u~v~w~x~zuokjkmnmmnmmnqtwxyyyyxxwwwwwvvvvuvuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuvuuvvuuutuuuuuuuuuuuuuvvvvvuusssttuttuuuuttttusqoooqr p¡o¡m¡l j j kk k k k kjihgiiijjjkklllkkkjkijjjjjjjjlnrvy{} ~{yyxxxxyyzzzzzzzzzzzzzz{{{xxyyywvu ~~~~~~~~~~~}}}}~~~~~~~~}||}}~~~~~~}|||{yyxwv v v vvuuuuuuuuu u u t u u u t s r r qppopqr s uuwxxv t sokhfffedfffeeeffdddccbbbaa``______^^^^^^__^^^^^______```abceffgghilo q rrqssssrrrrrqqppoonnnnmmmmmnnnnnnnonnnmlllllmmmmmmmmnnoqrsttturoonopppooooopooonnnn~n~n~n~n~n~n~n~nnnn~n~n~n~n~n~pqq~r~r~s~s~s~u~uuuvvw~w~~zvpllmnnmnnmlnruvwyzzzyxwwwwwwvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuvvvvvvvvttttuuuuvvuuuuuuuuvvvvuursssttttvvuuuuuuuttsrqqq¡n¡m¡k¡j¡i jkkkkj ihhhh jjjjjkk kkllllkkj h jklmlkkilpvz~ }zxxxyyyzzzzzzzzzzzzzzzzzzzzyyyyzz ~~~~~~~~~~~~~~}|{ { { |~~~~~~}}|{zyxwvu v v vvvvuuuuuuu u u tttttsrqqppqrrs tuvwxxvu t qnkhhhgfggfeeeffeddddcccba``______________^^^^^______```bcdefffffhknq rrrsssssrrrrqqppoonnnnnnnnnnnnnnoooonnmlllmmmmmmmnnnnoprsttuutronoqp~pooooooooonnn~n~n~m~n~n~n~n~oooooo~o~o~o~o~o~p~p~p~q~q~r}r}r}s~s~tuuvv~v~|}xrnmmnnnnnmmoruvwyzzzyywwwwwwvvwwwvvvuuvuuuuvvvuuuuuuuuuuvvvvuuvvvuuuuvwvvvvvvvuuuuuuuuvvvvuuuuuvvvvuuurrsttuuuuuuuuuuttttsrrqpml jihijjjii hgggh jjjjjjkkllllkjji g hjkmmmmjmrx| ~{yyyyyyyyzzzzzzzzzzzzzzzz{zzyyzz{~}| {z{|~~~~~||{yxwvuu u v wwwvvuuuuuuttsstssrqqppqrstu vvwwwwvvuspmkkkhgggfeeeffffeeedddcba``````````````__^^^^_````aaabcddeffeeegjnq stttttssrrrrqqppoonnnnnnnnnmmnnnooponnmmmnnmmnnnnnnoopqstuuvuspmmoqo~o~ooooppmnnn~n~n~n~o~m~n~n~nnoooooo~o~o~o~o~o~nooppqq~r~q~q~rstuuuzzsnmlllmnnmlnruvwyz{{zzwwwwwwvvwwwwvvvvvvvuuuuvuuuuuuuuuuvvvvuuvuuuuvvvwwwwvvvvuuvvvvvvvvvvvvuuvvvvvvvussttuuuuuuuutttttuuttrqpnljhgghiihhg ghii jjjjjjjjkkkkkj j j g hijlmmnjnsy~ ~zzzzyyyyzzzzzzzzzzzzzzzzzzyyyyzz~~|{{| ~~~~~~~~~||{ywvuuv v v wwwwvuuuuutttssssrqqppprstvv wwwwwwwvvsqomlkigfgfeeefffffffeeeccba````````aaaaba``__``aabbbcccddeefeeddfjnr tuuuuttsrrrrqqppoonnnnnnnnnmnnnnoppoonnnnnnnnnnooooopqrttuvutqnkkn~q~o~o~ooopppmm~m~m~n~n~o~o~o~ononnnnooo~o~o~o~o~o~nnnooppqppqrsttuyzsnlkkklmlkkmqtvwyz{{{zwwwwwwvvxxwwvvvvvvvvvuuuvvvvvvvvuuvvvvuuuuuuvvvvwwwwwvvvvvvvwwwwvvvvvvvvvvvwvvuuuuuuuuuuuuuttttttuuutsqpnmkihhijiihh iijjjjjjiiiiijkkkk k k i ijjklmmjmsy~ |{{zzyxxzzzzzzzzzzzzzzzzyyxxxxyy~}}~~ ~~ }| z{~~~~~}}}}|{zxwvvuw w vvvvvvtuuuututsssrrqqqqrstvv wwxxxxxxxxutqnljjiggffffffgfffeeeebbbbaaaabbaaaaaabaa````accccccccdddeeffffgjmptvxwwvuuttssrrqponnmmmmnnnnnnnnnooonnnnnnnnppppppppqrrsttuuusolklnoo~o~opppqqmljkno~p}p|p~p~oonnnnnnopppoonnnnooopopqpppru~~{upmkkjlllkjlpsvwyz|||{yxwwvvwwxxxwwvvvvvwwvvuuvvvvvvvvuuvvvvuuuuvvvvvvwwwwvvvvvvwwwwwwxwwvvwwxvwwwwvuuvvvvuuutttttttuttuvwvusqsqomljjjhhhiiihh iiiiiiiiijjkllkkjjjkklllkmqw~}||zyyyyyyzzzzzz{{{{{zzzxxwwwwxx~~~~ |{{}~~}}}||{{yxwvvvv vutttttttuuuuttssssrrrqrsuvw w xxxxxxxxxxwuroljiiggffeeffffffeeddbbbbbbbbcccccbbbbbaaaaaabbbcccccdddefffgfgimqu wxyxxxwwvvvutsrqppmmmmmmmmmmmnnnnnnnnnnoooppppqqrrttttuu~u~u~tspnmmopq~q~ppppppnlklno~p~o~oooonnnnmmnnnnnnnnnnooopopqpopru}}ztokjjjlllkkmqtwxy{||{{yyxwwvwwxxwwwvvvvvwwwvuuuuuuuuuuuuuuuuuuvvvvvvvwwwwwvvvvwwwwwwxxxwwvvwwxwwwwwwwwvvuuuuuuttttuuuuuvvwvutsvvtrpnkjiihhhhhhhhiiijjjhijkkll lkkkllmmmlnqx }}|{zyyyyyzzzzzz{{{zzzzzyxxwwxxy~~~~~~||}~~}}|||{zyxwvvvvuutsssstttuutttssssssrr ttuv w w x xyyyyyyyyywt pmjihggfeeeeefffeedddbbbbbbccddccccccbbccbbaaabbbbcccddeeffggfgjmqt wxyyyyyyyyyxwvutsspppooonnnnnnnmnnnnnooopppppqqsuuwvvu~t}u|u|u}srqpoppqq~q~qpoonnnmlmooonoooooooommlllmmmnnnnooopopqpopru|} ztnjiijkllllnrvxyz{||{{zyyxwwwwwwwvvvvvvvwwwwvvvvvvvvvvvvvvvvvvvvvvwwwwvvvvwwwwwwwwxxxxxwwvvwwxxwwwvvvwuvvuuuuuuuuuuuuvvvwwwvuuyyyxuqmkjjhhghhiiiiiijjjiiijjkkkkkkllmmmnory ~~}|{zyyyyyzzzzzzzzzzzzyyyyxxxxyy~~~~~}}~~ }||~~~}|||{{zyxwww w wvuttssssttuuttsssss s s s s s t u v v w w v yyyyyyyy{yu qmjhgggfeddddffeeedddbbbbbcccccccccbbbcccccbaaaabbbccdeeffggghhknps uvyyyyzzzz{zzyxvvuttsssrrqrqqoonmmnnnooppppppqrtvxxwut}s}s}t~tr~r~rqqqqqq~q~ponmlkonm~n~o~onnnnnnoooommlllmmnnnnnooopopqpopru{~ztnjijkklllmotwxyz|||{{{zyxwwvwvvvvvvvvvvwwwwwvwwwwwwwwvvvvvvvvvvvwwwwwvvvvwwwwwwwxxxxxxwwvvwwxxxvuutttuuuuuuuuuuvvuvvvvvwwwvvvyz{{xtolkjh g¡g g hijjjiiihhkjjiijjjjkkkklllnosy ~}|{zzyyyyzzzzzzzzzzzyyyyyxxxxyy~~}}~~~~~~~~~}}}}~~}||}~~~}}|{{{{zzyxwwvvuuutssrttttttttttttt s sstuuvv w w x yyyyyyyyyxwu pmiggffedccbdddddcccaaaaabccccbbbccddddccccbaaaabcdeeeffggghijkmo r u v xxyz{{{{{{{zzyyywwwvuuttuutsqpo n oopppqqqqqqsvxxxwusr~r~s~rqqqqqq~q~q}q}r~r~qonmlkm~m~mmmnnnmmmmmmnnnmmlllmmnnnnooppoooo~prtuz~{upljjjllklnqtvyyz{{{{{zzyyxxwwwwwwvvvvvvwwwwwwxxxwwvvvvvvvvvvvwwwwwvvvvvvvvvwwxxxxxxxxwwwwvvvvxwvuutttttttttuuuvvuuuuuvvvvvvwxxy{|zvroml j¡h¡g¡g hikjihhhhhjjjkkkkkjllljjjloquz}|{zzzzzzzzzzz{zyyxxxyyxxwwwwx ~~~~~~}||~~~~|||~~~~}||{{{zzyyxwwvvvuutssrssssssssttttt t ttuuvvwwx x zzyyyyyyyyywtoliggfedccbcccbbcccbbbbbccdccccccddedddccbbbbbbcdeffffggghhhijloqs u vwxyz{{{zzzzyyyyxxxxwwvvwwvvutrrqqqrrrssuttvxyyxvtqqrrrqppppq~q~q~q~rqponmmlllllllllmmmlllllmmllllmmnnnnopppnnnprsuvy~{wrnlkkkkklnqtvyyz{{{{{zzzyyyxxxxwwwvvvwwwwwwxxxxwwwvvvvvvvvvvvvvvvvvuuvvvuvvwwxxxxxxxxwwwwvvvvxwvuutttuttttuuuuuuuuuuuuuuuuvwwvwyzzwtrnlj¡h¡g hijkjihhhhhjjjjkkkkklmljiijoruz~}|{{{{{{zzzzzzzyyxxyyyxxwwwwx~ }~~ ~ ~~~~~ ~}}~~}||}~~~}||{{{zyyxwwvvvvuuutssssssssssstttt u uuuvvvwxxxzzzzyyyyyzzywrolhhgfeccbbbbcbccccccccddeeeddddeefeeddcbbcbcccdffgggghhhhiijkmopq tuvxyz{{yyyyyyyyxxxxxyyyyyyyyxwvuuuuuvvvyxxz{{zxurppqrqpooop~p~p~p~pqpponnnmkkkkkkkklllkkkjjlllkllmmnnnooppqnoprsuvww~}}yurommkkklnquvyyz{{{{{{zzzzyyyyxxwwvvvwwwwxxxxwwwwwwwwwwwwwwwwvvvvvvuvvvuuuvvwwwwwwwwwvvvvwwwwxwvuuuuuuutttuuutuuuuuuvuuuvvvvuuvwxxwvurpmj iijkjjihhhhiijjjkkllmnnmkijjqsw| ~}||||||{{zzzyzyyyxyyyyxxwwwwx }~ }} } ~ ~~}}~ }}{|~~~~}}|{{{zyyxwvvvvvvvuttsttttttttstttu u uuuvvwwxxxzzzzzzyyxyzzwtomihgfedcbbccccddddddddeefgffeeeeeffeedcbbccccdefghhhhhhhhjjjkklmn stuwyzz{yyyyyyyyxxxxxyyyyyzzzzzyxxyyyyyy|{{|}}{ytroopqqpoooo~o~o~ppppoonnnmllllkkkkllkkjjjjllkkklmmnnooppqqpqrstuvvtz}{xtqonkjklnruvyyz{{{{{{{{zzzzzyyxxwvvvwwwxxxxxwwwwwwwwwwwwwwwwwwwwwvvvvvuuuuvvwwwwwwwwvvvvwwwwxwvvuuvuvvuuuuuutuuuvvvwuvvvvuutuuvwwwvvvtpl jijkjiihhhiiiijjklllmnomljklruy~~}}}|}|||{{zzyzyyxyyyzyxxwwwwx ~~~}}}} ~~ ~~~~~~~ ~}~~~{{ ~~~}~~~~~~}|{zxxxwwv v v vvvuuuutsssssssstuuuuu u u v v v vwwwwzzzzyyyyxyyyvso mhgedcbcccccccddeddeeeeeegfeccddeffedccbbccdeffgghhhghghhjjjjjkkkp svxxyy{zzyyyyzz{zzyxyyyzzz{|{||{{{{{{{{}}}}~}zwsrqpppppppqqponmnnnonnmlkkkkkkkklkkjjkkllkkkklmnpqqpoopqssttuuuuvy~|yvtrqmkijnsvxyyzzz{{{{{{{zzzzzzyyxxwwwwwwwwwwvvwwwwwxxxxwwvvvvvwwwwwwvvvuuuvuvvvvvvvwuuvvvwwwwwvvvuuuwvvuuuvvuuuuvwxyuvvvvussvvvvwwwwzyvqmklmjjjjjjjjkkjiijkkkllkjkmpuw{~~}}}|||{{||{{zzyyyyyyxxxxwwwwww ~~}|~~ }} ~~~~~}}}||~~~}~~~~~}||zyxxwww v v vvvuuuuttttttttttuuuuuu u u v v v wwwxxzzzzyyyyxxyxur onjigedddddccccccdccdcddddfedccccdeeddccbbccdefggghggggghhiiijjjjjo svyyyz{{zzyyzz{|{zzyyyyzz{{||}|||||||||~}}~}{xsrqpppppopqqponmmmmmmllljkkkllllkkkjjkklllllmnnorrrqnnopsstuuuuuwy~}} {xvtromjkoswxyyzz{{{{{{{{{zzzzzzyyyxxxxxxxxxxwwwwwwwwxxwwwvvvvwwxxxxwvvvvvvuvvvvvvwwwvvvvwwwwwwvvvvvvvuuvvwxxwvvvvwxyvvvvuuttvvvwwxxxzzxtolklkkkjjkjjkjjjjjkkjjkjjkorwy} ~}}}||{{z{{{{{zzyyyyyxxxxxxxwwww ~~~~} }| }~~ ~ ~ ~}}}|{ |~~~}}~~~~}|{yxwwwv v v vvuuuuutttttttttttuuuuvu u v v v w wwxxxyyyyzzzzxxwusq onkjhgfeffedcbaaaaabbbccccdddcccccdddccbbbccdefgggggggfghhhhhhiiiios wz{{{|{{{zz{{{||{{{zzzz{{||}|}}}}}}}}}}}}~~}zxsrqpppppooppponmmmmlllllkkllmmmmlkkkklmmnnnooooorrrqnmnosstuuuuuxx{}{xvurolmptwyzzz{{{||||{{{{{{{{{zzzzyyyyyyyyywwwwwwwwwwwwwwwwwwxyyyxxwwwwwvvvvvvwwwwwwwwwwwwwwwvvvvvvvvvvwxyyxxwwvwwxvvvuvvvwwwwxxxyywxwtpljjlllkkkkkkkkllllljkkkkmqsy{~ ~}}|{zzyyzz{{{zzzzyyxxxxxxxxxxww ~ } ~~~~~~ ~ }}~ ~~}}}~zz}~~~~~}}~~~}|zyxvvv v v vvvvuutttttuuuuuuuuuuvuuu v v v v w wxxxxyyyyzzzzxwutr q ooljhgffffedcba``````abbcccccccbbbddcccbbbccdeffggffffgghhgggghhhhns w{||||||{{{{|||||||{zz{{{|||}}||||||||}||}}|ywsrqpppppnnopponnmmmllmmnmmmmmmmmmmmmmn~o~o~q~qqqqonnpqqonmnosstuuuvuxwy}~}zxvsqnnquxyzzz{{|||||||{{{{||{{{{{{yyyyyyyyxwwwwwwvwwwwwwwwwxyyyyyyxxwwwwwwvwwwwwwxwwwwwwwwvvwwwwwwwwwwwxyyyxxwwwwwvvvuvwxxwwxxxyyywxyxtpnmmmmllkkkllmnoonnlmmmmoruz{~ ~~}}||{zyyyyz{{{zzzzzyxxwwyyxxxxxx ~ } } }{|~~~ }} | } ~~ }}||~~~}|}~~}|{{zvvv v vvvvvutsrrstvvvuuuuuuuvuuuv v w w w xxyyyzzzyyyyyvvvt sqpnlkhfeddeddca`__^__`abcccbccddddddddccbbacddeffeeeedfghhgeefgggggnrw z {|||{{{{{{||{{{{zzzzzz{{{|||{{{{||||}}}}|{yxqrrqqpo~o~mnqqoooolllmmnnnnnnm~m~m~nnnmmmnoqrsrqponnnpponnnnorrrstuuuvxz| }yvtrppsuwwzz{{||||||||||{{|||||||{{{{zzzzzzyyyxxxxxwwwwwwxyyyyyyyyxwwwwwvvvwwxxxxxxxxxxwwwwvvvvvwxwwxxxyyyyyyyyxxxxwvvvwxyyyyyyyyyxxxyyvrooonnmmllmmnnooonnnnmnprtz|~ ~}||{zzyyyzz{{{{{zyyxxwyyyyyyyy ~}~ ~}yz| }~}|}~~~} |{zz~~~~~ } ~~~~}|{zzvvv v vvvvvutsssttuuuuuuuuuuuuuuv v w w w xxyyyzzzyyxxxu t t rqpnnkjigfeeeccba`____``abbcbcdeefffeeddccbbbccddedddeddfghfdccdefgggl q u y z z{|zzzzz{{{yyyyyyyyyzzz{{{{zzzz{{{{|}}||zyxsssrrqpplnpponnollmmnnnmnooo~o~o~onmmlmmoprrqpoonnnppooooppqqrrsttuuwz{}{xtrqqtvwwzzz{{|||||||||||}|||||||{{{{{zzzzzyyyxxxxxwwwwxxyyyyxxxxwwwwwwwwwwxxyxxwxxxxwwwwwwvvvwwxxxyxyyyyyyyyyxxxyxwvwwxyyyyyyyyyzyyzzyurqqponmmmnnooonnnonmllnoqyz} ~}|{zyyyyyzzz{zzzyyxxxyyyyyyyy~ ~|xyz{|~~}}|~~}|{zyy}} }~~ ~} ~~~~}|{zyvvv v vvvvvuuutttuuuuuuuuutttuuuv v w w w xxyyyyzzzyxw v srqpnmllkjihgfeeccba``____`abbbbdefgggfffedcbbccccddeddddddegfdb`abdefggjo t x y yz{zzzzzyyyyyyyyyxxyyyyzz{{yyyyyzzz{{||{zyxuutsqqppmnppnllmlmnnnnmmoopq~q}p}o~o~mlllmnpqqpoonnnnpppoppqqqqrrsttuuxz{|}ztsrsvxxxyyzz{||||||||| | }||}|||||||||{{{{zzzyyyyxyxxwwxxyxxxxxwwwwwwwwwwwxxyyyxxwxxwwwwwwwwwvwwxxyyyyyzzzyyyyyxxxzyxwwxyyyyyyyyyy|zyzzzxvtsqpnnnnooooonnmnmlkkmnowy|~|{yyxxyyyzzzzzyyyyyxyyyyyyyy ~|xxy{| } ~}|{~~}|zyy|}}}~} }} ~~}|{{zyvvv v vvvvvvvuuuuuuuuuuuuusttuuuv v w w w xxyyyyzzzyxv urqpnmlkkjjihhgfecbba``__^_`aabbbddeffffffedcbbcddeeeeedddcdefec`^_abdffgi msv x xyzzzzyyyyyzzzyyyyyxxyyyzz z xxxyyyyyz{{{{zxwvtsqpoooopqpmkjj m n noonmlnopq~q}p}o}n~mlllmnpqponnnnnnqppppqrrrrrstuuuvy{||~}utstwyyxyyzz{{{|{||||} } }}}||||||||||||||{zzzyyyyyxxwwxxyxxwwwwwwvvwwwwwxyyyyyxxwwwwwwwvvxwwwwwxyzzzzzzzzyyyyyxxx{zyxxxyzzzzzzzzz{zyyyzyxvurpnnnnpppponnmmmlklmopvx{~|{yxxxxyyzzzyyyyyyyyyyyyyyyy ~|yyyy{} ~}|{{ ~} |{zz{|}~~~}~~}~~~~~}{yxxwv v v vvvvvvvuuuuvvuuuuuuuutuuuuuv v v w w xyzz{yzzz y wvuqqomlkkkjjkkjigfa`^\[\]]`````abcccccdefgfedcbbccdeeeeeddcdeedca`__`bcefghlq vw x z{zyyxyyy z zzzzyyyyy y y y y y y y wwwwwxxxyyyyyxwwvspoooonsqoljiijm n nnonnmnnoo~o}o}o}n~mmmnnnmmnnnnnoooqqqrssttttuuuuvvxz|||}xurswz{z{{zzzzz{{|||||}}}}|}|||{||||||||yyyyyyyyyyyxxxxxxxwwvvvvvvvvwwxxyyyxxxxwwwwwwvvvwwwwxxyyyyzzzzyyyyyxxxxxyyxxxxxxxxxxxyyyyyyyyyyyxvsqnnnnppoonnnmmlkklnoquw{ ~|zyxxyyyyyyyyyyyxxxxxyyyyyyzz ~~ ~ |yyyyz| ~}|||| ~~} |{zzyz|}~~ ~~~~}|zyxw w vvvvvvuuuuuuuuuuvvuuuuuutuuuuvv v w w w x y y z z yzz y x vtsppnmlkkkijjkjihga_^[Z[[\`````aabccccdeffgfecbbbcfffffeedddddcb``_`abdefggkq tv wy yyyxxx x x y yyyyyyyxy y x x x x x x wwwwwwxxyyyyyxwwuronnoonrqnljjjklmnoppppmmnn~o~n~n~n~nnnnnnmmm~mnnnooorrstuuvvuuuvvvvvxz|||}zwtty{|{||{zzzz{|||||||||||||||{{{{{{{{{zzzzzzzzyyyyyxxxxxxxwwwwwwwwxxxxxxxxxxxxxxwwwwwwwwxxxxxyyyzzzzyyyyyyyyyxzyyxxxxyxxxyyyyyyyyyyyyyzxuqnmmmnnnnnooonnmlmoqrwy| }|{yyxyyyyyyyyyyyyyyyxyyyyyyzz ~}~~| {{zzz|} } ~~~~~}| |{{zxy{}~~~ ~~~~}}{yxw v v vvvvuuuuuttssttuuuuuuutttuuuvv w ww w x x y y y z y y y x wtrqnmlkkjjjiijkjihgba^\ZZZ[_``aaaaacccccdeegfeccccchhhhggfefecba`_`aabcdffffjo s uuwx yxw w w w w w x x x x x x x x w w w w w w w w v v v w w w w w x x xyxxw w t qnnnoonqpnmllkllmnoppppmmnno~o~o~o~nooonnmmlmmnnooostuwxxxxwwwwwwwwy{|||}~}yvwz~~} }||{{{{{||||||||||||||||{{{{{{{{zzzzzzzzyyyyyyyyxxxxxxxxxxxxxxxxwwwwxxxxxxxxxxxxxxxxxxxxyyzzzzyyyyyyyyyyzzyxxxyyyyyyyyyyxxxxxyyy{yurommlmmmnnooooonnnqstyz}~~}|{zzyxxxxxxxxyyyyyyyyyyyyyyzz ~~~}}|{{||} ~~}| ||{{xy{|}~~~ ~~~~}|{yxv v vvvuuuuuuttssssttttutttsstuuvv w wxxxxxyyyyy y y xusqomlkkjjjjhijjjihgdb_][ZZ[]^`abcccccbbccdefedccdeeiiiihggfgfc`_^__abcdefggfjn r ttuvx x w v u u vvv v v w w w w w vvvvvvvvv v v v w w w w wwxx x xwwtq nmnooopponmmmmlmmnnooommnop~p~p~p~o~ooonmmlllmmnoootuvyyzyyxxxxxxxwy{|||}~ {xx| ~~}}|{{{{|||||||{{{{|||||{{{{{{{{zzzzzzzzzzyyyyyyxxyyyyyyyyyyxxxxwwwwwxxxxxxxyyyyyxxxxxxxyyzzzzyyyyyyyzzzzzyyxyyyzzzyyyyywwwxxyyy{yvrommmmmmmnnnonnmnnqsuz{}}|~~~~}||{zzzxxxxxxxxyyyyyzzzyyyyyyzz~~ ~ ~ ~ } }||||~~~ ~~~~}|| | | |}{zyy{}~~~ ~~~~~}~~}}}}{yw v vuuuuuuuuutsrrrrsstttsssrrtuuvww w w x x x x x y y y y x wvtqonllkjiijjijkkkihgge`]ZYZZ[\]_abbbbbbbcdefeddccdefiiiiihggfd`\[\^`bcdddegiikn q stuuv v v v u uuuvvvvv vvvvvvvvwwwx x x w w w v v xxxxxxxxtrpmllnoooonlkkmllmmnnmmmnno~o~o~ooonnnnmmlmmmmnopquuvxyyyyxyyzz{{{}|}||}~~}{{} ~}}||{{{{{{{{|||||||{zzzzzzzz{{{{{{{{yyyyyyyyyyyyyyyyyyxxxxxxwwxxxxxywwxxyyyyxxxxxxyyzzzyyyxxxxxyyyzzzzzzz{{{{{zyyyyywwxxxxxyxyzwrnnoomlmnnmlmmmnoprsy{~ ~}~~~~}}||||{{{zzyyyzzzzzzzzyyzzyyyyyy~~ ~ ~ }}}||}}}}~~}}} } } } |zyyy{}~~}}}}}}~~~~~}}}|{yx w vvuuuuuuuuttsssssssstssssstuuvww w w x x x x x y y y y x wusqnmkkjjiijjjjkkjjihgea^[ZYYZ[[]^_``aaabcdefeddeefffiiiiihggdb_\Z[\^acdddegijkn q tuuu vvv v vvvvvvvv v v vvvvwwx x x x y y x x x w w w y y y y yyyyvuro mlmmmnnmjjkllmmnnnmmmnnnnnmmmmmnnnnnmmmnnoqruuuwxxyyxyyzz{{{~}}}}}~~~||~ }|{{{{{{{{|}}||||{zzzzzzzz{{{{{{{{zzyyyyyyyyyyyyyyxxxxxyyyxxxxxxxxxxxxyyyyyxxxxyyzzzzyyyxxxxxyyyzzzzzzz{{{{zzyyyyyxxxxxxxxwy{zwsonnlklmnmkmmnopqrsy{~ ~~~}}}||||{{{{{{zyyyzzzzzzzzyyzzyyyyyy ~ ~}}}|||}} ~~~~~~ ~}{yyyzz~~~~~~~}}}}}}}}~~~~}}||{yx w wwuuuuuuuuuuuuttssssstttuutuvwwx x x x x x x x y y y xxvurpmljjjiiijjkkkkjjiigfc`^[ZYZZZ[\]^_aabcdefffggggggghhhhhgffca_\\[\\_adeefhjklo rt uut vvv v vvvvvvvv v v v vw x x x y yyyy y y y x x x x yyyyyy y y xvsq nmmmmmnmjjkmnnoonnmmmnnnmmlkmmmnnnnnmmnnoprruuuuvvwxxyyzz{{{}||||}}~ }~ ~|{{{{{{{{|||||||{zzzzzzzz{{{{{{{{zzzzyyyyyyyyyyyyxxxxyyyyyyyyyxxxxxxyyyzzyyxxxyzzzzzyyyxxxxxyyyzzzzzzz{{{zzyyyyyzyyyyyxxxxxyzzyuqmlklmnmlnoprsttuwy} ~~}}||||{{{{{{{{|{zzzzzzzzzzzzyyzzyyyyyy ~ ~}} }}}}} }}~~~~}{zzzz}}}~}{|~~}}}}|}~~~~~~}}||{yx x wwvvuuuuuuvvvvuutsrsstuuuuuuvwxx x x xxxxxyyyxwvtqomkjjiiiijjkkkjjjjjihfd`^[ZZZZZ[]^_abdefgggiiiihgfeffggffedba`^]\\\^`cefghjkmort uut v v v v v wwwvvv v v v v v x x yyyzzzzzyyyxxxzzzzzzzzx v tqonmmnnnmlklnqqqqponmnnnmmlkjnnnnnnnnnnnooqrstttttuvwxyyzz{{{zzzz {|}~~ ~|{{{{{{{{|||||||{zzzzzzzz{{{{{{{{zzzzzzyyyyyyyyyywwxxyyyyyyyyyxxxxxyyyzzzyyyxyyzzzzzyyyxxxxxyyyzzzzzzz{{{zzyyyyzzyyyyyxxxywvx{|zxnmllnonmpqrtvvwwtvy| }}|||||{zzzzzzz{|{{zzz{{zzzzzzyyzzyyyyyy ~ ~ ~~~~~} |{yyz{} ~}|}}}}}}}}}}~~~}}||{z y xwwwvvvvuuuuvvvuuuutstttuuuuvvvwwxx y zyyyyyyyyxuromlkjjiiiijjkjjjjjjjhgfeda]Z[[[[\]^_bceghiihjjihgedbbbccccbba``_^^^^_`cfhijjmmopstuvwwxxx w w v vvww w x x x {zzzzzzyzzzyyyyyzzzzzzzzx w usq nmlonmmmnpqtssrponmmmmmml k k nnnnnnmnooppqqrrssssstuuvwyyxxz|{{zyz| ~~ ~ }}|{|{{{||||||}}{{{{{{{{{{{{{{{{{zzzyyyyxxxyyyyyxxxxyyyyyyyyyxxxyyyyzzzz{{{{zzyyyyyyyxxxyyyyyyyyyyxxyyzz{zzzzzzyyyzzzyxxyxxz|}}{qnjikmnnqqrtuvwwwwwxz| }{z{{{zyyyzzzzz{{zzyyyyxxxwwxyyyyyyxxxx ~}|zzyz|}~~~~~~~}}}}}}}}}~~~~~}}|{z y xxwwwvvvvvvvvwwvvuuuutttuuuuuvvwwxx y y y y z z z z z z xwtromlkjjiiiijjjjjjjiiihgfeda]Z[[[[\\]]_`cegggghggedb`__``aaa``a`__^^^^^`begijjmnop stuvv w w x xxwwwwwwwxx x z z z y y y y y y y y y y y y y yyyyyyyyyyx u s qonnmlklnprtssrpnmmmmmmmm m mnnnnnnnnpppqrrrrtsssstuuvxyyyyz|| {zz| ~~}}}~ ~||{{{}}}}}}}}|||{{{zz{{{{{{{{zzzyyyyxxyyyyyyyxxxxxyyyyyyyyyyyyyyyzzzz{{{zzyyyyyyyyxxxyyyyyyyyyyyxyyzzzzzyyyyyyyyzzyyxxy{~|yspljkmmnpqrstvvwwvvwxy{|}||{|} }zyzzzyyyyyyyyyyyyyyyxxxxwwxxyyyyyxxxxx~ || z z|||||{|| }~~~~~}}}~~~~~~~}||z y xwwwwwwwwwwvvvwwwvuuuuuuuuuvuuvwwxx y y y y y z z z z { { vusqnmlkjjiiiijjiiiiiihhhgffdb^Z[[[\\\\\]^`bcddddcb`_^]]]]^_____``_^^^^^^_adfhijmnopstuvvvwxxxxxwwwwwwxxyyyyxyxxxyyyyyyyyyyyyyyyyz y x v t r q nmkj kmprrrrqqpnnnmmllm nnnnnnnoonqqqqrssstttttuuvvxyzyy{|| | {|} ~}}}|||}~ ~||||}}}}~~~~}}||{{{z{{{{{{{{zzyyyxxxyyyyyzzzyyyxxxxxyyyyyyyyyyyyzzzz{zzzyyyyxxxxxxxxyyyyyyyyzzyyxyyyyyyyxyxxxyyzzyyyyz}}yuqnllnnnqrrssttuvvvwwxyyyyxxy{~}{yxyyyxxxxxxxxxxxxxxxxxwwwwxyyzyyyxxwww~~}}~~}|}} }|{yxzz{| }~~}}~~~~~~~}|{x x wwvvwwxxwwwwwwwwwvvuuuuuuvvuuvwwwxx y yzy y z z { { { { utrpnmlljjiiiijjiiihhhhhhggfeb^[Z[[\\\[[\^_`aaaa__^]\\\]\]^_______^^]]^^^_`cegijmnopstvvvvwxxxxxwwwwwwwwyyyxxxxxxxxxxyyyyyyyyyyyxxyyxvtsomkijl opppqqqqqppomll l mnnnnnnoooqqrrssttuuuuuuvvvxzzyy{|}| | | } ~}}}~|||||} ~}}}~~~~~~~~~}}|||{{{{{{{{zyyyxxxxyyyyzzzzyyyyxxxxxxxyyyyyyyyyzzzzzzzzyyyxwwxxxxxyyyyyyyyyzzyyxxyyyyyxxxxxxxyzzzyy{{|~}{vspnoqrrssssrrrruuvwxyyyxxwwx| }{xwxyxwxxwwwwwvwwwwwwwwwwwwxyzzyyxxwwvv|}}~~~| zyxyyyz{ |}~~~~~~~~~~}|{ w wwwvvvvyxxxwwvvwvvuuuuuuuuuuuuv wwwww x xxx y y z z z y y u uronllljjjkkkkkjjjiiiiiihggfb]Y[[\\\\\\^_`abbba__^\\[[[[\]^^]]\]^^_^^^]__abcehkmnoqsuvwwwwwwwwwxxxxxxxxxxxxxxxxwwwwwwwwxxxxxxxxxxxxwvuuqpnlllmnopqrrrqqoonmmmmnmnnnnnnnpr suvvuuuuuuuvwwxy{zyyz{}||| ~}}}}}~|||||}~~ }}}}~~~~}}{{{{{zzzzyyxxxyyyyz{{{zzyyyyxxxxxxxyyyzzyyzzzzzzyyyyyyyyyyyyyyyyzzzzyyyyyyyyyxxxyyyyyyyyyyzzzz{{|}}~~}|{yvsqrssstttssrrrtuvwxyyywwvwy|~} {zyyyzwwwwwwwwvvwwwxxxwxxxyyyy{zyxxxxx}}}}~~~~}| zy{{z{ {|}}~~~~~~~~~~}}|{ { wwwwwvvvxwwwvvvvvvuuuuuuuuvvuuuvwwwww w x xx x y y z y y y uuronllljjjjkkkkjjjjiiiiiiihgc^Y[[\]]\\\^_`bccbb`_^]\\\\[[\\\[[Z[[\]^^^^_`abbdgjmnoqsuvwwwwwwwwwxxxxxxxxxxxxxxxxwwwwwwvvwwwwwwwwwwxwwvuussqqpoo oop rrsrrqoooonooommnnnnnnrsv wxxwwvvvvvwwxyz{{yyz|| | { }~}}}|}}}|||||}}~ ~|}}~~ ~~}|||{{zzzzzyxxxyyyyzzzzyyxxxxyyyyxxxyyyyyyyyyzzzzyyyyyyyyzzzzzzzzzzzzyyyyyyyyyyyxyyyyyyyyzzzzz{{{||}}}}}}zwsrrsssssssssrrtuuvwxxxxwwxz}~} |zyyyyxxxxxxxxvwwwxxxyxxyyyzzzzyyxxxxx~~~~~~~~~}|}}}|}}}~~~~~}}|{zz z z xxwwwwwwvvvuuuuuuuuuuuvvvvvvvuuuvvvwwww w w x y y y y y x uuronllljjjjjjjjjjiiiiiiiiiihc]XZ[]^^]\[]^`abbba`_^]\\\\[[[[[ZZYZ[\]^^^^^``abdgjnnoqsuvwxxwwwvvvwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvwwwvvuuuvvvuts r p qr rrqpo o o oooooommmmnno o tuw yzzyyw v v vwwxyz { | |zyz||{{| ~ ~}||{{{||||||||}} ~~~~ ~}}|||{{zzzyyyyyyxyyyyyxxwwxxyyyzyyyyyyyyyyyyyyzzyyyyyyyyzzzzzzzzzzzzyyyyzzzyyyyyyyyyyzzz{{{{{{{{||||}}~{xtrrsssrrssssssttuvwwwwxwwx{~| | {zzyyyxxxxxxxxwwwxxxyyxxxxyyyyyxxwwwxx~~~~ ~~~}}}~ ~}~~~ ~}|{zy y y yxxxwwwwwuuuuuuuuuuuuuvvwwvvvvuvvvvvvwwwww x x y y y x x uuronllliijjjjjjhhhhgggghhiigb[VZ[]__^\[\]_`aa``__^]]\\\\\\[ZZZZ[\]]^^^^^_`abdgjmnprtuwwxxxwwvvvwwwwwwwwwwwwwwwwwwwwwwvvwwwwwwwwvvvvvvuvvwxyyxwv r r r rpomlmn nooonommmmn o pptvw y{zyy www w w x yy{| | | {z{|{{{|~ ~||{{{{{{{{{{||}} ~~~ ~~}}|{{z{zzyyyyzxxyyyxwwxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzyyyyzzzzyyyyxyyyzz{{||||||{{||{{{}{xurrsssrrrsstttttuuvvvvxxwy{ { { {{zyyyxxxxxxxxwwxxxyyywwwwxxxxxwwvvwwx~~ ~~~~~~~}}||{z yyxxxxxxwwvvuuuuutttuuuuvvwwvvvuuvvvwwwwwwxxxxyyyyx x utromljjjjjkjjiihgggghhihjljf`[Y[\]^^]\[\]]^^__`_^]\[[[[[[[[[[[\[\]^____^_bccegilmoqsuvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxwwwvvvvuvvvvvuuuvwxyyyx ttq o nlkkmmmmmnnonnn oprstv w xyzyx w wwww x x z z zz { | | { {{zz{|}}~ ~||{{zzzyzzz{||~~ ~ ~ ~~}||||{{{zzyyxxxxxxxxxxxxxxxxyxxxxyyyyyyxyyzz{{{{zzzz{{{{{{{{yyyzzzzz{{{zzyyyyzzzz{{{||||||{{||{yy{{usrsttsrrqqrstuuuuuuuuxvvx| zzzzyyyyyyyyyyxwwwwwxxxywwwxxxxxwwvvvvww~~~~~}}{zz y xxwwwwxxwwvuuuuuuuttuuuvvwwwwwvvvvwwwwwwxxxxy yyzzy y xutqnlkjijkkkkjjihgggghiiiklkf_[Y[\\]]]\[\\\\]]]^]]\[ZZZZZZZ[[[[[\\]^^^^^]_accdfhkmnqtuvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxwwwvvvuuuuuuuuutuuvwwwwut r pomlll l l llmnnp pqrstuvw w xyyyx x xxxx y z z { z z { { { { { z zz{{||} } {{{{zzzzzzz{||~~~~ ~~}|||||{{zzzyyxyyxxxxxxxxxxxxxwwwxxyyyyxyyzz{{{{{zzz{{{|||||zzzzzzzz{{{{zzzy{{{{{|||||{{{{{{zzzyy|{vsrstttsrqrstuuuuuvvvvvuvx}}zzzzyyyyyyyzyyxxwwwwxxxyxxxxxxxxwwvvvvww ~~~ ~~}}}zz z yxwwvvvwwwvvuuuuuuuuuuvvvwxxxxwwvvwwxwwxxxxxxz z zzzz yxutpmkiiijjjjjjiihggghijjjlmkf_[Y[[\\\\\\\\\\\\\\\\[ZYXXXXXYYZ[[[\\]]^^]]\^`abcegjlortuuvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxwwwvvvuuuuuuuuuuuuuuuvvu u tsqpnmmlllmmnorrstuvvvw w xxyxx x xyyz z { { { z z { {{zzyzzz{{{||{{{{{zzzzzz{||~~~~~ ~~~~}}|||{{zzyyyyyxxxxxxxxxxxxwwwxxyyyyxyyzz{{{{{{{{|||||||}{{{{{zzz||{{{{{{||||||||{{{zzzzzyzzzz||vsrssssrrqqrstuuuvvwwwvvw{} zyyyyzzzzyyzzzyyxwwwwxxxyyyyxxxxwwwvvuvvv ~~~~~~~~~~ ~}}||{ { z yyxwwvvwwwvvvvvvvvuuuvvvwwxxyxxwwwwxxxxxxxxxy{ { { {{ z yyvtpmjhhhhiiiihhhgghhhijkjlmkf`[Y[[[[\\]]]]]\\\\\[[YXXXXXVWXXYZ[[\\]]]]]][]_`abdfjloruuuvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwxxxxwwwvvvvuvvvvvvuvvuuuuvwwwvvtrqpooonoppqrrtuuvvvx x x x x x y y yyz{ | { { { z z { {{zyyyzzzz{{{zzz{{{{{zzz{||~~~~}~ ~~}}}}||{{zzzyyyxxxxxxxxxxyxxxxyyyyyyxyyzz{{{{|||||||}}}}}}|||{{{z|||||||{|||{{{{{zzzzzzyyzz{zz{}|wsrrssrrqppqrsuuvvwwxxvwy} |yyyyyzzzzyzzzzzyxwwwwxxxyzyyyxxwwwwvvvuuu ~ ~ ~ ~ ~ ~ ~ ~~~~~~~~~ ~ ~ ~ ~~}}||| { { zyxwvwwxxxxxxvvvvvuuuvvwwxxxxxxwwwwwxyyyyyyxxyyz z z yyxvtqmkihhhhhhhiiihhiiijjjijkjgb]ZZZ[[[\\\]]]]]\\\ZZYXXXWWWWXXYZ[\]]]]]]^^^_```acfimpsttuvvvvvvvvvwwwwwvvvwwwwvvvvxxxxxxyywwwwvvvvvvvvvvvwvvvvvvvvxxwwvtsrrrqpqqqqrrstuvvvxxxyyzzzyyyyzzzzzzzzyyyyyyzz{{{{{{{{{{|||||||}}}~}}|} ~ ~~}}|||||{{{zzyyyyyyyyyyxxxxxyyyyyyyyyyy{{||||||||||}}~~}}|||{{{{||||||{|||{{{{{{{{{zzzzzzz{{{|}~|zvrqqsrqpooqstuuvwxxxxwy|~ |{zzzzzyyyzzzzyyyxwwwvvwwwyyyyyyyyxwwvvuuu ~ ~ ~ ~ ~ ~ ~~~~~~~~~ ~ ~ ~}}||{ { { z zyxwwvvwxyyyyvvvvuuuuttvwxyyyxxwwvwwwyyyyyxxxyyy y y yxxvtpmjihhhhhhhiiiiiijjjkkjkkjgb^[[[\\\]]]\\\\\[\\YYYXYXXXXXXXYZ[\]]\\\]^^_`aaabdfilpsttuvvvvvvvvvwwwwvvvvuuuuvvuvwwxxxxxxwwwwvvvvvvvvvwwwwwwwwwwwxxxwvutsssssrrrrsstuuvwwyyyzz{{{yyyyyyyyzzzzyyyyyyzzzz{{{|||}}}}~~~}}}}}}}||} ~ ~~}}}|||{{{{zzzyyyyyyyyxxxyyyyyyyyyyyzz{{|||||||||}}}}~}}||||{{||||||||||||{{{{{{{zzzzzzz{{||}|}}{xtrrrqpoooprsuuvwwxwwxz}}||zzzzzzzz{zzzyyyyxwwvvwwxyyyyyyyyxwwwvvvu~~~~~~~~~~~~~~ ~~}}|{{ { { {zyyxxwvwxxyyxxuuuuuuuustuvxyyyxwwvvvwwyyyxxxxxxxx y x xwwuspmjihhhhhhhiiijjjkkllmllkifb^\\\\\]\\\XXXYYYYYXYYYYYZZYYYYYZ[[]\\\\]]^^_aa`adfhkorstuvvvvvvvvvwvvvvvvvuuuuuvvvwwwwwwwxwwwwvvvvvvvwwwwwwwwwwwwwwxxxwvvuvvvvuuuuuuvvwwxxzzzz{{{{yyyyyyxxyyyyzzzzyyzzzzzz{|}~~~~}}||||||}~ ~~}}}{{{{{{{{yyyyyyyyyyyyyyyyyyyyzzzz{{||||||}}}}}}}}}}}|}|||||}}}}||||||||{{zzzzzzzz{{{||}}}~~}zvsrrpooopqrsuuvvwwwwy{ |{|zzzzzzzz{{{zzyyyxxwwwwxxxxxxxxxxwwwwwvvv~~~~~~~~~~~~~~~ }}}||{z z zzzyyxxxxxyyxxwvrssttuvvttvvwxxxxwvvvvvwxxxxxxwwwxx x x wwvuroljihhhhhhhiiijjkllmmnnmlhea_\^]]\[[[ZUUUVVVVVWXXXYZ[[ZZYYYZZ[]\\\\\]^]^_```cegkorstuvvvvwvvvvvvvvvuuuuuuvvvwwvvvvvwwwwwwwvvvvvwwwwwwxwwwwwwwwwwxxxwvvwwxxxwwvwvwwxxyyyyzzzzzzyyyyyxxxyyyyzzzzzyyyyyyy{|~~~}||{z{{|}}~~~ ~~}}{{{{{{{{zzzzzzzzyyyyyyzzyyzzzzzz{{|||}||}}}}}}}}}}}||}}}|}|}}|}|||||||||zzzzzzzz{{||}}}~~~|wtrqpppqqrsttuvvwwwwy|~{{|zzz{{{{{{{{{zzyyxxwwwwxxxxxxxxxxwwwwwwww ~~~ ~~~~~~~}}}||{{ z zyyyyyyyyyyyyxwvvssrsstuvuuvvwwxxwwwvvvvvwwwwwwwww wwwwvvvspkhhhhgggghhiiikkkkklmnomjgc`_]^]\ZYXXWTTTSTTTTUUVVWY[\YYZZ[[[[^]\\[\\\^^]]_`bcfhlprtuuvvwwxwwvwwwwvvvvuuuvvvwwvvvvvvvvwwwwwwwwwwwxxxxxxxxxwwvvwwwwwwwwxxxxxxyyxxxxy y y z z z z yyyyyyxxxxxxwxxyyyzzzzzzyyyxx}~~~}}|||{{{z{|}~~ ~}{{{{{{{{{|||{{zzyyyyyzzzzzzzz{{{{||||||}}}}}}}}}}}}||||||||}}|||{|}|}|||zzyyyz{{{{|}}}}}~xsrsqqqqrrstuuvvwwwxz}}{{{zzz{{{||{{{zzzzzxxwwwwwwxwwwwwxxxxxxxxxx ~~~~~ ~~~~~~}}}|||{ z zzyyyyyyyyyyyyxwvusssstuvwvvvvvvwwwvvvvvvvvvvvvvvvvvwwvuutqniffgggggghhiiikjjkklmmmkifc`^]]\ZYWVUUTTTSSSSSRSSTUWYYYYZZ[\\]]]]\\\]]^]]]^_abegkorsttuvvwwxxxxwwwvvvvuuuvvvwwvvvvvvvvwwwwwwwwwwwwxxxxxxxwwwvvwwwwwwwwwwxxxxxxwwxx x y y y yyyyyyyyyxxxxxxwxxyyyzzzzzzyyyxx|}~~}}|}||{{zz{|}~~~~~ ~}||||||||||}}||{zyyyzzzzzzzz{{{{{||||||||}}|}}}}}}}}|||||||||||||||}}}}|}{{zz{{||||}}}|||~ytstqqqqrrstuuuvvwxxz~{zzzzzz{{{{{zzzzzzzyxxxxwwwwwwwvwwxxxxxxxxxx ~~~~~~~~~~~~~ ~ ~~}}~~~}}|||{{ { zzzyyyyyyyyyyyyxwvutttuvwxywvuutuuvvvvvvvuuvvvvvvvvuuuuutsrokgeefggggghhiiijjjjklmmkjgd`^\[YXWVTSSSTTSSSSSSRRRRTUVVWXXYZ[\\\\]]^^^^^^]]^_`acfjnqsstvvvvvwwxwwvvvvvvuuuvvvwwvvvvvvvvwwwwwwwwwwwwwwwwwwvvvvvvwwwwwwwwwwwwwwwwvwwwxxxxxxxxxxxxyxxxxxxwxxyyyzzzzzzyyyxxz{}~~~}}||||{{zz{|}}~~~~}}~ ~~||||||||}}}}}||{zzzz{{{{{{{{||||||||||||||}||}}}}}}||||||||||||||}}}}}|||||}}}}|}|||||||yuuuqqqqrrstuuuuuwxy{{zzzzzzzzzzzzzzzyyyyxxxxxxwwwwvvvwwxxxxxxxxx ~~~~~~~~~~~~~~~}}} ~ ~~~}}~~~~}||||{ { { zzzyyyyyyyyyyyyxwvuuuuvwxyzwvutstuuvvvuuuuuuuuuuuuuuuuutsrqnkgefghhhgghhiiijjjjkklmkiea^[XWVUUSRRRRRRRRSSTTTTSRRSTTTTUVXYZ[\\]_____`____`abcehmprssssrqqqrruuuuuuuuuuuvvvwwvvvvvvvvwwwwwwwwwwwwwvvvvvvvvvvvwwvvvvvvwwwvvvvvvvvwwwxxwwwwxxxxyxxxxxxwxxyyyzzzzzzyyyxxyz|}~}}|}|||{zzz{|}}~~~~||}~ ~~}}}}}}}}}}}}}}||{{{{{{|||||||||}}||||||{||||||||}}}|||}}||||||||}}}~}}}||}}~~~}}{{{{{|}} yutuqqqqrrstutttuvxy||z{{zzzzzzzzzzzyyyyyyyxxxxxxwvvvvvwxwwwwwwww}}~ ~}}~~~~~}}}~~~~}}}}}~~}~}|| { {{{{zyxyyzzzzzyzywvuuvuvvvwxyyyxwvuttttvvvvuvuuvvvvuuttuuuutsqpnlhfghiiihhhhhiijjjjjjkkie`\ZXUTSTTRQPRRSRQQRSUUTSSRQQRRRRRRTVXY\\]__``_```````addglqrpmkigeefghkmpsuutttuuvvwwwxxwvvvvwwwwwwwwwwwwvvvvvvvuuuvwwyxwvvvvvxxwwwvvvvvvvwwwwxxxxxxxxyxxxxxxxwxxyyz{{zzzzzyyyyz|}~}|{|{zzzzzz|}~~||} ~ ~~}}}}}}}}}}}}|||||||||||||||}||}|}}||||{||||||||}}}||}}}}}}}}}}}~}}}}}}}}}~~~~}}|{{{|}~~ zutsqqqqrstuuuttuvyz}}||{{{{zzzzzzzzzzzzzyyyyyyyyxxxxxwwwxwwwwwwx}~ ~~~~~~~~}}}~~~~}}}}}~~~}~~~~}} | { {{{{zyxxxyyz z z zyyxwuuuuvwxxyyzzzyyxwvvvvwwwwwvvvvvvvvuttuuuuusqpoligghhhhhgghhiijjjjjjjjda[XWUTRSTTRQPQRRRQQQRSTTSSRQQRRPQPQSUXY\\]^____````aabbcehkljea_^[YXYZ\\`gnsttsuuvvvwwwwwvvvvvwxxxxxxxxwvvvvvvvwvvvvvwxyxwwvvwwxxxxwwwvvvvwwwwwxxxxxxxxxxxxxyyyxxxyyzzzzzzzzzzyz{|}|{zyyyxyyz{{|}~~}|{|}~ ~~~}}}}}}}}}}}}}}}}}}}}}}||}||||||||||||||||||||||||}}}}}}}}}}}}}}}||}|}}}}~~~~}}||||}}~ yussrrrrsstuuuttuwyz~ }}||{{{zzzzzzzzzzzzzzzzyyyyyxxxxxxxxwwvvvvww~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ } } } ~~~~~}}}}}~~~}}}}}}| | {zzzzzyyxwwxyy z z zzxwvuuuuvxyyyzz{{zzyxxxxxwwwwwwvvwwwwvvutuvvuusqpomjhhhgfgfgggghijjkkkjih^\XUTTRQRSSRQPQRTSSSRRRRTSSRQQRRQQQQSUWX\\]^__^^__``abbbcegfb]YWWWUSSSTUVZahnqssrrstuuvvwvvvvvvwxxxxxxxxvvvvvvvwwwvvvwwxxxwwwwxxyyyxxxwwwwwwwwxxxxxxxxxxxxxxyyyyxyyyyyzzyzzzzzzz|||{zyxwwwwxyyz{||}}}|{zyz|} ~}}}~~~~~}}}}}}}}}}}}}|||||}||||||||||}}}}}}}}}}}}}}}}}}}}}}}}||||||}~}}~~~~}}~}}}}~~ ~xuttttuuuuutuuttuwy{~}|||{{{zzzzzzzzzzzzz{{zzyyyxwxxxxyyyxxwwwwxx ~~~~~}} ~ ~ ~ ~~ ~ ~ ~ ~ } } } ~~~~~}}||}}}~~~~~}|||| | | {zyyyzyyxwvvwxyzzzzxwvtuuvvxyyyyzzzzzyxxxxxwwwvvvvvwwwwvuuuuuvuutrqomjhhgfefffffghiijkkkihg\YUSSRRQQRRQPPQRUUUTTSRRTSSRQQRRTSSSSUWX\\]^^^^^]]^_`abbcdc_YTTUTSRRRRSTWY[`dhlnlmnoqstuvvuuuvvwwwwwwwwwvvvvvwwwwwvvvwxxxxwwwxxxzyyyxxxxwwwwwxxxxxxxxxxxwwxxyyyyyyyyyyyyyyzzzzzz{{{zyxwvwvvwxyyz||||{{yxyz{}~ ~~~~~~~~~}}}}}}}}}}}}}}|||||||||||||}}}}}}}}}}}}}}}~~~~~~~~~~|{||||}~}}~~~~}}~~~}}~}xvuvvvvvvuututttuwz{|{|{{{ {{zzzzzzzzzzzzz|{{zzyyxwwxxyyyzyyxxxxyy ~~}~~~~~~~}}~~~~~ ~ ~ ~~ ~ ~ ~ ~ ~ ~ ~ ~ ~~~~~~~~~~~~~}}} } | || | }}~~~~~~~}}| |||{{zzzyyyyxwvuvvwxxxxwvuuuuuvvxxxyyyyyyyyyxxxxwwvvvuuuvvvvvuuuuvvuutsrnmkigfeefeedefghjjijjhdbZXUSSSSQRRQQQQRRVVUTSSSSSRRQQRRRSTSRRSWZ]^_``_]\\]^_`abbca]YUSRRSRRRRSTTWXY[]_`abcdgjosutvvvuuwxwwwwvvvvvvwwwxxxyxxxxxwwxxxxxxxxyyyyyxxwwwxxxxxxyyyyyyyyxxxyyyyyyyyyyyyyzzyyyyyyzzzzyxxwxxwwwxxy|{zyxyyzyz{| } ~ ~~ ~~~~~~~}}}|||||||||||}}}}}}}}}}~~~~~~~~~~~~~~|||||}}}~~~~~~~~~~~~~ |ywvvxwwvvuuuwuutux|~~ |{|{{ { z zzzzzzzzzzzzzy{zzzyyxxxxxyyzzzzzyyyyzz~}}}~~~ ~ ~ ~~ ~ ~ ~ ~ ~ ~~~~ ~~~~~~ ~ ~ ~ ~ ~ } } } | | ||||} } ~ ~~~~~~~~~~~~~~~}}| | |||{{zzzzzyyxwvvuuvvwvvvvvuvuvvwxxxxxxxxxxxxxxwwwwvvuuuuuuuuuuuuuuuvuuutqonkigffeedcdeggiiijie_[XUTSTUUTSSSRRSSSVUUTSSSSRRRQRRSSTTTRRTXZ]^___^\\\]^_```_[ZXUTSSSQQRRSTUVXXYZZZYYYZ[_cimpsuwwwvwywwwwvvvvvwwwxxxyxxxxxxxxyyyyyyyyyyzzyyxwwxyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzyxxwyyxwwwwwyyxxxyz{{{|} ~ ~ ~~ ~~~~~~}}}}}}}}}}||||}}}}}}}}}}~~~~~~}}}}~~~~~~~~~~~~~~~~~|ywvvxxwwvvvuwvuuvy}} ||||{ { {{{{{{{{{{{{{{zzzzzyyyyxyyyyyzzzzyyyyyy~~~~}}}}} ~ ~ ~} } } } }}}}}}} } }~ ~ ~ ~ ~ ~ } } } } } } }}|}}}~ }}}}}}}} }~~~~~~~~}~~}}}}| } |||{{zzzzzyxwwvvvuuuuuuuvvvuvvwwxxwwwwwwvvvwwwwwvvvuuuttstttuuuuuuvvvvvusroligfeedcbcdghhgfec_ZVUTSSUVUTTSSRRSSTTTSSSSSSRRRRRSTTTTTSRTX[]^^^^][[\\]]\ZYXSRRQRRSTRRRSTUWWXXXWVUTTUUVX\`dgpsvxxwwxwwwwvvvvwwwxxxyyxxxyyyyyyyyyyyyyzzzzzyxxxyyyzzyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyyyyyzzzzyxxwyyxwwwwwyyxxyz|}}}~ ~ ~~~~~~}}}}~~~~~~}}}}}}~~~~~~~~~~~~~~}}}~~~~~}}}~~~~~~~~~{xvuuxxxxwwwwxwuuwz~} ||}{z zz{{{|||||||{{{{zzzzzzzzyyyyyyyyzzzzzyxy}}}}}~}}}||}} ~ ~ ~} } } }}}}}||}} } ~ ~ ~} } } } } } } } } }}}}}}~ ~~~~~~~ ~ ~ } }}~~~~~~}}}}|||||| ||||{{zzz{zyxwvwwwvvuuuuvvvvvvvwwwwwwwvvvuuvuvvvvvvuututtrsstuuvvvvwwwvvvtspmigeddcbabdfhhe`][YWUUTSTUVUTSSRRRRSSRRQQQQQRRRRRRSTTTUTSRTX[^^^]]\[[[\[ZXTQONNOPQRTUSSSSTUVWVVVVVUTSWWWWX[^`mqvxwwvwwwwwvvvvwwxxxyyyxxxyyyyyyyyyyyyyzzzzzyxxyyzzzzzyzzzzzzzzyyyyyxxxwwwwwwwwyyyyyyzzzzzzyxxwxxwwwxxyzzyyz{|}~ ~ ~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~}}}}~}~~}}}~~~~~~~~ {wutsxxxxxxxxxwvvx|}}| |}|{y yyzz{{{|{{{{{{zzzzzzzzzzyyyyyyyyzzzzzyxx~}}}~~~ } }|}}}~ ~~}}}}}||||}}}}~~~~ ~ ~ ~ ~ ~ ~ ~ }}}}}}~ ~ ~ ~~~~}}}}}}}} } } ~~~~~~~~} } ~ ~~~~~~~~~~~~~}}}}| } } } |||{{{{zzyyyyxxxwwvvxxwvvvuvvvvvvwwwxxwwvvvvuuuuuvvvuuutttsssstuuvvwwwwwvvvvurokhfffedb`acfgeb^[ZYWUUTSSSSRRQQQQQQRRQPPPPPQQSSRRRRRSUUTSTUWX]\\[ZZ[[^\YXVSOMNOPRTTUURRRSTUVVUUTTTUUVZYWUSUY]clvywuvzxwwwwwwvxxxxxxxxxyyyyyyzyyyyyyyyzzzyyyyxyyyyyyzzzzzzyyyyxxxyyyyyyyyyyyyyyyyzzzzz{{zzzyyyyyyxyyzzzzzzz{|}~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~}}}|||}}~~~~~~~~~~~~~~ |xuttwxxxyxxxwwwxz ~}}| ||{zzzzzz{{{{zzzyyzzz{{zzyyxxyzzzzyyxzzzyyyyx~ } }|}}~ ~~}}}|}||||||}}}~~~~ ~ ~ ~ ~~~}}}|}||}}~ ~ ~ ~~~}}}}}}} ~ ~ ~ ~~~~~~~~} } ~~~~~~~~~~~}}~~~}}}} } } } } }||{zyyyyyyyyxxxwwwvvvvvvvwwwwwwwwwwwwwvvvuuuuutuuuuuttttsssssstuuvvwwwwwvvvvusoligfgfdb``bdfdb_^][XVUUTSRRRRQQPOOOPPQQPQQQRRRRQQQQRSTTTTTUVWZZZZZZ[\\ZXXWVTQRSTUUUVVSSSRSTTTUUUUUUVV\[YUSTVY`irxxvwywwwvvvvvxxxxxxxxxxxxxxxxyyyyyyyyyyyxxxxwyyyyyyyyzzzzyyyyxyyyyyyyyyyyyyyyyyzzzzzz{{zzzyyyyyyxxyyz||{||}~ ~ ~ }}|||~~~~ ~ ~~~~~}}}}~~~~~~~~~~~~~~}}}|||}}~~~~~~~ |xvuuwwxyyyxxwwxz}}| |||{{{zzz{{{{{{zzyyzz{{zzzyyxxyzzzzzyyyyyyyyyy} }}}}~ ~ ~}}}}||||||||}}}~ ~~~ ~ ~ ~ ~~}}}}|||||||}} ~ ~ ~~~}}} } } ~ ~ ~ ~ ~ ~~~~~~~~}}~~~~~~~~~ } } } }}}}}|||}}}}} } } } } } }|{zyxwxxxxxxxwwwwwwvvuuvvvwwwwwwvvvuuuuuuuuuutttttssssssssssssstuuvvwwwwwvvvvusoljhhhfecbabdedba``^[XVVUTSRRRRRQPOOOOQQRRSSRRRRQQRSSTTTUUUVWWZZYYZ[\\[YXXYYVTUUVVVVUUTTSSSTTTVVVVWWWWZZYWTTUW]dnuyyxywwwwwwvvxxxxxxxxxxxxxxxxyyyyyyyyyyxxxwwwxxxyyyyyyyyyzzzzyyyyyzzzyyyyyyyyzzzzz{{{{{zzzyyyyyxxxxxy{{{{|}~~}}|||{||}~~ ~ ~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~ {xvvvuvxyzyxxxy{}~} ||}||||{{{{{zzz{{zzzz{{zzzzyyyyzz{{{zyyyyyyyyyy~~~}}~~ ~ ~}}}}||||}}}}}} } ~ ~ ~ ~ ~ ~ ~ ~~}}}|||||{{{||} ~ ~ ~~~~}}} } ~ ~ ~ ~ ~ ~ ~~~~~~~~}}}~~~~~}}~~~~~ } }||}}}}| | | | ||| } } } } } | ||{yxwvuvvvwwxxvvvvvvwwvvvvvvvvvvvuutssttttttttttssssrrrrrrrrrssstuuvvwwwwwvvvvuspmjihhhgedccdedcbcb`\YWVUTSRRRUTSRQQQQRRSSTSSRSSRSSTUUUVVWWXXX[[[[[[\\\[YYYXVTTTUUUUTTTTTTTUUVVWWXXXWWWXXWUUVX[ajsy{yxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxxxwxxxxxyyyyyyyzzzzyyyyzzzzzzzzzzzzzzz{{{{{{{zzzyyyzyxxxxxxyyyz{|}~|||||||||||}~~ }}~~~~~~ ~ ~~~~~~~~~~~~~ ~{xwvvuvxzzzyxz{}~}}| |||}|||{{{{zzzz{{zzzz{{zzzzyyyyzz{{{zzyyyyyyyzz ~ ~ ~ ~ ~ } } | | | { }}~~~}}|} } ~ ~~}}}||||||{{{||}} }~ ~~~ ~ ~ ~~~ ~~~~~~~}}}}~~~ ~ } } ~~~~~~~ ~ ~ ~ } }}}} } } |}|||}}}|||||} ||zywwvvvwxxxwwvvvvwwwwwwwvvvuuttttsssssssssrrrttssrqqqrrrrrsssrrstuvvvwvvvvvvvusqoljihhggfffffbbbcca]ZWWVUTSRRTTTTSRQQTTUUUTTSTSSSTUVWVWXYYYYXZZ[\]]]][[ZYXVUSSSSSSSSSRRSSTUUUWWWWWWWWVVVVVWWXY_gpvyyxwwxxxxxwxxxxxxxyyyyyyyyyyyyzzzzzyyyyyyxxyyyzzzzzyyyzz{{{zzzzyyyyyyyyyyyyzzzzzzzzzzzzyyyyyyyyyyxxyxyyz{{{{{{{||||}}}}~~~ ~~~}}}~~}~ ~ |yxxvuxxyyz{{{~}|} |||||||{|{{zzzz{{{{{{zzzyyzzzzzz{{{zzzyyyyyyyxxx}}} } } } } } ~ ~ ~ ~ ~ } } } | | |||}}}}|||}}~~~~~}}}}|}|||||{{{||}}}~ ~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ }}}}}}}} } ~ ~ ~ }} } }}}} } } }}}}}}}} }}|||||||||||{{| | {zywvvvvwwwwwwvvvwwwxxwwwvuuuussssssrrsssrrrrrtssrrqqqrrrrrrssrrstuuvvvvvvvuuuutrqnmkjiihhggggaaabb`\YYXWVUTTSTTTUTSRQTTUUUTSSTTTTTUVVVWXYYYXXYZ[\]]]][[ZYXWUTRRRRRRRRSSSSTUUUUUUUUUUUUUUUVWXXY^fotwwvvwwxxxxxwwxxxxxxyyyyyyyyyyyyyyyyyyyyyxxxyyyyyyyyyyyyyzzzzzzzyyyyzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyxxxxxxyyzzyzzzz{{{|||}}}~~~~~~~~~~ }yxxyxwyyyz{|||~~}| | |||||||{{{zzzz{{{{{{{zzzyyzzzzzz{{{zzzyyxxxxxwww~}}}}} } } } ~ ~ ~ ~ ~ ~ } } } } | |}||||||||||||}}~}}}|||}||||||{{{{|||}} ~ ~ ~ ~~}~~~~ ~ ~ ~ ~ ~ ~ ~ ~ }}} } } } } } } } } } }}}}}}} } | |||||||||||||||||||||{{{{{{{{ {{ywvuuvvvwvvvvvwwwxxxwwvvuuuusrrrrrrqrrrrrrrrssrrqqppqqqrrrssrrssttuuuuvvuuuvuutsromlkkjjihhga`abb`]ZYYYXWWVVWWWVUUTSTTTTTTSRTTUUUVUUVWXYYXWVYYZ[\]]][[[ZYXWVRRRRRRRRSSSTTTTUTTTTTSSSTTTTVWXYX^fntvvuuvwxxxxxwwwwxxxxxxxxxxxxxxxxyxyyyyyxxxxxxxxxyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzyyyxxxxyyyyyyyyyyyyxxxxxxyyyyxxyyyyzzzz{{||||}~~~~}}}~~ }zxwxyyyzz{{|||}}~ ~|||||||{{{zzzz{{{{{{{zzzyyzzzzzz{{{zzzyyxxxxxwww~~~~~~~~~ ~ ~ ~ ~ ~ ~ } } } } } | |||||||{{{{|||||}}}||||||{|||||{{{{{|||}} } }}|||||}}~~} } } } } } }}}}}||} | | }||}}}}}}}} | |||{{{{{{{{{||||||||{{{{{zzz{{ { {ywutuuuvvvvuvvwwxxxxvvvvuuutrrrrrqqqrrrrrrqqssrrqqpppppqrrssrrssttuuuuuuvvvvuvvutqonllkjjihhaaacca^[YYYYYYYYYYYXWVUUSSTTTSSRTUUVVVUUUVWXWWVUXYZ[\]]]Z[[ZZYXXSSSSSSSSSSTTTTTTTTTSSSRRSSSTVWXYY^gotvvuuuvwxxxxwwwwwwxxwwwwwwwwwwxxxxxxxxxxxxwwwwxxxxxxxxxxxxxxyyyyzzzzzzzzzzzzzzzyyxxxxxxyyyyyyyyyyyxxyyyyyyyywwxxxxyyyzzz{{{{||}~~}||||||}}}} |zwvwyyx|||}|}}}|~~ }}|||||||{{zzzz{{|{{{{{zzzyyzzzzzz{{{zzzyyyyyyyxxx~~~}~}} } ~ ~ ~ }}}}}}}}}}}}|{{{{||||||{{||| |||{{{{{{{{|||||}||||||||||||||} } } ~}}}||||||||||||}}}}} }}}|||||{{{{{zzz{{{{{{{{{{zzzzzyz zzzywutuuvwwwwvwwxxxxxxwwvvvuutttssssrrrrrrqqqqsrrqpppqqqpppqssttttuuuuuuuuvwwwvuutsqpollkkjihhbbbcca^[WXZ\\\ZYZZZYXWVUVUUTTSSSUWWWUTTVVWWWWWVWYZ[]^^]]][YYZ[ZYVVUTTTUUUUUUUUUUVVVVUTRQSSTUVWXYY_iptuvvvvvvwwwwwwvvvwxxxxxxwwwwwwwwwwwwxxxwwwwwxxwwwvvvxxxxwwwwxxxyyyyyyyzzzzzzzyyyxxxwyyyyyyyyyyxxxxxxxyyzzyyxvvwwwxxxyyyyyyyy{{|||}||}||||||| }} } }}}} } |{zxxxyy||}}}}}}~ ~}| |{||||||||z{{{|||{{{{zzyyyzzzzyyyyyyyyyyzzyyyyyxxx~~} } } ~}}}}}}}}}}}}}}||||||}||{{|||||||||{{{{|||||||||{{{||||||||||}}}}}}||{{{{{{{{||||||||}}}|}|||{{{zzzzzzzzyyyzyyyyyyyyyyyyyxvutuuvwwwwvwwwwxxxxvvvuuuttssssssssrrrrqqqqrrqqppqqqqpppqsstttuuuuuuuuvvwwwvvvusrqpnmllkjjieccccb`]WXY[\\\[ZZZYYXWVVVVUUTTTWXYWUTTVXWWWWWWWYZ\^____][YXYZZYWVVUUUUVUUUUUUUUXXWVUSRRTUUVWXYY[ajquvvvwwwwwwwwwwwvwwxxxxxxxxxxxxxxxxxxxxxwwwwwxxxwwwvvxxxxxxwwyyyyyyyyyyzzzzzzzzyyyxyxzzzzzzzzxxxxwwwwxyyzzyyxvwwwxxxyyyyyyyyy{{{|||}}~}}}||||||| | }~ ~ ~ ~~ ~ |{zyxxyy||}~~~~}~||| |{|||||{{{z{{||{{{zzzzyyyyzzzyyyyyxxxyyyyyyyyyyxxx~~}}}}}}}}}}}}}}~~~~}}|||||{{||}}||||||||||||||}|{{zz{{||||||||||}}}}|||{{{{{{{{{{{{|||||||}||||zzzzzzyyyyxxxxwwvvvvwwwwwwwwvvuuuuvwwwwvvvvwwwwwvvuuttssssssssssrrrrrrrrrrqqpqqrqqpppqssttuuuuvvvuuvvvvwwwvutsqpponmllkkhfdddcb`YZZZ[[\\YYYYYYXXXXWWWVVVXYYXVUVWZYXWWWXXY[]_`aaa^[XWWXYYXWWVVVWWUUUUUUUUYXWVUTTTWWWXYZ[[]clrvwwwwwwwwwwwxwwwwxxyxxxxxyyyxxxxxxxxxxxwwwwwyxxxwwwvwwxxxxxxyyyyyyyyyyzzzzzzzzzzzyyyzzzzzzzzxxxxxxxwxyyzzyyxwwwxxxyyyyyyyyyyz{{{||||~}}}}||||||} } ~ ~~~~}| ~}{zyyz{}}}~~||| }}|}|||{zzzz{{{{{zzyyyyyyyyzzzyyxxxwwwxxyyyyyyyyxxx~~~}}|}}}~~~~~~~~~}}|||{{||||||||||||||||}}}}{{zzzz{{||||||||||}}||||||||||||{{{{{{||||||||||zzzzzyyyxwwwvvvussttttuuvvvuuuuuuuvwwwwvvvvvvvvwuuuttsssrrssssttsssrrrrrrqqpqqrrqqpppqsstuuuuuvvuuvvvvvvwwvvusrqqpponmlljhedddcb]\[ZZZ[[YYYZZYYXXXXXXXXXWXYXXWXY[ZXXWXXYZ[^`abcc^[XVWXXXXXXWWWXXWWWWWWWWYXWVUUVVXYYYZ[[\_emtwwwwwwwwwwwwxxwwwxxyxxxxyyyyxxxxxxxxxxxwwwwwyyxxxwwwwwwwxxxxyyyyyxxxyyzzzzzzzzzzzzzzzzzzzzzzyyyyyyyxxyyzzyyxwwxxxyyyyyyyyyyyzz{{{||||||}}}~~}}}}}}~~|}~ }} }|{|||}}~ }|| } }||}|||{zyy{{{{{zzyyyyyyyyyzzzyxxwwvvwwxxyyyyyyyxxx ~ ~ ~ ~~}}}}~~~}}}|||||||||||||||||}}|}}|||{{zyyyzz||||||||||||||||}}}|||{{zzzzz{{{{|||||{zzzyyxxwwwvuuuutsrrrrrstuwvuuuuuvvwxyyyxwvvvuuuvvuuttssttsrrqqqrrqrrrrqqppqqqqqrrqqqqqrrstttuuuvvuuvvvvvvxwwvuuttssrqponnljheddcc`]YVWYZ[YYYYYYYXYYXXYXXXXXYYYYZZ[ZXXWXZ[[\^`bcdea_\YXXXYXYXXXYZZYYYXXYYYZYXWWWXXXZ[[ZZ\^bhpuvvwxwwwwwwwwwwwwwwwwyxxwwxxyzzyyyyyyxxxxxwwwyyxxxxxwwwwxxyyy{{zzyyyxzzzzzzzzzzzz{{{{{{{zzzzzzzzzzyyyyyyyyyyyyyzzzyxxxxyyyzzz{{||||{{|||||}}}~~}}}|||||}}~~ ~~~~~~ ~}||||}}}}~~| | ||||||||{{zyyy{{zzzyyyyyyzzzzz{{{{zyxwwwwxyyzzzz{{{zzy ~~}}||}}~~}}}|||||||||||||||||||}|||||||{zzyyyyz{{{{||||||||||||}}|||{{{zzzzzzzzz{{{{{zyyyyxxwwwwvuuvvussssrsstuvvuuuuvvwxyyyyxxvvuuuuuuuutsstttssrqqqrrqqrrrqppqqqqqqrrqqqqqrsstttuuuuuuuuvvvvvwwwvvvuuttsrqponlkjgfddd`\XWXY[[[[ZYYXXXYYYYYYXXXXYYYZZZ[ZYXXY[\\]_acdeeca^[YXXXXYYYYZZ[ZYYYYYYZYYXWWXXYYZ\\[[\^ekruvvwyxxxxxxxxxxxxxxxxyxxwwxxyyyyyyyyyyyyyyxxxxxxxxxxxwwwxxyyyzzzyyyyyzzzzzzzzzzz{{{{{zzzzzzzzzzzzzzzzzzzzzzzzyyzzzyyxxxyyyzzz{{||||{{|{{{{|}}~~}||{{|{|}}}~~ ~~~~}~ ~}|}||}}}~ ~|zz{{|||||||{zzyy{{zzzyyyyyzzzzzz|||{{zyxwxxxyyzzzz{{{zyy ~}}|||||||||||||||||||||||||||||||||{{{{zzyyyyyyzzz{{{{{||||||||||||{{{zzzzzyyyyyzzzzyyyxxxxwwwwwvuvwxvuvuutttuuvvuuuuvvxxxyyxxxvvuutttttttsstuuttsrqqrrrrrrrrqqrrrrrrqqrrqqrrstttuuuuvvuuuvvvvvvvvvvwwwvutsrpoonmkjhgfea]YWXY[[[[ZZYYXXZZZYYYYYYYYYZZZZ[ZZYZ[\\^_`bdeefhfb_[YXWYYZZ[[[[ZZYYYYZZYYXWWXXYY[\\[[]^insvuuwyyyyyyyyyxxxxxxxxyxxwwxxyyyyyyxxxyyyyyxxxwwwwxxxxwwwxxyyyyyyyyyyyyyyyyyyy{{{{{{{{zzzzzzzzzzz{{{{{zzzzzzzzyzzzzzyyxxyyyzzz{{||||{{{{zz{{|}~~}||{{|||}|}}}~~~~~~}~~ ~}||}}~~~ | zzzz{{{|||||{{{zz{{{zzzzzzzzzz{{{|||||{zyxxyyyyzzyzzzzzyy ~}||{{{{z{{{{|||||||||||||||||{{||{{{{{{zzyxxxyyzzzzz{{{|||||||||||{{{zzzzzyyyyyyyyyyyxxwwwwwvvvwuuuwxwwxwvvuuuuvuuuuuvwxwwwwwvvwvuuttttttssttuuutsrrqrrsstttsrrsrrrrrqqrrqqrsstuuuuuuvvvvuvvvvvvvvvwwwxwvutrqponnmkjhgfc`[XXXYYZZZZZZZYZZZZZYYYYZYYZZ[[ZZZZ[[\\^_acdeffljfb^[YXYYZ[\[[[ZZYYYYZZZYXWWWXXY[\\[[]_mpuvuuwyyyyyyyyyxxxxxxxxyxxwwxxyyyyxxxxxxxxxxwwwwwwwwxxxwwwxxyyyxxxyyyyyyyyyyyyy||||{{{{zzzzz{{{z{{{||||zzzzzzzzzzz{zzyyxxyyyzzz{{||||{{zzzzz{{|}}}|||{{}}}}}}~~~~~~~~~~~}}~~ ~}}~~}}}~~~~~}}}~~~} {zzzzzzzzz||||{{{{{{{{{{{{zzz{{{{{||||||{zyyyyyyzzyzzzzyyx ~}||{{{{zzz{{|||||||||||||||{{zz{{{zzzzzzzzzyyyyzzzzyyyy{{{{{{{{{|||{{zyzzyyyyyyxxxxxxxxvvvvvvvvttuvwxxyyxxwvuvuuuttttuuvvvvuuuuvuuuttssttttttttuutttssstttssrrrrrrrrrrrrrqqqqrruuuuuuuuvvuuuuvvvvvvvvvvvvuusrqpqpnljhgfca^ZXXXYYZ[\\[ZZZZZZZZZZZZZZ[[\\ZZ[[\]]^_acddeginmjhc^ZXYYZ[[\\\ZZYYYYZZYYYXXXYYY[\[YZ_crstvvwwwxxxxxxxxwwwwxxxxxxxwwwwwwwxxxxwwwwwwwwwwwwwwxxxxwwwwwwwwwwxxxxxyxxxxxxyy{{{{zzzzzzzzz{{{{{{{{{||{{zzzz{{zzzzzzzzyyyzzzzz{||||{{zzzzzzzzz||||||{{}}}}}}~~~~}}~~~~}}}||}}~ ~~~~~~~~~ ~~~~} {{{{{{{{{{{||||||{{{{{{||||{zzyyzz{|||||{zzzzyyyyyyyyyyyyyy ~}|{{{{zzz{{{{{{{{||||}||||{{zzzzzzzzzzzzzzyyyyyyyyzzzz{{{{{{{{{|||{{zyyyyyyyyyxxxxxxxxvvvvvvvvuuuvwxxyxxxwvuuutttsstttuuuuttttuuuuttttuuuutuuuuutttssssssssrrrrrrrrrrrsrrrrrrssttuuvvwvvuuuuuuvvvvvvuuuuuuutsrrrpmjhfeca^[XXXXYZ[\\\[ZYYYZZZZZYYZ[[\\\YZ[\]^_`aceffhkmonmjf`\XWXYZ[\\\ZZYYYYZZZYYYYZ[[Z\\[Z[afrstuvwwwwwwwwwwwwwxxxxxxxxwwwwwwwwxxxxwwwwwwwwwwwwwwwwxxwwwwwwwwxxxxxxxxyyyxxxxxzzzzzzzzzzzzzzzzzzzz{{{{{zzyyzz{zzzzzzzzzzzzzzzz{{{||{{zzzzzzzzzz{{{||||}~~~~~~~}}}}}~~~}}}}||||}~~ ~ ~~~~}}}}}~~ ~}}~| {{|{{{{{{{{||||||{{{{{{{{zzzzyyyyzz|||||{zzzzyyyyyyyyyyyyyy ~}|{{zzzzzzzzzz{{{||||}||||{{zzyyyyzzzzzzzzyyyyyyyyzzzz{{{{{{{{{|||{{zyyyyyyxxxwwwwwwwwvvvvvvvvvvvwwwxxwwwvvuuuuuttttuuuttttttsttuuuuuuvvuuuuuuuutttsssrrrrrrrrqqrrrssssssssssssstuuvwwvvuuuuuuvvvvuuuuuuuuuuttsrpnkigfdc`]ZYXXYZ\\]\[ZYYYYYYZYXYZ[\\\\YZ\]_abcabdeegkmqqpnic]YWXXYZ[[[ZYYYYYYZZZZZ[\\]\]]\[_ekrstuvvvvvwwwxxxxxxxxxxwwwwwwwvvvvwwxxwwvvvvvvvvvwwwwwwwwwwwwxxxxyyyyyxxxyyyyxxxxyyyyyyyyzzzzyyyyyyyzzzzzzzyyyyzzzzzzzzzzzzzzzzzzzz{{{{{zzzzzzzzzyzz{{|||}~~~~~~~}||||}}}}}||||||}}}~~}~ ~}}}}}~~~~~}}~~~~~ ~} |{||{{{{{{{{||||||{{{{{zzyyyzzyyyyzz|||||{zzzzyyyyyyyyyyyyyy }|{zzzzzzzzzzz||||||||{{||{{zzyyyyzzzzzzzzyyyyxyyyzzz{||||||||{|||{{zyyyyxxxxxvvvvvvvvvvvvvvvvwwwwwwwwwvvvvvvvvuuutuuvuuutttttttuuuvvvwvvvvuuuuutttsssrrrrrrrrqqrrrsssttuuuutttuuuvvwwvvuuuuuuvvvvuuuuuuuuutsssrpomkihfeb_][ZYZ[\]]\[[ZYYYXXXWWYZ\]]\\YZ\^`bdddefffhkmrrrqle^ZXYYYYZYYYYYYYYYYZ[[[\]^____]]aiostuuvvvvwwxxxyyyxxxxwwwwwwwwvvvvvwwwwwwvvvvvvvvvwwwwvvvvwwwxxxxxyyyyyxxxyyyyxxwwxxxxyyyyzzzyyyyyyyyyyyzzzzyyyyzzzzzzzzzz{{{{{zzzyzz{{{{{zzzzzzzzzzzzz{{{}}}}}}~~~}}||||||||||||||||}}}}}~~ ~~~~~}~~~~}}|~}}}}~} |||||||||||||{|||||{{{{zzyyyy|{{zz{{||||||{zzzzyyyyyyxxxxxxxx ~~ ~ |{{|{{{{zzz{{|||{{zzzzz{{{{zzyyyz{{{|zzzzzyyyzzz{{{{{{{{{{{{{{|{{{zzzwwxxxxyywwwwvvvvwwxxwwvvwwwvvvvvuutttuvwwvvutuuuuutttttsttuuuvvvvvvvuvuuuuuuutttsssssssssssrrrqqssttuuuuuuuvvvvvvvuuuuuuvvvvuuuuuuutttssrrqpomlkhfd`^[ZY[[[[[[ZZZYXXXXXXYZ[\\\[[Z[^`befgegghhiknrrqqnic^\ZYYZ[ZXYYYYYYYZZ[[\]^^^`^[[^elrsttuvvwwwwwwwwwwxxxxxwwwvvvvvvvvxxxxxxxxwwwwwwwwwwwwwwwwxxxxxyyy{{zzyyyxyyyyxxwwxxxyyyyyzzzyyyxxyyyyyyyyyyyyyxxxyyyyyyzzzzzzzzzz{{{{{{{{zzz{{{{{{{{{{{{{{|||}}}}}}}|||||}}}}}}}}||||}}}}~~~~~~~~~}}}||{~}}}|}}}}}~~~}|||||}||||{{{zz{{{{{{||||{{{{{||||||||{||||||{zzyyyyyyyyxxxxxw ~ } |||}||{{z{{{||{{{zzzzz{{{{zzyyyzz{{{zzzzzzyyzzzzzzzz{{{{{{{{{{{zzyyyxxxxxxxxwwwwvvvvwwwxwwvvwvvvvvuuttssstvvvvuuuuuuttttttttttuuuuuuvvvvuuuuuuuuutttttsssssssssrrrqqssttuuuuuuuvvvvuuuuuuuuuuuutuuuuuuuttsssrqqponmlhgeb^ZXWYYYYYZZZZYYXYXYYZ[\\\\[ZY[^adghifgijijlnrqqpokfa]\YYZZYXYYYZZZZZ[[\\]^^_`^[[_gntttuuvvwwxxwwwwwwxxxxwwwwwwwwwwwwxxxxxxxxwwwwwwwwwwwwwwwwxxxxxyyyzzzyyyyyyyyyxxxxxyyyyyyyzzzyyyxxxxxxxxxxyyyyyxxxyyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{|{||}}||||}}||}}}}}}}}||||||||}}~~~~}}}~~~~~}}||{{zz}}}}||||||||}~ ~}|{{||}|||{{{zzz{{{{{{|||{{zz{{||||||||{|||||{{yyyyyyyyxxxxxxxx ~ } ~~}}||{{{{{{{{{{{{zz{{{{zzyyyyzzzz{{{zzzzzzzzzzzzzzzzzzzzzzzzyyyxyxxxxxxxxwwwwvvvvvvwwxwwwvvvvuuutsrrrrtuvvvvvuuutttttttttttuuutuuuuuuuuuuuuuuuuuuuttttssssssrrrqqssttuuuuuuuvvvvuuuuuuuuuttttuuuuvuuttsrrqqpponmmhhfc_[XVWXXYYYZZZZYYYYYY[\\\\[ZYWY]adghifhkkkkmoqpppomhe_]ZYYZYXXYZ[[[[[[[\]]^___][\aiqwvvvvwwwwxxxwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzyyyxxwwxxxxyyyyyyyxxxyyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||}}}}}}}}}}|||||||||}}}}}}||~~~}}}|||||{zzz|||||||||||}} }}|{{{||||{{zzzzz{{{{{{|{{zzzz{{|||||||||||||{zzyyyyyxxxwwwwxxxx ~ ~~~}||{{|{{{{{{{{zz{{{{zzyyyyyzzz{{{{{zzzzzzzzyyyzzzzzzzzzzyyyxxxyyxxxxwwwwwwvvvvvvwwxxwwvvvuutttrqqqrstuuuvvuuttstttttuuuttttttttuuuuuuuuuuuuuuuuuutttsssssrrrqqssttuuuuuuuvvvvvvvvuuuuutuuuuuuuuututsrrpppponnnihgeb^ZWWXXXYZ[[ZZYYXYYY[\]]\[YXWY]`ceffgilmmmnopooppnkha^ZXYYYYYY[\\\\[[\\]^^___][\bjsyvvvwwwwxxxxwwwvvvvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxwwwwwwwwxxxxxyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzyyyxxxxxyyyzzyyyyyxxxyyyyyyzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{zz{|||}}~~~~~~~~||||||||}}~~~~}}||~~~~}}|||}}|||{{z}}}|||||}}}}~ }||{{{|||{{{zzzyz{{{{{{|{{zzzz{{|||||||||||{{{zyyyyxxxxxwwwwwxxx ~ ~}||||||{{{zzzzyzz{{zzyyyyyyyzzzzzzzyyywxxyyzzzyyzzzzzyyyyyyxxxxxxxwwwwvvvvvvvvwwxxxxwwvvuvuttssrrrrrssuuvvuuutssttttuuuuuutttttuuuuuutuuuuuuuutttttssstssssrrrttttuuuuuuuvvvvvvvvuuuuuuuuuvvuvvustttrpppoonnnnmjgfeb]YXXXXYYZ[[ZXVVWYZZZZZZZYYVY\`dfghijlnooooonnnooljc_\YYZZYZZZ[[\\\\\]]^^^^_\Z^fnsuuvvvvvwwwwwwwwwwvvwwwwwwxxxwwxxxxxxwwwwvwwwwwwwwwwwwwwwwxxxxxxxxxxxyyyyyzzyyyyyyyyyyyzzzzzzyyyyyyyyyyzzzyyyyyyyyyyyyyyyyzzzzzzzzyyyyyyzzzzzzz{{{zz{{{{{{{{{zzzzz{{||||}}}}}}}}}}}}}|||||}}}}}}}}}||}}}}}||||}}|}||||~~}}}||||}~}}} ~||{{zz{{|||{{{zzzzzz{{||||{{zz{{||||{{zzz{{zzzzyyyyzzyxxwvwwxxxww ~ ~ ~ ~}}||||||{{zzzzyyyzzyyyyyyyyyyyyyyyyyyywwxxyyzzyzzzzzyyxxxwvvuuuuuvvwwwvvvvvvvvwwxxxxwwvvuuuttttssrrrssuuuuuuutttttttuuuuuttttttuuuuuutttttttttttttttssssssssssuuuuuuuuuuuuvvvvvvvuuuuuuuuuuuuvvuttutrqpponnnnnnligda]YYYXYYZ[[[ZXVVWXYZZZZZYYYWY^bfijjnnopppooonnopomkc`\ZZ[ZZZZ[[[\\\\\\]]^^^^\[`hptuuuvvvvwwwwwwwwwwwwwwwwxxxwwvvwwxxxxxwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxyyyyyyyyyyyyyyyyyzzzzzzzzyyyyyyyyzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyzzzzzzz{{{{{{{{{{{zzzzzzzz{|||||||}}||||||||||}|||}}}}}}}}}||}}}~~}||||||||}|}||~}}}||{{z{|||} ~|||{{zz{{||||{{zzzzzz{{{||{{{zz{{{zzzyyyyxzzyyyyyyyyyzyyxwwwxxxwwv ~ } } } ~ ~ ~~~~~}}||||{{{zzyyxyyyyyyyyyyyyyyxxxxxxxvvwwxyyyyyyyyyxxwwvuuuuttttuuvwwwwwwwwwwwwxxxxwwuuuuuuttuttsssstuuuuuuututuuuuttttttttsstuuuuuutssssssssssttttttssssttttvvuuuuuuvvvvvvvvvvvuuuuuuuuuuuuvwvuuvvsqqpoonnoonnmid_[ZZZYYZZ[[\[YXXXYZ[[[[ZYXWW[`fjmnnqqqpppooonnoqpnlda][[[[[[[[[[[[[\\\\]]]^]\]dlruuvvvvvvvvvvvvvvvvwwwwxxxxwwvvvvwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyzzzzzzz{{{{{{{{{{{zzzzzzzz||||||||{{{{zzzz{{|||}}}}}}}}}}}||}}}}}}~~}}}|}}|||}}}||}}|||{{zz{{{{| ~|{||{{zz{{|||||{{{z{{{{{{{{z{{{{{{zyyyyxxxwyyxxyyyyxyyyyyxxxxxxxwvv ~ ~ ~~} } } } } } }~~~~~}}||||{{{zyyxwwxxyzzyyyyyyxwwwwwwwvvvwwxxyxxxxxwvuuuuuuuuuuuuvvvvvwwwwwwwwwwxxxxwwuuuuuuuuuuttssttttuuutttuuuuuuttttttsssstuuuuuutssssssssssstttttssstttttuuvvvvvvvvvvvvvvvvvvvvuuuvvvvuuvxwvvvvtsqqpooooonpokc][[[[ZZZZ[\]\[ZZZ[[\\[[ZYXWX\bhmpqqqqpppooooonpqqomea^[[\\[[[[[[[[[[\\\]]]]]]_fntvuvvvvvvvvvvvvvvvvwwwxxxxxxwwvvwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyzz{{{zzzzzzzzzz{{{{{{zzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyzzzzzzz{{{{{{{{{zzzzzzz{{{|||||{{{zzzzzyyy{{{{{|||||||||||||}}}}||}}}}}|||}}|}||||||||{{zzz{{{z{}|zz{|{{zz{{|}}|||{{{{{{{{{{{z{{||{{zyyyyxxxxxxxxxyyyxxyyyyyxxxxxxwvv~~ ~~~}}}}}}} } } ~~~}}}}}|||||{zyxwvwwwyyyyyyyyxxvvvvvwwwxxxxxxxwwwvvvutttuuvvvuvvwwwvvwwwwwwwwvvvvvvvvuuuttuuuttttssssssssssssuuuuuuttttssrsssuuuuuuuusssssssstttttuttuuuuttttuuvvvvvvvwwxxwwvvvvvvvuuvvvvvvuuxxwwvvvusrqqpppppqqmga\Y\[YZ\]]\\\\\[\\\^^^]\[YYY\ahnqqpopppponnpnnoqqpnea\YZZ[\[[[[[ZZZ[[[[\\\\]]ahpuvuvvvvvvvvwwwvvvuuwwwwxxxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyxxxxxxxxzzyyyyyyyyyyzzzz{{{{{{{{{{{{{{{{zzzzzzyyzzzzzyyyzzzzzzzzxyyyyyzzyyyyyyyyzzzzzzzzzzzzzzzzzzzz{{{{{{||||||{{{{zzzzyyzzz{{{{{{||}||||||||||}}}|{zzz||{zzzzz{{{{{{{z{{zzz{|}~}|{zz{{{{{{{{|||{zz{{{{{{{{{{||||{{zz|{zyxwxxxxxxxxxxxxxxxxxxxxxwwvvv~~ ~~~~}}}}}}}} ~~~}}}}}||}|||zyyxxwwwxxxxxxxxvvuuuvwxxxxxwwwwvvvvvvvvuuvvvvvwvvwxxxwwvvvvvvvvvvvvvuuuuuttttuuttttttssttttttttuuuuttttutssssstuuuuuuuussssssssttttuuuuvuuuuuuuuuvvvvvvvwwxxwwvvvvvvvuuvvvvvvvvwwwwvvvvttsrrrrrsssrnha]\ZYZ\]]\[[[[[\]]^^^]\[ZZZ[_ekopoppqqqqpppoopqrpnfa\YYZ[[[[[[ZZZZZZ[[\\\]\_djquvuvvvvvvvvwwwwvvvvwwwwxxxyxyxxxxxxxxxxxyyyxxxxxxxxxxxyyyyyxxxxxxxxzzyyyyyyxyyyzzz{{{{{{{{{{{{{{{{{zzzzzzyyzzzzzzzyzzzzzzzzyyyyyyzzyyyyyyyyzzzzzzzyzzzzzzzzzzz{{{{{{{{{|||||{{{zzzzyyzz{{{{{{||||||||||||||||{zzyyxzzyyyyyz|{{{{{zz{{zyzz{{||||||{{{{{{{{{{{{zzyzzz{{{{{||||||{{{{z|{zyyxxxxxxxxxxxxxxxxxxxxxwwwvvv ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~}}}}}||||||{zzyyxwvwwwxxxxxvvuuuvxyyyyxwvuutttuvvwwvvvvvvvvvvwxxxwwvvvvvvvvvvvuuuttttssssttttttttttttttttttuuttttttuutsssttuuuuuuuutttttttttttuuuvvwwwvvvvvuuuuvvvvvwwxxwwvvvvvuuuuvvvvvvvvwwwwvvvvvvuutuuuvvvvvpha[ZYZ\]]]\[ZYZ[]^^^^^]\[ZZZ\`fknnpqrrrrrrqqqrrromd`[XXYYY[[ZZZZZZZZZ[\\]]\ahnrtuvvvvvvvvvwwwwwwwwwwwwxxxyyyyyxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzyyyyyyxxyyzz{{zzzzzzzz{{{{{{{{zzzzzzyyyzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyy{zzzzyyyyyzzz{{{{{{{{zzz{{{{{{|||{{{zzzzzzz{{{||||||||||{{{{{{{{{{{zzyyxzyyyyzz{||||{{zz{{zzzzzz{{{{{{{{{{{{{{{{zyyyxyyzyzzzz{{{{{{{{{{{||{{zyxxxxxxxxxxxxxxxxxxwwwwvvvv}}}} } } } } }}~~~~~ ~~ ~ ~ ~~~~~~~~~~~~~~~~~}}}}}}|||||{{{{yxwvwwxxxyyyxxwvvwxyzzywvuutrssuvvwxvvvvvuuuuvvwwwvvvvvvvvvvvvuuttsstssrrsstttttuuuuuuuuuuuutttttttsuuttstttuuuuuuuuuuuuuuuutttuuvvvwwwwwwvvuuuuuuvvvwwxxwwvvvuuuuuuuuvvvvvvvvvvwwwwxwwvvvwwxvwyzulc[ZYY\^^]]\ZYYZ\]^^^^]\\[[ZZ]cimnqqrsttttsssssqnk`\XUVWYYZZZZZZYYYZZ[\]]^\ckqstuwvvvvvvvvwwwwwwwwwwwwxxxyzzyyyxxxwwxxyyyyyyyyyyyyyyyyyyzzyyyyyyyyzzyyyyyywxxyz{{|zzzzzzzz{{{{{{{{zzzzzzyyyyyzzzzz{{{{{{{{{zzzzzyyyyyyyyyy{{zzzyyyyyzzz{{{{{{{zzzzzz{{{{{{|{{{zzzzzzz{{||||||||||{{{{{{{{{{{{{zzzz{{{{{|}}}}||{{zz|||{{{{{{{zzzzzzzzzzzzzzyyxxxxyyxxyyyzzz{{{{{{{{||||{zyxxxxxxxxxwwwwwwwwwwwvvvuu| } } ~ ~ ~ } ~~~~~~~ ~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~}}|||{{{zz{{zwtvvvvwxxxwwwvvvvw{{zxvutstttuvvvvuuuuuuuuuuvvvvvvvvvvvvvvuuuttsssrrrrrrrrttttuuuuuuuuvvvvttttttttuuttttuuuuuuuuuuvvuuuuuutttuvvvvwwxxwwvvuuuuuuuuvvvwwvvvuuuuuuuuvvvvvvvvvvvvvvwwwwwwwwwwwwxyxuoj_\YXY[\\[ZZYYYZZ[\]]]\[Z\ZZ\bhmoqrtuuvuusvusttneZYVUUVXYZZZYYYYY[[[[[[\\^ensttuvvvvvvvvvvvvwwwxxwwwvwwxxzyyxwwwxxxxxxxxxwxxxyyyyzzyyyyyyyyyyyyyyxxxyyyyyyzzzzzz{{zzyyzzz{{{{{{zzzzzzzzzzyyzzz{{{{{{{{{{{zzzzzzzzzzzzzzzz{{|{{{zzzzzzz{{{|||{{zzzyzzz{{{|{{{{zzzz{{||||||||||{{{z{{{{{{{{{{{{||||||||}}}~~~||{{{{}}|||{zz{{{{{{{{zzzzzzzzyyyyyyyyyyyyyyyy{{{{{{{{{{{{zyxxwwwwxxxxxxxxxxxxxxwwvvvv}}}~~ ~ } } }}}}~ ~ ~ ~ ~~~~}}}}}}}}}}}}}}}}}}}}~ ~ ~ ~ ~ ~ ~ ~ }}}|}||{{{z{|zxuuuuvwxxyvvwwwwww{{yxvutstuuuuvuuttttttttuuuvvvvuuuuuuuuuuuuuttttssssssssttttttttuuuuuuvvuuuuuuuuuuttttuuuuuuuuutvuuuuuuuttuvvvvvwwwxwwvvvvvvuuuuuvvwwvvuvvuuuuvvvvvvvvvvvvvvvvwwwwwwwwwwvvwxwuqmb^ZXXZ[[[[ZYYYZZ[\\\\[ZYYXX\binqrstuvvvutwvtttlbWVTTTVXXZYYYYYYYZZZZ[[[[`goststuvvvvvvvvvvvwwwxxxxwwwwxxyyxwwwwxxxxxxxxwwwxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzyyyzz{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{zzzyzzzzzzzyzzzzzzz{{|||{zzzzzzz{{{||{{{zzzzzzz{{{{zzzyyyyy{{{{|||||||{{{zz{{{{{{{{{{{{{{||||||||||}||{{zzz|||{{{zzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyzzyyyyyyyyz{{{zyyxwwxxxxxxyyxxxxwwwwwwvvvv~}}}}}}}} } } } } } } } ~~~~}}}}}}}||||||}}}}}}~~ ~ ~ ~ ~ ~ ~ ~ }}}}}||||{{|}|yvuuvvwxxyvvwwwxxx{zyxvuttuuvuuuuuttttttttuuuvvvvuuuuuuuuuuuuuuvvvttttttttttttttssttuuuuuuuuuuuuuuuuttttuuuuuuutttuuuuuuuutuvvwwwwvvwwxwwwwvvvvuuuuvvwwvvuwvvvvvvwvvvvvvvvvvvvvvwwwwwwvvvvvuuvvurpfa[WWXZ[\[ZZYYYYZ[[\[ZXWVUV[binqrstuvvvutwvssslbWVUUUWXYYYYYYYXXZ[[[[[[[bgossstvuuuuuuuuvvvwwwxxyyxwwwxxyxwwwwwxyxxxwwwwwwwxxxyyyyyyyxxxxxxyyyyyyyyyyyyyxxyxyyyyyyyyyyz{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzyyyzzzz{yyyzzzz{{{|||{zzzzzzz{{{{{{{{{{{zzz{{{{{zzyyyyyyzzz{{{||||{{zzzz{{{{{{{{zzz{{{{{{{zzzzzzzzzzzyyy{{{{zzzzzzzzzzzzzzzzzzzzyyyyzzzzyyyyzzzzyyyyyyyyzzz{zzyyxxxxxyyyyyyxxwwwwwwwvvvv~}}||||}|||||}} } ~~~~~~~}}}||||||}}}~~||||||||{{{}}|ywwwwwwwwwvvwwxxxyzzyxvvutuuuuuuuuuuuuuuuuuvuvvvvuuuuuuuuutuuuvvvwuuuuuuuuttttsssstttuuuuuuuuuuuuuttttttuuvvuuutttuuuuuuuuuuuvwwwwvvwwxxwwwwwvvuuvvvvwwvvuwwvvvvwwwwwwwwwwvvvvvvwwwwwvvuuuuttuvutshc\WVXY[\\[ZYYYYZZ[[ZYWVVUVZainqqrtuuuuusvussslbYYXXXYZZYYYYXYYY[\\\\\\]bgnsstuwuuuuuuuuvvvwwwxxyyxxwwxxxwwvwwxxyyxxwwwwwwwwxxxyyyyxxxxxxxxyyyzzyyyyyxxxxxxxxyyyyxxxyyz{zz{{{{{{{{{{{{{{||{{{{{z{{zzzzzzyyyzzz{{yyyzzz{{{{||{{zzzzzzz{{{{{{{{{{{{{{{{zzzzzzzzyyyyyzz{{{{{{{{zzzz{{{{{{{{zzzz{{{{zzzyyyyyyyyyyyxxzzzzzzzzzzzzzzzzzzzzzzzzyyyzz{{{yyzzzzzzzzzzzzzzzzz{zzyyxxxxyyyyzyyxxwwvvvvwwwww~}|{{{||} } | } } |}}~~~ ~ ~}}}}}}}}}}}}~~}||zzz{{y|~~|zxxwwwwvvvvvwwwxxxxxxxxwvuuttttuuuuuuuuutttuuuvvvwwuuuuuuuutuuuvvuussttuuuvtttttttttttuuuuuwwwvuuuussttuuuuvvuuuuuuuuuuuuuuuuuvvvvvwwwwwwwwwwvvvuvvvvvvvvuuvvvvvvvvwwwwwwwwvvvvvvvvvvvuuuuusttttuuume\VVXYYZZZYYYYY\[ZYYYYYWXWV]iqprrsstuuuuttturke\[YYZZZY[[[[[[[[\]]]\\^`dhnrttuuuuuuuuvwwwwwxxxxxxxwwwwwxxxxxxxxyyyyyyyyxyyyyyyyyyyyyyyyxxxxyyyz{zyxxxxxxxxxyyzzyyyyzzzzzzz{{{{{{{{{{||||||{{zzz{{{zzzzzyyyzz{{{yyyzzz{{|{{{zzzy{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzyyyyzzzzz{{|{{{{{{{zzzyyzzzzzz{{zzzzzzzzzzzzyyyxzzzzzzyyyyyzzzzzzyyyyyyyyyyyyyyzyyyyyz{{zzzzzzzzzzzzzzyyyyxxxxyyzyyyxxwwwwwxxxxx}}|{{||}} } | | ||}}~~~~ }}}}~~~~~~~~}}}}~~}|{yyyyyz|}|zxxxvvvvvvvvuuuvvwwwwwxwwvuuttttuuuuuuuuuuutttuuvvwwvvvvvvvvvwwwvuuurssttuuuttttttttuuuuuuuuvvvuutttttttuuuuuutttuuuuuuuuuuuuuuvvvvvwwwwwwwwwvvuuvvvvvvvuuuuuuuvvvvvvvvvvvvvvvvvvvwwvvuuuuuvtttttuuuph_XWXXXYYYYZ[[[\[ZYYYYYXYXV]iqqrsssttuutsstuqjd][YYZ[ZY]]]]]]]]\\]\[\_bgjorttuutuuuvwxyxxxxxxxxxxxwwwwwxxxxxxxxyyyyyyyyyyyyyyzzzzyyyyyyxxxyyyzzzzyxxxxyxxyyyyzzyyyyzzzzzzz{{{{{{{{{{|||||{{{zzzzzzzzzzyyyyyzzzzyyyzz{{{{{{{zzzz{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzyyyyzzzzz{{||||{{{{{zzzyyyyyzzzzzzzzzzzz{zzzyyyyzzzzzzyyyyzzzzzzyyzzzzzzzzzzzzyyyyyyyz{{zzzzzzzzzzzzzzyyyyxxxxxyyyyxxxxwwwwxxxxx{{|||}}}} | | ||||}}~~~~~~||}}~~~~~}~~~}~}{yxxxxz||zxvvwvvuvuuuuuuuuuvvvwwwwvvuuttttuuuutuuuuuuuttuuvvvwwwvvvvvvvwwwvuuurssttuuuuuuuuuuuvvvvvvvvvuuuuttsttttuuuuuttttuuuuvvvvuuuuuuvvvvvvvvvvvvvvvvuuvvwvvvvuuuuuuuvvvvvvvvvvvvvvvwwwxxxwvvuuuvvvvuuuuuuumb[YYXXXYYZ[[\\\[ZYYYYYYZXV\iqqsssttttttsstuqjd^\ZZ[\[Z]]]]]]]][\\[[]`cjmqsttuuuuuvwxyzyyyyyxxxxxxwwwwwxxxxxxxxyyyyyyyyyyyyzzzzzzzzyyyyxyyyyzzzzyyxxxyyyyyyyyzzyyyyzzzzzzz{{{{{{{{{{|||{{{{zzyyzzzzyyyyyyyyyyyyyyzz{{{{{{{{{zzz{{{{{{{{{{{{{{{{zzzzzzzzyyyyyyyyyyyyzzzzz{{||||{{{{{{{zzyyyzzzzzzzzzzzzz{{{zzyyyzzzzzzyyzzzzz{{{yyzzzz{{{{zzzzyyyyyyyz{{zzzzzzzzzzzzzzyyyyxwwwxxxxxxxxxxwwwxxxxxz{{|}}}} | | | |||||}}}~~~~~}}}}~~~~~~~~}}~|zyxxx{|{xvuvwvvuuuuuuuuuuvvvvwwwwvuutttttuuuutttuuuuuuuuuuuuuwvvvvuuutuuuvuuussttuuvvvvvvvvvvvvvvvvvvvvvuutttttuuttttttttttuuvuuuuvvvvvvvvvvvvvvvvvvvvvuvvvwwvvvvuuuuuuuvvvvvvvvvvvvvvvwwxxxxwwvvvvvvvvvvvvvvxpe]ZYXXZZZZ[[[\\[ZYYYYYZ[XV\iqrssstttttuttuuqke^\ZZ[\[Z\\\\\\\\[[[ZZ]adlortttuvvvvwwxzzzzzyyyxxxxxwwwwwyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzyyyyyyzzz{yyxxxyyyzzzzzyyyyyyyzzzzzzz{{{{{{{{{{{{{{{{zzzyyzzzyyyyyyyyyyyyyzzzz{{{|zzz{{{{{{{{{{{{{zzzzzzzz{{{{{{{{yyyyyyyyyyyyzzzzz{{||||{{{{{{{{{z{{{{{{{{{{{{{{{{{{{zzyyzzzzzzyyzzz{{{{{yyzz{{{{{{{{zzyyyyyyyz{{zzzzzzzzzzzzzzyyyyxwwwwwwwwxxxxxwwwxxxxx|||||}}} ||||||||}}~~~~~~}}}~~~~ ~~~~~~~~||}}}{yxxy~{xvvwvvwwvvvuuuvvvvvvvvvvvvvuuuttuuuuuttttuuuuvvvuuuuuuvvvuuuttttttttttuuuuuvvvvvvuuuuuvvvvvvuuvvuuutttuuuututtttuuuuuuvvuuuvwwvvvvvvvvvvvvvvvvvuuvvvvvvvvvuuuuuuuvvvvvvvvvvvvvwwxxxwwwvvvvvvvvvvvvvvvvvtmc[WX[YYZ[[[[[[[ZZZZZZ[YWY`horsssssssstttutqlh^\ZZ\\\\]\\\[\[[[ZYY\afipqrtuvvvxxxxyyzzzzzzzyyxxxxxxyyyzzzzzzzzyyyyyxxxwwxxyyyzzzzyyyyyyyyyyyyyxyyyzzz{{zyyyyyyyyyyzzzzzzz{{{{{{{{zzzzz{{{{{zzzzzzzzzzzyyyyyyyyzzzz{{{|zzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzyyzzz{{{{{{{{{{{zz{{{|||||||||||{{z{{{{{||{{{zzzyyzzzzzzzzzzzzzzzzzzz{||||||||{{{{zzyyyzz{zzz{zzyyyyyyzzzzyyxxwwvvwwwwwwwwwwwxxxxx| |||||||}}}}}}}}}}}~~~~~}}}~~~~~~~~~~~~~~~~}|{|}|{yxy{}zwvvwwvxxxwwvvvvvvvvvvvvvvuuuuuuuuvvuuuuuuuvvvvvuuuuuuuuuutttttttttttttuuuuvvvvvvvuuuuuvuuuuuuuttuuuvvvvvuuuuuuuvvwwwvvvvvuuvvwvvvvvuuuvvvvvvvuuuuvvvvvvvvvvvuuuuuuuuuuvvvvvuuuwwwwwwvvuuuuuuuuuuuuuuuuutog^XXZYYZ[\\\\ZZZ[[[[[[YX[bjpssssssssstssttrnka_\[[\\[[[[[ZZZZZZ\_dinqstuvxxxxyyyyzzzzyyzzzyyxxxxyyyyyyyyyyyyyyyyyyyyxxxxxyyyyyyyyyyyyyyyyyyyyxyyyzzz{{zzyyyyzzzzzyyyyzzz{{{{{{{{zzzzz{{{zzzzzzzzzzzzzzzyyyyyyzzzz{{{|yzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzz{{{{{{||zzzzzzzy{{{{||||||||{{{{{{{{{{{{{{{zzzyyzzzzzzzzzzzzzzzzyyyz{{||{{||||||{zzyyyzzzzz{{zyyyyyyzzzzyyyxxwwvwwwwwwwwwwwxxxxx}}} }}}}}~ ~~~~~~~}}}}}~~~}}}}}}}}~~~~~~~}}}}||{{{{{zxxz}|yvuvwwwyyyxxxwwwwwwwwwwwwwvvuuuvvwwwwvvvvvvvvvvvuuuuuuuttttttttttttttttvvvvvvvvvvvuuuuuuuuuuuuuttuuvvvvvvvvvuuuvvwwwwwvwvvuuvvvvvvvvuuuvvwwvvuuuuuvvvvvvvvvvvvvuuuuuuuuvvvvvuuuvvvwvvvuuuuuuuuutttuuuuuuusmd]ZZYZ[\]]]][\\\[[[[ZYZ^ekqssssssssstsrstsqnda^[[[ZY[[ZZZZZZZ\`fkostvwxyyzzz{zzzzzyyxyyyzyyyyyyyyyyyyyyyyyyyzzzyyyyyxxxxxyyyxyyyyyyyyyyyyyyyxyyyzzz{zzzyyzz{zzzzyyyyzzz{{{{{{{{zzzzzzzzzzzyyzzzzz{{{zzzzyyyyzzzz{{{|yyyzzzz{{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{{{||||||zzzzzzzy{{{{{{||||{{{{{{{{{zzzzzzzzzzzzz{{{{{{{{zzzzzzzzyyyz{{||{{{|||||{{zyyyyzyz{{{{zzyyyyzzzzzyyyxwwwwwwwwwwwwwwxxxxx}}}}}} } } ~ ~ ~ ~~~~~||}}}}}}~}}}}}||~~~~~}|||{{zzzzzxwx{~{xuuvwxwzyyyyxxxxxxxxxxxxxxxwwwvvwwxxwwwwwwvvvvvvuuuvvvuuuuuuuuuuuuuuuuuvvvvvvvvvvvuuuuuuuuuuuuuuuuvuvvvwvvvvvvvvvvwwwwvwwvuuuvvvvvvvvvvvwwwvuuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuvvvuutuuuuuuuuttuuuvvvuwwria\ZZZ[\]^^^]]]\\[[ZZZ[`gmrttttttttttrrrttsrkgc`^^]][[\\\\\\aeinsuvwwwyyz{{{{{zzyyyxwxxyyyyyyyyyyyzzyyyyyyyyzzzzyyyyxxxxxxxxxxxxxyyyyyyyyyyyxyyyzzz{zzzzzz{{{zzzyyyxzzz{{{{{{{{zzzzzzzzzzyyyzzzz{{|{zzzzzzyyzzzz{{{{yyyzzz{{{{{{{{{{{{{{{{{{zzzzzzzz{{{{||||||||||||{{{{{{zzzz{{{{{{{{{{{{zz{{{zzzzzzzzzzzzz{{{{{{{{{{{{{{{{zzz{||||z{{{||}}|{zyyyyyyz{{{{{{yyyyzzzzzzyyxxwwwwwwwwwwwwwxxxxx~~ ~ ~~~ ~ ~}}} } } } }}}}}}}}}}}}}}}|||}}~~~~||{zyyxwwwwxy{|}wvuttvwxzzzyyxxxxxxxxxxxyzzzzyxwwxxyyyyxwxxxxxwwvuvvvvvvvvuuuuvvuvvwwwwvwwvvvvvvvuuuuuuuvvuuuuuuvvvvvuuuvvvvvvvvvvvvvvvvvvvvuuuvvvvwwwwwwwwwvvvvvvvvvvvvvvwxxxwwxxxwwwwvwwwvvvuuuuuuuuuuuuuuuuuvtuuvvvvvvwvupi`Z][Z[]___^]\[ZZZZ[\^bgmruttttttssrrsttutupnkheccbabdeffeelnqtvwxxyyyyzzzzzzzyyyyywwwwwxxxyyyyyyyyxxxxxxxxxxyyyyxxxxxxxxxxxxxyyyyyxyyyzzz{zzzzzzzzzzzzzzzzyyyyyyyyzzzzz{{{zzzzzyyyzzzzzyyyzzzzzz{{{{{{{{{{{{{zzzzz{zzzz{{|zzzzzzyyzzzzz{{{zzzzzzzzzzz{||}}||||||||||||||||{{||||||{{{{{{{{|||{{{{{|||{{{{{|{{{{{{zzzzz{{{{{{{{||||{||{|{{{||{zyyyyzzzzzzzzyyyyyyyy{zzyxwwvxxxxwwwwwwwwwwww~~~ ~ ~ ~ ~~}}}} } }}}~~~~~~~~}}}}}||||}}~~~}}||zyxvuuwwwxyz{|wvuuuvwxyyyyxxxxxxxyyxyyyzzzzyxwwxxyyyyxxxxxxxwvvvvvvvvwvvuuuuvvvvwwxwwwwwvvvvvvvvvvvvuuvvvvvvuuvvvvvvvvwwwwwwwwvvvvvvvvvvvvvvuuvvvvwwwwwwwwvvvvvvvvvvvvvvwwxwwwwwwwwvvvvvvvuuuuuuuuuuvvuuvvuuuvuvvwwwwvxxxwtnf`][ZZ\^^^^]\[Z[[[^`bfjortttttsssssssttuuuuusqponnoopqrrrqssuwxyyyzzzzyyyyyyyyyyyywwwwwwxxyyyyyyyyxxxxxxxxxyyyyyyxyyxyyxxxxxxyyyyyxyyyzzz{zzzzzzzzzzzzzzzzyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzyyzzzzz{{{{{{{{{{{zzzzzzzz{{zzzz{{zzzzyyyyyzzzzzzzzzzzzzzzzz{{||||||||||||||||||||||||||||{{{{{{{{||||||||{{{{{{{{|{{{{{{zzzz{{{{{||||||||zzzz{{{{||{zyyyzzzzzzzzzxxxxxxxxzzyyxwwwxxxxxxwwwwwwwwww}}} } ~ ~ ~~}}}}}}}}~~~~~~~~}}}|||||{{|||||||{zxwuttvvwyyzzzwvvvvvwxxxxxxxwwxxyyyyyzyzzzzyxwwxxyyyyxxyyyxwvvvvvvwwwwvvuuuuvvvvwxxxwwwwvvvvvvvvvvvwwwxwwwwwwvwwwwwwwwxxxxxxxxvvvvvvvvwvvvvvvvvvvvvvvwvvvvwwwwvvvvvvvvvvwwwwvvvvvvvvvvuuuvvuuuuuuuuuuuvvvvvuuuuvvwwwvvuuuutpkg`^\\]^^]^][ZZ[\]cehloqssttssssssttttuuuuxwwwwwwxvvwwwwwwwxxyyyzzzzzzyyyyxxxxxxxxxxwwwwwwxxxxxxxxxxxxxxxxyyyzzyyyzyyyyyxxxxxyyyyyxyyyzzz{yyyyyyyyzzzzzzzzyyyyyyyyyyyyzzzzzzzzzzzz{{{zzzzzzzz{{{{{{{{{{{{{zzzzzzzz{{zzzz{{zzyyyyyyyyyyzzzzzzzzz{{{z{{{{|||||||||||{{{{||||||||||||||||||||||||||||zzz{{{{{|{{{{{{z{{{{{zzz||}|||||yyyyzzzz||{zzzzz{{{{{zzzxxxxxxxxzyyyxxwwyyyxxxxxwwwwwwww{{{| | }}~}}}}}}}}}}}}}}}}||||||{{zz{{{{{{{zzywvvuvvxyyzyywvvwvwwxwwwwwwwwxxyyyzzzyzzzzyxwwxxyyyyxyyyyxwvvvvvwwwwwvvvvvvvvvwwxxxxwwwvvvvvvvvvwwwwwxxxxxwwwwwwwxxxxxxxxxxxxwwwwwwwwwwwvvvvvvuvvvvvvvvvvwwwwwwwwwwwwvvwwwvvuuuuuuvvvvvvvvvvvvvvvvvvvwvvvvvvvvvvvvvvutttuvtpmfc`___^]^\[ZZ\^_filqrssrssssssrrtttuuuuuuvvwxxxxxxxxwwxxxxxxyyyz{zzzyyyxwwwwxxxxxxxwwwwwxxxxxxxxxxxxxxxxyyzzzzyyzzzyyyxxxxxyyyyyxyyyzzz{yyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzz{{{{{{{{{{zzz{{{{{{{{{{{{{{{{zzzzz{{{|{{zzzz{zyyyyyyyyyyyzzzzzzzz{{|{{{{{{|||||||||||{{{{{|||{{{{||||||||||||||||||||zzzz{{{{|{{{{{{z{{{{zzzz||||{{{{xxxyyyzz{{{zz{{{||{{{zzzyyyyyyyyyyyyxxxxyyyyxxxxwwwwwwwwyyz{|} ~}} } } }}}}||||||||||||{{{{zzzyyyxxyyzzyyxxwwwxxyyyxxxxxwwwwwwvwwxxyyyyyyyyxxxxxxxxxxxyyyyyyyyxwwvvwwwwwvvvvvvvvvvvwwwxxxxxwwwwwvvvwwwwwwxxxxxxxwwwxxxxyxxxxxxxxyyyxxwwvvvvvvvvvvvvvvvvvvvvvvwwxxxxxxwwwwwxwxxwwvuuttuuuuuuvvvvvvvvwvvvvvvwvvvvvvvvvuuvvuuuuuuttsssmjgfec`^^]\\]^abiknqsssrrrrrrrrrttttuuuutuuuvvwwvwwwvvwwxxxxxxxxyyyyyxxxxxxxxxwwxxwwwwxxyyxwwwxxxxxxxwwwyzzzzzz{zzzyyxxwxxxxxxxxyyyyyyzzyyyyyyyyzzzyyyyyyyyyyyzzyyyyyyzzz{{{{{{||||||{{{{{{{{{{{zz{{{{{{{{{{{{{{|{{{{{zz{{{zzzyyyz{{{{{z{{{{{{{{{{{{{{{{{{||||{{zzzzz{{|zzzz{{{{||||||||||||||{{zzz{{||||||||{{{|||{{zzz||{{zzzyxxxyyyyyzz{{{{{{zzzzzzzzyyyyyxxxxxxxxxxxyyyyxxxxwwwvvvvvyzz|| }~~~~~}}}}}||||{{{{{{{{zzzzyyyyxxxxzzzzzzyyxxxxxxyxyyxxxxxxxwwwwwxxyyyyxxxxxxxxxxxxxxxxxxxyyyxxwwwvwwwwvvvvvvvvvvvvwwwwxxxxwwwwvvvvvvvwwwwwxwwwwwwvxxxxxxxxxxwwwxxywwwwvvvvvvvvvuuuvvvvvvvvvvwwwxxxxxwwvwwwwxxxwvvuuuuuvvvvwwwwwwwxwvvuuvvwvvvvvvvvvuuuuuuuuuutttsssqomljgdbbaabcefmnprssrrrrrrrrrrttttuuuuuuuuvvwwvvvvvvvvwwwwwwwwxxxxxxxxyyyxxxxxyxxwwxxyyyxwwwxxxxxxwwwwyyyyyzzzyyyxxwwwxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzz{{z{{{{{{|||||||||{{{{{{{{z{|||||{||||||||{{{{{{{{{{{{zzyyyz{{{{{z{{{{{{{{{{{{{{{{{{||||{{{{zzz{{|zzz{{{{{{|||||||||||||{{zz{{{||||||||{{{||{{{zzz|{{{{zzzyyyyyzzz{{{{{{{{yyyyyyyyyyyyyyyyyyxyyxxxyyyxxxxxxxwwvvvvz{{|||}}~~~}}}}}{{{{{zzzzzzyyyyyxxxxxxxxyyzzzzzzyyyxxwwwxxxxxxxxxxwwwwwxxxxxxwwwwwwwxxxxxxwwwwwwyxxxwwwwwvvvvvvuvvvvvvvvwwwwwwxxwvvvvvvvvuvvvvvvvvvvvvuuuvvvvvwwwwvvvvwwwwwvvvuuvvvvvuuuvvvvvvvvvvvwwwxxxwwvvvwwwwxxxwvvvvvvvvvvwwwwwxxxwvvuuvvwvvvvvvvvvuuuuuuuuuuuutttusrqpoliihhhhjkkppqrsrrrqqrrrsssttttuuuuuuuuvvvvuuuuuuuuvvvvvvvvwwwwwwxxyyyyyxxxyyxxxxyyyyxwwwxxxxwwwwwwxxyxyyyyyyyxxwwwxxxxxxxxxxxyyyyyyyyyyyyyxyyyyyyyyyyyyyzzzz{{{{{{z{{{{{{|||||||||||{{{zzzz{|||||{{{{{{{{{{{{{{{{{||{{{zzzyz{{{{{zzzzzzzzz{{{{{{{{{{||||{{|{{zz{{|{{{{{zzz{{{{||||||||||{{{{{{|||||||||{{{{{{{{{{{{{{{{{{{zzzz{{{{{{{{{{{{yyyyxxxxyyyyyyyyzyyyyyxxxxxxxyyyxxxxwwwv{{{|||||}}}|||{{{{{zzzzzyyyyyxxxwwwwxxxxxxyyzzyyzzyyxwvvvvwwwwwxxxwwvwwwxxwwwwwwvwwwwxxxwwwwwvvvxxxxxwwwvvvvvvvvuuuuuuuuvvwwwwwwvvvvvvuvvvuuvvvvvvvuuuuuttuuuvvvwvvuuuuvwwvvvvvvvvvvvuuuvvvvvvvvvvvvwwwwxwvvvvvwwwxxxwwvvvvvwwwwvvvwwwwwwvvuuvvwvvuuuuuuvuuuuuuuuuuuuuuuvuuuutqommmmmnooppqrrrrrqqrrrsssttttuuuuvuuuuvvvuuuuuuuuuuuuuuuuvvvwwwwwyyyyyyxxyyxxxxyyyyxwwwxxwwwwwwvvxxxxxyyyzzzyyxxwxxxxxxxxxxxxxyyyyyyyyyyyxxxxxyyyyyyyyyzzzzzzzz{{z{{{{{{||||||||||||{{zzzzz{{{{{{zzzzzzzzzz{{{{{{{|{{{zzzyz{{{{{zzzzzzzzz{{{{{{{{{{||||{{|||{{{{{{{{{zzzzzz{{{|||||||||{{|||||||||||||{{{{{{{{{{{{{{{{{{|{{{{||||{{{{{{zzzzzyyyxxxxxyyyyyzzzyyyxxxxxxxyyyyyxxxwwwzz{{|||}||{{{zzzzzzzz{{{zzyyxxwwwwwwwxxxxxwwxxyy{{zyxxwwwwwwwwwwwvwwwwwwwwwwwxxxyxxwwwwwwwvvvuvvvvvwwwwwwwwwwwwwvvuuuuuuvvwwwwwxvvvvvvvvvvvvuuuuuuuuuuttuuuuvvvvwwwvuuuuvvvvvvvvwwvvvuuuuuuuuuuuuuuuvvvvvvvuvuvvwvvvvvvvwwwwwwwwvvvvvvvvvvvvuvvvvvutttttttuuuuuuuuuuuuttuuvvuutsqqqqqqqqrrrrrrrrrrstttsstttuuuuuuuuvuuuuuuuuuuuutuuuuuvvwwwwwxxxyyxxxxxxxxwwwwwxxxwwwwxxwwwwwwwwxxxxyyyyyyyzyyxwxxxxxxxxxxxxxxxxyyyyxxxxxwwwxxyzzyyxxxyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzyyyzz{{{zz{{{{{{{{zzzzzzzzyyyzz{{{zzzzzzzz{{{{{{{{{{{{{{{{|||{{{{{||{{{{|{{{|||||||||||||||||||||||||{{{{{zz{{||||||||||||{{{{{{{{{{{zzzzzzzzzyyyyxxyyyzzzzzzzyyxxxxxxxxxxxxxxxxxx||||||||{{{zzyyyzzzzzzzzyyyxxwwwwwwwwwwwwwwwxyzz{{zzyyxxwwwwwwwwvvwwwwwwwwwwwxxxxxwwvwwwwwwvvvuuvvvvvwwwvvvvvvvvvvvuuuvvwwwwwwwwvvvvvvvvwwvvvuuuuuuuuvvvuuvvvvvwwwwvvuuuvvvvvvvvwwvvvuuuvvvvvvvvvvvvvvvvvuuuuvvwwwwvvvvvwwwwwwwwvvvvvvvvvvvvvvuuvvuutttsttttuuuuuuuuuuttuuuuuttsrrrrrrrrrrrrrrrrrrstttssttttuuuuvvuuuuuutuuuuuuuuuuuuvvvwwwwwxxxxxxxxxwwxwwvwwxxxxwwwwxxxxxxxxxxxxxxxyyyxyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwxxyzzyyxxxyyyyyyyzzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzyyyyyyz{{{zzzzzzzzzzzzzzzzzzyyyyzzz{zzzzzzzz{{{{{{zz{{{{{{{{||||||{{|{{zz{{||||||||||||||||||||||||||||{{{{{z{{{{|||||||||||{{{{{{{{zzzzzzzyyyyyxxxxxxxyyzzzzzyyyxxxxxxxxxxxwwwwwwww~}}}|{{z{{{zzyyyzzzzyyyyxxxwwvvuwwwwwvvvvvvvwyyzzzyyyxxxwwwwwwwwvvwwwwwwwwwwwxxxwwvvvwwxwwwwvvvvuuvvvvvvvvvvvvvvwvvvvvwwwwwwwwwwvvvvvvvvwwwvvvuuuuuvvwwwwwwwwwwwwvvvvuuuvvvvvvvvwwvvvuuuvvvvvvvvvvvvvvvvvvvuvvwwxwwvvvuuvvvvvvvvvvvvvvvvwvvvvvvvwvvvutssttttttuuvvvuuuttuuttssttssssssssssssssssrrstttssttttttuuuuuuuutttttuuuuuuuuvvvvvwwwwwxxxxxxxwwwwwvvvvwxxxxwwwwxxxxxxxxxxxxxxxxxxxxyyyyyxyyyyyyyyyyyxxxwwwwxxxxxyxwwwxxyzzyyxxxyyxxyxyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyzzzzzyzzzzzzzzyyyyyyyyxxyyyzzzzzzzzzzz{{{{zzzyzzzzzzzz|||{{{{{{{zzzz{{|||||||||||||||||||||||||||{{{{{{{{{{{{{||||||||zzzzzzzzzzzzyyyyyyyxxxwwwxxyyz{{{zyxxxxyyyyyyyyywwwwxxxx~}|{{zyy{{{{{zzzzzzyyyyywwwvvuuuxwwwvvuuwwvvwxxxyyxxxwwwwwwwwwwwvvwwwwwwwwwwwxxxvvvvvvwxxxwwvvvvuuuuuuvvvvvvvvvvwvvvvwxxxwwwwwvvvvvvvvvvwwwvvvvvvvvvvwwwwwwwwwwwvvvvvvvvvvvvvvvvwwvvvuuuvvvvvvvvvvvvvvvvvvvvvvwwxxwvvvvuvvvvvvvvuuuuuuuuwwwvvvvvwwwvvtsrstttttttwvvuuuttuutsssstssssssssssssssssrrstttssstttttttuuuuuttttttuuuuuuuuuvvvwwwwwwxxxxxwwwwwwvvvvvwxxxxwwwwxxxxxxxxxxxxxxwwwwwxyyzyyyyyyyyyyyyyyxxwwwvwwwxxyyxwwwxxyzzyyxxxyyxxxxxyyyzzzzzzzzyyyyyyyyyyyzzzzzzyyyyyyyxyyzzzzyzzzzzzzzyyyyyyyyxxxyyzzzzzzzzzzz{{{zzzyyzzzzzzzz{{zzzzzz{{zzzz{{{{{{{{{{||||||||{{{|||||{{{{{{{{{{{{{{{{||||{{{{zzzzzzzzzzzyyyyyzyyyyxxxwwxyzz{{{zxwwwxyyyyyyyyyxxxxyyyy}|zxwwxy{{zzzzyyyyyyyyyyxwwvvvwwyyxwwvvuvvvvvwwwxxwvvvwwwwwwwwwwwwwwwxxxvvvvvvvvuvvvwwxxyxxwwvvuuuuuuuuuwwvvvvvvwvvvvwwxwwvvvuvvuvvvvvwxxwvvvvvwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvwwvvvuuuvvvvwwwwwwwwwwwwxwwvvvvvxwwwvvvuvvvvuuuuvvvvvvvvvvvvvvvvvvwvvutttuuuuuuuvvvuttssttsssssssssrrrrrrrrsssssssssssssttttttttvuuttttttttuuuuuuuuuvvvvvvvvvwwwwwwwwwwwxxxxxxxxyxxwwwwxxxxxxxxxxxxxxxxxxyyyzz{{{{zzyyyyyyyyyxxxxxxyyyzzxwwwwxxyyyyyyyyyxxxxxyyyyyyzz{{{zzzzyyyyzzyyyyzz{{{zzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxyyzzz{{zzzyyyyyzzzyxxzzzzzzzzzzzzzzzzzzzzzzzz||||{{{{zzz{{{{{zzzzzzzz||||||||||{{zzyyyyyyyyyzyyyyyxxxyyyyyyyyyyyzz{{{xxwwwwwwxxxxxxxxyyyyyzzz|{ywvwwxzzzyxxxwxxxxxyyywwvvvvvvyyxxxwwwvvvwwwwwxxwvvvwwxxwwwwwwwwwwwwxxvvuuuuvvvvvvwwxxxxxwwvvvvvvvwwwwxxxxwwwwwvvvvvwxwwvuuuuuvvuuuvwwxwwwvvvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvuuvvvwwwwwwwwwwwxwvvuvvvxwwwvvvuvvvvvvuuvvvvvvvvvvvvvvuuvvwwvvutuuuuuuuuvvuuutttttttsssssssssrrrrrrrsssstttttttttttuuuuuvuutttuutttuuuuuuuvuvvvvvvvvvvvwwwwwwwwwxxxxxwwwyxwwwwwxwwwwwwwwxxxxyyyyyyyzzz{{zzzzzyyyyyyyyyyyxxxyyyzzyxxwxxyyyyyyyyyyxxxxyyyyyzzz{{{{{{{{zzzzzzyyyyzz||{{{zzzyyyyyyyyzzzzzzzzyyyyyyyyyyyyyyyyxxyyyzzzzzyyyxxxyyzzzyxxyyyyyyyyzzzzzzzzzzzzzzzz{{{{{{{{zzz{{{{{{{{{{{{{|||||||||||{zzyyzzzzzzyyyyyyyxxxyyyyyyyyyyyyyzzzxxxxwwwwxxxxxxxxxyyyyyyyzywvuuvwyyxxwwvvwwwwwxxxwwvuuuvvxxxyyxyywwwwwxxxxxwvvvwwxxxwwwwwvvvwwwwwvvuuuuvvvvvvwwwwxxwwwwvvvwwwwwwwxxxxxwwwvvvuvvwwwwvuuuuuvvvuuvvwwwxxxwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvuuuvvvvvvvvvvvvvwwvvuvvwxwwwvvvuwvvvvvvvvvvvvvvvvvvvuuuuvvwwwvuuvvvvvvvvvvvvuuuuututttttttttssssrrssssssttttttttuuuuvvvvvvuuuuuvuuuuuuuuuuuuuuvvuuvvvvvvwwwwwwwwxxxwwwwvxwwvwwxxwwwwwwwwxxxxxyyyyyyyyyyyyyyyyxxxyyyyyyyyxxxyyyzzyyyxxxyyyyyyxxxxwwxxyyyzzz{{{{{{||{{{{{{zzyyyyzz{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyzzzzzzzyyyxxxyyzzzyxxyyyyyyyyzzzzzzzzzzzzzzzzzzz{{{{{zzz{{{{{{{{{{{{{|||||||||||{{{zz{{zzzzyyyyyyyxxxyyyyyyyyyyyyyyyyxxxxxxwwxxxxxxxxxxxxxxyyyxvutuuvvvvvvvvvvvvvwwwwxwwvvvwwxxxyyyyzxxxxxxxxxxwvvvwwxxxwwwvvvvvvwwwwvvvvvvvvvvvvwwwwwwwwwwwwvvvwwwwwxwwwwwwwvvuuvvvwwwvvvvvvwvvvvvvvwwxxxwwvvvvvvvvvvuuuuuuvvvvvvvvvvvvvvvvvvvwwwwwwvvvuuuvvvvvvvvvvwvvuvvwwxwwwvvvuwwwvvvvvwwwwwwwwuuuuuuuuvvwwwvvvvvvvvvvvvvvvvvvvuuuuututuuutttttttttuuuuuuuuuuuuvvvvvvwwvvvvvvvvvvvvuuuuuuuuuuuuuuuuvvvvwwwwwwwwxxwwwvvvwwvvvwxxxxxxxxxxwwwwwxxxxxxxxxxxwwwwwwwwxxxyyyyyxxxyyyzzzzyyyyyyyyyyxxwwwwwxyyzz{{{{{{{{{{{{zzzzzzyyyyzzzzzzzzzz{{{{{{{{{{{{{{{{zzzzzzzz{{{{{{{{zzzzzzzz{{zzzyyyyyzzzyxxyyyyyyyyzzzzzzzzzzzzzzzzzzzz{{{{zzz{{{{{{{{{{{{{{{{{{{{{|||{{{{{{{{{zzyyyyyyyxxxyyyyyyyyxxxxxxxxyyxxxxxxxxxxxxxxwwwwxxxxxwvuttssssttuvvvxwvuuvvvwwwwwwvvwwwwwxxxxxxxxxxxxxwvvvwwxwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwvvvvvvuvvvvvvvvvwwwuuuvvvwwwwvvvvwwwwwvvvvvvvwxxwwvvvvvvvvwwvvuuvvwvvvvvvvvwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvwwwwwvvvvvuvvvvwwwxwwwwvvvvuuuuuuuuvvvvvvwwwwvvvvwwwwwwwwwwwvvvuuuuvuuuutttuuvvvvvvuuuuuuvwwwwwwwwwvvvvwwwwwwvvvuuuuuutttttuuuuuvvvwwwwwwwwxxwwwwvvvvwwwwwwxxxxxxxxwwwwwwwwwwwwwwvvvvwwwwwxxxxxxxyyyxxxxyyzzzzyyyyyyyxxwwwvwwxxyzzz{{{{zzyyzzzzzzzzzzzzzzyyzyyxxyyzzzzzzzzzyyzzz{{{|{{{{{{{{{{{{{{{{{zyyyyzzz{{{zyyzzzzzzzzxxxyyyyy{{{{{{{{{{{||{{{zzzz{{{{zzzzz{{{{{{{{{{{zzzzzzzz{{{{{{|{||{{zzyyyyyyyxxxyyyyyxxxwwwwwwwwyyyxxxwwwxxyyxxwxwwwwwwvvvvuutttssttuuvvwwvvuuuuvvwwwwvvwwwwwxxxxxxxxxxxyxxwwxxxwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvuvvwwvvuvuuuuuuuvvvvvvvwvvvvvvwwwwvvvvwwwwwvvvuuuvvwwwwvuuuvvvvvvvvvvvvvvvvvvuuuvvvvvvvvwwwwwwwwvvvvvvvvuuuuuuuuuuvvvwwwwwvvvuuuuvvvwwwxwwwwvvvvuuuuuuvvvvvvvvwwwwvvvvwwwwwwwwwwwwwwwvvvvvvvuuuuvwwxxxwwvvvuuuvvvvvvvvvvvvvvvwwwwwvvvvuuuuuuttttuuuuuuuvvvvvvvvvwwwwwwvvwwwwwwxxxxxxxxxxwwwwwwwwxxwwwwwwwwwwwwwwwwxxxxxxxxxwwxxyyyyyyyyyyxxxxxwwxxxyyzzz{{{zzyyyyyyzzzzzzzzzzzyyzyyxxyyzzzzzzzzzyyzzz{{{{{{{{zzzzzzzzzzzzzzzyzzzzz{{{zzyzzzzzyyyxyyyyyyy{{{{{zzz{{{{||||{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzz{{{{||{{zyyyxxxxxxxxyyyyyxxxxxxxxxxxyyxxxwwwwxxxxxxwwwwwwvvvttttuuvvsstttuuuvvvvuuuuuuvwwwvvvvvwwwxxxxxxxxxxxxxwwxxywwwvvvvvwwwvvvvvuuvvvvwwvvvvvvuuuvvwwvvuvvuuuuuuuuvvvvvvvvvvvvwwxwwwwwwxwwwvvvuuuuuuuvvvvuuuvvuuvvuuuuvvvvvvvuuuvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuuuuvvvwwwwwvvvuuuuvvvwwwxwwwwvvvvuuuuuuuuvvvvvvwwwvvvvvvwvvvvvvvvwwwwwwwwvvvvvvvvwxxxxxwwwwvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuutuuuuuuuvvvvvvvvvvvvvvvwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwxxxxxxwwwwwxxyyyyyyyxxxxxxxxyyyyyzzz{zzzyyyyxxyyyzzzzzzzzzyyzyyxxyyzyyyyyyyyyyzzz{{{{{{zzzzzzzzzzzzzzzzz{{zzzz{{{{{zzzzyyyxxyyyyyzzz{{{zzzzzzzz{{|||||{{{{zzzzzzyyyyyyyyyyyyzzzzzzzzyyyzzzzz{{{zzyyyxxxxxxxxxxxxxxxxxxxxxxxxyxxxwwwvwwwwwwwwwwwvvvvvrrstuvvwsssttttuvvvvvuutuuvvwwvvuuvvwwxxxxxxxxxxwwvvvwxxwvvvvvvvwwwvvuuuuuuvvvwwvvvvuuuuuvvwwvvuvvuuttttuvuuvvvvwwwwwwvvxxwwwwxxwwwvvvuvuuuuuuvvvuuuuuuuvuuuuuuvvvvvvuuuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuvvvwwwwwvvvvvvuvvvwwwxwwwwvvvvvvvvvvvvvvvvvvwwvvuuuuvvvvvvvvvvvvvvvvvvvvvvvwwwwxxxxwwvxwvvuvvvuuuuuuuuvvvvvuuuvvvvvvvvvvuuuuuuuuuvvvvvvvvvvvvvvvvvvvwwwwwxxxxxxxxxxxxxxxxxyyyyxxxxxwwwxwwwwwwvwwwwwwxxyyxxwwxxxxxxxyyyxxxxyyyyyyyyzzzzzzzzyyyxxxxyyzzzzzzzzzyyzyyxxyyzyyyyyyyyyyzzz{{{{{zzzzzzzzzzzzzzyz{{{{{{zz{{||{{zzzyyxxxyyyyzzzz{{zzzzzzyzzz{|||||||{{zzzzzzyyyyzzzzzzzzyyyyyyyyyyyyyyzz{{{zyyxxxxxxxxxxwwxxxxxyxxxxxxxxxxxwwwvvwwvvvvwwwvvvvvvvqqrrstuusssrsstuvvvvvuuuvvvvwwwwvuuvvvwwwwwxxxxxwwvvvvvvvvvvwwwwxxwvuuuttuuuvvvvvvvuuuuuuvuuuuvuvuutssttuuuuvvvvxxwwwwvvwwwwwwwwwwvvvvvvvvuuuuttvuuuuuuvuvuuuuuuvvvvuuuuvvvvvvvuvvuuuuuuvvvvwwwwwwvvvvvvvuvvvvwwwwvvvvvvuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuttuuuvvvvvvvvvvvvvvvvwwwwwwwwwwwwvvvvvvvvvvuvvuuuuuuvwwvvuuuuvvvuuvvvvvvvuuuuvuuuuuuuuuuutttsttuuvvwwwwwwwwwwwwwwwxxxxxxxyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyzzzzyyyyyyyyzzzzzzyyyyyyzzzzzz{{zzyyzzyyyyyyyyyyyyyyzzzzzzzz{zzzyyyxyyyyyyyyyyyzzzzzyyyzz{{{{{zzzyyyyyyyyyyyzzzzzzzz{{{{|||||||||||{|{{{zzzy{{|{{|{{{{{{{{{{{{zyyyzz|{zyyyyzxxxxyyyyxxxxxxxxxxxxxxxxxxxwwvvvvvvvvuvvwvvvvvvwpqqrrsstrqrrsstuvvvuuuuuuuvvvvvvuuvvvvwwwwwxxxxxwwvvuvvvvvvwwwwwxwwvvuuuuuuuvvvvvvuuuuuuvuuttuuvvvuutttuttttuuuvwwwwwwvvwwwwwwwwwvvuuvvvvvvvuuutvvuuuuvvvvvvvvuuvvvvvvvvvuuuuuuuuuuuuvvvvvvvwwwwwwvvvvvvuuuvvvwwwwvvvvvvuuuvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuttttttuuuuuvvvvuuvvvvvvvvvvvvvvwwwvvvvvwvvvvvvvvuuuuuuvwwwvvuuuvuuuuuuvwwwvvvvvwutsrrrrrrrqqppqqqqrstuuvvvvvvvwwwwwwwxxxxxxxyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyzzzzyyyyyyyyzzzzyyyyyyyyyyyyyyzzzzyyzzyyyyyyyyyyyyyyyyyyyyyyzzzzyyyyyyyyyyyyyyyyyzzzyyyyzzz{{{{zzyyyyyyyyyyyzzzzzzzz{{{{||||||||{{{{{{{{zzzzz{{||{{z{{{{{{{{{{zzyyzz{{{zzzzzxxyyyyyyyyyyyyyyxxxxxxxxxxwwwvvvvuuuuuutvvvuuvvvqqqrrsssqqrsstttuuttttttuuuuuuuuuuuuvvvvwwwxxxxxwwvvuvvvwwwwwwxxxwwwvvvuvvvvvvvvuuuuuuvvvvuuuuvvvwwwvuuustttuuuuvvvvvvwwvvvvvvvvvvvuuvvwxxwwvvvvvvvvvvvvwwwvvvvvvvvvvvvvvuuuuuuuuuuuvvvvvvvvwwwwwwvvvvvvuuuuvvvvwwvvvvvvuuuvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuttttttuuuuuuuvvuuuuvvvvvvvvvvvvvvvvvvvvwwwwvvvvvuuuuuuvxwwvvuuuuuuuuuuuwwwvvvvvvtrqppqqsssssrrrrrrsssttttsstuvwvvvwwwwwxxxxxxxxxxxxxxxxwwxxxyyyxxxxxxxxyyyyyyyyxxxxxxxxyyyyzzzzyyyyyyyyzzyyyyyyyyyyyyxxxyyzzzyyzzyyyyyyxyyyyyzzyyyyyyyyzzzzyyyyyyyyyyyyxyyyyyyyxxyyyzzz{{{{zzyyyyyyyyyyyyyyzzzz{{{{{{||{{{{{zzz{{{{{zzzzz{{{{zz{{{{{{{{{{{{zzzy{{{{{{zzyyyyyyyyyyyyyyyyxxxxxxxxwwwwwwwwvvvvuuttvvuuuuvvrrrsssttsstuutttrrsssssstttttuuuuuuvvvvvwwwxxxxxwwvvvvvvwwwwwxxxwwwwvvvvvvvvvvvvuuvvvvvvvvvvvvvvwwwxwvvutttuuuuuuvvvvvwwvvvvvvvvvvvvvvwwxxxxwwvvwvvuuvvwwwwwwvvvvvvvvwwwvuuuuuuuuuvvvvvwvvvvwwwwwwvvvvvvuutuuvvvwwvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuvvvvvuuttuuuuuuuuuuuuuuuuuuuvvvvvvvvuuvvvvvvwwwwwvvvvvvuuuuvxxwwvuuuuutttuuuvvvvvvuusrqpprtuxxxxxxxxvvvvuuutsrrrstvwvvvvwwwwxxxxwwwwwwwwwwwwwwwxxyyyxxxxxxxxyyyyyyyyxxxxxxxxyyyyzzzzyyyyyyyyyyyyyyyyyyyyyxxxxxyyzzyyzzyyyyyyxxxyyzzzyyyyyyyyyyyyzzzzyyyyyyyyxxxyyyyyxxxyyzzz|{{{zzzzxxxxxxxxxxyyzzz{zz{{{{{{{{{zzzzzzzz{{{{{zz{{{{zz{{{{{{{{z{{{{{zyz{{||{{zzzzzyyyyxxxxxxxxxxxxxxxxwwwwwwwwwwwvuuttvuuuuuuvtttttutttttttttsssrqqqrrssttttttuuuvvvvvwwwwwwwwvvvvvwwwwwwxxxxxwwwwwwwwwwwwwvvvvvvvvvvvwwwvvvvvwwwwwwwwvvvuuuuuuuvvvuvvvvvvvvvvvvvvvvvvxxxwwvvvvvvuuuvvvvvvvvvvwwwvvvvvvuuuuuuuuuvvvwwwvvvvvvvvwwwwvvvvuuuuuuuvvvuvvvuuwvvvvvvvvvvvvvvvwwvvuuuuuuuuvvvwwvvvuuuuuuuuuuuuuuuuuuuuuuuvvvvvuuuuvvvvwwwwwwwwvvvuuuuvwvvvvvuuttttuuuuuuuuutsrpqstvyz{}}~~~~~~~}|{zyxxvutrrtvwwwwwwwwwxxxxxxxxwwwwwwwwwxxxxxxyyyyyyyzzzzzzyyyyxxxxxxxxyyyyyyyyyyyyyyzzyyyyyyyyzzyyyxxxyyyyyyyyyyyyyyyyyyyyyyyyzzzyyyyyyyyyyyyyzzzzyyyyxxxyyzzzzzzzzzzz{{zzyxwwwwxxyyyyyzz{{{zzzzzzz{{{{{{zzzzzzzz{{|||{{{{{{{{zz{{{{zzzzzzzzzzzzz{{{{{{zzyyxxxxxxxxxxxxxxxxxyywwwwwxxxxxwwvvuuvuvuuuuuwwwvvuuuttttsssstssrrrrrssssstttuuuvvvvvwwwwwwwwuuvvwwwwwwwwxxxxwwwwwwwwwwwwvvvvvvvvvvvvwvvvvvvvwwwwwwwwvvvvvvuuuuuuvvvvvvvvvvvvvvvvvvvvxxwwwvvvvvuuuuuuvvvvvvvvwvvvvvvvuuuuuuuuvuvvvwwwvvuuuuvvwwwwwvvvuuvvvvvvvvvvuuuuvvvvvuuuvvvvvvvvwvvuuuuuuuuuvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvwwwwwwwwvvvvvvuuwvvvvuttuutsrrqqppqqrrssvvxy{|}~ ~}}||ywutttvvvvwwwxwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyzzzyyyyyxxxxxxyxyyyyyyyyyyyyyyyyzzzzzzzz{{zzzzyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzyyyyyyyyyyyyzzzzyyyyxxyyyzzzzzzzzzzz{zzyyxwwxxxxyyyyyyz{{{zzzzzzz{{{zzzzzzzyzzz{{|||{{{{{{{{zz{{{{zzzzzzzzzzzzzzz{{{{zzyyxxxxxxxxxxxwwwwwwxxwwwwwxxxxxxwwvvvvuuuuuuuxxwwwvvvuuuttssstttttsssssssttttuuuvvvvvvvvvvvvvvvvwwwxxwwwwwwxxwwwwwwwwwvvvvvvvuuuuuuuuvvvvvvvwwwwwwwwwwvvvvvvvuuvvvvvvuuuuuuuuwwwvvvvvwwwvvvvvwvvuuvvvvvvvvvvvvvvvvvuuuuuuuuuuuuuvvvwwvvuuuuvvxxwwwwwwwwwvvvvvvvvvvvuuvvuuuuuuuuvvvvvvvvuuuuuuuuuuuvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvwvvvvvvvvvvutsrrqqpponnmnnoprtwx}}~~ }{ywwvuuuuvwxwwwwwwwwwwwwwwwwwxxxxxxyxxxyyyyyyyyyyyyxxxxxyyyyyyyyxxxxxxxyyyyyzzzzzzzz{{zzzzyyyyyyyyyyzzzzzzzzzzzzzzzz{{{zzyyyyyyyyyyyzzzzyyyyyyyyzzz{zzzzzzzzzyyyxxwwxxxxxyyyyyzzzzzyzzzzz{{{zzzzyyyyzzz{{||||||{{{{zzz{{{{zzzzzzzzzzyyzzzzzz{zzyyxxxxxxxxxxxvvvvvvvvwwwwwxxxxxxwwwvvuuuuuuuvwwwwwwwwwwvvuutttuuuuutsttuuuuuuuuuvvvvvvvvvvvvvvvvwwxxxvvwwwwwwwwwwwwwwvvvvvvuuuuuuuuuuvvvvvwwwwwwwwwwwwwwvvvvvuuvvvvvvuuuuuuuuwwwvvvuuvvvvvvvvwwvuuuvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvuuuuvvxxxwwwwwwwwwwvvvvvvvvvuuuuuuuuttuuuuvvvvuuuuuuuuvvuuuuuuuuuuuuvvuuuuuuuuvvvvvvvvuuuuuuuuuuuuuuuuvvvvvvvvwwwvvvvvvutsqqpppqpqqqqqqqqruy} }|uuttuvwxxxxxxxxxwwwwwwwwwxxxxxxyxxxxxyyyyyyyyxxxxxxyyyzzyyyyxxwwxxxxxyyyyyyyyyyyzzyyyxxxyyyyyyyyzzzzzzzzzzzzzzzz||{{zyyyyyyyyyyyzzzzyyyyyyyzz{{{zzzzzzzzyyyxxxxwyyxxxxxxxyyzzzzyzzzzz{{{zzzyyyyyzzz{{|||||||{{zzzz{{{{zzzzzzzzzzyyyzzzzz{zzyyxxxwwwwwwwwwwwwvvvvwwwwwxxxwwvvvvvvuuuuuvuv \ No newline at end of file
diff --git a/media/test/data/puppets-320x180.nv12.yuv b/media/test/data/puppets-320x180.nv12.yuv deleted file mode 100644 index 510ee6a0..0000000 --- a/media/test/data/puppets-320x180.nv12.yuv +++ /dev/null
@@ -1 +0,0 @@ -EEDFGGFFGFFFFEFEDEGEFEFFFFHGGGHGDFGGHHHHFFHHFEEHHGEFGFHGGHHGHGFHGGHHGHHHGGIIIHHGHHHIHIIIJIIJIHJJJIJIJJKJJJJIKJKKJKKJKMKKJJKKLMLKKLKKKKLLMLLLJKLKKKKKNMLLLLLKKKLLKLLLLLKLMMLMLLNMMNKLMLLLLKMMMMMMMMMMMLMMMMLMLLMNNNNMNMMMLLMMMLMMMLMMNMNMNMMNNMNNMNNMNNNLLNMMLMLMMMMNMMNNOLLMLLLMMMMMMMLNNNMNNNLKMMONNOMMMOOONMNONNNNOOONNOOONOMNGEEEGGFFFEFFFFGEEFFFGGGFFFFFFFFGGEFFHIHGHGGHHHGHFFFGGGIIHHIIGGHHGGIIHHIIIIIJJJIHJIJIIIIJJJIIIIIJJIJJJKJJJJJJJJKKJJKJKLKKJJKLLLKJKKKKLKKMMMLLKLLLLKLLLLKMMLLLMMLMLKLLLLLLMMNLLMNMMMLLLMMMMLMMLLMMMMMMMLLMMMLLLMNNNNMMNMNOMMLMNLMMLLMMNMNMLMMNNONNNMMNMMMLMMLMMLKKMNLMNMLLMMNONLMLMNNNMONONMNLLMMMMONNNNNNNOPPNOOOMNONNNNNNPNNPNLKGGHHGFFFFEEGGGGFGGGGFFFGHHGFGFFFFEGFGGFGGFGGHIHFFHFHHGHIGHIIGHHGIHHHIHGIIJHIIJIJJJJKHIIJJIJJIJJJJJJJKKJJJJJJLKJKKLKJKKKKJKKKKKLLKKLLKKKMMMMMMMLLLLLMLKKMLLLLLNMNNMMMMLKLMMMLMNNMLMNMNNNMLNMMMNNMLMNNNMMMMMMOMMNNNNNNNNOOMMMMMLLLMLLMNMMLMMMMOONMMMLMMNMMNLMNNLLLLMMMONNNOOOMMNNNKLNNMNNNLMMLNNNOMMONNNNOOOPONONNOPPPONOOOOOMOQOMGFHGHHFFEFGFGFHGFFHGGFFFGGFGGFGHGGGFHHHIGFGHGGGGHIIIIGGIHHIIGHIIJJIGIIHHHHGIIJKKLKKLJIJJJJJIJJJKJJJKLKJJJJJJKKKLLKKKKKKKKLLLKKKKKLLMMMLMMMMMMMNMLLLLLLLLLMLLMMLMMMMMNLMMMMMMMMMNMMMNNNNMMONNNNNMMNNNMNMMNMMONMNNMMNNMMMMLLMMNMLMOOMLNNNMMLMNNNMMMMKMNONNMMLLMNNNMMNNMLNNONOMMNONMMNNNNNLKLMNOOONMKNOPNMPPOPNNONOOOPPNOPONONNNMOPHFHHHHGFFGHHGGFFGGGHIGGFGFIIGGHJIIFFFGGHHGHHGGGGIIHHHGHIHIHGHHIHHIIIIJIIHIIKKJJKJJJJJIJKKJIIIIJKKKKKKJKJJJKKKJKLLLLKKKKLKKMMLKKLKKLMNNMMMMMMNNNMLLLLLLMMMMLLMNMMMNNNMMMMNNMMMNNNMNMLNNNNNMNNNNNMNNNNMLMNONNNNPOMMLMNMNNNMMONMNNNNNMONNMMMNMNOMNNNNNNNNLMNMLLNNMMMOONMNNONMNNNMMMMLNNOONMMMMNPNMMOMNPPONNMPPNOPOOPOOPOPOMNOPNMNPOHFFIGHHGHHIIGGFFGHGEFFGGIJJIGFHIHGGGGHIHIHHHGGHHIIHIHHGGGGHHGIJIHHIJIJJIIJJJJJIJJJJIIKJJJJJIIJKKKKKJJKKJJJJKLKKKKLLLKLKKLKLLLKKKKLMMMMLLMMMMMMMNMMLLMMLLMMLLNNNMNNNNMNNMNNMMNONNMNMLNNMMNNNNNONONMNNNMNNNONOW`SNNMNONNONNOPONNNMMNMNMMMMNOONNONNONNNNNLLNMNNMLMMMOOONOOMMMMNNNNNMMMNMLNMMNMNOOMMNOOPONOONOOOOOOOPOOPPONNNPOOMNOPHHHGEGIIHGGHHFFFFHHGFFGGGGGHHGHIHHGGHHJIHHIHHIIGGIHGIIGHHGHHHIJJHHIHIIIIIJIIJIIIJKKIIJJJKJJJJJKLKKJJJJLKJKKJJKLLJKLKKMNMLLLKLMMMMMMLNLLKLLMMMMNNNMLLMLNNMMLLMMMMMNNNNMNNNNMNOONNONNONNONMNNNNNNONOONNNNMNOUjtujd]RQNNNMNONOOONNOPOOONOONMMMNNNNOONOONOPNMMMONMMNOOOONNONNNNNNNONONONLLLMMMNPOOONNMONOPPPNOOPPPQQPPRQONOOOQNPPOPPIHGHIGHHHGGHGGFFGFHIFEHHIGGGGGIIHHGFGGHHHHGHHHIGHJHGHHGHHHHHIJIJIIIIIJJJJJJIJJJIJJJIJJJKJJJJJJKLKKKJKJLKJJKJJKKLKLMLLMLMMLKLKMNONLNNNLLMLLMMMMNNMMMMLMNNNMMLLMNNMNONNNONNNNNONMNONMONNNONNONOONNMONMLMOONUtv^RONNONMMONOOONOPOOOPOONMNOONOONOPONMNNMMNONMNMMOPONNNNNMOOMNNPOPOMNNNNNOOOOONNNNOOPPONNOPPPPQOOOQPPONOPQPOPOPPHIHHHHHHHGHHIJGFFGHIHGIHIFHHHHHIHHGHIFGHIHHHHHHIHIJIHHGHIHHIHIIHJJIIJJJJJJKIIJIJJJJIJJJJJJKJJKJKJJJJJKLKJKKKLLKKKKKLLKLLLLLLLLMNLLNOMMMNLLMMMNNMMMMMMMMLNNLLMLMNMMNNNOOONOOONMNNONMMMNNNONNNNONNOONNNNOPRg ~mSNNNNNONOMMOONNOOONONNOPPOOMNONNNOOMNNOOMMNMMONOOOPPNMMMNONMNOMMNOONNNNMMMNNKNOOPPONONNPPPONPPOOOMOPOOPPPPPOPPGHIJIIJHHGHHJIFGFHGHHHIHGFHIIHFHGHHJJHJJIHHHJIGHGHIJHHHHJJIHHJIJJIIIJJJJJJKKJIJKKJJJKIJJJJJJJJJJJJKKKKLKJKLLNNLKKLMMMLLMKLLMNLNOMMMMNMONMMNOQMMMLMNMMMMMLLMMNMMOOMNMNOOOONOOOOOPONNNONNNMNOPONOONNNOOORXfy}z{~_NONMOOOONNNNPOMNONPONOPOPOONNNOPPOLNOONNNNNNPOOOPOOMMMNNOOLMMOOMNOONONNONONNOOONPPOOOOOOOMNOPPONNOPPQQQPPQPPPGHJJJGIJGHHGIGIHGGGHHGHGHJKIHFIJIHIHJIIIIIHIIIIIIHHGHIJIJJJJJJJJIIIJLKJJJJJJJJKKLKJJJIJJJKKJJJJKLKKJKLLKLKKKMMLLLLLMLLMMLLNNNMNOMMMMNNLMNPT]fWMNMMMMMNMMNMLMNNNNPNNOOOONNNPONOONMNLNOOONNOPOOOONNNOPPWfmt}|yxxwvmQOOOONNOONNOOOOONOPOOOOPONOOPOOOOOMNONNOOMNNOOPONONNPOPNOOMNNPONNPPONMMOOPOOOONNOPPOOPPOONNOPONNPPPPRQPPPQQOPIJKJIHIJIIIGGHIGFGFFIHGHJJJIHHIJIHIIHIJJIJJIIIJJIJHHHIJIJIIJIHHJJJKJLKJJJKJJJJJKKJKKJIKKLLKKJKKKJKKJKKLKLKKLKKLLLLLLKMMMMMMMLMNOMMMMNNMNQ^lotmSMNMMMNNNNNNNNNOONMNNNNONMNNONNNNNOOMNOOOPOOPOOOONNOOOZnuqoutsstvu~ dPPPOOOONNNOOONNNNNOONONONNOONNNOOONONNMNNMMNNNNONNNNNPONMMNOOPPNNONMNOONOPONPONPNOONNNQQQQOOOOPOPOOPPPQPPPQPPFHJKHFHIIIIIIHHFFHGHIHGGHIHHIIIIIHHJIJJIHJIGIJIIJJJJJJJHHIJJHHJJJKKJKLJJKKJJKKKJJJJJJJJJKKKLLLLKKLLKKKKLLKLLLKKKLKLNLMNNLKNMMMLMMNNNMMNNTkwutxoOMNNMNNOONNNNNNONNOONNOQWQONPPONOPPQSYTPOQQRYa]TONOPUkutpmkjgjqpq}yYOPONNPNNOOOOONNONNMNNNPOMNNOONNOPPOOMMOONNOONONNONNPOOPNMNNNOPPOPOOMNONOOONNOOOPOOONONQQPPOPPOOOOONPPPQRQQPOOIIHIIIHHIHHHIJJHGGGGHJIIIIJJHHIIJJJIIJJJHIIHHIJHJJJJJKJHIJJJIJJKJJJIJKKKJKJJKJLKJJJJJKJKKLMLLLLLKLLKKLKLLLMMLLKKKMMMLNMMMMNMMNNMNNNNMMMMVowttyoTNONNMNNONNNOMOOOOONNOWs`UPWgTQ^fahoxk_Wcehw}yoYQTZcorqqjfa]^egnyqSOPOONNPONNOOOOPOONNOOOOPONOOOOOOPOONNOOOOPONNNNOPONPPOPOPOOOPONNPNNONOOPPPPONPPPNOOPOPOPPOPPPOOOOPPPPPPQQQONOIIHHIIHIIJIGIIIHHHJIIJIJIHJJHGIIJLIIJIIJIIJJIJJIJJJJJJIJJJJKKKIKKJJJJJJJJLLJJKLLKJJJKKKJKLKKKKKKJKMMLKLLLLMMMMLLLMLMMMMMLMNNNNNNMMNMMMNO\qxsvy sRNMMMOONMNOONOONPONOO_yidhmaw} yuz{}~tjjliiiggge^VTW_lr\OOOOPONOONNPPOOPPONOPPPNOOPOOOPPNOMMOOPPPPPPNNOOOPOOPPPPPPPPPPOOPPOOOOOOPQPPNOPQPONONNPOOPPQQQQPPQOOOONOPPPPOOJJIHJJIIIJIHIIIIIHIJHIJJIHIHGHHHJKJJJIIHIIJJJJJIIJJJIIJKJJJKKKIJKJJKKKKKJLKKKKLKKJJJKKKKLKKKKKKKKKMMLMLLMLLLMLLMMMNMMMMMMLMNNNMNNMMMMMNO_rvtu{}dTNONNNNNONNNOONUXTXaq ||z ~}{~zpiec__^ZZVTV`kgUPPOPPPOOONNOOOOPPOONOOPPOOPOPPPPOONNOOPONOOONNOOOONOPPOOPPPQQPOPQPNPNNOOPPPPOOOPPPOPOOOPPPPQPPPQQQPONONNPQONPPJIJJJJIGIIIJJIIIIIIIIIIJJIJIHJJIIIIIJJJHIIJJJIIJJJJJIJKJJJKKKJJJJKKKKLLKJJJJKJKKMMLKLLMLLKKLLKKKKLMLKLMMNMLMLLLMMNNMONMMMMNNONMMMMNPNNMN^vwvuywhRNONNNNONOQW[]]gjqv} zw{}~|y|~~~ynkn`ZUPPRPUci]RPPPOPPOOOPPOOOPPOOOOOOPPPOPOPQPPPOPPPPPONOOPNOPOPPPPOPOOPPPPQOOPOPNNOOOOPOPQPPPPPPPPPOONPPOPPONPPPPPPPOOPPOOPPJIKKJJJIHJKIIIHHIIIIIIIJJJIHIKKJJIJKJJJJKJJJJJIJJJKKLKJJJKLJJJJJJKKKJJLKKKKKKKKKLLLLLLLLKKKKLLKLMMMLLLKLNMLMMMMMMNMNNNMMMMONONNMNNNONNNN\svvvv}wpbPPRVUSSYjw~xv|}~~~}z}zx~wmr}~~v~ yvx^UTSLHNV]]TPPPPPPPPOPPPPOOPPOOOOPPOPPONPPPPPNOPPPPOOPOPPOOPPPPPPOOPPPPPPPOOPOPPOOOOOOPPOPQPPPPPNOPOOPQOOPONOPOPPQPPQPPPPNPIIJKJJJGGJJHHIHHJJHIJIIIHIHIIKKJJIJKJJKKJJIKJJJIJJJKKKJJJKKJKKJJKJKKJJKJKLKKJLLJLLLLLKKJKKMLKKMMLLLLMLLMMLLMNNNNNMMNMMNNONMMNNONNNMNNOOOTfswyy{|{ZZguunrv}tu{xsy{qs|{ {hd[QOUhdYSPPPPPPPPPONOPPOOPPPPPOPPOOPPOOOPPPOPPPPPPOOOPOONPQQPOOPPPQPPNPPOOPPPPOPOOOPPPOOOPPPOOOOOOPPPPPOPOPOPOPRPPRPOPPOQHJIKJJJGGIIJJIIIIJIJJJJIIJJJHJJIIHIJJJJJJIHJKJJJKJJJKKKKLJJJKJJKKJKJJKKKKLLKKLKKLLKKLKLKLKLMLLKKMNNMMLLLLMMMMNOOOMMMMLMNMNMNNNONOOMMNOONNYow}~~qpx}~}}z~}z|vu}{xbu~vbZROPPPPQPPPOOPPOOPOPPPPPPPOPPPOOQOPOPPPOPPPPPOPPPPPOPOOPQQPPOOOOPONPOONNOOPPPPONOPPOOOOOOQQPPQPOOOPQSPOPPQQQQOPQQKJJJKLKIIIIJKIHKJJHJKKJJJKKIJKJJJJIHIJKJJJKKJKKJKLKJKLLKKKKKJKKKKKKKLLLLKKLKKLLLMLLKKKLLLLLMKLLLLMMLNMMLLMNMNMNNNMOOMMNNNNMNOOPPONNNNNNNOQfvy|}~~ ~|~~}x{ } }{ {xgZWQQPQPQPPPPPPPPPPPPPPPPPQQPPOPNNOPPPPPPPPPPPPPPPPPPPQPPPPPPOOPOPPOOOOOQPPOQPPQPPPOPQQPQRQPPPQPPPQQQQOPRSQPPQQPJJJIKKKIIIIJJIIJKIHJKKKIIKJIIIKJJIIJJIJKKJKKJKLKKLKJKLKJJJKLLLLKKLKKLLKKKKKKKLMLMLMMLKMMLKKLKNLLLMMLONNNMMMNONNMMMOPNNNNNNNNNNPONOPNNNNNNPWoz}{||z~ }yz|{z{~{u {sWSQPOPPOOPPQQPPPPPPPPPPQQOOOPPPOOPPQPPOPPPPPQPQQQQQPPPPPPPPPPPPOPPPPPPOOORQPQPPPPPPPOPPPOOPQQQPQQRQPPRQQQQQQRIJJJJKKJJJJJJJJJJJKJKJJJJJIHIJJJIJJKJIIJKKKKKJJKKKLLKJKKKKKKKKKKMLLMLLKKLKKLLLKKLLLLLMMNMLLMMNLLMNNMONNMMMMNONONNNNONMMONNNOONOOOOPPOOOOOOO_x|uswz }vpstqpqrx {y|~{{ypw ~ scZ^YQPPPPPPPOPPPPQPPPQPQPPPPPPPPPPPPOOPPPQPQPPPPPPPPPOPQPPPPOONOOOPONOPPQQOPPPPPPPPPPPPNNNPOPQPQRRRQSQPPQPPPJJJKKJJJKMJJJJJIJJKJKJJJJJKKJKJKJIJJJJJKKKKJKKKJJLLKLKKKLKKKJKKKMMLMMLLLLKLLLLLLMLLLLLLLLMLMMLMMMNMNOONMNNMNOONNNNONMNNNNMNMOOOOOONOOOOOPPSYo zkfiqssw~ yuuxzwrzy~ w{zbQQQQQPQOPPPPOPPPPPQQQQPOPPPPPPPPPQPPPOQQQPOPPPPPPPPPPPPPOOPPPNOPPPPPPNOPPPPPPPPPRQPPOOPPRQPPPPPQPOPPQRQKJKLKJJJJJJKKKKKJJJIJJJKJJLKJKKJJKKJKKKLLJKKLJKJJKKJKKJJKLLKJKKKLNKKLLMLLKKKKMMLMLMLLMLKKKLLLLMMMMLNMNNMNMMNNNNNMMNONNNNNOPMMNOPPONOPONOQ\fir{ {~ zx{x{wvxx}}bTQPPPPPPPPOOPPQPPQPPQPPPPPPPPPPPPOOPPPOOPPOOPPPPOPPPPPPQQPPPPPPPPPPPONOPQRPOPOOPPPOPQQPPQPPPQPPPPPPRPRKLKKJJJJKJIIKKJJJJIIKJJKJJLKJKLKKLJKLLLKKKKLKKLJKKKKKKKKLLLJKJLKLLKKLMLLKKLLLMLKLMMKKLMMMMMKMLLMNMMNONNMNMNNMLMNNNNOOONOOOOONOPOOOOOONOTbr{} |zy| ~~y{z yy zyus|fTPPPPPPPPPPPPPQPPPPQQPOQPPPPPPPPOPPOPPPPPPPPPPQQQPPPOPQPQPPPPQQPPPPPOPQQQPPQOOPQPPQRPOOPPRQQPPPPPOPPQJKKJJKKLLJIIJJJJJKKJLKKMKJKJJKKKKLJKKKJKKKJKLMLLLKLJJKMLLKLKLKLLLLMMMNMMKKKMMMMLLLLKLMNMMLLLMLMMMLMMNOMMNMMMNONOOOONONOOOONNNONNOOOOPVVdz~ ~ wqsuz||vru| ~ jUPQPPPPPQPQPOPPPQPQRPQRQPQQPPPQQQPQQPQPPQPPPPRQPRPPOOPPPPPRPPQQPPPQPQQPPPOPQPPPPRPQPPPPPRPOPRRRQSRPQJJKKJLLLKJKKJJJKLKJJMLKLLJKKKJJKLKKKJLLLLKKKLLKKKLLLKLLMNKMNMLMNKKMOMLNMLLMMMMMMLKLMOOOMLLMMMNMMMMMMNNMNNNNNOOOOOONNONOOOOONNONOPOOOTeps~ ~ }y|yux{wvy~zxwv nUQPPPPPQPPPPPPPPPPQPQPPPQPPPPPPQQQPQPPPQPPQPPQPOPQPPPPPQPPPPPRQPPQQPPPPPQQQPQQQQOPPPPOPQPOPQQRQTSQQKKMMJKKJJIJIJJKKLJKLLKLKKKKKKKKLLKKKKLKKLKKLLLLKKKMMLLLNMLMLLMLLKLMNMLMLLMMLMMMMLLNOOMMMLMNMNMMNNMNMNMLMMNOOOMONOPOOPNNOOOOONNNOOOWer| ~ zy|yxysqy|{ ~xuwvvrx |aZSQPPPQPPPQQPPPPPPQPPPPRPPPPPPQQQQQPPQPPPQQQPPPPQQOPQPQPPPQPQQQPQQQOPPPRSQPSRRQPPQRQPPPQPPRPPPQRQPJJKLLLKJJJKKJJKKIKKLKKLKLMMNLLKLMJKMMLLLMMMMMLMMLKMLLKKMNMMLKMMLMLMLMNMKMNLLMMMLLMNMNNMMMMMMNMMMNOONONLLMNMONNOOONOOONNOOOOOMMOOOSj ||x}}|~~}{wysnw {} ~|vvuqkbgs}|zzw} pVPPQPPPPPQQPPPPPPPPQQQPPPPPPPRQPPPPPQRRPQRQPPPPPQPPPPQQPPQPPQRRRQQQPPQRSQQRQPPPQQPPPQPQPORRPQQQPQLJKMLKJKKKLKKKLKLLKKLLMMMMLLMMLLLLLMLKLLMOMLLLLMMMMLLMMMLMMLLMMLLLKMNMNMNOMLMNMMNMNMMNNNONMLMNNMOOPONMMMMNNOOOONNNNOOOOONONMMNOPWm |zy|~ ys{{{~}~ {w|zxy} yrripuuneq{{x}xqsz}|qZQPRRQPPPPPPPPPPPPPQRQQPPPPPPPQQQPQPPPQQQQPPPPPRQPPPPQQQQRQPPQSRRRRQPQSRQRRQPPQQRQOPQPOPPRRSQQQPQKKLKJKKLKJKKLKKMMLKKMNMNMKKKLLMNMMNLLMLLMLLLMMLLMMLMNMLMMLMLMNMLNNKMNMMLLNNMOMLNNMMMNMMMNNMLLNONOPPONMMNNNNNPPNNMMNOOOPOOPONNOOXp |zyz}~|uz vv|{y{~ qoy|{vmikrtuwywuz~}zuvz zudVRRQPPPPPPPPPPQQPPQQQQQPPPPQPPQQPPQQQRQQRQPPPPPPQPPPQQQQQQQQQQQRRRRQRQQQQQPPQRRRRQOOPOPRRQRPPQPQKKJKLLKKKKKLKKLLKKLMMMKMMLKLLLKKMMLKKMLLLLLLMLMMNLMNNMLNNNMMLMMMONLLMNMMMMMMOMLMNLLMNMLLMNNMNNMNOONMMMLNNNNMONNNNNNOOOONNOPOOPXp }{|zyz~~{sm~tns ~wdfvzrnrno}~| xv~ ~|{dSQPPPPPPOPPQQRQQQRQRRQQQPPPPPPPPPQQQQQQSRSQQQRPPPRRQPPQPPPRRQQRQQRQQPQQRQPQRQRTRQPPPPPQRQQPQQQRMLKKLMMKKLMMJKMMLLKMMMMNMLMNMMLLLMLLLLMLMNMKKMOMNMNONMMMMMMMLLLMMLNMMNNNMOONONMNNMNMNNNNMMMMONNOONNMNNNNNNNOONOONONOOONOOOOOQcv}}|{uv|{}|sz}upu vnpyytjnnuzz~~z|mVRQPPPPQQQPPQRPQRRRSPQRQPPPPQQPQQQQSQRQQQQPRRRPPQRRQQQQQQQQRRPPPQQPRRRQRRQPQQRRRQQQQPPPRPOPQQPRLLLMLLMNLKKMKKMMLMMLLMNMKKNNOPMMLMLKMNNMNNLMLKMNLMOOMLLLMNNMLLLMMMOOMNOOONNMONNONNOOPNONMNONNNNNNNOONNNNNMMOPPPOOONNPOOOPPOOZw ~x{|xy {wz{~ys{||}{ow v |wtpmwzz~~xx~ x{zjVRQPPQPPQQPQRRQRRRQQPQPPPPPQQRRQQPRRRPPRRRRRQQQPQSQPQPQRPPQQQPPQPPPRRRQRRQRRRQQRRQRRRRQQPPPQRSKMLLLLMMLLLLMKLMMMMMMLNMLNNNNMMMLNNMNNNMMMMMNNNNMNNNMMLMNNNNNMLNOOONMMOONNLNOPNMMNNNOONMMMONNNNNNOPPONONNONOPOOOOONNOPOOPPXev wpllopttqtrov~ {|}qtw}~{|}~y|uy{|zxskoxsv}v{~z}ztpx}zgXRPQRRQPPPQRRRSQQPRQPRQQPPQPQQRPQQRRRQQSTRQQRRQPPRPPQQRQQQQRQSTRRPRSQQRQQSQPQQQRQSRSQRQPQQRSQLLLLLLLLNNMMNNOMLKOPOLLMMNLMOMMMNPNMNNNMLNNNONOONMNMMNNONMNPPOMNOONLNMNNNNMNOPONMMOONOOONNNNNNNOOOPPOONMOPOONOOPOOOOOONOOSm ~vlaVXakrqvwsw}{| uo||qp|xw~}roszy|}z{}wmlnmt|zvy|y|vknty{~|nWPQQRPQRQPQQRRQQQRRQRRQQQQQQRRRRQQQSRRSRQPRRRQPRSQQQQRRQRSRQRRRQPQSRPQQQQRQQQRRRRRQQRQRRPPQTMKKKLLLLNMMLLNNMLLNNONMNNOMNNNMMNOMMNMMNMMMNOOOOOOPOOONNNNOOOPNOPNNNNMNOOONMMNONNNOONNOOMOOONNMMNOOOOONMNPNNNNNONNOPOOPPSe| }zz{{zxna[^s|} xpx|ysrr~inx{~wttsrz|| yohjnvvtwzu{xggkqv{}|kXQRRPQSQQPPQQQQQQQQRRQQQQQQQQRSRQSTRQSQPQSRQQQRRQRQRRSSQQQQQQRQPQRSQQQQQQRRRQRRQRPPQPSSQPPSKLLNNMMMNNMLMLLMNNNMNNMMLMMNNLNMLNNMNOMNNMMNMNOONNONNPPNNNNOOONOPNOOOOPOOOONNOONOONNONOOMNNNNNNNOOOOOONNNOONNNOONNOPOPORf~~zy{{yrbd|¡¢£¡ }{~yvw}xqwvpqzxpqrutt¨©©§¢pjnqrqorrr}|tlqvtvxxzm[SQRRRQRQPRRQRQQPRQQQRRQQQQQRRSSRRQQQQRRRRRRRPPQQPQQRRQQQQQQRQRRRSQQQQQQQRQPQRSRSRQQQRQQQQNMNLNNNMNNNMLLLMNMMLLMMMMNMNNMNMMOOMNOOONOONOOPPOONNNMNOOOPPOOOOOOOOOOOOOOOONNNNNNNNOOONMOOOONNNOPNNONMMNNNNOPPPONOPPOSf} ~ussrsx~}veª°²´²°¬¢yvwy}|xwzyw~ux~trsry~x¦°³µ´°§ot~xpmrsy~xz{|}ypnouzv[QSRRQQQQQSSSQPQSPPQRRRQPPQQQRQRRRQQRRRRRQRQPPQQRRQRQQPQQQQQRQRRSRQSSRRRQPQQPRSSQRQQPQQQPONLMLMOMNNLMNNONNNNOOOQLMNPNMMMNOPOOOOOPPPOPPNOPPPOPOOPPOOPPPOOOOOPPPONNNNNOOONNOONNNONNMNNNNNOONOOMOOOOOOOOOOOOOOPOOUh~ }| {}~wlr¦²¸º»¹¸²ª|nfgjp{}ww~~|z|{|y~ryzs{§´·¸·µ¯©¦zq tyzxz|zsvystzsilsyx]RSQRQRQPPSSRRQQRRQRRRRRRRRRRRQSSRQQSQQQRSSTSPQQQRQQQQSRRRRSRQPRTSRRSSPPPQQRQQRRQRQPOPQQQNNMLMLNONLMNNNPONMOPPQPNONOPPNMOPPPOOOPPPPPOPPOONOOPOPPPOOPPOOOOPOOPOOOOOONNONONOOOMNOOMNMMMNOPOMNONOOOPOONNOOOOPPNNWn ~|}}ui ¶¹»¼º¸³¬ xlhgfluw}{tx{yxzwy{}||~}~ §³····´²±©sxqtx}zy~rluvnmpqn\TRQRQQQPPRRSQRQRRQRRRSSSRRRRRSRSRRQRRRRSQQSSQQQRQQPQQSRRRRSRQPQSQQRRROPQQPPRQPRQQQPPPPQQMNLMNMNONLLMOOPPNMOPONOOOPPPQONOPPPOOPQPPQQQQPPOOPOOOOPOPPPPPPPOOOPPOPOOOOOPPOOONOPOOOONONNOOOPPNMONOOMNNNNOONNNNOOUp|{{xzxu{~wplo¨³¸º»»º·±¨|{{rsxuvwtqtux}|wz|}}z{|{~xv|¤¯¸¹¸·¶µ´¯|sz{uv {}~|rpuxusql`WTRRQQQRRRRRRQQRQRRRRSSRRRRRQRQRRRRRSSRSPPQSRQRQQPQRRSQQTRRRQQQQQRRRRQPQQPRRPQRRTSQQPQQPNLKMNNNNNNNNPPOONNOPQQUTUZXY\\\_]^`_``\\XY_`^][ZYZZ[aca][[YYYUVWWVUTTSRQPQPOOPOOPPPOOPNOONNNNMOONLMNNONNMNOONNNNMNTo{z}ytoedy«µ¹»»º¸³¨ {okqpkllmtxwuknxuw|{}}{|yx|¨µ¸···¶³® tx {zttyzurrcY\WSRRSRSQRRRRRQSSSSSRQQRRRRQRRRRQQQQQSURQQQQRTSRQQQRSRQRRRRQQQQQPRQPRQPQRQPQQSSRRQQQRQQLMOOMOOOPPPOOPPQTW]bgnty|} ~{{wtpjc`[XTSSPNNOPOONONNMNNOONNNNNMNNOONOOONMPe~ }~yvuwvls¤®±´·¶´¬ zpkmhdfhiqspngfoorrtvw} vw¤¤ª´¶´±«yx}{~|}z~{xz{zripeU[\YTRSRQRQRRSRRSRRRQRRRRSQRSRSRRQQQRQRTQQRQPQRRRQQPRQQRPPQRQPPPQRRPQQPQRQQRRRSPQRRQQRQPNNPPOOPPQSRST]ciu| ¡ ¡¡¢¢££¦§§§¤¦§§¨§¦§¨©©¨§¦¦¦¦¤¢£¡}sk[SQPOPPNNONNONOONNONNMNNNNMOONNNRq ||©©~{x||wokkrvrpquqnkcahpony ª²±¯¬¦ utxx~~~vrqjtztqmdlfTSZYYTRRQQRSTTRQSSRRQRRQRTTSRRSSSRQPQQRSPRQQRSRRRRRQQRRRRRQRQQQQRRQQRQPPSRPQRRPPRRQPQQQROOPPPPPTW\dmu ¡£¤©©©«««ª«««ªª«¬®®¯®¯²±²²±±±±°¯¯®¬¬«ª©§¤ pc\QPPONNONNMNPONONNNOOONMOOMMP[z{x |wqs|{rv||xsv|zsid`dikjr zz¥¬ª¥¢ttutzzi\^btxnbd^fbLIQTVURSSTVXZZXWVWXXWWXXUVXXWVUTUTTSRSSRSSSRSRRSQQRRRRRQQRQRRRRRRRQRSQPPSRRQQPPQRSRSRQQPOPPPRSW`pz ¢¥¤ ¢¢¤¤¢¡ £¦¦ªª¨¨««®®®®¯®¯°°±²³³³³µ´µ·¶´³²³´²±¯¯±¯°°¯®ª¦£yhWPPONNOONNONNNMOOPONONNPONUq zqwzy~|~~zu|w{wtxvpkabgmjgq|~xxz {oiq~lSW]nvr[WW]\HCKPVZ\\_^Z^ab`_^\\\^`a`]^_`a_]\[YXYYZXVUSRSRSRSRRQRRQSRRQRRSRQQRRRSSRQPQRRQPPQQQQRSRQQQORSTX`p¡£¥¥¥¥¥¤§¨¨¨§§¨©ªªªªª©ª«¬¬®¯¯®¯°°±±±²³³´µµ¶¶µµµ·µ³²±²²±¯¯±±²²³²°®¬§ rUPONNOPONOONNOOOONMNNNOON[xpms{|~ yqlpv| ~}xy~}toosxy}zz~|ppofhltwt}||z~~}|| lkuvraRWW\frhWSQQECNY^``]]XRSX]\[][ZZ]]__abaab`]XRMNUW[ZWRSRRTURQRQRSRSSSSRQQRRRSSRQQQSRQRSSQPQRQRQSRRRRQPSY`o ¡£¤¥¥¦¨¨§©«ªªªª©ª«««ª««««¬«¯¯¯¯±°±±±²²´µµµ¶¶´´¶·¶´²±±±±¯°±±±±²³±°¯ªr\QPPPPONOOOOOOOOONOOOOPOWu }y{}~~wy~phcciqu|xvy}~ofdeltux{rvthjx~z|~|zwx{ywy| z{ vormdWWZPPQZfeZSTS[a_]^^[XUSRSWZ[^_^]`aaca`\ZWVUPKJMOSTQKHGHLPTUTTRSRRTTTSSQQRRSRQSRRQSRRSSTUUTSRRRRQRTRRUXl ¢£¦¥¥¦¥©ªª««ªªª©ª««ªª«««ªª«¬¬®®¯°±°°±±±³´³´µ´´³µ···¶´²±³³²±±±°°±±°±°¯¬¥raRPOOOONNNOOOOOOOOPOOPWp}{ ~ z{}{uhdflppswt}ypedfjoqv{~}yrmz {z{|zsnnrtuy{|{|uwohkld_erxskcYLPSMPPPT`dabaa^ZV[YUSVXWVX\^a__`aa```b]SNPLHGHHIHIKKIHGGHMUUVUTRRTTSSSRSSPQQQQRSUXYZ[]ad`[WUTSRSTTRTl{ £¥¤¥¨¥¦§§¨§¨ª©©ª«ªª««ªª««©¨©«¬¬¬¬¬®®®°°²´µ´´³²³´µ¶¶··¶²²³´´³²±°¯®®¯±°®ª¢kUQNOPNNONMNNONOOOONOSivutw~{mowtttvzy{zwlcfeknssrx}zy~{z~unpsuoggflrsy|~~|~suywxz|uwsszxzztvy|}wv{ siji]XYZ`ee^\VPNKHGLT]a`_^[SMMTQLDDJNVZ]^_^^`cb`]XXWQLFDDD?=>>BBBBDGGGIKKNQSSUUUUTSSTSSSRSRSUWTV`kknqpmigaWSSRQRQ¡£¥¥¥¥¦¥¥¨ªª§§©©©ª«ªª«««ªª«ªªª¬¬««««¬¬¯±±²²³´³±²´µ³´´¶¶´³³³³³²²°®¬¬®¯¯®¬©¥¦£iSOPOOOPPONNNNNOOPPPQ]nssx~ogjpnmnwxpy|xm]Yagklmmnsqqw}~wolkic_fs {cbhmmnx{xvz~}{vsqhgntvz{~y|qmos}rbp[Yde_afhc`VPHAMZ^^]ZTT`gjjgcYRHHLVZ]^__^_`_^XPMHDCCBA@@><<<=BFGEGFEDEFHJJNPRSTVUTRQRRSTTUSNVipsstsrstqi_USRQP ¡£¤£¤¥¥¦§¥§««ªªª©ª«©©ªªªª©©©ª««¬«««¬®¯°¯¯±³´´²±²³³²²´µ´³³²±±±²°®¬¬®®®®¥¢¦§¤kTOOPOOPONNNONOOOPPPXirqorwvqow|yuv~plssmd\Z_dfjkkkkhir}~pe^Z\`akkfgjlotttquz|{sqtle`juxwz~{yqkijqzx}ww|ixa`nxrighjh`VPS__YX[cy¢¨§¤wlc][\[^\[XVVUSNIGB@B>?B@==AGMOPQONKEDCCCEKMJKMNRWWWVSSTVUSOScmoqnlkjnqqsn_USQR¡£¦¥¦¤£¥¦¨¨¥¦ª¬ª««ª©ª©©««©©ª©¨ª«¬¬¬¬®®®¯¯¯°±²³´²²²³²±±²³³²²±±±±±°°¯®®®ª¡¦©©¥¢hROONNOPOONPOOOOPQS[ksqnmqw{{|qproigd_]aflqromjmrvyuk`[\^abeyrniiklkikkprsrostWRWetzvuwv{xomnkfkkervkovxplprhfknjb^^[WXn£ª®¯²³²´´´±®¦jWU[XURSSTUPJIHFGGEA?>?AHNOMNPPOOJECEIJKLJIJJNPUWVVUQPJLXejiedc^accipsnaVRS¤¥¥©©§¦¦¦¨«©§¦¨¬®«ªªªª©ªª««©ª«ª¨ªªª«¬¯°¯®¯¯°±±²³³³±±²²²²±±±²²±±²²²±±°°¯¯®®®¬©¥¡£¤¦¢_QPOOOOONNPPNQ\aekovxqmpy}x|}xspjfefltzwqotuoke^Z\`bdfgkmllllmjecabjrvuvzrTY__chggmt|zmbamynff`inp}x~ zurqyzrkiloja`_V] ¤ª¬¯±³¶···¸·¶·´²°£ i]VQSSMNOPHDDFIHA@>>?BFGJNMOPPPQMNMMMNMIHJHGHKMNONOG?JWca\YXTTZYYfmqpf[VR ¢¥¦¦§©©©¨¨©«©©¨©«¬ª©©©©©©©©ªªª««ªª««¬®¬¬®°°¯¯¯°±±²´³²±±²²±³²±±²²²²³²³³±±±±±¯¯¯¯¯®¬ª§ ¤££¢[QPONNOONOONSjy~~{sqz }xrqpou~ ungcchloonkgdjnprwvc^_cluzvuvqmjdhihjqvxsjibblyp``nqlsxuwxxuvwvtqmonnmc]]Xb¦©¬®²³µ·¸¹¹ºº¹¸¸·µ°¬fSLJLKMNMJEDHKF@ABAEFFIIJHIPQPPPMJLKJHDFEDEDEFHJIFA@LXbVMMCFQPNYelpob\YT¥§¦¦¨¨ªªªª©ª©©«ª©ªªª©ª©©ªª©ª©ª««««¬«¬®®®®®®®¯®°¯°±²´³±²±±±±´´²±³²±²µ¶µ´³±²³±¯¯¯°±±®«¦§¨¦£rRPPPNOOOOOPWm}|wy }yvuv|zwttw{yssvyx|yqeainfepqsulxwgckmpuurqoffnqpxxyuopsqnqtw|}|{toqsppg]\Y`¤¨¬¯°³³³¶·¸º¼¼¼»»º¸·±«^JEHLNKLMIIIKCAEEECDEMXi| q]RFBEDDC@CDDCIMKF>=EQ\O;7>JMJRbhjlgY[ZU¦¨¨©ª«««ª©©«ª¨ª«ªªªªªªªª««ªªª««ªª¬¬«¬®°¯¯¯°®¯®°°°°¯±±±²²²±²³´²²³³²³µ¸¸¶´³²³²±±±°±°¯®¬ª¤¤ªª§ bOOOOOOOPOUm}~ {z{~ yzulikfSS`fkrhy{neeinmnstxsnstpw ~{popslmvy}~~uoqttm`]ZV ¥ª®°¬¤¦®´¸¹»¼¾½½»º¹·±¤wMGEFEGIIDEGID?DFCIb§¯±³´³²³²¦fTIEEDCCFJMNOOHB?GUG4;MU[_jhfb\TNWYU§¨§©«««ªª©¨ª«ªª¬«¬«ª©«««««««ª««ªª«¬«¬¯°¯®°¯°¯®°°°°°¯¯¯¯²²±²³³³²²²³³³µ·¸·µ³²²±±±±¯¯¯°¯ª¦¡¡¨©©¤XQOPPPPOOb} £ ¡£ pmogY^bdcf^oukmo{{szurtyxwvuqvxutnnjswjmx~ }trtsg__[h¡§ª«°VH\®¶¹»½½½¼¼»º¸µ®bDDACGIIEDFIHCEFS¥¯°±³´¶··¶¹¸µµ´±©pRIHCBDEHIIIIKHHOICLYdhc_[TQOJMWYU§§¦¨ªª«««ªª««¬¬¬®®¬ª©«¬¬««««««ª««¬¯°¯®°°°°°±°¯¯°®¯°¯±±±²²³³²±²³´³³¶··¶³²²²³²±±®®¯±°¬ª¥ £§«¨¡qTPOOPRYev~ ¤¦£¥§¤ £¦¥zxzrmvvobYVgmmu |~wpntwv{yrooorsnjnukjt|~|xoa[Y^ ¢§¨«B:RGa§¶¹»¼¼½¼½½¼º·²£wPECAFJKGEFGE@In«¯±´¶·¸¹¹¹¸ºº¹¸¸·µ±¨lUJF@=A?@ADJJMOMS^b]WSMOMGBCQ[YU¨¨¨©««««¬ªª««¯®¬ª©ª®¬¬¬¬¬¬¬¬¬®°°®¯°°°¯±¯®®®°°°±±±±±³³³²±²³³³´¶¶µ´²±²´³²±®¬¬®«§¤¢¤§©©¤fSPSalv~¡£¥¤ ¥««§¤¦§¥|u{t^T]noq{~}|}vrorzzvprvzytrojhpx~ xqg]XQi¢¦¨©z-3<-bµ¹ºº»¼¼½½¼¼ºµ© ZJGCEFDBCFE@Q¡ª¯²³¶¹¹º»»»»ºº»»º¹¹·µ°¤^IB:96:9<AEJKNWYVQJOOKG>AITYUT©©ªªª«ª«¬¬ªª«¬¬«ªª¬¯®®¬®®®®®¯¯±°¯°¯¯¯±°®®®°°°¯¯²²±±³³³²²²±±²³´´´µ³²²³µ´³¯¬«¬¬¬«¨¥£¤§¦¦¦¢}[\r ¡ ¢£ ¢¨¬¨¦¦¦zsst`^ivwuz}~}wttx~|z|~{zytty| ~~ti^[UQx£¥¥¥v+"=±¶¸¹¹º»ºº»»»¸³¬]MKJIFCBDEJ_¤©¬±´¶·¸ººº»»º»»»º¹¸¸¸¸µ±¬rL@@==@=;?BCHG?@GFIGD@<IUWWTTª©©©ª«ª©¬¬«««««¬¬«¬¬¬«¯°®¬¯¯®®®®®®°°¯¯°°¯¯°¯®®°±°¯¯±±±²²³²±²±±±±±²²´³´´´³´µ³°®¬¬¬¬¬«§££§¨¨§¤uu{{~¢¨«¨¦¦¤¡~xps}{rihkt|zx|~{~}}{vx~ucZXQV¢¤£ P@X¯±µ·¸¸¹º¹¹¹¸·¶³«_LKJGDBDEK]¢¨¬¯²´¶··¹¹ºº»¹ººº¹··¶µµ¶´±¢zRIC?CC;8<<BE=99:>:=>=IUVTRS¨¨¨©©ªªª¬¬¬«««¬«ª«¬®®®®®¯¯°®¯°°¯®¯°¯°®®¯±±¯°°¯¯±±±°°²²°±±³²°®¯°°±°°±²³µµµ´´´²²±¯¬«®«¥¤ª®ª§¤ }{yvw}z~ ~} ¢£¡£¤~nllibcpvy|yy {xppxo`YTOW ¢¡§¯±²´µ´µµ¶···µ´´±§aOLKHBECF[}¤©¬°±³µ·¸¸¸¹ºº¹¹¹¹¶´²¯¬¯³³³²¯¦YICBEBAA@?AB=46764:BNRRRRT§§©ª©¨©ª«¬«ª«¬«ª«®®®®®®¯®®°±°°±±°®®¯°°¯¯¯¯°±²±±°±²±±°°²²±±±±±°®¯°°±±°°±²´´µµ´´³³²±¯®«¥¥¬¯«¨¤¡yvtv|w tqnjhiqxz{yz~~|{olocZ[SLU¡¡¥¨¬®°±²´³³²²³²³²²²°¦aKIIFDLIJp ¥¨¬®±±´µ¶··¸¹¸¸¸¸¶±¢{WSx ±³³²¯¨[DACCCBDDILLH?0+/>LRSTRRT«ªª«ª©¨ªª¬¬ª«««ª«®®¯¯®¬®®¯±³²°¯°¯¯®¯±°¯¯°±²±²²±°²³²²±±±°±±±±°¯¯¯°°°°¯®¯±²²²²³³³³²±°¯®®®«§¦«®©¥¢ }wuu|{v ¡ {xuuqrssy}~zy wpyvtqdYY[RKV¤§ª¯°±²±±±±°¯°±°¯®¦fQKGAFMNRq£§«®¯±²³¶¶¶¶··¶·µ¦h.:EJl²´³³°ª[E@?BAFJOSSQOE89IRSSSRRS¬«ª««¨¨©«««ª««¬«¬®¯®¯°®®°®°³²°¯°°°°¯°°¯¯¯±±±²³±±²³³³²±±¯°±°°±¯¯¯°¯¯°¯®¯¯°±°±±²±²²²±¯®®¬ª¨¬°©¦¤¡vorz~ ¡ }zzsqv{wwxxvsux|~~z}{{}| {sqlol_Z\ZRJS| ¤§ª¬¬¯°¯¯¯°®®®¬ª§¡^IEC>EJLPq¡¦ª«¬®°°²²³´´µµ´´³L2EG8=¬²µ´±¬¥O@?HFFIJJOQTPLINSRQRRSS¬««ª¨ªªª««ª«¬¬¬®®®°±°°¯°¯¯±±¯®°±±±±±°¯¯¯°±±±±°°±²³³´²±±±±°±±¯°°±¯¯°°¯¯®®°°°°±±±±±°¯««ª©°®ª¦¤£¡mly{xqllqvy}}}|z~{zzvrv}}zy}zvw{{sxyzwz||}{yw{ ~y yVQfWW^\XOINr¡£¦©¨«¬«¬¬¬¬¬«©¦¤ wXA<><?GIPw£¦ª«®¯¯°±³³²²±°®]("$#.{ª±³´±°«iGAHHDEGGMSSOJJNRRRRQRS¬«««ª¨ª«¬¬¬«ª«®¯¬®®®¯±°°°¯°±®°±°°°±±±²°°±¯°°±²²²±²±±±´´²±±±±°°°°±±±°°±°°°°¯¯±±±±°¯¯¯®¬««©¨©¬°«§¥££¡tly tqruz~uls{|}}zzurqu}|yx~~|trposquy~xpox}}ztrpqtND`]ZXWULFLh £¤¦©¨¦¥¦§¨§¥¢{bO@@DB?ABR{¢¤¦¨ªª¬¯°¯¯°««¦H!?¬±³³±±¬§ZKFEEFHKQTRPJGKQTRSSSUª«¬¬«ªª«¬¬¬«¯®°°±°®°®¯¯®¯°°±°±²±²±±°°°°°±²±±³³²±²³³²²±°°¯°±±±±±°°±±±±¯¯°±°°°¯¬««ª¨¥©¬«¨£¡¢¢ pyy~wnmy{usruvrqy~}}wqqu||} }ljkt~wx}mk|~vgfTdh]WVQHDIV} ¢¡ ¡¢¢¢|[PIG?>?>?BMz¡¡¤¥¦¦§§¨ªª««ª©¨§¤mRU¤°³´²±°¬¨pPKHGGIJOROLIHIPUTSSSS««¬¬«¬®¬¬®®¯®®°¯°°¯°¯¯°¯¯¯¯°±±±±±²±°°¯®¯±²±°±´³³²³³²±±°¯¯¯°±±±²±±±±°°¯®¯°¯®®¬««©¨§¦¦«®ª§¤¡ } skp~x||wyyvvsps}|{|{{~}zzyxtu}~{tqrlnlwyuzvtnqrj[Kfg_`WWVPFGGGk~{dKFABB<;<@AIr ¡ £¤¥¥¥¦§¨§¦¥¥§¨§¨¯¯²³³±±®¬¨¤[LGFHHFNRPLGDENVTRRTR«¬¬¬«¬¬¬®®¬¯°®®®®®°¯¯®¯°®®¯°°±°°²²±°¯®°±³²³²³³´´³±²²±°°¯®°±²³³²²±°°®®°¯®¬«ªª©§§§¦«¬ª§¥ rfix }kmvorttrvwz|y|zvonwzooowtffptqxvvrly}uosqZCIb^RRTQIDFF?Lt{ztjRB=8<>>@A@Fh ¡¢£¤¤¢¡¡¥¦ª¬®°°±°¯®«§£eJCAHHHPNJIEBCKUTSRUSª¬¬¬¬¯¯¬¬®®°¯®®¯®¯°°®¯°¯®®®¯°¯°±°²²²±±°°±±±³³³³´µ³±±±±±±°°±±³³³²²±°¯¬¬®¯®¯®¬«ªªª©§¦¤¥ª«©¨£¡¢¡}~{qqy}{yxx|{ees{vqnnorxzxz~zuv{yreeuzf^W]hvxnyummcgpwmnrswtnfZDMQCHQMFCEIC:Pqy £ª¢jUF>@;:<?F`} ¡¡¡¡£¤¥ª«¬®¬¬ª©¦¢pLEEGJRUMIGDB?IVWTSSTª¬®¯±®®¯¯°¯®°®®°¯®°¯¯¯¯¯°°±³²²³²±±±±±±±²³´³µ´´³²²°±°°±²²²³³±±²°®®¬®¯®®®®«ª©¨§¦¤£¦««§¦¢ ¢¢ }||w| x|}w|snvuuvspu{zsqpmpmsxytkadox}rggoovzv{tmn`SZndfpp{v]Wf\FG=BNQPIHKE;4Nku|¬²·´±§YB88@CDSq ¢£¥¨¨©©ª«ª¨§§¥ uNDEJLQQNMLEC@GV\USSTª¬«¬¯¯±¬®¯°¯®®¯°±¯®°®¬¯®°°°¯®¯°±³µ³±²²±°±±±±²³³´²³²³³²²±°°°±±²±±²±±²°¯¯®®®®®®®«©©¨§¨¥¤§¬«§¥£ zy||~}~sp~x}x~}vxvv~ qkcbghvvf`hrtszzxzxtuzxoz{tnblol^[il[H_mND?BNQNJIHC@60BZlw|{yz~ ¦¬¦ ¡«¯XMBCA?Fb ¢¤¦¦¦§§¨§¥¥¤¡xQJDEKMNOKHC@AHU[VSTT©«¬«®¬¬°¯®¯®¯®¯°®®®®¯°°¯°±±±¯¯¯±±³²±²²²±±²±²³³²³±±±²²²±±°°°±²²±±±±±±¯¯¯®®®«ª¨¨¨¨§¦©®ª§¤ {}||}|}~soquou {qkmofcfdegjw~ydUYX_lqqqrpjluovwr{z{|tocV`eGViM8>IPPKJHEBA:446A[kprmkptu£«® ¬ eTGFUk ¢£¢£¤£¡¢¡vNILIHKNPLDBAGJQ\WTTS©«¬«¬¬«®®¬®¯®¬®®®®¯°°²°±³³²±°°°³´³²²²²²±±±²²²²²±±±±²³²±±¯¯±²´²±±±±°°¯®®¬¬«©©¨§§¦¦ª¬¬ª¨¥¡{ { ~xwury}st{|siow~ }kROY]]_fjoprwveQS`KWl_\in`^iilwwwxxwyvushX]aKBPH:ALQQKJJD=:964505>DPQJMQh«®«{|~®³¦aLUj|gJEIKKMKJJ>=DMOV[XRRU©«¬«¬®®¬¯¯®¬«®®¯°±±±²²³²±±±²³³±±±³³²±±±±±²±±±±±±²±±²°±±±²±°°°°°¯®®®®¬««©©¨§¥¤¥¨ª«ª¦£ uiv{y~yit~~~|pZNV`cbeiqsnsubHTyc[fc^ecKVn\hrprrpjlinmaPTTVEFREAMPOMIF@823512//589=8<=y£«®¨uwz{|~¬±³¯y^Vix~ VCBBJLOPJHCCIQVWYWUTU¨ª¬¬¬«®¯®¬«®°®®°¯®®¯±°±±±±±²²±±°±³³±±±³²²±±±±±²±±±±±±±±±²°°±°±²±¯¯°¯®®®®®¯¬«ª©¨¨§¥¤¤§«ª©¥¡}zz} or~ rn}vurptpot~vle[\bhmrsxzxtpaJW|lu{f`TCReclsncbkvmY^e^WD@QO9=@>PSQPLC<75970,269<8<>8I¤©©¥yqstvyz{|~¢°µµ²£^Vdr{ yEAEGJJKOMFDHOQQTZXUUT«««¬¬¬«¬¬¬®¬««®®¯°±°°¯±°°±²±±±±±¯°°±²±±±±±±±±±±±±±±±±±²³²±²±°°°²²±¯¯¯®®®®®¯¬¬¬¬«¨§¨¨§¥££¦ª««§¢~iiopuuorwux¤¨¨§§¦£ {v}ypplfhlvzywjimkcbl{~yspi_Tc|vxtoujP`gmqpb^[dpq`YeceK8AH:18GPSRPLD=89;96127;??>:1e¤§£rlnoprvwvw{´¸¶²¨yVQ]ltz|~[>BDFHMKIHA?IUYWY\XUTT®¬«¬«««¬¬««««««¬®¯¯°¯°°±±¯°°±±±°°®¯®¯°±±±±±±±°°°±±°±±±²³´´²±°°±±±±°°¯®¬®¯®®¬«««¨¦§§¥¤ ¢¥©«ª¥ ~eenoqusw¥ª¬¬¬®®¬¦{zz~}ztlgVZkwvihhry}~vqqng\anvzpojwzclzzyuinnlpii\di`K::976<MPPNPKC<86687689>BB?9F£¡ohhikooopqv£®´¶·´±©cJHPalsvyz{~ o?;>?AEKKE@?BISXY\ZVTTS±¯¬«««««¬««¬««¬¯°°°°°±°°®°±°®¯®®®¯°±°±±±±±±±±±°±±²³´³²²°°°±±±°°°®¬¬®¬«««ª¨¦¦¥¥£¡¢¥©ª¨¦£hZ_quy ¢£¡¦¯¯®°°³¶³°§voihkmb`]Xguv ugetlo}wwvrllagmnsncZ]lpwttpx}vhlvykphcfZNC<69:>HMPPPMHB=9888:69<>@BDlvfcbegeegis¨±²µ·¶¶°¡S@BHTaiptvy{~ tE05:><DII@9<EHJOUZYTSSRµ²¯««««¬«¬«««¬°¯°±±±±¯°°°±°®®¯¯°°±±±±±±±±±±±±±±³´³³²°°±±±±±°¯¬¬¬¬®¬¬¬«ª¨¦¥¥¤¡ ¡¤§§¦¥£bHQgz¥ª®®¬©¡¤¬°±±±±²µ·´±®«¤}d]aedacgtzswqgeadvvw wsqpsqhtndkqk^M[n{xsqwxzinuqluogh`^XE;;=?FJOPOLBED><77989;>CCE}ujffbhpu¤ª°´¶¶¶°§nHA?<CO\ejrvxz||{z{}zzyy{|}|}~jH/2:<=;?FD>:;AINORYZUQRT¶µ²¯¬«ªª¬¬¬¬««®°°¯±°¯°°°±°¯¯®®°°±±±°°¯°±±°±±±²±±²³³³²°°°°±±°¯¯®¬«««¬¬¬¬¬¬««©¨¦¥¤£¡ ¡¤¦¥££ }bO[wª°´¶µ³²²±°¯®¬¯¯°±±±³´µµ³¯¬§kglqrhi| woojjh_Zt~~}~{xrmqwuvms{nkuzucViz}~zwuvposrlnmkj[^i[LD;5<INNLLEEHC;8<<<>@BA=J ~¦¬°²¶³¯«mE<;97:>CLYhptvuuvwxwsrtvwwwp[9..6799:::A@=@EJLRV\WTSSRµµ´±®¬«ªª¬¬¬«¬®°¯®®±±¯¯¯°°°¯¯¯®®¯®®®®®®¯¯°°¯°±±±²±±±³³²±°°°°°°¯®¬¬««¬¬«¬««««ª©§¦¤££¤£¢§©¨¥£ ~ycOx¢²µ··¸¶´¶µ²±±°¯°°¯¯±³³´´µ¶µ²¯©¢trspfttwtsvqmmhjwumolfaey||sr~wxusvdet|sutrojlqrojll__ca[L5/:LNOKHFIGFDCDA>?ECBCX¢§¯³³¯¯¬Z?6457:78:DO[hnpnorphjprp`M>1+09DBB@>?@@BDFHLOPTZWRRQR´µ¶´®«¨¨ª©«¬¬¬¬¬«®®®®¯°¯¯¯¯®®®¬¬®¯¯¬«¬¬®®¯¯¯¯°°²±±±³²±±°°¯¯°¯¯¯¬«««««««ªª«ª¨¦¥¥¥¥¥¥¥©«©¦¤¢zvfg³·····¶¶··µ³²±°¯¯¯°²µ¶µ´´µ¶´²¤wie_X`igehhz~qsp_j vnprjbesx}~ss||rnovplmnngiifggmhpi^ehhg`ccT849LONLIGIGGEB<=@BFFEFc¡£ªª§¨©¦¡jA688:<:86326FKFDQZL;DMH</-/,.2:@EJHJJKJJKHCGLNRVSRSQR±µ¶´°«¨¨©©ª¬¬¬«¬¬¬®®°®¯¯¬««¬¯¯®««¬««¬¯¯¯¯®¯²²±±²±±°°°¯®®®¯®¬¬««««««««ª©©©¨§¦¦¦¥¤£¤¦§§¦¥¤|wso°´····µ¶··¸·µ³²±°¯¯¯²¶¸¶²²³³±¯£rZ]WPWcgqvovststsqyliropu}tv}|wliusjovmgbdpqmggaaXPbea`]\_Y=8:JOMKKKIFE@@BDEGGGDAKt ¡¢¡¤¦¥hC:889:<;721/1-*.1/(#&('&(,.19;88>GKNORQNFEDINQUUQPSTR®²µ´¯«ª©©ª««¬««««¬«¬¬¬¬®««¬¬««®®®«««««¬«®®®®¯±±±±°±±°°°¯®®®®¬¬«««««««ªª©¨¨§¦¥¥¥¤£ ¡£¦¨§¦¢ yur§²´¶¶¶¶µµµµ···µ´²°°°°²¶·´°¯²±¯«§¡qi^_ltux}ym\eu}rdpooxvq{w~zvlnr[gurd^hsuljed`_V]e]Y^SQF>DJNOOJJKEDGDAEDACEC?<8Iu¡¨«§l?5438?@>:882,))+*(&$%,+'./)2:>@CDFMLPOMNKJJMLQUTQPQQQ¬±³²®«ªª©ª««¬«¬«ª«««®¯¬«¬¬¬¬¬¬®¬¬¬««««¬®®¯®°±±±±±²°±°°®®®®®®¬¬¬«««««ª©¨§¦¥¥¤£££¢¢¥§¦¤ ~xst«²³³´´´´´´´µ¶··¶´²±±°±´¶³®®¯°®ª¤{ops}{wrfaTKUj|ywfligt{t`}jixthhR_moa[rkhcfffee_ZURZaTICJWWSQLHHHHGGD@BB@<:;<:6.S~{¢©ª©£tE1158>BA?=:840.,,.+(*-,&-1.2;>CHEDEGGJHIMLNLMSRPNOPPR®¯°¯ª©ªª©ª««¬«ª««««¬¬®¯®®®®¯¯®®®°¯®¬¬¯¯¯¯¯°±±±±±±±±°°®®¯¯¯®®¬¬««««ª©¨¦¥¥¥¥£¢¢¡¡£¦¦¤¡~yt|«¯²²²²²²²³´´µ··¶µ³²±¯¯²²±®¬¬¨£{vvvvl\QQQS`i}{vmlq{wp`cu _GPIMh{toaWVekd\kd^Z`eeb`\XVV_ZSGSci^WRNJCCHHFFDDBA@<:886,8m{|§¦ ¡¡a@.2788::86289733551/0-+-38579;AEFCEJKLNJLOQORROMMOPRR®®®®¬«©©ªªª««¬««««««¬¬¯¯®°°¯°¯®¯¯°±°¯¯°±²±¯°°°°°±°±²±±±±±±±°°°¯¯®®®¬¬««ªª©ª©¨¨¦¥¥¤£¢¡ £¥¥¤¢|ws£ª¯°±²³³²±²³´¶¶¶¶µ³±°°±±¯¬«©¨¥¢~wnqrmdZ]YY^^ace^bgot}|qdiq{ugWTU[`dqmppjkd`]aeXVRV[__ZZV[V[QOiaVSOKCAEBDHHFBA@9::85,+@avy±²±t¢¡T604::>?=??98:=<:7310214:6<8467@IKMJIIIJOTSOPRNLMNPRQO¬¯°¯®«ª©©ªªªª«««««¬¬«¬®¯°¯®®¯°±°¯°±°±±±±±³´³²²³³³²²±°±±±±±±±°°°¯¯®¬««««ªª©¨¨§¦¥¥¤¤£¡ £¤¡ ~yuu£§««°²´³±±±²²µµ´´µ³±±²±±®¬«©¦¢ mgmousoldadeYXacu}zu}~}pldhba]Zcffhafdbgnrh]\[aXUQS[YYSZTPLKTwkUTOJJGDFHJKDC@<8<<653++:Lk¤·¶´©wq`G9/179<?FJMMGBBEF@994318>?@958<?GQPCFLLJKPQQURNMMMNOON¬±°¯¬©¨¨©ª«ª©ª««««¬¬¬®°®®®¯°±²±±±±±²³´´µ´³´¶µ³²±±°±±±²±±±±±°¯®¬¬¬¬«¬«««ªª¨¨§§¦¥¥¤£¢¢£¤ ~yvx¢¥©©ª±²²±±±±±´µ²±³´²³¶²±®«¨£ ghmv|zuoldaZNbkly{wtzuh`e[Y[RJT][T\^[^jkcbddji_YV\VR[[SIL[y £¡[ROMKFEFEHD>=>:=@<982,(%'T®¸¹¥}¬³³§~ i]M<98215;@FGKOMGEDGD=;797:<?B<8CAAEPNFCDEKOOMQVQMLOX`dkr¨«®®ª©¦¨ª«««ªª««««¬¬®¬®°°±±±±±±±²²´µ´³²´´´³²±±°±°±±±±±°°¯¯®¬¬¬¬¬¬««ªª©¨§§¦¦¥¤£¤¢¡ ¡¢ ~zwy £§¨¨«¯±±¯±²±±²²°°±²³´·µ²°¨¡ qmtwvniioiWLWfppipwy |{aZ_Y[]\PU^___^jssmjkjlmki]]^XWa`VOc¢£ZPPMJKJFEDB<6;???===6/'%#g¶·¸·¸¸¯}xhQJNLCA;:75;EIKJLOOLD@A=>=>9@><@;9@C@CMICFFFHNONRSNXhw©©«¬¬¬«©¨¨ªªªªªªª««««¬¬®¯°°±±±°±²²²±³µ´´´µ²°±±±±²²±±±±±±±¯®¬««¬¬««ª©ª©¨§¦¥¥¤¢¢¢ ¡¡¡ ~zvx£¥¦¦¨°°¯¯¯®®¯®®¯°±³µ··µ³³¯§}krtf]cdpiRdrklgfrtwywxg]]__^[VZegnnbswtt{xoh[Q\S\hcafhVU~ YPQMKKHFDGEE<?A<:<>;62*&%F{¤¨º¸ºª~}}|||S14@B9>99=<AGLPPOQRPJEDAC=><:55<9CAFEGILB@DGLPRSTUh§¨ª«««¬ª©©©¨©©©©ªªªª¬¬¬¬®°°°°°°°²³²²²³´´´µ²°±±±±±²²±°±±°¯¯¬¬«««««««©©¨¨§¦¦¥£¢ |xuy £¤¥¨«¬®®¬¬«©««®¯°±³´µ¶···´®§}aif^dffh[[zsmaWfppotgjmoh__b`VOXbdhjlrog^gupbNHLMS]\]^^V[ ¡¢xVQROLIGFGGGECC@?;:=;82.+(%*8CN ¢µ·fkswvwvqrvkE17@?<@BA@>CFJPSRRNJFHIAA???<?CFFIJHFJIKJHKKQOOVZm§§©ª««¬ªªªªª©¨¨¨©ªª©ª««««¬¬¬®¯¯¯¯¯°°±²²²³³²²²±¯°±±±²²±±°±°¯®®¬¬««««««ª©©¨§¦¥¦¥£¢ zvty ¡¤§ª««««ª§¥§°±±²²²±²µ··µ±¤|feaenjhfWkygf[\YXjsj[ahlcU]geVLQZaf[hoZRU\haYPJU]YVWXRQU`lUSRMOMMLIILG@?<>==<=;41/&%(('(,6XtO5Nfplk]NF@=.26=?ABA?A@@DFKNMNKPH?GGEE==EMMLLJFFEGQGCBMNONRYaw¨¨§¨ªªªª««ª©©¨©¨¨©ªª¨©«ªª«¬®®¯¯¯°°°°°±±²²²²°°®¯±±±²²²±°°®¬¬«««ªªªª©¨§¦¥¥¥¥£¡~yuru £¤§©¨©©¦ ¢©®±²²²²±°±³¶·µ²®«¤~hfbekfil_pqfeeq^Xkvm_enk_X`hfLDJZ`geYTLIQZYVSPKXbg_\_VPJadTPMNNOPONKJKGCA@=:9=;974+)'%"###$((&,8?>=2)+)'$/6;@DD@==?DGGJLNRMNPIJQPJADDOOHGD<?FHMKH?IMLOSWax©©©ªªªªª««««©©©©§§¨©§©ª©©«¬®¯¯¯¯°°°±±±°±±²²²°°®°±²²²±±±±¯®®¬¬««««ªª©¨¨¨§¦¥¥¥¤¢¡|yvqr ¢¥¦¥£ £«¯±²²²³±±±³¶··²©¥¡~pp_Xdtukjnlgfkul`glmjqmdVbic_@<G]gbgYMQTQQR[TRVZZ`aYVVSI`\QNIMKMOKKKHHHGED:9::97872-'$%! %(')(''% #&&$%%+9@CHE>@C>=BJKKIKOPLMOOOHGJJHMMECJIGHJMJHIGJMQWT\u©ª©©©©ªª««««ª©¨¨§§¦§§§ªªªª«¬®¯¯±±±°°°°±±²³³±±±±±±²±±±±±°¯®®¬¬¬«©©¨¦¦¦¦¦¥¥¤¥¤£¢¢~yvusq¡¤¥£©¯°²³³³²²²³µ¶·¸³«§¤ ~pgUVftl[_lhfdaln`[dkqpd\X_ca[LBGXkh_XRPSTQP]ZOVYU\`XKEEHdyXPKKPOMLLKKKLKIHGA>=@><975/*)*%$*)&*,)&$#%&%$$'/9BDD?<??<@FKJHGHIIMKNOKEEJKONKIELQPKLNKIIEHMSOGLfz¨ªªªªªª©ª««««©©¨¨§¦¦§§¨¨©©«¬®¯®®°°±±°°°±²²²±°°±±±²±±²±±°¯®¬««ªª©©©««ª§¥¦§¥¤£¢wprzywwtp{¡¤¤¢¥°°²³´´³³³µ¶·¹¶±¬©¥¡{`PSee^STZa^_b`VW]_aflib_[VYa^RKOWeoYHSYUZRP]^VPLT^YI>=:<Xu mULHNOLJJJIJLOPHEGFGIHEE;9954-,-*-*(+++)&&&#$&*147@CC>A=<9>DHMKJLLNLJMNKJCHKMLJMJLQNOMJMKHGFOTE=BRj{¦©¨¨¨ª«¨¨««««««©¨¨§§§§§§©ªª«¬¬®®®¯¯¯°±±°¯¯¯®¯¯°±±±±±°¯¯¬¬¬«¬¯¯¯±´·¸¸¸´±°²±¯¯¯¬©¥ ~mS\lv~ ~{zzuow £¢ª¯±±²³´´³³´´¶¸·´°¬¨£yQFScaYUXYTRS[cWRW]aeggida`dd\WTUbio_IRa`^W[``d`^XOF<:916=Mrnmv}oULEHNMKLIKMJLOPMKHEGHIJID9497..-,,*..,,.%#%''*5AD=9?><CB@ADFJNMLONOMFJMKKDEJJKIQRJHHPIDECGHJSK<;BJUfx¦§§§¨§¨¨§©©ªª«ªª©©¨§¦¦¦§§¨¨©©ª¬¬¬¬«¬®¯®®®®®¯¯¯¯°±±°°¯¯®®¯°°²³´²±´·¹¹»»¸··¶´³²³±°¯© |kS@Oju zvsos¡¦«®±±²´µµ³³³±²¶µ³²°¯¬¥zQOX][UXXSPRNVXNTVW^gnnogdijdXU[ZemlicZafb]bXTZ_`P>=>:2)*08D6BggJGKHMOKJIJJJILMNLNKAEHGJCIXZQI=GD:203001.&)**06AFFA?>7<DBCDBDJMIFHJLQIKLLNOLNJJJMPPLLOGFDBDJPO849BGLSar~§¦§§¦§§¦§§¨ªª«««©¨§¦¦¦¦§¦¦§©©©ªª«ªªª¬¬«¬¬¬¬¬®®¯¯°°¯°±±±²±±²³´´²³µ¶¸¹º»»¹¸¶³±°±±±°¯¬ª¡fF6Ifs~ }ytqnm¤«®°±±³¶¶´²°®²´²³³²®©¡~RMUa\UXXUZ\W[L<CD>EWjpd`crlhUM^dgnkjqm]^_[ZRMRSMHEEGC:3.*,-$-KK?JKMPNJJKJIHLLGCHV]hkhjq~wi`[ZTL?76756370.;>CFEDB::DD;?@:<DLIADHDJKLHGILNNJMNHGHJHDFCAFBHWlN7:AEIMOYkz¥¦§¨§¨§§§§¨ªª««©©©¦¥¥¥¥¥¦¦¦§¨¨¨©¨¨¨¨ªªª«««¬¬¬¬®¯°¯¯±³´´³´³³²²±±²¶¸¹¸¹ºº¸·¶³±°°±±¯®®«¦tC1Jeq| |zwtrmh{¡¨¬¯°±²²³µµ³±¯¬«®³³´´³¯«¤SBP]VKLMT[][bI559;DMWZQJYqi\OHerjlneli_\`]ZSOGGEIMHIGCA=:81%%49CJKKIKIIJIIGBKRex }vpga^^\SLJD=>>8.-8:1899;7<DB<<CC@CFG>AIFEGHGCDGJJJNMJIKGDAAABFGJc_=?EJLNPVgy~§¨§¨§§§©¨§§¨¨©«ª©©§¦¥¤¤¥¥¥¥¥¦¦§§§¦¦§§¨©ªª««ª««¬¯°²µ·¶µ´³´´²±¯¯²µ¶·¸¹º¹··µ²²±±°°®®®«©¨¥K3Sis| }ywurpkeq¥ª¬¯±²²²³µ´±°®¬«°²´´±¯ª¥\FSYOFHLPMQTYL88BKMPXTLMP[`THD[srihf]_gdbaZSMHJC@HIEDDCAD?1%'09EKMJHLNKHKJI_z {xqmedda]^^TIAB?8598267;F><?B?;<C@?AGHEJJDEFHGECILNKIFGIGFCBCKLKY{oHDJMLMYp|¦§§§§¦¦§¨§§¨¨©©©©¨¦¥¥£¤¤¥£££¤¥¤¥¥¥¦¦¦¦§¨©ªª««««¬°³¶···¶´³´³±°®°²µ¶¸¸¹¸··´±°¯°±±¯®«ª¨¦ wZdmv {xutqnkei ¥ª¬°°°±²³³°®¬ª¬¯°±³³²®©¥bMQSNOOQOKPTXQ>CPRJRYTV^`ba^RJQ^c^]c`[ZXSVUSKEMG?>>><=>:75-(,4;?FKMJJKJHDHm }}tpjdaccbehhbXHB;=;47;;<>;8<:??>?;;DEEHHAFFEEIJGIGFCIJE<<BIEBJPPk|OEKN\oz|¥¦§§¦¥¥¥¨¦§§¨©©¨§§§¦¦¥¤¤¥££££¤£¢££££¤¥¦¦§¨ª««««¯²µ¶··¶µ´´´²±°®¯²³´µ¶¶´²°¨©«¬¬¬¬«©§¥¢wu{|zxutqmhcaw ¦ª¬«®¯°±±¯¬¬¯±±±±±¨¥hKKORXYQGKQU_XIKNJKRVUYbijgmc\`XQPMSVWMF>@GGD=BA86662*+'&+**/7=?EJNKHIJHRq |wsgdcdgcdmrsveVMF;/>A=<B??A=<;;=;;BAAEGBD?EFILLLGHEHJHCCEHGEKMV ]IYnxwf§¦§§§¨§¦§§§¨©¨¨¨¨§§§¦¦¥£¤¤££¢¢¢¡ ¢¡¡£¥¦§©ª«ª¬¯²³µµ¶µµ¶´³µ´²±±¯¬®¯°¯¯¯®¬ª¨¥¥¦§§¨ªªª©©§¥¢ }{{yvtpmic]h ¦©¬¬««¬®®®¯®®®¬±±±±¯«¨¦ lHJJKTZIAJHQ\WOQJEJMQPW^`dho_bk^SQLLKK<00688766547C6-&! $'(3;AEDCFKIGHPk ~wqmhedfhptxzzxr\VNFB;>EBFID@:8:<>B@DDKNGBKJFHIEDFDBBCEHMJHGKMhsrx~u_Bª©©¨©©©§¨§§§§¨§§¨§¦§§§¥¥¤¤£¢¢¡¡¡ ¡¡£¥¦¨©¨©±´·¶´´²³´³²³³²±°©©«««ªªª©§¦¦¥¤£¡¡£¥§¨§¦¥¢ }zzyvtromh`[a} ¤§ªªª«««¬®¯¯«°²³±¯ª¨¦mIJJJNNFHNEKTTNQSHADKJLQTV_gQUh^TMJHA92-0.*-5649EKUHE923+% )7?FHHFIOJGYq~ zwtnkiinpw|}~~qif\OA?E@?>AC><:<?@?AFIIIGJIIFCCBGJFDDDGJFFDIUz~sY=4©©©©©¨§§¨¨§¦¦§¨¨¦¥¥¦§¨¦¥¤¤££¢¡¡¢¢£¤¥§§¬°²µ¶µ´³²²²²²²²±°©§¦§¨¨§¨§¦¦¥£¢ ¡¤¥¥¥¤¢{zxwtsqolg_[`s¢¥¦¦§¨©ª¬®®®®¬¬¯±³±®ª©¥qGBCGIIEJNDAHPKMWPICEIHKQRTRC=CBDE?47<77<>BCJSRW`hjkk_RND2+-:AGIHGIFIa{ ~}~}wvvljlry~{}|zxzm`TPB:==@;8:<<@F@?GIFGIJJKFGEIKILHCEIGHHMavX=14¥§¨§¨§§§§¦¥¦¥¥¦¦¥¤¥¥¦¦¦¥¤¢¡ ¡¢¢¢¤¤¥«²²´´´³²²²±±±±±²±¯¬¨¦¥¥¦¦¥¦¥¥¤¡ ££¢¢¢~{zwvttqmje^\bl¢£¥¥¥§©ª¬¬¬««¬®¯°°«ª¥tLBBEGGDKJGEHKJKPKH@<DFMTSRPOL<76:86>B@DLS[]^bffhmrtqh\OE?95;DJIIIG@U{~}~}}z}kmsy~|~}{dXKA@:<74<@<AFFBGONIJHJLIHGFGEGGHMPMLMPdY10=¢¤¥¦§¦¥¥¥¦¥¤£¡£¢£¢¢£¤¥¥¤¢ ¡¡£¤¨¯²´³²³²±²±±±±²²°¯¬©¦¥¤¤£¢£¤¢ ¡¡¡£¢¢ |zxvttqolha\^ci} ¡¢¤¥¦¨«««««ª«ªª««¬«©§£tNDCCC<>EGLMKOQMLGHD@EGQY[TNQQKF<6>C@Tbjllje__iomopkfbd^VJ?>AHLKJHCHt ~{{|{|}z{wpcWL=5678::>BHJGIHFFFJMKFEHHEDEFMVTVVZqb<C¢££¤¤£¤£¢ ¡ ¡ ¢§²²³²±±±±°°±±±²²®¬©¥¤¡¢¤¥£ ~zvutsrnljf_]`ekw¡¢¤¦©©¨¨¨¨§§¦¦¦¨©§£ uNC@=;89BLNNPUUPNKNOLLOSY[YSOMKKAFMNXmsqnikjchjjfgg^Z\chfWGAHJHGHE?a |y|}{|xrpmleSB<747;?BFDHJIGKIEJLJELKHFKP\t vP ¢¢¡¡¡¡ ¡¦ª¯±°¯°°±±±±±°°°°¯¬ª§£~ ¢¥£¢}xutsronlid^^dimu¡¢¥¦¦¦¦¥¥¤¤¤¤¤¥¥£ xOA>==>>BMNNSVWTOINTTUVWYVVVLC=;AUWeqomkgemrpmnjhca^^__bbZJAGKJHE@Erz~ ~ }|}~xposrqttrm_L<14>ACDBHJIKIPOMKJGKOKLN[{£¡¢ª¯¯¯®¬¯¯°°°±±°®®®¬ª¨¤|wqdPKVeqz ¡¡ywttspnnlic_afkpw~ £¤££¤¤¤¢¢£¢¡¡¡uK;=@?ADFJNPQSWTMHIQSSQNTTOLB91.=PlunhfhgggptlmmnoppnhbebZQGHKKKHBOtw|~ ~{zroz{vxusrn]B7:@BELLJKLJEIKJLEDKKMT`s§ª¨¢ª®±°¬®¯®¬«¬¬¬«¨¦¢zshVB=.$<gu ~xtsrpomlifaadjntz ¡¡¡¡¢¢¡¡ tG69<==CFLOQPMRPLMLRQKJFIMNI>65?RZqrjijggngitsknputommnn`RLFCIJJIBVxyy{{~ ~~zvwvsqtwwuqtxhNCBDEGKJIKLIGG@EHKOPNTg¨¬§¢¤«®¬««¬¬¬««««ªª«ª¤~ufX>*' 'Zt|vrpooomjhc`chmrw| ¡¢¡uA),005<@GKMOLQRPONMIFIMFB=8;<:L^\cnssoc`nmkqvkkrrmigghcbO@>AHJHIGfywy}~~ }~wruwttsstrtxvwuVBDDHKLLNQOMLGBEKKPQQb¢¦««§£ ¨ª¬««©ª««ªªª©©©ª©¨§¤xndQ4"Hsztqonnnkifbcgkpty~ }tI+''&%(.49@FIKLNPOGAFJMH8+/DA?NW_kswsrrnljinplhijiigfi\a_D;BHKLJOtzxx}} ~ ~rikjllpljpoqstz}Z?AFIPLPMKRURFEKJKMOc§©§¥£ }vsrv¥¨§¨©¨¨¨©©¨§©¦¦§§§¦¤ ~tnUD?;(Fvysonmmljhdcfjmqv{{ve<..(%&&().16769DID?>=<6(-=IFIVeqxywptsmnjfjlmlgfdiondX[ZD<@DMOHRy}{x{{||~|}~~{z}}~||~qiiinpuvonmrroqxmO<BGNKHNLMOHIKOPLMSo¡ ¥¤¤¡~wkXX^gv}¤¦§§¦¦¦¥¤¦¦¥¤¤¤¦§¦¦¥¢d=*(! P~wronnljigdeglosw{ zwu\93*++)++,,,,,*/541-%$#.DJMU\oy{{xonhfeffggijdacinwdHMM:9:=HMJd}|{zyy{{}}}~ }|~ywzz|~ xstpp{vzaEHJKLJMLKNNKILOOU£¢ ¡ yp\CCK\ikejv ¤¥¥¦¤¤¤¤¤¥¤££¡£¥¥¤¢¡zO&#d ¡ |uqnmlmjigfgjnqtx} | {zyo?*&))+,'%*,--)&%$!.CHN\anzvx|oh^_Z^dgddcaairnjdTRB7658AJGn{{{yyz|xx y} {z{{} uvswz{a?EEJJJKJORRRONM[ zp^?406B8=Gj~{¡£¥¥¥£¡ £¤¥¥¤¢ ¢¤¤¢ }W%3w¢¤¢xsponlkigefjmpsw|}zzzvM" "&&$#$',,+-,*'&&'%&:MKVafmxoquk`RUO^^`eillhnuo`^h`I:7.19BKw{|{yz{}|y{~}|~}z}}z{|||~~}~r`HOJIKJFFJMPOLK[ ~sdB-" #$'8NZgv ¡¢¢¤¤£¡¤¤£¤£¢¡ tD"V {tpnnnmjgeehlorvz~ yxz{xh/"$$&)),--13567642/.//>JE\b]iuf^dcWQYWdgimpsqiksn_V\TF<4($3>Kw}z{zyy{~}yyz}~}z|~~{{}||~~{{}~}~~ }}dRNKJKIIGGGIHEWxjL,# !(.@Xv £££££¢¤¥£¡¢¡ {L"7y~wrommmkifdfilosv{ }| }vuyzzsA)*+-/1356789::9:855557BKUSPmg]TQV[\ellftskjid[d[MOKA<90"+;Dqzz{zyxyyvvxwxuvzyz}}{|~|yxxzz|~z} rt]NGHKIHIILOMEO}|qb>*%"!#&/<Tz £¤££¡¡£¡ j9"b ¡yurnmlljgddfjmptx{ypqy {wuuwzzwX0.0245689::<=>=<<;988=[cZP_h^WQN\g`lxsjuskoqbSQG:B@9:7( #:Jmvxzxvwwuuxzywttuxyzz{~}}}~yvvwuy|~xpqSCHMJIJLNPNIJyyp_A.*)*+.B[~ ¡ zd2U| ¢|wrpnlkihdcfhknptw{~ }lbgt}{z|{utvxyzzyh:546988:;>??AAB>>?=;:>Vf`aea^TQ_lgcvytsvmmvt`OI=198533,'##7Lflrvxxwywz|zzyywx{{yzz{y|~~~~{|{y{|~|{yxvuxw|~~z~{yk@EGIHFEGIDCCszrhTA759Omz xf: Hy }vspnliihfeefiknpswz}recit||}~~~{yxz~~|zxusvxz{{zpLCBCCCGGIMNNONMIIJGFBAIbimki]UValjtzxtskdmojYKF;2..0,.38969zzqptxwxvz||}|}~}yy|}|~}}~zxxz|}|}~}zy|vv}||uv~|| }hJMNLHGKIFBG`qy~zvmnx oF Jw¢ ytpnmjigeefggiloquxz}¡¢ vhehjqw{{{{zyvvyzywuvttvz|~|s]XZZ]]`abfhfffc`_^\ZXWSUflsqZRYborwtpdma]id^QHHD@42469?GMDV¢yov{{wwz|~}~}{}|{~}}~~~||{{|z{}~|{vv|vwy{zw} oTPOJHNLDBBCO^nr}|nK)!Q{ ztqonliifccdhijlosvyz{ ££¡ zmfikmotyzzyuqptuuuvvvutx|~}uhhjlooqtvxxxyxvspnmllmgZ_lvt]Xamuppof]i_`bZVQLNLGDA@>CIPU[| ¥ tovz{zz|~}|||}~}}~~~}|{}~}||z{|y|{y{z}~}}}}yz|wvz|~pZNQPIHGA<==>BIPYl~|s\LB9Eh{|vromljhfcbbeghklnruvwz¥£{mfknnmpttrpmmosuvwwwwvuv{}|unnrtwz{ |zyyyzypehc\X_bnqnki]dhcjhZNKMIBABELLRZ^g¡tkovwx|}~}|~}}|~{}{{~|{z|~|{{zzz{y|z{|}~{yzyyzvz}|cNFLSQKE@<>=;>CKWl{} ~{}~ }vsqnljhfd`aceghjmpruwz~ ¥£ohmoonrtrqnnpsuxyzyyxzxvwzxqmptwz~ oWLINTkrn\W\ifgliO=;CJABEDLYckn{xhmquxyy{{z{}}~}yvz}z}yvwxy|zyzz}~}yy|~}}~|}~t]IGJLGBA@>?>AIT_pxy{|wrqnljhgeb_`beghilprux|¢¢rkoqpptvutrrtwyyz{{zz{{yvuqklptx{~ }]ROQktdWUbnkiZO@;>BEFCEKSbowzvhnxwxxyyz{~~~~zy|}z|~zywwwwwxw{{yx}~}~\AELNIBAB>>BHNUbquxyz}{tromkigdc`]^adegimprvy{vnqsqrwyywvvyy{{|}~}|{||zsjfjorvz}}|seaZW_[cmdVDCCFLNNQRV]enx|~sfrvwzzyzz|}|}|{}}{{xz||yxywvwuvwx|~zzz{zz}}}z||{q=CKFB@?@ABHLSXgquwxy| |vrpmjhfc`_^\^`cegimorvzz~¡¡yptustwyzzyz||}~}}|~~|ufdhmquz~yfWXWNWVKFFILOT^aglmrz}lgrwyzzyxx{}} ~}ywwyxxxyxvvvvwvxx|~|{wwyxxx{z~yI<CEAADDFIMOS_mqtvwz{}¢~xsqolheb^[XYZ\^acehknquxy|¢£¢}vyxw{ ~~}}~~|ymehmswzjUMNPMLMQUWY]isx}}jlwxzzxwxxz|~ ~~}{zxuuwwuvututuvwz|}{}|{z{yz{|tL?ADMNJLLPRTdopruxz{} ¥ }tqomjc^\XUSUXZ]^`cfhkpstsv ¢¤£ }z{| ~~~~|{ufglrwzujjiaYWY^fhnv{ mVbtvxwxxxyz~}~}}|wtvuvusrttuxyyxyxyxz{||zxmUEDEJLQOPOTYgoqsuwy{~ £¥ ~xqmjhd\UPKGKRVXZ\\_bdgimliq ¢¦¤|~~||{{xigmsw{ xvyz} } sB4Yuwxxyzz{|}~}|||wwvwvvttutsvwvxvuw{{yz{{}{iC@DGFINPPSV]lqstvwz}¢¢ }xqmifc^VKB99BJPONPSWZY[\_ZYn ¥¢~|{{|ykflu{}l~ o7 $Egwuvwyyz|~||~~}}~{{zyxyxwuwvwwtrutrxvtwzxts{zzx~ xQ>BHKNNOQTWcnqrsuw{| }zulifaXQH:1,.5;=<>?>DHHIMNOSg |{{|ykrjWvL2'!*Gotuxyzz{zyzzx}~{{}zzwyzxwuwyvvwvwxsquvuvutst||vuqwsNCGJLMPQQS[hpstuvy| }yrnid_WJ>5-,,-14569::=@DGLQUZn ~{zzz{e^iuvtC51.*%"Ciptvwyyxvxywwzz{{zzyyyxwxywuvxwxxttvusvutstvtstqu|~}dIHHKOPRQQU`osvxxy|~ ~yrkgb\UJ<311224788:=>ADGLSZ`ioy¡¦¤¢£¡}{{zy|}g\XTXmvzwgJB?<974.)2Ijstvyyyyywuvwzyvuwyyyyyyxvuvwxwwuutsvuuwusqqtsuxyu]GILMORSQQXgtvyyz}~ ~zsjc^WMH?614778:<>?ACEGLPU_hpuy} £¥¦¨¨¦£¢¤¤¢}{zy} ~tfa[VRRQPLR[YIA>;852>XlrtvxywtrsxyxwwxyywvwxxyzxxwwwuvuuttvvurqsttsvvxaBFMNPQRRSbnvxy{} }|}}|xtjaWND>:8889<=>>?BDDGJMPU]fmsw{~ ¢¦¥¤ }~yw|~}vib^XV_s{vgWNHHHB<5;Yksvwwqlryyvwwwwwuxutvwxwttvvvvyyxy}{yxutututx{`KNOQPOQT_nswyz} ~yrpwztjg^SA;98:;=>?@@BCDEGIKOSV[bhoty} }zwv}~vs| ~vl_UQNKE>7:Gdqvncqyyxwwvvuuxwuwvuvxwxyy{yxxx|}{zyttuuuxw`NLNQPNPYiquxz} |sgefmfYQJA77:>AAACCDDDDGHKOQSVY\ckqvz}z wy{{~xl`VTOLF9//;STRowxxxxxxwwwxywwyxyyzzxxvtrruvuwxututuwoUJJNOOMIH[pvy{~¤¡ ~xk\WRSNF@<;>ADEEEDDDDDEEHJNQSUVZ\clqvz~ }yyzux|{||vk`XTQNG;3-.)Dhqtuwxyyywyyyxyyyzzzyxvssrstvvtuuuvtq^OKPSYac]_`ovz|¦¦£ ~}yq^LC?>=;?BIMMMJIIHGFGIIIKORTUVWY]dlrvy~~}{w{vsuyw}|}zrd[VSQNJB6.)1>Tbotvuwwxyyxyzxz{zzyxutttssssuuuuq[HINXdostupkquy}«ª¨¥£ }{vqqpplYH>;9<?GORTUSRPMLKJKKLNNPSUVXXX\ahotx| ~|~}~zyu}ztttutsz~{ wl`YTSQPKD<2*'';JZhpqtuwwvwwyywwvusqqmkhknmggkk]B@Ncpuxxtklosw{ ¬«©©§¤ ~|ytmf_SKMLL@:;?DJQWZ[ZWVURQPNNONPRRTUWYYYY^flpuy~ zxy|| {zwv~usuvutsty{{~xz}ui]WUTRONJC:40-.6=DU^agjprssoheb__^\\Z\`bcejplNN[irxzvklopsvz¬««ª§¥¢ |{xtojf^QD;78:;<@FLSZ]\\][[XWWTRQQQSTUUUVWXXY\ainsx{}ytotw|{~yxux~utvwqntsuxy{||~|{|sxyod]XVUTRPJGC>972/02447;ERa^_aa```ab_[eiquwzxiX]ksxxkkqqpqtx} ¬¬«ª§¤¢ ~~~}||{z{yxurmgbZRI<6577:?DKRW\^_]^^^]\\\ZYVVVWVVVVVWXX[_flquy~wkb`ly}{}~ ~zvrzyuwxwkgpvsuxyzz{}|}|zzzyr|xoha[XVUTSPMHEA>;972-*)(A`ejmmllmonZfty|{d`htwniprrrrsv{ ®¬«¨¥¤¢~~~~~}}|{zyxvuspmic]RE<7578;=>FMTY\`aaababa```_\ZZYXXWWVWXY[_elpsx{ tf`^cs{~|x{ {ywrs{vuvwn_cjsrqvwwwxz{|{zz{ut }vnfa]YVUTSOMKFB@=;86.4^nptuvww{kh|uopurlnqqrqrrvz~««¬¬«¨¦¤¢~{z{|~}}|{{zxwvuqolfb^YQB967:<=@BGNSY^acceegggfeecba^^]\[YYYYZZ_dkosx}|pc_^^fw}~~~ |xvtt~{stshMN^hpurtvuvwxyz{zzzsx{umhb^ZXVTQOMLHECA<4Bjx{~ vysutmnqqssstuvy} «««¬¬ª¨¥£¢ |zyy|~}~~~}}~~~}{{zywwuttrokfaYRIGA988;?BEGJNUZ^befghhiihhhhfeccba^]\ZZZ\^ekpux| {mb^^]^l{z{zxvyzmk^G@FUdnyvrxyzzyyxxzzyt ~ytpkfa`[XWTQPKHB@\t {zwyqnrtuwxxxxy{ ¬«««©¨¦¤¢ ~|zzz{{{{{||{{zyyz{{zzyxvutsrrpnjd]UKB@<;:;>ACFJLNRW\`fhhijjkkkjkjjihggecaa`^\]`dkpuy|~oc__^[[dz }|~~~z|k[SG@BGP`kuwu|{zzzxxy||ww |yusojic]\ZVQRjsw{{z{~~~~~ ¬ªª©§¦£¡¡}{zyyxwuuvvvwtqqrstuttsonkjigd]YMFB<::=?ADGIMNNQSX^cgijkklmmllllmkkiihggedb`aeinrvz}tfa_]\[Zh }{{{||}XISNGGJP[gruv~~{zzzzz||tz }zurmhb^n z ©ª¨§¥£ }yxywtrpmlnmjfcbegghleb\YXXTNGA><==@BDHJKMOPQRUX^bgjkllllnnnmmmmllkkjhhhggghlquy}}qhb__`_av ~|{}~~k_a[RPTW\iuww||{{zy{yr }vkjy}¦¦¤¤¢|zywuqlgdb\[UIHLOT]UNKIGDCCBAABCDGIKMOOPRRRUVY^adiklllnmnnnnnnnmmkkklkkjmnruy|zpmmswtt}}}whedbabcelxxz|zyyxx|vw ¡ }thmslt~x{¢¡ ¡|yvupjd[KHF@7;?CRTHFDDDDEEFHJKMNNPQRSTTUVVX[_bfhkmmmmmnnnnnnonnnmllnnoqtx{ |}~olpqnmnnq{wz~{ywwxzzsy ¡¡¡ }xuqmibD7999:>DM[OIHJJJLNMLNPQRSSRSSSUVVYZZ^ceilmmlmmnnnnnnnnnnnooprsvy}~~~ywvvtuvuuxsy~|{yxxy{vswxz} ¡¡ £¤¤¥¤£¤£¡}uqmjjS667:=DIMZXONNPPPPOQRSTTTTVVVVWXXZ[]`cijlnmmmnnoonnnnnnoopqqsvy} {{}}{{{|}z {yxwwwxwwux~|zzzyyxsvtorrtvz ¡ ¡ ¡¢£¢¢££¢££¡ |zmdeh_>9;?DIKNQVSRQRUVUTSVUTUWWVWXXZ[\]^`dfhlnnnoonnnoonnnnnopqrtvx}zz|||{zzz{|~|ywwwyyxvtw||{zzzwsusonpoqv{ ¡¡ ¡¢¡¢¡¢¢¡ }xufZZbH>AEJNPQSSUWWVWXWWWYYYYZYXZZZ[^^`bcfiklnnooonnnooonnnopqrsvy| y{zzwxz{|||ywvwwxvsotz|{{zvqqrnlnpt{ wpk[PZUCHKQTUVVXZ[\[\]\\[]]]]]\\\]^]_bcdgjmmmnpponnooopqqponqsuwx}}{{zxuwy|y}zzzvrrqsvsmqrtturlmqnmos| ¡ |tkdZNP^PMPX\_abacddcdghhhgffedcbccbcdeiijlmoopppqqppqrrrssrrtvy{ zyvtuuuy|xxxurqoqvsefda]`cchrvy~ ¡ yp`VRMO_[V]bimpppoooqrtuuuuutrqonllljkklnoprqqstsrsrsttttuvwxx{}tqqqos~zxyyxxyy| ¡ zui]NLNR`e_fqxzz|{{{{|}~}|yxwvttssuuuuvvvwwwwwxxzyz{|}{yxwzzyyz{| ¡ zsmbWRPRYamhlz }|zyxyyyyzz{{||}}}~ ~~}yyzz{| ~yysjc\XX\`clwxx}~ }zzzyyzyxyz| xnlg`][\adho{ zxyzzyxxyyx{}|yqf^][^bfkory}xvxyyyyzzyy} ~|upoi`]\_fjosw}}wuxzyyyzzzzxsome``_`fjmquz}|{{{|~ hb__]^cgkqvz]\_dgkorw}`fjosw{ mZNIILSaqquw|oK4-**)*--039HevttpH0,(% %+,+%$*./4;Rximjkijijjjkjkjkiljkjkljljjjjjjjkkklkjkikikkljmjljkkjkjkijjjjjjjikikijjijjjjjikjjjjiiiiiiijijiiihiiijiiigjgihihihigigigihjghghghghghgifhfggggififhfhgghhgigififhggggfifjfhfgghggghghghggghghghghhhhghghgghhhhhgggghhhhihihihhhihihihhhihjiiijhkhkhjijijhjijiiiijjjijjjjjkijijljjjjkkkjlimilikjkkkkjjkjljkjlimhljljkhjhkhkhkikgkikhlikijijjjjjjjjjjkjkkmklkkjkjljllklkkjikijjkjkkkkkikijkjjjikjjjhiijiiiiijjjjjjjjikjjjijhjhjgihihiiihihigighhihjgighghgigighgifhfhfhghghghggfifhfgfgfgghgififhfhfgggfhfhfifgfggghgghhhhhgggggggghhhhhigighhhgggghghghhihihihhhhhghhhhhihjiiiihjiiiijhiihiiiiiijkjjjjjhjhkhjjjkjjkjkjkjlhmhljkkkjmikjjjlilhmhmgmhlhlgmgmhljkkjjjgkgkikikhkikhkililjkjlkkkikjililikjkjkikijjjjjjjkikijjjjjjjkjjjiijiiiiiiiijijjjjjjijjijijhihjhjhijhiigigjgigighgighghghghgighghfhfifhfhggghfhfhfgfgghfhfhfgfgfgfgfgfgfgfhfhfgfgggggghfjfifgggggggghghgighggghigmfmhjhihhigihghhhhhghgihhihiihigihihhhihihiiiiiijjjijhlhkhkhkikjkikhjikikililjlimimjljmjmikililhkhlglgmgmiljjjkjkhkgkhkhkhjhkilhljjjjikjkjjjjilikjjjkjjijiiijjjikikjjjijijijijjijhjjijjiiihiijijiiihigjhiihihigihhihhjhjgigigjfhfhghghghgihhghghfhfhghghghfhfhfhfgggggfhehehfgfhfhggggggggggfgfgggggggghfhggggggggggghghghghiktl{k{iugkhhhggggghghhghgigjgjhihhhigjgigihjhjhjhjhjhjijhlhlijijikjkjkhlhljkkjjjikimjmimjlininjlkkilimimgngmikjkkljmhmhlgkgkikikilhljkjkikikiljkjkikjjjjjkikikilikijijikijiijhiiijijjiiihjhihiiihiihighhhhihigighgigigjgihihhgifhggghghghghgighghghggggggghfhgifhfgggghfgfhehegegfhfhghfgfgggggghghggggfgfgggggfgfgggghghghggkiul}m~o~m~gpghhggghhigihhhgigjgigigjgjgjgjgjhihigkgjhiiiijhjgkhkikjkkjjihjhkiljlikijkllljkjlimjmkllllkjkilhlhlhliljmhnhlhjglgkhkhkhkiljkjjjijijjilimikikikilhlhlhlhkhjhkikjijiiiiiiijhjhijhkgkhkhjiijhihhihhjgjgighgigjgigigighghfgfgfifhfhfhghghghfgggghgififhfhigsiviihdhfhfgggfgffggghggffggggfhfhfgfgehegfgfgfffgggggfgghokxm|n}m}n~ohtghghhgighhhhhhghghhigjgjgihjhjgjhiihhigjhiiijjijhjhkimilikikhljkikhlhkijikikjkilhlkkmkmklkjlikikilglgninhognikgkhkhkhjhjhjijjijiijjjjjijjjjjikikhjhkhjijikhkilikijijiijhjhjiijhjhiiiiiijiiiihihhigjgigihhihhjgjgighfhghghfiejeieifigifhggggfhfgfgfgfipl|m~lvhjhghggfggggggfgfgffgfgmfmfiglfkfohqisgogohsivgqfjgnnyn}n}n|n|o~o~hnghgihhighhhhhigighhihjgjhhhihjhjiiiiiihjhjhjijikjiijgmhljkkkjmjljjhkhkikhlhkilimjkkjmjmiikgmhmhkhkglgmingnglglhihihjijjjijikjkijikilhjiijhjijjikhjgihjjlilikjkikhjhjhkhjijiiijihihhhhhhihhhhiiihhghgighghghghghgighghghghfieieheieifhghghgheheifiegfktn}n}p~jvfigfgfgegfgeefehdkfmlwkzhzj{jzm|n|n}l}m|n|n}m}jzkzm|m|n|m}m~njwgighhhhhggggggghgihhhihihiiiijhjgihhhigjgjhjhjhjhjhjhkglhkiljlimhlijijijhkhlikilimkkkkkjijgkhminimhlgkgkililimgkgjgkhkhkhkijjjikijijhkhjjhkhjjikhlhlijjjilhmilikijhiijijhjijihihihihhhihhhhhghhihighgghfighghfhghgigifhghghfhfhfhfgfgghfhfgfhegegfhfgfiuo}o}o~m}iwgkehejejengtgwhyl{p|n~mm}n}n}n}n}n~o~n~m~n}n}n~n~l}m|n}nl{hnfgghghfhggghhgggghgghgghhhhihjgkgigigjgjgjgjhjhjgkgkhjhjhjhkhkgmgliijjikikilhlgmhmjkjkijhkikjkjlhmimjkjjikikilhkhkglhjjiiiiijiijhkhkhkijijijijikikikijjjikgkhlhkgjhjiiiihihihhhhhiiiihhgghighhghghgggfhfhfhfhfigigihifhfhfieifhfgfgfhfhfgfgfhegfgfgfgfimn|n}n}n}m}kxhwjzjzm|o|o|n}n}n~nmm~n~m~mn~p}n}n}m~m~nopmlmm~ivgkgghgghghggggiggggggghhghgihigifjgigjgigihihihjgjhkhjhjikglgjhjhkhkhkhkikjkilikililjlklilhmjmjkkkhlhlilimjmjkhlgmhkhlhljjijikhjhkglglhkhjgjijijjijjijhihihigigkgkgkgkhjhhhhhihihihiiiihihgighghgighgggghghghfifighghggghfgehfifgfgegfgfgfgfgfffffgehfhfgfkun}n}n}n}n|m}n}n}n|o}n}m~m}n~n~n}n}nnn~n~p~n~m~n~m~n~n~oooonl~i{grfjghghghggghggggghghhigjgiggghhghhhjgihhhigigjikikhkhlhkijjkjjijijjjjkijikjlimhmjmklimhmhlhljkilhlikhmgngmgmgkhjhjikhmhmjlikhjhjhjiiiiikilikjjijhkhjhjhigihihihkhkijhighhhhihihhgihiihhhhigigighggggggggggggggggghgghfhfhfgfgfgfhegegegegeffffgegfgfgehnn|n}m}l~mm~n}n}o|n}mm~m~m~o~n}n}n~on~m}o}p~n~n~o}n}m~mnoo~onpl~gygvfoghghfhggggghghhhhihhghghhhihijhjgigigihihihiiiijijijikijiiiikjjkikikkjijikkljkjkhlhkhlilililimimhkhlhkglgjgjikikikhkhlhlijijiiijikhjhkhjhjhjhkgkhjhihiihhiijijhjhhhhhiiiihhhgihhhghhhhgghghggghghghfhfhfgggggghghfhehegfhehegegfgegegegfgegegggqkwn{m}m}m~n~n}m|n}o~n~mnno~o~n}n}o}o}n}m~n}p}o}n~o}o}n~n~nnn~noo~onnk|gpgggghghgggghhhgihigighiiiigjfjfihigigigihiiiijijijiihijjjjkjjkhkikkjjjjklklkjkikjlimimjkmkklhliljkilgjfkgkglhkijhkhjhkgjhjglgkiijiijglhkhjhjgjhigjgjgihijiijhjhihigihiiihihihhhggggggghghggggghggghfhfhggghfgfhfhehegfgfgfhfgfgehehegfggfmguk{n|n}n}n}n}n}n}n|n}o}n}o|o|o}o}o}m~n~n~n}n~m~non}o}oo~n}n}n~n~m~ooonnmom}fqgihhifggghgigihhgihihigigjgigigigjgkhkgjhjhjgkhjhjiikjkjjkilhliljlkkkjkkkkililimklikjjlkklilikililgjflfmglhkhjiiiihjhjhigjhkhkhkikhlhjhkhkhkhkhkgkgkgkiiiigjgigigiiihhhigigighgggghghgghgghghfhfgggghggfhehehfhfhegfffgfgfgfgehegefhhtl{p{p|o|o|n|n}n}n}n}n|n|n}o}o}p|o|n}p}n}n}mm~n~n~m~n~o~n~n~o~n~n}l~ln~o}o~omllmqm}eqfhhgghggfhhgigghhhgigigjgigigjgjgjhjhjhjhkhjhjhjijijhkglhmhlilhmhlikjlililjljliljljkhlgmhmhlglglhjgjgkglgkhkhjhihkglglgkglgkgkgkgkgjgjgjgjgjgihjgkgihihihjhihigihhighhghghghghgghghggggggghfhfgfggghgghegegfgfgegegegegfgfgegdfhgvp{q{n|n|n}o}o}n}m}n}o|m}m}n}n}m}m}m}n}o}m~n~nnn~n}o}o~o~o}n~m~l~m~m~no~m~m~m~n~nlmoohzfkfhgghggghghghhghgigigigighgigjhifigjgkhkhjhjgjhihjhjgkgmilikilhlimikikikjkkkkljlikijgkgngnhlhmgkhhgjgmgmglgjhjgkglflgkgkhjhlhkhjgigigjhjgihhgihjgjgjgigjgjhihhihihiiihhhhhhgggghgggggfgggggfgggggggghfhfhfgfgfgegegegegegefjiwp{o|n}n|n|n}n}o}n}n|o|n|n}n}o}n}m}n~m}n}o}o}n}n}mln}o}o}o}o}n}m~n}omn~mmn~m~n~n~onnnmhufihfgggggggghhgifjfjfjfighhhhjgjgigkglgkgkhlijihijikhkhjjikjjjijikikjljmjjiklljlgkhkhlgmilililgkgkfkgngmhlhkhkfmgmgmglgkhkhmhlhkgkgkgjgkgkhjhjijgjgjghgifkgjihhigjgjhihighghghggghgggggfgfggggggghghgghfhfgfgfgehdgegdgdflixo|o|n}n}n|o|o|n|l}l}n|n}n~n~o|n|n}n|m}m}n}o}q|n}l~m}m}m}n}o}n}o}o}o~p~pnmmkmp~n~no~o}n~lll}frfighgighggghghgififjgjgigihigjhjgkglhkglglgkgkijhkijiiiikjjjijikiljlilhlhlikikhlgmgnhmjkiljmgkglgkgkgmhlhlgkglgmgmglfkgjglhlgkgjfjghgigjgkhkhkgkgjhhhihjhjhjgjgihhhhhhggghhghggggghghggfgfhehfgghghfgfgfgfgegegefegefmkyo|o}n}n}n}n|m|n|n|m~mmnoo~n}n}n|n|n|o|n}n}o|o|p}m~m~m~n|m}l~n~p~p~ptromkmon~mo~o~mkln~l|grfifighgggghgggfhfifjgjgjgigigjgkhkgkgkgkflflglgkhijijkikhjilhlgkkkjlililililhlgmgmgmimhmgmfkglflflfmgmgkgkgkhkhkhjgigihjiihjgjhighgihkgjgjgkgkgkiihihiiihigigigighghghhgighggggggghggfgegegfhghfhfgfgegdgdgegegeelhym|n|m}m~n}m|m}l}l}m}lpz}||z}r~n}o|n|n|n|n|n|n|n|m}p}o~m~m}m}l~o~o~p~p~u~}}}}sononn~o~p~pnommm~gtgihighfhghgighghgigjgkgkgigjgkgkgjhigjfkglgkgkhjhjhkhjhjhlhkhkhlilikhlhlhlikhmhohngnfnhnekgkglgmglgkglglglglgmhmgkglhkiigkfkgjfjfkgjgjfjgigigjgigihihighggghghgghgighghggggggfgghghfgfgfgfgfhghggfgegegegefefnjyn|n}n|l~l}l}l}m}m}m|l~n|}zyz}{q}m}m~n}m|m|m|m|m|n|n|n}m}m}m}m}n}o}o}p}u}|{|}~~tp~mop~o~nolnmojyelgjgighghgighghfifjekfkgkhjiigjgkhiijhlglgkgjiiikikijhkglikilhlhlimhmikhliljlhnhnglhkhmgjgjgjglgkgjfkglglgmepfpipjqiqjqjqiqipipjojpkqjqjoinjpkpjnjninhmilililikijgjfifggggggggggggggfhfifhehggggfgfgfgffeemlzp|p|o|n|n}m}k}n}o}n}m}lv~ zyzz{zo}m}m}n}o|n|m}k}l}n|n|m}m}m|l}k}n~o~n}n~q~{z{||yonon~mmn~lox}~|s{iijfihhgigifjghfiejejfjfigihihihjhjhigkgkhjiiijikhjhjijijikikilililjkjjhkilimjninhlkkllfkglglfmenengpjtnwqzr|v}y}z|{}|}|~|~|~|~|}|}{}{}{}{~|}}|}{}{}z|z}z|y{yyxxwvttornnkihggggggfhfhfigififhfhfgfgfgefhjwp|p}o}n}n}n~n}m}n}n}m~n}lr}{{zzy{p|o|n|m|n|n|n}m~l~l}n}n}l}l}l}l}l~m~m}n|n}nr~z|| |}wnnn~no~n~nu}z||vddoifjeififjgiejdkfjiihigjgkgkfjejejejgkijijgkhjhjhjhkhkijikiljkikjlkkjjikimiljmjljkklgmgnfnfsizp~v|~~}}}|{zyzusoihhehfieifhghfhfhfgfgfgfhegnn{p|p}p}o|n}n}m|l~l~l|l|m|m|m}m}o~p}m}m}n}l|k}m}m|m}o|o}o}o}n}m~l}l}n|n|m|m}n}n}n~m}q~y|x~t~omnmoq~ooww~{tg¡bfuizhfggggfhiijzkwiwiwipkilhkhkikijijikikjjkjjlimilhmimjkjkilhlgjglhmiljkfoetizq|~~~}}~}}||{yxrmkhgffgghggggggggghggfgfhsq|p|p}o}o}o}n}l}l~l~j}k}k}j}jjl}n}m}n}n}m}m}m}n}o}n}n}m}n~m~m~m}n|n|n|m}n}m}m}n~n}m}n~n~n~n~nn~p}oopt~qoy{phfdabbcdeedffffeeddeegxhmjikijgkhmilkjjjikhmimimjmllnlklfmgljmimjmf|p|~~~~~~~}}}|~}|}ytriigggghfhfhfhfhfgggfhpo{o}n}o}n~nmm~m}m}l}l}jl~l~l~n}n|m}l}l}k~m~n~m~o~n}m}m}m~m}n{n|n|m}n}m}n}n~n~m}n|o}p~o~n}nooo~r~s~s}w}pfjmheddccddfgffgfeed e g¡g e eddfhzhuinkjlgkijjjillkijortsvjtiohnjl|~~~~}||}}zxqjigggghghfhfhfhegegkmyo}o}p}p~n~nm~m~ml~jklm~m~m~n~m}l}k~i~kn}l~n}m~m}m}n}l}k}n}m}m}n~n}o}o~p}n~o~p}p}o~mn~prqt~y~z}x}rgdfkpuvurmjgfeffe d¡f¢g¢g£i¤i¢h¡gfgihfggf|imlilokhgt|~~~~pzeqim}~~~~}}|}~|zuphhgghghfhfhfhhhmiroyo|n}t}w|s|p}o}q~qommmo~m~mn~n~l~j~k~lm~mlmkk~m}k~k~lmm~l~m~n~o~p~o~nno~noo~o~s~y}x|y~|}~{nekuz| } }} ~}{sgcedd e¡f h¡h£i¥g¥d£e¢d d¡f¢f¡e¡e¢e¡degjggl{~~~} ~tyjp~~~}}}~}}|ypmehgggfhfgfhrn{p|q{n|o}t}u|s|p}p}q~s}s}s}t~s~r}q~u~w}u}r~o~o~ppr~r~ol~l~l~l~m}m~m~o~mm~n~n~o~o}o~mo~m~n~p~q~u~|}|}y}x}rgmy }|||}~~ ~ ~ug gf e¡e¡f¡h¢h£g¢h knqssqj h¡g¢f¢g£g¤g¢h jr~{|~}}uqr~~~~~~}}}}}|ukigggggfflkyp|p|q|q}p}o}o}p}p}q}p~p}q}r}s~r~u}v}{{{{{t|t}v}y}{|{{u|nm~nn~o}m~q~r~q~p~o~q~r}q}o}o}p~pp~o~q~u}v}v~s~z{jjv | }z}}~ ~~p¢h¡h e¡d¢e¡f¢hox} ~vl£g¤f¤f£e¡fp{}~|wosq~~~}}}}|}~~|wrihglhrlxo{o|o|p|p|n}m}n~o~o~p~nno}p~p~r~x|y|{~{{{v|t}v}w|}|||}{v|q~o}o}n|m~p~q~r}r}q}p~p~s}q}o~q~t~t~s~ouv}s}r}q~tgp {|{{| x¡j¡h g¡g¡g¡ir| r£i¤k¤j¤h jqvwvsqnpmr~~~~~}}}}}}{rvmyn{n|o|o}o}p}o~jfhfbb ` egknr}x|u}w}w}v}q}p}q}v|y|z|v|p}p}n~n}m}mo~q}q|r}r}r~q~q~p}p}q}r}t}t}q}r}r}p~o~yzlhv| |~~|~ yj¡f h¡g¡ht~ z£m£j£i¥i¦i jm¢k¢knpqpin~~~}}~~}~{|r|n}o}o}n~ngc _\]YQQW^Ygn~n}n~o~o}o}p}n~n~o}q|s}t}o|n}n|o~pmn~o|p}o}p}r|q}o}o}o}n}n}p}q~p~n}o}o}o~o uhjx|}}}|}~ zi¡f£g¢fo| |¡l¥g¦h¥h£h jpsptojnjm~~~}}~~}}~~~z|q}n~o}lh\QQUWRLNUYVkn|m}m}n}n}n}n}n|m}l}n}m~m}m}m}n}o~t~s~p~o|o}n}n}o}n}l}m}n|n|n}n}n~n~n}n~n~n~q}rgky}} } ~ ~ ~ ~ ~ ~ ~x j¢h£g¡gt} { z |£m¥h£g£f¢fio}pknklkl~~~~~}~~~~~}}x}nlh^VNINRQNKOR^mn}m}m|n}n|m}n}n|n}oo~m~m~n~n}n}n}s}s}p}n}n}l}m}n}n~m~l}l}m}m}l}m~m}o}p~moy{mfiy~} | }~ {p¡h¢i¢hiu { y u¥h¢h£f¤e¡fjpgohmil~~~~}~~~~}~}|o]XWTPIJROMJJOfml~k~l}n}n}m|n|o}o|q|o|n}o~o~n~n~n~o}q}o}m}l~k~n~o}p}m}m}m}m~m~n~o~on}p~p~q~wheht~~}~~~ |t£i¢g¢j¢j ku ¢m¡i¡h¢g¡h¡imlqgnhn~~~~}|}~}rYPNNMLIONIJIWlm~mnn~n~n~l}m|n|o}o|o}ln~m~mn~n~m~n}n}n}k~jn}l~klmn~n~mnoo~o~pst}uiggmz~~ ~|tn¡j¢j ir} r¡i¡i i¡h¡gi|pfngm~~~~||}~~nZSOJIJJLMHJL`ll~n}n}m~mml~n}o|n}o}n}m}n~n~n}n}m~mmn~m}l~k~l}l}l~l~n~n~nlmp~o~o~os~txkggisz} vo¡ilz s£j¡g hi j¡kpjqgo~~~~}||||~|~r`YQKHFLMIHTh lll~l~l~mnkn}n}m|m|m}n|o|p}o~n~m~p}p}n}l~nmll~l~mn~m~n~p}o}n}o~r~r~s~uwiggimqwx{{} } {tu~ q¡h¡g h k jiqjsjn~}~}{zz{}~u`YWQMHIKHI\gi jllnn~m~no}m~l~j~n~n}m}o~p~o}o}p}p|o}mon~n}m~lnn~n~mnm~mo~t~u|u~v~vjhjmnrtrqpx~}}~ ~{ n¡f hi k¡hjqmslo~}|}~|yxy{zmhle ^XSKEKahij oqomln~n~mmm~n|n}m~n~p}p}p}o|p|o}n~o~o~n~m~n~on~n~onp}q~q~s~v}x}x}sggjmmoomkn} }~ ~~ z~ | k¢g¡g j¡l¡ikqjrio}||}~|xwwxzuopl khd]NPbgik oqpkkllnp~o}m~l~mop~p|q}p|n}o}o~n}lln~p~p}ono~n~p~r~q~r}u~x~w~thfgjlmmljr~|~tu{ s¡n¢l¡j m¡nmlrhqil~~}}}~}{wuvvwumqqpl dd_Z_dfk opnmllno}m~lnno~p}p|n~n~onp}p~p}n~n~p~no}nnn~nqqr~rt~w}y~vifggijjjiv||~~~yoqtw| }vm m o¡l k kln|rkojl~~~~~}}|xtuuuqrsqomfba]\_cj mollmmonlmn~ooo|n|o~n}n}on~o~o~p|o~ooomnqoopppr~v}ztifghhhhggv~ }|~}}}{~ o nmotx|~~}}ysq¡n jjiilmpntjnjm~}~}||||ytttrp rpnl j hb\_]_cfh i gg opoo~nnmno|n}m~p}mn~p~o~mmm~n~oonnpqo~p~qqqsuy~shghghhiijr ~~~}~s o mmpsvwwxxvtro nkjiimoqmplmmm~}}||}}|ytrso o pnkgfgfb`_accabdfmpp~nnnnmmlnq}p~nn~m~mnll~nonnomnppqpt}~qhghhghikmq{} ~s n¡n mnooprtusqqokkjjmpspunopmoo~}}}||||{yurro m kigdccdeb^beb`adglnooo~o~nonn~o~p~q|o~mmmn~kkmn~nop~q~poppr~wigfgghjklpv|yyy}~ xr¡p¡n jhiijmpp nn o¡mjkkjmq}smsosqvqy~~~}}}{||}|yvsroigfc``aabegffjjgdej nmnmn~opnoo~n~q|o~mmmllnop~ppponoqq}|ihfghjkjkmsxv|}x }~}~vqn¢n¡l ihfgjl l m nm llllmllqyvv~vvu~~~}}||{|{|{ywtq nhdca`aadimom l rsnk hj nmnnmnolmnopomlnolnmknknonoos~}wgfffghijlmpvz}}| ~umlml j h ffhkkl m k iklknmmn xywvuu~}|||{|zzyxvtr oidcbcaekk i jlnptrnmm ommoomlmonno~nolqrlkmnmlnqoonu~~sigfegghjklnqvxzz{{{}}{ysmkmn kigghjiikkkkkjmnnq}}x uttt~~}||||{yxyxvttqhfdccgn kh g g jnoqqnk mmklmlnnllknoonmq~qmmpp~onnonoqw} }skigffgghhhjnrvxwvvwxxxupll l l jiihjiijijjkjjmppvu}{ yutt~~~~~}|x xwxxxwvqhfdcer pkkkj j lk l ook lommjlnmkllmnooopp~nmpp~ponnp~twy{y|nihggefgghhilnrtuttuwwrkjlmlkihjjkihihiikkmppts{w|zxvvu~~~~}}~~~~~}x yxyywwuqkhdckrom k k i ghij nolmpm mlmonpsqnmnp~poomlnop~poor~t}t~w~x}~sihghhikmnopprqppqooorrmlkmkllkjljjijiiiiklmmp{s v wuwz}~~~~~~zyyzzxvur mjebkn n m k k h ffgk nnm oql mponlptqoklopomklmnmo~q}r~t~u~t}u}w~}woihghlqttvuuttusrromllnoomm mlllkkkjjjjijkoponu~vtuw~~}{{zywwvsokecgkl jhgebbdgk lk m pm mnonknponlkloomllnrss~u}v}w}y}z~{~{{toljimstuvvuuttuurrqrsroljk k jkmmljkjjjiikmnopq}xxwu| y~~}|{zyxw vuspledghhgec`__aegghk qo mmnnnlmoqqnmoqooqtwww~v|u}u}u}w~z}|~ypnllnruuuuvuuuuvutsrsuutqnik lkmnlkkjiklkkllnosyxxy{{wx~~~}|yxw wvu s q pqhdffdc``^]^_cddein o nopopnnoqronoqtuvt~s}s}r}q}p}q}p~q~t~y}ulkmrttuvvvuvvvuvvutuuuuuutqnmppnljjjjjjjjkkoqw~ zyz{zxrz~}~~~}{xwuuu urppu pgeedb`_]]]^_`acgmprsrpnnnnnnmmnpqqq~q~q~on~o~no~p~s~t~w~rjlowxwvvvvvuuvvvvvuuuuuvvtutsrp n lkiijkiijls|}yyzzzzwu~|}~{wv vuutrpswvnhffeda____^`adfjstrqommnonmmnotsnoonn~n~no~o~pq~stulmpxzwwwvvvuuvvuvvvuvvuvutuuutrkiihjjkjjkp yyzzzzyy}~|zvutttsrtw xyt jfefdbbcbbabcefiuxwvrponnnopstu~qop~omoonnnnooqwjkpy|ywwvvvvvvvvwwwwxwwwvuuuuvuunhhiijkklr |yyzzzxx ~ ~~~}~{ywvssstt vxzyyofccccdddecbeghjpw{zyxwwutuwysqpq~pmllllllnppsymkrz{zyxvwwwwwvvvvvwwvwvuuuuvvvxvmiihjklju~{{zyyxw~ ~ ~~~~~~~{wv utttuu v xzzxq hdcbcddcdbdgghiit{z{{z{}||~{qppommllklnnposu{~vmtz{{{zyxxwwwwxxwvvwwwvvvwwwvvwxwmkkklkn|}{{{yxxw~{}~{}~~zv vutuuuuw yzxsnjfb_`bdfdbdeeecfr {{zzyz{zz|yspommnoo~mopnoprtx}svz|||||{{yxxxxxwwxxwwwwyyyxxxyyzwqmonlo{zyzzxyy ~z|~~z{~|w vuttutuv x yy tmjjh_[_bceecgfd`aemw xw x x w w w w xx qookmono~nmmotwvwzx{{{||||{{zzyyxxwxxxxxxxzzyyyyyyxyvmnnmp|~zxyyyyy~}}~{z~~}~~{wuutsstux x y wojikjd[[_bfgfhga\bgnu v vvv w x y x y y smmlonnmnnmpuxy{|}~{{||zz{{zyyyxyxxxyyyzxxzz{zyxxytlmot{ ~}{{zzzzyy||}}}}~}y wwvvutuwy y z umijjig_Z\aed```_]aiot wxwxyy yy y y x rlnrpmmnnpstuxz{~} |}}|{{{zyyyxxyyyzzyyxyyyyyyyy{}pnruvz{~{yxxyxxyyx~ | {}~}{ wwvvuuvuww y y sljjihi`[\_a^[\[\^`fouwwwwwwwwwwwvsrqpnnmou xvwz{| }|{}~ ~|{yyyyxyyyyzyyzzzyyyyy{{|~vrssuww~{yxwwxxyxw}z wwwuuuwwwwxzy rjjighk_[]]^\YY[]^_enuvvvvvvwxwvuuvwtomnqtx y xz { zz|{zz} }|zyxxxxxyy{{{|{z{{{{{{z~yrrsuvxyyyywxxxvv~~~~ ~|zxwxuuvxwwyxy yqhhijlka\\ZYYYY[\]_bmuvwwvuvwxwvvwwwxuttuwyzyyyyyz|~}|| }{zyyxyyz{|}}}||||{zz{}|sprvw}}zz{ywwyxwv ~~ ~~|zyyyvtvvvvvvvvtkghijmi^YUSSTVX[]^^`ituvwvvwvvwwwwwvwwxwwxyyxxxzzy}}{|~~ |||{z{{||||}}|||}}{||}uqsuwzz{zyxxwwxx ~ ~}~}~~}| zxxzwuxzxvwvvuurjgghkj]TRQSSSQRV]__bfb[Zdpsvvvwwvvvwwwxwvwxxxyyzzz{zxz}|{ ~}~}}}||||||}}}}|}~~|vsttx{{zzzzyxxww~}~ ~ }} ~ ~ } }}~~~~}|zywvvvvxxwwvuuuvuofcfg_TSRRTRRSSV^]][VRQTWY[fuwwvwxxxyyzyxyyyyyxxyyzxwxyz} ~~}}}}~~~~}}~~~vwwu{~ {z{{{zyyyzy}~ }||}~ ~ }|}~ ~}~ ~~~~ ~}}} |zxywvvvvvvutttssvwwqhcdbZTRQPQRRSUW[[ZTRUSUVVWUkywwxxxyyyyxyyzzyyyyz{zyyyz}~}} ~~~~~~vwyz|{{{zzzyzzyy~~ ~ ~ } |||}}||{|~ ~~ ~ ~ } } } } } } }|||||{wvwvxwusrrrsqqrsuvvtmigb^XVVTTSTUWXZ][WSSSTUTTVcwwxwxxxxyyxxyyyyzzzzyyyyxxzyz{|}}~ {xz|} ||{{{zzz{zxx} }}}}|||||||{{||}||{{|}|zzyxwwxvvwwwvtssrqqqprtuuvvrnkeaZ[ZXVUWVXW[`ZXVVVVWTVXgwwwwxxxxxxwxwwxyyzzzyzzyxyywxyy{|}|}~ {z}~||{{{zyzxxyyx }|}|||||||zy{{|||{zzzzxwvvttuuxxvtttsrrrqrqruuuvvvtpkf\YZYYYYZZZ_ebYYZYYXWZ\nxxxxxxxyxxxxxwyyyyz{{zzz{zzzyxz{|{|}||~~~|~z||z{zzz|zxyzz }zz{|||{zzzyyz{{|zyxwwvvvxwvuuutuuuuussrrrsstvvuvvutpi`Y[[YYZ\[`cio`X[YYZ[\btwwxxxwwwwwwwwwxxxyxyzzzz{zzzzzz{{zz{|}~~}}}|~~~~{{{||{zzz|{yyyy }|{{{{zyz{zzz{{{yxxwvwwvustvutttuvuuutssrtuuvuuuuusqmf[XZYX[[\fimqi[YY[\^]kvwwwwwwwxxwwwwxyyyyxxyzxxyyxyzzzzzz{{{{|||}}||~~~}}{}|||||z{{{z|||{yxxx ~ ~}|zyyyyyxwyyxwvvwwvwwutssuttuttuuttttssuuvvvuuvvsonk^X[ZY[X]kooon_Z[[\]^qwvwvwxwwxxxxwxxxxyyyzzzzzzzzzyyyyyz{{{zz|||{||}}|}~||||{{~ ~{{|{{{{{zyyyyxxw~ ~}}~}}|zwxxvwxvuvuuvwvvvuttttttuttsuutttuvuuvwwvuvvwvtsuhZ\[\^[^mrrqp^Y[ZZ[duvvwvwxyxxyxyyyyyyyyz{z{{zzzzzzzyyyzzzz{{{|{zz{||||{zz{|{{{|{{{zzz{{{{xxxxxwv}}} ~ ~~}}}}~~}||yvxwxyutuutuvuuuussttuuuutuuuuuuvwwvuvvvvvvvvwvws]Y[Y\ZXitvvmWWYY[[juvuvxxxxwxxxyyyyyyyyzyz{{{{{{{zzzzz{zz{{{z{zyz||{{{z{{{{z{zzzzzyyyzzz{yxxywwv||| |~~}~~~|y{xvuuwwutuuuuvvuvutuuuuvvttuuuuuvvvwvvvuuvvvvwvuuvfWY[ZYWittulZZ\\[^muuxyxxwxxyyyzzyyzyxyyyzz{{|{zzyyzz{{z{{{{zzzyyz{{{zzzzzzyzzzzzzzzyzzzzzxxxxwx}}}}}~}~~~~|{zxvxwwwwvvvvvuuutttuvvuuuuuvuvvvvvvvvuvvvvvvuvvuuuvq\Y\[ZZltstp`[[[_mvyyyyyyyyyyyxyyyyyyzzzzyz{{zzzzzzyz{zz{{{{{z{{{{{z{||{{{{zzzzzz|||zyzzyzywwwwx} ~ }}}}}||}{wwzwwyxxyzxxyxwvvvvwwwvvvwvwwwwwvvvvvwwvvwwvvvuuuvuvvvl]][[dqtssusppquyzyyxwwyyxxyyyxxyyzzzzzyyyzzzzzz{{{zzzzzyzzzz{|||{|{||{|{{{{{{{|{z{{z{zyyyxxxwwz}}||{{zxxyyxxxxwwxxxxxxxwwvvvwxwvvwwvvwwwwvvvvvvwwwwvuvvwvvvvuuutpjegpsrstuvwwwwwxxxxxxxwxwyzyxxxxyyyyyyyzz{{||{{{{{{{{{zz{z{{{||{{{{{|||{||{{{{{zz{{zyyyyxxxxw|{{zzzxwwwwyzxwwwwwwwwwvvvvvvvwwvvvuuvvvvuvvvuvvvvvvwvvvvvvvvttuuuutsrrrsstuuutuuvwxxwwxxwxxxxyyyyxxxxwyyyyyz{zzzzzyyzzzzyyzzz{zz{{{{{{||||||{{||{{{zyyxxzyxxxxxyvxxxxwvxxwxwwxwvwvvvwxvvwwwvwwuvvwwvvvvvvvvwvvvvwvvwvvvvvvuvvuvvutttsstttuuuuuuuuvvwwxwwwxxxxyyyxyyxyyyyxxyz{{zyz{zzzzzzzzzyzzyyyyyzzzz{{z{{{|||zzyyxyyyyxwxxxytttuvuvwvxxxwwwvvvvvvvvvuuvvvwwwwvvvuvuuvuvvvvvvvuvwwvvwwvuuvwvvwwwvvvwwvvvvvvvvuuuuvvvvwxxxxxxwwwwxxxyyxxxz{yyzzzyyzzz{{zzzzzzzzyyy{z{|{{zzzzzzz{{yxxxxxxxwwwwvqsstutuuuvwxvvwwwvvvvuvvvutuvvwwvvwvuvvvvvuuuvvwvvuvvvvvvvvuuvuuuvuvvvvvwvuuwuuuvussuttutvwwxxxxxxxxyxxxyzyyzyyyyzyyyyyyzyyyyyyz{yyyzz{||{{z{{{{zz{zyyxxxxwwvuvvvvutssstuvvvvwwxwwwvuvvvwwvuuvuvvvwvvuvvvvuuuvvvwwvvvvvuvvvuuvvuuuuuuuuvvwvvvsrqqvz}~|xvwxwwwxxyyyyxyyxyyyzzyyyzyyzzyyyzyyzzzzxxxyzz{zyz|{{{{zzz{zxxxwwwxwvuu \ No newline at end of file
diff --git a/media/test/data/puppets-640x360.nv12.yuv b/media/test/data/puppets-640x360.nv12.yuv deleted file mode 100644 index 1d10dd2..0000000 --- a/media/test/data/puppets-640x360.nv12.yuv +++ /dev/null
@@ -1 +0,0 @@ -CFFFDEDHHFGGFEEHHGFEEEFFGHFDEFFEEEDEGGEDEFFEFFFFGFFGHHGGGGGGHHHFEDFGGGFGHHGGGGHHFEGFGIIGGFFDDEHIHHHGEEFGGFEFGHHGGHHGGHFGHHGGFEFHHGGFGIHHHGIHHFHIGGFFHIGHIHHHGFFFFGHGHHIIIIIJJIIJIJIIIIJIJIGHJJJKJJIJJJHHJJJJJKJJJIIIJJIIJKJJKKKJJKKKKKKKKMMLLKKLKJIJJKKLLMMLKKLKKKLMLJKKJKLKKLLLMMMMLKLLKJJLLLKKLKKKKKKMNOMMMMLLKKLLLLLKJJKLLLLLKLLLMLLLLLLLKJJKMMMMLLLNNKKLNNMMMMNNLKKMNMLLLLLLKKJKLMNMLMMMOMMONKLMMMNNMNMKMNNLMMMMLMMMLLLMMMNNNNNNNNNNNNMMLMMNMLLLMMMMMNLMMMMMMLLLMNMMMNMMMNMMONNNMLMNNMLMNNONMMNNNNMLMNMNONMMLLMNMMMLLLMMMMLMNMLMNMMNLKMNNOONPOMKJKMKMLLMLMLNOMMLLMMLLLMKKLNNONNNNMNOONNMLKKKMNLLNOOONNOPNKLMMMNOPPPNMOLKMOPNMOMNOMNNOPOOOOONNNOPPOPONNOPOMONEDDDDEEFGFGHGEDGFEDFGFFEEFEEGFEEDDEFGGEFFFEDFFEDFFFFHGFGGGGHGGHFDDEFGFFHHGHJJHGIFDFFFIIFEFFEDEHIHGGEDDEHIHFEGHHFFIIIIIGHHHGGFGIIGGHGHIHHHFHIIJIHHHGGHIJJIHHIHIHGHIIHHIIIHHHIIIJJJJIIIIJJJHGIJJJJJIHHJJIIJJJKLKJKJJJJJJIIKKJIKKKJJJKKJKJJJLMLLKJKJJJJKKKLKMNNMLKJJKKLLKKJKLLKKLLLLLLLKKLKKJJKLLLLLKKKKKKKLNMLKKLMLLLLLKKKKKKKKLMLKKLLKKLLLLLLLKLMMMMMMLLNLKKLNMLLLLNNKLLLLMMMMLLMLLKKLNMNMMLMMLLNMMNMLMMLMNNLLMNMMMMMLLLLLLLLMNNNMNNOMMMMMNMMMMMMLLKLLMNNOMKMMMNNMLLLMMMMNNLLNONMNNMMLMONNMMNONNNLMNNNMNNOMLNNMLLKLNOMMMMLLLLLLLMNMMNNMNOMMMMMMNNOONMLMNMLKMLKMLLLMNNNNMMMMOMLMNONMMMMMNOONNMLKKLLMMMNOOMLNONLMMMMMOONOOONNLMNNONNMMNNNNNOPMNONONMMNPOMOPONNONLMMIGEDDEDDFGFHGEEHGFEGFFGFFFEEGGFDDDFFFGGHHHGGGGFEEFFFFFFFFEGGFGHFFFDFGFFGHGHJIGEHIIJGEHIGFGGGGGHIGFFFEGGGGGHHHIIIGIHGHIIHHGGGGHIHFFFGHIHIHGGHJJIIIIIIJJJJIIIIIIHHIJJIIJJIHIHHIIIIJJJKIHIIIIIGHIJJJJJIJJJJJJJJKJJJJJJKJJJJKKJJKLLKJJJJJJJJJKLLLKKKKJJJJKKKKLMMLKJJJKKKKKKKLLLJJLMMNMMMMLLKKKKKLMLMMLKJLLLKLMNKJKLMMMLLMMLLMMLKLMMMLKKKKLLLLLLLLLLLMMMMONLLLLMNNNMLMMMMKLLKLLMMMLLMMLLLLMMNMKKLLLLMMNNLLMMLMMMLLMNMMNNMMLKKLLLLNNNNMMMMMMMMNOLLMNNMMMMMLLMMNNLLMMNMMLKLNNNNNNMNNNMLLLMMNNONNNOPOMNNNNMMMMNOOMLNMLKKLMNMKLLLLMLKKKKLMNNNMLMNNNMMMLLMMMMMMNOPNMNLMOLKMNNNNNNNMMOPNNNOONNNNNLKLMNONMLLMNOPONNNNMNNMOONMNPOOPPPNMOONOPNMLNNNONNNNONNNNNNOOOMMNOPPONMKKKGGHEFFDFHGEGGFEFFFDDFFGGFFEGGGFEEFGEFEDFFFFFGGGEFHGEEFFEGFEDEGGGJHDDFGFFHIIHHHFHHGHFFHHHIJIHHHHHFFGGFGGGGEGGHJJJIIHHIIJIGFFHHGHGGGFGIIHIIIHGHHIJJIIIHHJJJJJJJIHJJJIIJJIIIIIHIIJJKKJKIHIIHHJIIIJJJJJIJJJJJJKJJJJIIIJJKKIIJJJJJKKKJJJKLJJJJKKKKKKKKJJJJKLLLLKKKKJKKKKKLLJKLLKJJKMMMKMMLLLLKLLLLLLLMLLKLLMLKKLKJKMMMLLLLLKLMNNMMLLMMLKKMMMLLLLLKKKLMMMMNNLLLMMNONMMMMLLLMMMLLMMMMMMMMMMLLMNKKLLMMMMMMMMMMNNMLKLLLMMLMMLLLLLLMMMONNMNNNMMMMNNNMMNOPOMMMNMLLMMNMLLLMMLLKLMMMMNNLMNNLLMLLLMLMNOOOONMNONNMMMNMMMMLMMLLMNONKLMMMNNMJJKKKLNONMKLMNONMLKLLMMMMNNNONMLLMNLLNNNNMMNNNMNPONNONMMMNNLKLLLLMMMNMLNONLLOONNMMONMMNOOPPOOONPPMOPNLMNNNONNLOPNNONNNPPPNMLNPONLLLJJEFHHIHGIIGFFFFGFFFFDEFEGGFGGGFEFFHGFGGFGGFFFGGHFGIHGGGGFHGFDEGEGHFEEFGFGHGGGFEFHGEFFFGGGHIIHHHGEEEHFEFHGGGGFGJJHHIHIJIIIGEGHHHGHHIHHHHGHIJIHGGIJJIJJIGIJJIJJJHIJJJJJIIJJHGIJIIIJKKIIJIJJJJJJJJJIJJJJJJJKKLKKJJJJJJJJKKJJKKKJJKJKKLLLKKKKJKLJKLLKJJJJKKKLKKKKLLLKKKKMMLLLKJJKKKMNMLLMLLMMMLLMLLLKLLLLLLLMMLKKKKNMLLLLLLLLLLNNMMNMNNMMMMMMMMLLLKLNNLLLMMLLLMNNNNMLLLLMNOMMMMMNNMNMMLMNMMMMLMMMNNNMLMMNNMMNNNMMMMMNLLMLKMNNMMMNOOONNOPNNNNMMNMNOPPNNMLMMMMMNMLMLLLMMMLLKLMMNNNMNNKLNMMNMKLNONONMMMNNMNLLMLMNMMNMLMNMNMLMMMNOONLLLLKLLLLMMMMNPOONLNNNONNONMMMMMNNNOMLLMMMNNMMNNOONOOMMMMNMLKNNNMMLNPNLMMOONMMNNMMOONOOOOPPOOOOQPOMNOOPPPPPPPOPOMNPONMNOOPNLNPPQQONLLIGFGHIIHGFGGFEFGGGGEDGHGGGGFGGFFFGGFHIHGFFGFEEFGHIHHGGFEFGGFGGEEEDDEGHGEEFGHFEHHGGGFFGGGGGIHHGFFEGIGGFHIIIHGFHIHGGGIIIJIGHJIHGGIHIHIHGHHIIIHFHIHHHIJIHIJIIIJJIJKJJJLJJKLIHHIIIIIJJIIIJJJIIIJJJJIJJJJJJJJLKJKJJJJJJJJJJKKLMMKJKKKKLLKKKJJKKLKKKLJJJJKLKJJJKLLLLLKJKKKLKLLKJKLLKLNMMMMMMMMMMMMMLLKLLLLMMNMMLLLKKMLLLLLKLLKLLNNLLNNMNNMMMNNMMLLLLLKLLMMMMLLLNNNMMMMMMLMMMLMONNNONMKKMOOMMMMNNNNOOMLLLMMNNNNNNNNNMMNNNNMLNONNLNMMMNNNMONMMNNNNNNNOONNMMMNMMMMMLLLKLMNMMMLLLMNNNNMMKLMMMMMLMNNNNOONMMLLMMKLLMNMNONLLOONMLNNNMNNKLNMMMMMLMNNNMOOMNNOOOOPOOONNMLMNOMMONJJKLMNONLMNONNOMKKLNMMMMONMNNOOOMMLMOPONOONMNNOOPOONOPOMMNNNNNNOPPPPPPPPPOMNMPPPOPPNONMMOPQQPONMHHFGGIIFFHHGFEGFEFEEFGGFFHFEHJHGFGGHHHGFFGFEFFEFHHIHFFFFFGGFGGGGEDFFFHGEHHIIGHIJHGFFGGGGGFGHGGFGGHJIIIJIIIHFFGIIHHHJIIJIHGHJJIHIJJJJIHHHIIIIHGHHHHHIGGIJJIIJJKKLMKJKLKMNKJJIJJJJJIJJJJJIIIIIJJKKKJJJJJJKKKKKJJJJIJKJKJJJJLLKKKLKKLLKJJJKKKKKJKKJJKLLLLKKJKKLKKLKKKKKMLLLMLKLKKLNMMMMMNNMMMMMMMMMLLLLLLLLKLLLKKLLLLLLLKKLLMMNLLNNMMMLLLMMNMLLKMMLLMMMMMLLMNMMMMMNMMMNNNMOONNNNNMLMNONNMNMNNNOONMMLLMMNOONMMNNNMMNNMNLLOPONMNLLMNONMMMMNNONMNMNNNMLLLMMMMMMNMMLKLMNNNNMLLLNNNNONMMMMMMMNMMNONOONLNMLMLKKLMNNOONNNNNMLLNNMLMMLMMMNNNMLMNNNONLKLNONNOOOOPONNMMNNNONNMMMNNMMMNNMNNMMKJLLMNNNNNNOOOOOOMMKMMOONOONMMMNPPOOOPQONLNMMOONNOPPOPPPPOOOOOPPOOPONNOONNNNOOPOOFGEFHIIFFJIFEFGEEFEHGFFEFHEEGIFFFFEFGGFGHGEEFFEFGFGGFFGHHFFFGGIIHGIHFGFGHHIIGGIHHFEGHHHHHFGHGFFHIIIJHIJHHHHFFHJJIIHIHIIHGGFGIJIIJJJJJHGGHIJIHGHIHGHHFGHIJIJJKLKKKLLLJKLKJIIHJJJJJIKKJIIJJJJJJJKKKJJJJJJKLLKJJJJJJJJJJJJJJJKKLKMLLLLKKKKKKKLKKKLKKKKKLMMMLKKKKKLKJLLLMKMNNMNNMMLMLMMLMMNMMNNMNNMMLLLLLKKKKLLMNNMLLMMMLLLLMNLMLLMLLLLLMMMMNMLKMNMLMMLLLMMMNMMMMMNONMNNMMNNMMMNNMLNNNNONNNNNNMNONMMMLNNMNNNMNNNMMMNNMMLLNONMNNNOOONMLMMNNNNMLNMMMMMLKLLLMNMNOMLMLLMOOOPNLKLMNNNNMMMMMMKKNOMMNLMMMLONMNMKKMNNOOOMMMNLMMLKJKLMMPONNNMMLLMNNNMLLMLMNNNNNMMONMMLMNOOONNNNLLMOOMNONOPNMLKNLLLMMNOPPOOOMNNMJKMOPOPPPNLMOPPPPPQQONMOPPNMOPPNNOPPPPOMOPPPNMMMOPNMNNMMLKMPQPJHFFHIHGHJIGGGHGFEFHHGHHGGGEFFFFFGGHHGGIIHGFFGDFGFEDGJIIHGGHHHIJJJJHGFEFFFGGHHHGGGGHHHGGFFHGGGGHIIIIGHIHHGGGGIIIIHHJJIGGHHHGHJIGHIIJJIHHIIJIIHIJIHJIHIJLKJJKKKJJJJJJJJJJJIIHIJKJLJJJIIIJJIJIIJKKKJJKKKKLLLJJKKJJJJJKKLKKKJJJKLLLLLLKLLKKJKKKLKLLKJJKLMMMLLLKLLLLKKKLLLMNNNNONNMMLLMLLLMMNNMNNNMMMLLMMLKLMLLMMMMMNNNMLLLLNMMNMLLLMMMNNMONNMLLMMMMNNMMMMLLNMMNNNNONMMMMMMMNNMNNNMMNLLNNNNNOOMMNMMMNNOONNNNNMLMMMMNOONMNNNOOOOPPMMONLLLMNNNMMMNMMNNNMLNONNMMNNNNMNNNOOONMOONNNNMMMNNMNLMMMNNNLLNMMONNNMMMNONNNNNLKMMMMMKJKMNNOONMMMLLMPPONMNNONNNNNONMLMMNMNNMNNMNMMLLLMPONPOOPOMMLLMLLMMNOPPONONLNONMMNOPPPPPONOPOONPPPOMNNOPPOOOOPPPPOPPRPNPPOONMNNNPOOONMNMMOPQOHHEFGHHHHHHHHGEEFGGHHHIHFFGHFFFGGGHGHGGIJIHGHGFFIHHGIJIGFGGGGHIIIHHHGEGFEFFGHGGHHIHGHJIIGGGFGGFFHIHHHHGHHGGHHGHIHHHIIGGHIJIIIHGGHIHHIIJJIIJIIIIIHHIIIJKKLKJJJJJKJIHIIIIIIJJJJJKKKJJIHHHIIHIIIJLLKKKKKKKKKKJJKJJJJJJKJKJKKKJJJKLLLMLKKKKKKKKKKJLLKKKKLMMLLKKKKKLLKKKKLMMLMMMMMMMMMMMMMMMMNONMMMMMLKLLMLKLMLLLLLLMMMMLLLLLNNNONMMMLNONMMONLLMNNMMNNNNNMLLMNNNNNNNNMMNONMLKMNNMMNNNNNMMMNNNONMNNMMMMMMMNNNMMLKKMNONOONNNNMONOQQPMMNNMLKLMNNMMNOONNNNMMNOONMLLMNNNNNNNNMLLOPNNNNMLMMMMOOOLLNOONNOONNNNNNOONNNMNMLKLNONNMMLMNNMMMLKNMMNOPPONNMMNNNNOONNNMMNNOONLLNLMNNMMMMNNNOPNNNOMLMMMLNMMOPONMLLLOOONNOOOPPPNNOMMMKLOPPOMOPPPOOOMNPPPOMOPQPPPOOONLMOOOPQPOLNPPPPOLIHFFFGIIHHHHHHFGHHGGIIIIHGFGGFDDFGGGHGEEEFGFFFGHIJJKJKJHGGFFGHIIHFGIGFHGFGGHHHHHIIIGGIIIHGGFHFEGHIIIIHIIHHHHGFGHHFIGGHHHGHIJJIIJIGFIIJJJJIJJJIHHIIIIJJJJKJJJJJJKJIIJIJJIIIKKKJJJJJJJIIIIIIJJJKKKKJJKKJJJJJJKKKJJJKJJJKKLMLLKJKKKKLLLLLLLLLKJKJLLKKKKLMLKLLKJJJKKJKKLMLMNMMMMLLLMMMMMNMMMMONMMMMMMLLMLLLLMNMLLLLMMMMMLLLLMNOONNNMLNONMMMMMMMNNNMMMNNNNMMMNNOOOONNLMNOMLLLMNNMMMMNOOOMMNNNONOPONOONMLLMNNMMMMLMNONNOOONNNOPSZ\TONMMNMLMMNNNNNOOONNNNMNOPPONNMNNNLLLMMMLLNONMNMMMLMOOONOONNNNONOONNNNNNNNNNNMNNLKLNMMMNNNNNNNMMMONLLNPOOPOONMNNNNNMMNMMOOOONNMNNMMNNMMMLMNMNOLKMOMLLMNMLLMOOOOOMMLNOOONPPQPPPNOONNOMMPPPONONOPONOOOPOONNOOOPOOONOOMMNOOPPOOMNOOOOPOIGHFDFIIHGGIIIGIIHGIIIHIGGGFFFFGHHHHHGEEDFFFFGGGHJIIIKJIIFEFHHHIIGGHFFGGHIHIIIIIIHHHHHGHFFGHHIIIIIIHHHJIGHHHGHFFHGFGHIIGGGHIJKJIIHGIJIIIJHIJJIIIJJJKKJJIJJJJJJIIJJJJJJIHHIJKJJJJJKJJJJJIIIJJKKJKKKKKKJJJJJKKKKJJJJJKJKJKLKKKKKKKKJJKLLLLKKLLLKLKKLLKLLLKKLLLKKKKKKKLNNMMNMMNLLKKLMLMNMMMLLLLMNNNNMNNMLMLLNNMLLLMMMNNLLLLMNNMNNNMNNNNNNNMNNMNONMMMNNNNMMNOOONNNNNMMMMNMLMMNNOMMMMNONNNNNNNOPOONOPNNNNMNONOOONNNMNMNPPPPORV^heYQPPPONNOOOONNNNNONNOOOOPPPONNONNONNNNNNONONMMMMNMMMNONNOOONNNOOMNMOPNNNNNNNNMNNMLLMMMMMNNNMMMLLLMNLKMNOPPPOOOPOOONMLMMMLLMMNNNOOPNNNMMMLNOLLLKLMNNMMMNNMNOOOOONNNMNMLONOOOPPNMPPPPPOOOONONPOMOPNOOPPOOOOPPPPPONNONMMNOPNLNPMKMNOOPPHHIGGGGFDEFIJHIIHFEHHGGGHHGEEFGGGGIJIHGGFFFFFIHGHHGGHHIHIGFGHHIIIHHHHGGHIIGHIJJHHGGHJJIHGFHJIJHHIGHHGGHGHJJHGHIHHHGGGHHGHHIIIJIIIHHIJHHIIHHIJJJJIIIJIHHIJJIHHHIIIJKJJJJHIIJJJJJKKJJJJJIIIJJJKKJLLJLLJJJJJJJJLMLJJJLKKKJKKJKKLLLLJJKKKLKKKLMNNNMMMLLLLLLKLKMMLLKLLLLMNMLLNNNMMLKKLLLLMMLLLMMMNNNNMMMMLLKLMMMLMNMMNNMMLLMLMMMMMMMMMMNLNNNNNNNMNNMNNNNNMMNNOONONMNNNNNNMNNNNNOPONNMLNOMNONNNNNNNMMOONNOOOONOOOPONMNNOPPRRYekpunf]ZZWRPPPPOMNONNMMNNNOOOOOPOOMNNNOOPPOPOOOOOMMMOONNNMMNNMLNNNNNNNNOPPOOOOOOONNPOOONMMMMLMMPNMNNMLMNNNOPONNOOOOOOPNNNMMOOMLLNONMNOONOOMNNNOPNMLKLLLNNMLLMNOPOOONOPPNNNMLNONNNOOOPOPOONOOOOPOQPNNQPPQQPPOPQRRQPONNNOOOOPQQNMPQPNOPPPQPGIJHHIGEEFGHIIIIIIGFGFGIHGFEEFFEDFHHHHHGFEEFGHGGGFGHGFGIIGFHIIIHHIIHHGGGGHHGIIJIHHHHIJIHHIJJIHFGGFIJHGGGHJJHFFHIHFGHGGHIHIIJIJJJIHHHIIIGHIIHHJJHHHIJHHIJJJIIIIJJJJKKLKJJJJJJJJJKKJJJIIIJJIIJKKKMLJLLJJJJJJJJKLLKJJJJKKJJKKLKLLMLKJKKLMLKKLMMNNNNLLLLKLKKKLMMMMMNMMNONMLLMMLKKMLKKMMLLMMMNNMMNNONNMMLKKLLLLLLMOONMMLLKLLMLLMMLNNMMMNNNNMNNNNMNONNOONNMMNNNOPPNMNOOONMMNNONNNNOONMNMNMNNNNNMNOONOONNNOPONMMNNMNONMNPOOT]qzz{ywwqmlj^VTSQOMMNMMNMNOONMNNNNOONNNMNOPPPPONOONONOPONNOMMMMMLMOOMMNOOOOONNNOPPOOMNOPQPMLMMLLMPOMONMMMMOOOPPOPPNNMMMOOOONNONNOONONLOONMOPOOOOOOMLLKMMLMNMMMMMNPPPPONPONNPMLLNOOMOQPONPPONNNOPPPPRQPPQQQPQOOQSTPOPONMNPPOOPQPNNOPQQPOPQPPGJIGGIIHIHHFHIIHIJHFFHIHHHGFFGFEFGFFGHIHGEEFGHHHGHGFHGGHIGFGHIIIHHHHGFFFGHGGIIIHHHJIFHHHHIIIIHFGGIJJHGHHHIIHGGHHHHGIIHHHIIJJJJJIIIIHIJIHIJJJIIIIIJJKKJJJJJJJJJJIIJJKKJJJIJJJJJKKJJJIIIJJKIIJKLKLKJKKKJJKJJJJLLKJJJJJJJJJJKKLKKMLKKKLNNLKKLMMMMMMMMLLKLLLKLLMNNNOOMLMNNNMMOMJLMMLLMMLMMNMMMLMNNNNNMMLLMMLLLLMNOONMMLLMMLLLLLLMNNMMMNNONMNNNNMNONNONNMNNMMOPPOMNNNOPOMMOPOONMNNOOOONMNOONNOOOOONNOMMNNONNMLLMMNPONOPPUes}~~zm^WTQONMNMNNNNONMMNONMNOOONNNNNNOPPOOPONPQQPNOONMMLMNNPPNNNOOONMMNOPPONONLMNNNNMMNMMNONNOMNONMMNMNOPPPOONMLMNONMNMMNOONNLNONNOPPPPQPNMNNNMNNMNNNNOPONPQPOMPPONOOMMNNPPOOPPQPPPOOONNOPPQPQQQQQPPPONPRTQPOPONMPPOOOPRQOPPPQPOOPPPIJIGFGHIIIIFFHGFGIHGHHHHFHIGFGFFGGFGHHHIGDDGHHHJJIHGGHGHGHGGHJIJHGGHGFFFFFFGGFGIHHIGGHHHHGGHIJHHIIJJIHGHHGGHHHIGGHHHHHIIHIIIIHJJIJJJJJIIIIIJJJJJJJJKKJIIIJJJJJIIIJJJJJHHJJJJJJKKJJJJJKKJJIJKKLLLKJJKKJJKKKKJLLKKKKJJKKJJKKJKKKLKLLKLMLNLKLLLLLLLMLLLKKLKKLLMMMNONMKLNOONNNMMMMMMMLLMMNMMMNMNOONMMMMMMNNMMMMNNMMMNNMMLMLLLLMMNNNNMLMNOOONMNNNONMNNNNNNNNNNNNMLMNMNOONLMOONNNNNNNNOOMNOOOONOPONNMMMNOOONMMLLMMOPOOOOOavue\TPOONNMNOOONLMMMOOONNOOOOOONOPPPOMOONOOOONNOONNMNONOOOONOOONNNOPOOOOOOMLMNNNNMNMMNNNONLMNNMLLMNOPPOMNOOOMMMNNNLMNNNNMMNMMMPOOONPOMNNNOOONNONNNOOONOOPOMPOLLNONNOOPPOOPOPONNNNOOPPPPPPPOPQPPOMONNOPPOPPPOOONOPPQQPONPPOMNPPPOEIIHHGGGHGHHHGGGGHGGHFHHGHJJGFFGHHFGIIHIIGFHIHGIJHEEHIGHGGGHHHJIIHHGGGGGIHGFFFGGIIHIIGGHHGHHHIJHHHIJJIGHHGHGGGHHIIIGHHIIGGIHIJHIJJJIIIIJJIIJJJJJJJJJKKIHIIJJIIJJJJJIJJHHJKKJJJJJJJJJJKJJJJJJJJJLJJKKKJJJJKKKLKKLKJJJKJJJKKKKKKKKLLKKKKMLLLKKLLLLMMMLLLLKLLLLNMOOMLMMMOPONMLNMLNMLKKLNNMMNNNNONMMMMMMMMNMMMMMMLKLNOPMLMLLMLLMMMMNMMMMNNNNMNNOOPOONNONNONNNMMLMNNNOOONMMNNMNNOOONNPPONONNNNNOONNMNOOOONNMMMMLNPOPPPPVoz ~wodVPOONMMNOOONNNNOOOMLMNNOPPONOOOPPNNNNNNNONMNNPPPPOOOONMMNPPONNNOMNOOOOMMNONNOPONMMNMMNNMMNONNOPNNPPOPOPPOMMMNMMMONMOOMMMLNQPNLLMNNOONOOONNNMNMMMNNLMNNNOLJMOONOOPPPPOOONNOOMLOQQQPOOPONOPOPONNOOPOOMOPQOONNPPQQPOPOPQPOOPPOPEKKJIIIIHGGIJIIIHIGFHHIIIJJIGGFFEEGGIIHIJIGIIHGIIGEGHIHIIIIIHHJIGFHHGGIJJIGFHJJIIHGHHGHIIIIIHGIIGGIIIIKIGHIHFGHIJJIGHIIIHHIJJHGHJJJJHHIIIJJJJJIIJJJJJJIIIIJJIIJKJJJJJJIJJJIHIJJJJJJJKKJJJKKJJKJJJJJJJJJKJJKMLLKJIJKLJKKKLLLLKKKJKKKLLKLKLLKKLMNLKKKKKMMLMMLLLMNLKKLMMMNOMMLLMMNNLKLMLMMMMNNNNNMMMLMNNMMLMMMMMLKLLMNMLLKMNMLLMNNNMNNNONNNOOOPPPPONNOOOOOOONMLNNNOOPOMMMMMMMNNNONOPONMNNNNOONOONNOONNNOOONNONNOOPQUV_v}||ylWQNNOOOONMNOPPNNOPNMMNOOOOONNNNNPPPNNNOONNMNNNPQPPOPONMMMNOOONNMMNOOOOMMNNNNOPOOMMMNNOOMMMOONOPOMOPOPPPOMMNMLMMMNOOOPMMMMNONMNMLMNPPOONMMNNMNNMLLNMMNNOOKKNPONONOPPPPONNOPONNNONOOOPPONNOPQPPOPPONNLMPQPOOPPPPPQQPPQQPPPPPOPIIGIJIIJJHGJKJHIJJGFHIIIIJJHFEGFEEIHFGGHIHGIIHGGGHGEFIIGIJIGGGHHFFHHHHJJJJHHJKKJJIGIIGGHJJJJHGGHGGHHIJLJIHHGHIGHIJJIIIIHHHJJIHIJJJKJIIIHJKJJJJJIJJJJKMKJJJIIIJJKKJJJJJJJKJIJJJJJJJJJKKJJJJJJKKJJJJJJJJKLKJJKMMLJJJJKLMLKMNNMLLLKKLLLMMLKLMLKKNNLKKKKJLNNNNLLMNOMKMLMMMMNNNNNPONNNMMMNNNMNOMMMMMMLLLMNMLLMMMMMMMMMLLLMMLMMMNNMNOOOONLNMMMNNOONNPPOONNOOOOPOONOOOPPPONNNNNNOOOMNNOMMMNOPOOONOOOOOONMMNNOOOOPPOOQQU]crz}z{}} q^UMNPPONMMNOOPONOPONNNONNOPONNMMMOPONNPPONNNOOPPPOPPOOONONMNNNOPOOPPPNLLNNNNOOOOMNNNNNNMMNPOONONNOPPOPPOMNNMMMMMNNPPPOMMNMLMMOOMMMNOOPOONOONNNNNOOMLNNNNNNOPOOPONOPPQPNNNOOONNOONPPOMMNPOPPPPPPPOMNNMPQQOPPPQPPQQPPRRQPPPPQPFGHFIIIJJHIIJIFHGGFGGGFHIIIHGFHFGGHHGHHGGGGIJIIHFFFGHHHIJIHFFFGHHGHHHIIJKJHIIIIJJIHIIGGIJJIIGGHHGGHHJIHJIGGGIIGGIJKKJIHHHIJJJIJJJJIHHIJJJKJJJIJKKJJJKKKKJJIIIJKKKKKJJJJJKKJJJJJJJJJJJJJJJJKJJJJJJKJKKKKKKKKJLLKJJJJKLKKLNNNNMLLLKKKKMNNNMMLKKLLLLLLMMLMNNNLMOOPPNOMLMMMMNMMNNNNNNNNNONPQTSNMMLNNLLLLNNMMMMMMMMMMLMMLMMLMNMMMMMNOPONMNNNMNNOONNOPPPNNNOOOOOOOOPPPONNOMNOOONNNNNNNMMMNOOPPPONNNNONNMMNNNOPONOOQXYafo|}~{yxyz|~ ~oYPMNPOMNNONOPNOPPNNNNONMOPPPOOMNOOOONPPOONOOPPPOOOOPOPPOONNNNOPQPPPONLMOOOONNOMMOPNNNNMMOPPPNOOOOOPOOOOMMMNNMOOONOOPOLKMMLNNOOOOMMNOOOOOOOOPONNONNOOONNNONPOOONNNPPPPPOOPPOOPPNOPNMNMNOOOPPPOOOOMNOOPPQPPQPQRRQPOOPQQPQPOPNEFGGHJIIJIHHIJIIHEFIIFEHJKGHIHHGHFFHHHIIHHGHHHGGGGHJKJHJJHGGHHJJJHHGHIGHJJHHIHHIIHHIHGHIIHHIHHIIIGGGHHFGHHIIJJIJKKLJJJJJJJJIJJJJJJIHIJJJJKLJJIIJJJJJJIKKJJJJJKKKKLLJJJJJKKIIJJJJJJJKJIIJJJKJKJJJLLKKKKJJKLMLLLJJKLKKKKJKMNNMLKLKKKKKMNNNLKKKMNNMLJKMNMLNOMLLOOPPNLMMMMLLMLNNLMMNNMNOPRVZ_`TONMONNMMMONMMMMMNNMMNMMMMLLMMNNMMNNMNPOMNNNNNOOPPPPOMNONNPPONNOOPOOOONLNNNLOOOOPOOONNNNNNOOOPPPOOONNNOONOPOOPOOQS\dgkru{}~}{yyyyxwwvx~}[UONOOOOOPONNMMOPOONOONNPOPONNOOOOOOOPQOOOPPPOOPPPONNOOOPPOOOOOPPPPONMMNNNNNNNNNNPOMNOMOOPPOOPPPNMNONONNNPPNNQQPNONNOMKMNNNPPONNMNPPPQPOPNOOLKNOOOPPPONONNOOOONNNPOPPPPPNOOPPPONOONNNMNPOPQPMNMMNNPPPPPPPRSRRQPPPPPQQQPOOPOHHHJLJIJJIGFGJJJIFFHJHFGIHEGHIHFGEFFFFGHGHGGGGFEIJKKLLIHIGDHJIJJIHHHJJHIJJJJJIJJIHIJJHIIIHHIJIIIJJJHGGGGGHHJJJJIJJIIIIKJJJJIIIIIIIIIJJJKLLLKJJIIIJJKJJJJIIIJKKKKKLKJJKKKJJIIJKJJJJJKLJJJJJJJJJJKLKKJJKKJKKLLLLKJLMLKKJJJLLLLLLLLLMMLLLMLLKLLMMMMLJKLMNNNNNMMMMOOMKMNNMMMOOOMLLLLMOQTUY^ekofRONMMMMNLLLMMMNONNMMNNNMMMMMMNMMOPOMNPPONNNOOPPPOOOPONNMOPPONNONNNNMMMNONLKNONNOOOOOONOOOPPOOPPPPPOMMNMMOOOOPPSX`joporvz}|yxwvwwxxvst~{]WPOPPPOOPOOONNNOOOMNNNOPONONNPOOONNPPPONNNOONNPPPNMOOOOOPPOOOOOONNONNNNOOOMMMNOPPMMNNMNNNONOPPPONMNOOMLNPPPOPOMMPPOONNNNOOOPONOOLNPPPONPNMLLLMNOOOPOONOOOOOONMNOOOPPPPOOPPOOPPOPPPOONOOPPPOMNNNNOQPPPPPPQRQPPPPPPPQQQPNNPPJJJJKLJJIJIHGIJKJHHIHHGGGFHKIJIGFFFFFEEFIIHHGGIJKKKJJKIGHEFHJIIJIHGHJIHJJHIJJJJJJJJJIIJJJIIJJJJIHHIJHHHHGHIJJJIIJJIIIIJJJJJIHHIJJIJJJJJKLLLKJJJJJJKKJJJJJIIJJKLLKKJJKKKKJIIIKKKKKKMNMLJJJJKKJJKKKKLLKKJJKKKLMLLLLLKKKKLLLLLLLLMLLMMLKLLLKKLMMLLLMNMLLNMMLMNMMMOOMLMNNMMNNNOMMMMNNRW^ehhkqtraRPOONNNMLLMMNNNNONMNONNNMMNNNMNPONNNMNOMMOOOOOOPOMMNNNMNOONNNNNOONNNOOPNLLNOOOOPOPPPPOOOPPPOOONPPONNMMNPPOPPQXemsutooqwyxuuuttttvwvwz sYSPPPPPPPONOOOOONNNMNOOOOPPOMMNNNNONNOPOOONOONMOPONMOOOOONNNNNNOONOPONNONOONMMMMPOMMNMMOONNOOOOPPONNOONMNOOPPONMMOONNNOOOOOOOPPONLMOOMNNOONOOONMNOOOOPPOOPPPONNPPNOPPPPONNPOOPRQPPQQPOONOOONOPPOOPPQPPPPPPPQPPQPPPPPPQQPPPPGHIJJKKJJIHIIIIJJJIJJHFGGFHIIIGEEGHGFFEFJJHHGFHGJJJJJJIHHIIHHIIJJIGHIIJJHGIJIIIJIIKJJJJIIIIIIJJJIIIJHHHHGHIIJIIIJJIJJIJJIHGGHIJJJJJKLLJJKLLJJJJIKKJJIJJJJKJJJJKKKJJKJJJKJIIJKJJKLLLLKKKKKJKKKKKJJJKKKJJJJKKKLKKKKLLKKKKLLKKLKKLLLLLKLLMLLKLMMNNMMNLLNNMMLLMMNNOONMLMMLLMMMNNMMNOQU]gqvtqsttp]PNNOMMNMNMNNMMNONNNNNNNNNNNNNOPNNOMLLNMMNNMMNOPNMMOOONNNNNOOONONNNNPPPONNOPOPOPPPOPPOOOPPPPPPOPPOOONOPPOOOPUfrsturmlnprrrpqssssvwvuwiURPPQQOOONOPOONNNNNNOPPNOPONMMNNNNNNMNPPPONOPOOOONNNNOONNMNNNNNOOOPPONNONNNNNNNMONNMMLNNNNNNNNNNOONNNNOPNMNPOOPNNLKLMNNNNPPPPPPONNOPNNMMLMNPPOOONOPPPNMMMOPONNOOPMMOONMMMMNMNPSRPPRQQOOOOOOOOPPPOOPONOPPPPPPPPQPPPPPPQQOPPPEFGHIKKJIGFEHIJJIHIIIIJHHHGGGGGEEGHIGGHIJIGIGFGFGHIJHHGHIJIHJJIJJHHGGGIJIHJJIIIJIHJJJJHGIJJIIIJJJJJJJJJJIJJIJIHHHIIIJJJJIGGHIJJJLJJKLKJJLMLKJIHIJJJJJJJKKKKJJJJJKJJJKJJJKJJJKJJJLKKJJKLKLKLKKLKKKLKLLKKJJKKKJJKLLLLKKLLKKKKKKKKKLLKJKMOMLLMMNNNNMLKMOONNMLMMMMNMNNNNNMMMMMMMMNOOQWfntwvutstztWMNNMMOONLMNNMNOOOONNNOOONNNNNNNONMMMNNNNNNNMOPOPQQOOOMNOPPPPPONNNNOPOPPPPRSSRQPOOOPPOOPQTSVYWURPOONOOOQPQSaputttpnlmmllljilnqtroorzw`UPOPPPONNNOPPNLMNOOOOPOOPPNMNNMOONMMMMNONNMNOOPPNMLMNNNOPPONNNNNPPPPOOOOONMMNNOONMMNMNOOONNONNONOONNMLNPOOOPMOQPNMMNNNNONOPPPPPONPPOOOOMKMNOOMNOOOOPOMMNNONNOOOPPONOOONMMNOMMPQQPPQPOOOPPPPPOPPPPPOONMNPPPPQPPRSRPQPQQPNOOPFFGHIIKKIHGFGFIHIHIHHHJJJJHHIJGGGGGHGFHJIGFIHFGGGIIHGHHIIIHIJIIJIIIIHHIJJJJKJJIIHHIJIHGHHIJJIIIIIIJJJJJJJJJJJJIHHHHIIJJJHHGIJJJJIIJJJJJJKLLLKJIKKKKKKJJKKKKLLKKJJJJJJJJJJJJJJJJKKKLLKLLLLLLLLLLLKKKMMLLKLLLLKKLMLKJKLMLLLLLLLKKJLKKLKMOMKLMMNNMMLKJKMNMMMMLLLKLLMMNNNNNNNMMNNONMQXhsvutttttzuVMNNNNONMMNNMNONNONNNNMNNNONMNNONOOPOOPPNNOOOOPU]^SQQONOPQRRPPOOQQRQPPRSSY_^YTQQPPRTTSSW]afkh`ZVPNNOOOQRT]jrtssrqqnlkihhedeinqpoory}zm[ROOPPPONOONOONMNNONOOONOOPPPONOOPPNMNMMNMNMMOPPPOMLNNNOOPPPOOOOOPPOOOQONOOMMNOOPOONMOPOOOONOOOONNONNNNOPPQPONPPOMMNONNONNNOPPPPOOPPONNPOLNONNMMOPPOOONNOOOOOPPPPPOPPPPONOPONOPQQQPPOOPPPPPOONOOPONNPPNNOQPQQQPPRRPRRQOONNNPIIIJIHJIIIIJIGFGIIHHHGHHHIJJJIFIHGGGGFEGIHIKIHIHGJJHJJJJHGHIIJIIJJJJJJKIIJJKKJJJIHHIJHGGHHIJJJIHIJJJJJJJJJKKJJHFHIIJJJKJIHHJJJJKIJJJJIIJJJKLKKLKJJKMJJJKLKJKLLKKJJJJIJJJJJKJJJKKKLLMMLLLLLLLLLLLKKKMNLLJKLLKLKLMLMMLMNMMMLLKKKKKKKLMMMNMKLLMNMMMMMMLMNMLLMMNMMLMNNMMNNNNMMMMNNMLQWiuwutttuv{mYRNOONONNNNMNNNNNONNNNNNNOONNPPOPOPPPPOOMMOPPRXnp\WVROPPU][SPPPVY[]YX]`ajuqg_YTSSYbdYYgnrz}|ohfXOOQQQUW[emqstrrssmihgebb_`ejkkmnqvyyoVRPOPOOOOOOMMOPPOONMNNNOOOOPPOOONOONNONNOOOOOPPPPPOONNNOOPPNNNNOPPPPOPQPONNNNOOOOOOPOPPNMNMMNNNNOOPOOONOPPPONOPOPNOONOONNOOPPOONNOPPNNNONNNNOPOOPPPPOPPPONNNPPPPPONOOPONPPONOPPPQQQPOPPPPPPOOONOPONNPPPQRQPPPPPPPRQPPPNONOOPKIHIHHJHIIHJIIJIIIHIIHGGIJJJJIHGGGHGGGGGGJJKJIJIHJJJJJIIIHIGHJIIJJJJKIIIIJIIIIJJHHHJIGHHHHHJJJIHIKKJIJJJJJKKJIHHHJJJJJJJJHJJJJKKKJJJJIIIIJJKKJKKJJKKJKJJJJJKLLLLKJJKKKJJIKLKKJJKKLLMMLLLLKLLKKLKKLKLLKLJKLLLLKKLMLKKMNMLLLLLKKKKKLMMMMMMLMNOMLMMKMNMNONNMNNNONMNNNNNNNNMMMMMMMLNS[jvxwtttvw{t`PPPOPNNNNMNNOONOONNOONNONMMNOOONNNOONNMMNOPR\y|i^ZWSRT^wo\SRT`jlqjerttz}vnje\Zaqtchz~{~~zzxdWUTUY\_dimpqqpppokgfd`]]YY]``aeiow{yhRPOPPPOPPONNNNOPPPNNOOOPOOOOOOPPPPONNNMNPPPOPPNNPPPPNNPNMPPNOOOOOOOPONMMNNNNOOPPOOOOOPPNMNNNONNOOOPPPOMNOPPPPOOPPPPPOOOOOPPPONMLLNPONMNNONNNOPOOPPPPPPQQPONNPPPPQPMNNNNNPONOPPONNPQPNOPPQPPPPPOOOOPOOPPOOPPPQPPPPPPQRRPNLNNOJHHJIHHIIHHIIIJJJJHIJHGHIIIIHJIGGIHHIIHHIJJJJGIJJIGHJJJIIHHGIJIIIJJJJHIJJJIIHIJJHHHIJJJJIHJJJJIIJKJJJJJJIIJJIIJJJJJJJJKLLKKKJJKJKKKJKJJJJKKJJJJJJJKLLKJJJJJKKLLLKKKLKJKKJKKLLKJKKKLLKKKLLKLLKLLKKKKKLMMLMLLLKLLKLLKKMMMMLMMMLLMMLLMLLLLMMMNNMMMMLLLNNNMNOONNNNNMMNMNNNNMMLMNNMMPW_kvxvttuww{}^PQONLMNMLMOPNONNMMNNOOOONNOPOONNOOOONNOOOOTc|}j_c_\Zf~i]ZZp~{zv}}xsnmp{|uw~{oid[`hhijjkkmkjljihhfc_\YUUVVY]bhovueWQONPPOOOPOOOONOPPONMNOPPPPOOOPPPPPPOONOOPPPOPPNMPPONOPPOOPPNPPPPONNOOMLNOOONOPQPPPPOPOPPNNNNNOOOPPPPPNNOPOOPPPPPPPPPPOPPPPQPOOOONOPPOMMOPOOOOOOOPPPQPPPPONOPPPPQROMNNMONONMOPPPNNOPPPPQQQQQPPPPPPOPPOPPNOPOPQNOPPPPRRQQPONNMIIJJIHGIIIIIHGHHIIIKJHGGHIIHIHGHIIFHJKKJHIIJJHIJIIGGIJJIHGFFIJJIHKNKIHIJJJIHIIIIIJJIJJJJJIJJJJJJJIIJJJJJJJJIIIJJJJJJJJJKKLLIIIKKJJJJKKJJJJJJJKKKJJLMMMKJJJKLLLLMKKJIIJJJKKJKKJJJJJKKJJKKJJKJJKKJKJJLMMMMNLKKKLMLKLLLMMNNMMMLLLMLLMNMMMMLMMLLLMMMMMLMNNMMNNMMNONLLMLMMMMMMLLNNNNQXcmuxvrsvxx{qWRPNMLMNNNOPOONNNNNNOOOOONOPOONNPRQPOPPQRRWm~ yrpnjjo|zpkdv~z}}~}}~~~~}z{yoqsqmihgfgeccdeeeeca]XUTTTX\ahnqk[TQNOPONOOPOOONNOOONNNMNOPPPOOOOPPPPPONNONPOOPPPOOPONOPPOOOOPOOPPPMMPOMMNONOPPPPOPPPPPOOPONNNNPPPONNOOOMOOPPPPPOPOOPPPOPPQPPPPPPPQQQPOOOPPONNNNNOPPPPQPNOPOMMOPPPQPOOPONOOOMMOPPPONPPPPPPRPPQQQQPPPQSQPOOPONNNNMLOOPPPNMQRPPQPHJJJIHGIIIIIIIJJHHIJJIHHIIIIIHHHIIGHIKKKHIIJJIIJJGGHIJIGGHGGHGIHJJLLJJKKJJJIIHHHJJJIJKJJJJJJJJJIIIIJJJJJIJJJIJKKJJJJJJJJJJKJIIJJJJJJJJJKKJJJJKKJJJLMLLLKJKKLLKKKKKJIJJJJJKJKKJJKLKLKKKKKKKLKJKKKKJJLMNNMLLLMMKKLLMLLMLLLNMLKKLLLNNMMMMNNLLMMNNMLLMLLNNNMNNNNNMMOONLLLLLMNLLMNNNQYfotvwtrswy|~ycUSQNOOONMOOOOMNNNOONNOOONOOOONMQUWSPQRTY\`v{wxxz~zsz}{}~|zwrmjheccb`_`aaa__^\WUTTTX]bgkleXTPOPPOOOPPPPPOOOOPONNNNOPOOOOOOPPPPOOOOONONNPPPOOPONOPPONOPPPPPPONNOONMNOONNNPPPPPPOOPPPONNNNOOPPOOONONOOPQQPOOONPPPPPPQQPPPPOOPQQQPONOPONNNNOONOOOPQPOOPNNOOOOPQPPPOOOONONNOPPPPOPPPPPQQPPPPQQQRQQRRPNOOMMNNONMNPPPPOONOOQOQJJJIHIGIJJJJJJJJIIIIHHHHIHHHIJJIIIIIIHHHHHHIJJJJJHHHHHHHGHHJHFHHJKIJJIIIJHHJIHHHJIIJJKIIIJIJJJJIHIJJJJJKIIHJJKMLJJJJJJKLKKKJIIJJKKKJJJJLLJKKKKKKJJKLKJKKKKKJLLKJKLKKJJJJKKKLLKKLLLKKKKKMLKLLKKJKKKKKLMMLLLMMLKKMMMLKKLLLLMMLLMLMNMLOOMMNNMNNMMMMMNLKMNNNOOONMMNOOOMMNMNNNMLMNNNPXeqtuuvsswz|zoe[SQPONNNNNNNMNMNOONNNNNNOOPPPQT[_YWXZ`hlo| ~~ ~}||}|z|~{yrnlhgeec_^_^][VUVXWVUUUW]dikkcUSPPPPOPOOPPPPOOONOONNNNOOOOOOOPPPQPOOPPNNOOOOPPPPPPOOPPOOPPPPPPPPPPNOPNMOPOOOPPPOMMNNPNOONONOONNOOOOOOOOOPPPPPOOOPPOOOPQRRPPPONOPPPPPNNOONNNMOONOPOPPPPPPONOPPOOPPPPOOPPPPOOOOPPOPPPPPPPQPPQPPOQQQPPQPQPNNNPPNNNNOPRQPNMNPQOPJIJIJJJKJJJKKHIHIJJIIHJJJJIHHJJIIJJHIIHJHIHHJJJJJIHIIIIHGHIJJIIIJHIJJHHIJIHJJHGIIHHJJJJJJJJIHIJJJJJJKJJJJIIJJKJJJKJJKKLLLLKKJJJJJKKKKKKKKKLLLLKKJJJJKJJJKKKJKLKKLMMLLLKKLMLMMMMLLMKKKKLMLLKJJKJKKKKLLLLKLLLMNNNNNNMLLLMLLLMLLLMNMMNPPNMNONNOMLMMNNMLLNNNOONNMMNNMLMMNNOOOMNMLMNPWetvuuvutvz{~{trkYPPONOONNNNOONOPONNNOOORTSTVWW]ddbdhnqwz {x{~ |~~~{z|}~}{{|}~}}|xtnihini_^\\YTQPPSUTSSSXagilf[TQPPPPPPPPPPPPOOONOPPOPOOPOOPOOPPPPOPPPONOOPPPPPPPPOOPPOOPPPPQPOPPPPOPPPPPPPPPOPPOMLNPONOOOMNPPOOPPPPPPPPPPOPPPOONPPOOPPPPQQPPPOPPPPQQNNOOOOPOOOPPQPOOOPQPPOOOPPPPPPPOPPPQPPPOOPONPPQPPOPQPPPONOOPPPPOOPPPPPPOOOOOOPPPPNMOPPQRJHIIJJJKKJJJJHGFGIIJKIKJIJJIHIJIHIHHHIIIHJJHIIIJJJIJJJJHHIJKKJIIIIIIJJIJJKJKKIHIIIJJJJJJJJJIHIIJJJJIJJJIJJJJJJJJKJJKJJJJKKJJJJJJJJJJKLLKJKMLLKJJJJJJJJJKKKJJKKKLMMMMMMLLMMLKLMMKLLLKJJKLKLKJJKKLKKKMNMKKLJKLMNMLMNNMLMMMLKKKLMNNNMMNNMMNNONNMMMLLMMOOONNNOONNMLLLMNMNNPPONOOMMNPTcwwxwvvuvwx|ywuiXQQOOOOOOOONNPPPONORTSY``adca^foopvyvy{ ~{ustxz~~|~~}{yxy{~~~{smlpvpb^ZXTRQONPPNOOQY_efg]SSQPPPPPPOOPPPPPOOOPPPPPPOOOPOOPPPPONNOOOOOOPOOOOPPPOONOPONOPPQPOOPPOOPPPQPPPPQPONOOOPPOOPPOKMPPPPPOPPPQQPPOOPOOOOOOPPPPPPPPPPNOOPPOOPPNMMMONOOOONOPPOOPQRPPPPPOPPPPPPPOPPOOPPOOPMNPPPPPNPPPQQNMPOOPOPPOPPOPPOOONOQPPPPPOOOOPNOJIIIIKKIIJJJJJIHHIIIKMJHHJJIHHHGHIIJIJJHIJIHHIIJJJJJJJIIIIJKKJJJJJIIJJJKJKKKJJJKKJJJJJKJJJJIIJJJJJKKKJJJKKKKJJJJKJJLLKJJJJJJJJJJJJJKKKLJJKKJKMLJJKLKJKKKKLKKKKKLMKMMLLLLLLLLLMMLKKLKJJKKKLLKLLKLMLMNNMLMLKLLKKLMNNNLLMMMLKLMMMMLMMNNNNMMMNONNMMMLMMOOONNNOONMNMMNONMNNOPONNNNNOPUbrvwwvwvvvw{{wtld]WQOPPOQRQQPPPPQSY_eirz{xwtnnuzxz~|{{|}~}~~{{{qnorv|}~}}~}zuwz~~rqu{vc[YVSSSQOKJKLORW\_`^WRQQPPPPPOOPPPPPPPOOPPPPPPPOOPOPPPOPPNOOPPPOOPPPNOPQQPONNOPPPPPPPPPPPNNPPQPOPPPOOOOPPPPPOPPQPMNQPPPPOPPPQQPPOOPOPPPPOOPPPPPOOPPOOOPOOOPPOOOPONOPONOOOPOPQPPOPPQQPPPPPPPPOPOMMPQNOPOOPQQPONOOOPONMNPOPPOQQPPPOQPPPPQPPPPPOOPONOOPKJJJKLLKJJJIJJJIIIJIJKJHHJJIGGHHHJJIIHJIIIJHHJJJJIIIJHGHHIKMJKKJJIIIJJJKJIJJJJJJKJJJJJKJHJKJIIJJJJJKKLKKMLKKJJJJJJJLLLKKJJKKJJJJJJKKKLMKJJIJKKKJKLLKKKKJJKLLLKJLLJKLKKLLMLLKMLLKKKLKLLKKKLLLKKKMNMMMMLKLLLMLKLLMMNNLLMLMMNMMMNMLMNONMMNNNNMNMMNNNNLMNNNOOOONNNLMNNMNNNPONMNOOOOOTbprtvvvwvvwzzvxzuaRPQQRWZZZYVUVXZamz~ ~z{~~~~}~~|xwxy||zuqu}~|tnlnty}|~~ ~vx }~tuz}u`XWVUUTSQJHJNUWX\]\XTRPPPPPPPPPPPPPPPOOOOPPOPPPPOOOOOPPPPOOOOOOOPPPPPPPPQPONNNOPPPPPPPPONNOOPQPPPPPOOOOOPOOOPQPPPNNPPPPPPPPPPPPPPPPPPPPQPOPPPOPPPOOOOOPPOOPPPPPPOOPOOPPOOPPPOPOOPPQQPPPPPPPPPPNNNNOPPOPPPQQRPNNOPPNOONOPPONPOOPPQRPOPQRPPPPOOQPONOPRKJIHJLKJJJIJJJHHGHJKKJJIHIHHGHGIJJJIIHIJIJKIIIIIHGHIIGGJHHJLKJJJJJJJJJKLJIIJKKKKKJJJJJKJJJKJJJJIJJJJKLKLKKKJJJJJIJJLKKKKJKKKKJJJKKJJKKMLKIIKLKJKKLMKKKLKJJLLLKJKLKLLLLLLMLLKKLKJKLKLNMLJKKJKLMMMLLLLLKJLMLMMLMMMMMMLLMMNONNONNNNNNNMMMNNNNMNNMNNOONMMMMMOONNOOONONOOMMNNNNOONOOOR[gpsuwwxwvxz}|y~sYQTX\clmmoifhhknw }wtuuy|zxsprx|}yqnqu|{y ~ {}~~sa]ZZYVTQOJJNY`_\[ZWTRPPPPPPOPPPPPPPPPPPPOOOOPOOPONNOPPPPPPOPPOPOPPPPPOOPPPPPONOOPOPQPPPOOOOPPPPPPOPPOPNNOONOPPOOONLNPPPQQPPPPOPPPPPNOPQRQPPPNNOPPOOONOPPPPPPQPOPPPONOQPPPPPPPPOPPPOOPPQPOPOOPPOPPPPPPNPPQPPPPPPPOOPQPOPPOOOONNPPQSQOPRRQPOPQPPPPPPQSGIJHGJLKJJJJKIFGFGIIJIHGGIIIJHGHJJJJIGHJJJIIJJIIHHIIIIIJIIKKKJJJJJIIIJKKJJJJKKKKIJJJIIKKLKJJJJIIJJJJJJJJJJKKJJJJKKJJJJJJJKKJIJJJKKJJKJKKJJJJKKJIJJLLJKLJJIJLMLJKLMMMLMMLKKKKKJJJKLKKLLMLKKJLMNMLLLLLLLMMMMMLLLLLLLLLLMMNONNONNOPOMMMMMNNNMMNNNNNNNONMLMNMONMNOONOOONMMNNNOPPNOOOQQZgouvxzzzzzz}||ydZ]cis|~}ysy~wsruz||yvtwy||uqsv|~zy |pnmjcZTOOTVdqupb[XTRQQPPPPPOPPPPPPPPPONOMMNOPPPPOOOPPPPOPQQQPPPOPPPPOOOPPPPPPPONOPPQPPPPPOPPPPPPPPPPOQPPPPONOOOOOPONOPPQQPPPPNOPPPPPPQRRPPPPNNOPPPPPNNOOPPPOOPOOPONOOONOPPPPPPOOOOOOPPPPOPONNONOOONNOPPPPPPPQPPPOOOPOOPPOPQPNOPOPSROOQRRPPONOOPOOOPPGIJIHIKJJJJJJJGFFGIIIIHJKJJIIIIGJJJJJIIKKJIIJJIIIIJIJJJJHIJJJJJIIIHHHJJIJJKKJJJJIJJIHHJKKKJJJJJJJKJJIIJKKKKKJJJKKKJJJJIJLLKJIJJKKKJJLLIIIJJJJJJKKKLLKKKJKKKLLKKKKLLLKKKKLLLLLKJJLLLKKLMMMLLLKKLKMMNNMNNLMMMLKLLLLNNMMMMMMMMNONNOPMLMMMMMMLLMMNOOMMNNNNNNMNNNNNNNNNPNMMMNMNOOOOONNPVbnrvy{{}~~{{sfhprx|~ ~~~xvv|}zzy{~xrrx}~zz {iWWctsx~~|l_VUSQPPPPQPPOPOPPPPPPOOOONNPPPQPOPPPPPOOPPQPPPPPPPPPOOOOOPPPPPPOOPQQPPPPOOPPPPPPPOOPPQPOOPPPPPPPPQPOOPPPPOPPQOOPPPQQRRQPPPONOOOPOOOPONMOOOOOOPNMNOONOOOPPQPPPPPONNOOPPPPOOONNONNMMNOPRQQQPPQQPPOOOOPPOPQPPRTQNOPPQQOPRRQPSQNNOPPQRRQJIIJJIJKJJJJKJGFHHHJIHIKLIIIHHIIIIJJJJJJJIJJJKJJJJJJKKKIGHJJJIHHHIHHHJKJJJJKJJJJJJIIHIJJJJIJJJJJJLJKJJJJJKKLLLKKMLJJJJIKKKJJJJKKKKJJLKJIHJJKLLLKLKLMLLLJKLKLLJKKKLLKJJJJLKKKLLLKLLMKKLMMLKLLJJKKMMNNMNMMNMLLLMLKLMMMMLMMMLMNOOOOONMLMMMNMLLMMNNNMMMMLMNOONNPPONOONONMMMMMNONOOONNOR[kstwz~~}}xtswwz{|~ }{{{yy|}~ |{{{}{srz}~z| zlp{|ujdc\WSPPOPQPPPPPQRPPQRRPPPPPPPPPPOOOOPPOOOOPPPPPPPPPPPPOOPPPPOPPOOQPNOPOOOOPPOOPOOOPPOOOPOPPOPPPPOOPPPOPPNOPPOOPPPRQQQPOPPNOPPPPOPOPPNMOPOOOOONNNNOOPPPPPPOOPPPOOOPPPPPPPOOOPPPPPQPPPQQPPPPPQPOPOPPONPPPQRRTQPPPPOPPPRRPPQQSPPPPRRQPJIJKJJJKKKMMLJIIIHIJJJJKKJJJHIJKJIJJGHJJJJLKJJIIJJKKKJIIIIJKJIJIIJJJJJIIJIIJKKJIJJJJKJKJKJJKKKKJKLKLKKKJKKLLLLLKLMKJKJJKJJKKKJKKKLKKKLKKKLLLMMMMKJKLMLLKJLLLLLLLMMMLLLJKLKKKLMMKLLLKLMMLLJLMKKKLMLLNNMMMNNMMMNMKKLMMMNMNNNMNNNOOONNMNOONMLMMNNNNNNNNLMNNOPPOPPPPOONNNNMNNNNNONMNOOQR`ruwx{ |{z}|}}z| }~}||{xvw~ ~}~~yy|~{|z~|zwuqfZUSSRPQQQPPQQPPQQPPPPPPPPPPPPPOPPPPPOPQQPQPPPPPQPPPPQPPPPPOOOQOMNNNOPOOPPOPPPPQPPPPPPPPPPPPPPPOPPOPPPPPOPPPPQQPPQPPPPOPPONOOPPPONOPRPPPPPOOONNOPPPPPPOOPQPPPOPQPPPPPPPOOPQQRQPPQQRPPPOPQQQPPQPOOPOOQRQQPQPPPNPPQSSSRPPPQPQPQPPNLKJJJIIIJMMLLIIIGHJIIJJJJJJIHIJKKKKJIGIJJKLKKJJJJJJJKKIIKKLKJJJJJKJJJHGHIIJLLKJJJJJKKKKKKJJKLKJJJKMMLJJJKKLLKKLKJKLLLKKKKJKMLLKJJKLLKJKLMLLLLKLMLLJKMLLKLLLMMLKLMMLLLLLMKKKLLLLLMLLLKMMLLKMMLLLLMLLMMKKMOONNMMMMLLMMNNMMNNMMNMMNNMMMOPPPNMNNNNNNNNNNNNNNOOOOOPPPOONNNPONNNNNNNNNOPPRYktvxy||}|~~{yy{~}~|ww~ zx{ } }}~sh`__WRPQPPPQQPPPPPQPPPOPPPPOOPPPPPPPPPQPPQPPPPPPPPPPQQPPPPOOOPPOOOOOPPPPPPQPPPQQPPPPPPPPPOPPPPPQPPPPQPPPQQPPPPPPPPPQPOPPONNOPPPOOPPPPOOOOONOPMPSQPPPONOQRPPPPPQPPPQQPOOPPPQPPPPPQRSRQPPPPPPPQQPPQPOPRRPQQQQPOPPQRRSQPPPPPPQPQQPKKJJJIHIKKJLKIHIHJJJHHIIIJJIHHJKLKJIGHJJJLLLLJJIIJJJKKIJKJJJLLJJJJIIJHIJJJKJJJJKKJJJKKKLJJJKMLKKKKMNLJJJKLKLMKKJJJKKKKKMMKKKLLLKJKLLKJKKLMLKJKLKKLKLLKJKLKKLNMLLMMMLLMMMLKJKMMMMMLLLKLLKJKMOLKLMMLLMNLKMOONNMNNNNMMMNNMNOPNNNMMMMMMMOPPPNNOONNNNNNNNMMMOONNOPPPNNNONOPOMLMNNNOONONPRU`ouxy|~}~~{{|~~}zyz}~~~{{}} ~~yuy }~ wqvuhVSSQPPRQPPPPPPOOOPPPPPQQPQQPPQPPPPPPOOPPPPPPPPPQQPOOONNNOPPPPPOOOPQPPQQPPPQPPPOPPPPPOPOPPQPPPQQQQPPQRQPPPPPPPPPOPPPPPPPPPPOPPPPNOPPPPPPONRTQOPPNNOQRQPPPPQPPPPQPOOQQQQPPPPPPQRQPPPPPOPQQQQQQQPPRQQRRRQPPPPRTRPQQQRQPRQPQQRIIJJJIJJLLJKKJJIHIIIIIJJJJIJIJJJKJHHGHIIKKJJJJJIHJKKKIGIIGGIJKJJJJIIIJJKKJHIIJJKKKJJKKJLKJKKKLLJJKKKKKKJKLKLLKJJJJJJKLJLMMMLKLKLLLLLLLKJKLLLJJKKKKKJJKKLKKMMMLKKMMMLMNLLMLLLMNNLLLLKKLLKKLMNLKKLLLMMNLLMNOMNNNNNMMMLLNMNOPNMNMMMNNLMNOPPONNNNNNNMMMMNONNONNOOPPNNOOOOPNMNONNNNNOOOOQRVesx{~}~~zxxxyzyz{ |zvvyzz{yxyxy~||{zutx ~ t\WVTSSRQPPPQPPOONOPPPPQRPQPPPPPPOOOPOPPPPPPPPQQPQPOOONOOPQQQPPQOOOQPPPQPPPPOOOPPPOOPPPPPQQPOPQQQQQPPQQPPPPPPPPPPQPOOPQQPOPQPOONNPPPOOPPPOPONOPPOOOQSSQPOPPPPPPPPPOQPPOPPOOOPOOOPONNOOPQQPQPPQQPQPRRRQPPQPPQRPPQQQQQPQPQRQRJJJJJJJJJLKKKKJJIIIJKJJJJJIJJJIJKJJIKKJKLLJJJJJJJJJJIHGIIJJJJJJJIJJJJJKKJIHIIJJJKKJJKJJLKJKKKJJKKLLKKKKKJKKJJKJJKKKLLLLKLKKKKLKKLMLMLKKLKLLLKJJKLKKJKKLLLLLLLKKLMMLLLMMLLLMMMNNNNLLLLLLLMMONMKLLMMMMMLLMOPNNONMMLLLLMNNNOONNNONMMONMNNOPONMOMMNOONNMOPOOOPNMNPPONOOPPPPPPOOPPOOONNOPQP\kw|}|wtrsuvwy|~ |zyxwxzyurqqrutstux}zy}~zz~yusor vjleZWUTTTRQPPPONNOPPPPPPPPOPPPPPPOPPQQPPPPPPQQQPQQPOOPPPPPPPPQQOOPPPPPQPPPPNOOPQQPQQQQPPQQPPPPPQQQPPPPQPPPPPONOPQPPPPPPPPPPOOOOOPPPOOPQPPPOMMOOPOPPQRQPPPPPQPPOOPQQPPPPPOOPPNNOPNMMNMOPPOOPQQQPPPQQRRRRRPQTTRPPPOPPQPPPPPQIJJJJKIIJJLKKKJJJJKKKIJJJJJIJKJJJJJKMLJJJLJIIJJJJJIIIHHIIJJJJKJIIIJJKKKKJJIJJIJKLJJLLJJKKJKJJJJKKJKLKLMLKKJJKLKKKKKKKKKKKJJJKLKKMMLLJLNNMLLMKJJMMKKKLLMLLLLLLKKLLLLLLLLKKLMNMMNNLLLMMLMMMMNNMLLLMMMNONMNNPNNNMMMMMMMMMNOOOOOOONMNOONNNNNPNLNMMOPONNNMNNNOPONNOPPOOOOOPPOONOPPOOOOOPPPPV_p} ~{wtsuxz{| ~~{vphhlnrsrpnnnoqtw~ }ywvxy{||zy||utoo{ z| |{}q^]`efeXURQPPQQPPPPPPOPOPOOPOPPPPPQQPPPPPPPPPPQQPOPPPPPPPPPPPPPPPPPPPPPOOOPPPQQPPQQQPPPQQPPPPPPPOOPPPPPPPOOPOPQPPPPPPPPPNPPONNOOOPPOPPPOOOOOPPPQQPPPONOPPPOOPPPQPPPPQQPPQQQRQPOOPPMNQPPOPQPQQPQQRQQRRQPQSRQQOOOQQQPOPQOPIJJJJKJJKJJJJJJKJLNNKIJJIJJIJKIIJJJKLKJJLKIIIJJJJJIJJJKJJJKJKJKLJJJJJJJKJJJJJIJKKJJLLKJKKKKJLKJJJJLMLKKLKLJJJLKKMMKJJKKKJJKLJKKLNMMLLMNNMLLLKKLNMKJKLLMLMMMMMLKLLLLLLLLKLLLLLLLLMNNMLMNMMMLLMMMMNNNONMMNOPOOOMLLMNNMMMNOPOONNNNNNNOOOOONMMMNONONNMMMMNNNNPONOPONOOONNOOOONOPPPOPPPPPRRU\jz~{{}}}{rgddfimqrqonnpty ~{wuustxzyxy}zwqnu{~} {} }tnqx{~ykaXROQRRQQQPQPPQPOOPPPPPPPPPPPPOPPPPPPPQQQQPQQQPPOPPPPPPPPPQPOPPOOPPOPPPPPPPOOPPQRQQPPOOPPPPPPPPPPPOPQPQQPPPPPPPOOPPONNOOOPPOMNNNNPPPPPPRRPQPNNPPPPPPPOPPOPPPPPPPPPRSRPPOPPNNOPPPPPQSSPPRRQPPRQPPQPPPPOOPQQPPRSPPJJJJKJKKMLIIJJJJILLLKJJJJJJJJJJIJJJJKKJJMKJJJJKJIKJJLMLKJJJKKJKJJJJHJJIJJJKKIJKMMKJKLKJKLKKJKJJJIKMMLLJJKNLJJKJJLLLKJKKKKJLLKKJKLMOOLKLMMMMLLMMLLLKJKLMLLLLLMMMMNMKKMMMLLLLLLLKJKMMLLMNMLMKLMNMMLMNLKLMOPNNOONMMMNNMMNNNNOPPNNNNNNNNOONMMNNNNMNNNNLMNNMMMOONPPOOOPPONNOPPOOPOONOPOPRUXZ_es{ }ulggfhnsvwwxz}} |zxtstvxz{}~xrt{~ysvxyz} | o_VQQQQQQQQRQQRQPPPPPPPPPOOOPPPPQPPPQQQQPQPQRQPOOPPPPPPPPPQPPPQPPPPPQQQPPPPPOPPPPQRQPONOPPOPPPPQQQQQPOPPPPPPPPPPPPNOPPPPPPPPNNOOPQQPPPOOPPQONNNMOPOOPPPPPPOPPPPPOOQRPPRQOPONOPPPPPPRQPQOOPQPOPPPQQQPPOPPOPQQQRSRJJIJJJLLMKJJKKJJJJKJKJJLKJJKKKKJJJJJJJJJJJJJJJJKKJKKMMKJJJJKKKKJJJJJKKJJKJLKKKLNLKJJKKKKLKJJLJJKJKLKKKJJKLLKKKJJKLLLLMLKJKKLMKJLMLNNLJKLLMMLLMMKLLLJKKKLKLLMNNMMNMLLMNMMMNMNMLKKKKKKKKLMMLKLNNNNMLLLKKMNNLLMNMMMNNNNNNNMNNNNNONMMMMNNNONNNNMMMNNMNNNOOMLMMNOOOOPPPPONNOPPPNOONNOPQUY]acejrx{~ }|wrrv| |ywvwzzy||}|{zoqvxxy{}} sbWTSRQPPPOPPQPPPPPPPPPPOOOPQQPQQQPQPQQQPPQRPQPPPPQPPPPPPPPQPPPPPPPQQQPOOPPPPPQQOPPPPPPOOOPPPPPQQPPONOPPPPPPPQQPPPPQQPPPPQPPPQPPQQPPPOPPPPPOOMNPPOPPQRRPNMPPOPOOPPPPPQPQPPOOPQQPPPPPRRNOQPPPPPPQRQPPPPPPQRRQPQSKJJLKJKMJJJJJIJKKJJJJKKLLKKJJKKJKKJJIJIIIJJJJKKJJIJJKLLLJJJKLJJJKJKLKKJJKJKKKKKLLLKJJKKKMKJJKLKIJJKJJKKJJKKJJKJKKKKLKLKJJJJJKJKMLLLMKJKKKMJKLMMLKKLKJKKJJLNNNMKKMMMMMMKKLLLNMKKKLLKKLLLLLMLMMMLLMNNMLMMNMMNOOMLMNMLMMMMNONMLMNNNLLLMMNOONNNNNNONNOOPPPNMMMNOMOPPPPPOMNOOPPONONOPQT\ellnptx{~ |{{{|~xs{|y}vxzxwwx|~ }}{{naZUTRPPOOPPPPPPPPPPPPPOOPPPPPPQQPPPPPPPPPQPQPPPOPPPQPPQPPPOPQQQPPPNOOOPQQQPOPONOOOPPPONOPPPPPOPPPOPPPPPPPPPPPPQRQQQPPPPPPPOOOPPPPPOPPPPPPPONOOPPPPQQQQOOQPPPNNPPPPPPONNOQQQQPPPPPPQQOOQQPPRQPOPPOPQQOPPQQPPQRLKJLKJKLJJJIJJIKJJJJJJJJKKLJJJJJKJJJIIIIIJJJJKKJJIJKLMLLJJJKLKJJLKLLJJJKLMLLLKKLLLLKKLKKLKJJKLKIJKKKKKKKKKKKKKKLLLLMLLJJKKJJKKLLLMLMKJJJLMKLLLLLJJLLLKKLLMMMMMLLLMMMMMKJKLLKLMMLMMMMLLKLMMLLLLLMMNNLLMNOONNNOMLMNMMMNNNNNMLLMMNONMNNLMPPOOOONNONNOPPPPPPONNOPPPOOOPOOOONOPONNOPSW`gtyxyz{ ~~||~ |{|}yt}~y {wwz {yxxy~ }xusty {vhZURPPPPPPPPPPPPPPPPPOPPPPPPPPPRRPPPPPPPPPPPPONOPPPPPPOOPPPQQQQQPNNNOPPPOOOPPPOPPPPPPPPPPPPOOPPPPQQQPOPPPPPOPQQQPPQPPPPPPOOOPPPPPOPPPPPPPPPOPPOQQQQQPQQQRQPMNPPPPQPOOQQSSRRPONOPOPPQQQPRTQPPPPPOOPPNOPPQPPPQJKLMMJJKJJJIJJJKKKKJIHGIJJKKJJJJJJJJJJJJLKKJJJJLKIJKKKKJJJJKLLKKKKLMJJKLLMKLMKKJJKLLKKLLKKJKKKKJJLKKLKJKKKJJKLKLLLLLMLIKLLJJLLKJLMLLLKMMLMNMLLLMKJKKLLMMLLLLLLKKLLLMMMKJKKKLNNMMMMNNMMKJLMLLMMMMMMLLLMNNOONMMMMNONMNNONNMMLMLMNOOOOPOMNOPPOONNOOOOOONONNONNOPPONONONNNNOOONOOPRZfnrx|~ {xvxvwxz ~~|z}|xy {wy{ {zzxz ~wrqtz~ u_XUQPPPPQQPOOOOPPPPPPPOPQQPOPPQPOPQQPPQRRQRPONPQQQPPQPPPPPPPPPPPPQPPPPOOOOPPPPQQPPPPPPPPPPOPQRSRQPQPPPPPPOPPPPPPPQQPPPQRQPQQQQQPPOPPPPPPPPOQQQQQQQPPOOPQQPONOOPQRQPQQPQRQQPNONPPPPQRSQQRPOPQQQOPPPOPPPQQPQSIKLLLJJIJJKJKKKNNKJJJIIJKKJJJJKKJKKLKKJKLMLKKKLNLJJJKJJJJJKLLJKKKKLMJIJLLLKKJJKKKJKKJJKLLMMLKLLKKKKJLLKIJJJKMLLLKLLJLMJKLLKKMMLJKMLKMMMNMMOMMNNNKJKKKKMLLMLMNLLLLLLMMLKKLLKMNNMMMNLLMLLLMMKKLMMMNMLKLMNMNOPONMMMONMMMMLMOOOONMOOONOOONNNNONNOOONOOPOMNMMNNNOONMNPPOOOOOPPPQRSUZhuz{ ~} |yvrrsutuz}~~{zvtq}xvy} ~~~yy{ rl\URPPPQPPPPQPPPPPPQPPQRQPOPPQPPQQQQQPRRRQPPPRSSRQPPQQPQQPPPPPPQRQPQPPPQQQPPQQPPPPQQOOPQRPPQRSSQPPRRPPQPOOOOPPPPQQQPPQRQPPQQQQPPNOPPPPQPPPQQQQPPPQPOOPPQPPPPPPOPPPRQPPRQPPPPPPPPPPRSQPOOPPQRSQPRQPRQPPPQQSJJIKKKJIJJLJJLLLMKJIIJJIIIIJJJJJJKKLKKJJKLKJKKLMLJJJKKJJJJJKKKKJKKLLLJJKKKKKJJKLLKLKJJJJKNNMLLLLLLLKLKJIIJJLMMMLKLMJKMLLLLLKLMMLKLLKLMMNMLMLLNNLKJKKJJLMMNMMMNMLKLLKLLLLMNMNNMMNMMLKLLMNMNNMMMLMMMMLMNMLMOOMMMMNNMMNMLKMNNOONOONNNNOOOONOPNNOOONOOPNLNOMMNOONMMNOPPOOOOPPRY^YZ_p}}~ ~ ~|yurnruvuxz{{{ ~yvtsrx xru{ {z ~g\TQPQQPPOPPPPPPPQRPQQQPPOPPQQPPPPPPPPQSQPPPQRRQPPPQQQQPOPPPPQRRPPRQPQRQQPPQRQPPPPQPPPPQPPPQQQPPPRRPPQQOOPOPPPPPPQPPPQRQPPPQQQQPQPPPPPQQQPPPPOPPQPPPPPQQPQQPPQPPPQRQPPQPPPPPPONOPQQQPNOPPQSRRRRPPTWSRQPQQKJIKKJJJKJLLLNMLLKKKKKKJJIIJJJKKLKJJJJJJLMLKJKLLLLJJKKKKKJJJJJKKLLLKKJJKJJKLLLLMMMMKKKLLKLMLLKKLLLLMLKKKLLKMLLLMNNLJKMNNMMMLLMNNNKJKMMOOMLLLNNMMLLKLMMMMMNMMKLMMLLKJJLMNNOOPONMMLLLMMMMLLMNNMMLMMMMMMNMLMOPMMMMNNMNNOMLMOOOOPONOPOONNOONOPNNOOPOONOONOPMMNOOONOPPPPPPPOPQT_hffiq|~ ~ ~{{|}ywtssy|ywvxwv} ~zuts{ |sqx wl`URRRPPQQPPPPQQRPQPPPPQQPPPPPPPPPPPPQRPPOPQQPPPPPQQPPPPPPPPPQQPPQQQRQPQPPPQQPPPPQPPPPQPPPPQRQPPPPPPPQPPPOOPPPPPQQQPQQPPPPPPQSPRPPOPQRQPPPPPOPPPQQPPPQRPQQPPQPQRSQNOOPPPPPPPPOOPRRQOOPPPRSRRSSQRTUURQQRRLIJIKLKKKJLMMLKLLKJKKJJKLKJJJJKLNNKJJKJJLNLKJKLKKLKKKKJLLKJKKIILMLKJJKKKKJLLKKLLLLLJJKKLLLLLKKKKKKKLMMLLLLKLLLMNNMKKLNOOMMMLMMMMLJKLMNPPNLKLMONLMMLMMNNLLMLMMLLMMLKMMMMMNPONOOOMLKLLMMMLLMNLLMMNMMLLLNNMMNONLMNONMMNOONPPOONOPOONOONNNNNNONNNOOOONOOPPONNOOONNOPPPOONOPQUX^ozyvx|~ ~ {wvz}|yxxx{}{xvvuty}}{|}{uu} ~~ ~|{ q[TRSQPPPPPPPPPQQPPPPPPPPPPPPPPPPPPPPPPPPQQPOOPPPQQPPPPOOPPPPPPPQPPQQPPQQPPPPOPQQOOPRRPPPPQPQQPONOPQRQPPOOPPPPPQRQPPPOPPPPPQRQQPOOPRQPPPPPPPPQPPPQQPRRPOPRSSQPQQPNPPPOOPPPPPPOPPQPPOOPRRQQPQQQPRRSRQQPQKLKKMNLLJIJKKJJJKJHIJJIJJKJJKLLKLMLJJKLLLMLKKLKLKLKJJKJKKKKLLKKLLLKJKKLJKKLKKJKKMLIKLKKKLLKKKJJJKKKKLMMNLKKKLLNNNMKMNMMMMMMNMLLLKJKMMMONMLLLMNNLLMMLLMMLLMNMMMMMNMLMOOONNOOMMNMLLLLMOONNNNMLMMMOONLNONMNNNMMLLMMNMNOOOOOONNMNOONOPPPOOOOPPONMOOONOOOOPPNMNNNONOPPPOOPTX\dkqy} zuv}~{yyyzzyyvsrw||{{}{z} ~{zxy||z{}zvtuz u^UVURQQQQPPPPPPQPPPPPPPQQQPPPPPPPPPPPPQQPPPPPPPQSRQPPPPPOPPPPPQQQPQQQPQQQPPPQQPPPPPQRRQPPPPPPPOOOPRRQPPOPPQQPPQQPPPPPPQPPQQQQPOPNPQQRRQPPOPPPPPPPQSSQPOPSTTSRQPPPPPPPPRRQQOOPPPPPPPPOQRQPPPPPPRRQSRQQQKKJLMNMMKIJKKJJJJJIJKJIIIIJJKKKKLKJJJKLLKKKKLLKKKLMKKLLLJKKKKLLLLLKKJLLKKLLKLKKKMMKKKLMMMLLLLMLKKLKKMMMNLLMLLLMNNLLMMLLLKLMMLKKLMLLMLLMMLMNLLLKKLMONMLLMMMMNMMLLLKKLMOPPONMLKLMNMLLMONMMNNMLMMNNNNMNNNLMNONLLLLLLMNNNNOOOMMNNONMOOPPPNNOPPPMLNOPONNNOOPOONNNNNOOOOOQVbksz }{|zwzzywvwyzupnqux|} }|} ~}yvusssqppqpopv{ ~}~ ~|| tfebZUSQPPPPQPPPQPPPPPPQQRQPPPPPPPPPPPQRQQPPPQPPPRRQPPPPPPPPPOOPRRQPQQQPPPPQQPQQQQQPPPQRQQQQPPPQPPOPRQPOOPPQQPPRQPPQQQQQQPPPQRSSRPPPQQRQPPNPOOPPQQSTSQPPPRRQQRSQQQPPPPRTRPQQPPPPQPQQPNQSRPOOOPQQQSRQPPPJJJLMKKLLLKLLLKJJJJJJKJKKHIJKJKKKIJKKKMLJJKJKMLKKLMLLNONJLLKKLLKNMKJKMLKLMKLLLKLMMLLLLMLMMMMMNNLLLKKMMLLLLLKKLMNONMLLLLLKLLLMLLLNMLLLNMLMNONMLJKKMNLLKLMNMLMMMMMLLLMMNNNNNNNMMMNNMLLLLMMNNMMMNNMNNNNOONNOPONMLLLMNONMNOOOMNNNOPOONNNOOOOPPOMMOOPPOOOPPPONNNMOOOOOPPS\p {ww{~{|~~}} |z{xvvyzxqllsw} ~zz~~{xxvtspmnkgegknr{ }}}|yxz {vcYTQPPPPQPPPQPPPPPPPQQQPPPPPPPPPPPPQQPPRRRPPPPPPPPPPPPPQPPQSSQPPPPQPPPOPPQRRRRRQPPQRRRQQQQQPPPPPQQPOOPPOOPPQQRRPPPPQQPPPPQRTSQQQQPPPQQPPOOPQRRRSSQQQPQRQQQQPQQPPPPPQRPQRPPPPQQRQPNPSRQPOOQQPRUPPQQPJJIIJKMLJMMKJIIJJJJKLLKKJIJJKLLJIHKLKKMMKKKJKMKKLMMLLMOMLMMMLLKLMMLJJLLNMMKMLLLMMMNNMMMMLMMKKLMMLLKLMMLKKKLKKLLMMMNMMNMLLLLMNMLLLLKLMLLMMMMMNOLLMNOKLLKLLMMNMMLLLMMNONMMNOPNNMLMMMMMMMMMNMMMMMMMNOOOPPOOOONNMLLLMNNMMNOOONONNOONOONMNOPONNNNNOOOOPPONOPOMMMNPPOOPQTXcz }{| {xz|}zz{{{}~~z| }~}{yxzyvqpqvz |z| }|zzxsqsvwvspoib^blsw|}~|| ~zwwwyvuuz |m[TQPPQQPPPPPQPPPPPPPQPPPPPPPPPPPPPPPPPQQRQRRQPPOPPPPQPOPPQQQQQPPPPOPPPPPQRQRRRQPQRRRRPPPPPQPPPPPQQPPPPPPPPPQRQPPPPQQPPOPPPQRSRSSRRPRRQQRPPPQQQSSPQQQRRQQPOOPPPPQQPPPMOPPQQQPPPPQOOQRSSQPQQPPQPPPPRLKIIJLNMKKKJJJKKKJJKLMLKJKJKKLKJJJKMKJMLLLKLLLMMNOOMLLKLMNNMMKKKMLMKKLNNNLKKLMMKMOPOMMLLLLLKLMNOMMMMMMLLKKLMMMMMMMMMMMMLLLKMMLKKKKLLLKLMNNMKMNMMNNPONLLLLMNONMMLMMMNONMLMMNNOONNNNNNNMMLMMMNNMMMNONOPOOMMMMMMMMMMMMMNNOOPONOOOONNNNMNNOONNNOOOONNNPOONMMMMMNPOPPSU^hu~ ~{zyx{}~ }xuvy|~|{}~~{ }zxy|~}{zxutvx} ~wsrutmiovxvttrha`gsy|}{yy} yvtuuprvz}~{um]TRPPPRRQRRPPPPPPPPPQPPOPPQPPPPPPPPPQPQQRRQRRQPOPPPQQOOPPPPQQRQQPPPPQQPPPPPPQQQQQQRPPQPPPPQPPPQRQQPPPPPPPPPQQPQQPRRRPPOPPPPRSSSRRQQSRQRRPOPQRRSSQRRSRRRQQQOPQPQQRRQPOOPPQRQPOOPPOPQRSSSRQQQPQPPPQROKJKKLMLLKJJJKLLLJKKKKJKKLKMLKKLNMMMLJKKKMLLLNNNMLLLLLKLMMMMLLMLLLMKLMLLLKKLLLLKLMOONMKKKLLLLLMMMMMMLLLLMMMMMLLMLLLMMLLLLMMMMMMLLMMLJJLMNMMMMNNMLNOOMLLLMNNNMLLNONMMNMMMMMMNNOOONOONLLLLLMOOPONNOOOPPPOOOMLLMMMMMMNONNNOOOOPONNNMMNNNNOOPPPPPPONNNPONMMMNNNNOOPRV`q} ~}{yy{{zz{||}zvrrx }zzz{|~}z|}}ytty}zy}~z|}} |uqqtqihmrsrtvtlilsxz||yvy~ wsoqtwyz|{wsm`WRQQQRRQRQPPPPPPPPPPPPOPPPPPQRPPPPPPPQRRQQQRQPPPOPPPPPPPPPPPQRRQQPPQQQPPPPQQQQQQPPPPQQQQQPOOPSSQOPPPPQPPPQRRQSRQRSRPQQPPPPRSQQQRRQRSRQPPQRRSSRRQRRRRRQPPPPQRQQRRSSPPPPPPPPOOOOPOQRRRQSTSQQRRPPPQQKKJLKKMLKKKLJJMLKIJJKKKLMMLLKLMMNMMLLJJKLNNMMNONLKKKKKKKLLLLMMNNMKMOONMLLKLNMLLLNMLMLLLLLLLMMMLLLMMMMMMMOONNMLLMLLLLMLLLMNNNNNMLMNMLKJLNNNNMMNNLKMNOONLLNNNMKLNPPOMMMMMNNMMMMMMNONNNMMLLKMOPPOONPPOPPPOOONNMMMMMNOONNNNNOPPPNNNNMMMNNNOOPPPPPPOOOOPPONNNNNOOOQQU^p }{yzzyxy{}}}}~~|ytrx {vuuw|~|yxz}} ~|z} yurou |{zwvupjhhknqsvurrsvyzzzvty|}{ {wrstvwx{zxuodYUSQQRRRQPPPPPPPPPPPPPOOOPPPPPPQRQPPQQQQQRRQPQQPPPPPPPPQQQPPPPQRRPPPQQPQQPRRRSQPPQRQQQPQQPPPPQPPQQQPPPPPPPQQPQRSQSSQRRPQQPQRRPPSSRSSSQQQQRRRRQQQPPPQPPPPPPQRRRRQQPQRQOPONQPONPPQSRRQQQQQPOPRPOPQQJJKMLLLJHJKLJKLLKJKKJLJKLLKJJLMLKLLLKLKKLMONLKLNNMLKKJJKLKKLMLMNMMMMNMKLLKLNMKKLLLKLLKLMNMMMMLLLMMMMLLLMNNMMMMMMNMMMMMMMMMMNNLLLMPPLKLMLNONMLLLKLMMMNNMNOONMLMMMMMKLMLMNNNMMNLLMMNNMMMMLLLMNNNNMNOOPOONNONMMLMNNNNONNNNNOPPOMMNNMMMMMNOPOONNPPOOOOPPPONNNOOOPRVdu} }zzzyzz{}~ ~yvy{ yutw|||{yxyy| {rlim ~xvwwy{~|vsokgfjnqtvwvtxyvvuuuux}~}~}xuvvu} {yxwobZWSQRRQPPPOPPPPPPPPPQPPPOOQQPQRQPPPQRQQQQQRQQQPPPPPPQPQQQPPQQPPPPPPQRQQQPQQRQQQRRRRPPPPPPPPPOPPQQQOOPPQPQRQPPQRPPQQQPPQRSQQRQPRRRQQRSSPPQRQPQRSQQQQQPPQQQRRRQQRSRQRPPONOQPPOPQRSSRQQRQPPOPQPOPPPJJJKKJKKJKLLJKKLKKKJJKLLKKKKLLMMKKLKKMMMMMNLKKKNNLKLLKKLLLLLLLKLMMMMMKJKKKLNMLLMLKKLKLKMMMLMLKLMMNMLLMLMNMLLKLMNONNMMNLMLLMMNMMMNOPLLLLLMNNMMMLLMMMMMMMNOONMMMLMNNLKLLMNNNMMMLLMNNNMNNMMLLMNNNMNNOOONNMMNMMMLLNNMMMNNLLMOOOMMNNMNMNONNNOOONNNNNNNOOPPOONMOPPQV`q ~~} }zyz}|||zyyz{~||~~tnkn~|vspnrv{| |xqecdjsx|yutqpssqonox~}~}~ ytvvw }|{zzwgZTRRQQPPOOPPPPPQPPOPPPPQQPQRRRQQPPQRRRQRSSRRQPPPPQPPPQPPPPQQPPPPPPQRQPQQQRQQQQRRTRQSSQQPPPPRSQPQQOPQRRRQPPPPQQPPPPPPPQRRRQQRRRRRPQQRSQPPQPPPQRRRRRPPQQQQRQQRTVVTSRQQPPPRPPPQQQRSRRQRPPPPQRPQQRRKKKJJIKLLMMLKKLJJJKKJMMLLLLKLLKMLJKJKMMMMONJJLMMMLKLMKKMMLLLKKKKLNNNLLKKJJLMLLLLLLLLKLKKMLKLMMMONNMLMOONNMNMLMOOMMNNNNNLMLLMMMMMNNNMMMMKLOONNNMMMMMMMMMMNNMLLLLNOOMLMMNMNMMMLLLLNMMNNNMMNOPOMMMNOPOMMMLLLMMMLLMNNNNNNNNMOONMMOONNNNOOOONOOOPOONNMOOOPPOOOPQRWao} ~}}{zywz{|}|zz| ztoo|}vqnnqu|}} ygbbity{xunjlrpnmnpz~~{{~ zvvx} ~}}~~o^VTRPPQPPOPPPPPPPOOPPPPQRQRRQQRRRRQRRQQSSRQQQRQQQQOPQPPPPPPQPPPPPPPPPQQRRRQQQPRRSQQTTQQRPPRSRPPPPPQRRRSQPPPOPPQQPPPPPRRRRRRQQRQRQQQRRPQRQPQQRQPQRRQPPPPQRRPPQRSRQQQQPPPPPOPPPPQRQQPPPPPQQQQPQRRLMMLLKKKLMMMNLJKLLLMLNNJJKKKLMLMMLLLKLMMLMNLMNMNNLLMMMMNMLMNLLLLKLMLLLMLLKKKLLLKLNNLMMLKKLLNONLMOMMMNPPPNMNMMNNMNLMMLMNMMLKLLLMNMMLMLMNMMOOMNNNNLMNONNNOOPOMMMMNONLMMMMMMNNNMMMMMMMNMMMMNPPONNOOPPNNNNMMNMMMMMMMMNOONOONOONNNOPONNOOOOONMOPPOONNOPPOOOOOPRX`jvz}}|} }~~|yxusy|~}{|}vqqw~|vsqprv} |ulhgnwywvtjhjnqmlpw~{|~|}~{{ }|~s_WUSQQQQOOPPPPPPQQQQPPPQQPQRQPPPRSRQRQRRRPOPRRRQQPPPQPPPQQQQQPOPPPPPQQQSSRQQQPQQQQQRRPPRRRRRPOPPPPRSRRRQPPPPPORQPPPQQQQQRRRPPPPQQPQRQPPSRRRRRQPQSSRRQQPQQRQQRRRRRQQPPPQQPOOPPPPRRQONOPPQQQQOPQSOMLKKKJKLKLNNMLLKKJKLLNLJJKLMNOMKKLLKLLMMLMNMOOOMLKLMOONMNNMLKKLKKMMLKLMMLLLMMMLNNNNMLKKKLLMOOMMNMMNNMOONNMMMMKJKMNLLNMMLLLLKKLMMLKMNNMMMMNNOOOOMNOOOONMOPOMMNNOOMLNNMLLNOONNNNNMMMMNNMNNNNMOOOOOMMNOOMMNNNNOONNMNNNNNNOOPONOPONNOOPNNNOOONNNNOOPPOONOOPPUdvy~|~ |zy{ }~|yvutw|{||zz}}||~ywuv}}xsqqtx urrttwyzx{{unilpnoszzstz}~~|{wv~ ~~xgZUTRRQPPPPQPPPQRQQQQPPPPPPRRQPPPRQQSQRSSQPPRRSQPOPPPPPQPQQQRPPQRQRQQQSTRQPRSQPPQQPPPPPRSRRSRPPPPPQQRRRQQRQRTQQQPQQRQPPQRRQPPPPPPPPQQPOPRSSRRQQQSRQQQQQQPQRSTSSRRQQQQRRQPPPPQPQRSROOOOPPQQQQPORMLKLMLLLLLLLLLNMLLLKKMNMKJJKMMOLLLKLMLLNLLNMMMNMLKKKMONNNQQONKMMLKLLLLKLMMNNNNMMNONNMLMMKKKLMNOOMLLNONOONMLLLKLLMMONMMMNMLMMKKLMMLLMOPONMLMNPPOONNNNNNMLOONMMOOOONMNOPOPPPONOOONMNNNONNOPNMNNMNOOMNNOOONNOONONNONNNMNNOOPPOPPOONOONONMNPPOMNONOPPOOPOONQUYg~|~}yz|zwx| ~xwuvzz{|~{xut}yz}}}{|}~~~}tmouy |tsz }~}vsssssrpmr{|y{~~~}zxty~{z}|rk]WURQPPOOPQQQQPPPQQQQQPQRRRRRPQQQRSRRRRPPQPPRQOPPPPPQQPPQQRSSRRQQQQPPRSQQRRQPPPQRQPRRRRRRSRQQQPPPPQSSRRQPQRPPPQSQPPPPQRRRQPPPPPQPPPOOPPQRRSRRRQQQQQPQQQRRRRRQRRRQSSRQQRRRQPRSRQQPPPOOPPQQRQQXLLMMLLNMLLKKLMNMMKJKJJLLMKJKMLMMLMMONLKLKLNMMNMKJLLKMOONNOPPNMNMMMNMMLKKLMNNMMMMNONNMLMNLKKKLMOOLKLMNOPOMMLLLKLMMNNOONNMLLMLLLMONMMMOPOPNMMNOONNOONNNNNNPONNOONMNNONOOOOPONNOPNMNMMNOONNNNNNNNNOOOONOOOOONNOONNNNMMNLMNNOPOPPOOOOONOPNMNPPOOPONNPPPPQQPSYer ~}}xustz}|{|}~~||{xwwz~ |xyzzz{}}zvroy|| |{{{}{opvy {xz |ywrnkjnt||uu|}}zwvz{{{vuw{~zyjZVSSRRPOPQQPPPPPQRQQPPQPQRRRRQRRSRRQPQPQQPPQPPPPQPPPPPQPQRSRRRRQQQPPQSRRRQPPPPRSSRSSQQRQQPPQQQPPPQRSRPPPPPPPPQRQPQRPPQPQRPPPOQRPPQQPPPQRRRRRQQRTSRQRRSRRRRQPPQRRRQOPQRRRSRSRPQQPOPPOPPQRSRQRLLMMMLLKKKLLMMMNMJJKLKKKLMLJKLNMLLKMMLKMMLKMOONLKNNMNONNONNMLLNNLMNNMMLMNNMMMMMMMNMMLLLMNMLMNNNNMMMNNNONMLLLMLLLNONNNNMMMMLLMLLNOONNOONOONLMNPOOONNNMMNNOOOPONMMNNNMNNNNOOOMNOLMNMLMOPONMNNNOONMNOOOPOOPPNMNOOONNNNNMMNOPPOOOOOOOONOOMMOOPQOOOOOPPPQQVX[fx ~|wsrqpprstttwyzywuvwutssu| }{y{~~~|zsmq} }x} ~|{zy}zy~}~wvx} ~{z ~|zxyywrmjlqwzzrr{~}wty{x{~{yvsrv{~|zug[WURQQPPQRQRRRRPPPPOPRRQRRRRRSSRQRQPPQRQPPQRQPPQPPPPQQPPPQQQQRQPPQQRQQRRRQQQPPRSSTTRRSQPPQRRRQPPPPQRQPPPPPQQQRRQPQQQPPQRQQQQTWQRSSQPPQRRRQQQQRTRQQSTSRQQRRRRQPQQQOQRRRRSSRQQQRQPQSQPQRSTRPOJKMNMKKKLLLLMNLLLKKMNLLMNMLKMNMMMNMMNMLNNNLMNNNLLMNMNMLNNONMLLMNLLMONNMNNONOONMMMNMNNNMNONNONOOONNNNNMNNMMMMMLMNNNONMNOOOOMMLLLOPPPOPOMMMMLNOONNNNMMKLMNOPPPNMMMMMMNNNMNOPPNNNMMNMMMNONNNNNNONNONNNOPPOPONNOPPONNOOOONNOPPPOOPOPOOOOOMMNNOPONOOOPPPRUbmsz |wsolifgjklklprspnnqsrnllnw~|{ ~z|~vnmx~ }vqs~}}|zz~ }wutv~srvz{{{~ |zyyxvttqllnrvvtpr|}{wty~~}zy|{zurpnouz~}}||zre]YTQPPPQRRRSQQPPPPPPQRQRRPQRRRQPQRQPRSRPPPRSQRQPPPPQPQQPQQPPRRPPQQPQRSSRRRQPPSSSTSRQRQQRSSRRRQPOOPRSRPPPQQQQRSRQPPQRRRSRRPRTTSSSRRPPQRSSQQRQQRQPPQTSRPPOOQRQPQSTQQSSRSRRQRSRRRPPRQPQRRRRQQKKMLLKLMMKLLLLKKNONONMKNONNMOONMLLLLOPOPOMLKJMMLLMNMNMLNOOMMNMMLKLOPONMMNOOPONNLKLNOONNNONNPONNONNLMNNMMMMNNMMNONMNMMNPQPPPOMMMNONOPPNLLNNMMNNNONNNNMMNOOPPOONONMLMNNOONMOOONOONMMMMNNNNMMNNNNOOOOOOOPPOOOOONNNNNPPPOOPONNOOPPPPONOOOPOOOOPONNNOOPPT_t| {wrmie^[Y[`eefkmmklqttrqprz~~|yy{ zolrz {tnnu~zx| zvqmmqu|~xx{||}|yz}{wtrnlnoqpnnrx}~|zvux{}|yx{~zqnmloty{z{|}}}ulaWUPPQRQQQRPPQQQRQPPPQRQQRRRRQPQQQPQSSRQQRRRQQQPPQQPQQQQRRRRSRQSQPQRQQRSSRQRRRRRRRQPQRSQRRRRPPPPRSSRPQRQQQQSRQSQQQSTRRSQQRSRSSRRQPQQRTTSQQPQQRPQPQRQPRPPQQRRQSSRSRRQRSQPQSSRQPQRQPPPPRRTTMKJKKKLLKKMLLKKMNNMNMNLMNNOOONMLMKJKMOPOOOMKJMNLLNOLLLLNPOMLMMMMOQPPOMMMMNMNMNOLKMOONMNOPOMNONNOOMLMONMMNMNNNNPONNNMMNOPOPPOOMMNNNNONMLMNNLMMMNONNNNNMNNNOPPOOONMLLNOOOONNNNPPONNNOONNNNNNNMNNNNOOOOOPPOPPOOOMLMNOPPONOONNMNOOOPPNOOOOOPPOPPNOOOOPSYh{} ~}}}~~|{voke]WRQV]ciqvyxvy}}{yxx{~}|z| }pmry~{ztqons|wqqw|||~~wsonqsqsx}~|{~~}|{yy~zpkjlkjloptz{zyvuvy|{yxy~|pjilqrrty{{}~~|~o\TRQQQQQRRPPQSTSQPPPPQQQRQQRQQQPPQRRRRRRRRRSRQQRPPQQQQQRSSQQQQRRQPPQQQSTSQQRSSRQQPPQQQQQQRRPPQRRSRQQQQQQQQRRRRRQQRSRRRQRSQQRRQPPPPQQSSRRQPPQQPQQQQQSSQRQPRSRRRRQQRQPQQPQRQPPSTSSPPPQPPTUOLJLLKJKKKMMLLLMOOMMLNMMMMNPNMLMLKKMMNPONPPNLOOMMOPNLLMMOOPNMMMMOONNMLLMMMMLMMNMLLNNNMMNPPNOONNOOMNOOOOOPPONNNONNMNNOOOOOOPPNNNPPONMMNMMNNMMLMOOOOOONNMMMMNOOOOONMMOOOONNNNNPPONNNOOOOOONNNNMMMMNOOOOOOOOOPPOMLMNOPPNNMNNNNOONOPONNNOOOPPOOOOPQQQRYbr~ }{zzz{}~~||}|ysng^YVWWdqy|{zz{|}~ |omqx||~zyttupnwngitywx|}zwustxxsrtx}{z{} ~uokkihjmmpxyxxuuvz|zwwx~qgfhllmquwxz|}||zj]WTRQQRSRQQQSTSQPQQPPPQQQRSPQQPPQQPRRQQRRRRQPPQRQQQRQQQRRPRQQSSSQPQSSTUTRQSTTRQPPPQSSSRQRQQPQRSSRPQRRRRRRQQRSSSRQRQQRQRRPPRSRQQPPQQRQTTQPQQQQQRQRSSSRRRRRRQQSQQPQSRPPPPQPPQSTRQPPPQQPRSNLJMKKLMLKLMLMLLNOOMLMKJLLMNNMLMLLLMMLNNNONMLNOOMMOPNNOMMNNMNMMLLLNNNMMNONNNLMOMLMMLLMNOOOOOPOOPONPPPPOOOOPPNMNMMMNNPOONOPPOONNOPPONOONNOONNMOONOOOOONMMMNNNNOMNNMMNNOOOONMMNOONLMNNOOOOMMMNMMMMNOOOOOOOOOONNNNNNOOPONMNONMMNOOONNMMOPOPOOPPPPPQSXft| }zyyzyzyxxxvupid__cdky}} |~ sqrvxz|~{vrswsmuieiswx|~~ywvvutstsqsv|}}{{¡ {wqighjlnuuttsrtz{vsuy~skffghkortvy{||||vnaUSQRSRRQPPQRRQPQRQPPPQRQPPQRQQQPPQPQQRRRRQQRQQRQPQRQQQQQRRRRSSRQQSSSSQQQQQRRPPQQQSSSQQQPSSQRSSQPRSRPPQRQRTTTRQPQQQRQRQPPQSSQQPQQRRRTRPPQPQQPPPPPPRQQSSQPPQRRRQQSSQPPPPPPOQTSSSRPOPPTTMKLNLLNNNMMMMNMLMNNMMMKKMNMLLNNMNNONOONMNPOOMMMMLLNNMNNNMMLLMNMLLMNONMMNNNONMLNNNNNLLMPONMNOOOOPONNOOPNONNORQOONMOPMNONOPPOOONNOPPNMOOOOPOOOOPQOOOONNNNNNOONONNNNNOOONNPPONOOPPOMMNNNNNMMMMNNNMMNOOOONNOONOOOONNNNNOOPONONMNNOOONNNNNPPOOOOPPPQRXeu |zzzzzzxxvrmfa^aky| }z| {wvuvyz~~{upqvupuphluy|}wtrrqnnqqrstw~£¥¥¥¥¤£¡xmhgimnorsrrppsuvsqrz~~wtjegkossttwyz{zz{yraWTSQPRRQRQQRRQRSRPPPQSRPPQRRSQPQPPQRRQRRRQSSQRQPQPQQPQQPRSSRSSRRSSSQPPPPQQQQRRRRSSRSRQQRRRQPQPPQRPPPPQQQSTSRQPQQRQQRQQRPQSQPQSRRRSTRQQQPQQPQQQPPQQQRRPPPQPRRSTSRSRQQQRQPPRSSRRQQQPRQLJKLLLMNONMLMNNNOONMNMLLMMMKLMMMMOONLNMLMNMMMMMLLLMLLLMNPOLMNNMLLMNOONMLLNPONNNNMNMMNNNLLLMOOOOONNNNNNMNMNOQQOONMMNMMOONOOOONNNOPPNMOOOPOOOOPPOPPPPONPPNNOOOONNMNOONNNLMNONNOPONMMNMNOONNNNNNNNNOOOOOOOOONOONMNNNOOPNNOOOONNOOPPONNNOOPPPPPPOPRXfu||}}zwxy{}~|{{wod_ap£¥¦¦§¨§¦¥£¢¡~}zz{}|zxvvvz}{uprx{xwwpqvxz}zqnnprruwwxuss~¦ª«ª¬®¬©¤ {njklptusrsrpnnqsrqot|}{|xtqswywutttuwvvxxulc\VQQRRTSQQRRPQSQPQQQRRRQQQRRQQQPPQRPPPPPQQSRSRRQPQQQPQQRSRQRTSSRQQSRQQQQQQQRRRRQRRSSQQRQQPPPPQRQPPPQRRQQRRQPQRQQQQQQPQQQRQPQSSRQSTRQQQQRSRQPPRQQQQRQPQPQRQQSSQQSSRRRRQQPPPPPQQQQQPPMLMMNNMLMONNNMMNNNNNONNMKKLKKLMMNOMLLMLKKKLMMMMMLLNNLLMNPOLMNNMLLMNOPONMOOOOOPOONMNOOMMMNONNOPOOOOOOONMNONMNNNNOPOOOOPPNOONOOOPOPONNOOOPOOOOPPOOPPPOPPONNNNNOONNNOONMNMNNONMOONMLMOONOOOOOONNMMNOOOOOOONOONMLMMMNNNNNNNNOOOOPPPPOONNOOPPPPPPQRYcr {wvvwwustvx|~~~{re`m¢§ª¬®¯°±°®«©§¡~zywwz||~}{ywvvxzzvsu{~| xwwvy~~wnmqttuwy}}yvs|¨®¯±±²´´±¯¬¦¡ {nnsvy{{wurnlloqpqt{~yz{}|{{}~{ywrppqqqswxxyr^USRRSSQRSQPPRQPQRRRSSSSTSQQQPPQRSPPPPQRRRSSRRRQQQPPPQQQQQRSRRRQQSRRRRQQRRRRRRRRRQQQRSRQPPPPQQQQRQQRQQRRPPQPPPPQQPQPPQQPPQQRRRQSSRSRQPRSTTRPRSRRRQPPQQPRPPQRRSSRRRQQQQQQPPQQPQQRPPONNMNMLLLONOOMMMNNMMMLMLLLLLLLMMNMLMMMLMMNMNNLLNLMNMMNNNNNLMNMMNMNOONMMNNOONOPPOOOPPPOOOPPPPPPPPPPPPNNOOONLLNNNOPPPPPPPPPPONOOPOOOOOOOOOOONNOOPNOPONOOOONNNLMNNNNNNMNONOOOOOOOOOMNPPOOOOOOOOONNMOPPOOMLMNONNNNNNNNNOONMMOPPPPPPPOOONOPPPPPPPSYev ~wrqrpqqqqrstx}}|{zrih|£ª°³´¶µ¶·¶µ³²°¬§¡}xustuwvwz|~{{}~{zzxxyz{zyx{ |wuw{~|vstuvrpos}~z~£«°³µµµ·µ´³±¬§¤vmpy|xsmioutvvy|}|~|uvwxz{{z}}zxqnmmlnrvz{{wcVQQSSRRRRRQQQQPQRPPRSTTTSRQPPQRSSQPPPQQSSQQQRSPPPPQQQQQQRRRPPQSRRQQQQQQRRRRRRSQRRQRSRQRQPPPQPQQRRTRPQRRQQQQPQQQQQRRSQPSTQPQRQRSSSRRRRSRRRRSRQRRQPPPQRQQPPRRSTSQQQRRQPQQPOPQPRRQPPPPONKKNMLMLNONNMNONMLLNMMNMNNONNNMMNNNNNONMOSOKLLMMNPPNLMMLMMMOOOOPPONNNNOONOPPPOOPPOOPPPONOPOPQPPPPOOPPOONOPPPPNOPOPPPPPPONOOOOONNPPPPPOOONNOONNNNNNOOOOOPNMNNNNOONNNNOOOPPNNONNNONNOOOONMOPOOOOOPOONMNOOOOOONNOONOOOOOOOPPONOOPONOPPPNOPRRYgs }~}~}wtvvutvyyyxyz|}yvqmjq§®³··¸º»º¹¸¸¸´°ª¥¡ysolkmnpprv{}zxvy}}{zz{{{{{|{x| }qqv}~~{qoos}£¬±´¶····¶µ´°«¦¥¤¢nlw|urr}{xzy{{{{ztstvwvvuuyzyunjikmruy{|wcUQRSSRQRRRPRQQQQQPQSTTRRRSRPQQRQSRQQQQRRRRRRSSPQRQQSSSSRSSRQPRSRRRRQPQQRSSQRRRQRRRSSSSTTRPPQQRPQQSRPPQRQPQRRSRPQRRSSRRUURQPQRSSTSRRSRSSRRSSQPPPPQQQQRSRQPPQSTRRQQRRQQPOPOPQQQQPQPNONMMMMMLLLMOONMNONMLMMMNOMNOOMNONMNOOOPPNNQURLLNMLNPPONMNMMMMNMNNPPOOOPPOOONPPQPOPPNOPQPNMNNNOOOOPOOPPPPPPQQPPPNNOOOPPOPOONOOOPOONNOPPPPPPONNNNONNMNNOOPOONOOMOPPOOONMNNNOOONNMMMNMMMNOPNNOPOOONNOOPNMNPPPPOOPOOONOOOOPONOPOOPONOOOOOOOOQV\hx~ }{{z{ yqjin~¤ª±µ·¸º»¼»º¹¸·´°©¤~xrhca`cdgjpv{}ztruz}~}{zzz|}|z||zw{ }rsw| zwy|~ £¬²µµ¶¸¸¸·¶µ²¯¬¬ª¨§sjw |uw{}{yyyy{{~zxtrt{|xqonsxzxpjijnrsvyxtbVTSTSQQRRRQRRRQPPPQSSSQRSRRRQQQQSSRRRSSQRSQQSTRSSRQRRRRQRRRRSTUSRSRQPPQSSRPPRQPQTTSRSTUTRQPPQPPRQPRQQPQQPQQRTRQRSRQRSSQQRQQPPPQTUSSRQQRSTTQPPOPQPQQQQRQQQQPQRRQQRSQQQPOPOOQRQRRRPMNNNNNKKMNMMMONNOMMMLMNNOMLOQPNNONMNNNOPQPPRQONNNONMPPPPPPOONLMPPOPPPPPPPOOONPPQPPPPOPPPPPQOMNONNNOOOPPPPPQQPPPQOOOOOPPPPOOOOOOOOPONNOPOPPOOOOOPPOONNNNNOOOOPOMOPOOOONMMMMNPOONMMNMMNMMMLNPOPPOOMMMNPNMNOOOOPPPPOOOOONNOONOOOPPPPPPPNNOOQX]k} }|zphjt¢§³¶¹º»»»»º¹¸·³±©¤{umhdacb`bhmtxy{|wttvz{{zzzz{}yvz{zy{ zyz{}~~~~ £¬±µ········´±±°°¯ª¡~mt|vrsuuxxy{}zxvxz}tllnsyxrmkjnqqrtrn`VUTTRQRRRRQQRQQPPPQRRSRRRQRSQQRRSRRQQRRRSSRRSTSTTSQRRQQQQRRRSSSSSRQSRPQRRQQQQRRSSTRQRSUURRQPQQRRRPQRQPPQRQQRTTRRRRRRSSSRQPPQPPQUURQRRRRRRSROOPQRQQQQPPPQSRPOPRQQRRPPQPPPPPPQPQRRPNNNMMMLLMNLKLONOPMLLLMMNNMMNPQPONMMMNOPPPQPPPONOOONOOOOQPONNNNOPPPPPPPOOOOPPPQPQPPPPPPOOOOQPOOPPNNOOOOPOOOPOOPPOPPOOPPPOONOPPOOOPPPPPPPPNNOPPPPOOOOONNOOOONOOOONNMNPOONNOOOOOONMNONMMMMNNNOPQPPONMMMONMNOOOONNPPONOOONNOOOPPONNOPPPONNOPVcp} }|}}~~{yxz ~yqjl{¥«±¶·¹º»»¼»»º¸·´±¯©£|tnlnnomjjkptvtuy~zutvy{{zxvvxzvtwz{|}}~~~~~}|| {|~~}~£«°´·········²²³³±®§xpz{sppqtwy|{{|{|zpknsvwtqomnppppok_WTSSQQRRRRQPPPPPPPPQQRRSSRQRRQRRQQRRQQRRRRSSSTSRSRQRSSRSQRRRRRQSTRPRRRQQRRSTRQSSQPPPPQSTQPRQPRQQRQPQQQPPQQRRSRPQQRSRRRSSRQPQRQQRQPPPQRSRRSSPOOPQRRQPPPQRSPPPRRRQQQQQQPPQQPPPPQPPPNNNNLLMMNNMLNOOONMLLMMMNPOOOOPPPONMNOPQPPOONQPNPQPPPQQPQQONNNNPQQPPOPPPOPPPQQQPPOPPRQQPPQQOPQPPONPQPOPPOONOPPPNOPPPPPQPPOPPPPPOPPPPPPPPOOPPOPPPOONOPPOOPPONNOPPONNNOPONOPPOOOONNONNMNNOOPOOOPPPONMMNOOMOPNOOMLNOOOOOOOOOOPOONMNNONOPPOQS]s {zyzywwy|{wutv~ ~|xvusolo¢ª¯´·¸ºº»»»»»¹¸·´°§¢}xwx|~|}}}~|zwtprx|zwtuwyzwussuvutvz|~~|zz}}||}~~|} |xz{||}~~zzz|¤©²¸¹¸¸·····µ´µµ²±ª¡rsy{}}vsrrux~zz|~z~yspqsuvvvtsrppomicYUTSRRRRRRQQQPQQRRQQRRQRSQPQRQRSQPQQRRRRRQRSSTSSSSRRRRQRQRRTSRQRTSQSSRRRRSTTSRRSRPPQQQRSSRQQQRRRRQQPQQQQRRSTRQQPRSSSRQRSSRQPPQRQPPQQQSRRRRRQPPPQRQPPQRSSSPPPQRRRQRSTQQQQPPQPQRQPQLLNOLKLMMNOMOPNNMNNLLLMMOOPPOPPONMMNOOPPOONMOOOPNORPPRRQRSRPOPPPQQRPQSRPPPQRRQRQPQRSSTTSSSRRRQPPPQRQOPPPRSQQQRQQRQQQQQQQRRQPPQPPPPPPPQQPPPQPPOPPOPPPPPOPPPOOOONOONOOPPOOOOOOPOMNOONNMMOOOOONPPPONMMNOOMNONOONMMNNNNNNNOOOOMLNNNNNNOPPRU_n~|z{}}|yxyzyvuwz }yuqmjhilt¥¬±µ·¸º»»»»º¹¸·µ²¨¤}~ {vpoqtuttuututqonptuuw{|||zurv{||||}~~||yx{}}zyy{zutssv}¦«¯·º¹¸¸¸·¶··¶µ´²±¬¤urstx|{yxxz{y||z~znlpsvyzwvutsqoke]YXWTRRSSQQQRRRRRSSRRRRRRRRRQQQSRPPRSSRRRRRRRRRRRSRRRRQRQQPRRQQRRSSRRRRRRSSSRRRSSPPQQQRSSRRRRRQQQQPPPQRTQQRTRRRPQSUSRQSSQPQQPPQQQQTSQRRRQQRRSQORQQPPQRSSQPPQQQQRRTUURQRRQQPPRRQPQPNMKKKMMLNONNNONMMMMMMNMNPPPOOPPNMNOPPOPOOOQQQPPQSWUSQRSUWWUTUXVSSVXXXUQRWXUSUVVVTRSVXWUVWVUUSRSPQRTSRUVYYUWZXUUTSTVTTTVVUSSSTTSRSSQRPRSSRSRQQQQOPPPPPPOPPPPPOOPPPOOPPPNOOPPONNOONMNNMNNNNNNOPOONMMLMNNONMOONNNMMMMNOOOOOONNNMMONNMORR[p}~}~~~zwx{| }yvsnhdccm}§²¶·¹»»¼¼ºº¹·¶³§¤ {xpllnqstqopqolmnotwxzyyyvpjjuzywwwy}~}}zw{~{zz{{wutuy~¥§«³¸¹¹¹¸·¸···µ´²°¬¤zrrt{}~|}z| |rpqrtxz{xvuutuqi]Z\^ZUTSRSRRRSSRRSRRQQSRSSRQRRQQRRRSTRRRSSRRRQPPPQRRSRRRQPQRRRRQQRRQRRPPRRQQQRSUTRQQPPQRRQQQRTTSSRQQRRRQQPQTSSQPQSTSSRSSQPQQQQQPQQQQPRSQQPQRTQPQPPPPQQPPPPQQQRSSSTRRRQQRRRQPQRQPQMMLLKKMNNNNNNONNNOOMOPPOPQQPPOOPONNOPQQSUSRVY\YWWX]_`]^`bcbbbdfhfddcdghikkifddc`[Z[afhifeeeca`bdcaacb`_afnnljiecbbba_^\]^\XXXYZZ\ZYZZYVWWUWVUUUSQTUSRRQOPQQQPPPPPPPPPPPONOPPOMNPONMNNNOONMMMNOOOONLLMNNNNMOONNONNNNPPPOONMNOONMMNMMPQYp~ }{{z}|z|yusrrrlgeciu§³··¸ºº»»º¹¸¶´°ª¢ ~|tmikoqqlhgjkkkkkrwvvutsqmggpvvrrsuz{z{|{zzyz| {yzzx¡©±µ···¶·¸··¶µ³²¯ª¤xvw}}zz~~}|ywttwz{zuropsrj^XX]^ZVTRRQRRRSQRSRQQQSQRRQQSSQQRSTSRSSRSSSSSRPRQQRRRQRRQRSSSSRQRQPQRQPPQQPPQQSVUSRRQQQQQPPQSTTSSSRQRPPQRSTTRRRQRSQRSRPSSRRQPQQPQQPPPQSRQPPQRQPPPQRSSQPPQPQQQSSRRQQQRRQPQQRRSRQPQLLLNONNNMLOOOOMOPPPPQQPPOPPPOOPPRSRTVWZZ\_bdgjmpsssuwvxxyz|~~ }yz~ ~~z|~|zyxxzzyvvxywxvvwvrmqmjkifdedbcb\YXWTSSQRRQQSSRQPOONNNOPPONNOONOOOONNNMMNNNOOOOOMNNNNONNONNNNNOOPOOONNOPPOONNMMORUi ~ }~~zyvvspoqsuqkgjx¤«±´µµ¶¶·¸¸··³°§}zuokjooidbbcgihhjouutrqpnjedkrspnpuvruvwuvwy}~ytw|£«¬««ª®´···¶´³±©£|vwz~ }}{{yx{~~~}zxyz|{{ywqjiorj\UUZ]^[YUSQRQSSQRRRRRQRSRRRRSSRRRSTSRSTSRRRRRSQRSRSSQPRQRSSRSSRQSRPPPPPQRSQPQQRUTRQQQRQPQQPQSSSSSRRQQQQPPRRQQRQRQPPPQRQQQQRRQPQQQQQQQRRQQQPPPPPPRRRSRPQQRQQQRTSQQQQQRSRQPQQSSRQPPLLLNPPOOMLOOOPPPOPPPPPOONOQPQSTUUYY^degknqt{ |zyplnmhcb_\WTUVWTQPNNNMOPPPPOOONNOOOMMMNLMONNOOONONNNNONMMNMMNNNNOOONNOOPOOPONMMNPT]t |~}z| {xxxyz||{ysno|£§ª«¯²µµ´³³±ª¦ |tonklnmihgffghhhjmrsqooolhdaflnqnotqoruuuvz~ ytuwy£«±µµµ³²±¯«¨¡}vw{}zvwz{|~}~zy|}}zvuv{}|{ywtogfmqm_VTX\\[\\XTQRSTSRQQRRRQRRSSTSRSSQSTSQQRSRQQQQRRRQQSTRRRQRSSRRSSRRRSSRRQQRSSQQQQTSQPPRRRPQQPPRQRRRRSRQQQPPQPQRQQRQPPPPPQRQPPPOPPPOPQRSSRPPPQQPPPQRRQQPPQQRRRRSSQPPQQRRQQQQQPQPQRPONNMNOOPPONOOPPPONQSQQQQRSSWXX[]`innrz ¡¤¤¢¢¤¤¡ ¢£¢¢¢¤¤££¡ ¡¢£¤¥¦¦¥¤¤£¡¡¢¢¡¢¢¡¢¡ vkeba\VSRQQOPPPPPPPPNNNNPONNNMNONNOOPOMMNNOONNNNMMNNNNONNMMNOPONNNOOONPSd|~~ }|wtz £¨°±°®ª¥ ~|||~~|zvpmlijknqrqqnnmlmqssonnnjgdbdfjrpoqmnsy~{ ~£¬±³±±±°¯¬©¤{{~ xutuxxwy{}|~~xwwvvojqw{{xvsrqmeflpkaYTSX[Z[[ZWTTSSSRPPQRQQRSTTUSRRQQSTTTRRQQPPQRRSRRQSTSTTSRRRSSRTTSSRSRQPPPQSQPRRRRPOPQQQQRQQQSSQQRRSRQRRPPPQRRSRRRQRRQPQSRQQPQRPPQRRRRSRPQQRRQPPPPQRRPPQQQRRRSQPPPQRRRPPPPQQPPRSRRPOMOPPPQPPPPPPQQQRUVTUUWWYbijnqs| ¡¡¢¢£¡£¥¤£¤¤¤¤¤££¤¤¤¥¥¥¥¦§¨§¨¨©§¦§¨©©ªª©¨©ªª©©©©©©¨ª«««ªª©¨§¨ªª©¨¨§§¦¤¤¦¥¢¡¢¢ |qh^XUSRSPOPPPPPNLMNOPONMNOONNOOPPNONOOONNNNNMNNNOONNNMMOPOOOONOOOQUg~ ~§©©¦¤~|{yvuw||||zywqnlkklswzzxssttwwvsnmnlgd`^afippomlqy £ª¯±²°¯°ª©§¢ ~ussvzwvz|~{~zsoomlkgeqzyxsomnojacjljaVOOUYYWVYYVTRPRRQQQQRSRSTSUUSRQSSTTSSSSSRQRSSRQRRRTUUTTTRRRQSTSTSTSQPRQPQRPPSTTRQQRRQQQRQSTTSRRSQRQRSSQPQQQRRQRRRQRSRPQQQPQRQQQRQQQQQPQSRQQQPOOPSUTQPQPQQQQQPOOQRRRRRQQPQRRRQPPSPNMOPPPPOOPPPPQSTUXZ\_abgip~ ¢¢£¦¨¨§¦§ª«©©©ª¨§©ªªª«©§¨©©ª«««¬«¬¬«®¬®°°±±¯°±°¯®°°¯¯¯°°¯¬¬¬««ªªª©¨©§§¥¦¤¡{oi`Z[XSPOPPPQONMNNOONNOONMNNNPPOOOOPONNNNNNNNNNNNONMLNONONMMNOPS\k~ ~z{ |zxurqrwz|}}{wsqrvwwz|zxvttx{}|zwpmkhc`_`cgkmnljnt| {z} ¢§¬®°®«©§¦¥¢ vssvywvy{~{tpg``bc`dqwxvrlefjd_`fgg_QJHLQSUVVWWTRQSRRRRRSTUUVWVVUSTTTTTTTUUUUTUUTUUUTSTUUTTVVTTUTSTSTTSRRSSQQQRRSTSQRSTTTSRSTTSSSSTTRQPPRRQSSQRSRQQQQPRTRQQSSQQRRRRRQRSRQPQSSQQQPPOQTTRQQQPQQQPPPPPSTSTSSTSRSRQRRPPQOOOPPOOPPPPPQRTX[]``fqwy ¢£¤£¥§¥¦ª«ª©©«¬«¬¬¬««¬¬¬¬¬«««¬®®®®¯¯®°°°¯¯¯±³´³±³µ³³´³³²²²³²°±±¯°°°¯¬¬®¬«¬««©ª§¦¥£ woig_URQPPPPPONMMOOONNMMNNNOPPONNOONNNONNOPOOOPONMNOOONMMMNPRXex }xutw| ~{yvrpquzztrv}{wtsrsy{zxwvpidbb``fjjiiihkqv| |vuwz £§¨¨¥¢ wstvuqpqtz~vo`YWZ]^cpwxwrk_[ab]\cgf]NGGJNRSTUWVSTUSSSTVWXXZ[\^_][ZYYWWWZ[ZZ[ZYYXZ[[ZXWVVYZZYYXWXWUUTUUUUTUUTRSSSTSRQSSSSTSRRRQQQQRSSQPPQRQQRSRRSSSRPQSRRQRRRTTRQQRRSRRRSRQRSSSSQQPPQRRQQSTRQQPPOPRRQQRRRQRSTSQPPRPPPOOOPPPPPRSRQTWY^bhjp{¡¤¥¤¡ ¡¤¤¡¡¡ ¢¥¤¢¥¨ª©¨©§¦©¬««««®¯®¯¯®®«¬®®®®¬««¯°¯¯¯°°±²²³²²±²±²´¶µ³´¶¶¶µ¶µ´³³´²²µµ²²²±±¯®°±±®®¯®®®«©§¥£ }{wk`\URQPPPONNNOONOOONNNNPONNMNONMMOOOOPOOOOPONNNNOPPPMMOQW`r zusuy}{{| |zz|~}{xvtuz ~xuv}|xusrvzyvrppjc_`bcflnlhfgjqwz}|wwyyz }zwuqlkkov~~udWSW[[`muwvsn_X[]ZW`ed[KDBFNPQPSVWWXXWY]_`^[[]`aabb``_`^]^]^]]^^_`aaa`_]\\\^_`^__^]\[[[[ZZZZYYXWWVXWSRTTSRSSRSSRQSRRRSSQQRSSRRRSRQRSTRPRSRRQRRQRSRRRQQQRRRSRRSSSSRRRPPQQQQRRRRRQPPPQRRPQRQRQQSTRRPPPPRROOORQPPQRTUVZ^aht¡¢¡¢££¤¥¥£¡ £¤¤£¤¥¥££¥¥£¤££¦©¨§¨«¬ªªª§§©«ª««¯®®®®®¯®¯®¯°®¯°¯®±±±±±±²²³´µ´³³´´´µ¶µ´´¶¶··¶µ´²²³±²³µ´³³²±°®®±²±°°±±±±±±¯¯«©¨¦¤¡{vl`VQPPPOONMNNNOPONNMMONNNNNONMNNOOOPPNNNNOOONNNPPPOOPS[o~ytqqw{} ~}|{yvvx|}}~~~~}~|xvx~}zxx}{yxvwxxvtolkfa`behlnnlighpx~~}}ww{{yz} |skihkr{|xfSRWXY^gosuuq`UVUVUV\\ULCADHKNQTX[^`_^`aaa\ZY[_``aba`_`_^\[[\[[\^_babaa_^_````bbbb`__^^]\[XWWYZ[\]\[ZXYVTRRRQSTSSTTSSSRRSSQPOQRSQPQSSRQRPPQRRQRSRPQRQPQRSSRQQSTTTRRPPPQQPQSPPQQPPPRRPPQQRQQRSTSQRQRPPQPMMOTSQQSTUW[biow¡¢¢¤¥¤¤¤¤¤¦¥¤£¥¦¥¦§¦¨¨¥¦§§§¨¨©©ªªªª««ªªªª©©ª«ª«¬®®¯¯®¯¯®®®°°°°±±±±±±±²²²²²´µµ´´µ¶¶¶µµ´µ¶´µ¸·¶µ³´³²±±³²±±²±°¯¯°³±±±±²²±²³²±°®®¬«§¢ubTQQOONNMMOOOPPONNMNNOONNNNNONOOOOOONMLMNNNONOPPONPT`z |wrnmnswy~{vsqrssux{ |xxx{|}wtrtvvwxyyy{|zzzz|{xtpmnnjddfikkmqsqpox~}|{yz~~||~~~~~ ~~wlijnuxxwtngZPRVXY\`diptsn[TTUQOQSPKDACCITX[^^_b`^^_^\ZVTUXY[^^^\[]]\[YXZY[]\\\^_^^^`baaa`bbba_^^\YWTSNMRVXXX[\\\\\WTUUTSSSSSTSSRSRSSRQQQRSRQRTSRQTTSQRRPPRTRQQRQRRSSRQQQQQQRSSRRRQQRRSTTRPPPPRRQPQRRQQRSSRRRPQRSSQPOQSTUWX[^`kt}¡¡£¤£¤¥¥¤¥¦¦¦¦¥¤¥§¨ª¨©©¨¨¨§§¨¨¨©©ªªªª©ª©ªª«ªªª««¬¬««¬¬°°®¯¯¯®®°±°°°±±±²±±±²³³²³´³´µµ´¶¶¶¶µµ´³´µ·¶´´´´³±±±±±±²±°°¯®¯±±±±±²²±²³´±±±¯ª¨¥¡r]TSRPOOOOOPPOPOOOOOOPPONNNOONNOONNNNMLMNMMONNOOONOSa{~ ~zuqonnpsu}{ww{ ~yvtpkhgkpuwz}|z|~|zwx{|~||~xtpkighmrvvxy{{yyz|~{rnovvoiiijknu|}{wx|}z}|zz{~|z{zz{~ thinsttspmdYSUWWTTUX[bmqqg^XVQPSSNFCBEO[\_`a```^\[\[XTQOOPSUZ\[ZY[\\[\[ZY[\]]\]^__abbaaa``b`_^]ZVSPLJIINRTUVY[YVUSPNRSQQRRSUVUSRRQQRQPRTTSQSTTTRRSTRQSSPPRQPQTSSTTSRRSRQPQPQTTSRRRRTTTTSQQRQPQRRRRRSRRSRRPQSRRRRTPPQSSVVX\clw¡£¢£¥¥¥¥¥¥§§¨¨¨¦§¨ª«©ªª©ªª©©©©©ªª«««««ªªªª«««ª««¬¬««¬¯°®®¯¯®°±±°°±±±±±±²²²²´µ¶´µ¶¶µ¶¶¶µ´´´³µ··¶µµ´²³±°°°±±²²°¯®®¯±±±±±±±±²²³´³±¯®®®¬«ª¦pdZSPPPPPOOOOOOOOOOOPPOOONOOOPOOOOOPNNOONNONNPPPOPS\q |xuuwwwyz~yuvx{~upmkgeeeglrtvy} }~}}}||{|{xx|}{|}snkgeffgjntuuvwyy{}|rnqyxphhfgnw~}xx~}|||zyzz{}~}{yyyyy| z| vlmossqomkcWU[[XRPPSRU\cjlg_[VRRQPJNT[__^^\]^__]\[ZVUSPPQQSUXZZZYZ]^``^\[\_aa`^bdcbaa_]]]]]ZYYXWSOMJIKMLNQRTVUSPLJIHIJJLNOQTUUSSSSSSRQRTUSQSTTTTSSTRQSRPQRRQRSSTSRQQRSSRRSQQSRRQQRSTSRRRSSTTRSSRRRSSRRRQRQRTTRPRUOOPRU\`dhn¡¢¤¤¤¥¥¥¦¥¥¦¨ªª©§§©ª«ª«ªªª««ªª©©ªª««««««««««««««««¬¬«¬®¯¯°°°¯°°±°°±±°±±±²²²³´´µµµµµµ¶¶¶µ´´´´¶··¶¶¶µ²³²±°±±±±²°°°±±±²²±±°±°²²³´±±°±±®®¨£~ug]TSRQPPPPPPOOMNNNNONOOPOPOOOONOOPONOONPPOOOOPPQTYjz ||zww|~xplgebabegjnprt| |vtrrtz~~xnidabdefjottttvy{}}vstwwphghn|}|{wy{z||xuvtuwxxvuvxz{ ~}yvy~~wmou} |vqqqplf`ZTQS[^XPOOONPSV^dge`YSTUXYZ^bba_]\\\]^\[ZYVWWUUURSSTWZ[[\__^^^^^_abbbabcb```^[XXWSRQSSRPOMKJLOMMPSRQQQQKJHEFEDFIJMOQTVVUUVTSSTSQQRSTSSTTTTSRTSPQRRRQPQSQPPQRRSSRRQQTSRSSSSTTUTVWVVVUVURQRRRQSSRRQQRTUSSSSTSUZahv ¡¢££¤¤¥¥¥¦§¥¥¥©««ª©©ªª«««©©ªª«ª©ªªª««««ªª««««¬«ª«ªª«¬¬«««¯¯¯°°°±±±°°°°±±±±±²±³²³´²³´´´µ´´´´³´µ¶·¸·¶·¶´´³³±±±²³³±²²²±±±±±°°°°±±±±°°±±±¯®¯®ª§¡sib[USPPPPPOOONONOONOONPPOOPONOOPONNPPOPPPOPPPQT[lw| |} ~~ |yy{{tniecccfklnoops} {vsrsw|vrkfbcdefinrsstvy{~|ywwvoilr{ ~{{|z|{zwsrooprsuttvyz{~ }rrx~zoklloqqlaadimw~zuspkhd]SMLOUYTNNPPOPPRUYadea^aaab_`bca_^]]]]]ZYWVUYZ[ZYVUTUWZ\\^a`^^__`a``acb`___`aa^ZXTONQQPLKJIIIIKJJKLLLKMNLKJGGEDFFGHILPXZXVWUUTTSPPQRSTSSSTTUTTSRRTSRPOPQQPQRRQRSSRSTVWVVVWXVWZ[]`a_ZXWWUTTSSRSSQRSTTVUSRSVXYX^lx ¡££¢£¥¦§¥¤¥¤§¦¥¥¨ªª«ª«««««ª©ªª«ª©¨ª««««««©ª««««««©¨©©©««¬¬¬®®¯®®±±°°°°°±±°±±±²³³³´´´´µµ´²³´³³µ¶µ·¸··¸·¶¶´²±±±²³´³³³²±±±±°¯¯°°°°°°¯°±±°¯¯®«¨¤ yqdXRRQPOOOOOOOONNNNNOOONOPOOOPONOOONOPONOOPPR[muy{|{||{zzz~{y ~}}~}}|~ ~{zzz~|vwxunhedeikossrqrru~ ~~|wux|}{yvspkfefgfhjmmnruwy{||~~zyvposz ysvyz{|}vrpollnqtuttwyyy|~~{ywttuuqs~ndehhhhgd`^]^aglsusqmeaa^WOKLNPMKMPQQQQRRSYafeddcbaaba\ZZWQQY\YVURPQTUWVWVWYZ[\\\`bba_````aaaa`^___acca[TOMMPPMGEEEEFEEGGFDDFHHIJKKJJJIIGFEHJLPSSUUUVUSUSQQTUTUTSSRSSRRRSTSRPQQQQQRQQQRSSTUVXZZ\\\___ddeigdbb^ZYWWUTTTRRSTUTSRPQRT`bhq £¤£¤¤¤¦¨¨¥¤¥¦¦§¦¦§©¨§§ª«ªªª©ªª««ª©©©««ª«««©©ª«««««¨¨¨©©ª¬¬¬®¬¬®¯¯¯¯¯¯¯°±¯°±³´µ¶µ´´´µµ´²³µ³³´µ¶¶···¸¸···µ²±±²³³´³´´²±³²±±°°°¯®®®¯¯°±±°¯¯®¬«§¢zgXTRRPONNOPPONNNNONMMNNNONOONNNOONNOOONNOPPVdrwywvuttwz| ~uooy}}ywwwxyxy{|zyzz{{{xwngikieegilnruurrtvz~{zyx{{z||ttttsttrolkhgghgfinsttuy{{}}{xy| vpsy|zz|}}}~~ytsvtlmqvyxww{|vtwxyz|}~|zuqrtvx}qfgijjjda]ZYX[\[chhhgb]\\\VPOONLLLKLKKKKKSZ`baa``a__^ZVRQLJNUUTROLGFGHLNNRWY[]_^]^`a`^^^`accba__``^[[[ZWRPOLIFEDDEEDB@?AA@>BDEEEEFGFFHIJIGGIJLLKLMNPTTSUUUVWUSUTTTSRSRRSTTSSQTUTRRSRQRSSSUVVVWV[^cjlfhlmmnmlifcbba_YWVTRSRSRQQRSRRsy ¡¤¥¥¥¥¥¤¦¨§¦¥¥¦¨¨¨¨§¨¦¥§¨¨©©¨©©¨ª««««©ª«««¬«©©ª««««ª¨©¨©ª««¬¬¬«¬¬¬¬¬«¬¬¯±°±±²´´µµµ´´´³²²²³³´µµµµµµ··¶µ·¶µ³³²²³³´´³´µ³´²±²±±°®®®®°±°°®¬¬ª¦¡ ££ mZUSPONNPPPOONOPOPNMMNNNOPONNNOOOOOOPONOPPT`mrustttvz} ~xrkhhmqqoprqppsv||vvwy{{zwvrlc^`bccgmnnorssppqwz|}~~}|{yxyy|}|zwwyz|tlijknrtx{znifffefinqqppwzzz|~}~~ xpqyztrtssux{ystx|{suy|}{yy{xssstuwz|~}z{{~unjkmoh^YVYZZZZ[^abefa^\\\XSPONMHDDDDHOWZ]]_`_]^^\\\[WRPPOUVTRPLJEAACGJJLSVWY\]^]]]]]\^_accbba`]XTSSTTSRPMIDCCCDEDC@<:::;<?@@@?>????ACFFEFFFJLIIJKMMPSRQSTUTUTTUUUTUTRTTSRSTTTSRSTTSRRSSVWVRQQV[cimnnoqsssqqqpnmmj`[XTTSRQQPQQRQP¡¢¢¤¥¤¥¥¥¥¥§¦¥¥¤¥¨¨©ª©©§¦§¦§«©©©¨¨©«««ªª«««¬«««ªª««««ªªª©ª«¬¬««¬¬¬¬«««¬¬¬¬®¯°±±±²²³²´´´³³´²°±³´µ¶µ´³³¶µµµ¶¶µ´´³³³²´´´µµ´²±²±±°¯®¬®®¯¯°¯®®®¬¬«¦¢¥¥¥£h]SQPPOPOOONOPPQQPNNOOMNNMMNNOONOOPPPPPPPSYfnrssstx| ytnhffkmmmmonnnryvrrw{||{wsnd\Z\_bdhlmlmooonnpsvvuuvxz}~|zwtrppopqrqkd`agkov~mgccdhilonnnnv{{zzyxxz} ~|ztovwolkijnrvvtwz|{z}}{xx{spooqqsx} vicdro]VW[_bc^[]`adhgd`__]WRPPNFCA@JTZ^`_^^^^\[WVXY\[XXXW[^ZX[VROIDDFGHJQWXY\^_^\\]^^__`baa`_^ZVSRQQNJHHGEDDDDDDB@@?>>=<;:<<<=>@ABDCCDEFFEEGFDFHHHHKOMKKNOPSSTUUUVVVUTSSRRQQQRRSTTTSTUVVVSPNPS_klorrqruuttssttssrkfa[ZWSTSQRQPPP ¡¡£¤£¥¥¤¥¥¥¥¥¥¦¦¥¥¥§©©«¬«©¨§¨ª«©©©©ªª««ª©««ª«ª«¬«ª©©ªªªª«ªªªª«¬®¬««¬««««¬¬¬®®¯±±²±±±±²²³´´´´²°±³³´µ´´´³³³³µ¶·¶´´³³³³³³³²²²³²²±±°¯®¬¬¬¯¯®¯¯¯®¬««¨¢£¦§§¦¤¢wgYURPQOOOOOOOPPPOOPNNNNNNNNNNNNNOPPPPPPPRU^gpsrrsuy}xrlhijnrtrnlmnpt~zqnqx{{yyuof^XX\aeghhikkllllmmnqpkjnsw|{upkihffc__`_^bhnzre`adhjllllmpv{{zxuttvz~~{yyxwyuosskgdcfknrtuwxyy|wx}zsnmmmnoru~}x ~l]atr^XX^eklidcccehkjgdb`[TPOKD@BN\]]]]]^\\][UQPS^imrxzyuqlkld\]`RIKLMRVZY]^]^````_^^]__]]\]^ZWSMKIFD@?@ABCCA@?=>?BB?=====;<?DHJKMLHFHHHGEDBBDEEEEFGGHJLMNNOPQPQUVVVVTTSRQQQSSRSTTTTSTTQOLNU_lporsssrstqppppstttsrnf`YTUTRQQQPP ¡¢¤¥¤££¤¥¥¥¥¥¦¥¦¦¥¥§©«¬«ªªª©ªªªª©©ª«««ª©ª©©«ªª«««©¨¨©©ªªª«ªª««®®«««««««¬¬®®¯°±±°¯¯°°²³´³´´´³±±±²³³³³³²±³³´µ¶µµµ³³³³³²±°±±²²²²°°®¬««¬¯®®®®¯¯¬¬¦¡¡¦¦¥¦¥¤ zgZQPPPPPPPPOOOPPOONNNNNOOOONNPOOOOPPPPPRV]fossqqpqrv||zuqnlmqux{yurrstywnkntwxtrnia\YX[_ceffgjkkkkklkkmkggjpu{|skgca_\[\^``bdhs}kecdgijiklnquwvxxsrstwz}~~|vsqqvunpofabfkpruttwxyz~ yz|xsokkjjjnou} sq}v^^{w`[[aipstpligghijihgd`ZURNIHU]_`^[[[\][VTZiq|¢¦¤¡xuqg`ac`^__]`a[Z]ba`]]][[[YZ\[XURNJIHFCA>>>AA>;<>@AB@><<>?ADGJKLNOPRQNLMLJHCCECCDDDCDDFIMMMKKLMNMOQQSVXVUUUTTRSSQRSUVUSUTPPOT]eknoprsqnnonmkjmrssrstqnj]VTTUSRRRR ¡¢¢££¥¥¤¢¤¥¥¥¥¥¦¦¨§¥¤¦©ªª¬ªªª««««©¨§ª««ª©©©ªª«ª©ªª©©©©©ª©ª««««¬¬¬¬®¬««¬«¬¬®®®¯°°¯®¯¯¯²²³´µµ´²±±±²³³³²²±±±±´µµ´´´³³²²²±±±±±±±±±±±¯®¬¬¬¬®®®¬¯¯®®©¥¥¥¦¨§¦¥¢~m^SOOOOPPPOONOPPNMMOOMMOONNOOOOOOPPPPPQU\elprqonnnoqsttssrrx~~~|zyxxy~zrlkmpssnkgeb_][[\]aefghklmllllkkhhjkov{|unhb^[YZ[]aaaadl{pmjgfghjlmnprrnqtqnptuwyyzzyspopushff^\bipwz{yxwz||{ytrolkihhkmpssu{ zklloutt{~|}}ol|da`dksy}zsmihgfhikkif_ZYVUU[]_^]ZXYYX^ct¢¤¨¨ªª°¬°®«©¦¦ {pieb^[[\[YZ][ZZZYVUUQRSRPRSQNJJJIGECAD@==@BDC@?=;<>@DGKORQQPPQQPPPPMLGEEDCDCCCDDHKLOMJJJLMMMMOQWWVYYYXWRSSTTUUVUSTPNORYbglmmnonmkjihhhhlnnomnrrrpg^XUTRQQRR¡¡£¥¤¤¤¥¦¤¢££¥¥¥¦§©¨§¦¤¥¦©«®«©ªª«««ª©©ª«ª¨©©ª«««ª©©©©©ª©¨¨©©©««¬¬¬¬«¬¬¬¬®¬®®®¯¯®¯¯°°°±±²³³´´³³±±²³³³³³²±±±±²´´³³³²²²²±±±²±±±±±±±±°¯¯¯®®®¬®®®¬¬®®¬«§¢¡¦¦¨ª«¨¥¢ lXTPPOPPPNMMNPPPONPOMMOPONOPOOOOOPPPPRU\fmosronnnmoruvxyww~~}wqomnpqpmigefdb`]\]_ceeinnooonmmmjilnpswz~~{xslf_\\Z[]^abbachtrpqmifhjklmnnljknmlmpsttuuttpoprur`XXTU\fpwz}}zyyy||z{|~~wsronmmlhghlpqjcjuzxjjjntuv{{nkjjls|yrnifegjkmmjgb_]^\\\[ZYYUT_s£¦¨ªª©¬¯°°±¯°±°°±²°¯¯©¡ uj^TVXVWZYWVVUSQQPQRRSVUSMJLKIHHFEGFFFHFCA@@?>?@@BEJOPQQNLNPOPPONNOKHFDBACCDFIIHHIJJJKKKLKLMPRQRVZZXUTVVWVTRTSQMLPU[bgjkkjjhggfebbceeeefilpqrrph`\WSRQRT¢¢£¤¥§¨¦¦¦¦¥£££¤¥¥§©©¨§¦¥¦¦©«®¬ªªª««««ªª©©©¨¨©©«««ª©©©©©ªª©¨¨ªª««¬««¬¬«¬¬¬®¯®®®®®¯¯¯¯°°°±±±²³³³´³³²²³²²³³³²²±±±±³³³³²²²²²±±±±±±±±±±°°±°¯¯¯¯¯®®®¬©¥£¥¤¦©ª¨¦¥¤£{^WSONOPNMMNNOPPOOONNOPPPOOOOPOPQQRSVWZ`iqssrpnnnnpux{}}}~~~ytsrrssqnlkjigdb___`ceglprsusponomklqsrrsutrnjda\[\^^_^`accdfo|~roonlhhkkkkjiihghiijmopqrqponnqvzrWMNQSV\djsvwusqrsqqqtyzqmjjlmnolgfglohacjnsrmnquxwvz ~vronnr{}xqkgfgjloomie`^_^][YYXTbr¦ª©§©¬®°³´´´³³³´µ³³²°°±±¯¯¬¨¢ maWQW[\ZVTSRRTVUUUUVTQLKJHIJGFHHHIIGB@@@?>@A?@CGJKKMNLMNNOPPOOOQPOLHEBEDHJIIJKLNNLIGGIJIHILNOPSTVVVWVUSPNNLGFINS[bfhhgeb``b``\Z[_a__aejnqrtroh_ZWURRS ¤¤¤¥¥¥¨¬ª¨§¦¥¥¥¥¥¦¦©««©©¦¥¦¦§¨ª®««ªª««ªªª©©©ª«ª©«««ª©©©ªªªªª§¨ªª«ª©«¬®¬«««¬®®®¯°¯¯¯®®®¯¯¯¯¯±±±±±²³³³³³³²²±±±³³²²²±±±±²³²±±²²±±±±±±±²²±±±±°±°°°°±¯®®®®®®®¬ª¨¦¥¢ £¤¤¤¥¦¦¥¢v_WQOPPNNOOPOPPOONMNOPPPPOOOPOVYXZ`eehlouxtrpnmmqu{|~ zwvyzzzwtqpoligecabcehlqtwz||wtponnpuurpomkiec_\Z[\]_```bcefhkpsspnmmnjjlliihffeccddehmoqssrsttv{}lNKQY]\Z\_fklkggilnnqz}qlhcbgjpuulccikfbcgloonrzxw} {wtsqoqw~}{xqkihhjmnomida_``_\YSVh§¦§©«¯°°±²µ¶¶¶µ¶¶··¶¶µµµµ³²°¯¯¯«¤e[d`\ZWTSSTVVURQRQPQPMECEFCEIGHIHC@@A@>=??>@DFGGHIJLONMOPPPPQQRSQMKMMJJLMNOOOOMLIFGIJHFGGGJLMNQQRSSOONMJE@AGMRZ`dda`^[Z[\YWUVY[^[W]eilossqnib[ZWTRR¡¤¥¥¥¥§©©©¨¨§§¦¦¦§§§©««ª©¨¨§¦¦©«¬®®¬ª©©©ª©©ªª¨¨ª«ª©ª«««ª©««««««¨¨ªªª©©ª¬®®¬««¬¬¯°±±°¯®®¯¯¯¯°±±²²²²²²³³´³³±±±±²²²²²²²²±±±±±±±²²²²±±²²±±²²²±±±±°°°°¯°°°®®®®®®¬«ª¨¥¢ ¡¢£¥¥£m[VSQOOPOONOOONNMNNMOOPPNNQS]lihjorsuwwy{xspmmouy}zzz~|zwutqmkjhghhikquwz}|wtsqptxyvrnlhfc^[YY]`abdeeghhghiihhjlkkmllnnnojdcba`__bhlptyzxyyyx||hY\]acddbbceeddehlqvy~wrnic^[cjpy|kfihd_afmnmnrz {wz |||ytuttrrsuyyspnlkljkmonke`__``\[RSt¦¦§ª«°±²±´¶····¸¹·¹¹··¸¸·¹·¶´²±¯®«¨¢}o`ZWSOPRRSLGHJKLNOOKEDDDCEHHIJF??@?>==>>@@BDEFHIKNPNLMPPPQPPPPPPOOQPNMLMNNNLJHIIJLJIHHGFGHJJKJJLLKNONIB=@GMRZbeaZYZWVUSRPPTYZYTS[dhjmnoqmj`\[XURQ¢¤¥§¦¦§§§¨©©¨©¨§¨¨¨¨©«ªª¨©©¨§¨¨«¬¬ª©©©©ª©©©©¨¨©©ªªªª«««ª«ª«¬««ªªª©ª««ª¬®¯¬¬¬«®¯°±±±¯®¯¯®°±±±²²±²²³´³²³²±±²±²²²±±±²²²±±°±²²±²²²²±³³²²±³²²²±°±±±±±±±°¯¯¯¯°¯®¯®®¬««ª¨§¤ £¢¡¢£¤¢m\SQQPOONMMMOONOOONNOOOMNQVcuuux|}|}~}}|zupoou{~ ~~}|~}|{yupoopommopv{~ ~|||zy{}}zuqnkhda`_adfhjlkkmnmligfbbgkllmppqsvyqe`___]^bhnty{{xvuuvwwlgkgebeihggedehlorvzyyrklmib][bjlt |nhb][_fppmllrzyuvzz{|yyxtrtuvuutttupmmnnmmnnomga^__^[YVYy¤¤¥©ª«¬°²³³´¶···¸¹¹¸¸º¹¹º¹¸¹¸·¸¶µ´²®«¥w_]WQNMMOPLJIJMNMLKJFEDDDEIJKHD@>?AAAA@CHEEEFHIIKNMLLMOPQQNNPPRQPRPONMOMKLJHFDDFHGFGFGFFFFHIJIHIIJKMLGE?CLOS\bb\TQSSQNFFKPRRSQQUZbginoopnh`\[YWTS ¢¤¤¥¥¦¦¦¦§§¨©©©©©¨§§¨©«««©©ª©©©©ªªª«¬«ª©¨©«©©©©ª©©©©©©©©ª«ªª««««ªª««ª«««««¬®®¬¬¬¬®®¯°°°¯¯°¯¯°°°±±±²±³µµ³±±²²±±±²²²²±±²³³²²±±²³³²²²²²³´³³²³´´³±°±±±±²±±±°¯¯¯°¯®¯¯°¯®¬¬¬«ª¨¥ £¦¦¤£¤¢¢¡iVRRQPOOONNOOOPPNNOOONNOSW_ty}|yutsuz ~ ~{wusstsrqrtx~ zuqojgfggijmnprrqqpnnlkigfjnqqqstvxz|wg`]^aachknqtxytrstttspprpiccfijllklosvwywsrmighhfcbhmmp| zmc`_dottpmlnry~{tssssvvxxvuwxyxxwtsronnoponnonic_\\[ZZW]| ¤¥¨«¬®°²³³³³³¶··¸¹¹¹¹º»»ºº¹¹¸¸¸¸¸·¶³°¯ª xeRRPHEHKKMNONPPNLKJGDEEHJJKIDAACCCCCCDHHHFHKKJMNLKGCGNRRQPQSQQSPJJJJLKJIIIGDDEEDCCBCDDCCDEEHIKLKFC@??>CIMS[_`XMHIIFB;>KPQNLKOW_cgjnoppnc\\]\XUU¤¥¦¦¦¦¥¦¨§§§©©©©©ªªª©¨©ªªª©«««©©©ªªªª«ªªª¨©ª©©©©ªªªª©©©©©¨ª««««««ªª«¬«««««¬®®®®®®®®®®®®®®®¯¯¯¯¯°¯¯°±±²±³´µ´±±±²²²±±±²²°±³´µ´²±±±³³²±±±±³´¶¶µ´µµ´´²±±²²²²²±¯®¯¯¯¯°±°°±°®««§£¢¥¨§¦¥¤¤¡w\SRPPPPPONOOOPPNOOOPONPTW\qz~}zwuuy ~{ywuttttux|zwusrpnnpruwwxxuqppppssrrw{}|zyxxyzvofb``djlmliikpvuopvwsmnuzypgabgknnoptwxxxurqpnieefgjorolu{rpstwxwsonnoqxxspnortuvxz{{{{{zyuqooopsronpple`]\\[[\Zz¡¥§ª¬®¯°±³´³³³³·····¸¹º»¼¼»¼»»ºº¹¹¸·¶¶µ±¥u_TMGDEIJKNPOLMLNOMIGGIHIKLIA@CCDDDDBACFHHIJKGJILWcknu~}|{tmiif_UNMOKGIFFIGEEDDCA??ACDCCB@@EJNMLHD><:;>DKQVZ_XJB?=9:=CMONLIJOZcfgiknnli^Z\]ZXVT¥¦¨¨§¦¦¨©©¨©«ªª««ªª«ª©ª©©©§ª«««ªªª©ªªª©ª©©©ªª©©ªªª««ªªªª©¨ªª«««««««¬¬¬«¬¬¬¬®®®®®¯®®¯®®¯°°°°®°±±±±²³´´²±±³±±±±±±±°²´µµµ²±±²³³³²±±±²³···¶µ´´´²±³²²³³²±°¯°°¯°°±±±±°¯®®«ª§¥£¤¨¨¨¨§¥¢lURQOOPPONNOOONOPPOPPPSV]kx|}{zxz} |zywwvvwy{}}|zxwxy}~~}xtstwy} }ywrkgfdcgoqnf\_cjqsmnxyqhjt{{voebdgklllqssrsrqqsuriefhlqtplq{ ~~|{zwqqqqrrpolmopqttuy|~~}}~{vrppqstsqppoha][\\[YYo¡¤§©¬®®¯°°±²°¯°±µ¶¶¶·¸º»¼»»¼½½½¼¼¼»¹¹·¸¸´¯®§o[PJGFGHILMKJJJMMLJJIIIJKJE??CFDDEFECDDDEBGPYiy ¦««««©¨¤ pc]QFDA@EEEEDDEC@@CCDDFFEGHKNLLMMKE>=>@ELPV]UE;445=GMOMJIJQ[`ghhiiiifbUTZ\[WVU§¦§©©¨§©ªªª«¬«««ª«ª©ªª«««©§©ªª««ª©©«ªªª«ªªªªªªªª««¬ªªªªªªª««««ª««ª¬¬¬«¬¬¬®¯±¯¯®¯®®¯±¯¯¯®®°°°¯°°°°¯°±³²±±²²²²³³±±±±²³³´´³±²²³³³³³²²³´¶····µµµ³³´³²³³²±±±±±°±°°±±±°¯®®¬«ª©¥¢¤¦¨ªªª§¤ dSQPOOPOOOOPOONPPPPPRW^q|~}}|} }zyyyzz{} {wvx}{unkkigholcZQSYahjilsvqhhs}vsldccehhhmnllnqtstxxrljlosurnot~|zsnpqpstolhkswvwxx}~}~~wsppqrssttolc]\\\ZVUd £¦¨«¬¬®¯¯®¯¯¯¬¬®±¶¶·¹¹¹¼¼¼¼½¾¾½½½¼»»º¹¹·´±¬¦^OIHHEEHKIGHIHIKJHEFGHGHIF@>AEFFGIHIKKS]k ¨¯®®®¯¯®®®®®®«§£}ocYMHHGEEFGFEDFECEFHJKKKLLMOPPKC@@>AEKTYP>713;ENQRRTT\hkihhjida_\UOPTY\WVV¦¦¨©¨¨©««««««««ªªªª©©¨ª««ª¨©ª«««««ªªªªªª©ªª©ªªªª«««¬«ªª©ªª««««ªªªª«¬«««¬¯°±°®«°¯¯¯±°®®¯°¯¯°¯°°±°¯¯¯¯°±±°°°²³³²±±±±²²³³³´²±²²³³´³²³³³µ··¸¸¸¶¶µ³´³³²³³³²²±±±±±°¯°±°°¯¯¯®¬¬«©¥¤ ¦©ª©©©§£v[RQPNOOPPPONPOPPOOPS[m{}} |{{{|~ }zx| }upmlihki^ROOSY_cdfgqqhfrtolhgeeilppnlnrsuttvzytpquvusrqov}{|yoloomptvriiqtxz|}}~ xspnpqstutoi`]__\XWZ{ ¤§©«¬«£¡§¬±µ·¸¸ºº¼½½½¾¾½½½¼»»ºº¹¸·´°ª£nUHGGEDCECAEGGIJH@@DDEGIJID?>BFEFGDDVg|¦¬«°°®°°±³³³´²²²³²²°¯±²±ª¤ sd[QLGFDDDCC@@CEFIKMOPONPNKJGED??DJPTM?65=GNSUZ_fdgkkjecc`[XVRMMOTY[VTS¦¦¨¨¨©©ª««««««ªªªª©¨©§©¬¬«ª©ª«¬¬«««««ª©©©ª««««««««««««ªª«ªª«««ªªªª«¬¬¬««¬®¯¯°°®¬®°°¯¯°±°¯®¯¯°°°°°±¯¯°¯®¯°°®¯°²´³²±±±³³²³³³³²±²³³²³³³²³´µ¶·¸¹º¸¶¶´´³²±²²²±±±±±±±°¯¯¯¯¯¯¯°®¬¬«©¦¥¢¤¨ªªª¨¨¥¡ lXSRPOPPPPPOOPPPOOPVgy~ ~~~~~ ¢ ~~ ¡ zqmmllljbVSV[_^`bcchlf_h}|pkkmlklqx}xppvyuttstxzxvwxwuuuspsxy{zxwxvomnoljqyyoikmrx{ {vrpqprtusmf`_`_[[Uf¢¥¨ª««¯k]^k~£¬³µ·¹¹º¼½½½½½½½¼¼¼»º»¹¸¸¶²®«kRGEFD@@BDHHIJIFCCDDFHIIJEBABEGC;>X}¨ª««¯°°²²³µ¶··¶¶¶¶¸·µ³³±±±±®«¦{kVIHGFGFB@@CDEFHIJLMLLKJHJJIGDCIOPLDA?CKQX_dikgedda_[WWSQOMJJNTY[WUT§¨¨§¦¨¨©ª««««ªªª©ª©©©¨¨«««««ª««¬««¬«ªª¨©ª¬««««««¬«¬¬««ª«ª«««ªªª«ª««¬¬««®¯°±¯®®¯¯°¯¯¯°°¯¯®¯°¯¯±°°°°°¯®®¯®®¯±²²²±±²²³³³³³³³±±²²²³³³³³³´¶··¸¸·¸·´´³²±²²±±°±±±±±°¯®®¯¯¯°°°®«©¨¦¤ £¥§§¨ª©¦£~bUTQPPPOOPPPPPPPQT\p{~ ¡¢£¤¡¡¡¡ ¢¤¤£ snnnrrkf`_djiffgdbbc]Wctunkknpqv~ytw}~wsqqqrwyyywuvxwtpqstutsssqonnnkhlv{vlghltx}}~ ~xusssttoha]^_^\_ay£¦¨©©ª«¬¯g:*)/8Km¦±³·¹¹»¼½¼½½½¼¼¼½½¼º»º¹¸·´°«wXDCDDABDFFGIIJIHFEEFEGIIHFDDHKLWt¥«ª¬¯°°²³µ´¶¶··¸·¸··¸¼º¸µ¶´µ´²²±²¦qdVNQOIEEDCCCCCDEFEDGHHGIKMLLIIOPLHHHKUY_effe`]ZXWUQNMOOOKILPT\[WVV§¦¨§¥¦¨¨©ªª«¬««««ª««ª«ªª«««¬¬««¬®¬««ªª©ª¬¬¬««¬¬¬««««««««««ªª«ªª«««««¯°°°°®®®¯±±°°°°°°°°±°¯±¯°°°°®®¯°°¯¯¯±±²±±±²²²²³³³³³±±±±²³³³³³³³´¶······µ³²²²²²±±±²²±²±±°®®®¯¯°±±±¯¬«ª¨¦¤ ¡£¤¥©««©¥¢v]VRPPONOPPPPQQSW^kw~~|~ ¢¤¥¦¤¢¡¤¦¥£¡¢¤¥¥¥¤zutuxvrmjhlrrqpleb][WVclnmlmptxxx}xuqonosvxwutzzzvsqppqpnoqqqpnljhjszypghkqv{}}~|{ywvtme`]\]\Z_u £¦§§¨ªª«c2*CYJCNSz¢¯³·¸º»¼¼¼¼½½½½¼½½½¼½»º¸¸µ³°¦dRKGCCDBBEHJKLKIHHFEFHHGIGEGMPd¢£§«®°°²´´µ···¸¹¸¸¹¹¸··¹º»º¹¸··¸¶µ¶´°¯«¨tfSRNIFFDC@?ADDDBBCEEEFKJJKMMNOMKMPV`cac`\[WTQNPQPLKJGDCENTY\\XUT¨§¨¨¦§¨©ª«©©«¬¬¬¬««ªª««¬«««¬¬¬®°¯¬¬««ªª©ªª®®®¬®¯««¬«««««¬«ª«¬«ªª««««¬®¯¯°°¯®¯°±°±±±°°°±±°¯¯®¯°°°®¯°°°¯¯±±±±°±²²±±²´³²²³²±±²³´´³³²²³´¶¶····¶´²²³²±²²³´´²²²±±¯®®¯±±±°®¬«ª¨¤¢¡ ¢¤¥©«««§¤ qXRQPPOOPPQSX\blqy~~¢¦¦¦¥¢¢¥¨¨¨¦£ £¥¦¦¦¥{{|}{wrpr{}xxxlc_ZSTWdklklov{|y}|ywrnnnptwvuw}~|xtrnmnoopsvvspnmlkosqlhjnrv{}~ ~{wrib^\XVVZd ¢¦§¨©¨¨¥~>/6VoPVXFn¡®´·¸¹º»»»¼¼½½¼¼½½½½¼»»»º¶´²ª n[QJEDD@@DHJJKJFEDDDFHEBB@?ASt¡§§«¯±±²³µ¶·¹·¸¹¹¹º¹¹¸¸¹º¹¹¹¹¹¹¸¸¹¹·¶µ³±¯¬¥kbYOLJFA>9;??=>???=@DHJHILMOPLMTZ^cb\ZVQQQOKJMMNMIB?=?DLV\\ZWVU©¨¨§¨¨©«««¬ªª««¬¬¬ªªª««¬««¬¬¯°¯®¬««ª©©ª«®¯®««¬¬¬««¬¬¬¬««¬¬¬¬®¯°°°¯®®®°°°±±°¯¯°±±°¯®®¯®¯¯¯®¯°°°°°±±±°±±±±²²´´²³³²²²²²³´´³³³³³µ¶¶¶µ¶µ´²²³±±²²´´´²²²±°®¬¬¬¯®¯¯®¬««¨¥¤£¢¢£¥¦¨ªªª¨¦¢fXSRQPPQU[]dps{}~ ¡¦¦¥¥¤ ¢¥¨ª«ª¨¥£¢¤¦§¦¦¤~}wtw|}znb]VSW^hnnlmrz~}{{|yvspnnpuyyxy|wtonorttvzyvsqqpnmlifhlpuy| }yvqmf`\[VRTZq ¤¥§¨©¦§e145<J=94<t¥°³¶¸ºº»»»»»¼¼¼½½½½½¼»º»»¸¶³ª£v`QIFEDCACEGGEEDAADGGFCAA7Ecz¢¤¨¬°±±±³µ¶¸¹¹¸¹ºº»»º¹º»¹ºº¹ººº»ºº¹¸¸¹¸¶µ´²®¨£kWOFFC?99;945:=99<@CGGFIKMLJRY]]^\XWTLJOONONKKJC;>EDGMW[YVTUU¨¨¨©ª¨¨©««¬«««ª¬¬¬«ª©ªªª«¬®®¬¬®¯®«ª«ª¨¨¬®¬«¬¬¬¬¬¬¬®®®®®¯°±±°®°±°°°°¯®¯°±±®¬¬®®®¯¯°±°°°±°±²±±±±±±±²³³³³³³²±±±²²³³³³´´´µ¶¶´µµµ´²±±²²²´³´´³³²±¯®¬««¬¬¬¬ª¨¦¥¤££¤¥§¨¨¨¨¨¥¢¡xcVSRSTXbqww{|~ ¡¢ ¢¥¥¤¥¤¢ ¡¥¨ª«©¨¤¤¥¦§§¦¡|xstzxobYUW[dntsppty{{||||~~{wtrrqpquz|{{~zvrrtuxy|}{yvutsrnljhlotxz} xppmha]\ZUQSY| £¥¦§¦¥¦Y,/**01,#Oª°³µ¸¹ººººº»»»¼½½¼¼½¼½½»»¸µ³®¦zbVNKJHEDDEDCAABABDFGEHGAQv¤§¨¬¯°²´´µ¶·¸¹ºº»º»»º»¼»¼ºº»»»¼º¼¼»º¹¹¹¹¹·¸µ³°¯¨¡o^PIIC>;98769;89:;=@CEHIJKKNRTRTTPOMGJNPPPLHFD?;>ILMRXYVTRTT¨¨©ªª©ª©©ª««ªª«¬¬¬ªªª©©«¬¬®®®®««¬«©©«¬¬®®®®¬«®®¯¯®®¯¯®¯±±±°¯®¯°°¯®¯°¯¯°²²¯®®¯®®®°¯°±°±±¯¯°²³²²±±±±²²´³³³³±±±²²±±±²²³³³´µµ´´µ´µ³±²²²²³´µµ´³³²°®¬«««¬¬«¬¬¬«©¦¥¤¤£¤¥§§¦¥¦¥¦¥£p^UTXdnv ¡ ££¢£¢¡ ¡¤§ª¬¬¨¦¦¥¦§¦¦£|zvqouzpd[Y^ciswvtsvz{|}|||~{vttsssuvy~~ }xxyyz|~}{zyxxwurppsuxz{~ ~~{vonia]\ZWTRSb¢¤¥¦¥¥££Z0-(%'& 7q¬±µ¶·¸¹¹¸¹»ºº»º»»»»»¼¼¼»º·´±®§|dUPONJJJJIHECBBBDDDEGKOYw£¤¨«¬¯±³´µ¶··¸¸ºººººº»»¼»»»º½»»¼¼ººº¹¸¹¹¸¹¸¸·µ²±«¦q\L@?@?<<<<=>=;:::>BDFGFIKJGDBAEIIGJLNMLHDB?<<BLRSVYYWUTUT¨ª©©ªªªªªªªªªª««««ªªªª«««¬«¬¬¬««ª«ª¬¯°¯®®®¬¬®®¯®¯¯®®®¯¯¬¬®±±±°°°°°¯¯¯°¯¯¯°±±±¯®®®¯°°°°°±°®®¯±²²²±±±±³³³³³²²²³³²²±±±±±±²²³µµ³´´´µµ´³²³³²²´µµ´³²°®¬¬««¬¬««ª¨§¥¥£¢¢¥¨§¦¦¥¦§§¤¡yeX[kz ¡¢£¡ ¡£¦ª¬¬«¨§§§¦¥¥¤ ~xwurovyoc_`dinvzyvtwz{~}zwutuwy{}||~~}||}~|ywwx}||~ |z}|xtld]\][WSPRp£¥¥¥¥£¢b3))%4hª¬²¶¶··¸¹¹ººº»»º¹¹»ººº»¹¹¸·´²®©iTMKKJKKJKIEECCCDEEGLM`x¡¥¨©¬®°²³´µ¶··¸¹¹ºº¹¹º»»»»ºº»¼»ººº¹¹¸··¸··¸···µ³²±¯«¤s]JFDEDA>=>BBA><<>?@@?@DGFA=::?FFDCEFB@ACA>;=FPVWWWVVTUSS««©¨©ª¨ª««««««¨©«¬¬««««¬«««¬««¬¬««¬««¬¬«¬®¯°°¯®®¬«¯®¯¯®®®®¯®®¯®®®¬¯±±°°°°¯¯¯°°¯¯¯°°¯°¯®®®®¯°°±±°°¯®®¯°±±±±±±²³²³³³²±²³²²±²±±±±±²²²³³±´´³´³´³´µ´³³³´µµ´²°¯¯¬¬¬««¬¬¬«©§¥¤¢¢¥§§¨§§¨¨§¥¢uejy~}||¡¡ £§ª««ª¨§§§§¦¥£¡ |wwupox}xpiefginty{{xwy{| ~{yxy} ~|{|~ |yxx}xsg`\[[YTQQWw ¡£¤¤¤¢¡tF.*(-Kr«®¯²´µ·¸¸¸¸¹¹¹»»º¹¸ººº¹¸¸¸¸·´²®¨iRJIJJKIGEEDBBDEEEGMVZr¢¥¨¬¬®°±²³µµ¶····¸¹¹¹¹¹º»»º¹¸º»ºººº¹º···¸··¶µ¶·¶µ´²²®¨©£|ZLHHGC?>>CDD@<98:=>==@FHB=87<A@=<>>:;>AA>;<DMUUVWUSTSRQªª¨¨©©©ª©ª«««©§ª«¬¬¬¬«««ªªªª««««¬««««¬¬¬¬«¬®®®°°®¬¬«®°¯°°®®¯®®°®®®¬¬®®®®®¯°°°¯®®¯¯°°°°¯®¯°°¯®¯¯®®±±±±°°¯®¯¯°±±±±±²²²²³³²²±±±°°°±±±°°±±±±±±²´´³³³´´´µ´³³´´´´´²°°°®¬¬¬¬«¬¬¬«©§¦¡¢£¥¨©¨©©§¦¦¢yxz}~~~{zyxz}~|| ¢¦¨ªª§¥¥¥¦¥¤¢ {yxtkmxywxvnfdfilmosy}}|yxz| ~}~ }~ ~zwvtsw||vpe_[XWVRPR\z ¢¤¤£¡ mYUYj«¯¯±²´µ¶··¸·¸¸¸»¹¹¹¸¸¹¸¸···µ¶³±¥iVPOMJIIHFDBBCCDEEJQ^l ¡£¦ª«¬¯°²²³µ¶¶¶···¸¸¸ººººº»»º¸¹¹ºº¹º¹¹····´´²²³³¶µ¶µ³²¯«£|bSOJFC@?ADDC=758<<:<>BFDC?<9446:==99:==>>>ENRTVVUQRRSV©©¨©¨§©©¨¨ª««ª©«¬¬¬¬«««««¬¬«ªªª««¬®®®®¯®¬®¯¯®®¬¬¯°±°®®°°¯°°¯°¯¬¯¯¯¯¯¯¯±±°¯®®¯¯¯±±±²¯®°°°¯¯¯¯¯±±±±±±°¯¯°±²²²°°²²±±³³²²±°¯¯°°°°°°±±±°°°±±²³²³´µ¶µµ´´³´µ´´³²±±±¯®®¬««¬®®¬©¨££¥§«««¨¨¦¥¢¡ ~|||{yxwwy}|{{{ ~| £¥¦¥£¡¢¥¥£¡}}|qhjpnlmicbbemstuvz}~{wxz} {| }zzywtrpsxytme_[WUSPQR[{ ¢£¢¢¢ ¤«¬±±±²´µµµµ´µ´¶······¸¸·¶µµ´µ´²±ª£k[VOLKJJJGCACDCBAIUXd~¡¥¨ª¬¯°²±³´µ¶·¶·¸¹¹¸¸¸ººº»»ºº¹¹¹ºº¸·¶¶³²±®®®®¯°³³´´³³²°¯«¦mWLJFCABDEDC@?@?A@?>BCCBA>91058;<:975:=?CJQQRSSRQRQRV¨¦¨¨¨©¨¨¨©ªªª««««¬¬««««ª««¬«««««««««¬¯¯®®®®¯¯®°°®®®¯±¯¯®¯¯°°°°°¯¯®¯¯±°¯¯°°¯®®®®°±±²°¯°±°°®¯°°±±±±±±±°°±²³³³±¯±±±±²²²²±°®¯¯¯¯¯°²²±°°°±±±±²³µµµµµ´µµ´µ´³²²³²±±±¯®¬«¬®®®¯¬ª§££¦ª®¯¯¬§¨§¤¢¢ ~|{zxwvuux}~zyy} }z~ £¤¢ }pklmkijgbbcgmsvxyz{|zwx{~ ~~ }{zvonnrvyri`^[WUSQOO[ ¡¡¢¡¡ ¡¡¢¦§ª«¬±±±²³´´´´´µ´´´µµ¶¶¶µ¶µ´³³´´´²®ª¢lRONLKJLJFBBEGEB@M\hz ¢¥¨©«¯°±±²³´µ¶··¸¸¸···¹º¹¹¸¹¹¹¹¹¹¹¸¶³²°¬®¬©¨¨«°±±²²´³±±®©§oTNLHC@CFDBBDDCCB@>?@?@BA=:8885125228<?GNRQSQPQQSRRU§¥¦§©ª©ª©©©§§ª«««¬¬«««ª©ª««¬«ª««««¬¬¬¬¯®¯®®®®®®¯¯®®®®¯°±±°¯¯¯±°°±±°®®®®¯¯°±°®°¯¯¯¯®®®¯±±²²±±±±±¯°±±²±±±±°°¯°±²³³³²±±±±±±±±±±¯®®¯¯°°°±±±±±°°±±±²²³´µ´µµµ¶µ´³´´²³´³²²±°¯®¬¬®®®¬¬©¦£¤¦ª¯°¯©©¨¥£¢ }zywvustx}{xx} ¡¡ }sqqpnlkiffehnsvyzz{zzxx{~ ~~xolknqsma[[\YURPMMZ ¡¡ ¢¢£¤¥§©«®®°±±±²³´´³³´³²²²´´µ³³³´³²±³³³±®©¢ nOJKIIKNJDABIMJEFL^}¡¥¥§¨ª®¯±±²³´µµ¶······¸ºº¹¸¸¸¸¸¸¸¸¸¶´°®«¡ zr|¡«±±²´³²±±®¬¨q]LFEA@DDBDDDCCCCBCFGHHJIEA<84+*--06@FMQRQTTSRRRRTV©¨§ª©©««©¨¨¨§©ªªª«¬««««ª««««©ª©ª«®®®®¯¯®®®®®®®®®¯±±²°¯°°°±±°°¯¯¯®°¯¯°±°¯¯¯°¯¯¯°°°°²²²±±±°°°±±²±±±±±°°°±±²²²±±±±±±±±±°°¯¯¯¯¯°±±°±±±°°°°°°±±²³³³µµµµ³´³´µ³²³³³²±±°¯®®®®¬©¦¥¥¥ª®®®«©¨¥£¢ ~{xwuttsx}~yvx| ¢ ~xutsromkklkloswyy{|{{yx{~}|} ~}yxz~~ztnlkljeZW[\ZVOMMLY¡¡ ¡£¥¦¨«¬®®¯±±±²²³´³²³³´²±²³²±±±²²±±²±±±°©¢mYPLHHHGDCDFMPKIJMf¡¤¥¦©«¬¯±°±±³³³µµ¶¶····¸¹¹¸¸·······µ±¬¢oP4-'9Ql¡¯±²´´´²²±°§¢tQGCCABCCCCBABDGEHKNPOONNJFA5++,.3;FKQRRSUUTSQQSUT««©ªªª««ª©ª©¨¨ª©¨ª«¬¬««©ª«¬««ªª©ª¬®¯¯®®¯¯¯®¬®®®¯°¯®°²²²±±±°¯°±°°°¯¯®®°°±±±°¯°°°°°±²±±±²²³±±±¯°±²³²²±±±²±±±±±±°±±±±±±±±±°¯¯°¯°°±±°°±±±°°°¯®¯°±²³²³³³³³²³²²´³²³³³²²±°°¯®®®®¬«¨¥¥¥ª¬®ª¨¥¤¢¡}yxxxvtu|}yvw| ¢¢ ~|zwttutqonssqqtxyz}~|zyy{} ~|} }|uru|}zutsplgd]XWZ\ZVNLNOZ¡£¦¨¨ª«¬¯°±±±±²²²±²±²±±±²°¯°°±±±±±°°±¯¨¢n\QNKIFBCDFHNMKNPRi} £¥¦¨ª«¬®®®®°°±²³³³¶·······¸·¸····¶¶²®¦e9,-,013Hd¬±µµ´´³³²¯©£nZLGEBA?@BCA@DHHJNOPTTPQPNLF:523;DLPRSSRTTSRQRRRV««ªªª««¬«ª©¨¨¨ªª©ª«¬¬©ª««««««««ª¬®®®®¯®±°®¬¬®¯®®°®®°²³³³±±¯®¯°°¯¯¯¯°®¯°±±±°¯¯¯¯¯°±±³²±±²³´²±±°±±²³³²³²±²±±±²±±°°±±±±°±±±°®¯°¯¯¯°°°¯°°°¯¯¯®®®°°±±±±±±±°±³³³³²³³²²²²±°°°¯¯®¯®®®¬ª©¦¦§ª¬®®ª¨¥¤£¢¡|xvvttuy}|zvu{¡¢¡¢ {zyxxvtvvtrqttttuyz}|yyz} ~~ qlnsvvqrxuoe_WXYYZZVONLM]|£¤¦¨ª«¬®®¯¯±±±±±°±°°±±±°¯¯°°°±°¯¯®¯¬§¡mbUOLLKG?>BFLKMQQSgz¡£¥§ª«¬®¯°±±±±³µµ¶µµ¶µ¶··¸·µ¶¶·µ²pD+/9_jXX^]k£±³³´³³²±¯¬§uUIF@?>@CCBAEHILOPQSSQRPPQOGA;8<GORTSSSSRRRSSRQT¬««ª©ª««««©§¨©ªª«««¬¬©ª«««««¬¬«««¬®®¯¯¬®®°°¯«¯®¯±¯®¯²³´²±±¯®°±±¯¯°°±¯¯¯°±±°°¯¯¯®°±±±±±±²³´²±±±±±²³³²²²³²±±±±±°¯¯±±±±°¯°±°¯¯¯®¯®°°¯®¯°°¯¯¯®¯¯¯¯°±±±±±°±±²²³²±²²³³±²²±°¯®®®¬ª©©¨ª®°±¯¬«¨¦¥¥£¡ ysrqrtw{||{z ¢£ ~}|}}zvuwx}}zxwwxxvwwvtstuvvvy~~~{zz} ~{{|~ }qmoqrrlovtng_WZ\[YYVOMJL]w ¡¤¦§ªª¬¬¬¬®°±°¯°°¯°°°°®®¯°¯®¬¬«©¨¤ {h]RIHIJE<?EHKLLNOQf{ £¦¨ª«««¯°±±°±³´³³´´´µµ¶·¶µ´´µµµ°ªc83:M_WLEB9R}ª®±²´´³³±°®¨£ dNFE>=BEHFCEIIKMLLMQPQRSTQMKKFFJPSTSSSQRSRSUTTT¬¬¬ªªª«¬««©§§¨©©ª«««¬«ªª««««¬¬«¬«¬®®¯¯®®¯°°°¯¯¯®¯°°®±²³²±±®®°°±±±±±°°°°¯°±°¯¯¯¯¯°±±²±±±²³³²±±°±±²³³²³³³²²±±±±°°°±±°°®¯±°±°¯¯¯°¯¯°°®®¯°°¯¯®°¯¯¯¯°°±°¯°°±±±±±±²±³²±²²±±°®®®¬¬¬«©©§ª®¯°®¬«¨¦¥¥£¡¡¡zrommtx} ¡ |zxxxupmmmoty~|zxwwwxyyyxtsstwyz|}}}{{{} {xzz{}~~ }{~ yz{yysmlgjnjc_][]]\[XVNJJLWp¢¥¥§¨ª«««¬¯°¯®®®®¯°°®®®¬«««©¨¦¥¡q]TJ@BCB?=@CEGKJJNPh~¢¥¦¨ª««¬¬¬¯°¯°±±²²±±²³³´´´µµµ´²³³´®¦a;852383+,16l§°²µ¶µ³±±®ª¦¢}^KG?=BIKHEEHHHHEEHMPPRTSONNNMJKPSSRRPQRTQPRSSR®®«««¬«©¨§©©©ª©ª««¬«ªª¬««¬¬«®®®¯®®°±±±°°±¯®°¯°¯®°±²²±°¯¯®°±±±±±°±±±±±±°®¯¯¯®¯¯°±±±±±±°±±°¯°±²³³³³³³´³²±±±±°±±±±°¯°±±±¯¯°°°°°±°¯¯¯°°¯°®¯¯®®®®¯°°°°°°°°±±±±±²±±±±±±±®¬¬««««ª¨©«®¯°¯«§¦¥¥££¢¡ wqkjpw} |xvwupmlklosvxz|~|{z{}~|yxyzzyvtsrtx{|~~}{z|}{zzxx{~|vuy{{{|{xxz|~~}{xxy{~wu} }yhWT\ih^VU[^_]\[WRMJJJTj £¤¥§§ªª©ª¬®®¬«¬¬«««©©¨¦¥¤¡n]UJ===>>===BGJIKOQl¡£¥¦¨ªª«¬°¯¯¯°°°°°±±³³´´³²²²³±°®¯§h>4)&((''))3f§¬°²´´´³²±°®©¦¥nTIA>AHKHIGEDFGFEFJOQRSRPMLKLMMPSRRRRRSRPQSRQQ¬¬¬¬«««ª«ª¨¨«««««ª«««¬«ª«««¬®¬«¬®¯®®°±±°°°¯¯°±¯±±¯®¯°±±±¯¯®®°±±±±±±±±±±±°¯®¯®¯®®°±±²±°²²±²±°°±±°±²³²²³´´³±±±±±±±±°°±±±±±¯°±±°°±±°¯°°°°°°¯°¯¯®®®®¯°°°°°±±±±°±±±±°°±¯¯¯®¬««««ªªªª«®¯°°«©¦¥¥¥¤£¢¡skjnu| }{yxsnmnnnrtuuxyyzz|~{{{}|zzz~}|{zzywtrrsy|~~|zxuy~~|{ysqoqsuy||vqqxywyzyvuyz}}{yxy{yxzzywvtz~uz {qX@?TicXSS[]\[[YUPLJHKOb{ ¡ ¢¤¦§§¦§©««««ª««ª«««ª««««ª©¦¥¤¤¡~l_SD<<>??;9;AEGIKLTq ¢£¤§©ª«««®®®®¯¯¯°±²²³²²±±±¯°±®¬¨|P)##"$#!#&9j¥¬¯²²³´³²±±°¬«¨]PEBCEFFFCCCFJJGIMQTUSRQOJFGKLOQQRTSRSSQSTSSU«««««««««ª¨©ª«««¬¬«««¬«©ª««¬®®¯¬¬®®®®®¯¯°±±¯°°°°¯®°±±±®®°±±±°°°°¯°²±±±±±±±±±¯±±°¯¯¯¯¯±±²³²²²²³±°±±±°°±²²³µ´´´±±±±±±±±±°±±±°°°°±±±±±±°°°°°°°°°°°°°°¯®¯¯°±°°±±±±°°°°¯¯¯¯¯®¬¬¬«««ª©©©ªª«®°±¯¬«ª¨§¥¥¤££¢ unmns} ~uppqqruvuwzzwrnmuz|{z{||}~ ~}}|yvusrqrw|~}zzyuy~}}}|{tqqqpopsusonttty{{{||{|ytrqrvyyz{{{zuqrsssu| }}{qZ>=KbaXVXZYXXWVSNHGIKO]{ ¡¢¤¦¥¥¥§©©©¨©¨§§¨§§©©ª©¨¦¤¤¢¡}ldYJ=>@ACCA@?>BDCDGZr¡¢££¥§¨©©«¬¬¬¬®¯¯¯°±°°°°°±±®¬¬«¨qD) "$$&!Nw¥¯±±³´²±±±¯«§ {cQLKHFFEEDEGGIIKPRUTSSQPLGFHINOQSUSQSSRQQRUV¬¬¬«««¬¬«©©¨©ªª«¬«¬¬¬«©«««¬®°¯¬«®®®¯¯¯±±±®¯°°¯®®°±±°®°±°°°±±¯°²±²±±²²²°°±±±±°¯±°¯¯±±²²²±±²²±³²±±±±±±³´´´³±±±±±±±±±°°°°°°±±±±±±±±±°°±±±°°°°°±±±¯¯°¯°±°°±±±±°°¯®®®®®¯®®¬«««ª©¨¨¨¨©ª¬¯¯®¬«ª¨§¥¥£££¢¢¡}rmns yrrsssvxzzrjjlsz}~}~~{wvwyytpppqpsy|}}{zyxy}~~~~|vuutsqnmpttquwz}~{upmlpw{~~{{xrqrpjhlv}so`FDG]baa^[WWVUUTPIDFKPXp¡¤¤¤¥¥§©¨§¥¤¢¢¤¥¦§¥¦¦¤£¤£zn[XQGCCBBEFDCB?>A@BH]s¡£¤¥¥¥¦¨ª¨¨©«¬¬¬¬¬¯¯®®®°¯®«ªªªª§¥mH," !!1`£«®±±³´´²±±²°®«§¦gRNMHEEGGFEGGGJKOQTSPPQNKJJGGLORSVSPSTTSRTVS««¬¬¬¬¬«ª©©ª©©««¬¬««ªª«®°°®¯®°±°¯°±±¯®¯±°¯¯°°¯¯®¯°°°±±±°°±±²²±±²²±±±±±±°°±°°¯°°±±²²±²±²³³³²²³±±±³´³²³²²²²±°±±±±¯¯°±°±±±±±±±±²°±±°±±±±±°°±°¯°°°±±±±°°±±±°¯®®¬««««««ª©§¦¦©ª¬¬¬«¬«©§¤£¡¢££££¡ tnox xtvutu} zrnkjnv}xusrrrtwuppppru|~~}{{|~}xvtqqpprw{zxy} }okliiovy||ytwy|vjekt xhjk\LQdhjgb\WWXTSPLFCFKMNd{ ¡ ¡£¤¤£¢¡¡ ¡££¤££¤£¢¡{j`WRLJKG?=@@@?@@>?DEEWs¡¢¢¢£¤¥§¦¦§¨¨¨¨©ªªª¬«ª«««¬¬«««¨¨¨§¦£¡v^L<34C_y§¬°²³µ´³±±±±°ª§§ xWLNKIFGGEFHJIJMPQRRONNMJJJGHKPRSURRTTUTSSSS©ª«¬¬¬¬««ª««««««¬®®¬¬¬«¬®¯¯®®¯°°¯°±±®®±±®®¯¯¯¯®®®¯±°°°°±±°°±²³±±²±²²±±±°¯°°°°°¯®±²²±±±±±²³³³³²²²±±³³²³³²²±±±±¯°°°¯¯°°±±±±±±±²²°°°°±±±±±±±±°®¯¯¯±±±°¯¯°¯¯¯®®¬¬¬««««««ª©¦¥¥§©«¬®®««ª§¤¢¡¡¡¢¡¢¡~sr¡ }yxz~}|}}~ }yusonot|~yvtssssqqxzwusrsw|~}~~~yupnptx}}~ wiimjilqty~~ytv}|kfir{|zxwxl^gmhWXbgjc]ZVWXUROHDDEHID[v ¢¢ hWPONHEHFA<;=>>=>>AECBSq ¢¤¤¤¤¥¤£¥¦¦¦¦§¨§¨©ªªªª©©ª©©¨¦¦¥££~qhiv§«¯±²³µ´²²±±°®«¨§£hWROMJHIFFGJKGJNNPSPOLKHHHGGIMQTUVTSSRRSSSS«ª«ª«¬®®¬«ª«¬¬®¬¬¬¬¬®®®®®®®®®¯°±¯¯°±±¯®¯°±®®®¯°¯¯¯¯°°°¯°°±±°°±±±±±±²²²±±°¯¯¯°¯®°°¯°±²±±±¯¯±³³´³²³³²±³´²²²²²±±±±¯¯¯¯¯¯°°°±±±±±±±²±°°±±±±±±°°±¯®¯¯¯±±°¯®®¯®®®¬¬¬¬«««ª¨§¨§¥¥¦§ª°¯«ª¨¦¤¢¢¡ ¡¡ yx ¡uqoot| |y{}}}zvuy{{|xuuuuttrqpw}}{yxxy{{{{{~~|{{||{zyuspqu{~~|||{yxwphlqkgjpsuxvx~|trxymjovvokmj\PYilg^]_g^XWWVVUSQIDFGIHERlw~r`OKIGCABEF?;<<<;<>ABABOl~ ¡¡¡¢¢¡¡££¥¥¥¦§¦¦§¦¦¨¨¨¨©¨¨§¦§¦§§¦££¥¡¢§ª¯²²²´´³²²±°¯®«©§¤s^XOJHGIIEGIGEFKORQQPKIHFEDFFKSVUUTRRQRSSSS««¬¬¬¬¬««®«¬¬®¯¯®®®¯°¯®®¯¯°¯¯¯±±°¯¯°°°¯¯°°¯¯¯¯¯¯®¯¯°°±±±±±±±±±±±±±±±°°°°¯°¯°±²²²±°°°²´´´³³µ³²³´³²³²±±±°±°¯¯¯®¯°°±±±±±±±²²±±²±±±±±°°°°¯®®®®°°°¯®®¯®®®®¬««««ª©¨§§§¨¨¦¥¦©¬¯¬«©§¦¥£¡ } {offjmr{ |xsy yvuuvxvvwwsqopps{~~}~|{zzz|~}{yyyvuvyxxxwx|}~||}{yvqifkrqlmsnlqy}}xpquxxsou ulossmif\OABXlle^]`YUVVVVUQMGDGJJHDEVsz| zrh]NIFDD@>AC@><;;<=?AA@CMfz ¡£¤£¤¤¤¤¤¥¦¦¦¦¨¨¨¥¥¥¤£££¥¦¨ª«¬¬®¯¯¯±²³µ³±±±°°¯®«©¦¤¡_VMIHDCFGIHFFIMPRRQONKHEDDDFKOUVSSRRQSTSRQ««¬¬¬¬¬«««««®««¬¬¯®®«¬®°±¯®®¯¯¯±°¯¯¯°®®¯°°¯¯®®®®®¯¯¯°±°°±²±°±±²±±±±°°°¯¯°°°²³´²³´±±²³³³³´µµ´³´²±³´²²±°°°°°¯®®®¯±²±±²³³³³³³²±±±±±±°¯¯®®®®®®°°¯®®®®®¬«ª««ªª¨¨§§§¨©¨¦§ª¬«ª©§§¦¤¡ ¡ vngdekqy |{whm| ytqqsuuwxuspqttuy}~{zz{}|ywvtpptvz|||zvtwtruz}}uf_`hptspppu{ }trtrrpknzzoortrom^PE>CXhga^[TSTUTSQNIEDFGFD@<Afuv{{sgcd\RFDCA=<<>?>=<<>?AAAACLds ¡¢¢¡¡¡¢£¤¤¥¥¦¦¤£££¡¡¢¤¦¦§©ª««¯°°±±±±±°°±¯¯®¬ª©¦¤¡lVLIHA>BHJJFDKNOONMKLKGDDDDFIMUWTUTRQSVUTS©¬¬ª«¬¬¬«««¬®¬«¬¬®¯¬®®®°°¯®®¯®®¯°°¯¯¯¯®¯±¯®¯¬¬®®®¯°°®¯±±±¯¯±²³²²±°±°°¯®®¯°±±²²±²´³²²³³³´´µµ´³³±°²³²²±±±°°°¯¯¯¯°±±±²³´´³³²²³±±±°¯±°®®°¯¯®¯¯®¬¬¬¬«ªª©©ªªª¨§§§¨¦¥¦©«««ª©¨§¥¤¡ ¡ {rpihjnw }}}{|}s]^q}}xrnooqrsqrttw{{xx{}}zyyz}|xutpijnry~tiehiinstvojjijlqvuqqv~{vxzwtpjhqzywxsopruuscXLDCEXb`YNKNSSRQMHFDCDEFFE@;Lmuvx}}}|}i_REB@@;7:=>?@@?AA@?BCF_o ¡ ¢¢£££¢¡¡¡¡¢¤¥¥¥¦¨ª¬®¯¯¯¯°¯¯®®¯¬¬««ª¨¦¤¡vZLHDBBBFHIHGJOSOJHGGHFCBAACHMTVSSSSRSUTRS¨¬¬¬¬««¬¬¬®¯¯¯¬«¬¬«¯®¬¬®¯±¬®°°¯°¯®¯¯®®¯¯¯°°°°®¯°±®®¯®®®®®®°±°¯®°±²°¯±±²²²±±±±±°°¯¯°±±²²±±²³³³´´³³³³µµ´²±±±²²±±±±°±°°¯¯°±±±²²´³³³³²²²±±±°¯°¯¬¬¬¯°¯¯®¯¯®®¬¬¬«««ªªªª«ªª¨§§§¦¤¤¦©«««ª©©§¥£ ¡ ¢¢¡}~~xspnory }{{|~}zwwx{}}{iaagsz}{xspooonmopstx||zwy{~{xvvxz|{xtskcdipz|sibca[Y^`hkoy{rkmwzvpmptsomnuvwyxsjmurmqtsqptuqhcYNEAK\WPEDHMQRPHFEDCDEHIF@;<Snruy} £§ {bIED719>AA@?>?@?>@CK[i|¡¡¢¢¢¢¢¡¢¤¤¥¥¥§©«¬¬¬®¯¯®«ª©¨©¥£ wbQIFFEBDIIJOSTVOIHIEDCDC?=@FNSWVSSUTRSRTTª¬«¬«¬¬®°±¯¬¬¬«¬¬¬®¯®°°¯°¯®®°°®®¯¯®¯°±°®®¯°¯¯¯°¯®®¯°°°°¯±±²±°±±±²²²±±±±°°°°¯°±²±²²²³³²³´´´´³µµ´³²²±±²±±±±±±°°°°±±±±²±³³³´´²²²±±±±°¯®«¬¬®®¯°¯®¯¯®®®¬«««ª©ªª©¨¨§¦¦¦¥££¦ª««ª©¨©¨¤ ¢¢£¢£ ~}{|~~ysqst{ }{{}|ywuuuvz~sffghmtyyxvtponnopprruwyzxwwy{{vssstwyzzwsne`bhry}zmaaZUQV]dir|~wpov{|qjihf[W\bfmuysijrsoquz|vsocbjd]NACQPICACGPRNKIFDCDGIIE@<;5Jjrsw{¡¤¡¢«¯¯±°¬¦nef]MBAA=85679<>?BJVcv} ¡¡¡ ¢¤¤¤¤¥©©ªª«¬¬®¬¬¬««©¨¨§¤¡ {fSHFFGGGIIISXUSOLIKIFEDCB?@DLTYZWTUTRSTTTª««®¬®®°±°¬¬¬®®®®®¬®¯¯¯¯¯°®°°°¯®¬¯°°±°®®¯¯¯¯®¯®¯¯¯¯¯¯¯±°°±±³²²±²³²´³²±±±±±°±°±±±±±±±²³³³´³²¶¶´´´´´³±²²±°°±±±°¯°±±²²²±±³´³³³²±²²²³±¯®®®®¬¬¬¬®®®¯¯®®®®®®¬««««©©¨©¨§¦¥¥¤£¤¥§ª««ª§§§¦£ ¡¢¢£¡}~}~~~yvux| {xxzzvtvy|njmqqqruwwvtrpprtwvvtssrstspptroprtvyzxvtpjc`chorx|||tfb_^agkkls||xttxz{rjllf^TQRVepsh`bmuvut|zsjYVceeaGCHIE?=@FNPOQPLHFFHKKHB>:68Qinsuy} ¨¬«ª¬²´µµ±°¯©oTKG@:6678>CCEIQ_nx ¢¢¢£¥¨©¨¨©ªª«ª««««ªª©©¨¨§¦¤ gSHCDFIJLLKPTSPONMNNKHEDDCCEKSZ\ZUTTTSTRV©««¬¬¬¬®°¯°±±®¬¬®¯®®°¯¬¬®¯¯¯¯°¯¯®®¯°±°¬¬®®¯°°®®¯°°¯®¯¯¯®®®¯®¯°°°±±´´³²±³³´³±±±±±±±±±±±±±±±±²³³´µ²²µ¶´³´´´³²²²²±°±±°°°±±±²²±²²³²³³²±±±±²³±®®®®®¯®®®¯®®®¬«ªªª©©¨¨§§§¥¥¤¢¤¥§ª««ª§¦¥¥¤¡ ¡¡¢¡~}|{|~~|zy{ }} |wv| {y|}umotz|{wtuvutsqquz|upnnnkikmmklsux{zxuqlga_aejnswz|{rlppqw{uopy{yuy|ztomstrjgZQT[knf^aimnlnvywneRNW_gn\GGHF?:=FMOPRSPMIHHLKGC>9633M_jmsvy|~}}~¥«®¬¯³¶·³°®¬¦§¨oYJD?;<=BIFCCEJVgt ¡££¦¥¥§¨§§¨¨¨¨©©©«©¨§¦§§§¥¥¤¡fRMFECCGNMLNPPMOOLLNJECCB@?CJRY\[VSRSSTST©««¬¬¬¬¬¯°®¯±²¯«¬®¯®¯°¯®°¯®¯¯¯±±°¯®®®°±°¬«¬¯°®¬®¯°°¯°°¯¯®®®®¯±±²³³µµ´²±±²²²±±±±°±±±°°±±±±±³³³³´µ²²³´²±²³³³²±±²±°°°°°°°°±²±±²²²²²²²²±±²²³±®®®¯¯®®¯®®®®®®®®¬«ª©©©©©§§§¨¦¦¤¤¤¥§«¬¬ª¦¥¤¤£¢ ~{zxy|~~~~||zurs}wu}~} zsty}{vuxwusssy~ unmjgdbeiihisx||wpid`aehmruuuy{zxyxvw}ytqvyww~xoovz|xsrq_Z`hkjgif^\ZamookcPIMXgnlPFIIB<>FLPPQQMJJIJJIDBA>8422?Vdiqwx{|}}{zz{}~ ¨©«¬«©©®«§¡¢¥§©«ª©gIDAA;?DGD@>?AJ^p ¡¡¤¤¦¦§§§§¦¦¨¨§¨©©§¦§¦¥¥¥£¡ hUQKIG@BIKMMOPOMNKJJFDCA?>?DKRX\ZVTTRSTUSª«¬¬«ª«¬¯®¯°°¬¬¬®®®¯±¯¯¯¯¯®®¯°¯¯°±°®¯¯°®¬«¯¯°®®¯°±°¯°±°¯¯®¯¯°°°±³³µ´³²±±±±±²²±°°°±±±±±±±±²´³³´´´²±³³±±²³³³²²²²±°°¯°°±°°±±²²²±±±±±²²±±²²²±°°°¯¯®¬¬®®¯¯¯¯®®®¬««ª©©¨¨§§¨©¨¦¦¥¥¥¨¬ª©§¦¤£¢ }zyyyz{zxz~ ~wqmlpz{vv zz ywxzzxwvw|zqomhca_bhgfjsz|thb_biltvvqmqv{zzyvw{zxutrru|zqlp{~xqv|qeinqtwvl`\WYbihheWEHUcliVDBC?>AFMPPPMJJJHIIECABA:3114>ISbkouxyzzxvwyz|}}~~¥¥¦ª««§¥ª¬¯¨o]]\JDACCCBBDHTfx ¡££¤¥¦¥¥¦¦¦¦¦§§¦¥¤¤¥£¤¤ mVMLKIAAFILKMLMPOMJGFDBAABEGJQW\[WUTTUTUT¨ª««««««®®®®®®¬¬¬¯°±°¯¯¯¯°¯®®¯¯®°±°¯®®¯°®¯®®¯¯¯°°¯¯¯¯±±°±±±±¯®¯¯¯°±±±²³³²²±±²³³²³²±±°±²²±±²²³´´³²²³²±±±²²²²³²²²±±±±±°°°°±±°±±²²±±±±±²±±±±²²±°¯¯¯¯°¯®®®®®¯®¬®®®««ª©¨¨¨¨¨¨©¨¨§¦¦§ª¯®¬«ª¨¦¥¢ ~{~~|{{{zzzyy|~xsolmrwyuqpz }{||{zwttuvxxwqffjjhebcdhgfjtz}yl_XZ^`afgghotvvusqsturqpmptvrmov~}unv|zvtwyz{xpkkbZVY`dhdGCSeln[B;:<AEJPPPPLJJIGGGECAB@;4335589EPcnttvuttsqqsvvyyxy¢ª©«¬¬¬©¢ £«¨vgVLGDCCFKQ^mx ¡ ¢£¤¥¦¥¤¤¥¥¦¤£¢ ¢£¢¡lQJIJKHGHHGJKMNRQOJGFEB@BGJJKNU[\XUTTUSSS©©ª«ª¬¬¬®®¬¬«¬®±°®¯¯®®¯¯¯®¬®®±±¯®®®¯°¯¯°±±±¯°±²²²²±°¯¯¯¯¯°±±±±³´´²±²²³³²³²±±±±²²±±²²³³²²²±²³±°°±±±±²³³²³³°°±±°°¯°±±±²²²²±±±±²²±±±±²±¯®®®®¯¯®¬¬®¬««ª©¨¨¨¨¨§§§§¦¥¦¨¬®¬«ª¨¦¥¤¢|x{ }|}~~}{| {spprsstqkkp{ {z ~}~ ~xpkdbbdeeb\]`ceeefhhhjnsy{||{xtl]QRUQLJP^ipnjkmopqpnjfdenvsnnu~~|xspsx{}}~}|{vqsvodUSYcgfMDI]eeX@88;@HMPPQPMJJJJGEDCAA@=986535656IV_fijmpjedahlppmx£©®®¯®© ©«¬¬®®£~rfYPFDKQY]hy} ¢¡ ¡¢££¢¢¡ ¡¡ gQIFJNOJJGHJLPNNONIDBAAACEGHJLT[\YVTTTSSSª©ª«¬¬«ª«®®¬«¬¬««°¯¬«¯¯®¯®¯®¬¬¯°¯®®®®¯°±°°±²²°¯±±³´³³±±°°°°¯¯°±±³´´³³²±±²²²±²±±±±±±±±²²²³³²±²²²²±±²±±±²²²³´³±±±±¯¯¯¯°±±²²³´³²±±±±±±±±°°°°¯¯®¯¯®¬¬®¬¬¬««ª©©©¨¨§§§¨¨¦¥¦©¬¬¬¬«ª¨¦¥¥£ |y| |{~ }{yyywxww{xqpqw{ywunijpstxy} ~|}yneXPRV[]^\\^^bfhhjllnqsvyxwumd\QNTZWLINanoi[\dinomia^cdkqnlov{{zxwvvxz|||{xvtswtohYWZcfbOCAFPPK>99=BKOPRTPLJJJKHECA?>>=:864563248:BHIR[^ZWVRRW\][u¡¦¬¯®®®¬¨~~~¬«°¯¬¥ o[KLRU]ow| ycTMFGJNKJJJJNNILONG@==?AEIKKNRX\]ZVRSSRTT¨ª««¬¯¬«««¬¬¬¬«¬««®®¬«¬¯¯°®®¬«¬®®®®®®¯®¯¯°±±²±°±±³´³³²²±±±±±±°°³´´´´³²²²²²³±²²²²±±±±±±²±²²²²³²°±±±²²±±±²²³²²±±±²°°¯¯°°±±²³´³²°±°°±±±°¯¯¯¯°°®®¯®®®¬¬«¬«««ª©©©¨§§§¦§§¦¥¦©««¬¬««ª©§¥¤¡~| |{ zvtuwvqmnt}|spqvz~~~ypjhlotx} }y}qgWJKMSZ^_^_]`ehhmprrqpqvwvsiYLKM[kjRIRajhcXV[bikjdSShlgcchouurtwxzzzurqtwsrttsjgaXY[]_[QGC@IQME>:@DJOPRSMJJJKJIGA<8788764358620048859?DHIE@BJJGQ~£©¯®««¥{x{zz{}~}~ ¨®°°¯®¬«ªª¥|bLKRXYjw{~ pOFGCBEHJKKMKNMFEJLH@<<>CIPRQRUX[ZYWRQRSUU©ª««¬¯®¬¬««¬®¬«¬®¯°¯®¬««««¬®®¯°°±±±±°°±²´±²³²²²±±±±±±±³³³³²±±±²±²²³²²³±±±±±±±±±±±²²±°±±±±±±±±±±²²²±±²²±°°±±°±±³²²²°¯°°±°°°°°°°¯¯®®®®®®¬¬««««ª¨©©¨¨§§¦¥¥¤¤¥§©««««ªª¨¦¤¢}} ~{vwzxokkv~~ztsx|}tkhkt{} {~ {tl_OLNQX]aba`acegkpstsmkpuutjZMJN]swdOTbeb`[Z`gkkh[HGhph^[botrmnsttutpjhmvrnruphe_SRVYYUVRG=DSXRF=?EINPPPMMLJJIGE>:73112651144/,.2589:;>?>:9=AB<W¤¨°©¦¦{yxwxz{{{}~~ ©¬¯°±±±®«©§s_WUT]mrx}fJGFDA@BIJKNPPPLFHIFBAACGJOTVWWWYYXVVTRSVV¨©ª«¬¬®¬¬«¬®¯¯¯¬«¬¯°®®®¬¬¬¬®®®¬®°¯¯°±±±°°±²²±²³³³²±±±±²±±²³²²³±°°°±±²³³²²²±±±±±±±±±²³²±°°±±±±±±±±±²²±±±²²±¯¯±±±±±±±²²±±°¯¯¯°±±°°¯®®®®¯®®®®®¬««««ª©¨©©¨¨¨§¦¥¤¤¤¥¦§ªªª«ª¨¦¥£¡ ~||ojjqxxz}ujhr||{}zz{}{|{x| |xsleUQRUZ^addcefgiinqstonrttsl]KGKYvy\YefhjhbbbbcZKCEcqk^[bnrqppponnonkiiid_ennie]PJOSQMUZOA>ENRM@=CLPPPPOPNHGFC@<:852258410/110.038::89<<968=<>q¤§«®¬§¤¢xuuuvyzzzz||}~¡§«¯²´²°§¡}naRW]jtvz| _HECBA@DJJKKMPQSOJIGEFEFHJNRUUVVYYWVUVTTTS¦¨ª«¬®¬¬«««¬¯¯®««¬¯°¯¯¯®®¯¯®®®¯°²°°°±²²±°°°²²²²³³²±±±±°¯°²³³³³²±±±±²²³´²±±±±±±±±±±±²³±±±°±±±±±±±±±±±±±±±²±°¯°±±±°°±±²±±±¯¯¯°°°°¯®®¯®®®®®®¯®®®¬¬®¬««««ªªª¨¨¨¨¨§¦¥¥¥¤¤¥¨ª«ªª©¨¦¤¢ ~|{|}xikps{ |ohn}ywvwvrpqvywsrrsw zuokh`ZXZ^acfhhjlnppsvwxvvvtrpkZJIMZxkbnoqz{i^^\XKCEIZlja_fputttnhiiipsqpb[[Zcjf`]ZJGGFCPXWF99=HKA;ANQRQPQQNLIEA=;865469830.-.15448;<:77:@?<:<8N¤¨©©©¥£wtsttuvwyzzz{{{|}~¡¨®²µ´´³²®ª§¤ {bWU\hnrw{~xRAABDFGGJJMHHPQQPMJGEDGGKOPPQQRTYZXVUUVUTT§©©«¬«®¬¬¬ª«¬®¯®®®««¬®°°®®®¯±±¯¯¯®®®¯±±±°±±±±±±±±±±²±²²±±±°¯°°±²´´²²±±±±±²³²²³±±²±²±±±±±±²²°²²±±±±±±±²±±²±°°±²±±¯¯¯±±±±±²²±±±¯®¯°°¯¯¯®®®®®¯®®¯¯®®¬««««ª©ª¨§¨¨¨§¦¥¤¤¤¤¥©«««ªª©§¤£ }z{}}~}||{yxxx{¢£££¡¡¢¡¡vpqv} ~rljt}yvutsqnmnrslijlpv}~{xwx|~yskjje`\]`bdgkmqvwuw{~}{zzuromiWLMS`vwiwyw|p^aeaMBGOV^dfgjqupjg`[]bcmyyxm\VWaf`Z^dWF=<=GQSJ;569<;:BNRUTRRQQPLFA?;75579;:510,+.4999;=<:9:>@@;:6c ¥©¨¨¨¥£|uqprrrstvyxxzyzz{|}~ ¥¬²³µ·¶¶²°¦~lZUTXbkrwy|b@@ADEGGHJJKJIJLJJJFCCCFJPTSPQRSU[\YWUTTUUVªªª«««¬¬®¬«««««¬¬®¯¯®¬«««¬°°®®°±±±±°¯°°®¯±±±¯°±±²³³²±²±±±±±±±°¯±°°±±²³²²±±±±±±±±±²±²±±±±±±±±±±²±±±±±±±±±±²²²³±±±±±²²°®°°°°°³³±±±±°¯®¯°¯¯®®®®®®¯®®¯¯®¬¬¬¬¬¬¬««©¨§¨©¨¨¨¨§¦¤££¢¤¥§ª««««ª¨¥¤ yojjnpqrtwzywtttvwuuvyz ¤¦¥¦¦¦¥¥¥¤£¡ wrrx~|vqoprsomkkjhkpuz~}wutw~~xokhjljgda_aehms}~}{|~yvusolihXPS\guqx{wwxqekuoWKMZ`^ahmoqqme_[VV\aisussfUV^ca\^ecQ@:9>HMI@6126:=FNRUTSRQPMKGC@<979;;<:875/--1579;=>>>><:<:5@w¡¦©§¥¤¡ vpnnooopqrstvyyxxyyy|} £«°²·¹·¶´³±¨ xjYUTX`iqsuy|~}~ wL@ABDDEFGIIKPMIHIJIC@??GLRVVWVVVX\\ZVTUTSST¬«««««¬«¬«¬¬«««¬¬««¬®®¬««««ª¬¯®®®®¯°±±°°°¯®¯±±±¯°±°±²²±±±±±±±±°±®¯°°°°°±²²²±²²±±±±±±±±±±±±±±±°±±±±±±±±±±±±±²³³³´´³±±±²±°°°°°°°±²±²±¯°°¯¯°¯®¬®®¬¬®¯¯¬«««¬¬¬¬«ª©§§¨¨¨¨¨§¦¥¤£¢¢£¥¥¨ª«¬¬ª¨¥¤ vgbcilmmnpssrkjmsxxuuwy}¡¥¦¨©©¨©¨¨§¨§¦¤¤¢¢~|wx~{vpmnonfbcegkrz}~}}~~xniffknpqoke`dirz}xsopqmhgd[VYajt}swxronpuzzumXRaomknpqqrodabc_\`gjklplZV\ejheegVD:7;DFC>7324?KMMOQQQQQOLJFB>;:8:::988874335689>@A@@@?<75*Y£¥§¤£ snlklmnnooprsvuutstvy{£ª®±µ¸···³¯¬©¤w\RPOPYclmrvxy{|~~ aD@@ACCCDEFGKOMJIIIFA??@GLPX[]XWZ[\\ZVTUUTTU¯¬«ª««¬««ª«¬«««¬««««««¬««««ª«¬®¯¯°°°±¯¯°°°°±±²°¯°°°±±±±±±±±±±±°°®¯¯®®¯°°°±±²²±±±±±±±±²±°°±°°°°±±±¯°±±±±±±²²²²³´µ´±²±±±°±±°°±±±±±±°¯°¯®¯®¬¬¬®®®®¯®¬®¯¯®¬¬¬¬«¬¬¬«¨§¦§§§§§¥¥¥£¡ ¡£¥¥¨ªª««ª¦£¡yg`aimoonnqsspnou~ ¥¨ª««¬ª««¬¬¬¬ª«ªª¨¤¡{z zz|~{zztnnmh\UV^fmt{ vnhffgjov{|zuoqw~zurpnoqmhf_Z\ehlrz~yppsrmjqz}}yeRawxvyzxwtthajtrddknkginfY[fkliecSE<8:=>:88656BOPOPQONNPOKID@<;:778778997679;;;=BCBBB?>:4/Dx ££¤¡rkjhhiiklnpooqrrrqstwz¤ª¯±´µ···´²±®© ~hTPLKOS[bmmqtvwyz{|{{}~ vQ;>@@@?@BDDFKMLJECC@?@@BHLSXYZYXZ\\YXUSUUTTT¯¬¬«¬¬«ª«ª«««¬««ª««««««ªªª«¬®®®¯°¯¯°¯¯°°°¯°±±°¯°°¯¯°±²±±±±¯®°°®®¯®®®°¯°±±±±±±±±±±±±±±°°°±±±±±±°°±±±±±±³³³³³³µ³²²±±±°°±±±±±±±±°°±°¯¯¯®¬¬®®¯¯®®¯®®¬¬««¬«««©§¦¦§§¦¦¥¥¤£ ¢£¤¥¨©ªª«¨¥¤¡ zjccgkoqpqtxxxx|¡¦¨ª¬¬¬¬¬®°±±°¯¯¬ª¦¢zwtx|}zyzxwvlhji_TRUbkqtywlhfhljgmy~~|vpprsrokhf_Z]jprsvxxqjlnjiq}{yyradw}yx~{xvwrfgsumpswrgglj_\^bggaUNF?:::8458878@INOPQONNPPMJFC@<8865568876656778:?ABAB@>==>h ¢ ¡tjihhhghijmonnmmnooptw¡©²´µ´¶·¶¶µ´±®¥s]PGEGGLWadjnprsvyyxxz{} tS;59:<>?>?@DFIJLJFB?>>?BEHIORTUXZ\][XVUTUSSRR²¯¯®®«¬¬«««««««¬««¬««««¬¬¬«ª«««®¬¯¯¯°°±¯¯°¯±°±°¯°°±®®°±±±°¯®®°°®¯®®¯°°¯¯±±±°±±±±±±±±±±°±±±±±±±±°±²±±³²³´³µ´²²²²±±°±°°±±±±±±±±°°°°°¯®®¬¬«¬®®®¬®¬¬««««««ª©¨¨¦¦¦¦¥¦¥¥¤£¢¡¢¤¥¦¨ªª©©§§¦¤¢zmfcaclrtuwyz} §ª¬®®®®°¯¯¯°³µµ³±°¯©§¢{uqqomnnopsskabcb\VX]gorsv~}tmhdeqvjdju~|zxwuuvuqljjic]`hnpqrttsjff`^equpmuyrmw{rmvywx|zlflnmt{}xkhlmh``cee_PLHB<<9757:;99AFJLOPPPOPPOLIEC=9=:57998889855699<?>>@@ADJOv zkggffdceghihgfghjlnq{£«¯²³²³¶·¶¶¶¶´²«¤sSB@>AFINW_hhmoqtuuwxzz|} }y_303457<?><=CFHJKJF@<;<@CGIHIMQSUX[\[XVUTUTRRQ³±°±¯¬¬¬«««ª««««««¬«««ª¬¬««««¬®®°¯°°±°±°¯°°°±°°°°¯±²±°°®®¯¯®®®¯¯¯¯°°°°±±°±±±±±²±±±±²±±±±±±±°°±²±±²²³´´´³³²²²±°¯°±°±±±±±±±°¯¯¯¯¯®®¬¬¬«¬¬¬¬¬««««««ªª¨¨¦¦¥¥¥¥¥¤££¢ ¡¢¤¥¨©©©©¨§¦¤¢ {m`VTQ]ktuvx{¢¤¥¥§§¦¥¥¥£ ¢¦«¬¯±±°¯®°±±±±²µ··µ²±±®«ª¦¢xpnmfabddejg`\]`_\Y^hpxxww|{{ztlgddfrzpjlqx zuvwyyvtolnqlfahokhjkqqqkc_ZTOPdhgryyuvvniqvx|reghjpz|wmkqurfefgdaURQIDA<98:<<:<BFIJMPOOPPOOLIGFC@=<;:98789:;869<>==>?ABDEE`pkfccbaceedbbcddgikmx£«¯°±±³¶·¶¶¶¶µ³®¥eND?@CCEIQX^beinqssuwxy{{}~}~~~~~~~~yteH852478;>>;:@GIGHG@:778=CGIIHIMNQUXZZWUSQSSRST´³±²°®¬¬¬ª««««««¬¬««¬«¬¬¬««««¬¬¯°¯¯°±±±±°°±°±°¯°°¯®¯±²±°°®®®¯®¬¬®¯®®¯°¯°°°°±±±±±²²±±±±±±²±±±±°°±±±±±±²µ´³³´³³²±°¯¯±±±±°±±±±±°°°¯¯¬¬¬¬¬¬®®®®¬¬«««««ªª¨§§¦¦¥¥¥¥¤¢¡ ¢£¥§¨¨¨§¥¥¥¤£¡znXGJLUcptw} £§¨©ª©ª¬¬«¬¬ªªªª©¥¥ª¯°±±±°°±±±±²´¶··µ³±±¯¬©¥¡qmd^\^acedb_`acachox}z{zvsw|yrjgddedhrxywtt{ }vuutsrqnptumgfnwqedgknpnec^QJJ[bhrx{xtsojswwx|yjfjprsuojmtwujfhifc^]\TNF=;;:;==>CHIJLPPOOOONJFBDHE?==<:8668;;888::9:>BDCCDBh}rhbbccdedabefgijlm£¨«¬°³´¶¶··µ¶·³®§£z_RFBCC@@@CNRZajllmprtvxwxz|}}}~}{|{{~~|zz{{zz{}}}}}}}~~|qaF:3167::;=>=:>DIHFC?<989=ADFJKLMMQTVZ[YVSQPQRSU¶¶´±°¯¯®¬«ª««««««¬¬«ª¬¬«««««««¬®°°®¯¯°°±±±±±±°®¯°°±°°±±±°±®®®®¬¬¬®¯¯°°°°°±±±±±±±±±±±±±±±±±±±±±±²²±±±±±´µ´³´³³±±°°°±±±±±±±±±±°±°°¯®®®¬¬¬¬¬¬¬¬¬®¬¬¬¬¬¬««ª©¨§§¦¥¥¥¥¥£¡ ¡£¥¦§§¥¤¥¥¤££ {nTGJPV_nx¦ª®°°±°°¯°¯¯°¯®®¬«¥£¤©«®°°°±±±±±±±²´µ¶¶¶µ´²±®¬«¨¢|g^^`cfhggeeefgjox {vqrvvpjggfeb]Z\p{{vty{vqpoooqtttojgq{wjcehmqtrnlaQRX^huz{ywwvruwwuuywmiktwtpomlquqigijgb_^a_\O@=>;:>>==BEGJMPPOPNMIB>BFFD@?=<:778987:98;<>ABDCCBIzukhhigbdgmvxz¢¤¦ª®²³´´µ·¶¶µ±®«¦_PEB??<98=?EMQS]_bimqsuwwxyzzz{zyyyyz{zyyyxxwvxzzyz{|{{{zyxkSF5++.6;>===<<;;?CFDCB=;<<<=?FLOPPPRTX]\YWTRQRRRS··¶µ³°¯¯¬¬ª««ª©«««¬««¬¬««««««®¬¬¬®°°°¯¯¬®°°±±°°¯®°±±±°°±²±¯¯®®®®®®¯°°±±±±±±±±±°°°°°±±±±±°±±±±°±±²±±±±±±´³µ´³³´³±±±°°°°°±±°±±±°¯¯®®®®®®¬¬¬«««««¬¬«¬¬¬¬¬¬««¬««ª©¨¨¦¦¥¥¥¤¤¢ ¢¤¥¥¥¦¤£¤¤¢¡ zoXMOW[dw¡§¬¯±³³´µ´²±±±±±±°°°°¯®«ªª«¯¯¯°±±±±±±±²´´µµµ´´³²°¬¬©¤j`cfjklmolifeiq} ~vppqokijjif_YUTiz}yx|}snmmoswvsstmhoz|vjfglrx{wupbZVXcw||{|~|yzyvtruuplmsvurqojnsojhikg][^beg`MHGC===97:AGJNOONMLMMEACEGEDA<;98:::99<==?@CDCB@A?O}ywy{}~ ¤©¬®°±²²µ¶µ±°®«§{W@>>=<<;:::<?ACKNSXaloqsttvwvutuwwwwyzzxxvstttuwwwxwxywuvsfF64.+/358;;=<:;;<99?CDC<=>?@AFIKLORSTW[^YUUUTSSSRRµ¶´µ´²°¯®«««©©ª««¬¬¬¬«¬««««®®®¯°±°¬¬®¯±±¯°°¯¯°¯¯°¯°²±°¯¯¯¯®®®®®¯°°±±±±±±°°°¯¯®®°±±±±±°°±±±±±²³²²±±±±²²³³³³³³±°°¯¯°±°°±±±±°¯®¯¯¯®««««««¬¬««¬¬¬«¬¬¬««««ªª©¨§§¦¥¤£¤¢¢¢¢¡¢¤¤¦¦¥¥¤¢£¢¡~ymYQT]bu ª±²³µ¶¶··´³³´³²±²±°¯¯¯®®®®¯¯¯®¯°±²²±²±²³´´µµµµ´´±¯¬ª¦¢yjjlnorwyuigfl{ zropomlklkjhb_^`o~zyz{zwsroolloptzzuvyzplmu}~wqmnrx|yvuqbVW_nvy}}yzyuvvuvtnnnmqspmjjnnmlkmj]VZ`hkiYQRMC=8326?FLMNNMJJLLGEEHJGD@<869=??>>>?@A@?@@=<>>Wt ¡¡¢¡¡¡¤§ª¬®°±²´¶³°®©veSB<:9;;96679;;:<ADIP\fjnorssttstuuuvwwutrooprtuvututstnhZ@12..0287555769:;>96:=AC>=>@CEIJJJKPTUX\]XSRSTSRSQR´·´µ³²±°®¬««««©ª¬¬¬«¬««¬¬®®®°±°®¬®®²²±²±¯®¯¯°¯¯±±°°¯¯°¯¯®®¯¯°¯¯¯¯¯¯¯¯¯®®¯®®°°±±°¯¯¯°±±±±±²²²±±±±±±²³³³³³±°±±°¯°°°¯¯¯°°°°¯®®®¬¬¬«««««¬¬¬«¬¬¬««¬¬««««ªª©©§§¦¥¥¤£¤£££££¡ £¥¦¨¨¦¦¥¤£¢¡|wmYRRb~¤®¯±´µ¶¶···¶µ´´µµ´³²²±°°±±°¯¯°°°°¯¯¯¯±²²²²³³´³´µµ¶µµ´±±¯ª§¤qqrqqswvqigkw }x|}urqrsqpolklkjinsyz|qopqrpmjdbcglw}~|x}tppt{zutuxxtsuuo`Z`ksv~xvwwwxvwunklkmsronllkmnnnk_X[]egc]YWQF;3./6?GMNNPOKJJIFFGKJHGGEB@BCDB?>==?CEBABABCI`u ¡¢¢¢¢¤§ª±²µµµ²¯¯°°ªfK@=9533456897779<<?FNX`cjpopqpoppqrrsrrokkmnprssrnniYKG:1/,-248AE>;=??;:;><<?>>@BAACEHKMOOOORTX[]ZVSRSQQQQS³¶µµµ´²±¯¬«««ª©ª««¬®¬¬«««¬¬®¬°±°®¬®®®®°±±±°®¯¯¯¯°°¯°±¯¯¯¯¯¯¯®®¯¯¬¬¬®®®¯¯¯¯°°°¯¯¯°°±±°±±±²²±±±°±²³´´³´²±±±±°°°¯¯°¯°°¯¯¯¯®®¬¬®¬«««¬¬«««¬«¬¬«¬«««««ªª¨¨§§¦¥¥¤¤¤¢£¤¤¤££¤§ªª«ª¨¦¥¤£¡ ~|zvn[JSt£¬²¶¶¶····¸·µµµµ¶¶¶µ³²±±²±±°¯¯°°°°°°¯¯°±²´´´´´³´µµ··¶µ²²²¯«§¥¢xvropplifdo~~|vipvokqxzztpnmnmiffoy~wlkkmmligc`__bw}{{|urqtz{yxyvporu{udalsu|tpmqvrompojiiklortutmghjkmj`ae`____^[TE71/06?JPOMPPLJIGEEHJGCDEFGHECEC@>=>@EHECDDEIQg~ ¡¡ ¢¤§¬±²²²±®¬®±¯ª¤ dPG>73256779=<;8888:<@AEKT^efjnnkijknnmjeaejlmppol_HA3.4.,,,/49?CGGFHHEDC@?BCDDBACEGGGGHINPQQOQSWYXVRPQRQPRR²µµ´¶¶¶³°¬««¨§©©©¬ªª«®¬¬««¬¬¬««¬¬¯¯®®®¯®¯°±°¯¯¯¯¯¯¯¯®®®®®®¬¯®¯¯®®¬¬¬«¬®¬¬®®®®®®°¯®¯¯¯°¯°±°±²²±±±±±±³´´²²±±±°°±°¯°°°°°¯¯®¯°®®¬¬®®¬«««¬¬¬¬«««¬¬«««ªª««««ªª©¨§¦¥¥¥¥¥¥¤¥¥¥¥¤£¥©««¬«©§¥¥£¡ |zyun`Pg¢¯²¶·······¸··¶¶¶···¶µ´³²²±²±±°¯¯¯°¯¯¯¯±²³µ¶µµ´´´´µµ¶¶¶µ³³±®©¦¡{wqmkifb]\dnnnkjebhkhiu}tmnpsod``l|wpnklnomkhe`_frwxy{}upruyzvtronqvzwhelnkpvqkhgjpmgdeedfinmhkqttjabeeikgjle`_bdc`YJ83358=KPOMNPNJJHEDGJGDGHFCCB?==?@??CGGFDEEEHYq ££¢ £¦©¬«©©«¬«¨¥¢pWI<6687788:<<98655568656?JSY]\WRR[`hjcXNIJX^_`ZMH9+0001.,+./38?DFHIKJFHJIGHIIIGGJKKJGCCFJJMNKNTVVUSRSSRPPRQ²µ¶¶¶··³±««§¦¨¨©ª©¨¨««¬¬«¬¬¬¬«««¬®®®®®¯°°¯®®¯°¯®®®¯«¬¬«¯¯¯¯®®«ª««¬¬«¬®®®¯®¯¯¯¯®¯°°°²²±±±±±±³³²±±±±±°°°°¯®®°°¯¯¯®¯°¯¬¬¬¬«««ª««««««¬«««ªªªªªªªª©¨§¦¥¥¥¥¦¥¥¥¥¥¥¥¤¥§ªªª©§¦¥¥¤£¢ }zxvtoee¡¯²´·········¶·¶¶·····¶¶´³²²²±±°¯¯¯°¯¯°°±³µ¶···µ´´´´´µµ¶¶³±²°«¦¡}ogd``^YTRT[_dcbcfjggjy~yrosxvla\ax zwspruwuoifcelorvyz}~~wosww~xqlklmoruskjsohgknjgddfhgfhjgdipmeflnj]X]ceggehid`addca[R;6777:HPPOMMMLKJIIJJHGHHGCA?<89>@BBDDEHGFEEGRr ¥¨¨§¦¤¤¦¨¨¥¥£ ~`F9889999:<;:::<;951/2324;@<83105AJOLB3(-1;=753*+*+,/00.,.1355:=<>BIJGIJLMMLKMLLMJKJEBDFIJMNOPTUTRPRUURRQSS±µµ¶¶¶µ³±¯¬ª¨§¨¨ªª©©©ª«¬¬¬¬¬¬««¬¬¬«®®¬®®®®®¯±¯®®°°®¬¬®¯¬«¬«««®¯¯¯®®®¬ª««««¬«¬®°¯¯°¯¯¯¯®±²²²±±±±±²²²±±°°±±°°±±¯®®®®®®¯¯¯¬¬¬¬««««««««««««««ªª©©©©ª©¨¨§¦¥¥¥¦¦¦¦¥¥¥¥¤¥¥¦§§¨¨¦¥¥¥¥¤£ ~{yvtrokwª¯³µ¶·······µµ¶¶¶·¶·¹¸··µ´³³²±±±°°¯¯¯¯¯°±´µ··¸¸µ³³³³³´´´³±°±°«¦ ~`X[[[YUQORY`bcfkrtokktxwtqt}vkgnz~~wpsvzyohfhoqnprssw|~wpsyz}|yupljkrvsqqlkyvpjikhfdcflnnopnhckjb`dc_UNVcgeaadca______]WA96777FOPOMLKKKLKKKJFFFEBA@?>?ACDDEFEFHFFEDEC[v~£¥¤¡ ¢¢¤¥¥¥¦£ zeM?;;;::;;::>==>;862/00//142.+-/1256//+&&')+((+*('**.010067896688:@GJJIKMLLPPOPOLFFFCABFIKOQSSVVTRQPQRTTSSR²³µ·µµ´±¯©¨©¨¨¨ªª©ª««®«®¬««««¬¬¬¬¬¬®¬¬®±¯®®¯¯®¬¬¬®¬««ª«®¯¯®¯®®¬««««¬«¬¬«««¬®°¯®¯®¯¯¯®®°±±²²±±±±²±±±±°°°°°°°¯¯®®®®¯®¯¬«¬¬««««««««¬¬«««««««ª©©§©©©¨¨§§§¦¦¦¥¦¥¥¤¤£¢££¥¥¥§§¦¦¦¥¥¥£~yxusrpv¦°²µ·······¶´´¶¶··¶¶¸¸¸·¶µ´³²±±±°¯¯¯¯°¯°±³µ···¸´²²±²³´²²°°®©¥ hZ^`]ZURRX_ejklow{ysqssrmmyvsz xlkpxynhhntsqnnnow~|tssy~~{yxuoihiu|wpkeesyysmhc`_`hqutomlkedca_^]ZSMO]efb`_]]][YYZ^aS?99;;>JNNMNNLKJKKJJGEFEB><?BEFFFEFHHGHGECCB@?Gev}| ¢¢ ¢£¤¥¦¦¥¡}nVD@;865677779<<;8765442//00.,+-/00/-*(&$$$&()''&%',,**-14:?=<:89<>AEHKMOPPQSSQQPKEDDFEEJMNOORUWWUSQOOQTTTSP°±³¶µ´´±®¬«ªªª¨¨©ªª«ªª¬«¬¬ª««¬«¬¬¬«¬¬¬¬¯®¬««¬¬¬¬¬¬«ª«¬¯®®®®®¬«««¬«¬¬«««¬¬¬«®¯®®®¯®¯¯°±±±±±±±°±±±±±±±°°°°¯¯¯®®¯®®®¯®®¬¬¬¬««¬«««««¬«««««««ªªª©¨¨¨¨¨§§§§¦¥¥¥¥¥¤£¢¡ ¡¢¢¤¥¦¨¨§¦¦¦¤¢{wwussp«°±²µ¶··¶··¶¶µµµµ¶¶¶······¶µµ³²±±°¯°¯°°°°±³µ···¶³±°¯±²³±±°®¬«©¦¢wlljd]YXZdkmrsrty~}zvtriadtzx~yjdgrwplkrwwuqppr|uw{}~|{xrniekvvo`[`nvyvpja^_ahqxysmikjgbbc_\][SPYdggc\WZ^[UTSURA<=?BDGKNNMPPMKJKKJGCADGDBABBEJHEEEEEGGFC@>>===Ieu{ ¡¥¨««¨¦£vX>=8532236;=<;=>=:87788511/-+*,,,++)('$##%'+.-)'(-11,'*/49??>?>?ACDDHNOPNRSSQQPONKKJIIIMPMLORTVVTRQPPQRSRQQ¬¯±²´µµ³¯«««ª©©©©©©«««««¬««®¬ª««««¬¬««®®¬««««¬¬¬¬®¬«««««ªª¬¬®®®®®®¬«««««««««¬««®®®¯¯®®°±±±±±±°°°±±±±±°°°°¯¯¯®®®®®®®¬««««««««««««««««ª©ªªª¨¨¨§¦¥¥¥¥¤¤¤¥¤£££¢¡ ¡¢¤¥¦¨©¨§¥¥£ }{wtsssx£¬±²³´µ¶¶µ¶µµµµµµµµ´´µ¶·····¶¶µ´²²±°°°±±°°±²´¶··¶³°®®¯±±±±°«©§¤¡yupga`dgpvxwwyxy||zvobUSWdloz |ldbhsslkrvyywvsx yrx|{{{~xjgmqr\R_nosqoj^\bjkmtvspiikidfgbacc\WZ`bc_ZXY``SOOME=>CGKLNNOPPQOJIIJJJGBCFJIHFA?ADA?=>@CDEBA?>=:953Cg} | ¡¢£§««ª§¥gE:4455436<@DCA>=<:99974.*)'')()***)''&&%%&*.-)(),12/*+045:;=ACEGGEDIJLKHMOMKKKMNMLJKKJLMJKPUUSSSQOPPPQPPPRª±²³´³²¯¬««ª©ªª¨©ªª«««¬¬¬ªª«ªª«««¬¬ªª¯¯¯¬«¬¬¬¬«¬®¬¬«¬¬¬¬«¬«¬¬®®¬««««««¬«««¬ª««¯¯¯®®®¯°±±±±±±°°±±±³±¯°±°°°°¯®®®®®®®®®¬¬¬¬««««««««¬«««ªª©©©©¨¨¨§¦¥¥¥¥¥¤£¤¤¤£££¢ ¡£¥§¨¨¨¦£¤¢ |zwtsst¥±³³³³´µ¶µµµµ´´´´´³³´µµ¶····¶µµ´³²±±±±±°°±±´µ¶·µ³°¯°°°°¯¬«©¦¤ xrjjoppw}{xxxxspnmj^RMLMZfn}}{{~}necinoihnsy{~{w|sbr|wuty}ofimoZM]rnlmojXVctqokinj`elhbeheehfa]\\ZWSUW\bbTNJIFACKRWUUSQPPOIGHIIIKJGFGHHGC>=?A@@?<;<;<;=>=<8633,Nt~ {{~ £§©ª©©ª¬¨¤¢¡rM:54544789<BEDB@?=<:853320---+++**+++*&&)),--)&%*00.-+0799:=@DHJGBCGEGIDEJKHHGJLNNJLLLLKKNRTRQRPNOPOPRPPPS¬®°±²²±±¯«ª«ª«©©©©ª«««¬¬«««««ªª«««««««¯¯¯¯®««¬®¬¬®®¬«¬®®¬«¬¬¬«®®¬¬¬¬¬¬«««««¬¯¯®®¯¯¯®¯¯±°±°±±±±±°±²±¯±±°°°±°®®®®®®®¯®®¬¬¬¬¬¬««««««««««ª©¨¨¨§¦¥¥¦¥¥¥¥¥¥££££££¡ ¢¤¥¥§¦¥££¡ }zwtssz¨¬°³³³³³³´´´´´³³³³´´´´µµµ¶·····¶´´³±²²±±±°°±³µµµ´±°¯¯®¯¯®¬¨¥£ wpotutw}}vttsja[UTRNLLS]em{xuw|qjjnlhccgly}y|aNYtxaVZeo{~wmjjgaTNTclmlokXT_rsmebed[`kibdhedec`^ZWUPNQX_a_XRKHHHJSY[[WVRQPNHGJIFEFIHGEEED@@BCCDEDA><888:;:99954/1Yu{~ ~|z}£§ª««©¦¡xjR830//2677:<>ABAA@?;;;:;96441/--+-11.+((,,--.,'$*0211//5=?@AADEIGBBEDDGGDGKJJHFGLNLNOPMJMQRSQQPNLMOOPPPQQT¯®¯±±°¯«©ª©«ªªª¨©©ª¬¬«¬«¬¬ª««««««««¬¬¯®®®«¬¬¯¯¯®®¯®¬®®¯°¯¬®®®®¬¬®®®®¯¯°®¬¬¬¬¬®®®®¯¯¯°¯®¯°±±±±±±±±±±±±±±°±±°°°°®®®¯¯®¯®®®®®®®¬¬¬¬««¬«ªª«««ªªª©©©§¥¥¥¥¦¥¥¥¤¤¢¢¢¢¢¢¡ ¢¢£¥¦¦¥¥¤¡ ~{xust~£©«¯±²³³²²³³²³²²²³³³´´´´´µ¶····¶µµ´³³²²±°±¯¯°²´³²±±¯¬®®®¬«§¥¢vsuwvuz|tqng[TPPPQNMR]cgn{vtpoot{tqrtjc_`dmz vUGLTUIFITbpz{xpondZSQQTenmnj`V[loibaa_Z^gheegda``^\YWVRRUZ^]ZYXLFFLT\_`^ZZVUROIJLGCDEHIJHFEEEEEEDCDDB>??;:;9899950/+Hkx{~|z¡¨¥|z}¡¤¦¥¢ seXP9/-.26777899;;:;;;;>@@>;9:83213456431./00.,++**/4:824449<=@ACCEGDABCFJNMIKNOJFFILMQRROMOSUSQPONLOONOOQSSS®¯®®¯±°¬ª¨¨«ª©ª©©©ª«¬«ª««ª«««««««««¬¬¬¬¬®¯¯®¯¯¯®¯®®¯°®¬¯¯¯¯®®®¯¯®®®°°°¯®¯®®¯¯¯¯¯°°¯¯¯±±±²±°±²±±±±±±±°±±°°°°¯¯¯®¯°¯¯¯¯®®®¬¬¬¬««ªªª««««ª©©©¨§¦¦¥¥¥¥¥¥¤¢¡¢¢¢¡ ¡¢£¥§§¦¥¤£¡ ~|zyutw¥©«°±²²²²²²±±±³²²²²³´´³´´µ¶···µµ¶µ³³²²±°°¯¯°²²±±±°®¬¬¬««««¨¦¥¢ wvzxqow~|vpmg\TQQSTTTT[abeksxyrpsoihfgknt}~xz|xib`airy}xeNHILLKJKOZqxywrqqg_^\ZW^ghede^\glg\\^YV[bdcdea`_^]YVYZXW\aaZTSPFGWahnroa[ZVQQPNMIB@BDEHJHFGHFDCDCA>>?BA>;::987873-+-Aauwuz|yyª¢}} £ ¡ nXE5.0578889878;:8344/$&.488554455675341//01/,*+.345::47;:8658?BCEFHCDFEGKMJJNPONLLNNPRPPPQSSOMNMLMOPPRQRQRP®®®¯¯¬¬««©©ª¨©««ªªª«¬«¬¬¬¬««¬¬«««««««¬««¬¬®¯¯®®¯°¯¯¯¯¯°¯®®®¯¯¯¯¯¯°±°¯®®¯¯°°°±±±±°¯®¯¯¯¯°¯¯¯°°°°°°±±±²±°±²±±±±±±±±±±°¯°±°°¯®®¯¯®®®®¬¬¬««¬«ªªªªªªª««©¨¨¨¨§§¦¥¥¥¥¤£££¢¢¢¡¡¢£¥¦¦¦¥¤£¢¡}{ywttz¥¨ª¯±°±±±±±²²³´³³²±²³³³³´µ¶··¶·¶¶µ´´³²±°±¯¯±²±±±±°®®««ªªª©¦¤¤¡zyxsmmwvqojgaYVXYYWVX[]^]aedjpe_bccbeimqs{}z|{icccmttuoeWOLKNQSX[\^mvtqonqnhgghdaaba^^ccgg^UW[TRV\]\_aaa]]]WRY^[U[bbVPPKIh wd\XTSQPPMGBA@AFGEAAEGGGFECB@>BD?:9:;887862,)+.>Ydjuxzy®°°¯®® i{ ¥¤ xaI:41246998;<=?=<<:>=:75445699655566421210121-.6:9318;98677767=DIKHLLJJJIGIJIIIMNSTTRQPNNQRRPOMLNNLMOPRRQQOO¯¯¯®®®®¬¬¬«ªª©©©ª©©©©ª«««««««««««ª««««««¬¬®¬¬®¯¯¯®®®¯±±°°®±±¯¯®®¯°¯°°±±±±±°°°°¯°±³²²²±°°±±°±±°°°°°±±±±°±±±±±±±±±±±°±±±±±°¯°±°¯¯¯®®®®¬¬««¬««««ªªª©©¨ªª©¨§¨¨¦¦¥¥¥¤¥¤££¢¢¢¡¡ ¢¤¥¥¥¥¤£¢¡¡~}zxuut{¥¨ª®®®¯°°°±³³³³²²±±±±³³³³µ¶¶¶¶µµ¶µµ¶µ³±°±°°°±±±±¯®¬««©¨§¦¥¤¢ zwtmiosommmia]]bc^YX]b_\]a_Z_d`\^`diorutuz~{{~~xiggflnluwplgb[Z]\[\^difaclnkhjsuqmmppkc`_\Z_bccYRTWROQWXX\^`]VY]YRW\WQRVTQOPWk}f\XUVSNNMJGEAADDB@AEGHJJHEECACB=88:;;<98740,**.:Fgtsv}¥®³³²±°ic¢£¡ uZ@841//5;;:=>@D@>?ADDC??=<==ACA@@<7541/10/15512;=95:?=9610478:=BHKKMONKKKIGGJIGIJRUUUSPNOQRQNMKJMONOPPQRQPON¬¬®¯°¯¯¯®¬««ª©ª©¨©©©ªªªªªª«¬«««««««¬««¬«¬®®®°°°¯®¯®®¯°°°±±±°¯®®®°°°¯±±±°±±±±±°°±²³´³²±±±²²±²³³²±²²±±±°°±±±±±±±±±±±±±°°¯°°°±®®¯¯®®®¯¬«««¬««««ªªªª©©©¨©©§¨§§¦¦¥¤¤¥¤¤££¢¡ ¡¡¤¤£¢¡¢¢¢ ~}{yvtsv¡¤§©«««¬®¯°²³´´³²²±±±±±²²²³µ¶¶µµ´µµµµ´³±²±±²±²±±±®¬¬«««ª¨¦¤£¢¢¡zunghoomnrrqjhijgc_]aea`dbWU\aa_bkuwz{yuw||z~|sjmjefhheeed`[[]ciigegkicdghgegnnponqtmd^_^ZX]abYSUUROQVYZZ\^ZQS\[UVWRNOONMO_vo]XSUUPNKJJJHFCDEGIJJKLKHEECB@>=869<==95564/+*./;Y\ar|°´´´³²³dz©¨§¤{zyvqXGA71,/69:99;>?BDFJLLPJHGEDCCCDGGDA=78:74134314:=;;AB?:75358:;=?DLNPPQIDILLJLJIIHMOQSSPQTTRQONNMLMNNOOPQQPNM«¬®¯±±¯¯¯®¬ªª©¨ª©©«ª©««ª¨ªª««¬«««««««¬¬¬«««®¯¯°°®®¯¯®®®®¯°°±°±°¯°°±±±°°±±±±²±±±²²³³´´´³²²²³´³´´³³²³²±±±°°±±±±±±²±±±±±±±°°±°°°¯¯¯®¬¬¬¬®«««««««««««ªª©©©¨¨¨¨§¦¦¦¥¥¥¥¤¤¤¤££¡¡ ¡¤¥£¡ |zxvttw¡¤¥§ªªªª«¯±²²³´³²²±±°°±±²±²µµµµ´³³´´µ´³²±±²³³²±±°®«««ª©§¥¤¢ {pedhnllswxxxvsoljebdebdj^OR`dbbjxvpv}~~zqnri`bhg`[\`_[YY^cggefhd]begg`\ZYcmmnsm_\_`\Z[`e]VVVSQQU[^XVYVQSZ[TRMKJKLNQd|^VTTRPMIIKKIGEDFIHFHJLHCAAB@><:99<=;9634662,+,-.,3@Ps±···¶´µo¬¬®¯¬¤trmgXDD?;61./14688:;<?DIJJMNOOKFB?ABAFFEFA;;<:7442/14;?@@@?=;8779<=>@@CGPSRMA=AGMONLLKJKLPPOPSVWTPONNNNMMMOOOQPOPR¬®¯±±±¯°¯¬ªª¨¨©¨¨ª©ª««ªª«©©©ª««««««¬««¬««¬®¯°°¯®®¯®®®®¯°°±¯±²²±±±±±±±±±±²²²´µ´´´µµµ³³³³´¶µµ³³³²²²±±±°°±±±±±²²±±±±±±±°°±±°°¯¯¯®¬¬¬¬¬«¬¬«¬¬¬««««««ªªª©©¨¨¨§§¦¦¦¥¥¥¥¥¥¤¤££¢£¢¢¥¥£¡|yxvuvy¢¤¤¦©©ª©ª«¯±²²²²²±±±±±±±²±±´µµ´²²²²²´´³²²±³µµ³±±°¯¬««ª¨¥£¢¡}kbfilkqy{}||zvpophceecb^SNTllddn{}}}rpu~}xssrd]chf_ZX[[YWNLNRX\aaYUX\ac]YYW[iknni_^aba``dhha[[YTSU\`YSTSWZZYUPHFILKO^|¡£p]XURQMKLMKHEDDEFDCHKJB?????>:8;>A?<:767730-+)'%&)10j¦²··¸·¹¬r}¤®°²±¯¨ |jb`^RA<446641/0357:=>?EHGFILOPNJEABDBEHHFA===;6365437<>;=??AA86:@DA?ACDGMQRMGC@ACDEKLNONNPONOSVWSPNMLMNOOPRVWVY]ab«¬«¬¯±°¯¯¯®ª¨¨¨§§©©ª«««ª«©¨ª©ª«««¬¬¬¬«¬¬¬¬¬®°®®®®®®®¬¬¯°°°±±²²±±±±±±±±±±²´³³´´´µµ¶µ´²³´µ¶¶¶´²³²²²±±°°°±±±±±±²²±±±±±±±±±°°¯¯¯®®«¬¬¬¬¬¬««¬«««««««©ª«ª¨¨¨¨§§§§¦¥¥¥¥¥¥¥£££¢¢¢ £¤¥¥¢ |zywvx{¡££¥¨¨©©ª««¯±²²²²±±±±±±±±±²³µ¶³±±±±±³´³³³³´¶·´±±±°®««©¥£¡ ~jdikmpv{{ywusolooidc`\WPMNZppikputtwwuuw|wwun^\cga[[YXZ[XJFGNTY\\VQSX]]\]aabimlfbbdfhfggkmojeb_ZXXZ]YSQT]b^YWSMIJTcpz¡£¤£~bXTRPNNOMIFEEEFFEEGGC@?=<<>?<9=?@>==:::830-,*(%(+,1v¬±¶··¶´h¬±²´µ´¯¥ {y~ p`[ZWPB>=;;:5211259?BCEEFGIKNONMLIHGEEGGGB<<=:7:><:;:;<8<AADD54>CEC??ACGOPOKIJGBCB@BFNPPPNLLORWUPPOMOOKRZ`ilnrx§©ª«®®®®¯¯ª©©¨¦¦¨¨ª«««««ª««ªª««««««««¬¬¬®¯®®®¬¬°±°¯±±±±±±±±±±²²±±²²±±³´´´µ´´²²²´´´µµ´³³²²±±±°°°°±°°±±±±±±±±±±±°±¯¯¯¯¯¯®¬¬¬¬¬¬¬¬¬¬¬««««ªªªª©©§¨§§§§§¦¦¥¥¥¤¤¤¤¤£¢¢¡ ¡¢£¢ |zzxvx{ ¢¥§¨¨¨¨©«¬®°±±±±¯°±±²²±±±²²²³²±±°°±²³³´³´´··¶´²±±¯¬«©¦£qhjmquwxyvrpmiglnkge_TOOQT_lpnopolntvyvx|y~xfZY_b^XY[[\]^YOKOX\]][XWY__\cmqooqlfeghjjjllnponkfa]\\\[YTRV]ca[XUPNUd}¡£¤¤aTRROOONKIJIIHFDEGFCAA=966;>><>?A?==<?@>72/+('&'()>±°µ¶µ´©xx§´···¸·´¬}yzxuxlaa\XUSPFFD?<>:75237:=CFGFHJKJKNNMMMKHFCABCB><=;:=@>;<@A><=ACA?63:?DE@?A@CMOLHDHKIGFECFKMNNNNMPSVTPQPMR^er{¦¨ª«¬¬¬¬®®«««©§¦§¨©©««¬««««ªªª««ª««««¬¬¬¬¬¬¬¬¯¯®®¯±±°±±±±±±±±±²±°±²²²±²³µµ¶´³´³±²´´´³³³³²±²±±±±±±±±±°±±°±±°±±±±°¯°°¯¯¯¯¯®¬¬¬¬¬¬¬¬«¬«««ªªªªª©¨§¨¨§§¦¦¥¥¦¥¥¥£¢£¤£¢¢¢¡¡ ¢ }zzwuw{ ¢¤¥¦§§§§©«¯±±±¯®°±±±±±±°°±±±±±¯¯°±±±±³³´´···µ´²²±®«¨¤zqoosxvtssniihfjqqmi[OKO[acipqqnfdmtxxu| {|~yg[XY^^ZXZ]]^__XRT[`aabfif_``gqvvvvrmnnlkjikllheikg\Y\``][YYZ^cc^WUQP_v ¡~_TPQRPMJJILMLJGEDEDDCB?;637>@@????>=>;:<864/)%%%'$B±²³³²´l´·¸¹¸¸µ§ ~zvfM8467ALID@AAA:8;==9579=DIJMNKJIIMPOPQOJFB>>@@>=@@?>>;66?DB=::==<<;:;AFD@BCCJNJE@?BDFIJHGJLPPOOPRUURNLTjt|©ª©©««¬¬®¬««ª©¨¨¨©©ª««ª««ªª«ªªª©««««««««««¬®®¬«®®®®®¯°±°°±±±±±±°±°±±°²²²²±±²´µ¶´´´´²³µµ³±°±²±±±±±±±±²±±±±±±±±±±°±±±±°°°°¯¬¬¬¬«««¬¬¬«««««©©ªªª©¨¨¨§¦¦¥¥¥¥¥¥¥¤¢¢££¢¡¡¡ ¡¢¡¡¡¡}zzwuxz ¢¤¥¥¦§§§¨ª¬¯°±±°¯°¯¯±±¯¯®°°±°¯¯¯¯°±±±±²³´´···¶´´³²²±¯«¨£ yrloxwspj_afecgpqpiVNPcoliimopiceksvut}{y||yk][Z[]_^]^`]\\ZWW]befghrsd_aoxxvxxwxyyvrnkihh]S[gcUSZcfeb__`chhdYTRVo |_SPQSPKJJJLLKHGFDCGHEDED=69AB@=;;;;?@=<:6651+&%$&";v ¨±²´o°¶¸·¸¸¸µ¢~~~|}~wd@8456:EG@:;=>727<>>9:=BEJKNPPOMLNPQRSQOLFBBB@>?CA=<>=<8:;8424>;6=CB?AFHBDGHJMLHA==ABEEIJKNRSSRRUTQRTds ¨ª©©ª«««¬¬¬¬««ª©§§¨©©«ª©ªªªª«ªªª©ª«ª««««««¬®¯¯°°¯¯°°±±±±±±°±±²²²²²±±²³´´´´´³´´¶µ³°®°±±±±±²²²²²±³²±±±±±±±±±±±±±°®®¬¬¬¬««««¬«¬¬¬«««ª©©©©©©¨¨§¦§§¦¥¥¥¤¤£¢¢¢£¢ ¡¢¡¡ ~}{zwvvx ¢£¥¥¦¦¦¦§©«¯¯¯¯°®®®®®®¬®®¯¬®¯®¯°±±²³µµ¶··¶µµ´´´³²¯«§£{igktune^V^db`flom`RRgywqlkkhcabkrsssqx}wrstutne``_\_aa_^^ZWVSV^dghghpumbdpxvrrppt|~{toic]RIJWVQRT_jifcccdhkh[RR]{¡ w`TQQQPOPMLJIFEEFDDHIEEFGA=AD@><9888;>?=8541/,('&((-8Rh{zu¥³´···¸¹·xwyzzyz{}}}|{zyy|~}ydF645:?DF?89<>?879:>>@AEDFIKOQRRPPQRQQPOOKIIIEBADC=<?AA=:63239A;3;DDACGGFEGGEHLNHAADCBBHLOPPPRSTVUR]m}¨©¨¨©«««¬««¬¬««ª©©¨¨¨©©¨¨©©¨¨ªªª©ªª©ªª«««¬¬¬¬¬¬¬¯°°°¯°°°°°°°°°±²³²³²²±²²²³³´´´´´µµµ³±¯°±²²±±±²±±²²²²²±±°±±±±±±°°¯¯®®¬«««««««««««¬«««ª©¨©©©©¨¨§¦§§¥¥¥¤¤¢¡¡¡¡ }{yxvuwz¡¤¥¥¥¥¦§¨««¬¬®¯¬¬¬«ª«¬¬««¬®¯¯¯°°±³´µµ¶·····¶¶¶·µ²®«§¡z`^fnnb^[\cebbgjjeXRZt~zqnpl\Y[btvsrpmr{wljmnnppnhhd]]a``_^YTROU]ceeegmpohjqvtnmhcahpvvspk^QKIILLMQQWcea_`_`ddaXSS]{¢¡ n\SQPQQPNLKIIGEFFFGHGGGFFDDEECA@>;:99:<=998420-,*)))%)37FVWPm«²µ·µ´·sporsuyyvxzyxvtqty{yut`=246<AAA<8:>BEA?AA=<?BFFFJMNPSSSRRROMKHHHJKKJEACD?>?>@@=::=>@CFCBFJGEEFGFKKFGLMMHEILIHLORQOOORWWVcqx¦§§§©««««««¬««ªªªª©©¨¨¨©ª©¨¨¨¨ªªªªªª©©««¬¬¬¬¬®¯°°°°¯°°°¯°¯¯±±²²³²²²³³±²²´´´³³´´´²±°°±²±±±±±±±±²²±±±±°°±°±±±¯®¯°®®¬««««««««««««««ª©¨¨©¨§¦§§¦¦¦¦¦¥¤££¢ ¡ }zxwutv{¢££¤¤¥¨©««««¬®¯¬««««ª¨§©«««¯°°°±±±³³´´´µ¶¶··¸····³±®¬§xa^gje`_ahljggjib\VUhy|uhhpfUUY]gjloqmnspbaeijmppkdb\\accb`XPNOSZ_`bcghbgnoopnihc\XZeoroib]SKHILMKLPRTUWWY\YXXXWWXaz¥£gVTQSUROMLLIIJIGFIGFFGFDDCCC@?@@?=:<<<=<98830..-+(&''*)+--..Eby®µ´m_abgmsvutttrtspmmnptkVA5/237=A@????BCBAEE?<=@CDGHKNQQSRPRRMKJGDDEGIHB<@C@=?>??>=BEIGGILJIMMLIHFCHLKKHIKIFINMKNPRQMMPUZZ\ow|¦§§§©««««««¬¬¬ªª«««ªªªªª©¨¨¨¨©©©ªªªªª©¨¨ª«««¬«¬¬¬¬¬¬¬¬®®®®¯¯°®®¯¯°¯¯¯°°±±²²²²²±±³³³³³²²±³´²±¯°±²±±±²²±²²²±±±±±±°±°±±°¯®¯°®¬«¬¬¬««««««««««««ª©©©©©¨§¦§§¦¥¥¦§¦£¢¢¢¢¡}}{wvutw| ¡¢¢££¦©ªª««¬«««ªª¨§¦¥¦ª¬¯°±±±²²²²³²²²²³´´¶¸····´±°ª¥wgehfc`bhmooihjj`[T]tzylcfj_VVY\YY\hqponf][_fhhjnk\XW[cfffd[SONPUZ\`cgf\Xirtpe]ZXWVZ`iok_ZZSKILQUZXTVWUTVWXVSRTWY\by¡zbVVSUVRNMNOMLKKJIIGFJLIGE?>?<:<>=>=>A?>;:9850./0-'$%&(*++-0.-02:OquC6DX^gtuqnmmmje`[VVNJK>122324:AA@BBABBA@CCBA@@ACEFHLOPPMJNPMNSOJB?@FGD?>CD@?=;>BFKKJLKKMKIMKJJIGCDKQPEDEDDHKNMNPQOMPUZ[\fsx ¨¨§§§©ªª««««¬©©©ª©ª«©©©ªª©§§¨©©§¨¨ªª«ª¨©ª«ªªªªª«ª««¬¬¬¬¬®®¯¯°¯¯¯®¯°°°°°±±±±±±±±²´³³²²²²±±²²±¯®¯±±±±±²²²²²±±±±±°°±±°¯®®®®®¬¬«««««««««««««ª©©©¨¨¨§¦§¦¥¥¦¦¥¤¤¢¡¢ |zxutttv| ¡£¥¦¦©©ª««ª««««©©¦¥¥¥¥¨¬®°±±±±±²³²²²±±°±±³´¶···µ³±±¯¬©¦¡vgfecbacgmnmfeiie\Wexytgcge\Y`b\VSUcptspe\Z^dhghkj[SUX_ehgcYPKKMRW[^bfe]X^hokXKLOSV[^cf`ZXWTLIKR[cc_\ZWXY[VSQPRTUXgsaWVSRRONMOPNNOPPNKJIKNNKF@AA@>=>>=;<<9:>?><84233-'%%&'**)&&&'*$ -4N[Q5+.?HWhplgiheZKC<64.186++279:>??>?ABDC?<=?AA@?ACEEEHJLMMLNOIHOQRF=?ELKKJHJF>9<?CIMNOMLKLJIHAABCFEBIRQIFD@>AKOOLMONMOUZYYgtzª©¨¨§§¨¨ªª©ª«ªª«««««ª©¨¨©ª¨¨©©©§§¨©ªª«ªª©©©ª«ª©ªª««¬¬®¯°¯°°¯°°°¯°°°±°°±±±±±±²³³²±²²±°°°®®®°±±±±±²²²²²±±°°°±°¯®¬¬¬¬««ª«««ªªªª«ªªª©©©¨§§§¥¥¥¥¥¥¦¥¥¤£¡¡ {zxvtstuy¡£¥¥¥¨©©©ª¨©ª«©©§¤¡¡¤§ª¬¯±±²±²²±²±±±°°±°±³´¶···¶´²±°¬©¥ ygfedbbcilkibcjmj^\jvwohefc^cnqaUV\douvrg_]_hmlikhZUX\^ekhcVJFIKNU]^afif_Z[\UMHGINX\]][XWVVTPJJS]bcfe^YZ]`ZSOOONOVnn_WURONLNNNOOPPPPPMOMJJMMIHEDC@>???>=:78=?=<:86651+())('&$"!#%&&(*()+)**((.3:FKLNSRMB3,.00+*,+%")2568:;=BDDEB><<=>?@BEFGHHIJLMNNRQLHKOQNGDFLORPMNI?=BBAFNQQMIGIIFB;9>AEGFJOPMKKD;<GMOLKNPOPUYYYjtz §¨¨¨§¨©¨©ª©©«ªª«««««ª©©©©¨¨©©©ª¨¨¨¨¨¨ªªª©§¨«««ª©ª««¬«¬®®®®¯°°¯®¯°°¯°°°±°°°±±°±²±²±±³³²°¯¯¯¯°°±±±±²±²²²±²±±±±°°¯®®¬¬«¬«««««««««ªªªªª©©©©§§§¦¦¥¥¥¥¦¥¥¤££¢ |{xxusqrw¡¡¢¢¥¦§¨¨¨§¨¨¨¦¦¢ ¤¨¬¯°±²±±²²±²²²±±±±±²´¶¶··¶´³±¯¬¬ª¦¢¡{lgijd`bhijheimpk]bltskhfgeeltue[X]hquvrjcablqomkdXW`dadjjeMCACGKSc`^cjldZSPMNMLKKTZXWVVUQQPNLNT\_`fkd\Y^b`^XROJHNnjXTQONMKNONMOPPPOMNOLHGHKJJFDDBBB@>=;:99<>;9999865.+,)&%%%#"#$""$&')('('%%)+-01-*)))**('*-+(&$$&,2379=AEGFCCA>?>==>ADGHGGHJKLMLNSTRLNOPPQLIKPPQOLIBDHGCCKPQLHEEFEC@<>CFHGJKJIJLIA@FLMLKMPPQUWVXjvz¨©©¨¨¨ª©ªªª©«ª©ª«««¬««««ª¨¨©¨©©¨§¨§§©©ª¨¨§¨ª«ª©ª©©«««¬®®®¯¯®®¯®¯¯¯°°°¯°±±±±±±°°°±±±²²²´²±°°±°®°°±²±³²±²²²²±±±±±±¯¯®®®®¬««««««««««ªªª©©©©©¨¨¨§¦¦¦¦¥¥¥¥¥£¢¢¢¡ {zyxurpqu ¡¤¥¦§§¦¥¥¥£¡ ¥¨®¯±²³²²³²²´³²±±±±±²´¶¶···¶³°¯¬«©§¤¢ zokole\[^cfkpqrpjgklnnjgegghputkg\_knopokgglppmie\SYgiebfg`B:<@GLRgg_`gie\RNMPRTSOOSRQUZYSPQQQSW[[[affaZY\ZZ[XSLHKmcUTQPOKJLMKJMOPOKIJJKKGGHIHFFEDDDA;779<<;;965677663.-,)%%%%$#! #%('')*)(&&))()%!$%&'(&$%%&&%%&-5:?B?CHHHE??@@BB?=<>BDHJJJLLJJKLPSRPMLLOQOMOOMLHHHHJKJGEIOOLHDCDFHFDCEGHHJMKKKHHIHGHKKKNPRUWVUSesy}«ª©©©©ªªªªªª««ªª««««¬«««ª¨©ª©ª©¨§§§§§¨©§§¨¨¨©ª¨¨¨©«««¬®¯¯°°°¯°°¯°°°¯°±±±±±±±°°±±²²³²²²²°°±±®®°±±²³³²±²±±±±°±±±±¯¯®¯®¬¬¬««««««««ª©©©ª©¨¨¨§§¨¨§¦¥¦¥¥¥¥¥¥¥£¢¡ ~{yxwusrrt~ ¡¡£¥¥¥¥¥£¢ ¢¨ª®¯±±±²³²±±³²±±±±±²±³µ¶·····´±®«ª¨¦¤¡yrrupaVSV]ivzxtjglllnnjghheelttqmb`cdekmlkossnib_VP\kihc__[E::=ELQeog_dfd^TOMPTVVURQONT\`ZSTVXZ[ZWXZ_`_[UQOPSTQMLOs |]VRQPMFGLMKJKMNMJIJKLKIHHHHIHHFDED=8:::88;<987888761/.)$$%%%" !#'*('()***'&(((%!!$'&''%# "%&&*19>ACCDFHGB<<?BDD@==>>BHKKLLJIIJKLMNOKJKKLNPQPMHBEIJMJHKIKOMKHCADJOMMLIHIJLNNLIEHJJEEIKMOPTWXVRScny|¨ª©ªª©©ªª©¨©««ª©««««¬«««ªª©¨¨©©©§§¨¨§¦¨¨§¨¨§©ª©ªª©ª«¬«¬¬¬®¯¯°¯°±±±±±±°°°°°±°°±±°±±³³³´²±±±±²±±°°±±±±²±±±±±±±°±±±°¯®®®®®®®¬¬¬¬¬¬«ªª©©ª©¨¨§¦§§§§¦§§¦¥¥¥¥¥¥¥¦¥¥¤¢¡¢¢ }{zxvvttrqr{ ¡£¤¥¥¥¤¢¥«¯¯±²²²³³²²³²²±²²´³³³µ¶¶·¸¸·¶±©¨§¥¤ {sqsm[TSV]nyzzob]bhlomgfigb_cquupb][\billortpjc^\XV`igfc^\YOC??CKQ_nldeb`_ZSOOQTUSSTONRZ`_SPSY[\ZVUZ]^]ZVOKHGHHILRt q\UPONIHIOPONMNNMMLLLMKJIJJJJIIHIIGB>==<7:@@=<::987510.+'&()(% #(+*&&'(+,+*''&&$#"$%&'&%$#$$%'*08=@CDDDCC?;<?AAA?=?CDHLLKJJHFHHJIIHJNMKKKMPPNKFCDGIJIINMMNJJIEBEJNPQQNKJJLOPKGGKKGCFHJKMQSSQNJKWfsy§ªª©©©©©¨¨©©ªªª««««««««««ª©¨©¨§§§¦§¨§¥¦¨§§§§ª«ª©«ª©ª««¬¬®®®®°±±±°°°°°°°°°°±±±²±²³³³´±±±±±±±±±±±±²²²±±±²²±±±±°¯¯®®®®®®¬¬¬¬¬¬«««©¨©©©¦¦¦¦¦¥¦¦¦¦¥¤¤¥¥¤¥¥¥¤££££¢¢¢}|}~|ywuvvttsqqx ¢¤¥¥¥¤¢¡§«¯°°±²²²³³³³³³²²²±³³´µ¶¶··¸¸·¶±©§¦¥£¡zphb\RSW]dilnk^YUU^ijhccffb_`gijja\[[bgekopojd`\\[Z[\^_`a_ZUNGHGKQ\ekmjcVUUSRQOPSTTSPNQX_`WNLPUYWTSYbc`YUMGDDBAGKUpk[VRPMJLOPQQOMLKKLLJIIKMLMMMKHHHIHFCB@?AADB?=<=:877752-+,*+,-)%%(*,*('%(,-++*&%$$#$%$%%%%%%%%'*.26:@CBBED?<=>??><:;?CFIJJHHHGFGHHIJFJPLJLOPOKJJHEDDFKLLPQOLILMIHHILOPOOLJMNLMLJHJIFEEFIJNSRNGCCDGUjsz§©ª©ª©©ª©ªª©ª©ªªª«««ªª««««ª©©¨¦§©§§§¦¥¥§§§§§¨©¨¨©ª©ª«¬¬¬®®¯®®®®¯¯±±°±±±±°°°°°±±±²²³³²³±±±°±²±±±°°±²²²±±²³´±±±±¯¯¯®®®®««««¬«««ªª©¨¨¨§¨§¦§§©©©¨¨¦¥¤¤£¤¤¤££¢¢£¡¡ xustwz~|zxvwwutsqrw¡¤¥¥¤¤¡¦ª¯°°°²²²³³´´´³³²³²³´´¶···¸¹¸¶´±®«©§¥£¢ xk`WRNT^dfb_^URTTR\dca``cdcb^YUX\^`^]abcjnnmhbb_]\YVUVZ_ca[SNKKMOPZchnleSKLQVVTPSY[UPOSY^_[TOMPPPQVZaaYPMB<>?<<>DSo|wiYUQMJILOPPOMJJJJJIIHILLLNPPOIFFDFGFFEEGIHDCAAB:667986321-+,..+)*,,*)'&)+++,+('%%''&%##$%''(*-/1159@DCBDC=<@A?==:89=ACFHIJKIHJKJIIKKLLKKLOONNJJJJEAHNNKLQOKIKNKJJJLRPNONMNNKLMOLKIIHEEHJOWRMC=@BFO]iu}§¨ªªªªªªªªª©ªªª¨©««¬¬«««««ª©©©©¨¨¨¨¦¦¦¥¦§¨¨§§¨¨¨¨©¨©«¬¬®¯¯®®®¯¯±°°±°±±°¯°°°°±±²²±±²±°°¯®¯±±±²°°±±±±±±±²²±±±±°°¯¯¯®®¬¬««««ªªª©©©©ªªª¬®®®°±±²°¬«¨¦§§¨©©¨§¦¦¥¤¤¢}wrpmknsw{} }zzxxyxvsqpr ¡¤¥¤£¢ ¤©°°±±±²²²³³´´´´³³³³³µµ¶···¹¹·´±°««ª¦¤£ taUPMLZfhfb`[PRWVUbaY\[[]_bc_VQQUY^_`abchijkfbca]_ZWWY[`d`\VNLMOSVZagnnbJGHNV]_YW[\VMLT[``\[[UNJJP[][XNG@<;=<8668H]br} ~yqcWSLIFHLNOMKKJKKKJHHJJKJMOPPPKFFEHIGFGJJJIHIHHH>9:;;87886/,+,.-++..++*+-+*+,+++'%&&&%$"#$%(+/34667:>BCCCA?ACB=;==;9;?ACEINPOKJLONLOPPMKIIKMMPLJJJF?CJJIIMLHGKMNLJKORRNOPPMKJIJNKIGIHFEFMRUPF?;=?EJSair{ §§¨©©©ª©¨¨ª««ª©§©ª«««««ª««ªª««ª¨§§¨§§§§¨¨§§§§§¨¨©ª©ªª««¬®®®¯®®®®¯°°¯¯°¯¯°±±±²°¯°¯¯°®¯®°°°°°±±±±±±°±±±±±°¯®®¯®¬¬¬«««««ª««¬¬®®°°°²µ····¶·¶³±°®¯±°®®®¬«©§¤¤¡ xkZY_ekpuy{}{zyzzzvtqpr}¡¡£££¡¢§«¯°±²±±²²³³´µ´³³³³³´µ´µ¶·¹¹¹·¶³±¯¬¬¬«©¥¥¡sZLIIL[gheb_XQWZXX`\QTVWWY`ec[SRSVY\^bbcdeghgfgf``_^^accc^YXTRQPX_behmqiPFINW_c_\^\VRRW]aa_ch_WXSRZWOMHA;;==<6369?@B_s{yyxuv{odVOLGBEJMONLJKNNIIJKLMKJJLOPPOMJKIHHGGGIJJJJIKMJFDB=877875/,+,.,+,.,)*+..,,,*+/.(%%%%&'&&&'(-1=@@C>8:<@CB@=>BDA???>?BBCDGKOQQMKLOOOOOPOIGGHKLLKIKJD?BGKIILMHGMPRQLHJLLEIOPLHECFIFCEJIHHIQWUKA<;=?DHJS]gry|¥¦©©©§¨¨¨¨©ªª«©¨§¨ª««««ªª««««ªª©¨¨©©¨§§§¨¦¦§¦¦§§¨ªªª©©ª«««¬«¬®®¬¬¬®¯¯®¯¯¯°°°°°°¯®¯¯¯®®°®®®®®¯°±±±±±°°°±±±±°¯¯¯¯¬«¬¬¬¬¬¬¯±³²±°±²´¶·¸¹¹¸¸º¹¸¶µ³²³³³´´²±±±±±±¯®¬©¦¤|yscOJP^gnsx|}}|{zzzyutpnq| ¢££ ¤¨«®°±±±±³³³´´µµ´³³´´´µ³³´¶¸¸·¶´³±¯®®¬«¨¥¡sXGFHMU^_^][UTXYVVXSOPRQPT_da\TSSUW[\_adfgighilhbbddceiga\ZYYYXUWahikmni]OKMX`cb`b]V]c`_a_`cedeig\UKGEB<99:960.38<=9Rnof`alptwvq_ONLHEDFKMNNLKKLKGHKKMNKILNNOPONOOLIGDEFGGGHJJIIGGF@528><:8401/..--.*'*-0/-..*-0,%""#$')('*+.7>CFFFC;78<?=99;AFECACCDFFFHKJJKKLLMNOLKKORKFFHLMMJJLJGDEILKIJNLHIMUVRLGDCEIOPIEDCCCA?DJIGHMQSLB<99=ADHLPTZfqv|¥¥¨©¨§¦§©¨§¨¨©«¨¦§©ªª©«««««««©ªªª©©©¨¨§§¥¦§§¦¦§§¨¨©©©©©ªª©ª««¬¬¬««¬¬®®®®®°¯¯¯¯¯¯®¯®®¯¯°¯¯®®¯°¯±±±±±±±°¯¯°¯®®¯®¯°°°°±±±²´µ³±°±²µ¶·¸º¹¹º»»º···¶···¶¶´³³²²³³±±¯¯¯¬ª¥ yogaPCDH^glrx}~{yxvtsqnpz ¡¢¢¢§ª«¬¯±±°±²³´´´µµµ³²³´µ³³±±´¶··µ´´²±°¯®¬ª§¢tWGIMRXZ[[ZWTVXWSSRPOQPNNRZ]WPPTUVXZ\_chjmmjllojbcghgijg`[ZYXY][W`ilmmlhecYQW_beec_Y]ed_WWZ\^_dff_PA@>==;974.))+.675FQPC??UgnqeTLDKMIGHJNNNMKJJIIIJKKLKJIKLLMNNLNPNMJEBDGHHGIKJF@<>99=ED=@=0.=E>0340-.0240./1/00,%##%%'''*-17>BEGFEC>;<==959<AEDDBDEEGEFINNMKJHHIKMMJIOSQIEIMMMLKLNOLJJMNJJKJIIMQQSSRJGJLPQHBGGCEC@CIJIMPRO?8757=ADGKMOS\ekt{ ¦¦§¦¦¨§§§¨§¨§§§¨¨¨¨¨§¨ª«©ª«««ª«ª©¨©¨¨¨§§¦¦¦¦¦§§¨§¥§§§©©©©¨ª««««¬¬«¬«««¬¬¯®®®®®®®¯¯¯®¯¯°¯°°°±±±°°°°¯¯¯¯®®®¯®®°±±±²²³³³´³²³²²³¶¶·¸¹¹¹º»½»¸¸¸¸¸·µ³´²²³²²³²°°°°°°«¨¦¡ xpaWI@ACWflrx} |yvtsrpnnt ¡¥©«¬¬¯°±±±±²³´µµµµ³²²²³±°¯°²³µµ³²³²±²±°¯«©¥ uYLQXY\_`]YUUWY[XTSPRUTPNRYYQIMRTUSSUY^bhoppqnol``gkhikj^WUSSW__Y`kmmmljjlha^_bfgcb_^a_ZPMRVWZ\ZUNE=<=>@@=950,)((+-/695,.*F\di^CBDJLJIJMPPNLJJJIJJKJIJHFJKKMMNOKJNPPLE@EJKIGIMKC=E]s{wk`XXPJEITVKB@8033462012311-((,//,*-365:?DEEDEBABCB=77;ADDB@ACCA@>@BEJMOLFCCCDHIINQQKHJNKJLLMQQPNMQOHHHJLJLLKMMOOOOLMOJFIGEEEBAEILPRUK88537<?CDGJLORU^htx}¨¦¦¦¦§§¦¦¦¦§§§¦¦§¨¨§¨©«ªªªªª««««©ª©¨¨¦§§¦¦¦¦§¦§§¦¥¦§§¨©©©©©ªªªª¬¬«ªªª«ª««¬¬¬¬««¬¬¬®®®¯¯®®¯°°±°®¯¯°°¯¯°°°±±°¯°±²±²´´µµ´´²²´µ´µ···¸¹ºº»¼¼»¹¹¹¸·¶µ³²±±°°±±±±±±±±¯¬«ª¦£{n_P@9;@Tclqw{ ~~~{yusrponno} ¤©«¬®®¯°±²±±³´µ¶¶µ´³²±²±¯¯®²³´³²²²³²²²±¯ª¦¢ xZIRVU[ab`ZUUW[\YWSTZ[YTSW[UJ>BGLLJECEOU`lnssjkla`gpoklocUSNNUdc]cmmkjiikmoni`^acba][[YVPLOSSVURLHECABCEFD?961,,+*)+,//*%#?NS\J>AGLLKLNPPPNKJJJKKJIHJIGHOMKMLKHFFKNPRORW[WXZX^dnw{| tldb\WX[WRPMA<:7544554430-/596-,39=:=CFFFEECEED@;8;AEFD=9>CC=97;?BFKNLHECCGIJGHLNKIKOLHJJKLMNOOQPLJLOOLJIIIIJKPMGEGGIGB?BHFBAFMSYb]94:79=@CEGHJNNOSZcju} §¦¦§§§§§¦§§§§¦¦¥¦¨¨¦¨ªª«ªª««««ª«ª©¨¨§¥¥¦¥¥¦¦¦¦¦§¦¦¦¦§¨©©¨©¨©©©©ª«ª©©©©©ª¬¬¬«««¬¬««¬¬¬¬¬««¬¬¬®®®®¯®®¯°°°¯°°°°±²²²²²³³²²²±²³³´³³³³³²³µµ¶··¸¸¸¹º»»º»º¹¹¸·¶µ´²°°°¯°±±±±±°°¯®««©¦ wmbN<65<T`inuz }{{yxusrpnmmlz¤¨«®¯¯°±±±±±³´µ¶¶¶´³²±°¯®«°²´´³²²³³´´²°«§¤zYGIIKU_`^YUTVWVUVUY`_\YY\^T?9::<?=99=EJYbhqn\Z]Y^fuvnikgXROMVjiddlomljhjpqpm^W[]\\ZYZWTONPQPQOLIIKJHGGHIFB><9542.+,..,'"#1@DG?=BJLJIMOOOOKIJJLMKJIIIIHLNLLJDA?ALYablyzt{|z~yqmic_]\\XWWUOH@;88;<9569;87872+*17>@?ADEEEFEEB=778=CECA=8:@A?<;:>BGKLIFB?@HIF@@FIKJKLIDDDDFIKMMMLJILPOKIFEGGGFHFCA@BEC>=CGGBBEKR]s mP>9;<?ADFGJMMNOPUaisy|}¥¥¦¦§§§§§¨¨§§§§¦¦§§¦§©ªªªª«««ªª©ª©¨¨¦¥¥¥¥¥¦¦¥¥¥¦¥¦§¦¦§§¨©©©©©©©ª©©©ª©©¨ª««««ª««¬¬««««¬¬¬¬®®®®¯¯°°¯°°¯°±±³³´´³²²´´³³³²²²²±±²²²²²´¶·¸¹¹¸¸¸¹¹ººº¹¸¸¸·¶´³²±°°°°°±±±°¯®®®¯®¬««§¢uhN852?S`gmsy}}|zywutsqnljhu¡¤¨«®¯°°±±²±²²³´µ¶¶¶´³²±¯®¬««®±´´²³´´´´´³°®¬ª¤¢yZFEDIU\\\UPNPOMNSW[aa]Z\acV977669977>EJSX\_]WRMMXdtyob`_XNIMZookiiknrmegqsoj^WX[]^[Z\ZUQPOJIJJIFKONKHFHJIEBA@?=844452/(#"'7:;=?EKKIJLLKLLJHIHKLJIGGHJJHGJH@;FYlv}{| |xtpmgb`_][\[ZWQLHEDDC@::<?>;95-+*-2<>946;@?;<<9766:@EFB>=<8?CA@CA<>EGHHE@;=FIDAADHKJHJJCCDDEGJJKJJIIKNOLJJHGHIEDEDDDCCCA@BDEEHGIWf}zY>;=>@DEHKLMOOOSY\hov}~y}¥¥¦¦¦¨¨§¨¨¨©¨¨©©§§§§¨¨ªªªªª«««ª¨§©ªª¨¦¦¥¥¥¥¥¥¥¥¥¥¦¦¦¥¥¦§§¨¨¨¨¨¨¨§¨¨§§¨¨¨©ªªªªª«««««««¬«¬¬¬«®®¯®¯°°¯°¯°±²³µµ´´´´´´³³³³³³²±±±°°±±³¶·¸¹¹¹¸¸¸¹ººº¹····µ´³²±±°°°°±±±°°®®®¬«ª¨¥£rQ934BWbinty }|{{zxvtsrpnkhgn¥§ª«¬®¯±±±²³³²²³´µµµµ´³±±°®¬¬«««¯²´³³´³´³³²°®¬ª¦£|aGCEMV\\YOGEIJIMRTVZ]ZW[abW<76569<=@GJKNRTTSQMIGQYfsn`ZXPFDKYpuqmjimqldcihfdcc^^cc_]\ZUQQLEBDFFCBIMKHFHJHEDCCBA?>?>85/*$"'025:@GIIJMMHEHJLLIHJJJKJIJIGB>@S^exzyyuqokfdb_a`]^_YUTSSOIGB?>=>?<410./4:;5,,/77038>>98:=@DEA>><=CEDDC@BECDGHC<<DJKLIFCDFEHJEDFECEHIIJJJLNNMKJKKJMNJHECA@@AA@AEEGHJIO_s ]B@BACFJKKLNNORSS]ktz}§§§¨§¨©§§§§§§¦¨ª©§§§§§¨©¨©ªª««ª©¨¨©©¨§¦¦¦¥¥¤¥¤¥¥¥¥¥¥¥¥¥¦¥¦¦¦§¨¨§¨§§¦¦§§§¨§¨¨©©ªªª«««««ªª««««¬¬®®®¯¯°°±³µµ·¶µ´µµ´´³´³´´²±±±°®¯±µ¶··¶¸··¸¸¹ºº¹¸···¶´³²±±±±±±±°°¯¯®®®¯®«ª©¨¨¦¥¤vS706C^djquy~ }{zyxwvurqroljgfk{¢§ª««¬®¯±±²²²²³²³³´µµ³±±±±¯®¬««««®±²³³´´´´²±°¬©§¤ kLEHPV[ZULEDGIIMPPNPSSTWZZTD:657=BFJLNMPSXWPJJJIMPXch]USLCDHUlwuspkgiigc^]]ciidccbbb^XTRQKGFGHE?>DJJJGFEDDDCCCAADEC=5,'$#).16=BHJKMMKIGGKONMKJGIKLKKH>>Uq| zzzvspmjfbbedaba\[[[\XPLHDA>?DD9673258860/17767;GGA====@DB?>=<<BFDBBCCBCDGGB@DIKMLF?CFEFHFEFECBEHILMMONKJIGGHIKKJIIGCAAAABIOKJJMN[j|pNAFEGJLLLMLMOQUett| §¨¨¨§¦§¨§§§¦§¦¨©©¨§§§§¨¨§¨¨©««ªªª©¨§¦¦¥¦¥¤¥¤£¤¥¤¤¥¥£¤¥¥¥¥¥¥¥¦¦§§§¦¥¥§§¦¨§§§§¨©©ªªª«ª««ªª«««¬¬®°±±³´¶····¶¶¶µ²´´´´´µ²±±±°®®¯±³³µµ´¶··¹¹¸ºº¹¸¸¸··¶´³²²²±±°°°±°°®®®®¬©©ª©§¦¥vaA37Mbglrv{{zxwvutrqpokifdgu£§ª««¬®°±±±²²±²²³³´¶µ²±°°°¬¬¬««¬¯°±²³´´³±±°ª¨§¥mOGKPTWWQKHHJKJNPNKKMORTVVRG:8;<BIMONKNUZ\ZRKOSQQTWX^\WSMFCFN_lstojgeghg^[Z`gfddb__`\VSROIHKOLHA=@FHIGDCBCDDDC?>BC?;4,&#%+038=BGKLMMLJIIKNOONKHIJJLLEXl {|{vrpolgddefec`_^`aa`ZUNIECBDC>9:879:::768::8:@EGB;:=@>@B?=:868@B?<<;=ADGJLIGJJHFEEIGEEIIHIGCBEIJKOOLJHHGFDDFHIGBDFDDCBCGJONLKMUj{sTFDGHJLOMKMNXguxz¦§¨¨§§¦¨¦§§¦§§¨§¨§§§§§©©¨¨¨©©ªª©©ª©§§¦¥¥¥¤£¢¤¥¤¤¤¥¤¢£££¥¤¥¥¥¤¥¥¦¥¥¥¦¦¦¥§¦¦¦¦§¨¨¨©ªªª«««««««¬¬¬¬¬¬¯±²³µ¶·····¶¶µµ´±³´´´´²±°±¯¯±²±´¶µµ··¹¹¸¹¹¹¸¸···¶µµ³±±°°±±±²²±¯®®«©ªª©§¦¥¡whQM^ejnsw|~{yxvuutrqonljgdfo ¢¢¦©ª¬¯±±±±±±±²³³³µµ²±°¯«ª«¬®¯¯¯°±³³³³²±°¬ª¨¥¥oQMORRSSNKMNMMNPQNKKNPSSVWVK;<@BJRSQLJNW\ZWUSW]\Z[^__^^YPKGHLU^fljeddceia^\[]][[[Z[YVTTTPFEKOOKD??@@BCB?>??@A?>=;:950-)').149<?CGIIJJKJIILMJJJIHGGHFSv |wsqpnjhdcbbdcaaacehgfd^WRLFCDC=<>>?>95458;98<>?@<76;@<:=@@??=;>>;9:;>EHIIKJJKHDAFIGGGFFFILKGEGIIGGGFCEKJIJED>;=>BEFJHBACGLQQOQVo^AEGIJMNOQYiprz¥¥¦¨¨¨§¨§¦¥¦¦¦¦¦§§§§¨¨¨§¨¨¨©¨©©¨¨©©§¦¦¥¥¥¥¤££¤£¤¥¥££££¢¢££¤¥¤£¤¥¥¥¥¥¥¦¥¥¥¦¥¥§§§¨¨©ªª©««««««¬««¬¬°²³´µ¶··¶···¶µ´³³´´³³²±±°°¯¬¬®¯±±²´µ¶··¸¸·¸¸····¶¶³±°®®®®®¯°±±±°¯¯®¬««ª©¨§¦¥¢|jailmptx~~zzywuuutroonkjgdeh~¢£§ª««¬¬¯°°¯¯¯¯°°±²³³²±°¯¬«ªª«®°°°°±±²³³²²±°«§¥¤¡ pSOOOPQRONQRPRSRPMKMPSUUXZXO@@BHNSUOJJOVWVSSVY^ccefgecbaZRNOQSX[[YW[XU\e`^]WVWTPMLPUVSQQPF@DJLJD@>=<;::<;89;<:772341-*)(,/26;=;=BFILNNKIHJKIIJJFFA?Mr |y}ztsrojgda`^`cdddddghiijjjf\NDED>;<==8206::>@;;::==:58<:7:>??@A?@@=:;=DIEA@ABGJFA@FFECEECCGJLKHHHHFEED@AHKKKGC<9:;?EHLIC@BGMPPPUgz gMFIIJNQZlpry~yv£¤¦§§§§§¦¥¦¥¥¥¥¦¨©§§§§§¦§©©ª©©¨¨§§§¨§¨¥¦¦¥¥¥££¤¥¥¥¢¢££¢£££¥¥¤££¢¤¥¤¤¤¤¤¤¤¥¥¥¦¦¦¦§¨§©©ªª«¬«««««¬¯±²µµµµ¶·¶··¶¶µµ´³³´³²±±±°°¯¬®°²²²´µ¶µ¶····¶µ´³³²¯ª©ªª««¬¯¯®¬¬¬««ª©¨¨¦¥£ wrpqux{~z{zyvttutsonlihecbdr ¡¤§©««¬«®®®¯¯¯¯°±±²±°¯®¬««®¯°°±±±²²±±²±¯¬ª§¥¤¡ tXMMLMQRPTVVUVUQKJKNRUVV]_[SGDFKPPNJHKPSUVSRVZ_ehkligfjkf\WY[[YWTQQQNMR\ZX[VQPNJB<?GKKIIHD>=CFFB=;85436871-.20-+)*..****-149=>>?CIKMPPMIHIIIJKJGGPft| ~|~zwtspicbbbacffgecbeglpspqtqfWNE@=@B<0+,=A=@@<<>?CA<:?=;9;;<<<<=??<<;=AEB>>?AEGB>AEEB<AFCEGHKLMNMJHHJIFEFIJJHFB?CCCDFHGDCDHLNOOYzoSHKLMZinpy|wrj¥¥¦§¦¦¦§¦¥¦¥¥¥¥¥¨§¥¥¥§§¨¨¨ª©©©¨§§§§¨¦¦¥§¦¦¦¥¥¤¤¤¥¥¥£¢£££¤¢¤££¢¢¢¢¢¡¢¢¢¢¢£¤¥¦¦¥¥¦§¨§©ªªª«««««¬¬¯¯±³³´µµ···¶¶¶¶µµ´´´µ´³²±±±±°¯®¯°±²²³²³³´µµµ´²±¯¯¯¬ª§§§¨ªªªª«ª««¬¬¬¬«««ªª©§§¥¥£¡ zxz} ~|z{zywvuusqomkigdb``j{¡¥§©ª«¬«««¬¬®®¯¯¯°°°±±¯®®¬¬¬®®¯±±±±±±±±±¯«©§¦¥¡ x]IKKJMOOSXY[\UIBDHNOORV]b^UKKLLMKHHIMPRUVVWX[`dfikhfhori__bed]SRSQPMLNSQQUVLECA>;:=ACDCCA>;>AA;6437:8564-'%''#"!"&*+**+.368<>?BEFHHLMKJIHGIKJJKLgzx{ }{yxxslefhecefffd`agoqttqtyxqibc]TNFD<02=BBB?::?DE?>@FHD?@>;9988:<<;9;>AAACEFGHHEDDD@<EJGEIKMKJKNMIEGJFEHHJJHIHEDEHGGJIFEFIMMLO]x|YJIVjoos~~{uogW§¦¦¦§§§§§§§§§§§¦¦¦¦¦§¨¨©©¨¨§¨¨¨§§¨§§§¦¦¨§§¦¥¥¤£¢¤¤¥¤¢££¢¢¢£¤£¢¡ ¡ ¡¢¢¡¡¢££¤¥¥¥¦§¨©ªªª««ªª««®°±±±³´´µµ¶··¶¶¶·µ´³´´µ¶´³²±±±±±¯®¬®®¯°°°±±°°±±°°¯¯®¬«©©§¥¥¦§¨©©©¨¨ª«««ªª«ª©ªª§§¦¥£¢¡ }{{{zyxvuutqonmjhfb^_dq¡¥¦¨ª«¬¬«««¬«®¯¯¯®¯°°¯¯®®®¬®±±±±±±±°°®««ª§¦¥¢yaHIIIJLKNTX\\SC>BGKJINT]_[TNNQOLHEHLOPQTTSSW[_abdfhghnqg\`fihbTQSSPMMLLLLOQB:5357:<=<==;;:779942259@?60/.(#"! $(*'%*/58:<?DECBBBFIJKJGGIJJKKWq} ~~{ztplklifdeefggfhottsuwxzyyussn^RSRFBCDC@=::AFEBBCFKJECA?:7778;;::=@BABCFEEJNNKHD@?HNLHGIKLJHFFDDFHEBCDECDDDEEHKLKJIIIJKNNMYoj`lppy}{umePF¨¨¦¥§¨¨¨§¨¨©§§§¦§¨¨§©§¨¨©©¨¨¨¨¨¨¨¨¨§¨§§§¥¥¥¦¥¥¤£¤£¤¥¤¢£¢¢¢¢¢¡¢¡¡ ¢¡¡¡ ¡¡¢¤¥¥§§§©ªªª««ªª«¬¯±²³´´µ¶µ·¶¶´²³´µµ´³³³´µ´³²±±±±±°¬¬¬¬¬®¬®°¯®¬®¬«ª©¨§¦¥¥¥¦¥¦¦¥¥¥¦©ª©ª©©ª©©©¨§¦¦¤¢¡~|{zz{zyxvuusqonnlhe`]^`l~ ¥¨¨©««¬«¬«««¬¬¯¯¯®®®®¯®¬¬°²±±±±±±°¯«ª¨§§¥¢ {aFIJKJJIIMTXTMC@DJKFGMUZYXSOORQNIEEGHILPOKKTY[\\^`cfgklcSZhjif\TSROKLLJJIHE;5/++-365444345544447979FK>2,-*&$"""! !$'%&+06:>ADGFEEDCBFJLJHGGGKTZnv~ ~|xtuuoljihdbcfgiilpruz{zz{{|yvqb[[_]VLID@=:;AFDACEHGGDB?@>:99:;<=>CEC>?BCBAGLOOKFBEJMMHEEDFIIECBCDDDC??@@BBCDFIMOKIHGEEILMP]{tx~wtmaO;7ªª©©¨¨¨¨¨©©ª©¨¨§¨¨¨§§§§§§¨¨¨§¦§¨©¨¨§§§§§§§¦¦¥¤¥¥¤¤¤¥¤£¡¢¢¡¡¡¡¢¡¡¡ ¡¢¡¤¤¤¦§§¨¨©©©ªªª«°²²µ¶¶¶¶´´µ´³±²´´´³³³²²³´³±²²±±°®¬«ªªª«««¬¬«««¬««ªª©§§§§¥¥¥¥¤¤££¢¡¢£¥¦¦§¨¨¨¨§§¦¥¥¤¡ ¡|zzzzzzxvvttqpnmljfb_]\^fy¡¤¦§©ª«««««««¬«¬¬¬¬®®®®¯°¯®««¬¯±±²³²±±±¯¬©¨¨§¥¡}_FKLLJKJINQRNIDFJNNGCISWVWSNMQSROHAAABEJKJJMPRTTVX[_eknaMShkgd]VQPMKLMJGD>;73,++-/-,,.034334678>??@NTG;9?5*(,.+'$!"" %/58<AEFHGHHFEFKQOKHHEGVbkwz }yvvyuqmklheeghkmmptxz~}}}}zrgged^WSKF@<<AEC@ACB?=?CC@?<;><;=??AC@>?ABDFGHHKKHFIKJJGFIF@CEDDCCEFIGCCDCDDEHHJLLHGFEDDHKNWj~zth[F<65©ªª«©©©¨©©¨©©©©§¨§§§§§§§¦§¨¨§¦§§§§§¦¥¥¦¦§¨¨¦¥¥¥¥¥¤¤¤££¢£££¡ ¡¡¡¡ ¡¢¢¡£¤¤¤¥¦§§¨©¨¨¨ª¬®°³´¶··¶µ´³´³³²³³³³³³³²²²³³²²±±°®«©¨¨©ªªªªªª©©©ªª©¨§§¦¥¦¦¥¥¤££¢¢¡ ¡¢¢£¥¥§§¦§¦¦¥¤£¢¡ }{zzzyyxvtusrqpnmkhfb^[[]cs £¥¥§©©¨¨¨©ªª«««««¬®¯¯®®®¬«¬®¯±±³´²±±¯«©¨¨§¤ |cIJJHHJKJMMLLIDFKPOGBDKPRTSQLMRUVQCABBEJKJHHIMQRQQSUafbSDHYffZZUOMIIIGC?<841/,0451,''+.4:;6258=IOTVYYMJORD<:;;82.,(!$/79=AEGHHIHGGIMPPJJJGXou| ~|}~|wuuurnmmmkhknrrrw{z{|}~yrmkkhfa[SFA@CDEC>===<>CEB>=<<989=>==>@?>BFIKIGHIIGHIIJIJLLEBCCCB@EKKKJGFEEECDDGIIEDFFDDHLQ^v~yrjXH;965¨©¨©ª©©©©ª¨©¨¨¨§¨¨§§¨§¦¥§§§©©¨©¨§¦¥¥¥¥¦¦¦¨¨§¦¥¥¥¤¤¤¤£¤£££¢ ¡ ¡¢¢¡¢¤£££¥¥§¨©§¦¨«°±³µµ¶¶µµ´³³³²²³±²²²²²²²²²²±±°±¯ª©¨¨§§¨¨¨¨¨¨¨¨¨¨¨¨§¦¦¦¥¥¤¤¤£¡ ¡¤¥¦¦¥¥¥¦¦¥¤£¡|zzzyyxvttsrqponmkifb^[[^bm~ ¢¤¥¥¦¦§§§¨¨©ªªªª¬®®®®®®®®¬¬¬¯°±²³³±±¯«ª©¨§¤¡|hFGDCDGIIJKKIFDGLNMGBBEGKRTNJKQWYUIGGDDHKJIHHKNQRRRTVWOGB>?MRJNMJJGE@:569:75338:99<<:9<@GKMJGMTX_cggfghjc^[NIGHG<2-)$&08;>BEHIHIGFGIJJHGMR]m} }}~||~||wtuuvrkjnnlmpuww{~|zz~~}~~yrswvmfc]VKMNNH89;>=>ACB=<;9888:<<=BFB>AABHIIGFDEHGIJKKJLKGEEDDCFLLLKJJJGEB??CFHFEHHGHIPZc|{se]M<5325¨©©©©©©©©ª§¨¦¦§¦§©¨§¦¦¦¦¦¥¦§¨§¨§¦¦¤¤¥¥¦¥¦§§§¦¦¦¤¤¤¤£¢£¢¢¢¢ ¡ ¢¢¢¢¢¢¢¤¥¤¤¦§§©¬¯°±²³´µ¶¶¶µ´³´²²±²±²²±±±²²±²±±±°¯¬©¨§§¦¦¦¦§¨¨§¦¨¨§¥¥¦¦¥¥¥¤¢¢¡ ¡¢£¤¥¥¥¥¤£££¢ ~{zzzxxwutsrsqponmkhda]\]`bjw¡£¤¥¥¥¦¦¦¦§¨¨©ªª««®®®®®®®¬¬¬¬¬®°°±²²±±¯¬ªªª¨¦£ |mGDB@@DFEFIJHDDHMNLGA?AEJONKIKOTUSNMJE??EGIIIJKPTTSRRRLC>:86789;?BCA8005;??>;:=??AGKLMLMSZ^]]`cbchlmnopplg`YVSUP@653.+29>?CFJJIHGGGIHDBELcw{ }}}}|}~|yvtwxvoifimmouy|}z||y|{w~yphfaYSPL>:=><:;=>=856:>===;>DIIC>:<BILIEFEHJJIJJIKKHFIIGHIKKIFJMMJGEEGHILJGHJJJLQ\j|n\H<60-28¦§¨©©¨¨§§¨§¦§§§¨§¦§¦¥¥¦¦¦¥¥¦§¨§¦¥¥¥¤¥§¦¥¦§§§¦¦¥¤¤¤¤¢¢¢¡¡ ¡¢£££¢¢¢¤¤£¤¥¥¨¬±³²²´µµµµµ´³³²²²²²±±±±±±±±±²²²²±°¯«©¨§¦¥¥¥¦¦¥¦¥¥¥¦¥¥¥¥¥¥££¢¡ ¢¤£¢£¢¡££¡ |{{zzwvvuuttsrpomkihd`][]`cgr¡£¢¤¥¦¦¥¥¥¦§¨©©ªª®®®®¬¬««««¬®¯°±±±±±®¬«««¨¦£ |oMEC@@DEDEHIHEEKNMJGECDGJLKJJJMPQNKKIE=<?CEEHKMRTSQRSRNMMKF:34457:=<635;@BC@=<?CFKNSWYZZ^abbbacghjopqrrqojd^ZUOI=;;:7359=ADIJJHIIIHIFBAEVr{ ~}~|{} ~{w{~}}tdbilnrx{~}|~|} ||yth^YSPF>?@>:9;<9535:@CC@=?DFGFE@=DLONMMIKKIGHIIJMJDHJHGHGHHDDHKJJIKNQPNMKJLKLNQXmy[;35018?¤¤¥¦§§§¦¦©¨¦§§¦§§¦¦¥¥¥¦¥¥¥¤¤¥¦¦¦¥¤££¤¥¥¥¥¦¦¦¦¦¥¥¤£¢¡¡ ¡¢¢¢¢¢¢¤¥¥¤¥¦ª±²²²³³³³³³³±±²³²²±±±±²²±±±±²±±±±®¬¬©§¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¤£ ¢£¢¢¡¡££¢¡ }|{zywwwuuuttqomkihfb^\[]adho{ ¡¢¢¤¥¥¥¥¥¥§¨¨©ª«¬¬¬«¬««««««¬®¯¯¯°±¯¬««ª©¦£ {oPHEBBEFEFIHEBEJKIHHIHGGIKKKKKLOOJFFGD=;=CDDFMPTVTRRSPOQTTPH?<<9679879<?@BCB@GLOSW[^`__``abfhhghiloqstsqnje^YOFHDCA<8788>CGJJIHIIHHHED?Lo~~ ~{z{}}{| vknsutxz{~}{~~~}}{i_]YSHAEDA=;==96569<>>;9?DDEFHICDJOQRPIHJLIGJLLMMHFIGDEDFHFDDDDEGGJNRQPPOOOPRTYqtV5234<D¢£¤¥¦¦¦§¨©§¥¥¦¥¥¦¥¦¦¦¥¦¥¥¤¡¡¤¥££¥£¢¡¢££¤¤¥¥¥§¥¥¤£¢¢ ¡¡¡¡¡¡£¤¤¤¤¨¬¯±²´´´³²²³µ´±±²²²²±±±±²²±±²±±±±°¯¬«©¨§¥¥¥¥¥¥¥¤£¤¤¤¥¥¤¢¢ ¢¢¢¢ ¢¢¢¡¢¡ }|{{zyxwvtttsrpomkihd`\\\_bdglw ¡¡¡¢££¥¥¥¥¦§©ªª««««¬«««««««««««¬¬¬«®¬¬«ª©©§¥¢zpQJGEDDDEFFA>>BFGGFHNMKIJLNPPMKMLHFGGE?=?CEDGNSWYZWTROOQTSOMJGC=8778<@@??FNR[dfghghhgcbb_\`gmonllorsrqnlkgec`ZQQQMF>;<==BFILLJIJJHIHECEbz |}| }|zy{z{|z{|}|zxz z ~smig^WQNIE=9997667889:9:=@BDFIJIFEJJIIHFGJJFLPMLKJGGIGGFGJFDCCCBBEINTTPOSSRTUWav `:2;AF ¢¤¤¥¥¦¦¦§¦¦¥¥¥¥¥¥¦¦¥¤¥££¢ ¢£ ¡£££¢¢¡¢¢£¤¥¥¥¤££¢¡ ¡ £¢¤¤¦«°±±²µ´³²²³³³²²±±±±±±±±±±±±²³²±¯°¯®¬«©§¦¥¥¤££££¡¡ ¡¢¢¤£¡ ¡¡ ¡¡¢£££££¡ ~|{yyxwvtsttrqpnnmjhfc_\]]_bdglu ¡¡¡¢¤¤¥¥¥§¨ª«««««««««ªªªªª©©©©ªª««««©©¨¨¥¤¢{pQIECCBBBA?:79>CFFHJNOMLLPRRRNKLKIGHJIFDCDHGIOSX\^\XRNLMQPMJIHFA956>FHEACVhmoqqqqrpmkhd_[]admqpmmnooljd``^`ehhd`XOHDA@ABDHJLMLKKJJGBA?Zu }~~ }{{~~~{y{}~~{yz{{}~~}{vqha]SNF913566798:;;<=>@BEIJIIHGFFEGECDGDFLLMLLGABHJKHGDDEGIGGJMPWXUUXZWX__hkF=CE ¢££££¤¥¥¥¤£¤¤¤¤£¤£¡¡¡ ¡¡ ¡ ¡¢¡ ¡¡¡¢£¢¡¡¡¡ ¡¢¤§«¯±²²²³´³²±²±±±±±±±°±±±±±±±±²³²±¯®¬««¨¥¥¥¥£¢¡ ¡¢£¤¤££¢¡ }{yvvvutssssronmlkhhea^]^_`bfjlt}¡¡¢¢£¤¥¥¦©«ªª©©¨ªª©©¨¨¨¨§§§§§¨¨©ªª©¨§¥£¢ {pQHDDC?>=>;778;@EJMMMNNNPSTUSPNNNJIKMLKJHHMMMPTW\^][WRPOONNJJKKF=;FIMMIIRepqrqqpomkkljg`_ffglmlihhhjhc_\[[]bfhih`WNHC?AFHJJHIIHIJHEA>Hgz ~~}}~~}zy{~~~~{wwuqomkgc[QG?9;:76689;:<?@ABEHGCGKJIIHFDFGGCAFJJJMKE@CIKJHGDDGLMMSW\ft}|xxyzu[LJ ¢££¢¢£¥¥¢¡£¤¥£¡¢ ¢ ¡¤¦ª¯±²²±²²²²±°°±±±°±±°°±±±±°±±²²±±°««ª§¥¤£¢ ¢¤¥¥¥¥¤¢ |zywuttttssrpnnmljhhd^]]^`bdhlmrz ¡¢¢£¥¥§©¨¨©¨§§¨¨§§§¦¦¦¦¦¦¦¥¥¥¦¨ª¨¦¥¤¡zrUFDCA@<;<;9:::>EKPOMMNPSUVVTPPPOLLOQQQQNMPPPRUWYYYZYWTPMKLKKKHC@IROPPU_gnorqponjedgmliegllkkifdcdfhe][ZZ\^abeghg`ZOE@BGIJJHGFEFFED@@cwz } ~ }{yz|}xwyzxvrmkjjjkmmmj]ZQCA?:622479;=@BCEGE@DKIKLKIINROLFFHJLKMLGIMLLNLIEGILPUZhs |`H ££££¢¢¢¢¡¡¢¢¢¡ £¦¨«¯±³²±±°±±°°°±±°°±±°°±±±±±±±°°°¯®¬«ª©¦¤¤£ ¤¥¥¥¥¤¢{zwuuttttsrqonnmkjhgb^]]^cdfilnsx ¡¡¢¤¤¦§¦¦§¦¦§§¦¥¦¥¥¥¤¤¤¤¤¥¥¥¥¦§¦¤£¢{vWEDB>>><<==>>=>DKPNLMOQUVWWVTSQOKKNQSUUTRTUUVWXXWVUWYVPJHFCCD@@FTWRSYeonnoonnlkgddjpsqmnnnnmifedccc`[ZZ\]^abbbeb\WMEACFHJJJIHHGDB@;Ipxxz} ~~ ~{{{z}}}zuqpmoonlklnpqrrqnid\PKHA62017<?@@CDBCB@EKKIIJJLLMRSNMLLLLLOKIMPQPKJILLLOXh} k ¡¡¢¡¡¡¡ ¡¡ ¡¤¦¨«¬®°±±¯®¯¯¯°¯°°±±°±±±±±±°¯°¯°°¯¯¯®¬«ª©§¥£¢ ~{yyxxxzz|}£¤¤¢¡¡ ~{ywutttssqponnnmljhfb_]^`cfhklotx~ ¡¢¢£¥¥¦¦¥¥¥¥¦¥¥¥¥¤£££¤¤££££¤¥¤¤£¡|vUDC?>>>>>????@BEKNMMNOQTUUVVVTPLHGJOSUTUUVWWXXYYXURVWSMHC<76549ETWU\gmrrpllkjigfegknrttsnknolkmlf`_aaaacb___^bb^YVOE?BEHJKLJJHFDC@<Lnwxy{ ~~ ~{}}z||yurnoqtxzytvyxvttuuoicULC:3128>BDBCDEDDCHJKIHIJJFCLQQPNLLJFFFCFLPOJKMNQQWnx¤££¡ £¥«¬¯¯¯°®¬¬®°°¯°°±±°¯±±±±±°¯¯®®¯¯¯®¬«ª¨¨¦¤|xuvupjfiokjnruy ¡¢£¢¡{yxwutttsrqpnnnnmljhfb__`bdgilnruy| ¡¡£¤¤¥¤¤¤¤¤¥¥¤¥¤£¢¢¢£££¢¢¡¢£¢¢ {sSC><=?@??@@BCCCEJLMNPOPRRTWWVSPLIFGMPRRRTTSRRSVXXTPPOKFA=960-/6BMT_nrrqomheghedggggjnstsmimpnmopoihllkklib^^aeda\YVMECFIKLLJJJIFECCUqvvwz} ~}~~|zzxtnlpz|wvyxvurstspj_OA86579=?BABEJLKIJJLLKJJJFAGMMMMMOJDAADGIKJMQRRX`ix¥¨¨§§¤¡¢¨«®±±°¯¯¯°°¯¯¯¯¯¯°°°°°°°¯®¬«©©¨§¤¡ ~{vromkg[K<1019JWckqu| ¡ }ywwvttttsrponnmnljigeba`bcfhjmosvy} ¢£££¢¢¢£££££££¢¢¢¢¢¢¢¡¡ ¡ ypQ><:;=@@>>?CEFFFJJLPRQPQPSVWUPMMKIFIPSSQQPOMJJOTRQOMKGB=974/.1:GITmwvtnjgecgigghhfegkqtspkknmjkoqtwwuspolgeehfc`[VSPKHHIKJJJKKJGDBD\tuvvy~~}}}} ~~ ~~ ~~|z{zwrpqvzywuuvvtsronpoie^M<;=<=@@BDEHKOPNKIIMONJJJEFKJGEJMLJEDINNMKJMQYahry¤©««¬©¥¢ ¡¨ª¬°°°°¯¬¬®®°°®¯®®¬¬¬¬¬¬«ª¨§§¥£}{vum\UQSPA/###$,;Ueksx |yvuttssrqpponmllkiheba``bdgjlnqtx{~ ¡¢¢¡¡¢¢¢¡¢¢¢¡¡¡¢¢¡¡ ~yoS:;:;=>??==?CEFHLLMPQRRPOPRTSNJKLLIJQTTQMNMKFEINONNNMJD<75443>HOPZowupkhgghjjhhjlkgdfosuunjlollpsuwutqopomnoolc]YTPLIGEFIJJJJJIGEDE`twwxy{|{yz||~ ~ ~ }~~~~zzywwwtuusrqsuwyxyytrooswxo^F@ACDECEFFGKMMLIHJMMJILHEIKF?CGGIIHKNPONMMQYdkx¤ª¬¬«¨¦£¤ª«°±°°¯®«¬¬¬®°¯®®®¬¬¬¬«««ªªª««¬¬¬«ª¨¦¥£¡~zurnh`\PB7+,)%$""!!#$#9ajpw ¡|yvttsrqqpponnmlkjhgca`abdgiloqtvy} ¡¡¡¡¢¢¢¢ ¡¡¡ }ypT686689:<;:=@ACFKMNOOQRNKLPQQOKMMOMNQRRNJIIJFEFHILMLIEA;8778;OZY\`kstnklljlkhcdipqkcdlpuyrkkppqtutrnkjjklmmnoleXROMIDB??FKJJJJJIEDFivyzxxxz|z{ ~ ~|~}~~}zwssvxwvspqpsuvwuvvtsstw|zrj_ULCBBCDDDDEGJKKJIIJLMJHFHJH@@CDEIKLLOQPONRUak| ¦«¬¬«ª¨¥¥¡¡¥ª«®¯®«««¬¯¯¬¬«««««««ª«ªª«««««§¤ |wrmi^SB2,/0*!!$2Ykqv ¡¡ zxutsqppppponnlkjigea``bcfhlnpstwz} ¡¢¢¢¢¢ }ysU00--/34568;??ADHKKLLNPMJJOQQPNNOPONOOMJGFHJMJEDDGEC@<;;;99;BU]^^]ajnnqqqqpme_^cntoihmpsxvmgkqruutrmihgfghhigff[REBC?@A?DKKJIIHIHDRrxyywxy| ~}| ~ ~y|}~{trsvzzxtuuuuttsstussvyywsqom`R?@BGFDCDFHHHJKJJMPTOJIGFDB?AEEGKNMOQQPQQS[k~ ££¥©«¬««©¥¥¡£¦ª¬®¬¬¬«¬ª««««¬«««««««««««««««ª¨ª«ª©©¥|xsjaWTE:*$!!")Ffpv ~yvtsqpoooooonmlljhfca``begjmoqtvy{~ ¡¡¡¡ |wqR+)((*--+,058:<@BFIJKLNOLMPRRRQPMMMLLKIFGEFJOOJE@=84237AA<:;DU[\ZZ]cjqttutrngb_ainnmkmnpuupgglnqqnlkkihffffe^]dc\I?><>BCGJJIGGIIJG`vxwvwxz}}~~ ~~||~}ysqrqtwwvttssrsttsrqswwwuuz|sPCDEADFIMMMMNMOPQOQQPRRPOOJ@ACEIKHIMRROOSXk~ ¢£¦¨ª«ª©¦££¡ ¢¦©ª«¬¬¬«¬«ªª©ª«ª««ª«ªª««©©ªªªªª«ª©¨¨©§¥¥¢~}uqkeYMC/'$# !8^nv} |wutsppoooonnnlkkigecbbcegilnpsuwy| |voT,*)''(('&'(*.16:;>CEGIMLMOPQQRQONOMIFBBEHIJLNLG?81+*0>FC>=?HTWXW]efnvwvurqrnljgiiijijmpronhfhhjjjihhhhfgiki`W_eaXI<<=@EIIIJJKKLKTmzzxwxxz{~~ }~ ~~}xqmpomlkjklmnomhhnsrpoprrssvz|m[QB8@IJJIORQMPSTNKLOQUWWWVK?@GJJJFHOQOPSZk¤§¨ª©¨¦¤¤¤¢ ¡ ¤§ªª©ª¬«««ª¨¨¨ª««««ªªª©ªª¨¨©¨¨¨©ª¨¨¨¨§¤¤¢}wrpjd_`[D4+#! 0_mu~{xvsqoonnnnnnmkkjhgdcccegikmoqsuy{}~zwqaC30)&&&'&%##$%+../38;>BEFEFGGIKOQPNIC?@CHIJKKJD80-*,7GIC?ACIVWV]ipquvvwunovwvtrpljihimpnmmlkihhiiiiiihfdehkcU]fc]M=;<?EFEKNNMLJEYqzzzzwvxz{{~~~| ||vfbgjiiklmkjoqnkhinpoopqstrsvz {f]I;<BC@AIMOKHKOOJIINSUPNOLCCJLLLLIJJKMQZo¤¦©¨§¥¥¥¥¢ ¡ {xwwvuw~£¥¨ª¨§¨ªªªª¨¨¨¨©ªªªª©©¨©ªª§§¦¦¨§§§§¦¦¥¤£¢~}zud\YRKFE?2' "-_mx {xvrponnnmmmmmkihhfccddfhjlnpruvy| ~zxrkV;1/,,,)&%$%%$'('(+/247:<;;;:<@IMLKHC@?@ABBBA>:.)*.6?GIEDFFK]``jrrwzwvwtlqxxspqrnljigjoolmoojhhhhghjlmmkgcc_U\b_[K?<=?CCEKPPMLHBYuz|~|yvwz}}{}~}|{}||}{zz{~}}{||||~~~whefggfilnnotuurnkkklmqssrqptuwnaO;<@B?AHLPMFDJPNKJKORMHGIIIMOPPOLJKMOS^s¡ ¤§§¦¥¥¥£ }|wsooommqtx ¤§¨§¦¦¨§§§¨¨§©§¦§©©¨§§¦¦¨§¥¥¥¦§§¦¦§¦¥¥¤¢¡}vtkkoW=467545)!.ar{ {vtroonnmmmlkkkkigeccdegiklnqsuwy} |ywtpdN41210+'&()(&'()(),,,.02432136;@DFC@?=<:76633/%$*5;DJIFILMOahksxwz{ywvrmrvskgjkjjiedfikjkmmigdecbbejnstqh_YUWYXUF?>>>?BFINOMKIG_y}}~}{yyyzzyz|||~|{|{{}~}|{z{~} }{{~~}{{|~~~xpnnmjfkpppsvwzvpqqpmoqsrqonoonusjcH;=DHILKNPLGHNONOLLPNIGHLLLOPPQMJNQTYk¤£ ¢£££££¡¡ ~{vsof_^_bffmx{| ¡¤¥¦¨§§§¨§§§§§¦¥¤¥¦§§¦¦¦¥¥¥¥¥¥§§§§¦¦§¦¥¥¤£¡|kYL7,-1-%#"""#!5cv}~yvtrpooonnmlkjijigdcdefhilmnqtvwy} |ywuspcK8751+))***)(*+++,-,,,*,-.,+,/6;;;:8540*(***&" (7>FKKINSSSclovzz{{zywrmormffgfehfcdfhhhikljgbbbacfikqvxqWNLNNPL:9;;<==?FJKMLJQp{}}||{{zyzyxz{{||{yz}~~~}|}| ~}~}~{|~~~{|~{vtvwyyuwz{yz||tpsttsqopqsx|vry|cEFKJMKJMPMJJKMPMKMMLNNLLJIKKPROPQRXp£¥£ ¡¡¡¡ xwsmbNMPRW[\gquwz~}{z~ ¤¦¦¦¦¦§¦¦¥¦¦¥¥¥¤£¤¥¥¥¥¤¤¤¤£££¥¦¦¦¨¦¥¦¥¤¤¢ wkU;0$!!!";ox}xutqononnmllkjiiggfeefgiknnprtvx{} {zywxul[<86/*(*,,+**,,++,----,*+-+))+-0/..-**(" !"6BFJKKOYYWalsxz{zzzzxrllmgcggdbfgghhgffgijidabbdgklklqvtUGEHMPJ:578988<CJMNMH\yz}}{zz{zyyxz|{{zz| } ~~~z{}{zxy{|| xttuuspqs{yxwy}|bIADHLGEMNLJIJKMIHJMOOMKJHIHJOPNPNY{£¥££¡¡ ¡¡ |wtkfWDFJKLS^fjqsuurnqu| £¥¥¥¥¦¦¦¥¥¤¥¥¤¤¤¤¥¥¥¤¤¤£¤¤£ ¢¥¥¥¥¦¥¥£¢¢¡ulU,*#'Lx~ {vtrpnnmllmmmkjihgffefghjmnpqsuwy{} }} }zzyxvpfJ62-((+,++++./+(()*.0.--.,+)'&&&&&#"!!#6ACFJKNZ]]bksx{zuy{|yrkijd_ee_^^bghhgdcccdcba`aejprnmkmo\LKNRL?9776788:?HMLJC^{{|{zzz|{zxxzzz~}zxxz |{y|~ ~yz||{{}}}}trtvvsqu}zyz|d><AIE@GKKJIHKMKHJPPQQSROMMKLKLOLc¡£ ~zxrjdTCA?=AOYX^gf_SWciny£¤¥¥¥¥¦¥¥£¢¤¤££¤¤¥¥¥¥¤¢¢££¡ ¢£¥¥¥¥¤£¢¡ qQ3$! )\z¡£¢¢¡ }zusqqommlllmmkihhgfffghilmoprtuxz|~ ~|{}~{zzzxxunN.+'$&'&&'**++&#"$%**+-/.,+)&%%$$"!&8ACFJMPZ_`chpx{vptz~}rjih[Y][TW\^`cfgedddaabaaaflrtplgcea]]ZOB:788624799AFGHEd~{|}||{zzzzyz{|zwuw~~~~{wz}| ~yy{z{{z} w~ |uwxvtsu~uu}d@AFFDFGJJJHLMJJLNQRQRSUVSPOPQOQg {wsndWB;66636AOPE;BLOO^q~{¡¢¤¥¦¥¥¥¥¤£¡¡¡ ¢¤¤¤¥¥¥¤££¢¡ ¡¡£¥¥¤¤£¢¡ |pU*" 5mz £¤¥¤¤¡{xuspqpoomkllkjhggfdeghjlnopqsuxz{~~~~}zyzzzyvpZ0$#!!!!!$&''%$$##"$%(,.,+***+))(&$###"%&$""#$-=ILKKOV]abdipw{tnqvyymgh_PUYUOR\^]]`bcegjhfgffgkpttqmb^_cegcWK@:9970+177=BEGKn{{}}{zzzzzzz|{zywy|}}~ }y|~|z{}}~~zz{yz|{y ~yz|z}|zy{ont|fCDPOLGHIJJLJFFGEKOOPQTTTQQPOPRg~|ysmf[D:31.**176-+991Cbrv{ztu} ¢¢¤¥¦¥¥¥¥¤£¡¢¤£¤¤¤¥¥¥¤£¡ ¡¡£¤¤¤£¢¡~nZ>$ Nx}¡¢£¢¡}yurqqpoonnmlkjihffecfhilnoorstvz{~ ~~ {zzzzzzwsiE$" "#&'&%$#%%%%'+,++,.01../-,)),*)*)(((+5HPOKKT^_behkowxqilrroiggVNSVTON\e`\]aefhmoqtqljmrutqmb]X\ghe_XD<:861++16:@DDPs~{z{|{yyyz{{|~~|zy{{|~ |z}}~}{z~{|~|zz{{~|{}~~}}~~ xoryy^BOPQOLIIIMMJFDCDDFHKMLMLIEIJKe~}ytog^K:3-'""%'''%*,0IZ`bgmos| ¡¢¢£¢¡¤¤¤¥¤£¢¡ £¤¤££¤¥¤£¢¢¡¡ ¡¡ {nS9(/h{¡ }zwsqpoonnnnnmlihgfeeegikmnoqrtvyz} |xyyz{{zxtqZ1$#"#""$%%((''()+*+,/0003346456420/1.+,,,,-/6LRLGG[feeeghnuvlbadiige^SOPWXTP^igedeillpsutqlhjptspnf[UWac[TNC>;62/)%*38>CCUu}}zy{|{zyyyz||~~zyzz{}~ ~}zz||}~~|yz~}~|z|~~~~}}~|{{}~~~}} ~}}|}fQSPNMLIHJKLHFGHEDEGEFIIGFIIGi }wriaM80($ "$$$&/><>IU^do| ¡ £¤£¤¤¤£¡¡¤¥¥¤£££¤£¡¢¢¢ znT6'!Nx} {wtqponnnnnnmmligfdddfhjmnnortuwz{} ~ ~zwvwzzzzyvtg>(&%&&&%'(***,//0/.035557778888766540//012215AGDBDUac]TV`mtsh^YY^_b`XSPTX`]Xcjejnnnrrssromigfkrpmjb[WVVWRHC@=971)"!+5<?@Pty|{yy{{{zzywxz{~~|{ywwxyyy{~|z|zxy|~}|~}xw{~|z{{|~}}{~ ~~~}yyz|~{{}}~|} zy y{{udXPOLKKJHIJJJJKLJJIIHIKJIIDBi~ {tmdT:.)$ !"!").,4AESan{¡¢¤¢¢££¢¤¤£¢¡¥¥¥¥¥£¡¡¢££¡ |o[:& 8l}zvsqonmmmmmmkjjigeddfghikmnoqttwy{} |{} }xutwzzzzywuoG(*((**)+,../1333435688889:9999999863344445449==AFOW[SIQgqnfb]VVVUY[YXY[\ihdkjbhrtrqmllkjige]\hoh^SSSSOLH@>=:870& '5<=:Gov{zzz{{{zzyyxyz{zxvuuwxwvwyyvtz{{{yy|~}~~|{}}{z{~~|z| ~~~~}yxwzyx||{{{|~}{}}z{z tsvvo[PQPIIJJKJJJJKKHGIJKLMJIJE?_{}uqg[J1*(# $')1=@Mbs~ £¤£¤£¤££¢¢¢¡¤¤¤¤££ ¢¢¢ w_>*(\x¡ }{wutqpommmmmlkjihgeddeghilnnortuxz|} |z{} ~zvttuwzzzzyvpW3/+++,./0112234578878888::::::::998676655666:AJOSTVUPGZppg^[\VQPMPX^^`__opnrmcfqxvoighjjhd_XUZ^WNEFJOJC?<:;951*#"0:<<Iotxyzzz{{yyyxyxxxwutvwzyxwyyuttvzxyzyz|}}}}{}}}|{{xwyxuwxwy|~}yx|}wprvtjYPMFBCGLKJHFFHHHKLOPRPLKDDWu~wsk`Y>.-(%#"! "#$(,4<AN]t ¤£¤¥¤¥¤£¢¡ ¡£¥¢¡ ¡qT8 Imz ¡{ywutqonnmmlllkiigfdedegikmnoqstvyz{~zwtux{|~ ~{zxvtttuxzzzzwqeC3.--./1123344579999989;<<<==<<<;;;:;9878878@T^``\WSMPglibZWXTOOMM]ded^auttvoggqzwojjkmnlh\VSTVMG?<?IE><::;:4+&# (9@BNpswwxy{{ywwwvwxvvttuvy{zyxxvtttuwvxzyyzzzz{|~~~~~~~~~|| ~||wwwwvxyutw~zz~rloosnVLHDEIMOJGFGIHKNNPQTSOJGFPt{uphhN<0-)(%#"#%&')-38@MZq ¡¡¢££¢££¢¡¡¡¡£¤¡ ynR@!1fv| ¡¡ }{xvtrpnnmlkkllkihfdcedfhikmnoqsuwyz{~ }vnhikrz|~ ~} ~|{ywvuuwvvxzzzzxtmO130001224666678988:;<==>>>??>>>>>><=<:899:;@Ydgd_WPR`icda[WUSPPP]igie[fwvxxommqxupmoqstrk\UPNOG@;7:GA9989995*#!! $6ACOipstuxzyxwvvuwxvtuuuwzzzzzyvuvuttvxyyyzzzzzz{}|~~~}{{~~~|}~~}}yxwuvwwxvtvz}{~}}xomrubHGHKKLMLLKMLKNLJMNMKKJJFJp~wtqj_Q:0++)''(('),.27EM^u ¡ ¡¡¡ ¡¢¢ ¡ ws`L01brz ¢¤£¢{yvtrqonnmlkkjjjgfdbcefgijknnoqsuwyz|~ xofdcfmu{~ ~|{{~}}}{wutuvvyxxzzzzzyvo^553333468998889;::=>>>>>?@@@B@>>>>>>=;9::;<@Xbcba[W_ec_ba\VSRQUakiig`]ozwxvqprtxsjkpuxwriZSOJIF:437E>6677776/(%$! !"1BEMdlmptuxwyzywvxzxuvxzz{zyzzzxwyxttxyyzzyzzzzz{|{z|~~~~}~~~|{|~}zz|||}}|{zz{yvvxvuvuwyxz~} }y}}{wwvsP5:DHEFIIJJGHHGHKKHFEGFBDm }yumgfV@502/,-.,///3?QWdw¡¡ ¡ }}sjP,#Tvx ¡¡ {ywtsqpnnmlkkjhhgfeccdefhijkmnopstuxz|~~ ztidbcemu{}}zyz{~|z{}zusstvwyxyz{{zzyxsfA998767:;::::::;=>?@AAA@BCBCEC@>>@@A?=;<<:<@HUdgdaeifdbca[VRQQ]lljjebjx{xywrruxvnhiovusogWNOJFB7003:52430/01.,,*'&%'0?EQehiloptuvwzxxxzyxxz|}~|zzzzyy{zwyzz}}{xxzzz{{ywxz}}~~~~~~~~|{{{{zyxyyz{}}|}}{yxyyuuuxyusw|~~~~xv{~~zy~zz}|qJ?DFFHIHGFCAAABEHGDACA=@jz{|ytold_S;921112514@\mtw~ ~yqdS7* !Dp}{yvurqponmkjijjhggedceefghjjlnooqstvxy{}~}vmgcbdhouy}~}}~~~}{zyxyz|}}{{zzyusstuwyyz{{{zzzyuiL???=<??>><>@AABDEFHHHHHHIIIJHGDCFFFDBAC@=>@BPfjhhkljhghcYXUUV_ilmigkv|zyxvssttjghjoqqmjbUKMJC?81.00-03/+++,/2342122/7dzzvpmmoprsuyxvvyxwwz}|}{||}|z{|}}~~~{yxyz{}~|y|}~~~~~||~}{zywwxzz{}~}|||}~|{{zxwy|{xtuz||{|~~xtvy}}z|y|~jNONOOLMLIGGIJLJIHEBA@BG`tuty~ zwsmlgZQG=9964A[ksz| |troQ2% Hsv|¡¡¡¡ yvtsqpnnnmkihhhhhgffefffghjkmnnoprtvwyz|~}yogedefjnsx||{{{}~}~~}{zyxwwxy|~}||{zywxvttstwwxz{{|{{zzwkUJGIIGHGHGGKMMMKMPRSTTTUUVTRQQQNMQNNMKKKGFEFFLYbglnlllmjaUTWYX[`lmjnuyyxwvsqrrk_`dkonkhe\RJKHB><930-,12---/257:>@>?=.F ~vtpprtwwvvxwutwzzzz}}}|}~~{zzzz{|}}}~||}~}}~{zyyyyz||z{|{|}}}{yy|~|yuux|~|z{{vttw{{y|z{dHNOONPQPMHEHKNKIIIEDHMR_kosw|~ |zyuspne]_elw ~{|q\L+! Fpyy¡¡ }xutrponnmljjihhgeefghffefijkmnooqtuwwzz|~ ¢¢¡ ~zpheegghjmpvyy{{{|{||{{zyxxwwxz{{{{zzwuvwvtstuuwzz|}}||{wm^UTUUTUUXWXWZ^]]\]_beca`abaa^[ZZYYZYWVVVTQNPOORYbkklpsqk`TQTWX\cnnmuyxvuvpjhmoh]\_hojcc_WMHJIC>>>8/-/1234468<?AGLJFD5_~zpnquyzz{zwtuyzz{}||}~~~|{|~~{z{~~}}~}~}{~}{|{{zz}~|zzz||}~{z}~zvttty|wvvvxx{~}yvx{ |hPJMNNMIKIGHKMNJFFFCDE?MW[flx{{ }}z{~ }zrcC- %Qrxx~ ¡¢¡ |zvutqommmkjijihfedddefghgiijkmnoqtuvxyzz|~ ¢¢¢¢¢ |rlfdfhiijmpsvz{{{{zzzzzxxvuuvwyyxxwwvuuvuttsstwyz{}~}}|yqd]]^___`bccbdfeeghjkklllkkjjjhgfdcbbba_`___a[VUXajhkrvun`TQUZ[`jqpouvtrrsk]_kmf[\_djc\[[UJGJKJHGFB<5445789;<@EHLOMLIHt¡¢ woprx{|||yvvz{z{}~~~~~||zz}{z}~~|{yz~~}~~~}|}~~~||}}{z{{{zzz}}~~~}~{||xwwxwz}~wtw{{zz{zxxx|~ }`RRSROKHHLNPPJB>?>?@A?AGPXahgho{|} }tm]A#$Tu|z~ ¡ ~zvtsqppnnmkjijigeddccdehiiiijklnqttuvyz{z|~ ¢£¢£¢ }wqhfghjkklnoqvyzz{{zzzyxvtrqruuuvutuuvvvwvutstuxy{}~~}{yrhddffggiklkklnooqsttuuttuvuuspoomllkjiigghhkf[VZbeiosvvsdUSX_`epuspqpqooneX^jka\]`bb]WWWSMIJNPOMKHFB?=;;;<@BDHKORRTOY£¥¤¡vonsxz{{{zyzzz{}~~}|{{{|{|}}~~}}~~}}}}}|{}||||~}|}~|{{{}}|yw{|{zyz{}z|~}}}|}}|}~~~zvy|}{yxvwyz|} ||~pVQQQSRLGFHIIHB>==>@><>DAFJPSUZahv} ywulWC%-Zuvz ¡|zwtsqonnnmmkihihfddccccdghhiikklnpsttvxyxyz| ¢¤¤£¡}yrhfgijlmmnnnpsvxyzyxywusponprstuutuvvvvwwwvvttvz{}~~~{xqkijklmmpqsrstvxyyzz{|{z}}}{zzywvusqppoooopppok`Z[`jorwxmaXY\bejrxsonnnnnj_Xajh`^accb\VVSQQOLLMLIEBCDEEEDB?CIKMPUXY_mz¢£¤¢{qnpruwxz|{zz{|{}~~}}}||}}{}~~|{|~~~}~~}z{{{|}||zz}~~|zzzz{|{zy|}{zywyzxy|}~}||||}{xyz}|yttxz{|} viVVRKKMQSQLHGEDDC@<;;=?>>==CDDHOVU^r| |z{yvrfK@B;2.',Nlux|{xvsrpnmnmlkjhhgfebbbbcdfghhiklklmoqruvvvvxz| ¥¦¥¢ |yrjegklmnnnmmnpstuvutsqomlmnorsttuuwwvvwwwwvvvuuxz|}}}{zsnmmooqrtuwxyyz}}|zywxwvwwwxwwvvod[_gklol`Z\]adfksupnnnmnlc[^jkfabhiee]URPNOPPKHFCAABBCHLLIFJSUWX\`gp¡£¡qmkmqtwyyyy{}~~~|}}||~}||}||~{{|~||~}|}}{z{zzzz}~}zzzz{zzzz{||{zx{|zyz|}~||{yzzz{zyyzzzwtw{|}~ujVMKHHLQSSRNMKGDC?=====<<>>?ADFMUWdr{} ~|{}~{q^WVSMN\mx{y|}yvtsqonmmlkjihgfecbbabcefggghjllnnoqrtuvvwyy} ¤¦¥¡ yrifhkmnnnnmmorttsqpoonmllnoortvvvwxwwwxxvvwwvuvwz{||{zyrnnnoruuvwyz{{| ~||{||{z{{||{zupjkh\XXQQ[\_`_fsqmnnkggd][bjjdbgnmhi_RMJIFGLJDA@@AABDEJPQRTX]_`dfo~ ¢~ukiloqtttuxz|}|}|~|}|{}}}}|{|~}{z{}}~}}yxy{~~||{zz{}~}z|}}|zzyzyz{zzz~|zzz{{|}}}}}|zyyyzzyyzzyxwz|| umhXFDFIMQUUQMJGDA=;<>@>=::=?CFKPVZisxzz{| |{uuyz|zz |yvttrqonmlkjihffeca`bbcdeghgghjkmnoqrstuvxyz{~¢¤¦¥¡ yrjhilnnopnnoqrtsrqponnnmnprrtuwxxyzzyxxxwxyywvuuxz{{zxuomnoqsuvxyz|~ ~}tbOPMHKQSVVWcsqnppaZZZ\]ejhdchnlip]KBA@==KOHA@ADFEDDFNTX^cgijlo{ xlgkoqqrtvvy{zz{{|}|{z{}~~~~}~~~|}}}{zxvuv|~~}{{|~~ywwvvwyyxx{{xzzzz{|~}|}~|zxxzz{|}}|{|}}~}| wuqj\LGFHIKMLHFDCB@=??>??>=>BEJRT[`ntxzy{{}}~ ~{z{~ ~yvsssqpnmmkjhhgfedba^abcddeghhhijlnpqqstvwyz{}¡¤¥¥¢ |tkhimooponnprtutsssrooooqsstuvwyzzzzzzzzxyzzzxwvuwyyxurllmorstuyzz} |j`]RKIFEJQTawqpqlZTUUWajjgeeilfgiOA;:9:=GMHBABBDEEFJPW^dilpqty wjhkmoquwvwxxxxzzzzzzz|~~}|}~~~{zxwx|~}||y{}~~{wvvxxwxxyz|ywyzzzyy|~~~|zxxz{~}}|{z{||ys_UMFGIJHIKHCA@@DC@>>??>?@DGMSX\corvxxyzz{|~ {vtrqppomlkjihggfecb`]`aacdeghhhijlnpqqstvwyz} £¤¤¢ umklnppqronprtvuttttqqqrttvvxxwxzzz{{{zzzzz|{zzwuuwvtqmjlnoqstvzz{} w_QIGGKQR_xrtpbYVTTZhnkhghig^YTE>:9:=?BEEEECBDFHKOU_ejpswwywigjnrwxvvxwwxyyyzzyz|~}~}~~}}{|}{zz|~|yyzywwxxxyxwxyyxwvy}~{yzxwy}~|{|~~} ~vcLGDCGLNOOLFB?@DEA>>>>?BEGLOQY]dosuvxxyzy|~}~ }xtrqqonmkjjhggfffdba_^__abeeefhhiikmoqqstvwyz}¡¢¡ wnmmnpqrrportuwvvwvtsrsstuvxyzyyz{{||{z{{zz{z{{xvvusrmjikmoqsuwyz{|~ f\]^YRRT`utqcZYXVW]jnmkkmeXMGHA==>ACDDDFIGFDEHMPRV^gnuwz{|rkhiqwywwxxxxyyyzzzz{}}~}|}~}~~|yxwuwz{}}}{z{|}{yzyxwwvvvvuwwwwwvy{~|zyxwy|}|~~~}~}~~|~rO@ACFJNNLKHFB??BA>>>=BGHJORTX^gpqtuwwxyzz}}~ }zvsrrqpnmlljhhfeeeca`_]^_`bdeeefghikmopqsuwxyz|yqmmoqrrrqpsvwyyyxwvvutuxwxz{{{{{|}}}}}}|{{{{||zzyuqnighilnpqsvxz{|~ wvxytf^_cffaWW\]]\`iooljjYIFDDCABFIKKJIKLNNLMSUY^bgmsxz|}~wmejtwvwxxyzzyyzzzz{{~|{}~| }{{zzz{z{||~}}}|z{y{}zyxxxxxvwwvvuuuvwvxy{}|zyzzzz{|||||}}}{{}|}{}]?=AIKKHEFDCA=<?AA??ADGHLRTUX`kpstvwxxxyz}}~~|xtsrqonmlkjihhfdcbb`^\\^``bbdefgghjmnoprsuwyzz{} zsonpstrrrrtwyzzzzyxwwvwzzzz{|{|||}~~~}{{}~|||{zvpkfefhkmppruvy{}} }wpidXRSTZ`a_Z]ekl`VSHB@CDEFHJMPRRRRTWWWZ`aejnquy||~~zpidkuuuvwyzzzyyyzzzz|~}}||~ ~~}}~|zyzyvvz{||{yyxwyzyywvxxwuuvxwvwzz|}{{{{{z{{{xx{{zz|||yz{~~{yylB<>FIIEA@>=@BA@ACCCDHKJLRTV[clpstuvwwwxz{}~~ ~{yutsrqnmkhhhgfedb`ba`^\\]_abbdeefgijlnopqrtwyzzz| ¡¢ {toortuusrttvxyzzzzyyyxz|}|{|}}}}}~~||}~}~}{zwqidcegjmopqtvx{}~ |yreXRPU\a\QOY]]ZQJHEEEGHJKLMPTY]]\_fhggjlptwy|~}ldfortvwyzzzzxyzyyxy{|}}|~ }|~~{ywwutuyzyyxxxyxyzxwvuvwxwwwxwvyyyx|~}}|{{zxsswyyxxxxwy{xy{~| rC=?BEFEEB>>?DDCCCCEILNOQRUZajnprsttvwwyzz|~} |zwtspoonljhhhfcab`]^^^\\[]^_abbdefghilmnoqrtwyzzz{¡£¢¡ }vpquvvvtttuwyzzz{{{zzz{|}}}~~~~~}|||}~~}{ytjddegiknprtwyz| ~yojeZWYTMIJSUSNIIHGHKKLNOPRTX_cgfinprqrtx|~wjdfotwxxyzzzzxywxxwy{}~}}~} ~}~~}{yxyxyyxvwxxwzyyxvvuvuuuvuvvuwxxwvy|~~}{zzxwwxwyyxxwvy}zy}}{{{xZ>;<?CEECCBCDCDGGHIKLMNPRU[empprttuwwwyz{{}~~ ¡¡ }zwvsrpnnmkjhfedb`^^\ZYYY[[]\\_accdefhhklnnprtwxyzzz ¡¢¢¢¢¢ yuvxxwwvuvxz|~~}}}|~}}}}~~||}~~~~|{zwnfdegikorsvxzz~ ~~|qaWQLJKMPPMKIIJKLPQQSUUVXY_ilnsvxzy{|~ xmfjswwxy{{zzxxwxyxxyz{|~~}~}}~~}|{{{zxvuuwuvzyxxutwvttuuuttuvwvvwzz|~}}|z}}}|{zz{{zwv{}}{{|yfB??>BBCDGLOJFFKMLJNRRRSU_hnppqrttvxyz{{{|~ ££¡|ytsrrqonmjhfdcb`]\[XVVWXYYZ\]_`bbbdeghjkknqqtuvwwyy}¡£££¢¢¢ {xxyzyyxx|~~~}}~~~~~|zzzulefghlorsuwz{~ sdYTSRRTSQOOOPPQSUXYYZ\^`bhquxy}pifmuuwyyzyyxxwwyxwxyyz{~ }~~|{zz{xutttuwutuuvwwttuutttuuvwvxzzz||{zz}}}||z|{{|zxx||{{{~x_ICAA@BGMRRPONNMLMPRSTSU`imoooqstuwxyz{|}~ ¡¤¤¢ |wsrqponnliea``^\ZYYWVVUVXYY[]^^_aacdfghijnpqsstttuuy ¢¢£¤¤£¢ {zzz{{{}}}~}{zzyqggghknqsvwy{} wica_^^_[WUTTUUVY\`bbdgjmrvy~ sg]^kptsuwxxwxwyyxwxyyyz~ ~}}}~~~|{||~{yustuutttuvutqqsutttttvxxyzxxzzxxyzzwwzz{{{||{| ~}yxywpgQECDCCFKPNOQOMNOPPOOWWYcimopqrttuvwxyzz|¤¥¥¡ ~zuqqpnmlkihd`]\[YWTSRPQRUXZZ[\]]^_`bcdeghilnoqssrrrsx} ¡¢¤¥¥£¢ {{{|}~~~~~~~~}}|z{{shdfhjmqsvxy{} {usstuwqjfaZZ[\]`djllnqv{|} £¢ veUIO`qstuvwwxwxyxxyzzz|~~~|{{~}}~}}|zusuwvuwwvutsrrrtttttvxyyzzwwwxxwxyzxxyz{{z|~~~}|ywunVPOGEDEEDDFFKPQPPPPPOQXY[fkopqstttuwxyz{{}¡¥¦¥¡ |wsqnmmkihfea\XVTSQMKJKOQTWWWY\]\]]]_acceehijlnoonmmot~ ¢¤¥¥¤£~||} }}}{|||{{z{vkefhknqtvxz{~ }xtkinrrqsvyzy{ ~~ ¢¡ wiT:6H\qsuwxxxyxyzzzyz{||{{~~~~~~}|{{|}zxxvuvwwuvwvttttttttstuwyxwxywwwwvwxy{{{zz|}|{||{ ~~{zxq]HBCFFFGFFFFJMOPPPPPTWVX_hnprrtttuvxwy{}} ¥¥£¡ ~}|xtqomkjigfda\WSQMLJFEDGMPQTVWWXYY[[Z]_abaadfghjkigegms~ ¢¥§¥¢~| ~~{{||zz{zzwlfgimqsuwy|} {uy ylR,+2;atrsuwxwwwyzyyzzz{{{|~}}~~~|}}}}}~~~}{xvuwxwuvwvuuuuutvvvutrsuwxvtuxwvvttvx{||{yxyzyzzz{~ ~|viF<<?AEHHGHJKLNOQRPRUWVZcjoopqsstuwwwy{|} ¥£¡ ~|zxtromligffeb^ZUPLHD?:;?CIKNQTTTRQRVWWZ\]^]^_``acea^]_jv ¡¤§¥¡~}{||z{|{zxmhhhlpswxz|yoq oJ&'"!0Nftvtuuuvvwwzyyyz{|}~~|}|{~~~~}}~~|~~}||{{|ywvwvyywwwutwwvuuwwvuspruvutqtxzxustvxz|zxutsuw|}z{||y|yrSA=<=CHHHLNNNNMOQRUVUW^fmnpqqrtttuvwy{}}~~ £¡ }}{zvpomkjgedb`^ZWSKEA;6469<BDHLMLJIKLMNPQTVWUUVVWY\[VTTWfx¡£¤¤~|{{{{{|||xmhhhjnswy}xmehsqa>)# $:Ogxvtuuuuxxxxyzz{|~~{{{{|~}|}~{|~{zzyzzyzzzzyzzxwvtuxxwwxxwutustuutsprvxwuttwxxywuttrsy|xwwwuy |vfHACDCGJJLNOONPQQQSVWZahloprrrsttuwxz{||~ ~~}|{ztnkjihfcb^YVTPHA<62/./16:<@CCAABBBABCEKNMLLKLOQPOOOSW[t¡¢¡ ~|{{{{{{|{yohhjoz~n`YVs|]B:/&!!! "(8Qepqstuvxyyzzzz{|}|z{{{{|{yz~}yz}{yzyxwvy{{zzyxxwuvxyzwvvwwvvvwwwxurortvvvttvwvuttssrt{~}yuuuspu o`KDEHIGJKKLNPPPQQQQUY]cknnqssstutwxy|}~~ ~}}zwuqlihgfda]YRLJH?840,+++-15788769;<=;;;>DDBDEDGJKKMOPTW[p ~|{{{zz{|zymhrue[Z_{xS752-)&" "$$$<jrprtuvyzyxzzzyzzywyyyyywwz}}}{yy{}|{|{zxvxzzxxwvvtuwxzywutwxxxuvyyxurqrtuvwuuvvuttsssttz{zyvuuusnqz ~[JFBCFIHLNMLMOQRPPRPTY_empqrtuuuvvxyz{~ }|zvrqokigec`\WNKF>=5/.-,,+,.012566668:;;::<??@BEEGIKOQQSUYbu ~|{{zzzz|zzu{d]_cnvN873/.-)'%%%%"=gvpprtuvwwxzywyyxuwxwxywvwy{{zz{||{z{{zyxxzzxwwwvvwyywvuuwxyzyvwxywusttvwvutsuvttusrsttwwvustutqqsx}}uYIEEGHGHMPOOPQSSPPQRU[blpqstwwxxwxy{}{~ ~||zupnmkhgd`]ZVRJC>861,,.--./.144566788:9:<=>??AEGHKMPSUVZ]`iw ~~}{zzzzzz{|pda\VV[]_cw ~tbH=8653310-)('&&=^fnmpstuvvxyyzywvwwxyyxwvvxyyz{{{zxyyyyyyz{zyyyxyyzzxuuuuuvwwxyxwwvttuuvutrsvwutttsssstttrqrtsprtvx{||{xkYQKKJJIIMPNORRQPPQSUX]cpsrsvxxxxxzz{}~ }zxuromkheda]YVPIC<74310112013247867889<=<=?@BCDFILNRUXY]bgkmr{ ¤¥£ ¢¡¡}||{||zzz{{z||od^][YYWRNfw}~gMJE@=<87876520,(*+2<Ofoprstuvyzzzyxyxxyzxxvuwwwxzzzywvvvwxxyxyz{zzyyxyywvuttvvuvxwvwxvutuvutssvwutttwvuutsrqqrttrsuvwyzzwtbTLJKKKKLOPOPSRQRPQSVZ`hqtuuyzyyyz|}|~ ~~}zwsmjifc`^ZWUQJE<641122236336779999:;<>?@ACDFHHKNPSZ^_ahkprsw~¡¦§¦§¦¤ ¡£¥¤££¢¡ {}{zzzzzzzyz }rica_[ZXSQ_cchnomfgYHGDBDD@?<9:9874/+**--?_oqpqstvwxxxyzzyyywvuuutuwyyxywutuuwxzyxyywxzxwyxwvwvuvvvxyxwwxxvtuwuttttvutuvywvutsqpqqsttstuxyzwuueWC@FILNNMOPQRSTSPOQV\cosuvwxyzzz|~~ ~~}|zwtpieeb_]WRQOJE@93001366676788:<<==>??@BCDDEILNPRTY_chnoqtvxz~ ¢¤¤¤¥¥¦§§¨©¦£ £¥¥¥¤¤¢¡z|{z{zzyy}pfda_`[XWVQPPQOPTNJIIJMPQNIA@>=;9753110/<Larsppqtuvvxzzyxwutssssvxyyyyxuvwvvxyzxwwuvyxyzzww{{yyyyxxyxwwxvtuwutttutttuwwuutsqqqrrsttsrswxxuvvoYDACGKNNMOQQQQRTQPSZajptvwvxz{|||~ ~~~~~}}{vrnjfb^[ZWQKFEC>9753355788889;;=>>?ABBCDEFGHILOQRTX_ehlqtvxy{}£¥¦§§¨©§¦¦¥££¡ ¢£¢££¡ ~||zzzzz{|wmgdc``ZVVTSRSRPPOQT_gif^RJFCB@>?>>><7767=Tcloqrsuuvxxxxvtrqpptyzzyxxxxwxyyyxyxwxwuwwwwwwx{|zyxyxuvwwvvutvvuuuvussvuututtsrqrttttttsrttuuxwoRDDGHKNNOPPQPQSURQXdjmptxxxy{{|}~ ~}~~~}~~}{zytoiea]XVRJFC@==97777888:;<=<<<=>?AACDDDFHIIKLOPRTW]chknrtuwz| ¡¢¥§§§¦¥¤£ ~}~zyxxx| ~|ypfea_]]ZVUTTV`iqrtslf[RMKFCCCDEC@>;97-9MdmmoqstvvxwvtponptzzzzwvwwvxyyyxxwvvxwuuttvwxyyyxuuuttvwuvvttwxwxwwvvyzyxxwxvutsttvuutttstuxzxnPIILLMPQPPOOPRSRRUakoqtvxxyy{{} ~|{zz{|}|||yttspjc_[WPJGA=<:987789:9:<=>>>?@@??@BDDDDEGIJMNNPSTW]adhkortuwz}} ¡¤¥¤££¡ ~||}yywxw~~~{zyz{~ yroieec_Z\\_ks}~~yqkfZUQOLKKKJGDB>;841<[bjqrssuvwusnhjpuxyyywuvwwwvuuwwuttwzuttttvvuuwwvtttuvwvwwvvxzyzz{zz|||{{zxutttuutuvuuwz{{lSNOQPNPRQQOOOPOQW\flqstvxyyz{} ~}zvtrtx{{zxunmkid_\TKB>>=988888:<====>>???ACBBCCDEEFFHIJMPQRSVY\acfimpsuwz|~ |} {y|~xxwwy}~~~|~~~ytnjeekmv|~{vrmid\UQPPOMKJGE@<989?LUasqstttsjadntxyyxxvvxxwwvvvuuttvywutuvwwutuvwvvvwxxxyyyz{zyyxy{{x}~~{z{zwuttttttvuuwyyzjXRONMNOQRRPNOOOVaflosttvyz{}}~ }{zupmjnrvwxtoidda[YSJ>::8:989;<<>>>>@@@@@ABCCBDEFFEGIJKKMOPSVVXZ^`dgkoqtvx{}}z} |y~xvvw|z{ ~|~ ~ztpibZXTRPOMMJHGC;20,.2Pglqrppi`altxzyxzyxxxwwwvvuuvvwyywvwxwvvvtuxzyxxyyyyyz||yxxwvwwuw{|{zyxyzyusttuutttuwxvsfVPKJJLOQPPPNOPRT[flortuwyz{|} ~|ypkhfiimqqmfa[ZWPMH@987689;=@@??@@BCBCCCDDEDDDFHHIJKMOOQQQTVWZZ]adimpstvx{~ ~|{z~wvxz}y|{z{vqje_ZTRSQOLKIG@710//4=Phod_\cotvyyyyyxyxwwxxxwvwvwxxxyyxvvwxxxyzzyyzzyzxwzywvuutsstuwwvvuwyzywtttuuuttvvwwhYRMIIILPPNMNNNOONKXknptwyy{{~~¡ ~~~}zvlfdbb`aghe_WSLJGE@<8879;=@ABCBBBBCDCDDEDDEEDDFGHIKNPRQSTTUVX[[]bejmpsuxz|~ ~|{zz |ywxz{{}y}~zsoib[XXURONMLID>83/+,+4GHHCKopruvvwwwxyyyxxyyxwwwvwyyzxwvxyyxxyyxyzzzyxvvwwuttrqpqsuutstvxxvuutttttttuuvteWQLIJMOPONQONKGEFFJampsxyy{}~¥¢ ~|vqja^^\WY[\XSLIDB><;::;=?@BDDCDDDCDDDCCCDCEFEDEGHHILOPRRRTVVWZ[[]bfjmpsuwyz~~~|{zxyzvwwy~~{|~z|~~zsohb]YWUTRPNLHD?5/1/*-20,$GdqrqrtstuvxyyyzzzxxvvxzxyyxxxxyyxxyyyzzzyxwwxwutsrsqqrtttuvvvutuuuuuutuuttumaTNJKNQRQRTX^]WPMMRR]kruxzzz| ¥¤¤¢ ~}}{yske[UTQMKJKHDDA>==;;=@CDEFGGGEGGFDDEDDDDDDEFFEEGJJLMPPQQSUVUVYZZ]afjmortwyz| }{zxwy}~zvtuvx|{z{ }z}~|ytnhb^[VUSRQONMH?=841.,+*'=[gmqppqsuuvxwxyyyyvwxyyzzyyyxyyyyyzzzyzzzxzxvutrsusrsttuwxvtstuvuuuuvwurpnUSNLJLPSTW[aeknllmprkgmrtvzzz}¥¥¥££¡ ~~}|{yuqe_VMHFDBCB@?<:<>??AIKKKLKJJIHIIHGFEFFEDFHGGHHHJKMOQRRRUVVVVWXZ[^afkmoruvxz| ~~}{zvw{yuttuw{{xy} |{}|ytqka][XVUTRRQNIIF@82/,**'/@IXjoqprqsvwvvvxyxwxyyzzyxxxyzyyxx{}z{{{zzywwusrttttttttutsstuuvuuuvutog[KJJMLOTVZbkmpqrqrsskgmprtuyz{} §§§¦¥¥£¡¡ ~}~~}~}||zxvom^QKD@?<<<<<;;=@CEGJOOOOPOLKKJIIJJHGIHGGIJKKJJKLMOPSTUVWVVVVWY\\_cgknqtvxy{} ~~{}}{{zxux}wttstvyyvuw| }{|~zxujd`\YVURQPONNMLFA;2.-,++#-9FR_konpsrrtuvwuvyxxyxwwxyzyxyyz{zzzyyzyxywtsttttsspopqrsssttstttsqm[KHGGILRW_fkqsstttttpjhmprtux{|}««©©¨¦¥£¢¡ ~~~|yxxz{yxxvtpf^WKA?=:889;=>@FIJLPRSSRQQQQONLKKLJIIJIIJJJLLKLMOOQSSTUVXWWWXYZ\^aeimpstvyz| ~{}~ ~{zzyvu{yvtttttvvutsv|}} {{ |yvokc]YWTRPRRQPONKDB?:4-**)($"+>T]diknprrsrtuvwxwwwwvwxwwwyzyxwwwxwwwwtttttrqpnmmnoqqqqpkjnqomjcSC>?CIS]flqstwxwwvtniknnprtwxz~ ««ª«ª¨§¥¥£¡ ~~~~}|zxxsokihhhghhgdYFDA=;;<:;=?ACGPSTVVUVWVTUTSRPONNMLMLKJMLKJMOOOPQQSUUUVVXYYXXY[]`dhjmpsuwy{} |y{{}}|}{zzzxtv{}zutttttttuutqrvz{~ ~y} ~ztmha^[XVUSSRQPOMJHD@<7./.*'#)--8GU`jnkjnppoqtvvtttuuuvwyywwuvvutrstpooonjjjhedfillkhe``cfgjjh]I?=BIT`gosuvxxxxvqkhlnoprtuwy| ¬«ª««¨¨§§¦¤¢ ~~}zyvtqmmie^VRTUTTTVSJ?=<<;==?ADGJNQVYY[ZXXXVVVUTRPPPPOMMMMOPNMNQRRQQRTTVWWXYYZZZYZ\_dgjmnqtvxz| }zxyyz{{z }{zzzvsv{|wtsstuuuvuttrrswy{|||~ ~}{yv~}wuogb]YWTUSSRSQMLLJJF?<830//+-.,-7=ITV]hlkmllnnoprrsttvuutspnjigdabcbb`]]^^[Y[_`bcba_acdglmliQFHMU\fkpsuyzyywqjjmnoppqsuxy{¬¬««©¨ªª¨§¥¤¡ ~||zzytrojda]YVPICCGEBCEB><;:;=@CFIMPTWXZ[[\\[ZYVVVVVSRQQPPONOOOOOOORRTSRTUTVWXYZZYXYY[\`fjmnortwy{} ~|yvvyxy|~z{ |yyyxus{wsstuvvwwtsttsrtvyzyxz~}~|xtv|zuqib\YYWVVTRRQQQPNKJGB><;9542../-*++2<ISVX]_fgclqommnoplhc`_a`][\\[[\ZYY[ZXYZ]``cfghklqssslPLRW\bhlotvyzzzqihlpppqqrtvwxz}««¬¬««««©¨§¥¢¤¤ ~~~}{{zvtpnlkhe`ZUME@>99::<<<;;>=>ACGJNQVYZ\\\\\]\ZZZYXWVVVVUSRQPOPQPQRSRTTUTTUVUVWWXXYWWYZ[^bfjmopsvxz{~~~~}ywvvuvxy}zz ~zxxyxtt|vsstuvwwupnsutsstwyxxz|}}}}}~~||}|wru}}xqnga`[YXWTTUUTSQOONJECD@<;966553/00,211456:AEHNY]_eihb^]^````^^^_]_a`^`a^\]cddhnpqtuvyxxrg_YVZdinquwyzxqhhlorqoppqstuwy|~ ¬¬®««««ª¨¦¦¥¤¢ ~~}~~}{zyxvurnnjgdb`^VQHA=8766579;;;<@CDHKNRUX[]^]\\\]]]\\\\ZYXYYXVTTSRRSSRQTVVVUVUVUVVWWWXYYXY[\]aehkmpsvyzz| ~|ywspjihouvy{|{~ |zxxywstz}{utuuvwwwslknsutssuwyyzzz{|{|}~~~~}|{zz|{uqs| yxqkga^[YZWVVUUTSQQMLJJHECA><=;:865321111.,)*+$(8<KW\[\`bcbcddddebbbcedd_[\hiknrtvyyyz{}zwm^SWahnruwyytiglprrqqpopqruwy{~¬¬¬««ª©§¦¥¤¡¡ ~~~}~}}|}}|{{|}{{{ywuttqokigca^YXVMD=987776679<>?@CGKORTW[\\]`^\]]^^^\\\\[ZZ[[ZXWWWWVUUTTVVVUVVVUUWVWWWXXWXY\^`cgjmortvyz}~zuojfcaaitwy|{{~~ }|ywwtqx|{xvuwwxyxupihiotvwustxyyyy{{{{z|~}|}}}}|zzzzzz{zsrvzurlfc`^\ZXWWTTSSRSQPQLKIFBCA?=<::987661.,**)*-+,7X\_behhjjljiiiijmmlleVS`lqtvxy{~~{vcW[aekquwwsliinqrsrrqqqqrttwz} ®®¬¬¬ªª«¨¥¥£££¡~~~~~~|{|{|{zzyyzyywvvvrsrnjjfc`[ZSLJE>;8655579989<?CEHLOSVVZ\]^___]\]_`___^\\]]]]]]]\YXWVWWXYWVVWVVVUVVVWWWWXZ[\^bfhknpstvxz~}ytlgca_aeowzz|xy|~ ~}}{yvtqr{~yvtuvwxxwvmeegksuvuqqvwxxxzzzzyz|||||||zyyzzzzzvqrw~|wrrmhc`]ZZYXWWWVUUSPPNLKKFDEB?>>=;;:86410/-,*))I\aegjmooopoopponqstriU]ptvz|~~ xngebclqwxuojikoqpqrssrrrssuwz|}®®®¬¬«ª§§¥¤¤¤£¡~~~~}}}}}{{{{zzyyxwwvvusrroomjffb]YUOFA>;84567779:<<<>AEJMPSVWY]^_a`_``aaaa`aa`_]______^\ZYYYYXXXWWXXWVWVVVWWWXY[\]^aejlmprtvyz| }xrkeb`^`aguxz|~}zxy}~ ~{zzywurpt||vttuvvvuuqdbdfhnrttqqtwvwwxxxxxyz|||||{zzzzzz{xtst{~zwsojfc_^][YXWVVUTUTRRQLJJJFDCA@?=<;;87642-*,C`hjknoqsstsstuttwx{}tWauu{~ yurnlkpswxqllmnpppprrqrrrssuwz|} ¬¬¯«¬««©¨¦¥££¢¡~}}~|{}~~~~}~}}}}|{}|yxxxwvutsssqnnljggb^]YSJA=98755789:9;>?>>BGJMPTXZZ\`aabbbbbccccbbccbaa`aa`_^]]\[[[ZYYXXXWXWVWWXXXXYZ[\_bfilnpsttwzz} |wpgca`]]_bmux{}{{zxwz} }zxywvutqrv{zvtuuvvutqbX[_dgiourooruwwwuvwxwxyzz{{|{{zzz{|{wsty }ztrpifc`^[YXWVVVUTSQPPOONKGDEC@??><;;;:6/03Mikorrtuwwyxyyy{~_]vz wtssrrtusmllnoqrrqrrpqrrrsuvx|~} ¬¬««¬®«¬«««©¨§¥¤££¡ ~~|zyz|}|~~~~~~~}||{||{zzxxxwwvttqoqqmihfda_]YWQIB<8677689:;<<>@ABDFJMOSW[]^^abbbcdddefggefgfeedddcbbba_]]^\\\\\[[YYZXYYYYZZZZ\_aehkmortuw{}~ ytmfa`__^_aemvz|{||{z| {xwwvutsrw~|wuttutrrqZMPV\bgjottrortvvtuuuwwwwxyyz{{{{zz{{zvqt} |wtqnigea^\[YWUVUTTSROQPMKJJHECBA??@=;741:Uhstwyz{{{}~} {mz}vtsttttokmnopprrssssstttuvvx{||ªª«««¬¬¬««ª¨¨¦¥¥¤£¢}|zzzzzz|~~~}}|}}}||zzzzyxwvwwuutsqomlkfcb`^\YXUQJB>:76789;==<=?@ACEGKNQTVY\^abddeddefgffhhhhggfffffdcccca_``__]\\\\[YZ[ZZYXZZZ[_adgjmopsuxz~ ~yskeb`^^__^`erz{} }|zxwwvttsv~ vsssrrpfZEBHQY`eilrxytqruuuvvvvwwxxyyzzzzyyzzzzuqt}~{ysqpkhfc`_\[ZYXWUSTQPOQQOMKIIFGE@?=:65D^nvz{}x{{vtstvuqllnqrrqrstttttttwuuwz{}««ª««««¬««ª¨§¦¥¥¤£¢|zzzzyzz|~~}~~~~~~~|{{{{{zyxxxxvvvvtstsrqnlhgfc_[YVTONLGB<998889;=@@@ADEFGIJNRUXYZ\_bcdefffgghhhiihhhgghgggededcbabbba`^]]\\\ZZYZZZ\\\_behkoqtuvxz|~ ~xrjdb_]^^^\_bk{}~ ~{yyyyxxwuuu|sponlkdOGCBDLS\chkpx{xrptvxyyzyyzyxxyyxxyyzzzzyssw~}{ywsomkhfec^Y\[ZWTTVUSRPOMONJFEE?=:AXgqz} v{~yvuvwxwnloosttttuvwvvvvvywwyzz|¬¬ªª«««¬¬««©©§¥¤£¢¢ ~|zzyyzy{|}}~~~~~}|~~|~~}||||}}}||}||zzzzyzyxvvvvttstsrqonkihda^\XROJD>@DA<88889:<=>BCEGGHKKLNRVZZ[^acdefgfghhhhiijjihhhhhhhhgffeddcccbaa^]^]\\ZZZZZ[\]]aehknprvwxz{~ ~wpica^^^_^]^^`nu{ ~{z|}{zzyywu}pljgf^OEA?BCHOX`fjovzzuptxzzzz{{zyyxxxvvxz{zzzwsv ¡ zyzvusomkggie__\ZYYWVTRSRPMMKGDEDPeir}|} |zyzzytnnqstuuvvwzzzzyyyyyz{|}~ ¬¬««««««ªªª¨§¦¥¤£¡¡ ~~}{zzyyzz{{|}}}~}|}}~}{|||{{|{{zzz{}}||zzz{zzyyywvvvvutttssqprpnlieb`]XTNGEEB?=<<;9::;;>??ACEHIKKLOOQTVY]_`cghhhhhiijjjjkkkkjjijjjjjjihhgggggecbba``___^]\[\\^_bcgklpsvxxy}}yrjda`^_`_]\[[]cox }||~~~~~|{zw|uhfb_XMDB?ADFHMT]dinsyyvsvz|{zzzz{{zxyywxyz|{{zvtz ~|{zxwtrppomgedef][XVXVTTRNOMN[mv| xpruvwxyxyxy||}|{{|}|{} ¬««ª««ª©§¨¨¦¥¤££¢ ~~~|zzzzzzzzzzzzyyz{{{{zz{yyyxxvxxxxzzzzzzyyxxwvutttqrspprrqonmiheb]ZWSNIC>====<;;;;==?ADEDGHIKLLMOPRUWZ]^`bfhiihhikkikkkkkkklkjkkkjjjjihhghhhgfedbbbba```]\^`abfhjoqtuwz{| |tlfb`^_`_]\[[\]]q} ~}{|}~|~}|zxl`XRNJHEBBCDGINS\chlquwutw}}|{zyzzzzxxywyz{}}|ytu} ~}|zwwwvuqnnmlgdca```^YXUSNZr| zuwy{}~}}~|{~~®«ªªª«ª¨¨¨¨¦¤¤£¢¡¡ ~|{{z{zzyyyyywwwwwwwxwwxxxwuttuttuuuuvvwvvuuutqpqrnmmjkllkjgd`b^WROJHD?<;::;<==>>?BBDEGHJLMLKOPPPRTWZ^abdghiijjjjkkllllllmmllklmmlklkjihhhhhggffdcdcb_^__adddgjmprsuxy{|~ }wpgba`__]\\[[[\]gr~ ||||z{}|z|}~}zydMGJLNMHEEFGHJOQX_ejotvutx}~}}{zzzzzyzzyzz|}}{xsu~ }|{zzyusrsnlkiga`^YZ^l~ yz||}~ «««ªª©¨¨¨§¦¤£¢ ~}||zzyyxxwwuuuttttuutstvusqonlmooppqsssrrrrrpmmlkihgeffcaa]XUWQHDA@?>;9:;;<=?@ACCEHIIIKNNOOMNQRSVZ[^acfghijkkkkkjlmmmmnmllllllmmmlklkjjjjihggggfeedcdcaacghjmosstvxz}yrjeca_^]\\\[\[\^i|}~~ |zzzzz{}~~|z~~dEFQZYUQJIIJJMPQW]cjpuvtty}|zzzzzz{zyzzz{|{uqu¡ |yywusqpmic^am~wux ©ª«ª©§¨¨¦¥¥¤¡ ~}|zyxyyyxvutrrsrqopopqrpnmkhghiikklmmllkoplgffd``__^^_[WVROJDCA>==>=<<>???AEEGJIJKLLMOPPQQQQTUVX]_abehjjkklllkklkknnmnnmlmmmmllmkjllkjklkhghhhggfffffeegikmpsuwxz{}~vqkecb`^^^^]]\[]du~} ~}|{zz{|}~~||p_\\_^[WPNLMORTUW]elrvwvuy}}{||{{{zzzzzz|zyrru ~~}zwusmffjz ©¨©©§§¨¦¤££¢ |zyxyyxxvttsqqmliihkkghhfdb`^X]^__bcbbejgc`_]WTTRQQQQQNKGEC@?>=<<=?>?ABDFFFIJKLLLNOOPQPPRTTVWYZ]^adfijjjjkllllmllmnnnnnnnnnnmmnmmmlkjkkkjiiiiiihgghhjjknoqsuwz} ~xtmjfcaaaabcccdel~ ~~}}|}~}|~wlddca_[VTSSVYZZ[`glrxzvuz~}||{|{zzzyyz{|zvruy ~voc]jusw §¦¦§¦¥¥¥£¡ ~{z{zyxwvutspnlhgeegd`aa^\YSMNNOSTVWZ[b`XSRPNLMLHFFEEDECA@A@@?>?BCCBEGGHJKJMNMNOOOQQPQRTTUVVY\]_abdgikkkkkllmmnmmnnnnnnnnmnnnmnmmmkklkkkklkkjjjjijlkmnqrsvxy{} |wsmjhgfhmopqokex~}|{xqgffddb^]^]^abaaeilszzuu~~}|{zzzzzzywx{}zuuy ¡ ¡¡yrmf_`gv~~x~~ ¥¥¥¥£¢£¤£ ~{{yywwwtrpmjhdaba[ZXWVTLEACDGHGKOSZ]OJJJHFGFFDCBBCBCBCCCCEFFFFFGIKKKLMOPQRQPQRRUSQRTVVVXY[_aabdehkllllllllnnnmnnnnoonnmnnnnnmmmlkkljjlmmllkjjknpoqsuwyz{| |vssrsuvy|~~{tx|z{~~~{}~{xkeedefefeeffeffhkov|{uv~|{zyxxxxwxwy||xsv{ ¡¡ }slilkc[Ydo}vrsuwy}¤¤£¢¡¡¢£¢ |zyyvvvuroljgb^`SPOLKKI?8:<>?@BFKSZTIHGEDDDCDCCCDDDEEEGGGIJJKKMLMNOOPOPSSSSSTTTUVUUVVXZ[]`bbcfggilllnnmmmlmmmnnnnnoonnnonnonnnnnmllkkmmmnnnnnoqstvxy|~ }~|}~{z{~~~~~~~ojhilmooljkjjkkknqx~|uv~{zyxwvwwwyxz|zusw} ¡ ¡¡ ¡ }vxwxxxx|}zxz}}¡¡¡ ~{ywwvtspnlhd`aODEDBA@@;87:<=?BDMZWMHHGFFFEEEDEEFGGGGGIJKLLMNOOPMPQQRQQRSTUUUTUUVWWWWZ[\^abcfhhihlnmmnnmmmmmnnnnnnnnnnnooonmmnnnnnlmlmmnnoprtttxz{}~ }}~~~rnopssrsrppoqqrqqsy}zsu~}}{zyxwvwxxzz{|xqrw| ¡¢¡ ¡ {ywwtsroljgad[=::;<:;;889;>AEHKY_RJHHHHHIIIHHJKLKKKJJLLMOPPQRRRQRQRTTTSRRUUVVVVWYXXY[\^bbcehikllnonllmmmmnnnmnnnnnnnnnnnnnmmnnnoononoprqrttvxy||~}~}yuuvuuuvtsstuuttstyzurw~}|||zywxwwxzzz{|wqsvzy{} ¡ ¢¢¢££¢£¢¢¡ ¡¡¢¡ {ywvtqonljhf`=986898::8;>@BDHJT_YPMJJIIKLKKJMNOPPNOMNQQQRQQQRTUUTRSTSRSTTVVUVVWYZ[[[\]`ddeghjlmnmlmkkmnnmmnnnnnnnmmnnnnnnnnnnnopppppqsutvvxz| }~~}~~~}y~ }yyxwwwuuuuvvvvuuuxwrqw{}~}|zzyyyxwxxyzyustvxutuvwyz{}~ ¡¡ ¡¡£¤£¤£¤¥¤¤¤¢¢¤¤£¢¢¡ ~{xutrpmkkihgJ7:546779:<@CEHJKP_^TPNMMMMOONMNPPOOOQPPQRSTTSRSTTTUVVUUUUUVVVWVWYZZY[]]_acgghijmnnnmkmlmnnnmoooonmnnonnonnnnnoonnopppqsstuwyz{~}|~}~}}|{{{{||}|zx~}{yyxxxwwwwwwxxwwwwtsu{~}}}{zzzzyyyxyzysstwwspqrttsuxwx{~ ¡¡¡¡ ¡ ¡¡¡ ¡ ¡¡ ¢¢¤£¢£¢£¤¤£¤¢£¤¤¤£¢¡ ~zvqonmljggiYA:7798:;<=@EIJKNQY`XSPPPPPOPRRRRRQPOOQRSRSSSTTUVUTTUVXWVWWWWXYZZZ\[[[\_`bceillllnmmnnmnmnnnnnooonmnonmnnonoooopoppqrqqrttvy{|~~}wv|}}}|{{zz{{}||}|z}~|zzyxxxwwwwxyxxxvxwtu{~}||zzzzzzzyyzxustuvuqnopqqpqtuuwz} ¡¡¡ ¡ ¡¡ ¢¡¢¢¢¢¢¡¢¢£££¢¢¢¢££ ¡}{yskhgghihheC<999<<>BDFHIJKMORWYRRQPPPQRSUVVTTTRQSUUTRTSSUVWWVVUVWXYWXXYZ[\[[\\]^`bcdefhjmnmmmnnnooonnnnnnnnponnomlnnnnnnopppqqrtstuvwz}~zwwz}~}||{zzzz{{|{{}}{|~}|zzywwwwwwwzzyyyuwxuu{}|||zzzzzzzzzxtttuvuqnnopqopqqsvxz~ ¡ ¡¡¡¢¡ £¢¢¢¢¢¡¡¢¢¢¢££¡ ¡¡¡ {zzwpfb`abehjL<;;<=>?ADGKMMKNQQPRTUTTRQPRUUVVUUVVUSUVVWWVUVWXXWWXXXXYYWY[\\]\]^]^_abdfghhklnnmnoonopponnnnnoooonnnonnnnnnnooqqqrrruuwyz|~{~}zz|}|||{|zzyyzyz{|}}}|{zxwwwwwxxyyyyxvtsrty{|||{zzzzzzzxsrtuusonnnoopoprsvy| ¡¡¡¡ ¢¢¡ ¡¢¢¡¡¡¡¡ ¡ {yzxtkd_]]]`jW?@=>?@BGJJMNNPPRSRQSUVVUVVTUWWWXVWWWVWXXYXYYWYZYXWWYZYYZ[Y\\]]]^^aaabcdghijjmmnnnnooooonnnnnooooonnnnnnnoooppoprrrtttwxy{} }z{{|{z{{zxxyzyz|}}~}|}|zxwwwwwxyxxxwuuronrwz{|}}zzzzzyvtqqrtsomllmnoprsvy| ¡ ¡ ¡ ¡¡ ~zxwuqgbZVWZ`aG?B@BDGHKOPPQSRSUUTUWXXXWWXYYYYXXXWWXXY[ZXX\[Y[[[ZXX[[[[[\[]^`__aaccdeggijlllnnoonooonnnnnnnnnnooppnonnnnoooqqqssstuwxz{}~ ~yyzzyzyywuwyzz{|}zz|{|zzyxwvuuvvvvwwutqoqqvyz{|{zzzzyvrpoqrrpnmmlnpqrtw{ ¡ ¡ {vtspmcYSQR[bNABEFFJNPRSSTTTVVVWWWYZ[[[ZZ[ZY\ZZZYZ]]\\\[[\\[[Z[\[[\]]\[\\^^bbbbcdfgikklmmmnnoqpooonnnnonnoonoopqqoppoonnpqssstuvuvz|}~|zz{zyyxwutwxyz|~zx{|zzz{zywussstsstuuuuqopqsuwxxxyyxxvqmoprqonmnnnnqvz} ¢¡ ¡ ¡ }yrlmjd]TOOUc[JEGJLKNRTUUVWXWVXY[\\\^^\]\]^`_^^]^\]]_]_`^^_^^]\]^]]^__^^^_abeccdehjjlnonmmnnooqpnooooooooppppqrqrrqppppnoqrtuvxxyw{~ ~~|{{|zzxwutvxwzz{xx~~yyzzzzywurqqpooqtuwwplnqpmoppqqsspmjjlnqponnoqsty~ ¡ ¡ }|ywsmgfd[TNMQ_bSLKLNPSVWYZ[\^_^\``aaaaba```ceeedffddcbbabbbbbb```abaa``abbbceghgghikllmnonnnooopprqqpoooopqrrrqrrstssrqqrstsuwvx{|~~~~zz{zxvttuuuvwxwz~yxzyyyxvtrppoonpruxwocchjhggfb`bddecbciossrrsvx~ ¡ ~{{slifb^YTNKKWaYQPQQOSX^_`cdeeefdeffffhhfegijkllkkllljjljihgfffddccffedcdefgggikkkklmmmnooopqrqpqqrrrrrrqqqrsssssrstttssstvwvyz||}|xxwuttttttttst}zxyxxxwvtsrrrqopsuwurha`aa\\[YZ[^_cdcfmqvy|} ¡¡ ~yvsja[[YUOLKKVa^VTUXY[^bghjlmlmllkllkklmnnoqqrqqsrqprsrppqnonmlkkkiijjkhghjihijmmmmnpqpqqpqrrssrrrrrrrrssssstttsttssutuvuuvyyy|} ytsstttttqqqrv~yxxxxxxxwvvwwvuwzz|||}{|}{zywtssyzwvx|} ¡¡ xsrf\YRPPOKNQUbd]YX[`dfinporutrtssrrrqrttuuvvvyxwxxyyyyxwutttsrqroonnmmnlklmmnooopoqqrttssprsttttsssssrrstuuuuuuuvvvwyyyzyz{~~} wqqqpoponmqw}zyxyzyyzzz{z||}~ ¡¡ ~||xqli_SONLMLOQVcia]^_cimquxwvx{zxxxyzzyxyy{{{|||~~~~~z|{yxwvtuutsrrsrrqqstttssuttuututtvvvvuuuvvwwvwxxxxwwyzzzz{|~~ |utsrpnpsuy|yyyyyyzzz{|~ ¡ ¡ {wuulec]UMJKNRRTW]jia`eiksy{||}}}~}|~}|||}~}~ ~}{{{zyyxwvuuuuttuuwwuvvwwwwwyxxxxxwwxyxxyzzzz{{{{{|~}}~~ ~|~}~{yyzyyyzz{{|} ¡ ¡ {yurpkb\[TONLMQVWY`jngcdjrx~~}|{{{zzyywvwxyzxwxxyyyzzzz{zz{{{||{{{}~|}~~}zyyzzyzzzz{|} ~|xsqmkgd[VURRTUTV]_`jrmjkot{ ~}|{zyxyzzzzyyzz{{zy{|||~}}}~|{||}~||{zzyyzzzzzzz{}} ¡ ¡ ~{}|yuqliea^ZVVXY[]_]^bhmtupru{ ~|{||||}~}}~~~~~}~~ }zzzz{zyyyyzzzyyyzzz||~ ¡ {xvvwuomidb`ZYYWX\^`cdejox~|{|{~ }zzzzzzzyyyzyxwwwxxyzy| {vqorpifca^\ZXZ[`aceghkt{ }zxyzzz{zyyyxyxxxyxxwwx{ {vokiihba_[[\\[]adfghjlpw}~zxwxyyzyyzzyxxyyyzyyxxz}~}|wrogb`a`\[\[\_abfhlkmorw{|ywvwxxyyyyyyyyzz{zzyyz{ }{yxxuspifa][[\Z\`cehjjmprsuvz{yvuvwxzyyyyyzzzzzzzyyyz~zyvttspleb^\[[\^`dgimopqruwz~|yuuvxyzzyyyyyyzzzzzyyz}}|{z{xspmkljgd_]\^__`dikkmortvy{{ywvwyzzzzyyyyzzzzz{{{{ |{xusqspjfdccaa`^_affgilooqstwx} ~{zzzzzzzzzz{{z{|vtqnlkkhc`_^^^_`adgjloppstwz~ ~}|||{{|}} lkhecbb_]\[\_ceefjnpssuwz}| eda][\]^]^_cehjlmortwy} _]][\]accfgimnooqvyy~\[]_bdfhiknoprtvxz\^aefhlmopstvxy}qgaYTUXZZbo|bfjllnrruwy{~ePB:20232235757>?IZklnprruwy|~ jP:52154334223442366546;J_|vwwyz|} [B64.//.))))))+,-,,/01485626>Ic{|hH4230,)'$! #$! $%$')*.013459:8@Vv xmd[VUWVRSM313/-+)'$$!!+45652-$ #)*,.1689:8<Npjnjljjkkjkjjjjjjjjjikjkikikjkikjljljkjkjkkkljljkjjkjkjjjjjjjjjjkjkkklkkkjkjkikikiljkkkkmkmikijjkjljjkjlklkljkikikjjjjijijikijjkikhkhkikikjijikikjjkjkjjjjkikjjkjjijijiiiihiiiiiiiiijikikjkjjjijiiihkhkijiiiiihjgjgjgjgihiiiihhhhigigigigigigihihjgjgighghghghghghghghghgigifiehfgggggggghfififhfigighghgghghghhgigihigjfifighghggfgfgfgfhfjfjfifighggghgighghghghghgigigifhfhfhghgigigigighhhhhhhhggggghghghghggghhihihhhghggggggghghghgghghhihihihhhhhihihihihihihihihihigjhjjjjjiiiihkgkhkhkhkhjijijijikhkgkhjijijiiiiiiiiijjkjjiiijjijjjjjkjkjkijijjjljljkjijikjkkjkjkkjlimhmikijijililjkjjkjlkkkjlimjmjljkjkjkjlimimilililkljkijgjgkhjhjhjhjhkhkhkhlglgkhjjkhmiljjjjijiiijikjjjjjjjjjjkjkililjljkjkjkkjljljkjkjjjjjjjjjjjjjjkjljlkkkjkjkikikikijjkjlkmimimkkkkkjkjjjkjkikikjkjjjjjjjjkjjjijijikikikjjiiiiiijjkjkjjjjhkhjijkjjkjkjjijiiiiiiiiijijijhjiiihihigigiiijijiiihigjgjgigigihjhjhjhigigigigigigigigigjgigighghghghghghghfhgigigififhggggggggghfififhfhfhfhfhfggghgghgjgigigifhfhfhggggggggggfhfifififhfgfggggggggggghgggghghghhghghghhhhghghghghghhhhhhghghghghghgggghhhhhghfhghgggghgggggghhhihigigjfjgihhhhhhhighghhihihhhghhgigjhjiiihiiijikhkhkhjgihiiiiiikhjhjjijjjjijijiijijijjjiiiijjjjkjkjkjkijhjhjijljljjjijjjljlkjkkljlimhnhmilikikjkjkjkjkjjjjjjjkjkkkkkkljlilhmhnhmhmimjmkkijhjhkhkhkgkgjhjikijiihjgkgkikhmimililhjhiiiijijjjjijjjjjjkikikkkkjkkkklkmjmjljkjkjkjjililjljlmkmklkkkkjjkikikhkikjkjkjljmjlkkkkkkjjjjjjjijikjkjjjikjkjkjjjijiihjjjjjiihihihiijjjjjjkjijiijijjilikijijiiiiiiihjijhihigigigigihihihihihihigigigigigihihihjhjgkgjgjgigighgigigigigighghgififhfhfhfhfhfhghgifighghghggggfifififhfgfgfgfgfgggghghgigifififhfhfhfhfghgggggfhfhfhfhfifhfggggggggghghggghhhhhhigighhghggggfgfggggghhhhhhhhhhhhihhigighhihhghghghghhhhghghgigihihigjgjgigihihhhhhhhghgihihhhhgiihigjgjhiihjhiiikijijijhjiijhjhjiiihihiijijijhjhjijjjkjiijikjkjhjhkhkhkhjhjijijkjkjjjijjkkkkkkkkkjlimimimhlijjjkjkkjljliljjjijjjkjlimhnimimhmhmgmgmhlililhlglglgmgmglhkikjkljlijjhlgmgmhlhlhkhkikijijjjikjjjijjjjjjjjijjjjkjljlkmkmkmkkkjkjjjjkjljljlklklkllklkkjjjjkikikijjjkkkkkjkikjkjjjikikhkijjjkjjkikhkikjjjijhjhjhhjijjiiiiiiiiijjjjjikijjjijjjkilikjikhjijhjhjhkhjgjgjgjhihjhjiijiiihihhhihigjgjgigighhhhigjgjgighghghghghghgifigighghgififhfhfhfhfgfgggghghghghghfhfgfhfifhfgfgfgfgfgfgggghghghghfhfiehehehfhfgfgfgfgfgfheheifjfifhfgfggggghghgggghghghghhhghfhfgfgfgfgfgggggghhhhhghhjgjgjfighhhhhhghghghghghhhhhghghhhhhhhhihihhhhhhhhhhhhhghhhhgigihihihihihiihjhiihihiiiihihihihjhiihigihihiiiiiiihjijjjkkjjjjjjjjhjhjhjhkhjijjjkjkjkjjkikikikjkjkjkikhlhmhlhlikkkkkjljmimimjkjkjkjmjmilhlhmhmhmhmhmglglhlglglgmfnfngmhmhljkjlkkljkjjjikgjgmgkhjilililhlhlikijijhjikikililjjjkjliljlkkkkkjkikjjkjmjlikjkikikikjkkkjkikijjikjkijijkkkkjkikijjjjjjikikijijjjjkikijijjijiiiiiiihihiiiiiiiiijijjjijiijjjkjkjjjjjjjkjkikikhkhjhihjhjhjhjijijjijijhjhhighhihjgjgjgighghghhhhigighhghhhghhghghghfjgigigighfhfhghfifhfhfhghhghgggghghghfhfhfhfgfgfgggggfhfhfhghghggggfgfhehegegfgfgfgfgfgfgfgfhfhfifhfhfhfhgghghgggggfhfieiejfifhfgggggggggggggggghghghghgigjgighgggghghhhhhgjfjfjgihihhhhhhhhihihihihhhghhhhhhhhhhhghgigihhhhhhihiihihihigigihhhhhhhhhhhihihihihiiiiiihihijjjkjkjjjikhkhkijijikikhkikjjjjkkjkikikhjhjikilhlhlgmgnhmimimjljmjmjmimjljljljmjnjmikijhkilimhlhkhkhlhlhkgkglgmgmgmhljljjjjikikjjjjijgigkhjijjkhkhkhlgkhjhkhkhlhlhlililjjjkjlilkkljlijhjijkilimilhjijikjkjkjkjkjkijijjijjjjjjjkjjjjjikikikikjkjjjjjjjijjjjjjjjiiiiiijhkiiiiiiiiijiiihjhiiiiijjjjjjijijjijhihiiijijhjhjhiiiiihjgjhjhijhjgihiigigjgjgjgjgigigigifhghghgighhhhhhhhhghghhhhigighghghfhghfhfifieifhghghggfgfgfgfgggghfgfgfgfgggfhfifhfhfhfhfhfgfgfgfgfgfgfgggggggggggfgfgghghggggggggggggggggggghfififjfifhggggggggggggggggghghghghghhhhhhghfggghiijgogrgqglhjhjhjhihhhhigigihhhghghghghghghghghgigighhhihjhiiiiiihigigihihihhghgihihihihihiiiiiiiiiijijijhjijgjglglglhkhkhkhjhjikikikikikikhjhjikikilikjkjljljljljlimimimilimjljminimimjljliljljlijhjhkilimhlglglglglglhkikijijjjjkjkikhkhlgkhjhjikijhjhjgjgkhlimhmhmhlikjjjjijikjlkkkjjijjjjjjilililikijjkjljkjjjkijijiiiiijijjjjjjjikikjjkjkikikikijjjikjjjjjjjjiijijhjhjiikjkjijiiiiihihiiiijjkjkijijijihigjgjgjiiihihjhiiihigigihihhigighhhihjgjgjgigighgigjfkeififhghgigigigighghghhhihhhghghghfhfhfhfhfhfhfhghgigifhfhehehfhghghggggggggggfhfhfhfhehehfhfgfgghfhfhgggggggggfgfggggggggfgfgfgfggggggghghghgghghfhfhfhgggggggggggggggggghhhhhhhhghgggggghhhinjukyj{i{hwishoglhjghhghghgggggggggghghghghghghgigjhigjhjhiiiiiihhhhigjgjgjgigigigihjhjhjhjhjhjhjhjijijhjhjiiijilhmgmhkijhkhjijikikikikikikhlgmimjkjkjkkjkjkjjkikilhmimilhlhmjlkljminjnjninimjljkjkilhmhninhmgngngnfngmiljkjkikjklkkmjmimhmglgkgkhlhlhkhjhjhkikikhlhkhkijjjjjijikjkikjjjjjjjjjkikikiljkjjjkjkjjjjjjjjjjjijiijijjkjjijhkhkijjkjjijijjijijijijijijijjijijiiiiiikikiijiiihihihihiiiijijiihihhhhigjgjgihihhihihhhhghghgigihhhghhhihiiiijgighghghgigifjehfhggggghghghghghgigigihhghghghgifhfgfgggggggggghghghghfhfhfhfhfhggggggggggfgfgfhehehehdhfhfgfgghehfififhggggffgfggggggggfgegegfgggggghfgggggggggggfhfhggggggggggggggggggghghghgigigighghghnkvn{n|n}n}n}l|hvfngihhhhigiggggggggghghghghghhhhgigjgigjfkgjhihhhhhhhigigigjgjgjgjgjhjhjhjhjgjgjgkgkhjhjijijiiijikhkhlikjjijijijjkjkjjjjjjjjhlglglhkikjkjkkkjkikikilimknkmjmhmjlkkjlimjnjninimkklklljmhmhmjmkljmhngnfngmiljkkkjlkmlmknjmhmglhlglgkhkglhkijijjkikikhlhlhlikjkjkikilililikikilikjjjjikilikjjjiiijijjjkjkjjjjjkililjkjjijikikikikikijhjjjjijijijiiiijijikijiijiihiiiihiiiiihihiihihhihhjhighghghhhhhhhgihihigigigighgggihihihihjhjhjhjhihhghghgigighghfhggggghghghghghgififigighghghghgifhfgggggggggggggggggggggghfifhfgfgfgfgghghfgfgfhehehehegegfgfgfhfhfhfhfhghfgfffgggggggggfgfgfgfgggghghfhggfgfgggggggggggggggggggggggggghghghghghghghggigmivlzm{l}m}o}p}o~i|fqfjgihihhhgggggghghigjgjgihihhhgigigigjgjgihhgigjgjhihigigigihihihihihhhihjhkgkgkhjhjhihiijhjhjhkgkgkglhkijhjijjjkkkjkikijiijhjhjijilimjljjijijijjkjllmlmlljljljmjmimimimjmkmkllllllljkikiljljlhmgmglglhlhkijkkkmkmimhmgmhkilhkgkgkgkgkhkikikikilililhliljljkjkjkikikikhlhliljkkkjlilikjjjiijjjjkjlilikikhkhlikijijjjjjijjjjjjjijijiiiijhjhiiiihjhjijjjjijhiihjhjhjhjhjijijijhjhjhiihigigigihihigigigigigigigighgggigigigjgjgjgigihihhghghgififgggggggghgighfhfhfhfhghghghghgighghghggggggggggghfhfhfhfhfhgigigighhfighgghghfhfgfgehfhfgfhfgegegegfgfhfhghghghfhfgfggggggggggghghhghghgggfgffgfgfgfggggggggffgfgfgfhggggggghghghghghggggkgphvj|l}l~lm~n}o}pm~hxfkghhihhgghghghhhhhhigigihhhhhgigigigjgihhgigigjgkgjgjgjgjgjgjgjgjgjiiihhigjgkgjgihihhihjiijijhjhjhjgkglililikjkjljkjjjiiihjgjhkikjljmjmjlhlhkijikikkkkkkjjjjkjljlinimjmlmkmkmkllkmjljjkhlhkhkikhkhlhlhmgmhlimjmimhmgnhmilhjhjgkgkgkgkhkhkhjhjijikiljlkljkjkjjjijikjkjjjikjliminimilijijikilililimhmhmhlglhlhlhkhkikikijijikikjijiiiiiiiiiiiiihjhjiijijhjhjjijijikhkhkhkhkhjhjijiiiijhjhiihjhihihhigjgjgigigighghgigifjfjgighghgigjgighghghfhfhfgfgfgfhfifhfhfhfhfgghghghghghghfgggggggggggghfifjfjfifhgigighggkeqfthpihifhdhdhegehfgfgfgfgfgegegegfgggggghghghfffgggggggggggggghgiggggggggegehehegfgggggggggfgfgfhfggggghhgggggggfhgnhtjvlzm|m~m~n~n}n}nqpi{gnghghghghgghgighhghhghghghhhhggghghgigihhgjgjgkgkgigjgjhjgjgigigihiiiihhhhigjgjgjhiihjhjijiijijijhjhjhkhmimhmimjlikikijhjglhlilikikililhlhlhkijikjkjljkjkjjjjjkhkhmhmjllkmlklklmlmkmkkkjlkkjjjjjkjlikhlgmhnhnimimhogognhnhhgkglflgkhjhjhkgkhjhjhjikjljkjjjjjikhkhkijikjjjikilhnhmilijijikikikililililhkhkhlhkhkhkhjhjhkhkikijjijhjijiijijiiihihjhjhjhjijiijijhjhjgjgjgjhjhjiiiijijijhjhhihjhihihiigjgjgjgigigighgihigjgjhjgigigjgjgighgifhfhfgfgfgeheieiehfhfififhfhgigigigifhfhggggggggghghgifififhfgfhfhhgogwhzj{kykojfieiehfhfhfhfgggggggggggffgfgfggggghggffffggggggfgfgfgfhghfgggghggfhfhfhfhfgfggggggggfgfgfhfhggggggggggfghojxlym{m}n|o{n|l|m}n~noohygmhigigighghhgighghhhhhhhhhhhhgggggggihiiihjgkgkgihhhhiiiihihigigihiiiihhhiihihihjhiihiihjjijjjjijhjiihjhkilhmhmjkijikjkjlilimjljjijijikhkhkijjjjjikilikikikjljlilhlhkijkjmkmknjmklkkkjljlikijijikilikgkgmfnfnhninhogogngnjihkglgkgkhkhkhkhkhkhkhkhjikikijjjjijijhiiiijjjjjjijikikjjjjjkjkikikikikikikhkhkikijijijijhjhkhlilikijiiijijijijiiihjhjgjgjhjiiiijhjhjhjgihjhjijijijiiiijijijiiihhhhhhhgigjgjgkgjgigihihiihihihhjgkgkgjgihighfhfhfhggggfgfhfiejdiejeiehehfhgigigififhggggggggggfhggfgfhfhfgfhfhfhijtkzl|k}l|kwimhghghhhghghggfgfggggggggggggggggggfgfgfffgggghgjfjfggfhfggghgfggfififjgkgnglfjfhfjfjelenfrfrfnfigggffhgllunzo{m}m~n}o|n|m|n|n}nqo~iugjgigigigighhgigigihihiiiihigigigighghhiiihjhkgjgihhhhhihihjhjhjhjiiiiiiiijihihjijhihjhjhjijijijjkjjkhjiikhlhmhmikjkkkkkkkililjlkkjjjjijikhkikijijhkhlhkijikimimimhlijjjkjmknjniljjkilhmgmglgkgkhkhlhlglglfnhnjniohogngmhmjmhlglgkhkhkhkikijijiiiihhiiijijjijijijiijikjkjkjijiiiiiijjjjjijikikhkhkhjhjhjgkhjijijjkjkjkikikilililhkhjhjijhjhjijiiiijijijiijjjjjiiiiiiiiiiihjiiihjhjhihihihihihihhhghgigjgjgigighhhhiihighhhigjgjgigigighghfhghghghghghfieididjdidhdieififjfifighggggggggfgfhfgfgfgfgfgfgfgfgmkwm{l}l~n}n}lygogjhihghghghfgfgfgfgfgfgfgfggfgfhfgfgfggfgfglguftenekgmhqgoflfpeueugvjxlyiygvfrgsgtiwkyl{l{hydtemfmfojsnxo|o|o|n}m}m|m|n|n}n~o~p~o|iogigigighhhhhhhhgighghghghhhhgigjgjghgihihihjhjhjgihihihihihjhjhjhjijiiiiihiihigjhjhjhkhkhjhjhjijikjjjijjikgmgmgmhljljlkklkjljmimiljjijhkhkhlhkikikhlhlhlikikilimimjkkjkjkjmknimikjjkilgmgnhnhmilikhkhkglglglhlimhmgmglgkglhmhlhjhiiihihjhjhjiijijhiiijijijjjjijjikjkilililijijiiiiiijijijijjjkikhjhjhjgjgihiijjkkljlilikikjkjkilhkhjhjhjhjijijijijikijjijjijiiiiihihihihihhhhihjhjhhhhhhhhiiiiigighghghgigigighghhigighghghgigigihigigighghghghghghghfheididieheheiejejfifhfhghghghghghehehfhfhfififhegegfhnlxn|l}l~n}o}o|kwgofhhghghggfgfgfgfgfgfgfgfffegfgfgegfgffeihsmykyfwewgxlziygxizk|k|m|o|o|n}l}k|m{m{n{o{n|o|n}k}gygxixkxmzm{n|n{n|n|m|l}l~n~n~nm}hvhkghgigghghhhhhhhghghggggggghghihihihhhihihihjhjhjhiiijijihjhkhjhjhihihhhhhhhigjgjhjhjhkhkijijhjhjhjijijhjhkglfmglglililjlkljlimhmhlikijijhkhkhjhkhlhmhmilikjkjljmjlkjkjkjkjljljkiijhkhlgmhnininjmjlikhkgkgkglgkhlimhmhlhlhmgkfjgihhhhhihjhkhkikjkjkilikikikjlikijijikikhlhlhkhjiiihjgkgkhjhjjkkjkijhjhihihihjijikilhmhlikijjjkjjjijhjhjhkhkhkhkhjhjhkijihiihjhjiiihihihhihihhhhhihihhhhhhhhihiiihigiggggghghghghghghghghggfhghghghghghghghggggggggghfhfheiehehehfgfheieifhggghghgifhghfheheheheieieieiehegfionyo|n|m}o}p}p}o{ivfmfhgggggggfgfgfgfgfgfgfffefegekdmcndpgrmxpzo{l|j}j|k|k|l|m|o|o|p|o|o|n}m}m}o|n|n|m}m}n}n}n~m}l|l|l|l}l|m|m{m{n|n}m}mn~n~m~k{fofifhghgggghhghghggggghghghghggghgighhhhhhhhhhihihhhhhiiiiiijhkhjgigihhhhghgigjgjgjhihjgjhjijiihjgjhkhkhkhkhkhlgkhjikhkhkiljlilhmgmhlikjjjijjijiiikhlhlhlhkhkilimimimjljkjkjkjikjikhkgkglhlimjninimhnhmhlhkgkglhkikilkmkljljnglgkgjgjgkgjgkhlhlhlhlhlilijiiikilikjjjjikikhkhkgkhjiijhkgkhjijijjjkililikikijijjjjjililhmhnimikjkijijijhihjhjhkhkhkhjhjhkiijhihiiiijhjhihhhhihiihhhhhhhhhhhhhghhihihihhghgggggghghghgighghghfhfhghgghgghgigighggggggggghfififhfhfhfhfhfgfgfgfhghghghfhfhfhfhehegegehfhfifhfhfgffpk{o}p|o}o~o~o~n}lzhweofigggfgffffffffgfgdiemdqdrdtevfwhymypzq|n}m~m}m}m}m|n|n|o|n}n}n}n|n}m}l}o}n}m~m~m~m~m~m}m}m}m}m~m~m~l|k|l|m|n|n}m~n~ml}jugkghghghghghghghghggggghghghhhggggghghghghhghghhhhghhhhihihjhjhkgjgighhhgigjgjgkgjgjgjgjgkhkhjhigjgkglglgkhkikhkhjiiijikikhkhkglgmgmhkiijhkijjijikikikililhlglgmgmgmhmjljkjkikjjjjikgkhkhkjkjlklikhlgmgnimilikijjiijhkiljkjkimgmgjgjglglgkgjhkikhkhkhjijiijijijjjjijijijijhkhlhkijjhkhjijjjjikikhlhmgnhmilikjkijijilhlglgmhmhlikikhkhjhiiiiiiijiijhjhjikijjhihihihihihiiiihhhhihhhhhhhhhhhhhghhhhihigighghgggghfhfhgigigigififhghgghhgigjgjfifhfhghghghfififhfhfhfhfhfgfgggggghfhfgfgfgfgfgfhfgegegfgfhfgfgfgefoj{n|p}o}o}n}n~n~m}k}jzirgkehdkcmdmdmemdqdvhzjzj|j|k|m|m|n|n|o~nnmmm}n}n}n}m~m~l~m~m}n}o~n~o~n~n~nn~n~n~n}n~n}n~or~o~l~km}n|n|n~nn~m}kwgpfjfhggggghgififhfhggggghghhgighfggfggggggggghgggghghihiihihjgkgkgjgighgigjgjgjgjgjgjgjgjgkhkhjhjgjgkgkgkgjhjhjhihjhkhjhjhkgkglglgmgmhlhjiijiijhlilikikililhlglgmgmgmhmjlkjkjikijijijhljljljlkkkkjlimhlimjmjljkjjkkjkikhkijikhlikhigiglglgkgjiijijjijhiiijijhjiijikikijhjhjhkhkijjjjijjjjijhjijikhkhlhlilikijjjijjjikhkglglglhlikhkgkgjhjijijiijiiihjhjhjhjhhhhhhhhhihiiiiiihihighhghhhihihhhhhhhhhghghghgggggfhehfhfhghfhfhfhfhghgigigigigifiehfhfhfhfififififhfhfhfgfgfgfgghghfgfgfgfgfgfhfiehegegfgfgfgfgfgfhikun{o}o}n}n}n}n}n}m|l|mxitesdvhygyfyhyizl|o{ozo{o|n|n}n}n}n~n~nnmll~m~n~n~n~m~m~mm~n}n}o~o}o}n}n}m}n~n~n~n~nnoqomllmmlnl}jyiphlhjghggggggghfifhgggggggghgigjfgffgfgggggggghhhghghghgihihhgigjfkgjgjgjgjgjgjgigjgjgjhjhjhjhjhjgigkgkhjhjhjhjhiijikglgkgjgjgjglhkhkhlhlhkhkhkhkhkikjkjkjmilhkhkhkhlhlikjkkkkkjjjkikhlimjnjmklkklkklimhlgkikilimimjmjmkkjkikilhmhlhjijhkhlgkgjijkijhjhiiijiiiijijjikhlhlhkhkhkhkjjijhjikijhjijjijjjjijjjjjijiiiiijjjjjijhjgkglglhkgkgjgjgjgjhjhihihigigihiiiihhhhihihjhjijijiiihighgghhhigighhhhghghghghhghghfhfhfhfhfhfhfhfhfhfifigigjhihhhhghfhfhfheheidieififhfhfgfgfgfgfhfhfhfgfgfgfgfgfgfgegfgfgehegfgfgfgfhfjmlyn|o|n|n}n|n}n}n|n|m{kzjzl{m|m|k|n|p|p}p|p|p|o}n}m~m}n}n}n~n~nnm~m~m~o~o~n~m~mnno~p}q|o|n|m|n}m~m~mmm~nnnooo~nlllmn~l}i{gsgngjhhhhhhhghhhhgggggggggggghgighhggggggggggghhhghghghgihighghfififigigigigighghhihiiiiiiihihjgjgjgkhkikijijikikikilglgkgjgjhihjijhjhkhkhkikikikikjkjkjkilikijjjjkjlilikiljlkljmjlimhmhnimiljkjjkjjjhkgmglhkikilimiminjmjkjlimimgngmhlhkhkglglikjjjijiijikijhjhihkhkglglhlhlhlhjijgjgkhkijhjijjijijijjjikjjjhigihjiihihihihjgkgkglgkgjgjgjgkhkhihhhhhhhhiiihihhihihihihjijiiihhhihhhghghhhhgghghghghghghgggggggghghghghghfifififjfigigihhhhghghfhfhehegfheieifhfgfgfgegegegegegegfgfgfgfgfgfgfffffgfgehehfhfhfhfgegiiuo{o|n|n}n|n|n}n}n|m|m|l{n|n|m|m|n|m|n}o}p}o}n}m}l~l}m~n~n~n~n~n~n}n}n~o~omm~mmnop}p}n}k~l~m~n~m~m~m~mn~n~ooooonnnn~mmk~k|fzdvfogkgihhhhhghgghghggggggghhhhhhgggggggghghghgigihigjgjhhggfgfhghghhhhhhigigjgjghhhihiihihigigjgjhkikikikhkhkhkhlhlgkhjijijijjjijhjhkhkijkjkikkkjjjjjjjjjikilimimhmhmimjmkmkljmimhmhnhmhlhlillkkjjkimililikikiminhnhmhmgmgmflgngmglhkhlgmgmhlikikikjkjljlikhjgkgkglglglglhlijhjgjgjhjikikijhjiiiiijijikijhighgihighfhgigigjgjgkgkgkgkgjhkhkhihhhhhhhihihigigigjhihiihiiihihhhihiihigigigighghgigigighhghgghghhhhhhghghghghgifhghghggggggggggghfhegegfgghfifhegfgegegegfgfgfgfgfgfgfgfgegfffffffffffgfhfhfhfhfgegehomwn|m}m}n}n}n}n}o|o|o|n|m}m}n}o}n|m|n|n}n}n}m}m}m~m}m}n}n~n}n}n}n}n}n~nnnn~n}n}n~n~n~o~o~m~n~m~n~n~m~m~n~n}n}n~nnnnpp~p~p~nnno~mj~izetelejeifhfifhghggggfhehfhggggggggghghgigihihihigjfighhgghgighgghgihiihjhjhjghghgihigigigigjhjhjhkikhkhkikikilhlhkijikjkjkjjjjijiiijjjjjkjjkjkikikikiljljlimgmgmhmjmkllkkkjlilhmhmhlhlglgmjljkilhlhlililikhmgngngmfmgmgmglglgkhjhjikikikilhlhmhmiljljlikhjhjhjgkgkgkhlikijiihihjikjkikijhjijijijhkhkhjhjhihihihigigigigihihjhjgkgkgkhkhjhihihhhhghgigigigigjhihihihhhihihhihihiihigigihihigigighghggggghghghghggggggggggggggggggggggghghgggfgfgfgfgggggfgfgggfgffegegegegegehegegegegfffffffffffffgfgfgfgfgfgeghjsn}n~n~n}m}m}l~m~mmm~m~m~n}o}n|o|o|o|n}n~m~m}n}n}m}m~m~n}o}n}n}m}m~n~n~oonn~m|m}n}o~p~oo~n}n~o~o~n}n~n~n~m~mnnopoop~pnnopqn}i|ewcterdqfnfigighghghfhfhgghghgggggghghghihihhihighghghghghghgghgihiiiihjijhigigjgjgighgihihjhjhjiiiiiijjijijikikikikikikikikijiiiijijjikikilililililjkjjikhkhkjkkljljkkkjlilhmhmhlgkglhmikilhmglglgmhmimhmhmhlhkhlhlhlikgjhihihjhjiiijikimgngnimjkjkjkikijijhjhihihiiijhiiiiikilililikikjkjjjjhjhjhjhkhlhlhkijiigigihihiiiiihkhkhkijijiihjhighghhhhhhhhhiihihhhhghgigjgigihhighghhhigigigighghghgggghghggggggggggfggggggggggggggggghghhghghghghfhfhfgfgfgfgfgfhfhehehdhdgehegdgdgegegfgfgfgfgegdgegggggfhfgfgigrmzo|n}m|m}l~lllmm}n}n}m}m}n}o}o|o}n~mlmnnm~m~n~n~o~o~n}n}n}n}o}o~nnn~n~n}n}o|p}o~n~n~m~n~p}o|o}n~m}l~l~nnnon~n~o~onmno~pom~k}j}k|i{fwfngighgighghghgghghgggggggghghhghghhhiihhhghghggghghhhihiiiihjhjhjgighhihhhhgigjhigihihhhhihiiijijijiiiiiiijijijijiiiihijikjljkjjkikikikjjkjkijiiijjkjkljlikjkjkikhkililgkgkiljlhmhljkkkjljmkljljlikijhkhkijijgnhkhjgkgkgjhjikilikhkhlhlilhlglglhkhjiiiiiijhjhjiijikililhkhkijiiiiiiiiijijhkhlglglhkhjhihjhjhiihihhjhkijijijjiijhjghhhhhhhhihiiiiiihihhhghgigihhhghghghhhhgigighghghhghggggghghghghghggggghghghgggggggggfgfggghghghfhfifiehegfgfgfgfhehehdhdhegfgegegegegegegegfgfgegegfgfhfhfghgphtiwmzn|n|l}m~m~m~m~m~n~n}m|m|m}m}n}o}n~nn~mmmmnno~o~o~o~o}n}n|n}o}o}p|o}n}n}n~n}n|o|q}q}p}n~lm~n}o}o}n}n}n}n~n~nnnn~o~o~o~oo~o~o~o~onnnn~n}j~gxemgighggggghgghghghgghghghghhhhhghgihiiihhghghghhhihiiiihigjgjgjgighhhhhgigigigigighihiijiiiijjjiihjijjijihihiiiiiijijijjjljkjijhjhkikkkkjkikijjjkkllllklkljjjijikjkjkilhmhnimhmillknkllkmjmimimhlhkikjkikhmgnglgjgigkgkikikjjiiiiijhkhkgkgkglglhkijjjijhjhjikijhjhjhihjhjhkhjhkhkhkhjhkhkhjgkgjhjhihihjhjhjihihhihiiiiiiijjijhihihiihhhhhgihiihihjhihhhgigihhhghghgghhhhhhggggghghgighgggghhghghghghfhfifjfiehfhfgfgggggfgfgfgfgfgeheididhegfgfgfgegfgegegfgfgfgegegegegehegfgfgfgfgfgeggfkesiymzozo{n|n}m}n}n}n}n}n}n}n}m}m|m|n}o}p}o~nn~n}n~n~nnno~p~p~o}n}m|n}n}o~o~o}o}o}n~m~m~m}o}p}q}p|o}n~n~o~o~o}o~o~o~o~o~n~nnnnn~n~nopo~o~ononn~o~mm~iyepfhgghgghhghgififggggghgihhghghfigigigigjgihiiiiiiihjgjgjfifififihihigigigigigjgjhiiiijhjhjijikhkgkhjiihihihjjjljlijjjkjkjkilglglhljkkjjjjjikikkklklklklkjkikiljljljmjmjnjmhlikkjnjnlllikglhliljlkkjkikimhjfjfjgjgjgjgkhlhkijiihihkhkhkhjikhkgkhkhkhkglglgmhkhiiiiijiijhkhkglgmhlhjhjhjhjgjgihihigigjgjgjhihihihiiijiijhjhjhihhihiiiigigigihiiiiihjhjhihihhigighghghghghggggghgigighgggghghhghghghghfhfifhfhfhfgggggfhfhfhfgfgfhfhehdhdgegfgfgfgfgfgfgfgfhfgfgegdhehehehegfgfgfgfgffjenfuhzk{n{o|n}n}n}n}n|n}n}n}n}n}n}n}n|n|n}n}p}n}n}n}n}n}o}o}n}o}o}o}p}o}m~l~l~n~n~n~n}o}o}n~m~m~n~o~oo~n}n|o}o~oon~n~n}n}o}o~n~n~nn~m~n~n~noooooonnnonpo~gzdrgighgigihgififggggghgigigigififigigigjgihihihigigigjgjgifififihihigjgjfjgjgkgkgjgkgkhjhjhkhlgkgkgkhkhjhjijjjljmiljkjjkjlhmglhlimiljljkkjkkjkkjlklklkjkhlhlhlhlhmjmklkkjkikijjikjlllljkililililjlililkkgjgjgkglglglglglglikijikhkhkhjhjhkgkgjgjgjgjgkgkglgkijijjikijiijhkglgkijhjhjhjhkgkgjhjhjhjhkhkgjgjgjgjhjiijiijhjhkgjhiiihihigigigihihigihihihihhghhhhgghghghghghgggghgigighggggggfhfhfhggggggggggghghghggghghfhfhfgfhfifhfhehehfgfgfgfgfgfgfhfifhfgfgfgfhfhehehfgfgfggghenfuhwjyk{l|m|m}n}n}n|n|n|n}n}n}n~n~n}n}n|o|n|n}o}n}n|o|o|o|o|p|p|o|n|n}o}o~n~mn~n~n~m~m}n}n~n~nnnnnnn~o}o~o~o~oo~o~n}n}n}n}m}n~n~m~m~no~oooponnnnmlmnqn~g{gpgkgjgjghhgigghghghghfigigihhihhhhhhihihigigigigigjgjhihihighghgigjfkfkgkhkhkhkgkgjhjhjgkgkgjhjijijijiiiijikikjjkikikilhlhlililjlklklklljljkjjlklkljlililililimjmjljkilikjjkikjkkjljljljlikikhlhmhmikfjgkfmemfmgmglglhkhkikjjjiiiiiiihkhjgigihihigjgkhjhjhjhjhjhjijijhlhkhjhjhkhkhkhkhkhkhkhjhkgkhkgkgkgjgkgkhjiiiihjgkgjgihigigigigihiiiihhhhhhigighghgigigggggggggghghghghghhghgggggfhfhfhfhggggggggggghgighggghfieidhehfififhfhehegfgfffffffgfhfhfgfgfgfgfgfhehegfgfgfflgufzk{o{pyo{o|o|o|p|o|n|n|o}n}n}n}n}n}n}n}n|o|o|o|n}n}o|o}p}p|p|p|p|o|n}n}p~p}o}n~n}o}n}m~l~lno~n~m~m~m~nno~o}n~n~n}n}o~o~n~n~n}m}m}m~m~llm~p}p}o~o~oonmmmlllmqp~m~iyfrfkgighhghgghghggggfhfighigjgighgghhhhigigigigjfkfkgjhjgihigjgjgjgjfkgkgjhihjhjhihihkgkgjgjhjiiiiijhiijijijhlglglhlhlhlhlhlhkjkjlhlglhkijikjkililhlililjljljljmjmjmimimjljljlhlhmhmimilhkhkhkhmhmhkhhiihjflfmgmglglgkgjgjhjiiiihiiiijijhjhjhjhihigjhjhkgkglglglhkikhlhlhkhjhkgkgkhkhkhkhlglgkgkgkglglglgkhjhijhjhiihjgjgighhhgigihhhhihighghhgigighgigigigggggggghgigighghhgighghgggghghfififhfgfgfgggggghggfgfgfhdhdgegfhghfhfhfhehfgfgffffegegegegfgfgegehdhdgeffffemgvl{n{p{q{qzq|p|p|p|p|o}o|n}o}n}n}n}n}n}n}n}m}m}m|m|m}n}o}o}o}o}o|o|o|o|n}n~o}o|o}n}n}n}mkmn~n~onm~m~m}n~n~n~n~nn~n~n~n~n~n~m~m}n}m}k~kmon}o}o}n}n}nnmlkllmlmqq~p~m~gybpeihghgghghghggggfgfhgghfighgggghhgghghgigigigjgjgigigighgjgjhjhjhjhjgjgjgjgjhjhjgkhkijhjhjhjhjhkhkikijijhkglglhlgmgmhlhlhlilhmfmgmglikjlkkjkilhlhlhliljljljlililjljkjljlhlgmfmfmgmgngngmhlglflflilhihigkfmglglhkgkgjhkglgkhihihiijhkglhlhlgkhjhjglglglglgkgkgkhkhkgkgkgkgkgjgjgjgjgkgkgkgihjhjhjgkgkgjhjhihiiihihjhihihihhgigighhhihighgghgigigigigighghghgggggghghghghghhggggggghgghgififhfgfgfggghghghgggggfgegegegfgggfgfgfgfgegegegfgegegfgfgfgfgegdhdhegdfgcoewlzszrzq{o|n|p|o|o|o}o}n}n}o}n}m}l}m}m}n|o|o|m|l|l|m}n}n|n|n}m}m}n}n|n|n}n}o}p}o}n}m~n~n~mmn~o}n}n}n}n}n}n|o}nno}o~o~n~n~n~m~l~km~n}m}lloq~o}m~m~m}n}n~n~nnmlkklmoopoj}dtfkghgifigigghgghghgghghfighgggghghghgigihihihihigigighghhigigjgjiihigififjgkgkgkhkikijijhihigjgjhkhkhjhjijhjgkglgmhmimimhlhlhlhlhlimjmjmjljkjkjkikjljljkkjjkililkkjkjkjkijhjgjgkhmgngngnglglglgmgkgigigjgjgkglglglhkikhlhkhihihihjgkglglflflgkgkglglhkhjhkgkgkgkgkgjfjgjgjgigjgjhigjgjgigihihihjgjgjgigigigjgigihjhihihiiihjgjgihhihjgighhhihhhgggggghghghgggggggggghghggggggggggggggggfhfgfgfgfggghghgggggghehegfgfgfgfgfgfgegegegdgegfgegfgfgfgggfgfgegegdgffofxl{qzp{p|o|n|m}n}m|m|m}n}p}p}p}n}m}l}m}n}o}p|p|n|m}m}m~m}n|n|m}k~l~m}m}m}m}n}n}p}n}m~l~m~n~n~n~nmm~n}n}n}o}o|o}n~n~o|p|o}n}n}m~m~l~lmnn~m~n~p~p~n~m~m~m~m~l~m~n~n~o~onmmmnnnmkhzgpfkfjfhgghfhghgghhhhghghghghghhgigigigigigigigigigighghgigigjgjgigififigjgkgkhkhkhkhkhkhjhjhigigigigigihjhjhjgkglglikjkjjjjjkjkhkhlhmhmhkhkijijikjkjkjijjkkllllkmhlglhkjjiihkglgmgngnhmhlhmhmhngjgjhihigigjglgmgmgmhlhkgjhihihjhjgkglglflflgkgkhkhjhjhjgkglhlhjhjgjfjgigigigigihihihigihhhhhhgihjgjgjgjgkgjgjgigjgjgjhjhihhhhhihhhhhhhhihihihigigggghhhhghghghggghghghggggggggghfgggghfhfgfgfgfgggggggggggfhehehehfhfhfgfgfgegegegegegegegegegfhfgfgfgfgefhephxoyqzp{m|n|n|m|m}n|m|m}m}n}o}o}p}n}n}n}n}o}o}o|o|n}n}n}n}n}o}o}n}m~m~m}n}m}m}n|n|n}n}n}n~m}n}n}o}nlkl~n}n}n}o}p}o}n}o|o}o}n}n}n~n}n}n}o~nmno~o~nmlnn~m~l~l~m~n~n~n~oonmmoonml}hwfnfifhighggggggggghggggghgighhgigigigjgigigigifjgighghhihihjgjgjgigigigjfkglgkfkfkfkflgkhkijiiihhhhiijhkhkhkhkgkgkijjijjjjjjjkikikhkhlhkhkikjkjmjljjjiijjkllnllmhlflhkijijhkglgngnhnhmililimhmgmgkgihghhgkgmgngmgmgmglgkhjhjhkglglglflglflfkgkgkgjhjikhlhliljkjjijgjgigjfjfjgjhjhjgjgjhhhhghgihihjgjgkgkgjgigigifjfjfjgjhhigihihihihiiiiiiihihihhhhhhhighgghghghghghfhgggggggfgfgggggfgggggggggggggggggggggfgfhghghfhfgfgfgfgfhehegegegegdgdhdgegegfgffifsg{m|q{q{p|n}m}n}n|o|o|o|o}n}n}n|n|n|m}m}n|o|o|o|n}n|n|n|o|o|o}p}o}n}n}n}n~n~m~m}n|o|o}o}p|p|o}n}n}n}n}mlm~n}n}n}o~o~p}o}n}o}n}n}n}mm~n}o}p~nmmn~mmllnn~n}o~n~n~n~m~n~nono~n~nn~nnm~j|gsflgghgggggggggggghghghgghhghghgifjfkfjfjfjfjfjgigighhhihiigjgkgjhihihjgkglgkgkgjgjflgmhlikijijjijijjikilikikhjhjiikikjkjijijjijjjjjjjkiljmkmjmjljkijikiljlkmklikgkgkgkhkhkhmgnhlikikhliljlilglglgkgigjglfnfogngmhmglhkijikhlgmfmgmgmgmglglgkgkgkhkikhlhmhmilikhjhjhjgjgjgjgjgkglgkgjhihihigiiiijgjgjhjhjhihighgifjfkgkgihgihiihihjgkgkgjgihjhjhihihhhghhghggggggghfhghgggggfgfgggggfggggghghggggghghghgggggghfhfhehegfgfgfgfgegegdhdgegdgdhdgdgdgfgieqjzn|o{p|o}o~n}n}n}o}o|o|p|p|o|n|n|m|l|l}m}n|n{o|n}n}m}n~n}n|n{o|n|n|n|n}n}n}m}m~m}n}n}n}o}r|r|o}m~k~l}n|n}n~n}m}m}m~nno~o}o|o|o}n}n}n~n}o}p~ponmm~m~nnmklp}p~o~n~nnnn~o~o}p}o}n}nllm~m~izerfjghggfgfigighghggggggghgigigififjfjfjfjfjfjgigigigihhhhhigkgjhihihjhlhlhkhjijhkglglhkhkgkhkhjiijjikhlikjijihihijikikijjijiijjjjjkjlilimjnimhlglglhlhlhliljkikglglfmfmgngnhmiljkkjjkimjmlmgigkglgkfkflfmgngmhmilhkikijhkglfmgmhnhngngmglglfkfkgkglgmgmhlhkhkgkgkgkfkfkgjgjgjfkflgkgjhjhjhjijijgjgjgjgighghghgigjfkgkgjhiihhigjgjfjgihhhhhihjgighghghghghgghfhgggghghgggggghfgfgfgfgfgfggggggggggfhghgggghfhehehehegfgfgfgfgegehdhdhfgegegegegfglgthyn|q{p|o|o}n}n|n|n|o|n|n|o|o|o|n|m|l}k~l~m}n}m|n}n}o~p~nn~o}o|n}n|n|n|n|n|n|m|m|n|n}n}n}n}q}p|n{n}m~m~n}m}m}l}m~m}n}o}o}n}n}m~n|p|p}o~p~p}p}p~qpoonnnnjikooo~o~n~mop~o~o}o~n~l~kjjl}n}m}izdselfihhhjgkfjgighhghghghhhhhhghggghgifjfjgjgjgjhigjgigigigigigjgjgjglglglgkhkglfmflgkgkgkfkgjhjhjhjhkijjhjihihjjjkjkjjjijjjikikhlhlhliljlilhlglhlhlhlikjkjkikhkhkhlgmfnfnfnhmjlkkjlhminkmglgjglglglgjgkgmgmhmhlhkilhmglgkglglgmhmgngmgmgmfkfkgkgkglglhlikgkgkgkgkfkfjfifigjgjgjgkgkgkhkijijhjhjgjgkgjghghghgigjgkgkgkhjhihjgifigiihigigigihggfgggghghgghghghggggggggggghghghfgfgfgfgfgfhfhfgggggghggggghfhegegfgfhfgfgegegegehegegegegegfggflgvkzn{n|n|o}o}o}o|o|n|n|n|n|m|n|o|o|o|m}l}l~m~m}l~lmnopo~o~o}n}n}n}n}n}o|n|n|m|n|o|o|n}n|o}o}o|o{p|p}o~m~m~n|m~m~o}o|o|o|m}k~jn~o}p}p}p~o~o~prqqpmmlkjklmnp~o~l~lop~p~p~o~mlkjjk~m}o}n|izerejhhgjfjfifhghghgggggghgighgggggghfiejfkgkgjgigjgjgjgigigigjgkgkhkhkgkflflfmglglglglflflflglglglgkgjhiihjijjjkjkjjijhkjkjkilgmglhkjklkklilililililikikikilhlhlhmhmgmgngngmiljmimhlgmgngmgjglglgkgjfjflfmfmgmglgkglglgkglglgmgmgmgmglglgkfjfjgigkglglglgkgjgjgjgigighgggigigjgjgkgkgkhkhkgkgkflfkgjhihhhhhihjhjhjhihihjgjgigigihihihhhhhhgggghghgigighghgggggghgggggghghghggfgfgfgfgehdhfgfgfhgifhfgfhfhfgfffffgegegehdfegegegefefefeffflfvjzo|p|o|n}n}m~m~n~n}n}n}n}n|m|m|m|n|o|n}n}m~n~mnnooooo~n~n~n}n}n}n|n|n}o}o}o}o|o|n}n}n|n|o}n|n}o|q|p|n~m~n}lmn}n}m}n}m}l~m~n~no~q}q~p~pquvvtrpnmlmnnnoon~mmo~p~o~oonkklnm~n~o}n|jzeqflfifhghghghghgggggggghghhghfhfhfhfifjfjfigjgjgjgjgigighgigkgkhkhjhjgkgkhjijijgkglflemfmflglglgkhjhjjhjijjikhkhjhjhjililhlglglhjjjkkkkikikikilhlhliljlilhlgmgngngmgmgmgmhmhnhngmglgmgjgjgkglfkfkfkflflfmgmgmgkgkgkgjgjgkhlikikhkgjgjgjgigigigjgkgkgjhjgjgkgjhjhighgghihihjhkgjgjgjgjgkgkgkgkgkhjiijihihihjhjhihihigigigigigigigigighghghghgghghghgighgggggghgggggggghghggfgfgegegegdhfgfgghghfhfhfhfhfgfffgegegegegdgegegegefffefeekcvh{l{n{n|n|n}n~m~m~n}n}n}n|n|n|m|l|l|m|n|n}mllnrvv}v}v~t~q~n~m~n}n|n|n|m|m}o}o}o}o|n|n|n}n|n|n|n|m}n}o|q}o~n~m~m~m~m}m|m}m}m}n~p~n~o~o~p~p~o~r~vy~|}|~|{wromnnnmnnnmn~n~no~p~qpmmonllm~m~n~jzeuflghghhhihggggfgfgghghgigigifhghghgifigigjgjgkgkgjgighgigjglfkfkgjhjhjhihihjgjfjfkfkfkgkgkgkhkhkijjiijhkhjhjhjhjijhlhlglgkgkgkhkjlilhkhkhkhkhlhlhlhlikikhlhmgogognhngmgnfnenfngmhmflfkfkglflflfmfmgmgmhmhlhkgkgkgkgjhkikijhjhjijhigjgigigkhjihjhjhiihjgkgjiiiigigjgjgjgkhkgjgjgjfjgjgkgjhjhjhjhjhihhhihihiiiiihhhhghgigifigighghhhggghghhhhhihigighghggggfgfgfgggghghggggfgfgfgegehfgfgghfhfhfhfhfhfgegdhcgdgdgdgegehehegegfgegjdthyl|n{m}n}n|m}m}n}n}n}n|m|m|m}m}l~k}k}l}m|m}lknv~~{{{z{}|w|q}n~p}o|o|n|n|m{n{n{n{n|n|o|o|n|n|n|n|m|n}o}p}p~o~n}n}n~n}n|m}l~l~n~o~p}p}p~p~o}p}u~z}}|| |}~~wsrpnnponmmo~p~oo~p~pppoponnmmnoj|gshjhihjhifififheigigigigjgighghghgigigifjfjfkgkgjhigjgjhjijgkfkgkgkgjgjgjgjfkfkgkgkglglglgkgkgjgjgjgkglgkhjijijijhkhlhkijikhkglglhlikikikhlililhkhkhlhljkjkinhphoiohngnfnfngngnhndlekfkgmglfmfmgngngmglglglglglglglhlhlgmgmhmimilgkhjhjgkikiijhjiijhkgkgkhjhjhjgkgkgkgkgkgkgjgjgjgjgkgjgjgkgkgjgjhihihihihihigighhhghgifighghghgghggghgigihigigigiggggggfgfgfgfgghghghggfgfgfgfgfgfgfhfhfhfhghghggfgfgegehdgegegegfgfgfgegffkguiymzn{n|n}n|m|l~l~l~m}m}m|k}l}l~mll~l~l}m|k~kmt}| zyy yyz~|x}r}q|o|o}n}n}o|n{m{l{m|m|m|m|m|m|m|m|m|m|n|n}o}o}n}n}n~n~m}m}l~m}n}n~o}o}o}o}p|p}t}x}| ||{| |}}~~~zrpr~o~mmn~p~q~p~o~o~ononlnonmmnplfvglgjgjgjgjgigifighgigigighghghghgigifjfkekflflgkhkhkhjhjiihjgkgkgkgkhihihihjhkhlglhlglgmgkhjhjijhkhkhlikijhjhkgkglglikjkjlilhlglgkhkilhlhmimilililhlhlikjkimhngohngngmglhlhlhmgnfkfkfkgkgkgkglglgmgkgkgkgkglglgmgmglglgmfnfogngngmhmhmgmhmhlhkhkhlglflglgkgjfkflgkgkgkgkgkgkgkgjgigihigigjgjgjhigihihihihjgjgigihghghhhhghghghgghgigighghghghghgggfgfggggfgggggggghghfhfgggggggggfgfgfgfhghghghfgffffegegegegfgffefffffgengxkznzn|n}n}o|o|n|l~k~k}l}l}l}l~m}n}n}n}n|n|n|n}kmt|}|zyzy z{z|{t|o|m~l~l~n~n~n~n}m}n|m|l|l|l|m|m|n|n|n|n|n|n|m|m}m}m}m}m}m}m}n|n|o}o}o}o}o|q|p}r}u}| {{{{| ||{}xsr~o}m~mno~o}o}n~n~n~n~nnkknonnnpn|gsemfkhigihihhhhhhhghhgigjgighghghfhfifjejdkekekfkfkgjgjhjiiiihjgjgjhjhjhjiijjjkhlglhkgjgkgjhiiijijjjjjjiiiiijhkglglhlilikililililhlhminhnhmhlhkhjikhliljljlimininhngmgkgjhjjkjlgmgkfkfjgigjgkglglglgjgjhjgkglglgmglglglgmfnfnfngmhmhmhngmfnfngmhmgmgmfmflfkekelemfkgkgkglhlhlhlglhkgjgjgjhjgkglhkgkgjgjhjhjgjfifihhhghghhgigihihiihihhhghghgggggggggggggggggggggggggggggfgggggghfhfhfgfgegfgggggfgfgfgfgegegegfgefefeefdnfwozq{o{o|o}o}o}n|m|m}m}m}l}k}k}m}o}o|n|o}n|n|m}mlo{}|{ zzzz zzy{{q|m}m~l~l~m}m}n}o}o}n|n|n|m}m|m|m|n|n|n|n|n|m|n}n}m}m|n|m|l}l|m|n}o~p}p}o~o}o}n~p~t}{{{z{| | |{|}tpn~n~nnnn~n}nmlmmn~mkmop~r}u}z|~xypqlilgkgjhihhigihhhhhgigjfjfififhfifiejejejekekeififjfjhiihihiihihjhjhjhjhjijhkgmglgjgjhjiiiiijijjkijhjgjgjijijhjikikililikilililimiminimiljkiiiihkglhlimimhninjnjnhmglhljllklkimfifjgjgigjgkflfmflgjgkgkelflglglhkhlhmgngofqfrhrirjsksksksltlulumulukukultltmsmslrlsktkumumultltlslrkrjskuluntnsmrlqlqlqkqiqhpiojojpjojnjojnjmjmjmilhkgkfkfjfhghgghghggggggggggggggggggghfgfgfifififiehehfhggggfhfhfhfgfgfgfgfgfgeggflfvmyq{p|p|p|p|p|p|n|n|o}o}n}l}k}k}m}o}o}n}n~m~m~mllq~|z zyyzz zzz{u|o|m}n}o}o|n|n|n|o|o{n|n}m}l}k~j~k~l}n|n|n|n|l}m}m}m|m|n|l|j}j}j}l~m~n~n}n~m~n~mnq~z{{zyz| | |}|~~uqoo~ooooonmmmmn~n~mns{}|z zxnehpkfkgjgighgigigjgigigjgihihhgifiejfjejfjgjhihhgigighhihihihjhjhjiiiihihigjfkglgkhjijiiijikhkhkhjhjgjgjhjijhjiiijijikikikilililililikjkjkkkkkilglgliljliminjnknjnimilklmkmklmfhfjgkglglglfmfnfnfmfmfmfmglgmgohqisjvkwjyk{n}q|t|u|v{x{x|x|x}x}y}y}x}x}z}z}z}z|z|y|x|y}x}x}x|x|x|x|w|w|x{~{|z{z{y|y|x|w}v|v|v|w|v{v{v{uzuyuxuwsvrvptpsnqjphnimikiiigihhhhghggggggggggghfgfgfifigififififhfhfhfhfhfhfgfgggggfgfgffigsmxpzo|n}o}p|o|o|o|o}o}o~n~n~n}m}l}m}n}o~n~kln~n~lkp}y|zy y x yyzy{s{r|p|o|n|n|n|n|n|n|n{n{o|o}m~k~jij~k~l}m}n}n}l}m~m}m|l}l}l}l~kklm~m~n}n|n|n}n~nnsy|}{}{}|{{}}~}upnnno}o~o~no~n~n~nno~nq~z||{{{}{reaexikjhjhjfifighghghgigjhiihgifjekejfjgjijijiihigigjgjgkhkhjgjhjhigigififjfjgkhjijiiiihihjhjhjhjiiiihjhjhkhkhkhjhjikhkhkikjkjkikikikjljljlklkkijijjkjliminjmjmjnjmjkjkkkklklflfmgngmfmflfmfoepepfpfphrjukxm{q}s~vx~xz{}~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~}~|~|~|zz~z}y{xwwtvrtqonkjiihhggggggfgfgfgfhfhfhfgfhgigifhfifieiehehehegfgfgfgfgfgegeflhxozp|o}o}q~p~o~n~n~n}n~n~n~n}n|n|n}n}n}m}m}m}m}n|n}m~l}m}p}t}v|y||{~z}{w|p}n}o|o|n|n|n|m|m|n|n|m|m|m~m~m~m~n~n}n}n}n}n}n}n}m}l~l~k}l}l}l~l}m~m~n~m}m}n}n|n|n}n}n~n~oor~x}| {{|}~}y~ommmnn~mm~o~q~o~o~o~o~pr~xvz|}}}{tjbab}fkiijgigighgihjgkfkfjghfiekelekgiiikijijihjhjhjijhkhkhjiigifjfjfjfjfjgjgkhkikijijhjgkgkhkhkgkhkhjhkhlhlhlhkijjkjkilililjjjkikhljljlkkkjkjjjjjjljmhmhlikikjmjmjkjkjkjkjlgmhmhnfnfnfmgnfpdsevhyl{o~rwy}~~~~~~~~~~~~~~~~~}~~}}}}||||{yx~z~y}wystopmkkghgghfhfgfhghfjejfhghgigifhfhfhfieiehfhfgegegfgfgfhegfepj{o{o{p|p}p}o}o}o}n}n}n}n}n}o}n|m|l~m~m~m|m|l|m|m|m|m|m}m}m}n}n}o~q~r}s|o|m}m~n}n}m|m|k|j}k}m~m}l}l|l~m~o|q}o|o}p}p|q|p|n|m}l~l~k}k|k}l}m}m|n|n|n|m|l}m}n|n|o}n~n~n}n}m}p~y}{{}}~z~w~rnmmmnnmnp~r~q~o~oonz~uv{}}{zxri d¡a`drhjkkjkkmjpjsjtjtjtithshsisjrisitiuiuivjviviujtjqkmllkjjjkjkijijikhkflflhljkjkjjikhlglhlhkhkgkhkikikikjjjijikjjlimhmhmilhlhmhmimjmkkkjjjjkjlhmhmhlhkhjhkhmhmhlhlikjkjkgmgmhnhngngpfufzi}ntxz}~~~~~~~}}}}~}}}}}|{zzzy}w|tvqnligifififhghfhehfhghgigighfhggggggggggggfgfgfgfgehefkgwn{qzq{p}o~p~p|p|p|o|o}n}n}m}m|k}j~kk~l}l|l|l|l|l|m|m|m|m|m|l|m}n}m~n}o}l}l~l~m}n}m}m}k|k|k}n}n|m|m|m|n}o{p{n}n}n}n}o}o}n~n~m~n}n|m}l}m|n|n|n|m|m|m}n~n~n}n}n}m~m~m}n}o}n}o~r}s}s~rpooonnmnmnopp~p~p~pnoxqvz}~}xuoi f¡deef~gg hfdcddeffffdceghhgghijkjiihgfh{jslllilhkjkjjjjjkjkjjjijiijikikjkjkjjkjkjkkjljljlimjmimhmimininilikkkkljlilikhkgkgkglgmgnhninjmjlilgngofpfqeteyhlv}~~}}}~~~}}}}}|{{{{~{xvzsokjgigjfgfgfgfgggghghghggghgggggggfggggggggfgfgfgffnjyq{r|p|p}p}p}p}o}o}o}p}o}n}m}l}k}j~ll~l~k~k}j}k}l}l}l}l}k}k~kk~l~m~n~m~m}l}m~n}o}o|n|k|m|n|n}n|o{o|o|n|n|n}n}n}m}m}m~n~o~n~mm~n~m~n}o{o{n|n|m|m}m}o}n}n}n}m|m~m~m~n}n}m~l~m~n~n~n~n~n~n~n~nnmn~o}p}onoopqrv}tmqvz}~{snkhghfbabcbbabcddeeeecdefgggggggffeedcdfgghwhpilikjkjkkjjkikijjijhkhmimiljlkkljlkjkilimhmhmhmimjmimimiljljlililjlikhkglflhmjmjninjnjmimgoeqevfzi}nuy}~~~~~~~~~~}}}}~}}}}}}|||{{{zxztqolmjigggggggggggggggggfgfgfgggggggghghghghfhfhffmjxqzs|p|p|p|p}n}m}n}o}o}o}n}n}n}m}m}n}m}l}j~i~k}m}l~i~j~i~iijjl~m|n}n}n|n|n}m}m~n~m}k}m}l~lm~m}m~o}o}n~n~n}n}n}m}n~n~m~k~lm}m|m|n|n|n|n{o|n|m|m}n|n}m}m}m}n~n~n}n}n}n}n}o}o}n}n}n~n~n~n~nnn~o}p}p}p~oopqqqx}ulintxzyrligeedbabbbcdddedeeffeffgffedeedddddddddcccdee~grikkjljljkikijhlhmhmhmimkklijjijhjhkhlhlimjmklklkmknkmmmompmnmjnhnhngmhmjlklimimjmkldvdyfox~|~~~~~~~~}}~~~}}}}}}}||{~}~|{~z{xwurqjlgighgggggggggfhfhfgfhfgfgfgfhghggggggfgffkivn{p|p|o|n}n}n}n}o}o}o~o~n~n}n~m~m}n|n|l}k}l}m}m}k~h~j~k~k~kkln}n{n|n|n|n{m|l}l}m~m}l}m}m~mm~m~m~p~p~o}n}n}n}m}m}m}m~m~l}n{n{n|n|o|n|n|n|o|n|l}k}m~m~m~m~n~n~n~n}n}n|o|o}poo~o~o~n}n~nnnoopp~q~r}q~s~s~q~ry}ukeekorrnhfedcddcbbcddeeffgfffffggfffdddddddeeeeddddddddfgyitknkljkjikhlhlhlhkijijhkijjjjkiljkjljlolykkkklmnpuqkshsfqhoknjmhnimjmklelqy~~~~~~~~~~}}}}}}|{~|~}}||z~xvsmlihgfghgggggfhfhfifieidhdhehfhfgggfgfgfgijtnzo{o|m}m~n}o}p}n~lnmllmll}m|m}m~m~m}m}jijm~n~n}n}m}n}n}n|n}n}m~m}l}l|l}l}j}k~l~n}n}n}m~n~n~o}n}m}l}l}l}m}l}m~m~m}n{n{n|o|n}m}l}m~n~n}n}n}n}n}n~o}o~m~l~m}n}n|n|o~p~p~o~o}n}n}n~opooon~n~q~u~u~t}t}u}v}z|tkhfhghhgfddeddddddddddefggfeeefggfeeeee e e¡f¡g¡h¢i¢i¢h¡g gf feededcdeefg{itjpkmkjkhkhkikjjkjkkjmklijrkjffjqstvvwxyxnyhviriogognimjlw{~~~~~~~~~}}}}}}|||~|~}}||zwyrnkhhghgggggggggghfhfieifhfhfhfhfgfgfggghjpmxn{o|o}o}p|p}p}o~mmmmmmm~m}m~l~m}n}m~jjkll~m~m~l}m}n}n~n~m~n}m}l~k~k}k}l}j~jkm~n|o|l~l~n|o}n}m~l}m}m}m}n~m~l}l}l|m|n|n|m}l}l}m~n~n~n}o}o|o|n}n~p~n~l~n~o}o}o|p|q|p|o}o}n}n}n}p}opsrp~o~rux~w}x|y|y|y{vljhffeeefiloqqqpoljhfefggggfeefggfdd e¡f f¡f¢g¢g¡h¢i£j¤j£i£i¢i¡h¡g gggghhgffefhihhirjjlikikkkkkjljlvjhfflvzz{}}}||~w|mziugpfngnjl~~~~~~~~~~~}}|{|}~}}|{yvxrplhhgggggggghghghghghghghfhfhfgegegffghnlvo{p|o}o}o}o}q}r}q~p}p|o}onn}n~nmml~jjkklkkk~l~l~l~l~l~m~n~n}m}l|l}k~j~j~i~jlm}n|ll~m}n~n~m~n}m}m}m}o}n}m}l}j}k}m~n~l~m|n|m|n}n}n}n}n|n}o~o~r}p}n~n~oo~o}o}p}o}nomlmo~oossss~t}w}z~{~{}{}{}w}ynhecdfinruxz{|{zzywtqokhfffedegfdddd¡e¡f¡f¡g¢h¢g¢g¢h£j£j£h¢g¡g¡f¡f fffhj k jhgfggfeddfiulknjnklnl{ihgfjt}~~~~~}}k}evfphnjn~}~~~~~~~~~}}|{|}~~~}{{zwxplkhhgggfhghghghghgighfgfgfhegegfghgjhqlxq{p|m}m}n}q}t}v}u}r|r|p|o}o}o}o~poonmlkjkjkmn~m~l~l~m~n~n~o}n}n}l~i~i~j~j~lln~n|n~n~l~l~m~m~kj~k~l~o}n}l}k~j~k~mlln~n}m}n}n}n}o}o}n~o~p}q}q~o~n~nnnnp~o~nnnmm~n~no~q}s}w~w}w|v{x~{}~~}||{}tkgcdjoswyz{||}| |} }||{{wriffdcefdcddd d¡d e g g¡g¡g¢h£j¥i¦f¥e¢e¢f¢f¢f ddf g¡h¡h¡h¡g¡f¡g¡f¡f¡e dddeg jzlzljdfihlw~~~~}}|~m|gujpln}~~~~~~~~~~}}}}}||}~~}||z}usojjhhggghhghfhfhfieiehfgfhghlirisktlxozqzqzm|l}o|t|w|y|w|s|r|p|o}o}p}q}s~s~r~q~pooonoop~p~p~m~mop~n~m~mlkjk~l~lmmmm}mmllmnjjjk~m}m}l}j~k~l}n~jkn~n~jjkkln~n}o}o~o~o~o~o~onn~o~p~onn~o}p~p~o}o}p~r~t}y}{}{}x|x}y~{~}}~|vmjhfluxyz{{|||} } } } ~ ~ ~ ~ }}}wkgecdee d cde¡f¡f f h i¡h¢h£h¤i¤h¥f¦e¥c£e£f£e¡d c c d¡d e e ee e e¢e£e¡e e¢e edegjhdg jjq{~~~~}||}}}}} zwwjsjp~~~~~~~~~~}}}}||}~~~}}|z}uqnhififighgggfhfhfhehfhffkhtmxnyo{p{p{qzpzl|m}q}u|w|x|w|u|s|q}p}p}p}q}r~t}s}r}r}r~s~t~sts~r}q~q~o~prs~r~q~q~ommmnnoonmmnoopmll~l~kl~m}l}k~k~m}n}l~k~m~n}n}l~lmm~n~n~n~n~n~o}o}o}q~mjlp~nm~m~n}p~q~p~q~stw~|}~}~}|}{|y}y}{}zpighmvy||}||||| } } } ~~~~~~}~~vjfffggf d¡d¢e£g¡g¡g¡h¡i¢i¢i£h£h¢g£g¤e¤e£f¢g ikkkkjige ce f¡f¡f¡f¡f¢f¡h¡g¢f¢g¡i¡i¡i¡j knwz~~|{{}~~|}}|wupulr~~~~~~~}}}}}}~}}|||}y{smkeifighgggfgfgfgfhfggepixo{o{p|p|p|p|p|n}n~q}r}s}s}s|r|r}q}q~q}p}p}q~q~r}s}s}s}t}u~t~r~s}s}r}q~r}v}z}||{|z|y|w|v|s}p}p}q~r~q~qrt}v}v}s~q~m~lm~m}m~m}l~l~m}n}n}m~n}n}o}p}o}n~n~n~o~n~n~n~o~p~q}p}n~q|p}on~n}o}n~lm~nooprs~w}z}|}||{|z|x}x}y} tkggluy | }}}}}}||}}}~~~~~~ ~~~~ui h h gfffe d¡e¡e¡f¡g¢i¢h¢h¢h¢g¢h¡jnqtvxz{{{|{wqm k k i g h¢h¢h¢g¢g£g¤g£g¡h h j lnvz~{z|~}|}}}uqwrnq~~~~~~~~~~}}}|}}}||||wupijgghggggggggggfgfflfwnzq{q{p|p|p|q|p|p}p}p}p}p}p}p}p}p}p}p}q}q|p}o~p~q}q}r|q}t}t}s~qr~t}t}s}v}||{{{{~{|{z{u|q|q}t}u~u~v~y}z|{|z{y{u|q~nm~m~l~mmn~n}o|p|j~l~o|q}rq~qooo~o~o~p~q~r~r}q}o~p}o|p}q|o|o}oo~o~oo~q}p}q}s}u}w}x}x~wu~v~v~z{oihksxy } }}}}}|z|}}}}} ~ ~~~}qh¡h¡h¡h g f e¡d¢d£d¡e¡f¢h£h¢g¢hmswz}}~~~~ ~|xrj¡h¡h¢g£g£f¤e¤e¤f¤f¢e gimu|~z{|}}}}~~xomyolq~~~~~~~~~~~~~}}|}~~}}}}z}trmiihgggghfhgggggjftkzozo{q|p|p|q|q|q|q|p}o}n}n}n}n}o}o}o}o}p}p|p}p~p~o}p}o}p}r}r~q~q~t~w}w|v}y|~|{{{~{{}{y|u|s|t|v|w|v|z||||||||{}yzzu}pn~l~m~nop~n}n}p}lnq~rss~r}q~p~p~p~p~q~q~r~r}r}q~n~n~n~o~q~qqq~r~r}o~nqs~u}v}u~u~u~t~s~s~s}wkghnv yz | } } yz}}}}~ ~~~zm¡i¢i¢i g e e e¡f¢f¡f f¡f¡hjqx|} xpm¡j£h£f¤e¥e¤f£f£d£d fju|~|||}}}|zxrnotrls~~~~~~~}}~~}}|||}~~~~}~y{rokjggghhgifjfohtmxozo|n|n|o|o|p|q|q|p}o}n}n}n}n~n~o}o}p~p~p~p}p~poo~o}o}o~q~q~p~p~t~x|x|w}z|~|{{}{}{|{x{v|u}u}w|x|v|x|||||||||}|}{z{u|q~p~p~o}n~n}n|m|m}n~o~q~r~qr~s|s|q}q}q}p~ppq~r}s}s}q}n~n~o~q~s~tts~r~r}n~msww~u}u}t}t}s}r~p~w|qhfjs y {| |}y~z ||x|}~ ~}r¡k¢j¡i g e e f f g¡g¡g¡gjqw|~ yo¢h¢h¥h¥i£i£i¥h¥g¤f¡gnuw{||||{zxtqppnqqtls~~~~~}}~}}}}||}~~~}}}~}~ywrmjhihlhriujyl{ozp{o|o|o|n|n|o|p|p|o|n}m~l~m~n~nn~nmnoo~mllmn~o~o~o~p~o~o~u~y|y|w}y|||{~|{|{|x|t|s}s}s~t}u}u|y|}|||||||}|{|w|r}p~q}p}m~o}o|o|n|l~m~o~r~q}p}p}q|r}q~q~r}q~ppp~s}r}q}q}p~p~q~s~t~t~t~t~t~s~opu~w~v}t}s}r}r}q}q~tumignx z| || |y x|z|} ~ ~~s k i¡h h¡h¡i¡h¡h¡h¢h¡jmty{ }rl£l¤m£m¤l¥l¥k¤j¥h£h¡iknqssqonnnnnmnyqlrkq~~~~~}}~~~~}}}}}}}}}}}}||xrskskvmynzm{m{n|o|o|o|o}n}o}p}n}o}o}mjijkkkhghihec ehkklon~n~q~u}y|z|w}w}y|y|y}x}y}v|r}r}q}r}q}p}t}z|||y|{|{|{|u|p}p~p}p}o~m~o}o|o|n}mmno}q}r}r}q|q}r}r}r}r~q~q~q~r~r~q~p}p}o}q}s}s}t}t}u}u}t}r}r~s~s~s~r~q~q~p~o~p~|zpjhir z{||| |y z|{} ~tk h f g¡hii¡h¢h hmu{|~ z¡o¤l£m£l£k¢j¢k¤j¥i¤i£i ik l l¡k¢j¢j lmnop|rpqkoin~~~~~~}}}}}}}}}}~~}{xyrypzozn{n{n|n|o|o}o}n}n}p}p~o~nmjfc deeea ^][\]\a eebhmmmo}s}v|w}s}s}u}u}t}t}v}t}q}o}o}p}p}q}t}x|x|v|w|x|v|q|o}p}p|o}o~o~o}n}l~k~mno~p}q}r}r|q|r}r|s}s}r}r}r}q}q}q~p}p}o}o}o}p}q}r}r}s}s|r}q}p}p}q}q}p}p~p~p~p~t}ulhfit z||}}|~ }|}~ tlh f¡f¢g g g¡f£ejt|~ | o¡k¢j¢g£g£i¤j¦j§j¦j¢ikmn m¡l¢l¡nnopyrmqkokmhl~~~~~~~}}~~}}~}}~}~}{{w{r{o|m}m}n}o}o}n}n~n~n}n~mkkie a^_`^]ZVTPVXX`bZ[cilo~o}o}o}p}o~o}p}q}q}p}q}q}o~n~n~n~o}q}r}t|t|t}w}v|q|p}o}o}o|n}n~op~nkkm~n~o}p|q|q|p}p}p}q|r|r|r}q}q}p}p}o}o}o}o}n}n}o}p}q}q}r}r}p~n~n}o}o}o}o}o~opq~y{qkhfju z| ||}}} } ~|{|}~ ~ ~tjg e¡f¢h¢g¡g¡f¡gqy}~ ~p k£h¦f¦g¦h¥h¥h¦h¦h¢h k n op¡qqooonoknjninjm~~~~~~~}}~~~~~}}~~}}{|u|q}o~n~n~o~o}n}n}n~nle_ ^^]ZX\\YXVQMNRSV^\SYe km~o}n}m}l~m~n~n~n}n}n}n}n}n}n~m~m~m~m}n}o|p|o|r}u~r}n|n}n}n}n|o}o~p~q~qpnn~n~o|p|p}o}o}n}n}o}p|r|q}p}o}n}o}n}n}n}m}m}m}m}o~o~o~p~p~nn~n}o|n}n}o}o}o~op~|ynighmw z| |}}}}}|}|}~~~~ ~wk g¡e¢f£g¤f£f¡gmvz}~ ~} r¡k¥h¦g¦g¥g¤h¤h¤h£h¡i imsvtp oqnmnknknknkm~~~~~~~}}}}}~~~}}}~~}}}}z|v|r}o~p~o~o}o}nlkh`XTSUTTWZVTSMKNQQW]WPZh n~m}n|n|m}l}l}m~n}n}n}n}n}n}n}o|n|n|m|m}m}n|n|m|n}o}n}m}m}m}n|o|n}n~p}s~u~s~qo~o~o|o|o}o}n}n}n}n}o}p}p}n}m}m}m}n}n|o|n|m}m}n}o}o~n~n~nn~n}n}n}n~n~n}o}o}n}q}xmhgiox{||}~ }} ~ ~ ~~~~~ ~ ~ ~~ ~ ~~~wl h¡g¡h£g¤e£f hpx|}~ z~ z} }r¡n£j¥i¥i¥h£g£f¢f¢f¡fhlqrqspmonnlmllllll~~~~~~~~~~}}~~~~}}}}~~~~~~}}|}{|u}n~moo~o}mif e`ZRLNQRUXUQQLJOOOX\WP[i n~n}n}n|m}m|m|n|o|n}n}n}n}n}n}o|n|m|m}l~l~m}n}m~l~l}m}m}l}l}n}n}m~m~o~t}u}t~r~p~p~p|o|o}o}n}n}o}o}o|o|n}m}l}l}m}m}n|n|n|n|n}n}n}m}n}n}m}n}n~n~n}onn~n~o}p}t|vmigglw|}}}} } } } ~ ~~ ~ ~ ~~~ ~ ~ ~ ~ ~}{sk¡h¢h¡j¢h¤f¢fhoy}}~~v~v{ }r¤l¥h£h¢h¢g£f¤f¤f¢f¡ghkn qrpknknjljkkkkl~~~~~~~~~~~~~~~~}}~~~~~~~~|~}}{|q~nnonlg b]ZWRKIMOQSSPPPKLMNTVTTblnn}n~n}n}n|n|o|o|n|n}n}m}m}n}n|m|l}m~mmn~o~mlm~m~m~m~m~n}n}n}n}o|r|t}t}q}q~p}o|n}n}n}m}l}l~n}o}n}m}m~m~l~l~k~k}m}m|n|n}n}m~k~l}n}m}m|n}ooo~nnnr}q~z{skhgfjw}}}} } } } } }~~~~~~ ~|wo¡j¢j¢j¢j¡i¢g¡gjoy}~ s| ~u| y£m¥h£h¢g¢g¢g¥f¥f£e¡f hhlptpkohohmikjkil~~~~~~~~~~~~~}}~~~~~}~~}~}}}|x|onliif_XTRRMIGINQQQQRMIKLOPP[hlmm}m}m}m}l}m}n}n}n|n|n}m}n}n}o}o}n|o}p~q~p~p}o}n~n~no~o}n}n}n}n}n}o|q}s}t}r~p}o|m}l}m~m~l~k~l~m~m~n~n~n~n~n~l~k}l}m}m}m}m}m}l}l}mmmm}o|p}q}p}n~mnt}u|xngfgfjw |}~~}| |}}~~ ~~|wqh h¡i¡i¡h¡h¢h¡jkpz~ }zw| ~¢p¤i¤i£i¡h¢g¤f¤e£e¢e¡ghlpupipfohnimimhm~~~~~~~~~}}}~}~~~~~}~}~}|{{qlc ^^]\YUSROKGHPSQPQPMJJJLLP_illl~l}l~k~k}l}n}n}n|m|m|n|n|n}o}o}o}o}q}q}p|o|n|n}m~np~o~n}o}m~n~n~n~p}q}r~r~p}m}k}l~m~l~l~l}n}n}o}p}q}p}o}o}n|m}n}n~m~l~l~l~n}n}n}o~nnn|o|p}q}o}mnr~w| ukfeggjr{~~|}}~ ~~ ~}|zs¡m¢h¡f¡g¢i¢j¡j¢j¡kkpz~ ~ } v£k£i¢k¡i¡g¢g¢g¡g¡g¡h j km|pjqgohohohnhn~~~~~~~~}}}~~~~~~}~}~}~}}}{wg]WTSTVUSQOKIGJTSNKKKKJJJJUelmll~k~lll~n}n}n}n}m|m|m|m|m|n|n|o|o|p|p{o{n{n}n}o}p}o~n~m~m~n~n~n~m~m}o}p}p|o|n}m}m}l~j~j~km~o~o}p}p}o}m}l}l~m~m}n}m~m}m~m~n~nn~q|q}on}n}oqq~s|r}r~y{qiedgggmw|}~}}~ ~~ ~{zw n£j£i¢i¢j¢k£k¢k¡k kkpz~ q¡l¡k i¡h¢h¢g¡g h¡h i iinvrjqhngmgmim~~~~~~~~~~}~}|}~}~}~|{~i \WQNNOOOONKJIHOROJIJJJJJL]jmm~m~llmm~n~o}n}nnn}l}l|m|m|n|n|o|p|o|o|n|n|nlp}r|o~l~n~mmn~n~n~m~n}n}o}o}o}o}n}m~j~ikm~n}n}l~lm~l~kklmno}o|p}o~n~mnpo~onnoqss~u|u{|zoigfgggjs z|}}~~ ~}{{vo¢k¡k¡k¡j¡j¡i¡j¡j iox| v¡m¡j¡j¡j¢i¢h¡h¡g¡g¡g ggj plqhnglglim~~}~~~~~~~~~}||}~~~~}|~k^XRQOMKLLLLMLFJQPLJIIJJKQdjkl~m~nno~o~o~n~o}nnn}m}l}m}n}n}n}n}n}n}n}o}o}ljmn~m~k~n~nnn~n~n~n~m~m~m~m~n~n}n}n}kjlm}n|l}jjjkmnnn~o~omllnopooo~o~ooqrrt~u{~{rljhggghpw{~~~~ ~wso kk k¡k¡jimuz w¡l¢i¡i¡i i ii¡h¡h¡g¡hijonrgphmgmfn~}~~~~~}||||}~~~~}tbZVRRQOLJIJKLMIHOPLHHIKJLVfjkk~m~n~o~o~o~n~mn~nmn~m~l~k~m~n}o|o}n~o~p|o|n~lm~m~m~l~l~m~n~o}n}n}mmmm~m~m~m~n~n}m}k~kk~l}m}m}j~ln~l~lmn~o~n~nmkiknp~p~p}o~p}o}npr}stt~}|vmjhhhghlrx{}}~ ~{pm¡n¢l¡jijry} x m¢k£i¡g h i i h i i¡j¡kknzrkrinfofo~~~~~~~~~~~}||{{|}~}~vg_YSRPNKJKIHHIJJMOKHGJLKN]h jllm~n~n}m}m}m~m~mkln~m~km~r|o|n|n}n}n|n|n|n|n|o|p|p}o}p}p}o}o|n|m}lmmmmo~n}n|m}l~l}l}k~l~m~l}k}m|n|l|m~n~n~m~l~n~n~o~nmmn~p~n~non~nqs}s|tu}|rkhgghghjntwy |}~ wsok i iow| xm¡l£k¢g¡g¡g ghij k llnqmripgpin~~~~~~~~~}}||{|||{|~|~zuk `]YTPLJIGFFFKMNMJHIJKVdilmll~l}m}m~m}m}l~lmnokim}p|n}n|n|n|n|n}n}n|o|n|o|p|q|o}n}n~n~n~l~l~n~o~o~o~o}n}l}k}nn~mlll~ll~l~l~l~m~n~n~l~l~n~n~o}q|p}o|n|n|n}p~rqq~rs~t|uw~|qjhfggghjloqrwzz { ~ ~ ~ ~ ~~ ~xrnosy wj¡i¡j¢g¢f¡g¡g i j j jjjntluhqinjm~~~~~}~~~}}|||||{{||~~}}~qea^\YRMLJHFEKONLJHGHN_h klkjkkkkm~m~klnn~mkjm~l~m~m}m|m|l}k}k}m}n~n}n|o{p{o~ooon~o~o}q}q}r|p|n}m~llnponmm}k~km~lllmn~m~n}n~n~n~p}p}n}n~n}n}p~r~s}s|rsu~t~w}rkihhghikmmprsutuxyxyz| }||}~~wsv{ u j¡h¡h¡g g hk l¡l¡k¡jghmtlvirknlm~~}}~~~}|{{{{{||~|~}~{~oc]ZXWSONMKIGGMNKHGGISbfhi jjkmjjmnnnn~n}mmo~p}n}m~m~l~l~k}j~k~m}n}m}m}m|n}o~q~r~p}n}n}o}o}p|q|p|n}n}n~mnpn}mml~l}mmlmop}onm~mmnoml~lno}o~q~t}t|t}t~tt}v~{qkjijjklnopqsttsrssrruz }}}}}~~|yz| s k¡i¡g h iikm k j iilmrmtjrkplo~~}}~~~}|{zyyyz{{|~y~ob[YXZWTRPNLJHKKKJHHLXbdfhh hknmllno~n~n~m~lmp}q|nmmmmjjnq}n}m}m~n~o~p~p~p}p|o}n}o~o}o|o|p|p}o}n}moqn}m}o}o|o}nlmnpn~mm~n}nnnnn}m}mmn~p~s~w~v}v|v|v~v}x~zpkhgijkmnnnptttrpppnnu| ~~~~ }}~~~ |{} o i¢g¢e h h g i j¡j¡h¡fjmo sotkqlomo~~~}}}}~~}|{yxxxyzz{zwleefji` [XTQONLIJIGFN]dfhi hhjmoponnnn}l~klo}o}nnnmlkmo}o|n}m~m~n~n~o~o~p}p}p~p~p}p|p|p|p|p}o}n}m~n~po~o|p|p}n~l~m~n~no~l~m~n~n~oonno}q}q~op~q~s~t~u~v|w|x|y~y}xoigghijkmmlnpqpnmmllqw ~}}~~ ~~~ {z} xmj¡g£e¢f g ij l¢l¢j¡fjnosntlrkpjo~~~~}}}||}}~||yxxxxyz{{|unmnrqnj ieb^[VOKFCDRadfikjjl oqrsqnmllm~m~n~n~n~o~llno}o}n|m|n{o|o}l~m~n~p}q|p}p~q}q|o|o|o|o}o}o}n~n~n~o~o~n~mkk~m~o|o}oq~o}n~nnoo~m~m~o}r}s}r~q}q}r}r}u~u~x~y}x}x}vmhffhijlmnmnnnmlkjjls{ }|} ~~~}wx{~ r m k¡i¤f£f¡h jl m¡m ljjmnwrjshqgogo}}}|||}}~~}|yxxwwxyzz{~x~ropspnkihgfdb\TNBDVacfhjjjlnpqrqokjjmmllmmmopo}n}m}m~l}m}m~mp~o~op}o|p|q}q}p|o|o|o}p}o}o}o~n~o}lmmjk~o~q}p}q}r}p~nno}q~o~nn~o}q~r~q~q~r~q~r~t}uxx~x~v}yoigfghhjlmmmm nnmkkjlt ~~~||~ ~~vtvz| y¡q¡n¡m¢l¤i¢g i l¡m¡n mmljkotthsgphmim~}}||}}}}}}}{yxwvvwwwxzxsnnpn kjjkigeddb]NLZ`aegghikmoppponiimmjkllo}q|o}o}n}m~mklmmnp}p~o~o}o|p}q}q|p|o}m~n}o}o~o~n}n}kknn~o~ppoo}p}ommn~p}o~nnpqqq~qr~p~r}s}u~y~x}x}x}zqkhfegghijklmmnmllknx}~}|} ~~~xnquwy|} { t p¡n¡m¡o¢m¢j k l¡m¡n nmmmmptukrjnjlkl~~~}}||}}}~||{zyvuvvvwwwwx}tmkn oopp o midbcca\XZ^aefegjk moooonnllmmmnnno|o|m}m}m~mnlmnnoq}q|p}o}o~o~o~p~onno~o}p}p~o}p|n}kmp}p}pnmo|p|o~nmnn~n~nnpqq~r~s~q~qrt}u}w}x}w}z}{rkggefgggiklkkkkkkkq{}|}}~~~~~ {ppqrtvx{{} |up n¡n¡n¡o¡o¡n¡m lm¡l kkmonprslrlnkmkk~~}}}}}~~~}||{xustuvvvvwy~sln sssqppnk fccca^\Z\`cedgk lnpqpommnmkkmopp|n}l~lkln~p~o~o~p~q}q|p|o|p|n~n~n~m~nnnop}p}q}qpq|p{n}n}o~p~q~omp}p}o~nmno~nnoqqqqr~q~rsrt~u}w}y~{}zpjghggghhhhihiihhhiq| }|||}~~~~~}}~~uqpopprssx{} zwu qmk j m n n l¡k j j jijmmoqmskplmjngl~~~~~~~~~~}~}||xvttuuuvuuvmotttsqponlh dbcb_^\\]`abfj kmopqollnmjkmoppljjkm~o}o~op~nop|n|n|n|on}n|n}n}n~nn~n~n~n}ooo~p|p|p~oop~ononnllopoopoopppqqqqs~t}x||~|~ yojhgggghhghiiihgggip ~~~~||||}~~~}}|~}|{|~yp o nnnnoqsvy{}~~~}xtts q¡o¡l i kkj ihhikmnnnquuhsknlnjmhn~~~~}~~~~~}}|||||zwuttuutturnsurqponnnlhdbb``_][\]_`eh i lmnnmjjmnnonnopnmmoo~n~mo~omp~p|n|m}n}o}o}n}n|n|n~p~p~nnn}n~oo}o}o}n~mno~n~npnmlmqqqp~o~n~opppoopr~s}s}x}yz yokhfffggghhiihggghhn| ~|||~~~}|}|{z}~~ ypo n nnmnortvvy{{{|}|zz{{yvusqpp p¡o¡k jjjjiijmnnmnqnuhsknlmlmkm~~}}~~||||||||{wttsttsssp p srponnmll k igd_]_`^\[]_`dgh j jj k i g f jnqrnmppo~o}q}q}o~mmnno}q{o|m}l~n}o}o~mm~n}n~r~q~nn~n~nn}m|n}n}o}n~o~q}onnnmnprs~s~r~o}o}q~rqqq~q~qss~t~wxy~ yojhgghhhgghhghhhiijnx ~~}~~~~}}}|}~~~{sr p o mlmoqrtuwyyyxxyyxyxvuusqon n m kjj j jhhiknmmopoqlpknlmlmlm~}}~}|{||}}|||ywussttsrqoqrqponmk j jihhg_Z\^_^]_bcefefgggfeeh lqqpp~q}p|n}mmmmmnmn~n|o|n}mmn~q|p}mmm~mp~o}o~o~mlmlkl~m}n~oonnnnnop~pppon}p}q~rqrq~qqsstv~wz|wlhgghhhhgghhhijjkkmnsz~ ~ ~~~~~~}us p¡n¡mmmmnoqsstuuuvvwvwwvttrqoomlkkkk jiiilppq srrppmnmmnmmmmm~~~}}||{{|}}~}|{ywusrstsqn nqpppon k hhgggggea]]_`_acdddcccdcdefg knppp~q}p}ommmnnnmmm~mllmnr|q|p}onmno}o}nmmnmlll~n~nnmnnnnnp~nmmmmp~ppppqqqrsw{||tmiggghhhhhghhhhjklnosy} }~ {u r o o¡o¡n n nopqqqqrrrstuvvvtrqqppn mlmmkj jkkmnoqtvvltoppnpmpmpnoo~~}}}}||||||}}|||zxurqrsrpmn po o n l kifecdefggfdb`__`abccba``abefhk npooo~nmnoponnnmllllmoq~r}q}q~pnn~n~m~klonomlllm~n~oonmnnp~nmnnooopppqqqqx}vmihggihhhgfghiijl lnotx|{{|~~~~~ xt¡q n n n¡n¡m¡llnnnmmnoqrrstrqp ppqqp m kijji ijkmoqqrtpuntmqooooqoqpoq~~}|}}}|||||||||{{xutrrrqpnomllkjigfdccddffffd`]^`cdcb`__``cfghj oomonnnop~oonnonnmno}o}p~pp~q}r~p}m~nn~mlmnn~o}m~jkkkm~n}o~onoooo~pppqpopqqqqqu~ ~znjhgghggfffghiilmmnoqux{~zzz| {w| ~~ }~utr p o n¡m kifhjjjjjknopqrpn n¡ooq¡p¡n¡m jhikkijjloqqsttntnrmqmpmpoqpros~~}|}}||{||||||{{zxvussrqp nnlkihhgfdcccbbcccdca__aegfdbaabbceghi nnmoop}p~p~o~n~o~o~o~op~p~nn~n|n}no~p}q|q|o}m~nm~mmmnnmlkklmmn~m~nooopp~r~q~qppopqppqvsjihhefgggghkkjkkklnpuwy{xuyz ~wy{ ~}~ytrr q¡p¡o¡m¡k ihhhghijikl noonmnmnp¡m k m ljkmnlkjkmoqtquosorotqvsys{s}s~~~~~~}}}}}}{{{||||||{yxvutrrrqm l iihggedb``aabbaabccbbcdeffffffeccegh knmmnnnnmn~o}n~oppp~nnn~o~o~n~n}p|q{p}ommmmmmmllllmnop~p~ppppppqo~oo~mnpqopvvigihffghhhikmkjkkklnrvxxtty{|w{{ ~~}}~~~|wtqo o¢o¢o¡n¡l¡j jihgggijkk m m¡m m¡m¡m nmmn mln mjkmmklkkmnp|ssttvu{vvvvuu~~~~~~~}}}}}||||||||}}|zxvutrrrpljfeffeca`````aaabdgikljfehl nnmkgecdggknmmmmmmmn~n~n~pq~pnmop~p~n~no~p}r}p~nllnnnmmlmn~noop~p~q~rqopqqommo~opqqqt~~}~ uighhggghgghjjhijlllnpuxxwzzxxz{z~~|}~ wrqroo¡n¢m¡m¡l j h g hggffhjjlllkl m oomkk kkllkkmn mmlmnqszxz{zxwvuuvv~~~~~~~}}}}}|||||||||||{zywvusqq omifeedcb`_`aaaabcehjln po kjm qrrqnkkhfgi l nmmmnnnn~nlmp}p~omjlnn~m~o~ppqp~nmllmnnnmkln~oonkkmpnjnpnlmnoppppv~~}}~rjhgghgghgghhhijjklmnpruxz{}{|{|~{~~}~~xrmmmmmmlk j i g g¡g¡f effhijmmmkln n l j iijkkkklm mmmlmou}yz}|zwvwvuvv~~~~~~}}|||||{{{{{{z{zyyxxwusqq pnjfdddbaaaaaaaadgjl m n nnnm m orstsqnnmk j j k nnnmnoonolln~mnnlkmnnnoppp~nnnllmnqpllmmmljjlnkimpqqpnnoonnv~ ~~|nhgfffeefggghiijkklmmopswyyz{|}~~ |{vro lklnmlkk j hgg f fggjll kjkm m m k h iijlllkkoo n lmmnpw|}{y vvvvuuuu~~~}}|||||{{|{{{z{{zyyxwvutsq pnlfedcbbbccbabejkm mlklmmmnoprtutpnnmlll nonmmnnnqonnmlmnnnoomnop~n~mmomlnrspmllklmmmmmkkmnqqpoooooox~~~~ylhhfffedegggghhjjllmmnopuwwxyzz{{|}}|}~}zzzvrpmklmnn n l jiihffgghjkighj llkjkklmlkkkmoonoonrz{zwutsttutu~}||||}|{{{}|{zzyyyyxutttsr qnlgeecbbcccc`cjl l k i h g gijlmnnprtspmmlmmmoonllmop~p~nmmmlln~o~onmlop~o~n~npqmlptspmkkkmnoonnmmnopooooooopz~~ ~}zmkjiggfeeggggggijklllmooqtvxxzzyyyxxyyzz{zyyyyxsonkkl lmn m l jhihhggfghiiiihjkkkllkjjijjlmnnnoos|{xyxvtsssstu~}~~~||||||||{{}|zyxxyzyxvtssss rojgffdccccdbcln lj h g fff g hknnnpqrrpnmkklnomlkllno~nkmnnmlmnlkkmpqooppnllo~t~sommlmppoo~o~nnnnoonnnoopqrz~ ~ ~ wnmjjhgggggggggghhii jkklnoruwwyyxxwwwwxxyyyyyyxvrnlklm m m m m ljiiiiiihiiiijjiiijkkk kijhhilmnnoqr}wt{vyz yvuuuttt~~~~~~}}||||||{zyxwxyyxxxwuuttt oigffecccccfnqnlihi i i i h h knooopqqqomk j kmokj knlkkkknoonlkkkjklnomopommnp~r~rnmmnnqq~o~o~o~onmmnoon~moqssuz}||~ vnlijhgggfffffhhhhgffghjmopqtvvvvvvvvvvwwxyxxwtsqnlllmll¡l¡l jiijjihhjlkhhijjhhh j iijlkjklmoqqqqxq{u{y~{|{xuuuutt~~~~~~~~~}|||~{x w xxvwxyxxxxxwvutoigffedddcemtrnlkkkklk j i k mmmlmnoppnl j j mpl kmolkklmnonmkkllllllmnonnoonor~q~o~nnnnoq~q~q~p~poonnno~o~o~rtuvvwz}yy{} slkjihggffeefffggghggfghjmmoruvuvvutttuwxxxxwsolm mlmmmkkkjh f ghiiihklkihhjjhhh i hiklllmpqrrqqtuzqzwyz{ zzxvuuutu~~~~}}}~~~~~|~~z wwxxwwxxxxwwxwuut ojggfdcddcit tpnl k k k kkj i i j kkj ii k nooolj j lqo m nnkjklmnnmlkllmmlmnoopooo~oooo~p~p~n~m~lmnpp~p}p}pponnmnqs~u}u~vyzy~yzyz} xljihhhhhhgfffffgggiiijklmmmnoqttttsssstvwvvuq mifhikmnmmllll ihikkkjjkjgh h hghiihhijjjjknoppopyrtzvyxxxwxwxwvuu~~~~~~~}}}}}~~~~~~~~~{y yxxxxxxyxwwxwvus okiigdbcdent spn m k j j j j i h hghi jii jmopplj k mro m nnkjkkmooonopqqqommonmpp}o~pqooooomlnoono~p~ppponnnp~s}t}t}twy~zzz{} ~{pjjigghhhhhgggiklllmmnoooqqppooopqqppqqqqrttqmjihhil mkkmmmn m kijmlkkkjiijiighiihiijjjjkmmmoqu}rsw~xxvvuvyyxx|~~~~~~~~}}~~~~~~~}|v xyyxxyyyyxwwvuusomlhgdccbipp poo n l k k k k i hgghiiij kmooonlmorn lm nmmmmnooomptuutrommllop~o~oqopo~o~nlkmmmnp~p~pqqppopr~t~t}t}s~s~t}v}w~x{}yukhiihghhhhhjloonpqqrrrrqrstssqppppponnmmlostpoppommn¡n¡kkll l kkkjjlljijiijjlljjjihhjlmmnonlmpsyvqtwxvvuuy| }~~~~~~}~~}~}w xzyyyzzzyxxvvuuspnmjhfdbajpp n m n n l k k l k i ggffhhik mnnnnmm n osol klnoponnnmknsutrqpnmlmmnoppponnljkllmonnnop~p~p}prst~t~t~s}s}s}u|u}w~|}zwqliihhhhhhikorsrrtuuuttutsstttsrrrrqpnlkkjknpoopq p nkl m¡mlmlllkkkjllkjjjiijllkijjijkmooqqonnqu ||wtrsuwvvz~~~~~~~~~}}|zyzyyzzzyxwvwvus p mkkkgdaahlnnn mm kjj j i g fedddfgj m n nnnnmmospmkloppponnmklrsqpoomkjllnopppnlmlkmmmmmmmmmo~q}r}r}r~s~t~u~u~u~u}u}w}w~y~}~{wtqnkjihhggjnoqtuuuuvvvvuutssttuusrrsrqonnomlllmoom m llm n nmmllllllkkklmkkjjjiiiijkjjlnpppoonotz}xxwuttuvz ~~~~~}{zz{{zzxwwwxvus r olljgdbcgiklm l kjihhggedccddegik mmmlklmppml mnonoonllkmqrpooonlklllmn~ooonllkklmmnppppq~s}u}t}t~u~w~y}y}y}y}z~{~{{~zuspnmkkjhhioqrstuuuuuvvvuutttuuuutqqrrrqqrrsrplmolhjkkl k k k lmmmmnmlkjjkjjkkjihhhijjklmnonoopqvzxxywvutx|z~~}||}|{{{zyyxwwwwvussqnmifecdfhiklk iihgfedcbaabcdfgij k kjjkmprnl m m mlnpomlklnonoonnnmmkjlopoonmllllmpuvvu~u~u~u}w|w}w~x}y|y}z}z~{~|~}~||}xtronmlkkjjmqrtuuuuvvvvutttuttuuvutsrrrqqrttttsrnlijkkij j i i jlnnnmml k j jkjjihjkjiiijmonmmnoqqpuz~zyxxwwwwz}xv~~~}||||{{{yyy xw wwvuutsqonjfdcdgghiiihhgedcba`__`abdgggghii j m ptp l llmmnoonnlkkmmopopponmlmppppmlmnnortyyyyyx}w|x|w}v~v}v|v~vwz~{}||{}}~|wrpnnmljjloprtuuuuuvvvvuuuuuuuuvvuuusrrrqrtuuuuvspnnlj hk l lk j klmnmmlk k jjjiiijllkkjjlmmllmpqppv { zyxxxwwxz{}~|xvx~}}~~~~}}||{zzyxx xwwv vvusrrq onkgccdfgggfggfdbbb`_^^^_`adffffeghjl osq o nmmoonnnonmlmmopqrrqpnmmnorsrpopstutvvvuv~v}u|t|s|s}s}s}s}r}s}u}w|y|z||~zuonnmlkmnoprstvuuuuuuuvvuuvvuuuvuuuutsssttsuuuuuutsrojhm m mlllmnnnmjklljjiijjklklkjjjkllnoomnx{zyyxxxyzzzzytvy{~~~~~~~~}}|{zxyxw w w wvu u vu q q p p oqnhddefggfeedca`a`_^]]^__adfffeeggikmqpo nnnoponnopommnopqrrrpnnnnoqsuuttuuusss~s}r~s}s}s}q}q|q}q}r}r}q~q~r}s~u~x}{}ytomlllmoqrrrsuvvvvvuuuuvvvvvuuuvuuuuutttttttttttutssrommkkm noponnmkjkjikjjjkjkkkjjkllllmonnpy|{zyyzz{{zyzvpt{~~~~~~~}}|{yxxxw w v vvu u usrrqqptrlgeefffedbba`___^]^]]^^_bcccccddgiko on ooooqppopponnnooppqqnnnnooopqsuvuu~u~s~s|t|t|s}r}r~q~p~p~p~p}p}p~oqr~tu~w}y}xqkkkklnqtvutuuuvvvvvvvvvvvwvuuuvvvvvvuuuuuuuuuuvvvuuttspnmoqqponnn ljiiijjjkk j i i i iijkkkkossvw|{|zyxyzzzzyzxsrv{ ~~}~~~~~}}|zxxwvv vuuvv utsqrqpqt uqkhfeefecbb`___^]\^]\]]^_aa`abcdfhko pnprssrqpooonnmnnoooponnmmnoppoqss~s~s~s~s}r}q}qpo~o~p~p~ooo~o~po~q~s~t~t~v~w~wmjjlllquvwwvvvuvvvwwvvuuuuuvuuuwvvvvvuuuuuuuuuuvwwvuuuutsrrsqopon ml jkjihijkkjhhiiijllmpwz|~zzyyyzzzzzzyyxtrt ~~~}}}~~~~~}~~}|{yywv uuuuuu utrqpopqt wvojgffffedcb```_^^^]]]_^^___`acdfhjn pqrstssqponnmmmnnnnnmmmmmmmoqrrrpoo~pppoonnm~n~n~n~n~n~noqr~s~t~u~u~u~w~wmjmmmmrwyyxwwvvuvvvvvvvvvvvvvvvvvvuuvuuuuuuuuuuvvvusttuuuttspoq p m kk k kihhijjkkjjijjjkovz zyxxzzzzzzzzzyxwu~~~~~~~~}||~~~}|{ywv v vuuuuu ttsrppqs uxwtnhgfffefddcba`____^^_^^^___`bdffhmqrssrrrqpnnnmnnnnonmllmmmmnortusoopooooonn~n~n~n~oon~n~o~p~q~r~s}t~uvv~yolnnmnswzzywwwvwvvvvuvvvuvuvvvvvvuuvvvvuuuuvvuuuvvurstuuuuutsrq m jijj ighjjjkllkj hkmlkt} |xyyzzzzzzzzzzyyz~~{{ ~~|zwuu wwvuuutssrqprtvwwwvrmkhgfefffedca`````a`_^_aabbdefeelr uutrrqponnnnnmnoponmnnnnnoqtuuploo~oopmm~n~o~n~nnooo~o~o~nopqqrtt}qllmlmswy{zwwwvwwvvvvuuvuuuuvvuuuvvwwvvvvvvvvvvvvvutuuuuutttuspmigiihhijjiijkk j hjlmlv{zyyzzzzzzzzyxyy~~~~~}{~~}}{yvvv uuutuutssrqruw xxxxxupkigfffffedbbabbbbbba`abcccdefffks wxwvutrpommmmmnnonnnopppqstuutnlop~pppmknp}p~onnnoonnnooppps|rkjlkkrwz|{ywvwxwvvvwvuuvvvuvvuuvvvwwvvwwwxwvvwwwwvvvuutttuuwvstqmjihihiiiiijllkklllt}{yyyzzz{{zzxwwx~~~|}}||{ywwvtsstuutsss r t v w w yyyyyskhgfdefeedbbbcccccbccaabbcdefgglr wyyzzzxvtrqqpponmnnopppsvwut}t}rqpqq~pnmnmonnooomllmnnooppos|qijllnuy{|{zxwwwvvvvwwvvvvvvvvvvvwwvvwwwwxxxvvxxvuuuuuuuuuvvwvvyzumjh ghiiiijjjkkklmnv~|zyyzzzzzzyyxxy~~~~~ }~|}~}{{zyxwvutsstssttt tuvw x yyyyywpigfdcccccbabccccdddcbabceffghilpu wy{{{zyyxwvuvusppqqrstxxvrr~rpqq~q~r~pmlllmmmmmmmllmnnopnoru}}sljklouy{{{zyxxwwvvvwwxxwwvvvvvvvvvvvvwxxxxwwvvwutttttuuuuuuvvwx{xrm i¡gikihhjjkkkljjpw}{z{zzzzyxyywwx~ }~ ~~ ~~~~|~}|{zxwvvvtsssssttu uvvwxzzyyyzumhfdbbccddddefedefecbccdfhhhhijmo twy{yyyyxxyyyzyxwwwxzz|yspqqoop~pponmkkkklkjjlklmnopqprtvy~xqnkkpvyz{{{zzyyxwvwwxxwwwwwwwwvvvvvuuvwwwwvvwwwvuuuuuutuuvuvvuuwwvsm ikjihiijklmnjkrz~|||{zzyyyyywww ~}}~ ~ ~~~}~ | ~}~~~|zxwv v vuutttttuuu u v vwxzzyyxytniecdcccddddefdcdedcbcdfghgghijjkq wyzzyyz{zyyz{||||||}~~ysppppqonmnmlkkllkjjklklnqqopstuuw{vrmjqwyz{{{{zzzyxwwxxxwwwwxwwvvwxwvvuvvvvwvvwwwvvvvuvwvuvxvvutvvwxztlkkjjjjjjkkkjow~~}|{{{{zyyyxxxww ~~~~~ ~~ ~ ~}{~~~}~}{ywv v vuuttuuuuuuuv v w xxyyzzxvr okgffeba`aaccccccdcbbcefgffghhhhhpy|||{{|||{z{||}}}}}}}}xrpppoppnmllmllmmllmn~opooqqmostuuw|{vqmrxz{{|||{{{{{zyyyywwwwwwwwwyyywwwvvwwwwwwwwvvwvvxyxwwwvuvwwxxyxwplllkkklmmllmsz }|{yyz{zzyxxxxxx ~ } ~{ } } } ~|{~~}~~|zvv vvutstuuuuuuuv w w yyzzyxvt qnkheedb`__`bccdeedcbbcdeeeehfdeggo x {|{{{{zzzyzz{|{{{|}}{xsrqomponlmnnnnn~nmmnqrponponoqrtuvzysqtwz{||||||||||{{zzzyxxxwwxyyyxwwwwwxxxxxwwwvvwxxyyyyxxxvwyyyyyyyxrpommmoonnmnrz }{zyyz{{zxxyyyy }xz}~|~}{y}}~~~}{yvv vvvutuuuuutuuv w wyyzzyv rpmljigeca`__`bbdfgfecbcddeddefb_begl u y zzzyyyyyyyyzzyyyz{{zxuspooplkm nnmoq~q}o~llnppnnnpppqqrtuw{~|tswxyz{|||| }}||||||{zzyyywwxxxwwvwwwyyywwwwwwwwxyyzzyyxxzxxyyyyzzyzxtqnnppnmmklow~ {yxyyzyyyyyyyy }yy{~|| ~{zz}~ ~~~{yw v vvvvuuuuuuutuuv w x y z zz x tpnkkjkjga][]```bcceffdbcefedddc`_adfjs w zyxx y zyyyy x x x wwwxyyywtoooqmjjmooonoo}n~mnnmnnnoqstuuuvvy||xsy{{zz{|||}}|||{||{zzzyyyxxxwwwvwwxyxxxwwwvwxxyyzzyyyxxyxxxxxyyyyyyxrnmoonnmlmqw~}zxyyyyyyyxyyyz ~~ |{{}~} |{y{~~~~}zw v vuuutsstuutstuv wxx y y y x uqmkjjijjgb]Z[^`bbcccefdcdhhgffb__acefhp uwx w v v w w x w wvvvv v w w xx x wr nnopnlllnoomno~o~oonmlmnotwyyxxxwz|||w| ~ }|{{||||{|||{{{{zzzzyyyyxyxxyxxxwwxxxxxxxxxxyzzyyyyzzyxyzyyyxxxyztnmmmnonnotz~~|{zxxxxyyyyyyyz ~ }||~~~}| }|yz}~~}~~}}zw vuuuutssstssstvw w x x y y y vrnkjijjkjhf_ZY[]`aabceedefiiigd^[^bdehjp tuv v uuvvv vvvww x x w w xxxxuo lnnnkllmnmmno~nnnnmmmnquwyyyyz{}}}~ ~{~~|{{{{|||{zzzz{{{{zyyyyyyyyxxxxxxxxxyyxxxyzzyxxyyzzzz{{yyyxxxxyysnmlnlmnpsz~}}|{{{yyzzzzyzyyy ~}}}}~~{yz}~}~~}}}}~~}|zx wvuuuuuussttuuvxx xxxyxupljiijkkjjhc^ZZZ\_adfghhgfgggeb^\\`dfilpu u vv vvvv v v x y yzzyxxzzzz wrnmnmkmppomnnmkmnnnnnprttuwxyz{{{|~~ }{{{{|||{zzzz{{{{zzyyyyyyxxyyyyxxxyyzyxyzzyyxxyyzzzz{zyyzyyyxxxzvmknmoruvw| ~|||z{{{|zzzzzzyzyyy ~~~ |zz} }}}}}}~~|{y xwvvvvwvuuttuuvwxy yyyzxsnkjiijjjjihfb\[[\^aehhigdaabbaa_^^_dhjmp suw x x wvww x z zzyzyyyzzzzxu qnnlmqtrommmml nnnnopqrsstuwyy{{z|~} ~|{{||}}{{{z{{{{zzyyxyyyxxyyyyyxyyzz{{zyyyxxyyyyyxyzzzyyyzyxx{{qjlnqsuwvwz}~~~zzzyyyzzzyyxwxyyyxx~}{}|z{|~~~}~~~~|y wvwwwwwwvuuuuuuwwx y y z { { uqmljiijiiihhfc\Z\\\]`bca_]\]^___^^^^bgjmpsvvwxxwwwxyyxxxxyyyyyyy y vrnjk pqqqonll nnnnoqrssttuvwzy{| | }}||~ }|}~~~~}|{{{{{zyxxyyzzyyxxxyyyyyzzzzyyxxxxyyyyzyxyyyxxxzzyz~{tnnprsssuvxyxwz| xyxxxwwwwxwwwxzyxww}}~|yzz |}~~~~~}{ wwvvxwvvvuuuuvuuwww xx y z y uqmljjkkjjiiihe\[\\\^abb_]\[[]][\]^^_adinptwwwwwxxxxxxxxwwwwwwwwwxwuronnorrqonnnmnnnruwvvuvwy{y{||~}}}|||~}}~ ~}|{{zzxxyyzzyxyyyxyyyyyzzyyyyyyyzzzyyyyyxyyyyyzz{|}}|xrrssssrtvxyww{} zyyxwwwvwxxxxyzzxxx~~}~}}~~~}{z y xwwwvuuuuuuvvvuuvvww w y y x uqmljjjjiihhiieZZ^^\]`ba_^\\\[ZZ[]^^_acinptwxwvvwwwwwwwwwwwvvvvvvwvuvwwt q rpn n ooommnptx zyw v wy{ | z{{| |{{{{{|} ~~ }}{{zyyyxyyxxxyyyyyyyyyzyyyyzzzzzzyyzzyyyyzz{||{|{|zsrsrssstuvwxx}| {yyxxxxwxxyxxyyxwwx~~~~}{z xwwxwvuuutuuvwwvvwwwwxxyyx upljjkjiggghjkcZ[]]\\]^^^\[Z[[[[\]_^^bdhlptvvvvvvvvvvvvwwwwxxwvvuuuuuwxxtq mkl lmnoprtw yyx wxy z z { { { z{}} |{zzzz|~~ ~}||{zyxxxxxxxxxwxyyyyz{{zz{{{{zzzz{{zyz{{|||{{{zz}trtsrrtuuuvvwzzyyyyyxwwxxxxxxwvvw ~~~~ ~}|{ zxwvwwvuvuuvvwxxwwxxxxxz {z yuojhijiigghjklcZ[[\\]\\\[ZXXWXZ[\]]]]`bekquvvvvvvvvvvvvwwwxxwwvvuuuuuuuvvuronmnortvvw x x x yz{ { z { zyzz{{{{{zz{|~~~ ~}||{zyyxxxxxxwxyyyyz{{{{||}}|{{z||{{||{{{zzzzz{~ursrqqsuvwwvz {yyzzyzzxwwxxyyxwwvuu ~ ~ ~ ~~~~~~ ~}|{ z ywvxxxvvuuuwxyxwwwyyyxyz y xuoihhhhihijjjkd\Z[\]]]\\ZYXXWXY\]\]^_`aekqtuvvvvwwvvvvvvwxxxwwvvvvvwwvvwxwussrrrstvwxyz{yyzzzzyyyzz{{{|}}}}}}|~ ~}||{{zyyyyyxxyyyyyz{|||||}~}||{||||||{{{{zzz{{}}yrrqopsuvxwx~ {zzzzzzyywvwxyyyyxwvu ~~~~~~~ ~}{z zzyxwxywttuutvxyxvvwxxxxxx x wtnihhhhijklmmjc]]\\[WWXXXYY[ZYZ[]\\]^``diptvvvvvvvvuuuvvvwwwwwvvvwwwwwwwwxwvvwvvvvwyzzzzyyyxyyzzyyyz|~~|{{|~ ~}{{{{zzzyyyyyyyzz{|||}}}}}||||}}||||{zzzz{|}}~|urppqsuvwwz}{zz{{{{zyxwwxxxxxwwww ~~ ~~~}}|{ zyyyyyyxvsstvvvvwwvvvwwwvvwvupiggggiikklnmhb^]ZXVTSSSTUWZYZ[\]\\]]]_bfnsuvwxxwwvvuuvwvvvvwwwwwwxxxxwvwwwwxxxxxxy y yyyyyxxxxyzzzyyx}~}|{zz}~~ }{{{{|||zyyzzzz{{||||}}}}}||||||||}}|{zz{|}}}vsqqrtuvwx|{zzz{{{zzzxwwwwwwxxxxx ~~~~~~~~ ~}~~||{ {zyyyyyywutuwywutuvvuuuuuuuutrmffhggiijjkmkd^YWUSRSRSTSRSUVWY[\]^__^_adkrtuttuvvvuuuvwvvvvwwwwwwwwwvvvwwvvwwwvvwxxxxxxxxxxxyzzzzyxz}~}||{z{}~~}~ ~}}}}}}}|z{{{{||||||||||}}|||||||}}}||}}}|{|}wtqqrtutvx} {zzzzzzzyyxxxxwvvwxxxx} ~}~~~}~~}}~~~~}| {{zxyzz zyvuuwxyzxvuuvvvvvvutuutqmhgihhhijjjke\WTSSPRRQRTTRQRQQUY\^__``aadjnid`_aenutuvwwwvvvxxxxwvvvvuvwxwvwxwwvvvwwxxxxxxxxxyzzzzzyz||{zyz{|}|~ ~~}}}}}}||||}||||||||||||}|}}}}}}}}}}}~~}|{} wsrrstutvy}|{zzzzzzzzyyyxxxxwvvw ~~ ~ ~ ~ ~ ~ ~ } ~~~}}~~}|| | zyzywwyz zwuuvxyzzzyxxwwvvwwvuuvtqnigfffghjkjh\USQRRPRTTSRSRQRRRTX\^_^^_abdd[VUSRSWakppqtvvuvwxxxwvvvwwvwxxwwxyyxwwwwxxxxxxxyyyyyyyzzz{{ywwwyz|}|yy| ~}~~~}}}}}}}|||||||}}}}}}}}~~~}|||}}~~}~}}wuuuuuutvz~||{zzzzzzz{zyxwxyyxwwx}~~~~~~~ ~~ ~ ~ ~~ ~~~~ ~ ~} } ||} ~~~~}| ||zzyyxvuwwwvuuvxxyyxxxxwvuuuvuuuuusokgeedegijh`XSTSRRRSVUSSRRRSTSSY]__\\^`a^YSRRRSUXY\]^aiquvvwwwvvvwxxxxxxxxxyyzyxwxyxyyyyxyyyyyyyyyyyzzxwxwwxzyyzz|~ ~ ~~~}}}}|||}}}}}~~~~~~}}}~~~~~~~~~xvxwvuvtw}}|{{ {{{{{{zzzyyxyyzzyyy~~~}|} ~ } } }}}} ~ ~ ~ } } } } }}~ }}}} }~~~~}}}|| ||zzzywvvuuuvvvwxwwvvvwwvuutstuvvvvvsnhedbcggb]WTSUUSRRSSRRRRRSTTSSY^^][\\YTPPRTRSUWWWUTUW[cpwwwwwvvwxxyxyyyyyyyzzyxyzzyyzyyyyyxxxxxyyyyzzyxxwwxyxz|~ ~~~~~~~~}}}~~~~~~~}}~~}}~~~~}vtxxwxwuy~||zzz{|{{{zzzzzyyyyzzyx~~~} |}~ ~}}|||}~~~ ~ ~ ~}}}}~ ~}}}} ~ ~~~~} ~~~~~~~~}}} } |{zzyyxxwvwvvvwwwwwwvuuuuuuttsstuwwwvvtmgfeaafc]ZVUSSRQPPQQPQQRQQSTTTW[[Z[\XUPPSUUSSTUUUUVZVTYfvwxwwvvxxxxxxxyyyyyzyxxyyyyzzyyxyyyyyyyyzzz{zyyyxyz{{|~ ~ }}~~ ~~~~~~~~~~~~}}|}~~~~~~wtwxyxwx}}||zzz{{zyzz{zyxyzzyyyyy~}~ ~ }}|||}}} ~ ~ ~ ~}}||{|} ~ ~~}} ~ ~ ~ ~~~~}~~~~~} } }}| | }} } } } |zwvwxxwvwvvvvwwvuttuttttssssrsstvwwwvvtnihfcbdcb`ZVTRRSQPPRSSRRRSTUVWXZZ[\[YXUTVUUTSTUVWWWYXTV_pzyxwwwxxxxxxxxyyyyyxxwxxyyyyzzyyzzyyyyzz{{{zyyyxxxzz|~}||||}~ ~~~~ ~~~~~~~~~}wvvyzxz}~||||{{zz{zz{zzyyz{zyyyyy~ ~ ~ ~ ~ ~ ~ } | |}~}|}~~~}}|||{|}} ~ ~ ~ ~ ~~~}}~ ~ } }}~ ~ } }}} }||||||| {xvvwwwvvwwwvuutssrssrrtsqqrrrsrsuvvvvvtqlihggfbbb[XVTSTTSRTUTSTSUVWYYXZ\]][ZWTRRSRSSTUVVVVUUVW\kwxwxxxxxxxyyyyyyyyyyyxyyyyyyzzzzyyzzzzzzzyyyyyyyyxxxzzz{{||}}~~~~~~ zxwxy{|~ ~| ||||{zz{{{{zyzzz{{zyxxxx~}}} } ~ ~ ~ } } | |||{{||}}||||||{{||} ~ }}}~~ ~ } } }}}} } } }}}}} ||{||||||||{{z{{xuuvvvvwxxwvuurrrqrrrrsrqpqqrsrstuuuvvuuqmkjigaba\YYXWXWVTTTTSTUVUVXXVY[]][ZYWSRRSSTTTTTSSSTVX[juvuwxxwwwxxxxwxxxxyxxxxxxxyxxxyyzzzzzzzyyxxyyyyyyxxyyyxxyyz{{|}~~}}}~ {wxy{||}}}||||{zz{{{zzyzzz{zzyxxxw~~} ~ }}}}}}}|{|||{|||{{{{||||{|||||}}}|{{{{||}}}}||{{zz{zzzzzzyyzxtuvwvwwxxwvutsssrrrqqrqpqqpqsttuuuuvwvuspmkjhccb]XZ\[ZZXVVUTSWWUUWWWWY\^^\YZYVUTUUUUUWVTRTUWX]muvvwwwwvwxxxwwwxxxxwwwxwwvxxwwxyyyyzzzzyxxyyzyxxxwxzzxvwxxyyyy{||}}||||} }~ ~ |yxy|}~}~| ||||{{{|{zzyyzzyyyyyyyyyx~}}}}}}~~}||{|||||||||}{zz{|||||}|||{{{{{{|||||zzzyxwwvtuuvwvuuuwwwvvwwvutssssssrrrrqqrqpqstuuvuvvvwvtqpnmlhdda[ZZ[YYYXXWWWXYVXZXWXZ^ab]WWYXWWWVVVVXWUUWXZ[apwwwwwwxwwxxxyyxxxxxwwwyxwwwxxxyyyxyzzzzzzzzzzzyyxxxzzxwxxyyyyyz{||}}}}|}} ~}} ~{z{}~~|} |||zy{{{zyyyyzzxwwwxyyyyx ~ ~}}~~~}|||||||||}|||{yyz{|||||||}||{zzzz{|{zyyxwvuvtrrsuvuuvwyyxvuuuutstsrqrrrqpqqqrqqqstuuuuvvvwvuutrpnkged^XX[ZYYXYYYXXYYZZXX[\`cea[XXYYYZYYYYYWWXZ[[]fsvxxxxxxxxxxwxyyyyyyyxxxxxxwwyyzzyyzzzzzz{{zzzzzzzzyzzyyzyxxyyz{||{|{|}~}|||}}~ ~~~ }||}}~{{|||{zy{zyyyzzz{{zxwxyzz{zy ~|{{{{|||||||||||{{{zyyyzz{{||||||{zzzyyyzyxxwwwvuwwvutuvuuvxxxwvutttstutsqrsssrrrrqrqrsuuuvuuvvvvwwvtqonkhf`YXZ[ZYYZZYYYYZ[ZZ[\^bdfib[XYZ[[ZYYZYXWXZ\[^muuxyyyyxxxxxwwxyyxxxyxwwwxxwwxyxyyyyyyy{{{{zzz{z{{{zzzzzzzyxyzz{||{zz{|~}|{|}}~~~~~~~~~~~~}}~{zz{{||{{{{{{zz{{|||zyyyzzzzy ~|{{zz{{{|||||{zzzzzzzyyyyzz{{{{||{zyyyyxxxxvvvvuuwyxwvuuttuuuuuuutttttuutsssssrrrrrrqrrtuuvvuuuvvvvvutrqnifb\XXY[\ZYZZZZZ[\Z[]^adfjnjbYXZ\\ZYYZYYYZ[[Zcruvwwxxxwxxxxwwwwxxwwwwwwwwxwwwwxxxxyxxy{{zzzzz{z{{{{zz{zzzzyzzz{||zzzzz{|||}~~~~}~~~}}|}~ ~~}}~ ~}|{{{{{|||{{{{{zyyz|||zzyyyyyyy }{zzzzz{|||||{zyyzzzzyyyyzz{{{{||{zyyxxwwwwvvvvvwwxwvvvuttuuttttuuvvvuuuttsrrrrqrrssttttuvwvuuuvvuuuuutsokge_[YZ\][YYYXX[]\Z]acceglqpg[XYZZYYYYZ[\]^]^jsuvvwwxxxxxwwwvvwwwwvvvvwwwwwwxxyyxxyyxwxyyyzzyyyyzzzyyzzzzzz{zzz{{{zzzzzz{|}~~~}||}}||||}~~ ~}}~~~}~~~ } ||||{{|||{{zyy{zz{||{zzyyyyxxx ~ } {|{{z{|{{zz{{zyy{{zzzyzzz{{{{{{{zyxxxxwwvvwxwvwvvutttvvuuuuttttuuvvvuuuuttsssssrrqstuuuvvvuuuuuuuuuutsrpnlhc\XZZZZZXXXZ\\[Z_egghimrqlb[YZYYYZZ[\]__[bptuvwwwwwxxwwwwvwxxxxwwwwwwwwxxxyzzyyyyxxxyyyzyyxxxxyyyyxyyyzzzzzzz{zzz{{{{{{{||}||||}}}}||||~~~}~~~}}|{~~}|||} ~|||||{z{{{{|{z{|||||||{zyyyxxxx ~~|{{{{{{z{{zyyzz{{zzzzzzzzzzzyyxyxxwwwvvvwxwvvutrqsuvvuttttututtuuuuuuuuuttsssrqstuuuvvvuuuutuuuutsrqpomie_XWXYZZYYY[\[YX_eghllnppoh_YYYY[\[[]^_^[euvvwwxwwwvwwwwwwwxxxxxxxxwwwwxxxyyyyyyyyyyyzzzyyxxxyyyyxxyyyzzzzzzzzzzz{{{{{{{{{{{{|}}~~}||||}}}}}~}|||{z|||||}~ }{{||{zzz{{|{zz{||||||{zyyxxwwxx ~ }|||{zzyzzyyyyyzzyywxyzyzzyyxwvvwwwvvvvwxxwvuutsrrsuuuttttuuutttuuutttttttssssstuuuuuvvvuuuuuuvuttqponnlgc[XXY[[WVYZZZXX_filnponnokb[ZZZ[\\\]^^]]kuvvvwwwwwvwwxxwwxxxwwwwwwwwwwxxxxxyyyyyyyyyzzzzyyyyzzzyyyyyyyyzzyyyyzzz{{{{{{{zzz{||}}}}}||||}}}}||}}||||||~}|{|}}||zz||{zzz{{|{zz{{{zyzzzyyzywwxxw ~ ~} } } ~~~}||{zyxxyyyyyxwwwvwxyyyxwvuuutuvvwwwwwxxwuuuuutsttuutuuutttsstuutssssstttssttuvuvvvvvvvuuuvuvwvvsqonoolaZZZZ[\ZYZ[[ZWYdmpqppoooqmc\[[[[[[\\]]\apvvvvvvvvvwwxxwvvwxxxxxxxxxxxxxxxxxyyyyyyzzzzzzzzzzzzzzzzzzzyyyyyyyyyzzzz{{{{zzzz{|||{{{zz{{||||}||}}}~}||||||||{zz{{|{|zz|}|{{{{{{{{{zyyxxxxyyxyyxxxwv~ ~~}}}} ~~}}|||zxwwxxyxwuvwxxwwwvvvuuvvvwxwvwwvvvvvuttuttssststuutttsssuuuussssttuuuuuuuvvvvxxvvvvuvvvvwwvvsrqqrqg][Z\]\[\]^][YZcnppqpoooqod[Z[[[ZZZ[\\]fsvvvvvwwvvwwxxxxxxxxxyxxxxxxyyxxxxzyyyyyzz{{{{{{{{zzzyzzzyzzzzyyyzyyyyzzzzzzzzzz{{{|||{{zzyz{{{|||||||||zy{zyz{{{z{zz|~}{{{{{{|{z{{{{|||{z{zxxxxxxxxxxxwwv~ ~ ~ ~~~ ~ ~~~~~~~~~}}|||{zyvwxxxwvvxzxvustvwvvvvvwxwvvvvvutttsstttuuuuuuttttutstuuuuutttttuvwwvvuuuvvxxvvuuuvvvvvwvwwvuvvwufZY]]\ZZ]^^][Z]gnqrssrrrm`XWYZZZZZ[\]_ltvvvvvwwwwwwxyzyxxxxyyyyyyyyyyyyyyzyyyxyz{zzzz{{{{zzzyyzzzz{{{zzzyyyyy{zzyyzz{{{zzz{{||{zzz{{|||||{{{{{{zyzz{|}|{z|{zz{{{{{{{zyxxyyyz{{{{{|{zxxxxxxxxxwwvv}}~ } }~~~ ~~}}}}}}~~}}~ ~ ~ ~}}|{{{{vuvxxwwvw{yustuvvutttuvvvuvvuuutssrrsttuuuuvvutttuttuuuuuvuuutuvvwxwvvuuuvwwvvuuvvvvvvvvwwwwwwxwm_YZ\[YYZ\]\ZYZeortvuuuthXTUXZYYYZ[[[cqtuvvvvvwwxxwwxyxwwxxxxwxyyyyyyyyyyyyyyyyzzzyyz{{{{zzzzzz{{{{{zzzzzzzzz{|{zzzz{|{zzzz{{{zyz{{||||{z{{{{{{{||||}}|{{||{zzzzzzzzzyyyyyyyyzzzz{{zxwxxxxxxwwwvv~}|}} | } } ~~~~~}|||}}~~ ~}|||{|}xvvwxvwxxzxvtuuuuttttuvvvuuuuuuvvututttsstuuuuuuutttuvuutuuuuuvwwvwxwwvuuvwwvwvvwwwwwvvvwwwvvuuvreYWZ\ZYYZ[ZWUXeprtvuuusgXVWYYYYY[\[\dqtuuuuuvvwxyxwxxwwxyxwwwwxyyyxxxxyyyyyxxxyyyyyz{{{{{{{{{{{{{zzzyzz{yzz{{|{zzz{{{{{{z{{zzzyyzz{{{{zz{{{{zz{{{zzzzzyyz{zzzzzzzzzzyyzzyyzzyyyyzzzyxxyyyyxwvwww}|{|} | |}~~~}}}}}}}~}zyz{}zxwvvvvvwxxxvuttuuuuuttuvwvuvuvvvustuutttttuuuvvutttuuuuuuuuuuuuvvwwwwwvuvvvvuvvvvwwwwvvvwvuuuttuukZWYZYZZ[ZYYXWcqrstuttsg\YZZ\\\\\]\_gptuuuvwxxxxxxwwxxxxyyyyyyyyyyyyxxyzzyxxxxyzyyzzz{{{{{|||{zzzzzzyyzzyyz{{{zz{{{{{{{{zzzzzzzzyyzzz{|{{{zyyyzzzzzzzzyyzzzyyzzzyyzzzyzyyyz{zzzzzzzyyxxyyyxwwwxx{|}}| |||}~~~}}~~~~}~{xx{zvvvuuuuuvvwwvuttuutuuuuuuvwvvuvvuustuuuuuuvvvvvuttttuttttuuuuvuvvvvvvvvuvwvvuuuuvvvvvvvwxxwvvvvvuvr`XXYZ[\\YYYZWbrssttttsg]Z[[]]]][Z[blrtuuvxzzyyxxwwwyyyyyyyyyyzzzzyyyyzzyxxyyyyyyyzzzz{{{{{{{{zyzzyyyyyyyz{{{{{z{{{{{{{{{z{zyyyyyyzz{||{{{{zzz{zz{{{{{zyzzzyzz{{yz{{{{zyyyz{zzzzzzzyyxwwxxxxwxxx|||}}}}}}~~~}}~~~~~~~|}|xz|wvvwwvuvvvvvvuuuuuutuuvvuuuuuttttttuuvvvvuuvvuuuuuuuuutuvvvvuvwvvvuvvvvuuvvvvuuuuuuvvvvwwwwvvvvuvvvuiZYY[\[[ZZ[ZYeqssssttsk^Z[[[[[ZZ[blruwwxyyzzzzxxxyyyzzyyyyxxxyyzyyyyyyyyyzz{yyyzzyzz{{{{{zz{{zzzzzzyyyyzz{{zzzz{{{{{{{{{{{{{zzzz{{{zzzz{{||||{{{{{{{{zyzzzzzzzzyz{||||{zyyzz{zyyyzzyxwvwwwwwxxx}} }}~ ~~~}}}}}}}}~~~}||{zzx|zuvwyyxwwwwwxwvvvwwwwvvvuuuuuttutuuuvvvvvuuuuuuutuvvvvvuvwwwwvuvvvvuvwvuuvvvvvvvvvvvvvvuvvvuuuuutuuuvrcZZ[]^\\[[Y\isttttsrtqf_\[Z[[[_gquwyz{{zzyxyyyyyyyyyyyzzyyxxxxxxyyyyyyyyzzzzz{zzyyzz{{{zzzzzzyzz{{zzzyzz{{yzz{{{{{{{{{zzzz{{{|||||{zzzz{{|{{{{{{zzzzzz{{{{zzzzyz{|{{||{zyyz{{zyyzzzyxwwwwwwwxx~~ ~ ~}} } }}~~}}}||}~~~|zxvwwz|wuuxyyxxxxxyyzywwyyxxxxwvvvvvuuvvwwwwvvvvuuuvvuuvvvvwwwwvvvvvvuuvvwwwwvvvvvvvwxwwwwvvvuuuuuuuuuuuvwvwwo`[Z]_^[ZZ]blstttsssuurnjihjlkpuxyyzzzzyyywwwxyyyyxxxxxyyxxxxxxxyyyyzzzzzzzzzzyyyyzzzzzzzzzzzyzzz{{{{{zzzz{zz{zzzyzzzzzzzzz{||||||||||||||{{{{||{{{{{{{{{{zz{{{|||{{{{|zyyzzzzyxxyzyxwxxwwwwww|| } ~}}}}}~~}}|||{{{{{yvuvxzzwvvwxwwwxyyzzzywwyyyyyxvvvwwvvvvvxxwwvvvvvwwxxwwwwxxxxxxwvvvwvvvvvvvvvwwwwwwvwwvuvvvuvvuvvvvvvvuvvwvuutlb]^]]ZZ^elqsssssttuuwwxxwxxxxxyzzzyyxxxxxwwwxxxxxxxxyzzyzyyxxxyyyyzzyyyyzzyyyyyyyyzzzz{{{{zzz{{{{{{{zzz{{zz{zyyyyyzzzz{{{{{|||||{{|||{||||||||||zz{{{{{{{{zz||{{yyyz{{z{{{{zyxxxyyxxyyxxwwwwy{| ~~}}}|||{{{{zzyyxyzyxwxxyxxxxwwwxyyyxxxxxxxxyyxwvwwvvvvvvwwxxwwvvvwwwxxwwxxxxxwxyxwvvvvvvvvvvvwxxxwwwwxwuuuuvwwwwwvvvvvvvvuuuuutsojgb`^`dlqsrrrrrttuuuuvwwwvwxxxxyyxxxxxxxwwxyxwxxxwwyzzzzyxwxxxxyyyyyyyyyyyyyyyzzzzzz{{||||{{{{{z||{{{{|{{{{{{zyz{{{{{{{{{{{{||{{zz{zz{{|||||||{z{||||{{|{zz|{zzxyyzz{{{zzyyyyyyxxxxyyxxxwvvz{|}~}||{{zzzyyxxxxxyyzzzywwwxxxxwwwxxwwwwxxwwwwxxwwvvvvvuuuvwwwvvvvvvvvvvuuuvvwwvuvwvvvvvuuvvvvvvwxwvvwwxwvvvwwwwwxwuuwvuuvuuuuuuuuutrnkjkmprrrqrssttuuuuvvuuuuuvuvvwwxyyyxyxxyyxwxwwwwxxyyyyxwxxxxxxyyyyyyxxyyyyyzz{{{{{{{|||||{{zz{|{{{{{{{{{|{zzz{{{zzzz{{{{{||{|{{{{{zz{{|||||{{|||||{{{{{{{{{{{{{{{{{zzyyxxyyyzyyxxxxyyxww{||||{zyzzzzyyxwwwwwwwxz{zxwwwwwvwwwwwwxxwwwwvvuvvwwvvvvvuuuvwwwvvvvvvuuuuuuuuvvwvuuvvvvwvuuvvvvvvvvvuuvwvvvwwwwvvvvvvvvvuttttuuuuutuvutrrrrrrrrrststtuuuuuuuuuuuuuvwwwxxxxxxwwxxwwxwwwwxxyyyyyxxxxxxxxxxxxxwwxyzxxyyyzz{{{{{{{{{{zzzzyyyz{zz{{zzzzzyyz{zzzz{{{{{{{{||{{|{{{{|||||||||||||{{z{||||||{{{{{zzzzyyxxyyzzzyxxxxxxwww~|{z{{zyzzyyxwvvwwvuvvxyyyxwwwwwvwwwwwwxwvvwxwvvuuuvvvvvvvvwwwwvvvvvwvvvvvwwwwwwvvvuvvvvwvuuvvvvvvvvvvvwxwvuvvvvvvvvwvvvwvustttuvuututstssssssssrststtttuuuttuuuuuvvwwwxxwwwvvwxxwwxxxxxxxxxxyyyyyyyyyxwwxxyxwxyzxxyxxyyzzzzyyyyyzzzzyyyyzzzzzzzyyyyxyyzzzzz{{zyzzzz{{{{{zz{{{{{||||{|||{{{{{{{{||{{zzzzzzyyyyxxwyz{zxwxyyyyxxxy|ywx{zyxxxyywvvvyxwvvvwwxwvwwwwwwwwxvvvvvvwxxwvvvvvvwwwwvvvxwvuuvvvwwwvvwvvvvvvvvvvvvvvvwvvuuvwwwwwwwvvvwwvvvvvuvvvvvvvvvwvtuuuuvutttsssssrrrrsssststtuuutttttuuuuvvvvvwwwwwxxxxxwwxxwwwxxxxyyz{zzyyyyyxxxyzxwxyyyyyxxyyyz{{{zzzzyyz{{zzyyyyyzzyyyyyyyyyxyzzzzyxyzyxyyyyzzzzzzzz{{{{z{{{{{{{|||||{zyzzyyyyxxyyyyyyzzxwwwxxxxyyyzyvuvwwvvwvwxwvvvxxyyxwxxxvvwxwwwvvwwvuuvvvwwwwwvvwwwxxwwvuvwwvuvvvvvwxxvvvvvvuuvvvvvvvvvwwwvvvvvvvvvwvvwwwvvwvvvvwvvvuuuvwvvvvvvvvvvuuttttsssstttuuuvvvvvuuvvuuuuuuuuuvvwwwwxwwvwvwxwwwwwwxyxxyxxxxxxyyyxxyzzyyyyyxwwxyz{{{{{{{zzyyz{zzzzzzzzz{{zzzzz{zzzzzzzzyxyzyxyyyyzzzzzzzzzz{{zz{{{{{{{{{{||{{{{zyyyyxyyyyxxxxxxxwxxxxxxxxwuttstuvwvuvvwwvwwxxxxxxxwwxwwwvvvvvvvvvvvvvvwwvvuvvvvvwvvvwwvvwwwvuvwwvuvvvvvvvvvvvvvvvwwwwvvvvuuuuvvvwwvvuvvwwwwvvuuuuvvvwwvvwwwwwwwvvvuuuvwwwvuuvwwwwvvwwwvvuuuttuuuvwwwwwwwvwwwxxxxxwwwwwwwwvwwwwxxxxxxyzyyyyxwwwxyz{{zyyzzzzzzyyxxzzzzzyz{{{{{z{{{{{zyzz{zyzzzyxyyy{{{z{{|{{z{{zzzzzzzzzzzzz{{{|{zyyyxxyyyxxxwxyxxwwxxxwwwvstuvsttuvvuuuvwvvvwxxxxxxwwxwvvvwvvuuvvwvvuuuwwuvuttuvvvwwvwxwwxwwvuuuuvuuuuvuuvvvuuvvvvvvvvvvvvvuuuuvvwwvvuvvwwwwvvvuvvvvvwvuuvvvvvwwwvvvvwwxxwwvvvvuuvvvvvvvvvuuuuuuvvvvvvvvvwwwxxxxxxxxxxxxwwwwwwwwxxxxwxxxyyxxyyyyzzzzyyxyzzzzzyyxxyyyyyyz{{{zzzzzzzzz{zz{{{zzyxyyzz{zzzzz||||{zzzyyzzzzzzzzyyzz{zyyxxxxxxxxxxxxxxwvwwwwwvvvqrstrrstvvuuuvvvuvvwwxxxwvvvvvwwxwuuuuvvvuuuuuuvvuttttuvwwwvwwwwwvvvvuuuvuuvvvuuvvvvvuvuuuuvvvwwwvvvuvvwwvvvuvvvvvvvvvvvvuuuuttuuvvvvvvvvvwwwwvvvvvvuuuuwvuuvuuvwvvvvtssssrrrsuvvvwwwwwxxxyyyyxxxxxxxxxxxxxxxxxxyyzzyyyyzzyyyyyyzzzyzyyyyyyyyyzzzzyyyyyyyyzzyyz{{zyyyyyyzzzz{{||||{{{{zz{{{{{{{{{zyz{zyyxxyyxyyyxxxxxwvvvuuuvvvvqrssrstttssttuuuuuvvwwxxwvvvwwwxwwvvvvvvuuvvvuuvwwvuttuuvvvwvvvvvvvwxwvvvvvvwwvvvvvwvuuuuuvvvvwwwvvvuuvvwvvvvvvvvvvvvvuuuuuvuttuuuuuuuuvvvvvvvvvwwvvvuuvxwvuuuuuwwvusqqsuvuuttttsrtvvvwwxxxxxxxxwxxyxxxxyyyyxxxxyyzzyyyyyyyyyyyxxyzyzyyyxyyzyyyyyzyyyyyyxyyyxyzz{{zyxxyyyyzz{{{{{{zzz{{{z{{z{{{{{{zz{{{zyyyyyyyyxxxxwwwwwvutvuuvvuuutttssrrrssttuvvvwwwwvvwwwwxxwwwwwwvvvvvvwvvvwwwwvvuuuvvvvvvvvvvvxwwvvuuvvvvvwvvvuuuuuvvwvvvvwwvvuuuvvvvuvvvvvvvvwvuuuuvvvvuuuuuuuuuuuuvuuuvvwwwwvvuuwvvutsssrssssvy|~~~|zyutuvvwwwwwwwwwwwxxyyyyyzzyyxxxxyyyyyyyyzzzzzzyyyyyyyyyyyyyyzzyyyyyyzzyyxyyzzzzz{zywwxyyyz{zzz{{{zzzzz||{{{{z{{zzzzzzz{{{zxxxxxxwwxxwwwxxwvvuuuuxwwvvutstttssttuuvvvvvvvvvwxwwwwwwwwvvvvuuuuvvvwwwwwwvvvuvvvuuuuwvvvwvvvwuuvvvvvvvuuuuuuuuvvvuuvxwwwwwvvvvvuuuuuuvvvvuuuuuuuvuuuuuuuuvvuuuuuuuuuvvvvwvvvvtrqqqpoopu{ }yutvwxwwwwwwwxxxxxxyyyyyxxxyyyyxxxxyyzzzzzzyyyyyyzzzzzzzz{{yyyyyyzzyyyyz{zzzzyyxwxxxyyzzzzz{{zzyyzz||||{zz{{zzzzzyzzz{zxxxwxwwvvvwwxxxwvvuuuv \ No newline at end of file
diff --git a/net/BUILD.gn b/net/BUILD.gn index 54aab83..e4f9b312 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -940,6 +940,8 @@ "quic/quic_session_key.h", "quic/quic_stream_factory.cc", "quic/quic_stream_factory.h", + "quic/quic_transport_client.cc", + "quic/quic_transport_client.h", "quic/quic_utils_chromium.cc", "quic/quic_utils_chromium.h", "quiche/common/platform/impl/quiche_arraysize_impl.h", @@ -2022,6 +2024,8 @@ "cert/x509_util_nss.h", "cert_net/nss_ocsp.cc", "cert_net/nss_ocsp.h", + "cert_net/nss_ocsp_session_url_request.cc", + "cert_net/nss_ocsp_session_url_request.h", ] if (!is_chromecast) { sources += [ @@ -5359,6 +5363,7 @@ "quic/quic_stream_factory_test.cc", "quic/quic_test_packet_maker.cc", "quic/quic_test_packet_maker.h", + "quic/quic_transport_end_to_end_test.cc", "quic/quic_utils_chromium_test.cc", "quic/test_quic_crypto_client_config_handle.cc", "quic/test_quic_crypto_client_config_handle.h",
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc index 9a1a807d..9c55630ed 100644 --- a/net/cert/cert_verify_proc_unittest.cc +++ b/net/cert/cert_verify_proc_unittest.cc
@@ -39,6 +39,7 @@ #include "net/cert/x509_certificate.h" #include "net/cert/x509_util.h" #include "net/cert_net/cert_net_fetcher_url_request.h" +#include "net/cert_net/nss_ocsp_session_url_request.h" #include "net/der/input.h" #include "net/der/parser.h" #include "net/proxy_resolution/proxy_config.h"
diff --git a/net/cert_net/nss_ocsp.cc b/net/cert_net/nss_ocsp.cc index 5e5d4d58..84f6c71 100644 --- a/net/cert_net/nss_ocsp.cc +++ b/net/cert_net/nss_ocsp.cc
@@ -24,9 +24,8 @@ #include "base/location.h" #include "base/logging.h" #include "base/macros.h" -#include "base/message_loop/message_loop_current.h" #include "base/metrics/histogram_macros.h" -#include "base/single_thread_task_runner.h" +#include "base/no_destructor.h" #include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -35,76 +34,29 @@ #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" -#include "net/base/elements_upload_data_stream.h" #include "net/base/host_port_pair.h" -#include "net/base/io_buffer.h" -#include "net/base/load_flags.h" -#include "net/base/request_priority.h" -#include "net/base/upload_bytes_element_reader.h" -#include "net/http/http_request_headers.h" -#include "net/http/http_response_headers.h" -#include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/redirect_info.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_context.h" #include "url/gurl.h" namespace net { namespace { -// Protects |g_request_context|. -pthread_mutex_t g_request_context_lock = PTHREAD_MUTEX_INITIALIZER; -URLRequestContext* g_request_context = NULL; +// Protects |g_request_session_delegate_factory|. +pthread_mutex_t g_request_session_delegate_factory_lock = + PTHREAD_MUTEX_INITIALIZER; +scoped_refptr<OCSPRequestSessionDelegateFactory>& +GetRequestSessionDelegateFactoryPtr() { + static base::NoDestructor<scoped_refptr<OCSPRequestSessionDelegateFactory>> + wrapper; + return *wrapper.get(); +} // The default timeout for network fetches in NSS is 60 seconds. Choose a // saner upper limit for OCSP/CRL/AIA fetches. const int kNetworkFetchTimeoutInSecs = 15; class OCSPRequestSession; -class OCSPIOLoop { - public: - // This class is only instantiated as a leaky LazyInstance, so its destructor - // is never called. - ~OCSPIOLoop() = delete; - - void StartUsing() { - base::AutoLock autolock(lock_); - DCHECK(base::MessageLoopCurrentForIO::IsSet()); - io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); - } - - // Called on IO loop. - void Shutdown(); - - // Called from worker thread. - void PostTaskToIOLoop(const base::Location& from_here, - const base::Closure& task); - - void AddRequest(OCSPRequestSession* request); - void RemoveRequest(OCSPRequestSession* request); - - private: - friend struct base::LazyInstanceTraitsBase<OCSPIOLoop>; - - OCSPIOLoop() = default; - - void CancelAllRequests(); - - // Protects all members below. - mutable base::Lock lock_; - std::set<OCSPRequestSession*> requests_; - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - - DISALLOW_COPY_AND_ASSIGN(OCSPIOLoop); -}; - -base::LazyInstance<OCSPIOLoop>::Leaky - g_ocsp_io_loop = LAZY_INSTANCE_INITIALIZER; - -const int kRecvBufferSize = 4096; - // All OCSP handlers should be called in the context of // CertVerifier's thread (i.e. worker pool, not on the I/O thread). // It supports blocking mode only. @@ -157,296 +109,91 @@ LAZY_INSTANCE_INITIALIZER; // Concrete class for SEC_HTTP_REQUEST_SESSION. -// Public methods except virtual methods of URLRequest::Delegate -// (On* methods) run on certificate verifier thread (worker thread). -// Virtual methods of URLRequest::Delegate and private methods run -// on IO thread. -class OCSPRequestSession - : public base::RefCountedThreadSafe<OCSPRequestSession>, - public URLRequest::Delegate { +// NSS defines a C API to allow embedders to provide an HTTP abstraction, +// the SEC_HTTP_REQUEST_SESSION. This class provides a C++ abstraction +// used to implement that, but is not a direct 1:1 mapping. +class NET_EXPORT OCSPRequestSession { public: + // Creates a new OCSPRequestSession. + // |url| should be constructed from the |host| and |portnum| provided in + // SEC_HttpServer_CreateSessionFcn and the |path_and_query_string| provided + // in SEC_HttpRequest_CreateFcn, together representing the full URL to + // query. The only supported |http_protocol_variant| is http, which should + // be the scheme. + // |http_request_method| and |timeout| correspond to their + // SEC_HttpRequest_CreateFcn equivalents. + // |delegate| should normally be an OCSPRequestSessionDelegateFactory obtained + // from GetOCSPRequestSessionDelegateFactoryPtr(). OCSPRequestSession(const GURL& url, const char* http_request_method, - base::TimeDelta timeout) - : url_(url), - http_request_method_(http_request_method), - timeout_(timeout), - buffer_(base::MakeRefCounted<IOBuffer>(kRecvBufferSize)), - response_code_(-1), - cv_(&lock_), - finished_(false) {} + base::TimeDelta timeout, + scoped_refptr<OCSPRequestSessionDelegate> delegate) + : delegate_(std::move(delegate)) { + params_.url = url; + params_.http_request_method = http_request_method; + params_.timeout = timeout; + } + ~OCSPRequestSession() = default; - void SetPostData(const char* http_data, PRUint32 http_data_len, + // Implements the functionality of SEC_HttpRequest_SetPostDataFcn + void SetPostData(const char* http_data, + PRUint32 http_data_len, const char* http_content_type) { - // |upload_content_| should not be modified if |request_| is active. - DCHECK(!request_); - upload_content_.assign(http_data, http_data_len); - upload_content_type_.assign(http_content_type); + // |upload_content_| should not be modified if the load has already started. + params_.upload_content.assign(http_data, http_data_len); + params_.upload_content_type.assign(http_content_type); } + // Implements the functionality of SEC_HttpRequest_AddHeaderFcn void AddHeader(const char* http_header_name, const char* http_header_value) { - extra_request_headers_.SetHeader(http_header_name, - http_header_value); + params_.extra_request_headers.SetHeader(http_header_name, + http_header_value); } - void Start() { - // At this point, it runs on worker thread. - // |io_task_runner_| is only initialized in StartURLRequest, so no need to - // lock |lock_| here. - DCHECK(!io_task_runner_); - g_ocsp_io_loop.Get().PostTaskToIOLoop( - FROM_HERE, - base::Bind(&OCSPRequestSession::StartURLRequest, this)); + // Begins communication with the OCSP endpoint, then blocks the thread until + // the result is available or an error has occurred. Used by + // SEC_HttpRequest_TrySendAndReceiveFcn. + bool StartAndWait() { + DCHECK(!finished_); + result_ = delegate_->StartAndWait(¶ms_); + finished_ = true; + return result_ != nullptr; } - bool Started() const { - return request_.get() != NULL; - } - - void Cancel() { - // IO thread may reset |io_task_runner_|, so protect by |lock_|. - base::AutoLock autolock(lock_); - CancelLocked(); - } - - bool Finished() const { - base::AutoLock autolock(lock_); - return finished_; - } - - bool Wait() { - base::TimeDelta timeout = timeout_; - base::AutoLock autolock(lock_); - while (!finished_) { - base::TimeTicks last_time = base::TimeTicks::Now(); - cv_.TimedWait(timeout); - // Check elapsed time - base::TimeDelta elapsed_time = base::TimeTicks::Now() - last_time; - timeout -= elapsed_time; - if (timeout < base::TimeDelta()) { - VLOG(1) << "OCSP Timed out"; - if (!finished_) - CancelLocked(); - break; - } - } - return finished_; - } - - const GURL& url() const { - return url_; - } + // Returns true if the OCSP response has been received (or an error occurred). + bool Finished() const { return finished_; } const std::string& http_request_method() const { - return http_request_method_; + return params_.http_request_method; } - base::TimeDelta timeout() const { - return timeout_; - } + base::TimeDelta timeout() const { return params_.timeout; } PRUint16 http_response_code() const { DCHECK(finished_); - return response_code_; + return result_->response_code; } const std::string& http_response_content_type() const { DCHECK(finished_); - return response_content_type_; + return result_->response_content_type; } const std::string& http_response_headers() const { DCHECK(finished_); - return response_headers_->raw_headers(); + return result_->response_headers->raw_headers(); } const std::string& http_response_data() const { DCHECK(finished_); - return data_; - } - - void OnReceivedRedirect(URLRequest* request, - const RedirectInfo& redirect_info, - bool* defer_redirect) override { - DCHECK_EQ(request_.get(), request); - DCHECK(io_task_runner_->BelongsToCurrentThread()); - - if (!redirect_info.new_url.SchemeIs("http")) { - // Prevent redirects to non-HTTP schemes, including HTTPS. This matches - // the initial check in OCSPServerSession::CreateRequest(). - CancelURLRequest(); - } - } - - void OnResponseStarted(URLRequest* request, int net_error) override { - DCHECK_EQ(request_.get(), request); - DCHECK(io_task_runner_->BelongsToCurrentThread()); - DCHECK_NE(ERR_IO_PENDING, net_error); - - int bytes_read = 0; - if (net_error == OK) { - response_code_ = request_->GetResponseCode(); - response_headers_ = request_->response_headers(); - response_headers_->GetMimeType(&response_content_type_); - bytes_read = request_->Read(buffer_.get(), kRecvBufferSize); - } - OnReadCompleted(request_.get(), bytes_read); - } - - void OnReadCompleted(URLRequest* request, int bytes_read) override { - DCHECK_EQ(request_.get(), request); - DCHECK(io_task_runner_->BelongsToCurrentThread()); - - while (bytes_read > 0) { - data_.append(buffer_->data(), bytes_read); - bytes_read = request_->Read(buffer_.get(), kRecvBufferSize); - } - - if (bytes_read != ERR_IO_PENDING) { - request_.reset(); - g_ocsp_io_loop.Get().RemoveRequest(this); - { - base::AutoLock autolock(lock_); - finished_ = true; - io_task_runner_ = nullptr; - } - cv_.Signal(); - Release(); // Balanced with StartURLRequest(). - } - } - - // Must be called on the IO loop thread. - void CancelURLRequest() { -#ifndef NDEBUG - { - base::AutoLock autolock(lock_); - if (io_task_runner_) - DCHECK(io_task_runner_->BelongsToCurrentThread()); - } -#endif - if (request_) { - request_.reset(); - g_ocsp_io_loop.Get().RemoveRequest(this); - { - base::AutoLock autolock(lock_); - finished_ = true; - io_task_runner_ = nullptr; - } - cv_.Signal(); - Release(); // Balanced with StartURLRequest(). - } + return result_->data; } private: - friend class base::RefCountedThreadSafe<OCSPRequestSession>; - - ~OCSPRequestSession() override { - // When this destructor is called, there should be only one thread that has - // a reference to this object, and so that thread doesn't need to lock - // |lock_| here. - DCHECK(!request_); - DCHECK(!io_task_runner_); - } - - // Must call this method while holding |lock_|. - void CancelLocked() { - lock_.AssertAcquired(); - if (io_task_runner_) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&OCSPRequestSession::CancelURLRequest, this)); - } - } - - // Runs on |g_ocsp_io_loop|'s IO loop. - void StartURLRequest() { - DCHECK(!request_); - - pthread_mutex_lock(&g_request_context_lock); - URLRequestContext* url_request_context = g_request_context; - pthread_mutex_unlock(&g_request_context_lock); - - if (url_request_context == NULL) - return; - - { - base::AutoLock autolock(lock_); - DCHECK(!io_task_runner_); - DCHECK(base::MessageLoopCurrentForIO::IsSet()); - io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); - g_ocsp_io_loop.Get().AddRequest(this); - } - - net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("ocsp_start_url_request", R"( - semantics { - sender: "OCSP" - description: - "Verifying the revocation status of a certificate via OCSP." - trigger: - "This may happen in response to visiting a website that uses " - "https://" - data: - "Identifier for the certificate whose revocation status is being " - "checked. See https://tools.ietf.org/html/rfc6960#section-2.1 for " - "more details." - destination: OTHER - } - policy { - cookies_allowed: NO - setting: "This feature cannot be disabled by settings." - policy_exception_justification: "Not implemented." - })"); - request_ = url_request_context->CreateRequest(url_, DEFAULT_PRIORITY, this, - traffic_annotation); - // To meet the privacy requirements of incognito mode. - request_->SetLoadFlags(LOAD_DISABLE_CACHE); - request_->set_allow_credentials(false); - - if (http_request_method_ == "POST") { - DCHECK(!upload_content_.empty()); - DCHECK(!upload_content_type_.empty()); - - request_->set_method("POST"); - extra_request_headers_.SetHeader( - HttpRequestHeaders::kContentType, upload_content_type_); - - std::unique_ptr<UploadElementReader> reader(new UploadBytesElementReader( - upload_content_.data(), upload_content_.size())); - request_->set_upload( - ElementsUploadDataStream::CreateWithReader(std::move(reader), 0)); - } - if (!extra_request_headers_.IsEmpty()) - request_->SetExtraRequestHeaders(extra_request_headers_); - - request_->Start(); - AddRef(); // Release after |request_| deleted. - } - - GURL url_; // The URL we eventually wound up at - std::string http_request_method_; - base::TimeDelta timeout_; // The timeout for OCSP - std::unique_ptr<URLRequest> request_; // The actual request this wraps - scoped_refptr<IOBuffer> buffer_; // Read buffer - HttpRequestHeaders extra_request_headers_; - - // HTTP POST payload. |request_| reads bytes from this. - std::string upload_content_; - std::string upload_content_type_; // MIME type of POST payload - - int response_code_; // HTTP status code for the request - std::string response_content_type_; - scoped_refptr<HttpResponseHeaders> response_headers_; - std::string data_; // Results of the request - - // |lock_| protects |finished_| and |io_task_runner_|. - mutable base::Lock lock_; - base::ConditionVariable cv_; - - // TaskRunner for the IO thread. Set when StartURLRequest() is invoked (on the - // IO thread). - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - bool finished_; + OCSPRequestSessionParams params_; + std::unique_ptr<OCSPRequestSessionResult> result_; + scoped_refptr<OCSPRequestSessionDelegate> delegate_; + bool finished_ = false; DISALLOW_COPY_AND_ASSIGN(OCSPRequestSession); }; @@ -458,6 +205,7 @@ : host_and_port_(host, port) {} ~OCSPServerSession() = default; + // Caller is in charge of deleting the returned pointer. OCSPRequestSession* CreateRequest(const char* http_protocol_variant, const char* path_and_query_string, const char* http_request_method, @@ -484,9 +232,21 @@ base::TimeDelta::FromSeconds(kNetworkFetchTimeoutInSecs), base::TimeDelta::FromMilliseconds(PR_IntervalToMilliseconds(timeout))); - return new OCSPRequestSession(url, http_request_method, actual_timeout); - } + scoped_refptr<OCSPRequestSessionDelegate> request_session_delegate; + pthread_mutex_lock(&g_request_session_delegate_factory_lock); + OCSPRequestSessionDelegateFactory* request_session_delegate_factory = + GetRequestSessionDelegateFactoryPtr().get(); + if (request_session_delegate_factory != nullptr) { + request_session_delegate = + request_session_delegate_factory->CreateOCSPRequestSessionDelegate(); + } + pthread_mutex_unlock(&g_request_session_delegate_factory_lock); + if (request_session_delegate == nullptr) + return nullptr; + return new OCSPRequestSession(url, http_request_method, actual_timeout, + std::move(request_session_delegate)); + } private: HostPortPair host_and_port_; @@ -494,47 +254,6 @@ DISALLOW_COPY_AND_ASSIGN(OCSPServerSession); }; -void OCSPIOLoop::Shutdown() { - // Safe to read outside lock since we only write on IO thread anyway. - DCHECK(io_task_runner_->BelongsToCurrentThread()); - - // Prevent the worker thread from trying to access |io_task_runner_|. - { - base::AutoLock autolock(lock_); - io_task_runner_ = nullptr; - } - - CancelAllRequests(); - - pthread_mutex_lock(&g_request_context_lock); - g_request_context = NULL; - pthread_mutex_unlock(&g_request_context_lock); -} - -void OCSPIOLoop::PostTaskToIOLoop(const base::Location& from_here, - const base::Closure& task) { - base::AutoLock autolock(lock_); - if (io_task_runner_) - io_task_runner_->PostTask(from_here, task); -} - -void OCSPIOLoop::AddRequest(OCSPRequestSession* request) { - DCHECK(!base::Contains(requests_, request)); - requests_.insert(request); -} - -void OCSPIOLoop::RemoveRequest(OCSPRequestSession* request) { - DCHECK(base::Contains(requests_, request)); - requests_.erase(request); -} - -void OCSPIOLoop::CancelAllRequests() { - // CancelURLRequest() always removes the request from the requests_ - // set synchronously. - while (!requests_.empty()) - (*requests_.begin())->CancelURLRequest(); -} - OCSPNSSInitialization::OCSPNSSInitialization() { // NSS calls the functions in the function table to download certificates // or CRLs or talk to OCSP responders over HTTP. These functions must @@ -549,7 +268,7 @@ ft->setPostDataFcn = OCSPSetPostData; ft->addHeaderFcn = OCSPAddHeader; ft->trySendAndReceiveFcn = OCSPTrySendAndReceive; - ft->cancelFcn = NULL; + ft->cancelFcn = nullptr; ft->freeFcn = OCSPFree; SECStatus status = SEC_RegisterDefaultHttpClient(&client_fcn_); if (status != SECSuccess) { @@ -561,7 +280,7 @@ // which causes certificates issued by that CA to be reported as revoked. // By using OCSP for those certificates, which don't have AIA extensions, // we can work around these bugs. See http://crbug.com/41730. - CERT_StringFromCertFcn old_callback = NULL; + CERT_StringFromCertFcn old_callback = nullptr; status = CERT_RegisterAlternateOCSPAIAInfoCallBack( GetAlternateOCSPAIAInfo, &old_callback); if (status == SECSuccess) { @@ -577,15 +296,17 @@ SECStatus OCSPCreateSession(const char* host, PRUint16 portnum, SEC_HTTP_SERVER_SESSION* pSession) { VLOG(1) << "OCSP create session: host=" << host << " port=" << portnum; - pthread_mutex_lock(&g_request_context_lock); - URLRequestContext* request_context = g_request_context; - pthread_mutex_unlock(&g_request_context_lock); - if (request_context == NULL) { - LOG(ERROR) << "No URLRequestContext for NSS HTTP handler. host: " << host; - // The application failed to call SetURLRequestContextForNSSHttpIO or - // has already called ShutdownNSSHttpIO, so we can't create and use - // URLRequest. PR_NOT_IMPLEMENTED_ERROR is not an accurate error - // code for these error conditions, but is close enough. + pthread_mutex_lock(&g_request_session_delegate_factory_lock); + bool factory_configured = GetRequestSessionDelegateFactoryPtr() != nullptr; + pthread_mutex_unlock(&g_request_session_delegate_factory_lock); + if (!factory_configured) { + LOG(ERROR) + << "No OCSPRequestSessionDelegateFactory for NSS HTTP handler. host: " + << host; + // The application failed to call SetOCSPRequestSessionDelegateFactory or + // has already called SetOCSPRequestSessionDelegateFactory(nullptr). + // PR_NOT_IMPLEMENTED_ERROR is not an accurate error code for these error + // conditions, but is close enough. PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); return SECFailure; } @@ -626,7 +347,6 @@ timeout); SECStatus rv = SECFailure; if (req) { - req->AddRef(); // Release in OCSPFree(). rv = SECSuccess; } *pRequest = req; @@ -713,16 +433,8 @@ if (pPollDesc) *pPollDesc = NULL; - if (req->Started() || req->Finished()) { - // We support blocking mode only, so this function shouldn't be called - // again when req has stareted or finished. - NOTREACHED(); - PORT_SetError(SEC_ERROR_BAD_HTTP_RESPONSE); // Simple approximation. - return SECFailure; - } - - req->Start(); - if (!req->Wait() || req->http_response_code() == static_cast<PRUint16>(-1)) { + if (!req->StartAndWait() || + req->http_response_code() == static_cast<PRUint16>(-1)) { // If the response code is -1, the request failed and there is no response. PORT_SetError(SEC_ERROR_BAD_HTTP_RESPONSE); // Simple approximation. return SECFailure; @@ -739,8 +451,7 @@ SECStatus OCSPFree(SEC_HTTP_REQUEST_SESSION request) { VLOG(1) << "OCSP free"; OCSPRequestSession* req = reinterpret_cast<OCSPRequestSession*>(request); - req->Cancel(); - req->Release(); + delete req; return SECSuccess; } @@ -835,23 +546,40 @@ } // anonymous namespace +OCSPRequestSessionParams::OCSPRequestSessionParams() = default; +OCSPRequestSessionParams::~OCSPRequestSessionParams() = default; + +OCSPRequestSessionResult::OCSPRequestSessionResult() = default; +OCSPRequestSessionResult::~OCSPRequestSessionResult() = default; + +OCSPRequestSessionDelegate::~OCSPRequestSessionDelegate() = default; + +OCSPRequestSessionDelegateFactory::OCSPRequestSessionDelegateFactory() = + default; +OCSPRequestSessionDelegateFactory::~OCSPRequestSessionDelegateFactory() = + default; + void EnsureNSSHttpIOInit() { g_ocsp_nss_initialization.Get(); } -void SetURLRequestContextForNSSHttpIO(URLRequestContext* request_context) { - pthread_mutex_lock(&g_request_context_lock); - if (request_context) { - DCHECK(!g_request_context); - } - g_request_context = request_context; - pthread_mutex_unlock(&g_request_context_lock); +void SetOCSPRequestSessionDelegateFactory( + scoped_refptr<OCSPRequestSessionDelegateFactory> new_factory) { + scoped_refptr<OCSPRequestSessionDelegateFactory> factory_to_be_destructed; - if (request_context) { - g_ocsp_io_loop.Get().StartUsing(); - } else { - g_ocsp_io_loop.Get().Shutdown(); - } + pthread_mutex_lock(&g_request_session_delegate_factory_lock); + scoped_refptr<OCSPRequestSessionDelegateFactory>& current_factory = + GetRequestSessionDelegateFactoryPtr(); + // The same NSS-using process should only ever use one concrete + // OCSPRequestSessionDelegateFactory for the lifetime of that process. If this + // DCHECK triggers, two different instances are trying to be used in the + // same process, and that underlying issue should be fixed, rather than + // trying to silence this by calling with nullptr first to reset the old + // instance. + DCHECK(!new_factory || !current_factory.get()); + + factory_to_be_destructed = std::exchange(current_factory, new_factory); + pthread_mutex_unlock(&g_request_session_delegate_factory_lock); } } // namespace net
diff --git a/net/cert_net/nss_ocsp.h b/net/cert_net/nss_ocsp.h index 2429f41a..0a96a721 100644 --- a/net/cert_net/nss_ocsp.h +++ b/net/cert_net/nss_ocsp.h
@@ -5,22 +5,82 @@ #ifndef NET_CERT_NET_NSS_OCSP_H_ #define NET_CERT_NET_NSS_OCSP_H_ +#include <nspr.h> + +#include "base/memory/ref_counted.h" +#include "base/time/time.h" #include "net/base/net_export.h" +#include "net/http/http_request_headers.h" +#include "net/http/http_response_headers.h" +#include "url/gurl.h" namespace net { -class URLRequestContext; +struct NET_EXPORT OCSPRequestSessionParams { + OCSPRequestSessionParams(); + ~OCSPRequestSessionParams(); + + GURL url; // The URL to initially fetch + std::string http_request_method; + base::TimeDelta timeout; + HttpRequestHeaders extra_request_headers; + + // HTTP POST payload. + std::string upload_content; + std::string upload_content_type; // MIME type of POST payload +}; + +struct NET_EXPORT OCSPRequestSessionResult { + OCSPRequestSessionResult(); + ~OCSPRequestSessionResult(); + + int response_code = -1; // HTTP status code for the request + std::string response_content_type; + scoped_refptr<HttpResponseHeaders> response_headers; + std::string data; // Results of the request +}; + +// This interface should be implemented to provide synchronous loading of OCSP +// requests specified by OCSPRequestSessionParams. Returns an instance of +// OCSPRequestSessionResult. +class NET_EXPORT OCSPRequestSessionDelegate + : public base::RefCountedThreadSafe<OCSPRequestSessionDelegate> { + public: + REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE(); + + // Starts the load using the parameters specified in |params|, and then blocks + // the thread until the result is received. Returns the result, or nullptr on + // error. + virtual std::unique_ptr<OCSPRequestSessionResult> StartAndWait( + const OCSPRequestSessionParams* params) = 0; + + protected: + friend class base::RefCountedThreadSafe<OCSPRequestSessionDelegate>; + + virtual ~OCSPRequestSessionDelegate(); +}; + +class NET_EXPORT OCSPRequestSessionDelegateFactory + : public base::RefCountedThreadSafe<OCSPRequestSessionDelegateFactory> { + public: + REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE(); + + OCSPRequestSessionDelegateFactory(); + virtual scoped_refptr<OCSPRequestSessionDelegate> + CreateOCSPRequestSessionDelegate() = 0; + + protected: + friend class base::RefCountedThreadSafe<OCSPRequestSessionDelegateFactory>; + virtual ~OCSPRequestSessionDelegateFactory(); +}; + +// Sets the factory that creates OCSPRequestSessions. +NET_EXPORT void SetOCSPRequestSessionDelegateFactory( + scoped_refptr<OCSPRequestSessionDelegateFactory> factory); // Initializes HTTP client functions for NSS. This function is thread-safe, // and HTTP handlers will only ever be initialized once. NET_EXPORT void EnsureNSSHttpIOInit(); - -// Sets the URLRequestContext and MessageLoop for HTTP requests issued by NSS -// (i.e. OCSP, CA certificate and CRL fetches). Must be called again with -// |request_context|=nullptr before the URLRequestContext is destroyed. -NET_EXPORT void SetURLRequestContextForNSSHttpIO( - URLRequestContext* request_context); - } // namespace net #endif // NET_CERT_NET_NSS_OCSP_H_
diff --git a/net/cert_net/nss_ocsp_session_url_request.cc b/net/cert_net/nss_ocsp_session_url_request.cc new file mode 100644 index 0000000..97aab39 --- /dev/null +++ b/net/cert_net/nss_ocsp_session_url_request.cc
@@ -0,0 +1,377 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/cert_net/nss_ocsp_session_url_request.h" + +#include "base/message_loop/message_loop_current.h" +#include "base/synchronization/condition_variable.h" +#include "base/synchronization/lock.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "net/base/elements_upload_data_stream.h" +#include "net/base/load_flags.h" +#include "net/base/upload_bytes_element_reader.h" +#include "net/cert_net/nss_ocsp.h" +#include "net/url_request/redirect_info.h" +#include "net/url_request/url_request_context.h" +#include "url/gurl.h" + +namespace net { + +namespace { +// Size of the IOBuffer that used for reading the result. +const int kRecvBufferSize = 4096; + +// The maximum size in bytes for the response body when fetching an OCSP/CRL +// URL. +const int kMaxResponseSizeInBytesForOCSP = 5 * 1024 * 1024; +} // namespace + +class OCSPRequestSessionDelegateURLRequest; + +class NET_EXPORT OCSPIOLoop { + public: + // This class is only instantiated in a base::NoDestructor, so its destructor + // is never called. + ~OCSPIOLoop() = delete; + + // Called on IO task runner. + void StartUsing(); + + // Called on IO task runner. + void Shutdown(); + + // Called from worker thread. + void PostTaskToIOLoop(const base::Location& from_here, + base::OnceClosure task); + + // Returns true if and only if StartUsing() has been called, Shutdown() has + // not been called, and this is currently running on the OCSP IO task runner. + bool RunsTasksInCurrentSequence(); + + // Adds a request to cancel if |this|->Shutdown() is called during the + // request. + void AddRequest(OCSPRequestSessionDelegateURLRequest* request_delegate); + + // Remove the request from tracking when the request has finished. + void RemoveRequest(OCSPRequestSessionDelegateURLRequest* request_delegate); + + private: + friend class base::NoDestructor<OCSPIOLoop>; + + OCSPIOLoop(); + + void CancelAllRequests(); + + // Protects all members below. + mutable base::Lock lock_; + std::set<OCSPRequestSessionDelegateURLRequest*> request_delegates_; + scoped_refptr<base::SequencedTaskRunner> io_task_runner_; + + DISALLOW_COPY_AND_ASSIGN(OCSPIOLoop); +}; + +OCSPIOLoop* GetOCSPIOLoop() { + static base::NoDestructor<OCSPIOLoop> ocsp_io_loop; + return ocsp_io_loop.get(); +} + +class OCSPRequestSessionDelegateURLRequest : public OCSPRequestSessionDelegate, + public URLRequest::Delegate { + public: + OCSPRequestSessionDelegateURLRequest(URLRequestContext* request_context) + : buffer_(base::MakeRefCounted<IOBuffer>(kRecvBufferSize)), + request_context_(request_context), + cv_(&lock_) {} + + // OCSPRequestSessionDelegate overrides. + std::unique_ptr<OCSPRequestSessionResult> StartAndWait( + const OCSPRequestSessionParams* params) override { + GetOCSPIOLoop()->PostTaskToIOLoop( + FROM_HERE, base::Bind(&OCSPRequestSessionDelegateURLRequest::StartLoad, + this, params)); + + // Wait with a timeout. + base::TimeDelta timeout = params->timeout; + base::AutoLock autolock(lock_); + while (!finished_) { + base::TimeTicks last_time = base::TimeTicks::Now(); + cv_.TimedWait(timeout); + // Check elapsed time + base::TimeDelta elapsed_time = base::TimeTicks::Now() - last_time; + timeout -= elapsed_time; + if (timeout < base::TimeDelta()) { + VLOG(1) << "OCSP Timed out"; + if (!finished_) { + // Safe to call CancelLoad even if the request successfully finished + // after our timeout, because if the request has finished it will be + // reset and CancelLoad will be a no-op. + GetOCSPIOLoop()->PostTaskToIOLoop( + FROM_HERE, + base::BindOnce(&OCSPRequestSessionDelegateURLRequest::CancelLoad, + this)); + } + break; + } + } + + if (!finished_) + return nullptr; + return std::move(result_); + } + + void CancelLoad() { + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + if (request_) { + FinishLoad(); + } + } + + // URLRequest::Delegate overrides + void OnReceivedRedirect(URLRequest* request, + const RedirectInfo& redirect_info, + bool* defer_redirect) override { + DCHECK_EQ(request_.get(), request); + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + + if (!redirect_info.new_url.SchemeIs("http")) { + // Prevent redirects to non-HTTP schemes, including HTTPS. This matches + // the initial check in OCSPServerSession::CreateRequest(). + CancelLoad(); + } + } + + void OnResponseStarted(URLRequest* request, int net_error) override { + DCHECK_EQ(request_.get(), request); + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + DCHECK_NE(ERR_IO_PENDING, net_error); + + int bytes_read = 0; + if (net_error == OK) { + result_->response_code = request_->GetResponseCode(); + result_->response_headers = request_->response_headers(); + result_->response_headers->GetMimeType(&result_->response_content_type); + bytes_read = request_->Read(buffer_.get(), kRecvBufferSize); + } + OnReadCompleted(request_.get(), bytes_read); + } + + void OnReadCompleted(URLRequest* request, int bytes_read) override { + DCHECK(!finished_); + DCHECK_EQ(request_.get(), request); + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + + while (bytes_read > 0) { + result_->data.append(buffer_->data(), bytes_read); + bytes_read = request_->Read(buffer_.get(), kRecvBufferSize); + } + + // Check max size. + if (result_->data.size() > kMaxResponseSizeInBytesForOCSP) { + result_->data.clear(); + // Set response code to -1 to signify error. + result_->response_code = -1; + FinishLoad(); + } + + // If we are done reading, return results. + if (bytes_read != ERR_IO_PENDING) { + FinishLoad(); + } + } + + private: + friend class base::RefCountedThreadSafe<OCSPRequestSessionDelegateURLRequest>; + + ~OCSPRequestSessionDelegateURLRequest() override { + // When this destructor is called, there should be only one thread that has + // a reference to this object, and so that thread doesn't need to lock + // |lock_| here. + DCHECK(finished_); + DCHECK(!request_); + } + + // Runs on the OCSP IO task runner. + void StartLoad(const OCSPRequestSessionParams* params) { + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + if (request_) { + NOTREACHED(); + FinishLoad(); // Will return a nullptr as the result. + return; + } + if (finished_) { + // This may occur if the OCSPIOLoop has already called Shutdown() (i.e. + // SetURLRequestContextForNSSHttpIO(nullptr) has been called), but the + // NSS worker thread posted a StartLoad task before Shutdown() was called. + // Since Shutdown() was called already, the tasks should all have been + // cancelled and FinishLoad() should already have been called. We have + // to make sure we honor the cancellation because |request_context_| may + // no longer be valid. + return; + } + + GetOCSPIOLoop()->AddRequest(this); + + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("ocsp_start_url_request", R"( + semantics { + sender: "OCSP" + description: + "Verifying the revocation status of a certificate via OCSP." + trigger: + "This may happen in response to visiting a website that uses " + "https://" + data: + "Identifier for the certificate whose revocation status is being " + "checked. See https://tools.ietf.org/html/rfc6960#section-2.1 for " + "more details." + destination: OTHER + destination_other: + "The URI specified in the certificate." + } + policy { + cookies_allowed: NO + setting: "This feature cannot be disabled by settings." + policy_exception_justification: "Not implemented." + })"); + request_ = request_context_->CreateRequest(params->url, DEFAULT_PRIORITY, + this, traffic_annotation); + request_->SetLoadFlags(LOAD_DISABLE_CACHE); + request_->set_allow_credentials(false); + + if (!params->extra_request_headers.IsEmpty()) + request_->SetExtraRequestHeaders(params->extra_request_headers); + + if (params->http_request_method == "POST") { + DCHECK(!params->upload_content.empty()); + DCHECK(!params->upload_content_type.empty()); + + request_->set_method("POST"); + request_->SetExtraRequestHeaderByName(HttpRequestHeaders::kContentType, + params->upload_content_type, true); + + std::unique_ptr<UploadElementReader> reader(new UploadBytesElementReader( + params->upload_content.data(), params->upload_content.size())); + request_->set_upload( + ElementsUploadDataStream::CreateWithReader(std::move(reader), 0)); + } + + request_->Start(); + result_ = std::make_unique<OCSPRequestSessionResult>(); + AddRef(); // Release after |request_| deleted. + } + + void FinishLoad() { + DCHECK(GetOCSPIOLoop()->RunsTasksInCurrentSequence()); + { + base::AutoLock autolock(lock_); + finished_ = true; + } + request_context_ = nullptr; + request_.reset(); + GetOCSPIOLoop()->RemoveRequest(this); + + cv_.Signal(); + + Release(); // Balanced with StartLoad(). + } + + std::unique_ptr<URLRequest> request_; // The actual request this wraps + scoped_refptr<IOBuffer> buffer_; // Read buffer + URLRequestContext* request_context_; + + std::unique_ptr<OCSPRequestSessionResult> result_; + bool finished_ = false; + + // |lock_| protects |finished_|. + mutable base::Lock lock_; + base::ConditionVariable cv_; +}; + +OCSPIOLoop::OCSPIOLoop() = default; + +void OCSPIOLoop::StartUsing() { + base::AutoLock autolock(lock_); + DCHECK(base::MessageLoopCurrentForIO::IsSet()); + io_task_runner_ = base::SequencedTaskRunnerHandle::Get(); +} + +void OCSPIOLoop::Shutdown() { + // Safe to read outside lock since we only write on IO thread anyway. + DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); + + // Prevent the worker thread from trying to access |io_task_runner_|. + { + base::AutoLock autolock(lock_); + io_task_runner_ = nullptr; + } + + CancelAllRequests(); + + SetOCSPRequestSessionDelegateFactory(nullptr); +} + +void OCSPIOLoop::PostTaskToIOLoop(const base::Location& from_here, + base::OnceClosure task) { + base::AutoLock autolock(lock_); + if (io_task_runner_) + io_task_runner_->PostTask(from_here, std::move(task)); +} + +void OCSPIOLoop::AddRequest( + OCSPRequestSessionDelegateURLRequest* request_delegate) { + DCHECK(!base::Contains(request_delegates_, request_delegate)); + request_delegates_.insert(request_delegate); +} + +void OCSPIOLoop::RemoveRequest( + OCSPRequestSessionDelegateURLRequest* request_delegate) { + DCHECK(base::Contains(request_delegates_, request_delegate)); + request_delegates_.erase(request_delegate); +} + +bool OCSPIOLoop::RunsTasksInCurrentSequence() { + base::AutoLock autolock(lock_); + return io_task_runner_ && io_task_runner_->RunsTasksInCurrentSequence(); +} + +void OCSPIOLoop::CancelAllRequests() { + // CancelLoad() always removes the request from the requests_ + // set synchronously. + while (!request_delegates_.empty()) + (*request_delegates_.begin())->CancelLoad(); +} + +class OCSPRequestSessionDelegateURLRequestFactory + : public OCSPRequestSessionDelegateFactory { + public: + OCSPRequestSessionDelegateURLRequestFactory( + URLRequestContext* request_context) + : request_context_(request_context) {} + scoped_refptr<OCSPRequestSessionDelegate> CreateOCSPRequestSessionDelegate() + override { + return base::MakeRefCounted<OCSPRequestSessionDelegateURLRequest>( + request_context_); + } + + private: + ~OCSPRequestSessionDelegateURLRequestFactory() override = default; + URLRequestContext* request_context_; +}; + +void SetURLRequestContextForNSSHttpIO(URLRequestContext* request_context) { + if (request_context) { + SetOCSPRequestSessionDelegateFactory( + base::MakeRefCounted<OCSPRequestSessionDelegateURLRequestFactory>( + request_context)); + } else { + SetOCSPRequestSessionDelegateFactory(nullptr); + } + + if (request_context) { + GetOCSPIOLoop()->StartUsing(); + } else { + GetOCSPIOLoop()->Shutdown(); + } +} +} // namespace net
diff --git a/net/cert_net/nss_ocsp_session_url_request.h b/net/cert_net/nss_ocsp_session_url_request.h new file mode 100644 index 0000000..c5f8f2a --- /dev/null +++ b/net/cert_net/nss_ocsp_session_url_request.h
@@ -0,0 +1,27 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_CERT_NET_NSS_OCSP_SESSION_URL_REQUEST_H_ +#define NET_CERT_NET_NSS_OCSP_SESSION_URL_REQUEST_H_ + +#include "net/base/net_export.h" +#include "net/url_request/url_request_context.h" + +namespace net { + +class URLRequestContext; + +// Sets the URLRequestContext and MessageLoop for HTTP requests issued by NSS +// (i.e. OCSP, CA certificate and CRL fetches). Must be called again with +// |request_context|=nullptr before the URLRequestContext is destroyed. +// Must be called from IO task runner. +// This will call SetOCSPRequestSessionDelegateFactory in nss_ocsp.h with a new +// factory instance using |request_context|, or call +// SetOCSPRequestSessionFactory with nullptr if |request_context|=nullptr. +NET_EXPORT void SetURLRequestContextForNSSHttpIO( + URLRequestContext* request_context); + +} // namespace net + +#endif // NET_CERT_NET_NSS_OCSP_SESSION_URL_REQUEST_H_
diff --git a/net/cert_net/nss_ocsp_unittest.cc b/net/cert_net/nss_ocsp_unittest.cc index fec8a17..22170ee 100644 --- a/net/cert_net/nss_ocsp_unittest.cc +++ b/net/cert_net/nss_ocsp_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "net/cert_net/nss_ocsp.h" +#include "net/cert_net/nss_ocsp_session_url_request.h" #include <string> #include <utility>
diff --git a/net/log/net_log_source_type_list.h b/net/log/net_log_source_type_list.h index 2abd3ace..f283199 100644 --- a/net/log/net_log_source_type_list.h +++ b/net/log/net_log_source_type_list.h
@@ -44,3 +44,4 @@ SOURCE_TYPE(COOKIE_STORE) SOURCE_TYPE(HTTP_AUTH_CONTROLLER) SOURCE_TYPE(HTTP3_SESSION) +SOURCE_TYPE(QUIC_TRANSPORT_CLIENT)
diff --git a/net/quic/quic_transport_client.cc b/net/quic/quic_transport_client.cc new file mode 100644 index 0000000..7227f73 --- /dev/null +++ b/net/quic/quic_transport_client.cc
@@ -0,0 +1,387 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/quic/quic_transport_client.h" + +#include "base/threading/thread_task_runner_handle.h" +#include "net/quic/address_utils.h" +#include "net/quic/crypto/proof_verifier_chromium.h" +#include "net/quic/quic_chromium_alarm_factory.h" +#include "net/third_party/quiche/src/quic/core/quic_connection.h" +#include "net/third_party/quiche/src/quic/core/quic_utils.h" +#include "net/url_request/url_request_context.h" + +namespace net { + +namespace { +std::set<std::string> HostsFromOrigins(std::set<HostPortPair> origins) { + std::set<std::string> hosts; + for (const auto& origin : origins) { + hosts.insert(origin.host()); + } + return hosts; +} +} // namespace + +QuicTransportClient::QuicTransportClient( + const GURL& url, + const url::Origin& origin, + Visitor* visitor, + const NetworkIsolationKey& isolation_key, + URLRequestContext* context) + : url_(url), + origin_(origin), + isolation_key_(isolation_key), + context_(context), + visitor_(visitor), + // TODO(vasilvv): pass ClientSocketFactory through QuicContext. + client_socket_factory_(ClientSocketFactory::GetDefaultFactory()), + quic_context_(context->quic_context()), + net_log_(NetLogWithSource::Make(context->net_log(), + NetLogSourceType::QUIC_TRANSPORT_CLIENT)), + task_runner_(base::ThreadTaskRunnerHandle::Get().get()), + alarm_factory_( + std::make_unique<QuicChromiumAlarmFactory>(task_runner_, + quic_context_->clock())), + // TODO(vasilvv): proof verifier should have proper error reporting + // (currently, all certificate verification errors result in "TLS + // handshake error" even when more detailed message is available). This + // requires implementing ProofHandler::OnProofVerifyDetailsAvailable. + crypto_config_( + std::make_unique<ProofVerifierChromium>( + context->cert_verifier(), + context->ct_policy_enforcer(), + context->transport_security_state(), + context->cert_transparency_verifier(), + std::set<std::string>(HostsFromOrigins( + quic_context_->params()->origins_to_force_quic_on))), + /* session_cache */ nullptr) {} + +QuicTransportClient::~QuicTransportClient() = default; + +QuicTransportClient::Visitor::~Visitor() = default; + +void QuicTransportClient::Connect() { + if (state_ != NEW || next_connect_state_ != CONNECT_STATE_NONE) { + NOTREACHED(); + return; + } + + TransitionToState(CONNECTING); + next_connect_state_ = CONNECT_STATE_INIT; + DoLoop(OK); +} + +quic::QuicTransportClientSession* QuicTransportClient::session() { + if (session_ == nullptr || !session_->IsSessionReady()) + return nullptr; + return session_.get(); +} + +void QuicTransportClient::DoLoop(int rv) { + do { + ConnectState connect_state = next_connect_state_; + next_connect_state_ = CONNECT_STATE_NONE; + switch (connect_state) { + case CONNECT_STATE_INIT: + DCHECK_EQ(rv, OK); + rv = DoInit(); + break; + case CONNECT_STATE_CHECK_PROXY: + DCHECK_EQ(rv, OK); + rv = DoCheckProxy(); + break; + case CONNECT_STATE_CHECK_PROXY_COMPLETE: + rv = DoCheckProxyComplete(rv); + break; + case CONNECT_STATE_RESOLVE_HOST: + DCHECK_EQ(rv, OK); + rv = DoResolveHost(); + break; + case CONNECT_STATE_RESOLVE_HOST_COMPLETE: + rv = DoResolveHostComplete(rv); + break; + case CONNECT_STATE_CONNECT: + DCHECK_EQ(rv, OK); + rv = DoConnect(); + break; + case CONNECT_STATE_CONFIRM_CONNECTION: + DCHECK_EQ(rv, OK); + rv = DoConfirmConnection(); + break; + default: + NOTREACHED() << "Invalid state reached: " << connect_state; + rv = ERR_FAILED; + break; + } + } while (rv == OK && next_connect_state_ != CONNECT_STATE_NONE); + + if (rv == OK || rv == ERR_IO_PENDING) + return; + if (error_.net_error == OK) + error_.net_error = rv; + TransitionToState(FAILED); +} + +int QuicTransportClient::DoInit() { + if (!url_.is_valid()) + return ERR_INVALID_URL; + if (url_.scheme_piece() != url::kQuicTransportScheme) + return ERR_DISALLOWED_URL_SCHEME; + + // TODO(vasilvv): check if QUIC is disabled by policy. + + for (quic::ParsedQuicVersion& version : + quic_context_->params()->supported_versions) { + // QuicTransport requires TLS-style ALPN. + if (version.handshake_protocol != quic::PROTOCOL_TLS1_3) + continue; + if (!quic::VersionSupportsMessageFrames(version.transport_version)) + continue; + supported_versions_.push_back(version); + } + if (supported_versions_.empty()) { + DLOG(ERROR) << "Attempted using QuicTransport with no compatible QUIC " + "versions available"; + return ERR_NOT_IMPLEMENTED; + } + + next_connect_state_ = CONNECT_STATE_CHECK_PROXY; + return OK; +} + +int QuicTransportClient::DoCheckProxy() { + next_connect_state_ = CONNECT_STATE_CHECK_PROXY_COMPLETE; + return context_->proxy_resolution_service()->ResolveProxy( + url_, /* method */ "CONNECT", isolation_key_, &proxy_info_, + base::BindOnce(&QuicTransportClient::DoLoop, base::Unretained(this)), + &proxy_resolution_request_, net_log_); +} + +int QuicTransportClient::DoCheckProxyComplete(int rv) { + if (rv != OK) + return rv; + + if (!proxy_info_.is_direct()) + return ERR_TUNNEL_CONNECTION_FAILED; + + next_connect_state_ = CONNECT_STATE_RESOLVE_HOST; + return OK; +} + +int QuicTransportClient::DoResolveHost() { + next_connect_state_ = CONNECT_STATE_RESOLVE_HOST_COMPLETE; + HostResolver::ResolveHostParameters parameters; + resolve_host_request_ = context_->host_resolver()->CreateRequest( + HostPortPair::FromURL(url_), isolation_key_, net_log_, base::nullopt); + return resolve_host_request_->Start( + base::BindOnce(&QuicTransportClient::DoLoop, base::Unretained(this))); +} + +int QuicTransportClient::DoResolveHostComplete(int rv) { + if (rv != OK) + return rv; + + DCHECK(resolve_host_request_->GetAddressResults()); + next_connect_state_ = CONNECT_STATE_CONNECT; + return OK; +} + +int QuicTransportClient::DoConnect() { + int rv = OK; + + // TODO(vasilvv): consider unifying parts of this code with QuicSocketFactory + // (which currently has a lot of code specific to QuicChromiumClientSession). + socket_ = client_socket_factory_->CreateDatagramClientSocket( + DatagramSocket::DEFAULT_BIND, net_log_.net_log(), net_log_.source()); + if (quic_context_->params()->enable_socket_recv_optimization) + socket_->EnableRecvOptimization(); + socket_->UseNonBlockingIO(); + + IPEndPoint server_address = + *resolve_host_request_->GetAddressResults()->begin(); + rv = socket_->Connect(server_address); + if (rv != OK) + return rv; + + rv = socket_->SetReceiveBufferSize(kQuicSocketReceiveBufferSize); + if (rv != OK) + return rv; + + rv = socket_->SetDoNotFragment(); + if (rv == ERR_NOT_IMPLEMENTED) + rv = OK; + if (rv != OK) + return rv; + + rv = socket_->SetSendBufferSize(quic::kMaxOutgoingPacketSize * 20); + if (rv != OK) + return rv; + + quic::QuicConnectionId connection_id = + quic::QuicUtils::CreateRandomConnectionId( + quic_context_->random_generator()); + connection_ = std::make_unique<quic::QuicConnection>( + connection_id, ToQuicSocketAddress(server_address), + quic_context_->helper(), alarm_factory_.get(), + new QuicChromiumPacketWriter(socket_.get(), task_runner_), + /* owns_writer */ true, quic::Perspective::IS_CLIENT, + supported_versions_); + connection_->SetMaxPacketLength(quic_context_->params()->max_packet_length); + + session_ = std::make_unique<quic::QuicTransportClientSession>( + connection_.get(), this, InitializeQuicConfig(*quic_context_->params()), + supported_versions_, url_, &crypto_config_, origin_, this); + + packet_reader_ = std::make_unique<QuicChromiumPacketReader>( + socket_.get(), quic_context_->clock(), this, kQuicYieldAfterPacketsRead, + quic::QuicTime::Delta::FromMilliseconds( + kQuicYieldAfterDurationMilliseconds), + net_log_); + + session_->Initialize(); + packet_reader_->StartReading(); + session_->CryptoConnect(); + + next_connect_state_ = CONNECT_STATE_CONFIRM_CONNECTION; + return ERR_IO_PENDING; +} + +int QuicTransportClient::DoConfirmConnection() { + if (!connection_->connected() || !session_->IsSessionReady()) { + return ERR_QUIC_PROTOCOL_ERROR; + } + + TransitionToState(CONNECTED); + return OK; +} + +void QuicTransportClient::TransitionToState(State next_state) { + const State last_state = state_; + state_ = next_state; + switch (next_state) { + case CONNECTING: + DCHECK_EQ(last_state, NEW); + break; + + case CONNECTED: + DCHECK_EQ(last_state, CONNECTING); + visitor_->OnConnected(); + break; + + case CLOSED: + DCHECK_EQ(last_state, CONNECTED); + visitor_->OnClosed(); + break; + + case FAILED: + // "[T]he user agent that runs untrusted clients MUST NOT provide any + // detailed error information until the server has confirmed that it is a + // WebTransport endpoint." + // https://tools.ietf.org/html/draft-vvv-webtransport-overview-01#section-7 + if (session_ != nullptr) { + error_.safe_to_report_details = session_->alpn_received(); + } + + DCHECK_NE(error_.net_error, OK); + if (error_.details.empty()) { + error_.details = ErrorToString(error_.net_error); + } + + if (last_state == CONNECTING) { + visitor_->OnConnectionFailed(); + break; + } + DCHECK_EQ(last_state, CONNECTED); + visitor_->OnError(); + break; + + default: + NOTREACHED() << "Invalid state reached: " << next_state; + break; + } +} + +void QuicTransportClient::OnSessionReady() { + DCHECK_EQ(next_connect_state_, CONNECT_STATE_CONFIRM_CONNECTION); + DoLoop(OK); +} + +void QuicTransportClient::OnIncomingBidirectionalStreamAvailable() { + visitor_->OnIncomingBidirectionalStreamAvailable(); +} + +void QuicTransportClient::OnIncomingUnidirectionalStreamAvailable() { + visitor_->OnIncomingUnidirectionalStreamAvailable(); +} + +void QuicTransportClient::OnReadError(int result, + const DatagramClientSocket* socket) { + error_.net_error = result; + connection_->CloseConnection(quic::QUIC_PACKET_READ_ERROR, + ErrorToString(result), + quic::ConnectionCloseBehavior::SILENT_CLOSE); +} + +bool QuicTransportClient::OnPacket( + const quic::QuicReceivedPacket& packet, + const quic::QuicSocketAddress& local_address, + const quic::QuicSocketAddress& peer_address) { + session_->ProcessUdpPacket(local_address, peer_address, packet); + return connection_->connected(); +} + +int QuicTransportClient::HandleWriteError( + int error_code, + scoped_refptr<QuicChromiumPacketWriter::ReusableIOBuffer> /*last_packet*/) { + return error_code; +} + +void QuicTransportClient::OnWriteError(int error_code) { + error_.net_error = error_code; + connection_->OnWriteError(error_code); +} + +void QuicTransportClient::OnWriteUnblocked() { + connection_->OnCanWrite(); +} + +void QuicTransportClient::OnConnectionClosed( + quic::QuicConnectionId /*server_connection_id*/, + quic::QuicErrorCode error, + const std::string& error_details, + quic::ConnectionCloseSource /*source*/) { + if (error == quic::QUIC_NO_ERROR) { + TransitionToState(CLOSED); + return; + } + + if (error_.net_error == OK) + error_.net_error = ERR_QUIC_PROTOCOL_ERROR; + error_.quic_error = error; + error_.details = error_details; + + if (state_ == CONNECTING) { + DCHECK_EQ(next_connect_state_, CONNECT_STATE_CONFIRM_CONNECTION); + DoLoop(OK); + return; + } + + TransitionToState(FAILED); +} + +std::string QuicTransportErrorToString(const QuicTransportError& error) { + std::string message = + ExtendedErrorToString(error.net_error, error.quic_error); + if (error.details == message) + return message; + return quiche::QuicheStrCat(message, " (", error.details, ")"); +} + +std::ostream& operator<<(std::ostream& os, const QuicTransportError& error) { + os << QuicTransportErrorToString(error); + return os; +} + +} // namespace net
diff --git a/net/quic/quic_transport_client.h b/net/quic/quic_transport_client.h new file mode 100644 index 0000000..92cd808 --- /dev/null +++ b/net/quic/quic_transport_client.h
@@ -0,0 +1,207 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUIC_QUIC_TRANSPORT_CLIENT_H_ +#define NET_QUIC_QUIC_TRANSPORT_CLIENT_H_ + +#include "base/memory/weak_ptr.h" +#include "net/base/network_isolation_key.h" +#include "net/dns/host_resolver.h" +#include "net/log/net_log_with_source.h" +#include "net/proxy_resolution/proxy_info.h" +#include "net/proxy_resolution/proxy_resolution_service.h" +#include "net/quic/quic_chromium_packet_reader.h" +#include "net/quic/quic_chromium_packet_writer.h" +#include "net/quic/quic_context.h" +#include "net/socket/client_socket_factory.h" +#include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_client_config.h" +#include "net/third_party/quiche/src/quic/core/quic_config.h" +#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_client_session.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace net { + +class QuicChromiumAlarmFactory; +class URLRequestContext; + +struct NET_EXPORT QuicTransportError { + // |net_error| is always set to a meaningful value. + int net_error = OK; + + // |quic_error| is set to a QUIC error, or to quic::QUIC_NO_ERROR if the error + // originates non-QUIC parts of the stack. + quic::QuicErrorCode quic_error = quic::QUIC_NO_ERROR; + + // Human-readable error summary. + std::string details; + + // QuicTransport requires that the connection errors have to be + // undistinguishable until the peer is confirmed to be a QuicTransport + // endpoint. See https://wicg.github.io/web-transport/#protocol-security + bool safe_to_report_details = false; +}; + +NET_EXPORT +std::string QuicTransportErrorToString(const QuicTransportError& error); + +NET_EXPORT +std::ostream& operator<<(std::ostream& os, const QuicTransportError& error); + +// QuicTransportClient is the top-level API for QuicTransport in //net. +class NET_EXPORT QuicTransportClient + : public quic::QuicTransportClientSession::ClientVisitor, + public QuicChromiumPacketReader::Visitor, + public QuicChromiumPacketWriter::Delegate, + public quic::QuicSession::Visitor { + public: + // + // Diagram of allowed state transitions: + // + // NEW -> CONNECTING -> CONNECTED -> CLOSED + // | | + // | | + // +---> FAILED <---+ + // + enum State { + // The client object has been created but Connect() has not been called. + NEW, + // Connection establishment is in progress. No application data can be sent + // or received at this point. + CONNECTING, + // The connection has been established and application data can be sent and + // received. + CONNECTED, + // The connection has been closed gracefully by either endpoint. + CLOSED, + // The connection has been closed abruptly. + FAILED, + }; + + class NET_EXPORT Visitor { + public: + virtual ~Visitor(); + + // State change notifiers. + virtual void OnConnected() = 0; // CONNECTING -> CONNECTED + virtual void OnConnectionFailed() = 0; // CONNECTING -> FAILED + virtual void OnClosed() = 0; // CONNECTED -> CLOSED + virtual void OnError() = 0; // CONNECTED -> FAILED + + virtual void OnIncomingBidirectionalStreamAvailable() = 0; + virtual void OnIncomingUnidirectionalStreamAvailable() = 0; + }; + + // |visitor| and |context| must outlive this object. + QuicTransportClient(const GURL& url, + const url::Origin& origin, + Visitor* visitor, + const NetworkIsolationKey& isolation_key, + URLRequestContext* context); + ~QuicTransportClient() override; + + State state() const { return state_; } + const QuicTransportError& error() const { return error_; } + + // Connect() is an asynchronous operation. Once the operation is finished, + // OnConnected() or OnConnectionFailed() is called on the Visitor. + void Connect(); + + quic::QuicTransportClientSession* session(); + + // QuicTransportClientSession::ClientVisitor methods. + void OnSessionReady() override; + void OnIncomingBidirectionalStreamAvailable() override; + void OnIncomingUnidirectionalStreamAvailable() override; + + // QuicChromiumPacketReader::Visitor methods. + void OnReadError(int result, const DatagramClientSocket* socket) override; + bool OnPacket(const quic::QuicReceivedPacket& packet, + const quic::QuicSocketAddress& local_address, + const quic::QuicSocketAddress& peer_address) override; + + // QuicChromiumPacketWriter::Delegate methods. + int HandleWriteError(int error_code, + scoped_refptr<QuicChromiumPacketWriter::ReusableIOBuffer> + last_packet) override; + void OnWriteError(int error_code) override; + void OnWriteUnblocked() override; + + // QuicSession::Visitor methods. + void OnConnectionClosed(quic::QuicConnectionId server_connection_id, + quic::QuicErrorCode error, + const std::string& error_details, + quic::ConnectionCloseSource source) override; + void OnWriteBlocked( + quic::QuicBlockedWriterInterface* /*blocked_writer*/) override {} + void OnRstStreamReceived(const quic::QuicRstStreamFrame& /*frame*/) override { + } + void OnStopSendingReceived( + const quic::QuicStopSendingFrame& /*frame*/) override {} + + private: + // State of the connection establishment process. + enum ConnectState { + CONNECT_STATE_NONE, + CONNECT_STATE_INIT, + CONNECT_STATE_CHECK_PROXY, + CONNECT_STATE_CHECK_PROXY_COMPLETE, + CONNECT_STATE_RESOLVE_HOST, + CONNECT_STATE_RESOLVE_HOST_COMPLETE, + CONNECT_STATE_CONNECT, + CONNECT_STATE_CONFIRM_CONNECTION, + }; + + // DoLoop processing the Connect() call. + void DoLoop(int rv); + // Verifies the basic preconditions for setting up the connection. + int DoInit(); + // Verifies that there is no mandatory proxy configured for the specified URL. + int DoCheckProxy(); + int DoCheckProxyComplete(int rv); + // Resolves the hostname in the URL. + int DoResolveHost(); + int DoResolveHostComplete(int rv); + // Establishes the QUIC connection. + int DoConnect(); + // Verifies that the connection has succeeded. + int DoConfirmConnection(); + + void TransitionToState(State next_state); + + const GURL url_; + const url::Origin origin_; + const NetworkIsolationKey isolation_key_; + URLRequestContext* const context_; // Unowned. + Visitor* const visitor_; // Unowned. + + ClientSocketFactory* const client_socket_factory_; + QuicContext* const quic_context_; + NetLogWithSource net_log_; + base::SequencedTaskRunner* task_runner_; + + quic::ParsedQuicVersionVector supported_versions_; + // TODO(vasilvv): move some of those into QuicContext. + std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_; + quic::QuicCryptoClientConfig crypto_config_; + + State state_ = NEW; + ConnectState next_connect_state_ = CONNECT_STATE_NONE; + QuicTransportError error_; + + ProxyInfo proxy_info_; + std::unique_ptr<ProxyResolutionService::Request> proxy_resolution_request_; + std::unique_ptr<HostResolver::ResolveHostRequest> resolve_host_request_; + + std::unique_ptr<DatagramClientSocket> socket_; + std::unique_ptr<quic::QuicConnection> connection_; + std::unique_ptr<quic::QuicTransportClientSession> session_; + std::unique_ptr<QuicChromiumPacketReader> packet_reader_; + + base::WeakPtrFactory<QuicTransportClient> weak_factory_{this}; +}; + +} // namespace net + +#endif // NET_QUIC_QUIC_TRANSPORT_CLIENT_H_
diff --git a/net/quic/quic_transport_end_to_end_test.cc b/net/quic/quic_transport_end_to_end_test.cc new file mode 100644 index 0000000..43be115 --- /dev/null +++ b/net/quic/quic_transport_end_to_end_test.cc
@@ -0,0 +1,151 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/quic/quic_transport_client.h" + +#include <memory> + +#include "base/threading/thread_task_runner_handle.h" +#include "net/cert/mock_cert_verifier.h" +#include "net/dns/mock_host_resolver.h" +#include "net/test/test_data_directory.h" +#include "net/test/test_with_task_environment.h" +#include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h" +#include "net/tools/quic/quic_transport_simple_server.h" +#include "net/url_request/url_request_context.h" +#include "net/url_request/url_request_context_builder.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { +namespace test { +namespace { + +class MockVisitor : public QuicTransportClient::Visitor { + public: + MOCK_METHOD0(OnConnected, void()); + MOCK_METHOD0(OnConnectionFailed, void()); + MOCK_METHOD0(OnClosed, void()); + MOCK_METHOD0(OnError, void()); + + MOCK_METHOD0(OnIncomingBidirectionalStreamAvailable, void()); + MOCK_METHOD0(OnIncomingUnidirectionalStreamAvailable, void()); +}; + +class QuicTransportEndToEndTest : public TestWithTaskEnvironment { + public: + QuicTransportEndToEndTest() { + origin_ = url::Origin::Create(GURL{"https://example.org"}); + isolation_key_ = NetworkIsolationKey(origin_, origin_); + + URLRequestContextBuilder builder; + builder.set_proxy_resolution_service( + ProxyResolutionService::CreateDirect()); + + auto cert_verifier = std::make_unique<MockCertVerifier>(); + cert_verifier->set_default_result(OK); + builder.SetCertVerifier(std::move(cert_verifier)); + + auto host_resolver = std::make_unique<MockHostResolver>(); + host_resolver->rules()->AddRule("test.example.com", "127.0.0.1"); + builder.set_host_resolver(std::move(host_resolver)); + + auto quic_context = std::make_unique<QuicContext>(); + quic_context->params()->supported_versions.push_back( + quic::ParsedQuicVersion{quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_99}); + // This is required to bypass the check that only allows known certificate + // roots in QUIC. + quic_context->params()->origins_to_force_quic_on.insert( + HostPortPair("test.example.com", 0)); + builder.set_quic_context(std::move(quic_context)); + + context_ = builder.Build(); + + // By default, quit on error instead of waiting for RunLoop() to time out. + ON_CALL(visitor_, OnConnectionFailed()).WillByDefault([this]() { + LOG(INFO) << "Connection failed: " << client_->error(); + run_loop_->Quit(); + }); + ON_CALL(visitor_, OnError()).WillByDefault([this]() { + LOG(INFO) << "Connection error: " << client_->error(); + run_loop_->Quit(); + }); + + StartServer(); + } + + GURL GetURL(const std::string& suffix) { + return GURL{quiche::QuicheStrCat( + "quic-transport://test.example.com:", port_, suffix)}; + } + + void StartServer() { + server_ = std::make_unique<QuicTransportSimpleServer>( + /* port */ 0, std::vector<url::Origin>({origin_}), + quic::test::crypto_test_utils::ProofSourceForTesting()); + ASSERT_EQ(EXIT_SUCCESS, server_->Start()); + port_ = server_->server_address().port(); + } + + void Run() { + run_loop_ = std::make_unique<base::RunLoop>(); + run_loop_->Run(); + } + + auto StopRunning() { + return [this]() { run_loop_->Quit(); }; + } + + protected: + std::unique_ptr<URLRequestContext> context_; + std::unique_ptr<QuicTransportClient> client_; + MockVisitor visitor_; + std::unique_ptr<QuicTransportSimpleServer> server_; + std::unique_ptr<base::RunLoop> run_loop_; + + int port_ = 0; + url::Origin origin_; + NetworkIsolationKey isolation_key_; +}; + +TEST_F(QuicTransportEndToEndTest, Connect) { + client_ = std::make_unique<QuicTransportClient>( + GetURL("/discard"), origin_, &visitor_, isolation_key_, context_.get()); + client_->Connect(); + EXPECT_CALL(visitor_, OnConnected()).WillOnce(StopRunning()); + Run(); + ASSERT_TRUE(client_->session() != nullptr); + EXPECT_TRUE(client_->session()->IsSessionReady()); +} + +TEST_F(QuicTransportEndToEndTest, EchoUnidirectionalStream) { + client_ = std::make_unique<QuicTransportClient>( + GetURL("/echo"), origin_, &visitor_, isolation_key_, context_.get()); + client_->Connect(); + EXPECT_CALL(visitor_, OnConnected()).WillOnce(StopRunning()); + Run(); + + quic::QuicTransportClientSession* session = client_->session(); + ASSERT_TRUE(session != nullptr); + ASSERT_TRUE(session->CanOpenNextOutgoingUnidirectionalStream()); + quic::QuicTransportStream* stream_out = + session->OpenOutgoingUnidirectionalStream(); + EXPECT_TRUE(stream_out->Write("test")); + EXPECT_TRUE(stream_out->SendFin()); + + EXPECT_CALL(visitor_, OnIncomingUnidirectionalStreamAvailable()) + .WillOnce(StopRunning()); + Run(); + + quic::QuicTransportStream* stream_in = + session->AcceptIncomingUnidirectionalStream(); + ASSERT_TRUE(stream_in != nullptr); + std::string data; + stream_in->Read(&data); + EXPECT_EQ("test", data); +} + +} // namespace +} // namespace test +} // namespace net
diff --git a/net/tools/cert_verify_tool/cert_verify_tool.cc b/net/tools/cert_verify_tool/cert_verify_tool.cc index 8049919..69d70e4 100644 --- a/net/tools/cert_verify_tool/cert_verify_tool.cc +++ b/net/tools/cert_verify_tool/cert_verify_tool.cc
@@ -36,6 +36,7 @@ #if defined(USE_NSS_CERTS) #include "net/cert_net/nss_ocsp.h" +#include "net/cert_net/nss_ocsp_session_url_request.h" #endif namespace {
diff --git a/net/tools/quic/quic_transport_simple_server.cc b/net/tools/quic/quic_transport_simple_server.cc index 6eb5125a..b1d9d8fb 100644 --- a/net/tools/quic/quic_transport_simple_server.cc +++ b/net/tools/quic/quic_transport_simple_server.cc
@@ -14,7 +14,6 @@ #include "net/quic/quic_chromium_alarm_factory.h" #include "net/quic/quic_chromium_connection_helper.h" #include "net/socket/udp_server_socket.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_default_proof_providers.h" #include "net/third_party/quiche/src/quic/tools/quic_transport_simple_server_dispatcher.h" #include "net/tools/quic/quic_simple_server_packet_writer.h" #include "net/tools/quic/quic_simple_server_socket.h" @@ -52,13 +51,14 @@ QuicTransportSimpleServer::QuicTransportSimpleServer( int port, - std::vector<url::Origin> accepted_origins) + std::vector<url::Origin> accepted_origins, + std::unique_ptr<quic::ProofSource> proof_source) : port_(port), version_manager_({ParsedQuicVersion{PROTOCOL_TLS1_3, QUIC_VERSION_99}}), clock_(QuicChromiumClock::GetInstance()), crypto_config_(kSourceAddressTokenSecret, quic::QuicRandom::GetInstance(), - quic::CreateDefaultProofSource(), + std::move(proof_source), quic::KeyExchangeSource::Default()), dispatcher_(&config_, &crypto_config_, @@ -76,7 +76,7 @@ QuicTransportSimpleServer::~QuicTransportSimpleServer() {} -int QuicTransportSimpleServer::Run() { +int QuicTransportSimpleServer::Start() { socket_ = CreateQuicSimpleServerSocket( IPEndPoint{IPAddress::IPv6AllZeros(), port_}, &server_address_); if (socket_ == nullptr) @@ -86,7 +86,6 @@ new QuicSimpleServerPacketWriter(socket_.get(), &dispatcher_)); ScheduleReadPackets(); - base::RunLoop().Run(); return EXIT_SUCCESS; }
diff --git a/net/tools/quic/quic_transport_simple_server.h b/net/tools/quic/quic_transport_simple_server.h index b2b8c250..1543454 100644 --- a/net/tools/quic/quic_transport_simple_server.h +++ b/net/tools/quic/quic_transport_simple_server.h
@@ -25,10 +25,13 @@ class QuicTransportSimpleServer { public: QuicTransportSimpleServer(int port, - std::vector<url::Origin> accepted_origins); + std::vector<url::Origin> accepted_origins, + std::unique_ptr<quic::ProofSource> proof_source); ~QuicTransportSimpleServer(); - int Run(); + int Start(); + + IPEndPoint server_address() const { return server_address_; } private: // Schedules a ReadPackets() call on the next iteration of the event loop.
diff --git a/net/tools/quic/quic_transport_simple_server_bin.cc b/net/tools/quic/quic_transport_simple_server_bin.cc index fc4cd5aa..f7f995b 100644 --- a/net/tools/quic/quic_transport_simple_server_bin.cc +++ b/net/tools/quic/quic_transport_simple_server_bin.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/strings/string_split.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_default_proof_providers.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" #include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h" #include "net/tools/quic/quic_transport_simple_server.h" @@ -39,6 +40,12 @@ } net::QuicTransportSimpleServer server(GetQuicFlag(FLAGS_port), - accepted_origins); - return server.Run(); + accepted_origins, + quic::CreateDefaultProofSource()); + if (server.Start() != EXIT_SUCCESS) + return EXIT_FAILURE; + + base::RunLoop run_loop; + run_loop.Run(); + return EXIT_SUCCESS; }
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index bcb7919f..f37c355 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -81,6 +81,7 @@ #include "net/cert/test_root_certs.h" #include "net/cert/x509_util.h" #include "net/cert_net/cert_net_fetcher_url_request.h" +#include "net/cert_net/nss_ocsp_session_url_request.h" #include "net/cookies/canonical_cookie_test_helpers.h" #include "net/cookies/cookie_monster.h" #include "net/cookies/cookie_store_test_helpers.h"
diff --git a/printing/printing_features_chromeos.cc b/printing/printing_features_chromeos.cc index b2826d6b..785161c 100644 --- a/printing/printing_features_chromeos.cc +++ b/printing/printing_features_chromeos.cc
@@ -8,6 +8,6 @@ // Enables Advanced PPD Attributes. const base::Feature kAdvancedPpdAttributes{"AdvancedPpdAttributes", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; } // namespace printing
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index a19f24e..9199062 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -138,6 +138,7 @@ #if defined(USE_NSS_CERTS) #include "net/cert_net/nss_ocsp.h" +#include "net/cert_net/nss_ocsp_session_url_request.h" #endif // defined(USE_NSS_CERTS) #if defined(OS_ANDROID)
diff --git a/storage/browser/blob/blob_impl.cc b/storage/browser/blob/blob_impl.cc index f52eb8ac..51ef4cfe 100644 --- a/storage/browser/blob/blob_impl.cc +++ b/storage/browser/blob/blob_impl.cc
@@ -11,6 +11,8 @@ #include "base/bind.h" #include "base/containers/span.h" +#include "base/files/file_util.h" +#include "base/task/post_task.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/io_buffer.h" #include "storage/browser/blob/blob_data_handle.h" @@ -128,6 +130,7 @@ [](BlobDataHandle handle, ReadSideDataCallback callback, BlobStatus status) { if (status != BlobStatus::DONE) { + DCHECK(BlobStatusIsError(status)); std::move(callback).Run(base::nullopt); return; } @@ -165,6 +168,68 @@ *handle_, std::move(callback))); } +void BlobImpl::CaptureSnapshot(CaptureSnapshotCallback callback) { + handle_->RunOnConstructionComplete(base::BindOnce( + [](base::WeakPtr<BlobImpl> blob_impl, CaptureSnapshotCallback callback, + BlobStatus status) { + if (!blob_impl) { + // No need to call callback, since blob_impl is only destroyed if the + // mojo pipe is disconnected. + return; + } + + auto* handle = blob_impl->handle_.get(); + + if (status != BlobStatus::DONE) { + DCHECK(BlobStatusIsError(status)); + std::move(callback).Run(0, base::nullopt); + return; + } + + auto snapshot = handle->CreateSnapshot(); + // Only blobs consisting of a single file can have a modification + // time. + const auto& items = snapshot->items(); + if (items.size() != 1) { + std::move(callback).Run(handle->size(), base::nullopt); + return; + } + + const auto& item = items[0]; + if (item->type() != BlobDataItem::Type::kFile) { + std::move(callback).Run(handle->size(), base::nullopt); + return; + } + + // TODO(mek): Use cached snapshot state, rather than always looking up + // the current size and modification time. + + struct SizeAndTime { + uint64_t size; + base::Optional<base::Time> time; + }; + base::PostTaskAndReplyWithResult( + FROM_HERE, + {base::ThreadPool(), base::MayBlock(), + base::TaskPriority::USER_VISIBLE}, + base::BindOnce( + [](const base::FilePath& path) { + base::File::Info info; + if (!base::GetFileInfo(path, &info)) + return SizeAndTime{0, base::nullopt}; + return SizeAndTime{info.size, info.last_modified}; + }, + item->path()), + base::BindOnce( + [](CaptureSnapshotCallback callback, + const SizeAndTime& result) { + std::move(callback).Run(result.size, result.time); + }, + std::move(callback))); + }, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + void BlobImpl::GetInternalUUID(GetInternalUUIDCallback callback) { std::move(callback).Run(handle_->uuid()); }
diff --git a/storage/browser/blob/blob_impl.h b/storage/browser/blob/blob_impl.h index 8243c0e..1cdb97f 100644 --- a/storage/browser/blob/blob_impl.h +++ b/storage/browser/blob/blob_impl.h
@@ -43,6 +43,7 @@ mojo::ScopedDataPipeProducerHandle handle, mojo::PendingRemote<blink::mojom::BlobReaderClient> client) override; void ReadSideData(ReadSideDataCallback callback) override; + void CaptureSnapshot(CaptureSnapshotCallback callback) override; void GetInternalUUID(GetInternalUUIDCallback callback) override; // network::mojom::DataPipeGetter:
diff --git a/storage/browser/test/fake_blob.cc b/storage/browser/test/fake_blob.cc index 2c70ad1..08b8f9f1d 100644 --- a/storage/browser/test/fake_blob.cc +++ b/storage/browser/test/fake_blob.cc
@@ -41,6 +41,10 @@ NOTREACHED(); } +void FakeBlob::CaptureSnapshot(CaptureSnapshotCallback) { + NOTREACHED(); +} + void FakeBlob::GetInternalUUID(GetInternalUUIDCallback callback) { std::move(callback).Run(uuid_); }
diff --git a/storage/browser/test/fake_blob.h b/storage/browser/test/fake_blob.h index 620facf..158a4aa 100644 --- a/storage/browser/test/fake_blob.h +++ b/storage/browser/test/fake_blob.h
@@ -27,6 +27,7 @@ void ReadAll(mojo::ScopedDataPipeProducerHandle, mojo::PendingRemote<blink::mojom::BlobReaderClient>) override; void ReadSideData(ReadSideDataCallback) override; + void CaptureSnapshot(CaptureSnapshotCallback) override; void GetInternalUUID(GetInternalUUIDCallback callback) override; private:
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 081dcda4..6d7747f 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10074,6 +10074,39 @@ } ] }, + "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "intel-hd-630-ubuntu-stable", + "os": "linux-intel-stable", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false + } + } + ] + }, "Linux FYI SkiaRenderer Vulkan (Intel HD 630)": { "gtest_tests": [ {
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 1b18339c..cf3822c 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -2307,45 +2307,6 @@ { "args": [ "--gtest-benchmark-name", - "dawn_perf_tests", - "--shard-timeout=300" - ], - "isolate_name": "dawn_perf_tests", - "merge": { - "script": "//tools/perf/process_perf_results.py" - }, - "name": "dawn_perf_tests", - "override_compile_targets": [ - "dawn_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:5912-23.20.16.4877", - "os": "Windows-10-16299.309", - "pool": "chrome.tests.perf", - "synthetic_product_name": "OptiPlex 7050 (Dell Inc.)" - } - ], - "expiration": 7200, - "hard_timeout": 43200, - "ignore_task_failure": false, - "io_timeout": 21600, - "shards": 1 - }, - "trigger_script": { - "args": [ - "--multiple-dimension-script-verbose", - "True" - ], - "requires_simultaneous_shard_dispatch": true, - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - }, - { - "args": [ - "--gtest-benchmark-name", "media_perftests" ], "isolate_name": "media_perftests", @@ -2463,6 +2424,51 @@ } ] }, + "win-10_laptop_low_end-perf": { + "isolated_scripts": [ + { + "args": [ + "-v", + "--browser=release_x64", + "--upload-results", + "--test-shard-map-filename=win-10_laptop_low_end-perf_map.json", + "--run-ref-build", + "--assert-gpu-compositing" + ], + "isolate_name": "performance_test_suite", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", + "override_compile_targets": [ + "performance_test_suite" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:1616-20.19.15.5070", + "os": "Windows-10-18363.476", + "pool": "chrome.tests.perf" + } + ], + "expiration": 7200, + "hard_timeout": 43200, + "ignore_task_failure": false, + "io_timeout": 21600, + "shards": 26 + }, + "trigger_script": { + "args": [ + "--multiple-dimension-script-verbose", + "True" + ], + "requires_simultaneous_shard_dispatch": true, + "script": "//testing/trigger_scripts/perf_device_trigger.py" + } + } + ] + }, "win32-builder-perf": { "additional_compile_targets": [ "chromedriver"
diff --git a/testing/buildbot/filters/android.pie_arm64_rel.gl_tests.filter b/testing/buildbot/filters/android.pie_arm64_rel.gl_tests.filter index afc4e56..355db93 100644 --- a/testing/buildbot/filters/android.pie_arm64_rel.gl_tests.filter +++ b/testing/buildbot/filters/android.pie_arm64_rel.gl_tests.filter
@@ -16,7 +16,3 @@ -TranslatorVariants/EXTBlendFuncExtendedES3DrawTest.ESSL3BindSimpleVarAsArrayNoBind/1 -TranslatorVariants/EXTBlendFuncExtendedES3DrawTest.ESSL3Var/0 -TranslatorVariants/EXTBlendFuncExtendedES3DrawTest.ESSL3Var/1 --SharedImageBackingFactoryAHBTest.CannotWriteWhileReading --SharedImageBackingFactoryAHBTest.CanHaveMultipleReaders --SharedImageBackingFactoryAHBTest.CannotReadWhileWriting --SharedImageBackingFactoryAHBTest.LegacyClearing
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index aa775c8..c9237e1 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2836,6 +2836,16 @@ 'gpu_telemetry_tests': 'gpu_fyi_linux_intel_and_nvidia_release_telemetry_tests', }, }, + 'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)': { + 'os_type': 'linux', + 'browser_config': 'release', + 'mixins': [ + 'linux_intel_hd_630', + ], + 'test_suites': { + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', + }, + }, 'Linux FYI SkiaRenderer Vulkan (Intel HD 630)': { 'os_type': 'linux', 'browser_config': 'release',
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index 398aad6..a164f220 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -392,7 +392,6 @@ "web/web_remote_frame.h", "web/web_remote_frame_client.h", "web/web_render_theme.h", - "web/web_scoped_user_gesture.h", "web/web_scoped_window_focus_allowed_indicator.h", "web/web_script_controller.h", "web/web_script_execution_callback.h", @@ -413,7 +412,6 @@ "web/web_text_decoration_type.h", "web/web_text_direction.h", "web/web_tree_scope_type.h", - "web/web_user_gesture_indicator.h", "web/web_user_media_request.h", "web/web_v8_context_snapshot.h", "web/web_view.h",
diff --git a/third_party/blink/public/mojom/blob/blob.mojom b/third_party/blink/public/mojom/blob/blob.mojom index 9abc4244..310e456 100644 --- a/third_party/blink/public/mojom/blob/blob.mojom +++ b/third_party/blink/public/mojom/blob/blob.mojom
@@ -5,6 +5,7 @@ module blink.mojom; import "mojo/public/mojom/base/big_buffer.mojom"; +import "mojo/public/mojom/base/time.mojom"; import "services/network/public/mojom/data_pipe_getter.mojom"; import "services/network/public/mojom/http_request_headers.mojom"; @@ -53,6 +54,10 @@ // this blob through a blob URL. ReadSideData() => (mojo_base.mojom.BigBuffer? data); + // If this blob represents a single file on disk, this will capture the + // current snapshot state of that file. + [Sync] CaptureSnapshot() => (uint64 length, mojo_base.mojom.Time? modification_time); + // This method is an implementation detail of the blob system. You should not // ever need to call it directly. // This returns the internal UUID of the blob, used by the blob system to
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index 05a33b9..15217b2 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -12,6 +12,7 @@ #include "services/network/public/mojom/fetch_api.mojom-shared.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/common/frame/sandbox_flags.h" +#include "third_party/blink/public/common/frame/user_activation_update_source.h" #include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-shared.h" #include "third_party/blink/public/mojom/commit_result/commit_result.mojom-shared.h" @@ -734,6 +735,22 @@ // whether or not the frame is an ad. virtual void SetIsAdSubframe(blink::mojom::AdFrameType ad_frame_type) = 0; + // User activation ----------------------------------------------------------- + + // See blink::LocalFrame::NotifyUserActivation(). + virtual void NotifyUserActivation() = 0; + + // See blink::LocalFrame::HasStickyUserActivation(). + virtual bool HasStickyUserActivation() = 0; + + // See blink::LocalFrame::HasTransientUserActivation(). + virtual bool HasTransientUserActivation() = 0; + + // See blink::LocalFrame::ConsumeTransientUserActivation(). + virtual bool ConsumeTransientUserActivation( + UserActivationUpdateSource update_source = + UserActivationUpdateSource::kRenderer) = 0; + // Testing ------------------------------------------------------------------ // Prints the frame into the canvas, with page boundaries drawn as one pixel
diff --git a/third_party/blink/public/web/web_scoped_user_gesture.h b/third_party/blink/public/web/web_scoped_user_gesture.h deleted file mode 100644 index cd8c1ed..0000000 --- a/third_party/blink/public/web/web_scoped_user_gesture.h +++ /dev/null
@@ -1,49 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_SCOPED_USER_GESTURE_H_ -#define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_SCOPED_USER_GESTURE_H_ - -#include "third_party/blink/public/platform/web_common.h" - -namespace blink { - -class WebLocalFrame; - -// TODO(mustaq): This class is obsolete. Define a UAv2 interface on -// WebLocalFrame and remove this. crbug.com/959850 -class WebScopedUserGesture { - public: - BLINK_EXPORT WebScopedUserGesture(WebLocalFrame*); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_SCOPED_USER_GESTURE_H_
diff --git a/third_party/blink/public/web/web_user_gesture_indicator.h b/third_party/blink/public/web/web_user_gesture_indicator.h deleted file mode 100644 index 5be9960..0000000 --- a/third_party/blink/public/web/web_user_gesture_indicator.h +++ /dev/null
@@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_USER_GESTURE_INDICATOR_H_ -#define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_USER_GESTURE_INDICATOR_H_ - -#include "third_party/blink/public/common/frame/user_activation_update_source.h" -#include "third_party/blink/public/platform/web_common.h" - -namespace blink { - -class WebLocalFrame; - -// TODO(mustaq): This class is obsolete. Define a UAv2 interface on -// WebLocalFrame and remove this. crbug.com/959850 -class WebUserGestureIndicator { - public: - // Returns true if a user gesture is currently being processed. Must be called - // on the main thread. - BLINK_EXPORT static bool IsProcessingUserGesture(WebLocalFrame*); - - // Returns true if a consumable gesture exists and has been successfully - // consumed. - BLINK_EXPORT static bool ConsumeUserGesture( - WebLocalFrame*, - UserActivationUpdateSource update_source = - UserActivationUpdateSource::kRenderer); - - // Returns true if a user gesture was processed on the provided frame since - // the time the frame was loaded. - BLINK_EXPORT static bool ProcessedUserGestureSinceLoad(WebLocalFrame*); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_USER_GESTURE_INDICATOR_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/post_message_helper.cc b/third_party/blink/renderer/bindings/core/v8/serialization/post_message_helper.cc index 0bc4266..30b7b8a 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/post_message_helper.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/post_message_helper.cc
@@ -96,7 +96,7 @@ if (LocalDOMWindow* dom_window = execution_context->ExecutingWindow()) { if (LocalFrame* frame = dom_window->GetFrame()) { return mojom::blink::UserActivationSnapshot::New( - frame->HasBeenActivated(), + frame->HasStickyUserActivation(), LocalFrame::HasTransientUserActivation(frame)); } }
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc index d4ff2e3..01052385 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc
@@ -27,18 +27,17 @@ color_space_ = SerializedColorSpace::kP3; break; } - // todo(crbug/1021986) remove force_rgba in canvasColorParams - if (color_params.GetForceRGBA() == CanvasForceRGBA::kForced) { - pixel_format_ = SerializedPixelFormat::kForceRGBA8; - } else { - switch (color_params.PixelFormat()) { - case CanvasPixelFormat::kRGBA8: - pixel_format_ = SerializedPixelFormat::kRGBA8; - break; - case CanvasPixelFormat::kF16: - pixel_format_ = SerializedPixelFormat::kF16; - break; - } + + switch (color_params.PixelFormat()) { + case CanvasPixelFormat::kRGBA8: + pixel_format_ = SerializedPixelFormat::kRGBA8; + break; + case CanvasPixelFormat::kBGRA8: + pixel_format_ = SerializedPixelFormat::kBGRA8; + break; + case CanvasPixelFormat::kF16: + pixel_format_ = SerializedPixelFormat::kF16; + break; } opacity_mode_ = SerializedOpacityMode::kNonOpaque; @@ -93,22 +92,27 @@ break; } - // todo(crbug/1021986) remove force_rgba in canvasColorParams - CanvasForceRGBA force_rgba = CanvasForceRGBA::kNotForced; CanvasPixelFormat pixel_format = CanvasPixelFormat::kRGBA8; - if (pixel_format_ == SerializedPixelFormat::kForceRGBA8) { - force_rgba = CanvasForceRGBA::kForced; - } else if (pixel_format_ == SerializedPixelFormat::kF16) { - pixel_format = CanvasPixelFormat::kF16; - } else if (pixel_format_ == SerializedPixelFormat::kRGBA8) { - pixel_format = CanvasPixelFormat::kRGBA8; + switch (pixel_format_) { + case SerializedPixelFormat::kNative8_LegacyObsolete: + pixel_format = CanvasColorParams::GetNativeCanvasPixelFormat(); + break; + case SerializedPixelFormat::kRGBA8: + pixel_format = CanvasPixelFormat::kRGBA8; + break; + case SerializedPixelFormat::kBGRA8: + pixel_format = CanvasPixelFormat::kBGRA8; + break; + case SerializedPixelFormat::kF16: + pixel_format = CanvasPixelFormat::kF16; + break; } blink::OpacityMode opacity_mode = blink::kNonOpaque; if (opacity_mode_ == SerializedOpacityMode::kOpaque) opacity_mode = blink::kOpaque; - return CanvasColorParams(color_space, pixel_format, opacity_mode, force_rgba); + return CanvasColorParams(color_space, pixel_format, opacity_mode); } CanvasColorSpace SerializedColorParams::GetColorSpace() const {
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h index 8820a9d..4c47c3a 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h
@@ -46,13 +46,15 @@ }; // This enumeration specifies the values used to serialize CanvasPixelFormat. -// todo(crbug/1021986) remove force_rgba in canvasColorParams and better reflect -// logic of BGRA vs RGBA enum class SerializedPixelFormat : uint32_t { - kRGBA8 = 0, + // This is to preserve legacy object when Native was a possible enum state + // this will be resolved as either a RGB or BGR pixel format for + // canvas_color_params + kNative8_LegacyObsolete = 0, kF16 = 1, - kForceRGBA8 = 2, - kLast = kForceRGBA8, + kRGBA8 = 2, + kBGRA8 = 3, + kLast = kBGRA8, }; // This enumeration specifies the values used to serialize
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc index d08e5e12..cfd4024 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
@@ -293,7 +293,8 @@ } case kImageBitmapTag: { SerializedColorSpace canvas_color_space = SerializedColorSpace::kSRGB; - SerializedPixelFormat canvas_pixel_format = SerializedPixelFormat::kRGBA8; + SerializedPixelFormat canvas_pixel_format = + SerializedPixelFormat::kNative8_LegacyObsolete; SerializedOpacityMode canvas_opacity_mode = SerializedOpacityMode::kOpaque; uint32_t origin_clean = 0, is_premultiplied = 0, width = 0, height = 0, @@ -415,7 +416,7 @@ } SerializedColorParams color_params( - canvas_color_space, SerializedPixelFormat::kRGBA8, + canvas_color_space, SerializedPixelFormat::kNative8_LegacyObsolete, SerializedOpacityMode::kNonOpaque, image_data_storage_format); ImageDataStorageFormat storage_format = color_params.GetStorageFormat(); base::CheckedNumeric<size_t> computed_byte_length = width;
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc index 83e6028..5fb1576 100644 --- a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
@@ -387,7 +387,7 @@ auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600)); Document& document = dummy_page_holder->GetDocument(); Page::InsertOrdinaryPageForTesting(&dummy_page_holder->GetPage()); - document.SetSecureContextStateForTesting(SecureContextState::kSecure); + document.SetSecureContextModeForTesting(SecureContextMode::kSecureContext); WebFeature feature = WebFeature::kCSSPaintFunction; EXPECT_FALSE(document.IsUseCounted(feature)); document.documentElement()->SetInnerHTMLFromString(
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 00682589..bee6053 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -630,7 +630,7 @@ InitializeOrigin(initializer); // The secure context state is based on the origin. - InitializeSecureContextState(initializer); + InitializeSecureContextMode(initializer); // Initialize origin trials, requires the post sandbox flags // security origin and secure context state. @@ -665,8 +665,8 @@ WindowAgentFactory* GetWindowAgentFactory() { return window_agent_factory_; } Agent* GetAgent() { return agent_; } - SecureContextState GetSecureContextState() { - return secure_context_state_.value(); + SecureContextMode GetSecureContextMode() { + return secure_context_mode_.value(); } void CountFeaturePolicyUsage(mojom::WebFeature feature) override { @@ -933,30 +933,30 @@ feature_policy_->SetHeaderPolicy(parsed_header_); } - void InitializeSecureContextState(const DocumentInit& initializer) { + void InitializeSecureContextMode(const DocumentInit& initializer) { auto* frame = initializer.GetFrame(); if (!security_origin_->IsPotentiallyTrustworthy()) { - secure_context_state_ = SecureContextState::kNonSecure; + secure_context_mode_ = SecureContextMode::kInsecureContext; } else if (SchemeRegistry::SchemeShouldBypassSecureContextCheck( security_origin_->Protocol())) { - secure_context_state_ = SecureContextState::kSecure; + secure_context_mode_ = SecureContextMode::kSecureContext; } else if (frame) { Frame* parent = frame->Tree().Parent(); while (parent) { if (!parent->GetSecurityContext() ->GetSecurityOrigin() ->IsPotentiallyTrustworthy()) { - secure_context_state_ = SecureContextState::kNonSecure; + secure_context_mode_ = SecureContextMode::kInsecureContext; break; } parent = parent->Tree().Parent(); } - if (!secure_context_state_.has_value()) - secure_context_state_ = SecureContextState::kSecure; + if (!secure_context_mode_.has_value()) + secure_context_mode_ = SecureContextMode::kSecureContext; } else { - secure_context_state_ = SecureContextState::kNonSecure; + secure_context_mode_ = SecureContextMode::kInsecureContext; } - bool is_secure = secure_context_state_ == SecureContextState::kSecure; + bool is_secure = secure_context_mode_ == SecureContextMode::kSecureContext; if (GetSandboxFlags() != WebSandboxFlags::kNone) { feature_count_.insert( is_secure ? WebFeature::kSecureContextCheckForSandboxedOriginPassed @@ -967,7 +967,7 @@ } void InitializeOriginTrials(const DocumentInit& initializer) { - DCHECK(secure_context_state_.has_value()); + DCHECK(secure_context_mode_.has_value()); origin_trials_ = MakeGarbageCollected<OriginTrialContext>(); const String& header_value = initializer.OriginTrialsHeader(); @@ -980,8 +980,7 @@ return; origin_trials_->AddTokens( security_origin_.get(), - secure_context_state_ == SecureContextState::kSecure /*is_secure*/, - *tokens); + secure_context_mode_ == SecureContextMode::kSecureContext, *tokens); } void InitializeAgent(const DocumentInit& initializer) { @@ -1051,7 +1050,7 @@ HashSet<mojom::FeaturePolicyFeature> parsed_feature_policies_; HashSet<mojom::WebFeature> feature_count_; bool bind_csp_immediately_ = false; - base::Optional<SecureContextState> secure_context_state_; + base::Optional<SecureContextMode> secure_context_mode_; }; ExplicitlySetAttrElementsMap* Document::GetExplicitlySetAttrElementsMap( @@ -1095,7 +1094,8 @@ security_initializer.GetOriginTrialContext(), security_initializer.GetSecurityOrigin(), security_initializer.GetSandboxFlags(), - security_initializer.TakeFeaturePolicy()), + security_initializer.TakeFeaturePolicy(), + security_initializer.GetSecureContextMode()), evaluate_media_queries_on_style_recalc_(false), pending_sheet_layout_(kNoLayoutWithPendingSheets), window_agent_factory_(security_initializer.GetWindowAgentFactory()), @@ -1186,7 +1186,6 @@ parser_sync_policy_(kAllowAsynchronousParsing), node_count_(0), logged_field_edit_(false), - secure_context_state_(security_initializer.GetSecureContextState()), ukm_source_id_(ukm::UkmRecorder::GetNewSourceID()), needs_to_record_ukm_outlive_time_(false), viewport_data_(MakeGarbageCollected<ViewportData>(*this)), @@ -3030,6 +3029,53 @@ UpdateStyleAndLayout(); } +void Document::ApplyScrollRestorationLogic() { + // If we're restoring a scroll position from history, that takes precedence + // over scrolling to the anchor in the URL. + View()->InvokeFragmentAnchor(); + + auto& frame_loader = GetFrame()->Loader(); + auto& document_loader = *frame_loader.GetDocumentLoader(); + if (frame_->IsLoading() && + !FrameLoader::NeedsHistoryItemRestore(document_loader.LoadType())) + return; + + auto* history_item = frame_loader.GetDocumentLoader()->GetHistoryItem(); + + if (!history_item || !history_item->GetViewState()) + return; + + bool should_restore_scroll = + history_item->ScrollRestorationType() != kScrollRestorationManual; + auto& scroll_offset = history_item->GetViewState()->scroll_offset_; + + // This tries to balance: + // 1. restoring as soon as possible. + // 2. not overriding user scroll (TODO(majidvp): also respect user scale). + // 3. detecting clamping to avoid repeatedly popping the scroll position down + // as the page height increases. + // 4. ignoring clamp detection if scroll state is not being restored, if load + // is complete, or if the navigation is same-document (as the new page may + // be smaller than the previous page). + bool can_restore_without_clamping = + View()->LayoutViewport()->ClampScrollOffset(scroll_offset) == + scroll_offset; + + bool can_restore_without_annoying_user = + !document_loader.GetInitialScrollState().was_scrolled_by_user && + (can_restore_without_clamping || !frame_->IsLoading() || + !should_restore_scroll); + if (!can_restore_without_annoying_user) + return; + + frame_loader.RestoreScrollPositionAndViewState(); + if (View()->GetScrollableArea()->ApplyPendingHistoryRestoreScrollOffset()) { + if (ScrollingCoordinator* scrolling_coordinator = + View()->GetFrame().GetPage()->GetScrollingCoordinator()) + scrolling_coordinator->FrameViewRootLayerDidChange(View()); + } +} + void Document::UpdateStyleAndLayout(ForcedLayoutStatus status) { DCHECK(IsMainThread()); LocalFrameView* frame_view = View(); @@ -3057,6 +3103,8 @@ if (Lifecycle().GetState() < DocumentLifecycle::kLayoutClean) Lifecycle().AdvanceTo(DocumentLifecycle::kLayoutClean); + ApplyScrollRestorationLogic(); + if (LocalFrameView* frame_view_anchored = View()) frame_view_anchored->PerformScrollAnchoringAdjustments(); @@ -3071,11 +3119,6 @@ DCHECK(GetFrame()); DCHECK(View()); - // If we're restoring a scroll position from history, that takes precedence - // over scrolling to the anchor in the URL. - View()->InvokeFragmentAnchor(); - GetFrame()->Loader().RestoreScrollPositionAndViewState(); - // Plugins can run script inside layout which can detach the page. // TODO(dcheng): Does it make sense to do any of this work if detached? if (GetFrame()) { @@ -4183,6 +4226,16 @@ } } + if (auto* view = View()) { + if (view->GetFragmentAnchor()) { + // Schedule an animation frame to process fragment anchors. The frame + // can't be scheduled when the fragment anchor is set because, per spec, + // we must wait for the document to be loaded before invoking fragment + // anchors. + View()->ScheduleAnimation(); + } + } + return true; } @@ -4229,7 +4282,7 @@ if (!GetFrame() || before_unload_event.returnValue().IsNull()) return true; - if (!GetFrame()->HasBeenActivated()) { + if (!GetFrame()->HasStickyUserActivation()) { beforeunload_dialog_histogram.Count(kNoDialogNoUserGesture); String message = "Blocked attempt to show a 'beforeunload' confirmation panel for a " @@ -8024,18 +8077,6 @@ GetStyleEngine().PlatformColorsChanged(); } -bool Document::IsSecureContext(String& error_message) const { - if (!IsSecureContext()) { - error_message = SecurityOrigin::IsPotentiallyTrustworthyErrorMessage(); - return false; - } - return true; -} - -bool Document::IsSecureContext() const { - return secure_context_state_ == SecureContextState::kSecure; -} - void Document::DidEnforceInsecureRequestPolicy() { if (!GetFrame()) return;
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index f0b3526..07eb3a09 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -237,8 +237,6 @@ kShadowCascadeV1 }; -enum class SecureContextState { kNonSecure, kSecure }; - using DocumentClassFlags = unsigned char; // A map of IDL attribute name to Element value, for one particular element. @@ -1356,12 +1354,6 @@ NthIndexCache* GetNthIndexCache() const { return nth_index_cache_; } - bool IsSecureContext(String& error_message) const override; - bool IsSecureContext() const override; - void SetSecureContextStateForTesting(SecureContextState state) { - secure_context_state_ = state; - } - CanvasFontCache* GetCanvasFontCache(); // Used by unit tests so that all parsing will be main thread for @@ -1635,6 +1627,8 @@ } #endif + void ApplyScrollRestorationLogic(); + protected: void ClearXMLVersion() { xml_version_ = String(); } @@ -1678,7 +1672,6 @@ ScriptedIdleTaskController& EnsureScriptedIdleTaskController(); void InitSecurityContext(const DocumentInit&, const SecurityContextInit& security_initializer); - void InitSecureContextState(); bool HasPendingVisualUpdate() const { return lifecycle_.GetState() == DocumentLifecycle::kVisualUpdatePending; @@ -2053,8 +2046,6 @@ TaskHandle sensitive_input_edited_task_; - SecureContextState secure_context_state_; - Member<NetworkStateObserver> network_state_observer_; std::unique_ptr<DocumentOutliveTimeReporter> document_outlive_time_reporter_;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index e3e8bdc..2c38e5b 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4191,7 +4191,7 @@ return; if (GetDocument().FocusedElement() == this && - GetDocument().GetFrame()->HasBeenActivated()) { + GetDocument().GetFrame()->HasStickyUserActivation()) { // Bring up the keyboard in the context of anything triggered by a user // gesture. Since tracking that across arbitrary boundaries (eg. // animations) is difficult, for now we match IE's heuristic and bring
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc index 9b16f7761..b6436b9 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.cc +++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -58,7 +58,8 @@ OriginTrialContext* origin_trial_context, scoped_refptr<SecurityOrigin> origin, WebSandboxFlags sandbox_flags, - std::unique_ptr<FeaturePolicy> feature_policy) + std::unique_ptr<FeaturePolicy> feature_policy, + SecureContextMode secure_context_mode) : isolate_(isolate), security_context_(origin, sandbox_flags, @@ -72,7 +73,8 @@ agent_(agent), origin_trial_context_(origin_trial_context), window_interaction_tokens_(0), - referrer_policy_(network::mojom::ReferrerPolicy::kDefault) { + referrer_policy_(network::mojom::ReferrerPolicy::kDefault), + secure_context_mode_(secure_context_mode) { if (origin_trial_context_) origin_trial_context_->BindExecutionContext(this); } @@ -220,9 +222,12 @@ return window_interaction_tokens_ > 0; } -bool ExecutionContext::IsSecureContext() const { - String unused_error_message; - return IsSecureContext(unused_error_message); +bool ExecutionContext::IsSecureContext(String& error_message) const { + if (!IsSecureContext()) { + error_message = SecurityOrigin::IsPotentiallyTrustworthyErrorMessage(); + return false; + } + return true; } // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h index 9cd405b..c95b002 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.h +++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -248,12 +248,15 @@ // Decides whether this context is privileged, as described in // https://w3c.github.io/webappsec-secure-contexts/#is-settings-object-contextually-secure. - virtual bool IsSecureContext(String& error_message) const = 0; - virtual bool IsSecureContext() const; - SecureContextMode GetSecureContextMode() const { - return IsSecureContext() ? SecureContextMode::kSecureContext - : SecureContextMode::kInsecureContext; + return secure_context_mode_; + } + bool IsSecureContext() const { + return secure_context_mode_ == SecureContextMode::kSecureContext; + } + bool IsSecureContext(String& error_message) const; + void SetSecureContextModeForTesting(SecureContextMode mode) { + secure_context_mode_ = mode; } // Returns a referrer to be used in the "Determine request's Referrer" @@ -338,7 +341,8 @@ OriginTrialContext* origin_trial_context, scoped_refptr<SecurityOrigin> origin, WebSandboxFlags sandbox_flags, - std::unique_ptr<FeaturePolicy> feature_policy); + std::unique_ptr<FeaturePolicy> feature_policy, + SecureContextMode secure_context_mode); ~ExecutionContext() override; private: @@ -387,6 +391,8 @@ // The size of this vector is 0 until FeaturePolicyFeatureObserved is called. Vector<bool> parsed_feature_policies_; + SecureContextMode secure_context_mode_; + DISALLOW_COPY_AND_ASSIGN(ExecutionContext); };
diff --git a/third_party/blink/renderer/core/exported/BUILD.gn b/third_party/blink/renderer/core/exported/BUILD.gn index 49c257b..f807bf8 100644 --- a/third_party/blink/renderer/core/exported/BUILD.gn +++ b/third_party/blink/renderer/core/exported/BUILD.gn
@@ -60,7 +60,6 @@ "web_remote_frame_impl.h", "web_render_theme.cc", "web_scoped_page_pauser.cc", - "web_scoped_user_gesture.cc", "web_scoped_window_focus_allowed_indicator.cc", "web_script_controller.cc", "web_script_source.cc", @@ -74,7 +73,6 @@ "web_shared_worker_impl.cc", "web_shared_worker_impl.h", "web_text_checking_result.cc", - "web_user_gesture_indicator.cc", "web_v8_context_snapshot.cc", "web_view_impl.cc", "web_view_impl.h",
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc index f8c512c9..5d301e41 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -966,7 +966,7 @@ autofill_client->UserGestureObserved(); } -void LocalFrameClientImpl::ConsumeUserActivation() { +void LocalFrameClientImpl::ConsumeTransientUserActivation() { DCHECK(web_frame_->Client()); web_frame_->Client()->UpdateUserActivationState( UserActivationUpdateType::kConsumeTransientActivation);
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h index a055f4b0..7087ff4 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -225,7 +225,7 @@ KURL OverrideFlashEmbedWithHTML(const KURL&) override; void NotifyUserActivation(bool need_browser_verification) override; - void ConsumeUserActivation() override; + void ConsumeTransientUserActivation() override; void AbortClientNavigation() override;
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 27e7dee..cfcfc71 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -69,6 +69,7 @@ #include "third_party/blink/public/web/web_frame_content_dumper.h" #include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_history_item.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_local_frame_client.h" #include "third_party/blink/public/web/web_navigation_timings.h" #include "third_party/blink/public/web/web_print_params.h" @@ -82,7 +83,6 @@ #include "third_party/blink/public/web/web_text_check_client.h" #include "third_party/blink/public/web/web_text_checking_completion.h" #include "third_party/blink/public/web/web_text_checking_result.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view_client.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_factory.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.h" @@ -12806,11 +12806,11 @@ web_view_helper.InitializeAndLoad("about:blank"); WebLocalFrameImpl* frame = web_view_helper.LocalMainFrame(); - EXPECT_FALSE(frame->GetFrame()->HasBeenActivated()); + EXPECT_FALSE(frame->GetFrame()->HasStickyUserActivation()); frame->ExecuteScript(WebScriptSource(WebString("document.execCommand('copy');"))); - EXPECT_FALSE(frame->GetFrame()->HasBeenActivated()); + EXPECT_FALSE(frame->GetFrame()->HasStickyUserActivation()); frame->ExecuteCommand(WebString::FromUTF8("Paste")); - EXPECT_TRUE(frame->GetFrame()->HasBeenActivated()); + EXPECT_TRUE(frame->GetFrame()->HasStickyUserActivation()); } TEST_F(WebFrameTest, GetCanonicalUrlForSharingNone) {
diff --git a/third_party/blink/renderer/core/exported/web_scoped_user_gesture.cc b/third_party/blink/renderer/core/exported/web_scoped_user_gesture.cc deleted file mode 100644 index ac3f7aa9..0000000 --- a/third_party/blink/renderer/core/exported/web_scoped_user_gesture.cc +++ /dev/null
@@ -1,43 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/public/web/web_scoped_user_gesture.h" - -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" - -namespace blink { - -WebScopedUserGesture::WebScopedUserGesture(WebLocalFrame* frame) { - LocalFrame::NotifyUserActivation( - frame ? To<WebLocalFrameImpl>(frame)->GetFrame() : nullptr); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_user_gesture_indicator.cc b/third_party/blink/renderer/core/exported/web_user_gesture_indicator.cc deleted file mode 100644 index 6ca9b37..0000000 --- a/third_party/blink/renderer/core/exported/web_user_gesture_indicator.cc +++ /dev/null
@@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/public/web/web_user_gesture_indicator.h" - -#include "third_party/blink/renderer/core/frame/frame.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" - -namespace blink { - -bool WebUserGestureIndicator::IsProcessingUserGesture(WebLocalFrame* frame) { - return LocalFrame::HasTransientUserActivation( - frame ? To<WebLocalFrameImpl>(frame)->GetFrame() : nullptr); -} - -bool WebUserGestureIndicator::ConsumeUserGesture( - WebLocalFrame* frame, - UserActivationUpdateSource update_source) { - return LocalFrame::ConsumeTransientUserActivation( - frame ? To<WebLocalFrameImpl>(frame)->GetFrame() : nullptr, - update_source); - - ; -} - -bool WebUserGestureIndicator::ProcessedUserGestureSinceLoad( - WebLocalFrame* frame) { - DCHECK(frame); - return To<WebLocalFrameImpl>(frame)->GetFrame()->HasBeenActivated(); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 7c574d3..aa0db8ba 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -69,12 +69,12 @@ #include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_hit_test_result.h" #include "third_party/blink/public/web/web_input_method_controller.h" +#include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_local_frame_client.h" #include "third_party/blink/public/web/web_print_params.h" #include "third_party/blink/public/web/web_script_source.h" #include "third_party/blink/public/web/web_settings.h" #include "third_party/blink/public/web/web_tree_scope_type.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_view_client.h" #include "third_party/blink/public/web/web_widget.h" #include "third_party/blink/public/web/web_widget_client.h" @@ -2406,6 +2406,8 @@ main_frame_local->Loader().GetDocumentLoader()->CommitSameDocumentNavigation( item1->Url(), WebFrameLoadType::kBackForward, item1.Get(), ClientRedirectPolicy::kNotClientRedirect, nullptr, false, nullptr); + web_view_impl->MainFrameWidget()->UpdateAllLifecyclePhases( + WebWidget::LifecycleUpdateReason::kTest); // Click a different anchor main_frame_local->Loader().StartNavigation(FrameLoadRequest( @@ -2413,15 +2415,23 @@ ResourceRequest(main_frame_local->GetDocument()->CompleteURL("#b")))); Persistent<HistoryItem> item3 = main_frame_local->Loader().GetDocumentLoader()->GetHistoryItem(); + web_view_impl->MainFrameWidget()->UpdateAllLifecyclePhases( + WebWidget::LifecycleUpdateReason::kTest); // Go back, then forward. The scroll position should be properly set on the // forward navigation. main_frame_local->Loader().GetDocumentLoader()->CommitSameDocumentNavigation( item1->Url(), WebFrameLoadType::kBackForward, item1.Get(), ClientRedirectPolicy::kNotClientRedirect, nullptr, false, nullptr); + main_frame_local->Loader().GetDocumentLoader()->CommitSameDocumentNavigation( item3->Url(), WebFrameLoadType::kBackForward, item3.Get(), ClientRedirectPolicy::kNotClientRedirect, nullptr, false, nullptr); + // The scroll offset is only applied via invoking the anchor via the main + // lifecycle, or a forced layout. + // TODO(chrishtr): At the moment, WebLocalFrameImpl::GetScrollOffset() does + // not force a layout. Script-exposed scroll offset-reading methods do, + // however. It seems wrong not to force a layout. EXPECT_EQ(0, web_view_impl->MainFrameImpl()->GetScrollOffset().width); EXPECT_GT(web_view_impl->MainFrameImpl()->GetScrollOffset().height, 2000); } @@ -4183,7 +4193,7 @@ frame->FrameWidget()->GetActiveWebInputMethodController()->SetComposition( WebString::FromUTF8(std::string("hello").c_str()), WebVector<WebImeTextSpan>(), WebRange(), 3, 3)); - EXPECT_TRUE(WebUserGestureIndicator::IsProcessingUserGesture(frame)); + EXPECT_TRUE(frame->HasTransientUserActivation()); EXPECT_EQ(1, client.TextChanges()); EXPECT_TRUE(frame->HasMarkedText()); @@ -4721,7 +4731,7 @@ frame->FrameWidget()->GetActiveWebInputMethodController()->CommitText( WebString::FromUTF8(std::string("hello").c_str()), empty_ime_text_spans, WebRange(), 0)); - EXPECT_TRUE(WebUserGestureIndicator::IsProcessingUserGesture(frame)); + EXPECT_TRUE(frame->HasTransientUserActivation()); EXPECT_EQ(1, client.TextChanges()); frame->SetAutofillClient(nullptr); }
diff --git a/third_party/blink/renderer/core/fileapi/file.cc b/third_party/blink/renderer/core/fileapi/file.cc index 38e0b6b9..925b20c 100644 --- a/third_party/blink/renderer/core/fileapi/file.cc +++ b/third_party/blink/renderer/core/fileapi/file.cc
@@ -298,10 +298,13 @@ if (HasValidSnapshotMetadata() && snapshot_modification_time_) return *snapshot_modification_time_; + uint64_t size; base::Optional<base::Time> modification_time; - if (HasBackingFile() && GetFileModificationTime(path_, modification_time) && - modification_time) + if (HasBackingFile() && + GetBlobDataHandle()->CaptureSnapshot(&size, &modification_time) && + modification_time) { return *modification_time; + } // lastModified / lastModifiedDate getters should return the current time // when the last modification time isn't known. @@ -327,10 +330,13 @@ // FIXME: JavaScript cannot represent sizes as large as uint64_t, we need // to come up with an exception to throw if file size is not representable. - int64_t size; - if (!HasBackingFile() || !GetFileSize(path_, size)) + uint64_t size; + base::Optional<base::Time> modification_time; + if (!HasBackingFile() || + !GetBlobDataHandle()->CaptureSnapshot(&size, &modification_time)) { return 0; - return static_cast<uint64_t>(size); + } + return size; } Blob* File::slice(int64_t start, @@ -370,14 +376,12 @@ // If we fail to retrieve the size or modification time, probably due to that // the file has been deleted, 0 size is returned. FileMetadata metadata; - if (!HasBackingFile() || !GetFileMetadata(path_, metadata)) { + if (!HasBackingFile() || !GetBlobDataHandle()->CaptureSnapshot( + &snapshot_size, &snapshot_modification_time)) { snapshot_size = 0; snapshot_modification_time = base::nullopt; return; } - - snapshot_size = static_cast<uint64_t>(metadata.length); - snapshot_modification_time = metadata.modification_time; } void File::AppendTo(BlobData& blob_data) const {
diff --git a/third_party/blink/renderer/core/fileapi/file_test.cc b/third_party/blink/renderer/core/fileapi/file_test.cc index 399d9aa..3390e81 100644 --- a/third_party/blink/renderer/core/fileapi/file_test.cc +++ b/third_party/blink/renderer/core/fileapi/file_test.cc
@@ -4,53 +4,57 @@ #include "third_party/blink/renderer/core/fileapi/file.h" +#include "base/task/post_task.h" #include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/file/file_utilities.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/renderer/platform/blob/testing/fake_blob.h" #include "third_party/blink/renderer/platform/file_metadata.h" #include "third_party/blink/renderer/platform/heap/heap.h" +#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" namespace blink { namespace { -class MockFileUtilitiesHost : public mojom::blink::FileUtilitiesHost { +class MockBlob : public FakeBlob { public: - MockFileUtilitiesHost() - : broker_(*Platform::Current()->GetBrowserInterfaceBroker()) { - broker_.SetBinderForTesting( - FileUtilitiesHost::Name_, - WTF::BindRepeating(&MockFileUtilitiesHost::BindReceiver, - WTF::Unretained(this))); - RebindFileUtilitiesForTesting(); + static void Create(File* file, base::Time modified_time) { + mojo::PendingRemote<mojom::blink::Blob> remote; + PostCrossThreadTask( + *base::CreateSequencedTaskRunner({base::ThreadPool()}), FROM_HERE, + CrossThreadBindOnce( + [](const String& uuid, + mojo::PendingReceiver<mojom::blink::Blob> receiver, + base::Time modified_time) { + mojo::MakeSelfOwnedReceiver( + std::make_unique<MockBlob>(uuid, modified_time), + std::move(receiver)); + }, + file->Uuid(), remote.InitWithNewPipeAndPassReceiver(), + modified_time)); + file->GetBlobDataHandle()->SetBlobRemoteForTesting(std::move(remote)); } - ~MockFileUtilitiesHost() override { - broker_.SetBinderForTesting(FileUtilitiesHost::Name_, {}); - RebindFileUtilitiesForTesting(); + MockBlob(const String& uuid, base::Time modified_time) + : FakeBlob(uuid), modified_time_(modified_time) {} + + void Clone(mojo::PendingReceiver<mojom::blink::Blob> receiver) override { + mojo::MakeSelfOwnedReceiver( + std::make_unique<MockBlob>(uuid_, modified_time_), std::move(receiver)); } - void SetFileInfoToBeReturned(const base::File::Info info) { - file_info_ = info; + void CaptureSnapshot(CaptureSnapshotCallback callback) override { + std::move(callback).Run( + /*size=*/0, NullableTimeToOptionalTime(modified_time_)); } private: - void BindReceiver(mojo::ScopedMessagePipeHandle handle) { - receivers_.Add(this, - mojo::PendingReceiver<FileUtilitiesHost>(std::move(handle))); - } - - // FileUtilitiesHost function: - void GetFileInfo(const base::FilePath& path, - GetFileInfoCallback callback) override { - std::move(callback).Run(file_info_); - } - - ThreadSafeBrowserInterfaceBrokerProxy& broker_; - mojo::ReceiverSet<FileUtilitiesHost> receivers_; - base::File::Info file_info_; + base::Time modified_time_; }; void ExpectTimestampIsNow(const File& file) { @@ -65,12 +69,9 @@ } // namespace TEST(FileTest, NativeFileWithoutTimestamp) { - MockFileUtilitiesHost host; - base::File::Info info; - info.last_modified = base::Time(); - host.SetFileInfoToBeReturned(info); - auto* const file = MakeGarbageCollected<File>("/native/path"); + MockBlob::Create(file, base::Time()); + EXPECT_TRUE(file->HasBackingFile()); EXPECT_EQ("/native/path", file->GetPath()); EXPECT_TRUE(file->FileSystemURL().IsEmpty()); @@ -78,24 +79,18 @@ } TEST(FileTest, NativeFileWithUnixEpochTimestamp) { - MockFileUtilitiesHost host; - base::File::Info info; - info.last_modified = base::Time::UnixEpoch(); - host.SetFileInfoToBeReturned(info); - auto* const file = MakeGarbageCollected<File>("/native/path"); + MockBlob::Create(file, base::Time::UnixEpoch()); + EXPECT_TRUE(file->HasBackingFile()); EXPECT_EQ(0, file->lastModified()); EXPECT_EQ(base::Time::UnixEpoch(), file->LastModifiedTime()); } TEST(FileTest, NativeFileWithApocalypseTimestamp) { - MockFileUtilitiesHost host; - base::File::Info info; - info.last_modified = base::Time::Max(); - host.SetFileInfoToBeReturned(info); - auto* const file = MakeGarbageCollected<File>("/native/path"); + MockBlob::Create(file, base::Time::Max()); + EXPECT_TRUE(file->HasBackingFile()); EXPECT_EQ((base::Time::Max() - base::Time::UnixEpoch()).InMilliseconds(),
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index c32683a4..e25fa39 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -159,11 +159,18 @@ // This should never be called from outside Frame or WebFrame. void ClearUserActivationInLocalTree(); - bool HasBeenActivated() const { + // Returns the transient user activation state of this frame. + bool HasTransientUserActivation() const { + return user_activation_state_.IsActive(); + } + + // Returns the sticky user activation state of this frame. + bool HasStickyUserActivation() const { return user_activation_state_.HasBeenActive(); } - void ClearActivation() { user_activation_state_.Clear(); } + // Resets the user activation state of this frame. + void ClearUserActivation() { user_activation_state_.Clear(); } // Transfers user activation state from |other| frame into |this|. void TransferUserActivationFrom(Frame* other); @@ -272,12 +279,6 @@ Member<FrameOwner> owner_; Member<DOMWindow> dom_window_; - // The user activation state of the current frame. See |UserActivationState| - // for details on how this state is maintained. - UserActivationState user_activation_state_; - - bool had_sticky_user_activation_before_nav_ = false; - // This is set to true if this is a subframe, and the frame element in the // parent frame's document becomes inert. This should always be false for // the main frame. @@ -304,6 +305,14 @@ bool is_loading_; base::UnguessableToken devtools_frame_token_; base::Optional<std::string> trace_value_; + + // The user activation state of the current frame. See |UserActivationState| + // for details on how this state is maintained. + UserActivationState user_activation_state_; + + // The sticky user activation state of the current frame before eTLD+1 + // navigation. This is used in autoplay. + bool had_sticky_user_activation_before_nav_ = false; }; inline FrameClient* Frame::Client() const {
diff --git a/third_party/blink/renderer/core/frame/frame_test.cc b/third_party/blink/renderer/core/frame/frame_test.cc index ca5730a..13084aa5 100644 --- a/third_party/blink/renderer/core/frame/frame_test.cc +++ b/third_party/blink/renderer/core/frame/frame_test.cc
@@ -20,7 +20,7 @@ PageTestBase::SetUp(); Navigate("https://example.com/", false); - ASSERT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + ASSERT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); ASSERT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); } @@ -51,115 +51,115 @@ TEST_F(FrameTest, NoGesture) { // A nullptr LocalFrame* will not set user gesture state. LocalFrame::NotifyUserActivation(nullptr); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); } TEST_F(FrameTest, PossiblyExisting) { // A non-null LocalFrame* will set state, but a subsequent nullptr Document* // token will not override it. LocalFrame::NotifyUserActivation(GetDocument().GetFrame()); - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); LocalFrame::NotifyUserActivation(nullptr); - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); } TEST_F(FrameTest, NavigateDifferentDomain) { LocalFrame::NotifyUserActivation(GetDocument().GetFrame()); - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document. In the main frame, user gesture state // will get reset. State will not persist since the domain has changed. NavigateDifferentDomain(); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); } TEST_F(FrameTest, NavigateSameDomainMultipleTimes) { LocalFrame::NotifyUserActivation(GetDocument().GetFrame()); - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document in the same domain. In the main frame, // user gesture state will get reset, but persisted state will be true. NavigateSameDomain("page1"); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document in the same domain, the persisted // state will be true. NavigateSameDomain("page2"); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to the same URL in the same domain, the persisted state // will be true, but the user gesture state will be reset. NavigateSameDomain("page2"); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document in the same domain, the persisted // state will be true. NavigateSameDomain("page3"); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); } TEST_F(FrameTest, NavigateSameDomainDifferentDomain) { LocalFrame::NotifyUserActivation(GetDocument().GetFrame()); - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document in the same domain. In the main frame, // user gesture state will get reset, but persisted state will be true. NavigateSameDomain("page1"); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); // Navigate to a different Document in a different domain, the persisted // state will be reset. NavigateDifferentDomain(); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); } TEST_F(FrameTest, NavigateSameDomainNoGesture) { - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); NavigateSameDomain("page1", false); - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( GetDocument().GetFrame()->HadStickyUserActivationBeforeNavigation()); } TEST_F(FrameTest, UserActivationInterfaceTest) { // Initially both sticky and transient bits are false. - EXPECT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_FALSE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( LocalFrame::HasTransientUserActivation(GetDocument().GetFrame())); LocalFrame::NotifyUserActivation(GetDocument().GetFrame()); // Now both sticky and transient bits are true, hence consumable. - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_TRUE(LocalFrame::HasTransientUserActivation(GetDocument().GetFrame())); EXPECT_TRUE( LocalFrame::ConsumeTransientUserActivation(GetDocument().GetFrame())); // After consumption, only the transient bit resets to false. - EXPECT_TRUE(GetDocument().GetFrame()->HasBeenActivated()); + EXPECT_TRUE(GetDocument().GetFrame()->HasStickyUserActivation()); EXPECT_FALSE( LocalFrame::HasTransientUserActivation(GetDocument().GetFrame())); EXPECT_FALSE(
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 1252b9a5..d3fb663 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1088,7 +1088,7 @@ // A frame navigating its top may blocked if the document initiating // the navigation has never received a user gesture and the navigation // isn't same-origin with the target. - if (HasBeenActivated() || + if (HasStickyUserActivation() || target_frame.GetSecurityContext()->GetSecurityOrigin()->CanAccess( SecurityOrigin::Create(destination_url).get())) { return true; @@ -1529,7 +1529,7 @@ // static bool LocalFrame::HasTransientUserActivation(LocalFrame* frame) { - return frame ? frame->HasTransientUserActivation() : false; + return frame ? frame->Frame::HasTransientUserActivation() : false; } // static @@ -1544,14 +1544,10 @@ NotifyUserActivationInLocalTree(); } -bool LocalFrame::HasTransientUserActivation() { - return user_activation_state_.IsActive(); -} - bool LocalFrame::ConsumeTransientUserActivation( UserActivationUpdateSource update_source) { if (update_source == UserActivationUpdateSource::kRenderer) - Client()->ConsumeUserActivation(); + Client()->ConsumeTransientUserActivation(); return ConsumeTransientUserActivationInLocalTree(); } @@ -1752,7 +1748,7 @@ } void LocalFrame::MaybeLogAdClickNavigation() { - if (HasTransientUserActivation() && IsAdSubframe()) + if (HasTransientUserActivation(this) && IsAdSubframe()) UseCounter::Count(GetDocument(), WebFeature::kAdClickNavigation); }
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 059f644..bb09260 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -505,9 +505,6 @@ // Activates the user activation states of this frame and all its ancestors. void NotifyUserActivation(bool need_browser_verification); - // Returns the transient user activation state of this frame - bool HasTransientUserActivation(); - // Consumes and returns the transient user activation state this frame, after // updating all other frames in the frame tree. bool ConsumeTransientUserActivation(UserActivationUpdateSource update_source);
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h index 1d6facb..cbcaca9 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client.h +++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -368,7 +368,7 @@ // Tell the embedder that the associated frame has consumed user activation so // that the replicated states in the browser and other renderers can be // updated. - virtual void ConsumeUserActivation() {} + virtual void ConsumeTransientUserActivation() {} virtual void AbortClientNavigation() {}
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index ca5e66d5..5752546 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -458,6 +458,13 @@ if (frame_->IsMainFrame()) frame_->GetPage()->GetVisualViewport().MainFrameDidChangeSize(); GetFrame().Loader().RestoreScrollPositionAndViewState(); + if (GetScrollableArea()) { + if (GetScrollableArea()->ApplyPendingHistoryRestoreScrollOffset()) { + if (ScrollingCoordinator* scrolling_coordinator = + GetFrame().GetPage()->GetScrollingCoordinator()) + scrolling_coordinator->FrameViewRootLayerDidChange(this); + } + } } } @@ -1376,11 +1383,11 @@ if (anchor) { fragment_anchor_ = anchor; fragment_anchor_->Installed(); - - // Layout needs to be clean for scrolling but if layout is needed, we'll - // invoke after layout is completed so no need to do it here. - if (!NeedsLayout()) - InvokeFragmentAnchor(); + // Post-load, same-document navigations need to schedule a frame in which + // the fragment anchor will be invoked. It will be done after layout as + // part of the lifecycle. + if (same_document_navigation) + ScheduleAnimation(); } } @@ -1466,9 +1473,6 @@ // reduce the size of the frame. if (auto_size_info_) auto_size_info_->AutoSizeIfNeeded(); - - if (fragment_anchor_) - fragment_anchor_->DidCompleteLoad(); } void LocalFrameView::ClearLayoutSubtreeRoot(const LayoutObject& root) { @@ -2968,6 +2972,10 @@ if (Lifecycle().GetState() < DocumentLifecycle::kLayoutClean) Lifecycle().AdvanceTo(DocumentLifecycle::kLayoutClean); + // If we're restoring a scroll position from history, that takes precedence + // over scrolling to the anchor in the URL. + frame_->GetDocument()->ApplyScrollRestorationLogic(); + if (AXObjectCache* cache = GetFrame().GetDocument()->ExistingAXObjectCache()) cache->ProcessUpdatesAfterLayout(*GetFrame().GetDocument());
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.cc b/third_party/blink/renderer/core/frame/root_frame_viewport.cc index c7b59db..3431e28f 100644 --- a/third_party/blink/renderer/core/frame/root_frame_viewport.cc +++ b/third_party/blink/renderer/core/frame/root_frame_viewport.cc
@@ -8,6 +8,7 @@ #include "cc/input/snap_selection_strategy.h" #include "third_party/blink/public/platform/web_scroll_into_view_params.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/scroll_anchor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -47,7 +48,7 @@ } // namespace RootFrameViewport::RootFrameViewport(ScrollableArea& visual_viewport, ScrollableArea& layout_viewport) - : visual_viewport_(visual_viewport) { + : visual_viewport_(visual_viewport), should_restore_scroll_(false) { SetLayoutViewport(layout_viewport); } @@ -93,15 +94,15 @@ void RootFrameViewport::RestoreToAnchor(const ScrollOffset& target_offset) { // Clamp the scroll offset of each viewport now so that we force any invalid // offsets to become valid so we can compute the correct deltas. - VisualViewport().SetScrollOffset(VisualViewport().GetScrollOffset(), - kProgrammaticScroll); + GetVisualViewport().SetScrollOffset(GetVisualViewport().GetScrollOffset(), + kProgrammaticScroll); LayoutViewport().SetScrollOffset(LayoutViewport().GetScrollOffset(), kProgrammaticScroll); ScrollOffset delta = target_offset - GetScrollOffset(); - VisualViewport().SetScrollOffset(VisualViewport().GetScrollOffset() + delta, - kProgrammaticScroll); + GetVisualViewport().SetScrollOffset( + GetVisualViewport().GetScrollOffset() + delta, kProgrammaticScroll); delta = target_offset - GetScrollOffset(); @@ -119,8 +120,8 @@ kProgrammaticScroll); delta = target_offset - GetScrollOffset(); - VisualViewport().SetScrollOffset(VisualViewport().GetScrollOffset() + delta, - kProgrammaticScroll); + GetVisualViewport().SetScrollOffset( + GetVisualViewport().GetScrollOffset() + delta, kProgrammaticScroll); } void RootFrameViewport::DidUpdateVisualViewport() { @@ -167,7 +168,7 @@ } ScrollOffset RootFrameViewport::ScrollOffsetFromScrollAnimators() const { - return VisualViewport().GetScrollAnimator().CurrentOffset() + + return GetVisualViewport().GetScrollAnimator().CurrentOffset() + LayoutViewport().GetScrollAnimator().CurrentOffset(); } @@ -175,7 +176,7 @@ IncludeScrollbarsInRect scrollbar_inclusion) const { return IntRect( IntPoint(ScrollOffsetInt()), - VisualViewport().VisibleContentRect(scrollbar_inclusion).Size()); + GetVisualViewport().VisibleContentRect(scrollbar_inclusion).Size()); } PhysicalRect RootFrameViewport::VisibleScrollSnapportRect( @@ -189,9 +190,9 @@ PhysicalRect visual_rect_in_content( PhysicalOffset::FromFloatSizeRound( LayoutViewport().GetScrollOffset() + - VisualViewport().GetScrollAnimator().CurrentOffset()), + GetVisualViewport().GetScrollAnimator().CurrentOffset()), PhysicalSize( - VisualViewport().VisibleContentRect(scrollbar_inclusion).Size())); + GetVisualViewport().VisibleContentRect(scrollbar_inclusion).Size())); PhysicalRect visible_scroll_snapport = Intersection(visual_rect_in_content, frame_rect_in_content); @@ -240,6 +241,56 @@ return LayoutViewport().ScrollCornerRect(); } +bool RootFrameViewport::ApplyPendingHistoryRestoreScrollOffset() { + if (!pending_view_state_) + return false; + + bool should_restore_scale = pending_view_state_->page_scale_factor_; + + if (should_restore_scroll_) { + // TODO(pnoland): attempt to restore the anchor in more places than this. + // Anchor-based restore should allow for earlier restoration. + bool did_restore = LayoutViewport().RestoreScrollAnchor( + {pending_view_state_->scroll_anchor_data_.selector_, + LayoutPoint(pending_view_state_->scroll_anchor_data_.offset_.x(), + pending_view_state_->scroll_anchor_data_.offset_.y()), + pending_view_state_->scroll_anchor_data_.simhash_}); + if (!did_restore) { + LayoutViewport().SetScrollOffset(pending_view_state_->scroll_offset_, + kProgrammaticScroll); + } + } + + // For main frame restore scale and visual viewport position + ScrollOffset visual_viewport_offset( + pending_view_state_->visual_viewport_scroll_offset_); + + // If the visual viewport's offset is (-1, -1) it means the history item + // is an old version of HistoryItem so distribute the scroll between + // the main frame and the visual viewport as best as we can. + if (visual_viewport_offset.Width() == -1 && + visual_viewport_offset.Height() == -1) { + visual_viewport_offset = pending_view_state_->scroll_offset_ - + LayoutViewport().GetScrollOffset(); + } + + auto* visual_viewport = static_cast<VisualViewport*>(&GetVisualViewport()); + if (should_restore_scale && should_restore_scroll_) { + visual_viewport->SetScaleAndLocation( + pending_view_state_->page_scale_factor_, + visual_viewport->IsPinchGestureActive(), + FloatPoint(visual_viewport_offset)); + } else if (should_restore_scale) { + visual_viewport->SetScale(pending_view_state_->page_scale_factor_); + } else if (should_restore_scroll_) { + visual_viewport->SetLocation(FloatPoint(visual_viewport_offset)); + } + + should_restore_scroll_ = false; + + return true; +} + void RootFrameViewport::SetScrollOffset(const ScrollOffset& offset, ScrollType scroll_type, ScrollBehavior scroll_behavior, @@ -278,7 +329,7 @@ const ScrollOffset& offset) const { ScrollOffset scroll_offset = offset; FloatRect user_scrollable = GetUserScrollableRect(LayoutViewport()) + - GetUserScrollableRect(VisualViewport()); + GetUserScrollableRect(GetVisualViewport()); scroll_offset.SetWidth(clampTo(scroll_offset.Width(), user_scrollable.X(), user_scrollable.MaxX())); scroll_offset.SetHeight(clampTo(scroll_offset.Height(), user_scrollable.Y(), @@ -362,9 +413,9 @@ } ScrollableArea& primary = - scroll_first == kVisualViewport ? VisualViewport() : LayoutViewport(); + scroll_first == kVisualViewport ? GetVisualViewport() : LayoutViewport(); ScrollableArea& secondary = - scroll_first == kVisualViewport ? LayoutViewport() : VisualViewport(); + scroll_first == kVisualViewport ? LayoutViewport() : GetVisualViewport(); ScrollOffset target_offset = primary.ClampScrollOffset( primary.GetScrollAnimator().CurrentOffset() + delta); @@ -402,22 +453,22 @@ ScrollOffset RootFrameViewport::GetScrollOffset() const { return LayoutViewport().GetScrollOffset() + - VisualViewport().GetScrollOffset(); + GetVisualViewport().GetScrollOffset(); } IntSize RootFrameViewport::MinimumScrollOffsetInt() const { return IntSize(LayoutViewport().MinimumScrollOffsetInt() + - VisualViewport().MinimumScrollOffsetInt()); + GetVisualViewport().MinimumScrollOffsetInt()); } IntSize RootFrameViewport::MaximumScrollOffsetInt() const { return LayoutViewport().MaximumScrollOffsetInt() + - VisualViewport().MaximumScrollOffsetInt(); + GetVisualViewport().MaximumScrollOffsetInt(); } ScrollOffset RootFrameViewport::MaximumScrollOffset() const { return LayoutViewport().MaximumScrollOffset() + - VisualViewport().MaximumScrollOffset(); + GetVisualViewport().MaximumScrollOffset(); } IntSize RootFrameViewport::ClampScrollOffset( @@ -446,7 +497,7 @@ bool RootFrameViewport::UserInputScrollable( ScrollbarOrientation orientation) const { - return VisualViewport().UserInputScrollable(orientation) || + return GetVisualViewport().UserInputScrollable(orientation) || LayoutViewport().UserInputScrollable(orientation); } @@ -499,7 +550,8 @@ // scroll delta, regardless of how much will actually scroll, but we need to // know how much to leave for the layout viewport. FloatSize visual_consumed_delta = - VisualViewport().GetScrollAnimator().ComputeDeltaToConsume(pixel_delta); + GetVisualViewport().GetScrollAnimator().ComputeDeltaToConsume( + pixel_delta); // Split the remaining delta between scrollable and unscrollable axes of the // layout viewport. We only pass a delta to the scrollable axes and remember @@ -529,7 +581,7 @@ // not through the ScrollableAreas? if (visual_consumed_delta == pixel_delta) { ScrollResult visual_result = - VisualViewport().GetScrollAnimator().UserScroll( + GetVisualViewport().GetScrollAnimator().UserScroll( granularity, visual_consumed_delta, run_on_return.Release()); return visual_result; } @@ -537,8 +589,9 @@ ScrollableArea::ScrollCallback callback = run_on_return.Release(); auto all_done = callback ? base::BarrierClosure(2, std::move(callback)) : base::RepeatingClosure(); - ScrollResult visual_result = VisualViewport().GetScrollAnimator().UserScroll( - granularity, visual_consumed_delta, all_done); + ScrollResult visual_result = + GetVisualViewport().GetScrollAnimator().UserScroll( + granularity, visual_consumed_delta, all_done); ScrollResult layout_result = LayoutViewport().GetScrollAnimator().UserScroll( granularity, scrollable_axis_delta, all_done); @@ -564,8 +617,8 @@ CompositorElementId RootFrameViewport::GetScrollbarElementId( ScrollbarOrientation orientation) { - return VisualViewport().VisualViewportSuppliesScrollbars() - ? VisualViewport().GetScrollbarElementId(orientation) + return GetVisualViewport().VisualViewportSuppliesScrollbars() + ? GetVisualViewport().GetScrollbarElementId(orientation) : LayoutViewport().GetScrollbarElementId(orientation); } @@ -580,25 +633,25 @@ void RootFrameViewport::ServiceScrollAnimations(double monotonic_time) { ScrollableArea::ServiceScrollAnimations(monotonic_time); LayoutViewport().ServiceScrollAnimations(monotonic_time); - VisualViewport().ServiceScrollAnimations(monotonic_time); + GetVisualViewport().ServiceScrollAnimations(monotonic_time); } void RootFrameViewport::UpdateCompositorScrollAnimations() { ScrollableArea::UpdateCompositorScrollAnimations(); LayoutViewport().UpdateCompositorScrollAnimations(); - VisualViewport().UpdateCompositorScrollAnimations(); + GetVisualViewport().UpdateCompositorScrollAnimations(); } void RootFrameViewport::CancelProgrammaticScrollAnimation() { ScrollableArea::CancelProgrammaticScrollAnimation(); LayoutViewport().CancelProgrammaticScrollAnimation(); - VisualViewport().CancelProgrammaticScrollAnimation(); + GetVisualViewport().CancelProgrammaticScrollAnimation(); } void RootFrameViewport::ClearScrollableArea() { ScrollableArea::ClearScrollableArea(); LayoutViewport().ClearScrollableArea(); - VisualViewport().ClearScrollableArea(); + GetVisualViewport().ClearScrollableArea(); } ScrollbarTheme& RootFrameViewport::GetPageScrollbarTheme() const {
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.h b/third_party/blink/renderer/core/frame/root_frame_viewport.h index 2b70633..30ade1b 100644 --- a/third_party/blink/renderer/core/frame/root_frame_viewport.h +++ b/third_party/blink/renderer/core/frame/root_frame_viewport.h
@@ -128,6 +128,15 @@ base::Optional<FloatPoint> GetSnapPositionAndSetTarget( const cc::SnapSelectionStrategy& strategy) override; + void SetPendingHistoryRestoreScrollOffset( + const HistoryItem::ViewState& view_state, + bool should_restore_scroll) override { + pending_view_state_ = view_state; + should_restore_scroll_ = should_restore_scroll; + } + + bool ApplyPendingHistoryRestoreScrollOffset() override; + private: FRIEND_TEST_ALL_PREFIXES(RootFrameViewportTest, DistributeScrollOrder); @@ -147,7 +156,7 @@ // class' animator so use this method to pull updated values when necessary. void UpdateScrollAnimator(); - ScrollableArea& VisualViewport() const { + ScrollableArea& GetVisualViewport() const { DCHECK(visual_viewport_); return *visual_viewport_; } @@ -156,6 +165,8 @@ Member<ScrollableArea> visual_viewport_; Member<ScrollableArea> layout_viewport_; + base::Optional<HistoryItem::ViewState> pending_view_state_; + bool should_restore_scroll_; }; template <>
diff --git a/third_party/blink/renderer/core/frame/user_activation.cc b/third_party/blink/renderer/core/frame/user_activation.cc index 58edb1a..f724787 100644 --- a/third_party/blink/renderer/core/frame/user_activation.cc +++ b/third_party/blink/renderer/core/frame/user_activation.cc
@@ -11,7 +11,7 @@ UserActivation* UserActivation::CreateSnapshot(LocalDOMWindow* window) { LocalFrame* frame = window->GetFrame(); return MakeGarbageCollected<UserActivation>( - frame ? frame->HasBeenActivated() : false, + frame ? frame->HasStickyUserActivation() : false, LocalFrame::HasTransientUserActivation(frame)); } @@ -31,7 +31,7 @@ LocalFrame* frame = window_ ? window_->GetFrame() : nullptr; if (!frame) return has_been_active_; - return frame->HasBeenActivated(); + return frame->HasStickyUserActivation(); } bool UserActivation::isActive() const {
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc index c7d034e..4263efb6 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -706,6 +706,12 @@ scroll_behavior, std::move(on_finish)); } +void VisualViewport::SetScrollOffset(const ScrollOffset& offset, + ScrollType scroll_type, + ScrollBehavior scroll_behavior) { + SetScrollOffset(offset, scroll_type, scroll_behavior, ScrollCallback()); +} + PhysicalRect VisualViewport::ScrollIntoView( const PhysicalRect& rect_in_absolute, const WebScrollIntoViewParams& params) {
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h index eb4cc33d..286534e8 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.h +++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -92,9 +92,8 @@ // +- horizontal_scrollbar_effect_node_ // +- vertical_scrollbar_effect_node_ // -class CORE_EXPORT VisualViewport final - : public GarbageCollected<VisualViewport>, - public ScrollableArea { +class CORE_EXPORT VisualViewport : public GarbageCollected<VisualViewport>, + public ScrollableArea { USING_GARBAGE_COLLECTED_MIXIN(VisualViewport); public: @@ -178,6 +177,9 @@ ScrollType, ScrollBehavior, ScrollCallback on_finish) override; + void SetScrollOffset(const ScrollOffset&, + ScrollType, + ScrollBehavior = kScrollBehaviorInstant) override; PhysicalRect ScrollIntoView(const PhysicalRect&, const WebScrollIntoViewParams&) override; bool IsThrottled() const override { @@ -213,7 +215,8 @@ CompositorAnimationTimeline* GetCompositorAnimationTimeline() const override; IntRect VisibleContentRect( IncludeScrollbarsInRect = kExcludeScrollbars) const override; - scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner() const final; + scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner() + const override; WebColorScheme UsedColorScheme() const override; // VisualViewport scrolling may involve pinch zoom and gets routed through
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc index bb206a1..c5c73eb9 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -965,7 +965,7 @@ frame_test_helpers::LoadHistoryItem(WebView()->MainFrameImpl(), item, mojom::FetchCacheMode::kDefault); - + UpdateAllLifecyclePhases(); VisualViewport& visual_viewport = GetFrame()->GetPage()->GetVisualViewport(); EXPECT_EQ(2, visual_viewport.Scale()); @@ -995,7 +995,7 @@ frame_test_helpers::LoadHistoryItem(WebView()->MainFrameImpl(), item, mojom::FetchCacheMode::kDefault); - + UpdateAllLifecyclePhases(); VisualViewport& visual_viewport = GetFrame()->GetPage()->GetVisualViewport(); EXPECT_EQ(2, visual_viewport.Scale()); EXPECT_EQ(ScrollOffset(100, 150),
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 27fadd0..7547cb66 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -585,6 +585,23 @@ return FrameForContext(context); } +void WebLocalFrameImpl::NotifyUserActivation() { + LocalFrame::NotifyUserActivation(GetFrame()); +} + +bool WebLocalFrameImpl::HasStickyUserActivation() { + return GetFrame()->HasStickyUserActivation(); +} + +bool WebLocalFrameImpl::HasTransientUserActivation() { + return LocalFrame::HasTransientUserActivation(GetFrame()); +} + +bool WebLocalFrameImpl::ConsumeTransientUserActivation( + UserActivationUpdateSource update_source) { + return LocalFrame::ConsumeTransientUserActivation(GetFrame(), update_source); +} + WebLocalFrame* WebLocalFrame::FrameForContext(v8::Local<v8::Context> context) { return WebLocalFrameImpl::FromFrame(ToLocalFrameIfNotDetached(context)); }
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index e3d4a36..6990498 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -314,8 +314,10 @@ void WasHidden() override; void WasShown() override; void SetAllowsCrossBrowsingInstanceFrameLookup() override; - - void CollectGarbageForTesting(); + void NotifyUserActivation() override; + bool HasStickyUserActivation() override; + bool HasTransientUserActivation() override; + bool ConsumeTransientUserActivation(UserActivationUpdateSource) override; // WebNavigationControl overrides: bool DispatchBeforeUnloadEvent(bool) override; @@ -354,6 +356,7 @@ void WillBeDetached(); void WillDetachParent(); + void CollectGarbageForTesting(); static WebLocalFrameImpl* CreateMainFrame(WebView*, WebLocalFrameClient*,
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc index 51de8c3..2793b17 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc
@@ -40,9 +40,8 @@ const CanvasContextCreationAttributesCore& attrs) : host_(host), color_params_(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, - kNonOpaque, - CanvasForceRGBA::kNotForced), + CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque), creation_attributes_(attrs) { // Supported color spaces and pixel formats: sRGB in uint8, e-sRGB in f16, // linear sRGB and p3 and rec2020 with linear gamma transfer function in f16. @@ -89,6 +88,8 @@ return kRGBA8CanvasPixelFormatName; case CanvasPixelFormat::kF16: return kF16CanvasPixelFormatName; + case CanvasPixelFormat::kBGRA8: + return kBGRA8CanvasPixelFormatName; }; CHECK(false); return "";
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h index 787de81..e14dd73 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -51,6 +51,7 @@ constexpr const char* kP3CanvasColorSpaceName = "p3"; constexpr const char* kRGBA8CanvasPixelFormatName = "uint8"; +constexpr const char* kBGRA8CanvasPixelFormatName = "uint8"; constexpr const char* kF16CanvasPixelFormatName = "float16"; class CORE_EXPORT CanvasRenderingContext : public ScriptWrappable,
diff --git a/third_party/blink/renderer/core/html/canvas/image_data.cc b/third_party/blink/renderer/core/html/canvas/image_data.cc index 50256d97..704e0f2 100644 --- a/third_party/blink/renderer/core/html/canvas/image_data.cc +++ b/third_party/blink/renderer/core/html/canvas/image_data.cc
@@ -693,7 +693,7 @@ if (!content.DataLength()) return nullptr; - if (pixel_format == CanvasPixelFormat::kRGBA8 && + if (pixel_format == CanvasColorParams::GetNativeCanvasPixelFormat() && storage_format == kUint8ClampedArrayStorageFormat) { DOMArrayBuffer* array_buffer = DOMArrayBuffer::Create(content); return DOMUint8ClampedArray::Create(array_buffer, 0, @@ -756,11 +756,12 @@ return CanvasColorParams(); CanvasColorSpace color_space = ImageData::GetCanvasColorSpace(color_settings_->colorSpace()); - CanvasPixelFormat pixel_format = CanvasPixelFormat::kRGBA8; - if (color_settings_->storageFormat() != kUint8ClampedArrayStorageFormatName) - pixel_format = CanvasPixelFormat::kF16; - return CanvasColorParams(color_space, pixel_format, kNonOpaque, - CanvasForceRGBA::kNotForced); + return CanvasColorParams( + color_space, + color_settings_->storageFormat() != kUint8ClampedArrayStorageFormatName + ? CanvasPixelFormat::kF16 + : CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); } bool ImageData::ImageDataInCanvasColorSettings( @@ -774,8 +775,7 @@ return false; CanvasColorParams canvas_color_params = - CanvasColorParams(canvas_color_space, canvas_pixel_format, kNonOpaque, - CanvasForceRGBA::kNotForced); + CanvasColorParams(canvas_color_space, canvas_pixel_format, kNonOpaque); unsigned char* src_data = static_cast<unsigned char*>(BufferBase()->Data()); @@ -788,7 +788,7 @@ src_pixel_format = skcms_PixelFormat_RGBA_ffff; skcms_PixelFormat dst_pixel_format = skcms_PixelFormat_RGBA_8888; - if (canvas_pixel_format == CanvasPixelFormat::kRGBA8 && + if (canvas_pixel_format == CanvasColorParams::GetNativeCanvasPixelFormat() && u8_color_type == kN32ColorType && kN32_SkColorType == kBGRA_8888_SkColorType) { dst_pixel_format = skcms_PixelFormat_BGRA_8888;
diff --git a/third_party/blink/renderer/core/html/canvas/image_data_test.cc b/third_party/blink/renderer/core/html/canvas/image_data_test.cc index 7687cffb..ba69b337 100644 --- a/third_party/blink/renderer/core/html/canvas/image_data_test.cc +++ b/third_party/blink/renderer/core/html/canvas/image_data_test.cc
@@ -84,7 +84,7 @@ data->BaseAddress(), rgba32_pixels, kNumPixels, kPixelFormat_8888, kAlphaUnmultiplied, kNoUnpremulRoundTripTolerance); - // Testing CanvasPixelFormat::kRGBA8prN32-> + // Testing CanvasPixelFormat::kRGBA8-> // kUint16ArrayStorageFormat data = ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat( contents_rgba32_2, CanvasPixelFormat::kRGBA8, kUint16ArrayStorageFormat); @@ -92,8 +92,7 @@ ColorCorrectionTestUtils::CompareColorCorrectedPixels( data->BaseAddress(), u16_pixels, kNumPixels, kPixelFormat_16161616, kAlphaUnmultiplied, kUnpremulRoundTripTolerance); - - // Testing CanvasPixelFormat::kRGBA8prN32 -> + // Testing CanvasPixelFormat::kRGBA8 -> // kFloat32ArrayStorageFormat data = ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat( contents_rgba32_2, CanvasPixelFormat::kRGBA8, kFloat32ArrayStorageFormat);
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc b/third_party/blink/renderer/core/html/forms/password_input_type_test.cc index 0f8b2d1..10489e2 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc +++ b/third_party/blink/renderer/core/html/forms/password_input_type_test.cc
@@ -77,8 +77,8 @@ nullptr /* extra_data */); blink::test::RunPendingTasks(); MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().SetSecureContextStateForTesting( - SecureContextState::kSecure); + page_holder->GetDocument().SetSecureContextModeForTesting( + SecureContextMode::kSecureContext); page_holder->GetDocument().body()->SetInnerHTMLFromString( "<input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index b0234d7..47e38f69 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -428,13 +428,6 @@ } if (HasRel(kRelationNoOpener)) frame_request.SetNoOpener(); - if (RuntimeEnabledFeatures::HrefTranslateEnabled(&GetDocument()) && - FastHasAttribute(html_names::kHreftranslateAttr)) { - frame_request.SetHrefTranslate( - FastGetAttribute(html_names::kHreftranslateAttr)); - UseCounter::Count(GetDocument(), - WebFeature::kHTMLAnchorElementHrefTranslateAttribute); - } frame_request.SetTriggeringEventInfo( event.isTrusted() ? TriggeringEventInfo::kFromTrustedEvent : TriggeringEventInfo::kFromUntrustedEvent); @@ -448,6 +441,18 @@ frame_request, target.IsEmpty() ? GetDocument().BaseTarget() : target) .frame; + + // If hrefTranslate is enabled and set restrict processing it + // to same frame or navigations with noopener set. + if (RuntimeEnabledFeatures::HrefTranslateEnabled(&GetDocument()) && + FastHasAttribute(html_names::kHreftranslateAttr) && + (target_frame == frame || frame_request.GetWindowFeatures().noopener)) { + frame_request.SetHrefTranslate( + FastGetAttribute(html_names::kHreftranslateAttr)); + UseCounter::Count(GetDocument(), + WebFeature::kHTMLAnchorElementHrefTranslateAttribute); + } + if (target_frame) target_frame->Navigate(frame_request, WebFrameLoadType::kStandard); }
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc index 28ae790a..a14c555 100644 --- a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc +++ b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc
@@ -1444,6 +1444,7 @@ "image/png"); Compositor().BeginFrame(); test::RunPendingTasks(); + Compositor().BeginFrame(); lazy_image.Complete(ReadTestImage()); test::RunPendingTasks(); histogram_tester.ExpectTotalCount(
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc index 64994eda..4172348 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc +++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -92,7 +92,7 @@ for (Frame* frame = document.GetFrame(); frame; frame = frame->Tree().Parent()) { - if (frame->HasBeenActivated() || + if (frame->HasStickyUserActivation() || frame->HadStickyUserActivationBeforeNavigation()) { return true; } @@ -365,7 +365,7 @@ for (Frame* frame = document.GetFrame(); frame; frame = frame->Tree().Parent()) { - if (frame->HasBeenActivated() || + if (frame->HasStickyUserActivation() || frame->HadStickyUserActivationBeforeNavigation()) { autoplay_initiated_ = false; break;
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc index 6dbfca6..9ecff9f 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc +++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
@@ -39,7 +39,7 @@ if (LocalFrame::HasTransientUserActivation(frame)) result |= 0x01; - if (frame->HasBeenActivated()) + if (frame->HasStickyUserActivation()) result |= 0x02; if (frame->HadStickyUserActivationBeforeNavigation()) result |= 0x04;
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc index e57a822..4545d389 100644 --- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
@@ -83,6 +83,16 @@ .build(); } +static std::unique_ptr<protocol::DOM::Rect> BuildObjectForRect( + const gfx::RectF& rect) { + return protocol::DOM::Rect::create() + .setX(rect.x()) + .setY(rect.y()) + .setHeight(rect.height()) + .setWidth(rect.width()) + .build(); +} + static std::unique_ptr<protocol::LayerTree::ScrollRect> BuildScrollRect( const gfx::Rect& rect, const String& type) {
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index a116903..41f21a19 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1478,7 +1478,7 @@ // Clear the user activation state. // TODO(crbug.com/736415): Clear this bit unconditionally for all frames. if (frame_->IsMainFrame()) - frame_->ClearActivation(); + frame_->ClearUserActivation(); // The DocumentLoader was flagged as activated if it needs to notify the frame // that it was activated before navigation. Update the frame state based on
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index 149c1eb..45ca19c 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -134,7 +134,7 @@ type == WebFrameLoadType::kReloadBypassingCache; } -static bool NeedsHistoryItemRestore(WebFrameLoadType type) { +bool FrameLoader::NeedsHistoryItemRestore(WebFrameLoadType type) { return type == WebFrameLoadType::kBackForward || IsReloadLoadType(type); } @@ -1200,79 +1200,9 @@ if (!NeedsHistoryItemRestore(load_type)) return; - bool should_restore_scroll = - scroll_restoration_type != kScrollRestorationManual; - bool should_restore_scale = view_state.page_scale_factor_; - - // This tries to balance: - // 1. restoring as soon as possible. - // 2. not overriding user scroll (TODO(majidvp): also respect user scale). - // 3. detecting clamping to avoid repeatedly popping the scroll position down - // as the page height increases. - // 4. forcing a layout if necessary to avoid clamping. - // 5. ignoring clamp detection if scroll state is not being restored, if load - // is complete, or if the navigation is same-document (as the new page may - // be smaller than the previous page). - bool can_restore_without_clamping = - view->LayoutViewport()->ClampScrollOffset(view_state.scroll_offset_) == - view_state.scroll_offset_; - - bool should_force_clamping = !frame_->IsLoading() || is_same_document; - // Here |can_restore_without_clamping| is false, but layout might be necessary - // to ensure correct content size. - if (!can_restore_without_clamping && should_force_clamping) - frame_->GetDocument()->UpdateStyleAndLayout(); - - bool can_restore_without_annoying_user = - !GetDocumentLoader()->GetInitialScrollState().was_scrolled_by_user && - (can_restore_without_clamping || should_force_clamping || - !should_restore_scroll); - if (!can_restore_without_annoying_user) - return; - - if (should_restore_scroll) { - // TODO(pnoland): attempt to restore the anchor in more places than this. - // Anchor-based restore should allow for earlier restoration. - bool did_restore = view->LayoutViewport()->RestoreScrollAnchor( - {view_state.scroll_anchor_data_.selector_, - LayoutPoint(view_state.scroll_anchor_data_.offset_.x(), - view_state.scroll_anchor_data_.offset_.y()), - view_state.scroll_anchor_data_.simhash_}); - if (!did_restore) { - view->LayoutViewport()->SetScrollOffset(view_state.scroll_offset_, - kProgrammaticScroll); - } - } - - // For main frame restore scale and visual viewport position - if (frame_->IsMainFrame()) { - ScrollOffset visual_viewport_offset( - view_state.visual_viewport_scroll_offset_); - - // If the visual viewport's offset is (-1, -1) it means the history item - // is an old version of HistoryItem so distribute the scroll between - // the main frame and the visual viewport as best as we can. - if (visual_viewport_offset.Width() == -1 && - visual_viewport_offset.Height() == -1) { - visual_viewport_offset = - view_state.scroll_offset_ - view->LayoutViewport()->GetScrollOffset(); - } - - VisualViewport& visual_viewport = frame_->GetPage()->GetVisualViewport(); - if (should_restore_scale && should_restore_scroll) { - visual_viewport.SetScaleAndLocation( - view_state.page_scale_factor_, visual_viewport.IsPinchGestureActive(), - FloatPoint(visual_viewport_offset)); - } else if (should_restore_scale) { - visual_viewport.SetScale(view_state.page_scale_factor_); - } else if (should_restore_scroll) { - visual_viewport.SetLocation(FloatPoint(visual_viewport_offset)); - } - - if (ScrollingCoordinator* scrolling_coordinator = - frame_->GetPage()->GetScrollingCoordinator()) - scrolling_coordinator->FrameViewRootLayerDidChange(view); - } + view->GetScrollableArea()->SetPendingHistoryRestoreScrollOffset( + view_state, scroll_restoration_type != kScrollRestorationManual); + view->ScheduleAnimation(); GetDocumentLoader()->GetInitialScrollState().did_restore_from_history = true; }
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h index 39d265b..f58504a0 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.h +++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -238,6 +238,8 @@ bool IsClientNavigationInitialHistoryLoad(); + static bool NeedsHistoryItemRestore(WebFrameLoadType type); + private: bool AllowRequestForThisFrame(const FrameLoadRequest&); WebFrameLoadType DetermineFrameLoadType(const KURL& url,
diff --git a/third_party/blink/renderer/core/loader/programmatic_scroll_test.cc b/third_party/blink/renderer/core/loader/programmatic_scroll_test.cc index 1ea08b5..36eb93c 100644 --- a/third_party/blink/renderer/core/loader/programmatic_scroll_test.cc +++ b/third_party/blink/renderer/core/loader/programmatic_scroll_test.cc
@@ -71,6 +71,8 @@ loader.GetDocumentLoader()->GetInitialScrollState().was_scrolled_by_user = false; loader.RestoreScrollPositionAndViewState(); + web_view->MainFrameWidget()->UpdateAllLifecyclePhases( + WebWidget::LifecycleUpdateReason::kTest); // Expect that both scroll and scale were restored. EXPECT_EQ(2.0f, web_view->PageScaleFactor()); @@ -101,6 +103,8 @@ // FrameLoader::restoreScrollPositionAndViewState flows differently if scale // is zero. loader.RestoreScrollPositionAndViewState(); + web_view->MainFrameWidget()->UpdateAllLifecyclePhases( + WebWidget::LifecycleUpdateReason::kTest); // Expect that only the scroll position was restored. EXPECT_EQ(3.0f, web_view->PageScaleFactor());
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc b/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc index ae9a87f..d9f67abd 100644 --- a/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc +++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context_test.cc
@@ -89,7 +89,10 @@ scoped_refptr<SecurityOrigin> page_origin = SecurityOrigin::Create(page_url); execution_context_->GetSecurityContext().SetSecurityOrigin(page_origin); - execution_context_->SetIsSecureContext(SecurityOrigin::IsSecure(page_url)); + execution_context_->SetSecureContextModeForTesting( + SecurityOrigin::IsSecure(page_url) + ? SecureContextMode::kSecureContext + : SecureContextMode::kInsecureContext); } bool IsFeatureEnabled(const String& origin, OriginTrialFeature feature) {
diff --git a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc index 73dc75a7..d884f0c 100644 --- a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc +++ b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc
@@ -168,16 +168,6 @@ needs_invoke_ = false; } -void ElementFragmentAnchor::DidCompleteLoad() { - DCHECK(frame_); - DCHECK(frame_->View()); - - // If there is a pending layout, the fragment anchor will be cleared when it - // finishes. - if (!frame_->View()->NeedsLayout()) - needs_invoke_ = false; -} - void ElementFragmentAnchor::Trace(blink::Visitor* visitor) { visitor->Trace(anchor_node_); visitor->Trace(frame_);
diff --git a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h index f51ce60..4b5c885 100644 --- a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h
@@ -52,9 +52,6 @@ // so we can't do it in Invoke. void PerformPreRafActions() override; - // We can dispose of the fragment once load has been completed. - void DidCompleteLoad() override; - // Does nothing as an element anchor does not have any dismissal work. bool Dismiss() override;
diff --git a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h index 7550d56..5127fff 100644 --- a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h
@@ -51,7 +51,6 @@ virtual void DidScroll(ScrollType type) = 0; virtual void PerformPreRafActions() = 0; - virtual void DidCompleteLoad() = 0; // Dismissing the fragment anchor removes indicators of the anchor, such as // text highlighting on a text fragment anchor. If true, the anchor has been
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index a0fde57..7458ce2 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc
@@ -278,9 +278,9 @@ !constraint.is_anchored_bottom); EXPECT_EQ(1.f, constraint.top_offset); EXPECT_EQ(1.f, constraint.left_offset); - EXPECT_EQ(gfx::Rect(100, 100, 10, 10), + EXPECT_EQ(gfx::RectF(100, 100, 10, 10), constraint.scroll_container_relative_sticky_box_rect); - EXPECT_EQ(gfx::Rect(100, 100, 200, 200), + EXPECT_EQ(gfx::RectF(100, 100, 200, 200), constraint.scroll_container_relative_containing_block_rect); } { @@ -322,9 +322,9 @@ Element* element = document->getElementById("composited-top"); auto constraint = GetStickyConstraint(element); EXPECT_TRUE(constraint.is_anchored_top); - EXPECT_EQ(gfx::Rect(100, 110, 10, 10), + EXPECT_EQ(gfx::RectF(100, 110, 10, 10), constraint.scroll_container_relative_sticky_box_rect); - EXPECT_EQ(gfx::Rect(100, 100, 200, 200), + EXPECT_EQ(gfx::RectF(100, 100, 200, 200), constraint.scroll_container_relative_containing_block_rect); } }
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc index 35838a6c..460f2a2 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc
@@ -193,15 +193,6 @@ } } -void TextFragmentAnchor::DidCompleteLoad() { - if (search_finished_) - return; - - // If there is a pending layout we'll finish the search from Invoke. - if (!frame_->View()->NeedsLayout()) - DidFinishSearch(); -} - void TextFragmentAnchor::Trace(blink::Visitor* visitor) { visitor->Trace(frame_); visitor->Trace(element_fragment_anchor_);
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h index 2beae58..92f00ea 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h
@@ -53,8 +53,6 @@ void PerformPreRafActions() override; - void DidCompleteLoad() override; - // Removes text match highlights if any highlight is in view. bool Dismiss() override;
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc index f3cbba8..f36ba938 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc
@@ -65,10 +65,10 @@ <p>This is a test page</p> <p>With ambiguous test content</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + histogram_tester_.ExpectTotalCount("TextFragmentAnchor.SelectorCount", 1); histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.SelectorCount", 2, 1); @@ -109,10 +109,10 @@ </style> <p>This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + histogram_tester_.ExpectTotalCount("TextFragmentAnchor.SelectorCount", 1); histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.SelectorCount", 1, 1); @@ -169,10 +169,10 @@ <!DOCTYPE html> <p>This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + histogram_tester_.ExpectTotalCount("TextFragmentAnchor.SelectorCount", 1); histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.SelectorCount", 1, 1); @@ -225,9 +225,9 @@ // Set the target text to visible and change its position to cause a layout // and invoke the fragment anchor. css_request.Complete("p { visibility: visible; top: 1001px; }"); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); histogram_tester_.ExpectTotalCount("TextFragmentAnchor.SelectorCount", 1); histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.SelectorCount", 1, @@ -269,9 +269,10 @@ </style> <p>This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kTextFragmentAnchor)); EXPECT_TRUE( GetDocument().IsUseCounted(WebFeature::kTextFragmentAnchorMatchFound));
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc index e0eb6b3..13b3fcb2 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
@@ -92,10 +92,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_EQ(p, *GetDocument().CssTarget()); @@ -123,9 +123,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(ScrollOffset(), LayoutViewport()->GetScrollOffset()); // Force a layout @@ -159,10 +160,10 @@ <p id="first">This is a test page</p> <p id="second">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& first = *GetDocument().getElementById("first"); EXPECT_EQ(first, *GetDocument().CssTarget()); @@ -194,10 +195,10 @@ </div> </body> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& match = *GetDocument().getElementById("match"); EXPECT_EQ(match, *GetDocument().CssTarget()); @@ -230,10 +231,10 @@ <p id="first">This is a test page</p> <p id="second">This is some more text</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& first = *GetDocument().getElementById("first"); EXPECT_EQ(first, *GetDocument().CssTarget()); @@ -267,10 +268,10 @@ <p id="first">This is a page</p> <p id="second">This is some more text</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& second = *GetDocument().getElementById("second"); EXPECT_EQ(second, *GetDocument().CssTarget()); @@ -300,10 +301,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_EQ(p, *GetDocument().CssTarget()); @@ -337,9 +338,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(ScrollOffset(), LayoutViewport()->GetScrollOffset()); // Force a layout @@ -369,10 +371,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("text"), *GetDocument().CssTarget()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -404,10 +406,10 @@ <p id="text1">This is a test page</p> <p id="text2">with another paragraph of text</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().body(), *GetDocument().CssTarget()); EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); @@ -449,10 +451,10 @@ <p id="text2">with another paragraph of text</p> </div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().body(), *GetDocument().CssTarget()); EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); @@ -491,8 +493,6 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); EXPECT_EQ(nullptr, GetDocument().CssTarget()); @@ -525,10 +525,10 @@ <p id="text2">with another paragraph of text</p> </div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().body(), *GetDocument().CssTarget()); EXPECT_EQ(3u, GetDocument().Markers().Markers().size()); @@ -566,10 +566,10 @@ <p id="text">This is a test page</p> <p>with another paragraph of text</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p))) << "<p> Element wasn't scrolled into view, viewport's scroll offset: " @@ -586,10 +586,10 @@ <!DOCTYPE html> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("text"), *GetDocument().CssTarget()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -630,8 +630,6 @@ <!DOCTYPE html> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); EXPECT_EQ(nullptr, GetDocument().CssTarget()); @@ -658,10 +656,10 @@ <p>A string of text</p> <p>Footer 2</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("expected"), *GetDocument().CssTarget()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -702,10 +700,10 @@ <p> Bad cat</p> </div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("expected"), *GetDocument().CssTarget()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -740,10 +738,10 @@ <p>suffix</p> <div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("expected"), *GetDocument().CssTarget()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -775,10 +773,10 @@ <p id="text">Cats</p> <p>Suffix</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p))) << "<p> Element wasn't scrolled into view, viewport's scroll offset: " @@ -800,10 +798,10 @@ <p id="text1">This is a test page</p> <p id="text2">Not a page with real content</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(*GetDocument().getElementById("text1"), *GetDocument().CssTarget()); // Expect marker on the first "page" @@ -851,9 +849,9 @@ // Set the target text to visible and change its position to cause a layout // and invoke the fragment anchor. css_request.Complete("p { visibility: visible; top: 1001px; }"); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); Element& p = *GetDocument().getElementById("text"); EXPECT_FALSE(ViewportRect().Contains(BoundingRectInFrame(p))); @@ -893,9 +891,9 @@ test </p> )HTML"); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); Element* iframe = GetDocument().getElementById("iframe"); auto* child_frame = @@ -966,9 +964,9 @@ test </p> )HTML"); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); ASSERT_EQ(ScrollOffset(), GetDocument().View()->GetScrollableArea()->GetScrollOffset()); @@ -1001,9 +999,10 @@ </style> <p id="text">test</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p))) @@ -1029,9 +1028,10 @@ <img src="image.svg"> <p id="text">test</p> )HTML"); - Compositor().PaintFrame(); RunAsyncMatchingTasks(); + Compositor().PaintFrame(); + ScrollOffset first_scroll_offset = LayoutViewport()->GetScrollOffset(); ASSERT_NE(ScrollOffset(), first_scroll_offset); @@ -1045,8 +1045,8 @@ <rect fill="green" width="200" height="2000"/> </svg> )SVG"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); // Ensure the target text is still in view and stayed centered ASSERT_NE(first_scroll_offset, LayoutViewport()->GetScrollOffset()); @@ -1075,10 +1075,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); // Expect marker on "This is a test". @@ -1108,10 +1108,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p))) @@ -1140,10 +1140,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("text"); EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p))) @@ -1176,9 +1176,10 @@ <p>This is a test page</p> <div id="element">Some text</div> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + // The TextFragmentAnchor needs another frame to invoke the element anchor Compositor().BeginFrame(); RunAsyncMatchingTasks(); @@ -1215,7 +1216,6 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); EXPECT_EQ(nullptr, GetDocument().CssTarget()); @@ -1241,7 +1241,6 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); EXPECT_EQ(nullptr, GetDocument().CssTarget()); @@ -1273,9 +1272,10 @@ <p id="first">This is a test page</p> <p id="second">This is a tes age</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("second"); EXPECT_EQ(p, *GetDocument().CssTarget()); @@ -1319,9 +1319,10 @@ <p id="first">This is a test page</p> <p id="second">With some more text</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); SimulateClick(100, 100); @@ -1359,9 +1360,10 @@ <p id="first">This is a test page</p> <p id="second">With some more text</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(2u, GetDocument().Markers().Markers().size()); SimulateTap(100, 100); @@ -1400,9 +1402,9 @@ // Set the target text to visible and change its position to cause a layout // and invoke the fragment anchor. css_request.Complete("p { visibility: visible; top: 1001px; }"); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1434,9 +1436,10 @@ </style> <p>This is a test page</p> )HTML"); - Compositor().BeginFrame(); RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(ScrollOffset(), LayoutViewport()->GetScrollOffset()); EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); @@ -1466,10 +1469,10 @@ </style> <p id="text">This is a test page</p> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); EXPECT_EQ(GetDocument().Url(), "https://example.com/test.html"); @@ -1499,10 +1502,10 @@ <p id="text">This is a test page</p> <div id="element">Some text</div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + EXPECT_EQ(GetDocument().Url(), "https://example.com/test.html#element"); Element& p = *GetDocument().getElementById("text"); @@ -1536,10 +1539,10 @@ <p id="element">This is a test page</p> <div id="element:~:id">Some text</div> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& p = *GetDocument().getElementById("element"); EXPECT_EQ(p, *GetDocument().CssTarget()); @@ -1565,10 +1568,10 @@ </style> <svg><text id="text" x="0" y="15">This is a test page</text></svg> )HTML"); - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); + Compositor().BeginFrame(); + Element& text = *GetDocument().getElementById("text"); EXPECT_EQ(text, *GetDocument().CssTarget()); @@ -1597,9 +1600,9 @@ <p id="text">This is a test page</p> )HTML"; request.Complete(html); + RunAsyncMatchingTasks(); Compositor().BeginFrame(); - RunAsyncMatchingTasks(); EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index 5d19ecd..4f9d444 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -230,6 +230,24 @@ layer_ = nullptr; } +bool PaintLayerScrollableArea::ApplyPendingHistoryRestoreScrollOffset() { + if (!pending_view_state_) + return false; + + // TODO(pnoland): attempt to restore the anchor in more places than this. + // Anchor-based restore should allow for earlier restoration. + bool did_restore = RestoreScrollAnchor( + {pending_view_state_->scroll_anchor_data_.selector_, + LayoutPoint(pending_view_state_->scroll_anchor_data_.offset_.x(), + pending_view_state_->scroll_anchor_data_.offset_.y()), + pending_view_state_->scroll_anchor_data_.simhash_}); + if (!did_restore) { + SetScrollOffset(pending_view_state_->scroll_offset_, kProgrammaticScroll); + } + + return true; +} + void PaintLayerScrollableArea::Trace(blink::Visitor* visitor) { visitor->Trace(scrollbar_manager_); visitor->Trace(scroll_anchor_);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h index 3f43bcec..b9a88b9f1 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -576,6 +576,16 @@ void DisposeImpl() override; + void SetPendingHistoryRestoreScrollOffset( + const HistoryItem::ViewState& view_state, + bool should_restore_scroll) override { + if (!should_restore_scroll) + return; + pending_view_state_ = view_state; + } + + bool ApplyPendingHistoryRestoreScrollOffset() override; + private: bool NeedsScrollbarReconstruction() const; @@ -764,6 +774,7 @@ ScrollingBackgroundDisplayItemClient scrolling_background_display_item_client_{*this}; ScrollCornerDisplayItemClient scroll_corner_display_item_client_{*this}; + base::Optional<HistoryItem::ViewState> pending_view_state_; }; DEFINE_TYPE_CASTS(PaintLayerScrollableArea,
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 6e0a4994..4919cede0 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -560,19 +560,17 @@ constraint->is_anchored_right = layout_constraint.is_anchored_right; constraint->is_anchored_top = layout_constraint.is_anchored_top; constraint->is_anchored_bottom = layout_constraint.is_anchored_bottom; + constraint->left_offset = layout_constraint.left_offset.ToFloat(); constraint->right_offset = layout_constraint.right_offset.ToFloat(); constraint->top_offset = layout_constraint.top_offset.ToFloat(); constraint->bottom_offset = layout_constraint.bottom_offset.ToFloat(); constraint->constraint_box_rect = - PixelSnappedIntRect(box_model.ComputeStickyConstrainingRect()); - constraint->scroll_container_relative_sticky_box_rect = - PixelSnappedIntRect( - layout_constraint.scroll_container_relative_sticky_box_rect); - constraint->scroll_container_relative_containing_block_rect = - PixelSnappedIntRect( - layout_constraint - .scroll_container_relative_containing_block_rect); + FloatRect(box_model.ComputeStickyConstrainingRect()); + constraint->scroll_container_relative_sticky_box_rect = FloatRect( + layout_constraint.scroll_container_relative_sticky_box_rect); + constraint->scroll_container_relative_containing_block_rect = FloatRect( + layout_constraint.scroll_container_relative_containing_block_rect); if (PaintLayer* sticky_box_shifting_ancestor = layout_constraint.nearest_sticky_layer_shifting_sticky_box) { constraint->nearest_element_shifting_sticky_box =
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc index 030a1f0e..c220635a 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -6024,26 +6024,6 @@ ->nearest_element_shifting_containing_block); } -TEST_P(PaintPropertyTreeBuilderTest, RoundedStickyConstraints) { - // This test verifies that sticky constraint rects are rounded to the nearest - // integer. - SetBodyInnerHTML(R"HTML( - <div id="scroller" style="overflow:scroll; width:300px; height:199.5px;"> - <div id="outer" style="position:sticky; top:10px; height:300px"> - </div> - <div style="height:1000px;"></div> - </div> - )HTML"); - GetDocument().getElementById("scroller")->setScrollTop(50); - UpdateAllLifecyclePhasesForTest(); - - const auto* outer_properties = PaintPropertiesForElement("outer"); - ASSERT_TRUE(outer_properties && outer_properties->StickyTranslation()); - EXPECT_EQ(gfx::Rect(0, 0, 300, 200), outer_properties->StickyTranslation() - ->GetStickyConstraint() - ->constraint_box_rect); -} - TEST_P(PaintPropertyTreeBuilderTest, NonScrollableSticky) { // This test verifies the property tree builder applies sticky offset // correctly when the clipping container cannot be scrolled, and
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.h b/third_party/blink/renderer/core/scroll/scrollable_area.h index 284280d..480285b 100644 --- a/third_party/blink/renderer/core/scroll/scrollable_area.h +++ b/third_party/blink/renderer/core/scroll/scrollable_area.h
@@ -31,6 +31,7 @@ #include "third_party/blink/public/platform/web_color_scheme.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" +#include "third_party/blink/renderer/core/loader/history_item.h" #include "third_party/blink/renderer/core/scroll/scrollbar.h" #include "third_party/blink/renderer/platform/geometry/float_quad.h" #include "third_party/blink/renderer/platform/graphics/color.h" @@ -103,9 +104,9 @@ ScrollType, ScrollBehavior, ScrollCallback on_finish); - void SetScrollOffset(const ScrollOffset&, - ScrollType, - ScrollBehavior = kScrollBehaviorInstant); + virtual void SetScrollOffset(const ScrollOffset&, + ScrollType, + ScrollBehavior = kScrollBehaviorInstant); void ScrollBy(const ScrollOffset&, ScrollType, ScrollBehavior = kScrollBehaviorInstant); @@ -114,6 +115,12 @@ ScrollType, ScrollBehavior = kScrollBehaviorInstant); + virtual void SetPendingHistoryRestoreScrollOffset( + const HistoryItem::ViewState& view_state, + bool should_restore_scroll) {} + // Returns true if it applied anything. + virtual bool ApplyPendingHistoryRestoreScrollOffset() { return false; } + // Scrolls the area so that the given rect, given in absolute coordinates, // such that it's visible in the area. Returns the new location of the input // rect in absolute coordinates.
diff --git a/third_party/blink/renderer/core/testing/null_execution_context.cc b/third_party/blink/renderer/core/testing/null_execution_context.cc index 30dc036..abd9ec3 100644 --- a/third_party/blink/renderer/core/testing/null_execution_context.cc +++ b/third_party/blink/renderer/core/testing/null_execution_context.cc
@@ -25,22 +25,12 @@ origin_trial_context, nullptr, WebSandboxFlags::kNone, - nullptr), - is_secure_context_(true), + nullptr, + SecureContextMode::kSecureContext), scheduler_(scheduler::CreateDummyFrameScheduler()) {} NullExecutionContext::~NullExecutionContext() {} -void NullExecutionContext::SetIsSecureContext(bool is_secure_context) { - is_secure_context_ = is_secure_context; -} - -bool NullExecutionContext::IsSecureContext(String& error_message) const { - if (!is_secure_context_) - error_message = "A secure context is required"; - return is_secure_context_; -} - void NullExecutionContext::SetUpSecurityContextForTesting() { auto* policy = MakeGarbageCollected<ContentSecurityPolicy>(); GetSecurityContext().SetSecurityOriginForTesting(
diff --git a/third_party/blink/renderer/core/testing/null_execution_context.h b/third_party/blink/renderer/core/testing/null_execution_context.h index ce5c8721..722e7682 100644 --- a/third_party/blink/renderer/core/testing/null_execution_context.h +++ b/third_party/blink/renderer/core/testing/null_execution_context.h
@@ -43,9 +43,6 @@ bool discard_duplicates) override {} void ExceptionThrown(ErrorEvent*) override {} - void SetIsSecureContext(bool); - bool IsSecureContext(String& error_message) const override; - void SetUpSecurityContextForTesting(); ResourceFetcher* Fetcher() const override { return nullptr; } @@ -59,8 +56,6 @@ BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() override; private: - bool is_secure_context_; - KURL url_; // A dummy scheduler to ensure that the callers of
diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer.h b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer.h index ca488c6c..72c45c1 100644 --- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer.h +++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer.h
@@ -73,9 +73,6 @@ inline void* DataMaybeShared(); inline const void* DataMaybeShared() const; inline size_t ByteLengthAsSizeT() const; - // This function is deprecated and should not be used. Use {ByteLengthAsSizeT} - // instead. - inline unsigned ByteLengthAsUnsigned() const; void AddView(ArrayBufferView*); void RemoveView(ArrayBufferView*); @@ -236,15 +233,6 @@ size_t ArrayBuffer::ByteLengthAsSizeT() const { return contents_.DataLength(); } - -// This function is deprecated and should not be used. Use {ByteLengthAsSizeT} -// instead. -unsigned ArrayBuffer::ByteLengthAsUnsigned() const { - // TODO(dtapuska): Revisit this cast. ArrayBufferContents - // uses size_t for storing data. Whereas ArrayBuffer IDL is - // only uint32_t based. - return base::checked_cast<unsigned>(contents_.DataLength()); -} } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_ARRAY_BUFFER_ARRAY_BUFFER_H_
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc index 6cda9a0b..24d6399d 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -325,19 +325,6 @@ return nullptr; } -bool WorkerGlobalScope::IsSecureContext(String& error_message) const { - // Until there are APIs that are available in workers and that - // require a privileged context test that checks ancestors, just do - // a simple check here. Once we have a need for a real - // |isSecureContext| check here, we can check the responsible - // document for a privileged context at worker creation time, pass - // it in via WorkerThreadStartupData, and check it here. - if (GetSecurityOrigin()->IsPotentiallyTrustworthy()) - return true; - error_message = GetSecurityOrigin()->IsPotentiallyTrustworthyErrorMessage(); - return false; -} - BrowserInterfaceBrokerProxy& WorkerGlobalScope::GetBrowserInterfaceBroker() { return browser_interface_broker_proxy_; }
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h index 3b89c502..dfeb4d40 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.h +++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -117,7 +117,6 @@ scheduler::WorkerScheduler* GetScheduler() final; void AddConsoleMessageImpl(ConsoleMessage*, bool discard_duplicates) final; - bool IsSecureContext(String& error_message) const override; BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() final; OffscreenFontSelector* GetFontSelector() { return font_selector_; }
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc index 3d70491..4a7772ce 100644 --- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -181,9 +181,15 @@ : ExecutionContext(isolate, agent, MakeGarbageCollected<OriginTrialContext>(), - std::move(origin), + origin, WebSandboxFlags::kNone, - nullptr), + nullptr, + // Until there are APIs that are available in workers or + // or worklets that require a privileged context test + // that checks ancestors, just do a simple check here. + origin->IsPotentiallyTrustworthy() + ? SecureContextMode::kSecureContext + : SecureContextMode::kInsecureContext), off_main_thread_fetch_option_(off_main_thread_fetch_option), name_(name), parent_devtools_token_(parent_devtools_token),
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worklet_global_scope.cc index 19fe55e..4f8e390 100644 --- a/third_party/blink/renderer/core/workers/worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
@@ -134,16 +134,6 @@ return const_cast<WorkletGlobalScope*>(this); } -bool WorkletGlobalScope::IsSecureContext(String& error_message) const { - // Until there are APIs that are available in worklets and that - // require a privileged context test that checks ancestors, just do - // a simple check here. - if (GetSecurityOrigin()->IsPotentiallyTrustworthy()) - return true; - error_message = GetSecurityOrigin()->IsPotentiallyTrustworthyErrorMessage(); - return false; -} - bool WorkletGlobalScope::IsContextThread() const { if (IsMainThreadWorkletGlobalScope()) return IsMainThread();
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.h b/third_party/blink/renderer/core/workers/worklet_global_scope.h index b139f17..3b81e0ff 100644 --- a/third_party/blink/renderer/core/workers/worklet_global_scope.h +++ b/third_party/blink/renderer/core/workers/worklet_global_scope.h
@@ -57,7 +57,6 @@ const KURL& BaseURL() const final { return url_; } KURL CompleteURL(const String&) const final; String UserAgent() const final { return user_agent_; } - bool IsSecureContext(String& error_message) const final; bool IsContextThread() const final; void AddConsoleMessageImpl(ConsoleMessage*, bool discard_duplicates) final; void ExceptionThrown(ErrorEvent*) final;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc index fa5b416..bf7ad06 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -1622,7 +1622,7 @@ } // Convert pixels to proper storage format if needed - if (PixelFormat() != CanvasPixelFormat::kRGBA8) { + if (PixelFormat() != CanvasColorParams::GetNativeCanvasPixelFormat()) { ImageDataStorageFormat storage_format = ImageData::GetImageDataStorageFormat(color_settings->storageFormat()); DOMArrayBufferView* array_buffer_view = @@ -1743,8 +1743,7 @@ // additional swizzling is needed. CanvasColorParams data_color_params = data->GetCanvasColorParams(); CanvasColorParams context_color_params = - CanvasColorParams(ColorParams().ColorSpace(), PixelFormat(), kNonOpaque, - CanvasForceRGBA::kNotForced); + CanvasColorParams(ColorParams().ColorSpace(), PixelFormat(), kNonOpaque); if (data_color_params.NeedsColorConversion(context_color_params) || PixelFormat() == CanvasPixelFormat::kF16) { size_t data_length;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h index e351566..9aaff02 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
@@ -247,7 +247,7 @@ return kSRGBCanvasColorSpaceName; } virtual CanvasPixelFormat PixelFormat() const { - return CanvasPixelFormat::kRGBA8; + return CanvasColorParams::GetNativeCanvasPixelFormat(); } void RestoreMatrixClipStack(cc::PaintCanvas*) const;
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc index 057eab1e..089d969 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -19,6 +19,7 @@ #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h" #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/graphics_types.h" +#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h" #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" @@ -85,6 +86,11 @@ bernoulli_distribution_(kUMASampleProbability) { is_valid_size_ = IsValidImageSize(Host()->Size()); + // A raw pointer is safe here because the callback is only used by the + // recorder_ + set_needs_flush_callback_ = + WTF::BindRepeating(&OffscreenCanvasRenderingContext2D::SetNeedsFlush, + WrapWeakPersistent(this)); StartRecording(); // Clear the background transparent or opaque. Similar code at @@ -126,13 +132,12 @@ } void OffscreenCanvasRenderingContext2D::StartRecording() { - recorder_ = std::make_unique<PaintRecorder>(); - + recorder_ = + std::make_unique<MemoryManagedPaintRecorder>(set_needs_flush_callback_); cc::PaintCanvas* canvas = recorder_->beginRecording(Width(), Height()); // Always save an initial frame, to support resetting the top level matrix // and clip. canvas->save(); - RestoreMatrixClipStack(canvas); } @@ -160,6 +165,7 @@ if (!GetOrCreateCanvasResourceProvider()) return; FlushRecording(); + needs_flush_ = false; } // BaseRenderingContext2D implementation @@ -293,23 +299,20 @@ return recorder_->getRecordingCanvas(); } -cc::PaintCanvas* OffscreenCanvasRenderingContext2D::ExistingDrawingCanvas() - const { - if (!is_valid_size_) - return nullptr; - return recorder_->getRecordingCanvas(); -} - void OffscreenCanvasRenderingContext2D::DidDraw() { have_recorded_draw_commands_ = true; - Host()->DidDraw(); dirty_rect_for_commit_.setWH(Width(), Height()); + Host()->DidDraw(); + if (needs_flush_) + FinalizeFrame(); } void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) { have_recorded_draw_commands_ = true; dirty_rect_for_commit_.join(dirty_rect); Host()->DidDraw(SkRect::Make(dirty_rect_for_commit_)); + if (needs_flush_) + FinalizeFrame(); } bool OffscreenCanvasRenderingContext2D::StateHasFilter() { @@ -642,4 +645,8 @@ return GetCanvasResourceProvider()->IsValid(); return false; } + +void OffscreenCanvasRenderingContext2D::SetNeedsFlush() { + needs_flush_ = true; +} } // namespace blink
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h index 5aeed7f..0f859c7 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
@@ -103,7 +103,9 @@ bool ParseColorOrCurrentColor(Color&, const String& color_string) const final; cc::PaintCanvas* DrawingCanvas() const final; - cc::PaintCanvas* ExistingDrawingCanvas() const final; + cc::PaintCanvas* ExistingDrawingCanvas() const final { + return DrawingCanvas(); + } void DidDraw() final; void DidDraw(const SkIRect& dirty_rect) final; @@ -160,6 +162,10 @@ std::mt19937 random_generator_; std::bernoulli_distribution bernoulli_distribution_; + + void SetNeedsFlush(); + base::RepeatingClosure set_needs_flush_callback_; + bool needs_flush_ = false; }; DEFINE_TYPE_CASTS(OffscreenCanvasRenderingContext2D,
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc index 53c8948..427cfed 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc
@@ -107,8 +107,8 @@ CredentialManagerTestingContext( MockCredentialManager* mock_credential_manager) : dummy_context_(KURL("https://example.test")) { - dummy_context_.GetDocument().SetSecureContextStateForTesting( - SecureContextState::kSecure); + dummy_context_.GetDocument().SetSecureContextModeForTesting( + SecureContextMode::kSecureContext); dummy_context_.GetFrame().GetBrowserInterfaceBroker().SetBinderForTesting( ::blink::mojom::blink::CredentialManager::Name_,
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_client.cc b/third_party/blink/renderer/modules/mediastream/user_media_client.cc index 0037a07..375ab30 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_client.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_client.cc
@@ -17,7 +17,6 @@ #include "third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_user_gesture_indicator.h" #include "third_party/blink/public/web/web_user_media_request.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -157,16 +156,21 @@ request_id, web_request.AudioConstraints().ToString().Utf8().c_str(), web_request.VideoConstraints().ToString().Utf8().c_str())); - // The value returned by isProcessingUserGesture() is used by the browser to - // make decisions about the permissions UI. Its value can be lost while + // The value returned by HasTransientUserActivation() is used by the browser + // to make decisions about the permissions UI. Its value can be lost while // switching threads, so saving its value here. - bool user_gesture = blink::WebUserGestureIndicator::IsProcessingUserGesture( - web_request.OwnerDocument().IsNull() - ? nullptr - : web_request.OwnerDocument().GetFrame()); + // + // TODO(mustaq): The description above seems specific to pre-UAv2 stack-based + // tokens. Perhaps we don't need to preserve this bit? + bool has_transient_user_activation = false; + if (!web_request.OwnerDocument().IsNull() && + web_request.OwnerDocument().GetFrame()) { + has_transient_user_activation = + web_request.OwnerDocument().GetFrame()->HasTransientUserActivation(); + } std::unique_ptr<UserMediaRequestInfo> request_info = std::make_unique<UserMediaRequestInfo>(request_id, web_request, - user_gesture); + has_transient_user_activation); pending_request_infos_.push_back( MakeGarbageCollected<Request>(std::move(request_info))); if (!is_processing_request_)
diff --git a/third_party/blink/renderer/modules/native_file_system/window_native_file_system_test.cc b/third_party/blink/renderer/modules/native_file_system/window_native_file_system_test.cc index fd589b2f..cde66cba 100644 --- a/third_party/blink/renderer/modules/native_file_system/window_native_file_system_test.cc +++ b/third_party/blink/renderer/modules/native_file_system/window_native_file_system_test.cc
@@ -118,7 +118,7 @@ TEST_F(WindowNativeFileSystemTest, UserActivationRequiredOtherwiseDenied) { LocalFrame* frame = &GetFrame(); - EXPECT_FALSE(frame->HasBeenActivated()); + EXPECT_FALSE(frame->HasStickyUserActivation()); MockNativeFileSystemManager manager(frame->GetBrowserInterfaceBroker()); manager.SetChooseEntriesResponse(WTF::Bind( @@ -128,15 +128,15 @@ GetFrame().GetScriptController().ExecuteScriptInMainWorld( "window.chooseFileSystemEntries({type: 'openFile'});"); base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(frame->HasBeenActivated()); + EXPECT_FALSE(frame->HasStickyUserActivation()); } TEST_F(WindowNativeFileSystemTest, UserActivationChooseEntriesSuccessful) { LocalFrame* frame = &GetFrame(); - EXPECT_FALSE(frame->HasBeenActivated()); + EXPECT_FALSE(frame->HasStickyUserActivation()); LocalFrame::NotifyUserActivation(frame); - EXPECT_TRUE(frame->HasBeenActivated()); + EXPECT_TRUE(frame->HasStickyUserActivation()); base::RunLoop manager_run_loop; MockNativeFileSystemManager manager(frame->GetBrowserInterfaceBroker(), @@ -165,18 +165,18 @@ // Mock Manager finished sending data over the mojo pipe. // Clearing the user activation. - frame->ClearActivation(); - EXPECT_FALSE(frame->HasBeenActivated()); + frame->ClearUserActivation(); + EXPECT_FALSE(frame->HasStickyUserActivation()); // Let blink-side receiver process the response and set the user activation // again. base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(frame->HasBeenActivated()); + EXPECT_TRUE(frame->HasStickyUserActivation()); } TEST_F(WindowNativeFileSystemTest, UserActivationChooseEntriesErrors) { LocalFrame* frame = &GetFrame(); - EXPECT_FALSE(frame->HasBeenActivated()); + EXPECT_FALSE(frame->HasStickyUserActivation()); using mojom::blink::NativeFileSystemStatus; @@ -192,7 +192,7 @@ for (const NativeFileSystemStatus& status : statuses) { LocalFrame::NotifyUserActivation(frame); - EXPECT_TRUE(frame->HasBeenActivated()); + EXPECT_TRUE(frame->HasStickyUserActivation()); base::RunLoop manager_run_loop; manager.SetQuitClosure(manager_run_loop.QuitClosure()); @@ -213,11 +213,11 @@ // Mock Manager finished sending data over the mojo pipe. // Clearing the user activation. - frame->ClearActivation(); - EXPECT_FALSE(frame->HasBeenActivated()); + frame->ClearUserActivation(); + EXPECT_FALSE(frame->HasStickyUserActivation()); base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(frame->HasBeenActivated()); + EXPECT_FALSE(frame->HasStickyUserActivation()); } }
diff --git a/third_party/blink/renderer/modules/payments/payment_test_helper.cc b/third_party/blink/renderer/modules/payments/payment_test_helper.cc index 609c8cd6..7f87585 100644 --- a/third_party/blink/renderer/modules/payments/payment_test_helper.cc +++ b/third_party/blink/renderer/modules/payments/payment_test_helper.cc
@@ -215,7 +215,8 @@ PaymentRequestV8TestingScope::PaymentRequestV8TestingScope() : V8TestingScope(KURL("https://www.example.com/")) { - GetDocument().SetSecureContextStateForTesting(SecureContextState::kSecure); + GetDocument().SetSecureContextModeForTesting( + SecureContextMode::kSecureContext); } PaymentRequestMockFunctionScope::PaymentRequestMockFunctionScope(
diff --git a/third_party/blink/renderer/modules/sensor/sensor_test_utils.cc b/third_party/blink/renderer/modules/sensor/sensor_test_utils.cc index 76b03b6..cc0c3c8 100644 --- a/third_party/blink/renderer/modules/sensor/sensor_test_utils.cc +++ b/third_party/blink/renderer/modules/sensor/sensor_test_utils.cc
@@ -41,8 +41,8 @@ SensorTestContext::SensorTestContext() { // Sensor's constructor has a check for this that could be removed in the // future. - testing_scope_.GetDocument().SetSecureContextStateForTesting( - SecureContextState::kSecure); + testing_scope_.GetDocument().SetSecureContextModeForTesting( + SecureContextMode::kSecureContext); // Necessary for SensorProxy::ShouldSuspendUpdates() to work correctly. testing_scope_.GetPage().GetFocusController().SetFocused(true);
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc index e5b8ac7f..1810618 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
@@ -193,8 +193,8 @@ NavigateTo(KURL(NullURL(), url)); if (url.StartsWith("https://") || url.StartsWith("http://localhost/")) { - GetDocument().SetSecureContextStateForTesting( - SecureContextState::kSecure); + GetDocument().SetSecureContextModeForTesting( + SecureContextMode::kSecureContext); } }
diff --git a/third_party/blink/renderer/modules/vibration/navigator_vibration.cc b/third_party/blink/renderer/modules/vibration/navigator_vibration.cc index 74ec2f1..e53aa7d 100644 --- a/third_party/blink/renderer/modules/vibration/navigator_vibration.cc +++ b/third_party/blink/renderer/modules/vibration/navigator_vibration.cc
@@ -77,7 +77,7 @@ if (!frame->GetPage()->IsPageVisible()) return false; - if (!frame->HasBeenActivated()) { + if (!frame->HasStickyUserActivation()) { String message; if (frame->IsCrossOriginSubframe()) { message = @@ -103,7 +103,7 @@ void NavigatorVibration::CollectHistogramMetrics(const Navigator& navigator) { NavigatorVibrationType type; LocalFrame* frame = navigator.GetFrame(); - bool user_gesture = frame->HasBeenActivated(); + bool user_gesture = frame->HasStickyUserActivation(); UseCounter::Count(navigator.DomWindow()->document(), WebFeature::kNavigatorVibrate); if (!frame->IsMainFrame()) {
diff --git a/third_party/blink/renderer/modules/webgl/DEPS b/third_party/blink/renderer/modules/webgl/DEPS index 7f39fad4..d0ca58d 100644 --- a/third_party/blink/renderer/modules/webgl/DEPS +++ b/third_party/blink/renderer/modules/webgl/DEPS
@@ -2,6 +2,7 @@ "+base/containers/mru_cache.h", "+gpu/GLES2/gl2extchromium.h", "+gpu/command_buffer/client/gles2_interface.h", + "+gpu/command_buffer/client/raster_interface.h", "+gpu/command_buffer/common/capabilities.h", "+gpu/config/gpu_feature_info.h", "+skia/ext",
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc index 22b216c..5364eb9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
@@ -2180,8 +2180,12 @@ if (!ValidateCompressedTexFormat("compressedTexImage2D", internalformat)) return; GLuint data_length; - if (!ExtractDataLengthIfValid("compressedTexImage2D", data, &data_length)) + if (!base::CheckedNumeric<GLuint>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", + "provided data exceeds the maximum supported length"); return; + } if (src_offset > data_length) { SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", "srcOffset is out of range"); @@ -2263,8 +2267,12 @@ if (!ValidateCompressedTexFormat("compressedTexSubImage2D", format)) return; GLuint data_length; - if (!ExtractDataLengthIfValid("compressedTexSubImage2D", data, &data_length)) + if (!base::CheckedNumeric<GLuint>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage2D", + "provided data exceeds the maximum supported length"); return; + } if (src_offset > data_length) { SynthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage2D", "srcOffset is out of range"); @@ -2328,8 +2336,12 @@ if (!ValidateCompressedTexFormat("compressedTexImage3D", internalformat)) return; GLuint data_length; - if (!ExtractDataLengthIfValid("compressedTexImage3D", data, &data_length)) + if (!base::CheckedNumeric<GLuint>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D", + "provided data exceeds the maximum supported length"); return; + } if (src_offset > data_length) { SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D", "srcOffset is out of range"); @@ -2395,8 +2407,12 @@ if (!ValidateCompressedTexFormat("compressedTexSubImage3D", format)) return; GLuint data_length; - if (!ExtractDataLengthIfValid("compressedTexSubImage3D", data, &data_length)) + if (!base::CheckedNumeric<GLuint>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D", + "provided data exceeds the maximum supported length"); return; + } if (src_offset > data_length) { SynthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D", "srcOffset is out of range");
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 9956c65..65b93ca 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -1622,23 +1622,23 @@ SharedGpuContext::ContextProviderWrapper(); if (!shared_context_wrapper || !shared_context_wrapper->ContextProvider()) return false; - gpu::gles2::GLES2Interface* gl = - shared_context_wrapper->ContextProvider()->ContextGL(); - GLuint texture_id = - resource_provider->GetBackingTextureHandleForOverwrite(); + gpu::raster::RasterInterface* raster_interface = + shared_context_wrapper->ContextProvider()->RasterInterface(); + const gpu::Mailbox& mailbox = + resource_provider->GetBackingMailboxForOverwrite( + MailboxSyncMode::kOrderingBarrier); GLenum texture_target = resource_provider->GetBackingTextureTarget(); - if (!texture_id) + if (mailbox.IsZero()) return false; // TODO(xlai): Flush should not be necessary if the synchronization in // CopyToPlatformTexture is done correctly. See crbug.com/794706. - gl->Flush(); + raster_interface->Flush(); bool flip_y = IsOriginTopLeft() != resource_provider->IsOriginTopLeft(); - return drawing_buffer_->CopyToPlatformTexture( - gl, texture_target, texture_id, 0 /*texture LOD */, true, flip_y, - IntPoint(0, 0), IntRect(IntPoint(0, 0), drawing_buffer_->Size()), - source_buffer); + return drawing_buffer_->CopyToPlatformMailbox( + raster_interface, mailbox, texture_target, flip_y, IntPoint(0, 0), + IntRect(IntPoint(0, 0), drawing_buffer_->Size()), source_buffer); } // Note: This code path could work for all cases. The only reason there @@ -2186,8 +2186,12 @@ if (!ValidateCompressedTexFormat("compressedTexImage2D", internalformat)) return; GLsizei data_length; - if (!ExtractDataLengthIfValid("compressedTexImage2D", data, &data_length)) + if (!base::CheckedNumeric<GLsizei>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", + "src_length exceeds the maximum supported length"); return; + } ContextGL()->CompressedTexImage2D(target, level, internalformat, width, height, border, data_length, data.View()->BaseAddressMaybeShared()); @@ -2209,8 +2213,12 @@ if (!ValidateCompressedTexFormat("compressedTexSubImage2D", format)) return; GLsizei data_length; - if (!ExtractDataLengthIfValid("compressedTexSubImage2D", data, &data_length)) + if (!base::CheckedNumeric<GLsizei>(data.View()->byteLengthAsSizeT()) + .AssignIfValid(&data_length)) { + SynthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", + "src_length exceeds the maximum supported length"); return; + } ContextGL()->CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data_length, data.View()->BaseAddressMaybeShared());
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index 5c8f555..f7b41f8e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -1511,21 +1511,6 @@ GLenum type, int64_t offset); - // Helper function to check if the byte length of {data} fits into an integer - // of type {T.} If so, the byte length is stored in {data_length}. - template <typename T> - bool ExtractDataLengthIfValid(const char* function_name, - MaybeShared<DOMArrayBufferView> data, - T* data_length) { - if (base::CheckedNumeric<GLuint>(data.View()->byteLengthAsSizeT()) - .AssignIfValid(data_length)) { - return true; - } - SynthesizeGLError(GL_INVALID_VALUE, function_name, - "provided data exceeds the maximum supported length"); - return false; - } - // State updates and operations necessary before or at draw call time. virtual void OnBeforeDrawCall();
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 6ef48ba..d218ffc 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -995,6 +995,10 @@ "graphics/mailbox_texture_holder.h", "graphics/main_thread_mutator_client.cc", "graphics/main_thread_mutator_client.h", + "graphics/memory_managed_paint_canvas.cc", + "graphics/memory_managed_paint_canvas.h", + "graphics/memory_managed_paint_recorder.cc", + "graphics/memory_managed_paint_recorder.h", "graphics/mutator_client.h", "graphics/offscreen_canvas_placeholder.cc", "graphics/offscreen_canvas_placeholder.h",
diff --git a/third_party/blink/renderer/platform/blob/blob_data.cc b/third_party/blink/renderer/platform/blob/blob_data.cc index 7f5028a..a5779ae3 100644 --- a/third_party/blink/renderer/platform/blob/blob_data.cc +++ b/third_party/blink/renderer/platform/blob/blob_data.cc
@@ -415,6 +415,16 @@ blob_remote_ = blob.Unbind(); } +bool BlobDataHandle::CaptureSnapshot( + uint64_t* snapshot_size, + base::Optional<base::Time>* snapshot_modification_time) { + // This method operates on a cloned blob remote; this lets us avoid holding + // the |blob_remote_mutex_| locked during the duration of the (synchronous) + // CaptureSnapshot call. + mojo::Remote<mojom::blink::Blob> remote(CloneBlobRemote()); + return remote->CaptureSnapshot(snapshot_size, snapshot_modification_time); +} + // static mojom::blink::BlobRegistry* BlobDataHandle::GetBlobRegistry() { return GetThreadSpecificRegistry();
diff --git a/third_party/blink/renderer/platform/blob/blob_data.h b/third_party/blink/renderer/platform/blob/blob_data.h index 9965fe9..33c842a 100644 --- a/third_party/blink/renderer/platform/blob/blob_data.h +++ b/third_party/blink/renderer/platform/blob/blob_data.h
@@ -219,6 +219,16 @@ mojo::ScopedDataPipeProducerHandle, mojo::PendingRemote<mojom::blink::BlobReaderClient>); + // This does synchronous IPC, and possibly synchronous file operations. Think + // twice before calling this function. + bool CaptureSnapshot(uint64_t* snapshot_size, + base::Optional<base::Time>* snapshot_modification_time); + + void SetBlobRemoteForTesting(mojo::PendingRemote<mojom::blink::Blob> remote) { + MutexLocker locker(blob_remote_mutex_); + blob_remote_ = std::move(remote); + } + static mojom::blink::BlobRegistry* GetBlobRegistry(); static void SetBlobRegistryForTesting(mojom::blink::BlobRegistry*);
diff --git a/third_party/blink/renderer/platform/blob/testing/fake_blob.cc b/third_party/blink/renderer/platform/blob/testing/fake_blob.cc index 733798e..5dd4ae6 100644 --- a/third_party/blink/renderer/platform/blob/testing/fake_blob.cc +++ b/third_party/blink/renderer/platform/blob/testing/fake_blob.cc
@@ -80,6 +80,10 @@ NOTREACHED(); } +void FakeBlob::CaptureSnapshot(CaptureSnapshotCallback callback) { + std::move(callback).Run(body_.length(), base::nullopt); +} + void FakeBlob::GetInternalUUID(GetInternalUUIDCallback callback) { std::move(callback).Run(uuid_); }
diff --git a/third_party/blink/renderer/platform/blob/testing/fake_blob.h b/third_party/blink/renderer/platform/blob/testing/fake_blob.h index 8ec5c76..845330f 100644 --- a/third_party/blink/renderer/platform/blob/testing/fake_blob.h +++ b/third_party/blink/renderer/platform/blob/testing/fake_blob.h
@@ -32,8 +32,10 @@ void ReadAll(mojo::ScopedDataPipeProducerHandle, mojo::PendingRemote<mojom::blink::BlobReaderClient>) override; void ReadSideData(ReadSideDataCallback) override; + void CaptureSnapshot(CaptureSnapshotCallback) override; void GetInternalUUID(GetInternalUUIDCallback) override; - private: + + protected: String uuid_; String body_; State* state_;
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image.cc b/third_party/blink/renderer/platform/graphics/bitmap_image.cc index effb974..493eaf1 100644 --- a/third_party/blink/renderer/platform/graphics/bitmap_image.cc +++ b/third_party/blink/renderer/platform/graphics/bitmap_image.cc
@@ -115,8 +115,7 @@ PaintImage BitmapImage::CreatePaintImage() { sk_sp<PaintImageGenerator> generator = - decoder_ ? decoder_->CreateGenerator(PaintImage::kDefaultFrameIndex) - : nullptr; + decoder_ ? decoder_->CreateGenerator() : nullptr; if (!generator) return PaintImage();
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index 5f7076e..70abbde 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/platform/graphics/gpu/shared_context_rate_limiter.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" #include "third_party/blink/renderer/platform/graphics/graphics_layer.h" +#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h" @@ -74,6 +75,11 @@ // Used by browser tests to detect the use of a Canvas2DLayerBridge. TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation", TRACE_EVENT_SCOPE_GLOBAL); + + // A raw pointer is safe here because the callback is only used by the + // |recorder_|. + set_needs_flush_callback_ = WTF::BindRepeating( + &Canvas2DLayerBridge::SetNeedsFlush, WTF::Unretained(this)); StartRecording(); // Clear the background transparent or opaque. Similar code at @@ -109,9 +115,11 @@ } void Canvas2DLayerBridge::StartRecording() { - recorder_ = std::make_unique<PaintRecorder>(); + recorder_ = + std::make_unique<MemoryManagedPaintRecorder>(set_needs_flush_callback_); cc::PaintCanvas* canvas = recorder_->beginRecording(size_.Width(), size_.Height()); + // Always save an initial frame, to support resetting the top level matrix // and clip. canvas->save(); @@ -715,6 +723,8 @@ } void Canvas2DLayerBridge::DidDraw(const FloatRect& /* rect */) { + if (needs_flush_) + FinalizeFrame(); have_recorded_draw_commands_ = true; } @@ -742,6 +752,8 @@ if (rate_limiter_) rate_limiter_->Tick(); + + needs_flush_ = false; } void Canvas2DLayerBridge::DoPaintInvalidation(const FloatRect& dirty_rect) { @@ -772,6 +784,10 @@ SkipQueuedDrawCommands(); } +void Canvas2DLayerBridge::SetNeedsFlush() { + needs_flush_ = true; +} + void Canvas2DLayerBridge::Logger::ReportHibernationEvent( HibernationEvent event) { UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.HibernationEvents", event);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h index 16a2bcf6..d7f3344 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
@@ -255,6 +255,10 @@ sk_sp<cc::PaintRecord> last_recording_; + void SetNeedsFlush(); + base::RepeatingClosure set_needs_flush_callback_; + bool needs_flush_ = false; + base::WeakPtrFactory<Canvas2DLayerBridge> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(Canvas2DLayerBridge);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc index 438e238..39bb6d1 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc
@@ -932,9 +932,8 @@ } TEST_F(Canvas2DLayerBridgeTest, EnsureCCImageCacheUse) { - auto color_params = - CanvasColorParams(CanvasColorSpace::kSRGB, CanvasPixelFormat::kF16, - kOpaque, CanvasForceRGBA::kNotForced); + auto color_params = CanvasColorParams(CanvasColorSpace::kSRGB, + CanvasPixelFormat::kF16, kOpaque); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 300), Canvas2DLayerBridge::kEnableAcceleration, @@ -958,9 +957,9 @@ } TEST_F(Canvas2DLayerBridgeTest, EnsureCCImageCacheUseWithColorConversion) { - auto color_params = - CanvasColorParams(CanvasColorSpace::kSRGB, CanvasPixelFormat::kRGBA8, - kOpaque, CanvasForceRGBA::kNotForced); + auto color_params = CanvasColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kOpaque); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 300), Canvas2DLayerBridge::kEnableAcceleration, color_params); @@ -982,9 +981,8 @@ } TEST_F(Canvas2DLayerBridgeTest, ImagesLockedUntilCacheLimit) { - auto color_params = - CanvasColorParams(CanvasColorSpace::kSRGB, CanvasPixelFormat::kF16, - kOpaque, CanvasForceRGBA::kNotForced); + auto color_params = CanvasColorParams(CanvasColorSpace::kSRGB, + CanvasPixelFormat::kF16, kOpaque); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 300), Canvas2DLayerBridge::kEnableAcceleration, color_params); @@ -1022,9 +1020,8 @@ } TEST_F(Canvas2DLayerBridgeTest, QueuesCleanupTaskForLockedImages) { - auto color_params = - CanvasColorParams(CanvasColorSpace::kSRGB, CanvasPixelFormat::kF16, - kOpaque, CanvasForceRGBA::kNotForced); + auto color_params = CanvasColorParams(CanvasColorSpace::kSRGB, + CanvasPixelFormat::kF16, kOpaque); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 300), Canvas2DLayerBridge::kEnableAcceleration, color_params); @@ -1046,9 +1043,8 @@ } TEST_F(Canvas2DLayerBridgeTest, ImageCacheOnContextLost) { - auto color_params = - CanvasColorParams(CanvasColorSpace::kSRGB, CanvasPixelFormat::kF16, - kOpaque, CanvasForceRGBA::kNotForced); + auto color_params = CanvasColorParams(CanvasColorSpace::kSRGB, + CanvasPixelFormat::kF16, kOpaque); std::unique_ptr<Canvas2DLayerBridge> bridge = MakeBridge(IntSize(300, 300), Canvas2DLayerBridge::kEnableAcceleration, color_params); @@ -1104,8 +1100,7 @@ TEST_F(Canvas2DLayerBridgeTest, WritePixelsRestoresClipStack) { CanvasColorParams color_params(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kF16, kOpaque, - CanvasForceRGBA::kNotForced); + CanvasPixelFormat::kF16, kOpaque); IntSize size = IntSize(300, 300); auto host = std::make_unique<CustomFakeCanvasResourceHost>(size); std::unique_ptr<Canvas2DLayerBridge> bridge =
diff --git a/third_party/blink/renderer/platform/graphics/canvas_color_params.cc b/third_party/blink/renderer/platform/graphics/canvas_color_params.cc index a947db5..d886802 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_color_params.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_color_params.cc
@@ -40,12 +40,10 @@ CanvasColorParams::CanvasColorParams(CanvasColorSpace color_space, CanvasPixelFormat pixel_format, - OpacityMode opacity_mode, - CanvasForceRGBA force_rgba) + OpacityMode opacity_mode) : color_space_(color_space), pixel_format_(pixel_format), - opacity_mode_(opacity_mode), - force_rgba_(force_rgba) {} + opacity_mode_(opacity_mode) {} CanvasColorParams::CanvasColorParams(const SkImageInfo& info) : CanvasColorParams(info.refColorSpace(), info.colorType()) {} @@ -63,10 +61,16 @@ } SkColorType CanvasColorParams::GetSkColorType() const { - if (pixel_format_ == CanvasPixelFormat::kF16) - return kRGBA_F16_SkColorType; - return force_rgba_ == CanvasForceRGBA::kForced ? kRGBA_8888_SkColorType - : kN32_SkColorType; + switch (pixel_format_) { + case CanvasPixelFormat::kF16: + return kRGBA_F16_SkColorType; + case CanvasPixelFormat::kRGBA8: + return kRGBA_8888_SkColorType; + case CanvasPixelFormat::kBGRA8: + return kBGRA_8888_SkColorType; + } + NOTREACHED(); + return kN32_SkColorType; } SkAlphaType CanvasColorParams::GetSkAlphaType() const { @@ -111,6 +115,9 @@ } sk_sp<SkColorSpace> CanvasColorParams::GetSkColorSpace() const { + static_assert(kN32_SkColorType == kRGBA_8888_SkColorType || + kN32_SkColorType == kBGRA_8888_SkColorType, + "Unexpected kN32_SkColorType value."); skcms_Matrix3x3 gamut = SkNamedGamut::kSRGB; skcms_TransferFunction transferFn = SkNamedTransferFn::kSRGB; switch (color_space_) { @@ -132,10 +139,6 @@ } gfx::BufferFormat CanvasColorParams::GetBufferFormat() const { - static_assert(kN32_SkColorType == kRGBA_8888_SkColorType || - kN32_SkColorType == kBGRA_8888_SkColorType, - "Unexpected kN32_SkColorType value."); - switch (GetSkColorType()) { case kRGBA_8888_SkColorType: return gfx::BufferFormat::RGBA_8888; @@ -152,10 +155,6 @@ GLenum CanvasColorParams::GLUnsizedInternalFormat() const { // TODO(junov): try GL_RGB when opacity_mode_ == kOpaque - static_assert(kN32_SkColorType == kRGBA_8888_SkColorType || - kN32_SkColorType == kBGRA_8888_SkColorType, - "Unexpected kN32_SkColorType value."); - switch (GetSkColorType()) { case kRGBA_8888_SkColorType: return GL_RGBA; @@ -171,10 +170,6 @@ } GLenum CanvasColorParams::GLSizedInternalFormat() const { - static_assert(kN32_SkColorType == kRGBA_8888_SkColorType || - kN32_SkColorType == kBGRA_8888_SkColorType, - "Unexpected kN32_SkColorType value."); - switch (GetSkColorType()) { case kRGBA_8888_SkColorType: return GL_RGBA8; @@ -210,10 +205,9 @@ CanvasColorParams::CanvasColorParams(const sk_sp<SkColorSpace> color_space, SkColorType color_type) { color_space_ = CanvasColorSpace::kSRGB; - pixel_format_ = CanvasPixelFormat::kRGBA8; + pixel_format_ = GetNativeCanvasPixelFormat(); // When there is no color space information, the SkImage is in legacy mode and - // the color type is kN32_SkColorType (which translates to kRGBA8 canvas pixel - // format). + // the color type is kRGBA8 canvas pixel format. if (!color_space) return; @@ -239,7 +233,7 @@ if (color_type == kRGBA_F16_SkColorType) pixel_format_ = CanvasPixelFormat::kF16; else if (color_type == kRGBA_8888_SkColorType) - force_rgba_ = CanvasForceRGBA::kForced; + pixel_format_ = CanvasPixelFormat::kRGBA8; } } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/canvas_color_params.h b/third_party/blink/renderer/platform/graphics/canvas_color_params.h index 5c1dfde6..3920ea5c 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_color_params.h +++ b/third_party/blink/renderer/platform/graphics/canvas_color_params.h
@@ -34,28 +34,29 @@ enum class CanvasPixelFormat { kRGBA8, + kBGRA8, kF16, }; -// todo(crbug/1021986) remove force_rgba in canvasColorParams -enum class CanvasForceRGBA { kForced, kNotForced }; - class PLATFORM_EXPORT CanvasColorParams { DISALLOW_NEW(); public: // The default constructor will create an output-blended 8-bit surface. CanvasColorParams(); - CanvasColorParams(CanvasColorSpace, - CanvasPixelFormat, - OpacityMode, - CanvasForceRGBA); + CanvasColorParams(CanvasColorSpace, CanvasPixelFormat, OpacityMode); explicit CanvasColorParams(const SkImageInfo&); + static CanvasPixelFormat GetNativeCanvasPixelFormat() { + if (kN32_SkColorType == kRGBA_8888_SkColorType) + return CanvasPixelFormat::kRGBA8; + else if (kN32_SkColorType == kBGRA_8888_SkColorType) + return CanvasPixelFormat::kBGRA8; + } + CanvasColorSpace ColorSpace() const { return color_space_; } CanvasPixelFormat PixelFormat() const { return pixel_format_; } OpacityMode GetOpacityMode() const { return opacity_mode_; } - CanvasForceRGBA GetForceRGBA() const { return force_rgba_; } void SetCanvasColorSpace(CanvasColorSpace c) { color_space_ = c; } void SetCanvasPixelFormat(CanvasPixelFormat f) { pixel_format_ = f; } @@ -99,9 +100,8 @@ SkColorType color_type); CanvasColorSpace color_space_ = CanvasColorSpace::kSRGB; - CanvasPixelFormat pixel_format_ = CanvasPixelFormat::kRGBA8; + CanvasPixelFormat pixel_format_ = GetNativeCanvasPixelFormat(); OpacityMode opacity_mode_ = kNonOpaque; - CanvasForceRGBA force_rgba_ = CanvasForceRGBA::kNotForced; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/canvas_color_params_test.cc b/third_party/blink/renderer/platform/graphics/canvas_color_params_test.cc index 352fa6c..b34686a 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_color_params_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_color_params_test.cc
@@ -25,8 +25,7 @@ }; for (int iter_color_space = 0; iter_color_space < 4; iter_color_space++) { CanvasColorParams color_params(canvas_color_spaces[iter_color_space], - CanvasPixelFormat::kF16, kNonOpaque, - CanvasForceRGBA::kNotForced); + CanvasPixelFormat::kF16, kNonOpaque); sk_sp<SkColorSpace> canvas_drawing_color_space = color_params.GetSkColorSpace(); sk_sp<SkColorSpace> canvas_media_color_space =
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc index 6229282..5c73a169e 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -422,10 +422,6 @@ OnDestroy(); } -GLenum CanvasResourceSharedImage::TextureTarget() const { - return texture_target_; -} - void CanvasResourceSharedImage::TearDown() { DCHECK(!is_cross_thread()); @@ -882,7 +878,8 @@ // The wait sync token ensure that the present executes before we do the copy. raster_interface->CopySubTexture(front_buffer_mailbox_, back_buffer_mailbox_, GL_TEXTURE_2D, 0, 0, 0, 0, size_.Width(), - size_.Height()); + size_.Height(), false /* unpack_flip_y */, + false /* unpack_premultiply_alpha */); } base::WeakPtr<WebGraphicsContext3DProviderWrapper>
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.h b/third_party/blink/renderer/platform/graphics/canvas_resource.h index 7c39c70e..6e7df2e9 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.h
@@ -133,19 +133,6 @@ // CanvasResourceProvider and derivatives should call this. virtual void TakeSkImage(sk_sp<SkImage> image) = 0; - // Provides the texture ID that can be used to write to this resource. - // TODO(khushalsagar): Won't work with OOPR. - virtual GLuint GetBackingTextureHandleForOverwrite() { - NOTREACHED(); - return 0; - } - - // Returns the texture target for the ID provided above. - virtual GLenum TextureTarget() const { - NOTREACHED(); - return 0; - } - // Called when the resource is marked lost. Losing a resource does not mean // that the backing memory has been destroyed, since the resource itself keeps // a ref on that memory. @@ -214,6 +201,13 @@ const base::PlatformThreadId owning_thread_id_; + protected: + // Returns the texture target for the resource. + virtual GLenum TextureTarget() const { + NOTREACHED(); + return 0; + } + private: // Sync token that was provided when resource was released gpu::SyncToken sync_token_for_release_; @@ -245,10 +239,10 @@ scoped_refptr<StaticBitmapImage> Bitmap() final; bool OriginClean() const final { return is_origin_clean_; } void SetOriginClean(bool flag) final { is_origin_clean_ = flag; } + const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; private: void TearDown() override; - const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; bool HasGpuMailbox() const override; CanvasResourceSharedBitmap(const IntSize&, @@ -301,6 +295,7 @@ GLuint GetTextureIdForWriteAccess() const { return owning_thread_data().texture_id_for_write_access; } + GLenum TextureTarget() const override { return texture_target_; } void WillDraw(); bool is_cross_thread() const { @@ -311,6 +306,7 @@ } bool is_lost() const { return owning_thread_data().is_lost; } void CopyRenderingResultsToGpuMemoryBuffer(const sk_sp<SkImage>& image); + const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; private: // These members are either only accessed on the owning thread, or are only @@ -344,8 +340,6 @@ void Abandon() override; base::WeakPtr<WebGraphicsContext3DProviderWrapper> ContextProviderWrapper() const override; - const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; - GLenum TextureTarget() const final; bool HasGpuMailbox() const override; const gpu::SyncToken GetSyncToken() override; bool IsOverlayCandidate() const final { return is_overlay_candidate_; } @@ -428,12 +422,12 @@ void TakeSkImage(sk_sp<SkImage> image) final; scoped_refptr<StaticBitmapImage> Bitmap() override; + const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; private: void TearDown() override; GLenum TextureTarget() const final { return texture_target_; } bool IsOverlayCandidate() const final { return true; } - const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; bool HasGpuMailbox() const override; const gpu::SyncToken GetSyncToken() override; base::WeakPtr<WebGraphicsContext3DProviderWrapper> ContextProviderWrapper() @@ -483,16 +477,16 @@ scoped_refptr<StaticBitmapImage> Bitmap() override; GLenum TextureTarget() const final { return GL_TEXTURE_2D; } - GLuint GetBackingTextureHandleForOverwrite() final { + GLuint GetBackingTextureHandleForOverwrite() { return back_buffer_texture_id_; } void PresentSwapChain(); + const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; private: void TearDown() override; bool IsOverlayCandidate() const final { return true; } - const gpu::Mailbox& GetOrCreateGpuMailbox(MailboxSyncMode) override; bool HasGpuMailbox() const override; const gpu::SyncToken GetSyncToken() override; base::WeakPtr<WebGraphicsContext3DProviderWrapper> ContextProviderWrapper()
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 2a19f857..4b7bf71 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -97,7 +97,8 @@ if (!IsBitmapFormatSupported(color_params.TransferableResourceFormat())) { // If the rendering format is not supported, downgrate to 8-bits. // TODO(junov): Should we try 12-12-12-12 and 10-10-10-2? - color_params.SetCanvasPixelFormat(CanvasPixelFormat::kRGBA8); + color_params.SetCanvasPixelFormat( + CanvasColorParams::GetNativeCanvasPixelFormat()); } return CanvasResourceSharedBitmap::Create(Size(), color_params, @@ -144,10 +145,11 @@ // TODO(khushalsagar): The software path seems to be assuming N32 // somewhere in the later pipeline but for offscreen canvas only. CanvasColorParams(color_params.ColorSpace(), - color_params.PixelFormat(), - color_params.GetOpacityMode(), - is_accelerated ? CanvasForceRGBA::kForced - : CanvasForceRGBA::kNotForced), + is_accelerated && color_params.PixelFormat() != + CanvasPixelFormat::kF16 + ? CanvasPixelFormat::kRGBA8 + : color_params.PixelFormat(), + color_params.GetOpacityMode()), is_origin_top_left, std::move(context_provider_wrapper), std::move(resource_dispatcher)), @@ -167,18 +169,19 @@ return shared_image_usage_flags_ & gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE; } - GLuint GetBackingTextureHandleForOverwrite() override { + gpu::Mailbox GetBackingMailboxForOverwrite( + MailboxSyncMode sync_mode) override { DCHECK(is_accelerated_); if (IsGpuContextLost()) - return 0u; + return gpu::Mailbox(); - FlushGrContext(); - WillDraw(); - return resource()->GetTextureIdForWriteAccess(); + WillDrawInternal(false); + return resource_->GetOrCreateGpuMailbox(sync_mode); } + GLenum GetBackingTextureTarget() const override { - return resource_->TextureTarget(); + return resource()->TextureTarget(); } scoped_refptr<CanvasResource> CreateResource() final { @@ -256,7 +259,7 @@ return cached_snapshot_; } - void WillDraw() override { + void WillDrawInternal(bool write_to_local_texture) { DCHECK(resource_); if (IsGpuContextLost()) @@ -301,10 +304,16 @@ } } - EnsureWriteAccess(); + if (write_to_local_texture) + EnsureWriteAccess(); + else + EndWriteAccess(); + resource()->WillDraw(); } + void WillDraw() override { WillDrawInternal(true); } + bool DoCopyOnWrite() { // If the canvas is single buffered, concurrent read/writes to the resource // are allowed. Note that we ignore the resource lost case as well since @@ -356,7 +365,7 @@ GrGLTextureInfo texture_info = {}; texture_info.fID = resource()->GetTextureIdForWriteAccess(); - texture_info.fTarget = resource_->TextureTarget(); + texture_info.fTarget = resource()->TextureTarget(); texture_info.fFormat = ColorParams().GLSizedInternalFormat(); return GrBackendTexture(Size().Width(), Size().Height(), GrMipMapped::kNo, texture_info);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h index 2e41504..80b36fb 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
@@ -172,9 +172,11 @@ size_t row_bytes, int x, int y); - virtual GLuint GetBackingTextureHandleForOverwrite() { + + virtual gpu::Mailbox GetBackingMailboxForOverwrite( + MailboxSyncMode sync_mode) { NOTREACHED(); - return 0; + return gpu::Mailbox(); } virtual GLenum GetBackingTextureTarget() const { return GL_TEXTURE_2D; } virtual void* GetPixelBufferAddressForOverwrite() {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc index 43bfd26..322df11 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
@@ -74,9 +74,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderAcceleratedOverlay) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -92,7 +92,9 @@ EXPECT_TRUE(provider->SupportsDirectCompositing()); EXPECT_TRUE(provider->SupportsSingleBuffering()); EXPECT_EQ(provider->ColorParams().ColorSpace(), kColorParams.ColorSpace()); - EXPECT_EQ(provider->ColorParams().PixelFormat(), kColorParams.PixelFormat()); + // As it is an CanvasResourceProviderSharedImage and an accelerated canvas, it + // will internally force it to kRGBA8 + EXPECT_EQ(provider->ColorParams().PixelFormat(), CanvasPixelFormat::kRGBA8); EXPECT_EQ(provider->ColorParams().GetOpacityMode(), kColorParams.GetOpacityMode()); @@ -103,9 +105,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderTexture) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, CanvasResourceProvider::ResourceUsage::kAcceleratedResourceUsage, @@ -120,7 +122,9 @@ EXPECT_TRUE(provider->SupportsDirectCompositing()); EXPECT_FALSE(provider->SupportsSingleBuffering()); EXPECT_EQ(provider->ColorParams().ColorSpace(), kColorParams.ColorSpace()); - EXPECT_EQ(provider->ColorParams().PixelFormat(), kColorParams.PixelFormat()); + // As it is an CanvasResourceProviderSharedImage and an accelerated canvas, it + // will internally force it to kRGBA8 + EXPECT_EQ(provider->ColorParams().PixelFormat(), CanvasPixelFormat::kRGBA8); EXPECT_EQ(provider->ColorParams().GetOpacityMode(), kColorParams.GetOpacityMode()); @@ -129,9 +133,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderUnacceleratedOverlay) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -160,9 +164,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderSharedImageResourceRecycling) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -179,7 +183,9 @@ EXPECT_FALSE(provider->IsSingleBuffered()); EXPECT_FALSE(provider->SupportsSingleBuffering()); EXPECT_EQ(provider->ColorParams().ColorSpace(), kColorParams.ColorSpace()); - EXPECT_EQ(provider->ColorParams().PixelFormat(), kColorParams.PixelFormat()); + // As it is an CanvasResourceProviderSharedImage and an accelerated canvas, it + // will internally force it to kRGBA8 + EXPECT_EQ(provider->ColorParams().PixelFormat(), CanvasPixelFormat::kRGBA8); EXPECT_EQ(provider->ColorParams().GetOpacityMode(), kColorParams.GetOpacityMode()); @@ -214,9 +220,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderSharedImageStaticBitmapImage) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -258,9 +264,9 @@ fake_context->SetCapabilities(caps); const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -281,9 +287,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderBitmap) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, CanvasResourceProvider::ResourceUsage::kSoftwareResourceUsage, @@ -307,9 +313,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderSharedBitmap) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); MockCanvasResourceDispatcherClient client; CanvasResourceDispatcher resource_dispatcher( @@ -342,9 +348,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderDirect2DGpuMemoryBuffer) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -360,7 +366,9 @@ EXPECT_TRUE(provider->SupportsDirectCompositing()); EXPECT_TRUE(provider->SupportsSingleBuffering()); EXPECT_EQ(provider->ColorParams().ColorSpace(), kColorParams.ColorSpace()); - EXPECT_EQ(provider->ColorParams().PixelFormat(), kColorParams.PixelFormat()); + // As it is an CanvasResourceProviderSharedImage and an accelerated canvas, it + // will internally force it to kRGBA8 + EXPECT_EQ(provider->ColorParams().PixelFormat(), CanvasPixelFormat::kRGBA8); EXPECT_EQ(provider->ColorParams().GetOpacityMode(), kColorParams.GetOpacityMode()); @@ -372,9 +380,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderDirect3DGpuMemoryBuffer) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -416,9 +424,9 @@ // https://crbug.com/985366 TEST_F(CanvasResourceProviderTest, CanvasResourceProviderDirect3DTexture) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize, @@ -434,7 +442,9 @@ EXPECT_TRUE(provider->SupportsDirectCompositing()); EXPECT_FALSE(provider->SupportsSingleBuffering()); EXPECT_EQ(provider->ColorParams().ColorSpace(), kColorParams.ColorSpace()); - EXPECT_EQ(provider->ColorParams().PixelFormat(), kColorParams.PixelFormat()); + // As it is an CanvasResourceProviderSharedImage and an accelerated canvas, it + // will internally force it to kRGBA8 + EXPECT_EQ(provider->ColorParams().PixelFormat(), CanvasPixelFormat::kRGBA8); EXPECT_EQ(provider->ColorParams().GetOpacityMode(), kColorParams.GetOpacityMode()); @@ -453,9 +463,9 @@ } TEST_F(CanvasResourceProviderTest, DimensionsExceedMaxTextureSize) { - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); for (int i = 0; i < static_cast<int>(CanvasResourceProvider::ResourceUsage::kMaxValue); @@ -517,9 +527,9 @@ TEST_F(CanvasResourceProviderTest, CanvasResourceProviderDirect2DSwapChain) { const IntSize kSize(10, 10); - const CanvasColorParams kColorParams(CanvasColorSpace::kSRGB, - CanvasPixelFormat::kRGBA8, kNonOpaque, - CanvasForceRGBA::kNotForced); + const CanvasColorParams kColorParams( + CanvasColorSpace::kSRGB, CanvasColorParams::GetNativeCanvasPixelFormat(), + kNonOpaque); auto provider = CanvasResourceProvider::Create( kSize,
diff --git a/third_party/blink/renderer/platform/graphics/color_correction_test_utils.cc b/third_party/blink/renderer/platform/graphics/color_correction_test_utils.cc index 64e897b..2092901 100644 --- a/third_party/blink/renderer/platform/graphics/color_correction_test_utils.cc +++ b/third_party/blink/renderer/platform/graphics/color_correction_test_utils.cc
@@ -221,14 +221,13 @@ (src_storage_format == kUint8ClampedArrayStorageFormat) ? CanvasPixelFormat::kRGBA8 : CanvasPixelFormat::kF16, - kNonOpaque, CanvasForceRGBA::kNotForced) + kNonOpaque) .GetSkColorSpaceForSkSurfaces(); if (!src_sk_color_space.get()) src_sk_color_space = SkColorSpace::MakeSRGB(); sk_sp<SkColorSpace> dst_sk_color_space = - CanvasColorParams(dst_color_space, dst_canvas_pixel_format, kNonOpaque, - CanvasForceRGBA::kNotForced) + CanvasColorParams(dst_color_space, dst_canvas_pixel_format, kNonOpaque) .GetSkColorSpaceForSkSurfaces(); if (!dst_sk_color_space.get()) dst_sk_color_space = SkColorSpace::MakeSRGB();
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc index da6f225..b99ac19 100644 --- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc +++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc
@@ -175,15 +175,11 @@ : filename_extension_; } -sk_sp<PaintImageGenerator> DeferredImageDecoder::CreateGenerator(size_t index) { +sk_sp<PaintImageGenerator> DeferredImageDecoder::CreateGenerator() { if (frame_generator_ && frame_generator_->DecodeFailed()) return nullptr; - PrepareLazyDecodedFrames(); - - // PrepareLazyDecodedFrames should populate the metadata for each frame in - // this image and create the |frame_generator_|, if enough data is available. - if (index >= frame_data_.size()) + if (invalid_image_ || frame_data_.IsEmpty()) return nullptr; DCHECK(frame_generator_); @@ -196,10 +192,16 @@ SegmentReader::CreateFromSkROBuffer(std::move(ro_buffer)); // ImageFrameGenerator has the latest known alpha state. There will be a - // performance boost if this frame is opaque. - SkAlphaType alpha_type = frame_generator_->HasAlpha(index) - ? kPremul_SkAlphaType - : kOpaque_SkAlphaType; + // performance boost if the image is opaque since we can avoid painting + // the background in this case. + // For multi-frame images, these maybe animated on the compositor thread. + // So we can not mark them as opaque unless all frames are opaque. + // TODO(khushalsagar): Check whether all frames being added to the + // generator are opaque when populating FrameMetadata below. + SkAlphaType alpha_type = kPremul_SkAlphaType; + if (frame_data_.size() == 1u && !frame_generator_->HasAlpha(0u)) + alpha_type = kOpaque_SkAlphaType; + SkImageInfo info = SkImageInfo::MakeN32(decoded_size.width(), decoded_size.height(), alpha_type, color_space_for_sk_images_); @@ -396,14 +398,19 @@ if (!metadata_decoder_ || !metadata_decoder_->IsSizeAvailable()) return; + if (invalid_image_) + return; + if (!image_metadata_) image_metadata_ = metadata_decoder_->MakeMetadataForDecodeAcceleration(); // If the image contains a coded size with zero in either or both size // dimensions, the image is invalid. if (image_metadata_->coded_size.has_value() && - image_metadata_->coded_size.value().IsEmpty()) + image_metadata_->coded_size.value().IsEmpty()) { + invalid_image_ = true; return; + } ActivateLazyDecoding(); @@ -411,12 +418,16 @@ frame_data_.resize(metadata_decoder_->FrameCount()); // The decoder may be invalidated during a FrameCount(). Simply bail if so. - if (metadata_decoder_->Failed()) + if (metadata_decoder_->Failed()) { + invalid_image_ = true; return; + } // We have encountered a broken image file. Simply bail. - if (frame_data_.size() < previous_size) + if (frame_data_.size() < previous_size) { + invalid_image_ = true; return; + } for (size_t i = previous_size; i < frame_data_.size(); ++i) { frame_data_[i].duration_ = metadata_decoder_->FrameDurationAtIndex(i);
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.h b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.h index d7a069b..76a5fa1 100644 --- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.h +++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.h
@@ -62,7 +62,7 @@ String FilenameExtension() const; - sk_sp<PaintImageGenerator> CreateGenerator(size_t index); + sk_sp<PaintImageGenerator> CreateGenerator(); scoped_refptr<SharedBuffer> Data(); void SetData(scoped_refptr<SharedBuffer> data, bool all_data_received); @@ -120,6 +120,10 @@ const PaintImage::ContentId complete_frame_content_id_; base::Optional<bool> incremental_decode_needed_; + // Set to true if the image is detected to be invalid after parsing the + // metadata. + bool invalid_image_ = false; + // Caches an image's metadata so it can outlive |metadata_decoder_| after all // data is received in cases where multiple generators are created. base::Optional<cc::ImageHeaderMetadata> image_metadata_;
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc index d515c95..7e81cb95 100644 --- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc +++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc
@@ -131,8 +131,7 @@ .set_id(paint_image_id_) .set_animation_type(type) .set_completion_state(state) - .set_paint_image_generator( - decoder->CreateGenerator(PaintImage::kDefaultFrameIndex)) + .set_paint_image_generator(decoder->CreateGenerator()) .TakePaintImage(); }
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test_wo_platform.cc b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test_wo_platform.cc index 2283a63..a8cc839 100644 --- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test_wo_platform.cc +++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test_wo_platform.cc
@@ -19,7 +19,7 @@ sk_sp<SkImage> CreateFrameAtIndex(DeferredImageDecoder* decoder, size_t index) { return SkImage::MakeFromGenerator(std::make_unique<SkiaPaintImageGenerator>( - decoder->CreateGenerator(index), index, + decoder->CreateGenerator(), index, cc::PaintImage::kDefaultGeneratorClientId)); }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index a6b6d26..b8f760e 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -41,8 +41,6 @@ #include "components/viz/common/resources/bitmap_allocation.h" #include "components/viz/common/resources/shared_bitmap.h" #include "components/viz/common/resources/transferable_resource.h" -#include "gpu/GLES2/gl2extchromium.h" -#include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "gpu/command_buffer/client/shared_image_interface.h" #include "gpu/command_buffer/common/capabilities.h" @@ -64,7 +62,6 @@ #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrContext.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h" -#include "ui/gl/gpu_preference.h" #include "v8/include/v8.h" namespace blink { @@ -850,15 +847,10 @@ return true; } -bool DrawingBuffer::CopyToPlatformTexture(gpu::gles2::GLES2Interface* dst_gl, - GLenum dst_texture_target, - GLuint dst_texture, - GLint dst_level, - bool premultiply_alpha, - bool flip_y, - const IntPoint& dst_texture_offset, - const IntRect& src_sub_rectangle, - SourceDrawingBuffer src_buffer) { +template <typename CopyFunction> +bool DrawingBuffer::CopyToPlatformInternal(gpu::InterfaceBase* dst_interface, + SourceDrawingBuffer src_buffer, + const CopyFunction& copy_function) { ScopedStateRestorer scoped_state_restorer(this); gpu::gles2::GLES2Interface* src_gl = gl_; @@ -868,9 +860,6 @@ src_gl->Flush(); } - if (!Extensions3DUtil::CanUseCopyTextureCHROMIUM(dst_texture_target)) - return false; - // Contexts may be in a different share group. We must transfer the texture // through a mailbox first. gpu::Mailbox mailbox; @@ -899,10 +888,32 @@ return false; } - dst_gl->WaitSyncTokenCHROMIUM(produce_sync_token.GetConstData()); + dst_interface->WaitSyncTokenCHROMIUM(produce_sync_token.GetConstData()); - GLuint src_texture = - dst_gl->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox.name); + copy_function(mailbox); + + gpu::SyncToken sync_token; + dst_interface->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); + src_gl->WaitSyncTokenCHROMIUM(sync_token.GetData()); + if (texture_id_to_restore_access) { + src_gl->BeginSharedImageAccessDirectCHROMIUM( + texture_id_to_restore_access, + GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); + } + return true; +} + +bool DrawingBuffer::CopyToPlatformTexture(gpu::gles2::GLES2Interface* dst_gl, + GLenum dst_texture_target, + GLuint dst_texture, + GLint dst_level, + bool premultiply_alpha, + bool flip_y, + const IntPoint& dst_texture_offset, + const IntRect& src_sub_rectangle, + SourceDrawingBuffer src_buffer) { + if (!Extensions3DUtil::CanUseCopyTextureCHROMIUM(dst_texture_target)) + return false; GLboolean unpack_premultiply_alpha_needed = GL_FALSE; GLboolean unpack_unpremultiply_alpha_needed = GL_FALSE; @@ -911,26 +922,45 @@ else if (want_alpha_channel_ && !premultiplied_alpha_ && premultiply_alpha) unpack_premultiply_alpha_needed = GL_TRUE; - dst_gl->BeginSharedImageAccessDirectCHROMIUM( - src_texture, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); - dst_gl->CopySubTextureCHROMIUM( - src_texture, 0, dst_texture_target, dst_texture, dst_level, - dst_texture_offset.X(), dst_texture_offset.Y(), src_sub_rectangle.X(), - src_sub_rectangle.Y(), src_sub_rectangle.Width(), - src_sub_rectangle.Height(), flip_y, unpack_premultiply_alpha_needed, - unpack_unpremultiply_alpha_needed); - dst_gl->EndSharedImageAccessDirectCHROMIUM(src_texture); - dst_gl->DeleteTextures(1, &src_texture); + auto copy_function = [&](gpu::Mailbox src_mailbox) { + GLuint src_texture = + dst_gl->CreateAndTexStorage2DSharedImageCHROMIUM(src_mailbox.name); + dst_gl->BeginSharedImageAccessDirectCHROMIUM( + src_texture, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); + dst_gl->CopySubTextureCHROMIUM( + src_texture, 0, dst_texture_target, dst_texture, dst_level, + dst_texture_offset.X(), dst_texture_offset.Y(), src_sub_rectangle.X(), + src_sub_rectangle.Y(), src_sub_rectangle.Width(), + src_sub_rectangle.Height(), flip_y, unpack_premultiply_alpha_needed, + unpack_unpremultiply_alpha_needed); + dst_gl->EndSharedImageAccessDirectCHROMIUM(src_texture); + dst_gl->DeleteTextures(1, &src_texture); + }; + return CopyToPlatformInternal(dst_gl, src_buffer, copy_function); +} - gpu::SyncToken sync_token; - dst_gl->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); - src_gl->WaitSyncTokenCHROMIUM(sync_token.GetData()); - if (texture_id_to_restore_access) { - src_gl->BeginSharedImageAccessDirectCHROMIUM( - texture_id_to_restore_access, - GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); - } - return true; +bool DrawingBuffer::CopyToPlatformMailbox( + gpu::raster::RasterInterface* dst_raster_interface, + gpu::Mailbox dst_mailbox, + GLenum dst_texture_target, + bool flip_y, + const IntPoint& dst_texture_offset, + const IntRect& src_sub_rectangle, + SourceDrawingBuffer src_buffer) { + GLboolean unpack_premultiply_alpha_needed = GL_FALSE; + if (want_alpha_channel_ && !premultiplied_alpha_) + unpack_premultiply_alpha_needed = GL_TRUE; + + auto copy_function = [&](gpu::Mailbox src_mailbox) { + dst_raster_interface->CopySubTexture( + src_mailbox, dst_mailbox, dst_texture_target, dst_texture_offset.X(), + dst_texture_offset.Y(), src_sub_rectangle.X(), src_sub_rectangle.Y(), + src_sub_rectangle.Width(), src_sub_rectangle.Height(), flip_y, + unpack_premultiply_alpha_needed); + }; + + return CopyToPlatformInternal(dst_raster_interface, src_buffer, + copy_function); } cc::Layer* DrawingBuffer::CcLayer() { @@ -1052,7 +1082,8 @@ premultiplied_alpha_false_mailbox_ = sii->CreateSharedImage( format, static_cast<gfx::Size>(size), storage_color_space_, gpu::SHARED_IMAGE_USAGE_GLES2 | - gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT); + gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | + gpu::SHARED_IMAGE_USAGE_RASTER); gpu::SyncToken sync_token = sii->GenUnverifiedSyncToken(); gl_->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); premultiplied_alpha_false_texture_ =
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h index 61c9653..c9ab3f2 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
@@ -37,6 +37,9 @@ #include "cc/layers/texture_layer_client.h" #include "cc/resources/cross_thread_shared_bitmap.h" #include "cc/resources/shared_bitmap_id_registrar.h" +#include "gpu/GLES2/gl2extchromium.h" +#include "gpu/command_buffer/client/gles2_interface.h" +#include "gpu/command_buffer/client/raster_interface.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/sync_token.h" #include "gpu/config/gpu_feature_info.h" @@ -240,6 +243,14 @@ const IntRect& src_sub_rectangle, SourceDrawingBuffer); + bool CopyToPlatformMailbox(gpu::raster::RasterInterface*, + gpu::Mailbox dst_mailbox, + GLenum dst_texture_target, + bool flip_y, + const IntPoint& dst_texture_offset, + const IntRect& src_sub_rectangle, + SourceDrawingBuffer src_buffer); + sk_sp<SkData> PaintRenderingResultsToDataArray(SourceDrawingBuffer); int SampleCount() const { return sample_count_; } @@ -385,6 +396,11 @@ DISALLOW_COPY_AND_ASSIGN(ColorBuffer); }; + template <typename CopyFunction> + bool CopyToPlatformInternal(gpu::InterfaceBase* dst_interface, + SourceDrawingBuffer src_buffer, + const CopyFunction& copy_function); + // The same as clearFramebuffers(), but leaves GL state dirty. void ClearFramebuffersInternal(GLbitfield clear_mask); @@ -611,7 +627,7 @@ bool opengl_flip_y_extension_; - gl::GpuPreference initial_gpu_; + const gl::GpuPreference initial_gpu_; gl::GpuPreference current_active_gpu_; DISALLOW_COPY_AND_ASSIGN(DrawingBuffer);
diff --git a/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.cc b/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.cc new file mode 100644 index 0000000..3bdeec3 --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.cc
@@ -0,0 +1,49 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.h" + +namespace blink { + +MemoryManagedPaintCanvas::MemoryManagedPaintCanvas( + cc::DisplayItemList* list, + const SkRect& bounds, + base::RepeatingClosure set_needs_flush_callback) + : RecordPaintCanvas(list, bounds), + set_needs_flush_callback_(std::move(set_needs_flush_callback)) {} + +MemoryManagedPaintCanvas::~MemoryManagedPaintCanvas() = default; + +void MemoryManagedPaintCanvas::drawImage(const cc::PaintImage& image, + SkScalar left, + SkScalar top, + const cc::PaintFlags* flags) { + DCHECK(!image.IsPaintWorklet()); + RecordPaintCanvas::drawImage(image, left, top, flags); + UpdateMemoryUsage(image); +} + +void MemoryManagedPaintCanvas::drawImageRect( + const cc::PaintImage& image, + const SkRect& src, + const SkRect& dst, + const cc::PaintFlags* flags, + PaintCanvas::SrcRectConstraint constraint) { + RecordPaintCanvas::drawImageRect(image, src, dst, flags, constraint); + UpdateMemoryUsage(image); +} + +void MemoryManagedPaintCanvas::UpdateMemoryUsage(const cc::PaintImage& image) { + if (cached_image_ids_.contains(image.content_id())) + return; + + cached_image_ids_.insert(image.content_id()); + total_stored_image_memory_ += + image.GetSkImage()->imageInfo().computeMinByteSize(); + + if (total_stored_image_memory_ > kMaxPinnedMemory) + set_needs_flush_callback_.Run(); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.h b/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.h new file mode 100644 index 0000000..444d771f --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.h
@@ -0,0 +1,52 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_CANVAS_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_CANVAS_H_ + +#include <memory> + +#include "cc/paint/record_paint_canvas.h" +#include "third_party/blink/public/platform/platform.h" + +namespace blink { + +// MemoryManagedPaintCanvas overrides the potentially memory intensive image +// drawing methods of PaintCanvas and keeps track of how much memory is +// being pinned between flushes. This allows the rendering context to flush if +// too much memory is used. +class PLATFORM_EXPORT MemoryManagedPaintCanvas final + : public cc::RecordPaintCanvas { + public: + MemoryManagedPaintCanvas(cc::DisplayItemList* list, + const SkRect& bounds, + base::RepeatingClosure set_needs_flush_callback); + explicit MemoryManagedPaintCanvas(const cc::RecordPaintCanvas&) = delete; + ~MemoryManagedPaintCanvas() override; + + void drawImage(const cc::PaintImage& image, + SkScalar left, + SkScalar top, + const cc::PaintFlags* flags) override; + void drawImageRect(const cc::PaintImage& image, + const SkRect& src, + const SkRect& dst, + const cc::PaintFlags* flags, + SrcRectConstraint constraint) override; + + private: + void UpdateMemoryUsage(const cc::PaintImage& image); + + base::flat_set<int> cached_image_ids_; + uint64_t total_stored_image_memory_ = 0; + + base::RepeatingClosure set_needs_flush_callback_; + + // The same value as is used in content::WebGraphicsConext3DProviderImpl. + static constexpr uint64_t kMaxPinnedMemory = 64 * 1024 * 1024; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_CANVAS_H_
diff --git a/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.cc b/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.cc new file mode 100644 index 0000000..1f17997 --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.cc
@@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h" + +namespace blink { + +MemoryManagedPaintRecorder::MemoryManagedPaintRecorder( + base::RepeatingClosure set_needs_flush_callback) + : set_needs_flush_callback_(std::move(set_needs_flush_callback)) {} + +std::unique_ptr<cc::RecordPaintCanvas> MemoryManagedPaintRecorder::CreateCanvas( + cc::DisplayItemList* list, + const SkRect& bounds) { + return std::make_unique<MemoryManagedPaintCanvas>(list, bounds, + set_needs_flush_callback_); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h b/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h new file mode 100644 index 0000000..1450219 --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h
@@ -0,0 +1,50 @@ +/* + * Copyright (C) 2019 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_RECORDER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_RECORDER_H_ + +#include "cc/paint/paint_recorder.h" +#include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_canvas.h" + +namespace blink { + +class PLATFORM_EXPORT MemoryManagedPaintRecorder : public cc::PaintRecorder { + public: + MemoryManagedPaintRecorder(base::RepeatingClosure set_needs_flush_callback); + + protected: + std::unique_ptr<cc::RecordPaintCanvas> CreateCanvas( + cc::DisplayItemList* list, + const SkRect& bounds) override; + + private: + base::RepeatingClosure set_needs_flush_callback_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_MEMORY_MANAGED_PAINT_RECORDER_H_
diff --git a/third_party/blink/renderer/platform/wtf/allocator/allocator.h b/third_party/blink/renderer/platform/wtf/allocator/allocator.h index e7d2d77..d84bff0d 100644 --- a/third_party/blink/renderer/platform/wtf/allocator/allocator.h +++ b/third_party/blink/renderer/platform/wtf/allocator/allocator.h
@@ -169,20 +169,4 @@ return location; } -#if defined(__clang__) && __has_attribute(uninitialized) -// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for -// the specified variable. -// -// -ftrivial-auto-var-init is security risk mitigation feature, so attribute -// should not be used "just in case", but only to fix real performance -// bottlenecks when other approaches do not work. In general the compiler is -// quite effective at eliminating unneeded initializations introduced by the -// flag, e.g. when they are followed by actual initialization by a program. -// However if compiler optimization fails and code refactoring is hard, the -// attribute can be used as a workaround. -#define STACK_UNINITIALIZED __attribute__((uninitialized)) -#else -#define STACK_UNINITIALIZED -#endif - #endif /* WTF_Allocator_h */
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 1605c840..71efbd00 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -629,6 +629,8 @@ 'base::MRUCache', 'gl::GpuPreference', 'gpu::gles2::GLES2Interface', + 'gpu::raster::RasterInterface', + 'gpu::Mailbox', 'gpu::MailboxHolder', 'display::Display', ],
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item index bd941000a..ea736a0 100644 --- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item +++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -1071,7 +1071,7 @@ crbug.com/982194 external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Pass Timeout ] crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_chain_ini.html [ Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Pass ]
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations index 160cbf61..19abf9f 100644 --- a/third_party/blink/web_tests/LeakExpectations +++ b/third_party/blink/web_tests/LeakExpectations
@@ -96,7 +96,7 @@ crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/application-panel/app-manifest-view-a11y-test.js [ Failure Pass ] crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js [ Failure Pass ] crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/basic-a11y-test.js [ Failure Pass ] -crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/console-a11y-test.js [ Failure Pass ] +crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/console/console-a11y-test.js [ Failure Pass ] crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/elements/event-listeners-a11y-test.js [ Failure Pass ] crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/memory/heap-profiler-a11y-test.js [ Failure Pass ] crbug.com/1000512 [ Linux ] http/tests/devtools/a11y-axe-core/network/network-condition-a11y-test.js [ Failure Pass ]
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations index 5762d90..bab9f08 100644 --- a/third_party/blink/web_tests/MSANExpectations +++ b/third_party/blink/web_tests/MSANExpectations
@@ -276,7 +276,7 @@ crbug.com/856601 [ Linux ] external/wpt/webrtc/idlharness.https.window.html [ Pass Timeout ] crbug.com/856601 [ Linux ] external/wpt/webvtt/api/idlharness.window.html [ Pass Timeout ] crbug.com/856601 [ Linux ] external/wpt/xhr/idlharness.any.worker.html [ Pass Timeout ] -crbug.com/856601 [ Linux ] http/tests/devtools/a11y-axe-core/console-a11y-test.js [ Pass Timeout ] +crbug.com/856601 [ Linux ] http/tests/devtools/a11y-axe-core/console/console-a11y-test.js [ Pass Timeout ] crbug.com/856601 [ Linux ] http/tests/devtools/a11y-axe-core/network/network-condition-a11y-test.js [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.serviceworker.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.worker.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 1c220bf4..5a6b6ae1 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -17,7 +17,7 @@ external/wpt/infrastructure/expected-fail/timeout.html [ Timeout ] crbug.com/997202 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Failure ] -crbug.com/997202 external/wpt/infrastructure/reftest/reftest_fuzzy_chain_ini.html [ Failure ] +crbug.com/997202 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Failure ] crbug.com/997202 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Failure ] crbug.com/997202 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Failure ] crbug.com/997202 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Failure ] @@ -1874,6 +1874,29 @@ crbug.com/552494 virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations.html [ Pass Failure ] +# These are copied from elsewhere in this file, for the virtual/form-controls-refresh-disabled suite: +crbug.com/954349 virtual/form-controls-refresh-disabled/fast/forms/autofocus-in-sandbox-with-allow-scripts.html [ Timeout ] +crbug.com/404597 virtual/form-controls-refresh-disabled/fast/forms/long-text-in-input.html [ Skip ] +crbug.com/654999 [ Win ] virtual/form-controls-refresh-disabled/fast/forms/color/color-suggestion-picker-appearance-zoom200.html [ Pass Failure ] +crbug.com/654999 [ Linux ] virtual/form-controls-refresh-disabled/fast/forms/color/color-suggestion-picker-appearance-zoom200.html [ Pass Failure ] +crbug.com/832274 [ Linux ] virtual/form-controls-refresh-disabled/fast/forms/search/search-appearance-basic.html [ Pass Failure ] +crbug.com/832274 [ Win ] virtual/form-controls-refresh-disabled/fast/forms/search/search-appearance-basic.html [ Pass Failure ] +crbug.com/543369 virtual/form-controls-refresh-disabled/fast/forms/select-popup/popup-menu-appearance-tall.html [ Failure Pass ] +crbug.com/681468 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125.html [ Failure Pass ] +crbug.com/681468 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200.html [ Failure Pass ] +crbug.com/660185 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/datalist/input-appearance-range-with-transform.html [ Pass Failure ] +crbug.com/953591 [ Win ] virtual/form-controls-refresh-disabled/fast/forms/datalist/input-appearance-range-with-transform.html [ Pass Failure ] +crbug.com/591099 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/text/text-lineheight-centering.html [ Failure ] +crbug.com/770971 [ Win7 ] virtual/form-controls-refresh-disabled/fast/forms/suggested-value.html [ Pass Failure ] +# From never fix tests: +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/select-popup/* [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/calendar-picker/date-open-picker-with-f4-key.html [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/calendar-picker/datetimelocal-open-picker-with-f4-key.html [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/calendar-picker/month-open-picker-with-f4-key.html [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/calendar-picker/week-open-picker-with-f4-key.html [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/select/menulist-onchange-fired-with-key-up-down.html [ Skip ] +crbug.com/123456 [ Mac ] virtual/form-controls-refresh-disabled/fast/forms/select/popup-with-display-none-optgroup.html [ Skip ] + crbug.com/652964 [ Linux ] virtual/text-antialias/hyphens/hyphen-min-preferred-width-mock.html [ Skip ] crbug.com/652964 [ Win ] virtual/text-antialias/hyphens/hyphen-min-preferred-width-mock.html [ Skip ] crbug.com/652964 [ Linux ] virtual/text-antialias/hyphens/hyphens-align.html [ Skip ] @@ -2649,6 +2672,30 @@ crbug.com/1035708 external/wpt/css/css-pseudo/grammar-error-001.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html [ Failure ] crbug.com/626703 [ Linux ] virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/ready.https.window.html [ Timeout ] crbug.com/626703 [ Mac ] virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/ready.https.window.html [ Timeout ] crbug.com/626703 [ Win ] virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/ready.https.window.html [ Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index bba81b7..6d4f155 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -704,6 +704,11 @@ "args": ["--disable-blink-features=ShadowDOMV0,CustomElementsV0,HTMLImports"] }, { + "prefix": "form-controls-refresh-disabled", + "bases": ["fast/forms/"], + "args": ["--disable-features=FormControlsRefresh"] + }, + { "prefix": "raw-clipboard", "bases": ["clipboard/async-clipboard", "external/wpt/clipboard-apis/clipboard-item.https.html"],
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index e9c8689..4cd2a45 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -36421,6 +36421,102 @@ {} ] ], + "css/css-break/block-max-height-001.html": [ + [ + "css/css-break/block-max-height-001.html", + [ + [ + "/css/css-break/block-max-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-max-height-001b.html": [ + [ + "css/css-break/block-max-height-001b.html", + [ + [ + "/css/css-break/block-max-height-001b-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-max-height-002.html": [ + [ + "css/css-break/block-max-height-002.html", + [ + [ + "/css/css-break/block-max-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-max-height-002b.html": [ + [ + "css/css-break/block-max-height-002b.html", + [ + [ + "/css/css-break/block-max-height-001b-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-max-height-003.html": [ + [ + "css/css-break/block-max-height-003.html", + [ + [ + "/css/css-break/block-max-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-max-height-003b.html": [ + [ + "css/css-break/block-max-height-003b.html", + [ + [ + "/css/css-break/block-max-height-001b-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-min-height-001.html": [ + [ + "css/css-break/block-min-height-001.html", + [ + [ + "/css/css-break/block-min-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-break/block-min-height-001b.html": [ + [ + "css/css-break/block-min-height-001b.html", + [ + [ + "/css/css-break/block-min-height-001b-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-break/fieldset-001.html": [ [ "css/css-break/fieldset-001.html", @@ -118513,6 +118609,42 @@ {} ] ], + "infrastructure/reftest/legacy/reftest_and_fail.html": [ + [ + "infrastructure/reftest/legacy/reftest_and_fail.html", + [ + [ + "/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html", + "==" + ] + ], + {} + ] + ], + "infrastructure/reftest/legacy/reftest_and_mismatch.html": [ + [ + "infrastructure/reftest/legacy/reftest_and_mismatch.html", + [ + [ + "/infrastructure/reftest/legacy/reftest_and_mismatch_0.html", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html": [ + [ + "infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html", + [ + [ + "/infrastructure/reftest/legacy/fuzzy-ref-2.html", + "==" + ] + ], + {} + ] + ], "infrastructure/reftest/reftest.https.html": [ [ "infrastructure/reftest/reftest.https.html", @@ -118525,30 +118657,6 @@ {} ] ], - "infrastructure/reftest/reftest_and_fail.html": [ - [ - "infrastructure/reftest/reftest_and_fail.html", - [ - [ - "/infrastructure/reftest/reftest_and_fail_0-ref.html", - "==" - ] - ], - {} - ] - ], - "infrastructure/reftest/reftest_and_mismatch.html": [ - [ - "infrastructure/reftest/reftest_and_mismatch.html", - [ - [ - "/infrastructure/reftest/reftest_and_mismatch_0.html", - "!=" - ] - ], - {} - ] - ], "infrastructure/reftest/reftest_fuzzy_1.html": [ [ "infrastructure/reftest/reftest_fuzzy_1.html", @@ -118581,18 +118689,6 @@ } ] ], - "infrastructure/reftest/reftest_fuzzy_chain_ini.html": [ - [ - "infrastructure/reftest/reftest_fuzzy_chain_ini.html", - [ - [ - "/infrastructure/reftest/fuzzy-ref-2.html", - "==" - ] - ], - {} - ] - ], "infrastructure/reftest/reftest_fuzzy_ini_full.html": [ [ "infrastructure/reftest/reftest_fuzzy_ini_full.html", @@ -118765,6 +118861,166 @@ {} ] ], + "infrastructure/reftest/reftest_match_and_mismatch-0.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-0.html", + [ + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-1.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-1.html", + [ + [ + "/infrastructure/reftest/red.html?2", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-2.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-2.html", + [ + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-3.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-3.html", + [ + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-4.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-4.html", + [ + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-5.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-5.html", + [ + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-6.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-6.html", + [ + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/green.html?2", + "!=" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_match_and_mismatch-7.html": [ + [ + "infrastructure/reftest/reftest_match_and_mismatch-7.html", + [ + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "==" + ], + [ + "/infrastructure/reftest/red.html?2", + "!=" + ], + [ + "/infrastructure/reftest/green.html?2", + "!=" + ] + ], + {} + ] + ], "infrastructure/reftest/reftest_match_fail.html": [ [ "infrastructure/reftest/reftest_match_fail.html", @@ -118801,9 +119057,9 @@ {} ] ], - "infrastructure/reftest/reftest_or_0.html": [ + "infrastructure/reftest/reftest_multiple_match-0.html": [ [ - "infrastructure/reftest/reftest_or_0.html", + "infrastructure/reftest/reftest_multiple_match-0.html", [ [ "/infrastructure/reftest/red.html", @@ -118817,6 +119073,54 @@ {} ] ], + "infrastructure/reftest/reftest_multiple_match-1.html": [ + [ + "infrastructure/reftest/reftest_multiple_match-1.html", + [ + [ + "/infrastructure/reftest/green.html", + "==" + ], + [ + "/infrastructure/reftest/red.html", + "==" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_multiple_mismatch-0.html": [ + [ + "infrastructure/reftest/reftest_multiple_mismatch-0.html", + [ + [ + "/infrastructure/reftest/green.html", + "!=" + ], + [ + "/infrastructure/reftest/red.html", + "!=" + ] + ], + {} + ] + ], + "infrastructure/reftest/reftest_multiple_mismatch-1.html": [ + [ + "infrastructure/reftest/reftest_multiple_mismatch-1.html", + [ + [ + "/infrastructure/reftest/red.html", + "!=" + ], + [ + "/infrastructure/reftest/green.html", + "!=" + ] + ], + {} + ] + ], "infrastructure/reftest/reftest_ref_timeout.html": [ [ "infrastructure/reftest/reftest_ref_timeout.html", @@ -126465,21 +126769,21 @@ {} ] ], - "infrastructure/reftest/fuzzy-ref-2.html": [ + "infrastructure/reftest/legacy/fuzzy-ref-2.html": [ [ - "infrastructure/reftest/fuzzy-ref-2.html", + "infrastructure/reftest/legacy/fuzzy-ref-2.html", [ [ - "/infrastructure/reftest/fuzzy-ref-2a.html", + "/infrastructure/reftest/legacy/fuzzy-ref-2a.html", "==" ] ], {} ] ], - "infrastructure/reftest/reftest_and_fail_0-ref.html": [ + "infrastructure/reftest/legacy/reftest_and_fail_0-ref.html": [ [ - "infrastructure/reftest/reftest_and_fail_0-ref.html", + "infrastructure/reftest/legacy/reftest_and_fail_0-ref.html", [ [ "/infrastructure/reftest/red.html", @@ -126489,72 +126793,72 @@ {} ] ], - "infrastructure/reftest/reftest_and_mismatch_0.html": [ + "infrastructure/reftest/legacy/reftest_and_mismatch_0.html": [ [ - "infrastructure/reftest/reftest_and_mismatch_0.html", + "infrastructure/reftest/legacy/reftest_and_mismatch_0.html", [ [ - "/infrastructure/reftest/reftest_and_mismatch_1.html", + "/infrastructure/reftest/legacy/reftest_and_mismatch_1.html", "!=" ] ], {} ] ], - "infrastructure/reftest/reftest_cycle.html": [ + "infrastructure/reftest/legacy/reftest_cycle.html": [ [ - "infrastructure/reftest/reftest_cycle.html", + "infrastructure/reftest/legacy/reftest_cycle.html", [ [ - "/infrastructure/reftest/reftest_cycle_0-ref.html", + "/infrastructure/reftest/legacy/reftest_cycle_0-ref.html", "==" ] ], {} ] ], - "infrastructure/reftest/reftest_cycle_0-ref.html": [ + "infrastructure/reftest/legacy/reftest_cycle_0-ref.html": [ [ - "infrastructure/reftest/reftest_cycle_0-ref.html", + "infrastructure/reftest/legacy/reftest_cycle_0-ref.html", [ [ - "/infrastructure/reftest/reftest_cycle_1-ref.html", + "/infrastructure/reftest/legacy/reftest_cycle_1-ref.html", "==" ] ], {} ] ], - "infrastructure/reftest/reftest_cycle_1-ref.html": [ + "infrastructure/reftest/legacy/reftest_cycle_1-ref.html": [ [ - "infrastructure/reftest/reftest_cycle_1-ref.html", + "infrastructure/reftest/legacy/reftest_cycle_1-ref.html", [ [ - "/infrastructure/reftest/reftest_cycle.html", + "/infrastructure/reftest/legacy/reftest_cycle.html", "==" ] ], {} ] ], - "infrastructure/reftest/reftest_cycle_fail.html": [ + "infrastructure/reftest/legacy/reftest_cycle_fail.html": [ [ - "infrastructure/reftest/reftest_cycle_fail.html", + "infrastructure/reftest/legacy/reftest_cycle_fail.html", [ [ - "/infrastructure/reftest/reftest_cycle_fail_0-ref.html", + "/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html", "==" ] ], {} ] ], - "infrastructure/reftest/reftest_cycle_fail_0-ref.html": [ + "infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html": [ [ - "infrastructure/reftest/reftest_cycle_fail_0-ref.html", + "infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html", [ [ - "/infrastructure/reftest/reftest_cycle_fail.html", + "/infrastructure/reftest/legacy/reftest_cycle_fail.html", "!=" ] ], @@ -127526,6 +127830,9 @@ "IndexedDB/README.md": [ [] ], + "IndexedDB/file_to_save.txt": [ + [] + ], "IndexedDB/idbworker.js": [ [] ], @@ -134894,6 +135201,18 @@ "css/css-break/block-end-aligned-abspos-with-overflow-ref.html": [ [] ], + "css/css-break/block-max-height-001-ref.html": [ + [] + ], + "css/css-break/block-max-height-001b-ref.html": [ + [] + ], + "css/css-break/block-min-height-001-ref.html": [ + [] + ], + "css/css-break/block-min-height-001b-ref.html": [ + [] + ], "css/css-break/fieldset-001-ref.html": [ [] ], @@ -166460,13 +166779,16 @@ "infrastructure/metadata/infrastructure/expected-fail/unhandled-rejection.html.ini": [ [] ], - "infrastructure/metadata/infrastructure/reftest/reftest_and_fail.html.ini": [ + "infrastructure/metadata/infrastructure/reftest/legacy/fuzzy-ref-2.html.ini": [ [] ], - "infrastructure/metadata/infrastructure/reftest/reftest_cycle_fail.html.ini": [ + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html.ini": [ [] ], - "infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_chain_ini.html.ini": [ + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html.ini": [ [] ], "infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_ini_full.html.ini": [ @@ -166478,12 +166800,36 @@ "infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_ini_short.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-0.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-1.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-4.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-5.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-6.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-7.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/reftest/reftest_match_fail.html.ini": [ [] ], "infrastructure/metadata/infrastructure/reftest/reftest_mismatch_fail.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-0.html.ini": [ + [] + ], + "infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-1.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/reftest/reftest_ref_timeout.html.ini": [ [] ], @@ -166553,16 +166899,19 @@ "infrastructure/reftest/fuzzy-ref-1.html": [ [] ], - "infrastructure/reftest/fuzzy-ref-2a.html": [ - [] - ], "infrastructure/reftest/green.html": [ [] ], - "infrastructure/reftest/red.html": [ + "infrastructure/reftest/legacy/README.md": [ [] ], - "infrastructure/reftest/reftest_and_mismatch_1.html": [ + "infrastructure/reftest/legacy/fuzzy-ref-2a.html": [ + [] + ], + "infrastructure/reftest/legacy/reftest_and_mismatch_1.html": [ + [] + ], + "infrastructure/reftest/red.html": [ [] ], "infrastructure/reftest/reftest_ref_timeout-ref.html": [ @@ -190956,6 +191305,14 @@ {} ] ], + "IndexedDB/file_support.sub.html": [ + [ + "IndexedDB/file_support.sub.html", + { + "testdriver": true + } + ] + ], "IndexedDB/fire-error-event-exception.html": [ [ "IndexedDB/fire-error-event-exception.html", @@ -192256,6 +192613,38 @@ } ] ], + "IndexedDB/idbindex_tombstones.any.js": [ + [ + "IndexedDB/idbindex_tombstones.any.html", + { + "script_metadata": [ + [ + "title", + "Index Tombstones" + ], + [ + "script", + "support-promises.js" + ] + ] + } + ], + [ + "IndexedDB/idbindex_tombstones.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Index Tombstones" + ], + [ + "script", + "support-promises.js" + ] + ] + } + ] + ], "IndexedDB/idbkeyrange-includes.htm": [ [ "IndexedDB/idbkeyrange-includes.htm", @@ -343608,6 +343997,14 @@ "4b97c98dd83972322f04ea0221aff3111f3f22d2", "testharness" ], + "IndexedDB/file_support.sub.html": [ + "157ba6cd0910daaab0ba4752f173848a5dc39746", + "testharness" + ], + "IndexedDB/file_to_save.txt": [ + "3f5238e841d7f3af9a87fb8e8fe4e784dc662a67", + "support" + ], "IndexedDB/fire-error-event-exception.html": [ "0a3f12265894f03adfb2b6577e5d35dbf0c89c5d", "testharness" @@ -344384,6 +344781,10 @@ "0b3c767fee17cb2739bd49a05237beaea5129e20", "testharness" ], + "IndexedDB/idbindex_tombstones.any.js": [ + "05617a384f6d31b2c000a737f47e966650fbd214", + "testharness" + ], "IndexedDB/idbkeyrange-includes.htm": [ "aea588051aeaab63c3855a778b22d1a6932d78ff", "testharness" @@ -373652,6 +374053,54 @@ "c7acaa977b240ecde638e900d0fec7844cf2b965", "testharness" ], + "css/css-break/block-max-height-001-ref.html": [ + "6d514273edbfe4496cb43a222c48b3b273fbb589", + "support" + ], + "css/css-break/block-max-height-001.html": [ + "acb4316d13eee6d791e8c27e5e1b8ab2be03e0ac", + "reftest" + ], + "css/css-break/block-max-height-001b-ref.html": [ + "40ecf750be0f316b52eadfd533822ce4d675d07e", + "support" + ], + "css/css-break/block-max-height-001b.html": [ + "e24cea67b3d6e37b57858ecf54599076412b7cfa", + "reftest" + ], + "css/css-break/block-max-height-002.html": [ + "75aeb6229a90e62783852c2dcae1fe33d6ef6741", + "reftest" + ], + "css/css-break/block-max-height-002b.html": [ + "cf8cc98eb5835619645d00ab41c2de14e0f6c961", + "reftest" + ], + "css/css-break/block-max-height-003.html": [ + "c58bad29cac96aadf8bb9b003edccc00a7618846", + "reftest" + ], + "css/css-break/block-max-height-003b.html": [ + "019c290d71529c4bf8eb9f83c24a81921918faae", + "reftest" + ], + "css/css-break/block-min-height-001-ref.html": [ + "492a9a19ae2d992f01e79700dff51f2d09397095", + "support" + ], + "css/css-break/block-min-height-001.html": [ + "47ceff763195d254b22dd8739e1a46b0168df50f", + "reftest" + ], + "css/css-break/block-min-height-001b-ref.html": [ + "46e6927a29302057e01a01845f3edd644f7c4bff", + "support" + ], + "css/css-break/block-min-height-001b.html": [ + "8ed26c5952646d78d43382ccd56b8cd94f5d2d0f", + "reftest" + ], "css/css-break/break-before-always-001.xht": [ "e2e7297d1532fba60d2074aa2701600dc7441742", "visual" @@ -473344,15 +473793,19 @@ "da4fe27e58959f7e3d6ba5ebbc7edd58a93dcf5c", "support" ], - "infrastructure/metadata/infrastructure/reftest/reftest_and_fail.html.ini": [ - "81aef049cd122f7332c66f5a087947e512a59d0e", + "infrastructure/metadata/infrastructure/reftest/legacy/fuzzy-ref-2.html.ini": [ + "0bbb2bf0aa5faf14d0c92f044cd55e5baceffdca", "support" ], - "infrastructure/metadata/infrastructure/reftest/reftest_cycle_fail.html.ini": [ - "472b33f7764bde6e2aea7bc2ccd8bf3739babad2", + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html.ini": [ + "1e13cec6ac4f0c45fc9d79563bd85c786d5b88dd", "support" ], - "infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_chain_ini.html.ini": [ + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html.ini": [ + "9a0066917e113880215f3d1dcb944b0c156fc31b", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html.ini": [ "69dc018f38990001626df54f1d067efd3421fdd0", "support" ], @@ -473368,6 +473821,30 @@ "1859d256800414818d55117ab8e05d19cdb819e0", "support" ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-0.html.ini": [ + "f90b3d68475d1b9e5f05b918a6708a2aeff4b5f9", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-1.html.ini": [ + "eeb9fc582dc5e65c31553341ac1a3f64a415a1a9", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-4.html.ini": [ + "77c7ba227d5fe047472fee9b907fd378c10e294b", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-5.html.ini": [ + "e87acf9b6799c40f2fe5355829dd111b8b25a117", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-6.html.ini": [ + "e3089dd1031e7dc24bca0503218ec78389f7b105", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-7.html.ini": [ + "09162d880186ad8f475cd5aab64210c73706d3b8", + "support" + ], "infrastructure/metadata/infrastructure/reftest/reftest_match_fail.html.ini": [ "f3dc3362fac41bbe8ded44589e898ef589cb1a89", "support" @@ -473376,6 +473853,14 @@ "1055337e2d65cb8f21d2ceac62e35ce7bb99a976", "support" ], + "infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-0.html.ini": [ + "6bc0bef41d96261c1c4087d271d473e744fb7e9e", + "support" + ], + "infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-1.html.ini": [ + "964858b1acdf4ea78a31b912052d74748c2e4927", + "support" + ], "infrastructure/metadata/infrastructure/reftest/reftest_ref_timeout.html.ini": [ "8936241ad29cd162f961076c2ba8eb960f7698c3", "support" @@ -473472,14 +473957,6 @@ "e50fc11ef6ea80754e702becfbf675feebe3dbb9", "support" ], - "infrastructure/reftest/fuzzy-ref-2.html": [ - "cdaf6446ed40dd5c251a7f7031aeaba91bf79541", - "reftest_node" - ], - "infrastructure/reftest/fuzzy-ref-2a.html": [ - "99da3203afba94574df823bb79d39a735b282b44", - "support" - ], "infrastructure/reftest/green-ref.html": [ "0e145d60b55b3502639d15f10d4d63a6b0f79b7d", "reftest" @@ -473488,6 +473965,62 @@ "38167bb58d571e75f54908166c542aca84731aec", "support" ], + "infrastructure/reftest/legacy/README.md": [ + "01bb6f773e3ec380570f9f614f84e5c930ab5796", + "support" + ], + "infrastructure/reftest/legacy/fuzzy-ref-2.html": [ + "cdaf6446ed40dd5c251a7f7031aeaba91bf79541", + "reftest_node" + ], + "infrastructure/reftest/legacy/fuzzy-ref-2a.html": [ + "99da3203afba94574df823bb79d39a735b282b44", + "support" + ], + "infrastructure/reftest/legacy/reftest_and_fail.html": [ + "2960195356238f03543207e9e6a3599361daeb91", + "reftest" + ], + "infrastructure/reftest/legacy/reftest_and_fail_0-ref.html": [ + "565f663ed50d972e57b7bb0461e86e77d3842e62", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_and_mismatch.html": [ + "b6b4847473dd548209de63e6f1f24a213411caf6", + "reftest" + ], + "infrastructure/reftest/legacy/reftest_and_mismatch_0.html": [ + "f84ce6a13aa3dc9909405bb01eaccd820523f0ab", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_and_mismatch_1.html": [ + "05e905adafc06405b4f824ae720305735277790d", + "support" + ], + "infrastructure/reftest/legacy/reftest_cycle.html": [ + "4a84a3b6741ee41fe6187a9bdc766d749206c83a", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_cycle_0-ref.html": [ + "118bfd88447b48212af29e54861bb6d509a5e1b1", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_cycle_1-ref.html": [ + "59be0b641def6bd73a0cca72f17d3304641b48ea", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_cycle_fail.html": [ + "175e76c4cc9bb765f8fc8dfc34455ad2eb9bc405", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html": [ + "c8e548c462255638a32c474a177759ff6d7cceaf", + "reftest_node" + ], + "infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html": [ + "4353379ddb443355a978a7fc100ef470488035fd", + "reftest" + ], "infrastructure/reftest/red.html": [ "2b677e00634bcd16c32ba8d029ccab040f016780", "support" @@ -473496,54 +474029,10 @@ "5a45f10f35eb472ec13cc5dd247ff8df5c265385", "reftest" ], - "infrastructure/reftest/reftest_and_fail.html": [ - "2960195356238f03543207e9e6a3599361daeb91", - "reftest" - ], - "infrastructure/reftest/reftest_and_fail_0-ref.html": [ - "04fb9aa15176e6191ded5eccf442fcfd6cdcf566", - "reftest_node" - ], - "infrastructure/reftest/reftest_and_mismatch.html": [ - "b6b4847473dd548209de63e6f1f24a213411caf6", - "reftest" - ], - "infrastructure/reftest/reftest_and_mismatch_0.html": [ - "f84ce6a13aa3dc9909405bb01eaccd820523f0ab", - "reftest_node" - ], - "infrastructure/reftest/reftest_and_mismatch_1.html": [ - "05e905adafc06405b4f824ae720305735277790d", - "support" - ], - "infrastructure/reftest/reftest_cycle.html": [ - "4a84a3b6741ee41fe6187a9bdc766d749206c83a", - "reftest_node" - ], - "infrastructure/reftest/reftest_cycle_0-ref.html": [ - "118bfd88447b48212af29e54861bb6d509a5e1b1", - "reftest_node" - ], - "infrastructure/reftest/reftest_cycle_1-ref.html": [ - "59be0b641def6bd73a0cca72f17d3304641b48ea", - "reftest_node" - ], - "infrastructure/reftest/reftest_cycle_fail.html": [ - "175e76c4cc9bb765f8fc8dfc34455ad2eb9bc405", - "reftest_node" - ], - "infrastructure/reftest/reftest_cycle_fail_0-ref.html": [ - "c8e548c462255638a32c474a177759ff6d7cceaf", - "reftest_node" - ], "infrastructure/reftest/reftest_fuzzy_1.html": [ "1930fe0ae8fb1aee30e91e691fe6a73ccfc87d0e", "reftest" ], - "infrastructure/reftest/reftest_fuzzy_chain_ini.html": [ - "4353379ddb443355a978a7fc100ef470488035fd", - "reftest" - ], "infrastructure/reftest/reftest_fuzzy_ini_full.html": [ "7429025798151b620dd72db71a46070aafe6c070", "reftest" @@ -473568,6 +474057,38 @@ "333cc6c1ecdf2000e4b118565661761b876a7299", "reftest" ], + "infrastructure/reftest/reftest_match_and_mismatch-0.html": [ + "9f52615a64a3818bddbefaf032b9d1679224a113", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-1.html": [ + "1bba49ea0d21ab6092091e566aabd4c40ff60854", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-2.html": [ + "60141aedf80719fefd7540369815ba0da19fcdfd", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-3.html": [ + "f707c1b13fe8ebb68a1efb7fd711bd8cb0894289", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-4.html": [ + "ac08cb70b63691b3924a135cc66e444f1dc10e7e", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-5.html": [ + "b30d84a2dd4286bd1ccc1621ff0cf5e2c0ca93ae", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-6.html": [ + "1a2dcc204ae4666c0a4d60152334fe8faf1a4f54", + "reftest" + ], + "infrastructure/reftest/reftest_match_and_mismatch-7.html": [ + "073e2206111586df4ff2c62e28e25aff2fddd72d", + "reftest" + ], "infrastructure/reftest/reftest_match_fail.html": [ "a9272ef74da87337a0223fcb00f053ceba5fb52b", "reftest" @@ -473580,10 +474101,22 @@ "8d160c4fc200ca97631b18505847d51fd762aba9", "reftest" ], - "infrastructure/reftest/reftest_or_0.html": [ + "infrastructure/reftest/reftest_multiple_match-0.html": [ "3a51de21644103a93f59d4c565428cc2d1606e54", "reftest" ], + "infrastructure/reftest/reftest_multiple_match-1.html": [ + "9a8b769d65ee11d16e9d8ab91173be0828a6d229", + "reftest" + ], + "infrastructure/reftest/reftest_multiple_mismatch-0.html": [ + "b0115a7551c9f1cb31e0bdaddb82ca4a9a146ddd", + "reftest" + ], + "infrastructure/reftest/reftest_multiple_mismatch-1.html": [ + "65ddd34324a936427c92646a1e0ca3d15c6c2a2a", + "reftest" + ], "infrastructure/reftest/reftest_ref_timeout-ref.html": [ "2f52c05979f831a43b9bf646f0901454635e0470", "support" @@ -473709,7 +474242,7 @@ "support" ], "infrastructure/testdriver/file_upload.sub.html": [ - "451ae500f077bab14d30c60f3e8608d10f6516b3", + "0490e89c422b851653d760cdb38855b2ce6816a6", "testharness" ], "infrastructure/testdriver/file_upload_data.txt": [ @@ -504569,7 +505102,7 @@ "support" ], "resources/chromium/webxr-test.js": [ - "15e14dce5ef89c8971bcb2114180170f1c714d16", + "a819a3b425be2aabb83696acb6b26b69211c33dd", "support" ], "resources/chromium/webxr-test.js.headers": [ @@ -514013,7 +514546,7 @@ "support" ], "tools/manifest/item.py": [ - "1c4034ad05f99a26315901a18c8f402d5fa64c10", + "fd3564bbe271117e57e62607b098dae9e074d929", "support" ], "tools/manifest/log.py": [ @@ -514021,11 +514554,11 @@ "support" ], "tools/manifest/manifest.py": [ - "2ad7fccf48675bdcc7b544747e1d1824a598542f", + "bfac309c86a7b5c04ad2d25ee79c82c79c16a29a", "support" ], "tools/manifest/sourcefile.py": [ - "b9dcc8f53636d3db80e4518f7d838027f098a8d7", + "800d1f981cc3b8a924351ada9ac303e300546474", "support" ], "tools/manifest/testpaths.py": [ @@ -518717,7 +519250,7 @@ "support" ], "tools/wptrunner/wptrunner/wpttest.py": [ - "1d14f4efeeae279c2c360fba1388ea5f3a43877f", + "67b57583424d08779114dc2fa030390e584d716f", "support" ], "tools/wptserve/LICENSE": [ @@ -533217,7 +533750,7 @@ "support" ], "webxr/resources/webxr_test_constants.js": [ - "dc60f6739d417448c252a93de0f1f61c063e5a35", + "3d9bfa2082baa90670131774920805a7f16cd5a2", "support" ], "webxr/resources/webxr_util.js": [ @@ -533249,7 +533782,7 @@ "support" ], "webxr/xrBoundedReferenceSpace_updates.https.html": [ - "55d311591116bf0ab175dcbd4b1b13b7a2ef9d9f", + "9043d59e3b2318fab182b85ab29d15ea4e2b41cb", "testharness" ], "webxr/xrDevice_disconnect_ends.https.html": [ @@ -533329,15 +533862,15 @@ "testharness" ], "webxr/xrReferenceSpace_originOffset.https.html": [ - "e7fe576cb2013647c18111c7fc2d74afdd7ee04d", + "988d99728d4be41424a7c09d622a5a9b9b608a27", "testharness" ], "webxr/xrReferenceSpace_originOffsetBounded.https.html": [ - "cfa3cc7ca2fe7cfbd656d9164b0d1ab3dd60ca41", + "7ef880c32c0923243b5193124e6812e96391dcc1", "testharness" ], "webxr/xrReferenceSpace_originOffset_viewer.https.html": [ - "2f93914e851ed55d5f9e60cc131316132e7ca226", + "5cd0f027266eee2a341e5b5d062227d2013ee67b", "testharness" ], "webxr/xrRigidTransform_constructor.https.html": [ @@ -533369,7 +533902,7 @@ "testharness" ], "webxr/xrSession_features_deviceSupport.https.html": [ - "45a68c9df2f09e6905187b48377a39774a933908", + "d8858bd4be689bf8e4f3a3795e13fad2a2057019", "testharness" ], "webxr/xrSession_input_events_end.https.html": [ @@ -533389,7 +533922,7 @@ "testharness" ], "webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [ - "0b83b4c6bb13faef3a6114c60f3dcfc14e7757c2", + "1b54f5f6ec147f8e1d3877bb28c5bb5c1ff104b6", "testharness" ], "webxr/xrSession_requestAnimationFrame_timestamp.https.html": [ @@ -533429,11 +533962,11 @@ "testharness" ], "webxr/xrView_match.https.html": [ - "9ccad9518b9c580be312be7e605840e24caa12e2", + "4bb48826ae02d995e6d8763c04cefe64f7057274", "testharness" ], "webxr/xrView_oneframeupdate.https.html": [ - "438d3dbaa36a14d6850adf83e3279e23c00157a4", + "6671721e4c54059373e7a031132dddb41237094c", "testharness" ], "webxr/xrView_sameObject.https.html": [
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/file_support.sub.html b/third_party/blink/web_tests/external/wpt/IndexedDB/file_support.sub.html new file mode 100644 index 0000000..157ba6c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/IndexedDB/file_support.sub.html
@@ -0,0 +1,61 @@ +<!doctype html> +<meta charset=utf8> +<title>File support in IndexedDB</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="support-promises.js"></script> +<form id="form"> + <input id="file_input" name="file_input" type="file"> +</form> +<script> + +function assert_file_metadata_equal(file1, file2) { + assert_true(file1 instanceof File); + assert_true(file2 instanceof File) + assert_equals(file1.lastModified, file2.lastModified); + assert_equals(file1.name, file2.name); + assert_equals(file1.size, file2.size); + assert_equals(file1.type, file2.type); +} + +async function assert_file_contents_equals(file1, file2) { + const file1_text = await file1.text(); + const file2_text = await file2.text(); + assert_equals(file1_text, file2_text); +} + +promise_test(async (testCase) => { + const input = document.getElementById("file_input"); + await test_driver.send_keys(input, String.raw`{{fs_path(file_to_save.txt)}}`); + assert_equals(input.files.length, 1); + + const file = input.files[0]; + + const db = await createDatabase(testCase, db => { + db.createObjectStore('objectStore'); + }); + + const txn = db.transaction(['objectStore'], 'readwrite'); + txn.objectStore('objectStore').add(file, 'key1'); + txn.objectStore('objectStore').add({file: file, other: 'data'}, 'key2'); + await promiseForTransaction(testCase, txn); + + const readTxn = db.transaction(['objectStore'], 'readonly'); + const fileByItself = await promiseForRequest( + testCase, readTxn.objectStore('objectStore').get('key1')); + const fileInDict = await promiseForRequest( + testCase, readTxn.objectStore('objectStore').get('key2')); + + assert_file_metadata_equal(fileByItself, file); + assert_file_metadata_equal(fileInDict.file, file); + assert_file_metadata_equal(fileInDict.file, fileByItself); + + await assert_file_contents_equals(fileByItself, file); + await assert_file_contents_equals(fileInDict.file, file); + + db.close(); +}, "Saves and loads back File objects from IndexedDB"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/file_to_save.txt b/third_party/blink/web_tests/external/wpt/IndexedDB/file_to_save.txt new file mode 100644 index 0000000..3f5238e8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/IndexedDB/file_to_save.txt
@@ -0,0 +1 @@ +File to save to IndexedDB. \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_tombstones.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_tombstones.any.js new file mode 100644 index 0000000..05617a3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_tombstones.any.js
@@ -0,0 +1,66 @@ +// META: title=Index Tombstones +// META: script=support-promises.js + +// This test is used to trigger a special case in Chrome with how it deals with +// index creation & modification. This had caused issues before. +// See https://crbug.com/1033996 + +async function iterateAndReturnAllCursorResult(testCase, cursorRequest) { + return new Promise((resolve, reject) => { + let results = []; + cursorRequest.onsuccess = testCase.step_func(function(event) { + const cursor = event.target.result; + if (!cursor) { + resolve(results); + return; + } + results.push(cursor.value); + cursor.continue(); + }); + cursorRequest.onerror = reject; + }); +} + +async function createTombstones(testCase, db) { + const txn1 = db.transaction(['objectStore'], 'readwrite'); + txn1.objectStore('objectStore').add({key: 'firstItem', indexedOn: 1}); + txn1.objectStore('objectStore').add({key: 'secondItem', indexedOn: 2}); + txn1.objectStore('objectStore').add({key: 'thirdItem', indexedOn: 3}); + const txn2 = db.transaction(['objectStore'], 'readwrite'); + txn2.objectStore('objectStore').put({key: 'firstItem', indexedOn: -10}); + txn2.objectStore('objectStore').put({key: 'secondItem', indexedOn: 4}); + txn2.objectStore('objectStore').put({key: 'thirdItem', indexedOn: 10}); + await promiseForTransaction(testCase, txn1); + await promiseForTransaction(testCase, txn2); +} + +async function run_test(testCase, transactionMode, direction) { + const db = await createDatabase(testCase, db => { + db.createObjectStore('objectStore', {keyPath: 'key'}) + .createIndex('index', 'indexedOn'); + }); + await createTombstones(testCase, db); + + const txn = db.transaction(['objectStore'], transactionMode); + cursor = txn.objectStore('objectStore').index('index').openCursor( + IDBKeyRange.bound(-11, 11), direction); + let results = await iterateAndReturnAllCursorResult(testCase, cursor); + assert_equals(results.length, 3); + db.close(); +} + +promise_test(async testCase => { + await run_test(testCase, 'readonly', 'next'); +}, 'Forward iteration over an index in a readonly transaction'); + +promise_test(async testCase => { + await run_test(testCase, 'readonly', 'prev'); +}, 'Backward iteration over an index in a readonly transaction'); + +promise_test(async testCase => { + await run_test(testCase, 'readwrite', 'next'); +}, 'Forward iteration over an index in a readwrite transaction'); + +promise_test(async testCase => { + await run_test(testCase, 'readwrite', 'prev'); +}, 'Backward iteration over an index in a readwrite transaction');
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001-ref.html new file mode 100644 index 0000000..6d51427 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001-ref.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html> +<head> + <title>Reference: max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { height:160px; background: yellow; } +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001.html new file mode 100644 index 0000000..acb4316 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { max-height:160px; background: yellow; } +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b-ref.html new file mode 100644 index 0000000..40ecf75 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b-ref.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> +<head> + <title>Reference: max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + height: 128px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b.html new file mode 100644 index 0000000..e24cea6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-001b.html
@@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001b-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + max-height: 128px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002.html new file mode 100644 index 0000000..75aeb62 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min/max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { min-height:120px; max-height:160px; background: yellow; } +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002b.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002b.html new file mode 100644 index 0000000..cf8cc98e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-002b.html
@@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min/max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001b-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + min-height: 112px; + max-height: 128px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003.html new file mode 100644 index 0000000..c58bad29 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min/max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { min-height:160px; max-height:110px; background: yellow; } +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003b.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003b.html new file mode 100644 index 0000000..019c290d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-max-height-003b.html
@@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min/max-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-max-height-001b-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + min-height: 128px; + max-height: 112px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:200px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001-ref.html new file mode 100644 index 0000000..492a9a1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001-ref.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html> +<head> + <title>Reference: min-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { height:200px; background: yellow; } +.columns > div > div { height:160px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001.html new file mode 100644 index 0000000..47ceff7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-min-height-001-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { min-height:200px; background: yellow; } +.columns > div > div { height:160px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b-ref.html new file mode 100644 index 0000000..46e6927 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b-ref.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> +<head> + <title>Reference: min-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + height: 172px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:150px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b.html b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b.html new file mode 100644 index 0000000..8ed26c59 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/block-min-height-001b.html
@@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: min-height block fragmentation</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1602430"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="block-min-height-001b-ref.html"> + <style> +html,body { + color:black; background-color:white; font:24px/1 monospace; padding:0; margin:0; + width: 300px; +} +.columns { + columns: 3; + background: grey; + margin-bottom: 1em; +} +.columns > div { + min-height: 172px; + background: yellow; + border: solid; + border-width:10px 0 6px 0; + padding: 5px 0 3px 0; +} +.columns > div > div { height:150px; width:50px; border:solid; } + </style> +</head> +<body> +<div class="columns"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:100px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:70px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +<div class="columns" style="height:50px"> + BEFORE + <div> + <div></div> + </div> + AFTER +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/fuzzy-ref-2.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/fuzzy-ref-2.html.ini new file mode 100644 index 0000000..0bbb2bf0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/fuzzy-ref-2.html.ini
@@ -0,0 +1,2 @@ +[fuzzy-ref-2.html] + fuzzy: maxDifference=255;100-100
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html.ini new file mode 100644 index 0000000..1e13cec --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html.ini
@@ -0,0 +1,2 @@ +[reftest_and_fail_0-ref.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html.ini new file mode 100644 index 0000000..9a00669 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html.ini
@@ -0,0 +1,2 @@ +[reftest_cycle_fail_0-ref.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_chain_ini.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html.ini similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_fuzzy_chain_ini.html.ini rename to third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html.ini
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_and_fail.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_and_fail.html.ini deleted file mode 100644 index 81aef04..0000000 --- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_and_fail.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[reftest_and_fail.html] - type: reftest - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_cycle_fail.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_cycle_fail.html.ini deleted file mode 100644 index 472b33f7..0000000 --- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_cycle_fail.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[reftest_cycle_fail.html] - type: reftest - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-0.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-0.html.ini new file mode 100644 index 0000000..f90b3d68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-0.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-0.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-1.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-1.html.ini new file mode 100644 index 0000000..eeb9fc58 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-1.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-1.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-4.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-4.html.ini new file mode 100644 index 0000000..77c7ba2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-4.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-4.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-5.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-5.html.ini new file mode 100644 index 0000000..e87acf9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-5.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-5.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-6.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-6.html.ini new file mode 100644 index 0000000..e3089dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-6.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-6.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-7.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-7.html.ini new file mode 100644 index 0000000..09162d88 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_match_and_mismatch-7.html.ini
@@ -0,0 +1,2 @@ +[reftest_match_and_mismatch-7.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-0.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-0.html.ini new file mode 100644 index 0000000..6bc0bef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-0.html.ini
@@ -0,0 +1,2 @@ +[reftest_multiple_mismatch-0.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-1.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-1.html.ini new file mode 100644 index 0000000..964858b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/reftest/reftest_multiple_mismatch-1.html.ini
@@ -0,0 +1,2 @@ +[reftest_multiple_mismatch-1.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/README.md b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/README.md new file mode 100644 index 0000000..01bb6f77 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/README.md
@@ -0,0 +1,5 @@ +This directory contains the old reftest chaining tests, based on how they worked prior to +[RFC #15](https://github.com/web-platform-tests/rfcs/blob/master/rfcs/reftest_simplification.md). + +The expectations for these match the current logic; these are included here so we have +tests that fail if any external runner is implementing this logic.
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/fuzzy-ref-2.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/fuzzy-ref-2.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/fuzzy-ref-2.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/fuzzy-ref-2.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/fuzzy-ref-2a.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/fuzzy-ref-2a.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/fuzzy-ref-2a.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/fuzzy-ref-2a.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_fail.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_fail.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_fail.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_fail.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_fail_0-ref.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html similarity index 72% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_fail_0-ref.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html index 04fb9aa1..565f663e 100644 --- a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_fail_0-ref.html +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html
@@ -1,5 +1,5 @@ <title>Reftest chain that should fail</title> -<link rel=match href=red.html> +<link rel=match href=../red.html> <style> :root {background-color:green} -</style> \ No newline at end of file +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch_0.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch_0.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch_0.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch_0.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch_1.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch_1.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_and_mismatch_1.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_and_mismatch_1.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_0-ref.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_0-ref.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_0-ref.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_0-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_1-ref.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_1-ref.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_1-ref.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_1-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_fail.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_fail.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_fail.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_fail.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_fail_0-ref.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_cycle_fail_0-ref.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_fuzzy_chain_ini.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_fuzzy_chain_ini.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html new file mode 100644 index 0000000..9f52615 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-0.html
@@ -0,0 +1,6 @@ +<title>AND match/mismatch that should fail</title> +<link rel=match href=red.html> +<link rel=mismatch href=red.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html new file mode 100644 index 0000000..1bba49ea0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-1.html
@@ -0,0 +1,6 @@ +<title>AND match/mismatch that should fail</title> +<link rel=mismatch href=red.html> +<link rel=match href=red.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-2.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-2.html new file mode 100644 index 0000000..60141ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-2.html
@@ -0,0 +1,7 @@ +<title>OR match AND mismatch that should pass</title> +<link rel=match href=red.html> +<link rel=match href=green.html> +<link rel=mismatch href=red.html?2> +<style> +:root {background-color:green} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-3.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-3.html new file mode 100644 index 0000000..f707c1b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-3.html
@@ -0,0 +1,7 @@ +<title>OR match AND mismatch that should pass</title> +<link rel=mismatch href=red.html> +<link rel=match href=green.html> +<link rel=match href=red.html?2> +<style> +:root {background-color:green} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html new file mode 100644 index 0000000..ac08cb7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-4.html
@@ -0,0 +1,7 @@ +<title>OR match AND mismatch that should fail</title> +<link rel=match href=green.html> +<link rel=match href=red.html> +<link rel=mismatch href=red.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html new file mode 100644 index 0000000..b30d84a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-5.html
@@ -0,0 +1,7 @@ +<title>OR match AND mismatch that should fail</title> +<link rel=match href=red.html> +<link rel=match href=green.html> +<link rel=mismatch href=red.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html new file mode 100644 index 0000000..1a2dcc2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-6.html
@@ -0,0 +1,8 @@ +<title>OR match AND mismatch that should fail</title> +<link rel=match href=green.html> +<link rel=match href=red.html> +<link rel=mismatch href=green.html?2> +<link rel=mismatch href=red.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html new file mode 100644 index 0000000..073e2206 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_match_and_mismatch-7.html
@@ -0,0 +1,8 @@ +<title>OR match AND mismatch that should fail</title> +<link rel=match href=green.html> +<link rel=match href=red.html> +<link rel=mismatch href=red.html?2> +<link rel=mismatch href=green.html?2> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_or_0.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_match-0.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_or_0.html rename to third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_match-0.html
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_match-1.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_match-1.html new file mode 100644 index 0000000..9a8b769 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_match-1.html
@@ -0,0 +1,6 @@ +<title>OR match that should pass</title> +<link rel=match href=green.html> +<link rel=match href=red.html> +<style> +:root {background-color:green} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html new file mode 100644 index 0000000..b0115a75 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-0.html
@@ -0,0 +1,6 @@ +<title>AND mismatch that should fail</title> +<link rel=mismatch href=green.html> +<link rel=mismatch href=red.html> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html new file mode 100644 index 0000000..65ddd343 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/reftest/reftest_multiple_mismatch-1.html
@@ -0,0 +1,6 @@ +<title>AND mismatch that should fail</title> +<link rel=mismatch href=red.html> +<link rel=mismatch href=green.html> +<style> +:root {background-color:red} +</style>
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/item.py b/third_party/blink/web_tests/external/wpt/tools/manifest/item.py index 1c4034ad..fd3564b 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/item.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/item.py
@@ -1,4 +1,3 @@ -from copy import copy from inspect import isabstract from six import iteritems, with_metaclass from six.moves.urllib.parse import urljoin, urlparse @@ -196,9 +195,11 @@ return rv -class RefTestBase(URLManifestItem): +class RefTest(URLManifestItem): __slots__ = ("references",) + item_type = "reftest" + def __init__(self, tests_root, # type: Text path, # type: Text @@ -207,7 +208,7 @@ references=None, # type: Optional[List[Tuple[Text, Text]]] **extras # type: Any ): - super(RefTestBase, self).__init__(tests_root, path, url_base, url, **extras) + super(RefTest, self).__init__(tests_root, path, url_base, url, **extras) if references is None: self.references = [] # type: List[Tuple[Text, Text]] else: @@ -266,7 +267,7 @@ path, # type: Text obj # type: Tuple[Text, List[Tuple[Text, Text]], Dict[Any, Any]] ): - # type: (...) -> RefTestBase + # type: (...) -> RefTest tests_root = manifest.tests_root assert tests_root is not None path = to_os_path(path) @@ -278,38 +279,6 @@ references, **extras) - def to_RefTest(self): - # type: () -> RefTest - if type(self) == RefTest: - assert isinstance(self, RefTest) - return self - rv = copy(self) - rv.__class__ = RefTest - assert isinstance(rv, RefTest) - return rv - - def to_RefTestNode(self): - # type: () -> RefTestNode - if type(self) == RefTestNode: - assert isinstance(self, RefTestNode) - return self - rv = copy(self) - rv.__class__ = RefTestNode - assert isinstance(rv, RefTestNode) - return rv - - -class RefTestNode(RefTestBase): - __slots__ = () - - item_type = "reftest_node" - - -class RefTest(RefTestBase): - __slots__ = () - - item_type = "reftest" - class ManualTest(URLManifestItem): __slots__ = ()
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py index 2ad7fccf..bfac309 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
@@ -1,12 +1,11 @@ -import itertools import json import os -from collections import MutableMapping, defaultdict +from collections import MutableMapping from six import iteritems, iterkeys, itervalues, string_types, binary_type, text_type from . import vcs -from .item import (ConformanceCheckerTest, ManifestItem, ManualTest, RefTest, RefTestNode, - SupportFile, TestharnessTest, VisualTest, WebDriverSpecTest, CrashTest) +from .item import (ConformanceCheckerTest, ManifestItem, ManualTest, RefTest, SupportFile, + TestharnessTest, VisualTest, WebDriverSpecTest, CrashTest) from .log import get_logger from .sourcefile import SourceFile from .utils import from_os_path, to_os_path @@ -28,7 +27,6 @@ from typing import Tuple from typing import Type from typing import Union - from typing import cast try: import ujson @@ -49,7 +47,6 @@ item_classes = {"testharness": TestharnessTest, "reftest": RefTest, - "reftest_node": RefTestNode, "crashtest": CrashTest, "manual": ManualTest, "wdspec": WebDriverSpecTest, @@ -247,7 +244,6 @@ assert url_base is not None self._path_hash = {} # type: Dict[Text, Tuple[Text, Text]] self._data = ManifestData(self) # type: ManifestData - self._reftest_nodes_by_url = None # type: Optional[Dict[Text, Union[RefTest, RefTestNode]]] self.tests_root = tests_root # type: Optional[str] self.url_base = url_base # type: Text @@ -280,23 +276,6 @@ for test in tests: yield test - @property - def reftest_nodes_by_url(self): - # type: () -> Dict[Text, Union[RefTest, RefTestNode]] - if self._reftest_nodes_by_url is None: - by_url = {} - for path, nodes in itertools.chain(iteritems(self._data["reftest"]), - iteritems(self._data["reftest_node"])): - for node in nodes: - assert isinstance(node, (RefTest, RefTestNode)) - by_url[node.url] = node - self._reftest_nodes_by_url = by_url - return self._reftest_nodes_by_url - - def get_reference(self, url): - # type: (Text) -> Optional[ManifestItem] - return self.reftest_nodes_by_url.get(url) - def update(self, tree): # type: (Iterable[Tuple[Union[SourceFile, bytes], bool]]) -> bool """Update the manifest given an iterable of items that make up the updated manifest. @@ -306,11 +285,9 @@ unusual API is designed as an optimistaion meaning that SourceFile items need not be constructed in the case we are not updating a path, but the absence of an item from the iterator may be used to remove defunct entries from the manifest.""" - all_reftest_nodes = [] # type: List[Tuple[ManifestItem, Text]] seen_files = set() # type: Set[Text] changed = False - reftest_changes = False # Create local variable references to these dicts so we avoid the # attribute access in the hot loop below @@ -319,8 +296,6 @@ prev_files = data.paths() # type: Set[Text] - reftest_types = ("reftest", "reftest_node") - for source_file, update in tree: if not update: assert isinstance(source_file, (binary_type, text_type)) @@ -328,9 +303,6 @@ seen_files.add(rel_path) assert rel_path in path_hash old_hash, old_type = path_hash[rel_path] # type: Tuple[Text, Text] - if old_type in reftest_types: - manifest_items = data[old_type][rel_path] # type: Iterable[ManifestItem] - all_reftest_nodes.extend((item, old_hash) for item in manifest_items) else: assert not isinstance(source_file, bytes) rel_path = source_file.rel_path @@ -344,28 +316,14 @@ if not is_new: old_hash, old_type = path_hash[rel_path] if old_hash != file_hash: - new_type, manifest_items = source_file.manifest_items() hash_changed = True - if new_type != old_type: - del data[old_type][rel_path] - if old_type in reftest_types: - reftest_changes = True - else: - new_type = old_type - if old_type in reftest_types: - manifest_items = data[old_type][rel_path] - else: - new_type, manifest_items = source_file.manifest_items() - - if new_type in reftest_types: - all_reftest_nodes.extend((item, file_hash) for item in manifest_items) - if is_new or hash_changed: - reftest_changes = True - elif is_new or hash_changed: - data[new_type][rel_path] = set(manifest_items) if is_new or hash_changed: + new_type, manifest_items = source_file.manifest_items() + data[new_type][rel_path] = set(manifest_items) path_hash[rel_path] = (file_hash, new_type) + if hash_changed and new_type != old_type: + del data[old_type][rel_path] changed = True deleted = prev_files - seen_files @@ -374,8 +332,6 @@ for rel_path in deleted: if rel_path in path_hash: _, old_type = path_hash[rel_path] - if old_type in reftest_types: - reftest_changes = True del path_hash[rel_path] try: del data[old_type][rel_path] @@ -386,65 +342,8 @@ if rel_path in test_data: del test_data[rel_path] - if reftest_changes: - reftests, reftest_nodes, changed_hashes = self._compute_reftests(all_reftest_nodes) - reftest_data = data["reftest"] - reftest_data.clear() - for path, items in iteritems(reftests): - if MYPY: - reftest_data[path] = cast(Set[ManifestItem], items) - else: - reftest_data[path] = items - - reftest_node_data = data["reftest_node"] - reftest_node_data.clear() - for node_path, node_items in iteritems(reftest_nodes): - if MYPY: - reftest_node_data[node_path] = cast(Set[ManifestItem], node_items) - else: - reftest_node_data[node_path] = node_items - - path_hash.update(changed_hashes) - return changed - def _compute_reftests(self, - reftest_nodes # type: List[Tuple[ManifestItem, Text]] - ): - # type: (...) -> Tuple[Dict[Text, Set[RefTest]], Dict[Text, Set[RefTestNode]], Dict[Text, Tuple[Text, Text]]] - self._reftest_nodes_by_url = {} - has_inbound = set() - for item, _ in reftest_nodes: - assert isinstance(item, (RefTestNode, RefTest)) - for ref_url, ref_type in item.references: - has_inbound.add(ref_url) - - reftests = defaultdict(set) # type: Dict[Text, Set[RefTest]] - references = defaultdict(set) # type: Dict[Text, Set[RefTestNode]] - changed_hashes = {} # type: Dict[Text, Tuple[Text, Text]] - - for item, file_hash in reftest_nodes: - assert isinstance(item, (RefTestNode, RefTest)) - if item.url in has_inbound: - # This is a reference - if isinstance(item, RefTest): - item = item.to_RefTestNode() - changed_hashes[item.path] = (file_hash, - item.item_type) - assert isinstance(item, RefTestNode) - references[item.path].add(item) - else: - if isinstance(item, RefTestNode): - item = item.to_RefTest() - changed_hashes[item.path] = (file_hash, - item.item_type) - assert isinstance(item, RefTest) - reftests[item.path].add(item) - assert isinstance(item, (RefTestNode, RefTest)) - self._reftest_nodes_by_url[item.url] = item - - return reftests, references, changed_hashes - def to_json(self): # type: () -> Dict[Text, Any] out_items = { @@ -470,7 +369,28 @@ self._path_hash = {to_os_path(k): v for k, v in iteritems(obj["paths"])} + # merge reftest_node and reftest + # TODO(MANIFESTv8): remove this condition + if "reftest_node" in obj["items"]: + for path in obj["items"]["reftest_node"]: + os_path = to_os_path(path) + old_hash, old_type = self._path_hash[os_path] + self._path_hash[os_path] = (old_hash, "reftest") + for test_type, type_paths in iteritems(obj["items"]): + # merge reftest_node and reftest + # TODO(MANIFESTv8): remove this condition + if test_type in ("reftest", "reftest_node"): + if types and "reftest" not in types: + continue + + if self._data["reftest"].json_data: + self._data["reftest"].json_data.update(type_paths) + else: + self._data["reftest"].set_json(tests_root, type_paths) + + continue + if test_type not in item_classes: raise ManifestError
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py b/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py index b9dcc8f5..800d1f9 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py
@@ -33,7 +33,7 @@ import html5lib from . import XMLParser -from .item import (ManifestItem, ManualTest, WebDriverSpecTest, RefTestNode, TestharnessTest, +from .item import (ManifestItem, ManualTest, WebDriverSpecTest, RefTest, TestharnessTest, SupportFile, CrashTest, ConformanceCheckerTest, VisualTest) from .utils import ContextManagerBytesIO, cached_property @@ -923,8 +923,8 @@ )) elif self.content_is_ref_node: - rv = RefTestNode.item_type, [ - RefTestNode( + rv = RefTest.item_type, [ + RefTest( self.tests_root, self.rel_path, self.url_base,
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py index 1d14f4e..67b5758 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
@@ -423,6 +423,17 @@ class ReftestTest(Test): + """A reftest + + A reftest should be considered to pass if one of its references matches (see below) *and* the + reference passes if it has any references recursively. + + Attributes: + references (List[Tuple[str, str]]): a list of alternate references, where one must match for the test to pass + viewport_size (Optional[Tuple[int, int]]): size of the viewport for this test, if not default + dpi (Optional[int]): dpi to use when rendering this test, if not default + + """ result_cls = ReftestResult test_type = "reftest" @@ -445,17 +456,10 @@ manifest_file, manifest_test, inherit_metadata, - test_metadata, - nodes=None, - references_seen=None): + test_metadata): timeout = cls.long_timeout if manifest_test.timeout == "long" else cls.default_timeout - if nodes is None: - nodes = {} - if references_seen is None: - references_seen = set() - url = manifest_test.url node = cls(manifest_file.tests_root, @@ -470,38 +474,56 @@ protocol="https" if hasattr(manifest_test, "https") and manifest_test.https else "http", fuzzy=manifest_test.fuzzy) - nodes[url] = node + refs_by_type = defaultdict(list) for ref_url, ref_type in manifest_test.references: - comparison_key = (ref_type,) + tuple(sorted([url, ref_url])) - if ref_url in nodes: - manifest_node = ref_url - if comparison_key in references_seen: - # We have reached a cycle so stop here - # Note that just seeing a node for the second time is not - # enough to detect a cycle because - # A != B != C != A must include C != A - # but A == B == A should not include the redundant B == A. - continue + refs_by_type[ref_type].append(ref_url) - references_seen.add(comparison_key) - - manifest_node = manifest_file.get_reference(ref_url) - if manifest_node: - reference = ReftestTest.from_manifest(manifest_file, - manifest_node, - [], - None, - nodes, - references_seen) - else: - reference = ReftestTest(manifest_file.tests_root, - ref_url, + # Construct a list of all the mismatches, where we end up with mismatch_1 != url != + # mismatch_2 != url != mismatch_3 etc. + # + # Per the logic documented above, this means that none of the mismatches provided match, + mismatch_walk = None + if refs_by_type["!="]: + mismatch_walk = ReftestTest(manifest_file.tests_root, + refs_by_type["!="][0], [], None, []) + cmp_ref = mismatch_walk + for ref_url in refs_by_type["!="][1:]: + cmp_self = ReftestTest(manifest_file.tests_root, + url, + [], + None, + []) + cmp_ref.references.append((cmp_self, "!=")) + cmp_ref = ReftestTest(manifest_file.tests_root, + ref_url, + [], + None, + []) + cmp_self.references.append((cmp_ref, "!=")) - node.references.append((reference, ref_type)) + if mismatch_walk is None: + mismatch_refs = [] + else: + mismatch_refs = [(mismatch_walk, "!=")] + + if refs_by_type["=="]: + # For each == ref, add a reference to this node whose tail is the mismatch list. + # Per the logic documented above, this means any one of the matches must pass plus all the mismatches. + for ref_url in refs_by_type["=="]: + ref = ReftestTest(manifest_file.tests_root, + ref_url, + [], + None, + mismatch_refs) + node.references.append((ref, "==")) + else: + # Otherwise, we just add the mismatches directly as we are immediately into the + # mismatch chain with no alternates. + node.references.extend(mismatch_refs) return node
diff --git a/third_party/blink/web_tests/fast/loader/fragment-anchor-cleared-after-load-when-hidden.html b/third_party/blink/web_tests/fast/loader/fragment-anchor-cleared-after-load-when-hidden.html index d9c28d2..a9cd384 100644 --- a/third_party/blink/web_tests/fast/loader/fragment-anchor-cleared-after-load-when-hidden.html +++ b/third_party/blink/web_tests/fast/loader/fragment-anchor-cleared-after-load-when-hidden.html
@@ -28,13 +28,15 @@ if (location.hash != '#foo') return; - anchor.style.display = 'block'; runAfterLayoutAndPaint(function() { - shouldBe("scrollY", "0"); + anchor.style.display = 'block'; + runAfterLayoutAndPaint(function() { + shouldBe("scrollY", "0"); - location.hash = "#"; - anchor.style.display = 'none'; - finishJSTest(); + location.hash = "#"; + anchor.style.display = 'none'; + finishJSTest(); + }); }); }; @@ -44,4 +46,4 @@ }); }; -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-a11y-test-expected.txt similarity index 100% rename from third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console-a11y-test-expected.txt rename to third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-a11y-test-expected.txt
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-a11y-test.js similarity index 100% rename from third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console-a11y-test.js rename to third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-a11y-test.js
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test-expected.txt new file mode 100644 index 0000000..d4398902 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test-expected.txt
@@ -0,0 +1,8 @@ +Tests accessibility of console containing an error message using the axe-core linter. +invalidVar123 +VM:1 Uncaught ReferenceError: invalidVar123 is not defined + at <anonymous>:1:1 +(anonymous) @ VM:1 +aXe violations: [] + +
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test.js new file mode 100644 index 0000000..3c229a3 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/console/console-error-a11y-test.js
@@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function() { + await TestRunner.loadModule('axe_core_test_runner'); + TestRunner.addResult( + 'Tests accessibility of console containing an error message using the axe-core linter.'); + + await TestRunner.loadModule('console_test_runner'); + await TestRunner.showPanel('console'); + const widget = await UI.viewManager.view('console').widget(); + + async function callback() { + ConsoleTestRunner.dumpConsoleMessages(); + await AxeCoreTestRunner.runValidation(widget.element); + TestRunner.completeTest(); + } + + ConsoleTestRunner.evaluateInConsole('invalidVar123', callback); +})();
diff --git a/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.md b/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.md new file mode 100644 index 0000000..8c90946 --- /dev/null +++ b/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.md
@@ -0,0 +1,3 @@ +This directory contains tests run with the Form Controls Refresh +(chrome://flags/#form-controls-refresh) feature disabled. +
diff --git a/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.txt b/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.txt new file mode 100644 index 0000000..8c90946 --- /dev/null +++ b/third_party/blink/web_tests/virtual/form-controls-refresh-disabled/README.txt
@@ -0,0 +1,3 @@ +This directory contains tests run with the Form Controls Refresh +(chrome://flags/#form-controls-refresh) feature disabled. +
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn index bc4805cc..19c15df1 100644 --- a/third_party/harfbuzz-ng/BUILD.gn +++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/buildflags_paint_preview.gni") import("//build/config/chrome_build.gni") import("//build/config/features.gni") import("//build/config/freetype/freetype.gni") import("//build/config/ui.gni") -import("//components/paint_preview/buildflags/buildflags.gni") import("//testing/libfuzzer/fuzzer_test.gni") import("//third_party/harfbuzz-ng/harfbuzz.gni")
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn index 5f88733..ed57899 100644 --- a/third_party/zlib/BUILD.gn +++ b/third_party/zlib/BUILD.gn
@@ -26,9 +26,20 @@ use_x86_x64_optimizations = (current_cpu == "x86" || current_cpu == "x64") && !is_ios +if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { + # Apparently android_cronet bot builds with NEON disabled and + # we also should disable optimizations for iOS@x86 (a.k.a. simulator). + defines = [ "CPU_NO_SIMD" ] +} + config("zlib_adler32_simd_config") { if (use_x86_x64_optimizations) { defines = [ "ADLER32_SIMD_SSSE3" ] + if (is_win) { + defines += [ "X86_WINDOWS" ] + } else { + defines += [ "X86_NOT_WINDOWS" ] + } } if (use_arm_neon_optimizations) { @@ -94,24 +105,13 @@ if (!is_ios) { include_dirs = [ "." ] - if (is_android) { - import("//build/config/android/config.gni") - if (defined(android_ndk_root) && android_ndk_root != "") { - deps = [ - "//third_party/android_ndk:cpu_features", - ] - } else { - assert(false, "CPU detection requires the Android NDK") - } - } else if (!is_win && !is_clang) { + if (!is_win && !is_clang) { assert(!use_thin_lto, "ThinLTO fails mixing different module-level targets") cflags_c = [ "-march=armv8-a+crc" ] } sources = [ - "arm_features.c", - "arm_features.h", "crc32_simd.c", "crc32_simd.h", ] @@ -218,10 +218,6 @@ "-mpclmul", ] } - } else { - sources = [ - "simd_stub.c", - ] } configs -= [ "//build/config/compiler:chromium_code" ] @@ -248,6 +244,8 @@ "chromeconf.h", "compress.c", "contrib/optimizations/insert_string.h", + "cpu_features.c", + "cpu_features.h", "crc32.c", "crc32.h", "deflate.c", @@ -267,7 +265,6 @@ "trees.c", "trees.h", "uncompr.c", - "x86.h", "zconf.h", "zlib.h", "zutil.c", @@ -284,7 +281,6 @@ ] if (use_x86_x64_optimizations) { - sources += [ "x86.c" ] deps += [ ":zlib_crc32_simd" ] } else if (use_arm_neon_optimizations) { sources += [ "contrib/optimizations/slide_hash_neon.h" ] @@ -294,6 +290,15 @@ sources += [ "inflate.c" ] } + if (is_android) { + import("//build/config/android/config.gni") + if (defined(android_ndk_root) && android_ndk_root != "") { + deps += [ "//third_party/android_ndk:cpu_features" ] + } else { + assert(false, "CPU detection requires the Android NDK") + } + } + configs -= [ "//build/config/compiler:chromium_code" ] configs += [ ":zlib_internal_config", @@ -319,6 +324,7 @@ } static_library("minizip") { + defines = [] sources = [ "contrib/minizip/ioapi.c", "contrib/minizip/ioapi.h", @@ -340,7 +346,7 @@ if (is_mac || is_ios || is_android || is_nacl) { # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We # use fopen, ftell, and fseek instead on these systems. - defines = [ "USE_FILE32API" ] + defines += [ "USE_FILE32API" ] } deps = [
diff --git a/third_party/zlib/adler32.c b/third_party/zlib/adler32.c index a42f35fc..696773a 100644 --- a/third_party/zlib/adler32.c +++ b/third_party/zlib/adler32.c
@@ -59,10 +59,8 @@ # define MOD63(a) a %= BASE #endif -#if defined(ADLER32_SIMD_SSSE3) -#include "adler32_simd.h" -#include "x86.h" -#elif defined(ADLER32_SIMD_NEON) +#include "cpu_features.h" +#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON) #include "adler32_simd.h" #endif @@ -108,7 +106,7 @@ */ if (buf == Z_NULL) { if (!len) /* Assume user is calling adler32(0, NULL, 0); */ - x86_check_features(); + cpu_check_features(); return 1L; } #else
diff --git a/third_party/zlib/arm_features.h b/third_party/zlib/arm_features.h deleted file mode 100644 index 09fec25..0000000 --- a/third_party/zlib/arm_features.h +++ /dev/null
@@ -1,13 +0,0 @@ -/* arm_features.h -- ARM processor features detection. - * - * Copyright 2018 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the Chromium source repository LICENSE file. - */ - -#include "zlib.h" - -extern int arm_cpu_enable_crc32; -extern int arm_cpu_enable_pmull; - -void arm_check_features(void);
diff --git a/third_party/zlib/contrib/optimizations/insert_string.h b/third_party/zlib/contrib/optimizations/insert_string.h index 69eee3d..1826601 100644 --- a/third_party/zlib/contrib/optimizations/insert_string.h +++ b/third_party/zlib/contrib/optimizations/insert_string.h
@@ -10,6 +10,7 @@ #define INLINE inline #endif +#include "cpu_features.h" /* Optimized insert_string block */ #if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32) #define TARGET_CPU_WITH_CRC @@ -25,7 +26,6 @@ #define _cpu_crc32_u32 _mm_crc32_u32 #elif defined(CRC32_ARMV8_CRC32) - #include "arm_features.h" #if defined(__clang__) #undef TARGET_CPU_WITH_CRC #define __crc32cw __builtin_arm_crc32cw
diff --git a/third_party/zlib/arm_features.c b/third_party/zlib/cpu_features.c similarity index 61% rename from third_party/zlib/arm_features.c rename to third_party/zlib/cpu_features.c index f5641c3..731126a3 100644 --- a/third_party/zlib/arm_features.c +++ b/third_party/zlib/cpu_features.c
@@ -1,16 +1,26 @@ -/* arm_features.c -- ARM processor features detection. +/* cpu_features.c -- Processor features detection. * * Copyright 2018 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the Chromium source repository LICENSE file. */ -#include "arm_features.h" +#include "cpu_features.h" #include "zutil.h" -#include <stdint.h> +#include <stdint.h> +#if defined(_MSC_VER) +#include <intrin.h> +#elif defined(ADLER32_SIMD_SSSE3) +#include <cpuid.h> +#endif + +/* TODO(cavalcantii): remove checks for x86_flags on deflate. + */ int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0; int ZLIB_INTERNAL arm_cpu_enable_pmull = 0; +int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0; +int ZLIB_INTERNAL x86_cpu_enable_simd = 0; #if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) #include <pthread.h> @@ -25,39 +35,44 @@ #include <zircon/features.h> #include <zircon/syscalls.h> #include <zircon/types.h> -#elif defined(ARMV8_OS_WINDOWS) +#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS) #include <windows.h> +#elif !defined(_MSC_VER) +#include <pthread.h> #else -#error arm_features.c ARM feature detection in not defined for your platform +#error cpu_features.c CPU feature detection in not defined for your platform #endif -static void _arm_check_features(void); +#ifndef CPU_NO_SIMD +static void _cpu_check_features(void); +#endif -#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) +#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS) static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; -void ZLIB_INTERNAL arm_check_features(void) +void ZLIB_INTERNAL cpu_check_features(void) { - pthread_once(&cpu_check_inited_once, _arm_check_features); + pthread_once(&cpu_check_inited_once, _cpu_check_features); } -#elif defined(ARMV8_OS_WINDOWS) +#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS) static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; -static BOOL CALLBACK _arm_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context) +static BOOL CALLBACK _cpu_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context) { - _arm_check_features(); + _cpu_check_features(); return TRUE; } -void ZLIB_INTERNAL arm_check_features(void) +void ZLIB_INTERNAL cpu_check_features(void) { - InitOnceExecuteOnce(&cpu_check_inited_once, _arm_check_features_forwarder, + InitOnceExecuteOnce(&cpu_check_inited_once, _cpu_check_features_forwarder, NULL, NULL); } #endif +#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) /* * See http://bit.ly/2CcoEsr for run-time detection of ARM features and also * crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox. */ -static void _arm_check_features(void) +static void _cpu_check_features(void) { #if defined(ARMV8_OS_ANDROID) && defined(__aarch64__) uint64_t features = android_getCpuFeatures(); @@ -88,3 +103,32 @@ arm_cpu_enable_pmull = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE); #endif } + +#elif defined(X86_NOT_WINDOWS) || defined(X86_WINDOWS) +/* On x86 we simply use a instruction to check the CPU features. + * (i.e. CPUID). + */ +static void _cpu_check_features(void) +{ + int x86_cpu_has_sse2; + int x86_cpu_has_ssse3; + int x86_cpu_has_sse42; + int x86_cpu_has_pclmulqdq; + int abcd[4]; +#ifdef _MSC_VER + __cpuid(abcd, 1); +#else + __cpuid(1, abcd[0], abcd[1], abcd[2], abcd[3]); +#endif + x86_cpu_has_sse2 = abcd[3] & 0x4000000; + x86_cpu_has_ssse3 = abcd[2] & 0x000200; + x86_cpu_has_sse42 = abcd[2] & 0x100000; + x86_cpu_has_pclmulqdq = abcd[2] & 0x2; + + x86_cpu_enable_ssse3 = x86_cpu_has_ssse3; + + x86_cpu_enable_simd = x86_cpu_has_sse2 && + x86_cpu_has_sse42 && + x86_cpu_has_pclmulqdq; +} +#endif
diff --git a/third_party/zlib/cpu_features.h b/third_party/zlib/cpu_features.h new file mode 100644 index 0000000..2a4a7973 --- /dev/null +++ b/third_party/zlib/cpu_features.h
@@ -0,0 +1,17 @@ +/* cpu_features.h -- Processor features detection. + * + * Copyright 2018 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include "zlib.h" + +/* TODO(cavalcantii): remove checks for x86_flags on deflate. + */ +extern int arm_cpu_enable_crc32; +extern int arm_cpu_enable_pmull; +extern int x86_cpu_enable_ssse3; +extern int x86_cpu_enable_simd; + +void cpu_check_features(void);
diff --git a/third_party/zlib/crc32.c b/third_party/zlib/crc32.c index e95b908..bd696470 100644 --- a/third_party/zlib/crc32.c +++ b/third_party/zlib/crc32.c
@@ -29,13 +29,10 @@ #endif /* MAKECRCH */ #include "deflate.h" -#include "x86.h" +#include "cpu_features.h" #include "zutil.h" /* for STDC and FAR definitions */ -#if defined(CRC32_SIMD_SSE42_PCLMUL) -#include "crc32_simd.h" -#elif defined(CRC32_ARMV8_CRC32) -#include "arm_features.h" +#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32) #include "crc32_simd.h" #endif @@ -226,7 +223,7 @@ */ if (buf == Z_NULL) { if (!len) /* Assume user is calling crc32(0, NULL, 0); */ - x86_check_features(); + cpu_check_features(); return 0UL; } @@ -289,7 +286,7 @@ */ if (buf == Z_NULL) { if (!len) /* Assume user is calling crc32(0, NULL, 0); */ - arm_check_features(); + cpu_check_features(); return 0UL; } @@ -500,25 +497,31 @@ ZLIB_INTERNAL void crc_reset(deflate_state *const s) { +#ifdef ADLER32_SIMD_SSSE3 if (x86_cpu_enable_simd) { crc_fold_init(s); return; } +#endif s->strm->adler = crc32(0L, Z_NULL, 0); } ZLIB_INTERNAL void crc_finalize(deflate_state *const s) { +#ifdef ADLER32_SIMD_SSSE3 if (x86_cpu_enable_simd) s->strm->adler = crc_fold_512to32(s); +#endif } ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size) { +#ifdef ADLER32_SIMD_SSSE3 if (x86_cpu_enable_simd) { crc_fold_copy(strm->state, dst, strm->next_in, size); return; } +#endif zmemcpy(dst, strm->next_in, size); strm->adler = crc32(strm->adler, dst, size); }
diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c index 201254a..a39e627 100644 --- a/third_party/zlib/deflate.c +++ b/third_party/zlib/deflate.c
@@ -50,7 +50,7 @@ /* @(#) $Id$ */ #include <assert.h> #include "deflate.h" -#include "x86.h" +#include "cpu_features.h" #include "contrib/optimizations/insert_string.h" #if (defined(__ARM_NEON__) || defined(__ARM_NEON)) @@ -244,10 +244,8 @@ // for all wrapper formats (e.g. RAW, ZLIB, GZIP). // Feature detection is not triggered while using RAW mode (i.e. we never // call crc32() with a NULL buffer). -#if defined(CRC32_ARMV8_CRC32) - arm_check_features(); -#elif defined(CRC32_SIMD_SSE42_PCLMUL) - x86_check_features(); +#if defined(CRC32_ARMV8_CRC32) || defined(CRC32_SIMD_SSE42_PCLMUL) + cpu_check_features(); #endif if (version == Z_NULL || version[0] != my_version[0] || @@ -1519,11 +1517,12 @@ local void fill_window(deflate_state *s) { +#ifdef ADLER32_SIMD_SSSE3 if (x86_cpu_enable_simd) { fill_window_sse(s); return; } - +#endif fill_window_c(s); }
diff --git a/third_party/zlib/simd_stub.c b/third_party/zlib/simd_stub.c deleted file mode 100644 index c6d4605..0000000 --- a/third_party/zlib/simd_stub.c +++ /dev/null
@@ -1,35 +0,0 @@ -/* simd_stub.c -- stub implementations -* Copyright (C) 2014 Intel Corporation -* For conditions of distribution and use, see copyright notice in zlib.h -*/ -#include <assert.h> - -#include "deflate.h" -#include "x86.h" - -int ZLIB_INTERNAL x86_cpu_enable_simd = 0; - -void ZLIB_INTERNAL crc_fold_init(deflate_state *const s) { - assert(0); -} - -void ZLIB_INTERNAL crc_fold_copy(deflate_state *const s, - unsigned char *dst, - const unsigned char *src, - long len) { - assert(0); -} - -unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) { - assert(0); - return 0; -} - -void ZLIB_INTERNAL fill_window_sse(deflate_state *s) -{ - assert(0); -} - -void x86_check_features(void) -{ -}
diff --git a/third_party/zlib/x86.c b/third_party/zlib/x86.c deleted file mode 100644 index 7488ad0..0000000 --- a/third_party/zlib/x86.c +++ /dev/null
@@ -1,101 +0,0 @@ -/* - * x86 feature check - * - * Copyright (C) 2013 Intel Corporation. All rights reserved. - * Author: - * Jim Kukunas - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "x86.h" -#include "zutil.h" - -int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0; -int ZLIB_INTERNAL x86_cpu_enable_simd = 0; - -#ifndef _MSC_VER -#include <pthread.h> - -pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; -static void _x86_check_features(void); - -void x86_check_features(void) -{ - pthread_once(&cpu_check_inited_once, _x86_check_features); -} - -static void _x86_check_features(void) -{ - int x86_cpu_has_sse2; - int x86_cpu_has_ssse3; - int x86_cpu_has_sse42; - int x86_cpu_has_pclmulqdq; - unsigned eax, ebx, ecx, edx; - - eax = 1; -#ifdef __i386__ - __asm__ __volatile__ ( - "xchg %%ebx, %1\n\t" - "cpuid\n\t" - "xchg %1, %%ebx\n\t" - : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) - ); -#else - __asm__ __volatile__ ( - "cpuid\n\t" - : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - ); -#endif /* (__i386__) */ - - x86_cpu_has_sse2 = edx & 0x4000000; - x86_cpu_has_ssse3 = ecx & 0x000200; - x86_cpu_has_sse42 = ecx & 0x100000; - x86_cpu_has_pclmulqdq = ecx & 0x2; - - x86_cpu_enable_ssse3 = x86_cpu_has_ssse3; - - x86_cpu_enable_simd = x86_cpu_has_sse2 && - x86_cpu_has_sse42 && - x86_cpu_has_pclmulqdq; -} -#else -#include <intrin.h> -#include <windows.h> - -static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, - PVOID param, - PVOID *context); -static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; - -void x86_check_features(void) -{ - InitOnceExecuteOnce(&cpu_check_inited_once, _x86_check_features, - NULL, NULL); -} - -static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, - PVOID param, - PVOID *context) -{ - int x86_cpu_has_sse2; - int x86_cpu_has_ssse3; - int x86_cpu_has_sse42; - int x86_cpu_has_pclmulqdq; - int regs[4]; - - __cpuid(regs, 1); - - x86_cpu_has_sse2 = regs[3] & 0x4000000; - x86_cpu_has_ssse3 = regs[2] & 0x000200; - x86_cpu_has_sse42 = regs[2] & 0x100000; - x86_cpu_has_pclmulqdq = regs[2] & 0x2; - - x86_cpu_enable_ssse3 = x86_cpu_has_ssse3; - - x86_cpu_enable_simd = x86_cpu_has_sse2 && - x86_cpu_has_sse42 && - x86_cpu_has_pclmulqdq; - return TRUE; -} -#endif /* _MSC_VER */
diff --git a/third_party/zlib/x86.h b/third_party/zlib/x86.h deleted file mode 100644 index 7205d50..0000000 --- a/third_party/zlib/x86.h +++ /dev/null
@@ -1,16 +0,0 @@ -/* x86.h -- check for x86 CPU features -* Copyright (C) 2013 Intel Corporation Jim Kukunas -* For conditions of distribution and use, see copyright notice in zlib.h -*/ - -#ifndef X86_H -#define X86_H - -#include "zlib.h" - -extern int x86_cpu_enable_ssse3; -extern int x86_cpu_enable_simd; - -void x86_check_features(void); - -#endif /* X86_H */
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids index 7658bd7..af27d6cc 100644 --- a/tools/gritsettings/resource_ids +++ b/tools/gritsettings/resource_ids
@@ -152,44 +152,44 @@ "includes": [10470], }, "chrome/browser/resources/history/history_resources.grd": { - "includes": [10490], + "includes": [10480], }, "chrome/browser/resources/local_ntp/local_ntp_resources.grd": { - "includes": [10530], + "includes": [10510], }, "chrome/browser/resources/new_tab_page/new_tab_page_resources.grd": { - "includes": [10570], - "structures": [10580], + "includes": [10550], + "structures": [10560], }, "chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd": { - "includes": [10590], + "includes": [10570], }, "chrome/browser/resources/print_preview/print_preview_resources.grd": { - "includes": [10600], - "structures": [10650], + "includes": [10580], + "structures": [10630], }, "chrome/browser/resources/settings/os_settings_resources_vulcanized.grd": { - "includes": [10690], + "includes": [10670], }, "chrome/browser/resources/settings/os_settings_resources.grd": { - "structures": [10700], + "structures": [10680], }, "chrome/browser/resources/settings/settings_resources_vulcanized.grd": { - "includes": [11250], + "includes": [11160], }, "chrome/browser/resources/settings/settings_resources.grd": { - "structures": [11260], + "structures": [11170], }, "chrome/browser/resources/tab_strip/tab_strip_resources.grd": { - "structures": [11860], - "includes": [11880], + "structures": [11630], + "includes": [11650], }, "chrome/browser/resources/welcome/welcome_resources.grd": { - "includes": [11900], - "structures": [11930], + "includes": [11670], + "structures": [11700], }, "chrome/browser/vr/testapp/vr_testapp_resources.grd": { - "includes": [11950], + "includes": [11720], }, # END chrome/browser section. @@ -197,43 +197,43 @@ "chrome/browser/media/kaleidoscope/internal/kaleidoscope_resources.grd": { # Big alignment at start of section. "META": {"align": 100}, - "includes": [12000], + "includes": [11800], }, "chrome/browser/resources/bluetooth_internals/resources.grd": { - "includes": [12010], + "includes": [11810], }, "chrome/browser/resources/invalidations/invalidations_resources.grd": { - "includes": [12050], + "includes": [11850], }, "chrome/browser/resources/media/webrtc_logs_resources.grd": { - "includes": [12060], + "includes": [11860], }, "chrome/browser/resources/net_internals/net_internals_resources.grd": { - "includes": [12070], + "includes": [11870], }, "chrome/browser/resources/omnibox/resources.grd": { - "includes": [12080], + "includes": [11880], }, "chrome/browser/resources/quota_internals/quota_internals_resources.grd": { - "includes": [12100], + "includes": [11900], }, "chrome/browser/resources/sync_file_system_internals/sync_file_system_internals_resources.grd": { - "includes": [12110], + "includes": [11910], }, "chrome/browser/resources/usb_internals/resources.grd": { - "includes": [12120], + "includes": [11920], }, "chrome/browser/resources/webapks/webapks_ui_resources.grd": { - "includes": [12130], + "includes": [11930], }, "components/sync/driver/resources.grd": { - "includes": [12140], + "includes": [11940], }, "content/browser/resources/media/media_internals_resources.grd": { - "includes": [12160], + "includes": [11960], }, "content/browser/webrtc/resources/resources.grd": { - "includes": [12170], + "includes": [11970], }, # END chrome/ WebUI resources section @@ -241,21 +241,21 @@ "chrome/android/features/test_dummy/internal/resources/resources.grd": { # Big alignment at start of section. "META": {"align": 100}, - "includes": [12200], + "includes": [12000], }, "chrome/common/common_resources.grd": { - "includes": [12210], + "includes": [12010], }, "chrome/credential_provider/gaiacp/gaia_resources.grd": { - "includes": [12220], - "messages": [12230], + "includes": [12020], + "messages": [12030], }, "chrome/renderer/resources/renderer_resources.grd": { - "includes": [12270], - "structures": [12350], + "includes": [12070], + "structures": [12150], }, "chrome/test/data/webui_test_resources.grd": { - "includes": [12360], + "includes": [12160], }, # END chrome/ miscellaneous section. @@ -263,10 +263,10 @@ "chromeos/chromeos_strings.grd": { # Big alignment at start of section. "META": {"align": 100}, - "messages": [12400], + "messages": [12200], }, "chromeos/components/help_app_ui/resources/help_app_resources.grd": { - "includes": [12450], + "includes": [12250], }, # Both help_app_bundle_resources.grd and help_app_bundle_mock_resources.grd # start with the same id because only one of them is built depending on if @@ -274,14 +274,14 @@ # of languages (74). "chromeos/components/help_app_ui/resources/app/help_app_bundle_resources.grd": { "META": {"sizes": {"includes": [100],}}, # Relies on src-internal. - "includes": [12460], + "includes": [12260], }, "chromeos/components/help_app_ui/resources/mock/help_app_bundle_mock_resources.grd": { - "includes": [12460], + "includes": [12260], }, "chromeos/components/media_app_ui/resources/media_app_resources.grd": { "META": {"join": 2}, - "includes": [12580], + "includes": [12380], }, # Both media_app_bundle_resources.grd and media_app_bundle_mock_resources.grd # start with the same id because only one of them is built depending on if @@ -289,17 +289,17 @@ # of languages (74). "chromeos/components/media_app_ui/resources/app/app/media_app_bundle_resources.grd": { "META": {"sizes": {"includes": [100],}}, # Relies on src-internal. - "includes": [12590], + "includes": [12390], }, "chromeos/components/media_app_ui/resources/mock/media_app_bundle_mock_resources.grd": { - "includes": [12590], + "includes": [12390], }, "chromeos/components/sample_system_web_app_ui/resources/sample_system_web_app_resources.grd": { - "includes": [12700], + "includes": [12400], }, "chromeos/resources/chromeos_resources.grd": { "META": {"join": 2}, - "includes": [12710], + "includes": [12510], }, # END chromeos/ section. @@ -310,37 +310,37 @@ "components/components_chromium_strings.grd": { # Big alignment at start of section. "META": {"align": 100}, - "messages": [12800], + "messages": [12600], }, "components/components_google_chrome_strings.grd": { - "messages": [12800], + "messages": [12600], }, "components/components_locale_settings.grd": { "META": {"join": 2}, - "includes": [12820], - "messages": [12830], + "includes": [12620], + "messages": [12630], }, "components/components_strings.grd": { - "messages": [12840], + "messages": [12640], }, "components/omnibox/resources/omnibox_resources.grd": { - "includes": [14760], + "includes": [14570], }, "components/policy/resources/policy_templates.grd": { - "structures": [14770], + "structures": [14580], }, "components/resources/components_resources.grd": { - "includes": [14780], + "includes": [14590], }, "components/resources/components_scaled_resources.grd": { - "structures": [14860], + "structures": [14670], }, "components/embedder_support/android/java/strings/web_contents_delegate_android_strings.grd": { - "messages": [14900], + "messages": [14710], }, "components/autofill/core/browser/autofill_address_rewriter_resources.grd":{ - "includes": [14920] + "includes": [14730] }, # END components/ section. @@ -403,19 +403,19 @@ "content/app/resources/content_resources.grd": { # Big alignment at start of section. "META": {"join": 3, "align": 100}, - "structures": [15000], + "structures": [14800], }, "content/content_resources.grd": { - "includes": [15030], + "includes": [14830], }, "content/shell/shell_resources.grd": { - "includes": [15070], + "includes": [14870], }, # This file is generated during the build. "<(SHARED_INTERMEDIATE_DIR)/content/browser/tracing/tracing_resources.grd": { "META": {"sizes": {"includes": [20],}}, - "includes": [15080], + "includes": [14880], }, # END content/ section. @@ -425,10 +425,10 @@ "ios/web/ios_web_resources.grd": { # Big alignment at start of section. "META": {"align": 100}, - "includes": [15000], + "includes": [14800], }, "ios/web/test/test_resources.grd": { - "includes": [15010], + "includes": [14810], }, # END ios/web/ section. @@ -437,143 +437,143 @@ "android_webview/ui/aw_resources.grd": { # Big alignment at start of section. "META": {"join": 2, "align": 100}, - "includes": [15200], + "includes": [15000], }, "android_webview/ui/aw_strings.grd": { - "messages": [15210], + "messages": [15010], }, "ash/app_list/resources/app_list_resources.grd": { - "structures": [15220], + "structures": [15020], }, "ash/ash_strings.grd": { - "messages": [15230], + "messages": [15030], }, "ash/components/ash_components_strings.grd": { - "messages": [15970], + "messages": [15770], }, "ash/keyboard/ui/keyboard_resources.grd": { - "includes": [16220], + "includes": [16020], }, "ash/login/resources/login_resources.grd": { - "structures": [16300], + "structures": [16100], }, "ash/public/cpp/resources/ash_public_unscaled_resources.grd": { - "includes": [16310], + "includes": [16110], }, "chromecast/renderer/resources/extensions_renderer_resources.grd": { - "includes": [16320], + "includes": [16120], }, "cloud_print/virtual_driver/win/install/virtual_driver_setup_resources.grd": { - "includes": [16330], - "messages": [16340], + "includes": [16130], + "messages": [16140], }, "device/bluetooth/bluetooth_strings.grd": { - "messages": [16350], + "messages": [16150], }, "device/fido/fido_strings.grd": { - "messages": [16390], + "messages": [16190], }, "extensions/browser/resources/extensions_browser_resources.grd": { - "structures": [16400], + "structures": [16200], }, "extensions/extensions_resources.grd": { - "includes": [16410], + "includes": [16210], }, "extensions/renderer/resources/extensions_renderer_resources.grd": { - "includes": [16420], - "structures": [16490], + "includes": [16220], + "structures": [16290], }, "extensions/shell/app_shell_resources.grd": { - "includes": [16500], + "includes": [16300], }, "extensions/strings/extensions_strings.grd": { - "messages": [16510], + "messages": [16310], }, "headless/lib/resources/headless_lib_resources.grd": { - "includes": [16590], + "includes": [16390], }, "mojo/public/js/mojo_bindings_resources.grd": { - "includes": [16600], + "includes": [16400], }, "net/base/net_resources.grd": { - "includes": [16620], + "includes": [16420], }, "remoting/resources/remoting_strings.grd": { - "messages": [16630], + "messages": [16430], }, "services/services_strings.grd": { - "messages": [17010], + "messages": [16810], }, "third_party/blink/public/blink_image_resources.grd": { - "structures": [17020], + "structures": [16820], }, "third_party/blink/public/blink_resources.grd": { - "includes": [17030], + "includes": [16830], }, "third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd": { - "includes": [17110], - "structures": [17120], + "includes": [16910], + "structures": [16920], }, "third_party/blink/public/strings/blink_strings.grd": { - "messages": [17130], + "messages": [16930], }, "third_party/ink/ink_resources.grd": { - "includes": [17440], + "includes": [17240], }, "third_party/libaddressinput/chromium/address_input_strings.grd": { - "messages": [17450], + "messages": [17250], }, "ui/base/test/ui_base_test_resources.grd": { - "messages": [17500], + "messages": [17300], }, "ui/chromeos/resources/ui_chromeos_resources.grd": { - "structures": [17510], + "structures": [17310], }, "ui/chromeos/ui_chromeos_strings.grd": { - "messages": [17610], + "messages": [17410], }, "ui/file_manager/file_manager_resources.grd": { - "includes": [18530], + "includes": [18330], }, "ui/resources/ui_resources.grd": { - "structures": [18750], + "structures": [18550], }, "ui/resources/ui_unscaled_resources.grd": { - "includes": [18890], + "includes": [18690], }, "ui/strings/app_locale_settings.grd": { - "messages": [18920], + "messages": [18720], }, "ui/strings/ui_strings.grd": { - "messages": [18930], + "messages": [18730], }, "ui/views/resources/views_resources.grd": { - "structures": [19230], + "structures": [19030], }, "ui/webui/resources/webui_resources.grd": { - "includes": [19290], - "structures": [19450], + "includes": [19090], + "structures": [19250], }, "weblayer/weblayer_resources.grd": { - "includes": [20070], + "includes": [19870], }, # This file is generated during the build. "<(SHARED_INTERMEDIATE_DIR)/devtools/devtools_resources.grd": { "META": {"sizes": {"includes": [500],}}, - "includes": [20080], + "includes": [19880], }, # END "everything else" section.
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl index ba0d387..8a60264 100644 --- a/tools/gritsettings/translation_expectations.pyl +++ b/tools/gritsettings/translation_expectations.pyl
@@ -44,7 +44,9 @@ "chrome/browser/ui/android/strings/android_chrome_strings.grd", "chrome/credential_provider/gaiacp/gaia_resources.grd", "chromeos/chromeos_strings.grd", + "components/app_modal/android/app_modal_android_strings.grd", "components/autofill/android/java/strings/autofill_strings.grd", + "components/browser_ui/strings/android/browser_ui_strings.grd", "components/components_chromium_strings.grd", "components/components_google_chrome_strings.grd", "components/components_strings.grd",
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 78af766c..d76657f 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -420,6 +420,7 @@ 'GPU FYI Win x64 DX12 Vulkan Builder (dbg)': 'gpu_fyi_tests_dx12vk_debug_trybot', 'GPU FYI XR Win x64 Builder': 'gpu_fyi_tests_release_trybot', 'Linux FYI GPU TSAN Release': 'gpu_fyi_tests_release_trybot_tsan', + 'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)': 'gpu_fyi_tests_sk_dawn_release_trybot', 'Mac FYI GPU ASAN Release': 'gpu_fyi_tests_release_trybot_asan', 'Optional Android Release (Nexus 5X)': 'gpu_tests_android_release_trybot_arm64', }, @@ -800,6 +801,7 @@ 'gpu-fyi-try-linux-intel-dqp': 'deqp_release_trybot', 'gpu-fyi-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-intel-rel': 'gpu_fyi_tests_release_trybot', + 'gpu-fyi-try-linux-intel-sk-dawn-rel': 'gpu_fyi_tests_sk_dawn_release_trybot', 'gpu-fyi-try-linux-intel-skv': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-nvidia-dbg': 'gpu_fyi_tests_debug_trybot', 'gpu-fyi-try-linux-nvidia-dqp': 'deqp_release_trybot', @@ -1608,6 +1610,10 @@ 'gpu_fyi_tests', 'dx12vk', 'release_trybot', ], + 'gpu_fyi_tests_sk_dawn_release_trybot': [ + 'gpu_fyi_tests', 'sk_dawn', 'release_trybot', + ], + 'gpu_tests_android_release_bot_minimal_symbols_arm64_fastbuild': [ 'gpu_tests', 'android', 'release_bot', 'minimal_symbols', 'arm64', 'resource_whitelisting', 'static_angle', 'android_fastbuild', 'webview_google', @@ -2459,6 +2465,10 @@ 'mixins': ['shared_release_bot', 'minimal_symbols', 'dcheck_always_on'], }, + 'sk_dawn': { + 'gn_args': 'skia_use_dawn=true', + }, + 'stable_channel': { 'gn_args': 'android_channel="stable"', },
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 71631584..4f657aa 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -5905,6 +5905,24 @@ <description>Please enter the description of this user action.</description> </action> +<action name="Extensions.ExtensionDisabled"> + <owner>archanasimha@chromium.org</owner> + <description> + The user interacted with the toggle in the chrome://extensions page to + disable an extension from either the main page(card view) or detail page for + a specific extension. + </description> +</action> + +<action name="Extensions.ExtensionEnabled"> + <owner>archanasimha@chromium.org</owner> + <description> + The user interacted with the toggle in the chrome://extensions page to + enable an extension from either the main page(card view) or detail page for + a specific extension. + </description> +</action> + <action name="Extensions.ExtensionInstalled"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description> @@ -5920,6 +5938,15 @@ <description>Please enter the description of this user action.</description> </action> +<action name="Extensions.RemoveExtensionClick"> + <owner>archanasimha@chromium.org</owner> + <description> + User clicked the "Remove" button in the chrome://extensions page. + This triggers the uninstallation flow which prompts the user to cancel or + confirm the uninstallation. + </description> +</action> + <action name="Extensions.WebStoreLaunch"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 635c1f5..f9ff016 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -21617,6 +21617,7 @@ <int value="1425" label="PRINTING_GETPRINTERS"/> <int value="1426" label="WEBCAMPRIVATE_SET_HOME"/> <int value="1427" label="INPUTMETHODPRIVATE_RESET"/> + <int value="1428" label="PRINTING_GETPRINTERINFO"/> </enum> <enum name="ExtensionIconState"> @@ -36070,6 +36071,7 @@ <int value="-2142665444" label="ScrollableTabStrip:disabled"/> <int value="-2141661938" label="AnimatedAppMenuIcon:enabled"/> <int value="-2141247271" label="AndroidOmniboxPreviewsBadge:enabled"/> + <int value="-2140007754" label="HomepageSettingsUIConversion:disabled"/> <int value="-2139379065" label="StoragePressureUI:enabled"/> <int value="-2138883960" label="AutofillRejectCompanyBirthyearName:disabled"/> <int value="-2136259447" label="PasswordManagerOnboardingAndroid:disabled"/> @@ -36439,6 +36441,7 @@ <int value="-1722208902" label="CCTModuleCustomRequestHeader:disabled"/> <int value="-1720653947" label="WebRtcHybridAgc:disabled"/> <int value="-1719833926" label="disable-answers-in-suggest"/> + <int value="-1718074215" label="HomepageSettingsUIConversion:enabled"/> <int value="-1716654100" label="tab-capture-downscale-quality"/> <int value="-1716140224" label="EnableEmbeddedAssistantUI:disabled"/> <int value="-1715180530"
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 94309aeb..52033ba 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -184158,9 +184158,7 @@ <suffix name="ProtectedPasswordEntry" label="Password protection triggered by entering a saved password that does NOT match a password that is currently signed-in. This is - the same as SavedPaswordEntry."> - - </suffix> + the same as SavedPaswordEntry."/> <suffix name="SavedPasswordEntry" label="Password protection triggered by entering a password saved in the password manager where the account is not signed-in to @@ -184177,6 +184175,14 @@ Replaced by ProtectedPasswordEntry in M62. </obsolete> </suffix> + <suffix name="UnknownNonPrimaryPasswordEntry" + label="Password protection triggered by entering a password that does + not match a primary account password but no current signed-in + account is found."/> + <suffix name="UnknownPrimaryPasswordEntry" + label="Password protection triggered by entering a password that + matches a primary account password but no current signed-in + account is found."/> <affected-histogram name="PasswordProtection.ChromeSettingsAction"/> <affected-histogram name="PasswordProtection.InterstitialAction"/> <affected-histogram name="PasswordProtection.ModalWarningDialogAction"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index a55d221d..fdccc24 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -3486,6 +3486,248 @@ </metric> </event> +<event name="Graphics.Smoothness.Latency"> + <owner>animations-dev@chromium.org</owner> + <owner>sadrul@chromium.org</owner> + <owner>schenney@chromium.org</owner> + <summary> + Tracks the duration of stages in the rendering pipeline while processing a + single frame. All times are in microseconds. + </summary> + <metric name="Activation"> + <summary> + The duration of the activation stage. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="BeginImplFrameToSendBeginMainFrame"> + <summary> + The time from when the Impl frame is started to when BeginMainFrame is + sent. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="Commit"> + <summary> + The duration of the commit stage." + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="CompositorAnimation" enum="Boolean"> + <summary> + True when a compositor-driven animation was active this frame. + </summary> + </metric> + <metric name="EndActivateToSubmitCompositorFrame"> + <summary> + The time from when an activation is complete to the next + SubmitCompositorFrame. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="EndCommitToActivation"> + <summary> + The time from when a commit is complete to the beginning of the next + activation. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="MainThreadAnimation" enum="Boolean"> + <summary> + True when a main-thread-driven animation was active this frame. + </summary> + </metric> + <metric name="MissedFrame" enum="Boolean"> + <summary> + True when the main frame missed its deadline for this frame. + </summary> + <aggregation> + <history> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="PinchZoom" enum="Boolean"> + <summary> + True when a pinch-to-zoom interaction was active this frame. + </summary> + </metric> + <metric name="RAF" enum="Boolean"> + <summary> + True when a rAF-driven animation was active this frame. + </summary> + </metric> + <metric name="SendBeginMainFrameToCommit"> + <summary> + The time from when the BeginMainFrame is sent to the beginning of the + commit. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="SubmitCompositorFrameToPresentationCompositorFrame"> + <summary> + The time from when the a compositor frame is submitted to the display + compositor to when it is presented. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric + name="SubmitCompositorFrameToPresentationCompositorFrame.ReceivedCompositorFrameToStartDraw"> + <summary> + The time from when a compositor frame is received to when it starts to + draw. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric + name="SubmitCompositorFrameToPresentationCompositorFrame.StartDrawToSwapEnd"> + <summary> + The time from when the a compositor frame is started to draw to when it + ends swap. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric + name="SubmitCompositorFrameToPresentationCompositorFrame.SubmitToReceiveCompositorFrame"> + <summary> + The time from when the a compositor frame is submitted to when it is + received. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric + name="SubmitCompositorFrameToPresentationCompositorFrame.SwapEndToPresentationCompositorFrame"> + <summary> + The time from when the a compositor frame ends swap to when it is + presented. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TotalLatency"> + <summary> + The total time starting from BeginImplFrame to when + CompositorFramePresentation is done with updates from the MainThread (i.e. + the time it takes for BeginImplFrame, BeginMainFrame, Commit, Activate, + SubmitCompositorFrame and PresentCompositorFrame). + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="TouchScroll" enum="Boolean"> + <summary> + True when a touchscreen driven interaction was active this frame. + </summary> + </metric> + <metric name="Unknown"> + <summary> + The time within a stage not attributed to any system. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="Video" enum="Boolean"> + <summary> + True when video playback was active this frame. + </summary> + </metric> + <metric name="WheelScroll" enum="Boolean"> + <summary> + True when a mouse driven scroll was active this frame. + </summary> + </metric> +</event> + <event name="Graphics.Smoothness.Throughput"> <owner>animations-dev@chromium.org</owner> <owner>sadrul@chromium.org</owner>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index cbe58186..2519a9e2 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -18,7 +18,6 @@ blink_perf.shadow_dom,masonfreed@chromium.org,Blink>DOM>ShadowDOM,https://bit.ly/blink-perf-benchmarks, blink_perf.svg,"fs@opera.com, pdr@chromium.org",Blink>SVG,https://bit.ly/blink-perf-benchmarks, components_perftests,csharrison@chromium.org,,, -dawn_perf_tests,"enga@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU>Dawn,https://dawn.googlesource.com/dawn/+/HEAD/src/tests/perf_tests/README.md, dromaeo,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org",Blink>Bindings,, dummy_benchmark.noisy_benchmark_1,crouleau@chromium.org,Test>Telemetry,, dummy_benchmark.stable_benchmark_1,crouleau@chromium.org,Test>Telemetry,,
diff --git a/tools/perf/benchmark_schedules.csv b/tools/perf/benchmark_schedules.csv index e988743..b06fbe15 100644 --- a/tools/perf/benchmark_schedules.csv +++ b/tools/perf/benchmark_schedules.csv
@@ -5,48 +5,48 @@ system_health.common_mobile,10.62,8,1,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf",android-pixel2_weblayer-perf v8.browsing_mobile,8.04,7,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf", system_health.memory_mobile,7.38,7,2,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf","android-nexus5x-perf, android-pixel2_weblayer-perf" -v8.runtime_stats.top_25,4.47,4,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, win-10-perf", -rendering.desktop,4.25,5,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.layout,4.08,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -system_health.common_desktop,3.19,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -system_health.memory_desktop,2.71,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", +v8.runtime_stats.top_25,5.54,5,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, win-10-perf, win-10_laptop_low_end-perf", +rendering.desktop,5.16,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.layout,4.26,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +system_health.common_desktop,3.76,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +system_health.memory_desktop,3.21,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +rasterize_and_record_micro.top_25,2.38,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.bindings,2.29,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", loading.mobile,2.27,6,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf", -rasterize_and_record_micro.top_25,2.24,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.bindings,2.18,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -loading.desktop,1.87,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -v8.browsing_desktop,1.76,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -v8.browsing_desktop-future,1.75,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.parser,1.51,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.canvas,1.21,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -power.desktop,0.86,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.css,0.82,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.shadow_dom,0.81,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", +loading.desktop,2.22,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +v8.browsing_desktop,2.08,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +v8.browsing_desktop-future,2.05,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.parser,1.58,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.canvas,1.31,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +power.desktop,1.01,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.css,0.89,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.shadow_dom,0.86,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +webrtc,0.80,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", startup.mobile,0.76,5,0,"Android Nexus5 Perf, android-go-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_weblayer-perf", -webrtc,0.75,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.image_decoder,0.72,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.dom,0.58,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -dromaeo,0.52,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -media.desktop,0.52,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.svg,0.48,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.events,0.48,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -speedometer2,0.47,14,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.paint,0.46,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", +blink_perf.image_decoder,0.75,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +media.desktop,0.61,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.dom,0.60,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +dromaeo,0.56,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.paint,0.51,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.svg,0.50,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.events,0.50,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +speedometer2,0.49,15,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", media.mobile,0.41,3,0,"Android Nexus5 Perf, android-nexus5x-perf, android-pixel2-perf", -speedometer2-future,0.34,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -tracing.tracing_with_background_memory_infra,0.33,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -jetstream,0.30,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -memory.desktop,0.29,6,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", +tracing.tracing_with_background_memory_infra,0.36,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +speedometer2-future,0.36,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +memory.desktop,0.35,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +jetstream,0.35,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +jetstream2,0.31,5,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +speedometer,0.29,15,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", blink_perf.display_locking,0.28,2,0,"android-nexus5x-perf, mac-10_12_laptop_low_end-perf", -speedometer,0.28,14,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -jetstream2,0.27,4,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.owp_storage,0.22,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -kraken,0.21,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -speedometer-future,0.20,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -octane,0.20,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -blink_perf.accessibility,0.14,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -rasterize_and_record_micro.partial_invalidation,0.05,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -dummy_benchmark.noisy_benchmark_1,0.03,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", -dummy_benchmark.stable_benchmark_1,0.02,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf", +blink_perf.owp_storage,0.23,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +kraken,0.22,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +octane,0.21,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +speedometer-future,0.21,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +blink_perf.accessibility,0.15,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +rasterize_and_record_micro.partial_invalidation,0.05,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +dummy_benchmark.noisy_benchmark_1,0.03,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", +dummy_benchmark.stable_benchmark_1,0.03,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf", system_health.webview_startup,0.02,4,0,"Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go_webview-perf, android-pixel2_webview-perf", v8.browsing_mobile-future,0.00,6,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf", -tab_switching.typical_25,0.00,2,0,"Win 7 Perf, win-10-perf", +tab_switching.typical_25,0.00,3,0,"Win 7 Perf, win-10-perf, win-10_laptop_low_end-perf",
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 3956ebc..650aef591 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -173,6 +173,7 @@ _MAC_HIGH_END_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING _MAC_LOW_END_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_JETSTREAM2 _WIN_10_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING +_WIN_10_LOW_END_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING _WIN_10_LOW_END_HP_CANDIDATE_BENCHMARK_CONFIGS = frozenset([ _GetBenchmarkConfig('v8.browsing_desktop')]) _WIN_7_BENCHMARK_CONFIGS = (_OFFICIAL_EXCEPT_DISPLAY_LOCKING_JETSTREAM2 - @@ -244,6 +245,14 @@ _MAC_LOW_END_BENCHMARK_CONFIGS, 26, 'mac') # Win +WIN_10_LOW_END = PerfPlatform( + 'win-10_laptop_low_end-perf', + 'Low end windows 10 HP laptops. HD Graphics 5500, x86-64-i3-5005U, ' + 'SSD, 4GB RAM.', _WIN_10_LOW_END_BENCHMARK_CONFIGS, + # TODO(crbug.com/998161): Increase the number of shards once you + # have enough test data to make a shard map and when more devices + # are added to the data center. + 26, 'win') WIN_10 = PerfPlatform( 'win-10-perf', 'Windows Intel HD 630 towers, Core i7-7700 3.6 GHz, 16GB RAM,'
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 84b5746..acc5950 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -524,6 +524,30 @@ 'device_os_flavor': 'google', }, }, + 'win-10_laptop_low_end-perf': { + 'tests': [ + { + 'isolate': 'performance_test_suite', + 'extra_args': [ + '--assert-gpu-compositing', + ], + }, + ], + 'platform': 'win', + 'target_bits': 64, + 'dimension': { + 'pool': 'chrome.tests.perf', + # Explicitly set GPU driver version and Windows OS version such + # that we can be informed if this + # version ever changes or becomes inconsistent. It is important + # that bots are homogeneous. See crbug.com/988045 for history. + 'os': 'Windows-10-18363.476', + 'gpu': '8086:1616-20.19.15.5070', + # TODO(crbug.com/998161): Add synthetic product name for these. + # They don't have this dimension yet as I am writing this CL since + # they are since in pool 'unassigned'. + }, + }, 'win-10-perf': { 'tests': [ { @@ -560,14 +584,6 @@ 'num_shards': 1, 'type': TEST_TYPES.GTEST, }, - { - 'isolate': 'dawn_perf_tests', - 'num_shards': 1, - 'type': TEST_TYPES.GTEST, - 'extra_args': [ - '--shard-timeout=300' - ], - }, ], 'platform': 'win', 'target_bits': 64, @@ -879,10 +895,6 @@ 'views_perftests': BenchmarkMetadata( 'tapted@chromium.org', 'Internals>Views'), 'components_perftests': BenchmarkMetadata('csharrison@chromium.org'), - 'dawn_perf_tests': BenchmarkMetadata( - 'enga@chromium.org, chrome-gpu-perf-owners@chromium.org', - 'Internals>GPU>Dawn', - 'https://dawn.googlesource.com/dawn/+/HEAD/src/tests/perf_tests/README.md'), }
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py index 81ef9dec..71ac8be7 100644 --- a/tools/perf/core/perf_json_config_validator.py +++ b/tools/perf/core/perf_json_config_validator.py
@@ -104,7 +104,8 @@ raise ValueError("%s must use 'cros-chrome' browser type" % builder_name) elif builder_name in ('win-10-perf', 'Win 7 Nvidia GPU Perf', - 'win-10_laptop_low_end-perf_HP-Candidate'): + 'win-10_laptop_low_end-perf_HP-Candidate', + 'win-10_laptop_low_end-perf'): if browser_options.browser != 'release_x64': raise ValueError("%s must use 'release_x64' browser type" % builder_name)
diff --git a/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json b/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json new file mode 100644 index 0000000..ac8a9ef --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_timing.json
@@ -0,0 +1,4450 @@ +[ + { + "duration": "17.0", + "name": "blink_perf.accessibility/line-breaks.html" + }, + { + "duration": "14.0", + "name": "blink_perf.accessibility/textarea-append.html" + }, + { + "duration": "9.0", + "name": "blink_perf.bindings/append-child.html" + }, + { + "duration": "9.0", + "name": "blink_perf.bindings/create-element.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/document-implementation.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/first-child.html" + }, + { + "duration": "6.0", + "name": "blink_perf.bindings/gc-forest.html" + }, + { + "duration": "7.0", + "name": "blink_perf.bindings/gc-mini-tree.html" + }, + { + "duration": "10.0", + "name": "blink_perf.bindings/gc-tree.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/get-attribute-rare.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/get-attribute.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/get-element-by-id.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/get-elements-by-tag-name.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/id-getter.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/id-setter.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/indexed-getter.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/insert-before.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/named-property-enumerator.html" + }, + { + "duration": "14.0", + "name": "blink_perf.bindings/node-list-access.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/node-type.html" + }, + { + "duration": "3.0", + "name": "blink_perf.bindings/post-message.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/sequence-conversion-array.html" + }, + { + "duration": "9.0", + "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" + }, + { + "duration": "3.0", + "name": "blink_perf.bindings/serialize-array.html" + }, + { + "duration": "3.0", + "name": "blink_perf.bindings/serialize-long-string.html" + }, + { + "duration": "4.0", + "name": "blink_perf.bindings/serialize-map.html" + }, + { + "duration": "4.0", + "name": "blink_perf.bindings/serialize-nested-array.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/set-attribute-rare.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/set-attribute.html" + }, + { + "duration": "9.0", + "name": "blink_perf.bindings/structured-clone-json-deserialize.html" + }, + { + "duration": "9.0", + "name": "blink_perf.bindings/structured-clone-json-serialize.html" + }, + { + "duration": "5.0", + "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" + }, + { + "duration": "5.0", + "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/typed-array-construct-from-array.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/typed-array-construct-from-typed.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/typed-array-set-from-typed.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/undefined-first-child.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/undefined-get-element-by-id.html" + }, + { + "duration": "8.0", + "name": "blink_perf.bindings/undefined-id-getter.html" + }, + { + "duration": "3.0", + "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html" + }, + { + "duration": "15.0", + "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html" + }, + { + "duration": "15.0", + "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html" + }, + { + "duration": "15.0", + "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html" + }, + { + "duration": "4.0", + "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html" + }, + { + "duration": "3.0", + "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html" + }, + { + "duration": "7.0", + "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html" + }, + { + "duration": "7.0", + "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html" + }, + { + "duration": "7.0", + "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html" + }, + { + "duration": "6.0", + "name": "blink_perf.bindings/worker-transferable-from-worker.html" + }, + { + "duration": "6.0", + "name": "blink_perf.bindings/worker-transferable-roundtrip.html" + }, + { + "duration": "6.0", + "name": "blink_perf.bindings/worker-transferable-to-worker.html" + }, + { + "duration": "10.0", + "name": "blink_perf.canvas/createImageBitmapFromImageData.html" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/createImageBitmapFromImageData_RAF.html?RAF" + }, + { + "duration": "10.0", + "name": "blink_perf.canvas/docs-paper.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/docs-paper_RAF.html?RAF" + }, + { + "duration": "13.0", + "name": "blink_perf.canvas/docs-resume.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/docs-resume_RAF.html?RAF" + }, + { + "duration": "9.0", + "name": "blink_perf.canvas/docs-table.html" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/docs-table_RAF.html?RAF" + }, + { + "duration": "10.0", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF" + }, + { + "duration": "14.0", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF" + }, + { + "duration": "3.0", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" + }, + { + "duration": "6.0", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d_RAF.html?RAF" + }, + { + "duration": "3.0", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF" + }, + { + "duration": "3.0", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "6.0", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF" + }, + { + "duration": "9.0", + "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" + }, + { + "duration": "9.0", + "name": "blink_perf.canvas/drawimage-not-pixelaligned_RAF.html?RAF" + }, + { + "duration": "14.0", + "name": "blink_perf.canvas/drawimage.html" + }, + { + "duration": "14.0", + "name": "blink_perf.canvas/drawimage_RAF.html?RAF" + }, + { + "duration": "10.0", + "name": "blink_perf.canvas/getImageData.html" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/getImageDataColorManaged.html" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/getImageDataColorManaged_RAF.html?RAF" + }, + { + "duration": "9.0", + "name": "blink_perf.canvas/getImageData_RAF.html?RAF" + }, + { + "duration": "3.0", + "name": "blink_perf.canvas/gpu-bound-shader.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/gpu-bound-shader_RAF.html?RAF" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/putImageData.html" + }, + { + "duration": "8.0", + "name": "blink_perf.canvas/putImageData_RAF.html?RAF" + }, + { + "duration": "16.0", + "name": "blink_perf.canvas/sheets-render.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/sheets-render_RAF.html?RAF" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/toBlob_duration.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/toBlob_duration_RAF.html?RAF" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/toBlob_duration_jpeg.html" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF" + }, + { + "duration": "6.0", + "name": "blink_perf.canvas/transferFromImageBitmap.html" + }, + { + "duration": "21.0", + "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" + }, + { + "duration": "6.0", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture_RAF.html?RAF" + }, + { + "duration": "9.0", + "name": "blink_perf.canvas/upload-video-to-sub-texture.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/upload-video-to-sub-texture_RAF.html?RAF" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/upload-video-to-texture.html" + }, + { + "duration": "5.0", + "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF" + }, + { + "duration": "4.0", + "name": "blink_perf.canvas/upload-webgl-to-texture.html" + }, + { + "duration": "7.0", + "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF" + }, + { + "duration": "29.0", + "name": "blink_perf.css/AttributeDescendantSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/CSSPropertySetterGetter.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/CSSPropertyUpdateValue.html" + }, + { + "duration": "11.0", + "name": "blink_perf.css/ChangeStyleChildClassSelector.html" + }, + { + "duration": "11.0", + "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" + }, + { + "duration": "11.0", + "name": "blink_perf.css/ChangeStyleElementSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" + }, + { + "duration": "11.0", + "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" + }, + { + "duration": "10.0", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleShallowTree.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleUniversalSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "0.0", + "name": "blink_perf.css/ClassInvalidation.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/LoadBootstrapBlog.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/LoadMaterializeStarterPage.html" + }, + { + "duration": "9.0", + "name": "blink_perf.css/LoadSemanticPageExample.html" + }, + { + "duration": "17.0", + "name": "blink_perf.dom/custom-element-default-style-with-shadow.html" + }, + { + "duration": "14.0", + "name": "blink_perf.dom/custom-element-default-style.html" + }, + { + "duration": "10.0", + "name": "blink_perf.dom/long-sibling-list.html" + }, + { + "duration": "4.0", + "name": "blink_perf.dom/modify-element-classname.html" + }, + { + "duration": "4.0", + "name": "blink_perf.dom/modify-element-id.html" + }, + { + "duration": "3.0", + "name": "blink_perf.dom/modify-element-title.html" + }, + { + "duration": "8.0", + "name": "blink_perf.dom/select-multiple-add.html" + }, + { + "duration": "9.0", + "name": "blink_perf.dom/select-single-add.html" + }, + { + "duration": "8.0", + "name": "blink_perf.dom/select-single-remove.html" + }, + { + "duration": "24.0", + "name": "blink_perf.events/EventsDispatching.html" + }, + { + "duration": "8.0", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html" + }, + { + "duration": "9.0", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html" + }, + { + "duration": "11.0", + "name": "blink_perf.events/EventsDispatchingInV0ShadowTrees.html" + }, + { + "duration": "10.0", + "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html" + }, + { + "duration": "8.0", + "name": "blink_perf.events/hit-test-lots-of-layers.html" + }, + { + "duration": "9.0", + "name": "blink_perf.events/is-input-pending-all-events.html" + }, + { + "duration": "8.0", + "name": "blink_perf.events/is-input-pending-default-events.html" + }, + { + "duration": "13.0", + "name": "blink_perf.image_decoder/decode-gif.html" + }, + { + "duration": "10.0", + "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html" + }, + { + "duration": "9.0", + "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html" + }, + { + "duration": "10.0", + "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html" + }, + { + "duration": "9.0", + "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html" + }, + { + "duration": "13.0", + "name": "blink_perf.image_decoder/decode-lossless-webp.html" + }, + { + "duration": "8.0", + "name": "blink_perf.image_decoder/decode-lossy-webp.html" + }, + { + "duration": "12.0", + "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" + }, + { + "duration": "10.0", + "name": "blink_perf.image_decoder/decode-png-palette.html" + }, + { + "duration": "15.0", + "name": "blink_perf.image_decoder/decode-png.html" + }, + { + "duration": "22.0", + "name": "blink_perf.layout/ArabicLineLayout.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/Shapes/MultipleShapes.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/SimpleTextPathLineLayout.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/add-remove-inline-floats.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/animate-abspos-deep.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/attach-inlines-2.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/attach-inlines.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/auto-grid-lots-of-data.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/change-text-css-contain.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/chapter-reflow-once-random.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/chapter-reflow-once.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/chapter-reflow-thrice.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/chapter-reflow-twice.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/chapter-reflow.html" + }, + { + "duration": "11.0", + "name": "blink_perf.layout/character_fallback.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/contain-content-style-change.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/editing_append.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/editing_append_single_line.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/editing_delete.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/editing_insert.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/editing_prepend.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/fit-content-change-available-size-blocks.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/fit-content-change-available-size-text.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/fixed-grid-lots-of-data.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/flexbox-column-nowrap.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/flexbox-column-wrap.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/flexbox-lots-of-data.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/flexbox-row-nowrap.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/flexbox-row-wrap.html" + }, + { + "duration": "11.0", + "name": "blink_perf.layout/flexbox-with-stretch-layout.html" + }, + { + "duration": "19.0", + "name": "blink_perf.layout/flexbox_with_list_item.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/floats_100_100.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/floats_100_100_nested.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/floats_10_1000.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/floats_20_100.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/floats_20_100_nested.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/floats_2_100.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/floats_2_100_nested.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/floats_50_100.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/floats_50_100_nested.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/hindi-line-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/japanese-kokoro-insert.html" + }, + { + "duration": "9.0", + "name": "blink_perf.layout/large-grid.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/large-spanning-grid-item.html" + }, + { + "duration": "7.0", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" + }, + { + "duration": "7.0", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" + }, + { + "duration": "7.0", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" + }, + { + "duration": "6.0", + "name": "blink_perf.layout/latin-ebook-resize.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/latin-ebook.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/layers_overlap_2d.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/layers_overlap_3d.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/line-layout-fit-content-break-word.html" + }, + { + "duration": "6.0", + "name": "blink_perf.layout/line-layout-fit-content.html" + }, + { + "duration": "6.0", + "name": "blink_perf.layout/line-layout-line-height.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/line-layout-repeat-append-select.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/line-layout-repeat-append.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/line-layout.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/long-line-nowrap-collapse.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/long-line-nowrap.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/many-block-children-auto-inline-size.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/many-block-children-fixed-inline-size.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/balance-forced-breaks.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/deeply-nested-tables.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" + }, + { + "duration": "15.0", + "name": "blink_perf.layout/multicol/nested-forced-breaks.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/multicol/tall-content-short-columns.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/nested-grid.html" + }, + { + "duration": "8.0", + "name": "blink_perf.layout/nested-percent-height-tables.html" + }, + { + "duration": "31.0", + "name": "blink_perf.layout/subtree-detaching.html" + }, + { + "duration": "5.0", + "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/word-break-break-all.html" + }, + { + "duration": "3.0", + "name": "blink_perf.layout/word-break-break-word.html" + }, + { + "duration": "4.0", + "name": "blink_perf.layout/word-wrap-break-word.html" + }, + { + "duration": "16.0", + "name": "blink_perf.owp_storage/blob-perf-files.html" + }, + { + "duration": "9.0", + "name": "blink_perf.owp_storage/blob-perf-ipc.html" + }, + { + "duration": "9.0", + "name": "blink_perf.owp_storage/blob-perf-shm.html" + }, + { + "duration": "9.0", + "name": "blink_perf.owp_storage/blob-perf-tiny.html" + }, + { + "duration": "11.0", + "name": "blink_perf.owp_storage/idb-load-docs.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/appending-text.html" + }, + { + "duration": "10.0", + "name": "blink_perf.paint/color-changes.html" + }, + { + "duration": "10.0", + "name": "blink_perf.paint/complex-content-slow-scroll.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/complex-iframe-filtered.html" + }, + { + "duration": "19.0", + "name": "blink_perf.paint/contain-update-layer-tree.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/containment-resize.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/large-table-collapsed-border-change.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/large-table-repaint.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/move-text-with-mask.html" + }, + { + "duration": "9.0", + "name": "blink_perf.paint/paint-offset-changes.html" + }, + { + "duration": "8.0", + "name": "blink_perf.paint/select-all-words.html" + }, + { + "duration": "10.0", + "name": "blink_perf.paint/transform-changes.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/css-parser-yui.html" + }, + { + "duration": "5.0", + "name": "blink_perf.parser/html-parser-threaded.html" + }, + { + "duration": "4.0", + "name": "blink_perf.parser/html-parser.html" + }, + { + "duration": "23.0", + "name": "blink_perf.parser/html5-full-render.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/iframe-append-remove.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/innerHTML-setter-siblings.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/innerHTML-setter.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-attribute-complex.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-attribute.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-class-deep.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/query-selector-all-class-first.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-class-last.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-class.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-deep.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-first.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-id-deep.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-id-first.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/query-selector-all-id-last.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-all-last.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-deep.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-first.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-id-deep.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-id-last.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/query-selector-last.html" + }, + { + "duration": "7.0", + "name": "blink_perf.parser/simple-url.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/textarea-parsing.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/tiny-innerHTML.html" + }, + { + "duration": "9.0", + "name": "blink_perf.parser/url-parser.html" + }, + { + "duration": "8.0", + "name": "blink_perf.parser/xml-parser.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/declarative-api.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-appendchild.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-assign.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/imperative-api.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/shadow-style-share.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/style-sheet-insert.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" + }, + { + "duration": "5.0", + "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" + }, + { + "duration": "6.0", + "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/v0-content-reprojection.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" + }, + { + "duration": "3.0", + "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" + }, + { + "duration": "6.0", + "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-distribution.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-host-child-append.html" + }, + { + "duration": "6.0", + "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" + }, + { + "duration": "7.0", + "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-slot-append.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" + }, + { + "duration": "4.0", + "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" + }, + { + "duration": "7.0", + "name": "blink_perf.svg/AzLizardBenjiPark.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/Bamboo.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/Cactus.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/Cowboy.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/CrawFishGanson.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/Debian.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/DropsOnABlade.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/FlowerFromMyGarden.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/FoodLeifLodahl.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/France.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/GearFlowers.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/HarveyRayner.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/HereGear.html" + }, + { + "duration": "5.0", + "name": "blink_perf.svg/MtSaintHelens.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/Samurai.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/SvgCubics.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/SvgHitTesting.html" + }, + { + "duration": "9.0", + "name": "blink_perf.svg/SvgNestedUse.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/UnderTheSee.html" + }, + { + "duration": "3.0", + "name": "blink_perf.svg/WorldIso.html" + }, + { + "duration": "4.0", + "name": "blink_perf.svg/Worldcup.html" + }, + { + "duration": "35.0", + "name": "dromaeo/http://dromaeo.com?dom-attr" + }, + { + "duration": "33.0", + "name": "dromaeo/http://dromaeo.com?dom-modify" + }, + { + "duration": "48.0", + "name": "dromaeo/http://dromaeo.com?dom-query" + }, + { + "duration": "29.0", + "name": "dromaeo/http://dromaeo.com?dom-traverse" + }, + { + "duration": "16.0", + "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" + }, + { + "duration": "3.0", + "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" + }, + { + "duration": "171.0", + "name": "jetstream/JetStream" + }, + { + "duration": "132.0", + "name": "jetstream2/JetStream2" + }, + { + "duration": "32.0", + "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" + }, + { + "duration": "11.0", + "name": "loading.desktop/24h_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/24h_warm" + }, + { + "duration": "14.0", + "name": "loading.desktop/AirBnB_cold" + }, + { + "duration": "23.0", + "name": "loading.desktop/AirBnB_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Aljayyash_cold" + }, + { + "duration": "10.0", + "name": "loading.desktop/Aljayyash_warm" + }, + { + "duration": "18.0", + "name": "loading.desktop/AllRecipes_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/ArsTechnica_cold" + }, + { + "duration": "22.0", + "name": "loading.desktop/ArsTechnica_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Baidu_cold" + }, + { + "duration": "10.0", + "name": "loading.desktop/Baidu_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/Bhaskar_cold" + }, + { + "duration": "15.0", + "name": "loading.desktop/Bhaskar_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/Chosun_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/Chosun_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Colorado.edu_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/Colorado.edu_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Danawa_cold" + }, + { + "duration": "13.0", + "name": "loading.desktop/Danawa_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Daum_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/Daum_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/Donga_cold" + }, + { + "duration": "13.0", + "name": "loading.desktop/Donga_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/Economist_cold" + }, + { + "duration": "19.0", + "name": "loading.desktop/Economist_warm" + }, + { + "duration": "14.0", + "name": "loading.desktop/Elmundo_cold" + }, + { + "duration": "22.0", + "name": "loading.desktop/FC2Blog_cold" + }, + { + "duration": "13.0", + "name": "loading.desktop/FC2Blog_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/FIFA_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/FIFA_warm" + }, + { + "duration": "16.0", + "name": "loading.desktop/FarsNews_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/FarsNews_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Flickr_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/Flickr_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/FlipKart_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/FlipKart_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Free.fr_cold" + }, + { + "duration": "11.0", + "name": "loading.desktop/Free.fr_warm" + }, + { + "duration": "9.0", + "name": "loading.desktop/HTML5Rocks_cold" + }, + { + "duration": "10.0", + "name": "loading.desktop/HTML5Rocks_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Haraj_cold" + }, + { + "duration": "11.0", + "name": "loading.desktop/Haraj_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/HatenaBookmark_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/HatenaBookmark_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/IGN_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/IGN_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/IMDB_cold" + }, + { + "duration": "13.0", + "name": "loading.desktop/IMDB_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/IndiaTimes_cold" + }, + { + "duration": "13.0", + "name": "loading.desktop/IndiaTimes_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/Kakaku_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/Kakaku_warm" + }, + { + "duration": "14.0", + "name": "loading.desktop/Kenh14_cold" + }, + { + "duration": "21.0", + "name": "loading.desktop/Kenh14_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Mercadolivre_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/Mercadolivre_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Naver_cold" + }, + { + "duration": "11.0", + "name": "loading.desktop/Naver_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Pantip_cold" + }, + { + "duration": "22.0", + "name": "loading.desktop/Pantip_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/PremierLeague_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/PremierLeague_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/QQ_cold" + }, + { + "duration": "16.0", + "name": "loading.desktop/QQ_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/REI_cold" + }, + { + "duration": "15.0", + "name": "loading.desktop/REI_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/Ruten_cold" + }, + { + "duration": "11.0", + "name": "loading.desktop/Ruten_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/Sina_cold" + }, + { + "duration": "18.0", + "name": "loading.desktop/Sina_warm" + }, + { + "duration": "16.0", + "name": "loading.desktop/Taobao_cold" + }, + { + "duration": "20.0", + "name": "loading.desktop/Taobao_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/TheOnion_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/TheVerge_cold" + }, + { + "duration": "14.0", + "name": "loading.desktop/TheVerge_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/TicketMaster_cold" + }, + { + "duration": "16.0", + "name": "loading.desktop/TicketMaster_warm" + }, + { + "duration": "14.0", + "name": "loading.desktop/Vietnamnet_cold" + }, + { + "duration": "20.0", + "name": "loading.desktop/Vietnamnet_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/Vnexpress_cold" + }, + { + "duration": "16.0", + "name": "loading.desktop/Vnexpress_warm" + }, + { + "duration": "10.0", + "name": "loading.desktop/Yandex_cold" + }, + { + "duration": "11.0", + "name": "loading.desktop/Yandex_warm" + }, + { + "duration": "13.0", + "name": "loading.desktop/amazon.co.jp_cold" + }, + { + "duration": "17.0", + "name": "loading.desktop/amazon.co.jp_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/ja.wikipedia_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/ja.wikipedia_warm" + }, + { + "duration": "14.0", + "name": "loading.desktop/money.cnn_cold" + }, + { + "duration": "19.0", + "name": "loading.desktop/money.cnn_warm" + }, + { + "duration": "12.0", + "name": "loading.desktop/ru.wikipedia_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/ru.wikipedia_warm" + }, + { + "duration": "15.0", + "name": "loading.desktop/uol.com.br_cold" + }, + { + "duration": "21.0", + "name": "loading.desktop/uol.com.br_warm" + }, + { + "duration": "11.0", + "name": "loading.desktop/yahoo.co.jp_cold" + }, + { + "duration": "12.0", + "name": "loading.desktop/yahoo.co.jp_warm" + }, + { + "duration": "9.0", + "name": "media.desktop/mse.html?media=aac_audio.mp4" + }, + { + "duration": "10.0", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4" + }, + { + "duration": "10.0", + "name": "media.desktop/mse.html?media=h264_video.mp4" + }, + { + "duration": "9.0", + "name": "media.desktop/mse.html?media=tulip0.av1.mp4" + }, + { + "duration": "10.0", + "name": "media.desktop/mse.html?media=tulip2.vp9.webm" + }, + { + "duration": "15.0", + "name": "media.desktop/video.html?src=crowd1080.mp4" + }, + { + "duration": "15.0", + "name": "media.desktop/video.html?src=crowd1080.webm" + }, + { + "duration": "13.0", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm" + }, + { + "duration": "10.0", + "name": "media.desktop/video.html?src=garden2_10s.mp4&seek" + }, + { + "duration": "10.0", + "name": "media.desktop/video.html?src=garden2_10s.webm&seek" + }, + { + "duration": "9.0", + "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek" + }, + { + "duration": "14.0", + "name": "media.desktop/video.html?src=tulip0.av1.mp4" + }, + { + "duration": "9.0", + "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek" + }, + { + "duration": "21.0", + "name": "media.desktop/video.html?src=tulip2.m4a&type=audio" + }, + { + "duration": "21.0", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio" + }, + { + "duration": "8.0", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek" + }, + { + "duration": "22.0", + "name": "media.desktop/video.html?src=tulip2.mp4" + }, + { + "duration": "22.0", + "name": "media.desktop/video.html?src=tulip2.mp4&busyjs" + }, + { + "duration": "21.0", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio" + }, + { + "duration": "8.0", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek" + }, + { + "duration": "22.0", + "name": "media.desktop/video.html?src=tulip2.vp9.webm" + }, + { + "duration": "14.0", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&background" + }, + { + "duration": "22.0", + "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "23.0", + "name": "memory.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "23.0", + "name": "memory.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "22.0", + "name": "memory.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "44.0", + "name": "memory.desktop/WebWorker" + }, + { + "duration": "36.0", + "name": "octane/Octane" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "35.0", + "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "43.0", + "name": "power.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "34.0", + "name": "power.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "44.0", + "name": "power.desktop/abcnews" + }, + { + "duration": "35.0", + "name": "power.desktop/indiatimes" + }, + { + "duration": "35.0", + "name": "power.desktop/instagram" + }, + { + "duration": "35.0", + "name": "power.desktop/microsoft" + }, + { + "duration": "40.0", + "name": "power.desktop/sina" + }, + { + "duration": "35.0", + "name": "power.desktop/slideshare" + }, + { + "duration": "37.0", + "name": "power.desktop/uol" + }, + { + "duration": "6.0", + "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" + }, + { + "duration": "24.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" + }, + { + "duration": "11.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" + }, + { + "duration": "14.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" + }, + { + "duration": "18.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" + }, + { + "duration": "9.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" + }, + { + "duration": "9.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" + }, + { + "duration": "7.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" + }, + { + "duration": "8.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" + }, + { + "duration": "12.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" + }, + { + "duration": "22.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" + }, + { + "duration": "13.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" + }, + { + "duration": "16.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" + }, + { + "duration": "17.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" + }, + { + "duration": "10.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" + }, + { + "duration": "27.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" + }, + { + "duration": "135.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" + }, + { + "duration": "84.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" + }, + { + "duration": "20.0", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" + }, + { + "duration": "18.0", + "name": "rendering.desktop/accu_weather_2018" + }, + { + "duration": "17.0", + "name": "rendering.desktop/accu_weather_pinch_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/amazon_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/amazon_pinch_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/analog_clock_svg" + }, + { + "duration": "17.0", + "name": "rendering.desktop/animometer_webgl" + }, + { + "duration": "16.0", + "name": "rendering.desktop/animometer_webgl_attrib_arrays" + }, + { + "duration": "17.0", + "name": "rendering.desktop/animometer_webgl_multi_draw" + }, + { + "duration": "17.0", + "name": "rendering.desktop/aquarium" + }, + { + "duration": "20.0", + "name": "rendering.desktop/aquarium_20k" + }, + { + "duration": "14.0", + "name": "rendering.desktop/background_color_animation" + }, + { + "duration": "14.0", + "name": "rendering.desktop/background_color_animation_with_gradient" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_css_key_frame_animations" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_css_transition_2_properties" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_css_transition_40_properties" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_css_transition_all_properties" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_javascript_canvas" + }, + { + "duration": "13.0", + "name": "rendering.desktop/balls_javascript_css" + }, + { + "duration": "14.0", + "name": "rendering.desktop/balls_svg_animations" + }, + { + "duration": "16.0", + "name": "rendering.desktop/blob" + }, + { + "duration": "15.0", + "name": "rendering.desktop/blogspot_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/blogspot_pinch_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/blur_rotating_background" + }, + { + "duration": "11.0", + "name": "rendering.desktop/booking.com_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/booking_pinch_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/bouncing_balls_15" + }, + { + "duration": "14.0", + "name": "rendering.desktop/bouncing_balls_shadow" + }, + { + "duration": "14.0", + "name": "rendering.desktop/bouncing_clipped_rectangles" + }, + { + "duration": "14.0", + "name": "rendering.desktop/bouncing_gradient_circles" + }, + { + "duration": "13.0", + "name": "rendering.desktop/bouncing_png_images" + }, + { + "duration": "17.0", + "name": "rendering.desktop/bouncing_svg_images" + }, + { + "duration": "19.0", + "name": "rendering.desktop/camera_to_webgl" + }, + { + "duration": "12.0", + "name": "rendering.desktop/canvas_05000_pixels_per_second" + }, + { + "duration": "11.0", + "name": "rendering.desktop/canvas_10000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/canvas_20000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/canvas_40000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/canvas_60000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/canvas_75000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/canvas_90000_pixels_per_second" + }, + { + "duration": "14.0", + "name": "rendering.desktop/canvas_animation_no_clear" + }, + { + "duration": "14.0", + "name": "rendering.desktop/canvas_arcs" + }, + { + "duration": "14.0", + "name": "rendering.desktop/canvas_font_cycler" + }, + { + "duration": "13.0", + "name": "rendering.desktop/canvas_lines" + }, + { + "duration": "13.0", + "name": "rendering.desktop/canvas_to_blob" + }, + { + "duration": "9.0", + "name": "rendering.desktop/cats_unscaled" + }, + { + "duration": "7.0", + "name": "rendering.desktop/cats_viewport_width" + }, + { + "duration": "16.0", + "name": "rendering.desktop/cc_poster_circle" + }, + { + "duration": "11.0", + "name": "rendering.desktop/cc_scroll_text_only" + }, + { + "duration": "16.0", + "name": "rendering.desktop/chip_tune" + }, + { + "duration": "13.0", + "name": "rendering.desktop/cnn_2018" + }, + { + "duration": "15.0", + "name": "rendering.desktop/cnn_pinch_2018" + }, + { + "duration": "23.0", + "name": "rendering.desktop/compositor_heavy_animation" + }, + { + "duration": "14.0", + "name": "rendering.desktop/crafty_mind" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_many_keyframes" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_animations_simultaneous_inline_style" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_animations_simultaneous_new_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_animations_simultaneous_style_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_animations_simultaneous_updating_class" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_animations_staggered_infinite_iterations" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_staggered_inline_style" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_staggered_new_element" + }, + { + "duration": "15.0", + "name": "rendering.desktop/css_animations_staggered_style_element" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_staggered_updating_class" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_triggered_inline_style" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_triggered_new_element" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_triggered_style_element" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_animations_triggered_updating_class" + }, + { + "duration": "16.0", + "name": "rendering.desktop/css_opacity_plus_n_layers_99" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_inline_style" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_new_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_staggered_inline_style" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_staggered_new_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_staggered_style_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_staggered_updating_class" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_style_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_triggered_inline_style" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_triggered_new_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_triggered_style_element" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_triggered_updating_class" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_transitions_updating_class" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_color" + }, + { + "duration": "14.0", + "name": "rendering.desktop/css_value_type_filter" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_length" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_length_complex" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_length_simple" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_path" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_shadow" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_transform_complex" + }, + { + "duration": "13.0", + "name": "rendering.desktop/css_value_type_transform_simple" + }, + { + "duration": "17.0", + "name": "rendering.desktop/dynamic_cube_map" + }, + { + "duration": "15.0", + "name": "rendering.desktop/earth" + }, + { + "duration": "12.0", + "name": "rendering.desktop/ebay_2018" + }, + { + "duration": "16.0", + "name": "rendering.desktop/ebay_pinch_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/effect_games" + }, + { + "duration": "19.0", + "name": "rendering.desktop/espn_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/espn_pinch_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/extra_large_texture_uploads" + }, + { + "duration": "12.0", + "name": "rendering.desktop/facebook_2018" + }, + { + "duration": "12.0", + "name": "rendering.desktop/facebook_pinch_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/fill_shapes" + }, + { + "duration": "15.0", + "name": "rendering.desktop/filter_terrain_svg" + }, + { + "duration": "13.0", + "name": "rendering.desktop/geo_apis" + }, + { + "duration": "12.0", + "name": "rendering.desktop/gmail_2018" + }, + { + "duration": "36.0", + "name": "rendering.desktop/gmail_move_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/gmail_pinch_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/google_calendar_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/google_calendar_pinch_2018" + }, + { + "duration": "12.0", + "name": "rendering.desktop/google_docs_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/google_image_pinch_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/google_image_search_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/google_plus_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/google_search_pinch_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/google_web_search_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/guimark_vector_chart" + }, + { + "duration": "13.0", + "name": "rendering.desktop/hakim" + }, + { + "duration": "24.0", + "name": "rendering.desktop/ie_chalkboard" + }, + { + "duration": "17.0", + "name": "rendering.desktop/ie_pirate_mark" + }, + { + "duration": "15.0", + "name": "rendering.desktop/infinite_scroll_element_n_layers_99" + }, + { + "duration": "15.0", + "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99" + }, + { + "duration": "15.0", + "name": "rendering.desktop/infinite_scroll_root_n_layers_99" + }, + { + "duration": "15.0", + "name": "rendering.desktop/jarro_doverson" + }, + { + "duration": "18.0", + "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization" + }, + { + "duration": "11.0", + "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization" + }, + { + "duration": "17.0", + "name": "rendering.desktop/js_full_screen_invalidation" + }, + { + "duration": "16.0", + "name": "rendering.desktop/js_opacity_plus_n_layers_99" + }, + { + "duration": "16.0", + "name": "rendering.desktop/js_paint_plus_n_layers_99" + }, + { + "duration": "16.0", + "name": "rendering.desktop/js_poster_circle" + }, + { + "duration": "15.0", + "name": "rendering.desktop/js_scroll_text_only" + }, + { + "duration": "16.0", + "name": "rendering.desktop/kevs_3d" + }, + { + "duration": "15.0", + "name": "rendering.desktop/keyframed_animations" + }, + { + "duration": "14.0", + "name": "rendering.desktop/large_texture_uploads" + }, + { + "duration": "10.0", + "name": "rendering.desktop/linkedin_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/linkedin_pinch_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_0fps_impl_60fps" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_15fps_impl_0fps" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_30fps_impl_0fps" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_30fps_impl_60fps" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_60fps_impl_0fps" + }, + { + "duration": "10.0", + "name": "rendering.desktop/main_60fps_impl_60fps" + }, + { + "duration": "14.0", + "name": "rendering.desktop/man_in_blue" + }, + { + "duration": "15.0", + "name": "rendering.desktop/many_images" + }, + { + "duration": "16.0", + "name": "rendering.desktop/many_planets_deep" + }, + { + "duration": "14.0", + "name": "rendering.desktop/maps_move_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/maps_perf_test" + }, + { + "duration": "13.0", + "name": "rendering.desktop/medium_texture_uploads" + }, + { + "duration": "13.0", + "name": "rendering.desktop/megi_dish" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_asteroid_belt" + }, + { + "duration": "15.0", + "name": "rendering.desktop/microsoft_fireflies" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_fish_ie_tank" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_performance" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_snow" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_speed_reading" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_tweet_map" + }, + { + "duration": "16.0", + "name": "rendering.desktop/microsoft_video_city" + }, + { + "duration": "14.0", + "name": "rendering.desktop/microsoft_worker_fountains" + }, + { + "duration": "14.0", + "name": "rendering.desktop/mix_10k" + }, + { + "duration": "13.0", + "name": "rendering.desktop/mix_blend_mode_animation_difference" + }, + { + "duration": "13.0", + "name": "rendering.desktop/mix_blend_mode_animation_hue" + }, + { + "duration": "13.0", + "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "13.0", + "name": "rendering.desktop/mix_blend_mode_animation_screen" + }, + { + "duration": "14.0", + "name": "rendering.desktop/motion_mark_canvas_fill_shapes" + }, + { + "duration": "14.0", + "name": "rendering.desktop/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "17.0", + "name": "rendering.desktop/new_tilings" + }, + { + "duration": "16.0", + "name": "rendering.desktop/nvidia_vertex_buffer_object" + }, + { + "duration": "15.0", + "name": "rendering.desktop/overlay_background_color_css_transitions_page" + }, + { + "duration": "16.0", + "name": "rendering.desktop/particles" + }, + { + "duration": "20.0", + "name": "rendering.desktop/pinterest_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/put_get_image_data" + }, + { + "duration": "11.0", + "name": "rendering.desktop/raf" + }, + { + "duration": "11.0", + "name": "rendering.desktop/raf_animation" + }, + { + "duration": "11.0", + "name": "rendering.desktop/raf_canvas" + }, + { + "duration": "11.0", + "name": "rendering.desktop/raf_touch_animation" + }, + { + "duration": "12.0", + "name": "rendering.desktop/repaint_amazon_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/repaint_cnn_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/repaint_facebook_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/repaint_google_search_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/repaint_instagram_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/repaint_reddit_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/repaint_theverge_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/repaint_twitter_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/repaint_wikipedia_2018" + }, + { + "duration": "10.0", + "name": "rendering.desktop/repaint_yahoo_homepage_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/runway_2019" + }, + { + "duration": "16.0", + "name": "rendering.desktop/san_angeles" + }, + { + "duration": "9.0", + "name": "rendering.desktop/second_batch_js_heavy" + }, + { + "duration": "9.0", + "name": "rendering.desktop/second_batch_js_light" + }, + { + "duration": "8.0", + "name": "rendering.desktop/second_batch_js_medium" + }, + { + "duration": "11.0", + "name": "rendering.desktop/simple_text_page" + }, + { + "duration": "13.0", + "name": "rendering.desktop/simple_touch_drag" + }, + { + "duration": "13.0", + "name": "rendering.desktop/small_texture_uploads" + }, + { + "duration": "14.0", + "name": "rendering.desktop/smash_cat" + }, + { + "duration": "13.0", + "name": "rendering.desktop/spielzeugz" + }, + { + "duration": "14.0", + "name": "rendering.desktop/stroke_shapes" + }, + { + "duration": "13.0", + "name": "rendering.desktop/sync_scroll_offset" + }, + { + "duration": "18.0", + "name": "rendering.desktop/techcrunch_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/text_05000_pixels_per_second" + }, + { + "duration": "10.0", + "name": "rendering.desktop/text_10000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_20000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_40000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_60000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_75000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_90000_pixels_per_second" + }, + { + "duration": "11.0", + "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "11.0", + "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "11.0", + "name": "rendering.desktop/text_hover_05000_pixels_per_second" + }, + { + "duration": "10.0", + "name": "rendering.desktop/text_hover_10000_pixels_per_second" + }, + { + "duration": "10.0", + "name": "rendering.desktop/text_hover_20000_pixels_per_second" + }, + { + "duration": "10.0", + "name": "rendering.desktop/text_hover_40000_pixels_per_second" + }, + { + "duration": "9.0", + "name": "rendering.desktop/text_hover_60000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_hover_75000_pixels_per_second" + }, + { + "duration": "8.0", + "name": "rendering.desktop/text_hover_90000_pixels_per_second" + }, + { + "duration": "14.0", + "name": "rendering.desktop/touch_handler_scrolling" + }, + { + "duration": "17.0", + "name": "rendering.desktop/transform_transitions" + }, + { + "duration": "16.0", + "name": "rendering.desktop/transform_transitions_js_block" + }, + { + "duration": "14.0", + "name": "rendering.desktop/twitch_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/twitch_pinch_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/twitter_2018" + }, + { + "duration": "12.0", + "name": "rendering.desktop/twitter_pinch_2018" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_color" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_length_3d" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_length_complex" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_length_simple" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_path" + }, + { + "duration": "17.0", + "name": "rendering.desktop/web_animation_value_type_shadow" + }, + { + "duration": "15.0", + "name": "rendering.desktop/web_animation_value_type_transform_complex" + }, + { + "duration": "15.0", + "name": "rendering.desktop/web_animation_value_type_transform_simple" + }, + { + "duration": "15.0", + "name": "rendering.desktop/web_animations_many_keyframes" + }, + { + "duration": "15.0", + "name": "rendering.desktop/web_animations_set_current_time" + }, + { + "duration": "14.0", + "name": "rendering.desktop/web_animations_simultaneous" + }, + { + "duration": "16.0", + "name": "rendering.desktop/web_animations_staggered_chaining" + }, + { + "duration": "16.0", + "name": "rendering.desktop/web_animations_staggered_infinite_iterations" + }, + { + "duration": "19.0", + "name": "rendering.desktop/web_animations_staggered_triggering_page" + }, + { + "duration": "11.0", + "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization" + }, + { + "duration": "12.0", + "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization" + }, + { + "duration": "14.0", + "name": "rendering.desktop/wikipedia_2018" + }, + { + "duration": "13.0", + "name": "rendering.desktop/wordpress_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/yahoo_answers_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/yahoo_news_2018" + }, + { + "duration": "11.0", + "name": "rendering.desktop/yahoo_news_pinch_2018" + }, + { + "duration": "14.0", + "name": "rendering.desktop/yahoo_sports_2018" + }, + { + "duration": "12.0", + "name": "rendering.desktop/yahoo_sports_pinch_2018" + }, + { + "duration": "34.0", + "name": "speedometer-future/http://browserbench.org/Speedometer/" + }, + { + "duration": "30.0", + "name": "speedometer/http://browserbench.org/Speedometer/" + }, + { + "duration": "78.0", + "name": "speedometer2-future/Speedometer2" + }, + { + "duration": "55.0", + "name": "speedometer2/Speedometer2" + }, + { + "duration": "60.0", + "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "38.0", + "name": "system_health.common_desktop/browse:media:googleplaystore:2018" + }, + { + "duration": "73.0", + "name": "system_health.common_desktop/browse:media:imgur" + }, + { + "duration": "84.0", + "name": "system_health.common_desktop/browse:media:pinterest:2018" + }, + { + "duration": "55.0", + "name": "system_health.common_desktop/browse:media:tumblr:2018" + }, + { + "duration": "60.0", + "name": "system_health.common_desktop/browse:media:youtubetv:2019" + }, + { + "duration": "40.0", + "name": "system_health.common_desktop/browse:news:cnn:2018" + }, + { + "duration": "45.0", + "name": "system_health.common_desktop/browse:news:flipboard:2018" + }, + { + "duration": "64.0", + "name": "system_health.common_desktop/browse:news:nytimes:2018" + }, + { + "duration": "49.0", + "name": "system_health.common_desktop/browse:news:reddit:2018" + }, + { + "duration": "45.0", + "name": "system_health.common_desktop/browse:search:google" + }, + { + "duration": "43.0", + "name": "system_health.common_desktop/browse:search:google:2018" + }, + { + "duration": "30.0", + "name": "system_health.common_desktop/browse:search:google_india:2018" + }, + { + "duration": "69.0", + "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018" + }, + { + "duration": "0.0", + "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018" + }, + { + "duration": "43.0", + "name": "system_health.common_desktop/browse:social:twitter:2018" + }, + { + "duration": "60.0", + "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018" + }, + { + "duration": "55.0", + "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018" + }, + { + "duration": "55.0", + "name": "system_health.common_desktop/browse:tools:earth" + }, + { + "duration": "47.0", + "name": "system_health.common_desktop/browse:tools:maps" + }, + { + "duration": "68.0", + "name": "system_health.common_desktop/browse:tools:maps:2019" + }, + { + "duration": "24.0", + "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018" + }, + { + "duration": "13.0", + "name": "system_health.common_desktop/load:chrome:blank" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:games:alphabetty:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:games:bubbles" + }, + { + "duration": "14.0", + "name": "system_health.common_desktop/load:games:bubbles:2019" + }, + { + "duration": "13.0", + "name": "system_health.common_desktop/load:games:lazors" + }, + { + "duration": "18.0", + "name": "system_health.common_desktop/load:games:miniclip:2018" + }, + { + "duration": "19.0", + "name": "system_health.common_desktop/load:games:spychase:2018" + }, + { + "duration": "18.0", + "name": "system_health.common_desktop/load:media:9gag" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:media:dailymotion" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:media:facebook_photos:2018" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:media:flickr:2018" + }, + { + "duration": "14.0", + "name": "system_health.common_desktop/load:media:google_images:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:media:imgur:2018" + }, + { + "duration": "17.0", + "name": "system_health.common_desktop/load:media:soundcloud:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:media:youtube:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:news:bbc:2018" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:news:cnn:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:news:flipboard" + }, + { + "duration": "14.0", + "name": "system_health.common_desktop/load:news:hackernews:2018" + }, + { + "duration": "17.0", + "name": "system_health.common_desktop/load:news:nytimes:2018" + }, + { + "duration": "19.0", + "name": "system_health.common_desktop/load:news:qq" + }, + { + "duration": "18.0", + "name": "system_health.common_desktop/load:news:qq:2018" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:news:reddit:2018" + }, + { + "duration": "17.0", + "name": "system_health.common_desktop/load:news:wikipedia:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:search:amazon:2018" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:search:baidu:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:search:ebay:2018" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:search:flipkart:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:search:google:2018" + }, + { + "duration": "18.0", + "name": "system_health.common_desktop/load:search:taobao:2018" + }, + { + "duration": "14.0", + "name": "system_health.common_desktop/load:search:yahoo:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:search:yandex:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:social:instagram:2018" + }, + { + "duration": "33.0", + "name": "system_health.common_desktop/load:social:pinterest" + }, + { + "duration": "30.0", + "name": "system_health.common_desktop/load:social:vk" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:social:vk:2018" + }, + { + "duration": "21.0", + "name": "system_health.common_desktop/load:tools:docs" + }, + { + "duration": "19.0", + "name": "system_health.common_desktop/load:tools:drive" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:tools:dropbox" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load:tools:gmail" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load:tools:stackoverflow:2018" + }, + { + "duration": "19.0", + "name": "system_health.common_desktop/load:tools:weather" + }, + { + "duration": "16.0", + "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018" + }, + { + "duration": "15.0", + "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018" + }, + { + "duration": "117.0", + "name": "system_health.common_desktop/long_running:tools:gmail-background" + }, + { + "duration": "43.0", + "name": "system_health.common_desktop/play:media:google_play_music" + }, + { + "duration": "40.0", + "name": "system_health.common_desktop/play:media:soundcloud:2018" + }, + { + "duration": "36.0", + "name": "system_health.memory_desktop/browse:media:googleplaystore:2018" + }, + { + "duration": "62.0", + "name": "system_health.memory_desktop/browse:media:imgur" + }, + { + "duration": "80.0", + "name": "system_health.memory_desktop/browse:media:pinterest:2018" + }, + { + "duration": "51.0", + "name": "system_health.memory_desktop/browse:media:tumblr:2018" + }, + { + "duration": "0.0", + "name": "system_health.memory_desktop/browse:media:youtube:2019" + }, + { + "duration": "57.0", + "name": "system_health.memory_desktop/browse:media:youtubetv:2019" + }, + { + "duration": "34.0", + "name": "system_health.memory_desktop/browse:news:cnn:2018" + }, + { + "duration": "41.0", + "name": "system_health.memory_desktop/browse:news:flipboard:2018" + }, + { + "duration": "49.0", + "name": "system_health.memory_desktop/browse:news:hackernews:2018" + }, + { + "duration": "56.0", + "name": "system_health.memory_desktop/browse:news:nytimes:2018" + }, + { + "duration": "42.0", + "name": "system_health.memory_desktop/browse:news:reddit:2018" + }, + { + "duration": "44.0", + "name": "system_health.memory_desktop/browse:search:google" + }, + { + "duration": "40.0", + "name": "system_health.memory_desktop/browse:search:google:2018" + }, + { + "duration": "27.0", + "name": "system_health.memory_desktop/browse:search:google_india:2018" + }, + { + "duration": "63.0", + "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018" + }, + { + "duration": "40.0", + "name": "system_health.memory_desktop/browse:social:twitter:2018" + }, + { + "duration": "56.0", + "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018" + }, + { + "duration": "51.0", + "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018" + }, + { + "duration": "48.0", + "name": "system_health.memory_desktop/browse:tools:earth" + }, + { + "duration": "43.0", + "name": "system_health.memory_desktop/browse:tools:maps" + }, + { + "duration": "62.0", + "name": "system_health.memory_desktop/browse:tools:maps:2019" + }, + { + "duration": "22.0", + "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:chrome:blank" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:games:alphabetty:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:games:bubbles" + }, + { + "duration": "12.0", + "name": "system_health.memory_desktop/load:games:bubbles:2019" + }, + { + "duration": "12.0", + "name": "system_health.memory_desktop/load:games:lazors" + }, + { + "duration": "16.0", + "name": "system_health.memory_desktop/load:games:miniclip:2018" + }, + { + "duration": "17.0", + "name": "system_health.memory_desktop/load:games:spychase:2018" + }, + { + "duration": "20.0", + "name": "system_health.memory_desktop/load:media:9gag" + }, + { + "duration": "20.0", + "name": "system_health.memory_desktop/load:media:dailymotion" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:media:facebook_photos:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:media:flickr:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:media:google_images:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:media:imgur:2018" + }, + { + "duration": "16.0", + "name": "system_health.memory_desktop/load:media:soundcloud:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:media:youtube:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:news:bbc:2018" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:news:cnn:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:news:flipboard" + }, + { + "duration": "12.0", + "name": "system_health.memory_desktop/load:news:hackernews:2018" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:news:nytimes:2018" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:news:qq" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:news:qq:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:news:reddit:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:news:wikipedia:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:search:amazon:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:search:baidu:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:search:ebay:2018" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:search:flipkart:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:search:google:2018" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:search:taobao:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:search:yahoo:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:search:yandex:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:social:instagram:2018" + }, + { + "duration": "21.0", + "name": "system_health.memory_desktop/load:social:pinterest" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:social:vk" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:social:vk:2018" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:tools:docs" + }, + { + "duration": "15.0", + "name": "system_health.memory_desktop/load:tools:drive" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:tools:dropbox" + }, + { + "duration": "14.0", + "name": "system_health.memory_desktop/load:tools:gmail" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load:tools:stackoverflow:2018" + }, + { + "duration": "16.0", + "name": "system_health.memory_desktop/load:tools:weather" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018" + }, + { + "duration": "13.0", + "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018" + }, + { + "duration": "132.0", + "name": "system_health.memory_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "0.0", + "name": "system_health.memory_desktop/multitab:misc:typical24" + }, + { + "duration": "37.0", + "name": "system_health.memory_desktop/play:media:soundcloud:2018" + }, + { + "duration": "0.0", + "name": "tab_switching.typical_25/multitab:misc:typical24" + }, + { + "duration": "12.0", + "name": "tracing.tracing_with_background_memory_infra/Facebook" + }, + { + "duration": "12.0", + "name": "tracing.tracing_with_background_memory_infra/Wikipedia" + }, + { + "duration": "11.0", + "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" + }, + { + "duration": "11.0", + "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" + }, + { + "duration": "10.0", + "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" + }, + { + "duration": "11.0", + "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" + }, + { + "duration": "12.0", + "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" + }, + { + "duration": "12.0", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "11.0", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" + }, + { + "duration": "65.0", + "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll" + }, + { + "duration": "42.0", + "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018" + }, + { + "duration": "0.0", + "name": "v8.browsing_desktop-future/browse:media:imgur" + }, + { + "duration": "88.0", + "name": "v8.browsing_desktop-future/browse:media:pinterest:2018" + }, + { + "duration": "59.0", + "name": "v8.browsing_desktop-future/browse:media:tumblr:2018" + }, + { + "duration": "77.0", + "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019" + }, + { + "duration": "45.0", + "name": "v8.browsing_desktop-future/browse:news:cnn:2018" + }, + { + "duration": "49.0", + "name": "v8.browsing_desktop-future/browse:news:flipboard:2018" + }, + { + "duration": "73.0", + "name": "v8.browsing_desktop-future/browse:news:nytimes:2018" + }, + { + "duration": "56.0", + "name": "v8.browsing_desktop-future/browse:news:reddit:2018" + }, + { + "duration": "0.0", + "name": "v8.browsing_desktop-future/browse:search:google" + }, + { + "duration": "47.0", + "name": "v8.browsing_desktop-future/browse:search:google:2018" + }, + { + "duration": "31.0", + "name": "v8.browsing_desktop-future/browse:search:google_india:2018" + }, + { + "duration": "80.0", + "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018" + }, + { + "duration": "45.0", + "name": "v8.browsing_desktop-future/browse:social:twitter:2018" + }, + { + "duration": "66.0", + "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018" + }, + { + "duration": "61.0", + "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018" + }, + { + "duration": "70.0", + "name": "v8.browsing_desktop-future/browse:tools:earth" + }, + { + "duration": "52.0", + "name": "v8.browsing_desktop-future/browse:tools:maps" + }, + { + "duration": "75.0", + "name": "v8.browsing_desktop-future/browse:tools:maps:2019" + }, + { + "duration": "65.0", + "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "41.0", + "name": "v8.browsing_desktop/browse:media:googleplaystore:2018" + }, + { + "duration": "0.0", + "name": "v8.browsing_desktop/browse:media:imgur" + }, + { + "duration": "88.0", + "name": "v8.browsing_desktop/browse:media:pinterest:2018" + }, + { + "duration": "60.0", + "name": "v8.browsing_desktop/browse:media:tumblr:2018" + }, + { + "duration": "63.0", + "name": "v8.browsing_desktop/browse:media:youtubetv:2019" + }, + { + "duration": "66.0", + "name": "v8.browsing_desktop/browse:news:cnn:2018" + }, + { + "duration": "49.0", + "name": "v8.browsing_desktop/browse:news:flipboard:2018" + }, + { + "duration": "72.0", + "name": "v8.browsing_desktop/browse:news:nytimes:2018" + }, + { + "duration": "56.0", + "name": "v8.browsing_desktop/browse:news:reddit:2018" + }, + { + "duration": "63.0", + "name": "v8.browsing_desktop/browse:search:google" + }, + { + "duration": "45.0", + "name": "v8.browsing_desktop/browse:search:google:2018" + }, + { + "duration": "31.0", + "name": "v8.browsing_desktop/browse:search:google_india:2018" + }, + { + "duration": "80.0", + "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018" + }, + { + "duration": "45.0", + "name": "v8.browsing_desktop/browse:social:twitter:2018" + }, + { + "duration": "66.0", + "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018" + }, + { + "duration": "62.0", + "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018" + }, + { + "duration": "59.0", + "name": "v8.browsing_desktop/browse:tools:earth" + }, + { + "duration": "51.0", + "name": "v8.browsing_desktop/browse:tools:maps" + }, + { + "duration": "75.0", + "name": "v8.browsing_desktop/browse:tools:maps:2019" + }, + { + "duration": "0.0", + "name": "v8.browsing_desktop/browse:tools:sheets:2019" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsAMPAds_cold" + }, + { + "duration": "39.0", + "name": "v8.runtime_stats.top_25/AdsAMPAds_hot" + }, + { + "duration": "35.0", + "name": "v8.runtime_stats.top_25/AdsAMPAds_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold" + }, + { + "duration": "40.0", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot" + }, + { + "duration": "36.0", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold" + }, + { + "duration": "40.0", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold" + }, + { + "duration": "39.0", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot" + }, + { + "duration": "35.0", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm" + }, + { + "duration": "34.0", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold" + }, + { + "duration": "70.0", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot" + }, + { + "duration": "52.0", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold" + }, + { + "duration": "34.0", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot" + }, + { + "duration": "32.0", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm" + }, + { + "duration": "26.0", + "name": "v8.runtime_stats.top_25/http://weibo.com_cold" + }, + { + "duration": "32.0", + "name": "v8.runtime_stats.top_25/http://weibo.com_hot" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://weibo.com_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm" + }, + { + "duration": "26.0", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold" + }, + { + "duration": "42.0", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot" + }, + { + "duration": "39.0", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold" + }, + { + "duration": "32.0", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm" + }, + { + "duration": "36.0", + "name": "v8.runtime_stats.top_25/http://www.qq.com_cold" + }, + { + "duration": "44.0", + "name": "v8.runtime_stats.top_25/http://www.qq.com_hot" + }, + { + "duration": "45.0", + "name": "v8.runtime_stats.top_25/http://www.qq.com_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold" + }, + { + "duration": "32.0", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot" + }, + { + "duration": "48.0", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm" + }, + { + "duration": "38.0", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm" + }, + { + "duration": "34.0", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold" + }, + { + "duration": "45.0", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot" + }, + { + "duration": "45.0", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm" + }, + { + "duration": "23.0", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold" + }, + { + "duration": "33.0", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot" + }, + { + "duration": "28.0", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold" + }, + { + "duration": "35.0", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot" + }, + { + "duration": "32.0", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm" + }, + { + "duration": "26.0", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm" + }, + { + "duration": "24.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold" + }, + { + "duration": "30.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot" + }, + { + "duration": "29.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm" + }, + { + "duration": "25.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot" + }, + { + "duration": "31.0", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm" + }, + { + "duration": "21.0", + "name": "webrtc/10s_datachannel_transfer" + }, + { + "duration": "13.0", + "name": "webrtc/canvas_capture_peer_connection" + }, + { + "duration": "23.0", + "name": "webrtc/codec_constraints_h264" + }, + { + "duration": "23.0", + "name": "webrtc/codec_constraints_vp8" + }, + { + "duration": "23.0", + "name": "webrtc/codec_constraints_vp9" + }, + { + "duration": "13.0", + "name": "webrtc/hd_local_stream_10s" + }, + { + "duration": "32.0", + "name": "webrtc/multiple_peerconnections" + }, + { + "duration": "41.0", + "name": "webrtc/pause_play_peerconnections" + } +] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/win-10_laptop_low_end-perf_map.json b/tools/perf/core/shard_maps/win-10_laptop_low_end-perf_map.json new file mode 100644 index 0000000..23666f7 --- /dev/null +++ b/tools/perf/core/shard_maps/win-10_laptop_low_end-perf_map.json
@@ -0,0 +1,366 @@ +{ + "0": { + "benchmarks": { + "blink_perf.accessibility": { + "abridged": false + }, + "blink_perf.bindings": { + "abridged": false + }, + "blink_perf.canvas": { + "abridged": false + }, + "blink_perf.css": { + "end": 30, + "abridged": false + } + } + }, + "1": { + "benchmarks": { + "blink_perf.css": { + "begin": 30, + "abridged": false + }, + "blink_perf.dom": { + "abridged": false + }, + "blink_perf.events": { + "abridged": false + }, + "blink_perf.image_decoder": { + "abridged": false + }, + "blink_perf.layout": { + "abridged": false + }, + "blink_perf.owp_storage": { + "abridged": false + }, + "blink_perf.paint": { + "end": 2, + "abridged": false + } + } + }, + "2": { + "benchmarks": { + "blink_perf.paint": { + "begin": 2, + "abridged": false + }, + "blink_perf.parser": { + "abridged": false + }, + "blink_perf.shadow_dom": { + "abridged": false + }, + "blink_perf.svg": { + "abridged": false + }, + "dromaeo": { + "abridged": false + }, + "dummy_benchmark.noisy_benchmark_1": { + "abridged": false + }, + "dummy_benchmark.stable_benchmark_1": { + "abridged": false + }, + "jetstream": { + "abridged": false + } + } + }, + "3": { + "benchmarks": { + "jetstream2": { + "abridged": false + }, + "kraken": { + "abridged": false + }, + "loading.desktop": { + "end": 32, + "abridged": false + } + } + }, + "4": { + "benchmarks": { + "loading.desktop": { + "begin": 32, + "end": 67, + "abridged": false + } + } + }, + "5": { + "benchmarks": { + "loading.desktop": { + "begin": 67, + "abridged": false + }, + "media.desktop": { + "end": 1, + "abridged": false + } + } + }, + "6": { + "benchmarks": { + "media.desktop": { + "begin": 1, + "abridged": false + }, + "memory.desktop": { + "end": 6, + "abridged": false + } + } + }, + "7": { + "benchmarks": { + "memory.desktop": { + "begin": 6, + "abridged": false + }, + "octane": { + "abridged": false + }, + "power.desktop": { + "abridged": false + }, + "rasterize_and_record_micro.partial_invalidation": { + "abridged": false + } + } + }, + "8": { + "benchmarks": { + "rasterize_and_record_micro.top_25": { + "abridged": false + }, + "rendering.desktop": { + "end": 42, + "abridged": false + } + } + }, + "9": { + "benchmarks": { + "rendering.desktop": { + "begin": 42, + "end": 117, + "abridged": false + } + } + }, + "10": { + "benchmarks": { + "rendering.desktop": { + "begin": 117, + "end": 212, + "abridged": false + } + } + }, + "11": { + "benchmarks": { + "rendering.desktop": { + "begin": 212, + "abridged": false + }, + "speedometer": { + "abridged": false + }, + "speedometer-future": { + "abridged": false + }, + "speedometer2": { + "abridged": false + }, + "speedometer2-future": { + "abridged": false + }, + "system_health.common_desktop": { + "end": 9, + "abridged": false + } + } + }, + "12": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 9, + "end": 50, + "abridged": false + } + } + }, + "13": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 50, + "abridged": false + }, + "system_health.memory_desktop": { + "end": 3, + "abridged": false + } + } + }, + "14": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 3, + "end": 12, + "abridged": false + } + } + }, + "15": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 12, + "end": 22, + "abridged": false + } + } + }, + "16": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 22, + "end": 45, + "abridged": false + } + } + }, + "17": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 45, + "end": 63, + "abridged": false + } + } + }, + "18": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 63, + "end": 71, + "abridged": false + } + } + }, + "19": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 71, + "abridged": false + }, + "tab_switching.typical_25": { + "abridged": false + }, + "tracing.tracing_with_background_memory_infra": { + "abridged": false + }, + "v8.browsing_desktop": { + "end": 2, + "abridged": false + } + } + }, + "20": { + "benchmarks": { + "v8.browsing_desktop": { + "begin": 2, + "abridged": false + } + } + }, + "21": { + "benchmarks": { + "v8.browsing_desktop-future": { + "end": 23, + "abridged": false + } + } + }, + "22": { + "benchmarks": { + "v8.browsing_desktop-future": { + "begin": 23, + "abridged": false + }, + "v8.runtime_stats.top_25": { + "end": 31, + "abridged": false + } + } + }, + "23": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 31, + "end": 66, + "abridged": false + } + } + }, + "24": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 66, + "end": 101, + "abridged": false + } + } + }, + "25": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 101, + "abridged": false + }, + "webrtc": { + "abridged": false + } + } + }, + "extra_infos": { + "num_stories": 1149, + "predicted_min_shard_time": 1626.0, + "predicted_min_shard_index": 17, + "predicted_max_shard_time": 2430.0, + "predicted_max_shard_index": 18, + "shard #0": 2008.0, + "shard #1": 1998.0, + "shard #2": 1984.0, + "shard #3": 2024.0, + "shard #4": 2036.0, + "shard #5": 1984.0, + "shard #6": 1980.0, + "shard #7": 2026.0, + "shard #8": 2032.0, + "shard #9": 1990.0, + "shard #10": 2002.0, + "shard #11": 1960.0, + "shard #12": 2068.0, + "shard #13": 2016.0, + "shard #14": 1974.0, + "shard #15": 2070.0, + "shard #16": 1968.0, + "shard #17": 1626.0, + "shard #18": 2430.0, + "shard #19": 1936.0, + "shard #20": 2026.0, + "shard #21": 1978.0, + "shard #22": 1994.0, + "shard #23": 2040.0, + "shard #24": 1984.0, + "shard #25": 2018.0 + } +} \ No newline at end of file
diff --git a/tools/perf/cycletime_contributions.csv b/tools/perf/cycletime_contributions.csv index dc9f3aa..db2df3e 100644 --- a/tools/perf/cycletime_contributions.csv +++ b/tools/perf/cycletime_contributions.csv
@@ -1,54 +1,54 @@ AUTOGENERATED FILE DO NOT EDIT View a prettier version of this at,https://docs.google.com/spreadsheets/d/15pJY4cxtM2NVNFKQDgDnoT5PLo0Nm5Td-Ov-5PZefAw -platform,Android Nexus5 Perf,Android Nexus5X WebView Perf,Android Nexus6 WebView Perf,Win 7 Nvidia GPU Perf,Win 7 Perf,android-go-perf,android-go_webview-perf,android-nexus5x-perf,android-pixel2-perf,android-pixel2_weblayer-perf,android-pixel2_webview-perf,linux-perf,mac-10_12_laptop_low_end-perf,mac-10_13_laptop_high_end-perf,win-10-perf -shards,16,16,12,5,5,19,13,10,35,4,21,26,26,26,26 -idealized cycle time (hours),1.83,0.51,0.65,2.11,1.85,0.59,0.22,1.17,0.47,0.11,0.28,0.34,0.33,0.30,0.42 -blink_perf.accessibility,0.002,0.001,0.002,0.003,0.004,0.000,0.000,0.003,0.001,0.000,0.001,0.001,0.001,0.001,0.001 -blink_perf.bindings,0.046,0.014,0.028,0.040,0.044,0.000,0.000,0.048,0.013,0.000,0.009,0.006,0.008,0.007,0.008 -blink_perf.canvas,0.033,0.000,0.012,0.045,0.011,0.000,0.000,0.000,0.011,0.000,0.005,0.006,0.009,0.008,0.007 -blink_perf.css,0.015,0.004,0.005,0.025,0.025,0.000,0.000,0.019,0.005,0.000,0.002,0.003,0.004,0.003,0.006 -blink_perf.display_locking,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.047,0.000,0.000,0.000,0.000,0.004,0.000,0.000 -blink_perf.dom,0.015,0.005,0.006,0.008,0.009,0.000,0.000,0.016,0.003,0.000,0.002,0.001,0.002,0.002,0.002 -blink_perf.events,0.012,0.002,0.006,0.010,0.010,0.000,0.000,0.013,0.003,0.000,0.002,0.001,0.002,0.001,0.002 -blink_perf.image_decoder,0.014,0.005,0.006,0.012,0.013,0.000,0.000,0.019,0.006,0.000,0.004,0.001,0.003,0.002,0.002 -blink_perf.layout,0.100,0.029,0.050,0.067,0.077,0.000,0.000,0.107,0.023,0.000,0.014,0.009,0.013,0.012,0.014 -blink_perf.owp_storage,0.006,0.001,0.002,0.006,0.006,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001 -blink_perf.paint,0.000,0.000,0.000,0.021,0.022,0.000,0.000,0.000,0.006,0.000,0.004,0.002,0.004,0.003,0.004 -blink_perf.parser,0.038,0.010,0.017,0.026,0.028,0.000,0.000,0.040,0.008,0.000,0.005,0.004,0.005,0.005,0.005 -blink_perf.shadow_dom,0.031,0.000,0.011,0.014,0.018,0.000,0.000,0.000,0.008,0.000,0.004,0.001,0.002,0.002,0.004 -blink_perf.svg,0.014,0.003,0.005,0.007,0.009,0.000,0.000,0.010,0.004,0.000,0.002,0.001,0.001,0.001,0.002 -dromaeo,0.007,0.003,0.004,0.016,0.016,0.000,0.000,0.010,0.003,0.000,0.002,0.002,0.003,0.003,0.003 -dummy_benchmark.noisy_benchmark_1,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -dummy_benchmark.stable_benchmark_1,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -jetstream,0.000,0.000,0.000,0.019,0.021,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.004,0.004,0.004 -jetstream2,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.000,0.000,0.003,0.000,0.004,0.003 -kraken,0.007,0.002,0.002,0.002,0.003,0.000,0.000,0.006,0.001,0.000,0.001,0.000,0.001,0.001,0.001 -loading.desktop,0.000,0.000,0.000,0.132,0.147,0.000,0.000,0.000,0.000,0.000,0.000,0.017,0.025,0.021,0.027 -loading.mobile,0.080,0.019,0.024,0.000,0.000,0.000,0.000,0.078,0.023,0.000,0.012,0.000,0.000,0.000,0.000 -media.desktop,0.000,0.000,0.000,0.036,0.039,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.007,0.006,0.007 -media.mobile,0.023,0.000,0.000,0.000,0.000,0.000,0.000,0.024,0.006,0.000,0.000,0.000,0.000,0.000,0.000 -memory.desktop,0.000,0.000,0.000,0.023,0.024,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.003,0.003,0.005 -octane,0.005,0.001,0.002,0.004,0.005,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001 -power.desktop,0.000,0.000,0.000,0.058,0.058,0.000,0.000,0.000,0.000,0.000,0.000,0.010,0.011,0.011,0.012 -rasterize_and_record_micro.partial_invalidation,0.001,0.000,0.001,0.001,0.001,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -rasterize_and_record_micro.top_25,0.047,0.014,0.022,0.055,0.062,0.000,0.000,0.049,0.012,0.000,0.009,0.007,0.008,0.008,0.011 -rendering.desktop,0.000,0.000,0.000,0.347,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.057,0.070,0.064,0.070 -rendering.mobile,0.637,0.229,0.207,0.000,0.000,0.000,0.000,0.020,0.156,0.000,0.092,0.000,0.000,0.000,0.000 -speedometer,0.005,0.002,0.002,0.004,0.005,0.004,0.003,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001 -speedometer-future,0.005,0.002,0.002,0.004,0.005,0.000,0.000,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001 -speedometer2,0.008,0.002,0.003,0.007,0.011,0.008,0.006,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.001 -speedometer2-future,0.008,0.002,0.003,0.009,0.010,0.000,0.000,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.002 -startup.mobile,0.024,0.000,0.000,0.000,0.000,0.029,0.000,0.025,0.007,0.012,0.000,0.000,0.000,0.000,0.000 -system_health.common_desktop,0.000,0.000,0.000,0.211,0.202,0.000,0.000,0.000,0.000,0.000,0.000,0.042,0.042,0.039,0.044 -system_health.common_mobile,0.234,0.065,0.080,0.000,0.000,0.204,0.123,0.263,0.053,0.048,0.037,0.000,0.000,0.000,0.000 -system_health.memory_desktop,0.000,0.000,0.000,0.193,0.182,0.000,0.000,0.000,0.000,0.000,0.000,0.028,0.036,0.033,0.038 -system_health.memory_mobile,0.152,0.046,0.075,0.000,0.000,0.144,0.086,0.051,0.050,0.050,0.035,0.000,0.000,0.000,0.000 -system_health.webview_startup,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -tab_switching.typical_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -tracing.tracing_with_background_memory_infra,0.008,0.001,0.002,0.010,0.012,0.000,0.000,0.008,0.002,0.000,0.001,0.001,0.001,0.001,0.002 -v8.browsing_desktop,0.000,0.000,0.000,0.124,0.110,0.000,0.000,0.000,0.000,0.000,0.000,0.020,0.024,0.022,0.024 -v8.browsing_desktop-future,0.000,0.000,0.000,0.116,0.105,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.025,0.022,0.023 -v8.browsing_mobile,0.235,0.048,0.066,0.000,0.000,0.198,0.000,0.263,0.045,0.000,0.029,0.000,0.000,0.000,0.000 -v8.browsing_mobile-future,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -v8.runtime_stats.top_25,0.000,0.000,0.000,0.433,0.540,0.000,0.000,0.000,0.000,0.000,0.000,0.074,0.000,0.000,0.083 -webrtc,0.015,0.004,0.006,0.019,0.021,0.000,0.000,0.016,0.004,0.000,0.003,0.004,0.004,0.004,0.004 +platform,Android Nexus5 Perf,Android Nexus5X WebView Perf,Android Nexus6 WebView Perf,Win 7 Nvidia GPU Perf,Win 7 Perf,android-go-perf,android-go_webview-perf,android-nexus5x-perf,android-pixel2-perf,android-pixel2_weblayer-perf,android-pixel2_webview-perf,linux-perf,mac-10_12_laptop_low_end-perf,mac-10_13_laptop_high_end-perf,win-10-perf,win-10_laptop_low_end-perf +shards,16,16,12,5,5,19,13,10,35,4,21,26,26,26,26,26 +idealized cycle time (hours),1.83,0.51,0.65,2.11,1.85,0.59,0.22,1.17,0.47,0.11,0.28,0.34,0.33,0.30,0.42,0.42 +blink_perf.accessibility,0.002,0.001,0.002,0.003,0.004,0.000,0.000,0.003,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001 +blink_perf.bindings,0.046,0.014,0.028,0.040,0.044,0.000,0.000,0.048,0.013,0.000,0.009,0.006,0.008,0.007,0.008,0.008 +blink_perf.canvas,0.033,0.000,0.012,0.045,0.011,0.000,0.000,0.000,0.011,0.000,0.005,0.006,0.009,0.008,0.007,0.007 +blink_perf.css,0.015,0.004,0.005,0.025,0.025,0.000,0.000,0.019,0.005,0.000,0.002,0.003,0.004,0.003,0.006,0.006 +blink_perf.display_locking,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.047,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.000 +blink_perf.dom,0.015,0.005,0.006,0.008,0.009,0.000,0.000,0.016,0.003,0.000,0.002,0.001,0.002,0.002,0.002,0.002 +blink_perf.events,0.012,0.002,0.006,0.010,0.010,0.000,0.000,0.013,0.003,0.000,0.002,0.001,0.002,0.001,0.002,0.002 +blink_perf.image_decoder,0.014,0.005,0.006,0.012,0.013,0.000,0.000,0.019,0.006,0.000,0.004,0.001,0.003,0.002,0.002,0.002 +blink_perf.layout,0.100,0.029,0.050,0.067,0.077,0.000,0.000,0.107,0.023,0.000,0.014,0.009,0.013,0.012,0.014,0.014 +blink_perf.owp_storage,0.006,0.001,0.002,0.006,0.006,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001 +blink_perf.paint,0.000,0.000,0.000,0.021,0.022,0.000,0.000,0.000,0.006,0.000,0.004,0.002,0.004,0.003,0.004,0.004 +blink_perf.parser,0.038,0.010,0.017,0.026,0.028,0.000,0.000,0.040,0.008,0.000,0.005,0.004,0.005,0.005,0.005,0.005 +blink_perf.shadow_dom,0.031,0.000,0.011,0.014,0.018,0.000,0.000,0.000,0.008,0.000,0.004,0.001,0.002,0.002,0.004,0.004 +blink_perf.svg,0.014,0.003,0.005,0.007,0.009,0.000,0.000,0.010,0.004,0.000,0.002,0.001,0.001,0.001,0.002,0.002 +dromaeo,0.007,0.003,0.004,0.016,0.016,0.000,0.000,0.010,0.003,0.000,0.002,0.002,0.003,0.003,0.003,0.003 +dummy_benchmark.noisy_benchmark_1,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +dummy_benchmark.stable_benchmark_1,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +jetstream,0.000,0.000,0.000,0.019,0.021,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.004,0.004,0.004,0.004 +jetstream2,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.000,0.000,0.003,0.000,0.004,0.003,0.003 +kraken,0.007,0.002,0.002,0.002,0.003,0.000,0.000,0.006,0.001,0.000,0.001,0.000,0.001,0.001,0.001,0.001 +loading.desktop,0.000,0.000,0.000,0.132,0.147,0.000,0.000,0.000,0.000,0.000,0.000,0.017,0.025,0.021,0.027,0.027 +loading.mobile,0.080,0.019,0.024,0.000,0.000,0.000,0.000,0.078,0.023,0.000,0.012,0.000,0.000,0.000,0.000,0.000 +media.desktop,0.000,0.000,0.000,0.036,0.039,0.000,0.000,0.000,0.000,0.000,0.000,0.006,0.007,0.006,0.007,0.007 +media.mobile,0.023,0.000,0.000,0.000,0.000,0.000,0.000,0.024,0.006,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +memory.desktop,0.000,0.000,0.000,0.023,0.024,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.003,0.003,0.005,0.005 +octane,0.005,0.001,0.002,0.004,0.005,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001 +power.desktop,0.000,0.000,0.000,0.058,0.058,0.000,0.000,0.000,0.000,0.000,0.000,0.010,0.011,0.011,0.012,0.012 +rasterize_and_record_micro.partial_invalidation,0.001,0.000,0.001,0.001,0.001,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +rasterize_and_record_micro.top_25,0.047,0.014,0.022,0.055,0.062,0.000,0.000,0.049,0.012,0.000,0.009,0.007,0.008,0.008,0.011,0.011 +rendering.desktop,0.000,0.000,0.000,0.347,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.057,0.070,0.064,0.070,0.070 +rendering.mobile,0.637,0.229,0.207,0.000,0.000,0.000,0.000,0.020,0.156,0.000,0.092,0.000,0.000,0.000,0.000,0.000 +speedometer,0.005,0.002,0.002,0.004,0.005,0.004,0.003,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.001 +speedometer-future,0.005,0.002,0.002,0.004,0.005,0.000,0.000,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.001 +speedometer2,0.008,0.002,0.003,0.007,0.011,0.008,0.006,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.001 +speedometer2-future,0.008,0.002,0.003,0.009,0.010,0.000,0.000,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.002,0.002 +startup.mobile,0.024,0.000,0.000,0.000,0.000,0.029,0.000,0.025,0.007,0.012,0.000,0.000,0.000,0.000,0.000,0.000 +system_health.common_desktop,0.000,0.000,0.000,0.211,0.202,0.000,0.000,0.000,0.000,0.000,0.000,0.042,0.042,0.039,0.044,0.044 +system_health.common_mobile,0.234,0.065,0.080,0.000,0.000,0.204,0.123,0.263,0.053,0.048,0.037,0.000,0.000,0.000,0.000,0.000 +system_health.memory_desktop,0.000,0.000,0.000,0.193,0.182,0.000,0.000,0.000,0.000,0.000,0.000,0.028,0.036,0.033,0.038,0.038 +system_health.memory_mobile,0.152,0.046,0.075,0.000,0.000,0.144,0.086,0.051,0.050,0.050,0.035,0.000,0.000,0.000,0.000,0.000 +system_health.webview_startup,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +tab_switching.typical_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +tracing.tracing_with_background_memory_infra,0.008,0.001,0.002,0.010,0.012,0.000,0.000,0.008,0.002,0.000,0.001,0.001,0.001,0.001,0.002,0.002 +v8.browsing_desktop,0.000,0.000,0.000,0.124,0.110,0.000,0.000,0.000,0.000,0.000,0.000,0.020,0.024,0.022,0.024,0.024 +v8.browsing_desktop-future,0.000,0.000,0.000,0.116,0.105,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.025,0.022,0.023,0.023 +v8.browsing_mobile,0.235,0.048,0.066,0.000,0.000,0.198,0.000,0.263,0.045,0.000,0.029,0.000,0.000,0.000,0.000,0.000 +v8.browsing_mobile-future,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 +v8.runtime_stats.top_25,0.000,0.000,0.000,0.433,0.540,0.000,0.000,0.000,0.000,0.000,0.000,0.074,0.000,0.000,0.083,0.083 +webrtc,0.015,0.004,0.006,0.019,0.021,0.000,0.000,0.016,0.004,0.000,0.003,0.004,0.004,0.004,0.004,0.004
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 40f964a9..b5ae0e0 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -61,6 +61,7 @@ crbug.com/1013618 [ android ] blink_perf.canvas/putImageData.html [ Skip ] crbug.com/1013618 [ android ] blink_perf.canvas/putImageData_RAF.html?RAF [ Skip ] crbug.com/1035865 [ android-pixel-2 android-webview ] blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF [ Skip ] +crbug.com/1036446 [ mac-10.12 ] blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF [ Skip ] # Benchmark: blink_perf.css crbug.com/891878 [ android-nexus-5x android-webview ] blink_perf.css/CustomPropertiesVarAlias.html [ Skip ]
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index 0ab6e2b2..63a123c 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -59,6 +59,7 @@ 'base_perftests', 'cc_perftests', 'components_perftests', + 'dawn_perf_tests', 'gpu_perftests', 'latency_perftests', 'load_library_perf_tests',
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 14eea120..5358f3b 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -169,13 +169,11 @@ <item id="oauth2_access_token_fetcher" hash_code="27915688" type="0" content_hash_code="33501872" os_list="linux,windows" file_path="google_apis/gaia/oauth2_access_token_fetcher_impl.cc"/> <item id="oauth2_api_call_flow" hash_code="29188932" type="2" content_hash_code="108831236" os_list="linux,windows" policy_fields="-1" file_path="google_apis/gaia/oauth2_api_call_flow.cc"/> <item id="oauth2_mint_token_flow" hash_code="1112842" type="1" second_id="29188932" content_hash_code="91581432" os_list="linux,windows" semantics_fields="1,2,3,4,5" policy_fields="3,4" file_path="google_apis/gaia/oauth2_mint_token_flow.cc"/> - <item id="ocsp_start_url_request" hash_code="60921996" type="0" content_hash_code="24127780" os_list="linux" file_path="net/cert_net/nss_ocsp.cc"/> + <item id="ocsp_start_url_request" hash_code="60921996" type="0" content_hash_code="6288676" os_list="linux" file_path="net/cert_net/nss_ocsp_session_url_request.cc"/> <item id="offline_prefetch" hash_code="19185953" type="0" content_hash_code="112039446" os_list="linux,windows" file_path="components/offline_pages/core/prefetch/prefetch_request_fetcher.cc"/> - <item id="omnibox_debug_results_change" hash_code="71252052" type="0" content_hash_code="88668874" os_list="linux,windows" file_path="chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc"/> <item id="omnibox_documentsuggest" hash_code="6055066" type="0" content_hash_code="126973249" os_list="linux,windows" file_path="components/omnibox/browser/document_suggestions_service.cc"/> <item id="omnibox_navigation_observer" hash_code="61684939" type="0" content_hash_code="70941231" os_list="linux,windows" file_path="chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc"/> - <item id="omnibox_prefetch_image" hash_code="109200878" type="0" content_hash_code="107906693" os_list="linux,windows" file_path="chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc"/> - <item id="omnibox_result_change" hash_code="73107389" type="0" content_hash_code="24802647" os_list="linux,windows" file_path="chrome/browser/ui/omnibox/chrome_omnibox_client.cc"/> + <item id="omnibox_result_change" hash_code="73107389" type="0" content_hash_code="24802647" os_list="linux,windows" file_path="chrome/browser/autocomplete/bitmap_fetcher_helper.cc"/> <item id="omnibox_suggest" hash_code="47815025" type="0" content_hash_code="86297726" os_list="linux,windows" file_path="components/omnibox/browser/search_provider.cc"/> <item id="omnibox_suggest_deletion" hash_code="84212388" type="0" content_hash_code="24981550" os_list="linux,windows" file_path="components/omnibox/browser/base_search_provider.cc"/> <item id="omnibox_zerosuggest" hash_code="7687691" type="0" content_hash_code="119419625" os_list="linux,windows" file_path="components/omnibox/browser/remote_suggestions_service.cc"/>
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index 471358ea..ba2bafa 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc
@@ -764,13 +764,10 @@ base::Optional<int> AXNode::GetSetSize() { // Only allow this to be called on nodes that can hold set_size values, which // are defined in the ARIA spec. - if (!(IsOrderedSetItem() || IsOrderedSet())) + if (!(IsOrderedSetItem() || IsOrderedSet()) || + data().HasState(ax::mojom::State::kIgnored)) return base::nullopt; - if (data().HasState(ax::mojom::State::kIgnored)) { - return base::nullopt; - } - // If node is item-like, find its outerlying ordered set. Otherwise, // this node is the ordered set. const AXNode* ordered_set = this; @@ -784,7 +781,10 @@ return base::nullopt; // See AXTree::GetSetSize - return tree_->GetSetSize(*this, ordered_set); + int32_t set_size = tree_->GetSetSize(*this, ordered_set); + if (set_size < 0) + return base::nullopt; + return set_size; } // Returns true if the role of ordered set matches the role of item.
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc index 41752651..71b38686 100644 --- a/ui/accessibility/ax_tree.cc +++ b/ui/accessibility/ax_tree.cc
@@ -1958,14 +1958,14 @@ int32_t num_elements = 0; // Necessary for calculating set_size. int32_t largest_assigned_set_size = 0; - int hierarchical_level = - node.GetIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel); // Compute pos_in_set_values. for (size_t i = 0; i < items.size(); ++i) { const AXNode* item = items[i]; ordered_set_info_map_[item->id()] = OrderedSetInfo(); int32_t pos_in_set_value = 0; + int hierarchical_level = + item->GetIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel); pos_in_set_value = num_elements + 1; @@ -2016,6 +2016,8 @@ if (node.SetRoleMatchesItemRole(ordered_set) || ordered_set == &node) { auto ordered_set_info_result = ordered_set_info_map_.find(ordered_set->id()); + int hierarchical_level = + node.GetIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel); // If ordered_set is not in the cache, assign it a new set_size. if (ordered_set_info_result == ordered_set_info_map_.end()) { ordered_set_info_map_[ordered_set->id()] = OrderedSetInfo(); @@ -2034,6 +2036,8 @@ // Assign set_size to items. for (size_t j = 0; j < items.size(); ++j) { const AXNode* item = items[j]; + int hierarchical_level = + item->GetIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel); // If level is specified, use author-provided value, if present. if (hierarchical_level != 0 && item->HasIntAttribute(ax::mojom::IntAttribute::kSetSize))
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 9ac6b3e..98895ad 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -4187,7 +4187,8 @@ result->vt = VT_I4; result->intVal = *set_size; } - } break; + break; + } case UIA_LandmarkTypePropertyId: { base::Optional<LONG> landmark_type = ComputeUIALandmarkType();
diff --git a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java index f69dd97..76a05655 100644 --- a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java +++ b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
@@ -25,6 +25,7 @@ import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.base.ActivityState; @@ -45,6 +46,7 @@ import org.chromium.ui.VSyncMonitor; import org.chromium.ui.display.DisplayAndroid; import org.chromium.ui.display.DisplayAndroid.DisplayAndroidObserver; +import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.touchless.CursorObserver; import org.chromium.ui.touchless.TouchlessEventHandler; import org.chromium.ui.widget.Toast; @@ -666,6 +668,14 @@ } /** + * Returns the ModalDialogManager to be used with this window. + * @return a {@link ModalDialogManager} for this window, or null if there is none. + */ + public @Nullable ModalDialogManager getModalDialogManager() { + return null; + } + + /** * Destroys the c++ WindowAndroid object if one has been created. */ public void destroy() {
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn index 8448b1a9..ca07e67 100644 --- a/ui/compositor/BUILD.gn +++ b/ui/compositor/BUILD.gn
@@ -69,8 +69,6 @@ "paint_recorder.cc", "paint_recorder.h", "property_change_reason.h", - "reflector.cc", - "reflector.h", "scoped_animation_duration_scale_mode.cc", "scoped_animation_duration_scale_mode.h", "scoped_layer_animation_settings.cc",
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 982236be..8bb934c 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -75,7 +75,6 @@ class Compositor; class Layer; -class Reflector; class ScopedAnimationDurationScaleMode; class ScrollInputHandler; @@ -101,15 +100,6 @@ public: virtual ~ContextFactoryPrivate() {} - // Creates a reflector that copies the content of the |mirrored_compositor| - // onto |mirroring_layer|. - virtual std::unique_ptr<Reflector> CreateReflector( - Compositor* mirrored_compositor, - Layer* mirroring_layer) = 0; - - // Removes the reflector, which stops the mirroring. - virtual void RemoveReflector(Reflector* reflector) = 0; - // Allocate a new client ID for the display compositor. virtual viz::FrameSinkId AllocateFrameSinkId() = 0;
diff --git a/ui/compositor/host/host_context_factory_private.cc b/ui/compositor/host/host_context_factory_private.cc index 7b6c820..7c5e18f 100644 --- a/ui/compositor/host/host_context_factory_private.cc +++ b/ui/compositor/host/host_context_factory_private.cc
@@ -18,7 +18,6 @@ #include "services/viz/privileged/mojom/compositing/frame_sink_manager.mojom.h" #include "services/viz/privileged/mojom/compositing/vsync_parameter_observer.mojom.h" #include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h" -#include "ui/compositor/reflector.h" #if defined(OS_WIN) #include "ui/gfx/win/rendering_window_manager.h" @@ -184,19 +183,6 @@ return all_compositors; } -std::unique_ptr<Reflector> HostContextFactoryPrivate::CreateReflector( - Compositor* source, - Layer* target) { - // TODO(crbug.com/601869): Reflector needs to be rewritten for viz. - NOTIMPLEMENTED(); - return nullptr; -} - -void HostContextFactoryPrivate::RemoveReflector(Reflector* reflector) { - // TODO(crbug.com/601869): Reflector needs to be rewritten for viz. - NOTIMPLEMENTED(); -} - viz::FrameSinkId HostContextFactoryPrivate::AllocateFrameSinkId() { return frame_sink_id_allocator_.NextFrameSinkId(); }
diff --git a/ui/compositor/host/host_context_factory_private.h b/ui/compositor/host/host_context_factory_private.h index e7227a14..09b252e4 100644 --- a/ui/compositor/host/host_context_factory_private.h +++ b/ui/compositor/host/host_context_factory_private.h
@@ -67,9 +67,6 @@ base::flat_set<Compositor*> GetAllCompositors(); // ContextFactoryPrivate implementation. - std::unique_ptr<Reflector> CreateReflector(Compositor* source, - Layer* target) override; - void RemoveReflector(Reflector* reflector) override; viz::FrameSinkId AllocateFrameSinkId() override; viz::HostFrameSinkManager* GetHostFrameSinkManager() override; void SetDisplayVisible(Compositor* compositor, bool visible) override;
diff --git a/ui/compositor/reflector.cc b/ui/compositor/reflector.cc deleted file mode 100644 index 31dcdae..0000000 --- a/ui/compositor/reflector.cc +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/compositor/reflector.h" - -namespace ui { - -Reflector::~Reflector() { -} - -} // namespace ui
diff --git a/ui/compositor/reflector.h b/ui/compositor/reflector.h deleted file mode 100644 index 7c9495e..0000000 --- a/ui/compositor/reflector.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_COMPOSITOR_REFLECTOR_H_ -#define UI_COMPOSITOR_REFLECTOR_H_ - -#include "ui/compositor/compositor_export.h" - -namespace ui { -class Layer; - -class COMPOSITOR_EXPORT Reflector { - public: - virtual ~Reflector(); - virtual void OnMirroringCompositorResized() = 0; - virtual void AddMirroringLayer(Layer* layer) = 0; - virtual void RemoveMirroringLayer(Layer* layer) = 0; -}; - -} // namespace ui - -#endif // UI_COMPOSITOR_REFLECTOR_H_
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc index 27449039c..b70d2af 100644 --- a/ui/compositor/test/in_process_context_factory.cc +++ b/ui/compositor/test/in_process_context_factory.cc
@@ -36,7 +36,6 @@ #include "gpu/command_buffer/common/context_creation_attribs.h" #include "ui/compositor/compositor_switches.h" #include "ui/compositor/layer.h" -#include "ui/compositor/reflector.h" #include "ui/compositor/test/direct_layer_tree_frame_sink.h" #include "ui/compositor/test/in_process_context_provider.h" #include "ui/display/display_switches.h" @@ -60,15 +59,6 @@ // This should not conflict with ids from RenderWidgetHostImpl or WindowService. constexpr uint32_t kDefaultClientId = std::numeric_limits<uint32_t>::max() / 2; -class FakeReflector : public Reflector { - public: - FakeReflector() {} - ~FakeReflector() override {} - void OnMirroringCompositorResized() override {} - void AddMirroringLayer(Layer* layer) override {} - void RemoveMirroringLayer(Layer* layer) override {} -}; - // An OutputSurface implementation that directly draws and swaps to an actual // GL surface. class DirectOutputSurface : public viz::OutputSurface { @@ -307,15 +297,6 @@ data->display->Resize(compositor->size()); } -std::unique_ptr<Reflector> InProcessContextFactory::CreateReflector( - Compositor* mirrored_compositor, - Layer* mirroring_layer) { - return base::WrapUnique(new FakeReflector); -} - -void InProcessContextFactory::RemoveReflector(Reflector* reflector) { -} - scoped_refptr<viz::ContextProvider> InProcessContextFactory::SharedMainThreadContextProvider() { if (shared_main_thread_contexts_ &&
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h index 3f8d6e8..60acb48 100644 --- a/ui/compositor/test/in_process_context_factory.h +++ b/ui/compositor/test/in_process_context_factory.h
@@ -65,10 +65,6 @@ // ContextFactory implementation. void CreateLayerTreeFrameSink(base::WeakPtr<Compositor> compositor) override; - std::unique_ptr<Reflector> CreateReflector(Compositor* mirrored_compositor, - Layer* mirroring_layer) override; - void RemoveReflector(Reflector* reflector) override; - scoped_refptr<viz::ContextProvider> SharedMainThreadContextProvider() override; scoped_refptr<viz::RasterContextProvider>
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 670250d..7a0f0875 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -921,74 +921,49 @@ } // static -void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, +void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView child, gfx::NativeView new_parent) { - DCHECK_NE(native_view, new_parent); + DCHECK_NE(child, new_parent); DCHECK([new_parent.GetNativeNSView() window]); - if (!new_parent || [native_view.GetNativeNSView() superview] == - new_parent.GetNativeNSView()) { + if (!new_parent || + [child.GetNativeNSView() superview] == new_parent.GetNativeNSView()) { NOTREACHED(); return; } - NativeWidgetMacNSWindowHost* window_host = - NativeWidgetMacNSWindowHost::GetFromNativeView(native_view); - DCHECK(window_host); - gfx::NativeView bridge_view = - window_host->native_widget_mac()->GetNativeView(); - gfx::NativeWindow bridge_window = - window_host->native_widget_mac()->GetNativeWindow(); - bool bridge_is_top_level = - window_host->native_widget_mac()->GetWidget()->is_top_level(); - DCHECK([native_view.GetNativeNSView() - isDescendantOf:bridge_view.GetNativeNSView()]); - DCHECK(bridge_window && ![bridge_window.GetNativeNSWindow() isSheet]); + NativeWidgetMacNSWindowHost* child_window_host = + NativeWidgetMacNSWindowHost::GetFromNativeView(child); + DCHECK(child_window_host); + gfx::NativeView widget_view = + child_window_host->native_widget_mac()->GetNativeView(); + DCHECK_EQ(child, widget_view); + gfx::NativeWindow widget_window = + child_window_host->native_widget_mac()->GetNativeWindow(); + DCHECK( + [child.GetNativeNSView() isDescendantOf:widget_view.GetNativeNSView()]); + DCHECK(widget_window && ![widget_window.GetNativeNSWindow() isSheet]); NativeWidgetMacNSWindowHost* parent_window_host = NativeWidgetMacNSWindowHost::GetFromNativeView(new_parent); // Early out for no-op changes. - if (native_view == bridge_view && bridge_is_top_level && - window_host->parent() == parent_window_host) { + if (child == widget_view && + child_window_host->parent() == parent_window_host) { return; } // First notify all the widgets that they are being disassociated from their // previous parent. Widget::Widgets widgets; - GetAllChildWidgets(native_view, &widgets); - for (auto* child : widgets) - child->NotifyNativeViewHierarchyWillChange(); + GetAllChildWidgets(child, &widgets); + for (auto* widget : widgets) + widget->NotifyNativeViewHierarchyWillChange(); - // Update |bridge_host|'s parent only if - // NativeWidgetNSWindowBridge::ReparentNativeView will. - if (native_view == bridge_view) { - window_host->SetParent(parent_window_host); - if (!bridge_is_top_level) { - // Make |window_host|'s NSView be a child of |new_parent| by adding it as - // a subview. Note that this will have the effect of removing - // |window_host|'s NSView from its NSWindow. The |NSWindow| must remain - // visible because it controls the bounds and visibility of the ui::Layer, - // so just hide it by setting alpha value to zero. - // TODO(ccameron): This path likely violates assumptions. Verify that this - // path is unused and remove it. - LOG(ERROR) << "Reparenting a non-top-level BridgedNativeWidget. This is " - "likely unsupported."; - [new_parent.GetNativeNSView() addSubview:native_view.GetNativeNSView()]; - [bridge_window.GetNativeNSWindow() setAlphaValue:0]; - [bridge_window.GetNativeNSWindow() setIgnoresMouseEvents:YES]; - } - } else { - // TODO(ccameron): This path likely violates assumptions. Verify that this - // path is unused and remove it. - LOG(ERROR) << "Reparenting with a non-root BridgedNativeWidget NSView. " - "This is likely unsupported."; - [new_parent.GetNativeNSView() addSubview:native_view.GetNativeNSView()]; - } + child_window_host->SetParent(parent_window_host); // And now, notify them that they have a brand new parent. - for (auto* child : widgets) - child->NotifyNativeViewHierarchyChanged(); + for (auto* widget : widgets) + widget->NotifyNativeViewHierarchyChanged(); } // static
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index be2ca41..1b0c6b5 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -2081,46 +2081,6 @@ widget->CloseNow(); } -// Ensure reparented native view has correct bounds. -TEST_F(NativeWidgetMacTest, ReparentNativeViewBounds) { - Widget* parent = CreateTopLevelFramelessPlatformWidget(); - gfx::Rect parent_rect(100, 100, 300, 200); - parent->SetBounds(parent_rect); - - Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.parent = parent->GetNativeView(); - Widget* widget = new Widget; - widget->Init(std::move(params)); - widget->SetContentsView(new View); - - NSView* child_view = widget->GetNativeView().GetNativeNSView(); - Widget::ReparentNativeView(child_view, parent->GetNativeView()); - - // Reparented content view has the size of the Widget that created it. - gfx::Rect widget_rect(0, 0, 200, 100); - widget->SetBounds(widget_rect); - EXPECT_EQ(200, NSWidth([child_view frame])); - EXPECT_EQ(100, NSHeight([child_view frame])); - - // Reparented widget has bounds relative to the native parent - NSRect native_parent_rect = NSMakeRect(50, 100, 200, 70); - base::scoped_nsobject<NSView> native_parent( - [[NSView alloc] initWithFrame:native_parent_rect]); - [parent->GetNativeView().GetNativeNSView() addSubview:native_parent]; - - gfx::Rect screen_rect = widget->GetWindowBoundsInScreen(); - EXPECT_EQ(100, screen_rect.x()); - EXPECT_EQ(100, screen_rect.y()); - - Widget::ReparentNativeView(child_view, native_parent.get()); - widget->SetBounds(widget_rect); - screen_rect = widget->GetWindowBoundsInScreen(); - EXPECT_EQ(150, screen_rect.x()); - EXPECT_EQ(130, screen_rect.y()); - - parent->CloseNow(); -} - // Test two kinds of widgets to re-parent. TEST_F(NativeWidgetMacTest, ReparentNativeViewTypes) { std::unique_ptr<Widget> toplevel1(new Widget); @@ -2141,16 +2101,13 @@ Widget::ReparentNativeView(child->GetNativeView(), toplevel1->GetNativeView()); - EXPECT_EQ([child->GetNativeView().GetNativeNSView() window], + EXPECT_EQ([child->GetNativeWindow().GetNativeNSWindow() parentWindow], [toplevel1->GetNativeView().GetNativeNSView() window]); - EXPECT_EQ(0, [child->GetNativeWindow().GetNativeNSWindow() alphaValue]); Widget::ReparentNativeView(child->GetNativeView(), toplevel2->GetNativeView()); - EXPECT_EQ([child->GetNativeView().GetNativeNSView() window], + EXPECT_EQ([child->GetNativeWindow().GetNativeNSWindow() parentWindow], [toplevel2->GetNativeView().GetNativeNSView() window]); - EXPECT_EQ(0, [child->GetNativeWindow().GetNativeNSWindow() alphaValue]); - EXPECT_NE(0, [toplevel1->GetNativeWindow().GetNativeNSWindow() alphaValue]); Widget::ReparentNativeView(toplevel2->GetNativeView(), toplevel1->GetNativeView());
diff --git a/weblayer/browser/android/javatests/BUILD.gn b/weblayer/browser/android/javatests/BUILD.gn index aae8594..aa6e835 100644 --- a/weblayer/browser/android/javatests/BUILD.gn +++ b/weblayer/browser/android/javatests/BUILD.gn
@@ -17,6 +17,7 @@ "src/org/chromium/weblayer/test/ExecuteScriptTest.java", "src/org/chromium/weblayer/test/FullscreenCallbackTest.java", "src/org/chromium/weblayer/test/InputTypesTest.java", + "src/org/chromium/weblayer/test/WebLayerJUnit4ClassRunner.java", "src/org/chromium/weblayer/test/InstrumentationActivityTestRule.java", "src/org/chromium/weblayer/test/NavigationTest.java", "src/org/chromium/weblayer/test/NavigationWaiter.java", @@ -74,7 +75,7 @@ weblayer_instrumentation("weblayer_instrumentation_test_apk") { apk_name = "WebLayerInstrumentationTest" apk_under_test = "//weblayer/shell/android:weblayer_shell_system_webview_apk" - use_webview_provider = "//android_webview:system_webview_apk" + use_webview_provider = system_webview_apk_target } # Runs the instrumentation tests loading the implementation from the WebLayer
diff --git a/weblayer/browser/android/javatests/DEPS b/weblayer/browser/android/javatests/DEPS index b969a40..9561ee3 100644 --- a/weblayer/browser/android/javatests/DEPS +++ b/weblayer/browser/android/javatests/DEPS
@@ -1,3 +1,4 @@ include_rules = [ + "-content/public", "+content/public/test", ]
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BrowserFragmentLifecycleTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BrowserFragmentLifecycleTest.java index 22f1fcac..98e3bf4 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BrowserFragmentLifecycleTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BrowserFragmentLifecycleTest.java
@@ -14,7 +14,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Navigation; import org.chromium.weblayer.NavigationCallback; @@ -27,7 +26,7 @@ /** * Tests that fragment lifecycle works as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class BrowserFragmentLifecycleTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/CrashReporterTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/CrashReporterTest.java index fcc2d54..1e74af1 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/CrashReporterTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/CrashReporterTest.java
@@ -15,7 +15,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.CrashReporterCallback; @@ -30,7 +29,7 @@ /** * Tests for crash reporting in WebLayer. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class CrashReporterTest { private static final String UUID = "032b90a6-836c-49bc-a9f4-aa210458eaf3"; private static final String LOCAL_ID = "aa210458eaf3";
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DataClearingTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DataClearingTest.java index 25a9ec01..0ca880e 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DataClearingTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DataClearingTest.java
@@ -17,7 +17,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.weblayer.Profile; import org.chromium.weblayer.shell.InstrumentationActivity; @@ -27,7 +26,7 @@ /** * Example test that just starts the weblayer shell. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class DataClearingTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java index 5349359..3ef5f94 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java
@@ -14,7 +14,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -28,7 +27,7 @@ /** * Tests that the DownloadCallback method is invoked for downloads. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class DownloadCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ErrorPageCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ErrorPageCallbackTest.java index 3b3a178..8dc0e90 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ErrorPageCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ErrorPageCallbackTest.java
@@ -14,7 +14,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.net.test.EmbeddedTestServer; import org.chromium.net.test.ServerCertificate; @@ -26,7 +25,7 @@ /** * Tests that ErrorPageCallback works as expected for handling error page interactions. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class ErrorPageCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExecuteScriptTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExecuteScriptTest.java index 623aaa1b..a6a99f13 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExecuteScriptTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ExecuteScriptTest.java
@@ -12,7 +12,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.UrlUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Tab; @@ -21,7 +20,7 @@ /** * Tests that script execution works as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class ExecuteScriptTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java index ba346b9..c3964c4 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java
@@ -12,7 +12,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -22,7 +21,7 @@ /** * Tests that FullscreenCallback methods are invoked as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class FullscreenCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InputTypesTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InputTypesTest.java index 53d8ef18..3e6d4165 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InputTypesTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InputTypesTest.java
@@ -27,7 +27,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.InMemorySharedPreferencesContext; import org.chromium.base.test.util.MinAndroidSdkLevel; @@ -41,7 +40,7 @@ /** * Tests that file inputs work as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class InputTypesTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InstrumentationActivityTestRule.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InstrumentationActivityTestRule.java index 691490f..d5bb408 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InstrumentationActivityTestRule.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/InstrumentationActivityTestRule.java
@@ -7,10 +7,12 @@ import android.app.Activity; import android.app.Instrumentation.ActivityMonitor; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; +import android.text.TextUtils; import org.json.JSONException; import org.json.JSONObject; @@ -19,6 +21,7 @@ import org.junit.runner.Description; import org.junit.runners.model.Statement; +import org.chromium.base.CommandLine; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -28,6 +31,9 @@ import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.shell.InstrumentationActivity; +import java.io.File; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.lang.reflect.Field; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -38,6 +44,8 @@ * Test can use this ActivityTestRule to launch or get InstrumentationActivity. */ public class InstrumentationActivityTestRule extends ActivityTestRule<InstrumentationActivity> { + private static final String COMMAND_LINE_FILE = "weblayer-command-line"; + @Rule private EmbeddedTestServerRule mTestServerRule = new EmbeddedTestServerRule(); @@ -60,7 +68,32 @@ @Override public Statement apply(final Statement base, Description description) { - return super.apply(mTestServerRule.apply(base, description), description); + Statement testServer = super.apply(mTestServerRule.apply(base, description), description); + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + // The CommandLine instance we have here will not be picked up in the + // implementation since they use different class loaders, so we need to write + // all the switches to the WebLayer command line file. + try (Writer writer = new OutputStreamWriter( + InstrumentationRegistry.getInstrumentation() + .getTargetContext() + .openFileOutput(COMMAND_LINE_FILE, Context.MODE_PRIVATE), + "UTF-8")) { + writer.write(TextUtils.join(" ", CommandLine.getJavaSwitchesOrNull())); + } + + testServer.evaluate(); + } finally { + new File(InstrumentationRegistry.getInstrumentation() + .getTargetContext() + .getFilesDir(), + COMMAND_LINE_FILE) + .delete(); + } + } + }; } public WebLayer getWebLayer() {
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java index d3be59c..4c61eca6 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -18,7 +18,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -38,7 +37,7 @@ /** * Example test that just starts the weblayer shell. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class NavigationTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NewTabCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NewTabCallbackTest.java index 1b3f9ea..2022803 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NewTabCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NewTabCallbackTest.java
@@ -11,7 +11,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -22,7 +21,7 @@ /** * Tests that NewTabCallback methods are invoked as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class NewTabCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java index 2c7152c..afddabc 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java
@@ -11,7 +11,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Profile; import org.chromium.weblayer.WebLayer; @@ -22,7 +21,7 @@ /** * Tests that Profile works as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class ProfileTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/RenderingTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/RenderingTest.java index 7579453..d6c27c5 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/RenderingTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/RenderingTest.java
@@ -11,7 +11,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.shell.InstrumentationActivity; @@ -20,7 +19,7 @@ /** * Tests that embedding support works as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class RenderingTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java index f4b1c33..300198c 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java
@@ -11,7 +11,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -28,7 +27,7 @@ /** * Tests that TabCallback methods are invoked as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class TabCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabListCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabListCallbackTest.java index 8475f47..7c0d85b 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabListCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabListCallbackTest.java
@@ -12,7 +12,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Browser; import org.chromium.weblayer.Tab; @@ -26,7 +25,7 @@ /** * Tests that NewTabCallback methods are invoked as expected. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class TabListCallbackTest { @Rule public InstrumentationActivityTestRule mActivityTestRule =
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java index 9aca591..b2c7c7e 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java
@@ -4,7 +4,6 @@ package org.chromium.weblayer.test; -import android.os.SystemClock; import android.support.test.filters.SmallTest; import android.support.v4.app.Fragment; import android.view.View; @@ -15,8 +14,8 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.UrlUtils; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -29,7 +28,8 @@ /** * Test for top-controls. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) +@CommandLineFlags.Add("enable-features=ImmediatelyHideBrowserControlsForTest") public class TopControlsTest { @Rule public InstrumentationActivityTestRule mActivityTestRule = @@ -89,10 +89,6 @@ mInitialVisiblePageHeight = getVisiblePageHeight(); Assert.assertTrue(mInitialVisiblePageHeight > 0); - // TODO(http://crbug.com/1034147): Remove this and find a way to pass command line arguments - // to the implementation. - SystemClock.sleep(3100); - // Move by the size of the top-controls. EventUtils.simulateDragFromCenterOfView( activity.getWindow().getDecorView(), 0, -mTopControlsHeight);
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerJUnit4ClassRunner.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerJUnit4ClassRunner.java new file mode 100644 index 0000000..963c8639 --- /dev/null +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerJUnit4ClassRunner.java
@@ -0,0 +1,41 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.weblayer.test; + +import org.junit.runners.model.InitializationError; + +import org.chromium.base.CommandLineInitUtil; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.BaseTestResult.PreTestHook; +import org.chromium.base.test.util.CommandLineFlags; + +import java.util.List; + +/** + * A custom runner for //content JUnit4 tests. + */ +public class WebLayerJUnit4ClassRunner extends BaseJUnit4ClassRunner { + /** + * Create a WebLayerJUnit4ClassRunner to run {@code klass} and initialize values + * + * @throws InitializationError if the test class malformed + */ + public WebLayerJUnit4ClassRunner(final Class<?> klass) throws InitializationError { + super(klass); + } + + /** + * Change this static function to add default {@code PreTestHook}s. + */ + @Override + protected List<PreTestHook> getPreTestHooks() { + return addToList(super.getPreTestHooks(), CommandLineFlags.getRegistrationHook()); + } + + @Override + protected void initCommandLineForTest() { + CommandLineInitUtil.initCommandLine(CommandLineFlags.getTestCmdLineFile()); + } +}
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerLoadingTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerLoadingTest.java index a8ef211..914b272 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerLoadingTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebLayerLoadingTest.java
@@ -16,7 +16,6 @@ import org.junit.runner.RunWith; import org.chromium.base.ContextUtils; -import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.weblayer.Callback; @@ -31,7 +30,7 @@ /** * Tests for {@link Weblayer#createAsync} and {@link Weblayer#createSync}. */ -@RunWith(BaseJUnit4ClassRunner.class) +@RunWith(WebLayerJUnit4ClassRunner.class) public class WebLayerLoadingTest { private Context mContext;
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java index 0e976a7..7b330ec 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
@@ -60,8 +60,11 @@ // Command line flags are only read in debug builds. // WARNING: this file is written to by testing code in chrome (see // "//chrome/test/chromedriver/chrome/device_manager.cc"). If you change this variable, update - // "device_manager.cc" too. - private static final String COMMAND_LINE_FILE = "/data/local/tmp/weblayer-command-line"; + // "device_manager.cc" too. If the command line file exists in the app's private files + // directory, it will be read from there, otherwise it will be read from + // PUBLIC_COMMAND_LINE_FILE. + private static final String COMMAND_LINE_FILE = "weblayer-command-line"; + private static final String PUBLIC_COMMAND_LINE_FILE = "/data/local/tmp/" + COMMAND_LINE_FILE; // This metadata key, if defined, overrides the default behaviour of loading WebLayer from the // current WebView implementation. This is only intended for testing, and does not enforce any // signature requirements on the implementation, nor does it use the production code path to @@ -166,7 +169,13 @@ if (BuildInfo.isDebugAndroid()) { // This disk read in the critical path is for development purposes only. try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) { - CommandLine.initFromFile(COMMAND_LINE_FILE); + File localCommandLineFile = + new File(appContext.getFilesDir(), COMMAND_LINE_FILE); + if (localCommandLineFile.exists()) { + CommandLine.initFromFile(localCommandLineFile.getPath()); + } else { + CommandLine.initFromFile(PUBLIC_COMMAND_LINE_FILE); + } } } else { CommandLine.init(null);
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc index 0987c1c..e0db45a 100644 --- a/weblayer/browser/tab_impl.cc +++ b/weblayer/browser/tab_impl.cc
@@ -5,6 +5,7 @@ #include "weblayer/browser/tab_impl.h" #include "base/auto_reset.h" +#include "base/feature_list.h" #include "base/logging.h" #include "content/public/browser/file_select_listener.h" #include "content/public/browser/interstitial_page.h" @@ -43,11 +44,18 @@ namespace { #if defined(OS_ANDROID) +const base::Feature kImmediatelyHideBrowserControlsForTest{ + "ImmediatelyHideBrowserControlsForTest", base::FEATURE_DISABLED_BY_DEFAULT}; + // The time that must elapse after a navigation before the browser controls can // be hidden. This value matches what chrome has in // TabStateBrowserControlsVisibilityDelegate. -constexpr base::TimeDelta kBrowserControlsAllowHideDelay = - base::TimeDelta::FromSeconds(3); +base::TimeDelta GetBrowserControlsAllowHideDelay() { + if (base::FeatureList::IsEnabled(kImmediatelyHideBrowserControlsForTest)) + return base::TimeDelta(); + + return base::TimeDelta::FromSeconds(3); +} #endif NewTabType NewTabTypeFromWindowDisposition(WindowOpenDisposition disposition) { @@ -391,7 +399,7 @@ UpdateBrowserControlsState(content::BROWSER_CONTROLS_STATE_SHOWN, content::BROWSER_CONTROLS_STATE_BOTH, true); update_browser_controls_state_timer_.Start( - FROM_HERE, kBrowserControlsAllowHideDelay, + FROM_HERE, GetBrowserControlsAllowHideDelay(), base::BindOnce(&TabImpl::UpdateBrowserControlsState, base::Unretained(this), content::BROWSER_CONTROLS_STATE_BOTH,