summaryrefslogtreecommitdiffstats
path: root/source3/utils/net_status.c
blob: d6027433a29c3708a4bc94ea5b64a525aa297f4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*
   Samba Unix/Linux SMB client library
   net status command -- possible replacement for smbstatus
   Copyright (C) 2003 Volker Lendecke (vl@samba.org)

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "includes.h"
#include "utils/net.h"
#include "session.h"
#include "messages.h"

int net_status_usage(struct net_context *c, int argc, const char **argv)
{
	d_printf(_("  net status sessions [parseable] "
		   "Show list of open sessions\n"));
	d_printf(_("  net status shares [parseable]   "
		   "Show list of open shares\n"));
	return -1;
}

static int show_session(const char *key, struct sessionid *session,
			void *private_data)
{
	bool *parseable = (bool *)private_data;

	if (!process_exists(session->pid)) {
		return 0;
	}

	if (*parseable) {
		d_printf("%s\\%s\\%s\\%s\\%s\n",
			 procid_str_static(&session->pid),
			 uidtoname(session->uid),
			 gidtoname(session->gid),
			 session->remote_machine, session->hostname);
	} else {
		d_printf("%7s   %-12s  %-12s  %-12s (%s)\n",
			 procid_str_static(&session->pid),
			 uidtoname(session->uid),
			 gidtoname(session->gid),
			 session->remote_machine, session->hostname);
	}

	return 0;
}

static int net_status_sessions(struct net_context *c, int argc, const char **argv)
{
	bool parseable;

	if (c->display_usage) {
		d_printf(  "%s\n"
			   "net status sessions [parseable]\n"
			   "    %s\n",
			 _("Usage:"),
			 _("Display open user sessions.\n"
			   "    If parseable is specified, output is machine-"
			   "readable."));
		return 0;
	}

	if (argc == 0) {
		parseable = false;
	} else if ((argc == 1) && strequal(argv[0], "parseable")) {
		parseable = true;
	} else {
		return net_status_usage(c, argc, argv);
	}

	if (!parseable) {
		d_printf(_("PID     Username      Group         Machine"
			   "                        \n"
		           "-------------------------------------------"
			   "------------------------\n"));
	}

	sessionid_traverse_read(show_session, &parseable);
	return 0;
}

static int show_share(struct db_record *rec,
		      const struct connections_key *key,
		      const struct connections_data *crec,
		      void *state)
{
	if (crec->cnum == -1)
		return 0;

	if (!process_exists(crec->pid)) {
		return 0;
	}

	d_printf("%-10.10s   %s   %-12s  %s",
	       crec->servicename, procid_str_static(&crec->pid),
	       crec->machine,
	       time_to_asc(crec->start));

	return 0;
}

struct sessionids {
	int num_entries;
	struct sessionid *entries;
};

static int collect_pids(const char *key, struct sessionid *session,
			void *private_data)
{
	struct sessionids *ids = (struct sessionids *)private_data;

	if (!process_exists(session->pid))
		return 0;

	ids->num_entries += 1;
	ids->entries = SMB_REALLOC_ARRAY(ids->entries, struct sessionid, ids->num_entries);
	if (!ids->entries) {
		ids->num_entries = 0;
		return 0;
	}
	ids->entries[ids->num_entries-1] = *session;

	return 0;
}

static int show_share_parseable(const struct connections_key *key,
				const struct connections_data *crec,
				void *state)
{
	struct sessionids *ids = (struct sessionids *)state;
	int i;
	bool guest = true;

	if (crec->cnum == -1)
		return 0;

	if (!process_exists(crec->pid)) {
		return 0;
	}

	for (i=0; i<ids->num_entries; i++) {
		struct server_id id = ids->entries[i].pid;
		if (procid_equal(&id, &crec->pid)) {
			guest = false;
			break;
		}
	}

	d_printf("%s\\%s\\%s\\%s\\%s\\%s\\%s",
		 crec->servicename,procid_str_static(&crec->pid),
		 guest ? "" : uidtoname(ids->entries[i].uid),
		 guest ? "" : gidtoname(ids->entries[i].gid),
		 crec->machine,
		 guest ? "" : ids->entries[i].hostname,
		 time_to_asc(crec->start));

	return 0;
}

static int net_status_shares_parseable(struct net_context *c, int argc, const char **argv)
{
	struct sessionids ids;

	ids.num_entries = 0;
	ids.entries = NULL;

	sessionid_traverse_read(collect_pids, &ids);

	connections_forall_read(show_share_parseable, &ids);

	SAFE_FREE(ids.entries);

	return 0;
}

static int net_status_shares(struct net_context *c, int argc, const char **argv)
{
	if (c->display_usage) {
		d_printf(  "%s\n"
			   "net status shares [parseable]\n"
			   "    %s\n",
			 _("Usage:"),
			 _("Display open user shares.\n"
			   "    If parseable is specified, output is machine-"
			   "readable."));
		return 0;
	}

	if (argc == 0) {

		d_printf(_("\nService      pid     machine       "
			   "Connected at\n"
		           "-------------------------------------"
			   "------------------\n"));

		connections_forall(show_share, NULL);

		return 0;
	}

	if ((argc != 1) || !strequal(argv[0], "parseable")) {
		return net_status_usage(c, argc, argv);
	}

	return net_status_shares_parseable(c, argc, argv);
}

int net_status(struct net_context *c, int argc, const char **argv)
{
	struct functable func[] = {
		{
			"sessions",
			net_status_sessions,
			NET_TRANSPORT_LOCAL,
			N_("Show list of open sessions"),
			N_("net status sessions [parseable]\n"
			   "    If parseable is specified, output is presented "
			   "in a machine-parseable fashion.")
		},
		{
			"shares",
			net_status_shares,
			NET_TRANSPORT_LOCAL,
			N_("Show list of open shares"),
			N_("net status shares [parseable]\n"
			   "    If parseable is specified, output is presented "
			   "in a machine-parseable fashion.")
		},
		{NULL, NULL, 0, NULL, NULL}
	};
	return net_run_function(c, argc, argv, "net status", func);
}
732' href='#n732'>732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798
/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.browser;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.cocoa.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

class WebKit extends WebBrowser {
	WebView webView;
	WebPreferences preferences;
	SWTWebViewDelegate delegate;
	boolean loadingText, untrustedText;
	String lastHoveredLinkURL, lastNavigateURL;
	String html;
	int /*long*/ identifier;
	int resourceCount;
	String url = ""; //$NON-NLS-1$
	Point location;
	Point size;
	boolean statusBar = true, toolBar = true, ignoreDispose;
	int lastMouseMoveX, lastMouseMoveY;
	//TEMPORARY CODE
//	boolean doit;

	static int /*long*/ delegateClass;
	static boolean Initialized;
	// the following Callbacks are never freed
	static Callback Callback3, Callback4, Callback5, Callback6, Callback7;

	static final int MIN_SIZE = 16;
	static final int MAX_PROGRESS = 100;
	static final String WebElementLinkURLKey = "WebElementLinkURL"; //$NON-NLS-1$
	static final String AGENT_STRING = "Safari/522.0"; /* Safari version on OSX 10.5 initial release */ //$NON-NLS-1$
	static final String URI_FILEROOT = "file:///"; //$NON-NLS-1$
	static final String PROTOCOL_FILE = "file://"; //$NON-NLS-1$
	static final String PROTOCOL_HTTP = "http://"; //$NON-NLS-1$
	static final String ABOUT_BLANK = "about:blank"; //$NON-NLS-1$
	static final String HEADER_SETCOOKIE = "Set-Cookie"; //$NON-NLS-1$
	static final String POST = "POST"; //$NON-NLS-1$
	static final String USER_AGENT = "user-agent"; //$NON-NLS-1$
	static final String ADD_WIDGET_KEY = "org.eclipse.swt.internal.addWidget"; //$NON-NLS-1$
	static final String WEBKIT_EVENTS_FIX_KEY = "org.eclipse.swt.internal.webKitEventsFix"; //$NON-NLS-1$
	static final byte[] SWT_OBJECT = {'S', 'W', 'T', '_', 'O', 'B', 'J', 'E', 'C', 'T', '\0'};

	/* event strings */
	static final String DOMEVENT_KEYUP = "keyup"; //$NON-NLS-1$
	static final String DOMEVENT_KEYDOWN = "keydown"; //$NON-NLS-1$
	static final String DOMEVENT_MOUSEDOWN = "mousedown"; //$NON-NLS-1$
	static final String DOMEVENT_MOUSEUP = "mouseup"; //$NON-NLS-1$
	static final String DOMEVENT_MOUSEMOVE = "mousemove"; //$NON-NLS-1$
	static final String DOMEVENT_MOUSEWHEEL = "mousewheel"; //$NON-NLS-1$

