diff options
Diffstat (limited to 'docs')
-rw-r--r-- | docs/html/guide/developing/building/building-cmdline.jd | 2 | ||||
-rw-r--r-- | docs/html/guide/guide_toc.cs | 12 | ||||
-rw-r--r-- | docs/html/guide/topics/providers/calendar-provider.jd | 1185 | ||||
-rw-r--r-- | docs/html/guide/topics/providers/content-providers.jd | 9 | ||||
-rw-r--r-- | docs/html/guide/topics/resources/drawable-resource.jd | 22 | ||||
-rw-r--r-- | docs/html/images/providers/datamodel.graffle | 2029 | ||||
-rw-r--r-- | docs/html/images/providers/datamodel.png | bin | 0 -> 41711 bytes | |||
-rw-r--r-- | docs/html/resources/resources-data.js | 2 | ||||
-rw-r--r-- | docs/html/sdk/ndk/index.jd | 323 | ||||
-rw-r--r-- | docs/html/sdk/sdk_toc.cs | 3 |
10 files changed, 3567 insertions, 20 deletions
diff --git a/docs/html/guide/developing/building/building-cmdline.jd b/docs/html/guide/developing/building/building-cmdline.jd index d78a4f5..c43962a 100644 --- a/docs/html/guide/developing/building/building-cmdline.jd +++ b/docs/html/guide/developing/building/building-cmdline.jd @@ -365,7 +365,7 @@ test project, the tested project is also cleaned.</dd> <dd>Builds a test project and the tested project, installs both <code>.apk</code> files, and runs the tests.</dd> - <dt><code>ant emma debug installt test</code></dt> + <dt><code>ant emma debug install test</code></dt> <dd>Builds a test project and the tested project, installs both <code>.apk</code> files, and runs the tests with code coverage enabled.</dd> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index a3bb6d4..0338685 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -82,9 +82,17 @@ </a></li> </ul> </li> - <li><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html"> + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html"> <span class="en">Content Providers</span> - </a></li> + </a><span class="new">updated</span></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/topics/providers/calendar-provider.html"> + <span class="en">Calendar Provider</span></a> + <span class="new">new!</span> + </li> + </ul> + </li> <li><a href="<?cs var:toroot ?>guide/topics/intents/intents-filters.html"> <span class="en">Intents and Intent Filters</span> </a></li> diff --git a/docs/html/guide/topics/providers/calendar-provider.jd b/docs/html/guide/topics/providers/calendar-provider.jd new file mode 100644 index 0000000..3ab5125 --- /dev/null +++ b/docs/html/guide/topics/providers/calendar-provider.jd @@ -0,0 +1,1185 @@ +page.title=Calendar Provider +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#overview">Basics</a></li> + <li><a href="#manifest">User Permissions</a></li> + <li><a href="#calendar">Calendars table</a> +<ol> + <li><a href="#query">Querying a calendar</a></li> + <li><a href="#modify-calendar">Modifying a calendar</a></li> + <li><a href="#insert-calendar">Inserting a calendar</a></li> + </ol> + </li> + <li><a href="#events">Events table</a> +<ol> + <li><a href="#add-event">Adding Events</a></li> + <li><a href="#update-event">Updating Events</a></li> + <li><a href="#delete-event">Deleting Events</a></li> + </ol> + </li> + <li><a href="#attendees">Attendees table</a> +<ol> + <li><a href="#add-attendees">Adding Attendees</a></li> + </ol> + </li> + <li><a href="#reminders">Reminders table</a> +<ol> + <li><a href="#add-reminders">Adding Reminders</a></li> + </ol> + </li> + <li><a href="#instances">Instances table</a> + <ol> + <li><a href="#query-instances">Querying the Instances table</a></li> + </ol></li> + <li><a href="#intents">Calendar Intents</a> + <ol> + <li><a href="#intent-insert">Using an intent to insert an event</a></li> + <li><a href="#intent-edit">Using an intent to edit an event</a></li> + <li><a href="#intent-view">Using intents to view calendar data</a></li> + </ol> + </li> + + <li><a href="#sync-adapter">Sync Adapters</a></li> +</ol> + + <h2>Key classes</h2> + <ol> + <li>{@link android.provider.CalendarContract.Calendars}</li> + <li>{@link android.provider.CalendarContract.Events}</li> + <li>{@link android.provider.CalendarContract.Attendees}</li> + <li>{@link android.provider.CalendarContract.Reminders}</li> + </ol> +</div> +</div> + +<p>The Calendar Provider is a repository for a user's calendar events. The +Calendar Provider API allows you to perform query, insert, update, and delete +operations on calendars, events, attendees, reminders, and so on.</p> + + +<p>The Calender Provider API can be used by applications and sync adapters. The +rules vary depending on what type of program is making the calls. This document +focuses primarily on using the Calendar Provider API as an application. For +a discussion of how sync adapters are different, see +<a href="#sync-adapter">Sync Adapters</a>.</p> + + +<p>Normally, to read or write calendar data, an application's manifest must +include the proper permissions, described in <a href="#manifest">User +Permissions</a>. To make performing common operations easier, the Calendar +Provider offers a set of intents, as described in <a href="#intents">Calendar +Intents</a>. These intents take users to the Calendar application to insert, view, +and edit events. The user interacts with the Calendar application and then +returns to the original application. Thus your application doesn't need to request permissions, +nor does it need to provide a user interface to view or create events.</p> + +<h2 id="overview">Basics</h2> + +<p><a href="{@docRoot}guide/topics/providers/content-providers.html">Content providers</a> store data and make it accessible to +applications. The content providers offered by the Android platform (including the Calendar Provider) typically expose data as a set of tables based on a +relational database model, where each row is a record and each column is data of +a particular type and meaning. Through the Calendar Provider API, applications +and sync adapters can get read/write access to the database tables that hold a +user's calendar data.</p> + +<p>Every content provider exposes a public URI (wrapped as a +{@link android.net.Uri} +object) that uniquely identifies its data set. A content provider that controls + multiple data sets (multiple tables) exposes a separate URI for each one. All +URIs for providers begin with the string "content://". This +identifies the data as being controlled by a content provider. The Calendar +Provider defines constants for the URIs for each of its classes (tables). These +URIs have the format <code><em><class></em>.CONTENT_URI</code>. For +example, {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}.</p> + +<p>Figure 1 shows a graphical representation of the Calendar Provider data model. It shows the +main tables and the fields that link them to each other.</p> + +<img src="{@docRoot}images/providers/datamodel.png" alt="Calendar Provider Data Model"/> +<p class="img-caption"><strong>Figure 1.</strong> Calendar Provider data model.</p> + +<p>A user can have multiple calendars, and different calendars can be associated with different types of accounts (Google Calendar, Exchange, and so on).</p> + +<p>The {@link android.provider.CalendarContract} defines the data model of calendar and event related information. This data is stored in a number of tables, listed below.</p> + +<table> + <tr> + <th>Table (Class)</th> + <th>Description</th> + </tr> + <tr> + <td><p>{@link android.provider.CalendarContract.Calendars}</p></td> + + <td>This table holds +the calendar-specific information. Each row in this table contains the details for +a single calendar, such as the name, color, sync information, and so on.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Events}</td> + + <td>This table holds the +event-specific information. Each row in this table has the information for a single +event—for example, event title, location, start time, end +time, and so on. The event can occur one-time or can recur multiple times. Attendees, +reminders, and extended properties are stored in separate tables. +They each have an {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID} +that references the {@link android.provider.BaseColumns#_ID} in the Events table.</td> + + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances}</td> + + <td>This table holds the +start and end time for each occurrence of an event. Each row in this table +represents a single event occurrence. For one-time events there is a 1:1 mapping +of instances to events. For recurring events, multiple rows are automatically + generated that correspond to multiple occurrences of that event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Attendees}</td> + + <td>This table holds the +event attendee (guest) information. Each row represents a single guest of an +event. It specifies the type of guest and the guest's attendance response +for the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Reminders}</td> + + <td>This table holds the +alert/notification data. Each row represents a single alert for an event. An +event can have multiple reminders. The maximum number of reminders per event is +specified in +{@link android.provider.CalendarContract.CalendarColumns#MAX_REMINDERS}, +which is set by the sync adapter that +owns the given calendar. Reminders are specified in minutes before the event +and have a method that determines how the user will be alerted.</td> + </tr> + +</table> + +<p>The Calendar Provider API is designed to be flexible and powerful. At the +same time, it's important to provide a good end user experience and +protect the integrity of the calendar and its data. To this end, here are +some things to keep in mind when using the API:</p> + +<ul> + +<li><strong>Inserting, updating, and viewing calendar events.</strong> To directly insert, modify, and read events from the Calendar Provider, you need the appropriate <a href="#manifest">permissions</a>. However, if you're not building a full-fledged calendar application or sync adapter, requesting these permissions isn't necessary. You can instead use intents supported by Android's Calendar application to hand off read and write operations to that application. When you use the intents, your application sends users to the Calendar application to perform the desired operation +in a pre-filled form. After they're done, they're returned to your application. +By designing your application to perform common operations through the Calendar, +you provide users with a consistent, robust user interface. This is the +recommended approach. For more information, see <a href="#intents">Calendar +Intents</a>.</p> + + +<li><strong>Sync adapters.</strong> A sync adapter synchronizes the calendar data +on a user's device with another server or data source. In the +{@link android.provider.CalendarContract.Calendars} and +{@link android.provider.CalendarContract.Events} tables, +there are columns that are reserved for the sync adapters to use. +The provider and applications should not modify them. In fact, they are not +visible unless they are accessed as a sync adapter. For more information about +sync adapters, see <a href="#sync-adapter">Sync Adapters</a>.</li> + +</ul> + + +<h2 id="manifest">User Permissions</h2> + +<p>To read calendar data, an application must include the {@link +android.Manifest.permission#READ_CALENDAR} permission in its manifest file. It +must include the {@link android.Manifest.permission#WRITE_CALENDAR} permission +to delete, insert or update calendar data:</p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"...> + <uses-sdk android:minSdkVersion="14" /> + <uses-permission android:name="android.permission.READ_CALENDAR" /> + <uses-permission android:name="android.permission.WRITE_CALENDAR" /> + ... +</manifest> +</pre> + + +<h2 id="calendar">Calendars Table</h2> + +<p>The {@link android.provider.CalendarContract.Calendars} table contains details +for individual calendars. The following +Calendars columns are writable by both an application and a <a href="#sync-adapter">sync adapter</a>. +For a full list of supported fields, see the +{@link android.provider.CalendarContract.Calendars} reference.</p> +<table> + <tr> + <th>Constant</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Calendars#NAME}</td> + <td>The name of the calendar.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Calendars#CALENDAR_DISPLAY_NAME}</td> + <td>The name of this calendar that is displayed to the user.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Calendars#VISIBLE}</td> + + <td>A boolean indicating whether the calendar is selected to be displayed. A +value of 0 indicates that events associated with this calendar should not be +shown. A value of 1 indicates that events associated with this calendar should +be shown. This value affects the generation of rows in the {@link +android.provider.CalendarContract.Instances} table.</td> + + + </tr> + <tr> + <td>{@link android.provider.CalendarContract.CalendarColumns#SYNC_EVENTS}</td> + + <td>A boolean indicating whether the calendar should be synced and have its +events stored on the device. A value of 0 says do not sync this calendar or +store its events on the device. A value of 1 says sync events for this calendar +and store its events on the device.</td> + </tr> +</table> + +<h3 id="query">Querying a calendar</h3> + +<p>Here is an example that shows how to get all the calendars for a particular +user. For simplicity's sake, in this example the query operation is shown in the +user interface thread ("main thread"). In practice, this should be done in an asynchronous +thread instead of on the main thread. For more discussion, see +<a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a>. If you are not just reading data but modifying it, see {@link android.content.AsyncQueryHandler}. +</p> + + +<pre> + // Projection array. Creating indices for this array instead of doing + // dynamic lookups improves performance. + public static final String[] EVENT_PROJECTION = new String[] { + Calendars._ID, // 0 + Calendars.ACCOUNT_NAME, // 1 + Calendars.CALENDAR_DISPLAY_NAME // 2 + }; + + // The indices for the projection array above. + private static final int PROJECTION_ID_INDEX = 0; + private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1; + private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;</pre> + + +<div class="sidebox-wrapper"> <div class="sidebox"> <h3>Why must you include +ACCOUNT_TYPE?</h3> <p>If you query on a {@link +android.provider.CalendarContract.Calendars#ACCOUNT_NAME +Calendars.ACCOUNT_NAME}, you must also include +{@link android.provider.CalendarContract.Calendars#ACCOUNT_TYPE Calendars.ACCOUNT_TYPE} +in the selection. That is because a given account is +only considered unique given both its <code>ACCOUNT_NAME</code> and its +<code>ACCOUNT_TYPE</code>. The <code>ACCOUNT_TYPE</code> refers to the way that +the account is being synced. It is often but not always the domain. For +example, an account could be synced through a corporate pop3 sync adapter, in which +case the <code>ACCOUNT_TYPE</code> would not be a domain. There is also a +special type of account called {@link +android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL} for calendars not +associated with a device account. {@link +android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL} accounts do not get +synced.</p> </div> </div> + + +<p> In the next part of the example, you construct your query. The selection +specifies the criteria for the query. In this example the query is looking for +all calendars that have the <code>ACCOUNT_NAME</code> +"sampleuser@google.com" and the <code>ACCOUNT_TYPE</code> +"com.google". The query returns a {@link android.database.Cursor} +object that you can use to traverse the result set returned by the database +query. For more discussion of using queries in content providers, see <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>.</p> + + +<pre>// Run query +Cursor cur = null; +ContentResolver cr = getContentResolver(); +Uri uri = Calendars.CONTENT_URI; +String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND (" + + Calendars.ACCOUNT_TYPE + " = ?))"; +String[] selectionArgs = new String[] {"sampleuser@gmail.com", "com.google"}; +// Submit the query and get a Cursor object back. +cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);</pre> + +<p>This next section uses the cursor to step through the result set. It uses the +constants that were set up at the beginning of the example to return the values +for each field.</p> + +<pre>// Use the cursor to step through the returned records +while (cur.moveToNext()) { + long calID = 0; + String displayName = null; + String accountName = null; + + // Get the field values + calID = cur.getLong(PROJECTION_ID_INDEX); + displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX); + accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX); + + // Do something with the values... + + ... +} +</pre> + +<h3 id="modify-calendar">Modifying a calendar</h3> + +<p>To perform an update of an calendar, you can provide the {@link +android.provider.BaseColumns#_ID} of the calendar either as an appended ID to +the Uri + +({@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()}) +or as the first selection item. The selection +should start with <code>"_id=?"</code>, and the first +<code>selectionArg</code> should be the {@link +android.provider.BaseColumns#_ID} of the calendar. +You can also do updates by encoding the ID in the URI. This example changes a +calendar's display name using the +({@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()}) +approach:</p> + +<pre>private static final String DEBUG_TAG = "MyActivity"; +... +long calID = 2; +ContentValues values = new ContentValues(); +// The new display name for the calendar +values.put(Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar"); +Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID); +int rows = getContentResolver().update(updateUri, values, null, null); +Log.i(DEBUG_TAG, "Rows updated: " + rows);</pre> + +<h3 id="insert-calendar">Inserting a calendar</h2> + +<p>Calendars are designed to be primarily managed by a sync adapter, so you +should only insert new calendars as a sync adapter. For the most part, +applications can only make superficial changes to calendars, such as changing the display name. If +an application needs to create a local calendar, it can do this by performing +the calendar insertion as a sync adapter, using an {@link +android.provider.CalendarContract.SyncColumns#ACCOUNT_TYPE} of {@link +android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL}. +{@link android.provider.CalendarContract#ACCOUNT_TYPE_LOCAL} +is a special account type for calendars that are not +associated with a device account. Calendars of this type are not synced to a server. For a +discussion of sync adapters, see <a href="#sync-adapter">Sync Adapters</a>.</p> + +<h2 id="events">Events Table</h2> + +<p>The {@link android.provider.CalendarContract.Events} table contains details +for individual events. To add, update, or delete events, an application must +include the {@link android.Manifest.permission#WRITE_CALENDAR} permission in its +<a href="#manifest">manifest file</a>.</p> + +<p>The following Events columns are writable by both an application and a sync +adapter. For a full list of supported fields, see the {@link +android.provider.CalendarContract.Events} reference.</p> + +<table> + <tr> + <th>Constant</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#CALENDAR_ID}</td> + <td>The {@link android.provider.BaseColumns#_ID} of the calendar the event belongs to.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#ORGANIZER}</td> + <td>Email of the organizer (owner) of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#TITLE}</td> + <td>The title of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION}</td> + <td>Where the event takes place. </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION}</td> + <td>The description of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#DTSTART}</td> + <td>The time the event starts in UTC milliseconds since the epoch. </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#DTEND}</td> + <td>The time the event ends in UTC milliseconds since the epoch. </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_TIMEZONE}</td> + <td>The time zone for the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_END_TIMEZONE}</td> + <td>The time zone for the end time of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#DURATION}</td> + + <td>The duration of the event in <a +href="http://tools.ietf.org/html/rfc5545#section-3.8.2.5">RFC5545</a> format. +For example, a value of <code>"PT1H"</code> states that the event +should last one hour, and a value of <code>"P2W"</code> indicates a +duration of 2 weeks. </td> + + + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#ALL_DAY}</td> + + <td>A value of 1 indicates this event occupies the entire day, as defined by +the local time zone. A value of 0 indicates it is a regular event that may start +and end at any time during a day.</td> + + + </tr> + + + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#RRULE}</td> + + <td>The recurrence rule for the event format. For +example, <code>"FREQ=WEEKLY;COUNT=10;WKST=SU"</code>. You can find +more examples <a +href="http://tools.ietf.org/html/rfc5545#section-3.8.5.3">here</a>.</td> + + </tr> + + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#RDATE}</td> + <td>The recurrence dates for the event. + You typically use {@link android.provider.CalendarContract.EventsColumns#RDATE} + in conjunction with {@link android.provider.CalendarContract.EventsColumns#RRULE} + to define an aggregate set of +repeating occurrences. For more discussion, see the <a +href="http://tools.ietf.org/html/rfc5545#section-3.8.5.2">RFC5545 spec</a>.</td> +</tr> + + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY}</td> + + <td>If this event counts as busy time or is free time that can be +scheduled over. </td> + + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_MODIFY}</td> + <td>Whether guests can modify the event. </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_INVITE_OTHERS}</td> + <td>Whether guests can invite other guests. </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#GUESTS_CAN_SEE_GUESTS}</td> + <td>Whether guests can see the list of attendees.</td> + </tr> +</table> + +<h3 id="add-event">Adding Events</h3> + +<p>When your application inserts a new event, we recommend that you use an +{@link android.content.Intent#ACTION_INSERT INSERT} Intent, as described in <a +href="#intent-insert">Using an intent to insert an event</a>. However, if you +need to, you can insert events directly. This section describes how to do +this.</p> + + +<p>Here are the rules for inserting a new event: </p> +<ul> + + <li>You must include {@link +android.provider.CalendarContract.EventsColumns#CALENDAR_ID} and {@link +android.provider.CalendarContract.EventsColumns#DTSTART}.</li> + +<li>You must include an {@link +android.provider.CalendarContract.EventsColumns#EVENT_TIMEZONE}. To get a list +of the system's installed time zone IDs, use {@link +java.util.TimeZone#getAvailableIDs()}. Note that this rule does not apply if +you're inserting an event through the {@link +android.content.Intent#ACTION_INSERT INSERT} Intent, described in <a +href="#intent-insert">Using an intent to insert an event</a>—in that +scenario, a default time zone is supplied.</li> + + <li>For non-recurring events, you must include {@link +android.provider.CalendarContract.EventsColumns#DTEND}. </li> + + + <li>For recurring events, you must include a {@link +android.provider.CalendarContract.EventsColumns#DURATION} in addition to {@link +android.provider.CalendarContract.EventsColumns#RRULE} or {@link +android.provider.CalendarContract.EventsColumns#RDATE}. Note that this rule does not apply if +you're inserting an event through the {@link +android.content.Intent#ACTION_INSERT INSERT} Intent, described in <a +href="#intent-insert">Using an intent to insert an event</a>—in that +scenario, you can use an {@link +android.provider.CalendarContract.EventsColumns#RRULE} in conjunction with {@link android.provider.CalendarContract.EventsColumns#DTSTART} and {@link android.provider.CalendarContract.EventsColumns#DTEND}, and the Calendar application +converts it to a duration automatically.</li> + +</ul> + +<p>Here is an example of inserting an event. This is being performed in the UI +thread for simplicity. In practice, inserts and updates should be done in an +asynchronous thread to move the action into a background thread. For more +information, see {@link android.content.AsyncQueryHandler}.</p> + + +<pre> +long calID = 3; +long startMillis = 0; +long endMillis = 0; +Calendar beginTime = Calendar.getInstance(); +beginTime.set(2012, 9, 14, 7, 30); +startMillis = beginTime.getTimeInMillis(); +Calendar endTime = Calendar.getInstance(); +endTime.set(2012, 9, 14, 8, 45); +endMillis = endTime.getTimeInMillis(); +... + +ContentResolver cr = getContentResolver(); +ContentValues values = new ContentValues(); +values.put(Events.DTSTART, startMillis); +values.put(Events.DTEND, endMillis); +values.put(Events.TITLE, "Jazzercise"); +values.put(Events.DESCRIPTION, "Group workout"); +values.put(Events.CALENDAR_ID, calID); +values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles"); +Uri uri = cr.insert(Events.CONTENT_URI, values); + +// get the event ID that is the last element in the Uri +long eventID = Long.parseLong(uri.getLastPathSegment()); +// +// ... do something with event ID +// +//</pre> + +<p class="note"><strong>Note:</strong> See how this example captures the event +ID after the event is created. This is the easiest way to get an event ID. You often +need the event ID to perform other calendar operations—for example, to add +attendees or reminders to an event.</p> + + +<h3 id="update-event">Updating Events</h3> + +<p>When your application wants to allow the user to edit an event, we recommend +that you use an {@link android.content.Intent#ACTION_EDIT EDIT} Intent, as +described in <a href="#intent-edit">Using an intent to edit an event</a>. +However, if you need to, you can edit events directly. To perform an update of +an Event, you can provide the <code>_ID</code> of the +event either as an appended ID to the Uri ({@link +android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()}) +or as the first selection item. +The selection should start with <code>"_id=?"</code>, and the first +<code>selectionArg</code> should be the <code>_ID</code> of the event. You can +also do updates using a selection with no ID. Here is an example of updating an +event. It changes the title of the event using the +{@link android.content.ContentUris#withAppendedId(android.net.Uri,long) withAppendedId()} +approach:</p> + + +<pre>private static final String DEBUG_TAG = "MyActivity"; +... +long eventID = 188; +... +ContentResolver cr = getContentResolver(); +ContentValues values = new ContentValues(); +Uri updateUri = null; +// The new title for the event +values.put(Events.TITLE, "Kickboxing"); +myUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); +int rows = getContentResolver().update(updateUri, values, null, null); +Log.i(DEBUG_TAG, "Rows updated: " + rows); </pre> + +<h3 id="delete-event">Deleting Events</h3> + +<p>You can delete an event either by its {@link +android.provider.BaseColumns#_ID} as an appended ID on the URI, or by using +standard selection. If you use an appended ID, you can't also do a selection. +There are two versions of delete: as an application and as a sync adapter. An +application delete sets the <em>deleted</em> column to 1. This flag that tells +the sync adapter that the row was deleted and that this deletion should be +propagated to the server. A sync adapter delete removes the event from the +database along with all its associated data. Here is an example of application +deleting an event through its {@link android.provider.BaseColumns#_ID}:</p> + + +<pre>private static final String DEBUG_TAG = "MyActivity"; +... +long eventID = 201; +... +ContentResolver cr = getContentResolver(); +ContentValues values = new ContentValues(); +Uri deleteUri = null; +deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); +int rows = getContentResolver().delete(deleteUri, null, null); +Log.i(DEBUG_TAG, "Rows deleted: " + rows); +</pre> + +<h2 id="attendees">Attendees Table</h2> + +<p>Each row of the {@link android.provider.CalendarContract.Attendees} table +represents a single attendee or guest of an event. Calling +{@link android.provider.CalendarContract.Reminders#query(android.content.ContentResolver, long, java.lang.String[]) query()} +returns a list of attendees for the +event with the given {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}. +This {@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID} +must match the {@link +android.provider.BaseColumns#_ID} of a particular event.</p> + +<p>The following table lists the +writable fields. When inserting a new attendee, you must include all of them +except <code>ATTENDEE_NAME</code>. +</p> + + +<table> + <tr> + <th>Constant</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}</td> + <td>The ID of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_NAME}</td> + <td>The name of the attendee.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_EMAIL}</td> + <td>The email address of the attendee.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_RELATIONSHIP}</td> + <td><p>The relationship of the attendee to the event. One of:</p> + <ul> + <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_ATTENDEE}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_NONE}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_ORGANIZER}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_PERFORMER}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#RELATIONSHIP_SPEAKER}</li> + </ul> + </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_TYPE}</td> + <td><p>The type of attendee. One of: </p> + <ul> + <li>{@link android.provider.CalendarContract.AttendeesColumns#TYPE_REQUIRED}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#TYPE_OPTIONAL}</li> + </ul></td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS}</td> + <td><p>The attendance status of the attendee. One of:</p> + <ul> + <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_ACCEPTED}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_DECLINED}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_INVITED}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_NONE}</li> + <li>{@link android.provider.CalendarContract.AttendeesColumns#ATTENDEE_STATUS_TENTATIVE}</li> + </ul></td> + </tr> +</table> + +<h3 id="add-attendees">Adding Attendees</h3> + +<p>Here is an example that adds a single attendee to an event. Note that the +{@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID} +is required:</p> + +<pre> +long eventID = 202; +... +ContentResolver cr = getContentResolver(); +ContentValues values = new ContentValues(); +values.put(Attendees.ATTENDEE_NAME, "Trevor"); +values.put(Attendees.ATTENDEE_EMAIL, "trevor@example.com"); +values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE); +values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL); +values.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_INVITED); +values.put(Attendees.EVENT_ID, eventID); +Uri uri = cr.insert(Attendees.CONTENT_URI, values); +</pre> + +<h2 id="reminders">Reminders Table</h2> + +<p>Each row of the {@link android.provider.CalendarContract.Reminders} table +represents a single reminder for an event. Calling +{@link android.provider.CalendarContract.Reminders#query(android.content.ContentResolver, long, java.lang.String[]) query()} returns a list of reminders for the +event with the given +{@link android.provider.CalendarContract.AttendeesColumns#EVENT_ID}.</p> + + +<p>The following table lists the writable fields for reminders. All of them must +be included when inserting a new reminder. Note that sync adapters specify the +types of reminders they support in the {@link +android.provider.CalendarContract.Calendars} table. See +{@link android.provider.CalendarContract.CalendarColumns#ALLOWED_REMINDERS} +for details.</p> + + +<table> + <tr> + <th>Constant</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.RemindersColumns#EVENT_ID}</td> + <td>The ID of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.RemindersColumns#MINUTES}</td> + <td>The minutes prior to the event that the reminder should fire.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.RemindersColumns#METHOD}</td> + <td><p>The alarm method, as set on the server. One of:</p> + <ul> + <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_ALERT}</li> + <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_DEFAULT}</li> + <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_EMAIL}</li> + <li>{@link android.provider.CalendarContract.RemindersColumns#METHOD_SMS}</li> + </ul></td> + </tr> +</table> + +<h3 id="add-reminders">Adding Reminders</h3> + +<p>This example adds a reminder to an event. The reminder fires 15 +minutes before the event.</p> +<pre> +long eventID = 221; +... +ContentResolver cr = getContentResolver(); +ContentValues values = new ContentValues(); +values.put(Reminders.MINUTES, 15); +values.put(Reminders.EVENT_ID, eventID); +values.put(Reminders.METHOD, Reminders.METHOD_ALERT); +Uri uri = cr.insert(Reminders.CONTENT_URI, values);</pre> + +<h2 id="instances">Instances Table</h2> + +<p>The +{@link android.provider.CalendarContract.Instances} table holds the +start and end time for occurrences of an event. Each row in this table +represents a single event occurrence. The instances table is not writable and only +provides a way to query event occurrences. </p> + +<p>The following table lists some of the fields you can query on for an instance. Note +that time zone is defined by +{@link android.provider.CalendarContract.CalendarCache#KEY_TIMEZONE_TYPE} +and +{@link android.provider.CalendarContract.CalendarCache#KEY_TIMEZONE_INSTANCES}.</p> + + +<table> + <tr> + <th>Constant</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#BEGIN}</td> + <td>The beginning time of the instance, in UTC milliseconds.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#END}</td> + <td>The ending time of the instance, in UTC milliseconds.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#END_DAY}</td> + + <td>The Julian end day of the instance, relative to the Calendar's time +zone. + +</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#END_MINUTE}</td> + + <td>The end minute of the instance measured from midnight in the the +Calendar's time zone.</td> + + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#EVENT_ID}</td> + <td>The <code>_ID</code> of the event for this instance.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#START_DAY}</td> + <td>The Julian start day of the instance, relative to the Calendar's time zone. + </td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.Instances#START_MINUTE}</td> + + <td>The start minute of the instance measured from midnight, relative to the +Calendar's time zone. +</td> + + </tr> + +</table> + +<h3 id="query-instances">Querying the Instances table</h3> + +<p>To query the Instances table, you need to specify a range time for the query +in the URI. In this example, {@link android.provider.CalendarContract.Instances} +gets access to the {@link +android.provider.CalendarContract.EventsColumns#TITLE} field through its +implementation of the {@link android.provider.CalendarContract.EventsColumns} interface. +In other words, {@link +android.provider.CalendarContract.EventsColumns#TITLE} is returned through a +database view, not through querying the raw {@link +android.provider.CalendarContract.Instances} table.</p> + +<pre> +private static final String DEBUG_TAG = "MyActivity"; +public static final String[] INSTANCE_PROJECTION = new String[] { + Instances.EVENT_ID, // 0 + Instances.BEGIN, // 1 + Instances.TITLE // 2 + }; + +// The indices for the projection array above. +private static final int PROJECTION_ID_INDEX = 0; +private static final int PROJECTION_BEGIN_INDEX = 1; +private static final int PROJECTION_TITLE_INDEX = 2; +... + +// Specify the date range you want to search for recurring +// event instances +Calendar beginTime = Calendar.getInstance(); +beginTime.set(2011, 9, 23, 8, 0); +long startMillis = beginTime.getTimeInMillis(); +Calendar endTime = Calendar.getInstance(); +endTime.set(2011, 10, 24, 8, 0); +long endMillis = endTime.getTimeInMillis(); + +Cursor cur = null; +ContentResolver cr = getContentResolver(); + +// The ID of the recurring event whose instances you are searching +// for in the Instances table +String selection = Instances.EVENT_ID + " = ?"; +String[] selectionArgs = new String[] {"207"}; + +// Construct the query with the desired date range. +Uri.Builder builder = Instances.CONTENT_URI.buildUpon(); +ContentUris.appendId(builder, startMillis); +ContentUris.appendId(builder, endMillis); + +// Submit the query +cur = cr.query(builder.build(), + INSTANCE_PROJECTION, + selection, + selectionArgs, + null); + +while (cur.moveToNext()) { + String title = null; + long eventID = 0; + long beginVal = 0; + + // Get the field values + eventID = cur.getLong(PROJECTION_ID_INDEX); + beginVal = cur.getLong(PROJECTION_BEGIN_INDEX); + title = cur.getString(PROJECTION_TITLE_INDEX); + + // Do something with the values. + Log.i(DEBUG_TAG, "Event: " + title); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(beginVal); + DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); + Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime())); + } + }</pre> + +<h2 id="intents">Calendar Intents</h2> +<p>Your application doesn't need <a href="#manifest">permissions</a> to read and write calendar data. It can instead use intents supported by Android's Calendar application to hand off read and write operations to that application. The following table lists the intents supported by the Calendar Provider:</p> +<table> + <tr> + <th>Action</th> + <th>URI</th> + + <th>Description</th> + <th>Extras</th> + </tr> + <tr> + <td><br> + {@link android.content.Intent#ACTION_VIEW VIEW} <br></td> + <td><p><code>content://com.android.calendar/time/<ms_since_epoch></code></p> + You can also refer to the URI with +{@link android.provider.CalendarContract#CONTENT_URI CalendarContract.CONTENT_URI}. +For an example of using this intent, see <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-view">Using intents to view calendar data</a>. + + </td> + <td>Open calendar to the time specified by <code><ms_since_epoch></code>.</td> + <td>None.</td> + </tr> + <tr> + <td><p>{@link android.content.Intent#ACTION_VIEW VIEW} </p> + + </td> + <td><p><code>content://com.android.calendar/events/<event_id></code></p> + + You can also refer to the URI with +{@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. +For an example of using this intent, see <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-view">Using intents to view calendar data</a>. + + </td> + <td>View the event specified by <code><event_id></code>.</td> + + <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}<br> + <br> + <br> + {@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}</td> + </tr> + + <tr> + <td>{@link android.content.Intent#ACTION_EDIT EDIT} </td> + <td><p><code>content://com.android.calendar/events/<event_id></code></p> + + You can also refer to the URI with +{@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. +For an example of using this intent, see <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-edit">Using an intent to edit an event</a>. + + + </td> + <td>Edit the event specified by <code><event_id></code>.</td> + + <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}<br> + <br> + <br> + {@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}</td> + </tr> + + <tr> + <td>{@link android.content.Intent#ACTION_EDIT EDIT} <br> + <br> + {@link android.content.Intent#ACTION_INSERT INSERT} </td> + <td><p><code>content://com.android.calendar/events</code></p> + + You can also refer to the URI with +{@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI}. +For an example of using this intent, see <a href="{@docRoot}guide/topics/providers/calendar-provider.html#intent-insert">Using an intent to insert an event</a>. + + </td> + + <td>Create an event.</td> + <td>Any of the extras listed in the table below.</td> + </tr> +</table> + +<p>The following table lists the intent extras supported by the Calendar Provider: +</p> +<table> + <tr> + <th>Intent Extra</th> + <th>Description</th> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}</td> + <td>Name for the event.</td> + </tr> + <tr> + + <td>{@link android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME +CalendarContract.EXTRA_EVENT_BEGIN_TIME}</td> + <td>Event begin time in milliseconds from the epoch.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract#EXTRA_EVENT_END_TIME +CalendarContract.EXTRA_EVENT_END_TIME}</td> + + <td>Event end time in milliseconds from the epoch.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract#EXTRA_EVENT_ALL_DAY +CalendarContract.EXTRA_EVENT_ALL_DAY}</td> + + <td>A boolean that indicates that an event is all day. Value can be +<code>true</code> or <code>false</code>.</td> </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION +Events.EVENT_LOCATION}</td> + + <td>Location of the event.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION +Events.DESCRIPTION}</td> + + <td>Event description.</td> + </tr> + <tr> + <td> + {@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}</td> + <td>Email addresses of those to invite as a comma-separated list.</td> + </tr> + <tr> + <td> + {@link android.provider.CalendarContract.EventsColumns#RRULE Events.RRULE}</td> + <td>The recurrence rule for the event.</td> + </tr> + <tr> + <td> + {@link android.provider.CalendarContract.EventsColumns#ACCESS_LEVEL +Events.ACCESS_LEVEL}</td> + + <td>Whether the event is private or public.</td> + </tr> + <tr> + <td>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY +Events.AVAILABILITY}</td> + + <td>If this event counts as busy time or is free time that can be scheduled over.</td> + +</table> +<p>The following sections describe how to use these intents.</p> + + +<h3 id="intent-insert">Using an intent to insert an event</h3> + +<p>Using the {@link android.content.Intent#ACTION_INSERT INSERT} Intent +lets your application hand off the event insertion task to the Calendar itself. +With this approach, your application doesn't even need to have the {@link +android.Manifest.permission#WRITE_CALENDAR} permission included in its <a +href="#manifest">manifest file</a>.</p> + + +<p>When users run an application that uses this approach, the application sends +them to the Calendar to finish adding the event. The {@link +android.content.Intent#ACTION_INSERT INSERT} Intent uses extra fields to +pre-populate a form with the details of the event in the Calendar. Users can +then cancel the event, edit the form as needed, or save the event to their +calendars.</p> + + + +<p>Here is a code snippet that schedules an event on January 19, 2012, that runs +from 7:30 a.m. to 8:30 a.m. Note the following about this code snippet:</p> + +<ul> + <li>It specifies {@link android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI} + as the Uri.</li> + + <li>It uses the {@link +android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME +CalendarContract.EXTRA_EVENT_BEGIN_TIME} and {@link +android.provider.CalendarContract#EXTRA_EVENT_END_TIME +CalendarContract.EXTRA_EVENT_END_TIME} extra fields to pre-populate the form +with the time of the event. The values for these times must be in UTC milliseconds +from the epoch.</li> + + <li>It uses the {@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL} +extra field to provide a comma-separated list of invitees, specified by email address.</li> + +</ul> +<pre> +Calendar beginTime = Calendar.getInstance(); +beginTime.set(2012, 0, 19, 7, 30); +Calendar endTime = Calendar.getInstance(); +endTime.set(2012, 0, 19, 8, 30); +Intent intent = new Intent(Intent.ACTION_INSERT) + .setData(Events.CONTENT_URI) + .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()) + .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()) + .putExtra(Events.TITLE, "Yoga") + .putExtra(Events.DESCRIPTION, "Group class") + .putExtra(Events.EVENT_LOCATION, "The gym") + .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY) + .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com"); +startActivity(intent); +</pre> + +<h3 id="intent-edit">Using an intent to edit an event</h3> + +<p>You can update an event directly, as described in <a +href="#update-event">Updating events</a>. But using the {@link +android.content.Intent#ACTION_EDIT EDIT} Intent allows an application that +doesn't have permission to hand off event editing to the Calendar application. +When users finish editing their event in Calendar, they're returned to the +original application.</p> <p>Here is an example of an intent that sets a new +title for a specified event and lets users edit the event in the Calendar.</p> + + +<pre>long eventID = 208; +Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); +Intent intent = new Intent(Intent.ACTION_EDIT) + .setData(uri) + .putExtra(Events.TITLE, "My New Title"); +startActivity(intent);</pre> + +<h3 id="intent-view">Using intents to view calendar data</h3> +<p>Calender Provider offers two different ways to use the {@link android.content.Intent#ACTION_VIEW VIEW} Intent:</p> +<ul> + <li>To open the Calendar to a particular date.</li> + <li>To view an event.</li> + +</ul> +<p>Here is an example that shows how to open the Calendar to a particular date:</p> +<pre>// A date-time specified in milliseconds since the epoch. +long startMillis; +... +Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon(); +builder.appendPath("time"); +ContentUris.appendId(builder, startMillis); +Intent intent = new Intent(Intent.ACTION_VIEW) + .setData(builder.build()); +startActivity(intent);</pre> + +<p>Here is an example that shows how to open an event for viewing:</p> +<pre>long eventID = 208; +... +Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); +Intent intent = new Intent(Intent.ACTION_VIEW) + .setData(uri); +startActivity(intent); +</pre> + + +<h2 id="sync-adapter">Sync Adapters</h2> + + +<p>There are only minor differences in how an application and a sync adapter +access the Calendar Provider:</p> + +<ul> + <li>A sync adapter needs to specify that it's a sync adapter by setting {@link android.provider.CalendarContract#CALLER_IS_SYNCADAPTER} to <code>true</code>.</li> + + + <li>A sync adapter needs to provide an {@link +android.provider.CalendarContract.SyncColumns#ACCOUNT_NAME} and an {@link +android.provider.CalendarContract.SyncColumns#ACCOUNT_TYPE} as query parameters in the URI. </li> + + <li>A sync adapter has write access to more columns than an application or widget. + For example, an application can only modify a few characteristics of a calendar, + such as its name, display name, visibility setting, and whether the calendar is + synced. By comparison, a sync adapter can access not only those columns, but many others, + such as calendar color, time zone, access level, location, and so on. +However, a sync adapter is restricted to the <code>ACCOUNT_NAME</code> and +<code>ACCOUNT_TYPE</code> it specified.</li> </ul> + +<p>Here is a helper method you can use to return a URI for use with a sync adapter:</p> +<pre> static Uri asSyncAdapter(Uri uri, String account, String accountType) { + return uri.buildUpon() + .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true") + .appendQueryParameter(Calendars.ACCOUNT_NAME, account) + .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); + } +</pre> +<p>For a sample implementation of a sync adapter (not specifically related to Calendar), see +<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">SampleSyncAdapter</a>. +</body> +</html> diff --git a/docs/html/guide/topics/providers/content-providers.jd b/docs/html/guide/topics/providers/content-providers.jd index 513886a..95331ce 100644 --- a/docs/html/guide/topics/providers/content-providers.jd +++ b/docs/html/guide/topics/providers/content-providers.jd @@ -19,6 +19,11 @@ page.title=Content Providers <li>{@link android.content.ContentResolver}</li> <li>{@link android.database.Cursor}</li> </ol> + +<h2>See also</h2> +<ol> + <li><a href="{@docRoot}guide/topics/providers/calendar-provider.html">Calendar Provider</a></li> +</ol> </div> </div> @@ -36,6 +41,10 @@ package. You can query these providers for the data they contain (although, for some, you must acquire the proper permission to read the data). </p> +<p class="note"><strong>Note:</strong> Android 4.0 introduces the Calendar +Provider. For more information, see <a +href="{@docRoot}guide/topics/providers/calendar-provider.html">Calendar +Provider</a>.</p> <p> If you want to make your own data public, you have two options: You can create your own content provider (a {@link android.content.ContentProvider} diff --git a/docs/html/guide/topics/resources/drawable-resource.jd b/docs/html/guide/topics/resources/drawable-resource.jd index fdf6c5a..80de9f9 100644 --- a/docs/html/guide/topics/resources/drawable-resource.jd +++ b/docs/html/guide/topics/resources/drawable-resource.jd @@ -646,6 +646,7 @@ In XML: <code>@[<em>package</em>:]drawable/<em>filename</em></code> android:state_checkable=["true" | "false"] android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] + android:state_activated=["true" | "false"] android:state_window_focused=["true" | "false"] /> </selector> </pre> @@ -690,8 +691,8 @@ child of a <code><selector></code> element. <dd><em>Boolean</em>. "true" if this item should be used when the object is pressed (such as when a button is touched/clicked); "false" if this item should be used in the default, non-pressed state.</dd> <dt><code>android:state_focused</code></dt> - <dd><em>Boolean</em>. "true" if this item should be used when the object is focused (such as when a button -is highlighted using the trackball/d-pad); "false" if this item should be used in the default, + <dd><em>Boolean</em>. "true" if this item should be used when the object has input focus +(such as when the user selects a text input); "false" if this item should be used in the default, non-focused state.</dd> <dt><code>android:state_hovered</code></dt> <dd><em>Boolean</em>. "true" if this item should be used when the object is being hovered @@ -699,8 +700,11 @@ by a cursor; "false" if this item should be used in the default, non-hovered sta drawable may be the same drawable used for the "focused" state. <p>Introduced in API level 14.</p></dd> <dt><code>android:state_selected</code></dt> - <dd><em>Boolean</em>. "true" if this item should be used when the object is selected (such as when a -tab is opened); "false" if this item should be used when the object is not selected.</dd> + <dd><em>Boolean</em>. "true" if this item should be used when the object is the current +user selection when navigating with a directional control (such as when navigating through a list +with a d-pad); "false" if this item should be used when the object is not selected. +<p>The selected state is used when focus (<code>android:state_focused</code>) is not sufficient +(such as when list view has focus and an item within it is selected with a d-pad).</p></dd> <dt><code>android:state_checkable</code></dt> <dd><em>Boolean</em>. "true" if this item should be used when the object is checkable; "false" if this item should be used when the object is not checkable. (Only useful if the object can @@ -709,8 +713,14 @@ transition between a checkable and non-checkable widget.)</dd> <dd><em>Boolean</em>. "true" if this item should be used when the object is checked; "false" if it should be used when the object is un-checked.</dd> <dt><code>android:state_enabled</code></dt> - <dd><em>Boolean</em>. "true" if this item should be used when the object is enabled (capable of -receiving touch/click events); "false" if it should be used when the object is disabled.</dd> + <dd><em>Boolean</em>. "true" if this item should be used when the object is enabled +(capable of receiving touch/click events); "false" if it should be used when the object is +disabled.</dd> + <dt><code>android:state_activated</code></dt> + <dd><em>Boolean</em>. "true" if this item should be used when the object is activated as +the persistent selection (such as to "highlight" the previously selected list item in a persistent +navigation view); "false" if it should be used when the object is not activated. +<p>Introduced in API level 11.</p></dd> <dt><code>android:state_window_focused</code></dt> <dd><em>Boolean</em>. "true" if this item should be used when the application window has focus (the application is in the foreground), "false" if this item should be used when the application diff --git a/docs/html/images/providers/datamodel.graffle b/docs/html/images/providers/datamodel.graffle new file mode 100644 index 0000000..f8d730f --- /dev/null +++ b/docs/html/images/providers/datamodel.graffle @@ -0,0 +1,2029 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>ApplicationVersion</key> + <array> + <string>com.omnigroup.OmniGrafflePro</string> + <string>138.9.0.117994</string> + </array> + <key>AutoAdjust</key> + <true/> + <key>BackgroundGraphic</key> + <dict> + <key>Bounds</key> + <string>{{0, 0}, {576, 733}}</string> + <key>Class</key> + <string>SolidGraphic</string> + <key>ID</key> + <integer>2</integer> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + </dict> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>CreationDate</key> + <string>2011-10-12 11:34:15 -0700</string> + <key>Creator</key> + <string>Katie McCormick</string> + <key>DisplayScale</key> + <string>1 0/72 in = 1.0000 in</string> + <key>GraphDocumentVersion</key> + <integer>6</integer> + <key>GraphicsList</key> + <array> + <dict> + <key>Bounds</key> + <string>{{249.63, 336.648}, {140.426, 27.9745}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>29</integer> + <key>Line</key> + <dict> + <key>ID</key> + <integer>169</integer> + <key>Position</key> + <real>0.33598536252975464</real> + <key>RotationType</key> + <integer>0</integer> + </dict> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + <key>Width</key> + <real>0.0</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 \ +Reminders.EVENT_ID\ +}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{248.834, 121}, {145.338, 27.9745}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>28</integer> + <key>Line</key> + <dict> + <key>ID</key> + <integer>15</integer> + <key>Position</key> + <real>0.49666976928710938</real> + <key>RotationType</key> + <integer>0</integer> + </dict> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + <key>Width</key> + <real>0.0</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 \ +Events.CALENDAR_ID\ +}</string> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>157</integer> + <key>Info</key> + <integer>5</integer> + </dict> + <key>ID</key> + <integer>170</integer> + <key>Points</key> + <array> + <string>{188.253, 404}</string> + <string>{321.503, 245.17}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Cap</key> + <integer>0</integer> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>TailArrow</key> + <string>CrowBall</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>165</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>157</integer> + </dict> + <key>ID</key> + <integer>169</integer> + <key>Points</key> + <array> + <string>{319.003, 404}</string> + <string>{321.503, 245.17}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Cap</key> + <integer>0</integer> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>TailArrow</key> + <string>CrowBall</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>166</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>157</integer> + <key>Info</key> + <integer>5</integer> + </dict> + <key>ID</key> + <integer>168</integer> + <key>Points</key> + <array> + <string>{450.042, 404}</string> + <string>{321.503, 245.17}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Cap</key> + <integer>0</integer> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>TailArrow</key> + <string>CrowBall</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>167</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>155</integer> + </dict> + <key>ID</key> + <integer>15</integer> + <key>Points</key> + <array> + <string>{321.503, 195}</string> + <string>{321.503, 74.1697}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Cap</key> + <integer>0</integer> + <key>HeadArrow</key> + <string>0</string> + <key>Join</key> + <integer>0</integer> + <key>TailArrow</key> + <string>CrowBall</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>157</integer> + <key>Info</key> + <integer>6</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{281.41, 24}, {80.1852, 50.1697}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica-Bold</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>155</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.491442, 0.260063}</string> + <string>{0.507118, -0.224086}</string> + <string>{0.507118, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27978, -0.478478}</string> + <string>{0.293938, 0.543044}</string> + <string>{-0.286232, 0.553804}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.938075</string> + <key>g</key> + <string>0.938269</string> + <key>r</key> + <string>0.938154</string> + </dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>0.727869</string> + <key>g</key> + <string>0.728019</string> + <key>r</key> + <string>0.72793</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Fuzziness</key> + <real>2.3972222805023193</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.472997</string> + <key>g</key> + <string>0.473094</string> + <key>r</key> + <string>0.473036</string> + </dict> + <key>CornerRadius</key> + <real>3</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Calendars}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{433, 404}, {80.1852, 50.1697}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + <key>Font</key> + <string>DroidSans-Bold</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>167</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.491442, 0.260063}</string> + <string>{0.507118, -0.224086}</string> + <string>{0.507118, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27978, -0.478478}</string> + <string>{0.293938, 0.543044}</string> + <string>{-0.286232, 0.553804}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.937525</string> + <key>g</key> + <string>0.489708</string> + <key>r</key> + <string>0.223421</string> + </dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>0.905866</string> + <key>g</key> + <string>0.149816</string> + <key>r</key> + <string>0.119797</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Fuzziness</key> + <real>2.3972222805023193</real> + <key>ShadowVector</key> + <string>{1, 2}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.461178</string> + <key>g</key> + <string>0.0874307</string> + <key>r</key> + <string>0</string> + </dict> + <key>CornerRadius</key> + <real>3</real> + <key>Draws</key> + <string>NO</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf1 Instances}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{278.91, 404}, {80.1852, 50.1697}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + <key>Font</key> + <string>DroidSans-Bold</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>166</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.491442, 0.260063}</string> + <string>{0.507118, -0.224086}</string> + <string>{0.507118, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27978, -0.478478}</string> + <string>{0.293938, 0.543044}</string> + <string>{-0.286232, 0.553804}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.937525</string> + <key>g</key> + <string>0.489708</string> + <key>r</key> + <string>0.223421</string> + </dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>0.905866</string> + <key>g</key> + <string>0.149816</string> + <key>r</key> + <string>0.119797</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Fuzziness</key> + <real>2.3972222805023193</real> + <key>ShadowVector</key> + <string>{1, 2}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.461178</string> + <key>g</key> + <string>0.0874307</string> + <key>r</key> + <string>0</string> + </dict> + <key>CornerRadius</key> + <real>3</real> + <key>Draws</key> + <string>NO</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf1 Reminders}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{281.41, 195}, {80.1852, 50.1697}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>DroidSans-Bold</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>157</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.491442, 0.260063}</string> + <string>{0.507118, -0.224086}</string> + <string>{0.507118, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27978, -0.478478}</string> + <string>{0.293938, 0.543044}</string> + <string>{-0.286232, 0.553804}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0.874135</string> + <key>r</key> + <string>0.71718</string> + </dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0.662438</string> + <key>r</key> + <string>0.464468</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Fuzziness</key> + <real>2.3972222805023193</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.93512</string> + <key>g</key> + <string>0.472602</string> + <key>r</key> + <string>0.333854</string> + </dict> + <key>CornerRadius</key> + <real>3</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Events}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{124.821, 404}, {80.1852, 50.1697}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + <key>Font</key> + <string>DroidSans-Bold</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>165</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.491442, 0.260063}</string> + <string>{0.507118, -0.224086}</string> + <string>{0.507118, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27978, -0.478478}</string> + <string>{0.293938, 0.543044}</string> + <string>{-0.286232, 0.553804}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.937525</string> + <key>g</key> + <string>0.489708</string> + <key>r</key> + <string>0.223421</string> + </dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>0.905866</string> + <key>g</key> + <string>0.149816</string> + <key>r</key> + <string>0.119797</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Fuzziness</key> + <real>2.3972222805023193</real> + <key>ShadowVector</key> + <string>{1, 2}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.461178</string> + <key>g</key> + <string>0.0874307</string> + <key>r</key> + <string>0</string> + </dict> + <key>CornerRadius</key> + <real>3</real> + <key>Draws</key> + <string>NO</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf1 Attendees}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{383, 317.03}, {150.288, 18.4565}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>22</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Pad</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Instances.EVENT_ID}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{107, 317.03}, {154.243, 18.4565}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>20</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Pad</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Attendees.EVENT_ID}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + </array> + <key>GridInfo</key> + <dict> + <key>ShowsGrid</key> + <string>YES</string> + </dict> + <key>GuidesLocked</key> + <string>NO</string> + <key>GuidesVisible</key> + <string>YES</string> + <key>HPages</key> + <integer>1</integer> + <key>ImageCounter</key> + <integer>1</integer> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>Layer 1</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict> + <key>Animate</key> + <string>NO</string> + <key>circoMinDist</key> + <real>18</real> + <key>circoSeparation</key> + <real>0.0</real> + <key>layoutEngine</key> + <string>dot</string> + <key>neatoSeparation</key> + <real>0.0</real> + <key>twopiSeparation</key> + <real>0.0</real> + </dict> + <key>LinksVisible</key> + <string>NO</string> + <key>MagnetsVisible</key> + <string>NO</string> + <key>MasterSheets</key> + <array/> + <key>ModificationDate</key> + <string>2011-10-20 15:09:11 -0700</string> + <key>Modifier</key> + <string>Katie McCormick</string> + <key>NotesVisible</key> + <string>NO</string> + <key>Orientation</key> + <integer>2</integer> + <key>OriginVisible</key> + <string>NO</string> + <key>PageBreaks</key> + <string>YES</string> + <key>PrintInfo</key> + <dict> + <key>NSBottomMargin</key> + <array> + <string>float</string> + <string>41</string> + </array> + <key>NSLeftMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSPaperSize</key> + <array> + <string>size</string> + <string>{612, 792}</string> + </array> + <key>NSRightMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSTopMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + </dict> + <key>PrintOnePage</key> + <false/> + <key>QuickLookPreview</key> + <data> + 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 + IC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAw + IFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1By + b2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9y + U3BhY2UgPDwgL0NzMSA4IDAgUgovQ3MyIDEzIDAgUiA+PiAvRm9udCA8PCAvRjEuMCAx + NCAwIFIgL0YyLjAgMTYgMCBSID4+IC9YT2JqZWN0IDw8IC9JbTEgOSAwIFIKL0ltMiAx + MSAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoMiAxNyAwIFIgL1NoMSAxNSAwIFIgL1NoMyAx + OCAwIFIgL1NoNCAxOSAwIFIKL1NoNSAyMCAwIFIgPj4gPj4KZW5kb2JqCjE3IDAgb2Jq + Cjw8IC9Db2xvclNwYWNlIDIxIDAgUiAvU2hhZGluZ1R5cGUgMiAvQ29vcmRzIFsgNDAu + NTkyNiAtMjUuNTg0ODUgNDAuNTkyNTkKMjUuNTg0ODcgXSAvRG9tYWluIFsgMCAxIF0g + L0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDIyIDAgUiA+PgplbmRvYmoK + MTUgMCBvYmoKPDwgL0NvbG9yU3BhY2UgMjEgMCBSIC9TaGFkaW5nVHlwZSAyIC9Db29y + ZHMgWyA0MC41OTI2IC0yNS41ODQ4NSA0MC41OTI1OQoyNS41ODQ4NyBdIC9Eb21haW4g + WyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMjMgMCBSID4+ + CmVuZG9iagoxOCAwIG9iago8PCAvQ29sb3JTcGFjZSAyMSAwIFIgL1NoYWRpbmdUeXBl + IDIgL0Nvb3JkcyBbIDQwLjU5MjYgLTI1LjU4NDg1IDQwLjU5MjU5CjI1LjU4NDg3IF0g + L0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAy + NCAwIFIgPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9Db2xvclNwYWNlIDIxIDAgUiAvU2hh + ZGluZ1R5cGUgMiAvQ29vcmRzIFsgNDAuNTkyNiAtMjUuNTg0ODUgNDAuNTkyNTkKMjUu + NTg0ODcgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1 + bmN0aW9uIDI1IDAgUiA+PgplbmRvYmoKMjAgMCBvYmoKPDwgL0NvbG9yU3BhY2UgMjEg + MCBSIC9TaGFkaW5nVHlwZSAyIC9Db29yZHMgWyA0MC41OTI2IC0yNS41ODQ4NSA0MC41 + OTI1OQoyNS41ODQ4NyBdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs + c2UgXSAvRnVuY3Rpb24gMjYgMCBSID4+CmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGgg + MTAgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTc0IC9I + ZWlnaHQgMTE0IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDI3IDAgUiAvSW50 + ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAyOCAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAv + RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0AENAAAAwqD3T20ON4hAYcCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + PgYG6HQAAQplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjI4MwplbmRvYmoKMTEgMCBv + YmoKPDwgL0xlbmd0aCAxMiAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdl + IC9XaWR0aCAxODIgL0hlaWdodCAxMjIgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3Bh + Y2UgMjcgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDMwIDAgUiAvQml0c1Bl + ckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEA + AADCoPVPbQZ/iEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg4BsYBEMA + AQplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjMxNAplbmRvYmoKMzAgMCBvYmoKPDwg + L0xlbmd0aCAzMSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0 + aCAxODIgL0hlaWdodCAxMjIgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9s + YXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+ + PgpzdHJlYW0KeAHt3E1vomAQB3ABBcQXKjTtYqH2UGxtlaauTeoLTU1gtW6tmEq13/+L + LLibFNHZyzrZx2TmZOYwjj/R2/wzGSoSIAES2JcAx/MCi8XzHPQROV7IiZKcZ69kScwK + uxfnhJxcKKkVjb2qqKWCnBN2ePOCWFD106ppnbNWllk91dWCuL02J0hFvXph3zQd546t + cpxmw64ZelFKr80JYvHYqjsP3YH7xFq5g27HqVvHxbQ2nyvo1nW7P/RH4xfWajzyh732 + taUpOX7jr0SQVaPedv2fb7NgzloFs7eJN2jXDVUSkltz2YJ+4fT91/kiDD9YqzBczF+9 + nlPTlWzyf4QXS6f2w3AyD5fL1Wr1yVJF+yyX4Xwy7NgnJXFja0mt3nT9t0W8M2Nbf37G + ey+mfrdRVaXkgy3IFbM5GM1C5qTjbz3eOpyN+rdnR/LG1vmK5bjjIGQP+s/aYTB2W1ZF + Tv4chbx27jy9zKOtWXqkv3ZZhcHLk2Np+fTWdwe79cfXp2Ps1ccctmZ86/PdTwhtvd9H + bP2EkPV+UYFpZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILTJGgEVGEnWAAxCm6wRUIGR + ZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILTJGgEV + GEnWAAxCm6wRUIGRZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILTJGgEVGEnWAAxCm6wR + UIGRZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILTJGgEVGEnWAAxCm6wRUIGRZA3AILQP + 2Bq8JUVg2sdI8AL2993uPt4CYQaw9UHcSJupG+lDuUffuKLno9v/Rtefrm//Eb7gfxsZ + X9G/T71uI4qHSF7Rr3MWOmznLDx3LlM5C1xW0WtOz1tnWjCWahFG9R5nWrTSmRYZQVIN + uz3wJtNZwFqASBDMplF+yL1tlDfzQzJ8TtGsq3bv2fvBXFjLePTDe+7dX5lbWS3rXBzT + bnUe+y5rwTiu23/83rJNfSsXJxNnEGlG7bJx22w5bFWreXt9WfumbS+didYWlbJ+YpyZ + FmtlnhknWllJJxCtI3KibC1JKZWPKlExFK8Vr3NULirSzmytSJsXslGOGXtBZvJfcsxi + cI7N0LgoMi6Z4pNMT6LXJEAC/1fgF8y5cjkKZW5kc3RyZWFtCmVuZG9iagozMSAwIG9i + ago4ODQKZW5kb2JqCjI4IDAgb2JqCjw8IC9MZW5ndGggMjkgMCBSIC9UeXBlIC9YT2Jq + ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTc0IC9IZWlnaHQgMTE0IC9Db2xvclNw + YWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0ZSB0cnVlIC9CaXRzUGVyQ29tcG9uZW50 + IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dzbTupQEAbgrh4obYAe + EuuuUpINJh5Ka4KJNUGqRmNLorYEi/D+L7IXVHR03w7JIpm5mqvJz5cpd2skiWrnAkyW + FRFLltnv386Yojb0piFeNfWGqrAfgZms6mbbchxXtHJsq2XqKvRlima0Xe+oG/REq6Dr + e27b0L7jMlkz7cPeyfkwji/Fqjganp/0Dm1Tk7fLy1TD9gfh1c14kopWk/HNVdj3bUPd + rq6itw8HcXL3lOVT0SrPntIk6nttXalxmWq6vTB5yF+LciZalcVr/pCEgWt+4rJGyzu5 + usuLeVUtRKuqmhd5Ohp4La1eBVm3js5vnl7ni4/lcrkSqXiej8X85TE58zt6/Z3JTbs7 + HGdFxcOKFHWThcd9L57H4bH9mVYxnCCa5GUlYNjVarmsynwSdZ1m/ZkphtuL0+msEk92 + zcvTTidx4BrfaS/FTpv+n3Yh3NLWgRaz6b6l7f3eBKFtKe1ONn+zt2RLtivahJ0swWYo + 2ZJtLUCbQJtAm7C7HSBbsoUC9H8LNXB7ssX1hNPIFmrg9mSL6wmnkS3UwO3JFtcTTiNb + qIHbky2uJ5xGtlADtydbXE84jWyhBm5PtriecBrZQg3cnmxxPeE0soUauD3Z4nrCaWQL + NXB7ssX1hNPIFmrg9mSL6wmnkS3UwO3JFtcTTiNbqIHbky2uJ5xGtlADtydbXE84jWyh + Bm5PtriecBrZQg3cnmxxPeG0je0ev93bp3eR+/TmdL/e88p6xz8T/K30qd9p1G+lmdby + BqM0f5u/V4K9ROd53udvGX+HfrB9h75+4x+EyX32UpSiPfIvy+Ilu7++CJyvAwr8foLX + j67Tx2fhDijk2fNjer2+n/C5CJLEb1NYfj8cJeNb0Y5TTG7Hyeji7x/ri1aS+N0PywsG + p+EwisWqaBieDgLP4mdKtnc/JH6mhN9UOfCPu4Fo1T32D5wfN1X4Lshqw2x1bIeXQBdr + 1nGsTsto/LhXw5F5Xk3EY0D8FJD2O+t6J5iYh5b4maXt7ZevzaWGBP4BbIC/7gplbmRz + dHJlYW0KZW5kb2JqCjI5IDAgb2JqCjc3NwplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0 + aCAzMyAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVE + ZWNvZGUgPj4Kc3RyZWFtCngBhVTPaxNBFP42bqnQIghaaw6yeJAiSVmraEXUNv0RYmsM + 2x+2RZBkM0nWbjbr7ia1pYjk4tEq3kXtoQf/gB568GQvSoVaRSjeqyhioRct8c1uTLal + 6sDOfvPeN+99b3bfAA1y0jT1gATkDcdSohFpbHxCavyIAI6iCUE0JVXb7E4kBkGDc/l7 + 59h6D4FbVsN7+3eyd62a0raaB4T9QOBHmtkqsO8XcQpZEgKIPN+hKcd0CN/j2PLsjzlO + eXjBtQ8rPcRZInxANS3Of024U80l00CDSDiU9XFSPpzXi5TXHQdpbmbGyBC9T5Cmu8zu + q2KhnE72DpC9nfR+TrPePsIhwgsZrT9GuI2e9YzVP+Jh4aTmxIY9HBg19PhgFbcaqfg1 + whRfEE0nolRx2S4N8Ziu/VbySoJwkDjKZGGAc1pIT9dMbvi6hwV9JtcTr+J3VlHheY8T + Z97U3e9F2gKvMA4dDBoMmg1IUBBFBGGYsFBAhjwaMTSycj8jqwYbk3sydSRqu3RiRLFB + ezbcPbdRpN08/igicZRDtQiS/EH+Kq/JT+V5+ctcsNhW95Stm5q68uA7xeWZuRoe19PI + 43NNXnyV1HaTV0eWrHl6vJrsGj/sV5cx5oI1j8RzsPvxLV+VzJcpjBTF41Xz6kuEdVox + N9+fbH87PeIuzy611nOtiYs3VpuXZ/1qSPvuqryT5lX5T1718fxnzcRj4ikxJnaK5yGJ + l8Uu8ZLYS6sL4mBtxwidlYYp0m2R+iTVYGCavPUvXT9beL1Gfwz1UZQZzNJUifd/wipk + NJ25Dm/6j9vH/Bfk94rnnygCL2zgyJm6bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8 + qxatUjWfILwBHHaHeh7oKZjTlpbNOVKHLJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbY + mdMdbhyhOUL3xKdKZZP6r/ERsP2wUvn5rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQpl + bmRvYmoKMzMgMCBvYmoKNzM3CmVuZG9iagoyMSAwIG9iagpbIC9JQ0NCYXNlZCAzMiAw + IFIgXQplbmRvYmoKMzQgMCBvYmoKPDwgL0xlbmd0aCAzNSAwIFIgL04gMyAvQWx0ZXJu + YXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVTP + axNBFP42bqnQIghaaw6yeJAiSVmraEXUNv0RYmsM2x+2RZBkM0nWbjbr7ia1pYjk4tEq + 3kXtoQf/gB568GQvSoVaRSjeqyhioRct8c1uTLal6sDOfvPeN+99b3bfAA1y0jT1gATk + DcdSohFpbHxCavyIAI6iCUE0JVXb7E4kBkGDc/l759h6D4FbVsN7+3eyd62a0raaB4T9 + QOBHmtkqsO8XcQpZEgKIPN+hKcd0CN/j2PLsjzlOeXjBtQ8rPcRZInxANS3Of024U80l + 00CDSDiU9XFSPpzXi5TXHQdpbmbGyBC9T5Cmu8zuq2KhnE72DpC9nfR+TrPePsIhwgsZ + rT9GuI2e9YzVP+Jh4aTmxIY9HBg19PhgFbcaqfg1whRfEE0nolRx2S4N8Ziu/VbySoJw + kDjKZGGAc1pIT9dMbvi6hwV9JtcTr+J3VlHheY8TZ97U3e9F2gKvMA4dDBoMmg1IUBBF + BGGYsFBAhjwaMTSycj8jqwYbk3sydSRqu3RiRLFBezbcPbdRpN08/igicZRDtQiS/EH+ + Kq/JT+V5+ctcsNhW95Stm5q68uA7xeWZuRoe19PI43NNXnyV1HaTV0eWrHl6vJrsGj/s + V5cx5oI1j8RzsPvxLV+VzJcpjBTF41Xz6kuEdVoxN9+fbH87PeIuzy611nOtiYs3VpuX + Z/1qSPvuqryT5lX5T1718fxnzcRj4ikxJnaK5yGJl8Uu8ZLYS6sL4mBtxwidlYYp0m2R + +iTVYGCavPUvXT9beL1Gfwz1UZQZzNJUifd/wipkNJ25Dm/6j9vH/Bfk94rnnygCL2zg + yJm6bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwBHHaHeh7oKZjTlpbN + OVKHLJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3xKdKZZP6r/ERsP2w + Uvn5rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKMzUgMCBvYmoKNzM3CmVu + ZG9iago4IDAgb2JqClsgL0lDQ0Jhc2VkIDM0IDAgUiBdCmVuZG9iagozNiAwIG9iago8 + PCAvTGVuZ3RoIDM3IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVy + IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHVWWdYFM2y7plNwLKkJeccRXKWnCRIDoJI + WtKScw5KUoIgiICAoIAIIoIYCAIiYAJEgoARCaIgqGACBOEO6vd95z7nnH/3z+3n2Z53 + q6qra6d6uqfeBYBt2S042B+mAyAgMDzUylCH96CDIy/uBaAAECAAJiDrRgoL1rawMAX/ + tX2fQGyRNia56+u/mv1nBb2HZxgJAMgCUbt7hJECEHwdAFiHFBwaDgBqHZEPR4UHIxj9 + AMGMoUiACH65i71/45Vd7P4LY9C/bGysdAHAsAJAQe3mFuoNAEEQkfNGkrwRPwQ9ALAM + gR7kQACIBxGsQfJx8wCArRix2RMQELSL+xAs6v4vfrz/Bbu5uf/t083N+2/8+7cgI5GJ + 9chhwf5uMb++/F92Af4RyP361RiQnjrQ32w3N8zIZ8HDTc8EuXIin+1g/185Q2wgds9A + W2tEtov3BLqbmf/BGl6hBlYIRsZCFsHhOrsYuWeQV3C4hc0feWKsj64ZgqkReYFnmP5f + fs75uhnv5owGkTeHRljZIlgQwd1hkdb6CEZWFPQm1sfG/o/NVw9PvT9yGPYiGxj9toEZ + yOFGu3MxIjnn9wsy2Y0BmQtWBCbAH3iCCBCK9IFAEpgCXaD3p5cEXsAN0UQiujDgB94i + OAAZEYSMCUIw7x873X+TGPwa542M+98eeQEJsY34e87fs/Eic/7lkww8EPyX3A2ZY1e3 + G12YCzn5nzn/stj19ysa6XrpRemtv2JCC6Nl0QpoHbQ6WgOtAnjRzGh2IImWRyujtdGa + aDVEpwIMwBvEs/dfMe76D2j2iiwOilG180G0u7/d/S8tsPtlTf77+79FAMhDyy3Lf0UA + QLhnNPIcAKAbFBwTSvb2CefVRp5czz28RoGkvXt4ZaVlZHbV/2/a7p71O9gvVr/2Ioj5 + 8T+ygEYAlMnIenT+R+Z+EoB2SeTZr/9HJlyI7A2+AAwIkiJCI3/7Q+9eMIAK0CIrlA1w + AwEgitxnWaAI1IAW0AfGwBzYAAfgjKwfH2QNhoIoEA+OgnSQBU6C06AEVIAqUAsaQDNo + AR3gDrgHBsAwGAcvwDSYB0tgBXwHmxAE4SACRITYIB5ICJKAZCFlSAPSh0whK8gBcoW8 + oUAoAoqHUqAsKB8qgc5DddBVqA26Az2ERqBn0Ay0CH2GfsAomBpmhLlgYVgKVoa1YRPY + Bj4Me8MhcCycCufAxXAlfBm+Cd+BB+BxeBpegr+hAAqPYkbxoSRRyihdlDnKEeWFCkUl + ojJRhahK1BVUO+o+agw1jVpGbaCxaCKaFy2JrNP9aFs0CR2CTkRno0vQteib6D70GHoG + vYLexhAwnBgJjCrGCHMQ442JwqRjCjE1mBuYu5hxzDzmOxaLZcaKYJWw+7EOWF9sHDYb + exbbiO3GjmDnsN9wOBwbTgKnjjPHueHCcem4M7jLuNu4Udw8bp0CT8FDIUthQOFIEUiR + TFFIcYmii2KU4h3FJiUdpRClKqU5pQdlDGUuZTVlO+VjynnKTSp6KhEqdSobKl+qo1TF + VFeo7lK9pPqCx+P58Sp4SzwZfwRfjG/CP8DP4DeoGajFqXWpnagjqHOoL1J3Uz+j/kIg + EIQJWgRHQjghh1BH6CVMEdZpiDR7aYxoPGiSaEppbtKM0nykpaQVotWmdaaNpS2kvUb7 + mHaZjpJOmE6Xzo0uka6Uro1uku4bPZFeht6cPoA+m/4S/UP6BQYcgzCDPoMHQypDFUMv + wxwRRRQg6hJJxBRiNfEucZ4RyyjCaMToy5jF2MA4xLjCxMAkz2THFM1UytTJNM2MYhZm + NmL2Z85lbmaeYP7BwsWizeLJksFyhWWUZY2Vg1WL1ZM1k7WRdZz1Bxsvmz6bH1seWwvb + K3Y0uzi7JXsUezn7XfZlDkYONQ4SRyZHM8dzTphTnNOKM46zinOQ8xsXN5chVzDXGa5e + rmVuZm4tbl/uAu4u7kUeIo8GD5mngOc2z3teJl5tXn/eYt4+3hU+Tr79fBF85/mG+Db5 + Rfht+ZP5G/lfCVAJKAt4CRQI9AisCPIIHhCMF6wXfC5EKaQs5CNUJHRfaE1YRNhe+Jhw + i/CCCKuIkUisSL3IS1GCqKZoiGil6BMxrJiymJ/YWbFhcVhcQdxHvFT8sQQsoShBljgr + MbIHs0dlT+Ceyj2TktSS2pKRkvWSM3uZ95ruTd7bsvejlKCUo1Se1H2pbWkFaX/paukX + MgwyxjLJMu0yn2XFZUmypbJP5AhyBnJJcq1yq/IS8p7y5fJPFYgKBxSOKfQo/FRUUgxV + vKK4qCSo5KpUpjSpzKhsoZyt/EAFo6KjkqTSobKhqqgartqs+klNUs1P7ZLawj6RfZ77 + qvfNqfOru6mfV5/W4NVw1TinMa3Jp+mmWak5qyWg5aFVo/VOW0zbV/uy9kcdaZ1QnRs6 + a7qqugm63XooPUO9TL0hfQZ9W/0S/SkDfgNvg3qDFUMFwzjD7v2Y/Sb78/ZPGnEZkYzq + jFaMlYwTjPtMqE2sTUpMZk3FTUNN2w/AB4wPnDrw0kzILNCsxRyYG5mfMn9lIWIRYnHL + EmtpYVlq+dZKxire6r410drF+pL1dxsdm1ybF7aithG2PXa0dk52dXZr9nr2+fbTB6UO + JhwccGB3IDu0OuIc7RxrHL8d0j90+tC8k4JTutPEYZHD0YcfOrM7+zt3utC6uLlcc8W4 + 2rtect1yM3erdPvmbuRe5r5C0iUVkZY8tDwKPBY91T3zPd95qXvley14q3uf8l700fQp + 9Fkm65JLyKu++30rfNf8zP0u+u342/s3BlAEuAa0BTIE+gX2BXEHRQeNBEsEpwdPh6iG + nA5ZCTUJrQmDwg6HtYYzIi+HgxGiEWkRM5EakaWR61F2Udei6aMDowdjxGMyYt7FGsRe + iEPHkeJ64vnij8bPJGgnnE+EEt0Te5IEklKT5o8YHqk9SnXU7+ijZOnk/OSvKfYp7alc + qUdS59IM0+rTadJD0yePqR2rOI4+Tj4+lCGXcSZjO9Mjsz9LOqswayublN1/QuZE8Ymd + HK+coVzF3PKT2JOBJyfyNPNq8+nzY/PnTh04dbOAtyCz4Otpl9MPC+ULK4qoiiKKpotN + i1vPCJ45eWarxKdkvFSntLGMsyyjbO2sx9nRcq3yKxVcFVkVP86Rzz09b3j+ZqVwZWEV + tiqy6m21XfX9C8oX6mrYa7Jqfl4MvDhda1XbV6dUV3eJ81JuPVwfUb942enycINeQ+sV + ySvnG5kbs5pAU0TT+6uuVyeaTZp7rilfu3Jd6HrZDeKNzJvQzZibKy0+LdOtDq0jbcZt + Pe1q7Tdu7b11sYOvo7STqTO3i6ortWvnduztb93B3ct3vO/M9bj0vOg92Pukz7Jv6K7J + 3Qf3DO713te+f/uB+oOOh6oP2/qV+1sGFAduDioM3nik8OjGkOLQzcdKj1uHVYbbR/aN + dI1qjt4Z0xu798ToycC42fjIhO3E00mnyemnHk8Xnvk/W30e+XzzxZGXmJeZr+heFU5x + TlW+FnvdOK043TmjNzM4az37Yo40t/Qm7M3WfOpbwtvCdzzv6hZkFzoWDRaH3x96P78U + vLS5nP6B/kPZR9GP1z9pfRpcObgyvxq6uvM5+wvbl4tf5b/2fLP4NvU94PvmWuY623rt + hvLG/R/2P95tRm3htop/iv1s3zbZfrkTsLMT7Bbq9utdAIX0sJcXAJ8vIu8JDkjtMAwA + Fc3vmuKXBVKuQIgNgu2gvdASfBbljBZCv8d0Y4txwRRWlPpUingp6r0ECRplWhM6V/oI + htPENsYZZmoWbdZQtgb2JU4xLl/uJp51Pj3+kwKzQjLCx0ReiSmIn5RYltTfWyW1LeMk + 2y7PrhCtOK4sp5KjurzPUP2cxg8tK+0LOht6JvolBgv75Y3ijLtMoQNaZrHmTRZzVvTW + 6jYetml25+yvHbzt0OvYfajNqfFwjXOZy0nXZLcQd2eSqYeSJ78XwWvNe8ann9zsW+KX + 7E8OsAhUCGIJWgseC6kPTQozD+cJ/xTRFZkT5RQtEf0jpj+2JI4cr5yATRhLrEjyP6Jz + VDCZMYU2lS6NPp3uGOE4ZQY6YydzI+tz9tKJ2ZznuaMnB/J68ttOXSmoOn2mMKcopTju + TExJcmlx2Y2zw+WzFcvnVs6vVK5Ufar+eOFDzdLFhdo3dTOX5upXG+iv6DYmNrVcfd28 + fh13g3iTp0W8VaFNs93olnWHe2d0V/HtO90LPeheYh/7Xd574veVHug81OkX7f80kDnI + Nnj+keaj5aGGx6HDKiPQyKPR8rGQJ/rjbOMfJ3oni576PFN8tvO8+0XsS7mXy68apsJe + 75vGTo/OlM16zcnMbb65N1/w1vOd6gLDwvvFrvfZS/bLfMuLH65+jP2ks4JfGV9t+Fz+ + 5frXte9ea883tH4UbE7/lNsu2Nn5lX8BqAl2QDGgHqDTMSZYJuwr3DWKbEp/Klu8HrUc + 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 + W2SR/Q9AGf1mCmVuZHN0cmVhbQplbmRvYmoKMzkgMCBvYmoKNzA0CmVuZG9iagoxMyAw + IG9iagpbIC9JQ0NCYXNlZCAzOCAwIFIgXQplbmRvYmoKNCAwIG9iago8PCAvVHlwZSAv + UGFnZXMgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0gL0NvdW50IDEgL0tpZHMgWyAzIDAg + UiBdID4+CmVuZG9iago0MCAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvT3V0bGluZXMg + MiAwIFIgL1BhZ2VzIDQgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjI2IDAgb2Jq + Cjw8IC9MZW5ndGggNDEgMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVu + Y3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEg + XSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEz + NjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtwQcCgQAAQNH7X0k0 + VLQ1jBbtNHUFd+C/t20/+mwfzspZlnWhzMvMmaZ5oozTyBlA7+HN6UFd31HaruU0TdtQ + 6qbmVFVdUcqq5BSgV/HiPEH5M6dkecZJ0yylJGnCieMkpjziB+cOut1vnCsoukaUMAo5 + QRAGFD/wOReQd/E4LshxHY4NsmyLYlomyDANytk4c04g/aRzNJCqqZwjSDkqFFmRQZIs + UURJ5BxA+8OeI4B2wu5/X6r+RswKZW5kc3RyZWFtCmVuZG9iago0MSAwIG9iagoxODgK + ZW5kb2JqCjI1IDAgb2JqCjw8IC9MZW5ndGggNDIgMCBSIC9PcmRlciAxIC9FbmNvZGUg + WyAwIDEzNjQgXSAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2Rl + IFsgMCAxIDAgMSAwIDEgXSAvRG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAw + IDEgXSAvU2l6ZSBbIDEzNjUKXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K + eAGVwolS02AUBtBHabqmaZI2adINRUFRFEFFUVxRFBUFcUVQ9Hnz73kFp4yd2k6a3u/M + GfxJB1N/pwPoWTo43z9LSX+lfejPtE9/mvaz9k7T7Cdpb37TOxn9YXrQY9PL3T02499N + F/rNdKFfTRfZ+WKAn00H+sl0oEemMxofmTk/mhh6aOLsOj7MeqDjGaMDnfGDjujf6wi6 + ryPa9r4efgd+q9v0b3Qbuqfbezqkf61D6Csd0u/qcFyFu8NBzpcqgL5QAXRHBbO3dtTE + 56oFfaZa0KeqRd58orCPVRP6SDWh26o56m+r3NJ/CH4gfeiW9LN6WzL7fenR35MedFN6 + hO6m/PeudKF3pEt/W7rQDeluyAb9umzkFY31ybdEg35NNCY7ayLvTeFAbwiHflU4ueur + YuJ1UYdeE3XoiqjT2ivCvgq+ImzosrCnc3t59iVun68t8fkv8xr0Eq9BF3kta3WRZ7/I + q/QXeBW6wKvzVhb4+IBXoH1eoe/xCrTLy8OMusPK0JiV6SNWnlyKWN42K0FDVqIPWGn2 + YsCmt1gR2mRFqM+KtJbPLI8+sbzEcsGNxII6ieUkBeJ6UoDaSQFaSwr//QuuW4G8CmVu + ZHN0cmVhbQplbmRvYmoKNDIgMCBvYmoKNDU2CmVuZG9iagoyNCAwIG9iago8PCAvTGVu + Z3RoIDQzIDAgUiAvT3JkZXIgMSAvRW5jb2RlIFsgMCAxMzY0IF0gL0Z1bmN0aW9uVHlw + ZSAwIC9CaXRzUGVyU2FtcGxlCjggL0RlY29kZSBbIDAgMSAwIDEgMCAxIF0gL0RvbWFp + biBbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL1NpemUgWyAxMzY1Cl0gL0Zp + bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcKJUtNgFAbQR2m6pmmSNmnSDUVB + URRBRVFcURQVBXFFUPR58+95BaeMndpOmt7vzBn8SQdTf6cD6Fk6ON8/S0l/pX3oz7RP + f5r2s/ZO0+wnaW9+0zsZ/WF60GPTy909NuPfTRf6zXShX00X2fligJ9NB/rJdKBHpjMa + H5k5P5oYemji7Do+zHqg4xmjA53xg47o3+sIuq8j2va+Hn4Hfqvb9G90G7qn23s6pH+t + Q+grHdLv6nBchbvDQc6XKoC+UAF0RwWzt3bUxOeqBX2mWtCnqkXefKKwj1UT+kg1oduq + Oepvq9zSfwh+IH3olvSzelsy+33p0d+THnRTeoTupvz3rnShd6RLf1u60A3pbsgG/bps + 5BWN9cm3RIN+TTQmO2si703hQG8Ih35VOLnrq2LidVGHXhN16Iqo09orwr4KviJs6LKw + p3N7efYlbp+vLfH5L/Ma9BKvQRd5LWt1kWe/yKv0F3gVusCr81YW+PiAV6B9XqHv8Qq0 + y8vDjLrDytCYlekjVp5ciljeNitBQ1aiD1hp9mLAprdYEdpkRajPirSWzyyPPrG8xHLB + jcSCOonlJAXielKA2kkBWksK//0LrluBvAplbmRzdHJlYW0KZW5kb2JqCjQzIDAgb2Jq + CjQ1NgplbmRvYmoKMjMgMCBvYmoKPDwgL0xlbmd0aCA0NCAwIFIgL09yZGVyIDEgL0Vu + Y29kZSBbIDAgMTM2NCBdIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZQo4IC9E + ZWNvZGUgWyAwIDEgMCAxIDAgMSBdIC9Eb21haW4gWyAwIDEgXSAvUmFuZ2UgWyAwIDEg + MCAxIDAgMSBdIC9TaXplIFsgMTM2NQpdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0 + cmVhbQp4AZXCiVLTYBQG0EdpuqZpkjZp0g1FQVEUQUVRXFEUFQVxRVD0efPveQWnjJ3a + Tpre78wZ/EkHU3+nA+hZOjjfP0tJf6V96M+0T3+a9rP2TtPsJ2lvftM7Gf1hetBj08vd + PTbj300X+s10oV9NF9n5YoCfTQf6yXSgR6YzGh+ZOT+aGHpo4uw6Psx6oOMZowOd8YOO + 6N/rCLqvI9r2vh5+B36r2/RvdBu6p9t7OqR/rUPoKx3S7+pwXIW7w0HOlyqAvlABdEcF + s7d21MTnqgV9plrQp6pF3nyisI9VE/pINaHbqjnqb6vc0n8IfiB96Jb0s3pbMvt96dHf + kx50U3qE7qb89650oXekS39butAN6W7IBv26bOQVjfXJt0SDfk00JjtrIu9N4UBvCId+ + VTi566ti4nVRh14TdeiKqNPaK8K+Cr4ibOiysKdze3n2JW6fry3x+S/zGvQSr0EXeS1r + dZFnv8ir9Bd4FbrAq/NWFvj4gFegfV6h7/EKtMvLw4y6w8rQmJXpI1aeXIpY3jYrQUNW + og9YafZiwKa3WBHaZEWoz4q0ls8sjz6xvMRywY3EgjqJ5SQF4npSgNpJAVpLCv/9C65b + gbwKZW5kc3RyZWFtCmVuZG9iago0NCAwIG9iago0NTYKZW5kb2JqCjIyIDAgb2JqCjw8 + IC9MZW5ndGggNDUgMCBSIC9PcmRlciAxIC9FbmNvZGUgWyAwIDEzNjQgXSAvRnVuY3Rp + b25UeXBlIDAgL0JpdHNQZXJTYW1wbGUKOCAvRGVjb2RlIFsgMCAxIDAgMSAwIDEgXSAv + RG9tYWluIFsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvU2l6ZSBbIDEzNjUK + XSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlwoVSQlEAQMG/tru7u7Hp + BhUDA1uxA+tTjjEy+PDFjZ1NfpC0mPjg+7vi+DvF34gLj71h95WY7egrEl+IGkdeUJwj + kiOsPZQj9Kw++IzhE0GZgSfsPhKw7X9E9AP+f30PqLzH99N7j2bPHTrddxje4pa5eovl + G1adrtwg9JoVs8vXSL9iOX/pCs2LWXQuZCm8ZEHy/CXmL5gX6LpA6Dkus3PnSD9jLn/2 + DK2nzOidPuX3CdPyp04wf8yUwMljnB8xaXHiCLmHTPw5foj6DOMZxvSOZvh9wKj8kQNM + 7jMidngfh3sMWx/aQ+IuQ8aDu6hPM5hmQG9/mu87ivt2KL5Nn/DebRxu0Wu9ZwuJm/QY + d2+iOEX3z64UOjtTdG6o79ig+DodwtvXsbtGu+22NUQnafu3NYnKBK35LQl0Nidojqtv + imMYo0lmYwzLURqdNkQRGqHBbH0ElWHq8+vC6KwNobMmRGGQGsnVQSwHqHZaFUConyqz + lX6k+6j8s8KHei/lesu8FHook1zqwbybUoElbr5+Al7liFUKZW5kc3RyZWFtCmVuZG9i + ago0NSAwIG9iago0MTAKZW5kb2JqCjIgMCBvYmoKPDwgL0xhc3QgNDYgMCBSIC9GaXJz + dCA0NyAwIFIgPj4KZW5kb2JqCjQ3IDAgb2JqCjw8IC9QYXJlbnQgNDggMCBSIC9Db3Vu + dCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxlIChDYW52YXMgMSkK + Pj4KZW5kb2JqCjQ4IDAgb2JqCjw8ID4+CmVuZG9iago0NiAwIG9iago8PCAvUGFyZW50 + IDQ4IDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBSIC9YWVogMCA3MzMgMCBdIC9UaXRs + ZSAoQ2FudmFzIDEpCj4+CmVuZG9iago0OSAwIG9iago8PCAvTGVuZ3RoIDUwIDAgUiAv + TGVuZ3RoMSAxMDUzMiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9ent8 + VEWW8Km6z34k6e50p9+PS6e78w4JEAgJpAlJCK8IBCFBowkkkCCMgDGKO/BFRYGIKCIP + xVVRh6dOmsBIA4PLsDDI7syIM4oj6646ouu6mx878+F8M0B3f6duhwzJz5kff/ibe/tU + 1annqVOnzjlVtztXPdgGKdANHMxa0LJiMahPKAxALi9a3rIiiaebMT6wqKvTl8SFLABu + 2eIVS5Yncfl5AK17ybLVA+3TrwKYPmhva2lNlsMNjEvaMSOJk9EYZ7Yv73w4iZuOYNy8 + 7P5FA+XppxAvXt7y8MD48Anivh+0LG/DGJ+QC4PMFfc/0KmiEHwX47krVrUN1CcNSN97 + QDDXBveDBu4DCSgY8G0CkL7WuoHHUlaOT2uebuu9aeXfglFW8XtnPqPGP1d+evFPbTdC + ui3ynzFDc7M+i8XseDaAnmB5v27LYInaDgNbFOpzozAVoQJhDEJu7iQbdJM98CzCqwgc + dJCnYDXCRoQXEPjB1H7EjpGn+ng5fJysBgeZFtbx3rlmu9em1Xl/HSXikZe9H9u+OEHs + uHqfE3tfCmgmacmr5BVoBS/5EQTII1ALWeTFw9nLvM1YtB9WIHQjcGpIyP4+T7H3HZIH + AZ5gmyB4ePK29z+L8r1fFkUp6fOeDkV5jH7mQSyc5j3lftn7T+4l3ncQDiaLDmRjjbe9 + +93LvFs9UfJin/c5d5Rgmy3J6EE3Nn3buzx7u7e1SC2fsT1KD/Z5S7F8XljnLRmneMe4 + L3sLQ1GZIJ7vnuHNKfqlNxMbYjUfdhoIG70u91bveCzyuKtD4xFOkANkF+SQXX2Bad7j + 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 + uIoNeAQzQibCaIQqhLkIrQidCOsQnkd4A+EIwhmEDxIDD/YBg2mCemcoPmkYPnkYXjUM + rx6Go4Id0v+MYXjdMHzOMBznMaT9vGH4vcNwxsFb57NoGN46DFfX9pb5dwwrV/+PeEv5 + D4aVrxqG483wkPGR/0PwLob/fzlhnKgKZW5kc3RyZWFtCmVuZG9iago1MCAwIG9iago2 + ODEyCmVuZG9iago1MSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2Vu + dCA3NzAgL0NhcEhlaWdodCA2ODQgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRC + Qm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL1ZWWEZIWitIZWx2ZXRp + Y2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQg + NTEzIC9Gb250RmlsZTIgNDkgMCBSID4+CmVuZG9iago1MiAwIG9iagpbIDI3OCAwIDAg + MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2NjcgMCA3MjIgNzIyIDY2NyAw + IDAgMCAyNzggMCAwCjU1NiAwIDcyMiAwIDAgMCA3MjIgMCA2MTEgMCA2NjcgMCAwIDAg + MCAwIDAgMCAwIDU1NiAwIDU1NiAwIDUwMCA1NTYgNTU2IDAKMCAwIDIyMiAwIDAgMCA4 + MzMgNTU2IDAgMCAwIDMzMyA1MDAgMjc4IDAgNTAwIF0KZW5kb2JqCjE0IDAgb2JqCjw8 + IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL1ZWWEZIWitI + ZWx2ZXRpY2EgL0ZvbnREZXNjcmlwdG9yCjUxIDAgUiAvV2lkdGhzIDUyIDAgUiAvRmly + c3RDaGFyIDQ2IC9MYXN0Q2hhciAxMTggL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5n + Cj4+CmVuZG9iago1MyAwIG9iago8PCAvTGVuZ3RoIDU0IDAgUiAvTGVuZ3RoMSA5MDEy + IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1aC3RTZbbe+7zy6iNpm6ZJ + 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 + LF3y+flo7Au68O9aYPWUlZUYjZcVNfiG9vzpkRNu65w5ztJ0Q1Xu4vbND5/8036WBghB + H/srcz3fT/Yzf0zrSrYkuHTP4AbgsMubroAuAYUMGppkYYJTOeFfaJwywph0UOyRhue1 + mjORmokaaXz+2y8fHsZraXkoLUmtkM4Ps/U2nbT7rHTrFQL1Taffi6aRkezlieak7X+Y + X8KufwFLoi+9EDk6T0R8nVf4S1czD5BOdO7iltM3NgF+7l3kFJbQAecx4Wm60xdQyzRR + 0g3MIHsdJzThDtjO7+Ef5w/xJ9iP8CyqWCvHOVN4XmCsiM4UqkJgePpsLrCMWsmQswlj + wijLkwUmjHFGRZ/UD+PFBwij9ncZ8kSQTg5Th4YbAsenzgsUji/Y5OXJVaKYyjqwLHpd + 9NXoJvS+z9WfO8LVnz9Fc1P+xaQvTN/2S6FIO+RALllhBX0na6QvUs301W4ReaDF9KVr + GSyHgFwQyY9JZ05ynfQFEBqX1s/vaClo7lu3sW9wTW+wsP7qdauksbzwa6MA/ZcD/c8D + wI1EtxHdT/RLol8TvUh0iuhvROepYALRLCIXUQ3RAqKu2OSP8sBUGOn8O12Wp9RF6Q0z + 0ltmyO0z5OAMuXeGTB2b1r6M5UXtrZmRvm6GLP9/ykX5r5qRfs0M+UczZPn/Sy4qL90B + wP8BMGBdrQplbmRzdHJlYW0KZW5kb2JqCjU0IDAgb2JqCjU3MzgKZW5kb2JqCjU1IDAg + b2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0 + IDY4NCAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy0xMDE4IC00ODEg + MTQzNiAxMTU5XSAvRm9udE5hbWUgL0ZVQkpTSStIZWx2ZXRpY2EtQm9sZCAvSXRhbGlj + QW5nbGUKMCAvU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA1MTMgL0ZvbnRG + aWxlMiA1MyAwIFIgPj4KZW5kb2JqCjU2IDAgb2JqClsgNzIyIDAgNzIyIDAgNjY3IDAg + MCAwIDI3OCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw + IDAKMCA1NTYgMCA1NTYgNjExIDU1NiAwIDAgMCAyNzggMCAwIDI3OCA4ODkgNjExIDAg + MCAwIDM4OSA1NTYgMzMzIDAgNTU2IF0KZW5kb2JqCjE2IDAgb2JqCjw8IC9UeXBlIC9G + b250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0ZVQkpTSStIZWx2ZXRpY2Et + Qm9sZCAvRm9udERlc2NyaXB0b3IKNTUgMCBSIC9XaWR0aHMgNTYgMCBSIC9GaXJzdENo + YXIgNjUgL0xhc3RDaGFyIDExOCAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4K + ZW5kb2JqCjU3IDAgb2JqCihVbnRpdGxlZCkKZW5kb2JqCjU4IDAgb2JqCihNYWMgT1Mg + WCAxMC42LjggUXVhcnR6IFBERkNvbnRleHQpCmVuZG9iago1OSAwIG9iagooS2F0aWUg + TWNDb3JtaWNrKQplbmRvYmoKNjAgMCBvYmoKKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25h + bCkKZW5kb2JqCjYxIDAgb2JqCihEOjIwMTExMDIwMjIwOTQyWjAwJzAwJykKZW5kb2Jq + CjEgMCBvYmoKPDwgL1RpdGxlIDU3IDAgUiAvQXV0aG9yIDU5IDAgUiAvUHJvZHVjZXIg + NTggMCBSIC9DcmVhdG9yIDYwIDAgUiAvQ3JlYXRpb25EYXRlCjYxIDAgUiAvTW9kRGF0 + ZSA2MSAwIFIgPj4KZW5kb2JqCnhyZWYKMCA2MgowMDAwMDAwMDAwIDY1NTM1IGYgCjAw + MDAwMzM0MDYgMDAwMDAgbiAKMDAwMDAxODk5NCAwMDAwMCBuIAowMDAwMDAyNTg1IDAw + MDAwIG4gCjAwMDAwMTU2OTAgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAw + MDAyNTY1IDAwMDAwIG4gCjAwMDAwMDI2ODkgMDAwMDAgbiAKMDAwMDAwODY3NSAwMDAw + MCBuIAowMDAwMDAzNzU1IDAwMDAwIG4gCjAwMDAwMDQyNTggMDAwMDAgbiAKMDAwMDAw + NDI3OCAwMDAwMCBuIAowMDAwMDA0ODEzIDAwMDAwIG4gCjAwMDAwMTU2NTMgMDAwMDAg + biAKMDAwMDAyNjYxMSAwMDAwMCBuIAowMDAwMDAzMTExIDAwMDAwIG4gCjAwMDAwMzMw + MjggMDAwMDAgbiAKMDAwMDAwMjk1MCAwMDAwMCBuIAowMDAwMDAzMjcyIDAwMDAwIG4g + CjAwMDAwMDM0MzMgMDAwMDAgbiAKMDAwMDAwMzU5NCAwMDAwMCBuIAowMDAwMDA3Nzc4 + IDAwMDAwIG4gCjAwMDAwMTgzNDkgMDAwMDAgbiAKMDAwMDAxNzY1OCAwMDAwMCBuIAow + MDAwMDE2OTY3IDAwMDAwIG4gCjAwMDAwMTYyNzYgMDAwMDAgbiAKMDAwMDAxNTg1MyAw + MDAwMCBuIAowMDAwMDE0Nzg4IDAwMDAwIG4gCjAwMDAwMDU5MjkgMDAwMDAgbiAKMDAw + MDAwNjg5OCAwMDAwMCBuIAowMDAwMDA0ODMzIDAwMDAwIG4gCjAwMDAwMDU5MDkgMDAw + MDAgbiAKMDAwMDAwNjkxOCAwMDAwMCBuIAowMDAwMDA3NzU4IDAwMDAwIG4gCjAwMDAw + MDc4MTUgMDAwMDAgbiAKMDAwMDAwODY1NSAwMDAwMCBuIAowMDAwMDA4NzExIDAwMDAw + IG4gCjAwMDAwMTQ3NjcgMDAwMDAgbiAKMDAwMDAxNDgyNSAwMDAwMCBuIAowMDAwMDE1 + NjMzIDAwMDAwIG4gCjAwMDAwMTU3NzMgMDAwMDAgbiAKMDAwMDAxNjI1NiAwMDAwMCBu + IAowMDAwMDE2OTQ3IDAwMDAwIG4gCjAwMDAwMTc2MzggMDAwMDAgbiAKMDAwMDAxODMy + OSAwMDAwMCBuIAowMDAwMDE4OTc0IDAwMDAwIG4gCjAwMDAwMTkxNTcgMDAwMDAgbiAK + MDAwMDAxOTA0MiAwMDAwMCBuIAowMDAwMDE5MTM1IDAwMDAwIG4gCjAwMDAwMTkyNTAg + MDAwMDAgbiAKMDAwMDAyNjE1MyAwMDAwMCBuIAowMDAwMDI2MTc0IDAwMDAwIG4gCjAw + MDAwMjYzOTkgMDAwMDAgbiAKMDAwMDAyNjc4NiAwMDAwMCBuIAowMDAwMDMyNjE0IDAw + MDAwIG4gCjAwMDAwMzI2MzUgMDAwMDAgbiAKMDAwMDAzMjg2NiAwMDAwMCBuIAowMDAw + MDMzMjA4IDAwMDAwIG4gCjAwMDAwMzMyMzUgMDAwMDAgbiAKMDAwMDAzMzI4NyAwMDAw + MCBuIAowMDAwMDMzMzIxIDAwMDAwIG4gCjAwMDAwMzMzNjQgMDAwMDAgbiAKdHJhaWxl + cgo8PCAvU2l6ZSA2MiAvUm9vdCA0MCAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDQ3NmJj + NzlkZDc0MDQwZDE3MjBiNTkyNTY2YzIzYWYxPgo8NDc2YmM3OWRkNzQwNDBkMTcyMGI1 + OTI1NjZjMjNhZjE+IF0gPj4Kc3RhcnR4cmVmCjMzNTI2CiUlRU9GCjEgMCBvYmoKPDwv + QXV0aG9yIChLYXRpZSBNY0Nvcm1pY2spL0NyZWF0aW9uRGF0ZSAoRDoyMDExMTAxMjE4 + MzQwMFopL0NyZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCA1LjIpL01vZERh + dGUgKEQ6MjAxMTEwMjAyMjA5MDBaKS9Qcm9kdWNlciA1OCAwIFIgL1RpdGxlIChDYWxl + bmRhci1kYXRhbW9kZWwtbmV3LmdyYWZmbGUpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAw + MzQ5MjQgMDAwMDAgbiAKdHJhaWxlcgo8PC9JRCBbPDQ3NmJjNzlkZDc0MDQwZDE3MjBi + NTkyNTY2YzIzYWYxPiA8NDc2YmM3OWRkNzQwNDBkMTcyMGI1OTI1NjZjMjNhZjE+XSAv + SW5mbyAxIDAgUiAvUHJldiAzMzUyNiAvUm9vdCA0MCAwIFIgL1NpemUgNjI+PgpzdGFy + dHhyZWYKMzUxMjUKJSVFT0YK + </data> + <key>QuickLookThumbnail</key> + <data> + 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 + DgAAAbJydVJVAAAAJAAAAcBzdlNFAAAAEAAAAeR6aFRXAAAADgAAAfRkZURFAAAAEAAA + AgJmaUZJAAAAEAAAAhJpdElUAAAAFAAAAiJrb0tSAAAADAAAAjYASwBsAGUAdQByAGUA + bgAtAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQBLAG8AbABvAHIAIABM + AEMARABDAG8AbABvAHIAIABMAEMARABGAGEAcgBnAGUALQBMAEMARABMAEMARAAgAGMA + bwB1AGwAZQB1AHIATABDAEQAIABDAG8AbABvAHIAaQBkAG8ATABDAEQAIABhACAAQwBv + AHIAZQBzX2mCcgAgAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByMKsw6TD8ACAATABDAEQE + JgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkARgDkAHIAZwAtAEwAQwBE + X2mCcm2yZnaYb3k6VmgARgBhAHIAYgAtAEwAQwBEAFYA5AByAGkALQBMAEMARABMAEMA + RAAgAGMAbwBsAG8AcgBpzuy37AAgAEwAQwBEAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBs + ZSwgSW5jLiwgMjAxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNSAAEAAAAB + Fs9YWVogAAAAAAAAba8AADhpAAABXlhZWiAAAAAAAABikAAAui0AAAarWFlaIAAAAAAA + ACaWAAANagAAyyRjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBA + AEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwA + wQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFS + AVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC + HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMW + AyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgE + VQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXF + BdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QH + hgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5 + CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7AL + yAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5J + DmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMR + MRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJ + FGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X + 0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuK + G7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qf + vx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQf + JE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQp + Bik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4W + Lkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38z + uDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/ + Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/ + 4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZn + RqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN + k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1Tb + VShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc + 1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTp + ZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBt + uW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnab + dvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WA + R4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+ + imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCU + ipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8d + n4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyq + j6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYB + tnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePC + X8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62 + zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724Dc + BdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG + 6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3 + ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKn + AAANWQAAE9AAAAoOdmNndAAAAAAAAAAAAAMBAAACAAAAVgEuAesCnQNeBCUE6gXABpgH + cAhSCUUKNgsvDC4NKw44D0sQYBF1EpUTuRThFgwXQRhyGa0a6xwpHWoesB/4IUQikCPi + JTEmhyfdKTUqkCvsLUUuoy/+MVwyujQaNXg21TgzOY467DxHPaA++kBSQaVC+URLRZpG + 6Eg0SXtKvkwBTUBOek+wUONSEVM9VGRVhVagV7NYv1nDWsBbuVyvXaZenF+QYIJhcWJe + Y0xkN2UiZg1m92fhaMppsmqaa4JsaW1QbjVvF2/3cNNxq3J/c090H3Tvdb52jndceCt4 + +nnKepp7aXw4fQZ9036ff2yAQoEkghSDD4QQhRGGEIcNiAmJBIn/ivmL8ozrjeKO2o/S + kMuRwpK5k66Uo5WZlo6Xg5h7mXmagpuYnLWd0J7in+yg8KHwovCj76Tupe2m66foqOSp + 4arjq/GtEa5Dr36wt7Hfsvi0B7UTth+3Krg1uT+6SbtTvGK9eL6Yv8HA6MIEwxPEGsUg + xirHN8hCyULKKMrvy4rMGcyhzT/N7M6tz3LQOdEB0c3SntNx1EXVGdXu1sPXl9ho2TbZ + /9rA23rcM9zs3a3ec9884Abg0uGc4mbjMeP75MbllOZl5zroEujq6b7qjOtX7CHs6e2x + 7nrvQvAL8NXxrfKe87T09/Zm99r5QPqU++D9M/6U//8AAABWASMBsAJZAxIDyASGBUsG + FQbdB7MIjAlsClULRAwzDSkOJQ8oEC8RNRJGE1YUbhWEFqMXxBjrGhEbPhxpHZoezB// + ITgidCOuJOomKydoKKgp6ystLHIttS75MD8xgTLHNAs1TDaON9E5EzpQO448yj4GPz9A + dkGoQttEC0U6RmJHiUirSctK6UwCTRdOJ08zUDpROlIzUyRUDlT1VdpWwFekWIpZblpT + WzdcG1z/XeJexF+mYIZhZGJAYxxj92TRZatmhWdeaDdpEGnoar9rl2xubUVuGm7tb79w + jnFaciJy6XOwdHd1OnX9dr53f3hAeQR5yHqNe1B8E3zVfZd+W38jf/CAw4GfgoODboRa + hUeGNIchiAyI94niisyLtoygjYiOco9dkEyRP5I1ky6UKJUilhyXF5gRmQqaBJr8m/Sc + 653gntef0aDQodWi36PrpPimA6cOqBmpJKowqzysRq1PrlmvZbB2sYyyqLPEtN618bcB + uBC5Ibozu0a8W71wvoa/m8Cpwa3CpMOQxHTFVMYyxxHH8cjUybnKn8uFzGvNUc44zyHQ + C9D40ePSzdOy1JfVfdZj10vYNNkd2gXa7NvU3Lvdo96N33zgcOFr4m3jdOR95Ybmkeeb + 6KXpsOq668Psze3b7vjwOfGk80L1C/b0+Oj60vyi/ln//wAAAFYBHAGNAigCywNtBBsE + ywWCBj4G+Ae9CIcJWQozCw4L6AzJDbMOng+NEIMRehJ2E3kUeRV9FoYXjxidGa8axBvY + HO4eDR8kIEIhYCKDI6MkxSXpJw4oMSlVKnsrnyzELekvETA3MVoyezOeNL813jb+OBs5 + OTpSO2k8fj2RPqM/sUC8QcVCykPMRMtFx0a/R7NIokmKSm5LS0wgTPRNxk6XT2lQOVEH + UdZSpVNzVEBVDFXXVqRXcFg7WQZZ0FqaW2VcLlz2Xb5ehl9OYBNg12GaYl5jH2PgZKBl + YGYfZt9noGhgaR9p3mqda1lsE2zObYluRW8Bb7twdHEncdhyiHM3c+d0lnVEdfJ2oHdO + d/t4qXlWegJ6r3tbfAV8sH1bfgV+sH9egBSA0YGWgmWDOIQOhOWFvYaUh2uIQYkXie2K + wYuUjGaNN44KjuCPuJCSkXKSU5M1lBmU/pXklsqXr5iTmXaaWZs6nBqc953VnrWfm6CN + oYaihKOFpIelh6aFp32obalYqkWrO6w9rUuuYa98sJixtLLNs+W0+7YRtya4PLlRume7 + fryVvaq+vL/HwMrBycLFw8HEvcW4xrPHrcinyZ/KmcuSzIzNhs6Dz4XQkdGo0snT8dUd + 1knXdtii2c7a+dwk3VPej9/g4WnjGOT15wXpfuzD8ZP4JP//AABuZGluAAAAAAAABjYA + AKZFAABWgAAAUf8AAKhRAAAllAAADLkAAFANAABUOQACa4UAAhHrAAGcKAADAQAAAgAA + AAEABAAJABAAGQAjAC8APQBLAFsAbAB+AJIApgC7ANEA6QEBARoBNAFPAWsBhwGlAcMB + 4gICAiMCRQJnAosCrwLUAvoDIQNIA3EDmgPEA+8EGwRHBHUEowTTBQMFNAVnBZoFzgYD + BjkGcAaoBuIHHAdYB5QH0ggRCFEIkwjVCRkJXwmmCe4KOAqDCtALHgtuC8AMFAxqDMEN + Gw13DdUONg6ZDv8PZw/SEEEQsxEqEaYSJxKvEzsTzBRfFPQVjRYqFssXcBgXGMMZcRoi + GtYbjRxIHQYdxh6KH1EgHCDtIcQioyOLJHolbSZkJ18oXilgKmUrbSx5LYkuni+6MNcx + 6jLuM+Q01DXDNrY3rjiqOak6qjuwPLg9xD7TP+VA+UIPQylERkVnRotHsUjbSgdLMkxX + TXJOg0+PUJ5Rt1LbVAlVPlZ3V7NY8lo0W3hcwV4NX1xgqWHsYx1kP2VXZm1niGiyae1r + N2yJbd9vNnCQce5zT3SydhV3dHjKehd7Xnyoff9/aIDhgmGD34VZhtWIWYn8i+iOjpGd + lBqWSphwmpicuJ7OoOGi9qUOpympS6t4rbqwHrKitSu3nrn/vFy+u8Egw4rF+choytPN + NM+L0ePUTdbO2WDb+d6X4Tjj3+aE6PvrIuz+7qTwJPGf8xn0ovY+9+f5mPtC/N7+cv// + AAAAAQAFAAsAEwAdACkANwBGAFcAaQB8AJEApwC+ANYA7wEKASUBQgFfAX4BngG+AeAC + AgImAkoCcAKWAr4C5gMQAzoDZQORA78D7QQcBE0EfgSxBOQFGQVOBYUFvQX2BjAGbAao + BuYHJQdmB6gH6wgvCHUIvQkGCVAJnQnqCjoKiwrfCzQLiwvkDD8MnQz9DWANxQ4tDpcP + BQ92D+sQYxDgEWIR6hJ5Ew8TqhRHFOgVixYxFtoXhhg0GOYZmxpUGxAb0hyYHWIeLx8A + H9UgrSGJImcjSiQxJRsmCCb7J/Qo9Cn8Kw0sIy0+LmAviTC5MeozHDRQNYs2zDgROVc6 + mTvTPQE+Jj9GQGZBiEKtQ9VFAkYyR2ZInUnXSxZMVk2WTtNQDlFHUn9TulT3VjZXeFi9 + WgVbUFyfXfJfSmCkYf1jUWSgZepnM2h9actrHWxxbcZvHXB2cdNzNHSXdfx3X3i+ehh7 + bnzGfiN/ioD4gmqD3YVQhsOIN4mtiyKMmo4Xj5+ROpLtlLiWl5iCmnGcX55KoDSiH6QO + pf+n8qnmq9ityK+8sbmzwbXPt92567v5vgrAIMI6xFjGecibyrrM0M7b0NjSzNS81qzY + ndqR3Ifef+B54nfkeOZ76HjqXewW7abvF/Bp8aPy1fP39Rf2M/dQ+HP5mfrN/Af9Uf6k + //8AAAABAAYADQAXACMAMQBCAFQAaAB9AJQArQDHAOIA/wEdATwBXQF+AaEBxgHrAhIC + OgJjAo0CuALlAxMDQQNyA6MD1gQJBD4EdQSsBOUFHwVbBZgF1gYWBlcGmgbeByMHagez + B/4ISgiYCOgJOgmNCeMKOgqUCvALTwuwDBMMeQziDU4NvQ4wDqUPHw+cEB4QpBExEcQS + XxMCE6oUVxUHFbsWdBcwF/AYtBl9GkkbGBvsHMQdoB5/H2MgTCE5IiojISQfJSEmKSc2 + KEkpXyp5K5csui3iLxIwSjGGMsM0BTVRNq04Ezl/OvE8aT3oP2xA9kKGRBxFukdfSQtK + vExpTgVPi1EAUm9T3VVOVsJYO1m4WzlcwF5OX+FheGMPZKNmNGfAaUtq12xjbfFvgXEV + cq90TXXwd5l5SnsBfLh+Y3/+gY6DGISihi2HvYlUiviMro5ukCqR05NqlPOWdZf1mXea + /JyGnhSfpqE7otOkbaYKp6ipSKrprIyuNK/ksaGzbLVEtyK5BLrpvNG+vcCtwqLEmsaU + yJHKj8yPzovQfdJe1DDV9dey2W3bKdzm3qXgZuIq4/HlvOeF6UTq8eyI7fLvSfCM8bfy + 3fPs9Pn14/bJ95L4PPjm+YT5+fpu+uP7WPu//BT8afy+/RT9af2+/gj+UP6Y/t//J/9v + /7f//wAAc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxt + bW9kAAAAAAAABhAAAJy7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + </data> + <key>ReadOnly</key> + <string>NO</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>Canvas 1</string> + <key>SmartAlignmentGuidesActive</key> + <string>YES</string> + <key>SmartDistanceGuidesActive</key> + <string>YES</string> + <key>UniqueID</key> + <integer>1</integer> + <key>UseEntirePage</key> + <false/> + <key>VPages</key> + <integer>1</integer> + <key>WindowInfo</key> + <dict> + <key>CurrentSheet</key> + <integer>0</integer> + <key>ExpandedCanvases</key> + <array> + <dict> + <key>name</key> + <string>Canvas 1</string> + </dict> + </array> + <key>Frame</key> + <string>{{34, 76}, {710, 887}}</string> + <key>ListView</key> + <true/> + <key>OutlineWidth</key> + <integer>142</integer> + <key>RightSidebar</key> + <false/> + <key>ShowRuler</key> + <true/> + <key>Sidebar</key> + <true/> + <key>SidebarWidth</key> + <integer>120</integer> + <key>VisibleRegion</key> + <string>{{0, 0}, {575, 733}}</string> + <key>Zoom</key> + <real>1</real> + <key>ZoomValues</key> + <array> + <array> + <string>Canvas 1</string> + <real>1</real> + <real>1</real> + </array> + </array> + </dict> + <key>saveQuickLookFiles</key> + <string>YES</string> +</dict> +</plist> diff --git a/docs/html/images/providers/datamodel.png b/docs/html/images/providers/datamodel.png Binary files differnew file mode 100644 index 0000000..a14c328 --- /dev/null +++ b/docs/html/images/providers/datamodel.png diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js index 237e18c..41a5a51 100644 --- a/docs/html/resources/resources-data.js +++ b/docs/html/resources/resources-data.js @@ -578,7 +578,7 @@ var ANDROID_RESOURCES = [ } }, { - tags: ['sample', 'newfeature', 'performance', 'gamedev', 'gl'], + tags: ['sample', 'newfeature', 'performance', 'gamedev', 'gl', 'updated'], path: 'samples/RenderScript/index.html', title: { en: 'RenderScript' diff --git a/docs/html/sdk/ndk/index.jd b/docs/html/sdk/ndk/index.jd index f87e1f6..afbad57 100644 --- a/docs/html/sdk/ndk/index.jd +++ b/docs/html/sdk/ndk/index.jd @@ -1,18 +1,19 @@ ndk=true -ndk.win_download=android-ndk-r6b-windows.zip -ndk.win_bytes=67670219 -ndk.win_checksum=f496b48fffb6d341303de170a081b812 +ndk.win_download=android-ndk-r7-windows.zip +ndk.win_bytes=81270552 +ndk.win_checksum=55483482cf2b75e8dd1a5d9a7caeb6e5 -ndk.mac_download=android-ndk-r6b-darwin-x86.tar.bz2 -ndk.mac_bytes=52798843 -ndk.mac_checksum=65f2589ac1b08aabe3183f9ed1a8ce8e +ndk.mac_download=android-ndk-r7-darwin-x86.tar.bz2 +ndk.mac_bytes=71262092 +ndk.mac_checksum=817ca5675a1dd44078098e43070f19b6 -ndk.linux_download=android-ndk-r6b-linux-x86.tar.bz2 -ndk.linux_bytes=46532436 -ndk.linux_checksum=309f35e49b64313cfb20ac428df4cec2 +ndk.linux_download=android-ndk-r7-linux-x86.tar.bz2 +ndk.linux_bytes=64884365 +ndk.linux_checksum=bf15e6b47bf50824c4b96849bf003ca3 page.title=Android NDK + @jd:body <h2 id="notes">Revisions</h2> @@ -61,6 +62,310 @@ padding: .25em 1em; <div class="toggleable open"> <a href="#" onclick="return toggleDiv(this)"><img src= "{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px"> + Android NDK, Revision 7</a> <em>(November 2011)</em> + + <div class="toggleme"> + <p>This release of the NDK includes new features to support the Android 4.0 platform as well + as many other additions and improvements:</p> + + <dl> + <dt>New features</dt> + + <dd> + <ul> + <li>Added official NDK APIs for Android 4.0 (API level 14), which adds the following + native features to the platform: + + <ul> + <li>Added native multimedia API based on the Khronos Group OpenMAX AL™ 1.0.1 + standard. The new <code><OMXAL/OpenMAXAL.h></code> and + <code><OMXAL/OpenMAXAL_Android.h></code> headers allow applications targeting + API level 14 to perform multimedia output directly from native code by using a new + Android-specific buffer queue interface. For more details, see + <code>docs/openmaxal/index.html</code> and <a href= + "http://www.khronos.org/openmax/">http://www.khronos.org/openmax/</a>.</li> + + <li>Updated the native audio API based on the Khronos Group OpenSL ES 1.0.1™ + standard. With API Level 14, you can now decode compressed audio (e.g. MP3, AAC, + Vorbis) to PCM. For more details, see <code>docs/opensles/index.html</code> and + <a href= + "http://www.khronos.org/opensles">http://www.khronos.org/opensles/</a>.</li> + </ul> + </li> + + <li>Added CCache support. To speed up large rebuilds, define the + <code>NDK_CCACHE</code> environment variable to <code>ccache</code> (or the path to + your <code>ccache</code> binary). When declared, the NDK build system automatically + uses CCache when compiling any source file. For example: + <pre> +export NDK_CCACHE=ccache +</pre> + <p class="note"><strong>Note:</strong> CCache is not included in the NDK release + so you must have it installed prior to using it. For more information about CCache, see + <a href="http://ccache.samba.org">http://ccache.samba.org</a>.</p> + </li> + + <li>Added support for setting <code>APP_ABI</code> to <code>all</code> to indicate that + you want to build your NDK modules for all the ABIs supported by your given NDK + release. This means that either one of the following two lines in your + <code>Application.mk</code> are equivalent with this release: + <pre> +APP_ABI := all +APP_ABI := armeabi armeabi-v7a x86 +</pre> + + <p>This also works if you define <code>APP_ABI</code> when calling + <code>ndk-build</code> from the command-line, which is a quick way to check that your + project builds for all supported ABIs without changing the project's + <code>Application.mk file</code>. For example:</p> + <pre> +ndk-build APP_ABI=all +</pre> + </li> + + <li>Added a <code>LOCAL_CPP_FEATURES</code> variable in <code>Android.mk</code> that + allows you to declare which C++ features (RTTI or Exceptions) your module uses. This + ensures that the final linking works correctly if you have prebuilt modules that depend + on these features. See <code>docs/ANDROID-MK.html</code> and + <code>docs/CPLUSPLUS-SUPPORT.html</code> for more details.</li> + + <li>Shortened paths to source and object files that are used in build commands. When + invoking <code>$NDK/ndk-build</code> from your project path, the paths to the source, + object, and binary files that are passed to the build commands are significantly + shorter now, because they are passed relative to the current directory. This is useful + when building projects with a lot of source files, to avoid limits on the maximum + command line length supported by your host operating system. The behavior is unchanged + if you invoke <code>ndk-build</code> from a sub-directory of your project tree, or if + you define <code>NDK_PROJECT_PATH</code> to point to a specific directory.</li> + </ul> + </dd> + + <dt>Experimental features</dt> + + <dd> + You can now build your NDK source files on Windows <em>without</em> Cygwin by calling the + <code>ndk-build.cmd</code> script from the command line from your project path. The + script takes exactly the same arguments as the original <code>ndk-build</code> script. + The Windows NDK package comes with its own prebuilt binaries for GNU Make, Awk and other + tools required by the build. You should not need to install anything else to get a + working build system. + + <p class="caution"><strong>Important:</strong> <code>ndk-gdb</code> does not work on + Windows, so you still need Cygwin to debug.</p> + + <p>This feature is still experimental, so feel free to try it and report issues on the + <a href="http://b.android.com">public bug database</a> or <a href= + "http://groups.google.com/group/android-ndk">public forum</a>. All samples and unit tests + shipped with the NDK succesfully compile with this feature.</p> + </dd> + + <dt>Important bug fixes</dt> + + <dd> + <ul> + <li>Imported shared libraries are now installed by default to the target installation + location (<code>libs/<abi></code>) if <code>APP_MODULES</code> is not defined in + your <code>Application.mk</code>. For example, if a top-level module <code>foo</code> + imports a module <code>bar</code>, then both <code>libfoo.so</code> and + <code>libbar.so</code> are copied to the install location. Previously, only + <code>libfoo.so</code> was copied, unless you listed <code>bar</code> in your + <code>APP_MODULES</code> too. If you define <code>APP_MODULES</code> explicitly, the + behavior is unchanged.</li> + + <li><code>ndk-gdb</code> now works correctly for activities with multiple categories in + their MAIN intent filters.</li> + + <li>Static library imports are now properly transitive. For example, if a top-level + module <code>foo</code> imports static library <code>bar</code> that imports static + library <code>zoo</code>, the <code>libfoo.so</code> will now be linked against both + <code>libbar.a</code> and <code>libzoo.a</code>.</li> + </ul> + </dd> + + <dt>Other changes</dt> + + <dd> + <ul> + <li><code>docs/NATIVE-ACTIVITY.HTML</code>: Fixed typo. The minimum API level should be + 9, not 8 for native activities.</li> + + <li><code>docs/STABLE-APIS.html</code>: Added missing documentation listing EGL as a + supported stable API, starting from API level 9.</li> + + <li><code>download-toolchain-sources.sh</code>: Updated to download the toolchain + sources from <a href="http://android.googlesource.com">android.googlesource.com</a>, + which is the new location for the AOSP servers.</li> + + <li>Added a new C++ support runtime named <code>gabi++</code>. More details about it + are available in the updated <code>docs/CPLUSPLUS-SUPPORT.html</code>.</li> + + <li>Added a new C++ support runtime named <code>gnustl_shared</code> that corresponds + to the shared library version of GNU libstdc++ v3 (GPLv3 license). See more info at + <code>docs/CPLUSPLUS-SUPPORT.html</code></li> + + <li>Added support for RTTI in the STLport C++ runtimes (no support for + exceptions).</li> + + <li>Added support for multiple file extensions in <code>LOCAL_CPP_EXTENSION</code>. For + example, to compile both <code>foo.cpp</code> and <code>bar.cxx</code> as C++ sources, + declare the following: + <pre> +LOCAL_CPP_EXTENSION := .cpp .cxx +</pre> + </li> + + <li>Removed many unwanted exported symbols from the link-time shared system libraries + provided by the NDK. This ensures that code generated with the standalone toolchain + doesn't risk to accidentally depend on a non-stable ABI symbol (e.g. any libgcc.a + symbol that changes each time the toolchain used to build the platform is changed)</li> + + <li>Refreshed the EGL and OpenGLES Khronos headers to support more extensions. Note + that this does <em>not</em> change the NDK ABIs for the corresponding libraries, + because each extension must be probed at runtime by the client application. + + <p>The extensions that are available depend on your actual device and GPU drivers, + not the platform version the device runs on. The header changes simply add new + constants and types to make it easier to use the extensions when they have been + probed with <code>eglGetProcAddress()</code> or <code>glGetProcAddress()</code>. The + following list describes the newly supported extensions:</p> + + <dl> + <dt>GLES 1.x</dt> + + <dd> + <ul> + <li><code>GL_OES_vertex_array_object</code></li> + + <li><code>GL_OES_EGL_image_external</code></li> + + <li><code>GL_APPLE_texture_2D_limited_npot</code></li> + + <li><code>GL_EXT_blend_minmax</code></li> + + <li><code>GL_EXT_discard_framebuffer</code></li> + + <li><code>GL_EXT_multi_draw_arrays</code></li> + + <li><code>GL_EXT_read_format_bgra</code></li> + + <li><code>GL_EXT_texture_filter_anisotropic</code></li> + + <li><code>GL_EXT_texture_format_BGRA8888</code></li> + + <li><code>GL_EXT_texture_lod_bias</code></li> + + <li><code>GL_IMG_read_format</code></li> + + <li><code>GL_IMG_texture_compression_pvrtc</code></li> + + <li><code>GL_IMG_texture_env_enhanced_fixed_function</code></li> + + <li><code>GL_IMG_user_clip_plane</code></li> + + <li><code>GL_IMG_multisampled_render_to_texture</code></li> + + <li><code>GL_NV_fence</code></li> + + <li><code>GL_QCOM_driver_control</code></li> + + <li><code>GL_QCOM_extended_get</code></li> + + <li><code>GL_QCOM_extended_get2</code></li> + + <li><code>GL_QCOM_perfmon_global_mode</code></li> + + <li><code>GL_QCOM_writeonly_rendering</code></li> + + <li><code>GL_QCOM_tiled_rendering</code></li> + </ul> + </dd> + + <dt>GLES 2.0</dt> + + <dd> + <ul> + <li><code>GL_OES_element_index_uint</code></li> + + <li><code>GL_OES_get_program_binary</code></li> + + <li><code>GL_OES_mapbuffer</code></li> + + <li><code>GL_OES_packed_depth_stencil</code></li> + + <li><code>GL_OES_texture_3D</code></li> + + <li><code>GL_OES_texture_float</code></li> + + <li><code>GL_OES_texture_float_linear</code></li> + + <li><code>GL_OES_texture_half_float_linear</code></li> + + <li><code>GL_OES_texture_npot</code></li> + + <li><code>GL_OES_vertex_array_object</code></li> + + <li><code>GL_OES_EGL_image_external</code></li> + + <li><code>GL_AMD_program_binary_Z400</code></li> + + <li><code>GL_EXT_blend_minmax</code></li> + + <li><code>GL_EXT_discard_framebuffer</code></li> + + <li><code>GL_EXT_multi_draw_arrays</code></li> + + <li><code>GL_EXT_read_format_bgra</code></li> + + <li><code>GL_EXT_texture_format_BGRA8888</code></li> + + <li><code>GL_EXT_texture_compression_dxt1</code></li> + + <li><code>GL_IMG_program_binary</code></li> + + <li><code>GL_IMG_read_format</code></li> + + <li><code>GL_IMG_shader_binary</code></li> + + <li><code>GL_IMG_texture_compression_pvrtc</code></li> + + <li><code>GL_IMG_multisampled_render_to_texture</code></li> + + <li><code>GL_NV_coverage_sample</code></li> + + <li><code>GL_NV_depth_nonlinear</code></li> + + <li><code>GL_QCOM_extended_get</code></li> + + <li><code>GL_QCOM_extended_get2</code></li> + + <li><code>GL_QCOM_writeonly_rendering</code></li> + + <li><code>GL_QCOM_tiled_rendering</code></li> + </ul> + </dd> + + <dt>EGL</dt> + + <dd> + <ul> + <li><code>EGL_ANDROID_recordable</code></li> + + <li><code>EGL_NV_system_time</code></li> + </ul> + </dd> + </dl> + </li> + </ul> + </dd> + </dl> + </div> +</div> + + + +<div class="toggleable closed"> + <a href="#" onclick="return toggleDiv(this)"><img src= + "{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px"> Android NDK, Revision 6b</a> <em>(August 2011)</em> <div class="toggleme"> diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs index 9a18f7d..afe6a6e 100644 --- a/docs/html/sdk/sdk_toc.cs +++ b/docs/html/sdk/sdk_toc.cs @@ -192,7 +192,8 @@ class="new">new!</span> <span style="display:none" class="zh-TW"></span> </h2> <ul> - <li><a href="<?cs var:toroot ?>sdk/ndk/index.html">Android NDK, r6b</a> + <li><a href="<?cs var:toroot ?>sdk/ndk/index.html">Android NDK, r7</a> + <span class="new">new!</span> </li> <li><a href="<?cs var:toroot ?>sdk/ndk/overview.html">What is the NDK?</a></li> </ul> |