From 9d9a6d66d9355b4e392160c4bb3ae1eb52748b7a Mon Sep 17 00:00:00 2001 From: Anton Afanasyeu Date: Thu, 11 Jun 2026 18:37:48 +0200 Subject: [PATCH] sync --- .gitignore | 1 + app/src/main/AndroidManifest.xml | 11 + .../com/foxx/androidcast/IVpnService.aidl | 1 + .../com/foxx/androidcast/AppPreferences.java | 38 ++ .../com/foxx/androidcast/MainActivity.java | 24 + .../dev/DebugDeployWakeReceiver.java | 29 + .../dev/DevAdbConnectHttpServer.java | 34 +- .../androidcast/dev/DevAdbConnectInfo.java | 31 +- .../foxx/androidcast/dev/DevAdbMdnsProbe.java | 117 ++++ .../androidcast/dev/DevAdbWifiHelper.java | 50 +- .../androidcast/dev/DevAdbWifiKeeper.java | 17 + .../androidcast/dev/DevDiagnosticsProbe.java | 35 +- .../androidcast/dev/DevInstallWakeHelper.java | 94 +++ .../dev/DevNetworkSelfTestProbe.java | 62 +- .../androidcast/dev/DevVpnStatusProbe.java | 257 +++++++++ .../androidcast/network/BackendNtpSync.java | 151 +++++ .../remoteaccess/RemoteAccessCoordinator.java | 8 + .../remoteaccess/RemoteAccessService.java | 71 ++- .../remoteaccess/RemoteAccessStatusStore.java | 94 +++ .../vpn/AndroidCastVpnService.java | 7 + .../androidcast/vpn/VpnServiceClient.java | 12 + app/src/main/res/values/strings.xml | 4 +- .../network/BackendNtpSyncTest.java | 36 ++ .../20260602_REVERSE_SSH_proposals_summary.md | 15 + ...20260602_REVERSE_SSH_proposals_summary.pdf | 30 +- docs/20260607-2FA-email-mobile-auth-flow.md | 4 + docs/20260607-2FA-email-mobile-auth-flow.pdf | 34 +- docs/20260608_ALPHA_PRIORITIES.md | 9 +- docs/20260608_ALPHA_PRIORITIES.pdf | 16 +- docs/20260608_BE_SERVICES_and_infra.md | 15 +- docs/20260608_BE_SERVICES_and_infra.pdf | 14 +- docs/20260608_STREAM_DUMP_DEBUG.md | 8 +- docs/20260608_STREAM_DUMP_DEBUG.pdf | 12 +- docs/20260610_SERVICES.md | 23 +- docs/20260610_SERVICES.pdf | 26 +- docs/ALPHA.md | 8 +- docs/ALPHA.pdf | 14 +- docs/ALPHA_SOAK.md | 4 + docs/ALPHA_SOAK.pdf | 10 +- docs/AV_QUALITY_QA_SESSION.md | 4 + docs/AV_QUALITY_QA_SESSION.pdf | 18 +- docs/BUILD_DEPLOY.md | 6 + docs/BUILD_DEPLOY.pdf | 157 +++-- docs/COMMERCIAL.md | 4 + docs/COMMERCIAL.pdf | 10 +- docs/CRASH_REPORTER.md | 4 + docs/CRASH_REPORTER.pdf | 10 +- docs/DRs/20100611_3_url_shortener.md | 357 ++++++++++++ docs/DRs/20100611_3_url_shortener.pdf | 503 ++++++++++++++++ docs/GIT_FLOW.md | 6 +- docs/GIT_FLOW.pdf | 491 ++++------------ docs/GRAFANA_vs_others_graphvis_pivot.md | 4 + docs/GRAFANA_vs_others_graphvis_pivot.pdf | 251 ++------ docs/INFRA.md | 4 + docs/INFRA.pdf | 22 +- docs/OPEN_API.md | 4 + docs/OPEN_API.pdf | 16 +- docs/OPEN_TASKS_GRAPH.md | 8 +- docs/OPEN_TASKS_GRAPH.pdf | 159 +++--- docs/OPUS_SPEEX_VALIDATION.md | 10 + docs/OPUS_SPEEX_VALIDATION.pdf | 12 +- docs/OTA.md | 4 + docs/OTA.pdf | 16 +- docs/PRO_AAR.md | 4 + docs/PRO_AAR.pdf | 12 +- docs/README.md | 38 +- docs/README.pdf | 205 ++++--- docs/REMOTE_ACCESS_IMPL.md | 13 +- docs/REMOTE_ACCESS_IMPL.pdf | 184 +++--- docs/REMOTE_ACCESS_VALIDATION.md | 10 +- docs/REMOTE_ACCESS_VALIDATION.pdf | 12 +- docs/ROADMAP.md | 8 +- docs/ROADMAP.pdf | 28 +- docs/TICKETS_ROADMAP.md | 4 + docs/TICKETS_ROADMAP.pdf | 12 +- docs/USB_HDMI_CAST.md | 4 + docs/USB_HDMI_CAST.pdf | 10 +- docs/_pdf_build/build_all_docs_pdf.py | 30 +- docs/_pdf_build/git_flow_diagram_hotfix.png | Bin 116660 -> 116633 bytes docs/drafts/20100611_3_url_shortener.txt | 105 ++++ docs/specs/20100611_3_url_shortener.md | 441 ++++++++++++++ docs/specs/20100611_3_url_shortener.pdf | 540 ++++++++++++++++++ rebuild.sh | 21 +- scripts/adb-reconnect.sh | 347 +++++++++-- scripts/build-all-docs-pdf.sh | 15 +- scripts/generate-docs-toc.py | 66 ++- scripts/grant-dev-adb-perms.sh | 18 + 87 files changed, 4443 insertions(+), 1190 deletions(-) create mode 100644 app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java create mode 100644 app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java create mode 100644 app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java create mode 100644 app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java create mode 100644 app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java create mode 100644 app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java create mode 100644 app/src/test/java/com/foxx/androidcast/network/BackendNtpSyncTest.java create mode 100644 docs/DRs/20100611_3_url_shortener.md create mode 100644 docs/DRs/20100611_3_url_shortener.pdf create mode 100644 docs/drafts/20100611_3_url_shortener.txt create mode 100644 docs/specs/20100611_3_url_shortener.md create mode 100644 docs/specs/20100611_3_url_shortener.pdf create mode 100755 scripts/grant-dev-adb-perms.sh diff --git a/.gitignore b/.gitignore index 230d5da..dc48ed8 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ config.php.alpine out/ ota-publish/ .adb_connect_cache +.adb_http_cache/ # --- Scratch (not for commit) --- tmp/ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b85469f..cba764e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -177,5 +177,16 @@ + + + + + + + + + diff --git a/app/src/main/aidl/com/foxx/androidcast/IVpnService.aidl b/app/src/main/aidl/com/foxx/androidcast/IVpnService.aidl index fa2e1b4..35e004b 100644 --- a/app/src/main/aidl/com/foxx/androidcast/IVpnService.aidl +++ b/app/src/main/aidl/com/foxx/androidcast/IVpnService.aidl @@ -11,6 +11,7 @@ interface IVpnService { void registerStateCallback(IVpnStateCallback callback); void unregisterStateCallback(IVpnStateCallback callback); int getState(); + String getStateDetail(); boolean isVpnPermissionGranted(); void applyWireGuardConfig(String wgQuickConfig, IVpnOperationCallback callback); void tearDown(IVpnOperationCallback callback); diff --git a/app/src/main/java/com/foxx/androidcast/AppPreferences.java b/app/src/main/java/com/foxx/androidcast/AppPreferences.java index 9717331..00b032c 100644 --- a/app/src/main/java/com/foxx/androidcast/AppPreferences.java +++ b/app/src/main/java/com/foxx/androidcast/AppPreferences.java @@ -62,6 +62,9 @@ public final class AppPreferences { private static final String KEY_DEV_DIAG_PING_PONG = "dev_diag_ping_pong"; private static final String KEY_DEV_DIAG_PING_RESPONSE_MODE = "dev_diag_ping_response_mode"; private static final String KEY_DEV_BACKEND_NTP_SYNC = "dev_backend_ntp_sync"; + private static final String KEY_DEV_BACKEND_NTP_OFFSET_MS = "dev_backend_ntp_offset_ms"; + private static final String KEY_DEV_BACKEND_NTP_LAST_SYNC_MS = "dev_backend_ntp_last_sync_ms"; + private static final String KEY_DEV_BACKEND_NTP_LAST_SKEW_MS = "dev_backend_ntp_last_skew_ms"; private static final String KEY_DEV_REMOTE_ACCESS_MODE = "dev_remote_access_mode"; private static final String KEY_DEV_REMOTE_ACCESS_RANDOM = "dev_remote_access_random"; private static final String KEY_DEV_REMOTE_ACCESS_SESSION_ID = "dev_remote_access_session_id"; @@ -441,6 +444,41 @@ public final class AppPreferences { public static void setDevBackendNtpSyncEnabled(Context context, boolean enabled) { prefs(context).edit().putBoolean(KEY_DEV_BACKEND_NTP_SYNC, enabled).apply(); + if (!enabled) { + clearDevBackendNtpOffset(context); + } + } + + public static long getDevBackendNtpOffsetMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_OFFSET_MS, 0L); + } + + public static void setDevBackendNtpOffsetMs(Context context, long offsetMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_OFFSET_MS, offsetMs).apply(); + } + + public static long getDevBackendNtpLastSyncMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS, 0L); + } + + public static void setDevBackendNtpLastSyncMs(Context context, long whenMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS, whenMs).apply(); + } + + public static long getDevBackendNtpLastSkewMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS, 0L); + } + + public static void setDevBackendNtpLastSkewMs(Context context, long skewMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS, skewMs).apply(); + } + + public static void clearDevBackendNtpOffset(Context context) { + prefs(context).edit() + .remove(KEY_DEV_BACKEND_NTP_OFFSET_MS) + .remove(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS) + .remove(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS) + .apply(); } /** Debug builds: auto re-enable wireless adb after Wi-Fi reconnects. */ diff --git a/app/src/main/java/com/foxx/androidcast/MainActivity.java b/app/src/main/java/com/foxx/androidcast/MainActivity.java index e50a103..db618c8 100644 --- a/app/src/main/java/com/foxx/androidcast/MainActivity.java +++ b/app/src/main/java/com/foxx/androidcast/MainActivity.java @@ -18,6 +18,7 @@ import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; +import com.foxx.androidcast.dev.DevInstallWakeHelper; import com.foxx.androidcast.ota.OtaManifest; import com.foxx.androidcast.ota.OtaUpdateCoordinator; import com.foxx.androidcast.ota.OtaUpdateService; @@ -54,6 +55,9 @@ public class MainActivity extends DrawerHostActivity { @Override protected void onCreate(Bundle savedInstanceState) { + if (DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } super.onCreate(savedInstanceState); if (AppPreferences.isGrabSessionStats(this)) { SessionStatsStore.pruneOnAppStart(this); @@ -87,13 +91,33 @@ public class MainActivity extends DrawerHostActivity { super.onStop(); } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + if (DevInstallWakeHelper.shouldShowAfterDeploy(intent)) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } + } + @Override protected void onResume() { super.onResume(); + if (DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } PermissionHelper.remindIfMissing(this, false); OtaUpdateCoordinator.requestCheckOnLaunch(this); } + @Override + protected void onDestroy() { + if (isFinishing() && DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.releaseWakeLock(); + } + super.onDestroy(); + } + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); diff --git a/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java b/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java new file mode 100644 index 0000000..e14c83d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java @@ -0,0 +1,29 @@ +package com.foxx.androidcast.dev; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.foxx.androidcast.BuildConfig; + +/** + * Debug: wake on {@link DevInstallWakeHelper#ACTION_PREPARE_FOR_DEPLOY} (before adb install) + * and relaunch UI on {@link Intent#ACTION_MY_PACKAGE_REPLACED}. + */ +public final class DebugDeployWakeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (!BuildConfig.DEBUG || intent == null) { + return; + } + String action = intent.getAction(); + if (DevInstallWakeHelper.ACTION_PREPARE_FOR_DEPLOY.equals(action)) { + DevInstallWakeHelper.wakeForDeploy(context, "prepare-broadcast"); + return; + } + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action)) { + DevInstallWakeHelper.wakeForDeploy(context, "package-replaced"); + DevInstallWakeHelper.launchMainAfterDeploy(context); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java index 83cce45..6a7430d 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java @@ -55,6 +55,7 @@ final class DevAdbConnectHttpServer implements Runnable { "HTTP adb info on :" + DevAdbConnectInfo.HTTP_PORT + "/adb.json"); while (!Thread.currentThread().isInterrupted()) { try (Socket client = socket.accept()) { + client.setSoTimeout(5_000); handleClient(client); } catch (IOException e) { if (!Thread.currentThread().isInterrupted()) { @@ -70,20 +71,11 @@ final class DevAdbConnectHttpServer implements Runnable { } private void handleClient(Socket client) throws IOException { - byte[] buffer = new byte[512]; - int read = client.getInputStream().read(buffer); - if (read <= 0) { - return; - } - String request = new String(buffer, 0, read, StandardCharsets.US_ASCII); - String path = "/"; - int lineEnd = request.indexOf('\n'); - String firstLine = lineEnd >= 0 ? request.substring(0, lineEnd) : request; - String[] parts = firstLine.split(" "); - if (parts.length >= 2) { - path = parts[1]; - } + String path = readRequestPath(client); String body = payload.get(); + if (body == null || body.isEmpty()) { + body = "{}"; + } if (!"/adb.json".equals(path) && !"/".equals(path)) { writeResponse(client, 404, "text/plain", "not found"); return; @@ -91,6 +83,22 @@ final class DevAdbConnectHttpServer implements Runnable { writeResponse(client, 200, "application/json; charset=utf-8", body); } + private static String readRequestPath(Socket client) throws IOException { + byte[] buffer = new byte[1024]; + int read = client.getInputStream().read(buffer); + if (read <= 0) { + return "/"; + } + String request = new String(buffer, 0, read, StandardCharsets.US_ASCII); + int lineEnd = request.indexOf('\n'); + String firstLine = lineEnd >= 0 ? request.substring(0, lineEnd) : request; + String[] parts = firstLine.split(" "); + if (parts.length >= 2) { + return parts[1].trim(); + } + return "/"; + } + private static void writeResponse(Socket client, int code, String contentType, String body) throws IOException { byte[] bytes = body.getBytes(StandardCharsets.UTF_8); diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java index 4c1b327..c0e4044 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java @@ -61,6 +61,9 @@ public final class DevAdbConnectInfo { root.put("updated_ms", updatedMs); root.put("ips", toJsonArray(ips)); root.put("connect", toJsonArray(connect)); + root.put("tls_port", + findFirstNonLegacyPort(connect)); + root.put("needs_secure_grant", !secureSettingsGranted); JSONArray commands = new JSONArray(); for (String endpoint : connect) { if (!TextUtils.isEmpty(endpoint)) { @@ -68,7 +71,8 @@ public final class DevAdbConnectInfo { } } root.put("commands", commands); - root.put("hint", "When connect lines fail, run: adb mdns services"); + root.put("hint", "Grant WRITE_SECURE_SETTINGS once via USB; use tls_port " + + "(not 5555) on Android 11+. Host: avahi-browse -rpt _adb-tls-connect._tcp"); return root.toString(2); } catch (JSONException e) { return "{}"; @@ -79,6 +83,31 @@ public final class DevAdbConnectInfo { return "ADB_JSON " + toJson().replace('\n', ' '); } + private static int findFirstNonLegacyPort(List connect) { + for (String endpoint : connect) { + if (TextUtils.isEmpty(endpoint) || !endpoint.contains(":")) { + continue; + } + int port = parsePort(endpoint); + if (port > 0 && port != LEGACY_TCP_PORT) { + return port; + } + } + return -1; + } + + private static int parsePort(String endpoint) { + int idx = endpoint.lastIndexOf(':'); + if (idx < 0) { + return -1; + } + try { + return Integer.parseInt(endpoint.substring(idx + 1)); + } catch (NumberFormatException e) { + return -1; + } + } + private static JSONArray toJsonArray(List values) { JSONArray array = new JSONArray(); for (String value : values) { diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java new file mode 100644 index 0000000..5be8de0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java @@ -0,0 +1,117 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.os.Build; +import android.util.Log; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Discover local wireless-adb ports via mDNS (_adb-tls-connect._tcp, legacy _adb._tcp). */ +final class DevAdbMdnsProbe { + private static final String[] SERVICE_TYPES = { + "_adb-tls-connect._tcp", + "_adb._tcp", + "_adb-tls-pairing._tcp", + }; + + private DevAdbMdnsProbe() {} + + static List discoverPorts(Context context, long timeoutMs) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + return new ArrayList<>(); + } + NsdManager nsd = (NsdManager) context.getSystemService(Context.NSD_SERVICE); + if (nsd == null) { + return new ArrayList<>(); + } + Set ports = new LinkedHashSet<>(); + Set localIps = new LinkedHashSet<>(DevAdbWifiHelper.collectWifiIpv4Addresses(context)); + CountDownLatch done = new CountDownLatch(1); + AtomicBoolean stopped = new AtomicBoolean(false); + + NsdManager.DiscoveryListener listener = new NsdManager.DiscoveryListener() { + @Override + public void onDiscoveryStarted(String serviceType) { + Log.d(DevAdbConnectInfo.LOG_TAG, "mDNS discovery started: " + serviceType); + } + + @Override + public void onServiceFound(NsdServiceInfo serviceInfo) { + nsd.resolveService(serviceInfo, new NsdManager.ResolveListener() { + @Override + public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { + Log.d(DevAdbConnectInfo.LOG_TAG, + "mDNS resolve failed code=" + errorCode); + } + + @Override + public void onServiceResolved(NsdServiceInfo info) { + int port = info.getPort(); + if (port <= 0 || port >= 65536) { + return; + } + String host = info.getHost() != null ? info.getHost().getHostAddress() : ""; + if (!localIps.isEmpty() + && host != null + && !host.isEmpty() + && !localIps.contains(host)) { + return; + } + ports.add(port); + Log.i(DevAdbConnectInfo.LOG_TAG, + "mDNS adb port " + port + " type=" + info.getServiceType()); + } + }); + } + + @Override + public void onServiceLost(NsdServiceInfo serviceInfo) {} + + @Override + public void onDiscoveryStopped(String serviceType) { + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + + @Override + public void onStartDiscoveryFailed(String serviceType, int errorCode) { + Log.d(DevAdbConnectInfo.LOG_TAG, + "mDNS start failed type=" + serviceType + " code=" + errorCode); + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + + @Override + public void onStopDiscoveryFailed(String serviceType, int errorCode) { + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + }; + + try { + nsd.discoverServices(SERVICE_TYPES[0], NsdManager.PROTOCOL_DNS_SD, listener); + if (!done.await(timeoutMs, TimeUnit.MILLISECONDS)) { + Log.d(DevAdbConnectInfo.LOG_TAG, "mDNS discovery timed out"); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + try { + nsd.stopServiceDiscovery(listener); + } catch (Exception ignored) { + } + } + return new ArrayList<>(ports); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java index 4eed568..fdc372a 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java @@ -52,10 +52,11 @@ public final class DevAdbWifiHelper { List ips = collectWifiIpv4Addresses(app); List ports = discoverPorts(app); - List connect = DevAdbConnectInfo.mergeEndpoints(ips, ports); + ports.addAll(DevAdbMdnsProbe.discoverPorts(app, 2500L)); + List connect = buildConnectEndpoints(ips, ports); connect.addAll(parseDumpsysEndpoints(runDumpsysAdb(app))); - List dedupedConnect = dedupe(connect); + List dedupedConnect = orderConnectEndpoints(dedupe(connect), ports); long now = System.currentTimeMillis(); return new DevAdbConnectInfo( ips, @@ -128,12 +129,19 @@ public final class DevAdbWifiHelper { private static List discoverPorts(Context context) { Set ports = new LinkedHashSet<>(); - ports.add(DevAdbConnectInfo.LEGACY_TCP_PORT); + int tlsProp = parsePositiveInt(readSystemProperty("service.adb.tls.port")); + if (tlsProp > 0) { + ports.add(tlsProp); + } int tcpProp = parsePositiveInt(readSystemProperty("service.adb.tcp.port")); if (tcpProp > 0) { ports.add(tcpProp); } + int persistTls = parsePositiveInt(readSystemProperty("persist.adb.tls_server.port")); + if (persistTls > 0) { + ports.add(persistTls); + } for (String key : new String[] {"adb_wifi_port", "adb_wifi_tls_port", "adb_port"}) { int fromSettings = readGlobalInt(context, key, -1); @@ -146,9 +154,45 @@ public final class DevAdbWifiHelper { ports.add(parsed); } } + if (ports.isEmpty()) { + ports.add(DevAdbConnectInfo.LEGACY_TCP_PORT); + } return new ArrayList<>(ports); } + private static List buildConnectEndpoints(List ips, List ports) { + List endpoints = DevAdbConnectInfo.mergeEndpoints(ips, ports); + if (endpoints.isEmpty() && !ips.isEmpty()) { + endpoints.add(ips.get(0) + ":" + DevAdbConnectInfo.LEGACY_TCP_PORT); + } + return endpoints; + } + + /** Prefer TLS / mDNS ports over legacy :5555 guesses. */ + private static List orderConnectEndpoints(List endpoints, List ports) { + boolean hasNonLegacy = false; + for (Integer port : ports) { + if (port != null && port != DevAdbConnectInfo.LEGACY_TCP_PORT) { + hasNonLegacy = true; + break; + } + } + if (!hasNonLegacy) { + return endpoints; + } + List preferred = new ArrayList<>(); + List legacy = new ArrayList<>(); + for (String endpoint : endpoints) { + if (endpoint.endsWith(":" + DevAdbConnectInfo.LEGACY_TCP_PORT)) { + legacy.add(endpoint); + } else { + preferred.add(endpoint); + } + } + preferred.addAll(legacy); + return preferred; + } + private static String readSystemProperty(String key) { try { Class clazz = Class.forName("android.os.SystemProperties"); diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java index c3278f7..d6e5054 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java @@ -147,11 +147,28 @@ public final class DevAdbWifiKeeper { private void start() { ensureNotificationChannel(); + loadCachedJsonIntoHttpServer(); httpServer.start(); registerNetworkCallback(); scheduleRefresh("keeper-start"); } + private void loadCachedJsonIntoHttpServer() { + File cached = new File(appContext.getFilesDir(), "dev/adb_connect.json"); + if (!cached.isFile()) { + return; + } + try { + byte[] bytes = java.nio.file.Files.readAllBytes(cached.toPath()); + String json = new String(bytes, StandardCharsets.UTF_8).trim(); + if (!json.isEmpty()) { + httpServer.updatePayload(json); + } + } catch (IOException e) { + Log.d(DevAdbConnectInfo.LOG_TAG, "no cached adb_connect.json", e); + } + } + private void shutdown() { unregisterNetworkCallback(); httpServer.stop(); diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java index 98e488f..c1f95ce 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java @@ -166,14 +166,39 @@ public final class DevDiagnosticsProbe { StringBuilder sb = new StringBuilder(); sb.append(connectivitySummary(context)).append('\n'); String crashUrl = resolveCrashUploadUrl(context); - sb.append('\n').append(probeHttp("Crash upload", crashUrl, cancel)).append('\n'); - String otaUrl = resolveOtaUrl(context); - if (!otaUrl.isEmpty()) { - sb.append('\n').append(probeHttp("OTA channel", otaUrl, cancel)); - } + sb.append('\n').append(probeHttp("Crash upload", crashUrl, cancel)); + appendOtaProbe(sb, context, cancel); + sb.append('\n').append("-----").append('\n'); + sb.append(DevVpnStatusProbe.formatForDiagnostics(context)); return sb.toString().trim(); } + private static void appendOtaProbe(StringBuilder sb, Context context, AtomicBoolean cancel) { + String otaUrl = resolveOtaUrl(context); + if (otaUrl.isEmpty()) { + sb.append('\n').append("OTA channel: (not configured — ok for debug)"); + return; + } + String trimmed = otaUrl.trim(); + String host = null; + try { + host = Uri.parse(trimmed).getHost(); + } catch (Exception ignored) { + // fall through + } + if (host == null || host.isEmpty()) { + String shown = trimmed.length() > 96 ? trimmed.substring(0, 96) + "…" : trimmed; + sb.append('\n').append("OTA channel: (invalid URL — ").append(shown) + .append("; ok if OTA unused)"); + return; + } + if (cancel != null && cancel.get()) { + sb.append('\n').append("OTA channel: stopped"); + return; + } + sb.append('\n').append(probeHttp("OTA channel", trimmed, cancel)); + } + /** Wire advertisement summary (last card on diagnostics tab). */ public static String probeFullAdvertisementInfo(Context context) { CastSettings settings = AppPreferences.loadSenderDefaults(context); diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java b/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java new file mode 100644 index 0000000..83a8573 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java @@ -0,0 +1,94 @@ +package com.foxx.androidcast.dev; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.PowerManager; +import android.util.Log; +import android.view.WindowManager; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.MainActivity; + +/** Debug deploy: wake screen, keep awake briefly, show UI over lockscreen after adb install. */ +public final class DevInstallWakeHelper { + public static final String ACTION_PREPARE_FOR_DEPLOY = + "com.foxx.androidcast.dev.PREPARE_FOR_DEPLOY"; + public static final String EXTRA_AFTER_DEPLOY = "after_deploy"; + private static final String TAG = "DevDeployWake"; + private static final long WAKE_MS = 45_000L; + + private static PowerManager.WakeLock deployWakeLock; + + private DevInstallWakeHelper() {} + + /** Called from running app when adb install is about to start (broadcast from rebuild.sh). */ + public static void wakeForDeploy(Context context, String reason) { + if (!BuildConfig.DEBUG) { + return; + } + Context app = context.getApplicationContext(); + PowerManager pm = app.getSystemService(PowerManager.class); + if (pm == null) { + return; + } + releaseWakeLock(); + int flags = PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + @SuppressWarnings("deprecation") + int legacy = flags | PowerManager.ON_AFTER_RELEASE; + flags = legacy; + } + deployWakeLock = pm.newWakeLock(flags, "androidcast:deploy"); + deployWakeLock.acquire(WAKE_MS); + Log.i(TAG, "wake for deploy (" + reason + ")"); + } + + public static void prepareActivityShowOnDeploy(Activity activity) { + if (!BuildConfig.DEBUG || activity == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + activity.setShowWhenLocked(true); + activity.setTurnScreenOn(true); + } + activity.getWindow().addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + KeyguardManager km = activity.getSystemService(KeyguardManager.class); + if (km != null && km.isKeyguardLocked()) { + km.requestDismissKeyguard(activity, null); + } + } + } + + public static void launchMainAfterDeploy(Context context) { + if (!BuildConfig.DEBUG) { + return; + } + Intent launch = new Intent(context, MainActivity.class); + launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_SINGLE_TOP); + launch.putExtra(EXTRA_AFTER_DEPLOY, true); + context.startActivity(launch); + Log.i(TAG, "launch MainActivity after deploy"); + } + + public static boolean shouldShowAfterDeploy(Intent intent) { + return intent != null && intent.getBooleanExtra(EXTRA_AFTER_DEPLOY, false); + } + + public static void releaseWakeLock() { + PowerManager.WakeLock lock = deployWakeLock; + deployWakeLock = null; + if (lock != null && lock.isHeld()) { + lock.release(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java index cb105c7..8fb471a 100644 --- a/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java +++ b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java @@ -16,6 +16,7 @@ import com.foxx.androidcast.CastConfig; import com.foxx.androidcast.crash.CrashSettingsStore; import com.foxx.androidcast.discovery.CastLanPeerProbe; import com.foxx.androidcast.network.BackendEndpoints; +import com.foxx.androidcast.network.BackendNtpSync; import java.io.BufferedReader; import java.io.InputStream; @@ -55,6 +56,7 @@ public final class DevNetworkSelfTestProbe { probeCaptive(caps, cancel, report); probeIntraLan(context, lp, cancel, report); probeBackend(context, cancel, report); + DevVpnStatusProbe.probe(context, report); probeNtp(context, cancel, report); probeNatExternal(caps, context, cancel, report); probeMtu(lp, report); @@ -243,10 +245,10 @@ public final class DevNetworkSelfTestProbe { r.section("NTP", "Time sync"); r.itemPass("utc-epoch", Long.toString(System.currentTimeMillis() / 1000L)); int tzMin = java.util.TimeZone.getDefault().getOffset(System.currentTimeMillis()) / 60000; - r.itemPass("tz-offset", tzMin + " min"); + r.itemPass("local-tz-offset", tzMin + " min"); boolean enabled = AppPreferences.isDevBackendNtpSyncEnabled(context); r.itemBool(enabled ? DevNetworkSelfTestReport.Level.PASS : DevNetworkSelfTestReport.Level.NA, - "be-ntp-sync", enabled, "enabled", "disabled (dev setting)"); + "be-ntp-sync", enabled, "enabled (±3 min threshold)", "disabled (dev setting)"); if (!enabled) { return; } @@ -255,22 +257,54 @@ public final class DevNetworkSelfTestProbe { r.itemWarn("be-ntp", "stopped"); return; } - long now = System.currentTimeMillis() / 1000L; + long clientEpochSec = System.currentTimeMillis() / 1000L; String tz = new java.text.SimpleDateFormat("Z", Locale.US).format(new java.util.Date()); - String body = "{\"heartbeat\":{\"type\":\"ntp\",\"date\":" + now + ",\"tz\":\"" + tz + "\"}}"; + String body = "{\"heartbeat\":{\"type\":\"ntp\",\"date\":" + clientEpochSec + + ",\"tz\":\"" + tz + "\",\"time_source\":\"device\"}}"; + long t0 = System.currentTimeMillis(); HttpTextResult text = httpPostJsonText(backend, body); - if (httpSuccess(text.code)) { - r.itemPass("be-ntp", text.summary); - if (text.body != null && !text.body.isEmpty()) { - r.itemPass("be-payload", truncate(text.body, 120)); + long t1 = System.currentTimeMillis(); + if (!httpSuccess(text.code)) { + if (text.code == 404) { + r.itemFail("be-ntp", text.summary + " · heartbeat.php missing on host"); + } else if (text.code > 0) { + r.itemFail("be-ntp", text.summary); + } else { + r.itemFail("be-ntp", text.summary); } - } else if (text.code == 404) { - r.itemFail("be-ntp", text.summary + " · heartbeat.php missing on host"); - } else if (text.code > 0) { - r.itemFail("be-ntp", text.summary); - } else { - r.itemFail("be-ntp", text.summary); + return; } + BackendNtpSync.Result sync = BackendNtpSync.evaluateResponse( + context, t0, t1, clientEpochSec, text.body); + switch (sync.action) { + case SYNCED: + r.itemPass("be-ntp", text.summary); + r.itemPass("skew", sync.skewMs + " ms"); + r.itemPass("action", "synced (|skew| > 3 min) · offset=" + sync.appliedOffsetMs + " ms"); + break; + case WITHIN_THRESHOLD: + r.itemPass("be-ntp", text.summary); + r.itemPass("skew", sync.skewMs + " ms"); + r.itemPass("action", "within ±3 min · offset=" + sync.appliedOffsetMs + " ms"); + break; + case FAILED: + r.itemFail("be-ntp", sync.detail); + break; + default: + r.itemNa("be-ntp", sync.detail); + break; + } + if (!sync.serverWallBeTz.isEmpty()) { + r.itemPass("be-wall", sync.serverWallBeTz); + } + if (!sync.localWallBeTz.isEmpty()) { + r.itemPass("local-as-be", sync.localWallBeTz); + } + if (sync.detail != null && !sync.detail.isEmpty()) { + r.itemPass("detail", truncate(sync.detail, 160)); + } + long corrected = BackendNtpSync.correctedNowMs(context); + r.itemPass("corrected-utc", Long.toString(corrected / 1000L)); } private static void probeNatExternal(NetworkCapabilities caps, Context context, AtomicBoolean cancel, diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java new file mode 100644 index 0000000..ffd6ec5 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java @@ -0,0 +1,257 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; +import android.net.TrafficStats; +import android.os.Build; +import android.os.Process; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.crash.CrashReporter; +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessStatusStore; +import com.foxx.androidcast.remoteaccess.ReverseSshTunnelBridge; +import com.foxx.androidcast.vpn.VpnServiceClient; +import com.foxx.androidcast.vpn.VpnState; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.Locale; + +/** VPN / remote-access snapshot for diagnostics and network self-test. */ +public final class DevVpnStatusProbe { + private DevVpnStatusProbe() {} + + /** Plain-text VPN section for the diagnostics network card. */ + public static String formatForDiagnostics(Context context) { + DevNetworkSelfTestReport r = new DevNetworkSelfTestReport(); + probe(context, r); + return r.build(); + } + + public static void probe(Context context, DevNetworkSelfTestReport r) { + r.section("VPN", "Remote access / VPN status"); + RemoteAccessMode mode = AppPreferences.getDevRemoteAccessMode(context); + RemoteAccessStatusStore.Snapshot last = RemoteAccessStatusStore.load(context); + boolean mainProcess = CrashReporter.isMainProcess(context, CrashReporter.currentProcessName()); + boolean osVpn = hasOsVpnTransport(context); + + String typeLabel = mode == RemoteAccessMode.DISABLED ? "off" : mode.name().toLowerCase(Locale.US); + r.itemPass("type", typeLabel); + + StringBuilder vpnDetailBuf = new StringBuilder(); + String failReason = last.failReason; + String state = resolveState(context, mode, last, mainProcess, osVpn, vpnDetailBuf::append); + String vpnDetail = vpnDetailBuf.toString(); + + if (mode == RemoteAccessMode.WIREGUARD + && (failReason == null || failReason.isEmpty()) + && RemoteAccessStatusStore.STATE_FAILURE.equals(state) + && !vpnDetail.isEmpty()) { + failReason = vpnDetail; + } + + DevNetworkSelfTestReport.Level level; + if (mode == RemoteAccessMode.DISABLED) { + level = DevNetworkSelfTestReport.Level.NA; + } else if (RemoteAccessStatusStore.STATE_SUCCESS.equals(state)) { + level = DevNetworkSelfTestReport.Level.PASS; + } else if (RemoteAccessStatusStore.STATE_FAILURE.equals(state)) { + level = DevNetworkSelfTestReport.Level.FAIL; + } else { + level = DevNetworkSelfTestReport.Level.WARN; + } + r.item(level, "state", state); + r.itemPass("os-vpn-transport", osVpn ? "active" : "none"); + if (!vpnDetail.isEmpty()) { + r.itemPass("detail", vpnDetail); + } + + String method = last.method; + if (method.isEmpty() && mode == RemoteAccessMode.WIREGUARD) { + method = "VpnServiceClient.applyWireGuardConfig"; + } else if (method.isEmpty() && mode == RemoteAccessMode.RSSH) { + method = "ReverseSshTunnelBridge.applyConfig"; + } else if (method.isEmpty()) { + method = "n/a"; + } + r.itemPass("method", method); + + String initiator = formatInitiator(last.initiator, mode); + r.itemPass("initiator", initiator); + + if (!last.sessionId.isEmpty()) { + r.itemPass("session", last.sessionId); + } + if (RemoteAccessStatusStore.STATE_FAILURE.equals(state) + && failReason != null && !failReason.isEmpty()) { + r.itemFail("fail-reason", failReason); + } + + appendTraffic(r, context); + if (last.updatedMs > 0L) { + r.itemPass("last-event-ms", Long.toString(last.updatedMs)); + } + if (!mainProcess) { + r.itemPass("probe-process", CrashReporter.currentProcessName() + " (status store + OS VPN)"); + } + } + + private static String resolveState( + Context context, + RemoteAccessMode mode, + RemoteAccessStatusStore.Snapshot last, + boolean mainProcess, + boolean osVpn, + java.util.function.Consumer detailOut) { + if (mode == RemoteAccessMode.DISABLED) { + return RemoteAccessStatusStore.STATE_OFF; + } + if (mode == RemoteAccessMode.WIREGUARD) { + int live = VpnState.DOWN; + String detail = ""; + if (mainProcess) { + VpnServiceClient vpn = VpnServiceClient.get(context); + live = vpn.getState(); + detail = vpn.getStateDetail(); + } + if (detailOut != null && detail != null && !detail.isEmpty()) { + detailOut.accept(detail); + } + if (mainProcess) { + if (live == VpnState.UP) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (live == VpnState.ERROR) { + return RemoteAccessStatusStore.STATE_FAILURE; + } + if (live == VpnState.CONNECTING) { + return RemoteAccessStatusStore.STATE_CONNECTING; + } + if (RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state) && osVpn) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (RemoteAccessStatusStore.STATE_CONNECTING.equals(last.state) + || RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + return last.state; + } + return RemoteAccessStatusStore.STATE_IDLE; + } + if (RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state) && osVpn) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (!last.state.isEmpty() && !RemoteAccessStatusStore.STATE_OFF.equals(last.state)) { + return last.state; + } + return osVpn ? RemoteAccessStatusStore.STATE_SUCCESS : RemoteAccessStatusStore.STATE_IDLE; + } + + boolean rsshUp; + if (mainProcess) { + rsshUp = ReverseSshTunnelBridge.isConnected(); + } else { + rsshUp = RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state); + } + if (rsshUp) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + return RemoteAccessStatusStore.STATE_FAILURE; + } + if (RemoteAccessStatusStore.STATE_CONNECTING.equals(last.state)) { + return RemoteAccessStatusStore.STATE_CONNECTING; + } + return RemoteAccessStatusStore.STATE_IDLE; + } + + private static String formatInitiator(String stored, RemoteAccessMode mode) { + if (!stored.isEmpty()) { + switch (stored) { + case RemoteAccessStatusStore.INITIATOR_DEVICE: + return "device (polls BE heartbeat)"; + case RemoteAccessStatusStore.INITIATOR_BE: + return "backend (connect action)"; + case RemoteAccessStatusStore.INITIATOR_USER: + return "user (dev settings)"; + default: + return stored; + } + } + if (mode == RemoteAccessMode.DISABLED) { + return "n/a"; + } + return "device (heartbeat poll → BE connect)"; + } + + private static boolean hasOsVpnTransport(Context context) { + ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); + if (cm == null) { + return false; + } + android.net.Network net = cm.getActiveNetwork(); + NetworkCapabilities caps = net != null ? cm.getNetworkCapabilities(net) : null; + return caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN); + } + + private static void appendTraffic(DevNetworkSelfTestReport r, Context context) { + int uid = Process.myUid(); + long rx = TrafficStats.getUidRxBytes(uid); + long tx = TrafficStats.getUidTxBytes(uid); + if (rx == TrafficStats.UNSUPPORTED || tx == TrafficStats.UNSUPPORTED) { + r.itemNa("traffic", "uid stats unsupported"); + } else { + r.itemPass("uid-rx-tx", formatBytes(rx) + " / " + formatBytes(tx)); + if (Build.VERSION.SDK_INT >= 31) { + long rxPkt = TrafficStats.getUidRxPackets(uid); + long txPkt = TrafficStats.getUidTxPackets(uid); + if (rxPkt != TrafficStats.UNSUPPORTED && txPkt != TrafficStats.UNSUPPORTED) { + r.itemPass("uid-rx-tx-pkts", rxPkt + " / " + txPkt); + } + } + } + String tun = readTunIfaceStats(); + if (!tun.isEmpty()) { + r.itemPass("tun-iface", tun); + } + } + + private static String formatBytes(long bytes) { + if (bytes < 0) { + return "?"; + } + if (bytes < 1024) { + return bytes + " B"; + } + if (bytes < 1024 * 1024) { + return String.format(Locale.US, "%.1f KiB", bytes / 1024.0); + } + return String.format(Locale.US, "%.1f MiB", bytes / (1024.0 * 1024.0)); + } + + private static String readTunIfaceStats() { + try (BufferedReader br = new BufferedReader(new FileReader("/proc/net/dev"))) { + String line; + while ((line = br.readLine()) != null) { + String trimmed = line.trim(); + if (!trimmed.contains(":")) { + continue; + } + String name = trimmed.split(":", 2)[0].trim(); + if (!name.startsWith("tun") && !name.startsWith("wg")) { + continue; + } + String[] parts = trimmed.split(":\\s*"); + if (parts.length < 2) { + continue; + } + String[] cols = parts[1].trim().split("\\s+"); + if (cols.length >= 16) { + return name + " rx=" + cols[0] + " tx=" + cols[8] + " bytes"; + } + } + } catch (Exception ignored) { + } + return ""; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java b/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java new file mode 100644 index 0000000..e92a8a7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java @@ -0,0 +1,151 @@ +package com.foxx.androidcast.network; + +import com.foxx.androidcast.AppPreferences; + +import org.json.JSONObject; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Backend heartbeat NTP correction (developer setting). + * When |skew| exceeds {@link #SYNC_THRESHOLD_MS}, stores offset for app-local "corrected" time. + * Does not change the system clock. + */ +public final class BackendNtpSync { + /** ±3 minutes — sync when skew exceeds this. */ + public static final long SYNC_THRESHOLD_MS = 3L * 60L * 1000L; + + private static final Pattern TZ_OFFSET = Pattern.compile("([+-])(\\d{2})(\\d{2})"); + + private BackendNtpSync() {} + + public enum Action { + DISABLED, + WITHIN_THRESHOLD, + SYNCED, + FAILED + } + + public static final class Result { + public final Action action; + public final long skewMs; + public final long appliedOffsetMs; + public final String serverWallBeTz; + public final String localWallBeTz; + public final String detail; + + Result(Action action, long skewMs, long appliedOffsetMs, + String serverWallBeTz, String localWallBeTz, String detail) { + this.action = action; + this.skewMs = skewMs; + this.appliedOffsetMs = appliedOffsetMs; + this.serverWallBeTz = serverWallBeTz; + this.localWallBeTz = localWallBeTz; + this.detail = detail; + } + } + + /** Corrected wall time for diagnostics when sync is active. */ + public static long correctedNowMs(android.content.Context context) { + if (!AppPreferences.isDevBackendNtpSyncEnabled(context)) { + return System.currentTimeMillis(); + } + return System.currentTimeMillis() + AppPreferences.getDevBackendNtpOffsetMs(context); + } + + /** + * @param requestStartMs wall clock when POST started + * @param requestEndMs wall clock when response body was read + * @param clientEpochSec epoch seconds sent in heartbeat.date + */ + public static Result evaluateResponse( + android.content.Context context, + long requestStartMs, + long requestEndMs, + long clientEpochSec, + String responseBody) { + if (!AppPreferences.isDevBackendNtpSyncEnabled(context)) { + return new Result(Action.DISABLED, 0L, 0L, "", "", "dev setting off"); + } + try { + JSONObject root = new JSONObject(responseBody != null ? responseBody : "{}"); + JSONObject hb = root.optJSONObject("heartbeat"); + if (hb == null) { + return fail("missing heartbeat object"); + } + long serverEpochSec = hb.optLong("server_date", 0L); + String serverTz = hb.optString("server_tz", ""); + if (serverEpochSec <= 0L) { + return fail("missing server_date"); + } + TimeZone beTz = parseBeTimeZone(serverTz); + long skewMs = computeSkewMs(requestStartMs, requestEndMs, serverEpochSec); + long serverMs = serverEpochSec * 1000L; + long localMidMs = requestStartMs + Math.max(0L, requestEndMs - requestStartMs) / 2L; + + long correctionFromBe = hb.has("correction_seconds") + ? hb.optLong("correction_seconds", 0L) * 1000L + : (serverEpochSec - clientEpochSec) * 1000L; + + String serverWall = formatWallClock(serverMs, beTz); + String localWallInBeTz = formatWallClock(localMidMs, beTz); + String summary = String.format(Locale.US, + "skew=%d ms (BE correction=%d ms) · BE %s · local→BE %s", + skewMs, correctionFromBe, serverWall, localWallInBeTz); + + if (Math.abs(skewMs) > SYNC_THRESHOLD_MS) { + AppPreferences.setDevBackendNtpOffsetMs(context, skewMs); + AppPreferences.setDevBackendNtpLastSyncMs(context, System.currentTimeMillis()); + AppPreferences.setDevBackendNtpLastSkewMs(context, skewMs); + return new Result(Action.SYNCED, skewMs, skewMs, + serverWall, localWallInBeTz, summary + " · offset stored"); + } + AppPreferences.setDevBackendNtpLastSkewMs(context, skewMs); + return new Result(Action.WITHIN_THRESHOLD, skewMs, + AppPreferences.getDevBackendNtpOffsetMs(context), + serverWall, localWallInBeTz, summary + " · within ±3 min"); + } catch (Exception e) { + return fail(e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + + private static Result fail(String detail) { + return new Result(Action.FAILED, 0L, 0L, "", "", detail); + } + + static long computeSkewMs(long requestStartMs, long requestEndMs, long serverEpochSec) { + long serverMs = serverEpochSec * 1000L; + long localMidMs = requestStartMs + Math.max(0L, requestEndMs - requestStartMs) / 2L; + return serverMs - localMidMs; + } + + static boolean shouldSync(long skewMs) { + return Math.abs(skewMs) > SYNC_THRESHOLD_MS; + } + + static TimeZone parseBeTimeZone(String serverTz) { + if (serverTz == null || serverTz.isEmpty()) { + return TimeZone.getDefault(); + } + Matcher m = TZ_OFFSET.matcher(serverTz.trim()); + if (!m.matches()) { + return TimeZone.getDefault(); + } + String sign = m.group(1); + int hours = Integer.parseInt(m.group(2)); + int mins = Integer.parseInt(m.group(3)); + String id = String.format(Locale.US, "GMT%s%02d:%02d", sign, hours, mins); + return TimeZone.getTimeZone(id); + } + + private static String formatWallClock(long epochMs, TimeZone tz) { + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US); + fmt.setTimeZone(tz); + return fmt.format(new Date(epochMs)); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java index feb40cb..e93e495 100644 --- a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java @@ -20,6 +20,14 @@ public final class RemoteAccessCoordinator { RemoteAccessService.stop(app); VpnServiceClient.get(app).tearDown(); AppPreferences.clearDevRemoteAccessSession(app); + RemoteAccessStatusStore.record( + app, + RemoteAccessMode.DISABLED, + RemoteAccessStatusStore.STATE_OFF, + "RemoteAccessCoordinator.applyMode", + RemoteAccessStatusStore.INITIATOR_USER, + "", + ""); return; } if (mode == RemoteAccessMode.WIREGUARD || mode == RemoteAccessMode.RSSH) { diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java index bc287e3..4fc1e2e 100644 --- a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java @@ -147,16 +147,37 @@ public final class RemoteAccessService extends Service { JSONObject resp = RemoteAccessHeartbeatClient.postRa(this, hb); if (resp == null) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessHeartbeatClient.postRa", + RemoteAccessStatusStore.INITIATOR_DEVICE, + "no response from BE", ""); return; } String raAction = resp.optString("action", "wait"); if ("connect".equals(raAction)) { - handleConnect(resp); + handleConnect(mode, resp); } else if ("disabled".equals(raAction) || "deny".equals(raAction)) { RemoteAccessTunnelHelper.tearDownAll(this); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_OFF, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_BE, + raAction, resp.optString("session_id", "")); + } else { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_IDLE, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_DEVICE, + "", resp.optString("session_id", "")); } } catch (Exception e) { Log.w(TAG, "poll failed: " + e.getMessage()); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_DEVICE, + e.getMessage(), ""); } } @@ -175,7 +196,7 @@ public final class RemoteAccessService extends Service { } } - private void handleConnect(JSONObject resp) { + private void handleConnect(RemoteAccessMode mode, JSONObject resp) { String tunnel = resp.optString("tunnel", ""); String sessionId = resp.optString("session_id", ""); long expiresAt = resp.optLong("expires_at", 0L); @@ -184,31 +205,77 @@ public final class RemoteAccessService extends Service { } JSONObject creds = resp.optJSONObject("credentials"); if (creds == null) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.handleConnect", + RemoteAccessStatusStore.INITIATOR_BE, + "connect without credentials", sessionId); return; } if ("wireguard".equals(tunnel)) { String wgConfig = WireGuardConfigBuilder.fromConnectCredentials(creds); if (wgConfig.isEmpty()) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "empty wireguard config", sessionId); return; } + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_CONNECTING, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); final String sid = sessionId; VpnServiceClient.get(this).applyWireGuardConfig(wgConfig, new VpnServiceClient.OperationListener() { @Override public void onSuccess() { updateNotificationConnected(sid, tunnel); + RemoteAccessStatusStore.record( + RemoteAccessService.this, mode, RemoteAccessStatusStore.STATE_SUCCESS, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sid); } @Override public void onFailure(String reason) { Log.w(TAG, "wireguard connect failed: " + reason); + RemoteAccessStatusStore.record( + RemoteAccessService.this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + reason, sid); } }); } else if ("ssh_reverse".equals(tunnel)) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_CONNECTING, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); if (ReverseSshTunnelBridge.applyConfig(this, creds)) { updateNotificationConnected(sessionId, tunnel); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_SUCCESS, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); + } else { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "RSSH connect failed or timed out", sessionId); } } else { Log.w(TAG, "unsupported tunnel in connect: " + tunnel); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.handleConnect", + RemoteAccessStatusStore.INITIATOR_BE, + "unsupported tunnel: " + tunnel, sessionId); } } diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java new file mode 100644 index 0000000..2aeb08b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java @@ -0,0 +1,94 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * Last remote-access / VPN tunnel event for developer network self-test. + */ +public final class RemoteAccessStatusStore { + private static final String PREFS = "androidcast_remote_access_status"; + private static final String KEY_TYPE = "tunnel_type"; + private static final String KEY_STATE = "state"; + private static final String KEY_METHOD = "method"; + private static final String KEY_INITIATOR = "initiator"; + private static final String KEY_FAIL_REASON = "fail_reason"; + private static final String KEY_UPDATED_MS = "updated_ms"; + private static final String KEY_SESSION_ID = "session_id"; + + public static final String STATE_SUCCESS = "success"; + public static final String STATE_FAILURE = "failure"; + public static final String STATE_CONNECTING = "connecting"; + public static final String STATE_IDLE = "idle"; + public static final String STATE_OFF = "off"; + + public static final String INITIATOR_DEVICE = "device"; + public static final String INITIATOR_BE = "backend"; + public static final String INITIATOR_USER = "user"; + + private RemoteAccessStatusStore() {} + + public static void record( + Context context, + RemoteAccessMode mode, + String state, + String method, + String initiator, + String failReason, + String sessionId) { + String type = mode == null || mode == RemoteAccessMode.DISABLED + ? "off" : mode.name().toLowerCase(); + prefs(context).edit() + .putString(KEY_TYPE, type) + .putString(KEY_STATE, state != null ? state : STATE_IDLE) + .putString(KEY_METHOD, method != null ? method : "") + .putString(KEY_INITIATOR, initiator != null ? initiator : "") + .putString(KEY_FAIL_REASON, failReason != null ? failReason : "") + .putString(KEY_SESSION_ID, sessionId != null ? sessionId : "") + .putLong(KEY_UPDATED_MS, System.currentTimeMillis()) + .apply(); + } + + public static Snapshot load(Context context) { + SharedPreferences p = prefs(context); + return new Snapshot( + p.getString(KEY_TYPE, "off"), + p.getString(KEY_STATE, STATE_OFF), + p.getString(KEY_METHOD, ""), + p.getString(KEY_INITIATOR, ""), + p.getString(KEY_FAIL_REASON, ""), + p.getString(KEY_SESSION_ID, ""), + p.getLong(KEY_UPDATED_MS, 0L)); + } + + private static SharedPreferences prefs(Context context) { + return context.getApplicationContext().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + } + + public static final class Snapshot { + public final String type; + public final String state; + public final String method; + public final String initiator; + public final String failReason; + public final String sessionId; + public final long updatedMs; + + Snapshot( + String type, + String state, + String method, + String initiator, + String failReason, + String sessionId, + long updatedMs) { + this.type = type != null ? type : "off"; + this.state = state != null ? state : STATE_OFF; + this.method = method != null ? method : ""; + this.initiator = initiator != null ? initiator : ""; + this.failReason = failReason != null ? failReason : ""; + this.sessionId = sessionId != null ? sessionId : ""; + this.updatedMs = updatedMs; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java b/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java index fe377dc..3d16e36 100644 --- a/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java +++ b/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java @@ -51,6 +51,13 @@ public final class AndroidCastVpnService extends Service { return state; } + @Override + public String getStateDetail() { + synchronized (stateLock) { + return stateDetail != null ? stateDetail : ""; + } + } + @Override public boolean isVpnPermissionGranted() { return VpnService.prepare(AndroidCastVpnService.this) == null; diff --git a/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java b/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java index b00802d..b118d82 100644 --- a/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java +++ b/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java @@ -108,6 +108,18 @@ public final class VpnServiceClient { } } + public String getStateDetail() { + if (!ensureBoundSync()) { + return ""; + } + try { + String detail = service.getStateDetail(); + return detail != null ? detail : ""; + } catch (RemoteException e) { + return ""; + } + } + public void registerStateListener(StateListener listener) { runWithService(s -> { IVpnStateCallback cb = new IVpnStateCallback.Stub() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 523c88e..206ebad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -245,7 +245,7 @@ adb connect %1$s HTTP :5039/adb.json · secure=%1$s · wifi adb=%2$s · %3$s Copied adb connect line - One-time (USB): adb shell pm grant com.foxx.androidcast android.permission.WRITE_SECURE_SETTINGS — optional adb shell pm grant … android.permission.DUMP for port discovery. Pair wireless debugging once in system settings. rebuild.sh curls http://DEVICE:5039/adb.json when adb is down. + One-time (USB): ./scripts/grant-dev-adb-perms.sh — enables auto re-enable after Wi‑Fi drops and TLS port discovery. Pair wireless debugging once in system settings (Android 11+ uses a random TLS port, not 5555). rebuild.sh uses curl :5039/adb.json and avahi-browse _adb-tls-connect._tcp. ADB Wi‑Fi keeper Shows adb connect line while debugging on flaky Wi‑Fi. ADB Wi‑Fi ready @@ -278,7 +278,7 @@ Reply-with (seq + timestamps) Requires both peers on a build that supports MSG_DIAG_PING. Old peers ignore unknown packets. Enable backend NTP sync - Disabled by default. Allows self-test/backend heartbeat to fetch server time correction without changing system clock. + Disabled by default. Network self-test compares device time to BE (shown in BE timezone). If skew exceeds ±3 minutes, stores a correction offset for app diagnostics — does not change the system clock. Remote access (on-demand debug) Disabled WireGuard diff --git a/app/src/test/java/com/foxx/androidcast/network/BackendNtpSyncTest.java b/app/src/test/java/com/foxx/androidcast/network/BackendNtpSyncTest.java new file mode 100644 index 0000000..68d2885 --- /dev/null +++ b/app/src/test/java/com/foxx/androidcast/network/BackendNtpSyncTest.java @@ -0,0 +1,36 @@ +package com.foxx.androidcast.network; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import java.util.TimeZone; + +public class BackendNtpSyncTest { + @Test + public void parseBeTimeZone_parsesPlus0200() { + TimeZone tz = BackendNtpSync.parseBeTimeZone("+0200"); + assertEquals(2 * 60 * 60 * 1000, tz.getOffset(0L)); + } + + @Test + public void shouldSync_trueAboveThreeMinutes() { + assertTrue(BackendNtpSync.shouldSync(BackendNtpSync.SYNC_THRESHOLD_MS + 1L)); + assertTrue(BackendNtpSync.shouldSync(-BackendNtpSync.SYNC_THRESHOLD_MS - 1L)); + } + + @Test + public void shouldSync_falseWithinThreeMinutes() { + assertFalse(BackendNtpSync.shouldSync(BackendNtpSync.SYNC_THRESHOLD_MS)); + assertFalse(BackendNtpSync.shouldSync(30_000L)); + assertFalse(BackendNtpSync.shouldSync(-120_000L)); + } + + @Test + public void computeSkewMs_usesRequestMidpoint() { + long skew = BackendNtpSync.computeSkewMs(1_000L, 1_200L, 2L); + assertEquals(2_000L - 1_100L, skew); + } +} diff --git a/docs/20260602_REVERSE_SSH_proposals_summary.md b/docs/20260602_REVERSE_SSH_proposals_summary.md index a52d38a..3c2e173 100644 --- a/docs/20260602_REVERSE_SSH_proposals_summary.md +++ b/docs/20260602_REVERSE_SSH_proposals_summary.md @@ -6,6 +6,10 @@ _Date: 2026-06-02 — **merged document**: initial proposal (rev. 1) + infra rev --- +--- + +--- + ## Table of contents @@ -52,7 +56,18 @@ _Date: 2026-06-02 — **merged document**: initial proposal (rev. 1) + infra rev - [Q4 — How easy to implement? Command checklist (FE + BE)](#q4-how-easy-to-implement-command-checklist-fe-be) - [Q5 — Bastion: file transfers only, or other operations too?](#q5-bastion-file-transfers-only-or-other-operations-too) - [Appendix 1 — WG test configuration (Linux laptop)](#appendix-1-wg-test-configuration-linux-laptop) + - [Network topology (v1 WireGuard)](#network-topology-v1-wireguard) + - [Prerequisites (laptop)](#prerequisites-laptop) + - [A. HTTP E2E (no tunnel yet)](#a-http-e2e-no-tunnel-yet) + - [B. UDP / WireGuard from laptop (after open session)](#b-udp-wireguard-from-laptop-after-open-session) + - [C. Quick checks before blaming WG](#c-quick-checks-before-blaming-wg) - [Appendix 2 — WG production configuration](#appendix-2-wg-production-configuration) + - [BE config.php (remote_access)](#be-configphp-remoteaccess) + - [BE (Alpine) — WireGuard interface](#be-alpine-wireguard-interface) + - [FE (Gentoo) — UDP DNAT (not nginx)](#fe-gentoo-udp-dnat-not-nginx) + - [MariaDB / migrations](#mariadb-migrations) + - [Production verify (on BE or laptop)](#production-verify-on-be-or-laptop) + - [Android (field device)](#android-field-device) - [Source linkage](#source-linkage) diff --git a/docs/20260602_REVERSE_SSH_proposals_summary.pdf b/docs/20260602_REVERSE_SSH_proposals_summary.pdf index b51930c..b8f4e24 100644 --- a/docs/20260602_REVERSE_SSH_proposals_summary.pdf +++ b/docs/20260602_REVERSE_SSH_proposals_summary.pdf @@ -453,7 +453,7 @@ endobj endobj 78 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 On-Demand Remote Access \(Reverse Tunnel\) Proposals) /Trapped /False >> endobj @@ -766,10 +766,10 @@ Gatm>=`<=[&q9:V;,7R4B;4V^OdANI-f(0HR2hgCMh-D@.#VktFAl-Os8+C2[c=0q]sO+3O9Ca5qWe'[ endobj 138 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4127 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4151 >> stream -Gatm>gN)%.&q/)-TPCO9S;BZ(VH`\sALGc7/+GU-B!MrMg4Djd@a*R,P\og>mqLWHOeP9i>YZhK!#je[7ec-O%&W(*8:N]%@i'2Epgc(rAFh*'Cs?S`DsVNDk-$^5hUsi4\RK1nGp;*$;`@3p*WJfVB:('qG`/or7M'8S?a>BB%An!Ou?g=LZ?Cc7L&1D)0\%B0,7FD@Q",%ec^b:kR:P#Z]?t0K%>BA_O.s&E^4$[AT0YDHl"26rOpi2DXsJ>adi2XeE]jCHBna';gbEk0taF]Er;>Bk*E,br!WVlPgUiABWjQPCABQL/I2FlZjR('kjrMB0L'XE6t1aX4d^f[4\H3R[G$1B#A44/Bl7CZ9W1I=d+@f,tpnGfo:5i"je*H1juH$?R#4X[%pkO>P_;TCh*AUag[`^i!m(qa4&mo"sdJ=F\8D27%L+lWQX9L`e_gg"8?iC!8##0[9;b50Iier#YQ;&b+-n[ihIZ/D5]MnC`H7fc$&%$c/$9lG9AqmV7o%$u[G;mX]DhB/A[<6-Nc.5&X9YrVQ+j`"T!$<_!cEO6TfD\piC$U9tfHhPpPiq%mtQURBS&T+bdGND)G*Sc+4?aBo;M&1lR2))2cdZZ.hZ00nXmBEkCam(dFX1JqsPguX`gP"IBFl^/$Z6/<6BE-1>cB%;H3aLp@i?G%QIC^t+\#QWVB+@H/Lh>PNF$K@b_(I?Cb`d11M-tm2o^hYSqC$LHKoF&lO85@l6KNp%*rE0m1Cg&j?a0.fYKZOIoTl(fBB:NjQ4WG\$EKX_@@)]!le9'7WsuS)dF4C7Hr94?Mf35?6t59&Z/<4E3dDG3].oa+,KURO()F'cn;/FsZ$s(65%e83jn'Qn(S[GJ+6$gr@Q*-Dj"?@[BmG8RPs/=:74m3>_q,5@0o,BdGdJKelS_'Kg%/^2k$/,dEg`(tH&r[uWFi1Z_";#0=_]luOqcS\,"+FGU1P7CK1/@EXZ!".@,?FnbTk?N6#b^YWW;F)2@QheJcBTAP1g4dKn-fYqZQo\"*8UfSN-]s%*$a%D[66,Y[]9mA4X`d9;t?%]Q:?kj-jd)q<*-7^0]P?I`1ZNY(s+,]b6D1$>6N4&1hgs-^kdo"elcM">f%W/Gl^6)\haZ=">$G'2qU<^H.'=JI$oVf$eCOpDe[Fd7d>:tW2R*Hs51".0_2S0Q3U*.@DN'`eQP]_R.;i+rkRZ-6:DGH'PY.#rlcE-MBR&l+9c8pObe.,2u6\DK=Bi;8?-!(Kj.66$r++(l\(:shBKQEb;-1aJHJ6kcGs4JMr!SYu!QISaSLEiS\E$FcM&;>sc8lBmR+IG\"PdGMEh43'[n=6.a8(E*%N5p'cYCplPf+f,_%OVo]#uqN_,2;'m^jtbUh^Xb=V6#2q=;Mg.KX:01F2?3C;3u]T-FB&XK^0q,YNA6UE0U&h<>\=l.Z9I+*hHs..cXKCQKUWGGM9A$nOc^!d9E-.<'3FO^iDZo4NN)Y?]q@jRK8J_6-4"%8?FJ<$QT#I'oj*`mTf>E'!G!qWfiT*n>Qlo*\E1Nd;-5WJ$_G=Cgn\,C`<$FgMN"-[!:ZGhoeSe_8]rA\c@4emV-a/KX*W4IkIqWQTr7ZBV&S<3L#V9iMmNVcb:)#/G6]8I(4WjZEtM)&Ni9RGi=ef&5`Q8H6g4D@(2>`Y:g):RJbdXAI"^/Vfo+*Hf5_Pc:3-%[UB>J`)M>B&]=.U/4G0Z%075!S#$8LVVN9S^1##>^_"m>l$FSXEO!b"_Rr:`:7Gh=LMt7pOo+ib`BFFsNYDf=]h!!N$JQf,U'hqSqis=an$-UMTnLPo!*8;plU,%_$kL-j`_:a(5$fAt&9.>_%YMYbJ3B0d!W4U$9`/`3)Ju8o+EVnLZ1Z6h7l5W*TdN/s4Qcod5@!s3KW&5smsFeg0U3tlilP?pE.p5Oof9o:C3)Ws$.$@u0`97j'gVoJ+8f9U4q/^=SBMp,%n*6sQP^$`-R\iY:B2g]1@u](a!#,)#P/-4cZ(PFGRHj?/QMS.-5[(C/d!C#ig5tVRf=>Dhj(j:4nAJInZZRNp5U7Ye&JjY%d=!+RqFf4m7Tj7"Fk(el]dn<,9m>`PdEjTA+8Jt1J]=>6="Fo?8-Tgl#%_Y3i$@].o9b(CSAgs$ddAm/OJ3:bi\cOslB1?a0)O>$!t;!TeLhJ30UC*u[>*"mdY!F\cKAJ@ZSMKugi]a0c2Z(aDqEU$*K:]#jLQmXW/&Hst>l]G)iUW%o!>n?(QQR(qmXb!fh$;Oefhsds-!A3M'8t[gi)dFhmTaVEI99;Tp,XtXsR[OS8/PHj5[Ys:mam3i+C[$tbc`2mb&)>P2TqZU2G,2fKP`9@3PpkJ)fRj?`XC=Ib`K_7XfJ?nWR:BFk_"0]Ao-b$)8+0XA7O.:Rl,(Pqt\H70f77&X8T7P6aQOM3?KKiS]3/[iFk4@on"28+35h'4W"<7'=7bX1pn%$MX4SUfik!VZE`BFgEE*%*q*JUajgqUts6$rttZ[_=fb%[n:Bb(q3k*A(C)Tpff)*rALb$C+t(?0[DKk_2_olb%*dYL_o8Q)+7;@*^QrKPX&-h3eC8_b%X0j9i"-CjO6#3gD6K2[`=4R=_/:aQZ\1e"3pUo-.iC4.J/dWgd9Y^^D3a5;_]p72AZ#jr\d.S*-jO,u[L*(;/m_A#e,66G9O%3NSrs#cS?"PJH%rZXh%5=fO?f68kLbA?*kCa>'S?!aY:SgV)r(i*T[60eFA+\>nfp\Y&A>\f6bQgUV#.kK%M17(kFnX2uS6mRBHr,.W@Gc0ISCI_#:K;]Ha(":>NjE6Ifj.Z7&N#":8'a\>9I&]7r.!U_%!2Y3S$aXY9^PY_GP*f>/p?lG6]-MA\P%c$8&Ud*:;E_7;=ZGQhDmd5t8U<$otCCZ"+@`T^K01(%if.3l59!-oE!8*`#Z6l]qYV@lU%OWU@eRRdW2F:tk]nfJ;9@G11Q^F9WIr1iA\m;)&$!kNh)EM4D=lW)_M`&NHpr+/"<9[n]h(I8PW],*i[q;QHQ?Bdo^O7%kT:C3[r/Xn&.i1oTQMMiXH`QYlFe$p7hlc4rQA=a&aP$bs+j]&fR1<"Um/GDk:#Bl1L8.bZta&ksajL`g*oHEF<<[hJ^$jZ)>(D+J74iaMYo"eo*pOA7cctAB%iF])j_TEfFjAJK8X]S1aIi^TLHS^>T6[LcH3YkdcI4_95`')mPk:5KYBDDBoJ6"!Y99q#9sOSC[=p?nS^T$Q3cPrq?;`I8K=kTUmbN4P:)UZ'+>dM"e!`0[p-QUUPjoR$."C='cp`._m5Ib*dUOZlI%/"P.^f=0->lO`*LiV"[+4rcbR6><'`nh#:#r&QI.E@S.c=7(0@'=/CY:BR%O@Fls//>OQX_+4lbK2m4EV?gV,4Rb$pIQ/At(3NA&uE-[<8=`jigMl+VQ7B">rq@]`.V#a@F];&=XY2t[AhO`P#@W25V4Lb\5~>endstream +Gatm>gN)%.&q/)-TPCO9S;BZ(VH`\sALGc7/+GU-B!MrMg4Djd@a*R,P\'76mqLWHOePQq>YZhK!#je[7ec-O%&W(*8:N]%@i'2Epgc(rAFh*'Cs?S`DsVNDk-$^5hUsi4\RK1nGp;*$;`@3p*WJfVB:('qG`/or7M'8S?a>BB%An!OuP1Yr3O!>eW?dY=<^]Cj]S/(N,K$\.V:2SGJRuiAm2HDig9Z%jT^0s;BD###\dSJ920IhKe4n#/B!c;!?J>DM/:2+g#W0:2U.eRTF#c(:K94uKN&Oar42R\W^)KSLa9X?mGca)F`^P@5="?^eJYm@<39/^3,I.lK<[`7CM6L^enfo.pg&9Ct:cd+atHi'Y[&he?QCsG1N3SYFa6IqPq*,W^H]7on4_GfULT)J;Wpq5S6A^Mi-6lW5r>r`I*#Ig>ff5/9'i^I9m%?)gGoV>)]loFfD4)A_TZF\PNF$K@b_(I?Cb`d11M-tmBp@IkUqC$LHKoF&lO85@l6KNp%*rE0m1Cg&j?a0.fYKZOIoTl(fBB:NjQ4WG\$EKX_@@)]!le9'7WsuS)dGp6?Hr94?O-!ud6t59&Z/<4E3nXl:h&+D&O^nbb$O^$BprF'NBg5egT!C'AA.,`8\$/Uo%s3S.I8GS>BLKRKQn(S[GJ+7O]T&?"9MBrY`%E.BPJG$>YSMHdE\Ii6J%Rh7dn4Xs$YQ1H.I.&QE87FMJ0WJE^DBE`\B$,rU%$6=df]QdOH[,c!kRn9)Mel>>_Nl.u#;V4^lL+$o^&AuNJ%a5Vk1C`,!7j>P5/.,0gm2b"fZ.fSo\"*8UfSN-K+Za+KWkU<1WXK?;jHd:ucMZoN[2JuBX=\kGIBa_l"\SnDs5T1V]13LoOhp/uD"6;#m^16[omP!T#IshQYi#aTP(mK2`3Fh6G.jH`>!g``:k!9cBrK9QkeI6]h%8(fE6#(6K*T40"doJG7A@lp)QV4tHZ)^K#hnZ-Jm!H)^AjroZY5co.TX'E>>d.qpo5D*$,19rDID;,4Sq;s@'QjHUU"n,Z/dZ*1mf-NuYqLTUn'O84BQGRFahh%(/>%>>'NjXI)>S7M.V3iQ,ma-XU3hBJTCkMp!_20q#KHZPRKkiG>("VRLo.-j*gC1&Z4";90>7N*j5"PW]k&4,npbn?C&hcK,5K,W3+W9a;)j].;D7;\d(@O5nr3;!BS_HF4sqCZn8?FE$A/iI)L2[@0i`jQAU^IL*W^/[RmXY8MT%c^8T?O[Cr71r63`&G^SY?#+1S:*ofe.FeD9WGnQlF^i(#NngS/.gum"cAYD\X4MRr#VGcE9Bkj(`jd]2qJ;c?lMZ?H'5=bjFbJo-[.;,[(#?g?TXoW7QY!MCQKtOkXJ[Q+%>pP#jX-4-Q6QUm+58'(&"fcX#Ae%%n8q(gu%[nl3!#1YHM%N'TieRc4.qM*5P5#hrQQp.6*5E$`)TiL`o21VSm6]A(;gS?!R*0EsigUWN1FmU0oOIc"[][/#4TK#4YH=S%#S'QPAMT6Q_:FXL"#(iWB,umThSa!Hl4[7KKNYYT>hF3r5Zin[dYO)*khnf-![T<+%)1;bJIn"F4;MRZRXoEQ86a[^mFlpqY#`K=$.%:QlA^GcVnf&+RNJol[&ONbK__0`pS;`NHf-TkBjRjY0KUXta\38rdef;/SMAL?W4UMY[D8M5S\le&XaEJ$^]rXQ.L`Up?[%bTiH/r\=Zl`-XRJX#4+a()$d-FcAjE\.&Q`;=]f+E@id3N6I$LH(a0H*[f%O+tfeR6j)L=3&3EOf4[b0C\8eO!$76C>47MTq'LjmR0>fVi\2JH7G!>lC@!IkS*P&hs?i0Aeltoe2_Bb-^)$NuV*+ee[OnXib&eV*de%W14"a7\1nV?Hc0brEoLs>A13U6\C%tgPN%puIm:oW_+10&:^FN]s/**cjC_:'PF1-I6l.TEPo\fA@:V/)MNb,>N(jU)+Rc"K7gPtHM/?]dipOUA[NYU3*g9OVE0hRlk]^rXC_]Ak]3]P$A.V*<6$s:(e%/j_h,S4WFoaiuYaO4_en!DMO3.q[-H"ADkJ&oAASf&9:YACi2'\HTS.pHiTKTklURh`s`Pn:>7B<_lh(I7qe)rC8kbC`le*M7_Al?=Ie%@P*?*LEZjo4Z%3;V^cF5_VU@U?TYEjF1:\_^PEn#tcA0)Tlea0n*0>9Rbq[fc21>"_gmJB2)T\@_EHFd)FA1pWp8u>Z4hQudi:^9gh]cGVa?bcJ0A8jX:lfYcdl9@X\-6Hio6P^&JE5^B\o=_F`>>p2B5STSaKt;Z\*gZAm,?.Q+:q__]$-4($@lHCnjKED8HCo-tCJe\O,:C&Q=Sq+]&'UY:MKQ^4*g#mF`L+p?)C(ckY(~>endstream endobj 139 0 obj << @@ -982,20 +982,20 @@ xref 0000021515 00000 n 0000021658 00000 n 0000024158 00000 n -0000028378 00000 n -0000031595 00000 n -0000035533 00000 n -0000040211 00000 n -0000044634 00000 n -0000048298 00000 n -0000052026 00000 n -0000056178 00000 n -0000060870 00000 n -0000065115 00000 n +0000028402 00000 n +0000031619 00000 n +0000035557 00000 n +0000040235 00000 n +0000044658 00000 n +0000048322 00000 n +0000052050 00000 n +0000056202 00000 n +0000060894 00000 n +0000065139 00000 n trailer << /ID -[<451f0f66dc9c89646f9eafccc7317ec7><451f0f66dc9c89646f9eafccc7317ec7>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 78 0 R @@ -1003,5 +1003,5 @@ trailer /Size 149 >> startxref -68202 +68226 %%EOF diff --git a/docs/20260607-2FA-email-mobile-auth-flow.md b/docs/20260607-2FA-email-mobile-auth-flow.md index ab748ca..d5ab508 100644 --- a/docs/20260607-2FA-email-mobile-auth-flow.md +++ b/docs/20260607-2FA-email-mobile-auth-flow.md @@ -6,6 +6,10 @@ _Date: 2026-06-07 — FR §9 (email) + FR §10 (registration, 2FA, mobile) — * --- +--- + +--- + ## Table of contents diff --git a/docs/20260607-2FA-email-mobile-auth-flow.pdf b/docs/20260607-2FA-email-mobile-auth-flow.pdf index 3101e9a..87272a1 100644 --- a/docs/20260607-2FA-email-mobile-auth-flow.pdf +++ b/docs/20260607-2FA-email-mobile-auth-flow.pdf @@ -215,7 +215,7 @@ endobj endobj 37 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 Email agent config & 2FA / mobile auth flow) /Trapped /False >> endobj @@ -345,38 +345,38 @@ Gau0ChfIL2&:Vr4Ytm=N)B6jaiLZJpE-!i&V/=;t4n'Y3fr3Ph,KU)fqcha<6CKf)#DO*5/6Vl;\%CP# endobj 62 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3710 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3629 >> stream -Gb!#^>Ar7W&q801+L&Yu3D!b<]%QJoEHCC/Su,5!(Hi-C-tnIGe]=Jb9.p6nLQlqhY0P37D&et=+ZV?Kq.;SnP2SnC^TBXc+-pSfV]Z/*OcU9:B9lr=L:X,E(eVNXMj0$\T7J`i)_m][&3ai_aaC3pO_KW=ZZtF0pV*HIhS>51!=Fm'F?pn7L8'jF0UT5D\U1/6?#N+N"po3)H/t'"Wnng8r?tj)m8dg2$af;L$'53SgTHZrriI]!-&L/(;)_ifi;I`b?Vd>%"+9`On2X\WD;^`al=Y@oEaV1c@.[&;\+e',jR6$pS>Tm`$]V]DIaJjh-CnN:I70,iH5Cb'[3KU13JHR#D,f6-l,'sJ8)3]qW2-EM^V=O=7hgNLPb24;cku6Up(#=s^;kBSrQJ5ak?WE[iMPcagn@\o5Kb_VH\+t#Z((Z^dcDPalV\`:.a>?,Ih'0_BH"Q>WVFc3:WLGM0&V:3Sl)*i$(A?_QUliAFFA?p)H[^)u'sAs)fY_Yc6mFPU`dP%EEq+LeoX14<'e&A#^]>nn^f*"]k\?hPra,;[]r0"B,'lGC4WK3k2*!R)C.b@32ENh71bsZ_>>iZD*MZ3Z0?o0>h/]-:E55(41.#Lj:hlb<-e]_.@)&WT+nk9M+A%g6%1kBr\2XZ,=qQN*p%,\:(&O*'(8'0])7iO4^,C&^DciL^a]_F9VsRR+=Y18MJXjp%.\(U_n52\W1YY0S'LUnHHLmQhlIe759QYj(1KWa%!UL'ha9tSAb4J,OWZN7?P!Oo-GgOQCkkYrCi.gHVIcF1bmV"l>gZgLtAe>?,:7;cCW[3!/HSHLY=`'2t6;&cg1c^hd'9>LqS#F:9&iLW(M`YgJjU:IOK'oQPYJ^gG6>/'&Ysh$Se9#.`,JM6hn6R):eq;<^@<$/Y+hBS(m*m5pkNVKtup4='0Ig6Ye*BO;0RpD/6be]D'!5<)c[-P.(Xk"8bD72-r^.U$"_gsibJH-n2C1OS4[uHJ(DflP"=qVZ%JkNsJ&hU11IU%CfVD$6+J->p2<(4D;/\`n[d'rg^Y0A&1c$/E3I1h9qoTcJ"k1KcVm+(p.5V!Vg3Tan3aVs0j'uVtj,3miFF1`p6X=hp3S0qdZ!Zcu.pB96NY(jm'';:5tU>^6'd@bmLL,kcTW5`\!*4kYuTkF`mV]bC(&q4Rr0lG9ART-pBH^[>oM"c:\>dF?h95P]b[i>iVA-U)U.O:K]+1[F+(nrarL3V&X]Nhd$qWh"N3q#j6eF^nNR5@M6DKppK4:p2Y_.-^Fb_tbpQ9raUKJ"SgLLK5<9EHg*en[eIXnig[=j?:7F=RgXo\Yrsn*o%QkqO8DBYBi0r/(\T9)<>46G6RGh3D1l?4dZe?O.E3cs]F7G&EDVgIUJ1A(41hB8[hgP]%Bn;-sW&&(D[$8n2AQML.n@6'T7=Rf$7,jPe8El(UEd@g0mjg:Y)Nc,?U!!qP2^BgqU(pi57i/5<"[r=TMV6A:Unl&8VH^dcdh.ZKr\N@"$I96\F>DpBBH8b&8*[32an]_m)KLF;^*m+F\@$&V+d;cbIbCmUm'YhL6Du"H63rGOX5q6Y:u\(p^p_0M5aVSh^GJQ4Tj\%@AGJAj3b+6G-K^;q2LS=HG<8T#QTdV`6[*\BsfV,:ZE?F/V$4G=4#@ij:0$e^LaWlQ."U[O>9hQ*arj?]Mj/4p2.lU7qWo66b8)&q&AJidqXg'sPA.BlrhLWuAD'G#qVF4Lu9o*_M5I$;K-NA'\n:W'FnYM#IQ9HB(3P?K=Zlb&\>/Zi=m(rZeLQ1VS*fdaEDBBc"\j$Kt>4u6(')C+B'(K#3W)S5:23]p5">ql-]CF6AEe9pRtd9TE1+!]<6LfA^j8@:TG(>.PCI)L;X<(c[X;-WKB1PYSsQYK$$_hQ"`S^A:b0`71K%)0KX7]4[gi?m]Re.;iZ4``c\9p'8N]u.0[M,#S&)eIH6W61S7;2Nm]/$+fu8ItsoEaO;cX;&liaf0,*kjC.J`;P^+$52d[=KXj8&'e*4P/,Z9[dDF-'YRZoZiF;%AH>tt,27mKF>&4?hEit4=L9Dp`?'0q7P5:(/f`++Ht18$P7L5$?#1K<#]`PUW%G=4j@3F7\3R^[)Y+AYf1]&Cl.2,0NI7!0Ap+.UN8JR]'>B(&.u%5,28EuF]`WHL\u#^B"FVQImS4`>50..'n#f$NoHN904+2lLB#mZFdbn&h$.!@@Fi&m^\9YI'335C>C2[lV*07_cchmU/kQ1(qF$^eD0AK9Tcp3rm8n>1V1Nlq;e[a&"Te>f!\(u-EWQ!^X[pj@6=O!.>ldGc+ip!2K7s91GpDtS2'8-TieBTo9t'+_J\Wd[sQVk0CkC[f.YSB`WCml9$.iD&'_lQm!j-d'l*~>endstream +GatU6lYkN;'*"Q$Tr8@4VI6d#P$;E`oKGClJ,-4?S>(&]GX,GjOpdhCKOtkEs%@OPjUoTdchn_!oLiZn&UncH@@@@/o!ZZc[1R)u!>6[:e)t))6",Z7]Ur\F5,K#!X=t>Je4tbcsAm/k2Ta0S'lUu>b]u2\=%I)/tifM)2o<4;IEINlWCu]gU-rUVBB_;n;5Skr<&22ZLF@`/$AksI^3kG0?Dt,pe1i?6Y9Na1I2HpG$BkGMtK0Y`5)$k=OC[X6V/_c,q!a]K_'1I&_2^EJXf>C*]cI.RJJa3AF#=WN'&l[\`9_'u'R8J]5Br/EgU00!T:bZ70!jYiQYUb#ai[$#A0UKC;=W:fLq0rgFq]G4@!Of_KL$E!A&9AZ!G_mMD#6a]r`Arn2L*Q[%:AfHc9:&6qfl0@6#=:F($eItt24R4D$B$9j)@U!tm27BXB7#rn>s\+!&#P5Mqoa.=KS@0?O`s8TWkAro']Q2&>J@*q874IH^ee-/4G`(=hA0"9UldGh3(s$&.4k+rR*fNe2n]dN\2:ZOpN>EOAZu`Y#%N'ju[6LCiFdCNNuZ+>g"CR&ug:q'@.=];I@`gU'gL9Om>iN=>'V)g"Cqq'G9)s;7+'%d$OR[)s2K#@&6_Z*#M-Mnq*Ug"l@XZ)fSuHJ2_@'[CV11/LuS0*]je\a9b=jL>-?U-a='VO-7D3%#>?H@;3$=fRT5iDfEM-ZlqJ$.74QpruSqDQ(s?d2_hH<-4n!9^-L<>dI9tdYrUAQY5HUr9X+FB4a!QX)S$'0\>@M$>[=N2P+^A^hMrVSiBINLQ:MPg,K.!nF,^.q$@i*Y3SKo3OjMk"$+$qI50\n>ci))$(:+\0<\<]@RHYqIa4k9D=^(W3PO/)%;,(n6j,k_Vm;2BCVYc[b:8E.-6M?tgP5#3aKPg@"@J27be\.)4Y0A-YhNf\;ld_;d?Vfie*N=Z,7WH^uE<('<6pO&00ZGE,*D%jcjNWs5RK4@puP!`r64P,(=ckO0KGg?k575cG0L%$GGdnFH]:,@4M;fM^)YE4;V!2=R,%HF]kqr6>Z#8]'ZDPP0o+4;a2KplQ?5(gaCn!5'RpH0SlT&'ISWse7mc[1c(-7#9XUUQ%AEd7p.ckt\,$>g,3#.$fm6C''HZ5H1a+S#GRnLMR^-Lg-4NA6Bq,!6p*8b/!D+>VjTo?mH_>T7e@@'LXZXHs1h&f_Vli'<8WER^!A:nuSVl'3[j=8KT3WHhj-$)3@\\a0;Rm`d1u"26GP6Y;6\FOFho-"g5G;+UnKTPVV-F+dbtYUg"+s;2VOMb]@ImVB9>+m6"BGcdm5Sm+-Z^@6_^nrB&Wm^?B:\\"4T4hj54&=[POpiRJeQOnh\8.^&T^GaXH(c1Y.b+$mD#&.&tkQT,p5qV@`M!JVPV-WXdS/VuD;nW.7FI^*K@Zl50,Qg.Wf"$Z4`mOj&aUJ2HG42BG88Q$ftPisn`"'sIq&.Gd,)7#s`n<3[#+"-0Z.s.4YjdtG\TT?[CVPt\eEL[VmDj`5lbs1".n"k[.3Xc<3UQ"["E>XGS$!T)oM%O-[dKhts#Z@cI82VJC/%j)8Eijq<[0!8+'pu#dB4B0HW`q3UWafaTWU1-KnkCcV]cH*8HLbEH>XqeBoC?'K[IBkN0p:BapNH-r5qj8P^k'SRO[%QMq2:3e@h3RA]/L.:PSi'rA.2Z-*pEiK;RQ_q?DF;pR?Kom;-1m%%A3'C/8MA$nNhC,?fu$bdT%tn9'Sn!q!6PSMfgYPBn(m$<==XVQAJ@6IIF6Q,R+#!"B5ZL_=FF,BDh)!c0S=J-rW.:8NCG$J-ljIk1Vb;"$IB/?TB,kO!.X$oZ38qS_"rEe9o+P:5?P%KI8gXrXg(D.B@[HIfg(ObEK<2>0dNR47lZ1]g1$DffA):W'kbUtYeg>&VZ%V64)\?k/$1,1?-etg*\J(*_D:C'PIp\u4rPr^GiNLROnG@+;G`Ot9RmX^DeDot"Ph-Zt`GNbZH^4=H9:W+SGaRc2E*8s`X4"2T5tn?2n#4Jai"YEXRP-]1rj8"XEs\=q4@mM]?J2;0K9_Rbehl-"_@jZZKm1f=!V-Q`JVb]a\FSdG&;@PS\UdY[:1P;pE%g-?]&AG\W_%:/p/Lb$BZ5GUgBsgQ9iWb,6gi(=mU@;/^g!%oe[#:@@(\lTV(;8a,4%o\FANcGWn*RT0h.$[?uF[]/71_^tqNeq^bE:))/Ys5LO\\bQ~>endstream endobj 63 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3436 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3594 >> stream -Gb!#^HZ.Z[&c^a\@Z\$2jUtL>MNWAo@QSbY]lW2>Kd&rc*7j+Ag4\NBjO1JoU7]-*bD.L'Zm[*:eOF#)4.Mk4kAQ)35f[5!rBC_kcGn5G1r(eR49NLPC`*0Z(ZU-d#=_I&45+*+kVfrgU#oH%)t1[U>qO+g"6,4FRUs0/3B&b4-GM2T[_Y93M77'@Rh["!Rm@DFdH)A2E"-\,d$!a-i/(A\5Rb"G$%*0t\`.P\;lOkt0q**&#$NG`tNO"'@PU;i`""KH!(;(r\VsnPKpTkU;>a"2bLbiBP9T?PKg?hZ%V=ST14m$6#;,&eYIA5l2)1:[-s%MZ3JEp0?#FmKFl-C,K-j'LcK$5kHDa+[(B9-#Wk%I)1l#LFQRGs2CEF)jP)OVJE\>M9Q0`Tt*2"[mi_$p6@h;$sokR[44]ui/rj"-paZ_>tNJf`6U+!p[q9HYk^W4&BIPa+.VWktpO*@cNj?e=%mSiadeGMIZU'Y/1=,))l8rPF0UH6Z23p!MuKQ9F^d$VZh.2KRJdOiioI%&Q,S&l\InT7&0e0lT,Lnor8F_cI3p_3YBVarK__J,mb>d"!D]lTgDhTR?lO:/$^\E0\Tq.eoa).GYg5sReuHGF.Xcn#3.]OK:-!eZWcf`E,U0so)@i/qPicV`lETr_G;S!_K/r?13">n?5iog=3V[V\(]K09[c]hbK.eK]Aln'lOGi+@V8\\FW%)Ou+[rTkS"nC0id?QRNF)CWlbj%iIV$t2]mn)dMj)Z&6d.q06'ZR'uqb4Sp4(#62[Jb'p&Q_7QVo79A_s[m'Yo6Z')oqB-8Wm%OR#],.HY?9R4"H7i-cp\fMV<'JPG"k/nmp-2s837/PT.2\df>$X/XF92qWRE\WE_351$)f1LNs)R"Gm,&4Yuo+9>@m`gu8_36Ee"hGG-`lD3'!f$Xe&>'Oc,+T/.\?3!IF5?OD!*Qf>T\(V&,uhs1a#$b_#8ZN*'&e`P>sbjTO$K>Y<.KXjZ.DhR"8@-VoN^QRn[X53S*JBZ,+70"+2$A80Qg6e1T5QGNp^as?6ibM]LQ$@ZESA9mHqah2QWd.o>Ylk8,_,'oX,mO2Y4cj)@FdKnj95*;a4`YDU0prAHp?2?ZfFQAKX/tTnb'G%H.NQS?XH0>V@`k!(Ws8+*J[BQqkgAVGG1<+(Z)W+':'lig2DW+A0GAB7*P4e:?,Yhm<]C[dV^(@W?KW6R@^q7kF@10*uCMB38B.DnM_^M,W[m+;$FZ'7Ncr]cSA"U-Ai\iFB=f3Un5iX9UD1Nc-@IqkWZ1S)l6]Ll1805q#NhdX.T\iT^WjSR`h#3XaE9ZTpaF/l[ac-ugSI=IS=-kL6UO5j4O_%.c/\)"CD[dkC:?c[WRPk"IQFob!mf!\9fS\F&RMhQ6_Dd,[?V4#Xm(e,,\reN,eDbf:Q'b]!>8MnE3LAKg*-JWT`P@ZT@790kF9+j+"2mZVO1\]V)h#d?H>[@ij'n_Xskqs1`m^4Ok0O/IN.bo[JoZJdeJCmU?M'qQd(Mr=3pDdTA@e$i)Qkm,t]gM0_'T]=AU-k,t;BB1^RZUlVS>"@1I8K'daKZs3JogV_LIRjsq7EF>R0^ulu][L)%CV.i!8pMq?g1KCka<^h?^=QH^Rh/:g"[?+g9nsglN)0[pug%dXiGe.8nFM$Y+'tH%1MA5Rf(PKf`(bU1toL8FY=T(gU[`gtDa-@h&-mDdeLmk*ZZKJ=XH?=OQH(&r\Bd"\E53sO47hL7FLd-t.:nmGHonXC&5C-f%0f@MY@/%Q'V1E1uJPm.(d/7>H\/E"!H!Gd!m!P`1RL1+_4+EoL9GQHSBVI/160Uh;]bk#qkn[CNLmUEnL"\No>2b?H@piC#hZ<96Gc`4$*)X+F3m"0%VM#VFS'k*@(L7m`)i@ff?mo':Ot%,SKJ$I(HR:Z,R=<)go,?,Pl)Dotd4HIX!C9A!Vn2*Z"sTp&,`kVDq6?o-`@B?`0nXg@M1"uRO;&;+CqGm@aViC3OQ;q+[1hsQ??IT[Up^n37Q`R@-:5USki8n@fb$^7plef94=endstream +Gb!#^HZ.Xu')t1g@aMaA\D'L(e$>0Sd3MGtftFcG,WPF8"r<.cgMA05eK]n]Mu2j",UM-0-!N9RfPAhl'$9*OT"j7*!$-Otq6(S9SD?R4dK%1HhV8"*j*/s;?DXH:G]OgZN'ruj\tU,&eD^Kt1rWoIDG#H#B/+VYl>huAY93U&O_p&u8q1`@5Xu)WR3H5t2OT2L3WY/QU)A8jI9k-4&,/"I$dC=j^SP^PPc#B0(K%6QEeeHlYZg$K@a4;!N=FLA$^4!mrbdp"lskN6OFrKBl$#*(-EosjmsVEp4T"<3bSY_?PpMr5s7:l:s'YIi&c]p?"XF7#d8%LsOmLr]A$6#RoT^,n56K$TF"g.0Ltq,?!r:1.hM'ml/r(=&170?NF&`k:i;CmAfg!P<)T%[T]tZ#m[d!,8LpBFWSF[_l#kHd3Uhu%1]p-MBVD6pu3YGKoDOs[s@62\oGSJ@`Kfs)4m#QM=H(#c*RJX&!ReoCfZoB1*(O!%0q(A?&X:`reK`^XKIpNqi5V8p#'$X:0!m)`6l!jDt(1%CED(3-_/r6IfN_Lb>A$ItVb_=@e[?]r6@l-3c9GTCbT7@''?kV_$=JlmWGL"r,3Zs?(!>PFLTp00+h_>P)l@BfkQ9b5uN6WT;nL(!U`66*t!)NNQ!jJfqOjFK(2u2VTP&JK5gEqd(rr(d::4T=%&1qtFMKUgp>?R(:iJSU[7`\KN?+)]:rH5Ui%aH$2_&Wt38&EhLhcc'K+)$mY%[RtU]Uf<^_f0sGd4$gf`r;^E;ON(=BS8R(Uca5JjE&207<#rQkPuUiV>@F^22pe,>f62Jk4N6'63!&n=\aR+LB^-Qph,3gMF@tfD>U&M+LHQp[OW-JFZ%VdR&sF@[POj/e8IXT/]N!!UMGEZa=een1^OhEOHY#U5WVD^%)"4-BGYXI6SYq8]EgR4jd>Ga\lGr3\!SBi&pF_O[,a2r#abiu2jj"9q'<#)0V(62ZpSaY92%a1PDiPOa1[7YHXG0Ocn:Fuk+fgJ&tHb8?cB(Wb"5OuLjuVYGY.?("iDMTn?>o&<>gmN/rUt,hiG(^oi?"5e,#jaWMH[!KR(KUUgP>5Z)Ylm*s'6tZ0Y5[ZZ3uSM6Z'f*)m*p;4g\T)a]6&o?08VqpVCg?tQ0h3?mj9l8I&&n0IHr0'`1SaQ4Z)eThP[ME%8IAWCmYjC2Kf%m0q0K@a]aPGV(U)Qc=DoNj_G0Ol7\^;#3&Fg*>bXY@%m[l2XVHAF>Q1al0>A0knh7it%I^!)q]@4I4\:u[aU==+'ipM5:biDD+E.$Bf0NW\sC0ku=I>JBLJ>E9o.L.ZX0+Hjg[[+R7.l38=q=:65aYZL[8Rf2UW.lnYLp#meSW!@cJd`Y%*#=>(=WGooS*eH\7?,MtHl(HfZ2E#ep7N!U*BV_bGG#3$t!gbZ5b6[,]"2tq\/CsOeqe)Wo+BFeV(KE\*,.glDI;H*ba+Y;Zo>ItRii3kWa+A*Vk9S9HS7?gZM?rXDfU$ago_eRZGT0K]Ih'c07.]t:D^G:-Bgt1`i"QY+Hi]4"b,4ONZi9b$?j"Lc(OI87T9UQ#(^biebVqrm@Z$f?IomCF]Sl<;6rQj7Z=`D/ZZ>9mJo(M$N5IYep-l[-aG)15U,8F=UCh9]unE<;4^=]5NQ$^#\OrmoCL5,+c,^W(f"()J9),+E0[:\(*Gh14;"F*l@IhFX]:WQF+@G_-?/*%A-n)jiY;J/!=5+:-5J1RQr>N9)Z@S)7[@Vm7Nu>mWO\D#F!Q(X]c>if")l0k=@;aYfR!GTlJq!nW>;XJ95tSL:800Hpf)]e!91W%%\^tJoetC5L*?jP?)r&n8iY=GnP+\H,nft1<",X0Y-/F'_R`,l9'hSR$nC`2/-)R?k-Q%OkO,K%FNd-lV^%K;GXflBNS-@-_k'3#mdW)BB7B348=L2Om_NP&dS_3-"1"_eX8*#$![\5H%9gkV]i'2SOHL6*pF*hb6EY(UDd!+AiT0K3RD3>E&'$Vlgq:]~>endstream endobj 64 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3839 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3769 >> stream -Gb!l">Begk%Xua-^ru.C)N3TL'G[8-Y3ak6g:108Ac(J.E^nPL@SLm1+_=1D^)5]uM)RG-?T(Yp;)8>/(^tp*Qma*;NtVEKEWN>/0Y17L;.7!97@/*uIYO?RRr<50A>VPV%!*uc0JQ:9XA*hb%u97[QuCk)"XPCn8n1u785]UIU*tpQ5/ZAd^eZEMqqr+AM(Ra.b^:Mp,R@]n?ah\k5I:7E@)Fss6,GF!p+F%3>L$JmaT4LrfC5`=g4FWd+9?r@JN3ASF/]u,8tuEUC/6Re3.5Bm!l=+'\(@k#@fi@[AOf[:a%R]2)5gFPj@7%Knn?toq9c;V:DnD9;r9V5L\Q<@D<10C--!F9S:o+ZP7#gR)YhN-ikQP)_T)Qbb_)sc%f>(KbO+/+^g^WkR<&]&*aOlB?TE;6K>maHd`BrJcn2.]!2&C$,kr,Sqs05PWY9f^5kXlhLH"G[?;_$hk'd<&d&<]?\bNjCqHD2-'kWs_KANX_J5>D04r":kD`WEOW%``tnURW7@s&,RfgEX@O,EAs.%ogf3`.55$VjJo2//4IW*3gR*R^T'2T[M>kksH\*.,X25J0dO1^PI\`PL@amf7Rq-^"Rp;&I+/i9o(bnZ=d\'/W]aangNlm^d(1[KhC<`Ro5;6L"bQXc4']+\Pb9I[LC0_dpEc8js>M<7Q5MC@kb9j.iVM'KHs$JSsitj?uDQ$W(bS(Z;S6Xq/T;gpKdh(j_/UAtj&s'k8`-30lp08j^js"W[NO2"?726Q+qP8^X!(eU7N(gt:^N)VkEkdN_J/Gb9![[aiVpAs1oTCC49CnGqqI)/V\?NP>bO+Uu(=.Ht^(QWKM?UCrLDjB+`0]h$aG@J-C+;e(PJ6G$U->(Q92.mbLO9%rg-Y10;jiQBW1Apt2X./i;^L(C0kE3SK/"qR:"mg4H*c^EJnqa&aAPlMf#mH7^TsZ-79Y%hs>QC35`?Xj*iT^/(Lp786%$7p,"^X%9a2*c=4#ER[>+C>`.@,2HUYqTF6UooG^8L6X1n?#ZG"IAeL)?'(*`*8:afUm7C6PiU*6$]6T%2gH[&d#>/V#8F/a)bXgfZ^ecEJj[)N63H@"9NhX/BKR)-I>"WO6QkoO`PcuF=:_R#uj%sYee+Hm\9qbiuaYoi9(`LR%=3^M3-4A$/K^Dp$4kYDpHD;SsVFdkm(.W`L)W6jM:#q"'qB/4)N2]he0Ic55`b%-c$@3Do)1"\l0]qG;0KaK04f3MiV%R4S3.nB:\'e:,`[S$/8l<1\M'^BP&4*KXIOJ\nOsfhm*6NI^gp)/RUWHG+d4o>rLNF5(L)Y$*UN6oX6al6d05$D188@-:U\H>@.3=On'm=%eb2GQ;Qh*Z4^a%/F+ZZq,XPD@RO/44Se*G[laIERBVBUdbT[Ic`"f%YmJ&%!LPG\oAh&+a=Y4.;ui<$Bb'V;+')R$B*Yt12mg\[@pF$p/pA0)bG2S/WRW65=7`%^7PpmHY)q)Wp5@;WiG*Q7pf;tcLH`c*pQu%c]*[E<)2p%d3+HAs"tiZ1Qc6a,&Om!6.7hqmVe!=Q:77;%RRe+*Q*-gN6!$!Ll"]7"RU31N?tO=JEP(tHAd"f$,SRZZ%,.?6_K(!Qi>g8]on%MRW9FseQ`'ZtUgM`/Ri$R+S`mksCVN*i+>2Q4gq8$l\-`*o?uji4!WC+m3Um0CnIWc6e/k+H;Zidfl<<=hhaQZ*l(Z\qdp_I5g`qJc425(erL%cUH@N42\(>#dRX$>)jKhR2`dhRkN=SJKeHFSEZ2Q1a.9^NEK`8>ck\;O(fa'fuhql_b=7$sST2DMGkYH@C_cKNT71[Y-P]oj+X\7@,LqG/#7S.^6r];hgM@@q%nQ3QbER9dtA@b!8'd#lDR=pErZT6$Xl)-1T"c:&WpB3Z3a1L$4k`Pjbe_sh+Df2q6m2X[UR1G2h6>[oTm\)=I)$8mqcGBoI^\AZr"]mPAFW)K$fc%7O&Bk!cK@ihBf,'k>30Tr8P\WE@W57o[pl%7%QU';P1ZFP)jCi*q*ouf[GUt]G@cQ14IZYBeT0a/6hrrL>!1W_t$(>!#.Of6f(AA*XgYoAGlIh>Ihjc7lk]$V(`O!K@nS4f@DptP<'EBXS0UJI:!<9gme5#7B)5g@V9]-.%e0WO!+"`XXeRYU?k3JZ"M+UG2MF@42['k0h<#Z$]6YqT]jHCCW[g3?nK3h9\8n"dfQGsH[=<#ZA.rr`.e@XAi:`OZ.&JmAr&=fP?ZM'cID:pn1]BV^S!%A#8o:;R;-AkDYGkE8d?VEG1M^ssD0@WC'8gF3*JPN&#>H5kr48jYR5M:WhkU+?^(e(YI%r6^?\M(#NS7lLeI@XmDpInG=ZlB`e<9^8^5pAHd^g[Y-Fbsm88EU].+k]k:iQkJPheFV[5?rJ-+@N.2r?uBH*=NJW7b(Z1>8<"+V#q,daeGDjZhkjI>R,jr%!F1pL\^b?5@E@2"[Di6rgfGloKPF4[W:&IEe)WBMH+DV;#*g2Stru!VEmKhZ~>endstream +Gb!l!>Beg[&q9SYR$ZXh1`"'"81HgX?.lKHZuN3Mb4`f$EZb^R=S$-dZD2oa"5ZV+2^N*D[V6]0"D7pk_9DW_+G#>uV"jte$ZNM,nZ;qW$qgsRC*o:Lq"Yl"lp^VG-b,HC``>e)9H\tjE/`s:h&+K#=5)m#/XCLh;ec<')A5]^f\V.7Pq*LV?n_;]>m#="#\h[A=A$nH,E%.o92!F7HQM?VChQ&,Qo1=\eK!(!6u;cVhSGkfr[7Z40r/BJfh,R#"glPC8Ws.i#Hl*2Bu/5Coqhs!Wj[S&7P[V\PT#VtVK?fZhf^lPKI"rkje1=;+s=RKn!,>\'Ub5,kXPK1g#.M2\nt$Nc]Z0RWQH\pJJ8Q/2HM\@DSA&mfrukL*#5A\JO)fn2fZ)BNHm=\s#G,fCd)+HF/*>j=b;egQ'B3m`g97ULN["5!0rfk[g2Rm:NY=j]ptTorN$Xsp[][8G-o/=q);T')&WaLUIi)E@VDOWXo59DncpnC]-/PDVBhjT9_+#nRfL+6^]S,=Zo0]E%bNFoeb\_ANF.7GD]A2-"EI_arU#A9LW[J5A0mO=F;Hh_?d%ct?cT2?tPdQjJWo8B4HgZ/Wt<_/j,e2-?9Rqrp]F4eH/=?ou!Rs%'0#ejb2JZg5/iQ(P3R9.U^`EtaAC&A68'7Ns'brhR:a5?FGI$\5PM5tCOa;H'[o@D.+g4KaZWW\S!Vm%QKo'>Mk?a"A(_>Jb5je'L8'@2>P,oA7oKu[0L]o+CWWX]bh:\^K^DD?=+W)rlW%_qf8%W5`[M9P(V_XMg[LaA^2-a6Ms6/J7'ZkPUgA9'A7M2PMUa",J79(nV0&;D&O,!heu,6"&i2PmnW>+-3oJN2tTYu#PG6)LDANPteSXU/4`8YdF3*3s%EX>,j3dl9Bu`_jW"0*BTcaS5G>#&AQq8'N_(.8_0nJ%,o%?>iYe>%kP"UR/:/bi]Im3-pPj6SW)(a]OZR$^gtW.dPB*KtHG0DetXG0pdU2W$^^MgsLR'l5CE4`@^SQ?7rEDlD^"'4BM\Am$,o@C+;'l]8B*BO2fRE3.I<7g+c!QUb&,@DV].4cf`g(0m_Z!D]l`PP8OAS-k8=rgsK;o)*;/0R>mOF.756mCeX<&;3r^n8SH0U[>m4u.sG`=V-ihm(jN]?<#3Ca@/6'e#Xat\H@o#H$a%i[dYc<_!k?YdI*-e5PpVlgFg%TtP/IC1+b(oa;a`3?*r\?QaPJlLU_H661o7#rV+=cRTUt)+C4ejU2^f_pLSfh@V+u]!W@UdF)%B%L_Dt3oCMK!&'-S^%(W[E:Its#a\+pgenic""_56Q,-#N%B9J%58'!=R;\2K*;IT3e-nQk2:26bSai;uM3T@H-id6WtoEg+t!GG\o\a,Dk_r>d[CXEM#cG5t[(Da&m=*PVJXQfk_u98UjUP[mH\(3S"R;=()WL47!2P-/uNeYEl>W^`mkATGr8f+1b5@kaahh0EToK912k^a2-0p?/6`gjR7_MJ/3"@5E%*<*`>>WHs0[+$5G1[@tR"+2`5JJ%48fl/@]ZU5.X;#fAMB39sn$iF8.4G[]O:#fqnt*o#^R!NclSX_PB7j7;/Ld;&Di5B>-=0iGAqd-^Mb8pYc2\CcSkCX?V2\E"@p`?mh`_D-LO,7_HA86[Ur5GfuACYan&>kT[RNAs'?it)'+DrfQOmY)L\W7O?E(HYFV.tV&UOCedHgG[d:VepDrT!rfO&DcaR?4+'FJuiV_N@T69Dnudkmn]=i8)@um4USuDfsC<='/=)<@rA3+`rpTAk03)-72(GL*q?S"jMr;hqh(1+$M`Rh(BqJW:9@mjFaL<032-9;:TW;Bla"(uPe2FTr'f$Q`PT%V?)/>[mq12LOS&KOO38i%[IN*@O+eFps7t%nA]Xbjo8]^)8f2bl!;&(G[ofKGU=bZUk5u[%G=`@OKegEoo+u_,7dC5;7NPAQhGQYP.o]e+W&c.#o'MN1-R4u-,ed_WSimcg+29(!]N8&i=kT1IB+N\m7`I%u\tE`*eB$8g>n`0=5hDQY"3NfSM9iLq/14OuMPaI&d3ihO*UrlTq#Rg9K[_.4*/ikSVhi:82njFMal`Qj>\;iD8t2<.`BDZ?DE9=_>!D&af-dV3oJhD`ia22XA2\Gj\*_a67Y$V`Etd&0"Si"VVtP_?UW%4TT!Ce=hlX6YUk8THOGc.Bc7A<"/D*0o.l3@O8J_1UGaUF@+=p)/\fpb]hAoW8UAj=c]:Q.h\h#5U6ZS2.2_/0V*WGSQFkGZ%RQX1.G?%U`.O/8]u/SjV,5M(8:#"a@D[?IftR)dh#?g&9C(AC_jIM^ui(!Yl6T6dX@8K&,KJX?H\>&BRJh`q(4cOq^,N8#bR[*41)NbOf5+CBS-<$&'DI.bU,;.X@R,S2C[9ri)"k;S@@>?YQN2M$T9(5-3~>endstream endobj 65 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4240 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4187 >> stream -GauGdD0+\pqKm[FAicJo]8>Ql6[HEeRuhOUP2.Z4D*K_l.(0+oN9unt&FS0-,9+C*N%L1c-LHDIr(,02S"q/Erfm%^H\Khe#s,h%OJ8Jk*%AIpUWG)+9hrEp.,1/%?]m:c5aH<(Q[oXMV5*Ci$X#*Q!b-9>'^6j]=^FpUY_AF/%)_?L8jP=Z@g)kV%)@D,h]jZh5?M&-B\'1.0gJMG!4osr\LiCf7%Vr]a!\VOt)?/S4)3*iI\_KqpFTI]5FY0E;.2F:l=)kl_7]VI)kmr.Hk6_hC71XYas[hG3lr)Y$#(-:paf"j$rgcCSeZn8pEtp!$lYB'3B%B[CS2a6XE2_q%C\bi+!9dJ=>pLlo:4t9sXG1q#B**e5n6X:f.+3r7d'=TQP!`A[KU=^P^hi!8!=Pj!^/q/Nmc1Ab=b,<-Moi:qh4p=SKXNAbLoqTB9Xt&.&NA'=`f37ifTTN4HBe;WNG'NJ>1/]OR3+d*/m0KiLM5F)9qL!J+20pIq`+sqG2SI+e+]b6TIG_1!M.')6bjmUDao,DDF2/+'RBJ1Gc(fOEP1=MMB0XO1LZa_'++joQHlq0R/g>*e-2-EE>5MWlG*p:Y]0Qo$85XGh+.lb`qXV4aD:"V$aA>6_lIc[7f-1&_np<$I>sB)a"+HD%$K6QELuL;'\OWf`65hi)SKn%F\.28F@=P,lET7Fk&pdT?R2Ou!5=I(8j4UntIGH8K.Sbu?Ue3CqK*S71lmn7(SKKK^pXFW-p'/nI'S&]\/Z%+ENk9lKDnAOMS(Yd[Y1&ghQA$B12C/#Kg\pb"ALfl>p*0o2r&l2@^R9C3HlATUL<3uA-Qk8qGLB@.TW=+d#6Lc-U"1.oR!b=WDcJ!]@oFcZ!]^>HN9c9oH_1*K"cf(RlG\B=mhbW\DKn/FKIO,H3u,/^3Q`Y(5e8/$n+pgN#dK%DrnuPmD_dqp&DV-moO_g>K)XcYAS71]=#E?4P*Y7O8?rYHTGRF3,0QN;Gi(P+#Ij>#\>F9L>eOKi8QGfQRR$s5XVn&h21p@iS'.@-,p"/*cF5m+&;U2(1?d"*`5+Xo+NVTB_lif./!ekN:Fc$bEp,Ioo@ck(0.P7-;tW7El_mYpUs)p':RW=jn%*5dM:Gpur9K86f"YVI%MD!tJSRuY)jba!b.Y&Ueh&ATJc?;#BM?^-:BSqd!ek]]#9jr4k'"J(K&Z+d;,A8#!sH_1K:76b=I9P)D")6h&'i"-Wn5-(_ATX=iEdY"b=TYcYq-DO/.^\fd>5!I7lkY"N-$YIdG"3B#(W$]_%b-[#9gBHPG7Y")[)e!7pFdPb1Gb,+rUT(9kPT$$!&5C2g_5?o;;Fs^n"1J9"-EOOG:@GDP+T5X2"@#NCqf&#EDiMRe,&GXXD9+\u6Q)X3Z8&1aeks)-#]f$G%ZN/hDD,sDe)P$H*("+ZZFY0c?=[sm",sFl@\jR"*K3jkC\:b9pJE*4DMK8ep^i/TNdR3&+j?S?NkmA>N!j%#;<`j[W)"fclFi+'XEW*mGI3+FN*_FLY(BYXPfR@C&$=&/`%Y;ipe""cA-)T[`>J_7ioD20e#cic'tAW@;*9)]9VX2-M_J<40oV[@;[SrA[+SGE_p29*LiFo9M.Ac("tgQLc[XhR/&)ioj[1(Cgo]_`aSYRd_33+\/c3W3WYYh;u>oI3k*=r[]YQA1--]3L6E.?G11H@K4<4`bISJ`Q?!;=^eh\F&j'ZM%;UuT0[+pH&o5j]WV5W5?*oR&[*/?\.;`SK_78eO8'*Cn3hXi/k-,!4dlnIE.r\\&Y"SD/Ip'BGl`b/IRFrui=ba\L%qZQbRau*1c#Q3HGD-h3.d#4T\`Er57LKJUV(YmSn^_R$cLZV@Y$5cUKO5tf*6tA2[bXrb#77-A>e8%]R^>(.dK\]#Lgp+nQ!,e+Un'XAn]&lhpCA^s*0b'h-GJ-1+.a%jf=tFcZn`)_W8TED>%@8PFK]q*R>pYZIsB7W^Eo;4AqH7PWlSQEH'"RsR&k0(Bs#K-(%dmomZnj65t5L2/99]Lq`>4Z=\*Os?qDnDI3h2TC_*htTJ)B6*^+aK8_q?N/pqG0p.C#Dp,^0r>?,EceMo3u(U*Hq`NZn=p)@m7aXeYG:FB.m%g@7!hucUbqR%ZSCj[XsuTRI\!]WXgFp,o7j0cI$FOlG#1bLbH#;AT_P0pY'IU3Ua.4W0fGdfu7b;q%3l3i;*fecU7!#0\rD"<1L8CQn7$fX/mqocOS+mf,hMHgWAam.^K^kA`c7_sbA=S5BFdn=`11Ch*LsPU)L+&F;i!L&E:/P"Zf*Nq.shekR2rokRE7nO%BE=I\1ZI"E`KT(=c;O-c3&K<"=)Z^;&ir""]iN\L~>endstream +Gb"/+D/\/g')p`p6""]2]1j!QbKcfkEt`be]d-;ckB9',0GKAPe]=IW8TB-mre?U/@Tf!f[0tcF6eXRVW?F8TS7cHT.S,:9-2lFu,P5u5c9<[J;:0K:'OB/7oGUH$Dn`t`G!0t815CUc,AT9'$uMfXHdE0S.KqD(1=1-&'UaAU"%FiR0Ka#,cQZ9U/OKJ'ViXN5a)*4\eo0\(F^Z.U\a0A-#M.'(L"cA6GGFiWP$`>I8"<3@;3g8YpF%29i+MW"b@84IrI^OA/uZO\mh%iCrrFnPc*7I+/Q$[,>$8tWs@Hb''#o[\GA,4ki3Wah<5p+XH&(f[cbs=6J&[7r?82$f*d6^igs%IS61u'J]t0Uo9ZK)9.Asa[,X+OEJL$%7+8K74N#^_rSm,a/_/_qH'ub?de2=df5?sHIAj^$\Sgk3=-Z8u\=_WDaX?eSJ9PSAN`Bu?`9f=eNZf^7UfDN$'Rh?"+MPOG&&Ob.(!J$9>lYogX).Y49:QCtM[s3O7VXP1d%IATJgGMPHFG[)+HLX>"%6O@539SS%>Nj/$3KVH(q)Dg)mKR(C9NfsGcmV&_Vn%Blc&$8AbITp>8a9`HJ\G-=?g9Wi]LED"dcD5ehrM7&`[&1W?ZH"7QMi=qm,;>N)$V0+eNXmg7;#c-5e&1#/9gG&_B\,Fn_AfHm5c%G>?L@hQg_DqLeNFGY9JjL%R`Nn1o@2_\1Mt;46"o8Cd"$S^GucpAo]V).1Tq_%]9DqcanHH3,E#:4&k<(5e8/,S[`rRiM]0\FsC=n_t9#.kiih]`@an0M\2c.cudar=Af_AfDsE2a>qkU8fsb+t9ukmm*f.f6`:p'0tA68G>CJ"+L]Y!iRtqDuI0iYSQlNmu[O3JnV-3jKre/9dsEL/sB-Kr'"A23f5)ojQr.XS'kS3#Qq3('5,+"Pb[=GW/h]L!1.faY:Mcad.i8"cj2"3n+:!p4W+G-J&-kKMHIkcH(T;6VetSNiQh"M=!^A`p''_WQE]G^/hrFrZYJnJkeL6G9naB<+)q*ZkX+kro)NnfWhLjZ9;Vor2o_A]O>?>Ug0iFA@O"kXq?b;:V.bG%;lBfXo4Al(ZD^D0U4igS+W"@Lb6*Gc7Z+7lB-q8'a9-q^s#;p^91rU-8b.^*Fq-g^TN^<[>j,oa+u!0Cq5q\cgoi]`Z*"#q2bZi6_fb.Rg/ZQrd6gG?2ZeA8!3V%GJ4)Y41[?,s"[*OC^ES5[qsMbdbj#PB-`5u=1QH74d$;9\.F`)E3e$[M<&_Odi"1*$-EMJ`*PKa`s4N'@]lY\H&)-d-m_aKf;s,-jfHY\p9@T(3*$Z]t`>ar:?"1'&K?`S!/e!"P@osD&>7kk05dPreXkH&GQn`k-(aGT;*5@`OSNS9jn%pbE7!otoKqc/]**X8(lt2nD+bjqJ,#O.LSS'%W*R$78J-f=IDTS(0/^UViN&iN.+O"C^#Uj#);3iV"/tbakB"`?Nj#+WG'W]-Q*"m-d9Miq_=)gAPoZILunm<*A`ppKrEZT!G>'9BVZ)0SIN\sh;)Jj-q?gsrXAp74Ql:l]<.*HASI.es=QI:DkU5ul7.uhqo#N\fmr4='!2b(Db+apipN'=3B]hpI@iO*jnN6YEr384>m\-l=gBaF"]L[*BLSrXLb2,uDCZe'<6CkB*'6+8+F*pJ)$?]q''/b$gXW[Sp.:D=;alV0'=Q.loXP9A[+078qm$QiU[R]rjo\d+aq=0`]cSdf('^KSMrrc7VnllC_gH!;S`#fB2:aKMc[Th>lHMR287GW]Ld`@4LTm#tEi-"mQ6Nkegmr9T!W+\B'jGHr$(*D#`7Tc9IB*$Y!+"o2foJHU_a4*r]`>jIWrT._ViXYh,!C5"W?q6WJUDL\cbKG-9XNC,5Wf!AbPHIT8>GG!6/FSW,@)tn8-^;"&I+c&_uNXbpa/5!NV`7MpT(1Fef`M/61pnA5iKC0"h>T/eKbJkJK0uM*lO"P)m34.L-K%3T:=-o'oId7DJRmfRUs)65TOc;V^1G9q[R`r:H'e;[6UJY3qb'Hn5$U)0!'?&f$X;F]?HYGf10G[Ddr\<-j@rq4;Y8eKVet94^=Z=cD3q=`>PKHo9XhcIA`90SQim8F3g7enK"]M%lL4=3[2+0KE$ZOe4D9,PNVHOIaLaTq/?K*,*FTR&c7pcM"k5^DJ\/@CFS&VuLe,m%M\]g\S%k6Aq<[g7:VAYJWSEme]3?9j/a.]Z/r#Lb75nPQiM+\]>R0Jqb@Df"t)X+W5$%=.MlN$;^qT,0E%lm#b8&orV_'i!!ZB40X#E>ji31;C8fVT?_%9XR)-'+X3F6OkgW9BhU!$*1EI#B%AE?ep1B+-usg57!0SD,uuP%`Gfn/`HBmTrl'l>3.F#Z>rdL%Q`T#kE[-XbILV>XIN7,ZH@bOWu4p,oWetM8k%8W[B0)-H;M"@0(5gE1/PB+CR(`(Lfu3PXNZSTq)u7I!$*==#&J4Z4-'(\GD+lBR(kY;9O_U?J#EUp]FaTk(^6N\UcMmDVHGY3C80M.s(QJ&pB*euBJ0O@Egd;4BWq9$s>N8_6A`SpS&A*Y)G)M]VmlmomZnj5ft9L2oW;/^a8`=gmpf)N$blAgnNOD!EWAC6nlL0lo%lg<*g_6T9X-)N*.UWn4tunVsrj2AU[6ig9krOcsmael]<,p$e4e-r$FgHP9;7W_OS(G$\(3T&QEgfJF2oP)9!;BCe5sa8u6#&)SC.:)j5Z"rp2#b#j(sB*YiOV!Ri>:<[:'>BUsT7t$&Oa*PQ7OEX7/[8"-o.9383THusGFIf8`f[7k.51&^UhW+QWH8F]=%_8uR[2$5NHNZ_7oiH""+i)r?>4gsl)4R]c~>endstream endobj 66 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3496 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3607 >> stream -Gb!;gD/\0"%fW&,6/[8\\nfK8\"!GBFdo2oDOWVo(O$)e#fbI%d48IA]7[&Gl,P/H7?&':dP1B&]lht@E8_\@Du$7IAtkFh%%%b%V#3Bd1XU80S>99M0OJA/#C56a/t(6=?FE,jmt,g?>F(eC[$Ra>%k#V!uI4-9`Egp_ARs%YdVeX_cj+o+Zh\`/iQY^S-i\gNaIC+@?n(J;D&r*m&[0G*-6?A9U2q)as-_"9QOmM:;\,ZRR(9\J3!hBs/haf/mBiH.Ce'Onqm.l/&*Q&%rJ.".M4E=)`'+r^;C3-]8uqR+abTI=Xn3:rc'\IO]DBX#WHe<0Jhq$E$)f3e#`V:t@qSSFP2`?t'4:0"]!a<%9#!O6LMp*4s][j/`kl>ua1jq1h6Pft7Z)6k6\p,[;j9t'-3]@2<#W(Xd28K_E4bEm2>kM<`WSc"%g*_mtRmH]K.jko)o-^"L+Z+8#]8hAeN$,4JT=1lj$nmT*(?Hup5OkjpD$ir__BZG]*^[3U4,KSQh_2;Uu&+-B4C/[%Y%'Y<6`cTdUF!n;Vt:UHL>)D8sO`PGTcp_]a$;Ch,]*0TtZ&[2E4;F8(uG2H&(V'*`G5[0eKqe6W&'Rh.TA>Xkc[i0I=7_%phMG@cNq*Teo#,,'Yh@d@]^?I48F\*4/Bb+n!#D9lFP$s]O+J3u6YMsFlO#"Ff\>h#C/k\j-20#un+X*US845V%0@O#K=Q&M[1?jq[DbWOS[Z"5cYU^Y(\rU1c28J'RuqG#0Kfq,l,e>N[2*n$b=,k;aoW$XQqhOkT'"r=c?)K@2--pM76#Ie3u,#jZe;1Ck4IJsg,PNf,27n)W74f0m_C99-@dFZ`J\NYTOk1.r,("S1862WIF)4K+\W%^'8/<>r*[:Oj.F3?X1erJMC^p[kqT@?6\dV,a;4jhosk\RbhQ4<2]&Wbr1,b0@^W3+^tHEgJdh&9[=&N.IeiSV@%Sd!AiX%OO0oA)(H`\#s,`;N>B'=RE4?I1E^$0"r_YH+h6&SlC<5iU5N)T#+W%dd,@0=EBGf2XqBeVI2gh7#ZeaOPLm'-_fJhoR1=U>WhV;[6Nf__s>Jl--]Z<61%8;Y$U*'T3&WV2-aFbjdpX*(A<#un&dV6%/@!XBl`=jl9\dH@41Elu6+i!5lpm/ksJjS3>3nSL7cpc(isB>je0^^#KM[D-38*5U*eqLHYF7jO%@`::$A7R7I&RYJ6@K&_2u_(qjaAq'$OW2r^8T-8:,2S/;.W#[@H+8?$LH6j_d74USaRf)H:\Kg:"jL;<79dWT2Wfm(6-E3ln2P:O?VtD/^YBRB%4b;GU1XEIU6thJPCsIA54!a`0/l0L.Ug2!"EEG.B$X0"UWL7L2DH`X#Xm8N/FJ%W/*RR#b'oZuTf*tu,FQ%"6Ku19G,o_dr^mERBNc.Z^^UArm;cdNq&4;YT.+d*c9_rI1qYnEA(JpL&b:`#%cT$Z%!,RKn]KQB`e[o6X#G[Vq7LJ+]L0[i5]]kLHQZR!k"\@D7Cp(,9=h3l[?sANCXO>r:hqcl1ruG>L(R1a0u1hb'/rMt[=.=Nf_-Erd7l3ZWaJ74-][5K4/K^TJJ/i^!U&60*1"H'kM4(@/s?5dT-OfDCHV[72_i6kkZI[4*GfZQ@$q&<`r&_kJ;mOZ#a&FN'COK[R7<5XVK@9k]rZ9N&3K^S>7>J`dXfEBbcR#;FktDdSdj._a00lk4F\g9dB8KHbL0gm&iKZ7=Nc\aC^hffZYP.2Ve%-VEf29\Mfh%?&M"j!3I?E$Smj4qjLbbJkqjRk+.'HWuUJ+M6,m"3,:FpUt&2:9"gC,mT-;s."CXr4];u1WuE'/aVokA4[MMu.4]90_"a]JcfQXfgEi-Ur:&3DX@a_#_+$)2\ERgH1sndMp]$bO=LLi8i5K+`r4o'D7R(80Eb:bc`EkBs,]_6TL?QjJ^$T5?AAmqs+#Y?f5R2s[G$rYo[T9be:E`XB^%Zt!q^%ges$O[lQ&Gq&l=km%];6<#rGB4FfVO&n10e-rmm_CgR@>C\sj-IXK?2DcoG6U&Hj6b(anE5o4O@0DNtESf%*g@oZ,\)NR$6HgKmM7/A'.#2ZIU?A?MMmp&D4$L]&BibAM!o6qq]@Jq/VCZ]R"s'>eKJ/]%]f9qV3<3iC-gZc$0o0X!Xs_9AoE+U8=6$rqr/1A``N(:.Ar^#8[X$&r"bZ>ao(d`^3P$)(0?5Ji-Zendstream +Gb!;gD/\/g')nJ00u*gFF>o=.lHN'6]60U=m;CZr0;T2>h#ri7F.$nmAa`$?2(]"N)3.6mEJ;C-"`kk._lb,>5G"##p(a?dd3109tT2Z82V*dNNA"(_4Z0[hI<6T&MfpG,jos2m`Vdr5NJ%?mNL:9WlBS1OT;5TAfJ[.IIE?D+,)..$eUb-1;48j:kM`RGiD57*#Jh4YTFF&$E!UaRMKXk@8G<8:UFeH_6-S"s1VIT5W$6NY).H%IaUZ5r^^r*IgL?f`S"`J/&OEe-Eg[LrG?Hd"*$^;7VW0*f5&>Elm-7RF0P+*X_RC'N[R+BcOH-!%PeI$SOKD5Y^RV^iA:%giJ%$@>@i(P)aVPMk@76p4A">=/t`']Ha:R?>TI`ZJC_#IqDFae8b7ELm.f*-%q%)&Faut@_RFuH4MaVKalC,er^beng,C8*J[n(0d?'X-'XkA'NANi4%\IUqUF534HE@I1YBVt:-9UN@U>7)_M?n>a=,.$1mU.p'<97cJVckoB;<+0)ilBnNFHR(M4b,-P/(R+I;/gp7GPh9O+#OpMM$$uQX*H_6jZgbKY9A.sR`"^b$?Tjd:=Rl@SPZN'Pb_Pg*E%q0-nT`ep88W)Ko2-Rh)`_h919_/AD1ddkiBDVp++5=rUktd*T(G7O(=Eq1@d1S,cj,?AAX;J)]Ob*[7.eDo@SKZ%'%UnN(!"YcgfCPRf,ViX8,\&j%$X6HCfMHVm"IjC;uJ-u*Bc#@l&i]nCW3^"9hT/bjit3^o1e5!Kemh7V"KK73X5`hSkTWHtC-$f.Gro&-DH0h2r8:;#0$sPc:9V\S+3'M50;mLn4a"I]n\LmCS1g6Xa7-TL!?gtH0o]YiBu,Ou=X1W-W_An&YaZ6-[XO38eck9m!!>GLm>9mDPr/-B0+c"q>mT+G3*55ANuB%9q`;ZR,FTNRhXggFY25$iXHfPqa,<=?$!ri_PL6a>__QkhfB!$+sdGR&-J^K$N@-X/JD_oX`,ULlnkLGJcPhjdr#@o7MiD]V%7-jG,UM\7Y[g+lR+F+iS7(uUUqM&Rb!g&Z89DL7J"(oCJMHPYXm?ZTNZ;*E8g9Z`qVKAQ728G/9s.:?P&-7a7nh#%%hgI)Tn#/=*.%*l!_Y!sU[.ufD@C`.XE12lL$a68A3KB9;9t`B5j,ESn.FfgrpIqQ*b<<='uo5Qeq$N[dJ))5)Is^\VYsd7eVDHS^/H@,lOkA(RR\F067S@%hAqUo@2CMPrEM_#fp)L8L[_Yg_6/Z1QiY\=UM*[DC00G(SM3@nLq57%5l*p:m*6Rf-JnhcrjPVinSG^o^!,rbp4<522B-.h4p%V,+X%<:Q#ON"/JRRm6Lk)5,U/K#)@Z;Ni#:2l"q4"\E'B8V7FC0qbH=\.6oQI9eWPF_l4P85ie$U8b)"E[q>"pi'AD,p2ld0;3/To4MY!(S(]Nqo3V<#qmPR%3MpC9nu[3Zh2O(>tt[Wf=*Q8)+8d[:6:omN:+#0<-,8dN6&gFiCoaP2ID,M3#gt7lAgk.e[!mrOe.GmscYCrdd-S:T/!_kWbe73C=RA60qQ-;D^7Tr')J)amObI\'26HQ\"BOaPO%K#jV660.@So.134hk-5\%cLqA6Z[OKbJ`?/-^t/;e0R>/pG6Jkfso?D=.%UgJ,/6%`dtSIol.>E@Il\(Xqq&#=G3o/OIm1$qL="DsUdJ~>endstream endobj xref 0 67 @@ -443,14 +443,14 @@ xref 0000008965 00000 n 0000009061 00000 n 0000010448 00000 n -0000014250 00000 n -0000017778 00000 n -0000021709 00000 n -0000026041 00000 n +0000014169 00000 n +0000017855 00000 n +0000021716 00000 n +0000025995 00000 n trailer << /ID -[<826cf08fa662639dd4eda2d9d3d0062d><826cf08fa662639dd4eda2d9d3d0062d>] +[<44fbf3911fde2d664205bc0ddd188bd1><44fbf3911fde2d664205bc0ddd188bd1>] % ReportLab generated PDF document -- digest (opensource) /Info 37 0 R @@ -458,5 +458,5 @@ trailer /Size 67 >> startxref -29629 +29694 %%EOF diff --git a/docs/20260608_ALPHA_PRIORITIES.md b/docs/20260608_ALPHA_PRIORITIES.md index 9040eee..8d74183 100644 --- a/docs/20260608_ALPHA_PRIORITIES.md +++ b/docs/20260608_ALPHA_PRIORITIES.md @@ -6,21 +6,26 @@ _Owner-agreed task order, dependencies, and implementation prep. Supersedes info --- +--- + +--- + ## Table of contents - [Bottom line (agent rules)](#bottom-line-agent-rules) - [Priority overview](#priority-overview) - [0.x Emergency debug (not alpha blocker)](#0x-emergency-debug-not-alpha-blocker) + - [0.1 FR — Stream dump while casting](#01-fr-stream-dump-while-casting) - [1.x Graphs console](#1x-graphs-console) -- [2.x Email → SMTP → 2FA → RBAC](#2x-email--smtp--2fa--rbac) +- [2.x Email → SMTP → 2FA → RBAC](#2x-email-smtp-2fa-rbac) - [3.x Auth implementation (agent)](#3x-auth-implementation-agent) - [4.x Reverse SSH alpha](#4x-reverse-ssh-alpha) - [5.x Alpha backend validation](#5x-alpha-backend-validation) - [6.x Alpha app LAN](#6x-alpha-app-lan) - [9.x Landing (lowest)](#9x-landing-lowest) - [Dependency graph](#dependency-graph) -- [Licenses & tests checklist](#licenses--tests-checklist) +- [Licenses & tests checklist](#licenses-tests-checklist) - [Developer help (blocked on you)](#developer-help-blocked-on-you) - [Source linkage](#source-linkage) diff --git a/docs/20260608_ALPHA_PRIORITIES.pdf b/docs/20260608_ALPHA_PRIORITIES.pdf index 94cc846..1d3a16c 100644 --- a/docs/20260608_ALPHA_PRIORITIES.pdf +++ b/docs/20260608_ALPHA_PRIORITIES.pdf @@ -168,7 +168,7 @@ endobj endobj 29 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 alpha priorities \(2026-06-08 renumber\)) /Trapped /False >> endobj @@ -267,10 +267,10 @@ Gatm:gMWKG&:Ml+bZ!V&$JA]e/q%dnDB_*CC\)3g>/S?V"%sGdS%nCl[M-8jMBddc,Oa`aR5o>^5k(Jl endobj 48 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3679 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3699 >> stream -Gatm>D/\/g')p`p61hC3ZV>+iHEktI32B9sFHNre`5Q$`!sU@)[^LL_,U`+&mXG$B.8(Fnlcm$Ng6\!#VZg*./^nE)LQr>=`Qfp$"GU1B_hg"M9D''jKb/,/di\\V<g76[qC8OVBb`[LGK+"U(T)4LJ[-GT+7rXM._pM&QJU6#(5CF0U/N>/d/Jq=`^d-E(C<]T-:X=mT8l6:oIBR!1gGTj!mkS=Uk6s19/aS/#UV?=C4Xe94lZZLNE@;?dKUKk99.LSKKK;lqT%/,7'QC0F_],"#9I_;D%ep1UQKus(j)TXU(70ots6o-ZQ2;;)"(;_;KfXgRIOM<^5inKj!`'bEAL-U@0YJ?A%'QX\`1'^dFcbY4,NqRr=DeWfFB;1s6=](6n-#k!Z-SRGJXV0sr$%-/fPIr)/OR;Qa#6@.YWi7h$<:3Od%^p>R7r[-b:E^XmVIH.8pr_Q%\Au2W3d9qFXlSZZc\g>:PBPT9B%G*>k<4lRufX?/:S1Y&N;Wm2u8(kPi5E*e*ufLKuE6Dc_3pl]`P?U$2msU(`5pjKj9,TlH$^1u7blF0o,s;4;?LSo8P]$m35-:US&E)e"Cdp/2/ZJ9:*/6^2IdE30?3fY%g`^#uURAK?eoV=ms9[hpZE9HQW\n^-/G4`mE+%Z/`TX"Ori-@>%,qPs8!*aJ]S>e27n_1=7&_!(H#s&ta^1_&a,loVfIY7V+ZJnT\LBL7`He%@e!En7*/$+1>UItnfaE*:iRN4tH=V)+Y_k2^>lg*5]q=-"E5M+g97ugl#?jDek_!>+\6.i(QimBto5bNlpGu-$40ttWJA:NL/i35TS;MXVHMjdEi&9pN9A#RC''[R9lrZD1I>VBM\k&6\VfdZ3lQpZb@#RCM>Ln*.I\j-8-d"9XR!^Wen*Z5eh2uBX-6(!3`_[@^GCsBgHb8R=(38^*W3TMEjAbbPQt7@.V(FB:A@:tcN>)(*Um8,qT>6e8!6A@(PZHjYpJ+p+O!V4-@:]8t(/f-ohhlBNQRL\2Rf_Pp@o)p``aYrtXaf*hV?*0/&jHe=hUFA7oQ7;mrBGT5*!PR/mM-_(g@OD[AC'P9W=gnWL^Ok65$@dF^l&c_\m_`k8i)s)Lb,^;(F_eepG4g8FInB=DtZ6-a&W4N%Pl*JZU[a'_HNg2>m/mT5o/]J?ep+PpY^uRdZ7">OC5R*?4CGm_i,RM:k>JrRq1r[X[80XBi+0H/DtWamY@\4LqqEm1,03=&Ku(\5,KK`TrKEqZ[b^.J2DM]9/Wps"1df#I[ZT)5c[>Z#r(3#$Y.Gfb+q+.mR4RgnPnN#/F1]^o0ZB'&GK:8^J_VXmIf"Oha&X@!E[IY5s_].hR[H0eSMa#eeK3pk4)uShsD1\]):&[EiQZQ/===ZO83X?EQ(%'HXCA-/'gIWV#rTP$2&`/:X=2Y55Eo7lLW+C"N_Opj&-=DnNR+k]Q,cXIKDGVAl!]3T5/H7k&@h;4;Y":fM_@ij]_ak;6crHomICr[*&b=gDgRAFVCt^o^?U:ZipdIUMP;G^.!HUmeo$cNeg7Ca%%BJCj\X@lA)=G:aq@/GjK=+PFQW,E1ek!<0tGipY[Lrii;]7+?Ulf6"T4U8ZF@+k\L[AUAf]NrXa7o70=F"4dSUS/BCHr'o2T)75;R@"M`g/^)T,e?p:$Q"o!)&Xcd?,HH]CuOKfJ0Cmac7q/cW7?om=L&ME)H39RsH(YXZ\$h5*,Z2a[V(O\9;PKN#lqJ`4)4Y+'K;F7XnWiMm.pg,`uHm7NDP`qS37dm&hNaY:jW)Q\C`_pLR@;YE$$]P?)>q#%&`Lh6HF)^_P?4Zkhic1o9,/3emahd.jD4)pnP6t&QuOC&jnh5CH-U\N/WHYk(bLo)@Us1Pmp>icDhP!\9$(sCfNckl=qm5[Db21EF8itDse1iZR/P4@c`>%\)L>\f.;5n'tPAaU-DYjFqtaehlcMF)gAiO5t_FrS"6Km#O4QF&`1,/5QWmrWpAV\In/;pYuu;FlSdKZ5PAU!f+an190Y8^#T4_0o6p`I_SBYWG1N]e+$<-fr#$n>*q@PQ6;LSp]e")Hq#\JK0P5\WWhW\T%a+-jEmr/M8/,e.&9U>DWte_2?on:5_n4a^0sS-(Q<[$g&&N!$WD@mm0C,-nmttq4lYE+iQ+pKSf/@Z])G)^_(]e)22/sn(2WsXLulZ&:d`;2,f@+'65q2$Kj5,pVJU8K;q=)Z?Q"h\!0?]@^A1/hupoeq"##&Rpeo03%HtGf;Z8Mk6q9S[7%9$Zdt#$3\3bA36KeJiuYYqraSNMXV]=F&njE8@Q,4Go*Zb)l^cYnY?,KT.qJ\2NL3]-uO9SHi"k`k7TccHS`tOdb?nqHn.oc,+nBs]Td$M*_gnD/:d;M:BAY`G54V!$3<&9S]th+@r^S2AjHd-.+0*L6LtWE..FUT=*P^0JIk).L\08^eqOJ4%s'<69A(Pl(gsNUBHsfY=sT2ZB25fD1\%Vg0YtqT;sVO%Eo\"uYP9YRAucdpmKLB!QlQdm8R5o9@]t1UPUON`\gl)XjStfEmYBZs+#$`&:]~>endstream +Gatm>D/\/g')p`p61hC3ZV>+iH>btedO&\>86Trk@]t:_K9g1T>J4#i8UQ<*hgRr8OsO=q-1(64c4LL*jSG"ZHkrM7Fi+2J0oI`3as%TKb[CfuK4Pnse3cOa03IQF.sQb7&(mR8UlJ4qPe-Q!Q6uA8:&dW1?hkUiLS)S/C=nVIK>R&6R<4?$Y]2PM_K.uH-D-*sp!arpsIbBXJmFTG$AEZ(9&PCHtJ-RMOPAAV$iMq3!r^@,:&cqR?;Xub4AFB0q63S,c2F9CAFNb"1+#sn$X&hi:7AI]1qC=hcRpdPh(_OgfT"MJOBG=l:8bTgZ*3HON9%&^>1\T([n`)Rhb%?`N,7%/^?4*ArOKdP@JrBA!rr:/pme'1hM23fh%egs)9EHoe$gdNtn_pE1+Vuir=W:m)>8UIC2Z\GM5E)VQ;^`Gf@7o9KD_$a>II>JTgcZjO4%nU-FprAcj4]j7o\03g#Q8o72:rR^O6.;/sY8i3O4C6"Vn^n4q%p!u%kIY>aCrL&MCHF3SRbUWa2Kj4V;UpP;ncOr*a#.!R5301QUpdJJh%Ckp1On@jFf09ElE_5_!\-qI2>V_.TNBdLpMj(ft+@'BCaKb.ghpkLPc'ZO1Ro?W5if@QV/7uQ#29@tU`g5u#+58o$,57\:VfCLlkU3Xt3B&Fd@gTK>9,=m:AFj,%Qm*c[=kT;E#cpOBeW"nSPreQ]Yrjk>1AdK!D%bPP=24m\fn:[5u:lVBoV],p>^(1i9DTqIsgN8:X;q,A5L(nV>&-`g[3OA[+JH33R-)2mlJl9EI1,,/5p1IT\0JRodn\GDFalV"7l2:8SlQ9LsGbG1TOrMpC)uT[+%5s':C&h9.IQr8_1lG[4[,CCf=oRWY-UEoq"KD)uWXPs;Bjns-7[4+;,mb\_Pm!-o$'7Q?"HOj#WXCEGjoUcDTtjSm!$kAa^f*OLqS,@IVh+n[I>%Ys3Iq_lG*raPq;S2p3?^ALh%J)o46?d%^+A1&ou.[V:--lGh4DFWA+eIK7LdSY=,RQGH3?i!h`A>,tQ)1=NC8XdgVl:9A!*Dk_$JUPBNL]Wp[j6-DZT-O/mRd>G:?B8fc3e;lQ3H=K1Ak;L.$@Ck0S9Iri.JOY*:9Ek:g>E8ZgfN(SW[QB!23m^&ea.L';#SX.U8JXOFPY>aL:#=`A8X/WEnhMF\CPbsp@7Y2D"D$i)nk8:*aZA8Qjs[#QV%T@W.RB)UD\A:01kj.kUr9a#k9=(Y>*NoKK8rcLuaRoa;:A`t^\+p\iX/r#D]ZP6YmTlJ]fO-++kKHSjYd]\Zb>BL!0#6J(H])qk&Vhi^&+?u&?9_c4#k[Oqfn@-\.EX+l;0$4s@KDIWp^!AILZn5LUm)W'"88Pj/h>1m>!;?QB`K&,b>]g2"kXQH+mQW$*7QI>o;9=gjt\Ks8LHmn3\cl5G_e`o,!<\+ngn.b.53<.i7AoMQOS9\bXYU=jF3-;FW>"da)oQ+);Ck&`X2*rcUP\\L,48mi@n#WIEkK8ToF$%'\?0=os_-=kee"OW%@p=+3nQd=k28VA`Ep-f?=>hLj9ZqjJJ,!\7gV6f[1Tee^TLsXYbX6QJ)1$UBY^-m$O!'M6W1,Ci)MYU-dUGV+87Q0FrhnA_$\G%1X#0sY46Wne95-dK2UB8FNZli-5QB[')5boj[gTCB&.-0i10\^j/M@58`(m.Fh-0V'mqUPZdV6uV`Df`3^!)DAnmQ`p_*E'F>a8eq>XV=qKe'<):i^NkrmkGsW2@i2sW,?j-Hi"l+k;@9$pZAU\Upk^MpU2t:%R%f:nQMC#HSj]VF!'['4p:41h^+fh:l)>1XDCY\3K$4N4nfWb7&l7*1N\ZhD?=aWCPCBSlO*^rGtajtg>"AI!+N)7@S2!C2$OG[tQK)okmRoVK)QQrsns28E`.UC@DF"d@"a1O]O4)q(lR_A:N1EpNBFLalEOT0Z6F$Kendstream endobj 49 0 obj << @@ -344,13 +344,13 @@ xref 0000006519 00000 n 0000006608 00000 n 0000007648 00000 n -0000011419 00000 n -0000015126 00000 n -0000017914 00000 n +0000011439 00000 n +0000015146 00000 n +0000017934 00000 n trailer << /ID -[<4e8503afa0e5976fd874bce2eee583d9><4e8503afa0e5976fd874bce2eee583d9>] +[<6b48f88cd14830c5c0a6d8e767dbabe7><6b48f88cd14830c5c0a6d8e767dbabe7>] % ReportLab generated PDF document -- digest (opensource) /Info 29 0 R @@ -358,5 +358,5 @@ trailer /Size 52 >> startxref -20032 +20052 %%EOF diff --git a/docs/20260608_BE_SERVICES_and_infra.md b/docs/20260608_BE_SERVICES_and_infra.md index aa18128..0db6f21 100644 --- a/docs/20260608_BE_SERVICES_and_infra.md +++ b/docs/20260608_BE_SERVICES_and_infra.md @@ -6,20 +6,29 @@ _Last validated: 2026-06-08. Companion to [INFRA.md](INFRA.md), [REMOTE_ACCESS_I --- +--- + +--- + ## Table of contents - [Topology](#topology) -- [Service inventory (mobile + console)](#service-inventory-mobile--console) +- [Service inventory (mobile + console)](#service-inventory-mobile-console) - [Data paths](#data-paths) + - [Cast session (LAN — alpha scope)](#cast-session-lan-alpha-scope) + - [Telemetry path](#telemetry-path) + - [Remote access control plane](#remote-access-control-plane) - [Validation status](#validation-status) - [DNAT chain (WireGuard lab)](#dnat-chain-wireguard-lab) -- [RSSH / RBAC](#rssh--rbac) +- [RSSH / RBAC](#rssh-rbac) - [Planned: SFU relay (Janus-class)](#planned-sfu-relay-janus-class) - [Agent scripts](#agent-scripts) -- [Open findings → tickets](#open-findings--tickets) +- [Open findings → tickets](#open-findings-tickets) +**Documentation index:** [README.md](README.md) + --- ## Topology diff --git a/docs/20260608_BE_SERVICES_and_infra.pdf b/docs/20260608_BE_SERVICES_and_infra.pdf index 974d3c5..ccc981a 100644 --- a/docs/20260608_BE_SERVICES_and_infra.pdf +++ b/docs/20260608_BE_SERVICES_and_infra.pdf @@ -143,7 +143,7 @@ endobj endobj 25 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (BE services & infrastructure \204 validation map) /Trapped /False >> endobj @@ -227,10 +227,10 @@ Gatm9>u03/'Rf.Ggo%,f_R5qQhHJLu6\quo@kX)sPIPI!@V<,J`4qq.'Xf2&!C`+`[D)>p553iZ$"3Xl endobj 41 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3191 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3209 >> stream -Gb!#^HZ.Xu')t1g@c53,hVCX:olb>e#G2U=&BbW!a!Gg\bqO_cdrd2tZEo&8U)CbcQ&eiT7XY&7jHLV_*SBKCRO\/J^`\*t'T5/Z`"]'>@O>IecScp^C$.mG^Q&e&%kLBjbe2W1e0"pq"#P9d`=hO,(e+(M=,b(/p(?i.#+oX/t4Wi0JqIN/UdUE?S]#aI2("7mr&=I(S]R=\Gckgr?kT5ZT9$I&/U0"f784?G#il-Io)n?*H!p+n6SuQ$MrG3@;5AsqYX]B&`/`3I=]1_Z%LDXFl7cFb-R-PZ5AU0i3"*H#"6^&9_S#5&?CKp1SO>>(V]WG[>j_,?"a(DI#MD^aJT0\V]R&]C2#rI'\\IYcS;b_@^f5><5P@I0?:YYb;,VRcTk4S)9N4h6P0kumLk[1U1'ho-'6OB[?'Y7Y*!SNqB#r''01\LZi0_TA:O)dT=jl3p&7)@U,/ig^f_sT#;Y/nWX5CPp04d2UP!r*YqHZBkUlR)I+R66>F\B.M8S%Eq[DIT;;?CPGF\oK^1jp:;XXEUqakU)'@(l:0)=^J*86;=^4Rsj,oqOcm#S@#0)p)jXp8%'<3TW'ge4YJ?=D9C^>\QJ5gagXOG(nkAZ)'OQ$kpDE8TJK1m&N(k^oT:6mK==D[4ng5;fLUEHu)=H.;NT/0k]`]*mORc7VmdIs"$kLfe.E=m!+q%1"_InT-k&]u]s,_k1#T$;]\J7;@3@its3%!=cY4[_erqiLXX9;;$;LWDV^&ahaH9b^Joah$?>F128@1#d98D%$i,)A/`u(#,HBG\-%_^E_VCqP^fF(CN2/_S<_C.qUHlUq66N:u!.[\a)VGa64>+XNU?&D\-%A%!aAb];OQFDF*Z.-Q@Y^nfTd3U_;t/9H@QZX,$hZ!c=7lA?J*sg)r0!eO`j)G`V^eRl)\PqLY"U?=)59f^=en_.;a`ugj=KP9S)dKo[Fo0oQ$s[t@WT7WqJ?jWU=X&%nJJZ.MGIc;2+tnGiu+8AZV`aIIt)^)#tr-;9#nE%e\UFGY6]k,WDX\lgYD\T"J9@0qn_7_">Mau*ngn18pnE$[)7O_-/B,38_;\c5=o*Q]`;1O"dr]0[BVu-7[m]7lpi8lgY><2c+M`dP$ul2("57^!omi+Xi'nH?LaDHL#aW8h(t71^'2O>LNQAa5MM*pf8L6;c'Ipq$dWhpA<,WcFhHnA-:[&Mi>6Ql)frZ\1L5_HDVk$*ZQRAj9P8;CW6$M8?0-fhEfZJT])"&-g6SShgpXr_5:_]$RJ>B[.(tU,;#,oVNa'(C",Zj4J<)>Up>*ub=XjY;k1E+kV^^@Puk1>/r(@7(X+c\>UQqnDs=ZotWVF7.`t95;>Y&6:c=T,lM"M=e?"fCRX`@%gqpqe!VTVq?YB`(_I5f_Dqs93O"jGc(?qEY]gG\nEu^^OS6s\\WVc-!=ZkHdiPS`7BjLPC0__[<6PPoGB;X\p^PFhaJAuWQ?%-R&YPcHGF0WMo_LMcs2NM<96@_ri,Xh>nKD5ic9`&UX#Ca\%kIos$rgMg>JtN&^J3i>30prFT-X^+.Vs8_\(CEP\TTO6G3/hYfsg[2Z8CH5QSFg:qeH^?Z$mJ$9]O-H4J:j]YRHg&5d"pFRN!j3dPa`V'&PS)5gP*p$Ur7leQ-!K'Du&LAG[56WaQ2L0!6eWrnSa3mFO`f?s!OHAdrh7f8$`$W7*BEV6e[kk`TV,k\Ja*3S)CMTA$"]>Ja_)CT4l=L_gTZdSsAMfMM9K3m.-sqE0%kC6ZfZ3KcDGW9cH<8er)F%:";BkeXg%YAM>@5XX>(U]:1Ll8N40pc\mSE$J*j%L.WT!FTVGf@g3]NAfg2OTYc\Qh,6aHG+J"q&UPIt)(OF<:e]it2Q#5;J14G4d:Tr=.IX7=FkWB`;):WkBSnT:?L1)'A;WfMfZZm4WAKMk1D4T"8A\tF,h4PL8bI.f=BYoGVBf?q;BXA!7aaq@=1"BXeC'(c1F(!f=gXTZUp;O#QXuC0L=3X[XA?9#2-jV@aA#)33I^ncP-OEKS1endstream +Gb!#^HZRq"'*$j]!i&M'e2F0(^6Q8&7^?UGXWNFre2LmpGUO04(fR5&;Kd*0%t=sbHq>Re0[AHFM+)B7?"!EIh$(:k@JH#\mp_!tE/&[O";)Nr*YD6q(!SAYBQj%"&_ZkW2+]_aX1rAkA9;rM)a+U):.E^s_o:1$&oL?,U"O'8qjG_*,CD"SY"8gu%6!gH%^KU`Qo&p#&lpis^4Tib1<*pS#ImAfr)Hc0+\Y8/bgb'&PN2@H9Z+31u=]Yd,HLn(7uKUQf7k\u]EhdZDa,+-@FFkgB'1(J?97d,cO2tNr_=te9W(X^$n;2NFZ=#\%/:40NpVO+i>gY4g,d(lsihm&4RErth/XpZ-R+:dAB$&5okFr%DDGehI:C_\!fsCWE1U:p[sZ3o6@9>3IXR)D?6lH]M1M(gl*A`ZN4@E)Anb"e].(JRb5\;%HAc?9/\#k]V<%f6Me]TIZmrM@S,"LV$:u/o)pa8Tcn'<5-0O;u5?-Tqe@mC)'kP^\l6c:&U*5e8)'&bb2J#8VGM&q-NQL)6N@c47=;Tqm)]>*)dRW4FmWYW0rHfj;qr@/"_I,fH%DaU52(MjgsaGF)8S94A*X0&>Jj*6b^NHL5Bo%WS9mDS2CLc2q8.oWXKVme]]T8Slrjc?X(Uq<2Z8g5>@56WmehD?Q94hnN%#ilaKq*aF\&_+Ki105GlZL<4l5%J:B#W\->b,]k).G064[fen(FpY?iY'1J/ljC>bhFL'ZuG&Vm0dp^cKS0$@S*co"V'8_@dmK$3Y%="NX+@"DFV782LYVBI*eU.1$!AUo]\Q6,@kV.Rq]%>OohG9r:Ms8_4pT_CE@><,heZ>;=@'KA^'\8qRrqNq^D<9CN\/s2prq/k*ONfP,E/D)gRnR5=*:8Y(^cS3+c>Zo6#i;)m\h(Zu4=AM28?je2YP2F8QLWFIA3h`b5OcV>RR)-,8K2S?M%pnnE\eS+=TofEOjlHDo.&TX03JPA\Q>4s_]*_eQb2Z->`pX1TX0sIIXUVo&+Lob9rbF3p%"=NjM5[7OnrLW'E-7!&bQXoK57`g9^0F#SH,$EaD`0g3GaKb3D@B1>f+>tY@2XA+[h\V48UR"ngY=-Rm.h^9A.[F@@s''V9tP103g9>E[HdR?@$^:d.Vhg86LIZ*4C"u`Y6MM).][=IoW\Abi[mthSA9bn0(MBF0o)^^1D@&>\i+4-95@q`N?Ps.gtZ8lXdu=\pH3P+GcA*1'FZHZM/>!_/he-BB=M^!]9kqb?$o8=FS!=QUS.G[a]HbPb#XOY4S2oaLiY0"dU$XoZ#,1h_@?\fnSIZg"896]=;VCg#f-U)$orP\sD4]6FHm64BqE?EGKG3SXkH=!Q23A>s@I@>#8"AQP;N%#sd,q*JkgRLZPD]fn"-]3:kK,$6c^_s1NTrH0\YTc.gVV0!?QAq=/*QF^%l4ZH1B_[!W=8pI)./'UL8$*#(=-7?&TJD$J,u5(]Y"+@OKSM;,&=H6BYo<'XYGmr77$uP1F,B\iIL\3%p\F9K*QD9\*(Hc*WMSgoKo)J)h:3d4u&H6#:ITu=&.:;s"4qofH175gfb[U4-um(Af#+(hRBh%bOl[trhdMejgGs@nclOhL#`2@r!/[/*7o(QgRK4TMuUN]@f[R3T8S+:K8VN\MXi;W;%AZ#Kk7oJ]np^t^R5PX@VL*/Xl!pUp;SZtJ/@#4,HJ9ge:Xkqr_Ck;dc[k*V;_t'd`$4@Drjm\c9'C77M,dsY^&u(P.3@*@_6#K<_E"R?M+4Ak1U9r(>B7HFm6*#L%"lSq]G0YXNN=U/R=L/t9qlGHc]8WR7+pgHf&L>p=Rh''PY>2I[<\pQGnu!=pNAS+2qQL:kh&9op:C2EHNqL>J-TKCM^2^?pc;SP@-=qr[?&it?nS4ef2(Rpq3)82GH1N)anS"req5O)S.TVWG+_j5=FPko-),@cbWH_`=gf1l)=$0F`afQ6'o8OL;aL:Y1f)QOoV!Jj[Z3'B/FXlfrm))X3/rJWqVlhmI/)RLZBi>;.hZlp6B3fMf)WWQ3LONZ3DQXXBo\1jh=9VBl^5+Yi78N`MlDgc<&J`hpXFdM2<,)RXZk2fM>EkPF:-fNK1=>M8.Wg3^C2)CCm._oNaB9ac/%Uk94>&6Z)_!qL/ji//"W:G[:]~>endstream endobj 42 0 obj << @@ -290,12 +290,12 @@ xref 0000005413 00000 n 0000005495 00000 n 0000006408 00000 n -0000009691 00000 n -0000012973 00000 n +0000009709 00000 n +0000012991 00000 n trailer << /ID -[<0a21ec630059622c51746ded189e0805><0a21ec630059622c51746ded189e0805>] +[<31dd9cd626d11867251ac11c3609bcd6><31dd9cd626d11867251ac11c3609bcd6>] % ReportLab generated PDF document -- digest (opensource) /Info 25 0 R @@ -303,5 +303,5 @@ trailer /Size 44 >> startxref -16182 +16200 %%EOF diff --git a/docs/20260608_STREAM_DUMP_DEBUG.md b/docs/20260608_STREAM_DUMP_DEBUG.md index 91d89b1..73ba49e 100644 --- a/docs/20260608_STREAM_DUMP_DEBUG.md +++ b/docs/20260608_STREAM_DUMP_DEBUG.md @@ -6,6 +6,10 @@ _Emergency debug — not an alpha release blocker. Enables 6.5 (audio lag) and 6 --- +--- + +--- + ## Table of contents @@ -15,10 +19,12 @@ _Emergency debug — not an alpha release blocker. Enables 6.5 (audio lag) and 6 - [meta.json schema](#metajson-schema) - [Wire frame format (raw files)](#wire-frame-format-raw-files) - [Android implementation plan](#android-implementation-plan) -- [Visualization / 0.1.3](#visualization--013) +- [Visualization / 0.1.3](#visualization-013) - [Tests](#tests) +**Documentation index:** [README.md](README.md) + --- ## Goals diff --git a/docs/20260608_STREAM_DUMP_DEBUG.pdf b/docs/20260608_STREAM_DUMP_DEBUG.pdf index 0719b25..c977f53 100644 --- a/docs/20260608_STREAM_DUMP_DEBUG.pdf +++ b/docs/20260608_STREAM_DUMP_DEBUG.pdf @@ -107,7 +107,7 @@ endobj endobj 19 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Stream dump \204 developer debug recording \(FR 0.1\)) /Trapped /False >> endobj @@ -170,10 +170,10 @@ Gatn$>Aoub'Z],&.F)EaBs)774pQV>JSH0M6p'n'6;j%Zt0uX";\`LJ*..@MM!e4 endobj 31 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3255 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3281 >> stream -Gb"/)D3*F0')nJ00jbFCoQIX:?L7rP_^i5CA!>]9)P?Mqf=tCq3ih6ITb,iXBK'1e9M=3"$Qt)(^EmrPZ2IG7e*b/-QDQ/2$/;o4&'iHLVX*naKTf^M0oFrD\%Ko8bU*7YpU[IbM`F-]2)aF2YCcn6E8FrDnQ-i*FSlHjplJb#ssWS$+%.QOdGRVJ;E3W>"IW_sH3=1OFBH_o)BIqn#?EoM@fj89SX/()oTiMgFZ4S9Ke$N",nQ_FI]9if%"HT"N9\NN490,olBrZ);C`=F_)flP`3o$e2!r"fFePa+s.MlqJp6Z)!`Yf4an@%,5f"&?$RK(4@V.g,_92e'8cot>CH&TY`k@sVsNQG`kM*meD3)0R_S;d!W9,UYOAkehm)!t4&$s/1T$TmCR[rpB\5dRL+pQ<-s#Kn]JThW.=R*a&IqhA`JgJi3h)9l(#i]%Ld/hYM&'O?`7ebIQE\n+Z=E>7bGi>GqKD3-W!.pf=rg[ki=0oCY]jSA$fA=+f]"W((qr\_V69F1SfP(*oOW+g?W\V8)'S1rC6n'R:r&@s.V<;]8PjN%soJs]rFe(T,*3mi%J#=Y7gW]^C%2RTNH42;,/1MpZEWb=f,i/6`3J$AbR8W(iCMIG#3+Kr`u,q!=jo6^KMc>.^)U7;%$D=;5I'5+J#@3tiaf]d`WPbn3d4KOF626RskXU"/7$kbTq]WsLYoT0eaP_8,WV0&>.D?P=%M-8eT)s8]#LrV=lI!rC@:!e?3uN/'[/kY)#LH,q#4ST/+:,Gt3tMOqLPhb%9oIgA_pq+3X;aX&=YX/Em"^)WMQ'-6Yq+/A_dIn6.;"4j(GTGgFD%X$c)qICaWN\)!h2O[7&OdpKT-+@>24@9kk:"^ab90adKECdIBPuq<^dCr^YOIoPTF5h@.u(3N@qa=8eV'(KiashjHCBq=LSD[a#c>eArZW=^ra*T,9J^A6OYKMAC#o($1,-hrc+ij[I-^AgY)CcnGhXoDYH-H3?uDZPNW>GATj=LD_?!F00`G+dSS)5'6!<1=\S]WUn$0;]\HZ7!f+hcf+?bp]BQD3*uoGl$F?.,9/k]g!]JHg6$iEMVZgs74\fta,V13nCI?a_q;c4f7&l,mimP?QrOr:k[X9Vo#aXER$\*MtTZqH+=5&9N:+]9/h:U]ZPt,tR6"_g&n>puhY5o:1$n_D(@CY:rhodcPPrP:`-TOJ7)f2G2,i"SW4ld7i2M3a!1$Mr4l!7?:V'HaHrp0WnJ=;WQ0PNn"JQqm;"F`G);Cb%Rcm.jGN*Y)rcW/TQS2VKs_R2An#A%W7&UO@?\#@`P'@DhZb+-:>,FYEt\3$c6/E],98_D9i_AT7KR`%>#KS7A`/qVLM&k!\YD*,f/[2>$;e7p2e;5tOUR+P`*W=onI8puL88i7e-W=Pt`@LZol[1Rd9#;F?"%H(/FJ@S*c!2%C7o;M(eC=N;r%CH4aW[^Hg;5M>p0WZ?h=dG.C]s*p;KN(,TPb>'XZ1WC)W-g#640(c\5nrq?r?'%%U8V*Wm-"euHH5!Fi9Gk[CrL[HKs<9o#["IZ2GV-Bb5]+me^a6nEN(6q%$iH#T6k)e&$/hP($<$r[\m)DkbF/me@cTQ$A+;Z123*Ybi(Bg9dO((:"\9X#%Gn9PXD?a4;@3PWX%l@0A3]#m2MOC12WDnhFR"_GT>J1OAs"q?6D3"<+j*4&+iG1KsV6ek7XUioQM8c>M"\O#a7t*LQGJ'g9!L(e\j0d@mETMENi/iM!+\!Cj09$"Pfn-B)bir9OfU_XhqnmaTWD3.3E*f<#8*>h_.OUODOg,DRX'F1\\5AmYAUFf`igL=".E0TLm!Emh3u!+bBmFI,Eh5_OnTMP^4UY/rpV+1Wjo]r2Irc4sK_We3[)_oT7%7CNQO4#aX!=Pf!$H7Bd-_)Z$W#NQ6@"1k(Z*pkP(&r9/1@U-`PmjLZdR8=ILhq3"nDDkWTMn`8\R"endstream +Gb"/)l]9dY'*"Q<@_Nhdl0W4S]kfPc*&cJEP?o#IGMObZFWo*ED(F#7Pe7t0d/UdHac^4<&'>4HE59F`*1'st"[9>Nq1M[R,hr"oLH?G+4#4T*aHD]7t?5?2%,r$0G#&Yf2ZT/L[9;amh,3EiaiXLVU$oihm&@dRq0iG5rj;9kp&gO'd1^O5eX1f^k]9:\+&+(jtZSCtgW+!0:bhqpRHTn`[f'3-22.l.o72'udD*<_h*:K5b:@+f3Ce*%sZP_lD8]*WSS,%tYF&>:(<.odgclalmEVEl[TV5BuO/Mj%QSeuu7%Bpt=#s9n#jrWlkYW'u6H;048TmYHK%shIH0b;]k1E*.KD7LajF,+fms+u;"dgT-?VLBMYLSZQm(l+C&e*Ig\UW\aT6_%[H:':.%N:Fk[).un8RQ=(rg81qf>]#a2fGTa`XipDjSmAJ.O37oSYh\4SmKtl_':Sa,6f?YD2O,7r7^Ef73"CVGM[T/C7@.2cA_UR,U0I>5'h?+.(%1W-h$.$2>4H@X0[hOS`[DJRan*tW\6u28'q@gKqpuC#0Hp'5an8kqDHYfm`3P>Z@&0.HUF2l\F@kDiplF":,"in5_ur``C\'"?<7=P^']$4IaV9trWS'aiKLYa*3PgED!Jk@(("(G/@.au7'V@OF@FRheXTaQEZSS9M]mg@Q>$e6(jq0o6+4f.;37,LG]"Jrk(G<@5@-@M>FOd?0670hh[;uQ0pU?\u2-j/M-pD:ODrN1_o:qMWDG1a3`P=4"ohT:#&+t.c(?ef2Y)f.@1#lIsgN)Ec.pn/qWH6BkIou_S>C\:`QX(XPPN/e<5bIS2MqI3nf5M0X\+@Y@1u%DY[;s7pm^ntZ0JNnM(Epu#nhH-!@H3=`GfJEoERZ>:n.]&IRVYmW4@qe^h9u[-8"*/.s4c+K57LgkMYW+Z]$I@.eb]%VenZsgU`lkrA]:W&G'4Hde6W:WIA+?e>`ln2oUH-5BN_seKnIO'm@2ZIu^;mu1?RSii@[Ms])rD1`+k25/njEruB.#kHnB+jqO=#:7p9SSpZU,dGu3ZPoid.]*ISgWhn?k/(,C1b1SZYi5qlkc_B8/&fb\u'o%KcK,Gm.3Ken-O$gk#:C,(K%,Fr24iP/CYt4UQ1GB+d#tB5BAKFCu%1DDCDUnDoD6"6o>0/gZ/d_.)Z[(b<1E\W=AFKm5+NpkV/f@]pE7@jV)*a"YO`4!SRud9M85;%mGd?I$\q&&3At)`'B)=KCLNd?1-kfi+udr<1,kaW)$W646MIjoQ94RPt=\i"Fg9_%&VJ*pn`1%IN<5B9RX!u!XLj$K\o=?5LKSPNtN`1WaYh:GPLA#hXd7]n%pdG6*DtBa7AA4d$$&Jg5t<@Q8V@\V[W;+S'ap^ME4lT"cM:EMa`\1XN>.`1gjRlG,3c_V4EdU]QOk#3%[!Z)(h8rkRE5e+RF/_k--+S2bm.`*@RNlYQZ';E`-@3M$,a64gM'SU,Ud.hAS0iTa^YpH00T-c]l<',LXf9KKYpsf16+d_u7pm])capboeE!l([6Edmh/'%o_*Pa_d]tbEL)7LrS%T@aM0+B&QepntN]T/F[le^SD^+7?,r\;O"NEFSI?4HCu$XXk[_EIJ7:Y!K5O^`^r-oq4IE;\pB5VDT8K2_3+ulF,s#TZ1X!L_AkMkp/DD0Xjkas]!hrBU!OC.-4Q/h3Lj]_WMJjW$bIA*6gV@?EbKWU8&N#Jo`0L'-%#@!I;cGfV@E.K)[T/sLU-k=8VLI3"`dO;FZ/UXYan[Q<.sEn-/4*q@4$TNB]Y/10=d%"QX9qY]5_1Bm&UIS@-@P>J8B-ZQJuuf7#bSHTimr]:a;:#g#SrZ:_Aeg;%\b'J,JX@OM^UDFag3_DfGPXFK\pIUH,ep/!K\;LRUkZeD9J(pS6k_W-Va)DGiF%Xf[@Xl]LT6OcJS]0*WtO),&r]*>EMXf3]0%$Y&B9"2>?=iX#C:WTi6I-&/P#H\1e$\G]V1#'iGC==[+8ML:&Uo*dG#fSr\\Es9(q:P6>(QEdn42bI-hj$e""GcAJprcmW:UTHr=$jH+n4V0SuRRX(h.Xa`mq9EPlQSlF]]Oi\D7,>a?l>\GMV6HhU>!EW0p$F77o`F?bsSNUejGgijYG73D-t_sK?UIcc+1des`M4kh*AGEpSk".CJdnh'qR-%rHERd^,X;#'XKQ;We)e`?h+Hoh'UN^'olZB)Nl)/>io5G!qTF_a*9Bb2hpq^I6^%?"U/co(H$d2NVg$u,2Z0CTK"_>2L?N(&HIr5j.YEf`,9PO^$+^:o;5>0"S#mg(p-[eRW#aX[42b]QC#aP$q1$Y3H>cji_goIU(;^P+E:.k;_h]_E/3AqZ*~>endstream endobj 32 0 obj << @@ -216,11 +216,11 @@ xref 0000003877 00000 n 0000003952 00000 n 0000004705 00000 n -0000008052 00000 n +0000008078 00000 n trailer << /ID -[<4e4af14b1218eb9decff8ad3a09189c5><4e4af14b1218eb9decff8ad3a09189c5>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 19 0 R @@ -228,5 +228,5 @@ trailer /Size 33 >> startxref -9169 +9195 %%EOF diff --git a/docs/20260610_SERVICES.md b/docs/20260610_SERVICES.md index 299324c..acbafad 100644 --- a/docs/20260610_SERVICES.md +++ b/docs/20260610_SERVICES.md @@ -6,6 +6,10 @@ _Validated: 2026-06-10 after FE `apps.conf` consolidation + BE sync. Public base --- +--- + +--- + ## Table of contents @@ -13,19 +17,34 @@ _Validated: 2026-06-10 after FE `apps.conf` consolidation + BE sync. Public base - [Hub landing](#hub-landing) - [Console home](#console-home) - [Issues (crash reports)](#issues-crash-reports) + - [Related endpoints](#related-endpoints) + - [Upload via curl](#upload-via-curl) + - [Bulk / synthetic issues](#bulk-synthetic-issues) - [Tickets](#tickets) + - [Related endpoints](#related-endpoints-1) + - [Create via UI](#create-via-ui) + - [Create via curl (session cookie)](#create-via-curl-session-cookie) - [Graphs](#graphs) + - [Related endpoints](#related-endpoints-2) + - [Fake session data (dev / BE)](#fake-session-data-dev-be) - [Remote access](#remote-access) -- [RBAC / access control](#rbac--access-control) + - [Related endpoints](#related-endpoints-3) +- [RBAC / access control](#rbac-access-control) + - [Related endpoints](#related-endpoints-4) - [APK builder](#apk-builder) + - [Related endpoints](#related-endpoints-5) - [Git (Gitea)](#git-gitea) - [OTA updates](#ota-updates) + - [Layout](#layout) + - [Publish (operator)](#publish-operator) - [Heartbeat (device)](#heartbeat-device) -- [Auth & account security](#auth--account-security) +- [Auth & account security](#auth-account-security) - [Non-HTTP services](#non-http-services) - [Validation scripts](#validation-scripts) +**Documentation index:** [README.md](README.md) + --- ## Validation snapshot diff --git a/docs/20260610_SERVICES.pdf b/docs/20260610_SERVICES.pdf index 70ce67d..4db02ff 100644 --- a/docs/20260610_SERVICES.pdf +++ b/docs/20260610_SERVICES.pdf @@ -240,7 +240,7 @@ endobj endobj 43 0 obj << -/Author (Android Cast project) /CreationDate (D:20260610172108+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260610172108+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 exposed services catalog) /Trapped /False >> endobj @@ -403,24 +403,24 @@ endobj endobj 74 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1005 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1024 >> stream -Gau1.;,>q#&BE]('_aGL8VG`QPB:_[qpR"T/X6-ACF-D7Pcn==)7P$.o>:$ct(GnFZT,F;1r:2X1"aR'?JH(^AG*\CT.dUrcr1+P]-C.psn;BU8@"cT_u'bldBWPAoP@IIMTFo6DWI>sb6".r&i>!&5G$f8o?JbBi&:YC=;<=`Q#m%Ar9I=X`U/+%F!:&)0*D]ImcDol&Ys8:B_t<,E?G^/-?=+Ip+ki6M`P):N&8c3B!bAcZ'l8m=++Fb!#lLEJ=u7g0R1Fij8$VkW/d$V&WWUSLiJ-&Gu^o;5EuKPS]'BQ`D:_#+7mgM.&l?uBbl&69PhqsZRq`1aAnaCVUj:@:X,C\gd+l5*m'"XVYQiKNEK_BB7;gKroi%ARW&&!+[?h4l:%@4`OnJc,qlb7!-0u$_j6g#DdIW\H?GpT^)S./FB1q-(=\XrT^^BN54Ni1f]^W"%2$%P0V`;`k@^O2gL1*P4PCDZKCgMg+r>b@ur(ZIeH7YfWMI6X3m?5u\:B>LTQ&(h`/IL2:@QNh>l?@o9;jPp8a=5l\_"*T5uB%j+$Gjq:>]&jas\l^@tJgY>gS_pKqgsu~>endstream +Gau1.>u03/'Sc)P($B<]dg32l-gC%k=#MnBFV)&LRbYhXYA'N[:)X(\-RfbLJ@Wa"Uf<4W^Q6]rI1Cf>+4@o^-,;eVqhG:[L&;QS*5mp\_^+.8\O17I`[jY9(<2H5Bb3bO)#oB/6($&U71_l),YU!";FZEr!I_A.CQaZN$Mb;\-kOs$:tc5;O9Q:+,95$&(l[`X.p9`V)[dIHVBC=Fb(p[hcmr6)!sQ0H;HLJls+(#!m/=Hr!e8,N.HlEfllMULA=*pQr;.YkrAJK?5oSC[/6iA+L1"dj'7DGU6"#V5i-W1o/6"Qlu1[*aXA/BgB#3LOOP96oG_6>sZ>e0Bg)&#!&;U!n8M1Wj\Y1`W6VqAUFC>cDF`_;pq_=hqQ9&]J4J=*V@7jQiOb5dlDt733@9+:T9Qq8^Dt';SNKmHm.Fnpims%oL130R%"CD^3WIQOu^9cS0-G<=8,d9=EIF^%IJ44+\`d!8UjuQaD[+hC?pVq$>[Y;r?^5NO/"p?S_I4^JV+#jVt+HFf4W.P#qop$reH.[n8_b4n2U'$a/k*Do)*lMbTHM!..h(s/iS5I&$?s+m)sDkO>?1E)^%G]E7RHQM/=L+nes#Io5mqV`^ShqFV"c=4C[h/Qe]Xj-&peNIumpjOk;+`YO]l:3]4f*Be/M:K=G'n\/q:6`e/=T2&/,O2dC4?s0WOCiipsKhBo("4p-u5h7XfE/<&0\/*eKSR[nP[cn\O*4%u`]E2CUF/;V#B[endstream endobj 75 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3476 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3462 >> stream -Gb!#_=``=W&q9SYkaIs>;%fAXI5mMGb2L:&E=u'Cm(U!\"];MBQm+Nnj^TD+[r6nc8;[YNA27AL,Coh6NNX:\mRCC])1RnCIs2"aC(A_%$7ICJDa;\r*Te/W2F%'08BFBeL1K"mXFk*=P+als^5(P>U/KFf,Qm0J:h9QNJJ9uG3'kZJ'us;I53!AOr^hKU8J8Ts"]\UJ'A5KFA0OQI>L).7`D/r+SUj\ZlqsCjMF@qg(Q3)3+)IQSOE"4#o398_+RX$sTnh/BP?#)&c&7A'1)HP%CSPcLpEMi3+"J0%H(`75a$ld3,<*o+Yp0T43cA[#L2GJiY_QMmmZp+D#qJ!+f:SUhj6?&@V5R9;k<3FPGamT\GK6NG^g[6U8#Q=40ePQ'uEXU@)/5%?4Gl,_a)ne=.t48\s?g-El%N^$Scb`@rUkP+=rgJ,,$b#SIcRB_S[ZA4Ju?efb^n9P/p)Pm$!^4b0N?^oU.Nf(88q!%oG+HBg*A`)@:"j3V#AKI,5I*.F`%1)7TBoI?_Vc0F(MDUE2,L%G-<'$mC$\i'E44H7;J2)g\_jbFTd^f"j+)O=I)Ch2*6Xg.qUUK8V!T-gVXH"#6+1sFO[r,Ca$I?5\iOc[>98[N(28.1R:7s^HK(BJh=mscS/[PJ]^='O!XdWcUB+k$6I00"@\Qq)5s2kk,VUUAe@5#+_'Kug]9Z6s+"8+ZYlbcRk("maY8-+I_'"OnLt9o+2qd(5F=@7$je'N:fE5[@P<00d?.S=O-ZCrZ&.9$%LI_.3qf(DWo/?hjnka@7N+uV)il^,=C")SOdhGNZ[YTa2Y'5@*#>($)U)02e/L[(:Il+DdqgK_>"?g@^,qepbAr\s+]48]UqA?Pq@K@$`8L48C_#oHT0Dt+irH!dj5%c*QP&'k"oXS#a;l0OMtH?.2su\l2LaHLkhd4eV(o^q:Und\"e;1%I*5u+,f;G*[/^0MrBV"u+[e.hi^!U(idh[GXb(eY^L*$I>IAQ?J`c.YG=RespLTq/Zca-RV@U#?9A^jZ:Ec_ht.!Wlqq*)`r^0fut.jpQpl6s,X;cUg^;:7RDE67b"XVaik!3Wc=?)j?#S#;&218a\/8G\C[o`'bMaQ&5]rkS'^oIqibk"&P:dGPiIc->qUD=g9&%^pKj.bO`kmsmG`TYBt6O87n%S^VTC_+=S%NPa-Jl6c4er*01K0s9YnZ3q"6a[aXP_[g:m\bFn8:NS@ETSM/!Rg7USGhtL)od@I>fDd%@?^4IKU@r_B9/Sdl%`Gb%16^>"2DRI%nTTh_a)f!',#uAh&F76b7]eQ'3qIQ1_8g7ts/"#3L-:'Z5t2Ge04i:4`>jBY#9_!LnB(lJ)9(7@H(l4IRR@KY,^Vo?1R,KW*M^UUll]Kk`a9,.8$b`dT#;/[71&:#F8,N8/3j_7e3D]j9,_'s%<&_-n_eb1_TZ=<>K/OA5Ot:XMH@Ld+D)11/K>KkK^I;n+bSpkdXeMU:,Qd+Wc;-#>0bV=NTT&f_5LrbP0rMfBi]_8Xp@@Z7M,DNKI,^`0'I2V-qh'GN;Ek>0MDV>4O(_Kfeg8bA;uABB$UWI\!*/*/$KLfoqja3MVm,8q@R%?Z*XFLkL'/CS7V?X$+fYO\Gs+YJ7@2qceC$<0e-jr']hbq.PZm@QgD)$mlo0HnG)a8VoPDUBqt1oSca#thX5b[$kf57I1kLDPr)5'p@_Kj/dI>7KPVrjB*pD)AQqh2:Xq9I]7&*LY7s"S!aH[6"fd\g0TS@<"-=W6*]N&D5mA6'Gs$j^*,["4S1YjY&eA!,o7`o7a9jWd`TRlJa-6XRLi>KY@TPF`9<*.FY[,'1n-??64mMX%9#+gp$GE);R_lmBjQ^hS"a4Wr-!I&PY-mb8^r:MP/,(UX!4mnB(co#o(OpS8RNcd5??>$hct"0jKH,jqfdP998>##/dRd]o<6:BLKD=SsQYp/$[j57&oKrmkDW<-Uc%A\PVGZF%GQ.LU8O*@;#nPi`pBsE'5,B;0#2L=c.28]SfZXhn#2qM/l][aXg]>!TE*LGB$Wd;tb4SF4n#C5edX`6SrLl"W8^:Kr/jb&9k1nO>na-,\Hk9jsR5@"G:"*2HOrN''Ck30r_Ymk48(2Xe4-6eUg4F#%:D^$MMTiE*[TCJ_l7(c2W(Ca>FdoK[/]$a5F*rROO;=`ZE:alo)B[DF`FdPS:PNM]!66:M3[/17I9F?b<=oG`P@KJi$\opY3r,=N6K8e.@#`I_nF:iiMCqJ[3$dR,.4%:T>KLG?iBd+80'#P#Ai('+r7N<,j?159*IOs_BaE8%3/a-$5H:VNH**gGj',NS9GMf%g">t5\t7#"9md\8U;&MUjZ&E>WfGR"LM=@$USH0hWUG_aOoR.1&@emLGI.6g)=sp,%7r78]d,>s13ut5YN%@,EFendstream +Gb!#_=``=W&q9SYka/F!A8I.tiDaPBak6,qSAZ'i].^=0;%t91VFV1_q:LK$mG$PFP2ZKjREUt,9-D#>j6K10]?sJ@`ZHN(lYQ[Zb[GgsJ>0o."c=qs0Y`@#q8j^+8hj4&,h"Y^*A#s2%*d2i4m^0)Q&:kS))0s",.#U2Uo8j`#YKiQ32U`cRB0if:H.d0DG$5XTZX9[-C\Y*%.5Sk$!^fPcS5BVK_1e]`/S7VGu;($Sei&6!2%XeUZ=ogquUdhJ3Ja["?3q]i-V\I.60&\)9#gL1l^bqFIH'4a\P]1PcS)RV5uh0_9hrtIl\/r,YQ]?L.KVj!""[)CA_HJnJD\KM/ZC-*'8igP,#P]?.dNAc&n&5sd#I9:8ibJ(aggKYq:)hg-t"uHr4EE`gQEjYmPYO\SU-,c2g5RbUBG^I\o>?0&h^*39DgcGdt^7smM=lDP2sIR#aOVNQXeK6A/,1TbH<$kl1-RmRZ7M&7[]Lb[>C,Z_<20r7h/JA#mDc=q[i;D'+?IoNk[p\ec*^;D&+#g@k"j*aUf?!4H8FZc-od1$jR%\HpUr&T(oAQ_Z?$H90;!4h60]e4d_@:ifo_B)Fj'u8UY?u"-c,NG!+;hO0rn3EokLtoJ;]>g?Dkt?q:#k?8`VNfQ_ntH&q)'43p".PGSS\#ZT`S8=L?(7iG(Qk_3;!\D?E*[:P/ATAO_j0in,Iq=E;[6_"(NkNSGGIL[Ft"5:+Cq-aED7&cXUmIH2_.4f$m+(qD<[2hSp!l&r_I_7D=%\4il)#Ff31m;jt:UJ4O$]1a)B&7\_IFb?]RpFMFr4qq]83!6Cn4E#9q5X>e0pi-']<)BQ1[cg^2.Qf'3i^N."%U'*ifP5DqZ+%0ENBsbuuI7jHWIJ`Vdgpha$_c%1kE=f\(EP[q4&'5SPl7F-J-_q^YdsNVohSedb^:TbnbAri"0i89K;Eg3k4IJgT(!UX6d(_H3^n$N[=``[[UORQu;J"B=Z-(afo5f\`trQX2Z2(9f@'HA,TE&m/OaP!GPZ5Uha.`:=V$-aXIGdWc=W1A33"K;3j5cam4I&\CYY!'bPS\+XCS)X!e7Ja0T%[Z($(<.E=RZRU5O:[Ta!Inq/Km,44bqf#@R6o4ip=O37BD6IK-Pde4W&O"GkPP,60bIY,#0SV$NX8H%GTcSiHIi^2@8o:_KuK0XcLr[_VFmI"FeJ!O/MK8Cnm5FlZp!9:8(4E8MJo/\2gSFj$hA/:CbX/leU[sCM[At4$;%'/6X-;gnq'`J(&5A#3j-"ij^D>%j>N*I8_DN(:t@[@>cXrY/YU>d5<[mmVIFXU-"Ekr#\!//=$B`^&9-oe*YNq']jIT1,5:mQLqh1o0/=-nCdQ)a2adJ=ekWg?3503h=#b]$l5M9J`>YDPY>$?p\Jl6Df@[)]+'1.43`OHs!Z)anP-WRbYfIl-*fRlYm*XPqg-=G1?7t*Dt:$Lk'q.qNfTq0n?Ok)";lRY:?EV5mm$9lWnK!&OAL(N0<`h-PEVXWB=2]VW(,i(ijTnd)K2N%,DdMIVKoFb4_0gaOcJ%D0+_\YNF>I'V8"ApsFGb^+:HVnR2?!J90/P:(ERNH&9rBL+8@)QM[L2.$'TV/Lfq:T(iXg,Eb,NGcO2M_C$G._+j?Ya7)V;Q\PDD24Q5;18_,`r"cX>&ZOLWCNXr613#jTj/kGE,.XT^Y>G]&:@*(Qfad'KU]2*4oZL8!EHSCld5`AaZP:_68.-THYn/q&Zr-uOOjiuWGBd_@!X@>(;#m(d#b5("XDF."]brLo_[''(:Oo_JQW'IWJhcJUb]?3OklNA4i4.X.X3(?aPHar^Xd`c6HfHGjO+KE(XH'CEo@nOJqWlhRX.qEWPt@LZrbuq,nZ)%B\C'Y_E@pq8I;f])J)TI<<0pl?~>endstream endobj 76 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2874 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2900 >> stream -Gb!;fHZ.Xu')t1g@c6WZdRC8Cos1n0pYgrcF:,Bp:/^RPO>`-M0RHQ7'!@Uo9VRF@WTDZp5ZZf])'.#(jb?oiLAOBek=ZpRq9?bPBm6*%D8QUEgl?UD%m'1P[r4H2?:7LU/'"$a-X=_WVn-5Je"_]1`:io1SpY^,Y[KZV+9mD0&hD$eP.HaO)lPO7%I0KL4u5Ah8G@QY,7/Uiu+"!(C&mj%FpnY2[4-)%gptp\`-"!8NhrD[fcZ4%g.L+>S1i/GLMMmJK)du/9Yi@,DJ_/7n^LqIRg6r@2*FhMMSEo-WV*,]KM1U$dU\RFgmW+^(u4c'h:9K?L^J.)S>K3Ul;c1kTM(ss5FBbE2H+\h0BMZ-Zj^N@]2ppWEj2[XgE0L4$T[8,tF2qUbq4&$S2m/b,5#HR[ST$qhU3[(OU-cT027m?A:<+:X9('aY*(6?[4lK8$qRiL$32G_eh+0-6.A$/M5qg0V]An%Racq>S?F"'SN3/Of+S*#h?,M(2M5.`mJV1gge(;&r,M(e(A$Q>dQIQiIMnf.QAgdT?01l1Qb5RCL^24S`u*r-"i[*(m;X"R\]P[;%fE!BMg[OAOF^j]\m`=j(Bbf>juBs$aKUGP?I^bkC82anYs__OJ3L:64Q5]J>11j*esLZ5FeL11W-U(\LB\cE+il&SA5r*-;.SYe8:7aQhbhpkqs=a:D2\V[UXRb$i"XD9mH%gI@l[dBW-bsnOQcm=ZTQ?9G9NT?+sP=O;oJH-+"0UjjPP,DXjKjg9prPm92jL)RVN`k*:SRinkB8%S=&gml\CsCg0maGb$T!9-0UR2ssVgAuh==/%+=cIUtIBg&d?sqY#/BoZfG@r-,!4pXm,+;Md=-3n-_6lD([Y#dC:p2Xe`:F]W/I>[ne,J:s'R$#W.(*c223TF+,j]H:gBcttYoEaR2ds'E78bIhLQlCtimF=j)q6$B"X<7.fP?%lkg'A>DSi<'AJoiA^`oW.T!3=7rB':pYiGtJ.WUq/W!m73iuXj%[3rkfWkjf;,#VV3#=s'eU@N8;8qUd];7m>Ha*A^[m(q/iX_=sf_8*'Png'@GCd11rPCA-FY\i'u!LEC@8=3Tl]oJd9Le8pBV>=44V"E@OL[Ls6e!.Fb!CbD`g&d)Xq+R,IWQ+H1G3D?"X'$1gc)%ZAbUu+Xc@Fd#7UXHs?4oTYRTF?Wd=ut15IX-.1=E%?mnV_OT.>@k.AlBW^Ruau"_TJ#W6D=ueS\eeqKuJL`$A[^Wf(dcE*0sP"-80el$g[Q0%$"@%=JJqEE3u&f2^C*/!g!ljAAqm,c.k11%-:m!0-S6gDo@#`=O.q`R=d0TbJ@rmF'C091eblsLIQ&hd+#ID60DiWOhH\0k3qKFqbkG\;=l2Anh&McXPFD]a]J2lMf.P%7s5,sNO**\jPps_h"$cE\[7m,pZ!_<(M<W"K&a$\VK!#>qe7O3,^WE1RB^0Z,r2GL[6edlA4UH*S`'Sn_)Gc#m#.]'L;@eeC7^j7)f,da^0Dfo#Q0-qW1+>(V&,bk?9:uIC_TSb=bbMH7s5W&,ML\=)jAVpY^#4=V;p#-e)AqiLaW&q-B50q=&?Gf8B6\+6&1jW#iQN_dsB9Y^4MYiXU.lg/^c:7kaPaJG"qL_OJJ$;X[V(P5&jNO/>LUa?UHc,4>OSi@e%tp5]1P8'gr!61/Ra31pp#<$+eG3;UHLCjW2V^:c#I7kkB%X,CE#Q4VZR=RY!/^==L2>XCX^&\VKEaG)UkF$d??UVELr^Y!gYZZ-!erT/Wk(J!p,)UB_4@#1p6=u2*:`5U+T'2t0Xdi>fa@X"n)E]Xkj'&Vg/i@^Tf2"AL1Ok:W4;EJ"+n4t%N<:"qh0"M>'HMJ5!$(^`&LAM,jU5QVBWei=eoV'$W0O]Y&_;K4V`:&"Wb`j)K.\qs4`2%?@-/(l]JY2/gs&lUV3h%F3QL4*?E-m*1l/RuYr,Re%4cB;#.c\cCP%;1LO.)Tp@`2r6uJnja.-]7epp^EZKaP?#tXk6KVu3n<.1#!FAM[fAFPhC\b*eL-gV^d[FP-(/^T262(oc1=(Z4?SK3>>VD*Vt"@_5pc36]^%^eX2E3=384SRB89UojXmR;04R,;f?m.n-cpE/98`sQ=**#:Jlc7`dZ)tI]XCMHW_W0fWT!KMHNh>3PhelO20l]=@j\.6q+GVOAY6d?2j[[NE23j%5OWGR+/m5ja7OpM#EG.-O^J$2"@P(JSJLs\DH2Ig15`"(5ZA`-a#q1#k##R6p^P]?aaQq5K8mQm_`("d>.KQendstream +Gb!;&CNGt9o"0B?QSs1kp**mh9%e7P3Jf]\<&S`*D;A3_Y#JmJ8_=:SKAq-"oA?_V&4.506*]lUY!`]Ie*lPcmX]nCIjFpK>lqYUKDIA)U;M3[`)KDI^P0#adAJ3e5an!J%kZ$/a*&0A(n%o%kkg9kc(\`?e!,+o1ndEC#+j&"&0iW\ka#\oG_n7NYf5W2L4Vblj8#a>hNEUD)@W32qAr?Kr:PD#H.mTPj(fM3!<)4Z0Gr/I%Z0X?mg6/\_6K0-3(hUJ^,gfm3-1$WQ`%T)]KPSsT.l[tb5pBu'#9$)_VcMTnc!QfO=s?^cVth[l7*8fl7)6ImVOTY)#OHU0;C44@6,7_`U#V33"C>&VLB5Zf/sD$OYPpa%^,_k-?nsg_&<>hmR+>K9Z;"-,BVNG@$umY!.:g20NTFF`:)I)>XP4+[Dnp?qKG/Y>U&+LkQY28(_U"r"DFEUU!#E'>]g_&(XlWG/5`ULHc&0Gj_j(u.9BHfe*.k"9a_-p`Kk2^]Gk#nn&'bO@EuCnUYH/6]Y@PP2kU5e$e#8PI2@:V=,]dK-$H99/ZS$Xqc,NtNW\`[@8\"/9^aauc$U:Or1Ot$>pRK-t%S,2bT^i3H*92P]XJl1>2hbD/8J5g7BNWLp$(0/LSP@OmfgpUJICJf??t\8;.ZAVp@Q=4\;K<2QR\-m.Z?tk^H/CUM#$8Kp;-IrZg2faiuAmDF'X&-N0C(F2%)<#/@Xj79$=?/Qk[n:M$&IO;=P`#M>(g^r+\)%.eHaG$6CVH\giHZ,"kE)et6ge.'S$`>I9s1Bb\%oT;_`8KWgi6Oh]g.6>jn(_?c^#.#B_V>+94fM3*=Os)ZUrjuKJR?^e9c:sZ8]a89mAtn\34<,DmfXCP62&h8'K3)uUZG`6oE-gqc7),)()/+OtDTnCl/^McN%&5@j3UZbd;YOm@b)fU@4"hl!N^4_$3?7klmF?k5MMYtF#3ZPr8sHEj`!fYFd=8=EPAYKt3$#3_(kU2*dI?:?VS"P<4;g2.NQJtu$.'$jWQZm>"d*VWd1Vm,W35d!hVX-uGu+JF;&gk@^PN9(I%FV@6f;C#h:p5kI(5^RUnr=W\W=tZ.4h&LbnB$n^FR0>P.6^_L#HO#p,9!SQDdN/(#EE6Q3"cb'QR2oX3ebIl$B+lJ'Fr;8XRW>i3%UuK2D)5.L%Te(#"RtcXO/O33*K+F>9'"L#4sMDqO0MiB'u+>LN9V]=4]sQhh_)KYaIFD1H3%80*gh=%rJEk;n!Lr*Z;)>5uZ6*JBlE6,'t->c/6h@pSEi-80L^7jBJkO=h>bDPHX>b(Z!%/4*D!kNO**\jPr*(h"$cE%9cNWqf.mY$T%Wprn%q=HKMMM6IC7HBG;B1YhAdlHK'3%SQQ(p=@>g5BUIr-k5fnhFNNJ5ik/,3buD8f`%iEF4(O\7PCR`<*Z4/4?-YeQ@rq_'C%1Jn1QNXr&.0[I!E<SeK%[NW/b[^"UcdS':rA>lo,\3-q.BGTh&1UKb=(23[f2>TD!E2H:&I`AWq@o3SLLE]Xkj'&Vg/i@_a"B]=kA,-a)FV09)3j%gZA<:"qh0"M=\4T,l)K['f/_u51;kb>5iC1>@G]c4$t9GjIM0XtCBnQ_-5R?5liKiCp9pbY8\1?t62[tt&$[n=T=P1t&[A2W3\rV(5.G*hLOEfncjZhusYGMI5j.,FEBlRg9Z=N+X#)A10a7hN[h.]qO)GPm,]s(B=Ml$T),H+(?:__&0ic1Q98h-,7@b>Ru[88lbV#\%f]JF4NMAY'8G^Ka#:XY>B]FFato"Vb*eh=U7&$F=3l%mBW_WQ)UF]h88]c$Y_sD1JIs6m9.m-Jn`tiFdJS@%H22/-YjeWW5tn(M>M"PiH;]8XE>t0Nq'te/$,S(--"N9/%PbB.1TABBQ:UXO^K@i57.?:t+UYf9pp)dKq^J*F;BN@$\jAm]R#;);rs&(:ds:~>endstream endobj 77 0 obj << @@ -513,14 +513,14 @@ xref 0000009845 00000 n 0000009945 00000 n 0000010034 00000 n -0000011131 00000 n -0000014699 00000 n -0000017665 00000 n -0000020544 00000 n +0000011150 00000 n +0000014704 00000 n +0000017696 00000 n +0000020575 00000 n trailer << /ID -[<58c8102b70531cef7ffe0ad93695a99d><58c8102b70531cef7ffe0ad93695a99d>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 43 0 R @@ -528,5 +528,5 @@ trailer /Size 79 >> startxref -23257 +23288 %%EOF diff --git a/docs/ALPHA.md b/docs/ALPHA.md index 07eca0c..e827aad 100644 --- a/docs/ALPHA.md +++ b/docs/ALPHA.md @@ -10,6 +10,10 @@ Last updated: 2026-06-04. Use this document for **feature freeze**, **alpha buil --- +--- + +--- + ## Table of contents @@ -24,8 +28,8 @@ Last updated: 2026-06-04. Use this document for **feature freeze**, **alpha buil - [E. Known limitations (not alpha blockers)](#e-known-limitations-not-alpha-blockers) - [Log capture (when something fails)](#log-capture-when-something-fails) - [Alpha backend (optional for LAN-only alpha)](#alpha-backend-optional-for-lan-only-alpha) - - [F. Remote access — RSSH (required for full alpha sign-off)](#f-remote-access--rssh-required-for-full-alpha-sign-off) - - [G. Email + registration / 2FA (required for full alpha sign-off)](#g-email--registration--2fa-required-for-full-alpha-sign-off) + - [F. Remote access — RSSH (required for full alpha sign-off)](#f-remote-access-rssh-required-for-full-alpha-sign-off) + - [G. Email + registration / 2FA (required for full alpha sign-off)](#g-email-registration-2fa-required-for-full-alpha-sign-off) - [Ending feature freeze](#ending-feature-freeze) diff --git a/docs/ALPHA.pdf b/docs/ALPHA.pdf index 709c8e6..c48cb6b 100644 --- a/docs/ALPHA.pdf +++ b/docs/ALPHA.pdf @@ -153,7 +153,7 @@ endobj endobj 27 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 alpha release & QA) /Trapped /False >> endobj @@ -248,10 +248,10 @@ Gatn%:N+uI&B4,6'Q[Hf?%`g_a-(djgUIE%'Q'RS/dsV#=\GP_;YBI,qAm^RO9BEn"G-UmZ7,:a2fG;0 endobj 45 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3642 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3662 >> stream -Gb"/*>Ar7W&q801(gp_!`)1WCQ,PqsY1$uY0!=SXJOP(k`M.3-](h(ZEme=06ckK;fs4#Tk@kI^e=]>ALVr(i^6u5-14GJ[s1&[0E<_c]$7ICJ(80lS%^T@Vbte6t;)TYA6SeOnXFo'l987'Ep`=V=Mb69.Pmj&UTZI'.2Po'h"Qf7h/`H?Q@50$Cf85?2"feYm(Gc!=-$Wr'iY?%_L@`>25n&Z*Je'R4Nc`d0cKTp?E=rjc7"kI\S'K8(VnMq?a'5_eGYY4#ZCS6qi7>q)\dU4.`M,7+SdD\hi/P;nTYV7M_IEG/dW)TL/uPoJfdA;N0?G5GV:K38+^QXq3]iO\_5Fo]=RoaB;G@NG,A`FFfnCM8;J"\Dr%ngY--_Ukai[\E)c%ulK+q%b@_(q*>2=-EH\AnW<$[OGF/O=Wc,FTn['$2A;)N?$]9Wi.7L-lR'$4%#J7PE3P_4_(:PTFUY`r%/o@8m.I@T\R"[$![6?%iNjtd\C5Fc*5?J_S4ZiVfks!+SQdPDC8;n8NN6hVL%7Zu4dlh(#/u]`B]L[b^Vnk/(u*ADS>q;b4nQd=:(RpciAOlsgp^E9?q04GQt:d_Zrd/Y5+%Z%-'Mba+;;GA1W@5&PXRKnB_L"&QZcbW1X)Ko8`pnVDTZ$7";a`7QgGb^$WGZZ?[Ek3UY:N4\\+:BReiWC^=9Mq@JU:]=q<5(AdGjaj$^ICMeLP6>[BGe+[]9NPrc@U(Z%mI.S?K>@abg?t]cQ7*%k&-PA2G=RBT4&Qfkd&4qJSid7=VKk3RN=as7q#*R0eU1h<:7YSe-1SsB=lY^7rk34lcAa4G^2LjrWXoq??"Nq88*ZCiXT\b;cZ$"rK8jFd93AgoP+J-KQZS?iq8CX*aD%K89?RnKmFa?0l9-[NNmeQATGbh;6s*K?Rg8SN/&XIIJA#+?i!mEkApjCDm'/HN"N[Ej3`GdI0s/5Yc*2HkLb>J2Ta8cQg:t6ImMO"KJ?cZ\W\Ll\(a]+i\B?2C!8j=3H@b6!9Q;@g5,%YPIk%W(5I#T$)RfZH8e,a:?oQ$4>^.!8oJmm)rKe:Fa'6WNMia#Va?,8\8L-LbgCD+W?dAo)6*>.6EmKHhGRcm>na^jag]P=gJ^nX%)\f;$1KEAIChH86E;G6Iq4-S)/$1\b)r%*5&c+=IbU38W4&@qkQ:c#UT2:+Y])3[7sSQ$.s[(mZVmG/"p@)nK>a&;9@_n3Z$qf%&$Y.YbC)UH?*L!-d)JcU%H:9M&K0DXp?EFCSbE6@V&8)Z]>2*aiG-I$(,X]n6'X%p,lA#$k)!gpVnSP]k9RaN&gS],e7_a+/?>*OHdN0u8D6Gft*cQG_+9p'?7dMLtbcE]%Th@c3BTAG\@?gfJ4(ZXm?=FB#7b85ICdjHs>./aR,rEeDpqX%pS`lcF/A5rnmQZHsE^\Eipf>o&tXWA%UcW.Vt^eTAVAG0%EFN^r.(Fr?+"^*>7)%`E[6.K"M7?lX_4=Qh'ee3TW$^dV)?Thg!lIJF#3.^+CU!0o6j,*W+43A9iV^j[minbK`1Im@8MYTs/i*lrmm\mY,QH&7_,,]VHhLL3al3lRG$"C9_TZ&jJqiJ.DU"VkPMc+Bp.p`q:`V#`W:4Nj&1!3b>>&4.*B":mH='d%Rp_[S1ks-guE=;K"M:Y-iO_7a^X-BE0gN8SO@EFB&TcB`E[G^OSi6(rt,IZ@3]cup#GX!8u\eT?B+A"e1bG;+(/F3n6uWn?%j#jmP$%FDgWLuX!m8DcaO])oP1/`a>iOPAJUDR0DTbq8!7.ZiC][ii?s]I8IRWY(#,^nDZbaMSIETk-j6='@Gh/(J/dgIC%,2"LW8FKZnpe24]r[B1VMcNhsNXO`\pcgO:D&Dg""UN,?I!+PsE\:eW[qgKSdjER"^9*mf=R^+J/IH[B&7i#X5Z@T]qR/#DDfF-jqn8Ma,b"X't)](>?nKpB+Fr:*(`%*Z(&Qod=';p)R3.Y>4\'mHE?e7lh+hXPu`Cht2\1UI,3T9M?GoEtR>M10WT_2#N\'='^MIu(k!5U)#Ff"4&9duLFGVfjDP@-ra6F]QI'EG)#=l>t;Af@Z!^(q0iMbO78hEc%#/_JHT\9,tofP'/C:dU^VOl'b"(9bZ1Karh"\=,2*La#`<3L$*AWOM3Z6J&j(`$L+k-$c4qP`:;.11NY"_]G[6[P1q9,N[J$V,*'b8R,A^lOS;2^STa:E"I>1&E9=go05QfM&Rk<%LY=1s:$eu&c&`tQ^B?jN<&]I>liWA#ipGti&]q-K!&BWi!I7ULWKqJ+*B[\53O;^>B1CQ/ffG+p@d28_)d2N%T+Q2Nc0F]!A#9B;TcEBO"Wk`S83qMNe[5C%S_EKUG9m\CES[h.,kG=LbUQY/*uMTcsIR,@,i\X>V,V`G9ej,<*P'NjoGOB;RU6B0d%LA_G`BPleclfOHSg+^%_UDP:r[tm?m#34TeYb^K!KYC7B*cS44!S&WReKhR%7V_mLcYWTRZ=sqFrU>Nqm%T"[ogj?p26CfX^pO8\1Y!*O/Z?qN$ZN,uWXNNtP2[7Y@T`M6WmIkI1O#\mZP]Xu`C6^JQ%*mH0*r;_`oKBJ=HQo&VTWa4Ns8U]Gk>8*ODHpZE10q8S_E,*MBFb\BgL6[6p0H__G=e/b%/fH[bN=cT8VNlXV+nc2a\nRJuX)"0Hpu6srZoZA+nZjc=n+2iAb='JT`q+#&?[^0">^S-o8t!e$@?kKf'"4/=JsGNAP4(Z'K:0?=6,M-CZ-E?`Cs@BiZlLeW)N_,7[b&9YJ_-](p>4te04g[:0BXuQ9d>!jXUKDiT]2LZ1PYpt"7g>W:2!gS]r^hG@:'M@C"SF+Y^Cq;Ei!@RmLEjKZn~>endstream +Gb"/*>Ar7W&q801(gp_!e5:>&A?cY_R^Cb3-Ec`PJOP(k`M-j#](h(ZEme=06ckK;ft,PtH.i?Z2(2A?iG^cHDe?)$N#sACIh;[.R)@UB!f@?V,q-@#_u']kk=:"A.@ZI2+dob^lX8DSA8%!`mpS/hW0FYgaaeX:MTihR15[t;-tf1I$'&q/Q9`%Tgk9q8TZX9[.cWa!JpTs0=]#B0Zq(93-ErGW0U=,=,?9]MafD1jjn.YQV_;Cu"rAbNUO+p;tI_-$c/be>B=E`6ZBOA7p3IrqL%eOTH%7<7?H`-+5J33J8JA;J"\Dr3Ql/--_U9L22-WK;iLDNW`'C@86&Ns:fXn7.;r:!3mL]V/YY+RLZ@!OS%pNT[\E)CGHKj\mFCW(6g9V2re-3.!"fD8cu1s#<\r>=W4EbF-p4iMS67Pf7hQj/;_p[">@LSlS'K%8.sDphgHI&ZPc0@dn*6gTQN_o8lk[hIm/K`==L:gV!^HBl>&J9l;a39RU>Ci8n'_ilR5M)0nL)c(V%Rr`OUATOqi6&Ke5B&P#WKu:FgZUT-,&gh)]+[ZS`nUJr:ZY=h:T)FKEtI7&]$J7ml2uqS_E`]4&k70QhsE>X[P64uKk;fG4pX2*nrgfb&m[*$o-Xi8U4rjYdH;;dd[l^.Uh8Uu5ssNa,jrSDB2YIKL@rca[b?UbkOaEL/TX8o)0'IRtB^kcD)oqSaU-_E.:OnTm`S+3l!?,X,M8,!>k[)N6&qT]tp#XS`&>a@!MC4[1JnMN%OfC#pfsE__>cs.UiYbHt(aX8q(N-,F_eq^/M'mZmB*h'oB/'%n7$%8UH"hHW\sD"6U:8gd]C=;p!=*6l$1L3T0mu`fE(d+8g#isKW99HF:A$TIWl6VNi^_c<16QV81O*7\GPpE?Lg(uOQu@5N5G`8aSOT=Q>B6hs]=k4m#465+*\MCBEUkK@u=1dt*lp;N#g4deW9=AbuJP$0UM@T:R.im9b4&eV0foC-Vb=3Y0YANd^YVcaGCHJs^/.F`Tbs!O6EY3R"Se1Ib\)4"0ph')Br;5%+G^_ljr;CAVH26>jp_PtoBepaGcO+)Grknn)GsK@A\%W^&iZDj"6\]Phft>oSnaif'5`EUbA4]jnG!'\VFu_f!Y+rgkJq.',YOJP/g4FnDm$7`RPFVRkoP_p3,SfL>L_\/m(8`PQLL[stn@n!-.^m21)9UbgR=BI*hA^(RA[B6j?^O.Da6\\2#\\GY6+_7FBK,fS]:g8Y%-Wb]*#MS7Vih([&%%=!3FGZ\PL%25.Jgp&JIna4@-?&i<&1@F1GVnfDob:=!op!9P!%Y:p:PYp%3;'P3TT2C3m(WAp&M-pg"'ksX@1G^S"1E6Bhn$UP+Y`H^\\I#F/m[+lrsoY$^]IfG7DHLRacFmrlBfDlV@/%9b70%ED5UK.5b.=LLq80FZ@V.*e3\PG%&_MbSOT3Kb@6"bE7]e?`<3pmS*3Ip\h`2u(8cT#@l>m!jCG1ST(1aq2L8:i3BJHFgO!1mJY'1o*#Y>Qh[WI2iM`@fO>=1K7e<(i8Pq?N+So2TT(!bZh#&/!=0+Hk[K](qEaT9^Y7T\QTE`iROP?a#DJ'?fXW$9/[ZK7F6#L`O\W%Ng2UjploXCQA?.L=N<8(:*)T)M`5SM4RIEDEH?K;.GSWl;V8+$F$p4%fQ\AGQo'N%;ZGDYr;_1rt.QKK1/][YIm?h(Ap<7M2e<MMe#'R!#iia%t>hqs$(%CNCReUqG\H#j/Gc+:F#&RqpT68TDJ\HH_]j3=3p"F'?C711bX!"bHDL3tf2Q8.L7aJZa;;'q7M'Qguoc/&]3Mf3a*C>&pNhkXnhaaY5d(KW;%EQE%F30?''s!=+ng]'FKAGJd)7gbFJ>Z4R0<]slLG;ueAGfj9TZII!ef0/)'LQ`$R_=iP?0mus+4N2CJlrXJF.6GN:h:[s:T.muN?#G95^l:lkU[kt"^ttk8XM+`eiXdLRH!1HAO*]#Zf3f#ANRlOGo8n[%C1kiZ^CO+AV;/Mba6GbVes+G]K[:G03om88oBD6b_:0E21+!8:_/,rFa:"cngo[lg8iG@rUeMgD3Toq3gq\1:^K0LH%]`k^m+k(8Dn'nEOCD4PFI0J$!Q_[.<3&1P6$Lc;*c;:V;en9@r6JA6sr[Z\qZabjc=n+2p5PhPX,GW?SFl&^0$[K*"2cL!hGVok:`iK#NRL*GNA8,(Z'K:01Z6-R9L@=EF[!_@C]5tMG8;p_,7[b+Eb$o2bd>f4u"<6gYnO=WHn?#g41O3KDile0n'YMZ"eg*g&_JRL6[]L_J--h'[#I#SF',4Cq=\X!D!.l]9R`o~>endstream endobj 46 0 obj << @@ -315,12 +315,12 @@ xref 0000006111 00000 n 0000006193 00000 n 0000007236 00000 n -0000010970 00000 n -0000014423 00000 n +0000010990 00000 n +0000014443 00000 n trailer << /ID -[<95139d8fc1ed2da3b56d4980d1b780a5><95139d8fc1ed2da3b56d4980d1b780a5>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 27 0 R @@ -328,5 +328,5 @@ trailer /Size 48 >> startxref -17346 +17366 %%EOF diff --git a/docs/ALPHA_SOAK.md b/docs/ALPHA_SOAK.md index 7ab2d44..dffc9fd 100644 --- a/docs/ALPHA_SOAK.md +++ b/docs/ALPHA_SOAK.md @@ -6,6 +6,10 @@ Manual QA on **two devices** on the same Wi‑Fi. Goal: stable show path without --- +--- + +--- + ## Table of contents diff --git a/docs/ALPHA_SOAK.pdf b/docs/ALPHA_SOAK.pdf index 5e4f4d9..cda0c43 100644 --- a/docs/ALPHA_SOAK.pdf +++ b/docs/ALPHA_SOAK.pdf @@ -92,7 +92,7 @@ endobj endobj 17 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Alpha soak checklist \(LAN demo\)) /Trapped /False >> endobj @@ -145,10 +145,10 @@ Gatn#?Z2Df'ZJu$.F)EaD4^b-L:sG;U/$WX9]7_Sj:\Ap!+r[GW\=>;1Kg3G;**)SZ31fqlgqa?a-V@3 endobj 27 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2525 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2547 >> stream -Gau0Fb?s#6(>eXaS7Ti[>t]VmYY)ITJLRF[K\K3Z_GQ*na7?Y);E"L.kK'hd&'']=I\ERGjl_,=)lD6Va7SHm-`!,D4,,h=9H1Y'cu?(KNR-Q;5"I/+e8Sg,!b1H`lV-;7$T,1cr!7qY/501Hho?j,GR)^4E>$MD%?b?1F8f,5>SSL&ir_G)=`R>T`SlS#7dYT1>\t$i5#pG=/.D;PZJZ-j_B&amZ]rcIZ"+0e,$E&F!WFV/YupNM_9F8\$WSJ47"L,*-ZEGh7N]R+otcIn.TBjh75,kWI]V5q$LeOfPUH1(]ZgCD\=&'Ui/9)nK@h6.Ms*G#5W_(&FkXB=I8BCD9*"e-Kict#4c[3O49OU\+(ABC&VLW?.Z5;D=6Ho^A=3t@h"Ds[5HTWX:.*8aQ,*R\GSaM51cT&Njgm^SEGW_EWXX"6j_=J8'\>c>7:Ggq\\4TH.4`\Mhr@"i;%[$Yeh/\f!160c-kBWYpD,s:',R?c23F?'LJ9rDYtUq/P('?gY9dMlZ3Hh^=ZY3FFWGqDY.._ej(1P/DO@fFhd/5rq5![...b]#.4]eYPUD4n4.F7Y#?m8EM'/.g\S7._`/6RK9!Ce*V4JbtsY_R)^T_1:rdXV+\L4QEr95V?r:LgM*+%&MaXa'8LOe&.l+KB`RKN9Om1s9cLbXK?YYg>aYm1Y\)?Xo-jgIdeWflg`6GDijMpp%UC,$9VckifF#]TK]F_k`-^Eno94rTMY6]N@dsgE][1%H=(J+DV.iF=kUXfCFqL=GUS-D6*%c^"@TlZB6PsZ7HQL#:,=[V+ItZW#j?@Zo@i:G/lM:ICK`s(5$&1hM*:ohef/[G;:K./Qh*DBCrW+Ih9j%~>endstream +Gau0F9m`A>(>e4US>D_0;C"GsXPDUq,h"SEA*8$qNIp7o'9'FDRV(%+5"B!7rkMp)H/-mMM'M7J?gg".J;GA2ruWcm5#'tqB**b'A.HO9Cm\JF+-VogT9.SsgG)sj0l?E-hf,ZjNR-Q;5"I/+e8Sg$"CgZblWg0f"e,67H%a"8(1f%Mmj!o+]S">`3/JE7#3o@.N;jRm:KJdA`s6pr>&[$cP/@g8)RYLNEj\3?q,DM:ZS:<5ahfi)'mg3`bX+K\bgZ]cKj)Pk!WNo+6nEVZE-!L;;&[VGV'$G!-K/bIE?Z,.P`V#i0/GW=n9i:&?AKT=1MooTe1cFl^1WT2'260BE*]fYQ=9X>E\&oGTkes<(nO*M2F5_<&O(qnChIEX6='@O/ARP5V^PGm<`<79h\7:OB>aH;l61qkb-csejPnrQ\TmkqPhc-aGe)MU*S7X5oa9bP'l:FOelF))QlH!k.j^q17a2Lb2,)=9p(ACjGg\"n15?(=M:Y,c*=o[T\Ke^=5eD4r:6+.=8Q&o9;EB.d;OrJZSEKmd\*Yk0HR#MU2D"gQgN:2.CitsC9F&`lDh>Z!`#bGt8C@E]$C5Ld'-t*=VItE;Brlr]W&alIcYumI.YO:QX'hQS`-]cDl+(_DiVklhAY`gZEfgD8q#Za>%E3GZ>4rO/NNGh>&[5Z9N$deQcFg2kahF'tA#KbWFDl/c%m2=2a_U6=$p?Dk(qja@fSs>?"XR(d?bMHk'dm:3Gd3Al.Tp=_E,m?#YM";LV:#C)$fe.95p=i&E03K:0'ICP:n/IpG.A?pQ=<(L?;g8DMgs''b""1Go!pN>gP_=@pBT[T3$dM5k0/\'?n.Nn[BZ29=[@rd)Cj?&Clq;T5DoqJKD?,aFaTJE7Y@(P+$*?C0,:45$.!la"6,><>q'<;PK=>"a>IQkMYZG`!7cdQjO8]^udKMr8jg*`JR"WllVs%)[?L!s4G$;>ARNQ^6N9$(_1,\7E/ia(2jM[Q7g`RaCk6<=)0RN`&]Pb@`/BZV!(X>u#qbU>Zf'M,Y:HG_50F`d1!'Hk3uKfeo>S6dh]>XR[=<4=-R(T31UTR)f^'G6JQSH>^6YRD*%E!h*qkC.Bd>F>BHRIEk6Jk&%n=lUd+>QKH9j;A!Bf!R4P(,mW1C@gB-V\X((\a".R/4^)UdKis^TSH]od\no>A?]47fh#gO)$R2rlWfq&J028rY0c;P7cs6IdjMKO$,La*Lj[b]pQgW[=XTq-90S9Y^@3o['pdPoHWbor?FY#0NsJjsP%Rh"a4[.V*!p7=4B9u3BDl:p_cBQ(uJhnEujqs&pEF`c72AJm#/CkS?_e8S-kO6DK*&"`XlSBYPJ*uGu"bcOus[\M3I,?sI,C]`_Ig\>[\eE'=Y*Pn)Rs@mDqbk5ftiP6lqFL!gY0J02Xm,%;BbQ&+,Bo8Gd?FE\.L5I_?1^hS.`8l*+!9hEl@ig-T:2OUb+'\'3uYgskkp#tJU^)l`3;=;W\.k$@\6Kf]L>p'a`6gT[\8HSLTMpK&1#&Us5)]8?OKIf/G_i]2Wqs'\0JSQJq[oY#G=q%(1f];"0B^B,IWSbD)gI#1F5M+@[UOB?CAhY6NP&A\Fd:16?40T[&>M2u)p'J/&,18[0GM=*M0RTAXJX)3-(I=!t0QFL(4UM>"gJs1Za\m/Q<~>endstream endobj xref 0 28 @@ -183,7 +183,7 @@ xref trailer << /ID -[<3cd389deb41e9e9df8a6a0feadd5b9c6><3cd389deb41e9e9df8a6a0feadd5b9c6>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 17 0 R @@ -191,5 +191,5 @@ trailer /Size 28 >> startxref -6593 +6615 %%EOF diff --git a/docs/AV_QUALITY_QA_SESSION.md b/docs/AV_QUALITY_QA_SESSION.md index 138365e..ed820d7 100644 --- a/docs/AV_QUALITY_QA_SESSION.md +++ b/docs/AV_QUALITY_QA_SESSION.md @@ -11,6 +11,10 @@ Research and recommendations for **movie cast** vs **video cast** quality enhanc --- +--- + +--- + ## Table of contents diff --git a/docs/AV_QUALITY_QA_SESSION.pdf b/docs/AV_QUALITY_QA_SESSION.pdf index 7c7392d..ec0dca5 100644 --- a/docs/AV_QUALITY_QA_SESSION.pdf +++ b/docs/AV_QUALITY_QA_SESSION.pdf @@ -214,7 +214,7 @@ endobj endobj 37 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (AV quality enhancement \204 Q&A session notes) /Trapped /False >> endobj @@ -349,10 +349,10 @@ Gatn&gMYb*&;KZF'Q^[$G.3E$*Sieidf9Q7-<[AM$5a%^M2p7[U-_aQrUq8S#:)c:0We`uQ=NSYE=P3G endobj 63 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4762 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4785 >> stream -Gau`W=``=W&q801^nW]j.0@0&2-]AlP@MdZ4LUEQWU^Ec64tY.'HV9W&,GVI%A';=.^QPE8o+iB"6f@BDMSoCI]3&!#mbgi,`?l2:e$ad6<-T'bA6\Go#8'S[$[h-P&>$?8drV%AAqI*4W&niBgmq0A/UI:=d#b%ar4DH&LpEldR*4G&spR5]HLq^4Q1JMCl'1D,j%i9"?^ene;M1sXJ;/q,g3s\7@(]5(.p29R+(T6\iRB.If`fDE567h)Ot1nciDF]/]YF4/kX)7)@"RGs\fia0JB9L"B,V#8A/u+Zme0oAe7%F]nkIW\H*c)5iia&L%kTCpBS!^P4ZWQG]M`/#9"4&YQqHV+5Yk*F,Y;1(&ma/e`@n?;cJ(";XSm_uJ+)8&^#8G5CKJTg[t6]:Es:gr\\QJ@jD/\AhgHSkV,I9P1Yhg"o?)6j?9,!o#>6#j=J[>TKpMAD3(_,IAB:d%1@CPQ9;Wl]rWrom2bb<[TLhhCc2J$T;GCij)+?\uXOK"QDQ9*UeM_TYpemO2iu'g$2fmDgEaqNr'B:8K,/5F)-IV)-".qHKJ;OBh%roJs9pH$tk#(8$76mmlqjP]H\?eA.4=JO'Wa@eL<KKiHV@oZkS$d&3\DmV)c8?DhB2m-=+XA;FYLnGk_1Gr'*QoBCf[J)JF!t]Y&4@"lPJ8W@R+g[/g#HlfCKn:]#as7BahdU3<6Rd0`Y#2!2,b"!'HMKlsQlq>_?c`Xr=g(lClp`,3ucrE4C3BLB$IiYF;:[WhT,qFj3a_$,)#u=^e1M=GSq/mj`**Em_q6FR(4sk*6dk!GELG6YqS)+[=$.*O)_tln7h'bRHS")CFlLQ9q15`\miq8Zq&WDmR,BWj'>N$[jt2q`N(GFMh7O'+nj[rXYRBZfbm(hciGlO@8E!^qtV]2A3P(L^d!*%NqU`"s=4$`!S\)08]'"U6pNnlhfPY>ButB&J\CfWtqp7K$%uOW<=F"XsjTPC#8q\$OXED9cfqHl3V#kGdY<4_UJsplA&u6mH;ibBbG%%]5K0P%Nd;?Dh"CR:rm'9pf&rTb@1V0"[!e#Y-]dg+em?6Iul>j!dD/eH53f]pJ8`#fUO4\fN"B%W7laW)=^=[/6oRO5T.D*[OS*H+7g0cj1S=Qp`+NotVT*13/h;(c3T/b%,p@)s7s"g7*NHZ.YWL=Rj[(DhnCtUI7=X[g$\?[Ke/BgHIN87=s/1@F*-(5*)Fg2l$ukd##9Z.`#=Z0$NKJ>l)NZMA][2Y0\j/h"@&Vr74-4jd"?HW5s'#\d""7A-3N$kSrrd+Y4XXMLnc0JZ$j([Fg.A\Y:B%PRlL7>P@9\E9&m.T\$@R916NX:s20)mn?<-*)<)0paL!6PmX?T?dkr-HT>'V_r:4rHTs9T0#SL]=qVU'tGe-(l[CA8hH5Z_IOXV]:b$]cM2fL"%>7A!-m"0n:;dXScRa"OM5qkVPk@D?m_apr`E89dPYt/;Bf]GKYc\gZ?>XMZUGl^$f@5,#c\@%/:U"G9C9>5VrL]cuI`cm&W4?5T>r9cLMs6<@[#sJ8c'e$Ju)6fJWbV5!j#`IHPs;Qho%4=Q40amS7/j@[Y,M`=0SY\u^s'#]K"ZSr8T37._l^-uhdLh'3\^GV7Ad'1o"C;qpo-F5_d8#GV%c3P95+M!+9C!Fi$i>i"9;>Mn=d/mFHrCG3oG,=%&NX`hbflmuW"i.\eS^lrC8qkTHniBbde=]*(FKO"kTj.D%d+4'MnJAO[2!UL1XJ2)7OHr)@g@_1"F$W2#BRP6Pe6hn1-VB7jXI0i](3X*aS)f(FT$;>$D;]q]/d9"T?:'&g>kWmMRrJl%.$oYT_IT$lOi`PYB8.jLTIhOQ?U!qo!<(\`qMS.(/1K4^SA2jTE$lhM34[G1=``2r"6$c&-W*)V6@ON2Qj7rCaM%SOf]OnS72\jc8W_G1G?b/*H$1JiYP0madO\n"r=Hl(K)>=e("O(eXER%R8Yn-&aer2jY;&q`WfnH+Ki,565CYd#O9dg_W%r;8f-#t7\HjkjYn!;4;C4J4K9JdK'lD\:Ifk$pLh"jYG:H*'\`alP1k!o+WdFJ%hBX@EN.fFY%f1[bU=aVF%4>=&0l0gnCC/QrA*;dNXI;DgXthjIJZ0V;'=0&.?@ZWH2XVIMd%,=T4)Y#1E)ile7/(V]XOs'Q2%*S!>mHiI?FcC=,+Smed,Xs9$dK;G")j02uNoiuE4oHDO!hPOZDZWY5"YYjbG9Tf/;1ONB0`AJ"hX+qK8_8:Zu:Go9T75qeDn2.+aW'S>#6RFi#[hh^5@rFEWIp3HX#jMW@&pY>_kMk)iC_Wf[0::p6=WDfX8':FA;6BX)b6raC08lC>Z@H^:1DKUZ#GjWIAg9o\TNXiNJN\Ot+.VnO[a.CGR+_t)tmNP3C_6ZF6SrV]>UY*qpQ5[kA%l28p$rt\Ma>=i@8qf?7\.CH0p(]*?Es@R2uPdfddt5QR(9.liS4$^!/G]#ibr#(*F;QUJpTWFP`T,bZSlq)LKQDPSON[7aO<>pGQjB([(@5k.GBnOWRq^9AF7X#>:0_J$+GI'op3;W7GpWXMM`WA6qIY5W]UI)hmlV]EJ'1c6\DQ:0:4\@Q$:j`Co0F?nc0N@]%5Qii)[#SOdWLk5@/"f0@^nA&;[`5hR7_C.VksX&5j?%r:,Sf80XI4J80iC5iZ:_-dr"0/qYMb;ThC^k/!&N'<^pkt#&R%2j_9iMBta]\ZYrL_YCR$EoeK$9-(-1^fT!_JH"A/ZJFplOK:j]#$scnu2+^gXG/>]b<]u4X=*MMQY\-hb\dTqSPl?$%9\]bI[@^f^b3&1cROM*KdSj2`#0c+1hL_^B/:'$L6K/;EQH4G\'pd."X4RcH,h4dF"GLO_o/a-2V%Pb_;[fPk+Irq37ddfj?$.HU"B5C!CusX-[4nC.lG?p5rXZbFLXE1=C4=!Ggr-,Xl2YSXXeWk%bl;F5%1=P5If<5(a_u\/FB^o0D;WAe:5q=9?(PCGl0k:qh`$osp2ZV/j\>OlK/Nuc3t'OK=I)G/L\KQ/9!nPRBP#6U\[7=/]f/cI.dd"Ard3Y!jN4pDe'So=8lE;M;4HaJBd"huGh>bIts'`40iQW`sK4ZiG%IJN>1JBGLNSdT\qqi0$mFhCQn!3n$,,:s&fu(8d#^WeY=0.^Rp=7(uYbeAL,"/u\'>ZC3;SW5Fo3ort=Tasr.hLMF?^]*["AjBP#7`,PNK1Jfu`L]sE.^TD+)Qb<)H@_eDZ~>endstream +Gau`W>BAQ/%Y!lMi1mnYA;RmD1V7_VVRN*AbpI=@Fs\lJ7,-M^ip,M[qp=5L!:"<%=*Mu\ag?mu$3UA@p]/YJOl8eBs#WCfYErf!:*Brjb;E-R8L)DonojiggC#="WTfRSl*k(LIp!nU1l(rTr*7cYjurXCO/m)>A7mPuMP*@LYJ:2rbsEHCQ>].@chq^o3=SidZ%D!f#HY[g(F5a!]DQ[p*0ga-ms26r.W^R:9VjA"jAGeddO`[h0T^SO%*YJk.+p@9$P&+"BB)q`gUO$fRPY<3Sm&_l&n&Poi!EOI$7n=uOekGpel@b:+rS2?,m"XeEFb)VlhX:#C3'7SZ"A=/P:XsAl3nS=#U9uT4?G*9k[2C3R>o17O.*K)oF_=g,hTZ/6H))cSU`V.L`@4Hg7#nJq6PN!g`-F$L9LZImJ%EQTp.^)C?]_C#r+36'nPB3)Lc9YbV/0p+(#;RYKY3nlo[6]93j3'.id>T]7A7jR@OF--C$$1e%Nl7)F_[>DVhX0Hg,g?^VcL(T.Qc;+"c'JdbI_hSip[3`@Y\<7.9,-3IONuch6+VIs8@(&HR]lFsmldk=VLQ7643r@^g!82B-fKD3Bg[iEB(D$f8]QaaFKA*3XI6$INX<"%RBk7(5t0t6CHW>QM9<-S1P&/u@Iu*:(LW&VhDrDSR,s!uV(-/XPSSG"cZMU?Vog5-Q2b&nF,f^P!r)>=%MrWrVIB2]q,S`i`AAFSilQd#3>XDo"i@e26Sp5SIAntg&O5M"+Y0%"7T7u!1Kkr^f)sQ%p5[I)N(\0VL^:_%j_U`Ch288iUS-6rj*!HlBW`aL>%X;Fi]`($([n$=f'^/Y`s-l+I8occXn83ad0skjqS`@#&#$<6#;A&+N)7l+0_r!ln7hFe.!672,*td1kA=^M/36hilo?MI'Yt+Wj'@$"o<*f(pG-8co#HU7RWaYpci^ic^kk$4MHP<+:d!0JV=+DD'X-0&0$p3*C*62%6tP(L_Y<1>nEM&U)\eDlZmlq='S^$_AnJDh#l5bdFdh7i;cf>=<\99%5Gfp4?*B8L-\LZDIWY:'[6.N0Ibc*F]5%%g)I27Hn:RIdZ."M"'1,;fm:m_/C`1b$NpZ`k:t?L"ji%8^AXW"BdTQbCF=DU2.crjdC"PAOp(?jal:cG7A@j/0DG3TODph7bh'2a@aRP>G;qFQ&4,Y?L9/SA2`Z?"aQkq@;fp1IBK)(">`N7_'*Rb.4#p>J_XU3mIq-(l+_9-#WpoNlo#`ui_V*CX[bG..qN.iuY<9NE:KnUqG"9@:P]a8l5b8>lgkb3Q$#'g'dH(t/Fp$0Rh9`*kjB>Yo>Lo(58_U:j1E`%!$;\[V16X$kg10bMjYb$fV8*Ge\RqEE"grD;BmQ1(e\9Wm#YnJi-bT.WR_FC0J+Ku3:D=^al"g>XlGLP@X?k`_j;2TNW\3j,L:=9,p`X#_87[MtdAOWFBZ`dT#bp7fso.9M<#QS(dr+!5ooU9AR?uj9\nI\hKLohi/%31=\_$9kWNlBfhWbPg6CUY^G*X.-?.6T/Xfp!-RS@iAr.*qV&&8lumA0$4)`:G>t\D^@*.#E?\eJii?RSTNjAcUqB90mLsATK#-1f!S5E8"Rb,kG7_i.=cj!7)AdrnjW,Y-/6L!ZWYZ"rXWHIs)!a)nQI%a,t7Wj"Y?%IV=NVBq<#8dmYkQL/pP8U#g9hWp6Bq.G;q7M=^k[d8]]D)MpW+)6:q?!k:SVVCGj@4p=R(?lE#`&(9MY]UNne8sZ/C9T+k4Ju05(+#3Pi4Hepi.$lLCHM8-W`(0H=(M6oeP[rLDX&ljPrI9=Are:hXr0BV83j-+()._`^nd]::=[JB&:3#r:(1\,2fiBb.KajJeUW!H%6K_[:ctF1""i9;5T,'U@2n>AN1n:]L`Ts93D>u*ji+J)a#t:)J[MOponlUbDbn/r9,u==!S$rA#sA?rbb&U.2Q.;Z&gEf19XoL.OghWj6bp$^`=mG'5NPdN*>;HdjfYKmlnJ_1h[0DM;P'3]HRm0G>"&9F??hW%&SqSO`P`$rp81>^>!RNoGQB-EK-^^&77V,SU:9MpVp/f3N@L8pAVTfSN#.F4Mt.3>_esg#>6l1LLJ/4lC$J&l3!@']M5l`-]kZG%gL78&A[XYJ'+ef;[4

'73:"'1[rNJ3O"*3N7)PUn5K.P+&r[IV)U6#,\QZ>m7!.#1g?bZ#mW?H#8qgtD<$[j\6*k\b]D8?"/oIPYN=D=V=G=F6Pa)3Sj;,RItQQVl]813fE^TQ@#%Dl8:QQ^d2"&Ll'_GMN]r9CE+A#.^h'`8_'c]Zf=._K=N892LOFq1u]K@(GbGJBBD5i'pocTH7cVRX?KM:rLn!m*BLZ1KUfNSmU05_P!-f0?HXh$VLR;go7[ddL&EM[2\?7\.C=m`s/*?Es@)'9&:fuk=,(F7cZm"7+^n]`s8#ibr#jrb@"ULW_g[,.D=bup-`Z;4LH/brtC-M/m.c1J8=hXVL:mKNaXQ1FQ/,Ugbg+p-nA\MtQ*?/?XYAst[Agq6e(',R*,BONqgTRsE_juo1dAO/AF@d'PQrNCc]WUHj3FQAS=b[15K*^$*)1.-m%tRIl/<>a8$=@:+5q:9\G0't[-hn'pc`T2[]p)6@CEE4V,;S2=(GSH$Y1?]7j:6iF"Fo^NrMoj]Og)/1.?1^tbOQ_0qTYCWA(p)d"I]lgbPq(2V3*\%35Q;FiJ;uZNc?K3=brX8'YVV(~>endstream endobj 64 0 obj << @@ -448,14 +448,14 @@ xref 0000008844 00000 n 0000008940 00000 n 0000010299 00000 n -0000015153 00000 n -0000019349 00000 n -0000022875 00000 n -0000026858 00000 n +0000015176 00000 n +0000019372 00000 n +0000022898 00000 n +0000026881 00000 n trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 37 0 R @@ -463,5 +463,5 @@ trailer /Size 68 >> startxref -29244 +29267 %%EOF diff --git a/docs/BUILD_DEPLOY.md b/docs/BUILD_DEPLOY.md index 2fb2ffb..b687211 100644 --- a/docs/BUILD_DEPLOY.md +++ b/docs/BUILD_DEPLOY.md @@ -4,15 +4,21 @@ --- +--- + +--- + ## Table of contents - [Shared authentication](#shared-authentication) - [Local stack](#local-stack) +- [Local developer rebuild](#local-developer-rebuild) - [Trigger a build](#trigger-a-build) - [Docker CI](#docker-ci) - [CircleCI](#circleci) - [Production notes](#production-notes) + - [Alpine BE (config.php paths)](#alpine-be-configphp-paths) **Documentation index:** [README.md](README.md) diff --git a/docs/BUILD_DEPLOY.pdf b/docs/BUILD_DEPLOY.pdf index 8134d0b..01540f6 100644 --- a/docs/BUILD_DEPLOY.pdf +++ b/docs/BUILD_DEPLOY.pdf @@ -2,7 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 11 0 R /F4 13 0 R /F5 14 0 R +/F1 2 0 R /F2 3 0 R /F3 12 0 R /F4 14 0 R /F5 15 0 R >> endobj 2 0 obj @@ -17,47 +17,52 @@ endobj endobj 4 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 716.2874 123.509 727.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 716.2874 123.509 727.2874 ] /Subtype /Link /Type /Annot >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 705.2874 85.70104 716.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 705.2874 85.70104 716.2874 ] /Subtype /Link /Type /Annot >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 694.2874 96.81304 705.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 694.2874 128.389 705.2874 ] /Subtype /Link /Type /Annot >> endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 683.2874 81.24504 694.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 683.2874 96.81304 694.2874 ] /Subtype /Link /Type /Annot >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 672.2874 74.12504 683.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 672.2874 81.24504 683.2874 ] /Subtype /Link /Type /Annot >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 661.2874 105.717 672.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 661.2874 74.12504 672.2874 ] /Subtype /Link /Type /Annot >> endobj 10 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 59.68504 650.8499 154.7325 660.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 650.2874 105.717 661.2874 ] /Subtype /Link /Type /Annot >> endobj 11 0 obj << -/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 59.68504 639.8499 154.7325 649.8499 ] /Subtype /Link /Type /Annot >> endobj 12 0 obj << -/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R ] /Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources << +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +13 0 obj +<< +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R ] /Contents 30 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 29 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -65,19 +70,19 @@ endobj >> /Type /Page >> endobj -13 0 obj +14 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj -14 0 obj +15 0 obj << /BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font >> endobj -15 0 obj +16 0 obj << -/Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources << +/Contents 31 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 29 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -85,79 +90,101 @@ endobj /Type /Page >> endobj -16 0 obj -<< -/Outlines 18 0 R /PageMode /UseNone /Pages 26 0 R /Type /Catalog ->> -endobj 17 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Android Cast build ecosystem) /Trapped /False +/Contents 32 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 29 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 18 0 obj << -/Count 8 /First 19 0 R /Last 24 0 R /Type /Outlines +/Outlines 20 0 R /PageMode /UseNone /Pages 29 0 R /Type /Catalog >> endobj 19 0 obj << -/Dest [ 15 0 R /Fit ] /Next 20 0 R /Parent 18 0 R /Title (Shared authentication) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (Android Cast build ecosystem) /Trapped /False >> endobj 20 0 obj << -/Dest [ 15 0 R /Fit ] /Next 21 0 R /Parent 18 0 R /Prev 19 0 R /Title (Local stack) +/Count 9 /First 21 0 R /Last 27 0 R /Type /Outlines >> endobj 21 0 obj << -/Dest [ 15 0 R /Fit ] /Next 22 0 R /Parent 18 0 R /Prev 20 0 R /Title (Trigger a build) +/Dest [ 16 0 R /Fit ] /Next 22 0 R /Parent 20 0 R /Title (Shared authentication) >> endobj 22 0 obj << -/Dest [ 15 0 R /Fit ] /Next 23 0 R /Parent 18 0 R /Prev 21 0 R /Title (Docker CI) +/Dest [ 16 0 R /Fit ] /Next 23 0 R /Parent 20 0 R /Prev 21 0 R /Title (Local stack) >> endobj 23 0 obj << -/Dest [ 15 0 R /Fit ] /Next 24 0 R /Parent 18 0 R /Prev 22 0 R /Title (CircleCI) +/Dest [ 16 0 R /Fit ] /Next 24 0 R /Parent 20 0 R /Prev 22 0 R /Title (Local developer rebuild) >> endobj 24 0 obj << -/Count 1 /Dest [ 15 0 R /Fit ] /First 25 0 R /Last 25 0 R /Parent 18 0 R /Prev 23 0 R - /Title (Production notes) +/Dest [ 16 0 R /Fit ] /Next 25 0 R /Parent 20 0 R /Prev 23 0 R /Title (Trigger a build) >> endobj 25 0 obj << -/Dest [ 15 0 R /Fit ] /Parent 24 0 R /Title (Alpine BE \(config.php paths\)) +/Dest [ 16 0 R /Fit ] /Next 26 0 R /Parent 20 0 R /Prev 24 0 R /Title (Docker CI) >> endobj 26 0 obj << -/Count 2 /Kids [ 12 0 R 15 0 R ] /Type /Pages +/Dest [ 16 0 R /Fit ] /Next 27 0 R /Parent 20 0 R /Prev 25 0 R /Title (CircleCI) >> endobj 27 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 605 +/Count 1 /Dest [ 16 0 R /Fit ] /First 28 0 R /Last 28 0 R /Parent 20 0 R /Prev 26 0 R + /Title (Production notes) >> -stream -Gatn#?#/1K'Sc)J/'_]eR&2*2rn(NJ"bj`Il=[jemOuP*)':L^03"TDl1s:G\Je\TD>7KRNnVG;[gdD8I'KZG-3rgT6Tucda?c3C?KX.D,iV6k:b5Lte*!\W-fQ8+46%.]h7]2nE9?Kk7X$f_ak+XV1&pm"CoV-GIn5BSYWUZ5S1ifF/Ee0&dUSa4--]jI*uYT3$-K\B\&%eMN,/B<5(Cj+he.UhqJ@gTY!?kl*SEp(?u4T8JFZ>NbcR$;p`S,`s4jthQf==VXB+&+4D`^mm//H9I[3.%C)t^^Ri^(h.cG+3$uFiCB?mDg;)S']'2nh@5N]8@6A$mZQ`]25po%en#uT_E0=[jIr,E>k6.CahU&Y)8^k8Y>Gq,6e%Q"[N+Lr?+j7m4CCcKWXhhBKR*=KDd?!",#dk*![pendstream endobj 28 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2887 +/Dest [ 16 0 R /Fit ] /Parent 27 0 R /Title (Alpine BE \(config.php paths\)) +>> +endobj +29 0 obj +<< +/Count 3 /Kids [ 13 0 R 16 0 R 17 0 R ] /Type /Pages +>> +endobj +30 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 622 >> stream -Gb"/)>Ar9=&UsJXR"lGR!fNE,:%B_?pm/pZdjVZQ;kPTKMHi`3.5&r0Z=4OHn"&R''Ldll-(hi@33bm>D=7#?Cin%n8'cX297X&tW#p-.$&iMiRu.O4Hak)grH>($1JLNI#F8tR1UImkR1?A]qmq-+Tbrfen!TgtQ=63K'@ZlLl?;@D':Q"L$6I0^2aJ*)ZJiPBq^jS4.ChS+CoF!T[S@O;Og1uNn]Un7,dL7+2GBpo7R]N+=:+H!;SVel<-2dFba`mrVV@bOs>oa^0LgT2Y,=uA_9Z@;-MIQHk77^*aesc*)$)bA'Y10fM*0;$1G8"(?)84a/U*SS-?Xi-L"IQflu_XH[%eG4-GA;$0@8EN-CA3Z$UQ@TaY?)cC=V%g#[d3Es:7R-%!in+NaJ=H5ln7p/+ETX&&b7Xqqk(dk/M%?Ao)nW\':l=/D)Ho9lSHAP-BnKQh0r87&%pG6AG*7N?0rqZ&m1Q9]H,![b>+U=W+Gg$B!l?dC6[C2K)RB_)XN38EHHn#=SJlW*FW>NFKaoMDm"u%#t#4P1o&2KJ:(*o+T3=0'I&tA:@MISa8g"NkhS`^[OL+3jCOlsm*=37ne4G"[W(3pUDJK)9<=n!6C$k,]KW]]P@5lr]W)#,dp]Pc_DDS'Xtk1O1Vo>\_J8>XRFkkHi9V(9b9(^C[U7@8!>'uE7)d".S5=n"d=$j^[m.ckh1+S`f:A0g7SpjbAa."4TiY]Nf^JOrDRBGSgUFqCmO"2F5&&*B%mqO-QWZ6hb9,u3PP6qL$$L#85=[5_B]1;g1akiYg/C&9m4Lj?R'?SOAN%(CB=rq,*oQOe;,2cif4*cE/"=0k(egZOVM+!6"2no3&[1ZN;^?Npjs?>?N%fWI(WD>YK-chGY)6d0EbIQO([CsMkJ#X+)c[.'=V,F?"o4u4a;#1Y!5c3.A817f"\X;@f/'\0+$aBk-B49+ZC8#qEU!_cgeo`pNV?#]GFL\m]pTgpUSZfEL/kUl#'8CR?#&H%*N&#!W/,DotBUD5q],1YfhNeSH2!QWOg5+Sk=+:=b%U+"sbYWr==dQkI!"n.gp*"Nu^>AN9\&8W3T?p7(I>Y.hKZgaG_SolW,VNCL4eL$T<@G6D,%)LZW%:jL,R?r,/f$1YJ\"D!YUU8JOt39B,6lVBOCAutSO4C81^kS0X'u*cP4QoN]nICo2!dO;U1!.`dkm:UW['Nr`t[Q-7D0EUH\20DR^te@2;&rW1DY]OKPV.jL%8VEcn3`?Rn)1Vf$L<*r7.$`mX]=aiH$SoD)um-O2O\B=A#UoC`ci,cj#c8BMlF,p!S+e?,??fpANeW^!5j?Jk+Hca;R\qaf5bk^@\f).QhVon&])FHV)(@7MF,Zl?E-rDmV>+3OI.XBh>bLIG%jJ'j?;pidc-s3lNmXYl=_EguBFHQhe92.SCgX6)l?6L^sb*1`uNP"](PhCX"YL)h[`L2YV*ll'-dha*F.V@At.0,'NcW&;/p4M%u"=HiL%AD[r@gi2Qh*1AHcI9=<1cMWro[IGH,de;FWc!^f:J8@,aD'm7rS=^ZGKG*'sme]%9(Qc]$KOmU(7&h.nkmAsK?TSEN6<[8TG@c96KkMMq5;!ME\:.d)S[k_9\(5o6eKUr\-*M4FiR`Qj4l\Zb_,@MnKa1n5X"/Um1i36Op'Pobk.+lS#:??+I!EHkJ_2iJJ!=WP"@MJjEq@C_]6g2fnPR20G^nnjk+[Gm9XLr/d1b2EQWnCULd-i2Pj!I"+D\+1jspBXPV]b>!"gT?Pt6eo@<#tWU?eR]i4ehl^ERd,gSeb+6j.Z1O<^QuW]&hiSFS"lY8Y*+sn*rQ[-7!=Rr1m$>,doR-TqB&2!Rt2cAj0b_17B@TeA^,'BK=F\i[WHDC[0sKaD*D0XTtK?"(0_eEpQi'QN?(i2gX@poa._hH"VXIRG=:iT?ZWXo@uf-B^K/Y7h-[4!K@.0^?ZX?jN3JQJHn,#/>9,^jp9rB>P?Q^S\kWsgQ;M/TKY]p4>=[Kpkt]E%ddl'%3:p\lcF.^Dq,f5R9,I.7C`PhA+U9pYmp^ENdZXE8P2f[;_6t;^JZ\-'r7ZVsDJ^`M%Gj'pAF=&"oOnkJ0nK*!T]qp8B:tbNrr*nM"neGjLo=H=@Yaq6?4QW(4s?D&!1Tgld4i\\5/I#6!@,aRJ\:bJ`"^Q&2/H(#V-+[`*03TtC"g,5i1e95OVc/5bsXQj=X1*VKAl1scRQKN~>endstream +Gatn#?#/1K'Sc)J/)JHk0\&\%r3UL1JIU1mT?".:6h&m(mOG]].)kk<5TK"q'X.T%*7K$!@mJA*JRDn;]DteC1!`Vs\'@](0BU"<_>GSNU)5Eo4:):*4`Kkc,:5agFU/HiHN`MY!!NDpLrXBsbqZl1F/-nuj/fY5fTfGH-$B*k[;(&BoK1J3q"X"jVte5jF.+7,nZ"$#8j^DZrD_6YiZLj?@i'j.Ik\o^B(Qk6YIF,FrFEL,J,[Hrq2<]d,XfRq*-DnW$[auNoFI.uA"*RZ&^o%&li~>endstream +endobj +31 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2951 +>> +stream +Gb"/)>BAfF'n5n\3"O[l]J6uBKK#/GCsO]na`qVKPH'^b2,XOF'l%TpAF*%P^ZVsV+ERX8GOr3%YlXObgs:1>UP":cHMZ6!!F/>aIB/!<^gmqdV-#F^Kf>4%?dA:kVDV1dB:rB]*8-4C=[QGi3H1`J-q\;XuR(e.P>,g]0Fa]hcqIVi))[$#9c[OCo,6s'[>,4?k:Kp8W)XIk.h,=*80&m!t1egiqm4>3Mk)7I2_0p=apjI/=^3rq42IMo0fr/&[$(:UsC+@\2^;23tdK>J=5?tRQh(T;Wf'H>DrW``B>1pEu>$=T]/(T0E.nji9'd:r(+XF,RYmpVQg>=CK:Y\HAg@(fPK3Ad>_/PF2r0jm_I0pRCQ\Pn9[/CKn.Z#@7KH=d?k7S@k7\"n)DS1`0FL399iKjQ6ft]f5+U:48n;n,njlb@C@r4<21o#=8N38uXr)=)4">()@Vd]WjPm6`-0nA5e1k;4(!Q,ac6C&m553*u:BhN:9:fk#de"3[Y)q.nQTk^N/_CP34-LmA,XhP.X%tTEe`BQW)QQch:"IOa+jIs`@*8_S%6iu7u3TF*Q=**+r2eJX&f"7kTSB4`6T8&@:o-@'bQXCdEOG'!>1Ff2QaIiVIVfVl@3=H2[J[U]qd=C.2GEJ#TVr.Xm1o0m^EP[ONmLk_FPgS8nLis?6V8F91Ws<^f@JrmmiNOdq<[LT'$)441c%P!#k\>+G.V3:FgAc`0<85GjVE:]FoG'_L_/NU)mSElY1qruD^:ARfqXEYH^D6&:[=/&1pu12dkPLb&RQ5#]rA%2_pf(DH_0-'Dh8]IJYqlK*\m1Hj67QqZAdi-;H3g5qb&9q91O'12Ctj,7YlBr@D,HK&E%!o$C"Hhn^Pni]6X)BLjKrbbIoY*`G(`EjSmcjm5bcSPhuddGNW@]pCV"?D;KjAUB,7)rKF+aQul3@dEk"D"[6\QK?o`9&0C^iil88+Z!PjTU3>,6i[<)LQ4%#/C%)@f5(o]5d85tsg0h96F)Emb1uu1:3r.rkdcG'FWG%rOW*,7Vj!eqeeYj.!q*t,bpF3C8`HsUK'&e[LWu?4]-n-*d*qt,#)d!p#.Tek/_6['"rcZNFn/>79sll"`t3?E>"!_\0ODf'unUie57k2+RD:,eDrQQr&Z?Q8:*<.EFm=jEYb[%^$%,:,$8E?l$6GZ'YJ@NPjCtY[Y4UREe[dk5I.r0'_mP4%9V'$c8P3)i.kDj"@8/o0Eh/'7^&n._hu)em8Rd<%SsO<^S@-."XD5?3\16Q2o*$\?*C$V-:P8_%N?e.+cPn=FMBMnbOenX2[u%G#cdkD[$s]0-)7,XG9G6eZ=:LgZCWeFI?%-n=1d^.:mj4!#552n2FAVX#19g@d5ac"RH:#<:WPtri^\Q_?P*iKg.<+V)5VFp,Z>P=*Y>;'d!i6/]n"1bB]+X[6`mFOd@MYIEgK2*Hl#tndo47EkS,cM+\!+ql*b,7-V3-i1%>@%aFYV=#VbZOC]Topq$ZD\"*;KGoVdgJ@_BOPZFH$?;!iEOEL$^tlD40@lm7^#]t\/4j";O\gOdouhnrZ)587]`UBJcaWXgJZiWH?X3g3sLP%.dP#5anQT>q+CWapn?NK*QM='KK0[AUM`#]ML*@W\3kKN(3VcBC.jJkcj3:IOVJj<$2Q%-*j-D$nh-1YBH"raYWVA8j8Ka8p!0XEYD_^l#clo7Wa`@PZ;dQ[*`d0)Ytsq.GZB?:U>4Q(*.3_=T:r[g>H=`K`(RQ.WqX@L`GuQCS)h>mG]hrYdnB1/r@1a%sTp@)uZW\OK?aKHdOLITEAW2oh#s17Fh(u#7tl1X-'3fWK:@lXcTsNbEYN8RN.u3QSPMtRR;:,ctrF=_qMfaLmm,kMBl_g,s.Wn*rrEIWReCa.a1Zse%hheQ5?$+5@-YtRKZ?r=OTsi+FAYgV!A`IFKIPXFP$0>2\7V>nG*]Z#sfDc-`7HC?"?rR_9,KKEb`75"8C^PRGPsFBb"1,lOGJ)A.Jc`r[W6g882$2,M=C$@s/1R\@MPk=fCe#hpr*a\=ZX#_#2n\lD&1]6X6-<6$lR0'g$ag&D%8[(pA~>endstream +endobj +32 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1101 +>> +stream +Gau0A8T3?C'YaHG]ZV!a&5gq0kLK]?0qE;g*K:uE7)_bD;'kHd^!(C:P*4poQB@n,+kRLdrk>k_"0t(:q_'Ui^1;ocOd/C;d",N[8f]O10#_:?:P_$%tYgE7FT*!1]%qae6/hsXj(OA";ZZ`;*'OR%q5H^[TomA+Nl&]Xj3_a#@b"QA"7W:<"6=3ed^tk--<$]Yk\UK%nl*Anh[B0K@gam]Y1B"-VJT)FV00)K&HAGAs057[VL?n>sJ5hkXsinB=X+7,$':P1+*EXF:OO^2$rqf-9BXpFD'6"K5r8>41Yo3[2$UR@RFJ,6r"g9'&,3]kO"Z@]LYPD^QtCUN&O-s=tBt-Q^TC%-k1S>ldlbIdog-]0VD4;l"V^'S.i/5F4r?$.#E"/P2\'`D,Yl_PRrIT=2qQVD5r?J2K66O.M."foJmS3]aIVY5[,;"oi2<@8j3e\[=rCn.FnGiFn$GN(Qk5)VQ5KH$U;M93'XiZ=5D5rt!D`;*(fJ)j":X:3m(6_CNNk^B0ugHIl.W*CAnqAu)Y`:u:'A72Io-&\0m4KU`jk!8PWcpm(1$IZpe/?s:S\8>l_*E;^<4Hc@.XEmFIQ%HL`^5H%EG`4KmLP[0K![[ilCh#]+g3EE#24RNg/`;&*_Uk>F$A1H6^B;I_Y===-@rseX'@%p]=]/I.`niZX",-4R/IP^Ed+)~>endstream endobj xref -0 29 +0 33 0000000000 65535 f 0000000061 00000 n 0000000135 00000 n @@ -165,38 +192,42 @@ xref 0000000354 00000 n 0000000501 00000 n 0000000649 00000 n -0000000797 00000 n -0000000945 00000 n -0000001093 00000 n +0000000796 00000 n +0000000944 00000 n +0000001092 00000 n 0000001240 00000 n -0000001389 00000 n -0000001505 00000 n -0000001766 00000 n -0000001872 00000 n -0000001950 00000 n -0000002156 00000 n -0000002243 00000 n -0000002546 00000 n -0000002620 00000 n -0000002723 00000 n -0000002829 00000 n -0000002939 00000 n -0000003043 00000 n -0000003146 00000 n -0000003283 00000 n -0000003382 00000 n -0000003450 00000 n -0000004146 00000 n +0000001388 00000 n +0000001537 00000 n +0000001653 00000 n +0000001921 00000 n +0000002027 00000 n +0000002105 00000 n +0000002311 00000 n +0000002517 00000 n +0000002604 00000 n +0000002907 00000 n +0000002981 00000 n +0000003084 00000 n +0000003190 00000 n +0000003308 00000 n +0000003418 00000 n +0000003522 00000 n +0000003625 00000 n +0000003762 00000 n +0000003861 00000 n +0000003936 00000 n +0000004649 00000 n +0000007692 00000 n trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) -/Info 17 0 R -/Root 16 0 R -/Size 29 +/Info 19 0 R +/Root 18 0 R +/Size 33 >> startxref -7125 +8885 %%EOF diff --git a/docs/COMMERCIAL.md b/docs/COMMERCIAL.md index 28f0ecc..8fce82c 100644 --- a/docs/COMMERCIAL.md +++ b/docs/COMMERCIAL.md @@ -6,6 +6,10 @@ Ads, in-app purchases, and Play Store helpers are **disabled for normal users**. --- +--- + +--- + ## Table of contents diff --git a/docs/COMMERCIAL.pdf b/docs/COMMERCIAL.pdf index 417c468..154340f 100644 --- a/docs/COMMERCIAL.pdf +++ b/docs/COMMERCIAL.pdf @@ -67,7 +67,7 @@ endobj endobj 12 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Commercial features \(developer-gated\)) /Trapped /False >> endobj @@ -105,10 +105,10 @@ Gatn"?#Q2d'Sc)J/)JHk;EZ*@CtRR42U\C#qsn<9(cWrp?tPr&n'A3b> stream -Gatm:D,]IS%0#*jToWbF9]E^m\"?9q"SkZXXWWor\tkSnE!r7_oTG%0b05.hsm?0\RWR)Dk4O6I%Co`-38k9FPccg:33VrmV==$'G^K<*f6E75Fei/!M,3BJP\Ud&J6\#dsYj?6.In2]BF1VUGTGD2G`AU#UZj[6mf$0SpJrm%p;Y$p\6GqEBjUE`AG&a>_eloo:SF>@%C".t^FXZc3s"g[Y((22G/^;Q#->U6^iqc.^[!)p*VUDJZAPmYXe@0IMcMSV^N"G>fh]rfE?rHp^=]M#1.>(j"1`]"pV0!sqL=B%$B.3iPIO\LA=%YrL^(6F20T'bu,8*?R;C"JP<0uqZcfZ[H2fO;Yrst`jbmpM%(%b@f`[XP6qAJ':KdBocjb8e@alQT;JoLba6fl-7P/sh1M'un;r]Sdo(@1`Y-pEJUK>C!>o;+)7nLu"+[Ps@ID).&h_9.J:,_shu'Uh5m^4F[RZH)ZGq"pgV"uL9^)qsbmRi_:+9gr=W.t?JL_L8\oo6pA>od\RTfWPK^YH`YZC'0m+Z%8rj""C=VJZEgDdU_biMf::r>lBTe(dQ[^,6:KEb0r:HE0mKW6q7@FfW.9XT+Sio]A''C`s@iQn6bY1MLrJ'%THBhK%`j?J=7b-pI$0(Oendstream +Gatm:=`^>t&:XAWkXT9k;*`nu:QBL\G;iNn`-HFSPQJ.m)1bo*3Teq3$OjkifM6UI`#NObnYuEO2Sm2P/:YPSi*loRf-Zk!Ad^;0@`.OS\=*m+*LId;gEE`g(cHW1:CJbXE??gn7^LKR=tklN1l.p9CPBLRB9ZK+K]+?%rrA1OYr%/VSV8S[F8Wn<#c!`VL=]2=*'t+hdtmZ&:h"^)fe;7f`3C;/O+9kc_smC+=N#F>4XM_d&a1::WK3=ml;23jhEKIK(^m`V8tPcDip,#J*H3%&AW.Hi[2]R1'tB"]"7[?LfI#l),e2)Td*$r9PIb^f.>D!1pjt!g[1RDkQ3]NTM3(W+%GgnnPND/b[&"S@m5&$K%0`pd)Z$UI/9$1j_A]Il>cEIc;%Vsi_ttnqHP*%h-*H3U7eP;@_8E"B\\2;3I=EfVH\=\+b@%&[[B=]hp#eaWQ0%]$?Vkg$\".r26kk5EnVcRQIG:"q/re;$'TJC#,*=Q)Q_qJI!LOBra[3^>1;`[3R!aTbFK6IF=pg?8q8oD/k[/Ti5O"0C!c%a"Hl>12N"T1<7o:2*,f.sUiC57Id>DfpKZ#""?_IqGrSJ-n#B*-W6YB"Z+j5f4BuXYfNqYj08L.J&5U6M?AgP>9`oFu17T-8L*)F**p!Qr?^hJ32)1N:s)+N)s%blKls,R3NWFn:>FROE4"71K_20$TRr./c!m`U6mDDfL]XTa*Q(Qdp)pD7U(-9ZhQ*5#u[IZOdH$R^6IonXO-;J[a0PVW'$go8G%?cf`2?osTU._l_ZNXhG>VFi=a&d#"9).U%USo=2&[BJtZq(bh/h3("*6kS/J1m'I-BfcX@ZGGcHELTr7B(o_O=LR8h88tX'TI[tA$X2V@I3TU)0mcnudE;OY!*T-mEg/*A0*d(sG8\H&pq@8]^bcYhcUPeDU=X"V@q2q"GmQrD`-#J+(l"i8eg%JP_/(B5^/;mnqXXl[@+jXrc8It2g:c2j#b_?maBdTERp^4!`!cP!J2abMNaXY:6Z,!?M/ACZpp?B9jO$,n3Mg%FWPDUCh5NR.EnFqb#_"S6LJ,7$2Dendstream endobj xref 0 20 @@ -135,7 +135,7 @@ xref trailer << /ID -[] +[<163c9256d990211d309e76dd07e8f034><163c9256d990211d309e76dd07e8f034>] % ReportLab generated PDF document -- digest (opensource) /Info 12 0 R @@ -143,5 +143,5 @@ trailer /Size 20 >> startxref -4435 +4450 %%EOF diff --git a/docs/CRASH_REPORTER.md b/docs/CRASH_REPORTER.md index 20429bf..44c6d88 100644 --- a/docs/CRASH_REPORTER.md +++ b/docs/CRASH_REPORTER.md @@ -4,6 +4,10 @@ --- +--- + +--- + ## Table of contents diff --git a/docs/CRASH_REPORTER.pdf b/docs/CRASH_REPORTER.pdf index a816187..266d4fb 100644 --- a/docs/CRASH_REPORTER.pdf +++ b/docs/CRASH_REPORTER.pdf @@ -72,7 +72,7 @@ endobj endobj 13 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Anonymous crash reporter) /Trapped /False >> endobj @@ -110,10 +110,10 @@ Gatn!6#Y4+*6%CF'^o.c0`Kh3Sa=pe5eql.YQmPIdAA@p> stream -Gatm94gc\d\?cu=Y;!n]SNjj4,H;lls.i+SXG`D3rU&N^J4duD@W3J"rIL*9/'&aK_ZFoT=99XN*Of<[,/UH:$<+7)UZenmV@6S(?fMh^2@0eco%k>RIpX4i$e*$Kt\EpG7=Z:!>$IRl[0i.o.jP#6*-_Bk,ntQpD2me0Rk<7pg.H_F>^bS#%E*UQ8E+8o(,KYc/@C&_W^_;ZQd*((>BALit.'o@<"EPfCFpgK.IqdSpqP5?;F]BUh=9^iOo.5<^Z:&&p/sj:Fe-6*/qRrkf@8p$CG]o3'jgUkcD">`:`Vj0$F(q:e(34?U-VrUFA/`3K"MLV2\m4/N#\$nR3b`^Kl:":r8hW_aj"4RU?h(N8Q%(rheoCG0N"n..TNV55IsbJic#mjc7`:"`pOi:HSd'$$jC28VoQG_o*Tq0#6M-T=V+WW)-+Q>Y-ptb>>F.#ZL-mQ/Hu1riX14KNfTa6`aEVaW:.3*A9u1E+AuIP4E+g:3J[W;rNFA?OJ2+$gcYD;0Z#+!g@?]BU"A(SDN,r=BmFi.$3_!`-^[65caQfi2F;;(0i7`*nfEA,a0p&0d`!Ll,#m:/4onP*4(\"i(f/K>cAZ2Prp%7NOGKXhaGB^65\3=$6=M1YAt-i^fC(,=?b]-"jRa'o*hK+/'T]Sit3&s9Jh]@02KR-[fIEdaK(;*=,cQMPKsKjrRuloJ)TQruenHN(jQ6k)R%5E3=9;P?PFkZi7`%>ib[M;t20A1kIO@1O.nRe^@qk99r_fm2i#jXrQrrHj9<-,,+'HN!]nh6Mc*JJV)(+4C)bENSp['LJea&#l=)76?3'$-Vbo#t:WjmpSO_dTYop%n.Hs"/+2<<8^Z&p1?1S3$C3l$F4,]A;,!n52Z4W\34ML-_6YpK^q"46sFK>Z62>6R7nnKGJ8@*h9=2QrpL8^%YkZIqr.i^F/G;YC=d7W5W<.D)/e/Md/1+Y-(_201,+-\M.6`,\"[dF\I7(O>5#B+UbPIHE.W)EWW,.LMoU1NU`.":F8otb$6ROoFj_;mtWC;k3%Bo_L//*`R!cj/Z^#J_dNkCBoPnPbd%ENoY#_I>(;i"Of2<5:F?PFkHKIAk[X^de,gd\Kp,J\I)m%OYH:0hS.OtST1LTYW[^k?GJFJIm#&Djl2%N^XmHj=Cn74MMbTor`gOV^&'*/;`bj#T%a%^aamI6?H.e7:?TQt.R!hOprOVG+CA*q-.X7[,>3sn4U/lEeC%Bqg'j'[`'FoIa,*/_d2eHeR7hgM!2_RX'Cn/lK%u4J1f`~>endstream +GatmU8MuJ'9\WeZ8,0ECB,RV)gF#c%'Al^s+po>52H4ds))%8^mTGoRhJ8Pr,AmaJBf)+.L91d;RcH+Qf(lfVGB\!ahotE?mR)BtZq?[1^fVWMn$]KgNW+i"?!YuY6c3Y/mYo!2g_s$`@^q(#^#Rj'i3;?kqc\l74"0mOYPkuX7r(ED?_X*6biHpIlI7VR/)i14s&mLgP2>R'E!-`O$B!4L+rhRT-3;51;@m[e3ac"YkdXhkOliZ%0V#)>s7d^YB^5Q',DirOH>ua81!Q#h?8"M]cQp^lohNU2Vh-,`MU$?^>W&nE8rRpYClPUF8jY@iFs-j8G33$o"n6!Ld$i8.d+hhgNt\H%&=ml=If#5nR?N/E;lTsk[qdncm/o"O$85UFOuP*LT%=uFRp64F-lJL5d7ngB5F'fMMJ=%GQO-<#e1]55-#hVPS1H);U9SKW=L3mJ.gT]I?BRq==9VfiPjafYYg[*PMBK)!=tq2$^b+qQL"A1-0UZg87_Q%O8FOq)J(+9Bc+Fc)0B._,cTMs-^oN3@2,N*c.>iJIFu>Eg*Ws19(hOYWlfKGi@N)5";E.Z,U-&`lkt=StARVL(prbot\VfF^Lf^eRS8SHkQ+p@Dq'#G0C,YT9D+'I/!Q`>\aPpfA46fj#%4YP1K5#abDq?:JmX[:`p!O]M(C9Bpp&^<)nhblae]8BBtTbfeL4K^mM:(ap+E=XD+g'5U4`V$e:;>U=I>K`HJ0=OY+t4$".6kgh>b':2F'^\7+._N"?E`#aunB6W)gpB!"<]\cTT0?2>*]PV^`Zt:95"b$:<eOsh:,.Q7ORLn<6CK1fYeVF$5+g_K,8a3[^*sGRQKrPm20r-n6Z`I8a<`F&XRc.qgTt.aOC07V8^=?a'iHo8ipIFsY]W'p2Mmq=/Q@Cqq09'Xh$S)FDkJ.K8J(au$N.2prA7Q*#>DMM,h&edjO3R*s7*fG(:EeL0$ejQdmHCtO/9`5aX9P:,(@]Xf!>!Pn!^o!GKrNo%oC9D`"c>L/.eh5p=F5[+_toendstream endobj xref 0 21 @@ -141,7 +141,7 @@ xref trailer << /ID -[<1a0c37f5f70803a73095c49ce8a7e42e><1a0c37f5f70803a73095c49ce8a7e42e>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 13 0 R @@ -149,5 +149,5 @@ trailer /Size 21 >> startxref -4948 +4968 %%EOF diff --git a/docs/DRs/20100611_3_url_shortener.md b/docs/DRs/20100611_3_url_shortener.md new file mode 100644 index 0000000..f254509 --- /dev/null +++ b/docs/DRs/20100611_3_url_shortener.md @@ -0,0 +1,357 @@ +# URL shortener service — design review (DR) + +**Document type:** DR (Design Review) +**Source draft:** [docs/drafts/20100611_3_url_shortener.txt](../drafts/20100611_3_url_shortener.txt) +**Specification:** [docs/specs/20100611_3_url_shortener.md](../specs/20100611_3_url_shortener.md) +**Date:** 2026-06-11 +**Status:** Reviewed — ready for post-alpha implementation planning +**Severity:** Medium + +**Documentation index:** [README.md](../README.md) + +--- + +--- + +--- + +## Table of contents + + +- [1. Executive summary](#1-executive-summary) +- [2. Resolved open questions](#2-resolved-open-questions) +- [3. Authentication and trust](#3-authentication-and-trust) + - [3.1 Bearer token](#31-bearer-token) + - [3.2 Signer](#32-signer) + - [3.3 Shared session (operators)](#33-shared-session-operators) + - [3.4 Trust flow (normative)](#34-trust-flow-normative) +- [4. Slug algorithm](#4-slug-algorithm) + - [4.1 Decision: SHA-256 truncated](#41-decision-sha-256-truncated) + - [4.2 Collision policy](#42-collision-policy) + - [4.3 Draft example (preserved for comparison)](#43-draft-example-preserved-for-comparison) +- [5. API and flow corrections](#5-api-and-flow-corrections) +- [6. Data store](#6-data-store) +- [7. Deployment and infra](#7-deployment-and-infra) +- [8. QR codes](#8-qr-codes) +- [9. Security model](#9-security-model) +- [10. Integration with androidcast](#10-integration-with-androidcast) +- [11. Estimates](#11-estimates) +- [12. Task dependency graph](#12-task-dependency-graph) +- [13. Suggestions (PO / dev discretion)](#13-suggestions-po-dev-discretion) +- [14. Remaining open items](#14-remaining-open-items) +- [15. Changelog](#15-changelog) + + +**Documentation index:** [README.md](README.md) + +--- + +## 1. Executive summary + +The draft defines a **standalone URL shortener** at `https://s.f0xx.org`, separate from the crash-reporter BE app, with bearer/signer trust, TTL/permalinks, QR support, and a JSON shorten API. + +**DR outcome:** + +| Area | Decision | +|------|----------| +| Priority | **Post-alpha**; medium severity; may move up if BE load stays low | +| Slug hash | **SHA-256 truncated (12 hex)** — reject draft interleave + Java `hashCode` | +| Auth | **Bearer tokens** for API; **signer** for permanent TTL; operator **session RBAC** only for token admin UI | +| Placement | Submodule `backend/url-shortener`; dedicated nginx vhost; **opt-in** deploy | +| Stack | PHP + nginx + MariaDB per draft | +| OpenAPI | **Required** in v1 | + +--- + +## 2. Resolved open questions + +Questions from draft §“TBD and open questions list” and inline `TBD` markers. + +| # | Draft question / gap | DR answer | +|---|----------------------|-----------| +| Q1 | Token signing, trust models, sessions, security | See [§3](#3-authentication-and-trust) and [§9](#9-security-model). Machine clients use **bearer** (+ optional **signer**). Humans use existing BE session only to **mint** bearers. Optional HMAC for GET left as [suggestion](#13-suggestions-po-dev-discretion). | +| Q2 | `... TBD — open part` | Filled in SPEC: audit log, rate limits, SSRF blocklist, normalization rules, collision policy, admin tables, smoke tests. | +| Q3 | Database `*... TBD` columns | Full schema in [SPEC §9](../specs/20100611_3_url_shortener.md#9-database-schema): `origin_hash`, `expires_at`, `access_count`, FK tables for bearer/signer. | +| Q4 | Java hash vs SHA-256 | **SHA-256** (see [§4](#4-slug-algorithm)). Java hash is 32-bit, non-cryptographic, JVM-stable but poor for URL slugs. | +| Q5 | Interleaved URL+TOKEN string | **Rejected** for production. Deterministic `SHA256(bearer_id ‖ normalized_url)` instead. Draft interleave kept as historical note only. | +| Q6 | Authentication: “app-wide shared session, project-wise token” | **Split roles:** `curl`/services → **project bearer token**; console operators → **shared `ac_crash_sess`** to create/revoke tokens (same RBAC as crashes/tickets). Shorten API does **not** accept PHP session cookies. | +| Q7 | Submodule remote “available soon” | Track as [open item](#14-remaining-open-items); scaffold in monorepo path first, push to `git://f0xx.org/androidcast_project/url-shortener` before prod. | +| Q8 | OTA-style “invalid URL” on unrelated services | N/A here; shorten service validates URL scheme/host and returns `INVALID_URL`. | +| Q9 | Step 9.1.1 / 9.1.2 trusted sub-capabilities | `can_temporary` on bearer; `can_permanent` on bearer **and** valid signer required for `ttl=0`. | +| Q10 | Cached hit when TTL “exceeds given limits” | If stored link **expired** → error `TTL_EXPIRED`, not silent renew. If valid → return same slug with **remaining** `ttl` in response (draft step 8). | +| Q11 | Estimations (draft empty) | See [§11](#11-estimates). | + +--- + +## 3. Authentication and trust + +### 3.1 Bearer token + +- Opaque string (≥32 chars random), stored as **SHA-256 hash** in `bearer_tokens`. +- **`trusted=1`** required to **create** new links (draft steps 6–7). +- **Demo token:** single `trusted=0` token that can only resolve existing slugs in docs/examples — cannot create (403). + +### 3.2 Signer + +- Separate long-lived secret for **elevated** operations. +- Required when `ttl=0` (permanent permalink). +- Validated against `signer_keys` where `can_permanent=1` and not revoked. + +### 3.3 Shared session (operators) + +- Small PHP admin page under url-shortener **or** a tab in crashes console (suggestion) protected by existing login. +- Actions: create bearer, revoke bearer, list links for bearer, purge expired. +- Uses same RBAC roles as [REMOTE_ACCESS_IMPL](../REMOTE_ACCESS_IMPL.md) pattern (`admin`, `operator`). + +### 3.4 Trust flow (normative) + +Matches draft low-level flow with SPEC clarifications: + +```text +Request → bearer present? ─no→ 401 MISSING_BEARER + → lookup (bearer, url) + → hit & valid TTL → 200 cached (remaining ttl) + → hit & expired → 409 TTL_EXPIRED + → miss → bearer trusted? ─no→ 403 ACCESS_DENIED + → ttl=0 → signer ok? ─no→ 403 SIGNER_REQUIRED + → compute slug, insert, return 200 +``` + +--- + +## 4. Slug algorithm + +### 4.1 Decision: SHA-256 truncated + +**Chosen:** + +```text +slug = hex(SHA256(bearer_id + "\x1f" + normalized_url))[0:12] +``` + +| Criterion | Java `hashCode` + interleave (draft) | SHA-256 truncated (chosen) | +|-----------|--------------------------------------|----------------------------| +| Collision resistance | Poor (~32 bits) | ~48 bits with 12 hex chars | +| Determinism | JVM-specified but weak | Standard crypto | +| Reversibility | No (good) | No (good) | +| Debuggability | Opaque interleave | Simple test vectors | + +### 4.2 Collision policy + +- Unique index on `slug`. +- On duplicate insert: append `-1`…`-f` (4 chars max) **or** re-hash with `:\x1e{counter}` appended to material. +- Log collision to `audit_log` at `WARN` level. + +### 4.3 Draft example (preserved for comparison) + +Draft interleaved `https://t.co` + token → `htta5bpesf:4/3/3td.2c3oa` → Java hash or SHA slice `4623b436f`. +**Do not implement interleave** — kept only to show original intent (per-token namespacing). Namespacing is achieved via `bearer_id` in hash input instead. + +--- + +## 5. API and flow corrections + +| Draft item | Correction | +|------------|------------| +| `GET https://s.f0xx.org?url=...` | Use **`/api/v1/shorten`** path so root `/{slug}` stays redirect-only | +| Response `ttl` as string | Keep string in JSON for draft compatibility; document integer seconds | +| `signer` on GET | Optional query param; omit from success body (security) | +| Fail body echoes `bearer` | Truncate in response to first 6 + `…` in production logs; full echo in JSON only for client debugging (SPEC) | + +**Routing suggestion:** nginx sends `/api/` → PHP front controller; `^~ /[a-f0-9]{6,16}$` → redirect handler. + +--- + +## 6. Data store + +| Option | Pros | Cons | DR pick | +|--------|------|------|---------| +| A. Same MariaDB instance, new schema `url_shortener` | Simple ops, one backup | Shared failure domain | **Recommended v1** | +| B. Separate MariaDB database | Blast radius isolation | More admin | If PO wants hard isolation | +| C. SQLite on BE | Zero MariaDB migration | Poor fit for BE pattern | **Reject** | + +Retention cron: `scripts/purge_url_shortener.php` (mirror `purge_remote_access.php` style) — delete expired rows + audit >90d. + +--- + +## 7. Deployment and infra + +Per [INFRA.md](../INFRA.md) topology: + +```text +Internet → FE (s.f0xx.org TLS) → proxy_pass BE :80 → url-shortener php-fpm +``` + +| Step | Owner | Notes | +|------|-------|-------| +| DNS `s.f0xx.org` → FE | PO / infra | **Open** — see §14 | +| FE nginx `server_name s.f0xx.org` | DEV | Mirror `apps.f0xx.org` TLS pattern | +| BE `url-shortener.conf` | DEV | Repo under `examples/` or submodule `deploy/nginx/` | +| Submodule init | DEV | `scripts/init-third-party-submodules.sh` update | +| Licenses | DEV | Add QR library to BE license inventory | + +**Safe deploy:** nginx fragment only; no topology changes to router/FE↔BE path. Validate with `nginx -t` before reload. + +**Not alpha-blocking:** omit from `validate_be_services.sh` until first deploy. + +--- + +## 8. QR codes + +| Decision | Detail | +|----------|--------| +| Must-have | Yes (draft) | +| Format | PNG via `/api/v1/qr/{slug}.png` | +| Library | `endroid/qr-code` (MIT) — **suggestion**; PO approves license addition | +| Inline in JSON | Optional `qr` URL field in shorten success — **suggestion** for v1.1 | + +--- + +## 9. Security model + +| Threat | Mitigation | +|--------|------------| +| Token leak | Revoke bearer; rotate signer; rate limit | +| SSRF via shorten | Block private/metadata IPs at validation | +| Slug enumeration | 48+ bits entropy; rate limit redirects (suggestion) | +| Open redirect abuse | Only whitelisted bearers create links | +| Session fixation | N/A — API is stateless | + +**Trust model summary:** + +```text + ┌─────────────────┐ + │ Operator (web) │ + │ ac_crash_sess │ + └────────┬────────┘ + │ mint/revoke + ▼ + ┌─────────────────┐ + signer ───────►│ bearer_tokens │◄────── curl / services + (permanent) └────────┬────────┘ + │ trusted create + ▼ + ┌─────────────────┐ + │ links │ + └─────────────────┘ +``` + +--- + +## 10. Integration with androidcast + +| Consumer | Use case | When | +|----------|----------|------| +| BE remote-access UI | Short “open session” links for operators | Post-alpha | +| OTA / docs | Stable short links in printed QR | Post-alpha | +| Android app | None v1 — use HTTPS from BE | Deferred | +| Crash reporter | **No** embed — standalone service | Normative | + +Submodule lives beside `examples/crash_reporter/backend/` conceptually but **not** inside it. + +--- + +## 11. Estimates + +Engineering person-days (single DEV, familiar with BE stack): + +| Task | Days | +|------|------| +| Repo scaffold + OpenAPI + DB migrations | 1.5 | +| Shorten API + auth + TTL logic | 2 | +| Redirect handler + permalink cache | 1 | +| QR endpoint + license | 0.5 | +| Admin token UI (minimal) | 1.5 | +| nginx FE/BE fragments + deploy doc | 1 | +| PHPUnit + smoke script | 1 | +| **Total** | **~8.5 days** | + +**Severity:** Medium — no alpha path dependency. + +**Reorder triggers (PO):** high demand for shareable debug links; BE CPU <50%; remote-access operator UX needs short URLs. + +--- + +## 12. Task dependency graph + +Legend: **1** = highest priority within this feature. + +```mermaid +flowchart TD + T1["1. Submodule scaffold + openapi.yaml"] + T2["2. MariaDB schema + migrations"] + T3["3. Bearer/signer auth layer"] + T4["4. Shorten API (POST/GET)"] + T5["5. Redirect /{slug} + TTL"] + T6["6. QR PNG endpoint"] + T7["7. Admin token UI (RBAC)"] + T8["8. nginx FE/BE + DNS s.f0xx.org"] + T9["9. Tests + smoke + licenses"] + + T1 --> T2 + T2 --> T3 + T3 --> T4 + T4 --> T5 + T4 --> T6 + T3 --> T7 + T5 --> T8 + T4 --> T9 + T6 --> T9 + T7 --> T9 + T8 --> T9 +``` + +| # | Task | Blocker | Assignee | +|---|------|---------|----------| +| 1 | Submodule + OpenAPI | — | DEV | +| 2 | Schema | 1 | DEV | +| 3 | Auth | 2 | DEV | +| 4 | Shorten API | 3 | DEV | +| 5 | Redirect | 4 | DEV | +| 6 | QR | 4 | DEV | +| 7 | Admin UI | 3 | DEV | +| 8 | Infra deploy | 5, PO DNS | DEV + PO | +| 9 | Tests/licenses | 4–7 | DEV | + +--- + +## 13. Suggestions (PO / dev discretion) + +Items intentionally **not** frozen in SPEC — recommended but optional: + +1. **HMAC signed GET** — `&sig=HMAC-SHA256(url|ttl, bearer_secret)` to prevent query tampering on shared links; skip for v1 if all clients use POST. +2. **Console integration** — add “Short links” card to hub nav next to Remote access instead of separate admin skin. +3. **Response field `qr`** — include ready-made QR URL in shorten JSON. +4. **Click analytics** — increment `access_count` only (already in schema); defer graphs to Grafana/nginx logs. +5. **Custom slug** — `&alias=` for operators; increases collision/abuse risk — post-v1. +6. **Separate PHP-FPM pool** — if redirect traffic is high; share pool initially. +7. **FE rate limit** — `limit_req` on `/api/v1/shorten` at nginx. +8. **Draft demo token** — ship `examples/url-shortener/demo_curl.sh` with documented read-only token for CI smoke. +9. **PDF export** — run `python3 docs/_pdf_build/md_to_pdf.py` on SPEC+DR when PO wants signed-off copies. +10. **Atomic commits on `next`** — per [bottomline_reminder.txt](../../bottomline_reminder.txt): one commit per task row above for easy revert. + +--- + +## 14. Remaining open items + +Requires PO / infra input (hard blockers for **prod** only): + +| ID | Item | Owner | +|----|------|-------| +| O1 | Create git remote `git://f0xx.org/androidcast_project/url-shortener` | PO | +| O2 | DNS + TLS cert for `s.f0xx.org` on FE | PO / infra | +| O3 | Confirm BE docroot path (`/var/www/.../apps/s/` vs subdomain root) | DEV + PO | +| O4 | Approve QR library license addition | PO | +| O5 | First production bearer token issuance policy | PO | + +Soft blockers — DEV can proceed on `next` with local MariaDB and hosts-file testing without O1–O2. + +--- + +## 15. Changelog + +| Date | Rev | Change | +|------|-----|--------| +| 2026-06-11 | 1 | Draft → SPEC + DR; resolved hash, auth, schema, API paths; task graph + estimates | + +**Source linkage:** [docs/drafts/20100611_3_url_shortener.txt](../drafts/20100611_3_url_shortener.txt) diff --git a/docs/DRs/20100611_3_url_shortener.pdf b/docs/DRs/20100611_3_url_shortener.pdf new file mode 100644 index 0000000..7b5dff7 --- /dev/null +++ b/docs/DRs/20100611_3_url_shortener.pdf @@ -0,0 +1,503 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 26 0 R /F4 28 0 R /F5 33 0 R /F6 34 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 716.2874 124.373 727.2874 ] /Subtype /Link /Type /Annot +>> +endobj +5 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 705.2874 144.405 716.2874 ] /Subtype /Link /Type /Annot +>> +endobj +6 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 694.2874 138.629 705.2874 ] /Subtype /Link /Type /Annot +>> +endobj +7 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 683.8499 115.1325 693.8499 ] /Subtype /Link /Type /Annot +>> +endobj +8 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 673.8499 93.87004 683.8499 ] /Subtype /Link /Type /Annot +>> +endobj +9 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 663.8499 162.645 673.8499 ] /Subtype /Link /Type /Annot +>> +endobj +10 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 653.8499 144.705 663.8499 ] /Subtype /Link /Type /Annot +>> +endobj +11 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 45.68504 643.2874 105.709 654.2874 ] /Subtype /Link /Type /Annot +>> +endobj +12 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 632.8499 168.9 642.8499 ] /Subtype /Link /Type /Annot +>> +endobj +13 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 622.8499 121.785 632.8499 ] /Subtype /Link /Type /Annot +>> +endobj +14 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 612.8499 210.9825 622.8499 ] /Subtype /Link /Type /Annot +>> +endobj +15 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 45.68504 602.2874 140.837 613.2874 ] /Subtype /Link /Type /Annot +>> +endobj +16 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 45.68504 591.2874 91.48504 602.2874 ] /Subtype /Link /Type /Annot +>> +endobj +17 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 580.2874 130.613 591.2874 ] /Subtype /Link /Type /Annot +>> +endobj +18 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 569.2874 90.14904 580.2874 ] /Subtype /Link /Type /Annot +>> +endobj +19 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 558.2874 107.485 569.2874 ] /Subtype /Link /Type /Annot +>> +endobj +20 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 547.2874 156.853 558.2874 ] /Subtype /Link /Type /Annot +>> +endobj +21 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 536.2874 94.14904 547.2874 ] /Subtype /Link /Type /Annot +>> +endobj +22 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 45.68504 525.2874 144.853 536.2874 ] /Subtype /Link /Type /Annot +>> +endobj +23 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 45.68504 514.2874 178.189 525.2874 ] /Subtype /Link /Type /Annot +>> +endobj +24 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 45.68504 503.2874 138.613 514.2874 ] /Subtype /Link /Type /Annot +>> +endobj +25 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 492.2874 97.71704 503.2874 ] /Subtype /Link /Type /Annot +>> +endobj +26 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +27 0 obj +<< +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R + 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R + 24 0 R 25 0 R ] /Contents 68 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +28 0 obj +<< +/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +29 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 391.5722 464.1984 399.3562 472.5984 ] /Subtype /Link /Type /Annot +>> +endobj +30 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 414.9242 464.1984 422.7082 472.5984 ] /Subtype /Link /Type /Annot +>> +endobj +31 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 424.2482 437.1984 458.1002 445.5984 ] /Subtype /Link /Type /Annot +>> +endobj +32 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 423.4642 362.1984 431.2482 370.5984 ] /Subtype /Link /Type /Annot +>> +endobj +33 0 obj +<< +/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font +>> +endobj +34 0 obj +<< +/BaseFont /Symbol /Name /F6 /Subtype /Type1 /Type /Font +>> +endobj +35 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 405.9572 242.1984 436.6942 250.5984 ] /Subtype /Link /Type /Annot +>> +endobj +36 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 391.5722 136.1984 403.2482 144.5984 ] /Subtype /Link /Type /Annot +>> +endobj +37 0 obj +<< +/Annots [ 29 0 R 30 0 R 31 0 R 32 0 R 35 0 R 36 0 R ] /Contents 69 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +38 0 obj +<< +/Contents 70 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +39 0 obj +<< +/Contents 71 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +40 0 obj +<< +/Contents 72 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +41 0 obj +<< +/Contents 73 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 67 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +42 0 obj +<< +/Outlines 44 0 R /PageMode /UseNone /Pages 67 0 R /Type /Catalog +>> +endobj +43 0 obj +<< +/Author (Android Cast project) /CreationDate (D:20260611175416+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175416+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (URL shortener service \204 design review \(DR\)) /Trapped /False +>> +endobj +44 0 obj +<< +/Count 24 /First 45 0 R /Last 66 0 R /Type /Outlines +>> +endobj +45 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 46 0 R /Parent 44 0 R /Title (1. Executive summary) +>> +endobj +46 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 47 0 R /Parent 44 0 R /Prev 45 0 R /Title (2. Resolved open questions) +>> +endobj +47 0 obj +<< +/Count 4 /Dest [ 37 0 R /Fit ] /First 48 0 R /Last 51 0 R /Next 52 0 R /Parent 44 0 R + /Prev 46 0 R /Title (3. Authentication and trust) +>> +endobj +48 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 49 0 R /Parent 47 0 R /Title (3.1 Bearer token) +>> +endobj +49 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 50 0 R /Parent 47 0 R /Prev 48 0 R /Title (3.2 Signer) +>> +endobj +50 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 51 0 R /Parent 47 0 R /Prev 49 0 R /Title (3.3 Shared session \(operators\)) +>> +endobj +51 0 obj +<< +/Dest [ 38 0 R /Fit ] /Parent 47 0 R /Prev 50 0 R /Title (3.4 Trust flow \(normative\)) +>> +endobj +52 0 obj +<< +/Count 3 /Dest [ 38 0 R /Fit ] /First 53 0 R /Last 55 0 R /Next 56 0 R /Parent 44 0 R + /Prev 47 0 R /Title (4. Slug algorithm) +>> +endobj +53 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 54 0 R /Parent 52 0 R /Title (4.1 Decision: SHA-256 truncated) +>> +endobj +54 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 55 0 R /Parent 52 0 R /Prev 53 0 R /Title (4.2 Collision policy) +>> +endobj +55 0 obj +<< +/Dest [ 38 0 R /Fit ] /Parent 52 0 R /Prev 54 0 R /Title (4.3 Draft example \(preserved for comparison\)) +>> +endobj +56 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 57 0 R /Parent 44 0 R /Prev 52 0 R /Title (5. API and flow corrections) +>> +endobj +57 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 58 0 R /Parent 44 0 R /Prev 56 0 R /Title (6. Data store) +>> +endobj +58 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 59 0 R /Parent 44 0 R /Prev 57 0 R /Title (7. Deployment and infra) +>> +endobj +59 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 60 0 R /Parent 44 0 R /Prev 58 0 R /Title (8. QR codes) +>> +endobj +60 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 61 0 R /Parent 44 0 R /Prev 59 0 R /Title (9. Security model) +>> +endobj +61 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 62 0 R /Parent 44 0 R /Prev 60 0 R /Title (10. Integration with androidcast) +>> +endobj +62 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 63 0 R /Parent 44 0 R /Prev 61 0 R /Title (11. Estimates) +>> +endobj +63 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 64 0 R /Parent 44 0 R /Prev 62 0 R /Title (12. Task dependency graph) +>> +endobj +64 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 65 0 R /Parent 44 0 R /Prev 63 0 R /Title (13. Suggestions \(PO / dev discretion\)) +>> +endobj +65 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 66 0 R /Parent 44 0 R /Prev 64 0 R /Title (14. Remaining open items) +>> +endobj +66 0 obj +<< +/Dest [ 41 0 R /Fit ] /Parent 44 0 R /Prev 65 0 R /Title (15. Changelog) +>> +endobj +67 0 obj +<< +/Count 6 /Kids [ 27 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R ] /Type /Pages +>> +endobj +68 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1045 +>> +stream +Gatn&>>O95&;B$;(%YO._Sja-]E&0f'%0+9IB/%6M48f_lsM1Err%j]0"Zp.#$I5F._#"\4?bs+&E/C^^T.k&UkHX,$C!ie!h,2Rb"F]Ep[7b=e!3KsZ6G8@aRboinMJ)Zn2,t/(8imKGa_'H!@1Io1neq$Y&sQJUbpYoMTf)>4bD.J$f@M$7`0>IBXcCfFjh.O.Y`=D!OR"lBK*;K;cdUD?SUslaV64!/TW2!0"]u=P[j_%D!>_mRCUiWKfso12O?`(bpU%EEH`LA]:3&E)je`7QYj6'VFQ]$*_0JRA@H,IY+84,.PHQ*qZR2*X$b%!X9%&1W"BMB;)_C=KM&[CRiAp]!5@4YVch2['?f(o)V],RKsAT[0!F5mJK^ndr@p8[bkSuii\VDlb'=Rk3CdZ.\,*?sJ);#.Wg2Na$s=X/Tce;;a4b#=n^("::qBT4$s_];/KUTQp!uJNs+Q=H&V1=K23$9@WqU11D?,W]FiAd[ehdl'F^3S8Ck:1)2$ba8aJ"uA8oAQ%M.4E&KrQ0p9@C",-toiD6S[XQ`hn%(=6NI^5N!*@2Gd%N);u)&QkMs\?qcF#IiXkJWb*%IjWHUFiCTo_*0R$bT!#V=7&q7;jWYic/a.]Y#>'rVjO49>f\+2]FuB^kRS"P#MeEg`_K?OLN2F:6g$Fg'hX,CNcIS\SlINhc2Rd@AE&B]^\+('M_Q`/)`r*Qk>OgJkN8cEaa9nPNadZ@e]g"mH>Y4~>endstream +endobj +69 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3816 +>> +stream +Gatm>=`^(T&q801kc4NS,Sji&Ju$\E'0@Seal5bPe9u;$C(+U/(]e&1[a2.l4i<:^SQe^\T\4X;rONpOAGdk8?[E=Q@1A,j$7IC*mm5>I*S+TVI/W?^.j^[a0."M@auZUt;d*q%NpCX$(FmC1WjIHP*Yb#lJ&NF.0_pI/pdA>RSHX2BVg]'EF%G3%L@n>^Y*_)!ZYR(ASPeNeICQ-ZQTj9?(3A&F3&+M0Bd7;&9(GU]\d=P@VVjl'5!G^]$#I$]6YrI=MC]^(ZI(R%jDEO%LgoYu8;a&!&MtE,QS\"UUpbX=g*ChD^R[oM;gN-44!R:$Y$TDn1D1df;jC?m/fSk#)0*6*r!%d_&h!&0r)ABK"1P;AJqt'&)=E+__LTUHie9GqmQU7k=%L/3#X.2EY.kuCY@d]eda8/Vh"^]$ic!=dPPplt2+a)+'gKBAJh1Ud=m;NNEeRc`4VMpO--Ko`"N+,q#n7@m$>4mhk1AeBeb^j0S3Kk4M;87;QL+>kH60f-JMu##TN:6cdcC1LQe=>Xo\T6i!s0A31[3+c9RMV?JPY7nl`X,%:K'_.c;u3R`)"!)%b\J5Jk>_-dutJ6gW#Zq?o0,@g'HJ(_&d']`f:>Zbp+.t@j:\e%O;HYi6dO.E(Q8[AhNAV.9mWg9gWUOAh+-Ba/m'\.^o$9:EW^;2u.-_DV:gZD%96QMWQfd]Xs/4)dBfm"gP9c;Sb2[B)rOm2Mt]KSf@n?&SQW2N4k>=1$FH:=;2/ZmftXm3(NZA9i]eYda)E<':j1W05VG1*:>WD("tNL+HiLL+Tfegn/WMg&J(k4@hB>oMK[q1q^hPb"MTG4[6$CaC=sq"p9/ETVs\+.\un$*rPBHm+83djeZ=.K:5E["g#%CFW+TPB[3lQL\R0Hk7nLio#CaXEf:*3m\DP01/JqO?30FfttT&*%7SoIh)QDP8JdfDEq@TP%N;f:-UYG$[aU]4b>R7cJJ6Qmu&6qC1BrKDI4Hi"cOA^XkF4$X?:_d<@tc9#>X:+B&L?I2I=L.+P<5,a6VLf*ON[_6iF.Q5J^c`(4.XG!-e;o^fW7)so51Q?5dpIqN;5^D7W4%Ji9]?HZrV9&@eWmjJT_X$7k:;37Ns2--Q[tAcH>k*`jQ_8#qcU'qXA%m2LuXW_&3f5D#WaF[pll;jC:gUjj7O>(H?fi]<]bK[r(8BtBc7r1Zau"X:&D1cl.Jq>E0[&ZU@g?Ph5^;Yj-[:SE$et9SKdQ.(?;VO``sUjq2r/'Q-EP8';#LJZ#5)`_e'&c^@FGiYaMD36a0_BQ-((P*X>%i\[i.@U(-#2J9*GX?tWKGL3Js.(XT6#[8g7C&tu\(5-V@R%/(.j,tWbRaGSm"#;f_U$JYU0WMI\bOQ;[C]k#_N@9g>`_#h%jljct",q6F2HI5%1BU\9B_Zqhd4#B[')C2Mt.pjUOVJj'^8<0H8fAE0q"Tlmu*9o7bC(Qb/r6J,aZ_!>PZI\.eX^4sr1Cr+)NF9c>VC#o?$\aKY[F/fkPRu9q4769hcUG4_+CVV`jO3&0;$o(*>G,M[HH75gNIp3"Y9it6+;dlbUJL+;OmACH(&MP^:Q]f?1q,od*B2)3M.@7saD(JJ/VEJ=7h4/N4C<_2d5VCNjq^UugXLnF/F13$eoZUHLD>-j[X*(#8WnT/-&@Jusdu&-uBaIPC"4%WL%1!'^[@bW_?(,]NjA*p/HSf#a;,f\E+!i^+Zb=dV81*6&'9"#9q&)KH#s/2ED_dG4'cS$Qm!B:I.6:aKUIFSqk#:8b_!E)tP?`P@gC,<8YJo*/ug7#o@)/n+kr]:&h/<9QF>D3oZP,BQ@koAQ.kC\"0SiAM%i:VLW09>fL.HM&1T(5t]f(S,M/f;N$Tp;iS2gaP\"H%3;Q:RVnf@J>`H]lPV#]>*b`d-9=u^cJ]0)d.+suOLMG^/SB!`K%piG`JZ^!r%kd6nLBG6.2Nq7&0T#&KQIY#Oma8%5P;j-*'-dLkVr,/d\44=R2^7rDcCm(eoWq`(-,'kd(BJ/MqWUT,"U0gW=L?>`$VsjIlI>VJ3fh3XZq?Mri+sMn**NF,=8(833J_[:7.tKFgIIV`*$9K0RpI.kA3t;B^8-%[LQ0BP!\9,R!'I$P;BUhISCWc>0q`guc0?uKOdS`ni_HBY%.9p#n_O8.(9h[o>Sk9>@`4)2$0t8p#]=CX&Ep$o-E5r5Q2hm![2hb]SItQ;f##YBf8ZcQiKnf=l+UOJM]t"o;;64Rp+W^K7RAO6;h![clPrUsH]tCj=Ds#-k>U2f7Hb@TBTu2;C!/XG#@M/^@LB%>VGbS(U+PnG[g_ce/EJp1=]$V=/>tYD4oAgG`&c1![g)"2QOA3Y1s3Kie=l"mXO/bSB=:E=E+h8Rjl[;O9dcfcZTBZtO(.3,E$-F?JAuAMpk8KU/`N",qb72_M,-tNae=*C,fi6L;*7a_UDQC(m;AJendstream +endobj +70 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3796 +>> +stream +GauGdCNJ5gnp>i)cHY1)h8V9YU-rX7*QM2Zk@2Jogtp:U4V(4Q&o3A4!QpJh[(lPTi'S,GMPQcNC19O1Fr.cKI3JmZpbC:Uh?)Wk%30k5J76=>'F\3PiT;?nDdND5b/dW;4j=l:F;t(/J_%/4)u&;JDTl2?AlJ$3blS;Zrqr][%O=GJIJ=3\-:Y`\LN)i@:7CG._)YdT8D$(b:9p:(gB!*QRY$@qAr7(NN$j7B,:9qkMfkUnRL/"^(/`oi;:!V]QZ7LKA&@?t65Ih+_Vg"A+=J9kJLTVjiR!ZMi*sIFC)0_N'!Op6@?7P*<+e\mQY!speAjS,\?$65\?-1'"!hkP+rVc#ILCel^7@)4rM<3e!O;H`Da7n[LdY,f=X\jYhU?+7-6,h&[r`ZKoGJid6p=/djn&TBJD]LN\l4$uFt.:DGYYbH*?e5gOPQm.0J4]-c0-2"I&T_s;5>@?Is2@??f6?mac+(lngT>?&!+Z!nUr*Mb::d3(AAppGL@a]S;90D!tY'nL!g$Yj_RD?<:n9U`1/.'P>])@?5\uhc%;kta.7dl`prs\eRpOkbF+G5q:&>EmNf8`15l&]9kZ:C]S@X(NZ1oma]JRpe(KO1hpQR)*s[ecLf;;U[0#`U\N;aMOXA.IYci>Hk`iP@A?;KI979N82[.#@`S25aAq,#nGTFgiR--SB]`DflIKlDTlWpMg(0g1jS!>!.(-XU?^PHl\s0@%Cj%fO"[ZmhnC&$NeX=!;[8E_f,82Af_mQpV9#h_)Q&d''QEf"4qA;$4$6&8"#p!LB)nfhi?(?+nrZ=8([.io5sokmV2AFDF_UjhcEEucbk*G&MMOOas>n&H@/#(,2Hn;7*gM;@Db'*R`:rMmi-[h)J^+URVV;Xa&"ab0=`"=OS7-[F&+%$l]0!9@#S%e$"o3lEF6(,jG$TcXP'f1RK;U$$Y44#!or`EO-$D?r?JMe#Bh?Dd5C(-)a'Tmnn_r[-Lu7t-PG2$j[e*O.\k!\8X4h80W.^1"$A3-2E0C"BOAN/^J#tM`q1qZS+?&Wn3?3q.XO?>r)#[5bb(>ga*'&ZE*THF*0,-M7LsY"5n5jS/=qOXaUL?ZL9@A+1KoIC%n5M;3k=g^Xri+shAbViUA,@$c'%N!aaJu^@4AfAl2k#V;o_Mba!PB&fa!8LP1nM08P$sU9IWrN[Ndc=FB:87Zn^Bt]QHp\SYto((;=pa1:4.G4R-0-)9)mD=VrX++fd8`Mic#TbsLWSkF,h&1HG6d1>siVG3,7u:V.kIh&\!.Bgdq#643f8-GQ8r)jl8\B[/',#UVT`W&O&HX1Er`nAF@MLs_ei".?kU'6p>6^6r?a0o]&c52e]fW6]J#Fta4s?:WWmb\susmXd,`St"E_*PiIXI@;nQ\'_$:#X%PAX?1XLfo3:L95"$l@Y.2,RMBV32kAJGOEFYrA?P\m4]t:T_"%O+r;9/+R!lSZ5l'U,r@@O(O1BaFX?6uQ65Za0IJnM@j(j(NDJ_g"(j)or'0+,^d"/>oi$b55dFna&T22+=>arN+3aqZ^<*k`@@Si.okt]B93F*'!l-Hadrh2&L"M(!7#/VC4tme48QC[L0r.[OY@4>1A8-I_VEQ-!)kHt$`VYeB0QkS3$IP25KM+O#DF7G?16AWTqnGlr=63G^Ct@_o[T.a=G'CiUF&f3_H;:b5+cBQ0G$njO<[O_t#D-e_CK8`OHa`rkR9'X4WGHh:\)m^/o095p+VH+&2M7qop_d1Y&U)/oMmP<$g/-I_fT&nt*imgN+b]I_2Z5nksueKU]_9e/O+-f&dt>.9+o]NEOc0[eG.o_Ln^^f9FMA";#T;,U%hSoPdQZ\Gn3jmLl_WNft"OW%_]d0/($bk<"6Rd9c6%_AOmNn$#ebfi[GlZ3ol1,VRGp47Zn#^5ZA[\pT"C9Jk15J2R&(^b,[5cb$/gPmI0PnY[o!CX\lCo!h8W:VMrE6C*B)A=g+5tu.WJD$eH<(c$.NBp?k!A]-/q=nIi#1t+j@*7.(`7"7U&9,\fBA)dOhNB*BG%R\-d8_:&,sdomT\c29;=/X4SA3W@e7$)5C11$<4P*2IUXOa'Wp*nJ;^,d)mOlF&T,2J/09u3m*ImS`VTUYmVo][Sn;bXiX,&A:UcS<$5F3iZ3KPiG9&@!PD:&lrjbl*5Q.d#>W`.Y00^-I+F'bW/5Y&4?JYOFPh+4uVa`.WJ&nMEs]uD=2/KQI^7cZSmUn#*rk5$^sEAXdEqCQKe:Nil/shF0l3apk2*;9gY\1rW6N/I*R>q16T'p8iYrqPeSXlqsWumr$+4jl::8<^H/P-kI83T!S"Y9^dp-L&T*H1c5>c6mF_*^"N)8p$Ta#bNX"Yl+_\M+Y:hlsJK.9'nau\FH7+tTg.&lc&X*s7;cCJ3fbiCmqr0M)RfLI`[f?##6)1UmOG/$H^?2NR2/WR_?/iL;Oh52JC4^6i!V^sEET!+?hX,s9]GBA?q4)1RQEQo50s;tfmo7:P]-4@$U5t#C&Dip0[ZW?R0lMt?CsDP:*ZJZ:>(JrQEnGFg9ro2N+iPc-dfsm+b;ilrTeb%&tCVup]XuZ<0c8FAhQ'FS%O*FpDd4+fP4IT[m['M-@L3LpRnXr]#6=QtEendstream +endobj +71 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3237 +>> +stream +Gb"/)D/\/g')nJ00jbD][qf-r]=OW_9sU*SR\Yep_Z9c>>,#kNoi=Y-@iXpOhb\7"AA(%GmN$7$g4Ue51E;Q6cU3kGL`_fZDg;=)B/%"E5U;^KJ1-!NZYR(nb)Gp#\koCPpQbDW`.KP1[i\cCnEFG$^9quis:KB"U/q@7+e_!EGOmk]E]FD?u3Q9#D)i)(ZSde7&#&^[#IMe_WiZ$h=$q#geF7l\EN)j2H[Kn@X/VBcP%2$i"+cj$g$oG7q*2-t,;c1gG`u7Hdb,f]Y^pOE@4<-giq?$sZ1g"\mOiqX5e`BLoEYK-6YPW#HjeG>f[?bs$;,2&'j6&s5#<&/cYrMk1&R>BI90oYUIt*soL86=LJbnj4hbF`]r?reO[mLj3EoA1D&GNpU.pn4HG'bg0`?;nKX2%V1TiZR(3t7"9p+!:G<$46UX2%V15q4odTnB:a2OdrM=X\-N74juE?mlr$rNuC:ghE()-q2mC"Vrpmj=J`eC!N;0<5;3Cmg#Q!s4U6g(D]a[-i(C`)O)W]c'2GaLh[i>K9;DN&9pUI!kT\9'jO=q`'#t@>Y/"C3K6Lgi(AmS/%:r?oZ2G0&^oaF]],Ga:@&,Ncq9HI5ngZdA1,lHO!ZHY3&\0l>0"`q75sT?[N*P:iW$hEoQY+@FHJ]"lc@ufF;lk.1-JS#\%*(bG%07=S)7W6d!D4Lda4D"aRjg9rE&?gQi@gf^R[e5KCH%Mm+st(,;9u+m3lpi[!okZ`W7_SrH'oDI$aB0]M^6Sds?km,Uq=AY1G=W";5E>'Pq`WF#6csInFS48\-h%&\.5NG9*:X*r,]mp86_EUD`uHaA&OLIIb-CFcUs]^W(**>^d:l3<;HU?t&bba12d9;8S%nj@/PIU\6m/;MN#sZ<]86gCo2_J$/oH70SG=]a?;2Mp`lmb[uj(:_n'b>%*djFMSZJet-?-.YsPENme\0/fTbn_572CbZ[M3Z3=boX<+h]1U/-e4_9&0\3FJhk`1gV#4X;$Aa3N+/MnIt/?H;R<:+mK5ZLMm`R:b5:N:mcu]T/&C(I/ft)]ZcF6]d"hT>K,a$oEO*"8$+SA+[PJ-33Yh*fIU`mh42b*K'A.k"ZPaSg4Z[mJ\Zqm]rC>=U>=A]DU-7`5n$=p50%OS@?uNFM3&Dq_BQraiM%J&.091:gbY?X!Dk*Qe4$rllXkN4"+K;TR^0G8Af:ki?sDKC:0mfpsXJ'b9?chW@^'DJAD9H&H^b.diWD?]71mOs-7DnerpirGkDblD#T_9][4,X%a]:pA/_;4]4>8=Len!W%qO%]:KlMsAguXeiL$QlB"Na>I!9!+`R/&CK9)q?IQct+ElGH`h_t!2O$&d9ZOHUn2tnsD49%lNrXlj$Cg:gq=YN?YoWKhI8NQElZ\,&GZ<9(&8Q%9?!ImPFbWoibMGLSM+H+8,=ME^p6l5T>pMe\q6<\dLdmu_#?GnZ5dYcglqYA./a+H?PKf8oKpbAZL"(!+/QMi+AJ90Fa=^"!V(bPV,Wrm)pSEM$1fIh+q]HCVrRN8DV\JjtC?p+8GS,$B`jZ<;lCa<0d)9<\99h[4ahKuodpmM=sNA9Xf42=Q6N\`99i^-02G5:S+c9Or%1npgH13q.2[j4Ck'W'4J%3WBcO@JY"#[ch04\2M"_#>IBH7=>^0+2N#=ZI?P]?Z;>s"SHo@$1cj2b^@"ArUCq@=Q9TYa*NY:"6iede9u?1^VVPhZ3[R.:JEf"6oJMVhW-knl+6e+Gk:_P0EZt/_H4+Yp6=MN&,aDdV=R=C@LS3/5pLm0$%<%A^r_'+706CT~>endstream +endobj +72 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3539 +>> +stream +Gb!#^D0+IA&cV3*Z/a,PSBI>[42n#I)8@N/8RfZ)4.WW<*_:r0`"YdqP\p*\[s(,q'LbkEU#nC!hjk2XG_gckYup?j!u6oTWm`o#qKk*AE9eifi*qa0/rm!#Uo)SuOHmUV.^-Q4/PakP$-P-3Ji0&Q?N[fIrm?Q]B)s::,7WT)'AO[8&oI,XE#Z"a/?I9M:$'n*:Jh3;"TR81Mii^$W]H4t&=SG[<4aDKYQ]>!0e:p#FF#PWH%6G@7K$JcFjQ\=6,3fZH6sh9C`g.ju=:2gqa2C0HMN[o=%>RAi0+jp6"n#8j>4Y6I*h84Si)G"i^d5H"/J"oYuhi95nZ;pLQf]2SsNLsc;on:c1)0o(*]G9@0BpsG$c7$OsgNYYR_=n!9C#BUquK3S+L3rR,tIsR/NG9/+'R#K'BNZj?0-OBk0rY5K,]blkuT"sadkI?_WWo=r/'kR.:H%1MT9bU4aHHq.VQ\j(2"bn:O/9)2!:81ngU21&FbM&;#nZPsgs%K?c[Wet8H_m@"D^k5VCT7CR-P185$?Le8QH[9U1Li.5-qP2EG$r[=qtX]N)K:SFSk:qJg='Y%;)k+T9RKc;A&8a(NbQdGp;&i!rhk5O>s2Q,e`LT#t]KJRXtMN_XcEB%OT:_a9EK=EtY\2uM]32L;J]GIngJ@8,e\:o=9UqAbB]K7riK^aMSiY&3QW>CR==^o`[p>B&nH!h0VM`r3l<2"&s7idOUCA`KjVm.@rhDP`D[Zk'/rO?/&to"_/P3.@ZNG6Eg_4B'3Z,U7ef@P)Vcb)5-9^JFM3USK\=r#[b(DTng/hkUN-7tX5u00;C1gKeGIISeN66c21MT"WG\0%4nt;hPZ(5!Bpt\tI&1\:F9WVgJipG#L'u\7Ik4*RUX7FoT/YQQP*jh>8q(/,ncDj"j\*MoriRi]WH-g.ejn">@O4&VUH-kp+G2$Hob@>bKqspE)XNG0;q]-k3C!]YlKTfD^q=dG->/.l29&,js6s%gpa=tVfK<,#-%D78VG-G7TbVUKibL6GU-HEd`'ek*E3s;e9_"BV@4`)cgiu;-1[4Ob:-+_\1lSI@.+E[aPLn'&on[\:42B(&Fe)RcNA[dEK(J8<73aJOS!OhI8[EUS^jA""cu*kJ@an5qg8<'5&slE/ZgHs-,XB[70<9'AAA(1?&LhFDsC=j7Wc@8b>b:O)YYN)]>[\f"bCAb?4cYep3@,doiQ/J8>a%.IQ7"M/C8OoS4P=TD0qY4ptCP;>`C"G;!+KK$tGl].=A5QOgGh.C>!#^QscU8e\a=])S$6j3>+ka$mNElb@Y'bYU]/-h4d&3j/X:jO#r"76gIi.F@-'Jb,)!DV##rZCR&Hq/4!rA@Ap2sQ5JQ7P]"`Zkc#N5ep)A.?-G,=..OqVr"g9;)srqYqb<11\5Lf\f2heoU2G*0hrpXc.MX[P@0++`A4>:+/+mohoQUAS=42q-0l3*ZSjq`YG84kq+k58?3o1ek+-^Nkm#CI3;Id#*P"5B&Bo-1nM>Jfdb"<8VdjgL%5:2A(j,$0NG2.M?WLpl*/+DYZEMZ?^:![rKP4_/KY!U$o<)G=mpT`6RHqIa$`F0M[Y#[4ZKhgAV:aDomEkn#F4E_=?XF$a(cIlcigh#.uEM-)e'T)Zu#I;W.GrEM[_R>a@'`3cktR;"n%cZR*iW"f/I!CsKI?Z;-DD^^!W,[`u9BZpu=kHe*MDrE>aWP,pds7;,u_?\A;/U!HRPM(".7=WO\HmWaIV8OXj"MFW_'iuXdta"+DCmg5eF0g8Oq=VXSoH,Z[?$fMTbTG!ak38Nk&#uOh(fr(q,f7aO]h-^-K())>l9;&I#$<#%J?Yh/K=sgR00SDu:mih6K�="^#%Ok84(^)U1K3st(<:5C46WkU'IGd]cY/2_!Y8FpE[?!*hBa'RB+I\S\N->NJa=?J>Bc.]dNSXQr>Un^I;/X_=$&W/g02K8N^@4)ohS;D[i009:JQ&o:QLbHmZGTRH&El;^1P1hXkVGOB9+hdFal#!9`?#1)ulqOm12Y,Z9TSp.kSr]s/;"@ON6uX34]>,@q?rq45<6\CG^7]^S@ke9#MN/2OKLfT2&%uj#'2H/$)TVLAJe)XT8Tl^0oFmtR&$?K(,tm_UM:qI9R-$fje\k'$3lbmgl$MZDP&YP=H'mhS72Yb^i%6a'TC46dij&hT9?p'."16*bG1Xs\:^F&$ae5LSFC+h;45K^YTaP(aNtu8ErXM1qGfoQZ7n^McqDC-0/>n50buUI1/Y*nSAk#M"ClFA6b[^[3!t\Ahd9$=7"/CK2A=S@a8C0:E(>Ai"QXHrVqlKAg=_kQPeIdf8>ob]TMr$H"f85&#d[LOo~>endstream +endobj +73 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 771 +>> +stream +Gat=(D,8n?&H88.E?@83NR(@iA:,;[9q.MpBs^Z,a@k?dOja[,,0Va&B90D5Q:L*,93+\G3<<:,+=jkIj7tH3@$ERm@SnAn[=J^mm_f8R2-"\TikHB=OV=A%Ob*QlqHa@;>lkjY_Ip:3N?86(VjT(O.PDTj%hTDI*!6J/mJIM60ck9V4;Kc4J:mr]IC-@f@BFc^h\Qr\9Y_K*!]dpoUfp1_fZOfC$]5M'NSr_)"=D_c>G.Km5PhT7@\ZS[-F^.7:fOPMO4ol.M9]h[".n:21*$o=VdEK"N5%53T'o9?sG$X4=3\)_U$<7\eY3oT'_#"M.$[hU~>endstream +endobj +xref +0 74 +0000000000 65535 f +0000000061 00000 n +0000000146 00000 n +0000000253 00000 n +0000000365 00000 n +0000000512 00000 n +0000000659 00000 n +0000000806 00000 n +0000000954 00000 n +0000001102 00000 n +0000001249 00000 n +0000001397 00000 n +0000001545 00000 n +0000001691 00000 n +0000001839 00000 n +0000001988 00000 n +0000002136 00000 n +0000002285 00000 n +0000002433 00000 n +0000002582 00000 n +0000002730 00000 n +0000002878 00000 n +0000003027 00000 n +0000003175 00000 n +0000003323 00000 n +0000003471 00000 n +0000003620 00000 n +0000003736 00000 n +0000004108 00000 n +0000004214 00000 n +0000004363 00000 n +0000004512 00000 n +0000004661 00000 n +0000004810 00000 n +0000004894 00000 n +0000004972 00000 n +0000005121 00000 n +0000005270 00000 n +0000005530 00000 n +0000005736 00000 n +0000005942 00000 n +0000006148 00000 n +0000006354 00000 n +0000006441 00000 n +0000006763 00000 n +0000006838 00000 n +0000006940 00000 n +0000007061 00000 n +0000007222 00000 n +0000007320 00000 n +0000007425 00000 n +0000007552 00000 n +0000007662 00000 n +0000007813 00000 n +0000007926 00000 n +0000008041 00000 n +0000008169 00000 n +0000008291 00000 n +0000008399 00000 n +0000008517 00000 n +0000008623 00000 n +0000008735 00000 n +0000008862 00000 n +0000008970 00000 n +0000009090 00000 n +0000009224 00000 n +0000009343 00000 n +0000009438 00000 n +0000009534 00000 n +0000010671 00000 n +0000014579 00000 n +0000018467 00000 n +0000021796 00000 n +0000025427 00000 n +trailer +<< +/ID +[<84821a2348f034264701e135e5d978bf><84821a2348f034264701e135e5d978bf>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 43 0 R +/Root 42 0 R +/Size 74 +>> +startxref +26289 +%%EOF diff --git a/docs/GIT_FLOW.md b/docs/GIT_FLOW.md index 034bc9a..2ad325e 100644 --- a/docs/GIT_FLOW.md +++ b/docs/GIT_FLOW.md @@ -17,6 +17,10 @@ This document defines how we develop, integrate, release, and hotfix. **Cursor a --- +--- + +--- + ## Table of contents @@ -24,7 +28,7 @@ This document defines how we develop, integrate, release, and hotfix. **Cursor a - [2. Branches](#2-branches) - [3. Branch diagram (steady state)](#3-branch-diagram-steady-state) - [4. Daily development](#4-daily-development) - - [4.1 Fast track on `next` (alpha sprint)](#41-fast-track-on-next-alpha-sprint) + - [4.1 Fast track on next (alpha sprint)](#41-fast-track-on-next-alpha-sprint) - [5. Release: next → master](#5-release-next-master) - [6. Hotfixes — chosen strategy](#6-hotfixes-chosen-strategy) - [Default: hotfix from master (option 1) ✓](#default-hotfix-from-master-option-1) diff --git a/docs/GIT_FLOW.pdf b/docs/GIT_FLOW.pdf index 77ec100..19ad0e4 100644 --- a/docs/GIT_FLOW.pdf +++ b/docs/GIT_FLOW.pdf @@ -2,7 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 10 0 R /F5 13 0 R /F6 30 0 R +/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 8 0 R >> endobj 2 0 obj @@ -17,471 +17,228 @@ endobj endobj 4 0 obj << -/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 716.2874 75.47704 727.2874 ] /Subtype /Link /Type /Annot +/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 705.2874 88.37304 716.2874 ] /Subtype /Link /Type /Annot +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 892 /Length 73375 /Subtype /Image + /Type /XObject /Width 1244 >> +stream +Gb"-VDi>WHU@7p@:"h8K_Fc"_+q=<9-F#l]//!W"m*^msdhYTd(6L?VTj[+?N;:pa"r+9A+c%8.RF=1YFJO"&+C7A1)NmXGE/C@:Cai5%S45)u_qB*Z,41@cp)M%1]@)#s@c_0^G&!Xig""W]g[00.\uK&nO+&lPluKY:lnJD(Vs5^2"TSN&zzzzzzzzzzzzzzzzzz!!!"b`kRl>bJ4)/s+M"nYM?X"otMFG!!%Q2E:_1uDuL:5#pHb"IsZL"ec0Le!!!"bKAK3"O6:^"6L9g6rBK_CP6(^a^cD$^W_Q>&6L9fK?N-6c$31&+kFe"O@]RjI!<<,X.!/?RC_\u[!!!!=Khb6rX[4B=!!%PEcq+PKRAt.0'>J*/.-[Loiuk"TSOQUX2R=YuU"`!!!"<'KRZd[L/Q>!!!"Z674(t:I_$*dLoU]:ApE"k>^+gq`K'EA+5N^>*>`)`Rq!WW59;D5fZ!!!!hTp$*uX3aE=!!(q*FAbGA'fmcD!!"!m:.g>E672p:!.^ik8I;Y%kbJ1Y!,rW5.3Z,,SJ2&(!00An-,`iXP6(^a^esiC^miFQ41*#(,^1WcnIB<*t77Id1B2c_=ffScmI2P'p!!!!=Khg?5m+Ft:k9jR$G7,(pH'Qe5qQkn?8[7MorUKeASgAm\U-'clA/uGr4_n4+BB9_Hf8`sT:oMi7bE(1G$(Vb1!!&$G-g`\4fh!^CPN-.#r5$)BB/Xs9X=R"On/]&2/g4+Y:ZY9UEogQrbUI]2PeM\!8\OdlWpF#tjP-)iQkX"^=,?/."&`#DX66n>RmZY8&n4if\4W=k7NTA9foq_ONqO!S'EA+5N^>,\1<\?B_hZOZ.Q?hSB'RU9(t^AU95\%3?>2TG[_>H3S&"aRa^Mr1rpZ(hV_:(Xh`\\[W)mS3/e=38R5*$<8FP4oIcd#5^gDE25Ft(#p?msDP=mZ=3`"t8!!!"<'KTrpZ!f$17j2/)Pi$h$q%$#FH;^j%>MI5Gc&ZM_:PutoqVZ2:]@sl7F"leo@Z>j#Wair4J!;i%SJ2&(!00Anm4pTdUqUK]lJ#f;d>K$3)sQn7GFs,kks/h.-Y(Pj6G[*>G."mp^/Cp_m%PDSMp^>N=GS2%nMZs;`6q1sCHDZ+%mGjo$fRDPYqosog9Ab:r)f/Cq19i%:CD]p4H]e1+=F+It=oVDJdiootSNeV1B;EJ`?P>J13g_iU'TD3bCY4_ePG)pFshIOuS-Vb`NbKrf]!!(q*FODdOm\K*VL>A>R`GBE8Piu`>-7n;t7SenaRmd_RJB5L>bP[OenO`[9f2f]gTq77eA[9dK@UOE7Ab=Z/Zt6D]ATerPqb&r3B4'af'97n7-bS^gpj%OgI)O",K/kN9lb:83M=$31&+8"l,i)5ED\6`&J7?bK?%B=2hmd^SD4hYq8Rd*A/DRqtcX.pnHhr?5ZA<3@f6H;Y1,X*%Y6?7L@`>$oR"VXVC0'bdrFIV'lD[!2?U[>.ZJf%N,N'7gioVEKe&AOOZ/6PJE-*h-m,)Q9OM<>SJ2&(!00Anm5!gDdb=3J3V0T"Q22c5g71ClHGMGLS!;[nBl/-HOV<$q9^c5'/pDNNPH)%9kh>mG?C&ciG,a3Bk:-A:i=:'td??aIMtTM=c1fueTp#NX!5MIqUg7ThH$>7&=D9V"[%_]P`hf>Fc>hCXSTYLF>X4];LNXOrWG9#XBk3bO5Q6Z[I&MKPn!SF`6P4_3UtiVe>Z,jfo$=04672p:!.^ik8\<3ZS^_!coTTfioTij6,W^+O54Z3t3>O[m^u;3^*"peBh=WMSSoA*UrkJ43ffI?VC.)lkuu:(ZlSrgM[u?m!!!"Z67;.U4`o,VFq[Z">2<1q]3_Ja);VWGV$5J7ep-AiSl?e2opY"Y-;,C@.0'>J*/./AAUUa1/VWmZ8_$SJ2&(!00Anm4phH;It1:VPVgd",ilI:?fZ\$*E=6g_)G!>488T@/Bt*4cAR#q(%Z39i'C(g3mm@!F+DQs'!ki:#]!<<,X.!3lidmGK?*n5'4ZZVOZjd:>hb^%lDGIL=dUm_Ki,O7D844J=!X\;OeSiPT)]kc-^;ek\f@Sc%2'b_aQr==3m-q*(]>GLG^-2ta_)A`l3@ds89'9chlhD_8]k2pYqYCTP.Vql-^bn$PcR.WePg!!"tcS[?T4ek'F.B.%!Ah-pl!9rle8#@#fWe]*/eRhcJC#ZZ/f=JiQ&RVe#0C1loTg=>hYq!i:p$VUF#U2kYDI,g0/l0GM'+^MD7Tp#NX!5MIqUg9k\:+B1=-:?+l+U2S%9`M\(g#t']b+)t%n^3Q'p&8)I)43;:fg@-PO*H9Fe5+G.S@.+YRt6^uKr'q)1S^nV94(a(jT_69>Q.dtGNbh&!!$sP3pErH1-M%t311^IXGeIKB?%Nn^ScI9P*Ramk)Ul_B9&rm3o)o_oLJ,@!!!"<'KRZd[L/Q>!!!"Z674(t:I_$*dLoU]:ApE"k>^+gq`K'EA+5N^>*>`)`Rq!WW59;D5fZ!!!!hTp$*uX3aE=!!(q*FAbGA'fmcD!!"!m:.g>E672p:!.^ik8I;Y%kbJ1Y!,rW5.3Z,,SJ2&(!00An-,`iXP6(^a^esQ7SkrGP$kcs+O2T!!!!hl).9+S"OfcTK<$GlVkt%8RLt4+]aMUm-pIP9.if!B-r>b+Q$aXq^QabPiYET#qQ;?-[s3(i(M;FR!qDgaY[>i"++ZKET@lZW^MNt@T(h03aHkbQBDjiXB7h/IP`]ds&3dn'Q?!8o:(d7K8FPO@gXs+%%C4PfX/=[!RJ8(L%o&?2>#E[Fr"EisZLe/`BYNpWY1,uRr$*TMa.:j.&,S-\raEo9-NsJMJ>94<:0O3[o^4jnHVf+':oD?;([sRDVI)TgNX[Yr[E7hqU+5!qDZI>E`fipVsVW95ijdP4M4o+iZob=T'`a;LG[dWp.g(;uP\aYo$^?7P!d_'t&kSs*Salq4=R=j>^A)biA\Su]N*Vn#-q0$Zs%doR"[lLg<6ZVY`dd]9gh3%@mIJdW#cdQnNJm11PL*%n(^,4G([(2$3@O#gTld>Gc4gLu+-99[9-tglJjT@Sgl+14/H6T0MSrq7Jg(:!\jgoJBiBRlrjth7g@@8U^JWcYRLTWp$.?@c6+oj[4Ye4W@I<[F)D\V7&lu;YI8->+s^UcQ([NgUatBjrO'1MYnmSm?(15#"1a;kRGPV03"P5R"*!r&!pp);Ug#tRbhiUpToY%8HAeki$^+ePKJdGg+&#JnAt_eHcFmsoV?iiY^:>s(o[0FpV89S8"&)%8S;4#pq;m!2Ppe,=3(%&NpPTfg%pe:I,%'LURTNO)kAgsFd6akYl:Zln1O1\LZ7/jl4n/L[;@:n9MbMW3NTDB[=*1a'.t/n<,SFG]saJ_orB=T])k'X8JITokiD6#1aWl.ZA1%Da:T_8X/:C[ji$_#D9Wola4>]cBg.Z:BpR-j57FNh^!Ko!aG+&Cu)1jnG94n(SiD'M06fBBH%p/hX047bLhQr3h`.%)p9ak:)Y#^^-0BRB)$T<$4O"5cSQ0L#2_J<+66U2[JjCAd*P>b!!(q*/%UpZZPs?ejX[E<_"^[ZAN[B$9kDkT[_!]^;7L/%b%oP,4sVVI@!&b>39\h':RW/@1HK7K5?]`=&`5Po3IopX-u)KQl3B8Y>@6_h3-=PSr)iMeFSIgVe#f:7-0H4edg!`XFjI%Wps2=];M0Ja69PB/!KtGn*%qb[,kpYcPJaAY#3%r*hUrCF2BG.i_2ja;?-[s36I-HUlj&GHB!er"*TIS0%6MX4PMkjhe%?+#l[4f2AH'iQL1-If`Wjs&^FK^>!!!!Yb)5V_1IHDVjr>!!cq2]D/2%Mkb"J4qW1E'S>JOLLN(uFcX43G1RQ`6+eLk^[F[20-3;p&Vgg.>LAiJc5lQaAcVtBL9l=?a'qr$Zs;JE/'[0LILPhT9/B+o%)]U^m'7376CetH;hoR$>RAb(g:DjQ"@MS`GE-*Vrh=Bad/8CFA`)=!'&-DmA.%h\Jlp(euE*S]%!F;7`Wg=-[Eup8#n@dB^ULB-V_fjK[$&EYFKX`AqFk]d+QZ]p=r74cJIO:XNHrL;XYWb8"Yk2h(q7cFPrQGRei[\^\t3??VbG3hWiefj3_TXS[:;Tl`$EZ]W-AY=S_loenFYLeX!1/7AV"TV9qlB?NQaiJ(uh)S+".qqMr>P\)b`CR*\D*!!(q*/%:_.AQdd`L8gBFT>S*)-T*6gaUYLh>8=P0=?F(F4Oe&9GB^2K2*,H!q^QORH/i)L9Q86CDc_7?3pCnc)t2A:[PQfuQJ$g5g:Y&jq33uD,!!61fQfQX0a??kbg-(WaGO]g?1lAV;%QYkD;T6g1D7s)/&`[WK;IdX^6(Lt&?g\h;XnTtY];_)WAB?p4>[cjhA,621jK$O6)r!Fo)BO(*hqYZ(b+t&iddQh.F3ECsZb`#E8C+r>e@7]O)odZ-QojR)r1,YlQQND]<8]Sb,OfPF>"N=&A+V!!!"]C;nk\I4JG8`uP$a>e9=q5Pt$%MgQ&m%hXCb&cC'f&iZi!WW59;-%cd2'sc0HeXlZ[::RaAD(+h%3#(2qiVe21p;RVAr>CJFjd-uU8-W0PKMJEZe9fQhPMi@-]K.=Cmro*SF/J9>n/@T9%5*<&E*hXOZ[%0$rVV]qK/R)$Er1qNJ7iuq5?XR*$mkXHoH@AoVO/L=g6d48?kB-[D4P&Zh!1DlFeFU"a2kqq.PLf.]F)U)C1&pff$_7t3!!&%bU-#>oDJb.j=*F#-q(%Z39mcOO(#?G^5Pe:Rr/'Fd;i15Y]@K2G5;@D+?!U,OO]K&4M7e+^-r5=HATqj=i5E"(&4Wa2UPm)?ZaCp"/\&24cFq1&W!!!"ZZD'F[1%h]Y?!l(0\Wb0Hc;(s`]>Yb!ZKn'ReUnXj8QG/Bj-+e/9CH+KDeWDGH$9qdF(0*0l^k]L8tO_;%h6^3/r]SuPC%_;Mfrdg.l#4eTFHHra2m"Nh4tTE@1B!1r5b)LmU745k0!t@!f=DFRKB!s`WBH`?:9l_eVLLS.QYo/;\Cs(;.#++$Cqk2!!&%bdQ=FOqX1q'Tq+T_])*GJZqY+X1-]b62g/:@9:!n_/TP\dO6gc[1T0WdL28KZ.#[oiCH2s.6Bh/9+gD[^G'3[k%/!$#RHG>]=Ya>"i=/a2mPUgKnSho@68FcLORm2nA>gX'-[TFQ2n5o1BOquXPthYd!!%f=Rng!77SA[('B[tWM/uRbSuea./DlE*LJA0V!!#ORVbTiT+,!Ar!!!!hTp$*uX3aE=!!(q*FAbGA'fmcD!!"!m:.g>E672p:!.^ik8I;Y%kbJ1Y!,rW5.3Z,,SJ2&(!00An-,`iXP6(^a^esRAt.0'>J*/.-[Loiuk"TSOQUX2R=YuU"`!!!"<'KRZd[L/Q>!!!"Z674(t:I_$*dLoU]:ApE"k>^+gq`K'EA+5N^>*>`)`Rq!WW59;D5fZ!!!!hTp$*uX3aE=!!(q*FAbGA'fmcD!!"!-n"bHHnt-43G0'^X5G+[6!WW593V6'=#dICnU]:ApE/=PfliZA,D^Kmos7M6Grp(W/jdSQ%,e%+Tn#cS5!rr<$!%bo-s7jWsOV+Y'!WW3#!8p7e;?-[s!.\)5U]:Ap!!'(H8HAek!!$&nP6(^a!!')e-NsJM!!$,T:'pt$!!'51SJ2&(!!$CA3[k%/!!'eaFA`)=!!%OLkbJ1Y!!!#"cq+6J!5L(+;?-[s!.\)5U]:Ap!!'(H8HAek!!$&nP6(^a!!')e-NsJM!!$,T:'pt$!!'51SJ2&(!!$CA3[k%/!!'eaFA`)=!!%OLkbJ1Y!!!#"cq+6*fWmt;Szzzzzzzzzzzzz!&2/mTq's_c$$^NIU>2U/n@n\=uJ%(/$%'"1)c-aic;f4gAh3R!+7l=W0=(d't6CWk,-)0[2l8?'ij3"aN%d3TrNu]gC4,_!!)VQ9dX'mLLR5^cu8M1[="ql9kM8VTNXo?IVgU3PK%YYiV"5`e*RcsT@Y.jG^\:rWI2W77!84sdn'Q?!!')7j!EAcK!N-:""lZZdXnJ+?UAXCaCE!Q%o)XrQ13i5qN`j6C[9e3(1=JBt`9Wt1S!WW3#=LQ/\gIXcsZ4PaC\H/%q()#H,1NM+f=`W*PQ7Jf^%F`"EMoTrV$NV(>\'/sjn^',@p-]8^"MuD*sGq>[/nRN.oINF>l^_K4:fX//6T+WJB)?*Sd9#4,)(p(=Pjes,*]F(&]@*/*!X1>-!e\\3CN3B]$:,7@EhZaK88$MXh,m#_qE\*=<"6Yt-U9Y'ms(aqcJt6SuM#nOQcE?Z4EHb<#I^6o(\="g%Z.1[TefW^Lq85"YeT!+:(?ZDnJ==psi,4tHMhIP,3Y-.LAQrh*;/_AU$;Q'GH*RBO#g\tjgfn1g%U$W"!LdSuRVV)P/s1>)4DH;Z3(]V3oC\:kc\pmUJPE4d`'(3YUV3TH1`oH?-!LsKWrs"dT=bpD.g*`om(;>J,6a5[epO?XSB\D=l>3i"DE=";)KX8g-+F3!=g81a3"#3nGE[qdUY9M)b,q>u,L.h\/KN-P:ej(J7"^o^XML26HW.\H;;j;YYkAqYfNLjVc:AGg7.*d$"+Sjo]ZJRI:!&*V>ch'*F"#ASjA5dfF@D(DBFf!j,gMF9d*gF;lj1qV^9EttI\q`O:shs^+2NTGR@;,q4#LFdYc=@R1rIPg,o"p2M(6Qm1"Y?@>/a:g=t812:P:K)-u_C(eL0Uc']STLQ4;59=E,CtgDe4'4@T?.Ij4GF((LN/G>eG5&?bjG+=&nO3,W'/;Gl8$qA?Kl,so#CZ2A!7DP-/4'q&4=d7O9Xq&RjHk^Zb3*m2gbjma9CWTNPlL,K#3!+<7&:9'6K>h-hrA6Jn2?IaK[cW=-*MsEU[k@/mgS5+E9rp1Z,:L]Lt\W+Y+7(t-UI_DBh`ZsUhT(.3Ijbr?+au:6)C2,Ko5KU.=>#L0;c5U9IsR8G?QGrSksj[k3nmhV5Ni".M;;P9/EK[bKhIGcg&83dCrJSFF@/K:9&5(5oZ/os*Z=qjh$I1[bkZQIK0?J^kNWX8V?TsjC5.^Ki+\H%h$C*bloIpWn.JmS`T]/99$8X[I\rDj$>K).b9Mg=MA:A?@e)2RLX\5$D#sC:Ld)&Qjf@S>,k>$CQZk+nE73IA*Z"YORUNKUhZBjPqK,S*>0qOJ#Zdr;Rnhq4C@P4Ib25$dQC9.4!q;B8!+h:)fOKj]h%MO81TcO2-0$[Zd(g6YFii$YI/-PI;O`INAl"3qNP2G,;H2_BQVZh_Vb3Q:qEAcRu=l&O5J>[.YTYnI:+SaTDom1XiH.DoqO7R>g1qoF0\5\UAAZ+?-K'*n%?:/8>SFZQ(Cb.>tcWr?eb9u#i4^\=ilT8<;%-V\>s$bL-urn@7lb3m4^2T5?XMW/K4"Dei'q`/retX\?A""Ij2('4_drfcCHe\;tY^GCtN;Oc?Hj`C."Vrcs0jSDFZZUG6P7Ghu16;cJ0m9fq*1Sc4YK;%1g\1@MAk"^d[SFE\YGc4$Ui$.;8F_*+'1iC6j`7'^f/T'Jl-!UP?d#OPZ0mG)0$C)5gR"^/A`;3P0o@m_:?gD&93S5gM4S=;!WW3#QJ!JF31B.kQcA^E7as$a:-07nl.ARe:0m`$0&SXk!!!#7nlt1g@-6aM`_Y;_;uNZKA>`H+1gOtFVfo=LV(kHj%IMBf`o*p]4/pURc&JT&b%@NaGnnUZC'D!_Hc?R!d=1YBThSut.[EiVs2_jQjP:l&LW\Z\MEK3e/Hm7Cn5;cqa[2[-=i!Q"h!!!#tiXU+ZZ?DL<]k/SmDIY0DFKqjlT^+?B2H&FcFWk*h[>Rd`qaC>i)X:<@=!'*Z(-Dqp'EA+5rPBsZ[G+B>R\%c;GL$]lek+u7_TAYac*9c2Drhu,P/N8[HjHZHg@K8H#\JR1lLUMFRGq>mCoO=NH4;3E7Un2'm#Wt:Lf?nWKYKB,\k(*nBK?3N2_'Wh:4c[G>_G1._29LPq6""MtuNSCbl8IP_`.FSQ:^Kh_sT!.]N,gpj/f%-B(?-^`D5>$bkiXYbLTXu2.5J'?K0O4Je9O8<,3;Y.RBjT;td^8X!aek$[(>L+Wc-Z)$>=2%0QIBQl%F`H33S[QCG=>EUna(N>:QY'H7+^/I's<6I;^O*@spapjB-PZTbG;0ol&VYm05)V95V]h1fnC1Yt0WSE1qXs?-G<7#JGpcW`IKmlJ@/iot8T6b_,:IN>RA[OX9$]U.4T1_?cCi/1B;RM[[JqF,7uQ[80.H:2X5?7b/Yq*Hp'EHqW>cehnr=`>`G#)pEJG9S)d`T+dR`8_42QWpUGi:DoJ_G*7_k:3LT(Xok3mhXr?E'_S]Ma\q!8;q1DreUJ<^RPe%?d`.+Xd]*)a=EKsU0&tf>tu`qC8q$Lqc606Q#@WMHBh/r^-#aNVD:/M0W&cLX*179_o75%'T.b;XASh)/+\GZkI\l+PDK"!m'tgj\NS&Vc4c;igQbS0Aj3^dfh%Muc?,&D[c;7fLk`oJamjI6Q:Q9&@H.W_#9nNYUcj)o]BQ+;q<_qpKp'J:)%#AFC#^/l$ch?6RYuK]MJ$n@W.31jQRXAt<:UcX@QLCi@nHJBM>LQ?)3>On.0'>JqFJ2n$;X4"O?XqeiW5B1hErZm2GQj25ZZfX@Ffs4[\UJ:YmrEYLYV$cdb[$aPgOY7gq(8N/uI2S3pBo1#,NR$VBOHN<]W@F$d5gn91JTDP5&=WU*]Y[>c]2PH)#ol41`o+5uaocTHm76RV9[/)!]FYZ*`9OGI^sbO#n?R-Xr3K1)Yop>i(#17]D^&?V=BVR`ZKUkhOncGa3AUXj/uJZKFt4AVsL6m/Gc$KoebONVZqsBL95Bju%hjmXj6>QI@MKgW)'nG'mq4im)3V.*ln/gi0GPH)#k'cU60^?/dfaJ0:UqF\:tdg+U]oqVuoMK[ZEXQ>5)N.i`McJ8X(!'pQ7aqigb[*q+6a0P8ktN'Ot.==9iZ;7aEP`BbIO.;.(+8uFS.7\Eu`:cQnO\E[;E%3kF':j0!+,l\QhlNA[PDk5?4k$:K<9EgD:XJ7'i.<]Qg:>.Z'od^@L!!&[lWkPteKZiDU:Bk#Q(.tE$/mjPae"UhbAa9Jpp.$Lt%t4?j"TSN&OKGIu'+l62K-%F`T7:-)6RV73IJaf`!!!"leg<86,Vs=VYk:NbT\$$!7osAtUQbD2If5-*!!!!QbEj^C9J/1d5+YAX1[/pG=j^0)jst1%R8,)mKhV(Y8[(PSfiJjfzzzzzzzz!!!#7Sb6+^(!!$s^3[k%/!!'eaFA`)=!!%OLkbJ1Y!!!#"cq+6J!5L(+;?-[s!.\)5U]:Ap!!'(H8HAek!!$&nP6(^a!!')e-NsJM!!$,T:'pt$!!'51SJ2&(!!'53rn,L(2/StkH@#Ym!!!#t_d#Ok74/6=!!!!MToVD6-l.`K*>33-3L0XCGCT@2J!2/3`MoEt/V>=-jqQKp6op,XZ!!!#qd"`]l37h!+Hr*"l:8b5N7K?glMnYbU]:Ap!.a0Nq!__*NTu5ikg?/+D\2sL!!'e`N2oSD:AQXDnh4$^&HDe2!5Lo"k&:5G?G/?f#U.,`q&^gGk`<[RDPiKFl1Y:5TPFUkJA=kbPF=3[l5*3&YkVF?h3"Un9t$Kq6U_#pI6lTp)2Q3[l6N'KR]0N(utN+c[#&'HPOl$0eA78RZ7R;F1Y/D!7\YJ5/^-5D;i>4/7uP6AT,=-Ue8^;F:4/FAga/SWj[P*#gpf3hVZLdSHR#_TqA@KFm.qcq2UcSWo4b$CqlS7OKL8&BBN#M@SjGK_/4,Up)X9.3X@(2KVi=5URkRT0aoZS^C"8+iLXZPG/.?.3\X(3[sES:.bd8NX_Nn*RI@al)2m"@:s[[63qRIkbREm:.e&AKh_t:UQZ$SJ66:-RFEWa+d?H%d9^AoMatLYVS)c#[_'NX=.\.Gb&_m3?>-Y_=h1r>UH??Heo$W9gq?GMb7>Egd^nMeTB43/E]p%kSs/XQ@DBB+eb*o"$.kSr=h:Am#4\3Q9T[Ce[jpL6JStT1tMN1MGuRCHJuYDm`:4;QYZ/bHZ+]=i9n[O3CKoiF]@]*Gf]fsl4C``dSf4lR(jcU?"#mmq#L2qk]Kn?MK0QJFpFV2^903P8BGYXblmD:oe0^L`>;UtjHOgGWs&[RFf_[OiS7K2f+#9U]C\GJ;"%pkfo)8mLUH;;6SFM1>ChVN8FqU]e*lF`[0j4dp"[at?Scfa"oj"$bFA`Q22O14AW1-4\!/OH(-M%EBK*:nH>nfA6M%k%=)W*[.BtFG;KP/O-)@/"-\\,=8]gO9aZJ`gf;I2Th_dIWQ48IBKQfP`s/Bk/hhetXXe#*!Xi!?mnX&8'/OjCF]#<"*LRK,jk>(k@j4rQF46[98435c?M+p;a70dp46M`-Q;V2kXPUq=`8473__V\2]Wl.el'aC`$F%j1$0+k:IZC77>1hWm`Tp*@=kbMbbZa?9FgW/LLjZdN`rb?YJoP/6]F+(/r8q.<])C)@?SQ));kj-e9DYlDo^\bXT(XOf!Ur4URPG/.?.3\X(3[sES:.gg:9A<$R1Z&Q2XL@8mD2_tJm\Gj:*>GjKlD!+n[+7g@\6F.)UTL_G[8C,h-=+:R>aIs2:.f=83[m+_P7l;>Tp*@=kbMbbZa?9F7qtq/55"f\9fF$IIqDU6[AEPBcd^9>7h<=Wp%kaF\E.,sXtCfLA5A_s06qt(mC(m\I.6hC?X5YffnHW%3;=;0f1*HeIfJpJiuKeA.d)iLLngs4^:NrJlFS]VIf%s%;tV_<'rM6o4Ja^;nLj@o.mm[6q9)j+^-;DLQhs#H@-s9;%E`gjG*mK,:.f=83[m+_P7l;>Tp*@=kbMbbZfLk4g%"Ua[FpD*H!TF/\"=57NVZ:s3"qD^IjJ1%mBsLmf^e=Q_5l2&2S\J];cD]DTr,e>c+I^N)>MNV;hNhrRVSJ%X%`iD6`"m&@[#/1d/ff&OF@P-'Quqn--Mo,n"^b<:-EallN,JZ7V-4km.UEtiEc9/d)TK#Qa_-Yn"@DaRqL#`$q5hbe7:cG3*PRHo7t^Fb_sTfG\l.2UT$f5H,=Z$@[#/1d6U!>dc.CPb(Xs:_NDtoC%^("/`.Vt+ba\ljhgQ)Kd5+e':*Q15D;i>4/8"&^<$nkm=+ePC>tF1^,pYK33-53IpIEdLJ+s#.Ji$"e7TT'WJRB?c[><^V9bX67;[ouZCbD`V_@tuL!QqN.o'(Qc^W#uESEJkOp"rD8/g8B0#5"gn^Ks[*4rkPj<;H$'p"+,KI.&Q"?4J%oQ.qr2nBohE=qp&(q[^b\F5!rNouf]MKq6U_#pI6lTp)4'53Sfq)jaje8'Rs8G_E#cIamot>D\3,c3^a6i"G=_5IE\Er8k3q^QgCV1jXXil]5Do$.j+?+'(qHf8[94B?.2](9Ro(K5Mj4GMj-.hiR.7aH]gjIAHO=jk%\m)j]raH#eF1$JYr0;F1Y/D!7\Y@&8(qnunD9:VO"C\##\/Vt/#Ejn=bS?bX2eUMLrKQ.>Z-DaQ2U.5ga%p",IT12[D2_qg:`/QaCb\dZ)H8Xjc+05Bfc7r,M\%#2'(h>YMm^V(DNR0SB_]d"Ib.uhV\c,#VM4pHb`dZ0DSVK3$9P#H&jhCa6RP;-/%q/325diO/T^c`PNiB/jISB"h&]PFmk)?J+E_$4,6eg"di>pI+a?Sp95a_Wa:-3KdKZ$r_mdc)8i>:].V4*V0X2p(?oVjkH-B:T's40*[.QFa.T,Bp#Y`5rauW'AhU=%+`bjG81//K_WJ]_*:$^W?)\-l4;&Sf'mpDTE%na9V=/C-,G.I5sJP)Amd"hk\,Oa.)dE62T8(-\,=g2!rS,nWV9#Nbl;%Z/b@b_9/U=/Z_QkUl^T>cMWa3",^l-o.C/`h-B\fH)l-#'%/_:mO-@XD*\^`&Jb$7$qg@Y/FEsjX7+5=g8iIp!:W(3eq7pDUFT)Md#[*kKe\M*d%O2@a<^73r.?T3$t`@bEH$[_401$7r,/MhH4nX/*j?gFJTg*OXSXitOd!WUYsdVn?ue+sH9%hEinTK%BlgBM/2VP^/#+85n+m8RWXeqD\_:]>G5JO/t[OUh8"cd56lB67$<#]X\EV!)3?G#IGRbAPYdDYKfCeSfNnFq)MWb1,iQ3\q>Egq)j$pt#/f8DM,::TbZNO='uCTOr0C'V.hrmKqmZ?bZ0YVSB"oL`n2*0\!_=a7;Chtk16]_/ZSQ-gE@_lK==I,H7Bg.*17C"q!+@:s[[63qRIkbRF8^H8DLV/##KJ^tDrA%YSe*4X>m<:tF(9+E2EF,eX:Ru?GbFOJtDHeQaleFPkmj/ib"a0f?oq8YXFb@3N3Wh3V`ep\tXFDJd\Ekd"U8$>Xt>e@=9Vg4RPVr](*)mF"ihdm:g'Quqn-%liML/*U9qRDa3g>]7E+EeV$e*dgqH;\G2A8fXpUc#$*X@9U2%AM\C:0N"pT3>U0,l=O]rUP\)Qe',gOe#H/>rk#11`6&ZLu-)5]e?L2M"\O>f_lOFD:*r%-\\,=8I6QYZ([AUK0J_!7YM8_7/>QkjW!*c-@P8ciRVThMRG$$jkH+XB@D\J&&^s2,t>bN:]D]Qg'Y7BIB,eP"qIZEEPMS>')LTY"VIb>jceD;/+f6[dQR2Kq6U_#pI6lTp)4'5454m+/tm=HFs!Ce[_F3Ro6V_4NE2I['tH?;O1NEXBhNf*cAal--R!-:\qeNj>SpQoq[/mTW3HFeN:?dp'I9(G"*i*KFl1Y:5TPX\QQkm8hk>-e6M'SYMB4X>RoBt1Y>qe)Pr:#.5T+_aB\H>UU46H7[6e^\b5(+;0.IS_5E#hS4mrDQ::oY^>^GdI;8BtNE5UN^(#]B&TqkbPF=3[l5*3&YkVFO8(!<7Qn#mF51i"S3^!fK.2Mmb3_e9/C4'b)5B=5H9d.2I1k^T*gUUp%r7-NcjK%?P]6R7E>:YH:R8&1\5-uH&S=Y/R8&Ccq/T:7jH%#D0FfWbl>#::9%U\>ME-Q\J.R"[reTT>P`UC_'=NA%X?bZeD'Ag9Bs^I8RZ7R;F1Y/D!7\YTYERf9^p,VIZgU6-8osAm`Rg0Il^p2Bd/!!8FVtQJ/Hs=9bmt:J@S\?DlIJ4I/]O1GF,(9e8L'$GDYU]=l\5YD:r%!Z^UJ1pK@JI?-^eg@:s[[63qRIkbRF8mlP7Ff?<.#[-V@5%R+$.0$IRW=dJGqhtq8W%!r52,;8?L0.L2_[98-CR;4Ufc8:ol99i`@+$!dEgSQi`55BCDa>>:)^m/dg)$.ZZaU:=1)1ideY=(OZRSnjqETCrDABY^38[IpNPhsYVSd6Z^"kip1]L6hSMYQ6FFrrEK<6dUR4^$2+0L[!b-($/buHXQPZ)uM3[sES:.bd8NX_Nn*N\m.\tG:*?WJdRjN\gg?T:roQLk-M$[WJOD]/m^SRq8NuOZBDe<:B''03q:>Bin'K7bfUBc'HK05P7l=Wq\CjkI+^6RP;-FAbI%.=Qp%d9^AoMatLYVS?)6M&id8KlYKG*f^Br6$9c740BEKMHiY::bP@PG/.?.3\X(3[sES::d*G+b(-]nsoVLps7p8X#D[`Ec#pHH1TSZWNRX4=o=u]V_!9N[hE6";QL>u=d\R;A'HPOl$0eA78RZ7RdKN&],aC7XLSI4R(J%i!I-U*C\*a1N`\#WYa*)BJp[+l-\F`AIL"ge!eB_&hrSb/^p-85d/!79"j+C!'?_j9/>LR>jI6"V5W@q-]@tF">WE5.054na8[VX^,EQc?B41@V,5P3XVfi)$VuD2>hCuBtj3IPZ=55`d#m`4%!Clk$Xk:"[H"l"'S2B=fNP5@[S`OOq>Z+4PdSf0#K5]1m=tXH#B4g>=1\7*@UX+uq*1T3=E+S^$@=n;0;\Nre,dPVSP21J?fu_:Sp7HXWW]U$f+tdIiEFpU9)YA>Y^7@5!>0*=U*]Vh+fOg0Rn]OMZaGrt_8K(>QR6XG]kh&K$T)J$-B9/,;Eot="eWG]eHOiglaad3,30>%b=\UbEbc)QBSC@B_NWd#Da$NEX:=gOIQ8hB4Eog2`?\13rb.]_O(n)a8FSfelMr-)]`JNiQZ%IoK'>-D\Z&)>@!2c%#BjI$">r]=^d*qpH7tX/VNZVNJ)rKEc`TU$%\i`)5me.-QY70l>+.3rhV0=njZ3gKY_#[iU21*"4Q*]XeC"tM_DV=g;rcoEs\ktqZ1,^o(b*\ZGjm\uB$d6l6PIhMc'IZEc?NtH'[0\=8!Tq^t<*s8XFC@O))DW;rHG6k1$hRO>CQLh4:d2bkZraa*),:OmM1s.FS?DqA1eIc%<.t25K*bID`n[!Uij@R%RIP7hb]7TD'Hi6_>b8m;_P%me?/*Dl`Y-Eh00tQ1\InSK/\3amKH1a6W0N(E=J'm-i]jk'7dcF7Pj[Ss5bFhbB,(uYe"Jo,$^[a$#GFM-A(0dK[:,3_GuAOl`^n/LG1A"1pR(fB0t7-Xe0-=!RaO/fifj[l%E4Cq?cer#7ioBd=kGUM*0]=m/U+U+.=XLZr@@Wfj*UXtBHZgWU[cfiM.&20m#!Rbb>'hTm9@])k+=/96lBms=dD'DI_kLaa[FsrZ';YKpC$1H%%3W9cfdF7Gu,:*5g`fml9PF;*>o=)%.hPZEn\X0U;`\8e/6LqQfDQuuIe'MgGr9a@YY%J*X7FR\qt)>=%4SofU:-Nss0-\\42&j.W,ADg&(X+)\:HHmmi2FGBi[$n,qI(h@`8UBDiB<)7!l?Q:u'uB/H,Jh+!+UcmYVN)%^E3LXm=E85uQCQfNK(FGk;uF/t4o!+4Ug+;CCo';:IeK:+F7aJ$;L=kNT4S^nsIP=&"IAX]XMqlFFi::DuGO?oX`>E`O4M*V6FnS8o331JfgCHmG-i5a,!V47o:j9Z,A6d2_33H33C]Ci(&Zbil,C76ambS+ks-=\#5hKM/PYC5f"+r@O4b-H=:5#cY;9jT-c#$O*;7J$@"Tc%Opk*=13@b.-;l4]t0m+foN9Z?\J\&h@O.21t)8N/&B;U>Dg;@)P7_39IG#+j>?P^`DVQ%!k*;r?\+:ZpOP`8,!3&_*5@lA'b)/OMV;Q9.'iS(*rNNbQO_p%[(Fj4F2=*JZeUr1jkNm3CWgi9fS]c*hC4P&X*pS;,jNr1V^KISs7h$'pGX#T3#\[3A%ou>&H;1mb-)-X`/b42:3mA.c5f3&?lU(4iar',301@7b7C6!I^RI*$TFD@_1RagPT/9BLUWME5Co:A"MQJlTmRqlUh1NC#i/.)dHR[pT$skmdUan=GDqh+c4=Nj4r).;-fMq(]_9en'l/UfPHe$O,Q--$gbqW)?Z'A>&BB8fC:K_W0GboB-:WE.](2fWsbhg`K;O+Z6F:uHBAgmA1;8b&2dWPqg'Jof]'S)_@JL<=S'=ZM@\=nW;3caKMJ9SpcZ7$`$2=4!"YcO0P+?FppH$i$o@4?Yus7#SZk#hGP*ZJ"Q;]j>GkYJUT*M.N40UAg!:`#bTX3A7VkC7MVU&C&o9]PQ@6b!#g0HP=C=^6H@QA\7))Vq5#)mrXJC9!aoXGsi-\-"'""#\!;%e@4Z:MF,pX:'7lJ6AV5)PH7H=CX,-sb\juqEe:uF4E?f8"CpVP[*2n'hoYCHSA"u0CBrrcEB;<:sP\IgQOeB"GUt-P6h3UrJi&F0aeFEK@]/6$[Aps6I4R%tIHtfKqG4chZ0$<@eZF-M[U(LaFWZ/mHV4hDKLo-k/rCb=LIJ_]d+M(aY/KIh,6?8D2g24L?$h;;JM)/=J)KOSS>Ck9;o@ed/_0+_"\j#ac5!'DiX.&dY1hq#)J0RG#/"X-))HB.IX=#='_`=S`/KWVW9:[*TQ3nD-9C#/`Y$P:4j5l08Cj\Gdh]rET4/$Q26=3REQu;;9IZ*4kqFtjc_e0,i:(LZ^-Z,L68O3I:8Kk%%"A]@c)0f&CU*FtGeH*_EoqZsO(",HUW*0,NRO@3T*8R>CEpR2QJZ:(FVNUc"nNF>["&Zl_U^u@eK:8.WWe&@5SoegR)*3oN1AAHSir:^[4]C?QQrU+CaRte/:$h$Wq[1H'_;0OnI9lU7ZE7Z69&tFpX`S1]X*]K"=PCUnEp&-T.n!gM:;Z\kkg`it\>"(dGGd:V*9'Lh@Cc^Y):dh-]CgPeVrr<=NDXa/%H_KrM=)jdUZ08$J5+RSDQp>Wc,hiJJ3gh5Oa*>#3(b%j+O8FfF/gNpRih\Y1sIlZuJ.p;">WjE%#[?!Y\BCLb%*Xbi$B.9H?_[TXPp;Kb'1YG?iBqXpc`gjN6V)7r5!a7EMII]HN::-aP2Mr@7^-$W>7!-hBIl6a?2JkcNAe>.=2=IFcnVu&!*29MYJlMauEP;_tA/"5ie"f#p"PnfW1g^@eJe#oo`>`lq(88A#tFr%C0@"@8n1]h-$)P)&l2ZIm_Z1d4aRtk-ZiMW@%TS/4-U/B]9m7%7H<(_/!m7[kF>^%[n.%BHR(;LZ?f:?Q2/tslml(jX(>)<7)T"c)qRUZFC_SkD`&)4$Wi$&DP:[oe0E.Y>9?b_QBhu3gt&LYj7t28pC:WjXMNifoS(I=2lcd5^!TIMAFd.HKNiX6H!kB3dL?PT'Jof]'S)_@JL<<.4r@J81Zgge+cit4rmZM8.s.]7jnTk=UW4&%ac5?2?fXS3FB!7(hhg@uCW"[P41"PsqMQ)2mA/>f8Lp68?&!M0Z`b?R=hT2o2*648jU@+>32d;[Iq/XrWZsD?:1a.G\O/?(BP@+Vo,nY9#5g#pn+[=adG!E"Xp)d^[Z>>k1=*L`AD:6=$ZpglhgjS7(&DeS.g^&t-_hBBC=f8?arXTpREWVG2'Sk2^MEb>+!);Q32/P]/FWnH!9m)%l<"d0iE]mX\FVd&kjjM(7fmL/jV6M%6PVmE0I%dT:U[C8NQP4oo%p#sd82Z>Za$l0?[:7gFh*l"EX1cmSLe'p]Op#`ApWpT@Na*X?FOdgX%UG&oDl5p3eK-qlgI6OPTs\;nC:L("M)\#731q;,djfK%lTOmQes['7&<;]p=)ONTIi:F'c"<%UL67n,`'1:^Q5\(%%ui_hgGu2i$cG@Q52b#:_e^Ha"3412n+PJR^A]-2YLaXQ0KagVi96kerGL//C$.(;oV>/ZMcZHr6\8G%GmAQI`lEh:/0!5\U;W%mG:^lpn`9>#67=OT3ZDqZgg,55=UW61)mAbJ0i8)q-.R%TG_DRPJ)s=SX,/*;@MlG4&7.#LLq:=p'jhukk9)`)_3DX4QQa1bc=t\UUcTS>C21'c1KpHH^f.7Q1NL_e71*uNB#G&r8L2RV]\]?GX&(GHj=Da&q5SWW$VI#?$RDSG'lRZ9dDT.:>E5VXma;u=Yb`<)#L6LN6:)tNS2Pj%+d7L*"V#u0D(OZLkKY@74"o4b8UC?(l]K5pZ[br7p<.[/S!4QMmPVfu,ejs+"o6GF/C,2LQ$i7Pq:5q>-_gbI:C9-#Gg`IR+tcFnAnsAm[ECu4LfD52)(oLV)L7C?=G3Ld-Fe6/fLk*,,N,+;ASdfqX.BS8KU(EhnW8HV-Nss0-Z,O9h.s/h^(>J?j?%\bPC!1rkkqB&G)&Er9'8FMH&7[A8N$(RFPcJjQ*3D`GtL+ln>)_@JL>;88gKqCH<[=iN>?DE#O.6u[X,bqgEem@F5l8tKr5CR&6[9OmG=qlBGJO2`rP2p=/bnJPSHE+9$e?ngdUjBG,+:NK#4SeQ9%n>+uYPI6k%WhF`oG1iaQNm:um8aaI^EpC^r$+_6\0pp\!_p'55FfaLm5m-%:lY1D02*lUDiZn`t-/G3Q2m3PI6_k0M4`$>N,e#*`;K$g.R9LqT5HO!aI8GeRBT2@rG:2f"8n[[!U(uAg[\I%E,&DbH>/E%:s<2,"7IKtq*Bb1kX:]g?*'AVsE:r`p7'Jof]e55tQf>J1_7N/l9ZQH.ECZ%8jg!8Hnn+a=B8J4."[8LpL'-&*j;l7lg`:@G_No3Jp-Nd/uRSMtNrHlPrDe^KjUs:!toV%tDeT75YM[R##A+A$jG*@656ddYWdU3cLF^$B1S@u4A*;.o5&Z:$;6>DV%.+[i0dk;&33BJ*+LX`,GQ=p%"hCLVVk$3-Nd/uZ;RaVKuNJJ:s)2mda[gNm"OV(YZa.r6m:2YIuTS:q_M$rL,`2C^_+=6!rfkFa-h@1M:Fdh5[5m-%:CIJJ"++?m@4*QnBc_Jg6.Jh79llVtLNC6("I,mTaT1$4GT;^QOVKhi=r-U7Zp8Dp)_k%Be+?99qr/$INY8c-9!]fkY?QnU#H\S'RD!CAqfU8Q8OeCl)&,@=H^t^;%,2YO:eb>m#LS?H7`)9K\ePt1njRR(YZ6*Su:+fl^Nd\e90MQ3D@h5DBGZ;E+E/a@63rI2X^>Y-7j%0S*+8q!`:3EIL%^#@Maf]9tYKW)dH;d'.R:u"88],'!JFj61W\E?]&-P9^.sOt=!-lpq9eKcdKEm>c8rrXZSS!bh6Lgh&&Ta#cFM#=6YJ4]Ld)Tp_ZjT4kd0Ffp:aL-o#PFQ0;96HH($?gfBVuS::HUn*+k?+Yjh',lcR.>21m9#e)7mRdq-TlFO+VVLq"g=>:V<@Vd=r80TM<.3?j$"EY'J$IefM$)86b''8,8:c=Z_mg9S)Vpo7/HCLgq/apo'hgE%df\_p*7H8G7MN0RJZT0,mX4NSdVMp*N"9_k*u(n>)_@JL?-o#jPR/PCa"SPLdmU9[+kI8/H8)IJ92dnSu1S:CpODBGYOH5DbVq8_;a5r;(2\j2:4#O2D`Ye/.rAURmNpPV7`H&,0cC,,L/E%>]UOm,RG:Tgq<5q:J2b@R$>H/Cj9dU%9)R^g^5.BUL4ofB@MT5s!LD$Gk[+6]Z]Gq65qWc'`!gp`O#km14]@EpZ1Yq252^*u4/RZ4Df./=]i^Z:r#)UZ8Z+9:C.OMI$/fb@Kjo#FSk_mTf>m5O/0n6S&75]AS&2"29O4,4[tr:jMRE[9''H2u.S!i2)#Q"e?&a.0Mq5cO-6X1]X+HV];s%+8Q*Zd&a]]eFCYIeA45A.AOgcYn96`%Z*BBoq'9pY6dsHhJ`DHLXs1;nQ)Y-I,k>(9m%Sdq"edMm7Kj>1e,]mSXNoH.$PJh2,(-GQmZGoM*:Dpq:=9`C?3p'K(oB;-PsmUjgB.Fab;6,i"2X#rT.7!HaX]GSUBEIbY&0,)l-:l;`FHpKA*ZBSp6+jU$99$nRBo[XDs4>&1d]/5$.r+;r`,aRs5uK(%p0uD_)CV7NHX]O&5-V>+Lg;!te)GaPJo+`&^PZ.iJ5Ghf\Bh"(FC%t]YR&=Wa-L,bQGHM8GO0W+GhE"hfrF2ml[k8$]O/PF]GH4%^7@.@kG*U*!P!8]70'X$IZ_#\<9Tkr&;Y-Zs.?`8.QiUJf'p'"@1Vp(KP$O`m:mGr>;k&NX#fVs2K,4=M?S2+-"kY.Z;VASN8nk.u`:btjX0n>%E!=&0-o'Qc,"U_!Yp4Y(bTciA;gSNP5uj)3B,ghkc/.f7:8M_;()2V!]2N9-'qdX'>&5:TYq.>L@mAkOT;Qt&5@mac\^IU-QAI`UI$kt%k-NjL^3r@9hq8UW7^?$BPcVZ]d&3Z30?#_J_@'g*pY!'I5U)]U6eH^dc.:MN!+aSfN3dFLHpCq)-HlXfdH7hj+h9a':;2rI9,f<-pJfg(fs<7Q!:fY`-Fd@Zd[::`a-PCcO6SeQc!W+Q90$5rn?WY7=,XfWt1;bQeF3e-g_nW[3YAI5/#j3Z4MUaA6=P^'buWA+gR:G]$g1Q(^Abg^LtaVDRi%QMlJ]=6;]9?h_0@.beq,Va:^)X5jl[,#@X2=!iWFOq7MqpDrEqrPF+:&^5thpV-6h4Kr"d&N%mqWpQE]&'kC/,R68#4FF6]lJ->W%gFHMJI`;Ap[\l=Q;QbhosCs4B+B&(S^kS[8Dn.T:tFSrN-+h\W.m:F^/8ZpPB[c[NCT!2a\JZk9''--h@9n'FkGbutnc&G(60bM;RIdAK+cePi2(Xdqf-O$%L4=LD!:sTK?'Jof]<%%(gg@BNAaeeQSSl@d,k]b\-0*R9CP(hL@cFfTf%''b&"4^nMd`+C`Stu2@VjL[>ShX!H:+^]gj]cAcQR(0()1E]Vk,J:OQZLd)-=;2Cs2i:anU\dmkAPMRrS:^C(:ZQF@e'#kcZUa+]qOA]F/puk;G2_a*fH(Ve.Hk=#8Ke@kH<0O2TE4PX[Gor!jQd5f2>3h6\NAE5Q1<4)I!23jp^-?Xd`+Bu;=(kT+Z;`D,M*GjgR9K9G!#IcP'G3;7_-bK[6o*?h,OVS$9B&L;@%lISeX@:BE1//Xa#e-SKm/uf9=A"G\cB:QgN'/CQ4TX'Om+e<5,2i>:XRCPEtZDo?_/8e7Q!tRuOVV2,DAZ]Uj:plqp(8dpAK`@>fQ^=1Yr.0`MOGTPC8XCKIFU`AI26`6"NqQTArZ((%qC4ud)j(e6635*gK@`gRWJN6"C^E/W9*9K7'f;Ol':")/Pc]&AV)95%=ff`<+PMV6$PZJpZ*!WrEE*6U*5P^I;ieQD'gJhon)*n5plb1$?`l:8Vn(\=kh5a'*k$X[kCsW(oWo,:C8!?:MM;ln#,fr".0eVR8S3fn^/)Q:%"A%h1@!XSI@V0eDZ!,Ab$m#07t:PXu8aF4#cjb\P1U?cHaH!(htdM!/NV1D\:UnEp&-\XTdn>&a7eZ>u*j:m:u4e)gTgBC@[)?oqQDXl6b4A:^2V]t#q=8.td'aTM.Hk=#8YHV14=Sn@jfBT9qZL=N0l2,ET^E@R.;/]Dl+5#B:Wmr:(tVp5>e_]E6!PW:_39IG#+cNDQ_lB@*Lf#ZZu@0\r\K[BhKLA/kT+]U#P[WY?F_bm49!1XeWG]eHdD2SHdM(!$jDD"M=Hk]PjU5hSi!jD*KMS&JtqC3j;3UGHB1aY>ZlHghXU-TX.r1_]R0A`]%nok;b'?]/>'"fr:K"1I:M=*4[UL&_gC0o-UpuMVX#i$4EVkf3]>5Y4qd?[*t'[V35*-acecqSmXlc8`p$=a3QpkNe-1FO"V#u0KqN;r4=TK)i(9Vcaa6.hG1iHM3Z'o)=kGIMpTknRKp6MupL(Ya,lG1M**Ug\#Y]m[J+Zr_-XpDl=Ilu:Ms4K+Vp_j*j\kGMV;PO;)>"EAs?GArmc?bf<`FMR;*Y*8^oe[7-SW>euKLMC3%G1[#T:8chuM#HZR)th]umJ2Os.;g*<]DM:*LY[<4fe4i,[5O[L4QbSS8bTdW+0W;K*'=q.3P\E3+*7"S0Rm\/-=:BJ:E1:Wr/O-M+F$f2!-hBIl6a?2JkcNA'P`uE-RH9H#RcpVc7@u5H$+(f\@-k*?kUKQoIje-k/sQ%ZgL3,1QOH$6WhI1j/S)%l.DhD6)4Ug:/RBA^7X.CU*H#-g32pt^NJh'P?U.i_SJU;6[K"Q0!.j1V*h_%e*P]\O^HG8PC?HkfCq\$SP7CY=OcrgkHi']VQ[Wf>+GcYfGTEffbQ2&bs*R90TnE9#*+Q5^%0>FB$\[YEZqKR6Q"Q0+OUk/EP[ij#/HEh:cA]P'Qc,"Uen\A4_]EE+?Ul]QPFQjN-T9oYtHG'h$0+SWJ&q2-i:-!-WP!=e*Kj7!-hBIl6a?2JkcNA'P`uE-`o=\7kA:[`Eb+H>8^W7>_g"-(nV#(FDNZ^#^")T&]Nk^SrJ-,0DKq6Ar`s>$#Hp_EXhW*l+7=ldEL:=KCsg7&\3s&QIAS;)BNk_2Vhb?@&n)7;s)E-'qKS#%^@Nf0l]Vne6)49TE4PX&CaF+-O$%L4=Sc4EDN#?lSgra`+i?*5pt+kMo%f(C>m1o>"rQ]ZdHdTS]'/-)q?5eH=cW>aYW6>:%D+#AkmNck_^L].D_4"#/HEh:cA]P'Qc,"Uen\!NOrtN!$;;#_oN>I8a1!=HCg@^JXV.9dUQ:>MiM&R3oD#5N4pfA7hF*ge/=/n3&iFANmE)n=ORQ7]L-ccgTl6=pW3r'1MjonNf)?N(-F$Z!'D\5Fd(`T5plb1$FNOh4XjZU=qfhmT%/+c@q^OC6M>KA'6hRUm^Z!+OK:Q'*=0j-l:>0loD1\rZc4W?1D&8b0]6_odBcF-$m8JW/f$;HU+?IVfGDMf,i>$d>hSu.OBqF`qU[B$f2g/'XrUSDuRgGg)k0,m627\SlXg^V4Jsm<7.;/]D.0OdWi(63^"&B939C$oP">OdU8"2AR%6Q*>`MpPZHBVWW)Q09Tl'g1C[i3k".l3c=V0^IV'>_DJgWM^T0TFb$g)ukFZgN@C]Gc!\r6S?$VhUjV"]#ID!)Eqfh'@5Cd)j(e6LE44Ss6b.JMG\o9aCPi\k'f(Yr:_]4[8@Ii!oR],RGWK65FaPN!.FGk2QJ$d8hhG`&EKtr-\k?/I-X+g8g,%>cZ%bkh:qMSLM&TUPmSS/9pjp/e,i-NgN]k(]>32F5a4+s>'Q6XJim]IR\f,nh878*6A!d#Am-H7KCQ5R?1M`hgae`4Im\BBGobdp!bmL$V1]X*]K"=PCUnEp&-\^8#1S.Q+ll6rL,_qEJ)2KZ3SmOTC]6J5YCr/7l/r0V'h)8OAUj]FOAPn<*=$h6=:*lXiRE"i67WNI'E+EF&p;6FmbNBM)cAWd9mW\+I^U+Ooihr6[S[Ea`fr:hY$sq%&Le4,OYrm=p+mejli4%b7293kBbIbqUI<9"K0l^sugrQb`KcPet\k2,>ai?"c1W)j&g2/ok/2V]&0tVi$`.cYb'2u?1DRV$q/3g8[0f*InA;*(-CH.1Y6-Tb.'Jof]'S)_@JL?0*-'Oqmb3eQbYqs=FlF0<`i"UmA$WX6%kAP#1p-e]W_d_.-iJDBZcT>>!Cs$MA5-97.c>eWOp+YK4`t,_7?2N=TT;BH8bOa6$5$dX$L\LH*`^@d!>h44**B&4I2nu;gcHP?58k2`q#eCDO8arOK!Uulre4kNB"e?&a.F]u/ZMcZHr6\E?]OG+lb13)P`r+tBBKuB8CRG+<$3aGn5Sm"h4SkU'A7j=79G55nN_Wf"lPOj^1CTXQ'i)@gcQ(L7NFQ6WVYM?"iP.Hn)0'?b09o`"S34Z8@HMsYr?9:>>O4UQDD;i]\a-g4Taf>.r_[t="n>)]Xn>$WF9nF_rSI@V0"Dns7d>_t4"+maV]dF9m[4HQ#ciA;g#jNbQPCcO6SeQdbMk#Pt$gR:b%$EsE&NhLU!'D\5Fd(`T5plb1$:3E5dl4SLNo?\&_Ff!oo#*e!,C!,5!-hBIl6a?2JkcNA'S8AQ$b*GE_<7A`Y]+d(o#*fL,^<56!-hBIl6a?2JkcNA'S8AQ-W[S!*Q+iZ$n9\<_39HT^lq)]2[Q&iF>E?]&CgNE^R`&Yl*TQoJ@\PGUn@bXU_)$MJgU_m$p5sA5u>l7SeO!]SeQdf8arOKPCY*8+:.78_39HT^lq)]2[Q&iF>E?]&-P9^.sOt=!-hBIl6a?2JkcNA'S7I+B*D'<)?)]Xn>$WF9nF_rSI@V0"@5l1$D%qg!1jmV\k2CeTTapSKcgZd=i$;R#/HEh:cA]P'Qc,"U_!Yp4Y(bTciA;g#jNbQPCcO6SeQc!W+Q90$6$]B.Fl!/"$t<-QOBB!F=cpW&-P9^.sOt=JG]Bp(hKXZtdV#2#f'7ng!.#H+;@%lISeX@:!2*FF&l3i?fJ0E?!W_Fii(5'tJpLJeU]>qShKk*)d]'2pWtPO7k[!+<+UE[GqShgV&>dN_8B=Ig!'5juQPC#WK,:1!r*#_F1tV\GK3%SmEsO7VeOmh/Fmktcf_l@]-;H5G^8+UE[mSeX@:!56V4]6B)ZSXc4W3["KRhW8hA^G%kK,h,\;jLP2]rWko`#]HioIfUIs$#tK:H\0#eHl6V!72=jo?KGD4nfqA1d(H\;n$Z#Z8suG[#KG,mN"<.,SGr];W1R)9MS@^_a"(:o()?iIe+MZ;[NL)4icTD5>I[,qtKP`SIbc$!#AKa(8K8*Mgb?^Rr;K$*!"^:_SX0fN*mEdfN%X;U_^W@o#p9>g?S;3!'m`,jN%q]r4`.'gK#[)!!%P7r8JO-Gk/s(aV3Y.n`,,pb?q>G%KPnZcCI%X5Q5op+Kk"Vn?"2It,dRu7`WOWJB3gfsJcpQ%%c&ma)H$S*.KE(uPfM^RPl`Dgfi="]YnCc-:p5M#fYW=cEC_?^Hn,Ekb$31&H`MH4o8DALenn"j8!WW4.lhK#6IWbGT@FG-N:J]lYF3!S,!3gV$^OQ:IdA(MV(rKLg<[SFY!.#,HP"5t.mbBh''*8.6@#J,i=aBA=a%57jc#8(&^%^Bi3]R1V2-6tfD(nM,rVCZ;'*nR<]uQ`s-g=.?i/R/XA0$$!.`>U^%^BQR@.JhmVFdsF`IJdP1eOA>!knG^OH,BRmfRlbMW#Vk/3l1q\&N#QOk\$L*"hp9UA;:&PmBn:a+*ktb>-#CqimgY_ugh\8QSVa(+<%q#7o(WkjfB_;&6s1K`#!s!kCK"X2Eh=#f*F[?'.!48A*r8JMg55?IjHa\T!5#QOjT2Y4-PqQF]\kgZS1p[6kD3]R1^*0#.e9dZ(J[k96aD-<#%!2'S-Gjuud-j9U$0&us0qt'FNX?2tJVl`](!8A7:6"9NN_M&@uVZd&#\s=H?Va^J!;M`u]R94&#g]AR)cdL!<T?4aN@"gZ78EQ3%$o+h%$J`uZIjEFE:llEgNk_"Qom\)(T#^YXJ?IB1fu!!&Z(^]49$fn,.FSpTlYJ,,#QaT8'd\U!cnZ_cj2T=6j5!!'7:q7FE=449WC6jC=Ch0SY6-V8CXorilD^%^Bi3]R0?b('?0IuKGLPD]1LmsWOIZiC*A2Wjnos#t-iB4bbW:'^h"!+UKWo:NAJR.#Lu]@_cNJ<&WU^\m33`!!'2UdJ^9=o\P1]CP8ps-bd?O$EVg\QlR(/H>bNo^EuqWDq%*ZiC(7aQN0]XjN2YoHUEc!WW5TP5G"BZNWsh9ZHA)!!!"t@X37p;[Ng!#s]m0PFqc+eC-r6EoY.KX4%+M!8E\*IIDNY+oV;Qs*Ld[!WW4.NJeT+1.1ou+91!YZiC*WiB]"2X!=o\P1qsjOKYHsRBn%S\%eS,$a!'k2$bg+LsQMIf+*rG1tIqj+H!!&lUHhK"i[Zco=`F@6[ZiC*Ap4Gfk?!^jG3["J'd-KK!GOO;Dr\eJS-RL0hq9*,KSK%W[=mk1^s/g3fMcAQZIeL+E;T\4b!!'emj6G0qU^@"Rf=kj>63%"YVg8=@pKr72-+7kOAcMn:m3#DroVP.orplDjr3sH>c0F?i!5Nd;h07b)r:.g!'7/ie*NRWj!!#1)h7IlII>F2rj1.s!Yc[=k2V"$Qsrk-cq!<@YQ"bm_A*oZeD?iQA-Dh%XgX4%+M!8E5MrpY[[.Kog&c%?t`WMq<`;?4;"A26aAq_u7Z%BC-D!!(c.HhZrVnV^a"NTWP)dm%!+('"?u2VrfL4Z8Xf(fJ$C"/$J*o:Q',[O_HeVm[Q`X!j!!$gShK\(?80mcY@upTVGJCIF/H>dt%@fV1RWM.4+$TV[s8ChUVZd()eXSU=K!YOBFP?#5!!'fXipPX7n%S\e?iTt(WtPO7!8ARGU(ZnM]4Z7i!!!f(rql/J('*Bjzzzzzzzzzzzzzzzzzzzzz!!&C[/BaGd;3I`&7ZtpuX-7$2R6ip9:sM^7VkqSYQfWF9;No,@?b-_&6RGaV2bWYkrehQcE`_W%M*%]7;74TTb4Eb(<04J^5rZjs&nbYtup:$>YAQ?]q0UalNoPl*,Z9B%`(0UPNq#=p,K!.TECTUQNXpUG?O=-i,Lb?5+g:m#>E5eUt](=,2069P6.s?+?]pA35qINjI]Q$KfAQa20e"h:N"JM%e)'7go8:o7tQd`qZF;a:JD])dA8TWrIjGKsiS+SqDRHdV1jhPCVi:H&oO\T*_CE]W6T[S_[b(WCSEGt]ftq]!-Bd)H;6Ne5(DN__'[QDT%$GV!/@/tJ;tgTQ:4T.):B(qc@n9B?\Bd14UA<6;EEDQ.qm-LQ,th1P#_"^OMcIg2oChs]A*L]1RTbUkAQG]cT!cc"iFj.8\lb$BqEgJFT@/heoWiK5q_?KeES12V>B[Z&SH9@dlh_u2XQh0LE0:(_P>UC#@G^OtTcP)3>Mj[&<8daYSU_F*^j*g!)!C&SK.;'2A<[u8>-qQ`^P9`T1S1i'Ln[-Ua,&%>XICYb"T@-++-^cCf,;GfD^f+@XVh<*C-og?UcIsE4oIK0R0HBc]"71]G81:**RN.ZqHZd;J/sk1mMeS'1FqIHBM+'6?nYG;gchnelUiN;NFG:MLEjI,\6"qt&38d"MBp8'IIt4'<7uBerkb!c/QA_0b,GT=*P*/^tjq>4;Z+6Bs'Ir3KO^K;%IV<6#'"!A'>VSX(QaR1ukj0MK2H^(OlYX?)73\n$][kY-jkHL/4PPG*SmXIWl],8Edb"-KOfUdji8KP3295)GKH.B5TNQ\q!SW9=Pml2$T0:UG]fNuFGmo/2G;(]ClGD6[eL%nBdW)\)Z*i]9m)!l%7d%!9apP2S]qiT(\oOeBuuR'48:HIpEMdcU"VH?EdZ3g99$_Ot./,SWcs@rehL;)J741':+p>c&@,N2r<-o0gL4I!Wg%dPc=`Fe4hOF!lZsQN)J"4Yo[`ndVI[r'rT3+XL?3pt5/Bk[]2[j$H@tVJE%iY[]Zg3V@Am+?pH6ZOb6iA8P4#-!=q0U:fAm(!Soj[o][TjX1[6q>rs+nn9;58^5=fj*)M11N;MVW9D_G$pWHD3U8:m)6uE:%Llel#Boj`"ijf^G(rp0E\kOBXsCSF\j$d&,t7cepG"!07;&8O,T$:!9ZSNHW]C70gtIs6Y##[8CI,Y@lVMV5fbI,bL0BK`Z@@Oh9@V378/5ZjJ$Sbu["A)>jh0:2#ISecGrik]'O+Z@6h8DAS7BZ3L$VN:Wg5e^;n6Q3NlXh[-;QV#$`hA<42aI3ddZfpnVgk"eUE2d2CTEgG0W\AMP1a[;qra48d0u7JA4d@2Xms8Fauf475p_+t5Y93m5[1,"IOo)cGA1I4&US(R\bHj)pG/`e,m"rE/_Q7BeL+c767jfa4`s27L;sk"/jZrTVl?+RZV,"1L]Jnr&LGli>0>)XrKTpkieW\K6_qOOV3KVJCMeb^l/W:Z;tX3MdCX:rQ#?<0&8#rod2B#KhBYUN$1V0lnC6G_,FV[Zk(Vn;I.p18Y/Oc8XiZtLI#Vl6s;-)eh06Gs.J.j[3e";&4D0##4)P4d@76q8mj/,1!P`Pqe&IQ&;(Id:n2T\kA#'GdUt3Ke&in,J%`6q7%QW4dF^q;#!H^ik=UenHm]U!lahT5D1=N6>&@onY81aJ/UX+UF/@XEgnn[8Hd\d3O4T_'bVMi)W!UD<$g?Du.;5`+8;a5Vk__LS9YOL'kcl)_GJK=j)<`>+ALFUT&F_\ITod_>i4"6f2[B;Ja!$1hIXa$s3aDSY[?'tlD9^S.TuTa>&gSjspj"Te4k9+,)orD7fI)PKP\InU*Xi3D)O*`)4d&cb7mIM\92ZW6q'Ml#Y!A@%1."$E,tXR7\g#n&eo#MN_17SOQcC3//TZHlOaN(df[P+Lo;'XnSs_Z,0;KlJIHoQC]-mg[/s=-O5Y.t=GtB/-bZ,AgdPcCqBcbsLmr="I_*B\bGP]en7hF)\(U('uRugQ/4>]V^]+>>E8;XXar;8(UW5Y**]3@aDlbU8j)K0cMrkYmJFK1-UKpdG!_-U/KQCV*LDGi!=^LitjURpEjC\+>B"BI<3>q0D#bF#eU_Os.TkEAUn+GW1I9D8C1Q[au_F0%/I-lulGb)-HWZV+RLNT&?bjR()d\5gUl>[(Amf[1"!RHi^g.E@801"qC3q%\[J($(:@C?$2-Xc9)r0._PeC%=R#m:o@siZj,V?6?jYASH*`q.ZPR3%$N[VaI6uQCA]oA=f#lLm)`=:7ho_jJgbpT\WatmPBH;^?t[I6lBV);'&D!pii&e;GT]:]#9T[-2V$Vm>B#uPJ=$`9TMiZV;QQ,c1.V@mp>gr`GY>=<1IicJ1B@_e*U)(6mHC^N#AX4mQn1F7MI8F9/@4FEY[=!etYI9ERsc,F2-]BB618DDA6AC^rh1QsHj6bHhDWo&8e5F78mbk#:J\,.CJ-2j]8VjL:\"/[*-p_^UA=C[:M*Y>I0^*HIAd+OVuhcSB-e2\eK6HF/^"KY!rXXOuZQSC4k@VAr:?RNd9nR]@U=ag-X'Dh'>JB-1\=C,"Zm%rE$:&`KN&hJkl;?^/urXCi$QZapi^LXgQSOh3WpC1CHR>^.N%5XN[H"LI0^AeA@EM!N!qX*[0Md[puPlSLL[HRaqj_r$HG[.O[YN`QVLac_'@l[?&>a[ZF8;oQjCkeNp`3cJ"'<*;Q`^`1E.RN;B?FrECT=-g`s0*\19"k!:G7_cjrjFN")m`h-#99kL27:j\[8X#8%s[&OM$n_77b-Y4SaW>R`BD5/JAiq=tf'M=e$XH'*7/=gmcNb/s-9knK#PuhD:gBJ01"=J?7map$h[6iY\.W*.hlP#AiZ^33*.8Y[>Zhj%EG^N.6KF_e+$;ti_K,q)gj!-N-aTqs,<")&@JoJ$55Eue1*eSr&U"aK&dOaGN\P9a$jp(XHIk-\@>69=3[nY@p_/k*/lciTW1O["8/;cBd("CR-Bo:Xm![DoAV0XU5,l.]r)KiVsu8b?OKkP#5AiBXa88c%8MKo7GWUF$Y"RhK.7caBN>%qkIXGT!Y<(?>\8]U]jQJD!oE6qVn.cBKZ*pKo4>GnW.^L'Geb$TN;i/eM.]Bb<0++2JZUTIEB=lUBZtnN!nV5l'3L(A#k6--6W&)L-U;b,)BS$]aVPul[%7d)8SdoRCP&/YPK,a*jnr?4N]8Cb#6o4+I8YpV"L-8`'ad"'h8IST3W@q$ETr+%]P-23)2Wbg6`LL?l,,moB7q"!FW&afrVZtOD?fTd-62P*3kqqu=CU2*Hf'Oe%dXii`2YUaGGJpYUZWKa:k&@V&AFG;k8m=\f2T7G5N%:^@L0r%=MsP;SX)`?B]np"#%MTdE1lO;@UZG1\6+VT!X3?-#:(`,X]^+]pt37SlGI`RF>@kKLE*ffsj6+rLq.t8F-^E]1H5!3%);[,Eg2-3!Rejn=XQaDlij;`KUkY28^jT/Qd@tpiBd95!?falTRiF4tVsnDQf,7>g?8H%[^!/f?IJl$)H-sZ>GF2gAiLDM)Ifq^-nH55tYLhk*``Za(P;\nWZACZ[h[Z%tX:,@*A=.r&Q?BkIH_]?87il?0U*bHs/S9/L)%F_X)]\?Y7+unVr*c;tY_Du"b@E^/5qC*L:s:V"V-juEFlT(#Kpj;hLYXZ.Y4\tt'6i%^j@F(Z=0CGmhFK0Qe:!b4`3g`&(\Tr^l+"1*hXZkGh9;[sFIh#.]T)#=@lAcLfC>ZBg;Qt$:[+1o.;tn-V$G?Rq(A!/oqoK-L&%m0)*4eKB]JJ>6m3?:l*_gNH`]"ol^kJh[%)Kkc"h.kD5pllRAkj?cusH`Ss+P&;IdoR<)Kf"9qJYZ[5hF[UeTql6Q:6YnN"k0.Sacu6Y^;6\>M7BJaYIlp3G(aj`QFu[$0q/D:l7=c/tU6if7t"@0ZE8RJ2N]^^"Z58[el!mY>FqCs,/"Mf*JFe.j#C"BB/QkX8%>[3>:rWH^72.aH`mVM4omb@J:@Me7f<-,H`j&ImFYpI)ll?o[0<"Bb9$)4n3hRO)$R:XB;AC,C42[JDE*mp3EX9"/bHdKS;=Lh_DlicFUns"-IGl9Y#6)3Ja>rH)mXDQ\ot4>2i,;2&#]QQpPYn2(!%4-f)GTQJ38qrMDV%PB=&TIE04f"`6_((_nW;[#2hn[GT![2EBAJ;JBkGGJgZhQbWWKS:E$?oY$5Y;>IuPIA>\Pt9_)IdI!23Rg!Gq`*pLf[rW\:8\:9Gs/b>d?V,Q5S:J,u-Hrl-L#e.u[pHc@GCCR6]dCGduR8/p_P\oI7?>E6?)4n5&N@fS5+&m)hPj\%A\u0)QbTc8.RM!4baNW3WCo["XqpDi#iYXo?J&Ag'(g9"01T[)=ah^5ogF,eZpS4h9id-Em1k2*A9Nmn$_VVnCRG8L&hAQr*iWX"ZDTGPfu13XqslCQ+ohAC97;A!/`rdS4Rp;aji2KisFuf&#S03a<^i<#6')[*,1&4!uuN8`Q(&ii(_=aOGE\f5=!Q4lPO?>Ib>A.anX-g(efg):lMZ:F\;eHa8Ji,#rrnjr_"-8e%jb/u=m+\mn1h:9:W`ccZOLtS75Y9&q5@-16#SJi\h78eCQ_+D%L*I%^QD\u.*H-N?Y%P\gi7Dba#FAeQsO\5nHh"LG3`s+]+XR?&S?r*qI`)H-$:c_[DX.qM\k",s*jIU2)PI=;-=t:X,4R'kIg?M8;j!/!!=>%h^^-rN&cXh4s:GWGA>7_CNf/b/B-Xi\Z21hjVtU)&Q0p_DbT3Ff*Q?Pg3o%DeCY'"b%*8/.V873;D#PIeZQ5'7F]GG]$r992:Dm+=#OEd[hW0V2/?tiBaaT8f"@OZdlr'-$gM>.l.58qN84)2eP/h@%B7fW['_8_")&j%K\.U4-G-J9@'P43b<0-LD9ggTnSkZ:i=Ek#jaZHQq?V;?@6'FtMAFCRjYoq\n!!(:q.$U?gt@3uo:8Z@)$04f1OR5p$MA?VCJAF="R9o2d_-H#i)BJ^E`G^KP#,1:0A6[hgK/ugKW,^I\X6^&4^=NHh#-hI.=-C9e>V-QA*ksF(lfWlqkPr5/ubQO*P+eLP3RnP/A@dt=cBMu(8b;Zg,J^uqtZaj^hjOuh^BB^e#O8,:1\N%jl>X"RAr/hil_+BuBm>hlsaeq1>Q^EY+jt]geT2/%HE&9")I*1T7CX"1gC$3AT#C`R1(CTDIUn[%inW[GUYkq>"l#LGB2!afV>.a71(EL]h1)]dGd`E=t&h.3E.EN6\P4R4aajs@m`*soaqWnB#@nXd=3M+OL4^jrQg51`"3oPIO$;"ekm)`g:8u!YCAtlqFg2,$f)G_hA?[lY3n-XTd\EkYbRAIYd3;^2%=0e/)05:..HdK]Ga4J+Rar7G>`B%:$[gjgA2I-(8]>-nPppspEHZDG2UE(4g-RjNDp>7%4I7J?`IanOO`D#(8SL9"/ULCDUU;Vc$W?s[e9[@)(@__QG3R9*emn8:\a=,@].TFULee4G/KdWEV'OHbY/3r]0dHAPXjn>NZF_rgf`bFDoq_0@1q%d20'KQ1-R4bq8UiGTE;9Xa/rG8,jd:l-FnVa#m8)J.CY!aYMJj<*iP8,L2Npg(U2brAaR4uSU"k5ID'AYtGg\oOVP)W%+i0@[%&r'SP`RB9G$dY9:GQ>0FpjcXQ)b-]AVr)r=o3NZ9ZJ"i`.+Z#AkR8n?X!MEgk%=B^'g;O5)2s*XhE.sc'(&THR9iBV!80ENRCV6.qQs0+6ptE@dUI%D+\i;I@9%c3umW=oNLH/e!b7W=gO]'TRB[amAlqHmlNOl5:5o>?3Xuh>fG+a&9L>=%S'>Q29G-7%l9dG1@:69C>1%O\?fd_es:SZ\]O[uf#!H707p;_B-N<,Tel1g<'fGg_QpD1X.#Q,NfHnP\[mhfV\>ls%Soo*#g*,<]BjUDY\rl[PBV5!=;bj^0kL-lY%K:YDU#'5!t&`a/@84?jB<@?C%6;]kmM8[c*$tjZ0'Z?ntaO-PERd06DAnIe=%bE<`ZVQl:fQ)(7'[XFVNA-Hbbrpe:Vc\eXCTR*/MO%LI[h5dXK3R5/S+2c.3dSHP;:kKfTOr#La;@_O!ol\LHXkq6mJC-//F+2Gt,bg[U!Qbqm.0%'LZOY].5"'6P::1]*df4XsCKbT![2+1[.Km<_\/@iZZ.%Fti"FkOPIVP`aDYHnM`s'hXksX"I`-DA'&t?S"j<>WSG$AYa@OYSkR8+N:XVcK+0N;KHnN.5b2&C]@-%S2Z7lgbT%H9;P.cef!Sih'M\O)a&i1)FHla:OM2:smbo%Mo)\+K5m/"o[qN(k^bf#hMXDlQL^Ot2i`/]Q8IB?1f[)(AM1GH[W$)WcT08sp*e1AQ7?W%F*I2j`+*B8(WYtd8VXPm!YQTQSRpgEbV).\,FF609KVfRJ_18Bd'%iNM%0>Z-V!]@N3i9p=#I6?m_jbCCTOtOHNWsA/ZGook[?4X6adn/U>%6eQ^LDhB8W0Us`.=l*KNJoTh@MlfOd1=tg+#q^_rBL@Vq(>o.u,N@6QR[6;on,mV^n=[LLWolTrs3YG3apD"h=k!+&=0o?ThYg:m_VpS]hQI\Ha[@#>AW\?(tT1$QB'G!3iTag\s)Rk'+nCc<8lI4g83?QK=?qT1R>Ij723S9I;pSa^GT>%HJS7MKE/O74osa3\uX9!!!#G?8@44E\8B)R@/oP;fg&i:-r&Io-!c-zzzzzzzzzzzzz!!#9Fn=/>5k5>&Ha^jtShu.F>PPO,9rElU("9@*JI.)F>,H]+8n%E@V6GWWYhYkD]<[IS`h_,ZSKFec6a:0:n4g3YF0G5KHiro/+5`P2DV^A@,es86N__Z9`W%=pe&=24U^^%^B1f3NTWs*ak=f<8Pr/pgCpNiFbIr)3H&Eph^Cf`M7o>Q*`7ro`e?n6J=Erpc&Q?+VG16i_`^An,=\C23%`WDhfOjNO#J^\m1H^\dF\fn0?FoXt(h]AfHFl02p8!s*A1"9JV-f6dAdC%8P0cpJ=lr:.h57g&fO_S5g)Mm9NArK!KChgbZqDn\e!"gB@-^%@K_#NT7loj;8@"MjEorql.Kr:%V`VuG2F;m3n.)S\01!"Qt\T7-FgF3j*qeEM(hrV"us5X>%9!#uI(h;.(_Nm!bBb8pq>>O+NQj$0,]l7)\@"n<[aqqL"=NsG`)gjJ\7-dOpHN;cuOcpJ>Wo?KEVDVU=:-ieIus8MKef)M$^HQW<+Tl7[@`pIrY[^M'cpP0i>pijLMSa6ph!04CNQ'E_gGX?>GB@!1Jm;IKd\[a/9:]To[n%JIepp]7:(LE1d&-01mp`8:`GM[W'JHs+hqWZJ,]jA5Q(0&:M#Rm!+9*%S"&l[pYM[+5,s)dM2Ee^06!H:#aQ^==lnk&dI^TXj0UQ7U%4X'k+6@SgdhjuuX#t5buZLc2%22St7#%"7+p$+9'N'I`#=oJ7YjcY)7]9Sp^*#f`M7o+QeCP++3QD^YaP4k"XN]!WZUU++3QD?XKG1TBR;5]Q*oHFkMBKE4]DeF@lBTnFFaUb8pq>IJWTb:PX[ZoFLRMB?mHU.XOP`!:7Nl++7\dSUKt?pKk@KJJIt\9=]<;UA49Qq0]IQ!as>N/T030_MEnZ]&CE"m`j`>@O3\?E)3p-8WU^MDH(?+bDZI&\*#$na(^Ci4.5*Z"eVG:;u1\[]./3&mjdFLJWd^@8uI.k<-U`s#i]<``AAcgT=Y5:q4)J>HPcI+dV%SN_I*s%!khOro,EOmG@7!,uIrrqY_1^\mXcpY;NnP4nVCE^29s_Dfi2J*!j@"5=b]Cs5`D]!iAgiqY(1G^goJ,QeAE<4_6HgeWqIUI['iucGc#[f6RS!tLInA2oUJGu6fqXeKgbB!>l9n'S/NV9HtR))fhr9he'-(]M4`.er8]62#6Glp=0>fuGWb`VGG"lVpunK6qYbkPuh;flX0ZAHX$P;`37,=BCjYT?^3bci&LW+dne$)a4o>%oM5u#<-SXPW^k=Eo)38:%:#!1G^8&+M]`%jd0=L:JVqQ.K&*/5OeRKhgP6ilu<%+J/H30pJ6;8dkbX^kTARj55:f&lb.W;WpF^+(8?"NO2iJl+McC5\[hOpLEA_ObVR8Eo?TVt/Bc<@!,s32s8D\Y/mWe_M'n82D-hV[`Kc]'g#E,b61:U6qq9;+%g4kl^A6o\g"G&bB@#k8@e\`+mm$d"5I&Zc!!#O:B:jTahEL)W\T8bZ"Pda6;IJCrr:3LIbLPJ+DX;]Cem!'@qsCku`ruGC%cmKZla*q(`b+5iZX/%=Mn1Bb>ek>uf3ZN>/9$BugtZ.>>Vlr>'n5eM+8ss/r>U*q!!$u^r97",HL\rjNSWCdqYL,=5C\.e%RU(A[C!=-g.'%m:7XElHa(:+kM!=Zk1+SB^AI>"??tXj0>IGUTE"h%g#E-o,iaqJ]6;WRelLIV"n!LKCMT,tPK(qi!tRM5n`%NIN=FS$!WW50al_aJ+9(bb(LD@&pl5+T5PW(]m-M,qfCj;JieidZo#NC$,]Mpf]A8;X;XqLT^\kD(_#j2`\8c"e@:D?OXro`f+W\ZY.V`ns@,HH#HX[QYl]qmITMehn47+[LF(`F1hA7X1K.q(LD>Pp+QM]<`W8FWu9]:hgM]Ap=`STI3j5F!!(qP['?kZWi32X6u-T(aN2GX++>'5DasZmrQ6Xoh#7)^4B9Nrf7"@li@0se`Fu@?[M1J1M>"s57"/_T75me=8r'J^WIT6!!#!)Y$SeVSi.=TH01NKKnUI)DT(<0@X`c4p8EPs:&LgRYQ-=hP/8D$2`I(hQC`Nufi+eDl#6Pk++,SC#B@!1"hu)KO@VflIj,ZEj4Y?^7E84^3HI_3M4oFfe`mR?(6nQ+Lm^k^Zj:g4!"`CBE^]$9+-XBq\PS=SEu5I?sW^N\KYdaW%'2'IVa/*Frks%W4M'`\4nT$/K;k3BR)-iK[>^WAK!7gL9VC(^LFdn'Q?^o_*gcdSdf5Q:H<:HeC#nF3[:m=,$,f6oj?_SX1.YEm.G,QIX2+/u:A63n`8bPukXO*"8"!$K\8(VZW-&jhCc6RN$;!-6IY#pI70Tp#NX!4h)H+bWrXFA`)=+;^T5&43H<3[k%/OGck+#U*4YSJ2&(a@.I&KFfYh:'pt$jJ%hN6AUmo-NsJMEm[Gb+iMNsP6(^a\`fiB&7XbJ8HAgA>]`k1#dJF6U]:B[/ikF)KNL6V;?-\>(S-d%6ED.f.0'@0MbZkM+]])D'EA-S740C7&1`N2$31(eU6?3VLm:=T"TSOCd7FWf`6+d;!WW52kbNkC@cbs.!<@XTFAbF2Z#]'(!!#8:3[l5*=?1J$!!",XSWj[PX;j8M!!&+=:.bd86RN$;!-6IY#pI70Tp#NX!4h)H+bWrXFA`)=+;^T5&43H<3[k%/OGck+#U*4YSJ2&(a@.I&KFfYh:'pt$jJ%hNEq"eNec9gXbXhkIomT:+QV7\h=cNlgkIAMb8jG:=Qjf`co#jEhI\c[^;nXYJaaD=Bo:DGI3t6GV;HiXEeW]U"(SI1"N8*DFAm(/]Q.!/&'cnlL]A"`E.B`JVMaim&G4TW3R[C^Uct6)!^+No]M3qSO4b.!!%&e8]aiOi+bO!C=2/f>Osr+oq\ZmA\/ZH/Z2l[?&u^;ZYM-AbFq<9=6Z[*]`ka<+9st]F6)8X&uE^=ilpdNhWQMUl8cr#)[HbRr!qk@cbso@a!.PO=.2/AZr&3cRcHh8)&b+k152t;=B[BUku:aPpEE29?,TYn=qVn0N7SWB:r-0.f/SJ2&(a@.I&7jUVPe_4]:1-3oo9Snc^#L_uaqR8NQU.DF)f4p]+:i'/O)1`f[i2X+?N+&UbF;U>)i#EHjL*<9VhIYC!?7@VhQ18rdfQU]:B[/ikFA.bU7<<>==aHc1,teUV,X-7^TF'm831Io3SrV"4,N+up??,ZXe6?(3bF=WsrU3,O&VdiVCa[:=WC`7NNOcY=T7EE9Hl,XiSeb`=qMQqg86DWmkr!'i.t.6/k43ba:B[*Ha&@Y_A[[YN-1oq0jNf\d2e9"t(07sVDO\e9F\^=>J@blrMfe2M[$r%6sYd>me)arsVQF+QpX-L7Rl7YFN/Nc+'V!!#8:3[m'=ft!;];kbT$oiY7(D5'/UP$Sk.S+>D,CGD%)3i>c(:A*>c2s=QWUfWP2f.0HOk"K9FND<*+DWmkr!'i.t.6/m2\WaV4_fSDcS^aX-k!0TRFjf]`Lth9b%k&p,*;upn:.gOakbJ1Y5V>)H3@`]t-hW;!fZ/4"Tb3jF1K5n/-FoI7UN9..;<)oMm*/Nk!J@]q$9G)VDW.l.l^1%JWV\W]B."TSOCd7MGWaZ_bb8H3-A.CVaLV0T%47r.Ljlb\=d1cVhgco[e)=>)_4HXNmaqGm^pNhtb+D<5KslB:\>3nK*q.h9h8c>8tm*>W/.FmA^!?'7313ARTeF\U/([@T>7![2bqkbJ1Y5V>)H3@`]h-Pbn9#?"/tG1[(te"1/FQ.ELs'jJCle?8Uj6sVB`0'F[K-::ki[OdRYlJf>GViHiZ672p:!-6IYa\g0o4/p]`k1#dJF6U]:B[/ikF)KNL6V;?-\>(S-d%6ED.f.0'@0MbZkM+]])D'EA-S740C7&1`N2$31(eU6?3VLm:=T"TSOCd7FWf`6+d;!WW52kbNkC@cbs.!<@XTFAbF2Z#]'(!!#8:3[l5*=?1J$!!",XSWj[PX;j8M!!&+=:.bd8*d[qM"LP/D0!!))SP9)FGeNe;Qf9)2s/pkiMcYT+OJsm(2e^Yu1j#dP1n-9Ys>s+r4MW,SUQTh!/dQ&u#ljs9m%+Ilk%%WX$%%S(4!6@SV4\0t$J\9RE'IA%)f,jJToFj\A'u0c%*:St8('>!JZe6YtlJtP$O8;mffY?Ba:06N1e]#&Ib2uIa3?k$$W-:[-Ot0EFF`CU]@-FC3B'?#j!'i.tks851g/)V]eQId@4<*gmrqSfV\p'.0'@0Mb^kP<",lZ8nNYLoj7$teb:AdP7IEk5-O]]hhuf.4)&$eJp:*HVpV>o:.euM:'pt$jJ%k+0A7[cM)IrZOLsn%;9s!M@:673eS2rXZW4<.`-7d/[T9:eYB@O8`B[`'Kd(kl?=@hN8TDY)>5(^$,AVA&e[7H%$L>ZZ,q2GlF`$[0%\Ko1%;!nnT0.ehmDQKIt*039e35J?N[2`j$Qn>FSd@\Dc]=k!4UrOGKo)7GVE?@B-Jcq+6F.r9+N$g6=n$,J(cN9Wff^p?9[Ifoj>SVOPRM\kc5S[,)eYY*L9p>jstCLuj>[?#(n"OcN/%Q`<^gSMWQ:g)67=kMn_@_8]1I@b%W3q7`jb_ul'jH)r&kd>Ml6"!?s6N@8I/]kdJm6gjd7]I'hVUd\Oh1,iA/+)"ZKi&`23>>`nGYln&0Ip$Q!A":JL9Q=XET)-NsJMEm[JQQcpf(a#h2X'l%LCMuAY2k&seg>$#O6>;"/pX(sb!g";m,]"E=X7OJpnUZ-r?SXJ_#V:&[$#+q'ImiHH3(NW9Q)uVKQ,H[WC3'Fb'W%H[\`TLtpO1D3/3j5>QZ/t2gVk>;9+A,m6W3G?[&0!o\U)jM:"m82>KkE?&Z+a,c@A+HRX;V16#A>c+BZ[K_f1jW`!7Y'+Z7i]N2:kT)V^Y7&aB`D!fqJ.u.0t(IEJ,MK`Zt?/0.+U"sth[,u&ULKE6p-IiquEaE1'G%$eYmn$]\/i2C6WV/*D))%1uIhp[Pom7*2Y,rLRE&!GPim]WL@T,mOY>14n4t6F((3(Ep6c\]OC+5j?!WW52kbS*3G5c!F;[K#Q)121J4Qk-&SQ'BkWQOF$MpX1IQUR;O9sAfpP9VEA&ilSkW-:i5Ktef^g$Lh=I,-#nim1*Ppban^t:17s&s2YR#,d`\3?Y*U-Uob'BZZq"BF7Id1]kjOD3`\M[Vl`UtSoA[I5(N,@>gZ._W8K28"64_kKN:thls)udEZ_!CcYM\8W;nc*M[CqZjk3C*1gbW.>heMbPNRR`.Yu9QT^NCC_e8h4Tl%4BEV;fMna62f!M4p+7!!'RnV#*^'Ht];!4=0Cs7ltomECF56h_D^-p7)!N[aXbimA+%AN0SS)Cf0K+WA,V4")Ic*AQuYW3aAq89S^]WT>!"E"f)0$I)LB_"m'Z+_%RcorC7K.3U.tL98%d!4]9RfbjG#kah&m'tEocK#iYBd%iRK%IBP[VH?6E\eSJ2&(a@.K47i^L:)pOX",!1"s$?=&HaGDB`e:>12,cg1:(S,Xi0n.jf')+RfCXnRm>t;N1H`P,^!*Dck(AkW:+@GQ%3S$NmVP'd):`ehb"UrFl[&^_CkdN3OVZ?q$Djt!Sdq@pS9=85YZcq03U_dHDlbZbb&CRrpik#AG&25m[e%:#iImAk#=l#8ZkR`6QjZ)VZ5'Ul,LZmkrK8'Jr3HUQ[bXk/%lh#?i2,O+j(kskn:@]afBp)5t@!!&+=::cK'LP&XIWg7u)d7K'+t*qQtT45<8VYBZCWHLeWc^QTRWTS_%PdbWXfC$q?kcR_'oD`iZL:24*i9*qc=gt>l3DVqP9Qig'9,?6jfgTcJ#nID*(!!()/-f%;`S=rmWG1]aRG'6ccXJOJqphRN^]Wq"M^U@1ep@_I`SSG/Faf3NPL!OQmmfg$b-_4?LACc]X/^]cOk,<8Z)I&*!lLdkd%_%X>:%6,i;A;\/Spk@%/T+iA2-0;4W_/15bqm0QSM]198]G++&n*mYnN*Ws4O9T)XkJPCai.JY[!TWrbd+ZVDft*^d[HB>CPIAfd-.5@Rj2ff+W]`A==ijU+IHF;&5DmAGUrHQBn]q*_L)jU,aF3A9WP1JoMQ+,Q,J/0Jm\TEJc:iV=]6;Vu4V#(ZHn;GaQ,D?MF7iPO"0:!2,BFf;>f8&)X_8K4CihBKEWFA`)=+;^Sj+#+\YiLWhkTOW2@%^f"V4nF6#glm%;d.RYqbVAQ4g1JZ1Qa\<8''Z43d_WbJ3[.XT\eUdC@V@p;XDW(&H-%Ma\ZrmU@4`gY56W7@ff/IJ$_!!()/-f%:E4+3nRZ*lMEE[s1bP,VHL@k:W[/T[A"VpI64(s&`qd3"Ale#)aofcufU8YhOg?#M]''A9dWm]__V)Q/c;$c^b/M(cl9b7c&(+F#K,jhA]NNq<=LMbPbr9S=613?;S=4AY_br'fsR"^/NtK[>9Z*th2D8:8oSr/\E0kfn\ota&q?2[m%gZG00K(h1d:<_*bqZ[244adA9*dY8HAgA>]eDB`7V4:HE0abLYGCY_IlT_gHKY&3KTIE>'dZQ.OTP/NJZc4kh$&[GOU98qYkL4\QX/^/#WG4K-\%*d;I'BkHf=Z@Fl_@gC>LZ5#S*!$n[`\p0TOcYLWg^MB6)rq9N:A7]Eil>4gP0-Ys58;$[O,d]YB8hPqtuRHUl,WQ&'^O"HYqa%[%fQW%3?2>U>MF84Q$/6^gQn^Fa;`2br@X?ph[.'D`M*#L7S&%K9Q32)kNJr*u[it672p:!-6IYpCX/_"qRSj]dCt^G#I?G]+d\J4&J+$F(*_5e2B-Fh!6dh;o?h6IMluH/2t,;]7"d5G#Vc4EQpLIa-/:$,%btW\[IC4["bHDlDF9LWquAC1<#QFA5`hU1HQLjc(ubL:>.-X@&cRYqR=5Of!i0M$gq8&g,cCh[MDd^Cs7b"HGQ.&[>'r`;nAL,'AhD.mnuOA"cmG7_!sIbf#J.cIG@\_2EZ0>4hii4?Y^LG:!.M??]V.d\"]&r/r*cgiMQMT^;1HHUf4!VL5W_.DTt%M_is*ol9b!"iQ\M<:In[hM4BAgVmg::.W(1=.G)*"!;dSAMI^%nda;5[lFJ[C/e-)W2"XP@(Y4N=SiaTQNb[;C4^EjhpO:V<%ZEg'W,l**K%"TSOCd7O'K@r`r'CH1*E.[jXLlWj)U+'R2MS]]RB=u4c]#f1Y*bKRG`*hF:.V^Oq&H-[Fr:Ll,G;QWZ(7c0FYS(5fJqX-.b2T=_12ROn>:.k?Xk\HU499%Op7CrBtIBDFpWXG$@q2!KI&&4;h-9&jFhtcd%"HuA([CWA\fGH9HY,sh24Lso`%9.F&R/`0Y6+ib90$Z@qi3ZmNZZ5`("?WT3^C=[Gl%QP-Ah)Y[7Cd,.ge'[`jG"-k*^@?SiV+8n!k50LMJKFWa2lHqica-)EGcPZk>OO:@EM;?!KQFipt?R%Zec;]8%._.0'@0Mb^juBUa>Q[rg-N'T20G[k=C1oXbn8-b[DRZQB-E]Z0#8%1ISbqBon\?/@#Q0(JEB0f&'-[p;MB-_)edaD$umK!!()/-f'!H>oSZa'ATkPTZ:g(JMG^rdO&hK>Gr*"NaM"G!!#8:3pFB=?4E\8>?c'UM^(6+1V=]@DERCZa#FL5diVCAC.!ao01N+]8dIF8Tp#NX!4h)/03D*3pGC)FbnZ<#$RqR@#6)SL;E+lkV::'pt$jJ%hZ0\)BQMClTD-7=p-54>HB/;cb7GHG%SF*XXoaGq3m*9Y[?!<@XTFOGf^0t'uBR]e=c]`VM0(B]rJl'/7dgW(">,nK^@4E]eC]afp!fi&cJ1*5@!:F3*+e44;N)^1V-7m@?D7B?1]Pp)5t@!!&+=:.bd86RN$;!-6IY#pI70Tp#NX!4h)H+bWrXFA`)=+;^T5&43H<3[k%/OGck+Nb]sW"9"FirKH*;)6^W_EUXq6pTB?W)k?Q#MbDJ?*?g1Q3[k%/OGck+Nb]QG!C\G<'W%Qe=^>;hJ#h&1;-MMud9*G%c6[^N^=>JHe[2io9LVfa/^b_Hbk.h7pWU/>@?@6!3[k%/OGck+NbdWsda?Tq;Wq)3L7<2r]X9!38]='B[,k'le/lcF0X414U]:B[/ikFAY1]e6#1@9>AD.aDj@SU^5<13eP6(^a\`fjM\7UM+GM?`\$d.e)C[C?aCkB->Ln3$D`MGKSE'($iZPlYV`K_)H3Nh&/PO9YcV3AL03:5bB.Gu2+i$F55:'pt$jJ%j$iu2]V;N]CYF[\kS&3$b`Qi8Ir4$Rgb!!",XSWrIuKDpkAmci0"PBeHc"bjp\Z45]#N.HlVnZ:U2P*F<(NprXjsDrHe%%4/p5tdMX:$4'cTotm_#'k\?E?GL!lF`]FoRB\>(Ooi./.BAgO18:5F72SSi+`lKQ[`0(uQ^i\4W6Aq/a0U9mq^)dB@"]@Kl#CSNO0jJ=>)6RO+idbnk*a_K3=_JRQd:tLo:,-NM7J(SIr=i@oL)sJY#dh+;tkJ^!\.77iLo!(H-j.PjlJMX$a3IQloCU;U5S8_eQ:S/\Xa8b8q10jc8;*`bA'FIBI-aY'9N!WW52kbKK?$n_`^8t8?u.`b>bXE%:ie>F,:p!V>pP,p9kk!0rNlUH$Ac:BH6/5FMC2S)ns:%>dJ\(u;=PNHF)8Qjd.AjKIBW@4Qf9s]/0%?Kr)>>b<2!QVJ0'lmR'K&YKQ&#h/.)DW`:m,0^;Pn*6gL2-sRs.6A0Q($mYa8A@eE<+K)E1tP.]5(S-d9&lGOSK1E*02&%Omt.:p7!DP$oe&HGaYoLj6-BtoU>FDLiMq]R/'02\lIo0IJ7IQLINFhD7daiIs0:n7hrLmqT#?Y8h^3XtgJpr:M':BiS96Lf9'EA-S740C<,WP7l26rrU`L#6"3POSl2jb9*s1Si/stW#J@%j-Z-_Bpo^&N-T)rKKf6siqkR)aFUg@l7";[dCd\5?n1J2-![2mRU]:B[/ikH72;6JDWV)rWW5_pYG)(l'f0?Uigc\uqjK*-3l0@Y/YrhX36e+#?\8s%JQ3Jg!+)[47!E?Z4qJisgKhBSL=8139NA$0?H"*=sR7J\G<7fk/0%@<&eMXdW31U4Ij"Y?0Y+7C/_lM$S2jYo(k82qFCXK+&>L>+QthXKC$(b`Y@q)G@H$`b^dWZtArN[<,HBU8=PKr]l;=.S[;m=4gX3[bQW$p&alof)KVR.kgIb]NBF`&BXJ*&9pH^qcq+65DNdnlFqab^\SJ]sR&UKA8lVE&B2NlIBZWd5sKs%kajB%*9!j.i`]%k$44-gb.Q^"X-;!,DF,._]6C]jP#S=Bhf7]('3o,4lt,8TNb&,bFk`.\3Fl/asFC78Eg/2`MAg8H;Y7D1c7$%#dFZskF_gu9>O]VeM>oL*PUUS5bg@+70,ZoNLMc%RnG$/N"QC?MbFa#J:n(qCk9Tg&THVfFPcmuA=T/dO0u-NsJMEm[J#Xq>e-rId,:U/"EpoKF]9$1s(kgN]9269No;^)\OTblp,iF1?"E_X?("Z;ec2Tp#NX!4hD>K\33UTko#\WaIUO&D!%e$`mQOHeK45.W_ur%1^ShCA%3BF6B*X%d[OUakfS(j"/3Xu1>cDV6i^-'!6:KLCSj$31(eU6Ca.imSZq?-lf=W0<7)bl31-$1I5Z]$rGmRoeVa?*14S1qfii(R1r%(R/W4qR^NkMbCeBhOULFj,,G/Zs[^1d9-.j8OY[.,tnd823XT2F>VMX];?t*Kq=]dd\[W:^(Te.k,"Ii*b4el2nc"n^GU'[S^<7/T76U]'?)$-.#AlVo,H5nZV&6g-907I7i,58Kdp`D:$H]LML-65/iE9-n@1f_ZAK!Z)=FWkiYH:OL*t$\6Q>_O[1.DfX4kPCqbQ:k454l/"eZ,U672p:!-6IY8V.P>XiNM9?(Z27V>u5@k/u?QRXo%O^,!Gpb]W+07[T.n-D+\kDEPn/F0>G?RCD6!/C9Z&bpWfUGg!(&3-nB.ZTI$RP>^ruXCKo3PQs!36X>dW?MSdSo0lbAUbqnZW=k]*[nDN.`o+l_%[KUeR"qQUr8-3>/$L!WW52kbNkOVs$5#1m]JgbH]AO,pX[V;?-\>(S-ePA!=aJ5Z2KH7@'\Ea/'<$*0nlB!<@XTFAbGc9r_KMMQ@ei3[/ttj9UH7$31(eU6?41Cbk>fW:Oj)6M;0U.0'@0MbZkM+]])D'EA-S740C7&1`N2$31(eU6?3VLm:=T"TSOCd7FWf`6+d;!WW52kbNkC@cbs.!<@XTFAbF2Z#]'(!!#8:3[l5*=?1J$!!",XSWj[PX;j8M!!&+=:.bd86RN$;!-6IY#pI70Tp#NX!4h)H+bWrXFA`)=+;^T5&43H<3[k%/OGck+#U*4YSJ2&(a@.I&KFfYh:'pt$jJ%hN6AUmo-NsJMEm[Gb+iMNsP6(^a\`fiB&7XbJ8HAgA>]`k1#dJF6U]:B[/ikF)KNL6V;?-\>(S-d%6ED.f.0'@0MbZkM+]])D'EA-S740C7&1`N2$31(eU6?3VLm:=T"TSOCl(,3Rm(tnaIj'IV@^T2-r/OMZ!!":m4"2>+&1`N2$31':q=nm[T"=\'+bUCWBCV/pfcN]azzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$3!-nl@k&~>endstream endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 694.2874 161.733 705.2874 ] /Subtype /Link /Type /Annot +/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.7affe5e5b9f74fc3e75b529e632a8f6a 6 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 683.2874 120.381 694.2874 ] /Subtype /Link /Type /Annot +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 672.8499 177.6525 682.8499 ] /Subtype /Link /Type /Annot +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 1018 /Length 79430 /Subtype /Image + /Type /XObject /Width 2266 >> +stream +Gb"-VcVGhdH6<"`kuNtrSA^DOTSZ'=i),.a@=cL/LoptO)XaI]c%_?34P?sS7gd].ilktR#3fknUqrPWUn\'PCkTO]+:!`J:@RLXif;6&'P,2I<-:LSFE]T:oA`d@S_$N?O1n!]W%R<.o2ImGUX]DGzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!55WN$^N?0apM`>H"[!<\K):_Wn3#bfpEcHjH,sWKDocjHqcg074L:fXUVHfo^CL50LLI.rnGH5mL*<2Jq8m9(+eR`ha_--U]=>@A'DqS"pb2X+0E1Mqs0;qnRJ89JJ'n8=J,(b^pFb;h$(V*92jFH9P=i[\j>/nGq98?h1H[&\%.I!d?iTGAV8qm!ns@*">rpp@EcQ2`*k1/tEXGR`@:auJ+dNKb6<9Siic\d"oQQYr6*GY!/%3a&aCbcL4u7_:L4J>@5[gL5pBt7Ti;8dg#=Bj>%&-Wb==OK"j>2H8T?/=M+Y`'U'RE_U9Z+Hn#;QV,ECF5!rHCR6:$X_NN4F`M?"UYk1I#T1T,mW>+EUcOcCi-BEP/YiIT*1$OfC/3OWbVc#c^.Kt+Y1P@'HaWmE$/GT]N9R7ri992L2W>#o08jONo$t77jo#PGL90NFlP9(%IdN_V:.KtL%;NOC46WioI4RsB,P0X-IUdp$@oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6(a(K!=l<'V@tu@Ast%Oj=T)HmXo%L9T_p5V_Mc+=oYg`MZU!==OK"j>2H8T?/=M+Y`'U'RE_U9Z+Hn#;QV,ECF5!rHCR6:$X_NN4F`M?"UYk1I#T1T,mW>+EUcOcCi-BEP/YiIT*1$OfC/3OWbVc#c^.Kt+Y1P@'HaWmE$/GT]N9R7ri992L2W>#o08jONo$t77jo#PGL90NFlP9(%IdN_V:.KtL%;NOC46WioI4RsB,P0X-IUdp$@oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6(a(K!=l<'V@tu@Ast%Oj=T)HmXo%L9T_p5V_Mc+=oYg`MZU!==OK"j>2H8T?/=M+Y`'U'RE_U9Z+Hn#;QV,ECF5!rHCR6:$X_NN4F`M?"UYk1I#T1T,mW>+EUcOcCi-BEP/YiIT*1$OfC/3OWbVc#c^.Kt+Y1P@'HaWmE$/GT]N9R7ri992L2W>#o08jONo$t77jo#PGL90NFlP9(%IdN_V:.KtL%;NOC46WioI4RsB,P0X-IUdp$@oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6+TG*i[P#`;f99Fa^)ih:bsoXRCQ&*Q[_L$M)j($":qgo#PGbh;N@KV8OC;UhCFMWSOu2l_eVHeV=t8tO-%k&L5HlIF#'bJO!EO$rM$l.5K8ZT1t;N[m\%;^S6;;6)n.g\p?\D]VAFBqZ4uO10Fb]"['\8i(GnYC114DnUU'RU#(C4Z;Irc/s$Be"uHLW&-Y%&Y7M)TAn[BNFk"E9j37953o?-CmHDLih*C"`/D"s'FUR3ON63Q#YR@FkI]"%>-g4D?(JL'V9+SVl*n,\Bc)KWaC-&HR[&lgo(7J0d=1cnjt>0U71eFZ?b?*!iAo8iDJ^/a_ATU>0%,F'$gU3rdc>$[M3*pu-r6$[RL;*qXC?IjbuZVd#)D:ZK3TBR2Q7C#0)ETZV-sMC,3qW4BCcqpY>$-CS(U&'1KJ]`F0_V'+*.]=3u1%r"NOR=$@-GFQpjEF2[K)R.hlYD'L03pgu6eRN=3+h<(BjCG"$D<.6GpJ+AFMZ[#9;E8'+[s#TQ/%b&,^9*.idE-$O@N'M12,T7.V^H+iB;TKRlu,),>7@9Ugg"+;N63q<9;PJ.n0jGuT;%`o'V0+pG5cj$iOuX!5Mb3ka&R-(DUtl15ORqu$@brp]Zd5GLoh@[].5\Nj.?%\9++s<.Bc`!*rYYXn]R2aP3-D"3pN/tDXAJef!aRn9X!m'&(k6M(U(BUGIkQ\aLbAM$M&SRHTUKan91%Ya_10l\,!ZU2boReEfYAoQRJ2phOcDqPb70pW48%m-79Q\X@u+N1YSJOJ2VEbX7as.Lob,ggI/$H['6i6X]/Ba(RI`-acC2%mdA[`.OC\fMJ;-c<4^7!;a5(LY&6b+l1CnFjf#`)n^thA8XN!;&/3StqY+J<`K/XbD,$YBgIdCGM,DBkq0"9LrqaN:ghEW)aPZhN.\2DA7n>OU*?ghFWHMjuOSYO9@;T6(kgZ_d@:Kg+e"c'?h]SW/nHj71G'fKO.Aji'ES:SSe%-J)O+?^Re[e>B"_rS#D127`'aFX$f"e/iTIVG?Z2CtB/dqn$-01lY,LB7OH;XD(XKCVLHU>b+:<^3d^UE3T\t-m$5^MXS@pD,&&TKBYhS/*3^X*+^fgNbMI5_7K?rMfsH-OITXZB*VF39U$nP8l>ELUuoWo<:Hs\cYjg/flrQ]fK,#l4D(@eH$JX/S*\A5p0*G&9'+L^eM0)OH_3I`J5rEgO1h)@9r!<'cfC57S\Eim<*gMhVrMBqI!tG_CcQ7sh;d(bVGSf<$rBWY4,o-"e/RX,be7'b.ONWCDr&uQZbE^@7*#![m^h>?Bb]HW-eb$GDD\-:iq9`gJ/^pgIN6h8C-DP1PBh52gA^X)f$<9tH;mXSFEN%AF)ti0%U4o-ub]CJitF6?30pNME8YeIe0ZVZM$'C#LmRE>$bden+`jsCIUY;3jrS!f\8SXJ0ckeC+4^[>oL4+>EOlqF0tlS_b\]L?G"C"2!RZa./*0g-VDb#/%&`sX\e3uaIIC%o_VgW.S7q7]Y3^:@j^XrJI;Z*/Vp#G:jC/dfs3)PS,2s0_gV+\HX)nUm3Mq-8KU%7`JY2m7[p0mk"/'/$t`ijm))ujP^UK"sr5Ai&J%W_aHj$n*[!SgY&16\Y:2.;.ge=Ntk@PpG_oC]YB)>Y+8ls3qm.ARm[J*Qokq?ps@D7#US=m,aMcXL:?((6G>+D#9gKNh[GZD0^j7SL?X#W1JBt?EVD*LSl)jQeTb45^$l-/ZuCq3h&%U,D7b%f@:F]A.48g?.h^6=mPe3KlWj%dj([afX*ik&L,3F(6m&mOsm(kHBLab.bqin\SPgasmmfq9@JgjV.dH'`9-41FS#.]S)hI'`7VqQ4o;Y,!P5SE2_hY+I_(qfWA3lXPOXg\0P-TY;N(&am9L`V\pG@qBI3U?2YQteN4Q:GB`E%#I;s_OHIt>r7\t@#7E:nrX6S9ml/]_(6r[?i`ZK''3`Bq_5Q3gU<=848]\Bl`o/@7OFbL,G.%,3K:UO1E8pT;VIAD+$<[Y<>K1i2cm>_[+:%#FgZFO,B^MElgV$9g>U7B28+<$r,VDX'-#K@j8/I:%QV&*NQcHiICH1(\`ck3hhqu47]#0%5VYFu1ocr`ADTl#IIHiYG)r-Sfp/M.\41C$?ZV>G[`l$,A!.7tprELFP]\P`)NLs>7W+b&%\SYbSn:1p\#VIkfR]1M#kNClilh^dG2Da.k(euu18]Wg)^X,jnS;sGjE[F;0\5/g;X*dAb#m)EK)l/GZ,mPA?VXZ+[495i+BNgkg#p'"IU>&pgIW=2.j+HO4,c_f4K0c4hrll>GZVCR)#3k:DOT+TMb3rJjZf424`N(cF!7m;..EuK2YAiR?!d_oVP#B.gmFlV.t)#DDKBZ9B6b\F8(%m]dFCG-39,6paXqsmWg-LNt;C77UtPKs6JoG#cQCecgTm)iPSrdFZ'hM,3+T0?P@0eWD1$J,fR(;#C@F'[\pG?\Y"lu>S1\`_=#W&sQW?":P?1\MGf-kuJ$\+%%;W,<1/i)*s8'T12*5P-9$STKkaM')ABF"I-fTi=4/M5jm-=H4b[P^1@An73i_A>$r8q"SGhab=L'PkNtcRq%a&agQR[r.Qn3,6#X3SXVj_eXb_mV,EbrR]J*c:/nB5<@bsoG"drbnNHl^;-Sg^Za5iOZWBXH`\h7L3rYKAg"BuXZtP-]no;_G\[.L]`PmP-V55^;9JEm3j3CcfC57SH_lbmb8._=27K'A#q6+`mMA">qJbr]:lN9896$T=OG2ccmaZP4]-^jr=&4"t`6IRhZ?8uMMOWA?Lh$BFgW0CrOtDT&ObQ*E\abQ>p-#Q(oi,UrC-e*+u&,,/Dl.,AqYtP>f577O6*0T%:(T\`m:P#;1:d*q8(UnlCCf>T\F*cuUmR21F$J?H;,GT\Z*.H_'3*M<%@)Kb7'c?e@Kr>ajoiA6/U@Q(>h"j-o<+b"\XA5mp9)[E9<:nGgo@7CF03ZP)i$AUG*q&Lo]dl0$`1!j7JDf$HgjF-dp$h37`c.Ij;cfaT/1RYpb"M[K;%Ssm-3B/EPU^c,7?bq2EK%TGR)3S[(.5d0-04QlTj@VR`KtKc?j,]h(PghRMMJ_]-(J%,tAEd]1IUVOrXi9[+%gEL'dU-ecp7Vatinr/?cIH3pir@cehJXH"riN\0$M)j(q.r[T_k>+L[(!Tufaq2"VeHJ$3YHA<%Y'/iEo3gGj>2)BF/Qk'W;AKja[S[4+\geAg+b1GBJ?iuFdtYRk/?Ppa!`;s%sq)hcE?3ZH)78JhP*#L)O4T$WdUOMpHHCR=NC-pF\Y^n04`\H%.SpE?8i(ZbOE:n0AgoGTtZ[qMs[jc-ZU-$m-M'\Nr+B2,Qt[g-d'k=RB)GhV!BX^(=-md13QU\Gl5R7<20>omD43b^N7Ji*-/e#6gK\_f8J+6@!ES)f>D\Y]+Q7OX);Nh.CSFQB[P"g!IKOD.ZMWKi7j"Z33_[s.H#Yt3=o8KDUhn1`!)m1H<3jKZ2cfjrR1hYjBU$?c;hZjsirs55Yl$:m@E7m;,80T@!E):#D)PO'_Z^#Oe<4/Yq7Z^[KN?'"+kD.IsL^M)QQBEOVkV;sEt0g51dWmRE$A7ndNfU:=)1iB.rUM,]9C?b%(DVfIdm=W2uU>*^1NqO75r+T,R@Wa,4bHB5ijg4i+%%]q24s99Kd^-M+^>sQVeR42^`UY<3-lQ6_"nhKBLL)m(5@4*lY;jNs#$mfEC&C"2,72/2*)hccX(c!4NWq!bH5DP)VgD-*?dLYT]A;5b2iZ+'>XA68'^]"_Z')qiiC'C!8jgu13\+'b[?!Qf!FaQH;#VGSQp_c_3oe'Zu3NQPQi\Y3cQ>F(?.JSepu;[0=e!DK7dnen*fT&`LlNN4T&`P"RDIESOZle=qT7T"SX[GK5Q]cKmLUYD-Tc1^UKc3Uk=Y7:X&]HY_DDilu+1%(954j\_>V^&.HY*DX%mY?%(Tqgbc#C@C'G55D6?dKlr'BsY?U405T&/hU->()EoCMt>KLX"tQpf4VGIepXHtdE;G2VcU&C^U5mqYLiWRc\7@Z9Dn0^O1bbtij.HFo#G]rB'T"5CnWM\6H0$?mQ?W0DZ6.&No07V1c4A:*])0CO(^cHWW3l^_j_3rioWMcZ.+$h/=ESo3VuaI>Z$k$OW1;qZ"o?,HR:"R8(H;9-pn1r%_S_>"j?hLD%P^u4N:Vin`sf=+Up>[ML@c4;nq]Uc&Q#2`)`c(\6W(?j5R>=SULG"4S*T*h#(\\l`%+'b[?!Qf!FaQH[EWZT?u'luQdfS^XNLE[/?JW-"6U9/G\CmF@?f9(;=.Z@1P]B]N5KNCq<*J7b?BaDkrZAV=HlE'BSjhWU,N.l*MkN?;Rs%ZK!e,Ol%@$)O8!DHT,[="s?",4?HF(c='FoVqG&hG20h0i1ht$0]L'-Y-2bnS9)btHZ6E9]kr,hR"nJ4ijYL^WF[%#Z]h5Nb2W9oC1Ut!@Wo##n;]Y8Tt0^\1)D0C?1E[_p>11P[31W+SmdjVqOcTdC-q7@WIll8Nll1DO8jf#aM^V7:bZFW6+=@mEj(hO]:n!`q\q3[TBi5rt(K)66O.u;Fo9r##k$k>;+b:_.FOKEbmJiraM5+DFEUE6`:P8ZWp9VVZPcfC57SarXT%r$cZS'@dhH;qVH,#+AtgA4.f+frRTURLS&fd>l`3Y,i'b`j(DGMJF_YD9TLfhl(ng_d)YBiI\g!u04Z:SY5U5WX,3h;49:^FShd)e,(Cr3X(V]uR;$FANQO^QknrX3Q[BX`6a9tb1QS[k=eBQc5("96*ToFgMY=KE3fc8C<^l1..fStVp!'0G-_o_ueO?4@p.e909Bj4#YJttD]R:U\]`".ER7>!m6)IMSJ!\p]lSrIaX#&#?c.@6MH$'kT6;=4EqjNi`h28cNlbRQ,Y[dphXC(%IXWaMH0jpG2Bu"m7bIWQhD;Z8UB6V)jH7cZ##(d5fF75@2OE!=U5@Q>MU]ACl-2J.aD"UgX+!1AE&3]H/Otf6Hf$COiGE,6bjcHCj8N>kBiI\g!u04Z:SX)B3aH+R4F9bFmCn::%c0sa,TIW[j.3#gCMUZ6IFY*Th]d!9dr#0RGes)"ifchX]=I!n_jYDf@PD1p[j\r!\8"3P)HH+5(Y/&!pU5J,BiMA`Vp4f!C=Z]dPY7k6)U)8`B1gFtRr/(mena@gX2Qn&"pf8,W"Hbenb-ep\k(AOh=oMLiUO4bsF6=[A3e_uKg&=\BA7]k/Zg$*OVjM$h;g_,pdi'XY=qm]T4o%;^mD!jBEHJmr3]n4Ea.NnO\*r4T*^mtNJfF4\O)pRWi)Nh_I,S*[iVCkqO/D.IfYT\/u:%llG*9$(^r@X?gD<*UXqY7'7cou5CKl!1!s7kWJ)[X7IK;G$mb8t(=MpdNr4Y+;EWMELH6jNVeP]nhmBV&"*O_Lt(=&Y0u[iiaKC4u%r41?`l?e*E(T+3`lkVOo0k^hE@U^BZHP9$(^r@X>t,<4lp%]3`hG"ngr8S#^s`NU&`>dJ]+XC#2&/4`>8kaDWf**6t*g:Uk:c6JgS.2VG]lE]Z8hCb`MLm*4I^7f3nJf6c&R#E6CX&"?&E%%BlfqlAu3^$DN+BaZ"BNG@?Q,WVu@X(U;=m'uFRf/2csd@=RsN_5MajjMSor(=B&\\;8%fkR,P=b(=3)8FP_DZ:Z3oGVunQ0fn=q+r\,'#bYt)E#BUGpe*ue4_OST(CF-lY0=2gi^d%*QaR>\,..j5/2Bq],a&Y1hsD=\pF>@/(qA?\GH]^*m84#YuuTk<9HP&gPbT*3o3!33eP'5.CuL%GqJ+m`un=go%;^mD!jBE)S*a-+h/TMN\WBc9HO#bBtuRj+jFtmCkB"LEI_3#`Gr).0I;LZ[I='YG@?.eO4?_f`/?d`P^].!anXDt2f2IiNFmTcVs?SOe#8LY"t6?=R79&slg#U8?=,Y%GZs.Y8^PRk<4g2,+0h"Lf@R])<]b3en)X0HfqBhs2X!VWMl#7LeI<_G;=j;.:U=QeB1c$rI]EQ2:2XZceP11Xk*$63P1.3bYCUpM/SuT,T;$^[>B7(sJ)E0K319;RGAQR$HILF*nfY9PMu(5'<&OgD4d*R'g+:LMFH#LfQKRmd0Bd:bZL9eY?/"'4;;2\DNjLCVVbVq^nmCGQ5[q;rW@K8qG)rEHeI@c34,k.1Z;Qs`ISJmoYOo=o.#?+L9V[nsNmg?<3cDQlrF>ckDX;SNnE`9I]G$'Q:asIqDs+I;mkh%)o!Z[=KBqL`-mOr%jH7cZ##(d]CPFc_NP2HZc7)G-%.j/jVE<+`Wcai2HJIt0VK"GrYAQ9/Dsa+:p(,sEgo/81,I9IL-P^'qFB\->1V8F%M>>]Y.@t6Q8j3=ke&^":E[dHKS=#n>St)C48iJ^!8[a7`b0As1QOIUFe#Ptk:7&FK=6fJ7qVL)[:2Q]9*gJ'60CIF<]5VXJ3A/#F_9A[f`V/QH&`$$V0bJ9)=.4nGI88SD9OIN_e"p`)I;sb?[XWP3\[sdTIl00QNgHYEc!Du;>*9&V.IV)UmaZ*\qVM)"cK%;LS(;F/Pe/hE7p,GN[iSf7`$('5PZRaREcJMgT#>V%We*#KQ=n2n-'8LorNQ15>n`e3YDK]URkk52RD^Ic6V.sRUWD]9m==d6CV^lho>Zt:#4l*`X+eK1OVQYG7';]BU10`Mdg=r[sf'4cTgClA9;:"5",>Y)?r=$eTI_6/7\*EY"NU>PmeWhSUg)V)r@WKokXHtVc-Xq1'JR-f@`FD8=4FmG%0FK+T)M/"#b\*k+Th7bRZr+2L'XnR:tP@Q(3e]lXlmMe%;a)#o=9(?_eRJ/:hc(NOapifQK^3@Bn;D0nEa%b59?s)_jm2(IF^Vj!rjAT@FR2J?`/EoGgE;XaRa*rZppCK0-D.ns>U8Y^;&SfjrUk/u7]H2:RN'>O1^_K=BY3R*SX`o:Mc?X;pMp7.[%eM\lZN`!I@P!@)GWnBSNHZj,:lNF\A;0UWYHB/,RpbXJ/[FZhQ<'&oSI^6>ikBApe5Aa.KDKP<2Rk@4c.gsVAIN0\uMjs6tqT_T3GE5C\h,3(nGZalTYJeChib"cG;2R8tAfHN;fnJc^RmrD,0c.8oU\=?]S,;s47Xh"W'uX_2BiOshPN6XiBqkWmp9V)Xis4s!q]_2uD;/cslj7C`9(K@`=eVc.jKZ2cfo.hK8e'J4Ntu!"#I^Cd9KnY15'OSZ)V)Jr1E7e!lLs)qlr)FLIWhGbhlQHeiH>^#'0XgIoR_P(LQ.#QAlQL0T5e2@/l"A!qqnNTYGZ.\2s\MJo@;]c<;_$N=-oARh%rX:NCq<*J78l9,98_3[JKmjmV]_HHb@*PjR(Q7p#FmlEf]l/nW3DS:ZI3hO8E;T./@SZ*l$W>^",=55BlE3C;_\pIID,6ITgU_oPiG5.?1cV*[l<_^#Vn']?g,Hp&3@RCF8jGllY]HC;X:[,We[Vm`_+[pH7j@`AM[bE=Wkh^tm^Na)>hIr_nkGnJ,SMqHi(@rSpBElPP*nlWo&Ws/8ua+8,0aC.W(d8U.aHD`7Hf:a:h#j7jep8M,2b.j-uNA3J9n"d)s$rBWDUrW-VV[d]"l!a1s-ae@QoLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d$RC"-)6CGaXE2B.F":6VlR?C_S`^:d24q3UL-oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d$RC"/nn1n-;Cbs4qh9/k2HG;bKmpQ&*GlhcGfS%I?J?<37)r_8ubY",5]dL$M)8N#YR@F7m9:Bnen*foLP%d2!QO>O.-M->>][WG7HK-MDhNAc-q"&AK76^M;hG_+=re04RsB,P0`3OcOcCi"t1f]dc7?u2QJ>IeS95NA#7j@%_Xhd.ZJ%]GOKcdF*hJ@I0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6(a(K!=l<'V@tu@Ast%Oj=T)HmXo%L9T_p5V_Mc+=oYg`MZU!==OK"j>2H8T?/=M+Y`'U'RE_U9Z+Hn#;QV,ECF5!rHCR6:$X_NN4F`M?"UYk1I#T1T,mW>+EUcOcCi-BEP/YiIT*1$OfC/3OWbVc#c^.Kt+Y1P@'HaWmE$/GT]N9R7ri992L2W>#o08jONo$t77jo#PGL90NFlP9(%IdN_V:.KtL%;NOC46WioI4RsB,P0X-IUdp$@oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6(a(K!=l<'V@tu@Ast%Oj=T)HmXo%L9T_p5V_Mc+=oYg`MZU!==OK"j>2H8T?/=M+Y`'U'RE_U9Z+Hn#;QV,ECF5!rHCR6:$X_NN4F`M?"UYk1I#T1T,mW>+EUcOcCi-BEP/YiIT*1$OfC/3OWbVc#c^.Kt+Y1P@'HaWmE$/GT]N9R7ri992L2W>#o08jONo$t77jo#PGL90NFlP9(%IdN_V:.KtL%;NOC46WioI4RsB,P0X-IUdp$@oLK[g8c`A"']bD&&=.\jO*l\dj>0%Ul&d)>4VG`3;F">6"aT/bKI*84,G-,1q$^(nH6`bhO$rN;'G-R&5p#h1@EE0QaCbcO4p)L_*XT^3,>ih<"b`^MO@MK%=RqkBneo<-cN(q[7tRu;8/.[g!F_rAjH7b"Q@($?I"nld1I*\ZOWZ2<'#gbH5ZfK>H/pc7-(i:(T-5c]$rBWD,R@&(7.I5j&=,pS*r-4Qa_11cB*_-o!u-q?$,Y+8;1'hsKV_S.7m9:BnsMW2)8_Q_!6+Sg?i2+nkO\<:d"MP88+BY6rW4,]*JI5i(dt3NJ5cj[OO"K"HtEBS$j"I_JAV0E07Oj0oUl0ZT80Qan3-X@YC@RB!TU@lkTk[ET\oq$[;GB*OID&%J5B2P#*[@EML9"iq$`t0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcN?ndiITU=dr5V^An!.\C%,QJ$I.0,5s4p)L_Hj0T7V+1Sp0U2^4R,g%g1!+&.J6mOI!!Z@N!/a?3!u-rH"p!k`7fm'PPldVGj>0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcN?ndiITU=dr5V^An!.\C%,QJ$I.0,5s4p)L_Hj0T7V+1Sp0U2^4R,g%g1!+&.J6mOI!!Z@N!/a?3!u-rH"p!k`7fm'PPldVGj>0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcN?ndiITU=dr5V^An!.\C%,QJ$I.0,5s4p)L_Hj0T7V+1Sp0U2^4R,g%g1!+&.J6mOI!!Z@N!/a?3!u-rH"p!k`7fm'PPldVGj>0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcN?ndiITU=dr5V^An!.\C%,QJ$I.0,5s4p)L_Hj0T7V+1Sp0U2^4R,g%g1!+&.J6mOI!!Z@N!/a?3!u-rH"p!k`7fm'PPldVGj>0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcN?ndiITU=dr5V^An!.\C%,QJ$I.0,5s4p)L_Hj0T7V+1Sp0U2^4R,g%g1!+&.J6mOI!!Z@N!/a?3!u-rH"p!k`7fm'PPldVGj>0%Ua_(U(?@!js##crNMFfu6'U*nK!9g7L!am^I!hbqA1I*\:B)mHgH6`Ip;^h^(8Nm4jPC*Q7kbUcNL3.OoqXD&pmetknqfcC2ICM94)L@6XWLpYchgJU5?ESd&f4pk3?C_#OI6NLSnD3YUlf`ERA[uCAJuKHFjl=0g]UImRHraJ;qU&ID>?Lb8rt[f3>Ad^f"BdkFRj4O+MFfu6!;+\a!I)+k[GH?nMT/sl*DY0lL0h#e5+K!SkZ,9'+'qC%o`C?e0Fsl"CrDS4K]mh1B>,L1B9Zn4VBI$Qh+67r[*MsQXeFrQf[q/;@aMW`/!'geEc3td9,_q_o#icAK(4qKq1[r`LfafVGY.hd`DS*PC*Q7kbUcN#&EZl+,clW.(M1l,E/@#m9*sj)$$=r*XV&rdn/lulcS#Kf?r5M3i@3c2tacLkYn+)`C6j#iQKWL2p9VDMtHPCVT.4;YKm_CG-:/HSP6.o(o0]WUgd76_DQUgS9[-AaR\9bLc8K`;_SO2-sLfZn>/FhI=P`gu[b4[J]",eD-O,m-7_p040*Sp\*UFf(lP_BiMb9/"]RKgXcAcljnU:a'CohfCRejHHn]shaOPm5)Fd.DdL2mW4hZ+S?:B.\"DXbXM&o8\u`A1qGS9V8c7/)jK7=SH$s[0J,f=XlIFY]0.m1HWP!\*nG.KZ0RM!`KD5iF2La6/%r_N->t'b^D_#reC-p"6_=nXhaB,(pNuC3p>F?LE98>^,TT<`06B4!]l4F)u8,c-9g4VTc`"1"UU@n^bM8bBYV,WhfOE?]IYF.rRV!=F7ON@;;s.N@MZTI?Deb/m>C=O'gcs01Y'+dXCf3DdP)'48?>@\RYZ_=Y"gg2LU;SOd4NOgFrK`:$(3`Mra-k?Uh0@KCm"51b*kM]=4t-I!B"D[l3s>C;fVOGJ?b`X']BNT;f*Z?0-5,n_^NuR!ZH8Y.FK#<-B$Q3qUP,Sf1g[?[;\1_ok!^l"Hj*Y/\*9/GE>cWVHGSedf!XcFk'A^\g!=f(/^GWO[8=NlQ']pA*jHT"`[PO7=\?:I\sr3/[_6s8.:iAdEPG`c=tf*\adkL>5"_dMtj,4Ud(kZ`ZOLRDm@XOX_@WI@.Ed3Mq7^?XcIGSqXh&D]"%RVC`5/G70gp<%r[c0o&VDc$`Rp4S;ah0gZLE,8H6B;2V0hCqKd<5:[,HLf5U+.?,Q(*g5Be:A/YUcJPI8ZR,g%'5VG850Yj7.W4-+ddXC[.k/Q,MK5PTkT;N4p3#?0'q+l_^0k@KcAish!h0mJERk+0FLjC^t[s$89Iu%buI^N4K9AtlgZIO9+>Yg+_+'sr7/s#FJ8iDYiq`*4#UPi/g]KO$nqWS9$3*qX/j]_LY?f/O:B):(9NB6;`or1u[qVd3ZhcVCC(ThA`P0TOLC6dXWHb"sj)$$=r*XNZkn2..gfo!e4EQhZ%*Rr[NqY>/NOC%FYF..&gf8/D/od^P;K,?_1b"`b!`1]XYoQg0TC(D!G2L$.jT(4-_TR(0#rKkp_E->to/\)&8:cDIu(@8@#p3gK0p[(_Ni\`]%\N1&bkl'%Je2.L\!hDG=1!+&.J6mOI@"?)BW6SU)h+QT+.nI_4(-fZW>>=]+@c`\\#N!hDG=1!+&.J6mOI@"?)BW:pP!p1B+qhRnXs:-QA(*Zii]07N]T5BT_r`nl*RIf6gkYLYlrl;RON00]CQcAfE'4MGrU'Moo5H%9@ecN!sYoLQatK;VQgcW]]t)RXK;FFE#p0M_$S1#.6>U%Z\ps"s$.Q]#s1oPlKuYH#4jG8`?m)BN8"]#i@9qsKTehuubC+lgu3dDu#h^0][Oqrp?DJ,cg\;S6-2RQ`^CM,K[V^=/[m/>rOC9i%O1=/fmJ:]rh)J7=\f!!'_)8AG4XVbm]Nqp3uC9Nsj)$$=r*XNZkn20F9eXCf.2.H>?2`Bam6*6.Z6[Qn[h"uWsQ!_3$HEUD!a>E2[ZM!nVdDad82lOl06]0qUTs^6)>cdD.e#:[Fn>ETn2"itF:Qd@,Xkk3;lluE\>b(j5#oj"U=o"ki;c%8Nm4Vo[4rb!t:bj[5nL6@o63PpTf!Jo(BY<;X6No,+a`DCF(ZPJi=?jD[\G>poSOU"V>/SGrl2&PCa\AFg5'B*N4FYsZ?X"?>3u9GS3RRWVpd`)'MZ2\os0&kd3g[rghCZK\[fm<2^;u2`]BiLpXR4`$U'$bBsK^?=:S2p7kW8T(R:*-'qj>-d$00Kq%^n&rQ<\fdt9;`3'[kGe:I!U9]:d6p#qHWpok1tf+CaqGtk,eHEPP._;`m`c:TAIg5I'%f[3*Q2Y48Je-(^%X2#5(@s(n25LQ:URC0.VnRD5#%Ush/p@dTFm8Mm6%3VL2#:Lqp$inXINs#kFbV\UjeU%,g,T*FmXb[EcgjBc24YF*`#O!H?iEcONf!kEo3gV7i1EX50N!VF6frT\nne*C*tZ@^$V7[9oVYYQ.Hf_]2IP2HFWtn5.bV_J#n]*FjH$/?As;Ys0d'!1G'NX@))`^5=D@*N?9kO41@u%Wh3SBHO78=!oMXG&C:W\$oo$(A$n,:MSnY=G!03]7W"U9=O;=S#:]?`uW;cd%-m$pNk06l?"p%CcL8PPt146bf,MFfu6!;+\a!KZIBZM!nKUgC5HI''$5*"?uXS!3Hepu1aANXid0S=S_(-%=s.U\L+hIf3G74#qQ@/"!__:6Z/Bg8E\qO8M'/BDHjmeGf75B,U!phq&-L3-KCe;?(sMOtY-Wme`l6.n-a7afhT@[6Eq$*M$KUbB*<`I]nI9o1p['85;TNlem3+([*NA7_OhSGlF\-Y-.OQXZl)Yg=\oqrFtQ7s3`R(hW:DQhIk]0rg$?oem56c(ec:f:e^Et!2,Z"$/iJHMWR*^8(%/"'3.SO/!XT>lX^dDG^n%VEW4H?R1`_2mG5gdV=cdI=)Vq(U_DV&+3sH"amqrM0oO&%`r>`i-Y1`?iTt`rofDln+V9LD!]_i:%H45M]_k8rlr4Rc#8%EHJ&=jd"d73BRHs<'t)?$KO0sr.fS#k=fXD[WJsEq_2#Su?6IWP$M\cZ5G%tj:\#A'pceZNs8LpUi",hF-U7FK0LMdF5Q0hBf@JNAc"?1c!V#kJT=:Qb2p3kp>%b7ib>MRKhjV8q[9gR3GS*@L+5`#rUF"A;i7h9$Hj9@`a_(V3Hh0K$a8bqP5Q&EKn.5N7BQL+I^[jP%o44]*hS":1l2A6Fj[&+L!P!n,GbN6bb7A^"B5Q$:dqPSf]qXXaWHu)LZ'U*nK-mn`u!.6.XIJWS[s6ecmMG[@<-U7FK^\tYA2Y_BJ%@X>Vtc6qa2]hc/jc`D!1o(MBn0ZUcN(p0T)jHaX$?B356s-(9!,4tKjFua4;D)L!6$4U!K'H4!rtPXkND#<@q-#h-bUFZ?GCb+NP?J#ks,.2:ZKD"]d<`('"4Y0%Ua_(V38*Tbsn+RkYMAhPMUQ;T_XigrEUZ05u]d<`('"4Y\KPd9SQ-hu2Bgh;7!0ZEKS?!6$4U!Iu8a042GP2EVn9U(;0L?Co^,(V.%l[4X*R3/rgGlh/Wj"+\F)CDu+[F>hR<"0'qk`5KFifDk]Nrp$Zk^Ogh;-mn`u!;uVnXf[R@3Vr4pC:-gr=86lZ;0c/U?$pqm2!S^5bsk')n!$%VThgP6EntX]m8u%Qp*;Xm[nDZHt#.P.=SR$0Q;UoOTGJF%2Addl[5a^&6!9!X:8u:^mO&@V\NI'WE2sp]cFT-b/%c%qOj0AEQW#`<%WLs+L-bWjTRr?#trRqPh.eOYZ3'R.crd"(0e;Hqo!!%O4m?pF\0"bNPLHk^qYCHN:huE]MIdI7DO>I:E3'Pb=!!)dPHCctY[F\a^`@l]1l)10M[1aZJdO5+Rppa6E!8#Jdq>d\9eaCqRcfacR^&.7AWjQB+B>P!-n%(9`nXUC`9^2%[Bqa!Q(Wr!s$@h3Bt3"ldkYq8C7f;UQTMBrUnct4rs^:Gg(FC`;4mU^>Q%oh`F$jY-AMTi1/35a^&6!8o9]^OQ8De#4',l,KEX"9@&jfegKeLc-lBb3/@G&c0+[c*shqMKsPKDl]BDd?[r%I?iB7k=1dS%q@!o^obd`hUrFPtNd!.aCpC`;4mjR`0tk>3W#)'DW<1B;Bq*^4uHK-1$L:f5`3Dn`d^c0YQ,eo)n&17&f!'"kGr8SlKoV3MaA/(;Fm]3P*3qRk'E4qc9",'6o"pgFh$ih9\cThI-eQ6+kR4.@omG#bF%_]m_>WZTI!+Act!Q(Wr!rt!,qtKR:9H*TYhu<>rq[1,5E&J.:-M86!9^4D6n<,ao4hZ"(f(J-$8`TjMn,Ik#]`d8J31C*XPPP\!-M85VG^95-J,I>+DnL'1;,j5c(lu^mhEM!XNjEGM0WE@u@8`]uJ="Dp2LG>g[pNqcoah)l&+fVpd!Gu4NH-od&17&f+AD&V!:[;igY`#(d75:,msEr=rZ!D%jBqr[?]t[)]h\X`1hY8;@8`]u_PB?t!&(67s7t"@r6PCjjX3XU^4#lcroILM7Lm*R!$$a"Bn.n:cN%BOT)jJ/fn0M?55t?;4*U,REk-TbW+KK*n(R)=k"d6h7h,=<*i+s;S9^4E!R+,aKJ1Pae!-U.r!/*pl"pgFh$ilB#NWd.87LFZ"WQtQQ;P*siZHSF2fZcqf&17&f+AD&V!'li1&cfN].0.5\4p-I0I0K\m1.MCR2^8JkR+,c!0WE@u!*SGT!:4$UN)'DW<1B9\+3>)>()(>R&Ucnm68UUdCa>-6e?oK;65a^&6J2!tK!!$0a8-&!gU]:[aq@!o^obd`Pb8^h=h2E$J@8`]u_PB?t!+_KB!O/&U![(2%1I.>WB)mH5F!La/1K"4+8UUdKPPP[fOCaFT^huUKJ2!tK!+Act!Nm24O-3pVIkV`c6JbCNiS.XnG>q4W3tQj\'Smq,T1I!/*pl"pgFh$ilB#Nl9IiVfDnUH"hd\iVhof,,e1Ru="c:k,`%&*Ir+dZ-68o23.;]\'@%Po2"N_PB?tKLpRr!6?oc3[W>/11&7DAm<]^(M0t0F/;nU65=NT>D'<3tq*.ZN/COTHY!l8(\me7Sc3/9@U30Ko7hlDb@k>/&?203q'deJoljZ&ge(D!#)(S)4u)4;M]^NS9GU![(2%1I.>WB)mH5F/1CoA_cO0b-bh6?VI*S;_$k^NTtV1\pM:89ilpFbjNA0/3TqP@piD(t?EX'V2(:UY_h:Kjp/#F0$]aq`BkX-I/e_Q[=h?>fA9SU$B@)V$9,_qCj:3lr,ZkC"`n:>:bQ50C%YT>f>q1[/,YPoQOo0_oAQ,aU/1/*aD=^+QP\Xd#USi#3ee>i%JR/HPdP^FIqo]RSOf?;-)YJ&u=UZ?qa]DZ38QEHBeX&:F;[-ERk?urSq)RUR7-]>L^l/t^ijFu.T`VcCXLmQRRO5AOp2b]7LC'W4K3$4uh>5Mb^;RPr&HM1?sa5(:.G&L8,f?\aTQ1MQJ\?jlT@(NEs]D5nr?(d;*265h1^Q[LJoS@YUeTa)L^/CNVR%Sad:L>*LMY5g_]t>Z!FcjX^*p5'@9,l)D;868fqAm;tT;Oo7?b6/>djK:J=,jXdK4jSqY%)U:7MYLA3]5Ykb!jcc@k0at]V=\%15YSPbmqsEWt]Iaa6!"K9h)FO/PT8Sh^-Mo/PJs@eWWRJh;k\(Z?M]F-.u>ZF;!\-:HTt`7fh:(NU!rf;5'Fa^0T$$#"^nX5.G@rdZ#U@`q.[PP.CGb7V@?CWB!LZVGsT5`QRdt8#kD8k4eAMN`GZ?r3;9aO4`O#H?QZ:>H9#>E7?&+Q`lVsUGMcu*T\(bV@\s7RtrBYnbI.S*H3fU.?$HZJ*-s=:4l#t5BXs<,J_ST]E=NHaQMuW[:6C=C&%2/LH7`end:&V0F^c(TX(MdOpdl\U(C+BJ_3HqDoB`rbjf5?J95Sm-:"ha&+K;rFr]%\PdS+RDki(\Q3bC.\6*Uh^aCc]3.pi8[;C%;GZ"<)OkU95>@p(Wl85@h.V#EX6ZuBG.Cu+mrJJ1iDFquWDrGbb5)dNS7ttRlf/OpUf!ClZ@hsn53fN?mB]T*g9%0o,bK)P@RlU]2/C1[PKq9aYL`'A&)&N$=[%^iejh98Z1Ukmf'.?.NE.rACfCb`2^S:"jB%[ZSU]YJDL%;HaiZZ(8jAhVh>19,X1bGqqX0?t`N>5Ao1sCLZs/N-\(bS=ne[p4r[`P(0AfF:iVD4'2e:EA^HPi>;5oh0#Nl!]qBOYmD[.Kj5a^&6J2!tK!!$0a8?):NfSPeq+eCoARDs=dT:QHLYME=p0,IgjDVrN*RqY=(hm77(esRQ0ECR82o?h(BMsF0*q/Yg!i8g%RSRg>5c`0`UQi?,3>/o)bCH?_,(3AM)S?I+^GG1J[%"1%'D--;Ofq[SKG0.u(,r!#9DR71AE04I#PjJ(I;qXd*7^M4GjE1"4FW+8=U@INKS4?:2qQmMpTDA"ENFA?S2#VagdR0.o;?kHP\Q8GBnBJm`Fnka,08H4#]_`AgcT'%C4>cdI6(Z:rt^Km4Rl:$ag!6Pchl0D7V>$9e#h)t7'2Pu>Is.0P'/A38c$DD-=?-$UV0lcVtkZ84W/CCRifSfKj^tA<_^;9ZU^@Febet1olfTt_QdY1il)/3)(;D[Sf>'Z,6^?"e7X:cWQtPE=lr9Ffh^U]k4&;8q:-c:PGbRh:8E^4&7tA9_$XOF-$8S.4iAEA3Ps.jj_fKY?VMd9)`$d=fG*kOeqFsG8j1/5nLF3O:hCD=4pbs\g"^A*Wo>7I`UgYD)BUuZ$qZp.^Z1b/;0QK.\i]>J2"'q4C!n`9W(AT)lg)4p(dqR3O!^Mt7T!JG)LRmsHqVuSl31EQj$(ig0e%rQImagZ_HEGb42%$b_X,XP/fe\'10C$m@RB3<`;6DkNg78M[$7e7EtFfiD==&,N&ah^*Oj^W;j;Pr8nVbuuaHc,Kk0)Fa,l$DtL=c1M=S!W=Ia(HLY-%E@__0HZ^g3WbMVPuCe5=Q!10WE@u@8`]u!4'h2if.WN=,ZdbGMIM0nImO.ft8We;f2IG5*+b#aXG;uT!\FfnVglPZsV=TV__->e21n\>AU/F:L.aQ]SObUdkk^ZHDWN6I8dk&)R\?kH+'H\*M/Qd`G$5J\:uj*Cnlt_>Gs[\p?%t=m9N5#_e))\jiV;eI.abIT#:4&e#5V)r1^sF7:oNd4aJa8;e=FVc27:,I3OBILOuX&V,@+E;?2AAI0Kt@q@!@cAWE!'GGc7l>47q*CnsqI9,D9&j7HbC\L>V`F8;@FL&CdjAR1j7e4Siq':Ld]!*].0.5\4p-I0I0K\m1.R3\IX$UN)'DW<1B9\+3DuU.?_f^!8L;McA9"THVGS_I3.7`"/JmeqWDRE$&QJ@!4PTkkrlSs)eN1$L=.b^-XYYc5E\uX%DUa\'lKm0+5)rAu(G?kW&CQJ/UD!B\41U@*Q[aTi@AZoprc7bBGBr^dVTj33n20D;J!,leJ"!OS^;+L=/mWdJVp_OB(b#I%Ucnm68UUdCa>-8C2h%0%Kf/JY5-$e'NEZ8^?YDl@8],RnH&f,(fho);rUKfbBiJg>MgFPTF_8+\k";QCo*DG3&V3)fXg9B9oqV,V9l5YL0//AhB3nA^K%4%lC".Id)u1mg%^HI90#F:37;@Ig/lFcU)Kg`uagLPI)[7'SUEQT;&+p:S-";;TeSms=^7C"-;4*r[fP@Vb`RC\BYGf&1h<.G+:1nR2X/;l=ij+3&'kSAl%\&V^(7-W%*%fY:1nItjGFn.(SjlF-^=)oY8Y0j9)K3cmiT_T[>ln%N`7MUNUX0Z@4rdFsYK[-^/+fPt.(L\_R%-U1j4-TYf9;=74:MO"SO'7.GZ/oko,`8?Yf\NotHOfI4/ALYhBnZF-1phD@qBP)h*L\B*tCC"2D[>o+H['r&\.A8A;mEmRQOn`%qpX27Q*iq)YQ[HV9Xg?`cf\4H>,[IN'4haHC:<4oeFhg(*$l(;L\2dS&UO54u"YtAIde38@D(b#I%Ucnm68UUdCa>-7hRkE`1UUQY8CalQZ/CR<0hD:-P^RSp]8D:A`T@hk#AsCUo\Va$@[<5M-3N6nN(UH*Hf1rYfS_YT1ETPL4Y`:M[\]^%9nnPp:ge,ib8Y\1RLb4m>eEF?iXK%GA(?<\(bs!S98donVID/mf.6I?p/8[N<&&/*V#d>aQ!^fm%)#1b(\I4DLGGAt+KZe?,((Zf*)gpt]qS.r6:)/#Q7$feRH:%!0B[oXIL:GM94?o?hm+OOL0'ljHYY%&/,pl]XJK8e)n!0CcPFK+MP3>t\J_r5hs>0J=[`WXV&^5PSBkujLnq=H+Q0&gF#=gIO-4BsLN>AoKKZe9SFBa[MYP:`<,R.Pe&UocaXB.c&G`e2*@3?(3Jn7:)-A2IQ:VpF)NP;Y-8XZhI'A/$[=]=Zd5On=./Qu7[1cXS_7$qKK9mR?N[btC7AnT6r7NfkEN9u]\EFjJ("jRDMoI4^r@kATPFA>B22PPP\!-M85V+Nk`2JDH.u!+Act!Q(Wr!rsU4bN1+DHueuLh=ofVs1S0`Hg@fCDP&?nMoe2I(R)=k"d6h7h,=<*i+s;S9^4E!R+,aKi+;W?_1Re4qWQ4q41X-VO'd0qA?f\(O$EX=b:gUmFPd*Y,\PR+@8`]u_PB?t!&(67rTR*"I.4tS>IX;4TsARn^>8$q^A@,q6gk6[LZ*%f+AD&V5a^&6!8qG[QbWI[mbPLY^%U11Ei;^irU+muh7NFSf3]VGT)cB8cDCWZUcnm68UUdC?7OFgZrAM)n&17&f!-id:qWXo]^]+(fNM9OprFX?NIYCcDCWZUcnm68UUdCNo"E@IJ2s,YMMqkQ#+MnqZ'q,cDCWZUcnm68UUdCNn]0k&&/)Bn)$eQPtEs$D"Q*O%D_XW2@U3EobelGl8&EZ`#_*i=>#qY15\];rV"uqrTdf$^%VM3,A5I*@8`]u_PB?t!(ZD4]mD[[7AZ/A++!AV\44c@!Q(Wr",'6o"os\6Hp3&Yp"'_>7cj7;`F-0Hlpu9FJ31C*XPPP\!-M85V3(ir6hnML,P`)9"7VORtY1m+!EIU*s=5$^`UloU8n/q`#,\`PC]>+6TJ,I?:r6PE@cRZB\C`4Eil8(\me7Sd>.,DFTk6b)9W*PGDe\du5PPOHWJ'^8_cGmsjVoq&,42!s!Q#u'57fn36r-oO2ErF9FmgKDQs8MKehS05,df2D2?Z2R5<3nR0)n&17&f!'!05:?Pb9UXa5X3gKMW>!&:HrTfSL/rJi*AK9kOK.E`pp[6j!o^Moh>IIe7J^c`HqTa*+3PcJ)`KqpM[4rs]?HYW61MP[?'lL02r]?M+]9`p&?I0Kt@q@!?DT2MY1L"PTe]m:i^B8`S1f'$j#]^`u\pAbKCk(BCOfZL"=nro^[+F_4GAjk/-FaIe^f&rqb6]rr);8mq`mb5^r)'#a>)n!$%Wo:SVr-e8LZ4jXb,J24R1InoH\p5Z"%"NI(!"f7*7J?[V_7Vp;.?!p%s.J2!tK!5S,Mc9(\6U1i>a`pmLUa,Sq4b!"?V;=;p=&>6)[W@smihn=C2iPUGUZY=qdWQtQQ;P*u?j7D]Nmp8":.cmC-^DY)8GoTntUF:HFbH-lP*;Xm[YjJE(e;bLuj_PhX9^4E!R+,aKi;!6JkE.urC&4NpS4^!3=L^UVS/$s8pUbdci*WU#';Aurc4k./lpTceYb1SU:R+,c!0WE@u_"$[`qcAT5qXo4Ucf]:QD"Me8\_G&bu`5b!['I:Q%&])f73Io?X<&bWm7IB_PB?tKLpRr!05UCHhS!h73rs6oJ$@(Eqt+^auNGDfebs]e7X:cWQtR[Z$Q37i=CD,K0r()Dnc&0rXU(Oi.aCEM0:cd&17&f+AD&V!-#kO:/2:a7O=Nfo\K[hNLW]FKLpRr#a>)n!$&7^^A6oh5Q0ik7oA`fo1lUU6gm/uW%5a^&6J2!tK!5NUOiueWB)plRIK''*YJ0kubsYF8fIa(J,f71mj.rm`7Zt4R+,c!0WE@u^rtb&ro66"GiOeLLnY61_K\1,o_nl1F.>r,KLpRr#a>)n!5)9CZe=)O^\qW:W.4StJ!eRFLYafeDNqJAJ2!tK!+Act!J$N]hu<>YO$)n&17&f!-gO&q9OQikCV88:jHI3"n%Si$qsV5m?EmVFIHIZ@hFdd8]U6?s/WB)mH5F!La/1K"4+8UUdKPPP[fOCaFT^huUKJ2!tK!+Act!$)n!0CcP"MenE$@jh0cN%BOT)eqtb`MnXbt%jH-M86!9^4D65aFDC!4s*t!5bNq",'6o"ou_"7fm'W,6^?"e7X:cWQtPE=lr6Tlt3$n#a>)n&17&f!$KH)$%Uij'EDQ>T)lg)4p(dqR3Ma:Rumap9^4E!R+,aKJ1Pae!-U.r!/*pl"pgFh$ilB#NWd.87LFZ"WQtQQ;P*siZHSF2fZcqf&17&f+AD&V!'li1&cfN].0.5\4p-I0I0K\m1.MCR2^8JkR+,c!0WE@u!*SGT!:4T)lg)4p(dqR3TOjS&]NOek=Jj;6+Z%5+S1^EU./&0@edq.#u=Qlm1q*U]:[aq@!o^obd`Pb8^h+^j$I#42&I%4'kZ@?U(+%;,iOL8/aq)n!0CcP":$33i`j5i!>$UN)'DW<1B9\+3>+8\[Z!;];7Y9%jbr@:PY-X7]2>+/:ZH\^?%+J5esbEBYoH3CADoj=f;t8crD%Opp2Em2eqWQqo%#p`RjZ+$Z'qh\Cnf[c/uO?slrd&\_caP,:-2:n7EoR]2XGFF\7p0omGJcC:1]\En5/H*K=g?Rk'`O6^MU>3HUJ$C"a61DFOt`0WE@u@8`]u!4'h2\,kF5,$1j7:XC`Wj2GuNn03mnh/O,D/ml,OO6=F*`bW9,.X6iFn[OddG-e66Em\FE/@C4HCpYX`XOXFh##aJ@Nf*5bXaWFjkYIpX1#(VX21IY.7tjV0W):dXZi7PD6./r>^4&#oV0LK`hs)j:HY^g3>@'8:*6b0_l-dNtS^MY.?EhC>!>$UN)'DW<1B9\+3>0rG2-d6#P[Z7[26,JMVqpTjdR"fI6Q&ZW91Ol(":;C]proPhWdL_b'B>JBK9t6>?e"&BoA%U;Vhb5P&5?qNHVd8W\rD_lIGIk99r%e>cDlrPtI9IOL:3?:#`\94KUH/C$o$E7EoGHH""FuBPV1`Lnf>BD7No-3j!_+gT<;9ajEX_N5r&9s89Z'!>$aR)'DW<1B9\+3>0rD2ija3q)(Pf[6d!*m*SAQAUJeZL_l+YClaoqf/]s"U04\6H.>fB(.Z>5p6qXs)O6AX@Cs0to=@D@G1P)6XUm':mZNnR0B-744EVQ#o'6a%VG[$:.]8?0;X(98YPTS9MWB)mH5F!Rp716)ae@2e$F,@L,)HD+]R]5mYL?GVE9AAFQFLA5g\ufPY^A6@OUf$ga1;2uT)lg)4p(dqR3Q^"cL*Gh5JJ/okiqi+>=C?Y!@DW(#0WN"[JI)B7M\8cN!rJk"&aLegO:3?IpYpB?sD#MY36)RhmSl>/kQr0h;tMBt'VHGi^c^^Pnpmr<9&qV9\.UVbsd2h!D\Vjk#@8YaJ9o3US^R0poqj@PbSl.HH42c$27^FCDZh7LFZ"WQtQQ;P*siZHSH@53;2h%8[7ggl#?"]?J[#;2NC=Y-`N>Kk;-h<&>Q$Z]E[hlX6Lg#a>)n&17&f!$KH)M$UN)'DW<1B9\+3>0rAhHrZJ/rHBetcbi9S&17&f+AD&V!'li1'%a$CNMEEl78YWQ`Uhscb;\uh]GtGuQs<$J\L:VklKO5IO[c_c8VSr8'tema=bgZ/^lCe'lP\Lj/m6B)V&%;%G%u]kc'^LUU(.-eU$hnE+p'G9RHH75UuTMa`+[.5>#A0*Z_Z"=^SKP`J`^;_S\e^Q!+t7N@M$!qGsLkUL\G"d9U/hC(e^I'DJG[lTLP-HE#A9%PQUUAd_/3B2Z=\CKucj42^N8LFnjo["&26T5nWL>ub1r/.gaI]lru_K.J1!/*pl"pgFh$ilB#Nl6(00&pE9QX93(WH&]le*_PX_*$#.RSR+spYL8_Xg`2?.2Ii`5EcnI[upoX`=C^&!.s-F)B_`=1I.>WB)pk$p>Ec>O$V=_tZ<4F%`ufg/jd0_f.LC&17&f+AD&V!:[;ib?t6hp[6kh?@2'S3RjqpIeUJKmbRd:l`Ui4:B90,B@?ih;P+!,Ucnk\09tdD=t5f/5DRtbiue)n!5(EXrUeRj?[r$n7T$-DhK\(ecTXG_rW-tZS4s*=8UUdKPPP[f]Hg6J:LAD/Q0X7#;R^Q"qTWr-F6L:?i.a4\"pgFh$kOcY)$"n!gqS@=qJrN/abC;=Y5m>\B@?ih;P+!,Ucnk\8+3e15'utQ=)TFF8iGarI/ko&B@?ih;P+!,Ucnk\a6g]q#N,R\pMVC98gTs"2L=Tc#2jefRg'.^q@!o^obd`h@LjPE/=4O=)+CCYIf&NIrq3IMhKo7*OgAbP0WE@u@8`]uJ0T7+hS#D>U/K+1&&%];>U*n1!+Act!Q(Wr!s$AV5+fUhqWio/U[n6Y@^.ob0`^.C31C*XPPP\!-M85V3*%,KnA1fmW)T\D3V5$+i4:n;"pgFh$kOcY)#uWgoD(M8b?Z\g8li!W$Ir=f=KY%hrlSs)mG#+6DB/LD!-!d*N+fV&?[VC_Q!82c%1jlZ)'DW<1B;BYmbbd/[2eJ-?2@U3EobelGl8&EZPj[>;F+s*scn*3,Hl9tWnbi$d2]hVNjXb,J3LE=a<)n&17&f!'!.Q+$R>[ldiBh7u_m10*]TZY&q_M)t\8'q04o+`,WLG\3_+!FQ7:hqqIg*#68UUdKPPP[f*1q\pItcrse1/E,noPX;\a'%1>SJddoq]iYIrY1cB/U_>TA!]RDV/Qph@-1mDnc&0LED!?ktb-u+O>9^3uiq+7dAqrXAd@V=-iTi.K`_PB?t!66IZcX/[p8e!hHiG^Uk%HHP$BlGb3k/sghC_M>(^_8Y]U=mBp=!iYS59qPgf8J,oDQ'-L!61B;BAT)VQ6S(a\e?B1@lS8Sh=Yduph!)n&17&f!'!/,s7t!52)EBD;86BWO+sM)p'":SM_qHh]h03.FQUrj"+Y7cUf$B+A94]6ZY=qDWQtQQ;P*u?j7C(l+$==NP`)9hBf0&&4,M8bW(/m]GNrDNENXbU47snj3V;hA@,$mnW3,BZmbPLAc(S%\V?+Q04p-I0I0K\3:VYf%6>Y/R7.G)n!$%Vd%j0Z>FmE1?UO3bM]%&cH0&sH+RWZ4iK@?%GI$-;PR*mf'9e4q<9Cl=ji9s*shp"&T(bcQ-\VXr:%U:]p.(#1dIGXB7M\8cN(aXqSOESn2r/JM_^pN%t,]'\3sMs?[r%I?iB7k=1b8UUdKPPP[f*3k]kP=)0DaefT^pAeGCB@?ih;P+!,Ucnk\8*l^`^A7"hIsU]`e3!-3PAL*BHOmnLE]+@<-M86!9^4D6E8:Hfa$9Re7mFT,-n)n&17&f!'#:sJ,]8EYJ,<=;:P!f\!,&WHB/*:G0Zrc_PB?tKLpRr!+#m(n)(mJ2!VQbrU$-1SbLfDg0YPuk+ALIrIL4Ztt#?35(5S4s*=8UUdKPPP[f]KH2>s7nnZj+$ufl\M:LpV$#AN?IG[j,`Za\Wb4up'IFU`KGp>qWO\b`C'A?J4"?8%1jlZ)'DW<1B9[L\QjUSaX;<$hL5G&pYU>d]je6kqoi8_]p8LOGqjRp=Wgl6cohOT#gT:J_PB?tKLpRr!6?oc!amr3"[JI)B7M\8cN!rJk"#L=Au#D4PPP\!-M85V+Nk`2JDH.u!+Act!Q(Wr!rul",6>$)n!0CcP"MenE$@jh0cN%BOT)eqtb`MnXbt%jH-M86!9^4D65aFDC!4s*t!5bNq",'6o"ou_"7fm'W,6^?"e7X:cWQtPE=lr6Tlt3$n#a>)n&17&f!$KH)$%Uij'EDQ>T)lg)4p(dqR3Ma:Rumap9^4E!R+,aKJ1Pae!-U.r!/*pl"pgFh$ilB#NWd.87LFZ"WQtQQ;P*siZHSF2fZcqf&17&f+AD&V!'li1&cfN].0.5\4p-I0I0K\m1.MCR2^8JkR+,c!0WE@u!*SGT!:4$UN)'DW<1B9\+3>)>()(>R&Ucnm68UUdCa>-6e?oK;6#<,l*nU10gG5s7l4p-I0I0K\m1.MCR2^8J2e=/!=ND;*-=S->]B*VfLobelGl8&E*Q8oQX],<%WTL*E.SN0XdFRTdU%dGi8R+,aKJ1Pae!-U.rE'OX=K+?`=fKjoi#a>)n!0CcP"MenE$D,cjVF$Zp.6GWAH)S0fmI:@$HqEdX&JF"gg!)r4c5'V.*e.HUl+7_G8Zhp5nQQ>@aH.&UKMV3J/ikU,&Da'6_7qpOk-b-biG0;KO=(\=1eF[#5!gA]3-JtNl1Q%oSG2Yb%/P"&ulG-pJkGots/lka`>P+QHZ[lbb4p-I0I0K\m1.MCR2^?;(=f5,^C,q1Bja>Qle_?X4Z-o"_/*Sh8P=DZ0SpV\q^Kr@240;N+e]'ZA)RkWOhS$*KQoCMZ>cDlf!*'BN$b]U4ljBk9rHY^57_2\N+13&qDR/6-4^)d5?S@pT_mIi10;GJ5^0W>OdnZ30S]j%`;7ml2;[:J$krSNQd/]@lW5bH&$se_GJGE#mG@J2!tK!!$0a8-&!gUc:,D)O5'(F7FXF?06F\W7C3fBKk^aQX@aPV)q8$U#mim\R^Uoo$k]<9p7`?S6q_,=tdmRal^5&iB58Ldu8,"YA`gakpe9RXV^D$(W1.fm+SFe4-6N`?#4r;/['f8jXSKCc24(1pCsbqI0Kt@q@!@cAW?o/DFTL.ZVI9q\L=&?>e8/NUf!s:>)p(a2Dn_dX#/:Lj2iUnU3`!#VG[$c,/#%u>KNFI;ql'#H+Ld_,tbMAHujP(+0@0FHEI`OP.`Jjd^1MG2YZ)^GTkRLJ2!tK!!$0a8-&!gUc:-q1ht[a5O#%jc]^guP8ED[>H9<phREF.1At.o[Cim8K;-$K+33,&EUed[VG-+t%/Z+1!pCBmc4%m:DhX`N//n/Y_$q'cZ94AG(nZ9qsPt=Jbfcd-M85V+Nk`2JDH.u8*25KW)b'&ldmrYNT\:7UJ.\NO-Z!trZ0XuLuV6[P2F?Vg8/&e\4Wr4:[0`$R+,aKJ1Pae!-U.r*1:;/UJ>Fkfe]Ct=t\OAmcdks8+WZU9fI/lai3ddcOOJ;ijaFu:,B2oUf4jFYMcD0B7M\8cN!rJk"#L=Au%CAc]goD:+Fq@&!BCfRZ!.YHBO>`jm\,=Z]E[NR79_OrSQF^-Rj8;kuun`'Z\\cknrc[4p-I0I0K\m1.MCR2^?;(fdDb/T?P_;A_>5InT*sOc6SFEo$*t-lWe8S/nX!8H<+jA0>47I=UgSok8QuSV54-TcCQ&$P39T6+RDID"pgFh$ilB#NWd.87Z&Fs:E%bg>prZSj\>P!T(b/#lHeHpWL3rI2ipL/:ZiP?@#Et*34luj/<4c$FH6X.;DsUTc/\'HZ!Bndk]ZgGfl6Q%mdrVNgZnf;4#!&BrD#:X:,cO]p#bMFW&i%(nRV[uKkI,D",'6o"ou_"7fm'W,K5eu-]K#tj/CTkO.;*<@BVJYN;LM4X`Y9nN:*SesiMh=e]6FpJ9Q(nSgUYoEM'oX.+4@RZ$1YUFr*CgJpjHkVOca5qgp!DL[m$eM"VUlDYf&SgI[fQ1NC;]078F7cR)3A.[kGkpk`%k=0HNe7X:cWQtPE=lr6Tlt3%Q1AdkEM:QVXj[rB>+c9#iC/L[E1MP>oN[rpW)LcOVB%E9qtrJgY5[kMImf'I9PNU0<:7sQBUb9*LJ.">s)n!0CcP"MenEMBfH?)O39"c1C&:3a50VBiU)_n`_H^UI+9Yd\t).NpA(QX_;Nn\^TSCkt`,WH7-ks2]"",U3=4*+$FeF^>Wm2CRmrj`u7WPldSSNl/5]+cl:G@ki6ugcN%BOT)eqtb`MnXbt.AfS'729dISM;'1-9d^4!WBl$W0S=,5WC!"Qp"1dIGXB7M\8cN(c(jtD5[bMBdS?[M1JX6!0I^AHaThRe"#l`\&eoKE:pe!s,7KLpRr#a>)n!5):.dqPd\HN"n!duT"Vj"J.Aim<#V^l<@m%1jlZ)'DW<1B?q8q"3$2?[r%I(E5f>hK\(?cT_6md/+'`c#GWN&17&f+AD&V!:Z.24["5TPuk+5MFu^9FmD!$q9>W-&qCq\C`4Eil8(\me7Sd>AT7\KrThY#2C0;'oY(BG':_c!KLpRr#a>)n!$&\u55X]s='rY/1b.1?>P8*1%%L#oKLpRr#a>)n!$&HQ%j$,uqqo/V-n:Ku0%oH^pD\YKj_PhX9^4E!R+,aKi.sODpon!UhddFdHMd*=s8(?^*d[8U\44c@!Q(Wr",'6o"os\9]mKKk5)MrYRm-K$")s6i9`p&?I0Kt@q@!?DX8./BqWk=,.ZMU6o8CTId)Q-:lf)_!+AD&V5a^&6!8pt-nA,?bMP=">:?U!E!.aCpC`4Eil8(\me7Sd>.*^rH>V>dKM,L0L-s%lqY&K);Dr8:"FQ:_(FC`4Eil8-4uaQ7HE`jCd0!#+=-)BbO!B7NR0J*$INGJ<\?TE"iHs8ChFfRir.!1Z[EcCI%/'K)3b\ug:cWT0dO;)bA#,QO2;B@?k6UcnlS_Va^erp@/,jr1$I`Ajn45rN*+%q%NHf+_@J,I>OrTR*JD*`RS!)B.YV)!(9.GT,ZaFBkQTKX7'm4-B`rgk^F#FJh:$OOM,TQKPa+8%#^%B`G^\Gc$55X]Qj;-6X!9!Kpl`IWc%Zf0k1L\q=DKLK'=NL`e:SXZ09`'&70Rh:F#+1'Vrq^UWQ7A.lJ,$o'#.L6h!s#5pYuhtt3EhjX_G4U9'*cFPkg-N0;6R_1l4j:oSbE=^].X.HTfrQP_VgEJ;B3cRrpK7SDKU*pRr?"IV,76.Bp?s,7u3.^6.";`G/A3qdYJt_9,[s6!!)Mj2Im^`fXUsE+8k%%s8:4CI-8cqBbUPdb)DEOjas..Rgm8QH+b4$1\$+G-ia5IJE*G&0>IGUV+[.=rUa$&'EE*pN,YW-qHPZ>[as2A^0&MG>:S^ODIY1*o5i*gKI`C9hTZ8-e-Bqb\IoTA2Q>"&P;(^UqXXI[ji`u44aIgR;BGmX)SPgp>L/cV[;*ZnDRNY_4muu-;.iX3QN9'ScDCWJ8UUf1KP./Z.61@$I0K[HT3qTgQd;-=D,cFa::l]$L>?NqSPD+iY#sKs+cV@?1[X3'_"]pZ#08.a).4)38Y_S`(!=.\SkHsR;!`R!63@<1dEsucN'/J<#Tme4k,`I=->RC9RR*F:7nr%[?8A%6"B%$ileif<8OGIN!?V;)bA#,QO2;B@?k6UcnlS685Vh.\G%:pu."SHRTg))#uX]rqtqD:Gmm\dr)XmI3\f[#\VTdfq^e69LAY-a"+@+EqS_Jd;DOK4p(e_eWhXdVAhrm*LQOT!+8]p9`npiq@#%aq0[YP*%IgL!s#7LUIUAOJ,T%S78^8%p=f!P:Bo`]a4W:72Q>"&PApGl37MR@i"TC%?Ck19'ts:IpE"hkE]+Ag:$ON"2Q>"&^a]!%2rFQ"B0SKR.-f&9hi-E_]SmI,bq=%mCrMhbA$E(!0cM\)BbO!B7OerT)jI@n$C>(qsJ[CHSSIJfs>=d\"!(4"#+`?V?*toI0Rb>obdaS&R<)"rFF?ThuE]Me)".+:4ffdJ8A,U!O>:F"oqs@.k<,_cCC;-%M`jYGJF%2[.b2`'B3gH+IgknJ8A,U!Iu!,+92,V='pAu&lDW%:hVbVe)!:h:6)YpJ8A,U!O>:F"oqsXgY:IIrTR+u)b'_d-U2=SgXG"8!)AcbBn1"tT)l5hI0K[X1cmc\++!>(1@>#??ojfP"([Vl%$43K1B?ngHgot0[;4C>SNE1]jb=)8U1R9_O$1d-fq^e6A3`&2fr#:BAN>B@?k6UcnlkPPP[fOCX@S5WU+n5W5Uf!84/3!rsU7,6Zq@!@cA<$dX3[4en2Q>"&fq^e6!$msW!KbSt!K^%@1I*jtcN!r:k"#KJ1K"3`PPP]L:$OM75a",?!9oFV!84/3"([Vl$ilB"NW_U.,6^=jWQtRtUcnk\,afkXONpAtOA5!r5W5Uf!!#UQ8-#GA;?16kq@&H[l8&E*OuX-Tl&6;Vfq^e6A"&!(l)>VN"c9FUcnlkPPP[fOCX@S5WU+n5W5Uf!84/3!rsU7,6Zq@!@cA<$dX3[4en2Q>"&fq^e6!$msW!KbSt!K^%@1I*jtcN!r:k"#KJ1K"3`PPP]L:$OM75a",?!9oFV!84/3"([Vl$ilB"NW_U.,6^=jWQtRtUcnk\,afkXONpAtOA5!r5W5Uf!!#UQ8-#GA;?16kq@&H[l8&E*OuX-Tl&6;Vfq^e6AEnL@s*ZggVRrT8D;=o!re?\?Sp@]A&+TfCHrTm(uZ)gHHDVV.*kYBsHK!40\Z,RmG&ncN)Xo4p(d1R3M`oc:Gc+e[NC$:/PoLDlBbJsFF`siCJ2']IA+<<.m/*)Fg2L4:KBS8\m\F6"M;3ABm-Ad\@>Wn(M6=PiDn2r.6#n.WS%`4]d6Vc`SOfuC\;/9*,V@=&&Rc2F#ASg"n``US()'NJ0]1]!7D`632V-C9&%L_TMREGrBItqi=.KXK6?\EDlF)fNd]+2,e?5RSp8)FW0rVMNV*NC'5L&L_I>-\*P^AhS`-KX>V2M5oOobemAe7Sc3,]b42dMXJnVXu][YX']D_Y2,.2n6BSNN^sC[[?Ba[$k4UNanr_@M!]ANdC)Sc/;elI0Rb>obd`PaW(V;F@HUtl'Z6b1CSo(C4*;#YYdFMCaTYC2R\re.uWN3_SX/fH*O_UM_FM-;@7TNp=HY%%YO[gS2=5Xo@k37K9l`-)mU?//#^bofq^e6!$msW!KbSt_(e)/NG=5W:g/\hU<`$js7'tDf%.teRl2)R7#H%fP7`UZg]5VR`brl[\WcV1,-hKP_8'M:F"oq1L7fjg(Ob.(hAfA(i*As2lG5hlXQ_R&cXltmVoLQ)$m&!cY))@2//8]LhQDJ9K<.qB!O>:F"oq1L7fjg(Ob.(8:SYL0=KFF@V+LUi9>/!;&3[=F=PgDAF;i[8_]W:rG*B&49,QQ71.6+2R)HE=7_JXGaWGWQ=f='^Q.6hcK^A_lH8g/LPA+1c`SM3!,*D!C-0!#lf:VF3fh0uADs/l0VSq_%ch[8X)5W5Uf!!#UQ8-#GA;K,>.X=(;5RpTO%[@/$RbuT78I:cn:#]fH6.gu0hBIPmL]GER['Xh63h/9.@mSm7+rHgXq(32^n=c6W"?ehgr"L[gU`qjGVeZ>rkjGJj#D?r+11\b!IT)l5hI0K[B1.MBgSWSM6)GHod;ObjbSW0ORe`mA7\O.=fb;6]>^#`+,M_f@%1p_\B^SJDfcu%=nbmrD8^(o.1J8A,U!$VKQcJ!H/0D;"&?!FM=)DuDKG8HQGJp_RBI6IpOMoG,8H@MDO2M5oOobemAe7Sc3,]b42dMXJnVLBGkH^gq8:)GlngPs3BF/..9DE[UQc)o9bNOrWOg1n)T2?oAHhLjRRW-P/cfP5;Wh*XN3iL<-QWQtRtUcnk\,afkXONpD50c`f[VVN7P4k++pCf6l+!0YQg!(^aui0^<;0Ho^;5Xok-h+p61jRVEUn%S\egMak*`Z&idh)-uE'E&e3(d/TkLmh&MVZ6]qiuAhbF@HUt8K%aGU-8ZQf7O;=55OKH?;gr:8$Fmfrj.a`.du5WU+na!?Xr#uR;q:>Y$OO"XkSr:8#aO-W-BqV/d`gFH@.I/W`ie(uGPJ#NpAnPaP15^tfoVXqPhuES':ODO2!635C/-+pn'EHg^4p+L.Pq,p25)P4dDa!L$#65UI0qQ:+3hCF;A*WQtR.dr)X%H0(<*V,@&9hJXqF^aV(*F4a!D*aQb-!0#A]cX@nYH?AuRjd0>'3M%d]]mB`QSR4GZZ:THKR#lL'S]g,lRmrr3HT(0/[#Y=i^t=Tn%bp5irop'SWLlQVc/8Fn+H6F^NVqK:OA5!r^k>t-IXQnIBJp.-Xa9^qoi=!Wk+6dL;)bA#,QIhaAqY6XGWf"iTC:r>E>0/dH_OdL?n2*.$'7mH1Ve[64*PRq1oc]L_J\D\%5)RQ,G\162bnVe)UVCm5nGiP+O-F_<"$+k.+]P'j$K+nSCF;A*WQtR.:oRD`LlH"u+DfUi@@/RKcPCOojb:k*dd0:\a;%1s>$odIBcdicJFPVk*;7bP:spbB(R&2f!O>:F#+1(QhKisjfOuuUKUoMo(q(@-0^SG@eng,\b3JEKWDQ'SRGsn?!#VI5kHL!g4o2(+qPV1&:rD?jIIT5!,UD8K)f;t07[n'][o*/.p$\g1[6U2VY1Vg1[7@2Nqf1=rJ-4?C!5a]Lu5#&;6VIBX>Z]F-LN6UB#hnikRS@2rB#S5QBpHr:,htgn4BNT1S_-7V-">]f+SXUQ%1lC?%o_g1[7@2VDoA5&6pQ2VLj!c"L2D4#0P/(GJt(Ssft;YZZrD41DLY65gS]B%k9-!+7pD3J[R^TDnK?s8.nGiP+O5\Dn^\[5r%mU!][F\_XaeV\/cN'I\^NKZhPPP\A$#=-iPuV&E7]R;!`R!.aTahK.?Lo7-bcN>jg*oV3N$1TCAgV,75jP$^9OZ:THKR"Rtj*h><4k':I3Hk:+r/;.H@)hr,Ig\(EcqT0IAV;H]lGhF_Im*2Z!<=epURf=%orijN?XNi:s7O/#1TB$fq?asEppCbXS())$#s!4tg^)k94p]`>F)_6rl\&][Z'Ce]*+"&'6='Jp!N?*30Pi:bq(J"c7LU0$H8.:'8a:Tm3;W30K*E$L]./Bci;aLqes#MDN#S<+=$g<$'7mH1Ve\Aq9OOS:5Uk\m<3j17fiZuCn/BEONpAtOA5!r^uSb2Eb2gZ<7HJ5*s2LnEH2Ns5WU+n5W5Uf!0d$F/-+pn'EHg^4p.=*cT_6m]ANSTa[B!=c^p-QDVBFG!&,#1@0&o3U]AI_obl[u>ebadAC@F6s8McAhH']-8T>4J5WU+n5W5Uf!%2AiA`_.(1R$"UU5f3@GJBX@?31+#OE4M(dMXJ6Z:THK3(\Vtiu_WVp!lW%;2%?1fkaE1rr<$Gb;h*Rl&6;Vfq^e6S?VDJm@XCMVrNc2Ie&\p[+jt^mhl,@`&WSV+J"Vr+IgknJQk8UUfa-M85V+NYT0J946fJ8A,U!O>:F"oq1L7fjg(OTHYpe7X;J;P*siP0B$g88"^ua9,QQ71.0-YFI0Rb>obd`PaW(V;F@HUfCf6l+Z:THK!(\k8![+%r![*u^B7OerT)eqTb`MlrB;>OK-M86!S()'NJ0]1]!7D`6!4#1E#08.a)#tf$*!q.;7LFZ^;P*uq8UUdC82<[:+J"Vr+IgknJ8A,U!Qk8UUfa-M85V+NYT0J946fJ8A,U!O>:F"oq1L7fjg(OTHYpe7X;J;P*siP0B$g88"^ua9,QQ71.0-YFI0Rb>obd`PaW(V;FH_!Ub=e,)e!s8/11d<8X]1UP.[BD/g9g_YS:5)@!84/3!rsU7,6>HEg0ltQe-L[(dVM*`2c4An#R0USgD5u7o?Ye>(YmX@e[XEK2$)bYm!pB&ps8MZJ7aC;%#U:LC.KN>eBF$91Uhnc7@=4p(d1R3Ma&N!uR\6]snJ:DsD,,Vs^rCf6l+!0YQg!*\2tV7%"[>8)E$C".gIG>-htDG;#QS0Tn9J8A,U!cEHd4*mpW#qP\V6Eq4-\`h`"RJ^fB1$fmJrcH#]^=J`YW!)qQeoJAUWKg-Dk%_3l6G6MOPnp*32!`NsX/iA>m,Hk@j`B6iXkto!`aWdB5;O*?4-Ruj(1s%qjdG[SoOiS)+*J-K7,-O:BmG,=Fs4rgj'+("MM7=1\\#O0r.3ScL8BT-ENZ[\JY8)48u:4h^?r=#ng3U+h1\Ha5;O7&[1IJg1tu37,ql6!D00sq^=6=hCi";gQ/u8bfKX'Bb!K`VrP2',>%+D;f^D(BTbMY\fpug6CTAE%Vss`am1830A`hPCVck]i2-///m+41`7W!"E<9ie'i^2/&W,KXA^/c\*>).Ku>J&dnW+4AVA"CV?2_9>N5'L$DmR!N`OW+jE\_3`2]M.-\%19U_U5VUag))oEXVJ74he"([Vl$ilB"NWb%TE[b&^Ab'G&b`0P"eYe(]*eXN,&:c`^)n]OuLB+>&T].Z1?kIk+I(UR3YLKmrfed[8ei_aX-"+_dU6OiZk3dcIk_`[V1TjXIAXtRhERYa3q:S-L`cLsKe#Ye*ciFQm9HG=Ge7Sc3,]b5=AGr.pirgJH"A=ZZom1IpW>60XrmY;DajmEQC;!qYW:U1eeV3pP,\!krD6k3H>Kd?&nj9_"V-8:ZY2"NWg1"L[9,[b/8=i4\lkd6r:(oZ*oF*"b&QmrBm/&a3tmQ\=n\fKrhZU#.?ebbDGL!crej&[O..TIGTGjS9j#hj'PrQ!qT.TW+b*EY?:mcGMbL"3l]QL]Z$X"*H&+R!A>d6ISs,E,!pHuCl@eB+C@^;;6.BYhcg>m]MJmgc,#NOWuJ2mY91?+.&m4Ul)i98?5O*TU:q@h(J)d;IA!VKrMTL+<,A\'=6'7\A.G[1R>cS.EK^HEo??GcMC_2sU@>U8'hPDoJo[jI_>jZ^tLD\$FPD2\eL+*\PJ987s7[OA5!r!'l]-&hpWjchk[(kRL!@Z#ZTY7lJoW_=2"dHJr['r`QrsO=MocFlJb;kAgf..`E0(gMql-\Y,Qko[Ba:,&iC@G/>BR9*+1,K+0kMQsX);=;965%E"U1NVs*?aij3CY:/-_^^e?o9r#9%]2nAP_Wh;V,EEOkpPfO7#@kAZIqQoNTAAom(&.-%24-k`U+]=:aSUl9.V]tDp7=G>BVasD*6E>QOh'T@3:g)bn&DPM7948'kNh#M"0(PJ@0pq_CteL9Sk]oc7$\_!$OZk4>f'M?&l/(b@2kIMDmTQ^Ks$2Q>"&!(ljid_Y?HL9>t<54V(D*1j=9b//WXd%HEuuAq_bo@W\^k!XM7:(2!Vl1*07D]%9M,MQ"k_UZ+RTN:g5Cc(9.VJ3D=)Vj[Pb0Fk.=+N^gVPO(4QX2$+349HG=Ge7Sc3,]b5=AE-CZl])E#"0pV*[97pa1eg"U/:;>lmN5e(lK)HD+3LS3O[ae_jimSQ3.g3qLdb4_TKe`--hO=q[Jl"gga@-a5O.9-"A<-@mNA0#tQdRg3aP@Q!NOA5!r!'l]-&hpW]VG[:,9Xu:ekB$Guj[-\rbibC.<<#ES;4Hs.62MsXRN=,FJS^b7W?838'<\*]$QY&<1/F:=neRB)5pX4W'jmB_i@fK2$A+Aon;>]goG4bZl\i-R4)m!K!7NK)/-aP^Gj3Y228#0#0k?$M[>79]RKbAd38l6"Y+iQe-2e=lb'\MS&?O-96s8kGfSf6*$9]5[Z*QH,7[NUTZ(7KFmY9HG=Ge7Sc3,]b5=AE-CZRemsj4p\`Z,BK]W@FD)nG;W*?[2%bo]#RY>Wp7GpGC+bBAO#GC`Aadj/UB&J,iYcA?iB^N+*N.70YZW+mK&B[h-JpMY2D+bW.(O?.gEW?fQ1^EFm-P8/rf.'7'Y,9cn"X=_k^0.4$%4X$HZ:@j%?(9pa/P,J+$OnYT1>0Uu9\`Xa]Jjb@-,1e\h<$,ao#.p&)gjFYA!lr'ZbY>s3+:F"oq1L7fl.!Ej"%"I05g2%=DL5GsHf@mk&Fa?-R[CV`a+]b)'DY#k@-Q!>H/GUE%n)k\rm,"\>[uRFC'6U];pf+"%#0!G6TJZoh"SLf9olC$s5C;!0>\_1rSBD)pp/C^!A0qhK:$OM75a",?0X@s];.8q6r9ZHJlD5cFr7XcNfk`KLXk!*(Kr'*WRjmG/hC!!(1b&tRMRd,o]MMa7.P6qo`OR,C9,S)ITNisaXk*c0L8_^?jn6,&d?^+7Af>I.XldVmZaIHW?Gr2>HhjlGjtq]=,>um,1BQ<#QM)l@q+Ve[0acNqQNPRJYb=L?+BM;Qr!I$enIZ!ZNJG$MT.q6U&sc&CbG&rN*$,>`*%$dF+uV4W;`si$=`4"([Vl$ilB"NWb;W&nt<]D6#J)=Gtc`p!)QLlJc&qA!AM:p$Nd,dOZ)*d5LU,gg"i2WOu'.u.Wud'Q%O;iph/KX-*oprEm/BVR'XeNA)#a6)\kje-D:bL"8b9G%r13(kBX5[2k(2`>P6-Z1KTq_gsfRPf2sY\h8Jt'LJ+D:*\OR3#6W`IX^.AGZo<;F?+&&io"Csd]d7K!iA&cZk;jO0.,ZA=aTH(;q@!@cA<$e'o7m$to8eTJq+bTg;oMmRFMtpS>./Fo418DKd"YNK$D;X4?Q[%`U6.BQ'AEmAO1[^>#dPJ\*0"*JcrV#HbD]kdJOYeS*jDs3&1UO8n`7roO"Ls)7knT'K=2HG$tseSafoG5XR=2PS+a*#CV/IuB+Tf&]RJ$)O:6-qsrOj(ZUI.OTHYpe7X;J;P*si,2I/2P>=BQI/3?Fn%S\mgMajs`Z&Q7c-4C"Imsr<:IP_eB%-/s^tobdaSOZdsYi1l>s3d:!s0'-F1"/9C)j(m8LIIY8me*]<5EE*pJh)d:_mOQdhXgbcCSPEg5]=kl6/obdaSTknR_'oU&kk>6e[r8SlKrqYa+hD9]027GXtX,U;2\QZ*ff5$ARQ#=2km7n\F9!c.:<37c)D6MP:F#08.a)$"o$I/<**YIsGKGb_4iX097K\[a`fr<)!=31C,n-M86!S()'Ni!$BkZLZF:023XJMOcbKk$S/]?`1T(!1XU5dfA's4p,>Zq@!A:#aUgD-^R10MV`%#q[1,1E&J/e:$ON"2Q>"&^o@(Crn%02R4'P.qtBDkmkFeUkA2%ZS())$Cf6l+JCEm]J,7X[YJ5OLBiO_Js7%321%"oD@'Z:s"([Vl%$43K1B;BOIIk]BJ,f7mJ!*Z.XAg\JhuES'VnMg)9TZSpJ8A,U!O>:F"oqE'ldr>4Hk[[!MB.d;,r!2Q\h$p"*Q33\]r2!5PBiRg-q\obemAe7Sd>[(:;>b-[nA=O_n9*s2Ki`S!(52Q>"&fq^e6!2n7PrplCW??p,C+K:G18oqu"67H93)gNZ*#QEaJraXYP!e?,H2@V>H\Qj#dC$G6859G.Yl8([`WQtR[WAO/dULs,6`_%QDDYH)t^==Y`e4/2]]12ml&?drpTmdmiuX7I0Rb>obd`hQ-Pp^2aVaGQO>k!HM$dqDRd9dZ*psdg"M8]h!0Xid`Mh7N4Lb*!s-2J31C,>KYQ1V:T*)to?Ht$otUM!YJY9EI0Rb>obd`hI3(OtFQUf8k=ptW6*RapMI+$*h9F3/is1LQT\W_-*iuc\d9k53c);RC4$1nT*WV.kZY=q]LhG*?18uAokXRRLg_b'[FkA2&E&sC`.30@X7#k.dG6bNs>[FkA2&E&tV+q4qLAP8u4cMi=CQF:nIco8UUdC:7l"#R!oO71`HR+X540#eWiVVh2;2-CMS:/e_89C_MqBhr7WUj,DCrm^?et#@(IOIG\aJ$`oO,A_%Do!d\T`(rRA$A!#[&A!WYuf&['Vbgq?Tmo\-.$md=AV%QmbWD78#AhTZ8-e-Bqb\PaNb,`HoC^3i+oq=<2.tsY'#==2u$?is/EQjXlnMV,jNTqNs5TJi+s<>&tYL\V;tH-obemAe7Sd>o_IT%IlTi3['`"4*k!tA-4%J#Df*ut[5l*9UWuR/Du_QmcDCUh@@/l$r]eLE.],B3AUWuR1GQ9FHcDCUhiM\Tu^j;q0=0^]&Q5`rgk^F#FI]#mYLLrr4&eLPi(W!84/3!s#7I\T?q'#`g0f`S>WH3=NOiG,#">D79%W9;?>UlGdq,!rs"oC`6[oiWSP^HDoa!ju:3=:bhV\+Igkn!8phfIf9+Vq,(t:OBYs`hhL/:]!Z_0G2U-!@At]7DJE9.p&o\*UT$Al8([`WQtR[Bm&O[Q0Cb8;$WtH$ilY/B@?jEOO*)[cCn_41I*jtcN(app#seuf3a#U>#EdbYIujl`U*^$eodl6EAE4fq^e6!2nK?o('09W9C@]^%VM#OL&YOCf6l+Z:THK!)Be;^A6o(5Ps-U7o=3=q.B9Me)#EO-HOjs5W5Uf!84/3!s#7R?iKV_+9(bb-Q,?ADti@[?VYs_!LPENdfA's4p,>Zq@!@oHCoWZflt4.h33\icCR0<^"p'i(k@Ha2@YaBl8([`WQtR[Mr=I)lR.lcrVlQ+TD#u#E"\[8"([Vl%$43K1B?or=BSceF6:^-Ei<[3^\cjUVS/;rS.K>^!84/3"([Vl$imq"rqOMu^A@,qPDGq?KgN-!SG)p_E,qIC"([Vl%$43K1B?o2g"tTbktcdihC.Y:5P[m_h4F>3!H=d'9`npiq@&H[l8&G0U=n5Qq<4T7^An0#+$YO<2Y,V[r\iKg[.alWPNH["+IgknJ8A,U!Iu!8='pCKX'bg?j?#r(4aZnS^]&A_O_O7h!7TnC)BbO!B7OerT)jHYfn0M?Y$JY_mbG?X/iQH0'fCmfJ+V,Y?[VC_[/1?K1c_$0a)>VN"dsPdO66-Uerfuk0F#-8`iPDUbboaGY+Z\Cm%9(\=0QMto./5a",?!9oFV0OE0U+If0(0J;M6!!#UQ8-#GA;S[NKUO[0D7_uU%56Cm2R3M`oc:@ur-&hu38K%cm@f?c9OCX@S5WU+nN0c@.a)>VN"dsPdO66-Uerfuk0F#-8`iPDUbboaGY+Z\Cm%9(\=0QMto./5a",?!9oFV0OE0U+If0(0J;M6!!#UQ8-#GA;S[NKUO[0D7_uU%56Cm2R3M`oc:@ur-&hu38K%cm@f?c9OCX@S5WU+nN0c@.a)>VN"dsPdO66-Uerfuk0F#-8`iPDUbboaGY+Z\Cm%9(\/QrmGdEFmK!>;\,Tsh0KVR1YA.jMtq5496VGC9(UO"%N-RPJoNMp"oq1L7fjg(OTNNq)Ki"Q/sPMU3MC[j)E$pMOAXFS(`2dV!.Z>9,QQ71.:Bfa;$X^7]l=#>m;V7IKob\^AV8;SNLG$7a=(a:N/RKf!'l]-&ch0T'JNkAW'U$Od_e/5iZf\-RN-#U_iR@(\T18K[0qT4]4Du.G]Mb9r$kJs*@FmL\d*FT61:b?ML$PR*q0Ce#6-)iH)^01L@T'X5iKbrW\F.WrK8BCb>$SV<@VS>^LDgim$5SdY19bjLIgV?sLpJ!5(Y\(Q[%q'SC,LqsW@NF0co0Z/)SN6s[K&]p?knU;'pA/k18)h7GUqnQ,:2NGI("%pJLsIdhSpro3=Y:SBo.\63b-^DlT'me='8])UX;S#+R/6T0:t\(UL?hMhG[s$Gu4rhgaV0c$T'N>Wlh/UB(U)Uhhr2P]mp#IWtB:>nP4?'If&,a7VTSA9)NlFIEEWj>,;VWUUL*Wq9kh'=*l$,mn;&Tc+Whg)i_Jm'1Zd3DoM.L\o;TZert%@_jt#$pZ`R\@Cm,Z^=mg..[T.bNie?m\]p-!$VGZg,QQFqm(B8EHe@>PR5S!A/2!Sh$rpfsALMe\iO)(6Pdeqt&k"DQEmHRPS]t4r#[=4XKVWapTO/'r_I!B=+HdTY,4+j_o3kTOC*^BO.rGHtg51l:C__@+s2XBgb47/g:lf5Sfqa]SdAiHn_:Yg:5f&+*He%V#ne\0#^r;/D`3SNpAH*egjUK:H6`@^t$eEsl/G9/RND1$fInW5@kS%WrapF%*BpAN%.nl&o(S+$$a4OG=!s2P"a2lh_JnEQQf16FRhs)Yhrp[Mk/HK\ePH119_M\j:OXlNEM&&\3eXsH#ro&%j4SZmG#mU2hMjL6=Z60h"IbD1Ju@aVHjFR.e7I=JDkN.j(q`l7in!$KB'$%R+e$5frQV,=]T?3kcK()]9j$1HZ_J*Y\Q41B.q[%I7+Iis_sJ%kQbFX)A#EV+)5_6$q$gUD&`\9k.RZh^/8=M!uIj[i7CY.[a@+5Vuaf\QoRS+ko+oTnJ&s$VA(m__q:0BK`MIqNio:;;R.mm#U_p[Og!dX:^I>tr^B0k0n242#Og^30JDhGTnHIIlE*3\Zp_gqVHF$M<7rGl(7:Z+GYWh7UM3;q:\Wn)I3;Fmm0/h7NFLDXQkps,'co58[XMePDs7c0d^^"Z5rpmbD\rmdJt(`(+1HFiho8dYdY3/MG<^nqd8AV6g`Gh@q`!s95J\MX's29?`#n+/Z$Q38NE\>+^@q&&UYh8nNJ$usHJY6PKes.V`V^SR+NYT0J946f(p?N,;=t;99V9g46PLJC6?TFpZ?\RHQ1bRe'QqaN0H0a^%p+%rL<=MDVTY"GT!mP]c'u0M8QX>@9C6eGOVSEhD]2VY,3%@)caT))SA+9og5Xkq/Mo:7*iU=EGMctEUFBR4P2*JYP+URh^#-?p%Ig]9@7@t5D_DCo;)\O9CZW_7\@QnqGWm>h"uWU@D(O[8Ul&K`,:j8Jdul-N1DItt^[=6&<9^!J>>hs5]`"*[&r`FO=f8G./WqA&.?bOj:.f(-/mbdKdArkoDXp8c#1Na\Tn"#s!o")o0Hk>dG+#9/$9qk-Y"1%ukI%8i(l/m?aiD/k07BN,bFC?iS84fTEeh=tVOPd^c;jr2#\\Zk;n&.H'hn9!M[DSe;UNJH5i-h@mjb#e[Q_Q2+Y.*!2^X?#J]9MHWV(NRYB3X!IBA_BLBN+2u[40-$ZZd"r+aVR4UNWu8K9sHeJ+L@)B:k^t7BbUZ[hg)kC)iB:hRR_l?F)O,^%KjQc%h(U@dC3HlfBnncaUnGHJ/+PN<@LE?9KB[+a\"Ck+DL2,5Uka%shAYF9KosgC#"I%t#*F2VQ9D]$U=`m!Ve1P\le+77p?.SW@sQcJH$>Io4j34W+WA'T@tG1B9\'3>)>VN"dsP@o&lb]p0DI/%5,:cQmt'O'Fbr8/h0Zf)'H:NqtWFT7[RO:4?.\eW2)P`odT$Q9eU8pK!(YAk'\6;587k7=#jeq7'Z:GP5(7oTQ&dgu7P\j6+*ecetD/F6!8Xj8CM$c.DD2?he"n.dCBbm@@-(]XN+@_Y7t3(ab4*Vbt(L`t#Pmp&881FK64E*0MQgE$ID-]n7-XIsPs/hc%qWr[6,iUNXC7#N)BPp"7sQs%j3I*0\f8a*t[DUR-EN]EQsJrb&L.nb)oD9$&peg[$;f_gF!2TAZP-Nt36.o)gZ7Ik+"Sa]M*/?sLpJ!)(U7Khqe#:(t8\8ug?<@$?_,8&%TQe\JDU^=W2K#qjhJKZ(\*r+#fP2DYAnd&XWc`/38D4M7jp-t@i/p^"SjrD%V89QI.<`IH4"4OIh.(U#^s8gT;7cj0,sLORKc?bNu(_']J&QuBrr>Pi\Tio'QOYpV'^*ZV(*@j-h`EA;qI!(\k8![+%r!lf$BBiKTD`RW5(6^Pn?e#:)%mL5kbJ@qAE*oG;q'1l7:2ImbYSjm^/&?jPYWeB;\W"oD:](qgA92qsMb6(UY3#)Kl)"47Un)[DG;7lo0.h0C9js+k!=GEiNiM;>37,&-"N!o5O._V.%(Q]6Rj=]Xr/:4E-_,hD2S;HXZ5orG)Utes!A#7_uU%56Cm2R3M`oc:@ur2;U0iQfdYl1oc$O[f_e-<<&t3OiKOFs*oB>kbL8GrsAJ8NJPDYW*0T6K0^UqK0`nLMa:0DKqW5hJ\b_J#RgnNP>0+lL*96&cC@'S\\J#(!O&+8E-K!ErCMFpDJG/,e#;JJ4j.B&r)"@iBLUOjU3LVMb5LS1>&TbNj_hCscA1EBJ!?+6*:k\)7DA.30A&l1/^h4=R?97i6p5q)#2!.ZOV&chUK'G/h[9V\0_%8gs\p%:hg'g>6bb&@:ZFJ["/e#5KJC5kG])cc>!o9J+)SR'Na;S7"!8NXi/r?kL?%"Fa9Q+_VEC2X>`)n!1_)tda>Uo0-o)P0D=(S=36:TsD+GK%bcpicI=OYo#AhDcI]POnLUQS.ALZgY:I#\b!+U4*:HW)=i@:sVf9@>02/hs2JNkrsA2%91fTnu6I1huRD]cB"jg.tqlUZWDXT]b:.15"-Q59c*`oV.rRiek9T4%bO6EY,bAbPX!SJ$)O,lcI.HAVQRX<9s4O)P0E`(R8W\S_7'_&H0^g@_Gfag.[AgePc)Ic8N_Aor^6ff9.8P;%SW])$$=%N3"'gC-?AJ6,n?,ns/"(>c1W*W;?:uhbU$8,J5]'G1\Y:I_f4b=dq@FMPi,iSmP0dH?"%/:X\Q`JME(:To`G2I(,&CMs47K!Vp:o-V_TUqPQ_?ul([I5.eGIXO;iT'&mbC3]l!;C2,*[n[Mj1RK#;O._f$pY3.9W-k:nmk/9f`BgVr0=gJ\d?pV0l?>3Y]V*-Sj+r(S(E(!03kXQf+D^X\sjm915_NJd:,@(hmAH.f+HI^_FSPhdVJbtFPte$\&dgu("=b.G5`jIY&lh4*f3cb5hXg9&3`iDe2(#g=M`IbbcDb[f6qZ:CRVE7a3eE](^qde_1"OCPB68pLI_.l#'#c=A5:`u^=j#dPJLW\)%F'UH#bq%(0eKLK"W*ll#BS5jcZEtotE50q+D@Z3c(*b1CctpE#F[Kfio6@nRT$W6\KA7[76Qn']$1L*XAH3dE_]:;0H$TRnr?%*W&Is0YL\g2I.?X]j\P')YH2he[.GTqL1Z%n"in7^CH0Nq:N0h[hnAh..?R!A9?P-Z6nqDO1RP(?6;:h)T5MD)A2Bja`t8Zo`p+UG;UBeQ^:orQQ<1a.GrSO1ocb[7[)ip=jLsqQgo0[r>glPq$hW+BBQk/:@BseYM9lS;R5=/=`8KqbC#j#^VseaD'2]R(j[2d-iI1^ZQH56CmbWK@1ZB;U3`r^@`j=Us0Id[LJ5rgifTNMRE.&)UBSm]O%&`o!kPXY`&'0,SQ`2FqROd;IOMO'Nf2P,>q8k"sa#O3>AWIQD35Pe?d.dEOV=qN3PP806+QApm:GcFYAe?ca<0,.W&G9"6ttTjdZpqhmhHi8o<"<70It`LqGuhFG98RD&69n2)W;(Qh/.lPc_%__l9?hM"SH:SXZ=3kO\F:A7LT)@r/.L\gYGB\bgSnKZ_bfR4j>rb5#WO@DMal=U*I.Q%h=oun*]eiud%18A`7g+Lh7/IG(tFFC[CLXT_K:,S$R$p*oe4aW!HZ8ZZ^kJ;7_s'W+[I+Z.S\&J+&pM!T8g2EVWX+s+*P2m!9]#,mklAKP@1>=C8%rKB(;K^kc%,Ya`;alR`9%*-8\QoW-bOPR^a%J0oCobmrqr/)Ofuqs1?@"cKDrINKb+G04*dBmLppFaMB6P=LP-M-oEebeBcZKS7cH?Qu4Q_.Ncal.JNDg'=cC:ddukEh/#IP';5=qZKF$:7TS!ru<"OT;=mVLYoM>oH`,[%cNP2]@Y[_bo4WIIUUF3#_M&j7-e>*qolVW:bGAe*FBHPI14JnQ)?Q2kuucE&\b[H@mVph"^$r>=QNs/`Yf'eG].ohe;;-Fqfp+rU+&uj>,D&LAalpe96#lB6i/PT-B:bK3i^QeP@@c#BCQD,YROe(*kCSBO(NI])!Cp:IBY3'$GcOWiUW.j"V+;l*>&MY\1jTLt1H5Wpn,KI)V0s!j4UP[8S,_nuD9`r4S/[o=7L_5Nt,!34O>!7Wf'5ZlG_phqtT`;B3Y]q25+_BhcdRq'tIj],.]BbZ5pIKfeN;Bl3=cV+@J8Yb4Y;_*_pKC324?*0EneU"r3%`Ztrec"lY]obcM.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d4$EVVg"NsC0YSb#;h"ehle!%Vqb*+GkBk;P?h_0Vc>jat!7TG:`CMqp7Mg68-g>o]^(U1oUEC9D1B9\*)@:q?AdSgEBk^O.MD!Y'P,@(2iFgHgNM>Jf.sb^4\btQpPgcpF*,9akU\Mb!Jc>b^EO8l-P4O-NaZf%L7kYg)UA]D0?;KTu;KI'\m[Y$+2IO$Y7oAT-ci+Mj'SN30"otT",6:We9EAQZ/WJIY3b`or>gfQ.qQZ4ogX1=)Rk3,flYdSoFQ7$l+3dmQ\GL@7k?#kh;48Q35GJ!2C,_!u1s'')T18eUSMOtMl#h2Fe(/42.h/G?7R8HfB)mH32%fo^bS1UhUXH)Lrm8<#euHROCss[K/o2I!lWR/-h2JX_0(QtaNHed%1^ZQH56CmbWK@1ZB;U3`)O3c4B&,:JY\)-oJ5F7ROGJ*jCI,WhHnDlQ9DFPUo]ANVG/H>?mn\9#B=*j*Ie#5LEF7+CV*C[$J..0g10ADGkVI$H?g7IX4[.:ClUEC9D1B9\*)@:q?AdSgE3GHtc?Pp1CCVSVbUM)CM*d?r2H7mp$^*]o:Tf\cE^ZV54UVgM]3#nfb6POZ5h>"3[Upi90Bfb'UL2lBq=<:f9%Yo;5GW85E5@a/hhk\AjGiS=ASZR(YnL.+lfs,kPD0G2f'HPcb_k#Y#Hf+2g@[R+uTDpV5\"hboH9E@n93?!@EHh=Nh3B"%53fk#fO_>EFbeGDqu1,m^K]$&-d@j;CQe+HkOGm6'DCJMYa]:->oaDPHe`C*]B(mh(][DY2j(=ank&>6F:f>#CaTZ5:iJa_aPU?RCba:t3ek!**bZ!:#t$+KX_$;GrpG#`kq87G/rnsME=\"*p343\pr@?p9/!gc@3:6Um'X`3H(pQ3aC.Ds-SLgU`Dn%e`^_bW`P=*j_iqiXZ:_P4)]JQ]RPA/]YmJB]Ypnd7_MrF>2?rBZFb"os6Fj"r,SP,aX0N9?IlC%QP\HEs#'5_fAl.11\,p4H[^3)ggSb_IQL_?p9T3fHPEd325.0.W>,4ag%J-1N\HT'7?Q3TG"ASCSdi0XEniXo@AOW9it#4m%b"9)&;bBbZ5pIKfeN;Bl3=cV+@J2'e0=UZf!)(/69nbeMbjU[.64p6R%1D3)%!@_%lhb?eMin/lSo[g:t^R784Bfm=3#RViY&j`8&lXL@;5e/FD-k]g2MO2iGsGXs6g"'mhFQSYN'EdO>%k3Ku;3PWKDg$;l&D>E2OHBK9u\X\Q750XeI2C/*Nd*ffX=fo06jmod*C]ECYA/G*-mOFF4bl4+`=.AktGs6&N_saaBe=)W*Ch4&[%Z3Y$qe(,cA1q7AQi$/2]tQ>rPbbFn7jF=6<;,YDiD?+T]3_)SLNp<]=0^TU_#6cK?M7_jb-t-5G-f*#A:Nbf?#L7sm%CE@jgZfCUZq2e^Ef^NUCP=[p).G>>ORS@Vp4q%>E\S>]p/3*Fu)AN[`)mG?-[W*hqi1XgWoR?a-lXrm<3p"cZm'Z9=fP:F_>fC$A8FT:jb3/UIV^laBULMPVTH_+R;X7`ud-Mc9[QgDD0EDi2oV71C1qt#6HjQ_3;STY^Dqe95*UK3",:%OT!qkl6!qg#pk--&Gof\%Ena@)&H?Lb(oR6ko#62oZM\(#4WC6p=EdY:nME]5D,2U<:\\"79eDi^6cqit`^EP"bP:$41obM!ZIHSR\,;lY]N]b'P?i3Y/ba20,EM99Zf$0">Go_iQ`*'W^RXu,>C;%U8'm[b;<_p8>'kM'>3E4tPQ#\X7A9I8$@(ah%[EZ+G=gi_gB+TQ4qdaL&V-e:./%ZVNB2hW";A8Rr9$D@O[/oA>!@Hh2A9Wh-&e+%PR0=nHI,ZA9s@/Y]5IEk5&AHh'PJ#dZqKt59(I).EP:1mcrbF`FM77@Ga@gPQVGXgel7o'8pTJomqXHE-Mg%qIGNgOerj#IGAriL+Qp9iuVlec$n!9%5$>C3-U4*:HW)=i@:sVf9@5ThXB#p)TOL^j*e^EVG[/#IN8*0jIc-DoWr8]fC,6B-^21jZbM99D-Eq:UY&hDn+h,'9>!C#[ssu+$:7TS!ru<"OT;=mVLYlhP"$I(m@lboYL)a).?-7;Vr-[(!QsLV;(B>*Y7D")9VW(NBiHqn.%`"l?-2cQ9OU/6\bt2CXO#@oBdZNV07,Bi:J#aeIosBa35+b;1tu;j+#kf@GL,&kQU]e/]Z4Qe<'JECH$W\+1Wp]&jNiFi?[@nhD7_Bqb!+V>GkJE]e);uDDpnB"A=5oHGBGpkYOk`BN&7P\kM4Lar2R)h7@hIUWm#=h8_3$Doml/ER\+TtjGZ;p)?lh5T)eqle49Sh1K-P@%8!>;YMuTiTssG28(RRq6$D'48rrT'2<@`516&la,u:*B=8:uNIFm'uV"L(847(ao;jV,L\*WJ;WiL&M$Mi\b>^^""0AeQ63L-5smW@hlQM40"bYNOhVY!=-2!Xd;bW]c,f&t/WcgM[t'`1HJmiSWTs2`,S4\_]c\7FqRHRW]#)HF=hhF49+Q"]8'`/g3%hLAYp%p$^K(hj\;U4*:HW)=i@:sVf9@5TSGNc%-G+'(NEUGu*6%R1AVSCb>8m1^TA,Eh7R8HfB)mH32%fo^bS1Uh6dhq0[8H2Sg8Om#MXK<(NG:[b)th6ce?B[akB1dgjl%,%7n$q=P?tNL-@:0MZ?YFXe#;9IZXN%0InO"+8K&*TpXb\pbl8edpj*i9b.?f"5@-##KW$aX+7e!tMeo-"LVMq"e[)rH4q]-#MZ-='786LO15gUO-HG+OPP$YFjYq[u'cg?8,!F.'^]/[/[J]%Kl+Ze\,'H,":Ip?TE^01_i\'_O6^5a<5oJ9kf7#cf+_e9:bqS^%,A6)DKs-'aioJt]%JtCp=.)P6ml=A_r6AFR46^>VE9lr;8U%PCBh%o#`V]&$?4Bt,Jm4E-HhSQ-f*(B&@TX^N2nL[T4q_W'CNR.K5RO6)HFh?D3esk?%fcNq_pdlZ1pr,()*(O_K9oC!bTB?Kdf;L+`eb8bmB`#jmV,?tk&\X]\nG)Nbf5k(*?U(2/MSGVTr/3B]<%m?OCqlcCokV9Z8Sdm9F&n".Eu)[eosDp!FZ<\cgYHnXT$A/._>#0%XD)PNl*inQo`$d_'SN30"otT",6:We9EAQZ,`Tr&Jnpqi4T3jE'1LO)c$cJ$9,)U=J%H]-MHt8nkJc9EFS!!=7V,:TYO]r3VXGRA(?b_lk>o)TQ!MUS2/W$+pHL2B^#SD[YuVQE?6;OY\>JZ0j&SJ!$YIk:e9SO+kE"&ik\`7PqJkFk/tpF31>86?5/GIA'DEl\LMQq52!U_,;VpR6VVMq&ebOHJV.K\gfm!60Hd?nOMSed#Q!Im?4="Y,rT6prr-9BMID.b?;*=XGp&C75$:7TS!ru<"OT;=mVLYlhP")jS.+uq(-?\Lll3lafW8-oUICKd-o5:`rm.Y\H8Xc0-T?e&"qfOiIR7Ni^'tm;Y+W%0qOIFHi;>`Bio:Ti!mDcKjKQ=jr_lj(LOo%#3fiE&F7o:\e3aS'1bnR6OE@qH4&pQGqC^VbaIuk^i]6=$2ErZTfhdq)W:[f(.L)FP&.N%l%GdepFmqm4ZqeJ(dQCq\\X`Um&c@0GmMR_tA$c&)T"8T?!DDo"moGATm/!GdLR+U@qg.(%BN%:U;/*gI,oQVp0Ooheg];6a:Q/^09fD))!nu5VRN!bcpr^`LeN;Jl'tC!!$#6,QR+t.3P^HUf!Q?]N[4,[(/A[*`f%ZYm0KmeM4W7DEn!`1hpu6)cbdBLMIh&hZYDmO@J>o_gfSDeocJ27R_T=P^R_s_f6a)ZHJd2bNQ/[l^Zi0nG]ZL:S[o30,5h)XKT(_(\\^6'%M,Jl_]^ZIX1rm_r,=*C9Akhbl1pPO%Z+NcR?=eGHiJsr(5dsUJC:.3JQDa\Ym/5W$ohLpjmdcpQSoi?jP=@hdl=U*I.Q%h=oun*]O%,maV`4B?:@\)@h71PO5&K]%P?mmTf,g!-U[biY(r`W?&RP/'j6ZHV;;D.)U&.;P7YC,!Gth;J'b(EHnZD'O-Q)m$-c5gI0>5"E]-6cE$sW,^VeFn4Bmb85Y!7Wf'5Zl9&UGD/ob=4^unb0HHnqg\e=jeM-I+lo6qpa@V+Q]P"+j/DmfLo1^ZQH56CmbWK@1ZB;U3`R[-ESet[DWSEGYQMM#b^oF79e.nq\i]sg+1UXnApA&1rtUZf''eDI`,RZ>ssqrNTcL2IQ7SG-]N^SeB\*p37:h,A?SIW]p8er8jdIG1gOjBCr[dkr-t[SbiY`>6UPOYU],9g>H_)NeTs,\p4ebZrr$]9TO+fBcR-Qk@_Q/]\*dud>BK_:>L<4[e;IN/VECNT,`RCPeB\*p7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1:c#'SN30"otT",6:We9EAQnUOZs>7R8HfB)mH32%fo^bS1VS1^[nCBbZ5pIKfeN;Bl3=cV+@J8Y^fJP"%_cl=U*I.Q%h=oun*]Q8Aq^->=0IU4*:HW)=i@:sVf9@7d5EAs,VL.-bFFJ1t9Vj"iqV)4pp0WmjQ>e2(#'1m@GITUCbb!!$#6,QR+t.0,gYp^GMC`b,:%.Q%h=oun*Mc")2+BI;aq!'lef$%R>6$@l_D4p*X*nJM>"8rWs=4Ym7,1DuecR`Y=5!)TL]!hc-Q!hbs?cN)4#Hj0SL;Bl3=cV+Ad9ZC^qAhlOP!*#q[!2sP-!,*_>1I*`6T)eqle49Sh1K+91POTN`R>fGl!**bZ!:#t$!1M%)%+%\fB)mH32%fo^bS1'%A:+Sp-K?l^5a<5oJ9kf7J7^Q#"#Q53)$$=%NfGlc")2+!2rd?!Dq*9!RON[B7OSL4p(daWK@1ZB;PZB-K?mI1Duec!34O>!7Wf'!&To0)5*CVcN!rFC*WfER4/-)anQ:k9ZC]FJ1t9Vj"iqV)4pp0WmjQ>e2(#'1m@GITUCbb!!$#6,QR+t.0,gYp^GMC`b,:%.Q%h=oun*Mc")2+BI;aq!'lef$%R>6$@l_D4p*X*nJM>"8rWs=4Ym7,1DuecR`Y=5!)TL]!hc-Q!hbs?cN)4#Hj0SL;Bl3=cV+Ad9ZC^qAhlOP!*#q[!2sP-!,*_>1I*`6T)eqle49Sh1K+91POTN`R>fGl!**bZ!:#t$!1M%)%+%\fB)mH32%fo^bS1'%A:+Sp-K?l^5a<5oJ9kf7J7^Q#"#Q53)$$=%Nendstream endobj 10 0 obj << -/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font +/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.fef4d78810e71ebd5988d213132bdfcd 9 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 11 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 662.2874 140.285 673.2874 ] /Subtype /Link /Type /Annot +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 1314 /Length 99122 /Subtype /Image + /Type /XObject /Width 2352 >> +stream +Gb"-V^Ir),Sj33=.ZK^YQ'IVoPt_BI/@7u'(5!`cNJ55n&-cZ1RoC.I$tthObm8dgb$AR3fk&E6GD#e17eW"k3B;DE0dju"nU3/V*cS[alLEqjj7DrhqfUcadqf'czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!#4r8Sn!q"rtKrjTZ@m4WtbbPr(]:%TeKrLlZ0DUBP3keDJ;PA1@F6T*r,j>2/lq93'bBD<>7);pSG5QC=>##=[(/hSdUpOE3%oNsiP6oBXYV]*toq$\?@51:&<$m/8/",sVerpTk^o)/(Lo&'KGhuE:4s0D_7:%TeKrLs2=5Q+OOG8G[V$(V)^9JqKaU`.ZGq$\?:51;al$m/&)"8i3!n,NA?\X)JuJ,-eC6/C&iia%3ZG9OP]%SKHd&Q9g1omnekhWrPsEc8!Mt^rTdfX(DHS&U-H?T&+Dg`o05Si!IT'j+U"SZdXuq%JE/LLaCbcL4p-bB>-/PDq"=<&kXkoK;=pb&r;lo@^\gag,_43922$KZ6[Fj?&Yl$DP/(^PF*!O]1(ZJQi3Q>k+X#4S"14k+^N1_:(<'ppa2'e*-L9T_p=l_Al-(b3-OV&:\AHW0^TGg.!WZbO+1P@'HaWd?#/GT].MN"2N/0cRa"4[t";@U_lT-5c]9G[F4@EE/4;.Ke5@2V?s*iOf)Q>/r+q$^]RB`N$9Jp#g3J\nj#'cYZ*uqaCbcO5*JE!6Wims?kaJE6!-TQO9_d/KV]TM76X(@nsM'")8_Q_!2IU@$GnQMJilj=+Y;0*/Fj[qP0[[$cOcCi"rKcu:_8p)']ag[#[s]eA2H8T)hED&JTn0"9j(D)F@Q++^*k^KI*84,+g#0q$\s7N1_:E,:LV8eI]Sq%ETfd+Y;'H'2&=@Q,K#HAr#V&GLc5!rHCR4RnH_NN4FUW<]J_D6^p4AZJ1/Cfh5neo<-cX`0a&=.\J(e$nj&=*nBjFM%O@B"ulOj=T)HmXc!L9T_p^aLsiK!:3,+:hF=#YR$#MgU8`j>0s"1P@'H!Ci1`'SL$#"aQaZ62H8T?/:L+YKWnECZH-Ya90SP.5!rHC).4-r5s\UB:lkp^+bZ[1P!qQ%=Rqk2neo<-cN'`]#R\F(Jq?*]%3[:QO=]r?_NN5UOj=T)Hj1EV7SjY^&JX;WC'\7IL1HFm&=.\jMgU8`j>4S"14k+^N1_:(<'ppa2'e*-L9T_p=l_Al-(b3-OV&:\AHW0^TGg.!WZbO+1P@'HaWd?#/GT].MN"2N/0cRa"4[t";@U_lT-5c]9G[F4@EE/4;.Ke5@2V?s*iOf)Q>/r+q$^]RB`N$9Jp#g3J\nj#'cYZ*uqaCbcO5*JE!6Wims?kaJE6!-TQO9_d/KV]TM76X(@nsM'")8_Q_!2IU@$GnQMJilj=+Y;0*/Fj[qP0[[$cOcCi"rKcu:_8p)']ag[#[s]eA2H8T)hED&JTn0"9j(D)F@Q++^*k^KI*84,+g#0q$\s7N1_:E,:LV8eI]Sq%ETfd+YBk%u:fs0SXR*&J)OKj3:TYZcn*9/_m!HBs;'hjVnnI^k:GTP'RKQo-IAYDjGTL7E8(s9UtRsol]!UC3&$\dT#[N*Z"H%>:6#pSVsfP]^%:.O([c13m6Vk?Vg-O+eJd)OV&;,o4XA1GoHN^Hoa_nO9_fEB2FX=hY0or3.]&L0k2PNC9UF/'J%Q`#>MjN19$;4&b#5rUT#BUnL44_Efc<[^X2a/i&O)YH]eV`fi3)jdcW[-O"$cqY+0c<`_AaZ=6Y[G"C[S;psnG!AdkO!1+r7aYii6'9m%en16!a2TH@TBp;A=4AZLeD!-et9"ZK[DKW83B_40A^^!dIams0;q5D[XT3N7`ThlSQ=Of90Gkp0LM=DakNsco&p#t463d@#$DH,Nij6Mt6@;IuqZ^mL$.kT#JY-+!iK;Gj"cfKT!m@C^%$5^hmiuQ+W"rKe$Es+peM3[+3!2CY1nVj+`%ogG2g[8XJ:l%%YduV[(eW;?Q\Qunr(gAC9j7`)8R?)aZYX)Hq2%&C6lF,1/l*pZYhKeb"Et>Ciuam2)rREXC3ZE)HQ?qkPU>-5N^o"rQPG+rpsRu%WB*@itlG6`KcgS^%lEf2")qu1!o).4/,c4La2o]$!.Jq?*]%KC8@EVZLNP!qRDqm?=3\\21?2/h5/J(o)2AYUtD\+d*XDS/fL^0rNJrO@N.-HkSrk023\OZ]e]Mkpg$!H&qXOE%qmYR(DO%QlXfT886An76d?nT!SW4N,]ia=m)9?H@;=lk=:cT2DmSNYe7MZ.h-elZ$-O&+%H"1bE$Z0ftUrB0[lUM(LN?*6rKPmZOba^A_,EdW:Lp9O8UG3qf-`pDJqoI*A=Zh8("CI`TKp!u'7[hiWq[J4fbC%"1\^WB1`ii>PH`b-B1ccqocquB2_O9_fE!*5.qZa4^CX3kSR>4a8XZu\&f3VuY)-LcT%:O@dTip.rH:`Zj0%fM->+*Wj.hekbY7D@YLLl?51^n.UWU)12)C`W(F(tKG'5pKFQ_ae):\;J6BtZV`oap&Fj("prl(d)-7d]0m2[/HknbMh48td!pA$,[a=]r89P^hj7MqrVRZe=PYQb0SBqSCnG?0>CL4pkS6@+9gX>XCWe(;;(!EG+'Vm83Bc*%3rl06lhl2#Do;EMr&+`l+DIqL^g>`OP!VXt>A&r;5;=rO2:]ZQ`4q+Sf'FrEL`hl@^(M;\J<4Xp6N\2:21TN0i:I]$ZdT$)kl^@.hjJ2ADoN7mflsAkq[74SF-+UT9*V2tDRt5dm1_tLQ4_QN[7So0OWo3q]]8+B"G-=lra(Mkgercr:6M7!.[;qMgAj$lWqQ=Y\["!%T5#Y7\*[RHT?]$=7F_A/CK6FZZ(n]XKHMg*/_J4&uY?Yu[`YPj0h95[,D-(J+M7Kbo:I[!MGG4%WN%H"`=tf@B?tlW_d/HXAQi"@qV-g5G=laY9=8R!b!=QNi_UrDN*1NKIe;g0'Y__bM2UOZ5G@h3(@^J=O1lh,!j/t+#&`8dcOL5g[R@Ws5,]che?gbUVFIT&hR?'!I.K.h(?:-sFOaJM!B?TJdE?j/dZ"qK>.Sk7p>:Nulj_to(HOH#j0+WleG,eMj3G)%2N(9YfeQ8AR3l=m&)"60H9=FkKGsG=m-6MtVWif,>>h08rEIKN67+p>n]!spu5>G+QID*#:[laKL<(ZS`>=.[YdZt]BMM@L"<95eYSZZW5i(-SMo3u%+961aN3/dGk@+E$H&jQ,)e17(E2rI0Ct)ch%X&9.'i!$HWZ8?CZD<,"a&esc!.mGa!Ke&=[$%RQVXA1>\splPHeR?9u>FYWH%peZq=Ok;7+Wn:+n1NbUkBB]+VeNPpk?5*s3n5g$R53hVR\ccJI4'6957O*PA[;0!TKsE6#Gjf.aRM6!6EYl1f-Yq_T?YilkM5@W%n/I/D';*S2C9%%h8Drf:fR_F3W3RB$F--#qVH33KR`8JfE)j>4SbqJ7CTJArYb@?25W5CK&,3Na['[E83DWi*t\[(-t*?'oHXSor(SO"Lh#dtJTRr*-YcSP9;ckm,PF^%:2-u3]G9q]ET?]E7..*A3k8F.bNc"u%cu0ndIuk@H^uJ3gAT>d\!nm4/-@>\8'h"Uq5b[)OO%J5SGCsdrSuo1_Fs!cm=e%..1@jOp4A*M2SMeWD6M%2b!Z1]qTn9N;]<.6"gL!Feil.^n^'k&.c.kt`Ob""L20prps/5r[U3(E2`EqiqR(K>#IWWMNpW7>WRZ4FA9.@Jj#K'tk,$OV');qiME^2/.YtGRp[YY31h7MogO&bPL%lnRGVWss3`o"@q5=,3,\D8H+28lsi:@FaQRsrbirUufJilj=#E\Z>?Hs)"c*HSh`S)sqbL/]Ti=_9n3T8iC$[pK0-l]91.nm&mh8%$G\!VYf)S(9ST$$?JbK5>1Ie;mCm-<'6S7!TZN"so5sHtFT?6Xao=:KB>aG)VDRAfjRpOE[<1<"fKr.N1q?cFTl+$`>r-Hb496RY#\+&5>^4gLeE@kDRiJqjFZO^TX/haUd557%'n`%(!$+.jTI$W(Y,Na'-TRo`/X)&bt\R03bl.5CI7.QUb".=u^4*7<&pI$FC*1KBlSak9E-f1A@HY.*j@E.k#UYVdh(Q]4CjFM&*J@$Db(Nl]>G/gO9T*g5kQ%lc35/L1HFmm<\Eb<[nW,1Nm$$f.QGd,qZIqUI:0($)q!Y1d1ZW<2!/R*qUaB'0T#E1]29R\f^/aX<-h%&,L8Pq+R+#RErXsO)),I]qdTpN/"QjesJ?VBt`:^=VSp7`(J'(\@8j2fC:*M^6)&%R9)A<\*_QW?cc,o[l]tq9Cp.EG3nS,G-?CrO4toZ:/gW-+J/[(dH;K8"jsq(Qd0=eQ,]#k*'E(*3E;R.9A!QWH^]$nt$-Wc.U/#g+P]P=IRI&Y1/L?a9W.D5W'Os_#:e6@tDhga&Oc3gNs/uV:E,1Kn[(Jp!lrKC?b8):ODl440qA`FaIPsG+*\tU0"7T=,n6AKu>K?KiW?`@f<6g/0nAdLedLpeXZ?nC)N?UdjN\-/Fp>WO+,m6qEs^cDeYqD3UW>GF$%DQe&Vo,8UDsj/!0sNH$ui*Hi/&j#&1[7D]J5pj6+Ip^OMNc8o'\^8,2g3mDif*bgr84>XCW!"(M:U8EW@!V##@GP1L2.[/V)bVO(k8j#GgqFZFl>Le@g@'FcahtY4T)hF1k8ZbkdCUL0:p)2+V:GhDZ#jXIIWW7nH$[fHeps[AD<"OjE<-qC5outZ!uOKlY#9%/QZgj;eY-JF[bc13[mKDq4.p[>hH$($N2W"JE?SD:rXlB?B)]R1"2'e*-DO8n7X$=@ijf?gYghFGVZ1,,Uf]6.CG@e43hIUh65<%S,4fY@%+!OA,j43_s^itg>5Ah1jit6W2Z[K&6kf5"11KcnS553`k]8Vd*3A-7dA``Dq>Hjo;P;_Z'jkA1+gAPrL*rf4*!f>@c;RlA5E\lBQXLE+KR<[WffOoCM1:agErIC`EV&D>J5Q)*pP0W.kD!pO:oSBtZ4rYdS#R:fs0U>$kQ"N<^\h9,t4usdT>"IfcU6"QHQI<#G7kt,*EG49,hHl)J)@)GqJci;9U="mci*LrWqFC,lqTUMS=?*P?R`*qY:m#ZN_Rg5m)L]BCWSS<-9Lu!9inp>krtL-a%;lmGg0MV7brtXHn9a1o"oWP05P7`1jQ1Y\ac*TUPJk44$LH/^Kpee5HarKF>&!-T9+F)(e('<";SkjrODRenG?:JB,@W5BAnQ$?5m\G`s#uV"aQaZ%cDd4EUadS;\'iBXNsYkc]?f+T*]ILSf<''okm8:H,Uegi,mmT)ZMgTEoUE>iZ;Y+q%S+<*#)GAfiKo)3S86^Gs5IKSKm)LFG.[Q??:L1N!nNsqC\Wt49=qfEUeJO:p^2BA2;Ylp4)M-&'+4<6J:LBY^:+o8sR45f5)IWNRpS&Rh76\3HEWo$>\!&2d@nB3,rO@N.-HkSrk?%P#l((=VUOhk/DT?t5p>[>YeTt[%+Y^sr)eY0I`h2\ZG#4Xm=L7q*bK$GiZX\^Sq-IKE]gnediAgY#GfM=uai.uaS5QD_fDFk$rr$Fn/m]MVZVu+YZ(8jR1&253ME^2/.YtS-j.]>[a_m=4opeNjS)l`72%!84alhl_]nN`3c_8B0;dG/ABg6L>lY6/87So0OWo3s7Yof=X0Lpi$s&a[Dp%e+H>@HI*A'toI)i_GDt`3`8+kH2J_!QcC.GK-^aC7s!CkK"*'jbuep^j\DOXn1$ueLHql$L,&<3,2GL%@S*f.fgQS7J],Eo/=&+hs8dkVab.*)M@Duf@ZO1T3b$F>f6=#rE\cbB9[5Ha6qX?TkM]_p:Fn4Ib]9I%ETfdg\'dNm69AG-q_;/;.oC48_V'3\'6hG)PgY-&YIh\0&CcWqM&i7P=7\#jXa+qBC!:HfkJ,s.3EZU&*q7^j>0q&B0It3p>`G:@/uLm;,jbbAUZ%fBtU:E_ij6XhD6(g@'?;gpZ9+lb_S6njB+@//1kR(1,99lr@fn9'9MDqJksm2'e*-DV(X*f=I::@EXS>M*e>u3T,r.fINT&hchnBF'Pp:XgZQ67fR9%n]jYlnc!9b7NYU>EIo43PGr:t#HXB+S5B9(:''=7!Xqj@5"$2I8\c^E,DIG&5P$B=Z&4Gh9FmXkFYS)!^3.4]8e67;MgMh[qgHX.tVIRi,klOd]$nM7\4LV`TR:#d0'6gO9FP==TV7U^<\)$qCgG2J4W?&sHib#'b$hob"^iNh6M:n9el<`cQ`2;3OBq$\s753E2$L]R?lNJGi@&)2gl9T>B_="BQ29!u6SE'1V8>o9&iY8V94P1ttbN))[`E]b@FDqg[?3e)EfWS73"Q0l7Sje7DueSaqt$9ELGQ+>#3nkO:/FP<;!K;jRT6=G7iqPhN%d#WN,WZbO+F1WLl\418WqQ[$MjLZ(8L$d=4n\JP>=ueXHXR;B%VO%X,2[4"BXgcm7k,-/@4"J^0#F4T@l>Dd)*VYVA2+WoklKG.sQf?&f<%H_bj0>S;j@A(6h+,o4)geK0>K?8?3_8R-FP;G:M='u$SXl>%opt?X;Yk*CAb+M2YC9_C5*P)Lk&W?j9^]lc[.o^)gJQbn*?B(%CaY]#Q65:#`X@Lkl>5k#;QJE1:G:n^pBkDoBbn*0YA7t\4;4?+H=CH^ZqsqoSs^N:IlM\!EdW(BY&QJCL"#;7l'\e/2m[9^[K;Z:n%,s=I1tY`o1^LaRsk5dS^-N@[C3s)9i(HQ-?o">\AsR[-H?Kmg%L`/5LgI6Hj1EVT5t,M`*iPRLNNW7_mU'8D-I?8,GjqN@E_$M^\>'S8@AFRL.V*DCk%\;m:uNOB4>Sfqh>jn(Wn=DhiJ&))!OXYGSA5CR'.bZZu/]oM/G,>b)f!\FS_=nnH:QG3ossd5e*sjd4LO2*KO$hjT#LHVk6o,+mW_m`.1g4._GXXCd/giH`Tq]gl:.#>:7$T-ejhBt=?E92UZ"X5!Tfbc1:!K1YAe7^^NAab,FV`q7D>\k9-+fnmT-dBeMXO%[Q,Z@(AR?9*I:bggSdhK8_T-C*uAEneQ7/?I0oh7DmsCsq0Tn*stWRj^*ghn4GW]&`\K@_G0FKAq.>]/M[?e]E]POVj#2KrpL,;jb=05;)ciOEe;JkgJLNn6YdWG>K;?nekgLIG,:_`uD*%QRJKWVAIekA'[UeP@Kjn(Wn=Zp'GpXWOrXJeG9U=I?7`+%7QIh2[@lgle_>4DaJm=1Oi-=A?N^?6&]?AfJ/'c#t99kDb<7e'oC65,sOq8*:OA9-%qk2Q`H<'&oVAkXKl'q3cj%#8<;'^F"=kVnRnI@U/*H.$WH`ImWWO6W\lFM5K(B9pY"SXm8bheB3/D7l:.td]Y=$DE9P=gj>0q&F$?cL?&hY)Fi7SaEASMDoh,%m0JSc?2[\6dbf&U_]YERnd:H`Kr`8n_Y_2QDoYUIWGVkR(S"(=&R%7Pj.BTeWc]qP[>htqkA..:[8q"!!=mpP.\(4HkGYB/;g.jH-RYY:qFR(]=_S]jGLZa&,fbg3)fZ1M-4nIqjjEg/o\R)6_n&a']Tm$(pWOt3Pl]'rIl-[mUjnS'1[+`h8EsHrGUZ6+D6bMSP@(J+FJilj=oAfbR&tN'a)tdib%d16u%T[ACcaN.r$<THFbE6O6=B,`@&)YiITCjR^D_2eem5'H6-rTq;fT,+em*OV&:\AHW0^TGg.!WZbO+1P@'HaWdA7dGB/D]Xlh2V/U2H[%?'eD/$Z0W4udWuY29Qe(mtZ#?nekgL)*pPj7So0OWZd%l)NmNQ6WioI/FrVMX;oh"KulYWgU#q"qE*K0NB`8I"rKcu:_8p)']ag[#[s]eA^ctLoq5;.%L4p-`f,:Ei@#R^,f22&256aFdG#YR@F76X(@nekgL)*pPj7So0OWZd%l)NmNQ6WioI/Fj[qP0X-'a9W-i14k*?:^nR!eW;?Q)8_Q_A2H8T?/:L+YKWnECZH-Ya90SP.5!rHC).4-r5s\UB:lkp^+bZ[1P!qQ%=Rqk2neo<-cN'`]#R\F(Jq?*]%3[:QO=]r?_NN5UOj=T)Hj1EV7SjY^&JX;WC'\7IL1HFm&=.\jMgU8`j>4S"14k+^N1_:(<'ppa2'e*-L9T_p=l_Al-(b3-OV&:\AHW0^TGg.!WZbO+1P@'HaWd?#/GT].MN"2N/0cRa"4[t";@U_lT-5c]9G[F4@EE/4;.Ke5@2V?s*iOf)Q>/r+q$^]RB`N$9Jp#g3J\nj#'cYZ*uqaCbcO5*JE!6Wims?kaJE6!-TQO9_d/KV]TM76X(@nsM'")8_Q_!2IU@$GnQMJilj=+Y;0*/Fj[qP0[[$cOcCi"rKcu:_8p)']ag[#[s]eA2H8T)hED&JTn0"9j(D)F@Q++^*k^KI*84,+g#0q$\s7N1_:E,:LV8eI]Sq%ETfd+Y;'H'2&=@Q,K#HAr#V&GLc5!rHCR4RnH_NN4FUW<]J_D6^p4AZJ1/Cfh5neo<-cX`0a&=.\J(e$nj&=*nBjFM%O@B"ulOj=T)HmXc!L9T_p^aLsiK!:3,+:hF=#YR$#MgU8`j>0s"1P@'H!Ci1`'SL$#"aQaZ62H8T?/:L+Y(R7fiV@^]$*4-%XAjqU:B%!<<&m^P>Pcq!:sI#Y6hK#Pec/a_,p]cOc1c"rL53p\3k6k>@!6o0<7rk[FUc9Ct^jrTQb#JC0utkTk]):,R]$<'ttqcObt]VDn;ZTu^ksOnN/^oj>g(5l^DA^\mE4ri=ki@As2(hu>k96VB>lO8Sa%s**Z8!+MrOHmI7(rlJgJ8Fi2Ja_1B>nepAHnN['F5A?\k+!^WWMuN?8s7HIi<($G*WZh>&cg^Jc1]Qq^`VJVs7jXls8Mc-rU"NX;D;(tT31`@(B(d4IrqCamX\-5+aa^KOLLD!n1iu[D^D%7A&r9_#ckWkLOLiU&;Fp*OAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B>3p)*n:RC']nsneiRBj>-eO>8]^-J8,@O:\#AGTB%d.^fq[B!J"njOAGEb+J7^N!5MeV5llLN#`qjQ)'GR41B7j0rs+Lad.m^(GNKP=nju"IjHFrqJDggj:B1S83^3W8c?o[Y507GfI$2eU0KdIYIM!DGqJcN60V8?,:\#AGTB%d.%$,iWN$A3[J:Yn#(Y[[O+U<**s^.'o*GEm,bG,.8Nm6lnE@p/.+4.Yk_Js:J:*O+!;Rn4!FU0Ej'WSc`rYhMHicPsa_--OP0X+^4Sj%OMY,p/qI)Pg+J7^N5X*;&!#QdU3#G*\E<,qkT)asKneiRBj>-cEO+&(-,5jKOI[En2a=$clOAGEb!/=!.%RuS0*'ca4-NN4kHj7Y>q$[8@UE9`983[TW+6F4:nju"IjHFrqJDnn:K2JEd#LF"Q#lscHT)nLS4p/Uikf:LfdZ4LoL\V('I$2eUq';R5@!M>(?khkG!VF9W!^JrkB7PAmcN#X]qJe3Ho]#rJ@6O]7TB%dn507F;(`rW8(e+:@!<"UD!0C"I)'GR41B7iEIN4:jrA]=VQqm_'-i"14:\#A'L.=H<7Zi->5X3I?!9B>k#081f$in2?*s\Q357X>.jq@ac8Nm7;PC*RbiR*^=;5>9=ck#^S!;Rn4!V/fG"2OEia2'1PNs"U$q#l4qP0X.(,bG*FGkC$('^0%ba_(Sj*rS&87J_!(r@jiDOAGEb+J7^N!"=p;*/l*?3.QIF:B8H`q$`?\nehF^7m@JQOa\985KkJTjHFrqa=$cl!5kQR#GXgS%\Op+'*.Sp4p0l0Hj5,[d>roWU`Tig&+^)-q';R5nju"I_!pR._'m`m"6bO9"Ftl_cN*bdT)i>Eo]'Yn#(Y[[O+U<**s^.'o*GEm,bG,.8Nm6lnE@p/.+4.Yk_Js:J:*O+!;Rn4!FU0Ej'WSc`rYhMHicPsa_--OP0X+^49W1!VF9W!^JrkB7PAmcN#X]+4H;J\[gM.]kW&Po$r/npgr*=bG`&,0.$X+2Cl8UidBsfP9]pD!<"UD!0C"I)'GR41B7j0#P@&*DCd^7YEOaR\SGO'Y4$7H8j=q_qOh!B^+:$9o`7S&nG7."r\$Q%%\Op+'*.Sp4p0l0Hj5,[)0S74CU&+k4,b6E^=h;A>SlQr_gAI+(5p/(hnS#SrOQn'(V_!qGn(8@h>;2AbeF;Z3.QIF:B8H`q$`?\nehF^BA!0mT54&Ck"YJ5LUI"[G:ni^@^14W1O9tkc/qQ@@6U0)n&PA]rt=ta!;^+f!?e#q1I+.GB)id?@JAg1I`e"pg@-0F7/Dcn5,S.97pC60FkDO9D]_$:Ca*1tSk?iL,Dge%W5N:]pq`Xp1#P[g$Da3.FDo,`UENbsQi-u(%rqlOdqJcN60V8?,:\#AGTB%d.%*t%3ELZR=X,ETO=',.*f?"-FDXO]3IT3M.`@i7P0,KO2J#lp_rG(3H2Hr,0]=ts?q/o]kh!`r"fdP*H%_poNcC4KOan]lCmOK*]YMTgo[g7=Y.Mf3;heQ:pl'\_i[o\X)SQrQD4Ee4hIs#lGI<"lAe]S2Wrr:Npc)]D-o,CJRSl8a8j7YN[2sulBG]A0/rNKI1>jFB?a-Yf9OoO6cCCmJgP1>L+:BIN1U;bU3DOPC*SU-i"/N__\*;h"UVRoDYiW,Q>>n[T4h?q,Ws!X.=>qpqGGZna!&3s/`X#lhd%2rCting-<2d5Q4<\fW:>o&&)ee)E"YGI[a.0:#F9c?2JWdZgZ"7RfE(3rHd0Og8`q7m&r:9\*;#p'j,69#C`)EqXu6,KTXtoF+3.^qsfqiV<2'clbQZ3c/m2_Mo?1@(8FqB4gC";eTGFRH"T10o@D%VfoM-dQ^fO4g_K"ErKaY\QQMf$FOp?TQTl+RV:>lXIf<9Lo],dt=8W#a0VmUXqpLN-k_Js:J:*O+!;Rn4!FU/,[m$s0HoK>5S0++('oMgP=)1c$cqhlg!ZZPNp99F>[+[a4Y>,O.:%18&mMl$ahUiY(*"5?(Lpd(ZIkA:9N(&c#U'k4l!XDorE?S+)ohJr]7[joksN]qi'Rlh7eBmDgO1X^9d&[[qL+U7.[Xoi&9]5LleVpSN/Bs*k?mpjKh;rA]=VQqm_'-i"14:\#A'L1f05O1VN1-4faFI.d&\YOfa1g0o"eq\A9*io7;h&,WnQfPgKDR]RlMbF*2V?4>@BJpMB=H.INW&S>/f0G$5M"sUI\^?H^0GL2rCW[Z\*?\-roni8>:eW:4KKGOfC#C]Rs_o_+8>BlY#p!bm?Q9=Rs,Bk\(bM9D>u0SA4=8%gL&j$DcL\E`VHF(9)ET]TCBj@nb2K5eF')=;#05-qm%;&fXok`^P$h2I1:gX*'ca4-NN4kHj7Y>q$[8@'=K!,p3jL%en?,UmQ7j99O-q68U=p&[:\,Bb-Ea/Cu3)L$q=m"hl=,7lN@!'XmXD%f/(21bD_M^;+ck`\nfU#Fg&)Us'/3gA@u(/M^S"h<,CF1CVan`QaU$g^6nWSIbcl>bMV$7DuEiuOqWr6d#S:mL\V('I$2eUq';R5@!DbHj%@;MrRHA'ebNX9)Z0dhMj'LU202an0qJcAS9udoLMn>_R_qd_!eAb)Vp"oYWikmhq^]3h!Ru^jZXFAs?n*6tR'&NT]2'i$q$[8@'/.E9(P>^==3=m6$eVI!'3gfqG[Y2D)XKg;isJ^u=`'j3gXEgOCpCm2bt-IJ$sa]DoU"6pD0S+6F4:nju"IjHFrqJDggeO%\)A.IND=QBc71<_G#05ORc]7_b_[rPtPqrq6j"Y.j`ciSAuj6_YY-ck#^S!;Rn4!V/fG"2OC/m)Ntg(Rqn!Ant]'@U"Vg[p&T#El+sDh936%5Q/+fN#R5RqJl$DYoae,eiLIhf.pGmDQoJ\_cD0%CB#YTO2$[Gq.AaM!K4qVh61aXn*7fkq"T>!mGC(.hhp2eOFT52Q0ZoW*<^\cNpq&4Hci`j^a4n#8UC[D3Ah`.^N+-bJ_I->=Y[3%?[bNpB9@#01Dj+&5J@e9#hq7Hh&_>UmOq;QhinDua"^:iFMmb=B0_!gQhrt9ePpD#j1Xj+%V2RZr+cgOLk%\Op+'*.Sp4p0l0Hj5,[$.t:h-@5jO?Su%^Y4'o1ir#.'"1ChnCZ"m@gGe@HWZN&O*NRg&2\qm,=38@&FN5/T`V\6O[`Gpb[kF)_7=HdX:ZeD)lH(VBn'nEj(2kl"P959i5Am]lfj!5_]IgG(&7QgcT:81A],Ia*4Do&NRLQh"P0"*PJI+o>R3a\)c.E]778KA@dW]`I2h,bC9=a%JHsuo.OP1hq-KUin[W1iq$[8@'=Ju!*H8:`2;'92EcH1#UKlL)r3j/@Z2]7`BV+W*(GFocFj6YQq/K;:rjoYQ\@AqI\iBKt*LsjH_oMYIV9Ze.-P$piVd-?@Cjk3pgc-a4?e[e:)Cs"Min\+Bk2sDRj6'S;9YP@\<"FI8DelI.h_tf*`sqMn?[ZFf%bHm,o5MRab2u`P_XdH'la)f=Z-Md+`T?R1nVbBG9kCC(V1%1PqYKm.rjRmAX3/?3S'C&sVqinZf8ki]FQMLol[*n%H4./>.Yg7VD_BIVD*21XQo7M\[G0jCcg(FpXl"M-?i?IrV3@NQc+AaKh:ggfq`:h0g84b75IKBl\%!MeMTsn^Y"rR-m'_30ZT1iHDLe)LWp#*PLE">>Roq*im6@-qHMP$_?!_t(3m6+sBC4#pGl>,n:\\/eVPB&1+$\=Tk:s:;j5N#TeUIKD%!Le.hK(UdrQTRObcN&FISN*;THE;0!:i]F"6>Yn#(YY=hN(>-=BiMR39fY4h;1(dc>$]E4#[A&r_MYQfB-?j4n?>?r)L?\D8eRn2caDt0ebuoQgP;=jg\Ysm^T7>29,R$>S#,-CouYCDs6fO>!;^+f!?e#q1I+.GB)id?U%[O'lH@4OJMibX_QY$N1TXlk1[_VYOqM<+-3#e`n1!"c[XX3HGBOLC-V_2"up\PUA]5d/1uBuof3FS57X>.jq@ac8Nm7;PC*RbiQ5(aN^$W95;)TW)4'K?h41Q80D!r%]<:PZpS&`7ck#^S!;Rn4!V/fG"2OEia71lJ8O%+m9h."6mi,oYZ%X5X*;&J:*O+!&-P3EI<_kd#Zq=D]Vuj\Sj*=.jq@ac8Nm7;PC*RbiR*_HA,Plq\B+ZY08j2PJ';Ee`rYhMHicPsa_--OP0X+^4Sj&FN;\aT9$>iT5=7Z%5Cn8'5X3I?!9B>k#081f$in2?*s\Q357X>.jq@ac8Nm7;PC*RbiR*^=;5>9=ck#^S!;Rn4!V/fG"2OEia2'1PNs"U$q#l4qP0X.(,bG*FGkC$('^0%ba_(Sj*rS&87J_!(r@jiDOAGEb+J7^N!"=p;*/l*?3.QIF:B8H`q$`?\nehF^7mAW!dUI3;j6P:If&kOal0CfYIdsOQLjn:*g6^B?ItXq%Z!';lDMk4kM#i.o4EI3A>i9`FniAsCgKV-p#gJ(=Bt`j#GisL3.QIF:B8H`q$`?\nehF^7mHEoQ&f6jiJ>M4saA@$=2Igb^hkf;e?IN1U;bU3DOPC*SU-i"/N_kS=JOd:pElcN8/k8(\?CKAca:/3:hb/s>,=aQ@8I!&M\J#2,sD6_a+q\:,V]k\B"[m&aGlc8+BIN1U;bU3DOPC*SU-i"/N_kS=JOa_^324M)"<^Z;%jgqts[Jd]VbO[[-p=!p8k/g?d)oGtZ-m],U24KN]c\DAQA,:3@TcXNd&+^)-q';R5nju"I_!pR.I@..U@e7$s]^8qRS(;>b:=5DGiWXG/g3p=&oe>]J?]2m8m4eK%rj]K,HG]EQ+.")GE<,qkT)asKneiRBj>-cEO+,l>\_@(H/8+j&f.8P(b;sH\Z.Q^g,eonPC?CN7:=eQsc("A"G]hmpQM,h")9.^ohs3IJqJl>)*s^.'o*GEm,bG,.8Nm6lnE@o@N%a^A[W:r1Dohq&VsWeYf-f?&;Un!h(pXuCh-/C&Gl\EhP'qc51Q?(>/*?!U]@Q+idtp.X\BIN1U;bU3DOPC*SU-i"/N_kS=J1%n8Zk5A;dFn`EAbt@GWe$dk&FRWJ#hU_G?@e9"hFMM=e=oRtL3V-\7,Q%?.i#\2B`N,W#XW,W0EDjD!QC`4$ZheZWo>UU-LWqWiTA?s0NsqA(*'ca4-NN4kHj7Y>q$[8@UEB4bWa#'dg["4?=^:m]qr"UP@e24de(fAX\bP4EjT-1pV0#F:]^kJ???t.;hYlg@.4ln3/Igul\57X>.jq@ac8Nm7;PC*RbiR*_`(ft\^/QTDr(?]&h=FDb:S(A1oc+Y6*GPQ,.rbd&.\6A]:J'3ho.m%1JX)'C8GG)R-*p(FFq[`]$1>fbCol/3bh)/R5j.^HsQ.M1"j0.5$q7P-jjLsct!VF9W!^JrkB7PAmcN#X]qJdV;qXA:kLA/$TA1:jU[\"Q>nn)qj)tQWCD?&n8F_pU;9f8$kcI#+oID/6Q71Y&VH(Rm?2aZ8N+ce6^,.t=+.hEBX.YLMIinm:tK!;^+f!?e#q1I+.GB)ibirO@oNY)dA5o3.ITQ>j6PEdYq(\F5?pk1s24oo&]ZEV[Yuo7'!:CGk`jna"qWEp'rrN;YQ-LV,iu\1?@gc\FY>g\YtpbA7-=]fU[[m(Donr'0R_10;p].VVtJ9?%O!6>oRA=pR+7X,n8/.8#qaKck&*LK&)ZBG.>9/j8sMa.q&7Sf&R'Z8de^8_MS+$7>rG^&=8):Pg&#T*Cgjb"u9-oW$=G6VUJ2!tK!+Act!FU36EMoT3qK(nO060_-QYp0"(/LPEpRAdU;b_>?eq^`sF18Vs-Y<0q\pKi.Epe6<4uC$$VG\;Fdn&6+o"c,V-903/4rD7GI+4_c'hod-pZrD+)@0)o4:Ya2p(IGCUcnm68UUenjcRTSNqZn+-@Hlg7r_e5^4-+%du3.%9eV+1(!"Y/5+K<8f6o+2?E`^%E>RMW4+0cpooC0HT,V^pY,An>n+h'HD-krJAsUK6P0^`4kniUa5PUa1Q:`2'YR(+4!+Act!Q(Wr"2OKKj%dY\cW/t/rV/XrG,Xg>p;4E\EEmeRmFggo1m6H\na8hbcbK,Ko5e5crqXt=Haf?sI72o_p]$',]JY1eg`a.qSA.8UeH=FDV'khKpVumhX77"To=AolIV,a`/=Sa3?kN)G!5bNq",'6o#(Yfta.87RDdV36mlf[tSkiR[#%?=0Ub04-Rp5l"pA1]U^TtrLFIM4&pjd%ZJ,S'm^6eR$n#"Elqd;)8RpGnLbN#I.h##3Oe`=]1VRO95%s=rDbQAoGa%;E6!A)*:!^N.&B7M\8cN(13o!hWiS(kL(Df3OZ(Z2l,Zg6.6r5FHUDs%A]:M2V;Cd!"*o`og$h':g+l1U>!^5+;c^3["Lj7Y:qjtGqfj`0aJilX':oYhW=WSH3e)O$I?^A6\kATB!UE<(p$T)]ELobelGl8&DkO$)j[]K-MO5"LJ-c&ZaBSpBj6S*);e:HuL`[e\1MpmDrURf02bH8U]RhZ#E]l(us(L\^/9+/Ec90<@7b/8k>/Nh8E"rgE5inn`Wubl4_+&%nCnEGs`jGFr$IkO"V-M/Q*qmsbpNSq"Q)nMh-O3.OHM:B1Zaq@!o^obdaq7illC5'hYG'"R)qds)chOHf]8=&"C0p]c1TAlc>0Q4:Ya2p(IGCUcnm68UUenjcRTSVVTGQ>-l&[nO#R!ZQDo6`V++Xp;V:pcc#?%hYlo2`]NoUI^N(ap!N*i&RPFoISZrDls:l[lc.[nj8Psc?@DdC(LLo6?@;aCl`]+?[%G)3iMU[lg7#_:??of8#L?H1;)d@Di9l5-$k`r1`rRa.IKDd%e7X:cWQtRK4S$!\p>RlndI`H`\*ii\H)pu0Hl2TOV=NmJYG=C/Hhu[/QgSqmO)Ek+o#"[Ojgirj=sdG!=)Qj.%dp!N^5/Cu]J\UG5'^CEHAfu0dT]tjs69LjmPo4W3.OHM:B1Zaq@!o^obdaq7ilmNSukuKBta/XN=QQuND(E5pX3=r=DRck\\6!9]m\r?#N*4+j[\iY-nUap2joDLMANID;c55DjY,d0)n&17&f!1$+r#A9/]%U]nB'*,nF4p-I0I0P5`OiP:@,``%0K`)%(0WE@u@8`]u@!UgQE#-RU!#B!-!?b)$1I.>WB)l$TGoW>Cni2.gfM;JQPPP\!-M85VQ:Du$B9>:d?kN)G!5bNq",'6o#(Yfta2(n(NrrL;r<.X)WQtQQ;P*ttH/rsa(FjDf,Sal<@:@6Xc89^4E!R+,aK=<;`-S43!.J48*d!!neb$kOcY)$#sm*X?>?4:Ya2p(IGCUcnm68UUenjcRU"=X9%1=G6VUJ2!tK!+Act!FU36EGu]8irBj'562m#l8(\me7Sb`*dJ`q7IiEg7G(B9#a>)n&17&f!1$+r#A9/]%U]nB'*,nF4p-I0I0P5`OiP:@,``%0K`)%(0WE@u@8`]u@!UgQE#-RU!#B!-!?b)$1I.>WB)l$TGoW>Cni2.gfM;JQPPP\!-M85VQ:Du$B9>:d?kN)G!5bNq",'6o#(Yfta2(n(NrrL;r<.X)WQtQQ;P*ttH/rsa(FjDf,Sal<@:@6Xc89^4E!R+,aK=<;`-S43!.J48*d!!neb$kOcY)$#sm*X?>?4:Ya2p(IGCUcnm68UUenjcRU"=X9%1=G6VUJ2!tK!+Act!FU36EGu]8irBj'562m#l8(\me7Sb`*dJ`q7IiEg7G(B9#a>)n&17&f!1$+r#A9/]%U]nB'*,nF4p-I0I0P5`OiP:@,``%0K`)%(0WE@u@8`]u@!UgQE#-RU!#B!-!?b)$1I.>WB)l$TGoW>Cni2.gfM;JQPPP\!-M85VQ:Du$B9>:d?kN)G!5bNq",'6o#(Yfta2(n(NrrL;r<.X)WQtQQ;P*ttH/rsa(FjDf,Sal<@:@6Xc89^4E!R+,aK=<;`-S43!.J48*d!!neb$kOcY)$#sm*X?>?4:Ya2p(IGCUcnm68UUenjcRU"=X9%1=G6VUJ2!tK!+Act!FU36EGu]8irBj'562m#l8(\me7Sb`*dJ`q7IiEg7G(B9#a>)n&17&f!1$+r#A9/]%U]nB'*,nF4p-I0I0P5`OiP:@,``%0K`)%(0WE@u@8`]u@!UgQE#-RU!#B!-!?b)$1I.>WB)l$TGoW>Cni2.gfM;JQPPP\!-M85VQ:Du$B9>:d?kN)G!5bNq",'6o#(Yfta2(n(NrrL;r<.X)WQtQQ;P*ttH/rsa(FjDf,Sal<@:@6Xc89^4E!R+,aK=<;`-S43!.J48*d!!neb$kOcY)$#sm*X?>?4:Ya2p(IGCUcnm68UUenjcRU"=X9%1=G6VUJ2!tK!+Act!FU36EGu]8irBj'562m#l8(\me7Sb`*dJ`q7IiEg7G(B9#a>)n&17&f!1)eTJ2:uko`H=Yp(IGCUcnm68UUenj]Q_t!$'gplN]]=lmDdd8UUdKPPP[fOHgOp!142r_PB?tKLpRr!6E:i$38;)!+Act!Q(Wr!rukC"U+m<6\$kicN%BOT)eqtZ@W,XZQVT$e7X:cWQtPE=]n#kJCtJV9^4E!R+,aKJ?5iF!5NCV&17&f+AD&V!'jRc:]Ol]":14f$kOcY)#td0.jtBO)Zk[aI0Kt@q@!@cPnau5Qjj)5Ucnm68UUdCaN=hs!6g/t@8`]u_PB?t!+]XE"TW.%J2!tK!+Act!)n&17&f!$EdB-ibq?!ea-n"pgFh$ilBS'bgY8%0=>A4p-I0I0K\mapJIUb_?++;P+!,Ucnk\A7YoJ!+nTK0WE@u@8`]u!4&n^!W]PM5a^&6J2!tK!!$/)5llMh&0O[31I.>WB)mI`XIoR/C^:S!obelGl8&E*<`W#s?oA,nPPP\!-M85V+=erj!&,>nKLpRr#a>)n!0EH\'EFL0!Q(Wr",'6o"ou`e$46dWL&bX[T)lg)4p(dqAH`5;Aj_)&WQtQQ;P*siZEf&`!4*h6R+,c!0WE@u!*NGj!J&i7+AD&V5a^&6!._/PTE)cD#S8?U)'DW<1B9[@<_rd(2?X;Lq@!o^obd`P.k<"J0H1(H8UUdKPPP[fOHgOp!142r_PB?tKLpRr!6E:i$38;)!+Act!Q(Wr!rukC"U+m<6\$kicN%BOT)eqtZ@W,XZQVT$e7X:cWQtPE=]n#kJCtJV9^4E!R+,aKJ?5iF!5NCV&17&f+AD&V!'jRc:]Ol]":14f$kOcY)#td0.jtBO)Zk[aI0Kt@q@!@cPnau5Qjj)5Ucnm68UUdCaN=hs!6g/t@8`]u_PB?t!+]XE"TW.%J2!tK!+Act!%s&GO6G,Pa6kp2l&F^iV=d'Ik^Pfqr7/!Zc%Z3anSJFP9^4D65ZUo^!(S`#j$L/;An8G#.^'SECZS#7+34>T*H9\Wgi/d*H>p7cSqu4K?Y'K1A\BnVr>eAbLn\8TTBa8GE90FlE09t)!Y?^O)#td0.k#omW-'K"f>C#r`Fq#?+9-l7bN$&-j)VPqb8&$$lc8JW&bJQ_7\_!cf=%`jQ#ts`)SJ+fMTONMc2WTK[G@@F%9G`8!;Nu(&17&f!$EdB."JD=ELbqMm+n>?><@sW/h`89e9B@8Xt!E)fT+Dgd)+#e-?6]/4a`r,rP/BqlFtqjj[09'D^tfr;P*siZEf&`aJsGG40.J<3:OiQ"\VS14hf$a;Y9DQ_IXnBj)FaaSlef.Vhc!6s,^874Ce^i@KS_!4'3qqAM9IdI$XRTIKhl'TPg[3ZcD>'/Lh8kp4BnK;,RWY9l%*l`9hIS*r52\-t*foL?,(i?EE]?R7>OiN`UrBkq$W908(hO\XJSA]3N:)\?te0sM?d9UtYXDO#m>j9VTrFTcIbtbqKOM+",YK"9P,%n/<9L`XSd"?/#mgNU3)lFinB-Xn_:q4+_s3C!qnh4\hGH83nkH<]So7'6EqUPU?B>^PU*<;#hD$;%Ul8&E*<`W#sMlU\(bN3baXh8k+>SNIHV*!^Ci`sj])8rpdUKH2b=XchH%Q%q.Gh@<".?*7G=4u">fbH4fdUYa30P$^L3BW]N_*[-TFmf#*PV/dKNc0')i)`dsSnSJFP9^4D65ZUo^!*O/uj!^?C2>';CS#"jdS3/Fs^k\RWVO)r.dS-ZAb"W(a`FPOu,Zh"B8(adUe#7$tIVg>T0Y5`I2i]g9m9ppL58-M85V+=erjJ?7%!*nMIQ;/Z5d\+P,jkQC93#>'R4ok<[%Ui4`'BqmIU6`BfB7c)=.o!lr?DpdpH&*_im9(KJ:$lo>9ppL58-M85V+=erjJ?7%!*]JEohX%dkqi'Pp[lt2+C@PP`Q@AJq*rSm:,`b%(ciK5bD^tfr;P*siZEf&`aQbnLEMMT9/(;P2je?F$F1ldbSR/Krh0VQDW*N!@0j!%%?Rb05hH#(!8;B9%*Z%Uj#hbh5SZU@GO2q2dS"5!LGI4%G+;cr#4?FVmdjeC^W@p^4!bWIN7]b7HYfo,E:o;UM?COQ2V][P3eN\bbW/BG:8J2!tK!!$/)5lkM=T(9C/o""S]?>g((o_*iZL6G6C*Tcum\\`n&]cB=u9+Am\[C%"ib-P&b]3:^nEi5PM*Im8QGTbmE!5bNq!rukC"U1"Spo_E'^36kU7pC?'$I.2F9aflJVf8JabBX5<+Hi6\\G?@ad"Ncbe.XOsUgSl";(MgMO\?5Gb;o\^kEm-X`fg?"[^%f#;&17&f!$EdB."JDeT>urO34HVe`_tjB+kK^og;>b>Ra:#?E?#^kH/.-Gk(g);DqQ&d^-cBoCSXsHo[*\Ck.?G;$BSm0haMh+=(4XQQ@'\Gtj)qjUkqf-j)XUj'&ZoY-6!c*U3OS<$/FY5"L)h6$'m;-KaN+73mi^XAT`?B)Yaj#VCeO.0Dc=O&4`^[!J0f\Dne[i4k)]T)),9Uf<0f1CE?\W-5.QK,UG*]]V+KoNe3kq_@?9,]hk(?aEZ5a^&6!._/PTE)9D?lmo<`4Hhs:":bJSaCU(heR.S9,l,(b3,M_?lg-1V0GRak!l>bh4BHN@h\(0j\fCtH-BkTK;',o/fZSoLWXI/.nYISQEq[)2g2h!q/Q!L>q$S4=rYr142'?[-gCYQb]C=rH/(00%Y.6#>6,"nq@!@cPnauu6X-uXMRiC\PVJ5'`m=aJM/OmE@8`]u!4&n^!m'YXH!J"/\Q3RJT.?/p"BE!GZW`q/]A4p-I0I0K[rTZLa8m^qpo]mB@*(LD@_l),VQr:.tBMT'&qcfE(+7nJ?/frBB+!2mba!^N.&B7M\8cN!t>EoY0!f3Wgkb*=Kfgg-!!\X0*pdeN\3l^rRqaf>4J!6\qWB)mI7rpY\-]_q?DQS)QI,_eDEo&\'>B(Pc3s8AtD!s"Y+IKDd%e7X:cWQtPEo=k"ZMlTp_54Zc>7n_k(IH;td\T[AokF[7m#WP@m)\+AD&V5a^&6!.^KR?r/>'&9:%:0r9$:OoiV@3M6WZQ&17&f+AD&V!5KOl]Wo*pDI2m"X$0Sb3#VE'!5bNq",'6o"op9c%mKdHiJ/L=SNJP#+?-G+i-_c$!"^LM)'DW<1B;BVh7.IbCL?tml%F&UjPuC6?1iIF^iA%'!!neb$kOcY)$%1NDVi%:[^L@J@9i*>-_L=s+9/k9ZNl"jZ(D"--M86!9^4D6E+*%aG4"q>\5`%HX$1k13#;At!+Act!Q(Wr!rs.dBJb&-d779'a5upgnT__30`Za!Z_%4/-M86!9^4D6E&#'(o#n'@j&4-6F4Fb#!(UZd!?b)$1I.>WB)pik)N@4s>jdu1g0-\?XB2-Dl"G"MI/.g2NE)#B!$%.""Ft&S^8KKHooD?:prGs%T)lg)4p(d$cl6o9EQg,>(e(4eg+`?:>\P;U+A"Lm4V@a67.q8oQ6H4(n>.ddkr[eucG0DV^E;D?l8(\me7Sd>!kNF6b&P;.Hkc64.rd[3Afd:\A(;e)!(UQa!FQfEijSJ0_mdDZmHs<.5QCQ*M]Y65"pgFh$ijNh2fIQcFQq596aT`D)Jms`G`j'3R!DrbNE`l0Xa3)0i$dq>!%^M69jqBYpW[W*o?B5O>k#@Xq@!o^obdb>BKD^0dGhK;'X]hkPMp\*ORXTV-f\_!EJ\SB]B\ndJ>9?@!3cn'?P_cK\]!+7rq.B5prB"Tp=]D*TKWI28UUdC/t-S-XrT)UCTU$F4@kLZmZ4DaeTfk0INFhtB%>oB!(UH^!FQcTIUu%p\QLW\jY),ZTE"_ZJ,A!XhWkI41I.>WB)pkaWRY`RbKa:,;0UA;f/BBP^QFFL,`bSZZg.&\J>9?@!3cn+qVnaJ%[IVgo[%fsqqYWZqUYt5TKWI28UUdC/t/]0HKmHr>3_pS\>1p]*Y/61$Mt,0bOE;c&Gq'i8u;*:?i4C4#jO32R+,aKi1_Zc9#jNM;C@aM4ndN:OQ21mh>Vo5>p!dso[+%\/ECjeD4WXTB'_W1?QJmC?gjP?qPkke"-M85V\7iVN^$csh5tdbJ*g^t\e`-Z17q"U_?l9a%j3msK0SrH%cN%BOT)jJ#k2hq:5#-]q3iP4ol--0J!s"@uIKI;?gaeH?G>6l#CY'%CE@LPu+AD&V!-$>-3h>:VBW73$p>cW<7N!,rYG'*+>,rqjQ[2Rc3iQVsFV_PB?t!#O"I.p%`P`U,^K4>,md:h&T!<>W#565.0dVfJR55OKDYJ,=iS(k!i!+Act!J$*m+9(4@WB)pk!\pG77j$nE2?9hKr<.X^=St1!pS'hRKLpRr!%t>f5"3b\irD()lmDdd8UUdKPPP[f>Zh%)huEYn'2P-I)#(LhqmX[;YPRSdi)o=n!/*pl"pgFh$ijOCs7%32n`Za/Sn8h+HsH69X$1G%3%k(7!+Act!Q(Wr!rs.mHgeZBnA>d/:)K=F;"AV,5%=RP!VR0,_PB?tKLpRr!'%@kao1R=5?mfk!l2p^T)]ELobelGl8&E*U>9]o\o_Y38R-<*TDnJ\X$0/V3&1+?!5bNq",'6o"oq3mns@+=m'4Ts&]POmKjLsllLP+.P@QlY+AD&V5a^&6!.^KrE;8LX:S)A>pT8@^CGZs3qTJrtK\9-$#a>)n&17&f!+=Zc>IRpcmBs-HorH,/if\rljWB)mI`XIoR/C^:S!obelGl8&E*<`W#s?oA,nPPP\!-M85V+=erj!&,>nKLpRr#a>)n!0EH\'EFL0!Q(Wr",'6o"ou`e$46dWL&bX[T)lg)4p(dqAH`5;Aj_)&WQtQQ;P*siZEf&`!4*h6R+,c!0WE@u!*NGj!J&i7+AD&V5a^&6!._/PTE)cD#S8?U)'DW<1B9[@<_rd(2?X;Lq@!o^obd`P.k<"J0H1(H8UUdKPPP[fOHgOp!142r_PB?tKLpRr!6E:i$38;)!+Act!Q(Wr!rukC"U+m<6\$kicN%BOT)eqtZ@W,XZQVT$e7X:cWQtPE=]n#kJCtJV9^4E!R+,aKJ?5iF!5NCV&17&f+AD&V!'jRc:]Ol]":14f$kOcY)#td0.jtBO)Zk[aI0Kt@q@!@cPnau5Qjj)5Ucnm68UUdCaN=hs!6g/t@8`]u_PB?t!+]XE"TW.%J2!tK!+Act!)n&17&f!$EdB-ibq?!ea-n"pgFh$ilBS'bgY8%0=>A4p-I0I0K\mapJK+7"5iYS*bIK?ZelER@MWDb_?++;P+!,Ucnk\A7YoJE1upEnO@RM?S"]E/rHB45$(rqlZG.EeZIo)X`?THpX5@u@9fe].[2u.*'1RBa@c14`=[8BV(S3QRFDcE\oF+n=\foc0&AAY&A1of@H^%5!<_Y<+n4jPMsg$Q@h0"<8/@Wb+uM7r,[3EWDm)9B9L^l(\?D+C-3@RH!&:F!+Act!Q(Wr!rukC"U/jb[!Lc2:l4T`(Id_N@Q`MZ7'8D'UM+K_d]Gs-rI1!7bdSR/[W-aTNX<7;)@P6rT2s.;mlc!jCCa;71Cuh'I_^N!;n6O;Hgal.Cb%q=p-M86!9^4D65ZUo^!#NT9+J*.Z)l)RPW7,'N@j!r"r.TURe<36j=c,P(3;(\*nnTNV;Gsc#RSK8q7:i1V4C"$b'ei%8?DXY[>@MFmlMWF'YEKo4iP-.^,2=&dnX&Z8\o;0,Ak+cV:^(^=eo!mNAkR'mo2Tg_SZefB(MO!HX$LBX-8%XPQfao9"l8(\me7Sc3XK8&p/qQq?kL[2kd&LBncemH][QTMB@^Q#>ghY,?TB1',co,R@+,mdoJ!ZV;1_-ROEg&e%rhl=G,Zh"B8(afs8]j)h36H08LYZZEk3mXWNoNa4QcSI_'l0GZ<0!S`=7Q[aJ5*T:M]ftMPG]Lm5GRn=C":14f$kOcY)#td0.k#q+?u$`P\`q?^b>Ara2s5ZINoU%,BC>W%4nEr(GFGBLneen10KJLlMRN2*EnILH%Ajs'jiZ$V\L8Lpe%/*j([F/l5H])^j%DS5;!XtfqU5XIZTPB)7?b:/0\)`4;5'WB)mI`XIoPGLf#.YC>7uoiY$rMPV3__s/b:V8Ukfqr<)Z$fen!L.#PXE"hV%efm?cUAiWJeI9V@e%cCeoT)lg)4p(dqAH`6VEK&qf]%)j^V>4c2jeA]Y?CVG5pGID-*]Jr9I!%M68?YlqYRe(XY32O(['ei(jDb/9PPP\!-M85V+=erjJ.#g+a0i$uY#$b3U5dnD06TFHrSGgpYJ7WU?.ruYjbD6oDi[!ji*oTV!Q(Wr!rukC"U/j2CioC=/U9"[.-fAV]/R0g=tl"1D"bkG@JrA[mVLs.;n+oDEEoMdG!GS;CUkk]2eVO>E<$f=q@!o^obd`P.k<#u$Y&u1\9>&PW^OCF5*mddMY67\Ze;99RYC<%)N>K,BX1Q4gFo/=-$nTr]tP6C9CnQT5)QA*@_^B^AUO(ra[^H.KlVaQ[rt5&Rg4F"MW8/g42!gqcrrO0^9*pY&0MOJalM9%hn=@/l3f8XnFY1*5Q:HY+\u`4pWS?lX**IBNRqK`mE1\E\_LI$'tos0=jm*Ap$85to#[p/%WE"_56CmrAH`6V&Id\Z=)$QADmPghL7RV0Hb(,-6\&24_]SmIo#i[n\o_YK)"+'?QS1:ec/8R#pT$IgJ;_DC)#td0.k#oU@Q951S)&IkEl_5b;:J]$NX)+TpMjcgL&e.?M_DfSHM-PJO$%Hi,];I?^@IP)f<0Q$q<+eB-\.,lqAB8U.k<#uMl&EQ\$rrnen1])fPEFWSb?UD?Zi8Ib\RQ(ap*JaWDkp-&i]99-_C,.j,[8iAcNX!oeQS5<`W#s?oA-I:%,dihP6,qHEpsalESANqr!);t!&t/U'*+>/1`GIr\KaUYCW63tV-L1)k6e%1+6<"Sb=OWn4V@bXMY/b*5ZUB]6&iqF+8tCnZR"rlro,TlE<)M+p(IFljGc+T3'r4_Mk\I2BftV)N\cOP:2c@M2i\Zq-/D\^+97orf$=T1U.s1?d`!l0uO:B4L[.p&kn+cP/iXMs`%Tl8cdW86lXDm^t1?LlFY,gNU&O-%C.h,s>@!1YRjcN!rJAQhCe9B,Z-`rU-KfhVTML?.[H8eUJFg\T)#te["]nOp\gC/n#J`?-565.03h9$si%38k']XGD3JaH/4TB_;2l@V7ENX>H9B<\?mXoip^gaC;!^f_sDBla\DbD,'"L=5D/JfYk15f2b$U!9].11B9[@pK9fL9B,@S_p-9_!'$b?-NG\bX]@MME-Pek!'%1K-NG^8;boQ!K])2n\L8B'/'0NT7WFYs5Je"qcE)=S!6u,@B)mI`p8t!*hRrZZ+8omPR^beL\=%ui^NP,cg1[7@2VNi8k2:\TpjL^_)f;qg^J1\,3^Re/W3)%G*"U*31$^nk4$qA`K09ItB]O.5!*RR4:[c!khCGeBo#N&:UgI30-?7ErY)bZs9H.iUd7,'l6>LX]59]qgCSQkIg4\?1T?eVWd1N`E$LqYg*3e-77T&\h#>$stYic!+NB@[N+KO2dl2CA6Dm`d+pr57)hcR5IED`\3!8;+]NAfL(F8n/h3,Q%M7[mtr3IW$9MkWtK'MjJ*dH]ObPZp6?U#^1n-V,9`!0GaF("AlToV\>[lt9*VnO35M2:GQGLL)&=_L6I3d7,'l[*e%8D;;;2=HeQDmfES+%e=GE`FHKs_a=Y:V9C2l?R`Gq`^'1KsTe1U"0WlG5"r31VS!6FI)/#ZhTqUaX'mWTb!kb7W1liVmNe*fL$*2!04J7\N4pV(jYlte6iNOnfD#_P]RWc`LR>BsIFB3%/:!9].11B9[@Ml`S#qqL$-dm*f[QbWI[oUG2q;Rt9C3<5Q`q[!8GnFFaU+!ETo7+&6FOhA@lNXP0B`sUef,b8*2GQ=6Uf$=qWtQ7If/4JJ,S\?:VY3sR`_0rT)mk\fhVTML/+XfK]&rUI.PU$Ie0&8<,VEEni-Wp./O;NbAd(8btFBUAP13>;)IMpmrQ]E*9V(mXC5A^NR'ihr7"I]i7tYf"oua0BIg#Gs7t!qgY75PGCMPEj\j:f-NG]Yr<.Ws\T6e(VVnPAMrI>&4pO2R*g_!/e4pn>,-ZM#!6FGm/#ZhSnsA80c?I"pV(\\&F&0Gq!,r;3-NG^>)fNBO2*5#sU`6?U$%R*9qAB8UWtSW%IJiWUs7hZTR*4SdY[[ZPC@!;J/BR@0pUaF4mBb^`rP&1Z$llWaN=hs!6g/t9=;=@\Z.bEq<1hN4hs'grQN,+lXp3JXK8&p^ha9qC>/(KV+[/@Qc(0Ts63=/]'?U)39RB8!acd1o^@eUHNCK[CT,GFu@/UK6OHgOp!142r:>`0X[pFFK[BG&PX2e#qP(W\n-U104\E\,:\1"GN!fl)JMo9R+Z_[,,YJ'YO-_IKOmf4/doeQS5<`W#s?oA,n`+1WKpYC%s?G63P$SOX@o[Ccgna`j'++HEKBC]O&USL3(Ct1ZP\Bq=L!)n&17&f!$EdB-ibq?!ea-n"pgFh$ilBS'bgY8%0=>A4p-I0I0K\mapJIUb_?++;P+!,Ucnk\A7YoJ!+nTK0WE@u@8`]u!4&n^!W]PM5a^&6J2!tK!!$/)5llMh&0O[31I.>WB)mI`XIoR/C^:S!obelGl8&E*<`W#s?oA,nPPP\!-M85V+=erj!&,>nKLpRr#a>)n!0EH\'EFL0!Q(Wr",'6o"ou`e$46dWL&bX[T)lg)4p(dqAH`5;Aj_)&WQtQQ;P*siZEf&`!4*h6R+,c!0WE@u!*NGj!J&i7+AD&V5a^&6!._/PTE)cD#S8?U)'DW<1B9[@<_rd(2?X;Lq@!o^obd`P.k<"J0H1(H8UUdKPPP[fOHgOp!142r_PB?tKLpRr!6E:i$38;)!+Act!Q(Wr!rukC"U+m<6\$kicN%BOT)eqtZ@[\Y)@S"`A9aUh%**?M)OsWJcCs9Z0Gf;n&0O[31I.>WB)mI`XIrrI-?7hp*Y^-4[3uh%>":ZqU4Dr7Fni3p/)Zk[aI0Kt@q@!@cPnheO[,1(J.[=G?T)AWF3*retF+mL+7CafrQO6sAC-:o358qL\A#iZ^=/0"aq.VRUCKAWB_>Wr.Xkp!SD5KfrhbmZclZZOEl.K>\h/T9sSoeJhXsX0bpI;"PHB]p*mjdCm_.I901?h9A]i-J#7+&@\q-::(0(-+4lg:8(?gEDZ12-,gWD?LK/g#5gDcF#UplciF*fmG<*Qp2mBJ/'\!+(c%.RjX2n$np8sCj'4fO[(Q.rm0on0#f:i1!81sQiedbe$7Pb/ti[@ReUDdWD6O.fOPVSAn^dkA)o)j=]SJUtJ/1Q!]JqXd0&]h'2&[tiEsY\Q4D"=Rh"cc:bE9B235=$(oU)U].CUrSSA(hIpfip,F_[cM,\[)Ii]&D_&(T@S2g:!RDXH@:RqoQZ]Ka)%[!Lb"a#6f=7K)r"HrO'_%FUr>*c9>t5L.P6ksIVf*M?7WH.Om8MTY=5%EMQr3]+4tVpt(jlNl$GEeNiU`gpP./(O'1/q^9c`@i*F%H?2.U1=BVCQ7bu5F?ih-dc2"G5>ng[SM7`Yj^1Fm>MNl)=8JkCSSBYX55Rkj0e#ERK2c>N::AUG(^IQqBrc1+$XCrfao9"l8(\me7Sc3XK8)?U,7p(j+:MMhc2qXV]I!UGn$NCO;K->!CYV'2lh[C%.#s28^!>f97WlDpC=\lVh2AN2U7]_#@?JJXT$-/;05i?dn)'Lm&;(bJNXRijXI(1+0/gAR#U>'1Er/R6=koX$<>+bbmbj>=?ersHJrq9tNmi'E0ch'X%aT8;,Sc!fb.r3]#`qi/IG26N"h^mUVX6E?QB^[U"]p)$A2L2#[GAC"ib!ZQjXY$l17ERFfOT<5B:+uHoa'nSSBJ))o_HPRkp&lBGRe1(<_bNH/(6g.7Br%4.Vm805BhASb4h[\J$hq".K-W)H?+2.eE2Q3'$M00?s5@\`BRSghChN&4a:qnY)liE)Q&LQ]]lVjt7UWUMKD]>,>bY6?cX0l.*[H5CHhh&(]'HZ6A-@gu]g(4?0q,kJk4Eu/C8]h?LaU*nMb3g!`HTdqD(\")2L9_"+dLjNq=%RQ)X7*$W@<_Te3p2sB>BaO7::MhI)C>Sd($Cl!+DcH1YOfrToV]%jV7.i&__'d5S(3\ic4(9nhn7qN`pCJ1X2FEKAJh*'T5oJAG]cQhPlcpcJh0Bi;Ie44FW\B[Lb5nM:bT4PIQ1.I8Yk/H3T3(U(3ijYHJ[&g$uW>m2,fp9[XbpJT50--OQU`hhihq$Q6BhPoTCf6PP@%"r#ST;5]Qbl.u^IU98Ib.M7o!i-?XlODcCoNMaaG?,aL!&op]M`R@K1Q;Nlb*/C-7ee:]c._YXLo@E;Y183J$/8!Lsa0d6kZC5SW4\X)/d\r^JCZjC3EMll@7SeEJniL./?_$c.=l7HPVK)VMgIWk5*SlE)OaGmZKr=BJG)79smjiV@Q_,(Vd1@Fie7X;J;P*sidP?H$&LD^-(^/6*2[^Hk;35!p9XQR1PjOr2cf1P;9-]]ZMJ?5D+_7n6-V:_/WY\9/>uerorK12ap-.kR02Zn;)GSEV$[p7r.W%>H8@.fO,HeL6G*-;m"SceS;^!cW=>KfC!MD-Fs\.9=al.GM_BRAf(.0hI!f$^\ka#N.q>cUcnlkPPP[fOHpd6MeN,QmNcW&jDjM(.c1Xem;sC.C$*`XjRa]*41a-bo%CS$kbM5R-mlYKYr0D\B2CAE%XZI#5`UiqOp>k(6ULb!#ri4I@\`oc83qSqJeAHW_jY$K%o-,q.!b@Mk%$43K1B9[DAl(.T/'R%.-`bm/\QkMKW^8Rjc36*A+>+k[Gsd8NDJu;\9ZM*G_qa9o==I1-FmuS4Do67cD+uVTNB7-^;o8YFW>Cmq;AoFg%3PML*n)2;\!f8D73_q*]I@n\Oq(pkLEJEh/'G[mrZq@!@cQ5S21kR-pkbuJa!ZPcPuXa,QT0YK>LO,A/VigWppdga5l:f(QWhiG+qI9fG(0/O#N?ft$).q<)ae0>g^0fll$@EUd*a?U%:tCP?.NH(k>/D"MfjQfq3\L$I\tY+,l#e'@*ZZV0J$Btn]Z\/WP'#`qdG1I*jtcN!rZR6eNBXtYo@hc6u7:*R#Xe@9lF/f@71ei.Lu*3[,8O.FT%iUOT$j*&ZDO5%EpU0KQnq'FV+?,dq2>]$]=nssYY35,%Q6ES?Z#bSWq@^d=(60+'Zo?ZGLoAMn/r4%ZsrG(r6c/'q\+I_bJ5SrR&a#b.lJpc["DkDDlZ\s-Sn#r6DmRArM!b@Mk%$43K1B9[DAl(.T/'R$S;3X.FTJUAZ#T#*88TZ>K&*d8hH%0obd`P/Mj=Ad1te`Z2/F-gc_s/487lpVd2'@kY@GS;LSLKY]?F7YB=$n6*InfN_Y?_n\5IValuf#cXMqtDKZZPS:jM$]k(d1Rt\o/bKEEGn`K@S;,-&\`F/G(g)T<)$u5-QJq_cqO%msB;E&UMRIOG8`F5U0.ZM-q4RR4KG#hjmq)n)%gTI.'R<*OK&+BI^PK2KM7RM]B;P*uq8UUdC8BVG,7L]l*^@a7&eC%]Xu_WET%k?.:s87u5^0dHEg>*V@Jl\[Zj3Z-kfd(EJ'aPHiVgK2o!fX\BF'\ol8([`WQtPEBph9#LorXsMfmV(7lcDC9"CVHY#!'Ta`KQ\9cED*QnRVtXminq,Z,M^JtpB*2/:*BZWXChMPWoVk**edMYU,Y&ZqWq5cX/5c/k-Pf8@+)Y;M`,ig04lj(bn6KS<$C`e2:VZX4c_Ln_c.4ZqbJ2QMPZTKA^'a-15H5:kCF*Tl)A1hsUI97O4S'Q35(M7^9BE_FMd0o2,kA=Z6:Wll\s=g(tgq`I&1]/Q8Q>F.Ig9q8SNj=9uIW'?+X3>`4[XeYJigLPp+;7_b8F>BB4kJPECgup(TO3_gW?Cl>>Q%2r*`skf?/T/V%i>?'AUpp1H*Cd6+H4cLCWN6eD-09:nea`PrKN5K,lb[k[Yl/=e>Eq6^Za_1sA:$ON"2Q>"&!,7ie]nigRO,K$9//dMmTCTGXBEcjoZi-`Oa0!gbnl,7mNciLTm=eiH.&urQgKDa\>S,-*H\tMu*QMU!dg]M/DXH^9Xdbn5mb?Nko<`Nj=A:m3#JEeAn*u[,a5'9U6\&uNT)l5hI0K[Bb7*Z)oK;]SfOPk"S,FI2g^,4jQ,7XihV%mkO[Nih.$X%+Qk.*-<63[,Q$04]C:?jD`[2iirTpc)Cg!dGO-\?[DGm54PVSQZPB9^:hX_:hf9d9ZQd91H,+;`Q]E!k!qQg=tSo!Iu;"&o>u6h>N5ZASM*LnFf3LD5@*n5]jqXdj=A8:(_$MO8UUfa-M85V+>#At%]-q!Jma!c_KIZDr,OKAkJ:g;OA5!r5W5Uf!!!g=X]Fo*s8MuopYUGsmC1qulh/k:^O)bQ.)c.E?]>"!D\-i1ka$6&["jQ2YBAuJXj)L9qN^R@cS#BF*aDJ@a"&!8IMH\%gb6J,eVs?f!Gmg\/m1Ie1C.#@DlK`M(V7(WeFi3l>*ogc.p_G1DJ\q61l.mYhJmT'H[_fq^e6A"&!/V4Mpu%E=?FecD0(J5-YC?9*LPJ&X!4YY(-NI\@q@&H[l8&E*XOldOo[6CY,E,:N\T?rKrp.k/>Rf9u!4#1E#08.a)$%2.55aofYCHN:f9=7o#BJis!,`"m'*,=0I0Rb>obdb>bs(saPAbsJgXd+Y-/uh]#O0\38#9,J3lAJG)fNCZpV6b,ct:F"orPC#7hk\Ii+N.%t3ZJ#CpIHH3->iWQtRtUcnk\\'nfkGib2l%[G)rEk1:PH0@ElJGm$M!0Bq?1I*jtcN(cJoZfPe*%Hn?[+jt8pAk9\ch.EkCf6l+Z:THK!,eLL@M+@RIQ:U0[W4*0WE'A&EY.=*cK"?L]c/ojcohEF/JX>!c"?S-O$DKJ&$@8[AY!W]]41(o$&CL?t\:O_lls8Ci%m(r>tJ8A,U!O>:F"orP7HhZsq&YBLOKd^-+U1cMhoQpJXYTL"0n_P2%71ef!ai2LaFADmU9E!=rA4ZREO+&o*%fc'[Ip@F5XsX3[PPP]L:$OM7E8*L$o]XSk4))%-H7k#>_c7D94-Rp+.Qc`s[$iP@-s%MYOiPGcq!uT]&)A<-gd]CV[$/X\s81^Rc#8&Pag&t\"Ft;dT)l5hI0K[hS&&L:7s6e.k+cV?Rn#bHft8.+_/`A1pK8FdO8bEuBJd<)_#SH9[KiSp81sViCTm^%=24V0o?X&C#M0UhZ:THKa(-pXnKru*^"[dkl(S?2EEuH-'?t0R/=l^^@AE,qQGDFe"=q?KBigDfq^e6A#'G]BOrUpd]k0X&-^hn2M^pJ.fbElO]l)-cEkslhDFF"J#-NI\@q@&H[l8&EZgV!@ES,6c0g[_nJ<@]Z!rHO+2fdb'CpY/L!Qp^TQ!4U@0,LfIB=/f/Js81\ln%nZ"J8A,U!O>:F"orP1@^3FMG.',>'r#B,m&`3P"o6m/]6a/#=!%FX[G-."&^hr]0pT**#.L+:8ZAPA]ICR>Ph6.HAK@oXAQ+:/frr)_T*^,Bc:B8HcobemAe7Sd>[X%Jh2tmU'c;P.'B\J;e>OKf1G^J556h^fc\']nTgf'BGK^/pEfq^e6Ai#ZYUh61i:7:C&*qc1Xq3HT`NE#Y@7a6fsbHgot0kp.n?H3->iWQtRtUcnk\\'8;7fHWBAP_3X,>=MJh2*MB2f#kO23U+KZm*27IXR*4H\1rd,%fgLBds9a1PIQ;3#lrYS4p,>Zq@!AZ2NJnB\o[%0g>FLu"Og*lMH6c+)NEH*eKpu73!pBL]-d7t>KGeCXV&smQ#!?dl]B7OerT)jIHkha""Hc0R-+Qtc-X2SVUT2cSJa7HN;hd^T0\/>P<"9<>G,_OiS'DLtqrpQ1FiY&CA!+_;i%$43K1B;A%4ad$D^B?,[jf7EO]j@a=CLOr!nJfai2ri7J!Pg9%Cb:Rgj`8-4eZ[CRflfLZ+IgknJ8A,U!J"DW\gIKfV36u)Puh;fO8o!9rGJ4nH3->iWQtRtUcnk\\'os7%h9Pu`=4eK*rp8,j`7oFPIQ;3#lrYS4p,>Zq@!AZ:6-GZqTa:F"orPCYJ0kua$9RnonRNOqU(A`6Qc0k!T9BUScFjHl8([`WQtR[D>'=2r8i:_qqcIMEUi!Oqs:XVT/Qa4/(YF7Z:THKaZq@!A.mE7/tI.uH@^\+^I4aReXn)W*8rcPlk6_>"l>Wp[P!4#1E#08.a)$&U%cThI-k@-\jkr!-hgT:B8H_obemAe7Sc3o6g,N-h"bChS":1_D&Vr$l"&!,7ie!J&Q/+IgknJ8A,U!:F#08.a)#td21FN5W)?OH5q@&H[l8&E*>%US2?o/#--M86!S()'NJ@*On!5N7ROA5!r5W5Uf!!$`$5llM`&0RIlB7OerT)er?14oW.UEMl\WQtRtUcnk\Uh'`6!(K>+Cf6l+Z:THK!(b9A$36$>!84/3"([Vl$ilBT)&*&f%0obd`P/MedT0H("'PPP]L:$OM75[%br!+7Vda"&fq^e6!2O01"TV"ZJ8A,U!O>:F"oq3;$jlunL&fo&4p,>Zq@!@cQ5LA:(_$MO8UUfa-M85V+>#At!&,=sUY27s)NA@(&P`.XD@>67l8([`WQtPEBph6fJC0H!@=8sq5o9aPY]f6=^oaIt"([Vl$ilBT)&*&f%G;ncHU5p=X(X@TF=Xjnl8([`WQtPEBph6fJC0H!o!fLZ.Z-:)=eX7l"^s7R*4e.8-1r,uS()'NJ@*On!5N9h%XHifAJR^#W=sblV>):!a5&<31I*jtcN!rZR6^k(d?#C>\/3=^*d;\)cN)Xo4p(e\AHi;<7RM@SW'"s?kQX/!1O7d#V*4ulPPP[fOHpau!#Q0Kc#C+k1cf'Z(`Xt>EijY!3p];_@^AdE[&d6,UK070QLV#8mO2/8*/.lg0ctQWQ.9[f*MlHCdC`FoKt0PJVgK=<.`M4^F'eh[n#Fp1'J&i!bU6Ot\WH8;CTI9poZ$(UEUg3t]ijGfY>L-WZ^j%8kGqdeQRe;a#03jGQ&EOtoCS?8&Ke/;R[7g7j;a@)LjNqml(?fll*isb&teL\k[Y't=qKbXAi-Qb`MAjck^u<'WAH]EpbX@<9A7:/Tj1B:=NH3d%d0U)dbF<4>&AG(q,5XTeP^kOCMnX!)q.7*ljeo<>4O*fB@O#JB.(=FOaLntEkHg$e)oQAmD%4[R8e;c$UK>Tlb),1`['S*RhjqTj<,DcKj)79^4`!?j=6!T2HM.'*]ud!ND'k7')`-e\;KXF8:nIco8UUdC8BVDK!/uZaUG6!ViGfL>A(iPQ2QQPAdbX32`@+MOK]]HdgXtbgg[a'j43j$%bbmm'I\5G,J09mmKLQ+DB=uSPHfJC^9cVnm]8@eYKU$keT@go!Q`940!W`DabHECAOL\]A1-eknBXONYTG1EN*3plV7+BPQa"`7Z\Zn9l[.*&_b,<bT!rfj2@bJfM5TTM^TtnIgOa*;d]8pgubASJ&bou5qThliGJ.q8i[u;C4+a[HF_jGQYOco[;b7H5d$FL%$43K1B9[DAl&J81qX%c;3V2T[E;samDu%dQm^)+f$RAZ=AHK_q[#p9l^gT=ga7`C7o?F8]ND7@%\r-1o9SK=LfV\^dAkZ@gh7Q/`Fe]#o[FMdc+:G`/sm0A8->d1bM8*r:^l>"0%4)r;,io.BWJ8aN&=,Gb7*u.YSoAopY4(VYL<,*YMiLl2=Hhadsu*^O,J-1\S1g61[<4c6*@d*5dqOH`h-;*0hhSr.KnLuCu"!GqI%gP7B=HZqr7!%Msos$Vm%-fYKtf.hi8Mn:"Qr4nc"_6B.aBa,b),54?kIT-9TsiY?$IF:OE_U\5uH=]u=#3]?0)Bj]o$[S@s!8+8$KoS()'NJ@*On!5N8m%;LMqP.>\X_9S#UGAM;rIPon`J$dL79&1b5>5#!YDlaIN8[u2LHaP1tP*At`+I_a_5]+6#d;1Jug<&Ae>H?;/p"`VFnWAE43siuo:Tg0[9NLZfXj[U1GrBFEceDm54[&5-b2Y,.lF5R5F^*tqr-81l\lX(tWHP.5*`pZPNla0dXiYSZfuWWXPPmoaK^4>FjgYEUh<6';*>jbT4"nUGBQR+Lbq>.!eHX4Xld7/:4#b/Q<;VSaKC,l+-BHp'l*rY:1I*jtcN!rZR6^k(dI8']VU=EOYFSl3gs#6bBc0@ud:0TPi+AanL_$bNJJu'AMFP^Gq<%IbfP'Si]0YD!*Z#p*\DBf_9eKW:/oYTt7".pg)E2ZgZrM@n\L2,>_;`l=Z8:(\Fm%.LfG.B;O&>4]S]KL_(2`/rSPjE=)Kja\O#uqbO3d%3RnQ:C3d)46(#odo?Kr;sRu_:2X!Flb53nsP2#m1VEHY2#[tscZks%Zq@!@cQ5LA:(_*[bH6lak]=ICfUu+<'firgdEJ%7*KXL20DKZZAKL)h'B5uBIFfL-]Zl18EDXtL=nkguNJ"AgM_)>B7d$q5KioY2YFV_r/rqbi=_,3(PqkmoaRu_!YNG!6t[=tESJgV]?lskguPPCjVk)D!84/3!s#-."pFur_eV&67ce7^-r2p*c3NrLCHJ9%_E;]Q`NRd`'%gh%ROFWPc&ol5c2j5T[QTCcm#&1f0amC/<@Zh*atjLsrs1q/am[>JD"*,da&>rn$^k(BFOPF!SV4#lmN+Igkn!._H#TE)c@GS%dg.T\f_C=mjgfu],I/'R%N;%s`!_9o@pUXAN'M'no;GMIpI*`pGeX6DZ*)Qt2HZ>KEuY&]NLEAH(UR`Hi5(n^0aN,U7-IXYO;kI`RAa)1McGA/o&mC_QFH!DQmoP;-3'!(C>GBQh)[s]uS[35KH$$Rkpd)Oe3-Eq;5An$>E3D!"*j;gu"OZN))QQJ[OmJdRcE66TdNQXm4NW-MeaP!Cg9jM=.WI[(HE<;Nt4RR4KG#g;Cq)n)h4&=-so!kI)X`=2CnOHSm:/3i%]R4NFO#o>o)'GEuB)mIhbb+sOBQu[D^$0#(`)FQ#X5j(0Y1L]'Y'te(C_XXOD^7p!XBX@\R8rY!NrBZU_oE:KMpBH)eq[?q6#M+,;AcK1*_:L>oc2jtErE5QknE6ICsX9J[\%d;FGhQieW(^p2lPh^_P?g8'nk]0N#%&dc-(>QM6W[&a,9Et"S0fm1/VH7SYu)a\ZiB&,QljAGnXG:F"oq3;$jlunL=]g\P`(5]d&7XJrQ]LGl&R0FCAU!1ap$2P3"!4M4>'YV/rnen%^.m59<'NF7_WgqSSnB&bSO?H%8q&P^c0)G'CgQQ=K!:WThQ,_G6`#b)ECWl<2>IpjXibZJ=ftfcfqR3g#N>1tiHA9"Cg$K#B%/D'tB+3;".3S()'NJ@*On!5N8m%I0]g&so,S%t[sQnRL:U4HE]8;5HA1">Mu5<_GUGR'rpREO5GDj_jY@=gu%hIC+fNjjoiT30)O\I-TL@g>cb+/"a;[Fud%dP5WT)JeugXT#%2a(?a3+(QpZ?tHm[u0.il,VQAWkHkc*^,/EGe%)W9rR_tg[X0]puq=5qkb_$Ed:RTItU*a0BMAlcM!Q*T#W.'P=;1n88`R[;(La?_tN>+CJW(4U*QZEf0NC_pV_*P72.Vjj08$k3Nb:kk(]Er[%(F9]+Un7Wa+uqi=edl3?O8Bp!^BSb^LTLpMt=/&+YcK`q=Z"E^%$lBkt(Ho#K#6qNF@If%N._65]?aQ"W0@h;Hs9.Q.&aOl+PA`[fPC-8)J7\f3m]NWO^q<7E]1n(M,4rKEQhpJ@nj_-bZTAsIp>4)T-Be^of*Xc$WQtPEBph6fE#\`JYCCu`STjMW\T=/Um^0TMn$_!V&+A;aF$4eRHltAN"F,Cn=ol\kobd`P/MedTDN[dZq;g;frq?#fKu?Rl-0Ucnk\Uh'`6^l@mJdA'U=FIciFif,nRq"rtKId"*C\:OQ]!QZV\)#td21FN6@N!Bk7>^mTWL_"ptZNn!kr)s-B-M85V+>#At!,dP1@Zejq%[G)RLL)U"L[G7pS&VWHJ8A,U!XmKnCPM("tkk'U1ZUm3-AeTmHh`6^$0u[BG#G-U7FKJ,f7mn$*,4iuaWFK3p,/fq^e6!2O01"i-&adA'3UmbE)R0J3cc=go#4X6A7-\@IWNVGl.68-2Q>"&!,7ie!Uug&$jP#j`l38S>SPG\ZdnoeT-98RNCK[1pBNraCmW3081sViCTm^%=24V0o?X&C#JX:>Z:THK!(b9A$@irKK*Mq\O5bbaQ4'F4J%CLUPtn\)4_#NL2s/Kc!K\%oMe!IBD1]<:I,c1GqQKqqVa(.E]KQ%t!g$.A1B9[DAl&K?kSfH#hXO`4#Sr'h.Z-jc8L"Y94cbL?F6NT'aGTR]jj"kt?[Ct5TDnJ\++#At!+'cX>],V\X;D)`EGHF\KuPNdj\#)'!&cHta),b-H-:EHqq_;Mci[&M`c?+b-c`V).UDI[ZrY2PTG?3hA0EDK0c&q6q_AEFTL7*roG`3fgn#&sr*'"X';aB)mIhbb+r\d62gJkg#_\qr_oGSir-mS+4H6?Q?XA!4$(G6>gFWQV$0LI]WT\PPP[fOHpau!&q^,HhX*\MECCqH!K-`6h^^KL*RYlcC27ms7_#X9G3]]CBYiMe7Sc3[*50C\,dX7I/*&Rgp;p.ETitoaH0eF=^3SGqphm!Q$*bE?Rl-0Ucnk\Uh'`6^^]er5QCPP6/8`a@WCV'!6C7t2SSb)/-#,]s0:JKI/R4La#7hjq2N3P5E9KIcaHg'`[s&IOn7r1MS()'NJ@*On!4Wmf4aQakmsO:p@GGY%]ls4l+T^@2cX%Ie=ol\kobd`P/MedTDN&JBH`0%Z54kPp*oI7nCBYiMe7Sc3[*50C\1t_olDl$,prCu.`r46`q*3n,+8Y=)DBQ\p!4#1E"oq3;$jqNSj=c#YbNl@HI[sp&pV-C8cT_6md,tjW1\nE[OA5!r!'j_":]T9)++pUm@hi=i.gi="X';aB)mIhbb+sGWW)\55JI!ZX3W#LqsJ[C4./bPI=;/TT3j)Kfq^e6!2O01"i(R*T?lD>j,L)Kj*pd@+"e=e6_>73Xl.e<5W5Uf!!$`$5lkr2IJMukn%S\e\%_O;B2@OHSc&?9^Q*M_k]6g8/c8cQa@-\jkrJD8&H'nC*uT)er?14oYdpA!^4:YpHe]mKMAKjf4o(bXYrhY>oNhu32r:Cl9)JD8/K'nC*uT)er?14oYd(0[h@n%\o%rVQ?HIf&NAhKl5!-mX`/?@VqHpn.)7nXneMilqth;LhurY8)S(;P*sidP?FV!2C]&2Q>"&fq^e6!2O01"TV"ZJ8A,U!O>:F"oq3;$jlunL&fo&4p,>Zq@!@cQ5LA:(_$MO8UUfa-M85V+>#At!&,;mAcUcnlkPPP[fOHpau!#Q.GZ:THKa!b@Mk%$43K1B9[DAl&J81^(lHobemAe7Sc3[*50C^h="8:$ON"2Q>"&!,7ie!J&Q/+IgknJ8A,U!:F#08.a)#td21FN5W)?OH5q@&H[l8&E*>%US2?o/#--M86!S()'NJ@*On!5N7ROA5!r5W5Uf!!$`$5llM`&0RIlB7OerT)er?14oW.UEMl\WQtRtUcnk\Uh'`6!(K>+Cf6l+Z:THK!(b9A$36$>!84/3"([Vl$ilBT)&*&f%0obd`P/MedT0H-)ddoFn5pS-41cj`QZFm'$KK;m/sfq^e6!2O01"TV"ZY1[n7e_9t,Tc=2D&-R\lfVk)_UMcd^O8ml^kG%&`flAd-.[VY(d(Bj\?+b"EXci(t[;K%?do`gmK:C!F=>+X?5q'p-&LP8V`#]n+*/&cn>"&!,7ie!J&RZldV=RK7"t)7i2BB=s7&j09PSEU*(kd6b61BSPFfBAUDTh^TuP[HkhnbK-]A:X]-:#[#@Zlh]@s*#'.1T&;kF)r8UUdC8BVDK!/uY;S*hi]A88M]Y2=*hqYbH0'*S-l`D.jA>)7?:\\`.T:F$VMG4c]FuH/-e.\pW;#=ukJS2d>ZETi0c9JWj-N4Y4,nl8([`WQtPEBph6fJC0JEZ&#,Z[@`+Q]h32>erGaK+p\Old=7l^C\.BLO%Y)5=g*-4lAGUICep3RXAKC-Zbc?B#P1qtCa=?E2]a>XK1-L8C<:A6S]^YS0:,O8ktI8mXV(ic]U-:Fal?j\I'=H3[bFXH9TRqi$_l/hC[kdCl8([`WQtPEBph6fJC0JEd9f@/\@st63=)@)GPb1Z.*C'E>O0ImDTok4n"V`R>]3I$f:kP\`$ZDm6[lj,-.,g'S9&UK&#h)p)H^l0_ne5O($i2Q>"&!,7ie!J&RZld;.haWe6<0o2RgcgK^gZ3@NFbJ@,F18!klo6t?(XLlE)+@tVOPFJ()E$MUL8u`De^sQ>4A"b^B^IW;b1;/^3H"4HgYSu(FfdH92l8([`WQtPEBph6fJC0JEZ,u$L*YOgs17h21p#Dsn/WQD-f,R<&'C2++?nrUiq6'F)EjUu_B]e>BO/%X(\6,mt8m8M?<3Nar\@'h!J8A,U!E]p9s'GTp4p,>Zq@!@cQ5LA:(_+#6eb-ed>S%%W0UVPQaaGTcM^Vs"-:q7=(dtFFpSGMVNuLO.:P()$5r<@aZ5Mcl4?;29lWJ?HP/hS@e7X;J;P*sidP?FV!2C^hAe@JN`\;[5>V$s$\U8ktcUofl9tT07?^SlNf%fA=+Eh/Ln<:4Dkm&\b\#5aeVqHA/dG=XbK-Kk[3mdni3eEq@&H[l8&E*>%US2?o6ru/>K/kT8*/^4q)1k;R96hZs1F6D`+/W\c%5->c^+o-MP>%`Co'n;BEmO;kF)r8UUdC8BVDK!/uY;S)jBbm8=KIcOSlV>UGM9hm0Q;:4f]n3>X9e3ucCFdAT:b\M%N2&@Wo,^SMJEZ[V:`,hJY>=-G#[4aA%!:ONGg-M85V+>#At!&,=3D3Di;(^A62[F&ekC@utZ*/(l`=`X1-EAhWO7q7n-j49\o=$a!ZA7;<>cth5\j5FN0*K2>)Ft_(+ir^h:[I(FSU8W$OUWY=sRao8gd%*qOj2n[_*u8Xoj4nSopDoI`;\k<>W_Tr+Igkn!._H#TE)c@8/OqI@aPhaN(eArZA/W^;(1I*jtcN!rZR6^k(d?&.MN1sos]GPigs(N'6L&*K++#iMMY.nh8"fp2=rV,3aJ,fN&Dnl8%>Aq4SqWi?d'FKQhTCIj0TAg=>bmrQ-J6U:r)#td21FN5W)KK[5ULauN_B'VHTb%G"62f.^L$S?^^]*nsGM]lOkK[XJ\C9m&^"[G65PsfR6_=V!m:-&'!0EKa'EAsZ\Mj%ZeEi39`QB(aI=e+l/M(Oe6amZ1al!*k\,5pg^\mZGq^$7:^A6#l5'ZSTM_De(oJls-(?WpC!,7ie!J&RZlSk4bHi6gRdquKrh+i;RkcGWL6T5@TcYPKi(5pM1`,5Cf%t=$<`ucE"bQ)Mao4J&R[*50C^h=!mSNci,K3)B)j_D]C`2g)UqVd2O*r>d7DEdZ)!._H#TE)c@#]OX,^"uC8^%=G(\AXq"GQ-pCrp.pD$#meM56Cn]AHi;<7RM^lnaPMTkEj,(M[spnEs9(qbb"n9dP?FV!2C^Q2>H[Y&&8,:Y?t'H(E^_X.fl4`o4J&R[*50C^h=#C]RB@m-f=ps\$%0<9>lUD%smI2#.U)FT)er?14oW.UEREop#seu;Q4c/@9hfO2r=?,huA/hZNn!kbb"n9dP?FV!2C^QF7nJ-KBj'.'(MY+IJ*Y"OSL[45[%br!-!XeiGuKAOsU4b(lQAmPuh9P<$%CLj]#iB/*CX[!'j_":]PG\UZ%tkl#'joN-)(5kTuL54%6mbYVr2ri7J!H=gDRKNVPQ5LA:loc7>QcjmU[t!-XEW>Z,rtNQ7!4G";pi)8sXV:o=BkMRSc?'d(jg7+.RrRY`!4Ym29`b;cb7"^Xp)"7&20$03DNi!b@9i`fcaB_P0:$tZmd6.W20)!i)P+FVmO[':O,KKIbpO!?ZalM-!0EKa'EFpI%"iCp*)q:?"18?ZY6.1995Kmh)(D6*TQSj0tAeZTYY(ZTNL%i6_E'E-&OX"9=OL)&*'5AMi16im*J@2WSiX)i["k4dN_7bj@upBSLYiG&u*5[%br!-%(6GikGSGoXW]^%pf[HN[uh0Sl$I72/HdP:0UPp,6&A`CBl@rS0Tr`Z235!,`WTP5kU214oXYS^HrSUIY@XDu[8Z-LNW\grB&Z+.RBJkdIaUD/=8l[j`)NHN[uP;Hubjd8:T:*7)71rik9a/LJRi`R]:K81nf(l';FU+'4X+!7EWT!eANlpq[1Wr:62hI/2ljPDcnaPITQ#qRFunS3FN$Ch"F=gsg1]\_QF6?"d%BUM)Af7JU\Bo3s-W(8GKScg`Il$I(_W)`Qo$b5p7VX%<9kBph6f^h,"m_]Sm)l#aZ:h=#6ahknZYJg[a$5Q.doZ&NU:F0i@/09;%1Dp.6dT,-&"#LRQ/n$^l?m'BK5*5L*E2$j7*/MedTfGP.5qWb-]o7-bc%t=##j:Z@1nS[[1eK0!@gmCJ'#JeUCC(^M3>%US2nFY,tUQ7V8ktcg*dRu5>=*-)(k,uJt!87"NTD`Sed&kp$$jZ`/ZbQ+06:hL(AH/oJn,qZGd=E&@q%+>#At!4^6dpnp@Tl$ra%s8@pqHm?2)qik(J3a3)UAad;'c5q8dU0io;gR1Ms:tknIWu+7*aWcVZl>BRF)0'-rh&cVULT_ds`StJLYS."S*`nO*!7EWT!e=o'%KH4D5Q9^k5Pa$b^6W$s^%1:d]XT"HI(3O8QDAPdEhQO7Q)h;H?efumZ+([,mKnC_`RQ46J@*On!8pI=_iI%]pj`7GrtU:I'fHKY7JGt0s7of<[&^K7/.UJL!&oe98H8a)R6^k(d1G73H19b.@DfUb!Jg(FJ=FRV)#td21FN5W)?N#cNugI\c?I!DW%dYIf3X@SE9KIc\7s0Z!!70D,rplEEIIDO7)90XNqs:Z8%Xm162j=%n!'j_":]Ol["LnXXIItq=^]*ol$01I1]c/']ct!8$IrJ,J?-YJ0iq_ROtW5FG1TI=;/TTD:8C5[%br!+7Vd\7Y@.r/EYl\CrY)LHk^q@^.obR/u(Mk0F#-Bph6fJC+qdqL/2$Qg_Zcm^Kq'X_1Ghigp#Df>!>iGj'2M\1Pps!+Cf6l+Z:THK!(b9A$36$>!84/3"([Vl$ilBT)&*&f%0obd`P/MedT0H("'PPP]L:$OM75[%br!+7Vda"&fq^e6!2O01"TV"ZJ8A,U!O>:F"oq3;$jlunL&fo&4p,>Zq@!@cQ5LA:(_$MO8UUfa-M85V+>#At!&,;mAcUd"g.p?q_+EU1F;s8TI(@B+#[PpBA&nLo$s%s@`$GINP;1PUE!B_=_:#]$`XEIXoZ3j\&e]HuTn_Kb:N/e;rqi'MG)'?m=%=e]7-6\7CqU1p@D;!eC3^.4?gX"4)$QLFLSY4)5kV3u,ppuk743nB(-"9@OOrsSl-:_Y-&!!'MI!^Jcn56F/2d6@^5!#3BX$31(/L&b%FoZmM6:@uj4!!#GBJcYq&X!%J-'E']ePS=!O!!#8]N1^.Ni+`Mt)fe;[[sGK"&)+IVP?iYXrA+G<'E']e!'jD?TE"uMC'XeY)?`rO%3^D,$RnTXr]'ae!%95kB)hp^U)6/s!5R+r^oiAh:+*c?_3pWP*lH!d47't1a.OT$+![s4-oN*h"GZI!n1ro>,IO5T`3Vg/%)7#PBs!tM,pD6]=m!(-;p:5YA'H!gK"7n:.*LqBR3[sT3&5[6hOU@jJ3\(-Xjp\Ut%8Cbr0@o+DQ6A"#8rDE>#.)uH>qo\FiBf(;RtZDh:bZT@N^AN7q7_!Xuu$(=^a[]ER'[+J-k>T/Xp?/N"/c);t-WMhj:<1Q*$i[QUCQ8:4pB!Rn+?$!)ncQ*_Bj%e85O+6iGf=kJ"m9&iWfC5Ss(f#\HnBH0ZC1nX2*4eM>g/@Sb[;)`"[IlY^6[T5@9hT0>r-U2EX_'OuZEoONX7g#NZ]aHc3Wm&n:ReCpRnMYH6;l``cr0o2#-uYA-2SEWUM<2(J\Xo/=fJGolH.FQLF/N":21lOh(reXZEYmZKW9YWE41VgWqEYgF#VkihUY0"%QQa;Sh`UT];Mn(N]ejEfc?LhGg>]`7RO3Z7YSB]CG20UK-/*KIqF=u1+I#3.T!U/7:+b;-2j(sjS@#+ueYGFR#E2[a(k4)[O>Dku5O?H/)O[_Xj$Gk8HY+d;?4fR\FiN]@:g=GKe>'\A;-ZM;&Cf?EVZJ#\OGo&J9&X!8ZS_j_asULU)O5=VND^Z(rQs!e1uT$3*ogl5!.^d\5lgu$eIX,>?V8!l8FF1C.sePTYUlhi2Ub?nW=.r4S(EkbEDaGXW,8oA0%tKDdr?:L>NiDdXV&7IT=uVrj.\k_6W:tTNK2J&4.V7CV9tR_Y%5ugoj9Ss9jUj"ZQ#09fBN#*%GOJ7L+("KB.9E"V/>tlQC[)\^?9XZFX@XLaN0gMbd8-dPJ^1`F%aJ$Bs#Nmhli3jkiUbl8;qqNICijL@LE;-#O$C=YJ;[b^B8eY@e2_`[@ONUZ^%^FR6hQSsHD*;E+1dEJRZV;LT\qYa$]Fj^k,D30UKC51rZX^83_mduHA1Msqli)m4Q`+SAQ1aB#T=j`bJj[@AJ8jh?n3[LN\Y`Y`sR&7hm*bUe'Bf!Tc@YPXEUSKq0IeHCt."EWSV^7s;JKqY"Xc/C@MUMRK@A]@1RVRLr7i97s[tO/ZmjHB_d_k2f%hZ?Amk3W2p_g>;f9>dK6J[h)@EZluaP$n1r!!#h0,:ENl\/GDb6=UQPR7M81DVjaKo/s25ckfb1N9:Gb2te1o)G-`M>ZHT!+Y--:*qcQ*B!4[&LZWm,\@#kuPs#J7]K)0ro+.LJg=#>@naCLF#0D.Mt%Hr,#J47penTqD9\V!#XY'..M^0ib-3W(-)f)X8"W>)O?0l7c5maTh!%[uqV,Mb0a#3;5O1H1i'SQ)n/WD1pV*BjFE*_Nd^G;JBX$Ch)]BQgnc**JeS[%SkWVPk4Jl.rG<_BBE)B$<1joFF0=HKnJ0]/'a?T-E=FVB-'+[QA^]bBRR="kk'Ol.^eu;[cUr1mdU9?.uh`cBP#R^R`@#*o`J#?N1U+N!/b4g"TSO(6_Kr=PJHGVRoZT;B\L^ch.[6oS)k6&Qu9>nO%ZDK`2URhY0H5o:=61@OpD2C=X%75B!\bJC[5PcdC\P)Rkdp@$:RgCP_8M5jn,"-h.SWKas6pOP>^Q1V0>&RK=*'A*3pkAYo*TQ>Rk?RdLJq%O4'7ZI.@l;X3rS2V@'7f8dPGs^3GYZ'>b/pg,FKO]IV'X7QKQFdIq[O&7^Lca1n;!+W`Cl69kK]gX?'ZcBD)"Mdu_D&e'lkhe#G2c5^gh3ca>&;h:]rF_g.3.k&IE'jeT4k])am@N1U+N!/b4g"TSO(6_J6"PL)!fac6-cL%;`525o\9K=,up@HXDgHI&4;$Rb!U16Z9[o9To]W)-*!37TL2,BeW*-q0[*:R>b/nm#I?F+,>2BJLU@;galCArcHqlIT5GceFtZGQ(?P+s8LTSoA)0QN>eFCd%&[UG@.c76VC4?XS"G.fH!L:'>dJ#hJ3@B>$ig9('I,"+!4WpKV.'s`TiI;goMo2(RV'TS\"-9rBd\a)nN8Fr)JkPVV6dF]Q?H0NQYs-$'G[S@[`<)k;QjbN]@lF.G2"b:c')&'eTm["+JDr[#.gu%.og[sNhT>sI12N*?U$5WGBqul7ei="H0KV?V8rVfZcRNYfg\N)J6'jp\?"1gT`2qHQar55c2AR8%0RQH-+SL)ke-@f-W7!)O@S-ia7W)?T"4XU5o#/@lCF<_\=4oVKqt&D9\tQTjVJ`UgXKSfcSJ:QlcuWX5kIAb2/Yq0,:!\2_3ZRO`\LfYgqJ@&ZcA?.#$[Q[.B77S%i;li4UN`)F39:bNdZ"[\[niOcGVf_5HLC<[9BERJC;X>K4B/jt%V4+74na184qeTT@TNbO0qUZ7X%AW(h=@M2541DE;A:$%+1-$oj!c/Z0V*g]R6g^n`NE)A<<"onWOM@gO&!*ftaOpIl5kA/k4>ErHVZJRbsbuVDu&MJs-(XAX6Vg(sZFTo(F!2@n6OqE3&iFQ6VELnYgl6OKK*8-5h/0,t6I_<0VK(0.e+=6$h?e6TQQhIm/dfVE!!!!f0nKH,J?'hi''Wo=i[IFoQu'N_>T1Xb\rblinL`V19MLVTDBd&Do4Qt&%rj-ItTMY"Ye\9ZN^PDbmI=bL=dg4i78HceIRBHsV(j(',HeQRU\_pJleoNUun!jtAg@:td!D"lJ!2(`0:]LK72$?N\GXCCJHSsSk*gal`])(I6>'u5k%[5hPTcM;gqLPY3A+B#eQ9.l?(;csEX3:+EoN?)[bs/Lg5n[-SFg[_7"D=^J5E":Gg\bX3m^C=![VgboB7Afm4Dl'0ZTSk'V5e<3_ecgK?H3ooq_FOT=KtgD[rlFUESJkGAMU6$\67rV:,S4hkD>[t:Y^uD\h]>1-S3i[p6\DQt-o77Moi@eJji+(`9YnD75t0;qIkWPqjetDf(7T_#S#M=]mH!-`G[W@'YYZCMFX*i&q=ai8s3'<,()nEsC:kbMaK@)VQpm"Og"]8$_b&J(Xju+g9p0%nXrTYf:6mu&PF3.1VqlZBA$p7"rZp/\?D@$>?g`qAYM[VX'cU[1>%YNYCQE0H4cXLT4_bfXn@FMsoEUT8R\Jk_^dZ*7)#sZ0-q7#5!,sdub+n6HaUNWuW_Gt=0^tu+fH#9ah%k(Bk?+9Z*p85TX*&%M6:DjdgXD#B9rCa9XAp1FC)a1g@CE*gZ`mt7'8*IL\`;Z$D0>^'NBTClHWBO[ntq-ronHllG^e$-NJ(`;HQCF!3gRYTVR-(gdGC:G46jG\f,]g):-6^u3aO6,qWu[Rd;pl3iND>Q7]u.N1o%3,4LD8pMU`Y[;`e$.2!fLZX6SJVpOlRA?7M2[D;>J`o=r9)hd+qAksO@n's2%OQJJQ"RX1g!6spa8CH(R1=!5kpL41%VB:*ngLLgGogUZ_W6cXc,Y5on0`Yr%btdKl6I*;UlRTr+5dtfES7:*K5SkR8*X>6eNo6(aaNX/*`JI0b10XfChTPQf>keC3gW:='rj(3k.7/V_MUSP!W#/Y&D<9Lbn4ZC-WUY_`79/kFr:Q$S,(bq"B)hp^U)6/s!5R+r-l"\&eRg`Z1KAQPBK'H]nNpAmp6&6Cc6)%hSp?h]$"_R'$GDbM'IoR8fr"D.//jon:8P4W8n9I-pHlQ:/Enr@Rb)IL)%93N+p!6lA-+i#%]u>'5E`n+*:oFu3rU];Da@R0aNLu8D(TlaTO<\u#UnL"%qY%4_cHhT/2pNFf[ARNd$RWogA9H\JmNgKapf,HBOZ@3lJ>*lH!<=aG0FZibl`D*bDS5Vi9@#cqgs]%`/VLW[okL=$;?'UF<%k3[e7ST\.0*UfX+.6rU$T.5iH2U)OrHq(5DZNfKQLE[Y:'BU1>GS*!!"F)&JP6'o!io4hA^CGEW,`V:".#be7NIU>ISKur:.i)XucVg7OrqiKMpA@:Nb4!&5KRo%X\1siWk#rRC7GeXjTadEi17[gum+_!-"%0Rfi]k:_Y-&!5N18QbWI[eQ6+kEokFj1#/M(=0FZFo>rAPm!Cqsi,VujCLn&JTf6'Ih@2i*PMTV\%KM9D]1Du&!(AVo!WX4K#7hm2\8gQV7j$P>M9Gb\=20(Qk0;4:s*W`$"9=e-l`!%rt"I]\9$N]b)2)ml/rdr+n@N]S0#E-e,K"G"[M]1Du&!(AVo!WX4?\)2Z3Z,[nIgFt8M`"PqZqsM)nhEM!"I/I.KJ9%B6"onWOM@gO&i#pjiIJ]-s*n`t!Qah(tb--!C?HJS-(]DERD8aoYP[1'!'!7A=oj.oU43@I!%<^:'EI'!gq7q(r56$tqWN@r4THHEI]WT83RL%n!!!_P#RUQN(jt5mFa[VBSGMFl#km'Y!,uWH[/p?i7/mYq!)O@S-ih%kGkKTgpD([o*66`V)Z[[IiR\D:PS=!O!!#8]N1^.N#Jg(^:"-P2dL8j;or?\!okJp@6EXY.WiE>mQ2lGf_QO[SfEF-QDREXiIItq<-."jY!!!_P#RUQN!,g].]j6Fpe&Ah0bA`mc24Oe=_qD1LLOVDi4Zs2>5f:!,u'8[/p??n98rq+SMH,l(<^JiSXY.\'7R=Ig,lQ.#JTN!8sT`J,fM5.p%U?B:9BqSuLR1R"ee`9)_rCKKj4N5<<,Lr`-=!?q=/1B7D?;2h.J!#OJ9Rl@e_c>6e/cuJ[Ki,nY\>"(A"nJ&RO<+YdZ*WU.=ppC/']$-^@H4Bp2>HYiu_&HJc6Me!2(`0:]Q$(cF3,7WL5)dhf#Iff"7.,08:f'eV__4/Mage;6-iqh7f-=?S[_K4.9h_C[4)Xc/8R#pXp2CT)eolMIH\l!4_6me`uGs$&`Ob8?W[tg$ao23)T_79r:k8M\A*2%]!._k2C=&j,ZER'*)u@?I%2I>l`f%A02Yt68"Q#qnN1.I_Yp%(LK`$-34)H'ZUId!-$?M\m@3NWs^'uh;mu%8XN8/Z`71gl)R$l]MN;7U;[06!!),i@31ck3.8tK:He@ms7%3"]^lVWP5kR_$6bH4!*jWDalCC7'\.C#V+saKU$#(J2>Tb""TSN&b3q04gnTooqV#_g^&@ZZge@hM!%84+fZfgHNJ-3Zl'`cm?:%GgT58KHm"T:+V!'jD?TE"s.h5d`n\j^Sh1GpVZdIZBJa.=C)WX'K&-W5hJGDfp1AbOq$!,spm[/p??E)IaDRhL#;k0:jj/j]LG!!#h0,:EQ-75l%l[Kt0Y6A4kk\Fqln>&Et':&(KLqP3)*nKrshb3Z`'!8qhcCBX]]@53ht4Gc_X56Clc'ZC=b!-$?A^OQ:+Pq-'LB<@ULrK/SGottZcf^F!88c6n"C,KX^!`_*As8;J:[g)mQ%XtM[^b4]2\FdNp8`CBTcN!qF759Aq!$$OTf<9*)T./$b2B?q:%$P_]s7KZ)YICqj9iY]*lH!<CBX]]+W7mUp=NlY^]+(QbH95X!rr<8`qU`KrY;#Cd-_K2lE>nn.%In3;!-[>n"'>>3!!%PD(dS0&%S!q^h,bYq5'l+5%fcij?Rl+Q:@uj4!!#GBJcYolN%_p?iqqX5rqV=hhtu:)e48tSmfD>HnS8:.b)-*8!!&Z?7Sj)86h9D)s7toWT0CRTmMk'Y`[@C+ZL@_rJA]=/'`]X0qI]d.J>*lH!<4jiWk[$0/0p]rF86hg5b3#E)q>!)QG_cN!qF759Aq!$%Tb[r7m7*qu/]r+=j`$35j??Rl+Q:@uj4!!#GBJcYolUt`@smrXkc.f:J9%B6"onWOM@gO&i%k)oZd4*uiu`4<7(K@"YQ"0l5?3F(HTqMgEoGUW!0e/q1B7D?;2h.J!11a>HhVF6\omuJF\U=CM;crrC?%80GiRhF5MgV?!T5`mf*VMB'E']e!'jD?TE"tY:`+q*^%Ks9)`M)Ll)!R7H`g8G,a7/XIemdO:\@6NP1i0<[dTXd^no&S'`]X0qI]d.J>*lH!e@m!2(`0:]LK72$AGMU43AtEh\$f!!"F)&JP3F>R^_,SEQRGTUb5e@mb)-*8!!&Z?7Sj'bE&@cKEh\$fJ9%B6"onWOM@gO&!*fs6TUb5-qI]d.J>*lH!e@m!2(`0:]LK72$AGMU43AtEh\$f!!"F)&JP3F>R^_,SEQRGTUb5og#u)>g1PF5OAb)]_uigQn)QI90tZ\/GE63RL%n5WR4V!rr<8`2$^VOuEfFcn-Do/jqBQK3;9(0;r*8VAV\7EVe*9\uCprmRXN>g(g;VKN"2fR7O%%>H4W@Hm[AoK3Do^:-Z3nNH<:dMlS!$PS=!O!0e/q1B7D?;2h/e))R+H#YbS%_E:R2GX8stnHPO?RD?fX!E)q7S)bNtAWH&2;m7aB3DJoc^C6(_*N+g2[Tlp(*?P$HO!MGtHT)kUTkaqkU!/b4gQ.$cXVV)fo)c?mSP]h8H=3Mr4W>\s\2T*X5`co@JUM6j`f(=iGaj>]Xh=]$.ZGK"%e*:)5.477r5I4%k7T'\$'?tjBmBr.(H@`Fb"/@nm``bh"\!o/B(;g$--AVOb)/e?HMrRFSPl.\&,n`c)QZFsl)^IVr@7r##0>dq((:;b:>Q#,BZ='O&oK2K!#A%t&hd&QSIXlB$.\LQ;2W@CCoC.Z\9^le@mb)-*8!!&Z?7Sl+)ILr>66Fa1nRiSc,WX3TW='MH\`d=#ShUSSY7WQsSf'L64p5*ruQi=8bUGJ$!eDfTM7+_$`DPe@CEBo!h#>CtqSm6(Ga66tnCnIRO/%AK78m=^4Klh+g$*CL8@+WnTXt,INi_*<@PLF$"rq4cI0AA6j=1-!i_]JY@X"N5bF/lQ``i:bQV;%r`9)$s?ZZ^Gd:=;10[qHr'n>K'E_GrU[SnWA],ZVra0<$`^)u3JSn"^/p<8mCM!tM2+X4g3*Y%V:mDf.`NCQ#2>e-@gWb>01u1dj%c*$$%KogV/kC##`L!^=X4Kbb[:;\r$L3XDS/RO9u6Uf6#empo[Ac0U:sB98^KHaQ(0SBG7aI[lesChR>:lOK.[crH0Tig"NXoJp'4K4pD*+3nmc[3Dd.Lq_hQ5:@1ROKjE?\OT;!>p#Kqm*oRnrc7NZVhFkc=[1Wj>gVWZ13Jp02]&:MXR(M3(^&FkTm"f5#SV7]i)E4<5upHC!9ZW\P(El5_h:GL^f[]$Y6$e3R'9-hR4f7nnE*Nq0BfY7>kgp-foBAZ90^1/qK"VtfjuX1bq.?JVoNd'KaO6f1ERUsNkZd@utr3Bp!Nlq;=t2[de;9sh$Knh&5J4sHq%=gb7^g3,gu*k0J^/(W($o_[<^-DAr6fkINk[8A`M[b^1iXHo'o'!83?Quj,pO=kTX.&fR^_,SEQRGTUb5!*BZcL-,YE5[$R`u,KFOee3^IIr=42;hksggh`04?p1R6\^m.S0iT0G@D-G8P[I!6WVC"\b'\#@CUffZDT[DpVBGu8A,SMUq7-Uo-hJN"-CGW,AIba@Oe64*IP.J=NNt_'5]Poo*?]&KRoeK&5fM&QXc]?7E1iqqcG4!AthW7^*2G%]pr1nXUp%Qg-l=jQ8Fs@V_N_j72+HP%BQ?3>j#SnYKc+U%2Qk:7/SXh2!`r"Wi^On\De_g9/ot4'r\i^L6\:fSUNYGCu7h-0V1IhS'IY.(7d[X1GBECZ`;@&=e2/2i/'`RH_-d>VuqH![7jB2lo/BB?R.G$C:;Bfo5\l0]5Ag@Rc2\-jBVsp%0<,lkaqmKSEQRG!!%mc"I6<9*]F@;2queDcBhGI%s$)tC#+NUbh.%ICNcc9n!QaEBtD\Q+[J)R`sqWcS2X6diWUCXVl@cFVodu!Njg3n;gUG?:KpStC"\J8ULc=-QBTP$bK`k?VK'j^k,dmcmC*iq.()*sgYJ"G`--E2gA^an$9XVAXj5rR)pD)O5C2j>Bre`#]W+tEQ5oQL,Au<`)VsrMW%FfQehBY3UVr$@m.>R.G%oNiXY4RRT$OE'"/d:EDfH^6mslI_Wu4(T1"5]Wq%8I\.qZLfX7NiC?=(9Od3kfhnV1E0S9/(SgoD-Y>B^po)?N/ad6@^u3RL%n!!!_P#V,!Go=/n6g4gAASu([@6D#pi\@A8@3XmHr5IR`:$G4C>67JJa<3%iNW`X/H^u87-'g$iODJ5fJSUJ^_C3:T,dj)9OG'R?(hIFqqDB/%[oPp.-%l-eR-hCg+9,4S/3m_&O\9W][k&E\!(";r^)CMAdVpFD_"#P@,gX9bO&kZ[5[(E8F2:63-iH2`BASW84hi$iA\7t9jf#V-fa2RpUcgKD0IN#+MHm.1^=&58fH.]VF!^Jcn56F/2d6@^5!#3BX.d%63\=llORGGm7F\Q5BU?cjL8rD=Jj_53:.gea%Zbg3rrls:VGq"0)h:=GdiQUmQe\&<`311!fAN(@+D)XNsa)3t.]p\67imYNP5h90kS0%+(BM?DnV:B^B?H]3dj%^hK\u&2aH#d7Ic9./'oVY7t=4MuU\)R+QQSs=mem]\e(f*N*eJ$XfPqs1V03k'gmIWrOFj>8;qJe#,'=R6&ETpOrCpgRCN)qO[)b3iTHDZ-hqk):63."(NQC7s)l3rAD:Fe?1._.>nI8jH,ZScTiVWp*l@[fZ%p%g57N73c]Chn/7\*G9Hg,\>9S*]M3kJn$tDR4H^c)[9c\E^IPCWg'amnT#JR\'"d]:,3'R5fuba5ou]=ge,up!idW*cL,<5$CpXAGU';e@(L9kNZD2O38TtE)cT5E7sEp8Y."/!%8-qI]d.J>*lHjd]a#(J:Z2Z\N)%77)dS;kB+)%FYp0eTBdDNm063\gAqtD'#$U!U1Mla%G);O&Lda'S_l`$K:J&f/q.8(7mo@cfI^"Ye*#8l.!'+ZeH6;5+%/@"mM2Jlh>1QWg\?#q1rq\QKd+a3;.>uQqRQ=FjV.NP>jS8EgNUnBl;HV6lc+?VCEtYh5&#USj,m*U7&]k4c0#=lHOm9:ZucQ9"k[kZ(3G;a$lnGF8N.dCFkZl?WT?ln??mi"FtNeIg1FDU43@I!%<^:<6cBDEJcU^Ou4)Ol!")_Gt*W";kB+)X%c(iX^9P[B#A?;rGKXp&!ePCgXThgZd%N6mOSb002()()s;4o#Er`J-u5EpFmI6"T:I%&e]p:S/L2,S<^\J,2Z>j`r+gO]6$MEgDH-9S=_R"u*Ej@]kO\?.BZGJ;f'c,'SjQs.7>COiGmtb_[m2G8aj(\i"j[B+W!9HWK$ig9('I0QHZd%O),bd2d^ZO$gl/uuq:I@/-%s&')k0K*H+-`'uh/TF]C9k_0k&K4VN8kgb8&<+l]C@kB>&F87]]4(4g-*b(+,ckfAr1:,k`QVVK5X>/_Zr!l6@hNH$g&g"CD([e->lf6jC[A7$)[qr62Zbo#L%nO6rs5gZ<)t<21b"5>e\a1gF7rKACP2p"S/i0$$G*M`o0AS5h#G2##cLO39^fEp7<)"`i8_0E%?/o8ee;bg0/"%(I2W5WR4V"$elo56Clc'ZC>-kA9`LRB3Ngf97t*]')/?4!(u)2]0*6e'j8e^@9(J9i@SXDL>E"ZY$RJG11?Zl4$IkbW_u"pKA$j*t'F(W6#BZS&[s=ZK=d]FrJBM)hqeZq*DVO&r)go(@`*:=^i,$)RcL]goQJ2*RAg(,Ic*gASR3-+HX"s#YVIb\X[A2)a%O]q(po=3Y!2YAWD<_UCOoj-28%Rrg`SK<]2:79h8Y$LYSiH.+$\s'_]9u8m?Y[4]*jncA&\#sJ1[*HQ66PCKP4s'FJE?'toG&Ld@uHYCfIf.\#$+.:)^Ip9:C(h6Bj5]LJbuMZ1OR*D77OG'ZZarjuGM_gWf8%TNY?d`m&[.kga@;9XhE3@/@!1I$3;3_:9(sb)-*8!6U/t)#sZ0-q7#nB:d-m>rNe?]Iu-7M_K?oglsa=lFPZmI;nD&t'ca'gtKX.n/!o,:Ymffdo"[clTmFatgPr(O'?3"T7N[q531/GJ@*=h?XkCRo_l(J7j!GfeZl=dFLnpJ>^:G.f.W>,:"8CfNDV'2DKVOY?D'O^4te3EjLDi(IKH?a4^Lb,d"FN#s;]:&6sNlHl.d-qI]d.J>*lHjm41P;qsVr>(*(dbCam[/@4=FSD4dW2GACNe$.DF1qfUiX^^KgZf\W2a)N#@48khDWTE,i68_p)bk!fjmtH)4c;r/jBO8HMC,MAN]fHZlieL`4!blk5HI^5WYGiPA):MGqBq:fWY>pTO-Yg]>Ts]%?PV\AaE@mYc2jZat>5h(c>eab%\`BnrdjIM\cjZo&<)oJ/G'C#fNZH0=[T.b.Z"5U>D(;AGIkkEC;ItkGQqdFXC*Lm?X>9XX87Nh<>FKUbPtnV`B7`60hb>u91[ll:/(]`&6Z[VJ8RJFgTZ>rAgBZEWDGJ)/eZT177UUXl7A,6l-Uhj]_aH8R=Ci':BN].Es@?6GD3t?m;T4:uZ3t7?_3q;""+-Fi^o:5*o%9.,(h+?%RnYs,Md%!MM.uY7rN$$KWl*?^G7AoZdRdTa(dl:Y5G&/+aF0S?ZeIV`'MZ+Inb)-*8!!&Z?7Sj>()VsfLShqYu5Z.N.K&15(6Dhcf)euauZ5K`jdHLHoBJiN*alVnB\/GE63RL%n5WR4V!rr<8`M\jC7>cPnc@2Q`Oelt(Ngj&([Q_&Ql\Yl'K=uF1IX&gg:MYa7IUO#LKTJkPK9`a0Mj4=V'RK6L?7CV*CN!Fnuon-Z59e<1qo\05b;jZeS40Ug3Mc>UU[%V&IrhRM4&5$m+G6_Vfrli)W7EBG\MlIQ@G!dE&[]3#_J+2Pc\p*W")fNB/rVCY248-b1PGlaU`j]jAqY9*3pK_tC\;^3j!W_=MrsSl-:_Y.Q$`Z(EDP=8JNSH72)7o^J.<%6ndAiHpou.;.XeP9lL,+VE&uI9JDuY__HD/i':0ge`l0Q#7485)Vr8lI1?bLLAasJjuU8qA!3f`gR-_KaP560V^iR\D:PS=!O!!#8]N1_f+JJZh)NmNa(qo1K\N4W+.SkB5,(b_,.fc;uYU2N`s3*h?#uAP=4["90Q-?k,.mO+_1N[cDERdZUY@)7=^V-m=)Zs.q>'3GmsCZ,i3M:m$36;(rA+ER5Z*K5/il4]_ssPOmC1i1j0\^>cI`!%nG(XT1UHd6@^5!#3BX$35%DhL>@h`u]ToCriNnk/&2)VYP5_s!-$lk[/p?i7/mYq!)O@S-ih'A\UFAKmZP(2og/K3e@m!2(`0:]Q#5Epqku-_>SBI)e@m!2(`0:]Q#uEV&>;o+0jolD+*epAf/_ppC/'j[B+W!!#jF)31AA+?5Q7!-htM8!hcCks5+:d[!1Z(;pB!T?d6@^5!#0Q&,H1M6n)(d';qL]KWtta9`Ou'4X8<7a&ru#=]+"bucu?`9!6U/t)#sZ0W)J_Lmbbd/j2R'K++5uV'm\rl!ru^B^@,j+[bj48lIDr8)Z+CY!&uC^mfe5^U43@I!%;UJ&QB;E5Ps-[dNn8LrpK4XGoQfl:N#((>pqe`K^]5kE2@l)&oUm&WlDbW!WW];pNlq6SEQRG!!%o1@K_t?M+aJgo67J#5B^41!!#c7rVH2]H!E%>XtI$rj`/8Rl$!!+7J0jlspQ.n-d#?.03L2iapW`cPUf1:pj@FL,YKWYuBi52:@/!5RROIP1\c'E']e!'jC#NhB.9'1X)K!8+p"?r/[>43>jL8El0;.B;e&8f3OWqecoE3#p`B"b:WfIg,lQ-u/,T.S8V@HgJ$0:?,drQi?rR.h;W1EqAG$Dac3``j7R.^SU;!._u'rE]IP-i.HU!.^eEN1b2_gds5*MED@KYSX`bD]PIHFC`u?&kr/^=r_i%L;`T!MGtHT)eolMHW&m=un$k4:V?f:7E:+csr:/5]BM(^LE84@C6$jFS@@X3nC:1YACHDM9%ds&m5WR4V!rr<8Pn'GCIf&Na?@2(e7itHC-PfG9`!-TQ!WZ%lh7=rpA9-tWEJgpbqnBK@^u=4#0*%4MrA+ER5Z-e8l(*%Tl#\s^4nVd#8$Q_K#6;P.U^?#S)sWmENh.4l3FupcE<'s4\DIYoj[B+W!!#hpD?TXO(LR+'J,\W?^]!Q\VIH6%Eb_q/Y?1u/\;X1n?=d%KdN=-?)QiODb"8gD,ljGYme6cJ3RL%n!!!^UdKo.4^]1u]RVC-W@4Jai]`8%;B$W[IRB=I+,*T0Xj`Mu:mK^XHN:k?i-m4;n;M!1B7DXK>Cs]pag`9>VHGZe=,,.P,0Y7n+Ha3_nl:X!%95kB)hp^U5Fu(ro\e1kK]V[hu)UqPIliH*g`aE]<3^c!/p:&^OP@fQ0mQeVkPeMXs^'EG"s.!WG6h[q<.Wm%feR/h!YDsEh\$f!!"E^]+NQMrq$>]E)=(%$NT9VrsSl-:t-pa:k/8X++E^3++3*lH!<?5If/4JDuE)7X&lM(oVXoRL$X.N!8qnVf*VMB'E']e!'jD?TE"tYa1ZioDV_mHrVCY2dl*'Ae7NIU2r8f>j,ZF]GMN;X1?-mm!0e/q1B7D?;2h.J!1-M!L2Xcuer:V-?@(k4kFR%';Q1q*i1>DoC%Y9p8+i&!5]*suRKC:$`ig*W-n"k(!!%PD(dS0&^srtrb)-*8!6U/t)#sZ0-q7#5!,sduJ9%B6#(U`gIg,lQ.#JTN!!$75!MGtHT)kUTkaqkUfTCXgE5CqR(BK%aj*h%0PS=!O!0e/q1B7D:ZL9%>^hN2J(BK%aj*h%0PS=!O!0e/q1B7D:P2+AB!F.nNE<*3YpCdP"SEQRGTUb5!6U/t)$%g9rYY]d*?gIG/hZ]S!*G0V#lmdsoZmM6:@uj4!:0u:*,on[`rWtZgeRp#Eh\$fJ9%B6"or%$aQ%f/M`_ILf&D,[!0e/q1B[6?0!3d75'*+\qkaqmKSEQRG!8%nS38id?Nrsp?\=Wa$j[B+W!9HWK$in)'ON.A<(O6u#XMt,@!%95kB)j>-qI]d.G(_sf\@BW?!+7DH-NHCld6@^u3RL%n!3d^/EPTO^*X;[\EBaI(b)-*8!6U/t)$#1-+cc^X0(Lt%=H!%_!)QG_cN$d:oZmL;lj.kVE,h#\!Phmo:B5ocU43AtEh\$f!+8=i]l)YSQsH!2,kGT)kUTkaqkUfFd[6i8PrA"+[ehT)\lQ7/mYqj[B+W!5OVV`rQtmGoQgc`Vfo>-n"k(!%95kB)hpTKKKaS\B*\1?nLdo!'iQl56F/2d6@^5YTr4K^r8_`#68OZ561c,M>e@mb)-*8!.Z(5Nrq!eni-VOMu*e\:epZ/!)QG_cN!t3#^ID/EKS9B^foMh!.]*aIg1FDU43@I?q8;uJ;]=J%KP)>IKBM6'E']ePS=!O!!#)I*X>qTjDb1((AAIBTUb5iZaEcJ@2nZ!!)+KrsSnh7/mYq^lFMs!>cPt*!!(Zr<**K-i.HU-n"k(!!%1q4:\m2aQ!8./aatd5WR4V"$elo56Cni,NNj[`C1gQ!,HR=!e@mJ/oeo""l4s2um'=q[!7!:@uj4:epZ/!!)?kGoUdCOiIL<>22mRJ9%B6#(U`gIg,m\8''_@Mi0\-!7p.Y!W\GurA+G<'E']e!'!6U/t)$%g9rYY]d*?gIG/hZ]S!*G0V#lmdsoZmM6:@uj4!:0u:*,on[`rWtZgeRp#Eh\$fJ9%B6"or%$aQ&/hG&?+ofU90jmEK"P4rXCfGGA$ucC6K"r7\l#KJgj2!+7DH-NHCld6@^u3RL%n!3d^/ELX:.oA8\R.3FN:4Z':mpKa>roXnnPGGd#7qUorMQ/CHQGJ13bGoQgc`Vfo>-n"k(!%95kB)hpTKKLl0bqrdV`A5[S:>4XN(JQ>C9\Smq2\.::;EK@%cHB*L89XCWV[r]P++F"C;tK*0pJRF07fccRE<*3YpCdP"SEQRGTUb5E<*3YpCdP"SEQRGTUb5XFgYI/kha-p8qUTcWH2um'=q[!7!:@uj4:epZ/!!)B,hXe6md=]pt33]Xa8SOP+_S+cXX-2.6lo_e!(s2On"(obSN3d?sM(ih.6D(cK!n_BiV:dDQrfRB8AY[!7p.Y!W\GurA+G<'E']e!'@KQ4K`O,HfqlIr!tsdn:@UW6Rb7l+1sU[cY@Y>j#64lq7C#5`4u1UG2kZZpRZm1p"YkuS_fi#\U4)=/&.#aK(d=pk'OkTot^S]fi.pe_`-JdHgSd^ms=AiH2$`Fr=AA:"j9[`b.Dldh48o_eiUucG@%h'p[3Cmhg^"IY'KEB[#j1Yrk/);kFK5^q4_GhUL4#]dsGD!i.HgU*UfTmP<6>RHL6"N\\D)3](;LClBT=8)SQ,:nl[V9qi^^EoB&,Q^)h^F_hUgQh"p6)(,nEKZ;Vk%]dk3$ZU-kR2#5L"m_$#R+GtX3l`[tjmc_ropL\9Crcc\k'*^%+/P@Lp#?[M=sH_W[mBeqi&hM;*rDiW')?XE;[8*`T!L:qlfDmmrHFQFlp$`dJ6o%SN5B(*BU:!*_*hpi[ikAR2Nh#6=B11'G>Q1jZ1IIEM\ja8Q>bIebYpp:9WSOP+=9W6G&nh0q-Us4b.e-M$e+pNZc?n`E+!qB_R#RhW(^gJi%$jM>M?ndt84:,FO%!0KDl^sSW^XlJnGHJjFcoJ17;LMVj:3Y+<]\cCY]+5j.9%)SgbrPU:Z6*GBp4:'F5OGfq7>KutLoB1Rc=:e$]3YE*=!;A+C"Y.gCeo9DO(](pl$7Eb5g;m2<\Yb1esaltF'OcD)g4:YmrEJm5J&q^4/Y*+hsPC1M:9r9_hG#co_(2GO$!oFP5YT70WE@u@8`]uTI.FAa#0T)^Z_"uaSqDTha[%S7@?LG/>[BYBl&2s]J,a!=ro\*Jt&HJKKGo9WT5hX@qorOuD#_`TPicT0m([ZTZtRiU+([7JW!i_S;SNS9S:Poo1/b<`HCN%RVeT>:,?OW8T,3U,[/eMlWGlt-L13FiA[S;NN=5FhE`^"N*DmW:\\'GpUj:,^l*HG/!M2oUg*9+';g]T.=8k#M3FH/*k8?&g2BQPQXhE\TfG2kAX9==h3IkIkmahe%A,037m;>VF9YGY$9&b:!#;fk,H[m.HTMnU7k8B!k0)q0:-/986P-GoT'qr7[4BJ?1"jLPpQp^DT9nBZJ$T1l>JU^ZKg^p6p1Vp.o?1^_4RQ@MTBC2sK>srZe9IObE0P58ZnD>]7R,9ro=-oU4QgLNdr[;$7<.YeSEskd,1"sjC"/Q"Fqf-];3W,6f@//R]O0T043]/6gon;a`U,XpIPX%Rk/D=7G0/PGZHB6;+7m"ZnrQ8A@JQhlUMm3"S+D`;mH?;t1GA6YS5gMF,87uQ%ClFpl6[?AQ2<77B=&17&f+AD&V!7^)]o!i!GV8l$0e%tU"S!8?"S5"!iO"@n=QTA!.m&.hRDW`f,o=.Hgok'.b1Cs9#`F%@Yd9-&0o!n3J.J(L+Ib)(*lh.3+ON05Qkd28@r-3TR.:osPe'$_E(<>kPOc-71\:;6A=XQ<#Hj!S9@.<:u7_b,,m?9C+.&lQF.j"8S0Y?:I_[er`f5Fp_hK,,D/dkA-0*d[/C]&XHh]\$_W2)WY+AD&V5a^&6!3"#Cj`-V_YiY[a5,,/>qKh,q-3bBkcQ@TID*)VN6f_kT\%4WJg\E>ZdH:BWLR2]@DA($?Q,gT(/bV0X,TgVB\&sd\8^k\(qr'=%I&'dA@BWBhdV9JE,EKH)Ge$I"o1O@63?kPpl7i'3*`iQ7X(0lPO89r$%/\#X^-7W_?fuG/IAabZ4IZc2X6"N:fke-U`@=%5!FN:_\A,[^ne^l,k2_0&15G\uk+$6_+!+p(2]EJ,n)Xb60=Q&,==ZJ!nR<:nHf$jBs->bWTT]9WJ2!tK!+Act!MCdSQH,8Y8EXQ1aY/mpb56+jQ,\f!UpX"IW'-'QPK/Y$72q!IjO`t4EalrJJ'6kqPLfI]lg"-4B&EJHO8CRlm5:ZVHbrX*M_;>@SmFU#QoQJWFL@%]h`C0)MEDBAP5YT70WE@u@8`]uTI.F;a#0V?h-H5&egFslDWSuAP)l=uUhS>LJ%3_dG*u+>9P#9SH0.5lS89uC\oX/$mekbNMg)n\j*nYi8LI8/Rpt2pR]^jiq-pb!caW4OH9S2Lj`.agB9H49AhO[ZY?/7L8*a;B4WhiHTMF0W0],@irFZ7K,*)i)Ud"l&9^4E!R+,aKW6+MiESGKV562m#l8(\me7Sc[afirjH!V#=4nb2^b%.Cd8*P#U(9,PtrS]NoIZ^kD@T++Wc-2/F;rVI4Y@6BPbsGL7op@L*'bhK#lnC3T)lg)4p+&EIOC27nr2`--*l2I]qdo#BmerfF5(^+-1jd(\/YC)4RTOtXRHbl\FE35\'F_-N8AiPa3D4Tq."42=X,$]FWU:0SMkBVYNC(VpXelpEM$Njlms+m^$ArYgV7+RB6da(o9m8[gmh_bBD^CW^UP0\3I)T0-2e,M@8`]u_PB?t5YZ\ZO3;%4,`ecsC"aP-%ios<\)$=;;6mq@+6Ale+6RX1d;!q>Pc%:$nbX%/s"KMGHlt*"<&rXoX]?.,?fK-^O6brEg&0rn&-"-Fq)XT6_+n2fM-G.sj8SVU^V8%S^2k%3n(A0%kP't(GN3Ibpg>.%a`#J\pM\>1e24;kBB4%4Q1QF(KLpRr#a>)n!&aS[4K]PjVb:-Xfq$T(mp-268(20:C0h-7%2r)ib/ZOhC"f-FDPN1N+$S8d6osQrH-N[ESB$oTWj3@DmtPqLra?l"NhZ.l:[I6XGW'G8e8F+rN\8#ej"B_;'u-BhZnpCjY#Uk]RZ61%H/aUncJsAXe'$OBf*gD`4,PWedq7%=D!>u"hTeOcSZAt5`'n1Ek;6qg)6Yu6a6@SLm.\mi/j#lXbES86hON7#PArNr]c"4:)`2l)`T;uj/lj%j@.cfpps7(B!%R5/!!neb$kOcY)$"FBCO'/sfSn8=Wn?c#9c*-o?o79DqSRc#2&dp`I/_.Rr9uUn3Y`%Keq\-me7j+rrU,+l.mfXL9m\hBs#?(ONFNGi3h!0t]tnC/?d:$=J,7muJ!\2]f"-<@XZ3n@^;JfT1--L0Ti,pE5du#D/'g%B`UDL;=1cq#4NgK-[c2*c4DpM=`YO=gH`9u4a8KDDlX?QuE7r>Q9NI-RVq#UBqOQYYrd%u@51]FuX3f0F_.d%'ZTY/&aWbNBGhCn*VeL0$\,9n\QPhWTjETL$[\7tiEt0SnbrOu@VW78Vo5]8_EF^l_loamh_T:@qM"^S;lhG\OkB%AGb&CU\3kl)JUX\"/r"[!?b)$1I.>WB)nmP0B[>CFr[VsKB0DSCWZR?9UD6YrFS[;3/XU3enMV)$\L?mF(_kiRlg/TjDiQn.m39eGHDe=`*r[(O3;V`d;CtY*S>KoVk_3XC34XJG4Ea]*Z&+BGs:Sbp7&[8E]@\ZE80Rb^NCF:2LHa1qnZ%6X1VXFD\)6*VXr%UmL3GLj?.j8FHooN1[DN-!GdBue6]1?*Q2qPj5nVX\>%ZWkm'01mW]et<`/J]4,2!>>)[g+rVGr8A@HQ.])J6S/s=6UI"VD$J2!tK!+Act!MCdST>q]+.-brDK0au@*;95]7]Z.RnssATkkBhb_Ll9lebsgQs4F@1E0.K-gZpeemHSinZW8%THC_lkd-gV&\66M^Mb^<8-\H$Cq[6a]HZZ1Q7Pl)q=)?OR%AH>Xm@U]OFISj#qmF.Z's_D^mD^hq8e(O4[/ko/G*q+b+DuXNF63_UlXm9DDWPK.pH)HM,``&+Ud"l&9^4E!R+,aKW6&E.EPR&ONru>V562m#l8(\me7Sc[M*)9>QTPbNP5YT70WE@u@8`]uTI04hG[Br#J4fYO!5bNq",'6o#(W/`j5>4)irCRn:B1Zaq@!o^obdaE,*.B>-'&/,Ud"l&9^4E!R+,aKW/3VHSsMPLTT]9WJ2!tK!+Act!MCe13-\d#3.OWt'*,nF4p-I0I0P4jaQ)3(al<@Nkt_9bPPP\!-M85VC*J^kk9Z/kW2)WY+AD&V5a^&6!2t`:%\B"L%\T!a"Fr2*cN%BOT)kT3ni1l#ni2.lq@`kGUcnm68UUenR`OOIH-,(H.d9_/#a>)n&17&f!,<^=KBFPA"/r"[!?b)$1I.>WB)nmPTBC4-<]li[Qcm?W\K"=Vc-G5X)af%nh0?>2Y#_U[F;777?T7.tKKKa;P5YT70WE@u@8`]uTI,/Ua#0T)1[V$\n[:U:q;G*f6f$>23).`P,p%!RbJiWdON.B$d[pLN-M86!9^4D6eE!h(\2]@hdnUM%A.GO/nZ^oC:Jkcuqi0PNr(lHpXZ1'<\pr?4GoT'qr@,"2M'ie]`56!Y2>,Fb@u8d%+iTChS&J>J4fYO!5bNq",'6o#(W0?)n!&aS94K]8ba_$e)rKsI%Dt2"tk>01Zl6),iW2)WY+AD&V5a^&6!3"#3jDjQ89)$eNn,"r$g(/Qb0$\O!YHj53"b*aXr"%5A\GX*fjDB:KST4;S.e2Q^iV(4hX#r"`]Hod%3L/ZF!7*u]!^N.&B7M\8cN$e*?d@]/h0?E`m!$&u3Mr-*A%+\i0"TM+R;6p)BXaCA5;%,kW&a3$U1R>\h")7*XTS2YYg?*ma([ZYsqUNui5jo\FhbS.nm%U6g.;9O7%.[d:P*s+8+Bd-nmG`;Kr/OT/&s#>e!A!^N.&B7M\8cN$e*h]ErLhes#%I1b/nUXBXMrC(Y5I@nP#de(2q,GFKZR4hV,jns)QQ''+sSLq9!%chS(B?SPA10r2'kJQu5F.0PXY6di>AsLsEdsSl7/`u6VI5Z:Cd`#r_T?h`IAJm2(cfsiD]J#54;0m\.gL@]rbiejt^8]l:Aj>SqbOh.!pUO0XC[cLP*(XSL^-./9e0X9?(##4A`H%Mdr30=h3RR2T6rE]%;r`%+SuZ\$p$OeH/@2amlX_f4D/i7E7_`2W3G=^eiaipqlr:'QMr\GS=LO@[FEcL%4M@2+b;SF6!A>g>ZWa0f6[<,_c/\ACSb'bDY/kXSDfC'0_/5?)mE+a!h)IH6Ve%)SgI$.@?d@!j3j+K]Y2ai\/H3#uY&EWK']cnCVb')GE0n4,SE"Lo?8#*doukHKf.XEk2!U%7F(kT24:\$IrWIa*WQtQQ;P*u_-@bUb\5#4?CmGjs_R^hJ$S1hY_K^KficajinrmVO4KH&RR9Js@W;2l.25=hLmh`m1/d]]Y,.YtYN_.qBYKL=P'h-1)T\O%c_79/!-0))]8U\1TGV>WlJ*gc+Ke\/`]^)mUL/G(:iKLpRr#a>)n!&Y'IO's(GKBMe%;X,h8G-MB?cSX@nB@-:XC[UGU4_W-t+(SN$.'B$6a2rF3a^lMR4NANOcDbKonHBA\H%0#>kZ1J09UfXWmBd8'cU3#j$!-q6?c'D#Oj;:-NJfkI0Kt@q@!?]#s=:GCckmKP8Oh]k7@0To#kf[,'H'$A,ItW)J2&okC]\@Bc8ksB-#cd)TC:A)(."^EA:R3T20Shs'j+#YYbO'PIIMip.reJP.ht'p@TS>%dta[ChIC-G8j7WKL_fWFf*Eq`9P78/'i&MO'\^U*5,_@^Z9CDh\Ic.H^l2+EcTIC]N_I8#).8=VZ;]0;h2T"E,ZiT[m$XXl(i"[h)(]LGoXW+d%::L-M86!9^4D6e0ONGmZ7rZq]O*4[udD"j5!slKm>&WC`qOZC"13;UApCsXTl7Sdf!jY%pN-Gd+b2Ara^:9lf3a*HT0l$9V_BO2c]![QP;3!M(/%d.*pM.c1PUrR1.plBqBCJNbQ6ml@3>!lsIaEVTX?2c0P_1j3'!9T8arjkBYi6^V4t4o#U/QK!P'44D#sR0\_'/o#tfhS`[::g"gPMOj@1a^\t?GJ+M@'47Y@]B;%Nj+AD&V5a^&6!2rKIH/(#HUXf[V%M&'rCmDa3:ti$kj(A;4G+P`3Afd9V[9p[LQ8dig%VP++n\O"Gjf#?-lqm\kS$n6nkOus]4Do83-aV$Rk1uM31;F=6Z@?EV\+K74.ema5)/eYYo7_hpfh.j0%:MbPm*BBY[(K%NB'oJh?L<-Gb'^-h)($+Ko=3&W4Kb4+Yo(Ybg#d=pbA8!X.b!36C[CG-`Oe\a9>?S/?1*Sc!.%D'Y?QH'W26Dl6;,5os);^<:`S]K`Rn[c9i>1sPaYD%uc!bD4iTo2W5sq[]%hKfncbGJtB(6ToA.\,UT@ZLe+P\`h.+`uk%pBsB7Y1,!8PPHA]ibnD?H!Ft2b]^6?)UN``J3i5l7D-l*m5.>t5!M:#'=8kBEV[*;:AL3^ei1=*;O-./]7bn\SG`,eh4.OE@_^rN<8@fBk83^!gUj2p4?aIC`VE2mS`5B,*0SQk=A8:r4f<;_K9K-oEShj,=9j*k5UH@8!+Act!Q(Wr"$fSP1lmPYMVIQBOmK!b1%lC7B]dY4\88Qp>E0r_h>Sja[$LZbD9Ko,8=E#;oA.-0ON1YDZ9e$@CnF+8kNbT\?RDC=Y7igC.r8B")o_X+-Y_A(IC)9,H!GGIb]%pC++a3p=Z9*>Hu"M=rOmK"dZ;T;8R!0tW6tM+E6;%2'rSE&ni2.lq@`kGUcnm68UUenRQPL0QObLV%/WZFZod$uju"f%SZ_KZoF_]5Afd<+CGG4a#.*'=ji;LKVB:eYMt2F5f+5P04rhlAK01b9VXD*M:"`^FeM2sMB;$;f)r:%";`CIPENlA=;g4`*n_'_iD"QSSU@QYdbL6LTP4Ik).aijGIHLknT=oNY+RA\60S?L(n)n&17&f!,D);H!GHNNUfXEcY5FE+1hDJVqi6`]DL-[Lm)`:Q0\;R!Nc]Vb`aG#g@l3DQ(XqHPce?bb^Ri$<.EBDMZH`1g\_YcB';t#!EJ&E)&,EoITpt5+oC@8=/sgfF*6a_TW-NmCl6D>lW2)WY+AD&V5a^&6!3""tFij3%0:hg6I5PkMG,\QF@W5m[.i4K^YFg\bsauo^NJ84mZO?iiS5;&mW+rWbi?9oBK[:\a88gaCKPpCs6QLsMr&Rl`8`5McB%S,_RS2K7^q23.JoJ)marQ)muAn[GOo8+[,9Z0gVZ%>0"6hcnAFDMQXg'XEh&;7]&'X2KBij!,^&9iR9hE#/LP9'-83Qr[,)mOj$aYh_mj,2]@5?q]:kIcgCME.:YFS!k,@Hq!"^LM)'DW<1B>qc:\)"VFIM`mh]!&\]tpr#lMbpI??KG2CW$"$7]Z.R_NS#B#pId:7iBdjdV;2K??\@KoEW9W[hm!unRACrT%cQ;h>JluI'^uWEX[\T:9S#Z?b`cV8,[rmkp-G>-H4@N.0cJ))NEL-,s=P5YT70WE@u@8`]uTI06>5;sOiBCeQ13/JR@^MXET7NMe28Uge,R+,c!0WE@u:_S*o4>1t"5UH@8!+Act!Q(Wr"$fTAEU^X%E<)9r-NJfkI0Kt@q@!?]OiP<0P/dT&d[pLN-M86!9^4D6e3k>_cV#;a:e?-<5a^&6J2!tK!)O>S*'>m"*'bhK#lnC3T)lg)4p+&EjDj\%jDb0boHsWl8UUdKPPP[f23Gqqo9.,p<77B=&17&f+AD&V!7XCX#L?$a#>e!A!^N.&B7M\8cN$cTGoSq"GoT'qr)n!&]nZ_=Ni1!E@L>!"^LM)'DW<1B>om*XC"a*X>M5If_m&e7X:cWQtQ@'6tQ[06nO&-2e,M@8`]u_PB?t5Y^1t"5UH@8!+Act!Q(Wr"$fTAEU^X%E<)9r-NJfkI0Kt@q@!?]OiP<0P/dT&d[pLN-M86!9^4D6e3k>_cV#;a:e?-<5a^&6J2!tK!)O>S*'>m"*'bhK#lnC3T)lg)4p+&EjDj\%jDb0boHsWl8UUdKPPP[f23Gqqo9.,p<77B=&17&f+AD&V!7XCX#L?$a#>e!A!^N.&B7M\8cN$cTGoSq"GoT'qr)n!&]nZ_=Ni1!E@L>!"^LM)'DW<1B>om*XC"a*X>M5If_m&e7X:cWQtQ@'6tQ[06nO&-2e,M@8`]u_PB?t5Y^1t"5UH@8!+Act!Q(Wr"$fTAEU^X%E<)9r-NJfkI0Kt@q@!?]OiP<0P/dT&d[pLN-M86!9^4D6e3k>_cV#;a:e?-<5a^&6J2!tK!)O>S*'>m"*'bhK#lnC3T)lg)4p+&EjDj\%jDb0boHsWl8UUdKPPP[f23Gqqo9.,p<77B=&17&f+AD&V!7XCX#L?$a#>e!A!^N.&B7M\8cN$cTGoSq"GoT'qr)n!&]nZ_=Ni1!E@L>!"^LM)'DW<1B>om*XC"a*X>M5If_m&e7X:cWQtQ@'6tQ[06nO&-2e,M@8`]u_PB?t5Y^1t"5UH@8!+Act!Q(Wr"$fTAEU^X%E<)9r-NJfkI0Kt@q@!?]OiP<0P/dT&d[pLN-M86!9^4D6e3k>_cV#;a:e?-<5a^&6J2!tK!)O>S*'>m"*'bhK#lnC3T)lg)4p+&EjDj\%jDb0boHsWl8UUdKPPP[f23Gqqo9.,p<77B=&17&f+AD&V!7XCX#L?$a#>e!A!^N.&B7M\8cN$cTGoSq"GoT'qr)n!&]nZ_=Ni1!E@L>!"^LM)'DW<1B>om*XC"a*X>M5If_m&e7X:cWQtQ@'6tQ[06nO&-2e,M@8`]u_PB?t5Y^)n!:VCT:]TEf#S8?U)'DW<1B>4c]KlRKV]e7sobelGl8&FUUV&knJ>XPUR+,c!0WE@u!0?[T"TY-K!+Act!Q(Wr!rtI+)\`9s)?PR`I0Kt@q@!An-uVo^i+WH.-M86!9^4D6^n\P.!J%'k5a^&6J2!tK!!&)N"pG!uL&bX[T)lg)4p(dIar;#pGT$X:8UUdKPPP[fn0i3O!8qPs&17&f+AD&V!5PAB5llM6+[DFEB7M\8cN!s+ncf6tSq[5R;P+!,Ucnk\4N\TW!-fC`KLpRr#a>)n!:VCT:]TEf#S8?U)'DW<1B>4c]KlRKV]e7sobelGl8&FUUV&knJ>XPUR+,c!0WE@u!0?[T"TY-K!+Act!Q(Wr!rtI+)\`9s)?PR`I0Kt@q@!An-uVo^i+WH.-M86!9^4D6^n\P.!J%'k5a^&6J2!tK!!&)N"pG!uL&bX[T)lg)4p(dIar;#pGT$X:8UUdKPPP[fn0i3O!8qPs&17&f+AD&V!5PAB5llM6+[DFEB7M\8cN!s+ncf6tSq[5R;P+!,Ucnk\4N\TW!-fC`KLpRr#a>)n!:VCT:]TEf#S8?U)'DW<1B>4c]KlRKV]e7sobelGl8&FUUV&knJ>XPUR+,c!0WE@u!0?[T"TY-K!+Act!Q(Wr!rtI+)\`9s)?PR`I0Kt@q@!An-uVo^i+WH.-M86!9^4D6^n\P.!J%'k5a^&6J2!tK!!&)N"pG!uL&bX[T)lg)4p(dIar;#pGT$X:8UUdKPPP[fn0i3O!8qPs&17&f+AD&V!5PAB5llM6+[DFEB7M\8cN!s+ncf6tSq[5R;P+!,Ucnk\4N\TW!-fC`KLpRr#a>)n!:VCT:]TEf#S8?U)'DW<1B>4c]KlRKV]eendstream endobj 12 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 651.2874 152.397 662.2874 ] /Subtype /Link /Type /Annot +/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.d2f4ce0f2db50601dc2bcd38187beb82 11 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 13 0 obj << -/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 2058 /Length 115465 /Subtype /Image + /Type /XObject /Width 1098 >> +stream +Gb"-V9KBu?fBb,.b``)`gp78&pMbI/NT2LL:LUfl&@JLNqG3iJ&g\UsnEH"GgP)&*Y!6O\B`j'Oo#X5aprr;aun>AJOzzzzzzzzzzzzzzzzzXPZ,.]^s8rY?\tgq<:\)HMdF'?iKV_=l3Qd!!'h2^%pf[5PW&*/ml>?rquT@Vbc30?#nrCM0n^)=4d,CSpK\up$5cdJOEDS'>e>"9L57k3hOLL8H7J5")#sX:]C+':+,pZX#9J-Jeu`.Z(XCYY:I"gMpV-C8kl)G.#']Ljanh#%!!'eeEZ?I09Ai3CZHQ3"c!8Ht;O$8G5fn_uE1sN*P@Vh=qf<<48JhOn:En302!!!#-RHqHS9Q3jVAmGdS$bc;kHY:ZrNUF&!Sp2IF>93bE!8HbGf3XA:nU9`*\$E/gZ-D:%O&rJhanj!^!!'gC\UOL'<,GsOE$=Pi(H^SG5Pe6!b<>XYK3@+2!!!#O*ff8KFf&Ra=kC==+YUV.1'%U[!!$eVkK]Ws_Rt9lEn8bnG0[L2f:q$gaX<_)qP+#j!.`>fX'bfT>/P)/(h?q8@RpCdLHg_!c;/o[PH6t[!!!#O@->h+'31k73'=8U)1)):LW+[dil$Za5568dcNF4J!&i7]cTDkhB?giuaP;4^2I2`Bc,.BnpN1Wjt+i%IFGPSdr:jdennQTAU?nfZd%%pVX+(aGMRE;o&Zr;1]RLUaJjq9H:Xj$9:%95?@7W6]\`#,l?040X(kg.N7^Giue;Gp#=HiIAtk\%NnC!B!pu/^")!g8OTSAesgn;UJ]aT:bZj9\QhoO77!*l5qVDGX^o-07YoV2ptF\hca@T05Me,#"3[Z%3h<8`L95#H^0fCd;$LiP-"j.]#@cB#kH).la)(/-7b@=3X"iq$%KHJ/ElU"2;(LLIhgK:>4QCOY8.B4L9YT3Y+O)5eERQMb0(ijY6>QaCY[cQY::XS1rJfFC6!aAUHZn2\K(%GE^11IC_s&V5eLIc4X/2pEh3=C@e>q]sp%:3r>=Xfn:7XElDVCF`H7A/U%fcS0Eoa!V5$IDYcu[ZqcnmmW.S$8cr3Yl2bOM'm5ujs9C8IXSFfd^g[X;`F?nK_!gHDUfC6c2-Pa1NKTbSKQ>H+<1OkicOID;ZjCQ5c+d1f$O1a74Sj_L?XQhm>6$A]'XIb:V^qf&%dJ>kQDg4=)W6!@op$pg2#5%a-_!#@\9B3>$\L0S?#[rZ]1R1)6Q-YgjfA&ikBj=n]/!8!!*'"+@faeq.3DLSiV"/?"N1Cksj1oP1#@?q2'u1A;4:.9J5ZO/'F+/dGe7Ob&Ou?9jP0"?BfhE?Z*>ED8VLZ>3]J[mNd0Gh=)CBrY#3+FLA=DuaD%e`Y7GG@SigLt6#qrsl@H:I:aWPgZ`-.\:nE$$"j/\8WVW%hJ^@!-7/2kFN>eiq`3/f2ZuHP&>qN_akL2U[AF#=HnO]c,pXu<6E1K/aU=';S<-$@_G[ATMQE%(//e#,uSr;cs"!'lQL^3j'_M;j$:V:5nS+%c<"g.elr<"h(C*n-Z4Q6jl4lW@:9h#o/rOWCbIT<@%tP=hUTF*=IEgf:T4>="6teZG*bGAijRbAcHJXYJYEp=a:Edh;]]!#)(sLHP:_A*YU+(JHbkhi/gOX#ql6qkD^q"@KhRKq3uJ$ThF:Fqdic'fe:VAp1ag@^dPOaQ%CRoL:i`d+X/J:,emNKj&uUUj?ad8P70`:-r;<`04k88N6=*jLb9,9;5GBV#<[Cm%>#/1dl9oZu,Bu4A'u!o56\:Mj@)\q?$j#!.Z%LJ,]?aQ\5!u82oSW=rfhidqU<:m^X#of1$F#G5%lUcV?Dlm'^X)d@plF6a0H/Fh6hJ@fP!+=g_2RC)g6:-YJ]d'5"r"S.bQ<[1Y-,=`[?i;662JNu*Mqq?$j#!.Z'"pYL6cM>7#?c`aD3>^0eJP8K^"#>52!H_^BfHJM.KF<%h(FK'pDXmOAGR?;BQgMPHl&GD8$(4:YX;5]npmY+$V6kW)KJ%SU13)\XI6pFq']'6i%,nq7D.A#3,FrLUDAh!D_N\oSip:%f]qD/6S!._`'.c$?0-#kc]aW,Mt/>Bdr\liLO?8)S"&;:1t>O`MNeEJ:iK7fV_)Rs%7j0X:-Ejn8Z)!K]&c+k8MmhVf?GFTaf/.b=_!<<,8n]3!3`$MZr2M4M=#-/padT8l/RV)PU?9d-871a!!!#>,C1j!P>=BQY*sEoF;#(%$>92O`g+2#NZfTUGf,P#e&:*TUmiZRS'Q0icQ3DubGF\@I5apiaSKdPe'6Bu\CAN^D?'Y:E7?LG\g0m9?(Y@BCMA^&Rs6r,XY?1F*t0;C2b1d'bk-ZZ*b(n"FVUJNZ2/6\#TFh3DG@H^]=TC3Z&a6UAAJPdN&r#!jVr(PWY@IP\nbo:T66+R's!5O9.++IO[L_h^N>Z]T=2r+U01`&ZW`UnI2Wmu_:O2kN:p;34A1*bU+\(f'8UEkd2P8/PH]lXo5L%V@5G[7Ue&1buhf+-S503*$i[8PJ4G3Fs5F->+;DLuKP7h92h)PtqD5t@&T?@(i^ESm?MGr"[r&-)\1E[5tnqq8;gf2[">:,f'9(Y%#LSkEML#%@6onD'F$=n4^cnTUM:,4lM[m>TX[9@]ut/rEiA]<=T

    UsJkcu]jEm(R+I;=(otbb=_!H0L`,8"(>5T49s+"f$eCFmN5E[87rrj/SlF.4@pCbE(uj1@NG)DLC2otbij>#l>tAa)2bu[:[((#rIe_m'5[bB:Nj-2-V[J<(0Ya[A9aa>a37HT?L&QHN$IYoH[Rr[],SS6+:QrL,Bq\%("OMb!i_$efQ_1h(6%i@/*u@1jlH2OLe022#>+`V41M\h3Ud"M%ntS"17^J>EgD.f8;J([sPiqd.9O$H0If:1g(^8[(9Ep#9Ci&%W/,s1ZHV<&U]2SW]TkG99c5)g%SSee?>V6buMUH4i*ODA!nU048*5Bqc8qh[NGtFZ1=HlB5+HMM$*.G:*X+onHdMX\Ya^`?,CI2r48f34`k2-PaeGG>X7gTVY?n\r3qi.Il>Lu=/dd<`r\d\0"lrM%GCZsu:C$>E?1k!uI]s0"E%ei2p`5W0:\TV)%8"o6DE"m?pUL;cX3!@D]B"*846cTl/,ECZieooRj4Se'%/1CQ!!.\#jJ,HRM(&Rt/SND%UU)!p`lf,mAif8HPWMd'$kPtS_+HK9i4tXprB:aAqladguj1Y3D]BcW3U3//qrnIJR!$I>oGiB$,/tP:W53pW3Qm6oD'@61O!!'f#Idr>'g_IDGo4HS(.ko/G;l<$pH2?d'Zi8;O!!".VcC[6)2KAakHrH78*?$NL/,o'W)rmLc;U!tRMUFU\_SGkpHfUAuqGSFpLu!!!"EpY'Dd7F`WhDid>!cC>J*kG:h@3jf(CSukBl+`T"$?oHgJ#=59^(-!8&QoBo4ZD'U)\OZbXYI.p$u8%0-A.Q?234RChmuli-eMcap+[r"i^f1$VP^o?B5#raZ!/!+>ER^3uL@Bul,E-VfJ%nW?<_anfKJ!!%ODp&+F-7fhf,[;/p3\(Ft6:S&7ZiF"@\q?$`u!.`=;hgP6U_XbX%'5tPR7b1!\G1!jAkFsD55QCQ*Zi2c]!!$Ee712Kk2f@El]%"]:M5#t8fC-BD:=c$>!!!"8M8\$Gu9!!!",X.2>"2X8,(l(s`P/pjl%U:E1+h0%?:gUFN'pAk6oY\cT&o[A0T\L._DO$),6##/mc28kK]X"lXF\=B:jT1)N?)"pmh!d%KHKZSTF&DV773%o&\&5^%GFW2)7(NAQbp,T8mfbI_X2rD#aP9OHimRGpVms&K0d2qsT%5p"-OQQa%E%du82diQ3I>bkcJe!!!#uoWt1g/:&F6jQtR+0>-ekX]r9?/t\7r0>IGU6Ou?P^$gA&\m*)pSpg=cXD_MI!!$CK&SLOFpYNLq:7aQs$J-C"pr?(Pfl84`>ePIVgpqLJgI(%j+9(bb=l6Xf!!'fc7)jN5O[kQZNZtArSJ&p/l!=0@AF*d?)O,8`(=\FAL904oX5!WW3#Mu)@a&"\7HBp!'UMHfGE1M>!hf]tLlei+oU!!'6d:I"gMg9k^nC$N8n(^rg+Hi!C!k^RfmWDf_krVjp&-aR^3Oc-F-4nm`QiPL:!=0>fAHM-*I1nA:gtq4ERePBB4m!!!",-,\\!!"O[Gk%M!2pXVX9\'XR!!!"LQ!Ch<6):"5SpN*UL&_2R!5M4PSNA4Ic%#]DIq@FIz=NT7&B19E-d>ra@F[H-/!!$CQVb`p#l/q9]X'%@az!!"N0ET2XB2_Vo?@b(th!!!"LQ$i>!!"PFqU`J7d`p%+2m[B-zXQ4/(qjL&7[r1$E\fh%R!!'6dYC?/F,2Kp)elu99"98E%!*8ZUYC&d7Rs3_7-gQKe!!!#79"t5b08jrDm^qq"h%0Pd!!$-CQbN)AK%#QOi)!3G7"roS,e](u$&J":^Lz?mVpU9;J'7rqbs7f*HDEdsNcXtuEz=NU#\pH+LT56(H)BAF+!!!!"$a_uY")j,%;qQKo[l\5B>!!'f,55k+PO`(0lDuV`]L&_2R!5M2jq;`3ODSGUo04`lMz=NO&TI3d7cs8.m!!!#78j<1B6]l9#pr+muh%0Pd!!$-Cc[Yq8O`%o*V(ZE9&-)\1!*IA?n%UO(9tT6,\fh%R!!'6dGMdgMUmo.!qnLIg+TMKB!3hV7h0f%A?d?5+zYS-eMzCkm5kGt4["YC,F^=Z6H`!!!""&uD(IpkO@?\fh%R!!'59cgs[dz[Qp'prp_*11$aPo!!!#79&>$oD38_MqUMc]h%0Pd!!$-C>Aq2$dS6XgagrVq!!!#'OuM9GPB6m,!!$C77-Wj+rop&\D?p4B!!'+]p?gTYh0eU*?d$#(zY``5"DM`K,ci%=XX;_3@!!!!L\U!eD82oH$`](2@#QOi)!3G8$N>nZ4z>9HNss8&r!RWUst!!!",-3*kWs!uMl\(f0=+TMKB!3hXLj5a!!!"LPsjm!S)=-UedVW[!!%P7]_^oo,2N1o^]/Z3%06G/!.^?Io#`JY)ZTjlh.Q$#QOi)!3@G<2ui]Gs-\!sz?mRJ@r3AjPhtbQAZ>KpJ!!!##jP%"WU`0:6!!$4G8iPZ+mWZ!T#QOi)!3G7XQX1ab.8_r!!!#''&0i`]"._+]2o8r#eR*b$l).[n(B=F8!7K]6F6B44BbN++^79=U!<<*"@$\Fn^3f;C[*O3pZbQG"0=,OFzb]&uXP3dV!!!#BqnN1.^PV_fpqHe-qsP2;zCmO=!'-Z96!!!#O+9t=S!Y,21!.YM645*@5*:`3nRg]8s!!&2uM)H"JkOe#f"<7CA!!'R8GdJXPzaK!/R!!!!A-WZ9d"<7CA!!&FFUWo2_B3'jI"<7CA!!!o5h=#e/8"3_lDQOam#WMea!!"btU!/R!!!#W(`Z>Y+lE>#!!"uV`u/_"2uipY!05.j8"2Kr6n>SUDu]k#!!$,Z4@C+i%KHJ/J/./ng(83'!!!!M/T9#`6GNU%!!$sdq2@4oAAJ$:c[VPZW<*&"!0CQ5N]*"Zi.r-]Du]kF@2A$!#!!!"Lf]GYm#QY/1!!'g,2F#n`#WMea!5OWLNbB(LhuE`W!'=tcU.p;k!rr<$m%Ea(2A$!#!!!#';mnR;6jPaP!!'fpf^#!!$6lpV6b,ejl3c#WRQI&9%UL!._0sUb@6jPaP!!'f8g9kT-+lE>#!!$582ks*#J-,cO!,RX#N]%IN%KHJ/YQ]h@&HWFB!!'7Nib3DZ4nn;`[##?5!!!"L%@)l1DnYgEf%D5`Ooaa`%mS;7&cht4!18g\F-&B>LbhE6!<<*"EfL07Z\a2GT-"+E!!!"\>P-W#Jq*q'!!)("d:RA$)uos=+Ld.bLIJuZ!!!">LhO+7!Y,21!0A^!RoL#=!!!"LS06OeNdq33!!$PiBX9;o)uos=+@APdoci;o!!!"e+PIe=!Y,21!-$/<2FiOQ!rr<$*#kWs;'Y!!!!!#>J7s!d#WMea!5O^@g)MIA%KHJ/E(#L?a,b`Q!!!##*RQ2a"<7CA!+:fGBJUJ6Lc3;7J-,cO!3AUEg:[CXgK@VS4,SOj!!!##kRW1<"48GC#WMea!5R#N[!D;k7u9.76GNU%!!&Kfc:28!!!"80qupq+lE>#!+7;hD0?Qn#64`(>D?gtb6U'-!!(Xi6lQ\V!!!#'"c,'m&9%UL!3jk,2Fo%M!!!",6P4/hNIV*2!.^%r[)#$62uipYfH#!$G@!2E35h%KHJ/EenC]jUcA2!!&*26lW4ZJ-,cOJ=Ib9@!)Sl!!!"0NbF&f+lE>#!$FWs)lshV#64`(R3:5A-kL=t!!$u^Lc.4R"<7CA!#urP%?;>-#64`(a+.iUj$CH]!!'fs,21s7&T@^M!,t>^2E6-g)uos=XBcf_cC?m^[)$`+huE`W@#]t#a;+d]!!!"76*rp!&9%UL!3dZA%J#.%!rr=OV%IR+2Zt*#!!"R$BS1[VhuE`Wi)#4fa>3l-!!!!77'o8Z&T@^M!&,5:#+L3p!rr=O)2L3'/-Hpm!!&f=g0bR+Du]k<0S*nibsfDK!!#9CBS0#L^]=E8^n6E@fG4T0!!%Ni8$p)j+lE>#!:282%CQcJ#64a3#8(gWXU$ld!!#*7BS5\A^]=E8fF^LjliI4u!!'gc,MHOL&9%UL!4E`l#.oV?!rr>*Q&%?N9`uF9!.ZXg[)"@>huE`WC^m*J5emC#!8%?@)^%J_!<<,PBLEd^M1>[.!3i/Q2S_-N%KHLE`Za%9#9i"*!!$gHU(&dq!=&T)?m?5"J41#g!!!">NbAMGNdq33!0CDQ)rRr`!U&L(5L0*m$ig9X!7;!Q:)n6@^%Yh7%KHJok(kq2.L8!6!!##FZiO2t^]=E8a;iS3=;M#K!!#9=Lc3%p&T@^M!&?jI!KI3^#64b^Qk=1cUI2ft!!"u:a_5b]euc#(6!t'4Du]k"6:O)#64a3/trfZ.0qm5!!"edD1Kkt^]=E884Bld2A#rp!!$C.d0A6."<7CAJ/HZ8H^"5!3i/Q2?9TdDu]mR`Za%93!]Ni!!$gHU()Y+#WMea?m?5"!%`_P!rr=ANbAN&E'hAPRKODI.Bk[J$B"SJ6bRM!O+1r^c?W,*!$9E!$!eh%=n+D#+T'"ns6lQ,qJq*q'!+mA-!8&h*)uou#C)?qVHCeKVMq%^1!C`@5sR8F^'lk\4$g9BS?D=s)/!Uho-et!!%NU)]*?Z':&F0mV*&HD`GI/lUZ%n)Un#k0[5Q45;i=*\Q"DE:h@`jG)iHqgSSQXP,*nteud$-mpt7Ej.lLc<31u[Y8&>?+(X2tKnL8C/DAm[b+"R8js&^`!.`_A72qr`pl\m!X.h^LmtF=O35/Y#9*kbnEX0!s!tfB"*@q'XT!fgpZ?,f:)q%Fj&9%UL^n3M@g'DG+-qU_CVgYU'HV74N(U^uUj^\s*[$!5p?-fo0g\:E!n=\VGFsa0lam:lIf,cuU41(%C+SIN1YMS^!aq`h$*U!=&"mLb`P6V41!!%2tL.3,E3i$dHl#0lP"W!I\q):;e5C@p.mKMKegBWn1QcQqLk#R-^^f)RBHu57W"%b>0h"\)o_OO6b=seHbWfLA^?\Ft-FW.AQ+;<"Xe(/eZ_9oKq*`"!!+;^@DRArSlNrC$9WOJR+_QF2@CeuKMCPblBXM"I[2)KJC"8GKaQg70e^D$`gM4-sbuW=-<%1GA<^U]MD7=m?V%^o>r(c.Nes`UB;,sGnX`RbVGGri*nA'&_X_st=;o4kYCRWZ>ptdDgM0?@TB"c`X$Gj!'U9iD">%>"TDp^JJEHa+dlD"R5[;*J*FGGY8Def$%@^d@tJ9K<+^?K>([\?ePWm[nII:qHB/:P5>VAjsIeq6np.>h<2W6Mnc#,`YnHeT2=CMJip>,eNZ,.;DIC=]&!d/M#XXfbOOlJ^\)44egrhb@Go@_#,\:04RN$/2/Si['4P;g5f4id;%qu$Bj8o7$T?=;n:=JD2)FTMXfO3f.U1Ye(]\l)o:S[Dn5r_`"mC'^k+OmY0j2Tc*1,^UoiufJF67S4#bt(4^Y2_-Aa9$+'.*DcShEVurTG1qoC+&aVle?DrW>+H_Y_WFJtA1fm4QWoA7cSp5*P/SR)EUl#eu0Om`&KK.eDGLGb[;!5ua<`RYL<[a2r4#uZtc;$e4"eZ8`TY9r5_j/OTe_&fJV,O!fkr[Tk:3MGbjgj%?pi&p\Z(T>g<@9L:ROC,^dC%b4kT]du2e8(1j;pXX+@lNp/r;#%IUECTdh/GC?GIHGWEU/U51H\lW^q1[IlMl$IbacHi&*'2K)f8c(!]_9f5u/`0]EW_T(%7N!B5"R/FkEa1gMHF1W\c:BnaMVLP!;Y9=h;dk$eg)NLD"[NAui[B,5YEZ&5VrkPe\s&q!21#"*>D[jd0`7j_8h3MR[uP-)8"=4oQL']:im>UZV/T!h.3,s5%pJM,L7VbPoqL6HGe+2W82&\*O>;=sP,KGC`]hS5jlY),ad5*,)%&KD^DW3.W*:1!l]tknUkshim;lAn3EP2:ekp?\3j-`(9SVm,[oI/6-*H8:Y4=!j3@pH1gML2=5/Vb+N5O9t"VdFJs2:KLCOfQ0/LPs*(0Q[FpW)ZU]=:F4r+aNe@gFp':b`l=CHHih)?`"fhs8DZu2uiqpL[BmUIQ1%KRUn9KHqbUq?"%$p%%^L`dS$lT\l$N4a_WEO!L/n$cp$L^l&Dg^%g(a!na9,XXsi+u)0">"u6rk[hG%O5.CEpR,thYN6GD:9o14E&=2r4ZUI45FMTeS[6+rN9*.`fFiMM&Hi5'%]fX>)@f4ksMA734*'Y?pP`;Qa@?-LJ9_t#mhs^c0;b.':jYcZ]r$eI.mgSn:Ck_j7F[aM24m(S(01@7NgUh!3cX8-JF.GIk[.\,0E6!Y:LBQXe`=:I-nR=](,JY>A(B`FAPdH8'_^27Z4Ut?cpT"m!1N';pi!n_O>V104rk[hGrka-sp&/Ind.=Zr+?=L-C#VNTXPqO)P\e%&4Sd/@>14GpJ^sjCZ4<@AiY/Ug7S'E(l#ed/)PE*T(XZ,"df'FEP,?^Q.[OkU&9%ULfP"J&D>_>bJE^K29$<+WY!FXN[+-Yj`Z:*b>!ufs(3(G460748"eXp+$NA3IAV@*1fj8oohW0R@WTe$*j7NpX2dna<=iWL%GlC3]%0P@OQ$W?t
      Tf4p:7H+`FooSEq+hlcCL^FfH8X;']+':(_eg;"d^Sp\=Gf8!'ZnHh3hUfgT9(u%?)D8DcA$;u@9)6Ga`mMR'"nngGD/:EpE&HN+:J.8n\d3`*o@.YbRh5tr!29jO]n*n.PrJB./-/FBD]04E..1TD+'7$D$gm3XFQu4+&m8Y(\GZeNRlOS@,V=0)Ve'4SHf3]ZVLgo64b]u8iZ+Rc4Amn$Z9+>r<<6o[/eRn`tQ?Xj/jUSCNn=iR$cuXSp1u7M6F$G*#D^/p\6V8o2;$q7:jjMDI0%8r,huEb]EOI=Mpk\u+>O%DZ'"Z15Z'3;-M`G?Ssdu/9ec+_-$Hqgs&J]meRb-RrHZ=W1(#=mjYr3@kDhOi+&cpk7-44!A\"*%r$JT9-Q5F7GB,b?_!)7_f$)@"ZDFk1$A/>7bZL`)s4RVT5g@\>hfjCF>k!6Bb[6l7n["YZS"E([]&?,,[O&"jsBj:U+0oJY$r3NPF!5q?Npf\7\*t%R4h/Y4P1YXiV>_49igK43*m19,q-e*o.b??'iI+S)f05Mk#mOGS88/r!;!_nIqRikM,iios##G68kBPQFKUmJ:I_%^d^jaS!u?TAmI^(6+idS6'@1%eP+H?c)?kt?A`L:FOM,Z\"ZEbIb`'##29AV#+lI0NR/T/Qe%o&B`,do$`c.7H/V3?bnA&I[)_EC@\#.ANlCO`0Z.$jo.rfhfd(s"9/)K=l5<(]\Xf4-JnH6\b>#oJ-nK@OnX:0t/`;$/FE?(J'$p;J?0p9>m*04.UA,DZcNgSY0qE3J\4kY.J-,d:c>?pqnIt3p,bM>$+YJVJW@E#/FH_)OID%3/G"RIfpW\O)UTg4qr-WdiNWq&f]*d`5W8BQ/qM7Iqfs\j+l4hXX_Ga4ZO0-INiNIjQ'`&e(,Z"!!&*b>8_:@V:n3GTSuj]UNMsa+Zb`#duC$4^0D_]hk_$_DQ@@eKAgc_Qr^QJ0.L-K(`9]b%NgT&XcChq-l6)F`>E]PQ>'O?G#'ck@W1g*MMW^MP\$iOeqTK!=Mn0`i#80]4G]c2WC=MP(;&#>U"\^!AZ@5XFE:,[,i(#"]X$7O?6TGVY?gmWHMjY*@$u_#1g[4cmrq1s/SiuX(mRQpP"RAqp:\.4(73q/U1B*Gk;f^.%nsU:[Gq:FaVEP=&S+KCnWT99R,U4=XhJ4tl_d=LqdI//,nA0n/9.n<.E1DRL@n;K*\TmoGe3EsOd9U,6L(n4J#GVjMAp.>H7?p\("#jV)c[X62uiV"H'F-YF)o7fX&3)_e"Zl$^R\3B;,^KK0R8n/=paR'2iN`#IR\Q/ap@("kM$@WK@*A)Y)[t>'YFC:!7LPJi^Ng'<>FZp+gIu!Y,21\[&?b`_WZ`0TcO9fnmOZa^1RHUmkclSmQ:!EbSn"=9prd8nP8l3`SJ1Mp8t9<4%L@UD2fb6hBZd"U@`Q0A!f*C;uBT3k6d7hWgLT[5P:jC:Q%b2]$jRki1i=\`<&o:/Mn:E-aP(T'6Gp29YlW/j'kKG;tuu`7:qG#K]TM<04\NMXQql=%Za<73R*eN90p/p7P6b9Jj.S.Cj'5gmfZ#9tWp&fp^`[)4D8$7JaFmi48G&6/@B7cF.c#`1j)O-6X?R+6GNU%+=FTWg>n>$#hIAM%F`\sTk4)W6M%C9Nb=`FG_ouMShoP$LmI'iq[YWo-[ojC^0qNE?jjl[O8P]/9,qkhY_MDqksLiTp06SN>I/C=fN:(ao4EoihHu%nmpc*Q2>'=8%o8bb:7f&I%o'FHZtr+BnH.<^6-0N"%-O,la,;k,7AIc,2kP>OBamM#LZ4gTG.[U+]M)O^J-,d:k(knqYV$%u!!"cBZiP^M,2`G$O9qWj!#u.D%KHLLN+`:n7u)Ts!5Pi_g&Soc,N&P%E"%O\!,t%+2uipu.A@7O*%(dt!!#NBBEJ7TO+7<4^tKB;!$Ecp)uouiLhHkjfco>S!3d5,)Z[q]!Y,21X#!J6BEJ6[O:4)jJ,F<;s*XkI@)H6]G4"_E:O_kuXT,=2!:\lkkFFDAcA96$++!.EXT&q7!5R`Bie]%W^7-'#DIi]QFTC'.ahF7*55H\ns#pD_Y^-6;LHdopfOG=b"+Y2BmficB[34B-5dlJ,!!')4!=&V16F6an@-n4Z!-%jl2?3^s&HWFB*%.Hi!!#NHJ-,elK4k>e^bHB$LIZ^n^l]hp!!$tSrqOMu&o[j/L_+D'!'"Qn*,IdipC1VG(kuT=iVs"?"47;QJ4pMnYX+_+>LTrc?1\$RJhI^u7Og;A8ZKmqmgkGcH!#a_q`WE-em"uV.MiEq=]W_b:.+Vh,O;5/%FG@[J.*$/YRs9pOk$n].=/ZEf#S4Bh;h;Rng17d9i27\UGoJrh&6iA!!(([!G=?ZN`U/nCZUHBp9JSZI-mRV<_AP9)2G/Af:Hkbhs]htna4KWcSS'8AX6lQ++EeT%M;p64\\Vgi!>AB&H>-7@h?FXS2B(`3jcg+oh4\7,^LE17XU(%)&3CL[9*VldW&(3."oik<>agYH/H6MNbm<_re@JenXT%KNK1>NLY!!(*Bm0G\fjG8A`eQZdbW[b#LX`Rcif1IK0%EECp]7Wj/S.Hgc0X'?uWYJ6*'Wn,'>'8.Ogepm1bA4N>p7UH$;r>3u?*,t![8KlPAmM`pT9%PLeq\/4?<'^"e[ed9\h2gG;tjudSnMWAekjnS.N2?iFII?mllS'phK6D"]2tu_`1F"E[G@caHIqn]puJf/B"c`X$E=e8n8:+kesNR`VKWlYF(O"37QW`)_3o!rCUVW[DLa]s<_!u')77@3*)5sX:E6I&11&7Hr+9Sbek)]2uS(.+;p"a`dOBH9_7t5H1Ut*61mFHLtck;S=XYp:^l=P`':O0?KD^7\sLj>4ULkU:T3jV*`=n<7R`(gVJ+,iO&$uoELHB0@*'e?`Z)^%n(*07F1BL2bp6,TfXZ:h;es'7VVDScLr17M1*s@S!5WPh2$7(\s?;l;U7_4/:59_>oRq(T>"iuMV,Jg9l;MV7'0sr?APmACXJ-DE2,1&`EMb]pd1rLITU[NhQcnKB<7<<3XX4kYC=col1o;DpWN%8HVA5A2>Y0)gqmn07AWR'm,V%nR=](t].Ge'#.jfU1K#<`$kZ?fRetTX6kMqK;<3>o,>KO'Y3EG`DOR=->dUh:<"u0j\4h$b`n\8t<,L)ceS:d78jh^7*1sTmW[@0GEJBa5*aR7QN[bi\=uEep`ig+A1n%$AlEC/dV-86W4i`lrUPgaBnOr4dH40VY09p:gh'GY"NbZd9%O]IW;iZW:Bfa.j!:IY#[/XrDms#;QX_,E[f`!1\\JHU4pR>G,=,DUUM!lX*7:5[BI5JAH%;NMJX8/FkUa^^:SSQ%GNC68$T+imNo.u9oQBR"obe'irLJaMk9!Vs6j.dC1;X[ac$Ac8$US"aaWm.un*hqHAXH[OBDt)`4op,%V4H]BWk=uqFmWBVHh]V\#;7rDYl'GgiV!U3^/-8*B_#HR*sYemFbA1kuL88?gh!!b9#Hs[[TB8,'V.$3sm4h31BZ<:KDGGRUp3mMKd(r;Sh,TJ!Q(M3i2>;([&XB#-AJS!!'fsgRs'19Iiq$;6f3U[HS-TU99ucc/NgYQC=#p/]U55>)F"0GOrf<`bJ4smD&*e,?%AiXS,+po7G.T21fNbV/`EQW";t__pMQI;qYp&gaZA9B"J15b;<(m]D^t'r'^B;`sXcFC#YedE*1N`SC*)EQnK@73*K33NBe)qtt=rDESRem_Gr,%(XQC[W+BEJ7M7ba/Xds$Etq%(UXOgr0D)Y]<::,h,qKC@b<_=WM:(/J-qh1U^G7Z[HqV!`NlqRqI-C3Q,kAuFIdGC*aOd(]L5N\)/SOiHG@Ah<^8\&rQVU\*'8aGr&udPQ%ng1CogD$Ah1a(]"/UAY_a`&ah3Q7IJ%9K/!ppC41Zkr,$5G,s<\GGV%"$m;h.ksjGnEjZ\uo8[-Q4_`nT7^N!P"g6I%e`JpZ*mC>4kmbR6&U.Nado)[Kn_rs0(l%9KT'gbASWHH&qF\S"FSCTS53*8E8=U6,,\M7UBLc,55ClS>tS@Gbrti(iR&9]NI%]B/@%3<1%2@2-FdL$+`3.)kh]Lda0#-V9u5CCN[1`:8aR8KE`Nm?iZn,YH'0Um5aNA9MTaM2ktYsof=iuZiL/7bN(eDK]sgg7(59^7!DfS4Z4VBF@Gd.Pu4[a8?I[n6V;RD)f(Fch>TU".B^HnKk(Y,0_H#h1r=#GpI.4rW6lQ++[SNIs:0d/k1VpcHe^#H0,%,D-QKN?'/>P11:!73FcFfa>DBe*eLe#@cN94G?=C>[.4'qi%dIlMs[AKEAY*PttUE@X;p4OH3L!^5!(@<<65;Ff3Lp_'*=1N'ec.ta7#cS?-3U#r;N\?a>]jS.A.clhf`XeL&AJU1`Ag5qkpu$cm)ZTlH;JlSs0j`m5'kLV';^:a3+kR3SbsQN&b1"/s:)rg:3)[-B9:QEY"W<+3n@g),iBH]$aTGomh-oMZ[n`;F)`JA?DRalEtf9C%T$Z-brIg]/E@;2N9i&.R:?A!+8=X1Z1+7d1k_XEUlDQ6dIDb]@$AprE:qY9CnZkiWZiTE@a;D;EWDOdCUQZb\k&]48Ylq`MY#LSj,CGGJ&*=C/ZAIfIaKR3C_.NX+B7)qj/sB=1Y@7+ej3X2r*EPLE$Jc2_fm>)a?]2qRJ^pYdWD%:AsgQO/I2U9,XXdW\V7b1("6YBr1'3$d83uqB/qhYP5'A2Ko\&K:h[u*.F3$.[/Lt.6O"f;jmUrV%SP'hS?E:SY_`Mq8iuk"os1EP/De`='7gp>*S\t_m(fJEOr_]<#a62KA^8.-&Xm`)c?U#RqC1:VHU3V)%*P,H6(fkN*#kEfNY^6G.A`=dJo$D.jfA2/IC?Y0i(a&/AhtS=uZgMG:cC**T3sm.Bsk!F"QW'mY4@ub%GFbnMq;=ctQHqUE:e?g;&[lN4:186/2.PWV$Ln?.Ra"@WCDoGl-Zq,f<8B/XgueSE.D%p06po#H];(8[sLWYk,._kVb"kSD)r;0Pden>Z?@&2!i0X>jk[^C\Ah/kASN%U2@%RoW8NBYL,5'@O8bSg<*`_@GKD0.>:g/d:bEg>-1b)A[tX!A[Pe02RSAU*3X<0V*4#u%u<+D!:6?u"rthX9B/4)BkfqSNI@RAnsjS#h=]lM,P>/BQ"!T0/bp.U&]ABs>"oug]s"U_kg'SX.ledKTLQ1\\^m7T1j"0Gdhp]"DM!YB(,Yh@,N<>&c1.XYhC?e?Kbj]QCAlY7dRnPV3Qa>SZKs[M%]$8>nZuq='4]ZuL6Kg_'>fd*]tonJ^M:+"h*[:L`f#p+M7^+E<25X+@\FP/K`sKa%@4aG*-;IK8l>/\^&4/eF@3D9!+9I$0]7be[F$i>V1#a_8XA'fe[$W9a6,S@pu.u1_qp'[akCK$eiPbH[ro_EWr%ORl*aZ1FQB/OEU97-3q;QL3slC$>E?144#6klA8*3M(*o\i[8GAmpV8ZjbFXp?G$8CMW-mO'VZu:=1$K4P8:A%F7&=c5\m:@@6o(c#V!NID`F.;kH%#iodm]M8QgA\_8,:_F(bZ-Y:[`2k1R8cA";u[^[^jS7M.gnXb&Gn\f%'qbK8IX1%XA7!hVTSo>(`ff+7+3iE2u"OLF].b1ApE)jL\5gd.ZWZIk`+$M1P:]*d09RNUa"^s]4U!t;R%Rne?0L6c^_bR/.cXu!5K!G*+7B#Y$Z)X$K[L@YUcQ%fki;8PgAA[ZiL.,F,>G=e5K-TE.D5(fj9/9FLo/'\"i\E:9[DsNg<)&5dUOl!/i)[!6?ad%0-Af/-6<3*$X):!.a/BDuer+d09RNXFbs)+=Dt'!!$DL"<7E0,ME+tJ9<$n!6>`!"onY)(BFb+-AXP[!8o7:Du^k6U(%)&3'%0^!69h-!rr=])?C)Y0d,0M!.a)q^]ADMhLGQRU(%)&3&UmZ!(S;p2YZ'T0@9t(!#uLN%Y1<>Y71I3a92MK^`(2*2WrAV,ME+tJE'/8!O*?]B_0=nT4InE)ZTlj;$7j=.jE[I!.atihuHlJLc,c+n,Ui?!!)'b!=-CQLc,55+J/p!!"O]r!rr>lN.;"<5suXl!0D[5)ut&npYL6b)ZTlB&I:>rAeQhuMMhBEJ57Fq=];s0Ho._/30IhT'u@S\0#EY,kmbW%&`dH(fqmZq6N@.BQKSfpb'$*.m`J0TuWpQSF46*/D@<#\FK),f;$8#DJ!Z/q[X(JAl(T('?jj#t.#k3FmpS$'%UD=O65LW@dG\Z7Ys\V!k4=)6i5R?`dB'q<@N3#H0gS)ZTk7ZNrNU2'LZR!.YtX^]CG;d09RN+A'?L.Nd%B!!'f"^]>o$d09RN+:A2TW'j#m!!%P^#WP(\+kcnr!#.`7!@e9#"onX28L!)?nA,>4*5KdS2?3^W,pM7IAk'-.!!$+:!Y/U56lQ++J/'3b!+nU*!<<+%0`hhm*^gqI!.\&nhuI@SZiL.,-jp(d+;`E0!!&[N#WR>c6lQ++J?gEX!:,\Z!rr>*7L1uhH6V&C!!')L!Y2FuLc,55!:,/c"0=AS%0-CD\fou3CPQR*!!'7K#WTV'+PHeq!(]Dk!Qp=6!rr)ZTj<;^('!.mpZE!!"\r!Y2G>6lQ++!7N.M!2Upo!!!"d*!$9m`IImY+/02E!.akWE.Hq9[!DE%GDS3X!!!abJ--KPZiL.,W&Oo"+;`E0!!&ZY&TE7o6lQ++J;Qh3!H^^K!!%O!5emDV2?3^W!TFq!!&r0"<:B"U(%)&5YWE[TNVqE!!!"6&-3$dLM-bi!)U!-32e/l)ZTkg)FqS/FWfB[8mfj"%#rjV',MN(cO+4f_jbiD#%fcS0bi6Hk#6P&1,22D<\*oYjIc2&"R%+b*NZL@;dF#43c^n@MDTVkp!<<,8'S_?s7'tXZGH]jkA./sl/G"V']6E]^_>O#ogTj%8!!!"\m*r"5U2fDgq/4ut@Jl4;"*;U*CGRn.GN?gWE=8rD?'Y:?om1mo1__FLM-pAo#W7P5+$j&\Op5\k2spXHhQe<#PPE4a3+-r!<<+MH!S16IE.?gU':>D^](XZ59\rMQK9aPBcPuBcCA%n#6b)-!+r_"0=M6I=F\MR2S*IB9`b:pTL/VJb:fn6R#i2)rq3IEa_ppKb,m5KkXlgq"onXR$=um\e^rE^i^osP3*79'M)MpkVZ[,&!'l5fj+8BV*3?Qu7iS#5SC9h94`pA^e^YZ2!!!!QO1Dg3^:q<:0'5pE_:g>>[*aklN//^.f!!%OlTF\$ikidiA@Vb]h"<=N"RRS6e#W;Is)C"=fcH`T3;ZHdt@#\F$E'^*+pYs/MC].K@*3@.@6lXtSo^m\:#K5fb`>;ld_0SlW!!&,?d\TS\f8*J_\h.Ja^qn0p>I;dP9hk$2]2sA:L5(H6qRHS+!3gdS=D[m.m@sQ&mbGAGHsQjaQ><%dNUFfG)nU:\&g%\TeEc^b!!!"$):1/bXoG^@E)8SEd7/?QlICY2H:WEW55aofomC'G!!&8Oeu`0Q>rTfa*KsJ*!=,H_(i=A]/m[2>D4C=)I.l6+li6;O!!"G8cCI&op?`Nq[=Nl0\KdsX3%.OJ[*a9STp_R'j!!!!AQY7R,p!cnag@Y(2c-=MT/r+t0JkQeoFJ!sOM>5S:gU?L=Dn_?<#ljr*FL/<[cT_6-BV]cpGMg/b?ZnFY"mgW45YVp.5r?eH4$.rfjVQUXj?^S4cEttgB7,`:VP[nU!WW3sU\+#Fp[$RCk3nfH3&#Wb8S7UG*]S,SCjhrV!!'FbbaC9`G_,24YKO([#m?c%B)ZJ=b8e9?n(p4\jT#8\e.@&2-fOXXbHbn4#m$q^0I@!2tA(I.L(oY-Ca;W?%6@D037)h:fJbYPbNea/&5Ib:o8LM1m[pu."6CKVe^:+`F"BVV&eSFlW)ie)FNoP*!d!!!!uVjfV`mb5'A[(&l&4=Rn.\gpjbFEDV\O5'L%k@N6H!!#i4VP^4O4$,l89-aSl[?L[mVcm(j[*amgW45kUM9Sj%,OJ;?*:^A+GD"gZ<#%g#N!WMX@('=gS[mR5'O7\d8)!<<+u#5@TDn*]TZ9rr!"I7!XSpK\$C2,IA#WUA.>,.'pA7S)U#']IgFn=`ifsLe[!*#uoq>#Sm!R\"&[r:/p4*P5%ZW7>kQ-P1DJ,.8pW\<)ihL+ohnO\,pZ,``=VI\9[!!#iXNZC2.)H;(Xm_*c/QL%f+('1=RAO`0HIeuk5TsRk_kNDa>qo.agn])`DSt;6R%KHJoKmE^spI/$'kO[N>EC4n$l[aRbM/"7DKM=I=?WOFu]O&!2fJ72rAH+[S=-"/mPn/],!C439FjA)o(9;;pe'Yldi2OHhWC.l1*fSA_-t`!+9-bY@$1l@u"_TSND$jFtGH]E6PCqHYkN4:/:Y554MK5F68GJ=o\O&bin36RsXkq&acEY-Vqmf76V<&hLGQR!fkqFD%'LK>j:J9&0KPD3%VZW!!!"?q;mrM3]fDl91^u&A_1B,R6->'CqT>QFs!#&j!!!#*R$j@&GjqA^2LU"%%j!ip?&jcgK4>tpg>itYL\9m@Y?\U^]+tAH!;U5>B:jVG=j]M"md=[!NEd[q&TFNjg(Z8&3iXi-2*!ZG]+tAH!1?7(rP]R['MY>)#7dsbnmEW"2'i=LkiesYQ4FH8&o^m+BX;kWSN8&\qn%%=\pgJ@W@\7C;@m]@0NPhIIf-_B=o\O&8nG)'rkSg]aKD?T&TEUPg.5bE*.l#"lrjAh!1%5E4o=s-Dp,;[FqJ[#+kfIWa"@>lW"d_0e,/k+'CD)e??q6/lfB>KjT72r/$NL1B,&b3kVJ)oMG':/2\_.O5Lc2,Qo]T.lhUoSms7GrjlrjAh!)h['s*`9_nbIPkDr-^a$hC7XJ4$[uZamWW6\c/.ZU[eecg:#"luE(+!0Z;[=>Wc63]aEK\K\X$'NCP&LM11HGOODUlKT#FOI'='RAi^W!.\>%B[igQo#i[tf7G<)J.i=qCFA$OD(#3Ih%@lrm5Kq>#:\i-b.@2mW%q)C!m7Q>>*TkpI-Fq#gZt;V\j+CY,^pU,?uVe1'(Y?l<]&i"0`TdFV`TmI>G>.HU0I5F5X`!!&rL`i>T(Ke0hO/6d6%*260hqXi64`E?d,[Vc'DpV1:k!WW48Ks>B*Df>)s#7k@3K9`CdJ4$]CF<`"TinX+o_[leBj,^K]!<<,M06>Z=>)sE#q>q/SVE0M8;Oh0Es81^2\T:8a/H>dDb->\o26!I'6aWg2`ZdCuh;.hnh32+S!!&s$B?m#Ue]oXC*CR]mJ\Q!HGPnn\l;I":"o,XG+FhrU9T5?WQQq16io"Lc/8tVk8Fl]mI4JkIgcegTkSq!!(Or)NB'V?B<,?M*tn+K(>ttJ4$]C@c)V.h=g6j7DLp1p8mUa!!#:W0G`APe]oXFM#iBF;t[m"iX:/HS-p,caK>[H!)s'JL>9+JO(_horI3G-?u8nE^`hF]Li_b)M=XM58&r*rIOi#G!!#jKmbYYSpu@EnVF>ua5@]%U6)=](U.n?BH1Iaj$gl`[P=9Ej!5OI0ogMP]RM1B[0bSf*A!!!#*@qcnCOreRu2TYODB:o,toD.RAbH;!K!16i>V/9%Z`.14^6*??4&TO]%[Vad6s8?lh[/^1,1]$LJhcSS:77[_E6lQi7:[7`E_[g+hIU.+K!!'f>*^"[dq!__><9WT2@;-YpZH`K+BS.MIRB!m2>F`)BIIpAP_#XN9R7)C%?RbHq?[n>H$VYEn!Y3T^9+mpfT-IOX*8._"!!'>B*?>m>K:P)JrqPN7Z>2`0=GMDoZpBOdgplnD_[hY]fYG:QlrjAhJ:.Cla$944\_hl5XmB4f1"J2>&8eX&QS)S7GWatJG3[R+fsLe[!1CS$rd0(T#a'+;f7F@97KJ9XK,$@qrk(EboS!YhACgk_!9Eq>Vk8/"g;Te2=L#.:*23mCm.g,2ib[2ndIH%:hoW#)!!'+0?[r#ss8Mtk0d)p^Z>2`0.q?@FSNFgdXfnphYAO=?W!0(pT,*dm?+Y9"o*3?N`;ta-KCZU$q6E1ear>93+hJKi!3ima>dtn/qV/JtO2YS6CI,?_!ff7OLc1>C*"M:5W/5"^FtE[o@'+hJbr6X`*TDtV`>;n&Xp*?I%lcpD6_so*U(,]!aN0/sf6KKMBJ_3N('">2I`Cd=B@!07>mmZ8M#iBFK/GMN5QC;t08hWXcf_oco;:kp!!#8Eh7\/:T1VY]3G$folF1<>+kgh;#SaC\R8Qip?EV$ST`Mcc[pG!!&7756(5*!sb4n)=&_i^`hE>SR&dH7@uokn+Y#."TSP(f%IBBp%b4KX&=*mW&[u]LM-c=55k+PI1!C.5Q=u3/H>cYjhCNL$ZSK$kicFRB?4NbS8Z.;L1gZlhKe9)rFC07aq`U;!!%P7\9di5p?gVR"oZ;l$aOP6:&F_GO'bU+g-CPkq>%p`%u^&ftrNmlf@3!3(M?m^qp#D'7$X]6>?Hr,H^WI/<**B4kjgQNI3f8gPC;:HnTM\;1Y(%*5RT8@`]u!jhGaY+%@gqKtJHDEN7;W9d[f!'j-"SXp"e*/8\p.6sR5DH/t)LGOEPT"TV6Z_[eu]Vbm9R5Q<1E('">2b_6E@`$Kd-p?bqb?Bne(!1;9oi1N&0mb"f)k09C$CB4D8q8HgJNfFThao::X04`Z9!9Q.#48Xdtr'?i)]=PQj%L)o`$/N18C\R8QiaR?0lri#L!.``s9hk$.ZU^NA?[VB4fsLe[J48n^]6Ec&6#i;6*#t2K$NO.\Dnl6OT4-[VpYVV_f0Z*kj!%&;77.a(!Y$\pr]+tCF4EGRbbV0"sJ/S:S_[dsCLl8R[33m<#J4dch!rr`MUP4tXA^!2s_kIf&N@D;1Fd!!!!Jmbbe:h;'Y8`;TZ5Z>0JkC2iUr3IQX5M\e%hXp"fUg@FO0YDQ!B;boQ!n(p4\[/`IWGl@pY:B+%qO8n!7bn7IfB0+T,4E\`u]SDH?rb<3<0%YS("92MsK^SO$*"!YJ85_"TYR[SND$:IIpBVi]V>CL^6)Jb5hU9HMmB,s4$M"q#:0ZA_-t`[Gnge^13!q!!(1-k09AWG3fd,f?ZYX9Qhuf:g8l)4tg9W/@uYt!%QjLb`"`L^cV"t,J+]kW($OqT8u,*aIPD:ACgk_5\9iQ+9*alWeV')@O;*UOQ-9=@Sksh2/)1Veh^iJ8BFmJ"A*u7pUEBTRm$NNG7o]T-VhuEb]>kd^EJ)Z;4`&72>Z"((T!n-i7&fAN'_Vq`c=o\Q'EoY0!NfFTh9)mh%%qO8n!5No-nDM-(cTNYYK0r!nZ>0I@PekB^J#lEW9m8]"T[r>-gDi1lJ4W-0TPD./_@,AYrmXkBc-=MTXp"fUF`QTd'p$DAD;2Mbf<"p:%fYXp"f%AePgkiXG;GGckAd._?Gr!7opIs7f*(i=l5A]+=tXRX"5-f>MsKX/g#ZG#icK&_/\;bu^m_c[p[4V9Hc4V:STiqQ>mgW4CLqO,;P,W7o&\'#CB4F:TeF1Ynol!Ip],iE1cI@kYP!)0j@S%4!!(U*>Aq2$cM6D9M-=o\O&!+=pFGiK5FD-hJG"keS0!!!#7b'is5=!HAbgq!%MmG"p^!<<*"J/,YBp[6nOHUYLPLVpE5!<<*"J0I@!!%NaqX(cLoR#$cp:%fYXp"e*!!$'fbr=ModH6j0Ssc4CQX't!!!!##d+,0u7C:aVD;1+9r[>Ao!._%C-'P$!1_^9kW,&,%aY!eu?m7`]U)m$FUh>NSNl:Q[7YcB5j@jjBpsYl7,gss7n%W5dblU/,lO-Drq)lceM'A"K9I;ncUZ24,kOBgq6L.X?1neGXg#,^AAZJ6k-:_U5!rt$;^1^EL1oo5a%8(Z@i&+tS8mFusMMH$]Q]d1OEmP.53HF3=_1QfMF(O5a!*$=kJXAm2KKMst3[mJf;)\*';fmpW78FDpB6dC.82gO!!bRV;-=9'^g"_p3&[#q0r,bi1\HiFl4e0QB(6XuD?-'Mjrna;X:qM2'3jb/41H)_s/=[m6IC6&)e`BL!q+s\^IDE3J;Rs7)e#C.S>)dhO!3=eSW/hN!197c10U-s/)s)fR0e-oJ)pu2Bg5WZ2d)"KCBX^&?"UY[s#8?SS9oT:km$I4F9B>VI%_EHBbG'Y*g'opW>),)Sk]#ZO"_KCC?ljQft:nFVWQ,Tc+^V#+_cAgYRMY3aT/EG/gYZa4<(7#udc(`K%%iot/phV>bXPIO_R%eu2CZ)g.rj\%Ngl7ASASXl="SXmmTB\obra$dmVHITtd,8QgeT5=,l):uJqcdq=D;!pFVU.[he:3qXm07N2tqR*9TCdpmdAG4ZEn1OUp!_OFtsc$&XV>9(/`)K/M547SS^1:',<8W.1-pF]VTIDF%_Gf/o2RH&@F+dU/Gg:Vf,Pl-SlE]ar?rc2%5nnSP#H!bIV@GFS`FfVSu$rgtrSA;MaqpL92]b44#nO5MSA/gp+:2o8Y\J`no3'V#Mpfk)G\KdE]rfMa)"NNTPY.:NN(hU]:D*N-*P5fq`H>,6"EUUQV-Ne9Wd>DL<1N8OH)=Q=c(@/pjlPWn2-H-AJ;Q!2`T#c8`BPXna-';#T^)MK!kt,pd(nD7gfVT-fWY>96UnAl7o1`Hdnm91\bo:88$eqTq2UU27'V2OCmoQ@qU:-YZd_FK$M'bZch5D`#UMXim0u_S*[DCudAL`q8G*CW4hV'oke7Cj.n%5em]fUXpqMN4oSlq:C`>*cqei'b2HZ`7bMjfrt^>-uu6CnW4^,,gl#=Gbl;R]e#cOOg92P=A/@gh26Lf8_-F/OI.';t`PbtVEODJ@t?7B,%?s)=`%R2fos*cDJP;:!-SF^)=khUJi"Z)B%udB+AO^&`a.N-$l'Z`.e`;SQ6,`7@B73#,"DC;\Sb3]XZ+eTolWDJeu]fX+f=At@Z.c?$&@C+T)sogg9U\#ELe`Tu$s8k[X!X]m]\s$TEf3/ST'&h8u\:5I(oSJin=+oooAEbfG0S^Eqs,O,bD3nB!?Y'1g9b1=h^*fm419:Kq7gU_CPA36K,]%OGV";/%WA(*o*\E^J'+r%HXk!+$Ta(gA!:P)hg=X\1i6')fWs&5EKgALieJ[7W_=:khk1F_++oPFh;Bm4qM-SZ+EL32*gPM!>u]:&/[L>Hno*UXA$Eror+AE@0_C164tIqO]0.Ean"1J5Cf=,G&I6gSk,<1H?+^0Db'LgQJa/PeOD>7).TdD6d\Yn&D8g)d7R[?O^jYR#NJX:,e']X"lEj=h*bA,WBO7Fa7X6pls9>Au$C=`GVtTNXltnj.Y[qZ>lqZhdV!cR=EaB&5?Gg2d.Oq4iX+MVed<@&1L2u6Ln*q:,ju=Yc?MQH<7.'VUh_pE1:q2lXS]ZJ4^EB&a([:U486$rf_a"bY1!#9&1aHYNjXae/EH")^%X/YaXd!6uVcl$Kb^1R&F3LS9='CBMZq^2Ao6F,$6;JgR&kkua[<0letM7i(bBM+eSeXMPf(Z/M7(_Fr"Mu(]r(/(WZ:l8K11E,LI]2'R(k+Sd(*_Zs*eE>=VT#V2b@1QL]'TAZSDVo%ujKd?@lE]=I]1s7J:B*871f^DL=[JhJ:Nfgn`c\VVQIDPT*Rn2ZP9.10`/#Zg&eSWiT4I_9=:$-M+E`.CGB7lqL7$ChM9^3FYN>?*4B1q[Z2ZS@pEmp$E_`mbE,IQXt;-TW;du?*%7%4K=cRLs&oNuH7P[ql\6&Jdt1DWbFD555F8/[pr"POfU1m9l3?QO`nQ@^JWcKPj33*D9I9oN_W@7dfO>hI(u:-.Q4fA:!&cu0CO<-8^\&u8u(3)T]CR!<>d6Rr1VfW7/>s[C_1Intm?N2.Yj$9VT@A8WP0i3`1XJi%'/oip"Gr9'WlYQ(DlP*ho6b*Y!7`*:96)b\iFbN2KJs5_13/3K_fm;XcOm>'kaUFCX+M:h6%uMPhEd.n<8/?9@P+CNL)PU+%JG,h9.pWC?6>_Y:Jb8N-W!9qc[h)c%A"]d7BZQ.1#%l:ApGEM[Or))]qnTt[X?\^MJtW`\,"PLO6Ugn*KWGYd_(lT.\aDCe1l<"BI-mNOI$nMBT5#d&0Z8S4k>od5P,OZ,W<%rpFf!CXOt3P-*.:/g='8dTV@),)$iig69fJKh<9AWK^Z@ju4T<]>9A]K"A!o\W7a#a#?J.-;7Cl@Zs3sr$\e`N6Lp7Fbegt5uBWZKN;KTe%KlKTH0rcDMl)']NMpTK"GVY=.A!rf;U`0kGobNbgj.\U?f;bu[^WV'99,YaAXkr2-dTWFc,1\Vd;SjPjC#17O`+oDnK[Hu#o2;lcankMb3Ip>TmQ&Y5GL/T:KPPs+/BdS9/:c\B1+CrnglQFb?+THnZJl/bTdD6,(ZF[]kKVoI3/_s%1O@h6XS2p##0R_"\G9dMCW@k]5heRodBR7unHKka9$DTR4/2N^FS0tWsT#lqbW$Dj5&eiM;D/\0d%N5fJ,`YY2o7jjLo^:r[PU=6D3A#HVW%5IoKQ6k#)N-`nnf,p4L7='$$R"+P:^*dC3KpD'B:FQiL-9%mh!a*n6q.4ZOYM^:"OD^#FV:A]MqH@q>.]M;/QX4N'?^t<3H]i,3D34>F*aHkXpl:)6+Sd[Q^Z++CeW,b:X)$WQ&L``AA,,1,SbIe,Sce",+5=VMD$f_#Nt51AS,CK_,D58%hr2L#6;uC8@k3\YHsm/1-@--7o/bG-cRM\U-g0!(/L!#fk;ojVpdMk6#Ip--GL9^kG[9>?A#ST!c969fsBh>G#CY=qekdEA#NK<^+:.D"`8`*@cZ>jr3?q#5I0a>f;mi9Gb"ja]1FD?V,H>Q$?Rq!,*aiVYen^s_I5(1UW_'`cFFm9buhYcPCMK(XLJh0JX@m_d/9&:gQT=9iCl.Aolk>823^;9pUK[&u+VFUj3EVCrj6J)ZW-)9"GT=6o2?U-$Kp=M-/3S<,d_&cR);*1:n-9%*;jW4+,#n\?^3t,(8?JqJ&o9YtJph!C^@ID>BCSM!J>>caXRLZA@-hdC2-BWfT6hNR/Q3<&V)tH5EqPYLKM@FG*NKJugUQP?JdTL3+N^d$>-/F#$-r;OJrV\?DlrQNdHUWHc#%%?4.@D>#EE7HaSC)_?E/bu<#D;n=r*%YQ/fD=M?73%TC:B[<"*9Pb_U%KKJ2'%9QQr@U7a@]@Nki]T#]h!>tXlC,"R_BYUUEc511ND:fPS!FoD;T,l4EFnB((l?KoDQ1)(ZLc+EqcXm/S>X.8?O(S.!$KuEY%FCI?h1DO-Uf%/*_]+>m?WUE1L#J*Z(cD[iFIEtU,b.`9(!!$Ca6r)Cu$!GdHl77+ppge^3qe@l)!!!"LMUiT7;#rQSil/P(l)aMj&RAJYCJJEm16n,L=[l1sM7QX'jsTYgWi5Q;"^%@KS63%!fnER'XMTaK+rq8;(K`D*&a_S)n`oR:&?oJ&[a$7N(l+d8q^L\2_!2q/ip?WBXO)*@MaY!\rJ-E9cZQ1&,iX.P+4Y=8]!'k+Oa5c0riUckU(BOS%[_mk2Mi6*JT78K*&-+t,punK6`.d78dA*uT!<=7sfs>>17I#jkhN2"K!2)*[rqbs?_X[0:+3Q8>!.\lMr:#?K83Q\!A$QIC!*"\#T6sOA33HT$._?5l!:nJALJCT>atU0(BOS%6%A^R?c:K0FECK*+TML@lfmYB_DD7Cam&Os%h&lf/d)/^C6(RTW460h\T:8a+TMKVo](usZK_l!TXagnH#^+YHG-Tl!'F4[u8G\o^oNW=o\P7oYCbSLs*`YP:'oX!W^$a%N[_\/mI4_s1Rbc!!$VQk0+]_R5fWk[-U*Z!*IrJ0>/V`>8JnsOBi+l^l2$Z3[HBlB@!07>mLE19Dcn>rZWt!_-g)_+TMKuo)&CF1@`a^+3?,&iPUGi7I&kKZuRNS!J2f+-KQ!W\>&dA'37ck?C%KL-iWCSl?sc/m-8AJY^S5T[t,*uEP.Z*?%:K`D)uS"6,+[;4BWdH9+pT9W\2!!)hc5(-U>Wm7+p,J+KeJ:+,eUIDb4oUgX/jd39r"99Q/rB>mYhK_V7+TMN*fcThG7>dOG%Va&9U"9;g:++-e+lp:[PAo[P2frWR[N48lg<.l?Bpd&/hH@(!M(BORjMn=3%qL$$$FQ<%?H[:!Kf*)/i'&rGk\84>&giKb/!=R2ZNjLqsh]K`AO^.]3BG%!!!\[8)O62`oHSCiW]BZ&UsT@-]r;JIhnBQ!s]=W/d*l'l07I4")?AaT76Y/dn_&JGjt4]_m4%YAJ^dLB"Uklq-&)K!'i+\h#JdGl-^k&]G)_[d,a8`m!8]S82gNFb=FRBq=XIT0%kXt*l)D+8G@DW:2rlq.jhU!gq!4A&jUCNZUJ<],"ejeC9`LZaG[4!s#`fFAn't=0K=F!%@-1T72rO[T8N.!2,X?DG$V#Rurhq*rl:$rqtqDPAU@#AjEpVKqc!2'VG%040h82m@fh#K\PU`0;a8W[g^6+R)I,"OWm!0\P]P_*uZ!(Due!!"?3\g[gI"osN'h#IFKJojoudL?0j6+TADMBrmd5Zh:Na4./;FS-T3`5Mq5@Y<&_Z,-5#2crPDR^$fg(^NUNJr+_GFueY#NlD1;Z#DCaLdbk+!bk1aV'+Ro5S9f].cZR:>$HD-\(g.h3?1f+h-h-"3:*bbB7IBL*iZ0?Tm/:a6bB'@/rPmK&$LG7?/^I2fYdu@*L="LV6UZC`]G$G1cU^V]6M$JDZ.&=b182[gZ==f]@PupKCOWAQ'4ue=5YCNp4<$>*VL_^[)-6LZ=7iYNDfTGOBDBj%[IT8@O"Yg\1n]MKR;YlO_AWm9O#JW)TR^;NPbrTErt?Pqg^HeY:\7)sj"_RpE;K)m./0B71t$%6+;dFLhcJj/lU>mRB\j<\0E4Dl?)Va_k+1rU',W,TMf__ILRf>_B"tZPK5WQ:P-6K6_Z3,U34D*f-k86)1/"Jnj1;7/T>u)>hZ#:VDD?kT':V@aVGo/05Z:S*dXLX;fS^.7cAt:^$$[ar'B_gRs?<[.3`Y4Q5Q8-q]-KP)Kj^,o0W9Q()YZ3)LTBC57_G]PtFo:&Oig^]'Nf$bU'0Gf&\cFP-!>rqcPfC)6'2'VlZJ."ZP>AX5qI0g4>$X6nGk^75+0bieogV\t.g=-(;ZfA'oI,YJ[>(QegtN"[pNo^lZHI@8EQCG6TBolc86gMD&2_sV;aL].0SY>O*drP;O,:U/Wm'/_7scg1.u7Js,jh&B2J&Z=6Yhb<74=+%`*nUTIKTCJY%"&\S*j);hfWU:9o@TU%rVu853Q7"Nm`K'6K(D#^G>Dm&7,_k`CaB&"\7>Vhj.F'#lgYCUCCV<`\5P:?3TXViL6%;9:cn/Rb;X[0F"K,S1I^J;?;=Uksnaj#7n^?EZGf&5&(WV0aVS9fTrN03a[Wcu?e`tVD>J&)Ckk2@'`q!ZsrirtXWeburWTEjM,>P^L4"TdU,2U&Y;'m4-F#kOc]Qc2+khnkmCo?5LF!dqe2t7Ir^q"*hpmg4!k7,Z]YWRMqco+]nQ[^F\MDWnGIUkV[q@kVAlYT)A^"+iUmiul`S!,I=;nJ'k\daQ,5LgsUUrU'Ai$"0?6>4Z['@"KOm_"[klU8FqSR,TiOf[ta7#(cAnEr=&(;!!/4R-gogcBu7Ic7ej,4BLZ/Zb0pI4H(T\!3iO4_u$/?SRh3Tg-.[LPeBM^V)3Up4\dY#s2Ae,8M#RADu_g&hXE[:RIKHd+O;7G&T=6nF>"`Zqh0NqJ1fl=H-p'Gk%<>7_3;1-PTU&7tXf]3UKS.>AVl(c&+WKob+i);n:an4MYB@E4]BcVoqtVdsi#"VFI3tksd8\UAg4e_;a%;_[%S!lb_((9/=qT-+ua&X^4-%HN-u+\bL!oGp*_l=REiPT!9\]VnKdWh;N*KXJm,nik:/F16DhYp=@&LHYO12I!-R-#Ri4g"m1$T48=cZi.k%hN1.!0CX9E80^%SG[/D(hNn-0OACSOpUq?:WPMohKR^c7]cmGaD?C@A@Vj`8o+S6BZ#2=3.0(gF\Mea70iDf9a-NOPujSKr.ti99DpIBsj1I^"X@/<2B=bAF4s>Y%ZM&6Gr6m=X>;X3YIDWnet'-$-)U&F$&+U`0:^Jojq&N!?!#Wd*9(5+gHmosn8\Xc7)e:LkEZ2nP8"OcaPR5E)E844I4C90HB6BH+WNYG388hE-s:mY53X>Pd)m]qK4XdmuDiHG3bH.s/%!].]g95-qg)r%Sdc>)f`4j5EEGljlLq>J3N'fgn&Z2IZ1/@/If(78]1,]_\i0Xn=!s0kI."7I-h-"rAUgmL$u+-F@pc"Ca*.Y(kHLCpdD$]4ll%K[F;[n$H]pp(GF%oSQ%N;4gfli$Npd1&=0kdu?%0rjL[cBOgbrl0b-\nH,iX#+]548!]U#>%n]*9`tfHIWbI]dG\'S&oV$i[qf,>.2`/dcs5.iM`6LK*p?3:\oIDA9^U&34CMsrl8c$)]r3HcG:]UJ\Fa->7W0O-Ljsa,NJUbPa%#'FbcVpeK+\QhEcG@OX,?+hTT_)u?]1?r[ksi>DGVH`AhN_CrVU3"V\VtXZg9=[k0r)JL$"^[1h^f\[kZ4mX`@QF](*6fjLsa$GZ4/S0^XG$^'?ES!@-E6O`OAIk--frXf;%F^,X]CZZE%nH8qh?&`l?j.0\r?!/_oT<#MGsfO.RH%\(Z+FLbWdLXXsb1VU'd3pIB@76>dgM:bq7'jZKpCJ;hf1h!2LqL%1C)m]R'^PWQ!ns$_o@stE7r/R-5om$!ee$R-$g6f@-haU5L3N`(HBh$[pge1*V/(?r9clUOU&G.gu5?sh&A+V:N\+=aq)r(>fm<73cIDn[r"O`3ENb-^FG,;++6LUR%l^Cfo8sUiiLXT%])82#O1Zljj.>ub#MIsUVcMgplFe8Gp]O6tSFAiOp%0.).\u@GRAebS>inDIt[<^?[BM$,Xp9Tm!8o1p>_m/Y/@BZlXlh0sqqs<0grQg,QKuS*%F<`X=;OPV9dE?4%kFM)o=7LAW_MQ7bYP7Bop6uan4PcrCls%smp=nn3X3Y=bXp[rTjrTQKpY]V#F+)J2,3)E_A)r$(h,7dnNNUebC0$*MXm%StV5G8>JXYCNbp#(OD`:$FAiOp%0.).\u@I(dnM%b[=$O-N-&!/5_3V@3kNFk3H?))/T-oM]tMt\DRH;'5[.g2dAJ*>]aIDX\l!sOp#`4?o18l1TPd[IQt-%o@XZ^bd>(a"rEXZ91%f*mpDH#XI.1mP52CI9WRkJ;N_1NO&%bd;LNI$V.e1hO/Q8kCu0_5JDl)D+Rcf:CUK1_pC'D7\sAVnZiIN-+)]J"k1e>^0pXhKNKndu?9tf-gGnGLTMhV'T%.VR97[.&/PoS*YU//4PpKh,FO*9drUl!)Ng_VTP-pDDE0l9;WZ126K\oQ?TpBEhs^be98UU;Tb_qdaO2\>;Bi?b@5RZF_0@l[D([=g,&1=/AB>fdF"`&"aL/<)6H*Y(^G,_[G\E:NTi;rNJ!F:@qMO+;NPbrTErt?Ppu[W[*3^dP3Jho^"L&.1!5c!N$0YscJ^<;h5F,3?8OHZ&Y-fn1Y'(fR`)2t@AKCP>pQIE2rXutUaN#Yo\/T$h>4n`gC);pVE\Ra.EKYIp$!fbSn(WVlM8F_WF='!X2!q%q@+Y)Ql5.c'VlZJ."ZP>AW!B)F\R/U@-Th$[DABU.8-NWUBtemhNQ&aVK?dT\pC@,\W]$-MKE??Umk8DD?-=8dS5uUP&;K6KZ!!)RqHJ`aQRDA1>NeL`8%nK7@VuYfW$n*4&ZnIhbN-;CL:k,Mt((jWuGW6U[mgU]V12.aIIE8JE'>,RGXgI@)Vf]3SGKm$CE=eMpE+!"I(?,sP&@WA9E"\fj/BH^HeYc!2'VG9pIFOKS>3t\DQJjN&HO@k"P@Mj,2BY]0Xiuo6K`C/PfmA1r=!3H=c>1(lKa[>ePiWe58!t5tmGZ`"P/BJpP$fQaT\[\Qp@nc[lotZ=L+*['Fe;N\K`.eF,uPI!e?,O/[#lITLs[Oe<6#cg#+G4(UuB$2oBG-fSBSWtGdkHM9uiAk'?\"mH3kMBL_SRCqcR[,`.jXY,C2hq&d-jLHD!P&:od;P$pY4*._\>CC`u1`bU^JXE9"D20&\O/t=s,db5B*?;,h\[!uNXkqL^mYXM47u0abNW*D!rK.<]U304"41O+o&.KDF1a!W.1qJ%?@aVF7C>;1aZ?2l(:i1oWb^7bR]o_jd*36Z"X'P`UA'e0:i2JS6Y&olSIb3EqZo0m!pS8)c?#I8oZku=mAk'?\"mMm^N("B\9g"Sgb5,*NQ\s^',T$eT_di"O47P?FY@fC+%0hEHZ!\cioJERuJTQNU&SIS@39p5CJcU?`\nLXkrA6%MZXl8>L849(E%KrANs,Vg:M3G]=?I-3oBQS#,"qreHMNJ7]2O3=-2e,W)2lH*SJ`IV,iWT$UG^U(l)#.0SSm/.a5$)`Qcnc83ZS]c?/ordI-p@,iSH']fG=98AX+J0KZiO[X:$tWHQ+OE9<,rDY4c1ogDLM4QM5ZIrS`FQe`q:f&s5<2+,hK#mWQ(o*?EG?:r8CTl8P5A9?%cKg;KBS(R5)CO_t.!-:,3l7HLD9G^:/(6C\LNBHYXfmM0JrdS2]`BQ3WWmCGQ0KCRK$6[M)u@GXEm`:X?PMd/b]M.LhOWSpC[\_:q$K)P*,=:`nU]=IPk_/n4)mZ4Bk&@`X\O[,7h=7,ZQ,Sk@oL+S^G;AQLc):>NLhcupY;gDGVY>D#6!.[Y&DG!ckksjlsUukNO>L&@G(hBleksh6B7dJdTVP%)\R0;%3U!4CLh=J'gTVtSSF]4p[V:"7@frS4sC*4hkK*tP_>D&C#eCcnsQ$7m_1t'Ve+l*,`/L0)9U0?$*2NORnBjjA[R5QS@>,3*Io#;QnBGl=b:Oh;6`6Z,(;:L=1cfHE8#.enQTi[[dLe,ap4XIT4j7/qt*)`7,k>_?G"*dZe8Rn]=NMZ[+HE8cdgPfE4(#bkAiR']tX4(fPkGP8nPXH591/%h2V=I5!!SCqoaR^Na]Kch,_>iOJRt^-HU3q,]7[IgT:'K]>Irn#nM>TlsT)f`'aW$Y>8Nc^eq<1I-mZ"?;Y[])poa,+/ZcZJ9k:'+=c6UIf1j;4!!k,U+SZMXE=.4`M$`W`Ro%00#qA/2]g68o)$JWQQK)^&[gD#J&LUFg?e+#Ibn,W=N3Ga&'*2[`9FS^m:(^!?=+nj]G/pS*&cXlojAij%qb?:[O$tA;-SMmU)ugIm6L(0\g)e*XI\-0*7g1%n8OsZ3lJYbeJlkrOSG2(leQM*iU_1N]"D1$eFO:YrpoGQd+iWAhGj1[<.j]3+Ak2jOp1p$$Nqd9%)TGGJ+WG%Q:a*k,p*"[9KERJDKPCL'0*bs,E=4,^[MD6B%`@],d2F/5ks#autFSeY=>7\2075l5e`oCRqqmUFp&"mV[#\>LPNVk00Xg<;3(dX21eXI]_nPH.fAOmp<+1U`0;a8W[g^;3gAm&5?9oC9N<3'_1+U0:\#Dj0U4oXfZ=?eZ-,aN^efIAuXD&[Yl^rC=XZN7q\>luZaBW;g(?;4NY9QePNtkV0I'ccI)NMi*>0j^E6H?D-H-*niB82mYgRqTTqIrj<_S1^/9_*74g2tj&J?c:KL<;X>Ug>;+<\$joCSGM-#QOlioA=_RnlCFqn&9#6N*+3ZN6bKUgN'jPX?MpAEW]d-R-Dn8LV!b!.Bc[[-h))'/1T8^&5oe*D]@5jW0>Vo#\b"3kMmQUTe/t@`M0dZ3SAqi!'"^:O_E5?H$P=_\2DoVlOjI7GE1h@X'6_":g5l[.l?n>#m<3j-8"_&fD?'Y`6+SL6'r2eVFm.]NaK+$Ku$gC,X\m,^7Lu6hqY5YYS$eB@MWH8ZkokaoelO,jFmg$rT*Rc'cBq6F$R/M-X;hKVo]mZ7'>.c*%Y0BB%[Upo$9O7X21jqT;GU.W$NTH@HSIp@Ap0ru_N`caM3%CY"()+Soo'!HMV3e/uP2iqO`!cg*U+o;UL"i+D9m%/kq^_If4HJ[&J1#bklbu:a7Rr0f$%Dh]#j?j&Y/g!k3enc@Pj/=8WWOfBd@'c7@&Whe"$)6A)q.aaiB^ZlK)d/NRku^8H65H_jGEO;s$%7H&6aa@TQd]rmpqRS#`[`FJDSKh4Nj^&3JJ.:*!hiqo,qQh=PpBC4t&pGKQBI:(>7oM%gXU(<.0JWG'KuVrVCO6B$#]`bdRm0A;WD;F+Xf\Ioe=X"caZ>p/$AI[QTMSe88S,H8T2ThQR\riEB\YG=5Dnna)'ZURJE!)Uj02l3I5FQ7&A3h6bIbNX,[)XS$Rg0f:O5M#/GCjHu`VU.J'`>Pf,T:'>Oq1&A>G^kI,-r*24CAI:HX'(qo&S@YMPB*Z7Zi];b!edi8U0sSEZ'E?Dkkl6+sn79>paUSTLZs2+"kTJ6GFR.7FuIS(r!B,0Y9:`tWA-\2EreG)DE"8fZb/N@+o4@pRp(?E^QUkNs>Wc$M!uK=9XeTCGqu>6L76ZURJE!)Uj02l3IqFJJF3iqgG%[1/F>8S689QA?=ri#Ib)>eXXcRQ^P9:2QQA(0[WTduE)A@rZ.Y)mp)k<.Q(2b'ijE.-20>eN3LBT+5doM'c]A!,$/GAS/L.6ZMJNk8(O+LTONh>-e[/Fsu(FCtK:oQ4TUGL?&0BCsB3,551X'YC_9[B-C^8N0bUPE'ak7S#H<:s2BgV5WBq'2]!YFD$#G]dV\^$Ds\])Bmo:5V45:PbO&aNF5I6b@3<58kCsOlG2]717)<;I6>13Y[D)/F;=&[^F7p&1s;:IdnO(a0TTehB"Z&]C$O>rm7kt@a"eu,>Ck>&)gu2),&nk!+>a_4TBUUOQ)[0(JtfhYkL'Fkufl^].F6,;t/kM$tUP%)a9O5XJoc7-[0j?jQ`4:dG.,J-?[,THHg!3s_2^EOpEM&^R3a]2fpkMOYG]d[>qVp6R[jd<7E;7QW*f4qtRMgq8s:2hO);1N;QhYp]Zq"10W:F719U0(6KLY%3sp?L%@%HX/.aQ^=MlHX8hLZE_DX]pip3KaV'IUGfK)2bg=eC5_+,n"ujN2ZU(RO`$]QicLs)4BL$V@r*l#Zf\Hgf.,SnkA*%nkBeo=k\I&P#G.G*PMbZ+X"1YcN)!ST46X>tl;$,[\k/i9];ZIIip%IqZZp_l;X]5o/un'qFJD&Fdj@%LBPXJZWIHT=8Z(U!:IOQ9=&3o]s1&sZKXh_btQs':u&BX9U^F2pUT'f\u?QnLrR>mQ4ELi\e+rpUj%ft/_EZX=-tb2Wip#[F[N;X-ipce.#(R_o=,TGL`7^S!mb(^3,fP\l>;T@X<%,S8N(r6l$(Yjd]%UbDYaG;BVVJOjg9V+-<[C8/(IfM?OB;eqXf&CIo'u^l)(>\*`har:`h2%8>jH8q.ua,9]tuanWXXp)n0)E<4^IY"r7_PaY(!%NF1qJUV3Ok69^)]qadll2+]`PFbts"rQd#-b\'i8Ej8^ra!YqZd'3GY.JS-Mh38?&f(902jB*\"SLbNaq*Hg$cA%+nP7;-Sm[/n2./K[qlDbGN[35+u])FtD^G>Vra^.a8cT]dHcVCEgf\(X5O`[mQXf%7u!!"'+\oFH+dS26sra;SL2!`gd\e-Ob:sAp[d844)?I(T@iBXMM5Jl^6N=aF%Q!gEA0DU_T7<f$l@=ur@)t=h$gFKr;>CpMl/YsK;Lc6_'p2MHNLu/>dYs-uFVD[+VLFqXVA':F2SEehOA;DW<$U3!!'GjTj+Mp29a?n4[;<"-b@XD$]I>6DbLKk#:b0$0gLWgldIW&inTFK82l'[k^,A?Z5oCo$$6gE`X1'&!45&'!ITQBKC24?EIr97!,[g8!$(S06Vf5T?L<@'WU',a'HrT*9ABaGF_I3#:tD$k>`NnZf$4s+P9o17";`$qDP)aB3O<2j(%=m2'7`PcMo_b]%A\&fHZ#pIBuD;t7,552Bs68p*JF6uFtFVE\sA10LY/XiWei.uTT"oZ-%hp5)n$U*2IXZu4HfTC(QU[(eg\4K';WT2*q:2RcAWMrH^qA>3+&s7N5[jlffE4-TY3Cq*O.T-QINFQ3Mg"p!@"h#MI7Y?7u+.]:2LNc4'nJE)c"\X\SrZe>Ugc+=(5"1;%UmW-9]/M`nu!p3_0<0A.0eLGjn#tu&5JPajBqbTPWAEp3#KG+OT%4(8BBAsp-a!Tm`@j]*e5WP;fhH8ZB0;L"]h"Y84Dg\"qrdZub?$Om#)l+E#82gOq#3c?=2_"/(M,o$I*)pCp_80e9d(?[*EGoblh+q7NK1IC/MtZiTlQIZ6f[Tm:s"+dRb$P;S8q/f7mdE)PBg!>Ng);qPXXW4RrDqJq=),QBU4*1/$&<#qBOj*&T7[DDjil/9CO3Q(:HgfTb4p:a)CVLOiITG`l,0+aNs"5-Edf4BI_p-.-%q>+F*'T?ho*)&INho)4:bfaaV^BC=S4+;8`u4j#MD^Hp"M14IWFo7o'X#oEd^`/=UOsZ;iJ@.EP,R<\9\f.ukYhX.OI,ER)RG1FQ-s1"H7CJ@gSYirnTN!88RO!.)4*,l16M'(J3nX/!=^"*]&CbW0Zf=K3dDjMRjOrMW21W3s"N$)e1-m[7qeN4`"@W]))Tn+mNc)D=Ao;"l@:o-J$^V:9K1Y0hH&q`!$+>9EIr97!,[g8J5rM:Z#!,EoZE0tD3%r'e0Zu^6o#Ld>hM!S1IVH9a_5;77uhcX7sIF')Kp!WKKBoM8=^Vj3d^s)P'&9(?La4f'Pc0V.q=6[&X]$#2VYWEIr97!,[g8J@1ql'9;6eKS`3NV7al#Q#`^iaqfU-A,:L_`hVW`O9po)UElT4q9273=@hT^gA5O;5su3_k4M6o8$%R%VoJQ@q+SM!9Vlh+ab5*EK;kS-/%N032Ou<5nqBDM16WXs:F^olU-E$J-Kt`k6+V&fF9;M[OD]TV>r+':Wl;IA'ZLkGi_<(mFVCq8+9Bc=Q`W78hMR:(9d(dN[V[nA#cI`.[5QY&4F1PM1c:r"p4B/3gk(RGU7NAp1l%A_"!.n)q)_4sO[:69>nTFKeX6URQ+4s=*(pbq"l`*F1$nMS/S/#[?f&PjGb[dU?VGG2lkGKH#^/q4st5[4q5;C82j;*D?-==dL?2l,=jagODY&k%FP[c^`uB/:69>nTFKnTFKnTFKnTFKla!3Bh/)o.M*2aAmh)ZX!d82l&@O`#\M82gOQSrmmj59en`XcRE#?p,aj!.I>I!EpZ&!5NnM\cM_bF9Am:\cI?SN-#0s&a9L5KldCslP\pkn0??jcjK"A!7isS%H'aP)k[qo%03JBU`7+182idaU`0;9cU^!F+-CGk<_,.LYb$tp!'_[`!3M?#!+7r7h#Mml\cGusl/oj:$U4dpX?SrGd>pgWJFAS;J6$3l!le%8Jr8Y9DIf%Ikr6O1_&\q+Y?]+oc%-[rr@-cgkMrGZFq<+B^I3JXk3(:CZ!8&LO!!%D%F9;NI7CiL"p^ZNm!+:_,!s%g2dL?2l(?l#'i&d_R!.ZZL%041f82gMK>GN2GN2GN2%V5PaB(:Y\-"!!&IpR=-<0pi$3+Df20l!5KUlB&AEoo,n#&+)[\n!!$Uqpq[KB?d6\IC!='fJ9C;4Z"'X72WaVka$9R.gSY5UJ;mq8ns@q2k2cR?o#i]B5!&apRssmc?eEZ6q<`*Mlh7:Y!+>9fl-n4;EVNiM!:W_ShD`Zg!<@A:S:+o4\7(F;!5LP1I7=2:Y:,Z.qM^nIXlf?A!!'79mskB71>5Dt:V2$-!2027s8:4C")jQqRQ>fhm#QVf,I^GOF^KXs[G1^H!SI;&c[P$M-NmBb/mLB:q=s!2h*)XRroS.u`pJ8HJBNE?lX0Z'J=Z`9TDrp.+".,9T7-F$gRf%-(YuZFbO'eMJBMK7a_%mZ$D:gRHMWDm)o0@%](t*qrEH`q/HE!LlbEF7dLG\?,McVX-D?,_Bh#Jdt)aGV'!*5m7^uIsEJ-kHEO@V<\($Pql3787D6Fm1CdLBSQ\cFpRF9@nlD?,N8"'C\'!08A\!%+K\5U,"aHU`2QCh#LKO)o1K)2h25!#*;A7J/.;Qn2Si*?p_F*,gm-07CiL^NcYAjODY&TF9>X-D?,_Bh#Jdt)aGV'!*5m7^uIsEJ-kHEO@V<\($Pql3787D6Fm1CdLBSQ\cFpRF9@nlD?,N8"'C\'!08A\!%+K\5U,"aHU`2QCh#LKO)o1K)2h25!#*;A7J/.;Qn2Si*?p_F*,gm-07CiL^NcYAjODY&TF9>X-D?,_Bh#Jdt)aGV'!*5m7^uIsEJ-kHEO@V<\($Pql3787D6Fm1C?`0CgA7=8E`;"SZR$MrqenU%8.2n3-;Id+<`SL-@B9@'3O7R;$ad-`&j%1U7Y?YgI^Jg<<_dL@>p2r0:[&rut+CR*#e5C,bo_JCq>NTUt;c9Jlj82l(>XfHOgY'7Qh=o#sG^Z(T%j8-1$h+MDDO_t/u$dqa7;0'dp6>OPLTiNc2pDTML6m@8Opi*?9Eq_"B<2e?3E'c\9iIKq17s$Rnd9^E2*tNMnd9T&L!BdLmd`klb.2:3I/magk;MrS^CQW9S2V;BYVd)@['lj!%iVKCWo11fje/deN1-+^pl.e^Q[m-TY2ZULf$dqa3UhCk>?-D&>L[1;Pc6M-F''[F5>lTU,h#Qp_dZ+!`DE<_u"%_`*h.00d6m@n0aJKUHaL"pD.">@C,cu8Af4rEaSG6qVOf0$rZWKr,<%/T@[E=@3_H"NA:Zf\1#pgE#cSV^OM0N!L$DjiKp]U,m9]esPnRQ0L37?\+*K29(Yu5I;qi/kj-Si[)=?I36N(!N_U;Q4p]Mcu<2ooYc=u[Fej1WJW62f1YPDNJNl+3B;P[j6JqRDYYCj9nC0j`"8C`h:+82l(>Xcmj*eZJuM#HtWGJeX-":pBL7[+-/g)Q&NB/n75+O2N_r4(*2fbN692c`d7U9I7(RH4Dt+nS)Ee3HKER-?H.(3A1KO"5@fGH)"op;X2-0YeA&-N?epM,SYR3[f+*)+rSq&VV4@=q_/QTfJdb+YJ]<*W:SAhKP/Wk&LsuqS<+=7k_.Y[P)`GF%%POB`C/##dH^B$\ihG*j*/t->lG9m33c2lWGT>rPOLcRjW1ReAiImbjA_/a.OfAOneoXh'GIj2(h!DcTaSLDsUKMQ)_O8ofa:BUP-"aI3>Ol^=LIAX(0OFXk`OsmDhtg)IG(bY!Ib6D)e,iB#[pHXPH=V!BdLmdS2!c,SFV<.p$U4@3%niT.F0p9hikT'lE<&U;i9e1jQ.q,(emk.=$t6q&l%9Y/UQa37s%.GQ"o?[5On6B>U^DIq.85r,LR#DF[s$J'sQH?VH(2>-;$-AW:kWJ#*iA+6@?.peM!0ZO]n%(WcTTDkTBT1ELTla`jDbSooHQMO89=9R!>pED#4lZItc!B[#Vs$.:)o1LF+PjE!m:^!i,d#LS\.j\X3Va7=5QCD]euKj4+E\g_Us%aseaM1G`KdA]@D.4U0L4Ch8"I71*33G59;uLrcrp(jWLmLC33_[@]Vgj/!/Yf-1u.l?CLT7?9BW]>THkb5C$sqUJM_0G$",N.r];c.+r.<Q7K(;%YP>^_IF)&Bg(]p^8N1t1N"]nWh:/eHFb5a/rpse_R%K?'.r#tSRr6/m_IHaI*;Y#IFj'$>aP^7EW\4>th?u[3OSmQZ45)82iCdX!eOB5OT%0ag"C5B[cS4A5KbD)UG'=PW7(\_,)RBiQ%4&,gm,EO`%8-Mhq4\X:=f-nK%_-C+Ydqk8Me%>bHR/TM>.+jg+a/9DP*qO3hH&U*GX2Fs8lZFHn:UCP1Y]I8Mlp+[U`X2ISY\PF8*ZD,R8E>l+"F*)psXfIC2m0-K'N*_3dr;9'XMW`M--IcX2`MNs\t1aU"6DmWTfAQ-U@45UFCrO##+*,>YPSM7/jS]m@OiMDg07HU$YlSj6gk&<9*9W8pK:?^;+nc.U$]iE7=7(tpt!@6*Qq$,rL&upHcPcm1)DU%MKgGrKjapY`ejEpC6bVoFdR'Baa?*2*7qYX(^qnE!\6S>IRUh&dcT@BX]1sq3O?#:2qDKqm;t-H=hfP^hSI&^fi#5%YWblXRr,P)5gIi<<34Xpn[,r&LoaRdZ^Iqu+Pd#=8%NCqVKLb?*A$k4h(0Dsj%[?d7L^)I&[K2tX0hY#*,8D='2tU)aWEqNTc%\cFpRFJI=:9FE;ljQ)[JIaG.@)i`Pmb+U[d2n%Cm(>>tKC\?:X=-.;"M0,NApBXUi].'UL[9E$,2o`,c[HQ_=kl9!.qPf-&m#GOI3(:osmF8Jr(sWVX"iT7bUn?;R.UKSfIh+&D"g+C`r,VjtieP^uIsE;CkaRm9bhr't(6=0aC57b6U%$79PapYr4K]:WLM`-N@g3HgT/b%&bDOUS1lAr'5s.XdI?MY>Z`enOfZojegW]T!-9A11&Y)>WS(4KhA''`:X#ge4`j4fd8\S)aGV'e=,";<$u/o5047+2=L1\T/EO%QZ,2]-_nXI/lsGJ-8KmV.N*EpOXju)Z]i@;+^ZXpdTJS519:+6e\=826NY1>N^\9#P=]c3Cq^`(T9S*]6iou_\29o-GQA_Do]EInKjld-c)24Hq-"5&W&q9oL'$W#QoI%pTOXs[>X'gm4NPc#82l(>O`"og/IY%[WFV@H8McAi84S$_RQn+E[A2;8@q[hAa@sM[H#\6_Aod]L@Ns/<;9+q:QbFE'Y?j2eUuK:G>XmL(RE5UNl_e<']uEgAp6X'p35*\KpiRe7T?g2e.qUhDd+1ukZs]glgpOs[82l&e\u?PkN#\$nH5-j"F'QYBli[gDj/8-ohB)#!pY;nV-,h;`pd]CR!:be9cYtU0:cV+Wr,308u*V?>4`3N%3UdNZ5%?c(fQmDU_t&b"Ig7rFmI5@Hpr^T$%9KZ8Xls!F@FYZa=R%b.qC8D*:_nj_ngG8bd\HS=kn$Q+,\!1BkTIG/>hI9f>2^/'F6R%JCI/WKk+1(jAt]0`f9lXW5%^/AWXb)f!knQ0>GfCaVU=!nRnIB[gVP'MDE>8"[\maamq@\-;0-VtaYn:'(6Er)FL;cKneH'g[0:g*5B!((9Dr`1l%3UdN!%ZJ,i,PP3^k?e38>I3?MKArF*9dY]+l*,2km"@9h#JKd\cGJq2h4<-!N\gNJB*di!#*ci+H^OA/(+mbEMOPhKQI;eU`7+,F9?b-klrgbh#J)P#-]<-!$4YA!DH$CJ4-sLX@P:#a,t6>'@I=4O_t.LdLG,SU`7+&F9>(0)o.>Q"*bgM"u%4V!#"N#YThm'*_3dB9Lq*m7(NE#82l(>O_t.4dL@=]D?)38%H)6%)o.,K"%]4,^l!49GT>rP0Ho6P''TV),2E5?8%J^p82l&e\cJm'2h8r2D?(?u%3UdN!%ZJ,i,PP3^k?e38>I3?MKArF*9dY]+l*,2km"@9h#JKd\cGJq2h4<-!N\gNJB*di!#*ci+H^OA/(+mbEMOPhKQI;eU`7+,F9?b-klrgbh#J)P#-]<-!$4YA!DH$CJ4-sLX@P:#a,t6>'@I=4O_t.LdLG,SU`7+&F9>(0)o.>Q"*bgM"u%4V!#"N#YThm'*_3dB9Lq*m7(NE#82l(>O_t.4dL@=]D?)38%H)6%)o.,K"%]4,^l!49GT>rP0Ho6P''TV),2E5?8%J^p82l&e\cJm'2h8r2D?(?u%3UdN!%ZJ,i,PP3^k?e38>I3?MKArF*9dY]+l*,2km"@9h#JKd\cGJq2h4<-!N\gNJB*di!#*ci+H^OA/(+mbEMOPhKQI;eU`7+,F9?b-klrgbh#J)P#-]<-!$4YA!DH$CJ4-sLX@P:#a,t6>'@I=4O_t.LdLG,SU`7+&F9>&hh-@O5kuRj'82l(>a`JaGEc-A1!+,3ETDk's"+8Qg2ZTpM2h5P_F9B=3F9DI7\%fTWDb-eTVbWfZpu@Fk4qZ:mrUnc[rrWF4n*g8Dn(dnq5b5E*SN_JUmB](607NF!\,URP5i'D;(VfR4msP-1kAHmt!!#cN.p!pWE;M0d!1lQh!GN2GN2q!75H[rSRW,]5Oe&#l0\QJ,fC`T-F=99n)rfT=4c7Y#Hm]I?":-GPpML5A>1upud/+B=CYJ!.ZD'J,T&&,=ehBc&)HLIe]gjqPS5'+9927EqYK0ZoNR2[+f3u!.^%eZZ#j%+9'+DZNC3;kqE)-02:%(q;;56?iJ%3;Zd$8L3<3Lm'o'$ntb$<"orVqmskB76mD.A__09p!cdY`3Od11%NDis#K+l*G;=a3CS^VqaH\!!&=)lddZJJ8/]O!!%,IZa9K3@UW]]mF)(9?l=l\MgtMWJ,!:Y*B*tohu)Uq56HB.Zd1l9r8bt`J+=t:o)AOT]6u=$MVnI5pMPIK@9rZi07W6[+$9DclIDqbU:GI7RbR!,^LB$KQP"0"%fsJkDh%Xg[m-Uk0&3sV_sK[3!:/64Ie"/]56\_h)fu_WL8$(tMKI=482h5O=c7BS:*SLj']hrLDRpJFL8$)3O`&N;U`52c>Ue)q=!HHs'P/lE%6B>f6W''u7Cq_UU`52cX@9]d-]r9pMK5Oa2dM8^6W')U82o`XdLAWBXq^,t/!4]tMR"#^#+\/nTd\'K,2I>edLAWBefrqCP=RVH7Cc,3*Z''Y.F-s):Je!3H_'Lc/_FG!=4h,"gI8s+#&''Y.F-u4r_cq1#PMP=?)dS3deh,"es/^b(hM0)*^PUf26kt7`jMP@1@\j7^+DCCB_V+DU:tN)iC@p.FLpl,2H'0AM)=>3f.rG;3WS"]'2h_)iCAk7Ckc4O_uS)Ehu;c?&_h)fu_WL8$(tMKI=482h5O=c7BS:*SLj']hrLDRpJFL8$)3O`&N;U`52c>Ue)q=!HHs'P/lE%6B>f6W''u7Cq_UU`52cX@9]d-]r9pMK5Oa2dM8^6W')U82o`XdLAWjTeb`Kdhcqn^3K8?op`+V9P96)e!9j&DJ#s@Z"$^2a(!$QbuV;F0?hICrn`VbDn(8)']kZ*h4Tu0So2i?(Iqe*B0Jko\]pVMMkf0YD0G?)lXrjfX_RM)U7scD-q`K'J_>`1>sFqk'^;JFq*!P-0r?G*[3;.`SjFo?,*W`>1!clN%UDVghS*NPT^q#b9,[LMRPIPTpZa`sr9V7D^5a*2GD.$fq*IPTb2dLA7Zn*0!!ZbKA%^uIT#m+d9]%F-UX.ZYSc=/+1$hW"CbG-]EIiW_IHb.;?1DVY8`Gh+)5'gLC3qT3u^/r2`Km4YQY5DbZ=8u*DJOPeM]kf$cc,@uM%A<%2RhE^J`l$61^VLAJ>Q^+$(*`b(&7-)()T5O(Brjm>'mST5%O7p2719HFUKC7[lFOPHpZD-uIIu193V]GPK?;\.f)f-8Vr$sMR:Ujn'\nP/YdZ&l'h4TsZSSi$T(,lYu'ogckr5*cLa5?k_;$,_]]/D+Ejn1D%jrEX*:o#%K(?q\Hq)[=G6lZ-9;t?BO%SloJVAUIVj,Zf#TUB;;PY7RP--A\gJfKEF6)FA#'LH0qtbJ"eT]reSkG[qD6jYAD&rKBntB,l."%ocT\ZQHZ[N,PNQ;2C3j@ee[H$g\aQGOY4\,$OO$:&EdYDbJH@felDN5bu3jc9mK=`KU;VFOs@5md66>*n)sQ\Y2LBBBks*HtV])g%7HdnO:h;<\s]=.'MTEnN3-mELg(_;;"-ZsHkmr;:$jm44;^05TN#o_=Fop?pW2cLJfYo09_@nti\%8)o@8*^2\JG?t-m,?MX-qY?AgfB>#;BBQHO2;T)a%t=$>a>:"_\msr$opA,8*.R?rl#u:dlW]Uho^QR,(VVXFr,R)Qi7V?2?$6Yd-/u,Pb[,41g,:NPEJCB/m>W2g2E`KFh<9dCMA);@q8d/kdWA(9ja-!U=7l)Ho(HiXk&7Bc]uZ$'q:jL7ianNZK:>DNZ+$o$5.#h:@o#R;4SdF7T=oXFj#2+*pr!\lE*GMgBtIC97$rDepeC;5QfZW""EUh6"G\Y-+qrJp8kVH#u0?*29WKi3odrSm8%Y+EOT)IBtrT)$Uc^m=cROs"to1/AfD/g%A=4?hdjK/,4GX_Uo`1GXDrIK20IUfsID7WSOe\bJ,fcC_Ym)&-JYC,@gC]$upXqp9!/,;6^*&#VgJK[1hlrF@hSMK%eXuW04i4sO5K`qrlq6]=YSVkBU76.qD>[1sRM`0':/:RKI;a&1aB6q"IkdTGckWcYc0Yd"cUN4kS;,9GS!pU;?Dso.#2[uTF3Bt:SWDVteK\4*&_L0NqiCpZHeVs/,P'(JmFBP-s)qo?j)c\!PPf!_@.A02s7h[Q!RF9=!JPk`kH#eBo?(T`\l]C?kMZ7[c6<%W"$DE(05O\pWB;1%D=#!Td5TeCK'*1Z%Z=Z(8&tHWa4.DU:th:,dMaqFXVnkl9;;?[?L'%c",B^ij,edJ2Mip+9k),M#Y[:lfYbm:VCfd2NIO)tnZ\BTG2qnWh-*h_Le=9908K-KmO4MtcR_`HoaTe.8I-BPAiK[`t,-daLi*^YJ>:?CSPTb+$^A@CgHZb,F,r'Z\usQokY`;;.aIc8M+u\$i+rfr78RP?D7/?>J1_(4f6FU3-n//[G2HVHrK:7\]d59@,UUpVHBPkOZ[\R4,q%ddMMY+.qQ;MGk^+N,MrBrZsoMB`#n/*g7cHcGGE-?#hg:@C#%,7J!J<;FOQM&SSgp#c"lobP`7uVG4#tB=(iYF[e%_@io`Jt)q^3>g+Ac3JZ\JbHh`/`h>7D2T%gT^Da860*dVRr1#V9[An7R4Vb`:1I1L07g,HCLDs+&)/.64%JnRSkhK;fSI;;*)mH]\D4M'pZ4aMp?M4@R`l@=-XZT7,uHG\AST^:Oc(HW0IfJfN-lS$?ILQl8i;6&'nNB#acLULqNMg-t#L7]C4T7Zo/4Kqu&-:>D^488-qpe[U^X7WH$@u&.Qd_$3o^EB"u8pL6AXaOV(:k&Mbs1?cCcLB2N8@%o`D$qiQI2plue>'\_UZ,EUVi+`>;W%K6gVf#FSWYs'?f+o_`A%OXQ+eJh\e0F(g\-]LdhpdtYjJE`E+$#2=$A+^%6DV_l/pC2[q/IIB9V&Hu&TUa*IUA/\C`CI=0B?%1bXr2agHVpk7MFf@,^mD*Ip2BY\PsY=Ekak_VfbT"Sdc,C87o47f2G^L&$jqu'.Rq.KH9pt@ll/N)II4Lnu)^H\r`U#\/*O]7])/Mr(9^m5-j?XgT[Y1XO3n\d[N\:kt8Zb2ZrO"_on_u"0s4h*.'Rog=uLbbLYgkX(m.#B$8$m#Hl<#!B$ln$Rk7`pDCq[]mf@tSqi%=%I\01@J+^eS&\GtlCA3TGs>N5pEjRQ9$:-D.#$!5`]L.k8rI3=1ST,2BrKIJo";7k-4bA!5e'q1XT*$MIVuLGfqE_?TVko*gu\bpf!=mb`9XaPIsonr87.F_RjMF4hu$IP6'(Hfk[]R4So/(`R8T58rEa,/o>[r'"&EbdPj1X8e@>&>PRN_PXuC@9D(e\G5.,Oqgo5B')9"Ras9@g,\[4>#r_hVI5&I$Lp<`QZQKhCbN(IcfBRuM:L0]dFrCT8>g1,/N^TeAtnEQ@G+%/6'F7Da?Adp-ZDY2K?e6WkIodhE!]k;764cd\U\T.:"-]_r2"81k)jnu)ZoE1[<0A\WemnPVqd9#kV1ZEi7k#.'*2;K+-Gcn]hiN_"qRs"N/oAl?%S9GW,1H";bYKY*jB8Ru*fdY\Acd%b\1kV-^M8fDkm!^>hfPW3A@$'8Eh[YE#+7E*Qe)_j`dp9!ChfsbPANAfjsr^9LD^WkI]Y[&9u'klZjjl`Nmp"_#SJOiF3:RIUCX+''nI&ftglYjVpqr5/>eCZ02g)dL_QTIbtVp"brFeRHh27?Xf5l9l4%q2&4(;%01^1YL07Cq_Ur_5?JM?1#B3](tX[,m9!hVHmd3'CH`33(9N0mE'LMabDR<0)0RJ'kJIS+3_/]'0lh4)ZncrJYFO#"MiSSp,ZD-bFLhk*"!O1ST0pJ9q)nMcpo96gU%`09W*^BA%C5mH*S%7b_b6ZQOHXFnhWLO_NC3\+L&(L\f6N:Ba*>.C@`jePtKP)/G>](WXucRr$qU]p;AOX*[A/FOOi?=W\CC#+ai4FJFSH*]6?uZm0O"iV%]W^1mFmH]'dkk>?)k:Mkj3]r%&"*c3GDI6RX`m6bP=G-rLi[$hTV4rRqB3V!"_gR]+]_>/mL1$_O&/WFaD!?W[h`_nkCA;_=JVo^rt@D6X[f@_TQcKDsZ\Q_&*EgKR_851b$*[=)-6^[ihU"]':)?"3$S?"\)t(5;U:gC<#OPB9Ei.`C-[7N=Rl5@Tu?,f)VnN\mr*\6[ql)$!,2r1E,:p"MF<*_"^>$YPZ32F%6$]SI*[09bqWirR;>Za8K.jt:1pdXLHgBt\V/I0&HG]uF092@JO/2Qp0SJ3Fe:eto:Gj#>&XSg_9qHT`G)j*ab4X>JsUNG2_1h*)).W9BK?]W)Z:@6MiSdhfcQ1WLWR$R`;)4\/#FAm#:XIe":+?ar?oeWL8?Tg7Bo'"J20D)q_?`kRNnl"h#^$uZn(N2IGX\`cGY1dp\Ap*QuSo+b^5Ip6nqlf&*MfaSHno)+e^U68qr4O:ckWLdZVplKW^7D*:EupjPpB'Q@jDnb6*4=hbUDGQ/Iqc%Lq(H=B_Y1uadX&JZ2,0&fEj:(&[S-M?n):ZFon`O&S3<[Hj0,&Y4Uk9Cj1"(X,O;p[[^Bq_d2VK(#.(CF[;.<>?QX%sh-03pNS7+56[L-0riFV?5B65eh7';reWDsbACFFo1=_qk)`arf4inMLg"nuTJbk*nmF08'7+`qHn!141Xdd+rDHaIDe].2JlEDSBF(ap&l*jh<;icC]77/_Y'?A]Qh<7RQnP$#3Bm?N/XShJY=nuq"/u>&HY2.n0e4?Xla#LY+I;R:]/J,0ITH)\C2`kZYk1d3+Ap*QuEQp=UWqBY[DU:uS9fJ25?cmPq*3Q&t+Hf*6e=f^]'Dcqs[2jM,qHLWfYP0A'&[J4%P&2e?DB;%AV$mOr4;4sdJXS=S\='\H:KMJ,DY/pDe='+=Kt?$\0VZKXh#BkBJ>qu(F)*hq-@hPS%pqLSgh+8Vp,2dOP?l"4UD:,YBkW,$7L5M?"odbltLlh>6ZL7']8jHABn>%;F0]!J[*q7.n"mmK*gdk4NV);2_.;FcfDqr(6XD!#VmrJ"DfZU+\e\*2%l)%(a!ER"Nksc.Odi4CC8\%:eM7Rdol!la=9Q+n8X_W?TeN9L&\nSps:E+__:udG[XjW4.NOj*i!a4uV6q^X1:d$GU1qJd=:hT)R)h>;3]%Ps(2mHX7>F%Hu`(>a39%2%R4E:=&[,1n*e`fQli+peAVoN>MKb-P(1r?SG-mE*U8_?D'JnG".Q\1AP50D`Psm<`gle"FJCaocO:O(k1Z%STe)[NMX&Qc3@1>IQ*Dp6>WT2]hH`O=JQJc1=>/^qqS$J4[e-!dS!Q-pKb^]$eNVgQPCm&`*\ooXI7<6U[H?^cpXH)rg,,,%>C*:Ar\&&uOmhXfWQ`ArV2V1pnMdPa]mRCoeN6+/!ERICksccZV!!ck``P+GLcp7]=kT+lVaATcAglk;_%VfM,E?_QG2c!eX#?e=Y*3r`X3Tq.\%82\:mnjtT@Itr[('\nqsq'JTrr"/T%K!qrB,/dg#YuHl1aemVAjs/OZ'Agjp4];((QWK??Nh^ob08:]<*ZMeoF7.Wma\k8[diud^o\U6$IMth97dsaPEV_M41dC][LU^OS=ZTe!5I6EQ!BLHq?`[=FHs.*ffD0:8tJMjG#ksfIIX2F*oCJu0f6sGsCN?f!7U0cSrUS"-hS=O4p;#>@0s+QE%aiKDi9W>Lk1E=(+aL'L1,GZ8deU3g'eCC-LW?3J,d9lb8\<$*g=6Y!.Y*PsB-$&90`YfcmNC,5llJ#aYR20520e6de]$8A5I01Brf7SY-\W?CchQo%>m7E)2Z"u"]DR=geeT@Rg12!rEQC]1XbIb0]eVm26K.!hH]3/=+>H)O^ZhF!.Q9@ffFUS/E^.[][%^p2dARFl==J%V(C/#-*([7eIq)$o$2``+UXj@j#dV"[N]K9V:`%Jg$M_$7?VPpor7mEM@*Z._BmG>Qsp=^IO"0.?"j)W^p?:tZgfe",8D[+^$=ghKe\MT`*Ks>XNaZaL0D@SO1AD8\bS>;YN/K5W>C#)SXmMe=F[$q!/\p&gL"0@qeduD)YYc2WFcN.)u$Sq#uFNIMge0U4rI1sn1f+-9SXOd;ug9S?(Gc];dD6rh.'>P\Sre2M//ALnaPL@p>Z#@ffqQ"%q*$e/t7&T]p[9?PS<%C[%GPK,L`O]FQf"I+cr`K0o;0C,?S*-Ln'Sk`FRbjT)-eCH+ghYYuUecGr4^gHJYY'Q:MKI=4I%"s0.b.bH>3gBHq-SP%?_r$M>#?4U-F]\rgU-f,>N(*1prn2!]sSiWS"lV3h"k!O8*LoTgU_ahcHu_=7un[Z\TZ+6'D1tQ6n^fGiVLQ0Rr7k`j\A!PZ\lUpa6D`"WP0#?OC>$$qL\I@06jP"Hrg!%OD]SKo4bd]qLc!:bAFrfM"0Z'NRaD]qQR?'e\I30)_4HDVT>BFr>04LGXSo3b;YtSY/>?+DAG<\qjrT;hUeMjG!*))R:f#sI-$nt'/QsQO)hJ0hX>X8C;%>>/QI3T+FSj&WV":u+hR,UB'Y@5BT_7.7g#AaO`"4u`799T2Q:nb>7QL%s*]kU4R]4qpR%_,S>)k"=D'/0),&<']C*/]Crj,-X$3q@Fm8%b7_36QZ;Agmtu59Q$f$<7R!6,I5K[ScV$JU(q.Vp2VR6s0)F]fZf3?l)inh(.F+DeUuDSkVP[(WV`77,l8Gge;YgkCY*YQ"kq1i;2FJJ<"C0c#[A8/bjHTf/>*E[X^B>gPb3F46obn!]"5fp49$k"9s(R3:5Uq$#?KQIud+`D)%OS:pYR%:Qt6D$5aCIO4bj.-'K,FA$+RB>5^*1cFVk1,eT;ER\F>n))UK?g)dO(Q_?ci*Xg;3pa2XQq';H#Rq<8MqDc\3mI0$R[n\s=4^p\WRX-TVU`2=9C26'Ph*3Uil3k5ua21X>h"\\9*q@,QH:E(307A)dfHh\Ek*u+qgY6`tj7F]h0?n(VT3ZnolFh&H7R]uIbl4^pR['WQ"S!14h]KROm?De$WUuUTh?nB3AM#0b;a(!BcC*"UDNm=JH#4n@rsdYi\"35%>AK^G/udUq*0NNK\j&;=065"dV:&W8h'qAl5NC/Pqm%fP]`.IsnKqS0]6rh[WLh-+Bd]P-CjbpJn?OX=*'Z3#l*I@gcRp;apXJPp2cfm;OD]SKo4,ABd:g+0\*KEC_8eA`D77.]nTC[RNN(=+?cd6KKuh/_GE0F]rp%c"Za\i&G\^CYr=/Kcq0;LN*2XZ8'^F*CQ.WS?a'LkJH00h-@m_1nD%VcUm18&8qTR=1oqo8R-VB:9*e$DH`qE,!,/4*T`@KED[ngB0H0k=HpHA6:4mLOGq_buhQ/;kueLTgch`c;Yk.+Fa+i73)=-:#i9@#^UIIZ@@o3\#WrUT3j+3R/2"eX>AS*>WQC/b.Q2CWPcIc8;JGmg)\L9;_sH1+p$(?q\Hq)$pK-'u*p25I,ce=CJN_pW);AYKpW?8J=MEJRr4nG/IJ![UO]*kPgZ`[(SMab1mD-+i-"ulgMK:rMEhDpLT#MWXa>9%cZ*jHPV)Wt[pk[q[hY>S>els'%#@6RU6Fm1uc&_*9dhl)]n"48E3Iek%/5;H.%c>bX0m`@_jo1rST/NQ1+G]2N:DU'Kkts4\C#tnr`HrYQV9N<&*4g>_P>e@%Mt^mhOd[--nf=,3iM,G>fHZF\B'7DlDl[&I\ln82f-?4oP@cr&%CJ.[kON3Aqk.C\F(6OPE^$R?jJ+An9i'E5T(i\=o9i+-Ir)/Y2m\71+DL\V9rH`:@ke"\Z*i%$rbHPZ82jhrO6NO7cC7YFfXHho"`4C2.?_b5?5@Bop$uNpico'DIeT!!oNbEAd>HdDYZ:#RBKD0kGrLLBRFsL&V^K!"A"]`/PbS#FaiM9.=HhA.J?T!EUt+=EkVIobgq?B*Ab\1`Lbe0j-l`OFo$+/HoKB\Y2.mc\&\8A%/"JOoV$M"jpk\-g%1;O^]W?W6eBW-cgo)D\H_t=to!sb"m[+a&,GZ8debkePcB[[)G\h"@W8E.jQC>6d-t)M_7G0FYd6'eoo_d_/hgSqce?f:-#U$B8:M)e:Iha3W6t:]7gGeSJG\BIj^%Z@N4MKj1%JdWg%:*j2V[[2]G#eG3`N:WXZG8tJ)Vioqu5L]9(SFWVW/L?i$=&c(mBk;JV[m"LQMh\hiFQ.h2"+:n]UeNgFn2HD7\,mO/Yc>YC)H8:DN,k/,:pU/Di-3bnoN.fq65eU4%K!maEsnVPcV'n'Yjt`jV93,nhS'-H$mIIVVqp=InsuqXG(0E@H*m0EDr-l]@[ZEYdIk]JF*D'Qq_`l_ee0_&`5S@@csDTt\_F00R[;3UVm"qm7lY__qTRaNg1=lBri=KaDr$ee=oV4R4B14he%\>_kt56LDEM8%K#?;o@.'Wt79POjK21^SFQ;n;]J2[saY&tqAZU*uonaV"+lbb/g\Lf\m$j;jTr#9kW9IOXu7Ckc4O`'SVmJ>a67G5+8;>,HSgPJk.bj;IUr"nP!h]=q'jdsK)S'f9H/k8C5o2:@]ec0mZ90abkf8K67O`%`Cl/lk_pdh:,>$Hlm&Fmu",Bs#A-u.:$\j7^+DUuHUl4,93\%)pH;ste:gmId)>/!r`CKG$7>&!Ftf!=mfO`%`Cl/lk_TfW5)Q'q-U;'iI"F>__k:_)h"(Zp+[VA@_<7Ckc4O`'SV?!^VQ4`tP`Nr@O/LdRYr2dbA+A=$)LP,5&qn].ua[HtP2UmnMT]"+k!].e`sg?#fh*.R;,pPtj@hM!JXMOmt2N2##?km!\H]"+l,.4r:*dB1?dFQ2\EG>>!4Y?ptr"soKaF^f7Yc/\7g?bCDL)=qK,D[8ob6KMY0rKHepA&kn:d8O8b4Pc6AIUkEoTQ"W+0OMoL`O@ceu6AUlQDR'oBL(KLbg'ofoG!cOt'&$&\U>6AI&js8s-IH]:+]:Y=a\&oZ6:bR!2om8u%3\,3BK'(NG!cO,%.+7e7(XUq8."Z1/(&5?+c2oK+HpItKFfT+h..hc%3ZuOZlS6DT9XPEff?KTO.!DNIGs)a]@Fcu--%m=l18(toESM0;5lOV6ABfPgF&@V@^A,h`\N6qV,O=c%;h#Y>Hl#+7lk+bWAmm3X@2D?qDBU"piTBK(SU.A>R.-/&eO,VcYFA.n9a&0`F-S#f#i+bV+qG(WJ_h%2oKKQ`QEBK(U+`6`C`8[KF'Lm68(Z4cPZ&<[ma%5Nc`6O8eeg.bVBh%2mc6b>W2d;B45;F8";9!fO(87H6ka<]IK+[eq92d&^f2ogt$s4-XH&OK#6@C-taL=U7&T/\"nNt=W5(3QrN]?**;])dFMZl6f!i@^])_o!KkNF)2qN8fo,ZKd!<42^g+6ioBgIG>P:;^!/dS\'f[qU!+92DZU"o\K9S[cn!(_uj!rt"qg'n$).G>42^i[M5Y$JY_aW:Tc^i3sG!!(KAh#IG5eL9P?j;!!(KqgM1Dr:!),!s&B=$ge,u?ohK'q;?l9A.JeC?nAZ(!.a=\D?'Z.d;ApaVR(dPIdtVIrV,394V.UDZ-[@g!2fAdmse^Bo(r7@s"8X@!!$N&h#IFKk6F6HJb\@"hL"_5*XDb]=D0Vn!7UbQJ,;1pbNj(rqjZr'!!%t3Foq^uSbqlj?i9J@pYC%)%g2l?/@6>rJE\mL2q)XE!/YAJ!!(LDi=CDdIX/X*p=lkX!WXnig'n%tF<5\b!V+A!YCHMOm"#-:N.lEW!&0sr#7l]!?>mOMQL'/&!/uVT!rt$G+8tCnig88(rpglY!s&B=$ge,u?on>en,G"hH%eR.f`M6T(^o^8!+7j)D/J:!f:-]m.=30;!+V_Y!!#^Ua$9R.puQY[aq`S3!<IFjm"#-:N.lEW!&0t!*dUBTo(r=RIkQ-k!!$N&h#IFKkLd%Lig88T0>8i]+92COU"o\K9]u3@j5QEWV+[.c%g2l?/@6>rJEaT"DXkp9^]*Q6A.JeC?nAZ(!.aZC+pQXS(QTYl[J4pC]%84,KnUR/lGM[iLrNZY9!'kQf4[%d@eoT/#-[Qs9!1=#q#+"%aUYu_m!!'q-GWateeSfp.)qb;o!6Fg3qsX"-[;5;=ZZG=B)4]h[aP3_N&'u-uEH0-!t!s&BmVYrtdkkI"%lX$brp+QLI=HI^Bc`*lmf`M6T8G;J`n*\o;CS>pXF6Cj;J,fE4\,cRH=^PMXIu=C/B_qW'(YO5S))hNqK@>:34n[<'Z3LF2O>#kO2qk+V%NIItfk6r!*ZtF_MpX/?o>D;@'Z1GCL*HQ[jtcu'+4,aUm1!R0c,Vk+OgVSBlQp-8VqU"p8H81o[@".55&lP8faYHLaq5QJ]qh%2nD/r+TPR*im2(IbqrF68GJJH1El]-2ih>Rp-*0V`9PGt,01hVMSl!s&gcG!cNY\K'<4?q/I+qlFHi*fihb5QJ]qh%2nD/r+TPR$#_X'CFrSl-lpC!Z2F7L(H[l3OBa@N;S.>BK)haSWZ,I^i3sGKFj!s&gcG!cNY\K'<4?q,Y@_]M:Yq8G"9+aY>^iQuHJ+XECA])g,((^u:FoAG63arUgr34'Vk#g)2TD?)J=p!m,4]/b30W9f'8L-rQrKTKFKm058>f3Weu[%!]dltR:nO4&*]t>oa45]kZ`ufd^Hb=l&Zl;=;alUle!95QA9Y5PX.=fcpYGUYQJJ81o[@".6sUX&nc'pYMH&G:p2uAn5F?p+QOCBK(SUP09QT!+mrG3P!MQC#Y&1NK*u5a$4*q&Wi&s6O4jG*81j0(*A&(Z*sNVl&M7I^-:3P":Tj)6O4jG*81j0,0rCC9[_`UNK&qd^%\,bd/ete]-2ih>Rp-*0Tj[Fqs;+L",R1oE,\YIciBi6h%2nD/r+TPR*2h^4r\^cc)t?arr2Z,b8qI-'XSfG#g)2TD?//]d>raPSUI:#_)Zr?[-SA*#"#pFKTKFKm05885Tl`g\.Sc:QbWGep4r\NU"p8H81o[@P7(]Fp!kF]GiIMhEt:M5n>T?a:;ZoMHK_&0L5DO0fjhjUL`aaqhHoa43BTG%g2!n6hHFFlg'o3YjDnom=m>nZhtMH1I=6N]\,05,9L\m3%L`b.o?9#G^aM@Q)mY?h#l.bYrN8Ffc_/Gt\fcD`KTIKI]?)C<^%Kt/f\"<0-fZOH-Vg3$GW`m]_ip:JcTV#m++Rc^qs:X&',-Eip=SWYViMoa*r!Q&^A-cQ:NG!AA]^'XZY+7*=moTrlKXqSWFkB>2cj6-^TuFi-q]b)nP(*f4s!&3P+g]BLL;gge'iC)fJ.eP,Wa5td#aVS^%pf[ZN*\Yb*=In04'%ud7:g\]45VODf>+:oX*s:NB-&j]5\f1;A>%p*-mG$leNt;jQ6g:L(MgfG%5]6]^\I@J%siU:7XElVFIj=BE2(gfB\Eu3KH;naC"uD=4pduUSHZ+Ge7r#VJ6XKhHj+B$a.@,.b]m;$r-Wb4']a9)h#E-dK`.`'&&=j?+G!pj7-f(*mnkOH[B+Gkp>#(0`\9CKbn(BJ(TH2B?l;>]^.53ETKa')%-4e`qt,&4gCtIj9_.iV9Ye,N$"&Vf=i\pD`Z(f*9e&HUh#rs!YqGgcu.("]IcWpVjN[u$LPj/*e4*-IB(cRh`j7e/URI#i7`MMeQ52CdJom0m'G$\h@:E&NjP:OW?(U]9"pZ%mO>L;6:92APPM_&2q\r"%7qeO)q4WSTE!^&h5q]Tk4*\&J,ONCF"RH\F8>Cg;l3A>\1mr-n+a;<`!Z0!q*!$ggDZhm@l(]l9VAOVg$iDs$)\X0rbbN^Q>MZT'b6!dHkuU'f1q8P.8\aH4+)":p6iMi;mj7+F0$/c`3,*9]?DudO&+W^m$aV"VliWCccj2H5P->C/l.9.]o'jK3^!Xc6@c?>8jmaZ@6kK0`r$^NY]8\W0@?I1r"Qhs%94qh6JNDj:oG4@/n4"U3nSV^/+=JH:If>W6ki+-.cu+[NKo.Y5>?fiFUf`Q8Q_$p>(gP&tapq\gDu=d`bQFud>?V[V6=!aNBY``^EE$/5@b$cHI/\C+/<*Z1ehs8UinoGdYt"9Z,CA4'GC'rETP8Kr^5s^[%/)9tg.>rIcahU^g:Js1_4o:ZmL\hj;&AJiZg9qYm+Z>uLnC7;<#4N"?8TV@pA=I(P5Kjk=k1J?QKN_%4K!7?j0l&9DTq+q\T?I]k/)f[Z=d/;N8j3WZeC^RFECLUj?;anlYUd.KIJVH@7t07&e.#/&djDXSmiXD`?s^>1NXlX;-AkE,;INXHB>\AlF(UanH5j:$ep=78^\-U:/o]]RHV>:Yri05B_X\00P*.,!M.YJFga1mH^hF:*HWp0:;$UF'?0fhj(rWI(MhS3Uq*Rh6GA5B!-.7Y7ZE/'E;-2<`lc?.c4*s0DRcskKX$n]5"<``u8*=U+]fK]l`(6;-P5Ekk7CBie(1(6ZSFPl(;SZAk22$\q?^hCsuJ/MR$]rE7>CH3efu%1>4m8aYgcfLc8\K7F^MuI&g/Q_(NGJcW30^Oj[FHg_W[2LBD!sgDF3NPe&GH[6*[Ee0Q3a\iHBeb,,g*N@CA]I9M"la,_>*BJ]^/SppNMXl+Fd*nf9t6_N6\D)^apG#)/('_]&Fl%dMWW,p$4D3cgR0=EFAVu94ZSMmP;W42)6Wplge0fj*p96%,2cd0RpcZQHAp:-[2;cEMX,I><<0guV[lMo?Mo&l>smbd#kR$p,-Wl%&d=&p+T^]mHe!)biGVB[MOOHKJgF_,jTWOYnLk.T#l6[Q8kq5,BXCq\XQiE[]l0'D"e>62K&P)_-i.3:,f(9Agn@%0(k`pT_W5m`MM4X%\K=eX)6/gISCq^;5(VcBbkQkrWGpfB;D1+[e>m4k/TI*T&E64RYae@t(qf#kdNT]eTDL`7o:u321Q8.a^K`c2)dl7)).smu?m57Fo&tTKe]ob0kO^,pS^XIe_0fcWQRs$bGu^ZI^2K5*T7@"#=`'PMHWag5YXqp%<#t(G>Ik+K=OrIpTb8aO&:qln+NN[$ud'NL85kVW3^]'43;lGA2+J\%9I$noa-RPkJ(!-&On:frI-I$Fl,\h6A8RJh2(f0]V?u4LNHYXhHFC\G%7./7?>*bEPJr//+mUhfqHKHMNY]"Gd/()4e]U^C=e>%(&o`u*KdAMHA.r?JKjI=L;8$>*hX:n]jAQ9e"OpJ7cl>$>>@f.k=/6X@"ReFl@t=JK!]'+W\.Q(`.iAB[3a0up_ljmI=cqaHiFX!ld^[G*aDnO(b)e0('02s7BIO@j1F#5@Fjs&uH]0>@4Ulj4@+j*L.(kHo*FjQ*-'m?V:iRt]S@6?0$_<>aO,&t,N[G7/Q^.#`M#?h?l7ol'U3'E4e1]\SBC\L+^KGDAtnk[48@7b(FRmaGe+Eb7;TS-IAbg,?ZaE>NVLD,FLX%Or!4!k/%N5in%dA:OO.m(Ci!o]S$'En_@*ZI:&p5J^S^"/Ie+N3>;)CX2bVGqqL\_/DHHdf]lcF%p)L$34k-Q-X(&go49`,DYEdIp/U;'6>'m!UhR)>&(;Je^ipB4mdo9mW7fCT,JI@ha-!K0e2F0PP2ZMmOF)^i/,cR.TrMdI6AP*iU7Me?M"emZ6,]##Q2iFcsV+hNpR@;+nirn,Zq^@6&C1R@X][lT..R,o&uVS2fb=ZJE_hNbdlDg+V<#-C3>&lGk-m@?Dm7(>Wc'2i,G>SiYQ5DNs!q;I?h"W]Gn,CGOsTPt(GrWoTL7=M3JR]1>gsS'Z'D'2BZBF_+nYMl-3Tl9;_rhX-;oP-_6rX)^5-)e43[XgbYdb/hY[m-,,_1O8&D8$n29I/)ZUZF=@bcu,'Og.hP(UinC.D+[s=_=$)V>IDGL?aqZ\O;NBQ(HsX$hTh?Hp"YXV8`Y%#SQ/]&KX4qO/7j"_:qYH?YO!<'MfAXu:rj>/+$-@*Eb?D:tX2NqMfZS\5/qk=)?RC]?)h!"/69jZgp5742[%$\o1po3C:)ha%r&p3uK;/6]<0m.MKH(Ni`g?r7#*']cG4O]cfb5Y3k2UWs`J/ecGZa[*9FfcNdWVs(b`H[QO_JA)]P1pO80LLY'Qd;;\Y*)pU"-?me*gGm4>g\!M-Qi,oeWJ3CcCeGe4uXNM;h>O4[uJ]X_"H?0m6XA6Bg9&gWdS6kaiAhm3[5Fj,sS,Mpn_^=k_,@=0:,O=7>_@3T`@tS\q1/.r=_d3bEY,g7if&b<%kp8G)@SX`h%P(JQ4Par,Q6\t5SYq"JLGBE.h)cVu)Pg5R7]\o^NuEAKC,,C>^Z^jLaMTXG=*iue:LH[@(?m3]*o`#dSE^6?aQb?HPT"[*jp>=p)@:e9k8%l@;Ml.7nG=oc"6d!Ub&nC1oOq1GU^05*>:$DV:3u!9SJ&\@Qs8o#W7jDq-V&G*CQr(-h>:Tdf2e3mg!gf^-R89@\?DF3DSCh/t@%ID0+hEX0&Jr*6ooio\;sHGcYuW.2D1/eTJmFea_TS4:1g]?r:Z][.N'qBZ`lpC8Krk.%L1]2:4.*56".6C7Drmj4d<1]Mm&/3UQ2-GF%\JHjW8Lir?2g">j(Cu/#gV!.MZO6[@=5^G;p+Wm#A]JD.5u4rN8H4KR`4o!9R$i2hiM',[:Bh^oEcjRaSVl++Umm#1a$d>*"l\d(W'$C'!Qbr2SaXJV6&WC0&EZZ]&4PI$W5;b/Nmt4hQ]1MH[,B'niXLd[e=ggfiNl:D!X)a'C-,3Ms>g--;lO."$]mWg#pNZ]Zf?qJ.:2TiBM);2&O\u.GDc?\'?Yi_I#HPMRIdo$qrlL&Rc*>=V\9Gl8T8Mhe:?!3s%oi4]]3OCponSQ$$q="@mL/j^UEr5XXSU1b=8.,kj'?+VN?(O\bJXIekgTN2D`;uZ$r:jp*J^/[Ia:jK_Z!k;I[N"_6-MRDaN3`qNE&W`/9\9mfs@HJBCJI<<.ADeb7_L;g>SE&kDS#]-!k`?(44BKOmm,GEd)?K#>h:hN1[#O>odDA)Xlr/mr.W;Q.7gN[AD_gnP.>pWKjr^1g\\0h90s>?@A5pY=Up](28+@*G^nNqMfVZ[T..H/U!@]D#"jI@UGU+^U\/i4T6#AcdGE:L:J;XNH)W2rqj`r*>9O8jia!%c\VX4K,7j=6+]2M-_Gc1HOH0#[%#!W,LR1r>=tDX1A0u)oC(>/rU8l1$FLO^-IfqON[0%c:At(]ptesSVU*R)@Sul#'ZZ3Di_[D`G2e>3i]L&Dp/MC.rR@\]VmL3DWX.WeiWH^g5TF_(K+pHL-"JaXJFYt%IM.p/mPoZr^Q>?OZaihO?L1d]#9?Blh/EW_IX5E7TnYu2m.\Gpl>U]V]%Q+Flf_WMjq=:DKb4sS[eqjoC"UjE3_ZDpGTdGDFb')-"-7ja-Qe1&so++!_2XGFJgkc2"Zjh@[Z]"saYe&LF/9G?m%p7NqNUs*;mbI:Wsb)5Mn<&G`LD@GOR:I!B)!VZ>:Z=cN)ZH)%eUtDo-N[&lqQT;V3DGj&%@&d_`jVg6B1$+6RVQ7a%fe_:BRpN\.F9KRQ^K+M4dU[?SS"GU:i#X!*k]OE@?/@jHinl7-ll,-WkWRWUipm99ND2R.HDH%aF07DqWrGg.JpTU;m,s9n]2;sT<`\koE?F3MAW^'Y@R_32'qbQ<">WtopWdr^I(2kh4)hWD*`>>oa82<=!R8L.-lPgldp'qVZc3?*&lIfh&)]T?WSY;n&_+0SX^OMR9m9GCmDDI<1k[2*l$XD@E/k]L_RLlcLb/+rs:p2(q_:8XR#joVS"pP:M#BB1e\^d.pKP"lOLBEgeL4Z-tX3F[QZ^'7&[T8_*Zo>qKqF%/WMRJH#3&O`J2WRI.q*bnLg+qTfW)da;rqo)&AGF`88dAlTJX(7%Tj/GW>CI^?rBIG`D9B?5RrA#-m55dM(d(T'R5>k8TK'_uE$KVX^a].YR)Tg_gnf,&UP1_*6&%0_LAj8JWk8+ND;h1RH#`l;kPcu+g#NAo_@%NS];R7qRC[`I^aIL8KVW@TW?3bum=CTI\_m46#uCAkt_\!n:[Uto"-D[a(Xb/fQ-D)_/8D0:TWPmDRL(2_NR(SE9Mh!CO!js'*%&7$T9u6AqP""_.g@t?YHmZ_-L2Mmd&Z2^I36Y)k/9.GIH"ccN]0fI6B9b=Ne[hC+6X?DJWM^P]4C.*H9.Bb8f6\6;F(4,rRN-^L-]c/e_nWX-K9L^\5I*]TTS==]X504SL"3l90iE6cbE.%JfT/dtHN=kgVp52XSI!gK=mHnjMO%sgLpJOuYTRY;(juitDp:0g.jt]tjQo@Aus5Dh;r>j/[&+2U9dG-[$1mR)cM&tB1&Y(h#6@9,ipqn1S5)0H%fj/`uFp)!i;mYQFBfE#dh8H&DR#B;R'-!@'-VqnAg1:?QL(H[l3OBai55t=em?%*CRD[7e[%!JNo4o*Sf5>slZVBfhPr2dhbKFZNb<)3%`Z:U-X'UZ8f[SF!']jD^]4P6)a!\URf$lMq(`3a;[Pi8o=4WV&WmB8IYVeE&Sm?m$)g"!FPuh"EQZcD2[Pr%6N-S;]k,j%_e.Cd0CeFR!(/J=M/GY]"mDCa6pP-]A79sVBEU3(o]qn;Mn(L!+Df=&6q5Z&CR[U[#%hf=[ee`U1EU?4Pbr1Wlg=]:ThGn-4bBE'-GJUb\<'\*6gOMI#?YHmAD4n2g=^"u](/rEMRRNO?&.Hgl\];&XPa@_O96J65&GNE;n40@)Pb'.e^D$(1V0uHmVkNVT[2$J\lI8k@->0gm[\7f,L\^(CSNI97uD.B%A#JSTKMX=cVg5F*,(0,QI7*uliZ$#f%7u;4Ljk'jGD-Z\ceC>E+&SAhJ9Ud]@94_mi-tr,ae1pVG!=eF]f#1"Nn)l/:c-Fr'$&RiER=!t'HL,Ls*pK9r:N>hOjDi2QIF2rfSQfs-gZ'>+^-:+GWF)lI8c#@FD6eB^AunGk@u*C9JPc"`6^pQDs(NHdj6H'-S?/?c.[g5>#eo0RL%Vn+[W:[lNo2Y$(/Q/^?E[kQ_k=E=.15eLcUS+_:u_sr6Jf9Sn*R(%G&G>,@K7;#J1\S^VoAc^:sX9Ho=qbl\Wu^WN:8HD0G:QmHV
      itK!WD%//J-f;=lXT>PZI(UoTj/jd8[RMjsj'K6$Fp;OCD-q[otW/5ifN6c?>h)j%=l.s2`?X3h>Bk%qKC#]@gA*[?b\>YB[LER[SiVl3=kC2AFgr1,^q(.rWkj7s2@J])\K:?(JoH&bO:qkY&@RjXurrZ'*``tc1:@_>C56LTe8D^]gL:]3$ECGl0el2M7Q&arWdU5f9e+o*0+Kq*lEBWH;6S(Wnt^Bm7&@JE6(ORd>t@8oW3%CeEU:VZ/83oe^+I]<)>c#>G[fEe-M?tJZkh\9WgjMe*Yo%+g:)C85rRA\n33\F`IBq>F.\IO1g"5PMLClYCR)Bs[AQAas?Jlc99C+WZHNt621tE64Y:X2j)P.Bb*qZjb]34@)qAT#[gZm\$SRU;2UNRaXr\C5AbU*`@7H(p6lEO@DM\Q-9rj._N;Q27$n12N&+k;FJg(*-1f6/i=0^QiCb88jLG?I!XXLKj6h(DoM/Ofr)X3FAQ;[+.MmSt\Qcr-:2KHKoE7_Km](2aTH%^PT'7S+(&'8*Y\#8rt[,L5RfpM@%A3Se2'9YY4AYMCJ,>+1lCI^c%^LYcb;I]"2j34ik9=ilguWjK_a=g+P)VkpmY0E8/NHD9!MqYL',VWPuJT9R%6]B3ccKFjCI.>Uo`AL*kId.jpp@reK(H/sG>6gdWW&VH4_kXfIldE48*X5G^6[FGV1ap.$SJ*ZBe8L&_M:d,`md;Ng,@QPiiH1mBj0F]"R8DsD!Ip!@oIu1cD5Bs*=Q\Dfj:>)Qe#X5AgL)>1Zk0@lh!"j[59]sFLF&l2fqN\YedJ,-C'jAq/7jUT85mr4S"<\e4`P0aPQ&bF0llQ#g)2TDPS3m*klgb7cOjup93r*W=e`u@-!96`TPQ'f:^r![RY(ga(a#:;,""Wl;Tca>'F\3ibie^cD5RH/R@OuQnbW(9f*PQc>%?FB#5pI.m\AR\GOqN5F),qI8VZNoMRb9:3TFeNF&RcX3khI%5lpYoXtd7#k)kk+,2j:Wt[t)bdPk1>aj2X2b>Z82]K*p+r+=KC,[YJ1@8R-7?q)@?9(_WgJ(Q3LU-!`]_o7I3pifZ^L(elSp96$g"X/TNcmbq+h8THNHF@0T3q9_DN\`QS'eBg'mnS,k1`UiHUaM%KthUsJ"a"3A$Poulo&Fbc'dS9;eG27m5$iTT^R$OcGUS+M+P=*@4o#mWFke%FklffZR0TLqWF+N>KjLVA!KOXE@fU$1tT=p1lOk(YZ-;Mb,M#S6L?,e,pT"c]$7;CNY1X:bH,R<^9u\*eQNZtI!TV@R8%+$?N+/5SU97a3HIZ+C7]nNC"_7RCQ45rPtXnL8BG2\uL[d\+^hW>3&-=Vrp.9jDWMfsu8p:kJ9n#N2)Ncl)MQYT$n(;7rGged[8*nP9dMlb.e]sX-kl0/eLRcg8h:A-U7R\S[M6:`_aFsGhLcTWjCJq8IVmutJCoI6Vcpf?P3NHQq_U7NK+ORrQ;onp7sXeujY.j,5ibX>3=BWs#\#5*Y6C?sXYFk`\C:MXku(&t@KfCE4[1753"KVG:fp/Le9`EoED'>D`9[6AMFHS84Qqm%gh^;s:XdTA7Vd6Y2ela*RtS(V=&F*_bAjc1Ea\+XaRop4r]hDIg8+bYq^%dc`s^]!P'>BGsoG!.8WFNhb83c!?Tr\/FdVe]hlKIE8a"]omd;SPRC/mUWQ;h0:nr9C>g=1%?ms!e*:GZ2d4]01nhN'#_,LEW3S`5!QZXg\q]5"^LVR-hdgPn]pG#hHY91E:14jNht.#$s9gIe*pakkre!pt^R6?5)n)^E^A*H/[fk,QX6`)N_0aV0WD[CW6[4/3Kh/"*uK5UbTAV1IR+20t>2fY&colbdRVZ_;Yc]^dsfil).gUg=59+S$.kK@BYG9.78_ru-+=:Yd5^7_^dr6FSBu6G&*1;m=eiSIHk?9F'?_ED+:jMC]W""ntG=(T*gW;kOU[IRdUf>9N&JY%:tiCWU`U)nECZ\MeuCQHI.r?m$#L)2iusqBa0DCZZ@e1mX)LJ'Z'V/UM9"$+(X<#g)2TDN*N'WDhM6`)gLgUE)TGk#.KO[KZ)d=VJM+ZoTF3s5'@.J@@u$btQ?RgoH?tiQ`dBcTW?J6>']oFtbs]oH6)FZl?gpR'fA,P9na^D4A.&EO\g8'?*T!AX6:Fm:J8h#$/3ml*kD"A63Qu]T5sl0"17Yd5]+>S"1MlZBgG1cEWIS*VI>]]r@]1hm_]IGBeh-[5+ZMelG+RAAk?oI!f2meh.VL2hVa*bG!`/_50ek]gU@'K%O%Gi84>A5AZr\'^2AblteLe[YoCM?`C[>jBKF1Gm+#PSZ,NggD;2+(Hq=h*nqC[+)r0E,\&PnHeRnF:qM?C@/Wf$^F$;W(?#qNL9J>pdp9Lj:cpo%/)-g"1/LfF%5O(Alh`]$4f]K?_-We>bY27*&_^Y\V<[[ur+!4?coQV6R8C@BntVgFSAJ_YPi!6`W.:6<4rWN=gR1d7;oi2cm.e=fof)-mljgJD2m\_TFNidqEl!/@:7_L0JME*)kIB2Y2*h.R$es9'/(WfN-HN7OtWW5;;Ql_Ks"U@qNB5jEUi6hE8IT@enOY(J['Jb?cu`CQi#@"l]kOX&XsS6E+EnP15'g<9U^ul5Hh.`8W]huL[4?Ad"N2u^Gk4,4",PJkP+>OVu7mM]7q#8@H&C]MUK/JfJh($*K_GtNBs'uI9J^MA9DNB)4&GDD?+5"@uic"2D8^hSs@![b7NA:0k9"fIS8?PXXOrfQ)Y:RWm)LS9$6eocu["-P+qIQHU"pR+fs>>1BCX%fO3!n%V2od%(lcSr&K@$Cs8(?Q[r@a&]-4%EfqBR+a%Fcp:tn&HhCG>e.C1Sk\1`'Q?[P@SQVF(H03eE5C,[?U41ZU@VelutS"cu&hNR@0JjY?2uq$^Wl\)^76<7jdPFe;:[GeLe-EUYaP)4iTR(he:)L$1FDs"iT0/1%E*)6,-l/GJ;jM;gd%a;BJKjP[@;;$`MogOuG5-\$4_3mFmQu5idA*LGrGiG=1GGG%2q<[p+5"O$33(lo@r>g'2qAD/JZWD6nd.?'bu8b4YH#WUp%Z*nf;VN2#,>\_6!ZAOO3M5a<`B_:HO0\>K5I>4jrJ'ir9iB^QH3n!_toR5K=)+7B\ra/dfiF,1&p25WPMd;B;.p5T4i^1h_N:Z7=LeSZ^#rk-KG[&Y8W*@d9P&WdtCmD_toJ,X``EL]".iiT]HP!(Au?uE0_rjoPuk47WWZF=Zg7Cs^`UJCLNB[s!VUWKD0iQI7\#DjI%O$fDl+)O@Qm@*9tT%-`;.)%u[l6GO"qRuk\rVsQSmA>>C;S+IOm;#+`>K5MG6EWaj2b)9HeKmDATqNX_1Eun^VObm(nA>d[hPt-*m=n/m;a"'V0^4u\l;[oR:ldso(0+p6]rPcDLd1h;.GbZ9Ch71s&o%r/^nAl7!a/GI`8#;]Z.+m+%rL"WS+UA;LG!eI]Wt-4%-\PZJJ>E:X$'lMUtjnp8D$*h<7oQ&8E52'-h3tYaU[(%IM/c[(j+oGB_6%*s"'r'.6OgH\#aHcQo1>&0jTX%%;N5EU;9t#PuEko+Ya[g/IWee#9^Erkt^lD)W+tD)]Eljm_[fm0"LtjG%hf5TbIMU%V".-_Gcap(Rg`q-:FK5s']pp;Tc9g'oc'>(_rAfJqJ4^1ir-76j&kI$Qa;-gM=YW7HY'A;)`d@6qG_1ig0I^O,N-$jlCrLo/ED7=6uHZsL,D"QWnh*2AnFO+F:!IXkU5d]p!cpG[pd_3DMURkXtAq(`*,+_M$^r\48IjY-Cs$P@2JHT]o_h8I$1`ral#-7!)ph&+i0e#10_e()tpHc?3("@Ag/n`/m]rTr4DZF=-qd;Fb+1))mG9WKuGZ"bRp/@a?KOk6[c*]Henn@kWBoIG!QboRkDfr2oIZ^hqBDQ]>pakSUn`X0C$eC9BtMs@>iC%WQrW`ImH1'/qN<5:*86DBrT,\^d12rgo+hZCJ2j:WBR^*rRu$gqHVa>N90V&=0i[Mu90d:#,((Qt,e)g`0-;3]/N#-ViGD0\m#4^:?%\^TInDeE;J\:dD7N,j7`SfXC/Xp2Oo+p0pZPo!/Op+MH"].6nCPGSicEH[D@B.N_\.1,kZ5IU;R00t;k[4U41+XZ/uc4I54PidU.e]@lGXp1sPH3;)#e!?4lm.ob].o6'ri260iGh07c,[KaUDO$mNJDIFJ1CFf.eDU29HA/5&*#m$b;N_7=`!:M;]3I_W1c.d8(`??Wj8T")CfO:6nf@lbDZ?Mmffcf^KTaT@Q?73asU,(i_l-h<"pnI-.(4]*Jqu-B;ri&hohL5-(fio[GU>6@_`\fX<$`(.)H:*/Ue:iohQ`KlEK\s+(+UVRV_!>@P[9X3V287"/"iOnsVC"A/]>Pih`$;25?UG59g5UA@p!cq::7OfqH%`4-!*Lii%%]J#7f.HqIf/t^cTNY&$Y3ML)aXhPjj7m=mA#_+qXq%AX`p;lhVRFfIpVh"%)AlgqsCkBqqL#"3d"'p0n9,ka(916N/i'K#U-_ug.`?-pYC$8IItoo`>BF/R$sJ,4YHo!VGJ]5jHEC5p\,akG"ge#1GU`&SN9\8]-2ih>Rp-JCOGd%7o);@P]l3tI6,m6h0n_H3PXJOa$9Q#p3[=b@U=NZAauNV0JFVuD"W\j#]@-Kil-h]2_\i1]-2ih>Rp-Jqn2LB.t`J,Z*PZL='(_PCD%ql)h:oA*N[2?jN3T5J!E:sO:D^/^%U/qZF;7E6b=LpOB`:_-B#S1em!U)hrs:fo?TZ$hL"_5hL:h/m=l0=E]LLr*;&sZDu]?gJ,DG0H!Yg]V9>2YF%PP1JTaBd+h8TH%0.N?cu'+4,aUm1!Rp-*!0Bog2hVa*bG!_l!3upuL(H[l3OB_*5W5=l&4/o?LNWb"a>8Jr!PW]QX!!!"$&_[Zo!!%Q95e@$s!!&*$BK#nk!!';,m03Oj!'k_#h#IET!6>YW)ZTjg%0-A.JF#P5!<<*"O<&!nzZ30Iu!!!!aG+dXk!!!#?%^[/T!!!#PJT_+q!!"-'cu&g`!!$O7g'n#^!.aE$])_m3!0A472ZNgX!3u^o"onW'5^&gVza:>Qrzfn";K!!!!A44%jF!!!"0#MKUe!!%Q95e@$s!!&*$BK#nk!!';,m03Oj!'k_#h#IET!6>YW)ZTjg%0-A.JF#P5!<<*"O<&!nzZ30Iu!!!!aG+dXk!!!#?%^[/T!!!#PJT_+q!!"-'cu&g`!!$O7g'n#^!.aE$])_m3!0A472ZNgX!3u^o"onW'5^&gVza:>Qrzfn";K!!!!A44%jF!!!"0#MKUe!!%Q95e@$s!!&*$BK#nk!!';,m03Oj!'k_#h#IET!6>YW)ZTjg%0-A.!&G6Vk3eJU*\79k!!"Q@CH(-SMY7n?K*;5T!.Y7Oi!2JKZJ&uP*^)!"YQ+Y'!3i,oT72+.h)F'&?G:eip0[n$!!$Cm=0Gs/mWZFXF6CifX%dqf]BkX]!!!#7&uMP'QJ?n0jiS=k_ZTr>!.ZACqWXp8s8Mb:mbF44E3ufjG';"L,6.]D!2O/!ZZ!4Sr97",P!)&1!!!!iajmFn^\>G1,sD.fVa(-Zm*Ph6!!'ei4S@3&8U'()rqbrdLB[_Y!!(43aX<_Yi!2Kncb@g+o,#1:L$Wd[!!!#7Z>!t/`8VgszbXatq7b_qSPFqb@p4r\K!!"-9',)&UNgo:tC"^B)!!%Ps^%0;r:BQ@DjHEC=jdDBO/Ei'PhN5Do#64`9PEV3F!W]%^d\TUB2rjr=+@9j&B-4lJoUAng+bZY_LPPkmFoq_pTkNiUf?[`oR(c/u+XH_C1?#.e!!$CTZl;=;8M@Fi!!%t4G!cNYl%O9_!.`JDD?qC2^!LWs!&,>F%3^D#(YT;u!(K>f+bYsL6G!6u^h@C?KFj;QBK#nk(_,ke&44eQm03OjUS6KT6:cErh#IF_1pe2g#Y?\V)ZTksL3>oi+mF](!s!l!cu'+4,e_QB!!"\kg'o3YU_h_o!!#JU]-2ihoKp.j!5N8]2hVa*?>)7t!#Q14L(H]"$ge,u!2H7D&4/p6U"o\K?o55063p.9Zl8uFN.uLC#U/GdFoq_pdElb:+XFbJD?'Yj)VPWDKVTF<%0-At6b=LpORtlO!X&<^@52ZNgp%IJl]6IH8/"onXuU"p8H8:$uc!!$C`Zl;=;8M@Fi!!%t4G!cNYl%O9_!.`JDD?qC2^!LWs!&,>F%3^D#(YT;u!(K>f+bYsL6G!6u^h@C?KFj;QBK#nk(ld5'bsT=J[GQ(QNjUJ0R!U3`epZSMM5`f*UEq6Zs7Fi9qp'-4Gc0`c@VZe%jj7lF!&,=t\!suVXt%RG]@L+4VAFUf7GiLT3^joIZ:Xn+M2AOsfK4u]GstTQ5Gq3Mh9s>2$lI\-!!#Jup3(N3cc$UJHF$&.QtfFnJ;:#*.Q?`.F4?h2is+bC-&Hp*r0?hk[-t$+ARbK^l%=geGh#^HNOjU].e;iZV1(JFRcnnuYEj\0iLAHTg3)KEM.L6do,?X)]_!9j^V$?>dLWZ8Sc=n2Y&(aJh,<8iBCc(D#n&:H!XbZl8uFN5jB7k,6[0PqUsq[@?M=^V?O*Mq^;o!Hd;Yi)+ODLBL/fr`+So"8MBf?"l(lbNL9p7V4Wm]&5Fc+V>E,aOE!V(\7Et;CJ_?(8DY<)+o/Dmt>A6ma1lYbC_ERP#lq^26e-U.+XF77U9[,'9:Ds3-`VLIh1?rM^T`ij9knYTMK<)npLR61@[85/*)4^\2rHZ!(iFeef'<=cIndiWh6kj.DM:oms)G:"C"e/u?7lfZUXh]eYrWT!9=M=\no/=u+,Fn_NCGMg,k^bb!MIF*Ide%UTUr9Bh3hK5fC_L!6i*hAbL?g]Q>jmEm;=8p`Sn+t%iU%8dBIEp7)Ws?pThXo(dS#bs.\`q\7fA0X-[6&jh(/Z4Mlr6-mjOd,7I9h?kRh"5'cd9U8Vs=tJh"Pd`2te[mZ!'o;W73][?.Z;V6nI)LM'Tu0IGt+R0:r*.ii*t[dO#a8-R_16o/B`f&PM&jYMT-&O_mam=(e[lO'!?[8Cu2N>r1lN@kXgRr].I]2XgLQpk\CiSgO?J)#@r7.Bakhu;YmG;_>V;BLP_lZYPfoCe%!Q.X,>(_FmD*I/l\A8c#<")UX/ZrIOp8fAe__*bg8!5N8Ah/5-Ar'4+s:nkf3Vp1]ZkpM4$P$V6U9Md\'s,?NZY:'^7/BWV>h\eAR]X]n?W7s]:DK28\U3uB0rUI/iO2RR^qK7!053MSSnK1e/[@4+Q-\CsDdp6Uh>kb'h8\RVjmeuu6E=ZA$g+FuI&e?kTEn@iPaqq,SdhK<0E'OTYg]OW54LWlIG((]1?i)\X!M+s-QPSMQ`U-5kB;B5T:Hq8IU;oL#JOLa\(ZYgi4:SBSPHinraX^2ps>!Bg'n#^7Ut_,F5t!$[&.g@kJC8@J[rBp)E2&[N_=+jtGVr@H45S2f?1o9=O,KY+L17QIoo@hJP6"m2"f)OQUc=Td;/q'`c;!3/kPC\1-KbW`8'WVo)h*6=YnT^C`O]JfeSS[JnqER5[+>rYqWd6B/3*J,HT-=I]^]HRKK%_+gXkl+@GN8Yasnb6aqp!/f=JM-Mr*p@>]f2j]Y,9CCEl@3k;Re9>&r(n^@:5goRW90PgORHkRSFbhCjNu]=.@M_U2^OG5'[NK3)trGL$^Wh5UoU'WrD,h/_Pe>=EF9GO+I\I4JG[HFqk;c?e;@C:1VB9:rt9j.0PeBp2Ihl%;VK(+@b7lR\[Cc4YEnV!UW&N\@KG5O;kDr.uuI#-Jm2ge2uiMl8'd+XHr9Z]?caaRRo'U4+?/*^c@Y(r.Keg-R9r3OopN#@9E/aL-ViG3Yo=EUN*#4Y9!<@.2r#,3X&r7.ZO/O"eA5=$ABpHpl.BK#nk(l`gqNF#p``$BN`4^tQ.GO1`b8h"+HB=;sKXOhAis2KLl_M&/2DLG*GB\iA.C]Be\I1e'-kaRSpY?5[6S@7\L7a^p7S@hAlQANBlm=0L,q?QE!Fe>936k9BXBi:G7-q5t986+KV&%'qdpD1/SM(MZGSfL*i24S?P`lQSi'h>@6,]AM8@X#tmipPJTp!FoTsJKZ?WZC2?V#E=p<64A]5^r[kH0,]BQ-5\OB-f_G#OkkjK//oD2+cm-a1KJ1gE93^g'M=9k&LasWPE&YOQn$g!chHnoVDt/0Y?E\a"QF-D4\`_b9S9N'?:"=g:bncWF1*87^2?YV*>H#SpjI8r\Da@]X=tVB&6^QMm$/Y\qrK2nV?OK5Bs"f%la2-DU*pgK$@uf.sfr;0DBm;Il(Q4-lIWY@pAj0b;/Pk5S%cA+"d)!%u9Y>l?ej&Q@9MoilCL<9]c!(!!(WsfM+<8)qd>5+gE<#2$u,7e*MiK?4=0h0XY\@mf'i(X#uf\>i$sJZUZYr-=l8YRG0TB'Y0o/F_6AOCLZ4QCq4Y/>:*&BAFQo\e,/LThL0Hif`?Ed!fj6c2Z@9C&,GFL,N)'iQ?YU!la0HSr,PCb?+UHcOT`WF92\&"@GX%rKUH\9fS;IVnqqX1/+NE#omkEp;_SLF*fgd,`d01.S<.GNJfcfh4Ksll1sN$\eEP.t;Q=4``=ShWVY=4W6*<(R[RWOSN?bLQm"en4'A)%01AGN88T>>9aDpV"V,BDL6JD@c54>PI%a8\N>/5cg8%+eq0(jmd<:jqM!XQ/G^.8R.,4tm(MkFTNo'RA87LF(V*MHVYP9)VsL.A\&nS-k\4/G2lk.t`W%*$og>j&X&QQ>1=7d;i]H_Z9r?Tr%`*U%`PoQJkb)Y`b-QNT.slKiiU:-A4-D4G1;>6]n0dkQ_qR*cAugM%G+r2EkN((9h,hA9l``6g\d<<,Z*A8c;6DXA>pLp),i<%Z9m#QqC`JpLFG4UQp)BUe>GW7PrOI#Ko]oeroS`]2d^L)GKU5oK$TF8*"'>9FU<;WU9ZIq(4Y"C]BT#S%oOX"Xhitg_/\?7//W?K%r162keAg*Ok[u.jm+XC])kOUHO71iFl#oE,\n8+3\fjVW\m$*I5!N_5A8poIZVEs8(P98%lNa0kFq`58J**W4QdT7scWgT*mTf8kq=5Kp)>!%hT/cm!VIs7uon7E_YqQ7im$Rg#j1/1iksi'\1U'/D;oOn@f;%m_(d2:q'hgV3>=8\tsOE0&8X1:[nQKOt%X2KUS&eO^RYZI7'p%>gM;Jp!*.?em6L(8K@`h[%Ysnm)HcG%Mo#Qn'gB-C$$OiKCq[FqUqW,d:4634`p%@m7Xtt#U;;$YN(j$k[UQe)ZZfn@lN4C0C@LNS]k=]'O;FFoB]^=KUjbOIq2=PA+%4'b_6#ib\nTdQZ)AZV?"L#8r*20?FOIC`[pafWaF`9]eSVEK"Ogu0dH4;>E9D'X`t[S"+3J4_V@dnOp5>&KMVhLFcbB$58\jli_NgakU4%9;g7ZUJO(r_bllq'Yq!dS7VZdS9.U[_[`[/P6cGSnR@q65k\(rieVc!Mc'#)S.OsI],FhEP6_aXgHhO4!^UsNA[=WK64ltNj?V]C(jWrpP40"I'Kc+qedI]mfideToIHAPIjF7HN`u+)-$%^WPkG3R<.*uU/M><-U_8+b]tJuVB^F>g]IrXk*@T>;nbb6hUunUXlp/T+(nkSNGc>L9p/RAR5orciMhZBmpD]fOeeI##Hh3Lig-RMDnA#N\+eQ?rlHCGrI!#@jnX,:&d.1qeAQ#1nmo(Y*S,=n!)="/2@X:CJ?bTH$>rfo]+%I][1QK5p&H?h#K^:)5HFCGOB@b9J:T$FMVO&*SIL4')*qPj;fe5Rk\NPPRlT<]BT6Y=%ch:B\Ze\GOgllRg2uIM<3g=_pg_)r,K[NPJc'PX#^_+k)o.`,qBHA^"Z3-)VoM!G@Qk!$bG>[0Su?>Iq$dl?06(ep1ri,Ho`U;J%"eUCidQ75b(N)n,*A#PlE3hh&e>bs`5Q*q?hA84J/D>@D_:mf'FSl%2%XO\.Uml$dj6kY8237aDk-5*?5Q9?#HY2+k@Id,O-gnS+ejk0OZ__NS#*pR7b;W/o=k&DB-7%a*rq(o(>8oUu/8IFMoDHe@h=Hh71)DL$kV)WMURc:o3I3\?+`e4ePa`?0T)2*+l9p!]\:?64C[:Sq]?>(>a\7km9E)g#rk\IY03PlrU$_?4jqDr'=s*,Lac=Q0-(("2on)Hj'$HRnB]qFaV"r['$gKg6DCrD?.PT]>8*PftS%Q&s\)D,rCuaJeCDZ/7(`ulV;:J7&Db`Dn4$2-(GK\C*7Elq1p&C=J8`=FYa"1C?Umpl_q3rBT-X8.#e\S/iOa29s*8h74u?XnBI&3o<_Bq(J4_U5e'43X,F9LB:h98@c"s"%[UD0W-G!U\i/s!^M;)YiY%$l=cq)SZp*uhAYP+F4oJJXJ6GD[Aj]h0Kq%->IB'-3?S>_MFM9sf!T87+8"[_'kGeq_#G^/t97*ESDB$@'ES$.-BS<^MV(G#PLF0KS/>k#i.]Yh+[[L*PMj5%60bc$o>@:](.Hu)>#X\dL?1UR^&5t?Kg[dDEi>\cMVD_o?Vb!2\\>%@.qUSqm.sOnUQ&@bDooS**bU7^l0lKOICsm:H&3\KIbMe+smaCjb4So2E0ro"S>DS#fGr)V@lr.gTHqXCNjSj+!-Z<6hajQNp7ZLmYIqgOtq*4To*5P=70(Nil5=7;Z!RoZsi*'2'7u?>/3MOnrb,L[*%[Wo2*SA1Dp'hN]&S[N$9!35VS")*W2Oo/!""T+/P]R!-Pt&?q*n><)o#%kP>;d8-l21opQZ)]Inf]W&;G)q6P&:8mdRZ=KUS9PbDb;9es6.`S9,As;%O[5N&d_G5tHhPtYk=$nt.^l,l!2qa&c)=_C5uLeU^`?GB*VJ$r,tb0&>1*i[<#Y#`HIUKj%Ef_42'MM6A$\[GQVXGWKpQl`!0p$b\ZV2k?!c$*GlH.fq9LX"['[Q@\a;Eu`MSmriCg`_J4_'B.&BmW-/APdV3,Y[;Q@*eD?-?X82j-i"LXQ:hc^EV3EI3U`0<41t%@]8sNH*%00?Gksd+u8h9-1!%NtMUQeZQQ#m*.Pt&>^8u^62\cI=R,MacE<,!Z7!'mBCDNn&![$#;,T[H@i8h!bD8N-WGBqu]EPU`f2)ZZfndZ%-sPuc@H5@e+l+,!F=?R3!!!"`,t^,ID?'ZeYthk2!!(#o9q+%42ZNin3"VpUcHa_F)Zg!>:mT@q2huKri4soR)Zg!>:_r:"!!!iX[VXV@h#IETj+)4R!!%rg;7bGqIt-5_!<<*Jb:Bd/,2E5!!98TO!rr=[%o#bm+l2M>[kI0(!!!"`7CiL"!60dBh7Wa`lZ"id!!&ZC>ISL8D?'ZeEBq)9!!(#ok2tffDYEMS)g=XL!!(.ch#IETj28bg!+6e.D?'ZenKCL`*??/?2Zs*\TI_ZH/^b(.!&+mNl/oD*?AlE=!!!"1O_t.!JFR(Fp?g9;!!"\_m+AQfUmjMop;Gbu!!%PT82gMK_"]&.!!!#Z6YgIQ82n/)muG"'!!!"1fsu1%F9;LCMuuqgH1f]hj),,&!'j\_)ZTkGHt[;2PAU@#J8l](2nO8#MRt#3!!$R:\L+,ASND&8h%0PdJ?lialDl)a['mE_h%0PdJ?nOu]fW$Z*BSG_h%0PdJ?nOpZR;Q:mT^>HS)%_D;2MG$Js7.iC&pH\C!!(14mC1u-FS"g*s#TS&!!!"`j_oYG>=^^Qr6PB_G=)?1!6Xm,^]-HmS,)[=a5%:,!._A&s8D[8h>Hi1^PocJ!!!#\$L-[h^\C7QXT/>$.+aYY5$;)o)gfpp.dm!3!!!^Wq!d7)jI/V<;cDK="TSNNmecIfs4;c!f3t"a_JaqoMdLl1p"+2m(B=HnWnr4%m?&sTCu)Z[mZmnS!"@o`kF[7paX;jG\9[A=V_$U'!!&9;PtDJtD8Lc\2E&S27KaBQue>]qs"TSOAc2R@55=MV2_37YYq>Bj1a5%p>!8tk;l-cE"St;,n:VNHDil$]J93#>+s'3=p]6BV2$FtBLlK\6Do?ZIb)ZTl2U4*"5f5JG&G$A2*qXs/]*".qOjS%uq;lS9UhgQMgk5bP_nN20qFA#8"I=6Ok"OYTCYdT^"Xe"EPYJ0kuVk8DVGBX)g!'disB?tJO\om]2ebL*AV3bM7mBtQ++$Y5BgpqNSfOd4mU\$b?q5oo?B5Sc6]6%n(t`$YN7t./$HVVp"*Qkh=1IF^o7(P?iJL'eT4p9=?`pf[/*r'6j6HJXecD.X)?YRPekEq;daLLB7GU.,FUagS="]I=;(+n%K`bi/#4#!s`k)3;`I=O*a+l!.\kYjd0?:c4esCF(a8O,>Pqc]pgs!cE1DY^3hs/_#XN97]O)44.=Bs?G63racg_bMi.#T>ArVhZ2X[a5K>oT!!'h(rpY\-jR.#5rquT%;agir4VMZu>-hhcQX>1ZpHS`Z!(/bpqK2/@kIADt-2QXDrtkp0n=Kal!!$!":I"e7MDgHRNH*!pb'!.-\L?Ccf@OB@F=HWD!rr<.IIk]Bd>]^/Y$HD5_M,KU6q'1ap1tF^64Ag"g].>)66XiHlOghD]lBs*1#UQ\;pdYX/$HSupWrp@!*;!92b/3dcCI$5GA\6RhLGS(.,Z(+F=?PX"98EWhL5.SBU8YC47C+Y(rhs!]6B$ZX/i;el04%O(]aWp7X++FV.^7Yp?gVpc3e(0\om=T^]=Fc9!E0e[V39IgaQ[53d:!s[.^OLa?C[&J"^5I>/!S;7rt/DgF-^^mNEV^GZXEUV3#Er>_&W(Z.l>6"Z5Yr"BRPA;Qpj_ntc<7PoIb10%3dkLDq%grh$PtG64idU'E'r9bBiCCMn(bI[r5j>B/lcuX'3@,*g;G5Xq);'g8LBXpD`^!@iZ;V1!4X1?lO2P)h;qGpLJ9]n-(XHBPrGgUkKfd(bIVf[;VXVK!!)'7^4#mqgj@51/Yb(hcVHLUX(E+E[QC%OZ*6*JQkUSq0p,!YT.qg6>2e&8>oS+b_[etjH`-rF@%<-min;`,0e,!TU!la.JEaIgZG02b9M2+mPG@]_Pq43$d)58qkpj,he!fR(?!'=$:@aAO_W6i5oB1>d=d@8b$n\RLS5h?uqlK%i27&;g(MA5FeY]Ka:"@Hl=?U.pp%7KiAlLFbX\#q')YFaS6?3Jt]P5il\;(t&!62Q'nZJpn)m,P+8CC3dAR9/Zqe"B[Wr1[3iEro,[O/#O$pKSW`g!L+f(k$g!/Qp:NpR%N.lnF03C)E9"OcZ[PHqWTCL.?GTj\uA9pAp<)Wk"SIDe#h".6aW7>2]3p%n:,MZVp(VhG?2u$W[ZIqm[.%?k\chJi4ZG\-=ifAeX=HOR@'?tX*W?eRYgu=aW>=R^#7]_GP3@1c&*PR4_7A_c*S@p&lk.lNi`en3jNM-qBY@e+R[V]!.aV+o]aiPH,ZO9P945ERGXDB@3n$P<`L@"h3T?uX\)$EVg;gHX0jk[i)DaC?/$(lC@7>UpnfS1Pta2olo>6kq(m'71u7+>o3;*`&u&!:;sr0kf>UIR(EI9f5AtkZqo[&VCT;U,XM+k2`RRuQFHK"ad]?cg3qW#Ns8(?W#93^D`iZ"+O+pg3qXs/ECDoFSFL*rl:/kej=([,-P?K#Vdb:0c9UQ^YPcjjC"cj/pBB"m3dEAC&='p6VCq9p;4L03$_1%g=$e?Z1+Y(1g8lhB=^GF"cXn/D!hNbFF2dJ;S2HgXVD4R"7-#;)5$2o8Nr;!i-)uouYXZ,-b1X*EhCtLFFe+chh9ii[tb\cX):5YW-/WieP%Xq#EZ9)6Jaf_Y>dWt((4=r]EM1jb]m*@l/rGeg9\*lS73>3(jmc'^OB!(?UY)_6mIp-QW0N^\06g3]/55?Jl!=&UTEU3;L?OsL2c'pYQehhi/l"8n:FS0K&+8T-@I>e3N$0@OH,B'XA,m@JEC=XJ2$6!)[#Y%$NNF[_?_cD__ao@'FUF8GOn\-EuR!62.Nd`pREFL4q%2aiqTMTV2s'g3d&BM/"N]2WDqAm:cH6+WJun4:B2k14*5U0bD3!._?7^juTmS17@+aW4BlbKRQ7ZY$R4Gj.NHM8#`;nBl,bd;<&q'PM1#699oX1Q"@#JQ[?mVM'ZG$6*G]-mINN5_bEG9grN(>\@5YI-=Cm%8Q(juTnJdS9-n3s@RZ\ZRPi\DV7r!!$uOIJ;QAdDUC=B(A2g5VFsN?S`t6*gAFA4B^+#HN\;5lVbWe?,%TK(%0-Cg>a0-OS2iAT1\n)JS+-#LXf4lJC3+aqP;Q:EEMlV-f>RZj2m'KApXu(ge=EP,f!jn@F8hI!]#JiUmQ30H8fI!bVU%6_@Ah7C+O)?9cW\X-WK.EoIe4,_lZZNRg\'24frB(02!!%t!n%A6eR!UbK1lTRNIW2ltW_,sQ1iZ"X[/'=UF=*@;?]A)cnjr6ARe_f?8bk"pCYH_PT%;c$e>U.]ace)>pX[sJa$%]J!,t;-^OCT:?/:&6#=a,Z:WQ8(Dqj""iZ;V1!4X2bp=a:8^A-^20>AKN'GuV"qfmSZ_$=rj1&q=0&Af\Tg)G)#gpsrD^pnFWkgAUo^UQcN!!$mZa^d0N_ftJ"&U,?7=4XQ^+*r(mcCJqc0)u"-5i."jrFkeLgjrl2puCgkXql2]6D:9%`Z/@)`NMCI-IJoiZ;)"!4Y>VcM6\lm>X1LN+$AES;A#!H?sns*`;t<\8f4[o#kHF^3T>4\0Jj-[W_&lkQ&3(#87(;DJ84YSVu&>hL+q>\5U83ZubEUVusg1k*rjc'*&#MFRAJ_dIh3dc^p+X.uZ3$^\rSp+[H[DMd[@!/C71Rr?m.eV-$]qXs1#T0FEAUo4Q3c^q8BYE,F&R58L8*[1Ra@&/f)59A)1)]BXOHgeYXZUN(J*&nM#.CWp6R\$+B\-E6=!4Xp'/mMMjG&*9mauO8*BJ9j\eHaMI.[6tT>s)#!!'g5amD6J-N(oE*K*"2>Sis%SM.\K;Y2\2VL.dFpYtUc!!$F!?+P,la,V1N$e"No(fF_;p@DdiH_M3f"r+<-8ZY'7:rEk!Gendstream endobj 14 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 640.8499 189.1425 650.8499 ] /Subtype /Link /Type /Annot +/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.c1deb9a62027078d3450d54ef64db6d3 13 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 15 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 630.8499 180.5775 640.8499 ] /Subtype /Link /Type /Annot +/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 16 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 620.2874 155.277 631.2874 ] /Subtype /Link /Type /Annot +/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 17 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 609.8499 231.015 619.8499 ] /Subtype /Link /Type /Annot +/PageMode /UseNone /Pages 19 0 R /Type /Catalog >> endobj 18 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 599.2874 115.949 610.2874 ] /Subtype /Link /Type /Annot +/Author (\(anonymous\)) /CreationDate (D:20260611175425+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175425+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False >> endobj 19 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 588.2874 139.053 599.2874 ] /Subtype /Link /Type /Annot +/Count 7 /Kids [ 5 0 R 7 0 R 10 0 R 12 0 R 14 0 R 15 0 R 16 0 R ] /Type /Pages >> endobj 20 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 577.2874 168.829 588.2874 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1655 >> +stream +GauHLgMZ%0&:Ml+bbGhfBT]kN%n/B\#:\)<2K?4^_Ebn=[&mV>]VM&j^V1qLPV'q]EWHLl0pF\g)9rZ:TgHT4&$::V;h0p=(lg"@#3-RtLH%!%KO;b)57a\^HAm(l$RtkR:MAsG\.6d%$CL575jZk(quDQAZI#9fk6L472IXs@MBNh`TFAY=)8Pj"6c1$3q`'2DBbnfQNo5ks![`m%E#ofL9C`=T%-CHD$rSng3B93TnTPfl_/\35B)Dfs]Z?Q@5T3%cc8M94l!;LG'Pd!71u!u[6^%3`"(Rq_1(Lf8o.n;$>@<(IGk7p5tDaR=\h-hVSq=#oY@L>=0&qYe?V=QFKX;![*-n8&kN7@q?[N+\Z]-aDt-cYE7D>lKQMLC@.rP#KaA6SF>fW>_@8N,M4QJ,Da`N]h_cUHc_F/pXICI-Z059R1oN0/&u%0HAc8h&K+UlY/_eblbKPI#\I2Ca&C,?DWk''3ND)REGZdbS(QPSVSE6i9Jd),F.gns+Wbq%nOK`a/-$=I=6Q0>^0pWE4VY8nhG]bb1&2Rs(lNP2]s-$8dkSSqF+d+T>G9%WUDMiHHJCTF1Z$pT]VE&jbGZbXEj(0*Lb^UF\lGG=teohfk!B(4`]X*W0L'`-&=fJK_8^JnM>\hkj.P+&8")re-KGLmLbpA#XB#4XkUbLX$&;\R#DaQ9<"$!q/Ef(W/S<6G\hc%R+cpkD%:cdUaS@VMf>g1pQ_ROl42N$AE+CM_HnsiXmhRYuF/Q&tL>#bEB0+e[18?8XsqfOU8%S?41#=E6EX3lJ:UUhMN1b)O4CDNK?e>9GaErWD(ffm342qn`0*EB#lhjg'9%K1971UIDqqIsE>6adoNR]72s0&"J^Fi]d-g&8+d&AB&$]%5W^QTT'ctNK`UII`2UZC*/TA+Yd4pbNWj(nq97[TOH@nET47JF(IF3"aAZ,a'>(;F\#h\WV/?-h?)-D\Sc6eaQPlTFDke[A1D(n_KFk2%N*[")k^VK&;YGo*+@,D.=1F-U\=hup(3`tRAK?6er/&ChJ9s#9aCror*ip@^MMhau:SPY6&^iS?*6fTiC)?ED6dL=j/-"K+f'EJ2I-jQF065>ASmRc0#l+/%W.Sm:rg)gmPmNg'5ZC\X"7+$Ia1`"]LT`u\ZT92k-^LGS4ro6Y\U7=8<+h]sQ2YWid7A(W"QCIj5UTOiBq-H>OK9T7quQl&18-@r4e;OX)1FUgendstream endobj 21 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 566.2874 159.045 577.2874 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 180 >> +stream +Gaq3^Yn"W)$q0i;KtkE_*BUE*"J&XEARKAUA?.3Ts+(08cq1_%]/tVs7:4qqJ4kH%+s;WgJ-6%u*H!/c".c5*]!>n//4^\YpNeC40j4EOM%l^q4(lGb*O#E]XCt7Bendstream endobj 22 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 555.2874 224.189 566.2874 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 796 >> +stream +GatU19lHOU&A@P9Qr?DIL;h/_BhrTo[$=NhPrSE?(B_QAC[f?22#6l#B"tYI=t)dI^!-8bk;U:D+KuZ%pS%idP/7'R!25KS5a]k?]8!NBlt/`52gj6`ge"!2mW<;7SEEqJ0S@Aj?Rp!=9C*&BXA#D#,GYJ,];/]1[^BjL#=bha!cfm(UAb:AYYVJ^4lf]oNR4D+inJe=1jYL[T-MTaMdr5`Ka2o+J:K.NU>l9,K7dLnga/BLGPVK*4q#n=`,htM"Gf'2:OZr$JCsQ02,`6JAI69K>#KkS$8iNa:[b4cW7"ZG'>K0s>G4=PN]nQ3_0du2XIP(-\kPL>o:8(bmR)\A0WK_:d:$3U,DoCJsAU>P)F#-p9H5cq3SNBDQ"A#J=9_VJ*t[NAlK:)2);L')"]1tdmcijtVkmQQ)KVQ!>tNIcegcN6:-Kk]oF-t#tK_L9S%of$8:^J_ZAUN4,dMNnM2,f#(@?:HC,,pa]@BjOh/$('qRK/%,_GaqGbL=lZOm%53~>endstream endobj 23 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 544.8499 193.9125 554.8499 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 572 >> +stream +GatUp9l&N<&;KZQ'giI>;cp.kQ=N"b1i8o4*k(a8LVe<45Hkmjh&flj"tT=9QY-*PM&X1^jGn$f*bF!Bqj7H9a_"8I[tbnnSnqYV*4K?C:shO&6&SD,Y=H%?>Ma_>8%`FBZ=Dg(\N+"Y-9i1BW8`(L_^?VUBE]XJ;_BYtiS?`L=V6j,4b(eEsSseQA*FR@R?tihEMG>4'ep6FH3S[p.#ir_S3"_6Sfr?,-3;Wu4kD&#e?9nHaK;*VccQY>+Fnnjf68[mTU+n(OUE>W\p.O6XiJQ'\1kS,k&lmd5JX$lVa/p4LbSRC'63*L*G'@QEYlY2'&3>!)M>lkTf)Mh2BrAUH*1l'MG-iendstream endobj 24 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 534.8499 143.0625 544.8499 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1027 >> +stream +Gat%!9lnc;&A@7.m*RCR[:Dq9l%+DZKjhIkR=R^XN\)V2YuGP9C&^=Ha`6,p!BQg"=F/]1qt>;0+i]H:n$3+A5DSh\$C&B>#+C\hk$R%e55RL<"&^fsEgBXc>SdD_p2%h^2cLJC(`,sbLE-ZbS:N7mE)Tk4Ih=-8,&eJ78s708REJ2e0>l7me,O#k:KY$9Zd0o\%5\u-M>_N/FIh[riNc:oUbbSMf2$>&VXQ-mt:=A4#ED"^4f]1iT`W-ToMI8#8Nb8Hg2*md0iYg]#YQ8P(G?bR;6r-=`HD8]p(NVlCMH[1lUB+3^u&.AnHRS/sNhAUFWn9ES$kRI^QeO:M_H,gKMDX!Gdjq&C+.R!W&s@j'[J0WohP*(UbK=+7I*G!3b0KrWdR*GBaftkT8(Ml,LU`%OA27TCHtc,8l[o)W9lK[uW>^@CL/Cqk,b%D;`%`E9m&3_Sj=3nIs8uR6=_dq[L\Y.,Sm&2ab*YrdrfFeY+;U~>endstream endobj 25 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 524.8499 111.375 534.8499 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 422 >> +stream +Gat=f;,;fu'SYH?($BS^f[3UNnYh:#0tsS\I.;p8_R9m"Y/^;+/VUGq[Oa-B1qi(DHb[Fo#i26S]dSCmKuo:*18kVG'+X\gHPLo3[*99sOYVb<8=C*YLrB,%>VD9GV99Jp\<'*V&`\V"0H/V(+GgBcP[h54-@XCmX3488KV$Da[.&obB.^Y%G3IisWkdgVZeAeifke(62/J^g6*6j#!s=N,'#t=7q[.1\N?[30G&NemU>p]tG8?*;k^e[hlCC)o7=[8WB0*HXmS4j(W@n7V@j#!(Xqq&r5uhfOcTsE/hFpr3R&=/J\Oju`ncDqR1>4f.Yc>&F2Q>5248]HYgcW/\*KV_64Jit`0+S)?n`,+KLnYci%:3>5)hg?0*BH4I`t)Tu/t_k@ILoUW@!dG[fj)+S]0fflfe3JXF@jFJ~>endstream endobj 26 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 514.8499 175.5675 524.8499 ] /Subtype /Link /Type /Annot ->> -endobj -27 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 504.8499 200.565 514.8499 ] /Subtype /Link /Type /Annot ->> -endobj -28 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 494.8499 228.9375 504.8499 ] /Subtype /Link /Type /Annot ->> -endobj -29 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 484.2874 73.25304 495.2874 ] /Subtype /Link /Type /Annot ->> -endobj -30 0 obj -<< -/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font ->> -endobj -31 0 obj -<< -/Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 11 0 R 12 0 R 14 0 R 15 0 R 16 0 R - 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R - 27 0 R 28 0 R 29 0 R ] /Contents 65 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 - /Trans << - ->> /Type /Page ->> -endobj -32 0 obj -<< -/Contents 66 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -33 0 obj -<< -/Contents 67 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -34 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 62.14104 586.0693 173.725 595.6693 ] /Subtype /Link /Type /Annot ->> -endobj -35 0 obj -<< -/Annots [ 34 0 R ] /Contents 68 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 - /Trans << - ->> /Type /Page ->> -endobj -36 0 obj -<< -/Contents 69 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -37 0 obj -<< -/Contents 70 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -38 0 obj -<< -/Outlines 40 0 R /PageMode /UseNone /Pages 64 0 R /Type /Catalog ->> -endobj -39 0 obj -<< -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Android Cast \204 Git flow \(green `master`\)) /Trapped /False ->> -endobj -40 0 obj -<< -/Count 27 /First 41 0 R /Last 63 0 R /Type /Outlines ->> -endobj -41 0 obj -<< -/Dest [ 32 0 R /Fit ] /Next 42 0 R /Parent 40 0 R /Title (1. Goals) ->> -endobj -42 0 obj -<< -/Dest [ 32 0 R /Fit ] /Next 43 0 R /Parent 40 0 R /Prev 41 0 R /Title (2. Branches) ->> -endobj -43 0 obj -<< -/Dest [ 32 0 R /Fit ] /Next 44 0 R /Parent 40 0 R /Prev 42 0 R /Title (3. Branch diagram \(steady state\)) ->> -endobj -44 0 obj -<< -/Count 1 /Dest [ 32 0 R /Fit ] /First 45 0 R /Last 45 0 R /Next 46 0 R /Parent 40 0 R - /Prev 43 0 R /Title (4. Daily development) ->> -endobj -45 0 obj -<< -/Dest [ 33 0 R /Fit ] /Parent 44 0 R /Title (4.1 Fast track on next \(alpha sprint\)) ->> -endobj -46 0 obj -<< -/Dest [ 33 0 R /Fit ] /Next 47 0 R /Parent 40 0 R /Prev 44 0 R /Title (\376\377\0005\000.\000 \000R\000e\000l\000e\000a\000s\000e\000:\000 \000n\000e\000x\000t\000 !\222\000 \000m\000a\000s\000t\000e\000r) ->> -endobj -47 0 obj -<< -/Count 2 /Dest [ 33 0 R /Fit ] /First 48 0 R /Last 49 0 R /Next 50 0 R /Parent 40 0 R - /Prev 46 0 R /Title (6. Hotfixes \204 chosen strategy) ->> -endobj -48 0 obj -<< -/Dest [ 33 0 R /Fit ] /Next 49 0 R /Parent 47 0 R /Title (\376\377\000D\000e\000f\000a\000u\000l\000t\000:\000 \000h\000o\000t\000f\000i\000x\000 \000f\000r\000o\000m\000 \000m\000a\000s\000t\000e\000r\000 \000\(\000o\000p\000t\000i\000o\000n\000 \0001\000\)\000 '\023) ->> -endobj -49 0 obj -<< -/Dest [ 33 0 R /Fit ] /Parent 47 0 R /Prev 48 0 R /Title (Exception: fix only on next \(option 2\)) ->> -endobj -50 0 obj -<< -/Count 1 /Dest [ 35 0 R /Fit ] /First 51 0 R /Last 51 0 R /Next 52 0 R /Parent 40 0 R - /Prev 47 0 R /Title (7. Protection rules \(CI + policy\)) ->> -endobj -51 0 obj -<< -/Dest [ 35 0 R /Fit ] /Parent 50 0 R /Title (7.1 How to protect branches \(not local hooks alone\)) ->> -endobj -52 0 obj -<< -/Dest [ 35 0 R /Fit ] /Next 53 0 R /Parent 40 0 R /Prev 50 0 R /Title (8. Sync cheat sheet) ->> -endobj -53 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 54 0 R /Parent 40 0 R /Prev 52 0 R /Title (9. Agent / Cursor checklist) ->> -endobj -54 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 55 0 R /Parent 40 0 R /Prev 53 0 R /Title (10. Comparison to classic Git Flow) ->> -endobj -55 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 56 0 R /Parent 40 0 R /Prev 54 0 R /Title (11. First-time setup \(maintainer\)) ->> -endobj -56 0 obj -<< -/Count 6 /Dest [ 36 0 R /Fit ] /First 57 0 R /Last 62 0 R /Next 63 0 R /Parent 40 0 R - /Prev 55 0 R /Title (12. Private primary + GitHub publish \(dual remote\)) ->> -endobj -57 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 58 0 R /Parent 56 0 R /Title (12.1 Add GitHub without replacing origin) ->> -endobj -58 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 59 0 R /Parent 56 0 R /Prev 57 0 R /Title (12.2 What to push where) ->> -endobj -59 0 obj -<< -/Dest [ 36 0 R /Fit ] /Next 60 0 R /Parent 56 0 R /Prev 58 0 R /Title (12.3 Daily habit) ->> -endobj -60 0 obj -<< -/Dest [ 37 0 R /Fit ] /Next 61 0 R /Parent 56 0 R /Prev 59 0 R /Title (12.4 Where branch protection lives) ->> -endobj -61 0 obj -<< -/Dest [ 37 0 R /Fit ] /Next 62 0 R /Parent 56 0 R /Prev 60 0 R /Title (12.5 One-way mirror \(optional automation\)) ->> -endobj -62 0 obj -<< -/Dest [ 37 0 R /Fit ] /Parent 56 0 R /Prev 61 0 R /Title (12.6 Suggested order of operations \(your situation\)) ->> -endobj -63 0 obj -<< -/Dest [ 37 0 R /Fit ] /Parent 40 0 R /Prev 56 0 R /Title (Related) ->> -endobj -64 0 obj -<< -/Count 6 /Kids [ 31 0 R 32 0 R 33 0 R 35 0 R 36 0 R 37 0 R ] /Type /Pages ->> -endobj -65 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1256 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1217 >> stream -Gatn&;/`3h&BE]*.HW@ugU\4U,^o!eRs(W#]6?]tQUiJ/*:O+cB:Gdop,qQa028VMKoKR*)%IjZ-/I^defg]u!5]nn]@!u:kCAl6$n`6=j-'QahKlT3KeAoPYIKn]!9E$m6=9!s5h,hGB4E":")\6I=J>/@#OPsPutpEh5FoDVAQ#@&7cTL44fk<5^e9%]&#p^!EZ']+<)r6Sg+]CWOj>gGdNm_T'"5&4K&KeT-l(=2[fBMf+S`6P?I!]0'.r&i>!)YDIgCO"?S+_u>]lcs*:@ZcOW#(D(e0hKHfC/)r1Ogsf_;6eTP3898W,e+YcaI44\)LE-7rY=Iao/h2+bX.Y/5HYN(Sl=$h?:!b+Wj,`6'fu-J4/nE=a%CJJi4E#jUqLp,QBN-G0XV6b>3mY'%`E:.SG]$^hbmk5L6]X[G>$37Rb"EG$=rZCrWh%iaS&JlkD+``+>GkR?Jm0p_&.[NV9r"u[cNme=fOEePDH^nAmRYcK.?+^*bXO[74T[RBC:KQ6on*QD95]\^qr)=N_j:I#1u8@c,J[Q!@kXpb";kS%"r1'VD#mZl#l=+gc1gnOEfjL&n419Bf>bFEE*G6\4))]l;jI]=qRn-^X@eI:2F?%24A4[CFlY/Q>V`om.OOU3UNS`Od3EWX`[:_aX(Ik./8V+[ZQK3%NpfM/%_3Tt7R@X',s%g=@9c3nak#@j*abbe[m2&No[L043_U-mEb8n:;D&kfjM!,=WuuEV8a8o$@6mgCI1n]/e6NkcMjWGGFdKA.@F7kO9b97VDn4.ot+WNRAU2iI'3,!VNJ"+`CV>Zi:&i!mmb~>endstream -endobj -66 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3230 ->> -stream -Gb!#^D/\/g')nJ00j*?LDRPiWl9,/oBU__c6^i1&mi;n_+eU.8<\$hC-m]>,5Q6C`ZX,1cnpNO.[6o!p*6nuUGt;'=).-#0md'r1/7EP#J3mYS#"=_4=Pgp`bHi:'8g11uP%!U\#,Ys'\nZ"?%_H_R;X#Bg%a,k@ZM;)W1g35>SA!nkba)IoK,Zl9NWfa!D!_Cb__umo-\fl9k(h>Wn:H=1@[aNf&2TqUNdoEk7CcsrrKQ4D/AIm%P&$]'9k,6a5W>X*kCVrY"ru3fn"]/YbCJ%^K/iNAQa5#^F0WABn?lVt@7dc)kkJ:fTd3i1eQ%]1gQ5,;,Z?)!VVlL?!\mB7d5SL%'Onj_;:/iTT;,0O.V(+%OGK.ce"HYB$o55cH4As=]pa(CYH"4fQ]ToDCp`hH)+MEc&r^q\9*NMarEUaC/%%cS<=3OsIWk*5hsHCM;2Ji)`[QfF8c=m]'\>j5`9pugBoJETC!=V,mY/LIV+asm86W3#'i=![I@nrQn*qtKiV2TZM+il=N;os[Rrs"Vg=L&E%HI='^OL7Yl4_YP8Jo8/2%:tqcR^*@>rAN0s$5W5DYOnG&(B0F-fkC+7no].Vnd>s([l7-&(e94s!@(/,HCmn-KiS&ol6HkW?&3'En:C_/':hdY<7^3ZR^FK7kEQu(uhp$g!5/Q0RaOcf`E5An:t$/qZ`5^rA0.O,8=GB4;-/4SG!ii&q6iAc8Q1'dO!i@E7pbj7f8[bWKr;mn:":h:_+aFQ]XBeV27=o_,p%p[=af';[Xj(j=;&KVl7t[Juj91(/g.1gn,ak_MjbECK,sM0mlIXrA_W`;,CpMpliR>oM7lur#UfIOg]*,kATBJ'9^@e4VY'a9uqQcXY-r3rmI%B!PqYi5=T4,e"%A#_G/PR@^S21u8HrX0VX(Te_sm!RT68V;%0\!UY!a_gW`glH(K\1QTi;c(k2c4%nI\%Z*`:,Yb+K+Dq87=P9FVi-a21W72TcZr1cIB6C3\QjAFA_,.r:1_%21Ch"MjENiSNOc5,I8)l?gV-cO\/(jSm,3>C/GbP]SSn<([m>3Dg7#rH)m]8As7F[Y@W2FXkd=NBA1Sj[1g*7#BcSKt$q-@MC*b-CL3D_uF^d)Vi0-$L4(CMNJGr9@f'fQIA$m6+hr%DXm%%]mTkJtWYuH!s#mOR&bf)2@"/_`C,TV98`rXK+f:0G.oR"E0=^BSj*b-J,+TK!b5;(i:Ci=U34:<.>#_p%j(AUAk0#dTU.BU9Tc#^\<%[d1&Z*AbuVTT0n).94V7)1usYFoj2nuEtWH/h9J[ghbV75@gn_^c=BH7](2,(+$2&s0W\=T*S=/C7:Ihb5lG@hJO_FM[EV_rFSnN@<;hf=n@R/sfht_OJTaPclc.2HK1_m2c&SCMQZ(Z+AA^PPmOI,j=q8&i@J%2*njXflqLE?V]p1(m"](:Nu72=#D3F8Tp'c"p.^sl9'9L1'l`o@@fj+]kX(!epN[L3alESO+8dRthbp*jTh;<*gm\Y!P/q^SD5RkJS6`1LgR&!k=sLL@W'cM'"eTLftFQ=bYndWDrV#JWU0p,UIrJUq\*#1[9-B"m]2-R$J+XMl4PXeCTZp+'bA,():I&hhg[6JYPP[I#kRkm^HR'8C70\W?))i;p?"$A.8acc1S>=)1OJGi$P8*]+m]7^oA^16]FaNDLI7A?@/6S*U9PkQiNpdWk1&#\:Sc%hfnLSsK*Ug.[dJ9eQHO0E*4r'uY2#U8V%YhR![Y.Wi$4g>q5T$gZ-lUh`kK'W^gg!O\r=&cTR.nGJOSRQ]2ZE0lQ3*>$i2!V/+bUrsq89lSp7do+JM9T6QRCh##PpE?*$KDU?b>;tKpYHS>W03h$dq.ocp0V.~>endstream -endobj -67 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3540 ->> -stream -Gau`VgN)%.&q0LUFNr<1aW?B&SYEET/LQSAC/62(cFi?E-6\4#D]pO`qYOuW+@T/'"=pmfEQ+6b-ICu"l-fVAd.,-f^Ol[Ih$gH(%5:JC/\nSJ)eQk&LY:A41IFdgNoj(Vh$21a1u7_>I.$?.*t,[$MM.3?%6p#-SEWAQ=J"K-7Pfmp3A=*F$4C,Mp^^F?P.LM3_W7.?H;XU>QXfEQREe6[3pAH8&dEIlYH.XgP?,_1FmZhOR%Fd"V[f>>X*\*'mdt&I">RqehJ1eMeSTJX1P9gqtFjS)7KJpO0ISCGiidSq]eNs8Rq>VYfsCLPQZ5;d7VsCfh'+'k_c#b&(o1u?5l]/.n_.P0s[U:')X#tOdu1@ZH^KGIi2OA$*/8(3M]GLBNZ=HMhi1=q<7MckaEYXd.4:e:$C(98*iZt74HqXqW0U=7[PJ,9P6=TnmF-9AsASI.a.quaJi@Zc1U!AA8'21*k$/,mUZ]]j5U>%<$5m&Y(!-&YJU\aN>LUt91ono1d#/s@mI82!)=lg6ZO5Sr.0S)CF)[t7pNARaCPi0ZOO(d_5XKT&K4JOH37T0,r*A<6UlU7Wurr]:PQsEJg+^+Y4Fdap_EgY3R]=PB0-<>s*jh/$sChr?.G-U&]ATBHkn[5p2tfHZG)T>8bgs0?pb[K"BR&46dO3c='Oh1KO`!K`A\rNo8@$ff?fU,3\=-LXr34?+T(:[_S$44Z,coP]1B4\fc5heP&JDRR3/DG*6(8kW"m6lMBt3>Ls6U)/&urVj8:pG]l:pXL0`Q9IWAA.RE-;%4+,A=7&2Muq,a([F$b&rN^,BL:/\+`!3+J-:,?l0/lkPV/],7UJ]La&msbKI!U#]mD5UcW<]O5=5Br(Zj,JO"T0F^T?d&g%#b-^#WL15nW3`&F7A6$[UIa]+m3j(N:t%i((o\Hdcj8?FqY*]u8]9dn2'g.$>I%G#]5VDNZm;*BAIW)Z21jD(qn@0h(+^HPSA:[gE:^5Rb^9<\k2&k^omGDEj**P]`JO1<]1og".m7/5]7OK:p2ld(%`"+?t\7j$p7VKm`t,+b&F^`h9m0M;JU2P"sK-$NU4`[^LffT425ALhqk9^3XZrbLlAP2=P9s3c7GehWYN=M!^AcCUQArZhg#1]W?+Nmqm]Umo=>%KaGlJ0@:T8pjD:]j"e)$hmo"rc36cqAm<*RI*k@kT=UF.st3jFVp)`T<'a9c@Ia&SGbfZO3H>DfD&e[_Hoo$G7tNYh'm?LJ$Tm]?R'fJ;*,PR&!Li"VE*TP93%=%#;>!_OLXA4i?e\VbfOlZ?34)Z6j1^NT7PmBIJh=;L\/8!6#5\AHlt;:VsIGGW"9ar+?*Q.kDa]h[3I+C<5`Jjkd:'=PNA$0)0&PB\B,IFk$kjG;\L:qgNlK\gC!SS0lD(0;LSPi+LFe",gk=mY`,%9-g:3@\*FdEF@jaAA6;#6o!5&2cG'(".1Zb/L6#\q(\')(/:m0"3#qVC>Fd4dJAD"IlM9apBt1pINrJrbgW.j7dcN6UtV*,rf-8@!JZIUuZrY_(G@jm\`e(^'$"Jfjeg5qsiFMG>fAH>b,`Nfi_:Ti,iIR:W^4`9UtaT6KZS,fbCbHbt>5g>EWR\pAK(lk$P6P=N5a,&8!tM[_8ia_I_uLa-*<\j['Ij6r&\ZhH\.T#8tcn+]@%57RB]PJ>&05l--S#AV4cPHBCh=^F"nO6!i<^6lX;g&;#,DE%pJfV\*Tg1NuoXjSnJH]TgUQdFJqds1`9$0Nua5UH2W\#hlc)]=l%,ul\?9elC-VFT];^B?S$(hVtdK&!a.'f;!rIQcb(>h*_g*mo!t_-A%9i)`?qNujB_jOHXVNY-o"]$c@B4C6NZ#:`$G'Y-]X?CSSKFWU/g0o&`A%=slAcQ*o-U@S!nhYFq@+.dp,U[4D%oP&PMm&?j#CY`2OsiS3g>bXVhJ=o:\,enH+Dgkljs3s&j_`2=)FhWZb2mr\SU)LUTs>K(ZM$CY`bO3[?hDnr8gTs>*V+r(SZKgd`Pd,P4M[@&V0o,E5gI*kSg$kRfb&_i.Ag?a[q7\/-YTV+8^U\cXTKY7H&XsS>\.6HWH)5BQ/>lQS]^F/]_Y/J4G7&KE2n1)SpE\>^i?b.BoidSp]^2sO;sF6B!QD`eT"p%@d2Q[g3dKN0Q\^pL*+qIP0G#shOeMKK)7P\?*HJhZ[sTtP6K5ht7+8ME[Fe!0e\8jaB$Ck9%R@N9endstream -endobj -68 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4171 ->> -stream -GauHOHZRq"'*$j]@OKcCjj`9oUh%eWa%>[N2brXAmUS@U0*@&m`0__`P)??OgipL:_"U2?Q!TYG,SK$E?eF2lJl4nN^FK85[K:^H#kGA1WWnN*:^tNsa#geW4SaB!`\WU*A.Aj%!L>p2'RaNMF!lIP&*VdZ<["^aGik(Bj;TuphL8SS?pT>SaO`nDWJNMej,jtd2$DfWJr_"8.p/!K[KPKgRJ+_"NT5.k=ZS5)dHB_SMWjO,1HpC@]=Y7cr?8(ine9WFO*AXe?Qb.'nS>gnBTcr+(A!Xa$/.ogl-88Na@aH:(EH(IR2]iYj$pc6q"5U>Vh:Qe_0t63F;?lML1'&i&15*B\*tWDIFjnS-Dq%8o?3UjoP8RLKDb"t1=YrI%['"2'l+)<2:+gIaunIsVa`"R4d%X%1SM#;&5\b/7#L>L4CtJSVBG&2MT!US;#ZCq1=_#!NStIk[DVpBqVEY`;J9J.5bV2pKFYnNcs1uEcpS_,$&lAq4eS2]XeMh]1dns_UT58-&@#sQElPo76A?P2\5tcuadZK=A4!/:Godk^f-:C'#Ih(pcmggAEo2=I\d(a>3e=bW_3RK[!O*.g<@hst?Ni?SMlkdn*=]sK#lK)T.H01UI,VG2-cN"*Wp0YVi#@jZO#-;4^#:q#P;u,[rJ8A]A2mr2:\s$cab\3'!8H>hsD-/Y#A1Y.PD<[.?3W\7CRr">Ee@P-A@dh)-]]GXBWpp0P,%40X-@FpZiC8-=t8csKYW$r@bj_qPkVGWXa`VSn4cK6)[9(a/V?&qsPP),?jLrfs.#6T9(`4948=jY4t$*eUdnZgOM2IQ*;'n(M*Z#Jp579mp6e;g2d(VOZmGpcY(2!]jSjn`l97.D^17@#Q-CEfUhekGQ5N[JM.dI,>,2CI_lWX%bHU=Rl[j3SQ(!h1?V:^EaZUL-09%F4e#bn-7,_iYKNR]XZWgcN$2uM"me,/D]q39c<;S\J\NdY9OH@i66b"+c]3mH[8UO)!2udVj4O)=Qm".C98b[QU:I.TRB5oeG2FhF1JmDEl?k:D+k3]Wd>/;U&3,hr%"'l-l#-75QDgId0m2Z-Q8Pp0/h%C7F"YXIe&X3ahn[g"QMr5us7HY6knJ@%5"K1*G*BP>NiB:0`CV?9=QZr$jtA/#lK/0EhSrup$iJ;MK)=.^q&d&Y?f(c(ud^&!CN`ieH,"hD+^.YkG;geWY8PWMo37EAk'C)&CMA@0g_mEqqV4U54+IE4eA6)m,eU'Mb\7QYJ?1=saaSo/TJV:=;/U\5BAMWEBghiff'CqK>FjL'>4Y4TSi.gs6!ZKMN4:tq/@M_W_QrF"D"7J+_pO$H=HX>_&8"ngIP/*)*aEeu$g;20*d%9No;A7!<,B2dY8jTltjAABAGDL3.WV"Ajk6m5G`raieVm6A\7--Fo\*eg^crkS56dGZ(nPcl;&UeKV`_Co2&Qg:C`6n)SZu,^BSGl0_Pg\#D"6,u<;D\o'Jmka`e272oD&*j060A=9B^"dcYW;.NV5G0.LN"(sJZ1\h:b5%@i?cPLF=TDMMm=$If`tiS62LGA^([X8lY)5-Q"06VFOZ$IK\Q9Z2EFppu_.AX>Tj5DPu&&8*gc;plZC*9O3/APcqK0h[DjD&^!`L-D=ZdhDQEE_iQag")u+:K3uRHR4I?kq&_VWl->l`4[(=sF:eYPU(.6UYOAk9([-T2Me"Tn5mGZF;LC1b#B0V`\H%.hK7W#Ge3ms&7cG,'T^2_VCrV1X99H;U3fd:[4?&OfGlBjL]mTF:VoO!"?aaiC[.ktdLf)gl4W4urT0LU=1q>rjU]3Q)\OJ:(mS>C6gFKXL?42SU,Z`OcpoVie:j/0N:WJtaZVKOVE\nmcnVW#tC7cjS3r[)'Dg_mUALEHlJ4Xe"O"!O,.7N**#RkVn5@37Gnm5KCSpF7=-qbB9f%`hMCtoL(j40UDOAl@DNU9a]_lt"Skl/lTPHu$qUhX0ZPg]#IINPTuB3m/$R"CJ[5L?99g7=:_Gj]'-MqtCB=Ar-9NnLOjDNdO_Co0?CIG)1K-'$R4_o@Uq0i2agkO#e!/pMID,H"_CU!NOCV&j&lRCOA_Wf;cEM?\b;'c`"Cf5NE12Nb`e3JfW>=ej3MZ(`&<)mqB9BI$`UOet&:g;h>_FSr\q:kJ5_Rk])K2ae+^\LF0M]LU'sGN]4(Du;=`kLW&((qr(Zo%'5sA^egG*=fRDhj7$_Yk7la=Si#lY_GLk4a1K@-iX91J'Uj~>endstream -endobj -69 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3416 ->> -stream -Gb!;fCQI4.(B$G3JmYtUUgoCUQ9"Fk9R?LcO!G3L[^q8&"fh%q88M"3HPU5j9JW,Fkd9A4!%i6/RD^cdto)75&1,K+*l>LNt00`QLi.NIQ\e+8fHof"V-g1DF[n*fI8,"N_U$!FBkT?ls5*GNJL&B(4n5^N?1;NX'<#m(s*'G7).:0N6lC:hg"ul:7andPCE5KB/T'ijp%$eIcYq+)K1TqXJS/?f1=i]lrq)OHmM41#=!R??-fo*p;B4BY:]].'e!CNp_,4^P1$#,e23r(ODJ)6[NqeVeR?Xui2aZtH,ttOA04iO/CN]>*eKu7gM,0_?g@f#PIpNl9<=.*bV`?3pR$if.b>1nfX_]mBeh9>=upn(YUH<$QBYHn+at"I`W,qK;6k5/J6td&;Smapp0G/OfMCE+.R_opi>p,XlJs.57/'LQ4lSe_CIm77BOW4.JKA+)ts)_fUBWM'9NRhZsaNt%%W-u""?U*&bp>LA1ILSI:qa2?;1r*&?!)JRYpes%8:hV]$;q^*?dh7#/]&esalFFIe;[^9AP$FYaoR4P8AYgKo;EepRosBos@/7Lb]!-<2Y@Gc5V636=7k866BM7$V'JqkqO]\G",41-Q/Mnrj=2FXrgc!W8J5WaR^`Oj&Ad,q'V1<0T9+B*@>]IdXY`BNF`)gk[1uXD?m'-(s_.V=tmNG&PXm+;*'/dE1W_mk2QoG8J-lFjq%rmTqR\=kYH)'[DogmcO&KQ3mFg%:mlPE/!&:Jja@0`%=XPNje%M4!%t(jN+(S-m2lI!1M3":ubb'N3CNSk)L'K323oHLNd(2"3-SI_RCHWI+QGUZi=";*oNOdQ(/K85TdPUlNX`\Q[3c-@=BUApRA.+>$O8^aeMG[M@8=Og6i7n(sF^kIVOG8^IM,B9d%[^4YE\,>MW4$0e*C+1AI]BlCB,b]3R&e2c>UG]'>/aZKLS+N;h\:%K0"<6/f,Z'UMj5[V#kS4aDPP7e`al0&PKBE27ehh;8b4a,IqFLGjGuX=5,em"aft@%&Es@0Z>n&c5toY2m@as/3rrC3!UCe[7tO&T^DU^k&^E9bN;/,.2RD]g3Egd/=O8oRS"??1K^4@H)l\E;g=4;3]OQ2l?tM0TWDgFV?cuo)Kln7rqR2UJi#F&%DF"*^32n:ZVICj0F[:q1-&mNY*)+B;RHm44i>C650T@X(G5]7q2OI2'%VKC^TFpC7]&$h\EnCrm6ZIi@#;CW/*:>Vo*F)r?=8@qEmUs#qaRoTF=e6gqO;.ufe?=]UG]Sb#RKOFG;>nGc_79G#fSOVFM6V\Qqe<:GMk\&C,;e$u1amDU9'_[F;\uq+O8W22(TkNuBt_;@R+#ir\]/?4>*bgW^Q0">rCk[VZt+jN.WdkP4Ju7\rkqgB8E`>'0;t8%>jo_(RY9f'`2qqS5j[0N/9p@8OHi<-c?L6.61P+%6bRCK=j6-aK#cUiJ3HTkmh@(h]IZsB(OGq,S-ZuAh;E729qm]2Mb#tV9G2.`P+H%u/oP4lH'a^dQt)ieP]8Dnl'`_i7'V:s-,ZI-^P!Va;>\IP]sPPeAWdU-@j+D6(,J)20:]9%64&o^2_6CU:?19&WB*hT:6Moa:5]YZNT]DcPl'i"Cu&q<*RUL/U<]1W_:P]3)Ae48FID9iA)Y+1:+U?fhXDlE*orpOYYogGWHEu;2p/PT>F%HE.LPI'22:D_CRHXO>g,L$H'WJRlQuc<$V&]H&A:iZ)^/2#0;S*NIi/p:q1JmFu?BI_[CW)p+k!+OY_3V[TZQ9cLcaq`AQ!BF_WWe*W_6og?ESeo-.k(L4*mV4Mkkk9QpMJecZUIAK?8)6b4>M.**n:\FmEV+]%Q<[0<5,oYVp`2_:mi!hobt&0jW]8qq'`^s8LcjO7+UR),&_hTZ;U*e`2U\:3fWZC0M?q3ZW=&DIct3mVm?fs!Js/1O]9m\khEW9Aa9R?_CY#MPJs?>`$rf2Lq\!J=tFkHfNDVL1GZWpB,Y\H)Rr7FT.NQJfAAH35-PTN3pr#+63_BUp_cBD*e2W&#_")`JL>/UaPAkIdZ:sm0\t9G@JKJ*:Op9a^Pg%#PQaZmHJ>b_/37@*@)&lU#Y\jM`%#b'_](gFo#SZ\YYJ@d,:\KU+doLM8olLF)0pB@fOiH`e+USTD[Yk`egkL,qE"rGX\`)I2ZN4M+qn95d0^PGceeU%'*]Z93=D%>/QqFb`V)/J",2cO.usK1hZkP$k^P49mFp3J,h6Lj7Go(A_qendstream -endobj -70 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1927 ->> -stream -Gatm>3p&*h,$_rikCsDKdh#c4"1u%XSgkX(_dHGZac%^KJL9<^Y.ug,uW)kVa_rRC(:p+@Q(sRTo;"/T?^f&NA=>>Z!E!c+X\=o/Y8K,3dD`P:48(3,JaU0uq#(%e4XDVl2(G%Gi,Jtp%LlI!'p_2#n=PUi,e:tl0dUI?Wa/DEjN(!U6sB@2f(Y,;l`E0WT(!k-VcoH9:FkcP/ZCD5S\'P'4A1OV+8f8)^4Ql7=0F/([m;ST"+#.WlO!5FY@qG=le=Ylri3@ECgHRR"O>r8IF63kC:P^P_DA'9>g,7>I6uF*-S&Rd]MIoMk;I=35mG(Q?I$[AaE,D'$4a=V0iDcPjiBMb-i0AhC;q;9chsipsb:B8nVB7V#I6%A98A=M-eLEqWc1A7.]Z$aPWpX>p5/Z.OS])4'%7?dP^Y82;YQ^iD!gJ7U8b::PftHRXE9PN%XDH&,d$3j1g;S-@rg6\B%nN^5@UOJeCY&hGYN1m**B,`cNKg"K0I"gOVH%J>/Ed&2s+:]JB5*uCA9>g#$us7uWb"]EiKb8&^=WpqQmqeAFS]s$n\f!fZ]'#SJRC1dSIg'-PuSHZ[+(C9QskU;/@7AKA,d=-ZV:=iA.(k4V2Z>q2ZiYL3XSg[NRLceHl5beUiYM'JMrYi";8O[_Ug7RBaV3u3&Yij3)P?59,uAKm_sbQMW;j:p!Hu;!eH=GX]fdK9Ebe@p=P80(7/qoG$)[J6'afe-q@iPNt9u:k9RV`VAfbqL"<1%Dn;@>7@CJo`e*)FXdlL1%HX\RV5o51NDMoN3I>hToDRH(jOf4LRLV>a:6qT97c@^,1P!:dU58WQm7TBguJJ]&s\e?7G5RB;'Xa:\0/B=M_.>KBCPGLarQa"@k*?!a,iP]3t9.*8"L]BNkUq1Bambne:o1dDF1f]?n/&cQ>::kWZ695B;VP&qPmSQ<-["h#p18I&HHMS6/8%6<0%DiapS&!=GGV]XgK9G'OTBG+f%4s5o>0Gm5r?"*5t>Vgm<$)Uj=L,+f7C`cIY`h*/(j[W@/O'WZ98U[R[n1G]A0O)Rf;=_!&VVVWtDSg;lT>`kp2^j]/*3-=WiaLp8puELF>*V&R_-=i9gt:8$KQ%0[%]D0o+2]81iI.FqdLh?_#5RJ`N2*ac&`^<.Oic>TJhYH#h/4f"s^4Tr8Emm)KVWJ.][mKMrBi*LNOFs/B]:JB@Zk])Z-1d<=@N,F&:r?r4>``J0(Y/KD0kpJrBX/^>X-,~>endstream +GatU2>Ar7S'Roe[30.s^clsc5Z/.*0"!*W/@C&IX$rpGaN*19r:>h=2A@dCc.jIqj-jbaSi;2RVCqdgL]fkp*50%0.Lr:Hp3,kLMN[;O1?(/JOCZ>")3]tqA<)4Ok:)8n.ZXGbsa.NC%#Cg<:89drOA+(6Rq,kf)oJF8WT#lQg:pO'i+FFFadil-kLj4(5u/VrJOM^8Zp9t23iH]*)qd\=5AI3iHd6o\em#?N?a;IFTOc;fd;7)ocejfb5#l%7.9E`1/0K!B#Sq^\>Ah+o<7sZ_H>5)4rYit3+::gBXA2jsRC\ucO?Nl+]WWtX]LC\OVLUn)[ArpXE:Z%/O3Gh^92Q[KB^2U62okUq4iO@ij3(MJI04\\Tk.4S8]aMo+iS2G\o:tu6*?ne_(1mg2V(.D10[S=:GY*UlH:l>*:-hS2`9DJW0GOJ!b90fQBZ&KR_Tu%#AD/VO-+2$M,e%PGiW>!7oHoH&>]o2LB$iD-SlCi3"^Mpq7[BdO>?BO*N(ng1G]HOr`rjZ)A+n]7q=JJBZ=-]&@1*R%8M+#9,4X8=BimiS!mbZ=03ITr3:*'9]+OQpdo"t]`SZ7PqO~>endstream endobj xref -0 71 +0 27 0000000000 65535 f 0000000061 00000 n -0000000145 00000 n -0000000252 00000 n -0000000364 00000 n -0000000469 00000 n -0000000617 00000 n -0000000765 00000 n -0000000912 00000 n -0000001059 00000 n -0000001207 00000 n -0000001285 00000 n -0000001433 00000 n -0000001581 00000 n -0000001665 00000 n -0000001814 00000 n -0000001963 00000 n -0000002111 00000 n -0000002259 00000 n -0000002407 00000 n -0000002555 00000 n -0000002703 00000 n -0000002851 00000 n -0000002999 00000 n -0000003148 00000 n -0000003297 00000 n -0000003445 00000 n -0000003594 00000 n -0000003742 00000 n -0000003891 00000 n -0000004040 00000 n -0000004156 00000 n -0000004536 00000 n -0000004742 00000 n -0000004948 00000 n -0000005096 00000 n -0000005321 00000 n -0000005527 00000 n -0000005733 00000 n -0000005820 00000 n -0000006140 00000 n -0000006215 00000 n -0000006305 00000 n -0000006411 00000 n -0000006540 00000 n -0000006694 00000 n -0000006802 00000 n -0000007030 00000 n -0000007196 00000 n -0000007488 00000 n -0000007610 00000 n -0000007779 00000 n -0000007901 00000 n -0000008015 00000 n -0000008137 00000 n -0000008266 00000 n -0000008396 00000 n -0000008582 00000 n -0000008704 00000 n -0000008822 00000 n -0000008933 00000 n -0000009062 00000 n -0000009200 00000 n -0000009335 00000 n -0000009424 00000 n -0000009520 00000 n -0000010868 00000 n -0000014190 00000 n -0000017822 00000 n -0000022085 00000 n -0000025593 00000 n +0000000122 00000 n +0000000229 00000 n +0000000341 00000 n +0000000418 00000 n +0000000623 00000 n +0000074191 00000 n +0000074459 00000 n +0000074574 00000 n +0000154198 00000 n +0000154467 00000 n +0000253784 00000 n +0000254054 00000 n +0000369715 00000 n +0000369985 00000 n +0000370191 00000 n +0000370397 00000 n +0000370467 00000 n +0000370748 00000 n +0000370849 00000 n +0000372596 00000 n +0000372867 00000 n +0000373754 00000 n +0000374417 00000 n +0000375536 00000 n +0000376049 00000 n trailer << /ID -[<36847aa6eb42a713708da2ef65affec9><36847aa6eb42a713708da2ef65affec9>] +[] % ReportLab generated PDF document -- digest (opensource) -/Info 39 0 R -/Root 38 0 R -/Size 71 +/Info 18 0 R +/Root 17 0 R +/Size 27 >> startxref -27612 +377358 %%EOF diff --git a/docs/GRAFANA_vs_others_graphvis_pivot.md b/docs/GRAFANA_vs_others_graphvis_pivot.md index 46f8774..cf6fbe0 100644 --- a/docs/GRAFANA_vs_others_graphvis_pivot.md +++ b/docs/GRAFANA_vs_others_graphvis_pivot.md @@ -6,6 +6,10 @@ _Date: 2026-06-02_ --- +--- + +--- + ## Table of contents diff --git a/docs/GRAFANA_vs_others_graphvis_pivot.pdf b/docs/GRAFANA_vs_others_graphvis_pivot.pdf index 416baaf..50accce 100644 --- a/docs/GRAFANA_vs_others_graphvis_pivot.pdf +++ b/docs/GRAFANA_vs_others_graphvis_pivot.pdf @@ -2,7 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 15 0 R /F4 17 0 R /F5 19 0 R +/F1 2 0 R /F2 3 0 R >> endobj 2 0 obj @@ -17,254 +17,77 @@ endobj endobj 4 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 716.2874 129.725 727.2874 ] /Subtype /Link /Type /Annot +/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 705.2874 115.477 716.2874 ] /Subtype /Link /Type /Annot +/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 694.2874 112.821 705.2874 ] /Subtype /Link /Type /Annot +/PageMode /UseNone /Pages 8 0 R /Type /Catalog >> endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 683.2874 176.853 694.2874 ] /Subtype /Link /Type /Annot +/Author (Android Cast project) /CreationDate (D:20260611175425+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175425+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (Grafana vs Others GraphVis Pivot) /Trapped /False >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 672.8499 100.53 682.8499 ] /Subtype /Link /Type /Annot +/Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 662.8499 122.2125 672.8499 ] /Subtype /Link /Type /Annot +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2776 >> +stream +Gat=-gNV@2'7\>80opEDN%JCNSnO:1p\WYi:$A0sa>lE#(8-Yl?-=R's8!bXp]>6#b970(,L;>2qAWjnN\AhcSu"r&e($"mo;(s%%?@Qag7A``0rkbs5)J?AGRhp%1s[ttE.u%UKDBH,<5,ef`cg)P:%>Pts*ad+lQ"u$]4^Uj]n:_&e%RC`]ZJ`_j?Kp:^j'+O:04(SLB/iV[pWUB0_ijp(j,W"+L\0%[W)f?5A?Lk4jMd+AqT9='%l/LNQ21!ti!V;i*NAFEn@31950*+eJ"408#k]P3N7D6CXgCN6r$"TNQKP;'iFKpP)fm$EebPH/u7_Z.?tPgeA_0->KMBT[?G.'f*.k_M$d_>ZV&5K1ce2uPd8jU+Z7AlR>1>cj0N^%6'hF"1Xj/G:75P5L+LS\b/gq-;!M]4.i9UMLokXK\oEi9);B=7H"^,?AE]SAd;o7%^q`QAmWg)T6P+LcA3/,;SM*&OGcAd?gcQkK3\`k?@eBZR&8`c\:_HCG(&_Z70Oh[X.R1r;HLZo8%1Ukl(7R0A$]lX_J9F\rOpE#g\C(2[T?+a*M6*@nR%OCb-#&Y"AaRNs5Vd,lq4>K7L"cJ8LuG^felfW=i__G_@>upn-j[__69B*S$KCe^f0B.\D_!1Vt(.MW7(J:qcld!mQi\ej>,]Xq9-B@>SHf/6'O\,R92\+H52[$7Qdp9)9Ng\3YNneO5/=XjHtfQGt=bSl24I^ni<]YM#,(]L&QP&2'[0nft(Bb-fCCKB5RoCAV`0JO+j"B/pJ)C#V*=E#:&4XuUhBGfUV`L6H8-Yk$i%j2blbBMP".Kmpua/'[0a'=qR\#]V&RV'.l+26Ru>@UI0^ZWp&]$bB5"3s'A)(t+H4R%5sM=a%43[$W3Z4=G'3o.\*N*-G?C'&XDHk$$UbJEsYFg"S,dr&+R\L@>"fc,,"3Le@T1qToKEgU@M6;T/tedBSANrQZ89N3+Q=(Yi_64j=+m>I5gg8IqiTReLVouPOQKD/,P#3n?fG`W+oG'($p+g6L8_6CK_2l@ROK9[(_@T*=)=,!KW+,*5pYrt(Yr>5F.-%@3DSQkk73WgpTPmfqF`=t2heO((^^kau69`FhYhg7qUHC)Q!cqM_'\nhU*5uj6\i-BYAf%Lg/`(2g!sNnO&N?s%9Hi2ja'tudE=J`_UO[7IAgMI$EBrO/Tu'B:QE!RgJc2:S#rr7K=K?kA-!mGL!ia*"5D/n[%$gYS0m67Pj5neGFTrp7O'`\@e2HTKY(6^5,Bemi?K\A=kE>Uc9s_K^fki"CZ"jE/DZ^2*\iCVD6\.H3p^FW,Vs$aLn29BKkNaZXb[XUef!iR9S=G5m.JspFa#H2>jP3m5o\JY"QpC>0E$0D^VZXi2ZgSg4pC/G?``$daH+AKBpl(*pTZS^8ghfAu~>endstream endobj 10 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 652.8499 135.1275 662.8499 ] /Subtype /Link /Type /Annot ->> -endobj -11 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 642.2874 130.157 653.2874 ] /Subtype /Link /Type /Annot ->> -endobj -12 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 631.2874 189.741 642.2874 ] /Subtype /Link /Type /Annot ->> -endobj -13 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 620.2874 159.501 631.2874 ] /Subtype /Link /Type /Annot ->> -endobj -14 0 obj -<< -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 609.2874 98.59704 620.2874 ] /Subtype /Link /Type /Annot ->> -endobj -15 0 obj -<< -/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font ->> -endobj -16 0 obj -<< -/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R - 14 0 R ] /Contents 36 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 - /Trans << - ->> /Type /Page ->> -endobj -17 0 obj -<< -/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font ->> -endobj -18 0 obj -<< -/Contents 37 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -19 0 obj -<< -/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font ->> -endobj -20 0 obj -<< -/Contents 38 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -21 0 obj -<< -/Outlines 23 0 R /PageMode /UseNone /Pages 35 0 R /Type /Catalog ->> -endobj -22 0 obj -<< -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Android Cast \204 Graph Visualization Pivot) /Trapped /False ->> -endobj -23 0 obj -<< -/Count 12 /First 24 0 R /Last 34 0 R /Type /Outlines ->> -endobj -24 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 25 0 R /Parent 23 0 R /Title (Context and constraints) ->> -endobj -25 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 26 0 R /Parent 23 0 R /Prev 24 0 R /Title (Executive summary) ->> -endobj -26 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 27 0 R /Parent 23 0 R /Prev 25 0 R /Title (Option comparison) ->> -endobj -27 0 obj -<< -/Count 3 /Dest [ 18 0 R /Fit ] /First 28 0 R /Last 30 0 R /Next 31 0 R /Parent 23 0 R - /Prev 26 0 R /Title (Role-based graph packs \(suggested\)) ->> -endobj -28 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 29 0 R /Parent 27 0 R /Title (User graphs) ->> -endobj -29 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 30 0 R /Parent 27 0 R /Prev 28 0 R /Title (Slug admin graphs) ->> -endobj -30 0 obj -<< -/Dest [ 18 0 R /Fit ] /Parent 27 0 R /Prev 29 0 R /Title (Platform admin graphs) ->> -endobj -31 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 32 0 R /Parent 23 0 R /Prev 27 0 R /Title (Estimates \(engineering\)) ->> -endobj -32 0 obj -<< -/Dest [ 18 0 R /Fit ] /Next 33 0 R /Parent 23 0 R /Prev 31 0 R /Title (Recommendation under your constraints) ->> -endobj -33 0 obj -<< -/Dest [ 20 0 R /Fit ] /Next 34 0 R /Parent 23 0 R /Prev 32 0 R /Title (Implementation slice \(proposed\)) ->> -endobj -34 0 obj -<< -/Dest [ 20 0 R /Fit ] /Parent 23 0 R /Prev 33 0 R /Title (Source linkage) ->> -endobj -35 0 obj -<< -/Count 3 /Kids [ 16 0 R 18 0 R 20 0 R ] /Type /Pages ->> -endobj -36 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 737 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1790 >> stream -Gatn$?Z2Df'ZJu$.IL\,WLdu+mk*joC/VHN/_a4"a9@?D!LqahD>3:-TM;mDgIR$[5_2,]n(+=1oqBUR2&?26L9q"KCh7$DrCQ>=#f1mmPmZV&equT#FHb[J]$ds[>0@*S$X9qSAFTPCREDTWo3/S2P5DdX`em.fbY(kS)D!=oYp<6b3hk3C(6SoQ:kut!4k.[Y4"ON(3dKT:Apn%IB^Lth?"OpR2Eqo]s/D,+*c@=Z/]5\Wabhps6=#Za&;qBG8\\**4hq4c*FI&jjZ+U_2[RPnn\;&F?1!'Jc=4n.-S:BU\\`8mWf!^+UlC+^FboV=C):o*$H.8@8SelUJZ31J"jJh&P1XS:OM*9b.+_.dLmY5AFYO*,D\6!ta0)ph?F4^eJmhUN20^JGs\lROrB9m>T8iJr>NRA"O=9+Ol^LS5"~>endstream -endobj -37 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2911 ->> -stream -Gatm>97,F'%c-;L@$sc)=k)3j.W*XKkI-qgFa)Lm&oFu&X!HfVs8IV7,qFutP!*/aR`M92&AS;V?k]d7LRi>Kebi9[\f]=%:7P%q#1+7K]mbBN`LW,_(j7lZYJNsiUU9:/+uI6bnGnk>Ui$bY%3T/\S.a=Aoh?]3-rVZbX`k&B#]01L@@RXq!f7XT(@o<>Ugf4kF4,KnANiYni>%r^_N)lE\o:&r9F_*SA'Jgoh`qRG8k(f;klscgVtR0\M%WON^^+e8C]%D].`aW&um?*qH25@G?a\"qn9$aYVWfdG__rSMhcnA6in+I-m\jLJDuB8eb6]H69m'/(eZ2%64="7O>OF8@.IFMOXB+_6n%`=)uauWn%Q-0&/#Td08U7h&97=&(;*X#9IY1#m*f/jf!n(A-@%o=9!7;`\8j4e4fQo:>]3=Sn*>->qVejgt*lWEM\7).Y+`,uL$^$UQiN!lW]-pc.]2E+2/%F-ZB@+5oO!XFifK*W#`=7H1UbrZ>(`TG%uF:H>OA[G5Knfr0i(AbKs_D&3u'Q@49H_gnWe.Wq:B.;04,KKI_YhVfXLCmX^mn>j]CN=gW,Xa43Q:%/B7`7_0_<`g;;ZEi-6saMa9@d;uF.N^2@dD4H(LsYN4Q?:)(BY2#q&U+3>\6jgi-uY3S-0YMs$H`E1j8tNc]V%U5f>st4Q8\:d0l+st<%NA*1hB!^]f>FQh`l@"H\X44\m2p>,A`+29YE1BW`\9gq1J+rhXMEYq0E:iL!7'6/p9p^o(cFGt;QKT:,p/*1[7\WYYs2l4DC,g4r^lj%O46lK.`5?$8B72S*44+4eWmp9?tVk+S>iB;ocSfLsB/*S$u6gQ=(-AfsW*noh`/'%un3HU+M'm%HJhp3BLmdB'.jTI,P&Zl)'@2m%WK1**jD<1laq5J)$F6W&&?k0])X^L\:&bZ2C=3.QeF\KgZp,TGXm"nAlgd8@;8"DGU8$=1GT:H+^70usHYV4Cr!Z4/1a\d*ubh+f!lW#]3kjL$*7m@d*mP[FH=t8!<3&?2E"#R;$9G5"c7d,uNA3c.b-G=*EQ6V#Rf0=TL\V!K2*]f%Fl?GAHedaq>;uQ5XgX#S\CCQU"OUCIR%h6e;?M"BD'Nk3,SkQ^#&9i@Sg!1n)HY'\uD\VL17'l;&;rcj"qkNBMq5mSMT0F2:RZ@h92LRYLj4eqsFS;)?Vhl`&>VQ)'G8(I)_=7&k^+L6bJQgCTaorQE&M^Fb$^O.g5!7MKZ%:&;mgPgR"X@IeE6iJ(='Z)@+_r]SBOlPf5`OD@EY.d>#AI9U4(Bdgl8;+Jp['#tFcO;,g0)4hAc_40B*"W")Pjd(Fq<$TjkYQrp%$s*)R4F/Y]#CWM>j8gHJK\KbY5gnCM^Pcc,iu_]o-!VaDoHIa.'o"W+%nZY.r[UQ^"D:`k?r9J;jIWOI4&rQ;Q]]:P,WRT=tQ.N!#P0H9HbXncW+^$6-K`?h*]DjmS:[r+cq`K)[Q+DLX$#,(%\4[dGE!)%u:./REhT-#]p@I--)sQ`KhLl5[cBqs)~>endstream -endobj -38 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 860 ->> -stream -GatUqh/;4+&;BTM'QZjT,2b]lh)jiXY#Mg9bpcHa,,]U9W,#Q.rE%O9h\Bk@UJ2QLP!r1!Xb)otSX0nDJLfjh0NJ3Fn+bD.E[R?Sc(hB1kf24&-*=<05[1dF*!ZJCZ%L=u%eE`$pM=;EQi`f=F[BU[V"dUQJ-h,7QW#kra6DXd$>k1:IHuDh.@Z*S'#5_u&lPp;U%4IWcd'9Z'+mJi:OH#j([V:gdmi/7;H9k=]a>d13af08pm@5+\kZhgi_&$;+.cuM84bL@[[PO`F1L6[V1`DeF9Og)-I$`K;g==[@J%arrh(;K>FQjZX?Dh)O$;nMa%P!ofh3:K504^`$NpKYHfKhH0httgrr*.!P==_T0k.Q9L<:O5?V9!LI)IS==.kI?+7/Y7"=nGepjar[cGNI.*s2.,7VDN33a@B8`MhrWc?[/*u*Wk9RtgA9b-i<'<%J0%&OC=I_&_#L8!r9:Ojo$J#(-!m11t=8tn`TBJ>3K:"D3le]nHjEbi*=fh6^,+R)><7*1"$,*:U8fFmBaT3BOqu]DT!Ik~>endstream +Gatm<>Bed\&:Vs/R)cS5NFhpS53:40GIMpfVEF!0Ym""j$S0Drm'#`oA7c<#H%O*!Hd-lZs4-<0a$9!kG-]GhNI5gkU%]n%IK]!$**CV4X$f@,bln)]3f6U%#m@.Q(3"L2If+3/s+>.e_;fJrs`=VK)Cj:/R@6K.f4[ug5'&#SeY^\QB8CP24U6M%X]cFG0jf6KS.o$rih.XI@Lap=')EGiSi5fJlaVO-'m7n(L7qKGk/!3N&6K45crt'1lQAbSX>/,aFru6rj7!;,)*uDX11Sl3n+Nj=sr]4),:T0Gj_j=M`>?[AqYq[TgW&A+`h5gi^rq`iJ'<-3P*c@_"[R24*!^7-a:[\\"IF#R^f.b]JatdcBIS6:"H\^)g#[a_hN#FmKRIuf:CE5H7/4!^d#cc(;WiC,=*n<.;T)rr)@LdlB.G4SN<65No)8$=L!f=keBqe#dK<%S_WsYI"`L\kl]`VDL*4)dbYU'sNrq/Fk-!?f0$?GjRP\[L@9BBV8R_4f\#YmWiVe%q4Jt6c(pS-XV>I)FnWm.^1:BKja4%FfF4+o/JSqVq*_>`@H@j0[d$#['G!a@+:tl=(dc9([l8M5]aNk&i8Y\fVpqbCYnUY+5$5!p*-N"@X4P.A#?`\%$>D!b:FqhjUJ:D^==q-/E_j#._gVRfbmH0?I(ZM9r=RjX(_#F#HQ/d^>e7Ceg;5/V)l:A'-pF*3]gDagierGWnJp:,Icugn^2KG^IHhlffJ2?L7\^%b0YJ@[Q:0$o3b"JP&ZGGOL>@6$&u6^+U.DG+T6J>P3JcsXbDAE(-7mD1@87km6o)0oN`iCD%]NUDb0NM!LC"rOHBY5q_O4BLS>eB,f77.BG9%i.a;shSW'u&.RkomQnGq+;DiNql4FtWeiAn?-arSSdeet"+SaUYX_d&3e]ou].;VQ'G[Ac:[=-TjOX/WhqRPYY9Um"X4`>S5MSjMJ)oih>k7Cj`C!uPWi"KJWGL*VU'TXiG"$6"&,[3\pP'brr.+DaFWY!r@h6b:$85G@Af#5uuYJZUhVpi6Tc?6$I@o:BPVTs"AjQ;6lU[1;FY@=!/r?auN6^G5'WToSA?E7>e&X7Qf[C(:/CYNg%p9Y/bbdS5os[[Kn<2OW'!Vq,sBm9gSI%7rq%Z+#A:hR&2[nLpgIF2e~>endstream endobj xref -0 39 +0 11 0000000000 65535 f 0000000061 00000 n -0000000135 00000 n -0000000242 00000 n -0000000354 00000 n -0000000501 00000 n -0000000648 00000 n -0000000795 00000 n -0000000942 00000 n -0000001088 00000 n -0000001236 00000 n -0000001385 00000 n -0000001533 00000 n -0000001681 00000 n -0000001829 00000 n -0000001978 00000 n -0000002094 00000 n -0000002386 00000 n -0000002464 00000 n -0000002670 00000 n -0000002776 00000 n -0000002982 00000 n -0000003069 00000 n -0000003387 00000 n -0000003462 00000 n -0000003567 00000 n -0000003679 00000 n -0000003791 00000 n -0000003961 00000 n -0000004054 00000 n -0000004166 00000 n -0000004269 00000 n -0000004389 00000 n -0000004521 00000 n -0000004649 00000 n -0000004745 00000 n -0000004820 00000 n -0000005648 00000 n -0000008651 00000 n +0000000102 00000 n +0000000209 00000 n +0000000321 00000 n +0000000524 00000 n +0000000728 00000 n +0000000796 00000 n +0000001102 00000 n +0000001167 00000 n +0000004034 00000 n trailer << /ID -[<02ecb336d8253da2310f8b926dc86743><02ecb336d8253da2310f8b926dc86743>] +[<1571da02c167125d1563843e17c9f30d><1571da02c167125d1563843e17c9f30d>] % ReportLab generated PDF document -- digest (opensource) -/Info 22 0 R -/Root 21 0 R -/Size 39 +/Info 7 0 R +/Root 6 0 R +/Size 11 >> startxref -9602 +5916 %%EOF diff --git a/docs/INFRA.md b/docs/INFRA.md index a774bcf..073bffa 100644 --- a/docs/INFRA.md +++ b/docs/INFRA.md @@ -17,6 +17,10 @@ --- +--- + +--- + ## Table of contents diff --git a/docs/INFRA.pdf b/docs/INFRA.pdf index e871b77..204e830 100644 --- a/docs/INFRA.pdf +++ b/docs/INFRA.pdf @@ -153,7 +153,7 @@ endobj endobj 27 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 production infrastructure) /Trapped /False >> endobj @@ -247,24 +247,24 @@ Gatn%9lldX&;KZQ'mk$`Xb$QCd9E-ne'<2!WCqU/702(<@u3f%WW.A_E8oH4[Ru9_Cl]mY5-3UB]+dB? endobj 45 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3271 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3221 >> stream -Gb!l"=`<%c&q9SY-t'<1B#`e(;:I_]YoP4P9Jj1iJcuQ"'\/A6:i%aU3VLYqp8r3R+t4R-BbDu$Y@s)kdNQZJ7,<)>H>Y_#&'fDc@*JRUj9_$`_)#muX7J'1PgWY@nB?Hf?S"fm#6Q]I6O(K)$5.QqnZPZV!ak%_+>da@cRHM+M^t$aQK=!I*Q,CG/clqtkCD9+q*n'ga;$`90B1q"+J;Q8m.bcYW9(i+k!^GTnTJC;SW38chQ+7+4jN,i'Llec[8Ae8.LkeXcqhS'<4f,u)q0n4(rJ7BlV+8[;DU"`J.C,&qW-eDIU%`b$l0;`fT6DYMSuOl:D%?5Ho858mYZIC'+>d:&cFlHW\/juCS%$3E,tIrn-8<`2Vu>7r2Vim@b=?qF[^Yd2]]HIOeLo][r8(kL`EYhjXu'">#5#LaNif6J:a53\D2Lj2@HEuIrKY$]L`6fS<%4er[:MrW%hhjcRH&(/\kPR2tg+C"ErCdTHt4(7okfe)9cle1*lIgHuJkLOB=[;O(?h#_sO=L&s-#6$,8N\7LYZ_`f;deDaS"R,S;)aF>O+h9Kk>&lQBiltCiR)2E?0-'^:$'mq@H8tNLmHbfV3g&T1?(OFC+\QE`e-jAr7^JJl[iZ9Sn(uB_DXK]:(6U$-+`>lSa9gW25lk_t$o#TLXEY3UKr#Rt2o-KDh0MX$$*E*pFjLAf/pe\:L\^hV^Ko/-T'eh:D(fL1`Z6&@\M`8i$#qY@rG^e)-MPWNDdX#*5N)!s1MNRdL8dN+1bT7!;jr3E:YnA[M;Q_8fOLI/Z-a(tRJ'8OA_!-ZWBq>=CuMWI*YlfuFiFYit$6&\1@38O/$BMr/UD,J]p&N6UVs5nVr7YIj6pg?pts0(pMbYAkmAp#\;h)=K6o;[U!`I>!?IJLV4D5MIc;c^hp"8]#^%Z]#nt/*5k]U?E0GQhUFG!RU%70Ap'eH!6g_7"-I[9H];XbNm9o:UB*F"?YPT>_K$%M.<\rVV`eA(!-iHaH7Yo9PD?Y4j@rfko:d89o3bVg/j"://8j_)+53&(5:Nb:j@")"6j'r4hnEL)7,h[%i(Mc*='HML>W`>M<)eTT)qRZ.O$,^XM8:j;%,q#Sk8mIQ,mWg)45lVNBc05,tFJIdIU-Hf8nj0"`?Z]Dtm`C?<#%1<*nA+#S+EXjtkg@:,^@MAhb#i3B,'7H^!=3mXc8Oe!km]#ktuHGAm/i/\4pB$D=b]k?,S]g/sR_4+P_2D]EFg(1.GqSR1i_Sa9.^W(Wt!(L8RglnY)VU\*RjDrMBRq>V]m504@s,j-;hJek?Xm=0mp8be:?eq2?q`ZL\25o0hSX0>94@C_%YolfL:=i*Ip)mR4ksr0_BaS$9%,%(D2c](5$rZJdRj%AKJO>a>F<='Gm()e;HN9QU&*;GpPR9GCV?=([hV(`ChDtZH4P0,hq8*o`Pm(afo8[bXG4K51P+d#Uk=J`.G[S/$.@B9h2YS8f#;p9$s0I8KA%a#X.g1-KWGgajsc%X]S!C'ZmZ*G-%BI'%aDqI9BmYBDKjc%G!'e6["J%"m?m;g!XL7h?m1BM-5-hbhd(,G7]IlbT3P^cpZ9=<=9nFZlGmkHHpM3ds5E/%]3KKmq'R/rY=?5E-ZHB@0gcB'd4Ja:aAKq5`+1t;.;GWF[sMab-[MiC@mf]r,=UU`teO"V0l\QlI?Fbm9*MuW)nE,TTEqO(hqN(*Q&TqC/peH7U-sKa:&N7o6Bg8>CGtF`+^2[*laT.)64=Wj+4S#?1F,\g$Lu$lc"O.V2$[7B4Ll(\6d[e)WMI.*nWX?`kLi]]E`U=A+^17]s3p[6W__tl1SS/CG6/^SbJn0iFLioD+Fca`K(5h6KLM09le/V,#k4k[n\!s1N"hK73>%-:cru%Ma%IpD3AbL$L#ERHKPBZBrml$QOJ6W#FPXN&ur"t%o?i6qCh[);gHc>C8l3)k_l"p0*UDO>/u3,(UN"LF!-U$X?YF_:?]g3d&5/e$9+YDJN!:3`@Jg*pWW%S.h%Vl!Z&$q-DEuE(C0#b$N-IY@Xu+Yf*o_nA6K$6E29X:qNIB!M:AjXZm'YC0I0"A[FX-7@W&W\$%nB:*EbJl.rV3gcM!p1hh&gUlX9OZGj3$ZE?]RR_N(j8\&Tac]O2aQ?Xar'C#hALKb_Uk:pHUT'gOj\Y"FSRZm0DAB&dKMMkV6Z(_U)!nQ54N=1V'"'=8eWIDKo48EQN(5YV3G/0LZDiS*j/"E;"bPQbl8VsheQX27V\Fs?b:[r4#hQp1*]H'@_&314',-fj8aJk:5b4iji&4TB>:N"/(cS$?^cGP&fm@,f])8P"ns>D!H_=JMn$4naendstream +Gb!l"D/\0"%fW&,6/Z^4G;gO6U\F,QUe.&!e#bS!?#`,[5`s*q]!A,sj>?[Q^\p-eQUnDgm;$^W`D(/o7c]XNOq0RQ!]%J(n^lRu>V&-dVgq*BYl[?=)D#daC2rgrM3?37FCJ@`XFY(g6s"47n&&SH;(63VU;LFJMTjsrObBnPq7Ydq7O>;AOleDA]293JEhH/3S\W[L-LKm`#Ra?EaY5p\>Mh/Fp[pLn&RNS3e(15AkBP,%rTXk,\La?`t(Z(6MTc#K&GM!YF%ZWicD#D*p35+JqnN9u5AO"F-E\-+=1\Vu^fN'itO=T91CKj\tZGQ754`e"HN.hdkr'FEMm0?.C!lM^-^8ik.Id@fK7Y`V-!PRn!WTcI?-9KuV-kgSQ6(oD<0eU"a9RW`!J6GC`bm46Es+S$b&/*.M0+)eIei5cCmW$@'ccoRgP&:gFdGEXmC"Q:S^\#Ln:Ds50&=[oh!1J/r:Ke:TGrIBqlnq&99s\&7Km(eWn0]%e34h;E>7r3()LBnqVh;4'K0B_U9d?ubhnRoZbeY6NUfHLo6Y%8Vk1tq4ZhC(M+UMW4`#;&dcK$Wk4?>W)7&2OBh5(7aQqY,peJ'S&M=Li(V$)C>X<7#/[qSF,q04@h`#A!s&5!>e2g]P2g1A/6d3'W=Y)]sm[l%4:>+%DREr)"Vsqfb4m2Cq'N,HEEatkN=Iq;%`PgDXLj-T5Y]tD:oD-QXBaPpAc$Bs`J\,>=5f8feB"3R1:E^!Pl,Ck@0aDU*?CF+t2K.A3\-M"WHQT&=`J:q;>qPIcDEjn5cfa>I45#f*CVKO@k+M&:dDj!rm^';,?nEooipYJ4@Sp(Q'kk>=^-=ojnZ>@5gXe99=$GDr!P/'?>l.]RSQD6,:'NM&AH8ok!R0\k!PBld0S`^6n>[>@4C&i?X'u(4.KfIL(r2qO)8N:hJ5SHb"^c@sOY?QlL>>H5B@o8=VBV0t`ro!k[:e:SS>b!p_'#U`p/+YCXf>">"GOq*e\f82#W5S^H\,jo',iL(."$)6=sR*s?1hBT5`p.L]qFG]bHHt##Q@(^DtMr3'5EGYQN`47!ONX,S:CGqMeET-=2eR%Z-`)%:cR)ZQ.XJ#*,N]PVeEqs.G]`jBclp7p`t2SHR,QP:-W4&8?Q:0+f/p$m_.MP5$S:XhH"&b[(#,n)p@qo/H.#T3rI[c]Ef"8,TULOJC2Z5^XW.hU4gup)pRo9E&/.O4urE4142t9XD14QY).nLo+A;pg?&As/g&k]aVUaHR`Dl2i):mp&T9=_nOPh[Y^_%R[[(HpFtDRR`G.i7[;I\IdaFo[55LsqALKlm-7=M2RpP7O`231hk.@S*hi*g2!VNX8]RrP%5eFK"#VM>M--iKuE954EecmEIEV2?/BoWKX$;gAV;^q+Ke_$YItVND.+J7`s<1q,`LCO;`?nD&(bfUBHKZaWO&pQBHs@[T@)Ca.He)t;LW:`7+'Q/R!]5%7C`O9.s@V75$VFT_jt'H9f7_u/[_qDTW'EGm%1YB-7e22M&cmp?lm<:L,7#u8q8$X+l0@P-I!aoE5t;Q9S@YmlPMh(]*p^ck1O&&i&cTo(gWL(TnHMiep^tO7ru"`jC86LoB?Qj,ma7^p)04$8Y(WQEGjtD8W*=ED#`J#5#nT)3Il!AGo5A+PppCIETgGA];\9oBV9*9%>]BbNB!r+9_XRd:S-="h%Lp-0pQ5Z=t8Xtn[P`C[C8mB#+k/Uc()3)DL;udZ@'YNpb,I.L#4co4qM>mP#mHl!&V5=cntF2_iUK4)#OS#qfe.c")o:5q-CGLkCbPO'VO+Tq3Wb"PZ6eaCrN'mr6E[s)Nf5HE.><@n!@h)qe*uTRJW#RbhMIG'6'+Il?Cf-=BFFr>?+W>*Y^@FkmqT*\WK4$Qd[(',erp7d=j)L#\"!FI'%`ah*g2Tf?%&SY,N\Om\9FX7dqI-9]3N#V7Jf0Sf10nQ\Pr3#I@n`%eRS!KO*!U3HQk;R)L]cEM1#%FY%(m`$(^%JO==7;@B/#80G`ihOZ9NU:HoR%)l$\k<`mt]W7JGr?7"3L1=E/0-A!`ue@IWI-sRj/8II+Qo5O7PEIRC^i])s.T'*>8FB&\&o1WB-Xtl-=g)UPL[E8dh.h@p+LL]=b-Y!/+q(Mr=:A/P7NPY[Jpq]LL<,GItP8k-!7TChrHRF%80f`<7UA)!K/+,Rf-(^qXRrmC9!I@&'gA?h:k%dKO,tFQg8`g:IN@LrscX>jgqCff$=@L>\Cn5R!k`7gO?]L4le2m,r1'f)=nIl^9$[0@qR]eDTV675H.<"$$=(9H4;?uDifHScZEl8NPH\1aS?*]VofY'pTiLTQ3:GNr`e=3QNsq$B:'C>>Db2"cHC6G=dTd%jN,b[5XRDn0r\-]n.6RSr.b?A(TH98+,We#5l%,N,WNTlq=^rgB3O/5DgGas69V:bnBp4Ee5e10t-fb@)l$@JL"3Br`QKMes1Zt$dB[r)[WJi3RbG+L)i7QEo.&*B_*sIp\@+l[3P\T-.PQ(V]hCNF~>endstream endobj 46 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3237 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3409 >> stream -Gb!#^>Ar99&q9SY(`9q7mEpg74.W;3^ogle#Hm+\8Us*j.u=R$Z:i?G&ELTufqh70.T19hZpnP(]A/hQG'<#;),X6"LWY+[28Hg/R,(T3.Qf84l9pD_pMg(Mnb34CcSTL5B[d%*eF=&>a4KCNpu0DS#Ua)mnB@^9PZ]oR$[0]K[QmbhU;&ESu1]RQVu[rkuHc(.:?5+ffE"^4D&8nF2VQo`tI9`2T1t9Z9+bD$uO_8r87&0OZX&3XJqMF-G[)[E-b9I>FV>e#'IZ-(okG-F*#4O&`:fSm`6EF6Pm,.]8!M"$=dl%n&-Bf(cU6^>5H\+P?\t@?V5MS!q9,7!/dg3WH=p.K]XHM#om+gaschfXJ:N";r'/s,QkH-[W##>ZSA@sJK?1jZ'6"+%JGLU7:>-<-"^Y$Ckgm67/g2@g&nX;ldm0K;@;2kP2Fa$eBa&82K'O$UF/N,Q!:";-H:e>m!9:CZ&>a2aHAZ1Vq3`o#I/e;0-_Gm47%X#Pp>>EdC[=o(UN-/nZTmL)#`j%\K!2(A>!*%?8p_pR*CMn`cNUUAS07:7f8Xq]j*ZrVmUMdEeR1K,]8=1gACQqT5LolaBG=uS_'^g,]$:bs>GA>UUgp88J4k:$Yn#i.O->!+CEVKTDOCg$F>BpSnT\sT9.Z.GbJJ3JbU&t>eZjB)!88pDUD[EA,c8["O!pVCnd5:4k1hdWJG='Y5Nkuf!KsCA47?6;\BoHB<$TC9@+cZ]6\urkji&3;*b!$l2hhM`=`?h$Gl\7XmIldulL4O8UV*kH7H0X].i_c%k'XOqcFO(_]ZO"HVBr,L*e!L@g&<51tf>?F@kO[@Z5!KO7kHtG%`3rItp!"fliNEcrfAfk9SF"sBI&*uG2[YmuDL_"7g[2"tLMmNGrHt`Xbm(5?dlti!kSf8`Ujb%Tb9k]l68-2tjI8@6]g&JPAWrb0-lF\V@&\H9`7@MgCJCGBTX&)?j+5gH17sJ(iOd*&o/?o`C"M!`c#_HkRbER^&d=/;DCB6uX\G#`+c(J-[2"e;9;I8-$@"75^jIm=F)&E7@Ic6!mFR?8p&"`K1UM_@Rir0LF1L$A?&_2l^s"O"B.td>m]?`0Q]g,(r[2mjZY,WN[bL1C]H=<91n1U&5PAV"0'us1D/C_)Vh7@EmP+LFL-d6l#140#p-pW>UZI/mNUWNnZ0S1\iMDWj0Rca5e8I_CTNnQQ\ZaFhjM1m"7^jBKTkk/#8'XfarS0jWY,4sjrTo37^UFs;ng;N:-@JKD#qa#s.18Y_1'edP9(p>)e0g+rdolc7d&gX>L)P0FXtXK[<,G2UpKhqD:t<>AZ^;N]h,7oF^f$p!Hh17o\?jG'+Z-Pdh,8B3@k>KQ<5lR]VpBjQk#'Gh,?qnXgM0X[F.Z3)9&)Xb9UePN6mf6$B"a&hlnNdZANO5`QS+emI12M-%jnqZR@7.#HIlEqI8aY8a^ZhNDA(@lGMZdUP!OPbf,NXP!F`O_(flWP2'CH[M26W<`:bpm1^M'$X\iTZDgjU8sg",,E$^Lc:=O;4>2Ti!kbW?Qs.A'MnR0M%V"2g\38/Z"S:=fE@KXFH5=lpAS(cE^5HD"=/L?#OpfqlI:4W1!%30Xr8rphb.hg0S85`rte?e`C*X>k(3cr*)_%k`*E?0-&.=+3Fc!)0@m?l$@g6@^pfi#/2WW/Mn*jTtSs=RO3%J'8FT!g*CmW#j)=T>I^.V]5#m'K9mpeDRYaSgGFh=V\t'cY2!^4"G`6G]^6%RUK^,J8^U2N>SLLm(:&n8QH.CY.C!K^G%l>S2T^7&UVi(dendstream +Gb!#^BlD`s')h6*;$_>WPh?Yfqf"_F$[Y!oACojd#$=-@6'EmW$,u$`.Eb&>s1[%.S)P_S_/>4MTt8oWrOTRH*E#/B+%?+nD#rML_r=i#7>:UR.(Z4lrHl&c^\I+]a_.'N,\r8jtSgJ^n^4D-B\<9\8_o`h(as9bLaGu2:/FC[GrD#ag8?G\)I+*$`V1`KT&f?m$1N+506"&K3D@2fEuk#SBKCL*X,#o!j?U4tmUJQ4gXIm;p*$.5[Cqh?9cRmYNm`p?!-=+7Y!3jm^U>LN6L7IP-s/j,EF%kT4LApf%Zp;lgGd;_`g:Xu:f+fmp(`)1#P?nfa@lHOFTEOA+DjnR+4AZ7JH"dI%=@+fY9j[dbP4GSH%ZIs9a[O%-0X/]F3hZqrijd$>h>\dZ4;'n(o@!,IfkW^8_T6UqWGoEP1'*ZcJCbNX>PZ*7Z-Z#1eLk[#(70si;?2lHguK-G(E]T_(-miWkh]\_l\hsOT?PP3_Z@j$-Fd<<,$0lJ.R':&&*-$)7ZbL29YV>FV@#<`QN,EHf?g@d@I,S"+@[#+;.c[dK$YU4;oAF&J-tOo+eg9UmWojIdloY[GfL!4BbVWH0r3[h"@E\Y9IP3)0AQBAk7Io-X6UZd"`>8hY3\NPCp%9%m0fZ<(I5JSF0:n;P+S?m>!]ZaOsl,r1;PSco2I!=YIG#VoMGU"f!SkbL=l\Xqn.pR-;EOD`<*qP:VO3tj%q^I6s)APID64XN&:&&XAn2T02?q"69OM\:Q!F:#i1UX@3e/X/?KUjkFm'qh,:MZ[XKN*[c;GFP'"YJ9@^?lZAm>NdI`hLPr4C(_sF`VA\$m$_V\NM/RMRsdr%S>%F<]IC29$2_jo$^=`(4IMp`^NIZN[#%)R5Y6o%;XD']UH022Ee"92,SGU_jHAtBQ\*Fa&DajYpM?e;=DpVSR-BEMHt`@0ZqASrU%)H@fnbV0iG0IsErXTuY.1:RA_,Ba*G-^QFYqu),]+)YbT/iK\)4]0ZpWNaBl#H:UZS)(!B/@?6%sbjhk8PjEc),4pJ4$:"LqiWJ>fGt8o_LmX/VZ&,*mOOP7\:ec"WOjn3+1`T$QT3td_KG+_VV?H@u!MS-&X:j/ap,Rsa\OG`X"[X$?%OPJ19iiXA>DMalJ)pna-HVWMA6$8FH')tfh%2^<-Y+9:K@l+SDbH3X'4atapI#arIEBrTgigL3=1Y>0WK(64I\]qSW2#V-c0:ZPen$VW.pt"].-X[1h2S_d#EJP3D"ZkCn&UflkEhB3qp\l.)ohR$"3,sBV$iH4=nX\KSMEW7,B*EY#QY?.KT*8/j1]rS]6_Qr;/IC!(\SZin:%kS3(8"#?Z1Wp*ia06nAKV8>NWQB]a[o1,kZpZk@_H;[68dL4g5`6]1/Q:@]7arh/ZhGW`r[sCS\:?Q-SAf]k(]FQaPt=HBVC[7M=<."6uIcjf\7r5.JWaj!]6>E9uL0m@[>/$>]ga-p*=ZZ9\=!H&IWNH.^A5#/u;3%1HK80,Y>^ULZ]aX]gIT3+bBtWu/#V'2E(M9.JafVK]VLOB7YkG<;WcUoLk6G"WoA"6'#D@4ONHG+D'g0?rcZ[GjLRI6X)&"Y6TV;g,6H,hKT4]D5pf)bQPSNIq\Bl_VV4h-UAScG@fJ*^;aZ#CbsO0Ihr+fa-XVb?#S&KPnnreJgVXbf32Ke^37KADeNA2gBh.t`+_Z#2-.n&p@/N]XdV:O"BPjmFY,r[+,?6OB?#lp@e4YJ#)I.07)'UW1%$i'Nh9F`BqHAS[Fuhf^(b(]ADMJrbUO];)?sp?sI1mqL*L%Rp0YP,?t"doJMM#`T&c50&JqkNo]77`j,u[SR&niW<;p+jmL"Xnu/N#4Lapnj$%'nT5YOL,aI:0)`Lq6Sj\DBnpZ4TO`Sp1&u8pXGidg1+\<",)3*3aM%)8L9B-/^=iLLb*BfCB3Xj&8D+Y:;_pjk=FSaI$9K7#s5:!$qSC?OH6KeQ:d_OSK[-VoYVJ#?\gLK?]fiQh/5UH\Lb>Xko)IKQck0FPX3?M.C(>h7UEY6J3Q]b1:Fd>is(qPO-.#2aUQ6=[P#02n"Y3r~>endstream endobj 47 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1515 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1875 >> stream -GatU3>BALZ&:WeDlm#)ZZ%Ocl9HQkug9dYI$D"mbP>R8=27DU;,+!e/8b]!WaBMV#3tCJF3u;B*8Koi<2^0"Yf;\l*,><,>6-$oV-Nm#8"q\kI3JQlJXWNP4_t2^b>j_X`F#lQKq,Ql[tWm^#MDF-$MHn""O]qeJ#poN,**Y&bt/FdD5hls1n-N?@Im;>lZ)6Kt@=-HJGb:Li7e?V+p@/(e,d2iTf_DZorF4B3,llF81t8,3L=m_3A?@0&X@[d6,>4XF?`%@jT)R@G9Kf;(j5]2q5MJa@!PnFk)U]LoFiQ+D(kOn$d2#:A"1,l@8u6e6LF8t08c-8l9k#dLK@lX+;ZOSa!cKV5kV2cl:U+M>r.%LeDCQcd@cGek(]KnP`,el?qtXWh+-acA-pGK.E5Z>5?0Uc+,Vt1[6=)\"9SGAqd^JW09GEt.B^b-bj9+7ZFp^b5THf\'!u#Q;Q`3F8s"g6+=MsK-M9NC`u5b@"Up&S):@s"Cmj5@)b@ofG_&,2TFFoKZ;6bL8AT!"%3+eiGNKMfTVD8=%Orq>>6:Vb\[_qUame_0n8b+-JMOs),(1!gk(q3EoU2?G)'X20p1/sXAa3`[`d!L6)=o&[6!aeF\pI!M9I_`>UrNL1gN\TB+o%ikPBf]J*<_Ll6q#[%0!#$GIh/g00Q(=T&[:dZlu=8.P[NbIb)iJFPk1fT'?AbV&sGL4MTZLH9fOqM`LDXck&MIoegoeG,8s%T7Ftb*EJKiQYO*nolr,P4ncU(jYVoL,rhjfX3I1O$$,k"`u49/_i'6;Rpns<'5+Y=F)=EN`[%BNP`[=n5CGKm51#!9JJENDl'O).h[0qfI)"b?.a%s"l@tsYjHfj>6Lf,3aC`Js)$`mbD7.GEP*P?KL)h^Xlm0-.r9dgl9p*V"qSc$:-e<7>)m@"&Fj4U&/mh:V\5MW-AQiAI4[l!jbjBs*0Kg<"'s9-d&hd-/YL8nBP!`%!UGR7!M,C538O,Of)D9jORb@GS1H">O78.jEt)10`/Y:EgVWK!SKNh\n?ALa2WU)oHrj,\WA$E8qhC_-26Ta7+=,nErqo[3KR[5=0RMapY#6+$)ueu@s4(WZ7;bJ%pG#4kN=B,E2CS9Pdd^@V]iaQ*mnendstream +Gatm"s4?D:_SK"^MshKf$bRS!mgZ32jitK=bXY#ChW6VkAbd7$]r#4G=$F!;%;XMHFC?_2"1L@]@nB658J3j:B=T@,_aDI0;?=YaRKnEu^/VV%m=D*,bm:+E58n)kKb(?&Gkfe@2*,nTghJY?U4'HXsABHq^!,I5Z8c&2$1Q6D$4BE-ce\d)#T)O#-bN/sqUNnIa]["rpDhIBsf>[F0g(=o]KM]WJuW=8X868Z#d/l=\l><=L*K[ttu*9UXj`nM'la?H.XIMc'-,$l"%b:pB8=6Q.HiB/=XrG1o9&#nb?9;8D_lH)l`.qX/k*QsoD;6e.R`LPM&M/hk"0Q0ffun@2[md=tN_65:V`T#'OY=1Hglaj!P8T>(;XdJK^1P@67uVt#pG0XWU,Em`1rJF52HESK,nQH_C(X\s/V=8?iL.\4n,:m$_.6d@?o60WY\$-F#o*L45nL9I61)BJ1,oEJLH^T"op6kQ#2k".1[M;I$Vd9&&/*s3kZ."r^i.C1A`_$S4TJ&OnH]>d$I"-6c@')J/M:)q$DZrERQVKo)]7/8$OCoEY$MmWKNR*Xg&X*/PrnW";PEbaJNc0ZE$f_O"e>Ut[kt_)+WubuldAfXR6;h&m"s(+5Q#lJUkcYo"QNs8)!!rO1.Eq#;>R*N[8k@]"SQj*<^Q<#86lTi&UXCR,Keb7"#;n3])@.FsYcT:%rX#rE"o%hM)<9>`"P_3tKR(H4e;:=g[%p]]IQk`Z3^BijrekV>cKZCitH62].c&N#a)!M%+TM9aG(2mhaC(GB:#!X5.BtDN!PFc/Y`sK:\&UmqH8Ql(J<^HjYiPlNGZVHb+"Llm2CiV)bi^Q172iY'&'rT#t/q8Q66Y?`-aIrar"b#1j0_dSf^VK1X:!br,@;-SkYL6?H^GbGr0sAUV)dnOQosg8#OYkkD%)!l\f)GV#SCm`"ZZE-0MYDr0.(k^-j#CkE2MgSu]L#G5/-W:&edFiS*;%+oip!8XV$XQ;)jVP)(q\Cb9HB70aEO?O+:hZ5KY@3:ro:9^>Acf;q_gtb)\Y279ctNo9]2kendstream endobj xref 0 48 @@ -314,12 +314,12 @@ xref 0000005922 00000 n 0000006004 00000 n 0000006969 00000 n -0000010332 00000 n -0000013661 00000 n +0000010282 00000 n +0000013783 00000 n trailer << /ID -[<0498f6a9043ddb9a43e67d247203d44f><0498f6a9043ddb9a43e67d247203d44f>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 27 0 R @@ -327,5 +327,5 @@ trailer /Size 48 >> startxref -15268 +15750 %%EOF diff --git a/docs/OPEN_API.md b/docs/OPEN_API.md index eef668f..5c4f01d 100644 --- a/docs/OPEN_API.md +++ b/docs/OPEN_API.md @@ -6,6 +6,10 @@ Triage **real device crashes** vs **synthetic / bulk test traffic** when exposin --- +--- + +--- + ## Table of contents diff --git a/docs/OPEN_API.pdf b/docs/OPEN_API.pdf index b2c5214..d8bdcf9 100644 --- a/docs/OPEN_API.pdf +++ b/docs/OPEN_API.pdf @@ -112,7 +112,7 @@ endobj endobj 20 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Crash console \204 open ingest API \(design\)) /Trapped /False >> endobj @@ -180,17 +180,17 @@ Gatn$?#Q2d'Sc)J/'_]eBoYCX_sY+=OXa@HVU2qGP6Xij%@GjE]DVOHaO_3('<@3@/GU-tO'`tN1SEB& endobj 33 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3312 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3322 >> stream -Gb!#^gN)%.&q/)-o[B*g4/-s3FbqWVANQJTAgW?^f$s,?Wa$)A8W65m!D(u!Xo8!2!#/.+U]eebfQ%Tp!f0KnU\gP`3ah!/U](]8JBJf=IWC_%Vi6H\>sXUlN.eu+HnQo*^r=Pg!=QJIBa?[F>biNU;$\Gj/@[7*3#'/+pj.4*V$>_e$YHoNO@$WXR2Zomm$??e`OU-g;C2&Gt/+ko#A,eh-i.JI*WmXGOWUPLSe8rkuQEd:3G+M\lWf0>Jr?1#5`@&N1K>]gC`_W@0F.sI$/+UD<%TSGK+.f6b6%h=o^jQCK7'%]G-%\@\%Ar.]^9]s/pPGj%69r;H"e%Hu2+BX7^-J#)bmO!C(E?n5HFis(iW.j4>4=PAY>e:]!`/<.1]Wo'DLI[VW*1Pg+]$(2Va1gsNVNJbrC#)ODJ53ThMuW\Fuk8VFfF^a\Jgl4FZr1bqNF>?,bH5*S#tcs.Pa=='@2Ha@5L0KaP8J5lNdXpfG0ZFS3teo4$Xmk;:Mb4ATRBj+5K%TKW6>U8RZhXpoTFC)JXQ*Qjt,hrdl'+O,;:!Cb)Za4*cLqqS^F,ejF/:@1dY]PZ1,*n!!9dq99.UeiNXuu70`#%u\m.J=`$?F&K'%:bZnIj'\>"UsfCfFdl2qKNX_aP.IaWlA9VAtXFJru3L\-TW7Qm#bK]S7,Whp[l#1o?:9TZCYb14e48%OFd&RcaF6C5*D".gQVt)TQS>#W48?T];-DDAcU%SeoNdP$;t$rN+,s\NFCh*l&%AB1S(S-0LO7+=Q3"9LOb"mo5*Kr*ESE\jgEa-@QiIU)pld(;&A0F%)LM9]s%9;2rJN5ls%YMtLJJJ9&sBZQ@`>P"c#1Kg(JES'IWc2VKk'hpnu`NUY1ggQ,Q%,Ko/b*?[:@4[oG\6[/Vt*8dQBkKW)V5odIF@I9kZPeP'52e3T_Z>j0*"k"S[WhgAqTXq=olb=3HhC]&)?:Y9Za/!`l,m]?c8AH+^q5.FWuM!IgD7HG/^&*4Eb[17+7ZM[Ik_t->FJW[]2^+F%D"R@I7(DU/N.VC;=&<<""*B,.bH^2Q\pNQqY%@WhPC/Cr\Cr]iN!-5A[_OBaJq09`nZVS+q\r$g2J`TA?C3>eI/f=b:9a`R@3=mNV`LT])enfHT.nJOc9/fCPEeJ-`4@IP35bHj%oG&RpOT]5c%Hp'VqaC:_R+@3L"LcPmOXY@Q('7Bg^n.lc8YmahJ[[8+]NqueEQot9J%Ki,jZDPfF]>MY$^AVBQ(LFXjqRVUdXO*KK/k/KMqmOAf_'GA>Klj30r2lM!YVsME@i-O3*f!L;Gk>ZP%pgt?NMa[)r'q8;j2nGa![K!H"$jhi!;#Qq;Ka3#6np^-eUdoXFB+1jN`.CkVN!s6`rQC0.jO;lZA4<_LG!=K%S,9[%-2-_8cXKfVm[;IYIC)e]Ph'fYsHQiMo`BaVmF)8BOulk(hYTWt"J5rokU-%(g.QHn5L96;:`4]t1P;L_CDO)5jWO?3AJ,mbg)q*I!l'E6$lfH9tHa!kpGoF_&'pcd.($FY9(&h<@U,6+4cHt;S.k*9_?Oc7NFUT>$UU*qTk!EHk'XP"(2Di3IF1eP)uX"9l]5J@jZJu;_OLQ+FUQX'~>endstream +GauHND/\/g')p`p0qSs$hHJL2?Q'W6,gC5=gQua:`U3s5!A2^-)Hg$2.>dM4s8@\JX=1Abdr'/ERm\S\,\MifcTJ!*2LZY=1L(#e:1r^eEXt/F3TQ\](3.uSrGb8)TMHF=EOpfI9,NM9EVNR2^4D33pB'K!_pSfe-=!>YB5n&"b:L.SiZo/P;YY9XEMWe6ItHOY=,qh=;.Is#ZHa(4#&4`QgNZ)u.SQT0jW:)t?e#N#TEc$:OFl(N^[ChXhFE\QsXM>5A4WT:.aL9-93dB5#38?WIjNo,)q*nFj(2kP#dpd_mr&[15JE;8hoo-]nQCgQpDckPXI_jBMeRK-XW0h#6g'V.<\Q"+O+&3ELF8>qC&C*UYVmj2U8-MK)`0N(:X-j19HOcA)6$Z)M!j1%-iY*[[p'H(No1aQj,RpdIQ(_ji_La_&VdTe<>;_#^DN0l/=kdN4q_!0#Wd&3D2!j)O1Sm75qB4hDNqi_--@<_Ug7>0VQPFdh6i6*Hqd;bTWLni[5Eh5@kXLdalB8id>G=/mlK0LZII(qmr`5kirHB\2u\_?f%u9Xo2/57&g/%WT-bP3Pj(J8+u!H_:)+J46:e^`,^6SS%oZqi7%uC3T"+>MmBdSG6Lb6VCneF]VdWEWT&kk#.TX:\faFn)uF8]i!,LpoT!I%j.2`iiP?S&]F'gDY6m.1U*[Z%VJ1Jq)u-P_(ag3]GfdEU]ciQ^.$l=mmcd3X5"tcZfmJjXg_1FAMpt9j-Lst(fOG(l1!XK"&.S_,*6f'_ZUG$s(7_K]*Dd3JEHNihp^R7QI:\DoOWQR0r;Ga/=."%M[rHlq*,b9qJQpZ4f>"e%Hu2+BX7^-BK1VfgJ5=o(I&]'^^MO'Br)s1dklrO)[%68KeO)3WLU^#l>;fOnAb.!L#s4LW<\PD8,Of(\=E`Ak)06:>VHV4GC`T;<&9&!Q*.!9+4,o'DLfRMA!q/`$,\Se?#-8G2rNk1^[Mb[K)*k30jB%4")VNp.%!+D&e[Ln$.-5_&6uT1W2[??a/1K07cJ%pqZ?0?]X/3+j`['>tkS&qfB2-UmGdF`V7M(-QjPh)QQ!!hLX'k0el&/XbQ8GFor2G?hC:\H+Et_cNoC'0-_%Pg`dfkK`Eo7+U?WmA-[>(bE4sJ?$D_G[h?H5C2!_&b*2^U>&S_=L5!oSQCO=M!^:-#N#_3o'D"*F3eL;R'#asoJe@6G:&mUJ9,28qqAad#K36C"L$VGYh7&)Hh07oV!L<(g[`g7ZF,cf+$B%?N9>)6,/Z#]:7H1V$`m&+[cY=qEYKhV>1<TZ'[N_d:o0Olnes;h>46tno>]);?2dhS%B1.dd-0H!b+=Q3B$q.+=hT6>@pq8R?1l^Qq9^FP4NdU&6B^Bb@;^F&$;%d<-C96OcrfuR9qA3;is.+%r0:tK+Za4_7+WR7)VK[`-ERlIO%/eQpcg+EfeW(Q_d'#:M25s2-8b3d-UZ,SRH,lC,1nj04MV:@ujVXHib$Rd@$1A<`1uEFO9b1=%[h#'E@^LibTT"K:4[)$/9NS_ue?6cPT/"H)aUh0HDNm17S^rIOnU.MuOTSS,0K;Uk['MUpW0hc-k(VT6[cW+qn)\J>rUss!6`s(7FR%]T>\e!`:Q^'(n;N2Nj^Col(m-m5lIK=G;5Q`@-"-]'$c)V90#l5aGMg(oBGa"O!e$^jgeSpBP^-]U,f*$Z?5n.`(G*eKE&m;Igo(p]KbO(:,'c;-VQ)^ZpCca7U%+N3TG\L[)OcWP7chPokS2&C194APoiJL\F)b#<)0-5.&YG6Fa1W;NBOoN][HCfb:>Xo%8-VIs10a'+^E!S3j@6l<]O[3S8^%8gee`r]N*?QG#*:3gn'V2lufgr['!.0m+M64b(e2Tg$?POW\Mkg_1eE9YuJ0YoC0fW35?ZurU?^G!hTOie7cdVodaYX(;2NkBO@R56cl<\6BI5mMMfa4tSN[\gASg22k+jYOpk+s:HQp,Q>58`.H5R+E@imH-Lipf4U#m0[U)orrnKUNMiCTM.\qr#G8BVddW.88?Sh=;%N#DKM32#4D4(qL(c:*!o3bcI0,%-KB1[5=rEqK1r:ZE.('SLi@1R$VjE.mlTF5PN7;?l`0;h36bHTAU&X4PNBWZG,$'Let;Na9s[%gdRYb&$rNG7qWpf*q@84\>8e:JI/i[Yc6W0k(F\Sq!@#I!)]_k,TApE7O>A'V\\(CnRpOuk`dUW@-ZQ&n1aB$aImd#Y^._dX)%1kM<>'?`6o+t)?_9MmPka"i:*$ltlg6IKDuIRdd*m!@c%M8:%skk+9>$/K2^0IYr/^(i@m\!+7GE%Lds]mHGtpt,*-RlkI`\jF*hTDMcTg/2d*pF=@mjas`Ck3CZhJJrNHaVCCfJYg$(LN,hi'=#4L[RLYb3Zf=TQn`cK!Dg>Ene^?\MhF6f$Kj7.'3Ja-)>>H6OQ;dhm6=6'+n)SXj&FFH7[I2.qRd:l-NAio-:W^B$R0#?D]`'KrRdS^a.KC+&c"!R^+0!OP4+^=WBApq"[&M8ahendstream endobj 34 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1541 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1580 >> stream -GatU3D,]IQ&H88.Z,;>Tgg(UuIS8lYSK+GiQ9m4"e'=1Q`n3mmE%KVH&"$,fm9SD*Yt\Ppg]Ro2Y'-FCXnIlV;"16WJ"7n$k6Z6[;F.-5R=V@O*@=iAS@&90WO\nZ,Dr?:?th\$e(8SB.[?W>h?m*$1dF"rKWi+OFP7TU5\BI1Gk8Us#U!HtT.!(WH-dXIK\$*>'*&AHXP5W=MP1DJV&9dQ+%>&k_9.o;MX>[cY^@2dUsU^netNfQs7,)#mm?`oS3BYtjeQAj\0*ZLVl4meE7g(0c!>[W&U+8i&pho[Yg=aUInA1A.Z$!.0&aJ>7^B.qGcqOYs8&25OLp2M\N!@86Yq_:R.*L,JLDA`O3k"-=,\MGN?Bor<.X]B#"]@dHi;ou"S:m:GK;d<-X;/>cPNZD`+g4-(q3]>BE;0G[s)3'F6>XA^;Y)_:7aYsLAmc;"P>)-iVjbBPZdUa6CX>8@tCaCUk0SqTP,f.1mOo+IeK/g2]qf@Qb-b=qeme\qMI]ph`GT]]T0q98tk^1KG$9-:*RSGhop;`%hRHW@!IlX!?2VW&%hn??@6Y&Lha<$;)l?_aZk!iU]Ea0.]$n+C=3BPHU4d,1)*Z&a&9O=^6+?h"_W^BA3.Kh\9sbeqb_:&lrAnAno=DEg;hd<,oaT:Ic`832CMlhno^6,cI8`f,8m"KH>\?E49]MhiaSI$uA\,I%)(QTgZBE^9?plER66?o6m_H4.X-oEC#Vn_j-(l$,2!),GusZ?4QAD:iaG2hU_Z"s[AQbA&%][/L<]jANY~>endstream +GatU3D,]IQ&H88.Z,;>Tgg(UuIYgFIl/[jEV597]l*N7CP;0>*(`^_3f`t3Kr:[:0a0A?FCi0:WBr0Wu=0$aM.Ob'hPJ=F=^rHb'5HCGTR*7kHM%5_B(f"7A>ACUp["tHU#5"jOs7CHhQ:U*b>dSl`e?_D!qLkluKT<&uaC,"M7J`n0ZZN-pB:DS)gSU-?K>'XTej$)L--c,B\h0D9,YGQl$Y1oI,CL:q%Er,s\`+)V57QDQ63V\8TJ-&KkO'")NaZr=PBTpZ(]8)+;N2;f0l&7>Mi'a2:Z0p?ZU_V3L>EV_aR7_4WWTetmLnSF\c6.B6-*\4Lcq\Z[4,jGqs6#r>'`ht5C$Kf#J)V%^4\KW+^2GY>Tr+_jtr`3;uAh?3[)D^3:Y5+o4n%ub=:/$gIF'(2RC^1X;#Sl_!^!sMo3VO.5)hd4p=MQ_Auk7hcq4Xqh!]bGN-DZB6I6%kY723X`X`tI;P$t\Bj@ok4kB:X!(Uf*3(a@=p=!DBbkWC!p8)db\j9$5;"-SIMtD=1;FS&J:b4r>"ZoKkj-uP^"Y68H78Dbq%Rq6rP@I=hVPY.<&B1B4T`NOR!Wpe+BOBYYXaZAh9_AkmVJddNP$VuUAKT8lM^4=8MVa"Fks!tRC>9e4](Ph?.iS#g#`XMZjcVbPckUX#9!Ylmg%$g@443]u-(^31YDl1(LUdnP>HrZV6'ZXll`8>[p*YZ#@BC\.pm]bIG)>2PFL<[)2o9>'mc4%l.)chG)iq-8JR_koC\;9lG6Z5\D@c'-#gk:Z#h()1X?Xt6"#J"@>jFO(*[Q*>T]l84`3?;C:(?F35A,-5I\\/#!bO/KW8H=B`s=$TTW,#MQ+C87.pu1JD&?[l?K.@DndMX!Gk0_JNXB'IXEH9kmH"V3hPIZkmRX&o,E#['f-R41S./YW1*GR>VueWLHH(-Rk==TJ7[PAnqPH3!SQe.b9#u"U%CE]$cBpT"G]e5_9FX^nSiS5Sd`YMjWsY*ZeUMC#A:d^7_#K3eLGr[r==00M)#~>endstream endobj xref 0 35 @@ -228,11 +228,11 @@ xref 0000004192 00000 n 0000004267 00000 n 0000005038 00000 n -0000008442 00000 n +0000008452 00000 n trailer << /ID -[<1172dfbddb551aec654c3f5c4c4daf51><1172dfbddb551aec654c3f5c4c4daf51>] +[<464d53c36218eecdebcff97cb5c07255><464d53c36218eecdebcff97cb5c07255>] % ReportLab generated PDF document -- digest (opensource) /Info 20 0 R @@ -240,5 +240,5 @@ trailer /Size 35 >> startxref -10075 +10124 %%EOF diff --git a/docs/OPEN_TASKS_GRAPH.md b/docs/OPEN_TASKS_GRAPH.md index a9c9405..43cbbe4 100644 --- a/docs/OPEN_TASKS_GRAPH.md +++ b/docs/OPEN_TASKS_GRAPH.md @@ -6,17 +6,23 @@ _Last synced: 2026-06-08 (post infra/browser/graphs/RSSH fixes). **DNS 2.x off g --- +--- + +--- + ## Table of contents - [Removed from graph (done)](#removed-from-graph-done) -- [Postponed / off graph (DNS + mail)](#postponed--off-graph-dns--mail) +- [Postponed / off graph (DNS + mail)](#postponed-off-graph-dns-mail) - [Priority tiers (open only)](#priority-tiers-open-only) - [Dependency graph](#dependency-graph) - [Task index (open)](#task-index-open) - [Critical path](#critical-path) +**Documentation index:** [README.md](README.md) + --- ## Removed from graph (done) diff --git a/docs/OPEN_TASKS_GRAPH.pdf b/docs/OPEN_TASKS_GRAPH.pdf index 5a5bc42..0578efe 100644 --- a/docs/OPEN_TASKS_GRAPH.pdf +++ b/docs/OPEN_TASKS_GRAPH.pdf @@ -2,8 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 10 0 R /F4 12 0 R /F5 13 0 R /F6 15 0 R - /F7 16 0 R +/F1 2 0 R /F2 3 0 R /F3 10 0 R /F4 12 0 R /F5 13 0 R /F6 14 0 R >> endobj 2 0 obj @@ -18,32 +17,32 @@ endobj endobj 4 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 716.2874 146.165 727.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 716.2874 146.165 727.2874 ] /Subtype /Link /Type /Annot >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 705.2874 123.061 716.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 705.2874 170.405 716.2874 ] /Subtype /Link /Type /Annot >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 694.2874 130.149 705.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 694.2874 130.149 705.2874 ] /Subtype /Link /Type /Annot >> endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 683.2874 113.277 694.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 15 0 R /Fit ] /Rect [ 45.68504 683.2874 113.277 694.2874 ] /Subtype /Link /Type /Annot >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 672.2874 109.709 683.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 672.2874 109.709 683.2874 ] /Subtype /Link /Type /Annot >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 661.2874 87.91704 672.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 16 0 R /Fit ] /Rect [ 45.68504 661.2874 87.91704 672.2874 ] /Subtype /Link /Type /Annot >> endobj 10 0 obj @@ -53,7 +52,7 @@ endobj endobj 11 0 obj << -/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources << +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -73,27 +72,12 @@ endobj endobj 14 0 obj << -/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page +/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font >> endobj 15 0 obj << -/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font ->> -endobj -16 0 obj -<< -/BaseFont /Symbol /Name /F7 /Subtype /Type1 /Type /Font ->> -endobj -17 0 obj -<< -/Contents 30 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources << +/Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -101,121 +85,130 @@ endobj /Type /Page >> endobj +16 0 obj +<< +/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +17 0 obj +<< +/Outlines 19 0 R /PageMode /UseNone /Pages 26 0 R /Type /Catalog +>> +endobj 18 0 obj << -/Outlines 20 0 R /PageMode /UseNone /Pages 27 0 R /Type /Catalog +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False >> endobj 19 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False +/Count 6 /First 20 0 R /Last 25 0 R /Type /Outlines >> endobj 20 0 obj << -/Count 6 /First 21 0 R /Last 26 0 R /Type /Outlines +/Dest [ 15 0 R /Fit ] /Next 21 0 R /Parent 19 0 R /Title (Removed from graph \(done\)) >> endobj 21 0 obj << -/Dest [ 14 0 R /Fit ] /Next 22 0 R /Parent 20 0 R /Title (Removed from graph \(done\)) +/Dest [ 15 0 R /Fit ] /Next 22 0 R /Parent 19 0 R /Prev 20 0 R /Title (Postponed / off graph \(DNS + mail\)) >> endobj 22 0 obj << -/Dest [ 14 0 R /Fit ] /Next 23 0 R /Parent 20 0 R /Prev 21 0 R /Title (Postponed \(off graph\)) +/Dest [ 15 0 R /Fit ] /Next 23 0 R /Parent 19 0 R /Prev 21 0 R /Title (Priority tiers \(open only\)) >> endobj 23 0 obj << -/Dest [ 14 0 R /Fit ] /Next 24 0 R /Parent 20 0 R /Prev 22 0 R /Title (Priority tiers \(open only\)) +/Dest [ 15 0 R /Fit ] /Next 24 0 R /Parent 19 0 R /Prev 22 0 R /Title (Dependency graph) >> endobj 24 0 obj << -/Dest [ 14 0 R /Fit ] /Next 25 0 R /Parent 20 0 R /Prev 23 0 R /Title (Dependency graph) +/Dest [ 16 0 R /Fit ] /Next 25 0 R /Parent 19 0 R /Prev 23 0 R /Title (Task index \(open\)) >> endobj 25 0 obj << -/Dest [ 17 0 R /Fit ] /Next 26 0 R /Parent 20 0 R /Prev 24 0 R /Title (Task index \(open\)) +/Dest [ 16 0 R /Fit ] /Parent 19 0 R /Prev 24 0 R /Title (Critical path) >> endobj 26 0 obj << -/Dest [ 17 0 R /Fit ] /Parent 20 0 R /Prev 25 0 R /Title (Critical path) +/Count 3 /Kids [ 11 0 R 15 0 R 16 0 R ] /Type /Pages >> endobj 27 0 obj << -/Count 3 /Kids [ 11 0 R 14 0 R 17 0 R ] /Type /Pages +/Filter [ /ASCII85Decode /FlateDecode ] /Length 597 >> +stream +Gatn#Dbo+A&B'$+[CYf[,WY`-Q[?^3K9(fm(Rrl;sj+pSNJ;GP._Ne/I5HP.MF2C->oO]H/`7JZ=S=/LMZnK]3\.6c5]OpW#38F4A[@+f)NWuEF^;+0>HLDH,k%^o]caWtHL;Mf71U]IZ+$Aoq0tI27O9_:6g9)K>Na"(OI.?\`QjGfS5[%MGK_-`Qp1t&kB$540'B,K2u7(T@r_,-l=BmbeAZV1ZmH<[ZVZo&B@MS*SXV=*S\]_g*kK2qX"6M_f/1bX4:B/59K03;MN;C]$GAN~>endstream endobj 28 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 586 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2581 >> stream -Gatn#;,>q#&BE]*.IOH7Rch$;38#5iYXq3WUOGTt=lReEBq.0feo/m2/O`&2"]SVs,l?s.n,Bm["AT?Vhg>b"`PAB-";G69^kbEecJd8Hr_7>N)(?=KMFX>IAmD2Fh4nK"'-WVD-I\@J"IN46N=c$4K\jY9SWiseMmF'Lgf4uM$^g4CguG>5;9kXGPM4hP'-5'iTt4iFc)V-UYo>R&c1kLA'6ZL=T(KutR8D]Wn#%\31S;MqRprZI1X<:KnG'lhJ/-#TZPTHa43>6dVDYL5f&IskP-`_*NR'7@&fj+p1R2W,T#7h/#6gthh^IYNd6l-F-d4T@.NrcWQLqp(MHB&n%l&!^q'Xr83OpWiMN_X-=lmOES@(KOXK!P7$oF["/TYeHfQZR0$=hm#Ji0R3XE+`8P~>endstream +Gb!;fqfCLM')p^:`K!$NES?3m5_>&%V_`@0-dK92C+8ChiYrCSJeD:Fe<,t;rTh)R.hot#S(u4jN[8W\+0Z,\pKK$KA:0O#mrAML3f!5/!CC5_!)Y$Wk#ZLc5Pjg\aY[!EBa0c$cj`?OMQ(&L'OsX2?mu_@q$)X+hQIJf!F5[t9I?W+%c5)SS.jS^R7mfD<#(:M;>tn"#%h!/&mD]q[@bKI;0l$HGT#$8!5tcDnEI9N`$lmcdA\JDhimZj/3EojgrD>9cn8mj/Ujo*4Pr/rUp^`CJi_\=cCCdS3=tTT"Kdc@;5ElS)R!Vlu8@CWc3,ERDY>G&T319Bi5+thgPWQ?YNflcP5>Eta([ZG9--Z%gHMLS:_S[R?jt*]\rEM.4JgTLG6tMV4*3W(A-\1pCKLetDW=6j_:deR8(Wb)EN'crXZ6_Y.5)YIc-#HhfiAs6fha%M8a2?^fMM1'Qo(4;(/(/=l\_r%O5g$jMUqOQf$0PjFHCD>%2b@+ceFb6E,HKi)sgtcA(?E9C*rKPs8?p_)&-d?oIk6p#9.CB9K&`.cfITE]ABQ05js&li,mh##!HQ\Q!*cu6R;#6CX^$DCZR!=e/jR]b&n!4+@&kQghdXIF^6P+:;DVU"iImqf45neg8da0R1)6Xr:dQ!j2N?icMtjpP"(*rVD+WlV&*<)HO'#6%-3`UMq[-%Z_7UQX?uV-`A4/E_sVE%fl;n^R'X/C)9QS033d69Emo9K@q\mSgi7Y,)csG#g9KI7h$/ILE."*Ang]p']GAM0kaHpl#%*Bt-BGB%b2WUWjf6lcY%Z7P5U>.nWGhCH/6T*Nn\"di6bACITuLl4a$'aI7c2l%4_RMFK=`K#o\9Wt6),9\c"6).A]%aN_2XN)7V1\#i@3WZ`/c6Z[#+#,)u#6gS9eLg(LEOH1[:Hg["hg/CJ=n1P)%kjP\1WOsl_diT'<*e?-ckiEk<0^rK*(!pe0N6&:!Q/^+%n`\["E]K=6VJY0?77qn,eooHN:_U[_Y56L2C[Lb@10`7sCAnq$P2uOb-As]A@cZiPi]D`/41OiSS'!/`R_;XC^m:t_D/Ef.iRb&(EBH+AV^.NJCqeCD@I<<(s!W04j-4^80b7kgWFtkn#$VVUA/:'O<:)#4eTHNr6u\rpmVleTC,DcV,t2qL0?'/AjAH*-6IAKiZ)t;FpLE]\'ufpum6jlmTm^*g^XmN+%1(%t+NS'C?S"Fi[P\HotD-C;-o+2>_P8qMtT^f0T=B^AE;J,sFRrhriilMfAUcm*j^OG]lS7*T#,I.T0ig"opHQ!2*_@EFYPM`W?,Z.=fH?(A_g+Oe;nGUr?+2L$`Hm"@cXpAd;>jGD&kan%HaVHo+$*f6E1HVc`5`/GGt37:U)p3RPq2@nepu]8O\8/a#p;>#]1_"ARNGX.oq@4=%)IQd8%E\9C"BGHLTb<+bQOQ!nILT;KB;Qr1_1iF3!fIGVK).r$?rrRHU#'0^7XJPS6aI\UAXrk;03E5AMj6Dl+2X'c9\QTg%k:bgdVO#P#-_%KG=/OV&+dV\TZ=kpgtd/5t:CN`tK%EY33LoNc;sHcKf'""lYs>*66`n2Mo#L37To]Z65'KD;g4KH_E4=WU8DK\u@T#>iu8KL2Om%^ZDXNLaA$9Zh]+2i!8'`8p3o<7t1VuC/.J~>endstream endobj 29 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2816 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1366 >> stream -GauHNqet4K')k%D`?;qsmV]%\Pc2XrE.HD"l]=68obkMqZq%;>l!rfHpD`>[ZD#3XS@#_gqELaoAX]7m<=amUT&[8`Qi),+'s2[kNlVMb>V)*=!$99C(8ej*d9H&IIckQ4Ri1,1ZWjth76_6"GA&AEGuDZ9c;VV6A7J#a3pK@t/KTdCU%8dJ[T4)dQ17[4TAUZ_%@.?gstV#q"oBWXC.g%&d_#19!3?Ec,j3,p@k48eWC_r4ItmjdW2Y[-3Us>CU#UAlM%Zi)H_Nd@@JLR'MP&Bd=0##j(f#e&ca8m*>&dR&#[E&u3[&tf\-UXWl?G&1,cCusZP"tI["Pu+2TdgG`Pgj1b6/##<N%4S'u:7i*,a-Xb5<]4imr8G6ZZ#R%oBlS3Q>dr.TLTQVP>?QKq0%l:ol)i7fq*O!%^)5Ooh&E<#ARY$.Qa^5:9riQ&DN\+#$I%$OWBp:<0c%dg[a@E-;)a.RVS`=IG;_8>;7n0-g>*TM[D^3I(ka0sFpY:r?Q-eANd!+*Ve5NABn:*bJW.RP(on2\$>6/Z%7p"'!cJPRmlis*'hs)RA=jh4s9U)F57At]6tZ3F!\Ka)qI)DE$E)Xo1k^k>d&^o+771L$ORT99CNc")jQf^af>CgZJGNlH/t9NGDXJL]oQ?E])?8ooWV@V;2[5)_aV\P2Wj#GK%k;0ZZ1clo^MW^s//:l?NsQ:E7VC,+4i>:kn.\0WlZ'c6&,8O9c,,K'EujUkpi,jVa]"R>s29@ZAjQ7/48;2K`)n6aULrFI$ecs8XpSR>+DpbJn8g*o&a*6YNms)U@E?RIigX25c1<.@2+-/)*f-eMpckmr71#BG9(`l`@9Q$Fsso3nE&"aQTp1h*4$1FF`]6Ng:TCJ=<>[H6l[^a4-!=7mrQugFh/-$7?K+Dh3@cmYZe%CJSJtOs+cD#rDdOHVkekt-&EWslMP'TC.6^:&.n7)6e5SEneoh#\[]Xm>`X_IsX?@+A+9>ZE/^6/R8=E;[M.?6O@KSTZ+_9(5"<[6rK-+g9j5RB1+M=b8&K3ItJ('?`b0Vl6TfB:bSL^K`[gUpAkRC##D(X5'BeIDL=@kCfYm:Vih$@&-0bF`O974"IWt(;4+2;_VA3,>,e7Cg?o?K99">GeWiVX>[(ki\fr#(EirMS5U8?M?E7sFbcJLU[_Ln%j_aE;?B]Ka?>6?!^5ABL3Uo>R!FP]>g5<+p*F"(p(Pr@pJ'N]8+$VoY:3l?q/9k8p@PO6@Q&EEb=!/./2\6]/U;G\Pp$C@'ii$=MiHS0f#^(Z>>2fTEVLZeO9Wm_I70bJ6jEnTbOFj6ZdOpA6O)No[a),1B*9'X/-ffXWQu=J)J\KE-J[Ho_t3,Io9W'".]du-1cVf?endstream -endobj -30 0 obj -<< -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1850 ->> -stream -Gau0E?#Q3)&:O;V(ocece!k1+?'^Q8l:O$UPI=MUg2?dsW?M?U=op-":&8m[qjdn[&'#O<;A7$pEbe/N6ID#KTG/-^7IP@"+/3";p^e!%dAD#l$3E_U6cGE)%k[KqI]3k20VHV?)^1BH3V(S^WK3,,^Dg3N\`"G]*'Fo46;1'VZ&0D#i<#36"Ua#'0K/U5kpcbUOCd(e3Pq%)ENA?t-kn>@tVp5PG7G(e#gUW6\`]*8VrD3('?j=^'!PGNW7eT"tEQ&0pr$^Dco76@%B;3S@crd&B:=A%#\Qbi5^b.`bOi-E0V?>!o8aV)pp4V;1-5t6Sg;:VI6i-AQm)oQDpXm9c.FG*)R3F&&B3\PeUuQK@XjXXb@5+$$Fnu?I.VS2`!d)Cq?"]Y`i5=p0b>Q:?([2lJQL^E'(7@mD6t7-SNWM7D$tn06RcJ][j>(Q&_X7]L\jceVk6.CrKfFFmRpeCPl#)&dsnF+54o9fM>_>)/$n7N4g!Sk2V0W/KosTl+([E?,K:L#Q62pZcD/3Fa^j6h<[s'BW<+DC%AXd&ZeTZ?JMp5mG.PXejBXak0Y#.ruk!`pJ:l@=BdMfMd!]dY"Is1G?;"Vb_2KmhL0HtiTtcY\^0:m:!sc^RQ@Mr`:,*rQZrH"pbm7:mZtmrGk8i!2FVK(`[k-CVS7Cuk?`p@R'ju-d]Sph7YHJ=/@6JPWAF8a:7\uGm;hX1K:C[;67rIiSke2r=gf\&SdF6`'h+dKp5",MhS$'2Flr#LC59tC4lWY?Iu2-a=,8`2*b*\F`4^Ei$F)WJ-3Yra?q75^!ELT:#d@m@``Me(iEing<"F-2ZqoL.,HT2J&Ra'a%rdR4mR=``JCTM,!j'])&Rb9t8J'`!i*Nef'F8hjSNO+1$DW'?2`lopi6KuU]DgeZU$$#ON7f&FZe<;-+k/SF5t&0nJ#nK+-_??ge)!\*&)k*p;_Ec$?V2c+leR=N";,t6U!/n'e]EZ)1fl=?b+(#dEkeXpd#6afFU[1_8-GV_Id^+5PHDk/D4-QJ6M1O+6$l`+#Sr-u=?.cNckR;n7C&?gTPh@0EnVdcuA633:X=CF1W$ErWBSiNS!Fh10HH69),8pfBeH2]s*+OOdZk<\<)^lNiO%5ViPNKf@Uh>IJG"!?A3B0'WFsec93&!(R2XWEuC/>]i'*K#a6aA>mGi6%sAc0/?8]j^='tg;qHX5?eqo(l$:>2nX:,&W>sE])f<3"2uk^dko:c)`Pq6!a;e$dM(58l)F,5)FLmEU)?ZX:Hsf9-NL2!2L%H=+FJpY='JbVc)`WQNoP03WVOhpP352omQSC[9>!`ej:!,F#AO^T^/-DI(/dnX'1/!!sK5b@T]4kj,qTe-^(XnC,n]E!^NI5nZQ!ICD1$O0%V/bbgR-'1U/J0jN]ZPP@>*K_cr[YS=WV,bG5Y.3rstMYuZ@-dZ@Un5\Ln#e%slimn*:cgr+?+ZQ`n-D:[ieH\YDlc1]B+[e:KPR5+PHYgC`1a9.p'I<_`rr[$'CVK~>endstream +Gatm;;0/Hm'RodXS!qaagG2%A7lDiYfB6IAd8kX^CfQpomDndYJLfO\LQ)Q[3jSM]tGESIm;":74pZr@IAcg+<"j164!nE,;P5ttn[\n!SDAfGaVJ-ZCZZR7CAfO>L/4s@A#)p[?b!!r%DIull?9iks,d6,0F0UI64,cQ]]t/g;$V\9,XrmH*ppc#/e,[ee&fjh$VAU9`c/u$?!AP$qlP.`NJK1Q@kbq2mAK3a1K33[$'f"gVm:5`t>tB^J_r:'-OJS3Hi<55"Ed@bhDH6P6)&M5*Ms(#_jCVe3C9p]>CLCA9Gj!fJlcc0K"b82F[i]rEV52Td(5dAM7Yp%kr2B\$r3O4\k-uY1Trh83-EYLEe%C9/f3:,kZ^MT6A*YMnCN8gHa'MZW7BjF%NI%4?k%`[(Et54<_JN1Hj7%Nc,SPrCBg_UL0H@@@EOrDgR#qRjnS"U#Q6XKRX2;AOe-_)9\*Gn(#*i=3%uilm:CbF5TmGG`Y=&<[6m0LCHC/C`^7b*9/*ZinY7iV0['(HFO$W[9+i6]B[>OGQ'bba'\W9dNTG_Fb@Qin*#+V)":DX6/He8[qtmpc:i!+T^KKo9-$Z2:&s5nVI[MDDSUTkaagMKJ@C`*!F*)8D]g>.[W2K,4%]]njT`@mPRQ3u(ar]0Zdb.E(QG!;N7j[/OnPNSZYR.dd9,+\7W/6GO:fHSP]KGjP@iS*nIC:BD!d1Pn_E!j3dVfm==-*.q&6[a13c+WAJbe6N8L-^(%\+44"$>PDIZj].g@ZDnm<37CsCc-#If3?NNN;do$?Ub9gq3^/+9JNVN-7r%Sd]a`)YE)'#ojoea?u$_[;!g.(m\,S4n;-clLs8O9TtI/u!=!R`WGdYV&S19ensFVGN%Zo/XtDLAU._s&ZZoI-B^TC_)8aa2(]`IuWLnA5s$R&MkM%o1llU_pr4!72DDkPq9V\T5oDUiAef*pM!R'e-<(pZC-d>_BO/t-1WdrL>LB]H#l(iiu!JA)MNa0n'6NnbR<;ErcR?At6+_7Lmo]dCRXq)/Aj7q$MfuqC1\Yp1eD/HU/T_1NCncV,~>endstream endobj xref -0 31 +0 30 0000000000 65535 f 0000000061 00000 n -0000000160 00000 n -0000000267 00000 n -0000000379 00000 n -0000000526 00000 n -0000000673 00000 n -0000000820 00000 n -0000000967 00000 n -0000001114 00000 n -0000001262 00000 n -0000001378 00000 n -0000001632 00000 n -0000001752 00000 n -0000001858 00000 n -0000002064 00000 n -0000002148 00000 n -0000002226 00000 n -0000002432 00000 n -0000002519 00000 n -0000002826 00000 n -0000002900 00000 n -0000003009 00000 n -0000003127 00000 n -0000003250 00000 n -0000003361 00000 n -0000003475 00000 n -0000003570 00000 n -0000003645 00000 n -0000004322 00000 n -0000007230 00000 n +0000000146 00000 n +0000000253 00000 n +0000000365 00000 n +0000000512 00000 n +0000000659 00000 n +0000000806 00000 n +0000000953 00000 n +0000001100 00000 n +0000001248 00000 n +0000001364 00000 n +0000001618 00000 n +0000001738 00000 n +0000001844 00000 n +0000001928 00000 n +0000002134 00000 n +0000002340 00000 n +0000002427 00000 n +0000002734 00000 n +0000002808 00000 n +0000002917 00000 n +0000003048 00000 n +0000003171 00000 n +0000003282 00000 n +0000003396 00000 n +0000003491 00000 n +0000003566 00000 n +0000004254 00000 n +0000006927 00000 n trailer << /ID -[<5097cc94053c3b6e8997e7857bc38449><5097cc94053c3b6e8997e7857bc38449>] +[<90744d6726fcd81f1d330d72beafd35c><90744d6726fcd81f1d330d72beafd35c>] % ReportLab generated PDF document -- digest (opensource) -/Info 19 0 R -/Root 18 0 R -/Size 31 +/Info 18 0 R +/Root 17 0 R +/Size 30 >> startxref -9172 +8385 %%EOF diff --git a/docs/OPUS_SPEEX_VALIDATION.md b/docs/OPUS_SPEEX_VALIDATION.md index 259425c..7ffbc29 100644 --- a/docs/OPUS_SPEEX_VALIDATION.md +++ b/docs/OPUS_SPEEX_VALIDATION.md @@ -4,6 +4,10 @@ E2E validation guide for **audio codecs** and **UDP stream protection** (FEC, NA **See also:** [ndk/README.md](../ndk/README.md), [ROADMAP.md](ROADMAP.md), [AV_QUALITY_QA_SESSION.md](AV_QUALITY_QA_SESSION.md). +--- + +--- + ## Table of contents @@ -12,11 +16,17 @@ E2E validation guide for **audio codecs** and **UDP stream protection** (FEC, NA - [User settings (both peers)](#user-settings-both-peers) - [Developer settings](#developer-settings) - [E2E matrix — run on two devices](#e2e-matrix-run-on-two-devices) + - [A. Handshake and negotiation](#a-handshake-and-negotiation) + - [B. Audio codec](#b-audio-codec) + - [C. Controls (user vs developer)](#c-controls-user-vs-developer) + - [D. Stress (optional)](#d-stress-optional) - [What to capture per run](#what-to-capture-per-run) - [Pass criteria](#pass-criteria) - [Known limits (next)](#known-limits-next) +**Documentation index:** [README.md](README.md) + --- ## Prerequisites diff --git a/docs/OPUS_SPEEX_VALIDATION.pdf b/docs/OPUS_SPEEX_VALIDATION.pdf index fe8112e..7165f52 100644 --- a/docs/OPUS_SPEEX_VALIDATION.pdf +++ b/docs/OPUS_SPEEX_VALIDATION.pdf @@ -133,7 +133,7 @@ endobj endobj 24 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Opus / Speex / stream protection \204 validation checklist \(task 3\)) /Trapped /False >> endobj @@ -217,10 +217,10 @@ Gatm:>u03/'RfGR\;t4L9^K^nfNY%<6URVI_mTdqA.h8C-?3WZ/O+a:/RPPd$Rgn^['AY4m^_N;>7(C; endobj 40 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3329 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3339 >> stream -Gb"/)>Ar7W&q9;Q(uSfLUhsf$0?o^@Ui!P#8K'\&=,6U"pmM7o%."FSBPC570ZnGf`T;6d9q+uB"WX$]BCJ<;c_[ne"'BA%Qb`b7i=KUNi<1HtE'Q@ba2-^eF/#`dUNHPnE3$lp:Tkq!6Uk.]%XH8<6+o>Jmbl:Aj:bdY-f7-S^_T'+P#^9X&ssdhn05Y*A^bUjag?T3`"bnb&2/%)b8i;`?8CGS(=JS*ahZR73,k2-H1\cu-M\mNjU_:=ajVr#?8#)C#dQ!XV(0h@@mL!KJ$/2tE$%S/BB.H*ccF9-"?0EWFaTa-+91[+a6iZ]I.j30+637_flVOhFbr8peuB<\dS-psq>mTo%&b)"/G>edq+a>i]TqfEL$\8f(O7`nH7VLnLf28"D0SQg4,.u-S#G4W%cb>6\`\RfSihcsBI.>O&IVhZ_FFm"_n7?4hAqnU,Ib7?Xr(E&0<:f`pAEj&;%.4Y7E7r0c"IO5Afe3Zd.)Aqr>bc_HjSX3XKga/IF^pbP$&E8^7"i2([K1sODalYbr6#tD`lp:i7X$TE-_:C4(uar=KDfD&:;4p!^%T$%'J0NBJa!Np*,OKS40'^f4rrYZ.=DtC/HB0)TU(8VBN'I]**;kFIXtt5):6;b/l&P6>ml7UL`=Rl*?>t0(FL)9]/l[_RgLIr*&Z:\gDCp&pne82p.;n36^fS+5/"c(rXd9m`7/s_UrM[XC*H]B`F4q]IVrC*&@FB^&S@G$PPd4O-l2P;R2mp_rV2;2+hR%2s'?_#"*Fu$mYr8mXH%eWZULK*`#OKkHK`6_5J?q==fGG:MEJ:Xle2I[k.`Ze<:\2i^h9i/]8eAqUQW_/M%`ndTVX3]tY0:;2P]bU2A\37SgCc4IETNG>%c&t^-+d/\#\dCj5%EYu-R(?aBZEV%CVs+QV^a=r?(iY.A=#du+85ai@+f\g,KI#V8W;b*iiRfcopp=m/!oT=X[*$N$HH4-JlhO9$;F\Gs:==e#EQJ)J$-KhF,ZD#C+FV'H>%$t`g8\Zs=d.)nBOC=9r)fOB%&I*#MUd?O>imug"%]noL(g2V89@fRd;Fg&9Qk.)\OSE!:@csVR<_8%S18RfCGCG[M$,;N6d9D_/J$]P21NMRN2pX^-&#HV1TPR>X[:98oG?dAH_;U:Y)Lh*7>0]4P4`gfiX3L65OnE]?&j4H1FlFGJ/)"q-QdDS=#eSa8J9@13hO7*uUa*4r'lUaTic&d7/?L]C@r,k"2qqC%N-8j-j>!..mFDH*_Y2('*'WHX+\Yaf=`2oTZ(V&D\#I)%uuGKQME0h1#eE;bT:3ZVF8J0(WC[QPpcaQ;'V]K+H*$'YF!IJMak?Ar;a6#r1!/rb%P(,#,$$0P:XVa5NJ_;F]d7aFVi!MoX;iqD^7AC5MW.mbm6W"c^S#U6lbm"Rd3"p9VZ\&iF%D#bbfr;TZJ:e(-.e7X`UIju5>4RZ6qPLO(F!g1sS8:ceZF!@Q/tic\6ta]S#:*,gRHTO]N3uWDdJ8@W02n.?L+\N7t/X/Zj4'g9a,nMs@!l1af8Wogqod3#C\Oi7m\`IbX#"Y#UdQ76Oc"g;$Ke&JJ*@ob3a40;8D]I8>L"i(gp]b1J8`%&'-Q8j(r'a3mZTE8WXFq!(l0=2orA[nJWFd,UK&&Pn]2sE34P$;(5_BU`hP5"ok"_@\bL:$8,:`QaNG_;$V^(OPWh[j!9OPR.92qbU#qk02X#.`ueTQ"`Ub7.-c=iFIl3:TKZQ=DlJUWI*":.k^3MQ!1G;)JO@?;%s\)"bOU-Ydj[Y6N"tj[R5*Nm(isQXE5t837Y*Lf;[?1Vd*nY%oMssXP%JF;B91c2+*VMrl/IVD=8X$?JH8dddOR-aV7BMB08SMSMg.HZbM'5U"qkbd7_*O3`s!-^7&Ppj2.<1V2BS7=auIur?`dhr+h7G1&?hNV&4P2cq)W4;\umPo(P^k5?[^_1Z6Ae'EZkIQ]kSM@Jb@!A1*MeCPe4/&F@iYC*28jF@1H6$_,fEd^FFZqlF)T@C+F&5!*daM="LRhC_nL(C1;e:/3E1VDCT[/U-T%WBX/$3.nhX!pP2/SC(r3,7K*H+LY8hCXY'2&rg)GE!2/:1F,LXRo>apsN9R7*6TD%@,kSFj50]/k._d[]nDWYeL=eVP(lG[n==i:im+SqtHa.V:nAhk/@V%eM-n\QC$AiDb`is7T(bgX7[,4Zj>b](oR]hEs.#PDJ\_)MK_O6$s*bhqjnE7.FkQb1.b(H/>m(Lg)[I7`eL)d.A'3oSnE!?a8S:B~>endstream +Gb"/)>Ar7W&q9;Q(uSfLUhsf$0?o^@Ui!P#8K'\&=V\#7gh`?D!,=GK"NNf[Rqn*],Wg#NfON[N^K6,46up6&G2*>4at9]/?iCW]u$I3u-$lm8f*3ehm9@pSMY=5kM.^1JOJH'f#1I=ME4adblYMdhi66='T+:RsZYPN_]9<.lI=$<=)5SMCE!O8.o'D?KWQFE9?(rUYuLgeVm1KjVmPanP>?mXO#P0@"51\c4CuT:ScTk?"#&dqc'(0dY'YCMan2'?cX$joN&Qet[$*!u/'Y:c0n/BL>X;?&3Z,):p#>g#!`%nmWC-fSkdcXd]Vm_2dZ%9_hFAd6aEbMuu$"SdR/tnf/F=SY82:/9"_t+!G/)o:B'/G??W'ghn@J@W4'9XF_fp`.Jjq0s#('*M\]RUG50+H,O/8a6-=lF7eqk-$Ts)`eHGH=WdPeV52mo1\H)JerqU-h=<"aD\b%aGeP-5ZPP:Ro(79P<0PA-=;(`IHbfab4CV(pY1B(U1gMp2+qEh,7A%3DC03s1epegLW0A$VA*.+HOOgR?!]saM^+R,`L`PEraXD0rD]M?CADp&CZB!@5P@t7Z>T)8CP=5N1%m81T0i7leEFc86;K9XsBG".oB@$(8Y1K9X-al>Q'(rok>j^*AK#bV$(`AW-CfP=97YYLi!sY?[nL!Cs8ERdZ7a1T.L*euBLQSfK=A`^fO7!L)!2O(o.+V3*8>@cmC]]t39[Wleb]b5ioWaHWTS.^@^/cDHNFq\f6Xd>.I^akEc`dF?8)dYSmiB+d&,bOCd.F\,'Rb>Dib';rOuT7'[,tdjVF_?1/n31=(1qe>`4^(EStQh$R-RU)(.%N#cB+P,o&5"p4\HQQN>AFpgEnY62S[^M.T^$h]?i.AR%^up1meHhEBOB;'EcQMUE=11LaTP!-QeREZi^A2:;VW'3@mQ0;Tpls_%(1@*RZdCUF@\eR)-pb\h@UOn5DCFl)g=14ZH,BN#fDdAKn-Y12i1:Nbh'>Z(3=cb'Xfoa1&(@=A.R08+4dNP:8gEW?@"]tO?n:]]uZWhlWUA>8Y[h-gg8-h'LSd*,$<,ZOSiJP>Kr4Y^:X_7G]rFuibP>5`P+#]N$`ft19umgqS!-m>"(WMWXn&;?Ep)=l$]R:O1/aH9FF],@8VaJGI*T*"_aJ;U?<6R32[7:0uM234c/p3..WlR!#(hHhS-d]0S;H9@bD^>3&MIf4G>H?O?+[7[@J1g[mFJJ'8J#<6bBcuWF6Vo>NfF.0B&/V:?A=ETO2nd1;TcPP-&meFa6&BT:Nh"R>2Dom)r4h:nY3X-r5pqGRS-74GRu!ZT?E$;L"C"[2a64q@qXsue=/JOME#0]NCqu7*Ft#PG3U-55fIZ-DDcJe'k;>L?m$a,2gr3JSt_.'K*Q:"mtA#Z7;2QmbfQcfXj]Y`jY7O["ht(7@))<7@!0aS,+1XFg^Y6fCV[QS[t!haf71^XSgJ%MldRa;p`#@+Z1e<<,T?aZZ=5#QFG0c2d,)F*4i"gchHG]8?8+k]o$Oj1XERr8ZART<,o%QLZGgEcJ6+4U+Ddd9-nTh`.s7&W^!U.n$1Z@&#airbptF6QqFJc4H20ZROF&Ma+?Tc2HX444X#=:+50P=&TjRM^V!kpgtN4M2s*o$8Z5-b+[?M&,CLJ.%#U5)CU]Xg5C[)h\JIeQZ.048S!;5CWUc?730lPOjP/q4ALcV,13U2./aS[9'3lO)=!+aE*U:@;-8&:$mYOFYS^[>jRhqVjtION;Lc?.^^>UfR^0dEK3VLFMn(/+:hlPs0;4>=EhF'fB?K/SEWb(0EE%$^<5#0u;p#-MtOE(&;HN6qKfnDf#;N_b?%5\Z3ajH%0>G7944Kfe$84ZD89=#3WNE"T$n5(;IaXVTONf$;+R:X_0p2Kgr;V=@a23V^:XmIj\0.228nZL0nSi#VX"VekN[QOIQ9gg3]b&?kW"#>GI9K/;T@endstream endobj 41 0 obj << @@ -272,11 +272,11 @@ xref 0000005151 00000 n 0000005226 00000 n 0000006138 00000 n -0000009559 00000 n +0000009569 00000 n trailer << /ID -[<2caacf63b125206582f1e01401b081db><2caacf63b125206582f1e01401b081db>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 24 0 R @@ -284,5 +284,5 @@ trailer /Size 42 >> startxref -12103 +12113 %%EOF diff --git a/docs/OTA.md b/docs/OTA.md index cfb5bc0..05e4e69 100644 --- a/docs/OTA.md +++ b/docs/OTA.md @@ -10,6 +10,10 @@ MQTT is fully supported for OTA sources using retained topic payloads (`mqtt://. --- +--- + +--- + ## Table of contents diff --git a/docs/OTA.pdf b/docs/OTA.pdf index 4461c09..559e201 100644 --- a/docs/OTA.pdf +++ b/docs/OTA.pdf @@ -112,7 +112,7 @@ endobj endobj 20 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Over-the-air \(OTA\) updates \204 deployment schema **v0**) /Trapped /False >> endobj @@ -181,17 +181,17 @@ Gatm9?#SFN'Rf.GS4D42f64n&`n$ht@th)BSp2uH+W:*EP>HD:ISQPL+M+BaMNl3P[ElDH?6:t"o<@X' endobj 33 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2966 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2900 >> stream -GauGcBlD`cp3V8-6\#?19L;D%@B5<8kd906c?,O4EV>TIK!oAtNNS.<125/9^5pcP=\#R#60g@a`5d(oA5"]HA*WO+&E*:#N;mC>8R]%3dj?ushS\+$d?c)aJ@$?V:*%6,a^e!PbHl110&oF-_IZn)$c+ZUUUD\+;h`QET6(11fp2_5&m0&Inl>aC':=2;5ahe8KOg!kj"cN:*l-%NqZ:&OXFao0qdH.gT;=YITa-+LaIbkl0j=tW#[+HBOq[U4:PBl\Y`-JQV7s`P1Vnbl1HS#t.%mFOZHmM_69i?U)LmAQR#_lg]]C[5,@ok8Zq=hX<=2]7\]`+.N`Wm(T1R-"Q@?p<-Nr;q,`!Nbij_SOQUrg$J8k#YW4*KjAO5p9`(u^+S]OZqE#JF5P)s:9NopU$CsQ&kpQ$3b^E7)En-,o"+F!mK,tXV!<%/.^(UI0ci[dMeU.Y>s""BS\O)S7AM8+^s4lfX^#p+PXo#5iI#\iR;gpF9e'qMSOHHPJiY21*1?E2jO@`F),tlogM0#:Q$L]AQPYk]YlWRHL4cHgI-H\7$(o-EB(rqf!M\J>"1H,&fM6r/?/pP:L0ChhMeaKnQnY]!aho@9DTV#0hIql0ND`V$M-\s=ah>@mhT7jt9I[t/Eao_9P[CO(PL)0^P-[Ta]j]&ZYW&s5S&(d858HH'Ygt5]TgpnIt6?A`'jn9uOC])Vl!lugctOfZo.Y'h(h[W@25pVRN7fYRb.:#NKfjT7mG@YB7TD=Mf\IE4,Vpf4CQd<%MI9/=,Z_gI2s]F(T#Tq"dhN_K/VTJ)nYKn+L&@t3SMpmk5N!+]Gt5tA?StMd3:.o/=B9)"FN\ti[h`g('`n(]uVkY14Cu5p%+@`"(\\bPtXR2"aX3n]g/JB3o@S,W[t%)WSI*ngj>qFhneu^*liGMZ]8PK`6""dbpY1>/6#N9B69P#n7dW7SW>bJ"qcUl#mQ-WlZpB)8)9^3@(#Z@Xk)1C9@3Nf;re\n_/GuhQTsNZDBO3uB@J9XU/o%g9T)ROJ1!GLgOE=m"T1\=nIZJ>l,1KHe'S,b3po1F[If-_Vid(bLMHN_5i`:]4<_0Yh[7IudsPnXXZIVPm/Wf2RKc+USIoAEhcmqiZ-+0_Um!]gSQe%hjZkP_&erqA.J-N+feXQoJJfY@"7+!_YYhkiFR)\%M"pA#S:_dE,Kn`(*7f3TfJhZ+bu2S*2YHoB*N3fgY5igQB$3!`r!]KsjdbLG`EfB]fRiIp#2H8s=ER57k!k.o*"^U#mX4Zlno*/9Z,QN(pt5?i\D32IgR\5n%';ktJdQV4_.eOU73gaCXr&L6PQ@-,1R#[kdLCAGjbbF>r.t\qLB0g[\jG$/eAWiZ1)s91*MJ^fd>jK.IZ?\UF\9co$5-d_M7B>H?^7(YoM?G-SL/Q%_oq<\WVWTp_#O5-g^Lq`?`I[9(BtH7mLbY`l@f`hsf9f6_9H->IfQjXM02bB7NRo[Z=Ms7(Z0tM%_#rDr0$4rsO3`k-1:<,HqrK8h5D)(RWM96\.Z1gW@N/&rTaid%!:4;em8k!e-CBQksKFplmF.lK&@OPcBLjd`:4_O+lA2c2R#2e$=d6!$&!IZruX#X37^E%V7g2r68:!F7m4/kGY6Uncndm#'UZb+;b`KHWB2eLs+d=\C&3/UsDZ.\?*Z]]=UW16%8>SGcEO!7'=IYp;"W?TLZoE]?uprhj!10*NM)l6b33-.:Y5'Zp7he5`HTiW,W&5o+Y#.MX*HEG>#"5.P*>flLqaqdAX,OjB5s]Mn!fRZKfOENi8'T=aVFqNhjNamf?,1CJNTrBCV^[]R\of;ltm!)f'R$'K=:Ve/o_e+Vq`a$P5/g3UT/39#IUS'WEkYcLbC5%/^M&j4DD6Pl45:F.fD5/asR&c9lJVmmit\X2KV?#!VU^2n0Z`RAs+_I+/]/43X,.)7M:4YlmkAB3aljV'QbBS_o$R-7.giK;U'HD`/XoF:,h1rRJ0R9KQ]`t!LPN_cOj@K'FX$[8Zb276!):u#70kL>)/=Y6%bqZIqNfRI8hXrEZS7TO>iB(2b9RRT(cLjpB5)MQ0:GfC*;pu:&80_~>endstream +GauHND/\/g')nJ00aP"6P>,_JQ=RU_Id"5R]C,?\ZuPPuJV(=ERuJsJ,+WORoY9jVOrV0hnhk*E-C-XP]^hI.1(I.YEpV-J#2kOKo`+0+_dKbQa!E?3hS\*iak_f;;7[h=7ile]3#iMk(qVaK[o"A-3;fSsaI3*1?JurCU,;S#ce_3/764b\n583.o=S,\/?4:ME!#":k#W'ENU\oKFM@N.=1M,[]oEl&3hL1YjjnGsVIp%gLcC23+VZoXb.#nf*O4Ph&^YD'P3[_fqhSTR0(al_jhc9c7AqB_L2,noE)EjL%'+DUC&Zesi'o!dEaBE.g>d_?%i7?a6;a<04Qupa8;#R=`+!0R!->;b57qr[N=AlK9,Zd(kM'sicD8]:e.^fs]m7X#PJ#tS@#_qQZD_`r!-u=h/(F0RsG9Rj3\A"\Bs5f6lNc>Ohq%26hDtP3u/j^,+F5dODl9RQo3-6'!rAPJMdXkB;oGa=&:CCCurqnn+c@h:0&3>Cg=C#+kMka&3T*$OmfZU-B]CZQQ#)!BOGh`INY#!FC@8-(La?p^_fYCW>uaT:WW`IHGT?`:F6$et^k4VW10:o\7.U-4[tP)?LONY8YXn;0$WTJ>VhQB90Z5"./XA@!+b/?RIB^ei3cOV[g`LCL=t%CF-%d0i_"R8/j.(&>(hI#HOFH*S@t<#b$_P.`dsHCe;&m]9Ra4Q5L>/aHlL]/eYE^d7D7Mhkh(e_F./I4#le0p+%tE4$aY4r!3r[IO.hR*a:rkf=?q.l^9l0_Q:M24ug<008N^B,L!Esqf^]r[WV7.4^n?#c%Hc414M'+kMQ`.oaHiUhr>`l9Y$f[+QmCM`&ERLq[&?7Yb`8+&0om:?#mGc8d142S;kQjg5hCUYkG81YuFg9UP-DL*'tZ#V=82;KmKBN([BnHM+C6X=ceP@Gh*)f-2361D8UlM<`Lk%]l]Js'7-(qMPc!@s`7K>lhY^lc;3UVf!"*D5s*YrUb&!W7:"\^'<<2)5WCp![@uj'`Oj1#"_dO?YP(:I;3P-k`]%-&Q]!SYB:h4X.!+CF>o:PH.JtlTNQ5B7MI_MQES3o;"PI`")GQ]C3NTm^6-?^:Ac54E+P/:lis8)dpZ1K<\4-,JYIU'$"h'&>sd^m=Oc@YI-6_cMFn+i_&psAiZ5S_Q/m`M&ZaV;RYp8L03$8/MPand7XS.:*m`kh'P_IK.n^]A)u$gW`C:k-\j_X=Vd&O"PXk"<4!8@k-XZchoJt,1c$-6=juSI)"@5t@4r":k4!-^m-k,$43l%uWZ3E+TFq5IgO0-2^(_Lu9g+O$XChUg+_4f)gWgWjo\O9*Z@]$h(Y1EG8R%O1'7fi>TS)"%=CKDGr"C8HF.EhW!;4_#S(ODI.m"oEnjgk0N%PZBf82$'i8.;5-PY-'H%ijlD=h&du=u5Z;S:,!Z;^O=<="^O7m[AqMBak2=Mc$252iq"b!q#*\Xn/-%HVIe"8`ml0U!':6?Wn88NnSg6ciAi9T3]F$h.0a_neF)iku;V6Ii2Y_Xc46e4%2Koh,1WA1PMgs_UP/M'+Zca)9q-J&hu=6;uMOG[UH#d/SN^ff'6e>Yo>B0h2/Yras=Te27L#b9%B&:6a?/Tl;0#M-FLq,'dBfHIHD%pGbX;_cZPMeHt1rR;nQaE?Z^,sC4r_>4hQVf\J]D/./r(@ML*u9_/aF2!&VkhRedQ`JKbdW,HYO[h(C/]m2eF;Hs#3H_F%leq(&Q)jDQNi1I;~>endstream endobj 34 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1577 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1862 >> stream -GauHLgJ6d"&:N^l8m8>2Qq@1d(>-/JFFmMk4Yhbo=G"D>mVqSBX3&W`YTHI_1lH;21:3@E^9`/#gDa+Fc)h[\*!m?>g%'2YW_fuUnZ=oOU'!l@Uq31#J0_jc6"0rU1(n?8Ei1p1k8D'Q[*'ZT-oLB._e,1d_Pn!:E=[u5g3")DjgkRj?BG43+GkRO1lS?J)+H0BS"D#4t3T;1)\B$rDDfVD%SebVre>id`;/iBEWa8e*Fc.btse1'pC5"p"fIDR4WCV]3n2F(G8LJaJ<:]$%B31#+>ZKc,(mdF24[+r$t;a6=5;Y@/cqF@O"YW94hH(/4M;Sn5r([L_t&^>#5BcBD@k0%>u'gCbr$n)ElKU%ZcaG@V4&?#:rg`4BRoH_6u9Jf_ODX=h)bS;(*57'0HK!2k'1?F7K78mdPMThld2NF>6e:h),r>TNpOMIYO?)BZaV/3RcKR$6sd,]Zb"W'cO++JUU^uLu#Gr#4(A59]iMaWMRKZ[V'lSNqrb%g'1O*e9a]fhf+2Td><-LMFoI&WF*7KBQ6jJANL8E"pp8,9KKRo6"Rj`RM02S^`-\g>H+0\M/>;;6NVIGDY@AVPs"@V;VenCTMkqgC^Pc8D4E?jcZAFuYq/CIMlIEt-@)t/ZA#@7^=SUP5uCnlV6,Ik/O/FaK):U&'ZK').3Wr(TXPa+on^(_]\Z;)l(nGe.A+m;@rQVckNLq)ipqD;ocK$Citb:V_sNV(m;.%WIV,Y986=j#qm4c+bPSo@d7K`R1nc0NF1!2sb\LH(jP4m!m^0=d]cSpBe2hf&_6142^i)JN$E9@c.8@A0_M3gBn`e,VgH"=%7m*skEM#]G'g-%oKuKJV_@Dc)Ju8*a*/?T(PJ\.sEU;Y-6Z$sT3t46ukq,Rp1(g'6HF^![etUNT`:SV='D(n10Yr+eX*_CWT&Z8-i7K[PHEQ'T!m;m5&[6KJEL"^'YM]R:5_D=f"=W%t9tt(/(?ta^MVe'u:;uo?gMpR2hECum]IXN]XH])ooYfgpU4j?td4q1D.=5PGYrVL/FWK)B[7:6s"Y*Lh7I\77,BcTP"$n=P[ThL`?Lp(M;)G-K@g`QjYL`p94n#!.%M')M(2l]kBD?Id=9QpT33?g#7:)h3W/]`?M@"OG`UQFL7O30_(nhct?TpN.(ku@PP\[q1"c4#.>bmp-,(f5(Rd'`eer$s#d)>9GACm;\]u><#p>Xk.^nrR,Hm=Pnoh$~>endstream +GauHLCJWt['`H=\\5HrgiQ0U[RB-!cmsi,Wl-mD(/?G!47mG]jo"K)tL'__06PYAp;C?-=N89O_sWrI:'837&&eq+E93FXn?.,m-_K#/>VtrZ+nJN]7J5/nrHR:^Om1-KAU'AI?k%(56e.B>jY96^W8?7#VX8Q6XdnHq*%K7?!u8jbokV7?;PmLW:7*@V*t1%X,<6%Z[=%i4>C#\G>=N;&C*M3Yrd<<$*q]&*Dm=D0po5D10I^"Z6Q3V.:X*tW,1pumf>!,_tL4bRbrpmc7'P:LaHTC/2QLVM_J;H#Y8Md*7F:;I3"@5!Bkck^e@\i%CTU%!>V=BMl\1hY*VW>.ggu%gNaVj89AR:[OQ'D1#]X:@Vd:Yb-6Q$eBXG\CO=Mt!k2krp0GY&ERlIGSm:e[?%-$i,!o@qTdMn=njn`]g&&dJmB)/hLiDV8"7:;99ECm>CmH?+1QIeMmome177>36,[.*:7NXU#`$$<7=Vm+QaO['Ha?+#"ti3`gbB>qLPV++VWOL0cX3FNF+e2IX+bSDAS(S@k\.Dhni&qHC"]]q2\RYc$_'9cjq&PP`&.7R#Vl!e@D,-j>7fE32&:0m.#]FGOU[IWU:c5a'Fh<;#PJ\P_T#GDdUlaYLLoea]Rei"5k(;7Y"mf2Q#o[43&?n1>+sjLM2aH4;]UpCN7]m,rm\-mkIb'MHFtO;!82S\S4P4AsoB';2&%Dbe'M!?Sd0?@g1B_UqrOM6%9:tTV.r'B5j'n-N2FrQ#*?FOE-qsOe$Zq@ak3*c:%*\p'nt.Tn-8l55(A;sMYtO#MY&PZBj-POcLP\?KDd5#*O655m=+:9bJ>k?keOi&E^Y:ZO]6:Z9+!+e,k7Q1qT7O_lI)2#[nGNmD\j"lXYdN6[9C%\6M^>s^tpB90g88bs&%:;DhO3[caMQXK"`br[o0t7WNGd>dRG>=eQi-'OGUmaLhiIb3!S3nFD]dn"s!OG\1M3'~>endstream endobj xref 0 35 @@ -229,11 +229,11 @@ xref 0000004174 00000 n 0000004249 00000 n 0000005036 00000 n -0000008094 00000 n +0000008028 00000 n trailer << /ID -[] +[<7d2634c98306e866c360bd34a140ae75><7d2634c98306e866c360bd34a140ae75>] % ReportLab generated PDF document -- digest (opensource) /Info 20 0 R @@ -241,5 +241,5 @@ trailer /Size 35 >> startxref -9763 +9982 %%EOF diff --git a/docs/PRO_AAR.md b/docs/PRO_AAR.md index 19588c0..2ab7637 100644 --- a/docs/PRO_AAR.md +++ b/docs/PRO_AAR.md @@ -6,6 +6,10 @@ Design notes for a commercial build without forking the cast protocol. **Not imp --- +--- + +--- + ## Table of contents diff --git a/docs/PRO_AAR.pdf b/docs/PRO_AAR.pdf index c41500e..1867d66 100644 --- a/docs/PRO_AAR.pdf +++ b/docs/PRO_AAR.pdf @@ -97,7 +97,7 @@ endobj endobj 17 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Pro / OSS split \(cast-core + cast-pro AAR\)) /Trapped /False >> endobj @@ -155,10 +155,10 @@ Gatn#?#SFN'Sc)P(%9[@2q> stream -Gatm>=``?/'n4K4^eCYcEb!SXVT!h$A1-Ca^372s0:M,j,U=NV#o4Ys9W.p(+1R0%8;VL&:Z>25!7(G3"Z"125A'Vm(D?<7St(0_M.r+L,r$FX+nsm9`VmFK]JBpfa#-="GNb.YG[_*KWIo><9WqiNBa3+n,P+qf`c.C'YN:u[,7"(rKB`%P,oPkW(KT373Xi+(ute0s+0R>I/CaP+sB(-!uA0j@6SsF8O63-0HbG[)XF.*,"6+q='$3IZcf]D7d-'3^h8_K.uMm1b54EEi$P*Mj>.;JbsWOJO0(k/1TBLYN04Gbq?MIQ[H&7Wcl$UNFV%Z04W^'J"J_sTg9/n!@#lgiVBJWM#g:B8?tIZ,4+%c":d'IcXnEFd-O4KO2ojsUV69:TT^1T)m%8^)NI1!uaVr+h&$8k`h;F)OSDTjlcYc8tBr#2]P9V9>a7pmC7msTf`Zcs;nVA1t:K"U?CJBPE]n"!01f]^S^5@T\BCN!lF:iK"VMft9`7bSLO%Z#C)Y=IT#EG[S45\A%'?H&2'2f1LknU'eaMVcHA1$c4T)l"^4TDCkj7G9;eoc:Z[YRcWi'jl,kY:Kmo+PS!FN$rHu,Y7=L99J8VU^p9I;l4T?*AZF"+Up:5Fq5*(*X.I-l9fLk:s%Fbr`=7:iO2KClF%4aAOr?.;W$jtG[(4L#JuJIV,If:0btu?-#4LAOZ_\;3)>F\M*h,5`\R!1&Hf3"49G^`>>]?cQq;KaWgN_MNFW$NO=#dM)_,P,duIRO%3bCoQ^W1R>suehh\f,"V8WC7<[@IH&0bKr!id1gk(B);_IpAUniZsABo>,5<_qER'k,%2(WLibe\RZl)VuYknJ,C>,R+OH#O!Pn2G(=j3Wq5r#_Z)JfM,J!du[)?cSPOJGahPQKW&&cm$pI:ToB(UK;icXu'j=>&plX",/1l9/V0FY(GqcrgrQY>cG,HUq!V3M\%@,naCa/pIg:-OV73<_SP^Xh>nnWaN"fFdeJ^.^nW^g[:+Y/-M.'1M_srBsA(R/1VWK;DZEXN.WF;4GL`F==JR?SbYbh=J84I21M32ZTBXk9AR!/f3-rc^?W$,Gp8p"!Y0ehU4)E$+fdYB4^5D^<`0ZLIq_S?u>\(fj'd\,F+UG+%=!t/g&sk09Q.W'/]Slc91:9jCr=N#K:[NZ_+=o`0E=`F9MNAkhMpgpe/Q%u$DN>XcrYhP#N'+X^/PD\kaM[+J+aT^.@ZRrs\jmahI'#Bk."MF3_]Wu`h]FJWk,Gt`grS#K)c"RUdW"lci/,1H]M\aR5HWU67K$@*]I7K[HtAgTI"(kE$jRrF9@/4Q&r]Bb#ZFHDjN/la/d&\"'C>2_qr=5%Z,Vf>P325fYO@PTSk;rl2`QSjJD=]hL@rlJ>9=A7F>\sLD#ih.(O.E:!4HYrn5R+%=P$m;WI+^TY._VLrkbt<\bS&ieO.0i5Isajj1DB%ju98d*>X+j&M(e%244!fJN[)4`#&&7\i7'+blmB"H";8,*%4M*Vq.L=-;3ICVPg^&I9Dk)%:'1HFMl*a9@]UsM,jp-n8;Mq^DR6Ts\VFU=7`q=4YA$eVECY@R24>ngqXYLd2Ta\&J1i1501U;kYLWtpeBq:7Q#1GVDe\2cc@2)G\kYfsF7]`S[kamj2GOCNr$fIp*`eI4lCXc$%)(0$`=#+uGVFq:R0$7e:h-3n:+0=X>u>Tcq>n7n5o"">n63>g^Afc/JE",ncJY9jN]UJ'p``tOEO)qSZV@0D:lb__.,?fEQ@,bHGT'%l2hgR$u*YH$p@YtYW2>j6CYV8Jh20-2jln_Mf($Pb2iQibUoI:>sgd"o`3[?Xc/+O'uRq]eECbpH3`g'X5,JB%`0^mT:=?&W*DNO+$lH5-j$_2VWIn(dLDe@8Orkh$Br:g(6E5'&HF*^Zc@F]$dmRlfIDL4bLIho&:MIHF\],)*nW&:lN5N6Jn5B1U]%.;'Q//IGq$APp)3gM@I'9p0uG7`2Q,OR.W#kDa`0LH2h#7pK'/h5G<>9\WA3igs[r/8+)44o7sdDfI1,d4u0[pKt`9h/6p]eVi#b_,t]*c3mf/55SsR:4Fpam(LjXCPt/0m^'l+TU7(YD/XpW*4rnHV3*[gm9-l.?@o\es<_2Xd"hB9-5/ih%G:(^DC$jn?!N%-G`QA+udIt4W#EukC/[%b]\s,U4_kC-e0WjjG5M6.68;.$&&f=76%%AT_4;"<@gXE_/@):F*K[LYKF3Cj(#=[MD14;k'b?1'/1uJ6K7sFc@.j9hq,h(p8FFMp]b!fg.?S-rjEG'"(Os_E&Shq3([DhnnO]kZi-`t+"0HUEsY4Pd(QLH1DqrqWNH@'6o:-A,lMVQZ58BS)f?[kB5Z)TMpP+uLN+k:\1%;ehrjJ&f>QW>o<&.r`U/g#-gp0L9@J8MkIg\Sc_^[DptFj=endstream +Gatm>=``?/'n4K4^eCYcEb!SRZoLpBlt"nif<1J675Gs?KHqfg_#gF!l1Dab"#j'k.FCoMM/A+T^feFY^_SZpAS'c4OH@f_jQ)4f/=YEJM<,X.\c5DWmbe!+SQ/Lt6XqqjRP#J=-\gkZ?*(qZ/@;Fj/;N#9`%m=G?EQ5Wkl&`l9N/5dPajG>7"OXBqt:EHW/Z=_%M.Nu&2M=uE*8t!76.;'a2Pk9RL:";M\g>)u)Q4]l0LtLX^s`d>bM4"sS$p&F]7[MK&$^WXTluK,:Is%ZSptGHK@5mBaM[huao1R\,a(VH(,@loP'N!N13l8%MdUG>U(raA&b.,HCV85/pt,s6*(a'T#s:V<;"tI5H'9i^Y1@\,Y`)]]ETL,U9]=&Lnh]`84o>TCJ$/odJPaSZclk6p+=Cf7[iK4:pcL"bl%fJtA!'*VY*o%ULkn%L,!o,HP(c"-&UZe6eB,Vi&_W&C?aRUet1_.:DMp5+/W5*plujFla\b#(,u5j5pPM^WhlE1u\844%LGd3;-S(kb<551k,g]i"=A<(;@E\?u'42e\U@MgDnl"#JuJIV,If:0bu!n-#4LAOac@(R=Z-N'8?4JN+LjA+pM<"R0j4o[\D^P0U'DZ=Y]a()p&(&+\`M$2cS38VHp7`)FE^rQ^W1R>suehh\f,"V8WC7<[@IL&0bKr!id1gk(B);_IpAUniZsABoS6lLKK*U;RKa(g'_+*]E7t_u7bE-?"#]Jp%`lZ4d)lT/Rk3^LR%TsQ#n==o^c1DZQj*S8@ZiPTQr8I(7j:2N\W9GYj^NE(kLo2@&^+`+HZb=D6bPu@%itFLLX(cRHDT%tha<8&aWWej/s4M$FhqjDYdtrGdOEYs8KO4<._R^il&6g[l)GjtAYdD9YL\NgJ;:cRV@Doic$*J#/Mm/\psZYAHk>k)LWHAd/p/a>Pq"qpN+<>+22lbJl0uVhT'A,B=4=#(A0(^m=ht+;n=!,Y#559:A)'7IK6p^\(fj'd\,F+UG+%=!t/g&sk09Q.W33]Slc91:9K>EK:4'q>jY_=FON7+;/W-+[$e\V:S:CU,:?T*\m$[5gU]ET%pW;--pJiiUX2a^!:>s7p@J!,EB1HA82_>*$nE(@MhLNo)$=9ei\)aP8h%nCVskS8fFj](-Kt\Pue,:ucp?Og$J>X$F_[XoM.3Nif$a]iC\b35*Vt6M-(5o4`(MPrWd"H@MjYVdLhi$_1j,b']#snc8>9a;o>+L"d<>9KWgrV!4FJ.aCY[=A<3>MH_kMHFnbA.R3QO_,/YGY^!"JCZ_q*hH4@?CH,OZk0k3.9(%/1RP+]K?+ojGqpW^9ms@&4IVVm*mpbXs-UM;lStD"Z>r6o+V*gg!D0,K$V\^:CLA"Ri8m5-5!Qjm0^1H.ZaBJ7m#/-8\%"HZ.fB)Y-_7WSmfeV6(E%dlF6LKf@?=E$Z4DAH"e_(2r=,-,9%33!ZM`W7-d2.6J<#YB.iMrTZ?LqTP2"'Zo4.P%05qSX%*7,\p,tB=i9bnB3P=8";J3h_$!>5YKp$)qG7!U4g@QbEd@:?!<0N7uF4D4%\ZFN\Ag""%/Hl.kUM5NVbJ,5!c*5C0?Nq(g7J:OT8TSlUW+])s],C2Hu]Uoabdk)tiVe&r]bK\jHidBhf`\kj1EXA!dK$=petMBS=k7.`ad;Z1(k0'NI?.U^m[rHZ&4oSSn=<:5K"b\5jGoGfMgDAP&Klt8IqOGDXh<8pG%B`s2-$5ikWs?sR?(?N\W@eB8e7Vmi-Aj/Vf-V&Tomr*1ZT#XCh>7@Eu=UW81XaV\eNoqK:uW:*_u!j]aCU_AE=qfG+ohmfB/n8VWK"j]_ao,8$GA~>endstream endobj 29 0 obj << @@ -198,11 +198,11 @@ xref 0000003547 00000 n 0000003622 00000 n 0000004353 00000 n -0000007704 00000 n +0000007726 00000 n trailer << /ID -[] +[<78b839a2a40ce2e87baf5e316381c96a><78b839a2a40ce2e87baf5e316381c96a>] % ReportLab generated PDF document -- digest (opensource) /Info 17 0 R @@ -210,5 +210,5 @@ trailer /Size 30 >> startxref -8139 +8161 %%EOF diff --git a/docs/README.md b/docs/README.md index 29d4789..d95be7a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,8 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu - [All documents](#all-documents) +- [Specifications](#specifications) +- [Design reviews](#design-reviews) - [By topic](#by-topic) - [Infrastructure and deploy](#infrastructure-and-deploy) - [Development process](#development-process) @@ -26,6 +28,10 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu |----------|---------| | [20260602_REVERSE_SSH_proposals_summary.md](20260602_REVERSE_SSH_proposals_summary.md) | On-demand remote access (WG/SSH/file API) proposals. | | [20260607-2FA-email-mobile-auth-flow.md](20260607-2FA-email-mobile-auth-flow.md) | Email forwarding + registration/2FA (alpha must-have). | +| [20260608_ALPHA_PRIORITIES.md](20260608_ALPHA_PRIORITIES.md) | **Master priority plan** (0.1–9.x renumber, owners, alpha path). | +| [20260608_BE_SERVICES_and_infra.md](20260608_BE_SERVICES_and_infra.md) | BE service map, validation status, SFU preview (gray). | +| [20260608_STREAM_DUMP_DEBUG.md](20260608_STREAM_DUMP_DEBUG.md) | FR 0.1 stream dump spec. | +| [20260610_SERVICES.md](20260610_SERVICES.md) | Exposed services catalog — web UI, APIs, curl, validation (2026-06-10). | | [ALPHA.md](ALPHA.md) | Alpha feature freeze, QA sign-off, defaults. | | [ALPHA_SOAK.md](ALPHA_SOAK.md) | Short LAN soak checklist for demo validation. | | [AV_QUALITY_QA_SESSION.md](AV_QUALITY_QA_SESSION.md) | AV enhancement Q&A: sender vs receiver pipelines. | @@ -36,22 +42,34 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu | [GRAFANA_vs_others_graphvis_pivot.md](GRAFANA_vs_others_graphvis_pivot.md) | Custom graphs vs Grafana decision memo. | | [INFRA.md](INFRA.md) | Production topology: Gentoo FE → Alpine BE, ports, nginx, sshfs. | | [OPEN_API.md](OPEN_API.md) | Crash ingest API design, triage tags, heuristics. | +| [OPEN_TASKS_GRAPH.md](OPEN_TASKS_GRAPH.md) | Open tasks dependency graph (Mermaid). | | [OPUS_SPEEX_VALIDATION.md](OPUS_SPEEX_VALIDATION.md) | Opus/Speex + UDP stream protection E2E checklist. | | [OTA.md](OTA.md) | OTA channel layout v0, manifests, MQTT, publish flow. | | [PRO_AAR.md](PRO_AAR.md) | cast-core / cast-pro AAR split and Play Billing. | -| [REMOTE_ACCESS_IMPL.md](REMOTE_ACCESS_IMPL.md) | WireGuard v1 impl + deploy | -| [REMOTE_ACCESS_VALIDATION.md](REMOTE_ACCESS_VALIDATION.md) | Linux CLI suite + mobile parity | +| [REMOTE_ACCESS_IMPL.md](REMOTE_ACCESS_IMPL.md) | WireGuard v1 impl + deploy. | +| [REMOTE_ACCESS_VALIDATION.md](REMOTE_ACCESS_VALIDATION.md) | Linux CLI suite + mobile parity. | | [ROADMAP.md](ROADMAP.md) | Implementation roadmap, alpha definition, deferred work. | | [TICKETS_ROADMAP.md](TICKETS_ROADMAP.md) | Tickets console, Gitea, attachments, agent queue. | -| [20260608_ALPHA_PRIORITIES.md](20260608_ALPHA_PRIORITIES.md) | **Master priority plan** (0.1–9.x renumber, owners, alpha path). | -| [20260608_STREAM_DUMP_DEBUG.md](20260608_STREAM_DUMP_DEBUG.md) | FR 0.1 stream dump spec. | -| [OPEN_TASKS_GRAPH.md](OPEN_TASKS_GRAPH.md) | Open tasks dependency graph (Mermaid). | -| [20260608_BE_SERVICES_and_infra.md](20260608_BE_SERVICES_and_infra.md) | BE service map, validation status, SFU preview (gray). | -| [20260610_SERVICES.md](20260610_SERVICES.md) | Exposed services catalog — web UI, APIs, curl, validation (2026-06-10). | | [USB_HDMI_CAST.md](USB_HDMI_CAST.md) | Roadmap D/E: HDMI awareness, USB-tether transport. | --- +## Specifications + +| Document | Summary | +|----------|---------| +| [20100611_3_url_shortener.md](specs/20100611_3_url_shortener.md) | URL shortener service — SPEC (`s.f0xx.org`, post-alpha). | + +--- + +## Design reviews + +| Document | Summary | +|----------|---------| +| [20100611_3_url_shortener.md](DRs/20100611_3_url_shortener.md) | URL shortener — design review (auth, slug algo, task graph). | + +--- + ## By topic ### Infrastructure and deploy @@ -74,10 +92,11 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu - [CRASH_REPORTER.md](CRASH_REPORTER.md) — crash upload - [OPEN_API.md](OPEN_API.md) — ingest API ([§Upload API](OPEN_API.md#upload-api-post-apiv1uploadphp)) -- [TICKETS_ROADMAP.md](TICKETS_ROADMAP.md) — tickets + Gitea ([§Open tasks graph](OPEN_TASKS_GRAPH.md)) +- [TICKETS_ROADMAP.md](TICKETS_ROADMAP.md) — tickets + Gitea - [GRAFANA_vs_others_graphvis_pivot.md](GRAFANA_vs_others_graphvis_pivot.md) — graphs pivot - [20260602_REVERSE_SSH_proposals_summary.md](20260602_REVERSE_SSH_proposals_summary.md) — remote access ([§Rev. 3 Q&A](20260602_REVERSE_SSH_proposals_summary.md#rev-3--wg-vs-ssh-qa--bastion-deep-dive)) -- [20260607-2FA-email-mobile-auth-flow.md](20260607-2FA-email-mobile-auth-flow.md) — email + 2FA ([§9 Email](20260607-2FA-email-mobile-auth-flow.md#9-email-addresses-agent-config)) +- [specs/20100611_3_url_shortener.md](specs/20100611_3_url_shortener.md) — URL shortener SPEC ([§REST API](specs/20100611_3_url_shortener.md#6-rest-api)) +- [DRs/20100611_3_url_shortener.md](DRs/20100611_3_url_shortener.md) — URL shortener DR ([§Resolved open questions](DRs/20100611_3_url_shortener.md#2-resolved-open-questions)) ### Product and codecs @@ -85,7 +104,6 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu - [PRO_AAR.md](PRO_AAR.md) — Pro AAR split - [USB_HDMI_CAST.md](USB_HDMI_CAST.md) — HDMI / USB-tether - [AV_QUALITY_QA_SESSION.md](AV_QUALITY_QA_SESSION.md) — AV enhancement Q&A -- [OPUS_SPEEX_VALIDATION.md](OPUS_SPEEX_VALIDATION.md) — codec + FEC/NACK field matrix ([§E2E matrix](OPUS_SPEEX_VALIDATION.md#e2e-matrix-run-on-two-devices)) --- diff --git a/docs/README.pdf b/docs/README.pdf index aa07291..dff0c96 100644 --- a/docs/README.pdf +++ b/docs/README.pdf @@ -2,7 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 13 0 R /F4 15 0 R /F5 16 0 R +/F1 2 0 R /F2 3 0 R /F3 15 0 R /F4 17 0 R /F5 18 0 R >> endobj 2 0 obj @@ -17,57 +17,68 @@ endobj endobj 4 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 716.2874 95.92504 727.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 45.68504 716.2874 95.92504 727.2874 ] /Subtype /Link /Type /Annot >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 705.2874 74.14104 716.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 45.68504 705.2874 95.03704 716.2874 ] /Subtype /Link /Type /Annot >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 59.68504 694.8499 142.6425 704.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 45.68504 694.2874 99.91704 705.2874 ] /Subtype /Link /Type /Annot >> endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 59.68504 684.8499 132.21 694.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 45.68504 683.2874 74.14104 694.2874 ] /Subtype /Link /Type /Annot >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 59.68504 674.8499 106.38 684.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 59.68504 672.8499 142.6425 682.8499 ] /Subtype /Link /Type /Annot >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 59.68504 664.8499 107.2125 674.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 59.68504 662.8499 132.21 672.8499 ] /Subtype /Link /Type /Annot >> endobj 10 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 59.68504 654.8499 125.97 664.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 59.68504 652.8499 106.38 662.8499 ] /Subtype /Link /Type /Annot >> endobj 11 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 644.2874 102.165 655.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 19 0 R /Fit ] /Rect [ 59.68504 642.8499 107.2125 652.8499 ] /Subtype /Link /Type /Annot >> endobj 12 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 633.2874 109.701 644.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 59.68504 632.8499 125.97 642.8499 ] /Subtype /Link /Type /Annot >> endobj 13 0 obj << -/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 622.2874 102.165 633.2874 ] /Subtype /Link /Type /Annot >> endobj 14 0 obj << -/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R ] /Contents 32 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 31 0 R /Resources << +/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 611.2874 109.701 622.2874 ] /Subtype /Link /Type /Annot +>> +endobj +15 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +16 0 obj +<< +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R + 14 0 R ] /Contents 36 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -75,126 +86,136 @@ endobj >> /Type /Page >> endobj -15 0 obj +17 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj -16 0 obj +18 0 obj << /BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font >> endobj -17 0 obj -<< -/Contents 33 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 31 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj -18 0 obj -<< -/Contents 34 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 31 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj 19 0 obj << -/Outlines 21 0 R /PageMode /UseNone /Pages 31 0 R /Type /Catalog +/Contents 37 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 20 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Android Cast \204 documentation index) /Trapped /False +/Contents 38 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 35 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 21 0 obj << -/Count 10 /First 22 0 R /Last 30 0 R /Type /Outlines +/Outlines 23 0 R /PageMode /UseNone /Pages 35 0 R /Type /Catalog >> endobj 22 0 obj << -/Dest [ 17 0 R /Fit ] /Next 23 0 R /Parent 21 0 R /Title (All documents) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (Android Cast \204 documentation index) /Trapped /False >> endobj 23 0 obj << -/Count 5 /Dest [ 17 0 R /Fit ] /First 24 0 R /Last 28 0 R /Next 29 0 R /Parent 21 0 R - /Prev 22 0 R /Title (By topic) +/Count 12 /First 24 0 R /Last 34 0 R /Type /Outlines >> endobj 24 0 obj << -/Dest [ 17 0 R /Fit ] /Next 25 0 R /Parent 23 0 R /Title (Infrastructure and deploy) +/Dest [ 19 0 R /Fit ] /Next 25 0 R /Parent 23 0 R /Title (All documents) >> endobj 25 0 obj << -/Dest [ 17 0 R /Fit ] /Next 26 0 R /Parent 23 0 R /Prev 24 0 R /Title (Development process) +/Dest [ 19 0 R /Fit ] /Next 26 0 R /Parent 23 0 R /Prev 24 0 R /Title (Specifications) >> endobj 26 0 obj << -/Dest [ 17 0 R /Fit ] /Next 27 0 R /Parent 23 0 R /Prev 25 0 R /Title (Alpha and QA) +/Dest [ 19 0 R /Fit ] /Next 27 0 R /Parent 23 0 R /Prev 25 0 R /Title (Design reviews) >> endobj 27 0 obj << -/Dest [ 17 0 R /Fit ] /Next 28 0 R /Parent 23 0 R /Prev 26 0 R /Title (Backend apps) +/Count 5 /Dest [ 19 0 R /Fit ] /First 28 0 R /Last 32 0 R /Next 33 0 R /Parent 23 0 R + /Prev 26 0 R /Title (By topic) >> endobj 28 0 obj << -/Dest [ 17 0 R /Fit ] /Parent 23 0 R /Prev 27 0 R /Title (Product and codecs) +/Dest [ 19 0 R /Fit ] /Next 29 0 R /Parent 27 0 R /Title (Infrastructure and deploy) >> endobj 29 0 obj << -/Dest [ 18 0 R /Fit ] /Next 30 0 R /Parent 21 0 R /Prev 23 0 R /Title (Agent bootstrap) +/Dest [ 19 0 R /Fit ] /Next 30 0 R /Parent 27 0 R /Prev 28 0 R /Title (Development process) >> endobj 30 0 obj << -/Dest [ 18 0 R /Fit ] /Parent 21 0 R /Prev 29 0 R /Title (Maintaining TOCs) +/Dest [ 19 0 R /Fit ] /Next 31 0 R /Parent 27 0 R /Prev 29 0 R /Title (Alpha and QA) >> endobj 31 0 obj << -/Count 3 /Kids [ 14 0 R 17 0 R 18 0 R ] /Type /Pages +/Dest [ 19 0 R /Fit ] /Next 32 0 R /Parent 27 0 R /Prev 30 0 R /Title (Backend apps) >> endobj 32 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 631 +/Dest [ 20 0 R /Fit ] /Parent 27 0 R /Prev 31 0 R /Title (Product and codecs) >> -stream -Gatn$;/_pX&BE]".IJp[1m^!8_qmqJ8<[5ZmfGQNOSRRRR+4n7FJ",91Wo*>]E3Wu9"!0Ir?K@%s-"\^^X=AouS.2iHK.HOACg$Y)J_NdSXW=/Cb"6;Zhrs57rhX%Z,qJf8KN.`5EZ2i>jiUhT!2^E4C(d%!=PG!8B"k0;*41JL*oBQS5'ea>$JS1M"K_P95$UQs,)"&aU#=Ib'ctP-#.g9MgdV.g'CBb(:l$b]YHuUOuh8,\SV2uCD@+\5b[Jc4:RC8N%8JB*`Q_9c@)XnOfB:\KU@fN,-1!gk\[iS#12CMkqaKlb-ONB%uHj:9>@a/n9*)J028/$&.K3lmIsh/RD1]#q0EbJ!;=$.cWTtL.".R;FfEuSJ%Zg73;$(7i2_hl7Rllm_)iQZGga+:RFY"'q:N=R7nf[gJ%/IShDXk:m+.dbE&1k<6`D,lD8:"AK;PbdA"B65b%afL*6X>H%64_/-GKRqc`>7~>endstream endobj 33 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3236 +/Dest [ 20 0 R /Fit ] /Next 34 0 R /Parent 23 0 R /Prev 27 0 R /Title (Agent bootstrap) >> -stream -GatTKBlg#kp3V8-q=H.XY7!EOhhWG4G;L3q1[eA@MB^\&'=M=(antc"1^J[h,%.6ZP3+T6m63$O0_iO4s-jM6bnBks/?g*Ff>%_V!L@6BQ<1i(f_nQ2lq*)U#TtWi:ZM`^^5$)C!=,)E`5(M+\Xj("-UF^W(`E0X%+dl$1>fkIgN)0oo"ajRMp"h2X[is<`/H7n9qW[-N#a"sX_;L\&8_`T4>V/:)o9_j]bN]KY8nJ"60JIm0\dC&?5UMs#i8V=]*j'QFr#?6?bZ0H_"&j(s.\L8iQiT7&plAYaAerK)n;I`1[O?8,*Qs?s;H7ZUQ+qgh-0mF!H@p"`[WBj5PIsL[O5X4R"HG&Fl7iXdM`gY,J],V:oOO('#V%sZ\.ibASl5AApGBA;0UjAGJ,!AD-PiA=5=k*1Ss\gr=fkH1Ql0XN/r&I][EfD7UudE$-MlSbk!.nE^\j11c"8?It,@`L3TcQh5apM#SdO=0Y,PpG$,8WH+2,VbfQf=l%lKr-L=&%Wj-^)%]2W.ufl4_Ib^i9&OeDKeMh)@lr0GS'to1eANnbkuJ<7o&nrb9in-7PA*kBBjSpjO&l9/N"Yp\N@3WbZK&?nQq>qf8-2=GAV]q[DZuL>,0STm02rJYd3$nr/H$T=CDm\1pcBj8#Qd4p9t5cE>Wi-`f=$[#fq]N2W[7GcQ:S^,.9b.0Y\r('[teS&Fr'6JL;1!CZBTOost5UZ8Q/RWj\tH[1Z,>9\"(SA8=qKZ1W\S`p+e%T(*$IQC)SK>)ui$V/e]N)7HqFCfr3W0PE#mGQ$c/*KQNdl;&h([TJKcO7hSXM#C(YO=#C&6A:ru3tQUO\0ac[g8BVFombCsl;n7J]-7:B69Mq.Z$,oODtsP-@T%&B?>:tac1>UrX5@Zunat^bi\m]c0)c;K(lgWg7`L2>bNVpl^h[c><)1n`6P&#$MYOXS=XbK62^LYX:+"\B3)[fi`+r-,QL'EePt]Q\(_Ko%YmR08,B\_Uc=URY0cA.kQ>!F18==8"l$TJTlUfWsMX#NUVrP`>R"5ie+\(3'/*]9G+5Q4_JMqXPe\74faA'e5O-]XuGl"2$=?6BW=77KOCUYTH+t!*^G=&n&g+gI#"T*uOpTDo*8)%;>&KP_7q9m*;C(hg[:V?@p[Io)G3&^,O&?\up;CAFmX(\ZmWK4'n$Zusfiuli1J`1NkMi+!H/45cj2_h/MTgNB>#@)^-2c?,pHlBoQ@;bV91_rSt8UF$h*OUdhIVAC8/!mB4-5VJ-!DFkgUFLKD.nV"nBc?/cmckeK4qlfu>A+Hb5X;d,Q&G+qd^[MR*5e$H742VmM&At4+EO9XTBq0?;7Oi!2)s9=#$0t16$8o,+\1Y&&2Enf6JfW;@/.\g>)AXnaH!2ij]Z.-'fG9Xo]Lk5nEEY5h:N][>(Sk6-2pl8^9b.or4sYWQd/`DskhB.&oEAkU3S[^p-;U+'iL%W1c!6`3Q^Y&eLR9^ZUWKTDMU@%(%kAds1"J1cA&325)ina&/QG=uBUm2/"_r;TRZe[pDYsOQnHd"a_HQVN8F&\5NPLFO6rP#%1\7Sl4&KXu,\`9eKI092q4oiu!&GqAn2l_4RTPVRY!jL*D+9*WZc%&@GcNld;WH8@3?!@qQ4(B_W%FrMR.s*YQF(ko*_g:?W)7)mgSBaeM[ce(I`3S89Raq"3QSqDT]g)E3h)2-o?hTS/S[kHd6!aKEl[G(,Y8=t(0DV@P2P)LH^l:o>VeP:L#\spmfP@02g/M!ciNUk`S<"+"25@aX-7+gD6$7U(X'@d:A!<(aUChQS*0ZPg1X7ND@S(0(*H\#5SO"4XR71N:8EpSs1#GY5+J4[qO.q#opiD=5GdZ20+W2B_k&bIikAZeM0\\QFdWcRb:s+&mp9Q"?XdPO>s((%u$>0;2f.0EVGu_bYWO`_WR>a=Ap94(H;3.m:<"'e]"hc72pUKeEOhe?i(1p()ZKE?:PX&J4REo&R$bp$>[-p:!rtdi'7#*k>b=:A3jbbq"O^cW[GZ15$W.=h/^*6@?H)-,(M+*AdTIb>>?<8_mprsQPkTSi!LUaa=DJb8_dmfV$D-,fh8C/oqRWPX)b&5oa)1iA(Wm8dU0o$q)IL"V=u%+JkkC]$*H<8K2c>K>`p2kVGB1RB0tG(l4^!qD&)):ta>YrGUYgII)W!6qO8F3Z3CQ>-5?qT]N66Z7.$>HF7u[O'2O",%XYA$GiWm&HguEFdIr]@M^JB;>n\X:T=Z6I;h2pSjl_ACE3Z!(Z+_a06)h5\^MFuTT?bY%JOI$_/T'#AN'Q:'L]#[F-M[H&A,dr;#Ot,gQV=2/j\+W1_LF:%_?=#$'rq6'Wu5VE3c\l`o$g+X\e,)YHqqU]NPY6ACWcP3`g[7o`YC^-n[.D,Z&92a"&s8.!M:[k=.0V@#kLJdMBl-s4ncBR2kAV$*C#e2X:u@EMn?hb/6@0RWnA?Q[g+M36NHjX)!O!)fnnRY(sF?dIau8Aqc0A6G8FJ;W\WH*f0IS%EeMIOtSt5n]G1r0_PUC`0HeJMO8PA#'7?0.*enm*TTTLo*c%*G>V4&T4Qs-[SNmKMJ`%X*%7e1\:fLpL-`sP;V(RMeU3@;HeG,O>2?SbhhIphendstream endobj 34 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 722 +/Dest [ 20 0 R /Fit ] /Parent 23 0 R /Prev 33 0 R /Title (Maintaining TOCs) +>> +endobj +35 0 obj +<< +/Count 3 /Kids [ 16 0 R 19 0 R 20 0 R ] /Type /Pages +>> +endobj +36 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 669 >> stream -Gat=h@;jjR&;Iso=.E5aU/NeO#mp*\da4`9_SFn_#q7WdTim5Cg.!"\IWcFXg/9N)X>l5gkNDO"c58[uE7lU!^_MRS#QlD=f78;1"._\Fc^rF$Aa+D8d-Z'AKOK\LG0dXHG1eq9j'EQ)c%-Ghg_u=GHX3e#TJk.6Cq)1'P1"$==E+B6(XUKgo@:9JXFQthO`f=?3Rh4lWfu,8f=!jo^jGYTtIs,7D&IRlr;A6:+7^N@`#Y2>UU^gT0J:XW"F0p(/EJ1.r:Xc17T`A06:`C]qT!R)YoCoZ'i%8hlGjJD+kNY(:NOIj4S]HlE)tqQ["-Sn..:TN[lk]lkKU5O7[*F.J2B&t$&8DjXmM93$8Shmc-9tl]oaB2O<3!/%G))-Z_Q0B#:\B"'9s;%\*U6<'f3Ljb!\1J9Mi!DVWafs&,"XVHGJ2U50%E9~>endstream +Gatn$?#SFN'Sc)P($C`SRcf_k:3HjGUe.]>Y.<=^l59!r[c`f42kr>Le7bClWIj#@&_"Mu]c_RZn1E(1^XJ68CPOT?)bjp;(')MN[("%GP\%1!;oG6gf&!$MCMJQ^VY.MtrTjfP]DWbbl66)fCWb2$*d[VW?/TM;83It6N+'Hc;_^P@Hm]!9itZV0k;(-R)#eiGB-T]5oHOoYIH(*L?+#!XH]-!<4-jSc%5IeW[9&!HrpuEg9&O^%!Rm@H87%">0;g3m*`E]h_/Y&Dp`L:X[4'#hFh'%)5DcB_4&ZLbP["#D5bM'7Bgbq'`4cW@5qtrbmK>H=##_jSsPV!r-'.MS0@H4E5B%n-faLKm^uM+NY?1m=;rR`O]lP,C#I,09pi)&4'Ou%`KY;6?'d-"46N\`_d9CV.I3(*\[K4<-]Z(-%kku`#l~>endstream +endobj +37 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3307 +>> +stream +Gb"/)>BALj&q9SYkbkQD/BAacad\6#LD'q1E3cCa57ZKd$D!f..Q7K4q*i0fPp:mp9\6-WD'`fMpEXbDK'NgC3>+Y[T,;1hf\,n)qPlqhf]51%`>>aH'N8_\$F.EQ/i48gh,QS#ko5V93h%^T2_48FQr/;Q3O)u2TURQ(*+-J4.pRHFHTSN\9,*E.Y,"':Vr>Tm[^Pd$h:8qH#)@S[.//_Xib.?A>APK75))jj:Q"?e@AVkM3=fh??)0GBk1$UnmZns(ZrH4LLs3)HgQT@Uu0C;'B&:>sg?GON,GSAsg))I;%Z?G;oj(3p1<]2R;o&J-i.*7XFM-?gr([5g-UZXRO++Bj6YnQtqe$ZEYKEj%S&X/>(9(q':B$D-X]i]Zj_^GeCR!Q"Xk7S*5<7.u!:AS2+B;]^%N((qRBE5q.a0X*h4e%M0o?hSh/K1To1AmE`TE#mV'k^3RS?N8>l3KNbC5<[-)aD6-Q(:lS-u=YQoO?\Z9N_5b-1H7@b5r[fr-eo5#WI>benXFk1uGS6P-o^:^#\lq?[(p:?[Km5\Lt!?I.\7Z?bC`IW1P1?YH>b+P516nBA49V'anqP#)F;240W#58e./%-q_)M:Bjl3/-B?*2!h]8,-L-cbabJE9$MX*&7._eq4nT@X$l,KCue\/%2=SQ^l:^OsG6Lb?dle0?nTScXF'fU'/Ku=,6tT!7$lj%j'kLT#X^/?#\`BPKFKB[;t0kRp0qr>5i*jTT[l80q*Q.VJ!a3BU0u`ZaBN;R(oK3_m6'*9uc83hst.:-f!>Q$FBLk`q8UOGL&(V)_sN1Z]e-1K-n+,RN-69j%IT`Zgm[k7d>0TJ\^[S<>]1=@`$sjC-5dj4h+9nO6c$5IN0II=g?<]SkghL[)PDLl""8JLEglq9YL->0%lhA6-,f"L*i:QkUM=.(n!0NK$D<9ELGZ%g'm-k!m.u1S'IAO]U;gf\X7j(5OX1&#'CqBbbd+q2(8j#Hf;(F_#IBU;#_[p\G?hG!Oo;t=PKh8^Q@WlJe3RW,FW&Xa>Za,pZ&0^qn1iDN7Yp*lqK*&eX[1Q\Apq'!h_[,_qt5_IaCCrV=F?5A\sUBn*[Hk@2[hBuUOl^97Tc3ekHoPECQ+IV[knn.(,g((g#ls^G2U7Wdg;!U@U=D+dIj'nI"PpXR'6i,OYnS*cl1t=B=A7q0sds2f\[6Z>aij58>?9j0TFBp+_+<8Z>VC/`F/`Wr5hSNhNFsATQNk*UG\pc,2Yqp:+N*deG#@9*dnOH"SQ:8O*A=M`\!*qF)nTl@O.iFW7D`i:;[Co[+:UV2P8^#frY%Y?erP%e9:rspudb;N=H&$LBffb9sU7M)`B/b#4oEg94&]CZ<0N9N?H9k)I:ZcbWWO6VBo5\S68;(q"f:Da>#=Q-5$Es2*+Jq)dp+(p0Kl&&*kmI0lDR@qE,Gq6FP]gCXE%i-$S4=#`JO2Za.#?-X6`,@LD8N87m7&l>f=HN<;jT12K99PuK82r.l\m-E;YU!ot$2LeN.=-]$_ic8q'bV!LP!gcF*0qkT@TGZD8Gn53JAd3haf&X,+P2qKXpol$+MDb15,`*7On6nU$I<*6V]M"'E/(mNK$haa,@t2C]Efc@u#C7,)R9^[VVk(B?.Z=MHN)W;am.a:N#?*-s;ed.TtLHO#4a]].1(i(8%1O+POJBRdafB!o",T]RRk7?>PWkl,ch%c?m=SF:Ir1mi@C1=WRk6nMlgh'56\$9H]6c3MC#W?Y5(ZXi7W=f4HOtPg#1!C@TU0e!o'XX"<'X*fKL);I7miU"[&]XCS1a+2]k'T=4S-RhldW[uP_a^?LQOg],Y#V'Vl'lg&\jltP:1RZ4%J.UaH,QpfSZCGC+&jY(`Q!&Okp[<)+=Wehh,"]q1Vg,CWdc7eoAY\H%uYE:%UcdqcGKo0a=h)kp52V)mikqK.F.bQ7J<),W$-/+8i#/nePI_'5s?,`M-_*Mo3Fps.GK:Wqn2@b>%VL99rk.L/GbD+uNba=S'43ql4k6DQ3Xda34MgpIVn1:>bmb9l>BT6ug',Ukfsr/^PJChMr\ra,Af?LPlCArboA`F$`iS>[i+\">\[u(=G[?NuT>,otp_PS+.Y`bM+Cn2_@*!#5ItM:N$]/-$nhEKadq9SRcS(?[l:"SULEa.ub=-kI$coS=Uuendstream +endobj +38 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1189 +>> +stream +GatUrCN&2l'SaBsF96;]?A(Ec)LkU]ENSQBTqjsmV1qA#1.+o+Lagrn:u,hLN;o8o,CpruTD*6liDK#379'\P8S*<(WG6BJPXMrUC5T%aP,TII`>Ni?+m`po4geS80)>ST=M)RqiPTanLRZe\\_3XKohBY]Z+#;T4:*So+;*;L+o'`0kMmr66Z7%Pl;\$EXj)=O!)U$I_Ii'-#'2KUnCRJ>/`5i\^qC!NCW!=E$2G\7sd(sOa$;3P;:!T^YQgq%1HS;qs)D9V$UHoIJsG_k@TiD:+h#'mO*LiS[p/C)p\-"9cGGO!2NkrAO\SR'Q:[X%A9Pc]&bEWdf]GY1Z47E%7BZTk#&qZqDCH?.\oR,"W,Tn>JM)Yju0bFXdoCi_P&>#Rl6P&;@;uUOH.G>\#cVcCLR#F1II_BQp#.HmMDoT,u)X9g>"gnE??'?%i@scM%ML@7.?\9WccX!rL'Mh/@"kW?R4Mi=-*7)>lU<=55M9GV)k9U\%Be:CC[=>lE&ZI04WH1>6r\TI3+Y-`\nus?EK!\-gC7_IFn$\p,l-4`S[c&Ks,k5!M[XJc9j/_0)0'r7>JN->HMZtfV*U6@^"B'?,bU(=d/(M`UDLB~>endstream endobj xref -0 35 +0 39 0000000000 65535 f 0000000061 00000 n 0000000135 00000 n @@ -203,43 +224,47 @@ xref 0000000502 00000 n 0000000650 00000 n 0000000798 00000 n -0000000944 00000 n -0000001090 00000 n -0000001238 00000 n -0000001385 00000 n -0000001533 00000 n -0000001681 00000 n -0000001797 00000 n -0000002072 00000 n -0000002178 00000 n -0000002256 00000 n -0000002462 00000 n -0000002668 00000 n -0000002755 00000 n -0000003067 00000 n -0000003142 00000 n -0000003237 00000 n -0000003379 00000 n -0000003486 00000 n -0000003600 00000 n -0000003707 00000 n -0000003814 00000 n -0000003914 00000 n -0000004024 00000 n -0000004122 00000 n -0000004197 00000 n -0000004919 00000 n -0000008247 00000 n +0000000946 00000 n +0000001094 00000 n +0000001240 00000 n +0000001387 00000 n +0000001536 00000 n +0000001683 00000 n +0000001831 00000 n +0000001979 00000 n +0000002095 00000 n +0000002387 00000 n +0000002493 00000 n +0000002571 00000 n +0000002777 00000 n +0000002983 00000 n +0000003070 00000 n +0000003382 00000 n +0000003457 00000 n +0000003552 00000 n +0000003661 00000 n +0000003770 00000 n +0000003912 00000 n +0000004019 00000 n +0000004133 00000 n +0000004240 00000 n +0000004347 00000 n +0000004447 00000 n +0000004557 00000 n +0000004655 00000 n +0000004730 00000 n +0000005490 00000 n +0000008889 00000 n trailer << /ID -[<22cd500a0b10b610bf3c3a20eda45db4><22cd500a0b10b610bf3c3a20eda45db4>] +[] % ReportLab generated PDF document -- digest (opensource) -/Info 20 0 R -/Root 19 0 R -/Size 35 +/Info 22 0 R +/Root 21 0 R +/Size 39 >> startxref -9060 +10170 %%EOF diff --git a/docs/REMOTE_ACCESS_IMPL.md b/docs/REMOTE_ACCESS_IMPL.md index 61a2243..0f0eccf 100644 --- a/docs/REMOTE_ACCESS_IMPL.md +++ b/docs/REMOTE_ACCESS_IMPL.md @@ -2,13 +2,24 @@ See the full proposal: [20260602_REVERSE_SSH_proposals_summary.md](20260602_REVERSE_SSH_proposals_summary.md). +--- + +--- + ## Table of contents - [App (developer settings)](#app-developer-settings) -- [BE control plane](#be-control-plane) + - [Android VPN consent (WireGuard)](#android-vpn-consent-wireguard) - [Production deploy (no new nginx HTTP paths)](#production-deploy-no-new-nginx-http-paths) + - [1. Database](#1-database) + - [2. config.php — required keys](#2-configphp-required-keys) + - [3. BE packages and permissions](#3-be-packages-and-permissions) + - [4. Cron (session cleanup)](#4-cron-session-cleanup) + - [5. Verify](#5-verify) + - [6. Browser](#6-browser) - [WireGuard data plane (UDP, not nginx)](#wireguard-data-plane-udp-not-nginx) +- [VPN process (AIDL)](#vpn-process-aidl) - [WireGuard third-party (Android)](#wireguard-third-party-android) - [Tests](#tests) diff --git a/docs/REMOTE_ACCESS_IMPL.pdf b/docs/REMOTE_ACCESS_IMPL.pdf index f849672..21f85f1 100644 --- a/docs/REMOTE_ACCESS_IMPL.pdf +++ b/docs/REMOTE_ACCESS_IMPL.pdf @@ -2,7 +2,7 @@ % ReportLab Generated PDF document (opensource) 1 0 obj << -/F1 2 0 R /F2 3 0 R /F3 16 0 R /F4 18 0 R /F5 19 0 R +/F1 2 0 R /F2 3 0 R /F3 17 0 R /F4 19 0 R /F5 20 0 R >> endobj 2 0 obj @@ -17,73 +17,78 @@ endobj endobj 4 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 716.2874 132.389 727.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 716.2874 132.389 727.2874 ] /Subtype /Link /Type /Annot >> endobj 5 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 59.68504 705.8499 174.72 715.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 705.8499 174.72 715.8499 ] /Subtype /Link /Type /Annot >> endobj 6 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 45.68504 695.2874 209.309 706.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 695.2874 209.309 706.2874 ] /Subtype /Link /Type /Annot >> endobj 7 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 59.68504 684.8499 100.125 694.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 684.8499 100.125 694.8499 ] /Subtype /Link /Type /Annot >> endobj 8 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 20 0 R /Fit ] /Rect [ 59.68504 674.8499 159.315 684.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 674.8499 159.315 684.8499 ] /Subtype /Link /Type /Annot >> endobj 9 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 664.8499 168.9 674.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 664.8499 168.9 674.8499 ] /Subtype /Link /Type /Annot >> endobj 10 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 654.8499 145.1325 664.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 654.8499 145.1325 664.8499 ] /Subtype /Link /Type /Annot >> endobj 11 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 644.8499 87.19504 654.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 644.8499 87.19504 654.8499 ] /Subtype /Link /Type /Annot >> endobj 12 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 59.68504 634.8499 95.52754 644.8499 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 634.8499 95.52754 644.8499 ] /Subtype /Link /Type /Annot >> endobj 13 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 624.2874 185.293 635.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 624.2874 185.293 635.2874 ] /Subtype /Link /Type /Annot >> endobj 14 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 613.2874 157.709 624.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 613.2874 117.701 624.2874 ] /Subtype /Link /Type /Annot >> endobj 15 0 obj << -/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 602.2874 65.24504 613.2874 ] /Subtype /Link /Type /Annot +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 602.2874 157.709 613.2874 ] /Subtype /Link /Type /Annot >> endobj 16 0 obj << -/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 591.2874 65.24504 602.2874 ] /Subtype /Link /Type /Annot >> endobj 17 0 obj << +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +18 0 obj +<< /Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R - 14 0 R 15 0 R ] /Contents 38 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 37 0 R /Resources << + 14 0 R 15 0 R 16 0 R ] /Contents 40 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -91,29 +96,19 @@ endobj >> /Type /Page >> endobj -18 0 obj +19 0 obj << /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> endobj -19 0 obj +20 0 obj << /BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font >> endobj -20 0 obj -<< -/Contents 39 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 37 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj 21 0 obj << -/Contents 40 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 37 0 R /Resources << +/Contents 41 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -123,110 +118,125 @@ endobj endobj 22 0 obj << -/Outlines 24 0 R /PageMode /UseNone /Pages 37 0 R /Type /Catalog +/Contents 42 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 23 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title (Remote access \204 implementation notes \(v1 WireGuard\)) /Trapped /False +/Outlines 25 0 R /PageMode /UseNone /Pages 39 0 R /Type /Catalog >> endobj 24 0 obj << -/Count 14 /First 25 0 R /Last 36 0 R /Type /Outlines +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (Remote access \204 implementation notes \(v1 WireGuard\)) /Trapped /False >> endobj 25 0 obj << -/Count 1 /Dest [ 20 0 R /Fit ] /First 26 0 R /Last 26 0 R /Next 27 0 R /Parent 24 0 R - /Title (App \(developer settings\)) +/Count 15 /First 26 0 R /Last 38 0 R /Type /Outlines >> endobj 26 0 obj << -/Dest [ 20 0 R /Fit ] /Parent 25 0 R /Title (Android VPN consent \(WireGuard\)) +/Count 1 /Dest [ 21 0 R /Fit ] /First 27 0 R /Last 27 0 R /Next 28 0 R /Parent 25 0 R + /Title (App \(developer settings\)) >> endobj 27 0 obj << -/Count 6 /Dest [ 20 0 R /Fit ] /First 28 0 R /Last 33 0 R /Next 34 0 R /Parent 24 0 R - /Prev 25 0 R /Title (Production deploy \(no new nginx HTTP paths\)) +/Dest [ 21 0 R /Fit ] /Parent 26 0 R /Title (Android VPN consent \(WireGuard\)) >> endobj 28 0 obj << -/Dest [ 20 0 R /Fit ] /Next 29 0 R /Parent 27 0 R /Title (1. Database) +/Count 6 /Dest [ 21 0 R /Fit ] /First 29 0 R /Last 34 0 R /Next 35 0 R /Parent 25 0 R + /Prev 26 0 R /Title (Production deploy \(no new nginx HTTP paths\)) >> endobj 29 0 obj << -/Dest [ 20 0 R /Fit ] /Next 30 0 R /Parent 27 0 R /Prev 28 0 R /Title (2. config.php \204 required keys) +/Dest [ 21 0 R /Fit ] /Next 30 0 R /Parent 28 0 R /Title (1. Database) >> endobj 30 0 obj << -/Dest [ 21 0 R /Fit ] /Next 31 0 R /Parent 27 0 R /Prev 29 0 R /Title (3. BE packages and permissions) +/Dest [ 22 0 R /Fit ] /Next 31 0 R /Parent 28 0 R /Prev 29 0 R /Title (2. config.php \204 required keys) >> endobj 31 0 obj << -/Dest [ 21 0 R /Fit ] /Next 32 0 R /Parent 27 0 R /Prev 30 0 R /Title (4. Cron \(session cleanup\)) +/Dest [ 22 0 R /Fit ] /Next 32 0 R /Parent 28 0 R /Prev 30 0 R /Title (3. BE packages and permissions) >> endobj 32 0 obj << -/Dest [ 21 0 R /Fit ] /Next 33 0 R /Parent 27 0 R /Prev 31 0 R /Title (5. Verify) +/Dest [ 22 0 R /Fit ] /Next 33 0 R /Parent 28 0 R /Prev 31 0 R /Title (4. Cron \(session cleanup\)) >> endobj 33 0 obj << -/Dest [ 21 0 R /Fit ] /Parent 27 0 R /Prev 32 0 R /Title (6. Browser) +/Dest [ 22 0 R /Fit ] /Next 34 0 R /Parent 28 0 R /Prev 32 0 R /Title (5. Verify) >> endobj 34 0 obj << -/Dest [ 21 0 R /Fit ] /Next 35 0 R /Parent 24 0 R /Prev 27 0 R /Title (WireGuard data plane \(UDP, not nginx\)) +/Dest [ 22 0 R /Fit ] /Parent 28 0 R /Prev 33 0 R /Title (6. Browser) >> endobj 35 0 obj << -/Dest [ 21 0 R /Fit ] /Next 36 0 R /Parent 24 0 R /Prev 34 0 R /Title (WireGuard third-party \(Android\)) +/Dest [ 22 0 R /Fit ] /Next 36 0 R /Parent 25 0 R /Prev 28 0 R /Title (WireGuard data plane \(UDP, not nginx\)) >> endobj 36 0 obj << -/Dest [ 21 0 R /Fit ] /Parent 24 0 R /Prev 35 0 R /Title (Tests) +/Dest [ 22 0 R /Fit ] /Next 37 0 R /Parent 25 0 R /Prev 35 0 R /Title (VPN process \(AIDL\)) >> endobj 37 0 obj << -/Count 3 /Kids [ 17 0 R 20 0 R 21 0 R ] /Type /Pages +/Dest [ 22 0 R /Fit ] /Next 38 0 R /Parent 25 0 R /Prev 36 0 R /Title (WireGuard third-party \(Android\)) >> endobj 38 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 815 +/Dest [ 22 0 R /Fit ] /Parent 25 0 R /Prev 37 0 R /Title (Tests) >> -stream -Gatn$Df=>`&BI2+nNk6)pNnh&T?/Dd?=uW:o'.=BTt`koinB0iF9WVKKm@o0I=Y*^9Z5>ID>sX/D[s.X5PI&?Log^V7,8R`AdkZd(%JjNJCGXDfCtn0(U$KPfBPk;8S2SE`57aP_-p@*HK)B!^4>1U*eO\?r\BVX`l`ZVM`Gecb@b]@CcQe,G^T5M9XN;7B\p9aa+Vno[isPE(f>$9cP)Q&5e[/>]_YEe70,9C$3)u6T;\!#f8)9%1FpA]M5Ae6krW-+5['i/Mm??d"Pppc#1mP[EJrKdqV=c!jGPlGLUMoF&7&Sum68VTP!E.uNTA'>e'\&=K/GTtPnj3KU]*JOeMObg@B"'C&!b2?f8@T>\tVdC[95A-&?q8:r7P@(j+-[?")h<&rlu_&1(0T28%9OFHqT4'7jf\%X/ju.(Sc%0c^IGcYaNX&Y%J5F`m,^Y0KM@LAWA:JNpendstream endobj 39 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4027 +/Count 3 /Kids [ 18 0 R 21 0 R 22 0 R ] /Type /Pages >> -stream -Gb"/*lZ:gj&c\H;@_];5gtgISCg11=C;r'h;9iN)Q]:E1]5pd)4`NS=L-h+13n7M*c[*B;=7*tInAQqf5:$._8KQi1Z0Ys/h#Y.;fFnp4SmDs0)D5e45.kh`9A8Ud9S4@dap[F#9W(jGn]I?K1-:1u\BU0^jj_78L$l'fdK\%Rl^AhX0.u,S!]F[j_!C;A,9e8H>+Ep5_'MQG+eXJrO?+\slP)bFq4]:VgJEKgT`FO0hlnPH+Tg2Cm^C^2DFk%RO4+7CPu'm7]7@(9#]KlYi-T-P$D]N.>g%j:F,QjRB4QadTWA9K*`iTi\16Sq(2u?`^N6H?_eT=::J>&S81s(?+!#\u#)lG)tqW+CYM(o;D9>5q\BpUsm_:j%2"-,;dNjEN;P&3@+Da+!uE^ZG=40DGGKhnQ[^:]./,:0a#1-RekE?fY?/b6<28)oQ<1[_LTo3N8^*q<=c]*n,T5P$Ho6[lfZI.lBt--4;Ps6p'O.'a/IIVU)a;m2LU$A2GoK>\W"IH7;\f\aU-:nN<8iI-@grI!73k0fq;k**0?C(3h3mT8:QUTM=]G\ZNc;%BI9+4OkDZ^*U&5lJ78p=eK06MS,0@m8Qb9;0[%BD8+(7a?lEl=S7,>%\EG;8cj/kS[;&&l-dVDp^,pmPFe^EF0!gnX"7[38R[S_dDr5h^msYdsVKf]l^S2(4+m78O+A>V1'54e[#S@'$CBH*h].JXSXhPB%nVQB]A%'I^?,e:\2Ca+<7ar*Qbu\88o?47mNk#Xa[Tq3_sgo.dGA7Ol?0hS4H`,>XZt\M*fQ&q$meLfhmFHPs0E;(,BQ2Lf[,2i):qYH@^7+!%Qlc!?'NfUN`8)CD+C:+P:%IDLHW5=1\YMV%l_S_po"o:BkN%+D,?j?#?9d?28ejIm:N&U7Yfd6+XFf\;gk-61t'P*WLV;TaZ%TDe`,HHi*L?!ekLN<`aWlP'k>^6+RUl#k86";^uLU'e0/MIk7"=$&Y3>Q^9=n:"-it,e2@)U0j)FZ*RM_MAJC^#a-Ug81-Ja,4EB[Bl-g'\Q7QkbZ@n&:*_8<6"i]Zd1^r<)Kj;iQF@=Du.3S5P[reC<62D9=O?Z6b/o_P:E;T1rlM]g8=in?E'H;a,&ETioj>bP!,W\uUTgfcC&@>?VagOW`!:7$pHKF'2'IYH'9=Nh3R/9jiB/3ji9hT*V"<5&]RAp:e&+rUC&Ds^IHQF+;^=E@CCWBlR"u%+l;:Qm>&*ud&G5hiZQI\U95KIroolbGX`KqCZ1BSGq(!Oh>(aDK\A0Z4a="Ml_N\Up,7gBK,GC9"R/NB_Lb!g2O;=A.sMsjDZQ-:@sWbU]1isKrh"Ba4"pu@\:SmZ5Bl]Yt.L0B_c1W63)Cdr/(?(-tYAn<[_b/p!Z)"O=YC$$Y6?&K*f79h7o8E8bCc8+D9L<8)*nm$4cY"@\k(\/=K[L4rt,fgsB@F1^@)f2RU33FHLH9(h;ZTo/gm02LQ-OuUea>2?R,*tc;aZQ`1,P.8.'h1BhG]-#5VpcO?o7uqA7[n-o/fn1I5G?e[l[IYD\p]iJH$S"HZ9]27>YeaR3(IaLiqtmjSCa+B205)YJr6Vd3nEkgLm$'cB;\0oot)Z!MuW3f71OIippPf[Fh^#J@3UL`0qp%ibBqX3)sRW917?5<$e4F^'/4aZlF.)^%e,kY`ncco_*%0VT=PT?G6(X_':D6]AGs3D>P&/W4J(m(&+Fr`9!ig;-'#_k=[8P%maeV%m_+ABkUn"]!'eo^^Q"mU"Eo)6TuQ[eIu4+sa4]eF75t\%)+17G6(Nl7NWN,ThbD!iHebJ\]072a6WLI-*Nj8jdLKPu4%;41=q3I^B1nQU'_7e(n\G,\Aud=j[^e(C4r<5o>tl^`9BIIl9\kaHIhh'El[fcdQ1-6\"NWDnprGOh!p,5IE@gjmW>.H#&\G,/M+YZr^)N=TDQb^shI")30!Aa_P5NNo_lN412eDO^7>jC8)A>V?9><<<77F=gR2-dfRfI4j#@M!garul&lu/Q$7kS./!j-sco1D0j^MeH0p5ke'SbRnS3HW_8''#\Nn4_-JId!m!11B,\Dbh0hE4'a\`DZt(Za,]bpTZ^%]q^+N`V[1S[A*Ns4+4@W2MEHI[FI/aH$TH1+C5)+NB:Jud(Y1YkcQ8XGS\nY8a98B\Ud"Y=Y=[-1A=UkL?SG.?>>sas[:JZkg(\4OAQ]k1$#fcDbC+m:Cm+%s0%e?;&qpd(aL_Ah_+(9Sl,6(IY"A&G;u'U>oBL(L;qnj]Ud9cB('a$XXs5m=LS'p75O<(-_P\a0B[oaG\6,6jaHaah5L)FSO=mskKYA$44e,Lc/UK%-9n>;>&2uKk/RKX/]GX"X+ARA@@[KhiZG73)!L8=Y,pgS;ZYb_HLA^`s%QIi15S0-rbB)qfIJC5XL56GY^:D=0Fn@]sTX(9;\P+Uc4YpQN_c.M\q*5nZ!#3g/Lk8[6eRC^TNeE\h&KWUj:EdER('&mqX777JTDs/PK]i^L,iijEF-9?]bendstream endobj 40 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2140 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 839 >> stream -Gb!;cD,]1Y&H9tYfU5J:,dH4f[n\tO^hK2[#t[h]`?!8JSa7T!([b$8rdFMd=kGKe7FQ]6b[;BnG5%STG5#,Y/Guo6^Hi:tFpd@n)f,bV&_N]6_=RdUdt?BW]<_'VUHeB&%gK1T=RO8Jk72sS'JrEN9U):1,n]4R.a5lk!'T%Y&:\*_0T@fA#CZP/Jt\3D"Sd&J>0L[nAgpC&+h[Uk%L"RXQ:W=,mdH-7/B5CeFKEC3BPa-!jk$"+E-6=1b>bKp`,qNG6G`$Ph#u"eS4qlYVDf@9h[VPcr-n<51QAl-fl?Q4o]9R\P);=Nk%24$GPY-J2fgObaCY5R1KuFr0%1QL>#gkOHj\:)rPQj!#4Qp/l0A3hW@MY3MrItPj`UM?3S#.=)4/<+rt;^'7J5p8]d.7Fp(BJOgS)7?Fk@XQIRs"bj\^`k9UU^A8UW-:Z\9AJAr^fU;0pU'P(0.8FK[MGeUrX(eE^`:K,q$"p94FWVj,SittO&E4\hYVe!/Ol.6<=PbYc'_7BX)kYs7T!lDtmkNpXT#\jhZMU,'QXnbMX9*JF0_%P6qTD=N8]!7]"eYFs.&ngJ1&D3MITC5b12])f=dR5h,-0.WMaYfub1kH?H5q7jG,bKai58psr26J-R.mlQ-oNb>Lc+pkU,mTKjG7ieZ'Du75hco4sK^t,K%Bqg.K:I^0;O=)dUd?;h6kg40!$-!_u=MB9,4E#LL%g*P!u5/]_,bZMG"s0^jfO&M2Bb%.bC@*bPJcGQHJQ)qlD:_(m=]//J[T(Gnl%SWa&a-k3P6?>l7o6G@HP^"Bp)0l["b415W^V_Zn+jE@lNYN/G%('eN=ibD$u38k`J-l,fNEiu!YDPr#]^>;p^4b^pV7I@;I0M]NUe)0*>ja1jRl`:n6nP18K.bPmQg@3b@2;`qf<3YS[6QG!aj)ejulaBUt#t=;SS8g%'5S1Ioc=g'?`L:$(>R6W$*PAte3@;iFV'22ukI]^RgSC>!p^K0A'U>\,68F92FWATX[Wj^Y+b=oBjZ&2EIsH,)@E[hYS)gVsNV[MGP)fnNQG4F>4WYU$u=du3g4.^Z^@uqTi?[k,skm9Jsq6QnQG`'mSj(FcOfhLjF9lEf26>,A>CYomL*\2q;OU"R:eqs)+&K]=[$!b@Qpd[;Pi`G3r`1tlOj@r#hS=$Ph6qIkNjH_rJ)8EI)c#?VoG!$haC^rM8"C[Z2XhWJ<'dftaaKMlk4u+qeH*GLoMR1f,uS(2+;K0`=ua3beE]WpeCr10ra@b"6M8emI6;>g3Fco(e\DA'8rtIgS==h[C,dZYAP%aI\-'D#W.t%ZFi1c@YmKhRHKQfF_<8"H5Hu.C$XFWo?aK>d*1iHRCi+?egG]>%_=MABmCQ)u1`,<1es?a"(`=]1G-#7hc9kS+1?H#:W3dZM!`Z;QkEcCCQ-(3>?%K>eY;ZPP,)n+QRHk$OC9q4"K&sCKe%I?3-,\T*@?Z2VF.\]gX@kp"LQBip13V0afP@c9'j/=Pmr<]9q/r[m[`-*MOH@p+N:A78]%P*5Ln2rZI"<7*03EN$cU5@,Z-!Y[?7O+O(M%c[[(;>@nC&C=L?H-k.mMk(>oPWh^thB(DjrM)S_<s2!sI8m[Ou$kA-B2_52Fjmr*2oHM%=90RkJiT?MFnA;C]QN<1KZ^M0nr*-oep>9^\sBm`O2[6.9a]B^CdNTKN:"0l-Ee-bI^@S]kKFkD58TjL=bBeeEdUDB*u&[.;;3Zm.ko`$0V#&.mA.5m_+h.W<TTO5%r9+@U=c6h)bLnGgD$ml^rq5'L]=9?4A3=K6eAR>^=V'lS:P2B.tcRlU,d"\2._i7m<=4>P]D)H?0!Q4cP#/Tn2CNj1$J~>endstream +Gatn%;,>q#&BE]*.IOH7_i('F8bWFrCe/.'+Cd&qa"Mj_n>+TfcZqqB0CVih1gb/.5:r-b3KUteH%WS5)l9Jf96X>=0g>@"HfS03OiWOK"Npo/>]@7Q"pO1f5[Y%U@9\Bo#jq`m.TWKP2D@KJE-[eL\O+'3g;s%$/_Sp4ZWitm,.P9n-O#rTQN.@P?7c=LAhqlOR!Id:`3fl'`.>;obBA+&JdkU[_j&3]%t_>J*Lk[?onJeM7>2akUE<2OBdL8#=T_Ti"gF5F!G=JA_3/ECpp"_M_4`^5fgKnHeA$cj&VL?Ge`j]YiCqMGX8dMQgO>cXZ#U;3XjcF%e*059YK"YPj:bQ~>endstream +endobj +41 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4036 +>> +stream +Gb"/*lZ:gj&c\H;@R#"*4.G4s'IA$BDNqL!\8cPH+%\P:7fuVMKS1Op!%D("p4)O_0C^2`Un)sL7u9)KJ-C,$f_t2HV1FLG/c'7$!8cKun#Ze_%eiWCqFVjtDrCKkeXs%PUhARa#")>VK/FVuVD7Ar3,DWjB"iSF'XWgtY*a1CM+A+$MQ2&D"(uhB6Em>k$loS#meNFsc5:Y'+/f9ATAbhT&&59T;BeA-Gn#^n@c,1.'MV/)r1H=fCg(H8(VB'QJ/h/qJ&(Tb0X%oL(:5X)J6au6[tJGpp8&PVFedM?#n\HX%1K/8>QH%'AnScZN]/_a7C_b6%a]u/+NDG"_WR@P!:]RDHe=T<7%&o%l6FbQ3C>DPPp?b3@^\m(<5dc5Gg,:+&oqC^_G$Nf,!"o',WWtHij20WHEL:Lknag5-UI#kj!.!Ek(b0jIg8:roKJ`M0go._(s03+#o<(?#\\8&UJDSXWJ!1IH77">]"pr4`jRQgPG6=NE9dZQ7,C>.j36P-g]FhmN`i]-fN/.L*4Q8G?G7h;Q1_C%6qYO>lB84?>*N%Zf2Pl/8)6Uk,I/6ia1_*)t[SsMp-@tr/)HKA;dH#JN;S[rBikSols9R%&0!_2o:bs?W^m;8)ap[k7,bHcs1``p3*bV!rE;#&*[7iVK*?-ZLAu)04-6uW[8'Vl$emaW4N0u:$dCI=g7qrp@tjI`TIqr%t.,g<*gX\\6h%C$=4JJ3`mM/Pfs^U.clC;e,Gr<0d7*t8W7FDDBQcnAqJ^FEr2`46esF*:lNde[>(>VVEX9\&t6ElCgc7WNtbmK#B57Kaq9:+KI#Y,l!iqu\gS0$5*WgG6,r+6?#8b#(]-);NT([9hB,Iq"=j\Dc1+@FSKn>-dB5_3[8u:UM'peN8'diS3$=8p>Oi:1e.+-W@>'/-W-W)eDMY2)QdfAfA`-^H1P93NNAIY?YdKeQKS,UQX0f26UC(dSShhdbOAQ1-/Ip!k_X\B"juZb63JF@5teYL@1U6uJJ:IPa(GXb4(4kjZAEn;RR5rS0XH]h9l6i0/Ms[^?gmIPVg!.Yp@BHP+>"nB@ueY$q"ak/s*oBl%!AUhC/FoDIJ4)"_Cfu3RtIKQ-O9(6"uZEe/\G*prGk&]P)^U+$4BW_B.iWdXaipDt'a<%W5)!W60]kkt8P31)5OOELi'l.4-kMT%Y;"UPN=bVfuiS4;Lj)PI5>Rs6dq];()Ks^kq[_Put3e_8I-+ItYpO[aJ^_1`M#3,%qjGn4%#s9j)fFC2O^19cgM"h\-cpDH5b,Qd!:tt1I`fW7heY%h7g+,A=1/&#n[uP<+B%nkgj6q\CP8Yg7L["77Air\2qmfA"\90#"&&?5U=gXe8]oBSnk>WfAqIS.$Hf)<0kFSAF:jjdXXaVJmS3h1iYS>S6[YWCO/2j<,oF-cZS,8]!TX;.p*-(cL/cHAJO3$O*IZofaBCY^\M82&\G<%^I/#U6S$7L@KL3\/%:fTj.:fQ$"tF5d2o*1=N%P7`\b9sqZo0B88[rAik^[UfqS;/+eMmHubSrnhr>#C@r=YF9I#1HuF65NF=U4+;D^`rO!_mNB7Y3T!XL,EANhTm]>3'dI3?(E,6PjG/c9KCV,JXVbSaq'`ihAnQ+,%$1!SlV%3h2^Er\![j9GOH1-CKlqIB'7L/J@]qm+WN>d#laAqsbK,Z.h,lJp5,-Es<4h@J-&ET"1]X0qHNf?8uNJ>/Ar78Ynh>qg*#EA!(5CD`__VQTkN[JkhQ.Y#A41FPX;L,q)]/T67N#p^Mp^5&Kf.;?!h;?38,/uQ)OQb]ccG%0p`,Q8JHPt'0FMUeQ$g?_D+\E%\rU4@UO#u#nl#hDf.$gPG[;K"ekZN\D,otG9k,cRh`Np9db"Fb?'-Y0M1_r]9n17NhJ`OA/DY'V!@L/!.*!R9H:jE3MWM+ugLXFL/->(Alm/`JP=]XkB"5OG>^a7[daa.F>%FUT;ciU-008*a\*+]59[VJW[ek.j>Z2ceAB;@hEO8;`?4XM<-qj6t8b)RJ54rshVmGGJ[?oYTp?FD\c$WX2j!X@7[FZ-WU;H2;H,l,gc&9J9q1V/\;So=Jf066^=J.CI4.N3tF#2(j%?7^_G^Gj-c/7@"Roo/OY\s+i*)5&=T7HJ5S1FdNn4,Hep9f/endstream +endobj +42 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3325 +>> +stream +Gb!;e>BAQ1&UsJXfU;FQ.i2'q;c4s5EGQqDlQhK8V[lct"-\fLLE_!Dd'E]M=n$$\&hWC=p7^'i15WtZZ.R7/$NkMK(ti8G%Idd5K9$3R-;54`fU<8u/!s"+IQK7k9&%bKTqgB#%1Q%@7Q/Q0@@V"1]S;jWdkqt021+i?KTUScaMrA\9B_c^]RoB2%O*,TeFV^6_3S918rA17klI]sV2Wk'IaTU+d7dmtdD"RPT6RqOM>,1NVi-qGM3Kj,-CgTjP&/>/3k=0@.Q:]sgHt@ndrd5+SG58_iY:8L%K9Xjcia2+h(7_G$BgcF1)iF=6mG8I["\MSW5X-EG)W,oT>!bR_#TYj/n@0$?;@(sE8Ot7bJ3G[eH%5j>]4L5RmG-,Pcg[0imj2pCQ=^m8%6l]X5Ln;.m]"*@5<\1'17s6[_WHfIT\&hmI?rHSZ;-)VoKds1Ei&L-5^1oFbupVut;g.?6Fl/Cue\`Oc=*_eTQ\,l%`l#[i:6YtPH7qO(tQTDP,#cnf_VBb3WrL!=5Y%u;M(BQ2$(?!Gp&N4A80BXeendFtuc39PO\ZX2UKi.mObC%<88?;Rcl<%E/nD2W"KG[5^p!!Wse%o?C2:"';jGk@@*i7D<:Ze3V)iH(;U0h>3VV":]&U@K;rql;^aa-I=%\E$s__uo_[P^R-+-a+N;hoKhVcp"!AQ`&lBq[i?8$YlV.L&'a@YH_85QTuCD,kkt?_QcCc!tU@T>QUA/j/Z\iHYFTM?c3O:;hc0VkYud0'+Kp\BlVX36F-l/gMMg,eHU4n`jI[[G%ij'j(jnHRr;LP7k&;X;_=lgH<_U!%G5-;>726Vg8j59YF/#pgH=)%_@4;@N!`oXCRb]f83ofXBH[]4!,89s`?3HEKp?0?h;*<#13>aX/1ILcXj12=MBU=@0B*d:8N]At,n-eNn]6l*WiSP/guSK95.c.,a`;;O&?WXHH;kr\,6XLjg7G*tOi[Xt';U+/l/*EjAeT9n[cl'sV9DWq+5H`0@$bkBWl>$qmK%o%T6[*2jdU_'E)7MfScV];Sf7eGElu_kk5T&_8_;k0&\!j%I$L;&a*N?,#a#?tUFG4EZ)))XM:re%C:jGdApch57G6$g-9l(NU<.=\/>SQ%GiH(a-[3EJT=%N&-)O"Vmm,jg>:/3V%rI(Z.b$jS:':ETN9k1BG)\$EI7O_36J,p(D/-4XaBDgeq^J9EeqAr#L7qJnf`kW@nK!RF-a8R('.njTf)Q*J9^p6[^GW[-A6-*FXEN)?AT"=kkG8R?A;9#Ig^lGIK0HsdOQ0oSO1M(YEcd1G@Z!k5)K=1Bi06Kh);7D+I,V#*WXA4aVXPbr2G(CUBcrR`>UbOoq:qIp61i]/$od.ec@%P,1*?XmjR(aDmFl.nGR`;Cu,5e5m="FumYA;[WRKK+6KBpNu0?7NmF.[qh3d6V9_YL6-Tf&!Q9bsLfpKmnnDe4Rhq4+oOH^&8"j_TlK7Qt[YSQ^\D!T4Ljr(csg.V/BHmpYAubW3o\#c'4Oe74Q9N%U&Ria^GH8Ea':I^E0/aj4EOo^6dL7nZh&M23=I-AB=0uiD6*X&#KR/DhbMZ@LFZc4OIA3^8-)Xofqs?r^7]oT'[BAr4_uKK&C]K!hT'@5/='-^1ROorOor<>(ukiE5n9/(pqX8iB=doA``deO)(hXUVt4Su(,+A[FdRe&A>r+?1;9,9EakXKFRf%$t(n$OklC$l)%bl2Ei8\s@<(&5EfNqiX)rq,CHb*OMkt^J[dUg6W5K$UjCa9a_"l_K]3A:,'r0mH)=R<"5?Hk#SSo2^_"p0Q/*,s_?s.8W88X2C=_:=5Atb-Hl=(I]r\3B;)_+SfdYD.MVO2\1WnQ]d9iYs'WtfM#0SW,`C"KAg.Tro08Np7Xnh@.pc`*I9J'TF0u*O:5s$,I+u;nq#an$8!c=;Vii$B'87$13:bku&EA)*<>)Zjs3f2]4a_AWopg;8RBh>aFdiL]^Bendstream endobj xref -0 41 +0 43 0000000000 65535 f 0000000061 00000 n 0000000135 00000 n @@ -243,41 +253,43 @@ xref 0000001680 00000 n 0000001828 00000 n 0000001976 00000 n -0000002125 00000 n -0000002241 00000 n -0000002540 00000 n -0000002646 00000 n -0000002724 00000 n -0000002930 00000 n -0000003136 00000 n -0000003223 00000 n -0000003554 00000 n -0000003629 00000 n -0000003776 00000 n -0000003878 00000 n -0000004057 00000 n -0000004150 00000 n -0000004277 00000 n -0000004402 00000 n -0000004524 00000 n -0000004628 00000 n -0000004720 00000 n -0000004854 00000 n -0000004982 00000 n -0000005069 00000 n -0000005144 00000 n -0000006050 00000 n -0000010169 00000 n +0000002124 00000 n +0000002273 00000 n +0000002389 00000 n +0000002695 00000 n +0000002801 00000 n +0000002879 00000 n +0000003085 00000 n +0000003291 00000 n +0000003378 00000 n +0000003709 00000 n +0000003784 00000 n +0000003931 00000 n +0000004033 00000 n +0000004212 00000 n +0000004305 00000 n +0000004432 00000 n +0000004557 00000 n +0000004679 00000 n +0000004783 00000 n +0000004875 00000 n +0000005009 00000 n +0000005124 00000 n +0000005252 00000 n +0000005339 00000 n +0000005414 00000 n +0000006344 00000 n +0000010472 00000 n trailer << /ID -[<115c8383c89ec480b2b9deeb38eac471><115c8383c89ec480b2b9deeb38eac471>] +[<5f9224eb7473afe06dd231cb210d3972><5f9224eb7473afe06dd231cb210d3972>] % ReportLab generated PDF document -- digest (opensource) -/Info 23 0 R -/Root 22 0 R -/Size 41 +/Info 24 0 R +/Root 23 0 R +/Size 43 >> startxref -12401 +13889 %%EOF diff --git a/docs/REMOTE_ACCESS_VALIDATION.md b/docs/REMOTE_ACCESS_VALIDATION.md index 1e717a5..02a8f15 100644 --- a/docs/REMOTE_ACCESS_VALIDATION.md +++ b/docs/REMOTE_ACCESS_VALIDATION.md @@ -4,19 +4,25 @@ Companion to [REMOTE_ACCESS_IMPL.md](REMOTE_ACCESS_IMPL.md). Use this when verif **Documentation index:** [README.md](README.md) +--- + +--- + ## Table of contents - [What the CLI suite simulates](#what-the-cli-suite-simulates) - [Scripts](#scripts) - [Quick start (local orchestration)](#quick-start-local-orchestration) -- [Production / staging BE](#production--staging-be) -- [UDP / WireGuard data plane (`ra_udp_debug.sh`)](#udp--wireguard-data-plane-ra_udp_debugsh) +- [Production / staging BE](#production-staging-be) +- [UDP / WireGuard data plane (ra_udp_debug.sh)](#udp-wireguard-data-plane-raudpdebugsh) - [Optional: bring up WireGuard on Linux](#optional-bring-up-wireguard-on-linux) - [Mobile vs CLI checklist](#mobile-vs-cli-checklist) - [Troubleshooting](#troubleshooting) +**Documentation index:** [README.md](README.md) + --- ## What the CLI suite simulates diff --git a/docs/REMOTE_ACCESS_VALIDATION.pdf b/docs/REMOTE_ACCESS_VALIDATION.pdf index cc2666c..2102747 100644 --- a/docs/REMOTE_ACCESS_VALIDATION.pdf +++ b/docs/REMOTE_ACCESS_VALIDATION.pdf @@ -107,7 +107,7 @@ endobj endobj 19 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Remote access \204 validation \(Linux CLI + mobile parity\)) /Trapped /False >> endobj @@ -170,10 +170,10 @@ Gatn#?Z4XP'ZJu*'_elg1cKUWd^Q[3$&K-qZLt%,16)_`+jOnZG2Ia-T`p1^.]ZAk+qZ3cGE7dq"V39? endobj 31 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3441 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3457 >> stream -GauHN=`^')(4Q"]kdki5Y+/UM&KHJ$5t#3-QMaR`9>)[;"'!R4m^nP70,jOoBY/m>b>>-bSLZco(qcHfU;mSIER?RNp?'nK+4(OfOj>1_-@2!).9\pP!ckq=DbW-SOlU,[C(F0BPf&u@YbILV4GQC!";X9Fk@Y(4B"Y]Hf&=LK4Gq-0hkAoP%P/M&+G-Jnaf''.d'IR#+Vb$]I>(Ink;5I?eIhO\[=G8f!_(^5gpOF-4'%BEo:Gnhi?6SKip%0PTcF^*gY:)k!V'B--BEjXotiKAbbLZ=KN1rX@*_3@?K,C\2tHH$g!YCE%>4HTJhZVp_B,dRO\(BO)6ffp6[*o>-u;*DZ\!@;&LVH1^"ahG6'gRTl9d*Y;!&eBaZlb`1p2uRU'Xh!r1/i\[G31_`/9u'ar;ZKM2h,,Dc'VNelSm$2\V#TMAukO,aYNf!]S)C=40>`KH1T7Ck`7gTJqS_=q_9.gGEHKHS6nT0GK:\>(J%3q&.o4fHG-/=<]s=&)AJ=M3XLI(S%9m1ce=)42QC"&!.mk[6mb6KAmN=gL^ho)qS,KCYqq\g&1a/`E^0JAViDsf$IB_IQuD\Imb4Z?'o&g=Tso^fC-XS([2:rorug?;tP@)n!MUP=Gu6f"a\)TE*%cdI`YrXFo]=2Qo0mKDIuOZ"V2M_ZS+2@.I^"'T]Ae\''f3Y2m=<5:tI!_:lbL6r;mbe/m&2J'0Y*[S-G'>GILXTqW5tBIfFhBV(W2IS=q3^OQ$?V?jQ6pi#dr*V/roT^`Hh:NZHc&3SkRC*e[poUMjSMcd<6rpEA;KURpnVLQAnIrOo_SiJ"@4n8u]WKD1:a*`P\IO%9.X_ob&4mTbgHgB-U8nX4=j`We8#;DB7"a*U]onZ@\bh1H3>fQbh'N,J$k:EgPVBI5f7NLPMfI`5(+Rm_]C_I)QM:SjbO2DHMM,9^TL'([Daf>)PG/qo98dVO3fCZ$/#)+59,T0,A$nD/@B"C)T%i%b#"RZ<^:C@M/^LMEG@"PJ#n;4U+Y\]XK#)slkI7s02Hk\6-5M,/.m?tH5[8^F#(?oqJ;lp?Hh0;'_]?1qh(g=i6Ns:,;1%A)Nq(H/r-=%8$?d`);=mcE-AR<@a&707kX:D"Dm*-I@oUgktn&V*Ad][EJXC0Sfu/f3sD!/*:b2N%4U[0]Dr'T0V:p0ifsi$&?jkW!2=L0i9L?aXT6].*l-<'DO"m@bH4`8&]T\hX9I_.A<[Duqi:2JP$8n+rOKfSf*(Uh7ac[jL]#I-a1Do(L5?h1EY^<_[A>3rs+4/4$q]rKTA$-n[8eiCBO*/=Xk!Vl31SL1AZQ2I,1+7QjGD'bT^Z.tH]518#9#3[>p($(4RbOUnfdhsR]5R:N1f4qs!+`I%c%[0'47W+RmY]"%aO?,(-3XYrEL(YiY[>6p(JlTpH0#9=':IAt7/L05pK$Mu!=,Ql3hCNbeJl1Y^Pn#Ghr*FlB5mP[sUPaC]cLZ'pBl->LoJ-%;!(V5aF0VNg8Z8!\Q=(U`AkDIQ0_]oq%Mi6U@\X;cXh6a`eg(2JfuVb/:q!5AJ/O@%eM1FS-ea+[LNb,JLerPWcBGfA$C-`ESghoCt]Y&,SO=\Op56+@^sEnSi%BB.s5WPBhg8h$_hpDB/_pYh'_LYSIRP^=gkG,]!h=:8l''l5CIK^u-?oR`Q_Mqj*iq)sW\di`e1&%LSV[6UGOeibjm?rdF5Cu!&f,7W-^+JUT/NTjVWEH1-:%FuYPN>!,L`HKmUq\5^Tmq'OTGTD>qFI;CTJP!R)7..s[i7^eQ9QBlJOp;8MS\#n9CD'Bk+F#LbdWg7PBpH_[qnrlX^k<+lW:YsUurhLk10G5F_P+j'6NMPOsCFp7+H%QV'H+38-D!JZWe3#E>1,hb+AB0"*jKD`G^kJ8tQ).&(5'EIC*U.kendstream +GauHN=`^')(4Q"]kdki5Y+/UM?,AIe.`G9uhsqOU8R>@b[@h*8&Wd2JqrRhN3R&nh,/?cEfng--m^"QR,6@?(,K0U$>D,0mdHHdE";*4E8<>hL/[*NKH1LPp81A,(;^Vo*U[`TGnWG6:3d;&@KmYO>6H^qnGYV\jfnL0K+!:O0#;is[[Q\kOcUFO_mcW32bIKgM\P@'CssO-9-Ib&r4s>,K3,OO,bN8USR:=bIPV+6R8B]4Sq9,jX[Q!?T3qQLE1.B8;chKg:6eY":e2"JTP`+C%A;@i.R7/r-'LWZF+WDg8o+(J)58fG7WMAG3%:rN(.b:+@mQIMTWnq1;[BN`Z1,*e7C:J:U*Ob/YJ,hq9-3X[ZCeBhgp"_k\.&i%,J*F*\kHQA[4I0SLIlSXBOD&g$:;CK#V'C^;P\Ehm%AJODn4*hI]C`Vh_-YFqW08(b]10#B->F#a+JPXCb\\dH?R4+%`[7R$N>nmH8F[*R-h-TE>0!FDKEE;"r%??r@EqTl2iRT+0Ue2Ob#_s*)A#d@pP)n+]KE!8?>cklDdj$1]Mg\E,I",[lZ+hjCmPq7?/)JBoYI1irTUrnWKP(r!mf0F3QAkld62NZls%6iJq'?H0`kBm6fNqr-YAM;iD4!??Q]3%UTV/&u_;"-d#QB.mrHm&BrT+=SQCtu/[l:CM<=5>cfP@^?g!HK49)/(mT\Qc/7M:("A*C?TFT)!Y*58[d)QSZrN.g4SWO;NP`Sg/MLK84Rko8o)onK\tO$#W08-/fnku3s`0\efj6a]=nHPjbmEh!^:I0snZC3>X,[m$KFK](]i0W7(7lS1O&Z32j*K/W*DD6*>P"skJ@%EGW..1g'Kh5G'V)NX;INb1LlLf@7rXk\K%[g3#VNGR0Tm6D^fC)9I)'F.QV9SN,O`06#>CpV%m`7@3IN$->2j27.DNr'qV$V_P_mD>eT!B7<<*nJ"F]5n_g*Or%S7O9cU#9th$S\A!sF%f2?ADuB`4AB3UCuCiQD&AE/MgU?aIkMsF@pqA_T4E7A)dl#3XQMi7O8_WK7+W5fo+Shp3EbTltbl*TQ<8V5M3Fd[C>L,O5gcE4[AC?jTYY(TRJDOf-Yo3FqT;l/[#-!pKhFjmge&-K\-ZS'LoH)n?`"NYcoe`";\g1>SG=."Dhsa::,fZj$Ng31%6B%&G$=@?H>`5;Hu:l`4$tlhh9hrFIa]_$LF#G4@=!?k9dD>jrh":ArbDmrfO(I$V_47'L%T.G=@MhfYc/(1u@k9@qSHC9:@eojTV+gCC;BBW5X(ijccG70$ubRW.:[U"4fiB+`b7)@H$,*9\Qd/R2LUW9"I0o"Ib[H-.:8NEDhAgct,nN5+cj#fM`F6j,^4AS9');;prj*=C=L1VN)I'O!,k(t'^iJ?':n:k2.9OEifrH(uFpUT5KAc]l4iQtHa:i9D`%8u6Dn=#*#!"SKk54%U*,Jq)ZTp0)Nq6\%CFR,WiCeriUn3Ep'EDV2T0JS^^PAQ$h6`NZeBM;H"?CikCWGfS+sZKoL[QW%uY(3Nd_kaZR\f&D!Kl_<)0V0iXXmD)FGc95WAO,QF#a;U#T3T^t9SEW-bRriu(\24_e(1?PGH\pq\N."')c]TL&3fB'8%m..-1``Is+FK7S,[uB9M32t=jKh57"6%V9ql=`=rqU4QLgpo'_$T9H'O(*kj,VMdl`,?k^4i^S>/]g1F8*u/IYa65Q/6VSD58op)O.TGf"TQcbS+;C@DaYcN<:aAX<["Ug1?8Xn/MVMsk%T(1l]QR]&(W#\m,]Z]cG%9Xa&LtI8ET+'_,J#u+FqMW96?H1ZrA07Xe`+_ZD\kZJ3Zcf%@pbMUIg8fn"oM(Xm5G5KK3(n.b=IHK+l"+;\Jh]:ELC6ij_kXYIVk9IQ*EGcoUIu)KT)SSF^iI8n];jQMSt';>c4O$K22KXk,c0UV.gWt#m98`+J>%)rtQr\W8-G^'NAV'endstream endobj 32 0 obj << @@ -216,11 +216,11 @@ xref 0000003956 00000 n 0000004031 00000 n 0000004854 00000 n -0000008387 00000 n +0000008403 00000 n trailer << /ID -[<673f7a357c9c05e8a1d6a5eab503b7d5><673f7a357c9c05e8a1d6a5eab503b7d5>] +[<844df79e18ebca290bba95438eade42f><844df79e18ebca290bba95438eade42f>] % ReportLab generated PDF document -- digest (opensource) /Info 19 0 R @@ -228,5 +228,5 @@ trailer /Size 33 >> startxref -11533 +11549 %%EOF diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 22248a1..044676f 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -8,12 +8,18 @@ Last updated: 2026-06-04. Living document — refine as alpha and commercial tra --- +--- + +--- + ## Table of contents - [Alpha definition](#alpha-definition) - [Alpha app checklist](#alpha-app-checklist) - [Alpha backend checklist](#alpha-backend-checklist) +- [Remote access (alpha — RSSH)](#remote-access-alpha-rssh) +- [Auth & email (alpha)](#auth-email-alpha) - [Product positioning](#product-positioning) - [USB-C / HDMI (roadmap D) and USB-tether cast (roadmap E)](#usb-c-hdmi-roadmap-d-and-usb-tether-cast-roadmap-e) - [Commercial (Play Store prep)](#commercial-play-store-prep) @@ -22,8 +28,6 @@ Last updated: 2026-06-04. Living document — refine as alpha and commercial tra - [libvpx / Opus / Speex](#libvpx-opus-speex) - [Transports & protocols](#transports-protocols) - [Receiver / sender UX](#receiver-sender-ux) -- [Remote access (alpha — RSSH)](#remote-access-alpha--rssh) -- [Auth & email (alpha)](#auth--email-alpha) - [Deferred / post-alpha](#deferred-post-alpha) - [Related docs](#related-docs) diff --git a/docs/ROADMAP.pdf b/docs/ROADMAP.pdf index 866c269..050046a 100644 --- a/docs/ROADMAP.pdf +++ b/docs/ROADMAP.pdf @@ -168,7 +168,7 @@ endobj endobj 29 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 implementation roadmap) /Trapped /False >> endobj @@ -267,31 +267,31 @@ Gau1->u03/'Sc)R/'c[E-=Q6dcH#?F9*H4Q>na#>oYrjCadU/9m/m1ZF4*st%Rr^O+sg6:h"Sp;I#^o$ endobj 48 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 4055 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4015 >> stream -Gau0G>Bedl&q801W2Df(`!G0&n]PC#'@6Fh^r`*Pp2G]7JAspX8A^DMf5J(b#[L$a3/J5QWp[$mY57GLNW;3@#iWP<%cD@;rG)E:&a!j?A57mT/PPUQ%MmXcb?oCZWl5r@.0P15g593ntOjunW1o1Xn?-`)_e7rh[q5dKd^]oOgX9^d!a8XGH6AaQse:sNd-;TgCSV@na(nod>^YDT6h+?^L7$[)u(6I.36(F_+IDpT<[,qA!RA/:o6*bpMFLW>n]DD)hX5';1h&#agU51Q8KGbsY\:%Da2`*^/qp(gf4>J)@0'RCcugdA4cCb]6Wj8rS$>Q,D0rp4.moYWAn_%<)rLAZ"IB!53\`Z>$C&iUkOb\!I[41iuWEGbPAbb>n:bXZ&WFiPYKd>^=(AIVF*4(4j,IW-R&$p#'":(Mc;RF=N)%58G5\>VSBcDIr$kO[3;R"Lmu.YTaXqd\=k0JK*YHm;h6+qOI.+8J;LhrTF:oJEBAkV/9X%`T.Lj[ABj,O.b]bfq-[D["KXH`>66A>ZL9K]p8DK9ES2Ci'OC0E42P4@*\>@9pEhpCDRk5'Q(Fk^5!h#;D/CuNS'4Y^oF[R%^]C&1!U_feW0cnR`)gejkVe2kKp%!Ur'G$J^mlk_WiS19!2qSBN&Y?TPaW1o#;Mf)IKhBMj:tEBmkKR02%)A!4"Epq58L@^\paK=icZYZsbasX_oXu:?kMTP`Vao@KKIj=d(H1*"Dg7Qe/DaI_.`$\AXQ9ZCJ-,sdcj0aX3=cl;Z*luNJgcntFf:]E:=-'O)\jmW$$rF[9Iu(/>rTW)+Y$!nAD&\Y=dN;e[Ek_,p&t%%B7jb3+pM]/SBOaTJ#>AT")IHK?=.D@mu48OkQfdu+3T\@nK_`#KN#o;m1\&!U;Yd4AnYI#+2FRWjpG/J!Dp!n>DYr3Xl0V0!]%LoMIAOO%rQ%s48Vj>^r@Vpf>-@ZdE$G.QM"b&[hE4t^d&"s&bL@_l+R#AdF+#bffQ:=oeY4Yn@@>A:>l6X7boDk^jFdms7H?qqoMGm-ppifNCo:+i`17m9KSP5B6qpFNmjQ_Q?5eQg%[Hn%CV(PZ`gh!iXB2^Xs^">=IIC;iApSXL#ru5*8kMuQjm#jA6MX*>@\Q/+@!Cau?ApHNWc(Cksjn3^Nq9Pj*D;BK'9kN]2/>e7KqSD$5AmA@R/m(*s_eb>nmVY%6\A,cRPWAr%$#eEB96CIO.u[4?[Q]4QU*FP-4gs>_1;Rud+g6]%3Vb!^,8sZ5PAe=Y[#%$*)VAQJKOmcI[httO=IeFjn1!HN%RqRP!tZ!1%T0;R1pT]<1E&i3-)DdF-UFjpp5h]d'f`H8:C)jg"hDimS6FJoU9:8K>UWY6$UN8"^[OJ_9JbDsLeGY!gOJ0<8hH`@,0CLHT0:uimM\7f!P4&S?T3QlMQALNBrI;dX4tE7::,'*+\/m2LeGF3Gl?:17oNQ\q1KHIYT!!9a/GP\pj#^l!puB4$\C7G-aU]Ur=o]rB/SDW3S:fgMN(!9/EWL8(YZ,1#1c*@JIKl0kICRl1MF#*lRIm4e&;S-Sa8:61dg,fr%hI6;/)>hjnlFri4%4E8F"`/[!F[^'6qoAbD]=Z^6oIL3k9U):R7dGGVYa?^Q*2MY"&#PL\lnX$eHlhg#n]'XYtkak;Gb3m`fpqnJQ]=1'_&KqMK/N5,9K1#i>&L+6RctV@$/\qqbd-D@5\bgo"asXh6l0@?L*I"UE9"1]=4OcXA+$;51oS[2LS:LZsejr'r53!^5>49CiBW*dJitB37:h8)pSXA?s)_RHu8j:B=(u-]siNXET-=2K6o;[+T3_ju,\$E`a!gT>M*>t1aD=.eMB9n.01IN4n=VO)UkX[P!$jPb/DYWKX1ZGZmFHd9f!L8,`A*O169t^PMlgR.i171RJUAIARk@%b>&`31IZ1OjQn/rEl9@#][p_Upb()t.idT>]s?_fii"m_Re[GSdKT+L5CL':"XO62WC!FpJb<_Xqrr35_d@Aoc<>Tu*KQ\]3Y2]\5AO&o:VcmqYpH5k14L2D1;K/8CSJ5d?GU*Oar9i'16P;dnH[54_@n-)[:i)/8f[dK5e(fq4D[*l=,"SoELUP5*KJ^QPP01Y&DE;-jodd:Xk[-hZsC=%P&CIr%bX[qaeFq>Q-nPu.r_(2bn4'&r(+3d_V3.!/UrCDb=kg:3)+jCiqAieXJ8sN/V'[?sD=ktA=O@tYD)a(2Zi(n:R`'D&/TPZWm7bt%R3d\Cn'/k?MHDmV7\h`1-'tOYej%Q^sY_`r5d%d"mK#FEGG"1@OV=#RAR$,gA00LR<=>#Ma@9`(bmK]$n8T`U91X01>G#I/:d'QQ=kEM3U/=/$8Z9g4`gMO+hKsb=JWh&#=\&>`PCN^&8YJso+arc(pjZ65i;JK/pTLS%%)Ef3(Q/%Y-K@*:o+6#R.@b->Q2H=7,#%=ZP8%7cgdM%trak+XV2Hf#d?7*qrdbjM:](^q4[^]cmL]^Bc#M!l8WaU8I4cGiQlr\JK^Z+N1Y'\l%4.9"%j\Jr>qiu"9nX+FQ_MZ4Vh]e&u]R6:HC>h!i-"q>ib6Z+dJn5+"4L%!Ll&h^sW4ppOZ!,iG0?%*A/5'*]'@N2bn#uGND.X'33^0rCc2WAd07t^!"#cAdj`(1f`n!q;o2[m2"E<4'mn\Q,dX/[8=.8Sj$%#TH:F2?4)X+.MYsWj&&D4J8@Nj4m&*0esf8$!D>F"_B8l+[fjk6UU?]sM3V2\S_PVqCTrrMi[]<2~>endstream +Gau0G>Bedl&q801W2Df(`!G1Qig7V$a3=;oN&,Nufu"D"!u_P)Ob=bDYMX*N&\=.lnRQ+.>Ld$0eQ#t)h%>1X+!LQs\HTL562t*g6%mnu"IYH^Fpm?`L[Q=<\>QEIl9O<>cisSIO`VJU_e))Kp=:<^JrgI-BiEBX;m?W!oD)`)OLABiHcD,09pceEaAq._b2`C30pes5!L!t9LA!=+[+E@RD(MZ##*%ra]FU(Y$7%PLMFHALS_:^NLUW)S7#<$]T9r8Cs9cQK"q:o'l57f,0!`%0D?5imB.AAF&bQ1uH9N,nn3[Y9/$9^\lon1e5.$FPI>uWQ172"T4>UW@%ins8rP#1jL.Q@!+&[]p8`$>e(r>&^8Bu_12Ij.K'VXiC6eCn-D1StH2;:]c8pjY"R92UmeTc,&VkQLNLRc8>TOJu,H+(7DLN'26->++Id[ir;lTK-A`LHsOiHBIaaLW/9GZSJIGkEQG6'lb?6FKfl&74bC7E/6Ir+fo=fbi?-mTKr*DtTZ4!WBc`-'0*m&4Fk)gM@_NtL"T"77"ZF?1B3@n/YN7:qLjFN6_'%kHpr^S,Sr1Lt:VdB>0Bit9mXp*m8Q93m[N6f3`#oV.,o&Bp-m]#6&/dALG\dkf?GR&Yra*-G"'STUiJ%t0\1dmI1G0UJ3;W'8GOVGBuHkG`kaLKXS8D-=eoZf9e`s)[`Jj](fgf^9a=_qqf,h4V^X9j7Dth(I-Drb6`?bMM_>GSS"KQ?b,m3i*j6-7JL'jt18P1f9V'pH/BMqZAbg2&SbYnaG_/%gX<7OrUgQZ2m-Ln.[eMq=jg'CHh'NlVT8='3)+8T99E&41PQCMAcUdMYrSC9HR/`'!Fbt`gYA3\G9nT:/R8W-`U'%LeoBLm8/H9'(^_YE\UW8P[T(fDPnV:`@_u$Zb:u;=g@b+N4'q_4ui6d!IG!dL&_UmllF*t*d+#t0&%V5T^0;O7#7s)K'f#PhEpDC/_?&lde!+^7o8BOlnsNCMtm[652oBI38fuC^qJk4os28rpo6\U_r8tAY\.>W^G&at32d0^PnaN9KG=]J&U!fAe;P5+M"uYm1M@h,dakb+pu+jkmtWpDKR+*YBUO?kAIt_r1lNpJGKL_bD1,$&24DS0bq#QshHq5`0p4SLml.C/YccJ@qq-oAd3PGeep38Zh:*Z8Ll/>5qdNO6r6Bh(2H\\ELhO(^W(X;;fX?LAKGgNe^\[A(V\#7V0=?DaoQ.TAlA=6uW%a%)]Z;_UR(EI=tcGJO^Oe_#"@>O7X+$eP(_f\4&lV&#h?r4i]ho)-]g[_ss%;_U-,be%4\I!<#CNE=#@=Mh%'[AaK*2T(@3Z__17F"fmpCfg5AQapc:gT@5Pdrl9*!eCQBYVc\_ai#561t,M^Mc_`#M59//kPKcMLi()%%e,XMZ`5D4!hmm[h]!mZPl2_CDT_>c`;>h1HcXEIn8Og0NjL.T"D"D][mm*2Qb%)g`G)d611;MrK/HbQ%F(=Vee4S^n,0#mY'bM2R;&W;3bm;6>p$(spsUkZG'BS"I+BQ/='EsB4\/bJf#af,4e=\`V)rq"SbF1;q9G;+'efI@qIb%Pkh;Y_agJQ4/0MOlu>iY&PWj^^\a&?BjB9l`][YYlh*KTBg\J&!qGa.s$bPWWlXV[Zauj;RM:jXgsS+Cu2t&"!i(XO)9UOA351u,_A=$ED/'"TB`*9$XiLO7f^_oG!Wn1aGQAl(sZ'dbQt6FjY<9g%E'/#OG/1^fB2W#$#K*ujuGQ2-hD85TYn!Io'Ig*q,.0D:>i46H9(`u<`sfjV\rM?UquTK"H,2D/;\DXTSSS\r@dOM]_H#n;eI=YY8gjgT\9BIRXqYFqsu0=958_ZEEM\Cr0*3]^llhh`<)L,8jS`&5LNQL9>GlM>6770PUQSTm^;0((Vf%-.8ecoZL0OjDr#M8CJJ_=8;L]@^T<_1)'6*&f&7Dc\0()Wf5%^++b$eRAO?gpYbOT)T=k@haPf%,#6]6TVF8%n+`BkH^T5.BO$r8=N_Y*bhd>gE8hj'`UK#u,rnonKMp!Ded.rMr.0GQ"SSiH,3J@!fn2C[`gWou-0)O84CVgX7D!-9Yi\CjIUe^*OM_hI8crm8p*e@Se:bgjre=^HM\D[+3$Jg&M?Z^,@0M@bRO9SW7Du&.b\ZG$LM]JQc$5hK5:[&8l&hN4b8?o7NX/?cqnXiOlkEJWQi-(TgBD27V`(NrGI8e)@uEO>AN1QHrn>[all4=,ENhTJ>K&mMT37@*g.4T>S9iN66ZAG0\#M%MGMB5?%>'#X$p`t,b-b&N9nHs@k]%Gc,2dQCl64[H4ne]M_kA's'#=pJ[SPCQUKjJ%=^SQAULqi`se1po-;Npm3LI,IlW2NHaZ@i/8WqR"\XGm*rMGb]t\&qSIk9J;0rF4fl">GU#uoP!(2Lt&("jk#[:TN&tmb0(RrcnLNao!A[/M'^fZdae;8Q;YTQ=/kCR6G,gL^=j!0`^hkKdDf(aFGcnk+,jiTQW12Pmn-$DLU@?al-5_8aS-@T]h>G(GNtQ106_$FAe.rRFYmH,ju^7C(ZAiQ'FP/$R,J'/RQ2ff4M#*:oZ\k.T0\*%6Kc&SOOR[K/.SOeZR`_]=BZut@0^P9\ULYYh<3.l:7ZN"8j&E_k@[qkQf@BjfDNKh0QGW_,[@XmqNk^RO:ZDUrj$hD_0DtclCO#=C@>dcZJgbWOU/r#C]"m%qC0XYXSK04Vpd\T(`Ka5gH:Lu9L]$C_B>8P)1S0fhfN;)Iq0So72_SO;^=fGSXp@bIIMp*AeZc,#N>9W8O<,jnN@KnS*p])NnQN#+_SUtk4<\]9r;L_T4'%*@W9[B;eGMssU^0hn]E+LZOIsJJD;s1Sd(?X:;WQXg5aKHO1_*.N@8Ns7V\NW2b!dKKn3>dkBW;~>endstream endobj 49 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3249 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3244 >> stream -Gb"/*D0+E%')q<+d@[R4@Us2+"Cu<6%YL>F`G]O2V65\*moUK9@\M1@K5LVdo`u_F&4g9tF*9'F#9usDBDQ2NTC,Pbd.,/45Fj7=nGnSE%58%r7US'["q8f9A8q%q"!aMH>FKFJ(,X8?IVCb1Z$97HK]<.VM/3P<%lq_rfA,'a^4i+odqi/=s2I.;(aM&m%`,`,9bYtE)l6;4Tr,p8nDl4XK%crSZ\_b6"d4$J5p`S_ZQ9\t\qn%u=&!=%GDe67sbHkE["S,\BN6)9M4k@[MBj+JafP7i([C*5;obd$i/hL$'J%@a+d[8ZGQk+:2r.M@@8)q[VoKLEd(<'Kr[GKUsRnAM!*Ion!K%j(-\Q/i$%!INP"9&]RK`6_%AYgjqr`l'4+3(WB##+FXqk'7LAbkVZ8-b(;4=XU,?$8]+B*,\.K68US2m-a,nrc5[.ALq)/ig`I=ca)2f!4(gTJmmj2^N&R!?*Q7cq.aE*]EALT].;Y]c-LA&eHW1$L1B#!57=rTSW3hY[hd+kTRCVMW//:U0V5G$\RDQ?(0UoVIb?k`eYGr\hpP/j!O@^ic6SkpK8f)Cqi]*)Pi5l]9X42PdQ2EXZH3!6g6B:iT"Mjl,Xn(L6"!5S';L@oR(1eTMH:''PAQgqC5rqnh-hQ6CA!8+Fs+iB>&6RIP@W4#S6[&S=idb"a.7KVg.s-^,P*U$LN%V6(=e`aH&:Ce%PS@QCBXG@[Hf,PCI12&%Mh@V_>P\V67kW9qtIM\bXT7r?]@9Fm-KChRQHJm&fpdI<0Y]]WeXh`N`kQ40-%I(!/%o+ot]CmW9oJD(r,=0Nn&!C='iOWb"*TXh`0/>FLrk<5tLm-<4dLGlrS_J;fe3C"CjH24CD.[sO%K@M]Cb(-3F6k-0$2_GOYDHpm6NfFcY8o31OoQr-tIF>/P^l4G`h_>SbL=u)@r"t+k)6ODY>X0O&CE%aqC&X*j:@?`?T'ZB0`!Y6Q7'[_*30Cc2Z[sg["T2>:^!HhIJnWZn)!2=9N&V0eeKBN\PMgiq]b)@,G`96#Yj^^D%76m8;kR48!"H;RR%3Li2h!Z&`jhmJ%Z!g@h+t6cXl&cj4RNT*I"D*en.,L?U2ZF&GOQ?I>'\FA[M#?fXAG_b*[2F:i2ug`+;kFO2nLa%`Z4Ni5GRT%0D6_3.$8&oiW/PX+T:2EN>kYKo(gtL1Mg(ocj<[:XR'H5Wu&`^WKJRMB?C:[J)o%M"b@[plY%[!/Ojq&_\Tptd/9#6cU&79RoIhM9OLF(hGpn3ZG5_beheT&r<`S2i-5J3!mC2_=8_`3JL5)o=nEt/%"g&pQWn[+0&X(.33"E?-T*nJf_AYZdh-VSPNq=(mn([V+j%]T[RfGnjgTd;sp_CHb3%`ZFDT`2+&p,dksX^GZefLb>u_9S+#Bp,l@`AGN?21r9j>qK(N*?&CcLO^9:a1Z,Ab_6oY901:*l@Hm8k(6\bgV"YP04b=e?hh7703lnC^o7^1s>.>^lA!8iD(g)(s]*_ss*T%o:?3A*>2uWd]URW)DTuQeY5&;D/\+4B7/1,Q,?\WKSOr;*ic5\`G],^R#To28_;pfsZ2d'J5aHcpa+>D+"aj)6+VODJIG@hN?P+a;r:V3GOjXg]TA-r[^YS5A.e?Me7_PAU'pU;63;fMY)0d-rD;<]c*lM_k\f.TQLDD6n)'?E-q/1-PkA#I34Y=d@[XA%L0_B\]d:d)`V:D.7=t0>::/T>iXY@[AA$^jVf-:%m14tMZ~>endstream +Gb"/*Bli#g')h6*d@[k3`1fh"e<-`0*Ef[(hY8!^Y1-FM8ct9=KUqSF*^Eq;ig1D[G/jT\>rXjR^`q,GJ5n.cY$>%D8Lr&$JOjU+r[<`#)J!3?%B3V.=IN)c+ko"TG]!ie/l9S)F%sk(:704(+d%C;,_b_6Ro@l2k7)P7CHLJ-ST$K"'_AUKsXJ3jDnR4g#(I?d@VHNB:M&Q&TG$^dLBXU+riEo8#;D6b_*?0$u=9K`(M+)eG`=LcDoHjqiiVP":)"JeRPMu[WBS$i%@#&+A6PJi/i._Z>P`KW1E@$K=4,`r#rGY0r/@+7[B/uf%In^qr5%6p%"o;a:nVT@3f4QoA?au0,e)W71M8rU+f=[2+s1t>27n0'!.ZO\s^NZ<1$jWBacu-^FQGn78i.FIcf?Y7e7CB]*gfus2M='l$l;fC=1p=[t[o.dRGm,P"PmT(e/$QBYJ`$&+bXa6!=IN5$d[40;cZrAYk4VE6^/[+,2(K0ggBGg45n\a>Y!W"4cDnofdF8]R?fr*[#8o;k,7p'sKZmVfS2\X]Z71jR"8>r$LSjXX(XL+R1NkC>PmKH?`SNc:C<`@%VkU)#kueWSMk;7IY6NA.89beL5q"#1>E]<0m-.K?]$].c*$U$R/9>SXbd/:oB@UbgBME*(3"%pIdIcHC$-aO/(S3agVMlLr9.l4MiNd_-S3[NT4,ZZ`H[@+$,<;R1JmqQP.c'"]O%_i[sI^T1LCLn*%0a'OD4%b:ZdDR0*4g3!E0j(Hog'd%n!AL1S+4eOl%8N5c*3/hAtX03a1Fn$"5*DE!=6S9F,ju(/P;Y)pjGF5XdMkTnlYh>M-@FOt4$e4,a2$^9>6&D`'U^giTgt1Db@BL0E+TH-gldC?AF00eAMfG4/kg?3h8#`:9kI7&q%jO$s,D0b'i4HNt5cTWVR>gCMHlbms_0^P/kJ5LAYUU&f!%4dX6r#aCe7DCRJ,(&NQh95m5a=9ln:i)Y]5)T*h;,g8#Wok2ZKh`Q7J'jak4kl0%R#mPgdd4)+8.D>M@[O[X2]](5;'t$W4k1>lC2FQemicBa8tI?8:@rAM:e`-W.t$b[e(T790ft!aMq=V5>!7fO@6?YCZoIZ+_,q:F$HjD$brfYeB&41\Eq$RJHZ\&!Z(QfuWPbGXm]s23k!=;=<&sRu6i8&JF83=+Vp"RPEGF#iiXg>?Dp!,IY*d6Y,-S2[J9dY6@nXQ[YKQC6Hhl$JF,>'@GFlY"mZM>U0O)%u%2c`hXp=C.#3j>%>1*='B0qb;:S?B)`<_Lb:GTTp'-?oL"q_mE"3b[SqCiMb&1/r>Ye(cE>f^b0M(@E[3,C::oM.=.+LeB*Q0M+P]2>FZ^5]]318jdg7F';SmfX?.5^g[ZX$&`&K.C3*ee`!I%"$RoO(@I%EbAl^2fOfXsKVXGr,fN9l?iU_dH"oo*#m8J)QpZ_GT5*)CC><,@7ELe2D(*k47RMPE,k+&RWJ,MbI?&Mga8$$aImVt@!pVDIi]3bP!Q]@(e]IEu*mecNI26iu&Q7V+KUVGuF`&*18;kP>5`d:)LHu29i1bLT&`jhmI(fgg@kJ],hdb%Aj4W')9lI3Y<^o<.5X;5*'2l*/juR^ki;-)MT//EV9gcgP\2Z('hSll4umX1DcUt"DK;iZmC0KTX_i_5We1F!1g%-'S#3fC2\U0&b!])#c-rI!/Q\f-2K!Jp_-(G(bQ-Z:ON%li`k.\7a3:R:*=7PLd;Z)K?dM%2cj'nGHHecV8fon`:i8hdt'5+-X9\CH+EbW[s'e0B(Jb>^%P&>PC+5.3WuqZ"p2$_DKp&g[=pkC-lc)E!]O9^La<-DM_Ykg+jS5d))-%l#$cddgC[csm+RI#fD=<`pbM^%NWIc.rEdF/$a(J"pknhCSVXI//GUKa7t'b0.cPQKYChQjhN!`tn1kdOhO*5UE=qqn)";If3sMQej#',c5"rZ#4hL.Bg;iUVU@2amp#umE84.iXlr$5D)W<+B2_+Z>O-i[)<9[br5PVID+bT_c"0^='%J1m>^KqWP+J_;$Bh3fZGN6L0"JQ33!Mo`:/Z]FZ,\/B3#HTVq6XJ6EZ1kg;r#o=GaRe2m-XLIl,lS7HmpCd#H.;8OXVT$mtGP\!FWetG'Un''"n1&s!<'n.Hi!/EDI\?$E5WKqk(<2,.'GFXI?$^C@jc(4W7"m^NG5-9L5Gm243d,8AXl=G#j]BZ%ZIs[(4nB/89ZiPcIgHOr,=)>cGQfihWuf`_%^RIFGZnhE)>N.&LhhqYAM;#~>endstream endobj 50 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3081 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3002 >> stream -Gb"/)=`^?/&q9SYW2BqtG7/DCk"V.\[q92UXeTNQ_\%b=PU*,W@Q8c%YMUlB#U(?Vnj^j@L;TLnk*HAUio*BurgGH+GB;9I(Q]c6q&0Pp-_pJS)=s?4DM0%,WcPfu-qMfepnoLWD94:)#rX^`,Ee.ioJf\Z>p2tY!%$ltQ_*fl&N9,,b!H/k&Y(OuW7iM-RMWZ6hk&X:q[bLYk=73*k$E76ot\l.6kL6*H.4GiY_;FO1H1aR.'_cS+j#rpY7uru*:\d>MHen$?gO)nQRj:1S>n*P%'GmU9bT?qOOF?$`/-R-ZJRo'0U9G[cZ*DLrQohELK=sO[YK%/'2seC)2TQlgP"8SEr(4(lLn@[eAGM],rCM]JmIFB1a4:<3B2LCSF$0F96#ktAOW@G$AiDX!+F3*E&ELN6@pj=g(KHP;U5Ft>\2+n%)I"jFN..?Sun@G,RDUfU6lij9Wj:SEpV>7s+\,KacAgaR/)EJ<=4s2;O&p%a76_h.2(X9T#th0i\X*jano!EJTBc&*hM`I8"3-gb,G6+h8SunS9=3#`gU/U5]@+Y@@)cfk,D&Nfh>;O6d9l?rIs:H_Ut=@.>;7Pga>fcZqrfJ0AkgQ2_cqX!k3SU:p6eU5(_&Van*qbc!O`O99!4<-X"lXX&MQ>UV=!Ad/.bVGX@ehYI5`+)D]5nE`=e;6Np/Q[L?D$Xe*ld];MVAC*IQ.:MAmW!(3-aAaD7AYJm3b*%6JOhAR_Dp6@LM[W<,h<96Yha;PKQ469-@mDHMV!ARRWpuZk/4j7n86F`.s@o4"'22'RX?+JW@8&(B.+t/a=tJS"C/MeVESFpK-0D4a\N*O"=;hD-XOTmgIWC0!O+]3nUa?7P1T@)Qts!.lj&TtBh!#sf:`QEsI7T'0C5\XMV%d\2*,t"n(KAtL/g\K=fl)O`;6(_V!!l$UpbcW25#qK2R![FDgr=ms3#"=GCr-f_QTS4,jaqatg()GgX>6&JB=FdGg!UsT-!Nr^35`LI$\@SbKgZ_npYQ5IdW'.,c%oIZBhi=AXrFtG\pI]^P2'W6Lf$Ed6kRSaDcF"QI7S6J;F@fN6,uXQ/TOhmq&$QlH1l+Kj9@E?-P<.71TCk[ZVAFEWBo]RsN^-SskVO!Y^=2:O^pclgG@`S)2Q7;o/OSs)"sB^!o.0\MV0,77$n"mB/@*:#'/`)m+'g]G4PQb%_5(D_p2'&PS)0IipVgeG`eD.J,LI;qh>g%"0(GZjUV#(r:2gctfP,k=Re-H0XJYSTK+@Mf)ENe;B2Q<&7`&uVa;b2u4$729TM>C7ogjtZljcH0g7CXmEO]2LCR:]pet>%.LF?oa1;'86Ri>8OH+s]fBErZbe!iXgSF/43.BlY[i./Co"&Ka?$ZM@5Lu&/_kiE2-Yc7t`g)u/aNO&L_!N;!_IC;#EP*3%DEqi:Gr*Ap_6n+pYf!]Q#dAaT?bIi:dsEJ+cTM8F>X>G^e[?e\f6#If-H12bD^6mQPrWd0PaQVW997>600V_*>8].4tqcTBQD;eAP,TL@&AVX'&D;%/'\bcL0a'&:StBNq?Kc(cODu(8C+PHJP/0"o$'$DuJe2d@W(h`q"Rn)#lMJPkY[?24&)P2VH$Mcr^n\(1@:??iDu,e0r,f%n35!Zs81ee;9BeTo0M'WC;!qr.\h%a$C>c?*s3K(Cd=TZ9;YSdC-_b]9&'r8=JJb(/7O8'4f)7l%J;"i,gd[Hc\>;6NY\(p]t^Q:,_eONPiO"lMq?U*6bJEL?#S0Y[Uj<@+77TA+fP*X@i9b\&5>93gIK\Op"N\cci",;""KklQ^le2%(j3%bq5\sV-L)d&j?&q?4MW2,;n?U-e'Q0o8,t4u*.>U@Lm=<.I&\PDDlj/lUuU3C2s`1\I&&bm*#;FIj.AD6u7DR9-!ngZ2l:'[W(NJc[[d";)p!Z6?%#b-*K^hdZ)!$)00E]:XUhR@68aK`3th5'pOXY57PY<-tMPg0Dt-U\XJ0r:EL^kp@OnO4.A?O2B7W-Zlgkk)m-O9E[V837MTl6KYoEY^i>Smi/7Hl:eA;AZ>CnIbN+j.g5X\dCh>47"+@I9nV4OaEk\P(WjO6h,72U`2Dh&fJ\4G1<*rRn9Zl8rS#=fg6GorV!=X23;l&ErIVcX+Z4/M%Q$6VKFtV-_[fYlP%DPmTKeq/64H3nUVZq]G&;U8SfSr3l!W!_mk&"R8%>>n"TG]05Qa#kp"J&c9V7XLr\PFCjl;@mTfdGGrulIb0h6EJ&9a9V,XF[b@%;<::9@Jk'B=)cT8`JQ"ZY:(^=to"J>0j!)ed,9UO$?jKj!V#@HRHcAb-f'Se/De]issC2g>X.\_8$IMpZdZ*#b%2e%bU]8jS[A,qh!#@E3Tpk$c,UJ^ijEoGt%SqH>PE.UR%d_6cH([[\8"Vs3!(QCJ_C/GN3!;j'M1YI;p3C&bpIfO)@G9?PUM\D.5>hnIb%d^NRs<2_\DFbhT1DaeYRTk(]?7Tm=V<['1`O2?f_XrkZ*Ah7S&3]LZs$=G5dL9\okI(?'&lWD)"ha;R$6kD7NEWdB0c$ocT%e6"~>endstream +Gb"/)=d.i7&q9:V;,<5GbTM!LI\T1lK2"95LV:=I&O[cW+HK@@3r7K9^Sqki&<[#`pgJg=(8=EHrL_CXd/)33UWKU3MPtns++ebc*b&W^0I7H-M<3`XU_45p'MD>OK$1QS-['h<>4hakF0GT_no-jUD=+D)FjUO85NmFl1Re?#k+1h%-GOd*$i2])*m%_tVKmE!d5:+p!LdNi!?E^\h=cM#c>V9-BKGGaa%d53i)XUiqS,>(*''7mhK6JrJ1g/F$X?%/\fkHsp0i*o1(&n3F@oQbH,n?3De$!tSK\g0F@F6]I1E4TsLYQgBht*=bQp(ALDDpmg_QV8YsN3#XQ#TJJ/'STI09:_XsZOEI$-nd!I$o[2!kaM:3HFTudK3'rsQ@mUCjc^SV1D0hVZgkBZ`T6cPeGTb.abPr<6YI6["RhHGsN&S,K+R00oEnb@NP-Ndm[:`JfilOuEWKT;XJIFg(XNoI>.T;bQibHS7>AnJ`Yj@mQQ[9D#eh.XL&osba9M#IYi0)AB2+gs0)Z7H[=0s%I=a=9XKu$M3R4U*cNRhM*h@s=.Wu@#\2BMeR"1Kqn,AnT],IoQLf`raG$GX#rbe-WlEPKE)6c3r&3ogp)M45pAPH[;e3:9YO:fPZ4BRa_1eXJYUghpI=P"l\_`#tOmpUCRq)E226f*IB'N@ePgX7lnB\t6.ki!)[QF'3_\3=+21DbaJK0MWu8?uJZX5qXYJHATKB3<0*(aiF*"//]"tnm!AP0lYL2+u6n>c+RXFEQ+8+K<1"DVO;dKEahBp3SaKE'Y,I5/*7p1krJZBdBEmP:Xes\G[2RS=0A'`t?-V=(Sg!NlQW/'4\n$X?\\D%VA#LX"Fu1J6iP]P#DD@GR!VaW3_RmIBL(r=4q1d+d>jY@._uV1]YQ7s*]iO/biP=J23XnDqT>(DF6+L%X&RNG3&3ClPfJ!fHEL_k1X%iQXY2in!?FeVkO.gF2l-SdE)a"R<%GW)uU&aCSD!nNc"pd?<-\su#q=YG@o!OcdbT8fZWuuQkf:urF]U.[TKnGi7Kg!$/9%T_ngdBepDDJn"OSF`]:XUgH$4:##k`7Jr91ZW>kZq<.ESIsg0Dt-_tikC2#\`OFQ8MDj7FA%8"jX]$Jd:0F3&])Sch<5f[Pn^Ko?P[NZZ;CGr3:5h='cd-Kmloq`TJ!Y:VEsS1"K>eoMe$7`DTSqAi_oDMBGj#W(umCmpq7NWFKK2rj[q-lSFt5I(B(uNrIhoZ+>du+cFLDapVLn/[I+8CBGj7VA\U0nk<]VC'"ng>j8%PIU]([$:C*76HF;atXd;<8Y;XG=@Q58W#PqsfrqG8N.>ZuWpa(YJd5Kj3Gp6\35j39+qLR3UI;endstream endobj 51 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 210 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 366 >> stream -GapXOb6l*?'L_]oMHNMn&X/U9\;X7X:mB`!^/+iBk+C-uLcuJk0m3~>endstream +GatVW>t`'h'F*LmrebbC;m7UR?X?4cFAO;i@mLrbfZ&'>1gSN=p@%D.3^e-780EJ):0sLp!u_quH_g]`);Iq@?ioZsE8Uu:1.[hBp$cZN#lQ.X;#kU!pu20=0\dW$aL0:8)\U0<+bf\70]b&'(Q"0+$mnUea7-I/;`^h(Dn59TBe3U/d5Cg/jkY6dHXG=-,U5?)^3j%LN,djPrtu+e&W..YMmQ.o7EUPJRHgIAQ8<3km7GI5KBpHa9p_>=;>,)N5~>endstream endobj xref 0 52 @@ -344,13 +344,13 @@ xref 0000006371 00000 n 0000006460 00000 n 0000007422 00000 n -0000011569 00000 n -0000014910 00000 n -0000018083 00000 n +0000011529 00000 n +0000014865 00000 n +0000017959 00000 n trailer << /ID -[<5bee862ffc07cb85575bd1d024be9265><5bee862ffc07cb85575bd1d024be9265>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 29 0 R @@ -358,5 +358,5 @@ trailer /Size 52 >> startxref -18384 +18416 %%EOF diff --git a/docs/TICKETS_ROADMAP.md b/docs/TICKETS_ROADMAP.md index 582b51d..f4733dd 100644 --- a/docs/TICKETS_ROADMAP.md +++ b/docs/TICKETS_ROADMAP.md @@ -4,6 +4,10 @@ --- +--- + +--- + ## Table of contents diff --git a/docs/TICKETS_ROADMAP.pdf b/docs/TICKETS_ROADMAP.pdf index 46e7e04..995e8b0 100644 --- a/docs/TICKETS_ROADMAP.pdf +++ b/docs/TICKETS_ROADMAP.pdf @@ -102,7 +102,7 @@ endobj endobj 18 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Tickets, Gitea, and alpha smoke delegation) /Trapped /False >> endobj @@ -161,10 +161,10 @@ Gatn#?#Q2d'Sc)J/'_]eFTrcnA9[uE26Bfh'koUh.Mj)a#&J$9S+?#l+Doh%fgMm^&g2Sgo:5Q&:^D'g endobj 29 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3969 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3979 >> stream -Gb!#_>Ar<,'n5n\+A`c>mFiJ8]%ahK*';HCS&F19l1VrD5td^c`Yq_%-"E]`IsV^*b@i`D:9m;s,\%:__fJ'*,A@Udn>",*]er-[ma1l(6Q/F<$`"YtJaVBgf69_lNjN8m@4IRQWWob79>RW:_g=ng[85-ah,^qT$*%J"VU7QCFK,XSNds'j@TV%*h&9]QpmYW!q7Mfa.Z0R+p4fE.T_mCQkjC6#0Tds,B6+\SEt\=(B>-m!oHB+fBBl>b,tmF?glg=VrWi8Dh-Yg>Id:Ch0GLpc7BDl.7nj_jn"a9\>paKqa+/I!e&QY\=n+'4;,#Fi%T1OM06cmBJI!MmBUYSFoP'8]aHO@u^W3?W]N/tOOsqVDe+K1'9kSQAQI'nE-YT%s.:SteA:Dg8P!)8[>ob/i/B?sI_d2-!2u,#k\)h[rVGV@p(\UOeL&1_Kn9?t[Xg=Yj&&&?aSH&H;r*sq5V@h]'X/V6hK[:IK6#*WiGK4o*@"T>]%iWp!T=feLGM:G^Y#7+N!b`FJ,?(H#p?]RO@ZLH2[a?m0DQcLSGH>>&'C@21<9IqOVE)?8i>G0O2+uiNqP6E7(3N+4np/0t(?=3c2S7H@10eL`hmQ`='B"WMb?cUbP_U&u@]+i_$\ITC"^;n:EP\IS(/U'Np\I88uD2=\O7Ni%`/28]tKHO*fhg>cM]hF7>WOCdA^hBt8mmTE^f.)3mWB_sPSR_]`RWl1n=Xc_lJ!14'0U8SKS^VkHU__cATedBM(85p/&BX"E6Nihns!c;;RoI0M2EBj%B>?SWrbRY:bGF+G*hZlXf9!#HXDfS2u"eUn!Ln.dl^5L7J#3AIWO`7c'#K:I8QhaAd0$RbfH'pXlirH)u`-c23TMcd61GT0W&c\$q,hC?VM<2biCM@NI/JO9&&jfN=Hj!uCLD9JfE\JXS\+K`g4aVBKWqU4!kKS@T)[RSs#<,>QW3a4oaR`]Zf`0TmTLfOX)CQK@/b^0ssebq%IM3pd7FSQ7uIk,dCE_`\g2r5Q@Nrf!H`\`RMm6\G?b4oosGT2OIK6SqN^dS[WgMiO%%J<64pE8REJ7o==9hCu+rCB_U=Hn@-`"YMkeO=M4:BSR`POt,D%g>:PWm,GIm#70)P+C3G[J777Re-*e)91sA]Mu&M/TG`!Vmdt\gAZm^8\C-#Gl)PrjnRG;"'aMs4a:b[EN-%t;3`[f^3f*UD'j]9`b.;"3L?]\4:qi_+?':HBYX,uu6A/@"0sEZIn&3l5DR5ODqBN&B^UU/R:QM3EidTtZe^<9nlc8QOXe5T\LSC)E#9gN9IY`j":Sm`gkHZi,OPPdf=^&X,(@!+M\`(sr'_dSFmgWGM[i]_a((T-Q622PAf_B"IC(l1/F]6]VU"I`Y-rd[)bsjro@PJ*TFf^ZN3mFS-eZpFA\\W\b;9Lm#9g]T+o#%c-)B=a)pSF*$!D-.REQ?+)oBI)^6GZY/-F/=/"<&Y6bBq$ms,=RZ1c!_"Z7!J<"FN]sd+"Znn[MZrLSM)?VEn#Y(\)O4$o'0WgZD).[I#G/4)PZO7_+f'@E[FCHW)jp'S&@u0Rr!0JW;]t*TKFcRV$(s5Yes_B@X=$1(?:RJ'!cA[YgS69g9IG.(&)0L]-RZabPXfRN:a.I+d0o6QGQFqXB/qG!G4X]U1&m^7rNGPLq.89(kNQl9^gIXH2>fR?aBiq4)LM8oVPas"/VT^I30egAtFF:](@\ip7XeI]OYq@GcT6\(J<,OeYBfK1)-gN!AF`#88A+08>N%t$%B.p0:*G`Fc-0MOU+/uDDe4cI?cqS2]VJ+NZ_sf^h&'%Aqh,o6Jtfc^53XDVJ:YmEFFnAXk[ZbnDPVBF=>UUt)&sC#J\O>I.IU"5k?&U4apfBFM"o[pfq7>L7a[7dB[L^REZ!2ZTj9jPb/XTYhd1cYrX_2(!Ne(\Q'#VSj:k5P_k2(]fVi]nnlQF4q.97l=:54;iCY?5"+8..%1p)\@#CZO=$l'%7FVi3/?/T<-+8M?;58$8a?sJE$&>###&qX]h!55?k>lI.^![XPm)"#i0[b6gIO)7s!RF\XE?4&l2ND)pXesFPLIZh+Q/iZg73V?IN%A;Z@S>X@PC%:P"99kMp[4M]US'I^:4)Kop_@D3RkS*\!>>Do2bDDEG&%,B6",Ylbfl#WY!F]!LeUXdspsg@jjp:;:[a0nI&k$1oer^cTmFf8td%Mb3bLqh".ZefEM2U?cRgog(.M8oJdi(EFY(roMTWi%JS8H*OMRMuNN!V@+HK8X`QWL;]n*^YJ5$*\6D@nhjXd,[UUpP+e97'V.XjI_hu(4F,8M)+qp0BO:'4c@bqjWK]qJAg2&Yp5"Wk1q9/8:.?DY)W`2ruRP[H8\^P^=:mImGR1=PZ@G#_+fllu@bWCq-:Rcka!_lSbbMD"!XgepeL5Igoio5t/aWRFXA@\MqM"HjWcir4-+KpUIJGEZli%enOkqNh(-;QbEkR(!ImV3:;+k5s0jcubJHVt3?aEop!pI?0GS*t^Dr*REebl@FM62F^?I1c35d9!c#Z#j4@ZWRM2d)i\2f9^,BnDFnNDFu6m"[iIO@ctu;%N@Q@5L7LuM3?I,8`8&\OmQ7l3"/X,8hh$3@*>tXrE\NBBNfHLC"JhH`61KlWKB(q;KFUXA/V+5*J`T#CaEADh;'$#qOWa*%&X,`?h\AW&$8a0G0&8WDKI4!:j^a`kk[Z-*H;%i%9^.1=(dVhE+8p+L>sAZ!PX"8;/3MM=Y!AW'W+iWfU*CEgJr$ZlF6P(rP/JtS3C:eDd!rS>XthT:6pF=EmuWW3Cu@IHe3aQ9I4E?$I$caZ4.d'l]-"^]p_(jHoEn1'J:l_pil.Tq:dY\dS"2kh<]F0Sr>@A0Ir![Wj`)?~>endstream +Gb!#_>Ar7U(4OT5+L"t`ZfB+>F`fIG$TDc\h.`?PPO@d)J:NbqRuJu!]$q$%]>&b)WJb=j=1>M<"K`o43^!.X5*FF0\)n".U>)^!0gSf5h)*h534<:sWm`]=:`R[D=Mi#Z[?XVCi]Q.r9!E#6AN=`Yc'X@hTR0E9YmL$MU-Lp1kI:@3u"lDl?aqR8K%a\j8PCWp[:?M'#uhc;&X[96=])u?C]h]e]_CD3<70c!MX#7UA]]07N$p.,iqAFakJ+^I3-aH+d5L:$b]&eX+J57&Q'_b-9Mq#9"11Y+$,PaK!mdfM@j(T=d?rsE5>Rh6p7p<&]?_%MI6[MHf8[lB^/ZL"ERNq5?"WYp&YQBuRL!''7AOV]"Z+NF21Aaq%0[fpWH#I%Ji&2P8Y,V:D1j4UI'c3t9[6f%t9l$BAE[]PP#Kc][4\#>U<.An7HOQa>?Aa,/=3`_`_tRaJT9l$'&VZ\ro4*"#@=GmS_\V>X%Ne@l+uL+2='Y'Wt3"W?R_.=V6N9OPXHPSFh0Lg)Ye%XT@1=2M([#$j#W0uU!'m&e71U.49t$Aa_LL#@aQ(cS*pW6K_6+=$P]n.q@'sV)>_R?"RPoN/sirg-J":V]XM'kBTtCm:NU%?HQ3q9K.&##^C"7:0eV>4b?HI/MA+FcR-=m#k3s^5[0KOm!oo+ik5?o_S*FBoWr,D]:aD,5ajX[uCps?HOVM:,,'U\Y\"`MX)#^EsLa4Ah8[^d,G)aUWUA'i\$.;SY;!BKkn%>?EKFrEB4J:NGUJp7X">0B4)/)0FX+3O?,7EZIZKEid>e\mIL_1bDc!oaR[o)M,_nXMFMM#c`e56,8j-p^tp=g2lDg!g14Sn8B%]RtZFmj+R19iU2KoeRLeKK/gLB'56LZ#ES!jl2MJYutmhW*8FXTLPm1&t+h!+=X*!'CtuG]+$rX9!-JhC(cA+*Ji:4OsJYjXt\DE1Y!:3'C-[tQ+!Y[l);YVqk\8'g3]>s1P9!4urTWO"C-cW3oo!7Xf?<22(iO-!C(3[SoqZWVAPi$#+p"=T7D"Kd6eAg'EDd!RZ?RbP;f.,.S1`cZt'Sd2Q?ii<)h5I^XaccJXX$6Yr%A(-rkcQ0!>CT=/RYOqfbhO5)GcV8/E5$q$j#1Jj6&NCK>VB!#9kX&g]d^NpP@XBY!Y9(lLZtTJ4Z$=>Akc_A,PN&0.&I\A;CF-SL'uN0G$\/Ridu2[$SJ@hEq]?PB@j=kHi:O`ldsCpIbidf!dtRmkW;IgpRhbo+:ilBPB=;-3S1C8418/.ZF'>kLY/iR#rPe*o%)VG]PT:8BF-]g09:iOIi3:L$gphDqWF?(/pXfI8OC*0&s3t0RdY.f=;`3DYK>oQro0^%'LeN>kVP]X$V&*YpJ6T/'@D;"QD-)AjBn8.3^aC6-MORR@*>o<++8eo<.mI5c5^OG.Tp184(UZ?htR3GZ8c^Kq]L9A4!c/\)0Bg!WpXdp<0*Jlj$kkRVgY0cFahdnZ35"6I7#I^YIZ$gkmV5k9s+_CG'N#O;*k(6<5Td%S8=a$[ohX)D[6GoU.)8$n`duPtmI_2d,F6U+7qoYff=72+g#Z+#0re3B.RKQpk?+Bt-K51YqEE3G/<6^LQ-8B/S+9H2U0:j[N@(K1S&9QS]qSILGAgq3[r`$',7QGCB^Ru>Nh<5Mf'%1.=)Z7<$2;F66PY@!dpR,+3g$bs=CH0V+$p>?Y,_BsF6@UNgUKgotQ,3$0r%E*Z+fpua(qCc_G:5.(:e.(=-J_4T4g]M#T&bR4$B)LFO[i&&pY*jYVI^Zg^g]2A5,4;:Fq`W]iU!dW&Do"SpXpbpT3>tJM7n=g7!ntj2U%h&g_VpSi7$f4YQG<[a!-=H@A4m=?.1_,uLnF?qLrj/pmg>n%%2]SCL(b?U49qE"8A$:2`D8Y%)HpCYqlX*:;$j,mr\&&#AZ!PW":jjLMM=Y!Fc2`-jSK(aCFm3R#_W6COp:KiJtRX3;*l=ZgtO]1nrE]RTh>]q:^L$m%sq(r7P8%B`K@*L5D/sR_mFV]$jC"lrtp,$"o'R-)QUr[%5+'!Q:qRrp05q;>HD$gRt+95$e3ls:B~>endstream endobj 30 0 obj << @@ -205,11 +205,11 @@ xref 0000003929 00000 n 0000004004 00000 n 0000004839 00000 n -0000008900 00000 n +0000008910 00000 n trailer << /ID -[] +[<0e289f67619633abd86562cc9631475d><0e289f67619633abd86562cc9631475d>] % ReportLab generated PDF document -- digest (opensource) /Info 18 0 R @@ -217,5 +217,5 @@ trailer /Size 31 >> startxref -9912 +9922 %%EOF diff --git a/docs/USB_HDMI_CAST.md b/docs/USB_HDMI_CAST.md index f8c1490..e055c02 100644 --- a/docs/USB_HDMI_CAST.md +++ b/docs/USB_HDMI_CAST.md @@ -6,6 +6,10 @@ Android Cast streams over **Wi‑Fi** (UDP/TCP/QUIC). USB-C→HDMI adapters use --- +--- + +--- + ## Table of contents diff --git a/docs/USB_HDMI_CAST.pdf b/docs/USB_HDMI_CAST.pdf index 7f41f0a..bd095aa 100644 --- a/docs/USB_HDMI_CAST.pdf +++ b/docs/USB_HDMI_CAST.pdf @@ -82,7 +82,7 @@ endobj endobj 15 0 obj << -/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (USB-C / HDMI and USB-tether cast \(roadmap D & E\)) /Trapped /False >> endobj @@ -125,10 +125,10 @@ Gatn"?#SFN'Sc)P(%9[@2q>jlLVrQ2!p_*]FX"GbKN*5RJW(jd[TV@7?RMPK:s)lt=iuMJI*QfYGn5Vl endobj 23 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2569 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2586 >> stream -Gau0ED/\/e&H88.EM!GJX(AufDEePDS?<`u`f6Mu!t5m&7,)H%;'Vp5q=csK0:$0"g5b?1S4a#MnERVJ^b/4WO[&ApLu8:#Jc'a)^Na!m@VNg(@`6#VaN?s/(*[#/DVWK[,T\5bh(S>T$n'""jql4\!o@VWCpQ=VFm2`h7U;3O'%SHBR2E=37u'c-`g57i-Gk6%j.`HF[Uo)IJ:Qcg+TpM?(r9VP?mi/AT:a^m'uH-6T(]SH_YHT.iO(O`n<<9B-Bppg8+eGQNjbG/3$3hb':Au[H1b5LD^V4_Ok@u%WWY,29@c&(tpZMH@Tg9)+>YKe(X(8K[X@M5U/&0-\ssMK(_=PPDE^iLkG,BJHRrk*$$fqfq_.Y-L9\mXd&8GX4d444Nm3IRC!s@I%-&+YD$QAUflgLK9l?Is*ZuV`hmB1#.2-`r]%a>s&c[oG['"o.>#*6d$sLsS_*_(Y!I&p%JHU;!^9TlfQS5Apf&hQK4ump;mB^i'.O._!inH,\HG6ur'$-k>gq-6>,[HDPLqKOJ0Q`-1nl^!19@7o_2@>G5\+;+T"aT3Z=+b3#<&mY`+QmUd_MEU#Zn./l7X[p1WK0.Xu%9@]72IV@EC3r/!=D?.8;6f%G?9g@"G$R'iXD1!Lig&K&RhDl"7i'5=;E.dbCU)kCmDY/.2>=TWGL.YQ.*C`R9E#X=-PmNu3fF5AN,5oVT*UZZdon.c1O6'H$PBgO:_UXKMI]-O=Y?q!<^NZU:YZXmb@8,FY[c]@HXQ8_8e]krkEJ2a5&Hd[drd(g]H^?2Of5!P.$=rEWkBD1<'na1]4'AHNUh4qOE*JDM"RC^:l0;27[?58fb.41Z6>(Q%I'.WNiTqGUh/2ek;i/ccCX2o,&'b)r@Bi&j?=8s5j+]A\AZ(;O3!B@049CN?6K+."\-=H&C0K6Re\SBs(#hkD/N1dS>n"QoWQKX*K%>#4G[t0WsYiUNCCXGFbF=hKTUN6NfHnJT*m?0RM!beT8!k+V:,lHkie%T8$n&&S7"`oNZj[X+jqQ&d2=oQW'fX@K[W.'&4qGu=gACdg>_8]o6b_0ZhTFGrjoUAI(ZsL#Tnq)9C=JQ=;$megFCtTh7TJ,k,,@'"5RtK&1J;A73C:;qJ5EL#9rd-8`:k=%D\4Ghc5Lr.U"iE.qap)@fSp$SbfW3M'?d'=R^\u(Et?l-+`=c^3-MS4HiG\$="tE>+b.9-Ek[c.F$3^C@WtT2Zd]H`VE1/9q4\)rUH'SGL^NbEcNfIAE.e0b2g'-AVhk);X#ElZr=su4\`tXYm1kcV/1s!Mm!D\lH<<@afS-)_s/oNSAb%rDU6Ipm^B4Y<0f0IqZX>E.(cD_\Hqc*>]R'%42"7:CieQ?P;UFF@0FlL"^mWGY`>P3`=",1c$mR!l?Kp9Zq\Yd@?NK[N+Hbhn*JcV6.Sq9$)9?7h$M=b>q!J*_(Y.[R\3a%hL62T;nrfL0]1;YmS745J'Ls+Ra@.WLs*KrZKm3^u_,r/@$#'*o]:/;0*fe))(3FmA&iHQ>WkOVH7Cd/Ip9!M40CR>ii:OVVD^09#[W(>8fKs%m4TSmJ~>endstream +Gau0ED/\/e&H88.EM!GJX(AufDEePDS?<`u`f6Mu!t5m&7,)H%;'Vp5q=csK032W,g5bN_;5V=ILC+N*.'Q(r66V[`VhiTlA&Hndu,P'>":1V;XIfkb$d,.):5gYa7P#4ZWp_E/CLP@FNkX"lueAaRC_cWpN-t6RcWd'2h='<*6YSt&@e1,lf/'MQ8WpB"%QH_:!enD6cP4%((k)Wk@P!J,#9%.0ah[EBae'4W8W8bJo6XsoW`*j(22:;e\*\NSmtN3"1b!K\BU<09f1o7#rEsesTOequ?,kcI)M5JqYd/GXV=jBmYW9olR+'Kp>3DK!B<15n:Bn<#q)HKmbDGa=NZt;!h0s.P0Bg9LT2;Q_/5J[&OqAYTN,48uZknD=G%IXOh0/f1I,Y]Fl6(([+':N`JVKJBOnp29l1_9Ri-$:2Jc?`TpikNZ[;FIosnD4BB[&=U=,U)L%0=:obp^La?)GOj0U.g:?ET=c/g\+]*#g&%3Dq**"QCtWY!D5!SA@#HYP),@mD@(($^YB;T*l`jtaXSCn5$!#nD%7E:0OB'UCj[*h+7c.s/-d!7diPq[FA>]2>6eHZMJeFZiZU7QVjI#&g%7EC1jgh;neA2V8DJ$&,S$%2EN:#TH:?;dB%sN\/AGt5dW3_*D(b7j(7&ZuAsLF2>3\o]p[(?fS"B!ad/LcTirlX)A(=W>D0t+#YU;:Dn>TU,^=-3"VeQ5O9Oe*qM?Uo&$Fe3BlA,3]96Ub>aQ<8l>lN0*7U4QrSB88[9=U9j'>+k_bVfU/fG"mOGrpNaaej9\3a^`:oLp5]eRN[Dc,ibtfjT6rF-"O%J`(^iP/B7Pmla]75"*:)5R`O&>Vu._1C"r!EY!\m0-CL--XL2D9h'\$bt1Ct+>%$(oBBtL,D@bNn5D0kgq:7H`e4Nm%AC2ZGB1oip#_u\Dfp9q:Je_6ACk9V8!u$0hrE,K-W.$-Kas5)K1(KpRi[[:M74$Gg@W*7i^o903;'^2&5X)P0mDU(GlB@f)#YNYDXMi5QpMjqELTkLjp%^U^4;44tsZG##;.uFFQNU7SHNk:$:Tg1('fZnMD>K8o=RP`7@dKkd&R08smO5K41$i0CSkQ7]fpLoN+@4X@K`*=]'ajDts_ICVKkn&jCjQ<+M\"I)+ZoT@W$iHDMgjW_V+YF<#:U&M`!(lSQsXYlJ$[\ab#&H6Y-ML=:sN.P3Kr->u#[K7QNZ#or[?-ZI_g[1H9O5&F9g;Rt/MA"MA2iB\U8alof"9tQS%!gl+#qq1=";)q4_(mG%Kf-<^0_rD;$*9.&fuF6XNX9;$E,2LOHM];VotNLf3`/5TG./lY0Z3GkB8E^oWa"-qIjSYE4Jm;?-cB##M$-1d'//MhmDd50_GOd$HK(0.]Hhm+'G\^n)Y((&h_8;gir$R_kTG1[Ms12k:MU."g<\@O%IjVa$TV1\nCp(3L6M2la,j+fh@;+F]"k[@l7?`/<21R6aTa2C"/FQ:At?H?A[5~>endstream endobj xref 0 24 @@ -159,7 +159,7 @@ xref trailer << /ID -[] +[<9930c9d1e8a09d57d2d79395963c99a7><9930c9d1e8a09d57d2d79395963c99a7>] % ReportLab generated PDF document -- digest (opensource) /Info 15 0 R @@ -167,5 +167,5 @@ trailer /Size 24 >> startxref -6503 +6520 %%EOF diff --git a/docs/_pdf_build/build_all_docs_pdf.py b/docs/_pdf_build/build_all_docs_pdf.py index 31565ab..7bee243 100644 --- a/docs/_pdf_build/build_all_docs_pdf.py +++ b/docs/_pdf_build/build_all_docs_pdf.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Build docs/.pdf for every docs/*.md (top-level only, not _pdf_build/).""" +"""Build docs/**/*.pdf for every docs/**/*.md (recursive; skips _pdf_build/).""" from __future__ import annotations @@ -25,21 +25,43 @@ SUBTITLE = { "20260610_SERVICES.md": "Exposed services catalog — URLs, APIs, validation — 2026-06-10", } +SUBTITLE_BY_REL = { + "specs/20100611_3_url_shortener.md": "URL shortener service — SPEC (post-alpha, s.f0xx.org)", + "DRs/20100611_3_url_shortener.md": "URL shortener service — design review", +} + + +def iter_markdown_files() -> list[Path]: + out: list[Path] = [] + for md in sorted(DOCS.rglob("*.md")): + if "_pdf_build" in md.parts or "drafts" in md.parts: + continue + out.append(md) + return out + + +def rel_label(md: Path) -> str: + try: + return str(md.relative_to(DOCS)) + except ValueError: + return md.name + def main() -> int: - md_files = sorted(DOCS.glob("*.md")) + md_files = iter_markdown_files() if not md_files: print("No markdown files in docs/", file=sys.stderr) return 1 ok = 0 for md in md_files: out = md.with_suffix(".pdf") - subtitle = SUBTITLE.get(md.name, f"From {md.name}") + rel = rel_label(md) + subtitle = SUBTITLE_BY_REL.get(rel, SUBTITLE.get(md.name, f"From {rel}")) try: build_pdf_from_markdown(md, out, doc_subtitle=subtitle) ok += 1 except Exception as e: - print(f"FAIL {md.name}: {e}", file=sys.stderr) + print(f"FAIL {rel_label(md)}: {e}", file=sys.stderr) print(f"Built {ok}/{len(md_files)} PDFs under docs/") return 0 if ok == len(md_files) else 1 diff --git a/docs/_pdf_build/git_flow_diagram_hotfix.png b/docs/_pdf_build/git_flow_diagram_hotfix.png index 0a12bdb0f98c5dc6250dfb19a225466ef677bb23..d5f9aea80e1cbd925b5fd97c33de95c1bfdefe10 100644 GIT binary patch literal 116633 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%0ATka-J{de#PjTrc0NcbaGRwo?TSx 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 p|NBY+KmX@Zb5`J}LxYG2NJ+yvq%?<+ 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%0DP=?X_EpN0yo7SUnH}kse=qUA-`TYJc3(v#kWT zO7xX3FlpR;_^B(ovNFb$o78`E@cH<4%WtsXaFve2k)%As28;QJN|-88+-U3M#XX3}Mv22GK_oguOo zPb$+JgQyO$wxQa6T~jXhl5yeoE0%YX`t!8az zhc0g7ulUUT!D`Iew{j#ojCoDIK<4+7hF^1HOxD1xqyMKzd5qQVA0oMd8FF{#5_6B5 zfpRccA^GK$Xy*h2%?LHG&*V>Q&R|Yv5)DhcKUJvgt+W`w<&nM>yWZFcP20XZtD#de zcUPDmyJk0iQDMwSsHT@%ZRTaA=^|4$Pm$FkuNafG<(YiB9mvKa!3AR&%>Shb*8LHk zLmJ8smsBCe@$4RMEi?rhobc;qGd!K`j-|_c{glI1OaGbGO`*beMr_luK zXeXaTPC8m{_ex>`+xi|Qt0>{+6YSj06ecxx`!R~p_Y%>Cxh zIFndCHvfK-)ALE3f%A0uLYejOK99!`Y89Ze>llx~VkWGw^4+;eedE9V2%1z?D;(LW^SeFNQLd>$Q#;tb6q)Y}t#)=_;RV}E(# zpvl$fiTGEo5nDb6W44Nq-t{PPSWwC+IcVHy53N;9#cEBc z%{-vgR@K1j<;o~1zwje>1-d65QKJU;IilfY_@^g*ntMNfl|M$5o)?^6Kla(37RBHh z5dwCJ`9A$3hyTmeKkjAe=5XnlsN3g3?AcC`pA=_*^b7aM2PY}*m(F|7gJz6)$mt)r zvd0_7&WT;Z-&AHVUaQc7?LibbdVT&3)N{gp1T@MaKJL_>fkx?TYl}`F!>g%XyF=+3 zeuxpaGyg@-Cs^|>Lj(mYi}nPq>k|}*^cVI@VH}v4og>O``w?jGIh2;|yNX11{xVIP zv9H3u#dzhyXCD|~^i7VFvI+pbxt2VAB;c58PbGtfPU^Cf1xKvxo0xi z%A3>R_7LQ^JSamXKK4A(r3tUSBujL<>YK6yEwFD1JiZp_zi11!$h>Ek`T0G|9jXH^ zm+pCVs^F$KmD%y);D59{36>&6M#E*IbNKY@1;{^?^$V9XFC`zEYIr%8_9>oc$nKr& zQ!4yl(S;?*y$rl(bgr<;I?LV0>regU@8{z&SkaNRwa!gMYUHSYeqz&GxvmDmlD~F3 zZpR!Ufjl$`A4dB-LcbM*acP6vdF{aO`BC3D-ZpZgjLPV|NY@nZ+@6!xxOxw6xj_?f z&BDCTx#)g3p~MKyi$%0iR0O|xvr2$#7XKR2M7%g$d|~E_mR;P0j}{c6fR>@xf(0Kl zhZwzU4%$c{iQ59lW0PO=)zs}vNTT~0okjImS)?3i;plz*lbSZ=aNE zB@v0I8*d@o;Ga-P5aSCG*U%kaLL!+b@KZuoFezTPrUE*d( zVg8C|%G7)jYllMS;nVL+eMdrctnV)z8j>*4us-a8eqp@gg7km-%9HVK1{z74QvaQu zlR?J589zf{C7No}ZcN$jG)fz`Lb!Hq~x4%41^l{t%KzrVn*^un)?}J|4W- z!ER_pSKWdfc(1g^_nCdSaG^#V+?i?ME!PM8!Fz9D+*eZk? znsK?}0x}B0s}5^|UV4f_(1LYdrY~aLh+Y-O!KNRLG^zTPnP=e#VjU09qAw=jzE}qz z(3yU3=dH6YuURoT05*F8PH*PzD?kR*javkWU}9je|2M>2^u>nv=+GqH2g z`y)qg`xx~FMw^`R59&57Gys3VrKkl(F7ovV*|)I3&TwNE3>&lTu>{o+b=lw;f4vNm zH<@9^A7S0|qmp`MQdDE#Rk^PRrWKBo&(b@qvs%FI(C>_i%41cxT4bI6xU#?G9z$RI zF(iM!g)aB|!@h^w)0u|vu`!A{yu%Ej%4y{gfWorlC}u+&*peS=ZxmKLknrf z$0mx;GIb)~3haSS^k#=N=X$2U6kGRdvwasDITGzaClj{;A3#Xg@g&y_#qJ1DPT$%Q zGqe;TkgY652={}VKYhh+E;z&QQ;ZIO?-PB~E9=ph$O-QmuyeWu!;T`SV#s*a_--kq zen3PmPPnF4##vU|_G>-ebQqy&CB%`gQ_u447C#ymp=V}`wKB!St!R+#CDC}$$+1!R zwwt>rA6Ov7RV-?z`W+hD2`Zco*wbG7=Ltlb$5425rEUgnu{cxZG{*owf6$J9@D7gggR4Elr8*x@v#R(9zO?CR~88}c~}52W>H>sBYSUtB;jF1S$oZnh#>UO zn{B&)-h(g~5v2wfp~<*f+@Z~K#RU+70z@n#T98)+-)I*F=h>B8c`xpie$h#A1tFCj zBu7tFk%R=n|1TSGd>dBO7d6>tv%~$a{Na2?#htTWB4_j`>Qboa=_SH_Rh~bhfE%4R z!wp>iX|UFBlosfr6!zAh@MZ*h_L(13TuNC*b8xD5YGE13R*McqNP^^V-xxNmgWwAG zzX?WDh49_yU~UrDSgSQc<<(si6k4xWia>9dMVGGD^wlb|wv#Fy=~CIqE%vNaFHnvy z8GC^>r3%!fWm6oG_cS%d3POkX^ptz$X?&pi28z85*?TArl+ZU$=2v8SvHS)dL_sD5 z`U3H211W&?|%D@-1ZT5qHZ{${hx2^b793Ct)!3eDxOGi9|m{@*a**!EE zz+1!T$bUT#2`VE)S)I@idAwh=jXU+9O1H&~H0&d5My7{)pI$nYs)~Py2F`2! zD_Bunpjzz4?E}Z0%e6XOI{MBoy7`OrcO23Q>O;{Ai#LT2Jup4a3eYc^7pB%d<*+I= zP>Z1J-S;>CgaSY=R@|%=!~bR=+$0t)O5%hU&oBGHSfR4T3+FU zrfN$2-V@%D3gGfrqHYgm2FDQ4nEU9E>)9GM2()i(hHmW&*(B|(v=+`o1$_fYMyfYh zV^`Ex`Qv{%=-$1GsgfZW&{jj5bx)kM5)wHd>z6sa!+mO4sMwZ1Nx5x(H0RrP$zAxo;lM}vt&)z|F zEh(!(99*7N&sOx64Le?2)hXXww>}ySknIF94pIGhleYJ)vCb;mP5^zJsX#b)E!_p+ z0;|~>lN11_a%|z zWBwo^p<`1bvCs6Y_F@>Gzpvm7=2(iK$}WXd4)}+>a?tM3*WGFE5F?fKMhsHll3_N62dnMe;8E4IjR4 zPubpjy}Vux>Fq-&mqVvW(| zN}C<4=Ul>PUme#xYxOjMhnJgN?T?wmrD}JfKznxV$?a4bCrtb_o!BmmsbOM{-?VEAcsz zphQ_XtsAXa$3^4U(EOhZc{_c0UEX5Fywm+Vru~_pYwWt~d+!Zlmf8M#J$n|Dtuvbr zB|$lM5z|Kti55eLL!Le!x4#>{tPvAqe$xcOj%U$X-w>J}C$KZ|{qYZql1~HT61mg@ zB_)bEQVLsWvMu6aiKd_`VVaG^pywX&0(&}PffTCY^Im(&3Z^rEU8>71u=XDgYP-!9 zjN)H}`d;)8fkrusy`>IQ0vz9dBAkzBF6#@!>Pk1d4#kj7; zqX6A9k%G!`sFqcrg`eVGz6xIv3xRLHh_@8vM|ehQIpvuO7cw8$fWGjzSQj=tVvo#f zyOaREcC+p#oO6$J!fB7ICXu!u@6bSVlPFBTD^iU&$MnfJ>dfFUiWT7+9!lECExa6` z*XwzT3VstKX6tsO!Y%GOL5heVvu(@q5O^w_Vm1PrE`a?+iNT z_*HMyuf@#~Ou_}T3Rnfz#Pmnzr(4t9cYI&Ia<9>4d)Hwf_4;GfHd#(fgY)+GuKDBD zvG%%=1C)jS{b(-h4{558kZ_Bdsw%t~wIN& z$uUFSu?2?ZOrQ4Vw4&ri?vjS)_b;vmB(Z))5E?Wj*Km2lbBjl-=@AE_A$)|m++z?v zu)ZJKso}L$y?aZLw$6OU*RPE9qdOEg!?8cpSIv6 z1@dd1kM-c}YfHP{iY?W}mvDY~6L3F7E3ghyE@fjU+A-4Gii8i@*_7;U&`pWd7C&#~ z_sx%TTg8JXF)v-LGk4pTdR_J?6;)AUn9ScqF|v1iK|pQug2W6QU$7bay9tNfSl89A zIr7Jbv<|YmXA?i(>L7UtU5vwPGKo7LhtxyBSlM$0FOPOtAwegQ-fEQl>o;lzrwarU zbP!xm@Xq~pS9x1=81>cF6{QdeuT^R$$kW~RE_i%s6J*ql+0kqVe&g=5B(W{XwR%B4 zHFRA=*1B+fPzr>N2^{H@SO-eUt_DgU!;Qs%y7YQaN?{JE7K}NuG%Gdn`|(xC13kPx zJ|mlUT;&6Qy?5@THG|Xat=9%>eFfU{-1GiZ!u<_IO04rDz(GKJ-X%QL5!#STBB z$%+n&BnoT!;+9r&*i}gWJv*zj#hRqdLXGu8!XG@qoT?}cwO-V-n&n#F{VaHluBfhy zfpc-h3>PqCpu1rm6Qer7(X#P|r$T%3c z{M&)Z$6u&=XypyO=kJMLC+<_irO(epK;waM19@F>@%qyhr|*BBv- z=pWqLZT%{l2yP!eJMe!>FZMUhsHhN8Lr?KTG8+0A{(6D4Tf*&OFeLeqX>s` z3XCjn?M`oJSX3B142CZZqdpP^wcM@dzrxJref)M<(rQnHa`v^NlwA)I2=xpmq(n8l zrkcupv2@7pQ*1n(7~kk!hUoPSj#r!Z|1#!%gXhB0g#}6y-?SW1Q6{2iN-(Q+gUm)x zv_#tmWByU0L#o2nZU3{@F%zdI=}$1i8vFk7Ke6|gVR3BTf^atwAUGtryF-GzyCp$` zTX1)WPVnFkA-KD{2Z!M99^Boha&peO@11AvGxPob`q%F2>Z-Mu?!A{;cbr*aCJlnr z;TT*QQBwJdVpk-|d`bPfL45^6YiBbDPJ!TptI%qu`x8XFkl&6_&X}>WQ_?6Ck-PbW z&7Io?9UWD-^z6z;4v(3<DH6T^jo@Sf$5~n#skosaQsBi?w#4bH{WsY`%Pk+$0Sg8gHkX4G=yHd5PVNFtNkM^-o8$PSb_N zKUB;<=muXOuiR-}Mn&&^dv!mE(wh3TJT8rD+Ta)P0MenG++3v z!Q-Q|&g?_D_Piejo$7T{TAb77NN_LPJB+8NZvF$}u?TgH6fV0C}a&zzoRh0s2aI(TiF`gB+keP&2qS^JB3U|ID_ozG?y@&OU- zX{$VN6CvFjvRteF&Qo)x+{{C|$A^NhQ{z`Sdf?E`J#K&LZI{t%1U_mlkr#6N;;BIA zc8yP=z-C|pZW5ZrcWCc4RSIJDsat;o!!NNe-23UV2`pK6QctIb)MoAIB_vk?FEuuw^mTyy0r-$|eBfRJ{}y$QG+#H%FrE(Z1+@UCz5+jp+~ z15%$yLYI=a2ib?i#8F*E)mv*-U`fQ`M|&I;KR@*(O-%M%7DH`@!zK-{Bdseu>Nh2d$`az+XRceYIaxM=(eY8vqz`o4uj~Z z<{eUn6ef3r#A>w4A*1T+qY}Dh%^GV3{mI6m0ez?T+#$e24goyo^3j}Isw8zkb`y0E z?8Mk{d8sJs3ky1Ev`(~Cev!d#A~&e?Sv|+qEt2?Azf<|vtQd3b-SJIdtLY~h_c+U7 zr26zNyoTOVQB-S83bxb{oUqVYQC00vrl@54ar>gkrh3B|*u+K>%fZs754z1IBH^As z+B*~YAUoaCm-#H5hN7ytl}y}G(oaF^H6lsxgeyG19)DTPBh1+!!cd$!>YVo)*m#Qw z)k*!cQ5aZx7X%;XQCdJX&*OjMNseTr+D-|Y9i!&CmQ&*C1!4{CGKH#z&AC(sEEzxy zIQzj7i1zWrJ#$`xtx+gBPcLtjwoM4(S{eIsOLgaq5G2DQxT-t1yXJCVrET(96>?80 zJD9I5XL|W)ozIoy^2WjupY+HQ`$V3Gx~|>avpZXQQez);37!^xiT1-qPEi|cs1%Pt z(rnz=LWD~zi>ct)VEyEo%l9;@L@puDq%y8O&}3uuu)RBNV;>UEfyuv5kcJ@{T(!J3 zzl~_*JiYL0gpODDe9cp+aRhN<1^BBr~XNS23t02dedaTF+L&|E{Vu28uyy zEWUJjCD?y>_%+_ax8kOg{c`|Uhh`DF|C<&jJDJUO%Km;?EI0)@7&ey3)^3Kw{sUK; zNa{)s>Y=%6aeS;LHzFyZR}s5e5r)#W)$UYEHN2%OEuZ}qY*0d|_S>`%?)JiFy&s>G zPqsAcc94Qobd{my!p5y`AN)u2IIo^#N54{Tbj4|Mn*U%jRt5*5Oc;A{x%68kW81h2 zpK#7X)-AKnRGEBuDC~z3I*y|$Wt_<3N02m?%3p#L7WHA=3_1g=pz@km*~qoBYAUjX zb4OOt$rNK8h9ETrkY!yzt{-L=52i>s>=Okh-wbYcNc7&*zjrBb&KjKi(x>mk@Q`*- zG~zcyxiW{0`G)M;|t z)PVB5EzfK*G9iDl!Q-j(^7MV$z?T`ygbzLmH}@vQ+Nm!2#7C(f-s`&Th9(2&k?))x zW%rxgK+V;rp)BxuJFgKG;~gE}qCsltdsosF;n$+;ZZzq?-|6WNpC#(Ijojx6(7yOV z>5#SLQ#P`&+a~XNpQi0ITiS7!C>$d2WN?z7q;_)=fwNzL^brr9?+yPN4=biN^#2t5 zb0@cj3&WAz#nit&K+&$XH0#M|)I6{oD0(rMXP(JxNxks&KKbKt67UfupoeC%aA3GL-BAy?-%(}K*i(8-V5 zlrqjkn9NQqt>krn176h6Qx|1PtR^UUT_cQ*Yfn$tZ8I}7`#q0)CiC7Y*{1Ti3J7m0EVmtC9LaX*>lPCKO*A5|)>y#vs=5u#umJ=)aPVOT0 z$YIngd^Rm&_|wMtv*Oy???trO+2_zL{DJpy2;NI+1jF3dzB*R500_2tNw{0z?q@)!U6{V#)*t6V2g#IYtfD5JtnjylB zj#l`id#Q~JI{gpA5<8%(mWKPeeBXc|;g+&zd&ksKdH9w+YheL{_o&YMCS+*dNu1q? z@ThG~=Uo^xCsYA|qv|YcybjRK4ZcBRzNMr|rjQR=zSb8)R*dPy#OF>GG@|xwX*14q z!k{mgo$1F_y!U#7?{2h>jJKb-uj%*CUmcq#2I)u5U`kb!RU1lPNox*aB3+*ocqi5U zq^e=AVts2&BX(tA3wBl@pZWN_>yrDut`UX54%(=JD#s&nc*SiM4ITYMnk@)_+-1QV zuWLoU#_!wu2uK>*^j2D|MIX90`!Imt$Ml|J>~ZObgeBm#?<*1=4%xT=Hc0lYg_A&l zjfF{$^0Hd?jf$pyrR+}+7pTe({0xT}Ep1vL5__U2Goa;|f!4j3fcNPzcmf+XH0<;B zsKa#pW3K|1XRO!SjR|O7G8m_6bSiF~v7IWT^jDYKUq5-QxiUf2H@y7%mgQZ9z5GuD zwDe58DZhn*2FwYJEL@;?Q=H*nM>Ue7gCAQ`k@>R(q2u5^V4K44) z*TfjKXzlN%$q$twh2&&parm&FH>W=~FMLo4Cx%{s1nb-^DV>&KJt>U}?q)*ms$#DC zuL$0o%C!A7l}rH6>g>Vji5zQ3X0KAK>iA3w^J|pVGUrHvxYBk`HU=2Z-t13eV%Y{7 zdL5ysh{l#yrV>L@zT3srql;{_3)Dh_mN&Df-+v~!Q+ii#KbqNujiV9@ID4jzP)W9Q zyNZ@>ZUyJt3FB-JxakE2^`#)6_mn4|wyRJvkvD#Ud-yy@kn2>Xx6KChydxu1eEC=N zyZ?Xif5k>HFHpg+WKHXlTeD?oN(F69K5J;|MdZC1S7lR}psUzq1RtN4b_ctD^KKM} zcQzV&lx)r8O;(XC3E8!M$nvxMNl!|CAW+G!EiN_|D0uiv@cDK`TN@E*y**V^Tl@Qm z%ZrP}a(&+-3(`Gm0uRwi#0MTA=H8mo%F62Dgskp|t0>R~T}+Iwf;0L{-Yf$`jb4Def!u)khx|?kb!_&c|J(yGDE*)DUKcR_`?^>*#@`pS ztC!0i@c#KPyJ0iw->_vX0AO1Ood*2Q6bMrO^4CCWXqG!{5n%%vc;~;l7g6SJuCC>m z0e@eQ`u27?Qd7T~^e-~R>HRfOWE@78KMMHskQ%P5fJNm0{*eE8n%x0%1OA`6#BH45 z+Y|o*wXhq2pYzZ7U-%1i{=kp=_x%9;*MCr&tpULQ&l|U9-9?Xl|F^l+{GQ7nFrv)u zezE=YaJpXC|HIAy1#{Fu1%R=?-#BHk|1Y#t>p#slt^eva2;??U{uwBTmvC+h{5=ja zwCP*=n`8u>mDi0?HvN6aT`B1+drOB$+a3CUxoji)*tr24;b) z{}KqGg{?XG->?7eVWj?<&+q{>0<}?!rWDzbo zFIb5NAnhi61q94J?4Lhf59&TuE;uI-$4)0p61io!eFX$*k8rCh6u=?e2J(k%3=9nG zw#O^_(p@*&NmU5@eiQRWHo)`g8^0EI${!XQ*mlu!~=-RM52IMB@Dx?hL0^L;` zlm6zUvAEx9$c>Lz3n{;F-ea{i?3XqXxvqj|;v|6iI(`2mU1M>Myik&6Bhpe*^?Q@% z0F*xy^1H`wpI%IPK*ts`_dsGP2Af!#^UGSyT@^F*7TRS7Mb$*H=D; z=Q5o4$kqwSLlRT#_*)sMCB()~zV(N&>`}3>j8BOJYDt?AkgVU7(@sf9nDKl0Di-!T zP(bzO#x=Z=lq^#diaLPGWg=vm9iUv^yR_D*ZnUN5o-q9D%Nbqh`txC4-!EVG_V=~5 z(W5MG?(YE>BinoNTNZP%Pji9VtiLPjhA{-}Z_?Q zrfx_EEH>!3&AAK%8sy~e`vP_pV9g!p2|(-?n4QosiT_vtmEGEso?T&7)CeH6_R8>s z*rQ*{#9tO{9jG^(grQw3H+QSnb{AK)Pr2vu2MjuNV&avUC=S5BrlzL8ef#!N1^dJE z-)bXxc6Jtcl)I~|7U>#IvVo!D3*j9gdF>ARkB*i3UC1_>#Ym>t&ur=J_|I zQ4{Z9#S;-o|_44IQys%s!AYblp4D8wU61vEx^4;3c<(8Bj0{jh>HuoMo z1}60C?+LlxtOd5TwAeJ2Bros*^V-?j;XQ7izyxlA`}-Djn6-*tA|PdUe?GtgcpwD@ zMSVU~=2QD0HO=t~2+svXsWH6$7I^ww(@~O{DRIZnw|~|SVS#~?ii(Qcw3C38kNLCc z{1XcRC>dvkM2SMc9{y%Vkq;j}JUuff2Ls;y^jKh9_!&+&Pk z4*jodL+dU)BB@ zT3dT*2w2c)b)qN}=D)yW7uxY7X`h+G1ojnCK&69(gan`KB^QP3rn)8P0$9+;18^yKvP6`&OsjH~7>YYltDk#XLT(9i(o>ngtE zMx6G{)j~TvcpI0cl7Z+`Q6z20k?Cdp3nATubs63!)j<~)@xnCuXMdG zr+@+uD{nL6N#K29k@0|v&L?Y~4fEt{T1;D}K=f3+zn337#;R&+Y8o2uM~mF3e|d8W|Au-fPP|}s$O1?%Pk&l&rcpkj+GKw4acqbM-AIV zYBSh6a?Blx8&=Y6;WCT;v1ty&vHU8Yh7*M?=Uw z)<+ZqXD3WCFB{)C_y7u$eW{H-@(z-`Y3T{hJt!ekT^H=#<03-blP- z6O#}AY{IEzBGujsy%KjgZ}L~hq7dYDROV>phJ!YztnGU43t~7h`eCY`6R8VvDeuGz?Nx5f-hA zV-TtkEy8l_tHie%yKufx@u$#SzOWR{xmG>M|yMA z*B>yNkKH*q>8OB;o-(B84QIhV#ga@-{8z=Mnz0%D&)`G;Qfs#+0>hM%PI=&q8zwg=tN^jg6N9Sq18*d;)Kz}>f~ zaW|V#Xf0G1T)PFUuPUstJ#1FPDCLopPv*i;kvvfaqjxH{R6Jy{`s%2f_FTwtICH9U zYUkm#jj(lmjnEyP=#9;IoaP#RUujS74v=gpt^Z|=cTBZ$!YuHOV6l2aaq`0=iZsnz-5}^_-SU1?R*+XcP;4R zMBM0`o^QkY?;6~Bl#OiU7fBdtw5kcB8_uhKG*_&3ekyy(U!rg4oORmWOLf~X`*k9| z%%7WcXqSuvpUpu~PWRTNfoz|BHJUh4tR?cU9}h7E)|!n_79xkSz87xj01aV_p+M05qB^O>9k65Bo`c<3n7Xe7*O`N>!MJbX(> z37Tb|+8>v%3>N@}4{Tzz#dUO+0fPpHfq@Z|kN}h&StG3{P%UG7I0bt3`1l#1`TW$@ zqL5`vgLP_tVL1(FIvzTYPs%~T+Zpar%c#%D9*jDJN*IE7=?-KXKJBTj9=O?bpeT3w zRX-ZUYNIB(${G>tc=mQU8?n7#)(0w>y2^d+!)St}qi9DE8zZl*k{>XAn5qn^2{ASO zzwT$hg{RObujRj`^_jVS`Hi%(2dhKX5O%ZBxLB*2)uM?c+@dWH8xjdB5k+8C`$#g! zCZv~$V&JhNFMmP_woI0uf8)VjEU^{5rq5$#8&vW#7a_#5q>@cE_9rCwTxo!!FNB4( zU;pU~(@(u9zpvwTQb2{QY^H%ZWn0cKO=g69s@rO)r>{h)aaK!MRd|2q4Iw3eUOY2SHP+u`GH6Wv?GbQ0aMDOqc>C#OzaD z`8%nuCVCXA1s%hvT-cE1n^6(>dl;yBRD28)QzU&%CzOvvpdS}_H!yU`p3tMWOK;ir zZx7@G-)g$CEu!VWgnxKGSn^Shxn2@{qBeIhVx(Z4EO$IJWb7AU)IUU1Lk|$7nHHVa zs8sE4a-G3+$#Mk-5aY-9V67_lbm$GmZVmAsCmEeqvT`tdm2XrW7+y`jQbL_ znbO~}SdXvoFKcTqG(8K`b!h8NbeG6V!!&IJ3F{En|~pj9mTpN)FE*0k*w=y$}BK;**E9= zXx4GilkvbwqG2Q?98XoD7kKgBXc^M{d?OlRriQA=V>QjZPcYUQuhHIvOna(6a*euF z&_IHDu!5mmWum|FH@>{`sZ1Ee%GzFoxu>*ZXQBJN8H~Ubu+6>{SIx6+jLA$aq$WE36 z(_DxJaN6{r(oY46NK{WY+fp;U$m(oXr|xDD?|IEbe;uj$v|uKfBd#2O^)a-#__~66XDJ)99W^^$(>8>fT$&KBVkhir zwkuojSXm2w)d@F6FHyT^I+9bmjU|EWea{lBQGnpEe6FHsqM#=EZh*~lv4!K)9meiJ zv-^WX!N$&eUz7eoxVJ@R`e6zYJ*ov^_2r7a! zKfqe-IzaMHJ4@N>UfA2f4Wlnrq7d=X7$vJ$8CM*!q9dP807aF6{ZQoB!WLj732YGR z+cX`O%Bvx$e03z7Q!zR7)b{sT;_&5mNeV5dS(Ds){L`~-cK*^`dDP%fi-BE?BiAN4 zDHwD9&o4=_+WW6PR&mswJ{P;HKYZPWQ;KBmzb`O5+~pw z_^hN^fhZ*4i=4}R(NNQKJD|7w@JOKi7l!JU!6fvmwO2dgPnOU^po^*_b;Wv=vyP1m zw)Rp%rfGpw&u6J-G0gZ!XF?cc$hCq?2fr))O1U%P)8e@qH>A6Q<#AsPS%h^*gattt zc9JOF(FAeP_no{TGBdFkyJcgBpyaNhU()^z6bq`}(u)_GxzJ!g^D4IKQI+*qe|tT;>8vd!0EZr2A!+mFtJy|K$jjZCTs}c4`f+D z8!P|4vWFw~L~F;^_57f%eR%w9@pUMt00}4(HI;%K#EPu|Hwn^Up1n_tU}Q`g5B*Zz zuqQln$7)Ctl7gJB0%I9p!6`@G`*RU<+%~J{x}?4PsZJ!e^CIwPID|o(FX!=e^MK3#>XE!KMqgPn6V{S$NH$XIg@?Tb2QL!sT_&8Q#Y{oXYQUx-Jev=DH z=$3^x#@t0J5RovHS+L`5#(_r*K8?Vqf?4&+bF&S00iMb@zQbAtTC80IqxO%~RRa?B zE#0s|DPBopIYiF*PNDNCxU0L(t14=ta_uGWsb=prEu>-O+Lk`vKhQ;(`dogrI6YO7 z#p*FGej15PjFKmS8g+k(#w^p>ZcgmIdxwwO^5F|un0+1JH59G|s|Ep0gmk`5R!j|# z3Tk|a1X@I5Suayl%){gU_o6R<%6u1F9oS&XNJ-sn1HPs$plBPg!UxV=To&yD+cY;> z3BLb=7AJNtlew+AoMj5q&VW+v^dg_ zD(*QCFT{x%6nrhc@C8gGa_8OYeElfkH5O(xxWZq3rB1uhwTxY?%cYbSht5ll{55}! zFuy6Q%!gbKlkcgZom>R(jPro`0wYP}#@aAqQq&pRo|x1AwS=Pu*wyKjzv!u+^QQGR zNSn-=(7IpBt(5H8j7ySZvV7uY(DIeBSizfoq@JDDr?*5G8jf$nuIgj17!Q_dlqwNhT-gVigHkD%nuh*`Cl7tztmE$gn(th_HWHt=O}Nq>Aj z4imfU>>&Z7id*jL-=ik}oe$JiM6}iP`C-W9kXk2N6}_LiPjy6l{8@|+a}sYTs?{SK zvjrZ7Q}TJ^>7?zz<6*k|1Kw^4r8);a!-nt5p~s-2&V|G~Su50&as8s4t+^UW#Cww| z59WP=Pic!Dk4Id>M;mPW3%)(j74%4q$%BU{&9S-_c6F+S`+9bnZ$^T`V?bEcu%eum zNg`r(K@Qu)UI4j)0}F?3_qRLoK|AKs($c^YkaN?LL4|1zxbg;nV<<65=yVviUXEpT z>LCB7q{*fp%><{sVl@GuIgu|-HJ0NdR1oHxGYj z2MUeqB5ank#5WWl;LtCmnR(E*E~pEq<7WG@ z(eGv_%Qf{U=Ptw6r}wa-HU%=Yuey#AP}S*Deb5c|Gq6Su4w<`c_yG_0HR{gZ9t2{2 z!_yvmF3edPq;s#|`q(8~laTIn;56jrv-6=)vrSWJC(4XPRKJyT!Zpa6{TT==c?SF! z(Dgu}J)qSXb{Yv;ql~L-y+%px!XbbG@GBcGE-N_=Na+MSX#GW3neMMG=p9Q;=awev zsyD>&N9beYBVPSh3}?33|}m>=RbWqYr6HW-WCM3T=hG?=Gd zl8Y6j%|c=kez)bKE8gWvOcZXq_`8@O$Qt19-3du`NxvW(ZfG&05m{@RI<<#!QnnNje5O|GT6_PAX zE_qTs2P!6GA}Yge?C3{4NnCDGFssoV+OaOlFdjknO^4Pyu4lPLfXMC8uZ*&5eXjgS z;&@~UDiM-Dl`b&t8sg~j)gZ{c?X0rZA-Ic&Kk(Sk+#PLwKWow>xr?3q$;jk&b8Bs; zv)a+;x^z5m64N~VTvW!T+SB1ZF`YX=xtY~1fcY*)MW3t@(d8`_x7doN=t>az#@;T6 zN+%K|;vu91&FZvk_y)x}QLNn6z7dWcUR=C`--T7(VxP1gT&RH$9B#YZOY=_Cy*aDI zp6(XZ$5F0v6LatC=nfHI&EaIw?$v=yM@LJW;_RTZG*7J7FtP~o8b!L#L~Zg2ZyUSL zYCSKkn}k@J$6oB1adZ4+-sd6l?#3XghjX<{E;zri@Z~`J{I!nhhn@4}wkshiM8Jaz zZ3~RBV%p(fWE`pMnB^Mt;f{#~%a4rg(73vzPQuP&4!ki;$5rZ1P&X?U6aL_Fa%VfdZCymcCuA_DNX}U7j zg!xEwBTI?mjB?jydcmeGB`!VKG}Mu232^*T#nGJt>;-YK=@Ek#V@zDp@a&^lzl;-? zt%WJdqju&oqLwe|UO>63z9{jvZh_%q7@sXyZTGGPw|BsLbmnrplUUR^%`tl}yA`Ow zzMHJpd(=wNzr+Z&?T$8x>3u3{t}dp`XuKh+`{~)?onPIv{GQZlvUq4*s7`F2#mZVL zi;SqW=S%0+Ln5{z_Ld0llEMCRU0H5L{YUrLS0L3GmFup!#wk*vhaX)%*S?=q!@8#} zw|p#qG3<(b^eu2w59R+fjR6{AY%-ZTT`avu)X?g?ix9o@&+YOL7&V(Gf=SjmfRlaa zoTOlGpH0e2A<>bmhY*RnUvI-ZsYNZd=!;6IdwLSDA4+59a~H4 z@_qY7*f5PXV-{}C!WH4X+0aKeR`1W?!u%e@l&vxX7!B~x@0bW$xEF~W*QxPVctMO! zczmhN+v`=Tu6{J<{t79x`I_Gm_3V)FI4xPMylWBpi)xcD@~RXoslbUXfPty;LJ)Uq*kgsXwx;-z1$gnHwY?rdVG5v;#jXX(BI_mV4 z`r@P$^}dNw>@_?Q;Ok{I8LqCa^}au>i=lpZ<>Jue2dEer5}OvLXUBl;i8ImMRM7~) z7+b3vnEJ0LXj5OYf6eb>o<5!yCL(;{r;xUMxtlQ`PgEU?x~TIFbM(yY(4*H}_jyBO ztx0Gd8TI|L9P8|P-3-(%Ol z_DL*JRXh{TIu26QwKD`Pk3HYSbc*RZ}xFa4%l;Z=L=2S*}=-W(uJZ55)ReIF~ z{%yJ#HE(=Ylc07Eb`FTevf~VOgY{2KTQVwWeN$Q3m5kifY2AG2nsMiHpLe?9kZ{|U z@c9l4ReUF*R2f5;oGRaZQazIAxfpsgu1Rm>Z)`lRF*jMXM_cq_lkuz9?UJ^y@d%>O z8e(G-J_6h_D@cP-(FOkQXbQ72Oj0)M7ej#UR6=PI-QeIibaPK5pUo1DrALX`Gv2t zn5R(AUa_cgYj+FBO%QF`chJ+@7)AktEmL9Ts^{BFgjZKn@NM{_^1NdwO84#imZ; z96PABd2O_pvf6zMZk1(sKS z1)<;_E?IF);iRWv+VGH`w@+*w5aFc$*n~e{A3zHe4C#gkHJ)BRjPh`+whcd3HRlR) z*Y}_U9*Ln1HCP=*{i{6pt005wYVlPq9RI`uxLuHA{z$mX-twM7Djr^fK2KGGNLZ&- z9FqIg1(_BfwOlU)dzG5Hy89+l!ym4!%VOzz3v<)snZAMicP}b}5q%26$AsaVc6PkW zIO<U-#OBV@Diqei=RGQck$3L z&zZ9bYU}v;K2uXzQ!|;Z@Zon|_Sx%c6uvl%>bSD_JMUMHba7N2zr?EM=y-~uB4bnE z^jP|W2jN1T*}tOXCZJ`+}INQpamNC&^IDY4udTmS4&-xfH(Nb`1DrB(gxLn}dn z_>(n?_DF=!gJD5?J8-<<1lY&>Chn{*U`BW;ru?cXu8m@`L>9FC(=3k3D#01SnmVay zmm$H{cFyT`y2yIhAWY<|uL0Vkb<#;xgUczXx7T;KzElWBQwXcTY351)GQ!?s?HS|v znW^Mg7INf;9Ln!YLR(2!x%?hKlqBD*?rCu3&@XY91(jQB@4)(PA62h&Z}I-LV;KwmarN>(<+`cB?=IV=sU+1%-y^&Em8)H{FbMyLGGqHsuX zsAenl{HB~hl>ZmHU`4&T%%r=^hVRNUul(6e#d7f0CVyJwvvGhqKntwocU8zBZoNcw z>%@vVYRRzyJI7=&d^^f`9BV9n(bZiOrdX@vjJAsx;Hyet(l%($Kp&;6u)916D>Biv zG_VM1n9xtikSu|p-plMXU?ZoK!W6`G(~Jl4Hx}S1mn8*J=nEYgXdkU794dU2`=!t; zUhn?nb;pOd`ePGL2UI!1TR=M;sFN(>N7I8QbGYwTR$iUsiW>k_=w505fq_22dzlgj zSCDb}d+>e6CE(|S-j?KLD2db=7!)f>Z@QRMPC7UVL1HJfjx%h4pgLfEjEsPwSmgEo zrJ>$8^pvBh0Q`_wMm>AE=2<)Cg)rIFrt!Z%k@2~$a!@)QT1^=Vt-!?nh!D~HY;HOmD7q&a2UF&XP^%o z@0LhW#+&5IY+Hi|5W8RL~Y@q??I^o#kFv_BkG zvO^EU`?GK>81_xl*Azf=E@xnO6nQcr;8J(TU*$jlt)MPal!whryO5oP90&C^OF zPj7Mr^lVb;$HwQZeL;(9aD-sJ0v!^e`olo#<(4fQ@}f{)dsGYeTEW7duJqiv<+7d8 z?fJT62cXoScKHRpYeg7F6hQ?^=L7Tvw!neAJcuL5LKW-K&tBp=vdxugD#)e)&_z5?1pY4}q>+In1xagr6S@sV7<6vruhjOX<{~h8u(vG6`LG`k~hg zrd~o7n(Gty)Y_CcdlJJQZk-Iji8eF04iAi)d?m2wRt$^0MzZy(ni? zs&n)}-?UR>T7BqUElenduBL~xe*PrAP;f~L*^i^>9w0v!BDy|_H{OTf>!r){Y)(yU zJ>N%Ln)QUw(L&rjqSG1fXs!#O#x$mV6p7=EX)e7spc$<{l?m!GExft7O2j68-4g#Q z)!nE$2mj`DqGumF;Oc1rlyBYH=!9>XClfF|@*XU15v|CHjoMr$;m8`XGuZLLV~nT`sf?{AdFciB2t41V=*iLKrO|oLUX)rCk(yBa9H3L_|pB3)33!dlVhn zu9usooQ*$iBxoW9nDuqs1JcK(w;HNyr|XFOTApx`<1~%6(=KC8izdb4ad*$7e;L6e zgjIJ=Y3?sM;lo-z7gt#AE1l<1yQawWNxhR9>3hE$4eEGN%*2Wys zLi0`RKt~t!@$On__CTP965n=6N#AIUW4A#Un-+)$6q>qjp)h^@m>`maYxkj*3ccYS zcF=UCAH2A`d!r2JNIH6KftR+G$@j$P8!U%8^Y$FjFG^D&p!U_T98q-eYOMVC=Zo;G zujpDM=-RlTLnupmEZT+q*P~`^=sbil{*I?OVv_VV35? zr<;1flHJF1%r|Lis;J~hEm2*%DqG2x+zpSnsI>QCg)>-Syl|LXNRBQPcrpcI&$i7Y zezkd_oNczIMrvghnZZHWr3=ruWg=9)s$Gts3bXD}q($JEHs0e3ca;P+DTe=kp;!oq;m*3!%KNsuaG559|HIWV79ZRox|X z1v~m*L8tOairQe}t7X&A>*H|fke7#yw9Yvmq+`41cWD7QQx^bEgsui z^8(0i?m6IjKt1Mgi>TdtH!icvw#=|}l~a@Fnc+&jnX+&Zss_RZBQ-Z>X0YdxAQ z!5++MK#dWAo3&%#8s08{UZSNp@w4HnBo_Gsz*KRi8!4sdFlJBls{wMUxi_Y|4x?(5 zk2T~0lTIV~>Szi3EsqB)dGz^}tZ4Hlgr(W0cxKwXF3TPfBLDKoFLKGvsJo{Ku>reJ z$pU0m@IpC=Lq;CfuCZgkP|if2`b;YLtBmX1*tG5Ex(t>UUKtn z@0;;XQVJue{90{xfs*2ETmxOYBFBs&*DdLaOk@KkZpcpx@Y=4SKvfY9*y@Y*`!=OY zf;vu)J^GhcIID=6N7g^eOf{!Qy zdtv$OUkN)@0fPz5E1^r~TU?FmKI@CUyB1$FcIX*zjAIO+42x2xeDln;LJ-iD@j%w- zwmdz{gegg}`%v*V3uM8%;ZRY(-c4ajirzlX)dUwU~^bzM

      `tsJOVlw!OpkL7BABO_=1TrBHDPvJEy4c*yMZG!Yyp$%-|6ohr8aU}|mf zx{@ZnlLy^73oDYF+xzgHYQaLuS;o}NN+Hq>#lEB3WqpUE^IM%o zhEyb7sJbU-x=(iOKx?4qhu1lQb++k+H0%!d3yRD!bDs|gw@?MSnyjy@gqjkXrsy-I zI6(R3V3UD`&jZm2?fOANuI|G!qFl=E`0v#XV7?m-LFVAwBa0#SH#rJaWawxuN7xv5 z?lGkX@PSMwF|Sk3qWx?;SLqNpde&gXY(~Vhew5=DtN@IT?`rRIekVy>JCy*=l%V{S zP0fEU_p3Qnj+9J)$E2kpNz&WAwSbrGazRRTl8Wr=cRqkTl6?a~I~PM;om)VqfQ`w- z^c-2&-JY?P&V4=d0A8Qh)bYC4h?Pvb>1`-`z&s%(W)DBFm}Jb9f1VBvGe`2JxQ)kz z0%hd4Bn_Q{@(!om=0@pVto@bOkgY+dNa{SOZ$An4!z-g@5;BH9n#qBFB9O4NUj7=Q zJ0%BmwXtfyd97=L-{6_})bQ0gQ5GS4R{bM$u9_wC47Ro*+{ULc*jsk$(zf{Ui-bOW z@)nkco+~A0z873L+%dbB``T?0df+* z;bc=@^=wm5Wh<9dp9OF_U|M4YW|i1rqQ}{fZq%p-XYzRsH5B@NHxMF)+8-<)MzAqK zz>SW3pAAJ*R@-`O{IV;T0&JJWJ>JAUxIscO6+%NxTcH{cmQoQ;+S~YM_CyK#;bPSL zT_NzHF~B(4S?|%E+;VH&XCAV6X=F-|dwmXq1lbC~!>yVI5|rYn3?hdf4SWX=AUcD> z;a3k03TD66wZUs`8($q3xV|!Wl9rC4 zk(Tc6j-fm59?$nV&w1|s$%rNuWwbt5e$9k`|9R9Mgc1rI5C45hu$eRjx zKz+B3y2!|0DZ2sh=NM8a^sknaiwusvpX_B;GQDoRyu6T>mX`M2z=l6=94v2tDC8w6 z@moY}U9vTy2|Q;AvA+;bn;3pvk}E`uN|;*EIA$nL`jYq22Z%LCT_GVQobFThGo--p z4+hp>Ty~_=AhjMUkiN%43e0QJH6uTFP-i#}%`W503>a0Dbv2!TCg8Ru>}2=#jAX{5 zITxeGn-1zzw|mj%@?f;i0^-Q>1$(yf$5&$U4t{;w*TC3J&uaEk>co|1Fm$$@?`$FZAv{(PfwStiyS*6 zggI)r#s!@+qdwsE-nDcb!!1A-LK2e-hfN-|^XebkJ8++_6n!#&5D{JUJ~RF9q;?jz z*s%4oe{781Un-aI-J`1C6r2hk!4o{uq}n2VO-^ahIP^yz4oySkq%z%vgLuNUNCp(% zT&Ob+B8+^Cs1oE)bvlu?aZ31L5DV;2Y}WTi+nGQ4Q?bEH92{P%pP*^Gc|I$rBlp=A zmUtS8r0wywu#m!Oz>|zMQqD-MqGZ$Xv3(3Or^N`qmSz8FLFv`;pAkJb!{XLCabvn1lF>@|@7 zmQta=?n6MD<*(qn(Y!U4mz&tt{zMOxU!i(&5}6W)F7f2Imt!mX5sCjYPz(6)VD8|8 z*n$3u_HEfJY9-IKd-jxWiNZ*Vi=#xBJZ4Vd8avW&`FD*j@?MSNItJ6rjOHFYivb~i zHF0aT%)N0lv)EE7lioidQA5#nX*X%4qC&Mu-uILfqq$zSnD~qsF=fpUVq8A#49InN zxB+=*Y^S_)?B)x&f41qG6!8tKD?3AW8{D4}p;PWpRVuuTe)R1(ZFZ)9thq~NO;L+( z$w-RH+y`BEj@3=0G7<}ZYXgyJf=+r4ayD#8r;MDjl4ZQ+cmR3M2J1t7)cs?B`8{T} z2gI+)S)aWp^rk;q+MCHq>Q_iMsoY^3OX2)!AeJFQBO073#f{{L?CfrKQ`;ez7Yd{A zHA+mPN2T2&R#Q43X~o1X>L+G#WO&Ico%g-6VW?!W>%u66QmzxPEfzZZK2QSnXGaKf zO-)}VSCfT_Q!!m`PvT92@$U9LQ&Zb}9>H_2F3jP3BkfB^{rvE>P4;&sw)o%__BmaF zc6xf+gY_mGu~CbDIHE>$GG_bDeF27tuQMG<_9{R{Y_RG#L&2PE7}4q{O&K|Ds{?$Y z(?T{qq{MDoNXeZ4Wud`@>*$a4UTEHa7WogU*Qm$-pLwlBUXYo0A19|1yk`HbgtNg~ zS-SH0Mr`~<_FmGVypmE*tE@}6zkI$Eggf(9?DKdU%*Hikm`z-s&_U$)nH-e(3#l^n z?SLzsyif;;_|w?FY1MTWxC%xf6s=$;71Q{NeLAMVyqnQ->M}vazOa8zRv~tPKi;GU z$AGgq!HH+j_x$}=JOh=X?P7|D%yA57(D`qK6OD3Lufvk366u2~*|#mM#v0!kCyCP? zCiSc`8y+`C6)SzDUWILq2REh4SDs#;Fh8ah;18n9K(W>Anmka*+AvksFx1pIb-pu1 z({_<=2@85S(S4TCHZr@t{E@gsU=QpaYvl=oflKH-WUt}MGHs`qal#Gwsj=t?iHZVq zAL8bdZ*sblP-=*|SRftmxK^4Hs~9@3CO^ziyR#;X#L0Q2P zS*nW@(OsWz%lq7%F-6!)ZwnW_6dU|)OF-oPuP-TPal|)buD->Nx-xqY z0>^H3OpvSMk=tBshA5Jm2*hp2&%$S;kVV=06RI{Jeh%~@DXDA?&>M|u8jNLjY|zO6 z8jt+$?LK{qxbx~)7e&^rLp&uEZTb%m`Yv+PZ?T>Vp0fMWkx%jnHr#YR_1o*7C4+2o zDJpIz_D;{uDI6#M6}bWlu^K}jdpi3&gQKDZTo6F4;q_;irUA>0Vu?H}q5rnBwRPTJ zkRHOM7ZzUHEiZm5q&NIJk(-K7$j|Gl631u$F;Ql$Y3l*n{2L>gLOK2t%MtF}w@&f6 z1Zw?b_L`;`I6PaqItRlUkAsIs_)IAVUwHga16AVm?p&1>iTCmGG520|EA^HAz207n zFgChm>8xjoVv73eEn-)6BHb9*=aXpv7-<>}O`N6+dVM#76llnn%g6By*X&z$E$ld_ z?!O!PfweeQEn8JtRKv?T^k{V-lMRPD#=>FICIjARi`*OM7~f0#@Vj{KfQZO@mtg5} zN92zZu+~AUK!#ZH^iiSrd&}9CH98ii{u>`?K6hHjGBF)e%^F%rm#ZWS$IHJIAjnk^ zF)i{U-3*K3o?4P)6-4I>-{?N}T1I;pGAz{DT0EmF-83|Vvu7EcY_kd<7qeQ6Oq~)# z$RLUP{<{w!27<8Z+^eT;+MNY`ikp2x8$AmZ0KACCH{y4fJrPH6q6@s`UV7d61`o@sD?|d`_br`N zpJ(L!!A*NrU?2b}k|11E(EN0}q9|`Idp2yW@liO+2re2KqDn(m1-g?bV*E^+&)SeT zkl5l>>ACORUQ2M<-^wt+7%xcc(1m&i+cf+Q*lOh<#|3nnEHo+gP7Rl1Kw zNPHlQ^Osj2z$`=lIca`t`S2+UzRAM&&DlI0?jQ0<0{sK&b06Pb!|+W~fV*xsyE|u6 z_%ftidacx#7?gVSEyvoer^pXG@I~*rZ8S3DDp7f()_v#piIEEQ_YoD2yDh;wWw-LK zSp=Q)CTtdJ$j4YI8{(WAgiL2^V~k|qA1xw~m|Az2;|O=jvNF4+BABR9RpQv#M+kuH zft=pofC-aor#@ZaG!=Plh#!*bj54;T`O<&@^0G;SQ4%w?496S#t4)twGe+QkkhE9o zSr6;!nHGs#CDLCH>eS!B_@~7}XR1}HgSC*pp}!$9+wW;v6td5c>{%7hde)?Mdx(p` zLf#9QG~d(WbAGQ^moD(p=Gv|rA4#A7q400TEUOmpNxC8L50KCfHBpx1o}FK%tEdup zdL`>}dT&VOKhJ%xME1u2(6OD#4}gB|Q5k`+AlJt^{3!bXVOl$@Sri~GWX~&|Bd^Nn ze0jVHc&H3`DD|SfY__mt4ibTbJX<=W6Z{3c-eFLW>7H`Mn_8pVX7`!<&b~h9D8m7k zBqWRq4^;z0*U*Wp3nS*24J0IqjCl_j7F<>u7G`|0^TSMbvhv++f?6YT^@m7&W98D3 z$jEqrt0o2p25{Zn1+a2YkT4k_q%&TkveA!{E@E?fcXD{K2W(vJf%~R=`=3azwZY{- zqHk~K20ky!`VrDryl0ujc6LaA(tYuX?M;nr?Jg-pY(Exh!JM&e>#**2w*2?r zh(D4HZOIaWJyfp^OqiTw7b$GA%QvDjTo?4j3`-+A0>?mtpH&lC${A84B|I!oPuze| zOHoC)F77+?Fin2G-qkb6!^tgp1YPk0R;Eq+dt#E3#|S*tr(xrk0Z~$C=?C5-xLn~F znmjMO4{j{g^N=D+-eBcTo<3dprB0nlvh50}~&kbV##aqu>cx^j@6B|{AFRj`& z;EaebqYQ5D)PKMZ$&~bSUA)gQC?>=g9})4!)N|A11_I-kb_hS>kT&@#={bBNXc`7gnJQ~^6Ibddy__U zK^L|T8YopMKL_g6esXWKPoH-FVW>DqBA)i!*EsZ9gjNF5>O-#hz>O>Iu>utcaIT)e zyLI{l#HGz2-LkEL{7&H>pSL)`XeUS%V_HKCltTWXbGXpbvIG;vFJ{m(7SY zKrY_XF5nodLRSi33Pt^Ew(5gysV_*dS>(}Y?~E%1<72BnH}>qDS-+WmMOM2y<8^m~ z=6A0NhygHck|qA&yI6Uit34I&c?|5%ZR{_sjL8P?9jM@W|3*tVQ+({6zce8nxTYKI`4Ag3t%hLS&{`KEK{b${@S4B=)RwJHK8+ zB0a75l#uG7S1xq9+0eZ44=v3tDP&l|9o=(dLYFRUoE8?UN(N>{UQSLGd`;a7)tgyD zvP3b&NRoOVkkZrl0>V)O!fDIJctr1*F}yS1*lwb^`vCk{44Re<@H?-zDtbOQOe{Su zCbG&LH1q!U7;k*Iy2v;-fE#Q79CT}^C$oy|`evU!{tFARU}G;X;r{-u!}BPDMEKJX$&cmut{4aNM7cqC~3R0qLQocuYwRgz^6}w{7;U`+hyKZp|u! z^hKqSuzEiWIDE(>SHF61j%TR*C z^0KWbU8VAVgkrff4?T9Xfa=&z`pGv3I|n%jA0LA;3dbh~BCaBI?GD zemvvTlM4{U;dagqesX#${gugJ@Vl_noJ$UH(kcTQNGP`C6~3?Zr5$3zbiSzVB}dgGZhhex|By<7MI22W;2hUR(?wM(>&K^ zR4>%9N zn_PzY3Ye~>^=JX5wrasjt_xjsrH1ONxo#ucxSx8$lhkAsAiSp9lMi^m5uN8QdEoQ| zH?s+0!l}80#+}!1e)oxH9<%Jg8{ho6APPvdbJTD3(=;Bv?tY2Jp5%&G&v%lbh~RG2Y|hSmOHN z9Iea#4A`_E=PG|#uDP*iUyi2hw4tD4FUhhZ$!ec}p1HI<*Hhnk(Q9=*`xkx*B7TQy zh4@{#7r?&UfB-S*=*x}tLO!|m^*4-O7ZOfR?B3tLeXFjn1}oboOm;a45hJG#;HJ`R zX7`>`OP5zwN!+;rm4kpJBBE#f5rNRZBXd+_WeHh%hMsY?|LaMD9aeZKAo` z*0?XW_@$(z0RIRgA|kLkZIq;n?$SpC+bK-U@lE?%OVX#I{?ogBUbpU|q8-4Gh-UOL zxWbpqA8iDYXYM(uBoTmsKxAZ>4G+=LdpbLT;s&cDE`xft`-LrtAEKl*esQ#(Bl-3F zhgTqy)Lz|DADC#Duq+{asWh+Ki^kiNVi1P_h%o4@2!0SY78Z*^H&)@tq~zos_=8Ij zs1DphoCT{hqyYpn5bs;i$J_b48!b?^l@)wk%WHOWlBV!JmqB+7upt9QH~ycsd8I4* zW>)_@yaG%FFM!Jen%I}LdUo#}Tso0u6F44@ZQ6q^kf-TF;h&I08*W>-S8x!6k=jJr4rg>cs^}iy>_5S^P1zJT($=^WB zZ^E-@RsR@+8sIIhh*v-Z1I7kCoJ)x17EH|*+Y1e+**4z*%|B%Oz6iop#U5D$!^mQ3 zDgZGE31N}`DIOU3O5i`y-ekT14vI(i9r9n{|B(KUuNN424=h-SI7d%W9wM&NzzglK z|HQoe-%*hy-X?0p%_V^nYogr|Wm{e|`Cv)%|w}?;tBfy+BJ7 z5D^M+7{n-Yn)j$`oCcd9A)(ekli!ITkjlTbv=q!remXijPR>aHz6O;2uJg0}Pf)4< zwZ#7a1@iy+xfb{hC^xSvpN)^lT6ZT}b9cMvX?GWCNi&29xkhtoS@qG6DIdg*)h^|ZaeG%Y4Fs!;`Xk>T}gn+)U z;Iht4Hw(t0$3M$P@M3TuXv-oR@M2-H2Z7WCpNAcH%XnQ5n+#`P|-rViZy4fqN&feacdH)vb^bu+mg5IM{e%~yBfr|0$^$XQN zRV3MFxu@%v}awoEUn zlfObPZc6k5U$#Krx-m6q#hD!G#5N{l1hN0ui-PM(qn3$LZ4U_?20Mot!S64Q$SrF?Q z`N88iFv4#J^{yvDAt5XUeqJCCWJmn#e*fSBc=HY?1tlSn{inYW zqx?U2mwNd$A1`j+}sq znnBLPiMFLO(3;Ij25d`Hn@{9&&8eXdQRK||z4@(KSw^@wi(d=~h(n@ndy7^HW{R@; zs~Jj8vPQ&`hHbrWI<4$*I;!5=>?V(UZUB~{*)zc)X>t)?scUR!XvL>r@LBZv5$JPJ zh$d2qp5`hOMY|@-QmIy^e<+qprZ{VuXl5%jGqE((RXPh<-9zqKlMYp!IL@D$j>44j zU}BfHrTH#OhdrU`auo0c0x5zVWRH%B35Tge9pu{A>Y>A`VvJYAVO=SdG#!gkbP{Y! z7(CAmhJ(@Jv3snrzrX;C+gHjzE=Oz;x`n1W5nAW6R7^ftmFufi&@+t8P`z~3vs;BJ zlvDTa(1M4(KQ?Vh<15kCq^vzwun@nE!{YL#N2(8{U>*O0?OnTIKm!Qs;W1tqu_bP;V95J7`=xUNW6YwLKDT-Siw3J%Vs&Hfrg(dpVtd-jBhkc z$qQ;}yh6{xkB_ZZX?!kv9joS=y$&{7Vpah= zRyL0Cr=72Kf#Yy8QiF4uRFL2+beKtUYLi9U%$z7frdxZAYOwWXP<0=`ekQxdLw@ z)F39dVrFRvv54;(Zd7xrFJi5ghG#X0#>|bH*9%9yVGiyq8?UnrtDc>dKY7gjwZtF*1EJHqj~EnFK~7|#SzA&|L#IV~+KM~rog`G(m=>j|rC8(g=mq>2iP-mhF4 zRSM?UTu#;WCc95JuUE(ANm4KMEv<5g&QE0IcT4(l*`}ePz|FRvJHAiBL9;A}tWZ4F z$>_JB6?ae~&B@TbIU^p23`NEpvziuSHU`u9-xrD&Yg&oB zWxd96Av zG4>dC7|t|Y^onNZnkx-s?0lqm_3Um&>bc`tFR9JgPUOQTw^sAg@N-@TBEE$tfsTRP1_twFWYIfX7V7TqmKVdV{4XhN%V@PPMYV? zU8ZCSRm1dga}O6MUFnIYTyhMnQ*~iaRDT@Lx%%wjXsFeGVGIq@{EQ288LknRoIl$w z*Bv*oP@rtM551!Lo z3OqlfCqx6UjT@ zzX*oWnFnPa%kg^Lv7{(d(_C`RCRiI;dQ_(Wq%Ob8>zq`h8&4ZEQp5_Yw;JsrrXtki9U6ukVmERR6<<1=hs@&h z&d6@O?wg@g#DSf_T()V8rt?de+e^AN7Ev+vbGeG&yXtfm#UO>FQY4eiTPx(A8n@Q* zT{%>G|4dzFxC_dtiRzIp%vrxSm{j%Jj))J%FwMkGoiJ8EzJiu~a#JSPCBP)Y8*c4< zgd}%|#7nE*8f15vDGpP7iL6VRM3JBQ&8ncWaVa`_c_>UYHJ`h-*6VCx0O=8@U*BL+ zx%cM)2U$;_ThB4=E|vA$F@F<+)7lwK>HN+aBTR+k2pvnc{^T9K3hL8Qs6-V}xaYRd zT)5#2HIbI#bei^sdoA}4zdQn_dUmcdOis#RKqMY zE4T`Oa&4};x$I-1(g)wnuTtL?+EbUN)m1`|+&>ap?@6Y!<^oglryi^XMV=TA0F?24l~3^W#)BV-k1!=H;Uh7v~PH0 z1elfoq{{KNhu%z{OZ(|nzCvWJs@(GYPU!A1QJ)MBKSAO^|GC2tDM9wSIpKTC|PtvIuK0ZYE1uDo3eeV^s8Nd$3gL)VOD4Zs;Jc zzYr^`2EI9&v9!*>-XP05M1qsEnk|_pzlus%7DX~eJIw(-!x;1+sN^|W%#~Ra5i45Z zZqdWZ)~asBH|eq?2vv`Kp_g=Z2@6GL=Y+erejgmq2}Z?3W+f5WLMtTH1(2uycok-L75oA^AX%V3^yiSF$pGc zHX@ot4hr|Nypz%=`O$23NjZ6iscGNEHrvL%h*E$4IPjQd&ony@S#6*1AtAyhyt`g& zAH{w9t`>gbQu-u1CU!S!+nvDw)n=ihT~u5qyCDHoko?++-c4mpHi~a@+4Ob6_iksI zAPfcLrI_~J<&2wXEv*rb%C+=-eol0%lRyvq`bg9QIe~s=!22y{#mXMnc&61KGd$NdKlAIbF7|B8 z=d3HLGnS%{XC&6Sc`oA>zckTO>h@cdRyp)vFMlD?mbcd(&e1h5rJgZ+%!_TnzLM2D znKymqpLyj!{T}YT*g`}loG-D&163KdB{9C(%c2h|@8%*+pZs(h=+E<+Ov4ui_!A0_;Z*O?5gq;vQaL)F{dMsM)e4E4wA&`+v$?owIX^KgX@@jvk)ROSfBB z9}9BFL=lrkzGNkM9aNIr6LFuMtr}g8`1FD;cl!*V=r>%VToJ7JRl!$3KRPI!ZA67Ut9bGiQI*8=b*aWT(f7rmW$-B0k3-ECHK9K9 zw7n_u3**~5P>JysgDhScnM*^S(`44ldd{n*!+Z1)h_O>b@)(ybArk{?M#fFymWza3 zKfRf&eogpzrUhEUbuhV{&6EhV3gaiuQlIff&s1?=eShRvT&`Z4i+G7J4U?!I2EQla z^o;bi`+vQR(h};geNO8r;iqzGC{dD5z9Wb373T<};G{&EuwV3ZXmV(7lS^4CvQ(~0 zi3NVAFL*P(TynjZH{|6PpDsR`G+oJ~;lXirSl=akPto`-)gej^!zvxGD#l?Uf!xjN z;>+v&9=usP^-B5nOe#gzx|DRbNqB;0ouP)$aR6s=pT`_Ot<4-ZYDhj0XUU-4uOD>W z$Jjr`)1UI1QbJi7a@NxnA{Feli%VuGPftJNtdq2d;A_@VDd*V}a^Pf;^{?ktykaTH zA5o+&%H^Wuq`YhIN*?sd`|_eF?pAo>6NMUoP1zy3#?V3g2$tFKFUsIKn3s|d_qG$W zCaXwQRL&`L+zdFE&5P8T5TS&T<#x&hg?x#GvV58>BSVOr*u*DO}l-kGJ4(OJqlkw zQOR0ySx)ViF6vdc{VB<8#8{IxPH@(nN^I9rC&A!qvbH57?HsX7tJkzz`oJ?qQk{OK z)k^;LDE68-T71D^2|WmrwjbY;)qOp*HlI(oU?gAmm*R(4HHRTJMrk354hQk$8vC8c zFK_WM>76n|-trZ1ezGV*pTA&e?*)g{Dji$ZZEO8CXc2_QU7#`hsKIeBS7CJQxLi-p zvRrZT%Nc(DhwJaC65Te{3b7|A-h$}$u4-7iu`P-0eU+X)?QaL=Caj@p$seSq2&B@c zw6cQAN81(6&jT0RvFl)4F#!h3Sp$J=^~&rkFqW&xD*goap-#3NHxz0rN-F6agF9Jy ztOI+HIKZ#!{GIcTErHxgBTFUf0>L(2HEb-(YAJw!v%xbhhrHqK?M^^k%T|0vah62&K8e(IK<#49a%T{ta~wz(2aFvuHD)e zoQ5o2pignlaLg-QrV1qG3P!xzTWk6oWnYg+QGcXn490lDBsvsHTOW7r-#rFRFOPHM5@fSSDduxxGKCYOF}6c3)AJ zt^WABUZo7Kno@eXa234Dmul0(YSbRZPu~}uSa)k{wm%g;tXdFderxNsT`mA+E%Mj- z1;0$0o0b@^+KE#o7GhFAXKbOr*)5cewP1OW!N#b;ZqwOHK?v^sFkjT0pr91_=Nb&^ z$SJovOjrnJYC4UH7Z*zAbMIHCVa40urV>ZKy`fOM7@tMCN8vX~saS1L$Yoe@p|#=_ zucmn@c(Yr@$o{}OThjG+Pa2i5CtNkBXe%@swSX!g*x?=ouBt>V9CC-ph>@8)QK!Qy!Of^Hdsco1wbM?J2NStH-F{!J7Qm#?TO6TvW zc^$qO+t`C25)^}oXZkmE zVk_wK+p><{#kneQhoJm+OwBoLgR zLq^$H+!(qVR)?dt(b*Rp6sn2e%avXcc3ReD2(p2E>0xe%-<>-a%8E{|2N z{#O0a@|7=z4x(DIEKa83HqlzOZe6x2SBhecJSANo%^I!@7l@&r`hlUMG1-Nh?R7TK zD^Kyc299h?>s5%T%b5=od>5V0+*rgQ%E}KR2(ecz-i)dw93A6iUhTGUj3HO-mYH@& z>8aK_|GDw0Mh}iIp;l#e7fiq>p;_rU*23Q*lRA7{nGpJnT)$B-l_Ee*Vx1?yCA63A zN93tj^;yeRP-SSuPwVAU80ormnS6IZ;)i?)EM8d9B$- z-KyNU3VH2m+Eo~q`%hK6wckpk?6;2AU6@2*3&!{>DStICsI)AEQyXb;K9IdWtMeC4 zRAR3rb7HK+moQd_nAHih$22oA{Yaan7Jduv+ki(loABGyPM>n}u$g0CH!bDs_T-WS z36ig`I|y)NtRJbsN;8-21Gf8v>BN&{QMP~@zPBgCZ?p!$hLIW>lK+)$> zR9u4>&vv27UY>eYjH2@vX7IcxyqQB0&fKmaLgOVer(9yYyfcZenK0pYcNKh8cDBbK zaW(SXYJ68!+nr&Nybn{eZ2~LmP1`xat$dePm#dd&1G(Lu&+o?i(@Jr6*SoHR84Ki0 z%`Z`oahtKIB>hmgK*y=HDP<5!K~yiqAIR@U7EYMg!& z?tLp6$>{BC{XU|ssf%BF?Y#mF@|W^wYe=mwF2U%i*sk?UYI@3!XJe7OS?{21b6Ek(nxj*A=Em zZgz+pw02pg_7YfBY_y~MR`NkVE`B5KE7$=Q>f zb#_0mSwVB-2%G{}yDsv|spLkEyb2bB6uHDk>$|mbo9N+7=^?i*0|7_&A9=Q~HF)MNW)Dmisb};LD+5847=@hKpHjlh{<3A9v_e zQ6@Y>AUf2I)^L!zo^Foj`3HGFhKs& zS&r)Y+33CGugS?Al_FuaIU>L!b?erChA$U=!{^d^^9 zZ1VY-w-0Z=n%q#ozL|j69{D*$?h%h#P5NUux*qqc;S@zwXjxVeCXGY!@w461yoUIk zgY?a6qpLNWd*W`n3_--(ZIO224JR`YjE1Lv@?8&le?R-tTJ&wu(%tD^CN2s7Evy1BGQ*R8oBgs( zSj))G-gK#y9-|fexfGAX&R69ZF-NFg9nn6bB!m5mJ|s@cn1f+UfV?;t(Jz2caOYL!)xPcW+B6!fhX z5kCI#0UbVN27-o}Qgry}?d8=$lHRxMEI#E`s|z>sj4dPM9^a*X^5`%;Xio=&X)(kwUVRUF)8?wQii(|E#ZHpHHr<-4dvF~TA_g`tXm z-jJ0m%q>qWA;sxAy>E~~%}dBh@$TJekerdLex%6 z;dD`_#gi07#nEzS#4@w6g%%6TP0OSP^BQwWV_^CexN2WvA;D#+uh?32!-Y5ebW0fg zed)yfEN!xM8vh188V&56AgUM{> z4EUu8OKLXhoO}3ZR2m+g>XGZY4DgM&m9{OywEVx*);b8x+NvLlFE20c43&@|yHF30 z`bkP)uI2;gYD!e61Px%V2RoY%*pd`5yK_4n7DaiBATVlfr{*BYG?(L!u_L`e&$;bA zNW(ga2nXRQH|$L;FE2+0Sr5n5tXN?BWdA>_m_q!F=onAi3JdtiC<GW_4F0Drh|JqR!|6c`$3{)& zKM#Vpf8zl5v7(2;S9OF35B9MNQU3F>nkNL&D`)!u#t;0Dw*D@I1Ij1_JRzb;;dL9^ zc@GK@9_RKyiifC zj?5#x{$E4l`9pdHHJao>9|b@4oc`0yzn%>lB>2-c zge0WuB4+O2z5IVI_>Ty9=OiS9ni10Ao%7<46#VI_NL_AmG5a4=IRb^^95na`LIPOC z)AomP2yXGT{SgBM@BdAQ|K`%a$Nsm7{i*z4AODfIe+k~dJ}xjRzsC7zi1F!y0Z;ys zX9nb>KRm}fcu@VAMFt_YhCuw826zzSpY+tqyQk@oU|AXd8Owtv0^Y+;@+j47R9%3K zA;C|pP<{=ZJY1)79sJ5p(j|=j!lCB81$I=F?+9i2oE1 zu2~M_Zm_UTeEXBxeBzD2C1|(~Kwqj82(0Q3{0S_LZBWAA<}q8&a72p(A_&-lI(0$r z!;*VBZAJiMy9U6l4ZXn#pivJ18c{xe@n!*pM${=oB3w55yE-&bU3q3^X8WXZXuhTA zc`FH%JwhNA!Sh)sTcg{e{Fk!J#RatpEg=mgnH+(jd~2!qcoyWEI^7=c-}w%@wT}^B zP0l?q$C=Uxu#{U{TL8cN0+~_iI%OWfoj@9pkTlUSLYGzycJ)1C{P4Z?_3;X`@%{aM zy8J)$iEOTET;bzKVoux4A3uK7)m;OB2_{&w#82hd8#p8KBwpviu3W^xC? zfvLAk81BE;)4WnsQf`1p8ps22+G4~F(nwCcXd+1Fb}DM)y1BkC0G#FxQ^5At~+)e2^t+Y2GZTm_HM4uKt1`BSsFD< zOG|ZibwGUDy%La+kU;#>kf0zY7*G%1j^56nPIG?#v<8bw=(g$g_4VZ$e7@1kt8Cj; zD$Vn96J$uS0l65L#|H)m0QoAnSAb9rJOGW#fP@EkK$K$Q;|Uu5KYvCr6^$#Q0yhAY zgwOTZSWz+dz)V45M8@;*c^QKD`<=>ht%bCQksQ846xwg8B$A7jx z4iXwR|6xYmlY<9yMFj=s!`V_IN+krA)i3$@=5~T4m+iTncBd3oR7^s&q`op`fhl5$ z3*>u2IFNnc^y1>;?yB+5Z06Q>r89DIanVpozX6a8G=Yz-ayDZp^Wj6pBsLH|XY?hE zy7<<`i3ShYAc4j8`2on$xD!;@20-dHAgLx;xB)L_JkDmvHQfsTE`kDzi~s>?uv?d2 zCI)bAmz>E}=ajs>ypfTS%S+ebHYS@Tp=aPQ=bib)5EoLu01|A9RFL=j{+ghVtM6px&5nNiq;Z(9l~L zxT}L4J+)eJm;+8~091!i1l0T&k5ZZ$ia_Q`zvxhqg*Ico_5i$Jllu@Q*<-wc2|O_IL|oFhTb(U{m+XzgZp(miD4 zUWS}mkji#rFe4yyXJ@CS<$YNXAlw@az?qg!dqaJFvC`>X{_|$c-wZh^cx>hgjg5^! zDV;Be_Z9(;G_im>gApFqf2$%EoahDHP-0%ysOjBX5Tp0^pN9y+Lw;cPd@nCokaKsh zo2)2T0y$Vcu1;f*fy2-Eu49r0f}oE8d(mKyyHQxrp6OOi_ZDRl1&4<2j^xUNQp_LihU{E5>q950h5SDwVZVcL-M1tva*^Q9Ss9R-;S!gkhyt5Ch(O=&;T0#Pc8ax zr#q2YgoMAPc+@074B@mit>qvp&{sI-62|WpM_5l!59O@$a;V|>l6(lv9q6K8fA$1Z z3e;ujO=qefKgMMOHv0zzXx+?t!qz?*xCSLl$M>w-b7?T3Opo;Lk&Nf`C!BL!4ZIyX zGw?RT1+7#U^cz~099(QHALf-@Y^(=RT0JjH-oR?xLbx&>2-+zN-%%HD%o+w?E#HEkgi1jmbfe z)&Oc0Czz6jr5qy+`}NHYJ2`6KZN7efRO*FZEp1hKvrX@4mIQ8ao9)iT+cNY&#maHK zO+ujZ!12Rlny^pHb?ZzJKKVwL(u|*0_P`(OD&$dba;F6MsED0S)d zueUbj)Y36t3T5v~Sjt)7o8(uDj}rYpb3EZl$tmMh3m43x*m8EPOjU>n!OV$`1s zh}F30PcXF;sOO8#d3)=tXr?iAN{=URge8FiVti+HXinbr^Yc+Dy<0xr#8W+K7Ciuy zENHcCmpskXeTL@7rd4MgRl)+Vvf4@H_Sy%7akO*Ov8&y&!lc$k4zNI)?E;h|Vq2>HBqKu! ztS{5&)i!!dXdh9aig;-?*;_xKS_NfslT6z>@4oIbh;IKS>`1`D)HoEEdhj)$l)S#l zVVze(em?gx@sVv=eO4w+{p>ewS7+ekp>Ne3IbQnh>ArcskK>QeMNvM<8Dd=a7G+O2 zI(F79q@pSu%0SyCun1kMGY_rXjcj8Jx?j;ilTZ4naxSGUV%gmQnpyRA9M~L`cO&-a zbtDH5)_xQg#sbBl=7pT`{hAV{5UWL_xJEGCL97<-<-DsGMaLlK~1o4 zy^BY~j0wwIyK@{p)Oe1?lf5~ImT8HH=aoXhzj(%ohs+u~#M{5qr+n!xp-4lMMxR!% zaf`t?shNvXwwAw=_HL*L^GWjg2pS4|$nH*`Q{Sb9co%=#%@3jCo5l_jsnF;|%qw*t zpkdTr$AN{VxZ!du(X6QEk_arO&YY^~O@u%hXNSz$qsN&yi$ohM)>7;`Zl!s-3+HW7 z-JGl*gieac#gyv~CVV^3p|E)M;Wm+iGTj=bS#7_vmq{*EeFq(y=kJWJFVQ z)d$x~Pd4{yp>UoFqop1aHUKyv&$zz3?6WdQHj)tUvgUNkDIdE6o7O00Pq11vPzSQV z=>Vq@Nxb@t2T2r#Qcigb4}y**!kZ9L%#lMfir7Q-jWjFh>#Z7D()yus#oE7GTncw!-ARaiBVE{F=Xtb$cI z0{ywr3yunQ?kA&4p}6xFU8^j&j7bz;Ntq$L0h!OB%N;`EpBUV`I;$5j%|ES(_n*&D zuBW5Jey}bxPG)=$S&S0T84l!|#)MMBDBCbgvAI#ZCtEy(Gj@Q^K%opcqBNp&lx6M% z;l#cB$>$cXR;_(P-sn|9n;mmv(zLWQQ-1K#ugATDVG(9U9p8&rh$@!IB!HHpOyhgn zvX+ZpU0avf%%E%*p}Zw$xV0T`O9NY_rYdlq@mr^$*5pdouQh-#o|Y10$1M6%LEM%r zG{^UoT7#5S1b*B$hXzKELy>?YG;5u}X?v{D!ODC1G(#WAX14b6gSDTkg%*vcRE;_+ z!4gB?d}cF$WaG6^8U;tTjK0Z{DrJ2=Uh_<=aUXu>6zoNFL`HBaacEUxZg;w)lHsTN z_e=!G5$!M_OylF@RR`~sh@N4pmyS1*m6&qiMgZ*jQKH!9VvGpvn-3v1- zirCm#j~rB6aWltt>Y2B9Wr}Anwv9Dwxrg`;vf45B;Q8OqC!_di2lx2-%vgwxkAI(b zM`0XMVw9V#gnUt|Tk?uHUal$2`bKLq#=O}ETi2@Yjhk(wo%1lbvXTXR^V zjw_`RQ9Y&@dn?erIFCggmUeKpz-Mz2TbV_Y<#pV_-|a9#MV~k*`pMId)vx~lYVTab zp-jU#ZfmPeyRloFR-xUbYz|2d#gJlL+F7n;}eu5oA=X$F%f#wq(B_PX}_e%^2M;eGFS=6Rp@x&Ocay!ZW>cIQYtZ>J=G z^dSEF)r3tZL2qaD>zKytG2c@jBsQ%n>IpDkcxJ%lnTNMeQHm?~7nGMzeWx;n8yKnZ zZY^j1#*I3fng_977fsf%pE!#7LsW&9vlZIsr#@OZiBu$7b8UZ;oZQ+L8%qnaEGf;q^fesR^)!YOL!(i@GG`6D zoB)RQ=+`E6X~$?u;iVnfb42=vB<`c1SEWnNl~w#D{x-d+(2Z4WM^5Dt3h6T*WU}NQ zbFm1LA4w!YK)`AkuB}nfcmVV)LeGZ4z;Wy#3p^%PwE20?q(_|^IQ~shO?3lfsbTuo z0IGjbnBLRd8;|zyXX9}<#D*l>m`o9)_OX|qa^x-gZ-?klyvigZe%Ffl1KCioCM4V- zyScehD1i)ZvtjX26VzFSvlez4P*@hv>~X~)PY#R4LYg4jQ>h$&r8Kp!&eR6NrJjEo zm$?roiDVc&c-SUCKcA}f+5}4Crfosqmph3W%StO72z>Hr+~;M^T96e!as`#50Ui&o z0_dSQf=5P-N$a|cvx&o#$m#mEiXMYuhn6KPJOpYlQd36{vcdprhWyK%ff2CpeHq&0 z{aAW-@dFGeM%E*7#N&`$9*-$g#|sOQ-kqP7kX&3cJ7Z|=8G6f6JXe849+jSG;)adk zg>~NPULDk9w4!pCY4f(fKEl#6c3E?0TnJwsbVgWQb*%92-S($X4QkUEngqgPd#3)D z1Rv4MvXy8X5zUHBPSqO`^L=w=gDVQ@%lzFsIS1A1)hJJ(>Mz4msAABdRZFs3P^GI- zD7iS8KKJ4`5_h*DOF{ zrEHVUQ~8ARk~b`t;tEK?Z0dglCwE*>Ta^cFwlkY;7KPNk=qYx)77*H|T_p=53cY$Q8K^}s3Czf{>LV?lr~A1o;d-dU@)(o3G|8%j_L4tH>l9QM z7T!O@C~9wMLvftLpSBh_W1nJB$HvsOG+KXMO-YGuih!o3=hZwDycG*m$jpQQd&#A3 zR#e;vBxb^fST+uHWX8cZBbt_uj$yQ_aWK1+G9KZDJ>voHTN13EU-)D-F=@LW!wT{H zufWkzhoOR4E#;fc&3V~0t|q#Ki*7f#;ioY}LqZan1ud)8YXvmMPdEdWMlsX7(c;9J z>E-^ewYeGHnzAWmp-I@A4%i>q+C*K3&75qSvT1lJ-wHqw4$$k{RnS#K7xuK&_(w-a zqt3f2USU$^X5>?f;XT=zFW%>HTDInuJ8Pl)cfa%DHc0A5HexdwY8yJ#vIp zjMpyNi{Pq)%}Pq6!^2p(+Q-7OC~d>*<>lXY7dc_+G*J$d88?Q_+oX4Oc?;$6M7Ufo zG6?1vs`qUR-eaj7Io^H8VK 0c7d8fd69bc54623b436fd9543489230c27f177a56383ea6a9aace9f87f04004 +take 12-20 bytes from '0c7d8fd69bc54623b436fd9543489230c27f177a56383ea6a9aace9f87f04004' -> 4623b436f +so the shortened url would be https://s.f0xx.org/4623b436f + +The reverse lookup: +is straightforward +- BE takes a part of the request, 4623b436f for this example, and performs reverse lookup through the database, depending on hashing algo used. once found, returns the response with the full URL, error otherwise + + +TBD and open questions list: + +Estimations: + +Severity: Medium diff --git a/docs/specs/20100611_3_url_shortener.md b/docs/specs/20100611_3_url_shortener.md new file mode 100644 index 0000000..4f5bc64 --- /dev/null +++ b/docs/specs/20100611_3_url_shortener.md @@ -0,0 +1,441 @@ +# URL shortener service — specification + +**Document type:** SPEC +**Source draft:** [docs/drafts/20100611_3_url_shortener.txt](../drafts/20100611_3_url_shortener.txt) +**Design review:** [docs/DRs/20100611_3_url_shortener.md](../DRs/20100611_3_url_shortener.md) +**Status:** Post-alpha (next after alpha); priority may shift with BE capacity/load +**Severity:** Medium +**Public host:** `https://s.f0xx.org` +**Repo placement:** `backend/url-shortener` (git submodule → `git://f0xx.org/androidcast_project/url-shortener`) + +**Documentation index:** [README.md](../README.md) + +--- + +--- + +--- + +## Table of contents + + +- [1. Purpose](#1-purpose) +- [2. Scope](#2-scope) +- [3. Requirements](#3-requirements) + - [3.1 Must](#31-must) + - [3.2 Should](#32-should) +- [4. Architecture](#4-architecture) +- [5. Authentication and trust](#5-authentication-and-trust) +- [6. REST API](#6-rest-api) + - [6.1 Shorten — GET](#61-shorten-get) + - [6.2 Shorten — POST](#62-shorten-post) + - [6.3 Error response](#63-error-response) + - [6.4 Success response](#64-success-response) + - [6.5 QR](#65-qr) +- [7. Redirect and permalink behaviour](#7-redirect-and-permalink-behaviour) +- [8. Slug algorithm](#8-slug-algorithm) +- [9. Database schema](#9-database-schema) + - [9.1 links](#91-links) + - [9.2 bearer_tokens](#92-bearertokens) + - [9.3 signer_keys](#93-signerkeys) + - [9.4 audit_log](#94-auditlog) +- [10. QR codes](#10-qr-codes) +- [11. OpenAPI](#11-openapi) +- [12. Deployment](#12-deployment) +- [13. Security](#13-security) +- [14. Observability and limits](#14-observability-and-limits) +- [15. Tests](#15-tests) +- [16. Out of scope (v1)](#16-out-of-scope-v1) +- [17. Related docs](#17-related-docs) + + +**Documentation index:** [README.md](README.md) + +--- + +## 1. Purpose + +Provide **short, encoded URLs on demand** for long targets. The service is a **helper** for other apps and operators (Android Cast BE console, curl scripts, future mobile share flows) — not a user-facing product on its own. + +**High-level flow:** + +1. A client (any HTTP app; Android Cast not required) requests shortening of a long URL. +2. The client authenticates with a **project bearer token** (and optionally a **signer** for elevated TTL). +3. The service validates trust, creates or returns a cached short link, and responds with JSON. +4. End users open `https://s.f0xx.org/{slug}` → HTTP redirect to the original URL (while TTL valid). + +--- + +## 2. Scope + +| In scope (v1) | Out of scope (v1) | +|---------------|-------------------| +| Standalone opt-in service (not inside crash-reporter PHP app) | Alpha release blocker | +| REST API + OpenAPI 3 document | Custom domains per tenant | +| PHP + nginx + MariaDB stack | Click analytics dashboard | +| Permalink reuse for same `(bearer, url)` | Link preview / OG scraper | +| Time-limited and permanent links (signer-gated) | Federated multi-region | +| QR code PNG for any short URL | Mobile SDK (HTTP only v1) | + +**Scheduling:** Post-alpha by default. PO may reorder if BE load is low and another product track needs short links urgently (see DR §Estimates). + +--- + +## 3. Requirements + +### 3.1 Must + +| ID | Requirement | +|----|-------------| +| R1 | Standalone service; development **separate** from main BE crash/tickets app | +| R2 | REST API documented with **OpenAPI 3** (`openapi.yaml` in repo) | +| R3 | Stack: **PHP 8.x**, **nginx**, **MariaDB**; OSS dependencies only (MIT/BSD/Apache) | +| R4 | Project path: `backend/url-shortener` submodule | +| R5 | **QR code** generation (PNG) for shortened URLs | +| R6 | **Permalink** semantics: same bearer + same normalized URL → same slug while record valid | +| R7 | **TTL**: temporary links expire; `ttl=0` permanent only for trusted signers | +| R8 | JSON request/response contract (§6) | +| R9 | Reverse lookup: `GET /{slug}` → `302` to stored origin (or `410` when expired) | + +### 3.2 Should + +| ID | Requirement | +|----|-------------| +| S1 | Support **GET** (query) and **POST** (JSON body) shorten endpoints | +| S2 | Rate limits per bearer token | +| S3 | Audit log table for create/access/deny | +| S4 | Admin token mint/revoke via BE RBAC (shared operator session) — see DR | +| S5 | Unit tests (PHP) + curl-based smoke script in `scripts/` | + +--- + +## 4. Architecture + +```text +Client (curl, BE job, future app) + │ HTTPS shorten API + ▼ +┌─────────────────────────────────────┐ +│ FE — Gentoo (s.f0xx.org TLS) │ +│ nginx reverse_proxy │ +└──────────────┬──────────────────────┘ + │ proxy_pass → BE :80 + ▼ +┌─────────────────────────────────────┐ +│ BE — Alpine │ +│ nginx → php-fpm (url-shortener) │ +│ MariaDB (url_shortener schema) │ +└─────────────────────────────────────┘ + +Browser / QR scan + │ GET https://s.f0xx.org/{slug} + ▼ + same path → lookup → 302 Location: origin +``` + +- **Not** mounted under `/app/androidcast_project/crashes/` — dedicated vhost `s.f0xx.org` (DR §Deployment). +- **Opt-in deploy:** absent from default BE sync until operator enables submodule + nginx fragment. + +--- + +## 5. Authentication and trust + +Normative decisions: [DR §Authentication and trust](../DRs/20100611_3_url_shortener.md#authentication-and-trust). + +| Concept | Spec | +|---------|------| +| **bearer** | Project-scoped API token (`varchar(128)`), stored hashed in DB | +| **signer** | Optional second secret proving **elevated** rights (permanent TTL, high quotas) | +| **demo token** | Pre-seeded read-only or low-quota token for smoke tests | +| **App-wide session** | Human operators mint/revoke bearer tokens via BE console using existing `ac_crash_sess` RBAC — not used for machine `curl` shorten calls | + +**Trust checks (shorten):** + +1. `bearer` required → `401` if missing/unknown/revoked. +2. Lookup existing row for `(bearer_id, normalized_origin)`: + - If found and not expired → return cached short URL; `ttl` in response = **remaining seconds**. + - If found but expired → `409` / error code `TTL_EXPIRED` (do not extend without new shorten). +3. If not found → require **whitelist/trusted** bearer for create. +4. If `ttl=0` (permanent) → require valid **signer** with `can_permanent` capability. +5. If `ttl>0` → bearer must have `can_temporary` (default for trusted tokens). + +--- + +## 6. REST API + +Base: `https://s.f0xx.org/api/v1` + +### 6.1 Shorten — GET + +```http +GET /api/v1/shorten?url={URL_ENCODED}&bearer={TOKEN}&signer={SIGNER}&ttl={TTL} +``` + +| Param | Required | Description | +|-------|----------|-------------| +| `url` | yes | URL-encoded long URL (max 2048 chars after decode) | +| `bearer` | yes | API token | +| `signer` | if `ttl=0` | Signer secret for permanent links | +| `ttl` | no | Seconds until expiry; `0` = permanent (signer required); default `86400` | + +### 6.2 Shorten — POST + +```http +POST /api/v1/shorten +Content-Type: application/json + +{ + "url": "https://defender.net/very/long/link#with_anchors¶m1=value1", + "bearer": "4abef433d23ab5x&&83^c6", + "signer": "optional-signer-key", + "ttl": 3600 +} +``` + +Prefer POST when URL length or sensitive query strings make GET impractical. + +### 6.3 Error response + +```json +{ + "code": "ACCESS_DENIED", + "url": "https://defender.net/...", + "bearer": "4abef…", + "desc": "access denied" +} +``` + +| `code` | HTTP | Meaning | +|--------|------|---------| +| `0` | 200 | Success (success body below) | +| `ACCESS_DENIED` | 403 | Bearer not trusted / revoked | +| `MISSING_BEARER` | 401 | No bearer | +| `INVALID_URL` | 400 | Malformed or disallowed scheme | +| `TTL_EXPIRED` | 409 | Cached link expired | +| `SIGNER_REQUIRED` | 403 | `ttl=0` without valid signer | +| `RATE_LIMITED` | 429 | Quota exceeded | +| `INTERNAL` | 500 | Server error | + +### 6.4 Success response + +```json +{ + "code": "0", + "url": "https://defender.net/very/long/link#with_anchors¶m1=value1", + "u": "https://s.f0xx.org/a1b2c3d4e5f6", + "bearer": "4abef433d23ab5x&&83^c6", + "ttl": "3542" +} +``` + +| Field | Description | +|-------|-------------| +| `url` | Original URL (normalized canonical form) | +| `u` | Short URL | +| `bearer` | Echo of bearer (truncated in logs only) | +| `ttl` | Remaining seconds; `"0"` if permanent | + +Optional fields (v1.1 suggestion in DR): `qr` — URL to QR PNG. + +### 6.5 QR + +```http +GET /api/v1/qr/{slug}.png?size=256 +``` + +Returns `image/png` encoding `https://s.f0xx.org/{slug}`. `404` if slug unknown; `410` if expired. + +--- + +## 7. Redirect and permalink behaviour + +| Request | Behaviour | +|---------|-----------| +| `GET /{slug}` | `302 Found` → `Location: origin`; update `accessed_at` | +| Expired slug | `410 Gone` HTML or JSON if `Accept: application/json` | +| Unknown slug | `404 Not Found` | +| `HEAD /{slug}` | Same as GET without body | + +**Permalink:** For a given `(bearer, normalized_origin)`, the **same slug** is returned on repeat shorten while the row is valid. New slug only after expiry + delete or explicit admin purge. + +**URL normalization (before hash/store):** + +- Trim whitespace +- Lowercase scheme and host +- Preserve path, query, fragment +- Reject non-`http`/`https` schemes + +--- + +## 8. Slug algorithm + +**Normative (per DR):** SHA-256 truncated — **not** Java `String.hashCode` or character interleaving from the draft. + +``` +normalized = normalize_url(url) +material = bearer_id + "\x1f" + normalized +digest = SHA256(material) +slug = lowercase_hex(digest[0:6]) // 12 hex chars → ~48 bits +short_url = "https://s.f0xx.org/" + slug +``` + +**Collision handling:** On insert conflict on `slug`, append `1`…`f` suffix (max 4 chars) or re-hash with salt counter — see DR §Slug algorithm. + +**Reverse lookup:** Primary key lookup on `slug` column (indexed unique). No recomputation at redirect time. + +_Draft note preserved in DR §Slug algorithm — interleave + Java hash rejected for production._ + +--- + +## 9. Database schema + +Database: `url_shortener` (separate schema or DB — DR §Data store). + +### 9.1 `links` + +| Column | Type | Notes | +|--------|------|-------| +| `id` | `BIGINT UNSIGNED AUTO_INCREMENT` | PK | +| `bearer_id` | `INT UNSIGNED` | FK → `bearer_tokens.id` | +| `signer_id` | `INT UNSIGNED NULL` | FK → `signer_keys.id` if used | +| `slug` | `VARCHAR(16)` | Unique, indexed | +| `origin` | `TEXT` | Normalized original URL | +| `origin_hash` | `CHAR(64)` | SHA-256 of origin (dedup aid) | +| `ttl_seconds` | `INT UNSIGNED` | `0` = permanent | +| `expires_at` | `DATETIME NULL` | NULL when permanent | +| `created_at` | `DATETIME` | | +| `updated_at` | `DATETIME` | | +| `accessed_at` | `DATETIME NULL` | Last redirect | +| `access_count` | `BIGINT UNSIGNED` | Default 0 | + +Unique index: `(bearer_id, origin_hash)` where `expires_at IS NULL OR expires_at > NOW()` — implementation via application check + partial unique strategy per MariaDB version (DR). + +### 9.2 `bearer_tokens` + +| Column | Type | Notes | +|--------|------|-------| +| `id` | `INT UNSIGNED AUTO_INCREMENT` | | +| `token_hash` | `CHAR(64)` | SHA-256 of bearer secret | +| `label` | `VARCHAR(128)` | Operator label | +| `trusted` | `TINYINT(1)` | Whitelist flag | +| `can_temporary` | `TINYINT(1)` | Default 1 for trusted | +| `can_permanent` | `TINYINT(1)` | Default 0; needs signer anyway | +| `rate_limit_per_hour` | `INT UNSIGNED` | Default 1000 | +| `revoked_at` | `DATETIME NULL` | | +| `created_at` | `DATETIME` | | + +### 9.3 `signer_keys` + +| Column | Type | Notes | +|--------|------|-------| +| `id` | `INT UNSIGNED AUTO_INCREMENT` | | +| `key_hash` | `CHAR(64)` | SHA-256 of signer secret | +| `label` | `VARCHAR(128)` | | +| `can_permanent` | `TINYINT(1)` | | +| `revoked_at` | `DATETIME NULL` | | + +### 9.4 `audit_log` + +| Column | Type | Notes | +|--------|------|-------| +| `id` | `BIGINT UNSIGNED AUTO_INCREMENT` | | +| `event` | `VARCHAR(32)` | `shorten`, `redirect`, `deny`, … | +| `bearer_id` | `INT UNSIGNED NULL` | | +| `slug` | `VARCHAR(16) NULL` | | +| `ip` | `VARCHAR(45)` | | +| `detail` | `TEXT` | | +| `created_at` | `DATETIME` | | + +--- + +## 10. QR codes + +- Library: **endroid/qr-code** (MIT) or pure-PHP equivalent — license entry required in BE licenses file before merge. +- Default size: 256×256 PNG, ECC level M. +- Content: full short URL string (`https://s.f0xx.org/{slug}`). +- Cache: optional filesystem cache keyed by slug+size (DR suggestion). + +--- + +## 11. OpenAPI + +Ship `backend/url-shortener/openapi.yaml` covering: + +- `POST /api/v1/shorten` +- `GET /api/v1/shorten` (documented; mark `POST` preferred) +- `GET /api/v1/qr/{slug}.png` +- `GET /{slug}` redirect (document as `GET /r/{slug}` if internal router separates API — DR §Routing) + +Serve docs at `GET /api/v1/docs` (Swagger UI static bundle or Redoc) — opt-in on staging only. + +--- + +## 12. Deployment + +| Item | Value | +|------|-------| +| Submodule path | `backend/url-shortener` | +| Remote | `git://f0xx.org/androidcast_project/url-shortener` (when available) | +| BE docroot | `/var/www/localhost/htdocs/apps/s/` (suggested — confirm in DR) | +| nginx | New fragment `url-shortener.conf`; FE `server_name s.f0xx.org` | +| PHP-FPM | Same pool as other BE apps or dedicated pool if load warrants | +| MariaDB | Schema `url_shortener` | +| Enable | Operator copies submodule, runs migration, includes nginx fragment, reload | + +**Not required** for alpha BE validation script `validate_be_services.sh` until service is enabled. + +--- + +## 13. Security + +| Topic | Rule | +|-------|------| +| Secrets at rest | Store only hashes of bearer/signer | +| TLS | Required on public FE | +| SSRF | Block shorten targets to `127.0.0.0/8`, `10.0.0.0/8`, `169.254.0.0/16`, `metadata` hosts | +| Open redirect | Only stored origins issued by trusted bearers | +| Logging | Never log full bearer/signer; truncate to 6 chars | +| CSRF | N/A for token-based API; admin UI uses session + CSRF token | + +Optional HMAC request signing for GET — DR §Suggestions. + +--- + +## 14. Observability and limits + +| Limit | Default | +|-------|---------| +| Max URL length | 2048 | +| Max slug length | 16 | +| Rate limit | 1000 shorten/hour per bearer | +| Audit retention | 90 days (cron purge script) | + +Metrics (suggestion): redirect count, 4xx/5xx rate — post-v1 Prometheus or nginx logs. + +--- + +## 15. Tests + +| Layer | Location | +|-------|----------| +| PHP unit | `backend/url-shortener/tests/` — normalize, slug, TTL math, auth | +| Smoke | `backend/url-shortener/scripts/smoke_shorten.sh` | +| BE validation | Optional line in `validate_be_services.sh` when deployed | + +--- + +## 16. Out of scope (v1) + +- Link editing after creation +- Custom slugs chosen by user +- Analytics UI +- Integration inside Android APK (use HTTP from BE or scripts first) + +--- + +## 17. Related docs + +- [DR — design review](../DRs/20100611_3_url_shortener.md) +- [INFRA.md](../INFRA.md) — FE → BE proxy +- [20260610_SERVICES.md](../20260610_SERVICES.md) — service catalog (add row when live) +- [ROADMAP.md](../ROADMAP.md) — post-alpha track diff --git a/docs/specs/20100611_3_url_shortener.pdf b/docs/specs/20100611_3_url_shortener.pdf new file mode 100644 index 0000000..ee6b600 --- /dev/null +++ b/docs/specs/20100611_3_url_shortener.pdf @@ -0,0 +1,540 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 32 0 R /F4 34 0 R /F5 35 0 R /F6 36 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 716.2874 84.37304 727.2874 ] /Subtype /Link /Type /Annot +>> +endobj +5 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 705.2874 77.26104 716.2874 ] /Subtype /Link /Type /Annot +>> +endobj +6 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 694.2874 104.373 705.2874 ] /Subtype /Link /Type /Annot +>> +endobj +7 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 683.8499 88.44754 693.8499 ] /Subtype /Link /Type /Annot +>> +endobj +8 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 673.8499 95.54254 683.8499 ] /Subtype /Link /Type /Annot +>> +endobj +9 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 663.2874 97.26104 674.2874 ] /Subtype /Link /Type /Annot +>> +endobj +10 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 45.68504 652.2874 138.629 663.2874 ] /Subtype /Link /Type /Annot +>> +endobj +11 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 45.68504 641.2874 91.03704 652.2874 ] /Subtype /Link /Type /Annot +>> +endobj +12 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 630.8499 125.55 640.8499 ] /Subtype /Link /Type /Annot +>> +endobj +13 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 620.8499 130.5525 630.8499 ] /Subtype /Link /Type /Annot +>> +endobj +14 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 38 0 R /Fit ] /Rect [ 59.68504 610.8499 121.7925 620.8499 ] /Subtype /Link /Type /Annot +>> +endobj +15 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 59.68504 600.8499 133.47 610.8499 ] /Subtype /Link /Type /Annot +>> +endobj +16 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 59.68504 590.8499 83.44504 600.8499 ] /Subtype /Link /Type /Annot +>> +endobj +17 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 580.2874 174.181 591.2874 ] /Subtype /Link /Type /Annot +>> +endobj +18 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 569.2874 105.709 580.2874 ] /Subtype /Link /Type /Annot +>> +endobj +19 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 45.68504 558.2874 119.053 569.2874 ] /Subtype /Link /Type /Annot +>> +endobj +20 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 39 0 R /Fit ] /Rect [ 59.68504 547.8499 87.19504 557.8499 ] /Subtype /Link /Type /Annot +>> +endobj +21 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 59.68504 537.8499 120.135 547.8499 ] /Subtype /Link /Type /Annot +>> +endobj +22 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 59.68504 527.8499 112.2075 537.8499 ] /Subtype /Link /Type /Annot +>> +endobj +23 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 59.68504 517.8499 102.63 527.8499 ] /Subtype /Link /Type /Annot +>> +endobj +24 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 45.68504 507.2874 94.59704 518.2874 ] /Subtype /Link /Type /Annot +>> +endobj +25 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 40 0 R /Fit ] /Rect [ 45.68504 496.2874 91.49304 507.2874 ] /Subtype /Link /Type /Annot +>> +endobj +26 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 485.2874 101.709 496.2874 ] /Subtype /Link /Type /Annot +>> +endobj +27 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 474.2874 87.92504 485.2874 ] /Subtype /Link /Type /Annot +>> +endobj +28 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 463.2874 141.269 474.2874 ] /Subtype /Link /Type /Annot +>> +endobj +29 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 452.2874 78.58904 463.2874 ] /Subtype /Link /Type /Annot +>> +endobj +30 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 441.2874 120.389 452.2874 ] /Subtype /Link /Type /Annot +>> +endobj +31 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 41 0 R /Fit ] /Rect [ 45.68504 430.2874 105.717 441.2874 ] /Subtype /Link /Type /Annot +>> +endobj +32 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +33 0 obj +<< +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R + 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R + 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R ] /Contents 74 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +34 0 obj +<< +/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +35 0 obj +<< +/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font +>> +endobj +36 0 obj +<< +/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font +>> +endobj +37 0 obj +<< +/Contents 75 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +38 0 obj +<< +/Contents 76 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +39 0 obj +<< +/Contents 77 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +40 0 obj +<< +/Contents 78 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +41 0 obj +<< +/Contents 79 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 73 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +42 0 obj +<< +/Outlines 44 0 R /PageMode /UseNone /Pages 73 0 R /Type /Catalog +>> +endobj +43 0 obj +<< +/Author (Android Cast project) /CreationDate (D:20260611175417+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611175417+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (URL shortener service \204 specification) /Trapped /False +>> +endobj +44 0 obj +<< +/Count 31 /First 45 0 R /Last 72 0 R /Type /Outlines +>> +endobj +45 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 46 0 R /Parent 44 0 R /Title (1. Purpose) +>> +endobj +46 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 47 0 R /Parent 44 0 R /Prev 45 0 R /Title (2. Scope) +>> +endobj +47 0 obj +<< +/Count 2 /Dest [ 37 0 R /Fit ] /First 48 0 R /Last 49 0 R /Next 50 0 R /Parent 44 0 R + /Prev 46 0 R /Title (3. Requirements) +>> +endobj +48 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 49 0 R /Parent 47 0 R /Title (3.1 Must) +>> +endobj +49 0 obj +<< +/Dest [ 37 0 R /Fit ] /Parent 47 0 R /Prev 48 0 R /Title (3.2 Should) +>> +endobj +50 0 obj +<< +/Dest [ 37 0 R /Fit ] /Next 51 0 R /Parent 44 0 R /Prev 47 0 R /Title (4. Architecture) +>> +endobj +51 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 52 0 R /Parent 44 0 R /Prev 50 0 R /Title (5. Authentication and trust) +>> +endobj +52 0 obj +<< +/Count 5 /Dest [ 38 0 R /Fit ] /First 53 0 R /Last 57 0 R /Next 58 0 R /Parent 44 0 R + /Prev 51 0 R /Title (6. REST API) +>> +endobj +53 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 54 0 R /Parent 52 0 R /Title (6.1 Shorten \204 GET) +>> +endobj +54 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 55 0 R /Parent 52 0 R /Prev 53 0 R /Title (6.2 Shorten \204 POST) +>> +endobj +55 0 obj +<< +/Dest [ 38 0 R /Fit ] /Next 56 0 R /Parent 52 0 R /Prev 54 0 R /Title (6.3 Error response) +>> +endobj +56 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 57 0 R /Parent 52 0 R /Prev 55 0 R /Title (6.4 Success response) +>> +endobj +57 0 obj +<< +/Dest [ 39 0 R /Fit ] /Parent 52 0 R /Prev 56 0 R /Title (6.5 QR) +>> +endobj +58 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 59 0 R /Parent 44 0 R /Prev 52 0 R /Title (7. Redirect and permalink behaviour) +>> +endobj +59 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 60 0 R /Parent 44 0 R /Prev 58 0 R /Title (8. Slug algorithm) +>> +endobj +60 0 obj +<< +/Count 4 /Dest [ 39 0 R /Fit ] /First 61 0 R /Last 64 0 R /Next 65 0 R /Parent 44 0 R + /Prev 59 0 R /Title (9. Database schema) +>> +endobj +61 0 obj +<< +/Dest [ 39 0 R /Fit ] /Next 62 0 R /Parent 60 0 R /Title (9.1 links) +>> +endobj +62 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 63 0 R /Parent 60 0 R /Prev 61 0 R /Title (9.2 bearer_tokens) +>> +endobj +63 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 64 0 R /Parent 60 0 R /Prev 62 0 R /Title (9.3 signer_keys) +>> +endobj +64 0 obj +<< +/Dest [ 40 0 R /Fit ] /Parent 60 0 R /Prev 63 0 R /Title (9.4 audit_log) +>> +endobj +65 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 66 0 R /Parent 44 0 R /Prev 60 0 R /Title (10. QR codes) +>> +endobj +66 0 obj +<< +/Dest [ 40 0 R /Fit ] /Next 67 0 R /Parent 44 0 R /Prev 65 0 R /Title (11. OpenAPI) +>> +endobj +67 0 obj +<< +/Dest [ 41 0 R /Fit ] /Next 68 0 R /Parent 44 0 R /Prev 66 0 R /Title (12. Deployment) +>> +endobj +68 0 obj +<< +/Dest [ 41 0 R /Fit ] /Next 69 0 R /Parent 44 0 R /Prev 67 0 R /Title (13. Security) +>> +endobj +69 0 obj +<< +/Dest [ 41 0 R /Fit ] /Next 70 0 R /Parent 44 0 R /Prev 68 0 R /Title (14. Observability and limits) +>> +endobj +70 0 obj +<< +/Dest [ 41 0 R /Fit ] /Next 71 0 R /Parent 44 0 R /Prev 69 0 R /Title (15. Tests) +>> +endobj +71 0 obj +<< +/Dest [ 41 0 R /Fit ] /Next 72 0 R /Parent 44 0 R /Prev 70 0 R /Title (16. Out of scope \(v1\)) +>> +endobj +72 0 obj +<< +/Dest [ 41 0 R /Fit ] /Parent 44 0 R /Prev 71 0 R /Title (17. Related docs) +>> +endobj +73 0 obj +<< +/Count 6 /Kids [ 33 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R ] /Type /Pages +>> +endobj +74 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1029 +>> +stream +Gatn&Df=)Y&B*Up6)ApU)eV;:@a#AG7t2bOm39YqF@KY%)N9sP^sXVFQ4kYr4a95US;2\c"Kp8#Yr-:^([!&*SBYO$s!96/GA4Z*^u3s\SHh.a:$,8/HL,AWG4M*gIPTn;JQ#K)X](K(NR)JM)N$,.4h:iAH=*sCp,+hi(]PloV'EgXRh[6>cG+[Eq;L+qp-$6N/+1R@?#fct.m6k9cmnfX(%[@#7g9DS,D)=$CRqA@S5rob<)Ja9QFpE"`Ah1L%hnW,Intss4n^*JqU%DmJJ\#h1Zef,\Wg-GXW"U4*r,MLr(BVC@r7Sk^nVL!-o@CQ[S*C>_Wd'FI3e=/&gFRI)VsF_UMbJ_Yg:UYi/It"5s^\)?+(dXQ?]mcg.B*2:T5.#ls-6@2XE8nr,;gfm^afVWd6k'O>+uXjdU6PYml'[YP]okna#G2;-RXfcSuBA>+5G!e+jiJ[U@0fk7g/eLtJb\4/N`j"TDnGg.\db78Tr_Im$BkgeYU%lWIhQ2~>endstream +endobj +75 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3500 +>> +stream +Gau0F>B?9+&q801ka/E7:M^0OTtR\[dt(2i:'rdLb]HYU-&=LtSbBj$V%:,I>/S+/qDPf4mgjr7--qK[u3)-A.\c9BV_7b>LK2`sVRGn'T2)9dSBHF$p&R,-YIb.aAF7`rL+kKj3&99N'k^eCPd_nh?!LLa2q/"CjS28s&P/$`t>aq+/8)YlVW[>5G:n46/XOre*ibVpAqa5/:rLd-1_q=#N1V_'.K\31%pRr9ui@OGm&2mRcB-Ps35Y&.:"!re>_>*;C;IC2'3!+FrFa@fiJA%t@Cp)Xikp6%:\]E-%_D$QQM^9IJC?SbHdmu0JN)TLV:^2_at2a+OK`p(LT:RAfY^`&3?2h:9OC<3!u8J9%0j)HV5a=f30LfQ[Y`q7_31Zb<\d'k#jS$ZsU9A=aQJNH?i]-t@rq9EHVne-c-j[QbZcO1V:hHl.PZs^IBJ$j*-W^V2HPJSMR4)cG'\W.[X5JfthjA+,aU;^7W,;RB*23WuD\:ZQ!/5oSQ3mdlS[?_;k`+7O^g;1!qfqG[4MF-XM=L!bU>[9ffK)7A37EiBAC1&/DVFI]"MmDNgOa-HPE_X%21s.A!%Qn]`b?amYH5hJB^uZM?X/:A/L^8A?X<=dC'i/9Fk%bG]O.JImdpBjS"5?`7OPjk]`^NmRq2%Y"L7IlH"!A.K0BCB'7""!T>O$bU_/BA=F02;n_2!<#@BU6M_eHhAjRUo\j;56]Qh6-L#Y\\F&OH[RN$d6G82?KU5jN")No&1(:)MO*_d9njeb7d_jZ^'m\t,R^"Gu/;\hUcO\jIYAI0]0#XZTj0nm-?ik;C3a>fkd,rROnJ,g.m%k7?C9PT9rtIrtFQK8)EJ$A7iSU4[&m'ciHR0i_:@;C@38=s04oRqN/>=b*\MBQ+WA.Em;MbR>0sIm]@jflk2u%WmggE>gZ`DI50k::WDI6*<95P`%-2j^Pt_\J^N=\S!C.O%$$UafTp"M"I*c8`k\5"3aEJT'0ob8dfrR.[(:o3(:elRSZOm;,``KqrIMT%C:h5V5bR#7,Zdd%60'j$SNnq("*B3-!h,rb&AOd?=-)+;'TNbpKt5]e&NTKLNJfdQjD`Z*HP?Z!g.AB<07O!2H7TdAi>FFqlfK1mP(TeD^ob=N#m1=Bt2#U)!f-F&=X/<5\GZ&4M0I5U*:jBZK8VkO2jG,553M?ZbtPm2Uc)Xs`SJ:EI]bd!E;I**BFS)gV8K.\7SKDp<.GA/B*cA?\6QD80;%NTY9^TKt\3Q2H5C+G8q?]bXZf]^c)ddOJ>=N!X]^(0!%;,aKF&b/:^QgHptaE_Vg0Tucp.0Q0QEL1@eJQ_&6seoU(W<*o5qu&5rb\DmB3FN-\:T(L_Lb;cZM2i"Ye0VGpoW9ljMhM%Hp)?Hl)cK`B'uo,d][C5e5UZp>ebLC;X,_KqTF&DJ9oQ?^0[pkW^k)G7m],oLCM@PMVj9r`p"TdRP-)o((ZUZ8+GZiDnPKKPV;:"=.99TJ:h(2n160:S7M.Ubn%NN&I-]4G6BX4*Aj1qJ*c]@dVk&e4*r_""?-L4F*,2b2c>cGq#>fAionb$hF7Zj$WfWRc^Fl\!=%[WWPBang&1Oj2I&b/9[6fp]fGNSZhQ6L)tOZK>u4&AC/Y(!Xq!dOaf*K_LD2S@!.2S0(A1nbL;bknuWTqk9rcgDYG1/#h^g,11*3ESem/MJc);n+3GBA?YqnTBWNL=W)1\lrj-J'2WQI.\oC;iJb:!0JtM([[9f1*`^F%dhPdXHcCG^gT]?W,^^8_aGsT9OI0+%JM(&k8T(INH5*+E=U?.2`/IQ12Db?"N6.Qck#]"!OO'I7cQX+flO+T2(u!JUYHLn=&Sl2!f3.Aag,@I.g>9#*j,ZG"VIl92X+t1W[i4p^+1?+f2Wi+VP>tOlmIZdR_3qpgBJh*i:5<"'<2dDq"fi@f(i-6+'P9=.?=6HhZq8HGN\W?4%OY(U#.(^.rSukG+L?mk.XF.sXCZPsm:`C;m;t/;[hHZsK_)=D1oBgCi.](FrX)hBW.PUkHE]`r&1ME!VR&+TURNSea$@=6FYH*MY6`j\rmdeJGI%B)A;P.P>^C+Bnc45Y.(lu$dghNM0MW.-3*b__fe6kNp\\]:n)hHi!aDuP'Q1G1X46eT9Z;+5BBeS,,l+j"Z0aM5NlO\p?@OChRe:&am=u03^8Qt'O>0iU%)7&,=h,JFkLgaRr^M_.#p8*IZ`,'%rHS!lMQLt^BQr2:Oa.oknL/8^`OnUfE[Gp1R/Ib4(pb9jWf'mED:QB&>g4P+['LkrNcTIVF@5>&Bu^@$2e7[@[M771)IR3)NGAAb`t(s#[p?qRJO#]4da;$/P-ncj1jkj2b?[\MbIO`cL890Eb;A;1t.D7R&&QgFljp6l+cOgF`oma/q_m[Ci';tZ4KLd)Fm9opm]gQ?p&]-kSr,n5eQqH1]SDgpf,*:TIVhG:C-YNXN>!/ppXCn8tP9*n34XaLZ3'qZA.8`T+8CMe7amXMT^*cM~>endstream +endobj +76 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3122 +>> +stream +Gb!#^lVHQ`(&uQd0qp-)[i<@/^U^'RO5.FUP\!E9og@5BYU@AI?[/)+MYQ(U`in$TSN(&YQITklB'.<_TAMY8$&S.A9)c4\KJ(;Yn=,(VN5dY!.>!/k[qI`bH9%.oSVen1L+4ZDdptb/9a/f_rUE(GZQSg0*)la+7-$m4[RX+`5Z'!`Og$:5B^EP]5_/kq6O(<"LZ%>0NISa$emn_[/2QS`/n)FhQt$IsShIJ;ohg%tn64d8Jo%1-P?6++:6JlSr7m,\eL).Ko(R?.A8+1oaEm(s2PT@U.Ae#^4<_tI,[3"Pnmd"@E^6uJXAK.*T\NREXXY;,ou&io%L1;.g6gkqIVV]NssnUDMiM)/I-_(,W-#3bpdE(Bh`S*h(;kj*2Hk&DBHZb^%?J-PJd>s*OW+Pc8SE/"scU6*=brE[2JK',S4s#F6#kVfY9lid;*$6f^;0UDhjd.cZ@,RV+8l+@3XDbrk'B,b1"[0S6%:.p]po$?'dmMVOe]Q=1`P-3u"i,l5J(Z]nc[eGk"/:=CCB]7]RgHn"c=WNSX*"_"f!lq_TMg;c16*5B>7>/o7)q:i5;/]Cf!EB-IjZHpjS`ne_)lJ&7%mWJ/YA*2).h=,ZjA`)AYusr0=_RBh.-b"RpDk>$iI%0Gq';"0=@9DCn6jFu/DQVj4LXf4csuFP-jXNTiZLS;-]]lkLb0[]^g=Mbr@(B8Z\U_`#s68,$)YAS;+)^;J#QilM$oAa.QU=rbHe/M\lcml@)GR,(P/tk*%b:*RkblF?V!LL-gTKp\/E&0RCRJ#;oC=e\^!1K*NUmT/j,=+/jXNF(q9hj+H,j6^9'oDPG_^Q7O,c6)db784c4Eh1F^P2[Ppuo$FE@ZW6n`11I@)aX2.^22n57]O&'&t&:OG>Wsd[3h%p/O6n#80olte-[='i?P'O8&@p>Ip+5O<*8G6,qfcd*?_;Lo9b*k+F/:Ok:(R:^AWZGn9kh#=JilGe]@UitLpSkde313Me6qi"E$M\*86mK^J'JLJZ5:N/KM\9-MRoUTHl-,GY)=PqW>#lj>M8`&SmiNN[YdudX!S"8NaH1V^L.,@VaTd6K^H[_]"7(goU&*rif-@55YBbilei=\@>Vo%g`:EY3j_JkLYI('m%$[[Rki@-@o;n`8)UpL+tklSk:l3s2:iZVgjHQ+S69MLU*;f9Q)M?1J')g3D1>XK!2%L!D#8(KKB'q*`%Vec,9$sZV@fZb_-Q'2L9N*GlYMRoG&,*TSos`q=&JK$X?Q!Mc=fi_KqWl3AjQP"3Q8i`-f68bd6P;-Oa$I+.t6qQZa4"4WXIKZ?aGS1HT"&*P78?5Q'U=uF5s2T4N+PrW+Se[bpIBF;&8p'm!#A6giHloCcd"S=AfNHo0ERh8f@K$etlDIZrb7aL@WCR@t^cl"C2%aDSFs:+$NGEP'Da]r__XfO`ON!+[OXa.%fj6"W-Jd7luII8-+E3Q\5Yi7X6-G.:O$hjV$3>8>\FCh5$!U0AQ6>Y")15!Mc427a?iIHklAAKs,6-ja6GLA/b.FRS/'Hj7P$RDnJh&>XfiJ,;oNqj=iYD`_QKL$C]rhHtF&P:^BjgBK=R^1u:TFXtt';slhqFLFH?XfCV26q&u.7#65la&0^"7-?W1oicp9O9O$6'JVj>$j8_U#k7O,EtGhK=c]VN>7bt!*U"CZ?IC[l_M7aTKrZ,tGMLJq"o9+rCll85"\p,*AY8n@S:K"`Q73N,&m1=e60[5*A4MZm@RUZ$S#-E2%N$N-d\TjU/%[FD($\Tl2]>A%#>&I!!>\/!.q8Ll\=JEh(ge_P]oFb"VMH#[Iu=Jr,M\;jp!#Bkge>m3DS`r5EW">!6`d*:Fa%=YO(eP3KdQep.46]jJp6cV2j#-Xm$IBqe[Gd+!kC;\8hn9/Y@Hjah(-R$MRdQ)Dr$S!0H.?dHk#H+S`7ll97h8V3q<8UGG%/F7rtN$$3,7D!^UUinN^hL`iSDcJ\n^SKN[Y7NQIUKT?$6oCpXt~>endstream +endobj +77 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3400 +>> +stream +Gb"/)qet61&cUU9`P@65b132qHqErR./Zm]j_VnuPbLFn$8f;V(fR6ILEAZas7Xb/-#+_u9.).qoUs,8\\#2[1HXKA1F)u=5:$2C0*0A=d!eK8-nq4nd3K1@f?bHYI6Ad":STG^.adcj_&oP/_m!.(]8EVh+K;4]GIeo>FN)`8K_$F\%3ln?FAl(n@_`qW6:bPY1Wj7#U5uDCl6E,,2;l7@;'n:O(mi]VY+Zr%X",ibX-s:T@S:dQfPdD;e?0.#;R7iW7TE=_7V54P]p0$MjlsQ(99c)\&kjXFAHr]n%HB)qrg?@TKV,Y?U)T9NO\J-X8lbBXnbBOnYUZ+TdI9935k#5jI+P!3ZE*$=iNH=GWA`:hHrr[$6:k1U,1h`)e^Idi.'[V-75/FEq6.EGH%nEG"cnl!oeSp9DQ9#/Mi6G*1qi5bqRt(i.MA1X@kX:P*`c-ZZ00UDBaB/!6Q@FM9H@fAX$$U[eCgT>UXN1.2uV.&5Id/RpWeN,iF*0%c+n%L*7dr-Z%E#e$rbRqFm*"-Fn>og4hL,h:-T8m&*lPQ4JrPfLMAI8`q!_-\AU`IK]'A&je4'\fa=%*5>oL]3l'b*^Q.h-`'1uMB1!WSDm<]AU1jpa^[ZU;NO>$e:SWldeC:=``X'^_MPj(l5:FEQ)ed4qImLSQ)_,#fnRE$D=a,AAJh4\7q!Dd29tYuO;hqTRS3OYIb49XF0N9N+q];6;qYl.)i;qG3UHNS)LeWk,&IQhQ!ed-XTQC6FS`2/hk+ho:&TCd4;*s1`-K6JQB%'n#1BY0K4g[YI([BYQS^u"^f3H%P#n"i$C)^-iPYV1WR$"Z/Zm$-gQc>%Y2A.ZuUF:,F:)5hCW/E_,'n:GogJaYbj=+/Qb+Ee(TrW&E64I[A>V<,#*$UiJSHmeaoEc.@BhEolXfrdDh'ufe,;a:7..T=M!p(Ee!hejM,?R6Nr@XkD'[Y42q?U?>od$9WeW.n3n+*<+N4R^(T1Zo9(qp'$3h6cFe']PM[1F-O3UB_tTLm%S(7]_H;d`^V1odOhFY@2/1DJ&0jU3':hM$*N0K\O>.FI7r!VGamL&b`![9ELE"8NDVUh]Xk!kGj1<*HuU64h*dU+#aPXV]'kmqEJ*>2mU.@rL+iirhP,V'*k%R8001KE^6Xa9?UAnBp3UQ5K]=kn2HE4`1G'Wfj-F#/NX^I29T7:YbsZ1lQ^W!_t+3B'DiLHuJQcHpcEWUG1HQf87bGnJ;);Qq?QmT%bAfqYc9=Qg,p.$>sWCD`j*_Q"M'47Eh_h4uS/:K_RnOF#'UJ9U3](lLV_Iacj.H=Qd$>%#jafC+\TOi^J\mq=LeFSWD35WmlZddMRgMO*l?Q]qSO9&PG6+)350WUT(m[G[u6O3kb_!qO!BbQHka!,AS($68!ngBD=8Be>%hW6$`n^_*q,X/cSL%3F,dM_iUJt-`odICPG%etE]+U'ilWN'a&KkC2"dYq*))iAQZ*jXJOQMU[9'AO-%qGu%YF3f8ZT#t&?sW7n'4_T,r#k,,I]skE*plF:LcLpBh"7=c@Abj`!QAAQ/o*8MEIIcN;<5!Le]ks=RA,r[+r1J-N$>G?,FU-`C/)!=.5ehFj7G/7]a634Y,bk\S:cR!jT/c8%,%P]K91@@R66Vb1&b>a.n;TP.oQGDUJTpJmn"t.,!?*AaSU5d$;;9.Bp-[7]6nAkA+CO"[+ifuYUNRd[&1qa40&p(DU7fjXUB>j*3EjdTn@3Nc+`M3"l%iKIG80L@WnQ-Tlt4"Lib_AP':SeW\4G"F!DG9(5RkcO69_[qBN$G+c+*F#Q>,6=Nhs7G?/q+e.Y<&.=s/'Q#Q[KMQCl)Am:(Tb\$8V0KVLMQ5Ku4ON%lD4tis!8IZJ&4A/Oi&7l+oN2cF\l]'mJge9,>HOhkTkH,dUU0A/$%0KuMQU@2d+(1h%-@$Co%HHPG1s.VXcC:La_%X.hu!+Cn)`BuSY/8M;WGoajJGG>EEBU)1.QQ"CVBVE%qYgJus.7+l)#\6('KSBLLtiOLP-AB-%k`UMS).QN,@62;rUkM<>=qZ`IGTS8?a)!p,Q'Tepk-V2^OB+`1>d?sgf$G#Ft,bi!*!0XaXTI8NSTj@Y5aN6dJ%p%WLRVq91sPOendstream +endobj +78 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2851 +>> +stream +Gb"/)CJWt](B)O^\0'0UNT9RkN-6KcBKEI2kR_o\V+A\GQ,J;b)r%&JZeGGnf1t\bNZV7*7\`tADMVRuVlEM*cFGA*,6!\bpM:$&B`e7Z"Gd2E3=nVU?ucDePG@:cZHK3bJg_9I1i7ab"pu,=;WFBWETG--A.]Mu+@noKi0_Rs:mh9),RcM,2\[\?9hQ)3W`0R5<&u-481Uo^FMQGVL!IUF:fWJ1J$pTFJ-VB&oQ$oM2=RCk]H*^'I64+\K38_SdDV)pIQG$,%'M<$pNrbEMJE]AiS0O,9_9`d[f`seRLurpki#$-l![sH=_u(68-X!\CYrUh%6ln#De/gN2lKV7lSE00)MX4,iJ6Td]1`qRk3eKP7O[RR>^s)W=Y"V>k$dDS)cjk*TR#K\%57Oc5F*2pbad.m\TT/./$ONBs1]W^L86=LJb%^gjcQ4Q[mWN?Y_'!lESq>aA9'_+a<('>@PME5[T[I^o'!iT5k85Dr8fK06[^jQ+%DQ-6[`gP9>e;G*q=^llf+'>+-._.VOQo>\KQQkW1`V$2,8+;jsD%FCO!DdL["GHKP?gipjPoVH[>P;V(WlhBOn1`9;T%S=nRbO:89.+"V*;9#^NP-4K@+blM_%OF-kK(u>*Jm2a&<,tS>gjZ@RLM1=X9=1N7@m_R+(\&fHq)s+FmJ-i)N7K$,?MK")Nq2E+NTE>"[Q4dJ^P=*-jCTiK+Vr)]/i&O5ctSdZiF0_-ORB6_2&l^lL71B[lPARJm07e-j>GGZR!?ml.*TUWF/.WB>%dDIiY10)kV-R+4u-7?:oul2B]*@5p:e?X-rs(lU9(.\YJjs(!oo1qNVK4@YZ%&s+o\gT;(7M?^FZjRIS>a*a].HNXBCE?iSMT0U1$SmH$i"jl%[:;/qpLJ^Del4on?1*$63i9u5U>lU-80>lMrh+!S;e]tb%7mpYka\Dd2XW?WN>a(a!\aIShb;UcaTG_Oi6UPK5kg,/a0/u;SSgK6A$mcL!A5NlD4#dFS^E9ri1`KWM:]lifc!OF:Kg!s&l1]uKU6LCSb9!kJR;'LNO5;'+3k!YeAO13@K9El3*KX^5!c8?V@rYPQ03*I&JL("CA"nKYBn5(;;=\NYJE`FA]=;.&G\2#6X"iE&R[+rLh35;nS]j4@Tt_m`QMXbMmD%P\kcIUHL"pGQC9E!gL^$MXbuS&ciriR_3Z0jgO:U6TJI8#&u)nl6'o^Tr=1g/]e4G0./W7Fn^^=d*UNMl`p]L(r,'A0gGMoYgqkXAepC_AEgt2Ehc1(8lCXu./K1$8K=:4kJse7'reM.E"R2@bKNZ<`(ubKtZnL`?9sei*?E9D=r%u3M[&;b%[,c,fJIa0$*6knSF(hT@^TM6mc+p1QdW[^?W,421Qr=u+Wd<2t)+6.:pZ7AJomOAcjXh_9Frc<#u2s0%m;"&]i_;3TK^g@?=q"Dl_d-%h8@QLFj[eGRtHUchQ!knpu-p]R*O&<,epiMWFL+p(W$BK;sTgi>8?pPZJ#8'>H&R;_3pB5#d:79c.48ib;[/ZdH+K='oQLm.%E]^l1#T%,di1R#gi0pK&])(,h3:gBS+jgV?f8]ri.#Dm)a1&$aGCak&FN-(nr:$N>%u%RhrO^tkMuJ4coCK_nJRZ3,75X\FFIno,-1^9qnJ*e-8ObSmKFqM+/5CdE]"tY$gd'Z;T4?H9b?tma(CM/$V&5[O$.<3XDe=hWAf5jF*YI>MVs`g:OJ*gc(%gd;g5#TDC&8,oeBHSZ0"V$CE/o.:PQlOHgLL)gYVB3SGn&'3(E1V['8G(qC,IO.1UPZegRC:38D(jtWH`Sf?is`-]2\3ZFA(ZD+"*MRjJqE:cBTKd2o~>endstream +endobj +79 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2766 +>> +stream +Gb!#^gN)%.&q0LUoV45.O9Bg#4?9Z0nZJF-,\5h],V<5A4PR*UF^<6GI1+rM@=42:\d3l/&h$a5lW:HU"D4`oig2a%\%Y)9[JFk<['sn:iM>/TW`CP`'=+a<@J`nSd8-eu`T!EVC#48B-$Dp,`9C]lll$l,dq'H[0o$Le(-Q-lA]!.Y0kJ0SSqMDBifA,BMMrof1g33ZL,h)J&RVEgrk'9@^1F5>l]&XKI(R_f;>.W)c]%%"/JW>t-)!l)0OQY_=GcYt&$c:gHQjGZP[2q62DC4VT[euSOF)Nft_:@ZH99P3'/fkY6XO?fAC1WjAb_kWpSX$gjG9=$VDS,(C\EYf[&$%OHJOrD="W)]GW)<[p!?huKJ>ir*7%tR;.1>*k$,Mcu[KK1(Tq:$p&[@8?h*KIV-%NG+rA[pK,s/?r&&#!ri2qBpW;=jcOuC;FFPbLEIDlB5E+OWC'laPc/H09)njL>MRcAXW->0h_K/aB=VV"gIm[mM$._&[+"((s?s8>(-4R-*.Jc5&b+"*Kd:DM,WDR!D/`\9$"C'4,n)`rX5+q9DD:"gW)a(bmjd-_H/Q:"2oG"1u#*,o\JgoVSB2`h-:<":%%fbqT'Ee)_Wd*`,prd&jTVop!rLZ3.tYl0%/%;G]A?li9/EADJ*2sP@9)*qFet^=5-]@??u#!lZ8`2L'ET/.B_AB-D?TaPPWu)b(^4/ZEj;f):U2C'N;u?ZGd/\aX`7Q]"!t*^REZCRHZhD5Pk(:^N-UMC.!t2(r0Bj]B"IcOdEVF!A*CXBFm=+j&T$@s]32[cbjiVfe_<[W]toAKJsA%RY-l.^O7H@0]K_O&L\#a3#bFUqC88p8,]L7"6k0]@'#256aTZ-@3eJkoJdYjRo6(sm#'9X_c+#imiG(lP15:@q.\F^XJF'@sKc5U,Bfrulp=pjE8a'e4hnNPd3ZqpAY#[YXpM2=3S7\^\md2aVZWEkjP@PQINi[jpe$]U'icJm@nr."NBDVo9F`qGpIbrHI7TP^\dYG?46'&rK_LP7(WNmVP7RTe',XR[^!k:k*>\A""gWLskmh,SW,TiePM^fm/i+lcpUD3;YL^Zjnb*Qc`:4S^sJ&sq_XmeRU$E#Btkiu2s;BJ5]M0pI0J2I91bZm-$?XqfrV_q[W>HDK<&1YY@0.?)_%50,g+dG1p6kIZrW^%A?T)F'`DPsI(_]C;Qs3?6VrW!4/kc35;">LT#ASR^FaZBmSr+KZ3S.O**`#.bA$\,1b4-N%+EY_qc(sL2N;1ARD=ssib04;eBF(qRZ=dc[tA]^h0i:m*l6e6?^[VDVk['5E&VO_HSgoj/&'ptQH/m&qiaB_E(AlQ4i"lMK)"Fk"0_#f(64c5bE+M"P#;nI]r4ceE0>#Z".kHDgkaFi#,3bnWIIAD$urs/\lT>aGcI1'RD/!lFm>Nf0s'3;OK*i;p&_A45j>E-f#`dqHj_4Vit=>n?ar<7e^VfcRCpr6(Q8(mp*b:Hp7[7EWg80oVLoL1W:Rd:")5+_Q,)#lU6ZBn5sOWW1<$p+Al"27Mc^:=`mI4_4UUCY>)5N)J-?b#_F3ddJlmU1eI7U:Hd\_33(Qpj=_VR*HGFYrC(O0eSdb-mkkk1pmJ1&L=i'@Sf=dS;<8V`u:At>P@!_Y~>endstream +endobj +xref +0 80 +0000000000 65535 f +0000000061 00000 n +0000000146 00000 n +0000000253 00000 n +0000000365 00000 n +0000000513 00000 n +0000000661 00000 n +0000000808 00000 n +0000000956 00000 n +0000001104 00000 n +0000001252 00000 n +0000001400 00000 n +0000001549 00000 n +0000001696 00000 n +0000001845 00000 n +0000001994 00000 n +0000002141 00000 n +0000002290 00000 n +0000002438 00000 n +0000002586 00000 n +0000002734 00000 n +0000002883 00000 n +0000003031 00000 n +0000003180 00000 n +0000003327 00000 n +0000003476 00000 n +0000003625 00000 n +0000003773 00000 n +0000003922 00000 n +0000004070 00000 n +0000004219 00000 n +0000004367 00000 n +0000004515 00000 n +0000004631 00000 n +0000005045 00000 n +0000005151 00000 n +0000005229 00000 n +0000005313 00000 n +0000005519 00000 n +0000005725 00000 n +0000005931 00000 n +0000006137 00000 n +0000006343 00000 n +0000006430 00000 n +0000006745 00000 n +0000006820 00000 n +0000006912 00000 n +0000007015 00000 n +0000007164 00000 n +0000007254 00000 n +0000007346 00000 n +0000007456 00000 n +0000007578 00000 n +0000007723 00000 n +0000007825 00000 n +0000007941 00000 n +0000008054 00000 n +0000008169 00000 n +0000008257 00000 n +0000008387 00000 n +0000008499 00000 n +0000008651 00000 n +0000008742 00000 n +0000008854 00000 n +0000008964 00000 n +0000009059 00000 n +0000009166 00000 n +0000009272 00000 n +0000009381 00000 n +0000009488 00000 n +0000009611 00000 n +0000009715 00000 n +0000009833 00000 n +0000009931 00000 n +0000010027 00000 n +0000011148 00000 n +0000014740 00000 n +0000017954 00000 n +0000021446 00000 n +0000024389 00000 n +trailer +<< +/ID +[<475ca66bc5e001998636d1469a46808e><475ca66bc5e001998636d1469a46808e>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 43 0 R +/Root 42 0 R +/Size 80 +>> +startxref +27247 +%%EOF diff --git a/rebuild.sh b/rebuild.sh index 6f9e27d..88b9810 100755 --- a/rebuild.sh +++ b/rebuild.sh @@ -29,7 +29,8 @@ for arg in "$@"; do echo "Usage: $0 [--skip-tests] [--no-reconnect] [--java-home=PATH]" echo " Builds debug APK, runs unit tests (unless skipped), reconnects adb (mdns + HTTP" echo " :5039/adb.json + known IPs), installs on all adb devices, and launches the app." - echo " Env: RECONNECT_KNOWN_DEVICES=yes|no (default yes), DEV_ADB_HTTP_PORT=5039" + echo " Env: RECONNECT_KNOWN_DEVICES=yes|no, DEV_ADB_HTTP_PORT=5039, ADB_TCP_PROBE=yes" + echo " ANDROID_CAST_JAVA_HOME=/path/to/jdk-21 (avoids JDK 25 warning)" exit 0 ;; esac @@ -70,6 +71,11 @@ if ! picked="$(pick_java_home)"; then fi export JAVA_HOME="$picked" +if [[ "${RECONNECT_KNOWN_DEVICES}" =~ [yY] ]]; then + echo "==> Pre-build adb reconnect (HTTP :${DEV_ADB_HTTP_PORT:-5039}/adb.json)" + adb_reconnect_all "pre-build" || true +fi + # shellcheck source=scripts/android-ndk.sh source "$ROOT/scripts/android-ndk.sh" # shellcheck source=scripts/native-build-cache.sh @@ -124,15 +130,18 @@ if [[ ! -f "$APK" ]]; then fi if [[ "${RECONNECT_KNOWN_DEVICES}" =~ [yY] ]]; then - adb_reconnect_all || true + adb_reconnect_all "post-build" || true fi mapfile -t DEVICES < <(adb devices | awk 'NR > 1 && $2 == "device" { print $1 }') if [[ ${#DEVICES[@]} -eq 0 ]]; then echo "ERROR: No adb devices in 'device' state after reconnect." >&2 - echo " Enable dev setting “ADB over Wi‑Fi keeper”, grant WRITE_SECURE_SETTINGS once via USB," >&2 - echo " pair wireless debugging once, then retry. Or: curl http://DEVICE:5039/adb.json" >&2 + echo " Empty curl = app/keeper not running on that device (install once via USB)." >&2 + echo " Check: scripts/adb-reconnect.sh adb_http_status 192.168.33.39" >&2 + for _hint_ip in 192.168.33.39 192.168.33.106 192.168.33.153 192.168.33.173; do + adb_http_status "$_hint_ip" 2>/dev/null || true + done exit 1 fi @@ -140,12 +149,14 @@ echo "==> Installing to ${#DEVICES[@]} device(s): ${DEVICES[*]}" FAILED=0 for serial in "${DEVICES[@]}"; do echo "--- $serial" + adb_prepare_device_for_deploy "$serial" if adb -s "$serial" install -r "$APK"; then echo " Installed" + adb_prepare_device_for_deploy "$serial" adb -s "$serial" shell am broadcast \ -a com.foxx.androidcast.dev.REFRESH_ADB_WIFI \ -n com.foxx.androidcast/.dev.DevAdbWifiReceiver >/dev/null 2>&1 || true - if adb -s "$serial" shell am start -n "$LAUNCHER" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER; then + if adb -s "$serial" shell am start -n "$LAUNCHER" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER --ez after_deploy true; then echo " Launched $LAUNCHER" else echo " WARN: launch failed (app may still be installed)" >&2 diff --git a/scripts/adb-reconnect.sh b/scripts/adb-reconnect.sh index cc418a1..3cbc195 100755 --- a/scripts/adb-reconnect.sh +++ b/scripts/adb-reconnect.sh @@ -1,12 +1,19 @@ #!/usr/bin/env bash # Wireless adb discovery + reconnect helpers (sourced by rebuild.sh). -# Discovers endpoints via: connected devices, adb mdns, HTTP :5039/adb.json, cache, static hints. +# Priority: app HTTP :5039/adb.json → avahi → cache → mdns → :5555 hints. +# Only IPv4:PORT is used for adb connect (no mDNS service names). -: "${ADB_CONNECT_RETRIES:=4}" -: "${ADB_CONNECT_DELAY_SEC:=2}" +: "${ADB_CONNECT_RETRIES:=3}" +: "${ADB_CONNECT_DELAY_SEC:=1}" +: "${ADB_TCP_PROBE:=yes}" +: "${ADB_TCP_PROBE_SEC:=1}" : "${DEV_ADB_HTTP_PORT:=5039}" : "${ADB_CONNECT_CACHE:=$ROOT/.adb_connect_cache}" +: "${ADB_HTTP_CACHE_DIR:=$ROOT/.adb_http_cache}" : "${ADB_RECONNECT_POKE_DELAY_SEC:=2}" +: "${ADB_MDNS_AUTO_CONNECT:=adb-tls-connect,adb}" +: "${ADB_KILL_SERVER:=no}" +: "${ADB_DISCONNECT_BEFORE_CONNECT:=no}" declare -gA CONNECTIONS_LIST_HINTS @@ -25,7 +32,7 @@ adb_hint_key_for_ip() { adb_ip_for_hint_key() { local ip=${1} - ip="$(echo "${ip}" | sed -e 's/@_@/./g' -e 's/:.*//' | tr -d '\n')" + ip="$(echo "${ip}" | sed -e 's/_/./g' -e 's/:.*//' | tr -d '\n')" printf '%s' "${ip}" } @@ -36,6 +43,31 @@ adb_hint_for_endpoint() { printf '%s' "${CONNECTIONS_LIST_HINTS[${key}]:-}" } +adb_endpoint_host() { + local endpoint=${1} + if [[ "$endpoint" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+): ]]; then + printf '%s' "${BASH_REMATCH[1]}" + fi +} + +adb_is_connectable_ip_port() { + local endpoint=${1} + [[ "$endpoint" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+$ ]] +} + +adb_tcp_port_open() { + local endpoint=${1} + local host port + host="$(adb_endpoint_host "$endpoint")" + port="${endpoint##*:}" + [[ -n "$host" && "$port" =~ ^[0-9]+$ ]] || return 1 + if command -v nc >/dev/null 2>&1; then + nc -z -w "${ADB_TCP_PROBE_SEC}" "$host" "$port" >/dev/null 2>&1 + return $? + fi + timeout "${ADB_TCP_PROBE_SEC}" bash -c "exec 3<>/dev/tcp/${host}/${port}" 2>/dev/null +} + adb_collect_candidate_ips() { local ip endpoint key if [[ -f "$ADB_CONNECT_CACHE" ]]; then @@ -54,6 +86,12 @@ adb_collect_candidate_ips() { done } +adb_json_valid() { + local json=${1} + [[ -n "$json" ]] || return 1 + printf '%s' "$json" | python3 -c 'import json,sys; json.loads(sys.stdin.read())' 2>/dev/null +} + adb_json_connect_lines() { local json=${1} [[ -n "$json" ]] || return 0 @@ -66,33 +104,75 @@ try: data = json.loads(raw) except json.JSONDecodeError: raise SystemExit(0) +tls = int(data.get("tls_port") or 0) +if tls > 0: + for ip in data.get("ips") or []: + if ip: + print(f"{ip}:{tls}") +import re +IP_PORT = re.compile(r"^\d{1,3}(?:\.\d{1,3}){3}:\d+$") +def ok(ep): + return bool(ep and IP_PORT.match(ep)) for item in data.get("connect") or []: - if item: + if ok(item): print(item) for item in data.get("commands") or []: if isinstance(item, str) and item.startswith("adb connect "): - print(item[len("adb connect "):]) + ep = item[len("adb connect "):] + if ok(ep): + print(ep) ' 2>/dev/null || true } +adb_curl_adb_json() { + local ip=${1} + local json cached="${ADB_HTTP_CACHE_DIR}/${ip}.json" + json="$(curl -m 5 -sS "http://${ip}:${DEV_ADB_HTTP_PORT}/adb.json" 2>/dev/null || true)" + if adb_json_valid "$json"; then + mkdir -p "$ADB_HTTP_CACHE_DIR" + printf '%s' "$json" >"$cached" + printf '%s' "$json" + return 0 + fi + if [[ -f "$cached" ]] && adb_json_valid "$(cat "$cached")"; then + cat "$cached" + return 0 + fi + return 1 +} + adb_fetch_http_endpoints() { local ip json for ip in $(adb_collect_candidate_ips | sort -u); do [[ -z "$ip" ]] && continue - json="$(curl -m 3 -sf "http://${ip}:${DEV_ADB_HTTP_PORT}/adb.json" 2>/dev/null || true)" + json="$(adb_curl_adb_json "$ip" 2>/dev/null || true)" [[ -z "$json" ]] && continue adb_json_connect_lines "$json" done } adb_discover_mdns_endpoints() { - local line name service hostport + local line hostport while IFS= read -r line; do - [[ "$line" == *"_adb._tcp"* ]] || continue + [[ "$line" == List* ]] && continue + [[ "$line" == error:* ]] && continue + [[ "$line" == *"_adb"* ]] || continue hostport="$(awk '{print $NF}' <<<"$line")" - [[ "$hostport" == *:* ]] || continue - printf '%s\n' "$hostport" - done < <(adb mdns services 2>/dev/null || true) + if adb_is_connectable_ip_port "$hostport"; then + printf '%s\n' "$hostport" + fi + done < <(adb mdns services 2>&1 || true) +} + +adb_discover_avahi_endpoints() { + command -v avahi-browse >/dev/null 2>&1 || return 0 + local svc + for svc in _adb-tls-connect._tcp _adb._tcp; do + avahi-browse -rpt "$svc" 2>/dev/null | awk -F';' ' + $1 == "=" && $3 == "IPv4" && $8 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ && $9 ~ /^[0-9]+$/ { + print $8 ":" $9 + }' + done } adb_pull_device_json_endpoints() { @@ -111,45 +191,113 @@ adb_pull_device_json_endpoints() { done < <(adb devices 2>/dev/null | awk 'NR > 1 && $2 == "device" { print $1 }') } +adb_endpoint_rank() { + local e=${1} + if [[ "$e" == *":5555" ]]; then + printf '9' + else + printf '2' + fi +} + +# One endpoint per IPv4 host; keep best rank (HTTP/avahi TLS beats :5555). adb_discover_endpoints() { - local endpoint + local endpoint host rank best_rank existing declare -A seen=() + declare -A host_best=() + declare -A host_rank=() local -a ordered=() - add_endpoint() { + consider_endpoint() { local e=${1} [[ -z "$e" ]] && return 0 + if [[ "$e" == *_* && "$e" != *":"* ]]; then + e="$(adb_ip_for_hint_key "$e")" + fi + [[ -z "$e" ]] && return 0 + if ! adb_is_connectable_ip_port "$e"; then + return 0 + fi + host="$(adb_endpoint_host "$e")" + rank="$(adb_endpoint_rank "$e")" + if [[ -n "$host" ]]; then + existing="${host_best[$host]:-}" + if [[ -n "$existing" ]]; then + best_rank="${host_rank[$host]}" + if [[ "$rank" -ge "$best_rank" ]]; then + return 0 + fi + seen["$existing"]=0 + for i in "${!ordered[@]}"; do + if [[ "${ordered[$i]}" == "$existing" ]]; then + unset 'ordered[i]' + fi + done + ordered=("${ordered[@]}") + fi + host_best["$host"]="$e" + host_rank["$host"]="$rank" + fi [[ -n "${seen[$e]:-}" ]] && return 0 seen["$e"]=1 ordered+=("$e") } + # HTTP first — matches curl the user runs manually. while IFS= read -r endpoint; do - add_endpoint "$endpoint" - done < <(adb_discover_mdns_endpoints) - - while IFS= read -r endpoint; do - add_endpoint "$endpoint" + consider_endpoint "$endpoint" done < <(adb_fetch_http_endpoints) while IFS= read -r endpoint; do - add_endpoint "$endpoint" - done < <(adb_pull_device_json_endpoints) + consider_endpoint "$endpoint" + done < <(adb_discover_avahi_endpoints) if [[ -f "$ADB_CONNECT_CACHE" ]]; then while IFS= read -r endpoint; do - add_endpoint "$endpoint" + consider_endpoint "$endpoint" done < "$ADB_CONNECT_CACHE" fi + while IFS= read -r endpoint; do + consider_endpoint "$endpoint" + done < <(adb_pull_device_json_endpoints) + + while IFS= read -r endpoint; do + consider_endpoint "$endpoint" + done < <(adb_discover_mdns_endpoints) + local key ip for key in "${!CONNECTIONS_LIST_HINTS[@]}"; do ip="$(adb_ip_for_hint_key "$key")" - add_endpoint "${ip}:5555" - add_endpoint "${ip}" + [[ -n "${host_best[$ip]:-}" ]] && continue + consider_endpoint "${ip}:5555" done - printf '%s\n' "${ordered[@]}" + adb_filter_endpoints_by_tcp "${ordered[@]}" +} + +# Drop closed ports (fast nc/bash probe). If none open, return candidates anyway. +adb_filter_endpoints_by_tcp() { + local -a all=("$@") + local -a open=() + local e + if [[ "${ADB_TCP_PROBE}" =~ ^[nN] ]]; then + printf '%s\n' "${all[@]}" + return 0 + fi + for e in "${all[@]}"; do + [[ -z "$e" ]] && continue + if adb_tcp_port_open "$e"; then + open+=("$e") + else + echo " probe ${e} — closed (skip)" >&2 + fi + done + if [[ ${#open[@]} -gt 0 ]]; then + printf '%s\n' "${open[@]}" + else + printf '%s\n' "${all[@]}" + fi } adb_poke_refresh_broadcast() { @@ -162,21 +310,86 @@ adb_poke_refresh_broadcast() { done < <(adb devices 2>/dev/null | awk 'NR > 1 && $2 == "device" { print $1 }') } +# Wireless TLS adb often shows as adb-xxx._adb-tls-connect._tcp, not IP:port. +adb_resolve_device_serial() { + local endpoint=${1} + local serial state host count=0 last="" + if adb -s "$endpoint" get-state 2>/dev/null | grep -q '^device$'; then + printf '%s' "$endpoint" + return 0 + fi + host="$(adb_endpoint_host "$endpoint")" + while IFS= read -r serial state; do + [[ "$state" != "device" ]] && continue + count=$((count + 1)) + last="$serial" + if [[ "$serial" == "$endpoint" ]]; then + printf '%s' "$serial" + return 0 + fi + if [[ -n "$host" && "$serial" == *"$host"* ]]; then + printf '%s' "$serial" + return 0 + fi + done < <(adb devices 2>/dev/null | awk 'NR > 1 && NF >= 2 { print $1, $2 }') + if [[ "$count" -eq 1 && -n "$last" ]]; then + printf '%s' "$last" + return 0 + fi + return 1 +} + +adb_parse_connect_serial() { + local out=${1} + if [[ "$out" =~ [Cc]onnected\ to\ ([^[:space:]]+) ]]; then + printf '%s' "${BASH_REMATCH[1]}" + return 0 + fi + return 1 +} + +adb_host_has_device() { + local host=${1} + local serial + serial="$(adb_resolve_device_serial "${host}:1" 2>/dev/null || true)" + [[ -n "$serial" ]] +} + adb_reconnect_endpoint() { local endpoint="$1" [[ -z "$endpoint" ]] && return 1 - local attempt out hint + if ! adb_is_connectable_ip_port "$endpoint"; then + echo " skip ${endpoint} — not IPv4:PORT" >&2 + return 1 + fi + local attempt out hint resolved hint="$(adb_hint_for_endpoint "${endpoint}")" [[ -n "${hint}" ]] && hint="(${hint})" - echo " adb connect ${endpoint} ${hint}" - adb disconnect "$endpoint" >/dev/null 2>&1 || true + if [[ "${ADB_TCP_PROBE}" =~ [yY] ]] && ! adb_tcp_port_open "$endpoint"; then + echo " skip ${endpoint} — TCP closed ${hint}" >&2 + return 1 + fi + resolved="$(adb_resolve_device_serial "$endpoint" 2>/dev/null || true)" + if [[ -n "$resolved" ]]; then + echo " ${endpoint} already connected as ${resolved} ${hint}" >&2 + printf '%s' "$resolved" + return 0 + fi + echo " adb connect ${endpoint} ${hint}" >&2 + if [[ "${ADB_DISCONNECT_BEFORE_CONNECT}" =~ [yY] ]]; then + adb disconnect "$endpoint" >/dev/null 2>&1 || true + fi for (( attempt = 1; attempt <= ADB_CONNECT_RETRIES; attempt++ )); do out="$(adb connect "$endpoint" 2>&1)" || true - if grep -qiE 'connected|already' <<<"$out"; then - if adb -s "$endpoint" get-state 2>/dev/null | grep -q '^device$'; then - echo " ${endpoint} — ready" - return 0 - fi + sleep 1 + resolved="$(adb_parse_connect_serial "$out" 2>/dev/null || true)" + if [[ -z "$resolved" ]]; then + resolved="$(adb_resolve_device_serial "$endpoint" 2>/dev/null || true)" + fi + if [[ -n "$resolved" ]]; then + echo " ${resolved} — ready (${out})" >&2 + printf '%s' "$resolved" + return 0 fi if [[ "$attempt" -lt "$ADB_CONNECT_RETRIES" ]]; then sleep "$ADB_CONNECT_DELAY_SEC" @@ -191,28 +404,62 @@ adb_update_connect_cache() { mkdir -p "$(dirname "$ADB_CONNECT_CACHE")" : >"$ADB_CONNECT_CACHE" while IFS= read -r serial; do - [[ "$serial" == *:* ]] || continue + adb_is_connectable_ip_port "$serial" || continue echo "$serial" >>"$ADB_CONNECT_CACHE" done < <(adb devices 2>/dev/null | awk 'NR > 1 && $2 == "device" { print $1 }') } -adb_reconnect_all() { - echo "==> Reconnecting wireless adb targets" +adb_reconnect_prepare() { + export ADB_MDNS_AUTO_CONNECT adb start-server >/dev/null 2>&1 || true + if [[ "${ADB_KILL_SERVER}" =~ [yY] ]]; then + adb kill-server >/dev/null 2>&1 || true + adb start-server >/dev/null 2>&1 || true + fi adb reconnect offline >/dev/null 2>&1 || true +} + +adb_reconnect_all() { + local label=${1:-post-build} + echo "==> Reconnecting wireless adb targets (${label})" + adb_reconnect_prepare adb_poke_refresh_broadcast if [[ "${ADB_RECONNECT_POKE_DELAY_SEC:-0}" -gt 0 ]]; then sleep "$ADB_RECONNECT_POKE_DELAY_SEC" fi - local endpoint connected=0 + local endpoint connected=0 host resolved + declare -A connected_hosts=() + while IFS= read -r serial; do + host="$(adb_endpoint_host "$serial")" + [[ -n "$host" ]] && connected_hosts["$host"]="$serial" + done < <(adb devices 2>/dev/null | awk 'NR > 1 && $2 == "device" { print $1 }') + while IFS= read -r endpoint; do [[ -z "$endpoint" ]] && continue - if adb_reconnect_endpoint "$endpoint"; then + host="$(adb_endpoint_host "$endpoint")" + if [[ -n "$host" && -n "${connected_hosts[$host]:-}" ]]; then + echo " skip ${endpoint} — ${host} already on ${connected_hosts[$host]}" + continue + fi + if resolved="$(adb_reconnect_endpoint "$endpoint")"; then connected=$((connected + 1)) + host="$(adb_endpoint_host "$resolved")" + [[ -z "$host" ]] && host="$(adb_endpoint_host "$endpoint")" + [[ -n "$host" ]] && connected_hosts["$host"]="$resolved" fi done < <(adb_discover_endpoints) + if [[ "$connected" -eq 0 ]]; then + echo " retry: HTTP-only pass" + while IFS= read -r endpoint; do + [[ -z "$endpoint" ]] && continue + if resolved="$(adb_reconnect_endpoint "$endpoint")"; then + connected=$((connected + 1)) + fi + done < <(adb_fetch_http_endpoints) + fi + adb_update_connect_cache adb devices -l if [[ "$connected" -gt 0 ]]; then @@ -224,3 +471,27 @@ adb_reconnect_all() { adb_count_ready_devices() { adb devices 2>/dev/null | awk 'NR > 1 && $2 == "device" { c++ } END { print c+0 }' } + +adb_prepare_device_for_deploy() { + local serial=${1:-} + local -a adb_args=() + [[ -n "$serial" ]] && adb_args=(-s "$serial") + adb "${adb_args[@]}" shell input keyevent KEYCODE_WAKEUP >/dev/null 2>&1 \ + || adb "${adb_args[@]}" shell input keyevent 224 >/dev/null 2>&1 \ + || true + adb "${adb_args[@]}" shell am broadcast \ + -a com.foxx.androidcast.dev.PREPARE_FOR_DEPLOY \ + -n com.foxx.androidcast/.dev.DebugDeployWakeReceiver >/dev/null 2>&1 || true +} + +adb_http_status() { + local ip=${1} + local json + json="$(adb_curl_adb_json "$ip" 2>/dev/null || true)" + if [[ -z "$json" ]]; then + echo "${ip}: no response (app not running or port ${DEV_ADB_HTTP_PORT} closed)" + return 1 + fi + echo "${ip}: ok" + adb_json_connect_lines "$json" | sed 's/^/ connect /' +} diff --git a/scripts/build-all-docs-pdf.sh b/scripts/build-all-docs-pdf.sh index 66fb62b..a4867fd 100755 --- a/scripts/build-all-docs-pdf.sh +++ b/scripts/build-all-docs-pdf.sh @@ -1,6 +1,15 @@ #!/usr/bin/env bash -# Render every docs/*.md to docs/.pdf (reportlab; see docs/_pdf_build/md_to_pdf.py). +# Render docs/**/*.md to sibling .pdf, then diagram/special PDF builders. set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" -python3 "$ROOT_DIR/docs/_pdf_build/build_all_docs_pdf.py" -echo "Done: $ROOT_DIR/docs/*.pdf" +PDF_BUILD="$ROOT_DIR/docs/_pdf_build" +python3 "$PDF_BUILD/build_all_docs_pdf.py" +for extra in \ + build_git_flow_pdf.py \ + build_graphvis_pivot_pdf.py \ + build_egress_review_pdf.py; do + if [[ -f "$PDF_BUILD/$extra" ]]; then + python3 "$PDF_BUILD/$extra" || echo "WARN: $extra failed (optional)" >&2 + fi +done +echo "Done: PDFs under $ROOT_DIR/docs/ (recursive + diagram builders)" diff --git a/scripts/generate-docs-toc.py b/scripts/generate-docs-toc.py index df83fc3..3f2d619 100644 --- a/scripts/generate-docs-toc.py +++ b/scripts/generate-docs-toc.py @@ -32,9 +32,23 @@ DOC_BLURBS: dict[str, str] = { "USB_HDMI_CAST.md": "Roadmap D/E: HDMI awareness, USB-tether transport.", "GRAFANA_vs_others_graphvis_pivot.md": "Custom graphs vs Grafana decision memo.", "20260602_REVERSE_SSH_proposals_summary.md": "On-demand remote access (WG/SSH/file API) proposals.", + "20260607-2FA-email-mobile-auth-flow.md": "Email forwarding + registration/2FA (alpha must-have).", + "20260608_ALPHA_PRIORITIES.md": "**Master priority plan** (0.1–9.x renumber, owners, alpha path).", + "20260608_BE_SERVICES_and_infra.md": "BE service map, validation status, SFU preview (gray).", + "20260608_STREAM_DUMP_DEBUG.md": "FR 0.1 stream dump spec.", + "20260610_SERVICES.md": "Exposed services catalog — web UI, APIs, curl, validation (2026-06-10).", + "OPEN_TASKS_GRAPH.md": "Open tasks dependency graph (Mermaid).", + "OPUS_SPEEX_VALIDATION.md": "Opus/Speex + UDP stream protection E2E checklist.", + "REMOTE_ACCESS_IMPL.md": "WireGuard v1 impl + deploy.", + "REMOTE_ACCESS_VALIDATION.md": "Linux CLI suite + mobile parity.", "AV_QUALITY_QA_SESSION.md": "AV enhancement Q&A: sender vs receiver pipelines.", + "specs/20100611_3_url_shortener.md": "URL shortener service — SPEC (`s.f0xx.org`, post-alpha).", + "DRs/20100611_3_url_shortener.md": "URL shortener — design review (auth, slug algo, task graph).", } +SPEC_DIR = DOCS / "specs" +DR_DIR = DOCS / "DRs" + def github_slug(text: str) -> str: """Approximate GitHub/Cursor heading anchor slugs.""" @@ -150,6 +164,8 @@ def build_index_md() -> str: "", TOC_START, "- [All documents](#all-documents)", + "- [Specifications](#specifications)", + "- [Design reviews](#design-reviews)", "- [By topic](#by-topic)", "- [Agent bootstrap](#agent-bootstrap)", TOC_END, @@ -166,6 +182,43 @@ def build_index_md() -> str: blurb = DOC_BLURBS.get(name, "") lines.append(f"| [{name}]({name}) | {blurb} |") + spec_files = sorted(SPEC_DIR.glob("*.md")) if SPEC_DIR.is_dir() else [] + dr_files = sorted(DR_DIR.glob("*.md")) if DR_DIR.is_dir() else [] + + lines += [ + "", + "---", + "", + "## Specifications", + "", + "| Document | Summary |", + "|----------|---------|", + ] + if spec_files: + for p in spec_files: + rel = f"specs/{p.name}" + blurb = DOC_BLURBS.get(rel, "") + lines.append(f"| [{p.name}]({rel}) | {blurb} |") + else: + lines.append("| _(none yet)_ | |") + + lines += [ + "", + "---", + "", + "## Design reviews", + "", + "| Document | Summary |", + "|----------|---------|", + ] + if dr_files: + for p in dr_files: + rel = f"DRs/{p.name}" + blurb = DOC_BLURBS.get(rel, "") + lines.append(f"| [{p.name}]({rel}) | {blurb} |") + else: + lines.append("| _(none yet)_ | |") + lines += [ "", "---", @@ -195,6 +248,8 @@ def build_index_md() -> str: f"- [TICKETS_ROADMAP.md](TICKETS_ROADMAP.md) — tickets + Gitea", f"- [GRAFANA_vs_others_graphvis_pivot.md](GRAFANA_vs_others_graphvis_pivot.md) — graphs pivot", f"- [20260602_REVERSE_SSH_proposals_summary.md](20260602_REVERSE_SSH_proposals_summary.md) — remote access ([§Rev. 3 Q&A](20260602_REVERSE_SSH_proposals_summary.md#rev-3--wg-vs-ssh-qa--bastion-deep-dive))", + f"- [specs/20100611_3_url_shortener.md](specs/20100611_3_url_shortener.md) — URL shortener SPEC ([§REST API](specs/20100611_3_url_shortener.md#6-rest-api))", + f"- [DRs/20100611_3_url_shortener.md](DRs/20100611_3_url_shortener.md) — URL shortener DR ([§Resolved open questions](DRs/20100611_3_url_shortener.md#2-resolved-open-questions))", "", "### Product and codecs", "", @@ -235,10 +290,15 @@ def main() -> None: print(f"Wrote {index_path}") changed = [] - for path in sorted(DOCS.glob("*.md")): + toc_paths: list[Path] = sorted(DOCS.glob("*.md")) + if SPEC_DIR.is_dir(): + toc_paths.extend(sorted(SPEC_DIR.glob("*.md"))) + if DR_DIR.is_dir(): + toc_paths.extend(sorted(DR_DIR.glob("*.md"))) + for path in toc_paths: if process_file(path): - changed.append(path.name) - print(f"Updated TOC: {path.name}") + changed.append(str(path.relative_to(DOCS))) + print(f"Updated TOC: {path.relative_to(DOCS)}") print(f"Done. {len(changed)} file(s) updated.") diff --git a/scripts/grant-dev-adb-perms.sh b/scripts/grant-dev-adb-perms.sh new file mode 100755 index 0000000..24a1406 --- /dev/null +++ b/scripts/grant-dev-adb-perms.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# One-time grants while device is connected (usually USB). Debug package only. +set -euo pipefail + +PACKAGE="${1:-com.foxx.androidcast}" + +if ! adb get-state >/dev/null 2>&1; then + echo "ERROR: no adb device in 'device' state" >&2 + exit 1 +fi + +echo "==> Granting dev adb permissions to ${PACKAGE}" +adb shell pm grant "${PACKAGE}" android.permission.WRITE_SECURE_SETTINGS +adb shell pm grant "${PACKAGE}" android.permission.DUMP +adb shell am broadcast \ + -a com.foxx.androidcast.dev.REFRESH_ADB_WIFI \ + -n "${PACKAGE}/.dev.DevAdbWifiReceiver" +echo "OK. Re-check: curl -s http://DEVICE:5039/adb.json | grep secure_settings_granted"