From 1262f1400c6f443a1460e168c7adc25997247cde Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 11:28:10 -0400 Subject: [PATCH 01/25] Initial pass on libinput backend --- backend/CMakeLists.txt | 6 +- backend/libinput/backend.c | 97 ++++++++++++++++++++++++++++++ include/backend/libinput/backend.h | 21 +++++++ include/wlr/session.h | 2 +- include/wlr/session/interface.h | 2 +- session/logind.c | 3 +- 6 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 backend/libinput/backend.c create mode 100644 include/backend/libinput/backend.h diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 91f0f06e..bca615fb 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -9,11 +9,15 @@ add_library(wlr-backend #wayland/registry.c #wayland/wl_seat.c #wayland/wl_output.c + drm/backend.c drm/drm.c - udev.c + + libinput/backend.c + backend.c egl.c + udev.c ) target_link_libraries(wlr-backend diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c new file mode 100644 index 00000000..6142bde3 --- /dev/null +++ b/backend/libinput/backend.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include "backend/udev.h" +#include "backend/libinput/backend.h" +#include "common/log.h" + +static int wlr_libinput_open_restricted(const char *path, + int flags, void *_state) { + struct wlr_backend_state *state = _state; + return wlr_session_open_file(state->session, path); +} + +static void wlr_libinput_close_restricted(int fd, void *_state) { + struct wlr_backend_state *state = _state; + wlr_session_close_file(state->session, fd); +} + +static const struct libinput_interface libinput_impl = { + .open_restricted = wlr_libinput_open_restricted, + .close_restricted = wlr_libinput_close_restricted +}; + +static int wlr_libinput_handle_event(int fd, uint32_t mask, void *_state) { + // TODO + return 0; +} + +static void wlr_libinput_log(struct libinput *libinput, + enum libinput_log_priority priority, const char *fmt, va_list args) { + _wlr_vlog(L_ERROR, fmt, args); +} + +static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { + state->handle = libinput_udev_create_context(&libinput_impl, state, + state->udev->udev); + if (!state->handle) { + return false; + } + + // TODO: Let user customize seat used + if (!libinput_udev_assign_seat(state->handle, "seat0")) { + return false; + } + + // TODO: More sophisticated logging + libinput_log_set_handler(state->handle, wlr_libinput_log); + libinput_log_set_priority(state->handle, LIBINPUT_LOG_PRIORITY_ERROR); + + struct wl_event_loop *event_loop = + wl_display_get_event_loop(state->display); + if (state->input_event) { + wl_event_source_remove(state->input_event); + } + state->input_event = wl_event_loop_add_fd(event_loop, + libinput_get_fd(state->handle), WL_EVENT_READABLE, + wlr_libinput_handle_event, state); + if (!state->input_event) { + return false; + } + return true; +} + +static void wlr_libinput_backend_destroy(struct wlr_backend_state *state) { + // TODO +} + +static struct wlr_backend_impl backend_impl = { + .init = wlr_libinput_backend_init, + .destroy = wlr_libinput_backend_destroy +}; + +struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, + struct wlr_session *session, struct wlr_udev *udev) { + assert(display && session && udev); + + struct wlr_backend_state *state = calloc(1, sizeof(struct wlr_backend_state)); + if (!state) { + wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); + return NULL; + } + + struct wlr_backend *backend = wlr_backend_create(&backend_impl, state); + if (!backend) { + wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); + return NULL; + } + + state->backend = backend; + state->session = session; + state->udev = udev; + state->display = display; + + return backend; +} diff --git a/include/backend/libinput/backend.h b/include/backend/libinput/backend.h new file mode 100644 index 00000000..bafe76ed --- /dev/null +++ b/include/backend/libinput/backend.h @@ -0,0 +1,21 @@ +#ifndef _WLR_BACKEND_LIBINPUT_INTERNAL_H +#define _WLR_BACKEND_LIBINPUT_INTERNAL_H +#include +#include +#include +#include +#include "backend/udev.h" + +struct wlr_backend_state { + struct wlr_backend *backend; + struct wlr_session *session; + struct wlr_udev *udev; + struct wl_display *display; + + struct libinput *handle; + struct wl_event_source *input_event; + + list_t *devices; +}; + +#endif diff --git a/include/wlr/session.h b/include/wlr/session.h index bd5a96c0..28ccb526 100644 --- a/include/wlr/session.h +++ b/include/wlr/session.h @@ -22,7 +22,7 @@ struct wlr_session { struct wlr_session *wlr_session_start(struct wl_display *disp); void wlr_session_finish(struct wlr_session *session); int wlr_session_open_file(struct wlr_session *restrict session, - const char *restrict path); + const char *restrict path); void wlr_session_close_file(struct wlr_session *session, int fd); bool wlr_session_change_vt(struct wlr_session *session, int vt); diff --git a/include/wlr/session/interface.h b/include/wlr/session/interface.h index 78256dd6..f75acfa4 100644 --- a/include/wlr/session/interface.h +++ b/include/wlr/session/interface.h @@ -7,7 +7,7 @@ struct session_impl { struct wlr_session *(*start)(struct wl_display *disp); void (*finish)(struct wlr_session *session); int (*open)(struct wlr_session *restrict session, - const char *restrict path); + const char *restrict path); void (*close)(struct wlr_session *session, int fd); bool (*change_vt)(struct wlr_session *session, int vt); }; diff --git a/session/logind.c b/session/logind.c index 6ce7e4c2..73cd70f2 100644 --- a/session/logind.c +++ b/session/logind.c @@ -28,8 +28,7 @@ struct logind_session { }; static int logind_take_device(struct wlr_session *restrict base, - const char *restrict path) { - + const char *restrict path) { struct logind_session *session = wl_container_of(base, session, base); int ret; From af69591e6233c83ed749b2f51922edb45bdaef2e Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 11:38:38 -0400 Subject: [PATCH 02/25] Add error handling and init in backend_autocreate --- backend/CMakeLists.txt | 2 ++ backend/backend.c | 8 ++++++-- backend/libinput/backend.c | 5 +++++ example/rotation.c | 1 + include/wlr/backend/libinput.h | 12 ++++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 include/wlr/backend/libinput.h diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index bca615fb..c3e7ef54 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -2,6 +2,7 @@ include_directories( ${PROTOCOLS_INCLUDE_DIRS} ${WAYLAND_INCLUDE_DIR} ${DRM_INCLUDE_DIRS} + ${LIBINPUT_INCLUDE_DIRS} ) add_library(wlr-backend @@ -30,5 +31,6 @@ target_link_libraries(wlr-backend ${EGL_LIBRARIES} ${SYSTEMD_LIBRARIES} ${UDEV_LIBRARIES} + ${LIBINPUT_LIBRARIES} ${GBM_LIBRARIES} ) diff --git a/backend/backend.c b/backend/backend.c index 38b65dca..1a0c3295 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -5,8 +5,10 @@ #include #include #include +#include +#include +#include "backend/udev.h" #include "common/log.h" -#include "backend/drm.h" struct wlr_backend *wlr_backend_create(const struct wlr_backend_impl *impl, struct wlr_backend_state *state) { @@ -46,12 +48,14 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, wlr_log(L_ERROR, "Failed to start udev"); goto error; } + struct wlr_backend *wlr; + wlr = wlr_libinput_backend_create(display, session, udev); + return wlr; int gpu = wlr_udev_find_gpu(udev, session); if (gpu == -1) { wlr_log(L_ERROR, "Failed to open DRM device"); goto error_udev; } - struct wlr_backend *wlr; wlr = wlr_drm_backend_create(display, session, udev, gpu); if (!wlr) { goto error_gpu; diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index 6142bde3..b49bf6b4 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -34,14 +34,17 @@ static void wlr_libinput_log(struct libinput *libinput, } static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { + wlr_log(L_DEBUG, "Initializing libinput"); state->handle = libinput_udev_create_context(&libinput_impl, state, state->udev->udev); if (!state->handle) { + wlr_log(L_ERROR, "Failed to create libinput context"); return false; } // TODO: Let user customize seat used if (!libinput_udev_assign_seat(state->handle, "seat0")) { + wlr_log(L_ERROR, "Failed to assign libinput seat"); return false; } @@ -58,8 +61,10 @@ static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { libinput_get_fd(state->handle), WL_EVENT_READABLE, wlr_libinput_handle_event, state); if (!state->input_event) { + wlr_log(L_ERROR, "Failed to create input event on event loop"); return false; } + wlr_log(L_DEBUG, "libinput sucessfully initialized"); return true; } diff --git a/example/rotation.c b/example/rotation.c index 25755f5f..12778f8e 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -219,6 +219,7 @@ int main(int argc, char *argv[]) { wl_signal_add(&wlr->events.output_remove, &state.output_remove); if (!wlr_backend_init(wlr)) { + printf("Failed to initialize backend, bailing out\n"); return 1; } diff --git a/include/wlr/backend/libinput.h b/include/wlr/backend/libinput.h new file mode 100644 index 00000000..1e8c3555 --- /dev/null +++ b/include/wlr/backend/libinput.h @@ -0,0 +1,12 @@ +#ifndef WLR_BACKEND_LIBINPUT_H +#define WLR_BACKEND_LIBINPUT_H + +#include +#include +#include +#include + +struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, + struct wlr_session *session, struct wlr_udev *udev); + +#endif From 019fff06be1ad460ac427bea070fbe7a61c09ea8 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 13:47:35 -0400 Subject: [PATCH 03/25] Fix issues, flesh out event handling somewhat --- backend/libinput/backend.c | 28 +++++++++++++++++++++------- include/backend/libinput/backend.h | 5 ++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index b49bf6b4..f6dce58e 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -24,7 +24,21 @@ static const struct libinput_interface libinput_impl = { }; static int wlr_libinput_handle_event(int fd, uint32_t mask, void *_state) { - // TODO + struct wlr_backend_state *state = _state; + if (libinput_dispatch(state->libinput) != 0) { + wlr_log(L_ERROR, "Failed to dispatch libinput"); + // TODO: some kind of abort? + return 0; + } + struct libinput_event *event; + while ((event = libinput_get_event(state->libinput))) { + struct libinput *context = libinput_event_get_context(event); + struct libinput_device *device = libinput_event_get_device(event); + enum libinput_event_type event_type = libinput_event_get_type(event); + wlr_log(L_DEBUG, "libinput event: %d", event_type); + (void)device; (void)context; + // TODO: dispatch event + } return 0; } @@ -35,22 +49,22 @@ static void wlr_libinput_log(struct libinput *libinput, static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { wlr_log(L_DEBUG, "Initializing libinput"); - state->handle = libinput_udev_create_context(&libinput_impl, state, + state->libinput = libinput_udev_create_context(&libinput_impl, state, state->udev->udev); - if (!state->handle) { + if (!state->libinput) { wlr_log(L_ERROR, "Failed to create libinput context"); return false; } // TODO: Let user customize seat used - if (!libinput_udev_assign_seat(state->handle, "seat0")) { + if (libinput_udev_assign_seat(state->libinput, "seat0") != 0) { wlr_log(L_ERROR, "Failed to assign libinput seat"); return false; } // TODO: More sophisticated logging - libinput_log_set_handler(state->handle, wlr_libinput_log); - libinput_log_set_priority(state->handle, LIBINPUT_LOG_PRIORITY_ERROR); + libinput_log_set_handler(state->libinput, wlr_libinput_log); + libinput_log_set_priority(state->libinput, LIBINPUT_LOG_PRIORITY_ERROR); struct wl_event_loop *event_loop = wl_display_get_event_loop(state->display); @@ -58,7 +72,7 @@ static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { wl_event_source_remove(state->input_event); } state->input_event = wl_event_loop_add_fd(event_loop, - libinput_get_fd(state->handle), WL_EVENT_READABLE, + libinput_get_fd(state->libinput), WL_EVENT_READABLE, wlr_libinput_handle_event, state); if (!state->input_event) { wlr_log(L_ERROR, "Failed to create input event on event loop"); diff --git a/include/backend/libinput/backend.h b/include/backend/libinput/backend.h index bafe76ed..a23a45ac 100644 --- a/include/backend/libinput/backend.h +++ b/include/backend/libinput/backend.h @@ -12,10 +12,13 @@ struct wlr_backend_state { struct wlr_udev *udev; struct wl_display *display; - struct libinput *handle; + struct libinput *libinput; struct wl_event_source *input_event; list_t *devices; }; +void wlr_libinput_event(struct wlr_backend_state *state, + struct libinput_event *event); + #endif From 0e75d157f52db45a1af350574bd95cccbd09fa57 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 17:31:21 -0400 Subject: [PATCH 04/25] Initialize keyboards from libinput --- backend/CMakeLists.txt | 1 + backend/backend.c | 8 +-- backend/libinput/backend.c | 13 ++-- backend/libinput/events.c | 100 +++++++++++++++++++++++++++++ example/simple.c | 91 +++++++++++++++++--------- include/backend/libinput/backend.h | 6 +- include/types.h | 21 ++++++ include/wlr/backend.h | 8 +-- include/wlr/types.h | 93 +++++++++++++++++++++++++++ types/CMakeLists.txt | 2 + types/wlr_input_device.c | 24 +++++++ types/wlr_keyboard.c | 22 +++++++ 12 files changed, 338 insertions(+), 51 deletions(-) create mode 100644 backend/libinput/events.c create mode 100644 types/wlr_input_device.c create mode 100644 types/wlr_keyboard.c diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index c3e7ef54..e22032c3 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -15,6 +15,7 @@ add_library(wlr-backend drm/drm.c libinput/backend.c + libinput/events.c backend.c egl.c diff --git a/backend/backend.c b/backend/backend.c index 1a0c3295..83249a8c 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -19,14 +19,10 @@ struct wlr_backend *wlr_backend_create(const struct wlr_backend_impl *impl, } backend->state = state; backend->impl = impl; + wl_signal_init(&backend->events.input_add); + wl_signal_init(&backend->events.input_remove); wl_signal_init(&backend->events.output_add); wl_signal_init(&backend->events.output_remove); - wl_signal_init(&backend->events.keyboard_add); - wl_signal_init(&backend->events.keyboard_remove); - wl_signal_init(&backend->events.pointer_add); - wl_signal_init(&backend->events.pointer_remove); - wl_signal_init(&backend->events.touch_add); - wl_signal_init(&backend->events.touch_remove); return backend; } diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index f6dce58e..3af08875 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -23,7 +23,7 @@ static const struct libinput_interface libinput_impl = { .close_restricted = wlr_libinput_close_restricted }; -static int wlr_libinput_handle_event(int fd, uint32_t mask, void *_state) { +static int wlr_libinput_readable(int fd, uint32_t mask, void *_state) { struct wlr_backend_state *state = _state; if (libinput_dispatch(state->libinput) != 0) { wlr_log(L_ERROR, "Failed to dispatch libinput"); @@ -32,12 +32,7 @@ static int wlr_libinput_handle_event(int fd, uint32_t mask, void *_state) { } struct libinput_event *event; while ((event = libinput_get_event(state->libinput))) { - struct libinput *context = libinput_event_get_context(event); - struct libinput_device *device = libinput_event_get_device(event); - enum libinput_event_type event_type = libinput_event_get_type(event); - wlr_log(L_DEBUG, "libinput event: %d", event_type); - (void)device; (void)context; - // TODO: dispatch event + wlr_libinput_event(state, event); } return 0; } @@ -73,7 +68,7 @@ static bool wlr_libinput_backend_init(struct wlr_backend_state *state) { } state->input_event = wl_event_loop_add_fd(event_loop, libinput_get_fd(state->libinput), WL_EVENT_READABLE, - wlr_libinput_handle_event, state); + wlr_libinput_readable, state); if (!state->input_event) { wlr_log(L_ERROR, "Failed to create input event on event loop"); return false; @@ -112,5 +107,7 @@ struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, state->udev = udev; state->display = display; + state->keyboards = list_create(); + return backend; } diff --git a/backend/libinput/events.c b/backend/libinput/events.c new file mode 100644 index 00000000..b4816928 --- /dev/null +++ b/backend/libinput/events.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include "backend/libinput/backend.h" +#include "common/log.h" +#include "types.h" + +static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *state) { + free(state); +} + +static struct wlr_keyboard_impl keyboard_impl = { + .destroy = wlr_libinput_keyboard_destroy +}; + +static struct wlr_keyboard *wlr_libinput_keyboard_create( + struct libinput_device *device) { + assert(device); + struct wlr_keyboard_state *kbstate = + calloc(1, sizeof(struct wlr_keyboard_state)); + kbstate->handle = device; + return wlr_keyboard_create(&keyboard_impl, kbstate); +} + +static void device_added(struct wlr_backend_state *state, + struct libinput_device *device) { + assert(state && device); + /* + * Note: the wlr API exposes only devices with a single capability, because + * that meshes better with how Wayland does things and is a bit simpler. + * However, libinput devices often have multiple capabilities - in such + * cases we have to create several devices. + */ + int vendor = libinput_device_get_id_vendor(device); + int product = libinput_device_get_id_product(device); + const char *name = libinput_device_get_name(device); + list_t *devices = list_create(); + wlr_log(L_DEBUG, "Added %s [%d:%d]", name, vendor, product); + + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) { + struct wlr_input_device *wlr_device = wlr_input_device_create( + WLR_INPUT_DEVICE_KEYBOARD, name, vendor, product); + wlr_device->keyboard = wlr_libinput_keyboard_create(device); + wl_signal_emit(&state->backend->events.input_add, wlr_device); + list_add(devices, wlr_device); + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { + // TODO + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { + // TODO + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_TOOL)) { + // TODO + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD)) { + // TODO + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_GESTURE)) { + // TODO + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_SWITCH)) { + // TODO + } + + if (devices->length > 0) { + libinput_device_set_user_data(device, devices); + } else { + list_free(devices); + } +} + +static void device_removed(struct wlr_backend_state *state, + struct libinput_device *device) { + wlr_log(L_DEBUG, "libinput device removed"); + // TODO +} + +void wlr_libinput_event(struct wlr_backend_state *state, + struct libinput_event *event) { + assert(state && event); + struct libinput *context = libinput_event_get_context(event); + struct libinput_device *device = libinput_event_get_device(event); + enum libinput_event_type event_type = libinput_event_get_type(event); + (void)context; + switch (event_type) { + case LIBINPUT_EVENT_DEVICE_ADDED: + device_added(state, device); + break; + case LIBINPUT_EVENT_DEVICE_REMOVED: + device_removed(state, device); + break; + default: + wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); + break; + } +} diff --git a/example/simple.c b/example/simple.c index 21f333c7..3206b3fa 100644 --- a/example/simple.c +++ b/example/simple.c @@ -13,16 +13,29 @@ struct state { float color[3]; int dec; struct timespec last_frame; + + struct wl_list keyboards; + struct wl_listener input_add; + struct wl_listener input_remove; + struct wl_listener output_add; struct wl_listener output_remove; struct wl_list outputs; }; struct output_state { - struct wl_list link; - struct wlr_output *output; struct state *state; + struct wlr_output *output; struct wl_listener frame; + struct wl_list link; +}; + +struct keyboard_state { + struct state *state; + struct wlr_input_device *device; + struct wl_listener key; + struct wl_listener mods; + struct wl_list link; }; void output_frame(struct wl_listener *listener, void *data) { @@ -84,41 +97,63 @@ void output_remove(struct wl_listener *listener, void *data) { wl_list_remove(&ostate->frame.link); } +void input_add(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + fprintf(stderr, "Keyboard '%s' (%d:%d) added\n", device->name, + device->vendor, device->product); + struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); + kbstate->device = device; + wl_list_init(&kbstate->key.link); + wl_list_init(&kbstate->mods.link); + wl_list_insert(&state->keyboards, &kbstate->link); +} + +void input_remove(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + struct keyboard_state *kbstate = NULL, *_kbstate; + wl_list_for_each(_kbstate, &state->keyboards, link) { + if (_kbstate->device == device) { + kbstate = kbstate; + break; + } + } + if (!kbstate) { + return; // We are unfamiliar with this keyboard + } + wl_list_remove(&kbstate->link); + //wl_list_remove(&kbstate->key.link); + //wl_list_remove(&kbstate->mods.link); +} + int timer_done(void *data) { *(bool *)data = true; return 1; } -int enable_outputs(void *data) { - struct state *state = data; - struct output_state *ostate; - wl_list_for_each(ostate, &state->outputs, link) { - struct wlr_output *output = ostate->output; - wlr_output_enable(output, true); - } - return 1; -} - -int disable_outputs(void *data) { - struct state *state = data; - struct output_state *ostate; - wl_list_for_each(ostate, &state->outputs, link) { - struct wlr_output *output = ostate->output; - wlr_output_enable(output, false); - } - return 1; -} - int main() { struct state state = { .color = { 1.0, 0.0, 0.0 }, .dec = 0, + .input_add = { .notify = input_add }, + .input_remove = { .notify = input_remove }, .output_add = { .notify = output_add }, .output_remove = { .notify = output_remove } }; + wl_list_init(&state.keyboards); + wl_list_init(&state.input_add.link); + wl_list_init(&state.input_remove.link); + wl_list_init(&state.outputs); - wl_list_init(&state.output_add.link); + wl_list_init(&state.output_remove.link); wl_list_init(&state.output_remove.link); clock_gettime(CLOCK_MONOTONIC, &state.last_frame); @@ -131,6 +166,8 @@ int main() { } struct wlr_backend *wlr = wlr_backend_autocreate(display, session); + wl_signal_add(&wlr->events.input_add, &state.input_add); + wl_signal_add(&wlr->events.input_remove, &state.input_remove); wl_signal_add(&wlr->events.output_add, &state.output_add); wl_signal_add(&wlr->events.output_remove, &state.output_remove); if (!wlr || !wlr_backend_init(wlr)) { @@ -140,14 +177,8 @@ int main() { bool done = false; struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, timer_done, &done); - struct wl_event_source *timer_disable_outputs = - wl_event_loop_add_timer(event_loop, disable_outputs, &state); - struct wl_event_source *timer_enable_outputs = - wl_event_loop_add_timer(event_loop, enable_outputs, &state); - wl_event_source_timer_update(timer, 20000); - wl_event_source_timer_update(timer_disable_outputs, 5000); - wl_event_source_timer_update(timer_enable_outputs, 10000); + wl_event_source_timer_update(timer, 10000); while (!done) { wl_event_loop_dispatch(event_loop, 0); diff --git a/include/backend/libinput/backend.h b/include/backend/libinput/backend.h index a23a45ac..6f2fa2a0 100644 --- a/include/backend/libinput/backend.h +++ b/include/backend/libinput/backend.h @@ -15,10 +15,14 @@ struct wlr_backend_state { struct libinput *libinput; struct wl_event_source *input_event; - list_t *devices; + list_t *keyboards; }; void wlr_libinput_event(struct wlr_backend_state *state, struct libinput_event *event); +struct wlr_keyboard_state { + struct libinput_device *handle; +}; + #endif diff --git a/include/types.h b/include/types.h index d2c8d008..564b24ec 100644 --- a/include/types.h +++ b/include/types.h @@ -18,4 +18,25 @@ struct wlr_output *wlr_output_create(struct wlr_output_impl *impl, struct wlr_output_state *state); void wlr_output_free(struct wlr_output *output); +struct wlr_keyboard_impl { + void (*destroy)(struct wlr_keyboard_state *state); +}; + +struct wlr_keyboard *wlr_keyboard_create(struct wlr_keyboard_impl *impl, + struct wlr_keyboard_state *state); +void wlr_keyboard_destroy(struct wlr_keyboard *keyboard); + +struct wlr_pointer_impl { + void (*destroy)(struct wlr_pointer_state *state); +}; + +struct wlr_pointer *wlr_pointer_create(struct wlr_pointer_impl *impl, + struct wlr_pointer_state *state); +void wlr_pointer_destroy(struct wlr_pointer *pointer); + +struct wlr_input_device *wlr_input_device_create( + enum wlr_input_device_type type, const char *name, + int vendor, int product); +void wlr_input_device_destroy(struct wlr_input_device *dev); + #endif diff --git a/include/wlr/backend.h b/include/wlr/backend.h index 32d96a8d..db85c169 100644 --- a/include/wlr/backend.h +++ b/include/wlr/backend.h @@ -12,14 +12,10 @@ struct wlr_backend { struct wlr_backend_state *state; struct { + struct wl_signal input_add; + struct wl_signal input_remove; struct wl_signal output_add; struct wl_signal output_remove; - struct wl_signal keyboard_add; - struct wl_signal keyboard_remove; - struct wl_signal pointer_add; - struct wl_signal pointer_remove; - struct wl_signal touch_add; - struct wl_signal touch_remove; } events; }; diff --git a/include/wlr/types.h b/include/wlr/types.h index 51ea45cf..a65b5d9c 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -50,4 +50,97 @@ void wlr_output_destroy(struct wlr_output *output); void wlr_output_effective_resolution(struct wlr_output *output, int *width, int *height); +// TODO: keymaps + +struct wlr_keyboard_state; +struct wlr_keyboard_impl; + +struct wlr_keyboard { + struct wlr_keyboard_state *state; + struct wlr_keyboard_impl *impl; + + struct { + struct wl_signal key; + struct wl_signal mods; + } events; +}; + +struct wlr_pointer_state; +struct wlr_pointer_impl; + +struct wlr_pointer { + struct wlr_pointer_state *state; + struct wlr_pointer_impl *impl; + + struct { + struct wl_signal motion; + struct wl_signal motion_absolute; + struct wl_signal button; + struct wl_signal axis; + } events; +}; + +struct wlr_pointer_motion { + double delta_x, delta_y; +}; + +struct wlr_pointer_motion_absolute { + double x_mm, y_mm; + double width_mm, height_mm; +}; + +enum wlr_button_state { + WLR_BUTTON_DEPRESSED, + WLR_BUTTON_RELEASED +}; + +struct wlr_pointer_button { + uint32_t button; + enum wlr_button_state state; +}; + +enum wlr_axis_source { + WLR_AXIS_SOURCE_WHEEL, + WLR_AXIS_SOURCE_FINGER, + WLR_AXIS_SOURCE_CONTINUOUS, + WLR_AXIS_SOURCE_WHEEL_TILT, +}; + +enum wlr_axis_orientation { + WLR_AXIS_ORIENTATION_VERTICAL, + WLR_AXIS_ORIENTATION_HORIZONTAL +}; + +struct wlr_pointer_axis { + enum wlr_axis_source source; + enum wlr_axis_orientation orientation; + double delta; +}; + +// TODO: touch +// TODO: tablet & tablet tool +// TODO: gestures +// TODO: switch + +enum wlr_input_device_type { + WLR_INPUT_DEVICE_KEYBOARD, + WLR_INPUT_DEVICE_POINTER, + WLR_INPUT_DEVICE_TOUCH, + WLR_INPUT_DEVICE_TABLET_PEN, + WLR_INPUT_DEVICE_TABLET_PAD, + WLR_INPUT_DEVICE_GESTURE, + WLR_INPUT_DEVICE_SWITCH, +}; + +struct wlr_input_device { + enum wlr_input_device_type type; + int vendor, product; + char *name; + union { + void *_device; + struct wlr_keyboard *keyboard; + struct wlr_pointer *pointer; + }; +}; + #endif diff --git a/types/CMakeLists.txt b/types/CMakeLists.txt index eba92cc0..5ac1baf6 100644 --- a/types/CMakeLists.txt +++ b/types/CMakeLists.txt @@ -5,6 +5,8 @@ include_directories( add_library(wlr-types wlr_output.c + wlr_keyboard.c + wlr_input_device.c ) target_link_libraries(wlr-types diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c new file mode 100644 index 00000000..7cbe2f7e --- /dev/null +++ b/types/wlr_input_device.c @@ -0,0 +1,24 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include "types.h" + +struct wlr_input_device *wlr_input_device_create( + enum wlr_input_device_type type, const char *name, + int vendor, int product) { + struct wlr_input_device *dev = calloc(1, sizeof(struct wlr_input_device)); + dev->type = type; + dev->name = strdup(name); + dev->vendor = vendor; + dev->product = product; + return dev; +} + +void wlr_input_device_destroy(struct wlr_input_device *dev) { + if (!dev) return; + free(dev->name); + free(dev); +} diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c new file mode 100644 index 00000000..d102311b --- /dev/null +++ b/types/wlr_keyboard.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include +#include "types.h" + +struct wlr_keyboard *wlr_keyboard_create(struct wlr_keyboard_impl *impl, + struct wlr_keyboard_state *state) { + struct wlr_keyboard *kb = calloc(1, sizeof(struct wlr_keyboard)); + kb->impl = impl; + kb->state = state; + wl_signal_init(&kb->events.key); + wl_signal_init(&kb->events.mods); + return kb; +} + +void wlr_keyboard_destroy(struct wlr_keyboard *kb) { + if (!kb) return; + kb->impl->destroy(kb->state); + free(kb); +} From 59ceaf507e9a7c80e04460d1ae4946ce7b6f56ac Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 17:52:11 -0400 Subject: [PATCH 05/25] Handle key presses --- backend/libinput/backend.c | 14 ++++++++-- backend/libinput/events.c | 56 +++++++++++++++++++++++++++++++++++--- example/simple.c | 9 ++++++ include/wlr/types.h | 26 ++++++++++++++++-- 4 files changed, 95 insertions(+), 10 deletions(-) diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index 3af08875..dc018b10 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -99,7 +99,12 @@ struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, struct wlr_backend *backend = wlr_backend_create(&backend_impl, state); if (!backend) { wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); - return NULL; + goto error_state; + } + + if (!(state->keyboards = list_create())) { + wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); + goto error_backend; } state->backend = backend; @@ -107,7 +112,10 @@ struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, state->udev = udev; state->display = display; - state->keyboards = list_create(); - return backend; +error_state: + free(state); +error_backend: + wlr_backend_destroy(backend); + return NULL; } diff --git a/backend/libinput/events.c b/backend/libinput/events.c index b4816928..c31632b5 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -8,6 +8,22 @@ #include "common/log.h" #include "types.h" +static struct wlr_input_device *get_appropriate_device( + enum wlr_input_device_type desired_type, + struct libinput_device *device) { + list_t *devices = libinput_device_get_user_data(device); + if (!devices) { + return NULL; + } + for (size_t i = 0; i < devices->length; ++i) { + struct wlr_input_device *dev = devices->items[i]; + if (dev->type == desired_type) { + return dev; + } + } + return NULL; +} + static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *state) { free(state); } @@ -22,10 +38,39 @@ static struct wlr_keyboard *wlr_libinput_keyboard_create( struct wlr_keyboard_state *kbstate = calloc(1, sizeof(struct wlr_keyboard_state)); kbstate->handle = device; + libinput_device_ref(device); return wlr_keyboard_create(&keyboard_impl, kbstate); } -static void device_added(struct wlr_backend_state *state, +static void handle_keyboard_key(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_KEYBOARD, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a keyboard event for a device with no keyboards?"); + return; + } + struct libinput_event_keyboard *kbevent = + libinput_event_get_keyboard_event(event); + struct wlr_keyboard_key *wlr_event = + calloc(1, sizeof(struct wlr_keyboard_key)); + wlr_event->time_sec = libinput_event_keyboard_get_time(kbevent); + wlr_event->time_usec = libinput_event_keyboard_get_time_usec(kbevent); + wlr_event->keycode = libinput_event_keyboard_get_key(kbevent); + enum libinput_key_state state = + libinput_event_keyboard_get_key_state(kbevent); + switch (state) { + case LIBINPUT_KEY_STATE_RELEASED: + wlr_event->state = WLR_KEY_RELEASED; + break; + case LIBINPUT_KEY_STATE_PRESSED: + wlr_event->state = WLR_KEY_PRESSED; + break; + } + wl_signal_emit(&dev->keyboard->events.key, wlr_event); +} + +static void handle_device_added(struct wlr_backend_state *state, struct libinput_device *device) { assert(state && device); /* @@ -73,7 +118,7 @@ static void device_added(struct wlr_backend_state *state, } } -static void device_removed(struct wlr_backend_state *state, +static void handle_device_removed(struct wlr_backend_state *state, struct libinput_device *device) { wlr_log(L_DEBUG, "libinput device removed"); // TODO @@ -88,10 +133,13 @@ void wlr_libinput_event(struct wlr_backend_state *state, (void)context; switch (event_type) { case LIBINPUT_EVENT_DEVICE_ADDED: - device_added(state, device); + handle_device_added(state, device); break; case LIBINPUT_EVENT_DEVICE_REMOVED: - device_removed(state, device); + handle_device_removed(state, device); + break; + case LIBINPUT_EVENT_KEYBOARD_KEY: + handle_keyboard_key(event, device); break; default: wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); diff --git a/example/simple.c b/example/simple.c index 3206b3fa..660c56a6 100644 --- a/example/simple.c +++ b/example/simple.c @@ -97,6 +97,13 @@ void output_remove(struct wl_listener *listener, void *data) { wl_list_remove(&ostate->frame.link); } +static void keyboard_key(struct wl_listener *listener, void *data) { + struct wlr_keyboard_key *event = data; + struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); + fprintf(stderr, "Key event: %u %s\n", event->keycode, + event->state == WLR_KEY_PRESSED ? "pressed" : "released"); +} + void input_add(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; struct state *state = wl_container_of(listener, state, input_add); @@ -109,6 +116,8 @@ void input_add(struct wl_listener *listener, void *data) { kbstate->device = device; wl_list_init(&kbstate->key.link); wl_list_init(&kbstate->mods.link); + kbstate->key.notify = keyboard_key; + wl_signal_add(&device->keyboard->events.key, &kbstate->key); wl_list_insert(&state->keyboards, &kbstate->link); } diff --git a/include/wlr/types.h b/include/wlr/types.h index a65b5d9c..e2f3075f 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -65,6 +65,18 @@ struct wlr_keyboard { } events; }; +enum wlr_key_state { + WLR_KEY_RELEASED, + WLR_KEY_PRESSED, +}; + +struct wlr_keyboard_key { + uint32_t time_sec; + uint64_t time_usec; + uint32_t keycode; + enum wlr_key_state state; +}; + struct wlr_pointer_state; struct wlr_pointer_impl; @@ -81,20 +93,26 @@ struct wlr_pointer { }; struct wlr_pointer_motion { + uint32_t time_sec; + uint64_t time_usec; double delta_x, delta_y; }; struct wlr_pointer_motion_absolute { + uint32_t time_sec; + uint64_t time_usec; double x_mm, y_mm; double width_mm, height_mm; }; enum wlr_button_state { - WLR_BUTTON_DEPRESSED, - WLR_BUTTON_RELEASED + WLR_BUTTON_RELEASED, + WLR_BUTTON_PRESSED, }; struct wlr_pointer_button { + uint32_t time_sec; + uint64_t time_usec; uint32_t button; enum wlr_button_state state; }; @@ -108,10 +126,12 @@ enum wlr_axis_source { enum wlr_axis_orientation { WLR_AXIS_ORIENTATION_VERTICAL, - WLR_AXIS_ORIENTATION_HORIZONTAL + WLR_AXIS_ORIENTATION_HORIZONTAL, }; struct wlr_pointer_axis { + uint32_t time_sec; + uint64_t time_usec; enum wlr_axis_source source; enum wlr_axis_orientation orientation; double delta; From 12612572ef9af9686e24bb9af81c31c82bb1f765 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 9 Jun 2017 17:54:40 -0400 Subject: [PATCH 06/25] Exit sample on key press --- example/simple.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/example/simple.c b/example/simple.c index 660c56a6..c9561a7c 100644 --- a/example/simple.c +++ b/example/simple.c @@ -12,6 +12,7 @@ struct state { float color[3]; int dec; + bool exit; struct timespec last_frame; struct wl_list keyboards; @@ -102,6 +103,7 @@ static void keyboard_key(struct wl_listener *listener, void *data) { struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); fprintf(stderr, "Key event: %u %s\n", event->keycode, event->state == WLR_KEY_PRESSED ? "pressed" : "released"); + kbstate->state->exit = true; } void input_add(struct wl_listener *listener, void *data) { @@ -110,10 +112,9 @@ void input_add(struct wl_listener *listener, void *data) { if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { return; } - fprintf(stderr, "Keyboard '%s' (%d:%d) added\n", device->name, - device->vendor, device->product); struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); kbstate->device = device; + kbstate->state = state; wl_list_init(&kbstate->key.link); wl_list_init(&kbstate->mods.link); kbstate->key.notify = keyboard_key; @@ -138,19 +139,15 @@ void input_remove(struct wl_listener *listener, void *data) { return; // We are unfamiliar with this keyboard } wl_list_remove(&kbstate->link); - //wl_list_remove(&kbstate->key.link); + wl_list_remove(&kbstate->key.link); //wl_list_remove(&kbstate->mods.link); } -int timer_done(void *data) { - *(bool *)data = true; - return 1; -} - int main() { struct state state = { .color = { 1.0, 0.0, 0.0 }, .dec = 0, + .exit = false, .input_add = { .notify = input_add }, .input_remove = { .notify = input_remove }, .output_add = { .notify = output_add }, @@ -183,17 +180,10 @@ int main() { return 1; } - bool done = false; - struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, - timer_done, &done); - - wl_event_source_timer_update(timer, 10000); - - while (!done) { + while (!state.exit) { wl_event_loop_dispatch(event_loop, 0); } - wl_event_source_remove(timer); wlr_backend_destroy(wlr); wl_display_destroy(display); } From f479b7c8c7aa93229c46287f774a30ac8324da1e Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 10 Jun 2017 11:58:25 -0400 Subject: [PATCH 07/25] Split keyboard code out into its own file --- backend/CMakeLists.txt | 1 + backend/libinput/backend.c | 2 +- backend/libinput/events.c | 50 +---------------- backend/libinput/keyboard.c | 56 +++++++++++++++++++ .../{libinput/backend.h => libinput.h} | 10 ++++ 5 files changed, 70 insertions(+), 49 deletions(-) create mode 100644 backend/libinput/keyboard.c rename include/backend/{libinput/backend.h => libinput.h} (65%) diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index e22032c3..5505e417 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -16,6 +16,7 @@ add_library(wlr-backend libinput/backend.c libinput/events.c + libinput/keyboard.c backend.c egl.c diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index dc018b10..9b0a6d8c 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -4,7 +4,7 @@ #include #include #include "backend/udev.h" -#include "backend/libinput/backend.h" +#include "backend/libinput.h" #include "common/log.h" static int wlr_libinput_open_restricted(const char *path, diff --git a/backend/libinput/events.c b/backend/libinput/events.c index c31632b5..3c623de4 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -4,11 +4,11 @@ #include #include #include -#include "backend/libinput/backend.h" +#include "backend/libinput.h" #include "common/log.h" #include "types.h" -static struct wlr_input_device *get_appropriate_device( +struct wlr_input_device *get_appropriate_device( enum wlr_input_device_type desired_type, struct libinput_device *device) { list_t *devices = libinput_device_get_user_data(device); @@ -24,52 +24,6 @@ static struct wlr_input_device *get_appropriate_device( return NULL; } -static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *state) { - free(state); -} - -static struct wlr_keyboard_impl keyboard_impl = { - .destroy = wlr_libinput_keyboard_destroy -}; - -static struct wlr_keyboard *wlr_libinput_keyboard_create( - struct libinput_device *device) { - assert(device); - struct wlr_keyboard_state *kbstate = - calloc(1, sizeof(struct wlr_keyboard_state)); - kbstate->handle = device; - libinput_device_ref(device); - return wlr_keyboard_create(&keyboard_impl, kbstate); -} - -static void handle_keyboard_key(struct libinput_event *event, - struct libinput_device *device) { - struct wlr_input_device *dev = - get_appropriate_device(WLR_INPUT_DEVICE_KEYBOARD, device); - if (!dev) { - wlr_log(L_DEBUG, "Got a keyboard event for a device with no keyboards?"); - return; - } - struct libinput_event_keyboard *kbevent = - libinput_event_get_keyboard_event(event); - struct wlr_keyboard_key *wlr_event = - calloc(1, sizeof(struct wlr_keyboard_key)); - wlr_event->time_sec = libinput_event_keyboard_get_time(kbevent); - wlr_event->time_usec = libinput_event_keyboard_get_time_usec(kbevent); - wlr_event->keycode = libinput_event_keyboard_get_key(kbevent); - enum libinput_key_state state = - libinput_event_keyboard_get_key_state(kbevent); - switch (state) { - case LIBINPUT_KEY_STATE_RELEASED: - wlr_event->state = WLR_KEY_RELEASED; - break; - case LIBINPUT_KEY_STATE_PRESSED: - wlr_event->state = WLR_KEY_PRESSED; - break; - } - wl_signal_emit(&dev->keyboard->events.key, wlr_event); -} - static void handle_device_added(struct wlr_backend_state *state, struct libinput_device *device) { assert(state && device); diff --git a/backend/libinput/keyboard.c b/backend/libinput/keyboard.c new file mode 100644 index 00000000..afae960e --- /dev/null +++ b/backend/libinput/keyboard.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include "backend/libinput.h" +#include "common/log.h" +#include "types.h" + +static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *state) { + libinput_device_unref(state->handle); + free(state); +} + +static struct wlr_keyboard_impl keyboard_impl = { + .destroy = wlr_libinput_keyboard_destroy +}; + +struct wlr_keyboard *wlr_libinput_keyboard_create( + struct libinput_device *device) { + assert(device); + struct wlr_keyboard_state *kbstate = + calloc(1, sizeof(struct wlr_keyboard_state)); + kbstate->handle = device; + libinput_device_ref(device); + return wlr_keyboard_create(&keyboard_impl, kbstate); +} + +void handle_keyboard_key(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_KEYBOARD, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a keyboard event for a device with no keyboards?"); + return; + } + struct libinput_event_keyboard *kbevent = + libinput_event_get_keyboard_event(event); + struct wlr_keyboard_key *wlr_event = + calloc(1, sizeof(struct wlr_keyboard_key)); + wlr_event->time_sec = libinput_event_keyboard_get_time(kbevent); + wlr_event->time_usec = libinput_event_keyboard_get_time_usec(kbevent); + wlr_event->keycode = libinput_event_keyboard_get_key(kbevent); + enum libinput_key_state state = + libinput_event_keyboard_get_key_state(kbevent); + switch (state) { + case LIBINPUT_KEY_STATE_RELEASED: + wlr_event->state = WLR_KEY_RELEASED; + break; + case LIBINPUT_KEY_STATE_PRESSED: + wlr_event->state = WLR_KEY_PRESSED; + break; + } + wl_signal_emit(&dev->keyboard->events.key, wlr_event); +} diff --git a/include/backend/libinput/backend.h b/include/backend/libinput.h similarity index 65% rename from include/backend/libinput/backend.h rename to include/backend/libinput.h index 6f2fa2a0..a59ab401 100644 --- a/include/backend/libinput/backend.h +++ b/include/backend/libinput.h @@ -5,6 +5,7 @@ #include #include #include "backend/udev.h" +#include "types.h" struct wlr_backend_state { struct wlr_backend *backend; @@ -21,8 +22,17 @@ struct wlr_backend_state { void wlr_libinput_event(struct wlr_backend_state *state, struct libinput_event *event); +struct wlr_input_device *get_appropriate_device( + enum wlr_input_device_type desired_type, + struct libinput_device *device); + struct wlr_keyboard_state { struct libinput_device *handle; }; +void handle_keyboard_key(struct libinput_event *event, + struct libinput_device *device); +struct wlr_keyboard *wlr_libinput_keyboard_create( + struct libinput_device *device); + #endif From 7a5f35b5bb2a30e46defe9ea1bd610cb06df95e8 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 10 Jun 2017 12:21:54 -0400 Subject: [PATCH 08/25] Reassign ownership of libinput handle --- backend/backend.c | 6 ++++++ backend/libinput/events.c | 15 ++++++++++++++- backend/libinput/keyboard.c | 15 +-------------- include/backend/libinput.h | 8 ++++---- include/types.h | 10 ++++++++-- include/wlr/backend/libinput.h | 3 +++ include/wlr/types.h | 7 +++++++ types/wlr_input_device.c | 23 +++++++++++++++++++++-- 8 files changed, 64 insertions(+), 23 deletions(-) diff --git a/backend/backend.c b/backend/backend.c index 83249a8c..03c662c3 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -3,10 +3,12 @@ #include #include #include +#include #include #include #include #include +#include "backend/libinput.h" #include "backend/udev.h" #include "common/log.h" @@ -64,3 +66,7 @@ error_udev: error: return NULL; } + +struct libinput_device *wlr_libinput_get_device_handle(struct wlr_input_device *dev) { + return dev->state->handle; +} diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 3c623de4..60a2fd5e 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -24,6 +24,15 @@ struct wlr_input_device *get_appropriate_device( return NULL; } +static void wlr_libinput_device_destroy(struct wlr_input_device_state *state) { + libinput_device_unref(state->handle); + free(state); +} + +static struct wlr_input_device_impl input_device_impl = { + .destroy = wlr_libinput_device_destroy +}; + static void handle_device_added(struct wlr_backend_state *state, struct libinput_device *device) { assert(state && device); @@ -38,10 +47,13 @@ static void handle_device_added(struct wlr_backend_state *state, const char *name = libinput_device_get_name(device); list_t *devices = list_create(); wlr_log(L_DEBUG, "Added %s [%d:%d]", name, vendor, product); + struct wlr_input_device_state *devstate = + calloc(1, sizeof(struct wlr_input_device_state)); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) { struct wlr_input_device *wlr_device = wlr_input_device_create( - WLR_INPUT_DEVICE_KEYBOARD, name, vendor, product); + WLR_INPUT_DEVICE_KEYBOARD, &input_device_impl, devstate, + name, vendor, product); wlr_device->keyboard = wlr_libinput_keyboard_create(device); wl_signal_emit(&state->backend->events.input_add, wlr_device); list_add(devices, wlr_device); @@ -68,6 +80,7 @@ static void handle_device_added(struct wlr_backend_state *state, if (devices->length > 0) { libinput_device_set_user_data(device, devices); } else { + wlr_libinput_device_destroy(devstate); list_free(devices); } } diff --git a/backend/libinput/keyboard.c b/backend/libinput/keyboard.c index afae960e..158ded28 100644 --- a/backend/libinput/keyboard.c +++ b/backend/libinput/keyboard.c @@ -8,23 +8,10 @@ #include "common/log.h" #include "types.h" -static void wlr_libinput_keyboard_destroy(struct wlr_keyboard_state *state) { - libinput_device_unref(state->handle); - free(state); -} - -static struct wlr_keyboard_impl keyboard_impl = { - .destroy = wlr_libinput_keyboard_destroy -}; - struct wlr_keyboard *wlr_libinput_keyboard_create( struct libinput_device *device) { assert(device); - struct wlr_keyboard_state *kbstate = - calloc(1, sizeof(struct wlr_keyboard_state)); - kbstate->handle = device; - libinput_device_ref(device); - return wlr_keyboard_create(&keyboard_impl, kbstate); + return wlr_keyboard_create(NULL, NULL); } void handle_keyboard_key(struct libinput_event *event, diff --git a/include/backend/libinput.h b/include/backend/libinput.h index a59ab401..f6622695 100644 --- a/include/backend/libinput.h +++ b/include/backend/libinput.h @@ -19,6 +19,10 @@ struct wlr_backend_state { list_t *keyboards; }; +struct wlr_input_device_state { + struct libinput_device *handle; +}; + void wlr_libinput_event(struct wlr_backend_state *state, struct libinput_event *event); @@ -26,10 +30,6 @@ struct wlr_input_device *get_appropriate_device( enum wlr_input_device_type desired_type, struct libinput_device *device); -struct wlr_keyboard_state { - struct libinput_device *handle; -}; - void handle_keyboard_key(struct libinput_event *event, struct libinput_device *device); struct wlr_keyboard *wlr_libinput_keyboard_create( diff --git a/include/types.h b/include/types.h index 564b24ec..20f5ed13 100644 --- a/include/types.h +++ b/include/types.h @@ -34,9 +34,15 @@ struct wlr_pointer *wlr_pointer_create(struct wlr_pointer_impl *impl, struct wlr_pointer_state *state); void wlr_pointer_destroy(struct wlr_pointer *pointer); +struct wlr_input_device_impl { + void (*destroy)(struct wlr_input_device_state *state); +}; + struct wlr_input_device *wlr_input_device_create( - enum wlr_input_device_type type, const char *name, - int vendor, int product); + enum wlr_input_device_type type, + struct wlr_input_device_impl *impl, + struct wlr_input_device_state *state, + const char *name, int vendor, int product); void wlr_input_device_destroy(struct wlr_input_device *dev); #endif diff --git a/include/wlr/backend/libinput.h b/include/wlr/backend/libinput.h index 1e8c3555..7108f42c 100644 --- a/include/wlr/backend/libinput.h +++ b/include/wlr/backend/libinput.h @@ -1,12 +1,15 @@ #ifndef WLR_BACKEND_LIBINPUT_H #define WLR_BACKEND_LIBINPUT_H +#include #include #include #include #include +#include struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, struct wlr_session *session, struct wlr_udev *udev); +struct libinput_device *wlr_libinput_get_device_handle(struct wlr_input_device *dev); #endif diff --git a/include/wlr/types.h b/include/wlr/types.h index e2f3075f..389989e8 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -152,10 +152,17 @@ enum wlr_input_device_type { WLR_INPUT_DEVICE_SWITCH, }; +struct wlr_input_device_state; +struct wlr_input_device_impl; + struct wlr_input_device { + struct wlr_input_device_state *state; + struct wlr_input_device_impl *impl; + enum wlr_input_device_type type; int vendor, product; char *name; + union { void *_device; struct wlr_keyboard *keyboard; diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c index 7cbe2f7e..dbb25487 100644 --- a/types/wlr_input_device.c +++ b/types/wlr_input_device.c @@ -4,13 +4,18 @@ #include #include #include +#include "common/log.h" #include "types.h" struct wlr_input_device *wlr_input_device_create( - enum wlr_input_device_type type, const char *name, - int vendor, int product) { + enum wlr_input_device_type type, + struct wlr_input_device_impl *impl, + struct wlr_input_device_state *state, + const char *name, int vendor, int product) { struct wlr_input_device *dev = calloc(1, sizeof(struct wlr_input_device)); dev->type = type; + dev->impl = impl; + dev->state = state; dev->name = strdup(name); dev->vendor = vendor; dev->product = product; @@ -19,6 +24,20 @@ struct wlr_input_device *wlr_input_device_create( void wlr_input_device_destroy(struct wlr_input_device *dev) { if (!dev) return; + if (dev->impl && dev->impl->destroy && dev->state) { + dev->impl->destroy(dev->state); + } + if (dev->_device) { + switch (dev->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + wlr_keyboard_destroy(dev->keyboard); + break; + default: + wlr_log(L_DEBUG, "Warning: leaking memory %p %p %d", + dev->_device, dev, dev->type); + break; + } + } free(dev->name); free(dev); } From 508d135de78a483feb947ee4cc5e979743bd7317 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 10 Jun 2017 12:24:35 -0400 Subject: [PATCH 09/25] Only allocate device state when it will be used This design also avoids double frees in the future when we're creating several wlr_input_devices from one libinput_device. --- backend/libinput/events.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 60a2fd5e..2ce368e3 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -47,10 +47,12 @@ static void handle_device_added(struct wlr_backend_state *state, const char *name = libinput_device_get_name(device); list_t *devices = list_create(); wlr_log(L_DEBUG, "Added %s [%d:%d]", name, vendor, product); - struct wlr_input_device_state *devstate = - calloc(1, sizeof(struct wlr_input_device_state)); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) { + struct wlr_input_device_state *devstate = + calloc(1, sizeof(struct wlr_input_device_state)); + devstate->handle = device; + libinput_device_ref(device); struct wlr_input_device *wlr_device = wlr_input_device_create( WLR_INPUT_DEVICE_KEYBOARD, &input_device_impl, devstate, name, vendor, product); @@ -80,7 +82,6 @@ static void handle_device_added(struct wlr_backend_state *state, if (devices->length > 0) { libinput_device_set_user_data(device, devices); } else { - wlr_libinput_device_destroy(devstate); list_free(devices); } } From c385a7f8afb765c510cad03d396198c76e318ca0 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 12 Jun 2017 01:26:44 -0400 Subject: [PATCH 10/25] -g is added by default --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fbd63e05..ae1dc9a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,9 +2,6 @@ cmake_minimum_required(VERSION 3.1.0) project(wlroots C) -if (CMAKE_BUILD_TYPE EQUAL "Debug") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") -endif() set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) From 5dd96c077238b314162570655ea970ba6c2f8693 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 12 Jun 2017 21:53:41 -0400 Subject: [PATCH 11/25] Incorporate XKBCommon into example --- CMake/FindXKBCommon.cmake | 19 +++++++++++ CMakeLists.txt | 1 + backend/libinput/keyboard.c | 1 + example/CMakeLists.txt | 3 ++ example/simple.c | 64 +++++++++++++++++++++++++++++++++---- include/wlr/types.h | 3 -- types/wlr_keyboard.c | 1 - 7 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 CMake/FindXKBCommon.cmake diff --git a/CMake/FindXKBCommon.cmake b/CMake/FindXKBCommon.cmake new file mode 100644 index 00000000..30ac503a --- /dev/null +++ b/CMake/FindXKBCommon.cmake @@ -0,0 +1,19 @@ +# - Find XKBCommon +# Once done, this will define +# +# XKBCOMMON_FOUND - System has XKBCommon +# XKBCOMMON_INCLUDE_DIRS - The XKBCommon include directories +# XKBCOMMON_LIBRARIES - The libraries needed to use XKBCommon +# XKBCOMMON_DEFINITIONS - Compiler switches required for using XKBCommon + +find_package(PkgConfig) +pkg_check_modules(PC_XKBCOMMON QUIET xkbcommon) +find_path(XKBCOMMON_INCLUDE_DIRS NAMES xkbcommon/xkbcommon.h HINTS ${PC_XKBCOMMON_INCLUDE_DIRS}) +find_library(XKBCOMMON_LIBRARIES NAMES xkbcommon HINTS ${PC_XKBCOMMON_LIBRARY_DIRS}) + +set(XKBCOMMON_DEFINITIONS ${PC_XKBCOMMON_CFLAGS_OTHER}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(XKBCOMMON DEFAULT_MSG XKBCOMMON_LIBRARIES XKBCOMMON_INCLUDE_DIRS) +mark_as_advanced(XKBCOMMON_LIBRARIES XKBCOMMON_INCLUDE_DIRS) + diff --git a/CMakeLists.txt b/CMakeLists.txt index ae1dc9a1..353e96fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ find_package(GLESv2 REQUIRED) find_package(DRM REQUIRED) find_package(GBM REQUIRED) find_package(LibInput REQUIRED) +find_package(XKBCommon REQUIRED) find_package(Udev REQUIRED) find_package(Systemd) diff --git a/backend/libinput/keyboard.c b/backend/libinput/keyboard.c index 158ded28..9ad41a78 100644 --- a/backend/libinput/keyboard.c +++ b/backend/libinput/keyboard.c @@ -11,6 +11,7 @@ struct wlr_keyboard *wlr_libinput_keyboard_create( struct libinput_device *device) { assert(device); + libinput_device_led_update(device, 0); return wlr_keyboard_create(NULL, NULL); } diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index e8f7ec72..bf9efd64 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,6 +1,7 @@ include_directories( ${DRM_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} + ${XKBCOMMON_INCLUDE_DIRS} ) add_executable(simple @@ -10,6 +11,7 @@ add_executable(simple target_link_libraries(simple wlr-backend wlr-session + ${XKBCOMMON_LIBRARIES} ) add_executable(rotation @@ -21,4 +23,5 @@ target_link_libraries(rotation wlr-backend wlr-session wlr-render + ${XKBCOMMON_LIBRARIES} ) diff --git a/example/simple.c b/example/simple.c index c9561a7c..89f74330 100644 --- a/example/simple.c +++ b/example/simple.c @@ -1,4 +1,5 @@ #define _POSIX_C_SOURCE 199309L +#include #include #include #include @@ -8,12 +9,15 @@ #include #include #include +#include struct state { float color[3]; int dec; bool exit; struct timespec last_frame; + struct xkb_keymap *keymap; + struct xkb_state *xkb_state; struct wl_list keyboards; struct wl_listener input_add; @@ -35,7 +39,6 @@ struct keyboard_state { struct state *state; struct wlr_input_device *device; struct wl_listener key; - struct wl_listener mods; struct wl_list link; }; @@ -98,12 +101,30 @@ void output_remove(struct wl_listener *listener, void *data) { wl_list_remove(&ostate->frame.link); } +static void handle_keysym(struct state *state, xkb_keysym_t sym, + enum wlr_key_state key_state) { + char name[64]; + int l = xkb_keysym_get_name(sym, name, sizeof(name)); + if (l != -1 && l != sizeof(name)) { + fprintf(stderr, "Key event: %s %s\n", name, + key_state == WLR_KEY_PRESSED ? "pressed" : "released"); + } + if (sym == XKB_KEY_Escape) { + state->exit = true; + } +} + static void keyboard_key(struct wl_listener *listener, void *data) { struct wlr_keyboard_key *event = data; struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); - fprintf(stderr, "Key event: %u %s\n", event->keycode, - event->state == WLR_KEY_PRESSED ? "pressed" : "released"); - kbstate->state->exit = true; + uint32_t keycode = event->keycode + 8; + const xkb_keysym_t *syms; + int nsyms = xkb_state_key_get_syms(kbstate->state->xkb_state, keycode, &syms); + for (int i = 0; i < nsyms; ++i) { + handle_keysym(kbstate->state, syms[i], event->state); + } + xkb_state_update_key(kbstate->state->xkb_state, keycode, + event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); } void input_add(struct wl_listener *listener, void *data) { @@ -116,7 +137,6 @@ void input_add(struct wl_listener *listener, void *data) { kbstate->device = device; kbstate->state = state; wl_list_init(&kbstate->key.link); - wl_list_init(&kbstate->mods.link); kbstate->key.notify = keyboard_key; wl_signal_add(&device->keyboard->events.key, &kbstate->key); wl_list_insert(&state->keyboards, &kbstate->link); @@ -140,7 +160,12 @@ void input_remove(struct wl_listener *listener, void *data) { } wl_list_remove(&kbstate->link); wl_list_remove(&kbstate->key.link); - //wl_list_remove(&kbstate->mods.link); +} + +static int timer_done(void *data) { + struct state *state = data; + state->exit = true; + return 1; } int main() { @@ -151,9 +176,30 @@ int main() { .input_add = { .notify = input_add }, .input_remove = { .notify = input_remove }, .output_add = { .notify = output_add }, - .output_remove = { .notify = output_remove } + .output_remove = { .notify = output_remove }, }; + struct xkb_rule_names rules; + memset(&rules, 0, sizeof(rules)); + rules.rules = getenv("XKB_DEFAULT_RULES"); + rules.model = getenv("XKB_DEFAULT_MODEL"); + rules.layout = getenv("XKB_DEFAULT_LAYOUT"); + rules.variant = getenv("XKB_DEFAULT_VARIANT"); + rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if (!context) { + fprintf(stderr, "Failed to create XKB context\n"); + return 1; + } + state.keymap = + xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + if (!state.keymap) { + fprintf(stderr, "Failed to create XKB keymap\n"); + return 1; + } + xkb_context_unref(context); + state.xkb_state = xkb_state_new(state.keymap); + wl_list_init(&state.keyboards); wl_list_init(&state.input_add.link); wl_list_init(&state.input_remove.link); @@ -179,6 +225,10 @@ int main() { if (!wlr || !wlr_backend_init(wlr)) { return 1; } + struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, + timer_done, &state); + + wl_event_source_timer_update(timer, 30000); while (!state.exit) { wl_event_loop_dispatch(event_loop, 0); diff --git a/include/wlr/types.h b/include/wlr/types.h index 389989e8..af23152c 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -50,8 +50,6 @@ void wlr_output_destroy(struct wlr_output *output); void wlr_output_effective_resolution(struct wlr_output *output, int *width, int *height); -// TODO: keymaps - struct wlr_keyboard_state; struct wlr_keyboard_impl; @@ -61,7 +59,6 @@ struct wlr_keyboard { struct { struct wl_signal key; - struct wl_signal mods; } events; }; diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c index d102311b..db4f7ca7 100644 --- a/types/wlr_keyboard.c +++ b/types/wlr_keyboard.c @@ -11,7 +11,6 @@ struct wlr_keyboard *wlr_keyboard_create(struct wlr_keyboard_impl *impl, kb->impl = impl; kb->state = state; wl_signal_init(&kb->events.key); - wl_signal_init(&kb->events.mods); return kb; } From e257afeb7ea72a035202be02c90490eb3cb7129b Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 12 Jun 2017 22:22:40 -0400 Subject: [PATCH 12/25] Establish multi backend support --- backend/CMakeLists.txt | 1 + backend/backend.c | 26 +++++++-- backend/multi/backend.c | 107 ++++++++++++++++++++++++++++++++++++ include/backend/multi.h | 13 +++++ include/wlr/backend/multi.h | 10 ++++ 5 files changed, 151 insertions(+), 6 deletions(-) create mode 100644 backend/multi/backend.c create mode 100644 include/backend/multi.h create mode 100644 include/wlr/backend/multi.h diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 5505e417..23914240 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(wlr-backend libinput/events.c libinput/keyboard.c + multi/backend.c backend.c egl.c udev.c diff --git a/backend/backend.c b/backend/backend.c index 03c662c3..02fd7479 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "backend/libinput.h" #include "backend/udev.h" #include "common/log.h" @@ -46,19 +47,32 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, wlr_log(L_ERROR, "Failed to start udev"); goto error; } - struct wlr_backend *wlr; - wlr = wlr_libinput_backend_create(display, session, udev); - return wlr; int gpu = wlr_udev_find_gpu(udev, session); if (gpu == -1) { wlr_log(L_ERROR, "Failed to open DRM device"); goto error_udev; } - wlr = wlr_drm_backend_create(display, session, udev, gpu); - if (!wlr) { + struct wlr_backend *multi = wlr_multi_backend_create(); + if (!multi) { goto error_gpu; } - return wlr; + struct wlr_backend *libinput = + wlr_libinput_backend_create(display, session, udev); + if (!libinput) { + goto error_multi; + } + struct wlr_backend *drm = + wlr_drm_backend_create(display, session, udev, gpu); + if (!drm) { + goto error_libinput; + } + wlr_multi_backend_add(multi, libinput); + wlr_multi_backend_add(multi, drm); + return multi; +error_libinput: + wlr_backend_destroy(libinput); +error_multi: + wlr_backend_destroy(multi); error_gpu: close(gpu); error_udev: diff --git a/backend/multi/backend.c b/backend/multi/backend.c new file mode 100644 index 00000000..e3d87ccc --- /dev/null +++ b/backend/multi/backend.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include "backend/multi.h" +#include "common/log.h" + +struct subbackend_state { + struct wlr_backend *backend; + struct wlr_backend *container; + struct wl_listener input_add; + struct wl_listener input_remove; + struct wl_listener output_add; + struct wl_listener output_remove; +}; + +static bool multi_backend_init(struct wlr_backend_state *state) { + for (size_t i = 0; i < state->backends->length; ++i) { + struct subbackend_state *sub = state->backends->items[i]; + if (!wlr_backend_init(sub->backend)) { + wlr_log(L_ERROR, "Failed to initialize backend %zd", i); + return false; + } + } + return true; +} + +static void multi_backend_destroy(struct wlr_backend_state *state) { + for (size_t i = 0; i < state->backends->length; ++i) { + struct subbackend_state *sub = state->backends->items[i]; + wlr_backend_destroy(sub->backend); + free(sub); + } + list_free(state->backends); + free(state); +} + +struct wlr_backend_impl backend_impl = { + .init = multi_backend_init, + .destroy = multi_backend_destroy +}; + +struct wlr_backend *wlr_multi_backend_create() { + struct wlr_backend_state *state = + calloc(1, sizeof(struct wlr_backend_state)); + if (!state) { + wlr_log(L_ERROR, "Backend allocation failed"); + return NULL; + } + state->backends = list_create(); + if (!state->backends) { + free(state); + wlr_log(L_ERROR, "Backend allocation failed"); + return NULL; + } + struct wlr_backend *backend = wlr_backend_create(&backend_impl, state); + state->backend = backend; + return backend; +} + +static void input_add_reemit(struct wl_listener *listener, void *data) { + struct subbackend_state *state = wl_container_of(listener, + state, input_add); + wl_signal_emit(&state->container->events.input_add, data); +} + +static void input_remove_reemit(struct wl_listener *listener, void *data) { + struct subbackend_state *state = wl_container_of(listener, + state, input_remove); + wl_signal_emit(&state->container->events.input_remove, data); +} + +static void output_add_reemit(struct wl_listener *listener, void *data) { + struct subbackend_state *state = wl_container_of(listener, + state, output_add); + wl_signal_emit(&state->container->events.output_add, data); +} + +static void output_remove_reemit(struct wl_listener *listener, void *data) { + struct subbackend_state *state = wl_container_of(listener, + state, output_remove); + wl_signal_emit(&state->container->events.output_remove, data); +} + +void wlr_multi_backend_add(struct wlr_backend *multi, + struct wlr_backend *backend) { + struct subbackend_state *sub = calloc(1, sizeof(struct subbackend_state)); + sub->backend = backend; + sub->container = multi; + + sub->input_add.notify = input_add_reemit; + sub->input_remove.notify = input_remove_reemit; + sub->output_add.notify = output_add_reemit; + sub->output_remove.notify = output_remove_reemit; + + wl_list_init(&sub->input_add.link); + wl_list_init(&sub->input_remove.link); + wl_list_init(&sub->output_add.link); + wl_list_init(&sub->output_remove.link); + + wl_signal_add(&backend->events.input_add, &sub->input_add); + wl_signal_add(&backend->events.input_remove, &sub->input_remove); + wl_signal_add(&backend->events.output_add, &sub->output_add); + wl_signal_add(&backend->events.output_remove, &sub->output_remove); + + list_add(multi->state->backends, sub); +} diff --git a/include/backend/multi.h b/include/backend/multi.h new file mode 100644 index 00000000..5e6930bb --- /dev/null +++ b/include/backend/multi.h @@ -0,0 +1,13 @@ +#ifndef _WLR_MULTI_BACKEND_INTERNAL +#define _WLR_MULTI_BACKEND_INTERNAL + +#include +#include +#include + +struct wlr_backend_state { + struct wlr_backend *backend; + list_t *backends; +}; + +#endif diff --git a/include/wlr/backend/multi.h b/include/wlr/backend/multi.h new file mode 100644 index 00000000..a07ca770 --- /dev/null +++ b/include/wlr/backend/multi.h @@ -0,0 +1,10 @@ +#ifndef _WLR_BACKEND_MULTI_H +#define _WLR_BACKEND_MULTI_H + +#include + +struct wlr_backend *wlr_multi_backend_create(); +void wlr_multi_backend_add(struct wlr_backend *multi, + struct wlr_backend *backend); + +#endif From 6bf7e095cf23b570c1fa0e295f9d950404867a22 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Mon, 12 Jun 2017 22:33:55 -0400 Subject: [PATCH 13/25] Flesh out keyboard support in examples --- example/rotation.c | 157 ++++++++++++++++++++++++++++++++++++++++----- example/simple.c | 10 --- 2 files changed, 140 insertions(+), 27 deletions(-) diff --git a/example/rotation.c b/example/rotation.c index 12778f8e..24c9f494 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -18,10 +19,19 @@ #include "cat.h" struct state { + struct wl_list config; + struct xkb_keymap *keymap; + struct xkb_state *xkb_state; + bool exit; + + struct wl_list keyboards; + struct wl_listener input_add; + struct wl_listener input_remove; + + struct wl_list outputs; struct wl_listener output_add; struct wl_listener output_remove; - struct wl_list outputs; - struct wl_list config; + struct wlr_renderer *renderer; struct wlr_surface *cat_texture; }; @@ -33,6 +43,7 @@ struct output_state { struct state *state; struct wl_listener frame; float x_offs, y_offs; + float x_vel, y_vel; }; struct output_config { @@ -41,6 +52,13 @@ struct output_config { struct wl_list link; }; +struct keyboard_state { + struct state *state; + struct wlr_input_device *device; + struct wl_listener key; + struct wl_list link; +}; + static void output_frame(struct wl_listener *listener, void *data) { struct output_state *ostate = wl_container_of(listener, ostate, frame); struct wlr_output *output = ostate->output; @@ -68,8 +86,8 @@ static void output_frame(struct wl_listener *listener, void *data) { (now.tv_nsec - ostate->last_frame.tv_nsec) / 1000000; float seconds = ms / 1000.0f; - ostate->x_offs += 128 * seconds; - ostate->y_offs += 128 * seconds; + ostate->x_offs += ostate->x_vel * seconds; + ostate->y_offs += ostate->y_vel * seconds; if (ostate->x_offs > 128) ostate->x_offs = 0; if (ostate->y_offs > 128) ostate->y_offs = 0; ostate->last_frame = now; @@ -89,6 +107,7 @@ static void output_add(struct wl_listener *listener, void *data) { ostate->state = state; ostate->frame.notify = output_frame; ostate->x_offs = ostate->y_offs = 0; + ostate->x_vel = ostate->y_vel = 128; struct output_config *conf; wl_list_for_each(conf, &state->config, link) { @@ -118,9 +137,91 @@ static void output_remove(struct wl_listener *listener, void *data) { } } -static int timer_done(void *data) { - *(bool *)data = true; - return 1; +static void update_velocities(struct state *state, float x_diff, float y_diff) { + struct output_state *ostate; + wl_list_for_each(ostate, &state->outputs, link) { + ostate->x_vel += x_diff; + ostate->y_vel += y_diff; + } +} + +static void handle_keysym(struct state *state, xkb_keysym_t sym, + enum wlr_key_state key_state) { + char name[64]; + int l = xkb_keysym_get_name(sym, name, sizeof(name)); + if (l != -1 && l != sizeof(name)) { + fprintf(stderr, "Key event: %s %s\n", name, + key_state == WLR_KEY_PRESSED ? "pressed" : "released"); + } + // NOTE: It may be better to simply refer to our key state during each frame + // and make this change in pixels/sec^2 + if (key_state == WLR_KEY_PRESSED) { + switch (sym) { + case XKB_KEY_Escape: + state->exit = true; + break; + case XKB_KEY_Left: + update_velocities(state, -16, 0); + break; + case XKB_KEY_Right: + update_velocities(state, 16, 0); + break; + case XKB_KEY_Up: + update_velocities(state, 0, -16); + break; + case XKB_KEY_Down: + update_velocities(state, 0, 16); + break; + } + } +} + +static void keyboard_key(struct wl_listener *listener, void *data) { + struct wlr_keyboard_key *event = data; + struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); + uint32_t keycode = event->keycode + 8; + const xkb_keysym_t *syms; + int nsyms = xkb_state_key_get_syms(kbstate->state->xkb_state, keycode, &syms); + for (int i = 0; i < nsyms; ++i) { + handle_keysym(kbstate->state, syms[i], event->state); + } + xkb_state_update_key(kbstate->state->xkb_state, keycode, + event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); +} + +void input_add(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); + kbstate->device = device; + kbstate->state = state; + wl_list_init(&kbstate->key.link); + kbstate->key.notify = keyboard_key; + wl_signal_add(&device->keyboard->events.key, &kbstate->key); + wl_list_insert(&state->keyboards, &kbstate->link); +} + +void input_remove(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + struct keyboard_state *kbstate = NULL, *_kbstate; + wl_list_for_each(_kbstate, &state->keyboards, link) { + if (_kbstate->device == device) { + kbstate = kbstate; + break; + } + } + if (!kbstate) { + return; // We are unfamiliar with this keyboard + } + wl_list_remove(&kbstate->link); + wl_list_remove(&kbstate->key.link); } static void usage(const char *name, int ret) { @@ -191,10 +292,38 @@ static void parse_args(int argc, char *argv[], struct wl_list *config) { int main(int argc, char *argv[]) { struct state state = { + .exit = false, + .input_add = { .notify = input_add }, + .input_remove = { .notify = input_remove }, .output_add = { .notify = output_add }, .output_remove = { .notify = output_remove } }; + struct xkb_rule_names rules; + memset(&rules, 0, sizeof(rules)); + rules.rules = getenv("XKB_DEFAULT_RULES"); + rules.model = getenv("XKB_DEFAULT_MODEL"); + rules.layout = getenv("XKB_DEFAULT_LAYOUT"); + rules.variant = getenv("XKB_DEFAULT_VARIANT"); + rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if (!context) { + fprintf(stderr, "Failed to create XKB context\n"); + return 1; + } + state.keymap = + xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + if (!state.keymap) { + fprintf(stderr, "Failed to create XKB keymap\n"); + return 1; + } + xkb_context_unref(context); + state.xkb_state = xkb_state_new(state.keymap); + + wl_list_init(&state.keyboards); + wl_list_init(&state.input_add.link); + wl_list_init(&state.input_remove.link); + wl_list_init(&state.outputs); wl_list_init(&state.config); wl_list_init(&state.output_add.link); @@ -215,10 +344,11 @@ int main(int argc, char *argv[]) { return 1; } + wl_signal_add(&wlr->events.input_add, &state.input_add); + wl_signal_add(&wlr->events.input_remove, &state.input_remove); wl_signal_add(&wlr->events.output_add, &state.output_add); wl_signal_add(&wlr->events.output_remove, &state.output_remove); - - if (!wlr_backend_init(wlr)) { + if (!wlr || !wlr_backend_init(wlr)) { printf("Failed to initialize backend, bailing out\n"); return 1; } @@ -228,17 +358,10 @@ int main(int argc, char *argv[]) { wlr_surface_attach_pixels(state.cat_texture, GL_RGB, cat_tex.width, cat_tex.height, cat_tex.pixel_data); - bool done = false; - struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, - timer_done, &done); - - wl_event_source_timer_update(timer, 30000); - - while (!done) { + while (!state.exit) { wl_event_loop_dispatch(event_loop, 0); } - wl_event_source_remove(timer); wlr_backend_destroy(wlr); wlr_session_finish(session); wlr_surface_destroy(state.cat_texture); diff --git a/example/simple.c b/example/simple.c index 89f74330..331a0d08 100644 --- a/example/simple.c +++ b/example/simple.c @@ -162,12 +162,6 @@ void input_remove(struct wl_listener *listener, void *data) { wl_list_remove(&kbstate->key.link); } -static int timer_done(void *data) { - struct state *state = data; - state->exit = true; - return 1; -} - int main() { struct state state = { .color = { 1.0, 0.0, 0.0 }, @@ -225,10 +219,6 @@ int main() { if (!wlr || !wlr_backend_init(wlr)) { return 1; } - struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, - timer_done, &state); - - wl_event_source_timer_update(timer, 30000); while (!state.exit) { wl_event_loop_dispatch(event_loop, 0); From 0dbfe56c892f400a015c37d1f3574c8f9c985030 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 13 Jun 2017 10:13:11 -0400 Subject: [PATCH 14/25] Simplify examples --- example/CMakeLists.txt | 2 + example/rotation.c | 273 +++++++++-------------------------------- example/shared.c | 203 ++++++++++++++++++++++++++++++ example/shared.h | 61 +++++++++ example/simple.c | 219 ++++----------------------------- 5 files changed, 351 insertions(+), 407 deletions(-) create mode 100644 example/shared.c create mode 100644 example/shared.h diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index bf9efd64..f659e5bb 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories( add_executable(simple simple.c + shared.c ) target_link_libraries(simple @@ -16,6 +17,7 @@ target_link_libraries(simple add_executable(rotation rotation.c + shared.c cat.c ) diff --git a/example/rotation.c b/example/rotation.c index 24c9f494..2634ea03 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -16,32 +16,17 @@ #include #include #include +#include "shared.h" #include "cat.h" -struct state { +struct sample_state { struct wl_list config; - struct xkb_keymap *keymap; - struct xkb_state *xkb_state; - bool exit; - - struct wl_list keyboards; - struct wl_listener input_add; - struct wl_listener input_remove; - - struct wl_list outputs; - struct wl_listener output_add; - struct wl_listener output_remove; - + // TODO: Move renderer into shared struct wlr_renderer *renderer; struct wlr_surface *cat_texture; }; -struct output_state { - struct timespec last_frame; - struct wl_list link; - struct wlr_output *output; - struct state *state; - struct wl_listener frame; +struct output_data { float x_offs, y_offs; float x_vel, y_vel; }; @@ -52,178 +37,95 @@ struct output_config { struct wl_list link; }; -struct keyboard_state { - struct state *state; - struct wlr_input_device *device; - struct wl_listener key; - struct wl_list link; -}; - -static void output_frame(struct wl_listener *listener, void *data) { - struct output_state *ostate = wl_container_of(listener, ostate, frame); - struct wlr_output *output = ostate->output; - struct state *s = ostate->state; +static void handle_output_frame(struct output_state *output, struct timespec *ts) { + struct compositor_state *state = output->compositor; + struct sample_state *sample = state->data; + struct output_data *odata = output->data; + struct wlr_output *wlr_output = output->output; int32_t width, height; - wlr_output_effective_resolution(output, &width, &height); + wlr_output_effective_resolution(wlr_output, &width, &height); - wlr_renderer_begin(s->renderer, output); + wlr_renderer_begin(sample->renderer, wlr_output); float matrix[16]; - for (int y = -128 + (int)ostate->y_offs; y < height; y += 128) { - for (int x = -128 + (int)ostate->x_offs; x < width; x += 128) { - wlr_surface_get_matrix(s->cat_texture, &matrix, - &output->transform_matrix, x, y); - wlr_render_with_matrix(s->renderer, s->cat_texture, &matrix); + for (int y = -128 + (int)odata->y_offs; y < height; y += 128) { + for (int x = -128 + (int)odata->x_offs; x < width; x += 128) { + wlr_surface_get_matrix(sample->cat_texture, &matrix, + &wlr_output->transform_matrix, x, y); + wlr_render_with_matrix(sample->renderer, + sample->cat_texture, &matrix); } } - wlr_renderer_end(s->renderer); + wlr_renderer_end(sample->renderer); - struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - long ms = (now.tv_sec - ostate->last_frame.tv_sec) * 1000 + - (now.tv_nsec - ostate->last_frame.tv_nsec) / 1000000; + long ms = (ts->tv_sec - output->last_frame.tv_sec) * 1000 + + (ts->tv_nsec - output->last_frame.tv_nsec) / 1000000; float seconds = ms / 1000.0f; - ostate->x_offs += ostate->x_vel * seconds; - ostate->y_offs += ostate->y_vel * seconds; - if (ostate->x_offs > 128) ostate->x_offs = 0; - if (ostate->y_offs > 128) ostate->y_offs = 0; - ostate->last_frame = now; + odata->x_offs += odata->x_vel * seconds; + odata->y_offs += odata->y_vel * seconds; + if (odata->x_offs > 128) odata->x_offs = 0; + if (odata->y_offs > 128) odata->y_offs = 0; } -static void output_add(struct wl_listener *listener, void *data) { - struct wlr_output *output = data; - struct state *state = wl_container_of(listener, state, output_add); - - fprintf(stderr, "Output '%s' added\n", output->name); - wlr_output_set_mode(output, output->modes->items[0]); - - struct output_state *ostate = calloc(1, sizeof(struct output_state)); - - clock_gettime(CLOCK_MONOTONIC, &ostate->last_frame); - ostate->output = output; - ostate->state = state; - ostate->frame.notify = output_frame; - ostate->x_offs = ostate->y_offs = 0; - ostate->x_vel = ostate->y_vel = 128; +static void handle_output_add(struct output_state *output) { + struct output_data *odata = calloc(1, sizeof(struct output_data)); + odata->x_offs = odata->y_offs = 0; + odata->x_vel = odata->y_vel = 128; + output->data = odata; + struct sample_state *state = output->compositor->data; struct output_config *conf; wl_list_for_each(conf, &state->config, link) { - if (strcmp(conf->name, output->name) == 0) { - wlr_output_transform(ostate->output, conf->transform); - break; - } - } - - wl_list_init(&ostate->frame.link); - wl_signal_add(&output->events.frame, &ostate->frame); - wl_list_insert(&state->outputs, &ostate->link); -} - -static void output_remove(struct wl_listener *listener, void *data) { - struct wlr_output *output = data; - struct state *state = wl_container_of(listener, state, output_remove); - struct output_state *ostate; - - wl_list_for_each(ostate, &state->outputs, link) { - if (ostate->output == output) { - wl_list_remove(&ostate->link); - wl_list_remove(&ostate->frame.link); - free(ostate); + if (strcmp(conf->name, output->output->name) == 0) { + wlr_output_transform(output->output, conf->transform); break; } } } -static void update_velocities(struct state *state, float x_diff, float y_diff) { - struct output_state *ostate; - wl_list_for_each(ostate, &state->outputs, link) { - ostate->x_vel += x_diff; - ostate->y_vel += y_diff; +static void handle_output_remove(struct output_state *output) { + free(output->data); +} + +static void update_velocities(struct compositor_state *state, + float x_diff, float y_diff) { + struct output_state *output; + wl_list_for_each(output, &state->outputs, link) { + struct output_data *odata = output->data; + odata->x_vel += x_diff; + odata->y_vel += y_diff; } } -static void handle_keysym(struct state *state, xkb_keysym_t sym, - enum wlr_key_state key_state) { - char name[64]; - int l = xkb_keysym_get_name(sym, name, sizeof(name)); - if (l != -1 && l != sizeof(name)) { - fprintf(stderr, "Key event: %s %s\n", name, - key_state == WLR_KEY_PRESSED ? "pressed" : "released"); - } +static void handle_keyboard_key(struct keyboard_state *kbstate, + xkb_keysym_t sym, enum wlr_key_state key_state) { // NOTE: It may be better to simply refer to our key state during each frame // and make this change in pixels/sec^2 + // Also, key repeat if (key_state == WLR_KEY_PRESSED) { switch (sym) { case XKB_KEY_Escape: - state->exit = true; + kbstate->compositor->exit = true; break; case XKB_KEY_Left: - update_velocities(state, -16, 0); + update_velocities(kbstate->compositor, -16, 0); break; case XKB_KEY_Right: - update_velocities(state, 16, 0); + update_velocities(kbstate->compositor, 16, 0); break; case XKB_KEY_Up: - update_velocities(state, 0, -16); + update_velocities(kbstate->compositor, 0, -16); break; case XKB_KEY_Down: - update_velocities(state, 0, 16); + update_velocities(kbstate->compositor, 0, 16); break; } } } -static void keyboard_key(struct wl_listener *listener, void *data) { - struct wlr_keyboard_key *event = data; - struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); - uint32_t keycode = event->keycode + 8; - const xkb_keysym_t *syms; - int nsyms = xkb_state_key_get_syms(kbstate->state->xkb_state, keycode, &syms); - for (int i = 0; i < nsyms; ++i) { - handle_keysym(kbstate->state, syms[i], event->state); - } - xkb_state_update_key(kbstate->state->xkb_state, keycode, - event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); -} - -void input_add(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - struct state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; - } - struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); - kbstate->device = device; - kbstate->state = state; - wl_list_init(&kbstate->key.link); - kbstate->key.notify = keyboard_key; - wl_signal_add(&device->keyboard->events.key, &kbstate->key); - wl_list_insert(&state->keyboards, &kbstate->link); -} - -void input_remove(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - struct state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; - } - struct keyboard_state *kbstate = NULL, *_kbstate; - wl_list_for_each(_kbstate, &state->keyboards, link) { - if (_kbstate->device == device) { - kbstate = kbstate; - break; - } - } - if (!kbstate) { - return; // We are unfamiliar with this keyboard - } - wl_list_remove(&kbstate->link); - wl_list_remove(&kbstate->key.link); -} - static void usage(const char *name, int ret) { fprintf(stderr, "usage: %s [-d [-r | -f]]*\n" @@ -291,82 +193,27 @@ static void parse_args(int argc, char *argv[], struct wl_list *config) { } int main(int argc, char *argv[]) { - struct state state = { - .exit = false, - .input_add = { .notify = input_add }, - .input_remove = { .notify = input_remove }, - .output_add = { .notify = output_add }, - .output_remove = { .notify = output_remove } - }; - - struct xkb_rule_names rules; - memset(&rules, 0, sizeof(rules)); - rules.rules = getenv("XKB_DEFAULT_RULES"); - rules.model = getenv("XKB_DEFAULT_MODEL"); - rules.layout = getenv("XKB_DEFAULT_LAYOUT"); - rules.variant = getenv("XKB_DEFAULT_VARIANT"); - rules.options = getenv("XKB_DEFAULT_OPTIONS"); - struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if (!context) { - fprintf(stderr, "Failed to create XKB context\n"); - return 1; - } - state.keymap = - xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); - if (!state.keymap) { - fprintf(stderr, "Failed to create XKB keymap\n"); - return 1; - } - xkb_context_unref(context); - state.xkb_state = xkb_state_new(state.keymap); - - wl_list_init(&state.keyboards); - wl_list_init(&state.input_add.link); - wl_list_init(&state.input_remove.link); - - wl_list_init(&state.outputs); + struct sample_state state = { 0 }; + struct compositor_state compositor; wl_list_init(&state.config); - wl_list_init(&state.output_add.link); - wl_list_init(&state.output_remove.link); - parse_args(argc, argv, &state.config); - struct wl_display *display = wl_display_create(); - struct wl_event_loop *event_loop = wl_display_get_event_loop(display); - - struct wlr_session *session = wlr_session_start(display); - if (!session) { - return 1; - } - - struct wlr_backend *wlr = wlr_backend_autocreate(display, session); - if (!wlr) { - return 1; - } - - wl_signal_add(&wlr->events.input_add, &state.input_add); - wl_signal_add(&wlr->events.input_remove, &state.input_remove); - wl_signal_add(&wlr->events.output_add, &state.output_add); - wl_signal_add(&wlr->events.output_remove, &state.output_remove); - if (!wlr || !wlr_backend_init(wlr)) { - printf("Failed to initialize backend, bailing out\n"); - return 1; - } + compositor_init(&compositor); + compositor.output_add_cb = handle_output_add; + compositor.output_remove_cb = handle_output_remove; + compositor.output_frame_cb = handle_output_frame; + compositor.keyboard_key_cb = handle_keyboard_key; state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); wlr_surface_attach_pixels(state.cat_texture, GL_RGB, cat_tex.width, cat_tex.height, cat_tex.pixel_data); - while (!state.exit) { - wl_event_loop_dispatch(event_loop, 0); - } + compositor.data = &state; + compositor_run(&compositor); - wlr_backend_destroy(wlr); - wlr_session_finish(session); wlr_surface_destroy(state.cat_texture); wlr_renderer_destroy(state.renderer); - wl_display_destroy(display); struct output_config *ptr, *tmp; wl_list_for_each_safe(ptr, tmp, &state.config, link) { diff --git a/example/shared.c b/example/shared.c new file mode 100644 index 00000000..58266214 --- /dev/null +++ b/example/shared.c @@ -0,0 +1,203 @@ +#define _POSIX_C_SOURCE 199309L +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "shared.h" + +static void keyboard_key_notify(struct wl_listener *listener, void *data) { + struct wlr_keyboard_key *event = data; + struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); + uint32_t keycode = event->keycode + 8; + enum wlr_key_state key_state = event->state; + const xkb_keysym_t *syms; + int nsyms = xkb_state_key_get_syms(kbstate->xkb_state, keycode, &syms); + for (int i = 0; i < nsyms; ++i) { + xkb_keysym_t sym = syms[i]; + char name[64]; + int l = xkb_keysym_get_name(sym, name, sizeof(name)); + if (l != -1 && l != sizeof(name)) { + fprintf(stderr, "Key event: %s %s\n", name, + key_state == WLR_KEY_PRESSED ? "pressed" : "released"); + } + if (kbstate->compositor->keyboard_key_cb) { + kbstate->compositor->keyboard_key_cb(kbstate, sym, key_state); + } + } + xkb_state_update_key(kbstate->xkb_state, keycode, + event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); +} + +static void input_add_notify(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct compositor_state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); + kbstate->device = device; + kbstate->compositor = state; + wl_list_init(&kbstate->key.link); + kbstate->key.notify = keyboard_key_notify; + wl_signal_add(&device->keyboard->events.key, &kbstate->key); + wl_list_insert(&state->keyboards, &kbstate->link); + + struct xkb_rule_names rules; + memset(&rules, 0, sizeof(rules)); + rules.rules = getenv("XKB_DEFAULT_RULES"); + rules.model = getenv("XKB_DEFAULT_MODEL"); + rules.layout = getenv("XKB_DEFAULT_LAYOUT"); + rules.variant = getenv("XKB_DEFAULT_VARIANT"); + rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if (!context) { + fprintf(stderr, "Failed to create XKB context\n"); + exit(1); + } + kbstate->keymap = xkb_map_new_from_names( + context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + if (!kbstate->keymap) { + fprintf(stderr, "Failed to create XKB keymap\n"); + exit(1); + } + xkb_context_unref(context); + kbstate->xkb_state = xkb_state_new(kbstate->keymap); + if (!kbstate->xkb_state) { + fprintf(stderr, "Failed to create XKB state\n"); + exit(1); + } +} + +static void input_remove_notify(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct compositor_state *state = wl_container_of(listener, state, input_add); + if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { + return; + } + struct keyboard_state *kbstate = NULL, *_kbstate; + wl_list_for_each(_kbstate, &state->keyboards, link) { + if (_kbstate->device == device) { + kbstate = kbstate; + break; + } + } + if (!kbstate) { + return; // We are unfamiliar with this keyboard + } + wl_list_remove(&kbstate->link); + wl_list_remove(&kbstate->key.link); +} + +static void output_frame_notify(struct wl_listener *listener, void *data) { + struct output_state *output = wl_container_of(listener, output, frame); + struct compositor_state *compositor = output->compositor; + + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + if (compositor->output_frame_cb) { + compositor->output_frame_cb(output, &now); + } + + output->last_frame = now; + compositor->last_frame = now; +} + +static void output_add_notify(struct wl_listener *listener, void *data) { + struct wlr_output *output = data; + struct compositor_state *state = wl_container_of(listener, state, output_add); + fprintf(stderr, "Output '%s' added\n", output->name); + fprintf(stderr, "%s %s %"PRId32"mm x %"PRId32"mm\n", output->make, output->model, + output->phys_width, output->phys_height); + wlr_output_set_mode(output, output->modes->items[0]); + struct output_state *ostate = calloc(1, sizeof(struct output_state)); + clock_gettime(CLOCK_MONOTONIC, &ostate->last_frame); + ostate->output = output; + ostate->compositor = state; + ostate->frame.notify = output_frame_notify; + wl_list_init(&ostate->frame.link); + wl_signal_add(&output->events.frame, &ostate->frame); + wl_list_insert(&state->outputs, &ostate->link); + if (state->output_add_cb) { + state->output_add_cb(ostate); + } +} + +static void output_remove_notify(struct wl_listener *listener, void *data) { + struct wlr_output *output = data; + struct compositor_state *state = wl_container_of(listener, state, output_remove); + struct output_state *ostate = NULL, *_ostate; + wl_list_for_each(_ostate, &state->outputs, link) { + if (_ostate->output == output) { + ostate = _ostate; + break; + } + } + if (!ostate) { + return; // We are unfamiliar with this output + } + if (state->output_remove_cb) { + state->output_remove_cb(ostate); + } + wl_list_remove(&ostate->link); + wl_list_remove(&ostate->frame.link); +} + +void compositor_init(struct compositor_state *state) { + memset(state, 0, sizeof(struct compositor_state)); + + state->display = wl_display_create(); + state->event_loop = wl_display_get_event_loop(state->display); + state->session = wlr_session_start(state->display); + if (!state->session + || !state->display + || !state->event_loop) { + exit(1); + } + + wl_list_init(&state->keyboards); + wl_list_init(&state->input_add.link); + state->input_add.notify = input_add_notify; + wl_list_init(&state->input_remove.link); + state->input_remove.notify = input_remove_notify; + + wl_list_init(&state->outputs); + wl_list_init(&state->output_add.link); + state->output_add.notify = output_add_notify; + wl_list_init(&state->output_remove.link); + state->output_remove.notify = output_remove_notify; + + struct wlr_backend *wlr = wlr_backend_autocreate( + state->display, state->session); + if (!wlr) { + exit(1); + } + wl_signal_add(&wlr->events.input_add, &state->input_add); + wl_signal_add(&wlr->events.input_remove, &state->input_remove); + wl_signal_add(&wlr->events.output_add, &state->output_add); + wl_signal_add(&wlr->events.output_remove, &state->output_remove); + state->backend = wlr; + + clock_gettime(CLOCK_MONOTONIC, &state->last_frame); +} + +void compositor_run(struct compositor_state *state) { + if (!wlr_backend_init(state->backend)) { + fprintf(stderr, "Failed to initialize backend\n"); + exit(1); + } + + while (!state->exit) { + wl_event_loop_dispatch(state->event_loop, 0); + } + + wlr_backend_destroy(state->backend); + wlr_session_finish(state->session); + wl_display_destroy(state->display); +} diff --git a/example/shared.h b/example/shared.h new file mode 100644 index 00000000..bafbee16 --- /dev/null +++ b/example/shared.h @@ -0,0 +1,61 @@ +#ifndef _EXAMPLE_SHARED_H +#define _EXAMPLE_SHARED_H +#define _POSIX_C_SOURCE 199309L +#include +#include +#include +#include +#include +#include +#include + +struct output_state { + struct compositor_state *compositor; + struct wlr_output *output; + struct wl_listener frame; + struct timespec last_frame; + struct wl_list link; + void *data; +}; + +struct keyboard_state { + struct compositor_state *compositor; + struct wlr_input_device *device; + struct wl_listener key; + struct wl_list link; + struct xkb_keymap *keymap; + struct xkb_state *xkb_state; + void *data; +}; + +struct compositor_state { + void (*output_add_cb)(struct output_state *s); + void (*keyboard_add_cb)(struct keyboard_state *s); + void (*output_frame_cb)(struct output_state *s, struct timespec *ts); + void (*output_remove_cb)(struct output_state *s); + void (*keyboard_remove_cb)(struct keyboard_state *s); + void (*keyboard_key_cb)(struct keyboard_state *s, xkb_keysym_t sym, + enum wlr_key_state key_state); + + struct wl_display *display; + struct wl_event_loop *event_loop; + struct wlr_backend *backend; + struct wlr_session *session; + + struct wl_list keyboards; + struct wl_listener input_add; + struct wl_listener input_remove; + + struct timespec last_frame; + struct wl_listener output_add; + struct wl_listener output_remove; + struct wl_list outputs; + + bool exit; + void *data; +}; + +void compositor_init(struct compositor_state *state); +void compositor_run(struct compositor_state *state); + +#endif diff --git a/example/simple.c b/example/simple.c index 331a0d08..5a5a1300 100644 --- a/example/simple.c +++ b/example/simple.c @@ -10,220 +10,51 @@ #include #include #include +#include "shared.h" -struct state { +struct sample_state { float color[3]; int dec; - bool exit; - struct timespec last_frame; - struct xkb_keymap *keymap; - struct xkb_state *xkb_state; - - struct wl_list keyboards; - struct wl_listener input_add; - struct wl_listener input_remove; - - struct wl_listener output_add; - struct wl_listener output_remove; - struct wl_list outputs; }; -struct output_state { - struct state *state; - struct wlr_output *output; - struct wl_listener frame; - struct wl_list link; -}; +void handle_output_frame(struct output_state *output, struct timespec *ts) { + struct compositor_state *state = output->compositor; + struct sample_state *sample = state->data; -struct keyboard_state { - struct state *state; - struct wlr_input_device *device; - struct wl_listener key; - struct wl_list link; -}; + long ms = (ts->tv_sec - state->last_frame.tv_sec) * 1000 + + (ts->tv_nsec - state->last_frame.tv_nsec) / 1000000; + int inc = (sample->dec + 1) % 3; -void output_frame(struct wl_listener *listener, void *data) { - struct output_state *ostate = wl_container_of(listener, ostate, frame); - struct state *s = ostate->state; + sample->color[inc] += ms / 2000.0f; + sample->color[sample->dec] -= ms / 2000.0f; - struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - - long ms = (now.tv_sec - s->last_frame.tv_sec) * 1000 + - (now.tv_nsec - s->last_frame.tv_nsec) / 1000000; - int inc = (s->dec + 1) % 3; - - s->color[inc] += ms / 2000.0f; - s->color[s->dec] -= ms / 2000.0f; - - if (s->color[s->dec] < 0.0f) { - s->color[inc] = 1.0f; - s->color[s->dec] = 0.0f; - s->dec = inc; + if (sample->color[sample->dec] < 0.0f) { + sample->color[inc] = 1.0f; + sample->color[sample->dec] = 0.0f; + sample->dec = inc; } - s->last_frame = now; - - glClearColor(s->color[0], s->color[1], s->color[2], 1.0); + glClearColor(sample->color[0], sample->color[1], sample->color[2], 1.0); glClear(GL_COLOR_BUFFER_BIT); } -void output_add(struct wl_listener *listener, void *data) { - struct wlr_output *output = data; - struct state *state = wl_container_of(listener, state, output_add); - fprintf(stderr, "Output '%s' added\n", output->name); - fprintf(stderr, "%s %s %"PRId32"mm x %"PRId32"mm\n", output->make, output->model, - output->phys_width, output->phys_height); - wlr_output_set_mode(output, output->modes->items[0]); - struct output_state *ostate = calloc(1, sizeof(struct output_state)); - ostate->output = output; - ostate->state = state; - ostate->frame.notify = output_frame; - wl_list_init(&ostate->frame.link); - wl_signal_add(&output->events.frame, &ostate->frame); - wl_list_insert(&state->outputs, &ostate->link); -} - -void output_remove(struct wl_listener *listener, void *data) { - struct wlr_output *output = data; - struct state *state = wl_container_of(listener, state, output_remove); - struct output_state *ostate = NULL, *_ostate; - wl_list_for_each(_ostate, &state->outputs, link) { - if (_ostate->output == output) { - ostate = _ostate; - break; - } - } - if (!ostate) { - return; // We are unfamiliar with this output - } - wl_list_remove(&ostate->link); - wl_list_remove(&ostate->frame.link); -} - -static void handle_keysym(struct state *state, xkb_keysym_t sym, - enum wlr_key_state key_state) { - char name[64]; - int l = xkb_keysym_get_name(sym, name, sizeof(name)); - if (l != -1 && l != sizeof(name)) { - fprintf(stderr, "Key event: %s %s\n", name, - key_state == WLR_KEY_PRESSED ? "pressed" : "released"); - } +static void handle_keyboard_key(struct keyboard_state *kbstate, + xkb_keysym_t sym, enum wlr_key_state key_state) { if (sym == XKB_KEY_Escape) { - state->exit = true; + kbstate->compositor->exit = true; } } -static void keyboard_key(struct wl_listener *listener, void *data) { - struct wlr_keyboard_key *event = data; - struct keyboard_state *kbstate = wl_container_of(listener, kbstate, key); - uint32_t keycode = event->keycode + 8; - const xkb_keysym_t *syms; - int nsyms = xkb_state_key_get_syms(kbstate->state->xkb_state, keycode, &syms); - for (int i = 0; i < nsyms; ++i) { - handle_keysym(kbstate->state, syms[i], event->state); - } - xkb_state_update_key(kbstate->state->xkb_state, keycode, - event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); -} - -void input_add(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - struct state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; - } - struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); - kbstate->device = device; - kbstate->state = state; - wl_list_init(&kbstate->key.link); - kbstate->key.notify = keyboard_key; - wl_signal_add(&device->keyboard->events.key, &kbstate->key); - wl_list_insert(&state->keyboards, &kbstate->link); -} - -void input_remove(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - struct state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; - } - struct keyboard_state *kbstate = NULL, *_kbstate; - wl_list_for_each(_kbstate, &state->keyboards, link) { - if (_kbstate->device == device) { - kbstate = kbstate; - break; - } - } - if (!kbstate) { - return; // We are unfamiliar with this keyboard - } - wl_list_remove(&kbstate->link); - wl_list_remove(&kbstate->key.link); -} - int main() { - struct state state = { + struct sample_state state = { .color = { 1.0, 0.0, 0.0 }, .dec = 0, - .exit = false, - .input_add = { .notify = input_add }, - .input_remove = { .notify = input_remove }, - .output_add = { .notify = output_add }, - .output_remove = { .notify = output_remove }, }; + struct compositor_state compositor; - struct xkb_rule_names rules; - memset(&rules, 0, sizeof(rules)); - rules.rules = getenv("XKB_DEFAULT_RULES"); - rules.model = getenv("XKB_DEFAULT_MODEL"); - rules.layout = getenv("XKB_DEFAULT_LAYOUT"); - rules.variant = getenv("XKB_DEFAULT_VARIANT"); - rules.options = getenv("XKB_DEFAULT_OPTIONS"); - struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if (!context) { - fprintf(stderr, "Failed to create XKB context\n"); - return 1; - } - state.keymap = - xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); - if (!state.keymap) { - fprintf(stderr, "Failed to create XKB keymap\n"); - return 1; - } - xkb_context_unref(context); - state.xkb_state = xkb_state_new(state.keymap); - - wl_list_init(&state.keyboards); - wl_list_init(&state.input_add.link); - wl_list_init(&state.input_remove.link); - - wl_list_init(&state.outputs); - wl_list_init(&state.output_remove.link); - wl_list_init(&state.output_remove.link); - clock_gettime(CLOCK_MONOTONIC, &state.last_frame); - - struct wl_display *display = wl_display_create(); - struct wl_event_loop *event_loop = wl_display_get_event_loop(display); - - struct wlr_session *session = wlr_session_start(display); - if (!session) { - return 1; - } - - struct wlr_backend *wlr = wlr_backend_autocreate(display, session); - wl_signal_add(&wlr->events.input_add, &state.input_add); - wl_signal_add(&wlr->events.input_remove, &state.input_remove); - wl_signal_add(&wlr->events.output_add, &state.output_add); - wl_signal_add(&wlr->events.output_remove, &state.output_remove); - if (!wlr || !wlr_backend_init(wlr)) { - return 1; - } - - while (!state.exit) { - wl_event_loop_dispatch(event_loop, 0); - } - - wlr_backend_destroy(wlr); - wl_display_destroy(display); + compositor_init(&compositor); + compositor.output_frame_cb = handle_output_frame; + compositor.keyboard_key_cb = handle_keyboard_key; + compositor.data = &state; + compositor_run(&compositor); } From a63230e59cfdaad42c3444b2bc4be5480202e527 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 13 Jun 2017 10:27:15 -0400 Subject: [PATCH 15/25] Implement libinput wlr_pointer --- backend/CMakeLists.txt | 1 + backend/libinput/events.c | 43 ++++++++++--- backend/libinput/pointer.c | 129 +++++++++++++++++++++++++++++++++++++ example/rotation.c | 1 - include/backend/libinput.h | 13 +++- types/CMakeLists.txt | 1 + types/wlr_pointer.c | 24 +++++++ 7 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 backend/libinput/pointer.c create mode 100644 types/wlr_pointer.c diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 23914240..b8df9373 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -17,6 +17,7 @@ add_library(wlr-backend libinput/backend.c libinput/events.c libinput/keyboard.c + libinput/pointer.c multi/backend.c backend.c diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 2ce368e3..5ef58a3e 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -33,6 +33,22 @@ static struct wlr_input_device_impl input_device_impl = { .destroy = wlr_libinput_device_destroy }; +static struct wlr_input_device *allocate_device(struct libinput_device *device, + list_t *devices, enum wlr_input_device_type type) { + int vendor = libinput_device_get_id_vendor(device); + int product = libinput_device_get_id_product(device); + const char *name = libinput_device_get_name(device); + struct wlr_input_device_state *devstate = + calloc(1, sizeof(struct wlr_input_device_state)); + devstate->handle = device; + libinput_device_ref(device); + struct wlr_input_device *wlr_device = wlr_input_device_create( + type, &input_device_impl, devstate, + name, vendor, product); + list_add(devices, wlr_device); + return wlr_device; +} + static void handle_device_added(struct wlr_backend_state *state, struct libinput_device *device) { assert(state && device); @@ -49,19 +65,16 @@ static void handle_device_added(struct wlr_backend_state *state, wlr_log(L_DEBUG, "Added %s [%d:%d]", name, vendor, product); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) { - struct wlr_input_device_state *devstate = - calloc(1, sizeof(struct wlr_input_device_state)); - devstate->handle = device; - libinput_device_ref(device); - struct wlr_input_device *wlr_device = wlr_input_device_create( - WLR_INPUT_DEVICE_KEYBOARD, &input_device_impl, devstate, - name, vendor, product); + struct wlr_input_device *wlr_device = allocate_device(device, devices, + WLR_INPUT_DEVICE_KEYBOARD); wlr_device->keyboard = wlr_libinput_keyboard_create(device); wl_signal_emit(&state->backend->events.input_add, wlr_device); - list_add(devices, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { - // TODO + struct wlr_input_device *wlr_device = allocate_device(device, devices, + WLR_INPUT_DEVICE_POINTER); + wlr_device->pointer = wlr_libinput_pointer_create(device); + wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { // TODO @@ -109,6 +122,18 @@ void wlr_libinput_event(struct wlr_backend_state *state, case LIBINPUT_EVENT_KEYBOARD_KEY: handle_keyboard_key(event, device); break; + case LIBINPUT_EVENT_POINTER_MOTION: + handle_pointer_motion(event, device); + break; + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: + handle_pointer_motion_abs(event, device); + break; + case LIBINPUT_EVENT_POINTER_BUTTON: + handle_pointer_button(event, device); + break; + case LIBINPUT_EVENT_POINTER_AXIS: + handle_pointer_axis(event, device); + break; default: wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); break; diff --git a/backend/libinput/pointer.c b/backend/libinput/pointer.c new file mode 100644 index 00000000..0139fd60 --- /dev/null +++ b/backend/libinput/pointer.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +#include +#include "backend/libinput.h" +#include "common/log.h" +#include "types.h" + +struct wlr_pointer *wlr_libinput_pointer_create( + struct libinput_device *device) { + assert(device); + return wlr_pointer_create(NULL, NULL); +} + +void handle_pointer_motion(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_POINTER, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a pointer event for a device with no pointers?"); + return; + } + struct libinput_event_pointer *pevent = + libinput_event_get_pointer_event(event); + struct wlr_pointer_motion *wlr_event = + calloc(1, sizeof(struct wlr_pointer_motion)); + wlr_event->time_sec = libinput_event_pointer_get_time(pevent); + wlr_event->time_usec = libinput_event_pointer_get_time_usec(pevent); + wlr_event->delta_x = libinput_event_pointer_get_dx(pevent); + wlr_event->delta_y = libinput_event_pointer_get_dy(pevent); + wl_signal_emit(&dev->pointer->events.motion, wlr_event); +} + +void handle_pointer_motion_abs(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_POINTER, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a pointer event for a device with no pointers?"); + return; + } + struct libinput_event_pointer *pevent = + libinput_event_get_pointer_event(event); + struct wlr_pointer_motion_absolute *wlr_event = + calloc(1, sizeof(struct wlr_pointer_motion_absolute)); + wlr_event->time_sec = libinput_event_pointer_get_time(pevent); + wlr_event->time_usec = libinput_event_pointer_get_time_usec(pevent); + wlr_event->x_mm = libinput_event_pointer_get_absolute_x(pevent); + wlr_event->y_mm = libinput_event_pointer_get_absolute_y(pevent); + libinput_device_get_size(device, &wlr_event->width_mm, &wlr_event->height_mm); + wl_signal_emit(&dev->pointer->events.motion_absolute, wlr_event); +} + +void handle_pointer_button(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_POINTER, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a pointer event for a device with no pointers?"); + return; + } + struct libinput_event_pointer *pevent = + libinput_event_get_pointer_event(event); + struct wlr_pointer_button *wlr_event = + calloc(1, sizeof(struct wlr_pointer_button)); + wlr_event->time_sec = libinput_event_pointer_get_time(pevent); + wlr_event->time_usec = libinput_event_pointer_get_time_usec(pevent); + wlr_event->button = libinput_event_pointer_get_button(pevent); + switch (libinput_event_pointer_get_button_state(pevent)) { + case LIBINPUT_BUTTON_STATE_PRESSED: + wlr_event->state = WLR_BUTTON_PRESSED; + break; + case LIBINPUT_BUTTON_STATE_RELEASED: + wlr_event->state = WLR_BUTTON_RELEASED; + break; + } + wl_signal_emit(&dev->pointer->events.button, wlr_event); +} + +void handle_pointer_axis(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_POINTER, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a pointer event for a device with no pointers?"); + return; + } + struct libinput_event_pointer *pevent = + libinput_event_get_pointer_event(event); + struct wlr_pointer_axis *wlr_event = + calloc(1, sizeof(struct wlr_pointer_axis)); + wlr_event->time_sec = libinput_event_pointer_get_time(pevent); + wlr_event->time_usec = libinput_event_pointer_get_time_usec(pevent); + switch (libinput_event_pointer_get_axis_source(pevent)) { + case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL: + wlr_event->source = WLR_AXIS_SOURCE_WHEEL; + break; + case LIBINPUT_POINTER_AXIS_SOURCE_FINGER: + wlr_event->source = WLR_AXIS_SOURCE_FINGER; + break; + case LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS: + wlr_event->source = WLR_AXIS_SOURCE_CONTINUOUS; + break; + case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL_TILT: + wlr_event->source = WLR_AXIS_SOURCE_WHEEL_TILT; + break; + } + enum libinput_pointer_axis axies[] = { + LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, + LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, + }; + for (size_t i = 0; i < sizeof(axies) / sizeof(axies[0]); ++i) { + if (libinput_event_pointer_has_axis(pevent, axies[i])) { + switch (axies[i]) { + case LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL: + wlr_event->orientation = WLR_AXIS_ORIENTATION_VERTICAL; + break; + case LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL: + wlr_event->orientation = WLR_AXIS_ORIENTATION_HORIZONTAL; + break; + } + wlr_event->delta = libinput_event_pointer_get_axis_value( + pevent, axies[i]); + } + wl_signal_emit(&dev->pointer->events.axis, wlr_event); + } +} diff --git a/example/rotation.c b/example/rotation.c index 2634ea03..892083e6 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -21,7 +21,6 @@ struct sample_state { struct wl_list config; - // TODO: Move renderer into shared struct wlr_renderer *renderer; struct wlr_surface *cat_texture; }; diff --git a/include/backend/libinput.h b/include/backend/libinput.h index f6622695..7c318746 100644 --- a/include/backend/libinput.h +++ b/include/backend/libinput.h @@ -30,9 +30,20 @@ struct wlr_input_device *get_appropriate_device( enum wlr_input_device_type desired_type, struct libinput_device *device); +struct wlr_keyboard *wlr_libinput_keyboard_create( + struct libinput_device *device); void handle_keyboard_key(struct libinput_event *event, struct libinput_device *device); -struct wlr_keyboard *wlr_libinput_keyboard_create( + +struct wlr_pointer *wlr_libinput_pointer_create( + struct libinput_device *device); +void handle_pointer_motion(struct libinput_event *event, + struct libinput_device *device); +void handle_pointer_motion_abs(struct libinput_event *event, + struct libinput_device *device); +void handle_pointer_button(struct libinput_event *event, + struct libinput_device *device); +void handle_pointer_axis(struct libinput_event *event, struct libinput_device *device); #endif diff --git a/types/CMakeLists.txt b/types/CMakeLists.txt index 5ac1baf6..91ab9da0 100644 --- a/types/CMakeLists.txt +++ b/types/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories( add_library(wlr-types wlr_output.c wlr_keyboard.c + wlr_pointer.c wlr_input_device.c ) diff --git a/types/wlr_pointer.c b/types/wlr_pointer.c new file mode 100644 index 00000000..b1364c34 --- /dev/null +++ b/types/wlr_pointer.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +#include "types.h" + +struct wlr_pointer *wlr_pointer_create(struct wlr_pointer_impl *impl, + struct wlr_pointer_state *state) { + struct wlr_pointer *pointer = calloc(1, sizeof(struct wlr_pointer)); + pointer->impl = impl; + pointer->state = state; + wl_signal_init(&pointer->events.motion); + wl_signal_init(&pointer->events.motion_absolute); + wl_signal_init(&pointer->events.button); + wl_signal_init(&pointer->events.axis); + return pointer; +} + +void wlr_pointer_destroy(struct wlr_pointer *kb) { + if (!kb) return; + kb->impl->destroy(kb->state); + free(kb); +} From 2f9fd72fdcf9249ed16bcc029a86e734ae1487a1 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 13 Jun 2017 12:21:36 -0400 Subject: [PATCH 16/25] Add pointer example --- example/CMakeLists.txt | 13 +++++++ example/pointer.c | 77 +++++++++++++++++++++++++++++++++++++++ example/shared.c | 82 ++++++++++++++++++++++++++++++++++++------ example/shared.h | 13 +++++++ 4 files changed, 174 insertions(+), 11 deletions(-) create mode 100644 example/pointer.c diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index f659e5bb..ef11a822 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -27,3 +27,16 @@ target_link_libraries(rotation wlr-render ${XKBCOMMON_LIBRARIES} ) + +add_executable(pointer + pointer.c + shared.c + cat.c +) + +target_link_libraries(pointer + wlr-backend + wlr-session + wlr-render + ${XKBCOMMON_LIBRARIES} +) diff --git a/example/pointer.c b/example/pointer.c new file mode 100644 index 00000000..969fb721 --- /dev/null +++ b/example/pointer.c @@ -0,0 +1,77 @@ +#define _POSIX_C_SOURCE 199309L +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "shared.h" +#include "cat.h" + +struct sample_state { + struct wlr_renderer *renderer; + struct wlr_surface *cat_texture; + int cur_x, cur_y; +}; + +static void handle_output_frame(struct output_state *output, struct timespec *ts) { + struct compositor_state *state = output->compositor; + struct sample_state *sample = state->data; + struct wlr_output *wlr_output = output->output; + + wlr_renderer_begin(sample->renderer, wlr_output); + + float matrix[16]; + wlr_surface_get_matrix(sample->cat_texture, &matrix, + &wlr_output->transform_matrix, sample->cur_x, sample->cur_y); + wlr_render_with_matrix(sample->renderer, + sample->cat_texture, &matrix); + + wlr_renderer_end(sample->renderer); +} + +static void handle_keyboard_key(struct keyboard_state *kbstate, + xkb_keysym_t sym, enum wlr_key_state key_state) { + if (sym == XKB_KEY_Escape) { + kbstate->compositor->exit = true; + } +} + +static void handle_pointer_motion(struct pointer_state *pstate, + double d_x, double d_y) { + struct sample_state *state = pstate->compositor->data; + state->cur_x += d_x; + state->cur_y += d_y; +} + +int main(int argc, char *argv[]) { + struct sample_state state = { 0 }; + struct compositor_state compositor; + + compositor_init(&compositor); + compositor.output_frame_cb = handle_output_frame; + compositor.pointer_motion_cb = handle_pointer_motion; + compositor.keyboard_key_cb = handle_keyboard_key; + + state.renderer = wlr_gles3_renderer_init(); + state.cat_texture = wlr_render_surface_init(state.renderer); + wlr_surface_attach_pixels(state.cat_texture, GL_RGB, + cat_tex.width, cat_tex.height, cat_tex.pixel_data); + + compositor.data = &state; + compositor_run(&compositor); + + wlr_surface_destroy(state.cat_texture); + wlr_renderer_destroy(state.renderer); +} diff --git a/example/shared.c b/example/shared.c index 58266214..4657b7fe 100644 --- a/example/shared.c +++ b/example/shared.c @@ -35,12 +35,7 @@ static void keyboard_key_notify(struct wl_listener *listener, void *data) { event->state == WLR_KEY_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); } -static void input_add_notify(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - struct compositor_state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; - } +static void keyboard_add(struct wlr_input_device *device, struct compositor_state *state) { struct keyboard_state *kbstate = calloc(sizeof(struct keyboard_state), 1); kbstate->device = device; kbstate->compositor = state; @@ -75,26 +70,90 @@ static void input_add_notify(struct wl_listener *listener, void *data) { } } -static void input_remove_notify(struct wl_listener *listener, void *data) { +static void pointer_motion_notify(struct wl_listener *listener, void *data) { + struct wlr_pointer_motion *event = data; + struct pointer_state *pstate = wl_container_of(listener, pstate, motion); + if (pstate->compositor->pointer_motion_cb) { + pstate->compositor->pointer_motion_cb(pstate, event->delta_x, event->delta_y); + } +} + +static void pointer_add(struct wlr_input_device *device, struct compositor_state *state) { + struct pointer_state *pstate = calloc(sizeof(struct pointer_state), 1); + pstate->device = device; + pstate->compositor = state; + wl_list_init(&pstate->motion.link); + wl_list_init(&pstate->motion_absolute.link); + wl_list_init(&pstate->button.link); + wl_list_init(&pstate->axis.link); + pstate->motion.notify = pointer_motion_notify; + wl_signal_add(&device->pointer->events.motion, &pstate->motion); + wl_list_insert(&state->pointers, &pstate->link); +} + +static void input_add_notify(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; struct compositor_state *state = wl_container_of(listener, state, input_add); - if (device->type != WLR_INPUT_DEVICE_KEYBOARD) { - return; + switch (device->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + keyboard_add(device, state); + break; + case WLR_INPUT_DEVICE_POINTER: + pointer_add(device, state); + break; + default: + break; } +} + +static void keyboard_remove(struct wlr_input_device *device, struct compositor_state *state) { struct keyboard_state *kbstate = NULL, *_kbstate; wl_list_for_each(_kbstate, &state->keyboards, link) { if (_kbstate->device == device) { - kbstate = kbstate; + kbstate = _kbstate; break; } } if (!kbstate) { - return; // We are unfamiliar with this keyboard + return; } wl_list_remove(&kbstate->link); wl_list_remove(&kbstate->key.link); } +static void pointer_remove(struct wlr_input_device *device, struct compositor_state *state) { + struct pointer_state *pstate = NULL, *_pstate; + wl_list_for_each(_pstate, &state->pointers, link) { + if (_pstate->device == device) { + pstate = _pstate; + break; + } + } + if (!pstate) { + return; + } + wl_list_remove(&pstate->link); + //wl_list_remove(&pstate->motion.link); + wl_list_remove(&pstate->motion_absolute.link); + //wl_list_remove(&pstate->button.link); + //wl_list_remove(&pstate->axis.link); +} + +static void input_remove_notify(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + struct compositor_state *state = wl_container_of(listener, state, input_add); + switch (device->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + keyboard_remove(device, state); + break; + case WLR_INPUT_DEVICE_POINTER: + pointer_remove(device, state); + break; + default: + break; + } +} + static void output_frame_notify(struct wl_listener *listener, void *data) { struct output_state *output = wl_container_of(listener, output, frame); struct compositor_state *compositor = output->compositor; @@ -162,6 +221,7 @@ void compositor_init(struct compositor_state *state) { } wl_list_init(&state->keyboards); + wl_list_init(&state->pointers); wl_list_init(&state->input_add.link); state->input_add.notify = input_add_notify; wl_list_init(&state->input_remove.link); diff --git a/example/shared.h b/example/shared.h index bafbee16..2c093414 100644 --- a/example/shared.h +++ b/example/shared.h @@ -28,6 +28,17 @@ struct keyboard_state { void *data; }; +struct pointer_state { + struct compositor_state *compositor; + struct wlr_input_device *device; + struct wl_listener motion; + struct wl_listener motion_absolute; + struct wl_listener button; + struct wl_listener axis; + struct wl_list link; + void *data; +}; + struct compositor_state { void (*output_add_cb)(struct output_state *s); void (*keyboard_add_cb)(struct keyboard_state *s); @@ -36,6 +47,7 @@ struct compositor_state { void (*keyboard_remove_cb)(struct keyboard_state *s); void (*keyboard_key_cb)(struct keyboard_state *s, xkb_keysym_t sym, enum wlr_key_state key_state); + void (*pointer_motion_cb)(struct pointer_state *s, double d_x, double d_y); struct wl_display *display; struct wl_event_loop *event_loop; @@ -43,6 +55,7 @@ struct compositor_state { struct wlr_session *session; struct wl_list keyboards; + struct wl_list pointers; struct wl_listener input_add; struct wl_listener input_remove; From 8f284ec0b23953ccc274291eeb612d782d391b07 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 13 Jun 2017 12:31:24 -0400 Subject: [PATCH 17/25] Demonstrate pointer button event in example --- example/pointer.c | 26 ++++++++++++++++++++++++-- example/shared.c | 14 +++++++++++++- example/shared.h | 5 ++++- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/example/pointer.c b/example/pointer.c index 969fb721..42ac85fd 100644 --- a/example/pointer.c +++ b/example/pointer.c @@ -23,6 +23,7 @@ struct sample_state { struct wlr_renderer *renderer; struct wlr_surface *cat_texture; int cur_x, cur_y; + float clear_color[4]; }; static void handle_output_frame(struct output_state *output, struct timespec *ts) { @@ -31,6 +32,9 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts struct wlr_output *wlr_output = output->output; wlr_renderer_begin(sample->renderer, wlr_output); + glClearColor(sample->clear_color[0], sample->clear_color[1], + sample->clear_color[2], sample->clear_color[3]); + glClear(GL_COLOR_BUFFER_BIT); float matrix[16]; wlr_surface_get_matrix(sample->cat_texture, &matrix, @@ -55,14 +59,32 @@ static void handle_pointer_motion(struct pointer_state *pstate, state->cur_y += d_y; } +static void handle_pointer_button(struct pointer_state *pstate, + uint32_t button, enum wlr_button_state state) { + struct sample_state *sample = pstate->compositor->data; + float (*color)[4]; + if (state == WLR_BUTTON_RELEASED) { + float _default[4] = { 0.25f, 0.25f, 0.25f, 1 }; + color = &_default; + } else { + float red[4] = { 0.25f, 0.25f, 0.25f, 1 }; + red[button % 3] = 1; + color = &red; + } + memcpy(&sample->clear_color, color, sizeof(*color)); +} + int main(int argc, char *argv[]) { - struct sample_state state = { 0 }; + struct sample_state state = { + .clear_color = { 0.25f, 0.25f, 0.25f, 1 } + }; struct compositor_state compositor; compositor_init(&compositor); compositor.output_frame_cb = handle_output_frame; - compositor.pointer_motion_cb = handle_pointer_motion; compositor.keyboard_key_cb = handle_keyboard_key; + compositor.pointer_motion_cb = handle_pointer_motion; + compositor.pointer_button_cb = handle_pointer_button; state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); diff --git a/example/shared.c b/example/shared.c index 4657b7fe..6a676343 100644 --- a/example/shared.c +++ b/example/shared.c @@ -74,7 +74,17 @@ static void pointer_motion_notify(struct wl_listener *listener, void *data) { struct wlr_pointer_motion *event = data; struct pointer_state *pstate = wl_container_of(listener, pstate, motion); if (pstate->compositor->pointer_motion_cb) { - pstate->compositor->pointer_motion_cb(pstate, event->delta_x, event->delta_y); + pstate->compositor->pointer_motion_cb(pstate, + event->delta_x, event->delta_y); + } +} + +static void pointer_button_notify(struct wl_listener *listener, void *data) { + struct wlr_pointer_button *event = data; + struct pointer_state *pstate = wl_container_of(listener, pstate, button); + if (pstate->compositor->pointer_button_cb) { + pstate->compositor->pointer_button_cb(pstate, + event->button, event->state); } } @@ -87,7 +97,9 @@ static void pointer_add(struct wlr_input_device *device, struct compositor_state wl_list_init(&pstate->button.link); wl_list_init(&pstate->axis.link); pstate->motion.notify = pointer_motion_notify; + pstate->button.notify = pointer_button_notify; wl_signal_add(&device->pointer->events.motion, &pstate->motion); + wl_signal_add(&device->pointer->events.button, &pstate->button); wl_list_insert(&state->pointers, &pstate->link); } diff --git a/example/shared.h b/example/shared.h index 2c093414..ca558f1c 100644 --- a/example/shared.h +++ b/example/shared.h @@ -47,7 +47,10 @@ struct compositor_state { void (*keyboard_remove_cb)(struct keyboard_state *s); void (*keyboard_key_cb)(struct keyboard_state *s, xkb_keysym_t sym, enum wlr_key_state key_state); - void (*pointer_motion_cb)(struct pointer_state *s, double d_x, double d_y); + void (*pointer_motion_cb)(struct pointer_state *s, + double d_x, double d_y); + void (*pointer_button_cb)(struct pointer_state *s, + uint32_t button, enum wlr_button_state state); struct wl_display *display; struct wl_event_loop *event_loop; From 7dfc2c28f1870a38357d6adbb48040151f3166b1 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 13 Jun 2017 12:38:57 -0400 Subject: [PATCH 18/25] Add axis events to pointer example --- example/pointer.c | 24 ++++++++++++++++++++++-- example/shared.c | 11 +++++++++++ example/shared.h | 4 ++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/example/pointer.c b/example/pointer.c index 42ac85fd..a427f0f2 100644 --- a/example/pointer.c +++ b/example/pointer.c @@ -23,6 +23,7 @@ struct sample_state { struct wlr_renderer *renderer; struct wlr_surface *cat_texture; int cur_x, cur_y; + float default_color[4]; float clear_color[4]; }; @@ -64,8 +65,7 @@ static void handle_pointer_button(struct pointer_state *pstate, struct sample_state *sample = pstate->compositor->data; float (*color)[4]; if (state == WLR_BUTTON_RELEASED) { - float _default[4] = { 0.25f, 0.25f, 0.25f, 1 }; - color = &_default; + color = &sample->default_color; } else { float red[4] = { 0.25f, 0.25f, 0.25f, 1 }; red[button % 3] = 1; @@ -74,8 +74,27 @@ static void handle_pointer_button(struct pointer_state *pstate, memcpy(&sample->clear_color, color, sizeof(*color)); } +static void handle_pointer_axis(struct pointer_state *pstate, + enum wlr_axis_source source, + enum wlr_axis_orientation orientation, + double delta) { + struct sample_state *sample = pstate->compositor->data; + for (size_t i = 0; i < 3; ++i) { + sample->default_color[i] += delta > 0 ? -0.05f : 0.05f; + if (sample->default_color[i] > 1.0f) { + sample->default_color[i] = 1.0f; + } + if (sample->default_color[i] < 0.0f) { + sample->default_color[i] = 0.0f; + } + } + memcpy(&sample->clear_color, &sample->default_color, + sizeof(sample->clear_color)); +} + int main(int argc, char *argv[]) { struct sample_state state = { + .default_color = { 0.25f, 0.25f, 0.25f, 1 }, .clear_color = { 0.25f, 0.25f, 0.25f, 1 } }; struct compositor_state compositor; @@ -85,6 +104,7 @@ int main(int argc, char *argv[]) { compositor.keyboard_key_cb = handle_keyboard_key; compositor.pointer_motion_cb = handle_pointer_motion; compositor.pointer_button_cb = handle_pointer_button; + compositor.pointer_axis_cb = handle_pointer_axis; state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); diff --git a/example/shared.c b/example/shared.c index 6a676343..6de16074 100644 --- a/example/shared.c +++ b/example/shared.c @@ -88,6 +88,15 @@ static void pointer_button_notify(struct wl_listener *listener, void *data) { } } +static void pointer_axis_notify(struct wl_listener *listener, void *data) { + struct wlr_pointer_axis *event = data; + struct pointer_state *pstate = wl_container_of(listener, pstate, axis); + if (pstate->compositor->pointer_axis_cb) { + pstate->compositor->pointer_axis_cb(pstate, + event->source, event->orientation, event->delta); + } +} + static void pointer_add(struct wlr_input_device *device, struct compositor_state *state) { struct pointer_state *pstate = calloc(sizeof(struct pointer_state), 1); pstate->device = device; @@ -98,8 +107,10 @@ static void pointer_add(struct wlr_input_device *device, struct compositor_state wl_list_init(&pstate->axis.link); pstate->motion.notify = pointer_motion_notify; pstate->button.notify = pointer_button_notify; + pstate->axis.notify = pointer_axis_notify; wl_signal_add(&device->pointer->events.motion, &pstate->motion); wl_signal_add(&device->pointer->events.button, &pstate->button); + wl_signal_add(&device->pointer->events.axis, &pstate->axis); wl_list_insert(&state->pointers, &pstate->link); } diff --git a/example/shared.h b/example/shared.h index ca558f1c..7f0dade5 100644 --- a/example/shared.h +++ b/example/shared.h @@ -51,6 +51,10 @@ struct compositor_state { double d_x, double d_y); void (*pointer_button_cb)(struct pointer_state *s, uint32_t button, enum wlr_button_state state); + void (*pointer_axis_cb)(struct pointer_state *s, + enum wlr_axis_source source, + enum wlr_axis_orientation orientation, + double delta); struct wl_display *display; struct wl_event_loop *event_loop; From d6905f86cb9d430e0ba05c6a066ed350761116d1 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 14 Jun 2017 11:40:03 -0400 Subject: [PATCH 19/25] Allocate wlr_touch devices --- backend/CMakeLists.txt | 1 + backend/libinput/backend.c | 2 +- backend/libinput/events.c | 17 +++++++++++------ backend/libinput/touch.c | 15 +++++++++++++++ include/backend/libinput.h | 15 ++++++++++++++- include/types.h | 8 ++++++++ include/wlr/types.h | 18 +++++++++++++++++- types/CMakeLists.txt | 1 + types/wlr_keyboard.c | 4 +++- types/wlr_pointer.c | 10 ++++++---- types/wlr_touch.c | 27 +++++++++++++++++++++++++++ 11 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 backend/libinput/touch.c create mode 100644 types/wlr_touch.c diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index b8df9373..8272e039 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(wlr-backend libinput/events.c libinput/keyboard.c libinput/pointer.c + libinput/touch.c multi/backend.c backend.c diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index 9b0a6d8c..82ba44a6 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -102,7 +102,7 @@ struct wlr_backend *wlr_libinput_backend_create(struct wl_display *display, goto error_state; } - if (!(state->keyboards = list_create())) { + if (!(state->devices = list_create())) { wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); goto error_backend; } diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 5ef58a3e..4af8082f 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -33,7 +33,8 @@ static struct wlr_input_device_impl input_device_impl = { .destroy = wlr_libinput_device_destroy }; -static struct wlr_input_device *allocate_device(struct libinput_device *device, +static struct wlr_input_device *allocate_device( + struct wlr_backend_state *state, struct libinput_device *device, list_t *devices, enum wlr_input_device_type type) { int vendor = libinput_device_get_id_vendor(device); int product = libinput_device_get_id_product(device); @@ -46,6 +47,7 @@ static struct wlr_input_device *allocate_device(struct libinput_device *device, type, &input_device_impl, devstate, name, vendor, product); list_add(devices, wlr_device); + list_add(state->devices, wlr_device); return wlr_device; } @@ -65,19 +67,22 @@ static void handle_device_added(struct wlr_backend_state *state, wlr_log(L_DEBUG, "Added %s [%d:%d]", name, vendor, product); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) { - struct wlr_input_device *wlr_device = allocate_device(device, devices, - WLR_INPUT_DEVICE_KEYBOARD); + struct wlr_input_device *wlr_device = allocate_device(state, + device, devices, WLR_INPUT_DEVICE_KEYBOARD); wlr_device->keyboard = wlr_libinput_keyboard_create(device); wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { - struct wlr_input_device *wlr_device = allocate_device(device, devices, - WLR_INPUT_DEVICE_POINTER); + struct wlr_input_device *wlr_device = allocate_device(state, + device, devices, WLR_INPUT_DEVICE_POINTER); wlr_device->pointer = wlr_libinput_pointer_create(device); wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { - // TODO + struct wlr_input_device *wlr_device = allocate_device(state, + device, devices, WLR_INPUT_DEVICE_TOUCH); + wlr_device->touch = wlr_libinput_touch_create(device); + wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_TOOL)) { // TODO diff --git a/backend/libinput/touch.c b/backend/libinput/touch.c new file mode 100644 index 00000000..55e8609a --- /dev/null +++ b/backend/libinput/touch.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include +#include +#include "backend/libinput.h" +#include "common/log.h" +#include "types.h" + +struct wlr_touch *wlr_libinput_touch_create( + struct libinput_device *device) { + assert(device); + return wlr_touch_create(NULL, NULL); +} diff --git a/include/backend/libinput.h b/include/backend/libinput.h index 7c318746..dd24fbb0 100644 --- a/include/backend/libinput.h +++ b/include/backend/libinput.h @@ -16,7 +16,7 @@ struct wlr_backend_state { struct libinput *libinput; struct wl_event_source *input_event; - list_t *keyboards; + list_t *devices; }; struct wlr_input_device_state { @@ -46,4 +46,17 @@ void handle_pointer_button(struct libinput_event *event, void handle_pointer_axis(struct libinput_event *event, struct libinput_device *device); +struct wlr_touch *wlr_libinput_touch_create( + struct libinput_device *device); +void handle_touch_down(struct libinput_event *event, + struct libinput_device *device); +void handle_touch_up(struct libinput_event *event, + struct libinput_device *device); +void handle_touch_motion(struct libinput_event *event, + struct libinput_device *device); +void handle_touch_cancel(struct libinput_event *event, + struct libinput_device *device); +void handle_touch_frame(struct libinput_event *event, + struct libinput_device *device); + #endif diff --git a/include/types.h b/include/types.h index 20f5ed13..5b20e2ed 100644 --- a/include/types.h +++ b/include/types.h @@ -34,6 +34,14 @@ struct wlr_pointer *wlr_pointer_create(struct wlr_pointer_impl *impl, struct wlr_pointer_state *state); void wlr_pointer_destroy(struct wlr_pointer *pointer); +struct wlr_touch_impl { + void (*destroy)(struct wlr_touch_state *state); +}; + +struct wlr_touch *wlr_touch_create(struct wlr_touch_impl *impl, + struct wlr_touch_state *state); +void wlr_touch_destroy(struct wlr_touch *touch); + struct wlr_input_device_impl { void (*destroy)(struct wlr_input_device_state *state); }; diff --git a/include/wlr/types.h b/include/wlr/types.h index af23152c..b4d69ccb 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -134,7 +134,22 @@ struct wlr_pointer_axis { double delta; }; -// TODO: touch +struct wlr_touch_state; +struct wlr_touch_impl; + +struct wlr_touch { + struct wlr_touch_state *state; + struct wlr_touch_impl *impl; + + struct { + struct wl_signal down; + struct wl_signal up; + struct wl_signal motion; + struct wl_signal cancel; + struct wl_signal frame; + } events; +}; + // TODO: tablet & tablet tool // TODO: gestures // TODO: switch @@ -164,6 +179,7 @@ struct wlr_input_device { void *_device; struct wlr_keyboard *keyboard; struct wlr_pointer *pointer; + struct wlr_touch *touch; }; }; diff --git a/types/CMakeLists.txt b/types/CMakeLists.txt index 91ab9da0..b158db39 100644 --- a/types/CMakeLists.txt +++ b/types/CMakeLists.txt @@ -7,6 +7,7 @@ add_library(wlr-types wlr_output.c wlr_keyboard.c wlr_pointer.c + wlr_touch.c wlr_input_device.c ) diff --git a/types/wlr_keyboard.c b/types/wlr_keyboard.c index db4f7ca7..32728c78 100644 --- a/types/wlr_keyboard.c +++ b/types/wlr_keyboard.c @@ -16,6 +16,8 @@ struct wlr_keyboard *wlr_keyboard_create(struct wlr_keyboard_impl *impl, void wlr_keyboard_destroy(struct wlr_keyboard *kb) { if (!kb) return; - kb->impl->destroy(kb->state); + if (kb->impl) { + kb->impl->destroy(kb->state); + } free(kb); } diff --git a/types/wlr_pointer.c b/types/wlr_pointer.c index b1364c34..9c40fe2f 100644 --- a/types/wlr_pointer.c +++ b/types/wlr_pointer.c @@ -17,8 +17,10 @@ struct wlr_pointer *wlr_pointer_create(struct wlr_pointer_impl *impl, return pointer; } -void wlr_pointer_destroy(struct wlr_pointer *kb) { - if (!kb) return; - kb->impl->destroy(kb->state); - free(kb); +void wlr_pointer_destroy(struct wlr_pointer *pointer) { + if (!pointer) return; + if (pointer->impl) { + pointer->impl->destroy(pointer->state); + } + free(pointer); } diff --git a/types/wlr_touch.c b/types/wlr_touch.c new file mode 100644 index 00000000..9c8b4b94 --- /dev/null +++ b/types/wlr_touch.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#include "types.h" + +struct wlr_touch *wlr_touch_create(struct wlr_touch_impl *impl, + struct wlr_touch_state *state) { + struct wlr_touch *touch = calloc(1, sizeof(struct wlr_touch)); + touch->impl = impl; + touch->state = state; + wl_signal_init(&touch->events.down); + wl_signal_init(&touch->events.up); + wl_signal_init(&touch->events.motion); + wl_signal_init(&touch->events.frame); + wl_signal_init(&touch->events.cancel); + return touch; +} + +void wlr_touch_destroy(struct wlr_touch *touch) { + if (!touch) return; + if (touch->impl) { + touch->impl->destroy(touch->state); + } + free(touch); +} From 3f24f8a1bee10fb3aadf8c57ca107fe5aaa7cffa Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 14 Jun 2017 14:50:09 -0400 Subject: [PATCH 20/25] Flesh out touch events and add demo --- backend/libinput/events.c | 15 +++++ backend/libinput/touch.c | 78 ++++++++++++++++++++++++ example/CMakeLists.txt | 13 ++++ example/shared.c | 86 ++++++++++++++++++++++++-- example/shared.h | 18 ++++++ example/touch.c | 122 +++++++++++++++++++++++++++++++++++++ include/backend/libinput.h | 2 - include/wlr/types.h | 29 ++++++++- types/wlr_touch.c | 1 - 9 files changed, 356 insertions(+), 8 deletions(-) create mode 100644 example/touch.c diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 4af8082f..f8413dae 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -139,6 +139,21 @@ void wlr_libinput_event(struct wlr_backend_state *state, case LIBINPUT_EVENT_POINTER_AXIS: handle_pointer_axis(event, device); break; + case LIBINPUT_EVENT_TOUCH_DOWN: + handle_touch_down(event, device); + break; + case LIBINPUT_EVENT_TOUCH_UP: + handle_touch_up(event, device); + break; + case LIBINPUT_EVENT_TOUCH_MOTION: + handle_touch_motion(event, device); + break; + case LIBINPUT_EVENT_TOUCH_CANCEL: + handle_touch_cancel(event, device); + break; + case LIBINPUT_EVENT_TOUCH_FRAME: + // no-op (at least for now) + break; default: wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); break; diff --git a/backend/libinput/touch.c b/backend/libinput/touch.c index 55e8609a..02c9cfef 100644 --- a/backend/libinput/touch.c +++ b/backend/libinput/touch.c @@ -13,3 +13,81 @@ struct wlr_touch *wlr_libinput_touch_create( assert(device); return wlr_touch_create(NULL, NULL); } + +void handle_touch_down(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TOUCH, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a touch event for a device with no touch?"); + return; + } + struct libinput_event_touch *tevent = + libinput_event_get_touch_event(event); + struct wlr_touch_down *wlr_event = + calloc(1, sizeof(struct wlr_touch_down)); + wlr_event->time_sec = libinput_event_touch_get_time(tevent); + wlr_event->time_usec = libinput_event_touch_get_time_usec(tevent); + wlr_event->slot = libinput_event_touch_get_slot(tevent); + wlr_event->x_mm = libinput_event_touch_get_x(tevent); + wlr_event->y_mm = libinput_event_touch_get_y(tevent); + libinput_device_get_size(device, &wlr_event->width_mm, &wlr_event->height_mm); + wl_signal_emit(&dev->touch->events.down, wlr_event); +} + +void handle_touch_up(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TOUCH, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a touch event for a device with no touch?"); + return; + } + struct libinput_event_touch *tevent = + libinput_event_get_touch_event(event); + struct wlr_touch_up *wlr_event = + calloc(1, sizeof(struct wlr_touch_up)); + wlr_event->time_sec = libinput_event_touch_get_time(tevent); + wlr_event->time_usec = libinput_event_touch_get_time_usec(tevent); + wlr_event->slot = libinput_event_touch_get_slot(tevent); + wl_signal_emit(&dev->touch->events.up, wlr_event); +} + +void handle_touch_motion(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TOUCH, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a touch event for a device with no touch?"); + return; + } + struct libinput_event_touch *tevent = + libinput_event_get_touch_event(event); + struct wlr_touch_motion *wlr_event = + calloc(1, sizeof(struct wlr_touch_motion)); + wlr_event->time_sec = libinput_event_touch_get_time(tevent); + wlr_event->time_usec = libinput_event_touch_get_time_usec(tevent); + wlr_event->slot = libinput_event_touch_get_slot(tevent); + wlr_event->x_mm = libinput_event_touch_get_x(tevent); + wlr_event->y_mm = libinput_event_touch_get_y(tevent); + libinput_device_get_size(device, &wlr_event->width_mm, &wlr_event->height_mm); + wl_signal_emit(&dev->touch->events.motion, wlr_event); +} + +void handle_touch_cancel(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TOUCH, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a touch event for a device with no touch?"); + return; + } + struct libinput_event_touch *tevent = + libinput_event_get_touch_event(event); + struct wlr_touch_cancel *wlr_event = + calloc(1, sizeof(struct wlr_touch_cancel)); + wlr_event->time_sec = libinput_event_touch_get_time(tevent); + wlr_event->time_usec = libinput_event_touch_get_time_usec(tevent); + wlr_event->slot = libinput_event_touch_get_slot(tevent); + wl_signal_emit(&dev->touch->events.cancel, wlr_event); +} diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index ef11a822..a6085392 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -40,3 +40,16 @@ target_link_libraries(pointer wlr-render ${XKBCOMMON_LIBRARIES} ) + +add_executable(touch + touch.c + shared.c + cat.c +) + +target_link_libraries(touch + wlr-backend + wlr-session + wlr-render + ${XKBCOMMON_LIBRARIES} +) diff --git a/example/shared.c b/example/shared.c index 6de16074..2592c924 100644 --- a/example/shared.c +++ b/example/shared.c @@ -114,6 +114,59 @@ static void pointer_add(struct wlr_input_device *device, struct compositor_state wl_list_insert(&state->pointers, &pstate->link); } +static void touch_down_notify(struct wl_listener *listener, void *data) { + struct wlr_touch_down *event = data; + struct touch_state *tstate = wl_container_of(listener, tstate, down); + if (tstate->compositor->touch_down_cb) { + tstate->compositor->touch_down_cb(tstate, event->slot, + event->x_mm, event->y_mm, event->width_mm, event->height_mm); + } +} + +static void touch_motion_notify(struct wl_listener *listener, void *data) { + struct wlr_touch_motion *event = data; + struct touch_state *tstate = wl_container_of(listener, tstate, motion); + if (tstate->compositor->touch_motion_cb) { + tstate->compositor->touch_motion_cb(tstate, event->slot, + event->x_mm, event->y_mm, event->width_mm, event->height_mm); + } +} + +static void touch_up_notify(struct wl_listener *listener, void *data) { + struct wlr_touch_up *event = data; + struct touch_state *tstate = wl_container_of(listener, tstate, up); + if (tstate->compositor->touch_up_cb) { + tstate->compositor->touch_up_cb(tstate, event->slot); + } +} + +static void touch_cancel_notify(struct wl_listener *listener, void *data) { + struct wlr_touch_cancel *event = data; + struct touch_state *tstate = wl_container_of(listener, tstate, cancel); + if (tstate->compositor->touch_cancel_cb) { + tstate->compositor->touch_cancel_cb(tstate, event->slot); + } +} + +static void touch_add(struct wlr_input_device *device, struct compositor_state *state) { + struct touch_state *tstate = calloc(sizeof(struct touch_state), 1); + tstate->device = device; + tstate->compositor = state; + wl_list_init(&tstate->down.link); + wl_list_init(&tstate->motion.link); + wl_list_init(&tstate->up.link); + wl_list_init(&tstate->cancel.link); + tstate->down.notify = touch_down_notify; + tstate->motion.notify = touch_motion_notify; + tstate->up.notify = touch_up_notify; + tstate->cancel.notify = touch_cancel_notify; + wl_signal_add(&device->touch->events.down, &tstate->down); + wl_signal_add(&device->touch->events.motion, &tstate->motion); + wl_signal_add(&device->touch->events.up, &tstate->up); + wl_signal_add(&device->touch->events.cancel, &tstate->cancel); + wl_list_insert(&state->touch, &tstate->link); +} + static void input_add_notify(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; struct compositor_state *state = wl_container_of(listener, state, input_add); @@ -124,6 +177,9 @@ static void input_add_notify(struct wl_listener *listener, void *data) { case WLR_INPUT_DEVICE_POINTER: pointer_add(device, state); break; + case WLR_INPUT_DEVICE_TOUCH: + touch_add(device, state); + break; default: break; } @@ -156,10 +212,28 @@ static void pointer_remove(struct wlr_input_device *device, struct compositor_st return; } wl_list_remove(&pstate->link); - //wl_list_remove(&pstate->motion.link); - wl_list_remove(&pstate->motion_absolute.link); - //wl_list_remove(&pstate->button.link); - //wl_list_remove(&pstate->axis.link); + wl_list_remove(&pstate->motion.link); + //wl_list_remove(&pstate->motion_absolute.link); + wl_list_remove(&pstate->button.link); + wl_list_remove(&pstate->axis.link); +} + +static void touch_remove(struct wlr_input_device *device, struct compositor_state *state) { + struct touch_state *tstate = NULL, *_tstate; + wl_list_for_each(_tstate, &state->touch, link) { + if (_tstate->device == device) { + tstate = _tstate; + break; + } + } + if (!tstate) { + return; + } + wl_list_remove(&tstate->link); + wl_list_remove(&tstate->down.link); + wl_list_remove(&tstate->motion.link); + wl_list_remove(&tstate->up.link); + wl_list_remove(&tstate->cancel.link); } static void input_remove_notify(struct wl_listener *listener, void *data) { @@ -172,6 +246,9 @@ static void input_remove_notify(struct wl_listener *listener, void *data) { case WLR_INPUT_DEVICE_POINTER: pointer_remove(device, state); break; + case WLR_INPUT_DEVICE_TOUCH: + touch_remove(device, state); + break; default: break; } @@ -245,6 +322,7 @@ void compositor_init(struct compositor_state *state) { wl_list_init(&state->keyboards); wl_list_init(&state->pointers); + wl_list_init(&state->touch); wl_list_init(&state->input_add.link); state->input_add.notify = input_add_notify; wl_list_init(&state->input_remove.link); diff --git a/example/shared.h b/example/shared.h index 7f0dade5..d09bcd0e 100644 --- a/example/shared.h +++ b/example/shared.h @@ -39,6 +39,17 @@ struct pointer_state { void *data; }; +struct touch_state { + struct compositor_state *compositor; + struct wlr_input_device *device; + struct wl_listener down; + struct wl_listener up; + struct wl_listener motion; + struct wl_listener cancel; + struct wl_list link; + void *data; +}; + struct compositor_state { void (*output_add_cb)(struct output_state *s); void (*keyboard_add_cb)(struct keyboard_state *s); @@ -55,6 +66,12 @@ struct compositor_state { enum wlr_axis_source source, enum wlr_axis_orientation orientation, double delta); + void (*touch_down_cb)(struct touch_state *s, int32_t slot, + double x, double y, double width, double height); + void (*touch_motion_cb)(struct touch_state *s, int32_t slot, + double x, double y, double width, double height); + void (*touch_up_cb)(struct touch_state *s, int32_t slot); + void (*touch_cancel_cb)(struct touch_state *s, int32_t slot); struct wl_display *display; struct wl_event_loop *event_loop; @@ -63,6 +80,7 @@ struct compositor_state { struct wl_list keyboards; struct wl_list pointers; + struct wl_list touch; struct wl_listener input_add; struct wl_listener input_remove; diff --git a/example/touch.c b/example/touch.c new file mode 100644 index 00000000..7f4f3800 --- /dev/null +++ b/example/touch.c @@ -0,0 +1,122 @@ +#define _POSIX_C_SOURCE 199309L +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "shared.h" +#include "cat.h" + +struct sample_state { + struct wlr_renderer *renderer; + struct wlr_surface *cat_texture; + list_t *touch_points; +}; + +struct touch_point { + int32_t slot; + double x, y; +}; + +static void handle_output_frame(struct output_state *output, struct timespec *ts) { + struct compositor_state *state = output->compositor; + struct sample_state *sample = state->data; + struct wlr_output *wlr_output = output->output; + + int32_t width, height; + wlr_output_effective_resolution(wlr_output, &width, &height); + wlr_renderer_begin(sample->renderer, wlr_output); + + float matrix[16]; + for (size_t i = 0; i < sample->touch_points->length; ++i) { + struct touch_point *p = sample->touch_points->items[i]; + wlr_surface_get_matrix(sample->cat_texture, &matrix, + &wlr_output->transform_matrix, + (int)(p->x * width) - sample->cat_texture->width / 2, + (int)(p->y * height) - sample->cat_texture->height / 2); + wlr_render_with_matrix(sample->renderer, + sample->cat_texture, &matrix); + } + + wlr_renderer_end(sample->renderer); +} + +static void handle_keyboard_key(struct keyboard_state *kbstate, + xkb_keysym_t sym, enum wlr_key_state key_state) { + if (sym == XKB_KEY_Escape) { + kbstate->compositor->exit = true; + } +} + +static void handle_touch_down(struct touch_state *tstate, int32_t slot, + double x, double y, double width, double height) { + struct sample_state *sample = tstate->compositor->data; + struct touch_point *point = calloc(1, sizeof(struct touch_state)); + point->slot = slot; + point->x = x / width; + point->y = y / height; + list_add(sample->touch_points, point); +} + +static void handle_touch_up(struct touch_state *tstate, int32_t slot) { + struct sample_state *sample = tstate->compositor->data; + for (size_t i = 0; i < sample->touch_points->length; ++i) { + struct touch_point *point = sample->touch_points->items[i]; + if (point->slot == slot) { + list_del(sample->touch_points, i); + break; + } + } +} + +static void handle_touch_motion(struct touch_state *tstate, int32_t slot, + double x, double y, double width, double height) { + struct sample_state *sample = tstate->compositor->data; + for (size_t i = 0; i < sample->touch_points->length; ++i) { + struct touch_point *point = sample->touch_points->items[i]; + if (point->slot == slot) { + point->x = x / width; + point->y = y / height; + break; + } + } +} + +int main(int argc, char *argv[]) { + struct sample_state state = { + .touch_points = list_create() + }; + struct compositor_state compositor; + + compositor_init(&compositor); + compositor.output_frame_cb = handle_output_frame; + compositor.keyboard_key_cb = handle_keyboard_key; + compositor.touch_down_cb = handle_touch_down; + compositor.touch_up_cb = handle_touch_up; + compositor.touch_motion_cb = handle_touch_motion; + + state.renderer = wlr_gles3_renderer_init(); + state.cat_texture = wlr_render_surface_init(state.renderer); + wlr_surface_attach_pixels(state.cat_texture, GL_RGB, + cat_tex.width, cat_tex.height, cat_tex.pixel_data); + + compositor.data = &state; + compositor_run(&compositor); + + wlr_surface_destroy(state.cat_texture); + wlr_renderer_destroy(state.renderer); +} diff --git a/include/backend/libinput.h b/include/backend/libinput.h index dd24fbb0..2427ae5c 100644 --- a/include/backend/libinput.h +++ b/include/backend/libinput.h @@ -56,7 +56,5 @@ void handle_touch_motion(struct libinput_event *event, struct libinput_device *device); void handle_touch_cancel(struct libinput_event *event, struct libinput_device *device); -void handle_touch_frame(struct libinput_event *event, - struct libinput_device *device); #endif diff --git a/include/wlr/types.h b/include/wlr/types.h index b4d69ccb..4763013a 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -146,10 +146,37 @@ struct wlr_touch { struct wl_signal up; struct wl_signal motion; struct wl_signal cancel; - struct wl_signal frame; } events; }; +struct wlr_touch_down { + uint32_t time_sec; + uint64_t time_usec; + int32_t slot; + double x_mm, y_mm; + double width_mm, height_mm; +}; + +struct wlr_touch_up { + uint32_t time_sec; + uint64_t time_usec; + int32_t slot; +}; + +struct wlr_touch_motion { + uint32_t time_sec; + uint64_t time_usec; + int32_t slot; + double x_mm, y_mm; + double width_mm, height_mm; +}; + +struct wlr_touch_cancel { + uint32_t time_sec; + uint64_t time_usec; + int32_t slot; +}; + // TODO: tablet & tablet tool // TODO: gestures // TODO: switch diff --git a/types/wlr_touch.c b/types/wlr_touch.c index 9c8b4b94..0970f70f 100644 --- a/types/wlr_touch.c +++ b/types/wlr_touch.c @@ -13,7 +13,6 @@ struct wlr_touch *wlr_touch_create(struct wlr_touch_impl *impl, wl_signal_init(&touch->events.down); wl_signal_init(&touch->events.up); wl_signal_init(&touch->events.motion); - wl_signal_init(&touch->events.frame); wl_signal_init(&touch->events.cancel); return touch; } From e65f83d7f2f29f54b0cae27807e3b6a9b2299a10 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 14 Jun 2017 16:17:05 -0400 Subject: [PATCH 21/25] Add more DRM info to wlr_output Yes I know this is the libinput branch, I thought this would be useful for a libinput feature (but it wasn't) --- backend/drm/drm.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index d6a3f8a2..225035b7 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -457,6 +457,31 @@ void wlr_drm_scan_connectors(struct wlr_backend_state *state) { snprintf(wlr_output->name, sizeof(wlr_output->name), "%s-%"PRIu32, conn_name[conn->connector_type], conn->connector_type_id); + wlr_output->phys_width = conn->mmWidth; + wlr_output->phys_height = conn->mmHeight; + switch (conn->subpixel) { + case DRM_MODE_SUBPIXEL_UNKNOWN: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN; + break; + case DRM_MODE_SUBPIXEL_HORIZONTAL_RGB: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB; + break; + case DRM_MODE_SUBPIXEL_HORIZONTAL_BGR: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR; + break; + case DRM_MODE_SUBPIXEL_VERTICAL_RGB: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_VERTICAL_RGB; + break; + case DRM_MODE_SUBPIXEL_VERTICAL_BGR: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_VERTICAL_BGR; + break; + case DRM_MODE_SUBPIXEL_NONE: + default: + wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_NONE; + break; + } + strcpy(wlr_output->make, "drm"); + strcpy(wlr_output->model, "unknown"); drmModeEncoder *curr_enc = drmModeGetEncoder(state->fd, conn->encoder_id); if (curr_enc) { From 4a9966b1a47d497ccc9473a24ba56b3d0eef72d2 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 15 Jun 2017 14:32:28 -0400 Subject: [PATCH 22/25] Implement wlr_tablet_tool --- backend/CMakeLists.txt | 1 + backend/libinput/events.c | 17 +++- backend/libinput/tablet_tool.c | 154 +++++++++++++++++++++++++++++++++ include/backend/libinput.h | 11 +++ include/types.h | 8 ++ include/wlr/types.h | 80 ++++++++++++++++- types/CMakeLists.txt | 3 +- types/wlr_tablet_tool.c | 26 ++++++ 8 files changed, 295 insertions(+), 5 deletions(-) create mode 100644 backend/libinput/tablet_tool.c create mode 100644 types/wlr_tablet_tool.c diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 8272e039..6ffa2042 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -19,6 +19,7 @@ add_library(wlr-backend libinput/keyboard.c libinput/pointer.c libinput/touch.c + libinput/tablet_tool.c multi/backend.c backend.c diff --git a/backend/libinput/events.c b/backend/libinput/events.c index f8413dae..8ebec63b 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -85,7 +85,10 @@ static void handle_device_added(struct wlr_backend_state *state, wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_TOOL)) { - // TODO + struct wlr_input_device *wlr_device = allocate_device(state, + device, devices, WLR_INPUT_DEVICE_TABLET_TOOL); + wlr_device->tablet_tool = wlr_libinput_tablet_tool_create(device); + wl_signal_emit(&state->backend->events.input_add, wlr_device); } if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD)) { // TODO @@ -154,6 +157,18 @@ void wlr_libinput_event(struct wlr_backend_state *state, case LIBINPUT_EVENT_TOUCH_FRAME: // no-op (at least for now) break; + case LIBINPUT_EVENT_TABLET_TOOL_AXIS: + handle_tablet_tool_axis(event, device); + break; + case LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY: + handle_tablet_tool_proximity(event, device); + break; + case LIBINPUT_EVENT_TABLET_TOOL_TIP: + handle_tablet_tool_tip(event, device); + break; + case LIBINPUT_EVENT_TABLET_TOOL_BUTTON: + handle_tablet_tool_button(event, device); + break; default: wlr_log(L_DEBUG, "Unknown libinput event %d", event_type); break; diff --git a/backend/libinput/tablet_tool.c b/backend/libinput/tablet_tool.c new file mode 100644 index 00000000..276c263c --- /dev/null +++ b/backend/libinput/tablet_tool.c @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include +#include +#include "backend/libinput.h" +#include "common/log.h" +#include "types.h" + +struct wlr_tablet_tool *wlr_libinput_tablet_tool_create( + struct libinput_device *device) { + assert(device); + return wlr_tablet_tool_create(NULL, NULL); +} + +void handle_tablet_tool_axis(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_TOOL, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); + return; + } + struct libinput_event_tablet_tool *tevent = + libinput_event_get_tablet_tool_event(event); + struct wlr_tablet_tool_axis *wlr_event = + calloc(1, sizeof(struct wlr_tablet_tool_axis)); + wlr_event->time_sec = libinput_event_tablet_tool_get_time(tevent); + wlr_event->time_usec = libinput_event_tablet_tool_get_time_usec(tevent); + libinput_device_get_size(device, &wlr_event->width_mm, &wlr_event->height_mm); + if (libinput_event_tablet_tool_x_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_X; + wlr_event->x_mm = libinput_event_tablet_tool_get_x(tevent); + } + if (libinput_event_tablet_tool_y_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_Y; + wlr_event->y_mm = libinput_event_tablet_tool_get_y(tevent); + } + if (libinput_event_tablet_tool_pressure_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_PRESSURE; + wlr_event->pressure = libinput_event_tablet_tool_get_pressure(tevent); + } + if (libinput_event_tablet_tool_distance_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_DISTANCE; + wlr_event->distance = libinput_event_tablet_tool_get_distance(tevent); + } + if (libinput_event_tablet_tool_tilt_x_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_TILT_X; + wlr_event->tilt_x = libinput_event_tablet_tool_get_tilt_x(tevent); + } + if (libinput_event_tablet_tool_tilt_y_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_TILT_Y; + wlr_event->tilt_y = libinput_event_tablet_tool_get_tilt_y(tevent); + } + if (libinput_event_tablet_tool_rotation_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_ROTATION; + wlr_event->rotation = libinput_event_tablet_tool_get_rotation(tevent); + } + if (libinput_event_tablet_tool_slider_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_SLIDER; + wlr_event->slider = libinput_event_tablet_tool_get_slider_position(tevent); + } + if (libinput_event_tablet_tool_wheel_has_changed(tevent)) { + wlr_event->updated_axes |= WLR_TABLET_TOOL_AXIS_WHEEL; + wlr_event->wheel_delta = libinput_event_tablet_tool_get_wheel_delta(tevent); + } + wl_signal_emit(&dev->tablet_tool->events.axis, wlr_event); +} + +void handle_tablet_tool_proximity(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_TOOL, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); + return; + } + // Proximity events contain axis information. We update this information + // before we send the proximity event + handle_tablet_tool_axis(event, device); + struct libinput_event_tablet_tool *tevent = + libinput_event_get_tablet_tool_event(event); + struct wlr_tablet_tool_proximity *wlr_event = + calloc(1, sizeof(struct wlr_tablet_tool_proximity)); + wlr_event->time_sec = libinput_event_tablet_tool_get_time(tevent); + wlr_event->time_usec = libinput_event_tablet_tool_get_time_usec(tevent); + switch (libinput_event_tablet_tool_get_proximity_state(tevent)) { + case LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT: + wlr_event->state = WLR_TABLET_TOOL_PROXIMITY_OUT; + break; + case LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN: + wlr_event->state = WLR_TABLET_TOOL_PROXIMITY_IN; + break; + } + wl_signal_emit(&dev->tablet_tool->events.proximity, wlr_event); +} + +void handle_tablet_tool_tip(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_TOOL, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); + return; + } + // Tip events contain axis information. We update this information + // before we send the proximity event + handle_tablet_tool_axis(event, device); + struct libinput_event_tablet_tool *tevent = + libinput_event_get_tablet_tool_event(event); + struct wlr_tablet_tool_tip *wlr_event = + calloc(1, sizeof(struct wlr_tablet_tool_tip)); + wlr_event->time_sec = libinput_event_tablet_tool_get_time(tevent); + wlr_event->time_usec = libinput_event_tablet_tool_get_time_usec(tevent); + switch (libinput_event_tablet_tool_get_tip_state(tevent)) { + case LIBINPUT_TABLET_TOOL_TIP_UP: + wlr_event->state = WLR_TABLET_TOOL_TIP_UP; + break; + case LIBINPUT_TABLET_TOOL_TIP_DOWN: + wlr_event->state = WLR_TABLET_TOOL_TIP_DOWN; + break; + } + wl_signal_emit(&dev->tablet_tool->events.tip, wlr_event); +} + +void handle_tablet_tool_button(struct libinput_event *event, + struct libinput_device *device) { + struct wlr_input_device *dev = + get_appropriate_device(WLR_INPUT_DEVICE_TABLET_TOOL, device); + if (!dev) { + wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); + return; + } + // Tip events contain axis information. We update this information + // before we send the proximity event + handle_tablet_tool_axis(event, device); + struct libinput_event_tablet_tool *tevent = + libinput_event_get_tablet_tool_event(event); + struct wlr_tablet_tool_button *wlr_event = + calloc(1, sizeof(struct wlr_tablet_tool_button)); + wlr_event->time_sec = libinput_event_tablet_tool_get_time(tevent); + wlr_event->time_usec = libinput_event_tablet_tool_get_time_usec(tevent); + wlr_event->button = libinput_event_tablet_tool_get_button(tevent); + switch (libinput_event_tablet_tool_get_button_state(tevent)) { + case LIBINPUT_BUTTON_STATE_RELEASED: + wlr_event->state = WLR_BUTTON_RELEASED; + break; + case LIBINPUT_BUTTON_STATE_PRESSED: + wlr_event->state = WLR_BUTTON_PRESSED; + break; + } + wl_signal_emit(&dev->tablet_tool->events.button, wlr_event); +} diff --git a/include/backend/libinput.h b/include/backend/libinput.h index 2427ae5c..80f57177 100644 --- a/include/backend/libinput.h +++ b/include/backend/libinput.h @@ -57,4 +57,15 @@ void handle_touch_motion(struct libinput_event *event, void handle_touch_cancel(struct libinput_event *event, struct libinput_device *device); +struct wlr_tablet_tool *wlr_libinput_tablet_tool_create( + struct libinput_device *device); +void handle_tablet_tool_axis(struct libinput_event *event, + struct libinput_device *device); +void handle_tablet_tool_proximity(struct libinput_event *event, + struct libinput_device *device); +void handle_tablet_tool_tip(struct libinput_event *event, + struct libinput_device *device); +void handle_tablet_tool_button(struct libinput_event *event, + struct libinput_device *device); + #endif diff --git a/include/types.h b/include/types.h index 5b20e2ed..efead03c 100644 --- a/include/types.h +++ b/include/types.h @@ -42,6 +42,14 @@ struct wlr_touch *wlr_touch_create(struct wlr_touch_impl *impl, struct wlr_touch_state *state); void wlr_touch_destroy(struct wlr_touch *touch); +struct wlr_tablet_tool_impl { + void (*destroy)(struct wlr_tablet_tool_state *tool); +}; + +struct wlr_tablet_tool *wlr_tablet_tool_create(struct wlr_tablet_tool_impl *impl, + struct wlr_tablet_tool_state *state); +void wlr_tablet_tool_destroy(struct wlr_tablet_tool *tool); + struct wlr_input_device_impl { void (*destroy)(struct wlr_input_device_state *state); }; diff --git a/include/wlr/types.h b/include/wlr/types.h index 4763013a..aae76f06 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -177,15 +177,88 @@ struct wlr_touch_cancel { int32_t slot; }; -// TODO: tablet & tablet tool -// TODO: gestures +struct wlr_tablet_tool_impl; +struct wlr_tablet_tool_state; + +struct wlr_tablet_tool { + struct wlr_tablet_tool_impl *impl; + struct wlr_tablet_tool_state *state; + + struct { + struct wl_signal axis; + struct wl_signal proximity; + struct wl_signal tip; + struct wl_signal button; + } events; +}; + +enum wlr_tablet_tool_axes { + WLR_TABLET_TOOL_AXIS_X = 1, + WLR_TABLET_TOOL_AXIS_Y = 2, + WLR_TABLET_TOOL_AXIS_DISTANCE = 4, + WLR_TABLET_TOOL_AXIS_PRESSURE = 8, + WLR_TABLET_TOOL_AXIS_TILT_X = 16, + WLR_TABLET_TOOL_AXIS_TILT_Y = 32, + WLR_TABLET_TOOL_AXIS_ROTATION = 64, + WLR_TABLET_TOOL_AXIS_SLIDER = 128, + WLR_TABLET_TOOL_AXIS_WHEEL = 256, +}; + +struct wlr_tablet_tool_axis { + uint32_t time_sec; + uint64_t time_usec; + uint32_t updated_axes; + double x_mm, y_mm; + double width_mm, height_mm; + double pressure; + double distance; + double tilt_x, tilt_y; + double rotation; + double slider; + double wheel_delta; +}; + +enum wlr_tablet_tool_proximity_state { + WLR_TABLET_TOOL_PROXIMITY_OUT, + WLR_TABLET_TOOL_PROXIMITY_IN, +}; + +struct wlr_tablet_tool_proximity { + uint32_t time_sec; + uint64_t time_usec; + double x, y; + double width_mm, height_mm; + enum wlr_tablet_tool_proximity_state state; +}; + +enum wlr_tablet_tool_tip_state { + WLR_TABLET_TOOL_TIP_UP, + WLR_TABLET_TOOL_TIP_DOWN, +}; + +struct wlr_tablet_tool_tip { + uint32_t time_sec; + uint64_t time_usec; + double x, y; + double width_mm, height_mm; + enum wlr_tablet_tool_tip_state state; +}; + +struct wlr_tablet_tool_button { + uint32_t time_sec; + uint64_t time_usec; + uint32_t button; + enum wlr_button_state state; +}; + +// TODO: tablet pad // TODO: switch enum wlr_input_device_type { WLR_INPUT_DEVICE_KEYBOARD, WLR_INPUT_DEVICE_POINTER, WLR_INPUT_DEVICE_TOUCH, - WLR_INPUT_DEVICE_TABLET_PEN, + WLR_INPUT_DEVICE_TABLET_TOOL, WLR_INPUT_DEVICE_TABLET_PAD, WLR_INPUT_DEVICE_GESTURE, WLR_INPUT_DEVICE_SWITCH, @@ -207,6 +280,7 @@ struct wlr_input_device { struct wlr_keyboard *keyboard; struct wlr_pointer *pointer; struct wlr_touch *touch; + struct wlr_tablet_tool *tablet_tool; }; }; diff --git a/types/CMakeLists.txt b/types/CMakeLists.txt index b158db39..b10966ec 100644 --- a/types/CMakeLists.txt +++ b/types/CMakeLists.txt @@ -5,10 +5,11 @@ include_directories( add_library(wlr-types wlr_output.c + wlr_input_device.c wlr_keyboard.c wlr_pointer.c wlr_touch.c - wlr_input_device.c + wlr_tablet_tool.c ) target_link_libraries(wlr-types diff --git a/types/wlr_tablet_tool.c b/types/wlr_tablet_tool.c new file mode 100644 index 00000000..1c1d21ee --- /dev/null +++ b/types/wlr_tablet_tool.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include +#include "types.h" + +struct wlr_tablet_tool *wlr_tablet_tool_create(struct wlr_tablet_tool_impl *impl, + struct wlr_tablet_tool_state *state) { + struct wlr_tablet_tool *tool = calloc(1, sizeof(struct wlr_tablet_tool)); + tool->impl = impl; + tool->state = state; + wl_signal_init(&tool->events.axis); + wl_signal_init(&tool->events.proximity); + wl_signal_init(&tool->events.tip); + wl_signal_init(&tool->events.button); + return tool; +} + +void wlr_tablet_tool_destroy(struct wlr_tablet_tool *tool) { + if (!tool) return; + if (tool->impl) { + tool->impl->destroy(tool->state); + } + free(tool); +} From 2443a070e75e33285b6d5ed0ce89c989956b9065 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 15 Jun 2017 15:31:13 -0400 Subject: [PATCH 23/25] Add colored quad and ellipse rendering primitives --- example/CMakeLists.txt | 12 ++++++ example/tablet.c | 63 ++++++++++++++++++++++++++++ include/render/gles3.h | 3 ++ include/wlr/render.h | 10 +++++ include/wlr/render/interface.h | 4 ++ render/gles3/renderer.c | 35 ++++++++++++++++ render/gles3/shaders.c | 75 +++++++++++++++++++++++++--------- render/wlr_renderer.c | 10 +++++ 8 files changed, 192 insertions(+), 20 deletions(-) create mode 100644 example/tablet.c diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index a6085392..fff2e49b 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -53,3 +53,15 @@ target_link_libraries(touch wlr-render ${XKBCOMMON_LIBRARIES} ) + +add_executable(tablet + tablet.c + shared.c +) + +target_link_libraries(tablet + wlr-backend + wlr-session + wlr-render + ${XKBCOMMON_LIBRARIES} +) diff --git a/example/tablet.c b/example/tablet.c new file mode 100644 index 00000000..9a498438 --- /dev/null +++ b/example/tablet.c @@ -0,0 +1,63 @@ +#define _POSIX_C_SOURCE 199309L +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "shared.h" +#include "cat.h" + +struct sample_state { + struct wlr_renderer *renderer; +}; + +static void handle_output_frame(struct output_state *output, struct timespec *ts) { + struct compositor_state *state = output->compositor; + struct sample_state *sample = state->data; + struct wlr_output *wlr_output = output->output; + + wlr_renderer_begin(sample->renderer, wlr_output); + + float matrix[16]; + float color[4] = { 0, 1.0, 0, 1.0 }; + wlr_matrix_scale(&matrix, 128, 128, 1); + wlr_matrix_mul(&wlr_output->transform_matrix, &matrix, &matrix); + wlr_render_colored_ellipse(sample->renderer, &color, &matrix); + + wlr_renderer_end(sample->renderer); +} + +static void handle_keyboard_key(struct keyboard_state *kbstate, + xkb_keysym_t sym, enum wlr_key_state key_state) { + if (sym == XKB_KEY_Escape) { + kbstate->compositor->exit = true; + } +} + +int main(int argc, char *argv[]) { + struct sample_state state = { 0 }; + struct compositor_state compositor; + + compositor_init(&compositor); + compositor.output_frame_cb = handle_output_frame; + compositor.keyboard_key_cb = handle_keyboard_key; + + state.renderer = wlr_gles3_renderer_init(); + + compositor.data = &state; + compositor_run(&compositor); + + wlr_renderer_destroy(state.renderer); +} diff --git a/include/render/gles3.h b/include/render/gles3.h index 5efb197e..9acc1088 100644 --- a/include/render/gles3.h +++ b/include/render/gles3.h @@ -13,6 +13,9 @@ struct wlr_surface_state { struct wlr_surface *gles3_surface_init(); +extern const GLchar quad_vertex_src[]; +extern const GLchar quad_fragment_src[]; +extern const GLchar ellipse_fragment_src[]; extern const GLchar vertex_src[]; extern const GLchar fragment_src_RGB[]; extern const GLchar fragment_src_RGBA[]; diff --git a/include/wlr/render.h b/include/wlr/render.h index 88aa615e..3c0bd04b 100644 --- a/include/wlr/render.h +++ b/include/wlr/render.h @@ -28,6 +28,16 @@ struct wlr_surface *wlr_render_surface_init(struct wlr_renderer *r); */ bool wlr_render_with_matrix(struct wlr_renderer *r, struct wlr_surface *surface, const float (*matrix)[16]); +/** + * Renders a solid quad in the specified color. + */ +void wlr_render_colored_quad(struct wlr_renderer *r, + const float (*color)[4], const float (*matrix)[16]); +/** + * Renders a solid ellipse in the specified color. + */ +void wlr_render_colored_ellipse(struct wlr_renderer *r, + const float (*color)[4], const float (*matrix)[16]); /** * Destroys this wlr_renderer. Surfaces must be destroyed separately. */ diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 80471ac8..a934f49e 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -19,6 +19,10 @@ struct wlr_renderer_impl { struct wlr_surface *(*surface_init)(struct wlr_renderer_state *state); bool (*render_with_matrix)(struct wlr_renderer_state *state, struct wlr_surface *surface, const float (*matrix)[16]); + void (*render_quad)(struct wlr_renderer_state *state, + const float (*color)[4], const float (*matrix)[16]); + void (*render_ellipse)(struct wlr_renderer_state *state, + const float (*color)[4], const float (*matrix)[16]); void (*destroy)(struct wlr_renderer_state *state); }; diff --git a/render/gles3/renderer.c b/render/gles3/renderer.c index 74754d1b..b0056193 100644 --- a/render/gles3/renderer.c +++ b/render/gles3/renderer.c @@ -13,6 +13,8 @@ static struct { bool initialized; GLuint rgb, rgba; + GLuint quad; + GLuint ellipse; } shaders; static GLuint vao, vbo, ebo; @@ -28,6 +30,9 @@ static bool compile_shader(GLuint type, const GLchar *src, GLuint *shader) { GL_CALL(glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &loglen)); GLchar msg[loglen]; GL_CALL(glGetShaderInfoLog(*shader, loglen, &loglen, msg)); + wlr_log(L_ERROR, "Shader compilation failed"); + wlr_log(L_ERROR, "%s", msg); + exit(1); return false; } return true; @@ -60,6 +65,12 @@ static void init_default_shaders() { if (!compile_program(vertex_src, fragment_src_RGBA, &shaders.rgba)) { goto error; } + if (!compile_program(quad_vertex_src, quad_fragment_src, &shaders.quad)) { + goto error; + } + if (!compile_program(quad_vertex_src, ellipse_fragment_src, &shaders.ellipse)) { + goto error; + } return; error: wlr_log(L_ERROR, "Failed to set up default shaders!"); @@ -141,6 +152,28 @@ static bool wlr_gles3_render_surface(struct wlr_renderer_state *state, return true; } +static void wlr_gles3_render_quad(struct wlr_renderer_state *state, + const float (*color)[4], const float (*matrix)[16]) { + GL_CALL(glUseProgram(shaders.quad)); + GL_CALL(glBindVertexArray(vao)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); + GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); + GL_CALL(glUniform4f(1, (*color)[0], (*color)[1], (*color)[2], (*color)[3])); + GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)); +} + +static void wlr_gles3_render_ellipse(struct wlr_renderer_state *state, + const float (*color)[4], const float (*matrix)[16]) { + GL_CALL(glUseProgram(shaders.ellipse)); + GL_CALL(glBindVertexArray(vao)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)); + GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); + GL_CALL(glUniform4f(1, (*color)[0], (*color)[1], (*color)[2], (*color)[3])); + GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)); +} + static void wlr_gles3_destroy(struct wlr_renderer_state *state) { // no-op } @@ -150,6 +183,8 @@ static struct wlr_renderer_impl wlr_renderer_impl = { .end = wlr_gles3_end, .surface_init = wlr_gles3_surface_init, .render_with_matrix = wlr_gles3_render_surface, + .render_quad = wlr_gles3_render_quad, + .render_ellipse = wlr_gles3_render_ellipse, .destroy = wlr_gles3_destroy }; diff --git a/render/gles3/shaders.c b/render/gles3/shaders.c index f53ef385..dd7f790f 100644 --- a/render/gles3/shaders.c +++ b/render/gles3/shaders.c @@ -1,28 +1,63 @@ #include "render/gles3.h" #include +// Colored quads +const GLchar quad_vertex_src[] = +"uniform mat4 proj;" +"uniform vec4 color;" +"attribute vec2 pos;" +"attribute vec2 texcoord;" +"varying vec4 v_color;" +"varying vec2 v_texcoord;" +"void main() {" +" gl_Position = proj * vec4(pos, 0.0, 1.0);" +" v_color = color;" +" v_texcoord = texcoord;" +"}"; + +const GLchar quad_fragment_src[] = +"precision mediump float;" +"varying vec4 v_color;" +"varying vec2 v_texcoord;" +"void main() {" +" gl_FragColor = v_color;" +"}"; + +// Colored ellipses (TODO) + +const GLchar ellipse_fragment_src[] = +"precision mediump float;" +"varying vec4 v_color;" +"varying vec2 v_texcoord;" +"void main() {" +" float l = length(v_texcoord - vec2(0.5, 0.5));" +" if (l > 0.5) discard;" +" gl_FragColor = v_color;" +"}"; + +// Textured quads const GLchar vertex_src[] = -"uniform mat4 proj;\n" -"attribute vec2 pos;\n" -"attribute vec2 texcoord;\n" -"varying vec2 v_texcoord;\n" -"void main() {\n" -" gl_Position = proj * vec4(pos, 0.0, 1.0);\n" -" v_texcoord = texcoord;\n" -"}\n"; +"uniform mat4 proj;" +"attribute vec2 pos;" +"attribute vec2 texcoord;" +"varying vec2 v_texcoord;" +"void main() {" +" gl_Position = proj * vec4(pos, 0.0, 1.0);" +" v_texcoord = texcoord;" +"}"; const GLchar fragment_src_RGB[] = -"precision mediump float;\n" -"varying vec2 v_texcoord;\n" -"uniform sampler2D tex;\n" -"void main() {\n" -" gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0);\n" -"}\n"; +"precision mediump float;" +"varying vec2 v_texcoord;" +"uniform sampler2D tex;" +"void main() {" +" gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0);" +"}"; const GLchar fragment_src_RGBA[] = -"precision mediump float;\n" -"varying vec2 v_texcoord;\n" -"uniform sampler2D tex;\n" -"void main() {\n" -" gl_FragColor = texture2D(tex, v_texcoord);\n" -"}\n"; +"precision mediump float;" +"varying vec2 v_texcoord;" +"uniform sampler2D tex;" +"void main() {" +" gl_FragColor = texture2D(tex, v_texcoord);" +"}"; diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index 2fd2fd31..f48bb3eb 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -31,3 +31,13 @@ bool wlr_render_with_matrix(struct wlr_renderer *r, struct wlr_surface *surface, const float (*matrix)[16]) { return r->impl->render_with_matrix(r->state, surface, matrix); } + +void wlr_render_colored_quad(struct wlr_renderer *r, + const float (*color)[4], const float (*matrix)[16]) { + r->impl->render_quad(r->state, color, matrix); +} + +void wlr_render_colored_ellipse(struct wlr_renderer *r, + const float (*color)[4], const float (*matrix)[16]) { + r->impl->render_ellipse(r->state, color, matrix); +} From def3d7c64f68d59c6daec5974afc3ca84fa4bda9 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 15 Jun 2017 16:15:12 -0400 Subject: [PATCH 24/25] Add tablet example --- backend/libinput/tablet_tool.c | 6 +-- example/shared.c | 68 +++++++++++++++++++++++++ example/shared.h | 20 ++++++++ example/tablet.c | 92 +++++++++++++++++++++++++++++++--- 4 files changed, 175 insertions(+), 11 deletions(-) diff --git a/backend/libinput/tablet_tool.c b/backend/libinput/tablet_tool.c index 276c263c..e8a3bc7d 100644 --- a/backend/libinput/tablet_tool.c +++ b/backend/libinput/tablet_tool.c @@ -76,9 +76,6 @@ void handle_tablet_tool_proximity(struct libinput_event *event, wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); return; } - // Proximity events contain axis information. We update this information - // before we send the proximity event - handle_tablet_tool_axis(event, device); struct libinput_event_tablet_tool *tevent = libinput_event_get_tablet_tool_event(event); struct wlr_tablet_tool_proximity *wlr_event = @@ -91,6 +88,7 @@ void handle_tablet_tool_proximity(struct libinput_event *event, break; case LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN: wlr_event->state = WLR_TABLET_TOOL_PROXIMITY_IN; + handle_tablet_tool_axis(event, device); break; } wl_signal_emit(&dev->tablet_tool->events.proximity, wlr_event); @@ -104,8 +102,6 @@ void handle_tablet_tool_tip(struct libinput_event *event, wlr_log(L_DEBUG, "Got a tablet tool event for a device with no tablet tools?"); return; } - // Tip events contain axis information. We update this information - // before we send the proximity event handle_tablet_tool_axis(event, device); struct libinput_event_tablet_tool *tevent = libinput_event_get_tablet_tool_event(event); diff --git a/example/shared.c b/example/shared.c index 2592c924..88f2b05f 100644 --- a/example/shared.c +++ b/example/shared.c @@ -167,6 +167,50 @@ static void touch_add(struct wlr_input_device *device, struct compositor_state * wl_list_insert(&state->touch, &tstate->link); } +static void tablet_tool_axis_notify(struct wl_listener *listener, void *data) { + struct wlr_tablet_tool_axis *event = data; + struct tablet_tool_state *tstate = wl_container_of(listener, tstate, axis); + if (tstate->compositor->tool_axis_cb) { + tstate->compositor->tool_axis_cb(tstate, event); + } +} + +static void tablet_tool_proximity_notify(struct wl_listener *listener, void *data) { + struct wlr_tablet_tool_proximity *event = data; + struct tablet_tool_state *tstate = wl_container_of(listener, tstate, proximity); + if (tstate->compositor->tool_proximity_cb) { + tstate->compositor->tool_proximity_cb(tstate, event->state); + } +} + +static void tablet_tool_button_notify(struct wl_listener *listener, void *data) { + struct wlr_tablet_tool_button *event = data; + struct tablet_tool_state *tstate = wl_container_of(listener, tstate, button); + if (tstate->compositor->tool_button_cb) { + tstate->compositor->tool_button_cb(tstate, event->button, event->state); + } +} + +static void tablet_tool_add(struct wlr_input_device *device, + struct compositor_state *state) { + struct tablet_tool_state *tstate = calloc(sizeof(struct tablet_tool_state), 1); + tstate->device = device; + tstate->compositor = state; + wl_list_init(&tstate->axis.link); + wl_list_init(&tstate->proximity.link); + wl_list_init(&tstate->tip.link); + wl_list_init(&tstate->button.link); + tstate->axis.notify = tablet_tool_axis_notify; + tstate->proximity.notify = tablet_tool_proximity_notify; + //tstate->tip.notify = tablet_tool_tip_notify; + tstate->button.notify = tablet_tool_button_notify; + wl_signal_add(&device->tablet_tool->events.axis, &tstate->axis); + wl_signal_add(&device->tablet_tool->events.proximity, &tstate->proximity); + //wl_signal_add(&device->tablet_tool->events.tip, &tstate->tip); + wl_signal_add(&device->tablet_tool->events.button, &tstate->button); + wl_list_insert(&state->tablet_tools, &tstate->link); +} + static void input_add_notify(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; struct compositor_state *state = wl_container_of(listener, state, input_add); @@ -180,6 +224,8 @@ static void input_add_notify(struct wl_listener *listener, void *data) { case WLR_INPUT_DEVICE_TOUCH: touch_add(device, state); break; + case WLR_INPUT_DEVICE_TABLET_TOOL: + tablet_tool_add(device, state); default: break; } @@ -236,6 +282,24 @@ static void touch_remove(struct wlr_input_device *device, struct compositor_stat wl_list_remove(&tstate->cancel.link); } +static void tablet_tool_remove(struct wlr_input_device *device, struct compositor_state *state) { + struct tablet_tool_state *tstate = NULL, *_tstate; + wl_list_for_each(_tstate, &state->tablet_tools, link) { + if (_tstate->device == device) { + tstate = _tstate; + break; + } + } + if (!tstate) { + return; + } + wl_list_remove(&tstate->link); + wl_list_remove(&tstate->axis.link); + wl_list_remove(&tstate->proximity.link); + //wl_list_remove(&tstate->tip.link); + wl_list_remove(&tstate->button.link); +} + static void input_remove_notify(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; struct compositor_state *state = wl_container_of(listener, state, input_add); @@ -249,6 +313,9 @@ static void input_remove_notify(struct wl_listener *listener, void *data) { case WLR_INPUT_DEVICE_TOUCH: touch_remove(device, state); break; + case WLR_INPUT_DEVICE_TABLET_TOOL: + tablet_tool_remove(device, state); + break; default: break; } @@ -323,6 +390,7 @@ void compositor_init(struct compositor_state *state) { wl_list_init(&state->keyboards); wl_list_init(&state->pointers); wl_list_init(&state->touch); + wl_list_init(&state->tablet_tools); wl_list_init(&state->input_add.link); state->input_add.notify = input_add_notify; wl_list_init(&state->input_remove.link); diff --git a/example/shared.h b/example/shared.h index d09bcd0e..df456c91 100644 --- a/example/shared.h +++ b/example/shared.h @@ -50,6 +50,17 @@ struct touch_state { void *data; }; +struct tablet_tool_state { + struct compositor_state *compositor; + struct wlr_input_device *device; + struct wl_listener axis; + struct wl_listener proximity; + struct wl_listener tip; + struct wl_listener button; + struct wl_list link; + void *data; +}; + struct compositor_state { void (*output_add_cb)(struct output_state *s); void (*keyboard_add_cb)(struct keyboard_state *s); @@ -72,6 +83,14 @@ struct compositor_state { double x, double y, double width, double height); void (*touch_up_cb)(struct touch_state *s, int32_t slot); void (*touch_cancel_cb)(struct touch_state *s, int32_t slot); + void (*tool_axis_cb)(struct tablet_tool_state *s, + struct wlr_tablet_tool_axis *event); + void (*tool_proximity_cb)(struct tablet_tool_state *s, + enum wlr_tablet_tool_proximity_state proximity); + void (*tool_tip_cb)(struct tablet_tool_state *s, + enum wlr_tablet_tool_tip_state state); + void (*tool_button_cb)(struct tablet_tool_state *s, + uint32_t button, enum wlr_button_state state); struct wl_display *display; struct wl_event_loop *event_loop; @@ -81,6 +100,7 @@ struct compositor_state { struct wl_list keyboards; struct wl_list pointers; struct wl_list touch; + struct wl_list tablet_tools; struct wl_listener input_add; struct wl_listener input_remove; diff --git a/example/tablet.c b/example/tablet.c index 9a498438..f2497d59 100644 --- a/example/tablet.c +++ b/example/tablet.c @@ -21,6 +21,13 @@ struct sample_state { struct wlr_renderer *renderer; + bool proximity, tap; + double distance; + double pressure; + double x_mm, y_mm; + double width_mm, height_mm; + struct wl_list link; + float tool_color[4]; }; static void handle_output_frame(struct output_state *output, struct timespec *ts) { @@ -28,13 +35,41 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts struct sample_state *sample = state->data; struct wlr_output *wlr_output = output->output; + int32_t width, height; + wlr_output_effective_resolution(wlr_output, &width, &height); + wlr_renderer_begin(sample->renderer, wlr_output); - float matrix[16]; - float color[4] = { 0, 1.0, 0, 1.0 }; - wlr_matrix_scale(&matrix, 128, 128, 1); - wlr_matrix_mul(&wlr_output->transform_matrix, &matrix, &matrix); - wlr_render_colored_ellipse(sample->renderer, &color, &matrix); + float matrix[16], view[16]; + float pad_color[4] = { 0.75, 0.75, 0.75, 1.0 }; + float distance = 0.8f * (1 - sample->distance); + float tool_color[4] = { distance, distance, distance, 1 }; + for (size_t i = 0; i < 4; ++i) { + tool_color[i] *= sample->tool_color[i]; + } + float scale = 4; + + float pad_width = sample->width_mm * scale; + float pad_height = sample->height_mm * scale; + float left = width / 2.0f - pad_width / 2.0f; + float top = height / 2.0f - pad_height / 2.0f; + wlr_matrix_translate(&matrix, left, top, 0); + wlr_matrix_scale(&view, pad_width, pad_height, 1); + wlr_matrix_mul(&matrix, &view, &view); + wlr_matrix_mul(&wlr_output->transform_matrix, &view, &matrix); + wlr_render_colored_quad(sample->renderer, &pad_color, &matrix); + + if (sample->proximity) { + wlr_matrix_translate(&matrix, + sample->x_mm * scale - 8 * (sample->pressure + 1) + left, + sample->y_mm * scale - 8 * (sample->pressure + 1) + top, 0); + wlr_matrix_scale(&view, + 16 * (sample->pressure + 1), + 16 * (sample->pressure + 1), 1); + wlr_matrix_mul(&matrix, &view, &view); + wlr_matrix_mul(&wlr_output->transform_matrix, &view, &matrix); + wlr_render_colored_ellipse(sample->renderer, &tool_color, &matrix); + } wlr_renderer_end(sample->renderer); } @@ -46,13 +81,58 @@ static void handle_keyboard_key(struct keyboard_state *kbstate, } } +static void handle_tool_axis(struct tablet_tool_state *tstate, + struct wlr_tablet_tool_axis *event) { + struct sample_state *sample = tstate->compositor->data; + sample->width_mm = event->width_mm; + sample->height_mm = event->height_mm; + if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_X)) { + sample->x_mm = event->x_mm; + } + if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_Y)) { + sample->y_mm = event->y_mm; + } + if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_DISTANCE)) { + sample->distance = event->distance; + } + if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_PRESSURE)) { + sample->pressure = event->pressure; + } +} + +static void handle_tool_proximity(struct tablet_tool_state *tstate, + enum wlr_tablet_tool_proximity_state state) { + struct sample_state *sample = tstate->compositor->data; + sample->proximity = state == WLR_TABLET_TOOL_PROXIMITY_IN; +} + +static void handle_tool_button(struct tablet_tool_state *tstate, + uint32_t button, enum wlr_button_state state) { + struct sample_state *sample = tstate->compositor->data; + if (state == WLR_BUTTON_RELEASED) { + float default_color[4] = { 1, 1, 1, 1 }; + memcpy(sample->tool_color, default_color, 4); + } else { + for (size_t i = 0; i < 3; ++i) { + if (button % 3 != i) { + sample->tool_color[button % 3] = 0; + } + } + } +} + int main(int argc, char *argv[]) { - struct sample_state state = { 0 }; + struct sample_state state = { + .tool_color = { 1, 1, 1, 1 } + }; struct compositor_state compositor; compositor_init(&compositor); compositor.output_frame_cb = handle_output_frame; compositor.keyboard_key_cb = handle_keyboard_key; + compositor.tool_axis_cb = handle_tool_axis; + compositor.tool_proximity_cb = handle_tool_proximity; + compositor.tool_button_cb = handle_tool_button; state.renderer = wlr_gles3_renderer_init(); From 7e038a6110501a51e7f3d3366e8bc54a02766f22 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 16 Jun 2017 15:38:34 -0400 Subject: [PATCH 25/25] Add (broken) DRM hardware cursors --- backend/drm/drm.c | 71 +- example/cat.c | 4381 +++++++++++++++++++++++++---------------- example/pointer.c | 15 +- example/rotation.c | 2 +- example/touch.c | 2 +- include/backend/drm.h | 8 +- include/types.h | 3 + include/wlr/types.h | 3 + types/wlr_output.c | 9 + 9 files changed, 2739 insertions(+), 1755 deletions(-) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 225035b7..00b45bce 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -112,8 +112,8 @@ static void wlr_drm_output_end(struct wlr_output_state *output) { drmModePageFlip(renderer->fd, output->crtc, fb_id, DRM_MODE_PAGE_FLIP_EVENT, output); output->pageflip_pending = true; - output->bo_last = output->bo_current; - output->bo_current = bo; + output->bo[1] = output->bo[0]; + output->bo[0] = bo; } void wlr_drm_output_start_renderer(struct wlr_output_state *output) { @@ -141,8 +141,8 @@ void wlr_drm_output_start_renderer(struct wlr_output_state *output) { drmModePageFlip(renderer->fd, output->crtc, fb_id, DRM_MODE_PAGE_FLIP_EVENT, output); - output->bo_last = NULL; - output->bo_current = bo; + output->bo[1] = NULL; + output->bo[0] = bo; } static bool display_init_renderer(struct wlr_drm_renderer *renderer, @@ -280,6 +280,59 @@ static void wlr_drm_output_transform(struct wlr_output_state *output, output->wlr_output->transform = transform; } +static void wlr_drm_cursor_bo_update(struct wlr_output_state *output, + uint32_t width, uint32_t height) { + if (output->cursor_width == width && output->cursor_height == height) { + return; + } + wlr_log(L_DEBUG, "Allocating new cursor bos"); + struct wlr_backend_state *state = + wl_container_of(output->renderer, state, renderer); + for (size_t i = 0; i < 2; ++i) { + output->cursor_bo[i] = gbm_bo_create(state->renderer.gbm, + width, height, GBM_FORMAT_ARGB8888, + GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE); + if (!output->cursor_bo[i]) { + wlr_log(L_ERROR, "Failed to create cursor bo"); + return; + } + } +} + +static bool wlr_drm_output_set_cursor(struct wlr_output_state *output, + const uint8_t *buf, int32_t stride, uint32_t width, uint32_t height) { + struct wlr_backend_state *state = + wl_container_of(output->renderer, state, renderer); + if (!buf) { + drmModeSetCursor(state->fd, output->crtc, 0, 0, 0); + return true; + } + wlr_drm_cursor_bo_update(output, width, height); + struct gbm_bo *bo; + output->current_cursor ^= 1; + bo = output->cursor_bo[output->current_cursor]; + uint32_t _buf[width * height]; + memset(_buf, 0, sizeof(_buf)); + for (size_t i = 0; i < height; ++i) { + memcpy(_buf + i * width, + buf + i * stride, + width * 4); + } + if (gbm_bo_write(bo, _buf, sizeof(_buf)) < 0) { + wlr_log(L_ERROR, "Failed to write cursor to bo"); + return false; + } + return !drmModeSetCursor(state->fd, output->crtc, + gbm_bo_get_handle(bo).s32, width, height); +} + +static bool wlr_drm_output_move_cursor(struct wlr_output_state *output, + int x, int y) { + struct wlr_backend_state *state = + wl_container_of(output->renderer, state, renderer); + return !drmModeMoveCursor(state->fd, output->crtc, x, y); +} + static void wlr_drm_output_destroy(struct wlr_output_state *output) { wlr_drm_output_cleanup(output, true); free(output); @@ -289,6 +342,8 @@ static struct wlr_output_impl output_impl = { .enable = wlr_drm_output_enable, .set_mode = wlr_drm_output_set_mode, .transform = wlr_drm_output_transform, + .set_cursor = wlr_drm_output_set_cursor, + .move_cursor = wlr_drm_output_move_cursor, .destroy = wlr_drm_output_destroy, }; @@ -480,8 +535,6 @@ void wlr_drm_scan_connectors(struct wlr_backend_state *state) { wlr_output->subpixel = WL_OUTPUT_SUBPIXEL_NONE; break; } - strcpy(wlr_output->make, "drm"); - strcpy(wlr_output->model, "unknown"); drmModeEncoder *curr_enc = drmModeGetEncoder(state->fd, conn->encoder_id); if (curr_enc) { @@ -544,9 +597,9 @@ static void page_flip_handler(int fd, unsigned seq, struct wlr_backend_state *state = wl_container_of(output->renderer, state, renderer); - if (output->bo_last) { - gbm_surface_release_buffer(output->gbm, output->bo_last); - output->bo_last = NULL; + if (output->bo[1]) { + gbm_surface_release_buffer(output->gbm, output->bo[1]); + output->bo[1] = NULL; } output->pageflip_pending = false; diff --git a/example/cat.c b/example/cat.c index e96c3901..0a4dba9e 100644 --- a/example/cat.c +++ b/example/cat.c @@ -1,1743 +1,2644 @@ -/* GIMP RGB C-Source image dump (cat.c) */ -#include "cat.h" +/* GIMP RGBA C-Source image dump (cat.c) */ -const struct gimp_texture cat_tex = { - 128, 128, 3, - "[\231\021L\205\001L\211\001S\227\007U\230\006W\222\001\\\221\001T\212\001P\212\001M\203\001" - "P\211\001Q\217\001J\207\002J\207\001M\214\001Q\217\002X\227\002X\223\001U\214\001T\216\001Z\224" - "\003X\221\001W\216\001]\231\005^\230\006`\231\011Y\226\003W\220\002Y\222\004W\217\002]\226\007" - "Z\226\003Z\226\001X\217\002Y\224\001X\222\001V\220\001[\227\001b\241\004a\240\004Y\227\000Y\221" - "\001Y\217\001X\216\001[\232\005k\246\027^\231\007U\214\001r\243\031l\235\014i\232\001c\222" - "\001W\213\004a\224\026X\216\011T\217\001V\222\002Q\211\002I{\001X\215\004j\235\006n\242\003g" - "\235\002W\215\001X\226\003U\222\002T\207\001V\212\001W\216\001Z\226\001X\220\002[\221\001g\233" - "\014e\233\017f\240\031Y\224\017\\\225\017f\235\026\\\225\005T\220\001U\211\002Y\216\001" - "Y\220\002Y\222\002Y\225\001W\230\001O\216\001N\217\001W\231\003Z\233\004Z\227\004X\217\001Z\215" - "\002X\212\001[\215\001[\215\001]\220\002]\230\001]\233\001X\220\002Y\220\002X\215\001_\234\001" - "]\237\001V\222\002Q\215\001S\217\002S\217\001O\216\002P\224\000O\217\001M\207\001U\225\002S\216" - "\000S\215\001S\224\001N\220\001P\226\004R\227\012X\234\021b\241\024b\242\017]\233\004V\226" - "\001Z\233\010X\232\011N\221\001Q\215\001Z\237\021R\231\007J\224\003K\221\001P\213\001]\221" - "\001\\\223\001U\215\002L\212\001J\205\002O\211\001U\222\001U\220\001V\224\002U\223\001Y\224\001" - "Z\222\000[\220\001X\222\001X\225\002W\222\001T\210\001]\225\001i\237\014g\236\020j\242\026" - "T\223\002S\215\001V\216\001[\225\001X\226\001Z\230\002Z\227\001Z\225\001^\226\005f\233\015[" - "\223\002a\234\004^\231\003m\247\014a\232\003_\226\001]\223\001X\223\001^\236\013c\242\016" - "^\231\002`\222\002g\236\006u\254\013j\241\001c\234\002b\236\005`\232\012U\217\001U\210\002" - "S\216\001R\216\001T\216\001d\234\005l\242\005n\244\003t\253\013a\233\003b\235\006V\217\001U" - "\205\001X\212\001Z\217\001^\226\003\\\225\002W\216\001V\217\003R\212\000Q\211\001S\214\002S\213" - "\001\\\223\005e\237\015X\221\002X\220\001Y\220\001W\212\001U\213\001V\220\001V\227\001V\230" - "\001V\230\001W\230\003M\210\001R\215\001W\217\001U\210\001O\203\002W\214\002Z\217\001Z\216\000" - "Z\225\001d\245\015V\220\001T\210\001U\214\001Z\231\002\\\236\001T\221\002M\207\002N\210\001" - "S\217\001S\215\001V\225\001U\215\001T\210\001e\235\001\\\220\002V\214\001X\230\002S\226\001L" - "\216\001H\207\001L\220\001T\225\003j\244\015m\247\013W\226\001U\226\006]\236\017d\244\026" - "]\236\011K\222\002M\230\006S\235\017N\230\006Q\214\002]\223\001`\226\001Y\224\002Q\215\001" - "N\210\001U\215\002]\227\001_\231\001]\226\001[\223\001Z\221\001Z\217\001Y\215\001W\224\001W\227" - "\002V\217\001S\210\002]\226\001p\246\015c\233\011d\237\015R\222\000T\212\001X\220\001W\223" - "\001V\215\001\\\231\002d\236\013o\243\032g\234\023c\233\020X\222\002c\236\007a\232\002g\237" - "\005c\232\001c\231\002`\232\001\\\235\001^\236\005Y\231\002U\211\001\\\217\001`\226\001c\241" - "\001m\250\005b\240\002]\233\001W\223\001W\222\002T\214\001S\217\001Z\226\004^\230\002a\232\001" - "a\234\001j\245\010j\246\013Z\225\003f\240\014T\212\001P\202\001S\211\000Y\223\001Y\226\001" - "\\\232\006P\215\005J\207\000L\177\002P\202\001_\225\003Y\215\001^\223\003q\250\027\\\226\003" - "X\221\001X\222\000V\213\001W\214\002X\217\001[\233\001X\231\001O\211\002R\220\001S\212\001U\216" - "\001W\215\001P\203\002U\212\001Z\216\002[\225\001Z\223\001U\221\001h\251\031R\223\002O\213\001" - "U\224\002X\230\001[\233\001X\226\001R\215\001N\206\001T\214\001V\217\001X\225\001W\213\001_\222" - "\001i\237\001_\222\001\\\224\001Y\227\001V\226\001K\205\001I\202\001J\210\001S\223\002k\244\014" - "i\244\010]\235\003T\223\001U\226\002[\234\010b\243\013H\211\001D\214\001J\227\011V\240" - "\021R\232\002Z\223\002]\223\001W\222\002P\215\001P\213\001W\216\001_\227\001a\226\000]\223\001" - "Z\220\001X\217\002R\210\001U\215\001Z\226\002X\227\001U\221\001X\216\000]\227\001h\244\001`\232" - "\001Z\225\001U\214\001W\220\001Y\221\001W\220\001Y\227\002W\227\003X\230\004U\222\005U\221\002" - "V\222\001V\221\001\\\235\004]\236\002X\226\002Z\225\002`\237\001`\241\001\\\235\001Y\232\002" - "X\224\001S\210\002X\215\002[\221\002X\216\001f\242\006`\234\003Y\226\001^\233\003Y\227\002W\222" - "\001b\234\006j\243\016\\\230\002^\236\004Z\233\002e\245\015f\245\020X\226\003j\246\016U\213" - "\000S\204\002X\222\002i\244\037m\246/}\260N\226\302si\236\061K\177\000S\207\001[\222" - "\001U\213\001`\233\013j\244\025a\235\016f\237\025e\240\023T\217\001V\212\002\\\230\002Y" - "\231\002M\207\001F~\002X\227\001X\217\001Z\217\001V\213\001Q\207\001]\234\001_\231\002Z\223\002" - "Y\223\001V\222\000b\245\017X\232\006R\222\001T\223\001Z\232\001^\234\001]\234\002X\231\002R" - "\222\001T\222\001W\231\000W\230\002W\213\001h\240\001h\236\001_\222\002\\\221\001[\231\002X\231" - "\001N\217\001K\213\001M\215\001b\237\015^\234\007Y\227\001_\240\003U\216\002U\221\001T\222\001" - "S\220\001K\203\001F\200\001D\213\001I\224\003O\232\002Q\227\002T\225\001T\222\001P\210\002J\204" - "\001R\210\001X\222\001[\231\001[\234\001X\221\001S\211\001M\177\001T\213\003_\226\013W\224\004" - "X\232\005U\222\001]\225\001d\240\002_\227\001Y\217\001X\221\001Y\223\001[\216\001\\\217\001^" - "\234\001V\226\002R\220\001T\215\001W\217\001Y\224\001X\223\001V\224\001_\241\007V\224\001V\214" - "\001^\240\002b\243\005[\234\002V\226\002[\234\010U\222\002U\216\001X\214\001[\217\002h\241\004" - "j\247\006]\227\002^\226\001[\217\001Z\220\001l\245\011b\234\006V\221\001e\245\016[\234\005" - "g\245\017f\242\015b\235\011m\251\023V\216\001U\216\001d\237\036t\254C{\257S\230\305" - "y\251\320\223l\241\070O\206\000`\225\007\\\226\007O\217\001d\242\026`\240\020S\222\003" - "d\240\031m\245\035Y\221\000\\\222\001`\232\001[\227\001P\204\002R\210\001_\232\001^\223\002" - "]\223\002\\\225\001X\217\001Y\225\001Y\217\001\\\221\001X\225\001Q\214\001X\231\005_\240\011" - "S\220\001Q\214\001W\226\001[\227\001_\236\001b\245\003V\225\002Y\232\002g\247\012a\237\004Y" - "\216\002e\236\001^\225\001X\221\002W\222\001[\233\001Y\233\002V\230\002Q\217\001b\236\016m\247" - "\026Y\231\003T\223\001Z\233\003R\220\001R\220\001Q\224\001U\217\001M\200\001L\204\001L\206\001" - "N\217\001M\216\001J\217\001P\230\005P\227\003O\215\001F\201\001N\205\001R\223\003a\243\022R" - "\224\001S\223\001S\214\001T\204\001`\223\011b\226\016]\230\014]\236\012U\222\001[\221\001" - "c\234\001b\230\002`\225\001\\\225\001Y\215\001[\213\001^\222\001c\237\002[\223\001Y\224\001Z" - "\223\002]\222\002]\222\002^\227\001Z\230\002b\243\010V\227\002R\216\001Z\234\002h\251\017e" - "\244\022]\233\017b\235\027\\\227\016h\242\032c\235\014\\\223\000i\241\001j\243\002a\231" - "\001_\233\002W\221\001V\223\000b\236\015h\243\026[\233\013a\241\015X\232\002^\236\004]\231" - "\004c\236\006f\241\015[\230\015o\250/q\252>w\256H~\263P\236\310|\245\315\213c\237" - "%N\216\001T\222\002R\221\002N\217\002`\241\021[\235\011P\220\001W\226\002\\\231\002d\235" - "\002j\237\002f\233\002_\226\001W\212\002^\225\001e\236\002b\231\001`\233\001]\234\001W\217\001" - "V\213\001U\223\001T\223\001U\225\002K\202\002M\210\001_\241\004X\223\001X\222\001Y\225\002W\220" - "\001Y\226\001`\242\003]\240\003_\241\004i\246\007c\243\003]\232\001]\234\001S\217\001R\216\001" - "V\225\001Z\231\001^\233\001[\225\003V\213\001i\236\017e\240\015[\232\003X\231\003]\236\006" - "V\225\002S\222\001Z\233\001b\234\001K}\002Q\206\001O\206\002Z\223\001Z\227\001M\207\001I\211" - "\001R\230\004J\212\002B}\001L\211\001V\232\016e\245$K\213\000M\211\001T\220\001^\232\002a\232" - "\003X\222\001S\224\001W\232\003V\225\001\\\224\002b\230\001f\234\002b\226\001\\\217\001Y\213" - "\002]\221\001a\230\001a\232\001[\222\002^\233\001_\224\002`\225\001a\224\001b\230\000\\\227\000" - "`\243\004_\244\006U\225\002^\237\002c\243\007f\246\021Y\230\006V\223\005b\234\020w\253/\201" - "\265=l\243\031k\246\002g\236\001b\233\002]\230\001X\223\001R\217\002f\241\033`\235\027i" - "\247\035b\243\017Z\230\001^\230\001]\222\002b\231\002\\\230\004\\\232\022r\254\067x\262" - "B|\261A\201\265I\232\307n\230\303u\\\233\020Q\213\001R\212\001W\222\002W\223\002`" - "\240\007X\230\003M\213\002R\221\001Z\232\001c\231\001j\240\001j\241\001\\\220\001N\200\001\\" - "\225\002d\236\002a\230\001c\237\004_\240\004V\213\001\\\232\002Z\226\002U\222\001Q\215\001M\210" - "\001P\205\002\\\232\001^\233\002`\237\002Z\223\001W\214\002\\\232\001h\246\007f\247\014W\231" - "\003\\\236\002\\\235\001^\233\002Z\230\002W\226\001V\230\001[\235\001\\\233\002d\241\003c\232" - "\004^\222\004]\225\006[\230\004\\\234\003^\235\003\\\234\002]\236\002\\\234\002_\240\001_\230" - "\001Ey\002H\201\002M\210\001R\214\002Z\231\001V\221\001N\212\001N\221\001J\211\001G\202\002G\212" - "\001R\230\014X\234\021I\201\000L\213\001N\220\001W\227\001`\240\001]\224\001X\223\001W\227" - "\001X\225\001^\232\001c\236\001h\247\002Z\231\001V\215\001W\217\001Y\226\001f\245\010\\\231" - "\002X\223\002]\227\001^\221\002c\226\001e\231\001c\227\001_\227\001a\243\002h\252\012]\236\002" - "_\242\001Z\233\001[\234\001c\244\012g\244\017c\236\021j\245\037u\253\061~\262\061n\250" - "\012f\234\002`\221\001e\235\007e\233\021s\251\065z\261Fm\245\061o\254+f\246\023X\230" - "\001d\236\001`\221\003n\243\011s\250\035f\237\037s\253\065|\263>w\253\064\200\263<\205" - "\267Do\246(U\223\000W\223\002T\215\001V\217\001]\227\001e\242\004V\220\001L~\002R\220\002]" - "\233\001b\225\002i\234\001i\241\002\\\226\001R\207\001]\231\002b\234\001^\222\001f\241\002`\234" - "\003[\223\002c\233\002f\241\001V\213\002Q\212\001S\215\001[\226\002`\237\002]\235\001Y\232\001" - "X\230\001U\211\001Z\226\001j\250\007a\241\004S\214\001X\227\001`\241\002a\240\001W\222\001Y\227" - "\001^\243\002\\\233\001_\234\002b\237\001g\237\005`\227\005b\231\006_\232\003e\240\003n\250\007" - "h\242\002p\252\006l\247\003b\232\002b\233\001p\001" - "M\210\001G\203\001D|\002I\207\001S\227\001M\223\001I\221\002]\242\027H\217\004E\207\001U\233" - "\003R\221\000Y\224\001X\215\001S\215\001V\225\001[\232\001Y\221\002Y\230\002U\226\001`\241\012" - "]\233\002k\244\002u\255\003d\231\001Z\216\001Y\216\001c\240\004}\262\026i\240\002g\226\002d" - "\222\002i\234\001h\240\001a\232\002\\\226\001[\220\001]\224\001_\236\001c\240\001h\244\001c\235" - "\002^\226\001^\235\002Y\226\001d\243\016`\234\017p\251\030f\241\004g\241\001l\246\002f\233" - "\001l\243\014q\247(v\252B\220\301eu\260\066X\232\000f\251\005]\236\002^\236\002p\254" - "\026x\264(q\256*b\236\035~\263@t\253/[\231\006l\252\023b\241\004]\232\001[\230\001Z" - "\231\001\\\227\001b\231\001k\237\001p\247\001k\243\001f\241\002]\230\001j\244\002p\251\002o\246" - "\004b\233\001`\233\001b\236\002d\236\002b\233\001r\254\012y\264\012j\242\001a\225\001Y\213" - "\002_\225\001c\236\001a\232\001c\241\001]\232\001X\225\001c\245\016Q\221\002[\232\001Z\225\001" - "c\236\004p\254\011a\241\001`\226\001i\240\002v\256\001q\247\002k\241\001e\237\001b\233\001f" - "\242\001e\235\001f\234\002d\234\001_\223\002i\240\003k\242\003{\260\031~\263\040g\240\003j" - "\244\002e\236\002_\220\001i\244\001Ct\002H\201\000G\201\002Dz\002K\206\001U\225\001R\226\001K\221" - "\001R\230\010J\221\005E\213\002R\230\001V\225\001Z\222\001N{\002P\202\001Z\222\001`\231\002]\224" - "\001\\\235\002R\225\000]\236\015c\243\014b\240\001k\250\001c\235\002Z\223\000X\223\002j\247" - "\011y\261\022j\235\001g\224\001i\230\002i\237\001c\232\001Y\222\001[\232\001[\227\001]\227" - "\001b\242\003]\236\001W\227\001Y\225\001_\236\002b\237\001c\241\003f\242\007[\230\004d\240\012" - "s\255\015h\241\001k\247\002e\242\002`\235\010f\241\036t\255A\204\272Rs\256\061[\235" - "\001k\254\015a\242\005^\236\003n\252\026\201\273\062j\250\026]\234\006\\\235\007\\\235" - "\005^\230\001f\235\001i\237\002h\236\001a\227\001[\221\001d\233\002p\250\002p\242\001p\246\002" - "g\237\001a\230\001j\247\003r\255\002r\252\001i\234\002j\243\002j\243\002j\241\001g\233\001b\233" - "\000y\262\017v\260\007k\240\001^\220\002Z\213\002W\210\001f\235\002l\247\001l\250\002g\242\002" - "_\236\004b\243\013\\\235\002^\233\002W\215\001n\247\013q\253\007i\245\001j\241\002l\241\001" - "w\255\002y\253\002v\257\001m\242\002d\235\001f\237\002e\234\002d\234\001`\226\001g\236\001p\250" - "\003h\233\002n\247\014{\263\034c\237\001e\236\001e\237\002a\224\001g\241\000G{\001I\204\002K" - "\212\005\066j\001N\212\002^\240\002X\235\001L\220\001R\230\011O\226\007F\216\000W\233\003U\222" - "\001O\177\001Ft\001M|\002X\215\001h\240\001d\234\001Z\231\002U\227\002M\215\001X\230\002^\234\001" - "f\243\001a\235\002]\231\001W\224\000m\253\013n\250\005k\234\001j\230\001l\234\002g\237\002Z" - "\214\000U\211\002Z\231\001_\234\002`\233\001a\243\001[\235\001[\240\002Y\232\001c\243\002p\256" - "\004j\244\002_\235\001]\234\002`\241\002i\246\004c\240\000l\250\007f\242\012b\237\017p\252" - "&x\261\067w\260\067x\262.^\236\005[\235\002d\245\006^\236\002r\256\031y\264\037e\244" - "\006c\244\003[\225\002^\231\002b\235\001k\243\002l\240\001l\242\002j\236\002f\231\002g\235\002" - "i\240\001h\240\001h\244\001e\244\002k\250\006n\251\004q\252\001p\240\002o\241\001r\253\002p\244" - "\001p\244\001j\235\002h\235\002t\257\001p\250\001j\234\001c\222\002g\226\001^\213\002X\211\001" - "i\241\001m\246\001n\246\003p\252\012a\241\004Z\231\001^\231\002]\231\001p\254\015f\243\002" - "j\244\001p\253\001q\245\002x\255\001y\254\001w\261\001n\255\002`\236\002b\234\001b\236\001`\230" - "\002`\227\001i\237\002k\243\001g\235\001s\256\021s\260\021`\236\000a\231\001c\233\001c\227" - "\001h\240\001J\211\001\\\232\024g\244(\067e\000T\207\002a\243\001^\242\003L\221\001N\227\004" - "R\230\007Q\226\003V\232\003R\215\001J}\002M\200\002S\212\001`\230\001g\236\002a\225\002^\232" - "\001Z\233\002Q\216\001P\215\001[\231\001g\243\002b\231\002X\217\001Y\225\001r\254\015f\235\002" - "d\230\001h\231\001i\237\001d\237\002[\227\001X\224\001^\235\001a\234\001b\234\002b\240\001^\234" - "\002Y\230\001\\\237\001a\242\000o\253\010i\245\010\\\235\002a\242\001c\243\001a\234\001[\232" - "\000i\252\020^\240\012\\\234\010k\250\030}\265-u\257%t\260\034]\235\001[\230\001k\256" - "\013a\243\006i\251\013i\252\013b\242\003i\253\004Z\227\001Z\227\001e\245\001h\243\001j\236" - "\001k\240\001n\245\001j\242\001g\236\001h\240\001i\244\001k\251\002f\246\001c\241\002h\242\000" - "o\250\001i\234\001p\242\001w\252\001q\240\002s\247\001o\244\002k\240\001n\253\001j\243\002f\236" - "\002_\226\000\200\257\033^\220\003U\203\002c\232\001p\253\002j\243\000l\253\002b\240\001b\234" - "\002d\233\002f\240\002n\253\010]\235\001b\237\002g\237\001s\246\001x\246\002\206\270\001\200" - "\265\001s\255\001j\250\001e\236\002`\233\001^\227\000a\232\001j\241\003w\256\017{\263\027r" - "\257\017n\254\015[\236\001]\226\001b\232\002h\237\001l\245\001J\210\002O\222\011n\253,H" - "\201\001S\220\001Z\231\002_\243\002Y\234\001X\236\001[\242\011\\\243\016P\230\002O\221\000" - "O\212\001R\213\001\\\224\001g\235\001i\235\002]\221\002^\232\001X\230\001U\226\002Q\217\001T" - "\224\001^\236\001c\234\002]\222\001b\241\003s\256\022]\232\002a\227\001f\233\001d\234\001b\240" - "\001c\246\002e\250\004[\234\001]\235\001`\235\001a\241\002^\233\002[\230\001a\243\001\\\236\000" - "e\244\013j\247\025i\246\017d\244\003f\247\001^\233\002V\221\001\\\240\006Z\235\002Z\234" - "\002`\240\005t\261\027y\266\037e\244\004a\234\001a\234\001l\254\006k\250\010j\246\011t\261" - "\022f\246\005`\242\002Y\231\001g\247\013m\252\012g\231\002l\241\001e\233\001c\240\001c\240" - "\001a\233\001j\244\001k\247\003e\242\001i\247\002l\245\001p\251\002o\246\001l\241\002j\235\002" - "p\243\002q\241\001s\246\002n\243\001h\237\001h\244\001d\235\001`\233\002[\232\001i\245\015_" - "\230\002b\230\002g\237\001m\252\002g\244\001i\244\001d\234\002a\227\001i\241\001r\253\003l\250" - "\002b\237\001c\241\001g\240\001l\241\001q\243\001}\256\002\207\270\001}\255\001u\250\002k\241" - "\000f\236\001b\232\002g\237\002n\245\004m\245\007z\263\026q\255\017r\261\024^\237\001]\234" - "\002e\234\002m\245\001n\241\001U\230\010[\235\016y\262\060f\245\025S\221\001U\221\001Y\226" - "\001a\234\001`\236\002[\235\002a\246\016V\233\003X\233\002\\\236\001Z\233\002]\227\001d\233" - "\002f\232\001b\227\001^\230\001Z\230\001W\226\001W\226\001X\221\001f\240\002h\240\002c\236\000" - "m\254\014l\252\020[\232\001b\230\002k\237\001h\236\002c\237\001f\247\006b\244\005\\\235\001" - "_\240\001]\234\001\\\233\001[\231\001^\232\001a\243\001Y\233\001\\\240\010T\230\006_\240\012" - "f\251\010d\247\002a\243\002V\230\002T\231\002c\246\011[\235\001^\236\001g\251\003j\253\005" - "b\244\001b\242\001d\245\001f\251\001`\242\001_\240\001h\251\005e\246\001]\234\002^\237\002d\244" - "\005e\236\002t\252\002w\254\001j\241\002h\250\002a\235\001b\233\001k\247\002m\251\003j\245\002" - "k\245\001k\243\002s\256\002n\240\001l\240\002k\236\001p\245\001m\244\002l\244\001k\244\002i\240" - "\001g\237\002a\227\001_\226\002\\\224\001c\233\001j\240\001l\235\001k\236\001p\253\001k\241\001" - "f\230\002f\235\001b\226\002m\245\002t\257\002l\242\000i\241\001j\243\001h\241\001l\243\001p\252" - "\001s\252\001\210\270\000\216\274\002z\257\002k\244\002j\246\001j\243\001n\243\001r\250\004t" - "\252\004m\246\001n\251\006q\256\020g\247\007c\241\001e\234\001o\245\002r\243\001M\210\002U\226" - "\003f\241\022u\255!U\223\000X\223\001Z\231\001^\223\001a\231\001\\\232\001\\\241\004M\220" - "\001O\222\001`\244\004[\237\001\\\233\001b\233\001e\241\001a\240\001\\\234\001\\\234\001Z\223" - "\001_\234\001_\226\001m\247\005c\243\002]\236\002g\251\014d\247\014\\\234\002c\236\002f\233" - "\002f\233\002c\242\000p\254\020f\246\012[\235\000_\241\002X\224\001Z\231\001_\234\001d\240" - "\001c\240\001Z\231\001W\232\001]\237\003`\243\003a\242\002c\245\004f\250\012Z\237\003V\231\002" - "Z\235\001[\236\001_\240\001b\243\001d\242\001c\244\001d\237\001h\246\001f\246\001_\240\001^\241" - "\002d\245\001h\250\002n\252\011k\251\014b\241\002g\242\001s\260\001o\251\002m\247\001k\251" - "\002b\235\002a\235\001m\253\012~\271\037j\247\004l\246\001n\247\002r\257\001m\241\001m\242" - "\001o\242\001r\246\001q\247\002n\246\002q\252\001l\242\001f\234\002c\234\001`\227\001c\227\002" - "k\234\001m\236\001i\230\001i\236\001j\242\001i\241\001e\227\001g\225\001k\232\002q\244\001s\252" - "\001n\240\001l\241\002i\241\001j\243\001l\251\001m\250\002l\244\002{\255\001\203\266\002v\252" - "\001l\245\001n\246\001t\247\002y\250\001\226\266\021\236\275\034u\252\002h\241\000w\265\020" - "s\260\012f\237\002l\242\002s\252\001r\246\001R\212\001[\230\002c\241\010m\251\021`\235\002" - "Z\224\002]\235\001Z\221\001[\217\001a\236\001Z\240\002J\223\002R\227\003W\233\002X\226\000^\222" - "\002a\231\001`\231\002X\221\001W\226\001[\232\001]\234\001]\234\001a\235\001l\253\004a\234\001" - "\\\227\001_\242\001Z\233\001Y\223\001c\236\002b\232\002a\231\001a\236\002]\237\003c\246\007\\" - "\236\001_\236\001`\236\001b\244\001b\241\001_\232\001\\\234\002[\235\001a\244\005b\244\003`\233" - "\001d\236\001q\255\016t\256\033Z\234\003[\234\001\\\234\001`\236\001`\236\002b\236\001c\230" - "\001h\250\001e\243\001g\243\001k\244\001e\240\002_\237\001c\244\005q\261\021y\271\034a\243" - "\006`\242\002d\242\001q\260\001l\246\001h\246\001h\246\002d\242\001`\235\001m\255\021|\272&" - "e\246\003j\250\001i\237\001n\250\002m\242\002k\237\002r\245\002r\245\002s\245\001o\242\001n\244" - "\001g\236\001f\243\001e\237\001b\227\001h\235\001n\243\001m\245\002h\234\002g\237\001g\245\001" - "n\247\001o\245\001n\235\001q\240\001q\242\002u\255\001n\241\001l\245\001s\256\002o\252\001i\236" - "\001k\237\001m\242\001t\254\001y\256\001y\257\002t\251\001n\241\001r\241\001v\246\001~\254\004" - "\206\263\013k\243\002i\244\001u\263\012o\256\005h\234\002m\245\002s\247\002r\245\001f\242" - "\003[\230\001[\234\001^\240\002]\235\001^\226\001^\233\002\\\223\002W\214\001b\233\002^\240\001" - "W\231\001X\233\001Y\231\001\\\227\001^\222\001d\233\002_\224\001X\223\002W\222\001_\241\004j" - "\254\015Z\233\001]\236\001l\254\006a\236\001^\230\001_\241\002W\224\001\\\222\002d\237\001f" - "\242\001b\231\002^\230\001X\226\002X\232\001W\224\001\\\233\002_\235\001c\244\001a\236\001`\234" - "\002^\240\001Z\232\001\\\236\001\\\231\000^\225\002`\233\001_\235\001`\237\004Y\231\002\\\233" - "\001c\240\001a\237\002c\241\004|\266\032h\241\001f\240\001d\233\002i\244\002h\237\002b\241\001" - "\\\236\000t\261\033\210\301+l\254\020Y\236\002Z\234\001a\232\002k\243\002i\240\001e\240" - "\001b\237\001e\246\001`\240\001j\254\006b\245\005i\254\004k\250\002j\235\001j\243\002h\234\002" - "f\231\002g\231\002f\232\002p\245\001n\242\001k\246\001c\236\001a\240\002c\232\001_\223\002b\226" - "\001k\246\001q\253\002j\236\002k\244\001j\237\001p\250\001t\253\001s\247\001h\233\002h\233\001" - "p\247\002o\251\001k\242\001z\266\004q\250\001n\242\002m\242\001i\240\001k\242\001j\235\001w\253" - "\001w\253\001m\237\001o\241\001n\241\001p\247\002n\251\002k\240\001k\243\002z\263\005x\262\004" - "k\241\001k\240\001m\246\001j\234\002b\241\001`\233\002`\237\002[\234\001W\227\001X\221\001]\233" - "\002Z\224\002X\214\002[\222\001_\236\001[\227\002\\\227\002Y\226\001[\230\001Z\225\001a\237\001" - "`\240\002[\231\001X\226\002^\236\003o\256\017^\240\001\\\234\001l\255\010a\240\002_\230\001" - "a\243\001^\237\001Z\221\001`\227\002d\237\001e\242\002b\234\002a\237\001^\234\002\\\223\001_" - "\231\001c\241\001a\237\002`\234\001_\237\002d\244\016`\237\020W\230\000Y\222\001\\\230\001" - "`\241\001Z\227\001Y\230\001\\\234\001a\242\002b\242\001[\232\001h\250\013v\257\031i\234\000" - "n\243\002]\221\002f\234\002g\245\001^\236\001c\246\011\177\275*x\266\040a\243\010Y\236" - "\005X\232\001^\232\002f\234\001f\234\002g\241\001b\241\001i\253\004g\247\002e\247\001d\242\001" - "f\241\001n\251\001n\244\001r\247\002m\237\002c\226\001b\226\001g\236\001o\247\001o\243\001o\242" - "\001n\237\002u\253\002e\230\001b\231\001_\224\001h\240\001i\243\002q\254\001k\244\001i\234\003" - "q\247\001v\260\002n\244\002c\230\001e\232\001o\251\002n\250\002k\242\001s\261\003p\254\001o\252" - "\002l\253\004f\237\002i\243\001j\240\001u\254\002z\256\001s\243\001m\235\001n\241\002s\256\001" - "p\255\001f\234\001o\246\001u\251\001\201\267\003p\244\001j\235\002i\241\001e\234\002a\240\002" - "a\230\001a\241\002`\240\001Y\222\001X\220\001]\233\002Z\225\002Y\220\001\\\226\001a\233\001c" - "\231\002b\227\001^\221\002a\232\001b\236\005c\241\006e\244\006Y\225\001[\223\001_\237\002h\250" - "\003f\244\001a\234\002e\246\002b\241\001_\227\001d\247\001b\245\002Q\213\001Z\224\001`\233\002" - "b\244\001b\243\002^\240\002X\224\001a\230\001d\230\001n\254\002k\255\004b\244\003W\224\004Z\205" - "*\212\256[`\232\034P\221\000X\223\000]\232\002Y\230\001X\226\001Z\225\002_\234\001b\245" - "\001i\253\012h\246\006_\225\000n\244\001q\244\001U\213\002i\237\001g\247\002[\233\001p\260\033" - "x\267\040k\254\020Y\236\005Y\236\004V\231\002\\\233\001i\250\006c\240\001g\246\001k\254\005" - "n\255\007m\255\007`\236\002b\240\001i\241\001r\253\001y\254\002t\243\001j\233\001f\230\002_\223" - "\001g\245\001k\250\001l\241\002r\244\001u\252\001p\243\002i\237\001b\232\001_\225\001g\245\002" - "e\235\001t\261\006f\243\001g\235\002o\250\001q\253\001i\237\002b\226\002g\236\001m\250\001l\246" - "\001i\247\000o\261\003i\251\001m\255\006|\271\023h\247\001i\244\001k\247\001n\244\001t\246\002" - "{\262\001u\244\001q\244\002r\252\001n\244\002h\237\002o\251\001r\253\001}\266\002u\256\002n\242" - "\002e\234\002h\246\001Y\227\002X\217\001`\236\001b\241\001\\\222\001^\230\001`\236\001^\226\001" - "Y\216\001_\227\002]\227\001`\234\001a\231\002f\234\001f\235\003_\233\004g\244\021`\240\010" - "\\\232\001Z\220\002_\232\001k\252\004l\253\004b\240\001b\240\000c\241\001d\234\001m\256\002f" - "\245\001V\214\001[\223\001a\234\001b\241\001f\251\003g\247\006`\233\001e\234\001l\244\002w\263" - "\001n\250\002X\221\001X\212\015\336\316\307\376\360\363\376\373\366\233\276^N\217" - "\000V\221\001X\226\002Y\226\001W\216\002Z\233\001X\231\003{\272)a\236\005a\226\002l\245\001p" - "\251\001k\237\002o\250\001j\251\001f\246\007h\250\021i\251\015Z\233\001]\236\001a\243\002_" - "\235\002j\252\011n\256\020Y\227\001\\\234\001^\236\001_\240\001j\255\005_\241\000a\235\002" - "g\234\002r\250\001o\240\001o\240\001j\233\002h\235\001h\246\001i\253\003h\242\001m\244\001q\246" - "\002q\254\001i\235\001g\237\002b\227\002c\231\001h\246\001f\240\001n\256\004b\243\003f\240\001" - "m\243\001s\247\001n\242\001f\231\002h\234\002m\246\001l\244\001q\257\002m\250\001m\250\001k\247" - "\001w\270\014e\247\002a\243\002`\240\002b\233\002l\244\001s\253\001r\252\001u\254\002o\244\001" - "k\236\001h\237\001m\254\000u\264\003t\260\002q\252\001l\247\000f\234\001r\254\007[\230\001X\217" - "\001[\227\002_\230\002^\224\002a\231\001e\243\001_\230\001]\223\001\\\226\001d\243\006h\251\011" - "^\223\001e\235\002b\233\001e\241\004n\251\012c\235\001e\235\001g\235\002i\241\002j\246\001k" - "\253\003f\245\002j\252\002i\242\001l\243\001r\255\002c\232\002Y\216\002V\214\001n\243\001o\251" - "\001e\244\000d\237\001h\235\002o\251\002s\255\001v\257\001n\243\001Y\223\000\252\267\211\351" - "\334\341\366\354\361\370\356\361\377\364\372\235\274fM\206\000W\224\002Z\227" - "\002Z\227\001Z\235\001f\251\014x\264\034u\260\020c\237\001q\254\002s\255\002j\236\001f\233" - "\001e\237\001f\251\005[\235\001b\244\010X\225\001`\240\001b\236\002c\236\001k\252\005_\240\001" - "]\237\001\\\236\003W\224\001_\233\001g\247\001d\243\001[\221\001b\227\002i\237\001c\227\002e" - "\231\000f\237\000n\253\007i\251\004f\243\000m\245\001l\243\001o\255\001k\252\002e\235\001e\242" - "\002b\237\001a\232\002j\246\001i\236\001m\251\002g\241\001k\244\002n\243\001q\244\001s\252\002" - "l\237\001m\240\001p\245\002q\246\001y\264\001s\250\002q\247\002o\246\001v\270\006f\247\002\\" - "\236\001Z\241\002\\\232\002l\246\001s\253\002s\255\001r\254\004j\247\002c\234\002d\242\002g\250" - "\002l\252\004j\244\002t\256\011t\254\015l\246\013v\262\025b\235\001_\234\001^\227\001a\230" - "\001f\240\001f\236\001i\244\001a\226\001X\217\001e\243\020\200\274\065`\232\000^\222\001`\230" - "\001e\234\002q\244\007m\241\001l\236\002m\233\001n\235\001h\233\002^\217\001^\231\001c\246\002" - "o\255\003s\252\001|\260\001y\254\001\\\220\002Z\217\002S\210\002u\246\002w\255\002f\240\001e" - "\241\002h\237\001o\252\002f\232\001m\241\002k\240\001T\221\000\341\323\331\327\305\315" - "\336\314\326\363\344\352\347\325\326\376\365\366v\246-Y\234\001W\217\001_\237" - "\004o\257\025p\257\023l\255\015r\262\013k\252\002o\252\001s\244\001m\240\001c\227\002e\242" - "\001k\255\003]\237\001Z\235\003Y\232\001\\\234\001f\242\002c\234\001d\245\001`\244\002`\244\005" - "W\234\002S\217\002f\243\001j\247\001g\250\001]\223\001_\230\000f\235\000\242\303X\270\317" - "\201n\201\066\\\233\010]\236\001d\237\001n\250\001n\253\002i\250\002d\245\001c\243\001b\245" - "\001\\\232\001b\245\001d\243\002g\234\002p\252\001l\244\001l\246\001j\237\002p\244\001s\256\001" - "q\250\001q\252\001o\243\001s\253\002y\264\001x\263\001u\254\001q\245\001r\254\001g\237\001b\241" - "\001e\247\004a\233\001q\253\001u\245\001{\261\001n\255\004n\260\012c\243\001g\247\000g\245\001" - "i\246\002i\241\002\177\263\032\202\262\037\202\265\037r\253\012f\231\001o\246\007`\226" - "\001]\222\002f\242\001f\237\001g\243\001f\236\001e\240\001\203\273\070\177\271\067b\233\000" - "b\230\002`\226\002d\232\001z\260\014m\242\002g\226\001k\230\002n\233\000j\234\001d\231\001`" - "\225\001c\241\003e\243\002g\235\001\212\270\001y\251\002_\225\002^\225\001V\212\002v\247\002" - "z\257\001c\230\002g\234\002l\237\002m\237\001\\\220\002t\251\001v\260\002k\232\036\327\302" - "\317\305\261\273\351\332\345\367\355\364\371\357\363\344\323\322\361\355" - "\331U\220\010R\220\000b\243\010r\261\031f\246\007^\240\001Y\223\002e\244\001m\246\001u\250" - "\001u\251\001l\236\002n\251\001m\251\001Z\230\003T\226\003Z\233\003b\240\003f\244\001e\237\001" - "e\247\001]\237\001Y\230\001U\221\001Y\226\001d\243\001d\240\002b\240\001X\227\000\253\307r" - "\371\364\352\352\335\337\343\323\321\320\277\272d\212#^\240\002d\240\001m\251" - "\002l\247\001b\231\002_\226\002^\237\001l\256\010p\257\007d\244\001c\240\003f\233\001s\255\002" - "l\243\001j\243\001e\234\002k\243\001u\260\002v\256\001v\254\001o\240\002t\247\001z\261\001|\262" - "\001z\255\001s\243\002s\250\001m\242\002k\242\002o\253\001l\245\002v\261\004q\244\002t\255\001" - "s\262\007i\252\002e\244\001o\255\002q\252\001p\247\002j\237\001z\257\014\204\263\027\200" - "\260\024s\253\005m\245\002d\235\002b\236\001e\236\002j\246\001i\242\001i\241\001f\241\002u\256" - "\032\221\304Fq\252\023f\233\001e\226\001f\225\001f\226\001p\251\001m\250\001c\227\001d\231" - "\002i\241\001f\233\002e\236\001d\235\001e\240\001g\241\002c\226\002\202\262\002y\252\001e\231" - "\001b\231\002c\230\001u\250\001}\261\001i\235\001h\234\002j\235\002l\237\001e\230\002{\256\000" - "\213\302\025\230\262a\317\270\302\273\242\256\347\327\344\353\332\345\331" - "\304\314\333\305\305\317\267\264\326\341\260X\230\010m\254\034|\272(d\243\003" - "a\233\001Z\216\002e\235\001n\244\001q\245\002p\242\001u\256\001s\253\001r\247\001e\235\001O\217" - "\001m\250\003k\243\001e\234\002d\243\002f\247\003a\241\001[\221\002\\\224\002^\235\002^\237\003" - "[\231\002e\232\001\352\352\264\340\314\305\325\275\264\326\277\266\314\267\257" - "\332\314\306\236\245q]\236\000g\250\002f\242\002d\234\001a\231\001_\230\002^\223\001b\232" - "\000k\250\004o\257\002h\241\001n\243\001x\261\001m\241\002j\241\001e\232\001l\251\002u\260\001" - "w\255\001u\250\001q\243\001w\250\001\177\264\001~\262\001{\256\001n\240\001o\247\002l\245\001" - "j\241\001n\252\002t\261\007m\250\002k\243\002o\252\001s\260\002n\255\001l\245\001o\252\001u\257" - "\002p\251\001n\245\001}\264\015w\255\007m\246\001k\244\001h\242\001e\243\002c\235\002e\235\001" - "w\262\005m\241\001l\240\001e\234\001a\227\006\214\303Fj\251\014h\244\004i\237\002l\241\001" - "g\230\002s\254\002l\245\001h\246\001f\242\000p\252\005d\233\001o\251\012q\255\016j\251\002" - "h\240\001k\233\000\204\264\002s\243\002g\233\002g\245\002j\250\001p\252\002x\260\002r\247\001" - "\\\224\002h\235\002g\233\002q\246\001r\247\001k\250\000\250\267|\313\266\276\323\277" - "\313\357\345\356\363\351\361\367\355\362\342\314\320\344\317\317\354\323" - "\315\241\277[j\247\017f\245\004^\223\001a\227\002c\231\001i\234\002p\244\002o\241\001n\242" - "\001s\256\002r\252\001q\245\001j\236\002O\217\001v\255\002h\240\001e\240\001j\247\004f\243\001" - "e\237\003e\226\001g\235\001d\242\001\\\235\002s\246&\374\371\347\324\300\271\320\266" - "\262\334\305\300\316\271\266\311\263\256\277\255\247\277\264\243S\224\000]" - "\235\002`\237\001b\234\002a\234\001a\236\002`\224\001c\240\001d\236\001g\245\001k\242\002r\250" - "\001{\263\001l\236\002m\242\002i\240\002j\243\001o\251\001n\247\001k\242\002i\237\002p\250\001" - "y\263\000x\262\001x\262\001i\236\002k\243\001i\237\001i\244\001i\244\001l\247\000j\241\001o\242" - "\002s\253\002s\244\001u\255\002t\260\001l\242\001k\250\001j\242\001l\245\001s\256\005e\240\001" - "d\243\001i\246\001g\243\001f\243\001c\232\001o\247\004u\261\010n\251\001n\244\001k\243\001^" - "\222\000s\260\016c\245\004^\240\002m\254\025n\252\021l\244\005p\247\001t\252\002p\250\001" - "k\243\001m\245\002k\233\001j\234\001h\233\002r\254\003x\257\001\200\256\001\207\263\002o\235" - "\001e\231\001^\217\001b\234\001m\251\001u\260\001i\233\001]\220\002m\242\001j\236\002k\242\002" - "b\226\002\\\232\000\260\273\205\302\255\264\320\274\307\337\316\335\376\373\375" - "\344\325\337\342\317\327\334\302\305\325\275\275\356\333\311l\242\012\\\220" - "\002W\215\001b\233\000e\234\001j\237\000o\244\001n\243\002o\247\001l\245\001n\246\002g\235\002" - "d\236\001Z\230\002{\260\002g\237\002i\250\003\201\267$g\244\004j\247\003a\227\002c\235\002" - "`\235\000\204\254/\372\354\350\315\265\257\311\253\240\340\315\315\340\320" - "\323\304\261\264\270\241\236\273\245\237\312\272\260S\225\002_\240\003a\231\002" - "^\225\001]\224\002c\243\002c\236\001e\243\001c\233\002j\240\001j\235\002|\256\001\201\262\001" - "q\242\002r\251\002m\245\001k\240\001n\245\002p\251\001i\235\002i\240\001q\253\001|\264\002~\263" - "\001z\264\001n\246\001l\245\002l\251\001i\245\001n\247\007\204\266\037}\261\023m\240\001v\254" - "\001x\246\002}\255\001}\260\001s\244\002t\255\001m\244\001m\243\001j\244\002d\235\002e\236\002" - "j\243\001q\252\003b\234\001b\240\001l\252\005c\242\001p\257\006o\250\001p\245\001m\242\001y\263" - "\012g\241\000e\245\006_\240\022d\243\025g\240\007w\255\005{\254\001z\257\001v\257\002s\255" - "\005o\244\005k\240\001g\232\000s\253\002\200\264\002\212\264\001\214\262\001w\246\002l\243" - "\002c\227\001^\226\001i\247\001p\254\001b\225\002g\230\001p\241\002p\247\001h\235\001a\227\001" - "T\216\000\266\276\217\301\243\243\277\235\237\353\334\343\365\353\363\366\353" - "\362\351\327\337\314\262\267\340\314\320\306\253\250\320\317\230T\210\013" - "b\230\036`\222\"`\217'n\236\061q\243'e\234\015f\242\010h\244\007d\236\004`\222\001" - "d\237\001b\234\002w\260\004f\233\001y\261\"o\255\033p\257\027f\247\004e\242\001a\233\000" - "\222\271A\362\341\324\303\247\244\340\310\306\332\305\303\331\306\310\324" - "\306\313\312\275\302\277\256\257\270\244\241\316\274\266\\\231\001d\241\001c" - "\230\001b\226\002h\243\002d\236\001o\257\007c\237\001`\231\001g\244\002j\235\002~\260\001\201" - "\263\001w\250\001q\246\002n\245\001l\240\001r\247\001s\253\001e\231\002h\242\002v\260\001~\262" - "\002|\252\001{\260\000s\251\000v\263\007t\257\017x\264\032\213\301\065\206\274,\201\270" - "\036q\254\001x\262\001|\261\001{\255\002u\250\002p\237\001y\253\001|\253\002m\234\001k\236\001" - "j\241\001l\243\002n\242\001q\250\002f\233\002k\245\006m\250\005`\232\002j\247\005q\250\001|\260" - "\001o\240\001s\253\002o\240\001n\245\002i\246\035X\230\012k\246\027\214\275)\202\265\013" - "|\261\001}\266\013z\264\025w\260\031r\253\025\210\276*\211\300$r\243\000\177\252" - "\001\222\272\001n\235\002f\231\002h\242\001c\237\002e\243\002p\256\002j\236\002i\231\002q\242" - "\001t\246\002j\235\002a\227\001R\214\000\304\310\242\314\257\261\333\301\307\366\351" - "\363\372\370\372\370\361\366\350\333\340\341\313\316\310\254\255\305\256" - "\247\327\272\254\275\271\244hokehl^`i_ckhqtq\201rt\217fm\216Kx\242Ga\223" - "\037_\225\025a\224\016v\253\020g\235\006p\247\031l\251\032g\244\015`\231\000g\244\000" - "\263\312g\344\314\303\274\233\221\306\246\236\333\305\302\333\310\311\331" - "\310\316\342\326\340\310\274\307\273\253\265\273\250\252\310\266\263Y\227" - "\002c\235\002b\226\001l\243\002r\253\001m\246\001i\251\002c\246\002_\227\000i\245\001l\236\001" - "\202\264\001x\250\001r\247\001p\251\001o\245\001n\240\002u\255\001y\261\001f\232\002f\235\001" - "t\251\002\200\263\001y\251\000\206\273\015\201\271\026\215\304\063\204\277\063p\256" - "\030g\246\005n\252\001m\244\001l\237\001p\244\001p\244\002q\252\001p\253\002k\235\002\177\261" - "\001}\254\002p\234\001u\247\001t\251\001r\245\002t\253\001e\232\001t\252\007o\247\003i\241\002" - "g\237\001i\242\003p\247\001\206\265\001|\256\001n\245\001i\237\000h\243\002m\252\036c\241" - "\037q\256-l\250\026\202\265\016\204\264\004z\255\002r\252\006w\261\026{\266\040~\267" - "\040}\270\027r\246\000w\244\001\207\263\001{\252\001j\233\002q\253\001k\245\001k\244\002o\252" - "\001s\253\001o\237\002u\250\001o\240\001h\232\001f\236\003V\210\000\303\303\236\317\266\270" - "\330\277\307\341\316\331\352\330\343\335\313\325\345\324\334\311\264\270" - "\273\242\241\300\251\247\202_]\302\243\222o]a\177pwUEXWI_UI`UJad[ntn~|z\205" - "\201\207\210z\204z{\215iq\222Er\231Ee\225,l\236-d\231\032`\224\012\300\322" - "|\311\262\251\251\216\213\311\257\252\320\272\265\342\317\316\366\356\361" - "\341\323\334\340\325\336\307\271\304\274\250\261\271\242\241\333\303\276" - "_\231\004i\240\001o\241\002z\260\001n\240\002a\227\001d\245\001f\252\003e\235\002p\250\001u\246" - "\002\206\265\001b\226\002h\236\002i\245\001m\244\002o\244\001z\265\005w\262\003p\246\001o\242" - "\002v\252\001|\264\000\203\273\016\201\272\027u\257\014y\263\017\\\223\000d\241\001h\237" - "\001q\243\001q\241\001x\251\002o\236\002o\241\001l\241\002m\243\001y\254\001\202\264\001q\236" - "\001s\241\002u\246\002q\244\001q\245\002\201\271\011^\222\002n\247\005l\243\001n\241\002r\251" - "\002f\230\000s\250\002\200\257\001\201\264\003z\260\021m\244\014g\237\003l\247\022q\254" - "$j\250\035b\241\004n\247\002y\253\002\201\261\002y\253\001u\256\006x\262\020\202\273\036" - "r\256\010s\254\001z\253\001y\246\001\202\262\001w\246\001v\247\002u\251\001u\241\002\177\257" - "\001v\251\001u\257\001k\244\001h\236\002c\225\002c\231\001Y\214\000\312\312\244\340\306\307" - "\333\276\304\367\355\363\375\376\376\367\353\364\360\340\351\333\307\314" - "\304\254\253\255\215\214\325\275\266\317\265\254\316\267\264\336\312\310" - "\331\306\313\330\314\323\267\246\265p^x~l\211\226\207\234\211z\222\202q\211" - "|m\200\226\206\221vjvgamhhnv}x\206\216}\311\313\252\340\313\304\261\221\215" - "\311\260\253\337\312\310\320\266\266\357\337\344\320\275\306\356\342\353" - "\343\330\345\312\275\312\302\257\267\302\256\253\316\275\263[\232\000l\243" - "\002y\253\001{\252\001l\233\002j\242\001f\247\002d\240\002j\247\001t\253\001x\252\001\200\256" - "\002_\223\001`\225\002d\245\001l\251\001p\253\001v\261\002p\244\001v\256\001v\247\001\200\267" - "\001\177\267\002\200\267\005r\251\002n\247\001\204\274\017e\230\001f\231\001l\243\001i\231" - "\002o\237\002|\255\001z\246\002p\236\002n\234\001v\250\001|\261\002{\251\002v\237\001{\251\001" - "w\247\001r\245\001y\257\000\202\272\005^\222\001i\244\002q\251\003m\235\001o\247\001l\236\001" - "q\243\001y\253\002\200\262\003\210\267\027\226\302\067m\243\006j\242\002v\257\030c\243" - "\015o\256\024r\255\005s\244\002u\251\001}\266\014j\246\003s\255\022\205\276*i\235\005r" - "\237\002\177\255\001{\247\002w\244\001\177\261\002y\251\001x\246\002}\250\002\205\261\001t" - "\243\003o\245\002m\250\001d\235\002Y\214\001\\\215\001Z\217\000\306\306\234\340\302\300" - "\347\315\321\334\312\324\366\356\363\357\342\351\354\332\334\344\315\312" - "\327\274\266\354\331\324\364\341\336\347\325\324\362\342\347\364\352\357" - "\371\365\370\371\363\367\343\324\336\343\324\336\353\341\351\365\356\363" - "\370\363\366\341\324\335\301\255\265\321\276\274\311\262\254\270\231\215" - "\260\225\213\245\213\210\272\243\233\261\221\201\212ic\263\223\217\315\263" - "\257\334\311\311\353\334\337\364\353\361\324\304\317\343\325\337\330\313" - "\331\303\262\300\277\251\260\277\246\244\310\275\255_\243\000h\240\001j\232\002" - "z\252\002t\244\001n\244\001f\240\002e\234\001k\246\001u\254\001|\254\001y\250\001[\217\002`\224" - "\001k\251\004v\265\006p\245\001u\251\001s\250\001t\254\001t\251\001{\260\001~\255\001\205\265" - "\002\205\264\001\200\262\001|\266\003`\222\002k\241\002j\242\001l\244\001y\257\002t\244\001u" - "\243\001x\246\001w\247\001u\255\001n\241\001q\243\002\217\271\020\206\262\007y\254\002\177" - "\267\002\202\270\002~\260\002c\236\001c\235\002g\244\002p\252\005o\250\001o\246\002q\251\001" - "t\245\002~\256\001\210\265\020\233\302\064j\237\001p\247\004t\255\006e\242\004r\257\024" - "l\242\001{\256\001w\256\002i\245\000\210\267\061i\244\024\200\271)b\227\000k\235\002q\250" - "\001q\250\002o\243\001u\253\001x\257\001v\255\001v\255\001u\255\002m\240\001n\237\001r\255\001" - "a\226\002X\213\002_\220\001]\222\000\274\303\207\341\276\267\354\314\313\344\317" - "\330\345\327\340\356\341\343\362\342\337\362\342\336\372\364\364\337\313" - "\313\266\232\235\334\307\313\375\371\371\263\235\251\363\354\357\317\273" - "\306\345\325\337\362\346\354\344\327\337\300\257\266\350\335\342\353\336" - "\342\315\263\262\336\305\303\345\320\312\345\316\306\344\310\272\336\277" - "\251\322\263\232\315\253\223\276\241\220\315\257\245\254\217\212\355\332" - "\333\331\303\312\361\346\355\333\310\323\322\300\313\302\261\274\276\254" - "\265\301\252\255\314\263\254\266\271\210d\246\000h\241\001h\230\001|\256\001w\254" - "\003l\235\001g\230\002i\235\001l\236\001u\252\001{\256\001k\231\002Y\215\001k\247\007y\267\013" - "n\247\000r\246\002q\246\001v\256\001}\271\011t\253\001z\255\001|\255\001z\245\003\204\261" - "\001\215\275\001u\257\003b\225\001m\246\002q\255\002o\246\001y\266\003i\237\000l\236\002l\234" - "\001u\251\001r\253\002o\244\001m\242\000\220\302\035\200\264\007\202\267\003\204\273\005}" - "\260\001|\254\001g\244\002i\243\002f\237\001\203\272\021v\256\003o\250\001p\247\002q\245\001" - "|\253\001\210\267\016~\255\012q\244\003l\243\002i\242\002l\251\005k\250\005k\244\004u\255" - "\001r\244\001\203\255\015\264\301al\245\034\202\270/l\245\003o\244\002p\245\001t\254" - "\011z\261\025r\254\015l\252\006k\250\002v\262\011m\253\004h\244\001m\246\001k\244\001h\242" - "\001c\227\001_\217\002X\215\000\254\271v\334\265\255\337\274\264\364\342\343\356" - "\335\337\367\351\352\331\305\305\360\344\344\363\350\351\277\237\244\311" - "\253\256\373\364\366\337\310\313\334\313\320\357\344\351\320\275\310\354" - "\336\346\345\327\334\240\211\220\327\304\303\375\373\374\347\324\325\214" - "su\330\303\277\342\326\322\353\330\325\366\343\331\325\267\247\342\301\251" - "\347\311\256\370\344\316\315\262\244\327\300\271\346\325\326\330\305\315" - "\351\332\344\361\347\357\272\251\266\276\255\273\274\247\263\315\266\270" - "\333\300\274\240\264cc\240\000e\233\001u\251\002\205\265\002n\235\001l\236\001h\231\001" - "l\240\002p\244\002q\247\001n\244\001i\231\001l\243\005{\265\024p\254\002r\256\001n\244\001r" - "\253\001v\263\004k\244\003m\244\001z\257\001w\246\001h\223\002}\255\001\205\271\000\203\274" - "\027g\233\000i\241\001x\261\001\202\272\001l\247\001r\261\016g\237\001o\242\001t\250\001s\253" - "\000p\244\002u\244\001\213\275\003\204\272\003\177\265\001|\257\001v\245\002u\246\001a\234" - "\001g\240\002b\230\002\201\270\021z\260\010i\236\002k\244\002s\254\002u\252\001}\261\005q\246" - "\001f\234\001h\234\002e\232\002i\245\003h\246\005e\244\007g\243\005c\232\000\250\266\062|\245" - "\040f\241\017v\260\030v\253\005w\243\001\203\263\017\214\273&\204\265\035g\241\005X" - "\223\000a\230\001r\253\001s\246\001l\236\001h\244\001d\234\002f\240\001f\235\005[\216\005X\205" - "\021\226\246q\347\306\306\310\243\246\360\333\332\352\331\327\325\304\301" - "\306\262\257\372\363\363\327\301\275\245vn\365\344\337\347\321\320\334\307" - "\305\342\327\334\353\336\346\350\332\342\356\344\351\356\343\347\352\334" - "\335\372\356\353\374\371\367\345\317\306\201bW\276\237\223\366\355\353\335" - "\316\310\304\256\247\342\314\303\351\321\300\323\267\243\344\310\264\352" - "\332\313\356\337\327\356\340\335\350\331\334\351\335\344\322\301\320\267" - "\245\265\274\252\272\274\253\271\340\306\304\353\316\315z\244#e\234\002j\240" - "\001z\262\001\177\264\001t\244\001p\243\001l\243\001p\257\001o\256\001n\246\001p\251\001q\245" - "\001\202\265\011l\237\002m\246\001l\252\001g\241\001k\247\001j\246\002e\233\001t\254\003~\263" - "\002w\246\001o\237\001z\257\002x\255\000\200\270\010r\243\003{\255\001\206\272\002\201\263" - "\000n\243\001t\261\011j\246\001o\252\001s\246\001v\253\001y\252\001\206\271\001\205\271\002" - "~\262\001|\256\001}\261\001s\242\001r\246\001^\234\002b\232\001l\243\001s\252\004}\265\022a" - "\230\001d\236\001m\253\007q\255\005z\265\012g\241\002e\234\002c\231\002i\236\001r\252\006l\245" - "\004c\236\002l\244\011g\233\000\221\251\015c\225\000d\233\003g\240\003w\256\006u\253\002x\255" - "\010g\235\000\200\262\001s\245\001\\\225\000a\231\001n\250\001t\250\001w\254\001n\244\001c\235" - "\001h\245\024h\234*`\217\061s\213e\202\204\202\340\301\300\355\334\333\370\361" - "\360\371\365\366\333\310\315\353\340\342\374\370\370\350\325\314\233qZ\354" - "\322\310\335\306\301\345\320\324\346\330\341\336\316\331\355\342\351\344" - "\324\336\320\275\307\334\310\314\332\303\301\357\332\317\352\317\276vI.\331" - "\273\246\376\377\377\364\347\342\247\214\213\272\235\232\320\271\262\363" - "\337\320\335\302\254\353\320\277\372\360\351\344\327\322\371\363\363\363" - "\353\357\301\253\272\262\235\255\267\241\261\316\263\270\341\276\260\334" - "\305\253a\234\000i\237\001v\263\006p\245\001|\263\001x\251\002w\263\003q\254\002t\255\003|" - "\261\004u\251\001r\251\002r\253\001n\242\001i\231\002m\245\002q\254\001k\246\002l\251\001m\252" - "\001l\244\002u\254\002\201\266\004s\242\001q\237\001v\255\001s\255\001\221\306,v\253\012\225" - "\304\035\203\264\000\200\261\001|\254\001y\257\002m\245\001s\253\002w\254\002~\261\001\207" - "\273\001\207\273\001\204\271\001|\256\001\202\272\002z\256\001n\240\001t\253\002r\254\040" - "d\227\000q\246\001r\247\001\203\272\030l\251\006b\240\003_\232\001h\246\003v\262\014m\245" - "\002f\235\003k\243\007p\247\007r\252\005j\242\002Z\224\000p\247\030p\242\015u\243\011i\227" - "\001l\243\002r\252\012o\252\007j\237\001n\240\001x\251\001\200\256\001\207\265\001W\223\002" - "X\224\001d\240\001j\236\001o\242\000q\246\001i\242\001h\242\027r\221g{\213~\203\205\214" - "\251\231\245\344\316\312\372\366\365\372\364\364\276\245\246\201eg\201jg" - "\266\235\223\364\326\310\351\306\260\367\337\321\341\304\273\345\316\313" - "\334\306\314\341\317\327\334\312\323\325\301\310\320\276\300\310\260\255" - "\327\277\265\351\316\277\322\256\227\223gG\375\367\357\366\356\352\344\327" - "\325\342\316\317\354\335\331\307\255\246\344\314\277\335\302\254\340\304" - "\257\360\337\321\353\332\322\365\347\344\351\327\332\321\274\307\262\231" - "\246\273\240\247\341\276\262\353\306\275\216\252;m\247\001i\237\001m\250\002p\242" - "\001\177\265\001z\256\002r\253\001o\236\001s\243\001\202\261\004\210\272\014y\260\011o\251" - "\006b\233\002c\233\001r\255\001v\252\001y\262\001s\253\001o\250\001r\250\002\177\265\010~\263" - "\003|\255\002{\247\001\201\262\001y\257\000\201\272\037\207\276\063\233\312Dz\256\000{" - "\254\001q\240\002r\247\001r\255\001t\260\003v\256\002\206\271\001\213\277\001}\253\001\202" - "\264\001\201\264\001\207\276\005{\255\001s\252\001l\245\001|\265\062k\246\011e\233\001o\250" - "\005\205\273!\177\266\034q\252\016l\245\012p\251\013y\261\015r\255\010e\237\001i\245" - "\007{\260\024|\256\022s\246\020R\220\003c\232\014v\245\021o\240\011d\232\002o\250\001o" - "\247\002l\240\001r\245\001t\241\002\200\263\002q\237\001y\254\003k\241\004b\230\002d\231\001" - "j\244\001k\243\002f\235\001i\243\007r\242*|\203\206|}\211\221\206\227\311\272\300" - "\370\354\351\373\364\357\302\231\211J*\037%\012\005\"\013\003\027\001\000\066\026\021\332" - "\263\234\373\363\343\340\314\303\335\301\274\333\304\303\330\276\304\274" - "\246\254\265\240\242\266\232\227\344\313\300\354\323\305\353\322\275\317" - "\252\212\352\315\263\324\273\251\272\240\223\273\244\241\276\253\256\356" - "\343\343\342\321\320\346\321\312\335\302\265\330\276\252\321\264\242\372" - "\363\355\352\327\330\304\253\272\265\232\253\254\215\233\326\255\237\335" - "\264\242\340\315\262c\233\000n\247\002l\244\001q\254\001w\256\001w\261\001o\250\001j\242" - "\002n\241\000r\240\001u\244\001t\252\000\202\272\037\177\270\060e\235\002d\232\001r\251\002" - "{\256\001}\260\001|\256\001y\255\002|\257\001\204\271\006|\260\001}\257\001\202\262\001\200" - "\257\001r\247\006\213\304\066\207\300\070\215\305\070q\252\000r\254\001u\261\005m\250" - "\001q\255\004l\245\001\203\266\001\211\276\001\206\270\002{\251\002\200\264\001\202\265\003" - "{\256\001{\261\002v\262\002p\250\001~\270\"w\261\016`\224\001a\233\003\200\266\030\214" - "\276(\200\264\033\177\263\036~\264\032\177\265\027u\256\010b\234\002_\226\001d\241" - "\002v\253\033v\250(S\215\014n\240\026\204\253\031\217\265,m\244\016t\256\010q\254" - "\002k\240\001u\252\005}\256\004w\254\003l\245\010l\244\013\202\263#\211\267+c\225\000h" - "\242\002X\214\000i\240\027d\226'\201\221w\201|\210\207{\214\236\223\235\367\346" - "\337\352\320\312\354\317\300\237mW\066\023\017bA(\316\305\314\241\236\265fM" - "CI$\026\377\363\344\356\323\274\373\353\340\331\256\230\352\322\304\325\273" - "\264\346\316\303\326\271\254\375\372\363\376\375\366\370\337\310\301\241" - "\207<%\035\030\003\010\033\004\013\035\006\006\070\"\036\233\202{\347\330\326\350\334\330" - "\307\255\236\341\312\270\324\272\244\360\340\323\371\364\361\337\317\325" - "\273\236\257\326\266\267\345\277\264\366\332\320tfKs\255\000r\246\001v\255\002" - "{\266\005r\255\001t\261\003h\241\001k\240\001w\251\001{\252\002~\252\001z\254\001m\246\000j\247" - "\031\210\276\071i\236\000{\257\001\206\267\002}\255\001z\255\001|\260\001~\260\000\214\301" - "\013|\257\001z\253\000\203\272\005z\261\010t\255\015\222\307B\212\301>{\270#u\263" - "\003p\254\001q\257\007m\254\007h\242\001\177\261\001\232\305\002~\255\002v\246\001s\253\002\212" - "\301\036\211\300\034y\260\003{\256\002z\261\001s\247\001x\256\011}\263\005c\234\002b\233" - "\002u\253\006\207\271\031|\260\015q\251\006c\233\000z\260\020\200\266\027d\237\004]\233" - "\001b\240\005g\240\010f\236\022O\214\004]\225\012\221\263\062\202\247&{\252\040y\256" - "\034d\240\006l\250\023\206\270%\210\270\030w\247\001l\240\001q\250\013\202\265&\212" - "\271\071V\206\000i\237\027i\233\035v\243~\271\024q\252\000t\244\001~\256\002~\263\001v\253\001o\246" - "\007\200\264\005g\242\012b\237\006r\253\010y\260\012\201\265\022p\247\006c\234\002s\254" - "\024\200\266\037t\253\017p\251\016b\231\000c\230\001_\234\007I\213\002U\224\014\202\255" - ".a\223\021m\240\037x\255,b\235\020x\261*|\261!~\262\026r\243\002l\236\002q\246\004" - "\203\271\036v\255\030Y\222\005l\240#m\235\060t\226\\\200\200\211{u\201\213}\215" - "\235\211\227\264\232\241\315\265\264\335\306\306\361\351\350\357\346\345" - "\243\224\216\327\320\260\346\335\275\346\335\276\337\325\304\263\224\216" - "\367\330\301\370\331\273\364\321\262\363\310\247\361\310\244\362\313\256" - "\366\332\306\331\257\237\363\326\272jJD$\025\031m^\071\302\272\243\330\332\347" - "\260\262\317\323\330\337\214mK\064\027\024k@\062\311\246\223\312\253\226\264" - "\221|\322\265\244\340\311\274\347\331\325\331\302\302\310\227\207\331\251" - "\215\367\340\321\300\234\214\227\227\177w\246(u\247\011\202\266\017|\260\004" - "y\255\001{\262\002y\264\003p\251\001s\252\001z\254\002|\255\001w\245\001q\242\001t\247\001|\261" - "\004}\264\001\177\261\001\203\264\001\203\262\001~\247\001\203\264\002\202\263\001\207\276" - "\005v\250\001y\252\001\203\266\002\203\270\005\216\304L\230\316Yz\271#q\260\004r\255" - "\001t\260\002t\255\002}\256\001\213\276\002\177\264\001v\255\000w\261\010\221\306@\207\275" - "+t\257\000t\253\001z\256\002}\254\001\200\266\001v\247\001u\244\001\204\264\015m\247\040" - "V\224\003h\245\016l\247\012|\264\040m\247\024k\247\032i\246\027\203\271)m\243\005\206" - "\267#k\240\011a\233\007\\\231\022O\220\002W\226\003m\243\015}\255!n\237\024~\257\063" - "e\237\036\212\277A{\261\"x\256\031_\225\003[\213\001U\207\000t\251)}\262\034\202\266" - ",|\254>~\251W\200\214\202\201|\211\210|\215\206w\211\314\267\266\261\225" - "\224\272\233\221\274\235\217\267\233\221\324\275\271\361\343\343\376\375" - "\372\375\374\367\371\360\347\324\251\231\310\242\244\327\260\262\336\272" - "\275\327\261\267\313\246\254\271\223\226\325\242\201\344\307\267\307\242" - "\234\207VSk@EzTF\263\240\200\333\325\263\337\337\322\334\336\326\342\345" - "\333\303\276\242w\\G\362\343\331\371\355\344\273\240\226\243\213\177\330" - "\276\260\326\276\262\344\322\313\347\322\317\305\237\217\331\267\245\354" - "\324\303\253s_\226\227\231\206\237zu\242\066u\251\020q\247\002p\245\001t\260\006" - "k\247\002q\256\001x\257\001x\244\001|\250\002{\251\001z\250\002|\253\002{\251\001\177\266\003" - "\207\301\013\210\274\005\204\261\001\202\255\001\200\257\001\177\261\001\200\272\004t" - "\247\001{\256\001\201\265\000\236\316:\204\273\062\210\302Fx\266\040q\255\003s\255" - "\001u\261\002{\263\001\215\300\001\203\263\001v\254\001w\266\012\235\322W\201\273(p\253" - "\003r\256\001w\262\001u\243\001\177\256\001\177\257\001z\251\002\221\263\002|\252\004\201\266" - "DP\220\010Z\232\016\\\234\012t\257)u\254\032\211\273!r\250\007\200\266\037s\250" - "\023\177\263\062\214\275N\217\277Y\204\267OV\222\003X\220\002_\230\001w\251\034z\251" - "\040}\255-n\244#\201\267\061f\236\007v\255#]\225\015U\207\001N~\000\207\265Xl\241" - "\011\210\267$~\253\066{\226o|u\204\220\203\223\211y\210\277\251\257\247\213" - "\213\260\216\214\276\233\223\340\305\273\324\265\260\316\257\254\346\316" - "\312\346\317\311\360\336\326\355\331\311\374\346\310\277rP\301|`\361\254" - "\226\366\265\242\335\230\201\250pf\235m]\312\243\213\262\217\205\313\250" - "\234\250dW\377\360\320\373\370\352\354\347\327\356\352\331\366\362\342\360" - "\356\342\334\331\323\377\375\375\351\336\336\336\313\311\361\341\335\227" - "\204\204t\\]\332\306\277\350\327\322\327\303\275\266\222\206\257\217}\240" - "xa\220lX|v~\235\240\246\230\253\215x\253/n\243\015t\255\013s\260\011f\237\003" - "m\241\002|\260\001w\243\001\200\253\002}\247\001|\250\001y\247\001|\254\002\203\274\011\207" - "\301\032~\266\012\203\271\012~\262\001x\251\001w\255\002p\243\001p\237\001~\262\011\235" - "\314\065x\255\001|\265\030e\243\032\201\274:p\255\013u\260\001x\263\002\177\265\001\204" - "\267\002{\255\002t\247\001u\261\011\206\274\"\224\305.z\261\007x\262\001u\252\002u\252" - "\003y\257\002}\262\001~\261\001\234\277\002w\253\021\212\276M_\234&j\242.}\263\067\207" - "\271\013\221\275\001\211\263\000}\254\013\201\263\030t\251\011q\246\014v\254\020\177" - "\264\031s\253\007h\235\000e\234\001g\242\002p\251\012x\255\021u\254\022~\264){\263&]" - "\225\003l\242\031}\262\065[\214\000Lw\000u\246\071m\236'\177\254\065\205\250O\215\223" - "\222\201u\202\217\177\215\237\216\227\320\275\276\255\232\237\274\245\244" - "\343\311\301\346\321\307\325\272\261\311\255\250\320\267\264\360\341\327" - "\363\347\331\374\373\366\377\372\365\207bVY*\040\316iI\311pR\004\000\000F\035\011" - ":\025\021\327\244~\363\324\266\367\352\330\320\255\245\362\344\327\365\350" - "\341\362\350\342\360\341\333\347\330\322\323\271\263\304\247\242\233yu\210" - "je\253\220\210\310\262\245\307\262\251eTZ\254\224\220\341\316\307\343\317" - "\312\252\217\214iPGN\062#\\G\067\204x\205\236\230\245\250\247\257\242\254\235" - "\205\251Qm\237\014}\260\021k\236\001p\241\001z\257\001u\243\002~\257\001s\241\002s\246" - "\001|\262\002\204\266\003\204\270\003\215\277\030z\256\005\202\270\017~\262\002~\260\001" - "{\255\002r\241\001|\264\021\246\322g\212\271\036}\257\001m\243\001[\224\000x\265$\201" - "\274&}\265\005\203\267\001\203\264\001{\254\001x\250\002u\253\001s\255\001{\265\004}\264" - "\005}\256\001\177\263\001u\246\002s\247\001z\253\001\201\260\000\177\256\002\227\276\000\201" - "\271;o\246\037\205\272\060\231\307\034\207\271\004t\252\003p\245\001}\260\014\211\270" - "(\204\265\031\177\262\010\215\274\031\236\310\067\231\306\062\224\303'\204\267" - "\016p\250\002q\255\014~\267+i\244\025e\236\020\204\270:\214\277Hf\235\031e\232\022" - "\240\312e\200\256\067\200\244C\213\256`\211\255c\200\242a\214\231\215\212" - "\204\217\241\225\241\206u\201\273\247\251\321\275\272\245\207\213\265\231" - "\224\277\244\233\237\207\177\255\223\220\306\257\251\362\343\332\331\266" - "\250\354\311\261\374\372\370\375\375\375\377\377\377\233ln\236M\070\261iQ" - "sWa\332\314\312\377\374\363\376\376\372\377\376\355\374\357\332\342\312\270" - "\356\334\321\355\334\327\306\251\252\262\223\223\323\271\265\323\266\261" - "\263\226\222\311\256\243\263\226\211\247\212{\236\204w\242\207{\235\206\177" - "y`a\307\264\260\311\265\262\320\274\267\234\205\200YC=bKB\225\203\210\213" - "~\214\233\225\243\240\237\250\225\237\227\210\250W\203\265#z\253\000|\253\002" - "\177\261\001~\260\000{\260\001q\244\001r\253\003{\264\003\206\267\003\203\262\001\204\264" - "\004~\261\003{\261\007~\270\016{\256\001{\252\002x\260\001\200\267\"\221\304?z\245\000~" - "\257\001d\225\001k\240\001~\270\013\177\270\023\204\274\012\204\267\001~\262\001s\252" - "\001q\246\002w\260\001x\260\001w\255\001|\253\001\204\270\001\201\262\001y\251\001q\241\001\220" - "\276\033\217\275\014u\246\001\221\274\001q\254\035\215\300\060\201\265\024n\247%Z" - "\226\034W\224\023j\243\021r\250\010x\253\001\202\262\002\216\275\022\206\270$\210" - "\267\071\204\263\066\210\267:\200\260#{\255\000{\257\040q\243%q\240+k\233$\204" - "\260\064\235\304Y\211\266A\215\272E\212\273Hm\242-b\227'r\225U\204\234z\213" - "\226\213\220\214\230\225\210\230\233\214\230rap\277\255\251\272\244\245\274" - "\247\247\323\274\257\250\217\213\270\237\234\244\215\213\367\357\353\374" - "\363\350\372\344\321\341\304\263\375\372\372\375\375\375\376\376\376\275" - "\260\273L*\065yZj\365\363\367\375\375\375\375\375\375\374\372\370\325\266" - "\243\326\253\220\303\237\226\325\267\256\370\355\346\335\312\307\267\240" - "\242\302\250\245\271\237\234\321\273\271\306\261\257\262\227\221\247\213" - "\203\273\250\230\214tl\234\202|lTV\260\233\224\260\231\223\337\313\307\321" - "\274\273\241\207\212{db\221|z\215\177\211\216\203\224\220\213\232\222\221" - "\234\222\234\227\207\257Uz\253\014u\243\001\177\260\003{\252\001z\256\001s\243\001w" - "\255\001{\252\001\202\262\001\202\260\002~\256\001\210\272\010\223\304\061|\264\032x\260" - "\014~\256\001z\256\001\201\273\017{\256\007}\253\001|\253\001Z\222\000q\252\001\200\270\001" - "\177\264\000~\262\001y\253\002v\257\001q\251\001p\242\001{\254\001\202\263\002~\254\001\203" - "\263\001\202\265\001~\263\001z\261\002r\250\000\202\272\025{\262\011v\250\001\215\271\002" - "\177\271-^\232\015i\242+u\252?^\227(t\250?\212\271/v\250\015c\224\001\201\257" - "\001\214\275\003|\261\014[\226\010n\244#k\241\032X\216\002\213\271\000\206\267\065~\256" - "\071\241\314b\220\275@\200\257*\213\270@\203\263Bw\250:q\245\061p\242.q\236" - "Aq\210p\207\216\221\222\220\236\213\200\222\227\212\233xly\217~\205\301\256" - "\247\233\211\205\322\270\254\333\276\251\202_N|f]\367\362\361\345\314\276" - "\336\273\251\341\302\264\375\366\363\375\377\377\375\374\375\373\367\372" - "\347\337\353\207n\203\322\303\320\366\361\362\376\377\377\373\374\373\360" - "\341\333\316\251\217\370\332\276\333\273\245\316\262\240\316\253\227\336" - "\310\302\317\300\303\225~~\266\241\235\252\224\220\255\225\220\265\234\223" - "\270\236\220\242\207y\227|s\231\202}m[Z\236\214\205\260\234\230\324\302\277" - "\317\273\271\262\240\241\246\223\224\243\217\221\244\223\232\214\177\217" - "\200v\210\210\203\224\212\211\226\230\246\240u\242Kn\245\036\206\274\063r\247" - "\002w\246\001v\245\002\177\262\001\201\260\001\201\263\001{\256\002u\252\001\212\274\034\220" - "\301&m\244\000s\261\007\201\267\001\200\255\002\204\264\002\201\254\001\200\253\001y\247" - "\001\210\261\034\177\257\004\203\271\000\201\264\001{\257\000s\255\003p\252\001v\253\001\213" - "\274\003}\254\002\201\262\001}\253\002\202\261\000\201\265\001y\251\001|\263\002w\260\002u" - "\257\000u\256\001s\246\002\207\277\061p\256\"p\254)l\247(n\246+u\253\060b\232\014" - "e\234\005X\215\003\\\221\000u\247\001\207\272\006z\257\006l\243\023g\233\024\\\221\004X\217" - "\011\215\271\001o\245\025\230\306b\216\277Jy\252\024y\251\030y\247!\225\300I[\221" - "\030q\242-p\240*\206\246e\244\244\253\253\246\264\243\231\252\234\223\243" - "\222\210\230{l}\217}\210\274\250\246\304\255\254\336\304\266\275\227\200" - "\254\211w\334\307\300\364\360\355\371\366\365\367\352\345\352\314\307\360" - "\325\325\372\364\365\372\364\365\373\366\373\302\263\302\205v\204\257\235" - "\253\316\267\277\340\314\317\362\344\344\372\363\363\373\356\353\265\214" - "w\265\205j\321\255\221\377\375\364\375\370\365\375\372\370\263\237\235\231" - "\205\201\312\270\254\266\243\223\274\247\225\317\272\254\266\236\221\274" - "\250\237\247\223\217{df\210qo\253\224\220\272\245\241\307\265\261\304\263" - "\256\230\201\203\245\216\222\263\244\253\230\213\230\177t\205\200x\213\212" - "\206\226\212\212\227\210\227\214}\251U|\260\065{\255\000\201\261\001u\245\002}\255" - "\001\200\263\001}\264\001w\257\003q\254\005\221\306F\177\264\027r\246\001p\250\002w\263" - "\004\177\256\001\203\256\001\200\251\001~\250\002x\245\002\210\267\011\206\267\004\205\270" - "\002}\257\001\202\265\007\226\302&t\247\000}\255\001\215\277\001\204\262\002\210\266\001" - "\204\257\001\210\271\001\203\263\001x\246\001\200\260\001w\246\002z\260\001~\264\001p\241" - "\002_\237\016M\213\000b\240\010}\265#d\240\003a\237\005o\252\016k\241\001f\225\001z\247" - "\015q\240\000\177\263\004q\252\002}\263![\201\000f\217\007i\224\017~\255\001\220\304\064" - "\201\263Aa\230\023T\207\002g\230\005{\253\035\220\274Bp\236\"\206\256Q\243\266" - "\220\246\252\253\226\222\237\202z\217\210~\222\222\207\230\240\222\241\233" - "\220\234\263\247\255\261\244\252\334\315\314\340\316\314\265\235\232\263" - "\231\230\371\366\367\375\372\367\343\311\276\346\313\305\373\362\361\371" - "\361\364\363\354\360\361\345\356\316\303\317\203q\203K\062B\221\205\222\316" - "\301\312\341\323\332\367\354\361\346\317\314\341\310\302\322\255\240\355" - "\332\317\332\276\254\257\213{\333\307\277\361\354\354\344\327\331\216\203" - "}JA?p]V`NK\224}r\316\273\262\304\261\254\247\223\225\237\214\214\203qp\267" - "\245\241\224\177}\273\246\246\303\260\260\251\225\232\237\212\221\320\303" - "\312\325\311\316\236\220\237\212\200\222\210\202\224\213\207\225\211\211" - "\223\211\233\204y\252\067l\227\001\203\260\001\206\266\001\203\266\002\204\271\003}" - "\260\001x\255\001v\263\007u\261\017m\235\000q\245\001r\252\001t\254\001\204\271\006\205\263" - "\001\206\260\001}\251\002{\247\001\205\265\001\206\265\002\204\266\001\177\260\001\203\260" - "\001\222\272\000\206\265\001x\251\002~\260\001\205\272\001\202\256\001\206\261\001\213\272" - "\002\210\267\001{\251\001|\253\002y\247\002}\260\001z\254\001r\241\002f\237\002[\223\001m\250" - "\026|\264\031t\255\010\\\224\001l\245\004x\254\003a\214\001]\215\002n\237\001\206\267\004" - "r\247\003\217\306)o\235\000g\215\001Qy\001w\256\023y\264$I|\003\200\261\040R\203\002^\216" - "\005}\251\033\261\317uq\230Cc\216;\226\244\221\246\244\255\251\242\261\235\221" - "\245vh{~j{\201jw\217z\200\216zx\201fc\340\305\261\337\272\237\261\203i\356" - "\337\331\367\362\362\347\330\321\363\346\337\337\311\277\300\251\250\312" - "\271\273\341\331\337\312\304\313|s\200\067\033)N\071EP=H\227\214\230\327\314" - "\325\314\276\305\326\304\303\337\314\311\344\314\304\271\230\214\303\231" - "|\377\367\357\355\341\331\323\301\273\313\302\301\306\266\257\301\254\243" - "\277\253\242\224|vbC\063\274\237\212\334\312\302\242\210\201\254\224\216i" - "RP\250\221\212\304\262\253\257\230\227\250\222\223\255\232\240\234\210\223" - "\263\241\254\313\276\304\327\313\320\234\221\240\220\207\231\204}\216\202" - "\177\216\211\214\225v\234Wi\235\013~\256\001\206\265\006\201\261\001\201\262\001}" - "\253\001~\257\002~\263\001x\250\001x\246\001x\247\002s\240\002w\257\003x\252\000\177\257\001" - "\203\263\001\201\255\002\177\253\002\207\265\001\206\263\002\207\270\001\205\256\002\222" - "\267\001\245\307\002\211\261\001{\256\001r\244\002~\261\001}\254\000\204\263\001\207\265" - "\001\211\272\001\200\257\001~\255\001\177\263\002}\256\001t\243\001z\252\001h\236\001f\237" - "\001t\257\030\210\277\060{\263\021t\257\012g\231\001s\246\001q\241\001p\235\002u\237\000" - "\226\303\071r\252\032\213\301\061x\257\011o\242\002^\216\000{\263\027l\242\012i\227" - "\023w\250\023Ev\000b\213\020\212\246\065\257\313\203\177\242f\234\245\242\206\204" - "\223\206\177\222\205|\220\203w\212h[n\211v\203\230\203\214\272\246\253\244" - "\223\225\271\251\246\367\347\337\336\306\266\317\272\257\323\306\303\362" - "\353\346\372\360\352\321\271\246\242\223\216\247\237\230\277\270\272\266" - "\257\266n`jUDLtdlgS^fT^ZFQ\203s\202\302\275\305\326\311\320\250\216\213\277" - "\243\232\350\321\310\320\300\271\312\253\222\342\321\301\377\374\370\322" - "\305\304\310\271\277\355\342\342\357\346\345\346\331\326\244\216\205\245" - "\216\205\322\277\267\301\251\235\265\233\217\205rlzd_\263\241\230\240\214" - "\211\264\243\237\260\241\245\227\205\223\216|\213\303\265\276\326\311\317" - "\315\301\310\235\222\243\214\205\226\206\202\223\212\212\227w\212w\231\277" - "`\205\265\012\211\265\004\213\271\001\204\260\001\177\260\001x\257\001r\243\001y\253\001" - "\177\256\001|\254\001}\254\007}\260\011x\252\002\177\260\002|\252\002~\254\001w\246\002t\244" - "\002\177\260\000\205\266\002\202\252\002\225\275\001\223\267\002\177\252\002\200\261\001" - "}\264\002t\246\001z\253\001\204\264\002\212\267\001\221\302\001\206\262\001\201\257\002\201" - "\262\001z\252\002w\246\001\206\266\001\227\277\002p\246\001l\245\001w\257\013o\246\001y\255" - "\002~\260\002\177\260\002{\250\001|\251\001\220\271!\226\304bV\223\000\207\273\061}\257" - "\025m\240\000t\254\004u\252\001y\253\004|\250\010\211\265Hz\241B\215\253I\221\255Z" - "\241\277\201w\213r||\205\202{\214\204x\211\212}\217|o\201ufu\272\253\257" - "\330\314\320\345\334\343\335\326\334\330\311\313\344\320\301\314\274\262" - "\334\317\313\345\327\322\353\341\341\357\351\350\270\252\224\235\206kwkY" - "\205\202xtnkj\\_\220}\205\222}\211\222~\213\200ht\213x\200k^bkcj\244\240" - "\241\267\253\252\240\215\214\201k[\305\262\242\330\304\270\322\310\277\337" - "\316\304\365\355\353\347\335\332\343\326\321\306\254\231\276\245\223\301" - "\261\247\237\222\220\274\254\247\343\322\315\263\236\216\226\200y_LN\224" - "\202}\233\211\203\221\177\200\250\231\235\227\206\223\230\213\232\254\233" - "\251\313\275\305\323\307\316\317\305\315\241\232\250\203}\217\211\207\225" - "\203\207\214u\232>\207\266\037\211\264\000\214\257\001\216\263\001\201\260\001t\252" - "\002q\243\001v\244\002z\246\002y\247\001y\254\006\200\267!\206\275\060w\251\000\207\264" - "\002\200\260\000v\246\001t\243\001\202\261\002\210\266\000\207\263\001\214\267\001\215\274" - "\004~\252\000~\262\001p\255\002k\242\001h\234\002\177\261\002\202\256\002\221\275\002\222\276" - "\001\201\260\002{\255\002x\247\001\177\261\001\202\264\001\214\264\001\203\265\003w\252\005" - "f\223\001z\257\002w\247\001d\224\002i\227\002\201\256\002\204\261\000\206\271*e\233\020" - "[\231\001r\252\035\202\263&}\261\032v\255\015p\247\003z\253\001~\255\000\205\255a\230" - "\273~\220\265X}\247Dk\224H\202\207\210\202~\212\203x\213\204w\213\202t\206" - "\246\234\250\256\245\255\317\305\315\342\325\335\312\276\305\300\266\300" - "\332\322\326\311\262\252\271\227}\334\304\256\320\302\272\325\307\277\305" - "\257\231\273\242\203\236\204bk_Lsk_rnl\255\241\244\275\261\271\254\235\250" - "\223\201\215\251\231\243\242\221\231\244\233\236odka_]\217\216\204\177tl" - "\245\236\231xgP\255\235\212\322\304\264\345\337\333\365\362\365\342\333\325" - "\316\274\255\242|]\271\232~\252\207i}XA\241\210\177\323\304\300\330\315\314" - "\273\245\235dLIye^\220|y\224\200\177\222\200\206\233\214\230\262\246\262" - "\247\227\245\262\241\255\313\275\307\313\277\310\306\272\304\226\214\235" - "\211\200\222\201}\213q\200is\246\015\177\261\006\177\247\002\226\265\002\203\254" - "\002f\225\001z\251\002\200\251\001\204\257\001p\233\002}\256\002{\257\004y\256\010v\252\005" - "\227\302\037\212\272\015\202\263\011x\246\001\205\261\001\213\270\001\207\256\001\212" - "\262\001\221\300\020\215\276\027z\264\002l\245\001n\251\001g\234\002|\265\003}\255\001\210" - "\265\001\222\274\002\204\263\001n\242\001v\252\001}\267\004}\267\001\210\261\002\206\256" - "\001\211\266\006o\232\002{\254\004i\234\002N\201\001]\216\002y\247\000\210\270\031\207\266" - "\015\200\253\001e\234\007b\232$\205\270\065v\255\036k\246\016b\235\000\216\271.\227" - "\275\070t\236\033}\251\070\215\266W\177\253Us\217c\213\207\222\221\210\224\225" - "\211\230\237\223\244\236\220\237\205w\205\301\262\274\327\312\324\360\346" - "\354\311\300\310\264\242\252\232\177}\241\212\201\334\317\307\325\310\277" - "\305\260\240\305\247\211\301\246\210\265\231}\215rY_M@mf`\254\251\253\314" - "\306\313\307\301\306\316\312\317\265\254\266\276\264\276\270\257\267\261" - "\252\261\254\251\257snnzulmcZsh_\237\230\207\270\263\237\313\305\264\316" - "\307\267\325\322\314\340\332\332\321\301\272\302\250\222\317\270\243\300" - "\246\215\245\201elJ\064\306\256\230\336\314\301\342\326\323\216\200\202lV" - "Q}kb\203qp\211y\202\223\203\220\252\232\250\276\261\272\276\256\270\262\240" - "\253\311\273\304\327\311\321\325\311\317\213}\222\210\177\217y|}m\234:v\253" - "/p\245\000\200\256\001\177\247\002p\234\001\177\254\002\205\261\001\177\250\001z\244\002" - "\200\250\002~\246\001\201\260\001q\241\002}\254\001\203\264\003|\253\002|\251\001\212\267" - "\001\206\262\001\203\254\001\206\257\001\202\252\001\202\264\001\201\272\005l\242\001q\253" - "\002k\236\002\177\262\003\210\267\015\217\267\001\212\263\001\214\271\002m\246\001r\252" - "\001|\260\001\202\264\001f\222\001\206\260\002\216\270\001\207\262\000j\234\001_\216\002V\206" - "\001u\243\002y\252\000\214\275Ab\224\011j\225\002w\250\005\200\263(\220\301Cw\255\062" - "\231\302e\243\305k|\252\007z\252\003k\235\007n\236#n\234\067p\231J~\206\203\213" - "\205\222\235\226\242\234\224\242\203v\210\221\202\220\260\236\246\322\305" - "\313\331\317\326\316\275\310\274\253\264\251\225\237\253\234\236\216zq\325" - "\305\267\317\274\255\322\300\256\315\275\252\302\261\235\271\247\226\272" - "\255\240\236\223\215\254\250\247\277\276\302\300\276\303\305\303\310\317" - "\314\322\276\267\277\303\300\306\311\307\314\265\261\266\317\317\322\270" - "\267\272\236\235\231}xrN?;`U\\\202pT\273\257\230\271\257\230\271\251\215" - "\300\264\243\335\325\323\344\331\327\332\312\301\320\275\254\306\254\222" - "xYD\222oV\345\324\307\351\340\331\250\234\240\240\222\233\216\200}s`a\204" - "v\200\224\206\223\244\225\243\261\241\255\301\262\274\272\251\263\300\260" - "\271\311\272\300\317\300\306\321\306\312\233\221\240ww\202x\221p\215\267" - "mn\247\001t\251\002y\250\001|\251\000~\252\002\201\257\001z\246\001z\244\001u\236\002\202\253" - "\001\205\262\002x\246\002r\241\002x\251\001}\263\001\201\263\002\202\254\002\207\264\002\204" - "\257\001\200\253\001\204\255\001\206\271\001z\257\002s\251\001u\254\001j\232\001m\236\000\224" - "\304\027\210\266\000\210\265\002|\252\002y\256\002v\252\001\177\260\001\204\263\001a\220" - "\001c\221\001\213\266\001\223\276\010\211\266\007k\227\001`\215\002x\246\002z\252\002s\250" - "\000O\203\001M\204\001L\206\002x\253#\227\303F\224\300]x\254\062x\250\035\204\257\000" - "\211\262\006\205\255/q\237/r\236Cd\204N\246\244\255\223\213\233\177s\207\206" - "|\217\204y\213\221\201\217\312\300\305\277\260\266\245\215\227\263\236\250" - "\322\305\315\311\273\304\242\216\217\256\232\223\271\236\207\271\240\205" - "\270\241\202\233\177`\255\225}\302\262\250\331\324\323\316\314\316\300\277" - "\277\300\300\301\264\265\264\313\312\320\310\307\314\303\302\307\307\305" - "\313\313\312\317\312\311\316\272\271\275\322\322\326\300\301\300\265\267" - "\263\236\236\225\213\201\205eW\\\204jR\302\267\242\302\267\242\277\261\230" - "\301\266\241\327\317\310\306\266\246\310\271\251\301\256\233\265\235\202" - "pR:\306\255\222\342\326\315\277\262\256gZb\203x\201\251\243\252\211~\210" - "\224\207\224\217\200\220\246\230\247\273\253\266\310\271\277\262\240\251" - "\272\252\262\271\251\260\324\306\311\322\310\315\204\202\216m{q\243\300\224" - "\201\265'k\240\001s\251\003\204\264\026s\245\001z\260\012z\254\006v\245\001y\246\001\200" - "\256\001p\237\002q\237\002{\252\002y\247\002w\250\000x\257\001|\257\002\200\263\002}\251\001" - "y\244\002\210\262\001\211\272\002o\242\001q\253\004v\257\006p\237\001i\233\001\203\267\023" - "\234\306\065\206\270\000z\254\002h\236\001~\256\002}\254\001~\261\002k\236\001l\234\001{\252" - "\000\225\302\040|\251\000\200\257\001~\256\002{\260\003j\234\001o\244\002g\242\000t\257%Z" - "\226\031\213\274d\220\301]z\255\005l\236\001n\225\001\212\264\002\214\264\004u\236\003" - "^\215\000i\225\063\215\227\217\213\204\221}s\203zq\202\201x\212\265\254\271" - "\305\270\274\267\242\246\267\240\244\271\244\254\301\260\272\276\255\265" - "\302\263\273\245\224\230\235\200r\272\236\207\265\234\207\263\236\212\277" - "\254\232\270\245\221\313\275\265\341\333\334\334\332\336\306\306\306\274" - "\276\270\260\261\253\277\304\301\276\301\300\271\272\272\273\274\275\302" - "\304\306\306\307\310\257\261\254\274\300\273\311\315\313\307\311\310\303" - "\303\304\276\275\301\264\257\257\257\241\234\331\324\315\265\256\235\311" - "\277\260\270\250\224\312\276\256\303\274\264\313\300\266\316\302\265\303" - "\253\225\217pS\241\206k\314\274\247\256\232\221vgpp_gxhp\251\240\252\261" - "\245\256\220\203\220\236\214\234\257\236\251\300\261\270\275\254\264\265" - "\243\254\274\253\263\271\252\256\345\331\330\232\221\236qtv\216\247\202\205" - "\264\062p\244\002n\236\001s\247\003g\227\000\201\270\023q\246\002u\254\003\201\265\023s" - "\245\001j\230\002r\241\002y\246\001\204\263\002t\242\002t\246\001m\235\001x\260\002|\255\001" - "~\250\001\211\272\006\201\263\000p\244\001x\264\015l\237\001r\241\001x\250\001\201\266\010" - "\252\314N\177\257\001l\241\002a\227\002\222\276\002\205\260\001\201\261\001f\225\002v\251" - "\001k\233\002n\242\014}\260\035d\232\004U\214\001y\263\032l\242\004o\244\001q\252\003\210" - "\276\071\200\264?m\243\060~\261A]\224\021Y\214\001~\254\002\214\265\001\205\254\001" - "\226\265\062\207\254Jr\225X\212\217\213\215\207\217\222\207\224\224\212\232" - "\261\251\265\217y\206\264\240\245\305\262\264\267\244\252\267\247\260\250" - "\224\240\274\255\266\315\300\311\237\210\216xXX\263\230\206\270\240\214\246" - "\217\177\271\243\220\256\232\210\317\306\302\331\325\325\326\325\326\314" - "\314\313\262\265\250\244\252\232\254\261\244\257\263\251\263\271\257\267" - "\274\265\273\302\272\271\300\270\264\272\262\262\270\257\301\306\301\305" - "\311\310\314\317\321\320\321\325\314\314\320\325\325\326\316\313\306\301" - "\273\262\267\254\234\270\254\232\266\252\225\304\273\252\313\302\270\300" - "\267\247\274\255\234\224ydbF.\243\213t\212xn\\QQmdg\213\201\207\200q|\261" - "\245\256\263\245\256\235\211\231\252\230\243\272\252\263\274\254\263\270" - "\247\255\273\252\260\267\246\251\325\307\311\311\276\306\177y\203\215\235" - "w\216\270=t\252\003k\233\002q\247\002s\246\005q\247\003k\240\001Z\214\001y\244\002\177\254" - "\011r\234\001\177\252\002\204\257\001~\254\001y\251\002p\245\001k\236\001m\237\001}\261\006" - "\202\264\012|\255\003\202\270\013\202\271\025p\246\001l\236\001m\235\002}\254\001y\250" - "\001\213\267\015w\246\000h\235\002W\217\002z\260\001\220\273\001\213\267\001z\245\002w\246" - "\002f\224\002]\214\002u\250\013\206\270&e\234\003_\224\000x\255\031\204\267*\207\273" - ")~\262\021y\253\000z\255\012\202\260\067\205\265\062T\216\000g\236\005\210\264\014\204" - "\255\014\301\300\251\204\213rz\203x\205\204\211\225\214\227\236\225\245\231" - "\220\236\215{\214\233\207\222\300\257\265\315\276\304\272\251\261\254\226" - "\241\262\240\251\300\262\273\303\265\276\274\257\266\223\201}iXK\255\222" - "\177\254\220u\247\207m\305\260\242\275\256\251\321\313\311\324\324\323\304" - "\306\300\266\270\252\247\255\224\236\250\210\241\252\214\243\257\221\235" - "\253\216\252\266\240\256\272\246\254\267\243\256\271\247\267\276\262\303" - "\311\303\311\314\315\317\323\326\327\330\335\332\332\334\315\312\305\302" - "\270\254\302\266\247\275\262\244\204mU}hO\212x`\234\215y\311\273\260\240" - "\207up\\NvbN_LARD<_RQthp\211{\207\223\205\217\244\226\240\235\216\232\257" - "\240\253\257\237\253\311\272\300\301\262\270\252\227\242\301\260\267\320" - "\301\304\315\277\303\177u\207\213\227g\223\265@g\237\002r\250\012v\253\006o\234" - "\000d\221\002X\211\001l\230\002\206\253\002\206\260\001y\243\001\232\302\021\203\255\001|" - "\250\001w\246\002s\251\002j\231\001m\235\002r\246\000\224\301\071y\256\002w\253\002|\264\005" - "t\247\002r\245\002u\243\002\202\256\002i\231\002i\234\001r\243\001k\237\002a\232\001\204\275" - "\036\210\270\000\207\262\002\207\262\002i\226\001U\205\001^\215\002i\232\002d\226\001{\260" - "\030w\254\027\221\301<\206\267\040k\234\000p\237\001\177\256\001\227\274\000\213\265" - "/s\241B_\200:ezMktcg_sE\064?H>KVJYA\062?+\032" - "&L@K\212\204\221\227\217\234\220\206\224\213~\220\202t\204\216~\215\315\277" - "\304\270\246\252\271\246\247\253\227\234\227\202\216\300\260\266\266\246" - "\255\253\230\240\255\233\233\236\216\214\263\246\234\214wklRHnRA\202cK\202" - "eP\216q`\245\220\177\231\212w\227\221v\233\233w\212\212`{{Mno=suC\203\212" - "V\205\216[\211\222f\232\245}\246\260\222\251\262\232\266\275\256\300\304" - "\273\303\305\300\310\310\306\332\331\332\315\311\310\310\301\274\276\261" - "\252\255\234\214\261\244\234\251\226\200\272\244\231\237\201`\227x^\217y" - "q~kg\212\177{~urtik\213}\202\205uz\215|\202\223\201\207\257\241\251\217\200" - "\211\252\231\243\255\237\251\264\245\254\251\230\240\237\216\226\244\222" - "\230\266\245\252\325\312\316\250\235\207\237\261Zs\243(\226\303No\243\001o" - "\235\001n\232\001e\220\001\200\243\001\222\271\034\210\266&\260\321Y\233\277&|\250" - "\001\211\263\001\210\256\002\230\265\022\234\270\037{\244\000~\252\010}\253\001}\250\002" - "z\245\001\204\263\003\202\261\002t\241\002|\245\002z\244\002p\235\001w\250\002{\254\001~\261" - "\003p\236\000u\251\001n\237\001\204\262\001w\244\001j\231\001l\233\002s\244\003\216\276$\223" - "\303*o\250\012`\235\003\225\277\017z\254\004n\243\014\201\234Q~~\200\240\235\241" - "\215\203\212semJ\071E@/;?-\067j\\dmbklamzo~\202t\206\210{\214\212}\216\206" - "x\210\260\243\253\304\263\263\255\232\232\232\207\211\222\177\210\271\251" - "\254\272\252\257\263\241\250\270\247\253\265\244\245\243\224\227\220\204" - "\204\236\217\210\231\206ufJ\060kR\070wdR\\G;WA\071_L>ZG\070M<'_S\064^Q\060qjE\205" - "\206Z\213\215d\220\222i\217\220k\214\216n\244\247\220\237\242\213\243\244" - "\222\242\240\220\271\267\256\272\266\262\305\277\277\273\257\250\267\243" - "\222\252\223\177\237\177b\250\220\177\223vc\233~b\213vieI\062jVJ}if\246\230" - "\224\204yz\201ts\213{}\230\211\214\217\200\203\214z~\210v{\242\222\233\237" - "\216\230\221\177\213\270\254\262\271\252\260\223\201\214\241\220\227\244" - "\217\225\313\300\277\271\263\250\224\250gh\235\024p\243\025x\252\036m\240\002" - "o\241\001e\217\001|\241\002\235\304Cu\243\013\267\324W\204\254\006\201\256\002|\253" - "\001|\251\002\201\251\002\215\257\002~\246\002h\227\001t\243\002\201\256\001s\242\001y\250" - "\001w\253\001q\240\001w\252\002w\247\001u\245\002v\251\001{\260\012t\244\007z\253\006t\242\001" - "w\250\002t\242\002x\251\001\\\211\001v\250\012\227\310)\205\266\020z\252\000]\221\001W" - "\214\000a\231\002c\177?+\027#Q?M\201q}m`orhv\177u\205\205{\213\220\204\224\234\217\236\264" - "\244\251\306\266\265\251\226\227\232\207\215\206p|\256\235\245\270\250\256" - "\254\230\241\257\233\237\250\222\221\234\207\204\220~}\215\200\177\271\257" - "\243\246\227\207\250\237\221\270\262\251\251\244\230\245\234\215\215\206" - "nyqQmgBoiA\214\207^\225\223m\226\227r\230\231v\227\232y\233\233~\212\206" - "k\213\206n\203|m|sgi^M\200o\\\220zh\245\220\210\201f[kN?w[K\210n^tP<\213" - "upX>)W>(kZQ^LC?" - "+$*\037\023\030'\033\033\031\012\015\032\022\023$\040#\004\000\004\012\000\011K@L\"\017\035\236\221" - "\242odrper}t\202\204y\210\222\206\224\233\216\234\310\271\275\307\271\272" - "\254\231\232\213v~\203nz\264\242\252\266\245\255\245\222\233\270\245\242" - "\214vw\234\210\211\233\210\212}oszpk\251\242\231\275\270\263\262\255\247" - "\262\260\246\230\230\201\224\225}\245\247\216\213\206`\220\221h\232\233t" - "\227\231s\232\232w\226\232y\234\240\203\241\243\210\233\233\177\212\205k" - "]O\071^M\065aO\067O\064\032H,\024lTFL\063#>#\020?&\021fQB\\B\061v^Rm\\RUA\060dWFxpj" - "wplf``aWS\214{v\203ph\212ys\214|y\230\210\204\215zv\272\253\247\223\206\220" - "}p{\244\227\237\260\247\253\224\204\216\231\207\222\244\215\221\313\276\276" - "\304\273\274}\232kr\232\070p\240\022s\242\011v\245\002t\243\001o\243\003\177\261;" - "h\230\000\255\305\061\202\250\004s\240\002q\240\002p\242\002r\237\001|\246\001\214\262\002" - "\211\256\001\203\251\002u\242\003y\244\002\177\253\010x\245\005t\243\001u\250\001q\242\001" - "j\236\002n\250\001u\250\001s\243\001j\232\002V\214\000\206\264/r\243\012\207\266\021\226" - "\306\040\201\266\021Y\212\000z\244\001\210\262\001u\242\001p\246\001Wv=@X\064$$\026\014" - "\011\005\014\010\003\006\005\002\000\000\000\061.\061\000\000\000\004\004\004+(+\000\000\000\067\062\067$\017\036k^k" - "{l{\206x\207\201u\202\224\207\225\250\232\243\316\301\304\315\276\277\232" - "\203\210zfn\212u\177\263\242\251\241\220\230\250\223\231\276\251\247\227" - "\177}\243\213\207\215{v}jgC.$}ld\252\244\234\262\255\245\214\205oxlLyfB[" - ">\026R\066\015cR-bP+^J&j\\\065\202\200X\205\205^\216\217m\235\236\203\226\227" - "y\220\214o\201yX\225\211i\200pQr`=\214|_~oNfP\064T;\037u\\LkO\061rZA\250\237" - "\232\220\206v\200vef[Jh\\Ue\\Xzoj\204rm|he{ij\224\204\203\200mm\214wu\264" - "\246\242\202u\200\215\200\213\230\212\222\247\232\236\232\214\222yht\221" - "\200\207\265\250\253\313\302\306\201\227p{\235=\200\247\032o\234\001s\241\001" - "z\255\000u\245\010\177\262\035x\247\004\203\251\006z\240\000\212\257\030o\234\001w\250" - "\002s\236\002\211\263\001\215\262\002\210\253\002\210\256\002\205\254\001n\231\002t\236\004" - "\213\267\060|\254\014z\252\001|\260\002q\240\001y\250\002x\244\001q\236\001h\230\002j\233" - "\007\206\262!\216\273\063}\261\025g\234\004i\230\001q\235\002\202\253\002\220\271\002s" - "\237\035^}+>R(\062?\034\007\007\001\000\000\000\000\000\000\000\000\000\020\017\021\000\000\000\000\000\000\000\000\000\000" - "\000\000\024\022\024\000\000\000\000\000\000>-:yhx{mz\221\200\222\215}\215\241\220\233\331\316" - "\317\261\237\237\221zzo]e\207w~\270\250\256\260\237\243\307\266\265\306\262" - "\255\272\240\224\236\204y\231\177ut^YyidjbZaWC\200sY~oR\214~a\215\177eq_" - "?YD\034X@\025`J\034iV(j\\)\177wGyr@xqC~vO\200zU\212\204^\204|Uuh>\201uQ\205" - "{W\201yY\235\227\200\233\227\205\234\222~\236\225\200\224\210q\242\227\200" - "\237\223\201\177scbSBc\\JJ=)ZKp_\062cQ%m^\061qh>}z[\233\235\212\235\233\211\241\240\214" - "\250\250\225\242\237\211\214\203lN\067%K\071*bTMRB+ZJ-^N/eR\066hW=\232\213\204" - "\206ut\203qo\204ro\217\177z\205po\240\217\213zlu\225\211\222\246\231\241" - "\214|\206\240\222\231m`j\213{\206\257\242\245\275\266\267\222\240\201e\220" - "\026g\226\004j\221\001n\224\000\224\272\062\204\255\022~\250\002g\235\001a\227\001o\241" - "\002\210\250\022\301\312W|\242\003x\243\002}\255\001t\237\002\216\266\002\202\250\002}\244" - "\001\206\256\002q\230\002y\244\001t\240\002q\236\002p\235\002n\236\002}\253\001u\242\002t\237" - "\001n\233\002i\225\002w\244\001q\236\001q\240\001n\233\000\205\260\004\212\263\003\222\273" - "\021\211\262F\222\271Xz\221id\202I;Q,!\064\024\006\015\000\000\000\000\000\000\000\000\000\000\001\001" - "\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\034\025\032b[crds\226\207\233\203t\207" - "\250\230\242\303\267\270\230\206\206\211v~q^k~lw\247\226\234\217z\203\266" - "\241\235\254\226\215\264\234\217\216sh\206kenVOu^VfQE_Q:ia?ogD{uT\216\211" - "kvrV\177z^\212\201e}oH\215\201\\\213\201[\200uN\207}X\222\211j\204uP{kAo" - "_\061kY\062hX\062tiH~v\\\201za\177v\\}rPsfCZH+qeLH\071\030QC$wm`VF)J\071\026VA!" - "O\071\030`M\062}mZ\215\203\203q__\211wt\220\200y\220zv\232\207\204{iu\177o{" - "\246\235\242\213\201\210\226\213\222h\\fn`j\246\231\233\276\271\273\220\234" - "\200d\221\032_\216\000p\233\002q\232\000\226\274\060|\244\000\177\256\002o\241\004u\252" - "\022e\227\001s\231\000\276\312\\\213\255\034z\245\002n\234\001s\240\002|\250\001\201\251" - "\001\201\245\002\206\250\002y\234\002\212\257\002~\246\002w\241\001q\240\001w\253\002h\233" - "\001{\247\002~\245\002f\220\002r\230\002v\245\002u\245\001y\251\004e\225\001r\242\002|\252\002" - "u\241\001i\230\001a\213#+H\022Bl\031\065P&Ne>]q[m\207kv\224vq\204l?Q=\015\025\016\000" - "\000\000\000\000\000\001\000\001\000\000\001\000\000\000,(*FAG+\065\067.fai\225\211\225\207}\210\265" - "\254\260\275\264\264\235\216\217xjp[LXsfl\265\253\252\255\236\240\246\222" - "\214\210mi\265\237\230\235}kwQ;}XCZ\070,R\063\"wbJjR\063U>\034F/\013G.\016|nY\202" - "vbzkX\224\217}\217\211v\230\220~\236\230\206\250\243\220\244\240\212\216" - "\207k\215\206i\211\200_whCtb;r].iS!eP\"^E\032]F\034\177oFzlAhT'C,\012\064\036" - "\007X>\062S\067&nWA\205p[\220}o`F=oYOiPJ|c_\246\223\214\202la\233\210\177\236" - "\221\214{sx\215\203\212\231\216\225\236\222\231\206z\204^Q^nam\235\226\234" - "\245\244\251i\177;]\200\022q\236\066]\212\000{\252\005u\242\001x\246\002y\246\004w\246" - "\003t\242\001\177\260\005i\235\002l\226\002}\242\001\207\250\002\213\255\002\216\262\002x\240" - "\001t\236\001\200\247\001\202\247\001\206\252\002s\233\001\177\247\002\211\265\001{\246\002" - "x\243\001{\250\001h\225\001z\244\003{\245\015x\245\002s\231\001k\215\001\212\250\002o\252" - "\004k\235\002j\231\001l\235\002g\232\001^\223\001K|\002\030*\003#,\025QSI)&'\013\007\010\000\000\000" - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\012\031\003,C\010.G\007\061C\020>H(vxu\227\216\226" - "\221\206\216\215\201\210\261\246\244\206w|iZcZMU\222\207\212\241\227\232" - "\246\231\233\242\220\211\224\201s\254\231\214\262\227\210\203]I\222p^\202" - "cXs[QpZE|gHr\\\067gQ(bJ#fO,U\067\024s^EtdM\177pY\215\200j\177nR\223\212o\224" - "\207k\210yV\202tR\226\214m\215\206f\220\210j\224\211k\222\203f\206t]\224" - "\202n\221\200dzgEkR/\063\031\004@(\013>%\012\177iVr[=kT>q[Ms_U_KFkWPjQL\247\222" - "\211\210kf\201`Y\233\204\177\241\227\230\207\204\210\223\217\224\253\243" - "\247\243\230\235\216~\207UFSgYd\230\215\226\240\233\241w\203Pi\202\064w\245" - "@e\232\000p\237\001\177\252\003y\245\002x\243\002s\241\001t\236\001\201\251\001{\251\003h\224" - "\001x\237\001}\241\002\200\244\002\200\244\001~\244\002\177\245\002\201\251\003q\230\002\177" - "\244\001\177\244\002\210\261\001{\250\002w\246\001r\233\000w\246\001\220\263\024m\223\000" - "{\251\025o\235\002w\237\002}\237\002\201\243\001p\253\010Oy\000Z\203\002W\205\002\\\223\010" - "_\233\010T\211\003\016\030\003\000\000\000\015\014\006$\036\030\013\012\007\000\000\000\000\000\000\000\000\000\001" - "\001\001\004\010\001\026(\002&F\002\071b\013\177og\274\262\254" - "\177rv\235\223\226\246\235\241\227\215\223\215\204\212]U_B=G^Wa\246\242\245" - "puZk\216?^\216\031r\247\070k\237\007p\233\003k\225\001{\243\002z\240\003u\235\000u\234" - "\001\224\272\030\214\256\007\204\255\005t\240\001{\246\002y\240\001\213\254\002\212\252" - "\002\207\250\001\200\246\001x\236\002\200\247\001y\240\002z\243\001c\223\001y\253\012r\231" - "\000\200\242\003\206\252\006\200\245\011\203\257\020k\223\000|\243\001w\234\001\207\257" - "\036S\221\000f\242\024d\236\017^\220\001c\222\002e\231\003V\202\000`\225\012Q|\010\040\064" - "\002\022\"\003\012\027\002\032&\002CJ\013BN\015\011*\002%G\003\070^\002Kx\003Jw\006w\250J\065P\020AQ" - "-^_Y\177x~\200u}ylt\247\233\234\233\213\215uio^P[RIP\215\210\205\252\237" - "\232\302\265\254\247\214ziSB\220}p\305\273\262\234\205t\200aHsR=uV>rU?qT" - "D|cO\215xY\231\210g\226\204c\212wT\211uS\201iDx_\067\211pP\210pL\205nG\201" - "iAw^\064u[\061\221\177d\212{_saG`P\066\067%\015,\026\001\066\036\004T<\030s`;\211xT\227" - "\207d\205pQ\201lXkT;`F/iP;v`P\177h^\233\213\203\242\222\214|g]]F;\241\222" - "\207\266\254\251\207y~\216\205\211\203y\200\241\230\235\200}\202SKULBNkc" - "iwzmjvXd\230\060h\231+\202\260?m\232\001n\231\000j\215\001\220\245\002\216\252\002v" - "\227\003{\250\005z\241\001\205\253\002\203\252\001z\244\001{\243\002y\242\001\201\244\001\177" - "\240\002\207\251\002~\243\002~\243\002\204\252\003\216\271\002x\244\002_\216\001q\240\002r" - "\231\002\214\260\001q\225\002o\225\001}\253\013a\214\001u\235\002\205\256\007t\233\000_\226" - "\000a\226\003[\212\001S\200\002]\211\001_\207\002c\212\002Z~\001Z\212\005;a\002'I\001\063L\002/B\003" - "/>\001EV\005+E\002/R\003\064[\002S~\002Y\211\003Z\207\034>g\010Ii\"o~a\206\210\177\203\177" - "}}rv\245\235\235\231\216\216oafE\067@\066&/D\066\071sca\226\207\202\265\242\222" - "x\\KlVN\237\215\177\254\224~\213nRnI,\177_C\205hN}bHpO\064pQ\065qW:\226\207" - "m\221\205i\237\226|\247\236\206\234\220x\227\207l\215{_\226\206i\232\214" - "q\212xX\205qSoY=pZ?^F*U@\040U?\032s`@fN,]B$\230\204d\244\223vyeLpV<\215z`v" - "ZA`B+\211q[\242\216}\210pb\244\225\215`QHA.*\202ok\303\274\270\216\204\204" - "\200uz\226\215\217\244\232\236\232\223\233edk>\070DA:Gqoqpvcm\206Zc\223\066" - "b\225(k\243\035`\221\000\200\255-u\227\001\231\256\003\213\247\002~\243\002{\246\005k" - "\222\001\200\244\002\203\246\002\216\264\002r\233\002u\236\002}\243\002\203\247\001y\236" - "\002\210\257\001\177\242\001\214\263\002\204\251\002~\246\001r\241\002a\215\002t\235\002z\240" - "\002f\216\002n\221\001w\242\003l\220\002s\231\002\177\244\001z\236\000\210\263Uv\242\"b\212" - "\001@k\002X{\002X{\001Ry\002\\\202\000Mu\001M{\003Gv\003Ac\002;V\006\033\066\001&:\002\070K\001AZ\003\064P" - "\002\071^\001j\233!Y\207\001Dk\001Gi\027IW\002)F\001\060T\000Ku\000\\\207\035Ih\002Zz\005_z\040ZgCpoj\205{\202" - "\201u}\230\215\220\230\215\215|qx^S[>\065\070\066\061\063c`\\\212\206\203\276" - "\262\252\256\233\207mQ@Q\062)\201l`\270\245\222\252\225x\257\232|\232\202" - "d\211nUuV=c@\040pS\061_E\"\200oQ\214\177b\201rW\211}g\220\215~\225\224\210" - "\212\203s\221\211y\245\236\216\236\230\204\232\214v\215~h\211x[mV\062\203" - "kH\241\216n\255\240\203\240\222s|fL[=,y`L}fNkO\066\200fN\240\213y\263\250" - "\227\232\211v\225\206vP_\002Tm\002;L\001AV\002Vw\007\210\230%^z\020b" - "\214(Dc\000Ib\001>W\001Kf\010`r\070nqa\211\212\205peltio\223\211\212\217\207\210" - "e[\\NCDK?Ayrm\214\203y}se\267\254\237\207s`V;*bK;\203r`\243\223}\231\203" - "j\212pV\236\210l\223}\\sQ.iJ\036zcv\\CgJ.\222za" - "\246\222\177\263\244\223\240\220\201\237\221\202qh_K\065*qYF\262\251\227\253" - "\244\226\204yw\177yuqjhmdfkcggagZW]JHMifh\204\211}d\200Tn\227Qi\224\066d\227" - "\025U\202\001^\216\001d\215\003\207\262\011{\251\005v\241\004{\251\002d\220\001z\246\001\220" - "\262\002\224\265\001o\231\001n\234\001w\245\003~\244\001\212\255\001\201\243\001}\243\001\177" - "\250\002\206\256\001\202\244\002\211\247\001\210\253\001\177\243\001\204\250\001\203\240" - "\001\212\242\000\216\253\000\177\237\001\205\260\004\204\253\006\205\252\007\210\255\003" - "i\234\025W\205\001Lr\001q\226\007Zu\001^w\001^x\001^y\002Tn\001;V\002$E\002\062Q\001<]\001X~\003Tx\002" - "d\224\004@i\003It\023W\201\040Cb\001Ki\003C]\002A\\\003Nf\036RZ\071\203\212wytrtjl\204z{" - "\237\217\220uko\\PXe\\cjbanif{vr\215\204z\250\235\212kT?hMC]H:\240\222\202" - "\214ta~bT\232\204s\276\257\237\250\221u\215qL\203h@\231\204a\203oC~kA\202" - "rL\214~]\200sT\221\206l\224\211m\203yY\216\204g\214}[\233\213g\211vO\236" - "\216k\212xWnU>kR@eJ\061\200dHfH+kN\060\222y\\\254\233\206\261\242\220\252\232" - "\211\233\210x\216~pYJDpdX\242\223\205\271\263\243\214\203{{onwolunmc_aSR" - "TDCHRQVYX]wwwfn]_\214F_\215\066S\210\017b\232\026U\210\001i\231\006z\245\012\202" - "\254\005u\235\002o\225\001k\226\001s\243\004}\253\001\212\261\002\210\255\001r\235\002q\242" - "\003~\257\010\205\251\003\207\247\002{\234\001\211\243\012\206\250\001\224\270\005\205" - "\250\001\233\265\010\205\250\001\200\244\001}\235\001\211\243\006\220\245\022\227\265" - "\023\207\260\005x\235\002x\234\002\201\254\002\200\246\001^\207\001R\200\001X\203\002q\234" - "\002b~\001g\202\001g\177\001h\207\001[x\001Lm\001Hm\003Mu\002T\200\004;`\001b\220\030\\\207\035K" - "p\015r\234>;h\004\064\\\002Mq\016Lj\012So\015o\206;p\202Orseomivon\205}z\237\225\223" - "vkm^RYTKSmgle_a\201{v\204zq\265\254\240\252\235\210iU>wdXvc[\225\205ylUG" - "\213zj\262\245\221\257\240\205\236\206d\217tQ\212pI\237\213h\232\210e\224" - "\204`\177pK\207xW\207zX\225\210i\203uU\222\210i\226\215q\232\215r\203rU\207" - "tS\215zZu_=iR\061fO.sY\071\214tV\225}b\251\230\202\257\242\217\253\237\213" - "\226\205u\224\205wS@\062G\062\040\204s^\247\235\214\216\204xrjdtmirjh\\TS]X" - "[hglb_gROYa`exxxMX=d\240FDw\007R\211\010X\221\015R\210\000n\240\003o\234\001t\236\001" - "x\237\001t\233\001i\224\002m\227\002\207\257\002\201\247\002}\246\001t\243\005f\232\012{\265" - ">\177\250\024\203\245\001p\224\002\204\233\013\224\257\004\224\256\002\217\263\001\230" - "\266\010t\225\001z\234\002\204\247\002\203\241\004\231\264\032\227\263\020\213\256\001" - "y\232\002|\242\002\177\254\001\177\252\002Y\205\002I{\001Y\210\005Af\002a~\002o\223\002f\216" - "\001a\211\002Y~\001Nu\002X\201\001D`\001.F\002\067L\002\066P\000s\247Oh\221=^\207\026Gm\003Su\007" - "Rt\004k\213&g\206#Wt\023y\211Z\\ZLqmhurnqpg\220\210\177\211\200xe\\[ncedXaX" - "QX;\064\070[WOyre\272\263\231\215\177_B(\033ZB\063{fR\241\220\202\212yh{hS\237" - "\216y\232\207m~a?\201e>\214rM\204oG\221\203a\177pL\203vR\206~X\206~\\\212" - "\202`\206~\\\225\220r\221\210p\225\211o\206wUya:\200g?\211wR\206uT\234\214" - "n\245\226|\255\236\211\272\256\235\251\234\213\226\204r\204tgscZM\070)cJ\062" - "\243\227\200\254\247\225\201tith`jaY|yt\222\221\217\202\177\202e_h^Y`jgl" - "bcbx~ubvR_\224\067Lw\002Q\202\004[\220\012h\233\005|\242\002y\236\005s\231\002m\224\003v" - "\234\003o\230\001f\222\001\201\252\001\200\252\002{\245\001s\236\003r\244\026\211\277U\203" - "\261\031|\245\002p\232\003}\247\002\206\250\002\252\277\030\232\265\020\177\232\001\221" - "\260\017\207\256\005\205\253\022x\225\002\216\250\001\254\272\032\220\255\001\202\244" - "\001\210\260\001\200\251\001z\245\001S\201\002Q\201\003Y\212\007>b\001]\213\010_\215\002W\200" - "\001[\202\004T\177\001[\203\002Qr\004Wt\003Gh\004\065T\002Ff\002A^\001p\256=U\207\002Lq\003>]\001Tq" - "\002Id\000l\206!\201\235LdoATVCvslwum|{srqi\231\225\216|ssSHPZOXmgl\\YZ[YRWU" - "I\213\205q\250\240\206p`IO<$?)\025~tj\220\207xiU@s`K\235\214u\243\223x\230" - "\204e\202iB\212sL\204sK\213|T\220\205^\202yS\206\177^zsO\202yY\226\217t{" - "lN\225\207e\200lF\205qH\204sJ\245\231z\256\240\204\267\255\232\234\215t\270" - "\253\230\243\225\204\214}j\231\213zyl_>'#T?\070\240\221~\270\255\237\220\206" - "}\205wsrhe\200yw\177z|gbhE=KD:Iebg~~|lrhs\201mf\217VZ\203$\\\213\012X\210" - "\005b\222\003u\240\002\206\252\015r\232\001w\245\002h\216\002\177\244\006\177\241\002\177" - "\240\004\206\261\002~\244\001\203\252\003o\234\005k\233\007\223\301i\200\253!y\243\002" - "x\244\002~\247\001\200\247\001\244\277\013\264\266\061{\225\001\233\275$~\254\010z\245" - "\013\201\241\002\221\253\002\237\244\021\223\256\004\206\252\002\204\257\001\204\253" - "\001}\244\000`\222\000y\252\031R\203\000P\202\001Ky\003Y\217\003U\212\001Z\220\016S\204\023" - "Px\022Y~\004Je\001g\233\021Fo\001[\204\012g\226.N\203\000W\216\004Hm\001Oo\002On\003Oq\006q\221" - "GWz.Ke#IU/^`Oll`^_T\177|x\204{ywlm[OWi]fl`i`TXrjg\201|rzvi\226\217{\257\253" - "\214wgLgVJE.(xlc\205tg~k[\211vf\247\231\204\247\234\202\227\210g\214xU\204" - "rK\210{T\213\201[\207\200Z\213\200^\213\201\\\202vS\223\207i\204uT\226\210" - "f\213zW\236\217m\240\222o\235\220o\244\226|\237\223{\221\201h\220\200i\200" - "o]\213}kxj`P\071\067cOB\230\211m\247\233\206\241\230\206\203|r\201~wzxvzvx" - "lhjuqsfciJHNXZZp{on}kcz\\f\240MFw\000U\210\003b\226\004f\230\002k\232\002s\244\005r\241" - "\003s\245\003e\222\001{\247\002\204\241\001~\240\001v\234\001z\246\002n\231\001s\237\002v\246" - "\060\235\310\210z\251/\201\254\000l\231\002\201\250\002\216\261\003\224\265\003\244" - "\267%\231\272\037v\236\000x\240\002x\245\001\200\250\001\203\247\000\224\264\024\227" - "\272\014\212\263\001x\237\001\231\272\021\204\242\000d\234\011d\230\014]\214\001X\214" - "\002Y\221\007Z\216\001Z\213\001Nz\003Q~\005`\215\016s\225%Rw\001P{\002f\233\004k\226\023h\233" - "\033d\223\003Y\210\001U\211\002Cl\001Ho\001`\204/[\201*Kk\033Of!CS\034beIhiY|{q\202xu" - "\212\177}pdfcV\\vkqO;JaRXf[Yvsk|{ruth\220\212t\232\222s|rYN@\064B/+bNK\231" - "\217|\211uf\213yf\236\220{\235\220x\242\225x\226\207g\217\200b\206wY\227" - "\213p\207{]\216\203e\215\201d\221\212m\216\206h\243\232~\213|Y\245\227v\222" - "\201]\212xR\203oI\204oN\226\205m\232\214y\216\200use\\L\066/P\062)\243\224" - "\201\257\245\223\225\207yvj`\177xrromzzzpnq[W[@:ARLS^]borspyqr\207p]\201" - "QV\211\034R\204\000]\220\003Y\211\002d\234\012e\232\007u\234\022q\235\001s\240\004t\241" - "\004r\235\001\204\257\036w\240\003h\222\002s\242\002b\221\001r\241\003e\224\000\224\306~~" - "\261\071z\244\001\201\245\001\222\263\005\220\267\001\206\257\002\203\252\002\264\305" - "N\177\242\005x\234\002\206\255\002\211\256\001\226\263\023\211\245\001\221\263\001}\242" - "\002|\242\002\215\242\016\212\244\001_\230\003b\231\003]\222\001K\177\001R\206\002]\221\003" - "W\202\001Lr\001Y\200\002[\200\002Uv\000Os\001Qx\003Nt\000`\224\007b\223\002t\241\002e\222\002a\224" - "\003[\224\005i\231:X~&W{\030_\201&Vs\040Vl*anCx}gxxn|xs\200vu|qq|ssvkqjadh_\\I" - ">?WSOig_ng]_UC\212\202dzpO}nTmZL]LIB/(vjZyhY\204p^\233\216}\236\224|\230" - "\213o\240\221r\202rS\212y\\\211y\\\220\200c~kN\225\207j\222\206f\216\201" - "a\214|[\206tOzg;xd\070\220\201]\223\204e\220\205q\237\226\206ka\\M?=A\060," - "\215~a\261\246\221\236\223\204\207~s\220\207\200bYY}||ttt_`d?:A&\033%RPP]" - "_[syvy\204zk\207c^\225DHx\000d\231\007]\223\004\\\223\001g\235\020i\236\025n\234\032" - "u\242\001\177\253\013w\245\003^\210\000}\257*m\233\001h\221\002p\236\000y\254\024z\250" - "\000q\236\003l\241\014}\261\036r\234\001\207\247\002\233\263\014\244\300\010\202\243" - "\001\225\263\032\210\241\027\266\312l\200\243\000\203\247\002\205\244\001\235\255\024" - "\210\232\000\233\271\002\211\253\001\206\255\001v\227\001\207\251\002a\230\007d\234\015" - "]\222\001[\214\003b\222\002c\216\002c\210\003^\200\001Qq\002[y\002Vq\001\\{\001a\212\002x\237\067" - "X\205\010Ov\001t\237\002S\200\001:f\001c\221(j\227-V\204\000x\243\022\225\267\020\242" - "\303,\217\264We\200\071auC\206\207\177\177}y\202~{\204\201}\215\220\207\217" - "\225\213f``\071*\060>\063\067RKMkbah^Z{ufmdJ\177xW\251\242\210\227\211keTBSC" - "\065\065\"\036O>\070aPDsgY\220\203p\210u_\240\221y\216|Z\213{]\204v[zmP\201p" - "Qtc?\202sL\207yUxcC\200nP\211w\\\236\220x\227\210r\230\212yti`XLMH\071=jZ" - "N\230\210l\262\246\213\235\214r\223\206q\201zitpf\202\202~|\177}rtuTVVPT" - "Q`hVYgRXdTq\177pm\206lDt$X\217)a\224\002]\223\002R\206\002b\227\002b\223\011f\224" - "\007V}\000l\225\003\205\255\001~\252\017}\255-\201\260\063\203\261\064}\246\016\216\271" - ",t\243\013y\245\002h\226\002o\237\000}\266?{\255\026\225\272\005\204\246\002\222\256" - "\000\247\267\003\214\245\015\227\264:\246\304\\\227\272\060w\236\001\217\262\005\246" - "\261!\242\266'\230\265\000\217\255\003\202\245\003\202\247\002\220\265\002a\222\001W" - "\207\000I{\000X\206\001Y\210\000b\221\005e\215\002_\202\000\\\202\001e\215\003Z\200\001X\205" - "\003]\215\013Mx\031Co\001q\220+\202\246\033N~\000T\203$Il%P}\000i\230\003y\240\002\213\255" - "\002k\214\000\235\277gv\226<[y,\210\214\206\231\240\227\216\224\214\230\234\226" - "}t{\217\210\213bV`E\066@I\067UA\067vgXqdTvk[vkX\205" - "ua\205s^\222\202h\220\201i\240\225~\210ygsdV\206zm\220\206}gYPP<\070O;;UA" - "@\205ui\240\224~\253\242\214\244\231\204~lR~oZvoc\202~{\224\223\224\202\202" - "\205QSWLWKUaPAM>\067C\062SbKe}XSz>L\203\"M\204\003U\212\001N\177\003Y\210\001k\225" - "\002d\217\010d\220\002q\232\003n\231\001o\234\002l\226\002y\247\005q\237\006e\230\004\207\263" - "=t\244\021i\232\003\200\261\012l\233\001q\242\000\211\273Fm\253\064\204\255\000|\235" - "\002\217\256\002\210\247\002\254\265\007\244\302V\207\253\021\220\266,|\246\006\207" - "\254\013\243\273,\226\267\033\223\265\002\214\253\003\216\262\003\204\247\001\207\250" - "\000j\226$\256\313\217\325\351\324r\243\063\245\306js\231\026[\213\003^\223\025" - "O\201\003[\220\004]\223\003Y\211\000m\240$Fo\000Ms\001S|\002o\242\006Y\211\040Ly\016[\217\010" - "h\233\015T\200\001\\\205\001Qy\000Z\205\032x\242\071h\224-e\215\067g\202N\202\210~" - "\230\231\226\234\233\233\232\230\227\224\217\214tlqaVZbZ\\vru\210\202\207" - "\235\231\226\202|r\217\210w~s^\206z`\233\223u\244\237\202\240\227y\240\222" - "v~jXeMG[GCA((>%%K\071\067L;\067WH=L\067*bOAxiW\220\202t\210{m\210\177qlaXK=\067" - "O>;[IA\177n]tcT}j]\251\241\214\261\252\230\260\250\225\237\225\201\177p[" - "\201r`\207~s|rk\204\177z\246\246\243\214\217\216v\203rJMJ?CBENE:K/\066P\031" - ">d\027O\203\037[\221(Er\001Z\220\007V\210\007e\223\002w\232\007c\223\002\233\275;}\242" - "\002`\215\002p\240\002c\223\001s\245\002n\235\000~\257\062p\233\003\206\263\035i\230\001{\247" - "\004r\243\002{\247\012\214\266Ec\231\040\270\320\201\214\245\000\221\256\002t\227\002" - "\215\254\006\262\314\\\204\247\000v\232\001\224\302H}\246\000\224\274\021\225\275" - "\022\232\300\031\220\257\000\226\263\003\215\250\000\255\306(\315\337\314r\240+e" - "\230\030T\207\003O\201\000[\221\002f\223\014[\213\000\\\216\001L~\001R\203\002`\225\007Ox\003" - "Cg\001T|\003Z\205\004`\223\000N{\013U~\003]\206\007Ij\000X\205\001u\235\024v\234\026V\206\011" - "Y\213\016^\216\027C^\032Vk\070jx\\\230\230\223\237\237\232\226\225\220\201zv" - "}vuwrsfagpmo\230\221\223\264\261\255\230\223\214\210\207y\221\215y~x\\xm" - "K\232\225s\226\217m\253\241\205\247\237\203\263\253\225\231\214s\177oZm[" - "MjWMT<\061fSGS>\061eTGhVFp]OvfWj[Li\\NjZH{iT\234\212u\256\237\213\254\235\212" - "\267\251\225\261\246\222\260\247\224\216\177f\213}b\221\205oviV\224\220\205" - "\227\227\217\220\224\210\212\231\201\202\234tbuU=>><>;RgFOu\060H{\"F\207\015" - "R\217\022{\233\026c\217\003R\201\001`\215\002_\210\002c\207\001v\242\035|\246\060\210\246" - "\001f\222\002k\232\000i\232\017o\247\001c\225\012^\222\007n\241\003z\251\014q\235\001u\250" - "\002q\247\024|\243\017\250\302a}\242\040y\244?\217\255\001\221\261\003\202\241\002\206" - "\247\006\244\304<\222\266\025\177\244\000\212\270!\204\263\034\206\261\007\215\270" - "\007\231\273\016\232\264\002\253\300\013\222\252\001\234\271\000l\256,\\\221\000c\226" - "\001T\206\002W\222\015P\206\003M|\001[\214\002W\212\002Y\214\003S\203\002_\230\015\\\221\017" - "W\201\003Rw\001_\216\007`\221\011T~\001Uy\013q\242\022i\232\005\227\253\025_~\002f\207\001" - "t\233\003Wy\000Tv\006\070S\001Hd\030l}Tpyb\230\230\222\226\227\217\224\223\213\200" - "xu`U]upulgl\231\217\223\265\257\251\255\250\240\217\213~\217\213y\212\203" - "k{sR\216\203a{nF\213{X\253\244\214\266\260\233\252\243\213\257\247\220\241" - "\221|\235\214x\241\220}\252\234\213\226\210v\227\211w\217\200q\241\222\204" - "\252\235\215\227\207w\254\236\210\254\234\201\252\232\177\255\235\206\271" - "\253\230\300\267\245\261\251\225\240\232\205\222\211t\211}d\230\217y\215" - "\206r\226\221\203\211\210~\217\217\210\247\250\243\243\255\233an]V^VL\\L" - "u\212s=Y)\032>\000(U\004D\202\013H\203\014[\224\004\243\243\014U\202\001b\215\002a\210" - "\002`\210\001j\233\020T\200\003\224\274\071c\213\001p\235\001h\225\001n\245\027i\232\012" - "i\231\004o\237\002q\237\002\205\270\005m\236\002e\226\000|\242\006z\250\032|\245-\255\275" - "^\224\257%\237\262\024\210\245\000\214\256\004\210\257\003\212\261\010~\240\001\234" - "\264\000\221\276I\211\266\035\213\270\013\202\246\001\251\302\011\227\256\001\217" - "\252\003\231\262\002Y\217\000h\234\002W\212\002Y\215\004^\224\004`\223\002V\211\002`\221\002" - "Y\213\002c\234\002d\236\003[\224\002_\231\003O\204\001Y\216\000h\236\022_\224\003f\225\025" - "h\230\011g\224\003\216\254%[t\000[~\004t\216\003o\210\002Op\003\061R\001Dh\003&K\000V~\004\\nF" - "t}oz{r\215\214\204\221\220\213\215\213\206XQY_Xa\201{\202\231\223\224\271" - "\265\256\236\231\216\217\210x\224\215x\217\210n\221\207i\217\200[\217\201" - "]\216\200`\231\216s\236\224z\262\253\224\271\261\234\261\244\221\263\247" - "\224\262\251\226\266\252\233\253\240\217\251\236\217\253\236\220\235\215" - "{\256\241\217\263\244\216\255\234\205\263\240\207\245\221x\266\246\222\271" - "\254\233\231\214t\221\206q\232\222\177\215\207q\224\215z\233\225\206\223" - "\221\206\212\213\202\210\210\177\242\247\230\201\217t~\213d\211\205UQ[I$" - "A\031,T\037n\227ZI\201\016>q\003M\205\002Q\210\001r\214\021a\202\003c\211\002i\224\002d\221" - "\001S\203\001M\177\000\204\254\063^\205\000s\242\002k\241\015o\245\020j\236\004p\236\007v" - "\246\001u\247\002p\240\002i\232\004i\232\002{\246\002k\241\024\213\270O\265\317Xn\236" - "\023\241\266\027\247\264\037\230\262\032\204\253\007\221\271(\203\245\003\226\237" - "\001\217\271,\216\272=\222\276\015\221\270\003\220\256\002\212\245\002\223\257\002\220" - "\256\001a\224\002m\235\002d\224\005t\232\012r\225\010{\232\036_\212\005Q\202\001\\\216\002" - "]\224\002d\237\012Y\207\000f\220\023u\247)f\231\"N{\003\\\213\002_\211\003p\231\003x\226" - "\021\205\241\026Jm\001Km\001`{\002p\211\003Tn\002\061I\002\071Q\002Hf\003:^\000Jf#VcAjnc}}v\227" - "\231\212\203\204zaa]b_aYTY\230\224\222\254\247\237\224\216\202\224\217\203" - "\215\213}\232\230\207\211\205i\203|Z\220\206d\224\212m\214\177a\202sS\217" - "\200`\246\232}\262\246\212\246\234\177\240\223z\253\240\207\234\220{\264" - "\254\232\227\211t\223\201n\247\232\206\265\251\222\252\233\204\260\242\213" - "\257\242\212\247\231\203\250\232\204\232\216x\224\210t\207}l\235\230\207" - "\232\231\214\233\234\222~~y\210\207\200\177\202t\215\237v\203\222ho|Zdnb" - "DZ<+N\022,X\006?s\003\200\247^F\177\006d\235\002L\202\000\223\266bh\210\007u\224\006e\222" - "\003`\216\001Y\215\003Y\214\002m\234\035o\235\015m\241\006k\233\016m\240\010j\226\011p\236" - "\004w\245\002}\255\001}\256\005o\237\002V\213\001\211\263\000g\237\017\211\271H\224\274" - ",x\241\000n\241\016\206\247\001\222\256#\221\256\025\225\273\064\205\254\003\214\241" - "\001\204\252\007\216\265<\205\257\007\201\247\001\221\266\001\212\254\002\213\264\007\206" - "\250\002a\225\003e\227\002X\220\004W\215\002U\206\001b\220\000Tr\001]\212\002Z\212\002]\222\001" - "d\224!\206\262Sj\233\024^\220\000W\205\002Bl\002`\215\002Ko\000Z\207\006\237\270Kd\216" - "\002X\201\002Z~\005m\226\002Xv\003^o\001dn\010Wh\005Vo\012Jl\010\070W\000Qs\015\065G\035_oJu\177" - "h\215\220\201\231\232\221hdd]Y\\\226\220\220\201vs\213\202y\210\177v\206" - "\177t\220\214|\215\213t\222\215p\202|Z\177zX\226\216l\203tN\216~Y\222\205" - "a\230\214i\222\206c\244\232w\231\220p\241\227|\243\232\205\213\177m\233\217" - "z\251\236\212\256\243\214\252\233\203\252\233\203\230\214v\245\231\206\200" - "xf\207|j\221\210x\247\243\222\227\226\211\215\215\203\213\212\202\201\200" - "{}|u\217\234y\177\230Z[nHO^JM_E,M\020/U\005\026-P\014Cp\017+W\001=l\002M\204\010" - "Cz\002[\225\003=d\014x\251D\206\256YFr\000\236\265h_\217\006d\227\003]\222\012[\221\014" - "^\225\004\204\254\061l\231\014_\221\000l\236\001c\227\003]\220\002n\241\002i\235\000\236" - "\276a\210\266Ni\233\007X\212\000\202\266\033|\241\015\204\261\033\211\272H\222\277" - "]\210\266U\274\336\227\236\304C\232\277B\223\254&\227\255\060\246\266B\305" - "\324r\262\310O\230\272,\210\244\000u\224\002\212\255\001\234\274\036Q\203\002X\212" - "\003]\216\003Y\225\002^\223\004X\214\000_\220\000f\226\002d\216\003p\223\002b\211\000o\234\002" - "h\226\003v\247!\224\302S\202\257\020{\243\002\217\260\013\236\266R[~\000b\217\001m" - "\230\011y\234\007v\221\000n\203\002i\177\001[m\001bq\002E[\001Vq\004'?\001Fk\012\206\254\036>" - "a\002\027\060\000Le\"gxBpqclld}wywltj_ithpYMTA;@:\064:fgeZ[T\211\213v\230\226{\205" - "\201`\213\210d\216\212h\230\226{{\204Y\235\235}\222\217q\232\225w\207{^\204" - "wY\221\205h\237\226|\230\223}\235\227\203\237\234\207\230\227\205\226\227" - "\210\231\231\215\230\232\220xxs[[ZDCDA>@IEJA=B\231\245vYZQ-;!+B\030&E\004:a" - "\024*R\000\061a\005\065i\004Bx\002Y\232\006Ah\002Kr\001q\236\061\203\256\\T\210\002Y\214\025~" - "\252AV\207\006R\201\001S\201\002`\221\001n\236\027\203\261\062i\234\001k\234\002a\220\006" - "j\227\000x\250\002w\253\036v\251NP?E@>VJQxmtthocW_\035" - "\017\025\062+\060\064-\060PNLwvf\220\214r\216\212i\231\227v\210\211c\202\206X\202" - "\206Y\231\227s\221\215i\230\221o}rN\226\222s\230\223w\223\217x\245\242\216" - "\235\235\210\225\225\203\215\216}\222\223\206\226\230\215\222\223\215e^_" - "A:=\065\060\062\067\062\065\063/\060sqY\204\223d^j[\067O-\032>\002.V\020\"N\000'X\001:l\007" - "G~\005N}\005g\226\025En\002b\212\012U\203\027\214\274XS\205\000S\201\000\222\300ZZ\215" - "\001N\202\002c\226\002U\203\002`\214\011\222\276;n\243\002Y\213\002f\233\004\210\265\067" - "|\254\006g\236\014`\227\021q\244\004\201\251\003\207\267\066m\237$u\222\000~\257$\261" - "\330v\262\327o|\237\007s\243\003\223\301D\236\310[\244\310Y|\253!\240\275%\207" - "\255\016\240\260(\221\271<\226\274R\226\264\015\220\262\001\224\277\062O\201\002" - "W\220\011O\215\001U\222\001T\220\001K\206\000V\215\002Z\217\001Y\217\001]\222\002j\233\003t" - "\250\022Z\212\001k\235\016c\216\001g\217\002c\206\001y\236\020\227\270\017q\236\001l\227" - "\001s\240\003j\224\001l\227\002r\224\002l\211\003^l\001`g\002~\232\003u\236\002Mb\005s\223\"o\215" - "*Gj\007>^\001Rt\026Vi$\036-\002FM\070Y[S\\YVsjk\211\204\201i_[I:\063OA\070I;\065^VNd" - "\\RslZ\212\211m\211\215fw\202O\207\212a{zT\221\220l\223\221l\177|S\204\200" - "X\233\231w\214\213l\226\226{\217\220{\216\223{\227\241\205\207\211x\227\230" - "\214\232\234\222\211\207\200{sjvl`vmaztjgcZ\233\256xZmG\070R\061=W+\064U\025" - "\027@\002\"T\001?w\025>z\005P\206\010\177\242)@h\016O\207\022Fy\001h\232#~\264Da\221\006" - "Z\204\001v\251\024`\223\007_\223\003K|\003W\204\002e\227\000\217\275\067a\223\000`\221\002" - "g\230\005k\231\000s\246\001j\241\015^\222\002\210\261\003\177\247\012m\236\013f\237\060" - "\233\301O\214\267Az\250\034\211\241\014\205\232\003j\225\002\234\277L\234\270L" - "\214\256%}\254\023\213\234\000\203\237\003\207\251\006\327\340{\276\313D\234\265" - "\016\222\257\000\224\301@Ax\002V\222\004V\216\002V\217\002Z\221\003]\225\001W\212\001q\237" - "\027i\225\004i\227\004`\216\007a\217\003\\\211\002X\205\002f\217\001R}\001b\213\002\202\253" - "\002\222\265\003o\224\001q\231\003u\235\001|\247\002s\217\003f|\002cv\002l{\002|\213\006|\226\001" - "^\202\000n\233\021n\224\032bq\024Ri\007X\177\015E^\024\"/\000/:\021jt\\\213\215}~~rk" - "bY{rj\237\230\207\226\213r\232\212p\235\215p\213{a\200s[}v\\tuPs~K\207\215" - "e\217\221n}|U~|U\220\217g\204\201S\213\211_\224\224p\210\210i\217\217s\200" - "\201j\223\226\200\233\244\203\222\227\177\224\226\211\232\233\221\210\206" - "|\215\204x\231\221~\237\230\207\214\211|\202\206q~\254^AY\063)B\032,M\020%J" - "\013&M\003\066f\020O\206\031L\205\007K\177\001M}\021i\233,O|\000N|\001f\227$i\233\063f\226" - "\003Nu\002f\231\001R\207\002f\231\012Y\206\007l\231\003\212\267+\232\302;\212\267@f\230" - "\027j\233\022u\242\001k\234\004w\253\014\212\265\001q\246\035\203\263?i\234\011\214" - "\275N\217\267+~\256\035r\245\007\237\250)\231\262%\245\303Io\225\020u\227\006\251" - "\314Yq\237\001{\235\005\205\240\001\276\312\063\216\270$\205\257\031u\230\002\203\251" - "\000\216\274DR\213\002O\214\003H\200\002W\206\002U\204\002[\215\003[\216\010a\217\002q\234" - "\013c\220\002[\213\002c\226\017\\\212\004g\227\015e\224\001d\223\002j\231\001\240\300\010" - "w\231\003p\223\002v\230\001~\236\007d}\001dv\001\221\247\010|\215\006z\245\004o\225\000x\222" - "\"\205\256\071[}\002^|\002t\221!u\216\034e~\011>K\002>K\000Uf!HU&lnP\211\207v{vj\212" - "\202z\205}s\234\217~\256\242\214\244\225x\223\203fyiKuqFmn:|{S}|[\212\211" - "h\207\210d\206\205^\204\202X\205\203W\227\225n\213\212d\201\200`\212\213" - "m\205\205l\222\224~\217\224}\232\244\215\227\230\217\201\177y\213\205|\213" - "\204x}vk~zqomj|\223`\201\253_\060J\"\026\066\010=e\034*I\004\067]\005[\220\040N\211" - "\006Fz\002Y\216\004j\237&M\177\000N\200\001Z\210\002e\224\037j\232#k\224\004Q}\002g\231\002" - "`\222\003]\215\007y\242\006\213\266=c\232\000~\255%_\223\011U\205\002d\221\002{\250\003" - "s\243\015\226\274\014|\247\002e\224\010\213\270B\261\324oT\211\000i\233\004n\234\000" - "l\243\015p\235\000\216\264\005t\231\000t\232\000\241\266<\223\270\071u\245\023|\242" - "\001\243\266\026\237\260\003\234\267\020\213\266\035\200\243\006\236\301\033\205\267" - ":U\222\002D\202\002]\225\004f\216\012_\213\002]\213\001b\225\004_\220\002Z\213\002X\212\002" - "t\237\025c\214\011]\205\004i\222\003_\214\003c\217\001g\221\002\222\270\004l\223\001q\226" - "\002u\225\002l\212\002\205\231\005n\201\003\212\226\003~\223\011ez\000u\221\064u\241%i\236" - "\001h\227\003i\222\011a\207\003Tt\001Oj\002[r\002\212\227*ls\007zy\020`b\040fe?nn^\177}uq" - "ib\222\210|\220\202o|kQ\201qO~uE\202\200@}sDxnGqiG}y\\\211\207i\215\212h" - "|zQ\215\213c\231\230s\212\210c\214\207g\221\217r\216\216w\216\220{\224\227" - "\203\233\245\215\222\223\213wrjxrh\206\177rwthTSNW[Pa\216E\202\260`/N\025" - "U}\066\040E\000:e\007G{\014:r\005\065k\000d\230\030X\216\002R\204\002Bu\002K|\002\\\214\002g\234" - "\037p\233\027j\221\004^\211\002o\233\003p\230\003e\225\007n\233\020\207\267Pn\237\027\202" - "\260\"a\225\013Y\210\002m\230\004n\235\002\227\263\004y\251\003x\237\037p\236\036\224" - "\302So\235\016k\231\004o\236\002\260\324Dh\233\010z\251\013j\230\004\205\252\001\230" - "\262\012l\232\005\245\302B~\256:\232\272,\244\274\037\252\274\023\240\251\001\243" - "\275\012\216\265\005\206\260\000\204\260\004[\233\001V\222\003T\213\004O|\001Dr\003c\225\003" - "_\223\002i\226\006d\223\002V\203\002P}\000s\231\033l\225\016_\211\000_\213\002a\214\001i\223" - "\002x\242\004\205\243\002y\222\002o\212\002l\207\002\216\231\022n\205\002y\231\001v\240\010" - "\203\242JVt\002h\233\006Y\203\002^\213\011h\220\021_\201\006Rq\003Sp\002`\177\007C[\000\071" - "M\001FT\002\070G\004ai@z{k\177\200t||sebU\202ye\225\216k\237\235i\242\236c\234\215" - "_\227\202[\203pKp`>ujN\202|^\206\203c}{S\203\203[\220\220j\214\213f\223\223" - "t\206\206j\217\220{\222\223\205\225\226\211\224\237}ytmrkari_VMHNKK>=>q\177" - "\\`\211D\204\263XFt\040:b\025Mz\031\063g\002\065j\003\066k\002R\206\007_\222\004U\207\002O" - "\200\002\\\215\002]\221\002Dx\002b\235\036\\\221\010^\215\004>p\001z\243\004a\212\003d\230" - "\016\210\265Ir\242\006T\200\000\212\273.\\\223\007k\226\010q\235\001\234\261\014s\232" - "\002q\245\014[\220\004t\247!l\224\005\177\250\002n\234\003e\225\001\230\300\040\233\301" - "Ah\224\000o\233\002}\243\001\243\272\040\177\250\017\235\276&^\221\000\203\265\027\227" - "\277!\242\277\"\232\255\005\222\252\001\211\261\016\203\262\017\265\314@M\210\002" - "Y\225\002I\203\002U\220\005^\230\003_\220\004Y|\000q\223\005f\217\001T}\001\\\206\003]\201\001" - "h\216\007l\225\024a\214\003V\201\001^\206\000z\243\020f\215\005o\216\002o\212\002o\216\002" - "i\211\007z\230\004\207\254\014}\244'p\210\016^\210\003e\222\002[\201\001Jm\000]\215\023" - "[\205\007[\201\006g\206\016Uo\001Qi\003C\\\002E\\\001=U\001BW\014elFtueij^ondXVHp}B\226\222" - "d\241\226n\204pPmY\070tak\026Y\217&\066j\016\071r\005P\214\005T\215\006L\203\000X\213\002?u\002Jy\001[\214\003" - "S\210\003P\203\002]\232\031L\177\002U\205\004t\234\006k\227\004i\227\004u\244/g\224\007s\236" - "\006n\225\020\205\264+S\177\000n\223\002\243\265\007n\215\003o\240\000v\253\071]\222\013" - "g\232\012u\235\003x\237\002u\237\005p\235\003\216\275\014}\251\020Y\210\002u\241\002~\246" - "\001\221\265\007\200\251\006f\231\000h\232\002~\257\014\226\276\"\243\270\"\262\306" - "U\234\264\024\222\266\015\205\261\032\221\262/I~\001K\203\004H|\003>y\002o\254\022\\" - "\224\010k\245\027y\252*\215\270D\202\262)\201\252.e\220\005n\230\013P|\001U\203" - "\013[\213\002c\202\017\202\256\002U{\003Z\200\001^\203\003X|\002\\\177\003\204\252\005q\230" - "\021{\220\021q\220\010i\220\007`\216\004]\214\017R\200\001Im\001U\201\013o\237(Z}\000Yz" - "\000`\202\002Vz\003Qy\003Rs\002C`\002CZ\017U\\\063`aKdgNVu.YWEqhUgVAvgI|lG\223\203W\236" - "\213`\204pH~lKk]?lcG\203|b|wX\204\177b\220\216w\213\212v\206\210x{zpdaXb" - "eQ{\211ZXQIb`Xgdab`Y]_Ow\226Ys\226Tr\247@q\025\063k\006F\204\006L\207\003=" - "v\000G\201\002Cv\002\065j\001c\230\010I\177\003K~\001L\203\002a\240\023:o\000t\240\005\\\206\001" - "Z\212\002b\225\017~\253>u\236\006\207\251\002g\207\005\221\270-a\215\000\205\241\010" - "\247\264\004c\222\002g\236\020`\225\040v\254\063y\244\002|\237\002}\236\003\201\247\005" - "\200\263\010\203\260\001f\226\001a\221\003t\241\006{\244\000~\247\002~\252\003g\235\006i\241" - "\003i\227\000\275\324c\301\313]\252\301>\233\271(\220\263\035\201\260$y\242\031" - "u\243\030F|\000?u\002\066q\003b\223\030w\254&\237\313q\223\276]\255\325\205j\231+" - "M{\000v\241\022f\226\005k\237\005h\236\003_\224\002h\233\004\235\302\003o\215\005c\202\003m" - "\213\001s\220\003\202\242\003j\222\015}\237\031e\225\010b\220\011m\231\010f\226\010U" - "\204\020Y\210\006Ry\002Pz\005\203\256Rg\220\034s\217\037^\200\007Xw\001`}\010Ul\001BV\000G" - "Z\005GU\020{\204N\200\214Otp]VPDb[MrkQ\220\207]\244\227j\224~P\221xL\214sJ\220" - "xT{iKaR;qjWwpX\201{f\217\211w\205\201txqiXNFKC:@;\063\207\230R{tbum^{uiol" - "`{\210aX\177\064\202\255YAi\022\063Z\024)T\000Q\211\006Bu\001K\177\016Cx\003Q\204\002-g" - "\002M\201\003M\206\003O\211\001L\201\002M\203\002T\216\010~\245\006]\211\001^\214\003b\225\001" - "t\254/d\232\023|\241\003d\203\001c~\012\224\274F<\060hfZuqfvoe|riuj_gZLg[IwoT\203\231.y|WkmOupcywi\207\234jR\200" - "\036v\247I\071g\015H{\021W\213\002N|\001?k\017N\177\021I}\001H}\001L\201\002Bz\001U\214\003W" - "\216\003^\217\001U\177\002q\234\001_\207\002g\213\004j\225\003_\223\003]\231\021f\237\025\221" - "\260\012i\220\015[\203\000|\260\066\253\272\015v\241\002o\235\002g\225\000\201\260/~" - "\255\013y\250\012~\247\001\207\247\003\243\271\003r\245\004\177\254\002\201\254\003q\226" - "\000z\242\021z\243\016\177\245\003\206\257\000\211\262\000\222\264\023u\230\000s\245#" - "\202\250\013\203\251\016\263\307#\217\253\005\223\260\035\263\313rp\234\000]\202" - "\012d\210\003X{\003Z}\003Vz\003Nv\001n\215\000\\\201\003b\207\004l\222\001g\216\011[\210\001g\220" - "\007j\212\004{\245\004V\202\003Y\201\002\252\314\002|\251+n\232\013i\225\001b\224\000k\235" - "\011^\222\000e\227\017a\217\004h\224\005V\177\000h\213\005Z\200\002m\242=o\254Sb\230>X" - "\211#]\215\027Ly\012^\226\024Lo\007?W\003>N\000Yg\005c\206\006cu\024rr:\200yR\231\224m" - "\220\214h\204}cvjZyjZ\207w`\246\220o\252\223q\243\214j\240\207h\224|dTKA" - "\024\020\015\067\063\063VQIlaU\203vcvbLkVA]I;YF:y\206I\061%D\066-\066-#r|Q=H%AN(f\215\071Lv#O" - "\206\036[\224-c\234*M\207\015?o\000Bp\015/Q\000M\202\003L\206\003O\213\003O\213\004F|\005" - "O\203\002W\213\004n\233\006d\212\000j\215\013I{\005N\202\002W\210\003e\221\002\\\212\011T\216" - "\013z\251\011}\254\003a\227\011|\254\012p\236\027y\237\003x\236\001b\217\014\201\262" - "\007\204\244\022\212\256\003o\236\007m\245\013k\227\001\223\263\005{\245\007}\246\001\240" - "\300\003\216\256\004o\240\023\225\272'\214\257\062\212\254\000}\230\000v\231\004z\244" - "\020\203\263\060\201\247\000|\242\005\177\257\010t\244\001r\240\001\221\251\034\211\241" - "\004Im\002]{\004[~\002Ag\001Wx\003Ov\002_\212\004i\223\000k\233\005O{\000p\220\034Is\001T\201\004g\227" - "\002p\240\006^\215\003a\217\003\213\264\003\203\254\003u\250\032m\230\037\203\236\020\236" - "\251\024\235\257\026r\236\065\245\314|\262\335\217~\252Ch\235\037n\237+\\\225" - "\014a\236\017q\241'g\231\024Z\215\003T\206\000`\222\012c\233\012X\217\003W\201\006k\210" - "\016Hj\004Xr\021h~\040\256\246\230\266\252\241\245\227\224\223\203~\231\210\177" - "\222\203q\200~Vgb@e\\B\222\200l\253\233\204\246\225\202bVR)\"\021bMBv_Q}c" - "OsS>kM;gK<\\F\070J:*u\200O*@\000Ki\036Z\205\024Gv\007;j\003j\232\071b\232$P\201\016" - "P\202\016N\203\011P\210\004T\216\002J\207\002Z\226\001T\215\002O\210\002X\224\003^\226\003" - "q\242\010a\225\033V\214\022|\256>u\253\026a\227\006r\241\021w\253\060}\255+x\251" - "\003x\251\006V\206\002\214\262\004~\247\011\220\264\003\201\251\004r\232\003z\250\002k\231" - "\006\217\265\014x\241\002_\226\013p\237\004\222\257\003\235\275\003r\235\003\205\251\003" - "w\234\015i\224\001p\225\000\215\246\000\221\262\012\243\305Lm\224\000q\235\013~\260" - "'\246\315T\200\240\000\201\245\002\207\243\023g\221\000{\243\002\221\257\004Xo\004^\177" - "\002S~\003T\177\004j\216\005b\210\005b\210\005g\224\005n\245\003_\216\005g\223\012Lu\001]\214" - "\004d\227\002f\224\005X\214\001m\240\005\211\263\004n\234\003e\216\004{\230\010e\204\012i\215" - "\006^\220\030l\243*l\244\032f\240\024\201\272B\211\274Ps\242,Z\205\012l\214\062" - "t\240\064q\231\037o\243\030o\250\024b\237\012]\234\012J\205\002S\211\001_\215\001\\~" - "\003e\207\006W\177\016\235\241\205\240\226\225\222\204\206\221\213}\216\232h\210" - "\222]\226\234n\231\234q\232\233r\247\247\200\252\251\204\242\243}s\177[S" - "d\065v\203K}\205I|~@ss\062]X\025ZV\033]Z)ba\063v\214GOx\023Gz\006V\214\011@v\001J\200" - "\011\217\271EU\203\020N\205\017^\236\027c\232\015[\220\001R\212\004@w\002T\214\003X\216" - "\006`\235\021T\211\000p\243\004V\217\007[\222\014M\201\000\245\307`i\233\013l\232\014k" - "\227\001}\247\031w\251\001u\253\010{\250\004{\243\004Po\001}\254\031}\247\001x\236\014w\246" - "\001o\236\010\221\260\004\200\253&\177\256\024v\244\024\270\310\003\230\273\007~\244" - "&q\233\000~\244\003n\230\003h\225\004q\245\022~\256\037y\244\011y\247\001\205\256,\204" - "\250%o\222\007\256\326}\200\247\011\203\253\"\217\257\035z\237\002\207\247\003\204" - "\242\001_o\003d\212\003Am\002W|\003Yc\001PX\001jw\003Qg\005o\242\002R\214\004b\223\003\216\267\005" - "p\244\023r\245\001g\236\003Z\222\004x\247\005\200\241\031w\237\063f\217\005m\224\032_\216" - "\010Q\177\004}\231\012f\233\012W\214\004R\200\001[\217\000v\253\064|\263?X\224\005]\225" - "\007n\241\030h\236\013Y\224\000a\235\011V\222\004a\233\015^\231\011R\213\006\\\230\006d" - "\233\013X\214\004V\213\000o\223(j\215\032r\222!\210\221ontTkgSd\\KbVF\177n\\\233" - "\206o\245\220v\222y`T=\065_I>\220qZ\211lR|_?x]=oY\063g[)qw\070^r\037\205\237" - "\062Gu\006K}\004V\220\004R\206\017Y\230\032g\242\060h\244/_\226\035V\213\004V\214\001M\206" - "\003O\210\011R\205\002K\177\003T\202\002Sx\002{\253\035R\210\003S\205\002T\177\010l\231\"" - "\213\266AW\215\006p\225\004y\236\007~\253'l\236\002q\245\004z\243\003\231\267\003i\231" - "\002l\242\012\200\253\001z\247\001n\236\003[\216\002\260\270\027\200\236\062\247\276\014" - "\235\264\003|\241\002o\230\003g\214\000l\225\003w\234\004z\242\006s\232\002}\242\005x\233\007" - "q\232\010\177\254\003p\231\000x\237${\232\003\211\250\014\227\302M\201\246\000\237" - "\306f{\253)\231\271\026\177\233\001Sn\002Sz\002?d\002Tr\000\\n\002Nd\002Xu\001m\204\004{\245" - "\003l\221\004V\214\012P\214\010~\256\003y\253\002T\210\001a\215\004\230\276\001{\245\033c" - "\220\040o\234\026a\223\031s\242\032d\234\016m\237\"\207\261Nu\244\063d\226\022n" - "\230$d\230\002]\217\000`\224\001n\236\012m\233\022\226\271;\250\276\060\245\271\065" - "a\230\016]\226\031]\232\023U\214\003a\233\015X\222\001S\213\002V\213\003e\221\012s\232" - "\030i\223\016^\212\020e\211\040h\204)z\215D\217\230i\222\227o\212\214a\210\177" - "\\\214\203aYF\065zhP\245\226o{sE\207yM\202wC~z=gn\040j\202)Tw\015p\221%\064Z" - "\000Ny\002h\242$n\247\062{\256HH\201\025s\251>Q\203\001^\223\007J{\002Dw\003>p\002K~\003T\210" - "\000\205\255FOl\000\\\224\014\211\272`Kz\000\220\254.\271\316\215`\221\011x\246\011" - "c\213\002\220\274\036\\\213\010X\217\014h\233\005\212\254\004\203\251\005k\231\003r\234" - "\003m\227\002t\235\003c\222\003\203\250\005\232\255\005\300\306\017q\230\004Y{\002~\251\003" - "h\225\004l\224\002j\221\002n\227\005l\227\004x\234\002\177\241\002\202\245\002s\231\005v\240" - "\002r\224\002~\235\003\225\254\002\207\242\003}\250\016\210\257\025\203\254\037\204\257" - "%q\223\000y\222\002Ru\004R\207\002S\203\002a\225\016\\\215\007]\216\002_\203\004`}\003p\237" - "\000x\234\014O\202\011S\216\003`\223\006l\236\000\177\227\032\204\256\020\222\272\011" - "^\213\004f\220\004g\227\006d\225\006c\223\002^\223\004W\213\003\\\215\004Qw\000a{\000w\217\001" - "o\232\003j\231\020^\224\025b\225\020}\251\030S~\003]\216\015X\207\015e\222\026_\216" - "\016e\227\025]\217\010]\221\003X\214\003K}\001T\205\002Q\203\000e\213!Lv\014X\206\035l\224" - "\064\177\225Op\215\071Ov\014U\204\022[\213\030^\214\032i\221*o\217\065\230\254o" - "\226\236l\204mA\223qH\225pD\255\216Art\034]|\020Hl\003v\231@\070b\000]\221\000\213" - "\267JR\205\016d\237(i\244\067D~\000S\210\015\\\215\003l\231\003f\224\003Kj\001V\215\002" - "a\221\024~\235\065n\240\005T\206\012f\223*e\225#}\254*\245\277M\203\263\004Iv\023" - "`\230\010\203\261\027`\221\001V\217\017w\243\007\255\300\004s\240\004t\240\003\177\253" - "\006e\220\003j\231\002y\235\004\264\300\004~\236\005\215\245\006b\214\002k\223\000w\244\004b" - "\211\003j\220\002l\227\003g\221\001l\226\003\200\245\005\204\244\002\200\244\003t\234\004m" - "\225\003v\234\005\225\257\001\203\231\004d\213\001z\237\020\232\271D\202\246\027{\245" - "\006}\251\026\210\230\005Fo\002Gs\002Iz\003Mz\002Z~\000Os\000Kn\000Ux\000~\253\040\177\237\001Rx" - "\003I}\003P\206\002a\227\002o\244\004U\213\002w\241\004P\202\002Z\213\004S\203\002c\222\002^\217" - "\005O\204\002[\220\003T\205\002i\226\004a\211\002i\216\003k\231\005L\177\003^\220\002\215\255" - "\013c\215\021`\221\022j\236+[\224\024b\234\020Z\217\012U\205\000U\204\003N{\002i\223" - "\007n\223\002\211\242\"\261\267P\241\260\071\230\255(\206\246\025\204\250\033\201" - "\247\031\212\254*~\236+\202\232\063v\217*}\226\062h\216\012^\213\005l\223'`\203" - "\036^\177\031f\206\036c\206\031r\221\013y\234\007Cj\006`\177%\205\260?`\221\012f\230" - "\000}\253F^\226\022]\226\016Al\000Dv\002m\240\020V\205\003Y\211\002_\214\002z\251\011a\236" - "\006n\245\030h\236\020^\222\003Z\204\003X\203\001\211\267R{\241\034\212\260\023f\224" - "\030c\227\012R\207\007\211\265\011[\215\001f\245\034]\210\002\226\257\004v\242\003\202" - "\244\003\203\254\004h\225\002\224\262\005\247\275\005c\215\002j\226\005\206\242\010{\231" - "\000\236\275\040k\223\003\213\254\005p\225\002h\225\001\200\253\020h\215\010{\241\001\233" - "\264\033x\235\001t\227\002\200\241\005\210\251\010v\223\003s\225\001q\231\001\243\272B" - "\207\226+\260\312lt\235\000\200\250\026\212\270\030V\207\002R\205\002K\200\002Cq\001" - "h~\031q\212\"\232\215&\212\254Hq\235\000I\177\000T\212\002[\222\017H\200\002e\234\003" - "e\232\004~\255\003\\\220\003U\212\003J\200\002T|\003[\204\002f\222\003^\217\004V\211\001^\223" - "\001b\217\004b\211\002o\236\003N\202\003[\215\002g\225\003\225\257\004x\230\005f\235\010n\242" - "\036c\225\010[\206\001U}\006[\206\016b\217\007^\217\003a\223\004T\202\004Z\206\013}\236\063" - "\254\266u\231\247k\213\242a\207\242T\250\256{\244\236q\221~N\230\206U\222" - "\216M\232\214]\202zM\\p+d}\070\222\244U\242\255\\k\201$a\213-W\207\016u\240" - "\003w\236\022\233\271P}\250HO\205\012i\233\000{\253Ha\230\023Co\003\\\204\000x\247#" - "U~\000Il\002>f\002H\201\004G\205\006R\212\006\200\261\031{\254\003R{\004Jt\003T\202\007m\233\025" - "w\245\024i\235\021U\210\005Y\212\004Ew\003\211\272\011[\221\013^\230\022\240\270\001m" - "\223\004y\246\003\201\241\013\212\261\003\226\271\005l\224\003\210\252\004U\203\003k\222" - "\005\206\247\002\177\233\005\220\257\003\221\261\004y\234\003d\217\002v\245\004\200\251\004" - "\\\204\002r\232\004\226\265\022}\230\007|\225\006y\234\006}\252\001o\235\002w\244\021\201" - "\252\013\202\256\024\200\243\037}\232\"|\242\027|\241\002~\257\031\\\213\010^\212" - "\004X\204\003qk\005xm\003z\203\003u\230\071I\200\000R\216\002R\211\005S\205\004[\205\004P\200" - "\003g\242\002Y\224\002d\231\002n\235\002J\177\002^\224\021_\207\016Z\210\000_\217\004X\213" - "\002^\227\006\204\254D_\220\001j\231\006N\205\002_\226\003b\232\001t\252\004k\240\002_\226" - "\003c\232\017c\230\013R\205\001\\\212\002a\201\030h\212\027t\236\037Hv\004Ac\004\070\\\000" - "&G\001\223\222F~\205\061\202\210:\303\273\211|\211&Ke\016c}:`v:[{)]{#q\206\062" - "s\210\062Zr\"AY\012e{\026n\210\021t\220\010j\207\001y\221\000n\231\003y\212\000\204\244" - "Dx\242Cd\220\000g\233\017\236\275UV\214\023`\220\002k\227\024Wx\034Fj\004>f\002B{\006E" - "y\011]\231&k\255\064t\252\017[\211\002m\237\010a\216\011_\223\006~\254\016q\241\015" - "Et\001a\225\011P\200\016i\226\013\221\270\003T\206\011c\234\022\255\300\003d\216\005z" - "\246\001\224\260\022q\240\002n\230\010y\235\002v\233\003[\206\002o\224\001\213\252\003\203" - "\237\004\231\262\010n\221\001\206\252\022o\230\001u\235\003\216\255\006f\220\003h\231\010" - "r\227\000\234\257#\215\223\014\223\262\003~\252\001u\254\033v\253\025\201\263)\214" - "\266+\213\270\020r\235\001\226\277\061\201\252\020m\224\000f{\003u\230\004t\237\004i\222" - "\006V\210\000m\232+l\223\031_\205\004h\234\004P\205\000p\234\021P}\003K\177\002b\232\002Q\214" - "\003c\230\002m\247\003O\177\003V\207\004o\242\032y\246=Ly\004S\200\010r\237\062R\216\000L" - "\202\001d\231\003O\204\001^\227\001b\232\012U\216\005N\202\003J~\002T\213\001W\211\001`\212" - "\002j\217\006}\242\013~\251\021i\226\036Ou\005Ph\010JW\010Zm\007j}\026\211\233A\215\255" - "C\246\277Vy\215%{\217\040]p\015g\177!}\232Hb\201\032Z\200\007Z\211\012R\201\001G" - "p\001Qw\000U~\010j\224\021\226\270\063[|\014g\223\001j\235!\202\251Kp\247\021_\217\020" - "\220\247E`\210#O\201\000\070i\000\\\210!Kz\010Bl\001K\177\005\070k\000\203\260Uw\253T" - "c\221\020e\226\004Iw\002\\}\013{\241\012o\242\002\205\255\017X\206\004W\207\000h\230\027" - ">k\001t\231\005\207\257\002X\207\001\207\271\027\207\254\006a\220\012{\246\006\217\247" - "\014y\250\003\\\214\002\204\252\004o\230\006^\211\002\216\260\007}\240\004\214\255\003\210" - "\242\004o\220\002|\240\006w\227\002p\226\003\215\253\006o\225\002z\240\006~\241\000\213\253" - "\000\202\233\012\207\261\004\205\257\005s\233\007m\223\000y\243\022z\251\024\177\253\037" - "\177\254\002\202\256\013\206\257\007\205\251\004h{\004P\201\002R{\003Y\202\003k\236\014\\" - "\225\000O\210\001h\234\004f\234\005e{\011b\210\013L}\003[\223\003`\226\002Az\002j\237\003Jx\001" - "d\226\006Y\203\002]\216\002P\200\000x\242+\201\244?Io\000Cq\002d\232\022b\230\000W\214\003" - "]\225\002]\227\015W\217\003W\217\011X\216\002Y\216\016i\236\015f\235\016`\220\017\\\212" - "\021K|\000Z\217\006a\223\004q\242\016k\236\021k\225\036Qp\011\244\277j\211\264Oq\230" - "#Zx\017k\202\031_s\000j\213\017W\201\006X\206\005[\216\007J{\003O\201\007Bn\005S\203\021}\253" - "+\205\253\067HX\004Pf\022r\233\003o\232\033\205\254Yh\237\002Bv\005z\250);q\000Ao\004[\210" - "&b\224\063\061V\000Gu\026`\001p\241C\224" - "\305rn\246FBj\017Kw\004j\226\007h\220\004f\217\004l\224\005\207\253\033\210\246%\215" - "\254\017f\242\026M\201\000W\206\016\\\211\010y\241\007~\245\001\205\260\032\214\265" - "\005\216\236\015\205\247\004\243\271\026\202\255\020\211\261\031\177\244\011v\233" - "\003v\235\017j\224\011y\245\004\212\260\003\177\244\002u\234\005z\243\003q\234\003w\240\002" - "z\231\021}\243\013f\225\003o\235\003y\243\005\221\263\006\222\257\006\213\256\002\213\256" - "\005\204\246\002]|\001\203\233\013\202\227\002\221\243\003\226\263\021n\236\017\203\260" - "!r\235\001f\230\003c\226\006W\216\004`\220\006Mt\002[\213\003J\200\004U\210\005e\232\004V~\002" - "b\221\003[\224\003]\224\002`\225\004V\205\003p\236\003Q|\003T~\010Z\210\002w\251\002T\210\002" - "U\203\005b\212\010M\177\000j\236\035_\214\024|\256\067R\206\002]\220\004U\212\004T\220" - "\002l\242\022u\251\022j\236\015}\260Ax\253?`\227\027\\\217\006e\221\032Xx\026Ke\000s" - "\226\071o\240;s\247\031~\260+U\207\001Zz\004Nw\013^\215\023d\231\021f\207#d\224\014" - "]\221\003Iz\004c\222\020x\250*\220\303;z\251\040\226\270M\210\247?\227\276[\253" - "\325|\230\304kf\230\004i\231\022\211\260#^\231\017T\210\024`\222\005P~\001y\233<\\" - "{\027H`\000\215\267Qn\237C~\260@Io\013c\225(p\240\012S\204\005O\177\006_\221\017r\235" - "\000\270\317KI\200\010l\242\016f\224\015Hs\002k\243\014`\217\012u\240\003x\247\010\202" - "\256\003{\241\007m\221\004\221\257\003p\222\002|\246\007a\214\001t\237\003c\223\003j\237\011" - "f\227\006p\234\003\227\277\005y\244\010m\227\002z\242\002d\220\003\203\237\002\245\253\011" - "h\221\001k\232\002f\226\002\211\254\037\207\247\004\212\254\003\217\263\003\233\273\003" - "\222\263\003_\203\003q\231\011y\231\002\232\246\004\216\237\007\227\260\020\207\252\007" - "r\241\003a\217\003_\213\006t\250\020t\254\035n\246\027>q\000As\002H{\002R\205\002Y\201\012" - "S\205\003`\226\004h\227\004U\206\002l\234\003k\232\002W\205\006b\221\023M\213\005s\246\005k" - "\236\002N~\003M\177\002b\223\002\\\214\001]\213\023a\225\060e\244\006\\\226\015\205\271" - "Le\240\034T\217\011l\234\017b\226\003y\255.\203\267>d\235\012h\241\004f\232\001T\204" - "\011\\\207-k\223\035\203\254\065|\252\071|\254,l\227\022r\240\021e\231\004`\221\005" - "a\223\002o\244\015o\243\017z\262+n\241\065\230\305x\222\300Nl\237\027g\216\025X" - "u\012s\233\061\202\255VO{\027^\225\037\200\266\071{\257,y\252\030\\\211\003T{\015" - "l\220\012i\223#b\210\037[{\004\206\260Y\\\220*\207\265\066Hm\011j\234+S\177\031" - "g\225\002f\224\003T\200\004}\245\004\224\265\065k\221\010j\227\030m\241\016j\234\014b" - "\227\007h\227\030c\222\006\210\271\005l\247\025w\250\006h\226\005g\230\003}\252\001q\240" - "\005\205\254\010}\242\016n\227\005{\243\007p\235\016q\240\003\205\260\004w\250\011^\211" - "\003s\237\003l\230\005k\226\002\216\241\001z\235\030k\223\002t\232\006g\216\002\177\255\005" - "q\233\004w\235\003\211\262\003\220\266\002\203\253\003\205\252\003w\240\003|\234\002}\224" - "\003\246\260\001\247\275.\177\242\003r\241\005P\204\002b\234\007R\207\005[\220\012|\254" - "\066\213\272HO\202\025Ez\000Cw\003P\201\003H}\003V\212\005n\241\004L{\003e\235\006Y\213\004a" - "\221\012W\212\002D~\002L\203\002x\251\002i\226\003Oy\002Z\215\003\\\215\000e\227\032m\232%" - "\202\272Cg\242\037\211\266P]\220\007J\200\004J}\001Aq\004P}\001a\207\020s\221\021q\234" - "&d\232\030x\254\061a\227\016s\251\062w\250D`\227\015_\225\002c\233\004e\240\020^\220" - "\010y\245\032\222\271\060b\212\002k\223\014\211\252D\230\276Uz\255.m\241!l\231" - "\037\202\254\064|\253Dy\256F]\222\030`\225\024n\237!U\211\013M\202\006a\230\032\200" - "\256#\200\254\064i\215\003w\251>\\\215\"\213\277aJt\012q\253+Lx\001i\233\040S\206" - "\015En\003g\221\001w\244&v\243\004j\224\020\203\245\020r\223\"d\225\004l\242\040l\234" - "\005y\240\040n\237\011\214\275\007n\236\005h\250!}\253\000o\233\003k\231\002\177\260\003" - "q\234\002\211\253\040\217\264\037u\244\004\\u\002n\232\004o\226\003\223\267\004u\244\006" - "h\221\006\201\241\006v\226\027p\236\013\201\247\027q\235\011x\241\010}\246\002s\243" - "\002m\234\003_\214\004m\230\003z\245\002\233\300\004o\230\002\202\244\005\213\254\014\220" - "\257\006\220\252\004\233\261\005\301\274B{\242\016p\234\002]\222\002c\230\002b\225\002V" - "\211\006\\\223\006V\216\000c\221\035\220\271Yp\230\"T\202\000Cz\001U\211\003i\241\001S\215" - "\005Y\216\003Q\201\002Mz\001[\210\012Q\203\001O\200\002m\235\003^\206\002i\237\002`\226\003K\204" - "\001e\237\013o\246\034j\241\031\204\266H\213\266Rd\236\011Ev\000\\\215\003[\221\015" - "U\205\002d\234\012U\215\004`\225\000\\\221\002W\215\001a\232\004\\\225\007V\220\005l\236\033" - "p\236\013[\206\011d\230\040^\221\006i\237\012n\235\037z\250=j\225\035\230\270:\177" - "\241\030`\211\010n\232\040d\232\030p\250*l\233$Hl\012b\223\027{\242\062\216\241" - "BX\207\014Gy\000U\207\005o\233\021k\201\"\210\270?w\244*\200\270KV\206\033l\221" - "\060d\215\040k\222\040Mt\011>d\002d\215\002t\243!m\237\015t\233\001\264\310\070i\216" - "\016X\205\005m\234\013\211\254\040i\224\003\216\267\005\206\257\010k\226\005d\234\020" - "i\243\027\177\255\002q\240\004\207\256\004o\233\002m\232\002r\221\012\227\264\022n\236" - "\003Z~\004j\222\003\226\266\003m\225\002t\236\020s\237\000\200\256\030i\221\002d\213\006h\216" - "\014n\226\007\210\261\006t\236\011z\242\024o\226\002d\217\003\215\266\004q\232\002\216\263" - "\004|\236\002\214\256\006\223\255\003|\237\007\220\266\021\202\246\002\231\253\012\233" - "\262\062v\236\002X\221\017W\204\001Kq\000p\213\030U\210\004_\233\010f\244\016T\212\000\\" - "\220\017_\222\020F\200\001`\226\017f\235\002U\214\006f\225\002T\177\005Bl\002a\213\014T\202" - "\005W\212\005\\\215\002e\213\002j\232\002n\246\003K\200\003l\237\006q\244\016u\252!`\227\030" - "\220\277W\231\304\\\212\267Bh\210/\\z\022b\223\024En\001N\177\004O\201\004N|\002V\213" - "\012`\232\005M\200\000[\216\002f\230\011e\226\022l\241\016[\214\000g\240\015^\223\012v" - "\246*n\235&l\235\017r\243\022}\242\033r\232\025\200\252I\201\256Nh\206%\177\222" - "B\200\255C\202\260Lc\227+Z\222\031h\235#Q\207\023^\226\014r\240\003d\221\004z\263" - "\032c\222\013p\243\030Y\211\006t\245&d\225+Mx\006B[\004LZ\007h\216\007p\243'\220\265\002" - "\204\240\011\205\261\035[\202\012h\233\003w\255\035^\216\002\210\265\007k\227\004\201" - "\251\005a\221\007p\251\070l\242\020y\251\002\204\256\003p\222\005i\226\001x\240\003p\226" - "\005|\246\003z\252\005p\234\011f\216\002\231\271\011q\231\"s\240\013f\224\001~\254\004r" - "\242\030r\236\022x\240\006\207\260\006t\227\004\225\273']\211\000\234\301/v\245\006\202" - "\255\010o\223\001\222\267\004\204\250\005\211\250\006\210\241\002l\212\003~\224\004\205" - "\245\014\231\264\012\206\250\023\217\257\006C{\007V\211\036\216\275I@p\002Eq\003\067h" - "\000g\235\011T\214\002S\212\004m\245\004Y\214\001p\245\025a\230\000V\217\007c\227\004Go\002T" - "\200\003Y\205\004Tr\007d\225\002L\200\003X\212\006_\216\005_\213\004[\212\003Y\210\001}\245\063" - "\216\302Ea\227\024\251\322s\212\267C\214\274J\260\331\214h\215?e\211\060g\240" - "\004P\211\003W\217\002_\216\005M~\002j\241\004t\257\032\177\257=}\245\066j\227\010_\216" - "\002h\230\021i\237\013`\220\012d\217\000\212\262\016\213\265#\207\257\060\215\261" - "U]\220)\201\247U\202\250Il\233\065T\211\014]\202\024bt\006\201\262\026\203\257" - "\071\205\264>^\225\031a\223\006\200\251\002m\240\061k\241\020g\227\036a\231!d\235" - "\026~\264,m\240\034g\223\015Y\177\005Ko\004p\234\002}\253\024n\225\001\220\255\040|\244" - "\033k\226\010y\244\007x\250\035\210\264\002Q\200\003\204\261\020Z\177\000g\224\032\221" - "\275tx\246\000\177\255\003u\241\003i\223\004e\215\002{\236\007[\211\002n\236\012l\232\002" - "p\231\002\210\256\006t\223\010r\237\006\225\260\020\205\260\024\225\303I\211\264\062" - "~\253\024x\241\010\225\265\010j\220\003\215\265\011q\233\017U}\002\212\270\021y\254" - "\011}\254\034\234\276\006t\224\000\240\271\"\211\235\035\206\244\005BS\001r\227\002\205" - "\255\016\211\254\021m\221\003V\203\003\177\246;{\255;l\230\040Be\002\070`\002Iq\003Y\214" - "\005K\200\001e\226\003Nu\004U\211\004_\237\003Y\224\007P\203\001o\222\"V\202\004T\203\003Eq\002" - "X\217\003F~\003^\230\010Os\003Vq\007Ps\001Y\207\003?]\000a\212\012^\211\016w\253\022}\262'" - "\207\274\071\210\274\066n\237$Ow\016z\235*a\214\023i\241\027S\206\001f\236\003c\227" - "\004h\232\003y\253\013o\240\011z\250+\204\255?m\236\031n\234\"q\237+s\245\062[\213" - "\026N\177\000Y\214\006h\232\011\220\274\021\202\236\040\211\257)\202\262*v\244\014" - "\200\245\015\215\267\031s\243\014o\243\030[\220\015h\241%b\230\022w\250\001\\\204" - "\010_\216\010j\237\035\200\256-T\204\015N|\001\202\255Cu\241$Z~\007Lq\010\177\254" - "\006r\244\000\255\302.g\232\016\211\254\006v\241\002\214\264\004\202\256\005Z\215\023y" - "\253\007Gs\002n\236!v\244(\234\302V\236\275\034\234\271\"\227\261#\217\245\022" - "n\214\004{\230\005h\226\004k\230\011\202\250\004g\224\002\216\262\004}\250\010q\236\002\214" - "\257\015\204\252\015X\203\012v\240\004\202\250\005{\241\024\217\267\010\205\255\004" - "\207\256\023v\240\002|\245\003q\237\004\204\257\040\232\265\"\247\303\022\254\302" - "K\215\250\013z\232\000\214\253\006\214\252\004\206\253\002x\230\002\213\250\006\201\251" - "\016", +const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[128 * 128 * 4 + 1]; +} cat_tex = { + 128, 128, 4, + "[\227\017\377L\206\001\377M\212\002\377T\227\011\377V\231\010\377W\224\001\377[\222" + "\001\377T\212\001\377P\211\001\377M\203\001\377P\212\001\377Q\217\001\377K\210\001\377" + "K\210\001\377N\214\001\377Q\217\002\377W\226\001\377X\224\001\377U\214\001\377U\216\001" + "\377[\225\003\377Y\221\002\377W\217\001\377^\230\005\377^\230\006\377`\231\011\377Z" + "\225\003\377X\221\002\377Y\221\003\377X\220\003\377^\227\007\377Z\225\004\377Z\226\002" + "\377W\217\001\377Y\224\002\377X\222\002\377W\220\001\377[\227\001\377c\241\004\377a\237" + "\003\377Z\230\001\377Y\222\001\377Z\220\001\377X\216\001\377[\231\005\377j\246\025\377" + "_\232\010\377U\214\000\377o\242\026\377k\234\013\377g\231\001\377c\222\001\377X\213" + "\005\377_\221\023\377V\214\010\377T\216\002\377U\222\002\377Q\211\001\377J|\001\377W" + "\214\003\377j\235\006\377o\243\004\377g\235\002\377X\217\002\377X\226\002\377U\221\001" + "\377T\210\002\377V\212\001\377V\216\002\377Z\226\002\377Y\221\001\377[\221\002\377g\234" + "\014\377d\232\016\377g\240\032\377[\226\022\377\\\224\020\377g\235\026\377\\\225" + "\005\377V\221\002\377U\212\002\377Y\217\001\377Z\220\001\377Y\221\001\377Y\226\002\377" + "W\227\001\377P\217\001\377O\217\002\377V\231\004\377X\230\003\377[\231\004\377X\217\001" + "\377Z\215\002\377Y\212\002\377[\214\001\377\\\215\002\377]\220\001\377]\227\002\377]" + "\233\001\377X\220\001\377X\217\001\377X\215\001\377^\234\001\377]\237\002\377U\221\001" + "\377R\214\001\377S\217\001\377T\220\001\377P\217\001\377P\224\001\377O\216\001\377M\210" + "\001\377V\225\001\377S\216\001\377S\216\001\377S\224\001\377N\220\001\377Q\226\004\377" + "S\227\013\377Y\235\023\377a\241\025\377`\240\015\377]\234\005\377V\227\002\377Y\233" + "\010\377W\231\011\377P\222\002\377R\217\001\377Y\237\021\377S\232\010\377K\224\002" + "\377L\222\001\377P\214\002\377]\222\001\377]\224\002\377U\217\001\377L\212\001\377K\206" + "\001\377Q\213\001\377T\222\001\377U\220\001\377V\224\001\377V\223\001\377Y\223\001\377" + "[\223\001\377Z\221\001\377Y\222\001\377X\225\001\377V\222\002\377U\210\002\377^\225\001" + "\377i\240\013\377g\236\020\377h\240\023\377T\223\002\377R\216\001\377V\215\001\377" + "[\225\001\377Y\226\001\377[\227\001\377Z\227\001\377Z\226\002\377^\226\005\377e\232\014" + "\377\\\225\004\377a\233\005\377_\231\002\377m\246\013\377a\232\003\377_\226\002\377" + "\\\223\001\377X\224\001\377]\235\012\377c\241\016\377^\231\002\377_\222\002\377f\235" + "\006\377s\252\012\377j\242\001\377b\233\002\377a\235\006\377_\232\011\377V\220\002\377" + "T\210\002\377T\216\001\377S\216\001\377U\220\002\377e\234\005\377k\241\004\377n\244\004" + "\377s\252\014\377a\234\003\377c\235\010\377W\217\001\377U\204\001\377X\212\001\377" + "[\217\001\377]\225\001\377[\224\001\377W\216\002\377V\216\003\377T\214\002\377R\212\002" + "\377T\214\002\377U\213\001\377\\\223\005\377e\235\014\377W\221\002\377W\220\001\377" + "Y\220\001\377W\213\001\377V\214\001\377V\217\001\377W\227\002\377V\227\001\377U\227\001" + "\377V\231\003\377N\211\001\377S\215\001\377W\216\001\377T\210\002\377Q\204\002\377W\213" + "\001\377Z\217\001\377Z\216\000\377[\225\002\377b\243\013\377V\220\001\377T\207\001\377" + "U\214\001\377[\231\002\377\\\236\002\377U\220\001\377M\207\002\377N\207\001\377Q\215" + "\001\377S\216\001\377V\226\002\377U\216\000\377V\212\002\377c\233\001\377]\221\002\377" + "V\215\001\377X\230\001\377S\226\001\377L\215\001\377I\211\001\377L\217\001\377T\225\004" + "\377j\244\014\377l\246\013\377X\226\001\377T\225\004\377\\\235\016\377c\243\025\377" + "^\236\012\377K\223\002\377M\230\007\377S\235\016\377N\227\007\377P\215\001\377^\224" + "\001\377`\226\001\377Z\225\001\377Q\216\001\377M\210\001\377V\216\002\377]\227\001\377" + "_\232\001\377]\226\001\377[\223\001\377Z\222\001\377Y\216\001\377Y\216\001\377X\225\001" + "\377W\226\001\377V\216\001\377T\210\001\377]\225\001\377o\246\014\377e\235\012\377" + "b\236\014\377S\222\001\377T\213\001\377W\220\001\377W\223\001\377W\216\002\377\\\231" + "\002\377c\235\011\377l\242\027\377e\233\022\377d\234\020\377Y\223\003\377b\235\007" + "\377b\233\003\377f\237\004\377b\233\001\377b\232\002\377`\232\001\377]\235\001\377^\237" + "\005\377Y\227\002\377U\211\001\377]\220\002\377_\225\001\377c\240\001\377l\250\005\377" + "b\237\002\377^\233\001\377W\223\002\377W\221\001\377T\214\001\377T\217\001\377Z\225\005" + "\377]\230\002\377a\233\002\377b\234\001\377k\245\011\377l\247\014\377\\\227\003\377" + "g\240\015\377V\213\001\377P\202\001\377T\212\001\377Z\224\001\377Z\226\003\377\\\231" + "\010\377T\220\014\377L\207\004\377L\200\002\377Q\203\001\377^\223\003\377Y\216\001\377" + "^\224\004\377p\247\026\377]\227\005\377Y\222\001\377X\222\001\377V\213\001\377W\213" + "\001\377X\220\001\377[\233\001\377X\231\001\377O\212\002\377S\220\001\377S\211\001\377" + "V\216\001\377W\214\002\377O\204\002\377U\213\001\377Z\217\002\377\\\225\001\377Z\223" + "\001\377U\221\003\377g\247\027\377S\224\002\377O\213\001\377U\223\001\377Y\230\001\377" + "\\\234\001\377Y\226\001\377Q\215\001\377O\207\001\377S\214\001\377V\217\001\377Y\225" + "\001\377X\214\001\377_\223\001\377i\237\001\377_\223\001\377[\222\001\377Y\227\002\377" + "V\226\001\377K\206\001\377H\203\002\377J\211\001\377T\224\003\377j\244\014\377i\244" + "\010\377]\234\003\377T\222\001\377U\226\002\377\\\236\012\377a\242\012\377H\211\001" + "\377E\214\001\377I\225\010\377V\240\021\377Q\232\002\377Y\224\001\377\\\222\002\377" + "X\224\001\377Q\215\001\377P\212\001\377W\216\001\377_\226\001\377a\226\001\377^\224\001" + "\377Z\221\001\377X\217\002\377S\210\001\377U\214\001\377[\227\003\377X\227\001\377U\221" + "\001\377W\216\001\377^\227\001\377h\243\002\377`\231\001\377Z\226\002\377U\214\001\377" + "W\217\001\377Y\222\001\377X\221\001\377X\226\002\377W\227\002\377X\227\004\377U\223\005" + "\377U\220\002\377V\222\001\377V\222\001\377\\\235\004\377]\236\003\377X\226\002\377Z" + "\225\002\377`\237\001\377`\241\002\377]\235\001\377Y\232\002\377X\224\001\377U\212\001" + "\377W\214\002\377Z\221\002\377Y\216\001\377d\240\005\377`\233\003\377Z\226\001\377^\232" + "\003\377Z\227\002\377X\222\001\377c\234\010\377i\242\014\377\\\227\003\377]\235\003\377" + "[\234\002\377d\244\015\377e\244\017\377Z\230\004\377j\246\017\377W\215\001\377S\205" + "\002\377X\223\003\377j\244\037\377l\246/\377~\261P\377\224\301r\377j\236\063\377" + "M\201\001\377S\207\001\377[\222\002\377T\214\000\377`\233\013\377i\243\024\377`\233" + "\014\377h\241\027\377e\240\023\377U\217\002\377V\213\001\377[\230\002\377Z\231\001\377" + "N\210\002\377H\177\002\377W\225\001\377Y\220\001\377Z\217\001\377V\214\001\377R\210\001" + "\377]\234\001\377_\231\002\377Z\222\001\377Y\223\001\377V\223\001\377c\244\020\377Y" + "\233\007\377R\223\001\377U\224\001\377Z\232\001\377^\235\001\377]\234\002\377Y\232\002" + "\377R\222\001\377T\223\001\377W\230\001\377W\230\002\377W\213\001\377h\240\001\377h\236" + "\001\377_\222\002\377\\\221\002\377[\231\002\377X\231\001\377O\220\001\377K\213\001\377" + "O\217\002\377b\236\015\377_\233\007\377Z\227\002\377_\240\004\377U\217\002\377T\221" + "\001\377S\222\001\377U\221\001\377K\203\002\377F\202\001\377D\212\001\377K\225\004\377" + "O\232\003\377R\230\002\377U\225\001\377T\223\001\377P\211\001\377K\204\001\377R\211\001" + "\377X\223\001\377[\231\001\377[\233\001\377X\222\001\377S\212\001\377M\200\002\377U\214" + "\003\377^\226\012\377X\225\005\377Y\232\006\377V\222\001\377\\\225\001\377d\240\001\377" + "_\226\001\377Z\220\001\377X\221\001\377Y\222\001\377[\216\001\377\\\217\002\377^\233" + "\002\377V\225\001\377R\221\001\377T\215\001\377V\220\001\377Z\224\001\377X\222\002\377" + "W\225\001\377^\240\007\377V\224\001\377V\216\001\377^\236\002\377b\243\004\377[\233\003" + "\377X\230\004\377\\\234\011\377V\222\003\377U\216\001\377X\215\001\377[\217\001\377" + "h\240\005\377i\245\005\377]\227\001\377^\230\002\377Z\217\001\377[\221\001\377k\243\011" + "\377e\236\007\377W\223\001\377c\243\014\377[\234\005\377f\244\017\377f\241\015\377" + "b\236\012\377n\251\024\377W\217\001\377V\216\005\377e\237\040\377t\254B\377|\260" + "T\377\230\305y\377\250\317\222\377o\242<\377P\210\002\377^\224\006\377\\\226" + "\006\377Q\221\003\377b\241\024\377a\241\020\377S\224\005\377e\240\030\377l\245\033" + "\377Z\222\001\377]\223\002\377`\232\001\377[\226\002\377P\204\001\377T\211\001\377_\231" + "\001\377^\224\002\377^\224\001\377[\224\002\377Y\217\001\377Z\225\001\377Y\220\001\377" + "Z\221\001\377X\224\001\377R\215\001\377X\231\005\377`\241\012\377S\221\001\377R\214" + "\001\377W\226\001\377[\227\001\377_\237\002\377`\242\002\377W\226\001\377Y\232\002\377" + "g\246\011\377a\237\003\377Z\220\002\377e\236\002\377_\226\001\377X\220\001\377X\223" + "\001\377[\233\001\377Z\233\002\377V\230\002\377Q\220\001\377b\235\015\377m\247\025\377" + "Z\232\004\377U\224\001\377[\234\004\377R\220\001\377R\220\001\377R\225\001\377V\221\001" + "\377M\200\001\377M\205\002\377L\207\001\377N\217\002\377N\217\001\377J\217\002\377P\230" + "\004\377O\227\003\377O\215\001\377E\201\001\377N\205\002\377Q\223\002\377`\242\021\377" + "R\225\002\377T\223\001\377T\215\001\377T\205\001\377^\222\010\377b\226\015\377]\231" + "\014\377]\235\011\377V\223\001\377Z\221\001\377c\233\001\377b\231\002\377`\226\001\377" + "]\225\001\377Y\216\002\377[\213\002\377^\222\001\377b\235\003\377[\223\002\377Y\225\001" + "\377Z\223\002\377]\223\002\377]\222\002\377]\227\002\377[\230\002\377a\243\010\377W" + "\230\002\377R\217\001\377Z\234\003\377h\251\017\377e\245\022\377^\233\017\377`\234" + "\025\377]\230\017\377i\243\032\377d\235\016\377]\224\001\377i\241\002\377i\243\002" + "\377b\233\001\377_\233\002\377X\222\001\377W\223\001\377c\237\017\377h\243\026\377" + "\\\234\014\377`\240\015\377Y\233\003\377^\235\004\377]\231\004\377c\235\007\377f\242" + "\016\377]\232\016\377n\250/\377q\253<\377w\256H\377\177\263Q\377\234\307z\377" + "\244\315\211\377g\241+\377O\216\002\377U\222\003\377S\222\003\377N\217\001\377_\241" + "\020\377Z\235\011\377Q\220\002\377W\226\003\377\\\231\003\377d\236\003\377k\237\001\377" + "f\233\001\377_\225\001\377X\213\002\377]\225\001\377f\236\002\377c\231\001\377`\234\002" + "\377]\234\001\377W\217\001\377V\214\001\377V\223\001\377T\223\001\377T\224\002\377K\203" + "\002\377N\212\001\377_\240\004\377X\222\001\377W\222\001\377Y\225\002\377W\220\001\377" + "Z\227\001\377`\242\003\377^\241\003\377`\241\004\377h\247\007\377c\242\003\377]\231\001" + "\377^\234\001\377S\220\001\377R\216\001\377U\225\001\377Z\231\002\377`\233\002\377[\225" + "\003\377W\213\002\377h\235\016\377e\240\015\377[\233\003\377X\232\003\377\\\235\005\377" + "V\225\002\377S\222\002\377Z\234\001\377b\235\001\377L~\002\377P\205\001\377O\206\002\377" + "Z\223\001\377Y\226\001\377N\210\001\377I\212\001\377R\231\004\377J\213\001\377C}\001\377" + "L\211\001\377V\232\015\377a\242\040\377L\212\001\377N\212\001\377T\217\001\377^\232" + "\003\377a\233\003\377Y\223\001\377T\224\002\377W\232\003\377W\225\001\377\\\225\002\377" + "b\230\001\377e\234\002\377a\226\001\377\\\217\001\377X\214\002\377\\\220\001\377a\232" + "\003\377b\233\002\377[\222\001\377_\233\002\377_\225\001\377`\225\001\377a\225\001\377" + "b\231\001\377\\\227\001\377a\243\005\377`\244\007\377U\224\002\377]\237\003\377b\242" + "\007\377f\246\020\377Z\231\007\377X\225\006\377b\235\022\377w\253.\377\200\263:\377" + "m\244\033\377j\245\002\377g\236\001\377b\232\002\377]\230\001\377X\224\001\377T\220" + "\004\377f\241\034\377b\240\031\377i\250\035\377d\244\021\377Y\230\001\377^\231\001" + "\377]\223\002\377b\231\003\377]\231\005\377^\233\024\377r\253\067\377x\262A\377{" + "\261@\377\202\265I\377\230\305k\377\227\302t\377_\234\026\377P\213\002\377R" + "\213\001\377V\220\002\377W\224\002\377a\241\010\377W\230\003\377N\213\001\377R\221\001" + "\377[\231\001\377c\232\001\377i\240\002\377j\240\001\377[\221\001\377O\202\001\377]\225" + "\001\377c\235\001\377a\230\001\377b\237\003\377_\240\003\377W\216\002\377\\\232\002\377" + "Z\227\001\377U\222\001\377P\216\001\377M\210\002\377Q\207\002\377\\\232\001\377_\233" + "\002\377^\236\001\377Z\224\001\377W\213\002\377[\231\001\377h\246\010\377f\247\014\377" + "W\231\002\377]\237\003\377\\\234\001\377^\233\001\377Z\227\002\377V\225\001\377U\230" + "\001\377Z\233\001\377\\\233\002\377c\240\002\377d\232\004\377^\223\005\377^\226\007\377" + "[\231\004\377]\233\003\377`\237\005\377^\235\003\377^\236\002\377\\\235\002\377_\240" + "\001\377`\230\002\377Ey\002\377H\201\001\377N\210\001\377R\216\001\377Z\231\001\377U\221" + "\001\377N\211\001\377N\221\000\377J\212\001\377G\202\001\377G\212\001\377R\231\012\377" + "X\233\021\377I\202\001\377M\212\001\377O\221\001\377W\227\001\377_\240\001\377]\223" + "\001\377X\223\001\377W\227\001\377X\226\002\377^\231\001\377d\237\001\377i\247\002\377" + "\\\231\001\377W\216\001\377X\220\001\377Z\227\002\377f\246\011\377\\\231\002\377Y\224" + "\002\377]\227\001\377^\222\002\377c\225\001\377e\230\001\377b\227\001\377^\227\001\377" + "b\243\003\377h\252\012\377]\236\001\377^\240\001\377Z\233\001\377]\235\002\377c\244" + "\012\377g\244\020\377b\236\022\377i\243\037\377u\253\060\377}\262\060\377o\251" + "\013\377f\234\002\377`\223\001\377e\235\006\377e\233\021\377q\247\063\377y\261F\377" + "l\245\062\377o\253*\377f\246\024\377Z\231\002\377c\235\001\377a\221\003\377n\243" + "\013\377s\247\034\377g\237\037\377s\253\064\377~\264?\377x\254\065\377\177\263" + ";\377\204\265C\377q\246)\377V\224\000\377W\223\002\377T\216\001\377V\217\001\377" + "\\\227\001\377e\241\005\377W\221\001\377M\200\002\377S\220\002\377]\233\001\377b\226" + "\002\377j\234\002\377i\240\002\377\\\226\001\377R\207\001\377]\230\001\377b\233\002\377" + "_\224\002\377f\240\002\377`\233\002\377[\222\001\377c\232\002\377e\240\001\377V\213\002" + "\377R\212\001\377S\215\001\377[\226\001\377`\237\001\377^\235\001\377Y\233\001\377X\230" + "\001\377U\212\001\377[\227\001\377j\250\007\377b\242\004\377S\215\002\377Y\226\001\377" + "a\242\002\377a\240\001\377X\222\001\377Y\227\001\377^\242\001\377]\234\001\377_\234\002" + "\377c\237\001\377f\237\004\377b\227\005\377a\230\005\377_\232\003\377f\240\004\377m\246" + "\006\377g\242\001\377p\251\005\377l\246\003\377c\232\002\377a\232\001\377p\001\377M\207\001\377H\204\002\377D}\001\377I\210\001" + "\377S\226\001\377N\224\002\377K\222\002\377\\\241\025\377H\217\003\377D\210\001\377" + "U\233\004\377S\223\001\377X\223\001\377W\216\001\377S\216\001\377X\227\002\377\\\233" + "\002\377Z\222\001\377Y\227\002\377V\227\002\377^\237\010\377]\234\002\377l\245\002\377" + "u\256\003\377d\231\002\377\\\217\002\377Y\216\001\377c\237\004\377{\262\026\377j\240" + "\003\377f\225\001\377e\222\002\377i\234\002\377h\240\001\377a\231\002\377]\226\001\377" + "\\\221\001\377\\\223\001\377_\236\002\377c\237\001\377h\244\001\377d\235\002\377^\226" + "\001\377_\234\001\377Z\230\002\377c\243\016\377a\235\017\377o\251\027\377g\241\005\377" + "g\242\001\377l\246\002\377f\235\000\377j\242\013\377p\246'\377v\253A\377\217\300" + "d\377w\261;\377Y\233\001\377e\250\005\377]\236\001\377_\237\003\377p\254\026\377x" + "\263(\377p\255)\377b\236\036\377|\262<\377s\252-\377\\\233\010\377m\253\023" + "\377d\241\005\377\\\231\002\377[\230\001\377Y\231\001\377\\\227\001\377c\231\001\377" + "k\237\001\377p\247\002\377k\243\002\377e\241\002\377^\231\001\377i\243\001\377p\252\002" + "\377o\246\005\377a\233\002\377_\232\001\377b\236\002\377d\236\002\377b\233\001\377s\255" + "\013\377x\261\013\377j\241\002\377a\225\002\377Z\214\002\377_\225\002\377d\236\001\377" + "b\232\001\377b\240\001\377]\232\001\377X\225\002\377c\245\016\377S\223\002\377[\233" + "\002\377[\226\002\377c\237\004\377n\254\010\377a\242\001\377`\226\001\377h\241\001\377" + "v\256\002\377r\247\001\377j\241\001\377e\236\001\377c\234\002\377f\242\001\377f\236\001" + "\377f\234\002\377d\233\001\377a\225\002\377i\240\003\377k\242\003\377z\261\031\377~" + "\263\037\377h\240\003\377j\244\002\377d\235\002\377`\220\001\377i\243\001\377Cu\002\377" + "I\201\001\377F\201\001\377E{\002\377K\206\001\377U\225\001\377R\226\001\377J\221\001\377" + "R\231\011\377H\220\004\377E\212\002\377R\230\002\377V\226\001\377Z\221\001\377O|\001\377" + "P\203\001\377[\223\001\377`\232\001\377^\226\001\377Z\233\002\377R\226\001\377\\\235" + "\014\377c\243\014\377c\240\001\377l\251\001\377c\235\001\377Z\223\001\377X\223\001\377" + "i\246\010\377x\260\017\377j\235\001\377h\224\002\377h\230\001\377h\236\001\377c\231" + "\001\377Z\223\002\377Z\231\001\377[\226\001\377^\230\001\377a\242\003\377]\237\001\377" + "Y\230\001\377Z\225\001\377_\236\002\377c\240\001\377d\240\002\377d\242\007\377\\\231" + "\006\377d\237\012\377q\255\015\377i\243\002\377k\250\002\377f\243\003\377a\236\010\377" + "f\240\037\377s\254>\377\203\271Q\377s\256\062\377\\\235\003\377h\252\012\377a" + "\242\005\377^\236\003\377n\253\027\377\200\273\060\377j\251\027\377\\\235\006\377" + "]\235\010\377]\235\006\377_\231\002\377e\234\001\377i\240\002\377g\235\001\377a\230" + "\002\377\\\221\001\377d\233\001\377n\246\002\377o\243\001\377p\246\002\377h\241\002\377" + "a\232\002\377k\247\003\377r\255\002\377q\251\001\377j\235\002\377k\243\002\377k\242\001" + "\377j\240\001\377h\234\001\377d\234\002\377x\261\015\377w\261\007\377j\240\002\377_" + "\220\002\377Y\212\002\377V\210\002\377e\236\001\377m\250\002\377l\250\001\377f\242\002" + "\377_\236\005\377b\242\011\377\\\235\003\377]\232\002\377Y\220\001\377n\247\013\377" + "r\254\010\377i\245\001\377k\242\001\377l\241\001\377w\254\001\377x\252\001\377v\256" + "\001\377m\243\002\377d\234\002\377e\236\002\377e\234\002\377c\233\002\377`\227\002\377" + "g\236\002\377p\247\003\377h\234\001\377p\250\015\377z\261\032\377d\240\001\377d\236" + "\001\377e\236\002\377a\224\002\377h\242\001\377G|\002\377K\206\004\377K\211\006\377\071" + "m\001\377N\212\002\377]\237\001\377V\235\001\377M\222\001\377O\226\007\377N\226\007\377" + "I\217\001\377V\233\003\377V\221\001\377N\177\001\377Hu\001\377M}\001\377Y\216\001\377h" + "\241\001\377c\233\001\377[\231\002\377U\227\002\377M\215\002\377Y\230\003\377_\235\001" + "\377g\243\001\377b\235\002\377\\\230\001\377X\224\001\377l\251\012\377n\247\005\377" + "j\233\002\377i\227\002\377k\235\002\377g\236\001\377[\216\001\377U\211\001\377[\230\001" + "\377_\233\001\377`\232\002\377a\243\002\377\\\236\002\377Z\237\001\377Z\232\001\377c" + "\243\002\377o\255\004\377i\245\003\377_\235\001\377\\\233\002\377a\241\002\377i\247\004" + "\377d\241\001\377l\250\010\377e\242\011\377a\237\015\377o\251%\377x\261\066\377" + "v\260\066\377x\262.\377^\236\006\377\\\235\002\377c\245\006\377`\240\003\377q\256" + "\030\377w\263\036\377e\244\007\377b\243\002\377Z\226\001\377]\231\002\377c\236\001\377" + "j\242\002\377m\241\001\377k\241\002\377j\236\002\377f\231\001\377h\235\001\377i\240\001" + "\377h\240\002\377g\244\002\377e\244\002\377j\246\005\377n\251\004\377q\251\001\377o\241" + "\002\377p\241\001\377r\253\002\377p\244\001\377p\243\001\377j\235\002\377h\236\002\377" + "t\257\002\377p\250\001\377j\235\001\377d\223\001\377h\227\003\377]\213\002\377Z\212\001" + "\377i\241\002\377m\247\001\377n\246\003\377o\252\011\377`\241\004\377Z\231\001\377^" + "\231\002\377^\231\001\377p\254\015\377g\245\004\377j\244\001\377p\252\001\377r\245\001" + "\377w\254\001\377{\255\001\377y\262\001\377o\256\001\377a\235\002\377b\234\002\377b\236" + "\001\377`\231\001\377`\227\001\377i\240\002\377m\244\002\377h\236\001\377p\254\016\377" + "r\257\021\377`\237\001\377a\231\002\377c\232\002\377d\227\001\377g\240\001\377J\210" + "\001\377]\233\026\377h\243)\377:j\000\377R\207\002\377b\243\002\377_\242\004\377M\222" + "\001\377N\226\004\377Q\230\005\377Q\227\003\377U\232\003\377R\215\001\377K~\002\377M\200" + "\002\377T\213\001\377a\231\002\377g\236\002\377`\224\002\377]\231\001\377Z\232\001\377" + "Q\215\001\377Q\216\001\377\\\231\001\377f\242\001\377b\231\001\377X\217\002\377Y\225" + "\000\377o\252\012\377f\235\003\377d\227\001\377h\233\002\377h\236\001\377d\240\002\377" + "\\\227\001\377Y\225\001\377^\235\001\377a\234\001\377c\235\002\377c\240\002\377^\234" + "\001\377Z\231\001\377\\\237\001\377a\242\001\377n\252\010\377i\245\010\377\\\235\002" + "\377a\242\001\377d\242\001\377a\233\001\377]\232\001\377i\251\017\377a\241\014\377" + "[\234\010\377l\250\030\377{\264+\377v\260&\377t\261\035\377^\236\003\377\\\230" + "\002\377j\254\012\377c\245\006\377j\251\015\377k\253\014\377c\243\004\377g\251\003\377" + "[\230\001\377Z\227\001\377d\245\001\377h\243\001\377j\235\001\377j\240\001\377m\244\002" + "\377j\243\001\377f\237\002\377h\240\002\377k\245\002\377l\251\003\377f\247\001\377d\242" + "\002\377i\242\001\377n\247\001\377i\234\002\377o\243\002\377x\252\002\377r\241\002\377" + "t\247\001\377n\243\001\377l\240\001\377o\253\002\377j\243\001\377f\236\002\377b\231\002" + "\377\177\255\033\377b\222\006\377U\204\001\377d\233\001\377p\252\002\377j\244\001\377" + "l\253\002\377b\240\001\377a\234\002\377d\233\002\377g\241\003\377m\252\010\377_\237" + "\001\377b\237\001\377h\240\002\377r\246\002\377x\247\002\377\206\267\002\377\200\265" + "\001\377r\254\001\377k\251\002\377e\236\001\377a\232\001\377^\227\001\377a\231\001\377" + "j\241\003\377w\255\020\377z\262\025\377r\256\017\377l\254\014\377\\\236\001\377\\" + "\226\001\377b\233\001\377h\237\001\377l\245\001\377J\210\002\377S\225\016\377o\254-" + "\377K\204\004\377S\217\002\377Z\232\001\377^\241\002\377Y\234\001\377X\236\003\377[\242" + "\011\377\\\242\015\377P\230\003\377P\222\001\377P\212\001\377R\214\001\377[\223\001\377" + "g\236\002\377i\235\001\377^\222\003\377]\231\001\377Y\230\001\377U\226\002\377Q\217\002" + "\377U\224\001\377`\236\002\377c\233\001\377]\221\001\377b\241\003\377q\255\021\377_" + "\233\002\377a\230\001\377e\233\002\377d\234\002\377b\240\002\377c\246\002\377d\247\004" + "\377\\\234\001\377^\235\001\377`\235\002\377a\240\002\377^\233\002\377[\230\002\377a" + "\242\001\377^\237\000\377d\243\012\377j\247\025\377j\250\017\377d\244\003\377e\247" + "\001\377^\232\002\377W\223\001\377\\\240\006\377[\236\003\377Z\234\002\377a\241\006\377" + "s\260\026\377y\266\035\377f\245\006\377a\234\001\377a\235\002\377n\255\007\377j\250" + "\010\377j\247\011\377r\260\021\377f\246\005\377a\243\002\377Z\232\001\377f\246\012" + "\377n\253\011\377h\233\002\377l\241\001\377e\235\001\377d\240\001\377c\241\001\377b" + "\234\002\377j\245\001\377j\246\002\377g\243\002\377i\250\002\377k\245\002\377p\251\002" + "\377o\247\001\377m\241\001\377j\235\002\377q\244\002\377r\242\002\377s\246\002\377n\243" + "\001\377h\237\001\377h\243\001\377e\237\001\377`\233\002\377]\231\002\377j\246\016\377" + "`\230\003\377a\227\001\377g\240\001\377m\252\002\377i\246\001\377i\244\001\377e\235\002" + "\377a\227\002\377i\242\001\377q\253\003\377l\251\003\377b\237\001\377d\242\001\377g\240" + "\001\377m\242\001\377r\244\001\377}\257\001\377\207\271\001\377~\256\001\377t\251\001\377" + "k\242\001\377f\236\002\377b\232\001\377f\237\002\377m\245\003\377o\246\011\377z\263" + "\026\377q\256\020\377q\260\022\377_\241\002\377^\234\002\377e\235\002\377m\245\001\377" + "n\241\001\377V\230\010\377]\236\017\377w\261-\377f\244\026\377S\220\001\377V\222" + "\001\377Z\227\001\377`\234\001\377_\235\002\377[\235\002\377`\245\014\377V\232\003\377" + "W\233\002\377\\\237\001\377Y\233\001\377]\230\001\377d\232\002\377f\232\001\377b\230" + "\001\377^\230\001\377[\231\001\377W\226\002\377X\227\001\377Y\221\001\377e\240\002\377" + "g\236\002\377d\237\001\377m\253\014\377l\253\021\377[\233\001\377b\231\001\377l\237" + "\001\377h\236\002\377c\237\001\377g\250\007\377c\245\005\377\\\236\002\377^\241\001\377" + "\\\234\001\377[\232\001\377[\231\001\377^\232\001\377a\243\002\377Z\235\001\377\\\240" + "\011\377U\231\006\377`\241\012\377f\250\007\377d\247\002\377`\242\002\377V\227\002\377" + "U\232\003\377b\246\011\377\\\236\001\377^\236\001\377i\252\005\377i\251\003\377c\243" + "\002\377b\243\001\377d\245\001\377g\250\002\377a\243\002\377`\241\002\377h\251\005\377" + "e\247\002\377_\235\002\377_\237\002\377d\245\005\377e\236\003\377s\251\001\377w\254\002" + "\377j\241\001\377h\247\002\377a\235\001\377c\234\001\377j\246\002\377n\252\004\377j\247" + "\002\377k\245\001\377l\243\002\377s\255\001\377o\241\002\377k\237\002\377l\236\001\377" + "p\245\002\377m\244\001\377l\244\001\377l\243\001\377i\241\001\377h\237\001\377a\225\002" + "\377_\226\002\377]\224\001\377c\234\002\377j\237\001\377l\235\001\377l\240\001\377p\253" + "\001\377k\242\001\377e\227\002\377f\234\001\377b\226\002\377n\247\002\377s\256\002\377" + "m\241\001\377j\240\001\377j\243\002\377i\240\001\377l\242\001\377q\252\001\377t\253\001" + "\377\210\267\001\377\216\274\001\377{\257\002\377l\245\002\377j\246\001\377j\243\002" + "\377n\244\001\377t\251\005\377u\252\005\377l\245\002\377m\252\006\377r\257\021\377h" + "\246\010\377d\241\002\377f\235\001\377o\245\002\377s\244\001\377O\212\003\377W\227\004" + "\377f\243\022\377r\254\036\377V\223\001\377X\223\001\377Z\230\002\377^\223\001\377" + "a\230\001\377\\\232\001\377Z\237\004\377M\221\001\377P\223\001\377^\243\003\377\\\237" + "\001\377\\\233\001\377b\233\001\377d\241\001\377a\237\001\377\\\234\001\377\\\234\001\377" + "[\224\002\377_\233\001\377_\230\001\377k\246\003\377d\242\004\377]\236\002\377g\250\015" + "\377e\247\015\377[\233\002\377c\237\002\377f\233\002\377f\234\002\377d\242\001\377o" + "\253\017\377f\246\012\377]\236\001\377_\240\002\377Y\225\001\377[\231\001\377`\234" + "\001\377c\237\001\377c\240\001\377[\232\001\377X\232\002\377\\\237\003\377`\242\003\377" + "b\243\004\377d\245\005\377f\250\012\377Z\237\003\377W\231\002\377Y\235\002\377[\235" + "\001\377`\240\002\377b\243\001\377c\242\001\377d\244\001\377c\240\001\377g\246\002\377" + "f\247\001\377`\240\001\377^\241\002\377c\245\001\377h\251\002\377n\253\012\377j\252" + "\012\377b\241\002\377g\242\001\377t\261\002\377q\253\002\377l\247\002\377k\251\002\377" + "b\236\002\377b\236\002\377l\253\012\377}\270\034\377k\250\004\377k\246\001\377m\247" + "\002\377q\256\001\377m\241\001\377n\242\001\377o\242\001\377r\245\001\377q\247\002\377" + "n\246\001\377p\252\001\377l\242\001\377g\235\002\377c\234\001\377`\226\001\377c\227\002" + "\377l\234\001\377m\236\001\377i\231\001\377i\236\001\377i\242\001\377i\241\001\377d\230" + "\001\377h\226\002\377l\233\002\377q\244\001\377t\253\001\377o\241\001\377k\241\002\377" + "j\242\001\377j\243\001\377m\251\002\377m\247\002\377n\244\001\377{\256\001\377\203\266" + "\001\377w\254\001\377m\246\002\377o\246\001\377t\247\002\377y\250\001\377\225\266\023" + "\377\235\274\032\377u\252\003\377j\243\001\377w\264\017\377s\261\013\377g\237\002" + "\377l\242\001\377s\251\001\377s\246\001\377R\212\001\377[\227\002\377c\241\010\377l" + "\247\020\377`\235\002\377Z\225\002\377\\\234\001\377[\222\001\377\\\220\001\377`\235" + "\002\377Z\240\002\377J\223\002\377R\227\003\377V\233\002\377X\226\001\377^\223\002\377" + "a\232\001\377`\231\002\377X\222\002\377X\227\001\377[\233\001\377]\235\001\377\\\233" + "\001\377`\235\001\377k\252\003\377b\234\003\377\\\231\001\377_\243\002\377[\234\001\377" + "Y\224\002\377b\234\002\377b\232\001\377a\231\001\377a\236\002\377_\240\004\377d\247\010" + "\377\\\236\001\377_\236\002\377a\237\001\377c\244\001\377c\240\001\377_\233\001\377\\" + "\234\002\377[\236\001\377a\244\005\377b\244\004\377`\232\002\377d\237\000\377p\254\015" + "\377r\255\031\377[\234\004\377[\234\001\377]\235\001\377`\236\001\377`\235\001\377c" + "\240\001\377c\231\001\377f\246\001\377e\243\001\377g\243\001\377j\245\001\377e\240\002" + "\377_\237\002\377d\245\006\377r\262\022\377w\267\032\377c\244\007\377`\240\002\377" + "d\242\002\377p\257\001\377m\247\001\377h\246\001\377h\247\001\377d\242\002\377`\235\001" + "\377m\255\021\377z\272#\377e\247\003\377i\247\001\377j\237\001\377n\250\002\377m\241" + "\001\377l\237\002\377q\243\002\377s\246\001\377s\246\001\377p\242\001\377n\244\001\377" + "g\236\001\377g\243\001\377e\237\001\377b\227\001\377h\234\001\377n\243\001\377m\244\002" + "\377h\234\001\377g\240\002\377g\245\001\377n\251\002\377o\245\001\377o\236\002\377q\240" + "\001\377r\243\002\377u\254\002\377n\241\002\377m\246\001\377r\255\002\377o\252\002\377" + "j\237\001\377j\237\001\377m\242\001\377t\254\001\377z\257\001\377y\256\002\377t\251\001" + "\377o\241\001\377q\241\001\377v\246\001\377~\255\005\377\206\264\014\377k\242\002\377" + "i\243\001\377w\264\013\377p\256\006\377h\235\002\377n\244\002\377s\250\002\377r\244" + "\002\377e\241\002\377\\\232\002\377\\\235\002\377_\240\003\377]\235\001\377]\226\001\377" + "_\234\002\377\\\222\002\377X\215\001\377a\233\002\377^\240\002\377W\230\001\377Y\233" + "\002\377Y\232\001\377\\\227\001\377^\222\002\377d\233\002\377^\225\001\377X\224\002\377" + "X\224\001\377^\241\004\377i\252\014\377Z\233\002\377^\237\001\377k\254\006\377b\236" + "\002\377^\227\001\377`\242\002\377Y\226\001\377\\\221\001\377d\237\001\377f\241\001\377" + "b\231\002\377^\227\001\377Y\227\001\377Y\233\001\377X\225\001\377\\\233\001\377`\236" + "\001\377c\242\001\377a\237\002\377`\235\001\377^\240\001\377Z\233\001\377\\\237\001\377" + "[\231\001\377_\225\002\377a\234\001\377a\236\003\377a\237\005\377Y\232\001\377\\\234" + "\001\377b\240\001\377a\237\001\377f\244\010\377|\265\034\377i\242\002\377g\242\001\377" + "d\234\001\377i\244\001\377g\237\002\377b\240\001\377\\\236\001\377t\262\033\377\206" + "\301*\377l\254\020\377Z\236\002\377Z\235\001\377a\233\002\377k\243\002\377j\241\001" + "\377g\241\001\377c\241\001\377f\247\001\377a\241\002\377j\254\006\377f\251\010\377i" + "\254\004\377k\247\002\377i\235\001\377l\243\002\377h\234\002\377f\232\002\377g\232\002" + "\377g\232\002\377o\244\001\377n\242\001\377k\245\001\377d\237\001\377c\241\002\377b\231" + "\001\377`\224\002\377b\227\001\377k\244\002\377p\253\002\377j\237\002\377j\243\002\377" + "j\241\001\377p\250\001\377u\254\001\377s\246\002\377j\234\002\377h\233\001\377p\250\002" + "\377o\251\001\377m\244\001\377z\265\004\377r\251\001\377n\242\001\377l\241\001\377i\240" + "\001\377l\243\001\377l\237\001\377w\253\001\377w\253\001\377m\237\001\377o\241\001\377" + "o\241\002\377o\246\001\377n\252\001\377j\240\001\377l\244\001\377y\264\005\377y\262\005" + "\377l\242\001\377k\240\001\377n\245\002\377j\235\001\377a\240\001\377`\233\002\377_\237" + "\001\377[\235\001\377X\227\001\377X\222\001\377[\231\001\377[\225\002\377W\213\001\377" + "\\\223\001\377`\236\002\377\\\230\002\377\\\227\001\377Y\227\001\377\\\231\001\377[\226" + "\001\377a\237\001\377a\237\002\377Z\231\001\377X\226\001\377_\236\002\377m\254\015\377" + "^\240\002\377\\\235\001\377k\254\007\377c\240\003\377_\230\000\377b\243\001\377_\237" + "\001\377Z\222\002\377`\227\002\377d\236\002\377e\241\001\377c\235\002\377a\237\001\377" + "_\234\001\377\\\224\001\377_\231\001\377c\241\001\377b\236\002\377`\235\002\377_\237" + "\003\377d\244\017\377_\236\016\377X\231\002\377X\223\001\377\\\231\002\377a\240\001\377" + "[\230\001\377Y\230\001\377\\\234\001\377a\242\001\377b\242\001\377\\\233\002\377j\251" + "\016\377y\261\035\377j\235\000\377o\243\002\377]\221\002\377f\236\002\377g\244\001\377" + "_\237\001\377e\247\012\377\177\275)\377w\266\040\377b\244\011\377Z\236\004\377X" + "\232\002\377^\231\001\377f\236\002\377f\234\001\377f\241\001\377c\242\001\377j\254\004" + "\377h\250\003\377f\247\002\377c\241\001\377g\241\001\377n\250\001\377o\244\002\377r\246" + "\002\377m\237\002\377c\226\001\377c\226\001\377g\236\001\377o\246\001\377o\243\001\377" + "o\241\002\377m\237\002\377t\252\002\377f\230\001\377b\231\001\377a\225\001\377h\240\001" + "\377j\244\002\377q\254\001\377k\244\001\377i\235\002\377q\250\001\377u\257\002\377o\246" + "\001\377c\230\001\377e\233\002\377p\252\001\377n\247\002\377l\244\001\377t\261\002\377" + "p\253\001\377n\251\002\377l\251\003\377e\236\002\377k\244\001\377j\240\001\377u\254\002" + "\377z\256\001\377t\243\002\377m\235\001\377m\241\002\377s\256\001\377o\255\001\377h\235" + "\002\377n\244\001\377u\252\001\377\177\265\003\377q\245\001\377j\235\002\377i\241\001\377" + "f\236\002\377a\240\001\377`\231\001\377b\241\002\377`\240\001\377X\222\002\377W\220\001" + "\377\\\232\001\377[\225\001\377Y\220\001\377]\226\001\377a\232\001\377c\230\001\377a" + "\226\001\377^\222\002\377b\232\002\377`\234\004\377b\241\006\377e\245\007\377Z\226\001" + "\377[\223\001\377_\237\002\377g\247\003\377f\245\001\377a\235\001\377e\246\002\377a\240" + "\002\377a\231\001\377c\245\001\377a\243\002\377R\214\001\377Y\223\002\377`\234\002\377" + "c\244\001\377b\243\003\377_\240\002\377Z\226\002\377`\230\001\377d\231\001\377n\253\003" + "\377m\255\004\377a\243\004\377V\222\007\377Z\203)\377\213\256]\377g\235\"\377O" + "\220\000\377X\224\001\377\\\233\001\377Z\231\001\377Y\226\001\377Z\226\001\377^\234\002" + "\377a\243\001\377j\253\014\377h\247\007\377`\227\001\377m\243\001\377p\243\001\377Y" + "\217\002\377h\236\001\377h\247\002\377]\235\002\377o\257\032\377x\266\040\377j\253" + "\017\377Z\237\004\377X\236\004\377W\231\002\377\\\234\002\377j\250\007\377c\240\001\377" + "g\246\002\377j\252\004\377n\256\007\377l\254\007\377`\237\002\377c\241\001\377i\240\001" + "\377r\252\001\377w\253\001\377t\243\002\377l\234\001\377e\227\002\377a\225\001\377h\246" + "\001\377k\250\001\377l\241\002\377q\243\002\377t\251\002\377o\242\002\377h\234\001\377" + "c\232\002\377^\226\001\377f\245\001\377e\236\001\377s\260\006\377h\243\003\377g\235\002" + "\377o\247\001\377r\254\001\377j\236\002\377a\226\002\377g\236\001\377n\251\001\377l\246" + "\002\377j\247\001\377o\260\003\377i\251\001\377m\254\005\377z\267\020\377g\246\001\377" + "g\243\001\377j\246\001\377n\244\001\377t\247\002\377{\262\001\377u\245\001\377r\245\002" + "\377r\251\001\377m\243\001\377i\240\001\377n\250\001\377r\253\001\377|\264\002\377u\256" + "\002\377m\241\001\377g\235\002\377i\245\001\377X\227\001\377Y\221\002\377`\237\001\377" + "b\240\002\377\\\222\001\377^\230\000\377`\235\001\377^\225\001\377Y\217\002\377_\226" + "\002\377_\230\002\377`\234\003\377a\230\001\377d\233\002\377g\237\004\377`\233\004\377" + "g\245\020\377b\243\011\377[\232\002\377[\221\001\377_\232\001\377j\250\004\377k\253" + "\004\377b\240\001\377b\241\001\377c\241\002\377d\234\002\377m\256\003\377e\244\002\377" + "W\215\001\377[\222\001\377b\235\002\377c\241\001\377f\251\004\377f\246\005\377`\233\001" + "\377f\235\002\377m\243\001\377w\263\001\377n\251\002\377Z\223\001\377a\220\032\377\335" + "\317\305\377\377\362\365\377\373\370\361\377\225\273W\377S\220\000\377V\222" + "\001\377W\225\002\377Y\225\002\377X\217\002\377Z\232\002\377\\\235\007\377{\272(\377" + "d\240\010\377`\226\002\377l\245\002\377p\251\001\377j\236\002\377n\246\001\377j\251" + "\001\377f\245\007\377i\251\022\377h\250\014\377[\233\001\377^\240\001\377`\242\002\377" + "_\236\002\377i\251\010\377m\254\015\377Z\232\001\377]\235\002\377^\236\001\377_\240" + "\001\377i\254\004\377`\241\001\377a\234\002\377g\234\002\377r\250\002\377o\240\002\377" + "o\240\002\377k\234\001\377g\235\002\377h\246\002\377i\253\003\377h\243\001\377n\245\001" + "\377p\246\002\377q\253\001\377j\235\002\377f\236\002\377c\227\002\377b\231\001\377i\245" + "\001\377g\241\001\377n\256\005\377d\244\004\377f\240\002\377n\243\001\377s\246\001\377" + "m\242\001\377f\230\002\377h\233\002\377m\246\001\377m\245\001\377p\256\001\377m\251\002" + "\377m\247\001\377l\250\003\377v\267\014\377e\247\002\377a\243\001\377`\241\002\377c" + "\233\002\377l\244\001\377s\253\001\377r\252\001\377v\254\002\377o\244\001\377j\234\001" + "\377h\241\002\377o\256\001\377t\264\003\377t\261\002\377q\253\002\377l\246\001\377f\235" + "\002\377q\254\010\377[\230\001\377X\220\001\377[\227\001\377^\230\001\377_\225\001\377" + "a\231\001\377c\242\001\377_\232\002\377]\224\001\377\\\225\000\377e\243\010\377g\250" + "\010\377^\224\001\377e\236\002\377a\232\001\377e\237\004\377l\247\012\377c\236\002\377" + "e\235\001\377f\235\002\377i\242\002\377j\246\002\377k\253\003\377f\246\001\377k\252\002" + "\377j\244\001\377m\243\001\377r\255\002\377d\233\002\377Z\217\003\377W\214\001\377n\242" + "\001\377o\251\001\377g\245\001\377d\240\001\377g\234\002\377o\252\002\377t\255\002\377" + "v\256\001\377n\243\001\377Z\224\000\377\243\264}\377\344\326\333\377\366\352\356" + "\377\373\363\366\377\373\362\363\377\257\311\177\377N\210\000\377Y\225\002\377" + "[\227\001\377Y\226\001\377Z\235\001\377f\250\014\377x\264\034\377r\257\017\377d\237" + "\002\377q\254\002\377s\255\002\377k\236\002\377f\233\002\377d\240\001\377f\250\005\377" + "\\\235\002\377`\241\006\377Y\226\001\377_\237\001\377c\240\002\377d\236\001\377h\250" + "\003\377a\241\002\377]\237\003\377\\\236\002\377W\225\001\377_\233\002\377g\247\002\377" + "d\243\001\377[\222\001\377b\227\002\377i\236\002\377c\227\001\377e\232\000\377f\237\000" + "\377p\253\010\377g\250\003\377g\244\001\377l\243\001\377l\243\002\377o\254\001\377k" + "\251\001\377e\235\002\377d\241\001\377b\240\002\377a\234\002\377j\246\001\377i\237\001" + "\377m\250\001\377h\243\001\377j\243\002\377n\242\001\377p\244\001\377s\251\001\377l\237" + "\001\377m\241\001\377p\245\002\377r\247\001\377w\263\001\377s\250\001\377q\247\002\377" + "o\246\001\377v\267\006\377f\247\003\377]\240\001\377[\241\002\377\\\233\001\377l\246" + "\001\377s\253\002\377s\255\002\377q\254\003\377j\246\003\377c\235\002\377d\242\001\377" + "g\250\002\377k\251\003\377k\245\003\377t\255\011\377s\253\014\377l\247\013\377u\260" + "\021\377b\234\001\377`\234\001\377^\227\002\377a\231\002\377f\241\001\377f\237\001\377" + "i\243\001\377a\227\001\377X\217\000\377e\243\021\377~\271/\377a\233\001\377^\222\002" + "\377a\231\001\377g\235\003\377q\244\007\377m\241\002\377k\236\002\377m\232\001\377n\236" + "\001\377i\233\002\377_\222\001\377_\232\002\377d\246\002\377o\255\004\377r\252\001\377" + "}\261\001\377y\254\002\377^\223\002\377X\216\002\377T\212\002\377u\246\002\377w\255\002" + "\377e\237\001\377e\240\002\377i\237\002\377p\252\001\377h\234\002\377o\244\002\377l\242" + "\001\377V\222\000\377\331\320\317\377\324\303\313\377\341\317\331\377\363\345" + "\354\377\353\332\332\377\364\355\351\377y\251\061\377V\231\000\377W\221\001\377" + "_\236\004\377n\257\023\377p\257\023\377l\254\014\377p\260\013\377j\251\002\377p\252" + "\002\377s\245\001\377l\237\001\377b\226\001\377f\243\001\377j\254\003\377\\\236\001\377" + "Z\234\002\377Y\232\001\377]\234\001\377f\242\001\377e\234\001\377d\244\002\377`\243\002" + "\377_\243\005\377V\234\001\377T\220\002\377f\243\001\377k\250\001\377g\247\001\377]\224" + "\001\377_\227\000\377t\246\027\377\223\272G\377\242\277b\377u\215\071\377^\234" + "\011\377^\237\001\377f\240\002\377m\250\001\377m\252\001\377h\247\002\377d\245\001\377" + "c\243\001\377b\244\001\377]\234\001\377b\244\001\377e\244\002\377g\235\002\377p\251\001" + "\377m\244\001\377l\246\001\377j\237\002\377o\244\001\377t\255\001\377q\250\001\377q\252" + "\001\377p\244\002\377t\253\002\377y\263\002\377y\263\001\377u\253\001\377r\245\002\377" + "r\255\001\377h\240\001\377c\242\001\377e\247\004\377a\234\002\377q\252\002\377v\245\002" + "\377z\260\001\377n\254\004\377m\257\011\377d\243\001\377g\247\001\377g\245\001\377i" + "\245\001\377j\242\004\377~\263\032\377\203\263\040\377\202\264\037\377s\254\013\377" + "g\232\002\377n\245\007\377`\226\002\377`\224\002\377f\242\001\377f\240\001\377g\243\002" + "\377f\236\001\377f\240\003\377\205\274\071\377\200\270\066\377d\233\002\377b\230" + "\002\377`\226\002\377d\233\001\377z\260\015\377m\241\003\377g\226\001\377k\231\002\377" + "n\234\001\377j\234\001\377e\231\001\377`\225\001\377c\240\002\377e\243\002\377h\237\002" + "\377\210\267\001\377y\251\001\377_\225\002\377^\225\001\377X\214\001\377v\247\002\377" + "y\256\001\377e\232\002\377f\233\002\377m\240\002\377l\237\001\377]\221\002\377t\251\001" + "\377t\257\000\377k\233\034\377\326\301\315\377\313\267\301\377\347\331\343\377" + "\367\356\364\377\362\345\352\377\354\332\332\377\357\354\326\377W\221\011" + "\377Q\221\000\377c\244\011\377q\260\030\377e\246\006\377_\240\002\377[\225\002\377" + "d\244\001\377n\247\002\377u\251\001\377u\247\002\377k\236\002\377n\252\002\377l\251\002" + "\377Z\231\002\377T\225\002\377[\234\004\377a\236\003\377f\244\001\377f\240\001\377e\247" + "\002\377^\237\002\377Y\230\001\377U\221\001\377Y\225\002\377d\243\002\377d\241\002\377" + "b\240\002\377X\225\000\377\253\306s\377\363\357\336\377\353\335\332\377\345\326" + "\322\377\311\273\261\377e\212\"\377^\237\000\377d\240\001\377m\250\001\377l\246" + "\001\377b\232\002\377^\226\001\377^\236\001\377k\255\010\377o\257\007\377d\245\000\377" + "c\240\002\377g\234\002\377r\254\002\377k\243\002\377i\243\001\377e\234\001\377l\244\001" + "\377t\260\001\377v\257\001\377v\253\002\377o\240\002\377u\247\002\377z\262\001\377|\262" + "\001\377z\255\002\377r\243\003\377t\250\001\377n\243\002\377j\243\002\377p\254\003\377" + "l\245\001\377v\257\004\377q\245\001\377u\255\002\377t\263\007\377i\252\002\377e\245\002" + "\377o\254\001\377q\252\001\377o\247\002\377l\241\002\377{\257\014\377\204\263\027\377" + "\201\261\022\377r\252\004\377m\245\001\377f\236\002\377b\236\002\377d\236\002\377j\246" + "\002\377i\242\001\377i\242\001\377e\237\002\377t\255\030\377\220\304E\377u\254\032" + "\377g\233\001\377f\226\001\377f\225\001\377f\226\001\377p\252\001\377m\247\002\377c\230" + "\002\377d\232\001\377j\241\002\377g\233\002\377e\236\002\377d\236\001\377e\241\001\377" + "f\241\001\377d\227\002\377\201\261\002\377y\252\002\377g\233\001\377b\232\002\377c\230" + "\001\377u\250\002\377|\260\001\377j\236\002\377g\233\002\377i\235\002\377k\236\001\377" + "e\231\002\377{\256\001\377\203\273\014\377\230\262`\377\317\266\304\377\271\236" + "\252\377\350\332\344\377\360\342\353\377\341\316\325\377\335\307\307\377" + "\334\304\303\377\326\340\261\377`\236\020\377n\255\035\377x\267$\377e\244\004" + "\377a\233\001\377[\220\002\377e\235\001\377n\244\001\377q\245\002\377r\243\001\377t\254" + "\002\377s\253\001\377s\247\001\377d\234\001\377P\221\002\377m\251\003\377l\244\002\377" + "d\234\001\377e\244\003\377f\247\003\377`\240\002\377\\\222\002\377\\\225\002\377^\234" + "\002\377_\241\003\377X\227\000\377s\242\026\377\336\343\246\377\352\326\322\377" + "\335\306\276\377\330\303\273\377\314\271\260\377\330\311\306\377\236\245" + "r\377[\234\000\377g\250\002\377e\243\001\377d\234\001\377b\231\001\377_\230\001\377^" + "\224\001\377b\232\001\377l\251\004\377n\255\003\377h\242\001\377n\243\001\377w\261\001" + "\377m\241\002\377k\242\002\377e\233\001\377m\251\002\377u\260\002\377v\254\002\377u\250" + "\001\377q\243\002\377w\250\002\377}\264\002\377~\262\001\377z\255\001\377n\240\001\377" + "o\247\002\377n\245\002\377j\242\002\377n\252\002\377s\257\007\377n\250\003\377l\244\002" + "\377p\253\001\377s\260\003\377n\256\001\377l\246\001\377n\251\002\377t\256\001\377p\251" + "\001\377o\246\002\377|\262\014\377w\255\010\377m\246\001\377k\245\001\377h\243\002\377" + "e\243\001\377c\235\001\377f\236\001\377x\263\006\377n\242\002\377l\240\001\377d\234\001" + "\377d\231\014\377\212\301B\377l\253\020\377h\244\004\377i\240\002\377l\241\002\377" + "g\230\001\377r\253\001\377l\246\001\377h\247\002\377e\241\001\377o\250\004\377e\234\002" + "\377o\251\011\377s\256\017\377k\251\003\377h\240\001\377k\234\001\377\202\262\002\377" + "s\242\002\377h\234\001\377g\245\002\377j\250\002\377p\252\001\377x\260\002\377r\246\001" + "\377]\225\002\377g\235\003\377f\232\003\377q\244\002\377q\246\001\377i\245\000\377\245" + "\263z\377\321\275\307\377\323\277\313\377\360\345\357\377\362\347\360\377" + "\357\345\352\377\342\314\320\377\341\314\314\377\346\315\303\377\231\272" + "T\377i\246\014\377g\245\005\377_\224\002\377`\227\001\377d\230\001\377i\234\002\377" + "p\243\002\377o\241\002\377o\243\002\377s\255\001\377r\251\001\377q\245\002\377j\236\002" + "\377T\223\002\377v\255\002\377j\242\001\377e\241\002\377i\246\004\377f\242\001\377f\236" + "\002\377d\227\001\377g\235\001\377d\241\002\377]\234\002\377{\254\060\377\365\362\337" + "\377\332\305\277\377\317\265\260\377\330\302\275\377\322\274\272\377\311" + "\262\255\377\301\257\251\377\276\264\242\377U\223\002\377]\236\002\377a\237\002" + "\377c\234\002\377a\234\002\377a\236\002\377`\225\002\377c\237\001\377c\236\001\377g\244" + "\001\377l\243\002\377s\251\001\377{\263\001\377n\240\002\377m\241\001\377j\241\001\377" + "k\242\002\377o\251\001\377o\247\001\377k\243\002\377j\240\001\377p\251\001\377y\262\001" + "\377x\262\001\377x\262\001\377k\237\002\377j\242\001\377j\240\001\377j\243\002\377j\243" + "\002\377m\247\001\377k\242\002\377o\242\001\377s\252\002\377t\244\002\377t\255\002\377" + "u\257\001\377k\242\001\377m\247\001\377i\242\001\377l\245\001\377s\255\005\377f\241\001" + "\377e\243\001\377i\247\001\377g\243\001\377e\243\002\377d\232\001\377o\247\005\377u\261" + "\011\377n\250\001\377n\244\001\377l\242\001\377a\226\002\377u\260\021\377d\245\005\377" + "_\241\003\377k\252\022\377n\252\021\377k\243\005\377o\246\001\377t\252\002\377p\251" + "\001\377k\243\001\377m\244\002\377k\233\002\377j\235\002\377i\235\002\377q\253\003\377" + "y\257\001\377\177\255\001\377\207\264\001\377o\235\002\377e\231\002\377_\222\001\377" + "b\234\001\377m\252\001\377u\257\002\377j\234\002\377_\223\001\377n\242\001\377j\237\001" + "\377k\242\001\377c\227\002\377_\234\000\377\262\272\213\377\303\254\266\377\324" + "\277\312\377\336\316\333\377\372\365\371\377\355\341\351\377\344\321\331" + "\377\335\304\310\377\327\277\277\377\347\324\276\377t\247\025\377[\220\001\377" + "W\216\000\377a\233\000\377e\234\000\377k\241\000\377p\246\000\377n\243\001\377n\250\001" + "\377l\246\002\377n\246\002\377h\235\002\377d\236\001\377_\233\002\377z\260\001\377h\241" + "\002\377k\251\006\377x\261\031\377i\245\006\377i\246\003\377b\231\001\377c\235\002\377" + "^\233\000\377\217\265?\377\356\344\327\377\323\273\265\377\313\257\246\377" + "\341\315\315\377\334\313\315\377\307\263\265\377\266\240\235\377\272\244" + "\236\377\313\273\261\377Y\226\011\377_\237\003\377a\232\002\377_\226\001\377]\225" + "\002\377b\241\002\377c\237\001\377e\243\001\377c\234\002\377i\240\001\377k\236\002\377" + "{\255\002\377\201\263\001\377q\243\002\377q\250\002\377m\245\001\377l\240\001\377n\245" + "\001\377p\250\001\377h\235\002\377i\240\002\377q\254\002\377|\264\002\377}\263\002\377" + "z\263\001\377n\246\001\377m\245\001\377l\250\000\377h\245\000\377o\247\011\377\203\266" + "\035\377|\260\023\377n\241\001\377v\254\001\377x\247\002\377}\256\001\377|\257\001\377" + "s\246\002\377t\256\001\377n\245\001\377m\243\001\377j\243\001\377e\234\002\377e\237\002" + "\377j\243\001\377q\251\002\377c\236\001\377c\237\001\377k\251\004\377d\242\002\377o\255" + "\005\377o\250\002\377p\245\001\377o\243\003\377x\263\012\377g\241\000\377e\246\006\377" + "_\240\023\377d\243\024\377g\241\007\377w\255\005\377{\256\001\377z\261\001\377v\257" + "\003\377s\254\006\377o\243\005\377k\237\002\377h\234\001\377t\253\003\377\200\265\002\377" + "\211\264\001\377\214\263\002\377w\245\001\377k\242\002\377c\227\001\377_\227\001\377" + "i\247\001\377p\254\001\377d\225\002\377f\230\002\377o\241\002\377p\247\001\377h\235\002" + "\377a\230\001\377U\216\000\377\275\301\232\377\305\247\252\377\303\242\243\377" + "\347\325\335\377\364\352\362\377\364\347\357\377\346\323\334\377\312\257" + "\264\377\340\313\315\377\316\265\261\377\316\316\230\377Z\214\022\377a\225" + "\035\377`\222\"\377`\217&\377m\235\060\377p\242%\377e\235\016\377f\240\012\377" + "h\243\010\377c\234\004\377a\223\001\377d\237\001\377e\237\003\377x\261\005\377f\234" + "\000\377y\261\040\377r\257\040\377o\257\025\377f\247\005\377e\242\001\377e\235\001\377" + "\226\273G\377\354\336\316\377\304\251\245\377\342\311\310\377\327\301\277" + "\377\333\310\312\377\327\310\316\377\313\275\302\377\277\256\257\377\271" + "\246\242\377\320\276\270\377c\232\013\377d\241\001\377c\227\001\377c\226\002\377" + "h\241\001\377e\236\001\377o\256\010\377c\240\001\377a\231\001\377g\242\002\377j\235" + "\002\377}\257\001\377\201\263\001\377w\252\002\377q\246\001\377n\246\002\377l\240\002\377" + "r\247\001\377r\252\001\377f\232\002\377g\241\002\377v\260\001\377~\261\002\377{\252\001" + "\377|\257\001\377u\252\001\377v\263\010\377t\256\014\377x\263\031\377\211\300\063" + "\377\205\273+\377~\266\032\377r\254\002\377w\261\001\377|\262\002\377{\255\002\377" + "v\250\002\377p\237\001\377y\253\002\377z\252\002\377n\236\001\377l\237\001\377j\241\001" + "\377l\243\001\377n\241\002\377p\250\002\377g\235\002\377j\244\004\377m\250\006\377`\232" + "\001\377l\251\006\377r\251\001\377{\256\001\377p\241\001\377t\253\004\377o\241\001\377" + "m\246\003\377g\245\030\377Y\230\013\377l\246\027\377\211\273%\377\204\267\015\377" + "}\262\002\377}\266\012\377z\264\024\377v\260\031\377t\255\026\377\205\274'\377" + "\205\275\035\377t\246\001\377\201\255\001\377\221\271\001\377o\237\002\377f\231\002" + "\377i\242\001\377d\240\002\377d\243\002\377n\254\002\377j\235\001\377j\231\002\377r\241" + "\002\377s\245\001\377i\235\001\377a\230\002\377S\214\000\377\321\316\265\377\316\260" + "\263\377\332\277\306\377\366\352\362\377\373\367\372\377\365\355\362\377" + "\354\337\345\377\337\311\315\377\317\266\267\377\302\252\244\377\324\271" + "\253\377\270\266\232\377emd\377aff\377^bg\377_ej\377gpo\377o\200l\377s\216" + "b\377n\217M\377w\240G\377f\226(\377`\225\030\377b\225\021\377v\254\017\377k" + "\240\012\377o\246\031\377k\247\030\377h\244\017\377a\233\001\377i\244\000\377\272" + "\321u\377\331\304\264\377\301\241\227\377\302\242\232\377\337\313\310\377" + "\336\314\316\377\333\313\321\377\341\324\335\377\312\275\310\377\273\254" + "\265\377\274\251\253\377\310\266\262\377^\227\014\377c\236\002\377b\226\001\377" + "l\242\002\377r\253\001\377l\246\001\377j\252\004\377c\246\002\377`\230\001\377i\243\002" + "\377m\237\001\377\200\262\001\377w\247\002\377r\246\002\377p\247\001\377o\244\001\377" + "o\241\002\377v\256\002\377x\261\001\377e\233\002\377g\236\001\377u\251\002\377\200\263" + "\002\377z\252\001\377\206\272\016\377\203\271\031\377\211\301-\377\200\274-\377" + "o\256\027\377k\250\012\377p\255\004\377o\246\003\377m\241\001\377p\245\001\377q\246" + "\002\377r\253\002\377p\253\002\377m\236\001\377~\260\001\377|\251\001\377p\234\001\377" + "u\250\001\377s\250\001\377q\245\001\377u\252\000\377f\232\001\377r\251\006\377o\247\004" + "\377j\241\002\377g\237\001\377i\242\003\377q\250\002\377\205\265\001\377|\256\001\377" + "o\246\002\377i\237\001\377i\243\002\377m\252\035\377d\242\040\377o\254*\377l\250" + "\027\377\203\265\017\377\204\265\005\377z\255\002\377s\253\006\377v\261\027\377|\266" + "!\377~\267\040\377|\267\025\377s\250\000\377x\246\001\377\206\262\002\377z\252\002" + "\377i\234\001\377q\253\001\377l\246\001\377k\245\002\377o\252\001\377r\253\001\377o\240" + "\001\377u\250\001\377n\240\001\377j\234\002\377e\235\002\377Y\212\000\377\321\311\261" + "\377\321\266\271\377\327\277\307\377\347\325\337\377\345\323\336\377\336" + "\314\326\377\341\317\327\377\314\271\274\377\271\241\240\377\301\251\250" + "\377\212gf\377\306\250\226\377xei\377~ow\377XI\\\377XKa\377[Ne\377XLd\377" + "i`r\377tn}\377}{\206\377\201\206\210\377z\205x\377x\212d\377p\222C\377n\226" + "?\377f\225,\377l\236.\377d\227\034\377d\226\016\377\271\314q\377\301\254\237" + "\377\251\215\213\377\313\261\254\377\330\304\300\377\341\320\320\377\362" + "\350\353\377\324\306\316\377\346\332\343\377\311\274\306\377\275\251\262" + "\377\271\243\243\377\330\302\274\377i\237\022\377i\240\001\377o\241\002\377y\257" + "\001\377n\241\002\377a\227\001\377c\244\001\377g\251\003\377e\235\002\377p\246\001\377" + "t\245\002\377\202\263\001\377c\227\002\377f\235\001\377j\245\001\377m\245\002\377o\244" + "\001\377z\265\006\377x\262\003\377p\247\002\377p\243\001\377w\252\001\377|\264\000\377" + "\202\273\015\377\202\271\027\377v\261\016\377w\261\015\377]\225\000\377c\240\001" + "\377i\240\001\377q\244\001\377r\242\002\377x\251\002\377q\240\002\377p\241\001\377l\242" + "\002\377n\244\001\377y\253\001\377\201\262\001\377r\240\001\377s\241\002\377v\247\001\377" + "q\244\002\377q\246\002\377\201\271\012\377_\222\002\377l\246\004\377l\245\001\377m\241" + "\001\377q\251\001\377h\232\001\377s\250\002\377\177\260\001\377\201\263\004\377z\256" + "\020\377n\244\014\377g\237\003\377l\246\022\377p\254$\377i\247\034\377c\242\005\377" + "n\247\002\377z\253\002\377\200\260\002\377z\255\002\377u\257\006\377y\262\021\377\202" + "\273\036\377t\257\013\377u\254\002\377z\252\001\377z\247\002\377\202\261\001\377y\251" + "\002\377v\247\001\377t\250\001\377v\243\002\377\177\257\001\377v\251\001\377u\257\001\377" + "l\245\001\377h\235\002\377c\226\002\377d\231\001\377[\216\000\377\332\325\272\377\342" + "\307\311\377\335\302\307\377\361\345\354\377\375\375\374\377\367\354\363" + "\377\357\336\347\377\333\306\312\377\312\260\261\377\262\225\223\377\312" + "\260\252\377\317\264\254\377\307\256\254\377\332\306\306\377\321\277\304" + "\377\324\312\321\377\260\237\257\377wf\177\377\200m\211\377\233\215\242\377" + "\212|\222\377\207v\215\377\201r\206\377\226\207\220\377zoz\377e`h\377ggh" + "\377t|r\377\216\227\200\377\313\320\253\377\330\300\271\377\254\214\210\377" + "\312\260\254\377\330\303\277\377\323\272\272\377\357\337\343\377\332\311" + "\321\377\360\344\355\377\343\330\345\377\311\274\311\377\302\257\267\377" + "\305\260\257\377\320\277\264\377^\232\002\377m\243\001\377x\253\002\377z\252\002" + "\377m\235\002\377h\240\001\377f\246\001\377d\241\002\377j\250\001\377s\253\001\377x\252" + "\001\377~\255\002\377`\223\002\377a\225\001\377d\244\001\377l\252\001\377p\252\001\377" + "t\257\002\377q\247\001\377v\256\002\377v\250\001\377\200\267\002\377\201\270\002\377" + "\201\271\006\377s\251\002\377q\251\002\377\200\271\013\377e\232\001\377f\233\001\377" + "l\243\001\377i\231\002\377o\240\002\377|\255\002\377y\246\002\377r\237\002\377n\236\001" + "\377u\250\001\377{\260\002\377z\250\001\377w\241\002\377{\251\001\377w\250\001\377s\247" + "\001\377y\260\001\377\202\271\005\377_\223\002\377i\243\002\377p\251\003\377n\237\001\377" + "p\247\001\377l\236\001\377r\244\002\377x\252\001\377\177\261\003\377\210\267\027\377" + "\221\276\060\377m\243\006\377j\243\003\377w\260\030\377d\243\015\377l\253\017\377" + "s\255\006\377r\243\002\377v\253\001\377}\266\014\377k\247\005\377s\255\023\377\204" + "\274(\377l\240\012\377q\240\002\377~\255\001\377{\250\002\377x\245\001\377\177\261" + "\001\377y\250\002\377x\245\002\377|\247\002\377\204\260\001\377t\243\002\377p\247\002\377" + "l\247\001\377d\236\002\377Y\215\001\377]\216\001\377X\217\000\377\326\320\262\377\343" + "\303\302\377\354\321\325\377\341\321\333\377\363\353\360\377\353\335\344" + "\377\360\335\337\377\340\312\307\377\337\310\304\377\347\317\312\377\353" + "\326\323\377\345\323\321\377\360\341\346\377\361\347\354\377\365\360\363" + "\377\366\356\363\377\344\327\341\377\340\322\334\377\346\332\343\377\370" + "\361\365\377\360\351\355\377\336\322\333\377\303\256\267\377\322\276\275" + "\377\312\262\255\377\271\233\220\377\260\223\214\377\232\202\177\377\263" + "\235\226\377\301\241\220\377\215oh\377\272\233\226\377\307\256\252\377\333" + "\310\310\377\347\327\333\377\364\352\360\377\327\307\321\377\337\320\332" + "\377\325\310\326\377\303\263\300\377\277\251\260\377\305\253\252\377\310" + "\274\253\377_\240\000\377h\241\001\377k\232\002\377z\251\002\377t\245\001\377n\244" + "\001\377g\241\001\377f\236\001\377m\246\001\377u\254\002\377|\254\002\377w\247\001\377" + "[\216\002\377^\223\001\377k\250\003\377u\264\004\377r\250\001\377t\252\001\377t\251\001" + "\377u\256\001\377u\252\001\377{\260\001\377~\257\001\377\204\264\001\377\203\263\002" + "\377\200\263\002\377|\264\003\377a\223\002\377j\242\002\377k\245\002\377m\244\001\377" + "w\255\001\377t\245\002\377u\242\002\377w\246\002\377w\247\001\377v\254\001\377o\242\001" + "\377r\244\002\377\216\271\016\377\210\264\011\377{\255\002\377\177\267\002\377\201" + "\270\002\377~\261\002\377b\237\001\377c\233\002\377h\243\002\377o\252\004\377p\250\001" + "\377o\246\002\377q\251\003\377t\245\001\377~\256\001\377\207\265\020\377\226\277." + "\377l\240\003\377o\246\003\377t\255\007\377f\244\005\377r\257\022\377m\243\003\377|" + "\257\002\377w\255\001\377m\247\003\377\213\270\064\377p\251\033\377\200\271)\377" + "d\231\003\377k\235\002\377r\251\002\377r\251\002\377o\243\001\377u\253\000\377x\257\001" + "\377v\255\001\377w\256\001\377u\254\002\377m\241\001\377n\237\001\377r\255\002\377`\226" + "\002\377Y\214\002\377_\220\002\377[\220\000\377\305\307\223\377\344\277\273\377\352" + "\313\312\377\337\312\322\377\356\341\351\377\354\336\340\377\362\337\334" + "\377\362\343\337\377\367\356\355\377\342\316\317\377\277\245\247\377\344" + "\320\324\377\365\356\360\377\271\244\260\377\364\355\360\377\324\300\314" + "\377\342\322\334\377\360\346\354\377\357\345\352\377\305\263\272\377\352" + "\340\344\377\353\336\341\377\314\262\262\377\334\305\301\377\347\323\315" + "\377\342\313\302\377\334\300\263\377\343\303\257\377\333\274\243\377\303" + "\242\212\377\312\254\232\377\306\251\237\377\277\244\236\377\354\331\332" + "\377\332\305\314\377\356\342\352\377\332\311\323\377\320\276\311\377\306" + "\266\302\377\276\254\265\377\302\252\256\377\321\270\263\377\267\270\214" + "\377b\244\000\377i\243\001\377j\232\001\377|\255\002\377w\253\002\377l\235\001\377h\231" + "\002\377i\235\001\377l\237\001\377u\251\002\377{\256\001\377k\233\002\377Z\216\001\377" + "m\250\010\377x\266\014\377p\252\002\377r\246\002\377s\247\002\377v\260\002\377}\270" + "\013\377u\253\002\377{\256\001\377|\255\002\377z\246\002\377\203\261\002\377\216\275" + "\002\377u\260\002\377c\225\002\377l\245\001\377q\255\002\377o\247\001\377x\264\002\377" + "j\240\001\377k\235\002\377m\236\002\377t\251\001\377s\254\002\377n\245\001\377o\243\001" + "\377\221\302\036\377\203\266\011\377\202\267\003\377\202\272\004\377|\260\001\377" + "|\254\002\377g\243\002\377h\241\002\377e\236\001\377\200\270\016\377w\257\004\377o\247" + "\002\377q\250\002\377r\246\001\377|\253\002\377\211\267\016\377\177\255\013\377p\242" + "\003\377k\242\001\377i\243\002\377k\251\005\377j\250\005\377k\243\003\377u\254\001\377" + "r\246\001\377\204\256\022\377\260\277]\377q\250\"\377\202\271/\377n\246\006\377" + "o\245\001\377o\245\001\377u\254\012\377z\261\025\377r\254\015\377l\251\006\377k\247" + "\002\377u\262\011\377o\255\006\377i\244\001\377l\245\001\377l\245\002\377g\240\001\377" + "c\227\001\377^\217\002\377V\215\000\377\255\271x\377\340\270\262\377\337\275\266" + "\377\360\334\334\377\360\340\342\377\361\342\341\377\340\313\315\377\355" + "\340\341\377\370\360\360\377\272\230\234\377\311\255\261\377\367\355\356" + "\377\334\310\312\377\344\323\331\377\345\330\336\377\320\276\311\377\352" + "\334\345\377\330\307\315\377\261\233\243\377\317\276\276\377\375\373\373" + "\377\336\314\316\377\221wx\377\317\272\264\377\347\333\327\377\353\333\327" + "\377\353\326\314\377\336\303\261\377\344\304\254\377\351\314\262\377\357" + "\327\302\377\325\273\254\377\332\304\274\377\346\324\325\377\326\302\312" + "\377\353\335\350\377\350\334\345\377\275\254\270\377\276\255\273\377\274" + "\250\263\377\317\267\271\377\340\304\303\377\235\261_\377a\237\000\377f\233" + "\002\377u\251\002\377\204\265\002\377o\237\001\377l\236\001\377i\232\001\377k\241\002\377" + "o\244\001\377p\246\001\377p\246\001\377i\231\001\377l\242\006\377y\264\022\377p\254" + "\003\377q\255\001\377o\245\001\377q\253\001\377u\262\004\377m\246\002\377n\245\001\377" + "z\257\001\377w\246\002\377i\223\002\377|\255\001\377\206\272\003\377\200\272\023\377" + "h\234\000\377k\242\002\377w\262\002\377\201\271\001\377o\252\002\377q\260\014\377i\241" + "\002\377o\243\001\377s\247\001\377t\254\001\377p\243\001\377v\246\001\377\212\275\004\377" + "\206\272\003\377\177\264\001\377|\257\001\377w\245\002\377u\247\001\377b\235\002\377" + "e\237\002\377d\231\002\377\200\267\022\377z\260\011\377i\237\001\377k\244\002\377s" + "\253\003\377u\251\001\377~\261\005\377q\247\001\377g\235\001\377h\235\002\377e\231\001" + "\377j\246\004\377g\245\005\377f\245\010\377g\244\005\377c\231\001\377\241\263,\377" + "z\244\036\377e\241\016\377u\260\027\377w\254\010\377w\244\001\377\204\264\021\377" + "\213\272%\377\203\265\032\377i\242\005\377Z\224\001\377b\233\001\377r\253\001\377" + "s\247\001\377l\240\001\377h\243\001\377d\234\002\377f\241\001\377f\236\005\377\\\216" + "\006\377W\205\023\377\224\243p\377\352\310\312\377\312\245\250\377\356\330\330" + "\377\355\334\332\377\332\312\307\377\307\263\261\377\370\362\362\377\320" + "\272\266\377\247zr\377\365\341\335\377\344\315\313\377\335\311\311\377\343" + "\326\334\377\345\327\340\377\351\333\343\377\360\346\354\377\355\343\350" + "\377\336\317\320\377\374\361\357\377\374\367\365\377\334\307\277\377\207" + "g[\377\303\246\233\377\367\360\355\377\333\312\305\377\311\262\254\377\331" + "\301\267\377\342\310\267\377\316\261\236\377\341\305\261\377\363\346\327" + "\377\356\340\327\377\356\341\336\377\345\325\330\377\342\323\334\377\325" + "\306\324\377\267\245\265\377\274\251\271\377\277\255\272\377\337\306\304" + "\377\347\315\306\377p\236\026\377e\234\000\377j\241\001\377{\262\001\377\200\264" + "\001\377t\245\002\377o\242\002\377k\243\001\377q\256\002\377p\256\001\377m\247\001\377" + "p\251\001\377q\246\002\377\202\264\011\377m\241\004\377m\246\001\377m\252\002\377g\242" + "\002\377k\247\002\377k\250\002\377d\234\002\377t\253\003\377\177\264\002\377w\247\001\377" + "p\240\001\377z\257\002\377y\256\001\377\177\270\010\377r\244\002\377|\256\001\377\206" + "\273\002\377\203\263\000\377q\246\002\377u\261\011\377k\247\001\377p\251\001\377t\247" + "\001\377u\254\001\377z\253\001\377\205\271\001\377\205\272\002\377~\263\001\377|\260" + "\001\377}\260\002\377r\243\001\377s\247\002\377_\236\004\377c\232\001\377l\243\001\377" + "u\254\006\377~\265\024\377b\232\002\377e\237\001\377m\253\007\377r\255\005\377y\263" + "\011\377i\242\002\377e\235\003\377d\232\002\377i\235\001\377q\252\006\377k\246\004\377" + "b\236\002\377k\245\013\377h\234\002\377\213\247\015\377e\227\000\377c\232\002\377h" + "\241\003\377v\255\007\377u\252\002\377x\256\011\377k\240\002\377~\261\001\377t\247\001" + "\377]\226\001\377b\232\001\377m\247\001\377u\251\001\377v\253\001\377n\245\001\377c\235" + "\002\377g\244\024\377i\234*\377b\220\063\377r\212b\377\200\203~\377\340\303\304" + "\377\347\325\324\377\371\363\363\377\366\356\357\377\352\331\336\377\365" + "\353\354\377\376\373\372\377\344\323\313\377\252\200i\377\354\322\310\377" + "\340\310\305\377\341\315\317\377\353\336\345\377\341\322\334\377\350\333" + "\343\377\346\330\340\377\332\311\322\377\323\277\301\377\332\302\277\377" + "\361\335\321\377\341\307\265\377\204V;\377\330\275\252\377\375\375\375\377" + "\354\340\334\377\270\234\233\377\302\246\243\377\317\270\261\377\351\323" + "\304\377\340\305\257\377\347\314\272\377\365\352\341\377\353\340\332\377" + "\373\364\363\377\360\350\353\377\303\255\274\377\263\235\255\377\267\242" + "\261\377\315\262\270\377\336\275\257\377\316\277\230\377h\237\005\377i\237" + "\001\377u\261\006\377s\252\002\377|\263\001\377x\253\002\377v\262\002\377q\254\002\377" + "u\256\004\377|\261\003\377v\252\001\377r\252\001\377r\253\002\377n\242\001\377i\232\002" + "\377n\245\002\377p\252\001\377l\247\002\377k\250\001\377l\251\001\377l\245\002\377u\254" + "\003\377\200\265\004\377s\242\001\377r\241\001\377v\256\001\377u\255\004\377\216\304" + "&\377x\255\016\377\224\303\034\377\204\265\000\377\177\260\001\377{\255\001\377y" + "\257\002\377n\247\002\377s\253\002\377x\254\002\377\177\263\001\377\207\273\001\377\207" + "\274\002\377\203\271\001\377}\260\001\377\203\272\003\377{\256\001\377o\242\001\377t" + "\253\001\377r\254!\377f\232\000\377q\246\001\377q\247\001\377\202\271\031\377m\252" + "\007\377c\241\003\377`\233\002\377i\247\003\377v\262\014\377n\246\002\377e\235\002\377" + "l\244\010\377o\247\007\377r\252\005\377i\241\002\377\\\225\001\377p\247\027\377p\241" + "\014\377u\243\011\377j\230\001\377k\241\002\377r\252\012\377o\251\007\377j\236\001\377" + "n\240\002\377x\250\001\377\200\255\002\377\203\262\001\377Y\224\001\377Y\225\001\377" + "d\241\001\377j\237\001\377o\241\001\377q\246\001\377i\242\002\377h\242\030\377r\222" + "g\377{\214\200\377\177\201\210\377\254\235\246\377\346\321\315\377\374\367" + "\365\377\370\361\361\377\277\250\250\377v[\\\377}db\377\272\241\225\377\363" + "\325\307\377\345\301\253\377\364\332\313\377\343\306\275\377\344\313\311" + "\377\336\311\316\377\334\313\323\377\344\322\332\377\316\271\301\377\326" + "\302\305\377\315\266\264\377\323\273\260\377\353\320\301\377\316\255\226" + "\377\216dD\377\372\357\346\377\365\354\347\377\344\330\326\377\331\307\307" + "\377\352\332\327\377\320\267\261\377\340\311\274\377\331\277\250\377\335" + "\301\255\377\361\341\323\377\346\322\311\377\361\341\337\377\346\324\327" + "\377\317\273\306\377\263\233\250\377\274\240\246\377\340\276\263\377\352" + "\306\275\377\231\261I\377m\247\002\377i\237\001\377n\250\001\377q\243\001\377\177" + "\265\001\377z\256\002\377r\253\001\377o\237\001\377t\243\002\377\201\257\004\377\205" + "\270\012\377y\261\010\377p\252\007\377c\234\002\377d\234\002\377s\255\001\377v\252" + "\002\377z\261\001\377s\253\001\377p\250\002\377r\251\002\377}\263\007\377~\263\002\377" + "|\255\003\377z\247\001\377\201\262\001\377z\257\002\377\200\271\037\377\210\276\063" + "\377\230\310>\377z\256\000\377{\254\001\377r\240\002\377r\246\001\377r\255\001\377" + "u\261\002\377v\256\003\377\205\271\001\377\213\276\001\377~\254\001\377\201\263\002\377" + "\202\265\002\377\207\275\006\377{\256\001\377s\252\001\377n\247\001\377|\265\061\377" + "m\250\013\377f\234\001\377o\250\006\377\204\272\040\377\177\266\033\377r\253\017" + "\377l\245\012\377q\251\014\377z\261\016\377r\255\010\377d\237\001\377j\245\010\377" + "{\260\024\377|\257\022\377s\246\020\377U\221\005\377h\235\020\377x\247\023\377r" + "\243\014\377f\234\002\377o\247\001\377p\251\001\377l\241\001\377q\245\001\377t\242\002" + "\377\200\262\003\377s\241\002\377x\252\003\377k\240\006\377c\230\001\377d\232\002\377" + "j\244\001\377j\241\002\377g\236\002\377j\244\010\377s\240\060\377|\204\205\377||" + "\207\377\212\177\220\377\326\307\313\377\370\353\351\377\372\361\354\377" + "\310\244\224\377O/$\377#\011\003\377#\014\005\377\024\000\000\377D%\035\377\330\261\233" + "\377\377\366\347\377\342\314\300\377\333\277\272\377\333\305\305\377\330" + "\276\302\377\276\247\255\377\276\250\251\377\275\243\240\377\337\307\274" + "\377\360\334\316\377\355\323\277\377\325\260\221\377\343\303\251\377\306" + "\257\237\377\251\221\210\377\266\241\235\377\274\250\251\377\343\326\327" + "\377\350\330\327\377\337\312\303\377\334\301\264\377\323\272\246\377\324" + "\271\247\377\372\362\354\377\357\337\340\377\315\266\303\377\266\233\254" + "\377\257\220\234\377\323\253\236\377\341\270\250\377\333\306\255\377f\235" + "\000\377m\247\002\377l\244\001\377q\254\001\377v\256\001\377x\262\002\377o\247\001\377" + "j\243\001\377o\242\001\377q\237\001\377u\243\001\377v\254\002\377\200\271\033\377~\267" + "-\377f\237\004\377e\233\001\377s\252\002\377|\257\001\377~\260\001\377|\256\001\377y" + "\254\001\377}\257\001\377\203\270\005\377}\260\001\377}\256\002\377\202\263\001\377\177" + "\256\002\377t\247\006\377\207\300/\377\205\276\066\377\210\302\062\377r\252\000\377" + "s\254\001\377s\255\003\377m\250\001\377p\255\004\377n\247\002\377\203\266\001\377\211" + "\275\002\377\205\267\001\377|\252\002\377\201\264\001\377\204\267\006\377|\257\001\377" + "{\260\002\377v\262\002\377q\251\001\377~\267!\377u\260\015\377`\225\001\377c\234\003" + "\377\201\266\031\377\214\276'\377\200\265\034\377\177\264\036\377\200\265\035" + "\377\200\266\030\377t\256\011\377c\235\002\377_\230\001\377d\241\002\377w\254\034" + "\377w\251)\377V\217\016\377p\241\030\377\205\255\034\377\217\265,\377o\245\020" + "\377t\256\012\377q\254\002\377m\244\002\377w\253\006\377~\257\004\377x\255\003\377m" + "\246\010\377m\245\015\377\202\263\"\377\203\262$\377d\226\002\377g\240\003\377" + "X\215\001\377f\235\024\377d\226'\377\177\217w\377\200|\207\377\210}\216\377" + "\241\225\237\377\362\342\333\377\350\321\313\377\355\323\306\377\236n[\377" + "\071\025\020\377bA+\377\320\307\317\377\244\241\267\377bLB\377M(\032\377\376" + "\354\330\377\355\317\271\377\373\352\337\377\326\254\225\377\347\315\277" + "\377\323\270\260\377\340\305\272\377\325\270\254\377\372\365\357\377\375" + "\372\364\377\365\336\307\377\300\241\207\377;&\035\377\034\006\014\377\"\012\017" + "\377\040\010\010\377<&#\377\234\204}\377\346\326\324\377\350\332\326\377\310" + "\256\241\377\352\322\302\377\334\303\256\377\363\344\327\377\371\363\360" + "\377\340\317\325\377\267\234\254\377\323\262\264\377\345\277\264\377\354" + "\317\304\377pdJ\377s\255\000\377q\246\001\377w\255\003\377z\266\005\377s\256\001\377" + "u\261\005\377i\243\002\377l\241\002\377x\253\001\377{\251\002\377~\253\002\377z\253\001" + "\377n\246\002\377n\252\034\377\207\275\071\377j\240\002\377{\257\001\377\207\267" + "\002\377\177\255\001\377z\255\002\377|\261\002\377~\260\001\377\212\276\010\377|\257" + "\002\377{\254\001\377\203\270\004\377y\257\007\377t\256\016\377\217\306?\377\207\300" + ";\377x\265\036\377r\261\001\377p\254\001\377r\260\007\377m\254\007\377i\243\001\377" + "~\260\001\377\230\303\002\377\177\256\001\377u\246\001\377t\252\004\377\212\301\036" + "\377\211\300\034\377y\260\003\377{\257\001\377z\261\001\377s\250\001\377x\257\013\377" + "|\262\005\377e\236\002\377c\235\003\377w\255\011\377\206\270\030\377}\262\017\377" + "s\253\011\377g\237\002\377z\260\022\377~\264\025\377e\240\006\377^\234\003\377b\237" + "\004\377h\240\011\377e\236\021\377R\217\006\377a\230\016\377\221\264\063\377\204" + "\252*\377{\253\"\377v\255\031\377c\240\006\377m\251\022\377\203\266\"\377\210" + "\267\026\377w\250\002\377m\242\002\377r\251\013\377\203\266)\377\206\265\063\377" + "Y\211\001\377h\236\025\377h\232\034\377w\243<\377x\222\\\377\201{\206\377\205" + "w\210\377\226\203\223\377\301\260\265\377\267\237\245\377\372\362\357\377" + "\371\361\355\377\241\200}\377nP:\377\273\253|\377\307\305\260\377\247\251" + "\276\377\322\322\324\377\204dN\377\374\342\313\377\366\327\271\377\366\323" + "\260\377\366\320\252\377\370\334\276\377\366\335\306\377\357\317\275\377" + "\367\342\321\377\375\377\375\377\372\352\330\377\225t\\\377\065\034\015\377" + "B/'\377\201u{\377ymy\377^H@\377/\023\014\377\067\033\025\377\251\210u\377\333" + "\311\300\377\350\327\314\377\315\260\242\377\332\301\263\377\354\336\321" + "\377\340\317\310\377\351\331\331\377\322\261\262\377\353\303\261\377\373" + "\343\326\377\254zc\377\201tC\377y\261\011\377w\250\001\377{\257\003\377z\263\004" + "\377v\260\002\377t\257\001\377q\253\001\377o\246\002\377w\253\001\377\177\260\000\377" + "\177\255\001\377w\247\001\377n\245\001\377b\233\001\377\202\271)\377w\256\007\377~" + "\261\001\377\204\265\001\377\177\260\001\377{\254\001\377\200\262\001\377\200\262\001" + "\377\211\300\010\377u\250\002\377t\245\001\377\202\271\001\377}\267\015\377\204\276" + "\071\377\244\325`\377\217\307C\377x\265\024\377t\262\003\377y\265\006\377|\266" + "\015\377p\247\002\377s\251\001\377\206\270\002\377\204\264\002\377x\253\000\377{\262" + "\023\377\222\306=\377~\272\025\377q\252\001\377u\246\001\377~\257\001\377}\263\001" + "\377v\253\001\377p\247\007\377\202\265\007\377g\242\012\377c\240\007\377r\253\007\377" + "y\260\012\377\202\265\022\377p\247\006\377d\235\003\377v\255\025\377\200\266\036" + "\377t\254\017\377q\251\016\377b\231\001\377c\231\002\377^\233\007\377J\214\003\377" + "X\225\017\377\204\257\061\377e\226\024\377l\237\035\377v\252(\377`\233\016\377" + "t\257'\377|\262\"\377}\260\025\377r\243\002\377m\237\002\377r\247\005\377\203\270" + "\040\377w\255\031\377Y\222\005\377k\240#\377l\235/\377v\225^\377\200\200\211" + "\377~v\203\377\213|\215\377\234\210\225\377\271\241\246\377\321\272\270\377" + "\344\316\314\377\363\354\354\377\336\322\321\377\231\210\201\377\334\330" + "\273\377\346\340\303\377\355\347\314\377\333\321\303\377\265\225\215\377" + "\362\320\274\377\366\331\276\377\364\321\262\377\363\310\250\377\362\313" + "\250\377\362\316\261\377\365\326\303\377\341\271\251\377\357\320\265\377" + "tTJ\377)\031\034\377kZ\070\377\275\265\237\377\315\316\341\377\265\266\322\377" + "\325\327\333\377\213mK\377\067\031\024\377tL?\377\313\252\231\377\307\251\224" + "\377\262\217{\377\320\263\242\377\343\315\301\377\346\330\322\377\332\302" + "\303\377\306\225\203\377\330\246\211\377\371\343\323\377\303\242\223\377" + "\225\224y\377x\246-\377u\246\012\377\177\263\013\377{\257\004\377z\255\002\377" + "z\263\002\377x\263\003\377p\251\001\377s\253\001\377z\254\001\377}\255\001\377x\247\001" + "\377q\242\001\377u\247\001\377{\260\003\377~\263\003\377\177\261\001\377\203\264\001" + "\377\202\263\001\377~\250\002\377\203\263\002\377\201\264\001\377\205\273\004\377u" + "\250\001\377z\253\002\377\202\265\002\377\202\270\007\377\214\304K\377\227\314W\377" + "{\272$\377r\261\006\377r\255\001\377u\260\003\377t\254\002\377\177\257\001\377\212" + "\275\002\377\177\262\001\377v\256\001\377w\262\012\377\224\310D\377\213\300\064\377" + "u\260\000\377u\254\001\377z\256\001\377~\255\001\377\201\266\001\377v\250\002\377v\244" + "\002\377\207\267\022\377o\250!\377W\225\003\377h\245\016\377l\247\014\377|\263\037" + "\377m\247\024\377l\247\033\377j\246\026\377\200\266%\377n\243\006\377\203\264" + "\037\377l\241\013\377b\233\007\377^\233\023\377P\220\004\377Z\231\005\377n\243\017" + "\377y\253\036\377n\237\025\377x\253,\377d\234\034\377\205\274;\377{\262\"\377" + "x\256\032\377`\226\003\377[\213\001\377V\210\001\377y\254\060\377\177\264!\377\177" + "\263(\377{\253=\377}\247V\377\177\213\177\377\203~\213\377\207{\214\377\214" + "|\215\377\305\257\260\377\256\221\221\377\301\243\231\377\275\235\220\377" + "\303\247\236\377\325\300\273\377\353\334\332\377\370\364\360\377\374\373" + "\365\377\364\346\330\377\326\254\235\377\310\241\242\377\332\262\261\377" + "\341\273\274\377\333\265\267\377\314\247\254\377\266\216\217\377\323\240" + "\177\377\341\301\262\377\277\232\225\377\220b_\377oCF\377\213cP\377\264\241" + "\202\377\333\324\262\377\330\327\312\377\341\342\331\377\343\345\333\377" + "\276\270\235\377\202hW\377\347\332\321\377\364\351\340\377\312\262\250\377" + "\245\215\203\377\317\265\247\377\324\274\261\377\344\322\313\377\347\324" + "\320\377\305\236\216\377\331\271\247\377\345\311\267\377\264\201l\377\223" + "\220\221\377\207\237|\377v\242\067\377t\251\017\377r\250\002\377p\246\001\377r" + "\257\002\377m\251\004\377q\256\002\377x\256\001\377y\245\002\377}\251\001\377|\252\001" + "\377{\247\002\377{\252\002\377{\253\001\377\177\266\003\377\207\301\015\377\207\273" + "\005\377\203\262\000\377\201\254\001\377\200\257\002\377~\261\001\377\177\270\003\377" + "t\247\001\377{\254\001\377\201\265\002\377\227\311/\377\203\273\063\377\210\301" + "E\377v\265\037\377q\255\003\377s\255\001\377u\261\002\377}\265\001\377\214\276\001\377" + "\203\264\001\377w\254\001\377y\267\016\377\233\320R\377\203\273)\377s\257\005\377" + "r\256\001\377w\261\001\377v\245\001\377~\256\001\377~\257\001\377{\252\002\377\221\263" + "\001\377\200\256\012\377\203\267D\377V\225\016\377Y\230\014\377_\236\016\377s\256" + "&\377y\256\032\377\206\270\040\377q\246\006\377}\263\033\377r\250\022\377~\262" + ".\377\210\272G\377\214\275U\377\204\270N\377Z\226\007\377Z\223\001\377a\231\001" + "\377t\247\030\377y\247\036\377y\252'\377m\242!\377\177\266.\377i\240\011\377" + "v\254#\377`\227\020\377U\206\001\377Q\177\004\377\210\264X\377r\245\023\377\205" + "\266$\377~\254\071\377{\226n\377{v\204\377\214\177\216\377\214{\213\377\270" + "\242\251\377\260\224\225\377\260\217\216\377\303\241\230\377\324\265\253" + "\377\323\265\260\377\326\272\266\377\340\310\304\377\354\326\320\377\360" + "\340\330\377\357\334\314\377\366\335\302\377\302|]\377\304\177a\377\362\253" + "\227\377\365\263\241\377\314\222\202\377\231f`\377\227fW\377\310\240\211" + "\377\261\220\206\377\265\224\215\377\246gY\377\376\354\315\377\373\367\346" + "\377\356\352\330\377\357\350\323\377\360\350\325\377\347\340\321\377\324" + "\316\307\377\366\361\360\377\351\335\335\377\343\321\317\377\353\332\327" + "\377\240\214\214\377t]_\377\326\301\274\377\343\323\315\377\330\305\277\377" + "\257\214\201\377\265\224\202\377\241xa\377\216jW\377\201y\201\377\235\240" + "\247\377\224\251\207\377{\253\063\377n\244\015\377r\253\010\377q\255\007\377f" + "\236\005\377l\242\001\377{\256\002\377y\245\001\377\201\255\001\377~\250\001\377|\251" + "\001\377z\250\001\377|\254\001\377\203\274\013\377\207\300\032\377\200\270\013\377" + "\203\272\013\377\200\262\002\377x\250\001\377x\255\001\377q\245\001\377p\240\001\377" + "\202\264\017\377\233\312\062\377z\257\005\377{\263\026\377g\245\034\377\177\272" + "\067\377s\260\016\377u\260\002\377y\263\002\377\200\266\002\377\206\270\002\377|\254" + "\002\377t\251\002\377w\263\013\377\211\277(\377\217\302)\377|\263\012\377x\262" + "\001\377u\254\002\377u\252\002\377z\257\002\377}\262\001\377\177\261\002\377\234\277" + "\002\377\177\261\027\377\210\274K\377a\234'\377m\244\061\377~\264\065\377\210" + "\272\013\377\222\276\003\377\210\263\001\377\177\256\017\377\203\264\033\377u\251" + "\011\377p\246\011\377x\257\022\377\202\266\034\377v\253\012\377h\236\001\377g\236" + "\002\377h\243\002\377r\251\013\377v\254\017\377s\252\021\377~\265)\377{\263'\377" + "^\227\004\377n\243\035\377\177\264\070\377[\213\003\377Nx\007\377t\246\070\377n\240" + ")\377\177\253\064\377\203\245R\377\215\224\221\377\202v\202\377\217\200\217" + "\377\251\227\237\377\317\273\274\377\246\221\226\377\302\252\251\377\340" + "\306\277\377\355\327\317\377\324\271\261\377\306\250\244\377\340\313\305" + "\377\354\331\316\377\361\341\324\377\375\374\366\377\372\365\357\377\215" + "fX\377X%\033\377\310eE\377\260aF\377\033\005\001\377@\033\013\377B\034\027\377\316" + "\237~\377\361\323\265\377\366\347\324\377\326\265\253\377\354\332\316\377" + "\366\351\343\377\361\344\336\377\356\337\330\377\341\320\311\377\326\301" + "\271\377\311\260\251\377\243\204\200\377\211lg\377\252\217\210\377\301\252" + "\236\377\301\255\242\377ubd\377\262\234\226\377\336\313\304\377\343\317\311" + "\377\242\206\204\377mUK\377Q\065$\377`J=\377\203v\203\377\237\230\246\377" + "\246\245\255\377\237\254\227\377\206\250R\377r\242\021\377~\260\021\377n\240" + "\003\377q\241\001\377z\257\001\377x\246\002\377~\257\001\377t\242\001\377s\246\001\377" + "|\261\002\377\204\267\004\377\205\270\004\377\216\300\027\377{\257\006\377\201\267" + "\017\377~\262\001\377}\257\001\377{\255\002\377s\243\000\377~\264\023\377\242\317a" + "\377\212\270\036\377|\256\000\377m\243\002\377\\\226\000\377w\264\040\377\200\273" + "%\377}\265\006\377\203\271\001\377\203\265\001\377|\255\001\377w\250\002\377u\253\001" + "\377s\255\001\377{\266\005\377~\264\005\377}\260\001\377\177\263\001\377v\247\002\377" + "s\247\002\377z\253\001\377\202\261\000\377}\254\002\377\231\276\001\377\200\267\062" + "\377q\251#\377\205\272/\377\225\305!\377\210\272\011\377x\255\002\377r\246\001" + "\377}\257\013\377\207\270%\377\204\265\030\377\201\263\013\377\215\274\032\377" + "\233\307\065\377\227\304/\377\217\300\"\377\202\264\014\377r\251\000\377q\255" + "\014\377{\265(\377k\245\025\377e\235\021\377\206\272<\377\213\276G\377i\241" + "\035\377l\240\033\377\225\303V\377o\240\037\377i\223%\377z\243K\377\201\247" + "Y\377\201\244a\377\212\230\210\377\212\204\217\377\237\222\236\377\212y\204" + "\377\266\243\245\377\313\267\264\377\253\216\221\377\272\240\233\377\266" + "\234\224\377\265\235\225\377\271\241\235\377\306\255\250\377\364\346\333" + "\377\336\276\261\377\361\330\305\377\371\365\361\377\375\375\376\377\377" + "\377\377\377\240ru\377\230J\067\377\232VD\377uZc\377\320\300\276\377\375\365" + "\353\377\377\377\370\377\372\363\340\377\370\347\322\377\360\334\313\377" + "\351\323\312\377\351\324\317\377\300\244\245\377\271\235\235\377\317\265" + "\261\377\320\265\257\377\301\245\240\377\306\253\242\377\260\222\206\377" + "\236\202u\377\233\201u\377\245\214\177\377\226~y\377yab\377\307\262\256\377" + "\310\262\257\377\315\270\263\377\231\203}\377_HB\377eOE\377\224\203\210\377" + "\214\177\215\377\232\223\242\377\237\237\250\377\223\236\225\377\206\247" + "T\377\205\265%\377z\253\002\377{\251\002\377\177\261\001\377~\261\001\377{\261\002" + "\377q\245\001\377s\253\003\377|\264\003\377\204\266\003\377\204\262\002\377\205\265" + "\005\377\177\262\005\377|\262\012\377~\270\017\377{\256\002\377z\252\002\377w\256\000" + "\377\177\267!\377\220\302<\377z\246\000\377|\256\001\377e\226\001\377j\237\001\377" + "|\267\012\377\201\271\024\377\204\274\013\377\204\266\001\377}\261\001\377t\252" + "\001\377q\246\001\377v\257\001\377x\261\001\377x\255\001\377|\254\001\377\204\270\001\377" + "\201\262\001\377y\250\001\377r\242\001\377\216\275\030\377\217\275\015\377t\246\001" + "\377\221\274\001\377t\255\035\377\214\300\060\377\202\266\032\377o\250)\377\\" + "\227\033\377Y\225\024\377k\243\022\377r\251\011\377y\253\002\377\202\263\002\377" + "\216\275\021\377\210\272&\377\207\266\067\377\204\263\066\377\210\267:\377~" + "\257\037\377|\256\000\377~\261$\377t\246)\377w\246\063\377u\243/\377\202\256" + "\062\377\230\301T\377\210\264>\377\205\266=\377\213\274H\377s\250\064\377h" + "\232,\377w\231\\\377\203\232z\377\213\226\213\377\217\212\225\377\227\212" + "\232\377\232\214\230\377ucq\377\276\254\251\377\271\243\244\377\264\236\240" + "\377\321\271\254\377\257\227\222\377\256\225\222\377\244\214\211\377\370" + "\360\355\377\374\367\356\377\367\344\321\377\342\303\261\377\371\364\363" + "\377\375\375\375\377\376\376\376\377\304\266\300\377T/<\377\202cr\377\363" + "\360\363\377\376\376\376\377\375\375\375\377\376\375\373\377\336\303\257" + "\377\323\250\217\377\301\235\222\377\331\275\264\377\371\356\350\377\337" + "\313\311\377\267\240\242\377\302\247\245\377\274\242\237\377\322\274\272" + "\377\310\262\260\377\264\232\224\377\241\204}\377\273\247\227\377\212qi\377" + "\220uq\377nXX\377\262\236\226\377\260\233\226\377\325\300\275\377\331\305" + "\303\377\241\211\212\377\202jg\377\217{z\377\217\200\213\377\220\205\226" + "\377\220\212\232\377\222\222\234\377\221\235\225\377\207\256T\377z\252\017" + "\377v\244\001\377\177\260\003\377{\253\001\377y\256\001\377t\245\001\377w\254\001\377" + "|\254\002\377\203\263\001\377\201\260\001\377~\255\001\377\210\271\012\377\222\303" + "-\377}\264\032\377z\261\016\377~\256\001\377{\257\001\377\202\273\017\377}\257\011" + "\377|\253\001\377z\251\002\377Z\222\001\377q\251\001\377\200\267\002\377\200\265\001" + "\377~\261\001\377y\254\002\377v\257\001\377r\251\001\377q\243\002\377|\254\002\377\201" + "\262\001\377~\253\002\377\202\263\001\377\202\264\001\377\177\264\001\377z\260\001\377" + "t\251\001\377\200\271\024\377z\262\007\377t\247\002\377\215\273\007\377|\267)\377" + "b\236\022\377j\242,\377u\253@\377a\231*\377q\246\071\377\205\266+\377v\250" + "\017\377f\227\001\377\201\257\001\377\214\275\003\377{\260\015\377_\230\014\377m\244" + "!\377k\241\032\377Y\217\004\377\211\267\000\377\210\270\070\377\203\262?\377\234" + "\310\\\377\221\275@\377\201\260,\377\213\270?\377\204\263B\377q\244\064\377" + "p\244\060\377l\237*\377p\235?\377p\206m\377\205\214\216\377\222\217\235\377" + "\221\206\227\377\233\217\236\377\207{\207\377\224\206\215\377\312\270\263" + "\377\264\243\240\377\314\263\250\377\320\261\235\377zYN\377yc^\377\352\342" + "\341\377\344\316\303\377\337\300\261\377\345\310\274\377\367\351\344\377" + "\375\375\374\377\373\367\370\377\374\371\373\377\344\334\347\377\200g|\377" + "\314\276\312\377\360\353\355\377\374\371\372\377\373\371\372\377\363\346" + "\342\377\324\261\233\377\354\314\261\377\312\245\221\377\325\271\247\377" + "\321\261\237\377\353\326\316\377\325\306\307\377\232\205\204\377\264\237" + "\234\377\251\224\222\377\250\221\213\377\265\234\224\377\266\233\216\377" + "\246\213~\377\234\202y\377\225~y\377kWV\377\231\207\200\377\256\233\227\377" + "\321\277\274\377\316\274\272\377\262\237\240\377\243\216\220\377\247\224" + "\226\377\241\217\230\377\212}\215\377\201x\211\377\210\203\223\377\213\213" + "\230\377\225\244\233\377x\243J\377n\245\036\377\204\271/\377t\251\002\377x\247" + "\002\377w\246\002\377\177\262\001\377\201\260\001\377\201\263\001\377{\257\002\377u\253" + "\002\377\213\276\037\377\222\301*\377n\245\001\377t\260\010\377\200\266\001\377\201" + "\256\001\377\205\265\002\377\177\253\001\377\200\253\001\377x\246\000\377\202\256\026" + "\377\200\260\006\377\204\271\001\377\201\265\001\377}\261\003\377v\255\006\377p\252" + "\001\377w\254\001\377\207\270\002\377~\254\002\377\201\261\001\377~\254\002\377\201\262" + "\001\377\201\265\002\377y\252\001\377{\261\002\377w\260\002\377u\261\000\377u\255\001\377" + "s\246\002\377\206\276\062\377p\256\"\377p\254)\377l\246'\377o\247-\377s\252" + ".\377c\233\016\377g\236\006\377Z\220\003\377]\222\001\377u\250\001\377\207\272\007\377" + "z\260\007\377n\244\023\377f\231\022\377]\221\004\377W\215\007\377\211\264\002\377q" + "\246\030\377\225\304_\377\214\275G\377y\252\027\377y\251\027\377|\253%\377\223" + "\277G\377]\222\032\377o\241+\377r\241+\377\203\243a\377\243\244\252\377\260" + "\253\270\377\251\237\257\377\241\230\250\377\220\207\226\377wiz\377\215y" + "\206\377\270\244\242\377\272\241\237\377\341\307\271\377\277\232\204\377" + "\257\214x\377\344\321\311\377\375\371\366\377\372\370\365\377\367\350\341" + "\377\352\315\307\377\364\334\333\377\367\356\360\377\374\366\370\377\371" + "\364\370\377\275\256\274\377\204v\204\377\265\243\261\377\321\273\302\377" + "\335\307\311\377\362\344\346\377\372\363\363\377\371\356\352\377\261\207" + "r\377\266\210k\377\326\262\225\377\376\366\354\377\373\370\365\377\373\364" + "\363\377\266\241\237\377\231\205\200\377\307\265\251\377\276\252\227\377" + "\275\250\225\377\314\265\250\377\264\234\217\377\276\252\240\377\247\223" + "\216\377}eh\377\212tq\377\247\217\213\377\266\241\235\377\307\265\260\377" + "\305\262\256\377\235\205\207\377\245\216\222\377\263\244\253\377\232\214" + "\232\377\200u\206\377\200x\213\377\212\205\226\377\212\213\227\377\206\226" + "\211\377~\251V\377{\257\062\377x\253\000\377\200\260\001\377v\245\002\377}\255\001" + "\377\200\263\001\377}\264\001\377w\257\002\377r\254\007\377\222\306F\377\200\264" + "\032\377q\247\001\377q\251\003\377w\262\003\377\200\260\001\377\203\256\001\377\177" + "\250\001\377~\251\002\377x\246\001\377\207\267\010\377\207\267\004\377\205\267\002\377" + "}\257\001\377\204\266\013\377\227\302&\377u\250\000\377|\255\001\377\215\300\001\377" + "\204\262\001\377\207\264\001\377\205\260\001\377\210\267\001\377\203\262\001\377x\246" + "\002\377\177\257\001\377w\246\002\377z\257\001\377~\263\001\377s\243\001\377`\241\021" + "\377N\214\000\377c\240\011\377y\262\037\377d\240\005\377b\237\006\377p\253\017\377" + "l\243\002\377g\225\003\377w\246\014\377q\241\000\377\177\263\004\377u\255\005\377~\263" + "\"\377\\\204\000\377e\216\007\377d\217\012\377}\253\003\377\216\303\064\377\177\262" + "@\377g\236\026\377[\216\005\377h\231\006\377~\254!\377\220\274A\377u\241)\377" + "\206\255S\377\232\260\204\377\243\250\243\377\234\230\244\377\210\200\225" + "\377\222\211\233\377\217\204\226\377\224\204\225\377\215\200\216\377\242" + "\224\231\377\240\217\223\377\320\274\271\377\336\311\302\377\262\226\217" + "\377\267\233\231\377\363\357\360\377\373\370\365\377\351\324\312\377\351" + "\317\311\377\366\346\346\377\365\353\355\377\360\352\356\377\361\347\356" + "\377\322\306\322\377}i|\377P\070H\377\216\200\215\377\313\275\306\377\340" + "\322\330\377\364\347\353\377\345\316\313\377\347\320\312\377\327\265\250" + "\377\336\304\265\377\320\262\242\377\311\252\233\377\332\306\275\377\352" + "\342\342\377\331\314\316\377\216\200|\377`TR\377ygb\377iXT\377\231\200t\377" + "\314\270\255\377\301\254\247\377\262\237\236\377\234\212\211\377\202on\377" + "\266\243\237\377\234\206\205\377\267\242\240\377\302\256\256\377\253\226" + "\233\377\237\211\221\377\315\300\306\377\322\306\313\377\241\225\242\377" + "\210~\220\377\214\205\227\377\214\207\226\377\211\211\224\377\210\233\204" + "\377x\250\066\377l\232\000\377\203\257\002\377\205\265\001\377\202\265\002\377\203" + "\267\002\377|\257\002\377x\255\001\377w\262\007\377w\261\022\377n\237\001\377q\245\001" + "\377r\251\001\377t\256\002\377\202\266\004\377\204\262\002\377\205\257\002\377~\251" + "\001\377{\247\002\377\204\265\001\377\206\265\002\377\204\266\001\377~\257\001\377\205" + "\261\002\377\222\274\002\377\206\264\001\377y\251\002\377\177\261\001\377\205\271\002" + "\377\201\256\001\377\205\261\001\377\212\272\002\377\206\265\001\377{\252\002\377}" + "\253\002\377y\250\001\377}\260\001\377{\255\001\377r\241\002\377d\236\002\377[\223\002" + "\377l\250\025\377|\264\031\377t\255\011\377^\225\001\377l\246\004\377w\252\003\377" + "b\215\001\377^\215\002\377q\242\001\377\205\266\005\377v\253\007\377\216\305+\377p" + "\236\003\377f\214\001\377Ry\001\377t\254\020\377z\264$\377Q\205\010\377~\260\040\377" + "T\206\003\377_\217\005\377\177\253\040\377\260\317t\377q\230B\377k\222E\377\213" + "\230\206\377\252\250\262\377\254\245\263\377\232\216\242\377rdx\377\201m" + "}\377\205q|\377\220|\201\377\221}|\377\202ge\377\334\300\254\377\340\274" + "\242\377\255~d\377\353\333\324\377\372\367\367\377\344\325\315\377\356\337" + "\325\377\351\324\312\377\275\245\242\377\307\265\267\377\342\331\337\377" + "\307\301\310\377zq~\377\070\036+\377N\067D\377UBN\377\232\217\233\377\325\312" + "\323\377\312\273\302\377\331\310\306\377\343\320\315\377\343\313\304\377" + "\277\236\220\377\310\237\203\377\370\355\345\377\357\341\331\377\332\312" + "\306\377\327\320\315\377\274\253\246\377\273\246\235\377\271\242\232\377" + "\225}w\377mOB\377\271\233\210\377\335\312\301\377\251\216\207\377\250\220" + "\212\377nVS\377\253\227\216\377\302\257\251\377\247\220\217\377\261\234\235" + "\377\254\232\237\377\240\213\227\377\260\237\252\377\314\277\305\377\323" + "\306\314\377\235\221\241\377\214\203\226\377\205~\220\377\202\177\215\377" + "\211\217\224\377v\233U\377i\234\010\377\200\261\001\377\203\262\002\377\202\262" + "\001\377\201\262\001\377}\253\001\377}\257\002\377~\262\001\377v\247\002\377x\246\001\377" + "x\247\002\377s\241\002\377x\260\003\377y\254\001\377\177\256\001\377\202\263\001\377" + "\202\256\002\377\200\254\002\377\206\264\001\377\207\264\002\377\211\271\002\377\204" + "\255\001\377\223\267\001\377\245\307\001\377\212\263\002\377{\256\001\377s\245\002\377" + "~\260\001\377}\254\002\377\203\262\002\377\207\267\001\377\211\271\001\377\177\256" + "\001\377~\256\002\377\177\263\002\377}\257\001\377u\244\001\377z\252\002\377g\236\001\377" + "f\236\001\377s\256\026\377\210\276.\377z\262\020\377t\256\011\377i\235\001\377s" + "\246\002\377p\240\001\377o\235\001\377w\242\000\377\223\301\071\377w\254\040\377\214" + "\301/\377y\256\013\377m\240\002\377a\222\000\377z\262\025\377k\242\012\377h\226" + "\020\377x\250\024\377Gy\000\377d\214\022\377\212\246\064\377\262\316\213\377\204" + "\245l\377\207\224\211\377\220\216\234\377\207\177\222\377\205{\220\377\204" + "w\212\377l_r\377\211w\203\377\234\206\217\377\266\243\250\377\254\233\235" + "\377\277\256\255\377\367\347\340\377\326\271\243\377\314\262\244\377\336" + "\324\322\377\354\342\336\377\367\356\347\377\324\300\262\377\236\214\207" + "\377\261\247\242\377\271\262\264\377\267\260\266\377l^g\377XIP\377ven\377" + "cNZ\377eS\\\377aNY\377\210z\210\377\277\271\301\377\316\301\306\377\252\220" + "\215\377\273\240\231\377\337\306\277\377\314\270\255\377\320\267\243\377" + "\336\314\276\377\363\353\346\377\327\313\312\377\335\317\322\377\355\341" + "\342\377\364\355\355\377\341\323\315\377\234\205z\377\243\213\201\377\316" + "\272\262\377\305\256\242\377\270\241\225\377\207sm\377zd`\377\261\237\225" + "\377\254\231\225\377\262\240\235\377\262\243\247\377\227\205\222\377\221" + "~\216\377\304\266\276\377\326\311\316\377\315\300\310\377\241\226\246\377" + "\213\205\227\377\205\201\221\377\216\215\233\377z\216x\377\223\273S\377\205" + "\265\016\377\210\266\005\377\213\271\002\377\205\261\001\377~\257\001\377y\257\001\377" + "s\245\001\377z\254\001\377\200\257\002\377}\254\002\377}\253\010\377}\261\013\377y" + "\254\004\377\177\257\002\377}\253\002\377~\253\001\377v\246\002\377u\245\002\377\200" + "\260\001\377\205\265\002\377\203\253\001\377\225\275\001\377\223\267\001\377\200\253" + "\003\377\200\262\001\377{\261\002\377t\246\002\377x\251\002\377\203\264\001\377\212\267" + "\001\377\221\301\001\377\206\262\001\377\200\257\001\377\201\263\001\377z\251\002\377" + "w\246\001\377\204\264\001\377\226\275\002\377q\247\001\377m\246\002\377u\256\011\377" + "o\247\001\377y\255\001\377~\260\002\377~\256\002\377z\247\001\377}\253\001\377\220\271" + "#\377\227\302a\377Y\227\003\377\205\272\060\377}\260\026\377o\242\002\377s\253" + "\004\377v\254\003\377y\252\003\377z\247\010\377\210\263I\377}\243F\377\201\242\066" + "\377\232\264g\377\242\276\202\377z\215u\377|}\205\377\203|\214\377\204x\211" + "\377\213~\220\377~p\201\377|n{\377\265\245\252\377\327\313\317\377\354\344" + "\351\377\326\320\326\377\343\326\327\377\342\315\277\377\310\265\251\377" + "\341\324\317\377\344\326\323\377\350\335\334\377\352\343\340\377\262\243" + "\217\377\234\207l\377wjX\377\204\201v\377smk\377iZ^\377\212x\177\377\235" + "\212\226\377\221~\213\377\204nx\377\214x\200\377eV\\\377kci\377\244\237\242" + "\377\267\252\252\377\240\217\215\377\212tf\377\301\255\235\377\333\311\275" + "\377\331\316\307\377\333\312\277\377\365\357\355\377\351\336\334\377\335" + "\317\310\377\303\250\224\377\301\250\226\377\326\310\301\377\223\203\177" + "\377\270\250\242\377\333\311\303\377\264\237\221\377\220zv\377`LN\377\221" + "~z\377\236\215\206\377\226\203\204\377\247\227\233\377\234\213\230\377\232" + "\214\234\377\255\235\252\377\311\273\303\377\323\310\317\377\314\303\312" + "\377\243\233\252\377\205\177\220\377\215\212\230\377\202\207\213\377v\233" + "?\377\214\272&\377\210\264\001\377\213\257\001\377\215\264\001\377\201\260\001\377" + "t\250\001\377q\243\001\377u\244\002\377z\245\002\377z\250\001\377z\255\010\377\200\265" + "!\377\202\271'\377x\253\001\377\206\263\003\377\200\260\002\377w\247\002\377u\245" + "\001\377\201\260\002\377\207\265\002\377\206\260\001\377\214\267\001\377\214\273\004" + "\377\201\255\003\377}\262\001\377p\255\002\377k\242\002\377h\234\001\377}\257\002\377" + "\202\256\002\377\217\274\002\377\221\276\001\377\200\257\002\377{\256\002\377w\247" + "\001\377~\261\001\377\202\265\001\377\215\265\001\377\202\264\003\377x\253\006\377i\227" + "\001\377y\256\001\377w\251\001\377d\224\001\377g\226\002\377\200\255\002\377\205\262" + "\000\377\204\266\"\377f\232\020\377Z\231\001\377p\250\034\377\203\264%\377}\261" + "\035\377v\255\013\377r\251\003\377{\254\001\377\201\257\001\377\211\260i\377\216" + "\265q\377\234\276i\377|\246C\377n\225J\377\201\211\205\377\203\177\213\377" + "\203y\213\377\204w\212\377\204w\211\377\242\231\244\377\253\242\252\377\307" + "\275\306\377\342\325\336\377\313\277\306\377\277\265\276\377\323\310\314" + "\377\312\261\247\377\306\247\217\377\327\301\255\377\317\274\265\377\325" + "\307\277\377\312\266\242\377\272\242\202\377\234\202a\377oaM\377ph\\\377" + "tol\377\247\234\237\377\275\261\271\377\252\233\247\377\226\204\220\377\245" + "\225\240\377\246\230\241\377\242\230\234\377pfl\377ife\377\213\211\201\377" + "|rh\377\242\232\222\377\204t_\377\257\237\214\377\321\304\264\377\344\336" + "\331\377\365\363\364\377\343\335\330\377\317\275\257\377\250\205e\377\260" + "\217r\377\247\205j\377\230xb\377\223vi\377\332\314\311\377\316\301\277\377" + "\277\254\245\377^FD\377}ib\377\225\200|\377\222\177~\377\230\206\213\377" + "\227\210\224\377\260\244\261\377\252\232\247\377\262\243\256\377\312\274" + "\306\377\313\277\307\377\307\273\305\377\233\221\242\377\211\200\222\377" + "\203~\215\377u\203h\377u\246\022\377~\257\007\377\177\247\002\377\225\264\001\377" + "\202\253\002\377j\231\002\377z\251\002\377\201\252\001\377\201\254\001\377r\234\001\377" + "~\257\002\377}\260\007\377w\255\010\377w\251\003\377\223\277\031\377\207\270\011\377" + "\200\261\013\377x\245\001\377\206\262\001\377\213\267\001\377\206\257\002\377\212" + "\262\001\377\220\276\016\377\214\276\026\377{\264\002\377m\250\001\377n\251\001\377" + "h\235\001\377|\262\001\377}\255\001\377\210\264\001\377\221\275\002\377\203\263\002\377" + "q\245\001\377u\252\001\377|\267\003\377~\270\001\377\207\260\001\377\206\256\001\377" + "\211\266\007\377r\236\002\377y\251\002\377j\234\001\377P\202\002\377\\\216\002\377x\245" + "\001\377\210\267\026\377\206\266\021\377|\250\002\377g\237\012\377c\232#\377\200" + "\264\060\377t\253\034\377l\247\017\377m\244\014\377\206\264\032\377\227\274\070" + "\377w\240\037\377z\246\064\377\216\267X\377}\252S\377q\217`\377\212\207\217" + "\377\215\205\222\377\230\214\234\377\230\215\235\377\241\223\242\377\210" + "z\210\377\302\263\275\377\335\321\331\377\353\340\347\377\325\314\324\377" + "\266\245\255\377\247\217\214\377\243\213\200\377\330\312\302\377\326\310" + "\300\377\303\255\241\377\302\245\210\377\301\246\210\377\263\227z\377\221" + "v\\\377`M@\377pgb\377\252\247\251\377\312\304\310\377\305\276\305\377\313" + "\306\314\377\260\250\262\377\275\264\275\377\274\263\274\377\254\245\254" + "\377\255\250\256\377xss\377ysl\377ri`\377uja\377\242\232\212\377\265\257" + "\231\377\302\275\252\377\317\310\271\377\331\325\320\377\340\332\332\377" + "\325\305\276\377\303\252\224\377\322\272\246\377\277\244\212\377\237}a\377" + "tS@\377\275\243\216\377\333\313\277\377\343\331\326\377\214{}\377xd`\377" + "ve\\\377\204rq\377\210w\200\377\224\204\221\377\251\232\247\377\274\256\270" + "\377\273\253\266\377\265\242\256\377\313\275\306\377\330\313\323\377\321" + "\305\314\377\217\201\225\377\211\200\221\377x~y\377o\234<\377w\253.\377p" + "\245\001\377\201\256\001\377\177\250\001\377r\236\002\377\177\254\002\377\206\261\002" + "\377\201\253\001\377{\245\001\377\177\250\001\377~\247\001\377\202\261\001\377r\242" + "\002\377|\253\001\377\202\262\002\377|\254\003\377|\252\001\377\211\267\001\377\206\262" + "\001\377\203\256\001\377\206\257\001\377\202\253\001\377\201\264\000\377\201\272\006" + "\377n\244\001\377q\252\001\377l\240\002\377~\261\004\377\206\266\012\377\215\266\002" + "\377\213\264\001\377\211\265\001\377p\251\001\377s\254\001\377{\257\001\377\202\265" + "\001\377e\221\001\377\203\255\002\377\216\270\001\377\207\261\001\377j\232\001\377_\217" + "\002\377X\210\002\377s\241\002\377z\254\001\377\214\274A\377g\230\020\377g\223\002\377" + "y\251\010\377\203\265'\377\215\277@\377y\256\063\377\233\303i\377\236\302a" + "\377\177\254\015\377{\254\003\377l\236\011\377n\236#\377o\235\071\377p\230L\377" + "}\205\202\377\217\210\226\377\242\234\247\377\221\210\230\377\214\177\220" + "\377\226\206\224\377\256\234\245\377\320\303\311\377\334\322\332\377\311" + "\271\302\377\277\257\270\377\252\226\241\377\245\226\227\377\177j_\377\320" + "\300\264\377\320\276\257\377\320\275\252\377\312\271\244\377\301\257\234" + "\377\274\254\232\377\274\256\241\377\236\224\216\377\250\244\243\377\302" + "\300\304\377\277\275\301\377\311\307\314\377\317\315\322\377\300\270\301" + "\377\303\300\306\377\311\307\314\377\266\263\270\377\315\314\320\377\271" + "\271\274\377\235\234\230\377~ys\377TFB\377YOS\377\215}e\377\277\264\237\377" + "\266\253\223\377\273\253\220\377\300\264\243\377\336\325\323\377\337\324" + "\322\377\330\311\301\377\321\275\255\377\273\240\206\377vVA\377\225sZ\377" + "\336\316\300\377\350\336\327\377\260\244\250\377\227\210\221\377\224\207" + "\205\377ucd\377\206x\202\377\223\205\222\377\243\225\242\377\262\242\256" + "\377\300\261\272\377\273\252\263\377\301\261\271\377\312\273\301\377\317" + "\300\306\377\321\306\312\377\233\222\240\377z{\203\377w\221o\377\211\264" + "c\377p\247\004\377t\250\002\377y\247\002\377}\253\001\377~\251\001\377\201\257\001\377" + "{\247\001\377z\244\002\377v\237\002\377\203\252\001\377\204\261\002\377w\245\002\377" + "s\243\001\377z\253\001\377}\261\001\377\201\262\002\377\203\255\002\377\207\263\002\377" + "\203\256\002\377\201\254\002\377\204\255\001\377\206\267\002\377z\257\002\377s\251" + "\001\377t\254\002\377j\233\001\377n\237\002\377\220\300\024\377\212\270\000\377\211" + "\264\001\377{\251\002\377{\260\002\377v\252\002\377\177\257\001\377\202\263\001\377b" + "\221\002\377g\225\001\377\213\267\001\377\224\276\012\377\205\261\005\377l\232\001\377" + "d\221\002\377w\246\002\377{\253\001\377r\247\000\377T\211\000\377P\207\002\377O\210\002" + "\377{\255#\377\227\303K\377\231\304Z\377|\256\067\377z\251\037\377\204\260" + "\002\377\210\261\007\377\202\253*\377q\237.\377o\233>\377q\217[\377\231\227\241" + "\377\226\216\236\377\200u\211\377\207}\221\377\200t\206\377\235\215\232\377" + "\303\267\273\377\306\267\276\377\251\221\233\377\266\240\253\377\315\276" + "\306\377\311\274\304\377\241\216\217\377\264\237\226\377\275\243\214\377" + "\272\241\206\377\264\235\177\377\242\210j\377\254\225}\377\304\264\253\377" + "\331\323\322\377\316\313\315\377\300\277\300\377\300\300\300\377\271\271" + "\272\377\311\311\315\377\312\311\316\377\302\301\306\377\304\303\311\377" + "\310\307\315\377\312\311\316\377\273\272\276\377\320\320\324\377\276\301" + "\277\377\266\266\263\377\233\232\223\377\210\177\204\377jY]\377\212pV\377" + "\305\273\247\377\276\263\235\377\301\262\232\377\301\265\241\377\327\317" + "\310\377\316\277\261\377\301\261\237\377\304\261\237\377\261\231~\377|\\" + "C\377\312\263\232\377\342\325\312\377\300\262\257\377l`g\377\200t~\377\243" + "\232\241\377\215\201\213\377\230\213\227\377\217\201\221\377\243\225\244" + "\377\271\252\264\377\310\271\277\377\261\240\251\377\274\255\264\377\276" + "\255\265\377\323\306\311\377\315\303\311\377\205\202\216\377m|q\377\234\272" + "\220\377z\261\034\377l\241\000\377r\247\003\377\177\256\015\377s\246\001\377|\262" + "\012\377{\256\006\377v\244\001\377x\246\001\377\177\256\001\377s\241\002\377p\236\001" + "\377z\251\002\377z\250\001\377w\251\001\377y\260\001\377|\256\002\377\201\262\001\377" + "\177\252\001\377{\245\002\377\206\261\001\377\207\271\002\377o\242\001\377r\255\006\377" + "u\256\005\377p\240\001\377j\233\002\377\204\270\025\377\231\304.\377\207\270\004\377" + "x\252\002\377k\240\001\377|\254\001\377~\255\001\377~\261\001\377k\235\001\377m\235\002" + "\377{\252\003\377\223\277\031\377}\253\002\377}\254\001\377~\256\002\377|\261\003\377" + "m\236\002\377p\245\001\377i\245\004\377u\257&\377_\232\037\377\214\275f\377\215" + "\277T\377z\255\013\377m\237\002\377p\230\002\377\211\262\001\377\213\262\004\377u" + "\237\003\377]\214\000\377h\224\062\377\213\225\214\377\222\213\227\377~t\204\377" + "xp\200\377}u\207\377\265\254\271\377\276\260\264\377\271\244\250\377\267" + "\240\244\377\270\243\253\377\303\264\276\377\277\256\266\377\273\254\264" + "\377\241\217\223\377\227{p\377\276\241\213\377\267\235\210\377\272\246\223" + "\377\275\253\227\377\271\246\222\377\314\276\267\377\340\333\334\377\333" + "\331\335\377\307\307\307\377\275\276\271\377\261\262\254\377\275\302\276" + "\377\276\301\300\377\271\272\272\377\272\273\274\377\303\304\307\377\301" + "\303\304\377\257\262\255\377\274\300\273\377\307\314\312\377\311\313\312" + "\377\302\302\303\377\274\273\276\377\264\257\260\377\256\241\234\377\326" + "\321\312\377\265\256\234\377\305\274\253\377\266\246\223\377\314\300\261" + "\377\301\270\261\377\320\306\272\377\306\272\254\377\304\253\226\377\216" + "pS\377\242\207l\377\312\271\243\377\256\231\216\377yjs\377tdj\377rek\377" + "\245\234\246\377\264\251\261\377\223\204\223\377\237\215\235\377\256\236" + "\250\377\301\262\271\377\277\256\267\377\265\242\254\377\271\250\260\377" + "\273\253\257\377\343\327\327\377\236\225\242\377sux\377\215\243\203\377\177" + "\260)\377p\243\000\377n\236\002\377r\244\003\377j\231\003\377|\262\016\377p\244\001" + "\377u\253\003\377\200\264\021\377t\247\002\377k\232\002\377t\242\002\377y\246\001\377" + "\204\262\002\377u\244\002\377t\250\001\377m\237\001\377x\257\002\377|\255\001\377~\251" + "\002\377\213\273\007\377\201\264\002\377q\246\003\377u\260\011\377n\240\001\377s\243" + "\001\377y\250\002\377\201\266\011\377\243\310B\377\201\261\006\377j\237\002\377a\227" + "\002\377\217\274\002\377\206\260\001\377\201\262\001\377h\227\002\377u\246\001\377l\234" + "\002\377p\243\017\377{\256\030\377e\234\006\377Y\220\003\377v\257\024\377l\242\004\377" + "p\246\002\377u\255\010\377\211\277:\377\177\263:\377r\250\065\377\200\264B\377" + "`\227\022\377[\216\001\377|\253\001\377\215\266\002\377\210\257\006\377\227\265\065" + "\377\201\246@\377w\230a\377\211\216\210\377\214\207\217\377\217\204\222\377" + "\226\217\236\377\253\241\256\377\233\207\222\377\264\240\244\377\303\261" + "\263\377\270\244\252\377\270\246\260\377\246\223\236\377\275\256\267\377" + "\315\300\311\377\244\217\225\377\206ig\377\250\216{\377\265\236\213\377\252" + "\223\203\377\261\232\206\377\261\235\214\377\317\306\301\377\327\322\322" + "\377\327\325\326\377\313\314\311\377\263\266\251\377\243\251\231\377\254" + "\261\244\377\261\266\253\377\263\270\256\377\265\272\262\377\273\301\272" + "\377\271\300\271\377\265\272\262\377\263\271\261\377\301\306\300\377\305" + "\312\310\377\316\320\322\377\317\317\323\377\316\315\321\377\326\326\330" + "\377\315\312\305\377\302\274\263\377\273\261\243\377\270\256\233\377\255" + "\237\211\377\277\265\244\377\315\305\273\377\307\275\257\377\301\263\241" + "\377\227~h\377gK\063\377\245\215u\377\211xk\377XLL\377h`c\377\204z\177\377" + "\204u\200\377\255\242\252\377\261\242\254\377\236\214\232\377\252\231\244" + "\377\273\253\264\377\277\260\266\377\271\250\256\377\267\246\255\377\272" + "\251\254\377\325\307\310\377\304\270\300\377\177y\203\377\214\232{\377\211" + "\265\067\377r\250\002\377k\233\001\377q\246\003\377s\247\004\377r\247\004\377j\237\002" + "\377^\217\001\377z\246\004\377~\253\007\377r\234\001\377\177\253\000\377\203\257\002" + "\377~\253\002\377z\251\002\377p\245\002\377k\235\001\377n\237\001\377|\257\004\377\201" + "\263\011\377{\256\003\377\202\267\014\377\201\270\023\377o\246\000\377o\241\001\377" + "o\240\002\377~\254\001\377y\251\000\377\212\267\016\377w\246\002\377h\235\002\377Y\221" + "\002\377|\260\001\377\217\272\002\377\212\265\000\377z\246\002\377v\245\001\377f\225" + "\002\377_\215\001\377v\251\014\377\205\266$\377e\233\003\377_\224\001\377w\254\032" + "\377\204\267+\377\207\273)\377~\262\020\377z\254\000\377{\255\014\377\205\263" + "\067\377\205\265\063\377U\216\003\377f\234\005\377\207\262\013\377\211\260\030\377" + "\301\301\247\377\212\217x\377{\204y\377\204\204\210\377\221\207\223\377\242" + "\227\247\377\233\222\240\377\220~\216\377\232\207\221\377\302\260\267\377" + "\311\272\301\377\271\250\260\377\254\227\242\377\265\243\255\377\276\257" + "\271\377\301\264\274\377\274\256\265\377\222\200}\377p_R\377\256\223~\377" + "\250\215r\377\253\216s\377\306\262\244\377\277\261\253\377\322\314\311\377" + "\324\324\323\377\305\307\301\377\266\271\252\377\247\255\224\377\237\251" + "\212\377\242\253\215\377\242\256\220\377\240\256\221\377\252\266\237\377" + "\255\272\245\377\255\271\243\377\255\270\245\377\266\277\262\377\303\310" + "\302\377\313\316\316\377\316\322\325\377\330\331\335\377\332\332\334\377" + "\317\314\307\377\301\271\255\377\275\261\240\377\273\257\241\377\217zc\377" + "~iP\377\214{c\377\233\213x\377\311\273\261\377\241\211w\377kVH\377q\\J\377" + "aNB\377UF?\377bUU\377xlt\377\212~\212\377\225\207\221\377\245\227\240\377" + "\232\213\230\377\260\242\255\377\257\236\252\377\312\272\302\377\300\261" + "\267\377\260\236\250\377\301\261\267\377\321\302\305\377\312\275\301\377" + "\200x\207\377\213\225l\377\217\262=\377i\241\003\377r\250\012\377t\247\004\377" + "o\234\001\377g\224\002\377[\213\001\377m\231\002\377\206\253\002\377\206\261\002\377" + "~\250\005\377\232\301\020\377\203\256\001\377|\250\002\377w\247\002\377s\250\001\377" + "k\233\002\377n\236\002\377s\246\000\377\216\275/\377{\260\005\377x\254\002\377{\263" + "\006\377v\254\004\377r\244\002\377v\245\002\377\202\256\002\377n\235\002\377l\235\001\377" + "s\244\001\377j\237\001\377c\234\001\377\202\273\031\377\210\270\001\377\207\262\002" + "\377\206\260\001\377i\226\002\377U\206\001\377_\215\002\377i\232\001\377e\227\006\377" + "y\257\026\377z\255\035\377\220\277\066\377\206\265\037\377m\237\002\377p\240\000" + "\377\177\256\000\377\221\270\000\377\214\267\061\377v\241G\377^\177\070\377awE" + "\377q{c\377c_h\377G>N\377TLY\377olt\377\227\223\235\377\241\231\247\377\224" + "\210\230\377\203t\206\377\222\200\216\377\256\236\245\377\310\273\300\377" + "\243\217\231\377\266\243\253\377\231\204\220\377\300\262\271\377\300\262" + "\273\377\246\225\234\377\261\240\242\377\265\246\243\377\211so\377rQF\377" + "nK>\377\227xe\377\252\212{\377\276\253\241\377\306\272\264\377\273\263\253" + "\377\265\262\244\377\251\251\222\377\245\251\207\377\233\244y\377\227\241" + "q\377\221\235i\377\214\231g\377\222\236p\377\222\240u\377\225\243|\377\244" + "\261\222\377\250\265\235\377\267\301\262\377\306\315\306\377\306\313\311" + "\377\323\327\327\377\327\330\332\377\323\322\322\377\311\304\277\377\304" + "\274\266\377\271\254\243\377\302\272\264\377\271\256\245\377\252\232\214" + "\377\252\223{\377\270\245\217\377\264\237\217\377\203ie\377t`\\\377[EC\377" + "wfd\377vkm\377znu\377\202t}\377\217\201\212\377\231\211\224\377\232\207\222" + "\377\222\200\216\377\255\236\252\377\274\255\264\377\304\265\273\377\252" + "\230\242\377\233\207\222\377\257\233\237\377\320\303\305\377\271\254\267" + "\377\240\236{\377\225\260H\377\202\261\064\377\200\260\036\377x\251\003\377u" + "\243\003\377l\226\001\377j\223\002\377{\242\001\377\205\256\007\377\206\264\016\377" + "\206\260\031\377\255\315;\377\201\263\002\377\177\250\002\377\177\247\002\377{\244" + "\002\377y\242\002\377w\237\000\377\215\273$\377\227\304\067\377z\252\003\377z\247" + "\001\377\200\257\002\377~\255\004\377o\236\002\377\203\256\002\377\204\255\003\377q\236" + "\002\377m\235\002\377y\252\001\377u\247\002\377k\237\003\377t\252\003\377y\247\002\377" + "\206\263\002\377z\246\002\377o\237\002\377Hw\002\377\\\213\001\377d\225\003\377c\226" + "\014\377\224\306<\377\214\276\065\377\210\264\026\377\201\247\003\377q\241\002\377" + "p\237\003\377c\204,\377Yo\064\377alI\377KDN\377=\064?\377G=J\377RET\377@\060=" + "\377-\033(\377NAL\377\216\207\225\377\232\221\236\377\217\205\223\377\213" + "~\217\377\203u\205\377\221\200\216\377\312\273\301\377\272\251\254\377\272" + "\247\250\377\254\230\235\377\236\212\224\377\276\257\265\377\262\241\251" + "\377\252\227\240\377\257\235\236\377\242\224\222\377\266\250\237\377\213" + "uh\377qWM\377pTC\377\206gO\377\207jV\377\216q`\377\241\215|\377\234\215z" + "\377\230\222v\377\230\227t\377\211\211`\377}}N\377oo=\377tvE\377\203\211" + "W\377\205\216\\\377\210\220d\377\232\245~\377\250\261\224\377\251\262\233" + "\377\266\274\255\377\276\304\273\377\303\306\300\377\307\307\306\377\326" + "\326\326\377\316\312\311\377\310\301\275\377\273\256\246\377\257\235\217" + "\377\264\246\234\377\247\222{\377\275\250\235\377\242\205e\377\231}d\377" + "\215wo\377\202pk\377\203wt\377\201xu\377shj\377\211z\200\377\207w|\377\212" + "x~\377\235\213\222\377\256\240\250\377\217\200\212\377\252\232\244\377\261" + "\243\254\377\261\241\251\377\253\232\242\377\237\216\226\377\240\216\226" + "\377\263\242\250\377\324\310\314\377\257\245\216\377\236\257[\377r\243(\377" + "\226\303N\377s\246\010\377o\235\001\377n\233\002\377e\220\002\377\177\242\002\377" + "\221\270\034\377\207\266#\377\247\311J\377\233\277'\377|\252\000\377\211\263" + "\001\377\207\256\000\377\230\265\024\377\231\266\034\377|\244\000\377\177\253\011" + "\377}\254\002\377~\250\002\377z\245\001\377\204\264\003\377\201\261\003\377t\241\002" + "\377y\243\002\377z\245\002\377o\234\002\377w\250\001\377z\254\001\377}\260\003\377r\241" + "\001\377u\250\001\377n\236\002\377\204\261\001\377x\245\001\377k\232\002\377k\232\001\377" + "t\244\005\377\214\274\"\377\220\300&\377s\252\016\377b\235\005\377\215\272\017" + "\377x\252\005\377k\240\020\377\177\226V\377\200\201\203\377\237\234\242\377" + "\220\207\217\377ymt\377XHT\377=+\071\377;)\063\377cT]\377qfn\377gZe\377{p\200" + "\377\203w\207\377\207y\212\377\214~\217\377\213}\215\377\246\227\241\377" + "\305\265\264\377\254\230\232\377\241\215\217\377\220}\206\377\270\250\254" + "\377\274\254\261\377\254\233\242\377\266\243\251\377\262\242\242\377\236" + "\216\217\377\214\177~\377\245\227\221\377\227\203t\377jL\063\377iO\067\377" + "ubO\377\\H;\377dND\377^K=\377XF\064\377P@)\377aV\070\377bV\064\377uoI\377\207" + "\207\\\377\212\214b\377\221\224k\377\214\216i\377\224\227w\377\244\247\217" + "\377\235\237\212\377\245\247\224\377\237\234\214\377\265\262\251\377\271" + "\263\257\377\304\276\276\377\273\256\250\377\265\241\220\377\255\227\203" + "\377\240\203h\377\241\207v\377\222va\377\231|a\377\214wh\377nS<\377n[M\377" + "zfb\377\244\226\223\377}qs\377{po\377\212{|\377\223\204\207\377\221\203\206" + "\377\220~\201\377\220~\203\377\242\222\234\377\240\220\232\377\232\210\222" + "\377\267\253\260\377\266\251\257\377\226\205\217\377\241\220\227\377\255" + "\232\236\377\313\300\300\377\274\267\252\377\227\253i\377i\234\027\377t\246" + "\032\377y\253\034\377n\241\003\377o\241\002\377g\221\001\377y\240\001\377\226\274\064" + "\377t\243\012\377\262\320M\377\205\256\010\377\200\255\003\377}\254\001\377{\250" + "\002\377\201\251\002\377\212\255\004\377~\245\002\377i\230\001\377s\243\001\377\200\254" + "\002\377u\243\001\377y\250\002\377w\252\001\377r\242\002\377w\250\002\377w\246\002\377" + "u\244\001\377u\250\002\377{\257\012\377w\246\013\377{\253\007\377v\247\002\377w\251" + "\003\377v\243\001\377y\251\001\377_\214\001\377v\251\012\377\224\306%\377\206\267" + "\022\377{\253\001\377]\221\001\377W\215\001\377_\227\004\377d\200>\377LJR\377\063#" + "\065\377\067!\065\377_KZ\377\226\214\224\377\270\261\267\377\206|\203\377E\066" + ":\377/\033'\377P,\377j_O\377uog\377pjf\377aZZ\377" + "i^Z\377\217~y\377\204qj\377\211ys\377\220\200|\377\233\213\207\377\220}z" + "\377\264\245\242\377\231\214\225\377\206w\202\377\243\227\236\377\260\246" + "\252\377\232\213\224\377\226\204\216\377\246\221\225\377\310\273\274\377" + "\273\265\265\377~\232j\377t\234:\377o\236\021\377r\241\007\377v\245\003\377u\245" + "\001\377r\242\013\377~\260\071\377l\234\000\377\253\303\062\377\206\252\010\377s" + "\240\001\377s\241\002\377p\242\001\377q\236\001\377~\250\002\377\213\261\002\377\211" + "\255\001\377\202\251\002\377v\242\002\377z\244\002\377~\252\011\377y\247\004\377t\243" + "\001\377u\250\001\377q\243\001\377j\235\002\377o\250\002\377u\250\001\377s\242\001\377" + "g\230\002\377\\\220\001\377\200\257$\377r\244\013\377\206\265\021\377\222\302\035" + "\377\203\265\024\377[\213\000\377x\242\001\377\205\260\001\377t\241\002\377p\243\010" + "\377Ts\071\377?V\061\377$%\031\377\017\013\006\377\015\011\003\377\007\006\002\377\000\000\001\377" + "!\037!\377\000\000\000\377\000\000\000\377%!$\377\012\005\011\377$\040&\377'\024#\377i[h\377" + "zk{\377\203u\204\377\203w\204\377\223\206\225\377\246\232\242\377\317\302" + "\305\377\313\274\275\377\230\200\206\377yem\377\212v\200\377\264\244\253" + "\377\250\227\236\377\253\225\233\377\272\244\241\377\232\203\200\377\241" + "\212\205\377\226\203}\377uc_\377M\071\061\377o^V\377\250\242\232\377\265\260" + "\247\377\210~h\377{oO\377ta?\377[@\027\377U<\022\377dR-\377aN*\377bN*\377l" + "`\070\377\204\202Z\377\206\206_\377\217\217m\377\233\234\177\377\227\227z" + "\377\213\206h\377\202yY\377\221\204c\377\201pQ\377udA\377\212y\\\377~nN\377" + "^I-\377W>#\377u]M\377gJ\060\377v`G\377\245\234\224\377\231\221\201\377\204" + "zi\377mbS\377cXQ\377i`\\\377od^\377~lg\377|jg\377\204sr\377\225\205\203\377" + "\203qp\377\206qo\377\254\235\233\377\203u\201\377\221\206\220\377\231\213" + "\223\377\252\235\241\377\234\215\224\377zju\377\215|\204\377\270\253\256" + "\377\302\272\276\377\177\225n\377~\240A\377}\245\026\377o\234\001\377r\240\001" + "\377z\255\001\377u\244\010\377z\255\026\377{\250\007\377\201\250\004\377z\241\001\377" + "\214\261\033\377r\236\003\377w\247\002\377w\243\002\377\213\264\001\377\215\261\002" + "\377\212\255\002\377\207\256\002\377\202\252\001\377p\233\002\377x\242\014\377\212" + "\265,\377|\253\014\377y\251\001\377|\257\001\377s\240\001\377z\251\003\377x\245\001" + "\377q\236\001\377g\227\002\377i\233\006\377\211\265%\377\213\271\060\377~\261\026" + "\377h\233\005\377i\231\001\377p\234\001\377\201\253\002\377\220\271\003\377s\237\035" + "\377Zz+\377?S(\377\061@\036\377\012\012\003\377\000\000\000\377\000\000\000\377\000\000\000\377\015" + "\015\016\377\004\004\004\377\000\000\000\377\001\001\001\377\001\000\001\377\020\015\020\377\002\002\003\377" + "\001\000\000\377;-\071\377xgv\377zlz\377\217~\221\377\217}\216\377\243\222\235\377" + "\324\312\312\377\264\240\241\377\220{{\377lZb\377\212z\201\377\266\246\254" + "\377\261\240\243\377\303\263\261\377\301\255\250\377\266\235\221\377\231" + "~s\377\226|q\377}fa\377l[U\377g]T\377k`M\377{nU\377\177pT\377\215~b\377\210" + "y^\377q_?\377]G!\377\\D\032\377aK\037\377iV&\377m^,\377\200xI\377|tC\377wp" + "B\377\177xQ\377~xS\377\214\205`\377\206~X\377xkC\377\201uN\377\203zW\377" + "\205}^\377\233\226~\377\236\231\206\377\224\212w\377\235\223\200\377\232" + "\214u\377\237\224~\377\227\213x\377yl[\377bSA\377^UC\377PC/\377XJ;\377cV" + "L\377xmg\377\203tr\377wdd\377vef\377\204qs\377\224\200\201\377\256\240\240" + "\377\204x\201\377\204y\203\377\233\216\226\377\240\221\232\377\232\212\224" + "\377veq\377\223\201\207\377\263\247\247\377\310\304\305\377\221\241\201\377" + "m\227)\377n\231\010\377s\236\003\377t\232\003\377\213\267\032\377x\250\003\377{\251" + "\001\377k\237\002\377h\233\001\377w\247\000\377\260\277\061\377\216\246\024\377q\232" + "\001\377\177\252\002\377\203\261\002\377}\242\002\377\220\264\002\377\213\261\001\377" + "{\244\002\377u\240\003\377z\245\010\377x\246\012\377k\234\002\377z\257\002\377y\250" + "\002\377s\236\002\377\177\253\003\377z\246\001\377i\230\002\377j\231\002\377w\241\003\377" + "y\244\002\377u\246\004\377v\256\006\377e\220\002\377q\230\001\377\205\253\001\377\214" + "\261\000\377\211\265\017\377f\215\037\377Vi\063\377+>\015\377\040\062\012\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" + "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377!\027\036\377h[g\377\200q\177\377" + "\237\223\241\377\204v\206\377\251\233\243\377\303\267\270\377\244\216\221" + "\377\204pv\377mYe\377\224\204\211\377\270\251\254\377\264\242\246\377\263" + "\233\232\377\271\242\231\377\267\237\224\377\237\203|\377\235\204\177\377" + "\200h`\377aH>\377ZA\064\377n_E\377sfG\377\204zX\377\242\237\204\377\243\241" + "\210\377\227\224w\377\200uT\377\203vS\377\210|U\377\203vL\377\213\204Z\377" + "\212\205Z\377\213\205]\377\213\204_\377\177vO\377xk?\377m]/\377iY.\377pb" + "\067\377skB\377}zZ\377\226\227\204\377\223\216|\377\237\235\213\377\250\246" + "\224\377\240\235\210\377\213\200k\377Q<'\377VD\066\377eVO\377O>'\377XH+\377" + "^O/\377]J,\377eT:\377\217\200x\377\210xx\377\177nl\377\202pn\377\214|x\377" + "\210sq\377\236\215\212\377~pz\377\215\201\212\377\246\231\241\377\221\201" + "\213\377\237\222\231\377rdn\377\215}\207\377\256\241\244\377\274\266\267" + "\377\226\243\205\377g\223\033\377e\224\003\377j\222\002\377p\225\004\377\224\272" + "\061\377\204\256\020\377~\251\002\377i\237\001\377b\230\000\377n\237\001\377\210\247" + "\021\377\276\311P\377|\241\004\377x\243\002\377{\253\002\377v\240\001\377\215\264" + "\002\377\202\250\002\377\200\246\002\377\204\254\002\377s\232\001\377y\245\001\377t\241" + "\001\377r\240\002\377o\234\002\377o\237\002\377y\250\002\377v\242\002\377s\237\002\377" + "l\232\002\377i\224\002\377u\242\001\377q\236\001\377r\244\002\377m\233\002\377\203\257" + "\003\377\211\262\003\377\222\272\021\377\213\263E\377\221\266V\377w\215d\377a" + "\202E\377\065M\"\377\034.\020\377\016\032\002\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\"" + "\035!\377b[c\377sds\377\230\212\235\377\204u\211\377\246\227\241\377\302\267" + "\266\377\232\210\210\377\213y\200\377s`m\377|jv\377\247\225\233\377\216z" + "\203\377\260\234\230\377\254\225\216\377\262\232\215\377\224zo\377\207le" + "\377oVO\377s\\S\377fRE\377\\N\066\377h^=\377ld@\377}wW\377\215\211k\377zu" + "Z\377}x\\\377\206|^\377|mF\377\215\202]\377\215\203\\\377|qI\377\212\200" + "\\\377\224\215n\377\203uP\377{kA\377m\\.\377hW/\377gW\061\377ujI\377\203|" + "b\377\203}c\377\202y]\377|rO\377xkH\377YF)\377maG\377K<\034\377RE'\377zqf" + "\377SC&\377P@\036\377VA!\377P:\031\377aO\063\377\204tc\377\226\213\213\377u" + "cb\377\213zw\377\220\177y\377\216xt\377\230\205\203\377wep\377\206u\201\377" + "\246\234\241\377\220\206\216\377\227\214\223\377k^h\377qcm\377\244\227\232" + "\377\274\270\272\377\212\227w\377e\222\035\377`\216\001\377p\233\002\377r\231" + "\003\377\225\273-\377|\243\001\377\201\257\003\377r\244\007\377r\247\017\377g\230" + "\001\377t\231\002\377\270\306S\377\214\256\033\377y\245\001\377o\234\002\377r\237" + "\001\377{\246\001\377\201\250\001\377\201\246\002\377\206\250\002\377}\240\003\377\211" + "\257\002\377\177\247\001\377w\241\001\377q\240\001\377w\252\002\377f\232\002\377w\244" + "\001\377~\244\001\377j\223\002\377q\227\002\377t\243\002\377v\246\002\377y\251\005\377" + "g\227\001\377s\243\002\377|\252\002\377u\241\002\377l\232\010\377c\215+\377=]$\377" + "Ms,\377Jb>\377WlL\377[mX\377XlW\377NcM\377N`H\377AR?\377-\066,\377\012\016\011" + "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377'#'\377JAI\377ses\377\225\207" + "\230\377\205v\210\377\270\255\262\377\271\254\254\377\245\224\224\377}kt" + "\377k[g\377\201t}\377\253\232\236\377\240\215\220\377\251\222\216\377\255" + "\222\213\377\274\242\225\377\220ra\377\225xj\377\220ti\377x^R\377iRA\377" + "N\071\036\377=,\013\377dW\064\377{rO\377\221\213m\377\214\204j\377}qW\377|lP" + "\377\203sU\377\210wZ\377\201pO\377\212yX\377\204rW\377\234\224\200\377\231" + "\221{\377\211|b\377\221\207m\377\211\201h\377\207\201h\377\212\206m\377\203" + "ze\377\204{e\377\200xZ\377YO$\377_R(\377reF\377gZ\064\377[M%\377Q@\030\377" + "rdP\377@/\013\377VC\040\377ZD#\377\\E(\377yfP\377wdT\377~oj\377\210yy\377~" + "je\377\206pi\377\224\200y\377\227\203\201\377wfr\377\215~\207\377\252\236" + "\244\377\235\220\227\377\235\217\227\377l^j\377\203u}\377\230\213\215\377" + "\265\256\264\377u\211X\377_\212\022\377_\214\001\377x\244\022\377u\243\011\377" + "|\247\013\377y\244\001\377u\245\000\377\203\265)\377\201\265\063\377g\236\017\377" + "}\250\004\377\207\252\014\377\240\270\035\377\214\256\002\377\201\245\002\377|\243" + "\001\377k\231\002\377x\243\002\377}\243\002\377\217\261\002\377\215\255\002\377p\230" + "\002\377u\236\002\377~\252\001\377~\254\001\377u\245\002\377Y\216\002\377l\230\002\377" + "v\235\001\377q\230\002\377u\234\002\377z\252\003\377p\231\003\377x\240\001\377g\236\003" + "\377t\247\001\377z\246\002\377u\234\002\377x\240\002\377W\201\003\377;a\003\377#H\002\377" + "\036\064\004\377\013\013\006\377\004\004\003\377\001\001\001\377\001\000\001\377\000\001\001\377\003\011\003\377" + "(\067%\377b{^\377w\222y\377AQ?\377\015\023\011\377\035\037\023\377==\066\377<:<\377" + "kbn\377\215\177\220\377\216\177\217\377\264\251\255\377\270\254\253\377\240" + "\216\217\377\211w~\377m\\g\377\202v|\377\267\252\254\377\234\206\216\377" + "\244\215\214\377\226yq\377\256\225\211\377\237\201p\377\221qa\377~bO\377" + "rWB\377fN\066\377UB\"\377C\064\020\377?\061\017\377J\066\026\377kV\070\377n\\B\377" + "\213\205v\377\230\224\205\377\211\200m\377\215\200k\377\231\214w\377\241" + "\226\201\377\232\216w\377\215\201i\377\241\234\210\377\243\241\215\377\235" + "\234\207\377\223\220y\377\224\216t\377\205}[\377ykC\377kZ\061\377sd<\377]" + "H\033\377Q\071\014\377sb=\377l^\064\377VC\033\377G\063\020\377]L\070\377G.\024\377" + "K\063\025\377M\066\027\377q^D\377zfT\377r]Q\377\202oi\377zgb\377\230\207|\377" + "\223\200u\377\205qn\377\226\207\210\377udp\377\200q|\377\223\210\216\377" + "\232\220\224\377\220\205\214\377fYe\377o`k\377\240\224\231\377\261\254\260" + "\377s\211X\377a\212\037\377f\222\027\377i\230\010\377x\250\010\377v\244\003\377" + "v\241\001\377{\246\007\377\200\261\032\377t\250\013\377l\243\006\377e\234\002\377q" + "\237\002\377\200\247\011\377\230\267\013\377\231\267\002\377\225\265\002\377m\232" + "\002\377u\241\002\377\205\260\002\377\223\270\002\377\212\254\001\377i\225\002\377x\242" + "\002\377\206\256\001\377\202\254\002\377u\242\002\377l\232\002\377c\222\001\377y\245" + "\003\377u\237\001\377p\233\002\377t\237\002\377w\233\001\377}\241\003\377g\240\006\377" + "u\250\001\377y\245\002\377}\247\001\377z\242\002\377]\211\001\377Ak\004\377%@\002\377." + "\063#\377!%\026\377\016\016\013\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" + "\000\000\377\000\000\000\377\000\000\000\377\011\015\011\377:J#\377`l;\377@G*\377;<\064\377l" + "gn\377\224\210\224\377\207}\210\377\255\244\250\377\272\257\260\377\233\214" + "\216\377xjo\377^PZ\377{ms\377\260\244\245\377\246\225\230\377\243\220\213" + "\377\212ql\377\272\245\235\377\240\202q\377~XB\377yT?\377V\063&\377Z=,\377" + "s^E\377mW\070\377S<\033\377G/\013\377K\064\023\377xhR\377\202ub\377wiV\377\225" + "\217}\377\220\211v\377\230\221\200\377\235\226\204\377\250\241\216\377\243" + "\236\211\377\223\214q\377\221\212m\377\215\204d\377ykE\377xgB\377vb\064\377" + "lV%\377gP#\377\\D\031\377aK!\377ziB\377\177qF\377fP&\377B*\013\377\060\027\003" + "\377ZA\063\377W=,\377pYC\377\202nX\377\213xj\377fMC\377pYP\377nUN\377\206" + "oj\377\237\212\202\377\202ka\377\231\206}\377\235\220\214\377~v{\377\212" + "\201\210\377\235\221\230\377\241\226\234\377\205x\202\377`S`\377l_j\377\241" + "\232\240\377\244\243\246\377i~\071\377`\202\025\377x\244@\377`\216\002\377|\254" + "\005\377v\243\001\377y\247\002\377z\250\006\377w\246\004\377t\241\000\377}\256\005\377" + "i\235\001\377k\225\001\377|\242\001\377\210\251\002\377\214\255\001\377\214\257\001\377" + "y\241\001\377v\240\001\377\201\250\002\377\203\247\002\377\205\250\002\377s\233\001\377" + "~\247\002\377\210\264\002\377}\250\001\377x\242\002\377x\245\001\377m\232\001\377{\245" + "\004\377}\250\020\377x\245\002\377s\232\002\377l\217\002\377\207\246\002\377n\251\003" + "\377k\237\002\377k\232\002\377k\233\001\377g\231\003\377]\221\001\377Hx\003\377\031+\005" + "\377'\060\030\377MOE\377,**\377\012\007\010\377\000\000\000\377\000\000\000\377\000\000\000\377\000" + "\000\000\377\000\000\000\377\001\002\000\377\011\027\002\377,D\010\377\060I\010\377\062E\020\377=" + "H)\377rtq\377\232\221\231\377\221\206\216\377\221\205\214\377\261\245\244" + "\377\211y\177\377hX`\377UHP\377\221\206\212\377\252\240\243\377\243\224\227" + "\377\235\212\204\377\215yl\377\253\227\212\377\257\224\206\377\203]I\377" + "\222o^\377\205h\\\377t]R\377nWA\377xaD\377u`;\377hR*\377aI#\377eN+\377Y:" + "\030\377wbK\377xiS\377\177pZ\377\215\177h\377\177pT\377\230\216t\377\226\212" + "n\377\204vR\377\205wU\377\222\210i\377\216\206f\377\214\203e\377\221\206" + "h\377\223\204f\377\202pW\377\224\203o\377\215}a\377xdB\377hM-\377;\040\006\377" + "@'\015\377A'\015\377{fR\377s\\@\377jR<\377oZK\377yf[\377aKG\377eOI\377oWQ\377" + "\241\213\203\377\210lg\377\203bZ\377\232\203\200\377\233\221\223\377\205" + "\200\205\377\230\224\230\377\252\242\245\377\252\237\244\377\216\200\211" + "\377VGR\377gXe\377\230\216\226\377\236\233\235\377{\210S\377g\201\060\377" + "{\251F\377f\234\006\377p\236\002\377\177\252\002\377z\245\003\377y\244\002\377s\241" + "\003\377t\237\002\377\200\250\001\377|\252\004\377j\226\002\377w\240\001\377}\241\003\377" + "\177\243\001\377\200\244\002\377\177\245\001\377\177\246\003\377\201\251\002\377s\232" + "\002\377\177\243\001\377\200\244\002\377\207\260\002\377|\251\002\377w\246\001\377r\234" + "\001\377v\244\000\377\212\256\016\377l\222\002\377|\252\027\377r\240\002\377w\236\002" + "\377|\237\002\377\177\241\002\377p\253\011\377U\200\000\377Z\204\002\377Y\206\002\377" + "[\220\006\377\\\232\006\377S\211\004\377\020\034\003\377\000\000\000\377\023\022\016\377\"\034" + "\025\377\013\012\006\377\000\000\000\377\000\000\000\377\000\000\000\377\001\001\001\377\007\014\001\377\027" + ")\001\377&E\003\377\066^\011\377;e\020\377Mr&\377.A\030\377_[Z\377\220\203\215\377" + "\214\200\211\377\231\216\224\377\276\263\262\377\220\200\203\377g[d\377O" + "@K\377QDH\377\236\223\222\377\247\227\226\377\243\217\213\377\200kd\377\231" + "\204y\377\262\235\221\377\237\201t\377\201aS\377mOA\377I*\036\377hO>\377r" + "X?\377|gI\377v`;\377lW-\377r\\/\377oV)\377~iA\377u_\071\377~jH\377\210yY\377" + "\231\217q\377\235\224x\377\241\231}\377\216\202b\377\215\200a\377\205z]\377" + "\211~d\377\200s\\\377\177r`\377\213\177p\377\222\206z\377~oZ\377|jJ\377Q" + "\071\024\377:!\005\377F.\020\377\\H#\377nX\066\377\231\210s\377{gK\377nYE\377v" + "cQ\377]L>\377aQB\377bL>\377zaT\377\220{l\377|bT\377\200fW\377\273\262\252" + "\377\222\205\210\377\200pz\377\210}\202\377\227\216\220\377\216\205\212\377" + "i^d\377L?K\377d[d\377\226\214\225\377\207\206|\377l|M\377k\225>\377t\251" + "M\377i\240\021\377i\227\001\377t\237\002\377x\241\002\377w\237\000\377\200\254\016" + "\377v\236\003\377\206\250\002\377\230\274\026\377|\250\010\377t\240\002\377~\250" + "\002\377y\237\001\377\220\256\002\377~\240\002\377\205\254\001\377\203\253\002\377\200" + "\247\001\377\202\247\002\377}\243\001\377\204\255\002\377m\233\002\377z\256\016\377" + "{\254\012\377m\226\002\377\207\251\011\377\210\254\015\377\177\254\017\377k\227" + "\002\377\205\252\006\377r\226\002\377{\245\004\377b\243\013\377`\230\015\377Z\206\004" + "\377_\215\001\377Y\212\002\377]\224\000\377[\231\012\377/O\006\377\022\035\002\377\001\002" + "\001\377\000\000\000\377\000\000\002\377\002\003\001\377\006\011\002\377\005\007\002\377\012\030\002\377\031" + ".\002\377;X\006\377:_\003\377\066_\003\377=j\016\377=_\032\377\071D*\377a[^\377\213\177" + "\211\377\225\213\224\377\214\200\211\377\253\237\242\377\231\211\214\377" + "pdk\377ZOW\377d^`\377\203{z\377\231\215\216\377\273\254\246\377\237\210\201" + "\377\177rh\377\261\242\226\377\263\242\224\377\215r^\377v\\H\377|bT\377i" + "O?\377s^O\377xdN\377\206sU\377\205pK\377\222\177W\377\200k?\377oU&\377\204" + "oK\377zfF\377\205rV\377\201nU\377\236\224~\377\205tX\377\216\200`\377\222" + "\204c\377\215|Y\377\230\210h\377\206wU\377\203pU\377t`G\377fS>\377\\K\066" + "\377=*\026\377\061\035\004\377N\070\021\377eR%\377ub\066\377\215{U\377\217\177h\377" + "T<\036\377zeN\377bJ\066\377bJ<\377}f\\\377xaW\377\247\223\216\377w]V\377`F" + ";\377\204rj\377\274\264\254\377\212}\200\377\217\204\211\377\237\226\232" + "\377\230\217\225\377\211\201\210\377`Xa\377F?J\377`Ya\377\243\236\240\377" + "sx`\377l\216>\377\\\217\027\377u\252>\377j\235\006\377o\233\002\377k\225\001\377" + "~\245\002\377z\241\002\377v\235\000\377w\237\002\377\217\264\021\377\212\255\006\377" + "\207\256\010\377t\240\001\377y\244\002\377w\237\002\377\214\254\002\377\211\251\001" + "\377\207\250\002\377\201\246\002\377y\240\002\377}\245\001\377w\236\002\377|\250\002" + "\377b\222\002\377x\252\011\377t\234\001\377~\240\002\377\206\252\007\377}\242\005\377" + "\200\252\014\377m\225\002\377x\236\001\377y\235\003\377\202\253\025\377U\223\001\377" + "c\237\020\377a\232\012\377_\222\001\377c\223\001\377d\227\002\377Y\206\002\377\\\220" + "\011\377R\177\014\377#\067\002\377\023$\002\377\013\031\002\377\034'\002\377?F\013\377;H" + "\013\377\012*\002\377!E\003\377\067^\002\377Ly\003\377Nz\012\377t\246H\377\067R\021\377" + "?O+\377]`Y\377\200z\177\377\201w}\377|px\377\247\233\234\377\233\215\216" + "\377rfk\377SEQ\377LCK\377\214\205\204\377\252\236\234\377\273\256\246\377" + "\250\215}\377pZJ\377\217|p\377\302\266\255\377\234\205r\377z[B\377rS<\377" + "~`I\377oQ:\377mO?\377|cO\377\213wY\377\230\205d\377\222\200^\377\210uR\377" + "\206qO\377\202jF\377|b<\377\212rQ\377\206oL\377\206oI\377\202jC\377za\070" + "\377tZ\060\377\207uX\377\213|_\377vfL\377\\N\064\377\065\"\012\377\065\040\010\377" + "\066\040\004\377Q:\026\377r_\070\377\214zW\377\223\202a\377\206rU\377\201kV\377" + "kT;\377\\A*\377fK\067\377sZK\377|d[\377\233\213\204\377\232\213\205\377}h" + "_\377hRI\377\240\221\207\377\263\253\250\377|ou\377\214\202\206\377\211\177" + "\205\377\243\233\240\377\203\177\205\377UNX\377JAL\377h`g\377z|o\377kzV\377" + "g\231\064\377c\225#\377\202\261A\377n\232\004\377n\232\002\377p\222\002\377\224" + "\251\002\377\215\251\001\377x\231\001\377}\252\006\377{\241\003\377\205\253\002\377\205" + "\255\002\377|\246\001\377y\242\002\377z\242\002\377\201\244\001\377~\236\001\377\207" + "\252\002\377\202\247\002\377\177\244\001\377\202\251\002\377\215\270\003\377x\244\002" + "\377`\217\002\377o\237\002\377r\231\002\377\207\254\002\377p\225\003\377n\223\002\377" + "y\245\010\377c\215\002\377s\234\002\377\204\256\007\377x\237\002\377d\230\010\377c" + "\227\006\377\\\214\001\377Q}\002\377]\211\001\377^\206\001\377`\206\002\377Z~\001\377Y" + "\210\005\377=a\003\377%G\002\377\060J\002\377/B\003\377/?\002\377GV\005\377-F\002\377*O\003" + "\377\065\\\002\377Q|\002\377`\220\015\377X\205\031\377;c\006\377Ih\"\377m{_\377\205" + "\206~\377\204~}\377\201vz\377\246\236\236\377\232\217\217\377pbf\377I:D\377" + "<-\067\377WJM\377\201rq\377\241\223\216\377\266\243\225\377\201fV\377dNG\377" + "\236\213~\377\250\221|\377\211lP\377pL/\377}]@\377\205hN\377\177dJ\377mL" + "\061\377qR\066\377yaF\377\221\202g\377\226\213p\377\236\225z\377\247\236\204" + "\377\232\215t\377\231\211n\377\215|_\377\222\201d\377\230\210l\377\210vV" + "\377~jK\377vbG\377iS\070\377aJ/\377S>\036\377V@\033\377mY\067\377hP.\377[@\040" + "\377\231\205e\377\243\223u\377zdM\377v^D\377\203nS\377w[B\377^@)\377\210" + "pZ\377\237\211y\377\214uh\377\242\222\211\377]LF\377G\065\062\377\204rm\377" + "\304\275\271\377\222\210\207\377\204y~\377\226\214\217\377\237\226\231\377" + "\235\227\235\377oms\377@:E\377@\071F\377pmo\377ip\\\377m\206Y\377d\222\067" + "\377a\224(\377m\244\036\377`\220\000\377~\252)\377y\232\006\377\232\260\004\377" + "\215\251\002\377\200\245\002\377z\244\004\377n\224\002\377\200\245\002\377\205\251" + "\002\377\215\263\002\377t\235\001\377t\235\002\377~\242\002\377\204\251\002\377z\237" + "\002\377\207\256\001\377\177\244\002\377\211\260\001\377\204\251\001\377~\246\002\377" + "q\236\002\377a\216\001\377s\234\001\377w\235\002\377f\214\002\377l\221\000\377v\237\003" + "\377l\223\002\377r\232\002\377\201\247\002\377{\241\000\377\204\260N\377}\246\060" + "\377a\212\002\377Do\002\377Y|\002\377X{\002\377Rx\001\377\\\203\001\377Mv\002\377Jw\003\377" + "Ky\004\377Cd\002\377\064O\003\377\035\067\001\377)=\001\377:M\002\377>V\002\377\062O\002\377" + "\377e[b\377\204z" + "y\377\210xw\377\307\267\256\377\221wj\377^H>\377\201i_\377\215uh\377\227" + "{g\377\242\206j\377\234}[\377\207gE\377sS\066\377\201bH\377a@\"\377jL-\377" + "\177jK\377\201pT\377\221\210u\377\243\235\212\377\234\226\202\377\245\236" + "\216\377\240\233\214\377\243\233\214\377\235\223\204\377\223\206v\377\213" + "|l\377\224\205w\377\206sa\377\200nV\377\206tX\377\207oR\377z_;\377\203hH" + "\377\231\204b\377\251\234y\377}gP\377eI\065\377\216yb\377~iP\377fI-\377}a" + "G\377\241\213q\377\250\227\204\377\226\205s\377\217\202u\377A,$\377\\J?\377" + "\244\230\217\377\303\276\271\377\203\177\202\377\202{\200\377mck\377\213" + "\203\207\377\203y\200\377NDN\377JDL\377MIP\377ppm\377ahR\377{\235j\377Y\207" + "-\377d\225+\377a\226\014\377a\220\003\377p\232\012\377n\221\002\377{\244\002\377" + "y\241\002\377z\243\003\377k\223\002\377o\230\002\377}\250\002\377\203\254\002\377\207" + "\263\002\377p\241\003\377j\226\002\377\177\246\001\377\210\256\001\377\205\253\001\377" + "\202\252\002\377~\246\002\377\206\255\001\377w\234\002\377\206\254\006\377u\233\002\377" + "x\241\003\377w\240\002\377l\221\001\377m\224\001\377|\252\017\377\204\265\030\377|" + "\256\016\377\211\272\035\377\224\300)\377\215\270\036\377^\222\005\377p\233\012" + "\377r\226\007\377n\215\007\377`}\001\377_\177\001\377]\177\001\377Z\203\002\377Kt\002\377" + "It\002\377J\177\003\377Cj\002\377\060O\001\377@X\004\377\032\070\002\377\037<\002\377,I\000\377" + "\063W\001\377Mv\004\377\\\206\037\377Jj\002\377Yx\005\377]x\036\377Xe?\377poi\377\205" + "{\201\377\205z\201\377\225\213\215\377\232\217\217\377~tz\377_S[\377A\071" + ">\377\071\063\064\377]YU\377\177xv\377\272\255\245\377\253\227\203\377lP@\377" + "T\066-\377\203m`\377\264\240\215\377\253\226y\377\252\224v\377\231\177c\377" + "\207mS\377tU;\377fE$\377nP/\377bH%\377\201oP\377\215\177d\377\204uZ\377\210" + "}f\377\224\217\201\377\222\216\200\377\212\201r\377\232\221\204\377\243\235" + "\215\377\226\216z\377\227\211t\377\215|f\377\203pS\377q[\067\377\206nJ\377" + "\240\214k\377\257\242\205\377\242\222t\377{dK\377^A.\377w^I\377zcK\377nR" + "\070\377\200eM\377\237\213x\377\261\245\223\377\236\217|\377\220\201q\377" + "S?\062\377P<\061\377\214zj\377\271\262\244\377\244\233\223\377\205|{\377\220" + "\207\207\377\220\207\213\377\206{\200\377obl\377OEP\377F?G\377VRU\377qrg" + "\377brQ\377r\241S\377\\\216-\377b\227%\377T\204\005\377f\222\010\377g\215\001" + "\377k\223\001\377v\244\003\377\177\255\013\377y\246\004\377g\222\002\377x\243\002\377" + "\177\254\002\377\201\255\002\377t\243\001\377m\243\002\377l\232\001\377|\244\001\377" + "\210\256\001\377\201\247\002\377}\245\002\377|\247\002\377\177\247\001\377{\237\002\377" + "\210\254\002\377{\237\002\377\206\262\005\377z\244\005\377\204\257\016\377\224\275" + "$\377\225\277#\377\206\263\017\377\205\264\013\377y\243\004\377\207\265\033\377" + "\214\270#\377V\213\003\377\\\215\002\377Z}\001\377x\222\021\377]v\003\377^x\001\377" + "Zv\001\377^}\003\377Wu\002\377A`\002\377\"K\002\377<^\002\377Rk\003\377Z\003\377o\237I\377j\223>\377" + "_\210\030\377Hm\003\377Or\007\377Tv\006\377g\207!\377g\205!\377b\177!\377u\206U" + "\377_^O\377pmg\377vsn\377tqj\377\221\211\200\377\210\177x\377h^^\377g\\_" + "\377dYa\377ZRY\377GAD\377]XP\377\200zl\377\270\261\227\377\214\177a\377G" + "\060!\377V?.\377{fR\377\232\211{\377\212yh\377}jU\377\240\217y\377\227\204" + "i\377\205iH\377\201e?\377\210oI\377\206pJ\377\217\200]\377\177oK\377\211" + "{X\377\213\203^\377\200wU\377\215\206d\377\212\202a\377\222\215o\377\220" + "\207n\377\226\212p\377\200oK\377\177hC\377~e=\377\207tO\377\210uT\377\232" + "\211k\377\244\224z\377\257\242\214\377\267\253\232\377\252\235\213\377\231" + "\210v\377\203sf\377scZ\377K\066(\377fN\067\377\246\231\204\377\252\244\223" + "\377\203wk\377ynd\377ka[\377\177{v\377\213\211\207\377xtx\377d^g\377`Zc\377" + "igk\377ddc\377w|t\377bwS\377]\216\066\377My\002\377R\203\005\377Y\215\011\377f" + "\230\005\377|\244\004\377w\235\004\377u\234\002\377p\226\002\377r\231\002\377r\232\001" + "\377j\226\002\377\202\252\002\377\201\252\002\377|\246\001\377u\243\007\377t\246\031" + "\377\211\277U\377\201\255\021\377~\246\002\377n\230\002\377\177\251\004\377\207" + "\251\002\377\250\275\025\377\230\263\016\377\205\240\002\377\221\260\023\377\210" + "\257\010\377\204\251\020\377}\232\006\377\216\250\002\377\254\271\035\377\222\256" + "\003\377\201\242\001\377\206\257\001\377\200\251\001\377z\246\001\377T\203\002\377V\206" + "\006\377[\214\006\377@e\001\377[\207\005\377a\221\004\377Z\203\001\377`\207\006\377S~\002" + "\377Z\202\001\377Op\004\377Vs\002\377Gf\002\377\063S\002\377Dd\002\377Ec\007\377h\243\060" + "\377S\205\000\377Lq\003\377C`\001\377Tq\003\377Lg\001\377o\211'\377{\230F\377drC\377" + "VYE\377yvn\377yvo\377||s\377rph\377\225\221\211\377~vu\377WLS\377ZNW\377" + "nhm\377^[[\377_\\U\377\\XL\377\213\205r\377\250\241\207\377o_J\377M:\"\377" + ">)\023\377{pe\377\222\212z\377kXC\377uaL\377\231\211r\377\243\223y\377\226" + "\201b\377\202jB\377\207pI\377\210wN\377\212|T\377\221\206_\377~tN\377\207" + "\200^\377\203~Z\377}uT\377\215\205j\377\204uX\377\217\200_\377\204qJ\377" + "\210tL\377\204tK\377\242\224t\377\250\232~\377\264\252\226\377\234\215u\377" + "\264\250\225\377\237\222\200\377\221\202n\377\226\210w\377{na\377G\061+\377" + "T?\071\377\236\217}\377\265\253\235\377\233\220\207\377\177rl\377ped\377~" + "wu\377}xy\377c^e\377D;I\377H?L\377c`e\377||z\377lri\377s\201n\377f\213U\377" + "X\177!\377Z\213\010\377X\211\003\377`\216\003\377t\240\002\377\206\253\017\377r\232" + "\002\377x\244\002\377f\215\002\377\202\246\007\377\201\243\002\377|\236\003\377\205\257" + "\002\377\177\245\002\377\200\250\001\377p\237\007\377n\236\015\377\225\304n\377}\246" + "\024\377x\240\002\377y\245\002\377~\247\002\377\201\247\002\377\246\300\022\377\262" + "\265/\377~\230\004\377\236\277&\377}\253\006\377{\246\015\377\201\242\003\377\221" + "\252\001\377\242\250\025\377\226\257\011\377\206\251\002\377\204\257\001\377\203" + "\253\000\377\177\245\000\377a\222\001\377q\242\023\377V\207\002\377M~\002\377L|\003\377" + "Y\216\002\377W\214\002\377Y\217\016\377Y\213\026\377T~\023\377X|\006\377Kf\001\377b" + "\223\015\377En\001\377Z\201\012\377f\223*\377V\213\010\377W\215\003\377Hn\001\377" + "Pp\002\377Qp\004\377Oo\007\377t\223H\377[|\060\377Le%\377HT.\377Y[J\377kl_\377d" + "dZ\377{ws\377\207~|\377vlm\377ZMV\377f[c\377i^f\377\\RT\377kea\377}yn\377" + "xth\377\224\217z\377\251\244\210\377{mR\377cSF\377P>\065\377via\377\206ug" + "\377\202o_\377\207ue\377\245\226\202\377\250\234\201\377\224\204c\377\220" + "}Z\377\205sL\377\212|U\377\212\201[\377\211\201\\\377\212\177]\377\216\205" + "b\377\203vT\377\220\204f\377\206wW\377\223\205b\377\215}Z\377\235\216l\377" + "\237\220m\377\232\215k\377\245\230|\377\243\227\200\377\222\202j\377\221" + "\201j\377~l[\377\214~m\377uf]\377Q:\070\377bN@\377\227\211o\377\246\232\205" + "\377\237\226\205\377\200yn\377\200}v\377vtr\377xtu\377khi\377okn\377a^e\377" + "KIO\377\\]^\377pzo\377n}j\377bwZ\377e\234K\377Hz\004\377V\211\003\377b\226\005" + "\377g\231\002\377k\232\001\377t\244\005\377q\240\002\377t\245\004\377j\227\001\377|\251" + "\003\377|\234\000\377|\237\002\377v\236\002\377z\246\002\377n\232\002\377p\235\001\377" + "y\250\062\377\240\313\213\377z\250%\377\177\252\000\377m\232\002\377\200\246\002" + "\377\213\260\002\377\224\265\003\377\243\267!\377\227\265\036\377w\237\000\377u" + "\236\001\377z\247\002\377\201\252\002\377\204\247\002\377\216\255\016\377\224\266" + "\012\377\211\262\002\377|\244\002\377\235\273\026\377\212\246\001\377b\232\006\377" + "g\233\020\377]\215\002\377X\214\002\377Y\217\004\377^\222\004\377X\211\001\377N|\003\377" + "S\200\007\377a\216\020\377p\221\"\377Ru\002\377Py\002\377e\230\004\377k\226\024\377" + "m\236\035\377e\225\002\377\\\215\001\377V\212\001\377Hr\002\377Jq\003\377`\204,\377" + "Y\177)\377Qq!\377Og#\377EU\040\377bfJ\377ij[\377xvl\377}tp\377\210~|\377n" + "ad\377eW]\377pdl\377S@N\377WJO\377j`^\377rog\377||r\377ywk\377\224\216v\377" + "\236\225v\377{qY\377L<\060\377D\060-\377mZV\377\230\215z\377\216{k\377\215" + "{h\377\235\216z\377\241\224{\377\240\222u\377\224\206e\377\222\203d\377\205" + "vY\377\217\203g\377\217\204g\377\223\210k\377\207y\\\377\224\214q\377\213" + "\203e\377\234\222u\377\215\177]\377\243\225s\377\225\206b\377\212xR\377\204" + "pK\377\205qO\377\222\201i\377\235\220|\377\217\203w\377vi]\377O\071\061\377" + "M/(\377\235\216|\377\256\243\222\377\225\210y\377vk`\377xpk\377spn\377zz" + "z\377utw\377^Y\\\377B;C\377TNU\377baf\377pss\377qys\377m\201l\377_\203R\377" + "X\215\"\377T\205\001\377\\\217\004\377Y\211\003\377b\231\007\377c\227\006\377u\236" + "\020\377q\236\002\377t\242\003\377s\240\002\377p\233\001\377\207\260#\377v\237\002\377" + "i\224\001\377s\241\002\377c\223\002\377p\237\002\377e\226\002\377\222\302z\377\200" + "\264\065\377y\243\000\377\204\250\001\377\220\262\003\377\221\270\001\377\207\260" + "\002\377\207\253\006\377\256\302C\377\204\245\014\377w\233\001\377\204\254\002\377" + "\212\257\002\377\217\255\012\377\211\245\004\377\217\262\001\377|\241\002\377\177" + "\244\004\377\215\242\016\377\214\245\001\377_\227\004\377a\230\004\377]\223\002\377" + "R\206\001\377U\211\002\377]\221\003\377W\204\001\377Ot\002\377Y\200\002\377Z}\002\377U" + "w\001\377Nr\001\377Qw\002\377Ow\000\377a\224\007\377\\\216\002\377s\241\002\377e\224\002" + "\377`\222\002\377X\220\004\377l\233=\377Y\177'\377X}\032\377b\206*\377Zx&\377" + "Xo,\377aoC\377tzd\377vvl\377xso\377|sq\377znn\377|tt\377zps\377jad\377ul" + "g\377H>?\377\\XT\377lja\377oh^\377_TB\377\205}`\377~sR\377\177pV\377n\\L" + "\377YIE\377D\062*\377rdV\377ygV\377\177kX\377\235\220\177\377\236\224|\377" + "\235\220u\377\236\220p\377\206wW\377\207vY\377\207x\\\377\211y\\\377\177" + "lO\377\221\203e\377\223\207f\377\212|[\377\214|Z\377\210wR\377xe:\377wb\066" + "\377\217\177\\\377\230\210l\377\222\207q\377\231\220\200\377i^Y\377QCA\377" + "H\067\061\377\217\177b\377\261\246\221\377\235\221\202\377\215\203x\377\216" + "\205~\377jaa\377zyy\377wxx\377]^a\377C>D\377*\040*\377RQQ\377]_[\377rxv\377" + "{\206|\377s\216l\377b\230G\377Jz\000\377b\230\006\377^\223\003\377\\\221\001\377" + "e\234\016\377h\233\021\377u\241!\377n\233\002\377\177\253\004\377w\246\003\377[\204" + "\000\377v\247\034\377m\232\005\377l\227\004\377p\236\001\377v\250\020\377{\252\002\377" + "o\233\001\377n\241\014\377y\255\022\377u\236\001\377\211\251\002\377\231\263\010\377" + "\244\300\010\377\204\246\000\377\221\260\026\377\215\250\"\377\270\315n\377\201" + "\243\006\377\202\246\002\377\210\250\000\377\232\252\017\377\213\235\001\377\233\273" + "\001\377\211\254\001\377\204\252\002\377v\231\001\377\206\250\002\377e\234\014\377c" + "\231\012\377^\222\002\377Z\214\002\377a\221\003\377b\216\003\377e\212\003\377_\200\002" + "\377Su\002\377[y\002\377Vr\001\377[{\002\377`\210\002\377i\223#\377]\213\016\377Nu\005" + "\377v\241\005\377T\202\002\377\067d\000\377^\212'\377o\234\064\377S\200\000\377v\241" + "\020\377\223\265\022\377\237\301(\377\214\260Q\377g\202:\377`tB\377~\200v\377" + "\201\200|\377\205\202\177\377\210\205\200\377\204\204~\377\214\222\210\377" + "fa`\377?\060\066\377<\061\064\377PIK\377d[[\377phc\377uo`\377rjQ\377\201zZ\377" + "\247\237\204\377\227\211l\377fVC\377SB\065\377\067$\036\377QA;\377dSG\377uh" + "[\377\217\202o\377\214zf\377\240\220w\377\215|[\377\210y[\377\200sX\377}" + "oS\377\200pQ\377weB\377\203sO\377\212{W\377vbC\377\202oQ\377\207uZ\377\232" + "\212r\377\224\204p\377\225\207v\377ti`\377bVT\377L=?\377jZN\377\231\211n" + "\377\261\246\213\377\237\221w\377\215\201k\377\202{j\377ytk\377\204\205\200" + "\377{\177|\377rtt\377YZZ\377QTQ\377\\dU\377bp[\377\\gX\377mzk\377o\210m\377" + "Eu%\377P\207\036\377^\220\001\377[\221\002\377V\213\003\377c\227\002\377c\224\013\377" + "g\227\010\377Z\201\000\377h\220\002\377\202\252\001\377~\251\020\377\201\262/\377" + "\203\261\063\377\202\260\063\377\203\254\025\377\204\261\040\377v\244\021\377" + "y\247\002\377h\227\002\377o\237\003\377|\264;\377}\257\026\377\214\264\002\377\204" + "\246\002\377\225\261\001\377\246\267\002\377\212\245\013\377\233\267<\377\244\302" + "U\377\223\267*\377z\237\000\377\216\257\005\377\246\263$\377\247\274/\377\231" + "\266\000\377\216\254\002\377\203\246\003\377\203\251\003\377\217\263\002\377_\220\001" + "\377Y\212\000\377M~\000\377U\204\000\377V\205\000\377a\217\003\377c\214\002\377_\203" + "\000\377_\204\002\377b\212\003\377X\177\002\377Y\204\003\377d\223\023\377Oy\033\377C" + "o\000\377h\212\036\377~\246\024\377O\200\000\377Z\211)\377Kp&\377U\202\001\377f\225" + "\003\377x\241\003\377\211\254\002\377o\220\010\377\216\260R\377u\226;\377Yv,\377" + "\205\213\203\377\227\236\225\377\221\227\217\377\221\224\217\377\201{\200" + "\377\217\207\211\377cW`\377B\062<\377NAH\377i^e\377\202v~\377\223\214\217" + "\377\206\204z\377yq^\377rkP\377\233\224x\377\246\240\203\377\234\221s\377" + "\213yb\377cQC\377\070&\040\377=+(\377K=:\377RD>\377]J@\377vgX\377m^O\377qe" + "W\377wiX\377\177p[\377\210wa\377\225\206l\377\220\201i\377\227\212t\377\206" + "xf\377{l^\377\211~q\377\207|s\377i[Q\377S?:\377I\066\065\377]LG\377\205vi\377" + "\240\223~\377\255\242\216\377\245\231\204\377\203qX\377\202t_\377vnd\377" + "\203~|\377\221\221\221\377~~\202\377NOT\377MVL\377Q^N\377BP@\377\070D\064\377" + "VfO\377bzU\377Sz?\377H~\032\377P\204\012\377V\213\003\377P\202\003\377W\206\002\377" + "i\225\002\377g\222\012\377a\217\001\377p\232\003\377l\226\002\377p\235\002\377k\225" + "\002\377z\247\007\377p\236\006\377h\235\010\377\207\262\067\377r\244\020\377j\234" + "\003\377\202\261\013\377m\236\003\377s\243\006\377\204\266:\377s\255\061\377\202" + "\253\001\377\201\242\002\377\216\256\002\377\212\250\002\377\256\267\007\377\244\300" + "M\377\215\260\031\377\210\260\040\377~\247\007\377\206\253\013\377\242\273,\377" + "\230\271\037\377\222\264\002\377\211\251\002\377\216\262\004\377\205\250\001\377\207" + "\251\001\377u\235\065\377\236\277v\377\302\333\270\377t\244\066\377\220\266M" + "\377m\225\025\377_\216\006\377\\\217\024\377S\205\005\377\\\221\004\377_\225\003\377" + "Y\211\001\377e\227\031\377En\000\377Ks\001\377U~\002\377n\241\003\377Y\211\030\377O|" + "\017\377W\211\005\377g\231\015\377V\203\001\377]\210\000\377V\177\000\377]\207\033\377" + "y\244<\377h\224-\377c\211\066\377o\212U\377~\205x\377\231\231\227\377\235" + "\233\233\377\233\230\230\377\223\216\214\377qim\377\\QV\377h`b\377ztw\377" + "\211\203\210\377\233\226\224\377\210\202x\377\212\203s\377\200u_\377\207" + "}b\377\233\223t\377\246\240\203\377\242\231{\377\240\221u\377|iX\377eOH\377" + "`MJ\377A*(\377G\060.\377L;\070\377A/*\377WG>\377M\071,\377^L>\377{jZ\377\220" + "\201r\377\207zj\377\202wj\377pe[\377UIB\377WHC\377^LB\377wfW\377q`Q\377}" + "j]\377\243\232\205\377\260\251\226\377\260\250\224\377\235\222~\377\201s" + "]\377\201s`\377\202ym\377\177vo\377\204~{\377\250\247\246\377\221\225\222" + "\377q}n\377PUO\377AEE\377ENE\377:L/\377>?\377>A=\377UjH\377W\177:\377N\203&\377F\210\016\377T\223\025" + "\377t\231\023\377c\216\004\377Q\201\001\377`\214\002\377_\211\002\377c\210\001\377o" + "\233\026\377\201\253\064\377\205\245\012\377e\222\002\377n\235\002\377j\236\014\377" + "l\243\002\377c\225\010\377^\221\005\377r\244\005\377x\247\012\377q\235\001\377w\253" + "\003\377t\251\030\377x\237\013\377\226\270W\377u\235\040\377|\251E\377\217\255" + "\005\377\223\262\003\377\204\244\002\377\203\244\003\377\253\312J\377\222\266\023" + "\377~\244\000\377\211\266\034\377\213\271#\377\207\262\010\377\215\270\007\377" + "\231\274\017\377\233\266\003\377\247\275\011\377\223\253\001\377\233\270\002\377" + "o\257\061\377[\221\000\377d\230\001\377Q\203\002\377Y\223\017\377O\205\002\377Ix\001" + "\377[\214\002\377W\213\002\377V\212\003\377T\205\004\377\\\225\013\377\\\217\016\377" + "S}\003\377Tz\001\377^\216\007\377_\221\005\377U\200\005\377Z\201\020\377o\236\016\377" + "h\227\005\377\207\241\017\377e\206\005\377f\210\002\377p\227\002\377Z}\001\377Y|\012" + "\377\067R\000\377Fb\030\377izN\377t}f\377\231\232\224\377\227\227\217\377\220" + "\217\207\377\202{x\377h]d\377lfl\377lgm\377\231\220\225\377\262\253\247\377" + "\252\244\234\377\221\216\201\377\220\213y\377\211\202j\377|tS\377\216\202" + "`\377~qI\377\213{Y\377\253\243\211\377\263\255\230\377\252\243\211\377\256" + "\244\216\377\241\222}\377\233\212w\377\237\216{\377\250\232\207\377\231\213" + "x\377\225\207u\377\212{m\377\240\222\203\377\247\232\213\377\234\215}\377" + "\245\227\200\377\254\234\202\377\251\230~\377\255\236\206\377\273\255\233" + "\377\277\266\244\377\262\252\226\377\235\225\201\377\224\212u\377\211}e\377" + "\227\216x\377\220\210u\377\224\217\201\377\211\207}\377\217\216\207\377\247" + "\250\242\377\235\252\224\377gw`\377bkT\377ScN\377bv`\377Hc\065\377\030=\000\377" + "+Z\005\377E\203\013\377B}\007\377\\\222\003\377\227\240\011\377X\204\002\377c\215\002" + "\377_\207\002\377a\211\001\377e\224\014\377R\200\003\377\206\256(\377c\214\001\377" + "s\237\001\377k\233\002\377l\243\023\377g\231\010\377d\223\003\377q\242\003\377p\237" + "\002\377\177\260\005\377k\233\002\377k\235\000\377\201\250\006\377w\246\034\377\203" + "\253\066\377\251\273W\377\215\253\037\377\250\267\040\377\215\251\004\377\210" + "\252\002\377\212\263\010\377\214\263\016\377\177\242\001\377\246\273\005\377\217" + "\274B\377\213\271\040\377\214\271\013\377\205\251\001\377\243\276\006\377\230\260" + "\002\377\220\252\003\377\231\263\002\377Z\220\001\377g\233\002\377W\211\002\377Y\216" + "\005\377_\224\003\377b\223\002\377V\210\002\377_\222\003\377^\220\003\377b\235\002\377" + "d\235\003\377]\227\002\377^\230\003\377R\210\003\377[\221\003\377d\231\012\377b\227" + "\006\377g\226\023\377e\227\007\377l\232\011\377\215\253&\377_z\002\377Z}\004\377q\213" + "\003\377p\212\002\377Ts\003\377\065W\002\377Cg\004\377-Q\001\377X\202\004\377_tD\377t|n" + "\377y{r\377\212\211\201\377\222\220\213\377\217\214\210\377XQY\377b[c\377" + "~w\177\377\230\223\223\377\270\263\254\377\237\232\217\377\217\210w\377\224" + "\215x\377\220\212q\377\215\202b\377\215}Z\377\221\203_\377\217\202a\377\227" + "\214p\377\245\234\202\377\253\244\215\377\267\255\230\377\260\244\217\377" + "\264\250\225\377\264\252\230\377\262\247\226\377\253\240\217\377\254\241" + "\222\377\251\235\216\377\232\213z\377\262\245\223\377\262\244\215\377\255" + "\235\205\377\264\242\211\377\247\223z\377\267\250\225\377\272\255\233\377" + "\232\215v\377\221\207r\377\231\222~\377\215\206p\377\223\215y\377\231\223" + "\204\377\221\220\205\377\213\213\203\377\211\211\200\377\241\246\226\377" + "\201\217u\377|\211d\377\201\177U\377Q[I\377)E\035\377.T\040\377p\227Z\377J" + "\200\021\377=p\002\377P\210\003\377[\222\003\377o\212\016\377c\203\003\377b\210\002\377" + "h\224\002\377e\222\001\377R\202\001\377M\200\002\377\204\254/\377b\212\000\377q\237" + "\002\377i\236\013\377p\247\023\377j\235\005\377s\241\011\377u\243\001\377t\246\002\377" + "q\242\003\377h\232\002\377m\236\004\377|\247\003\377n\245\024\377\210\266G\377\260" + "\313P\377o\234\010\377\234\263\022\377\250\265!\377\222\256\017\377\212\261" + "\024\377\221\271'\377\203\245\001\377\236\243\003\377\221\271\060\377\216\272:" + "\377\223\300\017\377\222\272\004\377\220\256\002\377\213\247\002\377\221\255\002\377" + "\222\257\002\377_\223\002\377m\235\001\377g\230\010\377p\230\011\377n\221\012\377" + "z\234\033\377_\213\005\377W\206\003\377\\\220\002\377^\225\002\377c\234\011\377Z\210" + "\001\377j\226\026\377s\244'\377^\220\026\377V\204\014\377_\217\002\377]\206\001\377" + "o\227\002\377{\230\023\377\205\243\030\377Mp\001\377Ln\002\377f\202\002\377m\206\002" + "\377Uo\002\377\065J\001\377;T\002\377Ff\003\377?c\001\377If\040\377Sa@\377ei^\377\177" + "~v\377\220\221\204\377\201\201w\377gfc\377cac\377a]a\377\233\227\225\377" + "\252\245\235\377\223\214\201\377\224\220\203\377\215\213{\377\231\226\205" + "\377\212\205j\377\206\200]\377\216\205c\377\217\205g\377\222\206j\377\204" + "uU\377\217\201a\377\241\225x\377\260\244\211\377\250\235\202\377\235\220" + "w\377\252\240\207\377\237\224\177\377\260\247\224\377\227\211u\377\224\203" + "o\377\247\233\206\377\266\252\223\377\250\231\201\377\260\243\214\377\254" + "\237\210\377\247\232\204\377\250\233\205\377\230\213u\377\221\205r\377\212" + "\201o\377\235\227\207\377\234\233\216\377\232\232\221\377\202\202|\377\207" + "\207\177\377\177\202t\377\216\241w\377\177\217d\377r\177^\377eoc\377G\\>" + "\377&K\015\377)V\003\377Fy\021\377n\232H\377J\201\014\377d\235\002\377[\217\020\377" + "x\241=\377o\217\012\377o\220\005\377d\222\003\377_\217\001\377Z\215\003\377Y\212\002" + "\377t\241#\377p\235\017\377p\243\010\377k\234\015\377o\243\010\377f\223\005\377" + "p\236\005\377w\245\002\377}\254\002\377{\255\004\377n\237\002\377\\\217\000\377\205\256" + "\000\377f\241\017\377\210\270G\377\224\273(\377x\243\002\377u\245\013\377\202\244" + "\000\377\225\257#\377\224\263#\377\223\271\063\377\203\250\001\377\222\246\004\377" + "\200\246\006\377\206\256+\377\207\262\011\377\204\251\001\377\217\264\002\377\214" + "\256\002\377\214\264\007\377\215\261\006\377a\225\003\377e\230\002\377Y\220\004\377U" + "\213\002\377U\205\001\377`\215\001\377Sq\001\377]\211\002\377^\216\003\377]\222\003\377" + "_\220\030\377\212\264T\377k\234\025\377`\222\001\377U\203\001\377Fp\001\377b\217" + "\002\377S|\003\377[\210\005\377\223\257>\377f\217\006\377W\201\002\377Z~\005\377i\223" + "\002\377Yw\003\377Xi\001\377do\007\377Vg\004\377Rm\006\377Km\011\377:\\\000\377Qr\016\377" + "\067H\040\377]kK\377|\206l\377\214\216\200\377\227\230\217\377kih\377ead\377" + "\221\213\213\377\205{w\377\216\204{\377\214\203y\377\206\177t\377\217\214" + "|\377\217\214u\377\222\215o\377\200zX\377\203~]\377\226\215k\377\204vP\377" + "\216~Z\377\216\200]\377\230\213h\377\230\215j\377\241\230u\377\234\222t\377" + "\242\227}\377\245\233\207\377\222\205s\377\226\212t\377\250\236\211\377\256" + "\241\213\377\253\235\205\377\253\235\205\377\227\213u\377\240\224\202\377" + "\207\177m\377\214\200o\377\215\205t\377\245\241\220\377\227\226\211\377\216" + "\217\205\377\213\213\203\377\177~y\377}}t\377\220\236x\377y\221V\377^qK\377" + "Q^K\377L]D\377.N\024\377+Q\004\377@m\005\377M\203\011\377?s\001\377\202\260R\377" + "a\232\001\377Bm\025\377\203\255O\377k\217\035\377X\177\006\377O\177\001\377_\216" + "\001\377c\225\002\377V\202\002\377V\202\000\377\231\302J\377j\231\010\377i\230\002\377" + "t\246\002\377w\245\002\377t\243\003\377l\232\002\377\200\261\003\377l\236\003\377l\241" + "\001\377W\217\017\377\222\270&\377r\246\024\377\215\276Y\377\224\273,\377\201" + "\246\000\377}\247\002\377\200\255\002\377\177\245\002\377\200\246\005\377\242\302G" + "\377\177\251\006\377w\235\001\377\220\261#\377\220\256.\377\206\261.\377v\237" + "\000\377\212\265\001\377\205\253\002\377\224\271\005\377\243\305#\377O\204\001\377" + "Z\217\003\377Z\221\003\377P\210\002\377Z\224\004\377W\213\003\377\\\215\000\377e\226" + "\007\377d\226\005\377Vx\005\377t\222\024\377c\217\006\377\202\240>\377a\205\010\377" + "_\207\004\377U~\002\377f\227\006\377t\251\036\377\204\261#\377\202\252'\377q\235" + "\010\377^\214\001\377a\214\015\377\\\212\000\377T~\001\377]\205\003\377_\206\002\377" + "[|\002\377Xw\004\377Ss\004\377Db\001\377;Z\001\377\063P\003\377p\224D\377`fS\377tvh\377" + "~\177t\377d^]\377tps\377uoq\377\240\230\223\377\254\245\234\377\243\236\222" + "\377\230\222\205\377{yk\377\204\203r\377\215\213r\377\217\212k\377\211\202" + "`\377\207\200[\377\212\203]\377\227\217j\377\230\220l\377\242\232{\377\223" + "\211j\377\232\224u\377\247\240\204\377\223\215s\377\234\224\177\377\206y" + "f\377\220\203p\377\226\212t\377\244\230\177\377\254\240\207\377\247\234\206" + "\377\222\207u\377~ua\377\226\221\200\377\234\232\213\377\230\230\212\377" + "\230\231\216\377\206\206}\377\226\225\217\377\212\212\204\377\177~y\377\201" + "\201z\377\215\244h\377k\177Q\377ERA\377/B&\377\062M\031\377,N\007\377Af\007\377" + "Fr\002\377V\214\007\377F~\003\377_\237\002\377d\230,\377[\204\023\377s\235D\377Mv" + "\000\377p\216-\377Ft\000\377]\213\002\377Y\211\001\377W\207\003\377`\222\002\377\226" + "\300H\377c\215\007\377h\227\001\377i\232\003\377u\244\002\377g\230\002\377i\230\002\377" + "x\254\002\377m\235\015\377b\231\000\377{\257<\377\234\306h\377\213\266\063\377" + "\217\272\061\377\206\260\022\377\212\257\031\377\244\300=\377~\251\035\377\216" + "\261\006\377\201\244\000\377\255\310N\377\317\326\217\377n\222\000\377\220\244" + "'\377\246\276M\377r\240\006\377\211\256\023\377\223\264\002\377\206\246\002\377" + "\214\257\001\377\227\273\030\377h\236\013\377P\206\001\377W\215\003\377_\226\003\377" + "T\212\002\377^\226\000\377q\243\034\377q\245\037\377\\\216\001\377}\223\027\377\257" + "\257F\377Z\203\001\377\\\212\017\377Rz\002\377d\217\015\377c\215\007\377s\244\003\377" + "q\234\002\377\233\272\066\377h\206\001\377l\220\003\377V}\001\377o\233\004\377m\232" + "\016\377h\216\013\377b\203\001\377]|\002\377Zw\002\377Vr\002\377Ee\002\377?a\002\377Cb" + "\002\377[~\004\377Lk\004\377!\063\006\377?K,\377prd\377\214\213\204\377\212\213\204" + "\377\210\203\201\377\232\223\224\377\225\222\220\377\235\234\226\377\203" + "\201x\377|{r\377ccZ\377\214\214|\377\221\216y\377\220\214q\377\224\217q\377" + "\206~\\\377\214\204`\377\222\214j\377\251\245\214\377\223\220t\377\222\220" + "s\377\217\214p\377\222\213n\377\225\211n\377\210y`\377\203r[\377\216~h\377" + "\245\232\200\377\240\230\177\377\232\223\177\377\230\221\200\377\240\233" + "\212\377\243\243\227\377\224\224\211\377\214\215\203\377yyr\377lkh\377on" + "o\377xxw\377YYY\377x\177h\377p\213N\377DND\377ES?\377)C\030\377+M\012\377?" + "k\017\377/Z\002\377=l\002\377M\202\010\377G\201\002\377\\\226\004\377Bl\022\377{\253" + "F\377y\244H\377Cn\000\377\245\274m\377d\222\017\377b\225\003\377^\222\012\377^" + "\226\020\377\\\222\002\377n\232\026\377\201\255'\377_\221\001\377l\236\002\377d\227" + "\003\377]\220\002\377o\242\002\377o\242\006\377\214\257G\377\223\277]\377i\235\014" + "\377\\\216\003\377~\262\030\377p\230\004\377\204\263\035\377\212\273L\377\227\305" + "h\377\231\304r\377\265\327\215\377\240\307F\377\221\267\065\377\245\272\071" + "\377\223\251,\377\250\272I\377\271\313`\377\276\320`\377\233\271/\377\211" + "\245\001\377x\226\002\377\212\254\001\377\242\301)\377V\210\003\377V\211\003\377c\223" + "\004\377\\\225\004\377]\223\005\377Y\217\000\377`\222\004\377e\224\001\377d\216\004\377" + "n\223\003\377h\214\002\377n\232\002\377h\231\003\377u\247\040\377\216\274J\377\201" + "\256\015\377}\244\002\377\224\264\022\377\224\261A\377Z\201\000\377a\215\002\377" + "p\232\012\377u\227\004\377w\222\003\377l\201\002\377l\200\002\377_p\002\377`p\001\377" + "J_\002\377So\003\377+C\000\377Jp\013\377z\237\036\377<]\002\377\031\065\000\377Oi%\377" + "dv?\377np_\377kjb\377}wz\377xmu\377ndn\377qfn\377^SZ\377>\070<\377>\071=\377" + "efc\377]^V\377\207\210t\377\227\225z\377\206\202`\377\213\210d\377\216\211" + "g\377\230\227|\377\177\207]\377\236\235\177\377\226\224v\377\234\226y\377" + "\201uX\377\207z\\\377\222\207j\377\237\230}\377\230\222{\377\233\225\201" + "\377\235\232\206\377\231\230\205\377\231\231\212\377\226\227\213\377\231" + "\232\220\377wwr\377^]]\377>==\377B?A\377JFI\377B>B\377\231\245v\377]bQ\377" + "-<\"\377(A\025\377(I\011\377\062Y\017\377*S\001\377\063d\006\377\067k\005\377Cx\002\377" + "U\224\005\377Cl\002\377Nt\000\377o\233+\377y\245M\377Q\203\000\377Y\212\024\377\214" + "\266Q\377S\205\002\377R\202\002\377S\201\002\377b\222\002\377e\226\015\377{\252&\377" + "j\236\001\377k\235\001\377`\217\003\377i\227\000\377v\246\001\377s\250\026\377s\247" + "\062\377f\233\015\377p\237\003\377m\232\005\377y\255\040\377v\232\003\377t\245\012" + "\377o\236\000\377\225\273?\377\300\341\224\377\215\271<\377\204\260\027\377" + "\204\263)\377\212\261(\377\254\306]\377\247\264?\377\214\257\030\377\207\256" + "\023\377\232\303B\377\217\267(\377u\217\001\377\202\236\002\377\236\301/\377`" + "\221\003\377\\\221\003\377\\\227\004\377`\231\005\377n\237\012\377\200\245\035\377" + "g\227\001\377Y\215\002\377X\212\001\377q\231\004\377p\227\002\377f\224\002\377g\231\002" + "\377u\251\"\377f\224\005\377m\230\001\377u\236\001\377s\233\006\377b\221\004\377a\221" + "\004\377a\212\003\377m\217\006\377k\212\002\377l\210\001\377x\225\003\377j\212\002\377" + "a\203\002\377a\201\003\377`\201\007\377h\216\007\377\\\203\011\377o\244\026\377Lk\012" + "\377Hf\020\377Xy\034\377" + "\071;\377\063.\060\377zx[\377\210\230h\377XdV\377\064K*\377\036@\010\377-V\016\377" + "\037L\002\377,\\\005\377:m\007\377F{\004\377X\204\012\377`\215\021\377Lu\010\377`\207" + "\013\377U\202\024\377~\261C\377U\210\000\377U\204\000\377\210\270G\377Z\213\004\377" + "Q\204\001\377c\226\003\377W\205\002\377`\215\012\377|\252\032\377l\242\002\377[\215" + "\002\377g\232\007\377\207\264\064\377|\254\012\377h\237\014\377`\227\020\377r\245" + "\004\377}\246\001\377z\252\037\377p\244(\377\202\235\001\377\204\264\060\377\242" + "\312^\377\260\323k\377\200\243\020\377v\244\004\377\214\275@\377\230\303T\377" + "\255\320g\377\204\261.\377\240\274\040\377\210\255\020\377\235\253\040\377\224" + "\273@\377\230\274G\377\225\264\021\377\217\260\002\377\227\302\070\377V\206\003" + "\377Y\223\011\377O\216\002\377W\222\002\377U\220\003\377Q\212\003\377U\214\002\377Z" + "\220\001\377\\\221\002\377^\222\001\377n\236\006\377t\247\024\377[\211\001\377i\233" + "\015\377g\224\002\377h\217\002\377b\206\000\377}\240\022\377\224\267\011\377r\237" + "\001\377j\226\002\377r\237\003\377i\221\002\377l\227\002\377q\225\002\377k\203\003\377" + "`l\002\377eo\002\377{\230\002\377u\235\002\377Sl\010\377l\217\034\377o\213,\377Ei\005" + "\377?`\001\377Np\022\377Pc\037\377!\060\006\377FN\071\377Z[S\377XUS\377skk\377\211" + "\203\200\377ka]\377H\071\061\377TF>\377L?\071\377_VO\377e^R\377uo\\\377\211" + "\210k\377\211\215g\377{\204S\377\210\212a\377~|V\377\222\222m\377\224\221" + "m\377\177|T\377\203\177W\377\233\232x\377\213\211k\377\220\220v\377\221\222" + "~\377\222\227\200\377\227\240\204\377\210\213x\377\226\226\211\377\233\234" + "\223\377\216\214\205\377zri\377tk_\377zqe\377~yn\377kh]\377\224\245r\377" + "ViB\377\067O\060\377>Y,\377\064T\024\377\032C\002\377\037Q\001\377;s\020\377A{\006\377" + "X\213\020\377p\231#\377Nz\031\377M\204\015\377I{\000\377b\226\031\377v\253\062\377" + "_\220\002\377W\201\001\377t\245\023\377^\220\004\377`\224\005\377K}\003\377U\203\002\377" + "m\235\011\377\203\262%\377c\224\000\377[\214\000\377i\233\006\377j\227\004\377t\247" + "\002\377i\240\012\377c\226\002\377\206\260\004\377~\246\012\377l\236\017\377i\242" + "/\377\226\276K\377\221\272I\377\201\256&\377\212\237\020\377\211\241\005\377" + "o\230\005\377\235\275O\377\221\257:\377\206\252!\377}\252\022\377\214\242\006" + "\377\203\236\004\377\213\254\011\377\325\336q\377\272\311>\377\224\260\005\377" + "\221\260\002\377\225\300=\377Bx\002\377T\217\004\377S\214\002\377U\215\002\377Y\221" + "\003\377]\223\002\377X\213\002\377p\236\027\377p\233\010\377f\225\003\377b\221\007\377" + "a\220\002\377\\\212\002\377W\205\001\377f\220\002\377X\202\002\377_\211\002\377\210\256" + "\005\377\221\263\002\377l\222\002\377r\232\003\377v\236\001\377z\245\002\377q\216\003\377" + "k\200\002\377hz\004\377jw\002\377x\206\005\377{\225\001\377g\210\011\377m\230\024\377" + "q\226\040\377Zl\016\377Tl\012\377Uy\012\377Oi\034\377\040.\000\377\061<\025\377js[" + "\377\202\204u\377{zn\377qh_\377}tm\377\230\220\200\377\225\210p\377\230\210" + "m\377\230\211l\377\213|c\377\202u]\377|w\\\377tuO\377v\200N\377\206\214b" + "\377\216\220n\377~}W\377\203\201Z\377\213\212b\377\203\201R\377\212\210^" + "\377\224\223q\377\214\214l\377\213\213n\377\201\201j\377\223\226\200\377" + "\227\236\201\377\224\232\200\377\225\226\211\377\230\231\220\377\211\206" + "|\377\216\206y\377\226\216|\377\235\227\206\377\214\211|\377\201\205o\377" + "\212\262j\377BY\064\377&?\031\377+K\021\377$H\010\377\"J\002\377J\001\377x\005\377;p\001\377e\230\027\377Z\217\003\377Q\204\001\377" + "Hz\002\377I{\001\377Z\212\002\377a\224\022\377l\226\021\377n\225\004\377`\212\002\377" + "l\227\003\377p\230\004\377i\231\007\377j\227\014\377\205\265H\377o\240\031\377\211" + "\265/\377c\227\014\377Z\211\002\377m\232\004\377l\231\002\377\220\257\003\377z\251" + "\002\377u\236\026\377q\240\035\377\212\271F\377s\242\032\377h\230\001\377q\240\001" + "\377\251\315\065\377n\237\016\377u\244\006\377k\230\003\377\204\251\001\377\230\262" + "\017\377u\242\016\377\225\270\066\377v\247+\377\230\271*\377\246\276#\377\245" + "\270\013\377\240\252\001\377\241\274\014\377\215\264\007\377\207\260\000\377\202" + "\257\003\377\\\233\003\377T\221\004\377O\206\003\377T\200\003\377Ao\001\377c\225\004\377" + "c\226\004\377d\221\005\377d\224\002\377X\205\002\377O|\001\377s\232\033\377g\221\012" + "\377a\211\001\377^\212\002\377`\212\001\377i\223\002\377}\247\004\377\205\244\004\377" + "z\224\003\377p\214\003\377h\205\001\377\221\234\023\377v\212\004\377z\231\002\377s\234" + "\005\377}\234B\377[x\011\377e\225\006\377Z\205\003\377[\210\007\377h\220\020\377_\203" + "\005\377Qo\002\377Sn\001\377^{\005\377H_\002\377:M\001\377FU\003\377\066F\006\377aj@\377z" + "{k\377\177\201t\377{zr\377gdW\377\201xe\377\223\214i\377\234\232e\377\237" + "\234_\377\236\217a\377\226\201[\377\203qL\377q`@\377wlO\377\202|_\377\205" + "\201b\377|yQ\377\201\200Y\377\220\220j\377\217\216i\377\221\220r\377\211" + "\211m\377\217\221|\377\221\222\204\377\224\226\211\377\222\236|\377ztn\377" + "qj_\377nf[\377WNI\377JFF\377B@B\377ivU\377^\205D\377}\253R\377Iv#\377\062" + "\\\016\377Kx\030\377\065f\005\377/e\004\377\066l\002\377N\201\006\377]\220\003\377P\203" + "\002\377Q\201\003\377[\216\002\377\\\220\002\377F{\001\377]\225\023\377_\221\012\377" + "_\217\004\377Fv\001\377t\235\003\377]\206\002\377^\221\015\377\216\274R\377n\235\004" + "\377T\200\002\377\212\271\067\377a\227\010\377m\227\010\377l\227\002\377\240\264" + "\014\377r\231\002\377p\243\012\377`\225\011\377t\247\040\377p\231\014\377\177\251" + "\002\377n\234\003\377e\226\001\377\230\300\040\377\221\271\064\377k\230\004\377k\230" + "\003\377\177\244\002\377\240\270!\377\200\247\016\377\226\272'\377a\224\004\377" + "\202\262\023\377\223\273\033\377\245\300\"\377\233\257\007\377\221\252\001\377" + "\213\260\013\377\210\265\022\377\272\320H\377L\210\001\377T\217\003\377L\205\002" + "\377R\213\005\377[\224\004\377b\223\006\377`\205\002\377o\222\004\377g\215\000\377X\203" + "\000\377]\207\010\377[\177\001\377e\215\005\377f\217\016\377i\223\012\377W\202\001\377" + "]\205\001\377x\241\013\377g\215\004\377j\212\003\377o\213\002\377n\215\002\377i\212" + "\004\377~\234\010\377\204\250\013\377|\241\"\377x\222\027\377]\205\003\377g\225" + "\002\377\\\201\001\377Ot\003\377^\213\023\377^\214\012\377^\204\010\377f\206\015\377" + "Xr\002\377Pi\003\377Ga\002\377G_\001\377?W\003\377F[\021\377fnH\377rsb\377ii]\377kk" + "`\377[[I\377s\200E\377\224\221e\377\241\224o\377\203pP\377nY\070\377ub<\377" + "ziC\377yjH\377{pS\377yqT\377{vV\377|yU\377\202\177]\377\214\214k\377\215" + "\216o\377\214\215t\377\225\226\204\377\213\213\200\377~}t\377\202\220f\377" + "pmZ\377icZ\377]ZT\377JGF\377KJJ\377RRO\377r\212U\377ZoE\377t\244O\377Gv\036" + "\377W\214&\377?u\024\377\067p\005\377M\212\004\377Q\210\004\377T\212\002\377W\212\002" + "\377Dw\002\377O|\002\377Y\212\003\377V\211\003\377J~\002\377X\224\020\377N\202\007\377" + "L}\003\377o\230\005\377o\233\004\377e\222\004\377s\242'\377m\230\016\377t\236\004\377" + "h\220\012\377\207\265\062\377Y\205\000\377o\222\005\377\226\255\007\377o\217\003\377" + "l\236\005\377s\247\063\377f\232\030\377d\230\007\377v\236\001\377z\240\003\377u\240" + "\005\377s\241\003\377\212\270\013\377\200\254\026\377\\\212\002\377q\234\001\377\177" + "\246\002\377\214\261\005\377\177\250\006\377l\234\005\377h\233\002\377}\257\015\377" + "\223\274\"\377\246\273$\377\273\311R\377\236\264\023\377\216\261\011\377\203" + "\257\027\377\216\261,\377H~\002\377M\205\004\377L~\003\377G\200\002\377j\246\015\377" + "`\231\015\377h\241\023\377|\254*\377\213\267A\377\205\265/\377\202\253\065\377" + "f\220\004\377j\224\004\377O|\002\377[\211\013\377X\207\001\377e\204\020\377\202\256" + "\004\377Y\200\002\377Y~\002\377_\204\003\377V{\002\377_\202\003\377\200\245\004\377t\234" + "\022\377~\222\032\377w\225\014\377e\216\003\377_\215\004\377\\\214\013\377S\202\003" + "\377Jo\001\377W\203\017\377o\240'\377^\202\002\377]|\003\377_\202\002\377Uz\003\377" + "X\177\005\377Oo\002\377Da\003\377DZ\016\377S[\060\377__H\377fiQ\377Yt\061\377ZXG\377" + "tlY\377iYD\377qcE\377{lG\377\221\201U\377\233\211^\377\202oG\377\177mL\377" + "m_B\377kbE\377\200z_\377{uX\377\202~a\377\222\220y\377\213\212v\377\207\207" + "y\377{yn\377eaX\377ekP\377x\205X\377\\UN\377eb[\377ec_\377`^W\377`bQ\377" + "q\215T\377w\233Y\377s\247C\377Ar\031\377\067i\020\377\066m\007\377D\201\005\377I" + "\205\002\377Bz\002\377C}\001\377Av\002\377\067l\004\377a\227\010\377L\202\003\377I}\001\377" + "K\201\001\377]\232\016\377>u\005\377k\230\005\377^\211\002\377T\205\003\377c\226\022" + "\377x\243\061\377r\232\006\377\207\250\003\377j\213\004\377\220\267\066\377b\215" + "\000\377\200\235\004\377\252\270\005\377f\224\002\377n\244\031\377\\\220\025\377v\253" + "\060\377u\241\001\377\201\245\005\377{\235\002\377z\242\003\377z\254\006\377\205\262" + "\002\377k\232\002\377`\222\003\377q\237\005\377\200\252\003\377\201\251\005\377}\252" + "\005\377i\235\006\377i\237\004\377w\242\004\377\255\311V\377\311\322a\377\256\304" + "@\377\234\271!\377\220\262\032\377\202\261$\377t\237\023\377v\244\030\377J~" + "\004\377Av\002\377;v\004\377\\\217\015\377v\252\"\377\232\307h\377\234\307k\377" + "\241\314v\377k\230.\377N|\000\377t\237\022\377f\226\007\377e\226\003\377b\230\003" + "\377]\222\002\377`\223\002\377\231\275\004\377r\222\004\377h\206\002\377l\211\002\377" + "s\221\003\377~\237\004\377o\231\017\377\205\247\037\377d\220\007\377g\224\014\377" + "h\225\004\377]\215\002\377[\211\016\377\\\211\013\377Rw\002\377Qy\005\377\201\253N" + "\377b\213\027\377f\210\024\377a\204\013\377Xv\001\377[y\004\377Ul\003\377GZ\001\377" + "HZ\007\377GV\022\377w\203H\377~\210Q\377qpX\377ZVI\377`YJ\377nfL\377\221\207" + "^\377\237\222e\377\222|P\377\222yN\377\217uM\377\217wS\377}jL\377aR<\377" + "rkX\377wr[\377\204~i\377\213\206u\377\205\200t\377yri\377[QJ\377KC\070\377" + "GD\066\377\205\227O\377wo_\377yrc\377yuh\377oma\377x\207^\377a\211=\377\204" + "\256[\377Ai\025\377\065\\\023\377.\\\003\377P\210\003\377Dv\002\377F{\010\377Av\005\377" + "N\202\002\377\061j\002\377L\201\003\377O\211\003\377O\210\002\377N\202\003\377K\201\002" + "\377Y\221\007\377t\240\006\377g\221\002\377X\204\001\377^\220\002\377q\251/\377e\232" + "\021\377x\236\004\377q\216\002\377l\207\014\377\221\272A\377c\215\000\377\253\267" + "\011\377~\232\002\377q\241\000\377x\252,\377y\252\031\377{\255\"\377\224\270\010" + "\377y\236\011\377\224\257\006\377\177\246\006\377\210\265\002\377\200\253\002\377" + "m\233\010\377_\222\002\377b\222\004\377\177\247\013\377\222\271'\377\206\256\036" + "\377q\236\003\377\243\270\027\377\232\260!\377\215\260.\377\200\244\022\377\233" + "\272&\377\216\256\025\377\212\253\024\377\243\304Y\377\203\257\"\377[\217\002" + "\377N\177\002\377I|\002\377Q\204\004\377L{\002\377o\235!\377x\250\061\377\234\304" + "i\377p\226-\377Z\206\002\377\\\205\005\377^\210\005\377m\211\004\377X{\003\377^\212" + "\005\377O\200\002\377X\221\014\377\242\305\002\377\202\240\026\377q\217\001\377z\231" + "\002\377u\230\003\377h\221\003\377\\\211\004\377s\246\033\377d\233\016\377`\226\011" + "\377v\244\035\377a\225\021\377e\222\036\377d\213!\377c\205\020\377]|\003\377k\217" + "\037\377s\227\065\377n\223/\377n\227&\377a\204\017\377^\200\014\377Yr\021\377" + "du\031\377@N\004\377Md\007\377r}\071\377\224\212h\377\205~b\377zx`\377xx^\377s" + "pW\377zsW\377qbF\377w_?\377\231\200^\377\242\211f\377\234\202a\377\216v[" + "\377XH;\377G<\061\377geX\377spd\377zsi\377|si\377wka\377fYK\377dXG\377woT" + "\377\203\235+\377vzS\377qsT\377so_\377xtf\377\213\242m\377W\204%\377w\251" + "K\377Ds\030\377Ar\016\377Z\217\004\377M|\001\377\070g\011\377Y\213\033\377L\177\002" + "\377I\177\002\377M\201\003\377F}\001\377W\215\003\377P\210\002\377_\220\002\377Z\204" + "\002\377s\240\005\377b\213\003\377f\216\003\377a\215\003\377[\215\002\377\\\231\025\377" + "e\234\017\377\222\260\011\377j\222\014\377c\214\003\377|\255\060\377\224\252\007" + "\377~\245\004\377m\233\002\377f\225\000\377\203\264\061\377|\253\013\377|\251\005\377" + "\202\252\002\377\204\245\002\377\241\270\005\377v\247\003\377\201\255\003\377\203\256" + "\002\377x\234\005\377i\224\007\377|\247\015\377}\244\003\377\205\255\000\377\210\261" + "\000\377\216\257\013\377z\236\004\377v\245\040\377\203\252\012\377\203\247\007\377" + "\252\300\031\377\215\252\004\377\230\263&\377\271\320w\377r\237\000\377`\205\014" + "\377_\205\003\377\\\200\003\377Z|\004\377Rw\003\377V|\003\377t\221\005\377]\201\007\377" + "e\212\004\377m\223\002\377e\215\010\377[\207\002\377e\213\006\377j\214\005\377r\232" + "\003\377W\203\003\377Y\202\002\377\246\310\007\377\202\255(\377r\236\016\377k\227" + "\002\377f\227\000\377k\233\012\377`\224\003\377`\221\014\377`\216\005\377i\225\010\377" + "`\213\006\377u\231\015\377\\\205\014\377l\240\067\377j\245E\377b\230=\377^\223" + "-\377\\\215\027\377Q\177\020\377Y\214\016\377X\177\020\377=V\002\377@P\001\377We" + "\002\377e\210\010\377fx\030\377qp\070\377\202}U\377\225\220k\377\220\213i\377" + "\204~c\377xk[\377|n]\377\212yb\377\244\217n\377\253\224r\377\242\213h\377" + "\240\207h\377\222zc\377PH=\377\027\022\020\377<\067\070\377RLE\377maU\377\203" + "vc\377vdO\377mWD\377]I:\377TB\066\377}\214=\377qrP\377am\071\377o\177E\377" + "h}H\377d\221>\377Bf\023\377\204\263R\377P\207\026\377;g\002\377J~\005\377o\001\377K\177\001\377J\200\004\377H~\003\377F~\001\377M\203\003\377]\220\003" + "\377c\222\003\377}\251\002\377g\233\031\377R\201\006\377U\200\003\377i\221\003\377t" + "\247\001\377l\232'\377n\240\023\377\226\267\004\377f\237\022\377P\207\007\377s\242" + "\017\377\241\254\013\377u\240\004\377n\232\002\377i\225\005\377\177\262\016\377w\251" + "\011\377w\247\004\377l\226\003\377\224\264\003\377\201\250\003\377w\246\003\377u\244" + "\003\377|\251\004\377d\216\007\377i\223\007\377\207\255\002\377\225\275\002\377\200\260" + "\013\377v\252\017\377k\237\032\377k\236\003\377{\255;\377\203\243\000\377\202\254" + "\021\377\211\255\006\377\221\261\013\377\246\303N\377n\222\005\377\207\250\012\377" + "q\212&\377Hh\002\377Zz\003\377Hr\003\377Uy\002\377Xy\003\377Gc\002\377i\215\003\377a\207" + "\003\377_}\003\377U\200\002\377U\202\006\377i\220\003\377k\212\002\377\202\245\002\377" + "j\211\004\377j\223\010\377\230\276\011\377j\224\010\377p\241\001\377e\227\007\377" + "w\250\065\377s\236\067\377k\225\033\377d\220\012\377c\205\003\377i\212\002\377q\222" + "\006\377f\217\003\377U~\003\377[\212\010\377Z\215\021\377c\230!\377b\235$\377Y\226" + "\030\377W\222\030\377N\206\012\377Y\220\020\377d\224\016\377f\212\016\377h\214" + "\020\377cz\024\377Wj\013\377Zk\026\377\233\234m\377\236\227x\377\225\207s\377" + "\241\220\201\377\236\215~\377\236\216}\377\226\205o\377\215y_\377\231\202" + "e\377\251\224s\377\245\220r\377\224}g\377OJC\377\011\007\005\377'\035\032\377\\" + "K?\377nXG\377x_J\377u[G\377zeU\377wh\\\377WJ?\377}\210T\377PY/\377DR$\377" + "Zt<\377X\213\062\377S\212+\377Z\204\063\377n\240\062\377Ct\007\377Y\221\022\377" + "\377w`<\377" + "n]\061\377hc*\377n{\065\377^w!\377u\224)\377W\202\020\377Jz\004\377T\216\010\377" + "V\215\024\377Z\227\033\377i\243\062\377f\242+\377`\230\034\377V\215\010\377W\214" + "\001\377M\204\005\377H\200\006\377O\203\003\377L\177\002\377Y\210\006\377U|\003\377u\243" + "\036\377S\213\003\377Q\204\002\377Q~\006\377y\242.\377\211\265D\377[\221\006\377n" + "\224\005\377\204\251\013\377\202\256)\377g\230\002\377q\245\005\377\201\250\004\377" + "\210\253\002\377`\217\002\377p\245\012\377\202\255\002\377z\246\001\377o\236\003\377" + "`\221\002\377\254\270$\377\201\240(\377\241\274\017\377\231\262\004\377\205\250" + "\003\377r\233\004\377f\215\001\377i\221\003\377{\242\006\377s\232\005\377t\233\002\377" + "}\245\013\377{\242\022\377p\233\014\377|\250\002\377o\230\000\377x\236!\377|\233" + "\010\377\213\254\023\377\224\276D\377\200\246\000\377\231\301Z\377\200\256\061" + "\377\227\270\025\377\203\237\004\377Pk\002\377V|\003\377=c\001\377Sp\002\377Zk\002\377" + "Nc\002\377]z\002\377j\202\003\377z\243\003\377o\224\005\377Z\220\012\377O\212\005\377" + "{\253\003\377t\246\002\377_\217\004\377]\213\002\377\232\277\002\377u\240\025\377[\211" + "\023\377e\227\013\377e\225\034\377t\243\037\377e\235\017\377m\237\"\377\206\260" + "N\377~\254C\377c\226\021\377m\230\025\377e\230\002\377_\220\003\377a\224\004\377" + "n\237\010\377m\231\022\377\221\262\067\377\260\303\064\377\254\275=\377c\231" + "\021\377Z\225\024\377a\236\026\377Z\223\007\377_\230\012\377W\220\001\377V\216\002" + "\377U\211\002\377b\217\011\377q\230\026\377g\221\015\377_\212\017\377b\205\034\377" + "i\202)\377|\214J\377\212\220c\377\223\225o\377\213\213c\377\213\201a\377" + "\215\177c\377W@\070\377zdR\377\250\225q\377}nC\377\207yL\377\205zG\377zx\071" + "\377gn\037\377j\203+\377Qt\015\377[~\026\377Hl\013\377Is\003\377m\245,\377k\243" + ".\377}\260J\377Q\210\040\377u\253A\377V\212\004\377Z\215\003\377M\177\002\377I~" + "\004\377\377j\206;\377l\207\061\377y\214;\377w\211\071\377Rf!\377?S\016\377`t\025" + "\377j\203\020\377o\213\011\377m\212\004\377~\225\004\377q\232\003\377\200\220\003\377" + "{\230\061\377\201\252L\377j\227\004\377l\235\023\377\203\250\061\377]\222\031\377" + "]\215\003\377m\232\030\377[{\034\377Fj\002\377@g\003\377By\005\377F}\012\377]\230'\377" + "l\252\060\377r\250\014\377]\214\003\377l\234\011\377a\215\007\377b\226\006\377~\252" + "\023\377n\234\014\377O~\002\377d\226\013\377W\207\025\377j\227\014\377\211\262\003" + "\377\\\214\011\377b\235\025\377\226\260\003\377k\225\007\377z\247\002\377\234\261" + "\025\377q\240\003\377f\221\005\377|\241\004\377x\236\002\377\\\206\002\377w\233\004\377" + "\206\245\002\377\210\244\004\377\223\255\010\377y\232\003\377|\242\013\377s\235\004" + "\377x\242\003\377\215\254\005\377e\217\002\377m\237\014\377u\233\000\377\242\264." + "\377\204\223\016\377\221\261\003\377\201\255\002\377t\252\026\377t\247\023\377\207" + "\270\060\377\205\260\037\377\211\267\021\377s\235\004\377\211\261\"\377\205\256" + "\024\377q\231\002\377ct\004\377u\230\005\377p\241\004\377j\225\005\377Z\210\004\377l\235" + ")\377v\237'\377_\202\005\377g\231\004\377L\201\001\377l\230\016\377Q\177\003\377N" + "\202\002\377b\233\002\377O\212\002\377_\226\002\377p\250\003\377O\202\001\377X\211\005" + "\377l\235\030\377p\236\063\377T\202\020\377T\203\007\377m\233*\377Z\224\007\377" + "L\203\002\377b\227\003\377T\207\002\377`\231\002\377d\235\014\377S\213\003\377P\204" + "\004\377J~\003\377V\213\003\377[\214\004\377`\212\002\377b\212\004\377w\236\012\377{\250" + "\016\377a\217\024\377Nu\003\377Nf\011\377IW\007\377\\o\010\377z\211#\377\220\241" + "I\377\207\252=\377\243\274X\377\201\222-\377x\213\036\377Qe\010\377`x\031\377" + "n\220\064\377d\204\032\377]\205\012\377\\\213\012\377U\204\002\377Gp\001\377Pu\000" + "\377R}\010\377q\232\023\377\223\265\061\377Rt\012\377`\214\000\377r\243-\377w\241" + "\071\377h\237\017\377X\211\014\377\177\233%\377f\215&\377M\177\002\377:j\000\377" + "Z\207!\377N|\012\377Cm\001\377H{\004\377a\001\377n\235@\377\223\304" + "o\377s\252K\377Dk\013\377Is\004\377m\232\010\377`\212\002\377c\216\004\377m\223\004" + "\377\224\265(\377\202\243\033\377\204\247\015\377d\237\026\377P\203\004\377V\206" + "\011\377X\206\012\377u\236\010\377\206\256\002\377\210\262\031\377\214\264\007\377" + "\214\240\015\377\211\252\005\377\237\267\034\377~\253\024\377\207\257\023\377m" + "\224\004\377z\237\004\377r\227\011\377i\223\011\377u\242\004\377\212\257\003\377\203" + "\247\003\377u\234\004\377z\242\002\377q\235\003\377u\236\002\377u\226\015\377u\235\006" + "\377f\225\003\377o\236\003\377{\245\006\377\220\264\010\377\214\252\004\377\206\252" + "\003\377\215\261\004\377\204\246\003\377[z\001\377\212\241\020\377\206\232\004\377\224" + "\246\005\377\226\263\024\377x\247\034\377\200\255\036\377s\236\000\377i\233\006\377" + "g\230\007\377_\227\005\377\\\214\004\377Fn\000\377V\206\003\377Aw\004\377R\207\003\377" + "f\232\005\377Y\204\002\377\\\215\003\377V\220\002\377f\234\003\377^\223\004\377_\216" + "\004\377p\237\004\377P{\003\377W\177\013\377b\221\004\377v\252\002\377P\204\003\377V\204" + "\004\377a\213\010\377P\201\000\377k\236\037\377b\217\027\377o\242+\377U\213\000\377" + "_\221\006\377Z\216\007\377X\223\007\377m\242\024\377o\241\013\377k\240\016\377z\254" + ";\377y\254?\377a\230\027\377]\220\007\377f\222\031\377Wx\025\377Nk\002\377q\225" + "\067\377o\241\065\377q\245\"\377z\254'\377Z\212\006\377]~\007\377]\210\022\377c" + "\221\025\377c\226\017\377Y\177\022\377_\220\006\377_\223\003\377O}\007\377c\221\030" + "\377v\243/\377\206\271/\377~\255'\377\223\266K\377\220\261K\377\227\276]" + "\377\237\311o\377\230\306k\377m\236\020\377h\230\016\377\210\257-\377\\\226" + "\012\377Y\216\023\377d\226\006\377Hs\000\377n\222/\377_\177\035\377Rl\004\377\202" + "\255G\377|\256P\377}\256=\377Kt\015\377a\217$\377t\244\011\377X\212\006\377S" + "\203\010\377a\222\012\377y\243\002\377\240\275\070\377Q\207\012\377j\237\013\377" + "h\227\021\377Kx\003\377m\243\021\377Y\211\006\377w\241\003\377\203\262\011\377\203" + "\260\005\377\177\246\014\377y\231\005\377\216\256\002\377o\222\003\377v\240\005\377" + "g\221\002\377\200\251\004\377k\227\006\377m\240\013\377h\231\004\377y\244\005\377\231" + "\300\010\377s\240\011\377n\230\004\377w\237\002\377e\221\002\377}\234\003\377\250\254" + "\024\377l\224\003\377k\232\003\377e\226\002\377\202\247\030\377\204\246\002\377\212" + "\253\003\377\217\262\004\377\227\270\003\377\221\262\003\377d\211\002\377k\223\003\377" + "~\240\004\377\227\245\006\377\220\237\006\377\222\255\015\377\214\257\015\377y\250" + "\007\377c\222\005\377[\213\004\377r\245\021\377q\253\030\377k\246\030\377Bv\001\377" + "@s\002\377J}\002\377S\203\003\377U|\011\377U\211\003\377c\232\004\377f\225\002\377W\210" + "\003\377h\230\002\377m\233\002\377Z\210\005\377c\222\023\377L\214\006\377p\244\003\377" + "l\236\003\377R\201\004\377M\177\002\377_\217\002\377^\215\002\377a\216\024\377o\243" + "=\377a\240\011\377h\241\034\377\205\270N\377b\236\026\377T\216\010\377i\233\016" + "\377_\222\003\377x\254/\377\200\265;\377d\234\014\377g\240\005\377e\230\001\377" + "X\207\013\377h\224\065\377f\222\026\377~\250\060\377~\255=\377}\255/\377q\234" + "\021\377t\240\023\377e\231\005\377\\\216\003\377a\225\004\377p\243\016\377o\243\016" + "\377}\265\061\377j\236\066\377\226\302v\377\220\276J\377q\243\035\377c\214\023" + "\377Vt\014\377u\235\061\377\210\264\\\377V\204\037\377Z\221\031\377\201\266;" + "\377z\257,\377w\250\025\377^\213\004\377V}\016\377l\223\012\377i\221#\377e\212" + "%\377]\200\007\377\177\252O\377_\222-\377v\244(\377Rx\022\377m\237\061\377W\204" + "\027\377m\232\003\377h\227\005\377W\203\006\377q\233\003\377\225\267\062\377s\227\020" + "\377n\233\034\377h\234\014\377i\233\011\377f\233\015\377g\225\026\377j\231\013" + "\377\205\266\003\377m\252\025\377s\245\010\377a\217\004\377o\237\004\377~\254\002\377" + "m\234\004\377\211\256\007\377z\240\010\377i\224\004\377y\242\007\377r\236\020\377n" + "\235\003\377\203\257\004\377t\244\007\377`\214\005\377s\236\003\377n\231\003\377l\226" + "\005\377\225\247\002\377{\236\024\377k\223\002\377t\233\007\377g\217\002\377~\253\005" + "\377p\233\004\377s\232\003\377\211\261\002\377\216\263\002\377\200\247\002\377\212" + "\260\004\377p\227\002\377\204\244\003\377}\224\003\377\243\257\002\377\242\271'\377" + "}\241\002\377t\241\006\377R\206\002\377Z\222\005\377O\205\006\377`\226\027\377w\247" + "-\377v\246\062\377[\216\"\377M\202\000\377>r\001\377W\205\005\377N\204\003\377W\212" + "\004\377o\240\010\377Kz\003\377d\230\004\377Y\213\004\377[\214\012\377Z\216\004\377F" + "~\002\377O\205\003\377{\254\002\377i\226\003\377R{\003\377X\214\003\377]\217\004\377Y\212" + "\013\377q\236'\377|\265;\377q\251-\377o\241+\377`\224\016\377L\202\003\377M\200" + "\003\377M~\010\377V\205\003\377d\213\023\377y\231\030\377p\235\035\377d\231\026\377" + "s\247)\377\\\220\021\377{\257<\377\201\260P\377]\224\010\377d\231\007\377a\231" + "\004\377h\242\022\377^\220\011\377t\241\024\377\212\264'\377k\225\013\377o\227" + "\024\377\207\252A\377\225\273P\377|\256\061\377k\235\035\377k\230\035\377}\245" + "/\377\201\260E\377r\247>\377e\231!\377^\220\022\377m\234!\377[\215\016\377" + "V\213\020\377b\227\026\377y\244\033\377~\247\064\377o\222\015\377u\243\066\377" + "Z\207\037\377|\255H\377W\177\037\377s\252*\377Rz\005\377f\223\"\377T\204\015\377" + "Gp\001\377[\204\002\377w\245+\377x\242\003\377v\236\023\377\204\250\024\377k\217" + "\026\377h\230\006\377l\236\031\377o\236\007\377q\234\030\377p\240\007\377\206\266" + "\010\377r\244\011\377h\246\036\377y\250\000\377i\226\002\377r\240\003\377\200\261" + "\003\377q\235\003\377\201\242\020\377\215\261\032\377q\236\003\377Zs\002\377l\230\003" + "\377r\231\003\377\214\263\004\377u\242\005\377n\230\006\377\203\245\013\377q\224\020" + "\377p\234\011\377\201\247\036\377u\241\013\377v\236\006\377y\243\001\377s\241\001" + "\377m\233\003\377]\212\004\377t\237\004\377{\245\003\377\222\267\004\377n\227\002\377" + "\204\246\006\377\204\246\005\377\227\266\013\377\220\252\004\377\231\257\005\377\270" + "\274@\377|\243\016\377p\233\001\377`\225\003\377a\225\002\377a\223\003\377T\206\004" + "\377X\216\003\377Y\220\001\377b\220\031\377\225\275`\377c\211\030\377T\204\003\377" + "H~\002\377V\212\003\377g\240\002\377M\205\003\377a\227\004\377Q\202\002\377Ky\002\377^" + "\212\014\377S\204\002\377U\207\003\377m\236\003\377^\210\002\377h\235\002\377a\227\003" + "\377L\205\003\377a\232\011\377h\240\021\377j\242\033\377}\260A\377\232\305h\377" + "g\237\023\377Fw\002\377Z\215\003\377V\213\006\377V\206\003\377f\235\012\377V\216\004" + "\377]\222\002\377U\213\002\377V\217\002\377^\226\003\377[\224\005\377R\213\005\377o\240" + "\033\377r\241\016\377a\214\015\377f\232\"\377b\226\011\377i\236\013\377o\236\037" + "\377{\250?\377e\221\027\377\225\267\065\377\200\244\031\377^\205\004\377t\241" + "'\377i\237\037\377k\240\"\377l\232%\377Fg\006\377^\216\024\377z\241\063\377\212" + "\235<\377b\220\031\377L~\003\377V\211\004\377p\235\016\377g}\035\377\207\264\065" + "\377z\246*\377}\264B\377^\215'\377l\221\062\377d\214!\377k\222\033\377Mu\010" + "\377@f\002\377Z\205\004\377v\244\"\377w\247\022\377m\224\001\377\241\272*\377h\213" + "\017\377^\214\011\377j\230\005\377\216\257#\377k\227\004\377\207\260\005\377\204" + "\255\007\377h\224\005\377f\235\021\377j\244\024\377|\252\002\377q\240\004\377\206\256" + "\004\377u\241\002\377h\224\002\377r\217\007\377\211\251\013\377j\227\003\377]\201\003" + "\377i\220\002\377\227\270\003\377p\227\002\377z\243\020\377u\242\001\377\177\255\031" + "\377g\221\003\377g\217\010\377g\215\012\377n\230\005\377\177\252\007\377y\242\014" + "\377{\243\025\377l\225\003\377f\221\004\377\210\261\004\377s\234\003\377\200\246\003" + "\377}\240\003\377\207\247\003\377\214\250\003\377\200\241\006\377\220\267\021\377" + "\202\245\003\377\242\261\031\377\226\260-\377u\236\002\377]\227\023\377Y\210\001" + "\377Nv\000\377_\202\017\377U\210\005\377]\231\010\377a\236\010\377Y\216\000\377_\223" + "\027\377W\214\006\377G\202\003\377b\226\023\377d\232\001\377[\223\007\377f\225\002\377" + "Q}\005\377Hs\002\377`\212\013\377S\200\004\377W\212\003\377X\212\002\377^\206\003\377" + "l\234\004\377n\245\004\377J\177\003\377i\235\007\377t\250\026\377|\260+\377u\253\065" + "\377\207\266L\377\225\300T\377\207\264B\377r\225\066\377^\201\023\377`\220" + "\021\377Iu\003\377L~\006\377R\205\004\377S\201\003\377]\221\015\377`\233\005\377M\201" + "\000\377_\224\005\377d\225\013\377`\220\011\377h\231\021\377\\\214\004\377h\241\017" + "\377b\227\012\377v\246\036\377k\231\035\377j\232\014\377u\245\022\377~\241\033" + "\377r\230\030\377\204\260Q\377\200\255J\377i\210+\377}\227A\377}\251A\377" + "\200\257I\377b\226)\377]\222\036\377\\\222\026\377F{\005\377\\\222\007\377v\245" + "\005\377j\225\011\377t\254\024\377^\214\020\377p\245\035\377Y\213\014\377u\246(" + "\377Z\212!\377R~\016\377F_\004\377JX\006\377h\216\007\377u\250#\377\214\261\001\377" + "\207\244\012\377\177\251\026\377l\224\024\377i\232\002\377t\251\035\377h\231\011" + "\377\204\260\005\377x\244\010\377\200\251\005\377`\216\011\377k\245.\377j\240\013" + "\377w\246\002\377\205\260\004\377w\235\004\377i\225\002\377v\235\003\377l\221\005\377" + "}\247\002\377u\245\006\377q\235\007\377r\232\003\377\224\265\010\377v\237$\377l\232" + "\012\377l\231\004\377~\254\002\377w\247\030\377r\236\015\377w\236\007\377{\243\004\377" + "u\232\004\377\212\261\032\377`\214\003\377\222\267)\377v\243\004\377\200\253\005\377" + "p\225\000\377\210\255\004\377\203\246\005\377\207\247\007\377\215\245\001\377l\212" + "\003\377~\225\004\377\204\242\010\377\222\261\010\377\211\247\024\377\220\262\016" + "\377=u\005\377[\216\"\377\213\271G\377Fw\005\377Dp\002\377:j\001\377b\231\013\377" + "Y\217\002\377Q\210\005\377o\250\005\377X\212\001\377p\244\030\377\\\225\001\377]\225" + "\007\377a\223\003\377Ls\005\377V\203\005\377U\202\005\377Xv\010\377c\223\004\377N\201" + "\003\377Y\213\005\377a\220\006\377a\215\005\377\\\213\003\377V\206\001\377~\251\061\377" + "\216\301F\377l\242\"\377\241\313i\377\211\267A\377\215\274L\377\262\334\214" + "\377h\215<\377h\214/\377h\240\007\377U\216\005\377W\216\004\377^\215\004\377Q\203" + "\003\377e\234\004\377s\254\034\377\202\262E\377z\244\060\377i\227\011\377e\223\013" + "\377d\225\013\377j\237\015\377c\222\017\377j\225\011\377\211\261\011\377{\245" + "\012\377\177\250\037\377\234\300c\377|\251F\377\204\251Z\377{\241G\377g\226" + "/\377R\206\015\377a\210\020\377dw\004\377\201\262\032\377\201\255\067\377x\247" + "\061\377r\251.\377i\233\017\377z\245\002\377q\243-\377l\240\020\377`\224\027\377" + "d\233\"\377d\234\030\377|\261-\377v\252(\377c\223\010\377[\205\005\377Nu\005\377" + "x\244\005\377\200\260\022\377x\234\005\377\204\245\023\377z\245\031\377m\233\005\377" + "q\233\005\377}\256&\377\204\260\005\377V\204\004\377z\247\015\377^\204\004\377g\222" + "!\377\211\265a\377\200\254\011\377}\253\003\377v\241\002\377n\230\004\377c\212\002" + "\377{\233\010\377\\\210\002\377r\243\014\377n\233\002\377q\232\002\377\201\250\005" + "\377y\231\016\377u\237\011\377\217\254\017\377\202\256\025\377\236\312Q\377\206" + "\261\061\377p\237\005\377{\245\013\377\234\274\016\377q\225\002\377\215\264\010\377" + "t\237\021\377a\211\005\377\214\271\022\377z\254\016\377}\254\034\377\231\273\016" + "\377\207\244\011\377\216\251\012\377\211\236\033\377\211\247\006\377Oc\001\377w" + "\233\003\377\211\261\017\377\205\247\013\377r\227\006\377[\207\003\377\200\246A\377" + "y\253\071\377d\221\034\377@c\002\377;a\002\377Iq\003\377W\211\005\377J\177\001\377g\231" + "\003\377Lu\004\377W\216\003\377b\242\006\377[\230\010\377P\203\000\377u\230.\377U\202" + "\005\377T\201\002\377Ir\003\377U\215\003\377I\177\003\377]\225\010\377Hi\003\377Vq\007\377" + "Or\002\377]\212\004\377;X\001\377^\207\015\377c\217\020\377w\253\032\377\203\270\060" + "\377\205\273\066\377\210\274\067\377r\244%\377Ms\015\377\177\241,\377a\213\023" + "\377l\244\025\377[\217\003\377c\234\004\377a\227\005\377j\234\005\377v\251\013\377" + "s\244\016\377x\247'\377y\245.\377q\242'\377o\237(\377g\226\036\377_\222\032" + "\377]\217\016\377`\222\017\377h\234\033\377Z\215\010\377\201\257\020\377\201\242" + "\040\377\177\253\037\377{\254%\377x\251\015\377~\246\013\377\206\254\031\377w" + "\246\020\377m\243\027\377d\231\025\377b\232\027\377W\213\011\377v\246\003\377]\205" + "\013\377e\225\013\377n\243\040\377z\253*\377X\211\020\377P~\004\377{\247=\377{" + "\245*\377Wz\006\377Qv\011\377\200\256\003\377p\240\001\377\240\272+\377r\243\027" + "\377\205\252\005\377s\240\004\377\214\264\004\377~\253\004\377^\216\020\377y\252\007" + "\377R\201\003\377h\230\027\377t\242%\377\231\300S\377\243\303!\377\234\271\"" + "\377\232\264$\377\207\240\021\377r\216\005\377\202\237\005\377h\226\003\377o\235" + "\013\377\206\254\003\377j\227\003\377\214\261\005\377y\241\006\377r\236\007\377\221" + "\262\014\377\205\255\016\377V\201\010\377}\247\015\377\216\261\013\377n\225\013" + "\377\220\265\007\377\205\260\005\377\210\256\024\377z\243\004\377x\241\003\377v\243" + "\010\377\215\267)\377\250\301.\377\252\302\033\377\222\257(\377\224\260\025" + "\377~\233\006\377\220\256\007\377\203\241\003\377\207\254\002\377y\232\002\377\212" + "\247\011\377\207\256\022\377", }; diff --git a/example/pointer.c b/example/pointer.c index a427f0f2..d97d253e 100644 --- a/example/pointer.c +++ b/example/pointer.c @@ -92,6 +92,18 @@ static void handle_pointer_axis(struct pointer_state *pstate, sizeof(sample->clear_color)); } +static void handle_output_add(struct output_state *ostate) { + struct wlr_output *wlr_output = ostate->output; + if (!wlr_output_set_cursor(wlr_output, cat_tex.pixel_data, + cat_tex.width * 4, cat_tex.width, cat_tex.height)) { + fprintf(stderr, "Failed to set cursor\n"); + return; + } + if (!wlr_output_move_cursor(wlr_output, 0, 0)) { + fprintf(stderr, "Failed to move cursor\n"); + } +} + int main(int argc, char *argv[]) { struct sample_state state = { .default_color = { 0.25f, 0.25f, 0.25f, 1 }, @@ -100,6 +112,7 @@ int main(int argc, char *argv[]) { struct compositor_state compositor; compositor_init(&compositor); + compositor.output_add_cb = handle_output_add; compositor.output_frame_cb = handle_output_frame; compositor.keyboard_key_cb = handle_keyboard_key; compositor.pointer_motion_cb = handle_pointer_motion; @@ -108,7 +121,7 @@ int main(int argc, char *argv[]) { state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); - wlr_surface_attach_pixels(state.cat_texture, GL_RGB, + wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); compositor.data = &state; diff --git a/example/rotation.c b/example/rotation.c index 892083e6..f4b7625e 100644 --- a/example/rotation.c +++ b/example/rotation.c @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) { state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); - wlr_surface_attach_pixels(state.cat_texture, GL_RGB, + wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); compositor.data = &state; diff --git a/example/touch.c b/example/touch.c index 7f4f3800..46eddf62 100644 --- a/example/touch.c +++ b/example/touch.c @@ -111,7 +111,7 @@ int main(int argc, char *argv[]) { state.renderer = wlr_gles3_renderer_init(); state.cat_texture = wlr_render_surface_init(state.renderer); - wlr_surface_attach_pixels(state.cat_texture, GL_RGB, + wlr_surface_attach_pixels(state.cat_texture, GL_RGBA, cat_tex.width, cat_tex.height, cat_tex.pixel_data); compositor.data = &state; diff --git a/include/backend/drm.h b/include/backend/drm.h index e001186d..10850d1f 100644 --- a/include/backend/drm.h +++ b/include/backend/drm.h @@ -73,10 +73,12 @@ struct wlr_output_state { drmModeCrtc *old_crtc; struct wlr_drm_renderer *renderer; - struct gbm_surface *gbm; - struct gbm_bo *bo_last; - struct gbm_bo *bo_current; EGLSurface *egl; + struct gbm_surface *gbm; + struct gbm_bo *bo[2]; + struct gbm_bo *cursor_bo[2]; + int current_cursor; + uint32_t cursor_width, cursor_height; bool pageflip_pending; bool cleanup; diff --git a/include/types.h b/include/types.h index efead03c..e2930a9f 100644 --- a/include/types.h +++ b/include/types.h @@ -11,6 +11,9 @@ struct wlr_output_impl { struct wlr_output_mode *mode); void (*transform)(struct wlr_output_state *state, enum wl_output_transform transform); + bool (*set_cursor)(struct wlr_output_state *state, + const uint8_t *buf, int32_t stride, uint32_t width, uint32_t height); + bool (*move_cursor)(struct wlr_output_state *state, int x, int y); void (*destroy)(struct wlr_output_state *state); }; diff --git a/include/wlr/types.h b/include/wlr/types.h index aae76f06..3afc361e 100644 --- a/include/wlr/types.h +++ b/include/wlr/types.h @@ -46,6 +46,9 @@ bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode); void wlr_output_transform(struct wlr_output *output, enum wl_output_transform transform); +bool wlr_output_set_cursor(struct wlr_output *output, + const uint8_t *buf, int32_t stride, uint32_t width, uint32_t height); +bool wlr_output_move_cursor(struct wlr_output *output, int x, int y); void wlr_output_destroy(struct wlr_output *output); void wlr_output_effective_resolution(struct wlr_output *output, int *width, int *height); diff --git a/types/wlr_output.c b/types/wlr_output.c index 20503030..8c21f706 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -91,6 +91,15 @@ void wlr_output_transform(struct wlr_output *output, output->impl->transform(output->state, transform); } +bool wlr_output_set_cursor(struct wlr_output *output, + const uint8_t *buf, int32_t stride, uint32_t width, uint32_t height) { + return output->impl->set_cursor(output->state, buf, stride, width, height); +} + +bool wlr_output_move_cursor(struct wlr_output *output, int x, int y) { + return output->impl->move_cursor(output->state, x, y); +} + void wlr_output_destroy(struct wlr_output *output) { if (!output) return; output->impl->destroy(output->state);