Merge "Remove .classpath and .project files" into gingerbread
diff --git a/build/sdk.atree b/build/sdk.atree
index cb15d5a..35d34dd 100644
--- a/build/sdk.atree
+++ b/build/sdk.atree
@@ -160,6 +160,7 @@
development/samples/NotePad samples/${PLATFORM_NAME}/NotePad
development/samples/SampleSyncAdapter samples/${PLATFORM_NAME}/SampleSyncAdapter
development/samples/SearchableDictionary samples/${PLATFORM_NAME}/SearchableDictionary
+development/samples/SipDemo samples/${PLATFORM_NAME}/SipDemo
development/samples/SkeletonApp samples/${PLATFORM_NAME}/SkeletonApp
development/samples/Snake samples/${PLATFORM_NAME}/Snake
development/samples/SoftKeyboard samples/${PLATFORM_NAME}/SoftKeyboard
diff --git a/ndk/platforms/android-3/include/grp.h b/ndk/platforms/android-3/include/grp.h
index 4442eb7..7ddb791 100644
--- a/ndk/platforms/android-3/include/grp.h
+++ b/ndk/platforms/android-3/include/grp.h
@@ -56,9 +56,9 @@
__BEGIN_DECLS
struct group *getgrgid(gid_t);
+struct group *getgrnam(const char *);
#if 0 /* MISSING FROM BIONIC */
-struct group *getgrnam(const char *);
#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XPG_VISIBLE
struct group *getgrent(void);
void setgrent(void);
diff --git a/ndk/platforms/android-3/include/locale.h b/ndk/platforms/android-3/include/locale.h
index df42921..4259ddd 100644
--- a/ndk/platforms/android-3/include/locale.h
+++ b/ndk/platforms/android-3/include/locale.h
@@ -51,9 +51,8 @@
extern char *setlocale(int category, const char *locale);
-/* Make libstdc++-v3 happy. */
+#if 1 /* MISSING FROM BIONIC - DEFINED TO MAKE libstdc++-v3 happy */
struct lconv { };
-#if 0 /* MISSING FROM BIONIC */
struct lconv *localeconv(void);
#endif /* MISSING */
diff --git a/ndk/platforms/android-4/include/GLES/glplatform.h b/ndk/platforms/android-4/include/GLES/glplatform.h
index 0924cae..a38ea4c 100644
--- a/ndk/platforms/android-4/include/GLES/glplatform.h
+++ b/ndk/platforms/android-4/include/GLES/glplatform.h
@@ -24,7 +24,7 @@
#define GL_API KHRONOS_APICALL
#endif
-#if defined(ANDROID)
+#if defined(__ANDROID__)
#define GL_APIENTRY KHRONOS_APIENTRY
diff --git a/ndk/platforms/android-4/include/KHR/khrplatform.h b/ndk/platforms/android-4/include/KHR/khrplatform.h
index 1660bd7..75bc551 100644
--- a/ndk/platforms/android-4/include/KHR/khrplatform.h
+++ b/ndk/platforms/android-4/include/KHR/khrplatform.h
@@ -26,7 +26,7 @@
/* Platform-specific types and definitions.
* $Revision: 7244 $ on $Date: 2009-01-20 17:06:59 -0800 (Tue, 20 Jan 2009) $
- *
+ *
* Adopters may modify this file to suit their platform. Adopters are
* encouraged to submit platform specific modifications to the Khronos
* group so that they can be included in future versions of this file.
@@ -37,13 +37,13 @@
* A predefined template which fills in some of the bug fields can be
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
* must create a Bugzilla login first.
- *
+ *
*
* See the Implementer's Guidelines for information about where this file
* should be located on your system.
* http://www.khronos.org/registry/implementers_guide.pdf
*
- *
+ *
* This file should be included as
* #include <KHR/khrplatform.h>
* by the Khronos API header file that uses its types and defines.
@@ -70,7 +70,7 @@
*
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
- *
+ *
*
* Macros defined in this file:
* KHRONOS_APICALL
@@ -91,7 +91,7 @@
# define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__)
# define KHRONOS_APICALL IMPORT_C
-#elif defined(ANDROID)
+#elif defined(__ANDROID__)
# define KHRONOS_APICALL __attribute__((visibility("default")))
#else
# define KHRONOS_APICALL
@@ -228,11 +228,11 @@
#if KHRONOS_SUPPORT_INT64
/* Time types
*
- * These types can be used to represent a time interval in nanoseconds or
- * an absolute Unadjusted System Time. Unadjusted System Time is the number
- * of nanoseconds since some arbitrary system event (e.g. since the last
- * time the system booted). The Unadjusted System Time is an unsigned
- * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
* may be either signed or unsigned.
*/
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
diff --git a/ndk/platforms/android-8/include/err.h b/ndk/platforms/android-8/include/err.h
new file mode 100644
index 0000000..1636efe
--- /dev/null
+++ b/ndk/platforms/android-8/include/err.h
@@ -0,0 +1,90 @@
+/* $OpenBSD: err.h,v 1.10 2006/01/06 18:53:04 millert Exp $ */
+/* $NetBSD: err.h,v 1.11 1994/10/26 00:55:52 cgd Exp $ */
+
+/*-
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)err.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _ERR_H_
+#define _ERR_H_
+
+/*
+ * Don't use va_list in the err/warn prototypes. Va_list is typedef'd in two
+ * places (<machine/varargs.h> and <machine/stdarg.h>), so if we include one
+ * of them here we may collide with the utility's includes. It's unreasonable
+ * for utilities to have to include one of them to include err.h, so we get
+ * __va_list from <machine/_types.h> and use it.
+ */
+#include <sys/cdefs.h>
+#include <machine/_types.h>
+
+__BEGIN_DECLS
+
+__noreturn void err(int, const char *, ...)
+ __attribute__((__format__ (printf, 2, 3)));
+__noreturn void verr(int, const char *, __va_list)
+ __attribute__((__format__ (printf, 2, 0)));
+__noreturn void errx(int, const char *, ...)
+ __attribute__((__format__ (printf, 2, 3)));
+__noreturn void verrx(int, const char *, __va_list)
+ __attribute__((__format__ (printf, 2, 0)));
+void warn(const char *, ...)
+ __attribute__((__format__ (printf, 1, 2)));
+void vwarn(const char *, __va_list)
+ __attribute__((__format__ (printf, 1, 0)));
+void warnx(const char *, ...)
+ __attribute__((__format__ (printf, 1, 2)));
+void vwarnx(const char *, __va_list)
+ __attribute__((__format__ (printf, 1, 0)));
+
+/*
+ * The _* versions are for use in library functions so user-defined
+ * versions of err*,warn* do not get used.
+ */
+__noreturn void _err(int, const char *, ...)
+ __attribute__((__format__ (printf, 2, 3)));
+__noreturn void _verr(int, const char *, __va_list)
+ __attribute__((__format__ (printf, 2, 0)));
+__noreturn void _errx(int, const char *, ...)
+ __attribute__((__format__ (printf, 2, 3)));
+__noreturn void _verrx(int, const char *, __va_list)
+ __attribute__((__format__ (printf, 2, 0)));
+void _warn(const char *, ...)
+ __attribute__((__format__ (printf, 1, 2)));
+void _vwarn(const char *, __va_list)
+ __attribute__((__format__ (printf, 1, 0)));
+void _warnx(const char *, ...)
+ __attribute__((__format__ (printf, 1, 2)));
+void _vwarnx(const char *, __va_list)
+ __attribute__((__format__ (printf, 1, 0)));
+
+__END_DECLS
+
+#endif /* !_ERR_H_ */
diff --git a/ndk/platforms/android-8/include/stdio.h b/ndk/platforms/android-8/include/stdio.h
index ac475db..c38ed5a 100644
--- a/ndk/platforms/android-8/include/stdio.h
+++ b/ndk/platforms/android-8/include/stdio.h
@@ -307,7 +307,7 @@
FILE *fdopen(int, const char *);
int fileno(FILE *);
-#if (__POSIX_VISIBLE >= 199209) || 1 /* ANDROID: Bionic does include this */
+#if (__POSIX_VISIBLE >= 199209)
int pclose(FILE *);
FILE *popen(const char *, const char *);
#endif
diff --git a/ndk/platforms/android-9/include/EGL/eglplatform.h b/ndk/platforms/android-9/include/EGL/eglplatform.h
index 25d7697..e6c250d 100644
--- a/ndk/platforms/android-9/include/EGL/eglplatform.h
+++ b/ndk/platforms/android-9/include/EGL/eglplatform.h
@@ -78,7 +78,7 @@
typedef void *EGLNativeWindowType;
typedef void *EGLNativePixmapType;
-#elif defined(__unix__) && !defined(ANDROID)
+#elif defined(__unix__) && !defined(__ANDROID__)
/* X11 (tentative) */
#include <X11/Xlib.h>
@@ -89,7 +89,7 @@
typedef Window EGLNativeWindowType;
-#elif defined(ANDROID)
+#elif defined(__ANDROID__)
#include <android/native_window.h>
diff --git a/ndk/platforms/android-9/include/android/asset_manager.h b/ndk/platforms/android-9/include/android/asset_manager.h
index 4fa0ef3..3ad0f99 100644
--- a/ndk/platforms/android-9/include/android/asset_manager.h
+++ b/ndk/platforms/android-9/include/android/asset_manager.h
@@ -18,9 +18,9 @@
#ifndef ANDROID_ASSET_MANAGER_H
#define ANDROID_ASSET_MANAGER_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
struct AAssetManager;
typedef struct AAssetManager AAssetManager;
@@ -130,9 +130,6 @@
int AAsset_isAllocated(AAsset* asset);
+__END_DECLS
-#ifdef __cplusplus
-};
-#endif
-
-#endif // ANDROID_ASSET_MANAGER_H
+#endif /* ANDROID_ASSET_MANAGER_H */
diff --git a/ndk/platforms/android-9/include/android/asset_manager_jni.h b/ndk/platforms/android-9/include/android/asset_manager_jni.h
index aec2d3c..073434b 100644
--- a/ndk/platforms/android-9/include/android/asset_manager_jni.h
+++ b/ndk/platforms/android-9/include/android/asset_manager_jni.h
@@ -21,9 +21,7 @@
#include <android/asset_manager.h>
#include <jni.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/**
* Given a Dalvik AssetManager object, obtain the corresponding native AAssetManager
@@ -33,8 +31,6 @@
*/
AAssetManager* AAssetManager_fromJava(JNIEnv* env, jobject assetManager);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_ASSET_MANAGER_JNI_H
+#endif /* ANDROID_ASSET_MANAGER_JNI_H */
diff --git a/ndk/platforms/android-9/include/android/bitmap.h b/ndk/platforms/android-9/include/android/bitmap.h
index 5078277..160e34a 100644
--- a/ndk/platforms/android-9/include/android/bitmap.h
+++ b/ndk/platforms/android-9/include/android/bitmap.h
@@ -17,12 +17,11 @@
#ifndef ANDROID_BITMAP_H
#define ANDROID_BITMAP_H
+#include <sys/cdefs.h>
#include <stdint.h>
#include <jni.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
#define ANDROID_BITMAP_RESUT_SUCCESS 0
#define ANDROID_BITMAP_RESULT_BAD_PARAMETER -1
@@ -72,8 +71,6 @@
*/
int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap);
-#ifdef __cplusplus
-}
-#endif
+__END_DECLS
-#endif
+#endif /* ANDROID_BITMAP_H */
diff --git a/ndk/platforms/android-9/include/android/configuration.h b/ndk/platforms/android-9/include/android/configuration.h
index 99e8f97..4c85b12 100644
--- a/ndk/platforms/android-9/include/android/configuration.h
+++ b/ndk/platforms/android-9/include/android/configuration.h
@@ -19,9 +19,7 @@
#include <android/asset_manager.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
struct AConfiguration;
typedef struct AConfiguration AConfiguration;
@@ -312,8 +310,6 @@
int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
AConfiguration* requested);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_CONFIGURATION_H
+#endif /* ANDROID_CONFIGURATION_H */
diff --git a/ndk/platforms/android-9/include/android/input.h b/ndk/platforms/android-9/include/android/input.h
index 5580700..ae96c50 100644
--- a/ndk/platforms/android-9/include/android/input.h
+++ b/ndk/platforms/android-9/include/android/input.h
@@ -45,9 +45,7 @@
#include <android/keycodes.h>
#include <android/looper.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/*
* Key states (may be returned by queries about the current state of a
@@ -677,8 +675,6 @@
*/
void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
-#ifdef __cplusplus
-}
-#endif
+__END_DECLS
-#endif // _ANDROID_INPUT_H
+#endif /* _ANDROID_INPUT_H */
diff --git a/ndk/platforms/android-9/include/android/keycodes.h b/ndk/platforms/android-9/include/android/keycodes.h
index 496eccc..be0550a 100644
--- a/ndk/platforms/android-9/include/android/keycodes.h
+++ b/ndk/platforms/android-9/include/android/keycodes.h
@@ -33,11 +33,10 @@
* - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
*/
+#include <sys/cdefs.h>
#include <sys/types.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/*
* Key codes.
@@ -159,8 +158,6 @@
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
};
-#ifdef __cplusplus
-}
-#endif
+__END_DECLS
-#endif // _ANDROID_KEYCODES_H
+#endif /* _ANDROID_KEYCODES_H */
diff --git a/ndk/platforms/android-9/include/android/looper.h b/ndk/platforms/android-9/include/android/looper.h
index a9d8426..9b7438b 100644
--- a/ndk/platforms/android-9/include/android/looper.h
+++ b/ndk/platforms/android-9/include/android/looper.h
@@ -18,9 +18,9 @@
#ifndef ANDROID_LOOPER_H
#define ANDROID_LOOPER_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
/**
* ALooper
@@ -248,8 +248,6 @@
*/
int ALooper_removeFd(ALooper* looper, int fd);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_NATIVE_WINDOW_H
+#endif /* ANDROID_NATIVE_WINDOW_H */
diff --git a/ndk/platforms/android-9/include/android/native_activity.h b/ndk/platforms/android-9/include/android/native_activity.h
index d89bc8b..0bff86d 100644
--- a/ndk/platforms/android-9/include/android/native_activity.h
+++ b/ndk/platforms/android-9/include/android/native_activity.h
@@ -19,6 +19,7 @@
#define ANDROID_NATIVE_ACTIVITY_H
#include <stdint.h>
+#include <sys/cdefs.h>
#include <sys/types.h>
#include <jni.h>
@@ -27,9 +28,7 @@
#include <android/input.h>
#include <android/native_window.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
struct ANativeActivityCallbacks;
@@ -68,17 +67,17 @@
* Path to this application's internal data directory.
*/
const char* internalDataPath;
-
+
/**
* Path to this application's external (removable/mountable) data directory.
*/
const char* externalDataPath;
-
+
/**
* The platform's SDK version code.
*/
int32_t sdkVersion;
-
+
/**
* This is the native instance of the application. It is not used by
* the framework, but can be set by the application to its own instance
@@ -105,13 +104,13 @@
* for more information.
*/
void (*onStart)(ANativeActivity* activity);
-
+
/**
* NativeActivity has resumed. See Java documentation for Activity.onResume()
* for more information.
*/
void (*onResume)(ANativeActivity* activity);
-
+
/**
* Framework is asking NativeActivity to save its current instance state.
* See Java documentation for Activity.onSaveInstanceState() for more
@@ -122,19 +121,19 @@
* entities (pointers to memory, file descriptors, etc).
*/
void* (*onSaveInstanceState)(ANativeActivity* activity, size_t* outSize);
-
+
/**
* NativeActivity has paused. See Java documentation for Activity.onPause()
* for more information.
*/
void (*onPause)(ANativeActivity* activity);
-
+
/**
* NativeActivity has stopped. See Java documentation for Activity.onStop()
* for more information.
*/
void (*onStop)(ANativeActivity* activity);
-
+
/**
* NativeActivity is being destroyed. See Java documentation for Activity.onDestroy()
* for more information.
@@ -146,7 +145,7 @@
* for example, to pause a game when it loses input focus.
*/
void (*onWindowFocusChanged)(ANativeActivity* activity, int hasFocus);
-
+
/**
* The drawing window for this native activity has been created. You
* can use the given native window object to start drawing.
@@ -177,13 +176,13 @@
* returning from here.
*/
void (*onNativeWindowDestroyed)(ANativeActivity* activity, ANativeWindow* window);
-
+
/**
* The input queue for this native activity's window has been created.
* You can use the given input queue to start retrieving input events.
*/
void (*onInputQueueCreated)(ANativeActivity* activity, AInputQueue* queue);
-
+
/**
* The input queue for this native activity's window is being destroyed.
* You should no longer try to reference this object upon returning from this
@@ -288,9 +287,6 @@
*/
void ANativeActivity_hideSoftInput(ANativeActivity* activity, uint32_t flags);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_NATIVE_ACTIVITY_H
-
+#endif /* ANDROID_NATIVE_ACTIVITY_H */
diff --git a/ndk/platforms/android-9/include/android/native_window.h b/ndk/platforms/android-9/include/android/native_window.h
index ad03d0e..75e68c1 100644
--- a/ndk/platforms/android-9/include/android/native_window.h
+++ b/ndk/platforms/android-9/include/android/native_window.h
@@ -17,11 +17,10 @@
#ifndef ANDROID_NATIVE_WINDOW_H
#define ANDROID_NATIVE_WINDOW_H
+#include <sys/cdefs.h>
#include <android/rect.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/*
* Pixel formats that a window can use.
@@ -51,7 +50,7 @@
// The actual bits.
void* bits;
-
+
// Do not touch.
uint32_t reserved[6];
} ANativeWindow_Buffer;
@@ -96,7 +95,7 @@
* For all of these parameters, if 0 is supplied then the window's base
* value will come back in force.
*/
-int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, int32_t width, int32_t height);
+int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, int32_t width, int32_t height, int32_t format);
/**
* Lock the window's next drawing surface for writing.
@@ -110,8 +109,6 @@
*/
int32_t ANativeWindow_unlockAndPost(ANativeWindow* window);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_NATIVE_WINDOW_H
+#endif /* ANDROID_NATIVE_WINDOW_H */
diff --git a/ndk/platforms/android-9/include/android/native_window_jni.h b/ndk/platforms/android-9/include/android/native_window_jni.h
index b9e72ef..a44a5b1 100644
--- a/ndk/platforms/android-9/include/android/native_window_jni.h
+++ b/ndk/platforms/android-9/include/android/native_window_jni.h
@@ -21,9 +21,7 @@
#include <jni.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/**
* Return the ANativeWindow associated with a Java Surface object,
@@ -33,8 +31,6 @@
*/
ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_NATIVE_WINDOW_H
+#endif /* ANDROID_NATIVE_WINDOW_H */
diff --git a/ndk/platforms/android-9/include/android/obb.h b/ndk/platforms/android-9/include/android/obb.h
index 65e9b2a..5670b1c 100644
--- a/ndk/platforms/android-9/include/android/obb.h
+++ b/ndk/platforms/android-9/include/android/obb.h
@@ -18,11 +18,10 @@
#ifndef ANDROID_OBB_H
#define ANDROID_OBB_H
+#include <sys/cdefs.h>
#include <sys/types.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
struct AObbInfo;
typedef struct AObbInfo AObbInfo;
@@ -56,8 +55,6 @@
*/
int32_t AObbInfo_getFlags(AObbInfo* obbInfo);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_OBB_H
+#endif /* ANDROID_OBB_H */
diff --git a/ndk/platforms/android-9/include/android/rect.h b/ndk/platforms/android-9/include/android/rect.h
index 3e81f53..161c2a7 100644
--- a/ndk/platforms/android-9/include/android/rect.h
+++ b/ndk/platforms/android-9/include/android/rect.h
@@ -18,9 +18,9 @@
#ifndef ANDROID_RECT_H
#define ANDROID_RECT_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
typedef struct ARect {
int32_t left;
@@ -29,8 +29,6 @@
int32_t bottom;
} ARect;
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_RECT_H
+#endif /* ANDROID_RECT_H */
diff --git a/ndk/platforms/android-9/include/android/sensor.h b/ndk/platforms/android-9/include/android/sensor.h
index f163f18..eb46ef0 100644
--- a/ndk/platforms/android-9/include/android/sensor.h
+++ b/ndk/platforms/android-9/include/android/sensor.h
@@ -39,14 +39,12 @@
* native code.
*
*/
-
+#include <sys/cdefs.h>
#include <sys/types.h>
#include <android/looper.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
/*
@@ -249,8 +247,6 @@
int ASensor_getMinDelay(ASensor const* sensor);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_SENSOR_H
+#endif /* ANDROID_SENSOR_H */
diff --git a/ndk/platforms/android-9/include/android/storage_manager.h b/ndk/platforms/android-9/include/android/storage_manager.h
index bad2491..f3b08dc 100644
--- a/ndk/platforms/android-9/include/android/storage_manager.h
+++ b/ndk/platforms/android-9/include/android/storage_manager.h
@@ -18,11 +18,10 @@
#ifndef ANDROID_STORAGE_MANAGER_H
#define ANDROID_STORAGE_MANAGER_H
+#include <sys/cdefs.h>
#include <stdint.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
struct AStorageManager;
typedef struct AStorageManager AStorageManager;
@@ -120,8 +119,6 @@
const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename);
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_STORAGE_MANAGER_H
+#endif /* ANDROID_STORAGE_MANAGER_H */
diff --git a/ndk/platforms/android-9/include/android/window.h b/ndk/platforms/android-9/include/android/window.h
index 2ab192b..0633f89 100644
--- a/ndk/platforms/android-9/include/android/window.h
+++ b/ndk/platforms/android-9/include/android/window.h
@@ -18,9 +18,9 @@
#ifndef ANDROID_WINDOW_H
#define ANDROID_WINDOW_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
/**
* Window flags, as per the Java API at android.view.WindowManager.LayoutParams.
@@ -51,8 +51,6 @@
AWINDOW_FLAG_DISMISS_KEYGUARD = 0x00400000,
};
-#ifdef __cplusplus
-};
-#endif
+__END_DECLS
-#endif // ANDROID_WINDOW_H
+#endif /* ANDROID_WINDOW_H */
diff --git a/ndk/platforms/android-9/include/arpa/telnet.h b/ndk/platforms/android-9/include/arpa/telnet.h
new file mode 100644
index 0000000..d318e08
--- /dev/null
+++ b/ndk/platforms/android-9/include/arpa/telnet.h
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)telnet.h 8.2 (Berkeley) 12/15/93
+ */
+
+#ifndef _ARPA_TELNET_H
+#define _ARPA_TELNET_H 1
+
+/*
+ * Definitions for the TELNET protocol.
+ */
+#define IAC 255 /* interpret as command: */
+#define DONT 254 /* you are not to use option */
+#define DO 253 /* please, you use option */
+#define WONT 252 /* I won't use option */
+#define WILL 251 /* I will use option */
+#define SB 250 /* interpret as subnegotiation */
+#define GA 249 /* you may reverse the line */
+#define EL 248 /* erase the current line */
+#define EC 247 /* erase the current character */
+#define AYT 246 /* are you there */
+#define AO 245 /* abort output--but let prog finish */
+#define IP 244 /* interrupt process--permanently */
+#define BREAK 243 /* break */
+#define DM 242 /* data mark--for connect. cleaning */
+#define NOP 241 /* nop */
+#define SE 240 /* end sub negotiation */
+#define EOR 239 /* end of record (transparent mode) */
+#define ABORT 238 /* Abort process */
+#define SUSP 237 /* Suspend process */
+#define xEOF 236 /* End of file: EOF is already used... */
+
+#define SYNCH 242 /* for telfunc calls */
+
+#ifdef TELCMDS
+char *telcmds[] = {
+ "EOF", "SUSP", "ABORT", "EOR",
+ "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
+ "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
+};
+#else
+extern char *telcmds[];
+#endif
+
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \
+ (unsigned int)(x) >= TELCMD_FIRST)
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+
+/* telnet options */
+#define TELOPT_BINARY 0 /* 8-bit data path */
+#define TELOPT_ECHO 1 /* echo */
+#define TELOPT_RCP 2 /* prepare to reconnect */
+#define TELOPT_SGA 3 /* suppress go ahead */
+#define TELOPT_NAMS 4 /* approximate message size */
+#define TELOPT_STATUS 5 /* give status */
+#define TELOPT_TM 6 /* timing mark */
+#define TELOPT_RCTE 7 /* remote controlled transmission and echo */
+#define TELOPT_NAOL 8 /* negotiate about output line width */
+#define TELOPT_NAOP 9 /* negotiate about output page size */
+#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */
+#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */
+#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */
+#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */
+#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */
+#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */
+#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */
+#define TELOPT_XASCII 17 /* extended ascii character set */
+#define TELOPT_LOGOUT 18 /* force logout */
+#define TELOPT_BM 19 /* byte macro */
+#define TELOPT_DET 20 /* data entry terminal */
+#define TELOPT_SUPDUP 21 /* supdup protocol */
+#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */
+#define TELOPT_SNDLOC 23 /* send location */
+#define TELOPT_TTYPE 24 /* terminal type */
+#define TELOPT_EOR 25 /* end or record */
+#define TELOPT_TUID 26 /* TACACS user identification */
+#define TELOPT_OUTMRK 27 /* output marking */
+#define TELOPT_TTYLOC 28 /* terminal location number */
+#define TELOPT_3270REGIME 29 /* 3270 regime */
+#define TELOPT_X3PAD 30 /* X.3 PAD */
+#define TELOPT_NAWS 31 /* window size */
+#define TELOPT_TSPEED 32 /* terminal speed */
+#define TELOPT_LFLOW 33 /* remote flow control */
+#define TELOPT_LINEMODE 34 /* Linemode option */
+#define TELOPT_XDISPLOC 35 /* X Display Location */
+#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
+#define TELOPT_AUTHENTICATION 37/* Authenticate */
+#define TELOPT_ENCRYPT 38 /* Encryption option */
+#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
+#define TELOPT_EXOPL 255 /* extended-options-list */
+
+
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+const char *telopts[NTELOPTS+1] = {
+ "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+ "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+ "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+ "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+ "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+ "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+ "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+ "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+ "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+ "ENCRYPT", "NEW-ENVIRON",
+ 0,
+};
+#define TELOPT_FIRST TELOPT_BINARY
+#define TELOPT_LAST TELOPT_NEW_ENVIRON
+#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
+#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
+#endif
+
+/* sub-option qualifiers */
+#define TELQUAL_IS 0 /* option is... */
+#define TELQUAL_SEND 1 /* send option */
+#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
+#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */
+#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */
+
+#define LFLOW_OFF 0 /* Disable remote flow control */
+#define LFLOW_ON 1 /* Enable remote flow control */
+#define LFLOW_RESTART_ANY 2 /* Restart output on any char */
+#define LFLOW_RESTART_XON 3 /* Restart output only on XON */
+
+/*
+ * LINEMODE suboptions
+ */
+
+#define LM_MODE 1
+#define LM_FORWARDMASK 2
+#define LM_SLC 3
+
+#define MODE_EDIT 0x01
+#define MODE_TRAPSIG 0x02
+#define MODE_ACK 0x04
+#define MODE_SOFT_TAB 0x08
+#define MODE_LIT_ECHO 0x10
+
+#define MODE_MASK 0x1f
+
+/* Not part of protocol, but needed to simplify things... */
+#define MODE_FLOW 0x0100
+#define MODE_ECHO 0x0200
+#define MODE_INBIN 0x0400
+#define MODE_OUTBIN 0x0800
+#define MODE_FORCE 0x1000
+
+#define SLC_SYNCH 1
+#define SLC_BRK 2
+#define SLC_IP 3
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_EOR 6
+#define SLC_ABORT 7
+#define SLC_EOF 8
+#define SLC_SUSP 9
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EW 12
+#define SLC_RP 13
+#define SLC_LNEXT 14
+#define SLC_XON 15
+#define SLC_XOFF 16
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+
+#define NSLC 18
+
+/*
+ * For backwards compatibility, we define SLC_NAMES to be the
+ * list of names if SLC_NAMES is not defined.
+ */
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+ "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#ifdef SLC_NAMES
+const char *slc_names[] = {
+ SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define SLC_NAMES SLC_NAMELIST
+#endif
+
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x) slc_names[x]
+
+#define SLC_NOSUPPORT 0
+#define SLC_CANTCHANGE 1
+#define SLC_VARIABLE 2
+#define SLC_DEFAULT 3
+#define SLC_LEVELBITS 0x03
+
+#define SLC_FUNC 0
+#define SLC_FLAGS 1
+#define SLC_VALUE 2
+
+#define SLC_ACK 0x80
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+
+#define OLD_ENV_VAR 1
+#define OLD_ENV_VALUE 0
+#define NEW_ENV_VAR 0
+#define NEW_ENV_VALUE 1
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+
+/*
+ * AUTHENTICATION suboptions
+ */
+
+/*
+ * Who is authenticating who ...
+ */
+#define AUTH_WHO_CLIENT 0 /* Client authenticating server */
+#define AUTH_WHO_SERVER 1 /* Server authenticating client */
+#define AUTH_WHO_MASK 1
+
+/*
+ * amount of authentication done
+ */
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_MASK 2
+
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_CNT 5
+
+#define AUTHTYPE_TEST 99
+
+#ifdef AUTH_NAMES
+const char *authtype_names[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NAME(x) authtype_names[x]
+
+/*
+ * ENCRYPTion suboptions
+ */
+#define ENCRYPT_IS 0 /* I pick encryption type ... */
+#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */
+#define ENCRYPT_REPLY 2 /* Initial setup response */
+#define ENCRYPT_START 3 /* Am starting to send encrypted */
+#define ENCRYPT_END 4 /* Am ending encrypted */
+#define ENCRYPT_REQSTART 5 /* Request you start encrypting */
+#define ENCRYPT_REQEND 6 /* Request you send encrypting */
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_CNT 9
+
+#define ENCTYPE_ANY 0
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_CNT 3
+
+#ifdef ENCRYPT_NAMES
+const char *encrypt_names[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+ 0,
+};
+const char *enctype_names[] = {
+ "ANY", "DES_CFB64", "DES_OFB64", 0,
+};
+#else
+extern const char *encrypt_names[];
+extern const char *enctype_names[];
+#endif
+
+
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_NAME(x) encrypt_names[x]
+
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENCTYPE_NAME(x) enctype_names[x]
+
+#endif /* arpa/telnet.h */
diff --git a/ndk/platforms/android-9/include/pthread.h b/ndk/platforms/android-9/include/pthread.h
index 9773dcb..1e80b12 100644
--- a/ndk/platforms/android-9/include/pthread.h
+++ b/ndk/platforms/android-9/include/pthread.h
@@ -163,7 +163,9 @@
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
+#if 0 /* MISSING FROM BIONIC */
int pthread_mutex_timedlock(pthread_mutex_t *mutex, struct timespec* ts);
+#endif /* MISSING */
int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared);
diff --git a/ndk/platforms/android-9/include/sched.h b/ndk/platforms/android-9/include/sched.h
new file mode 100644
index 0000000..e702470
--- /dev/null
+++ b/ndk/platforms/android-9/include/sched.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SCHED_H_
+#define _SCHED_H_
+
+#include <sys/cdefs.h>
+#include <sys/time.h>
+
+__BEGIN_DECLS
+
+#define SCHED_NORMAL 0
+#define SCHED_OTHER 0
+#define SCHED_FIFO 1
+#define SCHED_RR 2
+
+struct sched_param {
+ int sched_priority;
+};
+
+extern int sched_setscheduler(pid_t, int, const struct sched_param *);
+extern int sched_getscheduler(pid_t);
+extern int sched_yield(void);
+extern int sched_get_priority_max(int policy);
+extern int sched_get_priority_min(int policy);
+extern int sched_setparam(pid_t, const struct sched_param *);
+extern int sched_getparam(pid_t, struct sched_param *);
+extern int sched_rr_get_interval(pid_t pid, struct timespec *tp);
+
+#define CLONE_VM 0x00000100
+#define CLONE_FS 0x00000200
+#define CLONE_FILES 0x00000400
+#define CLONE_SIGHAND 0x00000800
+#define CLONE_PTRACE 0x00002000
+#define CLONE_VFORK 0x00004000
+#define CLONE_PARENT 0x00008000
+#define CLONE_THREAD 0x00010000
+#define CLONE_NEWNS 0x00020000
+#define CLONE_SYSVSEM 0x00040000
+#define CLONE_SETTLS 0x00080000
+#define CLONE_PARENT_SETTID 0x00100000
+#define CLONE_CHILD_CLEARTID 0x00200000
+#define CLONE_DETACHED 0x00400000
+#define CLONE_UNTRACED 0x00800000
+#define CLONE_CHILD_SETTID 0x01000000
+#define CLONE_STOPPED 0x02000000
+
+#ifdef _GNU_SOURCE
+extern int clone(int (*fn)(void *), void *child_stack, int flags, void* arg, ...);
+#endif
+
+__END_DECLS
+
+#endif /* _SCHED_H_ */
diff --git a/ndk/platforms/android-9/include/stdlib.h b/ndk/platforms/android-9/include/stdlib.h
index 41e8d26..97d8e46 100644
--- a/ndk/platforms/android-9/include/stdlib.h
+++ b/ndk/platforms/android-9/include/stdlib.h
@@ -50,7 +50,6 @@
extern __noreturn void exit(int);
extern __noreturn void abort(void);
extern int atexit(void (*)(void));
-extern int on_exit(void (*)(int, void *), void *);
extern char *getenv(const char *);
extern int putenv(const char *);
@@ -107,6 +106,8 @@
extern long nrand48(unsigned short *);
extern long lrand48(void);
extern unsigned short *seed48(unsigned short*);
+extern double erand48(unsigned short xsubi[3]);
+extern double drand48(void);
extern void srand48(long);
extern unsigned int arc4random(void);
extern void arc4random_stir(void);
@@ -135,7 +136,7 @@
extern int ptsname_r(int, char*, size_t);
extern int getpt(void);
-static __inline__ int grantpt(int __fd)
+static __inline__ int grantpt(int __fd __attribute((unused)))
{
(void)__fd;
return 0; /* devpts does this all for us! */
@@ -162,6 +163,7 @@
extern lldiv_t lldiv(long long, long long);
+#if 1 /* MISSING FROM BIONIC - ENABLED FOR STLPort and libstdc++-v3 */
/* make STLPort happy */
extern int mblen(const char *, size_t);
extern size_t mbstowcs(wchar_t *, const char *, size_t);
@@ -170,8 +172,14 @@
/* Likewise, make libstdc++-v3 happy. */
extern int wctomb(char *, wchar_t);
extern size_t wcstombs(char *, const wchar_t *, size_t);
+#endif /* MISSING */
+
#define MB_CUR_MAX 1
+#if 0 /* MISSING FROM BIONIC */
+extern int on_exit(void (*)(int, void *), void *);
+#endif /* MISSING */
+
__END_DECLS
#endif /* _STDLIB_H_ */
diff --git a/ndk/platforms/android-9/include/strings.h b/ndk/platforms/android-9/include/strings.h
new file mode 100644
index 0000000..fee7dc4
--- /dev/null
+++ b/ndk/platforms/android-9/include/strings.h
@@ -0,0 +1,56 @@
+/* $NetBSD: strings.h,v 1.10 2005/02/03 04:39:32 perry Exp $ */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _STRINGS_H_
+#define _STRINGS_H_
+
+#include <sys/types.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+int bcmp(const void *, const void *, size_t);
+void bcopy(const void *, void *, size_t);
+void bzero(void *, size_t);
+int ffs(int);
+char *index(const char *, int);
+char *rindex(const char *, int);
+int strcasecmp(const char *, const char *);
+int strncasecmp(const char *, const char *, size_t);
+__END_DECLS
+
+#endif /* !defined(_STRINGS_H_) */
diff --git a/ndk/platforms/android-9/include/sys/_sigdefs.h b/ndk/platforms/android-9/include/sys/_sigdefs.h
new file mode 100644
index 0000000..6822c25
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/_sigdefs.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * this header is used to define signal constants and names;
+ * it might be included several times
+ */
+
+#ifndef __BIONIC_SIGDEF
+#error __BIONIC_SIGDEF not defined
+#endif
+
+__BIONIC_SIGDEF(HUP,1,"Hangup")
+__BIONIC_SIGDEF(INT,2,"Interrupt")
+__BIONIC_SIGDEF(QUIT,3,"Quit")
+__BIONIC_SIGDEF(ILL,4,"Illegal instruction")
+__BIONIC_SIGDEF(TRAP,5,"Trap")
+__BIONIC_SIGDEF(ABRT,6,"Aborted")
+__BIONIC_SIGDEF(BUS,7,"Bus error")
+__BIONIC_SIGDEF(FPE,8,"Floating point exception")
+__BIONIC_SIGDEF(KILL,9,"Killed")
+__BIONIC_SIGDEF(USR1,10,"User signal 1")
+__BIONIC_SIGDEF(SEGV,11,"Segmentation fault")
+__BIONIC_SIGDEF(USR2,12,"User signal 2")
+__BIONIC_SIGDEF(PIPE,13,"Broken pipe")
+__BIONIC_SIGDEF(ALRM,14,"Alarm clock")
+__BIONIC_SIGDEF(TERM,15,"Terminated")
+__BIONIC_SIGDEF(STKFLT,16,"Stack fault")
+__BIONIC_SIGDEF(CHLD,17,"Child exited")
+__BIONIC_SIGDEF(CONT,18,"Continue")
+__BIONIC_SIGDEF(STOP,19,"Stopped (signal)")
+__BIONIC_SIGDEF(TSTP,20,"Stopped")
+__BIONIC_SIGDEF(TTIN,21,"Stopped (tty input)")
+__BIONIC_SIGDEF(TTOU,22,"Stopper (tty output)")
+__BIONIC_SIGDEF(URG,23,"Urgent I/O condition")
+__BIONIC_SIGDEF(XCPU,24,"CPU time limit exceeded")
+__BIONIC_SIGDEF(XFSZ,25,"File size limit exceeded")
+__BIONIC_SIGDEF(VTALRM,26,"Virtual timer expired")
+__BIONIC_SIGDEF(PROF,27,"Profiling timer expired")
+__BIONIC_SIGDEF(WINCH,28,"Window size changed")
+__BIONIC_SIGDEF(IO,29,"I/O possible")
+__BIONIC_SIGDEF(PWR,30,"Power failure")
+__BIONIC_SIGDEF(SYS,31,"Bad system call")
+
+#undef __BIONIC_SIGDEF
diff --git a/ndk/platforms/android-9/include/sys/cdefs.h b/ndk/platforms/android-9/include/sys/cdefs.h
new file mode 100644
index 0000000..849e2b8
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/cdefs.h
@@ -0,0 +1,501 @@
+/* $NetBSD: cdefs.h,v 1.58 2004/12/11 05:59:00 christos Exp $ */
+
+/*
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Berkeley Software Design, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)cdefs.h 8.8 (Berkeley) 1/9/95
+ */
+
+#ifndef _SYS_CDEFS_H_
+#define _SYS_CDEFS_H_
+
+/*
+ * Macro to test if we're using a GNU C compiler of a specific vintage
+ * or later, for e.g. features that appeared in a particular version
+ * of GNU C. Usage:
+ *
+ * #if __GNUC_PREREQ__(major, minor)
+ * ...cool feature...
+ * #else
+ * ...delete feature...
+ * #endif
+ */
+#ifdef __GNUC__
+#define __GNUC_PREREQ__(x, y) \
+ ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
+ (__GNUC__ > (x)))
+#else
+#define __GNUC_PREREQ__(x, y) 0
+#endif
+
+#include <sys/cdefs_elf.h>
+
+#if defined(__cplusplus)
+#define __BEGIN_DECLS extern "C" {
+#define __END_DECLS }
+#define __static_cast(x,y) static_cast<x>(y)
+#else
+#define __BEGIN_DECLS
+#define __END_DECLS
+#define __static_cast(x,y) (x)y
+#endif
+
+/*
+ * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
+ * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
+ * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
+ * in between its arguments. __CONCAT can also concatenate double-quoted
+ * strings produced by the __STRING macro, but this only works with ANSI C.
+ */
+
+#define ___STRING(x) __STRING(x)
+#define ___CONCAT(x,y) __CONCAT(x,y)
+
+#if __STDC__ || defined(__cplusplus)
+#define __P(protos) protos /* full-blown ANSI C */
+#define __CONCAT(x,y) x ## y
+#define __STRING(x) #x
+
+#define __const const /* define reserved names to standard */
+#define __signed signed
+#define __volatile volatile
+#if defined(__cplusplus)
+#define __inline inline /* convert to C++ keyword */
+#else
+#if !defined(__GNUC__) && !defined(__lint__)
+#define __inline /* delete GCC keyword */
+#endif /* !__GNUC__ && !__lint__ */
+#endif /* !__cplusplus */
+
+#else /* !(__STDC__ || __cplusplus) */
+#define __P(protos) () /* traditional C preprocessor */
+#define __CONCAT(x,y) x/**/y
+#define __STRING(x) "x"
+
+#ifndef __GNUC__
+#define __const /* delete pseudo-ANSI C keywords */
+#define __inline
+#define __signed
+#define __volatile
+#endif /* !__GNUC__ */
+
+/*
+ * In non-ANSI C environments, new programs will want ANSI-only C keywords
+ * deleted from the program and old programs will want them left alone.
+ * Programs using the ANSI C keywords const, inline etc. as normal
+ * identifiers should define -DNO_ANSI_KEYWORDS.
+ */
+#ifndef NO_ANSI_KEYWORDS
+#define const __const /* convert ANSI C keywords */
+#define inline __inline
+#define signed __signed
+#define volatile __volatile
+#endif /* !NO_ANSI_KEYWORDS */
+#endif /* !(__STDC__ || __cplusplus) */
+
+/*
+ * Used for internal auditing of the NetBSD source tree.
+ */
+#ifdef __AUDIT__
+#define __aconst __const
+#else
+#define __aconst
+#endif
+
+/*
+ * The following macro is used to remove const cast-away warnings
+ * from gcc -Wcast-qual; it should be used with caution because it
+ * can hide valid errors; in particular most valid uses are in
+ * situations where the API requires it, not to cast away string
+ * constants. We don't use *intptr_t on purpose here and we are
+ * explicit about unsigned long so that we don't have additional
+ * dependencies.
+ */
+#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
+
+/*
+ * GCC2 provides __extension__ to suppress warnings for various GNU C
+ * language extensions under "-ansi -pedantic".
+ */
+#if !__GNUC_PREREQ__(2, 0)
+#define __extension__ /* delete __extension__ if non-gcc or gcc1 */
+#endif
+
+/*
+ * GCC1 and some versions of GCC2 declare dead (non-returning) and
+ * pure (no side effects) functions using "volatile" and "const";
+ * unfortunately, these then cause warnings under "-ansi -pedantic".
+ * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of
+ * these work for GNU C++ (modulo a slight glitch in the C++ grammar
+ * in the distribution version of 2.5.5).
+ */
+#if !__GNUC_PREREQ__(2, 5)
+#define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+#define __dead __volatile
+#define __pure __const
+#endif
+#endif
+
+/* Delete pseudo-keywords wherever they are not available or needed. */
+#ifndef __dead
+#define __dead
+#define __pure
+#endif
+
+#if __GNUC_PREREQ__(2, 7)
+#define __unused __attribute__((__unused__))
+#else
+#define __unused /* delete */
+#endif
+
+#if __GNUC_PREREQ__(3, 1)
+#define __used __attribute__((__used__))
+#else
+#define __used /* delete */
+#endif
+
+#if __GNUC_PREREQ__(2, 7)
+#define __packed __attribute__((__packed__))
+#define __aligned(x) __attribute__((__aligned__(x)))
+#define __section(x) __attribute__((__section__(x)))
+#elif defined(__lint__)
+#define __packed /* delete */
+#define __aligned(x) /* delete */
+#define __section(x) /* delete */
+#else
+#define __packed error: no __packed for this compiler
+#define __aligned(x) error: no __aligned for this compiler
+#define __section(x) error: no __section for this compiler
+#endif
+
+#if !__GNUC_PREREQ__(2, 8)
+#define __extension__
+#endif
+
+#if __GNUC_PREREQ__(2, 8)
+#define __statement(x) __extension__(x)
+#elif defined(lint)
+#define __statement(x) (0)
+#else
+#define __statement(x) (x)
+#endif
+
+/*
+ * C99 defines the restrict type qualifier keyword, which was made available
+ * in GCC 2.92.
+ */
+#if __STDC_VERSION__ >= 199901L
+#define __restrict restrict
+#else
+#if !__GNUC_PREREQ__(2, 92)
+#define __restrict /* delete __restrict when not supported */
+#endif
+#endif
+
+/*
+ * C99 defines __func__ predefined identifier, which was made available
+ * in GCC 2.95.
+ */
+#if !(__STDC_VERSION__ >= 199901L)
+#if __GNUC_PREREQ__(2, 6)
+#define __func__ __PRETTY_FUNCTION__
+#elif __GNUC_PREREQ__(2, 4)
+#define __func__ __FUNCTION__
+#else
+#define __func__ ""
+#endif
+#endif /* !(__STDC_VERSION__ >= 199901L) */
+
+#if defined(_KERNEL)
+#if defined(NO_KERNEL_RCSIDS)
+#undef __KERNEL_RCSID
+#define __KERNEL_RCSID(_n, _s) /* nothing */
+#endif /* NO_KERNEL_RCSIDS */
+#endif /* _KERNEL */
+
+#if !defined(_STANDALONE) && !defined(_KERNEL)
+#ifdef __GNUC__
+#define __RENAME(x) ___RENAME(x)
+#else
+#ifdef __lint__
+#define __RENAME(x) __symbolrename(x)
+#else
+#error "No function renaming possible"
+#endif /* __lint__ */
+#endif /* __GNUC__ */
+#else /* _STANDALONE || _KERNEL */
+#define __RENAME(x) no renaming in kernel or standalone environment
+#endif
+
+/*
+ * A barrier to stop the optimizer from moving code or assume live
+ * register values. This is gcc specific, the version is more or less
+ * arbitrary, might work with older compilers.
+ */
+#if __GNUC_PREREQ__(2, 95)
+#define __insn_barrier() __asm __volatile("":::"memory")
+#else
+#define __insn_barrier() /* */
+#endif
+
+/*
+ * GNU C version 2.96 adds explicit branch prediction so that
+ * the CPU back-end can hint the processor and also so that
+ * code blocks can be reordered such that the predicted path
+ * sees a more linear flow, thus improving cache behavior, etc.
+ *
+ * The following two macros provide us with a way to use this
+ * compiler feature. Use __predict_true() if you expect the expression
+ * to evaluate to true, and __predict_false() if you expect the
+ * expression to evaluate to false.
+ *
+ * A few notes about usage:
+ *
+ * * Generally, __predict_false() error condition checks (unless
+ * you have some _strong_ reason to do otherwise, in which case
+ * document it), and/or __predict_true() `no-error' condition
+ * checks, assuming you want to optimize for the no-error case.
+ *
+ * * Other than that, if you don't know the likelihood of a test
+ * succeeding from empirical or other `hard' evidence, don't
+ * make predictions.
+ *
+ * * These are meant to be used in places that are run `a lot'.
+ * It is wasteful to make predictions in code that is run
+ * seldomly (e.g. at subsystem initialization time) as the
+ * basic block reordering that this affects can often generate
+ * larger code.
+ */
+#if __GNUC_PREREQ__(2, 96)
+#define __predict_true(exp) __builtin_expect((exp) != 0, 1)
+#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
+#else
+#define __predict_true(exp) (exp)
+#define __predict_false(exp) (exp)
+#endif
+
+#if __GNUC_PREREQ__(2, 96)
+#define __noreturn __attribute__((__noreturn__))
+#define __mallocfunc __attribute__((malloc))
+#else
+#define __noreturn
+#define __mallocfunc
+#endif
+
+/*
+ * Macros for manipulating "link sets". Link sets are arrays of pointers
+ * to objects, which are gathered up by the linker.
+ *
+ * Object format-specific code has provided us with the following macros:
+ *
+ * __link_set_add_text(set, sym)
+ * Add a reference to the .text symbol `sym' to `set'.
+ *
+ * __link_set_add_rodata(set, sym)
+ * Add a reference to the .rodata symbol `sym' to `set'.
+ *
+ * __link_set_add_data(set, sym)
+ * Add a reference to the .data symbol `sym' to `set'.
+ *
+ * __link_set_add_bss(set, sym)
+ * Add a reference to the .bss symbol `sym' to `set'.
+ *
+ * __link_set_decl(set, ptype)
+ * Provide an extern declaration of the set `set', which
+ * contains an array of the pointer type `ptype'. This
+ * macro must be used by any code which wishes to reference
+ * the elements of a link set.
+ *
+ * __link_set_start(set)
+ * This points to the first slot in the link set.
+ *
+ * __link_set_end(set)
+ * This points to the (non-existent) slot after the last
+ * entry in the link set.
+ *
+ * __link_set_count(set)
+ * Count the number of entries in link set `set'.
+ *
+ * In addition, we provide the following macros for accessing link sets:
+ *
+ * __link_set_foreach(pvar, set)
+ * Iterate over the link set `set'. Because a link set is
+ * an array of pointers, pvar must be declared as "type **pvar",
+ * and the actual entry accessed as "*pvar".
+ *
+ * __link_set_entry(set, idx)
+ * Access the link set entry at index `idx' from set `set'.
+ */
+#define __link_set_foreach(pvar, set) \
+ for (pvar = __link_set_start(set); pvar < __link_set_end(set); pvar++)
+
+#define __link_set_entry(set, idx) (__link_set_begin(set)[idx])
+
+/*
+ * Some of the recend FreeBSD sources used in Bionic need this.
+ * Originally, this is used to embed the rcs versions of each source file
+ * in the generated binary. We certainly don't want this in Bionic.
+ */
+#define __FBSDID(s) struct __hack
+
+/*-
+ * The following definitions are an extension of the behavior originally
+ * implemented in <sys/_posix.h>, but with a different level of granularity.
+ * POSIX.1 requires that the macros we test be defined before any standard
+ * header file is included.
+ *
+ * Here's a quick run-down of the versions:
+ * defined(_POSIX_SOURCE) 1003.1-1988
+ * _POSIX_C_SOURCE == 1 1003.1-1990
+ * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option
+ * _POSIX_C_SOURCE == 199309 1003.1b-1993
+ * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995,
+ * and the omnibus ISO/IEC 9945-1: 1996
+ * _POSIX_C_SOURCE == 200112 1003.1-2001
+ * _POSIX_C_SOURCE == 200809 1003.1-2008
+ *
+ * In addition, the X/Open Portability Guide, which is now the Single UNIX
+ * Specification, defines a feature-test macro which indicates the version of
+ * that specification, and which subsumes _POSIX_C_SOURCE.
+ *
+ * Our macros begin with two underscores to avoid namespace screwage.
+ */
+
+/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
+#undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */
+#define _POSIX_C_SOURCE 199009
+#endif
+
+/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 199209
+#endif
+
+/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
+#ifdef _XOPEN_SOURCE
+#if _XOPEN_SOURCE - 0 >= 700
+#define __XSI_VISIBLE 700
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809
+#elif _XOPEN_SOURCE - 0 >= 600
+#define __XSI_VISIBLE 600
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200112
+#elif _XOPEN_SOURCE - 0 >= 500
+#define __XSI_VISIBLE 500
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 199506
+#endif
+#endif
+
+/*
+ * Deal with all versions of POSIX. The ordering relative to the tests above is
+ * important.
+ */
+#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
+#define _POSIX_C_SOURCE 198808
+#endif
+#ifdef _POSIX_C_SOURCE
+#if _POSIX_C_SOURCE >= 200809
+#define __POSIX_VISIBLE 200809
+#define __ISO_C_VISIBLE 1999
+#elif _POSIX_C_SOURCE >= 200112
+#define __POSIX_VISIBLE 200112
+#define __ISO_C_VISIBLE 1999
+#elif _POSIX_C_SOURCE >= 199506
+#define __POSIX_VISIBLE 199506
+#define __ISO_C_VISIBLE 1990
+#elif _POSIX_C_SOURCE >= 199309
+#define __POSIX_VISIBLE 199309
+#define __ISO_C_VISIBLE 1990
+#elif _POSIX_C_SOURCE >= 199209
+#define __POSIX_VISIBLE 199209
+#define __ISO_C_VISIBLE 1990
+#elif _POSIX_C_SOURCE >= 199009
+#define __POSIX_VISIBLE 199009
+#define __ISO_C_VISIBLE 1990
+#else
+#define __POSIX_VISIBLE 198808
+#define __ISO_C_VISIBLE 0
+#endif /* _POSIX_C_SOURCE */
+#else
+/*-
+ * Deal with _ANSI_SOURCE:
+ * If it is defined, and no other compilation environment is explicitly
+ * requested, then define our internal feature-test macros to zero. This
+ * makes no difference to the preprocessor (undefined symbols in preprocessing
+ * expressions are defined to have value zero), but makes it more convenient for
+ * a test program to print out the values.
+ *
+ * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
+ * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
+ * environment (and in fact we will never get here).
+ */
+#if defined(_ANSI_SOURCE) /* Hide almost everything. */
+#define __POSIX_VISIBLE 0
+#define __XSI_VISIBLE 0
+#define __BSD_VISIBLE 0
+#define __ISO_C_VISIBLE 1990
+#elif defined(_C99_SOURCE) /* Localism to specify strict C99 env. */
+#define __POSIX_VISIBLE 0
+#define __XSI_VISIBLE 0
+#define __BSD_VISIBLE 0
+#define __ISO_C_VISIBLE 1999
+#else /* Default environment: show everything. */
+#define __POSIX_VISIBLE 200809
+#define __XSI_VISIBLE 700
+#define __BSD_VISIBLE 1
+#define __ISO_C_VISIBLE 1999
+#endif
+#endif
+
+/*
+ * Default values.
+ */
+#ifndef __XPG_VISIBLE
+# define __XPG_VISIBLE 700
+#endif
+#ifndef __POSIX_VISIBLE
+# define __POSIX_VISIBLE 200809
+#endif
+#ifndef __ISO_C_VISIBLE
+# define __ISO_C_VISIBLE 1999
+#endif
+#ifndef __BSD_VISIBLE
+# define __BSD_VISIBLE 1
+#endif
+
+#define __BIONIC__ 1
+
+#endif /* !_SYS_CDEFS_H_ */
diff --git a/ndk/platforms/android-9/include/sys/linux-syscalls.h b/ndk/platforms/android-9/include/sys/linux-syscalls.h
new file mode 100644
index 0000000..9702a7a
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/linux-syscalls.h
@@ -0,0 +1,292 @@
+/* auto-generated by gensyscalls.py, do not touch */
+#ifndef _BIONIC_LINUX_SYSCALLS_H_
+
+#if !defined __ASM_ARM_UNISTD_H && !defined __ASM_I386_UNISTD_H
+#if defined __arm__ && !defined __ARM_EABI__ && !defined __thumb__
+ # define __NR_SYSCALL_BASE 0x900000
+ #else
+ # define __NR_SYSCALL_BASE 0
+ #endif
+
+#define __NR_exit (__NR_SYSCALL_BASE + 1)
+#define __NR_fork (__NR_SYSCALL_BASE + 2)
+#define __NR_clone (__NR_SYSCALL_BASE + 120)
+#define __NR_execve (__NR_SYSCALL_BASE + 11)
+#define __NR_setuid32 (__NR_SYSCALL_BASE + 213)
+#define __NR_getuid32 (__NR_SYSCALL_BASE + 199)
+#define __NR_getgid32 (__NR_SYSCALL_BASE + 200)
+#define __NR_geteuid32 (__NR_SYSCALL_BASE + 201)
+#define __NR_getegid32 (__NR_SYSCALL_BASE + 202)
+#define __NR_getresuid32 (__NR_SYSCALL_BASE + 209)
+#define __NR_getresgid32 (__NR_SYSCALL_BASE + 211)
+#define __NR_gettid (__NR_SYSCALL_BASE + 224)
+#define __NR_getgroups32 (__NR_SYSCALL_BASE + 205)
+#define __NR_getpgid (__NR_SYSCALL_BASE + 132)
+#define __NR_getppid (__NR_SYSCALL_BASE + 64)
+#define __NR_setsid (__NR_SYSCALL_BASE + 66)
+#define __NR_setgid32 (__NR_SYSCALL_BASE + 214)
+#define __NR_setreuid32 (__NR_SYSCALL_BASE + 203)
+#define __NR_setresuid32 (__NR_SYSCALL_BASE + 208)
+#define __NR_setresgid32 (__NR_SYSCALL_BASE + 210)
+#define __NR_brk (__NR_SYSCALL_BASE + 45)
+#define __NR_ptrace (__NR_SYSCALL_BASE + 26)
+#define __NR_getpriority (__NR_SYSCALL_BASE + 96)
+#define __NR_setpriority (__NR_SYSCALL_BASE + 97)
+#define __NR_setrlimit (__NR_SYSCALL_BASE + 75)
+#define __NR_ugetrlimit (__NR_SYSCALL_BASE + 191)
+#define __NR_getrusage (__NR_SYSCALL_BASE + 77)
+#define __NR_setgroups32 (__NR_SYSCALL_BASE + 206)
+#define __NR_setpgid (__NR_SYSCALL_BASE + 57)
+#define __NR_setregid32 (__NR_SYSCALL_BASE + 204)
+#define __NR_chroot (__NR_SYSCALL_BASE + 61)
+#define __NR_prctl (__NR_SYSCALL_BASE + 172)
+#define __NR_capget (__NR_SYSCALL_BASE + 184)
+#define __NR_capset (__NR_SYSCALL_BASE + 185)
+#define __NR_sigaltstack (__NR_SYSCALL_BASE + 186)
+#define __NR_acct (__NR_SYSCALL_BASE + 51)
+#define __NR_read (__NR_SYSCALL_BASE + 3)
+#define __NR_write (__NR_SYSCALL_BASE + 4)
+#define __NR_pread64 (__NR_SYSCALL_BASE + 180)
+#define __NR_pwrite64 (__NR_SYSCALL_BASE + 181)
+#define __NR_open (__NR_SYSCALL_BASE + 5)
+#define __NR_close (__NR_SYSCALL_BASE + 6)
+#define __NR_lseek (__NR_SYSCALL_BASE + 19)
+#define __NR__llseek (__NR_SYSCALL_BASE + 140)
+#define __NR_getpid (__NR_SYSCALL_BASE + 20)
+#define __NR_mmap2 (__NR_SYSCALL_BASE + 192)
+#define __NR_munmap (__NR_SYSCALL_BASE + 91)
+#define __NR_mremap (__NR_SYSCALL_BASE + 163)
+#define __NR_msync (__NR_SYSCALL_BASE + 144)
+#define __NR_mprotect (__NR_SYSCALL_BASE + 125)
+#define __NR_mlock (__NR_SYSCALL_BASE + 150)
+#define __NR_munlock (__NR_SYSCALL_BASE + 151)
+#define __NR_ioctl (__NR_SYSCALL_BASE + 54)
+#define __NR_readv (__NR_SYSCALL_BASE + 145)
+#define __NR_writev (__NR_SYSCALL_BASE + 146)
+#define __NR_fcntl (__NR_SYSCALL_BASE + 55)
+#define __NR_flock (__NR_SYSCALL_BASE + 143)
+#define __NR_fchmod (__NR_SYSCALL_BASE + 94)
+#define __NR_dup (__NR_SYSCALL_BASE + 41)
+#define __NR_pipe (__NR_SYSCALL_BASE + 42)
+#define __NR_dup2 (__NR_SYSCALL_BASE + 63)
+#define __NR__newselect (__NR_SYSCALL_BASE + 142)
+#define __NR_ftruncate (__NR_SYSCALL_BASE + 93)
+#define __NR_fsync (__NR_SYSCALL_BASE + 118)
+#define __NR_fdatasync (__NR_SYSCALL_BASE + 148)
+#define __NR_fchown32 (__NR_SYSCALL_BASE + 207)
+#define __NR_sync (__NR_SYSCALL_BASE + 36)
+#define __NR_fcntl64 (__NR_SYSCALL_BASE + 221)
+#define __NR_sendfile (__NR_SYSCALL_BASE + 187)
+#define __NR_link (__NR_SYSCALL_BASE + 9)
+#define __NR_unlink (__NR_SYSCALL_BASE + 10)
+#define __NR_chdir (__NR_SYSCALL_BASE + 12)
+#define __NR_mknod (__NR_SYSCALL_BASE + 14)
+#define __NR_chmod (__NR_SYSCALL_BASE + 15)
+#define __NR_chown32 (__NR_SYSCALL_BASE + 212)
+#define __NR_lchown32 (__NR_SYSCALL_BASE + 198)
+#define __NR_mount (__NR_SYSCALL_BASE + 21)
+#define __NR_umount2 (__NR_SYSCALL_BASE + 52)
+#define __NR_fstat64 (__NR_SYSCALL_BASE + 197)
+#define __NR_stat64 (__NR_SYSCALL_BASE + 195)
+#define __NR_lstat64 (__NR_SYSCALL_BASE + 196)
+#define __NR_mkdir (__NR_SYSCALL_BASE + 39)
+#define __NR_readlink (__NR_SYSCALL_BASE + 85)
+#define __NR_rmdir (__NR_SYSCALL_BASE + 40)
+#define __NR_rename (__NR_SYSCALL_BASE + 38)
+#define __NR_getcwd (__NR_SYSCALL_BASE + 183)
+#define __NR_access (__NR_SYSCALL_BASE + 33)
+#define __NR_symlink (__NR_SYSCALL_BASE + 83)
+#define __NR_fchdir (__NR_SYSCALL_BASE + 133)
+#define __NR_truncate (__NR_SYSCALL_BASE + 92)
+#define __NR_pause (__NR_SYSCALL_BASE + 29)
+#define __NR_gettimeofday (__NR_SYSCALL_BASE + 78)
+#define __NR_settimeofday (__NR_SYSCALL_BASE + 79)
+#define __NR_times (__NR_SYSCALL_BASE + 43)
+#define __NR_nanosleep (__NR_SYSCALL_BASE + 162)
+#define __NR_getitimer (__NR_SYSCALL_BASE + 105)
+#define __NR_setitimer (__NR_SYSCALL_BASE + 104)
+#define __NR_sigaction (__NR_SYSCALL_BASE + 67)
+#define __NR_sigprocmask (__NR_SYSCALL_BASE + 126)
+#define __NR_sigsuspend (__NR_SYSCALL_BASE + 72)
+#define __NR_rt_sigaction (__NR_SYSCALL_BASE + 174)
+#define __NR_rt_sigprocmask (__NR_SYSCALL_BASE + 175)
+#define __NR_rt_sigtimedwait (__NR_SYSCALL_BASE + 177)
+#define __NR_sigpending (__NR_SYSCALL_BASE + 73)
+#define __NR_sched_setscheduler (__NR_SYSCALL_BASE + 156)
+#define __NR_sched_getscheduler (__NR_SYSCALL_BASE + 157)
+#define __NR_sched_yield (__NR_SYSCALL_BASE + 158)
+#define __NR_sched_setparam (__NR_SYSCALL_BASE + 154)
+#define __NR_sched_getparam (__NR_SYSCALL_BASE + 155)
+#define __NR_sched_get_priority_max (__NR_SYSCALL_BASE + 159)
+#define __NR_sched_get_priority_min (__NR_SYSCALL_BASE + 160)
+#define __NR_sched_rr_get_interval (__NR_SYSCALL_BASE + 161)
+#define __NR_uname (__NR_SYSCALL_BASE + 122)
+#define __NR_wait4 (__NR_SYSCALL_BASE + 114)
+#define __NR_umask (__NR_SYSCALL_BASE + 60)
+#define __NR_reboot (__NR_SYSCALL_BASE + 88)
+#define __NR_syslog (__NR_SYSCALL_BASE + 103)
+#define __NR_init_module (__NR_SYSCALL_BASE + 128)
+#define __NR_delete_module (__NR_SYSCALL_BASE + 129)
+#define __NR_syslog (__NR_SYSCALL_BASE + 103)
+#define __NR_sysinfo (__NR_SYSCALL_BASE + 116)
+#define __NR_futex (__NR_SYSCALL_BASE + 240)
+#define __NR_poll (__NR_SYSCALL_BASE + 168)
+
+#ifdef __arm__
+#define __NR_exit_group (__NR_SYSCALL_BASE + 248)
+#define __NR_waitid (__NR_SYSCALL_BASE + 280)
+#define __NR_vfork (__NR_SYSCALL_BASE + 190)
+#define __NR_openat (__NR_SYSCALL_BASE + 322)
+#define __NR_madvise (__NR_SYSCALL_BASE + 220)
+#define __NR_mincore (__NR_SYSCALL_BASE + 219)
+#define __NR_pipe2 (__NR_SYSCALL_BASE + 359)
+#define __NR_getdents64 (__NR_SYSCALL_BASE + 217)
+#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 267)
+#define __NR_fstatat64 (__NR_SYSCALL_BASE + 327)
+#define __NR_mkdirat (__NR_SYSCALL_BASE + 323)
+#define __NR_fchownat (__NR_SYSCALL_BASE + 325)
+#define __NR_fchmodat (__NR_SYSCALL_BASE + 333)
+#define __NR_renameat (__NR_SYSCALL_BASE + 329)
+#define __NR_unlinkat (__NR_SYSCALL_BASE + 328)
+#define __NR_statfs64 (__NR_SYSCALL_BASE + 266)
+#define __NR_clock_gettime (__NR_SYSCALL_BASE + 263)
+#define __NR_clock_settime (__NR_SYSCALL_BASE + 262)
+#define __NR_clock_getres (__NR_SYSCALL_BASE + 264)
+#define __NR_clock_nanosleep (__NR_SYSCALL_BASE + 265)
+#define __NR_timer_create (__NR_SYSCALL_BASE + 257)
+#define __NR_timer_settime (__NR_SYSCALL_BASE + 258)
+#define __NR_timer_gettime (__NR_SYSCALL_BASE + 259)
+#define __NR_timer_getoverrun (__NR_SYSCALL_BASE + 260)
+#define __NR_timer_delete (__NR_SYSCALL_BASE + 261)
+#define __NR_utimes (__NR_SYSCALL_BASE + 269)
+#define __NR_socket (__NR_SYSCALL_BASE + 281)
+#define __NR_socketpair (__NR_SYSCALL_BASE + 288)
+#define __NR_bind (__NR_SYSCALL_BASE + 282)
+#define __NR_connect (__NR_SYSCALL_BASE + 283)
+#define __NR_listen (__NR_SYSCALL_BASE + 284)
+#define __NR_accept (__NR_SYSCALL_BASE + 285)
+#define __NR_getsockname (__NR_SYSCALL_BASE + 286)
+#define __NR_getpeername (__NR_SYSCALL_BASE + 287)
+#define __NR_sendto (__NR_SYSCALL_BASE + 290)
+#define __NR_recvfrom (__NR_SYSCALL_BASE + 292)
+#define __NR_shutdown (__NR_SYSCALL_BASE + 293)
+#define __NR_setsockopt (__NR_SYSCALL_BASE + 294)
+#define __NR_getsockopt (__NR_SYSCALL_BASE + 295)
+#define __NR_sendmsg (__NR_SYSCALL_BASE + 296)
+#define __NR_recvmsg (__NR_SYSCALL_BASE + 297)
+#define __NR_ioprio_set (__NR_SYSCALL_BASE + 314)
+#define __NR_ioprio_get (__NR_SYSCALL_BASE + 315)
+#define __NR_epoll_create (__NR_SYSCALL_BASE + 250)
+#define __NR_epoll_ctl (__NR_SYSCALL_BASE + 251)
+#define __NR_epoll_wait (__NR_SYSCALL_BASE + 252)
+#define __NR_inotify_init (__NR_SYSCALL_BASE + 316)
+#define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 317)
+#define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 318)
+#define __NR_eventfd2 (__NR_SYSCALL_BASE + 356)
+#define __NR_ARM_set_tls (__NR_SYSCALL_BASE + 983045)
+#define __NR_ARM_cacheflush (__NR_SYSCALL_BASE + 983042)
+#endif
+
+#ifdef __i386__
+#define __NR_exit_group (__NR_SYSCALL_BASE + 252)
+#define __NR_waitpid (__NR_SYSCALL_BASE + 7)
+#define __NR_waitid (__NR_SYSCALL_BASE + 284)
+#define __NR_kill (__NR_SYSCALL_BASE + 37)
+#define __NR_tkill (__NR_SYSCALL_BASE + 238)
+#define __NR_set_thread_area (__NR_SYSCALL_BASE + 243)
+#define __NR_openat (__NR_SYSCALL_BASE + 295)
+#define __NR_madvise (__NR_SYSCALL_BASE + 219)
+#define __NR_mincore (__NR_SYSCALL_BASE + 218)
+#define __NR_pipe2 (__NR_SYSCALL_BASE + 331)
+#define __NR_getdents64 (__NR_SYSCALL_BASE + 220)
+#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 269)
+#define __NR_fstatat64 (__NR_SYSCALL_BASE + 300)
+#define __NR_mkdirat (__NR_SYSCALL_BASE + 296)
+#define __NR_fchownat (__NR_SYSCALL_BASE + 298)
+#define __NR_fchmodat (__NR_SYSCALL_BASE + 306)
+#define __NR_renameat (__NR_SYSCALL_BASE + 302)
+#define __NR_unlinkat (__NR_SYSCALL_BASE + 301)
+#define __NR_statfs64 (__NR_SYSCALL_BASE + 268)
+#define __NR_clock_gettime (__NR_SYSCALL_BASE + 265)
+#define __NR_clock_settime (__NR_SYSCALL_BASE + 264)
+#define __NR_clock_getres (__NR_SYSCALL_BASE + 266)
+#define __NR_clock_nanosleep (__NR_SYSCALL_BASE + 267)
+#define __NR_timer_create (__NR_SYSCALL_BASE + 259)
+#define __NR_timer_settime (__NR_SYSCALL_BASE + 260)
+#define __NR_timer_gettime (__NR_SYSCALL_BASE + 261)
+#define __NR_timer_getoverrun (__NR_SYSCALL_BASE + 262)
+#define __NR_timer_delete (__NR_SYSCALL_BASE + 263)
+#define __NR_utimes (__NR_SYSCALL_BASE + 271)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_ioprio_set (__NR_SYSCALL_BASE + 289)
+#define __NR_ioprio_get (__NR_SYSCALL_BASE + 290)
+#define __NR_epoll_create (__NR_SYSCALL_BASE + 254)
+#define __NR_epoll_ctl (__NR_SYSCALL_BASE + 255)
+#define __NR_epoll_wait (__NR_SYSCALL_BASE + 256)
+#define __NR_inotify_init (__NR_SYSCALL_BASE + 291)
+#define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 292)
+#define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 293)
+#define __NR_eventfd2 (__NR_SYSCALL_BASE + 328)
+#endif
+
+#if defined(__SH3__) || defined(__SH4__)
+#define __NR_exit_group (__NR_SYSCALL_BASE + 252)
+#define __NR_waitpid (__NR_SYSCALL_BASE + 7)
+#define __NR_waitid (__NR_SYSCALL_BASE + 284)
+#define __NR_kill (__NR_SYSCALL_BASE + 37)
+#define __NR_tkill (__NR_SYSCALL_BASE + 238)
+#define __NR_set_thread_area (__NR_SYSCALL_BASE + 243)
+#define __NR_vfork (__NR_SYSCALL_BASE + 190)
+#define __NR_openat (__NR_SYSCALL_BASE + 295)
+#define __NR_madvise (__NR_SYSCALL_BASE + 219)
+#define __NR_mincore (__NR_SYSCALL_BASE + 218)
+#define __NR_pipe2 (__NR_SYSCALL_BASE + 331)
+#define __NR_getdents64 (__NR_SYSCALL_BASE + 220)
+#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 269)
+#define __NR_fstatat64 (__NR_SYSCALL_BASE + 300)
+#define __NR_mkdirat (__NR_SYSCALL_BASE + 296)
+#define __NR_fchownat (__NR_SYSCALL_BASE + 298)
+#define __NR_fchmodat (__NR_SYSCALL_BASE + 306)
+#define __NR_renameat (__NR_SYSCALL_BASE + 302)
+#define __NR_unlinkat (__NR_SYSCALL_BASE + 301)
+#define __NR_statfs64 (__NR_SYSCALL_BASE + 268)
+#define __NR_clock_gettime (__NR_SYSCALL_BASE + 265)
+#define __NR_clock_settime (__NR_SYSCALL_BASE + 264)
+#define __NR_clock_getres (__NR_SYSCALL_BASE + 266)
+#define __NR_clock_nanosleep (__NR_SYSCALL_BASE + 267)
+#define __NR_timer_create (__NR_SYSCALL_BASE + 259)
+#define __NR_timer_settime (__NR_SYSCALL_BASE + 260)
+#define __NR_timer_gettime (__NR_SYSCALL_BASE + 261)
+#define __NR_timer_getoverrun (__NR_SYSCALL_BASE + 262)
+#define __NR_timer_delete (__NR_SYSCALL_BASE + 263)
+#define __NR_utimes (__NR_SYSCALL_BASE + 271)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR___socketcall (__NR_SYSCALL_BASE + 102)
+#define __NR_ioprio_set (__NR_SYSCALL_BASE + 288)
+#define __NR_ioprio_get (__NR_SYSCALL_BASE + 289)
+#define __NR_epoll_create (__NR_SYSCALL_BASE + 254)
+#define __NR_epoll_ctl (__NR_SYSCALL_BASE + 255)
+#define __NR_epoll_wait (__NR_SYSCALL_BASE + 256)
+#define __NR_inotify_init (__NR_SYSCALL_BASE + 290)
+#define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 291)
+#define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 292)
+#define __NR_eventfd2 (__NR_SYSCALL_BASE + 328)
+#endif
+
+#endif
+
+#endif /* _BIONIC_LINUX_SYSCALLS_H_ */
diff --git a/ndk/platforms/android-9/include/sys/linux-unistd.h b/ndk/platforms/android-9/include/sys/linux-unistd.h
new file mode 100644
index 0000000..23853da
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/linux-unistd.h
@@ -0,0 +1,212 @@
+/* auto-generated by gensyscalls.py, do not touch */
+#ifndef _BIONIC_LINUX_UNISTD_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void _exit (int);
+void _exit_thread (int);
+pid_t __fork (void);
+pid_t _waitpid (pid_t, int*, int, struct rusage*);
+int __waitid (int, pid_t, struct siginfo_t*, int,void*);
+pid_t __sys_clone (int, void*, int*, void*, int*);
+int execve (const char*, char* const*, char* const*);
+int __setuid (uid_t);
+uid_t getuid (void);
+gid_t getgid (void);
+uid_t geteuid (void);
+gid_t getegid (void);
+uid_t getresuid (void);
+gid_t getresgid (void);
+pid_t gettid (void);
+int getgroups (int, gid_t *);
+pid_t getpgid (pid_t);
+pid_t getppid (void);
+pid_t setsid (void);
+int setgid (gid_t);
+int seteuid (uid_t);
+int __setreuid (uid_t, uid_t);
+int __setresuid (uid_t, uid_t, uid_t);
+int setresgid (gid_t, gid_t, gid_t);
+void* __brk (void*);
+int kill (pid_t, int);
+int tkill (pid_t tid, int sig);
+int __ptrace (int request, int pid, void* addr, void* data);
+int __set_thread_area (void* user_desc);
+int __getpriority (int, int);
+int setpriority (int, int, int);
+int setrlimit (int resource, const struct rlimit *rlp);
+int getrlimit (int resource, struct rlimit *rlp);
+int getrusage (int who, struct rusage* r_usage);
+int setgroups (int, const gid_t *);
+pid_t getpgrp (void);
+int setpgid (pid_t, pid_t);
+pid_t vfork (void);
+int setregid (gid_t, gid_t);
+int chroot (const char *);
+int prctl (int option, unsigned int arg2, unsigned int arg3, unsigned int arg4, unsigned int arg5);
+int capget (cap_user_header_t header, cap_user_data_t data);
+int capset (cap_user_header_t header, const cap_user_data_t data);
+int sigaltstack (const stack_t*, stack_t*);
+int acct (const char* filepath);
+ssize_t read (int, void*, size_t);
+ssize_t write (int, const void*, size_t);
+ssize_t __pread64 (int, void *, size_t, off_t, off_t);
+ssize_t __pwrite64 (int, void *, size_t, off_t, off_t);
+int __open (const char*, int, mode_t);
+int __openat (int, const char*, int, mode_t);
+int close (int);
+int creat (const char*, mode_t);
+off_t lseek (int, off_t, int);
+int __llseek (int, unsigned long, unsigned long, loff_t*, int);
+pid_t getpid (void);
+void * mmap (void *, size_t, int, int, int, long);
+void * __mmap2 (void*, size_t, int, int, int, long);
+int munmap (void *, size_t);
+void * mremap (void *, size_t, size_t, unsigned long);
+int msync (const void *, size_t, int);
+int mprotect (const void *, size_t, int);
+int madvise (const void *, size_t, int);
+int mlock (const void *addr, size_t len);
+int munlock (const void *addr, size_t len);
+int mincore (void* start, size_t length, unsigned char* vec);
+int __ioctl (int, int, void *);
+int readv (int, const struct iovec *, int);
+int writev (int, const struct iovec *, int);
+int __fcntl (int, int, void*);
+int flock (int, int);
+int fchmod (int, mode_t);
+int dup (int);
+int pipe (int *);
+int pipe2 (int *, int);
+int dup2 (int, int);
+int select (int, struct fd_set *, struct fd_set *, struct fd_set *, struct timeval *);
+int ftruncate (int, off_t);
+int getdents (unsigned int, struct dirent *, unsigned int);
+int fsync (int);
+int fdatasync (int);
+int fchown (int, uid_t, gid_t);
+void sync (void);
+int __fcntl64 (int, int, void *);
+int __fstatfs64 (int, size_t, struct statfs *);
+ssize_t sendfile (int out_fd, int in_fd, off_t *offset, size_t count);
+int fstatat (int dirfd, const char *path, struct stat *buf, int flags);
+int mkdirat (int dirfd, const char *pathname, mode_t mode);
+int fchownat (int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+int fchmodat (int dirfd, const char *path, mode_t mode, int flags);
+int renameat (int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+int link (const char*, const char*);
+int unlink (const char*);
+int unlinkat (int, const char *, int);
+int chdir (const char*);
+int mknod (const char*, mode_t, dev_t);
+int chmod (const char*,mode_t);
+int chown (const char *, uid_t, gid_t);
+int lchown (const char*, uid_t, gid_t);
+int mount (const char*, const char*, const char*, unsigned long, const void*);
+int umount (const char*);
+int umount2 (const char*, int);
+int fstat (int, struct stat*);
+int stat (const char *, struct stat *);
+int lstat (const char *, struct stat *);
+int mkdir (const char *, mode_t);
+int readlink (const char *, char *, size_t);
+int rmdir (const char *);
+int rename (const char *, const char *);
+int __getcwd (char * buf, size_t size);
+int access (const char *, int);
+int symlink (const char *, const char *);
+int fchdir (int);
+int truncate (const char*, off_t);
+int __statfs64 (const char *, size_t, struct statfs *);
+int pause (void);
+int gettimeofday (struct timeval*, struct timezone*);
+int settimeofday (const struct timeval*, const struct timezone*);
+clock_t times (struct tms *);
+int nanosleep (const struct timespec *, struct timespec *);
+int clock_gettime (clockid_t clk_id, struct timespec *tp);
+int clock_settime (clockid_t clk_id, const struct timespec *tp);
+int clock_getres (clockid_t clk_id, struct timespec *res);
+int clock_nanosleep (const struct timespec *req, struct timespec *rem);
+int getitimer (int, const struct itimerval *);
+int setitimer (int, const struct itimerval *, struct itimerval *);
+int __timer_create (clockid_t clockid, struct sigevent *evp, timer_t *timerid);
+int __timer_settime (timer_t, int, const struct itimerspec*, struct itimerspec*);
+int __timer_gettime (timer_t, struct itimerspec*);
+int __timer_getoverrun (timer_t);
+int __timer_delete (timer_t);
+int utimes (const char*, const struct timeval tvp[2]);
+int sigaction (int, const struct sigaction *, struct sigaction *);
+int sigprocmask (int, const sigset_t *, sigset_t *);
+int __sigsuspend (int unused1, int unused2, unsigned mask);
+int __rt_sigaction (int sig, const struct sigaction *act, struct sigaction *oact, size_t sigsetsize);
+int __rt_sigprocmask (int how, const sigset_t *set, sigset_t *oset, size_t sigsetsize);
+int __rt_sigtimedwait (const sigset_t *set, struct siginfo_t *info, struct timespec_t *timeout, size_t sigset_size);
+int sigpending (sigset_t *);
+int socket (int, int, int);
+int socketpair (int, int, int, int*);
+int bind (int, struct sockaddr *, int);
+int connect (int, struct sockaddr *, socklen_t);
+int listen (int, int);
+int accept (int, struct sockaddr *, socklen_t *);
+int getsockname (int, struct sockaddr *, socklen_t *);
+int getpeername (int, struct sockaddr *, socklen_t *);
+int sendto (int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+int recvfrom (int, void *, size_t, unsigned int, struct sockaddr *, socklen_t *);
+int shutdown (int, int);
+int setsockopt (int, int, int, const void *, socklen_t);
+int getsockopt (int, int, int, void *, socklen_t *);
+int sendmsg (int, const struct msghdr *, unsigned int);
+int recvmsg (int, struct msghdr *, unsigned int);
+int socket (int, int, int);
+int bind (int, struct sockaddr *, int);
+int connect (int, struct sockaddr *, socklen_t);
+int listen (int, int);
+int accept (int, struct sockaddr *, socklen_t *);
+int getsockname (int, struct sockaddr *, socklen_t *);
+int getpeername (int, struct sockaddr *, socklen_t *);
+int socketpair (int, int, int, int*);
+int sendto (int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+int recvfrom (int, void *, size_t, unsigned int, struct sockaddr *, socklen_t *);
+int shutdown (int, int);
+int setsockopt (int, int, int, const void *, socklen_t);
+int getsockopt (int, int, int, void *, socklen_t *);
+int sendmsg (int, const struct msghdr *, unsigned int);
+int recvmsg (int, struct msghdr *, unsigned int);
+int __socketcall (int, unsigned long*);
+int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param);
+int sched_getscheduler (pid_t pid);
+int sched_yield (void);
+int sched_setparam (pid_t pid, const struct sched_param *param);
+int sched_getparam (pid_t pid, struct sched_param *param);
+int sched_get_priority_max (int policy);
+int sched_get_priority_min (int policy);
+int sched_rr_get_interval (pid_t pid, struct timespec *interval);
+int ioprio_set (int which, int who, int ioprio);
+int ioprio_get (int which, int who);
+int uname (struct utsname *);
+pid_t __wait4 (pid_t pid, int *status, int options, struct rusage *rusage);
+mode_t umask (mode_t);
+int __reboot (int, int, int, void *);
+int __syslog (int, char *, int);
+int init_module (void *, unsigned long, const char *);
+int delete_module (const char*, unsigned int);
+int klogctl (int, char *, int);
+int sysinfo (struct sysinfo *);
+int futex (void *, int, int, void *, void *, int);
+int epoll_create (int size);
+int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event);
+int epoll_wait (int epfd, struct epoll_event *events, int max, int timeout);
+int inotify_init (void);
+int inotify_add_watch (int, const char *, unsigned int);
+int inotify_rm_watch (int, unsigned int);
+int poll (struct pollfd *, unsigned int, long);
+int eventfd (unsigned int, int);
+int __set_tls (void*);
+int cacheflush (long start, long end, long flags);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BIONIC_LINUX_UNISTD_H_ */
diff --git a/ndk/platforms/android-9/include/sys/sysinfo.h b/ndk/platforms/android-9/include/sys/sysinfo.h
new file mode 100644
index 0000000..c7e46e6
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/sysinfo.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_SYSINFO_H_
+#define _SYS_SYSINFO_H_
+
+#include <sys/cdefs.h>
+#include <linux/kernel.h>
+
+__BEGIN_DECLS
+
+extern int sysinfo (struct sysinfo *info);
+
+__END_DECLS
+
+#endif /* _SYS_SYSINFO_H_ */
diff --git a/ndk/platforms/android-9/include/sys/wait.h b/ndk/platforms/android-9/include/sys/wait.h
new file mode 100644
index 0000000..b30b7ec
--- /dev/null
+++ b/ndk/platforms/android-9/include/sys/wait.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_WAIT_H_
+#define _SYS_WAIT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <linux/wait.h>
+#include <signal.h>
+
+__BEGIN_DECLS
+
+#define WEXITSTATUS(s) (((s) & 0xff00) >> 8)
+#define WCOREDUMP(s) ((s) & 0x80)
+#define WTERMSIG(s) ((s) & 0x7f)
+#define WSTOPSIG(s) WEXITSTATUS(s)
+
+#define WIFEXITED(s) (WTERMSIG(s) == 0)
+#define WIFSTOPPED(s) (WTERMSIG(s) == 0x7f)
+#define WIFSIGNALED(s) (WTERMSIG((s)+1) >= 2)
+
+extern pid_t wait(int *);
+extern pid_t waitpid(pid_t, int *, int);
+extern pid_t wait3(int *, int, struct rusage *);
+extern pid_t wait4(pid_t, int *, int, struct rusage *);
+
+/* Posix states that idtype_t should be an enumeration type, but
+ * the kernel headers define P_ALL, P_PID and P_PGID as constant macros
+ * instead.
+ */
+typedef int idtype_t;
+
+extern int waitid(idtype_t which, id_t id, siginfo_t *info, int options);
+
+__END_DECLS
+
+#endif /* _SYS_WAIT_H_ */
diff --git a/ndk/platforms/android-9/include/unistd.h b/ndk/platforms/android-9/include/unistd.h
new file mode 100644
index 0000000..29154a2
--- /dev/null
+++ b/ndk/platforms/android-9/include/unistd.h
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _UNISTD_H_
+#define _UNISTD_H_
+
+#include <stddef.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <sys/sysconf.h>
+#include <linux/capability.h>
+#include <pathconf.h>
+
+__BEGIN_DECLS
+
+/* Standard file descriptor numbers. */
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STDERR_FILENO 2
+
+/* Values for whence in fseek and lseek */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+extern char **environ;
+extern __noreturn void _exit(int);
+
+extern pid_t fork(void);
+extern pid_t vfork(void);
+extern pid_t getpid(void);
+extern pid_t gettid(void);
+extern pid_t getpgid(pid_t);
+extern int setpgid(pid_t, pid_t);
+extern pid_t getppid(void);
+extern pid_t getpgrp(void);
+extern int setpgrp(void);
+extern pid_t setsid(void);
+
+extern int execv(const char *, char * const *);
+extern int execvp(const char *, char * const *);
+extern int execve(const char *, char * const *, char * const *);
+extern int execl(const char *, const char *, ...);
+extern int execlp(const char *, const char *, ...);
+extern int execle(const char *, const char *, ...);
+extern int capget(cap_user_header_t hdrp, cap_user_data_t datap);
+extern int capset(cap_user_header_t hdrp, const cap_user_data_t datap);
+extern int prctl(int option, unsigned long arg2, unsigned long arg3,
+ unsigned long arg4, unsigned long arg5);
+
+extern int nice(int);
+
+extern int setuid(uid_t);
+extern uid_t getuid(void);
+extern int seteuid(uid_t);
+extern uid_t geteuid(void);
+extern int setgid(gid_t);
+extern gid_t getgid(void);
+extern int setegid(gid_t);
+extern gid_t getegid(void);
+extern int getgroups(int, gid_t *);
+extern int setgroups(size_t, const gid_t *);
+extern int setreuid(uid_t, uid_t);
+extern int setregid(gid_t, gid_t);
+extern int setresuid(uid_t, uid_t, uid_t);
+extern int setresgid(gid_t, gid_t, gid_t);
+extern int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
+extern int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
+extern int issetugid(void);
+extern char* getlogin(void);
+extern char* getusershell(void);
+extern void setusershell(void);
+extern void endusershell(void);
+
+
+
+/* Macros for access() */
+#define R_OK 4 /* Read */
+#define W_OK 2 /* Write */
+#define X_OK 1 /* Execute */
+#define F_OK 0 /* Existence */
+
+extern int access(const char *, int);
+extern int link(const char *, const char *);
+extern int unlink(const char *);
+extern int chdir(const char *);
+extern int fchdir(int);
+extern int rmdir(const char *);
+extern int pipe(int *);
+#ifdef _GNU_SOURCE /* GLibc compatibility */
+extern int pipe2(int *, int);
+#endif
+extern int chroot(const char *);
+extern int symlink(const char *, const char *);
+extern int readlink(const char *, char *, size_t);
+extern int chown(const char *, uid_t, gid_t);
+extern int fchown(int, uid_t, gid_t);
+extern int lchown(const char *, uid_t, gid_t);
+extern int truncate(const char *, off_t);
+extern char *getcwd(char *, size_t);
+
+extern int sync(void);
+
+extern int close(int);
+extern off_t lseek(int, off_t, int);
+extern loff_t lseek64(int, loff_t, int);
+
+extern ssize_t read(int, void *, size_t);
+extern ssize_t write(int, const void *, size_t);
+extern ssize_t pread(int, void *, size_t, off_t);
+extern ssize_t pwrite(int, void *, size_t, off_t);
+
+extern int dup(int);
+extern int dup2(int, int);
+extern int fcntl(int, int, ...);
+extern int ioctl(int, int, ...);
+extern int flock(int, int);
+extern int fsync(int);
+extern int fdatasync(int);
+extern int ftruncate(int, off_t);
+
+extern int pause(void);
+extern unsigned int alarm(unsigned int);
+extern unsigned int sleep(unsigned int);
+extern int usleep(unsigned long);
+
+extern int gethostname(char *, size_t);
+
+extern int getdtablesize(void);
+
+extern void *__brk(void *);
+extern int brk(void *);
+extern void *sbrk(ptrdiff_t);
+
+extern int getopt(int, char * const *, const char *);
+extern char *optarg;
+extern int optind, opterr, optopt;
+
+extern int isatty(int);
+extern char* ttyname(int);
+extern int ttyname_r(int, char*, size_t);
+
+extern int acct(const char* filepath);
+
+static __inline__ int getpagesize(void) {
+ extern unsigned int __page_size;
+ return __page_size;
+}
+static __inline__ int __getpageshift(void) {
+ extern unsigned int __page_shift;
+ return __page_shift;
+}
+
+extern int sysconf(int name);
+
+extern int daemon(int, int);
+
+/* A special syscall that is only available on the ARM, not x86 function. */
+extern int cacheflush(long start, long end, long flags);
+
+extern pid_t tcgetpgrp(int fd);
+extern int tcsetpgrp(int fd, pid_t _pid);
+
+#if 0 /* MISSING FROM BIONIC */
+extern pid_t getsid(pid_t);
+extern int execvpe(const char *, char * const *, char * const *);
+extern int execlpe(const char *, const char *, ...);
+extern int getfsuid(uid_t);
+extern int setfsuid(uid_t);
+extern int getlogin_r(char* name, size_t namesize);
+extern int sethostname(const char *, size_t);
+extern int getdomainname(char *, size_t);
+extern int setdomainname(const char *, size_t);
+#endif /* MISSING */
+
+/* Used to retry syscalls that can return EINTR. */
+#define TEMP_FAILURE_RETRY(exp) ({ \
+ typeof (exp) _rc; \
+ do { \
+ _rc = (exp); \
+ } while (_rc == -1 && errno == EINTR); \
+ _rc; })
+
+__END_DECLS
+
+#endif /* _UNISTD_H_ */
diff --git a/ndk/platforms/android-9/include/wchar.h b/ndk/platforms/android-9/include/wchar.h
new file mode 100644
index 0000000..9b744a5
--- /dev/null
+++ b/ndk/platforms/android-9/include/wchar.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _WCHAR_H_
+#define _WCHAR_H_
+
+#include <sys/cdefs.h>
+#include <stdio.h>
+
+/* wchar_t is required in stdlib.h according to POSIX */
+#define __need___wchar_t
+#include <stddef.h>
+
+#include <stdarg.h>
+#include <time.h>
+#include <malloc.h>
+
+#include <stddef.h>
+
+/* IMPORTANT: Any code that relies on wide character support is essentially
+ * non-portable and/or broken. the only reason this header exist
+ * is because I'm really a nice guy. However, I'm not nice enough
+ * to provide you with a real implementation. instead wchar_t == char
+ * and all wc functions are stubs to their "normal" equivalent...
+ */
+
+__BEGIN_DECLS
+
+typedef int wint_t;
+typedef struct { int dummy; } mbstate_t;
+
+typedef enum {
+ WC_TYPE_INVALID = 0,
+ WC_TYPE_ALNUM,
+ WC_TYPE_ALPHA,
+ WC_TYPE_BLANK,
+ WC_TYPE_CNTRL,
+ WC_TYPE_DIGIT,
+ WC_TYPE_GRAPH,
+ WC_TYPE_LOWER,
+ WC_TYPE_PRINT,
+ WC_TYPE_PUNCT,
+ WC_TYPE_SPACE,
+ WC_TYPE_UPPER,
+ WC_TYPE_XDIGIT,
+ WC_TYPE_MAX
+} wctype_t;
+
+#define WCHAR_MAX INT_MAX
+#define WCHAR_MIN INT_MIN
+#define WEOF ((wint_t)(-1))
+
+extern wint_t btowc(int);
+extern int fwprintf(FILE *, const wchar_t *, ...);
+extern int fwscanf(FILE *, const wchar_t *, ...);
+extern int iswalnum(wint_t);
+extern int iswalpha(wint_t);
+extern int iswcntrl(wint_t);
+extern int iswdigit(wint_t);
+extern int iswgraph(wint_t);
+extern int iswlower(wint_t);
+extern int iswprint(wint_t);
+extern int iswpunct(wint_t);
+extern int iswspace(wint_t);
+extern int iswupper(wint_t);
+extern int iswxdigit(wint_t);
+extern int iswctype(wint_t, wctype_t);
+extern wint_t fgetwc(FILE *);
+extern wchar_t *fgetws(wchar_t *, int, FILE *);
+extern wint_t fputwc(wchar_t, FILE *);
+extern int fputws(const wchar_t *, FILE *);
+extern int fwide(FILE *, int);
+extern wint_t getwc(FILE *);
+extern wint_t getwchar(void);
+extern int mbsinit(const mbstate_t *);
+extern size_t mbrlen(const char *, size_t, mbstate_t *);
+extern size_t mbrtowc(wchar_t *, const char *, size_t, mbstate_t *);
+extern size_t mbsrtowcs(wchar_t *, const char **, size_t, mbstate_t *);
+extern size_t mbstowcs(wchar_t *, const char *, size_t);
+extern wint_t putwc(wchar_t, FILE *);
+extern wint_t putwchar(wchar_t);
+extern int swprintf(wchar_t *, size_t, const wchar_t *, ...);
+extern int swscanf(const wchar_t *, const wchar_t *, ...);
+extern wint_t towlower(wint_t);
+extern wint_t towupper(wint_t);
+extern wint_t ungetwc(wint_t, FILE *);
+extern int vfwprintf(FILE *, const wchar_t *, va_list);
+extern int vwprintf(const wchar_t *, va_list);
+extern int vswprintf(wchar_t *, size_t, const wchar_t *, va_list);
+extern size_t wcrtomb(char *, wchar_t, mbstate_t *);
+extern wchar_t *wcscat(wchar_t *, const wchar_t *);
+extern wchar_t *wcschr(const wchar_t *, wchar_t);
+extern int wcscmp(const wchar_t *, const wchar_t *);
+extern int wcscoll(const wchar_t *, const wchar_t *);
+extern wchar_t *wcscpy(wchar_t *, const wchar_t *);
+extern size_t wcscspn(const wchar_t *, const wchar_t *);
+extern size_t wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *);
+extern size_t wcslen(const wchar_t *);
+extern wchar_t *wcsncat(wchar_t *, const wchar_t *, size_t);
+extern int wcsncmp(const wchar_t *, const wchar_t *, size_t);
+extern wchar_t *wcsncpy(wchar_t *, const wchar_t *, size_t);
+extern wchar_t *wcspbrk(const wchar_t *, const wchar_t *);
+extern wchar_t *wcsrchr(const wchar_t *, wchar_t);
+extern size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
+extern size_t wcsspn(const wchar_t *, const wchar_t *);
+extern wchar_t *wcsstr(const wchar_t *, const wchar_t *);
+extern double wcstod(const wchar_t *, wchar_t **);
+extern wchar_t *wcstok(wchar_t *, const wchar_t *, wchar_t **);
+extern long int wcstol(const wchar_t *, wchar_t **, int);
+extern size_t wcstombs(char *, const wchar_t *, size_t);
+extern unsigned long int wcstoul(const wchar_t *, wchar_t **, int);
+extern wchar_t *wcswcs(const wchar_t *, const wchar_t *);
+extern int wcswidth(const wchar_t *, size_t);
+extern size_t wcsxfrm(wchar_t *, const wchar_t *, size_t);
+extern int wctob(wint_t);
+extern wctype_t wctype(const char *);
+extern int wcwidth(wchar_t);
+extern wchar_t *wmemchr(const wchar_t *, wchar_t, size_t);
+extern int wmemcmp(const wchar_t *, const wchar_t *, size_t);
+extern wchar_t *wmemcpy(wchar_t *, const wchar_t *, size_t);
+extern wchar_t *wmemmove(wchar_t *, const wchar_t *, size_t);
+extern wchar_t *wmemset(wchar_t *, wchar_t, size_t);
+extern int wprintf(const wchar_t *, ...);
+extern int wscanf(const wchar_t *, ...);
+
+/* No really supported. These are just for making libstdc++-v3 happy. */
+typedef void *wctrans_t;
+extern wint_t towctrans(wint_t, wctrans_t);
+extern wctrans_t wctrans (const char *);
+
+__END_DECLS
+
+#endif /* _WCHAR_H_ */
diff --git a/ndk/platforms/android-9/samples/native-audio/AndroidManifest.xml b/ndk/platforms/android-9/samples/native-audio/AndroidManifest.xml
new file mode 100644
index 0000000..5eebb52
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.nativeaudio"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <application android:icon="@drawable/icon" android:label="@string/app_name">
+ <activity android:name=".NativeAudio"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+ <uses-sdk android:minSdkVersion="9" />
+
+ <!-- RECORD_AUDIO is needed to create an audio recorder -->
+ <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
+
+ <!-- MODIFY_AUDIO_SETTINGS is needed to use audio effects such as environmental reverb -->
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
+
+ <!-- INTERNET is needed to use a URI-based audio player, depending on the URI -->
+ <uses-permission android:name="android.permission.INTERNET"></uses-permission>
+
+</manifest>
diff --git a/ndk/platforms/android-9/samples/native-audio/assets/README.txt b/ndk/platforms/android-9/samples/native-audio/assets/README.txt
new file mode 100644
index 0000000..3ce4076
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/assets/README.txt
@@ -0,0 +1,4 @@
+File background.mp3 ("Background for talking but don't") is
+copyright 2008 by Glenn Kasten and is licensed under a
+Creative Commons Attribution 3.0 Unported License:
+ http://creativecommons.org/licenses/by/3.0/
diff --git a/ndk/platforms/android-9/samples/native-audio/assets/background.mp3 b/ndk/platforms/android-9/samples/native-audio/assets/background.mp3
new file mode 100644
index 0000000..88e447d
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/assets/background.mp3
Binary files differ
diff --git a/ndk/platforms/android-9/samples/native-audio/default.properties b/ndk/platforms/android-9/samples/native-audio/default.properties
new file mode 100644
index 0000000..eada70a
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/default.properties
@@ -0,0 +1,13 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-9
+# Indicates whether an apk should be generated for each density.
+split.density=false
diff --git a/ndk/platforms/android-9/samples/native-audio/jni/Android.mk b/ndk/platforms/android-9/samples/native-audio/jni/Android.mk
new file mode 100644
index 0000000..63c8210
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/jni/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2010 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := native-audio-jni
+LOCAL_SRC_FILES := native-audio-jni.c
+# for native audio
+LOCAL_LDLIBS += -lOpenSLES
+# for logging
+LOCAL_LDLIBS += -llog
+# for native asset manager
+LOCAL_LDLIBS += -landroid
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/ndk/platforms/android-9/samples/native-audio/jni/android_clip.h b/ndk/platforms/android-9/samples/native-audio/jni/android_clip.h
new file mode 100644
index 0000000..8d168ac
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/jni/android_clip.h
@@ -0,0 +1,811 @@
+ "\xfe\xff\xfc\xff\xfb\xff\xfc\xff\xfb\xff\xff\xff\xff\xff\xfe\xff"
+ "\x00\x00\xfe\xff\xfe\xff\x01\x00\x02\x00\x02\x00\x05\x00\x04\x00"
+ "\x02\x00\x04\x00\x05\x00\xff\xff\x01\x00\xff\xff\xfc\xff\xfe\xff"
+ "\xff\xff\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00"
+ "\xff\xff\xfc\xff\xf9\xff\xfa\xff\xf8\xff\xfc\xff\xfe\xff\xfe\xff"
+ "\xfd\xff\xfc\xff\x01\x00\xff\xff\xff\xff\x02\x00\x04\x00\x04\x00"
+ "\x07\x00\x06\x00\x04\x00\x05\x00\x04\x00\x05\x00\x03\x00\x03\x00"
+ "\x02\x00\x04\x00\x04\x00\x03\x00\x05\x00\x04\x00\x04\x00\x05\x00"
+ "\x03\x00\x01\x00\x02\x00\x03\x00\x04\x00\x00\x00\xfc\xff\xfe\xff"
+ "\xfe\xff\xfc\xff\xfb\xff\xfc\xff\xf8\xff\xf8\xff\xfa\xff\xf8\xff"
+ "\xf8\xff\xf7\xff\xf7\xff\xf5\xff\xf8\xff\xfb\xff\xfc\xff\x00\x00"
+ "\xfd\xff\x00\x00\x05\x00\x03\x00\x02\x00\x05\x00\x08\x00\x04\x00"
+ "\x03\x00\x04\x00\x03\x00\x02\x00\x00\x00\xff\xff\x02\x00\x03\x00"
+ "\x03\x00\x02\x00\x02\x00\x04\x00\x04\x00\x03\x00\x02\x00\x02\x00"
+ "\x04\x00\x03\x00\xfe\xff\xfd\xff\xfd\xff\xfc\xff\xfa\xff\xfc\xff"
+ "\xff\xff\xfe\xff\xfd\xff\xfd\xff\xfd\xff\xfe\xff\xfb\xff\xfd\xff"
+ "\xfd\xff\xfd\xff\x01\x00\x01\x00\x00\x00\xfd\xff\x00\x00\x00\x00"
+ "\xfe\xff\x00\x00\x01\x00\x03\x00\x04\x00\x04\x00\x03\x00\x00\x00"
+ "\x02\x00\x05\x00\x01\x00\x00\x00\x04\x00\x04\x00\x00\x00\xff\xff"
+ "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x01\x00\xff\xff"
+ "\xfe\xff\x01\x00\x01\x00\x01\x00\x02\x00\x05\x00\x04\x00\x05\x00"
+ "\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\xfc\xff\x01\x00\x00\x00"
+ "\xfe\xff\x00\x00\x01\x00\xfe\xff\xfe\xff\xff\xff\xff\xff\x02\x00"
+ "\x02\x00\xff\xff\x00\x00\x04\x00\x02\x00\x02\x00\x02\x00\x03\x00"
+ "\x02\x00\x02\x00\x00\x00\xfc\xff\x00\x00\x02\x00\x02\x00\x00\x00"
+ "\x00\x00\x02\x00\x00\x00\xfe\xff\xff\xff\xfc\xff\xfd\xff\xfb\xff"
+ "\xfa\xff\xfa\xff\xf9\xff\xf9\xff\xfa\xff\xf9\xff\xf9\xff\xfd\xff"
+ "\xff\xff\xfd\xff\xfc\xff\x00\x00\xfe\xff\xff\xff\x02\x00\x03\x00"
+ "\x06\x00\x06\x00\x07\x00\x04\x00\x05\x00\x05\x00\x05\x00\x07\x00"
+ "\x07\x00\x06\x00\x06\x00\x07\x00\x05\x00\x03\x00\x01\x00\x02\x00"
+ "\xfe\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\xfd\xff\xfc\xff\xfc\xff"
+ "\xfb\xff\xfa\xff\xfa\xff\xfa\xff\xf9\xff\xfc\xff\xfa\xff\xfb\xff"
+ "\xfc\xff\xfc\xff\xfc\xff\xfc\xff\xfd\xff\xff\xff\x00\x00\x00\x00"
+ "\x03\x00\x03\x00\x04\x00\x04\x00\x06\x00\x04\x00\x02\x00\x03\x00"
+ "\xff\xff\x00\x00\x02\x00\xff\xff\x02\x00\x00\x00\xfe\xff\x00\x00"
+ "\x00\x00\x01\x00\xff\xff\x00\x00\x02\x00\x02\x00\x02\x00\x01\x00"
+ "\x01\x00\x01\x00\xfe\xff\xfe\xff\xfe\xff\xfe\xff\xff\xff\xff\xff"
+ "\xfe\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
+ "\x02\x00\x04\x00\x03\x00\x04\x00\x06\x00\x02\x00\x00\x00\x02\x00"
+ "\x04\x00\x02\x00\x00\x00\x03\x00\x04\x00\x05\x00\x03\x00\x03\x00"
+ "\x03\x00\x00\x00\x00\x00\x01\x00\xff\xff\xfe\xff\xff\xff\xfe\xff"
+ "\xfd\xff\xfb\xff\xfc\xff\xfa\xff\xfb\xff\xfb\xff\xfd\xff\xfd\xff"
+ "\xfc\xff\xfc\xff\xfb\xff\xfb\xff\xfd\xff\xfe\xff\xff\xff\x00\x00"
+ "\xff\xff\x01\x00\x03\x00\x02\x00\x03\x00\x07\x00\x07\x00\x06\x00"
+ "\x05\x00\x09\x00\x07\x00\x04\x00\x06\x00\x05\x00\x01\x00\x03\x00"
+ "\x01\x00\x02\x00\x02\x00\x00\x00\xfe\xff\xfd\xff\xf9\xff\xf8\xff"
+ "\xf8\xff\xf6\xff\xf9\xff\xf7\xff\xf8\xff\xf7\xff\xfc\xff\xfc\xff"
+ "\xfc\xff\xff\xff\x02\x00\x01\x00\x02\x00\x04\x00\x06\x00\x06\x00"
+ "\x04\x00\x04\x00\x04\x00\x05\x00\x02\x00\x02\x00\x02\x00\x02\x00"
+ "\x00\x00\xff\xff\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\xfd\xff"
+ "\xfc\xff\xfe\xff\xfe\xff\xfc\xff\xfc\xff\xff\xff\xfd\xff\xfc\xff"
+ "\xfe\xff\x02\x00\x01\x00\x05\x00\x03\x00\x07\x00\x03\x00\x05\x00"
+ "\x04\x00\xfb\xff\xf8\xff\xfb\xff\xfe\xff\xee\xff\xee\xff\xfd\xff"
+ "\xf1\xff\x02\x00\xfb\xff\xcd\xff\xed\xff\x17\x00\xa6\xff\xfc\xfe"
+ "\x39\x00\xd7\xff\xa9\xfe\x92\xff\x87\x00\xf3\xff\x55\xff\xe3\x00"
+ "\x44\x01\x66\x00\x81\x00\x4b\x01\x24\x01\x60\x00\x8f\x00\xca\x00"
+ "\x9b\x00\x6d\x00\x47\x00\x86\x00\x99\x00\x6b\x00\xbb\xff\x8a\x00"
+ "\x32\x00\x5a\x00\xe0\xff\x27\x00\x61\x01\x6c\x00\xcc\xff\xb2\xff"
+ "\xe9\xff\x58\xff\xab\xfb\x69\xfb\x7e\xff\x52\xfa\xbf\xf9\x7a\xfd"
+ "\x79\xff\x99\xfd\xc1\xfd\xcf\x02\x75\x02\xd6\x00\xf8\x00\x02\x03"
+ "\x75\x01\x11\x00\x0f\x00\xbb\x00\xe8\x00\xb5\x00\x44\x01\x58\x02"
+ "\x3e\x04\x70\x03\x05\x03\x8c\x04\xe7\x03\x06\x02\xa9\x00\xce\x00"
+ "\x57\xff\x4f\xfd\x29\xfd\x19\xfd\x4f\xfd\x21\xfd\x03\xfe\x17\xff"
+ "\xf4\xff\x59\x00\x77\x00\xfa\x00\xd6\x00\x1b\x00\x62\xff\x0d\xff"
+ "\xd5\xfe\xf5\xfd\xd3\xfd\x74\xfe\x35\xfe\xac\xfe\x51\xff\xe4\xff"
+ "\x2a\x00\x82\x00\x45\x01\x11\x01\xee\x00\x10\x01\xe8\x00\x74\x00"
+ "\x05\x00\xe9\xff\x32\x00\xcb\xff\xda\xff\x99\x00\xee\x00\x13\x01"
+ "\x59\x01\x08\x02\x1a\x02\xa2\x01\xaf\x01\x9c\x01\x9d\x00\x3f\x00"
+ "\xea\xff\x3d\xff\xd4\xfe\xd1\xfe\xe4\xfe\xa0\xfe\x10\xff\x7f\xff"
+ "\x70\xff\x87\xff\xa0\xff\xcc\xfe\x18\xff\xd7\xfd\x8f\xfc\x7b\xfd"
+ "\x76\xfc\xf8\xfb\x7c\xfc\xdd\xfd\x71\xfe\xa2\xfe\x46\x00\x88\x01"
+ "\xca\x01\xb3\x01\x6a\x02\xb3\x02\x32\x02\xf1\x01\x0b\x02\x7d\x02"
+ "\x33\x02\x61\x02\x87\x02\x44\x03\xfd\x02\x6a\x02\xba\x02\x35\x02"
+ "\x8e\x01\x5e\x00\x2a\x00\x7f\xff\x8a\xfe\x5a\xfe\x27\xfe\x63\xfe"
+ "\x70\xfe\xd0\xfe\x5f\xff\xab\xff\xed\xff\xa9\xff\x10\x00\x00\xff"
+ "\x99\xff\xc8\xfe\xad\xfe\x2f\xff\x3e\xff\xde\xfe\xc4\x01\xab\xfe"
+ "\x47\xfc\xa8\x02\x0f\xfe\x5b\xf9\x02\xfb\xd3\x00\xb4\xfa\x1c\xf8"
+ "\xd3\xff\x39\x02\x61\xfe\x6f\xfe\x9b\x05\x61\x04\x34\x01\x63\x02"
+ "\xb2\x04\xba\x02\x66\x01\xb8\x01\xca\x01\x46\x03\x3e\x02\x3c\x01"
+ "\x71\x03\xa2\x04\xb5\x02\xfe\x00\x43\x03\x4c\x02\x22\xff\x2b\xfe"
+ "\xa4\xfe\xb4\xfd\x6f\xfb\xb4\xfb\xca\xfc\x3e\xfd\x2c\xfd\x01\xfe"
+ "\xe4\xff\x16\x00\x58\x00\xd0\xff\x03\x00\x8f\x00\x4e\xfe\x54\xfe"
+ "\x30\xfe\xc0\xfe\x09\xfe\x3d\xfe\x33\x00\x6d\x00\x86\x00\x9e\x01"
+ "\xbb\x02\x26\x02\x4e\x02\x9e\x02\xbd\x02\xc2\x01\x55\x01\x35\x02"
+ "\x7c\x01\xec\x00\x18\x01\xee\x01\x06\x01\x93\x00\x62\x01\x02\x01"
+ "\x2e\x00\xb5\xff\x63\x00\x17\xff\x82\xfe\xd4\xfd\xbb\xfd\xd9\xfc"
+ "\x2c\xfc\xd0\xf9\x87\xfa\xab\xfc\x00\xf9\xf6\xf9\xb8\xfc\xbd\xfe"
+ "\x1e\xfd\xb0\xfe\x8b\x02\x22\x02\x7b\x01\x1c\x02\x86\x03\x52\x02"
+ "\xc1\x01\x23\x02\xa5\x02\x89\x02\xb2\x02\x5c\x03\xcd\x03\x9b\x04"
+ "\x37\x04\xce\x03\x4e\x04\xdd\x02\x13\x02\xb5\x00\x39\x00\xc7\xfd"
+ "\xbf\xfc\x79\xfe\x5f\xfb\xe6\xfb\x07\xfe\x97\xfe\x5e\xfe\x70\xff"
+ "\xbb\x01\xfb\x00\x28\x00\xdd\x00\x94\x00\xa1\xff\xc0\xfe\x9e\xff"
+ "\x46\xff\xc1\xff\x82\xff\xdf\x00\x2b\x00\x4d\x01\x9a\x00\xd3\x00"
+ "\x45\x01\x9b\xff\xcd\xff\x8c\x03\xbe\xff\x7e\xf6\x07\x05\xa4\xff"
+ "\xbe\xf4\xd8\xf6\xdc\x01\x19\xfd\xd5\xf1\xa7\xfe\xc7\x05\x55\x00"
+ "\x9f\xfb\x04\x07\x81\x08\x75\x01\xfe\x00\x65\x04\x7c\x03\xaa\xff"
+ "\xcc\xff\x89\xff\x27\x02\x0a\x03\x90\xff\x62\x02\xa3\x05\xa0\x05"
+ "\xc3\x00\xd0\x01\x38\x05\x63\x00\xad\xfc\x84\xfc\xa0\xfe\x59\xfb"
+ "\xa4\xf8\x60\xfb\x11\xfe\xaf\xfd\x52\xfd\xc9\x00\xc8\x02\x7e\x02"
+ "\x53\x02\xd1\x01\xb4\x02\xc0\x01\x69\xff\xcf\xfe\x72\xfe\xf4\xfd"
+ "\xf3\xfe\x19\xfe\xa3\xfe\x7b\x00\xf8\x01\xee\x01\x3d\x01\x8a\x03"
+ "\x00\x03\x97\x01\x8a\x00\x58\x00\x0c\x00\x63\xfe\xe4\xfd\x99\xfe"
+ "\x98\xff\x50\xff\x6e\xff\x3c\x01\x61\x02\x85\x01\x9b\x00\x62\x02"
+ "\x39\x01\xb6\xff\xde\xfe\x73\xff\xdf\xfd\x1a\xfd\xcc\xfe\x51\xfc"
+ "\xcd\xfd\xbb\xfd\xc5\x00\xcd\xf9\x73\xfb\x3f\x03\xa6\xfb\x36\xf9"
+ "\x9a\xfc\x79\x03\x8a\xfc\x3a\xfa\x93\x03\x11\x04\x90\xff\xb7\xff"
+ "\xe9\x05\xf1\x03\x36\x01\xaa\x02\x8a\x03\x4e\x03\x1f\x02\x5a\x03"
+ "\xd5\x01\x7d\x04\xc3\x04\x19\x02\x03\x02\x75\x04\xde\x01\x2d\xfe"
+ "\x09\x00\x98\xfe\xad\xfd\x59\xfb\x47\xfd\x16\xfe\x7c\xfd\x7d\xfe"
+ "\xe0\xff\x00\x01\xfd\x00\x1c\x01\xa0\x00\xa1\x00\x08\x00\x19\xff"
+ "\x0b\xfe\x28\xfe\xb3\xff\x87\xfe\x9b\xfe\x78\x00\x75\x01\xdd\x00"
+ "\xec\xff\x9a\x01\xf1\xff\x8f\xff\x99\xfe\x23\xfe\xfa\xfd\xac\xfd"
+ "\xed\xfd\xc3\xfd\xd4\xfd\xc7\xff\x56\x00\x9e\xfe\x47\x00\x81\x02"
+ "\x39\x01\x9d\xfc\x4b\x00\xe6\x02\x9a\xfc\xcd\xf9\x24\x01\x7c\x01"
+ "\xb0\xfb\xc5\xfd\x7f\x03\xf8\x03\x3b\xff\xfc\x01\x1b\x05\x26\x03"
+ "\xc1\x00\xbc\x01\x8d\x02\xf1\x01\xb6\x01\x62\x01\x9f\x02\x96\x03"
+ "\x66\x02\x48\x01\x44\x02\x2e\x01\x9b\xff\x51\xfc\xf9\xfc\x9f\xfe"
+ "\x46\xfb\xef\xfa\x16\xfd\x38\x00\x33\xfe\xac\xfd\x05\x01\xa8\x01"
+ "\x6c\xff\xed\xfd\xcb\x00\xe9\xff\xb4\xfe\x3e\xff\x9a\x00\x24\x02"
+ "\x6f\x01\x05\x02\x1d\x03\x3b\x04\x6f\x02\xe0\x00\xd0\x01\x1a\x01"
+ "\x3a\xff\x12\xfe\xf7\xfe\xbd\xff\x94\xfe\xa5\xfe\xa2\xff\xf0\xff"
+ "\x6d\xff\x14\x00\x7b\xff\x8f\xff\xd2\x00\xc6\xfe\xbf\xff\x57\x03"
+ "\x99\x04\xfd\xf6\x96\xf7\xc3\x07\xef\xfc\xc3\xec\xe8\xf5\x10\x07"
+ "\x3a\xfd\xac\xf1\xf3\x00\xea\x0d\x17\x05\xfd\xfb\xd9\x04\xbe\x0a"
+ "\x1e\x02\xba\xfc\xd3\xfe\xc7\x01\xa0\x00\xdf\xfe\x23\xff\x8a\x03"
+ "\x23\x0a\xcd\x06\x16\x02\xc0\x06\xdf\x0b\x0e\x04\x18\xfb\x3b\xff"
+ "\x6b\x03\x92\xfa\x39\xf4\x57\xfa\x25\x00\x91\xfb\xa8\xfa\x3e\xff"
+ "\x0c\x03\x34\x04\x1a\xff\xdd\xfe\xec\x00\x3a\x01\x0f\xfb\x6e\xf9"
+ "\x03\xfe\x3e\xff\xf5\xfc\x25\xfc\x5b\x02\xaa\x04\xf5\x01\x96\x00"
+ "\xbe\x02\x29\x05\x7f\x01\x16\xff\x67\x01\x03\x03\x69\x01\x4f\xfe"
+ "\x84\xff\x56\x02\x84\x00\x08\xfd\x8e\xfd\x16\x01\x83\xff\x96\xfc"
+ "\x22\xfe\xf5\x01\xb7\x01\x04\xfe\xb9\xff\x9f\x03\x48\x02\x53\xfa"
+ "\x4f\xfd\x61\xfa\x1b\xf9\x7f\xfb\x05\xf7\xc0\xf9\xd3\xfc\xaf\x03"
+ "\x6e\x01\xa0\x01\x0e\x08\x1e\x08\x67\x04\x8c\xff\x0a\x02\x42\x02"
+ "\x25\xfd\x5e\xfc\x14\xff\xe6\x02\xdf\x01\x98\x03\x62\x08\xdc\x08"
+ "\x03\x08\xca\x05\xb2\x05\x76\x03\xf0\xff\xec\xfc\x1b\xfc\x0b\xfd"
+ "\x2f\xfb\x24\xfb\xc4\xfd\x0f\x00\x25\x00\x09\x00\x2e\x01\x14\x02"
+ "\x61\x00\xbf\xfd\x01\xfe\xf4\xfc\x89\xfb\x69\xfb\xef\xfb\x07\xfd"
+ "\xaf\xfc\xd4\xfd\xd6\xfe\x07\xff\x61\xfe\x9f\xfe\x70\xff\x55\xfe"
+ "\x9d\xfe\x87\xff\x18\x00\x12\x01\x09\x01\x0d\x01\xf7\x01\x15\x02"
+ "\xd6\x01\xf4\x00\xcc\x01\xad\x02\xa4\x02\xd1\x02\xee\x02\xa0\x04"
+ "\xe8\x05\x02\x04\x87\x04\x93\x05\xe1\x03\x16\x01\x27\xfd\x5f\xfc"
+ "\xbd\xfb\xa2\xf7\x6d\xf6\x88\xf5\x80\xf8\x48\xfd\x1e\xfc\xa2\xfe"
+ "\x88\x01\x65\x05\x43\x03\x80\xff\x68\x00\xc5\xff\xde\xfe\xdb\xfa"
+ "\xbf\xfb\xc5\xff\x40\x01\xbc\x02\x4d\x05\x45\x08\x46\x09\xa2\x08"
+ "\x72\x07\xec\x04\xa5\x02\x0d\x00\xc2\xfd\x0e\xfb\xf0\xf9\xd2\xfb"
+ "\x89\xf5\x48\xfc\xe2\x03\xbf\xfd\xa3\xfe\xe9\x02\xb4\x09\xc8\x03"
+ "\x7b\xfe\xe8\x01\xbb\x01\xee\xff\x11\xfa\x8a\xfb\x0b\x00\xa4\x00"
+ "\xef\xff\x97\xff\x03\x03\x0a\x05\x83\x03\x2d\x00\xea\xfe\x26\x01"
+ "\xc9\xfe\xbe\xf9\x25\xfa\xe1\xfd\x63\xfd\x40\xfa\xaa\xfd\xd0\xff"
+ "\xff\x04\x08\x00\xa2\xf7\x6e\xfe\xd5\xff\x8b\xf9\x26\xf5\x83\xf9"
+ "\x1e\x00\xd8\xff\x8d\xff\xf5\x04\xb2\x09\x55\x09\x94\x05\x19\x05"
+ "\xb4\x03\x28\x01\x19\x00\xd1\xff\x7a\xfe\x0e\x00\x32\x04\xd0\x05"
+ "\xd9\x05\x5b\x07\x3b\x09\x0d\x06\x5f\x02\x06\x00\xd5\xfc\x7e\xfa"
+ "\xbd\xf9\x97\xf8\x09\xf8\x3d\xfa\xc2\xfd\xd2\xfd\xb1\xfe\x15\x01"
+ "\x6e\x02\x53\x01\x81\xff\xd2\xfc\x81\xfb\xd4\xfc\xd0\xfa\xb8\xf8"
+ "\x8d\xfb\xa6\x01\x0c\x03\x22\x02\x84\x04\x96\x07\x3e\x08\x2e\x04"
+ "\xd7\x00\x7a\x01\xac\x01\x9a\xff\x95\xff\xf8\x00\xe2\x02\x46\x04"
+ "\xb4\x03\x27\x02\x3b\x02\x56\x02\xab\xfe\x02\xfd\x18\xfd\x61\xfd"
+ "\x47\xfd\x35\xfe\x25\x02\x91\x02\xcb\xf5\x92\xf2\xc1\xfb\x6c\xff"
+ "\xc9\xf3\x1a\xeb\x96\xf9\x5d\x06\x45\x06\x47\xfe\x59\x02\xaa\x0c"
+ "\x21\x0b\x5d\x00\x4f\xfa\x3d\xff\x9b\x02\xb3\xff\xbf\xfc\x9e\xfc"
+ "\xea\x03\x27\x0c\x4c\x0c\xe9\x07\xbc\x06\x31\x0a\x12\x09\xb5\x01"
+ "\x1c\xfa\xb6\xf9\x30\xfd\x5d\xfc\x6d\xf8\xaf\xf8\x02\xfe\xc2\x03"
+ "\xc4\x03\x25\x01\x14\x01\xf2\x03\x60\x03\x1f\xfd\xb0\xf7\x59\xf9"
+ "\x14\xfb\xc3\xf9\xff\xf7\x56\xfa\xc9\x00\x46\x03\x2e\x03\xa0\x02"
+ "\x4d\x04\xd4\x05\x3f\x03\x1b\xff\xd6\xfd\x0f\x00\xa1\x01\x68\xff"
+ "\x9c\xff\xb7\x01\xc2\x04\x74\x03\x7c\x02\x59\x01\xfa\x01\x57\x02"
+ "\x3b\x02\x1c\xff\x08\x02\x1f\xff\xb4\x04\xeb\xfe\xe8\xe8\x6a\xf6"
+ "\xc6\xfe\x1b\x00\x65\xeb\x41\xef\x82\x07\x70\x0d\x3b\x07\xa7\xfa"
+ "\x65\x04\x59\x0b\x98\x04\x84\xf8\x23\xf5\x68\xfd\x62\x02\x6b\x00"
+ "\x97\xfc\xea\xfc\x53\x09\xe8\x10\x0d\x0c\xef\x01\x3f\x03\x07\x08"
+ "\x2f\x05\xc2\xfc\xe1\xf6\x87\xf9\xfe\xfe\x77\x00\xb8\xfc\xe5\xfb"
+ "\xb3\x01\xf1\x07\x4d\x08\x10\x02\xa1\xfe\xc4\x01\x06\x04\x05\xfd"
+ "\x13\xf5\x0e\xf8\x07\xfc\xf9\xfd\xa0\xfa\xd1\xfb\xd6\x00\xae\x04"
+ "\x1c\x05\x08\x01\x1b\x01\x20\x03\x3b\x01\xc6\xfe\x5c\xfc\x88\xfe"
+ "\xb4\x00\x95\x00\xf1\xff\xba\x01\x13\x03\xae\x03\x9c\x02\xd0\x02"
+ "\xaa\x00\x33\x02\x07\x03\x50\x00\x9b\xff\x10\x01\x53\xfe\xc5\xe6"
+ "\x50\xf5\x0b\x01\xe6\xfd\xc6\xee\x58\xef\x43\x0a\xcb\x0e\x34\x09"
+ "\x74\xfb\x45\x03\x6c\x08\xdd\x02\x98\xfa\x63\xf7\x75\xfb\x4b\x01"
+ "\x3c\x05\x7f\x01\xfc\xfd\xf8\x06\x0a\x12\xf9\x0f\x74\x03\x59\xfe"
+ "\x22\x03\xee\x04\x6b\xfe\x29\xf5\x7d\xf5\xff\xfb\x90\x01\xe2\xfe"
+ "\x30\xfc\x3b\xfe\x91\x04\xaf\x08\x96\x04\x4e\xfd\x23\xfd\x33\x02"
+ "\xca\x00\x95\xf8\x25\xf7\x96\xfa\xae\xfe\x28\xff\x37\xfd\x32\x00"
+ "\x54\x02\xc1\x06\xab\x04\x60\x03\xad\x01\xbe\x00\xea\x01\x8a\x00"
+ "\x7f\xfd\x41\xfd\xf4\xff\x52\x02\x96\x01\xd5\xff\x10\x02\x15\x04"
+ "\xdf\x04\xf9\x00\x1e\x02\x59\x02\xc1\x03\x0d\xfe\xf3\xfe\xf5\xe8"
+ "\xfb\xeb\x44\xfe\xd6\xfd\x8b\xf3\x2d\xe9\x44\x04\x99\x0e\x24\x0f"
+ "\xbb\xff\xf4\xff\x74\x06\x46\x03\xcc\xfc\x42\xf7\x22\xfa\x0c\xfd"
+ "\x92\x04\x38\x07\x1a\x03\x0c\x04\xfb\x0d\xec\x13\x30\x0c\x85\x00"
+ "\x92\xfe\x16\x01\xbb\x02\xa7\xfa\xc3\xf5\x0d\xf7\xbf\xfe\x23\x02"
+ "\x4e\x00\xe4\xfd\x21\xff\xb0\x04\x52\x07\x77\x02\xc1\xfb\xb8\xfb"
+ "\x62\xff\x97\xfd\xdf\xf9\x89\xf7\xbe\xf9\xb8\xfe\xe8\xff\x01\x01"
+ "\x19\xff\x15\x02\x75\x04\xe5\x05\x97\x03\xd6\xfe\x3e\xfe\xcf\x01"
+ "\x18\x02\xd0\xfe\x38\xfc\xa8\xff\x1e\x04\x88\x04\x5d\x00\xce\x00"
+ "\xa5\x04\x8a\x06\xb8\x04\x61\x02\xde\x01\xc8\x03\x09\xfe\x92\xe8"
+ "\xf9\xed\x20\xfa\x5a\xff\x5b\xef\x13\xee\xb0\x00\x56\x0e\x36\x0f"
+ "\xfe\x01\x3c\x01\x01\x02\xf8\x02\xf5\xfb\x68\xf8\xb2\xf6\x00\xfb"
+ "\x1e\x03\x17\x07\x2d\x04\x2d\x05\x2e\x0d\x98\x12\x4d\x0d\x55\x03"
+ "\xa6\xfd\x7a\xff\xe1\x00\xbb\xfb\x9d\xf6\xff\xf6\x79\xfd\xa6\x01"
+ "\xe9\x01\x59\x00\x6b\x01\xe6\x03\x87\x06\x8d\x04\x73\xff\xa0\xfc"
+ "\x36\xfc\xef\xfb\xc8\xfc\xf5\xf8\x04\xf8\xdf\xfb\x2e\x02\x37\x03"
+ "\x02\x01\xbe\x01\x89\x03\xb4\x05\x71\x04\xfa\xfe\xfc\xfb\xdb\xfd"
+ "\x94\x01\x49\x00\xe0\xfc\x64\xfd\xbf\x01\xe1\x04\x5e\x02\x41\x01"
+ "\xe0\x00\x70\x06\xce\x04\xe2\x02\x68\xfe\x67\xff\xa6\xf4\xf7\xef"
+ "\xb6\xf5\x88\xf9\xf4\xf8\x90\xf2\xd4\xfc\xad\x04\x0d\x0d\x4a\x08"
+ "\xcc\x04\x50\x02\x21\x02\xd2\xff\xde\xfb\xa1\xf9\x7a\xf9\xba\xfd"
+ "\xbb\x02\x24\x06\x64\x05\x5a\x08\x27\x0c\x75\x0d\x08\x09\x13\x02"
+ "\x92\xfd\xfd\xfe\x27\xfe\x45\xfa\x1e\xf7\x66\xf9\x3d\xfd\x37\x00"
+ "\xb6\x01\xce\x01\x9a\x02\x0f\x04\xe5\x05\xba\x04\x2a\x00\x55\xfc"
+ "\x7f\xf9\x92\xfb\x31\xfb\x5c\xf9\x62\xf9\x11\xfd\x18\x03\xd3\x04"
+ "\x2c\x05\xcf\x03\x7b\x04\x4b\x04\x62\x02\x16\xff\xdf\xfc\xbf\xfd"
+ "\x48\xff\x44\x00\xe4\xfe\xf0\xfe\x3d\x00\x1a\x03\x26\x04\x7e\x03"
+ "\xae\x00\x51\x00\xa7\x02\x35\x01\x8f\xfc\x93\xf1\x15\xf2\x10\xf7"
+ "\xf0\xf9\x6f\xf7\xa0\xf5\x1b\xfd\x71\x04\xf9\x09\xb6\x08\x07\x06"
+ "\x20\x03\x20\x02\x57\x01\x6e\xff\x7f\xfc\x64\xfa\x3f\xfd\xf2\x01"
+ "\x7c\x05\x8e\x06\x3d\x07\x7f\x09\x9b\x0a\xe3\x08\x09\x04\x98\xff"
+ "\xe4\xfd\x56\xfd\x59\xfb\x3d\xf9\x5a\xf9\x27\xfa\xab\xfc\xb0\xff"
+ "\x58\x02\x01\x03\x2d\x03\x89\x04\xb8\x05\xc0\x03\x3a\xfe\x65\xfb"
+ "\x42\xfa\xa1\xfb\x73\xfb\x0f\xfa\x46\xfb\xe8\x00\x67\x06\x35\x06"
+ "\x79\x04\xab\x03\x8a\x04\x58\x03\x8b\x00\xe6\xfd\x25\xfd\x20\xfe"
+ "\xd5\xff\x77\xff\x44\xfe\x6a\xfd\x23\x01\x55\x03\x21\x02\x29\xfe"
+ "\x2d\x00\xc5\x00\x70\x01\xf6\xf8\x57\xf1\x17\xf8\x04\xfa\x28\xfb"
+ "\x1b\xf4\x9f\xf8\x35\xff\x40\x06\xd8\x07\x84\x05\x8b\x04\x34\x04"
+ "\xb2\x04\xbd\x03\x80\x01\xe8\xfd\xdc\xfd\xb5\xff\x3e\x03\xb4\x02"
+ "\x3a\x04\x0d\x05\x0e\x07\x7d\x06\xbe\x05\x68\x03\x10\x01\xe7\xfe"
+ "\x55\xfe\x9e\xfd\x13\xfc\x9c\xfa\x44\xfa\xff\xfb\xc8\xfd\x4a\xff"
+ "\x34\x00\xd7\x01\x74\x03\x9b\x03\xe8\x01\xcd\x00\xd2\x00\x6d\x00"
+ "\x5f\xfe\xa2\xfd\x56\xfd\xf6\xfe\x8c\xff\x2d\x00\x37\x00\xf0\xff"
+ "\x48\x00\xb8\x00\x63\x00\x4b\x00\x68\x00\xe9\xff\x57\x00\x30\x00"
+ "\x92\xff\xc8\xfe\xfe\xfd\x1a\xfe\x15\xff\xbf\xff\x37\x00\xe9\x00"
+ "\xff\x01\x78\x02\xab\x02\xe8\x00\x69\xff\xf4\xfd\xe6\xfd\x64\xfc"
+ "\x84\xfa\x95\xfa\xc3\xfa\x23\xfc\xfb\xfc\x60\xfe\x9c\xfd\x44\xfd"
+ "\xea\xfe\xaf\x01\x0c\x02\xa0\x00\xfb\x00\x09\x03\x5e\x03\x5d\x02"
+ "\xc3\x02\x4b\x03\x57\x03\x40\x03\x01\x04\x51\x04\x38\x03\xa1\x02"
+ "\x93\x03\xc6\x03\x0e\x02\x81\x00\x95\x00\xe4\x00\x4b\x00\x1d\xff"
+ "\x7f\xff\x5b\x00\xf6\xff\x67\xfe\x03\xfe\x50\xfe\xf0\xfd\x3b\xfd"
+ "\x91\xfd\xc0\xfd\x20\xfd\x69\xfd\x2f\xff\x89\x00\xdb\xff\x1c\xff"
+ "\xb0\xff\xc1\x00\x0e\x01\xcb\x00\x96\x00\xa4\x00\x07\x01\x5d\x01"
+ "\x6a\x00\x59\xff\x38\xff\xd6\xff\xfb\xff\xd6\xff\xf7\xff\x47\x00"
+ "\x2b\x01\xc4\x00\x29\xff\x80\xfe\x97\xfd\xab\xfb\x85\xfa\xa1\xfb"
+ "\xb0\xfb\x28\xfa\x9b\xfa\x89\xfd\x48\xff\x7c\xfe\xc9\xfe\x10\x01"
+ "\x8e\x02\x88\x02\x19\x03\xce\x03\xd0\x03\xe0\x03\xc2\x04\x05\x05"
+ "\xc1\x03\xff\x02\x2e\x04\xbc\x04\x8e\x03\x3a\x02\xc4\x01\xdf\x01"
+ "\x58\x02\xc1\x01\xd3\xff\x97\xfe\xdc\xfe\xa3\xff\xf6\xfe\x99\xfd"
+ "\x19\xfd\x04\xfe\x89\xfe\x62\xfe\x92\xfd\x33\xfd\x98\xfd\xb2\xfe"
+ "\x86\xff\x1f\xff\xe5\xfe\xa1\xff\x25\x01\x74\x01\xb1\x00\xd9\xff"
+ "\x4f\x00\xf7\x00\x3b\x01\xbb\x00\x88\x00\x82\x00\x7c\x00\x44\x00"
+ "\x8f\xff\x24\xff\x18\xff\x1a\xff\x5b\xff\xb6\xff\x8b\xff\xf6\xfe"
+ "\x75\xfe\xea\xfe\xdd\xfd\x28\xfc\xdc\xfa\xc9\xfb\x38\xfc\xc2\xfb"
+ "\xd9\xfb\x0a\xfd\x76\xfe\x13\xff\x77\x00\xbb\x01\x11\x02\x65\x02"
+ "\xbc\x03\x7e\x04\x94\x04\x1b\x04\x4d\x04\x72\x04\x3f\x04\xbd\x03"
+ "\x80\x03\x54\x03\xc6\x02\x72\x02\x19\x02\x72\x01\xb7\x00\x62\x00"
+ "\x3d\x00\x49\xff\x3e\xfe\xc2\xfd\xcf\xfd\xdc\xfd\x97\xfd\xab\xfd"
+ "\xf1\xfd\x7e\xfe\x0c\xff\x2c\xff\x7e\xfe\x2f\xfe\x12\xff\xa0\xff"
+ "\xf3\xfe\x9b\xfe\x39\xff\x44\x00\x92\x00\x72\x00\x9e\x00\xd1\x00"
+ "\x07\x01\x8c\x01\xd0\x01\xa1\x01\x55\x01\x5d\x01\x45\x01\xae\x00"
+ "\x15\x00\xf6\xff\xbf\xff\x5a\xff\x59\xff\xb5\xff\xdd\xff\xae\xff"
+ "\x20\x00\xd4\xff\x90\xfe\xd1\xfd\xa0\xfd\xaf\xfc\x4f\xfb\xf0\xfa"
+ "\x28\xfb\xfc\xfa\x2b\xfb\x30\xfc\xf8\xfc\x37\xfd\x2e\xfe\xfc\xff"
+ "\x2b\x01\xb7\x01\x93\x02\x87\x03\x27\x04\x9a\x04\x08\x05\x47\x05"
+ "\x2b\x05\x1a\x05\xd2\x04\x6d\x04\xec\x03\x99\x03\x26\x03\x52\x02"
+ "\xe1\x01\x82\x01\xfc\x00\x16\x00\xa6\xff\x72\xff\x35\xff\x89\xfe"
+ "\x29\xfe\xf8\xfd\xf3\xfd\xd8\xfd\x8a\xfd\x98\xfd\x70\xfd\x87\xfd"
+ "\xbe\xfd\x7d\xfe\xeb\xfe\x2c\xff\x66\xff\xc5\xff\x09\x00\x2d\x00"
+ "\x42\x00\x73\x00\xb2\x00\xd0\x00\x89\x00\x41\x00\x54\x00\x3a\x00"
+ "\xc8\xff\x9c\xff\x78\xff\x75\xff\x9b\xff\xdd\xff\x68\x00\x1a\x00"
+ "\xaf\xff\x90\xfe\xb2\xfe\x6d\xfe\x0c\xfd\xc9\xfb\xf0\xfb\x98\xfc"
+ "\x1e\xfc\x34\xfc\xe8\xfc\xc9\xfd\x54\xfe\x67\xff\x84\x00\x66\x01"
+ "\x48\x02\x79\x03\xf5\x03\x28\x04\x80\x04\xfb\x04\xf4\x04\x9e\x04"
+ "\x55\x04\xf7\x03\x9d\x03\x65\x03\xfc\x02\x2f\x02\xa4\x01\x4a\x01"
+ "\xc8\x00\xf7\xff\x2f\xff\x99\xfe\x15\xfe\x9d\xfd\x3d\xfd\xe3\xfc"
+ "\xb2\xfc\x82\xfc\xdf\xfc\x5b\xfd\xd3\xfd\xef\xfd\x31\xfe\x02\xff"
+ "\x0f\x00\xb2\x00\x1c\x01\x5d\x01\x96\x01\xc7\x01\x25\x02\x3f\x02"
+ "\xbd\x01\x7e\x01\x78\x01\x81\x01\x0b\x01\x9b\x00\xf9\xff\x99\xff"
+ "\x4f\xff\x1a\xff\x5a\xfe\x0a\xfe\x71\xfe\xa1\xfe\xb4\xfe\x90\xfe"
+ "\x72\xfe\x7a\xfd\x80\xfd\xcf\xfd\x00\xfd\xcd\xfb\xdc\xfb\xbd\xfc"
+ "\x6b\xfc\x33\xfc\x0a\xfd\x11\xfe\x7a\xfe\x52\xff\xb6\x00\x9e\x01"
+ "\x6b\x02\x97\x03\x77\x04\xa6\x04\x11\x05\xa7\x05\x8d\x05\x48\x05"
+ "\x44\x05\x52\x05\xad\x04\x19\x04\xac\x03\xcf\x02\xdf\x01\x5b\x01"
+ "\xc1\x00\x6f\xff\x83\xfe\x34\xfe\x97\xfd\xec\xfc\x82\xfc\x30\xfc"
+ "\xfe\xfb\xf7\xfb\x52\xfc\x75\xfc\xe1\xfc\x70\xfd\x27\xfe\xda\xfe"
+ "\xa1\xff\x5a\x00\xc6\x00\x39\x01\x89\x01\xaf\x01\xca\x01\xfb\x01"
+ "\xf7\x01\x9c\x01\x51\x01\x4f\x01\x1c\x01\xad\x00\x19\x00\xae\xff"
+ "\x7a\xff\x66\xff\x08\xff\xc8\xfe\xa5\xfe\x36\xff\x1a\xff\x2e\xff"
+ "\x60\xff\x6c\xff\x30\xff\x83\xfe\xf3\xfe\x7e\xfe\x91\xfd\xcb\xfc"
+ "\x0c\xfd\xcd\xfc\x61\xfc\xb6\xfc\x2e\xfd\x62\xfd\xeb\xfd\x3f\xff"
+ "\x01\x00\x67\x00\x7f\x01\x08\x03\x80\x03\x94\x03\x38\x04\xfb\x04"
+ "\x0e\x05\xf8\x04\xfa\x04\xbf\x04\x6b\x04\x56\x04\xd3\x03\x0f\x03"
+ "\x80\x02\xfb\x01\x25\x01\x34\x00\x6c\xff\xb7\xfe\x19\xfe\x86\xfd"
+ "\xf1\xfc\x63\xfc\x3a\xfc\x45\xfc\x4b\xfc\x6b\xfc\xef\xfc\x7b\xfd"
+ "\xe8\xfd\x76\xfe\x0e\xff\xaa\xff\x31\x00\x90\x00\xb1\x00\xe7\x00"
+ "\x3c\x01\x5a\x01\x2d\x01\xfb\x00\x0e\x01\xff\x00\xb6\x00\x4d\x00"
+ "\xff\xff\xd3\xff\xab\xff\x92\xff\x7a\xff\x52\xff\x60\xff\x7b\xff"
+ "\xbb\xff\xca\xff\xe3\xff\x27\x00\x6f\x00\xb5\x00\xaa\x00\xd3\x00"
+ "\x79\x00\xf8\xff\x45\xff\x96\xfe\xfc\xfd\x48\xfd\xae\xfc\x39\xfc"
+ "\x52\xfc\x78\xfc\xc4\xfc\x32\xfd\xeb\xfd\xa6\xfe\x75\xff\x73\x00"
+ "\x7c\x01\x46\x02\xd8\x02\x7f\x03\x33\x04\xc0\x04\x03\x05\x23\x05"
+ "\x23\x05\x21\x05\x0a\x05\xc8\x04\x2f\x04\x6a\x03\xa2\x02\x05\x02"
+ "\x40\x01\x3e\x00\x22\xff\x54\xfe\xaa\xfd\xf3\xfc\x52\xfc\xd5\xfb"
+ "\x7e\xfb\x6e\xfb\xb3\xfb\xf2\xfb\x33\xfc\xad\xfc\x68\xfd\xf6\xfd"
+ "\x7e\xfe\x29\xff\xcf\xff\x50\x00\xb6\x00\x14\x01\x6b\x01\x97\x01"
+ "\xad\x01\xab\x01\xaf\x01\x92\x01\x62\x01\x29\x01\xe4\x00\x97\x00"
+ "\x4b\x00\x2a\x00\xea\xff\xd6\xff\xc7\xff\xd0\xff\xe8\xff\xff\xff"
+ "\x0c\x00\x00\x00\x1d\x00\x20\x00\x14\x00\xf2\xff\xc5\xff\x8e\xff"
+ "\x47\xff\x12\xff\xb7\xfe\x63\xfe\x11\xfe\xbc\xfd\x69\xfd\x39\xfd"
+ "\x4c\xfd\x5a\xfd\x78\xfd\xd8\xfd\x80\xfe\x1b\xff\xb2\xff\x7d\x00"
+ "\x6d\x01\x3f\x02\xe7\x02\x8c\x03\x26\x04\x85\x04\xd6\x04\x04\x05"
+ "\xf8\x04\xc3\x04\x78\x04\x23\x04\x90\x03\xec\x02\x4f\x02\x95\x01"
+ "\xb6\x00\xe5\xff\x1c\xff\x25\xfe\x33\xfd\x77\xfc\xe6\xfb\x68\xfb"
+ "\x0d\xfb\x01\xfb\x1e\xfb\x61\xfb\xd4\xfb\x6e\xfc\xfe\xfc\xad\xfd"
+ "\x85\xfe\x55\xff\x09\x00\xab\x00\x30\x01\x90\x01\xe8\x01\x19\x02"
+ "\x20\x02\x0c\x02\x0a\x02\xff\x01\xe8\x01\xd2\x01\x9c\x01\x5f\x01"
+ "\x26\x01\xe6\x00\x86\x00\x1c\x00\xdc\xff\xb1\xff\x78\xff\x4b\xff"
+ "\x37\xff\x44\xff\x5d\xff\x7a\xff\x96\xff\xac\xff\xca\xff\xe1\xff"
+ "\xe7\xff\xdb\xff\xcf\xff\xb0\xff\x8a\xff\x67\xff\x34\xff\x00\xff"
+ "\xd5\xfe\xb9\xfe\xa0\xfe\x7e\xfe\x7f\xfe\xaa\xfe\xe6\xfe\x31\xff"
+ "\x90\xff\xfe\xff\x68\x00\xd4\x00\x4e\x01\xbe\x01\x01\x02\x41\x02"
+ "\x68\x02\x87\x02\x86\x02\x7f\x02\x61\x02\x1b\x02\xe7\x01\xbd\x01"
+ "\x85\x01\x26\x01\xcf\x00\x74\x00\x0f\x00\xb6\xff\x5e\xff\xf1\xfe"
+ "\x99\xfe\x5a\xfe\x27\xfe\xf8\xfd\xd2\xfd\xc4\xfd\xc8\xfd\xe7\xfd"
+ "\x22\xfe\x5c\xfe\x93\xfe\xdd\xfe\x43\xff\x94\xff\xcd\xff\x07\x00"
+ "\x47\x00\x7c\x00\x8b\x00\xa5\x00\xbe\x00\xd3\x00\xdc\x00\xdc\x00"
+ "\xd7\x00\xc6\x00\xba\x00\xa8\x00\x85\x00\x4c\x00\x1c\x00\xf8\xff"
+ "\xd5\xff\xb8\xff\x9c\xff\x8a\xff\x8c\xff\xa9\xff\xc9\xff\xe5\xff"
+ "\x0b\x00\x2a\x00\x50\x00\x78\x00\x95\x00\x98\x00\x9c\x00\x9e\x00"
+ "\x8f\x00\x82\x00\x74\x00\x52\x00\x13\x00\xf8\xff\xdd\xff\xa8\xff"
+ "\x55\xff\xff\xfe\xc4\xfe\x8b\xfe\x61\xfe\x31\xfe\x10\xfe\x0f\xfe"
+ "\x40\xfe\x7e\xfe\xb8\xfe\xfe\xfe\x62\xff\xe5\xff\x62\x00\xc6\x00"
+ "\x22\x01\x93\x01\xfa\x01\x44\x02\x64\x02\x84\x02\xa3\x02\xaa\x02"
+ "\x97\x02\x77\x02\x49\x02\x0f\x02\xd3\x01\x90\x01\x26\x01\xa8\x00"
+ "\x3d\x00\xd2\xff\x5a\xff\xd1\xfe\x5c\xfe\xf9\xfd\xb7\xfd\x92\xfd"
+ "\x6c\xfd\x59\xfd\x6e\xfd\xa2\xfd\xd5\xfd\x05\xfe\x4d\xfe\xa0\xfe"
+ "\xf0\xfe\x3a\xff\x84\xff\xd6\xff\x1c\x00\x63\x00\xa8\x00\xdc\x00"
+ "\x01\x01\x20\x01\x40\x01\x56\x01\x4d\x01\x3b\x01\x2d\x01\x1c\x01"
+ "\xff\x00\xe4\x00\xcb\x00\xa2\x00\x86\x00\x6d\x00\x65\x00\x5b\x00"
+ "\x47\x00\x2b\x00\x00\x00\xd3\xff\xb8\xff\xc2\xff\xb6\xff\x69\xff"
+ "\xfc\xfe\x40\xff\x1c\x00\x8a\x00\x23\x00\xbc\xff\xbe\xff\xec\xff"
+ "\xfa\xff\x81\xff\xe6\xfe\x68\xfe\x23\xfe\x38\xfe\x9c\xfe\xe5\xfe"
+ "\xd0\xfe\x7c\xfe\x79\xfe\x17\xff\xcd\xff\x12\x00\xfe\xff\xed\xff"
+ "\x33\x00\xb2\x00\x3b\x01\x76\x01\x89\x01\xb6\x01\x97\x01\xfe\x01"
+ "\xb2\x02\xe2\x02\xa6\x02\x81\x02\xb0\x02\x80\x02\xf5\x01\x07\x01"
+ "\xa3\x00\xf0\x00\x34\x00\x14\xff\x63\xfe\x8e\xfe\x85\xfe\x0a\xfe"
+ "\x26\xfd\xab\xfc\xda\xfc\xde\xfc\x4c\xfd\xc1\xfd\x59\xfe\x69\xfe"
+ "\xb1\xfe\xe2\xfe\x1c\xff\xf2\xff\xae\x00\x90\x00\x96\x00\x9c\x00"
+ "\x41\x01\x3a\x02\xae\x02\x87\x02\x69\x02\xd9\x01\x3d\x01\x5b\x02"
+ "\x48\x02\x08\x01\x7b\x00\x88\x00\xbf\xff\xe9\xff\x9f\xff\xca\xfe"
+ "\xca\xfe\xfb\xfe\xa9\xfe\x80\xfe\x16\xfe\x7c\xfe\xc3\xfe\xd1\xfe"
+ "\xc5\xfe\x8f\xfe\x4c\xff\xc2\xfe\x47\xff\x1f\x00\xe9\xff\x1c\x00"
+ "\xaf\x00\x4c\x00\x84\x00\xed\x00\xdf\x00\xbc\x00\xba\x00\x89\x00"
+ "\x7a\x00\xca\x00\x1b\x01\x6e\x00\x69\x00\x20\x00\xe0\xff\xbf\x00"
+ "\x75\x00\x9a\xff\x54\xff\xbe\xff\xdf\xff\x8f\x00\x22\xff\xa2\xfe"
+ "\x09\x00\x40\x00\x5d\xff\x48\xff\xd9\xff\x38\x00\xb4\xff\xdb\xff"
+ "\xba\x00\x8c\x00\xea\xff\x63\xff\x23\x01\x38\x01\x4a\x01\x8e\x00"
+ "\x63\x00\x5c\x00\x4c\x01\x8f\x01\x1c\x00\x98\xfe\xf3\xfe\x13\x01"
+ "\xea\xff\x84\xfe\xc8\xfd\x3f\x00\x19\x00\xe9\xfe\x4d\xff\xcd\xfe"
+ "\x99\xff\x57\x00\x92\xff\xf2\xff\x4a\xff\x83\x00\x0f\x00\xe3\x00"
+ "\x94\x00\xdc\xff\x07\x01\xd8\x00\x28\x01\xfa\xff\xdd\x00\x7c\x00"
+ "\x57\x01\x72\x00\x85\xff\xde\xff\xfe\x00\x48\x00\xf4\xfe\x81\xfe"
+ "\x16\x00\xc1\xff\x76\xff\x13\xfe\x7d\xfe\x66\x00\x02\xff\x57\xfe"
+ "\x41\xfe\xcf\x00\x81\xff\xf8\xfe\xa1\xff\xe8\xff\x90\x00\x47\x00"
+ "\xf5\xff\x48\x00\x0e\x01\x09\x01\xad\xff\x8f\x00\x25\x01\xaf\x01"
+ "\xa0\x00\xe0\xff\x9d\x00\x49\x00\xd0\x01\x9f\x00\x16\xff\x5e\x00"
+ "\x51\x00\xf0\xff\xe1\xfe\x66\xff\x9e\xff\x1d\xff\x06\xff\xef\xfd"
+ "\x75\xff\xeb\xff\xdb\xff\xcd\xfe\x5f\xff\xfc\xff\x28\x00\xcc\x00"
+ "\x42\x00\x27\x00\xfb\x00\x43\x01\xb5\x00\x25\x01\x0c\x01\x82\x01"
+ "\x1d\x01\x76\x00\x8c\x00\x8a\x00\xe5\x00\x8f\xff\xfe\xff\x2a\x00"
+ "\x3d\xff\xbe\xfe\x16\xff\x4b\xff\xaa\xff\x2b\xff\x31\xfe\x50\xff"
+ "\x80\xff\x42\x00\xc4\xff\x66\x00\xa6\xff\x92\xff\xc8\x00\x93\x00"
+ "\x7b\x01\xb3\x00\x6d\xff\xbc\x00\x54\x01\xc8\x00\x80\x00\x4f\xff"
+ "\xc8\xff\x3c\x00\x96\xff\x85\x00\x62\xfe\xc6\xfe\x6b\xff\x6d\xff"
+ "\xfb\xff\x3b\xfe\xe9\xfe\x67\xfe\xcc\xff\xa0\xff\xad\xff\x12\x00"
+ "\x13\xff\xad\xff\x9a\x01\x5e\x00\x6e\x00\x0b\x01\xba\x00\x5d\x00"
+ "\xbd\x00\x70\x01\x45\x01\x5b\x01\xe8\xfe\x7f\x01\x5a\x00\x2b\x00"
+ "\x5c\x00\x57\xff\x22\x00\xcf\xfe\xf0\xfe\x7a\xff\xc7\xff\x8d\xfe"
+ "\x7d\xfe\x91\xfe\x6a\xff\xc1\xff\xc1\xfe\x13\xff\x15\xff\xa8\x00"
+ "\x7d\x00\x9f\xff\x60\x00\x86\x00\x28\x02\xd6\x00\x19\x01\x08\x01"
+ "\x53\x01\x54\x02\x46\x01\xb7\x00\xa3\x00\xfc\x01\x0e\x00\xda\x00"
+ "\x63\x00\x04\xff\x07\x00\x9e\x00\xe4\xff\x3a\xfe\x22\xff\x57\xff"
+ "\x88\x00\x98\xff\x13\xfe\x0d\xff\x35\x00\x4d\xff\xb5\xff\xfa\xfe"
+ "\x53\xff\x36\x00\x55\xff\xc7\xff\x36\x00\xeb\x00\xbd\xfe\x19\x01"
+ "\xc4\xff\x71\x00\x23\x01\xe4\xff\x93\x00\xc1\xfe\xd5\x00\xe7\x00"
+ "\x66\xff\x7c\xff\xa6\xff\x96\xff\xb6\x00\x5b\xff\xfd\xfe\x71\xff"
+ "\x43\x00\xd1\x00\x1e\xff\x5e\xfe\xb5\xff\x2a\x01\xb0\xff\x6b\xff"
+ "\xed\x00\x03\xff\xa6\xff\x02\x01\xbd\x00\x7b\x01\xc0\xff\x56\xff"
+ "\x46\x00\x06\x00\x5d\xff\x84\x00\x13\xff\xb8\xfd\xba\xfe\x5a\xff"
+ "\x3a\xff\x02\xff\x5f\xff\x19\xff\xb3\xff\x58\x00\xa0\x00\x8d\x00"
+ "\x07\x01\xb3\x01\xcd\x01\x37\x02\x38\x01\xcb\x01\xca\x02\xe9\x01"
+ "\x04\x02\x36\x01\xc0\x00\xab\x00\xda\x00\x08\x01\xfe\xfe\xe9\xfe"
+ "\xfc\xfe\x2a\xff\x5f\xff\xa9\xfd\xab\xfe\x95\xff\xa8\xfe\x16\xfe"
+ "\xb7\xff\x37\xff\x74\xff\xbb\xff\xc1\xff\x90\xff\xc3\xff\xda\xff"
+ "\x40\x00\xfc\x01\x49\xff\x72\xff\x4f\x00\xa9\x00\x5e\x01\x8f\x00"
+ "\xda\xfe\xf3\xfe\x5b\x00\xa1\x01\x41\xff\xed\xfe\xa1\xff\xaf\xff"
+ "\xc0\x00\xeb\xfe\x06\x00\xdf\x00\x8e\xff\xab\xff\x1e\x00\x27\x00"
+ "\xc7\x00\x92\x00\xec\xff\x88\xfe\x3d\x00\x4c\x01\x9c\xff\x15\xff"
+ "\x5f\xff\xcd\xff\x72\xff\x38\xff\x18\xff\x72\xfe\x38\xfe\xb7\xfe"
+ "\xda\xfe\xdc\xfd\xa1\xfd\x40\xff\xb7\xff\xe8\xff\x57\x00\xa0\x00"
+ "\xb2\x01\x3e\x02\xbd\x02\x05\x03\xe9\x02\x09\x03\x2b\x03\x1b\x03"
+ "\x5b\x01\x1a\x02\xad\x03\xf2\x00\x2a\x00\xaf\x00\x02\x00\x29\xff"
+ "\xb5\xff\xdf\xff\x71\xfd\x5d\xfd\xd5\xfd\x5a\xfe\xdf\xfe\x5d\xfe"
+ "\xc6\xfd\x46\xfe\x1a\xff\xe4\xff\x11\x00\x0b\x00\x12\x00\x8d\xff"
+ "\xb3\x00\xc4\x00\xca\xff\x94\x00\xe9\x00\xea\xff\xa7\xff\xa9\xff"
+ "\x10\x00\xf3\x00\x42\x00\x4f\xff\x1a\xff\xe0\xff\xed\xff\x6b\xff"
+ "\xbd\xff\xd5\xfe\x97\xff\xea\xff\x1e\xff\x5e\xff\x13\x00\xd8\x00"
+ "\x2f\x00\x8d\xff\xb9\xff\x9b\x00\xf8\x00\xb6\x00\x88\x00\x87\x00"
+ "\x83\x00\x13\x00\x2a\x00\xf6\xff\xc8\xff\xd1\xfe\x2a\xfe\xdb\xfd"
+ "\x93\xfd\xfa\xfd\x27\xfe\x72\xfe\xad\xfe\xd1\xfe\x6c\xff\xed\x00"
+ "\x96\x01\x11\x02\x17\x02\x3b\x02\x6e\x02\xf2\x02\xbc\x03\x4b\x03"
+ "\x82\x02\x0e\x02\xf0\x01\x6d\x01\x98\x01\x4b\x01\x36\x00\x51\xff"
+ "\x1d\xff\x22\xff\x97\xfe\x5c\xfe\x63\xfe\x6e\xfe\xaa\xfd\xba\xfd"
+ "\x74\xfe\x5f\xff\x43\xff\x0f\xff\x72\xff\xf6\xff\x2f\x00\xb0\xff"
+ "\xae\x00\x86\x01\x39\x00\x6e\xff\x58\x00\x8c\x00\x0c\x01\xd3\x00"
+ "\x47\x00\xc3\xff\xfb\xff\xf5\xff\x0c\x00\x64\x00\xcb\xff\xbc\xfe"
+ "\x3c\xff\xe4\xff\xc6\xfe\xab\xff\x50\x00\xa3\xff\x11\xff\x93\xff"
+ "\x96\xff\x56\x00\x6d\x00\xc1\xff\xf8\xff\x27\x00\xed\x00\x39\x00"
+ "\xc8\xff\xeb\xff\x70\xff\xd3\xfe\xb3\xfd\x17\xfd\xee\xfc\x15\xfd"
+ "\xa5\xfd\xbb\xfd\x6d\xfe\x51\xff\x6a\x00\x96\x01\x97\x02\x51\x03"
+ "\x88\x03\xa5\x03\xc0\x03\xdb\x03\xa8\x03\x4f\x03\x92\x02\x47\x02"
+ "\x68\x01\xbd\x00\xcf\x00\x4c\x00\x5b\xff\xc2\xfe\x81\xfe\x59\xfe"
+ "\x62\xfe\x44\xfe\x80\xfe\x6a\xfe\x48\xfe\x33\xfe\xaa\xfe\x40\xff"
+ "\x54\xff\x11\xff\x9c\xfe\xd5\xfe\x2f\xff\xbd\xff\xb2\xff\xdc\xff"
+ "\x3d\x00\x32\x00\x16\x01\x6c\x01\xe5\x00\x26\x01\x33\x01\xcf\x00"
+ "\x5e\x00\xb7\x00\xe8\x00\x23\x00\x82\x00\x61\x00\x93\x00\x5a\x00"
+ "\x13\x00\x7c\x00\xb7\xff\xfe\xfe\x45\xff\x38\xff\x3f\xff\x37\xff"
+ "\x81\xff\x95\xff\x43\xff\x53\x00\xdf\x00\x23\x01\x27\x00\xee\xff"
+ "\x82\x00\x9d\x00\x73\x00\xcc\xff\xbd\xfd\x38\xfb\xb6\xf9\xb2\xf9"
+ "\x30\xfb\x5d\xfc\x3d\xfd\x5b\xfd\xcc\xfe\x90\x01\xf0\x03\x8a\x05"
+ "\x88\x05\x0b\x05\x0e\x05\x6a\x05\x70\x05\x95\x04\x40\x03\xbb\x01"
+ "\xff\x00\x92\x00\xcb\xff\x37\xff\xf4\xfe\xbc\xfe\xd2\xfe\xb9\xfe"
+ "\x91\xfe\xe7\xfe\x6a\xff\x9a\xff\x62\xff\x0c\xff\xb5\xfe\x89\xfe"
+ "\xa2\xfe\xd3\xfe\x30\xff\x7a\xff\xa7\xff\x7b\xff\x5c\xff\x36\xff"
+ "\xcd\xfe\x93\xfe\x49\xfe\xc1\xfe\x6a\xff\xf1\xff\x63\x00\xd1\x00"
+ "\x64\x01\x08\x02\x42\x02\x3b\x02\x7b\x01\xc2\x00\x9c\x00\x68\x00"
+ "\xd9\x00\xba\x00\xa2\x00\xb0\x00\x71\x00\xa4\x00\x5e\x00\xcd\x00"
+ "\xf9\x00\x02\x00\x0f\xff\x92\xfe\x45\xff\xc3\xff\xc9\xff\x93\xff"
+ "\x7b\xff\xf2\xff\x0e\x00\x18\x00\xff\xff\xce\xff\x8a\xfe\x55\xfb"
+ "\x70\xf8\x94\xf6\x06\xf7\xdd\xf8\xa0\xfa\x77\xfc\xab\xfe\xef\x01"
+ "\x9e\x05\x2f\x08\xc4\x08\xeb\x07\xfb\x06\xcc\x06\x76\x06\xbf\x05"
+ "\xea\x03\x07\x01\x9d\xfe\xb7\xfd\x42\xfe\xe0\xfe\xf6\xfe\xb5\xfe"
+ "\x5e\xfe\xe7\xfe\xae\xff\x38\x00\x95\x00\xaf\x00\xf5\x00\xdc\x00"
+ "\x38\x00\x4c\xff\x69\xfe\x3b\xfe\xb4\xfe\x51\xff\x80\xff\x11\xff"
+ "\x86\xfe\x3f\xfe\x45\xfe\x24\xfe\xe7\xfd\xde\xfd\x4c\xfe\x59\xff"
+ "\x43\x00\xc6\x00\xee\x00\x1d\x01\x7a\x01\xd8\x01\xee\x01\x51\x01"
+ "\xa4\x00\x64\x00\xa2\x00\x05\x01\x46\x01\x4a\x01\x19\x01\xd0\x00"
+ "\xa6\x00\x6f\x00\x9d\x00\xf8\x00\xca\x00\x40\x00\xa9\xff\x80\xff"
+ "\xbc\xff\x12\x00\x3f\x00\x7c\x00\x72\x00\x5f\x00\xdf\xff\xb2\xfe"
+ "\x15\xfc\x66\xf8\x88\xf5\x37\xf4\xaa\xf5\x82\xf8\x3f\xfb\xf5\xfd"
+ "\x0d\x01\x56\x05\x30\x09\xef\x0a\x5f\x0a\x0a\x08\x54\x06\xa6\x05"
+ "\x46\x05\x26\x04\x5c\x01\x7e\xfe\xca\xfc\x8b\xfc\x60\xfd\x90\xfe"
+ "\x9b\xff\x43\x00\xea\x00\x8c\x01\xc6\x01\xb3\x01\x86\x01\x5b\x01"
+ "\x37\x01\x92\x00\x36\xff\x96\xfd\x69\xfc\x4f\xfc\x11\xfd\x38\xfe"
+ "\x27\xff\x69\xff\x34\xff\xf5\xfe\xe0\xfe\xb5\xfe\x6a\xfe\x68\xfe"
+ "\xc2\xfe\x5b\xff\xe1\xff\xfa\xff\xf4\xff\x3d\x00\xd6\x00\x55\x01"
+ "\x7f\x01\x6f\x01\x36\x01\x43\x01\x66\x01\x8d\x01\xcc\x01\xda\x01"
+ "\x9d\x01\x3f\x01\x15\x01\xda\x00\xa3\x00\x70\x00\x3d\x00\x09\x00"
+ "\xdd\xff\xe3\xff\xf4\xff\xef\xff\xe5\xff\x02\x00\x9f\x00\x50\x01"
+ "\x9a\x00\x88\xfd\x5f\xf8\xd3\xf3\x57\xf2\x27\xf4\x85\xf7\x5b\xfa"
+ "\xd2\xfc\x46\x00\x4b\x05\x3c\x0a\x8f\x0c\x76\x0b\x61\x08\xd0\x05"
+ "\xec\x04\x62\x04\xe8\x02\xea\xff\x9f\xfc\xd3\xfa\x16\xfb\xd9\xfc"
+ "\xee\xfe\xd9\x00\xa5\x02\x4f\x04\x5e\x05\x3d\x05\x10\x04\xae\x02"
+ "\x8a\x01\xaa\x00\x79\xff\xa9\xfd\xbb\xfb\xa8\xfa\x04\xfb\x56\xfc"
+ "\xe8\xfd\x3a\xff\x30\x00\xd3\x00\xe7\x00\x35\x00\xb8\xfe\x22\xfd"
+ "\x94\xfc\x2c\xfd\x5d\xfe\x20\xff\x0e\xff\xde\xfe\x50\xff\x9a\x00"
+ "\xd8\x01\x45\x02\x0c\x02\xec\x01\x2d\x02\x99\x02\xc8\x02\x91\x02"
+ "\x10\x02\xa3\x01\x3a\x01\xaf\x00\x22\x00\xc0\xff\xb1\xff\xd8\xff"
+ "\x1a\x00\x0b\x00\xe9\xff\xda\xff\x0b\x00\x85\x00\xf5\x00\x19\x01"
+ "\x31\x00\x75\xfd\x4d\xf9\x44\xf5\x69\xf3\x7b\xf4\x70\xf7\xcd\xfa"
+ "\x00\xfe\xbf\x01\x32\x06\x53\x0a\x48\x0c\x48\x0b\x4d\x08\x0f\x05"
+ "\x9c\x02\xc0\x00\xe9\xfe\xce\xfc\x0f\xfb\x98\xfa\x94\xfb\xa5\xfd"
+ "\x34\x00\xe7\x02\x7a\x05\x64\x07\xdf\x07\x81\x06\xc7\x03\xe4\x00"
+ "\xb8\xfe\x39\xfd\xf0\xfb\x98\xfa\xa9\xf9\xc4\xf9\x07\xfb\x26\xfd"
+ "\x99\xff\x13\x02\x70\x04\x2b\x06\x88\x06\xff\x04\x6b\x01\x39\xfd"
+ "\x25\xfa\x07\xf9\xa8\xf9\xcb\xfa\xfc\xfb\x75\xfd\xc8\xff\x9f\x02"
+ "\xc3\x04\x68\x05\xc1\x04\x96\x03\x60\x02\x08\x01\x89\xff\x5a\xfe"
+ "\xef\xfd\x5a\xfe\x1b\xff\xde\xff\x8f\x00\x1f\x01\x8e\x01\x5a\x01"
+ "\xc4\x00\x5f\x00\xa7\x00\x7b\x01\x2d\x02\x3b\x02\xe3\x01\x30\x01"
+ "\x0d\x00\x31\xfd\xd9\xf7\x0a\xf3\xe9\xf0\x54\xf3\x44\xf8\xd6\xfc"
+ "\xd3\x00\x95\x04\x39\x09\x0d\x0d\xb2\x0d\x0e\x0b\x98\x06\xb0\x02"
+ "\x0c\x00\x9a\xfd\x12\xfb\xda\xf8\x52\xf8\xcf\xf9\x91\xfc\xd7\xff"
+ "\x48\x03\xfa\x06\x08\x0a\x1e\x0b\xbe\x09\x46\x06\x2b\x02\x77\xfe"
+ "\x4f\xfb\xe2\xf8\x2a\xf7\xc1\xf6\xb9\xf7\xd0\xf9\xbd\xfc\x03\x00"
+ "\x78\x03\x82\x06\x6c\x08\xac\x08\xfe\x06\xd0\x03\xc3\xff\x96\xfb"
+ "\x8c\xf8\x66\xf7\x6d\xf8\xbe\xfa\x4e\xfd\xac\xff\xe4\x01\xf7\x03"
+ "\x4e\x05\x6d\x05\x50\x04\xaf\x02\x57\x01\x4a\x00\x3a\xff\x40\xfe"
+ "\x9c\xfd\xde\xfd\x89\xfe\x34\xff\x86\xff\xd1\xff\x68\x00\x1f\x01"
+ "\x59\x01\x38\x01\x53\x01\x00\x02\xd3\x02\x65\x02\xe3\xff\xf0\xfa"
+ "\xec\xf5\x8d\xf2\x34\xf2\x9c\xf4\xb1\xf8\x4e\xfe\x9d\x04\xad\x0a"
+ "\x9e\x0e\x37\x0f\x13\x0d\x50\x09\x12\x05\xd8\x00\xb9\xfc\xb3\xf9"
+ "\x42\xf8\x3a\xf8\xef\xf8\x46\xfa\x03\xfd\x6b\x01\x72\x06\x2a\x0a"
+ "\x3d\x0b\x0a\x0a\x5b\x07\xc8\x03\x70\xff\xa4\xfa\xbb\xf6\xcc\xf4"
+ "\x00\xf5\xb8\xf6\x38\xf9\x7c\xfc\x94\x00\xf6\x04\x8a\x08\x6e\x0a"
+ "\x84\x0a\x03\x09\x18\x06\xee\x01\x4d\xfd\x6b\xf9\x0a\xf7\xe6\xf5"
+ "\xb2\xf5\xf3\xf6\x34\xfa\x08\xff\xc0\x03\x2a\x07\x21\x09\xc1\x09"
+ "\xe5\x08\xe2\x05\x1d\x01\x36\xfc\x0f\xf9\x5b\xf8\x85\xf9\xd5\xfb"
+ "\x10\xff\xb2\x02\xa4\x05\xae\x06\x8c\x05\x98\x03\x10\x02\x32\x01"
+ "\x5e\x00\x83\xff\x40\xff\xa7\xff\xce\xff\xc4\xfe\xe2\xfc\x77\xfb"
+ "\x81\xfa\xa4\xf8\x72\xf5\x02\xf3\xed\xf3\x43\xf8\xcd\xfd\x8b\x02"
+ "\xba\x06\x00\x0b\x5c\x0e\xd6\x0e\xd8\x0b\x10\x07\x86\x02\xc0\xfe"
+ "\x6d\xfb\xd6\xf8\x0f\xf8\x52\xf9\x80\xfb\xb9\xfd\x64\x00\x7e\x04"
+ "\x63\x09\xef\x0c\x62\x0d\xd4\x0a\x96\x06\x5c\x01\x49\xfb\x33\xf5"
+ "\x05\xf1\x77\xf0\x56\xf3\xb5\xf7\x20\xfc\x48\x00\x85\x04\x56\x08"
+ "\x9a\x0a\xd1\x0a\x92\x09\x86\x07\x76\x04\x07\x00\xc9\xfa\xa4\xf6"
+ "\xe8\xf4\x1f\xf5\xd5\xf5\x30\xf7\xe0\xfa\xd4\x00\xe8\x06\x70\x0a"
+ "\x2e\x0b\x8e\x0a\xf2\x08\x97\x05\x31\x00\xab\xfa\x80\xf7\x38\xf7"
+ "\xb5\xf8\x10\xfb\x6e\xfe\xb8\x02\x1f\x06\x0b\x07\xb7\x05\x1b\x04"
+ "\x3d\x03\x4e\x02\x85\x00\xd3\xfe\x8f\xfe\x96\xff\xd6\xff\xd8\xfe"
+ "\x4e\xfd\xd6\xfc\xc8\xfb\x72\xf8\x82\xf4\xd2\xf1\xa7\xf3\xed\xf7"
+ "\xc4\xfc\xec\x01\x3e\x07\xca\x0c\x99\x0f\x7c\x0e\xe3\x0a\x62\x06"
+ "\x80\x02\x57\xfe\x49\xfa\x04\xf8\xdc\xf7\x4c\xf9\xb1\xfa\xa2\xfc"
+ "\x8b\x00\x19\x06\x87\x0b\x22\x0e\x89\x0d\xce\x0a\x4b\x06\x7c\x00"
+ "\xb8\xf9\x3e\xf4\xd8\xf1\x71\xf2\xe9\xf4\x06\xf8\xf8\xfb\xa7\x00"
+ "\x02\x05\x1d\x08\xb3\x09\x57\x0a\xe3\x09\xaf\x07\x97\x03\x8d\xfe"
+ "\x25\xfa\x0c\xf7\x78\xf5\xa2\xf5\x9e\xf7\xb3\xfa\x5b\xfd\x9f\xff"
+ "\xe7\x01\x8d\x04\xbf\x06\x56\x07\xa5\x06\x1e\x05\x07\x03\x25\x00"
+ "\x9b\xfc\xdc\xf9\x17\xf9\x5d\xfa\xfc\xfc\x40\x00\xff\x03\x05\x07"
+ "\x6a\x08\x96\x07\xdd\x05\x22\x04\xb9\x02\x31\x01\x60\xff\xf2\xfd"
+ "\x69\xfd\x44\xfd\x1b\xfd\x68\xfc\x93\xfc\xdf\xfd\x87\xff\x0c\xff"
+ "\x68\xf9\x35\xf4\xe6\xf1\xe2\xf3\x85\xf7\x5d\xfa\x3d\xff\xb4\x05"
+ "\x70\x0b\xcb\x0d\x50\x0c\x9c\x0a\xa8\x08\xef\x04\xbe\xff\xfb\xfa"
+ "\xdb\xf9\x47\xfa\xff\xf9\xa8\xf9\xf2\xfb\x0a\x02\x71\x08\xfe\x0b"
+ "\xdd\x0c\x2c\x0c\x64\x0a\xa9\x05\xb0\xfe\xaa\xf8\xb3\xf5\x2d\xf5"
+ "\xb8\xf4\x7d\xf4\x85\xf6\x16\xfb\x58\x00\x49\x04\x6b\x07\xd4\x0a"
+ "\x44\x0d\x52\x0c\x55\x07\xdf\x00\x41\xfb\x01\xf7\xbf\xf3\x3c\xf2"
+ "\xfc\xf3\x5a\xf8\x22\xfd\xa3\x00\xdd\x02\xd1\x04\x77\x06\xe7\x06"
+ "\xee\x05\x02\x04\xe5\x01\xb9\xff\x8f\xfd\x3d\xfc\xe7\xfb\x9e\xfc"
+ "\xb7\xfd\xfb\xfe\x96\x00\xb8\x02\xe0\x04\x72\x06\x24\x07\x50\x07"
+ "\xda\x06\x91\x05\x72\x03\xeb\x00\x83\xfe\x7a\xfc\xba\xfa\x6a\xf9"
+ "\x69\xf9\xde\xfa\x5a\xfd\x5b\xff\xe4\x00\xc4\x01\x0c\x02\x84\xfe"
+ "\x6b\xf8\xf6\xf3\xff\xf2\xfe\xf4\xff\xf6\xe9\xf9\x7a\xff\x36\x06"
+ "\x04\x0b\x7a\x0c\x53\x0c\x18\x0c\xc1\x09\x09\x05\x6e\xff\xed\xfb"
+ "\xaa\xfa\xad\xf9\xd9\xf8\x1c\xfa\xd2\xfe\xe2\x04\x41\x09\x4a\x0b"
+ "\xe5\x0b\x47\x0b\x68\x08\x37\x03\xe7\xfd\x26\xfa\xd0\xf7\xa5\xf5"
+ "\xe7\xf3\x52\xf4\x71\xf7\xea\xfb\x78\x00\xea\x04\x27\x09\xb6\x0b"
+ "\x08\x0b\x23\x07\xf0\x01\x01\xfd\x95\xf8\x20\xf5\x73\xf3\x88\xf4"
+ "\x97\xf7\x0f\xfb\x64\xfe\xd9\x01\xbf\x05\xc9\x08\xa2\x09\x52\x08"
+ "\x8f\x05\x06\x02\x22\xfe\x9b\xfa\xcf\xf8\x51\xf9\x92\xfb\x98\xfe"
+ "\xb5\x01\xae\x04\xdb\x06\x89\x07\xbd\x06\x29\x05\xc6\x03\xd3\x02"
+ "\x17\x02\x63\x01\xd8\x00\x50\x00\x8d\xff\x40\xfe\x9e\xfc\x57\xfb"
+ "\xc3\xfa\x0b\xfb\x06\xfc\xb1\xfd\xcd\xff\xb5\x01\xa1\x02\x58\x02"
+ "\xe6\x00\x8a\xfe\x9a\xfa\x6f\xf6\x13\xf4\x19\xf4\x0b\xf6\x64\xf8"
+ "\xc8\xfb\xf1\x00\xb2\x06\x1b\x0b\xd1\x0c\xb6\x0c\x5d\x0b\x6e\x08"
+ "\x62\x04\x7b\x00\x3b\xfe\x2b\xfd\x4e\xfc\xfb\xfb\x2c\xfd\xf9\xff"
+ "\x16\x03\x66\x05\xfe\x06\xed\x07\xad\x07\x99\x05\x22\x02\x77\xfe"
+ "\x2a\xfb\x64\xf8\x89\xf6\x32\xf6\x96\xf7\x17\xfa\xfe\xfc\xfc\xff"
+ "\x9f\x02\x43\x04\x5c\x04\x25\x03\x6d\x01\x6f\xff\x80\xfd\xf1\xfb"
+ "\x6c\xfb\x35\xfc\xb7\xfd\x2f\xff\x7d\x00\xd6\x01\x2e\x03\x2a\x04"
+ "\x86\x04\xaa\x04\xc3\x04\x37\x04\xb6\x02\x0c\x01\xe4\xff\xa0\xff"
+ "\x5e\xff\xdc\xfe\xbd\xfe\xa5\xff\x26\x00\xd6\x00\x11\x01\xf9\x01"
+ "\x2b\x00\xdf\xf8\x3f\xf3\x0c\xf2\xed\xf5\xc8\xf9\x7b\xfb\xa1\xff"
+ "\x5a\x05\x9d\x09\xae\x0a\xa1\x09\x98\x09\xb0\x07\x29\x02\xf0\xfb"
+ "\xa3\xf8\x10\xf9\x7f\xf9\xc3\xf8\x13\xfa\x01\xff\x0c\x05\xd1\x08"
+ "\x5e\x0a\x6b\x0b\xfd\x0a\x84\x07\xa4\x01\xc8\xfc\x52\xfa\x84\xf8"
+ "\x61\xf6\x2f\xf5\x9e\xf6\x1b\xfa\xd9\xfd\xe1\x01\x89\x06\x07\x0b"
+ "\x04\x0d\x69\x0b\x7c\x07\xa4\x02\xd5\xfd\x63\xf9\x8a\xf6\xf5\xf5"
+ "\x1f\xf7\x17\xf9\x2b\xfb\xcd\xfd\xc9\x00\xc1\x03\x2f\x06\x62\x07"
+ "\x3b\x07\x46\x05\xd2\x01\x42\xfe\x95\xfb\x68\xfa\x3e\xfa\x4c\xfa"
+ "\xe5\xfa\x47\xfc\x8f\xfe\xa6\x01\x04\x05\xbb\x07\x87\x08\x3d\x07"
+ "\x10\x05\x47\x03\xff\x01\xcb\x00\xe3\xff\x77\xff\x0a\xff\xb9\xfd"
+ "\xdb\xfb\x27\xfb\x54\xfb\x34\xfb\xb8\xfa\x56\xfa\x54\xfb\xb5\xfc"
+ "\x96\xfd\x9e\xfe\xb4\x00\xb4\x03\x44\x05\x9a\x04\xd7\x02\x05\x01"
+ "\x5a\xff\x97\xfd\xe2\xfc\xcc\xfd\xf4\xfe\x2b\xff\xee\xfe\xfe\xff"
+ "\xb5\x02\xad\x05\xb7\x07\x7e\x08\xde\x07\xcf\x05\xc0\x02\x1f\x00"
+ "\x90\xfe\xa1\xfd\x6e\xfc\xf8\xfa\x3d\xfa\xb8\xfa\x65\xfc\xe9\xfe"
+ "\xef\x01\xb1\x04\xf1\x05\x52\x05\x85\x03\x77\x01\xd3\xff\x55\xfe"
+ "\xb2\xfc\x46\xfb\x1f\xfa\xa3\xf9\x8d\xf9\x8b\xf9\xfb\xfa\xed\xfd"
+ "\x7f\x01\x27\x04\x23\x05\x94\x05\xb6\x05\x68\x05\x54\x04\x49\x02"
+ "\xb4\xff\x7f\xfc\xda\xf9\xab\xf9\x84\xfc\xcf\x00\xbb\x03\xbf\x04"
+ "\x11\x05\x55\x05\x07\x05\xde\x03\x6b\x02\xc3\x00\x4f\xfe\xd3\xfb"
+ "\xf2\xfa\xc4\xfb\x9a\xfc\x2b\xfc\x78\xfb\x20\xfc\xea\xfc\xd9\xfb"
+ "\xdc\xfa\x15\xfc\x17\xff\x17\x01\xa1\x00\x1c\x01\x45\x03\xf1\x04"
+ "\xcc\x04\x8c\x03\x8f\x03\x66\x03\x78\x01\x44\xff\x97\xfe\x95\xff"
+ "\xad\xff\x58\xfe\x0f\xfe\x95\xff\xdb\x01\x33\x03\xc2\x03\x9d\x04"
+ "\xb9\x04\x6e\x03\x87\x01\x16\x00\xfe\xfe\x03\xfd\xbe\xfa\xff\xf9"
+ "\x19\xfb\x0f\xfd\xf9\xfe\xec\x00\xae\x02\x47\x03\xcf\x02\x3e\x02"
+ "\x1a\x02\x80\x01\xf9\xff\x0a\xfe\x90\xfc\xa9\xfb\x6f\xfb\x73\xfc"
+ "\x8e\xfe\x92\x00\x68\x01\x8a\x01\x05\x02\xbf\x02\xf9\x02\x87\x02"
+ "\x9b\x01\xb5\x00\x56\xff\x57\xfe\x6a\xfe\x36\xff\xbd\xff\xc7\xff"
+ "\x72\xff\xd2\xff\xa7\x00\x20\x01\x52\x01\x6a\x01\x63\x01\x86\x00"
+ "\x4a\xfe\xd8\xfb\x0a\xfb\xce\xf9\x29\xf9\x16\xf9\xc4\xfa\xfc\xfd"
+ "\x69\x00\x66\x03\x52\x06\x7e\x08\x11\x09\x6b\x07\x8e\x05\x85\x03"
+ "\xbe\x00\xc3\xfd\x13\xfb\x31\xfa\x97\xfa\xd1\xfb\x4f\xfe\x6b\x01"
+ "\x1b\x04\x41\x05\x29\x05\x13\x05\x83\x04\x2b\x03\xdd\x00\x4a\xfe"
+ "\xed\xfb\xe4\xf9\xd5\xf8\x5d\xf9\x3c\xfb\x8a\xfd\xa9\xff\xe3\x01"
+ "\x41\x04\x4a\x06\x3d\x07\xc6\x06\x41\x05\x95\x02\x71\xff\x8f\xfc"
+ "\xd3\xfa\x17\xfa\x06\xfa\x31\xfa\x7a\xfa\x75\xfb\xa5\xfd\xbf\x00"
+ "\x39\x03\x15\x04\xf9\x03\x17\x04\x4e\x04\xc9\x03\x21\x02\xd9\xff"
+ "\xb3\xfd\x2a\xfc\xbe\xfb\x1b\xfd\x7b\xff\x89\x01\xc5\x02\xa5\x03"
+ "\xf5\x04\x20\x06\xc9\x05\xfc\x03\xa0\x01\x8b\xff\x14\xfe\x37\xfd"
+ "\x43\xfd\x3c\xfd\x50\xfb\xcf\xf8\x6b\xf8\x3a\xfa\xc1\xfb\xd9\xfa"
+ "\xdb\xf9\xf0\xfa\x1d\xfe\x0c\x02\xee\x04\xa2\x06\x41\x06\x29\x04"
+ "\x0b\x03\xe4\x03\xdd\x04\x4b\x03\x46\xff\x16\xfc\xad\xfb\x8e\xfd"
+ "\xe0\xff\x73\x01\x0e\x02\x01\x02\x85\x02\xa2\x04\xc9\x06\xad\x06"
+ "\x17\x04\x8b\x00\x7f\xfe\xb9\xfd\x97\xfc\x63\xfa\x58\xf8\xf7\xf7"
+ "\xde\xf9\x74\xfd\x08\x01\xe3\x02\xe5\x02\x73\x02\x04\x03\x8a\x04"
+ "\x56\x04\xac\x01\x6f\xfe\xd4\xfc\x13\xfd\xb0\xfd\x03\xfe\x2b\xfe"
+ "\x83\xfe\xe3\xff\x1c\x02\x63\x04\x42\x05\xa7\x04\xc6\x03\x6e\x03"
+ "\xa5\x02\x82\x00\x9d\xfd\xa4\xfb\x24\xfb\x27\xfb\xc4\xfb\x50\xfc"
+ "\x0d\xfd\xe8\xfd\xd8\xfe\xcf\x00\xed\x01\x30\x01\x1f\xff\x53\xfa"
+ "\x3d\xf9\xe1\xfb\x63\xfd\xba\xfb\x2a\xf9\x79\xfd\x91\x04\xe2\x08"
+ "\x54\x09\xe9\x07\xfd\x07\x02\x08\x57\x07\xd4\x06\x16\x04\xab\xfe"
+ "\xa0\xf9\x00\xf9\xfd\xfb\xfd\xfd\x9e\xfd\xea\xfc\xaf\xfe\x1c\x02"
+ "\x8a\x04\x73\x05\x98\x04\xff\x01\x57\xff\x2c\xfe\xd3\xfd\xf8\xfb"
+ "\xd0\xf8\x97\xf7\x0d\xfa\xe5\xfd\x0e\x00\xf1\x00\x1d\x02\x18\x04"
+ "\x45\x06\x16\x07\x96\x06\x45\x04\x02\x01\xd7\xfe\x1d\xfe\xbf\xfd"
+ "\x0e\xfc\x43\xfa\x71\xfa\x97\xfc\x35\xff\x92\x00\x2a\x01\xea\x01"
+ "\x98\x02\x20\x03\xd5\x02\xc5\x01\x67\xff\x4f\xfc\x3a\xfb\x19\xfc"
+ "\xd6\xfc\xe0\xfb\x7f\xfb\xbc\xfd\x39\x01\x05\x04\x40\x05\xda\x05"
+ "\x01\x06\xa8\x05\x2c\x05\xda\x03\x72\x01\xc7\xfe\x36\xfd\x38\xfd"
+ "\x72\xfd\xb6\xfd\x96\xfe\xee\xff\x3d\x01\x59\x02\xf8\x02\xa4\x02"
+ "\x5f\x01\x03\x00\x0c\xff\x5c\xfe\xe7\xfd\xe7\xfc\x62\xfb\x78\xfa"
+ "\x91\xfa\xc1\xfa\x38\xfa\xc3\xf9\x7c\xfa\xed\xfb\xa6\xfd\xc2\xff"
+ "\x50\x02\x9a\x04\xf3\x05\x12\x07\x1d\x08\x57\x08\x2a\x07\x16\x05"
+ "\x11\x03\x49\x01\xaf\xff\x49\xfe\x6a\xfd\xf4\xfc\xf4\xfc\xae\xfd"
+ "\xf5\xfe\x9d\x00\x11\x02\xf5\x02\x56\x03\x34\x03\x6a\x02\x18\x01"
+ "\x73\xff\xa6\xfd\x1f\xfc\x5b\xfb\x87\xfb\x71\xfc\xaf\xfd\x31\xff"
+ "\x32\x01\x60\x03\xc1\x04\xdb\x04\x74\x04\xa5\x03\xa2\x02\x08\x01"
+ "\x39\xff\xad\xfd\x6d\xfc\x72\xfb\x7b\xfa\x1d\xfa\x1f\xfa\x80\xfa"
+ "\xc3\xfa\x62\xfb\x95\xfc\xed\xfd\x44\xff\x68\x00\x6a\x01\x4a\x02"
+ "\x0a\x03\xaf\x03\xe3\x03\x77\x03\xc0\x02\x6b\x02\xaf\x02\xbb\x02"
+ "\x79\x02\x4b\x02\xbf\x02\x53\x03\x45\x03\xde\x02\x92\x02\x47\x02"
+ "\x94\x01\x65\x00\x2c\xff\x4e\xfe\xd4\xfd\x55\xfd\xc9\xfc\x98\xfc"
+ "\xd9\xfc\x32\xfd\x8a\xfd\xd4\xfd\x3f\xfe\xb8\xfe\x25\xff\x9b\xff"
+ "\x2c\x00\x7f\x00\x63\x00\xe5\x00\x81\x01\x90\x01\x4a\xff\x68\xfd"
+ "\x43\xfe\x31\xff\xbd\xfd\xd7\xfb\x29\xfd\x0e\x00\xe8\x01\x95\x02"
+ "\xa2\x03\xfb\x04\x5b\x05\x45\x05\xfc\x04\x99\x03\x9c\x01\x46\x00"
+ "\x50\xff\xb2\xfd\x98\xfc\xbc\xfc\x9a\xfd\xe3\xfd\x8c\xfe\x75\xff"
+ "\x4f\x00\x64\x00\x76\x00\x76\x00\xa6\xff\xab\xfe\x7b\xfe\x08\xfe"
+ "\xb1\xfd\x79\xfd\x54\xfe\x11\x00\xd9\x00\xd1\x01\x91\x01\x44\xff"
+ "\x19\xfc\x1a\xff\xbf\x00\x9f\xfc\x2d\xf8\x04\xfb\x94\x01\xc1\x03"
+ "\xb5\x02\x2c\x02\x0f\x05\x14\x07\x92\x07\x6d\x06\xd9\x03\xc2\x00"
+ "\xfa\xff\x4d\x00\x88\xfe\x84\xfb\x04\xfb\x11\xfd\xab\xfe\x78\xfe"
+ "\x67\xfe\xf5\xff\xa2\x02\x0c\x04\x82\x03\x72\x02\xea\x01\xbf\x01"
+ "\xb1\x00\xed\xfe\x01\xfd\x28\xfc\x54\xfc\xa2\xfc\x71\xfc\x92\xfc"
+ "\xa6\xfd\x76\xff\xcd\x00\x75\x01\x77\x01\x92\x01\x53\x02\x2a\x03"
+ "\x75\x02\xaa\xff\xf7\xfd\x64\xfe\xc1\xfe\x26\xfd\xc1\xfb\xca\xfc"
+ "\x3f\xff\x4a\x01\xe6\x01\x53\x02\x36\x03\x23\x04\x52\x04\x73\x03"
+ "\xe7\x01\x93\x00\x74\x00\x9d\x00\xf3\xff\x2a\xff\xa1\xff\xfa\x00"
+ "\xa9\x01\x0c\x01\x87\x00\xbf\x00\x1a\x01\x46\x00\xa6\xfe\x9e\xfd"
+ "\x48\xfd\x67\xfd\xfb\xfb\x09\xfa\x00\xf9\x7b\xf9\xed\xf9\xaf\xf9"
+ "\x0a\xfa\x57\xfb\x50\xfd\x47\xff\xbd\x01\xaf\x03\x17\x05\x8e\x06"
+ "\x32\x08\xd0\x08\xf4\x07\x93\x06\x9c\x05\xe4\x04\x96\x03\xc3\x01"
+ "\x35\x00\x84\xff\x50\xff\xfb\xfe\xd1\xfe\x13\xff\x39\xff\x06\xff"
+ "\xda\xfe\xdd\xfe\x8c\xfe\x1b\xfe\xcd\xfd\xcd\xfd\xd7\xfd\x17\xfe"
+ "\x93\xfe\x39\xff\x68\xff\xa6\xff\x71\x00\x5c\x01\x89\x01\xfd\x00"
+ "\x30\x01\x6d\x01\x9b\x01\x9a\x00\x24\xff\x6d\xfe\xaa\xfd\x61\xfc"
+ "\x52\xfb\xa7\xfa\x3e\xfa\xbb\xfa\xb2\xfb\xc8\xfc\xf9\xfd\xaa\xff"
+ "\xa3\x01\x41\x03\x47\x04\x0b\x05\x7d\x05\xaa\x05\x51\x05\xc9\x04"
+ "\xfe\x03\x15\x03\x92\x02\x2c\x02\x77\x01\xd0\x00\xab\x00\x8b\x00"
+ "\x28\x00\x80\xff\x0b\xff\xb0\xfe\x4a\xfe\xf5\xfd\xa8\xfd\x58\xfd"
+ "\x2f\xfd\x71\xfd\xe5\xfd\x6c\xfe\x02\xff\x6d\xff\xa2\xff\x16\x00"
+ "\x9a\x00\xf7\x00\xcd\x00\xae\x00\xa3\x00\xa1\x00\xa1\x00\xa2\x00"
+ "\x6f\x00\x4d\xff\x20\xfe\x29\xfc\xb2\xfb\x70\xfc\xcb\xfb\x42\xfa"
+ "\x1e\xfb\x2c\xfe\x8d\x00\xff\x01\x13\x03\xb0\x04\x55\x06\x5f\x07"
+ "\xc7\x06\xad\x05\xd0\x04\x11\x04\x01\x03\x73\x01\x31\x00\xf6\xff"
+ "\xeb\xff\x74\xff\x8a\xfe\x2a\xfe\x9a\xfe\xd4\xfe\x10\xfe\x92\xfc"
+ "\x00\xfc\xb5\xfc\xce\xfc\xaf\xfb\x43\xfb\x21\xfc\x73\xfd\x33\xfe"
+ "\x95\xfe\x32\xff\x3b\x00\x7d\x01\x37\x02\xfe\x01\x0a\x02\x83\x02"
+ "\xbb\x02\x8b\x02\x13\x02\xf4\x01\x1f\x02\x15\x02\xb4\x01\x0f\x01"
+ "\xc3\x00\xfa\x00\xef\x00\xf9\xff\x2a\xff\x10\xff\x69\xff\xf7\xfe"
+ "\x34\xfe\xa6\xfd\x10\xfe\xd4\xfe\x51\xff\x61\xff\xbb\xff\x7e\x00"
+ "\x4f\x01\xde\x01\xcc\x01\xae\x01\x8f\x01\x92\x01\x33\x01\x98\x00"
+ "\x8d\xff\x6d\xff\xd5\xfe\xaf\xfe\x0b\xfe\x6f\xfe\x2d\xfe\x67\xfe"
+ "\x82\xfe\x83\xff\x86\xff\x0e\x00\x73\xff\x01\x00\xeb\xfe\x29\xfb"
+ "\x60\xfe\x3d\xff\xfd\xfc\x4c\xfa\x08\xfd\xb8\xff\xdb\x00\x6e\x00"
+ "\xa2\x01\x1f\x02\x63\x04\xef\x05\xac\x05\x0b\x05\x2d\x04\xfe\x05"
+ "\xeb\x05\xf1\x03\xf4\x01\x35\x02\xbc\x01\x93\x00\x72\xfe\xcc\xfd"
+ "\x04\xfc\x9c\xfc\xaf\xfc\x71\xfb\x40\xfa\x20\xfb\x84\xfc\x88\xfc"
+ "\x6f\xfc\x7b\xfd\xb2\xfe\xa1\xff\xd1\x00\x2a\x01\xc8\x01\x3a\x02"
+ "\x30\x03\x21\x03\xcc\x02\x0d\x02\xf5\x01\xc2\x01\x65\x01\x71\x00"
+ "\xb9\xff\x75\xff\x6c\xff\x40\xff\x1c\xff\xd0\xfe\x37\xff\xda\xff"
+ "\xdf\xff\x0d\x00\x1c\x00\x85\x00\x82\x00\x29\x00\xcb\xff\xbd\xff"
+ "\xad\xff\xb6\xff\xa1\xff\x7a\xff\x94\xff\x01\x00\x87\x00\x60\x00"
+ "\x1b\x00\x56\x00\x79\x00\x5a\x00\xd2\xff\x86\xff\x6f\xff\x60\xff"
+ "\x4f\xff\xf6\xfe\xb3\xfe\xc4\xfe\x57\xff\x73\xff\x60\xff\x75\xff"
+ "\xfe\xff\x3b\x00\x19\x00\x4a\x00\x4d\x00\xf3\xff\xd8\xff\xdd\xff"
+ "\xae\xff\xcd\xff\xd5\xff\x09\x00\x30\x00\x68\x00\x80\x00\x9d\x00"
+ "\xae\x00\xcd\x00\xba\x00\xa5\x00\xa6\x00\xb0\x00\xa1\x00\x9d\x00"
+ "\xcb\x00\x06\x01\x20\x01\x12\x01\x4b\x01\x45\x01\x3b\x01\x18\x01"
+ "\xd2\x00\x77\x00\x35\x00\xb5\xff\x7c\xff\x2c\xff\xe7\xfe\xb1\xfe"
+ "\x92\xfe\x7c\xfe\x74\xfe\x7a\xfe\x9e\xfe\xc4\xfe\xc8\xfe\xfa\xfe"
+ "\x56\xff\xc2\xff\xd8\xff\x2f\x00\x71\x00\xba\x00\xdc\x00\x13\x01"
+ "\x2e\x01\x45\x01\x1c\x01\x04\x01\xf4\x00\xc0\x00\x86\x00\x16\x00"
+ "\xb6\xff\x51\xff\x1b\xff\xc3\xfe\x69\xfe\x16\xfe\x2b\xfe\x46\xfe"
+ "\x31\xfe\x3c\xfe\x7f\xfe\xc1\xfe\xe9\xfe\x28\xff\x7a\xff\xab\xff"
+ "\xea\xff\x3d\x00\x63\x00\xa2\x00\xe3\x00\x1c\x01\x57\x01\x8b\x01"
+ "\xbc\x01\x02\x02\x50\x02\x60\x02\x59\x02\x55\x02\x4f\x02\x3f\x02"
+ "\xe7\x01\x82\x01\x26\x01\xc0\x00\x67\x00\x16\x00\xa6\xff\x35\xff"
+ "\xeb\xfe\xdb\xfe\x9c\xfe\x67\xfe\x59\xfe\x59\xfe\x5d\xfe\x63\xfe"
+ "\x72\xfe\x7e\xfe\x87\xfe\xc3\xfe\x20\xff\x37\xff\x3f\xff\x52\xff"
+ "\xb6\xff\xd9\xff\xd6\xff\xd0\xff\xe0\xff\xee\xff\x12\x00\x10\x00"
+ "\x15\x00\x31\x00\x61\x00\x7d\x00\x7c\x00\xa7\x00\xbc\x00\xc4\x00"
+ "\xcf\x00\xe7\x00\xcc\x00\xd8\x00\xdd\x00\x03\x01\xe8\x00\xd4\x00"
+ "\xf3\x00\x03\x01\xe9\x00\xf0\x00\xfb\x00\xc3\x00\x96\x00\x84\x00"
+ "\x6a\x00\x07\x00\xa4\xff\x61\xff\x24\xff\xe5\xfe\xa5\xfe\x60\xfe"
+ "\x2c\xfe\x11\xfe\x0e\xfe\xe8\xfd\xc1\xfd\xbc\xfd\xbe\xfd\xc0\xfd"
+ "\xec\xfd\x1f\xfe\x52\xfe\xa2\xfe\x39\xff\xd3\xff\x2d\x00\xa7\x00"
+ "\x3e\x01\xce\x01\x36\x02\x79\x02\xb0\x02\xc4\x02\xe0\x02\xea\x02"
+ "\xc0\x02\x7b\x02\x3c\x02\x10\x02\xca\x01\x77\x01\x31\x01\xf5\x00"
+ "\xb7\x00\x81\x00\x44\x00\xf6\xff\xb8\xff\x9d\xff\x69\xff\x0c\xff"
+ "\xc0\xfe\x92\xfe\x60\xfe\x27\xfe\xf3\xfd\xcb\xfd\xc4\xfd\xe8\xfd"
+ "\x04\xfe\x1a\xfe\x39\xfe\x71\xfe\xcb\xfe\x11\xff\x45\xff\x6f\xff"
+ "\xbb\xff\x18\x00\x5c\x00\x71\x00\x81\x00\x9d\x00\xb1\x00\xb4\x00"
+ "\xa5\x00\xa4\x00\x8d\x00\x8c\x00\xae\x00\xc6\x00\xc3\x00\xd2\x00"
+ "\x00\x01\x38\x01\x49\x01\x54\x01\x6d\x01\x76\x01\x89\x01\x83\x01"
+ "\x64\x01\x2a\x01\xfb\x00\xd1\x00\x82\x00\x19\x00\xd0\xff\x82\xff"
+ "\x41\xff\xf4\xfe\xad\xfe\x72\xfe\x3f\xfe\x2e\xfe\x20\xfe\x18\xfe"
+ "\x0b\xfe\x24\xfe\x57\xfe\x96\xfe\xb3\xfe\xef\xfe\x40\xff\x85\xff"
+ "\xc2\xff\xf6\xff\x1b\x00\x4a\x00\x6c\x00\x82\x00\x94\x00\x89\x00"
+ "\x73\x00\x72\x00\x7b\x00\x7e\x00\x7f\x00\x7f\x00\x93\x00\xb0\x00"
+ "\xe2\x00\x03\x01\x0f\x01\x2c\x01\x50\x01\x55\x01\x4d\x01\x42\x01"
+ "\x29\x01\xfc\x00\xcc\x00\x9a\x00\x62\x00\x1c\x00\xdc\xff\xb8\xff"
+ "\x88\xff\x5b\xff\x36\xff\x19\xff\x09\xff\xe3\xfe\xdc\xfe\xe1\xfe"
+ "\xf1\xfe\xd4\xfe\xda\xfe\xe7\xfe\x0b\xff\x19\xff\x45\xff\x77\xff"
+ "\xa7\xff\xdc\xff\x2d\x00\x77\x00\xae\x00\xcc\x00\xf3\x00\x19\x01"
+ "\xf8\x00\x0b\x01\xa4\x00\x13\x01\xa7\x00\x4b\x00\x80\x00\xf9\xff"
+ "\x0b\x00\x9f\xff\xdc\xff\x4a\xff\x4c\xfd\x29\x00\x8e\xff\x45\xff"
+ "\xee\xff\x91\x00\x21\x01\xb2\xff\x6d\x02\x77\x00\x59\x00\x44\x00"
+ "\xdb\xff\x60\xfe\xd7\xfe\x44\x00\xd0\xfe\x5f\xff\x4a\xff\x2f\x00"
+ "\x5d\x00\xbb\x00\xfe\x00\x52\x00\xd4\xff\x11\x00\xd0\xff\xb6\xff"
+ "\xfe\xfe\xcc\xff\x9a\xff\x09\xff\x85\xff\xc8\xff\xed\xff\xa2\xff"
+ "\x8f\x00\x14\x00\x80\xff\x0b\x00\x2e\x00\x93\xff\xaa\xff\x67\x00"
+ "\xe6\xff\xf9\xff\xb1\x00\xd4\x00\xc4\x00\xed\x00\xd2\x01\x04\x01"
+ "\x0a\x01\x59\x01\xbb\x00\x94\x00\x99\x00\x94\x00\xd0\xff\x9d\xff"
+ "\x08\x00\x4a\xff\x2d\xff\xbe\xff\x34\xff\x51\xff\x4a\xff\xbb\xff"
+ "\x48\xff\xad\xff\x97\xff\xcc\xfe\xca\xff\x44\xff\xc7\xff\xbd\xff"
+ "\xfc\xff\x81\x00\xd3\x00\x34\x01\xaf\x00\x67\x01\xc9\x00\x6c\x00"
+ "\x10\x00\x95\xff\x13\xff\x0a\xff\x18\xff\x55\xfe\x68\xfe\xad\xfe"
+ "\xbf\xfe\xb6\xfe\xa0\xfe\xa9\xfe\x5c\xff\xc5\xfe\x33\xfe\x07\xff"
+ "\x14\x00\xd6\xff\x8e\xff\xa3\x00\xb1\x01\x26\x02\x73\x02\x90\x02"
+ "\xc9\x02\x72\x03\x9a\x03\xbf\x02\xd6\x01\x09\x02\xea\x01\xe6\x00"
+ "\x01\x00\xb0\xff\x8d\xff\x2d\xff\xbe\xfe\x4f\xfe\x23\xfe\x9b\xfe"
+ "\xd4\xfe\xa2\xfe\x5e\xfe\x0a\xff\xa5\xff\x9b\xff\x75\xff\x82\xff"
+ "\x0d\x00\x25\x00\x00\x00\xb6\xff\xe5\xff\x14\x00\x23\x00\xdb\xff"
+ "\x9d\xff\xe4\xff\x1f\x00\x0e\x00\xb5\xff\xbb\xff\xe2\xff\xd9\xff"
+ "\xd1\xff\xc1\xff\x94\xff\xcd\xff\x02\x00\xfc\xff\xfc\xff\x11\x00"
+ "\x4e\x00\x4b\x00\x5e\x00\x45\x00\x1c\x00\x3a\x00\x3b\x00\xcd\xff"
+ "\xa7\xff\xb8\xff\x95\xff\x60\xff\x50\xff\x5a\xff\x38\xff\x85\xff"
+ "\x9c\xff\xa7\xff\xbe\xff\x2a\x00\x61\x00\x6b\x00\xab\x00\xdb\x00"
+ "\x16\x01\x17\x01\x21\x01\x0d\x01\xf5\x00\xe8\x00\xd6\x00\x96\x00"
+ "\x48\x00\x45\x00\x5f\x00\x27\x00\xf0\xff\x01\x00\x04\x00\xdf\xff"
+ "\xde\xff\xdc\xff\xbd\xff\xdb\xff\xc9\xff\xad\xff\xc9\xff\xee\xff"
+ "\xf0\xff\xcd\xff\x09\x00\x36\x00\x28\x00\x00\x00\xe2\xff\xec\xff"
+ "\xe9\xff\xa7\xff\x6c\xff\x49\xff\x43\xff\x4a\xff\x33\xff\x23\xff"
+ "\x42\xff\x61\xff\x68\xff\x5f\xff\x68\xff\x73\xff\xb5\xff\xc1\xff"
+ "\x4d\xff\x48\xff\x94\xff\x98\xff\x3d\xff\x6c\xff\x81\xff\x8e\xff"
+ "\x51\x00\xbe\x00\x92\x00\xe7\x00\xb6\x01\x2f\x02\xcb\x01\xb3\x01"
+ "\xe0\x01\xbc\x01\xb2\x01\x11\x01\xa0\x00\x85\x00\x81\x00\x20\x00"
+ "\x67\xff\x56\xff\x89\xff\x78\xff\x14\xff\x00\xff\x3f\xff\x65\xff"
+ "\xc1\xff\xca\xff\xaa\xff\xe2\xff\x66\x00\x76\x00\x13\x00\x23\x00"
+ "\x47\x00\x34\x00\x32\x00\x22\x00\xe5\xff\xee\xff\x35\x00\x2c\x00"
+ "\xe1\xff\xf5\xff\x49\x00\x32\x00\x1a\x00\x23\x00\xe9\xff\xd0\xff"
+ "\xd9\xff\xcb\xff\x4f\xff\x14\xff\x31\xff\x20\xff\x2e\xff\x13\xff"
+ "\xef\xfe\x2d\xff\xc1\xff\xde\xff\x65\xff\x9a\xff\x44\x00\x35\x00"
+ "\xc6\xff\xb0\xff\xfc\xff\x1e\x00\xf1\xff\xad\xff\xaf\xff\xd4\xff"
+ "\xb0\xff\xa4\xff\xa1\xff\x93\xff\xd3\xff\x1b\x00\x2c\x00\x6e\x00"
+ "\xc2\x00\xd6\x00\x02\x01\x48\x01\x2a\x01\x0d\x01\x2a\x01\x29\x01"
+ "\xf5\x00\xc6\x00\x9d\x00\xa8\x00\xb9\x00\x5c\x00\x2d\x00\x5f\x00"
+ "\x45\x00\xed\xff\x18\x00\x26\x00\xc6\xff\xd3\xff\x0d\x00\xda\xff"
+ "\x9c\xff\xc6\xff\xd6\xff\x83\xff\x7f\xff\x62\xff\x3a\xff\x3e\xff"
+ "\x52\xff\x5b\xff\x42\xff\x67\xff\xac\xff\xc7\xff\xa5\xff\xbd\xff"
+ "\xf3\xff\xef\xff\xf3\xff\x0a\x00\x0d\x00\x0f\x00\x24\x00\x3f\x00"
+ "\x15\x00\x1e\x00\x35\x00\x20\x00\x1e\x00\x0f\x00\xf3\xff\x01\x00"
+ "\x18\x00\xde\xff\xc2\xff\xdb\xff\xdd\xff\xb2\xff\xc9\xff\xd8\xff"
+ "\xbb\xff\xd0\xff\xf5\xff\x02\x00\xe5\xff\x0a\x00\x2b\x00\x01\x00"
+ "\xf3\xff\x06\x00\x0f\x00\xf4\xff\xee\xff\xf0\xff\xdf\xff\x01\x00"
+ "\x0d\x00\xd4\xff\xc4\xff\xfa\xff\x0c\x00\xdd\xff\xe4\xff\x16\x00"
+ "\x14\x00\x37\x00\x6a\x00\x7b\x00\x7b\x00\x91\x00\xe7\x00\xf7\x00"
+ "\xc4\x00\xbc\x00\xea\x00\xe6\x00\x86\x00\x69\x00\x67\x00\x31\x00"
+ "\x06\x00\xed\xff\xaa\xff\x57\xff\xa3\xff\xe3\xff\x6f\xff\x1d\xff"
+ "\x73\xff\xe3\xff\x8e\xff\x35\xff\x5f\xff\x98\xff\xa4\xff\x7e\xff"
+ "\x60\xff\x69\xff\xcb\xff\x17\x00\xd4\xff\x8e\xff\xf3\xff\x6c\x00"
+ "\x45\x00\xe9\xff\x13\x00\x7a\x00\x86\x00\x61\x00\x4a\x00\x5e\x00"
+ "\x89\x00\x8b\x00\x42\x00\xf2\xff\x0c\x00\x4a\x00\x24\x00\xc9\xff"
+ "\xbf\xff\x1b\x00\x33\x00\xf1\xff\xaf\xff\xdc\xff\x31\x00\x2a\x00"
+ "\xe6\xff\xbb\xff\xf3\xff\x3c\x00\x2b\x00\xc2\xff\x9c\xff\xd1\xff"
+ "\x02\x00\xc7\xff\x6c\xff\x7b\xff\xc0\xff\xe5\xff\xb6\xff\x8e\xff"
+ "\xa8\xff\xe3\xff\xfb\xff\xca\xff\xab\xff\xe9\xff\x28\x00\x1a\x00"
+ "\xf1\xff\xfc\xff\x2c\x00\x39\x00\x22\x00\xed\xff\xfd\xff\x1b\x00"
+ "\x11\x00\x02\x00\x02\x00\x0c\x00\x21\x00\x34\x00\x37\x00\x1b\x00"
+ "\x1c\x00\x34\x00\x30\x00\x2a\x00\x1a\x00\x2d\x00\x3e\x00\x44\x00"
+ "\x27\x00\x2b\x00\x4e\x00\x39\x00\x17\x00\x19\x00\x1b\x00\x12\x00"
+ "\x10\x00\x04\x00\xfe\xff\xf7\xff\xeb\xff\xf3\xff\xf4\xff\xf1\xff"
+ "\xe8\xff\xf8\xff\x0f\x00\x13\x00\x23\x00\x22\x00\x31\x00\x3a\x00"
+ "\x42\x00\x33\x00\x23\x00\x2c\x00\x1d\x00\x09\x00\x03\x00\xff\xff"
+ "\xfe\xff\xee\xff\xe9\xff\xdc\xff\xdc\xff\xe7\xff\xd0\xff\xc4\xff"
+ "\xaf\xff\xaa\xff\xb8\xff\xaf\xff\xa2\xff\x9e\xff\xb5\xff\xc5\xff"
+ "\xb1\xff\xb7\xff\xc5\xff\xd3\xff\xd4\xff\xc4\xff\xc9\xff\xe2\xff"
+ "\xff\xff\x00\x00\xf8\xff\x12\x00\x2b\x00\x29\x00\x2f\x00\x30\x00"
+ "\x3a\x00\x3e\x00\x43\x00\x40\x00\x3b\x00\x3d\x00\x42\x00\x35\x00"
+ "\x26\x00\x39\x00\x43\x00\x35\x00\x1b\x00\x21\x00\x30\x00\x31\x00"
+ "\x15\x00\x00\x00\xef\xff\xfb\xff\xf0\xff\xc9\xff\xbf\xff\xc2\xff"
+ "\xdc\xff\xc7\xff\xc0\xff\xcd\xff\xe0\xff\xf7\xff\xe3\xff\xe2\xff"
+ "\xf1\xff\x00\x00\x0f\x00\x01\x00\xfd\xff\x08\x00\x1b\x00\x0e\x00"
+ "\xf6\xff\xf6\xff\xfa\xff\x04\x00\xf9\xff\xef\xff\xf0\xff\xfc\xff"
+ "\x0a\x00\xf9\xff\xf6\xff\x02\x00\x07\x00\x0a\x00\x01\x00\xfa\xff"
+ "\x0b\x00\x22\x00\x1c\x00\x07\x00\x0f\x00\x20\x00\x21\x00\x17\x00"
+ "\x06\x00\x01\x00\x06\x00\x02\x00\xef\xff\xe6\xff\xf2\xff\x00\x00"
+ "\xf9\xff\xec\xff\xec\xff\xfe\xff\xfe\xff\xef\xff\xe5\xff\xf4\xff"
+ "\xff\xff\x01\x00\x04\x00\xff\xff\x04\x00\x10\x00\x17\x00\x0f\x00"
+ "\x0b\x00\x17\x00\x24\x00\x23\x00\x19\x00\x1a\x00\x2d\x00\x1f\x00"
+ "\x18\x00\x10\x00\x06\x00\x02\x00\xff\xff\xf7\xff\xef\xff\xe8\xff"
+ "\xf6\xff\xf9\xff\xe6\xff\xdb\xff\xdc\xff\xe8\xff\xdb\xff\xdb\xff"
+ "\xe2\xff\xf1\xff\xf0\xff\xf8\xff\xf7\xff\xee\xff\xf8\xff\xfb\xff"
+ "\xf7\xff\xf1\xff\xf9\xff\x02\x00\xfe\xff\x09\x00\x15\x00\x0f\x00"
+ "\x10\x00\x0d\x00\x08\x00\x05\x00\x0c\x00\x0f\x00\x08\x00\x0b\x00"
+ "\x04\x00\x08\x00\x18\x00\x10\x00\x04\x00\x0a\x00\x17\x00\x15\x00"
+ "\x11\x00\x0f\x00\x13\x00\x14\x00\x0e\x00\x0c\x00\x01\x00\xf7\xff"
+ "\xfa\xff\xf5\xff\xef\xff\xef\xff\xec\xff\xee\xff\xe9\xff\xe1\xff"
+ "\xe4\xff\xf0\xff\xed\xff\xed\xff\xf4\xff\xf6\xff\xf4\xff\xfe\xff"
+ "\x06\x00\x03\x00\x0a\x00\x12\x00\x14\x00\x13\x00\x19\x00\x15\x00"
+ "\x0a\x00\x03\x00\x00\x00\xf9\xff\xed\xff\xe3\xff\xe9\xff\xe5\xff"
diff --git a/ndk/platforms/android-9/samples/native-audio/jni/hello_clip.h b/ndk/platforms/android-9/samples/native-audio/jni/hello_clip.h
new file mode 100644
index 0000000..5f0232b
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/jni/hello_clip.h
@@ -0,0 +1,685 @@
+ "\x00\x00\xfd\xff\x01\x00\x01\x00\xf9\xff\xfb\xff\x02\x00\x05\x00"
+ "\x01\x00\x03\x00\x06\x00\x0a\x00\x0a\x00\x09\x00\x04\x00\x04\x00"
+ "\x06\x00\x06\x00\x00\x00\xff\xff\x05\x00\x08\x00\x01\x00\xfe\xff"
+ "\xff\xff\x03\x00\x04\x00\xfe\xff\xf9\xff\xfd\xff\x04\x00\xfe\xff"
+ "\x03\x00\x04\x00\x01\x00\xfb\xff\xfb\xff\xfc\xff\xfb\xff\x03\x00"
+ "\xfc\xff\xf9\xff\xfc\xff\x01\x00\x06\x00\x00\x00\xf9\xff\xfa\xff"
+ "\x04\x00\x06\x00\xfe\xff\xfa\xff\xfd\xff\x01\x00\xfe\xff\xfe\xff"
+ "\xfe\xff\xfd\xff\xfd\xff\xfd\xff\xfe\xff\xff\xff\xfd\xff\xfa\xff"
+ "\xfe\xff\x00\x00\x03\x00\xfe\xff\xfc\xff\xfb\xff\xfe\xff\x01\x00"
+ "\x02\x00\x01\x00\xff\xff\x09\x00\x0c\x00\x10\x00\x07\x00\x07\x00"
+ "\x04\x00\x00\x00\x02\x00\xf5\xff\xf7\xff\x02\x00\x08\x00\xfe\xff"
+ "\xfe\xff\x05\x00\x06\x00\x05\x00\x00\x00\xfb\xff\xf9\xff\xf6\xff"
+ "\xf7\xff\xfd\xff\x02\x00\xff\xff\xff\xff\x08\x00\x07\x00\x08\x00"
+ "\x04\x00\xfe\xff\x02\x00\x0b\x00\x0c\x00\x05\x00\x04\x00\x03\x00"
+ "\xfe\xff\xfe\xff\xfb\xff\xf3\xff\xe8\xff\xee\xff\xfd\xff\x04\x00"
+ "\xfc\xff\x00\x00\x01\x00\xff\xff\xfe\xff\xf2\xff\xf3\xff\xfa\xff"
+ "\x04\x00\xf7\xff\xfe\xff\x09\x00\x0d\x00\x0b\x00\x08\x00\x01\x00"
+ "\xff\xff\x0c\x00\x0b\x00\x07\x00\x01\x00\x05\x00\x08\x00\x0b\x00"
+ "\x05\x00\xfe\xff\xf6\xff\xf9\xff\xfb\xff\xfa\xff\xf8\xff\x02\x00"
+ "\x05\x00\x06\x00\x01\x00\x00\x00\x0c\x00\x0b\x00\x02\x00\xf8\xff"
+ "\x01\x00\xfb\xff\xfa\xff\x06\x00\x07\x00\xfb\xff\x02\x00\x06\x00"
+ "\x00\x00\x01\x00\x04\x00\xf4\xff\xfa\xff\x00\x00\xf8\xff\xf6\xff"
+ "\x02\x00\xfd\xff\xf0\xff\xfe\xff\x00\x00\xff\xff\xfc\xff\x00\x00"
+ "\xf6\xff\x01\x00\x08\x00\x03\x00\xfc\xff\x06\x00\x0d\x00\x01\x00"
+ "\x04\x00\x05\x00\x01\x00\xf7\xff\xff\xff\xfc\xff\xff\xff\x03\x00"
+ "\x00\x00\xfc\xff\x06\x00\x07\x00\xff\xff\xfa\xff\xfa\xff\x02\x00"
+ "\x00\x00\x00\x00\xf5\xff\xfa\xff\xff\xff\x06\x00\xfc\xff\xf9\xff"
+ "\xff\xff\x04\x00\x08\x00\x06\x00\x01\x00\xf7\xff\xfe\xff\xfc\xff"
+ "\xfe\xff\x02\x00\x07\x00\xfb\xff\xfc\xff\x08\x00\x0b\x00\x05\x00"
+ "\x0a\x00\x08\x00\x00\x00\x08\x00\x11\x00\x0e\x00\xfd\xff\xf1\xff"
+ "\xef\xff\xfe\xff\x02\x00\xf8\xff\xf2\xff\xfb\xff\xfe\xff\x0a\x00"
+ "\xfd\xff\xfa\xff\xf9\xff\xee\xff\xf7\xff\xff\xff\x05\x00\xfc\xff"
+ "\xf6\xff\xfd\xff\x0f\x00\x0a\x00\x05\x00\xf7\xff\xf5\xff\xf8\xff"
+ "\x09\x00\x10\x00\xff\xff\xfd\xff\xf4\xff\xff\xff\xfe\xff\xff\xff"
+ "\xfe\xff\xef\xff\xfa\xff\x06\x00\x17\x00\x11\x00\x13\x00\x11\x00"
+ "\xfe\xff\x05\x00\x0b\x00\xfe\xff\xee\xff\x07\x00\x0b\x00\xff\xff"
+ "\x01\x00\x0b\x00\x0a\x00\x08\x00\x0b\x00\x02\x00\xf4\xff\xfa\xff"
+ "\x0c\x00\x00\x00\x03\x00\x09\x00\xf5\xff\xf6\xff\x06\x00\xfc\xff"
+ "\xf0\xff\xff\xff\x05\x00\xf0\xff\x0a\x00\x23\x00\x08\x00\xfd\xff"
+ "\x03\x00\xf7\xff\xee\xff\x03\x00\xfc\xff\xe2\xff\xf4\xff\xfe\xff"
+ "\xff\xff\x10\x00\x19\x00\xf6\xff\xe7\xff\xf6\xff\xf3\xff\xe5\xff"
+ "\xee\xff\xea\xff\xdc\xff\xf3\xff\xf9\xff\x02\x00\x02\x00\x00\x00"
+ "\xe6\xff\xef\xff\x02\x00\x09\x00\x09\x00\x0b\x00\x09\x00\x00\x00"
+ "\x08\x00\x07\x00\x11\x00\x12\x00\x1a\x00\x17\x00\x2f\x00\x35\x00"
+ "\x2c\x00\x2d\x00\x20\x00\x03\x00\x02\x00\x12\x00\x0e\x00\x11\x00"
+ "\x21\x00\x1d\x00\x13\x00\x25\x00\x1c\x00\x05\x00\xf9\xff\xf4\xff"
+ "\xdd\xff\xf1\xff\x0c\x00\x15\x00\x1d\x00\x32\x00\x2a\x00\x1a\x00"
+ "\x1f\x00\xfe\xff\xcf\xff\xcf\xff\xeb\xff\xde\xff\xf4\xff\x03\x00"
+ "\x00\x00\x10\x00\x17\x00\xf0\xff\xcc\xff\xc7\xff\x8c\xff\x58\xff"
+ "\x5c\xff\x4e\xff\x0f\xff\xf6\xfe\xd6\xfe\xb5\xfe\xc5\xfe\xd6\xfe"
+ "\xe1\xfe\x08\xff\x5e\xff\x9a\xff\xe2\xff\x43\x00\x92\x00\xca\x00"
+ "\x10\x01\x32\x01\x42\x01\x6c\x01\x7e\x01\x72\x01\x6e\x01\x71\x01"
+ "\x56\x01\x53\x01\x53\x01\x30\x01\x05\x01\xfb\x00\xca\x00\x8c\x00"
+ "\x62\x00\x1b\x00\xbe\xff\x8e\xff\x67\xff\x40\xff\x44\xff\x61\xff"
+ "\x6a\xff\x80\xff\xab\xff\xb4\xff\xc6\xff\xca\xff\xb2\xff\x80\xff"
+ "\x79\xff\x6f\xff\x7d\xff\xa1\xff\xb5\xff\xb4\xff\xe1\xff\xfb\xff"
+ "\x0c\x00\x1e\x00\x30\x00\x16\x00\xfe\xff\xf4\xff\xe8\xff\xef\xff"
+ "\xbf\xff\x85\xff\xf1\xfe\x8a\xfe\x08\xfe\xca\xfd\x68\xfd\x26\xfd"
+ "\xd2\xfc\xe2\xfc\x88\xfd\xb4\xfe\x28\x00\x6c\x01\xa8\x02\x51\x03"
+ "\xb6\x03\x8a\x03\x0f\x03\x00\x02\x11\x01\x34\x00\xed\xff\x2d\x00"
+ "\x01\x01\xdc\x01\xb0\x02\x38\x03\x22\x03\xbb\x02\xf8\x01\x1e\x01"
+ "\xfb\xff\x1f\xff\x2d\xfe\xb0\xfd\x80\xfd\xbb\xfd\x0e\xfe\xac\xfe"
+ "\x3b\xff\xb0\xff\x13\x00\x58\x00\x82\x00\x81\x00\x73\x00\x01\x00"
+ "\xa3\xff\x2f\xff\xf6\xfe\xc5\xfe\x12\xff\x5d\xff\xee\xff\x7a\x00"
+ "\xff\x00\x56\x01\xa1\x01\x90\x01\x17\x01\x8f\x00\xc5\xff\xf5\xfe"
+ "\x20\xfe\xa3\xfd\x1a\xfd\xe4\xfc\xe0\xfc\xfe\xfc\x3c\xfd\xca\xfd"
+ "\x1b\xfe\xa0\xfe\x0b\xff\xbf\xff\xfc\xff\xbb\x00\x01\x01\x7d\x01"
+ "\xed\x01\x5c\x02\xa0\x02\xac\x02\xd3\x02\x5c\x02\x42\x02\xc1\x01"
+ "\xb7\x01\x4b\x01\x9e\x01\x4c\x01\x60\x01\xf1\x00\xbc\x00\xff\xff"
+ "\x89\xff\xf7\xfe\x72\xfe\x21\xfe\xe5\xfd\xf6\xfd\xfe\xfd\xcb\xfe"
+ "\x3f\xff\x10\x00\x65\x00\xec\x00\xc1\x00\xe9\x00\xa9\x00\xa0\x00"
+ "\x86\x00\xb3\x00\xc7\x00\xf4\x00\x27\x01\x42\x01\x41\x01\x22\x01"
+ "\xfb\x00\xac\x00\x7a\x00\x49\x00\x19\x00\xf6\xff\xd6\xff\x82\xff"
+ "\x20\xff\xdc\xfe\x7d\xfe\xec\xfd\x8f\xfd\x31\xfd\x05\xfd\x8c\xfc"
+ "\x7a\xfc\xcb\xfb\x94\xfb\x71\xfb\xe9\xfb\xb7\xfc\x67\xfe\x20\x00"
+ "\xd7\x01\x78\x03\x76\x04\xb6\x04\x40\x04\x97\x03\x32\x02\x2c\x01"
+ "\x57\x00\x49\x00\x87\x00\xb4\x01\xa1\x02\x84\x03\xea\x03\xe3\x03"
+ "\x11\x03\x15\x02\xc9\x00\x49\xff\xfd\xfd\xde\xfc\x50\xfc\x49\xfc"
+ "\x22\xfd\x0a\xfe\x55\xff\x29\x00\xb0\x00\x9b\x00\xa6\x00\x5a\x00"
+ "\x51\x00\x30\x00\x18\x00\xe5\xff\xdc\xff\xe5\xff\x29\x00\xa3\x00"
+ "\x27\x01\xaa\x01\xfa\x01\xec\x01\xa2\x01\x39\x01\xb5\x00\x3a\x00"
+ "\xc2\xff\x35\xff\x9f\xfe\x6e\xfe\x27\xfe\x54\xfe\x7b\xfe\x0e\xff"
+ "\x29\xff\x62\xff\x4d\xff\xc7\xff\x29\xff\xe1\xff\xb6\xff\x6d\x00"
+ "\xe0\xff\xd8\x00\x1a\x00\x92\x00\xce\xfe\x16\xfe\x8c\xfb\x76\xf5"
+ "\x4e\xf5\xf5\xf3\x3a\xf8\x59\xfc\x7e\x04\xd5\x07\x35\x0d\x3e\x0e"
+ "\x34\x0d\xcf\x09\xe1\x04\xe2\xfe\x5e\xf9\xb5\xf6\x01\xf5\x0f\xf8"
+ "\x37\xfb\x42\x01\x82\x05\x2a\x0b\x35\x0d\xcb\x0e\x1b\x0c\x3c\x08"
+ "\x47\x01\x1c\xfb\x82\xf5\x95\xf2\xab\xf2\x76\xf5\x3c\xfa\x42\xff"
+ "\x72\x04\xd0\x07\x77\x0a\xb7\x0a\x00\x0a\x88\x06\x30\x02\x0d\xfc"
+ "\x7a\xf6\xef\xf1\x1d\xf1\xad\xf2\xb5\xf7\x05\xfe\x5c\x04\xed\x08"
+ "\x41\x0b\xe1\x0a\x16\x08\x89\x04\x10\x00\x2b\xfc\x78\xf9\x94\xf8"
+ "\x18\xf9\xa9\xfb\x51\xfe\x6d\x01\x74\x03\x95\x04\x83\x04\xd8\x03"
+ "\x70\x02\x75\x01\x98\x00\xe5\xff\x52\xff\xee\xfe\x27\xfe\x2e\xfe"
+ "\x21\xfe\x80\xfe\xef\xff\xbf\x00\xea\x00\x2b\x01\xf6\xff\x99\xfd"
+ "\xd9\xfc\x1c\xfb\xc9\xf9\xb5\xf8\xb9\xf9\x1b\xf8\xf1\xfa\x93\xfd"
+ "\xf1\x00\xdf\x04\xc5\x07\xaf\x08\x27\x08\xb0\x07\xbf\x04\x9c\x03"
+ "\x48\x01\xfa\xff\x48\xfe\x8c\xfe\x4d\xfe\x46\x00\x2a\x02\x76\x04"
+ "\xf0\x05\x0b\x07\x82\x06\x3f\x05\x56\x03\x85\x00\xb2\xfd\xb0\xfa"
+ "\x90\xf8\x06\xf7\x71\xf7\xc5\xf8\xda\xfb\xea\xfe\x36\x02\x40\x04"
+ "\xbd\x04\x9c\x03\x88\x01\xb2\xfe\x03\xfc\x27\xfa\x8c\xf9\xaf\xf9"
+ "\xaf\xfb\xde\xfd\x7a\x00\x01\x03\xcf\x04\xa4\x05\xcd\x05\xfd\x04"
+ "\x7f\x03\x2b\x02\xb3\x00\x8f\xff\x29\xff\xdd\xfe\x91\xfe\xd1\xfe"
+ "\xc4\xfe\x0e\xff\xcd\xff\x94\x00\xdd\x00\x9e\x01\xb5\x01\xbc\x01"
+ "\x82\x01\x62\x01\x5a\x00\x44\x00\x39\x00\x00\x00\x95\x00\x74\xff"
+ "\x9f\xfd\x1c\xfb\x77\xf7\xc7\xf4\x18\xf3\xf3\xf3\x37\xf7\x8f\xfc"
+ "\x4c\x03\x54\x09\x4a\x0e\x10\x10\x74\x0f\x65\x0b\x13\x06\xe6\xff"
+ "\x85\xfa\x9e\xf6\x44\xf5\xea\xf5\xcd\xf8\x5d\xfd\x67\x02\xd1\x07"
+ "\xe7\x0b\x63\x0e\x35\x0e\xb0\x0b\x99\x06\xa4\x00\x6c\xfa\x6c\xf5"
+ "\x39\xf2\x78\xf1\xcb\xf2\x2c\xf6\xc8\xfa\x10\x00\x4d\x05\x44\x09"
+ "\xcb\x0b\x89\x0b\xf6\x08\x34\x04\xa3\xfe\x95\xf8\x44\xf4\x03\xf2"
+ "\xc6\xf2\x3e\xf6\xcf\xfb\xe2\x01\x9b\x07\x56\x0b\xc5\x0c\xd9\x0b"
+ "\xb3\x08\xd2\x04\x9d\x00\xc2\xfd\x75\xfb\x53\xfb\x26\xfb\xa8\xfc"
+ "\x60\xfd\x7e\xff\x0a\x00\x15\x02\x18\x02\x2c\x04\xae\x03\xa3\x04"
+ "\xdd\x03\x79\x03\xe7\x02\x16\x02\xe4\x00\x5b\xfa\x81\xf6\xee\xed"
+ "\x55\xec\x7b\xe9\xb9\xee\x75\xf3\x4b\xfe\x09\x07\x51\x10\xee\x15"
+ "\x6b\x17\xf3\x14\x31\x0e\xdb\x06\x06\xfe\x1b\xf9\xeb\xf3\x15\xf3"
+ "\xad\xf1\xcf\xf4\x85\xf7\x8d\xfe\x4e\x04\xd2\x0b\xc8\x0f\xb9\x12"
+ "\xe9\x10\x08\x0d\x2c\x06\xbe\xfe\xa1\xf7\x30\xf2\x3e\xef\xc7\xee"
+ "\x5f\xf1\x5f\xf5\x6a\xfb\x14\x01\x4e\x07\x53\x0b\xbf\x0e\x91\x0e"
+ "\x65\x0d\x91\x08\x8a\x03\xb1\xfc\x6b\xf7\xcb\xf2\xe7\xf0\x70\xf1"
+ "\x42\xf4\x05\xf9\x74\xfe\x43\x04\x93\x08\xdf\x0b\xb1\x0c\x47\x0c"
+ "\x3c\x09\xac\x05\x88\x00\x2f\xfc\x7e\xf8\xdf\xf6\xb7\xf6\x1b\xf9"
+ "\x3b\xfc\x81\x00\xd5\x03\x88\x06\x2c\x07\x31\x07\xe3\x05\x08\x04"
+ "\x9c\x02\x3c\x01\x38\x01\x63\xff\x95\xff\x88\xf8\x92\xf5\x15\xf0"
+ "\xac\xed\xd6\xed\x0c\xf1\x8e\xf5\x16\xfc\x34\x04\x7c\x09\xd3\x0f"
+ "\x26\x11\xf4\x10\x3a\x0d\x97\x09\xa7\x03\xda\x00\x90\xfd\xed\xfb"
+ "\xbb\xfa\x8b\xfa\x0a\xfa\xab\xfb\x4e\xfd\xdd\xff\x10\x03\xca\x05"
+ "\xd7\x07\x8c\x08\xf2\x07\x94\x05\x18\x03\x85\xff\x95\xfc\x1d\xfa"
+ "\xec\xf8\xa6\xf8\x37\xfa\xd7\xfb\x3c\xfe\x40\x00\x0a\x02\xa0\x02"
+ "\x18\x03\xdc\x01\x04\x01\xc1\xff\xb4\xfe\x5b\xfe\x5e\xfe\x53\xfe"
+ "\xc1\xfe\xc8\xfe\xd2\xfe\xf2\xfe\x63\xff\xd8\xff\xe5\x00\x07\x02"
+ "\xd3\x02\xa8\x03\xe4\x03\x43\x03\x40\x02\xac\x00\xea\xfe\xc1\xfd"
+ "\x24\xfd\x50\xfd\xc2\xfd\xe4\xfe\x48\xff\x5c\x00\x61\x00\x1c\x01"
+ "\xf9\x00\x41\x02\x5d\x02\xcf\x03\x4a\x03\x22\x04\xd5\xff\x6f\xfc"
+ "\xef\xf8\xbd\xf3\x17\xf3\xb0\xf1\x4e\xf3\x59\xf5\xbb\xfb\x9b\xff"
+ "\x34\x06\xf1\x09\x15\x0c\x50\x0c\xbe\x0b\x33\x09\x98\x07\x1e\x06"
+ "\xa0\x03\x45\x02\x4a\x00\x3d\xfe\xb8\xfc\x5b\xfc\x73\xfb\xb3\xfc"
+ "\x76\xfd\x05\xff\x30\x00\xc0\x01\xc4\x01\x85\x02\xee\x01\x6f\x01"
+ "\xd6\x00\x27\x00\x67\xff\x83\xff\x59\xff\x59\xff\x7d\xff\xb6\xfe"
+ "\xaa\xfd\xed\xfc\x0f\xfc\x8e\xfb\x75\xfc\x3c\xfd\x51\xff\x5b\x01"
+ "\x23\x03\xf9\x03\x4e\x04\x61\x03\x36\x02\xd5\x00\x85\xff\xb6\xfe"
+ "\xfb\xfe\x36\xff\x2d\x00\x2f\x01\x70\x01\x38\x01\xc1\x00\x3b\xff"
+ "\xc2\xfe\x44\xfe\x26\xfe\xb0\xfe\xb2\xff\x10\x00\x01\x01\x54\x01"
+ "\xae\x01\xfd\x01\x52\x02\x92\x02\x12\x00\x75\xff\xa0\xfb\xcf\xf9"
+ "\x69\xf7\x49\xf6\x3a\xf5\xae\xf6\x12\xf9\x4b\xfc\x10\x01\x2f\x04"
+ "\x17\x07\x55\x08\x3b\x09\x7e\x08\xab\x08\x54\x07\x68\x06\x0a\x05"
+ "\xf6\x03\x81\x02\xa3\x01\x4c\x00\x0a\xff\xbc\xfd\x95\xfc\xd4\xfb"
+ "\x7a\xfb\xb0\xfb\x12\xfc\xef\xfc\xcd\xfd\xdc\xfe\xce\xff\xbd\x00"
+ "\x80\x01\x5d\x02\xec\x02\x20\x03\x02\x03\x30\x02\xee\x00\xb3\xff"
+ "\xdf\xfd\x78\xfc\x6c\xfb\x25\xfb\xd8\xfb\x6d\xfd\x78\xff\x7e\x01"
+ "\x4f\x03\x5e\x04\x6d\x04\xd5\x03\x70\x02\x45\x01\x24\x00\x2e\x00"
+ "\xc4\xff\xe5\xff\x04\x00\x72\xff\x3f\xff\x69\xfe\xe4\xfd\x66\xfd"
+ "\xe2\xfd\x36\xfe\xf0\xff\xe1\x00\x3e\x02\xe6\x02\x82\x00\xd0\xfe"
+ "\xc0\xfb\x30\xf9\xf5\xf7\x84\xf7\x4c\xf7\x19\xf9\xaf\xfb\x27\xfe"
+ "\xeb\x01\x57\x04\xc9\x05\x11\x07\x5f\x07\x1c\x07\x9e\x07\x4c\x07"
+ "\xc0\x06\x27\x06\xae\x04\xff\x02\x9f\x01\xdd\xff\x8f\xfe\xbd\xfd"
+ "\xfa\xfc\xce\xfc\xed\xfc\xf9\xfc\x47\xfd\x90\xfd\x94\xfd\x9d\xfd"
+ "\xa6\xfd\x93\xfd\x02\xfe\xae\xfe\xa1\xff\x18\x01\x75\x02\x67\x03"
+ "\xf5\x03\x88\x03\x4f\x02\x01\x01\x64\xff\x2b\xfe\xac\xfd\x85\xfd"
+ "\x0a\xfe\xde\xfe\x7b\xff\x2f\x00\xa1\x00\xe8\x00\x0a\x01\x58\x01"
+ "\x5f\x01\xb8\x01\x85\x01\x78\x01\x85\x00\x3e\x00\x50\xff\x95\xfe"
+ "\xcc\xfe\x90\xfe\x0b\x00\x64\x00\x52\x01\x5b\x01\x09\x01\xd4\x00"
+ "\x1f\x00\xd0\x00\x5b\x00\x96\x01\x3e\x00\x47\xfe\x69\xfc\xff\xf8"
+ "\x48\xf7\x7a\xf5\x2e\xf5\x7d\xf5\x8b\xf8\x28\xfb\x39\xff\xc4\x02"
+ "\x08\x05\xb3\x06\x95\x07\x9f\x07\xa2\x07\x3d\x08\xee\x07\x26\x08"
+ "\xd8\x07\xb6\x06\x67\x05\x00\x04\xad\x01\x07\x00\x54\xfe\x05\xfd"
+ "\x1a\xfc\xe5\xfb\x40\xfb\x90\xfb\xe5\xfb\x18\xfc\xc1\xfc\x58\xfd"
+ "\xb5\xfd\x98\xfe\x54\xff\x1f\x00\x35\x01\xeb\x01\x2c\x02\x2a\x02"
+ "\xcd\x01\x95\x00\xce\xff\x96\xfe\xaa\xfd\x98\xfd\xf6\xfd\xa4\xfe"
+ "\xd8\xff\xb3\x00\x37\x01\xad\x01\xce\x01\xc1\x01\x0f\x02\x34\x02"
+ "\x39\x02\x6f\x02\x48\x02\xf3\x01\x48\x01\x53\x00\x90\xff\xb5\xfe"
+ "\xdc\xfe\xb1\xfe\x8a\xff\xbc\xff\x6d\x00\x48\x00\x79\x00\xf5\xff"
+ "\x7e\xff\x4d\xfe\x9b\xfb\xd4\xfa\xf5\xf7\x2d\xf7\x38\xf6\x68\xf6"
+ "\x12\xf7\xa9\xf9\xfd\xfb\x26\xff\x77\x02\x9a\x04\xb5\x06\xf5\x07"
+ "\x95\x08\xc9\x08\x62\x09\xd3\x08\xbc\x08\xe1\x07\xa3\x06\x16\x05"
+ "\xbe\x03\xcf\x01\x81\x00\x0f\xff\xbb\xfd\x9f\xfc\xe8\xfb\x0e\xfb"
+ "\xd4\xfa\xe1\xfa\x07\xfb\x9d\xfb\x5c\xfc\x16\xfd\x19\xfe\x53\xff"
+ "\x52\x00\x62\x01\x1f\x02\x36\x02\x06\x02\xe2\x01\x05\x01\xbf\x00"
+ "\x05\x00\x8b\xff\x45\xff\x48\xff\x3d\xff\x98\xff\xe1\xff\x07\x00"
+ "\x6b\x00\xd4\x00\x2a\x01\xbe\x01\x1a\x02\x2a\x02\x3d\x02\xf2\x01"
+ "\x62\x01\xe4\x00\x6a\x00\xb6\xff\x06\x00\x65\xff\xb6\xff\x81\xff"
+ "\x56\xff\x40\xff\x42\xff\x16\xff\xc4\xfe\xdc\xfd\x06\xfc\xf8\xfa"
+ "\xdd\xf8\xe0\xf7\x59\xf7\x79\xf7\x53\xf8\x79\xfa\xb0\xfc\x62\xff"
+ "\x27\x02\xf9\x03\x88\x05\xbe\x06\x3f\x07\xe9\x07\xa1\x08\x92\x08"
+ "\x74\x08\xde\x07\x9f\x06\x6b\x05\x3d\x04\x85\x02\x49\x01\xc0\xff"
+ "\x16\xfe\xc9\xfc\xbc\xfb\xb9\xfa\x8b\xfa\xb9\xfa\xd1\xfa\xb0\xfb"
+ "\x7d\xfc\x1c\xfd\x5d\xfe\x6b\xff\x2e\x00\x33\x01\xb7\x01\x86\x01"
+ "\x8c\x01\x2e\x01\x6f\x00\x61\x00\x01\x00\xd1\xff\x53\x00\xb8\x00"
+ "\x29\x01\xb8\x01\xd2\x01\x80\x01\x73\x01\xf4\x00\xc3\x00\xcb\x00"
+ "\xde\x00\xbe\x00\xbc\x00\x36\x00\xba\xff\x6d\xff\xce\xfe\xc6\xfe"
+ "\xde\xfe\x59\xff\x08\x00\x46\x00\x7e\x00\x29\xff\x76\xfd\xbc\xfb"
+ "\x37\xf9\x54\xf8\xa1\xf7\xe5\xf7\x62\xf8\x07\xfa\x66\xfb\x8e\xfd"
+ "\xe8\xff\xaa\x01\xd6\x03\xac\x05\xeb\x06\x1f\x08\x2f\x09\x1d\x09"
+ "\x21\x09\x5f\x08\x17\x07\xc3\x05\x99\x04\x01\x03\xfb\x01\xb9\x00"
+ "\x40\xff\xed\xfd\xc4\xfc\x6a\xfb\xbd\xfa\x4c\xfa\x14\xfa\x66\xfa"
+ "\x08\xfb\xba\xfb\xe7\xfc\x55\xfe\x7b\xff\x08\x01\x39\x02\xe5\x02"
+ "\x7a\x03\xa8\x03\xa1\x02\x09\x02\x37\x01\x26\x00\xdb\xff\x9e\xff"
+ "\x5b\xff\x50\xff\x73\xff\x04\xff\x59\xff\x84\xff\x7d\xff\x18\x00"
+ "\x8f\x00\x9f\x00\x2b\x01\x3a\x01\xb0\x00\xea\x00\x82\x00\x76\x00"
+ "\x75\x00\x62\x01\xce\x00\x41\x02\x6f\x01\xbc\x01\x45\x01\x18\x01"
+ "\xbd\x00\x99\x00\x3b\x00\xac\xfc\xb1\xfc\x1a\xf8\xa1\xf6\x15\xf4"
+ "\x11\xf4\xbd\xf3\x32\xf6\x76\xf8\x0a\xfb\x35\xff\x1d\x01\xe3\x03"
+ "\xcf\x05\xc2\x07\x5a\x08\x70\x0a\x91\x0a\x47\x0b\x22\x0b\x86\x0a"
+ "\xb1\x08\xae\x07\x39\x05\x6c\x03\xb3\x01\xfd\xff\x24\xfe\x02\xfd"
+ "\x7d\xfb\x2e\xfa\xbe\xf9\xfa\xf8\x15\xf9\xa6\xf9\x85\xfa\x82\xfb"
+ "\x5d\xfd\x7e\xfe\x20\x00\x95\x01\x79\x02\xf8\x02\x81\x03\x94\x02"
+ "\x92\x01\x81\x00\x17\xff\x34\xfe\xf8\xfd\xc3\xfd\x3e\xfe\x0d\xff"
+ "\x19\xff\x76\xff\x4a\x00\xcf\x00\x7a\x01\x13\x02\x91\x02\xe4\x02"
+ "\x2d\x03\x76\x02\x36\x02\x67\x01\x1a\x01\xa7\x00\x58\x01\x26\x01"
+ "\x91\x01\xd6\x01\x8c\x01\xf8\x00\x1c\x00\xd1\xff\x99\xff\xd3\xff"
+ "\xed\xfb\x4d\xfa\x9e\xf7\x94\xf5\x8b\xf3\x58\xf3\x42\xf3\x35\xf6"
+ "\x86\xf9\x37\xfc\x40\x00\x35\x03\x22\x05\x9e\x06\x5a\x08\x82\x08"
+ "\x7c\x0a\xd8\x0a\xc4\x0a\x43\x0a\xad\x09\xa2\x07\x8e\x06\xa4\x04"
+ "\xc8\x02\x57\x01\xf3\xff\x2c\xfe\x2f\xfd\xeb\xfb\x75\xfa\x09\xfa"
+ "\xa6\xf9\x8d\xf9\x55\xfa\x56\xfb\x44\xfc\xea\xfd\x00\xff\x1a\x00"
+ "\x86\x01\x45\x02\x7e\x02\xca\x02\x18\x01\xef\xff\x86\xfe\x57\xfd"
+ "\xde\xfc\x6a\xfd\xf7\xfd\x8a\xff\x25\x01\x74\x01\x1a\x02\x0b\x03"
+ "\x10\x03\x3d\x03\x18\x03\xb5\x02\x8d\x02\x6d\x02\x44\x01\xcc\x00"
+ "\xb8\x00\x9c\xff\xf9\xff\xee\xff\x82\x00\xd6\x00\x37\x01\x6a\x00"
+ "\x05\x00\xa7\xff\x41\xfe\x56\xfb\x33\xf8\xfa\xf5\x71\xf4\xfe\xf3"
+ "\x7b\xf3\xe9\xf4\xdf\xf7\x43\xfc\x13\x00\xd9\x03\xe7\x06\xa0\x08"
+ "\xce\x09\x62\x0a\xa1\x0a\x98\x0a\x24\x0a\xca\x08\x2a\x07\x3c\x05"
+ "\x52\x03\xb6\x01\x95\x00\x23\xff\x09\xfe\x27\xfd\x55\xfc\x82\xfb"
+ "\x4b\xfb\x16\xfb\x62\xfb\x1c\xfc\x8b\xfc\x43\xfd\x2b\xfe\x0b\xff"
+ "\xdc\xff\x10\x01\xa3\x01\x74\x02\x90\x02\x47\x02\xfb\x00\x71\xff"
+ "\x5c\xfd\x91\xfc\xdc\xfb\x34\xfd\xba\xfc\x4e\xff\x7c\x03\x04\x04"
+ "\x96\x06\x97\x04\x4c\x05\xb0\x04\xb6\x03\x5d\x01\xc3\x00\x1b\xff"
+ "\xde\xfe\x59\xfe\x16\xfe\xc2\xfe\x6b\xff\x92\xff\x55\x00\xd0\x01"
+ "\xd6\x01\x22\x03\x2c\x01\xc5\x00\x7a\xf9\x7c\xf7\x3c\xf1\x2e\xf0"
+ "\xb3\xef\x2b\xf1\x74\xf4\x8c\xf9\xc3\xff\xd8\x04\x7b\x0b\x63\x0d"
+ "\x80\x0f\x11\x0e\xa8\x0c\x01\x09\xed\x07\xe9\x03\x9f\x01\x8a\xfe"
+ "\x9a\xfc\x67\xfb\x21\xfd\x32\xfe\x22\x01\x39\x03\x27\x04\x59\x04"
+ "\xc4\x03\x6a\x02\xc1\x00\xa8\xff\xc2\xfd\x99\xfc\xfb\xfa\x63\xf9"
+ "\x55\xf8\xcd\xf8\x4a\xf9\xe1\xfb\x76\xfe\x23\x01\x01\x03\xbc\x03"
+ "\x65\x02\xf2\x01\xb6\x00\x2b\x00\xcc\x00\x1f\x01\x59\x01\x7c\x02"
+ "\x2e\x02\x97\x02\x49\x02\xe5\x01\x0c\x01\x83\x01\xff\x00\xcd\x01"
+ "\x80\x01\xfd\x01\x65\x01\xa1\x01\xd4\x00\x17\x01\x68\x00\x8e\x00"
+ "\x12\x00\x42\x00\x70\x00\xf2\xff\xe8\xfe\x27\xf5\x29\xf3\x24\xeb"
+ "\x8c\xeb\xb9\xec\xb8\xf2\x25\xf8\x0d\x01\x64\x07\xfe\x0c\xf4\x12"
+ "\xa9\x12\xde\x11\xf8\x0c\x7b\x07\x10\x00\x5e\xfd\xc7\xf7\xe0\xf6"
+ "\xda\xf5\xa6\xf7\x5b\xfb\xb1\x02\x3c\x08\xbb\x0e\xbe\x11\xa8\x11"
+ "\xef\x0e\xc4\x09\xb5\x02\x38\xfc\x87\xf6\x21\xf1\xc0\xee\x68\xed"
+ "\xcf\xee\x28\xf3\xef\xf9\x56\x01\x89\x09\xe6\x0e\xd9\x11\x03\x11"
+ "\xfb\x0c\x84\x05\xa5\xfd\x53\xf5\x98\xef\xf5\xec\xc3\xed\xe9\xf1"
+ "\x78\xf8\x03\x00\x86\x07\xa3\x0d\x3b\x11\xce\x11\x28\x0f\x57\x0a"
+ "\x61\x04\xf8\xfe\xe2\xfa\x80\xf8\xc8\xf7\xfd\xf7\x2a\xfa\x9e\xfd"
+ "\x03\x01\xc3\x04\xf7\x07\xbf\x08\xb8\x08\x49\x08\xf2\x06\x2c\xff"
+ "\x4b\xf4\x35\xec\x81\xe5\x5d\xe4\xdf\xe7\x3c\xee\xbd\xf6\xd2\x00"
+ "\xa6\x09\xcc\x11\x11\x17\x51\x17\xdc\x13\x20\x0d\x29\x04\xcc\xfc"
+ "\x69\xf7\x3f\xf3\xce\xf1\x2a\xf3\x8c\xf7\x19\xff\x40\x08\x84\x10"
+ "\x1f\x16\x4b\x17\x67\x14\x0c\x0e\xba\x05\x70\xfd\x9d\xf6\xb2\xf1"
+ "\x84\xee\x59\xed\xcd\xee\x7d\xf2\xd6\xf8\x29\x00\xe7\x07\xb3\x0d"
+ "\x74\x10\xa1\x0e\xc9\x09\x74\x02\xfa\xfa\x69\xf5\x11\xf2\xe9\xf1"
+ "\x4e\xf4\x29\xf8\xdb\xfc\x28\x02\x3e\x06\x32\x0a\xa5\x0b\x05\x0c"
+ "\xce\x09\x7b\x07\x02\x03\xb4\xff\x96\xfb\x57\xfa\x26\xf9\x7c\xfa"
+ "\x39\xfb\x27\xfd\x27\xff\xce\x02\xf4\x04\xdc\x08\x60\x07\x58\xfc"
+ "\x16\xf9\xaa\xed\xcb\xec\xcc\xec\x29\xf3\xf5\xf7\x1a\x01\x6d\x05"
+ "\x1b\x0b\xb5\x0e\xbf\x0e\x3b\x0e\xd8\x09\xe4\x06\x39\xfe\x91\xfc"
+ "\x9b\xf5\x24\xf6\x05\xf5\xad\xf9\xba\xfd\x50\x05\x7d\x0a\xa0\x0f"
+ "\xc6\x10\x92\x0f\xfc\x0b\xbc\x05\x82\xff\x9c\xf8\x5e\xf4\xe4\xef"
+ "\x12\xf0\x49\xf0\xae\xf5\xf4\xfa\xd5\x03\xa7\x0a\x36\x11\x62\x12"
+ "\xf3\x11\x4f\x0b\xb7\x04\xe3\xf9\x88\xf1\x85\xeb\x7f\xe9\x88\xed"
+ "\x90\xf3\x3f\xfd\x6e\x04\x82\x0c\xe9\x0f\x27\x12\x4d\x0f\xba\x0b"
+ "\x11\x03\x89\xfd\x65\xf6\x6e\xf5\xa7\xf4\x36\xf9\x9c\xfb\x1e\x01"
+ "\x5e\x02\x8b\x05\x82\x06\xca\x09\x61\x0b\x50\x0c\xfb\x09\x08\x08"
+ "\x32\x07\x2e\xee\x76\xeb\x66\xdc\xef\xdc\x5e\xdd\x84\xea\x21\xf3"
+ "\x2c\x02\xb2\x0f\xfa\x19\xf8\x21\x2c\x20\x77\x1d\x5a\x0f\xd9\x03"
+ "\xb5\xf4\xe1\xef\x25\xe7\xe6\xea\x7e\xeb\x51\xf5\x3f\xfe\x63\x0c"
+ "\xd6\x15\x88\x1f\x22\x1f\x1a\x1c\x36\x12\x05\x06\xdb\xf9\x2d\xef"
+ "\xa6\xe8\x0f\xe4\x33\xe5\x22\xe8\x03\xf2\xa7\xfb\xb9\x09\x2b\x14"
+ "\xb4\x1c\xa6\x1d\xc8\x1a\xec\x0e\x1e\x03\xe3\xf3\x11\xe8\xb6\xe0"
+ "\x87\xdf\x38\xe4\xe6\xed\x7a\xfa\xfd\x05\x97\x10\x1c\x18\x58\x1a"
+ "\x1e\x18\xc7\x11\xef\x06\x48\xfc\xad\xf2\x69\xee\xf7\xee\x31\xf3"
+ "\x77\xf9\x5b\x00\xab\x04\x0b\x09\xb0\x0b\x3b\x0f\xf0\x0f\xe6\x0f"
+ "\x16\x0b\xef\x04\x0e\xfe\xe4\xf9\x99\xf2\xbb\xe3\x6d\xe2\x11\xde"
+ "\xa6\xe1\xeb\xe8\x53\xf6\x51\x01\xbc\x0e\x47\x19\xcd\x1e\xb8\x1f"
+ "\xe0\x19\x59\x11\xc6\x02\x8e\xf7\x26\xed\xbc\xe9\x8d\xe7\x26\xed"
+ "\x7a\xf3\x70\xff\x57\x0b\xd4\x18\xf3\x1f\xf5\x22\x82\x1d\x0f\x14"
+ "\x28\x06\x7a\xf9\x41\xee\x69\xe7\xb0\xe4\xc4\xe4\x1c\xea\xe5\xf1"
+ "\x29\xfd\x7c\x08\x9d\x14\x59\x1a\xcf\x1c\xd6\x16\x8c\x0e\x43\xfd"
+ "\x59\xf1\xd8\xe4\x54\xe0\xc1\xe1\x4c\xea\x8a\xf5\x6d\x02\x82\x0d"
+ "\x6d\x15\x48\x18\xbf\x16\x82\x10\xcd\x07\x01\xff\xaa\xf7\x28\xf4"
+ "\xba\xf2\x56\xf6\x02\xf9\x63\xfe\xe2\xff\x10\x05\xb4\x05\x7e\x0c"
+ "\x1f\x0c\x8d\x10\x6e\x09\x6b\x0d\x84\xf8\xe4\xe9\x78\xe1\xb8\xd9"
+ "\xd1\xde\xa9\xe5\x4b\xf8\xfa\xfd\xbe\x0f\xdd\x14\xad\x1e\xc2\x1a"
+ "\xaa\x1d\xf9\x10\xa8\x06\xdd\xf8\x75\xf0\xb0\xe8\xaf\xe8\x37\xed"
+ "\xd9\xf3\xe5\x00\x24\x0b\xa9\x16\x4b\x1a\x16\x1d\x27\x16\xee\x10"
+ "\xf7\x03\x67\xfc\xc9\xef\x34\xeb\x3b\xe5\x90\xe6\x42\xe9\xdb\xf2"
+ "\x96\xfc\x6e\x09\x94\x14\x54\x1b\x2d\x1d\xca\x18\x2d\x0f\x86\x01"
+ "\xf9\xf5\xd5\xe8\xd6\xe3\xac\xe0\xa5\xe5\x0b\xef\xdf\xfb\xad\x08"
+ "\x1a\x12\x94\x18\x79\x19\x90\x15\xe1\x0e\xb8\x04\x94\xfa\x9f\xf2"
+ "\x22\xef\x8b\xee\x4a\xf3\x1d\xf8\x32\xff\x7d\x02\x3c\x08\x1a\x0a"
+ "\x6b\x0e\xe3\x0e\x74\x0f\x94\x0b\xdf\x06\xba\xfe\x76\xfc\x3f\xf1"
+ "\x16\xe2\x54\xe2\x9a\xdd\x25\xe4\xe6\xe9\x12\xfc\xc8\x03\x4d\x13"
+ "\x27\x1c\x40\x21\xac\x1d\x4f\x19\x0e\x0e\x72\xfe\xbb\xf4\x9e\xeb"
+ "\x25\xe9\xc3\xe7\xe9\xee\x3c\xf4\xe8\x01\x57\x0c\x0d\x1a\x03\x1f"
+ "\xcb\x21\xe5\x1a\x83\x11\x62\x02\x9f\xf6\x45\xeb\x72\xe5\x25\xe4"
+ "\xa0\xe5\xb6\xeb\x07\xf4\x15\x00\x06\x0b\x2e\x17\xd3\x1c\xbd\x1e"
+ "\x1e\x19\xad\x0c\xae\xfa\x02\xed\x8a\xe1\x2e\xdf\xa5\xe2\x9b\xee"
+ "\x7e\xf9\xdf\x06\x5c\x0f\x35\x15\x87\x15\x8a\x14\xcd\x0d\x19\x07"
+ "\x8a\xfe\x1b\xf8\x6f\xf3\x7e\xf2\x13\xf5\x88\xf8\x20\xfe\x2c\x01"
+ "\x81\x05\x69\x06\x6a\x0b\x10\x0b\x59\x0f\xa8\x0a\xba\x0e\x8f\xf4"
+ "\xa9\xeb\x26\xde\xe4\xdb\x95\xde\x47\xeb\x10\xfd\x3a\x02\xe3\x11"
+ "\xcc\x13\x8a\x1b\x81\x15\x0a\x1b\xc2\x0b\x57\x05\x7d\xf6\xc8\xf1"
+ "\x15\xe8\x09\xeb\x40\xef\x2c\xf8\x8b\x03\x47\x0d\x89\x16\x94\x17"
+ "\xd7\x19\xbb\x12\x1d\x0f\x6c\x03\x48\xfe\xbc\xf1\x9e\xed\x72\xe5"
+ "\xb0\xe7\xfe\xe8\x3e\xf4\x7d\xfe\x76\x0b\x03\x15\xd6\x19\xbb\x19"
+ "\x8c\x14\x50\x0c\x73\x00\x7c\xf5\xde\xe9\x0c\xe4\x3e\xe1\x0c\xe9"
+ "\x00\xf2\x88\x00\x17\x0b\x40\x14\x66\x17\xd4\x16\x5f\x11\xa1\x0a"
+ "\x51\x00\x65\xf8\xfe\xf2\x99\xf1\xd5\xf2\xd7\xf7\xff\xfb\x54\x00"
+ "\x52\x03\xbc\x07\xfa\x09\xb7\x0d\xd0\x0d\xd5\x0b\xf9\x06\xf8\x05"
+ "\x96\xf8\xcd\xe6\x18\xe5\xa6\xdd\x61\xe3\x01\xe8\x87\xfa\x9c\xff"
+ "\x18\x0d\xdc\x15\x02\x1c\x67\x1a\x57\x18\x7d\x10\x9b\x00\x0c\xf8"
+ "\x7b\xee\xa5\xed\xce\xea\x12\xf4\x3c\xf7\xe2\x01\x5c\x08\xb7\x13"
+ "\xa4\x16\x20\x1a\xa2\x16\xba\x0f\x25\x05\x41\xfb\xe8\xf1\x8f\xea"
+ "\x97\xe9\xeb\xe8\xb2\xee\x1a\xf3\x0a\xfe\x13\x05\x73\x10\x5e\x15"
+ "\x5a\x1a\x5a\x16\xc8\x10\x53\x01\xf8\xf2\x49\xe7\x7e\xe1\xb1\xe4"
+ "\xe0\xec\xd6\xfb\x3b\x05\x77\x10\x20\x13\x5d\x16\x3d\x11\xce\x0d"
+ "\x63\x05\x75\xff\x92\xf7\xf9\xf4\x97\xf2\x3e\xf5\x1a\xf8\x39\xfc"
+ "\xe5\xff\x3e\x03\x2f\x06\x52\x08\x67\x0b\x19\x0d\xfe\x0a\x4e\xf8"
+ "\xcf\xf3\x37\xe4\x02\xe4\x6e\xe0\x29\xef\x9e\xf6\x8c\x04\x66\x11"
+ "\xf7\x17\x3e\x1c\x79\x18\x3d\x17\x9b\x07\x7a\x01\xe8\xf3\xf2\xf0"
+ "\x72\xe7\x65\xec\xfc\xee\x16\xfa\xdd\x03\x72\x10\x6f\x17\xc1\x18"
+ "\x3f\x17\xf2\x0e\xa3\x07\xe9\xfd\x6b\xf9\xf1\xf0\x6c\xef\x5b\xeb"
+ "\xf8\xec\x86\xee\x76\xf7\x9c\x00\xf9\x0a\xea\x13\xc7\x18\xdd\x18"
+ "\x44\x12\x00\x0a\x56\xfd\x98\xf2\x5f\xe8\xd2\xe4\x9f\xe6\x56\xee"
+ "\x40\xf9\x10\x05\x8c\x0e\xfa\x13\x76\x16\x3c\x13\x41\x0e\x6a\x05"
+ "\x91\xfe\xc4\xf6\x12\xf4\xe7\xf2\xed\xf5\x3c\xf8\x35\xfb\x8b\xfe"
+ "\x4f\x00\xfb\x03\x8f\x06\x7f\x0c\x4c\x0a\x03\x11\x6b\x02\x1a\xf7"
+ "\x16\xeb\xea\xe5\x41\xe3\x2c\xe6\xd5\xf4\x58\xf9\x5e\x06\xde\x0c"
+ "\xad\x18\xfb\x17\x48\x1d\x0e\x16\xec\x0c\x61\xff\x3f\xf5\xef\xec"
+ "\x8b\xe7\x98\xeb\xd4\xef\x5a\xfb\xbe\x03\x1f\x10\xba\x13\x72\x17"
+ "\x22\x14\xd4\x10\xed\x08\x30\x02\xfa\xf9\x08\xf2\x16\xec\x4b\xe8"
+ "\xb7\xe9\x33\xee\x8b\xf8\x6b\x02\x34\x0e\x50\x15\x06\x1a\x03\x18"
+ "\x0a\x13\x28\x08\x8b\xfc\x8d\xf0\x3c\xe8\xbe\xe5\x79\xe8\x2f\xf2"
+ "\xc0\xfb\x43\x08\x97\x0e\x2f\x15\xce\x12\x39\x10\x7f\x08\x4e\x03"
+ "\xab\xfc\x68\xf9\x6d\xf7\x64\xf6\x1c\xf7\x39\xf6\xb4\xf9\x70\xfb"
+ "\x62\x01\xec\x03\x3e\x0a\xfd\x0a\x38\x0f\x79\xfd\x67\xf8\xad\xed"
+ "\x57\xea\x5b\xe8\xa7\xed\x27\xf8\xad\xf9\x14\x08\x6b\x0b\x8c\x16"
+ "\x3c\x14\x19\x1b\xde\x10\x4a\x0a\xb2\xfe\x0a\xf7\x36\xef\xaa\xea"
+ "\x37\xef\x81\xf1\x13\xfd\x02\x04\xed\x0f\x35\x11\x6a\x15\x8c\x10"
+ "\xfe\x0c\xb7\x05\x11\x00\xaa\xf9\x14\xf4\x1a\xf0\x1f\xec\x2b\xed"
+ "\x63\xef\xa3\xf8\x70\x00\x56\x0c\x4f\x13\xcb\x18\x78\x17\x8b\x12"
+ "\x73\x07\xba\xfc\xec\xf0\x29\xea\x04\xe8\x0b\xec\xa1\xf4\x02\xfe"
+ "\xd7\x08\x15\x0e\x0d\x13\x11\x10\x86\x0d\x16\x06\xd9\x01\x73\xfb"
+ "\x53\xfa\x21\xf8\x63\xf9\x05\xf8\xb5\xf9\x50\xf9\x7a\xfb\x22\xfe"
+ "\x80\x03\x36\x06\x58\x0b\x5b\x09\x91\xf9\xea\xf6\x4f\xeb\x62\xed"
+ "\x1f\xe9\x0a\xf7\x02\xfa\xc8\x01\x65\x09\x42\x0f\x5d\x14\x87\x13"
+ "\x8b\x17\x5e\x0c\x07\x08\x97\xfb\xc1\xf7\x33\xee\xf5\xee\x24\xf1"
+ "\xf1\xf6\xb3\xff\x58\x07\x8d\x0f\xb3\x0f\xf9\x11\xf2\x0c\x9b\x09"
+ "\x78\x02\xff\xfd\xe6\xf7\x68\xf3\x0b\xf0\x71\xed\x21\xef\x81\xf2"
+ "\x71\xfa\x95\x01\xef\x0b\xd2\x11\xf5\x16\xa0\x15\x0b\x10\x85\x06"
+ "\xf3\xfb\x63\xf2\xfc\xec\x4c\xec\xde\xf0\xe0\xf7\xb5\x00\x7d\x07"
+ "\x12\x0d\xe6\x0e\x65\x0d\xf8\x09\x81\x05\x29\x01\x03\xfd\x78\xfb"
+ "\x9f\xf9\xe0\xf9\xb2\xf8\x10\xf9\x53\xf8\xef\xfb\xc3\xfc\x5f\x02"
+ "\x92\x04\x6f\x0d\xd7\xfd\x92\xf9\x22\xf3\xb1\xed\x5d\xed\x12\xf0"
+ "\x2d\xfe\xd3\xfb\x57\x0a\x50\x0b\xa7\x13\x79\x0f\x11\x14\x5a\x0e"
+ "\xf5\x05\xdd\x00\x9f\xf8\xa6\xf5\x56\xed\x5a\xf3\x33\xf4\xac\xfd"
+ "\x86\x04\x32\x0e\x19\x11\xf3\x0f\x09\x0f\x6f\x08\xb6\x04\xe1\xfd"
+ "\x53\xfb\x63\xf5\xd7\xf2\xb7\xef\x2c\xef\xcb\xf1\x53\xf7\xee\xff"
+ "\x71\x07\xc0\x0f\x8e\x13\x04\x15\x6a\x0f\x09\x09\xd3\xff\x89\xf7"
+ "\x68\xf1\x2b\xef\x99\xf0\xc5\xf4\xec\xfb\xaf\x02\x7e\x08\x44\x0d"
+ "\x07\x0e\x43\x0c\x45\x08\xf1\x03\xec\xfe\xaa\xfb\xdd\xf9\x34\xfa"
+ "\x37\xf9\xc5\xf8\x0d\xf9\xe6\xf9\x69\xfb\x86\xff\x6b\x04\xa6\x09"
+ "\x0a\x0a\xf9\xfd\xe7\xf9\x3b\xf0\x96\xed\x67\xeb\xe7\xf2\x9c\xf9"
+ "\x8a\xfe\x63\x08\x42\x0c\x00\x12\xe8\x11\x28\x15\x5d\x0e\xce\x08"
+ "\x88\x01\x3c\xfa\x6d\xf3\xdd\xee\xb3\xf1\xe7\xf3\x1a\xfc\xd5\x03"
+ "\xf5\x0b\xbb\x0e\xb6\x0f\x1f\x0f\xc0\x0a\xa4\x07\xe2\x01\x03\xfe"
+ "\x74\xf7\x6e\xf3\xb7\xee\x5b\xed\x6d\xef\xbc\xf4\x49\xfc\xaf\x04"
+ "\x65\x0d\x96\x12\x86\x13\x35\x10\xe3\x0a\x75\x02\x42\xfb\x05\xf5"
+ "\xd0\xf2\xda\xf1\xb0\xf5\x11\xfa\x0b\x00\x8b\x04\x76\x09\xe6\x09"
+ "\x20\x0a\xb7\x07\xac\x05\xd8\x01\x3b\xff\x89\xfc\xe8\xfa\xc7\xf9"
+ "\xbe\xf8\xf7\xf8\x11\xf9\x2c\xfb\x7a\xfd\xa6\x02\x75\x05\x13\x0f"
+ "\xdf\xfc\xca\xfd\x6d\xf3\xfe\xef\x26\xec\x8b\xef\xf6\xfb\x8f\xf7"
+ "\xda\x07\xf4\x07\x76\x12\xac\x0e\x0c\x15\x6e\x0f\x21\x08\xaa\x04"
+ "\x65\xfc\xde\xf9\xbe\xf0\x84\xf4\xb2\xf2\x98\xf8\xda\xfe\x2f\x06"
+ "\x94\x0c\xa6\x0c\x86\x10\xdd\x0b\x50\x0a\x3e\x04\xcb\x00\x4f\xfc"
+ "\x01\xf6\xd4\xf3\xb8\xee\xd4\xf0\x9e\xf0\x57\xf8\x13\xff\x1a\x07"
+ "\x18\x0d\x07\x10\xc3\x10\x30\x0c\x48\x08\xd4\x00\xac\xfc\x5b\xf7"
+ "\x58\xf7\x03\xf7\x50\xf9\xbf\xfb\x6c\xfe\x5c\x02\x64\x03\x38\x06"
+ "\xb3\x06\x87\x06\x6a\x05\x2b\x03\x3f\x01\x71\xfe\xec\xfc\xe0\xf9"
+ "\x3d\xf9\xe2\xf8\xa6\xf9\x8c\xfb\x3e\xff\x8b\x07\x61\xf8\xfa\xfb"
+ "\x27\xf5\xce\xf3\x74\xf0\x16\xf5\x63\xff\xf1\xfb\x6e\x0b\x2b\x0b"
+ "\x79\x12\xfe\x0c\x79\x10\x79\x0a\xe8\x02\x98\x01\x03\xfc\x8f\xfa"
+ "\xfe\xf2\x4b\xf6\x0c\xf6\xb5\xf9\x88\x01\xf5\x07\x20\x0e\xce\x0c"
+ "\x22\x10\x82\x0a\x5e\x07\xa9\x02\x73\xfe\x22\xfb\x84\xf5\x9d\xf4"
+ "\x71\xef\x37\xf1\xe6\xf1\x06\xf9\x4a\xfe\x4f\x05\xcd\x0b\x08\x0f"
+ "\x24\x0f\x34\x0d\x50\x09\x7a\x03\xab\xfe\x4f\xfb\x1e\xf9\xd2\xf7"
+ "\x1a\xf8\x9e\xf9\x45\xfb\x4d\x00\xd8\x02\xc8\x06\x01\x08\x21\x08"
+ "\xb5\x06\x6a\x03\xfd\x01\x69\xfe\xbd\xfd\xf3\xf8\x84\xf9\xa5\xf6"
+ "\xfb\xf8\x02\xf8\xae\x03\x83\xf7\x95\xf6\x9c\xf7\x7d\xf2\xa5\xf5"
+ "\x86\xf3\x2e\x04\x76\xfd\x7c\x0a\xbd\x0d\xfd\x10\xeb\x0e\x1c\x0d"
+ "\x54\x0d\xba\x01\xb9\x01\xa7\xfc\x7b\xfb\x5f\xf5\x97\xf4\x25\xf7"
+ "\x85\xf6\xe7\xfe\x92\x04\x88\x0c\x91\x0c\x8c\x0e\x59\x0d\xe3\x06"
+ "\x59\x05\x6c\xff\x83\xfe\x24\xf7\x76\xf6\xee\xf1\x7a\xf0\x9d\xf1"
+ "\xc3\xf5\x33\xfc\x8f\x00\xd2\x08\xd8\x0c\xfa\x0e\x67\x0d\x6d\x0c"
+ "\xac\x07\xa3\x02\x4b\xff\xfa\xfb\x11\xfa\x43\xf7\x03\xf9\x1e\xf8"
+ "\x9a\xfc\xef\xfe\xee\x03\xb2\x06\x98\x07\x40\x08\xdc\x05\x0e\x04"
+ "\xf6\x00\x38\xff\x8f\xfc\x7e\xfa\x58\xf9\x92\xf8\x71\xfa\x4d\xfb"
+ "\x2a\xef\xa8\xf2\x50\xed\x53\xf0\x88\xf0\x13\xfa\x5c\x03\x6e\x05"
+ "\xe2\x12\xf3\x13\x14\x18\xcd\x11\x02\x11\xc2\x08\x6a\x01\xb7\xfe"
+ "\xfc\xf9\xb1\xf7\x60\xf2\x63\xf3\x9b\xf3\xfc\xf6\x82\xff\x7a\x06"
+ "\x03\x0e\xe2\x0e\x79\x11\xaf\x0c\x7a\x07\x62\x03\xc5\xfe\xb2\xfb"
+ "\xf7\xf5\x9d\xf4\xd3\xef\x87\xef\x1f\xf1\xcd\xf5\xde\xfb\xd3\x02"
+ "\x00\x0b\x30\x0f\xa1\x10\x9e\x0f\xe2\x0c\x83\x07\xc9\x03\x21\x00"
+ "\xdf\xfc\x17\xf9\xa5\xf7\x8c\xf6\x7e\xf7\x2f\xfb\x19\xff\x9b\x03"
+ "\x0f\x07\x8b\x08\x72\x08\x51\x06\x3a\x04\x7f\x01\x84\xfe\x66\xfc"
+ "\xb7\xfa\x76\xf9\x99\xf9\x36\xfa\x48\xed\x03\xef\x59\xea\x05\xeb"
+ "\x87\xed\xab\xf5\xb4\x01\x91\x04\x0a\x13\xb3\x16\x09\x1b\x15\x17"
+ "\xf5\x14\x79\x0d\x4c\x04\x4e\x00\xe4\xfa\x51\xf7\xa3\xf2\xc0\xf1"
+ "\x16\xf2\x48\xf3\x26\xfb\x30\x02\xbf\x09\x78\x0d\xe1\x10\xd7\x0f"
+ "\xd9\x0a\xff\x06\x21\x01\x66\xfd\x1d\xf7\x2d\xf5\x5b\xf1\x8c\xef"
+ "\x2f\xf0\xa3\xf3\x54\xf8\xac\xfe\x54\x07\x66\x0d\xeb\x10\x2e\x12"
+ "\xf1\x0f\x89\x0b\x53\x06\x7b\x02\xbf\xfe\xa6\xfa\xac\xf8\x44\xf6"
+ "\x4d\xf6\xc4\xf7\x03\xfc\x19\x00\xfc\x04\x01\x08\x63\x09\x32\x08"
+ "\xd5\x05\x4c\x03\xbd\xff\x0d\xfd\xc0\xfb\x4a\xf9\xeb\xf9\x02\xf8"
+ "\x02\xed\x97\xed\x3d\xe9\xd9\xea\x2b\xed\x5a\xf6\xb4\x00\x74\x05"
+ "\x16\x12\x0e\x16\x8d\x19\xee\x16\xd3\x14\x8d\x0e\x5e\x06\xd8\x02"
+ "\x44\xfd\x9b\xf8\x34\xf4\x64\xf2\xa1\xf2\x05\xf3\x2b\xfa\x87\xff"
+ "\x4c\x06\xc1\x09\x78\x0d\x81\x0d\x02\x0a\x6a\x08\xe8\x03\x3b\x00"
+ "\x27\xfa\x47\xf7\x5d\xf3\x9d\xf0\xaa\xf1\xc6\xf3\x1f\xf7\x8f\xfc"
+ "\xbc\x03\xb0\x09\x55\x0d\x27\x11\xb1\x10\x84\x0e\x81\x0a\xc3\x06"
+ "\xb6\x01\x78\xfc\x1e\xf9\x23\xf6\x1b\xf5\xcf\xf6\x86\xf9\x46\xfe"
+ "\xe2\x01\x6b\x06\x02\x08\x30\x08\xf2\x05\x6a\x04\x73\x01\x48\xfe"
+ "\x77\xfc\x26\xfc\xc2\xfa\x90\xec\x57\xee\x2c\xe7\x65\xe7\xd0\xe8"
+ "\x96\xf1\xfd\xfb\x40\x00\x14\x10\x38\x14\x61\x19\x90\x18\x10\x18"
+ "\xd9\x11\xb1\x09\xab\x06\x80\x01\xa0\xfb\x60\xf7\x6a\xf4\xec\xf2"
+ "\xe9\xf0\xf1\xf6\x76\xfb\x01\x01\x8f\x05\x2e\x0a\x35\x0b\x56\x09"
+ "\x68\x09\xa0\x05\x08\x03\x7d\xfe\xe6\xfb\xd6\xf6\x95\xf3\xf2\xf1"
+ "\x20\xf3\x8e\xf4\xf3\xf8\xc6\xff\x67\x05\xb6\x09\xe3\x0d\xa2\x0f"
+ "\xb3\x0e\x46\x0d\x51\x0b\xab\x07\xdd\x02\xa0\xfe\x03\xfa\x04\xf6"
+ "\x98\xf5\xe1\xf5\x95\xf9\x7b\xfd\xdc\x01\x4d\x05\x66\x06\x0f\x07"
+ "\xc7\x04\xd9\x02\xf8\xfe\x0e\xfe\xf7\xfb\x88\xfd\x40\xf2\x44\xef"
+ "\x60\xeb\x4a\xe6\x76\xe9\xb1\xec\x57\xf9\x8d\xfd\xce\x0a\xe7\x12"
+ "\x4a\x16\x71\x18\x2b\x16\x59\x13\xac\x0b\x47\x08\x3e\x05\x37\xff"
+ "\xc5\xfb\x0d\xf7\x43\xf5\x61\xf2\x89\xf5\x10\xfa\x73\xfd\x69\x02"
+ "\x0a\x05\xd0\x07\x3a\x06\x18\x07\x6f\x05\xd7\x03\x5f\x01\x70\xfe"
+ "\xee\xfa\x5f\xf7\x1e\xf5\x7c\xf5\xd2\xf4\x31\xf8\x0a\xfd\xdb\x01"
+ "\xc0\x06\xa1\x0a\xe8\x0d\x23\x0d\xc1\x0d\x36\x0c\xbc\x09\x2a\x06"
+ "\x08\x02\xd9\xfd\x17\xf9\x27\xf8\xad\xf6\x4d\xf8\xa2\xfa\xaa\xfd"
+ "\xbe\x00\x26\x02\xa6\x04\xd6\x03\x75\x03\xa7\x00\x92\xff\x56\xfe"
+ "\xbf\xfe\xe2\xf3\x9a\xf2\xf5\xed\xb2\xe8\x01\xea\xcd\xeb\xf3\xf5"
+ "\xdf\xf8\x38\x07\x48\x0f\xaa\x14\xd3\x17\x4f\x17\x9a\x13\xb4\x0c"
+ "\xab\x09\x6e\x06\x75\x01\x37\xfe\x7a\xfa\x22\xf7\x5e\xf3\x95\xf4"
+ "\x93\xf7\x8b\xfa\xb1\xff\x63\x03\x35\x06\x8b\x05\x90\x06\xf3\x04"
+ "\xc2\x03\xf1\x01\x37\x00\x14\xfd\xfb\xf9\xb1\xf7\x58\xf6\x85\xf4"
+ "\x8d\xf7\xca\xfb\x50\x00\xee\x05\x6a\x0a\x81\x0d\xf2\x0c\xc1\x0d"
+ "\xd4\x0b\x7a\x09\x9c\x06\x5d\x03\x5b\xff\xd2\xfa\x0f\xfa\x84\xf7"
+ "\x1c\xf8\xaf\xf9\x60\xfc\xee\xfe\x4c\x00\xe0\x02\x93\x02\xf6\x01"
+ "\x8c\x00\x4f\xff\x65\xff\xfb\xfd\xa4\xf4\x98\xf4\xcb\xee\xef\xea"
+ "\xd1\xeb\x71\xee\x47\xf5\x2e\xf9\x47\x06\x65\x0d\xd4\x12\xed\x16"
+ "\xf5\x16\x0c\x13\xd2\x0d\xb0\x0a\xd1\x06\xb7\x01\xd7\xfe\x6e\xfb"
+ "\xef\xf7\x25\xf5\x12\xf6\x46\xf7\x20\xf9\x3b\xfd\x97\x00\x3e\x03"
+ "\x0b\x04\xf8\x05\xdc\x04\x06\x04\x5c\x02\x87\x00\x77\xfd\x38\xfb"
+ "\x05\xf9\x9d\xf6\x72\xf6\x23\xf8\xc7\xfb\x8f\xff\xc6\x05\xab\x0a"
+ "\x71\x0d\x7d\x0e\xc1\x0e\x2e\x0c\x11\x09\xac\x05\x6a\x02\xc8\xfe"
+ "\xf3\xfb\x6f\xfb\x4f\xf9\x82\xf9\xf5\xf9\x2a\xfb\x6e\xfc\x2f\xfe"
+ "\xbc\x00\x45\x01\x3e\x01\xb0\x00\xc9\xff\xfc\xff\x1d\xf7\xa2\xf4"
+ "\x31\xf2\xe3\xec\xfc\xec\x58\xee\x6b\xf4\x7c\xf6\xff\xff\xcf\x08"
+ "\x2e\x0e\x4f\x13\x74\x16\xda\x14\x35\x10\xf1\x0c\xa0\x09\x93\x04"
+ "\xdc\x00\x3a\xfe\xd3\xfa\xc8\xf7\x3f\xf7\x62\xf8\x1d\xf8\xb6\xfa"
+ "\xc7\xfd\x1e\x00\xfa\x00\x3b\x03\xb5\x03\x37\x03\xaa\x02\xe2\x01"
+ "\xd2\xff\x82\xfd\x31\xfb\x6a\xf8\x45\xf7\x99\xf7\xb8\xfa\x64\xfe"
+ "\xde\x02\x33\x08\x8a\x0b\x1f\x0d\x59\x0d\x86\x0c\x6b\x0a\x37\x07"
+ "\x83\x04\xa9\x01\xcd\xfe\xea\xfc\xe2\xfb\xba\xfa\x92\xfa\x53\xfa"
+ "\x5e\xfb\xea\xfb\x9a\xfd\xc7\xfe\xed\xff\xf3\xff\x8e\x02\x8d\xfd"
+ "\x86\xf6\xe0\xf5\x8a\xef\x12\xee\x3a\xed\x17\xf2\x7d\xf5\x1e\xfa"
+ "\x96\x03\xbc\x08\x13\x0d\x89\x11\x43\x13\x73\x11\x1d\x0f\xac\x0d"
+ "\x26\x0a\xd8\x04\x5a\x01\xa5\xfd\x15\xfa\x95\xf7\xde\xf8\x3a\xf9"
+ "\xc9\xfa\x48\xfc\x80\xfe\xf3\xfe\x91\xff\xd5\x00\x3a\x01\x63\x01"
+ "\x3e\x01\x19\x01\x21\xff\x9c\xfd\x3a\xfb\x03\xfa\x17\xf9\x59\xfa"
+ "\x23\xfd\x77\x00\xb5\x03\x7a\x07\xe8\x09\x40\x0b\x25\x0b\x2d\x0b"
+ "\x8b\x09\x65\x07\x7d\x05\x76\x02\x9f\x00\x54\xfe\x1f\xfd\x8d\xfc"
+ "\xbd\xfb\x5d\xfb\x6a\xfb\x44\xfb\xae\xfb\xee\xfb\xd6\xfc\xc7\xfd"
+ "\x44\xff\x8f\xf8\xe3\xf7\x36\xf5\x1d\xf1\x74\xf1\xac\xf1\x48\xf6"
+ "\x42\xf7\x0b\xff\xfc\x04\xfd\x08\x4f\x0d\x43\x10\xb2\x0f\x73\x0d"
+ "\x2d\x0c\xa5\x0a\x25\x07\xc0\x04\x43\x02\x50\xff\x59\xfc\x06\xfb"
+ "\xf3\xfa\xf2\xf9\x8e\xfb\xab\xfc\xe4\xfd\xe2\xfd\x51\xff\x71\xff"
+ "\xef\xfe\x1f\xff\x48\xff\xc0\xfe\xbe\xfd\x6a\xfd\xcf\xfc\xa2\xfb"
+ "\x32\xfc\x86\xfd\x9c\xff\x09\x02\x63\x05\xee\x07\x07\x09\xed\x09"
+ "\x5d\x09\x3a\x08\xa8\x06\x9f\x05\x4d\x04\x97\x02\xc8\x01\xfe\xff"
+ "\xa3\xfe\xab\xfd\xb6\xfc\x5a\xfc\xba\xfb\x13\xfc\xee\xfb\xd2\xfb"
+ "\x2f\xfc\x03\xfd\xa1\xf6\x04\xf6\xeb\xf3\xf4\xf0\xbf\xf1\x29\xf3"
+ "\xc2\xf7\x83\xf9\x3f\x00\xb6\x05\x72\x09\xa6\x0c\x47\x0f\xb8\x0e"
+ "\xa7\x0c\xbd\x0a\x37\x09\xc5\x05\x66\x03\x1d\x01\xcd\xfe\x7e\xfc"
+ "\x9d\xfb\xe3\xfb\x82\xfb\xd6\xfc\xcc\xfd\x08\xff\xae\xfe\x71\xff"
+ "\x3d\xff\x19\xff\x8d\xfe\xcd\xfe\xe6\xfd\xdf\xfc\xa0\xfc\x00\xfc"
+ "\x32\xfc\xdf\xfc\x0a\xff\x46\x01\x88\x03\xd2\x05\x3d\x07\xb8\x07"
+ "\xdf\x07\x78\x07\x2a\x07\x4d\x06\x85\x05\xa1\x04\x2e\x03\x4a\x02"
+ "\x83\x00\x6e\xff\x65\xfe\x83\xfd\x36\xfd\xe7\xfc\x80\xfc\xad\xfc"
+ "\x10\xfc\x03\xfd\x10\xf9\x00\xf5\x7c\xf4\xc9\xef\x5d\xf0\xbe\xf0"
+ "\xdf\xf4\x34\xf8\x25\xfd\x57\x04\xda\x07\xf7\x0b\xc9\x0e\x88\x0f"
+ "\x30\x0e\xde\x0c\xdc\x0a\x2a\x08\x80\x04\x3a\x02\x8a\xfe\x22\xfc"
+ "\x81\xfa\x30\xfa\x09\xfa\x1c\xfb\x1c\xfd\x10\xfe\x54\xff\x35\x00"
+ "\x8a\x00\x0b\x00\xe4\xff\x46\xff\x62\xfe\x70\xfd\xdf\xfc\xc9\xfb"
+ "\xcc\xfb\x2d\xfc\xca\xfd\xde\xff\x66\x02\xb6\x04\x3b\x06\x28\x07"
+ "\x49\x07\x02\x07\x6d\x06\x1a\x06\xaf\x05\x4b\x05\x34\x04\x7b\x03"
+ "\xca\x01\x70\x00\x55\xff\x3a\xfe\xae\xfd\xa3\xfd\x53\xfd\x99\xfd"
+ "\x91\xfd\xe3\xfd\xd4\xf8\xc7\xf5\x76\xf3\x61\xee\xce\xee\x27\xef"
+ "\x7d\xf3\x27\xf7\xb6\xfd\x50\x04\x36\x08\x4f\x0c\x8c\x0e\xbf\x0e"
+ "\x1c\x0e\x62\x0d\xdc\x0b\x5b\x09\x6d\x06\x75\x03\x88\xff\x45\xfc"
+ "\xf0\xf9\xed\xf8\xfb\xf7\x72\xf9\xa8\xfa\x5c\xfc\xed\xfd\x81\xff"
+ "\x64\x00\xa6\x00\xba\x00\x1f\x00\xa0\xff\x1f\xff\xaa\xfe\x11\xfe"
+ "\xfe\xfd\xf0\xfd\x9e\xfe\xd3\xff\x58\x01\xb4\x02\x05\x04\xd8\x04"
+ "\x93\x05\x71\x05\xa0\x05\xac\x05\xa9\x05\x94\x05\x3b\x05\xb8\x04"
+ "\x3d\x03\x7c\x01\x2f\x00\x30\xfe\x70\xfd\xd4\xfc\x94\xfc\xcd\xfc"
+ "\x71\xfd\x5b\xfc\xba\xf7\xb4\xf6\x88\xf2\x0b\xf0\xe9\xef\x64\xf1"
+ "\x1b\xf5\x16\xf9\x29\x00\x1a\x05\x44\x09\x86\x0c\xad\x0d\x39\x0d"
+ "\xa0\x0c\xca\x0b\x80\x0a\x54\x08\x55\x06\x71\x03\x0e\x00\xdd\xfc"
+ "\xc3\xfa\x26\xf9\x67\xf8\x1c\xf9\x2e\xfa\x8d\xfb\xbb\xfc\x2f\xfe"
+ "\xb8\xfe\x28\xff\x4b\xff\x85\xff\x68\xff\x9f\xff\xb8\xff\xe3\xff"
+ "\x0d\x00\x45\x00\xaa\x00\x05\x01\xc0\x01\x7e\x02\xf4\x02\xad\x03"
+ "\x45\x04\x59\x04\x94\x04\x97\x04\x8c\x04\x95\x04\xbf\x04\x67\x04"
+ "\x71\x03\x8e\x02\x4d\x01\xab\xff\x50\xfe\x55\xfd\x6c\xfc\x27\xfc"
+ "\x79\xfb\x85\xf7\x5f\xf6\xaf\xf3\x48\xf1\x7b\xf1\x4b\xf2\x66\xf5"
+ "\xa1\xf8\xa7\xfe\xa8\x03\xba\x07\x70\x0b\x1f\x0d\xcd\x0c\x54\x0c"
+ "\x5a\x0b\xe1\x09\x01\x08\x19\x06\xe7\x03\x33\x01\x81\xfe\x5a\xfc"
+ "\x97\xfa\x50\xf9\x5c\xf9\xf3\xf9\x1d\xfb\x36\xfc\x9f\xfd\x28\xfe"
+ "\x35\xfe\x7a\xfe\x67\xfe\x64\xfe\xfb\xfe\xb2\xff\x49\x00\xd8\x00"
+ "\x4a\x01\x7f\x01\x98\x01\xa4\x01\x16\x02\x3c\x02\xa0\x02\x8f\x03"
+ "\xe3\x03\x70\x04\x85\x04\x88\x04\x0e\x04\xac\x03\xac\x03\xdd\x02"
+ "\xa7\x02\xe3\x01\x34\x01\x09\x00\xf1\xfe\xc3\xfd\x11\xfd\x1d\xfa"
+ "\x20\xf7\xc0\xf5\x2c\xf2\x69\xf1\x8e\xf1\x88\xf3\x51\xf6\x91\xfa"
+ "\x11\x00\x0e\x04\xc2\x07\xe5\x0a\x21\x0c\x07\x0c\xfa\x0b\x29\x0b"
+ "\xb8\x09\xd4\x07\x17\x06\x64\x03\xb6\x00\x3e\xfe\x33\xfc\x10\xfa"
+ "\x18\xf9\x40\xf9\xa5\xf9\xa4\xfa\x14\xfc\x39\xfd\xd2\xfd\x6a\xfe"
+ "\xc1\xfe\xfb\xfe\x22\xff\xf1\xff\x72\x00\x30\x01\xb0\x01\x2f\x02"
+ "\xea\x01\x95\x01\x32\x01\xc5\x00\xd2\x00\x1a\x01\x13\x02\xfb\x02"
+ "\xea\x03\x96\x04\x1a\x05\xc9\x04\x87\x04\xd6\x03\x26\x03\x6c\x02"
+ "\xd3\x01\x10\x01\x1d\x00\xef\xfe\xa4\xfd\x41\xfa\x94\xf7\x40\xf5"
+ "\x5c\xf2\xea\xf1\xfb\xf1\x61\xf4\x22\xf7\x4a\xfb\xef\xff\x9d\x03"
+ "\x1d\x07\x71\x09\x62\x0a\xfa\x0a\xc5\x0a\x75\x0a\x85\x09\x1d\x08"
+ "\xb6\x06\x40\x04\x00\x02\x6f\xff\x21\xfd\x2e\xfb\xdc\xf9\x6d\xf9"
+ "\x8d\xf9\x23\xfa\x19\xfb\xf0\xfb\xb6\xfc\x42\xfd\xd9\xfd\x45\xfe"
+ "\x08\xff\xed\xff\x0c\x01\xfc\x01\xd2\x02\x61\x03\x22\x03\x9c\x02"
+ "\xab\x01\xcf\x00\x19\x00\xd4\xff\x13\x00\xc6\x00\xb5\x01\xba\x02"
+ "\x65\x03\xf6\x03\x06\x04\xc4\x03\x4b\x03\x16\x03\x8e\x02\x3d\x02"
+ "\xb2\x01\x0b\x01\x0d\xff\x92\xfb\x4f\xf9\x9a\xf5\x13\xf3\x12\xf2"
+ "\x8b\xf2\x78\xf4\x6a\xf7\x04\xfc\x02\x00\x75\x03\x8a\x06\x58\x08"
+ "\xd2\x08\x5b\x09\x87\x09\x44\x09\xb7\x08\xfe\x07\x98\x06\x79\x04"
+ "\x36\x02\xf7\xff\x88\xfd\xc5\xfb\xe2\xfa\x3d\xfa\x81\xfa\x05\xfb"
+ "\xcb\xfb\x58\xfc\xda\xfc\x63\xfd\x8c\xfd\xfe\xfd\xa4\xfe\x82\xff"
+ "\x7c\x00\x7b\x01\x5e\x02\xe7\x02\xea\x02\x99\x02\xfb\x01\x31\x01"
+ "\x91\x00\x17\x00\x44\x00\xb2\x00\x64\x01\x39\x02\xad\x02\xf9\x02"
+ "\xd1\x02\x4d\x02\xef\x01\xae\x01\x80\x01\xad\x01\xc0\x01\x91\x01"
+ "\x65\xff\x5c\xfd\xa2\xfa\xf6\xf6\x2a\xf5\xcf\xf3\x53\xf4\xff\xf5"
+ "\x37\xf9\x08\xfd\x2f\x00\x71\x03\x99\x05\xa0\x06\x79\x07\x14\x08"
+ "\x8a\x08\xd6\x08\xd8\x08\x52\x08\xe9\x06\xee\x04\x74\x02\x9b\xff"
+ "\xff\xfc\x2e\xfb\xfa\xf9\xc6\xf9\x3f\xfa\x20\xfb\xef\xfb\xa0\xfc"
+ "\x12\xfd\x63\xfd\xb5\xfd\x41\xfe\x08\xff\x09\x00\x32\x01\x16\x02"
+ "\xaf\x02\xd1\x02\x75\x02\xb8\x01\xf9\x00\x60\x00\x24\x00\x52\x00"
+ "\xe0\x00\x98\x01\x3b\x02\xa1\x02\xdc\x02\xad\x02\x3f\x02\xfb\x01"
+ "\xba\x01\x88\x01\x8e\x01\x92\x01\xe5\x00\xb0\xfe\xae\xfc\xf2\xf9"
+ "\xae\xf6\xd0\xf4\xca\xf3\x57\xf4\x1b\xf6\xad\xf9\xcd\xfd\x67\x01"
+ "\xc5\x04\xe2\x06\x98\x07\xd0\x07\xcb\x07\xbe\x07\xc7\x07\xe2\x07"
+ "\xf3\x07\x44\x07\xfd\x05\x28\x04\x7d\x01\x9e\xfe\x2c\xfc\x47\xfa"
+ "\x71\xf9\x68\xf9\x33\xfa\x1e\xfb\xee\xfb\x91\xfc\xc0\xfc\xff\xfc"
+ "\x58\xfd\x39\xfe\x90\xff\x2b\x01\xb8\x02\xe0\x03\x28\x04\x93\x03"
+ "\x72\x02\xe5\x00\x91\xff\xd2\xfe\xbe\xfe\x51\xff\x33\x00\x50\x01"
+ "\x3e\x02\x8f\x02\x92\x02\x29\x02\x8e\x01\x1b\x01\xcd\x00\xe7\x00"
+ "\x15\x01\x28\x01\xf0\x00\x0f\xff\x50\xfd\x2b\xfb\x83\xf8\x24\xf7"
+ "\x66\xf6\x17\xf7\x8f\xf8\x2b\xfb\x47\xfe\xcd\x00\x2e\x03\xf6\x04"
+ "\xb5\x05\x2e\x06\x9a\x06\xd7\x06\xf2\x06\xe5\x06\xa0\x06\xa7\x05"
+ "\x38\x04\x8f\x02\x9e\x00\x9c\xfe\x28\xfd\x3b\xfc\xbf\xfb\xce\xfb"
+ "\x24\xfc\x71\xfc\xa9\xfc\xd9\xfc\x15\xfd\x5c\xfd\x09\xfe\x20\xff"
+ "\x54\x00\x8c\x01\x81\x02\xed\x02\xa2\x02\xfa\x01\x1d\x01\x1e\x00"
+ "\x69\xff\x3c\xff\x9c\xff\x1b\x00\xd6\x00\xa1\x01\xd4\x01\xdd\x01"
+ "\x02\x02\xa8\x01\x89\x01\x56\x01\x8f\x01\x71\x00\xc9\xfe\xc3\xfd"
+ "\xeb\xfa\xf4\xf8\x60\xf7\xbc\xf6\x0a\xf7\x7e\xf8\x9b\xfb\x6f\xfe"
+ "\x63\x01\x20\x04\x8f\x05\x16\x06\x54\x06\x46\x06\x2f\x06\x42\x06"
+ "\xa2\x06\xa7\x06\x3a\x06\x5f\x05\xc4\x03\x68\x01\x13\xff\xde\xfc"
+ "\x2f\xfb\x56\xfa\x6a\xfa\x28\xfb\x24\xfc\x39\xfd\x02\xfe\x55\xfe"
+ "\x63\xfe\x71\xfe\xa3\xfe\x3c\xff\x38\x00\x65\x01\x7e\x02\x11\x03"
+ "\x19\x03\x64\x02\x1b\x01\xdc\xff\xb4\xfe\x2b\xfe\x4d\xfe\xf2\xfe"
+ "\x15\x00\xf9\x00\xb4\x01\x07\x02\xda\x01\x8f\x01\x3b\x01\x1d\x01"
+ "\x1d\x01\x4e\x01\xa6\x01\x20\x01\x21\xff\xb6\xfd\x31\xfb\x84\xf8"
+ "\x37\xf7\xa3\xf6\x80\xf7\x2d\xf9\x5f\xfc\x8b\xff\x0e\x02\x75\x04"
+ "\xb8\x05\xcf\x05\xe0\x05\xdc\x05\xc0\x05\xb8\x05\xed\x05\xda\x05"
+ "\x1d\x05\x0a\x04\x77\x02\x4c\x00\x38\xfe\xa2\xfc\x71\xfb\x07\xfb"
+ "\x55\xfb\x10\xfc\xc6\xfc\x8e\xfd\x29\xfe\x74\xfe\xb6\xfe\x3f\xff"
+ "\xdb\xff\x9f\x00\xa3\x01\x78\x02\xdb\x02\xb2\x02\x1b\x02\x07\x01"
+ "\xcb\xff\xb2\xfe\x15\xfe\xfa\xfd\x77\xfe\x73\xff\x66\x00\x38\x01"
+ "\xc0\x01\xf3\x01\xc8\x01\xc5\x01\xc1\x01\xcb\x01\x04\x02\x4a\x02"
+ "\xbc\x01\x0d\x00\x6e\xfe\xdc\xfb\x38\xf9\x79\xf7\xa9\xf6\x15\xf7"
+ "\xa2\xf8\x6f\xfb\x58\xfe\xf1\x00\x23\x03\x52\x04\xa1\x04\xda\x04"
+ "\x0f\x05\x62\x05\xe5\x05\x71\x06\xa5\x06\x1b\x06\xfa\x04\x3a\x03"
+ "\xdf\x00\xa3\xfe\xf3\xfc\xbf\xfb\x73\xfb\xd9\xfb\x8d\xfc\x41\xfd"
+ "\xca\xfd\x1f\xfe\x21\xfe\x26\xfe\x7b\xfe\x1b\xff\x13\x00\x4e\x01"
+ "\x62\x02\x1e\x03\x48\x03\xc5\x02\xbd\x01\x5e\x00\x26\xff\x4f\xfe"
+ "\xf4\xfd\x49\xfe\xfb\xfe\xbc\xff\x75\x00\x03\x01\x23\x01\xed\x00"
+ "\xee\x00\xd8\x00\xf5\x00\x56\x01\xda\x01\xa2\x01\xa5\x00\x9e\xff"
+ "\x77\xfd\x53\xfb\xb2\xf9\xc6\xf8\xe7\xf8\x0e\xfa\x49\xfc\x8e\xfe"
+ "\x9c\x00\x4a\x02\x0d\x03\x1e\x03\x32\x03\x41\x03\x9f\x03\x23\x04"
+ "\xd2\x04\x39\x05\xf4\x04\x44\x04\xd8\x02\x0e\x01\x61\xff\x20\xfe"
+ "\x61\xfd\x35\xfd\xa0\xfd\x2b\xfe\x73\xfe\x9d\xfe\x77\xfe\x28\xfe"
+ "\x07\xfe\x36\xfe\xc6\xfe\xa4\xff\xa8\x00\x9a\x01\x23\x02\x28\x02"
+ "\xa6\x01\xcc\x00\xd6\xff\x14\xff\xac\xfe\xab\xfe\x11\xff\xa0\xff"
+ "\x3f\x00\xad\x00\x02\x01\x16\x01\x14\x01\x2b\x01\x50\x01\xa3\x01"
+ "\x15\x02\x44\x02\xe6\x01\xb3\x00\x26\xff\x0a\xfd\xde\xfa\x6d\xf9"
+ "\x9d\xf8\xeb\xf8\x3f\xfa\x5e\xfc\x9e\xfe\x92\x00\x15\x02\xc6\x02"
+ "\xe7\x02\xfc\x02\x0b\x03\x6c\x03\x00\x04\x9d\x04\xf1\x04\xbf\x04"
+ "\x10\x04\xbc\x02\x17\x01\x81\xff\x3e\xfe\x8d\xfd\x7e\xfd\xdc\xfd"
+ "\x59\xfe\xbd\xfe\xe8\xfe\xc2\xfe\x78\xfe\x3a\xfe\x40\xfe\xa7\xfe"
+ "\x66\xff\x54\x00\x40\x01\xf5\x01\x21\x02\xc5\x01\x20\x01\x44\x00"
+ "\x80\xff\xfc\xfe\xe1\xfe\x16\xff\x7c\xff\x04\x00\x64\x00\x87\x00"
+ "\x81\x00\x61\x00\x45\x00\x65\x00\xb4\x00\x43\x01\xb3\x01\xaf\x01"
+ "\x01\x01\xd9\xff\x4a\xfe\x7c\xfc\x25\xfb\x66\xfa\x7d\xfa\x78\xfb"
+ "\x0b\xfd\xd2\xfe\x58\x00\x75\x01\x02\x02\x23\x02\x34\x02\x67\x02"
+ "\xcb\x02\x41\x03\xbd\x03\xf0\x03\xbb\x03\x28\x03\x3e\x02\x24\x01"
+ "\x1b\x00\x50\xff\xc7\xfe\x85\xfe\x7c\xfe\x80\xfe\x72\xfe\x60\xfe"
+ "\x3d\xfe\x2c\xfe\x35\xfe\x74\xfe\xf2\xfe\x8f\xff\x3f\x00\xd8\x00"
+ "\x3f\x01\x49\x01\x1c\x01\xc7\x00\x51\x00\xf4\xff\xb6\xff\xae\xff"
+ "\xeb\xff\x3b\x00\x83\x00\xc0\x00\xc5\x00\xb5\x00\x77\x00\x22\x00"
+ "\x11\x00\x19\x00\x50\x00\x94\x00\x77\x00\xf6\xff\x1f\xff\x02\xfe"
+ "\xd3\xfc\xf6\xfb\xb7\xfb\x1c\xfc\x19\xfd\x7a\xfe\xdd\xff\xf1\x00"
+ "\x95\x01\xbc\x01\x9a\x01\x73\x01\x7f\x01\xc0\x01\x33\x02\xad\x02"
+ "\xf4\x02\xf2\x02\x9c\x02\xf2\x01\x20\x01\x61\x00\xc8\xff\x63\xff"
+ "\x36\xff\x2f\xff\x21\xff\x0c\xff\xe1\xfe\xa6\xfe\x78\xfe\x6c\xfe"
+ "\x8b\xfe\xe3\xfe\x6a\xff\xf6\xff\x72\x00\xca\x00\xeb\x00\xca\x00"
+ "\x7c\x00\x2d\x00\xd8\xff\xaf\xff\xba\xff\xf0\xff\x40\x00\x88\x00"
+ "\xcd\x00\xd5\x00\xc7\x00\xa8\x00\x79\x00\x63\x00\x65\x00\x3b\x00"
+ "\xf0\xff\x7b\xff\xb2\xfe\xd8\xfd\xfe\xfc\x77\xfc\x55\xfc\xc1\xfc"
+ "\xa5\xfd\xb9\xfe\xe6\xff\xe3\x00\x8b\x01\xdd\x01\xea\x01\xe2\x01"
+ "\xe2\x01\xf5\x01\x37\x02\x68\x02\x90\x02\x80\x02\x30\x02\xa7\x01"
+ "\x02\x01\x60\x00\xca\xff\x5f\xff\x15\xff\xe4\xfe\xcb\xfe\xcc\xfe"
+ "\xc5\xfe\xcf\xfe\xd0\xfe\xdb\xfe\xee\xfe\x1e\xff\x53\xff\xa6\xff"
+ "\x03\x00\x55\x00\x8f\x00\x9b\x00\x80\x00\x35\x00\xf1\xff\xa8\xff"
+ "\x81\xff\x89\xff\xb4\xff\xf2\xff\x3b\x00\x5c\x00\x60\x00\x44\x00"
+ "\x2a\x00\x19\x00\x28\x00\x56\x00\x53\x00\x37\x00\xed\xff\x70\xff"
+ "\xe3\xfe\x65\xfe\x18\xfe\x19\xfe\x66\xfe\xf0\xfe\x8b\xff\x20\x00"
+ "\x92\x00\xd2\x00\xf0\x00\xfe\x00\x12\x01\x37\x01\x69\x01\xa3\x01"
+ "\xc8\x01\xce\x01\xb6\x01\x78\x01\x1a\x01\xb7\x00\x50\x00\xe4\xff"
+ "\x93\xff\x51\xff\x25\xff\x0d\xff\x0d\xff\x00\xff\xfa\xfe\x07\xff"
+ "\x09\xff\x1d\xff\x3f\xff\x6c\xff\xbf\xff\x0a\x00\x3f\x00\x74\x00"
+ "\x9c\x00\x90\x00\x4c\x00\x09\x00\xd9\xff\xc7\xff\xc4\xff\xd7\xff"
+ "\xf7\xff\x1f\x00\x25\x00\x16\x00\xfd\xff\xeb\xff\xea\xff\xc9\xff"
+ "\xb6\xff\xa0\xff\x86\xff\x6c\xff\x44\xff\x28\xff\x1b\xff\x39\xff"
+ "\x81\xff\xc8\xff\x1f\x00\x6b\x00\x90\x00\xa8\x00\xb2\x00\xbc\x00"
+ "\xd5\x00\xf4\x00\x09\x01\x1b\x01\x22\x01\x1f\x01\x06\x01\xdd\x00"
+ "\xb0\x00\x74\x00\x3b\x00\xfc\xff\xb6\xff\x86\xff\x69\xff\x58\xff"
+ "\x56\xff\x52\xff\x5a\xff\x57\xff\x4e\xff\x52\xff\x4f\xff\x64\xff"
+ "\x82\xff\xb2\xff\xfa\xff\x2b\x00\x53\x00\x5f\x00\x4a\x00\x3d\x00"
+ "\x2a\x00\x10\x00\x08\x00\x00\x00\x06\x00\xff\xff\xea\xff\xdc\xff"
+ "\xce\xff\xc3\xff\xbd\xff\xaf\xff\x95\xff\x81\xff\x6c\xff\x64\xff"
+ "\x5b\xff\x6f\xff\x93\xff\xc5\xff\x10\x00\x5a\x00\x8a\x00\xb0\x00"
+ "\xbf\x00\xc1\x00\xc3\x00\xc2\x00\xc9\x00\xcf\x00\xd1\x00\xbb\x00"
+ "\xaa\x00\x9b\x00\x86\x00\x6e\x00\x5a\x00\x38\x00\x0d\x00\xdd\xff"
+ "\xaf\xff\x84\xff\x6b\xff\x62\xff\x61\xff\x6a\xff\x75\xff\x86\xff"
+ "\x8a\xff\x93\xff\xa2\xff\xa8\xff\xba\xff\xd4\xff\xee\xff\x06\x00"
+ "\x13\x00\x1a\x00\x18\x00\x0f\x00\x0a\x00\x01\x00\xfc\xff\xfa\xff"
+ "\xeb\xff\xe0\xff\xc2\xff\xb4\xff\xbd\xff\xbd\xff\xc6\xff\xde\xff"
+ "\xf8\xff\x05\x00\x09\x00\x11\x00\x15\x00\x14\x00\x1a\x00\x1f\x00"
+ "\x27\x00\x29\x00\x31\x00\x2e\x00\x27\x00\x1f\x00\x1c\x00\x25\x00"
+ "\x30\x00\x44\x00\x4b\x00\x43\x00\x35\x00\x25\x00\x28\x00\x2e\x00"
+ "\x39\x00\x47\x00\x4a\x00\x47\x00\x33\x00\x1c\x00\xf9\xff\xdd\xff"
+ "\xc8\xff\xc4\xff\xc3\xff\xc3\xff\xca\xff\xc5\xff\xc3\xff\xbd\xff"
+ "\xc2\xff\xce\xff\xd2\xff\xdf\xff\xf2\xff\x08\x00\x1d\x00\x29\x00"
+ "\x2c\x00\x26\x00\x19\x00\x07\x00\xf6\xff\xe3\xff\xd9\xff\xc7\xff"
+ "\xc8\xff\xcd\xff\xd3\xff\xe0\xff\xdc\xff\xd0\xff\xd3\xff\xd4\xff"
+ "\xd2\xff\xdb\xff\xe0\xff\xfa\xff\x11\x00\x27\x00\x2f\x00\x32\x00"
+ "\x35\x00\x2f\x00\x2e\x00\x37\x00\x37\x00\x3f\x00\x44\x00\x41\x00"
+ "\x42\x00\x40\x00\x36\x00\x31\x00\x34\x00\x2e\x00\x35\x00\x37\x00"
+ "\x2e\x00\x2b\x00\x18\x00\x08\x00\xf8\xff\xe2\xff\xd4\xff\xc0\xff"
+ "\xb5\xff\xa6\xff\xa9\xff\xb1\xff\xbe\xff\xcf\xff\xe2\xff\xee\xff"
+ "\xf4\xff\xec\xff\xdb\xff\xe9\xff\xe7\xff\xf1\xff\xfb\xff\xfd\xff"
+ "\x01\x00\x01\x00\xff\xff\xf3\xff\xe9\xff\xe6\xff\xed\xff\xf4\xff"
+ "\xf9\xff\x05\x00\x06\x00\x05\x00\xfa\xff\xea\xff\xe9\xff\xe6\xff"
+ "\xed\xff\xe9\xff\xec\xff\xf7\xff\xfe\xff\x05\x00\x0c\x00\x13\x00"
+ "\x19\x00\x1a\x00\x25\x00\x2d\x00\x2f\x00\x31\x00\x26\x00\x2a\x00"
+ "\x29\x00\x1f\x00\x1a\x00\x15\x00\x0f\x00\x06\x00\x06\x00\xfe\xff"
+ "\xef\xff\xe5\xff\xde\xff\xe1\xff\xe4\xff\xeb\xff\xf3\xff\x03\x00"
+ "\x16\x00\x23\x00\x35\x00\x3f\x00\x44\x00\x42\x00\x3f\x00\x34\x00"
+ "\x22\x00\x11\x00\x05\x00\xfc\xff\xea\xff\xda\xff\xd3\xff\xca\xff"
+ "\xc9\xff\xc8\xff\xc0\xff\xc8\xff\xd2\xff\xde\xff\xf2\xff\xf4\xff"
+ "\xff\xff\x0a\x00\x0e\x00\x17\x00\x12\x00\x1f\x00\x1b\x00\x14\x00"
+ "\x13\x00\x0b\x00\x05\x00\xfa\xff\xf0\xff\xe4\xff\xde\xff\xd8\xff"
+ "\xdb\xff\xea\xff\xf8\xff\xf8\xff\xff\xff\x01\x00\xfa\xff\xfd\xff"
+ "\x02\x00\x01\x00\xff\xff\x04\x00\x05\x00\x02\x00\xf1\xff\xe6\xff"
+ "\xdc\xff\xcc\xff\xd4\xff\xde\xff\xec\xff\x06\x00\x15\x00\x28\x00"
+ "\x38\x00\x40\x00\x43\x00\x44\x00\x46\x00\x41\x00\x3d\x00\x32\x00"
+ "\x30\x00\x21\x00\x0f\x00\x05\x00\xf3\xff\xe2\xff\xd4\xff\xcf\xff"
+ "\xca\xff\xcd\xff\xd7\xff\xdf\xff\xdf\xff\xe5\xff\xeb\xff\xec\xff"
+ "\xf3\xff\xfc\xff\x0d\x00\x18\x00\x13\x00\x1d\x00\x21\x00\x1f\x00"
+ "\x1f\x00\x17\x00\x0e\x00\x07\x00\xfe\xff\xf5\xff\xf1\xff\xf2\xff"
+ "\xf0\xff\xec\xff\xe9\xff\xe1\xff\xe3\xff\xe1\xff\xda\xff\xd9\xff"
diff --git a/ndk/platforms/android-9/samples/native-audio/jni/native-audio-jni.c b/ndk/platforms/android-9/samples/native-audio/jni/native-audio-jni.c
new file mode 100644
index 0000000..bc1ad85
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/jni/native-audio-jni.c
@@ -0,0 +1,605 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/* This is a JNI example where we use native methods to play sounds
+ * using OpenSL ES. See the corresponding Java source file located at:
+ *
+ * src/com/example/nativeaudio/NativeAudio/NativeAudio.java
+ */
+
+#include <assert.h>
+#include <jni.h>
+#include <string.h>
+
+// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
+// #include <android/log.h>
+
+// for native audio
+#include <SLES/OpenSLES.h>
+#include "SLES/OpenSLES_Android.h"
+
+// for native asset manager
+#include <sys/types.h>
+#include <android/asset_manager.h>
+#include <android/asset_manager_jni.h>
+
+// pre-recorded sound clips, both are 8 kHz mono 16-bit signed little endian
+
+static const char hello[] =
+#include "hello_clip.h"
+;
+
+static const char android[] =
+#include "android_clip.h"
+;
+
+// engine interfaces
+static SLObjectItf engineObject = NULL;
+static SLEngineItf engineEngine;
+
+// output mix interfaces
+static SLObjectItf outputMixObject = NULL;
+static SLEnvironmentalReverbItf outputMixEnvironmentalReverb = NULL;
+
+// buffer queue player interfaces
+static SLObjectItf bqPlayerObject = NULL;
+static SLPlayItf bqPlayerPlay;
+static SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;
+static SLEffectSendItf bqPlayerEffectSend;
+
+// aux effect on the output mix, used by the buffer queue player
+static const SLEnvironmentalReverbSettings reverbSettings =
+ SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR;
+
+// URI player interfaces
+static SLObjectItf uriPlayerObject = NULL;
+static SLPlayItf uriPlayerPlay;
+static SLSeekItf uriPlayerSeek;
+
+// file descriptor player interfaces
+static SLObjectItf fdPlayerObject = NULL;
+static SLPlayItf fdPlayerPlay;
+static SLSeekItf fdPlayerSeek;
+
+// recorder interfaces
+static SLObjectItf recorderObject = NULL;
+static SLRecordItf recorderRecord;
+static SLAndroidSimpleBufferQueueItf recorderBufferQueue;
+
+// synthesized sawtooth clip
+#define SAWTOOTH_FRAMES 8000
+static short sawtoothBuffer[SAWTOOTH_FRAMES];
+
+// 5 seconds of recorded audio at 16 kHz mono, 16-bit signed little endian
+#define RECORDER_FRAMES (16000 * 5)
+static short recorderBuffer[RECORDER_FRAMES];
+static unsigned recorderSize = 0;
+static SLmilliHertz recorderSR;
+
+// pointer and size of the next player buffer to enqueue, and number of remaining buffers
+static short *nextBuffer;
+static unsigned nextSize;
+static int nextCount;
+
+
+// synthesize a mono sawtooth wave and place it into a buffer (called automatically on load)
+__attribute__((constructor)) static void onDlOpen(void)
+{
+ unsigned i;
+ for (i = 0; i < SAWTOOTH_FRAMES; ++i) {
+ sawtoothBuffer[i] = 32768 - ((i % 100) * 660);
+ }
+}
+
+
+// this callback handler is called every time a buffer finishes playing
+void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
+{
+ assert(bq == bqPlayerBufferQueue);
+ assert(NULL == context);
+ // for streaming playback, replace this test by logic to find and fill the next buffer
+ if (--nextCount > 0 && NULL != nextBuffer && 0 != nextSize) {
+ SLresult result;
+ // enqueue another buffer
+ result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
+ // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,
+ // which for this code example would indicate a programming error
+ assert(SL_RESULT_SUCCESS == result);
+ }
+}
+
+
+// this callback handler is called every time a buffer finishes recording
+void bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
+{
+ assert(bq == bqRecorderBufferQueue);
+ assert(NULL == context);
+ // for streaming recording, here we would call Enqueue to give recorder the next buffer to fill
+ // but instead, this is a one-time buffer so we stop recording
+ SLresult result;
+ result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED);
+ if (SL_RESULT_SUCCESS == result) {
+ recorderSize = RECORDER_FRAMES * sizeof(short);
+ recorderSR = SL_SAMPLINGRATE_16;
+ }
+}
+
+
+// create the engine and output mix objects
+void Java_com_example_nativeaudio_NativeAudio_createEngine(JNIEnv* env, jclass clazz)
+{
+ SLresult result;
+
+ // create engine
+ result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // realize the engine
+ result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the engine interface, which is needed in order to create other objects
+ result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // create output mix, with environmental reverb specified as a non-required interface
+ const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB};
+ const SLboolean req[1] = {SL_BOOLEAN_FALSE};
+ result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // realize the output mix
+ result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the environmental reverb interface
+ // this could fail if the environmental reverb effect is not available,
+ // either because the feature is not present, excessive CPU load, or
+ // the required MODIFY_AUDIO_SETTINGS permission was not requested and granted
+ result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
+ &outputMixEnvironmentalReverb);
+ if (SL_RESULT_SUCCESS == result) {
+ result = (*outputMixEnvironmentalReverb)->SetEnvironmentalReverbProperties(
+ outputMixEnvironmentalReverb, &reverbSettings);
+ }
+ // ignore unsuccessful result codes for environmental reverb, as it is optional for this example
+
+}
+
+
+// create buffer queue audio player
+void Java_com_example_nativeaudio_NativeAudio_createBufferQueueAudioPlayer(JNIEnv* env,
+ jclass clazz)
+{
+ SLresult result;
+
+ // configure audio source
+ SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
+ SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_8,
+ SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
+ SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
+ SLDataSource audioSrc = {&loc_bufq, &format_pcm};
+
+ // configure audio sink
+ SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
+ SLDataSink audioSnk = {&loc_outmix, NULL};
+
+ // create audio player
+ const SLInterfaceID ids[2] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND};
+ const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
+ result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk,
+ 2, ids, req);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // realize the player
+ result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the play interface
+ result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the buffer queue interface
+ result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,
+ &bqPlayerBufferQueue);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // register callback on the buffer queue
+ result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the effect send interface
+ result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_EFFECTSEND,
+ &bqPlayerEffectSend);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // set the player's state to playing
+ result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);
+ assert(SL_RESULT_SUCCESS == result);
+
+}
+
+
+// create URI audio player
+jboolean Java_com_example_nativeaudio_NativeAudio_createUriAudioPlayer(JNIEnv* env, jclass clazz,
+ jstring uri)
+{
+ SLresult result;
+
+ // convert Java string to UTF-8
+ const jbyte *utf8 = (*env)->GetStringUTFChars(env, uri, NULL);
+ assert(NULL != utf8);
+
+ // configure audio source
+ // (requires the INTERNET permission depending on the uri parameter)
+ SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, (SLchar *) utf8};
+ SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
+ SLDataSource audioSrc = {&loc_uri, &format_mime};
+
+ // configure audio sink
+ SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
+ SLDataSink audioSnk = {&loc_outmix, NULL};
+
+ // create audio player
+ const SLInterfaceID ids[1] = {SL_IID_SEEK};
+ const SLboolean req[1] = {SL_BOOLEAN_TRUE};
+ result = (*engineEngine)->CreateAudioPlayer(engineEngine, &uriPlayerObject, &audioSrc,
+ &audioSnk, 1, ids, req);
+ // note that an invalid URI is not detected here, but during prepare/prefetch on Android,
+ // or possibly during Realize on other platforms
+ assert(SL_RESULT_SUCCESS == result);
+
+ // release the Java string and UTF-8
+ (*env)->ReleaseStringUTFChars(env, uri, utf8);
+
+ // realize the player
+ result = (*uriPlayerObject)->Realize(uriPlayerObject, SL_BOOLEAN_FALSE);
+ // this will always succeed on Android, but we check result for portability to other platforms
+ if (SL_RESULT_SUCCESS != result) {
+ (*uriPlayerObject)->Destroy(uriPlayerObject);
+ uriPlayerObject = NULL;
+ return JNI_FALSE;
+ }
+
+ // get the play interface
+ result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_PLAY, &uriPlayerPlay);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the seek interface
+ result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_SEEK, &uriPlayerSeek);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // enable whole file looping
+ result = (*uriPlayerSeek)->SetLoop(uriPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);
+ assert(SL_RESULT_SUCCESS == result);
+
+ return JNI_TRUE;
+}
+
+
+// set the playing state for the URI audio player
+void Java_com_example_nativeaudio_NativeAudio_setPlayingUriAudioPlayer(JNIEnv* env,
+ jclass clazz, jboolean isPlaying)
+{
+ SLresult result;
+
+ // make sure the URI audio player was created
+ if (NULL != uriPlayerPlay) {
+
+ // set the player's state
+ result = (*uriPlayerPlay)->SetPlayState(uriPlayerPlay, isPlaying ?
+ SL_PLAYSTATE_PLAYING : SL_PLAYSTATE_PAUSED);
+ assert(SL_RESULT_SUCCESS == result);
+
+ }
+
+}
+
+
+// enable reverb on the buffer queue player
+jboolean Java_com_example_nativeaudio_NativeAudio_enableReverb(JNIEnv* env, jclass clazz,
+ jboolean enabled)
+{
+ SLresult result;
+
+ // we might not have been able to add environmental reverb to the output mix
+ if (NULL == outputMixEnvironmentalReverb) {
+ return JNI_FALSE;
+ }
+
+ result = (*bqPlayerEffectSend)->EnableEffectSend(bqPlayerEffectSend,
+ outputMixEnvironmentalReverb, (SLboolean) enabled, (SLmillibel) 0);
+ // and even if environmental reverb was present, it might no longer be available
+ if (SL_RESULT_SUCCESS != result) {
+ return JNI_FALSE;
+ }
+
+ return JNI_TRUE;
+}
+
+
+// select the desired clip and play count, and enqueue the first buffer if idle
+jboolean Java_com_example_nativeaudio_NativeAudio_selectClip(JNIEnv* env, jclass clazz, jint which,
+ jint count)
+{
+ short *oldBuffer = nextBuffer;
+ switch (which) {
+ case 0: // CLIP_NONE
+ nextBuffer = (short *) NULL;
+ nextSize = 0;
+ break;
+ case 1: // CLIP_HELLO
+ nextBuffer = (short *) hello;
+ nextSize = sizeof(hello);
+ break;
+ case 2: // CLIP_ANDROID
+ nextBuffer = (short *) android;
+ nextSize = sizeof(android);
+ break;
+ case 3: // CLIP_SAWTOOTH
+ nextBuffer = sawtoothBuffer;
+ nextSize = sizeof(sawtoothBuffer);
+ break;
+ case 4: // CLIP_PLAYBACK
+ // we recorded at 16 kHz, but are playing buffers at 8 Khz, so do a primitive down-sample
+ if (recorderSR == SL_SAMPLINGRATE_16) {
+ unsigned i;
+ for (i = 0; i < recorderSize; i += 2 * sizeof(short)) {
+ recorderBuffer[i >> 2] = recorderBuffer[i >> 1];
+ }
+ recorderSR = SL_SAMPLINGRATE_8;
+ recorderSize >>= 1;
+ }
+ nextBuffer = recorderBuffer;
+ nextSize = recorderSize;
+ break;
+ default:
+ nextBuffer = NULL;
+ nextSize = 0;
+ break;
+ }
+ nextCount = count;
+ if (nextSize > 0) {
+ // here we only enqueue one buffer because it is a long clip,
+ // but for streaming playback we would typically enqueue at least 2 buffers to start
+ SLresult result;
+ result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
+ if (SL_RESULT_SUCCESS != result) {
+ return JNI_FALSE;
+ }
+ }
+
+ return JNI_TRUE;
+}
+
+
+// create asset audio player
+jboolean Java_com_example_nativeaudio_NativeAudio_createAssetAudioPlayer(JNIEnv* env, jclass clazz,
+ jobject assetManager, jstring filename)
+{
+ SLresult result;
+
+ // convert Java string to UTF-8
+ const jbyte *utf8 = (*env)->GetStringUTFChars(env, filename, NULL);
+ assert(NULL != utf8);
+
+ // use asset manager to open asset by filename
+ AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
+ assert(NULL != mgr);
+ AAsset* asset = AAssetManager_open(mgr, (const char *) utf8, AASSET_MODE_UNKNOWN);
+
+ // release the Java string and UTF-8
+ (*env)->ReleaseStringUTFChars(env, filename, utf8);
+
+ // the asset might not be found
+ if (NULL == asset) {
+ return JNI_FALSE;
+ }
+
+ // open asset as file descriptor
+ off_t start, length;
+ int fd = AAsset_openFileDescriptor(asset, &start, &length);
+ assert(0 <= fd);
+ AAsset_close(asset);
+
+ // configure audio source
+ SLDataLocator_AndroidFD loc_fd = {SL_DATALOCATOR_ANDROIDFD, fd, start, length};
+ SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
+ SLDataSource audioSrc = {&loc_fd, &format_mime};
+
+ // configure audio sink
+ SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
+ SLDataSink audioSnk = {&loc_outmix, NULL};
+
+ // create audio player
+ const SLInterfaceID ids[1] = {SL_IID_SEEK};
+ const SLboolean req[1] = {SL_BOOLEAN_TRUE};
+ result = (*engineEngine)->CreateAudioPlayer(engineEngine, &fdPlayerObject, &audioSrc, &audioSnk,
+ 1, ids, req);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // realize the player
+ result = (*fdPlayerObject)->Realize(fdPlayerObject, SL_BOOLEAN_FALSE);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the play interface
+ result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_PLAY, &fdPlayerPlay);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the seek interface
+ result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_SEEK, &fdPlayerSeek);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // enable whole file looping
+ result = (*fdPlayerSeek)->SetLoop(fdPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);
+ assert(SL_RESULT_SUCCESS == result);
+
+ return JNI_TRUE;
+}
+
+
+// set the playing state for the asset audio player
+void Java_com_example_nativeaudio_NativeAudio_setPlayingAssetAudioPlayer(JNIEnv* env,
+ jclass clazz, jboolean isPlaying)
+{
+ SLresult result;
+
+ // make sure the asset audio player was created
+ if (NULL != fdPlayerPlay) {
+
+ // set the player's state
+ result = (*fdPlayerPlay)->SetPlayState(fdPlayerPlay, isPlaying ?
+ SL_PLAYSTATE_PLAYING : SL_PLAYSTATE_PAUSED);
+ assert(SL_RESULT_SUCCESS == result);
+
+ }
+
+}
+
+
+// create audio recorder
+jboolean Java_com_example_nativeaudio_NativeAudio_createAudioRecorder(JNIEnv* env, jclass clazz)
+{
+ SLresult result;
+
+ // configure audio source
+ SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT,
+ SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};
+ SLDataSource audioSrc = {&loc_dev, NULL};
+
+ // configure audio sink
+ SLDataLocator_AndroidSimpleBufferQueue loc_bq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
+ SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_16,
+ SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
+ SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
+ SLDataSink audioSnk = {&loc_bq, &format_pcm};
+
+ // create audio recorder
+ // (requires the RECORD_AUDIO permission)
+ const SLInterfaceID id[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE};
+ const SLboolean req[1] = {SL_BOOLEAN_TRUE};
+ result = (*engineEngine)->CreateAudioRecorder(engineEngine, &recorderObject, &audioSrc,
+ &audioSnk, 1, id, req);
+ if (SL_RESULT_SUCCESS != result) {
+ return JNI_FALSE;
+ }
+
+ // realize the audio recorder
+ result = (*recorderObject)->Realize(recorderObject, SL_BOOLEAN_FALSE);
+ if (SL_RESULT_SUCCESS != result) {
+ return JNI_FALSE;
+ }
+
+ // get the record interface
+ result = (*recorderObject)->GetInterface(recorderObject, SL_IID_RECORD, &recorderRecord);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // get the buffer queue interface
+ result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
+ &recorderBufferQueue);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // register callback on the buffer queue
+ result = (*recorderBufferQueue)->RegisterCallback(recorderBufferQueue, bqRecorderCallback,
+ NULL);
+ assert(SL_RESULT_SUCCESS == result);
+
+ return JNI_TRUE;
+}
+
+
+// set the recording state for the audio recorder
+void Java_com_example_nativeaudio_NativeAudio_startRecording(JNIEnv* env, jclass clazz)
+{
+ SLresult result;
+
+ // in case already recording, stop recording and clear buffer queue
+ result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED);
+ assert(SL_RESULT_SUCCESS == result);
+ result = (*recorderBufferQueue)->Clear(recorderBufferQueue);
+ assert(SL_RESULT_SUCCESS == result);
+
+ // the buffer is not valid for playback yet
+ recorderSize = 0;
+
+ // enqueue an empty buffer to be filled by the recorder
+ // (for streaming recording, we would enqueue at least 2 empty buffers to start things off)
+ result = (*recorderBufferQueue)->Enqueue(recorderBufferQueue, recorderBuffer,
+ RECORDER_FRAMES * sizeof(short));
+ // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,
+ // which for this code example would indicate a programming error
+ assert(SL_RESULT_SUCCESS == result);
+
+ // start recording
+ result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_RECORDING);
+ assert(SL_RESULT_SUCCESS == result);
+
+}
+
+
+// shut down the native audio system
+void Java_com_example_nativeaudio_NativeAudio_shutdown(JNIEnv* env, jclass clazz)
+{
+
+ // destroy buffer queue audio player object, and invalidate all associated interfaces
+ if (bqPlayerObject != NULL) {
+ (*bqPlayerObject)->Destroy(bqPlayerObject);
+ bqPlayerObject = NULL;
+ bqPlayerPlay = NULL;
+ bqPlayerBufferQueue = NULL;
+ bqPlayerEffectSend = NULL;
+ }
+
+ // destroy file descriptor audio player object, and invalidate all associated interfaces
+ if (fdPlayerObject != NULL) {
+ (*fdPlayerObject)->Destroy(fdPlayerObject);
+ fdPlayerObject = NULL;
+ fdPlayerPlay = NULL;
+ fdPlayerSeek = NULL;
+ }
+
+ // destroy URI audio player object, and invalidate all associated interfaces
+ if (uriPlayerObject != NULL) {
+ (*uriPlayerObject)->Destroy(uriPlayerObject);
+ uriPlayerObject = NULL;
+ uriPlayerPlay = NULL;
+ uriPlayerSeek = NULL;
+ }
+
+ // destroy audio recorder object, and invalidate all associated interfaces
+ if (recorderObject != NULL) {
+ (*recorderObject)->Destroy(recorderObject);
+ recorderObject = NULL;
+ recorderRecord = NULL;
+ recorderBufferQueue = NULL;
+ }
+
+ // destroy output mix object, and invalidate all associated interfaces
+ if (outputMixObject != NULL) {
+ (*outputMixObject)->Destroy(outputMixObject);
+ outputMixObject = NULL;
+ outputMixEnvironmentalReverb = NULL;
+ }
+
+ // destroy engine object, and invalidate all associated interfaces
+ if (engineObject != NULL) {
+ (*engineObject)->Destroy(engineObject);
+ engineObject = NULL;
+ engineEngine = NULL;
+ }
+
+}
diff --git a/ndk/platforms/android-9/samples/native-audio/res/drawable/icon.png b/ndk/platforms/android-9/samples/native-audio/res/drawable/icon.png
new file mode 100644
index 0000000..a07c69f
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/res/drawable/icon.png
Binary files differ
diff --git a/ndk/platforms/android-9/samples/native-audio/res/layout/main.xml b/ndk/platforms/android-9/samples/native-audio/res/layout/main.xml
new file mode 100644
index 0000000..b9fb95a
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/res/layout/main.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ >
+<TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hello"
+ />
+<Button
+ android:id="@+id/hello"
+ android:text="Hello"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/android"
+ android:text="Android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/sawtooth"
+ android:text="Sawtooth"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/reverb"
+ android:text="Reverb"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/embedded_soundtrack"
+ android:text="Embedded soundtrack"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/uri_soundtrack"
+ android:text="URI soundtrack"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/record"
+ android:text="Record"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+<Button
+ android:id="@+id/playback"
+ android:text="Playback"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+</LinearLayout>
diff --git a/ndk/platforms/android-9/samples/native-audio/res/values/strings.xml b/ndk/platforms/android-9/samples/native-audio/res/values/strings.xml
new file mode 100644
index 0000000..280c103
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <string name="hello">Hello, Android using native audio!</string>
+ <string name="app_name">NativeAudio</string>
+</resources>
diff --git a/ndk/platforms/android-9/samples/native-audio/src/com/example/nativeaudio/NativeAudio.java b/ndk/platforms/android-9/samples/native-audio/src/com/example/nativeaudio/NativeAudio.java
new file mode 100644
index 0000000..5a7b3ef
--- /dev/null
+++ b/ndk/platforms/android-9/samples/native-audio/src/com/example/nativeaudio/NativeAudio.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.nativeaudio;
+
+import android.app.Activity;
+import android.content.res.AssetManager;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+public class NativeAudio extends Activity {
+
+ static final int CLIP_NONE = 0;
+ static final int CLIP_HELLO = 1;
+ static final int CLIP_ANDROID = 2;
+ static final int CLIP_SAWTOOTH = 3;
+ static final int CLIP_PLAYBACK = 4;
+
+ static final String URI = "http://upload.wikimedia.org/wikipedia/commons/6/6d/Banana.ogg";
+ static AssetManager assetManager;
+
+ static boolean isPlayingAsset = false;
+ static boolean isPlayingUri = false;
+
+ /** Called when the activity is first created. */
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.main);
+
+ assetManager = getAssets();
+
+ // initialize native audio system
+
+ createEngine();
+ createBufferQueueAudioPlayer();
+
+ // initialize button click handlers
+
+ ((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {
+ public void onClick(View view) {
+ // ignore the return value
+ selectClip(CLIP_HELLO, 5);
+ }
+ });
+
+ ((Button) findViewById(R.id.android)).setOnClickListener(new OnClickListener() {
+ public void onClick(View view) {
+ // ignore the return value
+ selectClip(CLIP_ANDROID, 7);
+ }
+ });
+
+ ((Button) findViewById(R.id.sawtooth)).setOnClickListener(new OnClickListener() {
+ public void onClick(View view) {
+ // ignore the return value
+ selectClip(CLIP_SAWTOOTH, 1);
+ }
+ });
+
+ ((Button) findViewById(R.id.reverb)).setOnClickListener(new OnClickListener() {
+ boolean enabled = false;
+ public void onClick(View view) {
+ enabled = !enabled;
+ if (!enableReverb(enabled)) {
+ enabled = !enabled;
+ }
+ }
+ });
+
+ ((Button) findViewById(R.id.embedded_soundtrack)).setOnClickListener(new OnClickListener() {
+ boolean created = false;
+ public void onClick(View view) {
+ if (!created) {
+ created = createAssetAudioPlayer(assetManager, "background.mp3");
+ }
+ if (created) {
+ isPlayingAsset = !isPlayingAsset;
+ setPlayingAssetAudioPlayer(isPlayingAsset);
+ }
+ }
+ });
+
+ ((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() {
+ boolean created = false;
+ public void onClick(View view) {
+ if (!created) {
+ created = createUriAudioPlayer(URI);
+ }
+ if (created) {
+ isPlayingUri = !isPlayingUri;
+ setPlayingUriAudioPlayer(isPlayingUri);
+ }
+ }
+ });
+
+ ((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() {
+ boolean created = false;
+ public void onClick(View view) {
+ if (!created) {
+ created = createAudioRecorder();
+ }
+ if (created) {
+ startRecording();
+ }
+ }
+ });
+
+ ((Button) findViewById(R.id.playback)).setOnClickListener(new OnClickListener() {
+ public void onClick(View view) {
+ // ignore the return value
+ selectClip(CLIP_PLAYBACK, 3);
+ }
+ });
+
+ }
+
+ /** Called when the activity is about to be destroyed. */
+ @Override
+ protected void onPause()
+ {
+ // turn off all audio
+ selectClip(CLIP_NONE, 0);
+ isPlayingAsset = false;
+ setPlayingAssetAudioPlayer(false);
+ isPlayingUri = false;
+ setPlayingUriAudioPlayer(false);
+ super.onPause();
+ }
+
+ /** Called when the activity is about to be destroyed. */
+ @Override
+ protected void onDestroy()
+ {
+ shutdown();
+ super.onDestroy();
+ }
+
+ /** Native methods, implemented in jni folder */
+ public static native void createEngine();
+ public static native void createBufferQueueAudioPlayer();
+ public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename);
+ public static native void setPlayingAssetAudioPlayer(boolean isPlaying);
+ public static native boolean createUriAudioPlayer(String uri);
+ public static native void setPlayingUriAudioPlayer(boolean isPlaying);
+ public static native boolean selectClip(int which, int count);
+ public static native boolean enableReverb(boolean enabled);
+ public static native boolean createAudioRecorder();
+ public static native void startRecording();
+ public static native void shutdown();
+
+ /** Load jni .so on initialization */
+ static {
+ System.loadLibrary("native-audio-jni");
+ }
+
+}
diff --git a/ndk/sources/android/native_app_glue/android_native_app_glue.h b/ndk/sources/android/native_app_glue/android_native_app_glue.h
index 321299c..1b8c1f1 100644
--- a/ndk/sources/android/native_app_glue/android_native_app_glue.h
+++ b/ndk/sources/android/native_app_glue/android_native_app_glue.h
@@ -27,7 +27,7 @@
#include <android/native_activity.h>
#ifdef __cplusplus
-extern "C"
+extern "C" {
#endif
/**
diff --git a/samples/Alarm/AndroidManifest.xml b/samples/Alarm/AndroidManifest.xml
new file mode 100644
index 0000000..6a7a831
--- /dev/null
+++ b/samples/Alarm/AndroidManifest.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ Declares the contents of this Android application. The xmlns:android
+ attribute brings in the Android platform namespace, and the
+ "package" attribute provides a unique name for the application.
+ If you use this file as a template in your own application, you must change
+ the package name from "com.example.android" to one that you own or have
+ control over.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.newalarm"
+ android:versionCode="2"
+ android:versionName="2.0">
+ <!--
+ Declares the application, its icon, and its visible label
+ -->
+ <application
+ android:icon="@drawable/icon"
+ android:label="@string/app_name">
+ <!--
+ Declares the activity's class name and visible label. The leading "." indicates
+ that the name should be preceded by the application's Android package name.
+ -->
+ <activity
+ android:name=".AlarmActivity"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <service
+ android:name=".AlarmService"
+ android:label="@string/alarm_service"
+ android:process="com.example.android.newalarm">
+ </service>
+ </application>
+ <uses-sdk android:targetSdkVersion="4" android:minSdkVersion="3"/>
+</manifest>
diff --git a/samples/Alarm/_index.html b/samples/Alarm/_index.html
new file mode 100644
index 0000000..dff51ce
--- /dev/null
+++ b/samples/Alarm/_index.html
@@ -0,0 +1,29 @@
+<p>
+ This sample is a revised version of the AlarmService functionality included in the
+ ApiDemos sample application. It is used as the application under test
+ for the <a href="../AlarmServiceTest/index.html">Alarm Service Test</a>
+ sample test application.
+</p>
+<p>
+ This application demonstrates a simple Android service that is started when needed by
+ <code>Context.startService(Intent)</code> and stops itself when its work is done. You can
+ use this type of service to move long-running or periodic tasks into the background. For
+ example, you could use this type of service to perform data synchronization.
+</p>
+<p>
+ In the sample, the service simply runs for 15 seconds and then stops itself. The wait is
+ implemented in a separate thread that uses a thread-safe object. This illustrates how to
+ set up a service that runs multiple threads that depend on one or more objects that must be
+ made thread-safe.
+</p>
+<p>
+ The application also contains the <code>AlarmActivity</code> activity that is a client of the
+ service. You use the activity to control when the service starts and stops. By default, the
+ activity fires off the service every thirty seconds. In effect, the service starts after
+ thirty seconds, runs for 15 seconds, stops, and then runs again automatically in another
+ 15 seconds. You also use the client to stop this cycle.
+</p>
+<p>
+ The test application <a href="tests/index.html">AlarmServiceTest</a>
+ shows you how to set up a test of this service.
+</p>
diff --git a/samples/Alarm/res/drawable/icon.png b/samples/Alarm/res/drawable/icon.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/Alarm/res/drawable/icon.png
Binary files differ
diff --git a/samples/Alarm/res/drawable/stat_sample.png b/samples/Alarm/res/drawable/stat_sample.png
new file mode 100755
index 0000000..6c9ba0a
--- /dev/null
+++ b/samples/Alarm/res/drawable/stat_sample.png
Binary files differ
diff --git a/samples/Alarm/res/layout/main.xml b/samples/Alarm/res/layout/main.xml
new file mode 100644
index 0000000..3d79e2b
--- /dev/null
+++ b/samples/Alarm/res/layout/main.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Demonstrates starting and stopping a local service.
+ See corresponding Java code com.android.sdk.app.LocalSerice.java. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:padding="4dip"
+ android:gravity="center_horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:paddingBottom="4dip"
+ android:text="@string/alarm_service"/>
+ <Button android:id="@+id/start_alarm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/start_alarm_service">
+ <requestFocus />
+ </Button>
+
+ <Button android:id="@+id/stop_alarm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/stop_alarm_service" />
+</LinearLayout>
+
diff --git a/samples/Alarm/res/values/strings.xml b/samples/Alarm/res/values/strings.xml
new file mode 100644
index 0000000..18a34cc
--- /dev/null
+++ b/samples/Alarm/res/values/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <string name="app_name">Alarm</string>
+ <string name="alarm_service">
+ This shows how to schedule a repeating alarm that starts a service.</string>
+ <string name="start_alarm_service">Start Alarm Service</string>
+ <string name="stop_alarm_service">Stop Alarm Service</string>
+ <string name="repeating_started">
+ Repeating timer started. Starts AlarmService every 30 seconds.</string>
+ <string name="alarm_service_started">The sample service is running.</string>
+ <string name="alarm_service_label">Sample Alarm Service</string>
+ <string name="alarm_service_finished">The sample service is no longer running.</string>
+ <string name="repeating_stopped">
+ Repeating timer stopped. AlarmService will no longer be started.</string>
+</resources>
diff --git a/samples/Alarm/src/com/example/android/newalarm/AlarmActivity.java b/samples/Alarm/src/com/example/android/newalarm/AlarmActivity.java
new file mode 100644
index 0000000..d26507d
--- /dev/null
+++ b/samples/Alarm/src/com/example/android/newalarm/AlarmActivity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.newalarm;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+/**
+ * This is the activity that controls AlarmService.
+ * <p>
+ * When the user clicks the "Start Alarm Service" button, it triggers a repeating countdown
+ * timer. Every thirty seconds, the timer starts AlarmService, which then runs for 15 seconds
+ * and shuts itself down.
+ * </p>
+ * <p>
+ * When the user clicks the "Stop Alarm Service" button, it stops the countdown timer.
+ * </p>
+ */
+
+public class AlarmActivity extends Activity {
+ // 30 seconds in milliseconds
+ private static final long THIRTY_SECONDS_MILLIS = 30 * 1000;
+
+ // An intent for AlarmService, to trigger it as if the Activity called startService().
+ private PendingIntent mAlarmSender;
+
+ // Contains a handle to the system alarm service
+ private AlarmManager mAlarmManager;
+
+ /**
+ * This method is called when Android starts the activity. It initializes the UI.
+ * <p>
+ * This method is automatically called when Android starts the Activity
+ * </p>
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Create a PendingIntent to trigger a startService() for AlarmService
+ mAlarmSender = PendingIntent.getService( // set up an intent for a call to a service
+ AlarmActivity.this, // the current context
+ 0, // request code (not used)
+ new Intent(AlarmActivity.this, AlarmService.class), // A new Service intent
+ 0 // flags (none are required for a service)
+ );
+
+ // Creates the main view
+ setContentView(R.layout.main);
+
+ // Finds the button that starts the repeating countdown timer
+ Button button = (Button)findViewById(R.id.start_alarm);
+
+ // Sets the listener for the start button
+ button.setOnClickListener(mStartAlarmListener);
+
+ // Finds the button that stops countdown timer
+ button = (Button)findViewById(R.id.stop_alarm);
+
+ // Sets the listener for the stop button
+ button.setOnClickListener(mStopAlarmListener);
+
+ // Gets the handle to the system alarm service
+ mAlarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
+ }
+
+ // Creates a new anonymous click listener for the start button. It starts the repeating
+ // countdown timer.
+ private OnClickListener mStartAlarmListener = new OnClickListener() {
+ // Sets the callback for when the button is clicked
+ public void onClick(View v) {
+
+ // Sets the time when the alarm will first go off
+ // The Android AlarmManager uses this form of the current time.
+ long firstAlarmTime = SystemClock.elapsedRealtime();
+
+ // Sets a repeating countdown timer that triggers AlarmService
+ mAlarmManager.setRepeating(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP, // based on time since last wake up
+ firstAlarmTime, // sends the first alarm immediately
+ THIRTY_SECONDS_MILLIS, // repeats every thirty seconds
+ mAlarmSender // when the alarm goes off, sends this Intent
+ );
+
+ // Notifies the user that the repeating countdown timer has been started
+ Toast.makeText(
+ AlarmActivity.this, // the current context
+ R.string.repeating_started, // the message to display
+ Toast.LENGTH_LONG // how long to display the message
+ ).show(); // show the message on the screen
+ }
+ };
+
+ // Creates a new anonymous click listener for the stop button. It shuts off the repeating
+ // countdown timer.
+ private OnClickListener mStopAlarmListener = new OnClickListener() {
+ // Sets the callback for when the button is clicked
+ public void onClick(View v) {
+
+ // Cancels the repeating countdown timer
+ mAlarmManager.cancel(mAlarmSender);
+
+ // Notifies the user that the repeating countdown timer has been stopped
+ Toast.makeText(
+ AlarmActivity.this, // the current context
+ R.string.repeating_stopped, // the message to display
+ Toast.LENGTH_LONG // how long to display the message
+ ).show(); // display the message
+ }
+ };
+}
diff --git a/samples/Alarm/src/com/example/android/newalarm/AlarmService.java b/samples/Alarm/src/com/example/android/newalarm/AlarmService.java
new file mode 100644
index 0000000..1f88206
--- /dev/null
+++ b/samples/Alarm/src/com/example/android/newalarm/AlarmService.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.newalarm;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.widget.Toast;
+
+/**
+ * <p>
+ * This class implements a service. The service is started by AlarmActivity, which contains a
+ * repeating countdown timer that sends a PendingIntent. The user starts and stops the timer with
+ * buttons in the UI.
+ * </p>
+ * <p>
+ * When this service is started, it creates a Runnable and starts it in a new Thread. The
+ * Runnable does a synchronized lock on the service's Binder object for 15 seconds, then issues
+ * a stopSelf(). The net effect is a new worker thread that takes 15 seconds to run and then
+ * shuts down the entire service. The activity restarts the service after 15 more seconds, when the
+ * countdown timer triggers again.
+ * </p>
+ * <p>
+ * This service is provided as the service under test for the sample test application
+ * AlarmServiceTest.
+ * </p>
+ * <p>
+ * Note: Since this sample is based on the Android 1.5 platform, it does not implement
+ * onStartCommand. See the Javadoc for android.app.Service for more details.
+ * </p>
+ */
+public class AlarmService extends Service {
+ // Defines a label for the thread that this service starts
+ private static final String ALARM_SERVICE_THREAD = "AlarmService";
+
+ // Defines 15 seconds
+ public static final long WAIT_TIME_SECONDS = 15;
+
+ // Define the number of milliseconds in one second
+ public static final long MILLISECS_PER_SEC = 1000;
+
+ /*
+ * For testing purposes, the following variables are defined as fields and set to
+ * package visibility.
+ */
+
+ // The NotificationManager used to send notifications to the status bar.
+ NotificationManager mNotificationManager;
+
+ // An Intent that displays the client if the user clicks the notification.
+ PendingIntent mContentIntent;
+
+ // A Notification to send to the Notification Manager when the service is started.
+ Notification mNotification;
+
+ // A Binder, used as the lock object for the worker thread.
+ IBinder mBinder = new AlarmBinder();
+
+ // A Thread object that will run the background task
+ Thread mWorkThread;
+
+ // The Runnable that is the service's "task". This illustrates how a service is used to
+ // offload work from a client.
+ Runnable mWorkTask = new Runnable() {
+ public void run() {
+ // Sets the wait time to 15 seconds, simulating a 15-second background task.
+ long waitTime = System.currentTimeMillis() + WAIT_TIME_SECONDS * MILLISECS_PER_SEC;
+
+ // Puts the wait in a while loop to ensure that it actually waited 15 seconds.
+ // This covers the situation where an interrupt might have overridden the wait.
+ while (System.currentTimeMillis() < waitTime) {
+ // Waits for 15 seconds or interruption
+ synchronized (mBinder) {
+ try {
+ // Waits for 15 seconds or until an interrupt triggers an exception.
+ // If an interrupt occurs, the wait is recalculated to ensure a net
+ // wait of 15 seconds.
+ mBinder.wait(waitTime - System.currentTimeMillis());
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ // Stops the current service. In response, Android calls onDestroy().
+ stopSelf();
+ }
+ };
+
+ /**
+ * Makes a full concrete subclass of Binder, rather than doing it in line, for readability.
+ */
+ public class AlarmBinder extends Binder {
+ // Constructor. Calls the super constructor to set up the instance.
+ public AlarmBinder() {
+ super();
+ }
+
+ @Override
+ protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
+ throws RemoteException {
+
+ // Call the parent method with the arguments passed in
+ return super.onTransact(code, data, reply, flags);
+ }
+ }
+
+ /**
+ * Initializes the service when it is first started by a call to startService() or
+ * bindService().
+ */
+ @Override
+ public void onCreate() {
+ // Gets a handle to the system mNotification service.
+ mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
+
+ // Updates the status bar to indicate that this service is running.
+ showNotification();
+
+ // Creates a new thread. A new thread is used so that the service's work doesn't block
+ // anything on the calling client's thread. By default, a service runs in the same
+ // process and thread as the client that starts it.
+ mWorkThread = new Thread(
+ null, // threadgroup (in this case, null)
+ mWorkTask, // the Runnable that will run in this thread
+ ALARM_SERVICE_THREAD
+ );
+ // Starts the thread
+ mWorkThread.start();
+ }
+
+ /**
+ * Stops the service in response to the stopSelf() issued when the wait is over. Other
+ * clients that use this service could stop it by issuing a stopService() or a stopSelf() on
+ * the service object.
+ */
+ @Override
+ public void onDestroy() {
+ // Cancels the status bar mNotification based on its ID, which is set in showNotification().
+ mNotificationManager.cancel(R.string.alarm_service_started);
+
+ // Sends a notification to the screen.
+ Toast.makeText(
+ this, // the current context
+ R.string.alarm_service_finished, // the message to show
+ Toast.LENGTH_LONG // how long to keep the message on the screen
+ ).show(); // show the text
+ }
+
+ // Returns the service's binder object to clients that issue onBind().
+ @Override
+ public IBinder onBind(Intent intent) {
+ return mBinder;
+ }
+
+ /**
+ * Displays a notification in the status bar that this service is running. This method
+ * also creates an Intent for the AlarmActivity client and attaches it to the notification
+ * line. If the user clicks the line in the expanded status window, the Intent triggers
+ * AlarmActivity.
+ */
+ private void showNotification() {
+ // Sets the text to use for the status bar and status list views.
+ CharSequence notificationText = getText(R.string.alarm_service_started);
+
+ // Sets the icon, status bar text, and display time for the mNotification.
+ mNotification = new Notification(
+ R.drawable.stat_sample, // the status icon
+ notificationText, // the status text
+ System.currentTimeMillis() // the time stamp
+ );
+
+ // Sets up the Intent that starts AlarmActivity
+ mContentIntent = PendingIntent.getActivity(
+ this, // Start the Activity in the current context
+ 0, // not used
+ new Intent(this, AlarmActivity.class), // A new Intent for AlarmActivity
+ 0 // Use an existing activity instance if available
+ );
+
+ // Creates a new content view for the mNotification. The view appears when the user
+ // shows the expanded status window.
+ mNotification.setLatestEventInfo(
+ this, // Put the content view in the current context
+ getText(R.string.alarm_service_label), // The text to use as the label of the entry
+ notificationText, // The text to use as the contents of the entry
+ mContentIntent // The intent to send when the entry is clicked
+ );
+
+ // Sets a unique ID for the notification and sends it to NotificationManager to be
+ // displayed. The ID is the integer marker for the notification string, which is
+ // guaranteed to be unique within the entire application.
+ mNotificationManager.notify(
+ R.string.alarm_service_started, // unique id for the mNotification
+ mNotification // the mNotification object
+ );
+ }
+}
diff --git a/samples/Alarm/tests/AndroidManifest.xml b/samples/Alarm/tests/AndroidManifest.xml
new file mode 100644
index 0000000..8688920
--- /dev/null
+++ b/samples/Alarm/tests/AndroidManifest.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ Declare the contents of this Android test package. The xmlns:android
+ attribute brings in the Android platform namespace, and the
+ "package" attribute provides a unique name for the package.
+ If you use this file as a template in your own test package, you must change
+ the package name from "com.example.android" to one that you own or have
+ control over.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.newalarm.test"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <!--
+ Must use the application element to include the uses-library element.
+ -->
+ <application>
+ <!--
+ Tells Android to include this library in the test package's class loader.
+ The test runner is not included by default in a manifest file.
+ -->
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <!--
+ Specifies that the test package requires API platform level 3 (Android 1.5) or above.
+ The installer will not install this package onto a device or emulator that is running an
+ older platform version.
+ -->
+ <uses-sdk android:minSdkVersion="3" />
+ <!--
+ Declares the instrumentation for this application. The instrumentation class is
+ specified by the "name" attribute, and must name a subclass of
+ android.app.Instrumentation. The application that is run by the instrumentation object is
+ specified by the "targetPackage" attribute.
+ -->
+ <instrumentation
+ android:targetPackage="com.example.android.newalarm"
+ android:name="android.test.InstrumentationTestRunner" />
+</manifest>
diff --git a/samples/Alarm/tests/_index.html b/samples/Alarm/tests/_index.html
new file mode 100644
index 0000000..614125d
--- /dev/null
+++ b/samples/Alarm/tests/_index.html
@@ -0,0 +1,50 @@
+<p>
+ This sample is the test application for the <a href="../Alarm/index.html">Alarm</a>
+ sample application. It tests the application's <code>AlarmService</code> service.
+</p>
+<p>
+ The test application uses the
+ <a href="../../../reference/android/test/ServiceTestCase.html">
+ <code>ServiceTestCase</code></a> test case class,
+ which extends the JUnit <a href="../../../reference/junit/framework/TestCase.html">
+ <code>TestCase</code></a> class. The test runner is
+ <a href="../../../reference/android/test/InstrumentationTestRunner.html">
+ <code>InstrumentationTestRunner</code></a>.
+</p>
+<p>
+ The application shows how to set up a test application project,
+ how to create the <a href="AndroidManifest.html"><code>AndroidManifest.xml</code></a>
+ file for a test application, and how to set up a test case class for a service. The
+ test case class, <a href="src/com/android/example/newalarm/ServiceAlarmTest.html">
+ <code>AlarmServiceTest</code></a>, contains tests that demonstrate the following
+ Android test patterns:
+</p>
+ <ul>
+ <li>
+ Test setup: The <code>setUp()</code> method re-initializes the state of the
+ service under test before each test is run.
+ </li>
+ <li>
+ Service start: The <code>Service.testServiceCreate()</code> test confirms that the
+ service starts correctly and initializes the variables it needs to provide its
+ services.
+ </li>
+ </ul>
+<p>
+ The <a href="AndroidManifest.html">manifest</a> declares an <code><instrumentation></code>
+ element that links the test application with the application under test. Specifically, the
+ element's <code>android:name</code> attribute specifies <code>InstrumentationTestRunner</code>
+ as the instrumentation to use. The <code>android:targetPackage</code> attribute specifies
+ <code>com.android.example.newalarm</code> as the name of the Android package that contains the
+ service under test.
+</p>
+<p class="note">
+ <strong>Note:</strong> <code>AlarmServiceTest.java</code> uses the Java package name
+ <code>com.example.android.newalarm</code>, which is the same package used by service under
+ test, <code>AlarmService.java</code>. This allows the test class to access members in the
+ service under test that are defined with package visibility. To prevent conflicts, though,
+ the generated java file <code>R.java</code> for <code>AlarmServiceTest</code> uses the
+ Java package name <code>com.example.android.newalarm.test</code>. For the same reason, the
+ Android package name for the test application (specified in the manifest file), is
+ <code>com.example.android.newalarm.test</code>.
+</p>
diff --git a/samples/Alarm/tests/src/com/example/android/newalarm/AlarmServiceTest.java b/samples/Alarm/tests/src/com/example/android/newalarm/AlarmServiceTest.java
new file mode 100644
index 0000000..4d6c7ad
--- /dev/null
+++ b/samples/Alarm/tests/src/com/example/android/newalarm/AlarmServiceTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.newalarm;
+
+import android.content.Intent;
+import android.test.ServiceTestCase;
+import com.example.android.newalarm.AlarmService;
+
+/**
+ * Test class for the Alarm sample test package. This test class tests the AlarmService
+ * service component.
+ */
+public class AlarmServiceTest extends ServiceTestCase<AlarmService> {
+ // Contains an Intent used to start the service
+ Intent mStartServiceIntent;
+
+ // Contains a handle to the system alarm service
+ AlarmService mService;
+
+ /**
+ * Constructor for the test class. Test classes that are run by InstrumentationTestRunner
+ * must provide a constructor with no arguments that calls the base class constructor as its
+ * first statement.
+ */
+ public AlarmServiceTest() {
+ super(AlarmService.class);
+ }
+
+ /*
+ * Sets up the test fixture. This method is called before each test
+ */
+ @Override
+ protected void setUp() throws Exception {
+
+ super.setUp();
+
+ // Sets up an intent to start the service under test
+ mStartServiceIntent = new Intent(this.getSystemContext(),AlarmService.class);
+ }
+
+ /**
+ * Cleans up the test fixture
+ * Called after each test method. If you override the method, call super.tearDown() as the
+ * last statement in your override.
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ // Always call the super constructor when overriding tearDown()
+ super.tearDown();
+ }
+
+ /**
+ * Tests the service's onCreate() method. Starts the service using startService(Intent)
+ */
+ public void testServiceCreate() {
+ // Starts the service under test
+ this.startService(mStartServiceIntent);
+
+ // Gets a handle to the service under test.
+ mService = this.getService();
+
+ // Asserts that the Notification Manager was created in the service under test.
+ assertNotNull(mService.mNotificationManager);
+
+ // Asserts that the PendingIntent for the expanded status window was created
+ assertNotNull(mService.mContentIntent);
+
+ // Asserts that the notification was created
+ assertNotNull(mService.mNotification);
+ }
+
+}
diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index 8163265..6e39538 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -32,6 +32,9 @@
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
+ <!-- For android.media.audiofx.Visualizer -->
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
<!-- We will request access to the camera, saying we require a camera
of some sort but not one with autofocus capability. -->
<uses-permission android:name="android.permission.CAMERA" />
@@ -1884,6 +1887,13 @@
</intent-filter>
</activity>
+ <activity android:name=".media.AudioFxDemo" android:label="Media/AudioFx">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
+
<!-- ************************************* -->
<!-- APPWIDGET PACKAGE SAMPLES -->
<!-- ************************************* -->
diff --git a/samples/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.java b/samples/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.java
new file mode 100644
index 0000000..7b4db1f
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.apis.media;
+
+import com.example.android.apis.R;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.media.audiofx.Equalizer;
+import android.media.audiofx.Visualizer;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import java.io.IOException;
+
+public class AudioFxDemo extends Activity {
+ private static final String TAG = "AudioFxDemo";
+
+ private static final float VISUALIZER_HEIGHT_DIP = 50f;
+
+ private MediaPlayer mMediaPlayer;
+ private Visualizer mVisualizer;
+ private Equalizer mEqualizer;
+
+ private LinearLayout mLinearLayout;
+ private VisualizerView mVisualizerView;
+ private TextView mStatusTextView;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+
+ mStatusTextView = new TextView(this);
+
+ mLinearLayout = new LinearLayout(this);
+ mLinearLayout.setOrientation(LinearLayout.VERTICAL);
+ mLinearLayout.addView(mStatusTextView);
+
+ setContentView(mLinearLayout);
+
+ // Create the MediaPlayer
+ mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);
+ Log.d(TAG, "MediaPlayer audio session ID: " + mMediaPlayer.getAudioSessionId());
+
+ setupVisualizerFxAndUI();
+ setupEqualizerFxAndUI();
+
+ // Make sure the visualizer is enabled only when you actually want to receive data, and
+ // when it makes sense to receive data.
+ mVisualizer.setEnabled(true);
+
+ // When the stream ends, we don't need to collect any more data. We don't do this in
+ // setupVisualizerFxAndUI because we likely want to have more, non-Visualizer related code
+ // in this callback.
+ mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+ public void onCompletion(MediaPlayer mediaPlayer) {
+ mVisualizer.setEnabled(false);
+ }
+ });
+
+ mMediaPlayer.start();
+ mStatusTextView.setText("Playing audio...");
+ }
+
+ private void setupEqualizerFxAndUI() {
+ // Create the Equalizer object (an AudioEffect subclass) and attach it to our media player,
+ // with a default priority (0).
+ mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
+ mEqualizer.setEnabled(true);
+
+ TextView eqTextView = new TextView(this);
+ eqTextView.setText("Equalizer:");
+ mLinearLayout.addView(eqTextView);
+
+ short bands = mEqualizer.getNumberOfBands();
+
+ final short minEQLevel = mEqualizer.getBandLevelRange()[0];
+ final short maxEQLevel = mEqualizer.getBandLevelRange()[1];
+
+ for (short i = 0; i < bands; i++) {
+ final short band = i;
+
+ TextView freqTextView = new TextView(this);
+ freqTextView.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);
+ freqTextView.setText((mEqualizer.getCenterFreq(band) / 1000) + " Hz");
+ mLinearLayout.addView(freqTextView);
+
+ LinearLayout row = new LinearLayout(this);
+ row.setOrientation(LinearLayout.HORIZONTAL);
+
+ TextView minDbTextView = new TextView(this);
+ minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ minDbTextView.setText((minEQLevel / 100) + " dB");
+
+ TextView maxDbTextView = new TextView(this);
+ maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ maxDbTextView.setText((maxEQLevel / 100) + " dB");
+
+ LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ layoutParams.weight = 1;
+ SeekBar bar = new SeekBar(this);
+ bar.setLayoutParams(layoutParams);
+ bar.setMax(maxEQLevel - minEQLevel);
+ bar.setProgress(mEqualizer.getBandLevel(band));
+
+ bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ public void onProgressChanged(SeekBar seekBar, int progress,
+ boolean fromUser) {
+ mEqualizer.setBandLevel(band, (short) (progress + minEQLevel));
+ }
+
+ public void onStartTrackingTouch(SeekBar seekBar) {}
+ public void onStopTrackingTouch(SeekBar seekBar) {}
+ });
+
+ row.addView(minDbTextView);
+ row.addView(bar);
+ row.addView(maxDbTextView);
+
+ mLinearLayout.addView(row);
+ }
+ }
+
+ private void setupVisualizerFxAndUI() {
+ // Create a VisualizerView (defined below), which will render the simplified audio
+ // wave form to a Canvas.
+ mVisualizerView = new VisualizerView(this);
+ mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ (int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density)));
+ mLinearLayout.addView(mVisualizerView);
+
+ // Create the Visualizer object and attach it to our media player.
+ mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
+ mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
+ mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
+ public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
+ int samplingRate) {
+ mVisualizerView.updateVisualizer(bytes);
+ }
+
+ public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {}
+ }, Visualizer.getMaxCaptureRate() / 2, true, false);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ if (isFinishing() && mMediaPlayer != null) {
+ mVisualizer.release();
+ mEqualizer.release();
+ mMediaPlayer.release();
+ mMediaPlayer = null;
+ }
+ }
+}
+
+/**
+ * A simple class that draws waveform data received from a
+ * {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture }
+ */
+class VisualizerView extends View {
+ private byte[] mBytes;
+ private float[] mPoints;
+ private Rect mRect = new Rect();
+
+ private Paint mForePaint = new Paint();
+
+ public VisualizerView(Context context) {
+ super(context);
+ init();
+ }
+
+ private void init() {
+ mBytes = null;
+
+ mForePaint.setStrokeWidth(1f);
+ mForePaint.setAntiAlias(true);
+ mForePaint.setColor(Color.rgb(0, 128, 255));
+ }
+
+ public void updateVisualizer(byte[] bytes) {
+ mBytes = bytes;
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ if (mBytes == null) {
+ return;
+ }
+
+ if (mPoints == null || mPoints.length < mBytes.length * 4) {
+ mPoints = new float[mBytes.length * 4];
+ }
+
+ mRect.set(0, 0, getWidth(), getHeight());
+
+ for (int i = 0; i < mBytes.length - 1; i++) {
+ mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1);
+ mPoints[i * 4 + 1] = mRect.height() / 2
+ + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128;
+ mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1);
+ mPoints[i * 4 + 3] = mRect.height() / 2
+ + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128;
+ }
+
+ canvas.drawLines(mPoints, mForePaint);
+ }
+}
diff --git a/samples/NFCDemo/Android.mk b/samples/NFCDemo/Android.mk
new file mode 100644
index 0000000..60815a2
--- /dev/null
+++ b/samples/NFCDemo/Android.mk
@@ -0,0 +1,18 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples tests
+
+LOCAL_STATIC_JAVA_LIBRARIES := guava
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := NFCDemo
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/NFCDemo/AndroidManifest.xml b/samples/NFCDemo/AndroidManifest.xml
new file mode 100644
index 0000000..044690b
--- /dev/null
+++ b/samples/NFCDemo/AndroidManifest.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Declare the contents of this Android application. The namespace
+ attribute brings in the Android platform namespace, and the package
+ supplies a unique name for the application. When writing your
+ own application, the package name must be changed from "com.example.*"
+ to come from a domain that you own or have control over. -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.nfc"
+>
+ <uses-permission android:name="android.permission.NFC" />
+ <uses-permission android:name="android.permission.CALL_PHONE" />
+ <application
+ android:icon="@drawable/icon"
+ android:label="@string/app_name"
+ >
+ <activity android:name=".simulator.FakeTagsActivity"
+ android:theme="@android:style/Theme.NoTitleBar">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name="TagViewer"
+ android:theme="@android:style/Theme.NoTitleBar"
+ >
+ <intent-filter>
+ <action android:name="android.nfc.action.TAG_DISCOVERED"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
+ </application>
+ <uses-sdk android:minSdkVersion="9" />
+ <uses-feature android:name="android.hardware.nfc" android:required="true" />
+</manifest>
diff --git a/samples/NFCDemo/_index.html b/samples/NFCDemo/_index.html
new file mode 100644
index 0000000..d1c53f1
--- /dev/null
+++ b/samples/NFCDemo/_index.html
@@ -0,0 +1,129 @@
+<p>
+ Near-field Communication or NFC is a standard defined by the
+ <a href=http://www.nfc-forum.org/home>NFC Forum
+ </a>.
+ NFC Data Exchange Format (NDEF) defines a common data format between NFC-compliant devices and tags.
+ This demo application shows how to read a NDEF Tags using using Android 2.3 SDK APIs.
+ The NFC Tags consist of data encoded in NDEF Message format specified by NFC Forum Type 2 Specification.
+ Each NDEF message consists of one or more NDEF Records.
+
+ You need a NFC compliant device and a NFC compliant Tag to use this sample app. Or else, you could use
+ the FakeTagsActivity displayed at launch of this sample app, to generate fake Tag broadcasts from the emulator.
+</p>
+
+<p>The application includes:
+</p>
+ <ul>
+ <li>
+ <a href="src/com/example/android/nfc/TagViewer.html">
+ <code>TagViewer
+ </code>
+ </a>
+ — an
+ <code>Activity
+ </code> that handles a broadcast of a new tag that the device
+ just discovered, parses it, and displays its record contents in a
+ <code>ListActivity
+ </code>
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/NdefMessageParser.html">
+ <code> NdefMessageParser
+ </code>
+ </a>
+ — parses the record type of records within the NDEF message.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/record/ParsedNdefRecord.html">
+ <code>ParsedNdefRecord
+ </code>
+ </a>
+ — an interface implemented by all parsed NdefRecord types.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/record/SmartPoster.html">
+ <code>SmartPoster
+ </code>
+ </a>
+ — a representation of an NFC Forum Smart Poster Record Type.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/record/TextRecord.html">
+ <code>TextRecord
+ </code>
+ </a>
+ — a representation of an NFC Forum Text Record Type.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/record/UriRecord.html">
+ <code>UriRecord
+ </code>
+ </a>
+ — a representation of an NFC Forum Uri Record Type.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/simulator/FakeTagsActivity.html">
+ <code>FakeTagsActivity
+ </code>
+ </a>
+ — A activity that launches tags as if they had been scanned.
+ This is useful if you don't have access to NFC enabled device or tag.
+ </li>
+ <li>
+ <a href="src/com/example/android/nfc/simulator/MockNdefMessages.html">
+ <code>MockNdefMessages
+ </code>
+ </a>
+ — this class provides a list of fake NFC Ndef format Tags.
+ </li>
+
+ </ul>
+<p>If you are developing an application that uses the NFC API, remember that the feature
+ is supported only on Android 2.3 (API level 9) and higher versions of the platform. Also,
+ among devices running Android 2.3 (API level 9) or higher, not all devices will offer NFC
+ support. To ensure that your application can only be installed on devices that are capable
+ of supporting NFC, remember to add the following to the application's manifest before
+ publishing to Android Market:
+</p>
+<ul>
+ <li>
+ <code><uses-sdk android:minSdkVersion="9" />
+ </code>,
+ which indicates to Android Market and the platform that your application requires
+ Android 2.3 or higher. For more information, see
+ <a href="../../../guide/appendix/api-levels.html">API Levels
+ </a>
+ and the documentation for the
+ <a href="../../../guide/topics/manifest/uses-sdk-element.html">
+ <code><uses-sdk>
+ </code>
+ </a> element.
+ </li>
+</ul>
+<p>To control how Android Market filters your application
+ from devices that do not support NFC, remember to add the following to the application's manifest
+ <ul>
+ <li>
+ <code><uses-feature android:name="android.hardware.nfc" />
+ </code>,
+ which tells Android Market that your application uses the NFC API. The declaration
+ should include an
+ <code>android:required
+ </code> attribute that indicates whether you want
+ Android Market to filter the application from devices that do not offer NFC support. Other
+ <code><uses-feature>
+ </code> declarations may also be needed, depending on your
+ implementation. For more information, see the documentation for the
+ <a href="../../../guide/topics/manifest/uses-feature-element.html">
+ <code><uses-feature>
+ </code>
+ </a> element.
+ </li>
+ </ul>
+<p>For more information about using the NFC API, see the
+ <a href="../../../reference/android/nfc/package-summary.html">
+ <code>android.nfc</code>
+ </a>
+ documentation.
+</p>
+<img alt="" src="../images/NfcDemo.png"/>
diff --git a/samples/NFCDemo/res/drawable/icon.png b/samples/NFCDemo/res/drawable/icon.png
new file mode 100644
index 0000000..a07c69f
--- /dev/null
+++ b/samples/NFCDemo/res/drawable/icon.png
Binary files differ
diff --git a/samples/NFCDemo/res/layout/tag_divider.xml b/samples/NFCDemo/res/layout/tag_divider.xml
new file mode 100644
index 0000000..b6b1b7c
--- /dev/null
+++ b/samples/NFCDemo/res/layout/tag_divider.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/listDivider"
+/>
\ No newline at end of file
diff --git a/samples/NFCDemo/res/layout/tag_text.xml b/samples/NFCDemo/res/layout/tag_text.xml
new file mode 100644
index 0000000..59cbbfb
--- /dev/null
+++ b/samples/NFCDemo/res/layout/tag_text.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/text"
+ android:layout_width="match_parent"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:layout_height="wrap_content"
+ android:padding="4dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:maxLines="5"
+ android:ellipsize="end"
+ android:gravity="center_vertical"
+/>
\ No newline at end of file
diff --git a/samples/NFCDemo/res/layout/tag_viewer.xml b/samples/NFCDemo/res/layout/tag_viewer.xml
new file mode 100644
index 0000000..a429ef9
--- /dev/null
+++ b/samples/NFCDemo/res/layout/tag_viewer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent" android:layout_height="match_parent"
+ android:orientation="vertical">
+ <!-- Title -->
+ <TextView android:id="@+id/title" android:layout_width="wrap_content"
+ android:layout_height="wrap_content" android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold" android:shadowColor="#BB000000"
+ android:shadowRadius="2.75" android:gravity="center_vertical" />
+ <!-- Content -->
+ <ScrollView android:layout_width="match_parent"
+ android:layout_height="0dip" android:layout_weight="1">
+ <LinearLayout android:id="@+id/list" android:layout_width="match_parent"
+ android:layout_height="wrap_content" android:orientation="vertical" />
+ </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/NFCDemo/res/raw/discovered_tag_notification.ogg b/samples/NFCDemo/res/raw/discovered_tag_notification.ogg
new file mode 100755
index 0000000..7bf5df7
--- /dev/null
+++ b/samples/NFCDemo/res/raw/discovered_tag_notification.ogg
Binary files differ
diff --git a/samples/NFCDemo/res/values/strings.xml b/samples/NFCDemo/res/values/strings.xml
new file mode 100644
index 0000000..251d2f6
--- /dev/null
+++ b/samples/NFCDemo/res/values/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- The title of the NFC tag application -->
+ <string name="app_name">NFCDemo</string>
+
+ <!-- The title for the activity that shows a tag that was just scanned -->
+ <string name="title_scanned_tag">New tag collected</string>
+
+ <!-- Heading for the text of the content in the "my tag" feature. -->
+ <string name="tag_text">Text</string>
+
+</resources>
diff --git a/samples/NFCDemo/src/com/example/android/nfc/NdefMessageParser.java b/samples/NFCDemo/src/com/example/android/nfc/NdefMessageParser.java
new file mode 100644
index 0000000..7372810
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/NdefMessageParser.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.nfc;
+
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+
+import com.example.android.nfc.record.ParsedNdefRecord;
+import com.example.android.nfc.record.SmartPoster;
+import com.example.android.nfc.record.TextRecord;
+import com.example.android.nfc.record.UriRecord;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Utility class for creating {@link ParsedNdefMessage}s.
+ */
+public class NdefMessageParser {
+
+ // Utility class
+ private NdefMessageParser() {
+
+ }
+
+ /** Parse an NdefMessage */
+ public static List<ParsedNdefRecord> parse(NdefMessage message) {
+ return getRecords(message.getRecords());
+ }
+
+ public static List<ParsedNdefRecord> getRecords(NdefRecord[] records) {
+ List<ParsedNdefRecord> elements = new ArrayList<ParsedNdefRecord>();
+ for (NdefRecord record : records) {
+ if (UriRecord.isUri(record)) {
+ elements.add(UriRecord.parse(record));
+ } else if (TextRecord.isText(record)) {
+ elements.add(TextRecord.parse(record));
+ } else if (SmartPoster.isPoster(record)) {
+ elements.add(SmartPoster.parse(record));
+ }
+ }
+ return elements;
+ }
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/TagViewer.java b/samples/NFCDemo/src/com/example/android/nfc/TagViewer.java
new file mode 100644
index 0000000..01dc0bd
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/TagViewer.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.nfc;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.example.android.nfc.record.ParsedNdefRecord;
+
+import java.util.List;
+
+/**
+ * An {@link Activity} which handles a broadcast of a new tag that the device
+ * just discovered.
+ */
+public class TagViewer extends Activity {
+
+ static final String TAG = "ViewTag";
+
+ /**
+ * This activity will finish itself in this amount of time if the user
+ * doesn't do anything.
+ */
+ static final int ACTIVITY_TIMEOUT_MS = 1 * 1000;
+
+ TextView mTitle;
+
+ LinearLayout mTagContent;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.tag_viewer);
+ mTagContent = (LinearLayout) findViewById(R.id.list);
+ mTitle = (TextView) findViewById(R.id.title);
+ resolveIntent(getIntent());
+ }
+
+ void resolveIntent(Intent intent) {
+ // Parse the intent
+ String action = intent.getAction();
+ if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
+ // When a tag is discovered we send it to the service to be save. We
+ // include a PendingIntent for the service to call back onto. This
+ // will cause this activity to be restarted with onNewIntent(). At
+ // that time we read it from the database and view it.
+ Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+ NdefMessage[] msgs;
+ if (rawMsgs != null) {
+ msgs = new NdefMessage[rawMsgs.length];
+ for (int i = 0; i < rawMsgs.length; i++) {
+ msgs[i] = (NdefMessage) rawMsgs[i];
+ }
+ } else {
+ // Unknown tag type
+ byte[] empty = new byte[] {};
+ NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
+ NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
+ msgs = new NdefMessage[] {msg};
+ }
+ // Setup the views
+ setTitle(R.string.title_scanned_tag);
+ buildTagViews(msgs);
+ } else {
+ Log.e(TAG, "Unknown intent " + intent);
+ finish();
+ return;
+ }
+ }
+
+ void buildTagViews(NdefMessage[] msgs) {
+ if (msgs == null || msgs.length == 0) {
+ return;
+ }
+ LayoutInflater inflater = LayoutInflater.from(this);
+ LinearLayout content = mTagContent;
+ // Clear out any old views in the content area, for example if you scan
+ // two tags in a row.
+ content.removeAllViews();
+ // Parse the first message in the list
+ // Build views for all of the sub records
+ List<ParsedNdefRecord> records = NdefMessageParser.parse(msgs[0]);
+ final int size = records.size();
+ for (int i = 0; i < size; i++) {
+ ParsedNdefRecord record = records.get(i);
+ content.addView(record.getView(this, inflater, content, i));
+ inflater.inflate(R.layout.tag_divider, content, true);
+ }
+ }
+
+ @Override
+ public void onNewIntent(Intent intent) {
+ setIntent(intent);
+ resolveIntent(intent);
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ mTitle.setText(title);
+ }
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/record/ParsedNdefRecord.java b/samples/NFCDemo/src/com/example/android/nfc/record/ParsedNdefRecord.java
new file mode 100644
index 0000000..b706ae8
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/record/ParsedNdefRecord.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.nfc.record;
+
+import android.app.Activity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+public interface ParsedNdefRecord {
+
+ /**
+ * Returns a view to display this record.
+ */
+ public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent,
+ int offset);
+
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/record/SmartPoster.java b/samples/NFCDemo/src/com/example/android/nfc/record/SmartPoster.java
new file mode 100644
index 0000000..f86d3ef
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/record/SmartPoster.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.nfc.record;
+
+import android.app.Activity;
+import android.nfc.FormatException;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.LinearLayout;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+import com.example.android.nfc.NdefMessageParser;
+import com.example.android.nfc.R;
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+
+/**
+ * A representation of an NFC Forum "Smart Poster".
+ */
+public class SmartPoster implements ParsedNdefRecord {
+
+ /**
+ * NFC Forum Smart Poster Record Type Definition section 3.2.1.
+ *
+ * "The Title record for the service (there can be many of these in
+ * different languages, but a language MUST NOT be repeated). This record is
+ * optional."
+ */
+ private final TextRecord mTitleRecord;
+
+ /**
+ * NFC Forum Smart Poster Record Type Definition section 3.2.1.
+ *
+ * "The URI record. This is the core of the Smart Poster, and all other
+ * records are just metadata about this record. There MUST be one URI record
+ * and there MUST NOT be more than one."
+ */
+ private final UriRecord mUriRecord;
+
+ /**
+ * NFC Forum Smart Poster Record Type Definition section 3.2.1.
+ *
+ * "The Action record. This record describes how the service should be
+ * treated. For example, the action may indicate that the device should save
+ * the URI as a bookmark or open a browser. The Action record is optional.
+ * If it does not exist, the device may decide what to do with the service.
+ * If the action record exists, it should be treated as a strong suggestion;
+ * the UI designer may ignore it, but doing so will induce a different user
+ * experience from device to device."
+ */
+ private final RecommendedAction mAction;
+
+ /**
+ * NFC Forum Smart Poster Record Type Definition section 3.2.1.
+ *
+ * "The Type record. If the URI references an external entity (e.g., via a
+ * URL), the Type record may be used to declare the MIME type of the entity.
+ * This can be used to tell the mobile device what kind of an object it can
+ * expect before it opens the connection. The Type record is optional."
+ */
+ private final String mType;
+
+ private SmartPoster(UriRecord uri, TextRecord title, RecommendedAction action, String type) {
+ mUriRecord = Preconditions.checkNotNull(uri);
+ mTitleRecord = title;
+ mAction = Preconditions.checkNotNull(action);
+ mType = type;
+ }
+
+ public UriRecord getUriRecord() {
+ return mUriRecord;
+ }
+
+ /**
+ * Returns the title of the smart poster. This may be {@code null}.
+ */
+ public TextRecord getTitle() {
+ return mTitleRecord;
+ }
+
+ public static SmartPoster parse(NdefRecord record) {
+ Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN);
+ Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER));
+ try {
+ NdefMessage subRecords = new NdefMessage(record.getPayload());
+ return parse(subRecords.getRecords());
+ } catch (FormatException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public static SmartPoster parse(NdefRecord[] recordsRaw) {
+ try {
+ Iterable<ParsedNdefRecord> records = NdefMessageParser.getRecords(recordsRaw);
+ UriRecord uri = Iterables.getOnlyElement(Iterables.filter(records, UriRecord.class));
+ TextRecord title = getFirstIfExists(records, TextRecord.class);
+ RecommendedAction action = parseRecommendedAction(recordsRaw);
+ String type = parseType(recordsRaw);
+ return new SmartPoster(uri, title, action, type);
+ } catch (NoSuchElementException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public static boolean isPoster(NdefRecord record) {
+ try {
+ parse(record);
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent, int offset) {
+ if (mTitleRecord != null) {
+ // Build a container to hold the title and the URI
+ LinearLayout container = new LinearLayout(activity);
+ container.setOrientation(LinearLayout.VERTICAL);
+ container.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT));
+ container.addView(mTitleRecord.getView(activity, inflater, container, offset));
+ inflater.inflate(R.layout.tag_divider, container);
+ container.addView(mUriRecord.getView(activity, inflater, container, offset));
+ return container;
+ } else {
+ // Just a URI, return a view for it directly
+ return mUriRecord.getView(activity, inflater, parent, offset);
+ }
+ }
+
+ /**
+ * Returns the first element of {@code elements} which is an instance of
+ * {@code type}, or {@code null} if no such element exists.
+ */
+ private static <T> T getFirstIfExists(Iterable<?> elements, Class<T> type) {
+ Iterable<T> filtered = Iterables.filter(elements, type);
+ T instance = null;
+ if (!Iterables.isEmpty(filtered)) {
+ instance = Iterables.get(filtered, 0);
+ }
+ return instance;
+ }
+
+ private enum RecommendedAction {
+ UNKNOWN((byte) -1), DO_ACTION((byte) 0), SAVE_FOR_LATER((byte) 1), OPEN_FOR_EDITING(
+ (byte) 2);
+
+ private static final ImmutableMap<Byte, RecommendedAction> LOOKUP;
+ static {
+ ImmutableMap.Builder<Byte, RecommendedAction> builder = ImmutableMap.builder();
+ for (RecommendedAction action : RecommendedAction.values()) {
+ builder.put(action.getByte(), action);
+ }
+ LOOKUP = builder.build();
+ }
+
+ private final byte mAction;
+
+ private RecommendedAction(byte val) {
+ this.mAction = val;
+ }
+
+ private byte getByte() {
+ return mAction;
+ }
+ }
+
+ private static NdefRecord getByType(byte[] type, NdefRecord[] records) {
+ for (NdefRecord record : records) {
+ if (Arrays.equals(type, record.getType())) {
+ return record;
+ }
+ }
+ return null;
+ }
+
+ private static final byte[] ACTION_RECORD_TYPE = new byte[] {'a', 'c', 't'};
+
+ private static RecommendedAction parseRecommendedAction(NdefRecord[] records) {
+ NdefRecord record = getByType(ACTION_RECORD_TYPE, records);
+ if (record == null) {
+ return RecommendedAction.UNKNOWN;
+ }
+ byte action = record.getPayload()[0];
+ if (RecommendedAction.LOOKUP.containsKey(action)) {
+ return RecommendedAction.LOOKUP.get(action);
+ }
+ return RecommendedAction.UNKNOWN;
+ }
+
+ private static final byte[] TYPE_TYPE = new byte[] {'t'};
+
+ private static String parseType(NdefRecord[] records) {
+ NdefRecord type = getByType(TYPE_TYPE, records);
+ if (type == null) {
+ return null;
+ }
+ return new String(type.getPayload(), Charsets.UTF_8);
+ }
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/record/TextRecord.java b/samples/NFCDemo/src/com/example/android/nfc/record/TextRecord.java
new file mode 100644
index 0000000..8041cca
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/record/TextRecord.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.nfc.record;
+
+import android.app.Activity;
+import android.nfc.NdefRecord;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.google.common.base.Preconditions;
+
+import com.example.android.nfc.R;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+
+/**
+ * An NFC Text Record
+ */
+public class TextRecord implements ParsedNdefRecord {
+
+ /** ISO/IANA language code */
+ private final String mLanguageCode;
+
+ private final String mText;
+
+ private TextRecord(String languageCode, String text) {
+ mLanguageCode = Preconditions.checkNotNull(languageCode);
+ mText = Preconditions.checkNotNull(text);
+ }
+
+ public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent, int offset) {
+ TextView text = (TextView) inflater.inflate(R.layout.tag_text, parent, false);
+ text.setText(mText);
+ return text;
+ }
+
+ public String getText() {
+ return mText;
+ }
+
+ /**
+ * Returns the ISO/IANA language code associated with this text element.
+ */
+ public String getLanguageCode() {
+ return mLanguageCode;
+ }
+
+ // TODO: deal with text fields which span multiple NdefRecords
+ public static TextRecord parse(NdefRecord record) {
+ Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN);
+ Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_TEXT));
+ try {
+ byte[] payload = record.getPayload();
+ /*
+ * payload[0] contains the "Status Byte Encodings" field, per the
+ * NFC Forum "Text Record Type Definition" section 3.2.1.
+ *
+ * bit7 is the Text Encoding Field.
+ *
+ * if (Bit_7 == 0): The text is encoded in UTF-8 if (Bit_7 == 1):
+ * The text is encoded in UTF16
+ *
+ * Bit_6 is reserved for future use and must be set to zero.
+ *
+ * Bits 5 to 0 are the length of the IANA language code.
+ */
+ String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
+ int languageCodeLength = payload[0] & 0077;
+ String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");
+ String text =
+ new String(payload, languageCodeLength + 1,
+ payload.length - languageCodeLength - 1, textEncoding);
+ return new TextRecord(languageCode, text);
+ } catch (UnsupportedEncodingException e) {
+ // should never happen unless we get a malformed tag.
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public static boolean isText(NdefRecord record) {
+ try {
+ parse(record);
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/record/UriRecord.java b/samples/NFCDemo/src/com/example/android/nfc/record/UriRecord.java
new file mode 100644
index 0000000..452ebb2
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/record/UriRecord.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.nfc.record;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.nfc.NdefRecord;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.primitives.Bytes;
+
+import com.example.android.nfc.R;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+ * A parsed record containing a Uri.
+ */
+public class UriRecord implements ParsedNdefRecord {
+
+ private static final String TAG = "UriRecord";
+
+ public static final String RECORD_TYPE = "UriRecord";
+
+ /**
+ * NFC Forum "URI Record Type Definition"
+ *
+ * This is a mapping of "URI Identifier Codes" to URI string prefixes,
+ * per section 3.2.2 of the NFC Forum URI Record Type Definition document.
+ */
+ private static final BiMap<Byte, String> URI_PREFIX_MAP = ImmutableBiMap.<Byte, String>builder()
+ .put((byte) 0x00, "")
+ .put((byte) 0x01, "http://www.")
+ .put((byte) 0x02, "https://www.")
+ .put((byte) 0x03, "http://")
+ .put((byte) 0x04, "https://")
+ .put((byte) 0x05, "tel:")
+ .put((byte) 0x06, "mailto:")
+ .put((byte) 0x07, "ftp://anonymous:anonymous@")
+ .put((byte) 0x08, "ftp://ftp.")
+ .put((byte) 0x09, "ftps://")
+ .put((byte) 0x0A, "sftp://")
+ .put((byte) 0x0B, "smb://")
+ .put((byte) 0x0C, "nfs://")
+ .put((byte) 0x0D, "ftp://")
+ .put((byte) 0x0E, "dav://")
+ .put((byte) 0x0F, "news:")
+ .put((byte) 0x10, "telnet://")
+ .put((byte) 0x11, "imap:")
+ .put((byte) 0x12, "rtsp://")
+ .put((byte) 0x13, "urn:")
+ .put((byte) 0x14, "pop:")
+ .put((byte) 0x15, "sip:")
+ .put((byte) 0x16, "sips:")
+ .put((byte) 0x17, "tftp:")
+ .put((byte) 0x18, "btspp://")
+ .put((byte) 0x19, "btl2cap://")
+ .put((byte) 0x1A, "btgoep://")
+ .put((byte) 0x1B, "tcpobex://")
+ .put((byte) 0x1C, "irdaobex://")
+ .put((byte) 0x1D, "file://")
+ .put((byte) 0x1E, "urn:epc:id:")
+ .put((byte) 0x1F, "urn:epc:tag:")
+ .put((byte) 0x20, "urn:epc:pat:")
+ .put((byte) 0x21, "urn:epc:raw:")
+ .put((byte) 0x22, "urn:epc:")
+ .put((byte) 0x23, "urn:nfc:")
+ .build();
+
+ private final Uri mUri;
+
+ private UriRecord(Uri uri) {
+ this.mUri = Preconditions.checkNotNull(uri);
+ }
+
+ public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent, int offset) {
+ TextView text = (TextView) inflater.inflate(R.layout.tag_text, parent, false);
+ text.setText(mUri.toString());
+ return text;
+ }
+
+ public Uri getUri() {
+ return mUri;
+ }
+
+ /**
+ * Convert {@link android.nfc.NdefRecord} into a {@link android.net.Uri}.
+ * This will handle both TNF_WELL_KNOWN / RTD_URI and TNF_ABSOLUTE_URI.
+ *
+ * @throws IllegalArgumentException if the NdefRecord is not a record
+ * containing a URI.
+ */
+ public static UriRecord parse(NdefRecord record) {
+ short tnf = record.getTnf();
+ if (tnf == NdefRecord.TNF_WELL_KNOWN) {
+ return parseWellKnown(record);
+ } else if (tnf == NdefRecord.TNF_ABSOLUTE_URI) {
+ return parseAbsolute(record);
+ }
+ throw new IllegalArgumentException("Unknown TNF " + tnf);
+ }
+
+ /** Parse and absolute URI record */
+ private static UriRecord parseAbsolute(NdefRecord record) {
+ byte[] payload = record.getPayload();
+ Uri uri = Uri.parse(new String(payload, Charset.forName("UTF-8")));
+ return new UriRecord(uri);
+ }
+
+ /** Parse an well known URI record */
+ private static UriRecord parseWellKnown(NdefRecord record) {
+ Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_URI));
+ byte[] payload = record.getPayload();
+ /*
+ * payload[0] contains the URI Identifier Code, per the
+ * NFC Forum "URI Record Type Definition" section 3.2.2.
+ *
+ * payload[1]...payload[payload.length - 1] contains the rest of
+ * the URI.
+ */
+ String prefix = URI_PREFIX_MAP.get(payload[0]);
+ byte[] fullUri =
+ Bytes.concat(prefix.getBytes(Charset.forName("UTF-8")), Arrays.copyOfRange(payload, 1,
+ payload.length));
+ Uri uri = Uri.parse(new String(fullUri, Charset.forName("UTF-8")));
+ return new UriRecord(uri);
+ }
+
+ public static boolean isUri(NdefRecord record) {
+ try {
+ parse(record);
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ private static final byte[] EMPTY = new byte[0];
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/simulator/FakeTagsActivity.java b/samples/NFCDemo/src/com/example/android/nfc/simulator/FakeTagsActivity.java
new file mode 100644
index 0000000..313bab4
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/simulator/FakeTagsActivity.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.example.android.nfc.simulator;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Preconditions;
+import com.google.common.primitives.Bytes;
+
+import java.nio.charset.Charset;
+import java.util.Locale;
+
+/**
+ * A activity that launches tags as if they had been scanned.
+ */
+public class FakeTagsActivity extends ListActivity {
+
+ static final String TAG = "FakeTagsActivity";
+
+ static final byte[] UID = new byte[] {0x05, 0x00, 0x03, 0x08};
+
+ ArrayAdapter<TagDescription> mAdapter;
+
+ public static NdefRecord newTextRecord(String text, Locale locale, boolean encodeInUtf8) {
+ Preconditions.checkNotNull(text);
+ Preconditions.checkNotNull(locale);
+ final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);
+ final Charset utfEncoding = encodeInUtf8 ? Charsets.UTF_8 : Charset.forName("UTF-16");
+ final byte[] textBytes = text.getBytes(utfEncoding);
+ final int utfBit = encodeInUtf8 ? 0 : (1 << 7);
+ final char status = (char) (utfBit + langBytes.length);
+ final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes);
+ return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);
+ }
+
+ public static NdefRecord newMimeRecord(String type, byte[] data) {
+ Preconditions.checkNotNull(type);
+ Preconditions.checkNotNull(data);
+ final byte[] typeBytes = type.getBytes(Charsets.US_ASCII);
+ return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, typeBytes, new byte[0], data);
+ }
+
+ static final class TagDescription {
+
+ public String title;
+
+ public NdefMessage[] msgs;
+
+ public TagDescription(String title, byte[] bytes) {
+ this.title = title;
+ try {
+ msgs = new NdefMessage[] {new NdefMessage(bytes)};
+ } catch (final Exception e) {
+ throw new RuntimeException("Failed to create tag description", e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return title;
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+ final ArrayAdapter<TagDescription> adapter = new ArrayAdapter<TagDescription>(
+ this, android.R.layout.simple_list_item_1, android.R.id.text1);
+ adapter.add(
+ new TagDescription("Broadcast NFC Text Tag", MockNdefMessages.ENGLISH_PLAIN_TEXT));
+ adapter.add(new TagDescription(
+ "Broadcast NFC SmartPoster URL & text", MockNdefMessages.SMART_POSTER_URL_AND_TEXT));
+ adapter.add(new TagDescription(
+ "Broadcast NFC SmartPoster URL", MockNdefMessages.SMART_POSTER_URL_NO_TEXT));
+ setListAdapter(adapter);
+ mAdapter = adapter;
+ }
+
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id) {
+ final TagDescription description = mAdapter.getItem(position);
+ final Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
+ intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, description.msgs);
+ startActivity(intent);
+ }
+}
diff --git a/samples/NFCDemo/src/com/example/android/nfc/simulator/MockNdefMessages.java b/samples/NFCDemo/src/com/example/android/nfc/simulator/MockNdefMessages.java
new file mode 100644
index 0000000..52a122f
--- /dev/null
+++ b/samples/NFCDemo/src/com/example/android/nfc/simulator/MockNdefMessages.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.nfc.simulator;
+
+/**
+ * This class provides a list of fake NFC Ndef format Tags.
+ */
+public class MockNdefMessages {
+
+ /**
+ * A Smart Poster containing a URL and no text.
+ */
+ public static final byte[] SMART_POSTER_URL_NO_TEXT =
+ new byte[] {(byte) 0xd1, (byte) 0x02, (byte) 0x0f, (byte) 0x53, (byte) 0x70, (byte) 0xd1,
+ (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, (byte) 0x6f,
+ (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63,
+ (byte) 0x6f, (byte) 0x6d};
+
+ /**
+ * A plain text tag in english.
+ */
+ public static final byte[] ENGLISH_PLAIN_TEXT =
+ new byte[] {(byte) 0xd1, (byte) 0x01, (byte) 0x1c, (byte) 0x54, (byte) 0x02, (byte) 0x65,
+ (byte) 0x6e, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x20,
+ (byte) 0x72, (byte) 0x61, (byte) 0x6e, (byte) 0x64, (byte) 0x6f, (byte) 0x6d,
+ (byte) 0x20, (byte) 0x65, (byte) 0x6e, (byte) 0x67, (byte) 0x6c, (byte) 0x69,
+ (byte) 0x73, (byte) 0x68, (byte) 0x20, (byte) 0x74, (byte) 0x65, (byte) 0x78,
+ (byte) 0x74, (byte) 0x2e};
+
+ /**
+ * Smart Poster containing a URL and Text.
+ */
+ public static final byte[] SMART_POSTER_URL_AND_TEXT =
+ new byte[] {(byte) 0xd1, (byte) 0x02, (byte) 0x1c, (byte) 0x53, (byte) 0x70, (byte) 0x91,
+ (byte) 0x01, (byte) 0x09, (byte) 0x54, (byte) 0x02, (byte) 0x65, (byte) 0x6e,
+ (byte) 0x47, (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65,
+ (byte) 0x51, (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67,
+ (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
+ (byte) 0x63, (byte) 0x6f, (byte) 0x6d};
+
+ /**
+ * All the mock Ndef tags.
+ */
+ public static final byte[][] ALL_MOCK_MESSAGES =
+ new byte[][] {SMART_POSTER_URL_NO_TEXT, ENGLISH_PLAIN_TEXT, SMART_POSTER_URL_AND_TEXT};
+}
diff --git a/samples/SipDemo/Android.mk b/samples/SipDemo/Android.mk
new file mode 100644
index 0000000..6363727
--- /dev/null
+++ b/samples/SipDemo/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SipDemo
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/SipDemo/AndroidManifest.xml b/samples/SipDemo/AndroidManifest.xml
new file mode 100644
index 0000000..8fb7675
--- /dev/null
+++ b/samples/SipDemo/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.sip">
+ <application android:icon="@drawable/icon" android:label="SipDemo">
+ <activity android:name=".WalkieTalkieActivity"
+ android:configChanges="orientation|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ <activity android:name=".SipSettings" android:label="set_preferences"/>
+
+
+ <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>
+ </application>
+ <uses-sdk android:minSdkVersion="9" />
+ <uses-permission android:name="android.permission.USE_SIP" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
+ <uses-feature android:name="android.hardware.sip.voip" android:required="true" />
+ <uses-feature android:name="android.hardware.wifi" android:required="true" />
+ <uses-feature android:name="android.hardware.microphone" android:required="true" />
+</manifest>
diff --git a/samples/SipDemo/_index.html b/samples/SipDemo/_index.html
new file mode 100644
index 0000000..dbc9037
--- /dev/null
+++ b/samples/SipDemo/_index.html
@@ -0,0 +1,52 @@
+<p>This is a demo application highlighting how to make internet-based calls with
+the SIP API. The application uses a walkie-talkie style interface, allowing you
+to only be heard when the button is pushed down.</p>
+
+<p>The source code for this demo app shows how to accomplish three key things
+with SIP: Make a call, receive a call, and signal to the Android platform that
+your app wants to receive incoming SIP calls, so that they can be handled from
+within the application.</p>
+
+
+<p>The application includes:<p>
+<ul> <li><a
+ href="src/com/example/android/sip/SipSettings.html"><code>SipSettings</code></a>
+ — a <code>PreferenceActivity</code> that supplies basic settings for SIP
+ authentication.</li> <li><a
+ href="src/com/example/android/sip/cube1/IncomingCallReceiver.html"><code>
+ IncomingCallReceiver</code></a> — a <code>BroadcastReceiver</code>
+ that listens for incoming SIP calls and passes them to
+ <code>WalkieTalkieActivity</code> for handling.</li> <li><a
+ href="src/com/example/android/sip/WalkieTalkieActivity.html"><code>WalkieTalkieActivity</code></a>
+ — a activity that login to SIP provider and registers the device to
+ receive incoming SIP, handles incoming calls and makes outgoing calls, managing
+ UI during the call.</li> </ul>
+<p>If you are developing an application that uses the SIP API, remember that the
+feature is supported only on Android 2.3 (API level 9) and higher versions of
+the platform. Also, among devices running Android 2.3 (API level 9) or higher,
+not all devices will offer SIP support. To ensure that your application can only
+be installed on devices that are capable of supporting SIP, remember to add the
+following to the application's manifest before publishing to Android Market:</p>
+<ul> <li><code><uses-sdk android:minSdkVersion="9" /></code>, which
+ indicates to Android Market and the platform that your application requires
+ Android 2.3 or higher. For more information, see <a
+ href="../../../guide/appendix/api-levels.html">API Levels</a> and the
+ documentation for the <a
+ href="../../../guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
+ element.</li> </ul> <p>To control how Android Market filters your application
+from devices that do not support SIP, remember to add the following to the
+application's manifest <ul> <li><code><uses-feature
+ android:name="android.hardware.sip.voip" /></code>, which tells Android
+ Market that your application uses the SIP API. The declaration should include
+ an <code>android:required</code> attribute that indicates whether you want
+ Android Market to filter the application from devices that do not offer SIP
+ support. Other <code><uses-feature></code> declarations may also be
+ needed, depending on your implementation. For more information, see the
+ documentation for the <a
+ href="../../../guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a>
+ element.</li> </ul>
+<p>For more information about using the SIP API, see the <a
+ href="../../../reference/android/net/sip/package-summary.html"><code>android.net.sip</a></code>
+documentation. </p>
+
+<img alt="" src="../images/SipDemo.png" />
diff --git a/samples/SipDemo/res/drawable/btn_record.xml b/samples/SipDemo/res/drawable/btn_record.xml
new file mode 100644
index 0000000..a803da1
--- /dev/null
+++ b/samples/SipDemo/res/drawable/btn_record.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/btn_speak_pressed" />
+ <item android:state_selected="true" android:drawable="@drawable/btn_speak_pressed" />
+ <item android:drawable="@drawable/btn_speak_normal" />
+</selector>
+
diff --git a/samples/SipDemo/res/drawable/btn_speak_normal.png b/samples/SipDemo/res/drawable/btn_speak_normal.png
new file mode 100644
index 0000000..fb86ceb
--- /dev/null
+++ b/samples/SipDemo/res/drawable/btn_speak_normal.png
Binary files differ
diff --git a/samples/SipDemo/res/drawable/btn_speak_pressed.png b/samples/SipDemo/res/drawable/btn_speak_pressed.png
new file mode 100644
index 0000000..cffdf91
--- /dev/null
+++ b/samples/SipDemo/res/drawable/btn_speak_pressed.png
Binary files differ
diff --git a/samples/SipDemo/res/drawable/btn_speak_selected.png b/samples/SipDemo/res/drawable/btn_speak_selected.png
new file mode 100644
index 0000000..99a1a6f
--- /dev/null
+++ b/samples/SipDemo/res/drawable/btn_speak_selected.png
Binary files differ
diff --git a/samples/SipDemo/res/drawable/icon.png b/samples/SipDemo/res/drawable/icon.png
new file mode 100644
index 0000000..64e3601
--- /dev/null
+++ b/samples/SipDemo/res/drawable/icon.png
Binary files differ
diff --git a/samples/SipDemo/res/layout/call_address_dialog.xml b/samples/SipDemo/res/layout/call_address_dialog.xml
new file mode 100644
index 0000000..2bd7556
--- /dev/null
+++ b/samples/SipDemo/res/layout/call_address_dialog.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/calladdress_view"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:text="@+string/contactAddress"
+ android:gravity="left"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/calladdress_edit"
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:scrollHorizontally="true"
+ android:autoText="false"
+ android:capitalize="none"
+ android:gravity="fill_horizontal"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+</LinearLayout>
diff --git a/samples/SipDemo/res/layout/walkietalkie.xml b/samples/SipDemo/res/layout/walkietalkie.xml
new file mode 100644
index 0000000..bdf634c
--- /dev/null
+++ b/samples/SipDemo/res/layout/walkietalkie.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <RelativeLayout android:padding="12dp"
+ android:id="@+id/mainlayout"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:id="@+id/sipLabel"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_centerHorizontal="true"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ />
+
+ <ToggleButton
+ android:layout_height="400dp"
+ android:layout_width="400dp"
+ android:text="@+string/talk"
+ android:id="@+id/pushToTalk"
+
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:background="@drawable/btn_record"
+ android:textOff=""
+ android:textOn=""
+ android:layout_marginTop="-20dp" />
+
+ </RelativeLayout>
+</FrameLayout>
diff --git a/samples/SipDemo/res/values/strings.xml b/samples/SipDemo/res/values/strings.xml
new file mode 100644
index 0000000..a0d49bc
--- /dev/null
+++ b/samples/SipDemo/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <string name="app_name">SIP Demo</string>
+ <string name="contactAddress">SIP Address to contact</string>
+ <string name="talk">Talk</string>
+ </resources>
diff --git a/samples/SipDemo/res/xml/preferences.xml b/samples/SipDemo/res/xml/preferences.xml
new file mode 100644
index 0000000..590e092
--- /dev/null
+++ b/samples/SipDemo/res/xml/preferences.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <EditTextPreference
+ android:name="SIP Username"
+ android:summary="Username for your SIP Account"
+ android:defaultValue=""
+ android:title="Enter Username"
+ android:key="namePref" />
+ <EditTextPreference
+ android:name="SIP Domain"
+ android:summary="Domain for your SIP Account"
+ android:defaultValue=""
+ android:title="Enter Domain"
+ android:key="domainPref" />
+ <EditTextPreference
+ android:name="SIP Password"
+ android:summary="Password for your SIP Account"
+ android:defaultValue=""
+ android:title="Enter Password"
+ android:key="passPref"
+ android:password="true" />
+</PreferenceScreen>
diff --git a/samples/SipDemo/src/com/example/android/sip/IncomingCallReceiver.java b/samples/SipDemo/src/com/example/android/sip/IncomingCallReceiver.java
new file mode 100644
index 0000000..ea27a0a
--- /dev/null
+++ b/samples/SipDemo/src/com/example/android/sip/IncomingCallReceiver.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.sip;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.sip.*;
+import android.util.Log;
+
+/**
+ * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
+ */
+public class IncomingCallReceiver extends BroadcastReceiver {
+ /**
+ * Processes the incoming call, answers it, and hands it over to the
+ * WalkieTalkieActivity.
+ * @param context The context under which the receiver is running.
+ * @param intent The intent being received.
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ SipAudioCall incomingCall = null;
+ try {
+
+ SipAudioCall.Listener listener = new SipAudioCall.Listener() {
+ @Override
+ public void onRinging(SipAudioCall call, SipProfile caller) {
+ try {
+ call.answerCall(30);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+
+ WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
+
+ incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
+ incomingCall.answerCall(30);
+ incomingCall.startAudio();
+ incomingCall.setSpeakerMode(true);
+ if(incomingCall.isMuted()) {
+ incomingCall.toggleMute();
+ }
+
+ wtActivity.call = incomingCall;
+
+ wtActivity.updateStatus(incomingCall);
+
+ } catch (Exception e) {
+ if (incomingCall != null) {
+ incomingCall.close();
+ }
+ }
+ }
+
+}
diff --git a/samples/SipDemo/src/com/example/android/sip/SipSettings.java b/samples/SipDemo/src/com/example/android/sip/SipSettings.java
new file mode 100644
index 0000000..2f0624b
--- /dev/null
+++ b/samples/SipDemo/src/com/example/android/sip/SipSettings.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.sip;
+
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+/**
+ * Handles SIP authentication settings for the Walkie Talkie app.
+ */
+public class SipSettings extends PreferenceActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ // Note that none of the preferences are actually defined here.
+ // They're all in the XML file res/xml/preferences.xml.
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences);
+ }
+}
diff --git a/samples/SipDemo/src/com/example/android/sip/WalkieTalkieActivity.java b/samples/SipDemo/src/com/example/android/sip/WalkieTalkieActivity.java
new file mode 100644
index 0000000..4c187ed
--- /dev/null
+++ b/samples/SipDemo/src/com/example/android/sip/WalkieTalkieActivity.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.sip;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.PendingIntent;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.*;
+import android.net.sip.*;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+
+import java.text.ParseException;
+
+/**
+ * Handles all calling, receiving calls, and UI interaction in the WalkieTalkie app.
+ */
+public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
+
+ public String sipAddress = null;
+
+ public SipManager manager = null;
+ public SipProfile me = null;
+ public SipAudioCall call = null;
+ public IncomingCallReceiver callReceiver;
+
+ private static final int CALL_ADDRESS = 1;
+ private static final int SET_AUTH_INFO = 2;
+ private static final int UPDATE_SETTINGS_DIALOG = 3;
+ private static final int HANG_UP = 4;
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.walkietalkie);
+
+ ToggleButton pushToTalkButton = (ToggleButton) findViewById(R.id.pushToTalk);
+ pushToTalkButton.setOnTouchListener(this);
+
+ // Set up the intent filter. This will be used to fire an
+ // IncomingCallReceiver when someone calls the SIP address used by this
+ // application.
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("android.SipDemo.INCOMING_CALL");
+ callReceiver = new IncomingCallReceiver();
+ this.registerReceiver(callReceiver, filter);
+
+ // "Push to talk" can be a serious pain when the screen keeps turning off.
+ // Let's prevent that.
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ initializeManager();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ // When we get back from the preference setting Activity, assume
+ // settings have changed, and re-login with new auth info.
+ initializeManager();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (call != null) {
+ call.close();
+ }
+
+ closeLocalProfile();
+
+ if (callReceiver != null) {
+ this.unregisterReceiver(callReceiver);
+ }
+ }
+
+ public void initializeManager() {
+ if(manager == null) {
+ manager = SipManager.newInstance(this);
+ }
+
+ initializeLocalProfile();
+ }
+
+ /**
+ * Logs you into your SIP provider, registering this device as the location to
+ * send SIP calls to for your SIP address.
+ */
+ public void initializeLocalProfile() {
+ if (manager == null) {
+ return;
+ }
+
+ if (me != null) {
+ closeLocalProfile();
+ }
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ String username = prefs.getString("namePref", "");
+ String domain = prefs.getString("domainPref", "");
+ String password = prefs.getString("passPref", "");
+
+ if (username.length() == 0 || domain.length() == 0 || password.length() == 0) {
+ showDialog(UPDATE_SETTINGS_DIALOG);
+ return;
+ }
+
+ try {
+ SipProfile.Builder builder = new SipProfile.Builder(username, domain);
+ builder.setPassword(password);
+ me = builder.build();
+
+ Intent i = new Intent();
+ i.setAction("android.SipDemo.INCOMING_CALL");
+ PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
+ manager.open(me, pi, null);
+
+
+ // This listener must be added AFTER manager.open is called,
+ // Otherwise the methods aren't guaranteed to fire.
+
+ manager.setRegistrationListener(me.getUriString(), new SipRegistrationListener() {
+ public void onRegistering(String localProfileUri) {
+ updateStatus("Registering with SIP Server...");
+ }
+
+ public void onRegistrationDone(String localProfileUri, long expiryTime) {
+ updateStatus("Ready");
+ }
+
+ public void onRegistrationFailed(String localProfileUri, int errorCode,
+ String errorMessage) {
+ updateStatus("Registration failed. Please check settings.");
+ }
+ });
+ } catch (ParseException pe) {
+ updateStatus("Connection Error.");
+ } catch (SipException se) {
+ updateStatus("Connection error.");
+ }
+ }
+
+ /**
+ * Closes out your local profile, freeing associated objects into memory
+ * and unregistering your device from the server.
+ */
+ public void closeLocalProfile() {
+ if (manager == null) {
+ return;
+ }
+ try {
+ if (me != null) {
+ manager.close(me.getUriString());
+ }
+ } catch (Exception ee) {
+ Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee);
+ }
+ }
+
+ /**
+ * Make an outgoing call.
+ */
+ public void initiateCall() {
+
+ updateStatus(sipAddress);
+
+ try {
+ SipAudioCall.Listener listener = new SipAudioCall.Listener() {
+ // Much of the client's interaction with the SIP Stack will
+ // happen via listeners. Even making an outgoing call, don't
+ // forget to set up a listener to set things up once the call is established.
+ @Override
+ public void onCallEstablished(SipAudioCall call) {
+ call.startAudio();
+ call.setSpeakerMode(true);
+ call.toggleMute();
+ updateStatus(call);
+ }
+
+ @Override
+ public void onCallEnded(SipAudioCall call) {
+ updateStatus("Ready.");
+ }
+ };
+
+ call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);
+
+ }
+ catch (Exception e) {
+ Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", e);
+ if (me != null) {
+ try {
+ manager.close(me.getUriString());
+ } catch (Exception ee) {
+ Log.i("WalkieTalkieActivity/InitiateCall",
+ "Error when trying to close manager.", ee);
+ ee.printStackTrace();
+ }
+ }
+ if (call != null) {
+ call.close();
+ }
+ }
+ }
+
+ /**
+ * Updates the status box at the top of the UI with a messege of your choice.
+ * @param status The String to display in the status box.
+ */
+ public void updateStatus(final String status) {
+ // Be a good citizen. Make sure UI changes fire on the UI thread.
+ this.runOnUiThread(new Runnable() {
+ public void run() {
+ TextView labelView = (TextView) findViewById(R.id.sipLabel);
+ labelView.setText(status);
+ }
+ });
+ }
+
+ /**
+ * Updates the status box with the SIP address of the current call.
+ * @param call The current, active call.
+ */
+ public void updateStatus(SipAudioCall call) {
+ String useName = call.getPeerProfile().getDisplayName();
+ if(useName == null) {
+ useName = call.getPeerProfile().getUserName();
+ }
+ updateStatus(useName + "@" + call.getPeerProfile().getSipDomain());
+ }
+
+ /**
+ * Updates whether or not the user's voice is muted, depending on whether the button is pressed.
+ * @param v The View where the touch event is being fired.
+ * @param event The motion to act on.
+ * @return boolean Returns false to indicate that the parent view should handle the touch event
+ * as it normally would.
+ */
+ public boolean onTouch(View v, MotionEvent event) {
+ if (call == null) {
+ return false;
+ } else if (event.getAction() == MotionEvent.ACTION_DOWN && call != null && call.isMuted()) {
+ call.toggleMute();
+ } else if (event.getAction() == MotionEvent.ACTION_UP && !call.isMuted()) {
+ call.toggleMute();
+ }
+ return false;
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, CALL_ADDRESS, 0, "Call someone");
+ menu.add(0, SET_AUTH_INFO, 0, "Edit your SIP Info.");
+ menu.add(0, HANG_UP, 0, "End Current Call.");
+
+ return true;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case CALL_ADDRESS:
+ showDialog(CALL_ADDRESS);
+ break;
+ case SET_AUTH_INFO:
+ updatePreferences();
+ break;
+ case HANG_UP:
+ if(call != null) {
+ try {
+ call.endCall();
+ } catch (SipException se) {
+ Log.d("WalkieTalkieActivity/onOptionsItemSelected",
+ "Error ending call.", se);
+ }
+ call.close();
+ }
+ break;
+ }
+ return true;
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ switch (id) {
+ case CALL_ADDRESS:
+
+ LayoutInflater factory = LayoutInflater.from(this);
+ final View textBoxView = factory.inflate(R.layout.call_address_dialog, null);
+ return new AlertDialog.Builder(this)
+ .setTitle("Call Someone.")
+ .setView(textBoxView)
+ .setPositiveButton(
+ android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ EditText textField = (EditText)
+ (textBoxView.findViewById(R.id.calladdress_edit));
+ sipAddress = textField.getText().toString();
+ initiateCall();
+
+ }
+ })
+ .setNegativeButton(
+ android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ // Noop.
+ }
+ })
+ .create();
+
+ case UPDATE_SETTINGS_DIALOG:
+ return new AlertDialog.Builder(this)
+ .setMessage("Please update your SIP Account Settings.")
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ updatePreferences();
+ }
+ })
+ .setNegativeButton(
+ android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ // Noop.
+ }
+ })
+ .create();
+ }
+ return null;
+ }
+
+ public void updatePreferences() {
+ Intent settingsActivity = new Intent(getBaseContext(),
+ SipSettings.class);
+ startActivity(settingsActivity);
+ }
+}