	static {
		NativeClearSessions = new Runnable() {
			public void run() {
				NSHTTPCookieStorage storage = NSHTTPCookieStorage.sharedHTTPCookieStorage();
				NSArray cookies = storage.cookies();
				int count = (int)/*64*/cookies.count ();
				for (int i = 0; i < count; i++) {
					NSHTTPCookie cookie = new NSHTTPCookie(cookies.objectAtIndex(i));
					if (cookie.isSessionOnly()) {
						storage.deleteCookie(cookie);
					}
				}
			}
		};

		NativeGetCookie = new Runnable () {
			public void run () {
				NSHTTPCookieStorage storage = NSHTTPCookieStorage.sharedHTTPCookieStorage ();
				NSURL url = NSURL.URLWithString (NSString.stringWith (CookieUrl));
				NSArray cookies = storage.cookiesForURL (url);
				int count = (int)/*64*/cookies.count ();
				if (count == 0) return;

				NSString name = NSString.stringWith (CookieName);
				for (int i = 0; i < count; i++) {
					NSHTTPCookie current = new NSHTTPCookie (cookies.objectAtIndex (i));
					if (current.name ().compare (name) == OS.NSOrderedSame) {
						CookieValue = current.value ().getString ();
						return;
					}
				}
			}
		};

		NativeSetCookie = new Runnable () {
			public void run () {
				NSURL url = NSURL.URLWithString (NSString.stringWith (CookieUrl));
				NSMutableDictionary headers = NSMutableDictionary.dictionaryWithCapacity (1);
				headers.setValue (NSString.stringWith (CookieValue), NSString.stringWith (HEADER_SETCOOKIE));
				NSArray cookies = NSHTTPCookie.cookiesWithResponseHeaderFields (headers, url);
				if (cookies.count () == 0) return;
				NSHTTPCookieStorage storage = NSHTTPCookieStorage.sharedHTTPCookieStorage ();
				NSHTTPCookie cookie = new NSHTTPCookie (cookies.objectAtIndex (0));
				storage.setCookie (cookie);
				CookieResult = true;
			}
		};

		if (NativePendingCookies != null) {
			SetPendingCookies (NativePendingCookies);
		}
		NativePendingCookies = null;
	}

public void create (Composite parent, int style) {
	if (delegateClass == 0) {
		Class webKitClass = this.getClass();
		Callback3 = new Callback(webKitClass, "browserProc", 3); //$NON-NLS-1$
		int /*long*/ proc3 = Callback3.getAddress();
		if (proc3 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
		Callback4 = new Callback(webKitClass, "browserProc", 4); //$NON-NLS-1$
		int /*long*/ proc4 = Callback4.getAddress();
		if (proc4 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
		Callback5 = new Callback(webKitClass, "browserProc", 5); //$NON-NLS-1$
		int /*long*/ proc5 = Callback5.getAddress();
		if (proc5 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
		Callback6 = new Callback(webKitClass, "browserProc", 6); //$NON-NLS-1$
		int /*long*/ proc6 = Callback6.getAddress();
		if (proc6 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
		Callback7 = new Callback(webKitClass, "browserProc", 7); //$NON-NLS-1$
		int /*long*/ proc7 = Callback7.getAddress();
		if (proc7 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
		int /*long*/ setFrameProc = OS.CALLBACK_webView_setFrame_(proc4);
		if (setFrameProc == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);

		String className = "SWTWebViewDelegate"; //$NON-NLS-1$
		byte[] types = {'*','\0'};
		int size = C.PTR_SIZEOF, align = C.PTR_SIZEOF == 4 ? 2 : 3;
		delegateClass = OS.objc_allocateClassPair (OS.class_NSObject, className, 0);

		OS.class_addIvar(delegateClass, SWT_OBJECT, size, (byte)align, types);
		OS.class_addMethod(delegateClass, OS.sel_webView_didChangeLocationWithinPageForFrame_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_didFailProvisionalLoadWithError_forFrame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_didFinishLoadForFrame_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_didReceiveTitle_forFrame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_didStartProvisionalLoadForFrame_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_didCommitLoadForFrame_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_resource_didFinishLoadingFromDataSource_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_resource_didReceiveAuthenticationChallenge_fromDataSource_, proc6, "@:@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_resource_didFailLoadingWithError_fromDataSource_, proc6, "@:@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_identifierForInitialRequest_fromDataSource_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_resource_willSendRequest_redirectResponse_fromDataSource_, proc7, "@:@@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_createWebViewWithRequest_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webViewShow_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webViewClose_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_contextMenuItemsForElement_defaultMenuItems_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_setStatusBarVisible_, proc4, "@:@B"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_setResizable_, proc4, "@:@B"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_setToolbarsVisible_, proc4, "@:@B"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_setStatusText_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webViewFocus_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webViewUnfocus_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runBeforeUnloadConfirmPanelWithMessage_initiatedByFrame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runJavaScriptAlertPanelWithMessage_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runJavaScriptAlertPanelWithMessage_initiatedByFrame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runJavaScriptConfirmPanelWithMessage_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runJavaScriptConfirmPanelWithMessage_initiatedByFrame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_runOpenPanelForFileButtonWithResultListener_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_mouseDidMoveOverElement_modifierFlags_, proc5, "@:@@I"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_printFrameView_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_decidePolicyForMIMEType_request_frame_decisionListener_, proc7, "@:@@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_decidePolicyForNavigationAction_request_frame_decisionListener_, proc7, "@:@@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_decidePolicyForNewWindowAction_request_newFrameName_decisionListener_, proc7, "@:@@@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_unableToImplementPolicyWithError_frame_, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_download_decideDestinationWithSuggestedFilename_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_handleEvent_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_setFrame_, setFrameProc, "@:@{NSRect}"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_webView_windowScriptObjectAvailable_, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_callJava, proc5, "@:@@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_callRunBeforeUnloadConfirmPanelWithMessage, proc4, "@:@@"); //$NON-NLS-1$
		OS.class_addMethod(delegateClass, OS.sel_createPanelDidEnd, proc5, "@:@@@"); //$NON-NLS-1$
		OS.objc_registerClassPair(delegateClass);

 		int /*long*/ metaClass = OS.objc_getMetaClass (className);
		OS.class_addMethod(metaClass, OS.sel_isSelectorExcludedFromWebScript_, proc3, "@:@"); //$NON-NLS-1$
		OS.class_addMethod(metaClass, OS.sel_webScriptNameForSelector_, proc3, "@:@"); //$NON-NLS-1$
	}

	/*
	* Override the default event mechanism to not send key events so
	* that the browser can send them by listening to the DOM instead.
	*/
	browser.setData(WEBKIT_EVENTS_FIX_KEY);

	WebView webView = (WebView)new WebView().alloc();
	if (webView == null) SWT.error(SWT.ERROR_NO_HANDLES);
	webView.initWithFrame(browser.view.frame(), null, null);
	webView.setAutoresizingMask(OS.NSViewWidthSizable | OS.NSViewHeightSizable);
	if (webView.respondsToSelector(OS.sel__setDashboardBehavior)) {
		OS.objc_msgSend(webView.id, OS.sel__setDashboardBehavior, 2, 1);
	}
	final SWTWebViewDelegate delegate = (SWTWebViewDelegate)new SWTWebViewDelegate().alloc().init();
	Display display = browser.getDisplay();
	display.setData(ADD_WIDGET_KEY, new Object[] {delegate, browser});
	this.delegate = delegate;
	this.webView = webView;
	browser.view.addSubview(webView);

	Listener listener = new Listener() {
		public void handleEvent(Event e) {
			switch (e.type) {
				case SWT.FocusIn:
					WebKit.this.webView.window().makeFirstResponder(WebKit.this.webView);
					break;
				case SWT.Dispose: {
					/* make this handler run after other dispose listeners */
					if (ignoreDispose) {
						ignoreDispose = false;
						break;
					}
					ignoreDispose = true;
					browser.notifyListeners (e.type, e);
					e.type = SWT.NONE;

					/* Browser could have been disposed by one of the Dispose listeners */
					if (!browser.isDisposed()) {
						/* invoke onbeforeunload handlers */
						if (!browser.isClosing) {
							close (false);
						}

						e.display.setData(ADD_WIDGET_KEY, new Object[] {delegate, null});
					}

					WebKit.this.webView.setFrameLoadDelegate(null);
					WebKit.this.webView.setResourceLoadDelegate(null);
					WebKit.this.webView.setUIDelegate(null);
					WebKit.this.webView.setPolicyDelegate(null);
					WebKit.this.webView.setDownloadDelegate(null);

					WebKit.this.webView.release();
					WebKit.this.webView = null;
					WebKit.this.delegate.release();
					WebKit.this.delegate = null;
					html = null;
					lastHoveredLinkURL = lastNavigateURL = null;

					Enumeration elements = functions.elements ();
					while (elements.hasMoreElements ()) {
						((BrowserFunction)elements.nextElement ()).dispose (false);
					}
					functions = null;

					if (preferences != null) preferences.release ();
					preferences = null;
					break;
				}
			}
		}
	};
	browser.addListener(SWT.Dispose, listener);
	browser.addListener(SWT.KeyDown, listener); /* needed for tabbing into the Browser */
	browser.addListener(SWT.FocusIn, listener);

	webView.setFrameLoadDelegate(delegate);
	webView.setResourceLoadDelegate(delegate);
	webView.setUIDelegate(delegate);	
	webView.setPolicyDelegate(delegate);
	webView.setDownloadDelegate(delegate);
	webView.setApplicationNameForUserAgent(NSString.stringWith(AGENT_STRING));

	if (!Initialized) {
		Initialized = true;
		/* disable applets */
		WebPreferences.standardPreferences().setJavaEnabled(false);
	}
}

public boolean back() {
	html = null;	
	return webView.goBack();
}

static int /*long*/ browserProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0) {
	if (id == delegateClass) {
		if (sel == OS.sel_isSelectorExcludedFromWebScript_) {
			return isSelectorExcludedFromWebScript (arg0) ? 1 : 0;
		} else if (sel == OS.sel_webScriptNameForSelector_) {
			return webScriptNameForSelector (arg0);
		}
	}

	Display d = Display.getCurrent();
	if (d == null || d.isDisposed()) return 0;
	Widget widget = d.findWidget(id);
	if (widget == null) return 0;
	WebKit webKit = (WebKit)((Browser)widget).webBrowser;
	if (sel == OS.sel_webViewShow_) {
		webKit.webViewShow(arg0);
	} else if (sel == OS.sel_webViewClose_) {
		webKit.webViewClose(arg0);
	} else if (sel == OS.sel_webViewFocus_) {
		webKit.webViewFocus(arg0);
	} else if (sel == OS.sel_webViewUnfocus_) {
		webKit.webViewUnfocus(arg0);
	} else if (sel == OS.sel_handleEvent_) {
		webKit.handleEvent(arg0);
	}
	return 0;
}

static int /*long*/ browserProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0, int /*long*/ arg1) {
	Display d = Display.getCurrent();
	if (d == null || d.isDisposed()) return 0;
	Widget widget = d.findWidget(id);
	if (widget == null) return 0;
	WebKit webKit = (WebKit)((Browser)widget).webBrowser;
	if (sel == OS.sel_webView_didChangeLocationWithinPageForFrame_) {
		webKit.webView_didChangeLocationWithinPageForFrame(arg0, arg1);
	} else if (sel == OS.sel_webView_didFinishLoadForFrame_) {
		webKit.webView_didFinishLoadForFrame(arg0, arg1);
	} else if (sel == OS.sel_webView_didStartProvisionalLoadForFrame_) {
		webKit.webView_didStartProvisionalLoadForFrame(arg0, arg1);
	} else if (sel == OS.sel_webView_didCommitLoadForFrame_) {
		webKit.webView_didCommitLoadForFrame(arg0, arg1);
	} else if (sel == OS.sel_webView_setFrame_) {
		webKit.webView_setFrame(arg0, arg1);
	} else if (sel == OS.sel_webView_createWebViewWithRequest_) {
		return webKit.webView_createWebViewWithRequest(arg0, arg1);		
	} else if (sel == OS.sel_webView_setStatusBarVisible_) {
		webKit.webView_setStatusBarVisible(arg0, arg1 != 0);
	} else if (sel == OS.sel_webView_setResizable_) {
		webKit.webView_setResizable(arg0, arg1 != 0);
	} else if (sel == OS.sel_webView_setStatusText_) {
		webKit.webView_setStatusText(arg0, arg1);
	} else if (sel == OS.sel_webView_setToolbarsVisible_) {
		webKit.webView_setToolbarsVisible(arg0, arg1 != 0);
	} else if (sel == OS.sel_webView_runJavaScriptAlertPanelWithMessage_) {
		webKit.webView_runJavaScriptAlertPanelWithMessage(arg0, arg1);
	} else if (sel == OS.sel_webView_runJavaScriptConfirmPanelWithMessage_) {
		return webKit.webView_runJavaScriptConfirmPanelWithMessage(arg0, arg1);
	} else if (sel == OS.sel_webView_runOpenPanelForFileButtonWithResultListener_) {
		webKit.webView_runOpenPanelForFileButtonWithResultListener(arg0, arg1);
	} else if (sel == OS.sel_download_decideDestinationWithSuggestedFilename_) {
		webKit.download_decideDestinationWithSuggestedFilename(arg0, arg1);
	} else if (sel == OS.sel_webView_printFrameView_) {
		webKit.webView_printFrameView(arg0, arg1);
	} else if (sel == OS.sel_webView_windowScriptObjectAvailable_) {
		webKit.webView_windowScriptObjectAvailable (arg0, arg1);
	} else if (sel == OS.sel_callRunBeforeUnloadConfirmPanelWithMessage) {
		return webKit.callRunBeforeUnloadConfirmPanelWithMessage (arg0, arg1).id;
	}
	return 0;
}

static int /*long*/ browserProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2) {
	Display d = Display.getCurrent();
	if (d == null || d.isDisposed()) return 0;
	Widget widget = d.findWidget(id);
	if (widget == null) return 0;
	WebKit webKit = (WebKit)((Browser)widget).webBrowser;
	if (sel == OS.sel_webView_didFailProvisionalLoadWithError_forFrame_) {
		webKit.webView_didFailProvisionalLoadWithError_forFrame(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_didReceiveTitle_forFrame_) {
		webKit.webView_didReceiveTitle_forFrame(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_resource_didFinishLoadingFromDataSource_) {
		webKit.webView_resource_didFinishLoadingFromDataSource(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_identifierForInitialRequest_fromDataSource_) {
		return webKit.webView_identifierForInitialRequest_fromDataSource(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_contextMenuItemsForElement_defaultMenuItems_) {
		return webKit.webView_contextMenuItemsForElement_defaultMenuItems(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_mouseDidMoveOverElement_modifierFlags_) {
		webKit.webView_mouseDidMoveOverElement_modifierFlags(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_unableToImplementPolicyWithError_frame_) {
		webKit.webView_unableToImplementPolicyWithError_frame(arg0, arg1, arg2);
	} else if (sel == OS.sel_webView_runBeforeUnloadConfirmPanelWithMessage_initiatedByFrame_) {
		return webKit.webView_runBeforeUnloadConfirmPanelWithMessage_initiatedByFrame(arg0, arg1, arg2) ? 1 : 0;
	} else if (sel == OS.sel_webView_runJavaScriptAlertPanelWithMessage_initiatedByFrame_) {
		webKit.webView_runJavaScriptAlertPanelWithMessage(arg0, arg1);
	} else if (sel == OS.sel_webView_runJavaScriptConfirmPanelWithMessage_initiatedByFrame_) {
		return webKit.webView_runJavaScriptConfirmPanelWithMessage(arg0, arg1);
	} else if (sel == OS.sel_callJava) {
		id result = webKit.callJava(arg0, arg1, arg2);
		return result == null ? 0 : result.id;
	} else if (sel == OS.sel_createPanelDidEnd) {
		webKit.createPanelDidEnd(arg0, arg1, arg2);
	}
	return 0;
}

static int /*long*/ browserProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ arg3) {
	Display d = Display.getCurrent();
	if (d == null || d.isDisposed()) return 0;
	Widget widget = d.findWidget(id);
	if (widget == null) return 0;
	WebKit webKit = (WebKit)((Browser)widget).webBrowser;
	if (sel == OS.sel_webView_resource_didFailLoadingWithError_fromDataSource_) {
		webKit.webView_resource_didFailLoadingWithError_fromDataSource(arg0, arg1, arg2, arg3);
	} else if (sel == OS.sel_webView_resource_didReceiveAuthenticationChallenge_fromDataSource_) {
		webKit.webView_resource_didReceiveAuthenticationChallenge_fromDataSource(arg0, arg1, arg2, arg3);
	}
	return 0;
}

static int /*long*/ browserProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ arg3, int /*long*/ arg4) {
	Display d = Display.getCurrent();
	if (d == null || d.isDisposed()) return 0;
	Widget widget = d.findWidget(id);
	if (widget == null) return 0;
	WebKit webKit = (WebKit)((Browser)widget).webBrowser;
	if (sel == OS.sel_webView_resource_willSendRequest_redirectResponse_fromDataSource_) {
		return webKit.webView_resource_willSendRequest_redirectResponse_fromDataSource(arg0, arg1, arg2, arg3, arg4);
	} else if (sel == OS.sel_webView_decidePolicyForMIMEType_request_frame_decisionListener_) {
		webKit.webView_decidePolicyForMIMEType_request_frame_decisionListener(arg0, arg1, arg2, arg3, arg4);
	} else if (sel == OS.sel_webView_decidePolicyForNavigationAction_request_frame_decisionListener_) {
		webKit.webView_decidePolicyForNavigationAction_request_frame_decisionListener(arg0, arg1, arg2, arg3, arg4);
	} else if (sel == OS.sel_webView_decidePolicyForNewWindowAction_request_newFrameName_decisionListener_) {
		webKit.webView_decidePolicyForNewWindowAction_request_newFrameName_decisionListener(arg0, arg1, arg2, arg3, arg4);
	}
	return 0;
}

static boolean isSelectorExcludedFromWebScript (int /*long*/ aSelector) {
	return !(aSelector == OS.sel_callJava || aSelector == OS.sel_callRunBeforeUnloadConfirmPanelWithMessage);
}

static int /*long*/ webScriptNameForSelector (int /*long*/ aSelector) {
	if (aSelector == OS.sel_callJava) {
		return NSString.stringWith ("callJava").id; //$NON-NLS-1$
	}
	if (aSelector == OS.sel_callRunBeforeUnloadConfirmPanelWithMessage) {
		return NSString.stringWith ("callRunBeforeUnloadConfirmPanelWithMessage").id; //$NON-NLS-1$
	}
	return 0;
}

public boolean close () {
	return close (true);
}

boolean close (boolean showPrompters) {
	if (!jsEnabled) return true;

	String functionName = EXECUTE_ID + "CLOSE"; // $NON-NLS-1$
	StringBuffer buffer = new StringBuffer ("function "); // $NON-NLS-1$
	buffer.append (functionName);
	buffer.append ("(win) {\n"); // $NON-NLS-1$
	buffer.append ("var fn = win.onbeforeunload; if (fn != null) {try {var str = fn(); "); // $NON-NLS-1$
	if (showPrompters) {
		buffer.append ("if (str != null) { "); // $NON-NLS-1$
		buffer.append ("var result = window.external.callRunBeforeUnloadConfirmPanelWithMessage(str);"); // $NON-NLS-1$
		buffer.append ("if (!result) return false;}"); // $NON-NLS-1$
	}	
	buffer.append ("} catch (e) {}}"); // $NON-NLS-1$
	buffer.append ("try {for (var i = 0; i < win.frames.length; i++) {var result = "); // $NON-NLS-1$
	buffer.append (functionName);
	buffer.append ("(win.frames[i]); if (!result) return false;}} catch (e) {} return true;"); // $NON-NLS-1$
	buffer.append ("\n};"); // $NON-NLS-1$
	execute (buffer.toString ());

	Boolean result = (Boolean)evaluate ("return " + functionName +"(window);"); // $NON-NLS-1$ // $NON-NLS-2$
	if (result == null) return false;
	return result.booleanValue ();
}

public boolean execute (String script) {
	WebFrame frame = webView.mainFrame();
	int /*long*/ context = frame.globalContext();

	byte[] bytes = null;
	try {
		bytes = (script + '\0').getBytes("UTF-8"); //$NON-NLS-1$
	} catch (UnsupportedEncodingException e) {
		bytes = (script + '\0').getBytes();
	}
	int /*long*/ scriptString = OS.JSStringCreateWithUTF8CString(bytes);

	try {
		bytes = (getUrl() + '\0').getBytes("UTF-8"); //$NON-NLS-1$
	} catch (UnsupportedEncodingException e) {
		bytes = (getUrl() + '\0').getBytes();
	}
	int /*long*/ urlString = OS.JSStringCreateWithUTF8CString(bytes);

	int /*long*/ result = OS.JSEvaluateScript(context, scriptString, 0, urlString, 0, null);
	OS.JSStringRelease(urlString);
	OS.JSStringRelease(scriptString);
	return result != 0;
}

public boolean forward () {
	html = null;
	return webView.goForward();
}

public String getBrowserType () {
	return "webkit"; //$NON-NLS-1$
}

public String getText() {
	WebFrame mainFrame = webView.mainFrame();
	WebDataSource dataSource = mainFrame.dataSource();
	if (dataSource == null) return "";	//$NON-NLS-1$
	WebDocumentRepresentation representation = dataSource.representation();
	if (representation == null) return "";	//$NON-NLS-1$
	NSString source = representation.documentSource();
	if (source == null) return "";	//$NON-NLS-1$
	return source.getString();
}

public String getUrl() {
	/* WebKit auto-navigates to about:blank at startup */
	if (url.length() == 0) return ABOUT_BLANK;

	return url;
}

public boolean isBackEnabled() {
	return webView.canGoBack();
}

public boolean isForwardEnabled() {
	return webView.canGoForward();
}

public void refresh() {
	html = null;
	webView.reload(null);
}

public boolean setText(String html, boolean trusted) {
	/*
	* If this.html is not null then the about:blank page is already being loaded,
	* so no navigate is required.  Just set the html that is to be shown.
	*/
	boolean blankLoading = this.html != null;
	this.html = html;
	untrustedText = !trusted;
	if (blankLoading) return true;

	NSURL inURL = NSURL.URLWithString(NSString.stringWith (ABOUT_BLANK));
	NSURLRequest request = NSURLRequest.requestWithURL(inURL);
	WebFrame mainFrame = webView.mainFrame();
	mainFrame.loadRequest(request);
	return true;
}

public boolean setUrl(String url, String postData, String[] headers) {
	html = null;
	lastNavigateURL = url;

	if (url.indexOf('/') == 0) {
		url = PROTOCOL_FILE + url;
	} else if (url.indexOf(':') == -1) {
		url = PROTOCOL_HTTP + url;
	}

	NSString str = NSString.stringWith(url);
	NSString unescapedStr = NSString.stringWith("%#"); //$NON-NLS-1$
	int /*long*/ ptr = OS.CFURLCreateStringByAddingPercentEscapes(0, str.id, unescapedStr.id, 0, OS.kCFStringEncodingUTF8);
	NSString escapedString = new NSString(ptr);
	NSURL inURL = NSURL.URLWithString(escapedString);
	OS.CFRelease(ptr);
	NSMutableURLRequest request = (NSMutableURLRequest)NSMutableURLRequest.requestWithURL(inURL);
	if (postData != null) {
		request.setHTTPMethod(NSString.stringWith(POST));
		byte[] bytes = postData.getBytes();
		NSData data = NSData.dataWithBytes(bytes, bytes.length);
		request.setHTTPBody(data);
	}
	if (headers != null) {
		for (int i = 0; i < headers.length; i++) {
			String current = headers[i];
			if (current != null) {
				int index = current.indexOf(':');
				if (index != -1) {
					String key = current.substring(0, index).trim();
					String value = current.substring(index + 1).trim();
					if (key.length() > 0 && value.length() > 0) {
						if (key.equalsIgnoreCase(USER_AGENT)) {
							/*
							* Feature of WebKit.  The user-agent header value cannot be overridden
							* here.  The workaround is to temporarily set the value on the WebView
							* and then remove it after the loading of the request has begun.
							*/
							webView.setCustomUserAgent(NSString.stringWith(value));
						} else {
							request.setValue(NSString.stringWith(value), NSString.stringWith(key));						
						}
					}
				}
			}
		}
	}
	WebFrame mainFrame = webView.mainFrame();
	mainFrame.loadRequest(request);
	webView.setCustomUserAgent(null);
	return true;
}

public void stop() {
	html = null;
	webView.stopLoading(null);
}

boolean translateMnemonics() {
	return false;
}

/* WebFrameLoadDelegate */

void webView_didChangeLocationWithinPageForFrame(int /*long*/ sender, int /*long*/ frameID) {
	WebFrame frame = new WebFrame(frameID);
	WebDataSource dataSource = frame.dataSource();
	NSURLRequest request = dataSource.request();
	NSURL url = request.URL();
	NSString s = url.absoluteString();
	int length = (int)/*64*/s.length();
	if (length == 0) return;
	String url2 = s.getString();
	/*
	 * If the URI indicates that the page is being rendered from memory
	 * (via setText()) then set it to about:blank to be consistent with IE.
	 */
	if (url2.equals (URI_FILEROOT)) {
		url2 = ABOUT_BLANK;
	} else {
		length = URI_FILEROOT.length ();
		if (url2.startsWith (URI_FILEROOT) && url2.charAt (length) == '#') {
			url2 = ABOUT_BLANK + url2.substring (length);
		}
	}

	final Display display = browser.getDisplay();
	boolean top = frameID == webView.mainFrame().id;
	if (top) {
		StatusTextEvent statusText = new StatusTextEvent(browser);
		statusText.display = display;
		statusText.widget = browser;
		statusText.text = url2;
		for (int i = 0; i < statusTextListeners.length; i++) {
			statusTextListeners[i].changed(statusText);
		}
	}

	LocationEvent location = new LocationEvent(browser);
	location.display = display;
	location.widget = browser;
	location.location = url2;
	location.top = top;
	for (int i = 0; i < locationListeners.length; i++) {
		locationListeners[i].changed(location);
	}
}

void webView_didFailProvisionalLoadWithError_forFrame(int /*long*/ sender, int /*long*/ error, int /*long*/ frame) {
	if (frame == webView.mainFrame().id) {
		/*
		* Feature on WebKit.  The identifier is used here as a marker for the events 
		* related to the top frame and the URL changes related to that top frame as 
		* they should appear on the location bar of a browser.  It is expected to reset
		* the identifier to 0 when the event didFinishLoadingFromDataSource related to 
		* the identifierForInitialRequest event is received.  However, WebKit fires
		* the didFinishLoadingFromDataSource event before the entire content of the
		* top frame is loaded.  It is possible to receive multiple willSendRequest 
		* events in this interval, causing the Browser widget to send unwanted
		* Location.changing events.  For this reason, the identifier is reset to 0
		* when the top frame has either finished loading (didFinishLoadForFrame
		* event) or failed (didFailProvisionalLoadWithError).
		*/
		identifier = 0;
	}

	NSError nserror = new NSError(error);
	int /*long*/ errorCode = nserror.code();
	if (OS.NSURLErrorBadURL < errorCode) return;

	NSURL failingURL = null;
	NSDictionary info = nserror.userInfo();
	if (info != null) {
		id id = info.valueForKey(NSString.stringWith("NSErrorFailingURLKey")); //$NON-NLS-1$
		if (id != null) failingURL = new NSURL(id);
	}

	if (failingURL != null && OS.NSURLErrorServerCertificateNotYetValid <= errorCode && errorCode <= OS.NSURLErrorSecureConnectionFailed) {
		/* handle invalid certificate error */
		id certificates = info.objectForKey(NSString.stringWith("NSErrorPeerCertificateChainKey")); //$NON-NLS-1$

		int /*long*/[] policySearch = new int /*long*/[1];
		int /*long*/[] policyRef = new int /*long*/[1];
		int /*long*/[] trustRef = new int /*long*/[1];
		boolean success = false;
		int result = OS.SecPolicySearchCreate(OS.CSSM_CERT_X_509v3, 0, 0, policySearch);
		if (result == 0 && policySearch[0] != 0) {
			result = OS.SecPolicySearchCopyNext(policySearch[0], policyRef);
			if (result == 0 && policyRef[0] != 0) {
				result = OS.SecTrustCreateWithCertificates(certificates.id, policyRef[0], trustRef);
				if (result == 0 && trustRef[0] != 0) {
					SFCertificateTrustPanel panel = SFCertificateTrustPanel.sharedCertificateTrustPanel();
					String failingUrlString = failingURL.absoluteString().getString();
					String message = Compatibility.getMessage("SWT_InvalidCert_Message", new Object[] {failingUrlString}); //$NON-NLS-1$
					panel.setAlternateButtonTitle(NSString.stringWith(Compatibility.getMessage("SWT_Cancel"))); //$NON-NLS-1$
					panel.setShowsHelp(true);
					failingURL.retain();
					NSWindow window = browser.getShell().view.window();
					panel.beginSheetForWindow(window, delegate, OS.sel_createPanelDidEnd, failingURL.id, trustRef[0], NSString.stringWith(message));
					success = true;
				}
			}
		}

		if (trustRef[0] != 0) OS.CFRelease(trustRef[0]);
		if (policyRef[0] != 0) OS.CFRelease(policyRef[0]);
		if (policySearch[0] != 0) OS.CFRelease(policySearch[0]);
		if (success) return;
	}

	/* handle other types of errors */
	NSString description = nserror.localizedDescription();
	if (description != null) {
		String descriptionString = description.getString();
		String message = failingURL != null ? failingURL.absoluteString().getString() + "\n\n" : ""; //$NON-NLS-1$ //$NON-NLS-2$
		message += Compatibility.getMessage ("SWT_Page_Load_Failed", new Object[] {descriptionString}); //$NON-NLS-1$
		MessageBox messageBox = new MessageBox(browser.getShell(), SWT.OK | SWT.ICON_ERROR);
		messageBox.setMessage(message);
		messageBox.open();
	}
}

void createPanelDidEnd(int /*long*/ sheet, int /*long*/ returnCode, int /*long*/ contextInfo) {
	NSURL failingURL = new NSURL(contextInfo);
	failingURL.autorelease();
	if (returnCode != OS.NSFileHandlingPanelOKButton) return;	/* nothing more to do */

	int /*long*/ method = OS.class_getClassMethod(OS.class_NSURLRequest, OS.sel_setAllowsAnyHTTPSCertificate);
	if (method != 0) {
		OS.objc_msgSend(OS.class_NSURLRequest, OS.sel_setAllowsAnyHTTPSCertificate, 1, failingURL.host().id);
		setUrl(failingURL.absoluteString().getString(), null, null);
	}
}

void webView_didFinishLoadForFrame(int /*long*/ sender, int /*long*/ frameID) {
	if (frameID == webView.mainFrame().id) {
		/*
		 * If html is not null then there is html from a previous setText() call
		 * waiting to be set into the about:blank page once it has completed loading. 
		 */
		if (html != null) {
			if (getUrl().startsWith(ABOUT_BLANK)) {
				loadingText = true;
				NSString string = NSString.stringWith(html);
				NSString URLString;
				if (untrustedText) {
					URLString = NSString.stringWith(ABOUT_BLANK);
				} else {
					URLString = NSString.stringWith(URI_FILEROOT);
				}
				NSURL URL = NSURL.URLWithString(URLString);
				WebFrame mainFrame = webView.mainFrame();
				mainFrame.loadHTMLString(string, URL);
				html = null;
			}
		}

		/*
		* The loadHTMLString() invocation above will trigger a second webView_didFinishLoadForFrame
		* callback when it is completed.  If text was just set into the browser then wait for this
		* second callback to come before sending the title or completed events.
		*/
		if (!loadingText) {
			/*
			* To be consistent with other platforms a title event should be fired when a
			* page has completed loading.  A page with a <title> tag will do this
			* automatically when the didReceiveTitle callback is received.  However a page
			* without a <title> tag will not do this by default, so fire the event
			* here with the page's url as the title.
			*/
			Display display = browser.getDisplay();
			WebFrame frame = new WebFrame(frameID);
			WebDataSource dataSource = frame.dataSource();
			if (dataSource != null) {
				NSString title = dataSource.pageTitle();
				if (title == null) {	/* page has no title */
					TitleEvent newEvent = new TitleEvent(browser);
					newEvent.display = display;
					newEvent.widget = browser;
					newEvent.title = getUrl();
					for (int i = 0; i < titleListeners.length; i++) {
						titleListeners[i].changed(newEvent);
					}
					if (browser.isDisposed()) return;
				}
			}

			ProgressEvent progress = new ProgressEvent(browser);
			progress.display = display;
			progress.widget = browser;
			progress.current = MAX_PROGRESS;
			progress.total = MAX_PROGRESS;
			for (int i = 0; i < progressListeners.length; i++) {
				progressListeners[i].completed(progress);
			}
		}
		loadingText = false;
		if (browser.isDisposed()) return;

		/*
		* Feature on WebKit.  The identifier is used here as a marker for the events 
		* related to the top frame and the URL changes related to that top frame as 
		* they should appear on the location bar of a browser.  It is expected to reset
		* the identifier to 0 when the event didFinishLoadingFromDataSource related to 
		* the identifierForInitialRequest event is received.  However, WebKit fires
		* the didFinishLoadingFromDataSource event before the entire content of the
		* top frame is loaded.  It is possible to receive multiple willSendRequest 
		* events in this interval, causing the Browser widget to send unwanted
		* Location.changing events.  For this reason, the identifier is reset to 0
		* when the top frame has either finished loading (didFinishLoadForFrame
		* event) or failed (didFailProvisionalLoadWithError).
		*/
		identifier = 0;
	}
}

void hookDOMKeyListeners(int /*long*/ frameID) {
	WebFrame frame = new WebFrame(frameID);
	DOMDocument document = frame.DOMDocument();
	if (document == null) return;

	NSString type = NSString.stringWith(DOMEVENT_KEYDOWN);
	document.addEventListener(type, delegate, false);

	type = NSString.stringWith(DOMEVENT_KEYUP);
	document.addEventListener(type, delegate, false);
}

void hookDOMMouseListeners(int /*long*/ frameID) {
	WebFrame frame = new WebFrame(frameID);
	DOMDocument document = frame.DOMDocument();
	if (document == null) return;

	NSString type = NSString.stringWith(DOMEVENT_MOUSEDOWN);
	document.addEventListener(type, delegate, false);

	type = NSString.stringWith(DOMEVENT_MOUSEUP);
	document.addEventListener(type, delegate, false);

	type = NSString.stringWith(DOMEVENT_MOUSEMOVE);
	document.addEventListener(type, delegate, false);

	type = NSString.stringWith(DOMEVENT_MOUSEWHEEL);
	document.addEventListener(type, delegate, false);
}

void webView_didReceiveTitle_forFrame(int /*long*/ sender, int /*long*/ titleID, int /*long*/ frameID) {
	if (frameID == webView.mainFrame().id) {
		NSString title = new NSString(titleID);
		String newTitle = title.getString();
		TitleEvent newEvent = new TitleEvent(browser);
		newEvent.display = browser.getDisplay();
		newEvent.widget = browser;
		newEvent.title = newTitle;
		for (int i = 0; i < titleListeners.length; i++) {
			titleListeners[i].changed(newEvent);
		}
	}
}

void webView_didStartProvisionalLoadForFrame(int /*long*/ sender, int /*long*/ frameID) {
	/* 
	* This code is intentionally commented.  WebFrameLoadDelegate:didStartProvisionalLoadForFrame is
	* called before WebResourceLoadDelegate:willSendRequest and
	* WebFrameLoadDelegate:didCommitLoadForFrame.  The resource count is reset when didCommitLoadForFrame
	* is received for the top frame.
	*/
//	if (frameID == webView.mainFrame().id) {
//		/* reset resource status variables */
//		resourceCount= 0;
//	}
}

void webView_didCommitLoadForFrame(int /*long*/ sender, int /*long*/ frameID) {
	WebFrame frame = new WebFrame(frameID);
	WebDataSource dataSource = frame.dataSource();
	NSURLRequest request = dataSource.request();
	NSURL url = request.URL();
	NSString s = url.absoluteString();
	int length = (int)/*64*/s.length();
	if (length == 0) return;
	String url2 = s.getString();
	/*
	 * If the URI indicates that the page is being rendered from memory
	 * (via setText()) then set it to about:blank to be consistent with IE.
	 */
	if (url2.equals (URI_FILEROOT)) {
		url2 = ABOUT_BLANK;
	} else {
		length = URI_FILEROOT.length ();
		if (url2.startsWith (URI_FILEROOT) && url2.charAt (length) == '#') {
			url2 = ABOUT_BLANK + url2.substring (length);
		}
	}

	Display display = browser.getDisplay();
	boolean top = frameID == webView.mainFrame().id;
	if (top) {
		/* reset resource status variables */
		resourceCount = 0;		
		this.url = url2;

		/*
		* Each invocation of setText() causes webView_didCommitLoadForFrame to be invoked
		* twice, once for the initial navigate to about:blank, and once for the auto-navigate
		* to about:blank that WebKit does when loadHTMLString is invoked.  If this is the
		* first webView_didCommitLoadForFrame callback received for a setText() invocation
		* then do not send any events or re-install registered BrowserFunctions. 
		*/
		if (url2.startsWith(ABOUT_BLANK) && html != null) return;

		/* re-install registered functions */
		Enumeration elements = functions.elements ();
		while (elements.hasMoreElements ()) {
			BrowserFunction function = (BrowserFunction)elements.nextElement ();
			execute (function.functionString);
		}

		ProgressEvent progress = new ProgressEvent(browser);
		progress.display = display;
		progress.widget = browser;
		progress.current = 1;
		progress.total = MAX_PROGRESS;
		for (int i = 0; i < progressListeners.length; i++) {
			progressListeners[i].changed(progress);
		}
		if (browser.isDisposed()) return;

		StatusTextEvent statusText = new StatusTextEvent(browser);
		statusText.display = display;
		statusText.widget = browser;
		statusText.text = url2;
		for (int i = 0; i < statusTextListeners.length; i++) {
			statusTextListeners[i].changed(statusText);
		}
		if (browser.isDisposed()) return;

		hookDOMKeyListeners(frameID);
	}

	hookDOMMouseListeners(frameID);

	LocationEvent location = new LocationEvent(browser);
	location.display = display;
	location.widget = browser;
	location.location = url2;
	location.top = top;
	for (int i = 0; i < locationListeners.length; i++) {
		locationListeners[i].changed(location);
	}
}

void webView_windowScriptObjectAvailable (int /*long*/ webView, int /*long*/ windowScriptObject) {
	NSObject scriptObject = new NSObject (windowScriptObject);
	NSString key = NSString.stringWith ("external"); //$NON-NLS-1$
	scriptObject.setValue (delegate, key);
}

/* WebResourceLoadDelegate */

void webView_resource_didFinishLoadingFromDataSource(int /*long*/ sender, int /*long*/ identifier, int /*long*/ dataSource) {
	/*
	* Feature on WebKit.  The identifier is used here as a marker for the events 
	* related to the top frame and the URL changes related to that top frame as 
	* they should appear on the location bar of a browser.  It is expected to reset
	* the identifier to 0 when the event didFinishLoadingFromDataSource related to 
	* the identifierForInitialRequest event is received.  However, WebKit fires
	* the didFinishLoadingFromDataSource event before the entire content of the
	* top frame is loaded.  It is possible to receive multiple willSendRequest 
	* events in this interval, causing the Browser widget to send unwanted
	* Location.changing events.  For this reason, the identifier is reset to 0
	* when the top frame has either finished loading (didFinishLoadForFrame
	* event) or failed (didFailProvisionalLoadWithError).
	*/
	// this code is intentionally commented
	//if (this.identifier == identifier) this.identifier = 0;
}

void webView_resource_didFailLoadingWithError_fromDataSource(int /*long*/ sender, int /*long*/ identifier, int /*long*/ error, int /*long*/ dataSource) {
	/*
	* Feature on WebKit.  The identifier is used here as a marker for the events 
	* related to the top frame and the URL changes related to that top frame as 
	* they should appear on the location bar of a browser.  It is expected to reset
	* the identifier to 0 when the event didFinishLoadingFromDataSource related to 
	* the identifierForInitialRequest event is received.  However, WebKit fires
	* the didFinishLoadingFromDataSource event before the entire content of the
	* top frame is loaded.  It is possible to receive multiple willSendRequest 
	* events in this interval, causing the Browser widget to send unwanted
	* Location.changing events.  For this reason, the identifier is reset to 0
	* when the top frame has either finished loading (didFinishLoadForFrame
	* event) or failed (didFailProvisionalLoadWithError).
	*/
	// this code is intentionally commented
	//if (this.identifier == identifier) this.identifier = 0;
}

void webView_resource_didReceiveAuthenticationChallenge_fromDataSource (int /*long*/ sender, int /*long*/ identifier, int /*long*/ challenge, int /*long*/ dataSource) {
	NSURLAuthenticationChallenge nsChallenge = new NSURLAuthenticationChallenge (challenge);

	/*
	 * Do not invoke the listeners if this challenge has been failed too many
	 * times because a listener is likely giving incorrect credentials repeatedly
	 * and will do so indefinitely.
	 */
	if (nsChallenge.previousFailureCount () < 3) {
		for (int i = 0; i < authenticationListeners.length; i++) {
			AuthenticationEvent event = new AuthenticationEvent (browser);
			event.location = lastNavigateURL;
			authenticationListeners[i].authenticate (event);
			if (!event.doit) {
				id challengeSender = nsChallenge.sender ();
				OS.objc_msgSend (challengeSender.id, OS.sel_cancelAuthenticationChallenge_, challenge);
				return;
			}
			if (event.user != null && event.password != null) {
				id challengeSender = nsChallenge.sender ();
				NSString user = NSString.stringWith (event.user);
				NSString password = NSString.stringWith (event.password);
				NSURLCredential credential = NSURLCredential.credentialWithUser (user, password, OS.NSURLCredentialPersistenceForSession);
				OS.objc_msgSend (challengeSender.id, OS.sel_useCredential_forAuthenticationChallenge_, credential.id, challenge);
				return;
			}
		}
	}

	/* no listener handled the challenge, so try to invoke the native panel */
	int /*long*/ cls = OS.class_WebPanelAuthenticationHandler;
	if (cls != 0) {
		int /*long*/ method = OS.class_getClassMethod (cls, OS.sel_sharedHandler);
		if (method != 0) {
			int /*long*/ handler = OS.objc_msgSend (cls, OS.sel_sharedHandler);
			if (handler != 0) {
				OS.objc_msgSend (handler, OS.sel_startAuthentication, challenge, webView.window ().id);
				return;
			}
		}
	}

	/* the native panel was not available, so show a custom dialog */
	String[] userReturn = new String[1], passwordReturn = new String[1];
	NSURLCredential proposedCredential = nsChallenge.proposedCredential ();
	if (proposedCredential != null) {
		userReturn[0] = proposedCredential.user ().getString ();
		if (proposedCredential.hasPassword ()) {
			passwordReturn[0] = proposedCredential.password ().getString ();
		}
	}
	NSURLProtectionSpace space = nsChallenge.protectionSpace ();
	String host = space.host ().getString () + ':' + space.port ();
	String realm = space.realm ().getString ();
	boolean result = showAuthenticationDialog (userReturn, passwordReturn, host, realm);
	if (!result) {
		id challengeSender = nsChallenge.sender ();
		OS.objc_msgSend (challengeSender.id, OS.sel_cancelAuthenticationChallenge_, challenge);
		return;
	}
	id challengeSender = nsChallenge.sender ();
	NSString user = NSString.stringWith (userReturn[0]);
	NSString password = NSString.stringWith (passwordReturn[0]);
	NSURLCredential credential = NSURLCredential.credentialWithUser (user, password, OS.NSURLCredentialPersistenceForSession);
	OS.objc_msgSend (challengeSender.id, OS.sel_useCredential_forAuthenticationChallenge_, credential.id, challenge);
}

boolean showAuthenticationDialog (final String[] user, final String[] password, String host, String realm) {
	final Shell shell = new Shell (browser.getShell ());
	shell.setLayout (new GridLayout ());
	String title = SWT.getMessage ("SWT_Authentication_Required"); //$NON-NLS-1$
	shell.setText (title);
	Label label = new Label (shell, SWT.WRAP);
	label.setText (Compatibility.getMessage ("SWT_Enter_Username_and_Password", new String[] {realm, host})); //$NON-NLS-1$

	GridData data = new GridData ();
	Monitor monitor = browser.getMonitor ();
	int maxWidth = monitor.getBounds ().width * 2 / 3;
	int width = label.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
	data.widthHint = Math.min (width, maxWidth);
	data.horizontalAlignment = GridData.FILL;
	data.grabExcessHorizontalSpace = true;
	label.setLayoutData (data);

	Label userLabel = new Label (shell, SWT.NONE);
	userLabel.setText (SWT.getMessage ("SWT_Username")); //$NON-NLS-1$

	final Text userText = new Text (shell, SWT.BORDER);
	if (user[0] != null) userText.setText (user[0]);
	data = new GridData ();
	data.horizontalAlignment = GridData.FILL;
	data.grabExcessHorizontalSpace = true;
	userText.setLayoutData (data);

	Label passwordLabel = new Label (shell, SWT.NONE);
	passwordLabel.setText (SWT.getMessage ("SWT_Password")); //$NON-NLS-1$

	final Text passwordText = new Text (shell, SWT.PASSWORD | SWT.BORDER);
	if (password[0] != null) passwordText.setText (password[0]);
	data = new GridData ();
	data.horizontalAlignment = GridData.FILL;
	data.grabExcessHorizontalSpace = true;
	passwordText.setLayoutData (data);

	final boolean[] result = new boolean[1];
	final Button[] buttons = new Button[2];
	Listener listener = new Listener() {
		public void handleEvent(Event event) {
			user[0] = userText.getText();
			password[0] = passwordText.getText();
			result[0] = event.widget == buttons[1];
			shell.close();
		}	
	};

	Composite composite = new Composite (shell, SWT.NONE);
	data = new GridData ();
	data.horizontalAlignment = GridData.END;
	composite.setLayoutData (data);
	composite.setLayout (new GridLayout (2, true));
	buttons[0] = new Button (composite, SWT.PUSH);
	buttons[0].setText (SWT.getMessage("SWT_Cancel")); //$NON-NLS-1$
	buttons[0].setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
	buttons[0].addListener (SWT.Selection, listener);
	buttons[1] = new Button (composite, SWT.PUSH);
	buttons[1].setText (SWT.getMessage("SWT_OK")); //$NON-NLS-1$
	buttons[1].setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
	buttons[1].addListener (SWT.Selection, listener);

	shell.setDefaultButton (buttons[1]);
	shell.pack ();
	shell.open ();
	Display display = browser.getDisplay ();
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}

	return result[0];
}

int /*long*/ webView_identifierForInitialRequest_fromDataSource(int /*long*/ sender, int /*long*/ request, int /*long*/ dataSourceID) {
	ProgressEvent progress = new ProgressEvent(browser);
	progress.display = browser.getDisplay();
	progress.widget = browser;
	progress.current = resourceCount;
	progress.total = Math.max(resourceCount, MAX_PROGRESS);
	for (int i = 0; i < progressListeners.length; i++) {
		progressListeners[i].changed(progress);
	}
	if (browser.isDisposed()) return 0;

	NSNumber identifier = NSNumber.numberWithInt(resourceCount++);
	if (this.identifier == 0) {
		WebDataSource dataSource = new WebDataSource(dataSourceID);
		WebFrame frame = dataSource.webFrame();
		if (frame.id == webView.mainFrame().id) this.identifier = identifier.id;
	}
	return identifier.id;
		
}

int /*long*/ webView_resource_willSendRequest_redirectResponse_fromDataSource(int /*long*/ sender, int /*long*/ identifier, int /*long*/ request, int /*long*/ redirectResponse, int /*long*/ dataSource) {
	NSURLRequest nsRequest = new NSURLRequest (request);
	NSURL url = nsRequest.URL ();
	if (url.isFileURL ()) {
		NSMutableURLRequest newRequest = new NSMutableURLRequest (nsRequest.mutableCopy ());
		newRequest.autorelease ();
		newRequest.setCachePolicy (OS.NSURLRequestReloadIgnoringLocalCacheData);
		return newRequest.id;
	}
	return request;
}

/* UIDelegate */

int /*long*/ webView_createWebViewWithRequest(int /*long*/ sender, int /*long*/ request) {
	WindowEvent newEvent = new WindowEvent(browser);
	newEvent.display = browser.getDisplay();
	newEvent.widget = browser;
	newEvent.required = true;
	if (openWindowListeners != null) {
		for (int i = 0; i < openWindowListeners.length; i++) {
			openWindowListeners[i].open(newEvent);
		}
	}
	WebView result = null;
	Browser browser = null;
	if (newEvent.browser != null && newEvent.browser.webBrowser instanceof WebKit) {
		browser = newEvent.browser;
	}
	if (browser != null && !browser.isDisposed()) {
		result = ((WebKit)browser.webBrowser).webView;
		if (request != 0) {
			WebFrame mainFrame = result.mainFrame();
			mainFrame.loadRequest(new NSURLRequest(request));
		}
	}
	return result != null ? result.id : 0;
}

void webViewShow(int /*long*/ sender) {
	/*
	* Feature on WebKit.  WebKit expects the application to
	* create a new Window using the Objective C Cocoa API in response
	* to UIDelegate.createWebViewWithRequest. The application is then
	* expected to use Objective C Cocoa API to make this window visible
	* when receiving the UIDelegate.webViewShow message.  For some reason,
	* a window created with the Carbon API hosting the new browser instance
	* does not redraw until it has been resized.  The fix is to increase the
	* size of the Shell and restore it to its initial size.
	*/
	Shell parent = browser.getShell();
	Point pt = parent.getSize();
	parent.setSize(pt.x+1, pt.y);
	parent.setSize(pt.x, pt.y);
	WindowEvent newEvent = new WindowEvent(browser);
	newEvent.display = browser.getDisplay();
	newEvent.widget = browser;
	if (location != null) newEvent.location = location;
	if (size != null) newEvent.size = size;
	/*
	* Feature in WebKit.  WebKit's tool bar contains
	* the address bar.  The address bar is displayed
	* if the tool bar is displayed. There is no separate
	* notification for the address bar.
	* 
	* Feature of OSX.  The menu bar is always displayed.
	* There is no notification to hide the menu bar.
	*/
	newEvent.addressBar = toolBar;
	newEvent.menuBar = true;
	newEvent.statusBar = statusBar;
	newEvent.toolBar = toolBar;
	for (int i = 0; i < visibilityWindowListeners.length; i++) {
		visibilityWindowListeners[i].show(newEvent);
	}
	location = null;
	size = null;
}

void webView_setFrame(int /*long*/ sender, int /*long*/ frame) {
	NSRect rect = new NSRect();
	OS.memmove(rect, frame, NSRect.sizeof);
	/* convert to SWT system coordinates */
	Rectangle bounds = browser.getDisplay().getBounds();
	location = new Point((int)rect.x, bounds.height - (int)rect.y - (int)rect.height);
	size = new Point((int)rect.width, (int)rect.height);
}

void webViewFocus(int /*long*/ sender) {
}

void webViewUnfocus(int /*long*/ sender) {
}

NSNumber callRunBeforeUnloadConfirmPanelWithMessage(int /*long*/ messageID, int /*long*/ arg) {E*Zj]FrXdKbC]j墿3.Qo
k"^	'uW/R
"&?WU@T	[nj3ܾU1^_-o%u(+C:]⁀L){͑,qF
Η~/(3֌vүrk
JCeY2kt>#Bmf}66nkGў?89dMa2NӅIPp}.>9v5~iԹ5OPk1tU*$T fg&KDػ<"6_CB0M2ut>GĪNTZ
Q1nP9ퟅkQhC	a]Dm11[D͗{C7xpb{yBc	/ir]aU5:w66A_B0W$CHLq`D>X"Νz%Ef׾`+&b筫LbtR1j%&K_7_n[ZqW"cZmG8v{w\3bQR˵|evaJ/Qv]1
, 2nhPdRni
[CUuhUS-O]+`Ʉu'=P|jiܥGAۂa	&nuCH7+D+plB*]gj?OH S>7f5k>{⟠^Fx?>Ryˎߵd &G:?q*'ʂ	avDL0[?C"Z2ܕeF}hGh Зۛxaf+{>,Ο9eBm
>SoHS[p7i7bܽUA3s:G;iZ5GEqsAR2&-"lk3	zTow35W%,5Zc
⨄://8f뻚>>mLݝlxA#RE3(DȥPҿaf7}G)F; |)OU%XF|:oe).e~~Qz:W0;#(\
#/
K
c'4*?mј1[K"
Ytv1}=mqd&[FV=A:Sd%n+G/mvbChl@L|{.^6j`CN~}R;2г_Te{a.kVE))@S$F2eV/LNU
΃Mgi<ɘW2fg+[P^㑍[0][T[?d0 [g7
β>:^=G~m\ܥ|
Clgboʀ8[fc!bi{5oqҦu@4G;e٪j![U~JsājoP2^԰x|eM}Q@n4u8i6wlq#xWqL%=Z/Htazwe7m]``ʈH.+e_*1Kk^h "Qo#3AAX>Vp4
GUZ:.rkw
a>➡D›&7w0V+ښF6f}c.iOc,1'md%,(j\vRww@r*"b?J;jTi:7Q[JŖmhn1#|e];Em	КMTDnދ_7l)L/?B{13igP38%MP:Iex:cǢ ÛE_Cޒt(l9.BGnB3r
!aXZg3S*mq9["qƨHF2D*`,V$P|e:]ZQLqrѓ/=ܟT	t5WsVwl- "rdVޑ!8EU:r62R!NiF߿6MZ1bx\Cm_݄0s$[T^:ae
MW,$meQq+0mTugbI4k{ҟ=e84?^߭Tvziſ<gg
e$AdkQiOK`&|}<+35ԆH! oB2ZN|YOyAɈF4Pc.({~	Ee`T	򎗐>AW[2a"21 4RmmovVy;ӥ/2j깪Sȳj`?Yv˖V!=RlR=]VhŖ~5l3=P@PbNrs&a/?1Ú"uĪ'*ȣ+2
˂'wniv@wcLؾ߂#n9SNvV}WRί52ǧa4svw#,Xt5qwpR玓uV,N7NGF^R7ڎ|,3>0%m;DG1`
^Ɛ۹&iR, be5O=R\ ‰{_5D-1]_N\t*RwLq"j>Bu+Nsz[f/ȋ2vDMF,ʅsM64e}5DZod*ϹCI}Mt uT`޶sH[ZZ oQ^qER\jwZܘ.e7@b20'FᗨǧzwDKYaxʘ:yZ<ύ6j*DflhOB:67?VH™^{c1,X!criw:§{ҏmu+>1l~M4*dLnĢ
e|+K]q`PL#/e=x^hҺ-w/`d[[VHJ']]\O=y^cĎ.	
T#PbЙ?Yѧ]J
rRy$S{#ͱfTpwpt$L c8rUX>r6WkU_2A4ݖIoIEH-9cBDQ'	?rGPQv-Q~xŐj3Bƽ(bB<62zv+{,
E2ZDS(
>,6`dbsol1kωU(
(U0* bLߚfiw^C~zX>
财	ދP?
/!p;u%57M*^'P]"&H=˚F\j!3Փ߈ت_$%.z"q6qa4i 'O\e[܄0+v0ط-v,%|*#2_ݻ4p	Q'_qx~?n6\\MtJy2:I&,8Ě}:8[L2Fk(DGP!@ږogӨFYj
'E*0B]W	ޛ٦9KXSPv^Z8o9~4_œͭY
8&CDx$bf!o0X[_"sWJ۶ֵ~pzn|kBKspo&HʞLg[[ 
y̰lέOh\
N&\'2I8Eg;~67rGyC}.Ox͊WN,wܸwMRs XŒu57Kԉ5]_hx
sQbB8?s=Qt{ˏ{s;U[	V-kH	D^qis\)aTRʢ!Vz}h
OvI,8Ylg5.[mƳ*y7`f+kWkγv@_
W?"|nF\nכ듫O"|Ҙ(Nh8JgYCX1'm*a2Á ^KڑF컲/p!D/y.IEdlߪ~+n
ׄeK8feBpu^7En3q+".-/uT1Ur*хvl+ԔYHy!o3.5wc*]xl
oqQytnNF/ܴ=t&Zw@b`ui}~2k*A-LD2m8V[m2Q›xmT!
QIK`Ptf{Ksw׋:NJG鴍`ih8N~CRhu嬪hvVY^ҭH*#ؼcB;L/xxlf7Ժ{VOL+Po6Y'C2`E4dlN[p]T|r.z`BM|XNʱ=)F+eGYM"ӌ57&h,7ܡR5NQJ8?:EF籾X31_r'6(Fz/y(2ȑnP%~9U*M	wqs5:"%UGCj<6
MeyRyC~
)RD.2/D	ԫeI;#{)KYh&F)	N(o3&/QMiVz8BHm{ZI 00b!qD~:{'1	;
Nc3YJaښZzKEfOf@Xgb=`x6.`7m1r͡;+=X,8"%R	6^c砙n2|ۉK@b<.cM~|:eZ(-6Q4%q3!7X/cNOb6tVaҲ-g"ț!$hѨL"UB+s#P
|Hp!^Tm\v
N[gݺ^,K@9+uV:W6efډNdQ!5lJ+Dۙv; jڑjiq$>jlʦ6,72Q"<0,@*biB֩IU4X4YfKa6M,9!k#\#O?ԳY\C:Ly6vOBޜ5ABhZ{	RWǔxVP5e+YSlxO@xڟRԦ-4	6{m!1{v?37jHkjЯ+w>Y76;ȝ`I2*Gg't8"2==Ѱ49Mhb͞z}brkbzD42hL4nNvpg5z6%%ͫ`h͞ZJgNV
wjs!7qr>Z.}_\۸!gs -`хOS3-H:,^0-B;]~SoѠ;B4:_drEb	k7ͪL)xrTm2:,89\t!{06'2|8¦|Eƻ0o8NoK?
tОNl ЗS PcŠ.|
$FXa쀄ki@`F-?%մ$gE(:GwQڜj$HfE+y)ߎ6}Fը\r~~=*rx
\B~ߍuUWfӃO::'$$]GH,FvԋϠw4U=hST=˄
hD|/vƖ~䳹nrURM`KrtS(305= @ʩI]Bv-
1)4b[Ȇ~\B~'5
TFxڮ5sF17yK::7.0i.-9gwoj'TdߒR{GJ֍Fw+C
"9.U&[/;Ojyϸ\^ǾQsڨp\+zH(j;Z'}b cZxd)~EckQ[GR0zr呣(,(?&율U>l!@Ԍ(ĕu7F%CD3.\aOt
%ciUK˝u~]P+SM"Q:@}wmwZ(ßN>K}!31	4xAo̠٩`4W(@hu40R4۰vsӴ.\rL&U D|kT
H]Y[x=TR-0*iۑc?M#2H+?9= 鳗_[.5\FM8Gh>Of'֐Et7ӅaOsV/ڶƱ=Z\#_0bH8j5Ķ:鷵~la`ʚtfUq3U\vT>H͹wֶoTH"HJdNxUHѼC#xZ\t)?nmչUu|8Cg##pzTj\Ͼz]VA2wըHk0DRMkd1⸁e[y8CIL(!e!X:<
wgeU_H0'HItAwF4	\~YyH`&5RDj{p?.Tۦ9<>30҂h˰̩8n ~8*MTH3Eb,VMZ?,RM//.:NQ]۬N33֫ڙq>04!F#epI6d>O(X,kdNQ]RNҫۿY"7Y2ZtTzޅ0@UN51ˁ5'b4_~2۾Lw@+gC#y	:"R%*cmyI|dӸtwF߂lcT"Cd"qj'lxwy
&RgKyRrB[Mb0zujBL*|P
%^+$㟜6vW}?Qo<{
7S`t8t4?$M$92Nݘ#Q؛
.j	{'l<C]>Q׸¢2kԫUa e(au3pv"RjUЈ""p69·ڒǛ=^ު@_cl.xg۝JQځKtS'i3j5~ma7l&i=|dɩTm2:LMaƦ acj%K_o}|?Kau͠Xc%M? YQ=ܞPSڦ>`/akMNkɏ	$Wgb?zWry&줡tW`8M5pZS4pVSx]ބPyb^c?1H#BtxQl~.IV
lzM㷨ce=
%-v!^xلbbZ!h;of~VR>m/kJn7zgʅ@U]W*1OY0Bn:P9TI}k#(Xb-m3RJcbsof:2n#j|sieXW>Y^6
9ߌsY|<8Mr!my\FS{`$ɅܓĴR+mN@(Qqa5>lwEOGL1'Cm{+B6p
˺S,c(&D밈@O͵Xr6ׇn`L'mCct&+UG47'3Yx6vR[Z/	WayjKP$Z$QxXx֮W%$m8ZK|t"d0Y_5,syQ2>j|s{ όfؾD@`gJjEfp	pZN`9a(2dbmDu".;Q%m2nCΪ[ݲ	;TzsϦ)S#t
-=<䃞߆H;B"8ېv>Z0'^nIӫKր(袯yn7#cwjz&{Ls?gn"žrgV̼c>o#Pߗ;%U{@Æ4>EjFy<]bQz`مґ%arc"PU1<ѓXdF)(#@g0-Tb=룯{' R6/-jN/ۤs?adxbEUVmMv΍这C>|w~4	+
6Ia.{fY+qS%3k]af
<[TP^`s_2Vl'ġrxVZ{	Y.F@hẎ4C`h' Z
rH>Vv,6=88r*_ftemm]vWbUtn5Njb	JkJMqaPIdM'z1Mϱ
%qzY6
	豶V3b%)U4QTW-=4@h9#a;ބ0}5X/eh~ijyfUcbXAv_SRZ8I?q2&jzuR+^vW0i"̄):dF.)|g"Itc|x??޺f$yIC:
S3E5D5{EU@V,P'
29*lk$%gʐ;ᦙq+:w
(G#dVz
	Ӆ2x9Tw@s
$A1CCxb:|vq,dC7%ZJƴLc*#AU}TǸP
E&qeogMRuyɲpqT):}kDjn!;еlK1G 1̖Dm?i#:o1l#fN7(`Uk+,uS}&`F亮+k㨟($·B<5`X)5F{\^Clķc`ox3ώ$ǫm/DZ8)t$ 疙I?i˂~ܼ1Yԋ[1~yB	iA]|u*~fHi*ܤkcBj"abEWgBO8S v!ҐOGhFP?g2{@=:	1':Qy!1mK}:rP$b<˥sČ6ul}6]*
-ޅ`t<NlOq.L']}]"E7	AHtZ1^2˃M<$[H֬fgru/hgD1BexE{)!0}@:6?mBIW=ñ4VGtU0ؔ_A,thp%\хMw'gX8آm8sƜV&wk󀓰áf5Rƿ2"i+"㿸`>3NoB҇F!\S+ZqCÃv:+wS?K$Xfju+~"JyG
U7ȟ]O}ecLmf_-~-ƂZ@ȿm{v
{77ͬVU.iK:Qbõ9I̢I/aHEgg/Fd>k2k{KID.fh_J@ªsԃiD&|N-9
ݴRqsf'E:Ԕ弣{AjxtZ=k	mRlk&%+z[BO\rƀ| pd]~~o=/$7僩d$TW+Ezqu2Ixș:<߃Z!Akswv
#[hKI첲LN;$k:8)7:3͍']8yoʧD@``?lieB@Y[Cgj*dfTST>Nm|եPw %K; o0Z7O,f<\}~p%{=q/"Q*5ݱXX8X`byٺg"6LGmQXꈗwUCLs|E]H.
G	*I-)\V]5cx,g
NTMq)Q2ӌ3-SGK>X,r:~AkX8m`?,*[GI7a-y`&(cmyӷDDAܩ8sQh!*̖Obʿ.xrpkR$>FĆ-h%vS@"Gx
}oenYM
=tbVUHmNr>4osG#{3!p,۴2GWɮ!Y
(Jb?(@4[=gcm3yaGTC V氙n+,/`q,|9`"C<6G%jH|yvݫG[K -hboh$ad~w%Nٻd}fmNpoYE
{ɧU*[+d>"6{4q5R'UHYRL&J7B0a$[5JU6jVH C3sYS=°NeEg}vA8.1м6{MX|~DIBK6FT(1tomm(0 M?lzE};$K1g>'Cޯ&2ρQ2Fȉ
q@
ܓ(.]?
0.Veu	,f`FC"%8#'tEIymXI>M dsb5h+E-Ua,׀tEJ
&LS_I$(T˜0hZ}>lFӁ^?	d
9(E8UW|ټgU5c)g)xw/{F!qWφuAJxE<@fW\y	+D*ةCSf3ۑIl/{>q;1vydžѸI.Z$|+ڮo~HwC\Ú6wq7zbk9ót	1h},_qKG#;.@%zӐ=KTNBB۹>U:i\X.!{ebRN!v3F[ڱ}|yp`vIhW0F(7cv3B4K8{'0[O4Wn-S v'hR)/EQ4
!p5o t
bnî@]X
(G/|OҮl/x|H0l!/N_ȴWI1hGJ9NnZ>LMȐ3N|K]ɰK@.NHMXfЌt_	/;AkqngVʟ
VY* Et	TQO\pz#උls_#Ml;;yt3/[%Ɲ8}3[ׁ&˭q}ⰱyRY9$D_K:U?h#(Fa+:)}絬_^;rL
Xࣚ)\A/p3*V7
8NB[]9@JdL|hDoWEC?DfAՍXh/m&CaFjv,9Ȝqgnnb],OQ)ZW\PZ2=iýpTe9C;LVnvu2}E,y9'`]#fiO.kwx7B~}leU/B+'(TsqD&MnJDә3^scP3K‚cՅ 8Z\$ZӰ^'xϦLWRU`B;$GQ].!
XۓR1352Qe$GNFi#Ɠ*NQܓs5,wm7nX%4+sM_cϒf`UWJ5ħþ>+X]єh7eRj!riNV8ɓCc$(?RFik[齂G}A?{'8r@UHo	vj"RrJoVB7CL_m@^*2:HPu5)Yn0|NC~x	ヅp9='>@dt%ED0b4~_G/qN&r0i>N)~Qz]\#z_4Y,~~3a[6nS?duU!MĶMO*HF^$:/x'H^XvûQW.֨uk|dTOEid!zN}\Rot԰A@8L4U_`Ukk3!'s6vu:Ly(NC%	5$&M^-0E$01)qh"a-|Y{Y])Ҷ0ݩit#m&!g:`oPGq#7Y_+aŨqlټoFf%fGKUGf<ɴrjt$y$(eR#R`H$IF
nav7J2
6W]$vFgJ{ܩ^L]ܒmC eހw_KP(q?||hJpA/QmEWY.>owDLGlLG̈rM}w/TT=D'[7"oyfqLFnMtFif{9ɥlU?hP=*rm7eHX7]YxR37'IO0U
Y؅$Vt#SfT"yjt^ͯESN"O_iB(vLMxu
14U4(iz?{c'+v:Dj}+	EtNq[-&*Xu}c;F+6,%^#ky{*vhOM$=ϟ!
c.j{B(u媗mq >6 h]Ozm~}h'N.u~[6>xaWbMAS\G]%v-Ӣ)_sC?DƏ 
wQ?f1oW>٦Y 3jNkjnjL~\
]I.td]!os<σ52B}:YIJǑZpWf3{1aM-fo!UiA:}d|DO^E	lDIc|(PpH_gFt^hSs5{Glxi"hASF~up|:ȁc7~0U=@6^!2˕Zv'{NqT6)b"hAGjܼlZ*oǾE>k/B8ץdɃxz|1J2Fb0j<ӠPyϾ7
eJ:ǽdOn+{ גaF\%vf!Y'{ŷ(߆mHQg5lr\t
ɻcޞ`\qb,KI;mq^J3E=vg]Hܩ}3Id{G@P4c]zen"9~i7Hy>p<|nӬHB^//~9bt#yN2:sf&<7~eMFU!&{ӫ~sͤ瘡F_3sI:JOjʢN>Q#"]
trxJ3/#A-gu!._m٧DK^1i|Zl)|{(gVQ+k)?,J.CjmEV/\m!yO-CgwN=w?\ƣ}KNo_vTro=1ݯcZƷQ$dmEa?!vZofȍקOj4"Rvʥ9;dk'C͗7'Ã/D)k%,7xDf/*U3ㄻ"fOpYʹJO
RTI©\PdыWئŬ 	WGk|ֽ{њwsQE˼"H%|V'UX!3|cLfYJb?łd/s0=3z壾o;O]qy1@W,Ġtʯ[9viJ̋:Hlg^6wq]Vysﭡ>Lۣ$	*!Q+˭Ym&>Do2ِMڴ(195DA߿&S!	e(\K؍{
'AKh!!8E1|	'I	9$Qx 5gMя=5fkM.!Vi/t?MJiQUQ,T
>-tϨA"yzWG'FOdR-i]"`EJXJ9
!iA0ۤs4
!Y\瓰? (5_J@=!1C/P_

uŕqedgf4|XA-40'E|gUIW雎N
hoy2etp8{f$v6}3)W("fJjf;	d-ٖ7h$=(xު0
<>H%$[K"(ԛz@.gf8DSn*'wR7GycLj¦"/\y>i|ĿK=@?' k ɪA0S\2[e\IC-'i\,Nnb܄AX7:}n3)9尴*MtiUVD#-;0o6`M
R{	[	<"ToU  $P]lIcL^Gυ))@YݠSw^J~G*ʌw	Qjų4pJ?~$)
z"g9Ӡ2>T~i
?Ҙe]"x%짉շȭ޶\`%h2%D$?9߾ώyaUKpHm@-nR׽gg!a-Ur`4i"챠)/5KC.U>ox,l@VF1\]j"kLvI?Cu\69M7r
Ԥ!$qJ;pl.R!6PksAFnMv֌6,Nl)WEsLg/{Ibe3
:ƚx?{oN1,W3_YFә!px˂@!][Έ~Șa3QS?`NCZԓA?΃p$'V~=JcPH!\`g9,,'ICtb(1>4z\j7W䝙5+r倳P!iO"NFK=r=jtnA8xKeu}>qw|OYn/M#\mcx)#0 Ryȭ"}DBN^dG=O?nϳi\~{$q8x&A
O*Ҟp.YI7"kk-upCzMx]3Ǽ,>I"ٱC3Aitr	)
n;55.M5qjoG
620CyWz<-h4ol*#ȀoOGgsq|a]ge*tdjI=U>F1{Dۂi@QںrK&,DNxS
 	AGXZjd|(:^-'S-0*\ɩɾcm6$@4_¤3K’NG^QU
#4^~Tt̪_-جNebtUne7ⴭ-6A^rɅJeaw"&^2sl:G)JmxOfzI~҂UDDG[ K 1D;p%xQ[;+MWC[˄xFgI5"~Q
؅l*/%L~tA\ua^5F䃓\l ֊^=j4{Жu$*,.
̞+,U`7㜶`}z?3K	d -7PEjRV7=b(
!ؙEʀu?ќ'!)sg8Է RO?
TaNBg/GP<~K!pZ0_҆@XeP!;(k
]ZUܿY?U}
M~w6a@FID:#svQeI!Bl9(0vIM%'BKUOq]hA[W"@eYY
[yB=SZ;4F7SOƪ[(Bfi#GAFv,yK!%oXLp>[c1%G$W}J~
57`Aaq(=C5%pڲDv^V7MM(/Z
<`G-(_k*GSLÿV)]l;('חsIJ<6̀{XZY8Uz܈b!dWtYfBWՃU	j"f/Hhۗɫ<ɋ/cJK(r.Xe'·=nNגRgz+nĹc]1u3Z&qC1sEx@pV=;:QbEQx.	s:$i)`/,.FnFx.q
<'#bk.\ŧeP$2/r+y/6]kQux|5P,W~!c;4Gw0/9(UVz
fәݒq=0^׾[D^\XCj9?BM~pT2h-eEDivj5rY.d14աu%)KpyCVqR Is'^0x#p9KEwY.k>S%Ky)wBx
^a
4$?I~o`.߳h:ʇ!~4`lA|kd
<%k j4?
݀IsDX=M#$IIvdTL𵧢=$F*HC7nR2d5zH4jijwD71>|(ңHƙz0ip|}o&S
j.a{\]߬Er~LbC*qTQ7-ZL	A8HҐoN-(nB.gWzLŷCA)^:'{6*ް?@okZ*ļ,W=YzNK@(*KBU|=3[-Ksb:Q#`5\[9+\f)r'xFONr:`(4~
Sٱ	:e`Ɓ3G:M~f$ana͆v(t<Ń-]$;ګ{R#uS
8~s>0UKI)!T&5abXˑMDO1lp9N+d%[_Q	|>$И)VY&\\ga>$u8"MF'L+t c%>"(oŸ!zeNMrbdv"
1Qd,Ta^q>?!q򥹄}=١NI7h$K/[n&KsQpH3pr_8m>Џ'a}|XC!s?tv
3YndT;
f+0rQY<3BlVs(}|-P$K3>lSJ"q(Caփ"4y>c8k|hCQVbFRݓT 
mFthJ;;Z\>AC|Ȕg>v0`:o `(R
pLsEcɫX81Լ#Dic2mFݎg'Έ	f\_U|wpDB{ѰhO_O4D%(EWtK[K[~6ӄSP;*$nHG\7X=UU'$4VʧQ#!7ZIg'g
zn1`JI&Ҋϣ(X삖Tߘ:b0cEYI+{Eί˙Yj
)Eo*}&[Yڬ=lODQFph-MXٱ|#)M;Hd`6a{Jr+dYZYrf֜JFj6wնГ&ײ'ok9:[gcoڮdP3'ʄsZVz"-Xute.JY*@ͱh;?)Hc(ޒC<z/Di1u E5IaswwήrJ;˅ǏHpՌBޒUˬj79a+[
&2e6$].Q!183Ji㰹n
a:-2\S	>68++O@N?vi.[V;] _pM԰]<)ޘ||+Ȫ2Ξwt?0z̗_ZK.IޅJ`}W3Ey
+$j'O	R$B/XFxjMM]HgTY;q&КV>WYl
~wp"4vD)V{L$=&|\z-`+[P]70JiDl.yTj\wLc̬0s$eöTƭ^YtΝ\CVfa'SP
{W>rSSPűf٠?s[n=c	nR67X_\މ1r$JS
uӗtjYtVua m@םXaONU/uhps-F/,L%T(mBZʘ(lE)=lE>%N GeSFf$YUܳxO>VK8-2)R%YgΗj8\C˃Т.l+&
:jF?qԚm#]E:sb,vǔW{[D]
msЮA[jX@0Sfd8R}2{Σn`Cgv"`wp+KE꼱hKAI	x,e
E(*u30Qo%"z?	$(d )J/+'d< 'Y6g>5C9Bw>ci,־4`Z7]VodTS҇vPOyūvj1
Eyط@
Cv,j414h$~nK˕)='>/xU}2u>	wB-RDD@+ϙED
Sو\{;YP+ڵժ.b'tLf:I)+nL?\
.ys$xhR)0O|TgΩezUWY
DL&-Zb[!gXlUg>RaW	ֿ_JMgrFYIf	f1f܉YD:ۚ܇h ש܅砃HMtq󪲸YTVqP'o17)b*g  X6YXsh6^(Zhx\:wy-0:%tZiu=ojn)2m]:ʫ'3@h:3[Q
fu1dYM&A;Qf]Ǜd5߿R$[qNZ0"v?lFCMcȜ݄[:B\!SrC3C:"=u[,i1R_
	_n{*~ŶyTUYeUBnFuKcbL.];dSg:4i:o 3tn0NXB	s'[uIW0ȯLR{*ږV'7*/$(gBYS4=YSJ]ȜH4(rh2H'qՇ\mL\4sjR࿂ۗgD<_]-\!כ:ѓ-^9	Æ	El:vw?)4=34YQy&=Y7׊vyJ[x!*0s
n*B̏K]M[\pIZ4znT6Mc9tDƅHa#HGmW=TX8ѣe=46$iD&tSsۄǚdnaց(oз${}zSK;k,:a߱>g=&|"j?x_8c`,WǕ-o+JkK.|`E:i3&b7TjC{^9t|ǯ+9GG~3꿈63:-X(nA]A#	LPMsqgu2x_DVSDV4CCyr*;/RN)}(JQŒ;[50ZB[:,wzU=<io Rv$/zx\648C뱓*]C<0T\w^	MRV/hAS]ҁW#fMzr[\dڪlhӛISHdr<btŁpfQPY0]Ȉ>K	7ia7'22rkBٷfk.cNq.yҽqe;	0|s:،rxFUJ\](c
p64(iZ9
a\q$5ΐKo:EoyvTd4pM'?Sy.87qL>%Х[! )T%1%!`r l(F7n/د}DWizl)
#:f9ę_RX&gY'_\
H?#!2akzB \UUK-m-&yUjUJMJq̐Qy+)[Ye
(֐3%fO׵jN?,zdįքZQ4!ؑOW.{rL70(xHAA	MS͎ڇ͊xLA#nDU!M[̷uTԓ/y&
6iwj"a'E]v$

GmNZlx)t=j!ꇊq*\-Y5K<^z|0T	5`EZR%tۙtVsW oP5N'CIOKA8~mswxZDJn=
"Ne	C{PV9nC588\I*&݋ӻ^v)EzD৓JFKWksU1tX^`Bw"euy|$+4sIn.]G'[D1襐p.EFx㵐SȤ!35ޏoB`ld06<
W:3nU{^T@;N.^S#x9k.pb*⢇]]&7!{	v)u*x&t4
vmGa{qMJ.&>X0"[3G-7+Ecwؐ&вD8[ɢ19q
zr$O1$?ZIvOra^`WhZf-|)O[2,)N?ʹ"%S^!PxZXXY#s&W^2WY?rEF~4HϴGocf>UqF0:`o'>uWV:f>{w*|Ui2fȨ/v-
]tg%ń\b%+>'\$fƻ=w]kQLWZ'g}F͠Nq[lQG³Nda\M#~<%e18gjCd풹xJ|-FĢTO>
T`R1)Q(䆥GJWH~9yd\ꋼcpOPWf`վ+>#Չ';*FV?P8f꿏C/GŽ#)#d?-
(`ua80C`)DN?=6苭;]4s	KۯzvL`=Lj]~rG/1nX$;~>猪ÞV,yҎڞtד.`L2ozdʾ;0PEj0;ηؽRS`P_ n\|X˼JOh )t-[F][aGB+[m+1oXiUvGA8K1\{ FV:ഀqX`O$6p1	6wCŀx	Ьr3#`-:A|Lpm;BGصQ:{G4cސ9Ԯ<:&tҮr|plGc*h?*bqU"馏XB12`65f~wm
pcUe*>۞=%0$@
%dJ1>Ⱦg 016r_&qىaV</:D(}Pns6ǃI#04U5OpQc@/wFANatmU
;Ќ;̛	{|^\E>K57d溊AVgNxE 
Qb*$kb\8ɓ^fJ	;&b*`6ت%_pRAM
6yOɒCrSA(6聠pW&qiE;nwN"*&Do~kd)rܞFJ{$Dߴ\A̱doŒN_VQQ0Su,۪CX2jThϚgS_^DU7?IRózKA2ӅPq0K#|ZR?%bWa^2=/p38KurwºY¢F1	}pEβGEBhGL	8$(ZGDZ$[z?jz9H_'MƷ3k:Êr=5aÔ>ZYt>8qg~Q6M\:~DS'<~##ܗ8A6hJB.(+1VӌN=_.гfq8}[Jrm8,LnZO0)	&ؒW1[{k~*
~qKG0ͮob|\U{_$MB7P+qCpq:PF`oL+Q5ˣ2'0h.4+	"R$@mB>(GCDRdP";%FB;!WҶ7]5O琟FˉNeWg߈V^'
K];\:ק86
αY$]06ԝt{iy`*YQO83tjɕ$ppb[[뜯þ`:
 -:7*33
sLx010|Z\dPׁ(ք?k\g&6Ki:zbǫSD
>y܅-I(=~zK㺒/dIvUƂG}(P>W2fN4w#gzA2e/χfR\0e'GQHmȪM|\^(?>
/OO'h)qS{5XnX乊OlJIe8T˫x=t5;MYp@+=Od&gFcza"G8C~Gƶ_'P]N/>^A]+*vumϞ<
 >,yp33udKq|,yu|쵢l{,}cwnߧvȅ=ѷN|`^ZR7-_gOUH"Ok}+UJUa'g鋚_j'+Ao3li͡HTHyPv9^8fV媮F+bwSNw'=LӋ?MLԧWͤþb/ѨlΊe;r?ciϱ*OP2>65}ͧȨl/:5 SW\(7q.,	F7C}9!>;sMΦ`&j߻ҽsHMCdQ ͓tݫoT7q%(Fsp䬨jFk&CFX{JBM7:-SS=0‘ی1%`K-##%"\e}fuctUk&aq1Zo~Ktz"ѸM[
gMH/58i7GL.W`cyMDc8a1?ZGVrI^]J?~EjdE>ISIZ;ݨzAPmS>U{FyܟicbvHYW2I?D4_5mILjǞ(ۯTj6uyŹ>]
|nw=p)0&3F*tYI9s8N(a~שBnxxW{uDp3ov>S8ϿJО!SBB_,Bh:\@D&dV>'ezIȷ~PxU;r#KwY8Ӧ\I*)`2+/j0Ӟ*QJVH
&}`{AcAԊ9	׷^1_	%@/԰p1Z}?~	F[VB(-VC20bkS"fQd܈֎0DrpnOw7!a֞ZzΧ+, P^,iTszrc~bX-4j'_
wuWfwԋ^n/u&[j%T{bz;-L1K

|04%̪[3x{|\)R0xE煟3o>=T5+S2#2q^A36yXá&ΗKE$w1Q/VnZBCRoeȫ]i-_ʠJԳ]$Oꩰ۩.j0g9L/so[3#RĂf,N3+T{AЋ@[[X괿^+_TLn9P\O@K!pvHHn8O8KN+?yB_zP`gcoP33H$LW٤}1<뉴%=oYgUlT|0Q^3VJ֮?%m7볙	i{ء:fBa&m)8>Gbjl:-vh/8O'#Uy*R`\KGT(v,G-wn]z|0:he1!-N^m@t7Ym\*XqO_<%"_/ʝ8VdSc	ӗcٱ/wdh.t/ӷ&?Gv+dK_1׽zt(evϩlӃ?bvԫPmz_DRcq]υPT<9|\xO|!fT>VA@ZIi۔4e$移&Hʣ[CNBj3{]!d8~1PPkiZO[O>dU*vl'
$?soM(Tliw~@|I
ȃkT3*L]غjP_fdӡN|
`,2
m%\5M!P#!Ӿȁ;$-Yj)TVgt2
rJo.kDC)UPg<$z|]}؈N7O3I2odakY{,{Fq@@|_KV4L}Fw$J	θ"'N.癢riMo	V}x50nPz@{T-B9G\K
!#^n:!cb!ޝx-ScD.RtzLwNw"##iׯ89^]do4^1n2c+7	ꏛln	ܺjw*3UßB5>6_4
dpҲNuTti|
	y |̼ן,a&xTxeFʍ%	#.kԖguʛM^Ekr:Yح0UA&À8a

Ux^ىeLǙ\d/Cl##ZfT_O!
s=ubG*sg<o5in/'yI\')Q*ԋ=BnsR9zUTs3@%&rf9qn(yK
I1)4>BiJe˽JC$æ[#Bԛ͎wJь/^8RFx2vw
^ۋ)e{t2/<4K|j&;	
puO/T:MDqߚ&Aa#*Zy*P<%K; 7JkݝVUfm cLRY	޵W K4-´kb`f#i45	G%3-ĐZ/&wy޲+T7{g>p
L-81Wj7gٯ_ˀ79&jz29=i^
=J(l6d˳s-zR OxGL&ۼ.KwIZ)bmmNa.bYC#Orhk`סk,޽W׹>G[StbWaw`f,g>AI*'OiPxKX)R=";g{'G
 t'S
b@5gD3*"&f͎oyD8LXw-0ek8l ˹W-epu*lU<2g*p0JUU'Irtlmc.M^;oi#(3x~z'\%gg~?K@!zOF`$v\HƍI-PErR\O`z&9]|)LftdXKxQsS߆vmȋ?\u\~Y/LKᚴ~hĒ;Nii`7m'	52Mqͥ-ڝPpNK!DL
flY,!
8kf4G~s0 Q{/hM%wͰ7cO-i]-c&8]:#3
GKeE,egn\Q(rN՝cqJ@8`Ezpy?fc3MWG
|r`J=SWgZc$I"\Vpjb^uɉ4ʳ

J?ruA%h`4ˠ:d'RuʀKF-#SnҊ8F*Sw8NQEoF|T><,0kPwr<kN.Y;vT% G-i-J
U^=)lq/~3ϛem^)m8v:ӄ$m'ߞZZ8-0v=JEYbuqC+IP/?ir	0CXݹT͵p-2
ʻ©VC,}XzFՏE0"V6+G<8
<t$`O@]2 WHK%*b 6!ܢX^-'mMcʵ#4Lc]aqRL&t/֋e0<ܥC4o.MɅݹu"jkt%E-O%^aGgZ,T~	o4jńSLZ{̂LTɬ$=pX+sKC
vAȗ&#5n-	.xT+,#8Gpj@Ķ^8Fl)Sp;&T)uf?+?
YLe_Ow9`w(,]s^b f::Kt{w|P[F&T	R	?p?$Q@^k᭶"0*UɳkV^t/
Cjg3uQHRd|w JZGa5`䈓勆hc"tyG+gl>@	kJNg\x;elN{R4͞-R[>K|`ׯ[K
p܀t1NEaX@iZH͍ܚW'W0ΘYqqT yI9%eC@Su_M"T6P=ދ4KWٯL\G[2	˞"%19ǻ.o~?*]-XK^np\
^mN8|AW4to=-sd.*nS"[@O
sU!*/BYo-=%'0졿PU%,P#oe"\| ,ÝZm5ޜή͔jP2n]=PJ͵&;tb~x)}ɗ'NVae
:P۞s.ZUR}tdtCy[xbAYP<UGBm,U_<YcE'D5U<]NĬ73tjMrCBnǴWo h᪓gx}\ox]Us^Ff0J4h6oRCPq{LS|D	'.+pP12!C{k{(H5ڥ_naoc0W#֌s
KiṞ2*{YAѳ9$_%66͋ӫNc8DSb&rI?kJJ

4Uܹ-كZm
+nBourh7"t̟tm4[mpl@aۿ(OK$,6l7ќMή"
T/J*^SF,*J_ !kxDH3m5>8W~SQkn:z(s5gmUM%_bVQ̹P?.	C^77dnHߕ=Yɞ;>ne/(ePe1smsS5]ҠWk9>&TRhvWFK&"W3
ы=yxv-%Yѣ5"L-@^?ˆ˂UQHrBB ltK\f1V60+EFrZG1Пy{v%a}oI&b*P(k\򵪱ʌmEflSлzn,TCUT]#y_JZ$l57CL`t+1<#uZL.s(Yeb׵яTh_pEM?6vWh6Z$RK8@%.ٳB$%,Mq9*(k^[fNE
Ez.مD~\-H78I|Q7D>Ro	l-Χg^~f=oDfqRs-"aIJ@ݥtdT.4s7h*BۘRIc?doq]B'|"GF5mѦ&"JD4L)"nciQܴj2_کmO'g!% ȗ|gBWW2I@^ Qh 	HNplj&9XGtUHn?f赌{*;B$SZ|-XVϊ>M#bͷH(GlYv!/<ڝ,DE*nU`p [$ká#$B1C$=#<۷IoQ=6Q,:#~ův,&IZnF#=[xFHw@bX֦@ #Q .l7lB{$r/gTX!G;3r}Oy}	40)$jQqrqR\Hcsw1v
ΰ_ ?G{*0dM4Fo)ⓡSK&Oڹщ edg-<6Q]<3fx,IA6g2DO\s):^4#p\ɣޞ︈z0Kst[@nt\sN|/ʥaxL\ޕfݼ=hn?U]Q!ҕvՉU3G>̵Mg9q.df|#{P=+7Us8Q>%jZ_[
$
I݆PE+)lFpg/._5mQvh),UTKL|V^{0a]wtDϮL(fz|`?:f~,)
*X'~{qD%Dd|;(""P$[a.\nomA_ւpG_s3nAEOG}L
m?1~5MVfjEReU	6XG^-@{fBW83{Q'?@ q3J*e([Nƈ/m6;eD=^Tsϕ8|`n4i3a6mҰٶf'4H}'308!E
bKH*Ȱ󡴗Lds1?"iH1婷:<|B5_͵ͦ=>|IGXe+j]lUwLK*ǖSD?uՏjMunմ$swcz茀6Sיt*Qav7R&,ެ7vh3\ih꾔QsNE[]QYmvbf[~m
=ِ2z
3!23*enͷ:="_/9lƵlȕ.Nxecɓ]TA;nu	QCj\%3‡I^Muc+stpwA7/p/k->`S.b}%>pln^YRlU>X#U.&M]!{f3Ug(nT\hkH_bNEn"E#&
ܺ8ydT OAxNQc[p5XTP:~V\Y<ח9|d>Í'򯠔f-PFhTQ8&mXwJ0Yr4(]bZn*6C|1 +az
1)f9f+S)ֱySr#^6vof=)7l~1#gÉ&s:le;P>@'N!"}BZ. uIc
"o/_Tr%Ƿյ)uyO<0Wo/C.yLzbTbZqK?3 -M&;}ؖZ'x}e05]z6/)pFxWRwLYB0	(EQf*7a?N’Ʀ*7ҫH;rDatQ^	r/,r26I
#}1cb6Tac|»{,jqQɏui4D @HT%m.]=@S:ͅI/$?X(/_Bwx'>0WII.+=-?oaLRq=x]CE7ú~MhJĿn(J(QvCi{mұD6>W?Ԯe4R%_+r&-k8B;'r{nPrYj;w[_,xdx8$0y

ᰀ"q8fX]$e1FVLԨZ=Xn%YX6<,h]9qIPdi\OǢwgXLg'ֻ	AiXiYyX	hL&^K"sqXqB&Y.	u6?kҼ=*^6qZ(I*GGƒawa&~_d'-A0wߐ'"ng_ə[5`4@UOXn2Q޵Fw?G{e;a.?c^A)ùllݙ3Iݢ;Ef"V往V𯀶&WǽyǎͧFHf\+q,bG@QKLM^v`Ev!
	@
ٝ)(8_#OcBpj8r[t>,\ܧ$\uL"I%\0E-iԧp(aj~V.<6K1xx	k}42ZQ296RT]
sAGp%x!;)R겲:r{аV)t_(QEC/IȲ`n3LE:؈_M ޒW*YpU> !Ϝ{.RajM:"TL/CgL$WBwd,aWm0N(C=0Lv)ëZ4M t.	P~IM1HqP׊2ͩaw{[.yv@UApvNxYJ3ܔ)/0V&("a8x##^j夼T,ΰ8oȰC8o		_P6>_}4ᗯH|pĄ;nZ6WTYӟ
JF&͘31}A	9OHiF=@Q;2wwq9fּ/
[]wC<m5-"vsZt,S.ǒ1$6Rpy 
?#L	¦<%zCOP>*)uClroȁ{[.j']'J@DJS
r)Q\4SxCIQ(rF8p2Yt>Iiڀ1.( ps\tɮ#?h)}:wI,h_u~M4=7]Fc bSζK#g/?G&u8nzfJ)ҌfvIPxl$z'g5te.5ܫěx[9EF:_1w劓ь4u
BИaظUPV5K:'	ΉDɠ󖾽z*FJ*ܾu`_ʔu(~S{MݳX_:7KJ
^QޖݳQKgϱq'RdTAy
PwP^ZcK@7t΋4f
CSm£<\ޓ\Z9I/RX.Եd2LH]O^~YG|UqՉm]G9D-Ž[8,ߛIn]y"n㒤N9Xpf0D|jh*#qѠ3˛ѷ_5B&XtK\^HTLXC?>|jb6K\/i]V0G76(zNbt,:3hxLgRPzn`DM3p7D!8PHb}
tη;B'Dx
9.\+v,k0$j1h/]+bW1
BoeV]nK@CɈ$?V r!@=~.H5xNyk=钔d,ӍL$Iΰ§OjwErAzH֙`FhHػge\jOo9~iD{#2`4l׉ʿbt>n<@#T~	[trZkMCn4f*Wsgc7
6Ocuʬ%_9vzYE޺
J2MXʳ{X"J=O%f>0_5ӎ`pԵnd"IwWdɓJw1kd*d

t@씆c	hmR]_\Hɪt{.;k
bzFo<,gXcR!yBj2#:x$vC0B4Gaݣo*Y0aeXQԭwr|I#
U`k`MPXĺ6(({b3ʾƛaܭ-p|w)o@qwz{N=eD?5KS@q74>H/aB)k՝Y	r0XNRuc*PUYq}
hMlNNa9`Wb	f=v2sU/݋&]-sĞ#u_CaL6'qil8䄅J6>
~&	C=D9Vbc+ISEuTP͸9c\2Oy,.<
,;KDF@I4?Дl}g⇒P!M
beӢr%(e !cL%9=?%&
$[H9wQ84AGs2AbJq^Ԉj4nCBN(C^{:J?+]]98v$0nˊBoNŨ>Zf-'^jCÊX̄ƆM*Ff"Ti{1|Ω؀TFex
XeI@)f"ۮm]KcN%fb4ES>}>n9$XT27mM8L[?H-Z@}5F;*Bz]Ȼ!+IQ6`7Ƈ/vq9 K	ӷ<&NNȵڋ\x&YsE
<
ךJ674\yJ,P^Z*h`<
_ȥZM6ȏgmm؋Q7xrjPPG)P*5;bO>vzpzG=uA|$b)ALn@nY7trBti㹟 T8Ʈ֥ng
' Wg[ozc
qFMw[r8ݤMM*҃q{\M% B4Lt{=1ɕ)̫yױ06=x|vyn5B02yK`F}y»Iql2}s~GK!c5\	bXaA=<Al[ӋoV\"^&S8.5젣W˟Uu:ח4!R7lwZ0K;pjQAOqeI
$R#^n:zC7o5}.ps8ݒ1ތTҎDkgJ/GD6>:{êt=E
G&ak5J+nJf,%:ڥ,}TɋƆtޝl_(Đ	9/dqnO&IaCY5Fp=9Z	J$Jv/a÷msFibdp(4fo߹ D'):EkO4X˞RM,-ݣ;Xn0m|:nQ2[.2솋?wr2IoxE߇{-s>QkCx6,2XD#-&ŹW2(68!yPk(mLC4i)`t݈["مw[Tj`E
j_ي*uޘ:O~؎[c<6w$em0}-^PTـUULIB$H/%\/57&(j^&z[^Yֿ̥=d@y7d#Uy߰J7+*Re[ܘFcJ`o'Ľ*@E"PxV	VNs󎲢TҌ5Vjt20_נϡ8EO%zcsDV`t?Y{2%lÍ֝&LHdTK~SB6[|(PpFɞל~S.6BNY
vܫ)R-jyi>
Fivx˩M޳96Gv\;8VFS[&TYv0҃۴2ME%8sTؙ!:M*xW=*&Fwk5p	T8,RL
	PW<Tu,ɱאRy
>D9J)J%j.(5Q$~m,F>ĉj>00En$Qo8%*UttD傆@ʹ'lKIW#UY|7ۈw߂Jrqs?oRS<>d% _I'.4}+9Xo`ls8+c](@eqʽ?3}uV 6,`;U"bN%	8x7/*y쨢x}npPsLYqYNGZdٽru(T:Mbh@)OwRH~i
h/۝r3`s+j2'nQɀ3I{4ң؄]ָxm:;ib6peAـi{Q(⩹!i4ܷZ0sQ	?#yuG.B5$Բ.a{~ɓ;/ۜ%ޯ}ꙗiu;'} H|kԏށP&%%9E	+*$\oli"}RG00?d@"%ڀ}DhQ1P&ҊVxM}	p-$_Fq%|	LrV[OI*f
%Nd^,lZ6 0"+%{5&q=@8˅x5
?ZvUcjXRg}Jΰ|e㐭l;H^B.~)@Q+əl
P^(Lf	;)怑bYA
wB
PDQ$Y!r%E:gq #(钿w285Rt:Ew{G;Si½57t_Y0G(V6Tɠ#ZVnRӠ|EucuK;Lu@ݑҡ=+@uh0݈&
~p2&׹2`#vfZj/Xo*Nˇ{\)sH(^ƼyF@)tbLk`N8Iy0jՍ܄ܽ3S]feg=7ً	_*9F"]Fƶ^z#ߵ}`,ϰ`:2mn5']ܗ
J|aƸ3)mX*zg4l-gQG+y)0س[mT>
QZ@7YU֐82^lD0MW$m\sQ(}FmH6yrO
gE	acdp!2HՆu
IʌU1z;N0fNu.>Zʁ3HRhd{9ER)j<0Xư.|cE:\@zL\
7݆!bs9PB^7u|U{0ACbό/4O
P鈃Oj'Ƭ>	 	[C(Xu+1
@Q
0@'5<ﲃM[hrE6S
g_y67DHH$"a(>`j;"gǧf]7/R&,Z87Qy&7*rƸ|z@YZlAsKf|8oq߿g׹nQ_sPmڪ
k
~QAa;8|\IƲ=ΫQv(~ZW!/ýI{
96%v*"Ea#E
rj,5DpHeI\=G$[JDtUY]T@c9׶86`_8NAUL|8k㪴&?oK}&2,9$*oI] J(a]-]+άm̫j"I(֠}-D1a_kЫ
gyr>HebQeVJ_W@_9Dp{˯3 bm`:2Z\E9l+ Rҟb,@+:/Dsv5ߕ.p ՓmQa2ΰ*g]1vwakҒAIh3U-Q3h6^"bDG;պ^5&&fE-Ofe|*⡎%t;?<́(ý;o8b>KVQq-tUQ
D&9
m/zQd(^ SK܉7`L*"Sw4P)#gT)l޶ؗ;@~4E)޻$1~U:2F5ڧmI>=[
_+f+&;Y7[fA%s_hXwXkFLh'ˇ][yڜ 
W=;3jAXx k=#-[;#%
_Sjc&4nEݠD;=]Q6P\]h#'&~WQ;p9H
e!m6/X,nf
O0qիAճU\n)KXԇg|hR-]R]=iU]&]-:+զ=sB*q~$]d!KD'K+
jmq>.59eB4<>!=UcojE@h_jlkr:i^n|£N]7(j-ki=V剼GE@ԬmQ,?oeUڔxyo}02!oRM.SCLKz/%0r._wnLE]~-h˗ai8+9lmh\znm6-T&_ƽJPI(q<;U.3\CIh?zClVޖ!\7T~}ᰙY`婶-?4qUz?Sb]7aH~Knޡ!%inf/LA}p؀`bf# 3!QKs*FڠB97¤#wtQ×xe}a>fF2d;|YN/ډ3(f7IOq	+O~zKZy?e뱯nEA#'1^n/jF>Wv.2&="RmZ[ 5fFH&_|?v-؍nMZ6vQd6Sj
6 h
RdR5!T)W'v^ԑ`>j]آt	Ajɣ6	WxQ̌n!/wa׊Xγy:Vl#iT`LK/ z8:q\eC[\N_?P~n~j SQ]vZT,7dKyTzkmljx	S}
{U-*/Ӯ
I;YQb0[Ugz7c	7%íq*0-z;I	}޼pr1N"*AJ%z{
=u%Ӯ-
FzilyҗOqz-7;IBKV#vs¥I@=2B$
s*W9Ld䥟W/*>'XtTkET[;:w-VGk78'[v="JXuր\ڬ)Y,Ċ֤JG$T0:]Er<{c$ݲ>

WqN*pGI
Nqt3!߃Zi#NlBսu䳍ɉthPDÖXPlk
	LL$Xwf9UwE}Ws]-v(e⊠;6>VmU߿౵+%JɈ" tѫ9sA74#RT8A:5W;&EM?H$\+D;ڋ)(^}^3諊ItEtk0c0]~d@(mRu1@@!"GL %]y2R>
""L┖LM	x\|z$mH5#coNBmTzܔEҰ0	o.(WK3`dZ 9>oE8oKMWSCIdPX=Pf*,=f3hݡs[=>"vB ΉWTxZ`
cPfR;:=U1:b`
ͻiUGpȽgw>3笹;0_ :{2BO91ť@G2up׊Y*Aև	`-͘&8~c?>mFq@z.vhecszFbic7EJUqB^7М/qGƛJd)w3m޾^(RG.Z'ݮu_/XL7<㵙*:an	Ggv`@54r%Ps;Qlʑ;.(BX2ԳD@gS俇vowA҂,mGFK*_FM^)<1aɻed|E;\'M95h&^!(]o-fQ6:``7ɇ]"
±N#,!g2jOyDt\:9O?<!^)w%La)s4!>Px6u^iK)yu8T`bF%}CJхZ#_|
T*Q܇3["e+wMIp_}1$ic"pUhp,J0	](
hؒ^?$caji;[L'oNOvETlbM9-ogQfd|lZٯP2D0RCdyχ0mиAf60sKu݃ O!XBl!A撥6*ϋRH\hwIRt
!%Lhf5ٜ/oE!JALa5:H|\>Hաݰjߢ͈TiZ]H'bn冀sS
?vW81qLJodT%^iTw``]XglV:SkXwkAE,r$IPN!l9	$~tBz
&1w-j֭[z?(BsbFxᓛ?ߏy{u*t}8,ytPS%r6;3"eәz60z\/:;M_n!7gOV.;DE9|2/{oTD@K~,>6[CtGګx}5I-31!/^:S Y:ol]j.Oϙo!@m	tЦh&
1yq4u	b:4-,krdXd'x)R.[x,d@y=‹]\[qhT9ThATlGQ&tg?yjSU~s8R!OmS{Q0Qv]|Ȉ^+Kn什m2N_MvXxNn.u6/GˎOܛo	ѪT?dQxFG\L]EӚq,7ر$4{W&װapmVL,ӚͦE_ІVq:F+Y[GU`0,(]-fIqAɦ%l)#A;ܬɒ2/96w8's*nz4ť~<*RXsce"{[L+8˕PdϴЙ([J+@9%
|
L	^q0vfiZȨfcZm4brZC]/f3E<`)p
'5㻰Kz̏UypNB^rߐDA=ЪH4KΜ!ltzm>{'MXX s*|ch|Z,W{#ek98ev-&^xX\ʽ1_jXLu^ݧk֥]+"8z轋_Ψڔ9PjlyR~ ʗ$4P)Z?n0Y@g$JiٻlcD}g
3Q0(P8W}زngaZy+	EPmhUPt5nqJ!]`lFqUV?չ|7Zuknq].a}9êz쾚R xn^fȮT@.@)mqNpw(+mԏxt\HѺD)ݞ ERx
ejf~	Al06jAx-^ҍx[D`ڧ(Ϙ.S d.ؙn5r\OMjYevw:s9yF	;X&v0ة295Ҙ;F
&(i'GL&HVzWnň~KuzӒJ[C̔D1-iTTӰ*rMuM)na|#jРn9<»yU;ZS~ԲKğyZ؃r/)]2LTPbhMk-,{Jmw2dSiwW
=f[񖠬aKf2m
%eIHQ;At,r
d}ʿП=shurk"U SÚ
S~/zP3_*mܤ|QAbJ.y7Vu
e1O*CtKh ݫj~n¹sxX$
Ǭ-t=?g?RTu5Zi5Ɯ:xny\a&)V0G¤R#dxHFz߳O#潝hӬ
]1(Kd|ThjҞ7iQX2h7kOkmNs.y,^爗4@IJRT{€aކ_gQ245FZwq)^O8I)ςtHUU)܀F2̨ԍt_ޜSΪ:t&&4L>=	",>nSKmUqDQRd}mdBjr6*L?--R!-VĘ%ej5T-HZ0:0!ga-q7ז $
5L[$BνɺQ1"4Va|P,GVӴ(4UM.i71DW{E\3Ap2™$F7Ӱ-f4*m#n
2hݱU*:ĒZnE2=3ޏt)v\aX@+%ۗ͆;IyU(C^µA٧?	)Au"ϨȡZ۲(J m—RmNWG7H\ѧ&[7PUUB'Ղ<RD=+ւA50
WFr)߹*K}/MΞ7ϛ֎w`?gzXXj.~~H2;y1m
qб籨ښagu)?IOaOd@4yrKO{
lGc!=1zD7'I9]&cjzkȩX rS;P5l1
IZ/DuvE)|
ɍs _iFםN\5MAα#Lrё/眅azxhU!wa
A1wiƂͬvA{B׌}_YwR'%KLX}Hf}m{?9X˯<=,#زl4
G4S,mzI+{!9iccF5%;Z
\="45"!j
<hI	8|lU6josz5Y#ɳ-"]iĘv)z ^
GfnoV*^Vt4yVvj|w>lMb~AƏ>,K^qBoPid\a;YG
+
&=R|>ЁӅ>(eED+sF!~66sW_Sns,,7Z싇sR%.	6==Azj	?uZE` JȡHBʐ"37M2}&<~Ҥqcmހ  EVGaF#QHueӊ5ż_{Up1^n
Ba/}dKEwWˤٯ;6
y'$ im@Iٵ|dSRP8DT^s4BU?P9	:EQ$]{5F᫅W	um$k9S
i>ъ:;nJhL#yEfYqp`p8!YY7$'?veqY~iEЍR\*ѝKDXZpR*-a6,ne
OH]8_
s:o#o`Pw.3Y2!ROԁI/h|tK^V/*?fMEI^p"
]Of15Jr&SO:咻9̾35atso,wo:s_uΧՀQojT{QJPuMswupx=V8RQ Vޥ9&MR0@ucO((&*l$~i1JxC2lllF6SoK!eT0@Gꉐuz`i?My|-$>P~JcSp&l`(mlMʻan>>uNxvB?*Pq/Hߤ[,l&֐T1cgXxq#ce}uĀgx@GUXR_B11'&՚]]beV]e4ϒn);,B%e2ny0~tF#%WAFT 8`^c(B"WG_}.$!E&tnuGH%>뉍@[I*6D!P	Zh0}GK3]4
}>?reXl/r'P	Ovւ,/U_hb1"ȢY72Tݐ~
~nW"2>[(e23b$&%W6;T{;d
B^@d9raO7W*1t
ÍA	*l&2G涑-2"
Gpty6[VNSݹ(d"H78Sش6浗yPh4KF++}6j ^i'~"cs\s5Bg[FFaLPQLMq 
n'N*ϑ%-PDRGYJ4&W;e=M#[heڂI8(\&9!Hua|iI*B8ܺM_c/hU~+\(@3PkqB@[xt*
K^8mzٚRdӅx\&yb?Rj)3ſQ/W2K.?
uIwo
B`‹ntdC1ЄPl8Itu(:=gCWއ	rȓi1p]|d qU1ǁk,PJqB^s3/=>Gf|CJCNٞm-&u^]ç& I#u;%Ff-D|A3*h]QN4tECm!";sX9
h9,nhhV+R` "e(e,[5c	Sj=eV
NY>+o)UԆL*N/e-}1\nȭva/=9ع_e3ZyJ6ޛt+]:5o6pЙ`yB5^w&~?RT(̈́I#Ǩs5c-'R)Da2PpfctJmXmPM,vi
=&܋e+ebAҖJEU"p+mGI4%%?1+U1NT|kŪ/\/ƒ*	foOP\{f01'cNJ(Q[D8L*ai}$<~|hl'DIZ"4RDp2N+F⺅T31*e)6l"S.5s\.2d#B!
Xֺ~T	aZ(ؒ_JTXpdq:skeP>m&ק24J3z2n;hH)0͔'L `Gȡл;chK#OQƾȴRЌJkFӡ!ψ>τJ-f
E;W<1-<ؾ'OR>Y%.1nۋ9Embhraj&.(T(6	[ZW^SC<$EͯNڊ3hznxˑ춴/r2,?cʬpX6I-VC7	k4t*ҭd=%6	s7آ7P+rVZPa-e܂Ə(d}oK
*0>;峳
~T.[?ַ"N/*È<+fI
1d,ՅEHN<,ަGdhMZV9cЍZK*s=9]{0Na|izkP0# ʁ$+K\SoQ;7>7}ع5aJ5G4_jMP::$e!L鷲mqvgB[
rd/=K${&'HR?":[O\-,')d~	/ 6-!emux\̣^$UYr~YW]=4njcC	U
hwjѦBXL}q uҽ
%3c^M;OE)`[:XMwbN[FU2sb4|?
::Ԯ~nLcTſ$*c>"ɠH|;bd0|}
gLBp)w:fn/URFwDM=		2X/`e[`|8#H7h^a͗c?%A>d$VsYw'K8
_Ti}HFv9QCŒaQhsZSF0p+[_䉚O7h gU0b	.)zyOcHLL@Eqp\McA^odÓnN,-;[-8.?)Qؾo'dEaWY9 Nލ8Rrf;6p
!dNە,'bU$~0G o$x'2NTQsi`]Όz-
r&6Jj?.e;gA}"*mgs>'k3lԸ󟩡?6*]xߖȫ/HxǧrM`ͶRMfhEUc3xG\i*`%4UH9y)2N9Q>@dDv<|#RC
TS*mm*-퐠Z~/Sr6lq#Qy~w΂2g~4=> ҽ,]ș_F-9xin.VFdNL|o-Q*DN|w['Gx.sIg0uth*6T8=7#e׌)%Zth- QŪ<Ty|>ovأc
lGpaPG;9:(Cw"Sht7oW FbR+7&RhC@a:r|jl_cTQ9y!|n	_DG2>Y%Ѽ,򫌪eo.إ  2sw2ӖFbsJۅfOtˋ)£-e
jcQgA@z,,`JUgذuU|7ں{l|+'nj
/!Ã'KKڧ.g5XQw#W-6t|do_,eLGZ=2ʍo3hL2'G8U7N01ao	mkTyrU	؃GoW9iq#
\[vHV@6|H7=H{^a|Πydz#jNV9]p8TD|:1|'ك_A||ϭ%XAZ,umRueϯ
>IMxMWyL	DB}f3,xa=G$ah@ߥb&/tT/\"ԃKW2~i7~=@Jӹ.n!@ k4P?n4QN`3i$Ok Ssw@2:׽k9g(	hF4TndJw W.8!32S_A9'+fPQY!B"ɌEt"5إ?iKVӥLc@ٛJ!
'L\wJfʧ+AՀEqPLl+]:,fIBV@4Gf{z>or
b0mktKsEZbcԧkm%+-}?^ӏo<ƄY70,dApRB?7Rn:{ӴXENQ.#I)&'DIh MތMR<&;
,ۺyn.Q
'r퓻h.Q2ea?T1NUx
]}qE2D_8|tҙlJ[Uw|=t<]m+drKxCSdjy-;mOXy{2Be47]bOɛ	XQnTsq'uF1'Z9xnH)(6_cqĄex6SŹ=Q-	ڨBX9|l#'b4
N暜?ZOF4TSw5rߓe)#~2h{G,)o€6޺n@&
*#>OJA? f~fY'\9OκhrHJ'j؋}\._WSǼv$3#TA=WS7~hhu2%3?W&eѡDgZTKn19ExW#i=D,T^D9`1/
9\]kumxoGZO$Q@Bz4dAO$JK6fJfKg(Lܬywnl5jTQÊIb_찢t>'q37&2H0)!֑ΠʃPw:Ҝk7H\_i9+[94CqtoҲf<>/^ummO^/ݝH	.*:8jO)	W|Z}(jƹfcL=j%fDWZDGU7=-15]i*6OAJX7/iy	:aܣC|`Ot9q[`iCLjT%8=k;p5bd8*Om[OIq(б	k*-AC_'@ܖh2yֵzXdZ!ruv7~TESs; $$ŊMFUM~D6)coa5w>*b9mSmW0"Iku5c$m?z5ˏs)ѱ/;IKiӂ_[
]_tQa7Eʢ:4=r1nL%5M)٦Sh
f:$EYi'(4>6:堗Ax,

_cPo[Z/n:E 	&K`+6{rK6V?‡<ӺpAfJmp$]Dk13dVi=s2CZjF.=zl*T)L5yvyD%m2OKD`̸Ϟ&pڶ47?+Y*ıs,le_/ӽYtW@tA*aa'TS{3֬\OF.J]"zCtةzBzU>8[<q=Btۄ(-؞wVHA}Z
dNUtm{nے8v#w[c";K5|M¤^BSaTnjiFYS٢oL(Umm9Idj!K
uqEG{[jzǬ.,מԏbK}5Ԟr
X5uE;/5<9hk8-Š:7sKAg_":ƴB+/B;ӼjLJ	4%Upo41ImtYegm8er!1ۘ*KcI$<$
@p+Z|
<:s[DdBo΄'X0[OqMe?.fL;Wv"VlMX#c^JemOji|ovSÌY
-&iS\P19rB,ʱ9Bީ GX@maЛJs	xlT#
l@uG1n;*V5gLU4U'N4&\{)^Ge86g7)U#=	-Ӣe˯-tt5wsPjzF3ؔm]
JR2lڭ#z^@">J%fweN<ձY!B3Hn6}Pq@'vM(ݓө4|3Ā-{Iox"}M*5"VqIqzv.Hh]Ɉgk?HYf6:v]T-kIht:?iN)_3,nOzHJ1h;b5#aE/v||x+ԭwE Ro%HB44M/qWHJIE(Ζˈn=!s{jĮȼcml'񕟪C

ލRFjg
vcG;'a]x2n|GsK\^kZgNH׆銈c.u\Fژ}kxggVKg	Uu4*Ni0מ*a+L-|*CC1`Qa]+(r)Bb!6k\XeM|yeˈ.\̔o3;9¸P
8W>Suxiɢo]äsOz<|ײb1¢D^>T9c
P:=/M
PwPXeD
Yw\{~Q``5*NP|c<ˆfn,-<HAꚦ;KRu(X`Rd(vIQrҎ|_1VA{F
`ŧ{17T0'QJ9ٍ`#7n]']ۘsA[Bfr{sw*iurq(+%+hJ/4y!e-}{[l`ւ_ThV(
K6T6{A_|$I
%wg	B|]=&i?LЇ%۞r]Û哲M 
I+'sUE׈!ȴSNk:M4ZC2~[^%*=|Qss?x^",yCz>:|0u6[%tccEɍB/T>KzwO|@LCrjIz3,8
/5B4pU|QC3”Iя(_$`Ka>_Yis9y<$;..=K
ƾ̵d3;J4:0|J;4KY9&wfks$rŻVP;Oܥ׆ԔiXd!VՂ@Pп2!s2w)&0x.aG^v0?J"o/C!޹0(`^bFtKROpꞭgZD#OL'b-8V kDZ)
Ar9M/.Δt*QwQDTvNsPv*j!W2*60^|?7xqubQ:7euh~!~]M.ɒebc
<=yeQ9wD;/Ȫ{@<>y4Wzځ
װXҀ_@ZRwVHNM@+/J&]MGN·XN?o(N_qʆ5Gp4e)_y)Gr/|
?H|BeܴX+T]	{v
g>W|DZU﷡l&[bַ	b
.ιU-m k}fmS`G
d:~OC"T`#itѷUv:_'BpyZ7=/!Jŵ	߅`
`ʭ]UqCɓW*9&'߻aH|&y\
qkMTtҢDrr3ut˞ArlFN2JU7Sm?}T^5$-u6<,ĶQvD'G8*rDZ:%S&80줨HAsr!If3<^_B F0hפZg
c>
:JOٝf5iCÁ5LB6,531b6xn\(QŐYo"_Z˰1	]&ݕykC4|Vr&2`.βzifM˿Y`EQ*9T[D}`iRx~Q5rI飍K% @LYi'(c:%f0m(NrʶnTK,M">9^Yr].Pčk(R_Vf[waSɒ~0,KJ#e#Fn77.*T@#_ƒ8/Hͩ]>JM%M9p-s\[9\oa
P,ZRkIFP-r8M}R
~ˡB}6	JJЌU=$m>Z~NSF?͓^'Fc} qd/'kYA2hܰ8f3hz3UU r
0rDe:*ǡ74#ǵzRB˟L7}|gampchO~
1ƪL/-2w+A"ܣ’
OQ/AϑghX. В÷NL?Vdi/Գo۞煯[S[59C#zf05
ȣ0ҩ>
Rz7o%zQ	Cg5AO4#Z t\}QA;=z2@\:Ho5mz̯ul#́WÉp6%;'b*]DV2V`Rf C7
gWhO!E+7Dß?݇.Av"Ɉj$ހ\}u|ow}ԍ&޽'.Y~\m\E\m'Nk;)a,nKm59ﳎ[Sali7#
Mi#Yܨ^fƩOaR9mqW,[:QshihQ(h
\s82k٭L038RRv>%ae-ڄB8Yt-C'~ ?Ah=*iA0݅G]~.KnfcVHkxPKTA90[5Wu$JʚU݂ӧ9pZD*9wBڛGbԺCؐDfl@sim尐A=FMtt StKĕM1YL-TBs*[nHX֎b\LͻWXWqڒMA"2ՀG+7wN[ω^^Mcg:! ]ՈuzN !5ǂXCU%7o	ͥ&hNN<^̝sg%v7{-՝q*-K%au\ŏYTG?Q>
U*Nur	;[kw^녓;4NaKd֌d$7ǕՇzwgZ.މ]#v5h>nק`K*2тU싘u(}J:}e/G䂾*, .ZtKsz`UT@hw2?kCR'e`8"'[r@Nd?煮e5tc.DЌng~W:S
1r+DpܑcJͿcM`\H@Aa~0ytJT6>hjBԤ\?.j%+|ǩ߇#ykB:*{X-qvRYDG`!+sʦGg
Ll$ҞUuv0/b`ij:Uh򦺙9hɑOq~<7h
s~[A3g8[Ag;XdHFB$p2XaXLVڂ̭fD̔u+>YY
*"FPмqmEԙj5Wyb*%rBMID"خE1-S8MjUd˷rQN~INא2	̣+"BU*qP]*SPl̻1;L͜"ʊțb}^k=pi4n0JN<>Ph;V~#k=e+=
3rW,KҕNGЉd,	NQmfM-QŞ:)[>!fFRkyI0>f0Vm+acvpavs3y~FsFm[SK*y?jJ^kiߟ/.%d@\,'˕ɕ4o.ji9[ZU[fs!á$`ɌN5G4?ӎeS3fTsnO޷<h\jPD%(K>(~L֩\+<
YqwXk~R}Zm.Q(1Nj@j3+jYz$s:[~X@"v):uF%==*1`pWY(a.Lhi48Ec
^s-p;Ұ08c?f$\s\XAuv@	0TùPNԳfOEy	Ypstz2>#"OU!0wyr!)To[/ua;ϩأWbD6"]0F+N
(|ye@f%ctģ;͏Kr[ffZgG-SY4'2#DYEqS瀰͌[O_	Z񮣱u\vg%)){rBƙMC2=@|/3,!;Z*̪9߈2C.k/ Xy]4u[S) rloMkNX\&b)iTlij2cTb[grQ.`-PZ),A	?JD{]I/tB|ɐ8q4՜i'N6=0+&ZMxK*q`nYPD&`%ȼ"Թ%mf;4/uu29
v@/ߔlyKeuYF-?Fq'U[g<6"9Oƻ)WI H	wInk38F
C&\UĊ'')
wP:z8@I]*+/?&NP05o@"G^#Eތ0dg~\,^uSCk:)kU$N348xD-^r>MV$BQ;úAk*fҐx{Hyߜ@9AR*;5BtꟌ*vvq;Ddh(^;6N|_(}|,Eu[O6gO|ДpvEn@MR)zx\$mJPbN#Tn29-Ln_hk$}]^/	R t

,#mR}(67FfL1(`z]?>K-:򵩱vT>OXG[p`gGHŗQ#bt\
LE/V2MD|P3?,`m"ʔyeG6Sj!!Y0JvJ58X1CՒ/C,e9}zXr6֛4cތ@gv=*(sˮ1o$.X.yuρ+;)<<ƨ*{):/Xy]svF4?.u_/v(*Yw7QtwçȊ
~"jG0Yt#[qx_9R2	VS<܄CY!eYwQB)7U}kZV,XS`Mv3NpШDOweݰ-rRa	{v=It	vhe>ہ17BUxW^NP &'V[.B|=LQVnK*tk3YtՖ)ęTɶgV@pmhyNa|:0+m?ݑKX/~]]b+-Ե GIkrX)Srk+ªոlsHEtyhTF)jxڭ 07a]&xE
bVO>6jgɧE8fuKؔӓʆ1d9S3\B{Ud2ak}BHH|{d
u
2bq. +~%\ι_JP̮<’MUD`Yzo%R!̓i-Fԅ'M)5WG<_hINL1bY-1
YK|:H`FAL†XҏJ19p%jд#ª
]#M
hۄ`MYedt>H$Iu=g3W. ZwrQ!3\ṅZïw~(ˢS]kW^&p,S%60ԱAz+T52~SHfI!MN*zQ5$VK;RH/2]D
ݢcgAxGdxXeX?kn+2+[\J*[q8+.Pg[L;3ƘLT\J];lԋrXm:Zs#kˢx?<;1Cd)PoyޮK]WP-0ٰ1lҥ['rT>\Ó-pw])nQm8|iqg!
ި
'?/"J<T\b2=[k

I1'+P_bkq3Cg5QkC`?o̻-vdagz?wUkA(4ѐ5p}9C"Wm2E]e޲Om.ބ<,J1zМgBK
@)XO{}y.OҦ(A5KD;a%DP&usG:fίK6U8kbF\Ҭ>.Sr$ɯ]ݜNhkӱorRHz˯cفЫeNpϐSv>E=(*%\XmG@fWL=FgC7O{=[g'NR"
▤s2CY΂Ztd5?e('b:Mꗬ|ިnòqDGa|ㇴ-m-.Jwwȵқ Z
j)Ai\){mL@p.AzrsSW䢺K0~)Xa#^")x)3ai"2,ۅӤocnAQ?3C^M{L1NbxlfDꆺ_[>4OXu5-3s|uP<ȡvfuzY;JucEͥ:/I	|-JGWJ HȻNF.92\.R/XQNC{G;tu[urFCًxiARAWA~*w0ёJUt;Ig|ͳ@}{*ٵ=
ld$O(I_ǹ5~EE/ia[/]4bVywbȗu(Dr;~3?@Jfih)S1-hs
=mfg[}笈uH_ax&Sc[=m
vabq(}b26')pC
i2+@9-#񴟏ԑ"pp`䏗y *a$:K7YB@J}֬PK3^lZBpkKfuѱr#xD&;p#>>9\4.},3[ң	Wy0kxɊ_\ـ&!6%6<˜̢_ߞ6g$9+r>Y$䭧[Ne}0Iknz[̉L/%#eSa켥F
C'7׌VtH_̈́1|b/CkENq1HT5{D֮jm^~iͣnWo:a?ز]rLD=AVUl˧1
/쿪5|Z/;\sqsc\JAo<[&2uXmû9PKP]K;' YK&KG#Yy]Q%cO!BbwU2lz{(f-n++$W;B
WgN@{ Hy-UeYN-t4Б*SHIa8H_=~8E#YT=|NFDn^-xoJ8c9-xM_W\4hkhIoX6.dx]*>u8wga
Z'ED5!yE/dL2v9z{|M$~$`R5w/c=ޞN?xTmɋw|Qc)ҙ#R 5%ptJ5lƵq8>੘6:'MVKC"l=)=G.V,WEt0ɿR{(50/	Pv.*o@K䶝uϽǓ+9*mv'6U"rH۪CY)T+	[h*_XbPp	L4C
?2cSo
*<0]`0yO{6<@@[3a1 w?ZSmP%赆Sw|Qt@.j?f:aj{~JYJLF0M*sOZWdQTTr7uY36jYDJҋw+}?T+$i
{4L %jέ|KQQP,%+n/e>M
VgP*AO`rRɞ2DG(c6j_2L)D30ϼYmDHd0AV2\d'Vu|9-rk\}γ`j/
H+GKRXפsQHYܘգ
W}72S9DFy$EqmX
I5^+Z^?,LND퀍!0$伪%'ޕ}K
gk2AZAtF-[.b0RNp<:>	'j
n0Vi>]UA'176H=?OUooMN'+qeXn3NXVЌv{u,p `yu&s#SBR*{zoXƥkIfk>7.Zvd*~SvTۣ+=BW}`RaXRSt7?8
Cͅgpd`~G?ö&zI~`Qz	7$TP1.CǺ!nUD{%Ͳ%Kiu
QVi=<2y5T{![@mri|kRH%Mjky^*3e4Ŏ5cCq|Zފ^/V-Zj8rRa@Ǧ
Q׊Bq5ȍM)Z}55`U=r;F:y\O76`U`3SPa 882G5lU,se-agf5+pg֟+zl\X8xC?(Q^XKLLp
  >SGZHOiamSu-,RqSff%Ⱦ&nV>0ɴ9pN]C6H4Ow"tpnJ<Ϻ(|kGs&JUerKEպ?^OTE\ۭ?e;T8)hNFV2W)qzVa~Q+m{;7o۱	7>tXdpWg[i;Ne[g'Q,#؍!TH0q4T=\t8mFj0y$6n@zqQ	6=fD<9Bc}̼B3LbLjZDvidRu\Nꉁk/0B#tețȣrT=@EHD{#'|w>U9^9d.CAijHpSg7Yx";{	,IZ
 \dcGݠqA#:DYOVkTم&X2>>S9׶:E5	IdѶ+y'1?P
z'n`b^D*x|ƕp!x**}1đ<:ik<z<;0™·llxfǮ5OM*nULj*R}fV} MPގ~eAѣ["9v(H5dh)+~cawMWbb_ՓҋwsهRHb`]R^AmP(XFnB뻮ֵN(77G
eS$,P/+cJ&RFfl
		C
dž[i=H!ftUVE-=hǯ4Ѓ&았NظbQmiOy$Y;m+t~:t](
cyXTp:Le"M-❄J븪CVGa0
ZJ0\ឝ%F
3Q@pin_TѴ3ׇ>LH8R3d&KiKzB[bǸ''eJg8xcx^qh㍳񙪌VW(<`R`f҅" {l."a~k:8	ſ[ȠR'c7cG D;$m$`,3sI!hxIe^:#JÐ
ovU7NG+l_H2,(`	DX3, +SNuxօ}FZŘӆ
!&Љ=({뢞Mgr' \/ט\a-%Klv[ưρEIq[UYG[`D(Te'v)Q
\muz&jO"(#Q'<\e
j^H}}{De^rb'6 5T O-4^z\y9L'X
5V-=GxG~8(4+%6,l8NJU`	I7_"rTw@2Iv@z7K^1HUp,KeszGNJ
کʯxߝHŃqb++	Dɴ!?$L
ُ^uQ)

f='tϷCqPf$#kHVe0"Yy|*|,
4Rt<
%SnmDaǺ55I :"G0AHo)3vmwPY3yIMokgw)Ogv'{Y_;#]5͘9N+10LM
!JY+z^T.&agbIm]~`do5
nVR)pyR4I"$NM	{~Pvs1NPyGbFbA+'Mdu5AGRNefHOaNy:┉)
!\A3_18PI/nC󲥹,%Y]p[laʉ5~ɓ~$X!9_;(?'ݿqSV_e}y'=4!o)2`McZ	/j
7KٮnZʲ}L#5w
igi4bPT
%;f5>.EMjTKٺa<|F<#Fq}AAJqT1\YG8 DKu3Swop4tOmW&$D6TTW&nԎBXtMAj6u	A;q\N~ϜԺf>{_
nrYO|&Kⴴ2p<)˂˨~}dl %m5W+4'O	=R!򪨈$s.*-;X!q8+CrW|D鹅hVdiI27烔]W6;$"6+~e*)	,S}~zZÜ\S!džFo۷߱y@6gBQS0WZdy/]ףGs\ş+/nK{ u5
J#Zkbg֩f+"6ަ@!MFOhc,(mh8>
DzA	By(v4GXlMcF@$υr^nɭ$dLsD[z;
ǾTL5u"dͪǢDg{<].,2VH9w:jɻz7n8h:3GcC~"#P;='ߞ&zRV+,QkA>nCXx7Bʻv'4\H?y"u,׬ {4Xo7$l`	*亲f$¬NZ|\iD\<0+DO<5ay4Z*p?2DH4,'
D\{\tƯnjo@ԃ^,/m~]eotЌ,l~[
Vtw{P(nm4ƺ4r*瀔]<P.ʫ#xUN!m(1I0KK3p663hY.C"=h*R|I~꫊(1V@V(&ڜAmy1Hg%j=Z=mǟ6SjQi
\y_etNDGK+,;vWý5_]6+zo43:e)|'E]wVgî,0'Nntw#0u~6˫ww֢5vYog#weH#I*$
W#ilX/-FW
n,SW<9lŵBv;oOؐn."ԷSm$X]Я	^Tb.z&Xvɴ-OiC#S,g
C)6%,u5P:%D
JUExLbYk	v_|V. ZkoFKze$,[h!I}Mi|G(%uȤA	!XX纇-Y1:e`w?' ɧq49c/:S,k %/E1]hsAMY!øB |p +˦i#DCOwI/ȥ=*gz(WU//MLVNJi.@}$qαSֳ|hV;"UUP!Fi`bsJC8.,!Ѫ5?	dHq C%,&x՗jǟc%kRK҃6FU^gbYƢ6Xz/)buM"yW:=VQ9CeF;Ts|\sjeFU^j+d:	hZU\-6/Nڊ[@^wQRX?fFt(
!C>Z(hksֽmMKBF1ʿ'^0c׌]_q{n3|fcMJp%ף
SD筮E“dSDŽWw٪),e{K!pGV|ΩFSBԈLg
?俿>簷R AQ_N`h;MI-=fb2}ooΪuW7$d1;BIK!u]h؉e
Ή]|t&8m\lMBA!Uhǽy[֢*Xoy{͟V.q8TLaz!ᤗdO vo5kS?xJ2Z(RaO_ z]<,O;[:S=w
],wh~Emtw|^Kl8тLо,r1v5t8秼hYc%@ye/>=x=zܞh—y_eS9,W2Q:#W2.!yQ+vuP(4k%Y$^0soԪn-bF"JtAw(lRHgJVH/A4x@uA2׋K_#*}qrYWu1XOa$1c^W#Vv"4
&┫u+! {/Ew&]8@,џ&N[ePm	GH;>lVFHxR\DwC}LOeydViՐtX/}nOx*]gآx0Nj7oʵz:Seqυb0Es̺Mgp$9ÅM«\钹g[PdtxÞcfXqD#cq拤`[ʌVMF{hK?8!)$_33v֭T61XQnOEEc{!&(Π8!-6sN%˓c/Dk3QdtiSkUdsR#hO&'9ޑ%1WQȦ2gy#
.XؽuBʾ7U@hO+)vEǷ؇tw'
ҹkoLTS9{7'&]$w7G$B{Ԩ$vٴg7yo{>Y;:緞N'ډԞ
΁+\MEٲ/Ep`Es&z&=놆pZJ!Jpww@[a@ie!$Ҫ\]DČ$EX39[V|T"@Bkj cD*ܫ
}՟rHhSiiCهsyJ(1s\K4IKMzr0lێ$PIP{9Pׁ(ø}>RD]qw
eM{+|>ľ~	,+>Vτ*z%6mʉ
8Ig^r~20ߐ'3\.MSI4Du{QCC\f8CM%_+E$EgyWRzc9ȚA}嶺A\xx}	N1>ǑN7D$"0i9{MhI^'*[J
12!|u
qÃyРxvd+$?IH4ӌekPҰ8o1ϯ꥿79g;w/&J'Y!SaR^FE}܍rX)lX.[	wR%%V)Guy~
"h}41S[4O[iƂOS9ce1,7<\+cqUsV35ɳigYw_6dhEp,Rgk׏x9qHhlֿ@`؍6p`mO].ؖD5#'HsȎl6%çXtƂ.kqI튇{p@o0!D;٨*УhNH5JB{/^Nk``-5b*NOI[Ei-}QENBJ{CtRR|V&ɽ\c3n7HJmEvIJxxI)}$׈d%Zwx萫=	ΚҞ8Ѓ5+ScoW+flw^Zy6ۻ 5_.L[>9_b! ] .|iD[-h-$ǰIg0T)	q
fݦJ{1)O6BwE3oF"ԧ4ԡbBU,J#a,
.KdjCo"WΔ?$:C
_/ 
ZĕqcUȹa>h 
^uRJ>x	Ԏ_C{sF#
9Q1jnW%GEimzx񕇔qbFT},nn2apj0Zhe~st$ynW#oܕ#@v',P|)֣$3	A}>=~}D`d%†4ৎJ;1GV@ߋt;uhy_*Ԙ^+q./,!IqUfZwN_|okUYMנKpg;xĵ3>N&HT{7-
t}_'Jc}闂'NUFX 
Ƶa!V!]b:פ< e
$K5~^iF$|yj@$kR27WjR$ayLOU
%5UR.X
ިROHf>dL_?{)Um=I%C)wø3@EUh$ILQ-dAfuy`_bn~Q>rĈ]C6qn_ja$=>{4.؇qju%>ál6R٪9fNr8J?+d֤5@tV&R6#$GϘ>
	2/v(L.5o+/5\҃ݾhQ%LlMPoP#;QcXqץGՖ"d
 )Yzk^s(Y_6Ŀ
 tQ0J<#$->$Z$QYҭ@ׄK%zs|^gY1cZhR(<Bn!E*,M0UD Yp\V"qWOJ<"&;ILtvBσesN0pp_E g_Uw32d"AH1:tdT#5"Is--ꏎ4
Hj֤2)xl^(wk㶭hWIB_፽ϙx
EL^z|T}CRE85Cί<..%n*T1=!
wS,庰ǵLGրtΛ\K;/ڰKdϰ?"Gqφə*^-M،z2Sg!:`7ܯ
VMb18p/[,PcJ%.
FkX-sFM
T
CSz2ާ;/XÄ`Vߦ˫1X煽fʑшZ:+f$kizxfFo4,EkGt5tcyx[3{%Mt%6?jR.ۚݜmw\@P8: jֈ
&5/Z
8՟_:^$$ )S`mj#s]dƿe6OEk2N8yY[bEnI zcA	9_:҈/s&P<8eܤ\,U8()$Op++ޔO+_#LR2QN4u[l]-wĠd'o[RRiD_	ϓ2.=5o8У`T"]ۺ& =	5+Hbz#j0(E``yS<{p9Dx;G0T(zmRITRWjic0>|mѽ=@kR&BkQdcwq6FRܮs=7K	Yzrd"
~EꪦD\j	:s/؉%tqC-[Wv5d/.	t4ZS}8n70y<=HtFlsh:fwsN;
HE-[?$YAl6&iRMUl(;jJk.i?S,yZ>eh:sxڣi0,'yr>1vk<=,nNd{iQxcu5D'Y:*-JR/lf61(<|oOufiL&xu0bRs10N^ހ`"~Ce)AL]i	o+zSr	 *5fx٤.񤙗O-Q'JƗ^
&Jh#~ֻR#IFsBfV6X8Yfh0w~:Qt
T5P!~7PeZ
V59x-,$JU|'F[Lκ-ֽ	.b:Q4WN
V"$J=${/FCn*ȤgFNڍhOi%`~qѥ(%OgD]ȑfT~Dgno
7mM!lxTq1	oY`E3L)&5pc]~[g
|mK1B5ikdmgm{u9ZۛĘۛFtT˟	C^/6?ƳU3^2sm#yXmCBݻVws񼻈CbK*ȥ3Ď~+:R}T[ϫ>|sb
o2ui0آ)G"**G~RYBb.l/ BK%h AGC_=LG>4tj-AdhVF+hL3X:G{˾]~,PoIX&-aN,󵢰i=:btcyO\-#(PQoZTq
c0Eq₩۸>&:d=%HŚaMs׆ZdGS9Qvpy鼍<~x.zH|xzoX~Rs Ҩa+߼l7&>wFLkפzüb *Q<120v#0SM[F&J)UD'ݒdCvLpw-h||@`HxƤzQq-BW	
$*	^	yL:j9vժ2z-~;>ȥqrMr<+V :އ_E	!Joh793M$J$
j^X_uW>Meumc7"~/zYM=wZ|#k\o^JO(M*H_W|맵i{8G
4t&a(v|`]Э%9qK]A:ֵ[O,mw揧#J#!KXDd^s55X㩩
Fk[pkκrHNj+@iH1+}t@o $ccsB2ALE98sh-3c3MDhm*srkgsmj|%!\ְ8<'o[*c3\d)BG^IU6W'?d4L.`E8oaJ&!qV.FN$E2cTe[Ba=MDv
r.by0VS*M݈/vդy7lXJۋfI/!Le=ʡf'8tW)ɠHFu ^BLLH9
FWXjCK ڤ(8l+z\DAlN0j::uth%Q|koqH$=Z޾FUX[hܸqSC7P+@l;7|&y]Z0e܅5M`V&,dMCyiuK\lx90T όC;7\C9+h7ϸ,qMFE50m
go0DU}Giԉ
s!(>%H5ց/1MVp9n&IzŜDG/@䲁&Ԏ#]O9.Z0*;k+)	=W'KNO#8wy5V[`ҿẗ́ZaZHk`X UX$.7'?~Ov_ŸgK<.
b:nxP+R񙒣]Mld,nNr [PTR/"Zwj;!G/8;\:*oo9۴G>Ys;2AG񒼼5e^qF 挌D!	Za2t0d~%yz3Մ'w{2փͱ]y2f.uԄ!t
 "^KHTq2MިJ^xmj7:C03  3EԯTq]W򒎸%kuՅ:*+x:$h+>
h,H7qbI|G.\޻Jdv=Z}[]!O[PS1/5A6		?0uM2@kD(N])V^fmk7{WUJ<͇u@QQ_RE@C	\A=kI
Ux}}*cô^M7t
;̙E="NiONO,b`i|7S-^T۵D8ƛ
N^r)vu`R6<3څr0s8uP; By𐵷X%F%sa|/;C5BXΊ#3O37(ubm4!Ik>7_u-/SI(^Rx4q-\tf!T1޴?)L%قbnգi
&udH35uao4Cs`Ӎذkv.Bb/?-)4gǼVH]r̍
ɂ¯eI0V$]or%
<̗eSB]d0yy}:eF4Am[13F_Dֆ48QX+"9;,}qL/We"or'r*OpS1'@ij&78|;%c (H]iXh+J.Yy-+^7׌K6/q¡
8D9VsAN9Z|EvRA}#QshoY~SXsaDx*͸j}|-geؚɘ)i"sɖr@8i306QOŸݡf8o~;Y?wlfNDd4V.H|)~"2a M=S2	.L9oL6v5'[rMPpV#"| l!ߡ:Zh+$w9+lc$öh֮or`'(N.M*!E~Ձaqb,]VbH XP
2,
q^>Ew)IDk=iVTHiWO#ׇ-è}|L̥B4Y9@M~|ط!@CV%?`~&ȱ;be%j/Kbl6#Cm?94rwXrnMݹ4%]
k
9%8YߏbgR2/eMou..}gE!t64ְ@vaИh}X2Lw,#@=an̩WBS)[ŮjD~0Ea,"k;QH,4h/JL-99g2L	SŒrw:Tfc\fG'}asao6Y Yr8$)SA9 SцTgc$rrF6@N'ýW
_אSC2d_?W߳H`mfm
^rs=0qZ7I	U:-|ƚ>uZ@XjVz"Wqj"|KBx J^~Ao\;!1mO IX5t>Eke7]uWs62ehrWx1[,4E'weiF7#o"#rwlvjokbָ5_WPGgX@aT,_!C8t~ɱ9i"ݯ;g)B{y-AdzN>'oK~tc_JL<
~8mVtD/8_N2xsZ
3y@jV
\c-NG.ehPǮ 1J־m7fM1I
P>R88bHؐL-?Q ex;_z]P#,vB,5coF1D}n|9ݎdpY9V7's.MM%)ex2DIne'&:F|ŋ8iۼ:EI#|T<;$f	
kYln**f{Ens\0h-eKз䗼"=W2	=5R{;6`[P>=Zuņ#`Sk"B"~.
^,St*fn4YwQsce )bkHq7*`RRN:W/mbHP[>T4 Zd?C1a!λ{olѥ^^	mAO?dS-N$\%:`Nl?5S}tj^763gYV!?&1%Ŧ-)6~_}	W4P䬊ϳ팷iQfB.| bF$"ccl6
rRl:	ͰUHK#^QsJ7Du>6|Q\joz0TW=ذ,9?d5
.H0N&n0]Y{\^[l?ʶ`y\I"B%;D@I_Z:{!,l;y\1ΟUנH\p5k):u~:ufS%I4RkB<%^		
/ȈK_Rfa"0oL?+XWIۭL
:L@bS2<޼Us&duzX`]
=KJhfRc)i6fUij4s7u	-0F ;2ZM銸kw2;ءHg7[d>fft%;3g%5<И\]ǒ(|get-ؔ|@mD0H-><-]5[IȯͲ_ܪ	C-iT+uCUQTɓ|AZ!F0@AUU:bgc3{+6*|P
}ekȈD8*DQ#U
K6ߠH}FD%>luMF#A
$cV%w8űZIBZIw]T6oٳtJC*PHkG\?7!S`?fIGc=\ÁcBZ6+QcwiXgAR$HyoI#i@v[=Iy	Gxxv׀R3O?;Iv[)9CrW!H$LfQ)|iN
j0B-`[@F	OLPsSl+en=g`7c1(#]~
^슟g1=4jLyN0|IY豢g4NnV,?9z<8mQ|TEऴF'=vO8yrW
T>`9Tʐ
>#1hyb0
i,|J.~=;w~q_B{dŒ_3.0	0ZAfk j^qpx8=s4r(? q8>gp,u>/ӂ~&F42e2u+!˰<*rb7Qt}@B|*f`10}[8kDŽ:>x"1N~x^x)gm4A%~lѐ.QAO't_ySt ^T6yIPSJF1^-,T2-F@7UU"ުIZaVDKltc8CsawC,dQf\'L8v]jph;l嫰UQkfܤު8PBiicI*_`ml	k}ķ`~A0rf#5:i
d{䯎LɴGy5{X_6[ݲc>*2'}pԿtzwQ4L!XS}p{(3*ef'@DΣ.A'_:*i?HL,otm0ղ_U}c3H@*-jA5\W(e67YqZ,
R>[p-y|,W#P'jB#.:,/t!TT
2~*wIidE߫I2{{GZ(8"Hߋb^;UNẁ}]=x*	{,u:syM칂	5B휃G{TDP})\)ґߙH[aTRL*И;Rұ)XWaAuSih@#;ع\S0# n:+<)le&:[uLk &zA#a5WEΦȉVMl{.C(Z-oi5l><	7-BLգُ~X<z5eBXmGT!roWD;A{Ft;#%8sя.Q%LG![WWLJ9:J׀] g_4?CXͺ
lI67_ӳ+e"˯믽3}>wg?qGb[*Kd
dWu.4!wLf;

Y{#&QKAU`H{@nE-lG#(~1:nJ3	l9Zt`߂,{gH"@4e!
V&'&͒_mY| Cqu|ꊝJT5edDJPz>yiQgfTY
?kQYa )*"H=44o9#>7,⨷oWsnjri⽣BpqDN5mp6Vsթ]J/Eh~ɓwRZXu.`{}	oO&M+Ni	45
Pj}7:mݎ/[?̐|ݸ_x͂Ǣ[N.߁y|{`F_H;,bTuFi䠩	禷::E'4IqYےlX&A㪊`x̉eG')FYT#K=y'?ԢC,Wf͐DxPI,0fEL75
ËEw]uL	82b>~H_-Exޅ|cox@%!^_+v=4DdCx!VWC{r'Y*H[R9ޥ؄g^.d%ɘju#(,R*?v9^6;'ĿdjҴR(>ȾyQb陲gQfsZ^`0@*Ґp-2',ڹ3D
Ѿ4de84v-`WẇeS
,=VrDޥ4ͰWbcJ֚a7oN j!?@aD/><,VVN7_Vp|Cb{LY'
Sot{Qt3i;ꌲR6${17UZ_'E.b~kNg%ӎhz#68WK׿YR)JdaJ)Zx-p̀t/C?ޟˢ7$9P)"D(P
C6iҶTNrcTA^X&hËW
hʤp#2s	LC}Ŷs,!ᔡN:ɔ[
&u#Ҫ/1ľ2ױ
L|cؿ*1aiNX>	'kŵ뾛Z$KD:F/9DdYQ-XA]&$&RGe>+n84MaaEC	X`fjw"-T	h[s2e( X
\5y6i%o510],aW$Q	,˖SQ¬".*[udwYщp+aD퇧2r}Y %q[e!30D$PE)x۰yZ|wܺv95=yJ^50spv3l?)6J&^*:qkTZ24E-OD5)Ao0{McUU%O(3{PlŶM &mTϜSl,Xs$$qހ,'u.ZBC.6Del(%
xiX|4~;&7n2F+kNDDm	ßyO3mI7p^xVZ-f4*MҹsdVZj.Lshy%j
_^狼B$b껚v&rckOnN*2|Fq.MgۼSo9&btXZ_|:bfzirz}JSoY`}6^RVkA#Bs3(re\R?q`Jh]?nV(!Ǝz4ec4DfdȽmhaiTq=SoN/o
=n͘_+Ü@הQwrKtއFR]mWO~lnJSA.	bq[_
p
cbL"X(iX@a$҅C/AZfʞ7sdM>wV0DKkB5*ȗZؐ
8ha$ɌtLbO-a9IYiYuJ99!Z MUvd]}}/0@nkN^EnH_{)iI0x_I_-$?a$l^!|>;Twi?v=i	=:Wͯ7hg:P(6jOW`-N"UGwqVhk)M1!ȧO*{ϫPwE
A;Ђէ}XaRMnZ\Qn`%6|l|q]D"ԝVV04Ì[ҿXۄ8kҏמiP
RF9n
*ײ҆~6Ta@}I\5ŏLCػ
j+a('X|G@m
&P?x~sX‘)8Pxtl%Ԛ53%h?bIҴ#>wbtq\2Z]@X"0sIIo7=ʀqˠQWτ."͛3=5l8*XCުtN^4Jx!Ewzec
vT|iK0SÙj
.~(ܬK6vLZk~!$q3fA_-lr]UɧQvv,<FѾ:Ǧ}T[$[o<HnjST:|ʜ(OׯWtt/ 5yQE(BcG{>.iӮH9pv5cu|/yU28@NT>U[r	aI_6+('%y0vIj3˾gt}'O3T{KHLX8ەut{
1xF;ҹ_#sP"=٧)*8蝸B~Uك͡"hjQb_|ۦ1zF*2V-8c%\uk"YI|WŸO!c#,:{AT f	uBV74UQ?ie^V`J39I`,i	.ĻۗhgiNGK${AbCwZӜup1+ɼJuClCjld7qC $w9hbQg3#sGd.rh.`
z,s=ӢXp/X'sm,!_q1ݺFCRμY$
20
]L1C`^e5nz npfXy8RW=̽81NI%ee;٣`WӔS[PQbc<&6^Yx,4!
~8A	ꆂM_h.h84fjqld@;M1mI,!NZpO^-D)^"̖
-8BXe60zxӹ*d\ԛFYf\AB49	-40֠.>pb/z:+jZʆ
4N
чfYJ-}U47TZ$6g
ZOJ}FrN:BE=B!٬ϓ*l(9PTRD1`!)ͽU~L񿡞Kn.@ h׌Vy>}K
)$bdszB+`W)Ŝ\2bcWP>ob~k~qYn:͝;ΞH30	W"wOD\ݪjL_u[Qh&"r1?@I <}y{.A%$LxRBet~iX`Nr5[3~tZ}ˊwmYջ+<\xr3;NH0-ղى;%`(zMkuJKP|~qJ;#9Lǣ*C{e3'iB
*fš@#顈}`.)"Ϲ9-Ѭ,|OhKk^xyg”9~U9Ed^KЃ-`M??8>q6[7ߋJhafO>R(i!ߨ	ڹ;CKbx\ڿt@.{@L=& BdO^@Jxm"NPX3鶦1l|tW0"hQ{!֣u>g[B}ۥ!rNAx?F{5$9&l)){/\44+b|-<'7*Ƴ
8,5%Yb@i*?*i_/Wife3PC{LbWTo{PrveX?fMRw]6'Gċ9¶|I4[h[вɺ2E;(kxZ³Qb:XiwWކC^_ɝY&/S&
͹]̇_$dLdZ4-şH#8&#C'SxX	Uyo{0>48)st|kdqm?f H
Ou2^)Rwl![$&L;Vy+6iqV?c3ӟ5&ɧB294xK9?UK3y4+7UR?ڀvk`]]lU`D
y,ZoC^)@J0br`]!+I*+u!y<\=ԝN*Ft44oDro7$`|O(	V42{<!%t O4nRa LmY(僘MXZבo(/d[9ێ|fxEE53r6&ށmA2w	H)]c!.U7\M.H$.#r157n"as*u&us;+0X/MQ}у136%MUTlA:[5D5{LK8?l]A+((
`TV#Ҕ.EKi"v˟587zgNuqnW(kTӎTC-pbFjRBܓ$GEM-BK%#BMj?-^Qh8<6Uki9)(lRspZ0H,Δ1AUི
!mg_73&O(6'Lz<ߎ1ƶ0
	܀gR+37u('7ˡli`c,IpgmA3\\RgNB8Au+Oi?ToGL< 
B
&_`NP풛Kfɜ0 .AY#UëCzg+&VRJoFuPRp%-dJO9$ExLF`Y:A^!䷬^bvW)Nu%t={y{d@,`50Qs*`dnxBb2ļ3X3۸mQaOpŌUgǼ=5pw<RďED]X順J6T%Wx2HxmOHNax6uz#"#h5(O!,hlb!^dϨZPr{$><>b&&1QGVHU(Zx‹!f4%)]0T1x.yfREg}7cS5p}.aڪqNsd1k|.줣"#i9#.mO1xq@q%Z%샵(y|[	JKgSٺi3859,p|ޔ\em,P'"33[ݏ\r͊No~]?fۂTg]1ď-V2}l6#6&0Ճ+*K=!`{:N%&{^
xS<
yP۞1TǤ%5r"f02FHa"vK#oXh0NGEhUtEXhğỊi>*jCp9B5_tkB/Iv(3?
	`[n+ FFL!iDa،d+ݠL25YMGmL%.İSAi@.bw+J"U`1c1upW5ڸ:lk+uT_Hئ_!aJ[\?-"uۣ ܫ'{ED\`χhtg7[vq3F֚&[q}9Rqh^O]׌w%[žN-Ŧ)S+jXh|԰fBvŁLQ'dD%1ljiIt_v:
2fNį,{|R4w܇C醮;.*ZW32QFu2kkY|iw.Jݟ&9%Ib'@[@ÒGLkSvK>dL`F߷Gazp)2hGWɲM֎ݤ^dH25:"97c!eH@`8髍I7լY،
Pn+uyІ@̚9>-|Sr {5|Bhڀ#nۥc(д{nT9<Ī+[^R&rDJfj&V#~7LNsloq6iF^H_F9V//Q?
p<CuHq{+qA]@	8xsLqR$JAD_=eKOڦ)m>X7@9LkfVѣ

\%l&_Pt*N)phl78Gw=_3+(5C^.*
^#!ax%{{˕}b<{~$@,I(xKXI	/C"ceVCjPmczmC8=^xB!מӨ2bH݊^Ow0Cfx]a#>{|IJ3R/j@UƑⷆn;d4Ar"VPDU"dΡ1HSI]Rx&)Yuh1tb!0hj^EX5ϪbfBʟeysBvQxdkկv%6+J,K`Q؋g+\`ޢj58atXIyFxzഴL)E QTl?|e
56;GBJE楽ٲ2jv
z!9'!bg|\N4p^z2ƌ;k$zA5/u	9R&%ҳꦁ<D'i!{לw<) sC%pTw|7(C}:ֶ:QV;DNhڂ85~ËvIU91l%>끇 ~*oX}Ʒ ~fkoXh㽟O&W3:+1`d~y2
1&
Y._81>
us~U6k_)u௃jUGf4݃<ݷA͏ra5-`Mmƿ$vYEypeҐs9p4Ug1e~
Ӽ2a|,T~gyk1Yz5)4	e
'|._1k]ml*97'QͼJi'-Ӎ·wbzB`l`(^e	󘠯XVWm	x.N߉!2Ov5G.8uAnP}_5,ux!`6ro#3zn.T?G}v*
E#*QK0pbr/FYFx!N,}q͔JӨC+¡IZZ	*J$.dh–,$
TKI	0%iѸBW!FS0fq)j"/mABĥꥹKBgT>7pI.&i<;v,B6}489kgɎoD/x|`Aușꬲi|}yeэ]ʐ(q8s#XT9{rW$~D+	5Fѭ=/xI2%V4ʀt*!f+&C@!Wf?3r
ett}B}ޏ:Hӂ#] "(d%/'"FHW$ζU`x0gmYw|
y{ۈq
Mc8Q<(w)L]0m|GA먚Y&1|zIɦje-oC loQ.gib/Wu(J&Nџ^61w LW16([;d _!AڬZr{%#Eݬ%7"J+hdG$sef2vxRn})sȺ#
>Ȅ4Ğ9psx	J@$Vd1Ͻm~
5)]VlqfnRl'#g$Ԧx4N2q.p4:2KԊec'&iRVc(ZWKŌ."*N=$f-IpTNw9'~Ql_Rߵ-̈́c-viL:~oyYu'tUA^.x蓍8g*x`,\@ ʙR4=_W0XHp֜҆
Y?+lN*Of'"Nɴ {sY&&	lؔ	PtR;>%"rZ,Qg(uRdX$[/P1CqJxf("Y'nyD1zK}İd,sO*yakr{6-G=!jݒ.1	HuuPLSgCFI8qD
hh$c5_[9)bT@kה="ۆ
:Pnl,hkXO܌"Lb(8GvӅ9{!Lp?,yP-$4S,(%|Jx=j̵4,KKC`EZiXl UBYLӤmk _?XєF8C1Д&SkW
GlAn?3wf	۷ u)zrܯجs_'%AxBLLL*RjM#N=ͲuшsSMɆesdok(s"t:|`$aB=\v#d/In+Nrz/B;9)U7& ǔJey[Ћˠ*̰ɻ?3i³_
ETr)@}p.ЖU4akE?V
~y
&J^x@!Qo(w֌ 6/4~R.^fUR~BGvV={֤%2Z]BK׷Eݸ3nh;{DUcYVM
ʓs1~K ls8j5䐣LcŭQA[~8Lسlw簢O#Mś|Lq<,v5<-gB> (iZsĆstUc928=Fc{?@QL3b44MxtsG5Z\ٵxO#G`j!y4r&C!R]M3,_f+y8V}nH'ٵ.L	n,2!,-"/9d>?uSƟd0R%wtհ 3;".{u5z٘Ne$7RF9;	]|бef/)$p蠟1Kq`'xI#TYL
ENQ鹑ɰ5|X6|VWs"ß3n20x͎)2@utifUJ1buh:RA|?¿d"&!
'
σAJ>s[K*
h>S(U׽rpx\'uJMzͤvl_oNW&_{>XvS8XHwӨƃ>iHr	@>7DbqT#mTϿRј]屹EW1dBqA*KhSˬy)1{URԲ?uvcq5?-n><(	b
6w|:iXe홼Xf7u>jw105ԥc]+v5-&& x$Wgxt8C1{55 ޝ!~J0
ɬRHRǿln4";OҼsQ4Rge=;[>7s28 nQw_H-Ո:\KT֐)\1%C
$MzUWmthupmroN%Ad05$!}Ff85/b,uNjR[hФ@Q}69eh=S	#YIb{o8!>@ ^jWZ}2N+G>v>(t%P;P9e<#NAPVz,E?ǧ)/,5Pa}>Ūzɔ@Gʽd\*O
H%{nB~\_ٌcmߏV>
y>Rӗ|~:aP+קɕjuă(l&|N\i|
[et/AӋ捾ڽ_h4'G0h(cy$q/ASxSmϓ@`sjbfwU9>_%YOm8#xM^r>I:yƐ~s*Oq1(Ne_oW|L EZVWMrs$gz9
E=Aܝkw$[jQ*]waEqk
22ڇMv,,k8WN45:G娔˘/|/7DKg*ZEhFĥ1EFΰwbvVqEzS#Lw%yD gf9`f.A/&Fvje侑<~OǷ+ =[-WP9X!D~;7vgڂpU6CuX./9^8oT~t*&U.f7Fj6Ci-h#7mU:qF뫰3'5lt_
%ZGB&e'w"
rK{~_z>XE=dW#fK^^{tbq2<&[^E?7T$Z6G
#霟AM2@%D9ƈ^z\a"ɂjNJ:-Lˁ'0?~" ~d)- XHJ5hϤ{l#K2o
G2Ѩ5pnOME49R!.;ua.d"[&@f)>OUx,e0eBڽ0ݞ᛼Da"J42(HMJ:TA@n]^|pk&9oH}qjV8~y釜[oաH	0Vk{lQְ]cL.)p@Z;2s.fi8cWkܻ"=Ѯi-x_;f
o6,ݛ䅐2Y5ي}uJ%X@@aC:F 7V/7	h7euJH ҟiw&"Y7F8]r`ܒmӼ&WWQ'ңgxmokXe̬Ao#GJ?j}
zM豕YjZcrn#FjbsѫIvy\!"=/C~ŹqZHJaG6FXx۔>N8:.K4J	pInǃetڥxuv,a9 3pŇl_(ㄬR{OSHQW3~O,QϷº"D
p鿱u(VQUrGug6J9	%)ǡ*JJx`A~;ܫhݹ0+Um#J1Nq$d2UHb{GrOWd2_X2dZ4>*S,phww~y*HEΓ&ϻS1sk2,|Ġ>*m.,FDzZKk.A^/R_iP$ݻhB?!,uCF.c%5<Ps7{MӇֽo ՞slpgO5M2h:C7/EpX߿%N-˒-wN#O+ ZMF鐼r)/̆^LY+~-QK9qc@gdg߂ZY2I9XQ
v@֟?QCJ
A?})9gKEOju|ѝPא	Z.@U	k4/KOSBe:wpGuN2.ŗP:/ݤGHT	LkW
'&	%`)zcAgXBF`UcC
"2wgέ`}]j=9VS?,s"`D2X9dQhkJ~\$bu79WSaf}aTIhhOk{CP1F
s1
ݮ+ጆ/0c$oFܻ/ɲ"e{#:uGOw^]/%FZV Ce6rA	h[þׯQX^1) jt$Nm̐*X:iX}@|fς:NO""Җ|u7qq$ۓ(0B+q@:Tf?(Xdr