From ae5335b673be71fe96b8871ea376337d29e01e6e Mon Sep 17 00:00:00 2001
From: Scott Main
This document explains the screens-support features provided by the platform and how you use them in your application. By following the practices described here, you can easily create an application that displays properly on all -supported device screens and that you can deploy to any device as a single .apk. +supported device screens and that you can deploy to any device as a single {@code .apk}.
If you have already developed and published an application for Android 1.5 or @@ -63,10 +65,16 @@ and that are running Android 1.6 or later. In most cases, only minor adjustments are needed, however you should make sure to test your application on all supported screens.
+Starting in Android 2.2, the platform includes support for extra high density screens +(xhdpi), and starting in Android 2.3, the platform includes support for extra large screens +(xlarge). If you've already followed the guidance in this document to support all other +screen types, you should consider providing additional support for xhdpi and +xlarge screens.
+In particular, if you have an existing application that you would like to -make available for users of devices with small screens (such as QVGA), please -see Strategies for Legacy Applications for more -information about how to do that.
+make available on small screens (such as QVGA) or for which you would like to provide better support +for extra large screens, please see Strategies for Legacy Applications for +more information about how to do that.For simplicity, Android collapses all actual screen sizes into three -generalized sizes: large, normal, and small. Applications can provide custom -layouts for each of these three sizes — the platform transparently handles +
For simplicity, Android collapses all actual screen sizes into four +generalized sizes: small, normal, large, and extra large. Applications can provide custom +layouts for each of these four sizes — the platform transparently handles the rendering of the layouts at the actual screen size.
For simplicity, Android collapses all actual screen densities into three -generalized densities: high, medium, and low. Applications can provide custom -resources for each of these three densities — the platform handles the -scaling of the resources up or down to meet the actual screen density.
-For simplicity, Android collapses all actual screen densities into four +generalized densities: low, medium, large, and extra large. Applications can provide custom +resources for each of these densities — the platform handles any necessary +scaling of the resources up or down to meet the specific screen density.
+The density-independent pixel is equivalent to one physical pixel on a 160
dpi screen, the baseline density assumed by the platform (as described later in
this document). At run time, the platform transparently handles any scaling of
-the dip units needed, based on the actual density of the screen in use. The
-conversion of dip units to screen pixels is simple: pixels = dips *
-(density / 160). For example, on 240 dpi screen, 1 dip would equal 1.5
-physical pixels. Using dip units to define your application's UI is highly
+the dp units needed, based on the actual density of the screen in use. The
+conversion of dp units to screen pixels is simple: pixels = dps *
+(density / 160)
Note: The xhdpi density category was added in
+Android 2.2 (API Level 8). The xlarge size category was added in Android 2.3 (API Level
+9).
Applications can provide custom resources (primarily layouts) for any of the -three generalized sizes and can provide resources (primarily drawables such as -images) for any of the three generalized densities. Applications do not need to +four generalized sizes and can provide resources (primarily drawables such as +images) for any of the four generalized densities. Applications do not need to work with the actual physical size or density of the device screen. At run time, the platform handles the loading of the correct size or density resources, based on the generalized size or density of the current device screen, and adapts them @@ -177,8 +191,8 @@ its characteristics.
-Figure 1. -Illustration of how the Android platform maps actual screen densities and sizes +
Figure 1. +Illustration of how the Android platform maps actual screen densities and sizes to generalized density and size configurations.
Although the platform lets your application provide layouts and resources for @@ -213,6 +227,9 @@ sizes and densities of emulator skins included in the Android SDK.
For an overview of the relative numbers of high (hdpi), medium (mdpi), and -low (ldpi) density screens in Android-powered devices available now, see the For an overview of the relative numbers of high (hdpi), medium (mdpi), and +low (ldpi) density screens in Android-powered devices available now, see the Screen Sizes and Densities dashboard.
@@ -262,9 +292,9 @@ resources at run time is based on the alternative resources framework.If you want to use size- or density-specific layouts or drawables in your application and you are not familiar with resource qualifiers or how the -platform uses them, please read +platform uses them, please read -Alternative Resources. +Providing Alternative Resources. @@ -277,19 +307,20 @@ to use them:
large, normal, and
-small, and those for density-specific resources are
-hdpi (high), mdpi (medium), and ldpi
-(low). The qualifiers correspond to the generalized densities described in
+size- and density-specific resources, if needed. The qualifiers for
+size-specific resources are small, normal, large, and
+xlarge. Those for density-specific resources are ldpi
+(low), mdpi (medium), hdpi (high), and xhdpi (extra high).
+The qualifiers correspond to the generalized densities described in
Range of screens supported, above.<supports-screens>
manifest element, whose attributes
-android:largeScreens, android:normalScreens, and
-android:smallScreens let you specify what generalized screen sizes
-your application supports. A fourth attribute, android:anyDensity,
+android:smallScreens, android:normalScreens,
+android:largeScreens, and android:xlargeScreens let you specify what
+generalized screen sizes
+your application supports. Another attribute, android:anyDensity,
lets you indicate whether or not your application includes built-in support for
multiple densities.Based on the density of the current screen, the platform automatically loads any size- or density-specific resources from your application and displays @@ -344,18 +375,18 @@ lower-density screen, coordinates are scaled down.
For more information, see the android:anyDensity attribute in
Manifest attributes for screens support.
- Publishing to Small Screen Devices
+
+ Publishing to Small Screen Devices
To ensure the best experience for users on small-screen devices, Android Market only shows applications that explicitly declare support for small screens. If you developed an application on Android 1.5 or earlier and published it on Android Market, you need to test your application -on small screens and then upload an updated version that explicitly +on small screens and then upload an updated version that explicitly indicates support for small screens.
-For more information, see the android:anyDensity attribute in
-Manifest elements for screens support and the
+Manifest elements for screens support and the
Screen-Compatibility Examples
section.
android:anyDensity="false" in its
@@ -437,25 +468,36 @@ density (left), HVGA medium density (center), and QVGA low density (right).
In most cases, you can take advantage of density independence in your
application simply by making sure that your layouts specify all dimension values
-in density-independent pixels (dip or dp) or
+in density-independent pixels (dp or dp) or
scale-independent pixels (sip or sp, for text only).
If you are using absolute pixel values in the application and manifest includes
android:anyDensity="true", you will also need
-to scale the pixel values. See Converting from dips to
-pixels for more information.
Android 1.6 introduced a new manifest element, +
Android 1.6 introduced a new manifest element,
<supports-screens>,
whose attributes you can use to control the
display of your application on different classes of device screens, as listed
-below. The smallScreens, normalScreens, and
-largeScreens attributes correspond to the generalized screen sizes
+in table 2. The smallScreens, normalScreens, largeScreens and
+xlargeScreens attributes correspond to the generalized screen sizes
described in Range of screens supported, earlier in this
-document.
Table 2. Summary of attributes for the {@code +<supports-screens>} manifest element, including default values based on platform +version.
| @@ -465,10 +507,12 @@ document. Description |
- Default value,minSdkVersion ortargetSdkVersion is 4 or lower
|
- Default value,minSdkVersion ortargetSdkVersion is 5 or higher
|
|
|---|---|---|---|
"false" |
+"true" |
+ ||
Note: Android 2.3 (API Level 9) introduced a new
+attribute for the <supports-screens> element: xlargeScreens, shown
+below. It works the same as the other screen attributes above, but, if neither your
+minSdkVersion or targetSdkVersion are set to "9", the default value is
+"false" when your application is installed on a device running Android 2.3. |
+ |||
| + Attribute + | ++ Description + | +
+ Default value, whenminSdkVersion ortargetSdkVersion is 8 or lower
+ |
+
+ Default value, whenminSdkVersion ortargetSdkVersion is 9 or higher
+ |
+
+ android:xlargeScreens
+ |
+
+ Whether or not the application UI is designed for use on
+xlarge screens — "true" if it is, and
+"false" if not.
+ |
+"false" |
"true" |
In general, when you declare a screen-size attribute
-(smallScreens, normalScreens, or
-largeScreens) as "true", you are signaling to the
+(smallScreens, normalScreens, largeScreens, or
+xlargeScreens) as "true", you are signaling to the
platform that your application is designed to render properly on that screen
size. As a result, the platform does not apply any size-compatibility features
(such as a virtual HVGA display area). If you declare a screen-size attribute as
@@ -577,16 +656,20 @@ features for applications.
smallScreens="false" normalScreens="true"
-largeScreens="false" in your application's manifest. Although the -application is not designed for display on large screens, the platform can still -run it successfully in size-compatibility -mode. Android Market does not filter the application from devices -normal and large size screens, but does filter it from -small size screens, since the application provides no screen support at -small size (and there is no smaller size).
Although the +application is not designed for display on large or extra large screens, the platform can still +run it successfully in screen-compatibility +mode. Android Market shows the application to devices with +normal, large, and xlarge size screens, but does filter it from +small size screens, because the application provides no screen support at +small size. Android's screen-compatibility +mode mode does not provide support for screens that are smaller than those the +application supports—it only provides support for screens that are larger. Thus, +although the application declares "false" for large and xlarge screens, +the application still functions, but runs in compatibility mode.
smallScreens="false" normalScreens="false"
-largeScreens="true" in your application's manifest. Android Market +largeScreens="true" xlargeScreens="true" in your application's manifest.
Android Market filters the application from users of devices with small and normal size screens. In effect, this prevents such users from installing the application.
dp) and scales any absolute pixel
values (px) or math by the scaling factor available from {@link
android.util.DisplayMetrics#density android.util.DisplayMetrics.density}. See Converting from dips to pixels for an example.
+href="#dips-pels">Converting dp units to pixel units for an example.
Note that the setting of the android:anyDensity attribute does
not affect the platform's pre-scaling of drawable resources, such as bitmaps and
nine-patch images, which always takes place by default.
The following example shows a manifest that declares support for large, -normal, and small screens in any densities.
+The following example shows a manifest that declares support for small, normal, large, and + xlarge screens in any density.
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"> - ... - <supports-screens - android:largeScreens="true" - android:normalScreens="true" - android:smallScreens="true" - android:anyDensity="true" /> - ... ++<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + ... + <supports-screens + android:smallScreens="true" + android:normalScreens="true" + android:largeScreens="true" + android:xlargeScreens="true" + android:anyDensity="true" /> </manifest>@@ -624,36 +708,25 @@ normal, and small screens in any densities.The default values for the
+the value of {@code +android:targetSdkVersion}, if declared. -<supports-screens>attributes -differ, depending on the the value of the +differ, depending on the the value of theandroid:minSdkVersionattribute in the application's manifest, as well as on -the value ofandroid:targetSdkVersion, if declared:-+-
-- - If
-android:minSdkVersionor -android:targetSdkVersionis "4" (Android 1.6) or higher, the -default value for everything is "true". If your application uses -APIs introduced in Android 1.6 or higher, but does not support specific screen -densities and/or screen sizes, you need to explicitly set the appropriate -attributes to "false". -- - If
-android:minSdkVersionis declared with a value of "3" -(Android 1.5) or lower and aandroid:targetSdkVersion-attribute is not declared with a value of "4" or higher, the default -value for all attributes exceptandroid:normalScreensis -"false". If you are primarily targeting pre-Android 1.6 platforms -but also want to support other densities/screen sizes, you need to explicitly -set the appropriate attributes to "true". -- - Note that
-android:normalScreensalways defaults to -true. -Above, table 2 indicates the default values for each attribute, based on +the values you provide for the {@code +android:minSdkVersion} and {@code +android:targetSdkVersion}, in the {@code <uses-sdk>} +element.
+ +Note: If your application uses APIs introduced in Android 1.6 or +higher, but does not support specific screen densities and/or screen sizes, you need to explicitly +set the appropriate attributes to "
false" (because most are "true", by default).Resource directory qualifiers for screen size and density
@@ -673,7 +746,7 @@ of Screens Supported, earlier in this document.- @@ -683,11 +756,15 @@ of Screens Supported, earlier in this document.Size +Size smallResources designed for small size screens. + - largeResources for large size screens. +Resources designed for large size screens. ++ + xlargeResources designed for extra large size screens. - @@ -700,6 +777,10 @@ of Screens Supported, earlier in this document.Density +Density ldpiResources designed for low-density (ldpi) screens. Resources designed for high-density (hdpi) screens. + ++ xhdpiResources designed for extra high-density (xhdpi) screens. +nodpiDensity-independent resources. The platform does not auto-scale resources tagged with this qualifier, regardless of the current screen's density. @@ -732,31 +813,34 @@ running on Android 1.5 (API Level 3). Note that the density and the screen size are independent parameters and are interpreted by the system individually. For example, WVGA high density is considered a normal screen because its physical size is about the same as one of -T-Mobile G1. On the other hand, a WVGA medium density screen is considered a +T-Mobile G1. On the other hand, a WVGA medium density screen is considered a large screen — it offers the same resolution but at lower pixel density, meaning that it is both physically larger than the baseline screen and can display significantly more information than a normal screen size.Here is an example of the resource directory structure of an application that -supports low and high density, and employs different layout schemes.
+employs different layout schemes for different screen sizes and supports low and high density +screens. -res/layout/my_layout.xml // layout for normal screen size ++res/layout/my_layout.xml // layout for normal screen size res/layout-small/my_layout.xml // layout for small screen size res/layout-large/my_layout.xml // layout for large screen size res/layout-large-land/my_layout.xml // layout for large screen size in landscape mode +res/layout-xlarge/my_layout.xml // layout for extra large screen size -res/drawable-ldpi/my_icon.png // icon image for low density -res/drawable-mdpi/dpi/my_icon.png // icon for medium density -res/drawable-hdpi/my_icon.png // icon image for high density +res/drawable-lhdpi/my_icon.png // image for low density +res/drawable-mdpi/dpi/my_icon.png // image for medium density +res/drawable-hdpi/my_icon.png // image for high density res/drawable-nodpi/composite.xml // density independent resourceFor more information about how to use resource qualifiers or how the platform -selects them, please read +selects them, please read -Alternative Resources.
+Providing Alternative Resources.Best practices for Screen Independence
@@ -771,10 +855,11 @@ different screens. Here is a quick checklist:-
- - Prefer wrap_content, fill_parent and the dip unit to px in XML layout files + Use {@code wrap_content}, {@code fill_parent}, or the {@code dp} unit (instead of {@code px}), +when specifying dimensions in an XML layout file
- - Avoid AbsoluteLayout + Do not use {@code AbsoluteLayout}
- Do not use hard coded pixel values in your code @@ -784,19 +869,19 @@ different screens. Here is a quick checklist:
1. Prefer wrap_content, fill_parent and the dip unit to +
1. Use wrap_content, fill_parent, or the dp unit, instead of absolute pixels
When defining the
layout_widthandlayout_heightof views in an XML layout file, usingwrap_content, -fill_parentor thedipwill guarantee that the view is +fill_parentor thedpwill guarantee that the view is given an appropriate size on the current device screen. For instance, a view -with alayout_width="100dip"will measure 100 pixels wide on an +with alayout_width="100dp"will measure 100 pixels wide on an HVGA@160 density display and 150 pixels on a WVGA@240 density display, but the view will occupy approximately the same physical space.Similarly, you should prefer the
sp(scale-independent pixel, -the scale factor depends on a user setting) ordip(if you don't +the scale factor depends on a user setting) ordp(if you don't want to allow the user to scale the text) to define font sizes.2. Avoid AbsoluteLayout
@@ -808,7 +893,7 @@ positions which might easily lead to user interfaces that do not work well on different displays. Because of this,AbsoluteLayoutwas deprecated in Android 1.5 (API Level 3). -You can achieve much the same layout by using a +
You can achieve much the same layout by using a {@link android.widget.FrameLayout FrameLayout} instead, and setting
@@ -822,9 +907,9 @@ code in pixels. For instance, iflayout_marginattributes of the children. This approach is more flexible and will yield better results on different screens.myView.getWidth()returns 10, the view is 10 pixels wide. In some cases, you may need to scale the pixel values that you use in your code. The sections below provide more information. -Converting from dips to pixels
+Converting dp units to pixel units
-In some cases, you will need to express dimensions in
dipand +In some cases, you will need to express dimensions in
-dpand then convert them to pixels. Imagine an application in which a scroll gesture is recognized after the user's finger has moved by at least 16 pixels. On a baseline screen, the user will have to move his finger by 16 pixels / 160 @@ -832,26 +917,26 @@ dpi = 1/10th of an inch (or 2.5 mm) before the gesture is recognized. On a device with a high (240) density display, the user will move his finger by only 16 pixels / 240 dpi = 1/15th of an inch (or 1.7 mm.) The distance is much shorter and the application thus appears more sensitive to the user. To fix this -issue, the gesture threshold must be expressed in the code indip+issue, the gesture threshold must be expressed in the code indpand then converted to actual pixels.// The gesture threshold expressed in dip -private static final float GESTURE_THRESHOLD_DIP = 16.0f; +// The gesture threshold expressed in dp +private static final float GESTURE_THRESHOLD_DP = 16.0f; -// Convert the dips to pixels +// Convert the dps to pixels final float scale = getContext().getResources().getDisplayMetrics().density; -mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f); +mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f); // Use mGestureThreshold as a distance in pixels-The {@link android.util.DisplayMetrics#density android.util.DisplayMetrics.density} +
The {@link android.util.DisplayMetrics#density android.util.DisplayMetrics.density} field specifies the the scale factor you must use to -convert dips to pixels according to the current screen density. You can access +convert dps to pixels according to the current screen density. You can access the current screen's metrics through a
@@ -901,7 +986,7 @@ platform assumes that the resources in that directory are designed for the baseline medium density. It is not recommended that you put density-specific resources such as images in the default directory. -ContextorActivity. On a medium (160) density screen,DisplayMetrics.densityequals "1.0", whereas on a high (240) -density screen it equals "1.5". You can refer to the documentation of the +density screen it equals "1.5". You can refer to the documentation of the {@link android.util.DisplayMetrics DisplayMetrics} class for details.For more information about valid resource qualifiers, see +
For more information about valid resource qualifiers, see Resource directory qualifiers, earlier in this document.
@@ -945,7 +1030,7 @@ resource directory:-
res/drawable-nodpi/icon.pngYou can also take complete control of the scaling mechanism by using the +
You can also take complete control of the scaling mechanism by using the {@link android.graphics.BitmapFactory.Options BitmapFactory.Options} class, which lets you define whether you want the bitmap to be pre-scaled and what the density of the bitmap should be. For instance, if you are loading a bitmap from @@ -953,12 +1038,12 @@ a web server, you may want to force the bitmap's density to be high density. When pre-scaling is disabled, the resulting bitmap is in auto-scaling mode. The bitmap is associated with a density (that you may or may not have specified through the
BitmapFactory.Options) which will be used to scale the -bitmap on screen at drawing time. +bitmap on screen at drawing time.Using auto-scaling instead of pre-scaling is more CPU expensive than -pre-scaling but uses less memory. You can refer to the documentation of -{@link android.graphics.BitmapFactory BitmapFactory}, -{@link android.graphics.Bitmap Bitmap}, and +pre-scaling but uses less memory. You can refer to the documentation of +{@link android.graphics.BitmapFactory BitmapFactory}, +{@link android.graphics.Bitmap Bitmap}, and {@link android.graphics.Canvas Canvas} for more information on auto-scaling.
@@ -973,7 +1058,7 @@ auto-scaled at draw time.If you have already developed and published an Android application based on Android 1.5 or earlier platform version, you need to consider how you will adapt -your application so that it is deployable to
+your application so that it is deployable to:+
- Existing devices, which may be running Android 1.5 (or lower) platform @@ -982,16 +1067,21 @@ version, as well as to
screen sizes and resolutionsNote: Even if your application targets Android 1.6 already, you +should follow the same strategies below in order to support xhdpi and xlarge +screens on Android 2.3 (API Level 9), while maintaining compatibility with older versions of +the platform.
+To support the newer devices and the different screens they use, you might need to make some changes in your app, but at the same time your app may be very stable and so you want to minimize the changes. There are a variety of ways that you can extend your existing application to support new devices with multiple screens and existing devices running older platform versions. You should be able to make these changes to your application such that you can -distribute a single .apk to any and all devices.
+distribute a single {@code .apk} to all devices.The recommended strategy is to develop against the most recent version of the -platform you are targeting, and test on the minimum one you want to run on. +platform you are targeting, and test on the minimum platform version you want to run on. Here's how to do that:
@@ -999,39 +1089,41 @@ Here's how to do that:
android:minSdkVersionattribute as it is. You do not need to increment the value of the attribute to support new devices and multiple screens. -- Extend compatibility for Android 1.6 (and higher) devices by adding +
- Extend compatibility for Android 1.6 (and higher) devices by adding a new attribute —
android:targetSdkVersion— to theuses-sdkelement. Set the value of the attribute to -"4". This allows your application to "inherit" the platform's +"4". [To support xhdpi and xlarge screens, set the value to +"9".] This allows your application to "inherit" the platform's multiple screens support, even though it is technically using an earlier version of the API.- Add an empty
<supports-screens>element as a child of<manifest>. If you need to enable size or density attributes later, this is where you will add them.- Change your application's build properties, such that it compiles against -the Android 1.6 (API Level 4) library, rather than against the Android 1.5 (or +the Android 1.6 (API Level 4) library [or against Android 2.3 (API Level 9) to support +xhdpi and xlarge screens], rather than against the Android 1.5 (or earlier) library. You will not be able to compile your application against the older platform because of the new manifest attribute.
-- Set up AVDs for testing your application on Android 1.6 and higher +
- Set up AVDs for testing your application on Android 1.6 [or Android 2.3] and higher releases. Create AVDs that use the screen sizes and densities that you want to -support. When you create the AVDs, make sure to select the Android 1.6 or higher +support. When you create the AVDs, make sure to select the Android 1.6 [or Android 2.3] or higher platform as the system image to run. For more information, see How to Test Your Application on Multiple Screens, below.
-- Set up AVDs for testing your application on Android 1.5 (or earlier -platform). You need AVDs running the older platforms you are targeting, so that +
- Set up AVDs for testing your application on older versions of the platform, as low as the +version declared by your
-android:minSdkVersion. You need AVDs running the older +platforms you are targeting, so that you can test for compatibility and ensure that there are no functional regressions.- Compile your application against the Android 1.6 library and run it on the +
- Compile your application against the Android 1.6 [or Android 2.3] library and run it on the AVDs you created. Observe the way your application looks and runs, and test all of the user interactions.
- Debug any display or functional issues. For issues that you resolve in your application code, make certain not to use any APIs -introduced in API Level 4 or later. If you are in doubt, refer to SDK -reference documentation and look for the API Level specifier for the API you -want to use. Using an API introduced in API Level 4 or later will mean that your -application will no longer be compatible with devices running Android 1.5 or -earlier.
+introduced later than the version declared by yourandroid:minSdkVersion. If you +are in doubt, refer to SDK reference documentation and look for the API Level specifier for the API +you want to use. Using newer APIs not supported by your minimum version will mean that your +application will no longer be compatible with devices running on that version.- For resource-related issues, you can try resolving them by:
- Adding a
scaling.anyDensity="false"attribute to @@ -1039,22 +1131,22 @@ earlier.- Creating any size- or density-specific resources you need and placing them in directories tagged with the correct -qualifiers. Qualifiers must be arranged in a proscribed order. See +qualifiers. Qualifiers must be arranged in a proscribed order. See -Alternative Resources for more information.
+Providing Alternative Resources for more information.- Note that if you add size- or density-specific resource directories tagged with any of the resource qualifiers listed in this document, you should make sure to also tag those directories with the
v<api-level>-qualifier (for example,-v4). This ensures that those resources +qualifier (for example,-v4to target API Level 4). This ensures that those resources will be ignored when the application is run on Android 1.5 or lower platform versions.- If your application does not offer support (such as custom layouts) for large screens and you want the platform to display your application in -screen-compatibility mode on larger screens, add a -
largeScreens="false"attribute to the -<supports-screens>element in the manifest. See +screen-compatibility mode on larger screens, add the +largeScreens="false"andxlargeScreens="false"attributes to the +<supports-screens>element in the manifest. See Screen-Compatibility Examples for illustrations of how the platform displays your application in this case.- If your application does not offer support (such as custom layouts) for @@ -1077,6 +1169,16 @@ function on a small-screen device. In many cases, the reduced screen area and density mean that you may need to make tradeoffs in design, content, and function on those devices. +
Also give extra attention to testing your application on an AVD that emulates an xlarge +screen. Devices with extra large screens +are tablet-sized or larger, so you should pay close attention to how usable your application is on +such screens. You might want to design new layouts specifically for extra large screens, to address +usability aspects such as the location and size of buttons in your UI. To test your application on +an extra large screen, create an AVD targeted to Android 2.3 with a high resolution, such as 1280 x +800, and the default density of 160dpi. This AVD will use any resources you've provided with the +
+ +xlargeresouce qualifier.How to Test Your Application on Multiple Screens
Before publishing an application that supports multiple screens, you should @@ -1091,22 +1193,22 @@ not. Once you've tested your application and found that it displays properly on various screen sizes, you should make sure to add the corresponding size attribute(s) to your application's manifest. --> -
--
Figure 4. +
++
Figure 4. A typical set of AVDs for testing screens support.
As a test environment for your applications, set up a series of AVDs that emulate the screen sizes and densities you want to support. The Android SDK -includes six emulator skins to get you started. You can use the Android AVD +includes several emulator skins to get you started. You can use the Android AVD Manager or the
-androidtool to create AVDs that use the various emulator skins and you can also set up custom AVDs to test densities other than -the defaults. For general information about working with AVDs, see +the defaults. For general information about working with AVDs, see Android Virtual Devices.The Android SDK provides a set of default emulator skins that you can use for +
The Android SDK provides a set of default emulator skins that you can use for testing. The skins are included as part of each Android platform that you can install in your SDK. The Android 1.6 platform offers these default skins:
@@ -1125,7 +1227,7 @@ install in your SDK. The Android 1.6 platform offers these default skins: -The Android 2.0 platform offers all of the Android 1.6 default skins, +
The Android 2.0 platform offers all of the Android 1.6 default skins, above, plus:
@@ -1161,15 +1263,15 @@ scale the entire emulator display, based on both the dpi of the skin and of your monitor. The default emulator skins included in the Android SDK are listed in Table 1, earlier in this document. -
--
Figure 5. +
++
Figure 5. Resolution and density options that you can use, when creating an AVD using the AVD Manager.
You should also make sure to test your application on different physical -screen sizes within a single size-density configuration. For example, to -display this screen configuration on a 30" monitor you will need to adjust +screen sizes within a single size-density configuration. For example, to +display this screen configuration on a 30" monitor you will need to adjust the value passed to
@@ -1201,7 +1303,7 @@ or "240" for a high-density screen.-scaleto 96*2.8/3.3 = 81dpi. You can also pass a float value to-scaleto specify your own scaling factor:- Set any other hardware options and complete the AVD creation.
-In the example above (WVGA medium density), the new AVD will emulate a 5.8" +
In the example above (WVGA medium density), the new AVD will emulate a 5.8" WVGA screen.
As an alternative to adjusting the emulator skin configuration, you can use @@ -1216,21 +1318,21 @@ to the emulator command line when starting the AVD. For example,
This section provides examples of how the Android platform displays an application written for the baseline screen configuration — HVGA (320x480) resolution on a 3.2" screen — with all of the platform's size- and -density-compatibility features enabled. That is, the examples show how -the platform displays an application that doesn't provide built-in support +density-compatibility features enabled. That is, the examples show how +the platform displays an application that doesn't provide built-in support for the screen on which it is being rendered, but which instead relies completely on the platform.
-The platform's screen-compatibility features are designed to provide such -an application with a virtual baseline screen environment against which to run, -while at the same time ensuring for the user a physical display that is +
The platform's screen-compatibility features are designed to provide such +an application with a virtual baseline screen environment against which to run, +while at the same time ensuring for the user a physical display that is approximately the same as the baseline screen size and density.
Legacy applications that have not been modified to support multiple -screens would be typical examples of such applications. In most cases, +screens would be typical examples of such applications. In most cases, you would want to add multiple-screens support to a legacy application and publish an updated version, as described in Strategies -for Legacy Applications. However, if you did not do so, the +for Legacy Applications. However, if you did not do so, the platform still performs best-effort rendering of your application, as illustrated below.
@@ -1248,9 +1350,9 @@ density is low density (160 -> 120 virtual dpi).- If the device's screen size is small, there are few options -options for making Android 1.5 applications work well on such a screen, so +options for making Android 1.5 applications work well on such a screen, so Android Market will filter applications that are not known to support these -screens from the device. +screens from the device.
- If the device's screen size is large, it limits the application's diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd index d86859905e862..4f3b0da2ad071 100644 --- a/docs/html/guide/topics/resources/providing-resources.jd +++ b/docs/html/guide/topics/resources/providing-resources.jd @@ -329,7 +329,8 @@ indicates the current locale.
small
normal
-large+large
+xlarge@@ -347,6 +348,10 @@ indicates the current locale. medium-density VGA screen. Such a screen has significantly more available space in both width and height than an HVGA display. Examples are VGA and WVGA medium density screens. +
- {@code xlarge}: Screens that are considerably larger than the traditional + medium-density HVGA screen. In most cases, devices with extra large screens would be too +large to carry in a pocket and would most likely be tablet-style devices. Added in API Level +9.
Added in API Level 4.
See Supporting Multiple @@ -437,6 +442,7 @@ application during runtime.
ldpi
mdpi
hdpi
+xhdpi
nodpi@@ -445,6 +451,8 @@ application during runtime. - {@code mdpi}: Medium-density (on traditional HVGA) screens; approximately 160dpi.
- {@code hdpi}: High-density screens; approximately 240dpi.
+- {@code xhdpi}: Extra high-density screens; approximately 320dpi. Added in API +Level 8
- {@code nodpi}: This can be used for bitmap resources that you do not want to be scaled to match the device density.
diff --git a/docs/html/images/screens_support/screens-ranges.png b/docs/html/images/screens_support/screens-ranges.png index 034ac34eff9703f40e5dce5bfb119570f3fe0669..dce62647878027bba5c6fb122c496534e221d82c 100644 GIT binary patch literal 21221 zcmeFY<8x(S^zIvVY}-c1c6QQ1$LZL%ZQEwYwr$(CZ96yL{++6G>fZa}{sH&J-nDDh zUSo|p*Qz<6@r=(3m6aBSgT{si0s?{)7Za8T0s?{g{+$U4^8L*WwJ87ugdk!H0LY31 z0EDu3)<&ilhCo0rz!fU49EuxHTh2BUORQ5G29rDnnN)W?B8Bb~a~EmiL5N7=w`uaZ z!s2l`aj9bRsY28S@JOaHS1t2zpFu~SUSIEzck6Zh?iW*P=2;z&oM)AwK)lJ^zKB2& zKw#j3$Q4niI(WFz`XfWYurZ)!-9Q}cwnSi-Ffb?~xAd0oV0wUy2C$LEu9#1$2y!8K zU?037NXbnImGA&w_-Z&P(Ewy2q9_EYJ&*MpM7|$8eZn|2nvlu@m=~TtIO5BDK>TDo zHW}>V&agnJ0K`ppNT6FZNb_x8fXy_^2t7W5A56gY51?&qU*Db>&v8Ohj2@(rn4d-v zy}@E{AP=%ItuQ{doCeH~1gT@{K$q-*M$xa>P;B6CF$jUHZT?!RvX2hGns&&WxcCir zh`bqK9}6>UYX!*JF34`H$IZ>?*^Z8lGay28U=z6RK%~B>mKcR)d!Wy%n;zb;MFD{x zq8}=7?S7m+N;{^IX#Mzh0p*|zQhdK^q{xIXgcJgm@^K2HjrMg<^@wV3YGmxRb{qE% zd!nu}2zp_}p%KD=h1L;NCe0_ECd?#u&`;$cmMmBGm!6l)7jxxD&BrYAR3?^c7TpOV zR8$#ld$Jss`D1Qza#G)X?a~G2LHrq^EpK8cFR{7uIv-nK;ZO+Ma+j3qt7?iN zQAePSJE}S&qH#DJ|N5JIs})EaQz=2i<7D(9&Rto(@*%mig-^Lr?(>Y?@W&oqro;{P z!Wz2sdnxlJU$JUATKko `$ z>C)3u?HS{)=G+5Jthbl9?r#X^1muNPlP(hylU{Gj-%s*YM|Nw7YKC@e!+95ROYLKc zQDQZDM`NScQQcS2@!-1A3C0rLWW~%yM%5wrJU8#wq{q_x=iZQimS9_Nn?l#m3#^L^ z!JA}=2L?qIl64@y@aBMe3KYOhyn=$Pf}Om$9QRy(F4{5mi3sLsig1d#O5(B`CoZRQ z%bbgA&BXg7h`t}Z5WVodaM?gA0t)GB!Srk)6ICsoT^;m%n7rtp#3(BDvgYE~lEBg- zvwRaHGtI@Hi&RS$vt=_?%q}+dk1CNnczNoBhU8?0u12bd#&o;1fQt8u4U2P&hx7gO z7d!^|wy5x-;EYU;Esod| xH%VYDsMe!g2PS &K zEc(uMd2KXZ=zGyZh1lXma_&b`N0ulDso0BCP5zj6%(OWCO}T=djqs908xJo>w#Ye; z=Gf5)TleA#Z0}f>@ Qvj-U#KMQ zK#?%!S?;mL!zyqym#^f$c!p#Cwxmf=%yLYMY@iFjNYV7|r~^&zQy<#hqsVB^7|eMJ zE`VwHU1VOK?zdL!UJ?u%1-=x9aD#e}dna+H^r&?`a<}lbaZmHmbp3^8Lo>|>iS!5M zTr!(<{;va>JmOU#M<6l4I(Q}M1C~CVA!<2fJbE@FEqpR0HWZ5+jerK9+xFFCy~ZW% z83RfrG=O 68aDHOIUHZQy502WKw%4myKohy*-wB%OKqQggu(GHJqYX+k~fR8@4xlL*ePB zz=a#$p|3-S2*5^PNnxTdIhrjkH51p=)-2MxZDw<;W`k_zVoPBT<~54n{ar&ZTTk}Y zaLqhfw_ofcW$HO6w54g`3Yp(vVtkVG=QyplO2Y^3OW+61h4cPT!htWsr&v1>2_&Ce zETHpBV4V}NZYf)!fYBVDCnO*kH6V)wU=0eG?#+GB *>Y-|=Wf=~34U|h@8DHgI?d~o@4y08`g8m=ED0 GEF;BE? R?nT&tLo=Q;7@3# zS0!;&ZdEFjYgD{UeNX5;A`v4qG6Y70Qp934b!3DqC-+C!Fqd){DiUe>L$Aoc+`Usg z$w&pjC*jf$xQQBRJ&9Wpy)z9*NUBpBTTEwbb4qwDhwqIV9g_NMGs#F{r)j1EvCik3 zZENQuI>k|SwyDX-+}ZXC3+&;mCm7d*3^o)0E}Voo8grEszJrTY7%Tq0&U8ti3>{`@ zMX^h{IQ-%(p&Gb8mt0+O=!`g(tSEn4S>c3lIdu(sK?>AV=BUd3y|dJnXuYn{(IDSo zXMAzF*s;MC<~I4OB-kw)FYCE6s443*;ws7$dlO^&iY A9 zO|o3LZ3 8R}xS^sOrSe_Y+8p)gSJ`6HwQfo2Z7%ysOvNy#{RY4IXXHta{RaYrR*$KrCS$&~! zQJgA!<)`4zPQlk1;~;}yq7l53@{-mm4XM%U2Kgsuukg4d=KQ0Nh&KvS ImfeKh**lkLQVjf=W7imNLe8?tLdh73aY*~k>ETS^C_jGwz=`Rae%9Q4OM zXwOXhnwOtf0}7Zy#3|xn E z^pf!|c~s3MENpUU`L-)69JoO!Y{;Rg(l~nW^h|(nk%tE3L=*6dTd N6Qw=e&36q3y=4aXavZHiO>H_NVqbJzLC-X^* z6r{vA;ujlX(=h6A??{@Q0j2#PBC}A9#CMPvkU)G9EV3VDzIJh=0i}trkf^43X 5bqMt@x*7m>o`rxh3*&e)mV3J01Eu#){a083OhBR&XnN?X><`A4RuhVaiZ@-KBUAE?mfYF|d5&49( z1>)W3Gmu@pokal%B>>R%UW!hOBIgC^{gKw>mcqlp;?Fv^DdbnBIM6NiQ1fhc`(<6I zzi9V(g8TZrAi3Z+?Uof -ZC7 z!_=uTen#2XyvfS^b;yye#GP5Vr@4BYi>TF+R+ILWY?YF>BLCQ3jBlslWHMisRhJev zI%W-l6mFTz9Q&v3?veU9>J|6R6Ewk}LRO=CqXs^+@se=@)fiP&^ ^z@Z1o?$AA zDw?V^+RpEi4=*=COXNm%H{o~a%hVf-E193zO??e>_Y;q6uTK#Kz5J`*t?%nA6E9>B zWzGmPVPAqB!lMK}66_p=DIu&g3u^?QUz#AGz1e9NU5o a)`Hq!+q2jD zFktt3WePSfb{)h9_ ;MprhxwON z`YB#kd)!Yyv~X~-P<4zzMsisDQau20;%CNw)tCvQ8^A~|pfZHOl0HAD-#iC|>}Xlw zgN%3uA^X!ejy`l(E}}iZf|I}!62%{TpB&$Na05U!JyAkqDnQRVfFMTJ1*Zu@9TM+z z@2B|lJfnf%w7yI*0eN3PIjbG2Tm7-LeS%fI_nY~#NvC`pw069Ih?XqB5C+E7%6={h z3K WgDVj*T>J;c6Ts7dHM-FX0nZQ=`p^S3p<3YWuzjn2Q zXdmMYdR@R@FbN16=N;oiIf@Jp#=m~83h|QUwBiG8=m??CEUi(Xmce e z4~|NViTQs4W!Nc|vOM^GSJ*&MHe#ywKtM1k|9yag(lRiCfCz!ag$4h(0AF|lyQmK& zUKTg>z%T0*!LxwJ#pF8z(XjlC9E(Hc baYMq)C2D=LUNT{c#QVrgrdXU?*<3-v=k2{_CvZ|@ zNjsgC jr2u=F3i{>8W4?*nB>*JJR#b9LNbg`qtB&G`LT8rFe(^5 zcLLm3YXD*#TUT_0g~{9&92=ohPpQOUdHTd-X*uiea=^e);R<3XbBGT0N|xLKE+R!9 z?Q%U_IxZcoIFzz@ER5v$lergGsci!UKh+S`D{dvuc#(L!;SRgJjtiHqKye|*%g`7P zJEe1Ahe7$q?NLBwF0`kd4waFO9Hf(LzO-`kvOeAA zV2NYsqA=K^-Jy1Bu;oA(#Xe4C1Tho^Td3AYTR~ui{MgTGu7!jM-^c<*wFwy3bF5!n zDuOYLmlraixs<(C_z*uFpBUqM4aw*(Y$h24Ze;tq2*v+oC&ccr5g4)7eO5W$=8{;u zYn$K6sj}gOhb*8Ti!r}ptTsOw#O4`|2d$!*y`>{A(RnOLUsGCyJ8k_lW-UU_xgC!5 zU81kJR!pmEE{wdJAO4paWR6goBwO-asl%rRAln!mxNhUX>9z{BLj)VLr3WfwVCJy; zx=BffbbB9qoXC}o!rI@_vZoqn!yG`kUw0?nIeK~9m`iAjm;LA0UuF?DV!HMQ>Mh_} zrm&?2PEE_O$s=rHQrpw=(cPO?DUBn{>Dtf^i4ok$!~RJWsQHS@EmHaW2c Z83EeAGLYK{J^ zsnt~1I%%sSK6{F8WID@Z&u1VEmSMP{I3yxHeQ{)-Ydzo6{yRiHnxFhcwHo$Uw|r2) zf^I~QOol@pz1&@zX|w+@xfUit@|LeapWpMOKT7cjm21=z4Z<&2XD&6zM1(xjbwlGk zT!Mf+ufe$XpPe;vmWH9HNH@pIbdUy# Uz54k1c@qVjZEe7eTkM0buT ;Q8f z4`}@EYxMkNc_?c%`pF`EpFHtYhh4TGyUk 3w;+W!iIp6oQ!M8B35vbC*suH0$(*MfH>A? z=)mO|<|c@Eh}&d_HQ0aUi3dFv09-QB*zUT9UdBS~4o16fvdF6LWzoQPJdPtWC;1C7 z_P%Eh{5hO@7LgqFgNu~0ac`WAByZ1XjybB!p~s`~EM$2K`9ZuwQrYIk&u&mU0}}ew zTD<#@T$Z@ia2`IG8~o+G)vA8&Z%|OFro?Od$#V;_`;n);U0kn@M9cU01=D^)`W(Q# zg32x` ^gf$VQ^|X}_0x z*>o(016D205MF+@JW%@rs{oV8&6sn0Ju;uF9%}Oqm2jAw2ZK&az|s8}$rIDdb0L1k z1PX4*a{`)1Ibc{K1xg%32p`dy6<%bB^ymQKvCxO-KxGc=)wzmc(GyoUf|rC{4euLh zLmROj4)MPIw>E$LVDS(I#=kuw?6+#LtVBhEbdp7eksTh$+4b<0ZZDS@8e2v)j@8e| zDgrP;{n;}_0ooRLqG~2C51<}cE-siw0u7I~@J>2JDA)7rh2`C|3#h}BE;U3*Aq~~U zg}u95#^ik`cfz{SQY|T%{mly6vlUOf?;ZO$QRvhkuw6ydqdpDobhMAqp3C3rU8iP; z9tEpwem~RcN60mYE#+F5LZ*7$y?4f?35c5$rSW(*hs}d$Wi#N{A`>*Zyf#-tv(vZ? z5#nB?I@cWiSqv1UvjeSlccs+_+;uy-DM@Yr5@#$HTYx2$R(s)SH^YQ(6xVL0X8RN? zN^1w0hsakFRl|vk(>+rCc;>2`q-BF48~YKB5k^)c`hA^Vq^P;ZX24D2sc`Yii1K+s zeh?(bP2m7{K0`@r^o5LO$uG&K+V{$sQriJ`<(Gs5Tl_-SWs?y*3m)UEwU7XG)_$sV zcp-ds`9Y~LlL8F?6?KMP3s^9QLg8pMXSY1fdhG^wdpL;<%6ZDKyq!)P+Nx|qiklal z$X|7K2}LT+Ro=riR?UkTA% -qG`GcRcQIC)9 z6vk6+7P_&uhwLfVwAhh`h6e_|Gn;?YcH`Ns=LQS>s{-lQ 9X2wk?0X55FzV& zg_U-q2H)v0f}%EXE-o+v#iTY@RC0LDVhFZk1c)CF4BmG-H@8hWyIkaYbfRWDH=m^I zTnAvn!TZSL*$Yw=A%)-Ew_s}C$Ix?qNj10_#oF_}N`(klw=g1f8IgF`mLJN}jQHT; za!Rp5>SiiIwKZ!-qUgl!6!Zi=#IRbQlz+O{Qs3SW_HaqIBRJ0=CD&|s!}Hnmj0dhM zA0}Ttj^UuoFY&@+yODxH`nH4$c+k&jP-`fCCZ0_wC135-p8}I n&Pq@ReZnxd-hoTHpiMTR&e;(q`WF!CaFG7qfST_DNx94>a zL{1xN-#=lV;t6SB zXsElYAGkX?isuQ)K+6pk>1OXAO{6hRGSw@Vv-no;Dd1oXWB23CQyF83Ni6-OWn}E^ zPmgQXL$oM`DGW0KT!?j&@#9f(|HMDTUr3$nFd2w(COY-T^5SBXj5^7DqRA5JpPkRU zv$L~jm2H((Ra0jVdIhgj-k*1z2V$X6|J4X7Twn|?yvd1XYQZV3r9K~;wBTg62Z_qk zhJ^_j|7wbO5g=Y v^V{9cCq*!fG&MP@j zagwI!!6qa6uX53$MoJNcL*i}ju=)6iYnVWR4FusEk>70h5^;1VciU`|8CXWc@mh8o zT8QtKe>s=%ei$IN%Om|)1dXeK8A$^ATeB9}w _w); 9@n32#PB!wzlfyATf<9hwm zxiED1=uj9?p)jPd
0&x zjSeiHN|S~Kuulb( Q=w*n%y;U3Fzq`7w(_DBf-R zBTSM)2*0f(K99(F`APJfq8uenxc+q;Y^7kg+L=`y(BvU{+U6B$?P)vh|J@~b@`?tR zW2s=Z8Y(soah&%er4>R?J#9GyummH~0Bk!^kTDQ*o?i+W2t+-Tt-rEJ0!Xc+02(Vs z0#n-lZ(;onvW?HIg0`pcLcE^g(>kMuPOVfkh%uUC)qOj%;jn({9Jsn==s{C~GU0&; z+}oKRx8mpee97gMmO)4^F9*q09gk}B8yH>B1F-R#`uj!}Nv5B>(2H*UQwVMPu1g+s zM-M;Vk-K0}r8!gF=V~?h-1Dh617nyWx%!qnmS~>XD6astua9z}4OTP?xu&Cys{;d* z%^GeaaYAGyPFyY)V}2S^PF6KeW0(qni%1-HRx!4!7Sy$pS=q1a$h?Zxuzu6s6$K~H z`-dfM?={P&3hgehr^}7HbyA$R(yGoh`ZWh9r(F#U;H&k|ii(PcmFIy#?UzwyS%Z`o z0po3HIm+P{O`F6d_+T0W4x8-UToAn8NcPR|b?Ea(`|Cj)0go$xc6S`P(YU-s+vx%> z!qRK ZX795sjs>M{6IR zzvv$9ibaTc4y}78?=u>zX& z`cPzeZk)ZJoO2^&F{h8cKbE{dN@P5t(?E?eQPI(JJGXVx9CiXR4)^y%wENq)L1^7$ z(-}YnFo&Q83HCfBIi72ZfgrpYFwd{9zWNA0fnMIPzCNupOz_|ltZaQl^o9egAaEm@ zbxRX;FhQ7~r1B-7^b1E02C#*@kC^l>fa66|SmhUy?+@7|nSZRmOWVZLV8&G=cQ4^@ zCty)XVvRV_0!*Z|0)lwn-|_~1)puhfS0;?}kncotfH`%Jnsm-Gyj05pxI1Tv9!XTY z4R?+|Dn|C6TzT=MmoUUdH;QCyU2R}GWLk>d%@&CgX0NlBwA|rHlo*&A`?e`p_OcO> z;ea&dy}bC4_2#O@;9312@9yVh!iNH3FebD33A|F2b}>3IXM2013t1=kMj3GdB$7-X zUT)Q}pq?+^BepqPtN>zwYVLNG@RA$AM9-F&ohioSpv0uaF_=7~l{+bRo8J?`& DwbR=oyQb4KwzM=6PlWj^`@_HX0gr4vv +vZ)halLT zq-k@Vi1WJ_bb74_@Cc9VhwD%o4-hH53tYfnS!FA Go9EoFbS*L|LW z97FrSDR0#F5zbFyq(8W)az3ybJ3iE_3_{o8H}uq~)g-R9x_!}z4vV?Oh*76L0FLe< z5;I&OKSW3YW#!~zhX4SOYz{FwInd02|7eZ=P`w)6=I5nzS6_>+&fx%t_WQUo-`%?X z)L$M~ u&!HBrI_TJB+Q^ zYk_?MY)+rZxHx3l006E{$eUR|4U(ULi)^<@IC>9#2BML$e;+$d0-{MyyGuZ!FU3i= zML#=MZw?xwg2|Au^u2d0V# vhLov?x0+6JLDXws_+X0_4WFVNJyZ(T2W=X@&ge6=dAW%qLv38@0G|oTd)T5{* z0@!+Czy;_3Bi5K9C5_6)GpKmb3^E{fCQr9MFSZ7;T%$z#()h#phoB1{cXj0868#c6 z8!!x ;K_GQz z@M~(0>7>b01SG=T*uZo^1Ee5A$j-CG02y!$Zc~^RvDH0DIOA9Ccau+>?pGc@U~k^| zUeCIih1u255gY_z<&{j(pdpTDi@NpZ4QdJ(MDvO 3vhZ()1Jdud2Tb84IX=sj5mE(RFB8_8o{y^MS73F|F1?d- zH78!^cbSzNI^}4CR3T9&DY|nbhY;2bLMc|fUcuI`R_ON9D6>PmN=EfF%3LGb)HjSUKp~8{^ zrAucy)ct$Ujb891LeX`gz7FKO`l+VZpi>8B6hqvPIo?lgTN{m*YYH;F56k+|I|`^) zDoQ2ki!*Dx>WY|>M7TyH%i7T&S2kU*3swEo2=b7@BQzF$7+x03U3*d7I%g36u=O^Q zB bC4Ni{a$*j<+pF 2orV86R#Ky?0XhL$s zzJES8bp@vRCJ61vb)}3+B&zHq +}dR2VBYB|bG)^dY- zgVN={Yw~_;Vo(FiVt_C;GXsI@+Cq?OwBF*oAK-smnX;*6=~stjhW0xI!U_V;Ml>Zw zojh^al|&k5#uNYp>y1VUv2NZ0cOl%gxz<4gCc$|IhKWcGpnJtk>4pcl2Q^V3q~J?a zAc+qW69H6ws%XDeS}&g0{AML*j>nXy?bAJ3JKa)o6ggVdd`p>}Hrl8&l7r{Je$UHg zEwG(C6Hh?5m-5cz$PbLfM2F3RdVPJ}9_kcdUeE0t_~i~s_KU3g)DO3hh^do#dM}SC z2ML-#jSL$TpHV1SV;4;*8 TIgL1|`;glImx+U%EtFBBS>W<4Sc za*R(40lvr_2vohI0Z5olc7xl4*)dNH=+QGQh+GOH2?PsWv+n- afm1FbPy#5wcD%m>yNo2!npV9 n{->5H zB6XH2#WE#d7DS(zK7Rogto;a&0AAW#)c1&2n&}*ER$@YUc&r#+4v&D7)903B#r9m= zW3l(@d+P9^Gqw}NK?JpE0+-6h+*@MCAQ^}TM!vrHK|=v+3;VX`mB;sPkCl<=tQj?2 zOL&-M?2ds*e={2~pmwK`vp*no@|5Gz>Q=JS@|ipG R)rhu z`MWctLdTV^F0N?B1abN+l;C)soRV*Yc)+**|7H;XQJ(K`f7;FS+JCA#g=Rv5HDAN` zwvobrdv~T=Q{spUexN^(J _0 x&wVwS^9ob4AzF^XXb!)WuLSA?ELJT0waSs#7ZxSvoCj~*x=IBPfuMf&}1wEnT) zEcoprMk}Sq3PyI+FyDP%z8ecO=oqFW{2U+=;^{IwpmI=fqol2oi&BfM*Q#C>Jn2I- zy;1gdLm7@D0rr{-3o^xXH*OF&;m1 BHx zNm#Y~t~)w???*3f&xbp_10y=$yorUOVw0AABN^2KiQo?o7?9h6- @E z#a78I+E`NC_j?lv=V##qZfo9+1>f!`t@Z+iC?pUtwsNTo?CxB@2pWGAPV&hZHd`L8 z2hwh@aKq(Fy tnYswr@%JwU<^DEqG0)bU9Uw<*6L?1cw;K zE*==Wxk+y)#x$QYK9?~`v0k=Zz{n@il#Fq)G0naPEJLZ#*z~Z^KqN_B^^6M38F(ld zqb|X+p_;X+{F|o`qO)UX 37U!(8s&aEfMH?=hMCxF(kN$E)6>4jA^tF <->RHW34@mBu6r@F&+cK)4PE#rF zd=g*getU9s^x`cM(DwRdT~)sBDYn8hUV+*oY+j1s6pGTJQ!q@{nCoUdhf?8j0ihJu z!2LvEQocPyjg6q&5ksXERyEb?X;50XO&D|p4>Fp#t-@_;YF>xktVvMD*wnD1(_Jv& zcwoPQY;!rk_o5aTV-PsL$mzis42+-7&h$M`5Z0r-+UBXFy!Mcki|vDrKpZi==;d*( zBpFyu;$^HYB*;Sbl`*}Uw1SqDjk`uxP?R*jz!d0u6PL2 +Wl9y&` zq|=Hl0gX~fY9jfzR~=RGYW*XDxbUR`(O&YT1nkM_4X_{tNj4l30G0l9)-IMY($i$G z??xS_nT8#bHiM#M>n_eso&6z+K|YzzJE%vc3dkhvuCSv7l8R>CZ#g7K?kgnsu32>| ztxU6m;^7+xngJ?9GiqiMIL1U1d98RMo#q;LcHjV#-vYj%ACr1uTwb>!f9slxb_AUL zCO8cX#IT9wD(=0}2@#jzpeYQXIAEv)R4`$DO`bk$E8ZfctJc&Os!t~SJo|>Y#LAs$ zL{=}jlE9|hOn(u!VLp0>0thk3vWhIs$bNU52K}wgs_&Qk2Jioe1waOS#lBh}FD(xW zD{wu}ij1b!db*%^bArrUF!(HOk|zysG0==NW+P@;q60Q2IqaXCC&^Z$5qS+tansGl zEkg9wUDR9_=WC(`E<&UpHA5$1kc?W;|IS$t{Wn?-8wl_Ka!jn_5~L2LfFfk^kVLFe z>K`(de%gN?9hR`qBa nD}}PYBDReaHEusQJII z$s!EiLoWX>PBHX<>rd%Vy`*pK0MZwhSOA;YUk8QiUz|UIK&Ft2iWrQ)|8ounz>x^y zVg;*1QUB#$D&)fwP+A(ELiS&Jg#O>@4HGU4hy51^SdmBoTS#$1Wc+_TSHbV}4F3ON z{(rxl^HoH-J0`RWF+;gK5i_HIQbXYXO?n;?L-GFsfQT5<{yzzj RwjX+>xV?p7~erb}vsy z!@|N&|4M0o ?x!1Jn9WBq=MWra*-VjdPyIftqzW#dOX{v$B?BmsM+_^E3uqBTa zs5f`E^nB8RyZ=T(DvFECH#e6#N4)Go%1K#;w-gG&^Vc3--i|#L&tn=j-uiE#45sor zJ Dkwn_$dnGizTLm!9B9L4m5u7SFnCc*-(_2%&~DgibtWi@A~TfWDx? zs89;LOyWg%lZV{~h{Fo+ZQ#Dd$_g6jFXyKeN;nyQh^)6$Yt^=@hlROYT-x;3Fw{57 z`$z7puJA5qV`-ia$F+~OO<1{#abdh)Z*6U>PuN`zWiQiNyR3-Z?RQ2WA6Fk2Q5Ed( zrs<6~?n~K+DfsXZs2DdYSaa&-j?a$4!plCmHVY>W8Rd LwZV6QA#TDn_n3Cy|ST)ii=4* z38sCsZqSAIvh2Z>8NDWju)+gcyY#1^iaEVBfd#xQybA~OKaM0YzjE*#3O<08Ss%Pi z6}4zIituuF`j%@KszK2xT1e}0g+o~9Vm)I@X&^-o5g)SAS38`g+~eq%fMtm$`5z=5 zOjQ1cL>=i{92WB#`sO2p6(jE)V&qoCo!txK%@bFVp+gZ2Bb(=<213dGO(TQy(Vt^+ znKi8(;so Bl`f7esxUu5zBD4^3kSB|!Uk6WL)l!G=KX6rSYaBrr%pd|& zC=0=l&~Uomw>Ii5Tk4e)aUj~RsjI13IJJqKY&ybsoj2I_8numG)Z2_EHA^Eq`2Qqj z371~nkR6p21sAfqMliOm=cMJSSU`cIqFhqRz;F6{XKeu^&cj~F-q@mP1ZFyMoIW=l z);wd1bzzm&6bX^Q~Rn`l@u02g*n?aC4@e~0J ?pr*w|A& zhuXj)E!osUc-3(qvk_rv5jP8@w+tR1?}eDJB@nKF^55HYee>c=h-}IXOo&h}npQc@ zt`(#$$Qc=Z*24?E4G3kXNVu5*rBbQVV@DKlR8Zt>DX}iI?=fQ{a4;$ py1UUjVML92&_)+TZjz z3%0!9duDO51kcB>u|_(b)f2_e9j=#?ezc^Wuj^f)58lp6-zWdyk%-NhA0Z}7pSzB2 zrL>oL=3y%L7kS9$8%jYB_RX~wPHbO7f+i7Li2BJGG_FQyRZF#$Z`a2};?B;ggbMYC zorMtAZ7~>@ca9RW0m 60$W_H#uT2CeAw1Er|y3`uYZ?X;KT^@J% zc@uQ(8_ZxKCBxceuEGfK`l){xJe)GS_C%h 9Zlho8I=qDCS`9! zoYo|DBOaV4%8Y=&iYZD`H3>PUProu|RT?4b(WU-1rB=~(u9tCHMxhVgV&Xh^S(q^3 zK*k_i>~no{wET{HZtvFVaaTD3FB4Klr{hKbv8u$8;yI;{#EBZSYB84HWLYEOe*op| zVLxDGRIP5VeA8X-ddJY%=xV@;93~8cpS+htpYN0x)`>02dmR5`P6L53S>~s41+T_l z&x12=v9+5V)ReeSdApb>4Lh!e#~c4%{P2;js`Zn#)*3@%_{azSX>vs}EZuX8o6TM+ z(KsdUUv~amQP?fNO2<_+L-Qsv$<@}*buT?+oQX-CZl*ueokdNn4~wILSj3_RgMk80 zY^~k#S3~a2*Jl+Ldq-9H%A+H{UcYyOmHOyZ^DAmPsz4gmhMi8X#wiDe)_rC*qpv9n z?p)e;y*u`%%Tpay#vsN`2;doy0s{UGyr>7<&l#oA1APh$Qb_ztEv<~?1?TDJA6aNc z$c>-`1q@H8GRm}V1)MSJe_D+;Fc@}Nj$g6M#vXMKUT~IP+uF8Y^}?;HbSK&n9)<00 z4Yo*VMwhPc3Lf*7wUj6G>)?;=`P_qjFIKz|-^BYgztkE}KJhDEf;l;9;OGwPs#F@c zb)wsg4H~R0IpZh^kZPDK&KuK{V8?WGqyNf$W+$FFdFwk4&p|EC%&cJiHNm$h@!I5- z3WkWn+skV9(CINwy;N6ZU>_~qmA`Lw*5z`UutUSp{aKr-aI5SnsrKak^i*duv>E)! z(0E&FYDK$=Ue1HLYrZ!s`DZw?#Pu90>={=DI*Pk)E;!i==4!qM1nG8_QM8H!j}89h z#msk$HYv0QOirQboSdm^ RUKzb@OcK4lD(b?;Q9g5jyX~wrYdByze#?a zh53l{!-XKx1cNA=ZiOZ_W3Dq&0Q5c)-Yg-@q?sOfjD}K7dQ>=XrX2Tx3jOko;1-$y z`NPv!MM+l<*yyj0S4Lv8Bpd0QiS?Ab-DCS0I{E=Dl*}99Ef|bz2?3(S{IT!px~O#= z{8Cb(R4O*+ lsuAGAZ!Un6HWIL3+nDb}}6K-!Oo%ITd2{ipXM3G!IJ^-iWPk0$M)NG;-!Pn3V> z8Y9WN$|yUeZ+Z5J&oY;_A6(7Wn x}Ke+5Ou62UPd$3q2Z zc-#!oC|Ay#HC%N(WiFi!TyfZD0l|eyKxTk~^nuwe?{OMPiYxj68Kp*1L7@9Am6y{> zTGMJYf0Gtj&;1mGR8aXuh1qGotVU1U)jz=^J4|MBsfH73|MAw_8Av`#-MhzR$r^r% zW|GzdGLn?P)k-oEHBeLk)iSI^KrnO`jsseSBaFOv*u?0USJ8vDwRSd@gZrZbCI4zH zLa;(mU@!ju@s>}(!@>&3ok@>hZ?DJ1=qf;S&g=Xx_%C{7VJq_}*J%TGo;k8%wA00c z2{m`&-#PK>U*i8lq)31n$pVBCtmrkoy9_MvzyLWuGPMcpRoZeJnW33a7Yd9{13?6h z8;n?E#)jDR9~T%3s?7fj_F#_ejxY^Td8&H_Uq^nOU0O;&-9JF1qpo26&3Ya%R8$;d zGPQY;r~ 0u){21X0cT<&WQ<)9_R65ra_-B&)huE39Ao|6+s+`=2rlX~$ beUp{AJ zrsywKBL+1shR~FdCQlzTRfIPlT3CcKD%$-@x9)`6{jVeV#~`VNN2y}B3D_t~Yd8OO z>+AC=mDDYB4rI06)SxkU%6{Bf=7xE-T_OB}%{+CI`sXfG3q%!l@4z}zG}^97_}1(m zJGEw4E>Zn1^cCb1`f;8=4}zB~lCxDfz8MLoEx;4=oR5t5A437g9{NhQU($EMqU%*M zGjVzCqprb~-;aYCV+nr$&MI$0Naxt3I&@Db 7oL1uvHxHqI0~ z^wjm`dEM^*bSa7Wdz!=ZwH^q1trY>ECuB_m+4}ekl?2Gbm%#?z2lR!CTwtXH*cU6^ zFs-ZEuL1w&uJ2N1lXdIf)f2cYU<&p{#|SZfqc!jyAy-hnU-+P=mwm>fy)86A`-S zTXDZyQzF$2i=q031z(pAOaF2l*}Dp9^IVUeiD0ekM8UFj zV$f@_HLm4?QbIpFvT=0#;2&A;qOEV?9a+l0>9Y6waQ0ufCv?bu)Yc7o4^=&V0({*0 za^3aluQT6uH|QLI!n2aWaA qz?>onBHl;nBZ>Xw_r0xlQ+avfO8~@Q~@|zMyb%vkFZy1&G zvwR_eq?r-(zn_l{u6DHPc>J$8FQo^x_p>&qsvhCikrQ`)qXV&+;jd9GZ$C%$M==%t zUl|MPzhBoDZU{@s)^&S)U6H?E0;Nuh>Cd=E^AV&&6Hs_?Y&lwHGU=PQLB{K`A_sZh zA91-H#Dx8CG#N14Uk=mhJMQH(z@Hb@tu>uD95J+9bY*0wz5xqU%-(I5%I_^Ax>*NT zlg$W};Q|!lXXoeo5nnI|L(I!AMpuY7<`w~`9oUY^HA9ANi$>PVxUr7Jo>N;OL~6D| z_Xr)N$3??Z}NlVaCmOG;f6o_;SZ>V zy5mU2@m*0o(M;XpeRP1@T0Q8 zym&;0@E{Piwsh%IJff~eJ>nM*Q vVsRPhT4Z!ExrjrTA(EIPyK~Nef!(r z-n@CUm`F^0MgH>&ff>^fIZM}Lv0-cZUHPuZzPhqF{N6Fkmhxsy9^sQ>`AvGZt?|Io z8}C~a?%1ncyT#-RE+1j=A!jYRy@u&`AKdZ99ZOl)o)zVLY8(SMEJ)U0EE0tO>gC0G zS$zk0ZE0omPlc6l7REke42#up(e8um*WHh+w>Ol?-CbRBcJAVI)bHK|O8@7;reAGb z9Qw)s+p4gsq@U6s^jw&_!MqLnmls}m0eS-M867=FcJQFf#whO>zxV}u0X(APLl1&} z?Sl_KfbxI`Jr3-;(dEIe8(n8|KwVT+l)469P*8wQAAJ_O5A^tWi#`P*u)0JDGDqJb zGRN8GhzzdYdFLJUWuO22=b@->z4caT9dUT=l$L(NnW6Ja_Fth;2%S5Yb5M40`_fA< z;Xo8|?lJH|@uBU6#XF8_M;TFG9L*~_S<%CSJi^hFVz3Ng;Sd5a@r%q+a1n@Ks15uA zZD5GBAouLE&mt|rJaFIuXdyDdM_S;SS}Mf+ XI2~jUI$Vq$;dkV?BX8zZnWgWL{IJkTSo?*C94YkpW3rhmb6Yp6d7# z^hoLh1A&&BI3;ZrGOcopB@~6sZ2l2z;3y$_liAGY+~y5>Jt<`H&+Woe>E;pwGjCHJ z?e7al QzcGJ>>7bwe>}QFx(f=7h0G~4ATLIr{GeDk55(1M#VCFT%q}ZlJga9Ex z2oM6(j=+rVWt#Sq5rKfXVBwuC9rvQ$Y$$vY~WXSy2J6GtDA^!m`awb3ycH0D-sP zejBxq1-v9}(hx}~$iop3JDTPm7Wdq94+@0|x4Boe=_nDdJi(?3tbR{N=9K5`L;#!d zu!#}8VN+a^L(&jQD9FQbSsqZpb{A}*nlo@<7tqFy8=rjg$$$E%f12nu?sEo&2^9p0 zm6Vix_q*S{=%S0T*Y@W>|9Ns>+=TL>$g>{-)HOCeqptDkAa({~A00N-B{`>ch$Ix` z;Rs-(EerzS!6yAj9(e?21oP+5S0gmo+lsR6+qVz)CE(v+FrYYUEXYjpjQK{h*=(^4 z?ka@Y2R<=%I^E*Mi?6ui3T(rrRri^yok`F|i@+9b>~)4!5Uh6a#Q@!(%m?E_tJV6I zuY6_LcQ$E=Bt+ziBY++B|M4IH0fVVjL?A%x)~$m eQ(wMhq}Nk6`H#Xax{0XZ0Oh_{f9*I$1f@+KZ(=Low(#K9xv5Pswg z!2lbe0=pT^rGPOUUVt$WBo@*rA|rm%LD&!zqJ^?R?2#OXBM3~|Cqi72p^#Exb}Ib% zMI6W;@`N9_fluMbBZ>fu@CXNT2`@K%fp~)oLg0r3IXK}* >)jyu+@S%ZE7Yz&J}kLQ8_Y6M*v zdVDBjcwmSJIf2E#(9`gsTSUDh8sb1(!-LvHZv{y}RVF(=(OpiC6QqShT4V^713x4O zkB}Kq5q@-(!h{fUzz;+M5g@u_Q^Y_7<7 0vf%YRrnX^3Hf&|`)Wxa+RF#78dL6+}5hREZ2BkPZR#;OJFTXVuW9;y@RC1D)p< z=A 9t z?Qf*W Au%`aq4 zd*toZk(lc_#pJj7`SgV1T(9W!vV5c=)LQM`hngzzJ N=5bVruyx>4+!)15jW}1l5!Cnga8l_3+wc&G6W)S9b-nj+vjboLoHU> MGzep m z5D;@3AIbT}Yjy>^`nMR%{s62S+g`Y5O;N1q?kx?>ZN6_+4!g*t-4ex{Y#lCSExWa} zfc2hU$=ETKlv7n~7Ot|}UAhgcbEEy&mFieaD8ktfF`Xs!cx@h*E6Q5y9R9DbS;*Ej z+5g!5Ab;Ec-0o(miu*QT5oopB;wXExwZ9g%M2--c6$sEQ)2yh52{Vy*%?@+Tu1)2I zxtiQtzSn&!3#vZE*d-TnvzLgN5?6k+bK(}! Yqh+{lC3zRMTHFXy>psg^-=k8+c4B1`&D2+S}7q# TI=( zSavaE7iK5Bm;8CkVH4uSiJX#KaUts_#Lr&PaPsylZR@(?NBcR;`4?p|wVX YZal@TU~x+6!F@s3>KT!fQ>#c z|K3(rV{Wm)k0d6i%O2l>WoZ+fdF*CoOBU1W>s)>w=2os29~VP26-f>OV?LEPFd&D9 zVH|PUTAbdX!kTQaVcNm{W1?!tTahzWI91XOx(qs<(eC9n;&;~QbS9@SDM%rovrdSp zR&RFjIH@9vE9-qui(aec0%|ta)R=u-3}ttVQ4wpc!Qu?55|jxrO}kwu02W0Z4FR#I zQ*W}noK|$}%05mX--fF D;C zdLn6ejwT!SXl%^#aI8(h8Lcg*8uTzar=s>|InQ%|y*9qdScg-8TZ~(;^Z)<@E=fc| zR3K+s6NV}YK}xd)e5i<8QD0RShug_LkY-nC;C$PiOd4ViG=Z5ff`s8dY%&x^+$JqX z$4X1nqD3h#XvR1!5$IHg(Ww#KNUm>D#%B`D2h6Z72zsz{6shG%(1{kVH6u}?Vb6Sd zC&_^vblI)Oy1F`}#qC! (*MUl)2aigxt$!TjvN74@=FewBuv8%n|Y9UN~ ze=T34#k%e0PsR7; mnj4mZ8sVAtZ&fPJ+fiZ5IMpY@R|jBWmg$^(I*y-gouWZwn*B0 z<5JB&dY5yX+?~8F!MkpK!Z$bn(@OQ+tk)SRRbt~#d>N4c>wGU3XXK KpJz+S7QrZ!pH$wt(j@s$kLwadFPN=yIO&{M(&O8e&jl z$Tx)u O|t?XO6 0;vdeG=6JWtKQ}J znzZ(H-)vI0@bUL!Yynq9G;76Q)v#SP2Ri$reeM5PhOdTv`TX0ROd29pmdHOz1QMU; zJbBz-RPl4Wv0-yrwnkIDc3X|bb#JMda*A)mSF$zb+( w}8LTbBv4VqKywbOxjJ_1-T2#k8@eQ<`cQ+ z-R@+%AL6VsMiC~DKrGxJ2uE-VMNvU~6=DK;#ln4oXii~KUJi?e!?E1F_?*-PvY@Dh zz}N`H`uhU0EJZ$J(Qqs)Rml1}5B>7Qf;%_hcr(`b;?4zYFAojerwnsMs=R`NydldP zW0O+nThb8ftT*DC5FiAm8G-(e`ogmN^>vo7Eb7|4wV|d(YPzR%nrY6u>`6n+x+)=t z2mwN1mLSmEdH5N}Z@S)z+;C^@J!=-t60S1I#{UO*YJjT4T$e8Z0000 __UyB}&)I#>% LsfGaU$3EtYSE@^Hb)Ku42`{O|bCUY<_zF#70P`BPC{1pPay zsov*tQ=AL|dWKpII7VJB8o@MUf-Du)H7Y&Ldyih=Ncj;ywtXRmh5oYYy6@frtlnwd z9rei=;Wz#8l-G-$C8LFL#?ji;s7zYHFBi6b%Zv&98^PNg^!|~Fkn+_yR9fXD-e+T? z+Zp_QKN@b2YyYSS{8(WD-g_+PQh^d?_$=|T@#)19@x<$Q3419K!Pqc3(T?i6`UZW} z@b{cB^@H`Pu+4Mq$wq7IH5d>A5d3E geiV3@u76?-9 Co(6wX(DgvQ3!|?%y|@ z^qbsK_c%&ExZ*<-R?+ ezt3erT;4yANcgc0J atAxo|#;NP`&c=HIs zEsoDN-dlnBc@Pm+SA92vyKuyv5z@w{v{mQEOk6w502HI<#x7%15NgXWE)kd0Eo7_L zS^ z$@)SA>HB^@a>}>eWkC-=E4+Tp>AYW<^WgmEabeBP{EXJVUXnrlMvJ2xVhL-evbaC| zeoJ%BZQKg1CNqQYSPsp?t1~It2c&4faqpTbUywppFDe&_z)=W8+~pB#zq9cRO#$G+ zIy D3+h|Zw?Qqo7-mK6)u?4F?`&R=r>^k`ZWEnt4(N`MDH5b%d{2QKX zd=rpCwTCLL3qG5E@ES;;nFjyOQziCS KV^3B=__co2I fpApySl;oPmr zYFQewx{Ba~LvV$4NwhZMZhJq0Xo-OtxVJ<|Z$}`u3Rt5r&=?a=DfnV#=~e&tKu^CO z1#COh;XE4=&vZ($s>5T#oz)^KX1wd51Zw$Ruen@td>bU*PjsEUYgOexyb>ka-D~CN zVI3o&FCEm8k~G>}V-`P{g0(zCJ;I5YNJfK6K+1YBnju3wS1V&9DuFKM1iGWlUOV zcnVGEuu_$ibAY_p{m!Lt%Ba`7#p1TrUIUl*Ox4|cvd`Tho~rrdn_QDxzn32g!p_|c z@0AI;L(9s_YCSgH$@GNanD(&Rx!nwXEdYWir=XxCCaFAn^ay>VfnF)gwR^n!{x*m8 z+IGKiN`OrmsgWW2AblHzp^-DjN=IuN0T5Pb`a87vAG4#8n|phEAPjBa+pD>gol)dG z&DzG-HKC;1=iYRYBEqf0!@F9a-`BF#eae6V;nco&bo*b3DSJ;hKDTr^URfEYDOBH| zakihPd P$F;NyMs{Lm=^kFeYUpQVN`#-U(2>qoG933B4!oXNfw` z9kPyT?QeeW>$sg26B8r$ND>l1)IVCR<6Vm~FT6$+ROmgh=_FQ3W)8xHb>8+%azQ-L zxlYQqF^$}FH?SF>5Q71okaF52hcYCLwMFT@E&Ic#_>1^X{gvZN zrQ0tHe;Rw~DG-7 Dw;YZY3Q0?Azke+<2pelDl(+! z8myT;wAn}H@Q^bfRECV7j?2$%nzq%rM{3}lrQr)Y(ZQeV1sirUu4NcRRcJ2m(`q<} z Dt@Tk*YDK)$kZp!|Y ;;sm67GuVxRKuil;HAF}9v+r~1yS zZEF=!NSwL&)oEu1o-AaLrT@)M@yJs+02TEr0 6z_ep*=1)=ABj=;=#M`B0WJ@qDPazAWL!!0wJ|GE+l*A}4E7Tgxf9-FM}@Ug zHwL+B0s5vNTrUO$wfJLct)m~J+8z3gae;26Nqg!PS`E3uBa0Kf5kOPrvW*9^$?6;{ z^0HBFs%dCRR%Uwrak*99v?p0PjPdxn!<9p0QLnlRCRRumzI5k$W9`6Zwr(DBfURno z%1*y_=FhKTIN V~Ih~p} zQeJ(D8_}S4yH**CL{pnqXjs2_zdXyF=m9GPCIZ`U#H;)MvT6@EqKU(!d9S`0^Td0) z1Q@0-t!=J=agPG1G-{lHYePw(mhYO5y$LowHDU5o?XZ4BAU>7@-m96=uk~dGLGl%| za1r8q9r6pi(ioAvgH90=7ezAJ3RzkooqiSlJ^=^R1{g+-A3yyQcyynm=g&v;UT_;$ zGTpl+;xa1@ 6S&pKZH~T7(b-@+D+gS z_|oFgN&d0lYOSjdW+cV>f>DYx?{(%gNYhRsTWeQ?+J>%%_3VV>-b&*(_w^0x`a&$Q z4|%tcL%*7=l^@|l|47X(Yb6l-oYhwYt4i%lZ)aCLJKCbwl$Rx;I+oSJ>nC@h!|e{k zir%t_C?kN3N@-z(rcwOQr(A*`Dx}f^#w9Tb5ven`_sa)-w0_~yMqFC(Ebi(b^O8qF zOijUY<`}CTjUlNa{{$VOF&817Z`)7{w2o;af9wrtL>!|D^Xh8j9*zV)QV|rtfx0Jy zGr%248*4P|x{(U34X?L1do}&7E;&z-jR^UMkp3o5<|(!>u6JXfvF2Q#Y|9+Hff;0v z(IScqz3LIw`hkphjapGLgl2g1^hFoC7ZJ0YT#%3HtQlvXN2UWad}+`&uYpclSvCz$ zAGpf{(tr-Pp3&U77ayBk+k9vB`_Jmx?2kq2?_=x$f- o(yo9~Z zRIE6iI1ZI67|VGosmQBNvRSQWw|IkTHmN!w+)Gd6p9C-25yC74XLPu)kmf2UyCp|h z!V`ht&NvcB!~ck1pdT3=$1z$l^Cv I;mI8dP`dQK)KyWo8Cd*y zP*q9Oozz5Dg!PQ~9sfWmJGXJb7w__LREpP0yZ!t*gS^nbBC2j;Y!))guw@N9kFvxW zIInleyG>6&sBg;op!qR0=VGyguzYCK_fp=z3w9+zCi@|Yy0el!Bk`jUb?1XbSr&h< z&LX>>vM){FdL$AR5>uU>2zt!gF>?A3_-;etc- xPs0fL&0wh7kV!`Fel6+Jzv$}z8;Jbyi& zbw(Zf+W8g{wJy1B_c*gDk3RAafZP(U6V0p;5E0gHNiYybL4&TlgsUhIr$GFRuq|cR z*w~Z>Wn#3t2vct)69bFepU%BiS#u(-6vuDaB${5i{F(u-M>b2ya~BbPM7O4&x8yvj zemNr#bT9)goHIq#NDM|G?zAWQzlYvYO~?Z}nd`X~8qci`vmPf!VBba{t|!al5Uq^) zha5{S`-c^ic1=-9Lfq~dPIos#zs}oIpXMb#1o)ys#dd0E?6t^Sy1LaY@{?`@15slU z3|B50Q;;V$()=B-sNX2<#2U)kzOUc$*$Mnovoq55uPx`9!BQ NS^S{l+9K`3Z`CRs#`{?J#B>W*;YG#SzTEV DUA~(vu!suHN5^aU^0B)wE=}D$Au(D;uCNVCM_?0g(8}(ueap_A zD$xvj=#%|q0u6j_*z_~T8I^=nXfx$W{H0fC{^<;Rtb611yFy`Rd|uOsBCVgK?(6=L zaoxoh!*NNY=svd8H$pzmn$4G*+xA5{c>*=B|3MB(>B%O2Whc4Jw)4<`OuslyaFxz? zbkno& 3?;k;N{&vP?BLqzQM kGoIoyyP4rTbw1EJOWiAl`mv-o-NZFNsi;sn#XW601$g{sxUg z_p3!jmwr17SBaJ_0HPqEDUqYe>YL11nzg}&sYz2K(Z9ubc3E$ijZ;02?+K;0 z@fT-XVhtCaN}%w>veIqS5lFQd@|cuh?noikeRJJ1yTT6nOrOCwdAP;y&>t1{+gkpM z{iz&1_bb{<|Mrlei+HWx{5KchG%+(Xt9~?Ng?MVe %|{Q@)%k-$6W9v$y?! zY%Q;-7-$%#b23c3IoKcSzax#A(l7nY^{$^nuOdI61 is8yA{@;`hn9d@opQ503{TjcG(dpFO=@|L-LYvk@r5g`9*Y^{v|`&er4 z7vzPrHh1OkNGc29kZ!}x`Ud|k8KftjR3;xrDhpRFF2==d6AQvNc+amS*u1HaBA?R} zsxY=GsyqF4S l@uU}viO7e)=kRV~!{ pDCqv?WTg0@ct5 zpIU)$Ukv|Vt@eO#gSPhbnm0XvlQY_OH#mmDmM4H#HdiEwev9vmV(4sjO)yOg?kJd6 zK<>*4!13Kklt;*kDPh{Egey8Ox>d^l@5YhB)+NG?pmn*elCUz@BBs-;VFk8yT%?2O zO)6PxvFLP|DWjclAv!_;eZn6BUMrf``J4~8>2#Pg-WX^d+OZ5=veC19EBS46P9Vjg zhvZF*ni_K{1bePDDlFej1v8!UZ$&+72Ozd@oz&Y^0{XVEZ~ B1Bgn3n*r(99&eBM$_Zi^v7Cgwgt4~vyKM`w)i%a{y{1j3u$Y9dpv)Vchtp@VR#}$RotJE$PZTt) z`5Oo$!`G>d(BZa>dA F}Ol61?tbz^3)5*ht)H ziujIEmpy5k5o*Kp<@LS_+-RzLYI^;c|KL|7GQrZ`Z$p+U_;G2-z=j$^bM`WL)CQ~O zyTG(1EJ`! *-vw-x_adTIM zp-fAoHXb2ko$|}kitFVocIdMi*UCU?-(l{GG}8v^x2tRRoa8Gn3MqAT^iz_LqXs&{ z$X$|sG<{YrQ>17?>r$e7uPW=;jzwq(MY6*um`M7yioY~GRX}yCwd&WJa<@?0nrJrw zg}p!w`0U5!InCw~+R`ldV&2I;z&PqMVjo|*W0z(`D6HVtykX|?vF#5`yxpG#n-Ift zWB!!#vfWZwf9IQzqiSbr-8lanf_@g`T+MUZ(3B#r%1?l97c46TGhoeFyY9cg6O7i@ zMX|PY?@?_k#DM9;*^+r~JOQFTG;bi^j40LVbMHgJTfAJU*q<0#HX%iO2Gz@L4ub|T z^`!ElfwzVJFfV#y9)siCkseG_mA0&=RiTDJC3<=64S7fg^3 H%!R}Nb6hybNFMXX z%wTu{v<#l*%P12?-#eQd?L7&1z4}xh0G;PrWI%)B?!HvfH}bDZQx%qTqiPFrZ+FEE z-#KY?-dN}7fH#puQHY!2 6G!-%vbe0T@jAanluD3EY!tIcrMrCIHJ$mCrJUI)I z$ASi>_NCXU)S;Y9zcJo9hf*fsF@tvXD4s^sFXL0SZiY;hkpOVxM$l2bt-NUERm*_r zk&obg@1!$E9orsNj|qVQA;jRXDt24tC;9oVLp35zYi<&^D`ZBzjXhP0vaf#dDf|oG z=B?ii1ywmG6?xACwcu|$3}yV*z7Q*~vg*b+mNA_&3r2g`rnZ_@E53n!cqfb7XC#Qt zY~Oict>bi*U&c+|VS(Mgj!;RWjnV{&AEm$u?;pB zI$nk`#>iR%UBC28*JvSYhjGVMqS3oSM(f(XvyvK}`KELuQrDeU4qS{LwZAwfNeV9f zU>JHNeHMDcS(&dV6x>&QZP?0=%afeP7`6V(cTDZM6p^B+1e+xFHuRvJyFK&nD+p^Y zVZkxWC4lRnCIb b_kSro*ZDNb$ps1V#Peyb!!vPBu&%FN~O zugjC`fJGU`Y%PEJsMWQyU#^KfE7wi$PcZB`0I+7rq9Z!Cm9OdvCv%6V0zG)@qOu7) zs!;DYE)$;Y@=x|A7|*^(CJ;DbBl|DLe+ke=;v^erG1H8!<(EN_1G1 X z*1yPv6R}!Y`3k2VhBoi61cy~kbDi)N_#SMce)D|f?XzknUpg_ga~TfoE%@6O;Z6R9 z_v+MlpHOusc6hE7Gz1vo6!YmUw~A^y(-u#DF23GiZZt((rx8gdC~KW|z}zPgX;)7< z)BxP!FmBCRt@=m&IJV$3F=A>bi{IX)QA|chrN*h!rt2?s@X+78B)5K6YEQnxwY$2E z$8x@VSCo-jInv_L5&q|zAdMpSx`12#ve@3r8{*-VTz6?ydA{gsoydcuzxIF`@T|w& zl0{-==|5U+Wh};o+$b&til}71Fe##XYXYv^6mRtB$kO^?0Wd8)lWDhVP0{p%9$gKq z1WLceXF{rFT#zGVA;B$*zM?$sdGz~wav$4s#pJums(L 3;8c?@y>kcTqM#sU- zW&>wKXMUunqx3HE9A>vSam5%n#*Oa0k=IT{k&+x*f$Mu}12LWTdz(RIk0G)sB`>xK ztYuYNDqq{|p2*IoQM4t7CD^qB?z`jn W5+q*f^b zUKE0A9GldfoZzkgmra NxYGK
=-S5u@h({4dN`N*E&DgbN>CUbk5;)rMg6tzolfVXm0q>Cil@d6<+kCD>4x-v#PT zVNGN03(Y=%;%;4~_=-f9%d;osu-x+1P9AoP6k#NOX;;dz;XRRY=F&b}FOb7 HaU-y11dc&Bh6Zf!^{5y@&J=O